! EDWIN driver for Definicon board ! ! A change from the standard one is that the y coord comversion is ! done here rather than in the support routine, because that would ! mean converting scrdrive stuff twice (tres complicated for the likes ! of me) ! ! Another one is the poly takes a integer array name, rather than just the ! first element for C calls ! from EDWIN include Device, Icodes from Imp include Ascii external byte spec Imp Int Flag alias "IMP___INT_FLAG" external routine spec User Refresh external string(31) spec Fname record format Point fm (integer x, y) ! note the extra parameter (non standard) external routine spec DD INIT alias "EDWIN_DD_INIT"(integer name x,y, integer device num) external routine spec DD TERM alias "EDWIN_DD_TERM" external routine spec DD UPDATE alias "EDWIN_DD_UPDATE" external routine spec DD CLEAR alias "EDWIN_DD_CLEAR" external routine spec DD COL alias "EDWIN_DD_COL" (integer Col) external routine spec DD CS alias "EDWIN_DD_CHAR" (integer c) external routine spec DD MODE alias "EDWIN_DD_MODE" (integer Mode) external routine spec DD FILL alias "EDWIN_DD_FILL" (integer Mode) external routine spec DD DOT alias "EDWIN_DD_DOT" (integer X, Y) external routine spec DD LINE alias "EDWIN_DD_LINE" (integer OX, OY, NX, NY) external routine spec DD TEXT alias "EDWIN_DD_TEXT" (integer X, Y, byte name T) external routine spec DD RECT alias "EDWIN_DD_RECT" (integer LX, LY, HX, HY) external routine spec DD SAM alias "EDWIN___B_SAM" (integer name C, X, Y) ! ! note the different %array parameter than usual ! external routine spec DD POLY alias "EDWIN_DD_POLY" (integer NP, integer array name xpts,ypts) external routine spec DD CIRCLE alias "EDWIN_DD_CIRCLE"(integer x,y,rad) own integer SX = 0 own integer SY = 0 own integer XL = 0 own integer YB = 0 own integer XR = 32767 own integer YT = 20479 own integer First Time = 0 own byte Smode=0, CCol = 1,CMode = 0 external routine Definicon alias "EDWIN___B" (integer Com, X, Y) own string (127) text = "" own short Counter = 0 own integer WX, WY, Nlines = 0, Char, ordinate record format Data Fm (record (point fm) p, record (Data Fm) name Next) own record (Data fm) name Point List == 0 own record (Data fm) name Next point == 0 switch SW(0:15) switch AS(0:att maximum) routine SWAP (integer name A, B) integer C C = A; A = B; B = C end routine draw lines record (Data fm) name PP integer array xpts,ypts(1:nlines+1) integer i return if Point List == Nil if nlines <= 1 start DD Dot (point list_p_x, point list_p_y) else if nlines = 2 DD Line (point list_p_x, point list_p_y, point list_next_p_x, point list_next_p_y) else pp == point list for I = 1, 1, Nlines cycle xpts(i) = pp_p_x ypts(i) = pp_p_y pp == pp_next repeat nlines = nlines + 1 xpts(nlines) = xpts(1) ypts(nlines) = ypts(1) DD POLY (nlines, Xpts,Ypts) finish nlines = 0 end routine print text text = text.tostring (0) dd text (sx, sy, byte(addr (text)+1)) text = "" end print text if text # "" and com # 6 draw lines if nlines # 0 and (com = 10 or COM < 5) ! select output(0) ! print string("Device driven with ".itos(com,0).itos(x,3).itos(y,3)) ! newline -> SW (Com) SW(0): ! Initialise ! X is 'D' for definicon screen or 'G' for GEM meta-file Point List == New (point list) Point List_next == Nil Dev Data_TYPE = X if X = 'D' start Dev Data_Name = "an ES2 Solo PC system" else Dev Data_Name = "a GEM meta-file" finish DD INIT(Dev Data_DVX,Dev Data_DVY,X) Dev Data_MVX = Dev Data_DVX Dev Data_MVY = Dev Data_DVY XR = Dev Data_DVX YT = Dev Data_DVY counter = 0 if Fname = "DRAFT" start if First Time = 0 start First Time = 1 else User Refresh finish finish return SW(1): ! Terminate DD TERM counter = 0 return SW(2): ! Update DD UPDATE counter = 0 return SW(3): ! New frame DD CLEAR counter = 0 return SW(4): ! Move SX = X; SY = Dev Data_DVY - Y return SW(5): ! Line counter = counter + 1 if counter & 16 # 0 start counter = 0 DD SAM (Char, Ordinate, Ordinate) Imp Int Flag = 1 if char = Etx or char = Del or char = esc finish y = Dev Data_DVY - y if Smode = 2 start DD Dot (x, y) else if Smode = 0 DD Line (sx, sy, x,y) else if Nlines = 0 start point list_p_x = sx; point list_p_y = sy Next point == point list Nlines = 1 finish return if x=sx and y=sy Nlines = Nlines + 1 if Next point_next == Nil start Next point_next == New (Next point) Next point == Next point_next Next point_next == Nil else Next point == next point_next finish next point_p_x = x; next point_p_y = y finish sx = x; SY = y return SW(6): ! Char length(text) = length(text) + 1 charno(text,length(text)) = x print text if length(text) = 126 return SW(7): ! Attribute if 0<=x<=Att maximum start -> as(x) AS(0): ! Colour Y = 1 unless 0 <= y <= 15 CCol = y DD Col (CCol) return AS(1): ! Line style Y = 0 unless 0<=y<=7 return AS(2): ! Character Size y=5 if y<5 DD CS(y) return AS(9): ! Overwrite mode Y = 0 unless 0<=y<=4 CMode = y DD Mode (y) return AS(10): ! Shade mode Smode = Y DD Fill(Smode) return finish AS(*): { Ignore the rest } return SW(8): ! Lower window bounds XL = X; YB = Y return SW(9): ! Upper window bounds XR = X; YT = Y return SW(10): ! ?? return SW(11): ! Was overwrite mode Y = X X = Att Colour mode -> SW (7) SW(12): ! Lower box bounds WX = X; WY = Y return SW(13): ! Upper box bounds counter = counter + 1 if counter & 16 # 0 start counter = 0 DD SAM (Char, Ordinate, Ordinate) Imp Int Flag = 1 if char = Etx or char = Del or char = esc finish swap (wx, x) if wx > x swap (wy, y) if wy > y return if WX > XR or X < XL or WY > YT or Y < YB WX = XL if WX < XL WY = YB if WY < YB X = XR if X > XR Y = YT if Y > YT Y = Dev Data_DVY - Y WY = Dev Data_DVY - WY ! Box now clipped into the screen. if Smode = 0 start Definicon (4, wx, wy) Definicon (5, x, wy) Definicon (5, x, y) Definicon (5, wx, y) Definicon (5, wx, wy) else DD Rect (wx, wy, x, y) finish return SW(14): ! Circle dd circle(sx,sy,x) return SW(*): end from Edwin include Specs external routine Set Device Viewport (integer x, y) Dev Data_MVX = x Dev Data_MVY = y Viewport (0, x, 0, y) end external integer function B Screen Height alias "EDWIN_SCREEN_HEIGHT" result = 24 end ! Rev 1 16/12/86 Ulric Jessop Edwin command SET CHAR SIZE enabled. ! Rev 2 3/ 6/87 Ulric Jessop EDWIN DRAW DOTS command fixed. ! Rev 3 9/ 6/88 JGH EDWIN SCREEN HEIGHT added ! Rev 4 19/01/89 JGH Clean up & draw dots removed, SCN 330 end of file