4IBM r-@ >> FastCopy III << by Martin Backschat, Bergstr.16, 8071 Hepberg, West-Germany, Tel. 08456/5495 -- It's Freeware! -- (Greetings to all 'Masters Of Puppets')Ѹ  O`! #@%`')-//35`79;=?AC@E`GIKOQ OU`W[]_a ce`gkmo/s@u`y{/@` @ `  `  @ o @ ǀ ɠ  / @ ` ׀ ٠  ` @`!Aa   !Aa!!#A%a')+-/1!3A5a79;=?A!CAEaGIO/SAUW[]_a!cAegikoq!sowy{}a!Oo!AaAa!Aaǁ!Aaׁ١!Aa!Aa " B _b  !"!B!b!!!!!"!""#B"%b"'")"+"-"/#1"#3B#5b#7#9#;#=#?$A"$CB$Eb$G$I$K$M$O%Q"%SB%Ub%W%Y%[%]&a"&cB&eb&g&i&k&m&'/'sub'y'{'}'(/(  O`! #@%`')-//35`79;=?AC@E`GIKOQ OU`W[]_a ce`gkmo/s@u`y{/@` @ `  `  @ o @ ǀ ɠ  / @ ` ׀ ٠  ` @`!Aa   !Aa!!#A%a')+-/1!3A5a79;=?A!CAEaGIO/SAUW[]_a!cAegikoq!sowy{}a!Oo!AaAa!Aaǁ!Aaׁ١!Aa!Aa " B _b  !"!B!b!!!!!"!""#B"%b"'")"+"-"/#1"#3B#5b#7#9#;#=#?$A"$CB$Eb$G$I$K$M$O%Q"%SB%Ub%W%Y%[%]&a"&cB&eb&g&i&k&m&'/'sub'y'{'}'(/(PASKUD  GEMDEMO  MYCALC  UNITS  CRABS ACC rxMR EYES ACC /QPASCAL DAT `lBIOS UNI 1mBARREL DOC ||CRT UNI 1t<DEMOGRAPUNI 7yuu DEMOINTEUNI yuxDEMOMENUUNI `HDEMOWINDUNI yuDOS UNI 1"BARREL TOS |MPC TTP 1 IDESKTOP INF 0^EASYGRAFUNI 1GEMAES UNI 1BHGEMDECL UNI 1 GEMINTERUNI GEMVDI UNI 1~_GRAPH UNI 1rPRINTER UNI 1STPASCALUNI 1UTILUNITUNI HoRPN UNI Bt$ MYCALC DFN wMYCALC DOC xKMYCALC I ,MYCALC RSC  CCDEMO ACC `4.  .. GEMDEMO DEF GEMDEMO DFN 2MENUS DFN GEMDEMO H dMENUS H ACCDEMO PAS DEMOGRAPPAS  lDEMOINTEPAS uaDEMOMENUPAS [DEMOWINDPAS q+EVENTS PAS (g FORMS PAS + FSEL PAS . GEMDEMO PAS 1UGEMINTERPAS 4!4GRAF PAS B?GRAPHIC PAS HiHELLOWLDPAS MgMENUS PAS NRASTERS PAS SxTEXTS PAS Y WINDOWS PAS \yGEMDEMO RSC d MENUS RSC hhDEMOINTEUNI yuiDEMOGRAPUNI 7yun GEMINTERUNI qDEMOWINDUNI yuwDEMOMENUUNI yu}HCCDEMO ACC `4DEFINITION MODULE GEMDEMO; CONST mainmenu= 0; slctdemo= 1; aboutbox= 2; aboutok= 4; END GEMDEMO. Purpose : Example } { Gives a listing of the current directory. } { Exercise: Make code to calculate the total size of the directory, and the total number of files in the directory. } CONST DisplayAttr = TRUE; { Show file attributes ? } DisplayTime = TRUE; { --------- time stamp ? } DisplayDate = TRUE; { --------- date stamp ? } VAR DosData : SearchRec; { Information from DOS } DirName : DirStr; { Current directory } Dt : DateTime; { Holds the date and time } PauseParam : Boolean; { Pause after each screen? } Function Spaces( Number : Byte ) : String; Var S : String; Begin FillChar(S[1],Number,' '); S[0] := Chr(Number); Spaces := S; End; { Spaces } { Make a fiMAINMENUDESKMENUQUITMENUWINMENUSLCTDEMOELLIPSESPIESSESABOUTBARLINESARBOXESARWINCLOSETXTCLOSETXTOPENGRAOPENGRASELECGRACLOSEQUITBARABOUTBOXABOUTOKstring with nulls, until it has a length that equals Lng. } Function AddZero ( Number : Integer; Lng : Byte ) : String; Var WorkRes : String; Begin Str(Number,WorkRes); While Length(WorkRes) 0) then Write('' :10) ELSE Write(Size:10); If (DisplayAttr) then Begin Write(' '); If (Attr And ReadOnly > 0) then Write('r') else Write('-'); If (Attr And Hidden > 0) then Write('h') else Write('-'); If (Attr And SysFile > 0) then Write('s') else Write('-'); If (Attr And VolumeID > 0) then Write('v') else Write('-'); If (Attr And Directory > 0) then Write('d') else Write('-'); If (Attr And Archive > 0) then Write('a') else Write('-'); End; { displayattr } UnpackTime(Time,Dt); With Dt DO Begin If (DisplayDateCONST MAINMENU = 0 ; DESKMENU = 3 ; QUITMENU = 5 ; WINMENU = 4 ; SLCTDEMO = 1 ; ELLIPSES = 3 ; PIES = 2 ; ABOUTBAR = 8 ; LINES = 4 ; BOXES = 5 ; WINCLOSE = 18 ; TXTCLOSE = 21 ; TXTOPEN = 20 ; GRAOPEN = 23 ; GRASELEC = 25 ; GRACLOSE = 24 ; QUITBAR = 27 ; ABOUTBOX = 2 ; ABOUTOK = 4 ; (ParamStr(1) = '/p') OR (ParamStr(1) = '/P'); DirName := FExpand(''); { Get current directory. } ShowDir(DirName); END. CONST MAINMENU = 0 ; DESK_T = 3 ; EXAMPL_T = 4 ; FILE_T = 5 ; ABOUT_I = 8 ; ITEM2 = 18 ; ITEM1 = 17 ; ITEM3 = 20 ; ITEM4 = 21 ; QUIT = 23 ; fib(n-2); end; var n : LongInt; begin Writeln('Calculate some Fibonacci numbers'); If RunFromMemory then Writeln('You can stop a calculation by pressing both shift keys'); Writeln; repeat write('Enter number : '); read(n); writeln; writeln('Result = ',fib(n)) until n = 0 end. {A skeleton program for a Desk ACCessory} {You may change it into whatever you like, by rewriting RedrawWindow} Program ACCDemo; {$R-,S-,D-} {$M 4,1,1,20} {4KByte stack, 1KByte heap, unused, unused} Uses GemDecl,GemAes,GemVdi,Dos; Var ACCtitle,Title: String[15]; DeskTop: GRect; MyWindow, VdiHandle, appl_id, deskId, LastTime: Integer; QuitFlag: Boolean; Procedure OpenWork; var i, WSysChar,HSysChar,WSysCharBox,HSysCharBox: Integer; work_in: intin_ARRAY; work_out: workout_ARRAY; begin for i:=0 to 9 do work_in[i]:=1; work_in[10]:=2; VdiHandle:=graf_handle(WSysChar, HSysChar, WSysCharBox, HSysCharBox); v_opnvwk(work_in, VdiHandle, work_out); with DeskTop do begin x:=0; y:=0; w:=work_out[0]; h:=work_out[1]; end; end; Procedure OpenWindow; begin if MyWindow = 0 then begin with DeskTop do MyWindow:=wind_create(NAME+CLOSER+MOVER, 0, 0, w, h); if MyWindow <= 0 then Exit; wind_set(MyWindow, WF_NAME, HiPtr(Title[1]), LoPtr(Title[1]), 0, 0); wind_open(MyWindow, 30, 30, 150, 80); end else wind_set(MyWindow, WF_TOP,0,0,0,0); end; Procedure RedrawWindow(DrawAll: Boolean); var WindowRect,MyArea: GRect; {Using x,y,w,h system} Clip: ARRAY_4; {Using x1,y1,x2,y2 system} S: String[9]; Year, Month, Day, Hour, Minute, Sec, S100, DayOfWeek: integer; begin if MyWindow = 0 then exit; GetDate(Year, Month, Day, DayOfWeek); GetTime(Hour, Minute, Sec, s100); if (Sec <> LastTime) or DrawAll then begin LastTime:=Sec; Str(Sec:3,S); {Make something to write} graf_mouse(M_OFF, NIL); {Hide the cursor while drawing} vsf_color(VdiHandle, White); vswr_mode(VdiHandle, MD_REPLACE); with MyArea do wind_get(MyWindow, WF_WORKXYWH, x, y, w, h); with WindowRect do wind_get(MyWindow, WF_FIRSTXYWH, x, y, w, h); if intersect(DeskTop, MyArea) then {Stay inside the screen. Updates MyArea!} while not EmptyRect(WindowRect) do begin if intersect(MyArea, WindowRect) then begin MakeXYXY(WindowRect, Clip); vs_clip(VdiHandle, 1, Clip); {Unused, but better safe than sorry!} if DrawAll then vr_recfl(VdiHandle, Clip); {Clear whole area} with MyArea do v_gtext(VdiHandle, x+(w div 2)-20, y+(h div 2), s); end; with WindowRect do wind_get(MyWindow, WF_NEXTXYWH, x, y, w, h); end; graf_mouse(M_ON, NIL); end end; Procedure HandleMsg(Var MsgBuf: array_8); begin case MsgBuf[0] of AC_OPEN: if MsgBuf[4] = deskId then OpenWindow; AC_CLOSE: if MsgBuf[3] = deskId then MyWindow:=0; WM_REDRAW: RedrawWindow(True); WM_TOPPED: wind_set(MyWindow, WF_TOP,0,0,0,0 ); WM_CLOSED: begin if MsgBuf[3] = MyWindow then begin wind_close(MyWindow); wind_delete(MyWindow); MyWindow:=0; end; if AppFlag then QuitFlag:=True; { Stop } end; WM_MOVED, WM_SIZED: if MsgBuf[3] = MyWindow then wind_set(MyWindow, WF_CURRXYWH, MsgBuf[4], MsgBuf[5], MsgBuf[6], MsgBuf[7]); end; end; Procedure EventLoop; var event, mx, my, mbutton, kstate, key, clicks: Integer; MsgBuf: array_8; begin event:=evnt_multi(MU_MESAG or MU_TIMER or MU_KEYBD, 1, $0001, $0001, {clicks, mask, state} 0, 0, 0, 0, 0, {M1 data} 0, 0, 0, 0, 0, {M2 data} MsgBuf, 250, 0, {Timer. HiWord first. LoWord almost always 0} mx, my, mbutton, kstate, key, clicks); wind_update(BEG_UPDATE); if (event and MU_MESAG) <> 0 then HandleMsg(MsgBuf); if (event and MU_TIMER) <> 0 then RedrawWindow(False); if AppFlag and ((event and MU_KEYBD) <>0 ) and (key = Ctrl_Q) then QuitFlag:=True; wind_update(END_UPDATE); end; { Main part of program} begin QuitFlag:=false; Title := ' My first ACC '#0; { Window title. (C string)} ACCtitle := ' My own ACC'#0; { Menu title. (C string)} appl_id:=appl_init; if appl_id <> -1 then begin OpenWork; if VdiHandle <> 0 then begin if AppFlag then begin OpenWindow; repeat EventLoop until QuitFlag; end else begin deskId:=menu_register(appl_id, ACCtitle[1]); repeat EventLoop until FALSE; {Stay here forever} end; v_clsvwk(VdiHandle); end; appl_exit; end end. Position,n: Integer; {Position on InputLine} ErrPos: Integer; LastPos: Integer; CmdLine: TStr; NextName: TStr; {Returned by Next when Ch=NextIsName} NextVal,R: Real; {Value returned by Next when Ch=NextIsVal} Ch,LastCh: Char; procedure Next; {Return Ch:=Last} var p,e: integer; procedure NextCh; begin if Position<=Length(InputLine) then inc(Position); if Position>Length(InputLi{--------------------------------------------------------------------- Graphic demo procedures for GEMDEMO Copyright (c) 1990 D-House I ApS All rights reserved Programmed by Martin Eskildsen ---------------------------------------------------------------------} {$D+} unit DemoGraphs; INTERFACE uses GemDecl, GemAES, GemVDI, DemoInterface; { Set up a local array of coordinates, fill styles etc. used for speedy graphics window update } procedure MakeGraphData; { Make sure the entire graphics window is redrawn. This is required when the user selected demo type } procedure ForceGraphicsRedraw; { Do BOXES demo } procedure DoBoxes; { Do LINES demo } procedure DoLines; { Do ELLIPSES demo } procedure DoEllipses; { Do PIES demo } procedure DoPies; {$F+,D-,R-,S-} { <--- note this if you are experimenting } IMPLEMENTATION const DataSize = 80; { size of graphics data array } var wX, wY, wW, wH : Integer; { Size of graphics window work area } GraphData : array [1..DataSize] of record { the array : } x, y, x_rad, y_rad, { radius x and y } beg_ang, end_ang, { start and end angle } fill_style, fill_index : Integer end; procedure MakeGraphData; var i : integer; begin Randomize; for i := 1 to DataSize do with GraphData[i] do begin x := Random(MinX + MaxW - 1); y := Random(MinY + MaxH - 1); x_rad := Random(MaxW DIV 5); y_rad := Random(MaxH DIV 5); beg_ang := Random(3600); { GEM uses 1/10 degrees } end_ang := Random(3600); fill_style := Random(1) + 2; fill_index := Random(12) + 1 end end; { Return current size of the graphics window work area } procedure GetWindowSize; begin wind_get(grafwindow, WF_WORKXYWH, wX, wY, wW, wH) end; { This is advanced! The trick is, however, quite simple : Let the procedure put a message into the event pipe saying that a redraw is requested. In this way, we let the GEMDEMO application write a message to... the GEMDEMO application! } procedure ForceGraphicsRedraw; var mypipe : array [0..7] of integer; begin GetWindowSize; { Redraw all of window } mypipe[0] := WM_REDRAW; { The message } mypipe[3] := grafwindow; { The window } mypipe[4] := wX; { x } mypipe[5] := wY; { y } mypipe[6] := wW; { width } mypipe[7] := wH; { height } appl_write(AES_handle, sizeof(mypipe), mypipe) { write message } end; { Draw a line from (x,y) to (x1,y1) } procedure Line(x,y,x1,y1 : Integer); var p : ptsin_Array; begin p[0] := x; p[1] := y; p[2] := x1; p[3] := y1; v_pline(VDI_handle, 2, p) end; procedure DoBoxes; var i : Integer; { index } a : Array_4; { coordinates of two diagonally opposite corners } begin GetWindowSize; vsf_color(VDI_handle, black); { fill color is black } for i := 1 to DataSize do with GraphData[i] do begin vsf_style(VDI_handle, fill_style); { set fill style } vsf_interior(VDI_handle, fill_index); { set fill type } a[0] := x + wX; a[1] := y + wY; a[2] := x + wX + x_rad - 1; a[3] := y + wY + y_rad - 1; v_bar(VDI_handle, a) { make the box } end end; procedure DoLines; var i : Integer; Xstep, Ystep : Integer; { step sizes in x and y direction } begin GetWindowSize; { get window size } Xstep := wW div 30; { step 1/30 of its width in x dir } Ystep := wH div 30; { and 1/30 of its height in y dir } for i := 0 to 39 do begin { draw 40 times } line(wX, wY + i*Ystep, wX + i*Xstep, wY + wH); line(wX + wW, wY + i*Ystep, wX + wW - i*Xstep, wY + wH); line(wX, wY + wH - i*Ystep, wX + i*Xstep, wY); line(wX + wW, wY + wH - i*Ystep, wX + wW - i*Xstep, wY) end end; procedure DoEllipses; var i : Integer; begin GetWindowSize; vsf_color(VDI_handle, black); { fill color : black } for i := 1 to DataSize do with GraphData[i] do begin vsf_style(VDI_handle, fill_style); { set fill style } vsf_interior(VDI_handle, fill_index); { set fill type } v_ellipse(VDI_handle, x + wX, y + wY, x_rad, y_rad) { draw the ellipse } end end; procedure DoPies; var i : Integer; begin GetWindowSize; vsf_color(VDI_handle, black); { fill is black } for i := 1 to DataSize do with GraphData[i] do begin vsf_style(VDI_handle, fill_style); { set fill style } vsf_interior(VDI_handle, fill_index); { set fill type } v_ellpie(VDI_handle, x + wX, y + wY, x_rad, y_rad, beg_ang, end_ang) end { ^ : draw the pie } end; end. cal Demo Program } { } { Copyright (C) 1990 by D-House I Aps, Denmark } { } { Programmed by Jacob V. Pedersen } { } { } { The program: Expands tabulator signs, and removes any unnessecary } { spaces at the end of each line in the program. The } { original file is renamed to nnnn.BAK before processed. } { Output is an nnnn.PAS file. } {---------------------------------------------------------------------} Program NoTabs; Uses Dos,UtilUnit; Const MaxLnLng = 127; {--------------------------------------------------------------------- GEM Interface Procedures, Variables, etc. for GEMDEMO Copyright (c) 1990 D-House I ApS All rights reserved Programmed by Martin Eskildsen ---------------------------------------------------------------------} {$D+} unit DemoInterface; INTERFACE uses GemDecl, GemAES, GemVDI, Bios; {$I a:\gemdemo\GEMDEMO.H - read resource constants } type Object = record { simple object type - o_spec should be extended } o_next, o_start, o_end : integer; o_type, o_flags, o_status : integer; o_spec : Pointer; o_x, o_y, o_w, o_h : integer end; Tree = array [0..50] of Object; { object tree } TreePtr = ^Tree; { Currently selected graphics demo } DemoType = (BoxesDemo, LinesDemo, EllipsesDemo, PiesDemo); { WINMENU item status setting type } SetState = (s_enable, s_disable, s_leave); { s_enable enables a menu item; s_disable disables a menu item; s_leave leaves a menu item alone (no change) } var menu : TreePtr; { the MEINMENU tree } about : TreePtr; { the ABOUTBOX dialog tree } selection : TreePtr; { the SLCTDEMO dialog tree } VDI_handle : Integer; { VDI handle } AES_handle : Integer; { application id } textwindow : Integer; { text window id } grafwindow : Integer; { graphics window id } demo : DemoType; { currently selected graphdemo } MinX, MinY : Integer; { smallest (x,y) a window can have } MaxW, MaxH : Integer; { largest (w,h) a window can have } quit : boolean; { TRUE = leave program } CharBoxHeight : Integer; { height of a character box (pixels)} CharHeight : Integer; { height of a character (pixels) } { Write the message and halt the program } procedure FatalError(message : String); { Initialize GEM. Returns TRUE if ok } function Init_Gem : boolean; { End GEM usage } procedure End_Gem; { Load and set up resorces } procedure Init_Resource; { Terminate resource usage } procedure End_Resource; { Set new status of an object in a tree : t : object tree index : object tree element newstatus : new object status } procedure SetObjectStatus(t : TreePtr; index, newstatus : Integer); { Set WINMENU's state : closecurrent : set state of WINCLOSE opentextwindow : set state of TXTOPEN closetextwindow : set state of TXTCLOSE opengraphicswindow : set state of GRAOPEN closegraphicswindow : set state of GRACLOSE } procedure SetMenuState(closecurrent, opentextwindow, closetextwindow, opengraphicswindow, closegraphicswindow : SetState); {$F+,D-,S-,R-} IMPLEMENTATION procedure FatalError; var ch : char; begin writeln; ClrEol; writeln; ClrEol; writeln('>>> Fatal error condition arised! <<<'); ClrEol; writeln(message); ClrEol; write('Press a key to abort...'); ch := ReadKey; halt(0) end; function Init_Gem; var workin : IntIn_Array; { workstation input parameters } workout : workout_Array; { workstation output parameters } dummy : Integer; s : string; { string holding a message } begin if Bios.GetRez < 2 then begin { low or medium rez. } s := '[0][ |Note! The icons will look a |bit odd in this resolution.' + ' |High res. looks nicest |][ Ok ]'; dummy := form_alert(1, s[1]) end; AES_handle := appl_init; { get AES handle } if AES_handle >= 0 then begin { if legal then go on : } { get VDI handle and height of a character and its box : } VDI_handle := graf_handle(CharHeight, dummy, CharBoxHeight, dummy); { initialize workstation input parameters : } for dummy := 0 to 9 do workin[dummy] := 1; workin[10] := 2; { use Raster Coordinates } v_opnvwk(workin, VDI_handle, workout); { open virtual workstation } { get size of free desktop area : } wind_get(0, WF_FULLXYWH, MinX, MinY, MaxW, MaxH); graf_growbox(0, 0, 0, 0, MinX, MinY, MaxW, MaxH); { nice! } graf_mouse(ARROW, NIL) end; Init_Gem := AES_handle >= 0 { return TRUE if init ok } end; procedure End_Gem; begin graf_shrinkbox(0, 0, 0, 0, MinX, MinY, MaxW, MaxH); v_clsvwk(VDI_handle); { close virtual workstation } appl_exit { exit application (GEMDEMO) } end; procedure Init_Resource; var ResourceName : string; begin ResourceName := 'GEMDEMO.RSC' + #0; { Note #0 ! } rsrc_load(ResourceName[1]); { Note [1] ! } if GemError = 0 then begin ResourceName := 'GEMDEMO\GEMDEMO.RSC'#00; rsrc_load(ResourceName[1]); if GemError = 0 then begin End_Gem; FatalError('GEMDEMO.RSC is missing!') end end; rsrc_gaddr(R_TREE, MAINMENU, menu); { set menu tree ptr } rsrc_gaddr(R_TREE, ABOUTBOX, about); { set aboutbox tree ptr } rsrc_gaddr(R_TREE, SLCTDEMO, selection); { set selection tree ptr } { set defaut states : } SetMenuState(s_disable, s_enable, s_disable, s_enable, s_disable); SetObjectStatus(about, ABOUTOK, NORMAL); SetObjectStatus(selection, BOXES, SELECTED); SetObjectStatus(selection, LINES, NORMAL); SetObjectStatus(selection, ELLIPSES, NORMAL); SetObjectStatus(selection, PIES, NORMAL); menu_bar(menu, 1) { draw menu } end; procedure End_Resource; begin menu_bar(menu, 0); { remove menu from screen } rsrc_free { release memory } end; procedure SetObjectStatus; begin t^[index].o_status := newstatus { quite simple... } end; procedure SetMenuState(closecurrent, opentextwindow, closetextwindow, opengraphicswindow, closegraphicswindow : SetState); { Change a single menu item's state } procedure Change(newstate : SetState; index : Integer); begin case newstate of s_enable : menu_ienable(menu, index, 1); { enable item } s_disable : menu_ienable(menu, index, 0); { disable item } s_leave : { do nothing } end end; begin { SetMenuState } Change(closecurrent, WINCLOSE); Change(opentextwindow, TXTOPEN); Change(closetextwindow, TXTCLOSE); Change(opengraphicswindow, GRAOPEN); Change(closegraphicswindow, GRACLOSE) end; begin { of unit } demo := BoxesDemo; quit := FALSE; textwindow := -1; grafwindow := -1 { no open windows } end. to Length(Data) Do If Data[x] <> #32 then Begin EmptyLine := False; Exit; End; EmptyLine := True; End; { Takes c{--------------------------------------------------------------------- GEM Menu Interface for GEMDEMO Copyright (c) 1990 D-House I ApS All rights reserved Programmed by Martin Eskildsen ---------------------------------------------------------------------} {$D+} unit DemoMenu; INTERFACE uses GemDecl, GemAES, DemoInterface, DemoWindows; { Handle the menu messages title : drow-down menu's title index index : menu item's index } procedure HandleMenu(title, index : Integer); {$F+,D-,R-,S-} IMPLEMENTATION { Handle the ABOUTBOX } procedure DoAboutBox; var x, y, w, h : Integer; { Dialog box outline size } i : Integer; { Item index ending dialog box (ABOUTOK) } begin form_center(about, x, y, w, h); { centre on screen } form_dial(FMD_START, 0, 0, 0, 0, x, y, w, h); { reserve RAM } form_dial(FMD_GROW, 0, 0, 0, 0, x, y, w, h); { draw growing box } objc_draw(about, 0, $7FFF, x, y, w, h); { draw dialog box } i := form_do(about, -1); { do the dialog } form_dial(FMD_SHRINK, 0, 0, 0, 0, x, y, w, h); { shrinking box } form_dial(FMD_FINISH, 0, 0, 0, 0, x, y, w, h); { release RAM } SetObjectStatus(about, ABOUTOK, NORMAL) { reset button state } end; { Not very optimally programmed! But easy to extend, however } procedure HandleMenu; begin case title of DESKMENU : case index of ABOUTBAR : DoAboutBox end; WINMENU : case index of WINCLOSE : CloseTopWindow; TXTOPEN : OpenTextWindow; TXTCLOSE : CloseTextWindow; GRAOPEN : OpenGraphicsWindow; GRACLOSE : CloseGraphicsWindow; GRASELEC : SelectGraphicsDemo end; QUITMENU : case index of QUITBAR : quit := TRUE end end; menu_tnormal(menu, title, 1) { set menu title back to normal } end; end. then Begin OldPos := LinePos; If Ch = '{' then Stop := '}' Else Stop := '*'; While PrevCh <> '$' Do NextCh; If (UpCase(Ch) = 'I') then Begin NextCh; If (Ch = #32) then Begin Navn := ''; Repeat NextCh; If (Ch <> #32) and (Ch <> Stop) then Navn := Navn + Ch; Until (Ch = Stop); If Ch = '*' then NextCh; Process_File(Navn,False); Exit; End; End; LinePos := OldPos; OutPut(Data[LinePos]); End { IncLoad } Else OutPut(Ch); End; { Process_Directive } Begin { Process_File } If (IncludeLevel <= MaxIncludeLevel) Then { Check include level } Begin If (Pos('.',Fil) = 0) then Fil := Fil + '.PAS'; {--------------------------------------------------------------------- GEM Window Interface for GEMDEMO Copyright (c) 1990 D-House I ApS All rights reserved Programmed by Martin Eskildsen ---------------------------------------------------------------------} {$D+} unit DemoWindows; INTERFACE uses GemDecl, GemAES, GemVDI, DemoInterface, DemoGraphs; { Create and open graphics window } procedure OpenGraphicsWindow; { Close and delete graphics window } procedure CloseGraphicsWindow; { Create and open text window } procedure OpenTextWindow; { Close and delete text window } procedure CloseTextWindow; { Select one of the graphics demos } procedure SelectGraphicsDemo; { Redraw a window. handle : window to redraw x0, y0, w0, h0 : area to redraw } procedure RedrawWindow(handle, x0, y0, w0, h0 : Integer); { Top the given window } procedure TopWindow(handle : Integer); { Full the given window } procedure FullWindow(handle : Integer); { Close and delete the given window } procedure CloseWindow(handle : Integer); { Move the given window. New corner (x,y) coordinates are given } procedure MoveWindow(handle, toX, toY : Integer); { Set the given windows size. New width and height are given } procedure SizeWindow(handle, newW, newH : Integer); { Close the currently active window } procedure CloseTopWindow; {$F+,D-,S-,R-} IMPLEMENTATION var GrafName : String; { Graphics window name } TextName : String; { Text window name } TextLine : String; { The line written in the text window } GrafElements : Integer; { Graphics window border elements } TextElements : Integer; { Text window border elements } TextX : Integer; { Initial positions and sizes of the } TextY : Integer; { two windows. Y, W and H are the same } TextW : Integer; { for both, but are dublated in order } TextH : Integer; { to allow for easy modification and to } GrafX : Integer; { clearify what's going on } GrafY : Integer; GrafW : Integer; GrafH : Integer; { This procedure calculates the correct sizes and positions of the windows from the available desktop space } procedure CalcWindowPositions; begin TextX := 8; TextY := CharBoxHeight + CharBoxHeight DIV 2; TextW := (MaxW - 2*TextX - 20) DIV 2; TextH := MaxH - CharBoxHeight; GrafX := TextX + TextW + 20; GrafY := TextY; GrafW := TextW; GrafH := TextH end; procedure OpenGraphicsWindow; begin { create window : } CalcWindowPositions; grafwindow := wind_create(GrafElements, MinX, MinY, MaxW, MaxH); if grafwindow >= 0 then begin { created ok... } wind_update(BEG_UPDATE); { AES : leave us alone! } { set window name : } wind_set(grafwindow, WF_NAME, HiPtr(GrafName[1]), LoPtr(GrafName[1]), 0, 0); { draw a nice expanding box and open window } graf_growbox(GrafX + GrafW DIV 2 - 5, GrafY + GrafH DIV 2 - 5, 10, 10, GrafX, GrafY, GrafW, GrafH); wind_open(grafwindow, GrafX, GrafY, GrafW, GrafH); { set WINMENU's state } SetMenuState(s_enable, s_leave, s_leave, s_disable, s_enable); wind_update(END_UPDATE) { let the AES rule again } end end; procedure CloseGraphicsWindow; var x, y, w, h : Integer; { window border area } begin if grafwindow >= 0 then begin wind_update(BEG_UPDATE); { leave us alone } { get border size and draw a shrinking box : } wind_get(grafwindow, WF_CURRXYWH, x, y, w, h); graf_shrinkbox(x + w DIV 2 - 5, y + h DIV 2 - 5, 10, 10, x, y, w, h); wind_close(grafwindow); { remove window from screen } wind_delete(grafwindow); { and memory too } grafwindow := -1; { set handle = -1 to prevent mistakes } if textwindow >= 0 then { update WINMENU } SetMenuState(s_leave, s_leave, s_leave, s_enable, s_disable) else SetMenuState(s_disable, s_leave, s_leave, s_enable, s_disable); wind_update(END_UPDATE) { let AES rule } end end; { Consult OpenGraphicsWindow - they're similar } procedure OpenTextWindow; begin CalcWindowPositions; textwindow := wind_create(TextElements, MinX, MinY, MaxW, MaxH); if textwindow >= 0 then begin wind_update(BEG_UPDATE); wind_set(textwindow, WF_NAME, HiPtr(TextName[1]), LoPtr(TextName[1]), 0, 0); graf_growbox(TextX + TextW DIV 2 - 5, TextY + TextH DIV 2 - 5, 10, 10, TextX, TextY, TextW, TextH); wind_open(textwindow, TextX, TextY, TextW, TextH); SetMenuState(s_enable, s_disable, s_enable, s_leave, s_leave); wind_update(END_UPDATE) end; end; { Consult CloseGraphicsWindow - they're similar } procedure CloseTextWindow; var x, y, w, h : Integer; begin if textwindow >= 0 then begin wind_update(BEG_UPDATE); wind_get(textwindow, WF_CURRXYWH, x, y, w, h); graf_shrinkbox(x + w DIV 2 - 5, y + h DIV 2 - 5, 10, 10, x, y, w, h); wind_close(textwindow); wind_delete(textwindow); textwindow := -1; if grafwindow >= 0 then SetMenuState(s_leave, s_enable, s_disable, s_leave, s_leave) else SetMenuState(s_disable, s_enable, s_disable, s_leave, s_leave); wind_update(END_UPDATE) end end; procedure SelectGraphicsDemo; var x, y, w, h : Integer; { dialog border size } selected : Integer; { selected demo icon index } begin form_center(selection, x, y, w, h); { centre of screen } form_dial(FMD_START, 0, 0, 0, 0, x, y, w, h); { reserve RAM } form_dial(FMD_GROW, 0, 0, 0, 0, x, y, w, h); { grow box } objc_draw(selection, 0, $7FFF, x, y, w, h); { draw dialog box } selected := form_do(selection, -1); { do the dialog } form_dial(FMD_SHRINK, 0, 0, 0, 0, x, y, w, h); { shrink box } form_dial(FMD_FINISH, 0, 0, 0, 0, x, y, w, h); { release RAM } case selected of { set currect demo state : } BOXES : demo := BoxesDemo; LINES : demo := LinesDemo; ELLIPSES : demo := EllipsesDemo; PIES : demo := PiesDemo end; ForceGraphicsRedraw { make sure graphics window is redrawn } end; procedure RedrawWindow(handle, x0, y0, w0, h0 : Integer); var R1, R2 : Grect; { used for conversion purposes } x, y, w, h : Integer; { rectangle to redraw } a : Array_4; { used for conversion purposes } { Redraw text window } procedure DoTextRedraw; var x, y, w, h : Integer; { work area size } i : Integer; begin wind_get(textwindow, WF_WORKXYWH, x, y, w, h); i := CharBoxHeight; { y-offset to start writing at } while i <= (y + h - 1 + CharBoxHeight) do begin v_gtext(VDI_handle, x, y + i, TextLine); inc(i, CharBoxHeight) { one line written } end end; { Redraw graphics window } procedure DoGraphicsRedraw; begin case demo of BoxesDemo : DoBoxes; LinesDemo : DoLines; EllipsesDemo : DoEllipses; PiesDemo : DoPies end end; begin { RedrawWindow } R1.x := x0; R1.y := y0; R1.w := w0; R1.h := h0; { set up R1 } wind_update(BEG_UPDATE); { we're updating! } graf_mouse(M_OFF, NIL); { and want no mice around! } { get first rectangle from the window rectangle list : } wind_get(handle, WF_FIRSTXYWH, x, y, w, h); while (w <> 0) and (h <> 0) do begin { there IS a rectangle : } R2.x := x; R2.y := y; R2.w := w; R2.h := h; { set up R2 } if intersect(R1, R2) then begin { is area destroyed? } x := R2.x; y := R2.y; w := R2.w; h := R2.h; a[0] := x; a[1] := y; a[2] := x + w - 1; a[3] := y + h - 1; vs_clip(VDI_handle, 1, a); { set clipping } vsf_color(VDI_handle, White); { clear work area styles :} vsf_interior(VDI_handle, SOLID); { solid, white fill } v_bar(VDI_handle, a); { and clear messy rect. } if handle = textwindow then DoTextRedraw else DoGraphicsRedraw end; { one rectangle done, the rest to go! } wind_get(handle, WF_NEXTXYWH, x, y, w, h) end; graf_mouse(M_ON, NIL); { allright, let's see the mouse again } wind_update(END_UPDATE) { now we're through updating anyway...} end; procedure TopWindow(handle : Integer); begin wind_set(handle, WF_TOP, 0, 0, 0, 0) { set handle to top window } end; { The philosophy is : If window is fulled already, then set it to its old size and position, else full it } procedure FullWindow(handle : Integer); var x, y, w, h : Integer; { current size } x0, y0, w0, h0 : Integer; { max (fulled) size } x1, y1, w1, h1 : Integer; { old size } begin wind_get(handle, WF_CURRXYWH, x, y, w, h); wind_get(handle, WF_FULLXYWH, x0, y0, w0, h0); wind_get(handle, WF_PREVXYWH, x1, y1, w1, h1); if (x <> x0) or (y <> y0) or (w <> w0) or (h <> h0) then wind_set(handle, WF_CURRXYWH, x0, y0, w0, h0) { full it } else wind_set(handle, WF_CURRXYWH, x1, y1, w1, h1); { set to previous } if handle = grafwindow then ForceGraphicsRedraw end; procedure CloseWindow(handle : Integer); begin if handle = textwindow then CloseTextWindow else CloseGraphicsWindow end; procedure CloseTopWindow; var tophandle, dummy : Integer; begin wind_get(0, WF_TOP, tophandle, dummy, dummy, dummy); { get top window } CloseWindow(tophandle) { close it } end; { This could easily be made smarter as GEM puts all four window size parameters in the pipe, but for the sake of example... } procedure MoveWindow(handle, toX, toY : Integer); var x, y, w, h, dummy : Integer; { border area size } begin wind_get(handle, WF_CURRXYWH, x, y, w, h); { get x, y, w and h } graf_movebox(w, h, x, y, toX, toY); wind_set(handle, WF_CURRXYWH, toX, toY, w, h); { set new (x,y) } if handle = grafwindow then ForceGraphicsRedraw end; { As above, this also could be made smarter! } procedure SizeWindow(handle, newW, newH : Integer); var x, y, w, h : Integer; begin wind_get(handle, WF_CURRXYWH, x, y, w, h); { get x and y } wind_set(handle, WF_CURRXYWH, x, y, newW, newH); { set new w, h } if handle = grafwindow then ForceGraphicsRedraw end; begin { of unit DemoWindows } GrafName := ' HighSpeed graphics window '#00#00; { Note! } TextName := ' HighSpeed text window '#00#00; TextLine := 'The Quick Brown Fox Jumps Over The Very Lazy Dog - a GEM text window'#00; TextElements := NAME + CLOSER + FULLER + MOVER + SIZER; GrafElements := NAME + CLOSER + FULLER + MOVER + SIZER end. {------------------------------------------------------------------------- HighSpeed Pascal GEM-interface demo program EVENT LIBRARY DEMO Copyright (c) 1990 by D-House I All rights reserved Programmed by Martin Eskildsen -------------------------------------------------------------------------} {$R-,S-,D+} program Events; uses GemAES, GemVDI, GemDecl, GemInterface; const Clicks = 1; { number of mouse clicks to wait for } Mask = 3; { left and right mouse buttons } State = Mask; var key : Integer; { evnt_keybd key scan code } s, s1 : String; { multi-purpose } x, y : Integer; { mouse x,y coordinate } buttons : Integer; { mouse button state } keys : Integer; { keyboard state (ALT, CTRL etc)} times : Integer; { number of mouse clicks done } speed : Integer; { double click speed } begin if Init_Gem then begin Message('Welcome to the event library demonstration!'); Inform('We''re waiting for a keyboard event...'); key := evnt_keybd; { get scan code } Str(key, s); Message('The key''s scan code is : ' + s); Inform('Now we''re waiting for both mouse buttons...'); graf_mouse(M_ON, NIL); times := evnt_button(Clicks, Mask, State, x, y, buttons, keys); graf_mouse(M_OFF, NIL); str(x, s); str(y, s1); s := 'Mouse (x,y) = (' + s + ',' + s1 + ')'; Message(s); Message('Please use the mouse to click "Ok" now!'); Inform('Try to enter the Output window'); OpenOutputWindow; graf_mouse(M_ON, NIL); with OutputWindow do evnt_mouse(0, wX, wY, wW, wH, x, y, buttons, keys); graf_mouse(M_OFF, NIL); CloseOutputWindow; str(x, s); str(y, s1); s := 'You entered the work area at (x,y) = (' + s + ',' + s1 + ')'; Message(s); Inform('Hang on 1.234 seconds!'); evnt_timer(LoWord(1234), HiWord(1234)); Message('We''re back!'); Message('Now we''ll determine the mouse double click speed'); speed := evnt_dclick(0, 0); case speed of 0 : s := 'slow'; 1 : s := 'below medium'; 2 : s := 'medium'; 3 : s := 'above medium'; 4 : s := 'fast' else s := 'Should never come here!' end; Message('The double click speed is "' + s + '"'); Message('That''s all folks!'); Exit_Gem end end. ake_Lines; DeInitGraphics; END. {------------------------------------------------------------------------- HighSpeed Pascal GEM-interface demo program FORM LIBRARY DEMO Copyright (c) 1990 by D-House I All rights reserved Programmed by Martin Eskildsen -------------------------------------------------------------------------} {$R-,S-,D+} program Forms; uses GemAES, GemVDI, GemDecl, GemInterface; var x, y, w, h : Integer; { message box' centered position } smallX, smallY, smallW, smallH : Integer; { reduced x, y, w, h values } button : Integer; { return value from form_alert } msg : String; { form_alert message string } begin if Init_Gem then begin Message('Welcome to the Form library demonstration!'); Message('First, we''ll look at an alert box'); msg := '[2][ | Nice, isn''t it? ][ Yeah | Oh no! ]'#0; button := form_alert(1, msg[1]); { the "Yeah" button is default } Message('then at an error box'); button := form_error(1); { error code is 1 } Message('Why don''t we center this box on the screen?'); form_center(GemInterface.MessageBox, x, y, w, h); Inform(''); { redraw frame rectangle } Message('How about that!'); Message('Now, we''ll redo this dialog with the help'); Message('of form_dial and form_do'); Message('This message will be redone!'); { the OK button from the message box must be deselected before } { we activate the dialog box again; otherwise it will be drawn } { in a selected state. You can try to comment the following } { line out to see the difference : } GemInterface.MessageBox^[OKBUTTON].ob_state := NORMAL; smallX := x + w div 2; { set up small representation of } smallY := y + h div 2; { the message box } smallW := w div 2; smallH := h div 2; { first, we reserve memory space for the image of the border } { of the box : } form_dial(FMD_START, 0, 0, 0, 0, x, y, w, h); { then we draw a growing rectangle (the one from the desktop) } form_dial(FMD_GROW, smallX, smallY, smallW, smallH, x, y, w, h); { after that, we draw the dialog box on the screen } objc_draw(GemInterface.MessageBox, FRAMEBOX, $7FFF, 0, 0, 0, 0); { so now we're ready to do the dialog } graf_mouse(M_ON, NIL); button := form_do(GemInterface.MessageBox, -1); graf_mouse(M_OFF, NIL); { after that's completed, we draw the shrinking box } form_dial(FMD_SHRINK, smallX, smallY, smallW, smallH, x, y, w, h); { and restore the border area image from memory } form_dial(FMD_FINISH, 0, 0, 0, 0, x, y, w, h); Inform(''); { redraw frame rectangle } Message('That''s all folks!'); Exit_Gem end end. { EGALIGHTGREEN { EGALIGHTCYAN {------------------------------------------------------------------------- HighSpeed Pascal GEM-interface demo program FILE SELECTOR LIBRARY DEMO Copyright (c) 1990 by D-House I All rights reserved Programmed by Martin Eskildsen -------------------------------------------------------------------------} {$R-,S-,D+} program FSEL; uses GemAES, GemVDI, GemDecl, GemInterface; var path : string; { the path and file mask } name : string; { the name } title : string; { title for fsel_exinput } result : string; { resulting file name } ExitValue : integer; { fsel_ exit value (OK/CANCEL) } procedure Decompose; begin path[0] := #255; path[0] := chr(pos(#0, path)); name[0] := #255; name[0] := chr(pos(#0, name)); { turn the "C" strings into Pascal strings ^^^ } { the strings above, however, still holds the #0 in the end } { so before you use them, you have to strip the last char, } { i.e. #0, off. This isn't done here, as we intend to use } { both path and name "as is" later on. } result := path; while result[length(result)] <> '\' { remove file } do result[0] := chr(length(result)-1); { spec. } result := result + copy(name, 1, pos(#0, name) - 1); if ExitValue = 0 then result := result + ' "cancel"'; Inform(''); { clear message box } Message(result) end; begin { main } if Init_Gem then begin Message('Welcome to the File Selector library demo!'); Inform('First, the simple one: Set your own path and name'); path := '\*.*'#0; { default path } name := #0; { no name } graf_mouse(M_ON, NIL); fsel_input(path[1], name[1], ExitValue); { do fsel } graf_mouse(M_OFF, NIL); Decompose; { write result of fsel } Inform('Now reusing your definitions of path and name...'); graf_mouse(M_ON, NIL); fsel_input(path[1], name[1], ExitValue); graf_mouse(M_OFF, NIL); Decompose; if GemDecl.global[0] >= $140 then begin { TOS 1.4 or higher } Inform('We can set our own header, like this :'); title := 'HighSpeed Pascal!'#0; graf_mouse(M_ON, NIL); fsel_exinput(path[1], name[1], ExitValue, title[1]); graf_mouse(M_OFF, NIL); Decompose end else begin Inform(''); { clear message box } Message('Can''t show fsel_exinput with this TOS version!') end; Inform(''); Message('That''s all folks!'); Exit_Gem end end. ALT_T% ALT_U% ALT_V% ALT_W% ALT_X% ALT_Y% ALT_Z% ALT_1% ALT_2% ALT_3% ALT_4% ALT_5% ALT_6% ALT_7% ALT_8% ALT_9% ALT_0% F1% F2% F3% F4% F5% F6% F7% F8% F9% F10% SHIFT_F1% SHIFT_F2% SHIFT_F3% SHIFT_{---------------------------------------------------------------------- HighSpeed Pascal GEM Demo Program version 1.24a Copyright (c) 1990 D-House I Aps Transformervej 29 DK-2730 Herlev Denmark Phone (+45) 44 53 99 84 Fax (+45) 44 53 95 44 Programmed by Martin Eskildsen ----------------------------------------------------------------------} {$D+} program GEM_Demo; uses GemDecl, GemAES, GemVDI, DemoInterface, DemoMenu, DemoWindows, DemoGraphs; { Wait for events to be present and take appropriate action } { pipe[3] holds the handle in case of window events } procedure Dispatch; var pipe : array [0..15] of integer; { message pipe } begin repeat evnt_mesag(pipe); { wait for an event... } case pipe[0] of { take action } MN_SELECTED : HandleMenu (pipe[3], pipe[4]); WM_REDRAW : RedrawWindow (pipe[3], pipe[4], pipe[5], pipe[6], pipe[7]); WM_TOPPED : TopWindow (pipe[3]); WM_CLOSED : CloseWindow (pipe[3]); WM_FULLED : FullWindow (pipe[3]); WM_SIZED : SizeWindow (pipe[3], pipe[6], pipe[7]); WM_MOVED : MoveWindow (pipe[3], pipe[4], pipe[5]) end until quit; CloseTopWindow; { make sure, the windows are closed } CloseTopWindow end; begin { main program } if Init_Gem then begin { initialize } graf_mouse(ARROW, NIL); { arrow mouse form } Init_Resource; { load and set up resources } MakeGraphData; { set up data for graphics demo } Dispatch; { handle the events until quit } End_Resource; { remove resources } End_Gem { end GEM usage } end else FatalError('Could not initialize GEM properly!') end. IV_OPNVWKIV_CLSVWKJ)V_CLRWKJLV_UPDWKJ{VST_LOAD_FONTSJVST_UNLOAD_FONTSJVS_CLIPKV_PLINEKj V_PMARKERKV_GTEXTK V_FILLAREAL/ V_CELLARRAYLl V_CONTOURFILLLVR_RECFLLV_BARM8V_ARCM_ V_PIESLICEMV_CIRCLEMV_ELLARCNV_ELLPIEN@ V_ELLIPSENV_RBOXNV_RFBOXN V_JUSTIFIEDO VSWR_MODEOXVS_COLORO}VSL_TYPEO VSL_UDSTYO VSL_WIDTHP, VSL_COLORPTVSL_ENDSPwVSM_TYPEP VSM_HEIGHTP VSM_COLORP VST_HEIGHTQ VST_POINTQu VST_ROTATIONQVST_FONTQ VST_COLORR VST_EFFECTSR9 VST_ALIGNMENTR~ VSF_INTERIORR VSF_STYLES VSF_COLORS^ VSF_PERIMETERS VSF_UDPATS VRO_CPYFMS VRT_CPYFMTYVR_TRNFMT V_GET_PIXELT VSIN_MODET VRQ_LOCATORU VSM_LOCATORUP VRQ_VALUATORU VSM_VALUATORU VRQ_CHOICEU VSM_CHOICEU VRQ_STRINGV VSM_STRINGVDVSC_FORMVvVEX_TIMVVV_SHOW_CVV_HIDE_CW)VQ_MOUSEW;VEX_BUTVW]VEX_MOTVWVEX_CURVWVQ_KEY_SX VQ_EXTENDXTVQ_COLORXVQL_ATTRIBUTESXVQM_ATTRIBUTESXVQF_ATTRIBUTESXVQT_ATTRIBUTESY VQT_EXTENTY VQT_{------------------------------------------------------------------------- HighSpeed Pascal GEM-interface demo program INTERFACE UNIT Copyright (c) 1990 by D-House I All rights reserved Programmed by Martin Eskildsen -------------------------------------------------------------------------} {$R-,S-,D+} unit GemInterface; INTERFACE uses GemDecl, GemVDI, GemAES, Bios; const { object tree indices for message box } FRAMEBOX = 0; { white, framing rectangle } MSGBOX = 1; { white box containing message } MSGSTR = 2; { the message string (C format) } OKBUTTON = 3; { the "Ok" button } type C_String = packed array [0..255] of char; String_Ptr = ^C_string; Ob_Type = G_BOX..G_TITLE; Spec_Info = RECORD CASE Ob_Type OF G_Box, G_IBox, G_BoxChar : (thick : integer; color : integer); G_Text, G_BoxText, { these fields should } G_FText, { of course be extended } G_FBoxText, { but as the only fields } G_Image, { needed are those above } G_UserDef, { and G_string, this } G_Button, { structure is perfectly } G_Icon, { suitable } G_String, G_Title : (str : String_Ptr) END; Object = RECORD ob_next : Integer; { next object in tree } ob_head : Integer; { parent object } ob_tail : Integer; { next parent on level } ob_type : integer; { object type } ob_flags : integer; { flags } ob_state : integer; { state } ob_spec : Spec_Info; { color/pointer etc. } ob_x : integer; { obj. rectangle size } ob_y : integer; { and position relative } ob_w : integer; { to parent object } ob_h : integer END; Tree = ARRAY [ 0..199 ] OF Object; { the object tree } Tree_Ptr = ^Tree; { pointer to the tree } var workIn : IntIn_Array; { v_opnvwk input parameters } workOut : WorkOut_Array; { v_opnvwk output parameters } AES_handle : Integer; { application id } VDI_handle : Integer; { graphics/VDI handle } CharDefs : record { default character definitions } h_char, w_char, h_box, w_box : integer end; MinX : integer; { desktop area } MinY : integer; MaxX : integer; MaxY : integer; MaxColors : integer; OutputWindow : record handle : integer; { wind_create return } bX, bY, bW, bH : integer; { border area } wX, wY, wW, wH : integer; { work area } midX, midY : integer { work area middle } end; MessageBox : Tree_Ptr; { the message box } function Init_Gem : boolean; { set up GEM (appl, workstation etc.) } procedure Exit_Gem; { complete GEM usage } procedure Message(s : string); { write message, wait for Ok } procedure Inform(s : string); { write message, don't wait for Ok } procedure ErrorCloseDown(s : string); { fatal error, abort program } function MaxW : integer; { max. width of desktop area } function MaxH : integer; { max. height of desktop area } function Binary(s : string) : integer; { convert s into a binary value } procedure OpenOutputWindow; { open predefined output window } procedure CloseOutputWindow; { close output window } procedure ClearOutputWindow; { clear output window } IMPLEMENTATION var WindowName : string; { name of output window (must be global)} { The below proc sets up the message box shown on top of the screen by creating an object tree with the following objects : FRAMEBOX - the white box containing the message and the Ok button MSGBOX - a white box containing the message to output MSGSTR - the message string to output (C format) OKBUTTON - the Ok button The above fields construct a level-tree as shown below : FRAMEBOX | | v MSGBOX ----------> OKBUTTON | | v MSGSTR We havn't shown all pointers involved, but only the ones relevant for clarifying the tree structure. } procedure SetUpMessageBox; begin getmem(MessageBox, 4 * SizeOf(Object)); { get memory for 4 objects } with MessageBox^[FRAMEBOX] do begin { box } ob_w := 50 * CharDefs.w_char; { 50 * 4.5 chars wide box } ob_h := 4 * CharDefs.h_char + CharDefs.h_char DIV 2; ob_x := (MaxX - MinX - ob_w) div 2; { center on X axis } ob_y := MinY + CharDefs.h_char div 2; { a bit down on the Y axis } ob_next := -1; { these three fields must be set to -1, as the } ob_head := -1; { objc_add procedure used later will get con- } ob_tail := -1; { fused otherwise! } ob_type := G_BOX; { this object is a box } ob_flags := NONE; { no flags are set } ob_state := OUTLINED; { it's outlined } ob_spec.color := WHITE; { white background } MinY := ob_y + ob_h + 4 { protect message box } end; with MessageBox^[MSGBOX] do begin { white box containing message string } ob_x := 0; { rel. position to parent (FRAMEBOX) = upper } ob_y := 0; { left corner } ob_w := 50 * CharDefs.w_char; { 50 * 2 chars wide } ob_h := 2 * CharDefs.h_char; ob_next := -1; ob_head := -1; ob_tail := -1; ob_type := G_BOX; ob_flags := NONE; ob_state := NORMAL; ob_spec.color := WHITE end; objc_add(MessageBox, FRAMEBOX, MSGBOX); { the objc_add makes the MSGBOX a child of the FRAMEBOX } with MessageBox^[MSGSTR] do begin { message string } ob_x := CharDefs.w_char div 2; ob_y := 0; ob_w := 50 * CharDefs.w_char; ob_h := 2 * CharDefs.h_char; ob_next := -1; ob_head := -1; ob_tail := -1; ob_type := G_STRING; ob_flags := NONE; ob_state := NORMAL; getmem(ob_spec.str, 50); ob_spec.str^[0] := #0 end; objc_add(MessageBox, MSGBOX, MSGSTR); { objc_add makes the MSGSTR a child of MSGBOX, which is again } { a child of the FRAMEBOX } with MessageBox^[OKBUTTON] do begin { OK button } ob_x := 40 * CharDefs.w_char; ob_y := 3 * CharDefs.h_char; ob_w := 8 * CharDefs.w_char; ob_h := CharDefs.h_char; ob_next := -1; ob_head := -1; ob_tail := -1; ob_type := G_BUTTON; ob_flags := SELECTABLE + DEFAULT + F_EXIT + LASTOB; ob_state := NORMAL; getmem(ob_spec.str, 2 + 1); { reserve space for the string } ob_spec.str^[0] := 'O'; { make the string } ob_spec.str^[1] := 'k'; ob_spec.str^[2] := #0 end; objc_add(MessageBox, FRAMEBOX, OKBUTTON); { objc_add makes the OKBUTTON a child of the FRAMEBOX } objc_draw(MessageBox, FRAMEBOX, $7FFF, 0, 0, 0, 0) { objc_draw draws the FRAMEBOX with all levels ($7FFF = more levels than a 520 ST would have room for in its memory - when using a such big number, we make 101% sure that all of the object tree really IS drawn). The four 0's tell that no clipping should be used } end; function Init_Gem : boolean; var i : integer; s : string; begin AES_handle := appl_init; { get AES id } if AES_handle >= 0 then begin for i := 0 to 9 do WorkIn[i] := 1; { set some defaults } WorkIn[10] := 2; { use Raster Coordinates (RC) } with CharDefs do { get a VDI handle and font information } VDI_handle := graf_handle(w_char, h_char, w_box, h_box); v_opnvwk(WorkIn, VDI_handle, WorkOut); { open virtual workstation } graf_mouse(ARROW, NIL); { make mouse cursor an arrow } { now we determine the available desktop area at our disposal } wind_get(0, WF_FULLXYWH, MinX, MinY, MaxX, MaxY); { the 0 makes wind_get return FULLXYWH information about the desktop } inc(MaxX, MinX); inc(MaxY, MinY); { adjust MaxX and MaxY } if MaxX - MinX < 51 * CharDefs.w_char then begin s := '[3][ | The demo won''t run on screens | with less than 51 characters | per line ][ Sorry ]'#00; i := form_alert(1, s[1]); Exit_Gem; halt(0) end; if GetRez < 2 then begin s := '[1][|The demo looks best in |high resolution, but can |run in medium too][ Ok ]'#00; i := form_alert(1, s[1]) end; MaxColors := WorkOut[39]; graf_mouse(M_OFF, NIL); Init_Gem := TRUE end else Init_Gem := FALSE end; procedure Exit_Gem; begin if MessageBox <> NIL { remove the message box } then FreeMem(MessageBox, 4 * SizeOf(Object)); graf_mouse(M_ON, NIL); v_clsvwk(VDI_handle); { close virtual workstation } appl_exit { end AES usage } end; procedure Message(s : string); var SelectedItem : Integer; { the item that the user selected } begin { (here, it equals OKBUTTON) } if MessageBox = NIL then SetUpMessageBox; MessageBox^[OKBUTTON].ob_state := NORMAL; { deselect button } objc_draw(MessageBox, OKBUTTON, $7FFF, 0, 0, 0, 0); { redraw button } s := copy(s, 1, 49); { truncate string } s := s + #0; { make "C" string } move(s[1], MessageBox^[MSGSTR].ob_spec.str^, length(s)); { move it } objc_draw(MessageBox, MSGBOX, $7FFF, 0, 0, 0, 0); { draw message } graf_mouse(M_ON, NIL); SelectedItem := form_do(MessageBox, 0); { wait for "Ok" } graf_mouse(M_OFF, NIL) end; procedure Inform(s : string); var SelectedItem : integer; begin if MessageBox = NIL then SetUpMessageBox; objc_draw(MessageBox, FRAMEBOX, 0, 0, 0, 0, 0); { draw white box } s := copy(s, 1, 49) + #0; move(s[1], MessageBox^[MSGSTR].ob_spec.str^, length(s)); objc_draw(MessageBox, MSGBOX, $7FFF, 0, 0, 0, 0) { draw all of message (box and str) } end; procedure ErrorCloseDown(s : string); var i : integer; begin s := '[3][ ' + s + '][ Abort ]'#00; graf_mouse(M_OFF, NIL); i := form_alert(1, s[1]); graf_mouse(M_ON, NIL); Exit_Gem; halt(0) end; function MaxW : integer; begin MaxW := MaxX - MinX end; function MaxH : integer; begin MaxH := MaxY - MinY end; function Binary(s : string) : integer; var n, i : integer; begin n := 0; for i := 1 to length(s) do if s[i] in ['0', '1'] then n := n*2 + ord(s[i]) - ord('0'); Binary := n end; procedure OpenOutputWindow; var p : Array_4; begin with OutputWindow do begin bX := MinX + 10; bY := MinY + 10; bW := MaxW - 20; bH := MaxH - 20; handle := wind_create(NAME, bX, bY, bW, bH); wind_set(handle, WF_NAME, HiPtr(WindowName[1]), LoPtr(WindowName[1]), 0, 0); wind_open(handle, bX, bY, bW, bH); wind_calc(WC_WORK, NAME, bX, bY, bW, bH, wX, wY, wW, wH); midX := wX + wW div 2; midY := wY + wH div 2 end; ClearOutputWindow end; procedure CloseOutputWindow; begin with OutputWindow do begin wind_close(handle); wind_delete(handle) end end; procedure ClearOutputWindow; var p : Array_4; a : Array_5; begin vqf_attributes(VDI_handle, a); with OutputWindow do begin p[0] := wX; p[1] := wY; p[2] := wX + wW - 1; p[3] := wY + wH - 1; vs_clip(VDI_handle, 1, p); vsf_color(VDI_handle, White); vsf_interior(VDI_handle, Solid); vr_recfl(VDI_handle, p) end; vsf_color(VDI_handle, a[1]); vsf_interior(VDI_handle, a[0]) end; begin { of unit } MessageBox := NIL; { no message box made yet } WindowName := ' Output '#00#00 end. cedure if InitGraph receives a driver value equaling DETECT. See also: InitGraph, GraphResult, Graph Program DetectGraph_Demo; Uses Graph; Var Driver,Mode : Integer; Begin Write('You can call InitGraph with: '); DetectGraph(Driver,Mode); Case Driver Of StColor : Begin Write('StColor, '); Case Mode Of StLow: Write('StLow'); StMedium : Write('StMedium'); End; End; StMono: Write('StMono, StHigh') Else Write('UNKNOWN?'); End; WriteLn('.'); End. K   #(0:  !Procedure DrawPoly(NumPoints : Word; var PolyPoints); Draws a polygon. PolyPoints contains the polygon coordinates. NumPoints specifies the number of coordinates contained in PolyPoints. Each coordinate in PolyPoints consists of an X and a Y value, both of type integer. Note: In order to draw a closed polygon, the last coordinate in PolyPoints must be the same as the first one. See also: FillPoly, SetWriteMode, Arc, Circle, PieSlice, Rectangle, Sector, Ellipse,{------------------------------------------------------------------------- HighSpeed Pascal GEM-interface demo program GRAF DEMO Copyright (c) 1990 by D-House I All rights reserved Programmed by Martin Eskildsen -------------------------------------------------------------------------} {$R-,S-,D+} program Graf_Demo; uses GemInterface, GemDecl, GemAES, GemVDI; const MinWidth = 0; { smallest width of rubber box } MinHeight = 0; { smallest height of rubber box } var mouseButton : integer; { mouse button state } mouseX : integer; { mouse X pos } mouseY : integer; { mouse Y pos } KbdState : integer; { kbd CTRL, SHIFT, ALT state } endW : integer; { end width of rubber box } endH : integer; { end height of rubber box } { Set up our own mouse shape } procedure SetOurOwnMouse; var shape : Array_37; { structure holding the mouse shape } begin shape[ 0] := 0; { hot spot = (0, 0) } shape[ 1] := 0; shape[ 2] := 1; { must be so! } shape[ 3] := Black; { use black for mouse } shape[ 4] := Black; { use black for mask } shape[ 5] := Binary('00000000 00000000'); { mouse shape : } shape[ 6] := Binary('01110111 00011100'); { you can change it } shape[ 7] := Binary('00100010 00001000'); { yourself if you want } shape[ 8] := Binary('00100010 00001000'); { 1 = set pixel ; } shape[ 9] := Binary('00100010 00001000'); { 0 = clear pixel } shape[10] := Binary('00100010 00001000'); shape[11] := Binary('00100010 00001000'); shape[12] := Binary('00111110 00001000'); shape[13] := Binary('00100010 00001000'); shape[14] := Binary('00100010 00001000'); shape[15] := Binary('00100010 00001000'); shape[16] := Binary('00100010 00001000'); shape[17] := Binary('00100010 00001000'); shape[18] := Binary('00100010 00001000'); shape[19] := Binary('01110111 00011100'); shape[20] := Binary('00000000 00000000'); shape[21] := Binary('00000000 00000000'); { the mask : } shape[22] := Binary('00000000 00000000'); shape[23] := Binary('00000000 00000000'); shape[24] := Binary('00000000 00000000'); shape[25] := Binary('00000000 00000000'); shape[26] := Binary('00000000 00000000'); shape[27] := Binary('00000000 00000000'); shape[28] := Binary('00000000 00000000'); shape[29] := Binary('00000000 00000000'); shape[30] := Binary('00000000 00000000'); shape[31] := Binary('00000000 00000000'); shape[32] := Binary('00000000 00000000'); shape[33] := Binary('00000000 00000000'); shape[34] := Binary('00000000 00000000'); shape[35] := Binary('00000000 00000000'); shape[36] := Binary('00000000 00000000'); graf_mouse(USER_DEF, @shape) { set the shape! } end; procedure WaitForLeftButton; begin repeat graf_mkstate(mouseX, mouseY, mouseButton, KbdState) until mouseButton = 1 end; { Move (drag) a rectangle within another rectangle } procedure MoveRectangle; var x, y : integer; { moved rectangle's end x,y } begin OpenOutputWindow; Inform('Press left mouse button :'); graf_mouse(M_ON, NIL); WaitForLeftButton; graf_mouse(M_OFF, NIL); Inform('Move the small rectangle :'); graf_mouse(M_ON, NIL); with OutputWindow do graf_dragbox(50, 20, { small rect w, h } MouseX, MouseY, { start x, y } wX, wY, { big rect x, y } wW, wH, { big rect w, h } x, y); { small's end x, y } graf_mouse(M_OFF, NIL); CloseOutputWindow end; begin { main } if Init_Gem then begin Message('Welcome to the Graf library demonstration!'); Message('You know the growing box?'); graf_growbox( MinX + (MaxW - 20) div 2, { start x } MinY + (MaxH - 20) div 2, { start y } 40, 40, { start w, h } MinX, MinY, MaxW, MaxH ); { end x, y, w, h } Message('We can shrink it too...'); graf_shrinkbox( MinX + (MaxW - 20) div 2, MinY + (MaxH - 20) div 2, 40, 40, MinX, MinY, MaxW, MaxH ); { note that the parameter order is the same as graf_growbox } Message('and move boxes around the screen fastly...'); graf_movebox(30, 30, { w, h } MinX, MinY, { start x,y } MaxX - 50, MaxY - 50); { end x,y } Message('We can change the appearance of the mouse...'); graf_mouse(POINT_HAND, NIL); Message('and set our own...'); SetOurOwnMouse; Message('but we like the familiar arrow more, don''t we?'); graf_mouse(ARROW, NIL); Inform('Let''s do a rubber box :'); graf_mouse(M_ON, NIL); { turn mouse on } WaitForLeftButton; graf_rubbox(mouseX, mouseY, MinWidth, MinHeight, endW, endH); graf_mouse(M_OFF, NIL); { turn mouse off } MoveRectangle; Message('That''s all folks!'); Exit_Gem end end. Returns the number of the current background color. The range of the returned value depends on the current graphics driver and mode: DriverModeColor range ------------------------------ StColorStLow0..15 StColorStMedium 0..3 StMonoStHigh0..1 See also: GetBkColor, GetColor, Graph Program GetBkColor_Demo; Uses Graph,UtilUnit; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); OutText('Cu{------------------------------------------------------------------------- HighSpeed Pascal GEM-interface demo program VDI GRAPHICS DEMO Copyright (c) 1990 by D-House I All rights reserved Programmed by Martin Eskildsen -------------------------------------------------------------------------} {$R-,S-,D+} program VDI_graphics; uses GemInterface, GemDecl, GemVDI, GemAES; var i : integer; { FOR index } j : integer; { FOR index } p : PtsIn_Array; { v_pline coordinate array } a : Array_4; { v_bar coordinate array } y : integer; { y coordinates } begin if Init_Gem then begin Message('Welcome to the VDI graphics demonstration!'); OpenOutputWindow; Message('First, we''ll look at some lines...'); vsl_color(VDI_handle, Black); { black lines } vsl_width(VDI_handle, 1); { line width := 1 pixel } with OutputWindow do begin p[0] := wX + 5; { set line's left X } p[2] := wX + wW - 10; { and right X } y := wY + 5 { first line's Y } end; vsl_udsty(VDI_handle, Binary('1100110011001100')); { set user line style } for i := Solid to DashDotDot + 1 do begin { let's see all styles } vsl_type(VDI_handle, i); { set current style } p[1] := y; p[3] := y; { set line start, end Y } v_pline(VDI_handle, 2, p); { draw the line, 2 coords } inc(y, 10) { new y } end; vsl_type(VDI_handle, Solid); { set solid line style } for i := 0 to 4 do begin { let's look at line widths } inc(y, 10); vsl_width(VDI_handle, 1 + i * 2); { set line width (should be odd)} p[1] := y; p[3] := y; v_pline(VDI_handle, 2, p) end; Message('markers...'); ClearOutputWindow; for i := 1 to 6 do p[(i-1)*2] := OutputWindow.wX + i * 80; { set up v_pmarker } p[1] := OutputWindow.wY + 20; { coordinates } vsm_height(VDI_handle, 38); { set marker height } for i := 1 to 6 do begin for j := 1 to 5 do p[j*2+1] := p[1]; { set same y coord } vsm_type(VDI_handle, i); { set marker type } v_pmarker(VDI_handle, 6, p); { make the markers } inc(p[1], 40) { update y pos } end; Message('then at some arcs...'); vsl_width(VDI_handle, 1); { line width := 1 } ClearOutputWindow; with OutputWindow do y := wY + wH div 2; { window mid Y } for i := 0 to 5 do v_arc(VDI_handle, OutputWindow.wX + 50 + i * 100, y, { x, y } 45, { radius } 0, (i + 1) * 600); { start, end angle } Message('not to mention the pies...'); ClearOutputWindow; vsf_interior(VDI_handle, PATTERN); { use a pattern fill } vsf_color(VDI_handle, BLACK); { make set points black } for i := 0 to 5 do begin vsf_style(VDI_handle, i + 1); { set fill style } v_pieslice(VDI_handle, OutputWindow.wX + 50 + i * 100, y, 45, 0, (i + 1) * 600) { parameters same as for v_arc } end; { above } Message('circles...'); ClearOutputWindow; for i := 0 to 5 do begin vsf_style(VDI_handle, i + 1); v_circle(VDI_handle, OutputWindow.wX + 50 + i * 100, y, { x, y } (i+1) * 8) { radius } end; Message('and bars.'); ClearOutputWindow; for i := 0 to 19 do begin vsf_style(VDI_handle, i + 1); a[0] := OutputWindow.wX + 5 + i * 30; a[2] := a[0] + 25; a[1] := OutputWindow.wY + OutputWindow.wH - 5; a[3] := a[1] - (i + 1) * 10; v_bar(VDI_handle, a) end; Message('That''s all folks!'); CloseOutputWindow; Exit_Gem end end. ode,''); OutText('Current mode is: '); Case GetGraphMode Of StLow : OutText('StLow'); StMedium : OutText('StMedium'); StHigh: OutText('StHigh'); End; C := ReadKey; CloseGraph; End.   %   Procedure GetImage(x1, y1, x2, y2 : Integer; var BitMap); Stores a specified screen area in a buffer. (x1,y1),(x2,y2) defines the rectangular area to store. BitMap is the buffer to use for the storage. If BitMap is too small to hold the defined area, other data or code will be overwritten. Therefore you should ALWAYS use the ImageSize function to determine the required size of BitMap. See also: ImageSize, PutImage, Graph Program Image_Deprogram HelloWld; Uses GemAES; var Button,n: integer; CStr: String[50]; begin n:=appl_init; if n<>-1 then begin CStr:='[3][ Hello| World][ Ok |Cancel]'#0; Button:=form_alert(1, CStr[1]); appl_exit; write('Thanks for pressing: '); if Button=1 then writeln('Ok') else writeln('Cancel'); end; end. Begin ClearDevice; X := 60; Repeat PutImage(X,GetMaxY DIV 2,Storage^, CopyPut); Delay(DelayTime); PutImage(X,GetMaxY DIV 2,Storage^, XorPut); If (X >= GetMaxX - 60) then X := 60; Inc(X,10); Until KeyPressed; End; { MoveImage } Begin Driver := DETECT; InitGraph(Driver,Mode,''); DrawImage; Size := ImageSize(0,0,60,60); If (MaxAvail > Size) then GetMem(Storage,Size) Else Halt; GetImage(0,0,60,60,Storage^); MoveImage; FreeMem(Storage,Size); CloseGraph; End. C   '-5>Procedure GetLineSettings(var LineInfo : LineSettingsType); Returns the current style, pattern and width of lines. The LineSettingsType record i{------------------------------------------------------------------------- HighSpeed Pascal GEM-interface demo program MENU DEMO Copyright (c) 1990 by D-House I All rights reserved Programmed by Martin Eskildsen -------------------------------------------------------------------------} {$R-,S-,D+} program Menu_Demo; uses GemInterface, GemAES, GemVDI; {$I MENUS.H} var RSC_name : string; { string containing RSC file's name } MenuTree : Tree_Ptr; { object tree containing menu } NewText : string; { string containing an item's new text } { Let the user move around with the mouse and select menu items } procedure MoveAround; const Title = 3; { pipe index holding menu title no. } Item = 4; { pipe index holding menu item no. } var pipe : array [ 0..15 ] of integer; { message pipe } TitleStr : string; { text describing menu title selected } ItemStr : string; { item } done : boolean; { done = TRUE = completed moving } begin graf_mouse(M_ON, NIL); { show the cursor (mouse) } done := FALSE; repeat evnt_mesag(pipe); { wait for an event } if pipe[0] = MN_SELECTED then begin { if it's a menu event : } case pipe[Title] of DESK_T : begin { Desk title } TitleStr := 'Desk'; case pipe[Item] of ABOUT_I : ItemStr := 'About' { about item } end end; FILE_T : begin { File title } TitleStr := 'File'; case pipe[Item] of QUIT : ItemStr := 'Quit' { quit item } end end; EXAMPL_T : begin { Examples title } TitleStr := 'Examples'; case pipe[Item] of ITEM1 : ItemStr := 'Item 1'; { item 1 } ITEM2 : ItemStr := 'Item 2'; { item 2 } ITEM3 : ItemStr := 'Item 3'; { item 3 } ITEM4 : ItemStr := 'Item 4' { item 4 } end end; end { case } end; done := (pipe[Title] = FILE_T) and (pipe[Item] = QUIT); graf_mouse(M_OFF, NIL); { hide mouse } if not done then Inform('You selected ' + TitleStr + ', ' + ItemStr); menu_tnormal(MenuTree, pipe[Title], 1); { reset title } graf_mouse(M_ON, NIL) { show mouse } until done; graf_mouse(M_OFF, NIL) { hide mouse } end; begin { main } if Init_Gem then begin Message('Welcome to the Menu library demonstration!'); Message('First, we''ll have to load the MENUS.RSC file'); RSC_name := 'MENUS.RSC'#00; { note the #00 } rsrc_load(RSC_name[1]); { try to load } if GemError = 0 then begin RSC_name := 'GEMDEMO\MENUS.RSC'#00; rsrc_load(RSC_name[1]); if GemError = 0 then ErrorCloseDown('MENUS.RSC could not be found'); end; Message('Then determine the address of the menu tree'); rsrc_gaddr(R_TREE, MAINMENU, MenuTree); { get addr of main menu } Message('So now we''re ready to draw the menu'); menu_bar(MenuTree, 1); { 1 = draw menu } Inform ('Now you''re on your own! File item Quit completes'); MoveAround; Message('Hope you noticed the Examples menu layout?'); Inform ('We''ll modify it slightly now... Examine!'); menu_icheck(MenuTree, ITEM1, 0); { clear } menu_icheck(MenuTree, ITEM4, 1); { set } menu_ienable(MenuTree, ITEM2, 0); { disable } menu_ienable(MenuTree, ITEM3, 1); { enable } NewText := ' Great!'#0; { note #0 } menu_text(MenuTree, ITEM1, NewText[1]); { set new text } MoveAround; Message('That''s all folks!'); menu_bar(MenuTree, 0); { clear menu bar line } rsrc_free; { release resource file memory } Exit_Gem end end. ver,Mode : Integer; C: Char; Begin DetectGraph(Driver,Mode); WriteLn('Driver is: ',Driver); GetModeRange(Driver,Min,Max); WriteLn('Range is : ',Min,'..',Max); C := ReadKey; End.   - 9  Procedure GetPalette(var Palette : PaletteType); Retu{------------------------------------------------------------------------- HighSpeed Pascal GEM-interface demo program RASTER DEMO Copyright (c) 1990 by D-House I All rights reserved Programmed by Martin Eskildsen -------------------------------------------------------------------------} {$R-,S-,D+} program Rasters; uses GemAES, GemVDI, GemDecl, GemInterface, Bios; const Nsteps = 16; { number of steps, the circle is divided into } mode = S_ONLY; { vro_cpyfm copy mode - toy around with it } var sourceMFDB : MFDB; { source MFDB - where to get image from } destMFDB : MFDB; { destination - where to put image } Rectangles : Array_8; { source and destination rectangles } BoxRect : GRect; { image coordinates } i : Integer; { FOR index } x, y : LongInt; { destination x and y coordinates } angle : real; { current angle in circle } stepsize : real; { stepsize for circle } radius : Integer; { circle's radius } colors : Array_2; { colors used for vrt_cpyfm } { Draw a line from (x,y) to (x1, y1) } procedure Line(x, y, x1, y1 : Integer); var p : ptsin_array; { coordinate sets } begin p[0] := x; p[1] := y; p[2] := x1; p[3] := y1; v_pline(VDI_handle, 2, p) { 2 = number of coordinate sets } end; { Draw a box with the coordinates given by BoxRect and draw a polymarker in it } procedure Box; var p : ptsin_array; begin vsm_type(VDI_handle, 3); { star shape } vsm_color(VDI_handle, BLACK); { black } vsm_height(VDI_handle, BoxRect.h); { height = box's height } with BoxRect do begin Line(x, y, x + w - 1, y); { draw the borders } Line(x+w-1, y, x+w-1, y+h-1); Line(x+w-1, y+h-1, x, y+h-1); Line(x, y+h-1, x, y); p[0] := x + w div 2; { set up polymarker } p[1] := y + h div 2; v_pmarker(VDI_handle, 1, p) { set the marker } end end; begin if Init_Gem then begin Message('Welcome to the raster demonstration!'); OpenOutputWindow; Message('First, we''ll draw a rectangle...'); with OutputWindow, Boxrect do begin x := midX - 30; y := midY - 30; w := 2*30; h := 2*30; Box end; Inform('By the way, this is a contour fill...'); vsf_color(VDI_handle, BLACK); { set points are black } vsf_interior(VDI_handle, HATCH); { use cross-hatch... } vsf_style(VDI_handle, 3); { ... type 3 } with OutputWindow do v_contourfill(VDI_handle, wX, wY, BLACK); { fill the area containing the point (wX, wY) until the color black } { is met (the border color) } Message('Now we''ll make some opaque copies of that rect...'); with sourceMFDB do begin mptr := NIL; { use screen memory } formwidth := BoxRect.w; { width of image } formheight := BoxRect.h; { height of image } widthword := BoxRect.w div 16; { number of entire words } formatflag := 0; { device specific form } memplanes := 1 { two colors (monochrome) } end; destMFDB := sourceMFDB; { destination = source } Rectangles[0] := BoxRect.x; { source rectangle = } Rectangles[1] := BoxRect.y; { two diagonally opposite corner} Rectangles[2] := BoxRect.x + BoxRect.w - 1; { points } Rectangles[3] := BoxRect.y + BoxRect.h - 1; { we''ll form a circle with the help of vro_cpyfm, so we need a bit } { of geometry in order to calculate where to put the images : } angle := 0.0; { circle angle = 0.0 } stepsize := (2*pi) / Nsteps; { circle step size } radius := BoxRect.w + BoxRect.w div 2; { circle radius } for i := 0 to Nsteps do begin x := OutputWindow.midX + round(cos(angle) * radius) - BoxRect.w div 2; y := OutputWindow.midY + round(sin(angle) * radius) - BoxRect.h div 2; angle := angle + stepsize; Rectangles[4] := x; { destination rectangle } Rectangles[5] := y; Rectangles[6] := x + BoxRect.w - 1; Rectangles[7] := y + BoxRect.h - 1; vro_cpyfm(VDI_handle, mode, Rectangles, sourceMFDB, destMFDB) end; Message('Now we''ll reverse the rectangle...'); for i := 0 to 3 do Rectangles[i+4] := Rectangles[i]; { dest rect = source } colors[0] := WHITE; { set points shall turn into white } colors[1] := BLACK; { clear points shall turn into black } vrt_cpyfm(VDI_handle, MD_REPLACE, Rectangles, sourceMFDB, destMFDB, colors); Message('... and reverse again, but with another method...'); vro_cpyfm(VDI_handle, NOT_D, Rectangles, sourceMFDB, destMFDB); Message('That''s all folks!'); CloseOutputWindow; Exit_Gem end end. eground color to 1. Sets the line style to be solid and the line width to be 1 pixel. Sets the fill pattern to be solid, and the fill color to be the highest possible color. Sets the text font to be the default font, the direction to be horizontal and the size to be 1. See also: InitGraph, Graph q- " "Function GraphErrorMsg(ErrorCode : Integer) : string; Returns an error message corresponding to a Graph unit error code. GraphErrorMsg can be used together with the GraphResult function to obtain a string with an explanation to one of the Graph unit error codes. Graph contains 15 predefined error messages: { # 0{------------------------------------------------------------------------- HighSpeed Pascal GEM-interface demo program TEXT OUTPUT DEMO Copyright (c) 1990 by D-House I All rights reserved Programmed by Martin Eskildsen -------------------------------------------------------------------------} {$R-,S-,D+} program Texts; uses GemAES, GemVDI, GemDecl, GemInterface; const NO = 0; YES = 1; CharSpace = YES; { use char spacing in v_justified } WordSpace = YES; { use word spacing in v_justified } TheText = 'The Quick Brown Fox Jumps Over The Very Lazy Dog.'#00; var y : integer; { current text y coordinate } TextHeight : integer; { current height of text } dummy : integer; { Write TheText in the output window } procedure WriteTheMessage; begin inc(y, TextHeight); v_gtext(VDI_handle, OutputWindow.wX, y, TheText) end; begin { main } if Init_Gem then begin Message('Welcome to the text output demonstration!'); Message('We''ll take a look at some different ways...'); Message('of putting text on the screen without GDOS.'); OpenOutputWindow; y := OutputWindow.wY; { set y coord } TextHeight := CharDefs.h_Char; { set text height } Message('First some normal text'); WriteTheMessage; Message('Then justified to fit window'); inc(y, TextHeight); v_justified(VDI_handle, OutputWindow.wX, y, { x,y } TheText, { text to write } OutputWindow.wW, { field width } WordSpace, CharSpace); { spacing flags } Message('Now in another size...'); vst_height(VDI_handle, 19, { new height } dummy, dummy, dummy, TextHeight); WriteTheMessage; Message('Style...'); vst_effects(VDI_handle, BOLD + OUTLINE); { set text effect } WriteTheMessage; Message('and finally in another size, style and rotation'); vst_height(VDI_handle, 25, dummy, dummy, dummy, TextHeight); vst_effects(VDI_handle, SHADED); vst_rotation(VDI_handle, 2700); WriteTheMessage; Message('That''s all folks!'); CloseOutputWindow; Exit_Gem end end. ,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); SetActivePage(22222); If GraphResult = GrOK then OutText('Impossible!') Else OutText('Only page 0 and 1 available.'); C := ReadKey; CloseGraph; End. ff   Function ImageSize(x1, y1, x2, y2 : Integer) : LongInt; Returns the size, i bytes, of a specified screen area. ImageSize calculates the storage needed to save a rectangular area of the screen, using the GetImage procedure. The point (x1,y1) is the upper-left, and (x2,y2) is the lower-right corner of the screen area. {------------------------------------------------------------------------- HighSpeed Pascal GEM-interface demo program WINDOW DEMO Copyright (c) 1990 by D-House I All rights reserved Programmed by Martin Eskildsen -------------------------------------------------------------------------} {$R-,S-,D+} program Window_Demo; uses GemInterface, GemDecl, GemAES, GemVDI; const LeftButton = 0; { left mouse button } RightButton = 1; { right mouse button } var w1, w2, w3 : integer; { window handles } x, y, w, h : integer; { used for various purposes } Title2 : string; { window 2's title string } Title3 : string; { window 3's title string } InfoLine : string; { window 3's info line string } AllElements : integer; { all window elements } i : 0..1000; { slider position index } j : 0..2; { FOR index } mouseX : integer; { mouse x pos } mouseY : integer; { mouse y pos } mouseKeys : integer; { mouse button state } window : integer; { window handle from wind_find } s : string; { message string } { Clear the work rectangle of the given window } procedure ClearWindow(window : integer); var p : Array_4; { rectangle to clear } begin wind_update(BEG_UPDATE); { we're working ! } wind_get(window, WF_WORKXYWH, x, y, w, h); { get work area } p[0] := x; { set up rectangle } p[1] := y; p[2] := x + w - 1; p[3] := y + h - 1; vs_clip(VDI_handle, 1, p); { set clip rectangle } vsf_color(VDI_handle, WHITE); { white, } vsf_interior(VDI_handle, SOLID); { solid } vr_recfl(VDI_handle, p); { fill } v_gtext(VDI_handle, x, y + CharDefs.h_char, ' HighSpeed Pascal window demonstration program '#00); wind_update(END_UPDATE) { we're through working } end; begin { main } if Init_Gem then begin Message('Welcome to the window library demonstration!'); Message('We will now create and open a simple window...'); x := MinX + 5; { make border size } y := MinY; w := MaxW div 2 - 5; h := MaxH div 2 - 5; w1 := wind_create(0, x, y, w, h); { create the window } wind_open(w1, x, y, w, h); { open (display) it } ClearWindow(w1); { clear work area } Message('and a second, more complex, one...'); x := x + w + 5; { make x pos } Title2 := ' Window 2 '#00#00; { create title } { create window #2 } w2 := wind_create(NAME + CLOSER + SIZER, MinX + 5, MinY + 5, MaxW - 10, MaxH - 10); { set title : } wind_set(w2, WF_NAME, HiPtr(Title2[1]), LoPtr(Title2[1]), 0, 0); wind_open(w2, x, y, w, h); { display window } ClearWindow(w2); { clear work rectangle } Message('and finally the most advanced available.'); AllElements := NAME + CLOSER + FULLER + INFO + SIZER + UPARROW + DNARROW + VSLIDE + LFARROW + RTARROW + HSLIDE; x := MinX + 5; { make border pos, size } y := MinY + MaxH div 2; w := MaxW - 2*5; h := MaxH div 2; Title3 := ' Window 3 '#00#00; { create title } InfoLine := 'This is the window''s' + ' info line'#00#00; { create info line } w3 := wind_create(AllElements, x, y, w, h); { set title : } wind_set(w3, WF_NAME, HiPtr(Title3[1]), LoPtr(Title3[1]), 0, 0); { set info line : } wind_set(w3, WF_INFO, HiPtr(InfoLine[1]), LoPtr(InfoLine[1]), 0, 0); wind_open(w3, x, y, w, h); { display window #3 } ClearWindow(w3); { clear work area } Message('Now we''ll activate the second window...'); wind_set(w2, WF_TOP, 0, 0, 0, 0); { top #2 } Message('and change the size of it...'); wind_get(w2, WF_CURRXYWH, x, y, w, h); { get curr. size } w := w div 2; { make half width} wind_set(w2, WF_CURRXYWH, x, y, w, h); { set new size } ClearWindow(w2); { clear work area} Message('full it...'); wind_get(w2, WF_FULLXYWH, x, y, w, h); { get max size } wind_set(w2, WF_CURRXYWH, x, y, w, h); { set it } ClearWindow(w2); { clear work area} Message('and restore to previous size.'); wind_get(w2, WF_PREVXYWH, x, y, w, h); { get prev. size } wind_set(w2, WF_CURRXYWH, x, y, w, h); { set it } { As window #2 overlaid the other two windows, thereby destroying their work areas, they have to be cleared again} ClearWindow(w1); { clear work #1 } ClearWindow(w2); { #2 } ClearWindow(w3); { #3 } Message('A window can be closed...'); wind_get(w3, WF_CURRXYWH, x, y, w, h); { save size } wind_close(w3); { remove from VDU} Message('and opened again later.'); wind_open(w3, x, y, w, h); { display } ClearWindow(w3); { clear work area} Message('Let''s change the horizontal slider''s size in #3'); wind_set(w3, WF_HSLSIZE, 333, 0, 0, 0); { size = 1/3 of } { max. possible } Message('Now we''ll move the vertical slider.'); i := 0; for j := 0 to 2 do begin while i < 1000 do begin inc(i, 100); wind_set(w3, WF_VSLIDE, i, 0, 0, 0) { set size } end; while i > 0 do begin dec(i, 100); wind_set(w3, WF_VSLIDE, i, 0, 0, 0) { set size } end end; Inform('Move and click left mouse button; right completes'); graf_mouse(M_ON, NIL); repeat vq_mouse(VDI_handle, mouseKeys, mouseX, mouseY); if BitTest(LeftButton, mouseKeys) then begin window := wind_find(mouseX, mouseY); if window = 0 then s := '-No window-' else begin str(window, s); s := 'Window handle = ' + s end; s := s + ' Right button completes'; Inform(s) end until BitTest(RightButton, mouseKeys); graf_mouse(M_OFF, NIL); Message('Now all is shown, so let''s close all windows...'); wind_close(w1); wind_close(w2); wind_close(w3); Message('remove them from memory and terminate!'); wind_delete(w1); wind_delete(w2); wind_delete(w3); Exit_Gem end end. lt : Word); Puts a stored image onto the screen. (X,Y) specifies where on the screen to put the stored image. BitMap contains the image. BitBlt specifies the binary operation to use, when putting the image onto the screen. The legal values for BitBlt are declared in the Graph unit as: Const NormalPut=0; CopyPut=0; XorPut=1; OrPut=2; AndPut=3; NotPut=4; NormalPut and CopyPut will simply put the stored image onto the screen. XorPut will XOR (EOR), OrPut will OR and AndPut will AND the stored image with the current screen contents. NotPut will NOT (Invert) the stored image onto the screen. If BitBlt contains an illegal value, the image will not be put onto the screen. See also: GetImage, Graph   Procedure PutPixel(X, Y : Integer; Pixel : Word); Plots a pixel in the specified color at the specified point. See also: GetPixel, GetColor, Graph  l$ l ' Desk Windows Quit About HighSpeed Demo... ------------------------- Desk Accessory 1 Desk Accessory 2 Desk Accessory 3 Desk Accessory 4 Desk Accessory 5 Desk Accessory 6 --- Current : Close --- Text window : Open Close --- Graphics window : Open Close Select demo... Let's do it! Select demo type by clicking icon :PIESELLIPSESLINESBOXESHighSpeed Pascal GEM demoThis simple demo program demonstrates how GEMfunctions are interfaced with HighSpeed PascalOk<@@<88f|?`f@@@@ @  0!"D H0?8???X!ƨ%EX!F!G)#@1@!@%A!!-!) % ! +)!5!?P0") ,@"< <0") 0") $ZZ $ +  4P ; U o   2I`w % ! l  5 5 $-R.'(  @; Until KeyPressed; C := ReadKey; End; Procedure Many_Bars; Begin Repeat SetFillStyle(Random(CloseDotFill)+1,Random(GetMaxColor+1)); Bar3D(RandX,RandY,RandX,RandY,0,TopOff); Until KeyPressed; C := ReadKey; End; Procedure Message( Line1, Line2 : String ); Var Th,Hx,Hy,W : Integer; Begin Th := TextHeight('M')*2; Hx := GetMaxX DIV 2; Hy := GetMaxY DIV 2; W := (8+TextWidth(Line2) DIV 2); SetFillStyle(EmptyFill,GetMaxColor); Bar3D(Hx-W,Hy-Th*1,Hx+W,Hy+Th*2,0,TopOff); SetTextJustify(CenterText,CenterText); OutTextXY(Hx,Hy,'PAGE '+Line1); OutTextXY(Hx,Hy$$$$$$$$dh Desk Examples File Menu demo -------------------- Desk Accessory 1 Desk Accessory 2 Desk Accessory 3 Desk Accessory 4 Desk Accessory 5 Desk Accessory 6 Item 1 Item 2 ---------- Item 3 Item 4 Quit PP $ +  6P = K ` u           $e of the PaletteType record: Type PaletteType = Record Size: Integer; Colors: Array[0..15] Of ShortInt; End; The first integer specifies the UNI2$pV " j D; " " h$j)~,,^Jv.6^*f8 DEMOINTERFACENMAINMENU \ZDESKMENU \DQUITMENU \.WINMENU\SLCTDEMO \ELLIPSES \PIES \ABOUTBAR \LINES\BOXES\tWINCLOSE \TXTCLOSE \vTXTOPEN\bGRAOPEN\NGRASELEC \8\GRACLOSE \"QUITBAR\lABOUTBOX \ABOUTOK\OBJECT ]O_NEXT QO_STARTQO_ENDQO_TYPE QpO_FLAGSQZO_STATUS Q B|O_SPEC Q f,O_XQO_YQO_WQO_HQTREE ] 2TREEPTR]rhDEMOTYPE ]L 8 BOXESDEMO\& LINESDEMO\ ELLIPSESDEMO \PIESDEMO \SETSTATE ] S_ENABLE \h S_DISABLE\S_LEAVE\zMENU QbABOUTQN SELECTIONQ6 VDI_HANDLE Q 4 AES_HANDLE Q TEXTWINDOW Qx GRAFWINDOW QDEMO QMINX QMINY QMAXW QMAXH QQUIT Qn CHARBOXHEIGHTQ R CHARHEIGHT Q"8 FATALERROR D INIT_GEM 6(END_GEMD6 INIT_RESOURCEDDB END_RESOURCE DRSETOBJECTSTATUSD`HZT SETMENUSTATE Dn |;BSystem^OSystem2GEMDECL&GEMAES0GEMVDIBIOS%GEMDEMO.H - read resource constants DemoInterface|DEMOINTE|FATALERRINIT_GEMEND_GEMINIT_RESEND_RESOSETOBJEC^SETMENUS(6D0DR `"6n (|||"|(|.xR4|:|@|FxRL|X|t^|d|jxRp|||t||xR||t|x(| h$|`2|D||Tp`p(fdldxddptddlddddpddd$d*p<4p:dddd$d*pJ0d6l(<p||` |2||<pFDp^||hpFpp~d6ddpbdpbdpbdndd`dd`d d`dd`"d.d`4d>p dppTd$p6dBpnd~dddd ddd dNqNqNV/.Hn?<NHyNNNHyNNNHyHztBgNNNNHyHnBgNNNNHyHzRBgNXNUN=_BgNN^.Nu%>>> Fatal error condition arised! <<<Press a key to abort...NqNqNVUN0 @lDHz.HnNHz`HnNHnHn?<NU?<HnN=_UN3JymUHy"HnHy HnN3 pr @m,=@=A`Rn0.HC30.nf=| HnHy HnNBg?<HyHyHyHyNBgBgBgBg?9?9?9?9NBgBNJy\D@N^Nu?[0][ |Note! The icons will look a |bit odd in this resolution.% |High res. looks nicest |][ Ok ]NqNqNVBgBgBgBg?9?9?9?9N?9 NNN^NuNqNqNVHzHzHn?<NHnNUN0J@fNHzNBgBgHyNBg?<HyNBg?<HyN<B'<B'<N/9?<BgN/9?<?<N/9?<BgN/9?<BgN/9?<BgN/9?<NN^Nu GEMDEMO.RSCGEMDEMO\GEMDEMO.RSC GEMDEMO.RSC is missing!NqNqNV/9BgNNN^NuNqNqNV0. "n 3 N^ _PNNqNqNV. f/9?. ?<N`( f/9?. BgN` fN^ _PNNqNqNV.?</N.?</N. ?</N. ?</N.?</NN^ _O NNqNqNVB9B933N^Nund fill color will be set equal to the Pattern and Color parameters. See also: SetFillStyle, GetFillPattern, GetFillSettings, GraphResult, FloodFill, FillEllipse, FillPoly, Bar, Bar3D, PieSlice, Graph Program SetFillPattern_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; NewPattern: FillPatternType; Begin NewPattern[1] := 28; NewPattern[2] := 34; NewPattern[3] := 65; NewPattern[4] := 65; NewPattern[5] := 65; NewPattern[6] := 34; NewPattern[7] := 28; NewPattern[8] := 0; Driver := DETECT; InitGraph(Driver,Mode,''); SetColor(GetColor); Rectangle(0,0,GetMaxX,GetMaxY); SetFillPattern(NewPattern,GetColor); FloodFill(1,1,GetColor); C := ReadKey; CloseGraph; End. H? 3 / # ##,#< $ $ $#$-$2$9% Procedure SetFillStyle(PatternUNI2 O4 O4 J F G^ Fffb J J D O4h$j)~V@P DEMOGRAPHS N MAKEGRAPHDATADFORCEGRAPHICSREDRAWD(DOBOXESD6DOLINESDD DOELLIPSES DRDOPIES D`ZbBSystem-OSystem2GEMDECL&GEMAES-0GEMVDID; DEMOINTERFACE DemoGraphsEncl, Ge, GenMAKEGRAPFORCEGRADOBOXESDOLINESDOELLIPSDOPIES`- o_z4$(T0 < 6TD^RH`H |^.d8h>hH|lPhVh`|ljhx|lh|l|l|l|l|l hdd d&d,p dzhd&d.d6d>hLp`"h0l dzhlJ>dHhRl<Xhbl.jdxdddhl dzd dHdVdfdndtd|dddddddddddddddd ddd,d2dDdJd dzhlJ>dHhRl<Xhbl.hhpd|dl2 dzhlJ>dHhRl<Xhbl.hhpd|dljNVHNprP@m=@=A`Rn0.HGG09yS@?N609yS@?N7_09H?N7_09H?N7_?<N7_?<N7_ ?<N0T@7@ ?< N0R@7@0.nf@&_N^NuNqNqNV?9?<HyHyHyHyNN^NuNqNqNVN=|=y=y=y=y=y?9?<HnNN^NuNqNqNV=n=n =n =n?9 ?<HnNN^ _PNNVHN?9 ?<NprP@m=@=A`Rn0.HGG?9 ?+ N?9 ?+N0y=@0+y=@0ykS@=@0+ykS@=@?9 HnN0.nfr&_N^NuNqNqNVN09H=@09H=@pr'@m$=@=A`Rn?90.y?0.y?09y?N09y?0.y?09y2.A?09y?N?909y2.A?0.y??9N09y?09y2.A?09y2.A??9N0.nfN^NuNVHN?9 ?<NprP@mv=@=A`Rn0.HGG?9 ?+ N?9 ?+N?9 0y?0+y??+?+N0.nf&_N^NuNVHN?9 ?<NprP@m~=@=A`Rn0.HGG?9 ?+ N?9 ?+N?9 0y?0+y??+?+?+?+ N0.nf&_N^NuProcedure SetLineStyle(LineStyle, Pattern, Thickness : Word); Specifies the pattern and width of lines. LineStyle specifies what line pattern to use. The legal values are declared in the Graph unit as: Const{ Bit-pattern used: } SolidLn=0; { 1111111111111111} DottedLn =1; { 1110000011100000} CenterLn =2; { 1111111000111000}UNI2q2, ^lZ,,Jxx7~*t4TL 8  4>GEMINT NFRAMEBOX \`MSGBOX \LMSGSTR \8OKBUTTON \"C_STRING ]  t STRING_PTR ]OB_TYPE]  SPEC_INFO]RZ,THICKQTCOLORQ@STRQ OBJECT ]nOB_NEXTQOB_HEADQOB_TAILQOB_TYPEQOB_FLAGS QOB_STATE Q xxOB_SPECQ RJOB_X QNOB_Y Q:|OB_W Q&OB_H QvTREE ] nTREE_PTR ]WORKIN QWORKOUTQjn. AES_HANDLE Qz\ VDI_HANDLE Q|BCHARDEFS Q~D.H_CHAR Q W_CHAR QH_BOXQW_BOXQVvMINX QMINY QMAXX Q|MAXY Qh MAXCOLORSQP OUTPUTWINDOW Q$HANDLE QBX QBY QBW QBH QWX Q WY Q WW QWH QMIDX QpMIDY Q\L: MESSAGEBOX QINIT_GEM 6EXIT_GEM D(pMESSAGED 6INFORM D DERRORCLOSEDOWN D R|MAXW 6f`MAXH 6JnBINARY 6 ,| vOPENOUTPUTWINDOW DCLOSEOUTPUTWINDOWDCLEAROUTPUTWINDOWDRBSystem OSystem2GEMDECL0GEMVDI}&GEMAESaBIOSu GemInt0RGEMINTINIT_GEMEXIT_GEMMESSAGEINFORMERRORCLO MAXWMAXH"BINARY.OPENOUTP:CLOSEOUTFCLEAROUTSETUPMES.*(<*6rDHR <` n" |.:TF RZ 0 d|dd,d4dFdLd`dlddddddl@dd&d4df|pd~l@ddddd|dl@d&l\ l(dd>dXd^dtltxd~dddplddddlddddddd|| ld(| h:||HlPdTd`l dd|(l,d2p(6l|||d$d(d2dHl\\|l||x|`|||d|dl\ldll||d$d(d:l\N|Z|j||rd|dl\||"|`.|:|J||Tlblpltd(z| dd dd||N|V|^|h|x ddd.d`>dnblpdvt6|dtDl*ll8d dll dpdFdTp`Xd`pJddnp.rd|pdpJdp. dd||NVHHyHx`N&y0927@09~H29~HA7@09ykH7@09~Hy7@67|7|7|Bk7| Bk0+kX@3&yGBkBk0927@09~H7@67|7|7|BkBk Bk/9Bg?<N&yG009H7@Bk0927@09~H7@67|7|7|BkBk Hk Hx2N k B/9?<?<N&yGH09(7@09~7@09H7@7y~67|7|7|7|'Bk Hk HxN"k O"k |k k B(/9Bg?<N/9Bg?<BgBgBgBgN&_N^NuNVHUN3zJyzmPpr @m.=@=A`Rn0.HC30.nf3G~UHkHSHkHkN3|HyHy|HyNBgBNBg?<HyHyHyHyN09y09y09y293Al.HzHn?<NU?<HnN=_NBgNUN0 @l$HzHn?<NU?<HnN=_3V?<BN|`B.&_N^Nu\[3][ | The demo won't run on screens | with less than 51 characters | per line ][ Sorry ] T[1][|The demo looks best in |high resolution, but can |run in medium too][ Ok ] NqNqNVJgHyHx`N?<BN?9|NNN^NuNqNqNV/.Hn?<NJfN yBhR/9?<?<BgBgBgBgNHnHn?<?<1NHnHn?<NHnHnNHzzHnNHnHn?<NHn y/(" FULLWINDOW D | CLOSEWINDOWD n MOVEWINDOW DJ SIZEWINDOW DCLOSETOPWINDOW DjBSystemgOSystem2GEMDECL&GEMAES0GEMVDI; DEMOINTERFACEb DEMOGRAPHS DemoWindowsDEMOWINDOPENGRAPCLOSEGRAOPENTEXTCLOSETEX SELECTGRREDRAWWI@TOPWINDOLFULLWINDXCLOSEWINpMOVEWIND|SIZEWINDdCLOSETOP?. r(T6D TR:Z2@P`P$\dnL&|X*d.p2 |~` 0 dll$d*d2lDdJlPlVd\dbdldrdvd|dddd ddll$l*l0t6l<lJtPl\dbx6jdpxDzt*ddddddddt<lddddtlnt ltl8tztJltltlllnlnt ddll$l*l0t6l<lJtPl\dbx6jdpxDzt*ddddddddt<lddddtlnt ltl8tztJltltlllnlnt l t@tbthlt\ltttlll,l2h( l$t*l<lJl^ddpjllh6hDhRh`tt$tbx`lp`lpJlp.lpld$ d2*t:tBtt*"t@t^tt*t*lh(ldD"d( t*d"t@t.^t*hlrh("t@t*JlTh(d|"d,|6d@|HdPdNqNqNV309 Hy 309H29@AH309y 3 09y@3 333 N^NuNqNqNVNU?9?9?9?9?9N3Jym?<N?9?<UHyNUHyNBgBgN09Hy [@?09Hy[@??< ?< ?9 ?9?9?9N?9?9 ?9?9?9NB'<<<B'NBgNN^NuNqNqNVJym?<N?9?<HnHnHnHnN0.Hn[@?0.Hn[@??< ?< ?.?.?.?.N?9N?9N3Jym<<<B'<N`<<<B'<NBgNN^NuNqNqNVNU?9?9?9?9?9N3Jym?<N?9?<UHyNUHyNBgBgN09Hy[@?09 Hy[@??< ?< ?9?9?9?9 N?9?9?9?9?9 NB'<B'<<NBgNN^NuNqNqNVJym?<N?9?<HnHnHnHnN0.Hn[@?0.Hn[@??< ?< ?.?.?.?.N?9N?9N3Jym<B'<<<N`<B'<<<NBgNN^NuNqNqNV/9HnHnHnHnNBgBgBgBgBg?.?.?.?.N?<BgBgBgBg?.?.?.?.N/9Bg?<?.?.?.?.NU/9?[ }r |N | |8hA }r }r z B $j)~\`DEMOMENU N HANDLEMENU D JD^ABSystemGOSystem2GEMDECL&GEMAESB; DEMOINTERFACE DEMOWINDOWS DemoMenuE6NU.PASBHANDLEME6(BH< l p@pbphlp\lpppll`"d(@hRh6dhDvhh(hRllpNqNqNV/9HnHnHnHnNBgBgBgBgBg?.?.?.?.N?<BgBgBgBg?.?.?.?.N/9Bg?<?.?.?.?.NU/9? key } K_LSHIFT= 2; { Left key } K_CTRL= 4;{ key } K_ALT= 8;{ key } { Message types : } MN_SELECTED = 10;{ Menu item selected } WM_REDRAW= 20; { Window redraw requested } WM_TOPPED= 21; { Window topped } WM_CLOSED= 22; { Window close "button" was hit } WM_FULLED= 23; { Window full "button" was hit } WM_ARROWED = 24;{ One of the slider bar arrows was hit } WM_HSLID= 25;{ Horizontal slider moved } WM_VSLID= 26;{ Vertical slider moved } WM_SIZED= 27;{ Window re-sized } WM_M CALCULAT = 0; (* TREE *) HELPSCR1 = 1; (* TREE *) HELPSCR2 = 2; (* TREE *) KEYBOARD = 1; (* OBJECT in TREE #0 *) SEVEN = 2; (* OBJECT in TREE #0 *) EIGHT = 3; (* OBJECT in TREE #0 *) NINE = 4; (* OBJECT in TREE #0 *) DIVKEY = 5; (* OBJECT in TREE #0 *) FOUR = 6; (* OBJECT in TREE #0 *) FIVE = 7; (* OBJECT in TREE #0 *) SIX = 8; (* OBJECT in TREE #0 *) MULTKEY = 9; (* OBJECT in TREE #0 *) TWO = 10; (* OBJECT in TREE #0 *) THREE = 11; (* OBJECT in TREE #0 *) SUBKEY = 12; (* OBJECT in TREE #0 *) ZERO = 13; (* OBJECT in TREE #0 *) ADDKEY = 14; (* OBJECT in TREE #0 *) ONE = 15; (* OBJECT in TREE #0 *) DELKEY = 16; (* OBJECT in TREE #0 *) RADIX = 17; (* OBJECT in TREE #0 *) SIGNKEY = 18; (* OBJECT in TREE #0 *) ENTERKEY = 19; (* OBJECT in TREE #0 *) SWAPKEY = 20; (* OBJECT in TREE #0 *) HELPKEY = 21; (* OBJECT in TREE #0 *) DISPLAY = 23; (* OBJECT in TREE #0 *) SEGMENTS = 24; (* OBJECT in TREE #0 *) HELPOK1 = 12; (* OBJECT in TREE #1 *) MORE = 13; (* OBJECT in TREE #1 *) HELPOK2 = 12; (* OBJECT in TREE #2 *) BACK = 13; (* OBJECT in TREE #2 *) le } INFO=16; { Info line } SIZER=32; { Size field } UPARROW=64; { UpArrow at vertical slider field } DNARROW= 128; { DownArrow at vertical slider field } VSLIDE= 256; { Vertical slider field } LFARROW= 512; { LeftArrow at horizontal slider field } RTARROW= 1024; { RightArrow at horizontal slider field } HSLIDE= 2048; { Horizontal slider } { wind_calc flags : } WC_BORDER= 0; { Calculate border area from known work area } WC_WORK= 1;{ Calculate work area from known border area } { wind_get flags } WF_KIND= 1;{ Window kind } WF_NAME= 2;{ Window name } WF_INFO= 3;{ Window info } WF_WORKXYWH = 4;{ Window work area x, y, w, h } WF_CURRXYWH = 5;{ Current border area {------------------------------------------------------------------------- HighSpeed Pascal GEM accessory demo MyCalc RPN CALCULATOR DEMO Copyright (c) 1990 by D-House I All rights reserved Programmed by Martin Eskildsen -------------------------------------------------------------------------} {$R-,S-,D+,F-,M 4,1,1,20} program MyCalc; uses GemDecl, GemAES, GemVDI, RPN; CONST {$I MyCalc.I} { get resource file constants } type C_String = packed array [0..255] of char; String_Ptr = ^C_string; Ob_Type = G_BOX..G_TITLE; Spec_Info = RECORD CASE Ob_Type OF G_Box, G_IBox, G_BoxChar, G_Text, G_BoxText, { these fields should } G_FText, { of course be extended } G_FBoxText, { but as the only field } G_Image, { needed is G_String, } G_UserDef, { this structure is per- } G_Button, { fectly suitable } G_Icon, G_String, G_Title : (str : String_Ptr) END; Object = RECORD ob_next : Integer; { next object in tree } ob_head : Integer; { parent object } ob_tail : Integer; { next parent on level } ob_type : integer; { object type } ob_flags : integer; { flags } ob_state : integer; { state } ob_spec : Spec_Info; { color/pointer etc. } ob_x : integer; { obj. rectangle size } ob_y : integer; { and position relative } ob_w : integer; { to parent object } ob_h : integer END; Tree = ARRAY [ 0..199 ] OF Object; { the object tree } Tree_Ptr = ^Tree; { pointer to the tree } var VDI_handle : Integer; { GEM VDI handle (graf_handle) } AES_handle : Integer; { GEM AES handle (appl_init) } ACC_handle : Integer; { GEM acc. id (menu_tregister) } Title : string[14]; { ' MyCalc '#0#0 } Window : Integer; { window handle } Quit : Boolean; { TRUE = exit application } noRSC : Boolean; { TRUE = no resource file } Dialog : Tree_Ptr; { the calculator dialog tree } LastSelected : Integer; { index of last selected button } { event manager variables : } x, y : Integer; { mouse x,y coordinate } key : Integer; { keyboard key scan code } button : Integer; { mouse button state } clicks : Integer; { mouse button clicks } kbdstate : Integer; { keyboard state (CTRL, ALT etc)} pipe : array_16; { GEM message pipe } Xres : Integer; { screen x resolution (pixels) } eventflags : Integer; { flags for evnt_multi } evnt_flag : record { different evnt_multi flag ... } wait : Integer; { ... setups } active : Integer end; { Initialize GEM (application and workstation. Accessory detection not until later } procedure Init; var workIn : intin_Array; workOut : workout_Array; i : integer; begin AES_handle := appl_init; if AES_handle <> -1 then begin { -1 = error } VDI_handle := graf_handle(i, i, i, i); for i := 0 to 9 do workIn[i] := 1; workIn[10] := 2; v_opnvwk(workIn, VDI_handle, workOut); Xres := workOut[0] end else begin writeln('MyCalc could not be installed'); Halt(0) end end; procedure DeInit; begin rsrc_free; { remove RSC file } v_clsvwk(VDI_handle); { close workstation } appl_exit { exit application (no AES usage allowed) } end; { Try to load the resource file. If unsuccessful, then write error message } procedure LoadRSC; var title : string; { name of RSC file } i : integer; { dummy } begin title := 'MYCALC.RSC'#0; rsrc_load(title[1]); noRSC := GemError <= 0; if noRSC then begin Insert('MYCALC\',title,1); rsrc_load(title[1]); noRSC := GemError <= 0; if noRSC then begin title := '[3][MYCALC.RSC could not be found |and MyCalc can hence ' + 'not be |activated unless you copy the |RSC file into the' + ' currently |active directory.][ Too bad! ]'#0; i := form_alert(1, title[1]); if AppFlag then begin { terminate if application } v_clsvwk(VDI_handle); appl_exit; halt(0) end end end; rsrc_gaddr(R_TREE, CALCULAT, Dialog) { get Dialog's address } end; { Open calculator window } procedure OpenWindow; var s : String; { alert message string } i : Integer; { dummy } elements : Integer; { window elements } x, y, w, h : Integer; { window bordr x,y,w,h } begin if noRSC then LoadRSC; { try to load resource file again } if not noRSC then begin elements := NAME or MOVER or CLOSER; { window elements } { the below is a tricky thing : All objects in an object tree are located relative to their parent object, i.e. the calculator dialog box (CALCULAT). Now, the window is ment to show itself at the middle of the screen, so we make a form_center to place the dialog box there, and then use wind_calc with the CALCULAT objects size parameters as work area input to calculate the window's border dimensions which we require in order to do a nice wind_create } form_center(dialog, i, i, i, i); with Dialog^[CALCULAT] do wind_calc(WC_BORDER, elements, ob_x, ob_y, ob_w, ob_h, x, y, w, h); window := wind_create(elements, x, y, w, h); if window < 0 then begin { if the AES has no more windows : } s := '[3][|No window for MyCalc |Close one and retry ][ Ok ]'#0; i := form_alert(1, s[1]) end else begin { a window was created successfully } eventflags := evnt_flag.active; { set window title } wind_set(window, WF_NAME, HiPtr(Title[1]), LoPtr(Title[1]), 0, 0); graf_growbox(0,0,0,0, x,y,w,h); wind_open(window, x, y, w, h) end end end; { Redraw our window. The procedure is : If our window is not open, then exit otherwise get the total work area into MyArea. After this, get the first rectangle from the rectangle list and see if it intersects with our window. If it does then redraw the CALCULAT dialog with the intersecting rectangle as active (non-clipped) area } Procedure RedrawWindow; var WindowRect, MyArea : GRect; { Using x,y,w,h system } Clip : Array_4; { Using x1,y1,x2,y2 system } begin if Window = -1 then exit; { can't redraw if no window! } with MyArea do wind_get(Window, WF_WORKXYWH, x, y, w, h); with WindowRect do wind_get(Window, WF_FIRSTXYWH, x, y, w, h); while not EmptyRect(WindowRect) do begin if intersect(MyArea, WindowRect) then with WindowRect do objc_draw(Dialog, CALCULAT, $7FFF, x, y, w, h); with WindowRect do wind_get(Window, WF_NEXTXYWH, x, y, w, h) end end; { Close our window } procedure CloseWindow; var x, y, w, h : Integer; begin eventflags := evnt_flag.wait; { go into "wait-state" } wind_get(window, WF_CURRXYWH, x, y, w, h); { get current position } graf_shrinkbox(0,0,0,0, x,y,w,h); { shrink a box } wind_close(window); { remove from screen } wind_delete(window); { and RAM } window := -1 { and indicate as closed} end; { Top our window } procedure TopWindow; begin wind_set(window, WF_TOP, 0, 0, 0, 0); eventflags := evnt_flag.active end; { Put something in the display. If in an error condition, then write the error message, else if inputting (Result = FALSE) then write input string unformatted, else write the top-of-stack value formatted } procedure WriteDisplay(Result : boolean); var s : string; begin if Error <> -1 then s := ' Error ' + chr(Error + ord('0')) + #0 else if result then begin str(TopOfStack:width:digits, s); s := copy(s, 1, width) + #0 end else s := InputString + #0; move(s[1], Dialog^[SEGMENTS].ob_spec.str^, length(s)); objc_draw(Dialog, DISPLAY, $7FFF, 0, 0, 0, 0) end; { Show the help screens } procedure ShowHelp; var ScreenIndex : 1..2; { screen 1 or 2 is being shown } Choice : Integer; { OK, MORE or BACK selected } Dialog : Tree_Ptr; { the current help screen dialog tree } x, y, w, h : Integer; { its x,y,w,h } function TestWidth : boolean; { can't show help in low res. } var w1, w2 : integer; a : Tree_Ptr; s : string; begin rsrc_gaddr(R_TREE, HELPSCR1, a); { get screen 1's width } w1 := a^[0].ob_w; rsrc_gaddr(R_TREE, HELPSCR2, a); { and screen 2's width } w2 := a^[0].ob_w; if (w1 >= Xres) or (w2 >= Xres) then begin { if larger than screen : } TestWidth := FALSE; s := '[3][|MyCalc can''t show any help |information in this reso- |lution. Try a higher.][ Sorry ]'#0; w1 := form_alert(1, s[1]) end else TestWidth := TRUE end; begin { ShowHelp } if TestWidth then begin { only exec. if screen wide enough } ScreenIndex := 1; { first screen first } repeat if ScreenIndex = 1 { get proper dialog address } then rsrc_gaddr(R_TREE, HELPSCR1, Dialog) else rsrc_gaddr(R_TREE, HELPSCR2, Dialog); form_center(Dialog, x, y, w, h); { center on screen } with Dialog^[0] do begin form_dial(FMD_START, 0, 0, 0, 0, x, y, w, h); form_dial(FMD_GROW, 0, 0, 0, 0, x, y, w, h); objc_draw(Dialog, 0, $7FFF, 0, 0, 0, 0); Choice := form_do(Dialog, 0); form_dial(FMD_SHRINK, 0, 0, 0, 0, x, y, w, h); form_dial(FMD_FINISH, 0, 0, 0, 0, x, y, w, h) end; { deselect the button : } with Dialog^[Choice] do ob_state := ob_state - SELECTED; if ScreenIndex = 1 then ScreenIndex := 2 else ScreenIndex := 1 { MORE and BACK are not needed and hence not used } until ( (ScreenIndex = 1) and (Choice = HELPOK1) ) or ( (ScreenIndex = 2) and (Choice = HELPOK2) ) end end; { Convert from a GEM resource tree index to a char value usable by the RPN unit } function FormChar(index : Integer) : Char; begin case index of ZERO : FormChar := '0'; ONE : FormChar := '1'; TWO : FormChar := '2'; THREE : FormChar := '3'; FOUR : FormChar := '4'; FIVE : FormChar := '5'; SIX : FormChar := '6'; SEVEN : FormChar := '7'; EIGHT : FormChar := '8'; NINE : FormChar := '9'; RADIX : FormChar := '.'; ENTERKEY : FormChar := CR; DELKEY : FormChar := BS; ADDKEY : FormChar := '+'; SUBKEY : FormChar := '-'; MULTKEY : FormChar := '*'; DIVKEY : FormChar := '/'; SWAPKEY : FormChar := ')'; SIGNKEY : FormChar := '(' else FormChar := #0 { bad value } end end; { This is exactly the reverse to FormChar above : Convert from a character to a GEM resource index value } function FormIndex(ch : Char) : Integer; begin case ch of '0' : FormIndex := ZERO; '1' : FormIndex := ONE; '2' : FormIndex := TWO; '3' : FormIndex := THREE; '4' : FormIndex := FOUR; '5' : FormIndex := FIVE; '6' : FormIndex := SIX; '7' : FormIndex := SEVEN; '8' : FormIndex := EIGHT; '9' : FormIndex := NINE; '.' : FormIndex := RADIX; '+' : FormIndex := ADDKEY; '-' : FormIndex := SUBKEY; '*' : FormIndex := MULTKEY; '/' : FormIndex := DIVKEY; '(' : FormIndex := SIGNKEY; ')' : FormIndex := SWAPKEY; CR : FormIndex := ENTERKEY; BS : FormIndex := DELKEY else FormIndex := -1 { bad value } end end; procedure Handle(KBDevent : boolean); var index : Integer; { GEM object index } dummy : Integer; topwindow : Integer; { currently topped window's handle } SetButton : boolean; { TRUE = a mouse button is pressed } begin SetButton := button = 1; { determine if button was pressed } if SetButton then { if so, then wait until it's released } repeat graf_mkstate(x, y, button, kbdstate) until button = 0; { see if it's our window that's on the top : } wind_get(0, WF_TOP, topwindow, dummy, dummy, dummy); { if it isn't then go into wait-state and exit } if (window = -1) or (window <> topwindow) then eventflags := evnt_flag.wait else begin { if a key was pressed then make a GEM object index from it, otherwise determine (via objc_find) at which object the mouse is currently pointing } if KbdEvent then index := FormIndex(chr(lo(key))) else index := objc_find(Dialog, KEYBOARD, $7FFF, x, y); { if the mouse points at the box containing the buttons, then ignore! (if you don't understand why, then try to put a comment around the following line and move the mouse past a button) } if index = KEYBOARD then index := -1; { if the mouse has changed its position : } if (index <> LastSelected) then begin { deselect previously selected object } if LastSelected <> -1 then objc_change(Dialog, LastSelected, 0, 0, 0, 0, 0, NORMAL or SHADOWED, 1); { select the object at which the mouse is pointing } if index <> -1 then objc_change(Dialog, index, 0, 0, 0, 0, 0, SELECTED or SHADOWED, 1); LastSelected := index end; { if, after all the preceeding actions, the we have a legal index and either a pressed key or a pressed mouse button, then see if the choice was the HELP soft-button. If so then show the help screen, else try to make a nice input to the RPN unit (FormChar) and update the display } if (index <> -1) and (SetButton or KBDevent) then begin if index = HELPKEY then ShowHelp else begin CharInput(FormChar(index)); WriteDisplay(InputString = '') end end end end; { This is the GEM pipe message handler. It takes appropriate action when the AES has placed a message in our pipe } Procedure HandleMsg; var x, y, w, h : Integer; { temporary coordinates } begin case Pipe[0] of AC_OPEN : if Pipe[4] = ACC_handle then if window = -1 then OpenWindow else TopWindow; AC_CLOSE : if Pipe[3] = ACC_handle then Window := -1; WM_REDRAW : RedrawWindow; WM_TOPPED : TopWindow; WM_CLOSED : begin if Pipe[3] = Window then CloseWindow; Quit := AppFlag { don't quit if an accessory } end; WM_MOVED : if Pipe[3] = Window then begin wind_get(window, WF_CURRXYWH, x, y, w, h); graf_movebox(w, h, x, y, Pipe[4], Pipe[5]); wind_set(Window, WF_CURRXYWH, Pipe[4], Pipe[5], Pipe[6], Pipe[7]); { update the dialog box' position in accordance with the window's new position } with Dialog^[CALCULAT] do wind_get(window, WF_WORKXYWH, ob_x, ob_y, ob_w, ob_h) end end end; { This is the main loop, where MyCalc waits for something to happen. evnt_multi looks for two different sets of events, depending on the current state of the program. If it is in "wait-state" it only waits for a message via the pipe. In its second, active, state it waits for message events, mouse events and keyboard events. The below defines the state depending on the environment : GEM environment state ------------------------------------------- MyCalc window closed wait window opened and on top active window open, but not on top wait window topped active This scheme is implemented to minimize MyCalc's request for CPU time. If it wasn't you would experience "slow" - sometimes none at all - response to mouse button activations } Procedure EventLoop; var event : Integer; { Coded value containing event flags } begin event := evnt_multi(eventflags, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Pipe, 0, 0, x, y, button, kbdstate, key, clicks); { at this point, something has happened, so we tell GEM that we're updating the screen (disregarding the fact that we just might not after all) } wind_update(BEG_UPDATE); { determine which events had happned. By using an if...then...else if... structure like the below, only one type of (perhaps concurrent) events are allowed to influence MyCalc. Furthermore, this implements a priority scheme in which ordinary messages (MU_MESAG) are at the highest level, after which we look at the keyboard (MU_KEYBD) and finally at the mouse (MU_BUTTON) } if (event and MU_MESAG) <> 0 then HandleMsg else if (event and MU_KEYBD) <> 0 then if key = Esc then begin Quit := AppFlag; CloseWindow end else Handle(TRUE) { TRUE = keyboard event } else if (event and MU_BUTTON) <> 0 then Handle(FALSE); wind_update(END_UPDATE) { done updating } end; { And then to the main program! It inits the some of the global variables and - if the program was started as ACC - tries to install MyCalc. Otherwise the program runs as application, i.e. opens the window, waits for the user to operate, and upon ESC, closes the window and exits } begin { main } Title := ' MyCalc '#0#0; Quit := FALSE; noRSC := FALSE; LastSelected := -1; window := -1; evnt_flag.wait := MU_MESAG; evnt_flag.active := MU_MESAG or MU_KEYBD or MU_BUTTON; Init; if AppFlag then begin { application (.PRG) } LoadRSC; wind_update(BEG_UPDATE); graf_mouse(ARROW, NIL); OpenWindow; wind_update(END_UPDATE); eventflags := evnt_flag.active; repeat EventLoop until Quit; DeInit end else begin { accessory (.ACC) } ACC_handle := menu_register(AES_handle, Title[1]); if ACC_handle > -1 then begin LoadRSC; eventflags := evnt_flag.wait; repeat EventLoop until false end else begin writeln('No accessory slot for MyCalc'); v_clsvwk(VDI_handle); appl_exit end end end. r); Procedure vsm_height(handle, height : Integer); Procedure vsl_width(handle, width : Integer); Procedure vst_height(handle, height: Integer; Var charwidth, charheight, cellwidth, cellheight: Integer); Procedure vst_point(handle, point: Integer;  Var charwidth, charheight, cellwidth, cellheight : Integer); Procedure vst_alignment(handle, horin, vertin : Integer; Var horout, vertout: Integer); {*** RASTER OPS ***} Procedure vro_cpyfm(handle, wrmode: Integer;  Var pxyarray: Array_8;  Var psrcMFDB, pdesMFDB : MFDB); Procedure vrt_cpyfm(handle, wrmode: Integer;  Var pxyarray: Array_8;  Var psrcMFDB, pdesMFDB : MFDB;  Var color_index: Array_2); {*** INPUT FUNCTIONS ***} Procedure vsin_mode(handle, devtype, mode : Integer); Procedure vrq_choice(handle, ch_in : Integer; Var ch_out : Integer); Procedure vsc_form(handle : Integ{------------------------------------------------------------------------- HighSpeed Pascal GEM accessory demo RPN (Reverse Polish Notation) UNIT Copyright (c) 1990 by D-House I All rights reserved Programmed by Martin Eskildsen -------------------------------------------------------------------------} {$R-,S-,D+,F-} unit RPN; INTERFACE const width = 17; { output field width:digits } digits = 5; CR = #13; { Carriage Return } BS = #08; { BackSpace } type real = extended; { define calculator precision } var error : integer; { error code } inputstring : string [width]; { input string } { Enter a char in the input string or react if the char is a command such as '+', '-', CR etc. } procedure CharInput(ch : char); { Return the value of the top of the stack (x register) } function TopOfStack : real; IMPLEMENTATION type stacktype = record { this is our stack } x, y, z, t : real { structure : four regi-} end; { sters } var stack : stacktype; { the stack } lift : boolean; { allow pushes if true } function TopOfStack : real; begin TopOfStack := stack.x end; { Return the value of the x register, and move the y and z registers up : x -> return value y -> x z -> y t is left alone } function Pop : real; begin with stack do begin Pop := x; x := y; y := z; z := t end end; { Push a value onto the stack : z -> t y -> z x -> y value -> x } procedure Push(n : real); begin with stack do begin t := z; z := y; y := x; x := n end end; { Swap the x and y registers, and enable stack lift } procedure SwapXY; var temp : real; begin lift := TRUE; temp := stack.x; stack.x := stack.y; stack.y := temp end; { Add the x and y register } procedure Add; begin Push(Pop + Pop) { first pop gets x reg, second pop gets y reg } end; { Push(y - x) } procedure Sub; begin Push(-Pop + Pop) end; { Push(x * y) } procedure Mult; begin Push(Pop * Pop) end; { Push(y / x) if x <> 0.0. Otherwise return error 1 } procedure Divide; var n : real; begin n := Pop; if n = 0.0 then begin Push(n); Error := 0 end else Push(Pop / n) end; { Insert a character in the input string, or execute command } procedure CharInput(ch : char); { Add the char to the input string, provided it's not full } procedure AddCh; begin if length(InputString) < width then InputString := InputString + ch end; { If the input string is empty, the x register is duplicated (pushed), otherwise the value formed by the string is evaluated and put on the stack } procedure MakeValue; var value : real; errpos : integer; begin if InputString = '' then Push(stack.x) { duplicate } else begin val(InputString, value, errpos); if errpos <> 0 then error := 1 { error 1 should never occur } else begin if lift then Push(value) else stack.x := value; lift := ch <> CR; if not lift then Push(value) end; InputString := '' end end; begin { CharInput } error := -1; case ch of '0'..'9' : AddCh; '.' : if pos('.', inputString) = 0 then AddCh; CR : MakeValue; BS : if length(inputString) > 0 then delete(inputString, Length(InputString), 1) else begin stack.x := 0.0; { clear x reg if input string } lift := FALSE { was empty, else delete char } end else if InputString <> '' then MakeValue; case ch of '(' : push(-Pop); { sign inversion } ')' : SwapXY; '+' : Add; '-' : Sub; '*' : Mult; '/' : Divide end end end; begin { of unit } InputString := ''; error := -1; lift := FALSE; with stack do begin x := 0.0; y := 0.0; z := 0.0; t := 0.0 end end.  Function appl_init : Integer; Initialize application and return application's identification. This call must be made before staring using GEM! See also: GemAES, appl_read, appl_write, appl_find, appl_tplay, appl_trecord, appl_exit =]    * 5  Procedure appl_read(ap_rid, ap_rlength : Integer;  Var ap_rpbuff); Read a number of bytes from the event buffer. ap_rpbuff: event buffer to read from ap_rid: receiving application's id ap_rlength : number of bytes to read See also: GemAES, appl_init, appl_write, appl_find, appl_tplay, appl_trecord, appH$H 8 +/-ENTERSWAPMyCalc HelpMyCalc RPN ver. 1MyCalc - a HighSpeed Pascal accessory exampleThis accessory works like a RPN (Reverse Polish Notation) calculator,much like the Hewlett Packard calculators, i.e. with a four-elementstack. As this is a simple demo, only the simple functions are implemen-ted : Addition, subtraction, multiplication, division, sign inversion,and swapping of the two top elements of the stack. For those unfamiliarwith RPN, a small example to clearify the operation : The calculation of(2+3) / 4 : On a "normal" calculator, you would enter something like :2 + 3 = / 4 = or ( 2 + 3 ) / 4 =In RPN, you enter : 2 ENTER 3 + 4 / (the result is 1.25)For further understanding, please read MYCALC.DOC.OkMore...It should be noted that exponents can't be entered.MyCalc can be used on the keyboard too; these are the keys used :0 1 2 3 4 5 6 7 8 9 . - enter numberEnter - complete number entry/duplicate top element( - sign inversion : [+/-] button) - swap top elements (x and y registers)Backspace - delete last digitThe stack is laid out as follows :t register : its value is only changed when a number is pushedz registery registerx register : the one shown in the displayOkBack...MyCalc is programmed by Martin Eskildsen, October 1990Esc - close the MyCalc window   7 8 9  / 4 5  6   *  2  3   - 0 + 1  . $  (   . 3   ?MQ-EC HRFGH * F q (  = 2  AA 3HJA&C5+=i) "  >      ) 5=8=@6 w/ her the in ev_bmask given keys should be : 0 = released or 1 = pressed in order to generate the event ev_bmb: returned mouse button state ev_bks: keyboard state (CTRL, ALT, etc.) ev_bmx, ev_bmy: mouse position at time of the "click" See also: GemAES, evnt_keybd,.  .. STPASCALDOC  EASYGRAFPAS f LIBMAKERPAS aUTILUNITPAS H LIBMAKERTTP BIOS UNI 1CRT UNI 1<DOS UNI 1"EASYGRAFUNI 1GEMAES UNI 1BHGEMDECL UNI 1 GEMVDI UNI 1~_GRAPH UNI 1rPRINTER UNI 1STPASCALUNI 1UTILUNITUNI HKDEMOGRAPUNI 7yuV DEMOINTEUNI yuYDEMOMENUUNI yu^HDEMOWINDUNI yu`GEMINTERUNI f STPASCAL.DOC - information about the usage of the ST Pascal unit 1. Introduction --------------- The ST Pascal unit (STPASCAL.UNI) implements a large set of constants, variables, types, functions and procedures found in the ST Pascal libraries PASLIB, PASGEM and PASTRIX. They are included in the MAXON Pascal package for your benefit, so that you won't have to waste too much time rewriting your ST Pascal applications for the MAXON Pascal. We shall in the following show what a typical ST Pascal program rewrite implies. For a complete listing of the unit's interface section, please consult the on-line help. NOTE : Although the greatest possible effort has been made to ensure that the unit operates exactly as the original ST Pascal libraries, we can not guarantee that all converted programs will behave exactly as they do with the ST Pascal. If you are experiencing trouble, please send us a note describing the problem - if possible with a listing too - so that we can update the unit. 2. How to rewrite an ST Pascal program -------------------------------------- In order to rewrite an ST Pascal program two steps have to be performed: 1. Correcting strictly compiler related issues 2. Removing the $I files and incorporate the STPASCAL unit 2.1. Compiler related changes ----------------------------- The steps are : 1. Rewrite Shl and Shr expressions : An ST Pascal statement like this : i := Shl(2,4) must be rewritten like this : i := 2 Shl 4 or into : i := ST_Shl(2,4) 2. Rewrite all LOOP..END statements 3. Change compiler options where required; modules require quite a lot of rewriting (splitting 'em up into INTERFACEs and IMPLEMENTATIONs etc.) 4. See what you can do with the special directives BIOS, XBIOS, GEMDOS etc... Quite a few of 'em can be found in other MAXON Pascal units such as the DOS unit. 5. Change calls to IO_Check to the corresponding {$I+} and {$I-} directives 6. The ST Pascal implements a file system based on the original Wirth philosophy of PUTting and GETting - from a system programmer's view a quite logical way, but a bit more tricky to deal with when it comes to formatted output etc. Therefore, MAXON Pascal implements the nowadays most commonly used method of READing and WRITEing. The actual code rewrite to perform isn't very difficult; it merely involves this : All references to a file pointer (say, f^) will have to be changed into a variable holding the file pointer's value. After that, all PUTs must be changed into WRITEs of the previously mentioned variable and all GETs will have to be changed into the corresponding READs : ST Pascal : MAXON Pascal : --------------------------------------------------- VAR f : FILE OF Integer; VAR f : FILE OF Integer; i : Integer; ... ... Rewrite(f, 'JUNK.TMP'); Rewrite(f, 'JUNK.TMP'); f^ := 1234; i := 1234; Put(f); { write 1234 to file } Write(f, i { or 1234 } ); Reset(f); Reset(f); WriteLn(f^); Read(f, i); Get(f); WriteLn(i); Close(f); Close(f); Erase(f); { <-- note this --> } Erase('JUNK.TMP'); 7. The ST Pascal ReadV and WriteV procedures do not exist as the Turbo Pascal procedures Str and Val were inherited, so they require rewriting too - but that's a really simple one : ST Pascal : MAXON Pascal : --------------------------------------------------- VAR s : String; VAR s : String; r : Real; r : Real; dummy : Integer; BEGIN BEGIN s := '123.45'; s := '123.45'; ReadV(s, r); Val(s, r, dummy); r := 54.321; r := 54.321; WriteV(s, r); Str(r, s); To sum it up : Changing ReadV into Val and adding a dummy parameter and changing WriteV into Str and swapping parameters. 6. Try to compile and fix whatever else you come across (shouldn't be much, though) 2.2. Incorporating the STPASCAL unit ------------------------------------ First of all, you have to remove the following $Include directives (if they exist) : {$I GEMCONST} {$I GEMTYPE} {$I GEMSUBS} {$I TRIXCONS} {$I TRIXTYPE} {$I TRIXSUBS} Then, after the PROGRAM heading, you include the following line : USES STPascal; A final warning is in order : Not everything in PASTRIX is implemented, so you'll perhaps need to declare a bit of things on your own. As a final example, we give the "before" and "after" header of a program : Before : -------- PROGRAM MyProg; CONST {$I GEMCONST} MyConst = 0; TYPE {$I GEMTYPE} MyType = (hello, good_bye); {$I GEMSUBS} PROCEDURE MyProc; ... After : ------- PROGRAM MyProg; USES STPascal; CONST MyConst = 0; TYPE MyType = (hello, good_bye); PROCEDURE MyProc; ... 3. Implementation notes ------------------------- The following restrictions exist in the current implementation : * IO_Result return codes don't correspond to those documented in the ST Pascal manual as the original function, together with IO_Check, are tightly interfaced with the ST Pascal runtime section. Instead, IO_Result returns exactly the same error codes as the MAXON Pascal IOResult. * There is a limitation on the number of menus a program can have. In total, 20 menus with 20 titles each are available. If you create more of either, the program will abort. 3.1. New since version 1.0 -------------------------- Put_Screen, Get_Screen, Read_Screen, Write_Screen, ST_Shl, ST_Shr and associated types, constants etc. c_add, objc_draw, objc_find, objc_offset, objc_order, objc_edit, objc_change 3  * 5   " Procedure objc_draw(ob_dtree: Pointer;  ob_drstartob, ob_drdepth,  ob_drxclip, ob_dryclip,  ob_drwclip, ob_drhclip: Integer); Draw part or whole of a tree, possibly clipped. ob_dtree: object tree ob_drstartob : index of starting object ob_drdepth: levels to be drawn ob_drxclip: clipping rectangle x ob_dryclip: y ob_drwclip: width ob_drhclip: height See also: GemAES, objc_add, objc_delete, objc_find, objc_offset, objc_order, objc_edit, objc_change c  * 5   " Function objc_find(ob_ftree: Pointer; ob_fstartob, ob_fdepth, ob_fmx, ob_fmy: Integer) : Integer; Determine, if an element of a given object tree is at the given coordinate. Mainly used for mouse selection. ob_ftree: object tree to check ob_fstartob: object index from where to start search ob_fdepth: levels to search ob_fmx, ob_fmy: coordinate to check Return value : -1 = no objec{$D+} UNIT EasyGraf; { Filename: EasyGraf.pas } { Coder : Jacob V. Pedersen } { Coded : 1-8-1990 } { Purpose : Example } { This unit contains code which makes it easy to draw lines ect. } { It is used by the examples in the \GRAFDEMO directory. } INTERFACE {$F+,D-,R-,S-} Uses GemDecl, GemAES, GemVDI; Var ActiveHandle, { Handle to graphics screen } MaxColor, { Max. color index } MinX, { Minimum and Maximum } MinY, { coordinates } MaxX, MaxY : Integer; WorkOut : WorkOut_array; { Various defaults } Procedure InitGraphics; Procedure DeInitGraphics; Procedure Line( X1,Y1, X2,Y2 : Integer ); Procedure LineColor( col : Integer ); Procedure ClearDevice; Procedure SetClipping( X1,Y1,X2,Y2 : Integer ); Procedure Box(x1,y1,x2,y2 : Integer ); IMPLEMENTATION {$F+,D-,R-,S-} Procedure InitGraphics; Var D: Integer; WorkIn: IntIn_array; Begin d:=Appl_Init; Activehandle := graf_handle(d,d,d,d); For D := 0 to 9 DO WorkIn[D] := 1; WorkIn[10] := 2; WorkIn[11] := 0; v_opnvwk(WorkIn,ActiveHandle,WorkOut); { Open virtual station } MaxX := WorkOut[0]; MaxY := WorkOut[1]; MaxColor := WorkOut[13]-1; MinX := 0; MinY := 0; SetClipping( MinX, MinY, MaxX, MaxY ); End; { InitGraphics } Procedure DeInitGraphics; Begin v_clsvwk(ActiveHandle); { Close virtual station } Appl_Exit; End; { DeInitGraphics } Procedure SetClipping( X1,Y1,X2,Y2 : Integer ); Var Points : Array_4; Begin Points[0] := X1; Points[1] := y1; Points[2] := x2; Points[3] := y2; vs_clip( ActiveHandle, 1, Points ); End; { SetClipping } Procedure ClearDevice; Begin v_clrwk( ActiveHandle ); End; { ClearDevice } Procedure LineColor( col : Integer ); Begin vsl_color( ActiveHandle, Col ); End; { LineColor } Procedure Line( X1,Y1, X2,Y2 : Integer ); Var PntArray : PtSin_Array; Begin PntArray[0] := X1; PntArray[1] := Y1; PntArray[2] := X2; PntArray[3] := Y2; v_pline( ActiveHandle, 2, PntArray) End; { Line } Procedure Box(x1,y1,x2,y2 : Integer ); Begin Line(x1,y1,x2,y1); Line(x2,y1,x2,y2); Line(x2,y2,x1,y2); Line(x1,y2,x1,y1); End; { Box } END. See also: GemAES, objc_add, objc_delete, objc_draw, objc_find, objc_offset, objc_order, objc_edit [    * 6 Function form_do(fo_dotree: Pointer; fo_dostartob : Integer) : Integer; Let the AES handle user input via a dialog box. fo_dotree: dialog box object tree fo_dostartob : starting text input field or 0 Return value : index of object that terminated input (e.g. OK button etc.) See also: GemAES, form_dial, form_alert, form_error, form_center w  ( 4 Procedure form_dial(fo_diflag, fo_dilx,  fo_dily, fo_dilw,  fo_dilh, fo_dibigx,  fo_dibigy, fo_dibigw,  fo_dibigh: Integer); Dialog form handling. Cont{ LibMaker merges named UNI files together into one big LIB file. The file PASCAL.LIB is the only one known by the commandline compiler. The integrated compiler can use a LIB with any name put into the dialog. Compile this program to LIBMAKER.PRG. } { 1990 Christen Fihl } {$I-,M 10,1,1,20} Program LibMaker; Uses DOS; var F_Lib,F_Tpu: File; fhead: record name: packed array[1..4] of char; count: integer end; procedure AddUNItoLIB(S: String); var s2: string; m,n: integer; B: packed array[1..4096] of byte; head: record name: string[8]; len: longint; DateTime: longint end; begin s2:=s; while pos(':',s)+pos('\',s)>0 do delete(s,1,1); if pos('.',s2)=0 then s2:=s2+'.Uni'; writeln('From file: ',s2,'. unit= ',s); reset(F_Tpu,s2); if IOResult<>0 then begin writeln('cannot open file'); halt end; inc(fhead.count); while pos('.',s)>0 do delete(s,length(s),1); with head do begin name:=s; len:=fileSize(F_Tpu); DateTime:=-1; blockwrite(F_Lib,name,10+4+4); repeat blockread(F_Tpu,B,SizeOf(B),n); blockwrite(F_Lib,B,n,m); until m=0; end; close(F_Tpu); end; procedure CloseLIB; begin seek(F_Lib,4); blockwrite(F_Lib,fhead.count,2); close(F_Lib); if IOResult=0 then writeln('Ok') else writeln('Bad'); end; { Main program } var Index: Integer; s: string; begin if ParamCount<2 then begin writeln('LibMaker: Merges .UNI files together into one .LIB file'); writeln('LibMaker syntax:'); writeln('LibMaker file1 file2 ... fileN NewLib'); halt(99); end; s:=ParamStr(ParamCount); if pos('.',s)=0 then s:=s+'.Lib'; Erase(S); rewrite(F_Lib,s); if IOResult<>0 then begin writeln('cannot create file: ',s); halt end; writeln('To file: ',s); with fhead do begin name:='Uni1'; count:=0; blockwrite(F_Lib,name,4+2); {2 = space for Count} end; for Index:=1 to ParamCount-1 do {Add all UNITs listed on command line} AddUNItoLIB(ParamStr(Index)); CloseLIB end. er left corner fo_cw, fo_ch : width and height See also: GemAES, form_do, form_dial, form_alert, form_error f   ! /   * 9   Procedure graf_rubbox(gr_rx, gr_ry, gr_rminwidth, gr_rminheight : Integer; VAR gr_rlastwidth, gr_rlastheight: Integer); Draw a "rubber box". The upper left corner is set (used on the GEM desktop to select more than one file). graf_rubbox must be called with the mouse button pressed, as the procedure is ended when the user releases the button. gr_rx: upper left corner x of rectangle gr_ry: upper left corner y of rectangle gr_rminwidth: smallest allowed width of rectangle gr_rminheight: smallest allowed height of rectangle gr_rlastwidth: final width of rectangle gr_rlastheight : final height of rectangle See also: GemAES, graf_dragbox, graf_movebox, graf_growbox, graf_shrinkbox, graf_watchbox, graf_slidebox, graf_handle, graf_mouse, graf_mkstat{$D+} UNIT UtilUnit; { Filename: UtilUnit.pas } { Coder : Jacob V. Pedersen } { Coded : 06-02-1991 } { Purpose : Example } { This unit contains some routines that might come in handy. } { Changes in version 1.1: For an example of how to use the new Inline Assembler, take a look at the HZ200 function. The Exist function shows how to use Assign as in Turbo Pascal. } INTERFACE Uses DOS; Const Version = 1.1; Var StrIn : Text; { Read } StrOut : Text; { Write } StrData : String; { IO buffer for StrIn and StrOut } Function Int2Str(Num : Integer) : String; Function Exist(Filename : PathStr) : Boolean; Procedure WaitToGo(KeyVal : Byte); Function NoSpaces(S : String) : String; Function UpperStr(S : String) : String; Procedure ClearStrInOut; Function HZ200 : LongInt; IMPLEMENTATION Function HZ200 : LongInt; ASSEMBLER; ASM CLR.L -(SP) { Enter SuperVisor mode } MOVE.W #$20,-(SP) TRAP #1 MOVE.L $4BA,@result { Get long-word containing HZ200 counter } MOVE.L D0,2(SP) { Exit SuperVisor mode } TRAP #1 ADDQ.W #6,SP { Cleanup stack } END; Function Exist(Filename : PathStr) : Boolean; Var Dummy : File; IOres : Integer; Begin Assign(Dummy,FileName); {$I-} Reset(Dummy); {$I+} IOres := IOresult; If (IOres = 0) then Close(Dummy); Exist := IOres = 0; End; Function Int2Str(Num : Integer) : String; Var Res : String; Begin Str(Num, Res); Int2Str := Res; End; Procedure WaitToGo(KeyVal : Byte); Begin Repeat Until (ReadKey = Chr(KeyVal)); End; Function NoSpaces(S : String) : String; Begin While (Pos(#32,S) > 0) Do Delete(S,Pos(#32,S),1); NoSpaces := S; End; Function UpperStr(S : String) : String; Var X : Byte; Begin For X := 1 To Length(S) Do S[X] := UpCase(S[X]); UpperStr := S; End; Procedure ClearStrInOut; Begin While Not(Eof(StrIn)) Do ReadLn(StrIn); End; Procedure StrInOutHandler(Var F : TextRec); Var Tmp : String; Begin With F Do Begin If fInpFlag then Begin { read } Move(StrData[1],fBufPtr^[0],Length(StrData)); fBufEnd := Length(StrData); StrData := ''; End Else Begin { write } Move(fBufPtr^[0],Tmp[1],fBufPos); Tmp[0] := Chr(fBufPos); Insert(Tmp,StrData,Length(StrData)+1); End; fBufPos := 0; End; End; Var DevBuf : TDevBuf; BEGIN Device('StrInOut',@StrInOutHandler,DevBuf); Assign(StrIn,'StrInOut'); Reset(StrIn); Assign(StrOut,'StrInOut'); Rewrite(StrOut); END.orner coordinates of large box gr_sstwidth: width gr_sstheight: height gr_sfinx, gr_sfiny: upper left corner coordinates of small box gr_sfinwidth: width gr_sfinheight : height Se`-`(PXXXX kf o*HWDLԁ.BNvN4NBgN NNVH/.Hn?<NHnHn?<NHzHnN0HzHn&N_JCoHn?<?<N`HzHnN0J@f0HnHnNHzdHnN:HnHn?<NHy(HzDBgNHnBgNHz8BgNHnBgNNHyHn?<NN 0J@g"Hy(HzBgNNBgN RyHzHnN0J@oHnp.??<N`HnHn?<NHyN-_-|HyHn?<BNHyHn?<HnNHyHn?.HnNJnfHyNJ&N^.Nu:\..Uni From file: . unit= cannot open file NNVNqNqHyHxNHyHy?<BNHyNJN 0J@fHy(Hz0BgNN`Hy(HzBgNNN^NuOkBadNNVHUN0 @lTHy(HzBgNNHy(HzBgNNHy(HzBgNN?<cN HnUN0N?NXHnHy?<NHzHyN0J@f4HyHnNHzHnN:HnHy?<NHyNHyHy?<NN 0J@g0Hy(HzRBgNHyBgNNBgN Hy(Hz:BgNHyBgNNG&Uni1BkHyHS?<BNUN0S@rAmJ3=@`RyHn09N?NXHnNJ09ڰnfNrLN^Nu7LibMaker: Merges .UNI files together into one .LIB fileLibMaker syntax: %LibMaker file1 file2 ... fileN NewLib..Lib cannot create file: To file: NqNqNVU y@HhNh=_N^NuNqNqNVUN0._oHzB/. ?<N 8`*Hn?. y@HhNPXHn/. ?<N N^ _TN LpB1BWagRWafN  bJ!NuJg  cSINu#"_0 WBrB1ag S@gaf`pg< c R@` yNNqNqNV?<N?.N~N^ _TNNVHBn &nJgBk?<eNUN.=_0. @f*JkoSk?<DN?< N"?<DN` ?.N nVD nVDg0+2."k Rk n WD nWD2+kWDgf?<fN `>0+S@rAm0=A=@`Rn0.r k 0?N|0.nfBkLN^.Nu#H?NATL/9Nup a|@Nupa|?@NuAp  Qg pa|?@Nu _BpaTONNqNqNVHz2HzrNHyHz ?<NbHy(Hz?<NXN^Nu ConDevice(_<#@LDAH~#PJ9aFAuaTA|tJgaXHtaBaNuHz?<&NN\ONuxp<0<:m^a"QNuHQO ON OaPONuga`H ?/<NM\OLNuBaF#^3\.yL yXBX oN`?9\?<LNAAH x2| hg"h$#fNup98tg xp4Ug p5Sgp6 xα@d yb$f y@|?/``p7 o`Apa,#jA0<a#nNu yjpa yn0</??<NMPONu Runtime error: at offset: ????. Not enough space for heap Accessory error"op a& g  H#H pQ..Nu/ H/ND" mBHW/Np _"_Nu3?:` _?9:By:NJy:fNu _?9:/N NV/ Car"_BgJ)gTWHnp=aFdJ)gBy:Bopa TBQBiNu _?HrNALrTJj 3:DNpa,Jg.a$/</<?)p?a k 9fpratNu)<g 3<:DNu g 3=:DNu )g 3>:DNup4<` pt`pt"o Jgj I0BX0BBB yH"g4P"o/razatVL"o A Pf A#h` oa~f0)a#H fBQ`2a.e,aD2BJ)g3iJigJ9ga`a _ Nа|am |zn| NuJ)g3iaNuJifH Bg/ iN3:LNu2)if/Jfa$`a:e3@Bi _Nu??)/pBa$PONu/) ?)Bg?)p@a Nu/) ?)Bg?)p?a Nup?`QBNu2)ifN JifDNu/ "i 1"_NutN e0ae,< bRi`ae< cRi|PgRBN |`BNu _"WN eae Ri|?NBgNLtN eafe< gRi|gRB `.NuL/N e a4eRi< fa$e < fRiNu2)/ "i "_RA3AifN NutpN e"?@o SBp aQ4`aQN Nu4/"oApa _XONL4/a _\NL/A` L/A` t` t`t`t _"_BgJg$a^eg< gg< bRi`RN4<`t"o Jg I0BX0BBB oN gBQ`N re2N _ N"o)<fN .NuA`A "oN re#o 3iNeig3@: _XONA`A "oN re,#o 0/?)3@3@N3_"/g A0By: _NLN re 2)a4rN _PON"oa^2)a*/@Nu"oaL 2)a/@Nu$HBHBBBЂNu Ctv BAdAрQ&FNu"oaWD _XNN re*prN /prN / /rN "NuprNuNV n CN( n"ON(HWHnBgpVN N^ _PONNV n"ON(HWpAN N^.NuLpH0Q _PN"0 _"_/c)`QNu""_ _/prdPF`QNu$02 _"_/tJAnrBnARBJ@oBo0S@QNuBNuH0Lprtg gAeSA6$H&I Vg RBRQt?BL  _\NNVHn/. ?<?. SWNbHn/. 0. n??<NbHnHnN:Hn/. ?<NN^ _PN"_  _#DB P rҀ| kHp Pr N /gF^| yD" "H Xb If"i`Jk""#hÉ#A"o"BB _PON?<8//N / L^|"Q yDb`@ hbJk2#h"Ef #j ё!I$Hеf !i ѐ$_ _PN yDpИ PdR"W.N yDp` hd" j"W.N#b"yf gNp: yb`2 _#b"PCPbp2` _mo` _XmXop3?/N JlD-C"r \Y"gt/RlЁ`BNu;B@'d 2  B                J\:>$@"", V2(, " |   04   zP".$2F$    .p   6HT ( button } ; A few "tricks" are used above : First of all, the length of the path string is set to 255 (path[0] := #255) so that the Pos function used below doesn't all of a sudden stops working in the middle of the path string because it believes that the string has an (undefined) length. With a such string length of 255 chars, Pos is guaranteed to find the #00 string terminator, which is used for determining the length of the string. After that, the search pattern is stripped off (e.g.UNI2 jOhNh*phh~ $ R P  D l  F : : >r *   , x nBIOS NDMAREAD6^RRLF@DMAWRITE 6&(R NVMACCESS66RBCONMAP6 fD ESETSHIFT6 R~ EGETSHIFT6l`ESETBANK 6 Ln@ ESETCOLOR6 &| ESETPALETTEDR` EGETPALETTEDRESETGRAY 6  ESETSMEAR6 l`INITMOUS Df:f4.SSBRK6 f PHYSBASE 6fLOGBASE6fGETREZ 6 SETSCREENDff~ SETPALETTE D fVSETCOLOR 6 <$0*FLOPRD 62ffFLOPWR 6@ffFLOPFMT6 N vpjd^XRfLfFMIDIWS D\f"MFPINT DjfIOREC6 fxjKEYTBL 6ffff@X_RANDOM 6*PROTOBTD\VPfJ>FLOPVER62& ffSCRDMP DCURSCONF 6 XSETTIME D XGETTIME 6xBIOSKEYS DIKBDWS Df.(JDISINTD JENABINT D  GIACCESS 6 .RSCONF 6<|vpOFFGIBIT D JJONGIBITD X&DXBTIMERDffDOSOUNDD tf SETPRT 6 KBDVBASE 6fKBRATE 6 pd^PRTBLK D f:VSYNCDSUPEXECD fPUNTAESD GETMPB D fBCONSTAT 6  BCONIN 6 znBCONOUTD JDRWABS6."f SETEXC 6f*fTICKCAL68GETBPB 6 fF@BCOSTAT6 TzMEDIACH6 bbVDRVMAP 6>pKBSHIFT6 ~E_OK \ERROR\"EDRVNR \EUNCMD \E_CRC\$EBADRG \E_SEEK \EMEDIA \|ESECNF \hEPAPER \TEWRITEF\@EREADF \,0EWRPRO \E_CHNG \EUNDEV \`EBADSF \EOTHER \$BSystemOSystem2 Bios d,dDMAREADDMAWRITENVMACCESBCONMAPESETSHIFEGETSHIFESETBANKESETCOLOESETPALEEGETPALEESETGRAYESETSMEAINITMOUS(SSBRK4PHYSBASE@LOGBASELGETREZXSETSCREEdSETPALETpSETCOLOR|FLOPRDFLOPWRFLOPFMTMIDIWSMFPINTIORECKEYTBLX_RANDOMPROTOBTFLOPVERSCRDMP CURSCONFXSETTIME$XGETTIME0BIOSKEYS<IKBDWSHJDISINTTJENABINT`GIACCESSRSCONFlOFFGIBITxONGIBITXBTIMERDOSOUNDSETPRTKBDVBASEKBRATEPRTBLKVSYNCSUPEXECPUNTAESGETMPBBCONSTATBCONINBCONOUT RWABS,SETEXC8TICKCALDGETBPBPBCOSTAT\MEDIACHhDRVMAPtKBSHIFT,(,6,DR`n|""("4@LXd$p$|28@8N@\jx<4((8 $0<HT `.lJxXf(t ,0*8 8DFPT\bhpt~NV?./.?. /.?<*NN-@N^ _O NNV?./.?. /.?<+NN-@N^ _O NNV/.?. ?. ?.?<.NN =@N^ _O NNV?.?<,NNXO-@ N^ _TNNV?.?<PNNXO=@ N^ _TNNV?<QNNTO=@N^NuNV?.?<RNNXO=@ N^ _TNNV?. ?.?<SNN\O=@ N^.NuNV/. ?. ?.?<TNN N^ _PNNV/. ?. ?.?<UNN N^ _PNNV?.?<VNNXO=@ N^ _TNNV?.?<WNNXO=@ N^ _TNNV/./. ?.BgNN N^ _O NNV?.?<NNXO-@ N^ _TNNV?<NNTO-@N^NuNV?<NNTO-@N^NuNV?<NNTO=@N^NuNV?./. /.?<NN N^ _O NNV/.?<NN\ON^.NuNV?. ?.?<NN\O=@ N^.NuNV?.?.?.?.?./. /.?<NN=@N^ _ONNV?.?.?.?.?./. /.?< NN=@N^ _ONNV?./.?.?.?.?.?./. /.?< NN=@ N^ _ONNV/. ?.?< NNPON^ _\NNV/. ?.?< NNPON^ _\NNV?.?<NNXO-@ N^ _TNNV?.?.?.?. ?. ?.?<NN-@N^ _O NNV/./. /.?<NN-@N^ _O NNV?<NNTO-@N^NuNV?.?./. /.?<NNN^ _O NNV?.?.?.?.?./. /.?<NN-@N^ _ONNV?<NNTON^NuNV?. ?.?<NN\O=@ N^.NuNV/.?<NN\ON^.NuNV?<NNTO-@N^NuNV?<NNTON^NuNV/. ?.?<NNPON^ _\NNV?.?<NNXON^ _TNNV?.?<NNXON^ _TNNV?. ?.?<NN\O=@ N^.NuNV?.?<NNXON^ _TNNV?.?<NNXON^ _TNNV/.?. ?. ?.?<NN N^ _O NNV/.?< NN\ON^.NuNV?.?<!NNXO=@ N^ _TNNV?<"NNTO-@N^NuNV?. ?.?<#NN\O=@ N^.NuNV?<$NN\ON^.NuNV?<%NNTON^NuNV/.?<&NN\ON^.NuNV>|'NNTON^NuNV/.BgNM\ON^.NuNV?.?<NMXO?N^ _TNNV?.?<NMXO-@ N^ _TNNV?. ?.?<NM\ON^.NuNV?.?.?./. ?.?<NM-@N^ _O NNV/. ?.?<NMPO-@N^ _\NNV?<NMTO-@N^NuNV?.?<NMXO-@ N^ _TNNV?.?<NMXO-@ N^ _TNNV?.?< NMXO-@ N^ _TNNV?< NMTO-@N^NuNV?.?< NMXO-@ N^ _TNate 1BEG_UPDATEbegin window update 2END_MCTRLend mouse control 3BEG_MCTRLbegin mouse control The term "update" covers an application's wish to be let alone while it's reconstructing the screen area, whereas "mouse con- trol" is the way of saying to the AES, that the user controls, what's going on. See also: GemAES, wind_create, wind_opUNI2|!0t(W!pz~4CRTN$W!BSystemOSystem2 Crtd,anymore} wind_update(BEG_MCTRL);{ allow the AES to handle mouse } { actions again} Yl    + 7    * 7Procedure wind_calc(wi_ctype, wi_ckind,  wi_cx, wi_cy,  wi_cinwidth, wi_cinheight: Integer;  VAR wi_coutx, wi_couty, wi_coutwidth, wi_coutheight : Integer); Calculate window size. As a window can be viewed at as consisting of two rectangles, the border rectangle and the work rectangle, and as an intimate relation- ship between these two sizes exists, it is possible to calculate the one rectangle if the second is known together with the border elements. wi_ctype: type of operation : valueCONSTcalculates 0WC_BORDERborder rectangle 1WC_WORKwork aUNI2 lI* ^(]p**~,T2  X $ HT ( |:zf D DOSNEINVFN \fEFILNF \REPTHNF \>ENHNDL \*EACCDN \EIHNDL \ENSMEM \EIMBA\EDRIVE \ENSAME \ENMFIL \ERANGE \EINTRN \xEPLFMT \dEGSBF\RREADONLY \<HIDDEN \(SYSFILE\VOLUMEID \^ DIRECTORY\ARCHIVE\ ANYFILE\?COMSTR ]PATHSTR]PODIRSTR ] \DCNAMESTR]08 EXTSTR ]TC_STR]  v SEARCHREC]rjRESERVED Q vl`ATTR QNTIME Q:SIZE Q&NAME Q ^  .DATETIME ]hT>*YEAR QMONTHQDAYQHOUR QMINQnSECQ \ JDOSERROR Q0 TOSVERSION 6ENVCOUNT 6(ENVSTR 6 6GETENV 6 D GETVERIFYD R SETVERIFYD `\ PARAMCOUNT 6@nPARAMSTR 6 |PACKTIME D UNPACKTIME D FINDFIRSTDrbFINDNEXT D rZSETFATTR D46JGETFATTR D 0GETDIR D ~CHDIRD  MKDIRD  RMDIRD  rDSETFTIME DRTNGETFTIME D$R("FSPLIT D2 0TFEXPAND6 @DISKSIZE 6 NDISKFREE 6 \|GETDATEDjXRLFzSETDATEDx"GETTIMEDSETTIMEDSETDRIVE D RGETDRIVE 6jSUPER6 fNfBEXEC D SWAPVECTORSD:MALLOC 6 fMFREED fMSHRINKDf$]BSystemOSystem2 Dos X.TOSVERSIDENVCOUNTPENVSTR\GETENVGETVERIFSETVERIFPARAMCOUPARAMSTRPACKTIMEUNPACKTIFINDFIRS FINDNEXTSETFATTR"GETFATTR:GETDIRFCHDIRRMKDIR^RMDIRSETFTIMEGETFTIMEdFSPLIT`FEXPANDlDISKSIZExDISKFREEGETDATESETDATEGETTIMESETTIMESETDRIVEGETDRIVESUPEREXECSWAPVECTMALLOCMFREEMSHRINK  V:<:,T$TF` @l Nx,\,jx2B0bHd 44&N(NINE@hRhITZFDELAt WR|@*TO2v0J848BB*DD(P 6\8Dv0vh AR<`2,NAPn |^>4 `8"B.D:FfR2^2x2xrj, $T2, (,P$ ddd,ddddd .d8d&<ddd &d0d&4ddFdFddFdF ldld*.l|l|d(@d6Rl|^lll|l|dd0dddh$d ld dn&l|6l@dRl|4d(dl|"d,2d@BdRl|dZd.l|l|"d,4dl|"d,4dd:dt\dl|"d,*dl|"d,*dl|"d,*d dFdjdjvl|~dll|l|l|ll*l:l|Rlbl|vl|l|lldl|&l|6d,FddFdFNV"n Jf "n nS @c0<`QN^ _PNNV"n n p`QBN^ _PNNVJ@m By` 3B@N^NuNV8HGI8*L/./ N n m :gU?<NATOAa: \g&@H?/ ?<GNAPOJ@kJf|\f(Mg \g at` ,.f: ,\fU`* ,.f ,\fW ,:g $\fJf ,:f\BHn8/. NL8` @am @zn@ NuN^.NuNV?.Hn?<6NAPO .-@ N^ _TNNV?.Hn?<6NAPO .-@ N^ _TNNV?<*NATO24@ n 0IA n0JJB n0a`L/BBl6B@A(0HBJf nSCHC n0&NuN^ _ONNV2. AII02. IA2.A??<+NAXON^ _\NNV?<,NATO""nBQ@@"n 2 H@?"n2p i"n2N^ _ONNV2.II02. IA2. IA??<-NAXON^ _PNNV?.?<NAXON^ _TNNV?<NATO=@N^NuNV/.?< NA\O-@ N^.NuNV0. 2@"n20H@?"n 2p i"n20."2@"n20H@"n2p iA"n2N^ _ONNV n0.HH2.IA2. IA00.@HH2.IA2.A0N^ _ONNV?</NATO#N^NuNV y"H,.p QB@ 1@N^NuNV#N/.?<NA\O?./. ?<NNAPO3nN/9?<NA\ON^ _O NNV#N/.?<NA\O?<ONATO3nN/9?<NA\ON^.NuNV?. /.?<GNAPONN^ _\NNV/.?<;NA\ONN^.NuNV/.?<9NA\O3N^.NuNV/.?<:NA\ONN^.NuNV?.?. /.?<CNA N=@N^ _PNNV"n0. nBrB1a@gNS@ga&f`=@=A`Sn0.r n0 \f =n `0.nfBn N^.NuNqNqNV/.Hn?<ONU/N=_Jno*HnHn?<?.NHn/.?<CN`4p. @fHn/.?<CN`Hz/.?<CNHn?<p n?NHzHnN=_JnoVHnHn?<0.S@?NHn/. ?<NHnHn?.p.?NHn/.?<N`"Hn/. ?<NHz/.?<NN^ _ON .NV/9?<?<NMP/9?<?<NMPN^NuNV/./. /.Bg?<KNA3N^ _O NNqNqNV,/. Hn?<ON/.Hn0?<NB,HnHn0NHn,Hn0Hn0NN^ _PNNV/.?<HNA\O-@ N^.NuNV/.?<INA\ONN^.NuNV/./. Bg?<JNA NN^ _PNocedure v_opnwk(WorkIn: intin_Array; VAR handle: Integer; VAR WorkOut : workout_Array); Open workstation (load device drivers). WorkIn specifies what the workstation should look like, handle is the workstation handle, whereas WorkOut returns what the workstation does look like. Note : This procedure is not properly implemented on all ST-GEM versions and tend to crash system if used. This is due to the ST's missing device drivers for plotters, graphics tablets etc. WorkIn: input parameters haUNI2SS~ad _Q  OpP@ORa|Q Q LFS~LlVpj*RvEASYGRAF N ACTIVEHANDLE QTMAXCOLOR Q<MINX Q(MINY QMAXX QMAXY Q WORKOUTQ j INITGRAPHICS DDEINITGRAPHICS D(LINE D6lf`Z LINECOLORD D4 CLEARDEVICEDR SETCLIPPINGD`BOXDnHaBSystemOSystem2GEMDECL&GEMAES0GEMVDI EasyGrafB|ascal |INITGRAPDEINITGRLINELINECOLOCLEARDEVSETCLIPPBOXr(`< R D 6< nh l((lt.dvd|dhddddddddddddd` dh(l|"d0h` dh6 dh"d0hd60d6Fd6\d6NqNqNVUN=_UHnHnHnHnN3pr @m,=@=A`Rn0.HC30.nf=| Bn HnHyHy N3 3 09&S@3ByBy?9?9?9?9 NN^NuNqNqNV?9NNN^NuNqNqNV=n=n =n =n?9?<HnNN^ _PNNqNqNV?9NN^NuNqNqNV?9?.NN^ _TNNqNqNV=n=n =n =n?9?<HnNN^ _PNNqNqNV?.?. ?. ?. N?. ?. ?. ?.N?. ?.?.?.N?.?.?.?. NN^ _PN Update workstation. This procedure is only of interest when using devices such as printers, plotters etc. but not the screen. It flushes the internal output-buffer and thereby makes sure that what the application wrote to the device really is printed. handle : workstation/device See also: GemVDI,UNI2%ǀ~(6ת8&t((~$@P``p#J $j$FDLhz,"R#JL&#t!tt"J""l !H :!#f"GEMAES NMU_KEYBD \` MU_BUTTON\JMU_M1\8MU_M2\&MU_MESAG \MU_TIMER \ K_RSHIFT \bK_LSHIFT \K_CTRL \K_ALT\ MN_SELECTED\ WM_REDRAW\z WM_TOPPED\d WM_CLOSED\N WM_FULLED\8 WM_ARROWED \ WM_HSLID \ WM_VSLID \WM_SIZED \WM_MOVED \ WM_NEWTOP\AC_OPEN\(AC_CLOSE \)P FMD_START\rFMD_GROW \\ FMD_SHRINK \D FMD_FINISH \,R_TREE \R_OBJECT \ R_TEDINFO\ R_ICONBLK\R_BITBLK \R_STRING \ R_IMAGEDATA\R_OBSPEC \| R_TEPTEXT\f R_TEPTMPLT \N R_TEPVALID \6  R_IBPMASK\ R_IBPDATA\ R_IBPTEXT\ R_BIPDATA\R_FRSTR\R_FRIMG\NAME \CLOSER \FULLER \|MOVER\jINFO \XNSIZER\F UPARROW\2@DNARROW\VSLIDE \ LFARROW\ RTARROW\HSLIDE \ WC_BORDER\WC_WORK\xWF_KIND\WF_NAME\|WF_INFO\h WF_WORKXYWH\PF WF_CURRXYWH\8 WF_PREVXYWH\  WF_FULLXYWH\$ WF_HSLIDE\ WF_VSLIDE\ WF_TOP \ p WF_FIRSTXYWH \ ` WF_NEXTXYWH\ WF_RESVD \ WF_NEWDESK \h WF_HSLSIZE \P WF_VSLSIZE \8V WF_SCREEN\" END_UPDATE \ BEG_UPDATE \ END_MCTRL\ BEG_MCTRL\LARROW\ TEXT_CRSR\BUSYBEE\ HOURGLASS\t POINT_HAND \\ FLAT_HAND\F THIN_CROSS \. THICK_CROSS\ OUTLN_CROSS\lUSER_DEF \DM_OFF\M_ON \G_BOX\G_TEXT \ G_BOXTEXT\G_IMAGE\t G_USERDEF\^G_IBOX \JG_BUTTON \4 G_BOXCHAR\fG_STRING \G_FTEXT\ G_FBOXTEXT \G_ICON \LG_TITLE\ NONE \ SELECTABLE \RDEFAULT\vF_EXIT \bhEDITABLE \LRBUTTON\8LASTOB \$  TOUCHEXIT\@HIDETREE \VINDIRECT \bNORMAL \SELECTED \CROSSED\CHECKED\zDISABLED \zOUTLINED \dSHADOWED \N WHITE\<BLACK\*RED\fGREEN\BLUE \CYAN \TYELLOW \MAGENTA\XLWHITE \LBLACK \ LRED \ LGREEN \n LBLUE\\ LCYAN\J LYELLOW\6hLMAGENTA \ ,EDSTART\ EDINIT \EDCHAR \@EDEND\XTE_LEFT\TE_RIGHT \>TE_CNTR\p BACKSPACE\~TAB\n S_DELETE \XS S_INSERT \BR SHIFT_INS\,R0RETURN \ ENTER\r UNDO \aBHELP \bHOME \G(CUR_UP \HCUR_DOWN \PCUR_LEFT \KN CUR_RIGHT\zM, SHIFT_HOME \bG7SHIFT_CU \LH8zSHIFT_CD \6P2.SHIFT_CL \ K4SHIFT_CR \ M6ESC\CTRL_A \CTRL_B \0CTRL_C \.`CTRL_D \ CTRL_E \CTRL_F \!CTRL_G \n"CTRL_H \Z#CTRL_I \F <CTRL_J \2$ CTRL_K \% CTRL_L \ & &CTRL_M \2 CTRL_N \1tCTRL_O \CTRL_P \CTRL_Q \CTRL_R \CTRL_S \~.CTRL_T \jCTRL_U \V CTRL_V \B/`CTRL_W \.RCTRL_X \-$CTRL_Y \,6CTRL_Z \CTRL_1 \0CTRL_2 \CTRL_3 \CTRL_4 \CTRL_5 \&CTRL_6 \zCTRL_7 \fCTRL_8 \R CTRL_9 \> CTRL_0 \* ALT_A\ALT_B\0ALT_C\.ALT_D\ ALT_E\ALT_F\!ALT_G\" ALT_H\# ALT_I\ALT_J\v$ALT_K\d%ALT_L\R&ALT_M\@2dALT_N\.16ALT_O\~ALT_P\ RALT_Q\ALT_R\4ALT_S\ALT_T\ALT_U\ALT_V\/ALT_W\ALT_X\z-ALT_Y\h,ALT_Z\VALT_1\DxALT_2\2ytALT_3\ zALT_4\{~ALT_5\|ALT_6\}ALT_7\~ALT_8\2ALT_9\@ALT_0\F1 \;F2 \<vF3 \r=F4 \b>F5 \R?F6 \B@dF7 \2AF8 \"B F9 \CF10\DSHIFT_F1 \TSHIFT_F2 \USHIFT_F3 \VSHIFT_F4 \WSHIFT_F5 \XSHIFT_F6 \~YSHIFT_F7 \hZSHIFT_F8 \R[SHIFT_F9 \<\ SHIFT_F10\&]CTRL_AE\(CTRL_OE\'CTRL_UE\ALT_AE \(]ALT_OE \'[pALT_UE \@, SH_ALT_AE\(} SH_ALT_OE\'{f SH_ALT_UE\l\bGEMERROR 6P APPL_INIT60( APPL_FIND6 6R APPL_TRECORD 6DR APPL_READDRR APPL_WRITE D`ztRnn APPL_TPLAY DnRF@: APPL_EXITD|L EVNT_KEYBD 6 EVNT_DCLICK6  EVNT_MESAG D R EVNT_TIMER D zt EVNT_MULTI 6DXLF@:4.(" R EVNT_BUTTON6| EVNT_MOUSE D" TNHB<60*$MENU_BAR Df MENU_ICHECKDfT MENU_IENABLE DfN MENU_TNORMAL Dfd^X MENU_TEXTD$f2,R& MENU_REGISTER62ROBJC_ADD D@f6 OBJC_DELETEDNf OBJC_DRAWD\fpjd^XRL OBJC_FIND62jf&  OBJC_OFFSETDxf OBJC_ORDER Df OBJC_EDITDfztnhb\ OBJC_CHANGED f4.(" 0FORM_DO6f FORM_ALERT 6R FORM_ERROR 6 F FORM_CENTERDf\VPJD FORM_DIALD   GRAF_MOUSE DfR GRAF_MKSTATE D GRAF_RUBBOXD\VPJD> GRAF_DRAGBOX D  2 GRAF_MOVEBOX D. GRAF_GROWBOX D<lf`ZTNHBhGRAF_SHRINKBOX DJ p GRAF_WATCHBOX6Xf GRAF_SLIDEBOX6ffzt GRAF_HANDLE6XtLF@: SCRP_READD R SCRP_WRITE D R. FSEL_INPUT DRR߾߸~ FSEL_EXINPUT DRߎR߈߂R|B WIND_CLOSE D TF WIND_DELETED , WIND_FIND6 | WIND_UPDATED WIND_NEW Dz WIND_OPENDޒތކހz WIND_CREATE6^RLF@:WIND_GET DVWIND_SET D*ݾݸݲ WIND_CALCD$8 ݌݆݀ztnhb\V^ RSRC_LOADD FR0H RSRC_FREEDT RSRC_GADDR DbR` RSRC_SADDR DpܴܮfܨF RSRC_OBFIX D~܀fz SHEL_READDRTRNSHEL_GET DR("SHEL_PUT DR SHEL_FINDD R SHEL_ENVRN DfۨRۢ SHEL_WRITE DztnRhRb0&BSystemOSystem2GEMDECL GemAESLNGEMERRORAPPL_INI*APPL_FINBAPPL_TREAPPL_REAAPPL_WRI6APPL_TPLNAPPL_EXIZEVNT_KEYEVNT_DCL~EVNT_MESEVNT_TIMEVNT_MULfEVNT_BUTrEVNT_MOUMENU_BARMENU_ICHMENU_IENMENU_TNOMENU_TEXMENU_REGOBJC_ADDOBJC_DELOBJC_DRAOBJC_FIN&OBJC_OFF2OBJC_ORD>OBJC_EDIJOBJC_CHAVFORM_DOnFORM_ALEzFORM_ERRFORM_CENbFORM_DIAGRAF_MOUGRAF_MKSGRAF_RUBGRAF_DRAGRAF_MOVGRAF_GROGRAF_SHRGRAF_WATGRAF_SLIGRAF_HAN SCRP_REASCRP_WRI"FSEL_INP.FSEL_EXIRWIND_CLO^WIND_DELWIND_FINWIND_UPDWIND_NEWFWIND_OPE:WIND_CREjWIND_GETvWIND_SETWIND_CALRSRC_LOARSRC_FRERSRC_GADRSRC_SADRSRC_OBFSHEL_REASHEL_GETSHEL_PUTSHEL_FIN*SHEL_ENVSHEL_WRICALLAES6 (2RB`*B666nBBDNB|Z f( rp6~x<. 4<8@@@$D2B@@N8\b0j&Z*x2N>@J\*Vr<b@np<zB6X$\* |B.X*<h6Jh6XR$fJtV$8 N. ". .F:PFX*RP$^. j. v`**X*<. 8BF. T bBp@~8:V$::*. :h h hdh"h(h hhh6d hhh6dh$d*h hhh6d hh.d4hddh hhh2d8hDhNhXhbh hhh$h,hBdLhVh`hjhh$d hh*d hhh$h,h4h<hDhLhTh\hdhlhth~hhhdhhhhhhh hh*d0h hh,d hhh4d hhh4d hhh4d hhh6d hh.d4h hhh4d hh,d hhh$h,h4h<hTd hhh$h,hDdJh hh,d6h@h hhh4d hhh$h,hDdNh hhh$h,h4h<hDhLhdd hh,d2h hhh$h,h4h<hDhLhbdhh.d4h h"d(h h"d,h6h@hJh hhh$h:dDhNh hhh$h,h4h<hDhZddhnh hhh$h,h4hJd hhh$h,h4h<hDhZd hhh$h,h4h<hDhZd hhh$h<dBh hhh4d:hdh*h4h>hHh hh,dd"h,h6h@hh$dh$dhh.d8hhh"h8dBh hhh$h,hBdHh hhh$h,hBd h"d h"d hh*d4h>hHhRh hhh$h,h4hJd hh*d0h h"d hhh$h,h4hJdTh^hhhrhdh$dd hh,d6h hhh4d hh,dhh.d hhh&h0hHd hh.d hh.dh$dhh.dNVA,000 0 0A"0<NBN^ _O NNqNqNV=yLN^NuNqNqNV?< Bg?<BgBgN3L,=yLN^NuNqNqNV3D3 F/.#?< ?<?<?<BgNN^ _PNNqNqNV3D3 F/.#?< ?<?<?<BgNN^ _PNNqNqNV/.#?< Bg?<?<BgN=yL N^.NuNqNqNV3 D3F/. #?<?<?<?<BgNN^ _PNNqNqNV3D/. #?<?<?<?<BgN=yLN^ _\NNqNqNV?<Bg?<BgBgNN^NuNqNqNV?<Bg?<BgBgN=yLN^NuNqNqNV3D3F3H?<?<?<BgBgN=yL"n2N"n2P"n 2R"n2TN^ _ONNqNqNV3 D3F3H3J3L?<?<?<BgBgN"n2N"n2P"n 2R"n2TN^ _ONNqNqNV/.#?<Bg?<?<BgNN^.NuNqNqNV3 D3F?<?<?<BgBgNN^.NuNqNqNV3BD3@F3>H3<J3:L38N36P34R32T30V3.X3,Z3*\3(^/.$#3"`3 b?<?<?<?<BgN=yLD"n2N"n2P"n2R"n2T"n 2V"n2XN^ _O(GEMDECLN CONTROL_MAX\^ INTIN_MAX\H INTOUT_MAX \0 WORKOUT_MAX\8 ADDRIN_MAX \ ADDROUT_MAX\ GLOBAL_MAX \PTS_MAX\ AES_PARAM] ~lh VDI_PARAM]@P D~2, GLOBAL_ARRAY ]~ j CONTROL_ARRAY]   INTIN_ARRAY] xnb INTOUT_ARRAY ]6F :0"$ PTSIN_ARRAY]r "^ PTSOUT_ARRAY ] " ADDRIN_ARRAY ] @fxl ADDROUT_ARRAY],P D@f:. WORKOUT_ARRAY]j 8rVARRAY_2] ARRAY_3] ARRAY_4]j ^THARRAY_5]J2 & 6ARRAY_6]  nARRAY_8] ARRAY_10 ]  |rfARRAY_16 ].N B 8,ARRAY_37 ]h $JTGRECT]$2XQYQWQHQAES_PB QjVDI_PB Q@TCONTROLQ,>INTINQD*INTOUT QL6*PTSINQdrPTSOUT QADDRIN QADDROUTQ,GLOBAL Q(~MIN6 MAX6 x(lfHIPTR6 P6RDfLOPTR6 .DR"BITTEST6 R INTERSECT6` EMPTYRECT6 nMAKEXYXY D|xrMAKEXYWH DLF$BSystemOSystem2 GemDeclGEMDECLMINMAXHIPTRLOPTRBITTESTINTERSECEMPTYRECMAKEXYXYMAKEXYWH*(*6DR(`n0|RR "d(:d(`dddn dddd"d(d.d4d:d@dFdLdRdXd^dddjdpdvd|dddNqNqNV0. no =n `=n N^.NuNqNqNV0. nl =n `=n N^.NuNqNqNV/. H@=@ N^.NuNqNqNV/. =@ N^.NuNqNqNVp2. hHJVD@N^ _\NNqNqNV n C""U n??.N=_U n?(?.N=_U n0 nh?0.n?N=_U n0( nh?0.n?N=_0.n0.nUHnNJWD@A"n""N^ _PNNqNqNV nC""Jn_DJn_D@ N^.NuNqNqNV n C"""n2"n3n0.nS@"n3@0.nS@"n3@N^ _PNNqNqNV n C"""n2"n3n0.nR@"n3@0.nR@"n3@N^ _PNNqNqNVHy,#HyD#Hyd# HyL#$Hy#(Hy,#Hy(#HyD#HyL# Hy#Hy#N^Nueger; VAR ch_out: Integer); Input choice, request mode. handle : device ch_in: initial value ch_out : pressed key See also: GemVDI, vsm_choice    Function vsm_choice(handle : Integer; VAR choice : Integer) : Integer; Input choice, sample mode. handle: device choice: pressed key Return value : status : 0 = no key; 1 = key pressed See also: GemVDI, vrq_choice \  Procedure vrq_string(handle, maxlen, echomode : Integer; Var echo_xy: Array_2; Var instring: String80); Input string, request mode.UNI2|A(z d B80tZ~ Pp Z  .$: $ 62 zT &@^ \T |*n:vGEMVDI NHOLLOW \bSOLID\PPATTERN\<HATCH\* UDFILLSTYLE\DOTS \GRID \BRICKS \ WEAVE\LDASHED\DOTTED \DASHDOT\PDASHED \x DASHDOTDOT \`SQUARED\LARROWED\8ROUNDED\$NORMAL \BOLD \rSHADED \SKEWED \ UNDERLINED \OUTLINE\ SHADOW \ MD_REPLACE \~MD_TRANS \hjMD_XOR \TMD_ERASE \> ALL_WHITE\(S_AND_D\ S_AND_NOTD \4S_ONLY \ NOTS_AND_D \D_ONLY \S_XOR_D\jS_OR_D \NOT_SORD \~. NOT_SXORD\h NOT_D\V S_OR_NOTD\@ NOT_S\. NOTS_OR_D\ NOT_SANDD\ ALL_BLACK\VREQUEST\SAMPLE \MFDB ]MPTR Qf FORMWIDTHQ| FORMHEIGHT Qb WIDTHWORDQJ FORMATFLAG Q 0 MEMPLANESQ RES1 QRES2 QRES3 QSTRING80 ]RP STRING125]~}V_CLSWKD ZV_CLSVWK D (4V_CLRWKD 6V_UPDWKD DVST_UNLOAD_FONTS D RVS_CLIPD` VST_LOAD_FONTS 6 hn\VnV_OPNWKD|*,jV_OPNVWK DjPV_PLINEDr V_PMARKERDrV_GTEXTDnhbP V_FILLAREA D4.r  V_CONTOURFILLDVR_RECFL D V_CELLARRAYDzlV_BARDRD$V_ARCD*$  V_PIESLICE DV_CIRCLE D$ V_ELLIPSED2hb\VPV_RBOX D@,V_RFBOXDN(V_ELLARC D\V_ELLPIE Djztnh V_JUSTIFIEDDx@:4"(" VSWR_MODED VS_COLOR D`VSL_TYPE D  VSL_UDSTYD lf0 VSL_COLORD @:*VSL_ENDS DVSM_TYPE D  VSM_COLORD  VST_ROTATION D VST_FONT D ZT. VST_COLORD .( VST_EFFECTSD   VSF_INTERIOR D . VSF_STYLED < VSF_COLORD Jxrx VSF_PERIMETERD XHB VSF_UDPATDfRVR_TRNFM Dt V_GET_PIXELD VSM_HEIGHT D vp VSL_WIDTHD JD VST_HEIGHT D  VST_POINTDH VST_ALIGNMENTD~xx VRO_CPYFMDRL>4. VRT_CPYFMD VSIN_MODED VRQ_CHOICE DVSC_FORM Djh\V_SHOW_C D >8V_HIDE_C D *VVQ_KEY_S D8VQ_MOUSE DFt VSM_CHOICE 6T VRQ_VALUATOR DbVPJD VRQ_LOCATORDp  VSM_LOCATOR6~( VSM_VALUATOR D|v VRQ_STRING DNHB4*L VSM_STRING 6VEX_TIMV DffzVEX_BUTV Dff(VEX_MOTV Dff`fZdVEX_CURV D4f.f( VQ_EXTENDDj8VQL_ATTRIBUTES DLVQM_ATTRIBUTES D JjVQF_ATTRIBUTES DfJXVQT_ATTRIBUTES D&4&VQ_COLOR 64D VQT_EXTENT DB VQT_WIDTH6PVQT_NAME 6j^^XF@ VQ_CELLARRAY D l( 6: VQIN_MODEDz VQT_FONTINFO D| VQ_CHCELLS D\VP V_EXIT_CUR D (\ V_ENTER_CURD V_CURUPD  V_CURDOWND V V_CURRIGHT D  V_CURLEFTD hx V_CURHOMED BV_EEOS D V_EEOL D  VS_CURADDRESSD" V_CURTEXTD0V_RVON D >tLV_RVOFFD LP VQ_CURADDRESSDZ&  V_HARDCOPY D h.V_DSPCUR DvV_RMCURD J V_FORM_ADV D tV_OUTPUT_WINDOWDH:V_CLEAR_DISP_LISTD  VQP_FILMSDVSP_SAVE D n VSP_MESSAGED HV_META_EXTENTS Dnhb\Vj VM_FILENAMED. VQ_TABSTATUS 6  VS_PALETTE 6 H VQP_ERROR6 6 VQP_STATED",~xrlf.X VSP_STATED::4.(". V_WRITE_META DHr V_BIT_IMAGEDV00BSystemOSystem2GEMDECL GemVDIr h V_CLSWK$V_CLSVWK0V_CLRWK<V_UPDWKTVST_UNLO`VS_CLIPHVST_LOADV_OPNWKV_OPNVWKlV_PLINExV_PMARKEV_GTEXTV_FILLARV_CONTOUVR_RECFLV_CELLARV_BARV_ARCV_PIESLIV_CIRCLEV_ELLIPSV_RBOX V_RFBOXV_ELLARCV_ELLPIE,V_JUSTIF8VSWR_MODDVS_COLORPVSL_TYPE\VSL_UDSTtVSL_COLOVSL_ENDSVSM_TYPEVSM_COLOVST_ROTAVST_FONTVST_COLOVST_EFFE VSF_INTE VSF_STYL VSF_COLO (VSF_PERI 4VSF_UDPA XVR_TRNFM dV_GET_PIVSM_HEIGhVSL_WIDTVST_HEIGVST_POINVST_ALIG @VRO_CPYF LVRT_CPYF pVSIN_MOD VRQ_CHOI VSC_FORM V_SHOW_C V_HIDE_C $VQ_KEY_S 0VQ_MOUSE VSM_CHOI VRQ_VALU |VRQ_LOCA VSM_LOCA VSM_VALU VRQ_STRI VSM_STRI <VEX_TIMV VEX_BUTV VEX_MOTV VEX_CURV HVQ_EXTEN `VQL_ATTR lVQM_ATTR xVQF_ATTR VQT_ATTR TVQ_COLOR VQT_EXTE VQT_WIDT VQT_NAME VQ_CELLA VQIN_MOD VQT_FONT VQ_CHCEL V_EXIT_C V_ENTER_ V_CURUP V_CURDOW V_CURRIG V_CURLEF ,V_CURHOM 8V_EEOS DV_EEOL PVS_CURAD \V_CURTEX hV_RVON tV_RVOFF VQ_CURAD V_HARDCO V_DSPCUR V_RMCUR V_FORM_A V_OUTPUT V_CLEAR_ VQP_FILM VSP_SAVE (VSP_MESS @V_META_E XVM_FILEN VQ_TABST VS_PALET 4VQP_ERRO VQP_STAT VSP_STAT LV_WRITE_ V_BIT_IMrGEMVDIPd*GEMVDIF~2GENSET:GENSETP4RETCONTR$ GENESCAP0| **$*(0*6<*DH*nT8R`2`lvxrr*z|<F$lt`6`6$T0\h<jh<2V0@ tN,tx8HD PV*\ h t8 < H* d6^0      P$.  <  J ( X 4 f @J LN XZt dtB pP$ |<p Z*~ l6b H R$ <T : < B @ ^0 2* * ^0 $^08 02F <H Hf0 T$4 `$ lv x$ j& B $P Z*^ 6l 6z < H F      , 8 D P" \D$0 h$> tL Z 4 & h v D$   t V 6 @ 6, *: B ( 4 @&  LV0H X^$$ hhh hhh&h hhh*d~ hhh(dd hh hhh&ddh,h4hDddNhxhh hhddh"h,hDddNhxhh hhdd hhdd hhdd hhh*d~ hhh(dd hhhJhjdd hhFhfdd hhFhfddp|h*h2h:hrhdd hhNhndd hh"h*h2h:hDhNpXhndd hhh$h,h:dd hh@h`dd hhhHhhdd hhh$h,h4h<hDhRdd hhh$h,h4h<hDhRdd hhh"h*h2h:hHdd hhh$h,h4h<hDhLhZdd hhh$h,h4h<hDhLhZdd hhh"h*h2h:hHdd hhhHhhdd hhhHhhddp|h,h4hlhhhhhhhddd hhh$h0h<hJdddd hhh h.ddd hhh"h0ddd hhh"h(h0h>ddd hhh h.dd8hBhLhVh hhh(dd2h<hFhPhdddd hhh"h2d~Bhdddd hh h0p>dd hh h6&h2hD8hDh6JhVhD\hdhhdd hh h6&h2hD8hDh6JhVhD\hdhnhzhhdd hhh6"h.hD4h@h6FhRhDXhfdd hhh"h2d~Bh hhh"h0dd hhh"h2d~BhLh hhh"h2d~BhLhRhZh hhh*d~:h hhh*d~:hDh hhh*d~ hh d~,h hh h(h2h>hLddRh`hh hh h(h2h>hLddRh`hhh hhh&p4dd hhh6"h.hD4hBddJd hhh(dd hhdd hhh6"h.hD4hBddJd hhh6"h.hD4hBddJd hh d~ hh d~0h:h hhh6"h.hD4hDd~Rd hhh(ddRhh hhh"h2d~`h hhddHhhh hhddHhhhth hhddHh hhddHhhp|h(h`h~ddh hhh*d~8hBhLh hhh*d~@p|fp`rhpp| hhhJhjddth~hhh hhh*d~ hh d~0h:hDhPh\hhhrh|hh hhh(d~8hddddddddd hhh"h*h8ddp|h(h0hhhdddddh&hdhd hhh"h*h8dddd hhhHhhdddp|h&h^hhhhhdd hhh"h2d~ hhh&dd8p|^p`jhpp|dh&h0h:hDhph hhh"h*h2h:hBhJhzhdddddh hhh"h*h2h:hHdd hhh&h8hPddp|h(h0hhhddNqNqNV3 ,38A"psNBN^.NuNqNqNV3 ,38A"psNB=yL N^.NuNqNqNVBy.323DU?. ?. N=_N^ _\NNqNqNVBy.323D?. ?. NN^ _\NNqNqNV09>HH@29@HЁ-@N^NuNqNqNVBy.By23 6?<?.NN^.NuNqNqNV nCpA"QACDpA"QBy.3 2?< n ?N"n 28pr,@m8=@=A`Rn0.H2.IAL"n30.nfp-r8@m<=@=A`Rn0.H2.A-IA"n30.nfN^ _O NNqNqNVBy.By2?<?.NN^ _TNNqNqNV nCpA"QBy.3 2ACDpA"Q?<d n ?N"n 28pr,@m8=@=A`Rn0.H2.IAL"n30.nfp-r8@m<=@=A`Rn0.H2.A-IA"n30.nfN^ _O NNqNqNVBy.By2?<e?.NN^ _TNNqNqNVBy.By2?<?.NN^ _TNNqNqNVBy.By2?<?.NN^ _TNNqNqNVBy.323DU?<w?. N=_ N^.NuNqNqNVBy.323D?<x?. NN^.NuNqNqNV3.323 Dpr@m8=@=A`Rn0.H2.I nCd30.nf?<?.NN^ _PNNqNqNV3 .By20. HS@rAm8=A=@`Rn0.H2.I nCd30.nf?<?.NN^ _PNNqNqNV3 .By20. HS@rAm8=A=@`Rn0.H2.I nCd30.nf?<?.NN^ _PNNqNqNV/.Hn?<PN3.p.323d3 fp.rAm<=A=@`Rn0.S@H2.tA0CD30.nf?<?.NN^ _O NNqNqNV3 .By20. HS@=@p2.@m8=@=A`Rn0.H2.I nCd30.nf?< ?.NN^ _PNNqNqNV3.0.323:3<3>3 @/.Hyd?<N nCDpA"Q?< ?.NN^ _ONNqNqNV3.323 d3 f3D?<g?.NN^ _PNNqNqNV3.By2pr@m8=@=A`Rn0.H2.I nCd30.nf?<r?. NN^ _\NNqNqNV3.By236pr@m8=@=A`Rn0.H2.I nCd30.nf?< ?. NN^ _\NNqNqNV3.32363 D3F3d3f3 p?< ?.NN^ _O NNqNqNV3.32363 D3F3d3f3 p?< ?.NN^ _O NNqNqNV3.By236383 d3 f3l?< ?.NN^ _PNNqNqNV3.32363 D3F3d3f3h3 j?< ?.NN^ _ONNqNqNV3.32363 D3F3d3f3h3 j?< ?.NN^ _ONNqNqNV3.By2363d3 f3 h3j?< ?.NN^ _O NNqNqNV3.By236pr@m8=@=A`Rn0.H2.I nCd30.nf?< ?. NN^ _\NNqNqNV3.By23 6pr@m8=@=A`Rn0.H2.I nCd30.nf?< ?. NN^ _\NNqNqNV/.Hn?<PN3.p.T@323 6p.rAm<=A=@`Rn0.R@H2.tA0CD30.nf3 D3F3d3f3 hByj?< ?.NN^ _ONNqNqNV?< ?. ?.NN^.NuNqNqNVBy.323 D n3F n3H n3J?<?.NN^ _PNNqNqNV?<?. ?.NN^.NuNqNqNV?<q?. ?.NN^.NuNqNqNV3.By23dByf?<?. NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNVBy.323 D3F?<l?. NN^ _\NNqNqNV?<?. ?.NN^.NuNqNqNV3,3.By23 8Byd3f?<?. NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNV3.By2Byd3f?< ?.N"n2"n2"n 2"n2N^ _ONNqNqNVBy.323D?<k?.N"n2"n2"n 2"n2N^ _ONNqNqNV?< ?. ?.NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNV?<j?. ?.NN^.NuNqNqNVBy.323D3FU?<'?.N"n 2"n2NN^ _ONNqNqNV?<?. ?.NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNV?<h?. ?.NN^.NuNqNqNVBy.0.H32/. HyD0.HH?N?<p?.NN^ _PNNqNqNV3.32U/. N3:U/. N3U/.N3@3Dpr@m8=@=A`Rn0.H2.I nCd30.nf?<m?.NN^ _ONNqNqNV3.32U/.N3:U/.N3U/. N3@3D n3F n3Hpr@m8=@=A`Rn0.H2.I nCd30.nf?<y?.NN^ _ONNqNqNVBy.By2U/. N3:U/. N3U/.N3@?<n?.NN^ _O NNqNqNV3.By23d3fU?<i?.N"n 2"n2NN^ _ONNqNqNVBy.323 D3F?<!?. NN^ _\NNqNqNV3.By23d3fU?<?.N"n2"n2"n 2N^ _ONNqNqNV3.By23d3fU?<?.N"n2"n2"n 2094Hy0=@N^ _ONNqNqNVBy.323DU?<?.N"n 2"n2NN^ _O NNqNqNVBy.323DU?<?.N"n2"n24"n 2NN^ _ONNqNqNVBy.323 DU?<?.N"n2N^ _PNNqNqNVBy.By2U?<?. N"n2=y4N^ _\NNqNqNV3.320.D@3D3F n 3d n 3f?<?.N094"np294@m:=@=A`Rn0.2.SAIAL40"n0.nfN^ _ONNqNqNV3.320.D@3D3F n 3d n 3f?<?.N094"np294@m:=@=A`Rn0.2.SAIAL40"n0.nf=y4N^ _ONNqNqNVBy.3%2/.HyD?<JN?<o?. NN^ _\NNqNqNVBy.By2U/. N3:U/. N3"n2@=yB p2<@m8=@=A`Rn0.H2.IAL"n30.nfN^ _ONNqNqNVBy.323 DU?<s?.N"n2N^ _PNNqNqNVBy.By2U?<?.N"n2"n2N"n2"n3y"n3y"n3y"n 2"n2"n3y"n3yN^ _ONNqNqNVBy.By236U?<?.N"n 2"n2NN^ _O NNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?< ?.NN^ _TNNqNqNV?< ?.NN^ _TNNqNqNVBy.323 63 D3F?<?. NN^ _\NNqNqNV/.Hn?<PNBy.p.323 6p.rAm<=A=@`Rn0.S@H2.tA0CD30.nf?<?. NN^ _\NNqNqNV?< ?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.N"n 2L"n2NN^ _O NNqNqNV?<?.N=yL N^ _TNNqNqNV?<?.NN^ _TNNqNqNV3.By2363 d3f?<?. NN^ _\NNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV3.By236pr@m8=@=A`Rn0.H2.I nCd30.nf?<?. NN^ _\NNqNqNV?<?.NN^ _TNNqNqNV/.Hn?<PN3D3Fp.rAm<=A=@`Rn0.R@H2.tA0CD30.nfpr@m8=@=A`Rn0.H2.I nCd30.nf3 .p.T@3236?<?.NN^ _ONNqNqNVBy.323<63DU?<?. N=_ N^.NuNqNqNVBy.By23[6?<?. NHz/.?<}Npr|@mf=@=A`Rn/.HnN0.HAL20AA=AHnHnNHn/.?<}N0.nfN^ _\N NqNqNV?<\?. N"n2L"n2N"n2P"n2R"n 2Tpr@m:=@=A`Rn0.H2.ZAIAL"n30.nfN^ _ONNqNqNVBy.323]63]83D3F3H3J3 Lpr@m:=@=A`Rn0.X@H2.I nCD30.nf?<?.NN^ _ONNqNqNV?<^?.NN^ _TNNqNqNV?<_?.NN^ _TNNqNqNV?<`?.N=yL N^ _TNNqNqNV3.By23b63d3 f3 h3j?<?.NN^ _O NNqNqNV3.3 23c6 nCDpA"Q nCdpG"Q2?<?.NN^ _ONNqNqNV/.Hn?<PNBy.p.323d6p.rAm<=A=@`Rn0.S@H2.tA0CD30.nf?<?. NN^ _\Nsume the values True and False. The boolean type is declared as an enumerated type: Type Boolean = (False, True); See also: InUNI2 bU&m< )9.  f ) ) b ~ G>U~V\ pxL> ,z H<FHJ\x D* V N \t*$,j .6 GRAPHN GRAPHVERSION \*^?GROK \F GRNOINITGRAPH\, GRNOTDETECTED\GRFILENOTFOUND \GRINVALIDDRIVER\ GRNOLOADMEM\j GRNOSCANMEM\ GRNOFLOODMEM \GRFONTNOTFOUND \t GRNOFONTMEM\\ GRINVALIDMODE\BGRERROR\. GRIOERROR\ GRINVALIDFONT\GRINVALIDFONTNUM \DETECT \CGA\MCGA \EGA\lEGA64\\EGAMONO\tIBM8514\`HERCMONO \JLATT400 \6VGA\& PC3270 \ STCOLOR\ STMONO \ .STLOW\STMEDIUM \NSTHIGH \CGAC0\CGAC1\CGAC2\xCGAC3\fCGAHI\TMCGAC0 \@MCGAC1 \,MCGAC2 \LMCGAC3 \MCGAMED\|MCGAHI \EGALO\EGAHI\EGA64LO\EGA64HI\ EGAMONOHI\z HERCMONOHI \bATT400C0 \LATT400C1 \6\ATT400C2 \ ATT400C3 \ ` ATT400MED\ATT400HI \VGALO\VGAMED \VGAHI\DPC3270HI \ IBM8514LO\z IBM8514HI\dRBLACK\RBLUE \@GREEN\.*CYAN \RED\ MAGENTA\BROWN\l LIGHTGRAY\DARKGRAY \T LIGHTBLUE\ LIGHTGREEN \ LIGHTCYAN\v LIGHTRED \`  LIGHTMAGENTA \F YELLOW \2WHITE\ :EGABLACK \ >EGABLUE\EGAGREEN \EGACYAN\EGARED \ EGAMAGENTA \EGABROWN \J EGALIGHTGRAY \p EGADARKGRAY\X8 EGALIGHTBLUE \>9 EGALIGHTGREEN\$: EGALIGHTCYAN \ ; EGALIGHTRED\<EGALIGHTMAGENTA\= EGAYELLOW\>EGAWHITE \?SOLIDLN\PDOTTEDLN \ CENTERLN \jDASHEDLN \T USERBITLN\>L NORMWIDTH\( THICKWIDTH \0 DEFAULTFONT\ TRIPLEXFONT\ SMALLFONT\ SANSSERIFFONT\ GOTHICFONT \HORIZDIR \VERTDIR\n USERCHARSIZE \TLEFTTEXT \> CENTERTEXT \& RIGHTTEXT\ BOTTOMTEXT \TOPTEXT\\CLIPON \CLIPOFF\FTOPON\TOPOFF \ EMPTYFILL\ SOLIDFILL\j>LINEFILL \T LTSLASHFILL\< SLASHFILL\& BKSLASHFILL\ LTBKSLASHFILL\4 HATCHFILL\ XHATCHFILL \INTERLEAVEFILL \ WIDEDOTFILL\ 6 CLOSEDOTFILL \x USERFILL \b NORMALPUT\LCOPYPUT\8XORPUT \$ORPUT\ANDPUT \NOTPUT \ MAXCOLORS\ PALETTETYPE] $SIZE QCOLORS Q l tj J :LINESETTINGSTYPE ] 0 LINESTYLEQDPATTERNQD THICKNESSQD R~TEXTSETTINGSTYPE ]F^FFONT QD DIRECTIONQD~CHARSIZE QDfHORIZQDRVERT QD> $FILLSETTINGSTYPE ]PATTERNQDCOLORQDt:FILLPATTERNTYPE] r POINTTYPE]8ZXQ\YQL&F VIEWPORTTYPE ]P<X1 QY1 QX2 QY2 QCLIP Q b ARCCOORDSTYPE]pvh<NXQxYQhXSTART QRYSTART Q<XEND Q(YEND Q  RESTORECRTMODE D GETARCCOORDS D (p SETVISUALPAGED 6D SETACTIVEPAGED DD^ SETWRITEMODE D R4 GRAPHDEFAULTSD` SETBKCOLOR D nD GETBKCOLOR 6D|^ SETALLPALETTED R GETPALETTE D  $X~ SETPALETTE D LFGETPALETTESIZE 6&GETDEFAULTPALETTED  $ SETRGBPALETTEDSETCOLOR D D"GETCOLOR 6DvL GETMAXCOLOR6DTOUTTEXTD * OUTTEXTXYD TEXTHEIGHT 6 D$ TEXTWIDTH6 D2SETTEXTJUSTIFY D @D~Dx* SETTEXTSTYLE DNDNDHDB|GETTEXTSETTINGSD \F CLEARVIEWPORTDj SETVIEWPORTDx~GETVIEWSETTINGSD jGETX 6pGETY 6TXMOVETO D *$MOVERELD & DETECTGRAPHD INITGRAPHD$ CLOSEGRAPH D GRAPHERRORMSG6 ZN| GRAPHRESULT62GETMAXX6FGETMAXY6 GETMAXMODE 6. GETGRAPHMODE 6< GETDRIVERNAME6JR GETMODENAME6 jX^ GETMODERANGE Df4.( SETGRAPHMODE D t2SETASPECTRATIO D DD"GETASPECTRATIO DDD. CLEARDEVICED FLOODFILLDRLDFSETFILLPATTERN DD SETFILLSTYLE D DDGETFILLPATTERN D GETFILLSETTINGSD p IMAGESIZE6rf`ZTGETIMAGE D.("RPUTIMAGE DRDLINE DXLINETO D *LINERELD 8\V SETLINESTYLE DFD,D&D jGETLINESETTINGSD T PUTPIXEL DbDGETPIXEL 6 DpBARD~vpjd"BAR3DDB<60D*$ FILLELLIPSEDDDDRAWPOLY DDRxFILLPOLY DDRnARCDrlDfD`DZ$CIRCLE D60D*PIESLICE DDDDR RECTANGLEDPELLIPSEDDD~DxDrFSECTOR D NHDBD<D6D0 HALFX6,HALFY6&` BSystemOSystem2STPASCALGEMDECL&GEMAES 0GEMVDIBBIOS Graph4 GRAPH RESTOREC GETARCCORSETVISUAFSETACTIV SETWRITEGRAPHDEFSETBKCOLGETBKCOL"SETALLPA.GETPALET:SETPALET GETPALETGETDEFAUFSETRGBPASETCOLORGETCOLORGETMAXCOOUTTEXTOUTTEXTXvTEXTHEIGTEXTWIDTSETTEXTJSETTEXTSGETTEXTS VCLEARVIE >SETVIEWP JGETVIEWShGETXtGETYPMOVETO\MOVERELDETECTGR,INITGRAP CLOSEGRA GRAPHERR bGRAPHRES nGETMAXX zGETMAXYGETMAXMOGETGRAPH GETDRIVE GETMODENGETMODER &SETGRAPHSETASPEC~GETASPEC 2CLEARDEVfFLOODFILSETFILLPSETFILLSGETFILLPGETFILLSRIMAGESIZ^GETIMAGEjPUTIMAGELINELINETOLINERELSETLINESGETLINESPUTPIXELGETPIXELBBARZBAR3D*FILLELLIDRAWPOLYFILLPOLYARCNCIRCLEPIESLICErRECTANGLELLIPSE6SECTOR4HALFX@HALFY@ &Z ZARLt6tE_REf*EE_R: GET_@GE l0 n OU**_MOUDDNE_C6P \4h:$t((EST _DISP NU_H*l0  n | $"f.:\ F*R0^*jbNv|N$B2BBv*N@*\*T*L*8\FZT(lLr*B6< BB~Nd0ZZfpHrH$~T*2pL$bNX`<Bgp$PNN$ . *:2f:D,FZDRt$6l*l^xZZF>`t<~fd.,<  J fX ` &*t 2p* >2*x JH V*j bzN n  z   $  l( ~R 8 @ d d .|d&t,4 dl d&dF dJdfd|"d,|6d@|JdT|^dh|rd||d|d|d|d|d|d|dd |d|"d,|6d@|JdT|^dh|rd||d|d|d|d|d|d|d|d|&d0| ddddd$d*d d6dd d*d0d d6dd d d6dd d4h$:d*d8h$d6dRdrdddddd,dJdjddddddd$lVdldrdhdddddd"d d6d0d6dDlJdXl^d d6dd d6ddd d6dd d d6dDdd.d~ddd:d d62dDdRl`djdvd d6rdddddld d6$df>dfndxD(d d6$df>dfddddd8dNlTd d6(4xNddddNdhlnd|d6$d.d6l<dJlB^dhdrlxd|d6$d.d6l<dJlB^dhdrlxd|d6*dRd2~d2d2dddld|d&d0d6d`d2jd d64dbdrddl dl dl dl dl d$(*d0d6d<lHdZd`d~l d6Rd^djddld d6d d d6d"d0d>dHdNdTl\pfdtlzdld dd"d,d2d<dBd dd>dHdRd d6Vd\dldzlddd(d2l8dBldld d6dd d6d&,d:Pbrddddd((l\dd d6*dL0d:dFd\dlrd((ljdd(&d<d d68d>dDdNdZdz((l\dd d6d"d,dJl2PdVdzl\dd d6dd&dF(V(^ljdd(dd d6d"d0d>dHdRlXd d6dd d,dBdRXdf|l\dd 2B`dfzdfd~ddd,dBdXd d6dd&d6l<d d6d"d0dJdldrdxlpdldld d6dd d6d"d(d d6dd&d6lBd dd4dBd d6 d8|ddddlpdld0l6d@lLdd6dd*dPdjdxldd d4d>PdVdbd8dd6ddlfd lJdl.(d4d:dFd d6dd d6d$d hdd&d.d 4d^tdddRdddd dd"d(d6d>d DdNTdbdjd pddDd6 d6(dLdVh\dhd d6(dHdVhbdhdtd d^&x@<x@Rx@ d^&x@<x@Rx@B|HdVd^hr|xddx"d:dDdNdZhfp(ptddlddh0dxBdRdpdxddddldddddlXdd dd6dD"dR(d.d`4ddd "dx(d2d@dFLdRd`dNld@ dhrdVd d6ddf d6dd d6d*|H|Nd d6d"d2`@NZd fdvdd|d*d<|Nd^`l~|d d6ddfDdNdTdbd dl6dd d$d*d d6Bdbdjdrdzddddl`d d6d d d"d,d|2d8dBlXd^dbdhdldrd dd d6dd d6dd |6h ddd,$d*d0d6l(<p|JhTd^dldx~ddhdh~ d6d:L^p$6Fbtdd,d dd&dNqNqNVUN0H=@N^NuNqNqNVUN0H=@N^NuNqNqNVp n 0=@p n0"n 2p0."n2N^ _PNNqNqNV n =P n"n 2"n2N^ _PNNqNqNV0.H/BgHn?<NHn/. ?<NN^ _TNNqNqNVHn?.NXHyHnBgNNBgNN^ _TNNqNqNV?9BgNN^NuNVHGp0?p0+?p0+?N&_N^NuNVHGp0.6p0.7@p0.7@p0. 7@0+klHkHkNp0. 7@p0.7@ &_N^ _O NNqNqNVHzHy"?<NHzHy,?<NHzHy6?<NHzHy@?<NHzHyJ?<NHzHyT?<NHzHy^?<NHzHyh?<NHzHyr?<NHzHy|?<NHzHy?<NHzHy?<NHy,Hy?<NN^Nu   @  p8 Hy?<*NHzLHy?<*NHzTHyf?<*NHz^Hy:?<*NHz`Hy?<*NHzlHy?<*NHzHy?<*NHzHy?<*NHzHy^?<*NHzHy2?<*NN^NuNo error Graph not initialized. Graphics hardware not detected.Device driver not found. Invalid device driver. !Not enough memory to load driver.Out of memory in scan fill.Out of memory in flood fill. Font file not found. Not enough memory to load font.*Invalid graphics mode for selected driver. Graphics error.Graphics I/O error.Invalid font file. Invalid font number. NqNqNVJ9 f ?=@=A`Rn0.HU?=@=A`Rn?9?.0.AHpN0.nfpr@m.=@=A`Rn0.2.C0.nfAC""""UN0 @f8pr@m*=@=A`Rn?.?.N0.nf`b @f:BgBgN?<?<N?<?<N?<?<N`" @fBgBgN?<?<NN^NuNVHNp0.U&Np0n6p0.3?9p0.?N?9p0.?NBy&N^ _TNNqNqNVN=yByN^NuNqNqNVN=yByN^NuNqNqNVBgp0.?NN^ _TNNqNqNVN9H=@ByN^NuNqNqNVUN0R@=@N^NuNVHN&nUN60S@re8A@`R.p.r.AC..f&_N^.NuNqNqNV/.Hn?<NUN0._nhBy0.S@rePA@`R.p.A 0o"p.?p.A0H?N..f` 3N^.NuNVH&nUN60S@rAm4=A=@`Rn0.2.AC0.nf&_N^.NuNqNqNVN n _D n_DgL0.AAC"2?9?. HnN0. 2.CBy` 3N^.NuNqNqNVN nnJn \D n@ ]DgJn \D n@ ]DgJn\D n@]Dgr0.2. C30.2. C30.2.C3?9?.0.AHpNByN^ _PNNqNqNVN0.n oHnHn N0. noHn HnN0. nR@2. nRAHHAtAB=@0.HrN2.n RAHN-@ .-@ByN^ _PNNqNqNVN0.noHnHnN0.n oHnHn N0.n=@0. n=@/. X-@0.R@2.RAHHAtAB=@0.R@=@0.H=@Bn=yHn/.?<N/. -@Hn/.?<NB0.y=@0.y=@0.y=@0. y=@BnBn0.R@=@=n?9?<HnHnHnNByN^ _O NNqNqNVNp0.?HnNBg?<NXHnNg2B/. Hn?<N/. X-@/. -@/.Hn?<N=n=nBnBn=n=n09n=@09n=@09nn=@09nn=@p0. f =|`N f =|`: f =|`& f =|` f=| ?9p0.?HnHnHnNByN^ _O NNqNqNV/.Hn?<NN y(f?9BgN?9HnHnN0.n=@ y(f?9?<NByN^.NuNqNqNV/.Hn?<NN y(f?9BgN?9HnHnN0.n=@ y(f?9?<NByN^.NuNVH/.Hn?<NNBnBnGp0+ fTp0+JfUHnN0H=@`,p0+ fUHnN0HD@=@ nl$Up.@@=@HnN=_?909nn?09n n?HnNBy&_N^ _PNNVH/.Hn?<NUNUNHnNGp0+JWDr2+JWDgUHnNp0y&_N^.NuNqNqNVNp0. J]Dr2. ^Dg3`Hp0. J]Dr2. ^Dg3`p0. 3p0. f?9BgN`t f?9BgN`X f?9?<N`: f?9?<N` f?9?<Np0. 3p0. "<N3(?9?9(Np0.3p0.Z=@By?9p0.?HnHnHnHnNN^ _\NNqNqNVNp0. J\Dr2. _Dr2.J\Dt4. _DgZByp0. 3p0.3p0.Jf=|?9p0. ?p0.?HnHnN` 3N^.NuNqNqNVNA"n""2ByN^.NuNqNqNVN0.y=@0. y=@0. y=@0.y=@?9?9 NUN=_?9?<HnN?9?.NByN^ _PNNqNqNVUNUN?. ?.N0. y30.y3 N^.NuNqNqNVUN=_UN=_?.?.0.n ?0.n?N0. y0.y N^.NuNqNqNVNp0. WDr2. WDr2. J\Dt4. _Dg^ByJ9f=|?9p0.?Np0.3p0. 3p0. 3p0. fp0. l`Bnpr@mN=@=A`Rnp0. J^DHn=@p0. =@ 0.H=@0.nf`=|?9?<N?9?.N`dp0. f =|`: f =|`& f =|` f=|?9?.N` 3N^ _\NNqNqNVNA"n"2ByN^.NuNVHNp0.HyHn?<D&NHyHn?< N=CHnHn?<DNHnHn?< NHnB?< SN=@?.?.p0. ?p0. ?p0.??.NN?90.y?0.y?p0.??.p0. r N?p0. r N?NNBy&N^ _O NNVHNp0. r2. oHn Hn N?90.y?0.y?p0.?p0.HyHn?<D&NHyHn?< N=CHnHn?<DNHnHn?< NHnB?< SN?p0. r N?p0. r N?N?.?.p0. ?p0. ?p0.?NHnN?.?.?.?.N?.?.?.?.N&N^ _O NNqNqNVN?.?.p0.?p0. ?p0. ?p0.?NN?90.y?0.y?p0. ?p0.?p0.r N?p0. r N?NNByN^ _O NNqNqNVN0.y=@0. y=@?9?.?.p0. ?p0.?NN?9?.?.p0. ?p0.?Bg?<NNByN^ _PNNqNqNVN?90.y?0.y?p0. ?p0.?p0.r N?p0. r N?N?.?.p0.?p0. ?p0. ?p0.?NHnN?.?.?.?.N?.?.?.?.NN^ _O NNqNqNVN0.y=@0. y=@0. y=@0.y=@?9HnNByN^ _PNNVHNN?90. y?0. y?p0.?p0.HyHn?<D&NHyHn?< N=CHnHn?<DNHnHn?< NHnB?< SN?Bg?<NNBy&N^ _\NNqNqNVp0. =@HnHn?<DNHz@Hn?< NHnB?< SN=@0.nlHnHnN0. nlHnHn N?.?.?.?. N?.?.?.?. Np0. 2.HҀ=Ap0. 2.HҀ=A0.n=@?.?. ?.0. n?N?.0. n??.?.NJ.gD?.?.?.?.N?.?.?.?.N?.?.?.?.NN^ _O N?NqNqNVN?90. y?0. y?p0.?NByN^ _\NNqNqNVN0.y=@0. y=@0. y=@=n=n0.y=@=n=n=n=n?9?9 NUN=_?9?<HnN?9?.NByN^ _PNNqNqNVN"n 2"n2N^ _PNNqNqNVNp0. 3p0.3ByN^.NuNqNqNVN?90. y?0.y?HnHnN=n ByN^.NuNqNqNVUN=_p0.?N?. ?. ?. ?. Np0.?NN^ _\NNqNqNVNp0. Hn,By/.Hnp0. ?Np0. SrAmn=A=@`Rn0.d(0.H2.IA40yC3`$0.H2.IA40yC30.ܰnf?9?9 NUN=_?9p0. ?HnNp0. HC3p0. RHC3?9p0. R?HnN?9?.N` 3N^ _\NNqNqNVBnp n0( rAmr=A=@`RnTn0.H n2( nA޲pWD2.RAI n4( nA޴pWDg0.R@=@ `0.nfp n0( =@ N^.NuNqNqNVNp0. HnBy/.Hnp0. ?NU/N=_0.HS@rAmn=A=@`Rn0.d(0.H2.IA40yC3`$0.H2.IA40yC30.ڰnf?9?.HnN0.ܑn p0. Jo p0. ?0.HHAHpN` 3N^ _\NNVH n C""p0.U&Np0n2HnHy?<N?< p0.?NBy` 3&N^ _\NNqNqNVpr@m=@=A`Rnp n0( 2.ArA"0=A0.S@n2."n0.n2."n0.n@2."n0.n@2."n0.nftN^.NuNqNqNVNp0. J\Dr2. _Dgd/N?9Hn?<N?9p0.?N?9?<Np0. 3p0.3By` 3N^.NuNqNqNVN"n"ByN^.NuNqNqNVNHy/.?<NByN^.NuNVHYN#*By$YBgBgUNUNN -@pre@A`R.N op.3$p.HA*Hp/.Np.Hr.It.J&A* 0 ("<N"<A*Ұ@C*#0p.HA*/0 .?BgN`p.HA*B..f0LN^NuNqNqNV y$f y&f4/9./9*YBgBgUNUNN ?NHy.YBgBgUNUNN /NBgNBgNN^NuNqNqNVNp0. _Dr2.IA*JVDg,?`$FBSystemOSystem2 Printer(NPRINTER(IBBF*B 4N" ( dld d*l0d8l< dldl ldd4l dNqNqNVHyHz0NHyHy?<NHyBNN^NuPRN: NqNqNV#HyNN^NuNqNqNV#H@#NN^NuDraw_Mode(mode : Draw_Modes); Procedure Draw_String(x,y : Short_Integer; s : Str255); FunctionD_Color(Border, Text : Short_Integer; Mode : Boolean; Pattern, Inside : Short_Integer) : Short_Integer; Procedure End_Dialog(dial : Dialog_Ptr); Procedure End_Mouse; Procedure End_Update; Procedure Erase_Menu(menu : Menu_Ptr); Procedure Exit_Gem; Procedure Find_Alert(index : ShUNI2llh?:뤱/ ǒN p d. d ǒ ǒ bl1S~*|:(z:Z;>h/:(/1p7B302<5;=f4,(<15.*)6;78$<>1n8z,(t>6=/=969;8!6L8(.=35$0*d; 811d7nSTPASCAL N LONG_MAXINT\\ SCREEN_DEVICE\BPRINTER_DEVICE \& MAX_C_STRING \ MAX_FN \ MAX_PATH \PALFA ]    SHORT_INTEGER] LONG_INTEGER ]|C_STRING ]BN V B8 STRING_PTR ]jB FILE_NAME] PATH_NAME]RP SHORT_ROUND6  SHORT_TRUNC6 x(l LONG_ROUND 6 P6D LONG_TRUNC 6 (DINT6 RCTOPSTRD`BPTOCSTRDnBST_SHL 6|~ST_SHR 6fZTPWROFTEN 6 *:.BASEPAGE D fCMD_ARGS 6 CMD_GETARG DOPTION 6 FILENAME 6 |pKEYPRESS 6V IO_RESULT66PEEK 6 WPEEK6 0LPEEK6 $POKE D2WPOKED@zLPOKEDNXRMOVE_B D\.("zMOVE_W DjMOVE_L DxCLOCK6SETDATED|vSETTIMEDRLF8GETDATED"GETTIMEDCUR_ON DCUR_OFFDCUR_UP DCUR_DOWN D CUR_RIGHTD`CUR_LEFT D CUR_UP_SCROLLD "CUR_DOWN_SCROLLD.CUR_HOME D< CLEAR_HOME DJp SAVE_CURSORDXRESTORE_CURSOR Df SELECT_COLOR D t.SELECT_BACKGROUNDD INV_ON DINV_OFFD DELETE_LINED CLEAR_LINE D< INSERT_LINED START_OF_LINED END_OF_LINEDP END_OF_SCREENDSTART_OF_SCREEND WRAP_ONDdWRAP_OFF DINSUPER6x*SUPERD 8PnSCRLEN_B \<}SCRLEN_W \&>BSCRLEN_L \@ERR_CODE ]SCREEN_B ] |} rSCREEN_I ] >} pSCREEN_L ] $X ?`}V 6 PTR_SCREEN ] L $PALETTE]  p| RESOLUTION ] SCREEN_TYPE] *RESQPALQ zPICQ" $h}" ^8 GET_SCREEN D F . PUT_SCREEN D T  READ_SCREEN6b WRITE_SCREEN 6p NO_PORT\ROOT \l NULL_INDEX \|bMAX_LEN\hQ MAX_DEPTH\RMAX_TREE \<d NO_WINDOW\& MAX_WTITLE \PR_TREE \TR_STRING \ E_KEYBOARD \E_BUTTON \E_MOUSE1 \E_MOUSE2 \ E_MESSAGE\tE_TIMER\` REPLACE_MODE \F TRANS_MODE \.XOR_MODE \(REV_TRANS_MODE \PAT1 \jPAT2 \PAT3 \RPAT4 \PAT5 \PAT6 \PAT7 \~PAT8 \l PAT9 \Z PAT10\H PAT11\6 PAT12\$ PAT13\PAT14\PAT15\PAT16\HPAT17\PAT18\PAT19\^PAT20\^PAT21\^PAT22\p^PAT23\^^PAT24\LbHATCH1 \8`HATCH2 \$^HATCH3 \\HATCH4 \ZHATCH5 \XHATCH6 \VHATCH7 \ THATCH8 \!HATCH9 \"HATCH10\#HATCH11\p$HATCH12\\%SOLID\JnLONGDASH \4DOTTED \ &DASHDOT\ DASHED \T DASHDOTDOT \\NORMAL \n THICKENED\z LIGHTENED\0SLANTED\ UNDERLINED \tOUTLINED \^pSHADOWED \H $ SYSTEM_FONT\0 SMALL_FONT \`G_BOX\BG_TEXT \< G_BOXTEXT\DG_IMAGE\ G_PROGDEF\G_IBOX \G_BUTTON \ G_BOXCHAR\rDG_STRING \\6G_FTEXT\Hf G_FBOXTEXT \0fG_ICON \zG_TITLE\ VNONE \ SELECTABLE \DEFAULT\XEXIT_BTN \EDITABLE \ RADIO_BTN\ LAST_OB\t TOUCH_EXIT \\@ HIDE_TREE\FPINDIRECT \0SELECTED \CROSSED\CHECKED\DISABLED \G_NAME \G_CLOSE\hG_FULL \G_MOVE \rG_INFO \xG_SIZE \d  G_UPARROW\N@ G_DNARROW\82G_VSLIDE \"XG_LARROW \ G_RARROW \VG_HSLIDE \G_ALL\nWHITE\BLACK\RED\GREEN\BLUE \vCYAN \dTYELLOW \PMAGENTA\<L_WHITE\(LL_BLACK\ L_RED\ :L_GREEN\ L_BLUE \ L_CYAN \ L_YELLOW \ L_MAGENTA\ MN_SELECTED\ WM_REDRAW\l WM_TOPPED\V WM_CLOSED\@ WM_FULLED\*< WM_ARROWED \BWM_HSLID \WM_VSLID \WM_SIZED \WM_MOVED \ WF_PREVXYWH\L WF_FULLXYWH\ WF_HSLIDE\t WF_VSLIDE\^ & WF_HSLSIZE \F WF_VSLSIZE \.AC_OPEN\(AC_CLOSE \) COLOR_REG]  DRAW_MODES ] B LINE_TYPES ] R PAINT_TYPES]Z %b GEM_DEVICE ]62 :*INQ_TYPE ]\ \^ OPEN_VALS\\EXT_VALS \\ MOUSE_TYPE ] M_ARROW\ M_TEXT_CURS\|M_BEE\j M_POINT_HAND \P M_FLAT_HAND\8 M_THIN_CROSS \\ M_THICK_CROSS\` M_OUTLN_CROSS\PTEXT_PTR ]XWORD16 ]   MOUSE_FORM ]tv*HOT_XQrHOT_YQ^RESQL MASK_COLOR Q2 DATA_COLOR QMASK Q DATA Q*J WINDOW_TITLE ]RPMESSAGE_BUFFER ]~  |\L CTRL_PARMS ]:B  J@&  INT_IN_PARMS ]x   d INT_OUT_PARMS] -\ PTS_IN_PARMS ]  ft PTS_OUT_PARMS]2J  RH( ADDR_IN_PARMS]p f \ADDR_OUT_PARMS ] fPOINT]XQYQb RECTANGLE]lF$2XQHYQ8WQ(HQ" STR30] STR255 ]TE_JUST] ~*TE_LEFT\nZTE_RIGHT \X TE_CENTER\B TREE_RANGE ] >* d2: TREE_INDEX ] f d *OB_TYPE]  ` TEXT_ED_INFO ]!ߴdTE_PTEXT Qjߒ TE_PTMPLTQjz TE_PVALIDQjbTE_FONTQ hTE_JUNK1 QPTE_JUSTQ:TE_COLOR Q"TE_JUNK2 Q TE_THICKNESS Q TE_TXTLENQ TE_TMPLENQ޾ ޘTED_PTR]!~!t SPEC_INFO]"zX0R>THICKQVCOLORQBINFO Q!PTRQSTRQj"OBJECT ]#OB_NEXTQOB_HEADQݰOB_TAILQݚOB_TYPEQ݄OB_FLAGS QlOB_STATE Q TxOB_SPECQ "z"OB_X Q*OB_Y Q|OB_W QOB_H Q"TREE ]#ܰ x#ܦ >ܢTREE_PTR ]#܊#܀*MENU_PTR ]#dJ DIALOG_PTR ]#P ICON_BLOCK ]%<|"8IB_PMASK Q6IB_PDATA QIB_PTEXT QIB_CHARQ IB_XCHAR QIB_YCHAR QIB_XICON QۨIB_YICON QېBIB_WICON QxIB_HICON Q`IB_XTEXT QHIB_YTEXT Q0IB_WTEXT QIB_HTEXT Q "$, BIT_BLOCK]&4ھnDVBI_PDATA QڸBI_WBQڤBI_HLQڐBI_X Q|BI_Y Q hBI_COLOR Q P%*.USER_BLK ]&UB_CODEQ UB_PARMQ&ZPARM_BLK ]'ٲPB_TREEQٮPB_OBJ Q٘ PB_PREVSTATE Q| PB_CURRSTATE Q`PB_X Q LPB_Y Q 8PB_W Q$PB_H QxPB_XCQPB_YCQPB_WCQPB_HCQPB_PARMQت&؄ ADD_DITEM6 fb~ #Vlf`ZTNHB ADD_MITEM6(# f ADD_MTITLE 6#lAES_CALL D׼xךהp׎׈ AES_VERSION6׈ BEGIN_MOUSED BEGIN_UPDATE D BORDER_RECTDBRING_TO_FRONT D  CENTER_DIALOGD #֊4 CLEAR_SCREEN D h CLOSE_WINDOW D X8 DELETE_DIALOGD &# DELETE_MENUD 4#( DELETE_WINDOWD BDO_ALERT 6P՚հ DO_DIALOG6Ֆ^#nՄHDRAGBOXD l `ZTNHB<60*ܞ DRAW_MENUD z# DRAW_MODED . DRAW_STRINGDԶ԰ԎhD_COLOR6ԒԆԀztn END_DIALOG D #*x END_MOUSED END_UPDATE D^ ERASE_MENU D #EXIT_GEM D4 FIND_ALERT DӔr FIND_DIALOGDf#D FIND_MENUD:# FIND_RESOURCE6 #"  FIND_WINDOW6 0 FIRST_RECT D>ҮҨҢҜҖ FRAME_ARCDLpjd^XR FRAME_OVAL DZ*$\ FRAME_RECT DhFRAME_ROUND_RECT DvѰѪѤў0 FREE_RESOURCED FRONT_WINDOW 6\t GET_DEDITD# f GET_EVENT6D мжаЪЈОИВЌІЀGET_EX_IN_FILE 6`82, GET_IN_FILE6,> GET_OUT_FILE 6 GET_WINDOW 6FGROWBOXDϤϞϘϒόφπzV HIDE_MOUSE DINIT_GEM 6> INIT_MOUSE D\JUSTIFIED_TEXT D,ΰ LINE_COLOR D :Έ LINE_ENDSTYLED Hztx LINE_STYLE D V0LINE_TOD d(" LINE_WIDTH D r LOAD_RESOURCE6 ʹ& MENU_CHECK D#͌ f͆͜ MENU_DISABLE D#V fP MENU_ENABLED#( f"& MENU_HILIGHT D# f MENU_NORMALD# f MENU_REGISTER6̶̔ MENU_TEXTD#n fhbMOVEBOXDZTNHB<MOVE_TOD  NEW_DIALOG 6# NEW_MENU 6#˜ˬˊ NEW_WINDOW 6ˊ(~\rlf` NEXT_RECTD6:4.("OBJ_DRAW DD# f f4OBJ_FIND 6ʾR#ʖʬʦʠʚ6 OBJ_FLAGS6ʀ`#X fR OBJ_OFFSET Dn#*@:4 OBJ_REDRAW D|# fܪ OBJ_SETFLAGS D# fɺ OBJ_SETSTATE D#Ɋ fɄɚɔOBJ_SIZE D#Rhb\VP OBJ_STATE66# f OPEN_WINDOWD PAINT_ARCDȾȸȲȬȦȠ PAINT_COLORD \` PAINT_OUTLINED N PAINT_OVAL D& ߔ PAINT_RECT DPAINT_ROUND_RECT DǬǦǠǚ PAINT_STYLED $rPLINED2PJD>LINE D@ PLOT D NvRECT_INTERSECT 6 \ƶưƪƤƞƘƒƌ REDO_DIALOG6pj#H^ RUBBERBOXDx82,& nSET_CLIP Dߦ SET_COLORDŠŶŰŪ SET_DEDITD#h fb\VPfD SET_DTEXTD# f( SET_MFORMD  SET_MOUSED ĺX SET_WINDOW D Į SET_WINFODĈf~ SET_WNAMED\: SET_WSIZED 0*$j SHOW_DIALOGD  #B SHOW_MOUSE D SHRINKBOXD .èâÜÖÐÊÄ~ SYS_FONT_SIZED <TNHBTEXT_ALIGNMENT D  J: TEXT_COLOR D  X TEXT_HEIGTHD  f TEXT_ROTATIOND  t–| TEXT_STYLE D  n VDI_CALL D& HB<6:x2WIND_GET D WIND_SET D  WORK_RECTD d^XRLZBSystemOSystem2GEMDECL&GEMAES0GEMVDI]DOSBIOS STPascal STPASCAL SHORT_RO SHORT_TR LONG_ROU LONG_TRU INT 8CTOPSTR DPTOCSTR ST_SHL ST_SHR PWROFTEN (BASEPAGE @CMD_ARGS LCMD_GETA rOPTION ~FILENAME KEYPRESS IO_RESUL PEEK WPEEK LPEEK POKE WPOKE LPOKE MOVE_B MOVE_W ,MOVE_L 4CLOCK PSETDATE \SETTIME hGETDATE tGETTIME CUR_ON CUR_OFF CUR_UP CUR_DOWN CUR_RIGH CUR_LEFT CUR_UP_S CUR_DOWN CUR_HOME CLEAR_HO SAVE_CUR RESTORE_ SELECT_C SELECT_B (INV_ON 4INV_OFF @DELETE_L LCLEAR_LI XINSERT_L dSTART_OF pEND_OF_L |END_OF_S START_OF WRAP_ON WRAP_OFF INSUPER SUPER GET_SCRE PUT_SCRE READ_SCR WRITE_SC ADD_DITE|ADD_MITEpADD_MTITAES_CALL AES_VERSBEGIN_MO6BEGIN_UPJBORDER_RBRING_TOCENTER_DrCLEAR_SCCLOSE_WI JDELETE_DdDELETE_MDELETE_W DO_ALERT$DO_DIALODRAGBOXDRAW_MENDRAW_MODDRAW_STRD_COLORHEND_DIALEND_MOUSBEND_UPDAERASE_ME EXIT_GEMFIND_ALEFIND_DIAFIND_MENFIND_RESFIND_WINbFIRST_REFRAME_ARFRAME_OVvFRAME_REFRAME_ROFREE_RESFRONT_WI0GET_DEDI*GET_EVEN`GET_EX_ITGET_IN_FlGET_OUT_GET_WINDGROWBOXHIDE_MOU INIT_GEMINIT_MOUXJUSTIFIELINE_COL@LINE_ENDLINE_STYRLINE_TO4LINE_WID~LOAD_RESMENU_CHEMENU_DISMENU_ENAMENU_HILMENU_NORMENU_REGMENU_TEXMOVEBOX.MOVE_TO >NEW_DIAL>.NEW_MENUNEW_WINDnNEXT_RECOBJ_DRAWpOBJ_FIND OBJ_FLAG|OBJ_OFFSOBJ_REDROBJ_SETF OBJ_SETSOBJ_SIZE OBJ_STATOPEN_WINPAINT_ARPAINT_CO PAINT_OUPAINT_OVjPAINT_REPAINT_ROPAINT_ST:PLINEFLINE^PLOTzRECT_INT<REDO_DIARUBBERBOSET_CLIPSET_COLO SET_DEDI SET_DTEXSET_MFORSET_MOUSSET_WIND>SET_WINF2SET_WNAM&SET_WSIZSHOW_DIASHOW_MOU(SHRINKBOfSYS_FONTdTEXT_ALITEXT_COLTEXT_HEILTEXT_ROT"TEXT_STYVDI_CALLNWIND_GETZWIND_SETVWORK_REC 4 ( 4 6 4 D 4 R  Z |  ( 4 @Z L f2  f: X r ~*  ~ ~ T ~ n    $ 2 "@ N \ 2j ,4x 84` Dfn Pt \" h$ t( ( 6 6 6 6 6 6 6. < 6J 6X 6f 6t X (X 46 @6 L6 X6 d6 p6 |6 6 6 6 6* 8 V*F T >b 6p 6 x P f 2 2Hy $ >J J ZV J& J VBgN~ J dANq J rHz J Hy" J N NqNq ~ 6N  $ dN J$ 4`$$0^0<0jH$Tb`0lH,Z3xpr*H:0.J"nJDLE ""IAE .ZVdvx.S_FOf.:XT_A.HXT_C4p6| <Pf|NESSz$&F &$((t B& 20>t$Jt$V0 b0>n06z0\~8&:L $ : :8V$ $ $ ` X"$ . : 2Fl0@Rl0d^(NjN$v0hH\$ZB~6vd$6LFz0  $*6BN Z0 f0 <r8 ~h$  0 X PHH$ bl@x00(8 .48r@ HL" tX ,d0 Jp* R|2n(0""&DD<L|. f8$ & >0&&&&$6l((0(B( lnl|&|<JVx| d X,lnRl|f|pd X~@N\hxd d dr~x|$8L|d X`|d d *4>Jx | $&&|lxlljl*t*t*t*t*t*t*t J*t*t*t*t6<Ht6<Ht*t*t*t*t*t*t*t*t*t*t*t ddd,l2d>dDlJd h&.hdh$ h&4h|(*.^&~&&p|(8.^4~44p t(dd d*d@ttFdLddpddpdVd:d$dddrd dp(t||$`2D|Tt x:dddd<Nd $`d $ld $Ld dd rd d d dd Vtdd HdVdddrdxt@|Zhdndn|(|:|b|d $dndndn<t\ddd d&tTtlt\|t"d`tVtdn dn2t@d`Nd`||$`2D|Rdn`dnvtd`d`||.d ^d~dd~dd~&dPd~td~dd^ddd&*d2d\htntd|ddddd Zdfd~t@d"d2dhv`dddddd d:dTdHdTdddt@ dd2t@T|zdd:dHdVddd6H|ZdddXblxxd $|"d2dDdTd dndd t@dBd dt@|dd*d@dZdfd ddx(t@*8dntttt"t:tttt$Jd ftdLd fttt"d ` 2|Jx6ZxDdd ` 2|Jx6ZxDdd "d "d "d "d Lx` ddd$d*d d dd&d .d d2d@p` dpd.p dpd,p dp dpJd p.&d.pJ4d>pPdZp.td~p.dp<dp.dp< d dp dp dddd*d8dDdLdRd`pdd*d8dDdLdRd`p ddd2dd(d0d6dDpdd.dBdNdXp^dxdhdd.d>dPdddtdddddp dd d0p26dPdZ dd d6p\dd.dBdNdXpN^dhdrp@dd.dBdNdXp@ dd d8pj>dHdRd^dvp\ dd d8p\|$`2D|JdTd`dlptttt dpttttt t"t"t* d |6|$`2D|NtFTxtbtbtb$d` tT` 2|Ft24d@dJdTdZx`djddddd.d ddd$d,d2d dddd&d0d:dDdddddddd6dVdxddddd$dHdlddddd dDdhdddddd@dbdddddd0dRdtddddd dBdddddddd0dRdtdddddd:d^ddddd d 2d Td2t "t"t.*t<*tJ dp dp dp|$`2D|JdTd`dxpx d p tjtxttb.t\"t\ ddd d&d,pt\ dddd$d*d0d6dxNqNqNV/.Hn?< CNHnB?<SN=@ N^.NuNqNqNV/.Hn?< CNHnB?<QN=@ N^.NuNqNqNV/.Hn?< CNHnB?<SN-@ N^.NuNqNqNV/.Hn?< CNHnB?<QN-@ N^.NuNqNqNV .=@ N^.NuNqNqNVAFC2""HnHn?< NHnHn?< NA"n ""2N^ _TN@]ݩNqNqNV . ".-@N^ _PNNqNqNV . ".-@N^ _PNNqNqNV"n"N^.NuNVHHnHnHnHnN0.Hr 100 objects) - abortingNVHU/.N=_0.&nG7n0+@ n7@Bk 0. 7@0. 7@0. 7@0. 7@?.HnN?<N?<N?<N?<NXHnNgFHnHxN(nBBB9| Bl9n9n BlBl'n `7n 7n/.Bg?.N0.@LN^ _ONNVH/. Hn?<N.H&nG0+ @g @ g @f*Hk p.R@H/NHn/+ N` @fp.H2+ HA7@ ` @g @g @g @fd(k JgHT0,H/NHTp.R@H/NHn/NBB9n .H9@p.R@9@BlLN^ _ONNVH/.Hn?<N/.Hn?<N/. Hn?<N.H&n&s JgHS0+H/NJgHk0+H/NJg HkNp.HzHn&N_TC=CHS0.H/NHn/NHkp.R@H/NHn/+NHkp.R@H/NHn/+N7n .H7@7np.R@7@.H&nG0+@7@LN^ _ON_NqNqNV. H"n3 J.g/.. H?BgBgBgBgBgNN^ _O NNqNqNV.H n =p N^ _\NNVH. H&n G0+@ n7@&_N^ _PNNqNqNV.H n =pN^ _\NNqNqNV/.HyHyHyHyNN^.NuNVH&n 0+[@=@0+[@=@0+@ =@0+@ =@BgBgBgBgBg?.?.?.?.N/. Bg?<BgBgBgBgNU/. ?.N=_&_N^ _\NNqNqNV. H n p //.NN^ _O NNqNqNVU/. ?.N=_N^ _\NNVH&n0+[@=@0+[@=@0+@ =@0+@ =@?<BgBgBgBg?.?.?.?.N&_N^.NuNqNqNV/. HnN/.HnNHnHnHnNHn/. NHn/.Np n =@0.r n 0 \g Sn`Hn/. ?<?.N/.HnNHn/.?<PN nWD@N^ _PNNqNqNV/.Hn?<NHnHnNHzHnNHnHn?<N/.HnN/. HnNHnHnHnHnNHn/.NHn/. Np n=@0.r n0 \g Sn`Hn/.?<?.N/. HnNHn/. ?<PN nWD@N^ _O NNqNqNV/. Hn?<NY?<BgBg?<&?<N-_U/.?<Bg?<Bgp.??<??.?.4?.2?.0?..?.?.*?.(?.&?.$/. .8H? .8XH?/./. /./././.N=_DN^ _OHnNHn/.?<NU?. nHhN=_N^ _\NNqNqNV"n2$"n3n"n3n "n3n" "n3y /.# /.#/.#HyL#/. #J.g`0.HrAmR=A=@`Rn0.d0.H29 "nq`0.H29"nq0.nfHy "psNBJ.g`0.HrAmR=A=@`Rn0.d0.H29 "n q`0.H29"n q0.nfN^ _ONNqNqNV383:3 <3 >3@Hy "0<NBN^ _O NNqNqNVHy8# HyP#$/.#(/.#,/. #0/.#40. @ f?< Bg?<BgBgN` @ f?< ?<?<?<BgN` @ f?< ?<?<?<BgN` @ f?< Bg?<?<BgN` @f?<?<?<?<BgN`` @f?<?<?<?<BgN`< @f?<Bg?<BgBgN` @f?<Bg?<BgBgN` @f?<?<?<BgBgN` @f?<?<?<BgBgN` @f?<Bg?<?<BgN` @f?<?<?<BgBgN`t @f?<?<?<?<BgN`P @f?<?<?<BgBgN`. @f?<?<?<?<BgN` @f?<?<?<?<BgN` @ f?< ?<?<?<BgN` @!f?<!?<?<?<BgN` @"f?<"?<?<?<BgN`z @#f?<#?<?<?<BgN`V @(f?<(?<?<?<BgN`2 @)f?<)?<?<?<BgN` @*f?<*?<?<?<BgN` @+f?<+?<?<?<BgN` @,f?<,?<?<?<BgN` @-f?<-?<?<?<BgN`~ @.f?<.?<?<?<BgN`Z @/f?</?<?<?<BgN`6 @2f?<2?<?<?<BgN` @3f?<3?< ?<BgBgN` @4f?<4?<?<?<BgN` @5f?<5?<?<BgBgN` @6f?<6Bg?<?<BgN` @Ff?<F?<?<BgBgN`f @Gf?<G?<?<BgBgN`D @Hf?<H?<?<BgBgN`" @If?<I?<?<BgBgN` @Jf?<J?<?<BgBgN` @Kf?<K?<?<?<BgN` @Lf?<L?<?<?<BgN` @Mf?<MBg?<BgBgN`v @Nf?<N?<?<?<BgN`R @Of?<OBg?<BgBgN`2 @Pf?<PBg?<?<BgN` @Qf?<QBg?<?<BgN` @Zf?<ZBg?<?<BgN` @[f?<[Bg?<?<BgN` @df?<d?<?<BgBgN` @ef?<e?<?<BgBgN`f @ff?<f?<?<BgBgN`D @gf?<g?<?<BgBgN`" @hf?<h?<?<BgBgN` @if?<i?<?<BgBgN` @jf?<j?<?<BgBgN` @kf?<k?<?<BgBgN` @lf?<l?<?<BgBgN`x @mf?<mBgBgBgBgN`Z @nf?<nBg?<?<BgN`8 @of?<oBg?<BgBgN` @pf?<p?<?<Bg?<N` @qf?<q?<?<?<BgN` @xf?<xBg?<?<BgN` @yf?<y?<?<?<BgN` @zf?<z?<?<?<BgN`f @{f?<{?<?<?<BgN`B @|f?<|Bg?<?<BgN` @}f?<}Bg?<?<BgNN^ _ONNqNqNV?.?.?.?.?.?.?.?./. /.NN^ _ONNqNqNV?.?.?.?./. /.NN^ _ONNqNqNV?.?. ?.?.?. ?.NN^ _O NNqNqNV?.?.?.?.?.?. ?. ?.NN^ _ONNqNqNV?.?.?.?.?.?. ?. ?.NN^ _ONNqNqNV?9?.NN^ _TNNqNqNV?9?. ?.NN^.NuNqNqNV?9?.NN^ _TNNqNqNV/.Hn?<NHnHnNHz\HnNHnHn?<N?90.y?0.y ?Hn?.?.?. NN^ _ONNqNqNV?9?. ?.Hn HnNN^.NuNqNqNVU/.?.?. ?. ?.N=_N^ _O NNqNqNV/.?./. /.NN^ _ONNqNqNVU?. ?.N=_ N^.NuNqNqNV?. ?.HnN-n N^.NuNVH0.&nG"n2"n2"n 2"n2&_N^ _ONNqNqNV/..H?.H??.?. ?. ?.NN^ _ONNqNqNV0.r h2.IA2. IAn=@J. g0.@=@=nN^ _O NNqNqNV/. .H??<BgBgBgBgNN^ _\NNqNqNV?9?.HyHyHyHyNN^ _TNNqNqNV/.Bg?<BgBgBgBgNN^.NuNqNqNVByByByBy By"B9NN^Nu* Function GetEnv( MatchStr : String ) : String; Returns the value of a specific enviroUNI2V h^V26txx7~,P\ffUTILUNIT NVERSION\*`?STRINQ>BSTROUT Q>,STRDATAQINT2STR6 EXIST6 (WAITTOGO D 6NOSPACES 6 DUPPERSTR 6 lR` CLEARSTRINOUTD`HZ2006&n,BSystemoOSystem2]DOS UtilUnit |UTILUNITINT2STREXISTWAITTOGONOSPACESUPPERSTRCLEARSTR|HZ200n"(h0:6( Dd$R`2$STRINOUTB p`pBpBp|&p*p8p*<pPppTppB p0p|pBl(pBp|&p>pFpZp|pBp|Rpzp|pBdpd$p(ppBd$d,p2d@dJp|^pndzdppBddp d*p.p2d:p.>pBdLpPpTd\p<`pNNVB?< NA-x/@NA\ON^NuNNVXNqNq/.Hn?<ONHnZHnNNHnZB?<NN=_XJnXfHnZNNJnXWD@ N^.NuNNVNqNq0.H/BgHn?<NHn/. ?<NN^ _TNNNVNqNqUN0r.AfN^ _TNNNVNqNq/.Hn?<NHzDHnN0J@oHnHz,HnN?<N`Hn/. ?<NN^.Nu NNVNqNq/.Hn?<Np.reDA@`R.p.r.tA0?Nr2C..fHn/. ?<NN^.NuNNVNqNqHyNJfHyNN`N^NuNNVH&nJga n'f=|2Rn0.|oBn non ` nfa.g80.`&0.nfRn`"0.nfa=|'`` |(g԰|)g`N^NuNVBn`>NHNHH@@?W0.м8 @1_>NH/H@D@?SW0.м8 @1_Rn0.ym^N^NuNVBn` yl>NHH@=@09м8 @2.Ҽ8"A009м8 @2.Ҽ8"A1i>NH/H@D@?SW09м8 @1_RyRn nmDN^NuNVHBG`X0м8 @Jhl(0 @"|800D@2Ҽ8"A3@`. 0м8/aXRGymBG`0м8.a<|f0 @"|80p 2Ҽ8"A0Q0 @"|80p H2Ҽ8"A0i>NH H@|lH>NHH@2Ҽ8"A2)AH0H@?0м8 @1_`JFf.>NH0H@?0м8 @1_`p no0м8.az>NH H@2Ҽ8"A2)H A|H0H@?0м8 @1_RGymtBG`:0 @"|800H @Hм H.0м8/a$XRGymJLN^NuNVH *n0m <U0m H:mJFm|N(@0P0H@H(<p2|A@BG`20G"| 0r4|BA"”gp`RGP|mpJL0N^NuNVH*n0m >U0m H<m. ??a*XJL N^NuNV. n?( n?aXN^NuNVH >.<. *n >N(@0P0H@H(<p2|A@BE` F r4|BA㠁REP|mJL0N^NuNV30.|Hм-@=|` nH2n2RRn nm.4NB@09&N^NuNV####&###4> aF3&pN^NuNV>a*pN^NuNV33 3  3 333333333 3" #$3("3*$>N n,0( n00* n40, n80. n<00 n@02B@09&N^NuNV3# >#NN^Nu#NN/9Nu#NM/9Nu#NA/9Nu ww<~~~vp_pn~~~<UUUU Killerkrabben l$"   *   ,$* 100000); End. ab Function Include( NewStr, MainStr : String; Index : Byte ); Returns MainStr with NewStr inserted at position Index. MainStr is not affected by the call to Include. Except for this the rules for the Include function are the same as for the Insert procedure. See also: Insert Program Include_Demo; Begin WriteLn(Include('IS ','ATARI GREAT',7)); End.   "*Procedure Insert( New : String; var Main : String; Index : Byte ); Inserts New into Main at position Index. See also: Include, Copy, Delete, Length, Pos Program Insert_Demo; Var S : String; Begin S := 'Hello'; Insert(' World!',S,6); WriteLn(S); End.  Procedure InsLine; Inserts a blank line on the screen. All lines under and including the current line will be scrolled down, and the bottom line`n ``hx>>> TURBO-C <<<< for ATARI-ST Version 2.0 (C)88-90 Borland International &H f&op`B@#Z3^ k #d Ј<.@x#`Jy^g<"@(I$k,"Jf"JfB// ?<?<JNAO A6<HCBB`6 !jBJ)gHiRC` "fSI "WJAkHiRCBSQJ)gHiRCHy`$ON 0 J"LN ? 9g @N 9g @NN ?<LNA?/J@l4DB`4JAl6DC`6Bl8`86JDg4J08LA2H…0Hĉ2`B@20(6NuH0YOGtkvk8B:CEC JrEp DNvCArEpDNd0/W@5@2Sf4*kfkgp`B@XOL 8NuAC23h3hNuH QO$Hpytyr@v @xB40PS@>0jU@?@0PR@?@2jTA?AA09N 00jS@>2jUA?A4jRB?B6jTC?CA09N POLNuHQOA>?hp4P?@r*h?AvPxhG0BAN r0N A0N r0N BA0N p ?r?tDrC0N JXOp ?r?tDr C0N 2XOr0N r0N POLNuH0QO6E2nGHWHot*?p4??CAB@2+4+N OJ@g??/BBBA0+N XO4J@oJCg&r*?t4???+v?rSpk4N *O pkgBgBgHyr0N PO??/4/2/ 0N XO`BgBgBgBgr 0N POr0*Nr0*Nr0*Nr0*NPOL Nu?YO6pN HWHoHoHor B@N OJ@f?|0N09o2/oBgBgBgBg0r N O:E2o pN :GHoHoHoHor0N &OIHo Ho"Ho$Ho&r 0N OK0,n 2,nRm`Bm mc6->RC|;CHpjHCj8->RD|;DHrjHDjrDpCN .J@fhHWHop*?r4??CA4B@2-N O??/?/?/ r0NPOHoHo HyHyr0N,OBm`0* SR@2+@l`2* SRA7A0* kR@4+@l` 4* kRB7B0<NM `v"L KNJ@gN<=l0lS@=@2,lSA=A N0*rNVJEgNJEf U}g MN(AN Ho Ho"Ho$Ho&r 0N^O0,o2,n~0<N0Ar0*NNB@N"O"L|8NuH0&HBCE0m 2+@fx`BD0||b@0;N,X~XJDg2*0*NpNH33`JDgpN|BgBgBgBgr 0NPOB@Nd`lJDghpNXpNB@NLBy09^gHv`DJDg@2+ 0+N`20+jf(pNpNB@N 3` 0+jfBR0L NuH>OBCGEMKIx0-n(2.g"Rn n opN0-n| `Bn 0-o|"HoHo Ho&Ho$HyBg?<BgBgBgBgBgBgBgBgBgBgp?CA64r0NO.8| f2-Vf 4ngpDg AN 60-orDg4 Tf. of&pNpNTB@NBn09^gv`pDgb Tf\ ofTHWHoHo Hor0-NOp*m?r4m??-?-?"J K40/ 2/ NO 20N"p Dg,2-Vf4ng20-NpJ@gB@N<=UJCgZO L|NuH8OvIN9@J@mB@Er` 2A5R@| m5|GHoHo"K KN8PO9@HWC JN XO0,gzHyHyHyHyrB@NO0l9@2,l 9A0y4,y29^fA0,N9@B@NPNj0,NFNB@OLNuA(p"@ "By:A1B3:3 g/ &S?<INA\O`GB g/ &S?<INA\O`&_NuC2222A1|Bhrr`NABh1|1Ar`4A1ABh1|r`ABh1|1Arh`ABh1|1Ar `C3|3|3AC02222A2<`ABhBhre`A1|Bh1| 1A01B21o41o6r `r3/ C2dBi3| Cp 2Q"<TpsNB _0A\"op,2QAp 2QNu\\1@ 0"<FpsNBA\0Nup `Bp`<#/ A\00000 0 0000000000 pa"_2"o2"o"2"o&2"o*2"o.2Nu3\#p#`/ /pMa"_2"_2"o2"o2Nu/ /A\0000 0000pGan"_2"_2NuA\0000000 0 pI`>A\0000000 0 pJ`#3\pN`/ ?A\00pha2CSA|;$Y4Q$_NuA\00000pd`A\00000pe`3\pg`A\000000 pi`d3\3^pj`R/ /A\0000 00pla0"_2"_2"o 2"o2Nu3\pf`3\pk`3@@A CB@22220<"<NBA\0Nu\\ 1AY&U}}}}}eyes Eyes \\r  fZ @:*~ 8  ,R$vF<.Tb* B "0  j00&&> 4 2ntouchedUNI2 O4 O4 J F G^ Fffb J J D O4h$j)~V@P DEMOGRAPHS N MAKEGRAPHDATADFORCEGRAPHICSREDRAWD(DOBOXESD6DOLINESDD DOELLIPSES DRDOPIES D`ZbBSystem-OSystem2GEMDECL&GEMAES-0GEMVDID; DEMOINTERFACE DemoGraphsEncl, Ge, GenMAKEGRAPFORCEGRADOBOXESDOLINESDOELLIPSDOPIES`- o_z4$(T0 < 6TD^RH`H |^.d8h>hH|lPhVh`|ljhx|lh|l|l|l|l|l hdd d&d,p dzhd&d.d6d>hLp`"h0l dzhlJ>dHhRl<Xhbl.jdxdddhl dzd dHdVdfdndtd|dddddddddddddddd ddd,d2dDdJd dzhlJ>dHhRl<Xhbl.hhpd|dl2 dzhlJ>dHhRl<Xhbl.hhpd|dljNVHNprP@m=@=A`Rn0.HGG09yS@?N609yS@?N7_09H?N7_09H?N7_?<N7_?<N7_ ?<N0T@7@ ?< N0R@7@0.nf@&_N^NuNqNqNV?9?<HyHyHyHyNN^NuNqNqNVN=|=y=y=y=y=y?9?<HnNN^NuNqNqNV=n=n =n =n?9 ?<HnNN^ _PNNVHN?9 ?<NprP@m=@=A`Rn0.HGG?9 ?+ N?9 ?+N0y=@0+y=@0ykS@=@0+ykS@=@?9 HnN0.nfr&_N^NuNqNqNVN09H=@09H=@pr'@m$=@=A`Rn?90.y?0.y?09y?N09y?0.y?09y2.A?09y?N?909y2.A?0.y??9N09y?09y2.A?09y2.A??9N0.nfN^NuNVHN?9 ?<NprP@mv=@=A`Rn0.HGG?9 ?+ N?9 ?+N?9 0y?0+y??+?+N0.nf&_N^NuNVHN?9 ?<NprP@m~=@=A`Rn0.HGG?9 ?+ N?9 ?+N?9 0y?0+y??+?+?+?+ N0.nf&_N^NuUNI2$pV " j D; " " h$j)~,,^Jv.6^*f8 DEMOINTERFACENMAINMENU \ZDESKMENU \DQUITMENU \.WINMENU\SLCTDEMO \ELLIPSES \PIES \ABOUTBAR \LINES\BOXES\tWINCLOSE \TXTCLOSE \vTXTOPEN\bGRAOPEN\NGRASELEC \8\GRACLOSE \"QUITBAR\lABOUTBOX \ABOUTOK\OBJECT ]O_NEXT QO_STARTQO_ENDQO_TYPE QpO_FLAGSQZO_STATUS Q B|O_SPEC Q f,O_XQO_YQO_WQO_HQTREE ] 2TREEPTR]rhDEMOTYPE ]L 8 BOXESDEMO\& LINESDEMO\ ELLIPSESDEMO \PIESDEMO \SETSTATE ] S_ENABLE \h S_DISABLE\S_LEAVE\zMENU QbABOUTQN SELECTIONQ6 VDI_HANDLE Q 4 AES_HANDLE Q TEXTWINDOW Qx GRAFWINDOW QDEMO QMINX QMINY QMAXW QMAXH QQUIT Qn CHARBOXHEIGHTQ R CHARHEIGHT Q"8 FATALERROR D INIT_GEM 6(END_GEMD6 INIT_RESOURCEDDB END_RESOURCE DRSETOBJECTSTATUSD`HZT SETMENUSTATE Dn |;BSystem^OSystem2GEMDECL&GEMAES0GEMVDIBIOS%GEMDEMO.H - read resource constants DemoInterface|DEMOINTE|FATALERRINIT_GEMEND_GEMINIT_RESEND_RESOSETOBJEC^SETMENUS(6D0DR `"6n (|||"|(|.xR4|:|@|FxRL|X|t^|d|jxRp|||t||xR||t|x(| h$|`2|D||Tp`p(fdldxddptddlddddpddd$d*p<4p:dddd$d*pJ0d6l(<p||` |2||<pFDp^||hpFpp~d6ddpbdpbdpbdndd`dd`d d`dd`"d.d`4d>p dppTd$p6dBpnd~dddd ddd dNqNqNV/.Hn?<NHyNNNHyNNNHyHztBgNNNNHyHnBgNNNNHyHzRBgNXNUN=_BgNN^.Nu%>>> Fatal error condition arised! <<<Press a key to abort...NqNqNVUN0 @lDHz.HnNHz`HnNHnHn?<NU?<HnN=_UN3JymUHy"HnHy HnN3 pr @m,=@=A`Rn0.HC30.nf=| HnHy HnNBg?<HyHyHyHyNBgBgBgBg?9?9?9?9NBgBNJy\D@N^Nu?[0][ |Note! The icons will look a |bit odd in this resolution.% |High res. looks nicest |][ Ok ]NqNqNVBgBgBgBg?9?9?9?9N?9 NNN^NuNqNqNVHzHzHn?<NHnNUN0J@fNHzNBgBgHyNBg?<HyNBg?<HyN<B'<B'<N/9?<BgN/9?<?<N/9?<BgN/9?<BgN/9?<BgN/9?<NN^Nu GEMDEMO.RSCGEMDEMO\GEMDEMO.RSC GEMDEMO.RSC is missing!NqNqNV/9BgNNN^NuNqNqNV0. "n 3 N^ _PNNqNqNV. f/9?. ?<N`( f/9?. BgN` fN^ _PNNqNqNV.?</N.?</N. ?</N. ?</N.?</NN^ _O NNqNqNVB9B933N^NuUNI2 B B>[ }r |N | |8hA }r }r z B $j)~\`DEMOMENU N HANDLEMENU D JD^ABSystemGOSystem2GEMDECL&GEMAESB; DEMOINTERFACE DEMOWINDOWS DemoMenuE6NU.PASBHANDLEME6(BH< l p@pbphlp\lpppll`"d(@hRh6dhDvhh(hRllpNqNqNV/9HnHnHnHnNBgBgBgBgBg?.?.?.?.N?<BgBgBgBg?.?.?.?.N/9Bg?<?.?.?.?.NU/9?" FULLWINDOW D | CLOSEWINDOWD n MOVEWINDOW DJ SIZEWINDOW DCLOSETOPWINDOW DjBSystemgOSystem2GEMDECL&GEMAES0GEMVDI; DEMOINTERFACEb DEMOGRAPHS DemoWindowsDEMOWINDOPENGRAPCLOSEGRAOPENTEXTCLOSETEX SELECTGRREDRAWWI@TOPWINDOLFULLWINDXCLOSEWINpMOVEWIND|SIZEWINDdCLOSETOP?. r(T6D TR:Z2@P`P$\dnL&|X*d.p2 |~` 0 dll$d*d2lDdJlPlVd\dbdldrdvd|dddd ddll$l*l0t6l<lJtPl\dbx6jdpxDzt*ddddddddt<lddddtlnt ltl8tztJltltlllnlnt ddll$l*l0t6l<lJtPl\dbx6jdpxDzt*ddddddddt<lddddtlnt ltl8tztJltltlllnlnt l t@tbthlt\ltttlll,l2h( l$t*l<lJl^ddpjllh6hDhRh`tt$tbx`lp`lpJlp.lpld$ d2*t:tBtt*"t@t^tt*t*lh(ldD"d( t*d"t@t.^t*hlrh("t@t*JlTh(d|"d,|6d@|HdPdNqNqNV309 Hy 309H29@AH309y 3 09y@3 333 N^NuNqNqNVNU?9?9?9?9?9N3Jym?<N?9?<UHyNUHyNBgBgN09Hy [@?09Hy[@??< ?< ?9 ?9?9?9N?9?9 ?9?9?9NB'<<<B'NBgNN^NuNqNqNVJym?<N?9?<HnHnHnHnN0.Hn[@?0.Hn[@??< ?< ?.?.?.?.N?9N?9N3Jym<<<B'<N`<<<B'<NBgNN^NuNqNqNVNU?9?9?9?9?9N3Jym?<N?9?<UHyNUHyNBgBgN09Hy[@?09 Hy[@??< ?< ?9?9?9?9 N?9?9?9?9?9 NB'<B'<<NBgNN^NuNqNqNVJym?<N?9?<HnHnHnHnN0.Hn[@?0.Hn[@??< ?< ?.?.?.?.N?9N?9N3Jym<B'<<<N`<B'<<<NBgNN^NuNqNqNV/9HnHnHnHnNBgBgBgBgBg?.?.?.?.N?<BgBgBgBg?.?.?.?.N/9Bg?<?.?.?.?.NU/9?GEMINT NFRAMEBOX \`MSGBOX \LMSGSTR \8OKBUTTON \"C_STRING ]  t STRING_PTR ]OB_TYPE]  SPEC_INFO]RZ,THICKQTCOLORQ@STRQ OBJECT ]nOB_NEXTQOB_HEADQOB_TAILQOB_TYPEQOB_FLAGS QOB_STATE Q xxOB_SPECQ RJOB_X QNOB_Y Q:|OB_W Q&OB_H QvTREE ] nTREE_PTR ]WORKIN QWORKOUTQjn. AES_HANDLE Qz\ VDI_HANDLE Q|BCHARDEFS Q~D.H_CHAR Q W_CHAR QH_BOXQW_BOXQVvMINX QMINY QMAXX Q|MAXY Qh MAXCOLORSQP OUTPUTWINDOW Q$HANDLE QBX QBY QBW QBH QWX Q WY Q WW QWH QMIDX QpMIDY Q\L: MESSAGEBOX QINIT_GEM 6EXIT_GEM D(pMESSAGED 6INFORM D DERRORCLOSEDOWN D R|MAXW 6f`MAXH 6JnBINARY 6 ,| vOPENOUTPUTWINDOW DCLOSEOUTPUTWINDOWDCLEAROUTPUTWINDOWDRBSystem OSystem2GEMDECL0GEMVDI}&GEMAESaBIOSu GemInt0RGEMINTINIT_GEMEXIT_GEMMESSAGEINFORMERRORCLO MAXWMAXH"BINARY.OPENOUTP:CLOSEOUTFCLEAROUTSETUPMES.*(<*6rDHR <` n" |.:TF RZ 0 d|dd,d4dFdLd`dlddddddl@dd&d4df|pd~l@ddddd|dl@d&l\ l(dd>dXd^dtltxd~dddplddddlddddddd|| ld(| h:||HlPdTd`l dd|(l,d2p(6l|||d$d(d2dHl\\|l||x|`|||d|dl\ldll||d$d(d:l\N|Z|j||rd|dl\||"|`.|:|J||Tlblpltd(z| dd dd||N|V|^|h|x ddd.d`>dnblpdvt6|dtDl*ll8d dll dpdFdTp`Xd`pJddnp.rd|pdpJdp. dd||NVHHyHx`N&y0927@09~H29~HA7@09ykH7@09~Hy7@67|7|7|Bk7| Bk0+kX@3&yGBkBk0927@09~H7@67|7|7|BkBk Bk/9Bg?<N&yG009H7@Bk0927@09~H7@67|7|7|BkBk Hk Hx2N k B/9?<?<N&yGH09(7@09~7@09H7@7y~67|7|7|7|'Bk Hk HxN"k O"k |k k B(/9Bg?<N/9Bg?<BgBgBgBgN&_N^NuNVHUN3zJyzmPpr @m.=@=A`Rn0.HC30.nf3G~UHkHSHkHkN3|HyHy|HyNBgBNBg?<HyHyHyHyN09y09y09y293Al.HzHn?<NU?<HnN=_NBgNUN0 @l$HzHn?<NU?<HnN=_3V?<BN|`B.&_N^Nu\[3][ | The demo won't run on screens | with less than 51 characters | per line ][ Sorry ] T[1][|The demo looks best in |high resolution, but can |run in medium too][ Ok ] NqNqNVJgHyHx`N?<BN?9|NNN^NuNqNqNV/.Hn?<NJfN yBhR/9?<?<BgBgBgBgNHnHn?<?<1NHnHn?<NHnHnNHzzHnNHnHn?<NHn y/(r *   , x nBIOS NDMAREAD6^RRLF@DMAWRITE 6&(R NVMACCESS66RBCONMAP6 fD ESETSHIFT6 R~ EGETSHIFT6l`ESETBANK 6 Ln@ ESETCOLOR6 &| ESETPALETTEDR` EGETPALETTEDRESETGRAY 6  ESETSMEAR6 l`INITMOUS Df:f4.SSBRK6 f PHYSBASE 6fLOGBASE6fGETREZ 6 SETSCREENDff~ SETPALETTE D fVSETCOLOR 6 <$0*FLOPRD 62ffFLOPWR 6@ffFLOPFMT6 N vpjd^XRfLfFMIDIWS D\f"MFPINT DjfIOREC6 fxjKEYTBL 6ffff@X_RANDOM 6*PROTOBTD\VPfJ>FLOPVER62& ffSCRDMP DCURSCONF 6 XSETTIME D XGETTIME 6xBIOSKEYS DIKBDWS Df.(JDISINTD JENABINT D  GIACCESS 6 .RSCONF 6<|vpOFFGIBIT D JJONGIBITD X&DXBTIMERDffDOSOUNDD tf SETPRT 6 KBDVBASE 6fKBRATE 6 pd^PRTBLK D f:VSYNCDSUPEXECD fPUNTAESD GETMPB D fBCONSTAT 6  BCONIN 6 znBCONOUTD JDRWABS6."f SETEXC 6f*fTICKCAL68GETBPB 6 fF@BCOSTAT6 TzMEDIACH6 bbVDRVMAP 6>pKBSHIFT6 ~E_OK \ERROR\"EDRVNR \EUNCMD \E_CRC\$EBADRG \E_SEEK \EMEDIA \|ESECNF \hEPAPER \TEWRITEF\@EREADF \,0EWRPRO \E_CHNG \EUNDEV \`EBADSF \EOTHER \$BSystemOSystem2 Bios d,dDMAREADDMAWRITENVMACCESBCONMAPESETSHIFEGETSHIFESETBANKESETCOLOESETPALEEGETPALEESETGRAYESETSMEAINITMOUS(SSBRK4PHYSBASE@LOGBASELGETREZXSETSCREEdSETPALETpSETCOLOR|FLOPRDFLOPWRFLOPFMTMIDIWSMFPINTIORECKEYTBLX_RANDOMPROTOBTFLOPVERSCRDMP CURSCONFXSETTIME$XGETTIME0BIOSKEYS<IKBDWSHJDISINTTJENABINT`GIACCESSRSCONFlOFFGIBITxONGIBITXBTIMERDOSOUNDSETPRTKBDVBASEKBRATEPRTBLKVSYNCSUPEXECPUNTAESGETMPBBCONSTATBCONINBCONOUT RWABS,SETEXC8TICKCALDGETBPBPBCOSTAT\MEDIACHhDRVMAPtKBSHIFT,(,6,DR`n|""("4@LXd$p$|28@8N@\jx<4((8 $0<HT `.lJxXf(t ,0*8 8DFPT\bhpt~NV?./.?. /.?<*NN-@N^ _O NNV?./.?. /.?<+NN-@N^ _O NNV/.?. ?. ?.?<.NN =@N^ _O NNV?.?<,NNXO-@ N^ _TNNV?.?<PNNXO=@ N^ _TNNV?<QNNTO=@N^NuNV?.?<RNNXO=@ N^ _TNNV?. ?.?<SNN\O=@ N^.NuNV/. ?. ?.?<TNN N^ _PNNV/. ?. ?.?<UNN N^ _PNNV?.?<VNNXO=@ N^ _TNNV?.?<WNNXO=@ N^ _TNNV/./. ?.BgNN N^ _O NNV?.?<NNXO-@ N^ _TNNV?<NNTO-@N^NuNV?<NNTO-@N^NuNV?<NNTO=@N^NuNV?./. /.?<NN N^ _O NNV/.?<NN\ON^.NuNV?. ?.?<NN\O=@ N^.NuNV?.?.?.?.?./. /.?<NN=@N^ _ONNV?.?.?.?.?./. /.?< NN=@N^ _ONNV?./.?.?.?.?.?./. /.?< NN=@ N^ _ONNV/. ?.?< NNPON^ _\NNV/. ?.?< NNPON^ _\NNV?.?<NNXO-@ N^ _TNNV?.?.?.?. ?. ?.?<NN-@N^ _O NNV/./. /.?<NN-@N^ _O NNV?<NNTO-@N^NuNV?.?./. /.?<NNN^ _O NNV?.?.?.?.?./. /.?<NN-@N^ _ONNV?<NNTON^NuNV?. ?.?<NN\O=@ N^.NuNV/.?<NN\ON^.NuNV?<NNTO-@N^NuNV?<NNTON^NuNV/. ?.?<NNPON^ _\NNV?.?<NNXON^ _TNNV?.?<NNXON^ _TNNV?. ?.?<NN\O=@ N^.NuNV?.?<NNXON^ _TNNV?.?<NNXON^ _TNNV/.?. ?. ?.?<NN N^ _O NNV/.?< NN\ON^.NuNV?.?<!NNXO=@ N^ _TNNV?<"NNTO-@N^NuNV?. ?.?<#NN\O=@ N^.NuNV?<$NN\ON^.NuNV?<%NNTON^NuNV/.?<&NN\ON^.NuNV>|'NNTON^NuNV/.BgNM\ON^.NuNV?.?<NMXO?N^ _TNNV?.?<NMXO-@ N^ _TNNV?. ?.?<NM\ON^.NuNV?.?.?./. ?.?<NM-@N^ _O NNV/. ?.?<NMPO-@N^ _\NNV?<NMTO-@N^NuNV?.?<NMXO-@ N^ _TNNV?.?<NMXO-@ N^ _TNNV?.?< NMXO-@ N^ _TNNV?< NMTO-@N^NuNV?.?< NMXO-@ N^ _TNUNI2|!0t(W!pz~4CRTN$W!BSystemOSystem2 Crtd,UNI2 O4 O4 J F G^ Fffb J J D O4h$j)~V@P DEMOGRAPHS N MAKEGRAPHDATADFORCEGRAPHICSREDRAWD(DOBOXESD6DOLINESDD DOELLIPSES DRDOPIES D`ZbBSystem-OSystem2GEMDECL&GEMAES-0GEMVDID; DEMOINTERFACE DemoGraphsEncl, Ge, GenMAKEGRAPFORCEGRADOBOXESDOLINESDOELLIPSDOPIES`- o_z4$(T0 < 6TD^RH`H |^.d8h>hH|lPhVh`|ljhx|lh|l|l|l|l|l hdd d&d,p dzhd&d.d6d>hLp`"h0l dzhlJ>dHhRl<Xhbl.jdxdddhl dzd dHdVdfdndtd|dddddddddddddddd ddd,d2dDdJd dzhlJ>dHhRl<Xhbl.hhpd|dl2 dzhlJ>dHhRl<Xhbl.hhpd|dljNVHNprP@m=@=A`Rn0.HGG09yS@?N609yS@?N7_09H?N7_09H?N7_?<N7_?<N7_ ?<N0T@7@ ?< N0R@7@0.nf@&_N^NuNqNqNV?9?<HyHyHyHyNN^NuNqNqNVN=|=y=y=y=y=y?9?<HnNN^NuNqNqNV=n=n =n =n?9 ?<HnNN^ _PNNVHN?9 ?<NprP@m=@=A`Rn0.HGG?9 ?+ N?9 ?+N0y=@0+y=@0ykS@=@0+ykS@=@?9 HnN0.nfr&_N^NuNqNqNVN09H=@09H=@pr'@m$=@=A`Rn?90.y?0.y?09y?N09y?0.y?09y2.A?09y?N?909y2.A?0.y??9N09y?09y2.A?09y2.A??9N0.nfN^NuNVHN?9 ?<NprP@mv=@=A`Rn0.HGG?9 ?+ N?9 ?+N?9 0y?0+y??+?+N0.nf&_N^NuNVHN?9 ?<NprP@m~=@=A`Rn0.HGG?9 ?+ N?9 ?+N?9 0y?0+y??+?+?+?+ N0.nf&_N^NuUNI2$pV " j D; " " h$j)~,,^Jv.6^*f8 DEMOINTERFACENMAINMENU \ZDESKMENU \DQUITMENU \.WINMENU\SLCTDEMO \ELLIPSES \PIES \ABOUTBAR \LINES\BOXES\tWINCLOSE \TXTCLOSE \vTXTOPEN\bGRAOPEN\NGRASELEC \8\GRACLOSE \"QUITBAR\lABOUTBOX \ABOUTOK\OBJECT ]O_NEXT QO_STARTQO_ENDQO_TYPE QpO_FLAGSQZO_STATUS Q B|O_SPEC Q f,O_XQO_YQO_WQO_HQTREE ] 2TREEPTR]rhDEMOTYPE ]L 8 BOXESDEMO\& LINESDEMO\ ELLIPSESDEMO \PIESDEMO \SETSTATE ] S_ENABLE \h S_DISABLE\S_LEAVE\zMENU QbABOUTQN SELECTIONQ6 VDI_HANDLE Q 4 AES_HANDLE Q TEXTWINDOW Qx GRAFWINDOW QDEMO QMINX QMINY QMAXW QMAXH QQUIT Qn CHARBOXHEIGHTQ R CHARHEIGHT Q"8 FATALERROR D INIT_GEM 6(END_GEMD6 INIT_RESOURCEDDB END_RESOURCE DRSETOBJECTSTATUSD`HZT SETMENUSTATE Dn |;BSystem^OSystem2GEMDECL&GEMAES0GEMVDIBIOS%GEMDEMO.H - read resource constants DemoInterface|DEMOINTE|FATALERRINIT_GEMEND_GEMINIT_RESEND_RESOSETOBJEC^SETMENUS(6D0DR `"6n (|||"|(|.xR4|:|@|FxRL|X|t^|d|jxRp|||t||xR||t|x(| h$|`2|D||Tp`p(fdldxddptddlddddpddd$d*p<4p:dddd$d*pJ0d6l(<p||` |2||<pFDp^||hpFpp~d6ddpbdpbdpbdndd`dd`d d`dd`"d.d`4d>p dppTd$p6dBpnd~dddd ddd dNqNqNV/.Hn?<NHyNNNHyNNNHyHztBgNNNNHyHnBgNNNNHyHzRBgNXNUN=_BgNN^.Nu%>>> Fatal error condition arised! <<<Press a key to abort...NqNqNVUN0 @lDHz.HnNHz`HnNHnHn?<NU?<HnN=_UN3JymUHy"HnHy HnN3 pr @m,=@=A`Rn0.HC30.nf=| HnHy HnNBg?<HyHyHyHyNBgBgBgBg?9?9?9?9NBgBNJy\D@N^Nu?[0][ |Note! The icons will look a |bit odd in this resolution.% |High res. looks nicest |][ Ok ]NqNqNVBgBgBgBg?9?9?9?9N?9 NNN^NuNqNqNVHzHzHn?<NHnNUN0J@fNHzNBgBgHyNBg?<HyNBg?<HyN<B'<B'<N/9?<BgN/9?<?<N/9?<BgN/9?<BgN/9?<BgN/9?<NN^Nu GEMDEMO.RSCGEMDEMO\GEMDEMO.RSC GEMDEMO.RSC is missing!NqNqNV/9BgNNN^NuNqNqNV0. "n 3 BARREL: The Versatile RAM Buffer and Printer Spooler. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ by Moshe Braner Consider the following situations: You want to print long files without holding your computer up in the meanwhile... You would like to save the screen as a disk file when you press Alt-Help, instead of printing a hardcopy... You're trying to do some fancy printout, but your word processor doesn't print what you think you told it to. You would like to be able to see exactly what control characters were sent to the printer... You want to print on a remote printer, send a document e-mail, or input it to another program, but your word processor (or whatever) will only save documents in its own wierd format, not as a formatted ASCII file... You have a printer-driver to print graphics from program X on printer A. But you would like to use printer B. You have the documentation for both printers. You could easily write a "post-processor" program that will replace one set of control chars with another. But first you need a method of capturing the output for printer A in a file... It is all possible with the program "BARREL". When you run BARREL for the first time in a session (from the desktop or from the auto folder) it installs a RAM buffer plus some resident code. You enter the desired size of the buffer in units of 12K: a number between 1 and 9. (You need to press '3' (i.e. a 36K buffer) or more if you want to capture DEGAS format screen dumps.) Then, and every time you run the (same) program later in the session, you get to choose items from a menu: Capture printouts in barrel Immediate hardcopy printouts Empty barrel - make room for new stuff Write barrel to a disk file - file the RAM buffer Read a file into barrel - for background printing Hardcopy screen dumps SCODE format screen dumps DEGAS format screen dumps Background printing - after Capture or Reading Foreground printing only - but can resume later Quit - but leave settings intact BARREL intercepts all BIOS calls, and when they concern the printer it redirects them to a RAM buffer. BARREL achieves background printing by installing a routine in the 200 Hz system timer interrupt (that's plenty fast enough for text but rather slow when printing graphics). You can also ask BARREL to read a file into the RAM buffer. That is a faster way of setting a file up for background printing. The barrel is automatically emptied whenever background printing catches up with the saved stuff. It is NOT emptied upon writing to a file, so if you want to do both you should write the file first. BARREL also redirects the screen dump vector, enabling capture of the screen dump in RAM, in either SCODE or DEGAS format. A "screen dump" is caused by either pressing Alt-Help, or by a program (e.g. N-Vision) calling the XBIOS screen- dump function. If the screen dump is successful (i.e. there was enough space available in the barrel) the screen will 'blink' as a confirmation. The captured data may then be saved to disk by re-running BARREL and pressing 'W'. SCODE is a format that is both compressed and coded as text, so it is ideal for sending pictures via electronic mail (no uuencoding necessary). You must use the SDECODE program to view the picture, print it, or save it in a standard bit-map form. Note that when using DEGAS format dumps in BARREL, repeated Alt-Helps overwrite each other, only the last saved screen is still there. When using SCODE format dumps, they accumulate in the barrel as long as there is enough space. Individual dumps are separated by a blank line. After you write the barrel to disk you must use a text editor to separate the dumps (and remove any other text preceding coded dumps). Also note that the format of the saved graphics is NOT printable, while the normal screen dump does not go through any BIOS calls. Therefore, you cannot print an Alt-Help screen dump in the background without some extra software. You CAN spool the output of a program that prints graphics from a file (e.g. a GEM metafile) as long as the program calls the BIOS Bconout() function to print each byte. Asking for "immediate hardcopy printouts" just turns off interception of printer output. If you want to actually remove BARREL and reclaim the memory it holds, you have to reboot. N=N<09_29_ֲ@m@=@=A`RnHn*Hn?.NXHnBgN@N@N<|0.ذnfHn*N>N0. kH_29_RAA=@Hn/NHn/NJ9_fNU?.?. NJg:?9_?9_N3_3__?9_?9_N0.ng0.n^D@ N^ _PNNqNqNV. f/9?. ?<N`( f/9?. BgN` fN^ _PNNqNqNV.?</N.?</N. ?</N. ?</N.?</NN^ _O NNqNqNVB9B933N^NuUNI2>NHhA |h6'~\`DEMOMENU N HANDLEMENU D JD^ABSystemOSystem2GEMDECL&GEMAES ; DEMOINTERFACE DEMOWINDOWS DemoMenu6NhBgNqNqBHANDLEME6N(BH< l p@pbphlp\lpppll`"d(@hRh6dhDvhh(hRllpNqNqNV/9HnHnHnHnNBgBgBgBgBg?.?.?.?.N?<BgBgBgBg?.?.?.?.N/9Bg?<?.?.?.?.NU/9?" FULLWINDOW D | CLOSEWINDOWD n MOVEWINDOW DJ SIZEWINDOW DCLOSETOPWINDOW DjBSystemgOSystem2GEMDECL&GEMAES0GEMVDI; DEMOINTERFACEb DEMOGRAPHS DemoWindowsDEMOWINDOPENGRAPCLOSEGRAOPENTEXTCLOSETEX SELECTGRREDRAWWI@TOPWINDOLFULLWINDXCLOSEWINpMOVEWIND|SIZEWINDdCLOSETOP?. r(T6D TR:Z2@P`P$\dnL&|X*d.p2 |~` 0 dll$d*d2lDdJlPlVd\dbdldrdvd|dddd ddll$l*l0t6l<lJtPl\dbx6jdpxDzt*ddddddddt<lddddtlnt ltl8tztJltltlllnlnt ddll$l*l0t6l<lJtPl\dbx6jdpxDzt*ddddddddt<lddddtlnt ltl8tztJltltlllnlnt l t@tbthlt\ltttlll,l2h( l$t*l<lJl^ddpjllh6hDhRh`tt$tbx`lp`lpJlp.lpld$ d2*t:tBtt*"t@t^tt*t*lh(ldD"d( t*d"t@t.^t*hlrh("t@t*JlTh(d|"d,|6d@|HdPdNqNqNV309 Hy 309H29@AH309y 3 09y@3 333 N^NuNqNqNVNU?9?9?9?9?9N3Jym?<N?9?<UHyNUHyNBgBgN09Hy [@?09Hy[@??< ?< ?9 ?9?9?9N?9?9 ?9?9?9NB'<<<B'NBgNN^NuNqNqNVJym?<N?9?<HnHnHnHnN0.Hn[@?0.Hn[@??< ?< ?.?.?.?.N?9N?9N3Jym<<<B'<N`<<<B'<NBgNN^NuNqNqNVNU?9?9?9?9?9N3Jym?<N?9?<UHyNUHyNBgBgN09Hy[@?09 Hy[@??< ?< ?9?9?9?9 N?9?9?9?9?9 NB'<B'<<NBgNN^NuNqNqNVJym?<N?9?<HnHnHnHnN0.Hn[@?0.Hn[@??< ?< ?.?.?.?.N?9N?9N3Jym<B'<<<N`<B'<<<NBgNN^NuNqNqNV/9HnHnHnHnNBgBgBgBgBg?.?.?.?.N?<BgBgBgBg?.?.?.?.N/9Bg?<?.?.?.?.NU/9?ENHNDL \*EACCDN \EIHNDL \ENSMEM \EIMBA\EDRIVE \ENSAME \ENMFIL \ERANGE \EINTRN \xEPLFMT \dEGSBF\RREADONLY \<HIDDEN \(SYSFILE\VOLUMEID \^ DIRECTORY\ARCHIVE\ ANYFILE\?COMSTR ]PATHSTR]PODIRSTR ] \DCNAMESTR]08 EXTSTR ]TC_STR]  v SEARCHREC]rjRESERVED Q vl`ATTR QNTIME Q:SIZE Q&NAME Q ^  .DATETIME ]hT>*YEAR QMONTHQDAYQHOUR QMINQnSECQ \ JDOSERROR Q0 TOSVERSION 6ENVCOUNT 6(ENVSTR 6 6GETENV 6 D GETVERIFYD R SETVERIFYD `\ PARAMCOUNT 6@nPARAMSTR 6 |PACKTIME D UNPACKTIME D FINDFIRSTDrbFINDNEXT D rZSETFATTR D46JGETFATTR D 0GETDIR D ~CHDIRD  MKDIRD  RMDIRD  rDSETFTIME DRTNGETFTIME D$R("FSPLIT D2 0TFEXPAND6 @DISKSIZE 6 NDISKFREE 6 \|GETDATEDjXRLFzSETDATEDx"GETTIMEDSETTIMEDSETDRIVE D RGETDRIVE 6jSUPER6 fNfBEXEC D SWAPVECTORSD:MALLOC 6 fMFREED fMSHRINKDf$]BSystemOSystem2 Dos X.TOSVERSIDENVCOUNTPENVSTR\GETENVGETVERIFSETVERIFPARAMCOUPARAMSTRPACKTIMEUNPACKTIFINDFIRS FINDNEXTSETFATTR"GETFATTR:GETDIRFCHDIRRMKDIR^RMDIRSETFTIMEGETFTIMEdFSPLIT`FEXPANDlDISKSIZExDISKFREEGETDATESETDATEGETTIMESETTIMESETDRIVEGETDRIVESUPEREXECSWAPVECTMALLOCMFREEMSHRINK  V:<:,T$TF` @l Nx,\,jx2B0bHd 44&N(NINE@hRhITZFDELAt WR|@*TO2v0J848BB*DD(P 6\8Dv0vh AR<`2,NAPn |^>4 `8"B.D:FfR2^2x2xrj, $T2, (,P$ ddd,ddddd .d8d&<ddd &d0d&4ddFdFddFdF ldld*.l|l|d(@d6Rl|^lll|l|dd0dddh$d ld dn&l|6l@dRl|4d(dl|"d,2d@BdRl|dZd.l|l|"d,4dl|"d,4dd:dt\dl|"d,*dl|"d,*dl|"d,*d dFdjdjvl|~dll|l|l|ll*l:l|Rlbl|vl|l|lldl|&l|6d,FddFdFNV"n Jf "n nS @c0<`QN^ _PNNV"n n p`QBN^ _PNNVJ@m By` 3B@N^NuNV8HGI8*L/./ N n m :gU?<NATOAa: \g&@H?/ ?<GNAPOJ@kJf|\f(Mg \g at` ,.f: ,\fU`* ,.f ,\fW ,:g $\fJf ,:f\BHn8/. NL8` @am @zn@ NuN^.NuNV?.Hn?<6NAPO .-@ N^ _TNNV?.Hn?<6NAPO .-@ N^ _TNNV?<*NATO24@ n 0IA n0JJB n0a`L/BBl6B@A(0HBJf nSCHC n0&NuN^ _ONNV2. AII02. IA2.A??<+NAXON^ _\NNV?<,NATO""nBQ@@"n 2 H@?"n2p i"n2N^ _ONNV2.II02. IA2. IA??<-NAXON^ _PNNV?.?<NAXON^ _TNNV?<NATO=@N^NuNV/.?< NA\O-@ N^.NuNV0. 2@"n20H@?"n 2p i"n20."2@"n20H@"n2p iA"n2N^ _ONNV n0.HH2.IA2. IA00.@HH2.IA2.A0N^ _ONNV?</NATO#N^NuNV y"H,.p QB@ 1@N^NuNV#N/.?<NA\O?./. ?<NNAPO3nN/9?<NA\ON^ _O NNV#N/.?<NA\O?<ONATO3nN/9?<NA\ON^.NuNV?. /.?<GNAPONN^ _\NNV/.?<;NA\ONN^.NuNV/.?<9NA\O3N^.NuNV/.?<:NA\ONN^.NuNV?.?. /.?<CNA N=@N^ _PNNV"n0. nBrB1a@gNS@ga&f`=@=A`Sn0.r n0 \f =n `0.nfBn N^.NuNqNqNV/.Hn?<ONU/N=_Jno*HnHn?<?.NHn/.?<CN`4p. @fHn/.?<CN`Hz/.?<CNHn?<p n?NHzHnN=_JnoVHnHn?<0.S@?NHn/. ?<NHnHn?.p.?NHn/.?<N`"Hn/. ?<NHz/.?<NN^ _ON .NV/9?<?<NMP/9?<?<NMPN^NuNV/./. /.Bg?<KNA3N^ _O NNqNqNV,/. Hn?<ON/.Hn0?<NB,HnHn0NHn,Hn0Hn0NN^ _PNNV/.?<HNA\O-@ N^.NuNV/.?<INA\ONN^.NuNV/./. Bg?<JNA NN^ _PNUNI2SS~ad _Q  OpP@ORa|Q Q LFS~LlVpj*RvEASYGRAF N ACTIVEHANDLE QTMAXCOLOR Q<MINX Q(MINY QMAXX QMAXY Q WORKOUTQ j INITGRAPHICS DDEINITGRAPHICS D(LINE D6lf`Z LINECOLORD D4 CLEARDEVICEDR SETCLIPPINGD`BOXDnHaBSystemOSystem2GEMDECL&GEMAES0GEMVDI EasyGrafB|ascal |INITGRAPDEINITGRLINELINECOLOCLEARDEVSETCLIPPBOXr(`< R D 6< nh l((lt.dvd|dhddddddddddddd` dh(l|"d0h` dh6 dh"d0hd60d6Fd6\d6NqNqNVUN=_UHnHnHnHnN3pr @m,=@=A`Rn0.HC30.nf=| Bn HnHyHy N3 3 09&S@3ByBy?9?9?9?9 NN^NuNqNqNV?9NNN^NuNqNqNV=n=n =n =n?9?<HnNN^ _PNNqNqNV?9NN^NuNqNqNV?9?.NN^ _TNNqNqNV=n=n =n =n?9?<HnNN^ _PNNqNqNV?.?. ?. ?. N?. ?. ?. ?.N?. ?.?.?.N?.?.?.?. NN^ _PNUNI2%ǀ~(6ת8&t((~$@P``p#J $j$FDLhz,"R#JL&#t!tt"J""l !H :!#f"GEMAES NMU_KEYBD \` MU_BUTTON\JMU_M1\8MU_M2\&MU_MESAG \MU_TIMER \ K_RSHIFT \bK_LSHIFT \K_CTRL \K_ALT\ MN_SELECTED\ WM_REDRAW\z WM_TOPPED\d WM_CLOSED\N WM_FULLED\8 WM_ARROWED \ WM_HSLID \ WM_VSLID \WM_SIZED \WM_MOVED \ WM_NEWTOP\AC_OPEN\(AC_CLOSE \)P FMD_START\rFMD_GROW \\ FMD_SHRINK \D FMD_FINISH \,R_TREE \R_OBJECT \ R_TEDINFO\ R_ICONBLK\R_BITBLK \R_STRING \ R_IMAGEDATA\R_OBSPEC \| R_TEPTEXT\f R_TEPTMPLT \N R_TEPVALID \6  R_IBPMASK\ R_IBPDATA\ R_IBPTEXT\ R_BIPDATA\R_FRSTR\R_FRIMG\NAME \CLOSER \FULLER \|MOVER\jINFO \XNSIZER\F UPARROW\2@DNARROW\VSLIDE \ LFARROW\ RTARROW\HSLIDE \ WC_BORDER\WC_WORK\xWF_KIND\WF_NAME\|WF_INFO\h WF_WORKXYWH\PF WF_CURRXYWH\8 WF_PREVXYWH\  WF_FULLXYWH\$ WF_HSLIDE\ WF_VSLIDE\ WF_TOP \ p WF_FIRSTXYWH \ ` WF_NEXTXYWH\ WF_RESVD \ WF_NEWDESK \h WF_HSLSIZE \P WF_VSLSIZE \8V WF_SCREEN\" END_UPDATE \ BEG_UPDATE \ END_MCTRL\ BEG_MCTRL\LARROW\ TEXT_CRSR\BUSYBEE\ HOURGLASS\t POINT_HAND \\ FLAT_HAND\F THIN_CROSS \. THICK_CROSS\ OUTLN_CROSS\lUSER_DEF \DM_OFF\M_ON \G_BOX\G_TEXT \ G_BOXTEXT\G_IMAGE\t G_USERDEF\^G_IBOX \JG_BUTTON \4 G_BOXCHAR\fG_STRING \G_FTEXT\ G_FBOXTEXT \G_ICON \LG_TITLE\ NONE \ SELECTABLE \RDEFAULT\vF_EXIT \bhEDITABLE \LRBUTTON\8LASTOB \$  TOUCHEXIT\@HIDETREE \VINDIRECT \bNORMAL \SELECTED \CROSSED\CHECKED\zDISABLED \zOUTLINED \dSHADOWED \N WHITE\<BLACK\*RED\fGREEN\BLUE \CYAN \TYELLOW \MAGENTA\XLWHITE \LBLACK \ LRED \ LGREEN \n LBLUE\\ LCYAN\J LYELLOW\6hLMAGENTA \ ,EDSTART\ EDINIT \EDCHAR \@EDEND\XTE_LEFT\TE_RIGHT \>TE_CNTR\p BACKSPACE\~TAB\n S_DELETE \XS S_INSERT \BR SHIFT_INS\,R0RETURN \ ENTER\r UNDO \aBHELP \bHOME \G(CUR_UP \HCUR_DOWN \PCUR_LEFT \KN CUR_RIGHT\zM, SHIFT_HOME \bG7SHIFT_CU \LH8zSHIFT_CD \6P2.SHIFT_CL \ K4SHIFT_CR \ M6ESC\CTRL_A \CTRL_B \0CTRL_C \.`CTRL_D \ CTRL_E \CTRL_F \!CTRL_G \n"CTRL_H \Z#CTRL_I \F <CTRL_J \2$ CTRL_K \% CTRL_L \ & &CTRL_M \2 CTRL_N \1tCTRL_O \CTRL_P \CTRL_Q \CTRL_R \CTRL_S \~.CTRL_T \jCTRL_U \V CTRL_V \B/`CTRL_W \.RCTRL_X \-$CTRL_Y \,6CTRL_Z \CTRL_1 \0CTRL_2 \CTRL_3 \CTRL_4 \CTRL_5 \&CTRL_6 \zCTRL_7 \fCTRL_8 \R CTRL_9 \> CTRL_0 \* ALT_A\ALT_B\0ALT_C\.ALT_D\ ALT_E\ALT_F\!ALT_G\" ALT_H\# ALT_I\ALT_J\v$ALT_K\d%ALT_L\R&ALT_M\@2dALT_N\.16ALT_O\~ALT_P\ RALT_Q\ALT_R\4ALT_S\ALT_T\ALT_U\ALT_V\/ALT_W\ALT_X\z-ALT_Y\h,ALT_Z\VALT_1\DxALT_2\2ytALT_3\ zALT_4\{~ALT_5\|ALT_6\}ALT_7\~ALT_8\2ALT_9\@ALT_0\F1 \;F2 \<vF3 \r=F4 \b>F5 \R?F6 \B@dF7 \2AF8 \"B F9 \CF10\DSHIFT_F1 \TSHIFT_F2 \USHIFT_F3 \VSHIFT_F4 \WSHIFT_F5 \XSHIFT_F6 \~YSHIFT_F7 \hZSHIFT_F8 \R[SHIFT_F9 \<\ SHIFT_F10\&]CTRL_AE\(CTRL_OE\'CTRL_UE\ALT_AE \(]ALT_OE \'[pALT_UE \@, SH_ALT_AE\(} SH_ALT_OE\'{f SH_ALT_UE\l\bGEMERROR 6P APPL_INIT60( APPL_FIND6 6R APPL_TRECORD 6DR APPL_READDRR APPL_WRITE D`ztRnn APPL_TPLAY DnRF@: APPL_EXITD|L EVNT_KEYBD 6 EVNT_DCLICK6  EVNT_MESAG D R EVNT_TIMER D zt EVNT_MULTI 6DXLF@:4.(" R EVNT_BUTTON6| EVNT_MOUSE D" TNHB<60*$MENU_BAR Df MENU_ICHECKDfT MENU_IENABLE DfN MENU_TNORMAL Dfd^X MENU_TEXTD$f2,R& MENU_REGISTER62ROBJC_ADD D@f6 OBJC_DELETEDNf OBJC_DRAWD\fpjd^XRL OBJC_FIND62jf&  OBJC_OFFSETDxf OBJC_ORDER Df OBJC_EDITDfztnhb\ OBJC_CHANGED f4.(" 0FORM_DO6f FORM_ALERT 6R FORM_ERROR 6 F FORM_CENTERDf\VPJD FORM_DIALD   GRAF_MOUSE DfR GRAF_MKSTATE D GRAF_RUBBOXD\VPJD> GRAF_DRAGBOX D  2 GRAF_MOVEBOX D. GRAF_GROWBOX D<lf`ZTNHBhGRAF_SHRINKBOX DJ p GRAF_WATCHBOX6Xf GRAF_SLIDEBOX6ffzt GRAF_HANDLE6XtLF@: SCRP_READD R SCRP_WRITE D R. FSEL_INPUT DRR߾߸~ FSEL_EXINPUT DRߎR߈߂R|B WIND_CLOSE D TF WIND_DELETED , WIND_FIND6 | WIND_UPDATED WIND_NEW Dz WIND_OPENDޒތކހz WIND_CREATE6^RLF@:WIND_GET DVWIND_SET D*ݾݸݲ WIND_CALCD$8 ݌݆݀ztnhb\V^ RSRC_LOADD FR0H RSRC_FREEDT RSRC_GADDR DbR` RSRC_SADDR DpܴܮfܨF RSRC_OBFIX D~܀fz SHEL_READDRTRNSHEL_GET DR("SHEL_PUT DR SHEL_FINDD R SHEL_ENVRN DfۨRۢ SHEL_WRITE DztnRhRb0&BSystemOSystem2GEMDECL GemAESLNGEMERRORAPPL_INI*APPL_FINBAPPL_TREAPPL_REAAPPL_WRI6APPL_TPLNAPPL_EXIZEVNT_KEYEVNT_DCL~EVNT_MESEVNT_TIMEVNT_MULfEVNT_BUTrEVNT_MOUMENU_BARMENU_ICHMENU_IENMENU_TNOMENU_TEXMENU_REGOBJC_ADDOBJC_DELOBJC_DRAOBJC_FIN&OBJC_OFF2OBJC_ORD>OBJC_EDIJOBJC_CHAVFORM_DOnFORM_ALEzFORM_ERRFORM_CENbFORM_DIAGRAF_MOUGRAF_MKSGRAF_RUBGRAF_DRAGRAF_MOVGRAF_GROGRAF_SHRGRAF_WATGRAF_SLIGRAF_HAN SCRP_REASCRP_WRI"FSEL_INP.FSEL_EXIRWIND_CLO^WIND_DELWIND_FINWIND_UPDWIND_NEWFWIND_OPE:WIND_CREjWIND_GETvWIND_SETWIND_CALRSRC_LOARSRC_FRERSRC_GADRSRC_SADRSRC_OBFSHEL_REASHEL_GETSHEL_PUTSHEL_FIN*SHEL_ENVSHEL_WRICALLAES6 (2RB`*B666nBBDNB|Z f( rp6~x<. 4<8@@@$D2B@@N8\b0j&Z*x2N>@J\*Vr<b@np<zB6X$\* |B.X*<h6Jh6XR$fJtV$8 N. ". .F:PFX*RP$^. j. v`**X*<. 8BF. T bBp@~8:V$::*. :h h hdh"h(h hhh6d hhh6dh$d*h hhh6d hh.d4hddh hhh2d8hDhNhXhbh hhh$h,hBdLhVh`hjhh$d hh*d hhh$h,h4h<hDhLhTh\hdhlhth~hhhdhhhhhhh hh*d0h hh,d hhh4d hhh4d hhh4d hhh6d hh.d4h hhh4d hh,d hhh$h,h4h<hTd hhh$h,hDdJh hh,d6h@h hhh4d hhh$h,hDdNh hhh$h,h4h<hDhLhdd hh,d2h hhh$h,h4h<hDhLhbdhh.d4h h"d(h h"d,h6h@hJh hhh$h:dDhNh hhh$h,h4h<hDhZddhnh hhh$h,h4hJd hhh$h,h4h<hDhZd hhh$h,h4h<hDhZd hhh$h<dBh hhh4d:hdh*h4h>hHh hh,dd"h,h6h@hh$dh$dhh.d8hhh"h8dBh hhh$h,hBdHh hhh$h,hBd h"d h"d hh*d4h>hHhRh hhh$h,h4hJd hh*d0h h"d hhh$h,h4hJdTh^hhhrhdh$dd hh,d6h hhh4d hh,dhh.d hhh&h0hHd hh.d hh.dh$dhh.dNVA,000 0 0A"0<NBN^ _O NNqNqNV=yLN^NuNqNqNV?< Bg?<BgBgN3L,=yLN^NuNqNqNV3D3 F/.#?< ?<?<?<BgNN^ _PNNqNqNV3D3 F/.#?< ?<?<?<BgNN^ _PNNqNqNV/.#?< Bg?<?<BgN=yL N^.NuNqNqNV3 D3F/. #?<?<?<?<BgNN^ _PNNqNqNV3D/. #?<?<?<?<BgN=yLN^ _\NNqNqNV?<Bg?<BgBgNN^NuNqNqNV?<Bg?<BgBgN=yLN^NuNqNqNV3D3F3H?<?<?<BgBgN=yL"n2N"n2P"n 2R"n2TN^ _ONNqNqNV3 D3F3H3J3L?<?<?<BgBgN"n2N"n2P"n 2R"n2TN^ _ONNqNqNV/.#?<Bg?<?<BgNN^.NuNqNqNV3 D3F?<?<?<BgBgNN^.NuNqNqNV3BD3@F3>H3<J3:L38N36P34R32T30V3.X3,Z3*\3(^/.$#3"`3 b?<?<?<?<BgN=yLD"n2N"n2P"n2R"n2T"n 2V"n2XN^ _O(GEMDECLN CONTROL_MAX\^ INTIN_MAX\H INTOUT_MAX \0 WORKOUT_MAX\8 ADDRIN_MAX \ ADDROUT_MAX\ GLOBAL_MAX \PTS_MAX\ AES_PARAM] ~lh VDI_PARAM]@P D~2, GLOBAL_ARRAY ]~ j CONTROL_ARRAY]   INTIN_ARRAY] xnb INTOUT_ARRAY ]6F :0"$ PTSIN_ARRAY]r "^ PTSOUT_ARRAY ] " ADDRIN_ARRAY ] @fxl ADDROUT_ARRAY],P D@f:. WORKOUT_ARRAY]j 8rVARRAY_2] ARRAY_3] ARRAY_4]j ^THARRAY_5]J2 & 6ARRAY_6]  nARRAY_8] ARRAY_10 ]  |rfARRAY_16 ].N B 8,ARRAY_37 ]h $JTGRECT]$2XQYQWQHQAES_PB QjVDI_PB Q@TCONTROLQ,>INTINQD*INTOUT QL6*PTSINQdrPTSOUT QADDRIN QADDROUTQ,GLOBAL Q(~MIN6 MAX6 x(lfHIPTR6 P6RDfLOPTR6 .DR"BITTEST6 R INTERSECT6` EMPTYRECT6 nMAKEXYXY D|xrMAKEXYWH DLF$BSystemOSystem2 GemDeclGEMDECLMINMAXHIPTRLOPTRBITTESTINTERSECEMPTYRECMAKEXYXYMAKEXYWH*(*6DR(`n0|RR "d(:d(`dddn dddd"d(d.d4d:d@dFdLdRdXd^dddjdpdvd|dddNqNqNV0. no =n `=n N^.NuNqNqNV0. nl =n `=n N^.NuNqNqNV/. H@=@ N^.NuNqNqNV/. =@ N^.NuNqNqNVp2. hHJVD@N^ _\NNqNqNV n C""U n??.N=_U n?(?.N=_U n0 nh?0.n?N=_U n0( nh?0.n?N=_0.n0.nUHnNJWD@A"n""N^ _PNNqNqNV nC""Jn_DJn_D@ N^.NuNqNqNV n C"""n2"n3n0.nS@"n3@0.nS@"n3@N^ _PNNqNqNV n C"""n2"n3n0.nR@"n3@0.nR@"n3@N^ _PNNqNqNVHy,#HyD#Hyd# HyL#$Hy#(Hy,#Hy(#HyD#HyL# Hy#Hy#N^NuUNI2q2, ^lZ,,Jxx7~*t4TL 8  4>GEMINT NFRAMEBOX \`MSGBOX \LMSGSTR \8OKBUTTON \"C_STRING ]  t STRING_PTR ]OB_TYPE]  SPEC_INFO]RZ,THICKQTCOLORQ@STRQ OBJECT ]nOB_NEXTQOB_HEADQOB_TAILQOB_TYPEQOB_FLAGS QOB_STATE Q xxOB_SPECQ RJOB_X QNOB_Y Q:|OB_W Q&OB_H QvTREE ] nTREE_PTR ]WORKIN QWORKOUTQjn. AES_HANDLE Qz\ VDI_HANDLE Q|BCHARDEFS Q~D.H_CHAR Q W_CHAR QH_BOXQW_BOXQVvMINX QMINY QMAXX Q|MAXY Qh MAXCOLORSQP OUTPUTWINDOW Q$HANDLE QBX QBY QBW QBH QWX Q WY Q WW QWH QMIDX QpMIDY Q\L: MESSAGEBOX QINIT_GEM 6EXIT_GEM D(pMESSAGED 6INFORM D DERRORCLOSEDOWN D R|MAXW 6f`MAXH 6JnBINARY 6 ,| vOPENOUTPUTWINDOW DCLOSEOUTPUTWINDOWDCLEAROUTPUTWINDOWDRBSystem OSystem2GEMDECL0GEMVDI}&GEMAESaBIOSu GemInt0RGEMINTINIT_GEMEXIT_GEMMESSAGEINFORMERRORCLO MAXWMAXH"BINARY.OPENOUTP:CLOSEOUTFCLEAROUTSETUPMES.*(<*6rDHR <` n" |.:TF RZ 0 d|dd,d4dFdLd`dlddddddl@dd&d4df|pd~l@ddddd|dl@d&l\ l(dd>dXd^dtltxd~dddplddddlddddddd|| ld(| h:||HlPdTd`l dd|(l,d2p(6l|||d$d(d2dHl\\|l||x|`|||d|dl\ldll||d$d(d:l\N|Z|j||rd|dl\||"|`.|:|J||Tlblpltd(z| dd dd||N|V|^|h|x ddd.d`>dnblpdvt6|dtDl*ll8d dll dpdFdTp`Xd`pJddnp.rd|pdpJdp. dd||NVHHyHx`N&y0927@09~H29~HA7@09ykH7@09~Hy7@67|7|7|Bk7| Bk0+kX@3&yGBkBk0927@09~H7@67|7|7|BkBk Bk/9Bg?<N&yG009H7@Bk0927@09~H7@67|7|7|BkBk Hk Hx2N k B/9?<?<N&yGH09(7@09~7@09H7@7y~67|7|7|7|'Bk Hk HxN"k O"k |k k B(/9Bg?<N/9Bg?<BgBgBgBgN&_N^NuNVHUN3zJyzmPpr @m.=@=A`Rn0.HC30.nf3G~UHkHSHkHkN3|HyHy|HyNBgBNBg?<HyHyHyHyN09y09y09y293Al.HzHn?<NU?<HnN=_NBgNUN0 @l$HzHn?<NU?<HnN=_3V?<BN|`B.&_N^Nu\[3][ | The demo won't run on screens | with less than 51 characters | per line ][ Sorry ] T[1][|The demo looks best in |high resolution, but can |run in medium too][ Ok ] NqNqNVJgHyHx`N?<BN?9|NNN^NuNqNqNV/.Hn?<NJfN yBhR/9?<?<BgBgBgBgNHnHn?<?<1NHnHn?<NHnHnNHzzHnNHnHn?<NHn y/( ALL_WHITE\(S_AND_D\ S_AND_NOTD \4S_ONLY \ NOTS_AND_D \D_ONLY \S_XOR_D\jS_OR_D \NOT_SORD \~. NOT_SXORD\h NOT_D\V S_OR_NOTD\@ NOT_S\. NOTS_OR_D\ NOT_SANDD\ ALL_BLACK\VREQUEST\SAMPLE \MFDB ]MPTR Qf FORMWIDTHQ| FORMHEIGHT Qb WIDTHWORDQJ FORMATFLAG Q 0 MEMPLANESQ RES1 QRES2 QRES3 QSTRING80 ]RP STRING125]~}V_CLSWKD ZV_CLSVWK D (4V_CLRWKD 6V_UPDWKD DVST_UNLOAD_FONTS D RVS_CLIPD` VST_LOAD_FONTS 6 hn\VnV_OPNWKD|*,jV_OPNVWK DjPV_PLINEDr V_PMARKERDrV_GTEXTDnhbP V_FILLAREA D4.r  V_CONTOURFILLDVR_RECFL D V_CELLARRAYDzlV_BARDRD$V_ARCD*$  V_PIESLICE DV_CIRCLE D$ V_ELLIPSED2hb\VPV_RBOX D@,V_RFBOXDN(V_ELLARC D\V_ELLPIE Djztnh V_JUSTIFIEDDx@:4"(" VSWR_MODED VS_COLOR D`VSL_TYPE D  VSL_UDSTYD lf0 VSL_COLORD @:*VSL_ENDS DVSM_TYPE D  VSM_COLORD  VST_ROTATION D VST_FONT D ZT. VST_COLORD .( VST_EFFECTSD   VSF_INTERIOR D . VSF_STYLED < VSF_COLORD Jxrx VSF_PERIMETERD XHB VSF_UDPATDfRVR_TRNFM Dt V_GET_PIXELD VSM_HEIGHT D vp VSL_WIDTHD JD VST_HEIGHT D  VST_POINTDH VST_ALIGNMENTD~xx VRO_CPYFMDRL>4. VRT_CPYFMD VSIN_MODED VRQ_CHOICE DVSC_FORM Djh\V_SHOW_C D >8V_HIDE_C D *VVQ_KEY_S D8VQ_MOUSE DFt VSM_CHOICE 6T VRQ_VALUATOR DbVPJD VRQ_LOCATORDp  VSM_LOCATOR6~( VSM_VALUATOR D|v VRQ_STRING DNHB4*L VSM_STRING 6VEX_TIMV DffzVEX_BUTV Dff(VEX_MOTV Dff`fZdVEX_CURV D4f.f( VQ_EXTENDDj8VQL_ATTRIBUTES DLVQM_ATTRIBUTES D JjVQF_ATTRIBUTES DfJXVQT_ATTRIBUTES D&4&VQ_COLOR 64D VQT_EXTENT DB VQT_WIDTH6PVQT_NAME 6j^^XF@ VQ_CELLARRAY D l( 6: VQIN_MODEDz VQT_FONTINFO D| VQ_CHCELLS D\VP V_EXIT_CUR D (\ V_ENTER_CURD V_CURUPD  V_CURDOWND V V_CURRIGHT D  V_CURLEFTD hx V_CURHOMED BV_EEOS D V_EEOL D  VS_CURADDRESSD" V_CURTEXTD0V_RVON D >tLV_RVOFFD LP VQ_CURADDRESSDZ&  V_HARDCOPY D h.V_DSPCUR DvV_RMCURD J V_FORM_ADV D tV_OUTPUT_WINDOWDH:V_CLEAR_DISP_LISTD  VQP_FILMSDVSP_SAVE D n VSP_MESSAGED HV_META_EXTENTS Dnhb\Vj VM_FILENAMED. VQ_TABSTATUS 6  VS_PALETTE 6 H VQP_ERROR6 6 VQP_STATED",~xrlf.X VSP_STATED::4.(". V_WRITE_META DHr V_BIT_IMAGEDV00BSystemOSystem2GEMDECL GemVDIr h V_CLSWK$V_CLSVWK0V_CLRWK<V_UPDWKTVST_UNLO`VS_CLIPHVST_LOADV_OPNWKV_OPNVWKlV_PLINExV_PMARKEV_GTEXTV_FILLARV_CONTOUVR_RECFLV_CELLARV_BARV_ARCV_PIESLIV_CIRCLEV_ELLIPSV_RBOX V_RFBOXV_ELLARCV_ELLPIE,V_JUSTIF8VSWR_MODDVS_COLORPVSL_TYPE\VSL_UDSTtVSL_COLOVSL_ENDSVSM_TYPEVSM_COLOVST_ROTAVST_FONTVST_COLOVST_EFFE VSF_INTE VSF_STYL VSF_COLO (VSF_PERI 4VSF_UDPA XVR_TRNFM dV_GET_PIVSM_HEIGhVSL_WIDTVST_HEIGVST_POINVST_ALIG @VRO_CPYF LVRT_CPYF pVSIN_MOD VRQ_CHOI VSC_FORM V_SHOW_C V_HIDE_C $VQ_KEY_S 0VQ_MOUSE VSM_CHOI VRQ_VALU |VRQ_LOCA VSM_LOCA VSM_VALU VRQ_STRI VSM_STRI <VEX_TIMV VEX_BUTV VEX_MOTV VEX_CURV HVQ_EXTEN `VQL_ATTR lVQM_ATTR xVQF_ATTR VQT_ATTR TVQ_COLOR VQT_EXTE VQT_WIDT VQT_NAME VQ_CELLA VQIN_MOD VQT_FONT VQ_CHCEL V_EXIT_C V_ENTER_ V_CURUP V_CURDOW V_CURRIG V_CURLEF ,V_CURHOM 8V_EEOS DV_EEOL PVS_CURAD \V_CURTEX hV_RVON tV_RVOFF VQ_CURAD V_HARDCO V_DSPCUR V_RMCUR V_FORM_A V_OUTPUT V_CLEAR_ VQP_FILM VSP_SAVE (VSP_MESS @V_META_E XVM_FILEN VQ_TABST VS_PALET 4VQP_ERRO VQP_STAT VSP_STAT LV_WRITE_ V_BIT_IMrGEMVDIPd*GEMVDIF~2GENSET:GENSETP4RETCONTR$ GENESCAP0| **$*(0*6<*DH*nT8R`2`lvxrr*z|<F$lt`6`6$T0\h<jh<2V0@ tN,tx8HD PV*\ h t8 < H* d6^0      P$.  <  J ( X 4 f @J LN XZt dtB pP$ |<p Z*~ l6b H R$ <T : < B @ ^0 2* * ^0 $^08 02F <H Hf0 T$4 `$ lv x$ j& B $P Z*^ 6l 6z < H F      , 8 D P" \D$0 h$> tL Z 4 & h v D$   t V 6 @ 6, *: B ( 4 @&  LV0H X^$$ hhh hhh&h hhh*d~ hhh(dd hh hhh&ddh,h4hDddNhxhh hhddh"h,hDddNhxhh hhdd hhdd hhdd hhh*d~ hhh(dd hhhJhjdd hhFhfdd hhFhfddp|h*h2h:hrhdd hhNhndd hh"h*h2h:hDhNpXhndd hhh$h,h:dd hh@h`dd hhhHhhdd hhh$h,h4h<hDhRdd hhh$h,h4h<hDhRdd hhh"h*h2h:hHdd hhh$h,h4h<hDhLhZdd hhh$h,h4h<hDhLhZdd hhh"h*h2h:hHdd hhhHhhdd hhhHhhddp|h,h4hlhhhhhhhddd hhh$h0h<hJdddd hhh h.ddd hhh"h0ddd hhh"h(h0h>ddd hhh h.dd8hBhLhVh hhh(dd2h<hFhPhdddd hhh"h2d~Bhdddd hh h0p>dd hh h6&h2hD8hDh6JhVhD\hdhhdd hh h6&h2hD8hDh6JhVhD\hdhnhzhhdd hhh6"h.hD4h@h6FhRhDXhfdd hhh"h2d~Bh hhh"h0dd hhh"h2d~BhLh hhh"h2d~BhLhRhZh hhh*d~:h hhh*d~:hDh hhh*d~ hh d~,h hh h(h2h>hLddRh`hh hh h(h2h>hLddRh`hhh hhh&p4dd hhh6"h.hD4hBddJd hhh(dd hhdd hhh6"h.hD4hBddJd hhh6"h.hD4hBddJd hh d~ hh d~0h:h hhh6"h.hD4hDd~Rd hhh(ddRhh hhh"h2d~`h hhddHhhh hhddHhhhth hhddHh hhddHhhp|h(h`h~ddh hhh*d~8hBhLh hhh*d~@p|fp`rhpp| hhhJhjddth~hhh hhh*d~ hh d~0h:hDhPh\hhhrh|hh hhh(d~8hddddddddd hhh"h*h8ddp|h(h0hhhdddddh&hdhd hhh"h*h8dddd hhhHhhdddp|h&h^hhhhhdd hhh"h2d~ hhh&dd8p|^p`jhpp|dh&h0h:hDhph hhh"h*h2h:hBhJhzhdddddh hhh"h*h2h:hHdd hhh&h8hPddp|h(h0hhhddNqNqNV3 ,38A"psNBN^.NuNqNqNV3 ,38A"psNB=yL N^.NuNqNqNVBy.323DU?. ?. N=_N^ _\NNqNqNVBy.323D?. ?. NN^ _\NNqNqNV09>HH@29@HЁ-@N^NuNqNqNVBy.By23 6?<?.NN^.NuNqNqNV nCpA"QACDpA"QBy.3 2?< n ?N"n 28pr,@m8=@=A`Rn0.H2.IAL"n30.nfp-r8@m<=@=A`Rn0.H2.A-IA"n30.nfN^ _O NNqNqNVBy.By2?<?.NN^ _TNNqNqNV nCpA"QBy.3 2ACDpA"Q?<d n ?N"n 28pr,@m8=@=A`Rn0.H2.IAL"n30.nfp-r8@m<=@=A`Rn0.H2.A-IA"n30.nfN^ _O NNqNqNVBy.By2?<e?.NN^ _TNNqNqNVBy.By2?<?.NN^ _TNNqNqNVBy.By2?<?.NN^ _TNNqNqNVBy.323DU?<w?. N=_ N^.NuNqNqNVBy.323D?<x?. NN^.NuNqNqNV3.323 Dpr@m8=@=A`Rn0.H2.I nCd30.nf?<?.NN^ _PNNqNqNV3 .By20. HS@rAm8=A=@`Rn0.H2.I nCd30.nf?<?.NN^ _PNNqNqNV3 .By20. HS@rAm8=A=@`Rn0.H2.I nCd30.nf?<?.NN^ _PNNqNqNV/.Hn?<PN3.p.323d3 fp.rAm<=A=@`Rn0.S@H2.tA0CD30.nf?<?.NN^ _O NNqNqNV3 .By20. HS@=@p2.@m8=@=A`Rn0.H2.I nCd30.nf?< ?.NN^ _PNNqNqNV3.0.323:3<3>3 @/.Hyd?<N nCDpA"Q?< ?.NN^ _ONNqNqNV3.323 d3 f3D?<g?.NN^ _PNNqNqNV3.By2pr@m8=@=A`Rn0.H2.I nCd30.nf?<r?. NN^ _\NNqNqNV3.By236pr@m8=@=A`Rn0.H2.I nCd30.nf?< ?. NN^ _\NNqNqNV3.32363 D3F3d3f3 p?< ?.NN^ _O NNqNqNV3.32363 D3F3d3f3 p?< ?.NN^ _O NNqNqNV3.By236383 d3 f3l?< ?.NN^ _PNNqNqNV3.32363 D3F3d3f3h3 j?< ?.NN^ _ONNqNqNV3.32363 D3F3d3f3h3 j?< ?.NN^ _ONNqNqNV3.By2363d3 f3 h3j?< ?.NN^ _O NNqNqNV3.By236pr@m8=@=A`Rn0.H2.I nCd30.nf?< ?. NN^ _\NNqNqNV3.By23 6pr@m8=@=A`Rn0.H2.I nCd30.nf?< ?. NN^ _\NNqNqNV/.Hn?<PN3.p.T@323 6p.rAm<=A=@`Rn0.R@H2.tA0CD30.nf3 D3F3d3f3 hByj?< ?.NN^ _ONNqNqNV?< ?. ?.NN^.NuNqNqNVBy.323 D n3F n3H n3J?<?.NN^ _PNNqNqNV?<?. ?.NN^.NuNqNqNV?<q?. ?.NN^.NuNqNqNV3.By23dByf?<?. NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNVBy.323 D3F?<l?. NN^ _\NNqNqNV?<?. ?.NN^.NuNqNqNV3,3.By23 8Byd3f?<?. NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNV3.By2Byd3f?< ?.N"n2"n2"n 2"n2N^ _ONNqNqNVBy.323D?<k?.N"n2"n2"n 2"n2N^ _ONNqNqNV?< ?. ?.NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNV?<j?. ?.NN^.NuNqNqNVBy.323D3FU?<'?.N"n 2"n2NN^ _ONNqNqNV?<?. ?.NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNV?<h?. ?.NN^.NuNqNqNVBy.0.H32/. HyD0.HH?N?<p?.NN^ _PNNqNqNV3.32U/. N3:U/. N3U/.N3@3Dpr@m8=@=A`Rn0.H2.I nCd30.nf?<m?.NN^ _ONNqNqNV3.32U/.N3:U/.N3U/. N3@3D n3F n3Hpr@m8=@=A`Rn0.H2.I nCd30.nf?<y?.NN^ _ONNqNqNVBy.By2U/. N3:U/. N3U/.N3@?<n?.NN^ _O NNqNqNV3.By23d3fU?<i?.N"n 2"n2NN^ _ONNqNqNVBy.323 D3F?<!?. NN^ _\NNqNqNV3.By23d3fU?<?.N"n2"n2"n 2N^ _ONNqNqNV3.By23d3fU?<?.N"n2"n2"n 2094Hy0=@N^ _ONNqNqNVBy.323DU?<?.N"n 2"n2NN^ _O NNqNqNVBy.323DU?<?.N"n2"n24"n 2NN^ _ONNqNqNVBy.323 DU?<?.N"n2N^ _PNNqNqNVBy.By2U?<?. N"n2=y4N^ _\NNqNqNV3.320.D@3D3F n 3d n 3f?<?.N094"np294@m:=@=A`Rn0.2.SAIAL40"n0.nfN^ _ONNqNqNV3.320.D@3D3F n 3d n 3f?<?.N094"np294@m:=@=A`Rn0.2.SAIAL40"n0.nf=y4N^ _ONNqNqNVBy.3%2/.HyD?<JN?<o?. NN^ _\NNqNqNVBy.By2U/. N3:U/. N3"n2@=yB p2<@m8=@=A`Rn0.H2.IAL"n30.nfN^ _ONNqNqNVBy.323 DU?<s?.N"n2N^ _PNNqNqNVBy.By2U?<?.N"n2"n2N"n2"n3y"n3y"n3y"n 2"n2"n3y"n3yN^ _ONNqNqNVBy.By236U?<?.N"n 2"n2NN^ _O NNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?< ?.NN^ _TNNqNqNV?< ?.NN^ _TNNqNqNVBy.323 63 D3F?<?. NN^ _\NNqNqNV/.Hn?<PNBy.p.323 6p.rAm<=A=@`Rn0.S@H2.tA0CD30.nf?<?. NN^ _\NNqNqNV?< ?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.N"n 2L"n2NN^ _O NNqNqNV?<?.N=yL N^ _TNNqNqNV?<?.NN^ _TNNqNqNV3.By2363 d3f?<?. NN^ _\NNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV3.By236pr@m8=@=A`Rn0.H2.I nCd30.nf?<?. NN^ _\NNqNqNV?<?.NN^ _TNNqNqNV/.Hn?<PN3D3Fp.rAm<=A=@`Rn0.R@H2.tA0CD30.nfpr@m8=@=A`Rn0.H2.I nCd30.nf3 .p.T@3236?<?.NN^ _ONNqNqNVBy.323<63DU?<?. N=_ N^.NuNqNqNVBy.By23[6?<?. NHz/.?<}Npr|@mf=@=A`Rn/.HnN0.HAL20AA=AHnHnNHn/.?<}N0.nfN^ _\N NqNqNV?<\?. N"n2L"n2N"n2P"n2R"n 2Tpr@m:=@=A`Rn0.H2.ZAIAL"n30.nfN^ _ONNqNqNVBy.323]63]83D3F3H3J3 Lpr@m:=@=A`Rn0.X@H2.I nCD30.nf?<?.NN^ _ONNqNqNV?<^?.NN^ _TNNqNqNV?<_?.NN^ _TNNqNqNV?<`?.N=yL N^ _TNNqNqNV3.By23b63d3 f3 h3j?<?.NN^ _O NNqNqNV3.3 23c6 nCDpA"Q nCdpG"Q2?<?.NN^ _ONNqNqNV/.Hn?<PNBy.p.323d6p.rAm<=A=@`Rn0.S@H2.tA0CD30.nf?<?. NN^ _\NUNI2 bU&m< )9.  f ) ) b ~ G>U~V\ pxL> ,z H<FHJ\x D* V N \t*$,j .6 GRAPHN GRAPHVERSION \*^?GROK \F GRNOINITGRAPH\, GRNOTDETECTED\GRFILENOTFOUND \GRINVALIDDRIVER\ GRNOLOADMEM\j GRNOSCANMEM\ GRNOFLOODMEM \GRFONTNOTFOUND \t GRNOFONTMEM\\ GRINVALIDMODE\BGRERROR\. GRIOERROR\ GRINVALIDFONT\GRINVALIDFONTNUM \DETECT \CGA\MCGA \EGA\lEGA64\\EGAMONO\tIBM8514\`HERCMONO \JLATT400 \6VGA\& PC3270 \ STCOLOR\ STMONO \ .STLOW\STMEDIUM \NSTHIGH \CGAC0\CGAC1\CGAC2\xCGAC3\fCGAHI\TMCGAC0 \@MCGAC1 \,MCGAC2 \LMCGAC3 \MCGAMED\|MCGAHI \EGALO\EGAHI\EGA64LO\EGA64HI\ EGAMONOHI\z HERCMONOHI \bATT400C0 \LATT400C1 \6\ATT400C2 \ ATT400C3 \ ` ATT400MED\ATT400HI \VGALO\VGAMED \VGAHI\DPC3270HI \ IBM8514LO\z IBM8514HI\dRBLACK\RBLUE \@GREEN\.*CYAN \RED\ MAGENTA\BROWN\l LIGHTGRAY\DARKGRAY \T LIGHTBLUE\ LIGHTGREEN \ LIGHTCYAN\v LIGHTRED \`  LIGHTMAGENTA \F YELLOW \2WHITE\ :EGABLACK \ >EGABLUE\EGAGREEN \EGACYAN\EGARED \ EGAMAGENTA \EGABROWN \J EGALIGHTGRAY \p EGADARKGRAY\X8 EGALIGHTBLUE \>9 EGALIGHTGREEN\$: EGALIGHTCYAN \ ; EGALIGHTRED\<EGALIGHTMAGENTA\= EGAYELLOW\>EGAWHITE \?SOLIDLN\PDOTTEDLN \ CENTERLN \jDASHEDLN \T USERBITLN\>L NORMWIDTH\( THICKWIDTH \0 DEFAULTFONT\ TRIPLEXFONT\ SMALLFONT\ SANSSERIFFONT\ GOTHICFONT \HORIZDIR \VERTDIR\n USERCHARSIZE \TLEFTTEXT \> CENTERTEXT \& RIGHTTEXT\ BOTTOMTEXT \TOPTEXT\\CLIPON \CLIPOFF\FTOPON\TOPOFF \ EMPTYFILL\ SOLIDFILL\j>LINEFILL \T LTSLASHFILL\< SLASHFILL\& BKSLASHFILL\ LTBKSLASHFILL\4 HATCHFILL\ XHATCHFILL \INTERLEAVEFILL \ WIDEDOTFILL\ 6 CLOSEDOTFILL \x USERFILL \b NORMALPUT\LCOPYPUT\8XORPUT \$ORPUT\ANDPUT \NOTPUT \ MAXCOLORS\ PALETTETYPE] $SIZE QCOLORS Q l tj J :LINESETTINGSTYPE ] 0 LINESTYLEQDPATTERNQD THICKNESSQD R~TEXTSETTINGSTYPE ]F^FFONT QD DIRECTIONQD~CHARSIZE QDfHORIZQDRVERT QD> $FILLSETTINGSTYPE ]PATTERNQDCOLORQDt:FILLPATTERNTYPE] r POINTTYPE]8ZXQ\YQL&F VIEWPORTTYPE ]P<X1 QY1 QX2 QY2 QCLIP Q b ARCCOORDSTYPE]pvh<NXQxYQhXSTART QRYSTART Q<XEND Q(YEND Q  RESTORECRTMODE D GETARCCOORDS D (p SETVISUALPAGED 6D SETACTIVEPAGED DD^ SETWRITEMODE D R4 GRAPHDEFAULTSD` SETBKCOLOR D nD GETBKCOLOR 6D|^ SETALLPALETTED R GETPALETTE D  $X~ SETPALETTE D LFGETPALETTESIZE 6&GETDEFAULTPALETTED  $ SETRGBPALETTEDSETCOLOR D D"GETCOLOR 6DvL GETMAXCOLOR6DTOUTTEXTD * OUTTEXTXYD TEXTHEIGHT 6 D$ TEXTWIDTH6 D2SETTEXTJUSTIFY D @D~Dx* SETTEXTSTYLE DNDNDHDB|GETTEXTSETTINGSD \F CLEARVIEWPORTDj SETVIEWPORTDx~GETVIEWSETTINGSD jGETX 6pGETY 6TXMOVETO D *$MOVERELD & DETECTGRAPHD INITGRAPHD$ CLOSEGRAPH D GRAPHERRORMSG6 ZN| GRAPHRESULT62GETMAXX6FGETMAXY6 GETMAXMODE 6. GETGRAPHMODE 6< GETDRIVERNAME6JR GETMODENAME6 jX^ GETMODERANGE Df4.( SETGRAPHMODE D t2SETASPECTRATIO D DD"GETASPECTRATIO DDD. CLEARDEVICED FLOODFILLDRLDFSETFILLPATTERN DD SETFILLSTYLE D DDGETFILLPATTERN D GETFILLSETTINGSD p IMAGESIZE6rf`ZTGETIMAGE D.("RPUTIMAGE DRDLINE DXLINETO D *LINERELD 8\V SETLINESTYLE DFD,D&D jGETLINESETTINGSD T PUTPIXEL DbDGETPIXEL 6 DpBARD~vpjd"BAR3DDB<60D*$ FILLELLIPSEDDDDRAWPOLY DDRxFILLPOLY DDRnARCDrlDfD`DZ$CIRCLE D60D*PIESLICE DDDDR RECTANGLEDPELLIPSEDDD~DxDrFSECTOR D NHDBD<D6D0 HALFX6,HALFY6&` BSystemOSystem2STPASCALGEMDECL&GEMAES 0GEMVDIBBIOS Graph4 GRAPH RESTOREC GETARCCORSETVISUAFSETACTIV SETWRITEGRAPHDEFSETBKCOLGETBKCOL"SETALLPA.GETPALET:SETPALET GETPALETGETDEFAUFSETRGBPASETCOLORGETCOLORGETMAXCOOUTTEXTOUTTEXTXvTEXTHEIGTEXTWIDTSETTEXTJSETTEXTSGETTEXTS VCLEARVIE >SETVIEWP JGETVIEWShGETXtGETYPMOVETO\MOVERELDETECTGR,INITGRAP CLOSEGRA GRAPHERR bGRAPHRES nGETMAXX zGETMAXYGETMAXMOGETGRAPH GETDRIVE GETMODENGETMODER &SETGRAPHSETASPEC~GETASPEC 2CLEARDEVfFLOODFILSETFILLPSETFILLSGETFILLPGETFILLSRIMAGESIZ^GETIMAGEjPUTIMAGELINELINETOLINERELSETLINESGETLINESPUTPIXELGETPIXELBBARZBAR3D*FILLELLIDRAWPOLYFILLPOLYARCNCIRCLEPIESLICErRECTANGLELLIPSE6SECTOR4HALFX@HALFY@ &Z ZARLt6tE_REf*EE_R: GET_@GE l0 n OU**_MOUDDNE_C6P \4h:$t((EST _DISP NU_H*l0  n | $"f.:\ F*R0^*jbNv|N$B2BBv*N@*\*T*L*8\FZT(lLr*B6< BB~Nd0ZZfpHrH$~T*2pL$bNX`<Bgp$PNN$ . *:2f:D,FZDRt$6l*l^xZZF>`t<~fd.,<  J fX ` &*t 2p* >2*x JH V*j bzN n  z   $  l( ~R 8 @ d d .|d&t,4 dl d&dF dJdfd|"d,|6d@|JdT|^dh|rd||d|d|d|d|d|d|dd |d|"d,|6d@|JdT|^dh|rd||d|d|d|d|d|d|d|d|&d0| ddddd$d*d d6dd d*d0d d6dd d d6dd d4h$:d*d8h$d6dRdrdddddd,dJdjddddddd$lVdldrdhdddddd"d d6d0d6dDlJdXl^d d6dd d6ddd d6dd d d6dDdd.d~ddd:d d62dDdRl`djdvd d6rdddddld d6$df>dfndxD(d d6$df>dfddddd8dNlTd d6(4xNddddNdhlnd|d6$d.d6l<dJlB^dhdrlxd|d6$d.d6l<dJlB^dhdrlxd|d6*dRd2~d2d2dddld|d&d0d6d`d2jd d64dbdrddl dl dl dl dl d$(*d0d6d<lHdZd`d~l d6Rd^djddld d6d d d6d"d0d>dHdNdTl\pfdtlzdld dd"d,d2d<dBd dd>dHdRd d6Vd\dldzlddd(d2l8dBldld d6dd d6d&,d:Pbrddddd((l\dd d6*dL0d:dFd\dlrd((ljdd(&d<d d68d>dDdNdZdz((l\dd d6d"d,dJl2PdVdzl\dd d6dd&dF(V(^ljdd(dd d6d"d0d>dHdRlXd d6dd d,dBdRXdf|l\dd 2B`dfzdfd~ddd,dBdXd d6dd&d6l<d d6d"d0dJdldrdxlpdldld d6dd d6d"d(d d6dd&d6lBd dd4dBd d6 d8|ddddlpdld0l6d@lLdd6dd*dPdjdxldd d4d>PdVdbd8dd6ddlfd lJdl.(d4d:dFd d6dd d6d$d hdd&d.d 4d^tdddRdddd dd"d(d6d>d DdNTdbdjd pddDd6 d6(dLdVh\dhd d6(dHdVhbdhdtd d^&x@<x@Rx@ d^&x@<x@Rx@B|HdVd^hr|xddx"d:dDdNdZhfp(ptddlddh0dxBdRdpdxddddldddddlXdd dd6dD"dR(d.d`4ddd "dx(d2d@dFLdRd`dNld@ dhrdVd d6ddf d6dd d6d*|H|Nd d6d"d2`@NZd fdvdd|d*d<|Nd^`l~|d d6ddfDdNdTdbd dl6dd d$d*d d6Bdbdjdrdzddddl`d d6d d d"d,d|2d8dBlXd^dbdhdldrd dd d6dd d6dd |6h ddd,$d*d0d6l(<p|JhTd^dldx~ddhdh~ d6d:L^p$6Fbtdd,d dd&dNqNqNVUN0H=@N^NuNqNqNVUN0H=@N^NuNqNqNVp n 0=@p n0"n 2p0."n2N^ _PNNqNqNV n =P n"n 2"n2N^ _PNNqNqNV0.H/BgHn?<NHn/. ?<NN^ _TNNqNqNVHn?.NXHyHnBgNNBgNN^ _TNNqNqNV?9BgNN^NuNVHGp0?p0+?p0+?N&_N^NuNVHGp0.6p0.7@p0.7@p0. 7@0+klHkHkNp0. 7@p0.7@ &_N^ _O NNqNqNVHzHy"?<NHzHy,?<NHzHy6?<NHzHy@?<NHzHyJ?<NHzHyT?<NHzHy^?<NHzHyh?<NHzHyr?<NHzHy|?<NHzHy?<NHzHy?<NHy,Hy?<NN^Nu   @  p8 Hy?<*NHzLHy?<*NHzTHyf?<*NHz^Hy:?<*NHz`Hy?<*NHzlHy?<*NHzHy?<*NHzHy?<*NHzHy^?<*NHzHy2?<*NN^NuNo error Graph not initialized. Graphics hardware not detected.Device driver not found. Invalid device driver. !Not enough memory to load driver.Out of memory in scan fill.Out of memory in flood fill. Font file not found. Not enough memory to load font.*Invalid graphics mode for selected driver. Graphics error.Graphics I/O error.Invalid font file. Invalid font number. NqNqNVJ9 f ?=@=A`Rn0.HU?=@=A`Rn?9?.0.AHpN0.nfpr@m.=@=A`Rn0.2.C0.nfAC""""UN0 @f8pr@m*=@=A`Rn?.?.N0.nf`b @f:BgBgN?<?<N?<?<N?<?<N`" @fBgBgN?<?<NN^NuNVHNp0.U&Np0n6p0.3?9p0.?N?9p0.?NBy&N^ _TNNqNqNVN=yByN^NuNqNqNVN=yByN^NuNqNqNVBgp0.?NN^ _TNNqNqNVN9H=@ByN^NuNqNqNVUN0R@=@N^NuNVHN&nUN60S@re8A@`R.p.r.AC..f&_N^.NuNqNqNV/.Hn?<NUN0._nhBy0.S@rePA@`R.p.A 0o"p.?p.A0H?N..f` 3N^.NuNVH&nUN60S@rAm4=A=@`Rn0.2.AC0.nf&_N^.NuNqNqNVN n _D n_DgL0.AAC"2?9?. HnN0. 2.CBy` 3N^.NuNqNqNVN nnJn \D n@ ]DgJn \D n@ ]DgJn\D n@]Dgr0.2. C30.2. C30.2.C3?9?.0.AHpNByN^ _PNNqNqNVN0.n oHnHn N0. noHn HnN0. nR@2. nRAHHAtAB=@0.HrN2.n RAHN-@ .-@ByN^ _PNNqNqNVN0.noHnHnN0.n oHnHn N0.n=@0. n=@/. X-@0.R@2.RAHHAtAB=@0.R@=@0.H=@Bn=yHn/.?<N/. -@Hn/.?<NB0.y=@0.y=@0.y=@0. y=@BnBn0.R@=@=n?9?<HnHnHnNByN^ _O NNqNqNVNp0.?HnNBg?<NXHnNg2B/. Hn?<N/. X-@/. -@/.Hn?<N=n=nBnBn=n=n09n=@09n=@09nn=@09nn=@p0. f =|`N f =|`: f =|`& f =|` f=| ?9p0.?HnHnHnNByN^ _O NNqNqNV/.Hn?<NN y(f?9BgN?9HnHnN0.n=@ y(f?9?<NByN^.NuNqNqNV/.Hn?<NN y(f?9BgN?9HnHnN0.n=@ y(f?9?<NByN^.NuNVH/.Hn?<NNBnBnGp0+ fTp0+JfUHnN0H=@`,p0+ fUHnN0HD@=@ nl$Up.@@=@HnN=_?909nn?09n n?HnNBy&_N^ _PNNVH/.Hn?<NUNUNHnNGp0+JWDr2+JWDgUHnNp0y&_N^.NuNqNqNVNp0. J]Dr2. ^Dg3`Hp0. J]Dr2. ^Dg3`p0. 3p0. f?9BgN`t f?9BgN`X f?9?<N`: f?9?<N` f?9?<Np0. 3p0. "<N3(?9?9(Np0.3p0.Z=@By?9p0.?HnHnHnHnNN^ _\NNqNqNVNp0. J\Dr2. _Dr2.J\Dt4. _DgZByp0. 3p0.3p0.Jf=|?9p0. ?p0.?HnHnN` 3N^.NuNqNqNVNA"n""2ByN^.NuNqNqNVN0.y=@0. y=@0. y=@0.y=@?9?9 NUN=_?9?<HnN?9?.NByN^ _PNNqNqNVUNUN?. ?.N0. y30.y3 N^.NuNqNqNVUN=_UN=_?.?.0.n ?0.n?N0. y0.y N^.NuNqNqNVNp0. WDr2. WDr2. J\Dt4. _Dg^ByJ9f=|?9p0.?Np0.3p0. 3p0. 3p0. fp0. l`Bnpr@mN=@=A`Rnp0. J^DHn=@p0. =@ 0.H=@0.nf`=|?9?<N?9?.N`dp0. f =|`: f =|`& f =|` f=|?9?.N` 3N^ _\NNqNqNVNA"n"2ByN^.NuNVHNp0.HyHn?<D&NHyHn?< N=CHnHn?<DNHnHn?< NHnB?< SN=@?.?.p0. ?p0. ?p0.??.NN?90.y?0.y?p0.??.p0. r N?p0. r N?NNBy&N^ _O NNVHNp0. r2. oHn Hn N?90.y?0.y?p0.?p0.HyHn?<D&NHyHn?< N=CHnHn?<DNHnHn?< NHnB?< SN?p0. r N?p0. r N?N?.?.p0. ?p0. ?p0.?NHnN?.?.?.?.N?.?.?.?.N&N^ _O NNqNqNVN?.?.p0.?p0. ?p0. ?p0.?NN?90.y?0.y?p0. ?p0.?p0.r N?p0. r N?NNByN^ _O NNqNqNVN0.y=@0. y=@?9?.?.p0. ?p0.?NN?9?.?.p0. ?p0.?Bg?<NNByN^ _PNNqNqNVN?90.y?0.y?p0. ?p0.?p0.r N?p0. r N?N?.?.p0.?p0. ?p0. ?p0.?NHnN?.?.?.?.N?.?.?.?.NN^ _O NNqNqNVN0.y=@0. y=@0. y=@0.y=@?9HnNByN^ _PNNVHNN?90. y?0. y?p0.?p0.HyHn?<D&NHyHn?< N=CHnHn?<DNHnHn?< NHnB?< SN?Bg?<NNBy&N^ _\NNqNqNVp0. =@HnHn?<DNHz@Hn?< NHnB?< SN=@0.nlHnHnN0. nlHnHn N?.?.?.?. N?.?.?.?. Np0. 2.HҀ=Ap0. 2.HҀ=A0.n=@?.?. ?.0. n?N?.0. n??.?.NJ.gD?.?.?.?.N?.?.?.?.N?.?.?.?.NN^ _O N?NqNqNVN?90. y?0. y?p0.?NByN^ _\NNqNqNVN0.y=@0. y=@0. y=@=n=n0.y=@=n=n=n=n?9?9 NUN=_?9?<HnN?9?.NByN^ _PNNqNqNVN"n 2"n2N^ _PNNqNqNVNp0. 3p0.3ByN^.NuNqNqNVN?90. y?0.y?HnHnN=n ByN^.NuNqNqNVUN=_p0.?N?. ?. ?. ?. Np0.?NN^ _\NNqNqNVNp0. Hn,By/.Hnp0. ?Np0. SrAmn=A=@`Rn0.d(0.H2.IA40yC3`$0.H2.IA40yC30.ܰnf?9?9 NUN=_?9p0. ?HnNp0. HC3p0. RHC3?9p0. R?HnN?9?.N` 3N^ _\NNqNqNVBnp n0( rAmr=A=@`RnTn0.H n2( nA޲pWD2.RAI n4( nA޴pWDg0.R@=@ `0.nfp n0( =@ N^.NuNqNqNVNp0. HnBy/.Hnp0. ?NU/N=_0.HS@rAmn=A=@`Rn0.d(0.H2.IA40yC3`$0.H2.IA40yC30.ڰnf?9?.HnN0.ܑn p0. Jo p0. ?0.HHAHpN` 3N^ _\NNVH n C""p0.U&Np0n2HnHy?<N?< p0.?NBy` 3&N^ _\NNqNqNVpr@m=@=A`Rnp n0( 2.ArA"0=A0.S@n2."n0.n2."n0.n@2."n0.n@2."n0.nftN^.NuNqNqNVNp0. J\Dr2. _Dgd/N?9Hn?<N?9p0.?N?9?<Np0. 3p0.3By` 3N^.NuNqNqNVN"n"ByN^.NuNqNqNVNHy/.?<NByN^.NuNVHYN#*By$YBgBgUNUNN -@pre@A`R.N op.3$p.HA*Hp/.Np.Hr.It.J&A* 0 ("<N"<A*Ұ@C*#0p.HA*/0 .?BgN`p.HA*B..f0LN^NuNqNqNV y$f y&f4/9./9*YBgBgUNUNN ?NHy.YBgBgUNUNN /NBgNBgNN^NuNqNqNVNp0. _Dr2.IA*JVDg,?`$FBSystemOSystem2 Printer(NPRINTER(IBBF*B 4N" ( dld d*l0d8l< dldl ldd4l dNqNqNVHyHz0NHyHy?<NHyBNN^NuPRN: NqNqNV#HyNN^NuNqNqNV#H@#NN^NuUNI2llh?:뤱/ ǒN p d. d ǒ ǒ bl1S~*|:(z:Z;>h/:(/1p7B302<5;=f4,(<15.*)6;78$<>1n8z,(t>6=/=969;8!6L8(.=35$0*d; 811d7nSTPASCAL N LONG_MAXINT\\ SCREEN_DEVICE\BPRINTER_DEVICE \& MAX_C_STRING \ MAX_FN \ MAX_PATH \PALFA ]    SHORT_INTEGER] LONG_INTEGER ]|C_STRING ]BN V B8 STRING_PTR ]jB FILE_NAME] PATH_NAME]RP SHORT_ROUND6  SHORT_TRUNC6 x(l LONG_ROUND 6 P6D LONG_TRUNC 6 (DINT6 RCTOPSTRD`BPTOCSTRDnBST_SHL 6|~ST_SHR 6fZTPWROFTEN 6 *:.BASEPAGE D fCMD_ARGS 6 CMD_GETARG DOPTION 6 FILENAME 6 |pKEYPRESS 6V IO_RESULT66PEEK 6 WPEEK6 0LPEEK6 $POKE D2WPOKED@zLPOKEDNXRMOVE_B D\.("zMOVE_W DjMOVE_L DxCLOCK6SETDATED|vSETTIMEDRLF8GETDATED"GETTIMEDCUR_ON DCUR_OFFDCUR_UP DCUR_DOWN D CUR_RIGHTD`CUR_LEFT D CUR_UP_SCROLLD "CUR_DOWN_SCROLLD.CUR_HOME D< CLEAR_HOME DJp SAVE_CURSORDXRESTORE_CURSOR Df SELECT_COLOR D t.SELECT_BACKGROUNDD INV_ON DINV_OFFD DELETE_LINED CLEAR_LINE D< INSERT_LINED START_OF_LINED END_OF_LINEDP END_OF_SCREENDSTART_OF_SCREEND WRAP_ONDdWRAP_OFF DINSUPER6x*SUPERD 8PnSCRLEN_B \<}SCRLEN_W \&>BSCRLEN_L \@ERR_CODE ]SCREEN_B ] |} rSCREEN_I ] >} pSCREEN_L ] $X ?`}V 6 PTR_SCREEN ] L $PALETTE]  p| RESOLUTION ] SCREEN_TYPE] *RESQPALQ zPICQ" $h}" ^8 GET_SCREEN D F . PUT_SCREEN D T  READ_SCREEN6b WRITE_SCREEN 6p NO_PORT\ROOT \l NULL_INDEX \|bMAX_LEN\hQ MAX_DEPTH\RMAX_TREE \<d NO_WINDOW\& MAX_WTITLE \PR_TREE \TR_STRING \ E_KEYBOARD \E_BUTTON \E_MOUSE1 \E_MOUSE2 \ E_MESSAGE\tE_TIMER\` REPLACE_MODE \F TRANS_MODE \.XOR_MODE \(REV_TRANS_MODE \PAT1 \jPAT2 \PAT3 \RPAT4 \PAT5 \PAT6 \PAT7 \~PAT8 \l PAT9 \Z PAT10\H PAT11\6 PAT12\$ PAT13\PAT14\PAT15\PAT16\HPAT17\PAT18\PAT19\^PAT20\^PAT21\^PAT22\p^PAT23\^^PAT24\LbHATCH1 \8`HATCH2 \$^HATCH3 \\HATCH4 \ZHATCH5 \XHATCH6 \VHATCH7 \ THATCH8 \!HATCH9 \"HATCH10\#HATCH11\p$HATCH12\\%SOLID\JnLONGDASH \4DOTTED \ &DASHDOT\ DASHED \T DASHDOTDOT \\NORMAL \n THICKENED\z LIGHTENED\0SLANTED\ UNDERLINED \tOUTLINED \^pSHADOWED \H $ SYSTEM_FONT\0 SMALL_FONT \`G_BOX\BG_TEXT \< G_BOXTEXT\DG_IMAGE\ G_PROGDEF\G_IBOX \G_BUTTON \ G_BOXCHAR\rDG_STRING \\6G_FTEXT\Hf G_FBOXTEXT \0fG_ICON \zG_TITLE\ VNONE \ SELECTABLE \DEFAULT\XEXIT_BTN \EDITABLE \ RADIO_BTN\ LAST_OB\t TOUCH_EXIT \\@ HIDE_TREE\FPINDIRECT \0SELECTED \CROSSED\CHECKED\DISABLED \G_NAME \G_CLOSE\hG_FULL \G_MOVE \rG_INFO \xG_SIZE \d  G_UPARROW\N@ G_DNARROW\82G_VSLIDE \"XG_LARROW \ G_RARROW \VG_HSLIDE \G_ALL\nWHITE\BLACK\RED\GREEN\BLUE \vCYAN \dTYELLOW \PMAGENTA\<L_WHITE\(LL_BLACK\ L_RED\ :L_GREEN\ L_BLUE \ L_CYAN \ L_YELLOW \ L_MAGENTA\ MN_SELECTED\ WM_REDRAW\l WM_TOPPED\V WM_CLOSED\@ WM_FULLED\*< WM_ARROWED \BWM_HSLID \WM_VSLID \WM_SIZED \WM_MOVED \ WF_PREVXYWH\L WF_FULLXYWH\ WF_HSLIDE\t WF_VSLIDE\^ & WF_HSLSIZE \F WF_VSLSIZE \.AC_OPEN\(AC_CLOSE \) COLOR_REG]  DRAW_MODES ] B LINE_TYPES ] R PAINT_TYPES]Z %b GEM_DEVICE ]62 :*INQ_TYPE ]\ \^ OPEN_VALS\\EXT_VALS \\ MOUSE_TYPE ] M_ARROW\ M_TEXT_CURS\|M_BEE\j M_POINT_HAND \P M_FLAT_HAND\8 M_THIN_CROSS \\ M_THICK_CROSS\` M_OUTLN_CROSS\PTEXT_PTR ]XWORD16 ]   MOUSE_FORM ]tv*HOT_XQrHOT_YQ^RESQL MASK_COLOR Q2 DATA_COLOR QMASK Q DATA Q*J WINDOW_TITLE ]RPMESSAGE_BUFFER ]~  |\L CTRL_PARMS ]:B  J@&  INT_IN_PARMS ]x   d INT_OUT_PARMS] -\ PTS_IN_PARMS ]  ft PTS_OUT_PARMS]2J  RH( ADDR_IN_PARMS]p f \ADDR_OUT_PARMS ] fPOINT]XQYQb RECTANGLE]lF$2XQHYQ8WQ(HQ" STR30] STR255 ]TE_JUST] ~*TE_LEFT\nZTE_RIGHT \X TE_CENTER\B TREE_RANGE ] >* d2: TREE_INDEX ] f d *OB_TYPE]  ` TEXT_ED_INFO ]!ߴdTE_PTEXT Qjߒ TE_PTMPLTQjz TE_PVALIDQjbTE_FONTQ hTE_JUNK1 QPTE_JUSTQ:TE_COLOR Q"TE_JUNK2 Q TE_THICKNESS Q TE_TXTLENQ TE_TMPLENQ޾ ޘTED_PTR]!~!t SPEC_INFO]"zX0R>THICKQVCOLORQBINFO Q!PTRQSTRQj"OBJECT ]#OB_NEXTQOB_HEADQݰOB_TAILQݚOB_TYPEQ݄OB_FLAGS QlOB_STATE Q TxOB_SPECQ "z"OB_X Q*OB_Y Q|OB_W QOB_H Q"TREE ]#ܰ x#ܦ >ܢTREE_PTR ]#܊#܀*MENU_PTR ]#dJ DIALOG_PTR ]#P ICON_BLOCK ]%<|"8IB_PMASK Q6IB_PDATA QIB_PTEXT QIB_CHARQ IB_XCHAR QIB_YCHAR QIB_XICON QۨIB_YICON QېBIB_WICON QxIB_HICON Q`IB_XTEXT QHIB_YTEXT Q0IB_WTEXT QIB_HTEXT Q "$, BIT_BLOCK]&4ھnDVBI_PDATA QڸBI_WBQڤBI_HLQڐBI_X Q|BI_Y Q hBI_COLOR Q P%*.USER_BLK ]&UB_CODEQ UB_PARMQ&ZPARM_BLK ]'ٲPB_TREEQٮPB_OBJ Q٘ PB_PREVSTATE Q| PB_CURRSTATE Q`PB_X Q LPB_Y Q 8PB_W Q$PB_H QxPB_XCQPB_YCQPB_WCQPB_HCQPB_PARMQت&؄ ADD_DITEM6 fb~ #Vlf`ZTNHB ADD_MITEM6(# f ADD_MTITLE 6#lAES_CALL D׼xךהp׎׈ AES_VERSION6׈ BEGIN_MOUSED BEGIN_UPDATE D BORDER_RECTDBRING_TO_FRONT D  CENTER_DIALOGD #֊4 CLEAR_SCREEN D h CLOSE_WINDOW D X8 DELETE_DIALOGD &# DELETE_MENUD 4#( DELETE_WINDOWD BDO_ALERT 6P՚հ DO_DIALOG6Ֆ^#nՄHDRAGBOXD l `ZTNHB<60*ܞ DRAW_MENUD z# DRAW_MODED . DRAW_STRINGDԶ԰ԎhD_COLOR6ԒԆԀztn END_DIALOG D #*x END_MOUSED END_UPDATE D^ ERASE_MENU D #EXIT_GEM D4 FIND_ALERT DӔr FIND_DIALOGDf#D FIND_MENUD:# FIND_RESOURCE6 #"  FIND_WINDOW6 0 FIRST_RECT D>ҮҨҢҜҖ FRAME_ARCDLpjd^XR FRAME_OVAL DZ*$\ FRAME_RECT DhFRAME_ROUND_RECT DvѰѪѤў0 FREE_RESOURCED FRONT_WINDOW 6\t GET_DEDITD# f GET_EVENT6D мжаЪЈОИВЌІЀGET_EX_IN_FILE 6`82, GET_IN_FILE6,> GET_OUT_FILE 6 GET_WINDOW 6FGROWBOXDϤϞϘϒόφπzV HIDE_MOUSE DINIT_GEM 6> INIT_MOUSE D\JUSTIFIED_TEXT D,ΰ LINE_COLOR D :Έ LINE_ENDSTYLED Hztx LINE_STYLE D V0LINE_TOD d(" LINE_WIDTH D r LOAD_RESOURCE6 ʹ& MENU_CHECK D#͌ f͆͜ MENU_DISABLE D#V fP MENU_ENABLED#( f"& MENU_HILIGHT D# f MENU_NORMALD# f MENU_REGISTER6̶̔ MENU_TEXTD#n fhbMOVEBOXDZTNHB<MOVE_TOD  NEW_DIALOG 6# NEW_MENU 6#˜ˬˊ NEW_WINDOW 6ˊ(~\rlf` NEXT_RECTD6:4.("OBJ_DRAW DD# f f4OBJ_FIND 6ʾR#ʖʬʦʠʚ6 OBJ_FLAGS6ʀ`#X fR OBJ_OFFSET Dn#*@:4 OBJ_REDRAW D|# fܪ OBJ_SETFLAGS D# fɺ OBJ_SETSTATE D#Ɋ fɄɚɔOBJ_SIZE D#Rhb\VP OBJ_STATE66# f OPEN_WINDOWD PAINT_ARCDȾȸȲȬȦȠ PAINT_COLORD \` PAINT_OUTLINED N PAINT_OVAL D& ߔ PAINT_RECT DPAINT_ROUND_RECT DǬǦǠǚ PAINT_STYLED $rPLINED2PJD>LINE D@ PLOT D NvRECT_INTERSECT 6 \ƶưƪƤƞƘƒƌ REDO_DIALOG6pj#H^ RUBBERBOXDx82,& nSET_CLIP Dߦ SET_COLORDŠŶŰŪ SET_DEDITD#h fb\VPfD SET_DTEXTD# f( SET_MFORMD  SET_MOUSED ĺX SET_WINDOW D Į SET_WINFODĈf~ SET_WNAMED\: SET_WSIZED 0*$j SHOW_DIALOGD  #B SHOW_MOUSE D SHRINKBOXD .èâÜÖÐÊÄ~ SYS_FONT_SIZED <TNHBTEXT_ALIGNMENT D  J: TEXT_COLOR D  X TEXT_HEIGTHD  f TEXT_ROTATIOND  t–| TEXT_STYLE D  n VDI_CALL D& HB<6:x2WIND_GET D WIND_SET D  WORK_RECTD d^XRLZBSystemOSystem2GEMDECL&GEMAES0GEMVDI]DOSBIOS STPascal STPASCAL SHORT_RO SHORT_TR LONG_ROU LONG_TRU INT 8CTOPSTR DPTOCSTR ST_SHL ST_SHR PWROFTEN (BASEPAGE @CMD_ARGS LCMD_GETA rOPTION ~FILENAME KEYPRESS IO_RESUL PEEK WPEEK LPEEK POKE WPOKE LPOKE MOVE_B MOVE_W ,MOVE_L 4CLOCK PSETDATE \SETTIME hGETDATE tGETTIME CUR_ON CUR_OFF CUR_UP CUR_DOWN CUR_RIGH CUR_LEFT CUR_UP_S CUR_DOWN CUR_HOME CLEAR_HO SAVE_CUR RESTORE_ SELECT_C SELECT_B (INV_ON 4INV_OFF @DELETE_L LCLEAR_LI XINSERT_L dSTART_OF pEND_OF_L |END_OF_S START_OF WRAP_ON WRAP_OFF INSUPER SUPER GET_SCRE PUT_SCRE READ_SCR WRITE_SC ADD_DITE|ADD_MITEpADD_MTITAES_CALL AES_VERSBEGIN_MO6BEGIN_UPJBORDER_RBRING_TOCENTER_DrCLEAR_SCCLOSE_WI JDELETE_DdDELETE_MDELETE_W DO_ALERT$DO_DIALODRAGBOXDRAW_MENDRAW_MODDRAW_STRD_COLORHEND_DIALEND_MOUSBEND_UPDAERASE_ME EXIT_GEMFIND_ALEFIND_DIAFIND_MENFIND_RESFIND_WINbFIRST_REFRAME_ARFRAME_OVvFRAME_REFRAME_ROFREE_RESFRONT_WI0GET_DEDI*GET_EVEN`GET_EX_ITGET_IN_FlGET_OUT_GET_WINDGROWBOXHIDE_MOU INIT_GEMINIT_MOUXJUSTIFIELINE_COL@LINE_ENDLINE_STYRLINE_TO4LINE_WID~LOAD_RESMENU_CHEMENU_DISMENU_ENAMENU_HILMENU_NORMENU_REGMENU_TEXMOVEBOX.MOVE_TO >NEW_DIAL>.NEW_MENUNEW_WINDnNEXT_RECOBJ_DRAWpOBJ_FIND OBJ_FLAG|OBJ_OFFSOBJ_REDROBJ_SETF OBJ_SETSOBJ_SIZE OBJ_STATOPEN_WINPAINT_ARPAINT_CO PAINT_OUPAINT_OVjPAINT_REPAINT_ROPAINT_ST:PLINEFLINE^PLOTzRECT_INT<REDO_DIARUBBERBOSET_CLIPSET_COLO SET_DEDI SET_DTEXSET_MFORSET_MOUSSET_WIND>SET_WINF2SET_WNAM&SET_WSIZSHOW_DIASHOW_MOU(SHRINKBOfSYS_FONTdTEXT_ALITEXT_COLTEXT_HEILTEXT_ROT"TEXT_STYVDI_CALLNWIND_GETZWIND_SETVWORK_REC 4 ( 4 6 4 D 4 R  Z |  ( 4 @Z L f2  f: X r ~*  ~ ~ T ~ n    $ 2 "@ N \ 2j ,4x 84` Dfn Pt \" h$ t( ( 6 6 6 6 6 6 6. < 6J 6X 6f 6t X (X 46 @6 L6 X6 d6 p6 |6 6 6 6 6* 8 V*F T >b 6p 6 x P f 2 2Hy $ >J J ZV J& J VBgN~ J dANq J rHz J Hy" J N NqNq ~ 6N  $ dN J$ 4`$$0^0<0jH$Tb`0lH,Z3xpr*H:0.J"nJDLE ""IAE .ZVdvx.S_FOf.:XT_A.HXT_C4p6| <Pf|NESSz$&F &$((t B& 20>t$Jt$V0 b0>n06z0\~8&:L $ : :8V$ $ $ ` X"$ . : 2Fl0@Rl0d^(NjN$v0hH\$ZB~6vd$6LFz0  $*6BN Z0 f0 <r8 ~h$  0 X PHH$ bl@x00(8 .48r@ HL" tX ,d0 Jp* R|2n(0""&DD<L|. f8$ & >0&&&&$6l((0(B( lnl|&|<JVx| d X,lnRl|f|pd X~@N\hxd d dr~x|$8L|d X`|d d *4>Jx | $&&|lxlljl*t*t*t*t*t*t*t J*t*t*t*t6<Ht6<Ht*t*t*t*t*t*t*t*t*t*t*t ddd,l2d>dDlJd h&.hdh$ h&4h|(*.^&~&&p|(8.^4~44p t(dd d*d@ttFdLddpddpdVd:d$dddrd dp(t||$`2D|Tt x:dddd<Nd $`d $ld $Ld dd rd d d dd Vtdd HdVdddrdxt@|Zhdndn|(|:|b|d $dndndn<t\ddd d&tTtlt\|t"d`tVtdn dn2t@d`Nd`||$`2D|Rdn`dnvtd`d`||.d ^d~dd~dd~&dPd~td~dd^ddd&*d2d\htntd|ddddd Zdfd~t@d"d2dhv`dddddd d:dTdHdTdddt@ dd2t@T|zdd:dHdVddd6H|ZdddXblxxd $|"d2dDdTd dndd t@dBd dt@|dd*d@dZdfd ddx(t@*8dntttt"t:tttt$Jd ftdLd fttt"d ` 2|Jx6ZxDdd ` 2|Jx6ZxDdd "d "d "d "d Lx` ddd$d*d d dd&d .d d2d@p` dpd.p dpd,p dp dpJd p.&d.pJ4d>pPdZp.td~p.dp<dp.dp< d dp dp dddd*d8dDdLdRd`pdd*d8dDdLdRd`p ddd2dd(d0d6dDpdd.dBdNdXp^dxdhdd.d>dPdddtdddddp dd d0p26dPdZ dd d6p\dd.dBdNdXpN^dhdrp@dd.dBdNdXp@ dd d8pj>dHdRd^dvp\ dd d8p\|$`2D|JdTd`dlptttt dpttttt t"t"t* d |6|$`2D|NtFTxtbtbtb$d` tT` 2|Ft24d@dJdTdZx`djddddd.d ddd$d,d2d dddd&d0d:dDdddddddd6dVdxddddd$dHdlddddd dDdhdddddd@dbdddddd0dRdtddddd dBdddddddd0dRdtdddddd:d^ddddd d 2d Td2t "t"t.*t<*tJ dp dp dp|$`2D|JdTd`dxpx d p tjtxttb.t\"t\ ddd d&d,pt\ dddd$d*d0d6dxNqNqNV/.Hn?< CNHnB?<SN=@ N^.NuNqNqNV/.Hn?< CNHnB?<QN=@ N^.NuNqNqNV/.Hn?< CNHnB?<SN-@ N^.NuNqNqNV/.Hn?< CNHnB?<QN-@ N^.NuNqNqNV .=@ N^.NuNqNqNVAFC2""HnHn?< NHnHn?< NA"n ""2N^ _TN@]ݩNqNqNV . ".-@N^ _PNNqNqNV . ".-@N^ _PNNqNqNV"n"N^.NuNVHHnHnHnHnN0.Hr2QA C8A NuM,"z9`-@=@<0afa(@~=| |@4<B0ѮafQA|0.@<0=F:p6|SFBEBDa4@`0 MlN<.8 aJfJEfWv|m JEgBEaVfP`affDRCQRK`JEg 0 a.f(0.a> .a6afa AѐB@Nu20H@a@K0HHC`2HHa(0Ha 0aNuB4@MH4@MѮNu|?| |+n @A`&|:m|@n @5`|[m@a*fRn n@lBNuBnp a p aNuepNuRBNuccPAz NuA: NuA NuA NuNVHl?< N \N^NuNV/.?< N \?<?<N X`N^NuNVHl ?< N \|PHl?< N \=@ABA `N^NuNVH&nHl4NX> Gyg GYg`'k 'kLN^NuNVH0&n +gHlLN8X`NV$@H|f`Hn?<N (\Bg/ ?<NN P gHldNX`A, F, oHlxNX`x oBg/ ?<=N P=@ @lHlNX`F/+/?.?<?N gHlNpX`'k +І'@HlNRXL N^NuNVH0&n$k,+" nHlNX` +o4Hl?< N \HlNX> Gyg GYg`~,+N-@ nH|f`^Bg/.?< G0m G9n??<?<N0\|0 Gf BgN2T0H2HЁ-@/ Gam Gzn|??<?<Nd\Hl(?< Nr\ GCf=| GIfBn GDf }"m=|BnBn GSf=|=|Bn GHfBn GBf =|Bn GFfBn GEf / N6X GRf0.g / N^X GWf / N^X GQg`|67n7n7n0.gBgNT` NJ",ѮBg/.?<1NhPLN^NuNuNV?.NT nn0<`?.?<>N4X9@g0<`0<N^NuNV?.?<LNXN^NuNV/ A&H`0+ |g/ N*X A"Ҽm?.NT&_N^NuNV/ &n/ NDXJ@g0<`00+ |g /+NXBk ?+ N,TJ@g0<`0<&_N^NuNVH&n0+ |f0<`.0+ |gV0+ |f0<`v0+ |g?<B?+ NhP?/+?+ NP @f0<`@k 0Hѫ`$ k o?<0+D@H/?+ NP'@&Bk0<LN^NuNV nl <`?.?./. ?<BN -@ m .`?<?.B?<BN` -@?<?.B?<BNF -@ nf .Ю -@ `$ nf .Ю -@ `0.g <`b . oHn . /?.?<@N Bg?./. ?<BN ]|9@g <` `Bl . N^NuNV/.?<IN\N^NuNVBn`&0.Ad0nf0.AdBPRn nLmN^NuNV?>.=|0Ad"HPgXHf0(>N^Nu)I`)J\)_XNM"l`$l\/,XNu)I`)J\)_XNA"l`$l\/,XNuNV`4 nH| f?< ?<NX nRH??<NX0. Sn J@fN^NuNV` nRH??<NX0. Sn J@fN^NuNV` nRH??<NRX0. Sn J@fN^NuNVH0&n $KA>-H nf?./ N4\=n`L nf?./ N`\=n`. nf?./ Np\=n`-KBn?.NvTJ@f`H| f |o@ H-@/./.?.?<@N| 9@Hg0<`0,n/./<?.?<@NF 9@ @g0<`tRnR -@`R ned` 6.ƼЃ$@ H-@/./.?.?<@N 9@Hg0<`0,nBl0.L N^Nu)|C"2"2 2"2"2"22"2"2"22"2x9|NuE BARREL by Moshe Braner Enter filename: Are you sure (y/n)? Empty barrel first! File not found! File too big for barrel! Error opening file! Error reading file! [file read, no errors.] Nothing to write! Not all the stuff still there! Save barrel as-is (y/n)? Error creating file! Error writing file! [file written, no errors.] Installing BARREL - choose size in units of 12K (1-9, 0 to cancel): Not enough memory for such a barrel! Barrel installed. (Reboot to remove.) Hit any key [capturing printouts in barrel] [SCODE screendumps to barrel] [DEGAS screendumps to barrel] [stuff in barrel] [printing in background] Immediate hardcopy printouts Capture printouts in barrel Foreground printing only Background printing Hardcopy screen dumps DEGAS format screen dumps SCODE format screen dumps Empty barrel Write barrel to a file Read a file into barrel Quit (accept current settings) Choose by first letter: CON:AUX:PRT: L `$N0`BRMaxon Pascal for ATARI-ST Copyright(C)1991D-House Denmark&oA#IDpB0#IH$k '#H#Ha?pLap`p` IHoa Z#JZa yID aaLaAHJf Aa`a #JV#JR 9H yHrdaQ` Aa.Qa NuadAaAGa aAG6kA:BgHopGa\O OB(?axa INupa?/ap=a`aBg/pAaapaTOJNuBa0kBg?9JHopWaPOa H@NuBBg?9JHopWaPO H@NuH@/?<?9JHopWa NuH(H*Haza&HU@m  :g UpaV<Aa: \g<@H?/ pGa2\Of Jf|\f(Mg<\gat` ,.f, ,\fU` ,.f ,\fW ,:g $\fJf ,:f\BL9aNuNV-H=@=|BP nCa I0..Qa6ga`ag-@gBnAa"na I$.0.N^NuNV/4a"p:agnp\agfJgBA# J yJCJgDg ;fB!#JCJg Ip\aJg AaB WaaL:2aF2a,02a&L0L0pH00Hp2Lap`40 1 1 1 1 Nu40 00 1 1 NuH#KJCp!I 1@!@!@1@!|p1@ WA|BBBpBp1QBp C!IaBLNuH` yKJagR|a>AgLNuH" yKJeJ0na`aLNuKJc (NuHR|" yKJe$J0na`ajgba`aJgB LNuH@ "yKJr21 J1k fALNuH@ yKJpr20 J0nkа`LNuH@  yKJ D`H@ yKJ/aLfa a BLNu2(J0f"pT$( eb !B NutNuH$gDbHr c0" <f&r‚gS?`"Qdp_`QdLNur c2" $<f&rBgS ?`# Qdp_` Qd`Hr$gSk t@` Qd`QLNuKQ,S6,T8B9KTCf6C{0N0>n &`$<g,S,. ,T `t<frx `n<fhx`d"TJf/ S ( pH@pa _ag>,I"Sag4`,"T ),qH@"S )"qH@ 9`,g gf$$`B| g| f| g| fx `&|g | g|f̶|g | g|fx09KP2I"0g#D{@N@ (,+d+$<g<drKR"<g ,fT +fL"T Q d<mX@H$,NW`V`^` ]`\`_(_B,¼)A`a, +f +d ,f ,d ,fPKTL +f La ,.tJg$tx<*+`, La H Ka zt(*,9KRa 09KP T P AdAa`d ,fr +fj<fJg" ,"+<fae`:<fae`.<faf`"HJN ```Ё` ``)@a\` ,fDJf>"<gPPKTL 9 KQf9KR La Zt 9KR,a ` +f*Jf$r$gPKTL Ka`xrgp`!rgt<f0 ,fPKTL +f +abf'AKQ`> 9KRf4pr La pr Ka 09KP;a <`  a09KP"< $g0 +f +d ,f ,d ,fPKTLKSr<g <g, La 6yKR"<09KPgB +f< g4Jg` c$,M9+ Ka,M9+` Ka(*9KS9KR,a t 9KQf t,a `a L`HJ9KTgL K"LpJ+fp Z2QNu L9KRa K9KR(g (gaX`ANu (f a@t (xa |aNuJ(f,PJ.oara"aNu (f.a@0 S P f h fPKTL LaVap Sa09KPAaaNu LaBa~p 9KQgp 9KQgp 9 KQgp S`\,P V f n fNu/,P V fF (g> n g/a& `apD _a`paapaa2"" _Nu,P V f/a/ `a _pDa _Nu,T". UAgUAfZ La Ka`4 (fD,P nng1|Nu1|Nu/A .ap _!@1|P1| P Nu La`a< KaXa4 9KQga@p a09KPA` Laa p `h,P Vfh . |d< (fV|gt|gz2 `QR@"Aa A!@ _1|P1| P Nu?a _aH _a0<`taH _aaL0t &)C,.apNu,P V f (gJ hf <a `Nuraa*tvx<:<(a(tvx<:<(a`1||1h`Jg )"qH@ )"qH@Nu Laj Kafa`9KQp<gPp< gHp<g@p< g< g p<gpat(_9| < 9 KQfH@)@Nu`L/,P VfD (gM;Nu (f /Aa$ _NuJ(f2( /A Jka \SAf _NupM9H/ CKV#"_Nu (f (M9NuJ(f2( /A kM9\SAf _NuKU`B9KU(g,Sfp<"(NuSf (M9NuSfpNup.2(Nu/?( ((A <er:Rgr9"(Jl2`Z"(JlJAg<(`H<`B9KUf |n|l<(t(*a:r<0tM9Z|Bg SWgt v(*a \`T _Nu|9KUa9KUNuKUat9KUgt(*`Nu Ka L(SgrSgDSg@Ug0( S@oJ0 lJgat,.`6Sh at v(*|'` aHaVaL0t ,P&.;0E,.a`/,P\H . V f|fTHa\ _!@P 1|P1| `N (f(`av (fA` (f(f M9`,PJ.n(JfZ nmN g `B f8aHX|paat ((*Fa|`Faat ((*Fa|(cR(t((a`ANu (f&At (g8<f(af"H@0NuAaVPfTN`Nu=\8]QRD6aTdaT8=LWBB\aTaHg`HaT 9LVg^8\aHa"LpaRX P e(M<`& P fAM<8((`A_0R@H8QaTzaHP 9LVgNu8QaHB/ aTXQKxa aH0"_BB)pa#yL|xapavaG 9LVgBNuH"H0@{("9LHPNL "(ЁSga6LNu.ntp`Nup?aGjfp`baGn ) q H@"(  ) qH@avJAgaG0fQaG>paNu&aG* 9LVgN )"qH@ IH@@aT LfR XQfJ (Ѓa~aGDaG ( pH@aaFgaFpaVNu/ $IpBQaFaFg,a\4p aFfaPBealRBBd`abaFngaF` * rH@LIH@RAA`a Q $_NuaZ ( pH@"Jaڳf 9MҼd RdRB|e4<a Jv &ƼH@|BH@NuprNuJk|~kJg(мdRB|e4<aJHBBBNuByKaP/ B\BaPaDQKxa"_2]padaD 9LVg`/ at?aDQKxal/J9KzWKwp(aDfaB^RyM&Nu&HJ+ f J9LYn p2aBg\SyM&aAfpa&aAfpa`aBpVaAgpWaAg`g0Nu"9KJ9KvgrJk^E 9Kwg ERJ9Kwk EXgEjgNv~)C0KzyKv?paZ0N S@fNu` (`X#yM*ӹM*Nu`VyM.iB3yM.Nu`B3yK|yK|iNuRyK|yK|NuNq#BNuRM*yM,NuyM.NuByKa/a _ (gR|#KLWKzB9KvNua.gpKa=f y_2 (lRJ9Kvf.R@||e|eg|g| g|nNuD@NupNu29KJAgd yL P"9ML"A"Q4(QC 4fҼ Mtf`vE4GJVf []f2"X  sH@pa`Nu9KxaXgBpCapf6 g0 dXaj6 ) aR'@'i'i `FaH6pa"H _p a )a2f<orA ( R")aIa'@ KSDf@NurRdJNupFa;f9Kw?9K?9K|?9K~?9K31KByK|ByK~paFaP yML/aFa6LK~a'@ _pa3K3K~3K|3KKw K@Nu09Ka:gp,a:g a09K|yK~e3K~a:g``PL[a:QL[gaXa:09Ka:gF?9K|aa:ga:a:?9K3Ka~3K3K|a:Tg09Ka:Nu/ a^?a:r"yML//?#MLKwaB"yML3###ML0"_`>pHa:f@a: a( p6g pDf0fT`A6V#MPWBg`?Hz`xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" `Hz`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHz>`aaaaaaaaaaaaaaaaaaaaaH o 2`0aQ/H LNuH@aH@/ yLJ9Lfa PL0 _TLTyLjk`U]eNuH@aH@/ yL PLl1 _TANu"Lg&a&ByKJkLmda `pa09LyL PB _NuH` yLy M`d yM`a P29Lfk1Lj49L̔p 1 49L13LfB Bp Bp 1L 0y L#LLlByLjLNuH yL P49Lf1 1 1LNuNuNuNuNua`(yMf/Lg /N _(l`Nu&l(v630g/N _`Nu?630gJs0k/N _630f6NuH"H yLa4r~A\@3La PRhp g0XPpgRhIL22paLNuHaF 8(Pt`4?X/Hv~A0@gSAgQA<./HLNuaaa6a*aH`aTt4`0H`aVt(`&H`aXt.`H`adtR`H`aPtJ`H`aZt MTg A) ` t PpLNu ,2,8HNuaЁ2,,HNuaЁ2,2HNuaЁ",NNuaЁ",VNuaЁ",$NuaЁNuAK"Oa>aJ9F*gpaRpPa˴`paBpa:g Opa2#MPaPk"a Laɬkag?aAKaT0?AKCDa Ia~0NuBKAK#MPJ9F*ga6papPa"`pa˰aknp yD| PafkH yDta PaVk8 yDxa PaFk( yD|a Pra0k yDaJg Paag?a AKaȌ0`:ѹK`ȼaaH$P , L"JaҲaVt4a.aZt(a&a^t.aabtJaadtRaaft aLNuB(C t( P ahNu/ #MPpaʾpaɲf(af"a|c Wa Paf aR"_Nup` / IM^(l g0,DBlDJ@ga4`a"(_NuNVHH0xz~cJg npa8f( n#MPpa$f**g& na,ar,a^ g(H a~.aǾ`~"$0L N^Nu(yGaf?93?#G3cMjaCGBHgHa/pa$a> _Ra8Aa.abaa4a"09MjkJgAMaŊa33MjGL|NuB9JB bVJg #MlGNup29MjkANuAF0gf@NupNuB]aAHaaHa$AHaaJyMjf 2fB9209MjNu2anAHaĞJ9]f "HA]a Ipapaf*a6aAHaĀa ykMjg3lMj`3nMjCMaÚ`\BKBMfB9KNAMd <TaCU#VHpad#_pa#M| <aH#Mx#MtNuaAM|a y_a2NuH#KHyHX#KByMjaa$~pNa$faf&Nu92fadfNuaL]09MjNu3MjLKʒHMl yVH&(T҃ԃHGA&CHa‚ @CHgRNu(>gRg0fabgH` Ka LLf%h:f Qp`pW`pYLNuafNuH`EM^$j Se "j4af JLNu/ CL"ig Sd"_NuH gHAM^ h g,g:/ h4CL#MPa*g#MP _`)yMf#MfLNuA(`JfQNuBy`0&yM| yMaT29`0@l P"Kaay@`0` Kp`8$S Z`f.pЇ#`2Jf/#`6ޚaaJ ѹM*Nua#`2`:`p(*gA_r2g<ae< R<f a#&3MH3MJ*f@ yML Pa$"fX0@ |6g|Df$aaV"yL"Q0( 3 a`&aFf @ <( `@ |Qf,(a9HApѹ`:ap`6j8Nu$y`:Nu"9ML A Pa#gҼ Mtf`0|6g|DNuJ( g ( f~SyM(`SyM&| NuE`2d*arHz[AgUAg<^Af* xgaNNu3`>3Lj`@a8|?|9f`63`>3Lj`@aP°|Ng|NgQ°|Hyg 2||Afa[AfH@aJAgUAg2SAmga|<QfJf`f" `*JfйM*rd`"UaXfPy`@a0||:aNuH@anJAgf|m.ga<QfD"И`A S`2( gNup` a yM P`0a`a `ߘa`ߔA_#MPNu22x0NuGMa0+ alL LpL#]aByM8ByM:B9`\3L^L`QLX92g9LaVLX3M.M2H00+ a(J9]f?9Lja?9Lj av yL P0+ 1LJgHJ9]n0pOaBga^`a!0JAgA`ڮNua?9M.R9`\a" T P eي ,g ,fx( l fjJ, jb0< aa1@a Lava1l K"Ta a0da1"a1ArJoAta"f#`Ja $La14a10 J"Taa0(, Kala, Ja^ KaNt,+*a y`J0(aن?9Lja| La`H`B,.t ,+a|.p,fp>9M.@yM2l3M23M.t ,*aŽ0< .aa?9Lja y`J4,x?9Lja42aJCg2a|Jf&p0a g Jf`aټ/9`Ra#`R`Rg2aD`Nua ( pH@`Nft9`_x<*9M<9`^`aba$p=af9LWf 0<`aՎC`brRQ Yg"2Lj`\`faG2(ga /? $sH@Jkg0/ / a $_ L R fa2a&_ L"Ja R m.a+t`(H0aL JRg Rf 9L_g L"JaJko"* Lav` La\2SAga `na _aJ( l2( 0aԢSAfNuSg>0p`a.a2aPa*aHaap`a aa.aza&aap `d0<``af aTa`0`0faYAfaZ`axpFa` <4>aNua4aaVaa*pBa`aaapCa~`a8fPNua La T0NuaQ@f.Nua| f ,fNuaafNu T Pg Pf La T2@Nu/aa |fH@3`Zg& _aa09`Za`N9Lag0gp1a@gP]a*a#apYa(`Q]Q]Nup`p`p` p`p`p9LVg`Nu0<A`.0<`(0<`"0<`0< `0<`0<` 0<`0<9LVg"H` 9 LVfH yKS`NuH yKa#Kpgk< k;*ngH{Nx~XH.NbX)  B@pZ#K#K`LVC_rt<@g$<0e.<:e<_g<߰<Ae<[dR|?gRAS`#K _I3MHJ3MJAa lfLV`"HR<0e<9ca <Eg<.f( ).g ))gae LV`Zp9`a He#M<LV`g0p (=f(p`"pJr>J9]fp (=fp`(fRRLV#KLB9ddB9LZNu yK 9KҐ|?op?`QNu  gSbafNu<{g<(f" (*fa9]Q]a ]`Nudea $fZaxa @2Cp01fqN4| +fyL^` -fF@yL^|@yL^fNa( ,gaga` }gaa Nu 9{def }Nu *f ()Nu dDDEFINEELSEENDIFIIFDEFIFNDEFIFOPTLRTUNDEFVFSMakNua8CpaSNuH`4rRBnAdpag p`r LNu#KCdpra<_g<0e$<Zb<Ad<9b|?gRa`#KNuHaX#Krag,|?g RA  g  g#KRKa`/ I /gra| _abLNuax  g  gNuaa>J9dpgNuCdpa/aVfF yL|a\"PJ1fS@"p9dp/AkDaHa8"PB1RQCAdp aL _NuagB)Nu"yL|"QaNuaza`apa`afaV`@a\aW`6a@aN@Cp01g|29L^ +g -fFAVab"yVHR)fag "yVHS)Nu"yVHJ)ga0ag "yVHS)Nu"yVHS)e` @pCaH" yMa2?|@a4"PAa@ ANu@pCaCa\@Nu`daT3$g4a*a83&a a.3(aa$3*a `|@b Nu|bNu#K`a#K ,fa #KaSNu<'f ah<'f<{g<(f (*gaJ`aFaDde $ga`a0a?a0r|gr|g"<gag`JANuJgNuJ9]gPdSBoNuH`$yVHRRMp Kʐ"ѪCM"L A|ldr€a#K#KHqa _ M5@ f."*m&J*gJ*f paL yK$yVH`~a2 yKa#KapLNu *"9Mp/ag _NuC&#MP"H"gP <o kB# JafҮӪj Ip|`Tg e g Jf| `B`BJNu"H0* r~@oCMJgBRj ` JWf Nu/ $yVHJ fDA&#MPa&f(%@ Jf*@WfSѪ"a%@aD$A&a# J *raxBJ$_Nu/ ?$yVH3dfJyMjfaJWfar# JB aLv#VHSyVFg:ed j P#K#KCM <a jaJWfA&a00$_Nu/ a./PA&#MPpa"paf.aNaLNuH yVFgRyVFpvѹVH$yVH Ja yVFg&0<a\%H"P""KAM <aJ oC&az3dfP"J$_AM#KNu yMLMxg8BB`! #ML2I8B\Q` MLNu 9LVf, 9M<3_3_3MHH3MJLVNup42DA`QHINu yMLa`R 9LVfr Pag@#Lx8MJA_09MH8QNu yML"yLx P0PA0gHЈ2 0MlJNu 9LVfvddf^"9ML A Pang Ҽ MtfQddJ9L[gNu PNf /a0< ah dd A Pa(f"AHdhLdhXghNua fXg\NuH 09_49MJPE 4g"°jfAC_49MHIVf`tLNu?r9LV`Wf 0_U@`TNurNu9LVYHXHgf` 9LVfNuBB9L_gC_p|o p`QNu<ae <zb< NuH0$HB&HCCHBBBЂL NuH8xJjDxJjDFD$v Ӂd҂рQFJDgDHDJDgDLNua Nupr $g0<:< d" Ͱ d/ПЁkR`DNuBgR<ae< <:< e <\d < ЁRW` _nHNuJgBJgJBlCDEB|@l6E| e| "pJEg|.F̀҄уeNuRBNuB "$NuprtNuJgJgE?t,.pBAHA*HE҅т:g HDHD҅т2HAp:g҅т*HEHDHD҅т:g҅т2HAp:HCHC҅т*HE҅т:g HDHD҅т*HE҅т2HAp*HEHCHC҅т:g҅т*HEHDHD҅т*HEHCHCЅ:HCHCHFH@܅BH@HAFHAHFFH@B4H@kSBNuHg t UrNu/a _NuJCkA |@m2|@aL8`AH|n|@aL8 `DCgA Kd?L8BEHEa6`Nuv<:< NuNVHanBad&?van&(*0aPa.gSn`v (<.f g`<efRD<-g<+gSadl=Cazd8.:LDEC=EjDE|o`D6. .-fDCn6.a|?i$jprtBCM<2HSLN^NuvS`ar L`^ar L`Ta T P fNuar L`:aj T P eNua L`|aT LavaR T PfNuaH T P fX ,g La6 ,H@|`aB29Lj`8pJ, grNua La`aAa"f60 Lalaaa a LaaaHAa` 9:LVgNua LaraPra\aaRa"S Qfa g T ( pH@f Ka~a|0<a(_9|)|`HaBAaff40 Laaaada LaaaAaX`NuaBAa"f40 Lalaaa a LaaaJA$a`Nu 9@LVfTaaN LaT T P g P f ,gp`F` ,g Lav ,H@)@Nu , Nu9da*da LaJ9dg< T P g( P fPJ9dl$ ,gp a<`Da` J9dlpVadNu? La/ `a _0`, La,,aH`4 9LVg&Aaf*TN`"P ?,ag aga,gafNuaff P f>(`9|P9| P J9dla B9dAM

FLZdlz TVZn*.Nl^bafaBa9|(_pP`( L9| _pQ`at T P gH ,g2, Laft,,a00a9|`a0<A|f&0<5` 0<7` 0<8`0<6?a|f0a9|(_Nu0FUNCTION 6 TYPE ]NOT@ FORWARD5ASMUOR B  BT ->)IJ00  Uni1System@UNI2 >/N/&!t +Rh!dBh// ^ r X n  2      zf *R *> **>Rf  vVlbN :READLN Z REAL ] VALZDISPOSEZ RANDOMIZEZBYTE ]TEXT ]> CLOSEZ FLOAT[LOWORD [ ORD[CONCAT [RENAME Z COS[APPEND Z ABS[ ROUND[ARCTAN [ SQR[FILESIZE [ MOVE Z PTR[SHORTINT ]LONGINT] ODD[ SEEK Z MEMAVAIL [ SETTEXTBUF ZDOUBLE ] ORD4 [HALT Z WRITEZ FALSE\ SQRT [ STRZEXIT ZINTEGER]P TRUNC[ PRED [ COPY [ EOF[" NEWZ MAXLONGINT \ SIN[HIWORD [ SWAP [ INCZPI \*@ڢ!h2ADDR [( READ Z INT[LN [BOOLEAN]EXTENDED ]*n LO [ DECZ PAGE ZGETMEM ZCHAR ]2 CHR[SIZEOF [POINTER]f EOLN [# SUCC [ EXP[DEVICE ZFREEMEMZNAN\*REWRITEZ ERASEZFILEPOS[!SEEKEOF[$MAXINT \pMAXAVAIL [UPCASE ['RANDOM [)LENGTH [TRUE \$SINGLE ] BLOCKWRITE ZDELETE ZFILLCHAR ZWRITELNZ RESETZSEEKEOLN [% BLOCKREADZIORESULT [& POS[INSERT Z HI [ SWAPWORD [ASSIGN ZSYSTEM N UNITVERSION\6WORD ]D$ PTRLEN ]BASE QfSIZE Qh PBASEPAGE] RBASEPAGE] rP_LOWTPA Qf`P_HITPAQfJTEXT Q6DATA Q"BSSQP_DTAQ fP_PARENT Q$ P_RESRVD0Q(P_ENVQ,fP_STDFHQ0  P_RESRVD1Q6bP_CURDRV Q7J P_RESRVD2Q8 J2 H 6P_CMDLIN Q vINPUTQ>OUTPUT Q>*IORESVAR QxAPPFLAGQrFPUMODEQ\HEAPORGQfFDEVCHAIN Qf.xHIGHSTAK QfLOWSTACK QfRANDSEED QFEXITPROC QfEXITCODE QERRORADD Qf LASTPC QSHFTSHFT QfpZBASEPAGE QXSTRAP5 QfBzSTRAP102 Qf* B System|RF1.ORF2.ORF3.ORF4.OFP1.oFP2.oFP3.oRM1.o XINIf XHLTLXMULIdXSQRIXDIVIXMODIXLDSXLACXSTSXSCPXCONXCPYXPOSXINSXDELXLDZXLZZXAZE*XAZR6XSTZNXZEQZXZGEfXZLErXZUN~XZDIXZISBXZINXNEWXDISXMEMXMAXXMOVXFLCXCRWXCRLXUPC0 X_FP& X_FPTRI ~DEVICEPx ~RSETTEXTr ~.REWRTEXTR WRCHARWRINT WRREALh JWRSTRWRBOOLz tWRLNf READCHARREADINTREADREAL READSTR READLINE CLSTEXT TEXTEOF TEXTEOLN SEOF SEOLN" RSETFILE *REWRFILE pWRFILE~ FREADFILE TSEEKFILEf 8CLSFILE& bFILSIZE8 ~FILPOSv FILEOF FREN FERAN ~PGETIORES^ ~CHKIORES WRPAGE 6REALSTR *INTSTR NSTRREAL BSTRINT XBKR &XBKWXSTKl ~ d$d8dDdTd|d2d>dNd|ddd^dddddd(d dddd(d( ddpdpdddddd$ddd ddd dd"ddd(ddd0d Bdd*dd&d*d"Bd"d&d0BdFdhd>d6dhdd>d>dd d ddRdXd`dldtddddddddddd dLddd drZdddddrLdrd:dHdVdvdd:dHdd:dHddVd,d,d,d,dddd ddhddddd,ddh0dZ:dhdLdhdL$dL.dhDdLddLndh~dLdLdvdL"d*dFdv\dhldZdZddLdhdhdZtdhdZdhdLdhdvdZ&dhbd$dLd dd$dFdNdzdddddddd<dndtdzddddddddd(d0d:dLpH0Q _PN0/Lc)`Q _O N0/L`Q _O NLtcSBe Vf _PNLprd PF`Q _PNLLtJAnrBn$ARBJ@oBo0S@Q`B _O NLH0prtg(g$AeSA6$H&I Vg RBRQtL  _\O>NNuNVHn/. ?<?.SWN/.HnNHn/. ?.?<NHnHnNHn/. ?. NN^ _O NNVHn/. ?<?. SWNHn/. 0. n??<NHnHnNHn/. ?<NN^ _PN _ Wam WznW NNuLLt @A`BQ`Q`BQ _O N opBQNu0/ orI _TNL oe tJRfRrSd.NuLL`Q _O N o0/ @ep` 2I0 _\NL/pVNuL/p"VNuL/p"VNuL/p"XQNuL/p"FÐXQNuL/p"ÐXQNu0/Lge`!Q`Q _O NL o`Q _PNJ/VBA"o4/N`FALSETRUE .Nuprt +g -ftR: d2: d/ПЁkR`JgD@`DNuJlD-C(r \Y"gt/RlЁ`BNu;B@'d NuL#B P rҀA kHp Pr _PN /gN^@ y" "H Xb If "i`Jk""#hÉ#A"o"BB`?<8//N _PN/ L^@"Q yb `T hbJkB#h"Etf#j $$ё!I$Hеf!i ""ѐ$_ _PN ypИ PdR//@Nu yp` hd" j//ANu <"9NR#Nu?<NNTO#NuNB@2/gH@H@?@NuNtUg B_//@Nu/$HB&HCCHBBBЂ&NuLN/@.Nu _ "N.NNuHxJjDxJf?<7//NjDFD$v Ӂd҂рQFJDgDHDJDgDLNuNNuNANu"y gN?<:/9NNu _#"PCcN?<2/NNu _mn #N?<3/NNu _XmXn #N?<3/NNuNV . AN A"n4.NN^ _\N/NVA"n NANeJg 3Ap-@N^NuNVA"n NC Jyf$/ /.HnN"n Qf 3AN^.NuNV/. /.Hn?<PNAp"n4. NN^ _PNB/ ?@oSB SAoQ4`SA_ "_NuNV .AN A"n 2.4.NN^ _O NNVA"nr0.l0. @ lp Q@rN A"n 2.4.NN^ _ONNV n Cp`QBANCr"n ÈfrRA n0-@ N^.NuNV nCp`QBA"n NCr"nÈfrRA n0N^ _O NNVHptB -Wg +fRHad,?a&(*0HNN.gSn`v ( .fg` effD -g +gSadt=Catd&8.:LDEC=EjDE Eo`D6. .-fDCn6.NJ.gB& nN CvSL`.vS`v: NuJg&(*TBNRBNuN^NuNVH=@=A=|OHN I NANv gv-Jk0aFJng&6.8.D Cl Do nel6.RC ClvaN.f|Ep+8.jp-DD2<Amardar a ra`p/RAdANu6.nRC Ta6.4.k axQSCkb.afQ`R0SCk.RBg0QRBfJ.g |1` n -f U@"HRQ ILN^Nuf S|0NuBnJg>6SCM=CFCNJBoRnvN`vBxTQ=DNuA CovJCnvJgn8$*ҁрҁр҅тҁрz =EBEHE҅zх$4<QB 5e `R :e0Q1RnANup0QB `N^Nu _H?NALTJj 3DNNu"o o  # r< o r `aQB...Nu<am <zn< Nu _?9ByNJyfNu _?9/NJfaRJ)g HipAaaTBiNuJ9g`a"e3@Bi _Nu`N??)/pBaPONu/) ?)Bg?)p?a Nu/) ?)Bg?)p@a Nu"o0Sf NNBQ.Nu"o #o 3oBJ)g3i _ N2)ifNJifDNu/ "i 1"_Nutaf0ae,< bRi`ae< cRi|PgRBN`BNu _"Warfae Ri|?NBgNLtaRfape< gRi|gRB `.NuL/a$f aBeRi< fa2e < fRiNu g3=Nu )g3>Nu2)/ "i "_RA3AifNNutpaf"?@o SBp aQ4`aQNNu4/"oApa _XONL4/a _\NL/A` L/A` t` t`t`t _"_BgJg$aNeg< gg< bRi`RNL/BBYBBBXBNt`4<L faf2N`HaBy23oNgBQ _ N"o)SfN.NuA`A"oapf#o 3iNeig3@ _XONA`A"oa6f,#o 0/?)3@3@N3_"/g A0By _NNLaf 2)a4rN _PON"oa^2)a*/@Nu"oaL 2)a/@Nu$HBHBBBЂNu Ctv BAdAрQ&FNu"oaWD _XNavf*prN/prN/ /rN "NuprNuNV n C@N n"ONHWHo@BgpVNN^ _PONNV n"ONHWpANN^.Nu`Z2 Fh`RV<@CNVHahBn np.{jNf. f&(* n a|>q`N`. f n J9faDLN^ _ NLN^"_ avN &(Zp`p0` H`0H` ` r$gBBHBJ|~|gNu$rļNu "$g(| 4||BBBHBJ||gNut4TBSBeJ|? g"Nu `Jk |?kiJg B0 Nutpr`4<` n Jk"|kJJgFҼd RdRB|d$Jv &ƼH@|BH@ Nu4<pr`pr` n Jk|~k2Jg"мdRB|dJHBBB Nu4<p`p`~,ka~Jk ~Jg~HBB=GNuEJ9ga`JkJk~JgJJgvBlCDEB|@lbE| e| "pJEg|.F̀f҄уe&NudBD@Jf gr| SBdRBNuB "$NuprtNuJ9ga\`VJkJkJgJgEBE/t,.pBAHA*HE҅т:g HDHD҅т2HAp:g҅т*HEHDHD҅т:g҅т2HAp:HCHC҅т*HE҅т:g HDHD҅т*HE҅т2HAp*HEHCHC҅т:g҅т*HEHDHD҅т*HEHCHCЅ:HCHCHFH@܅BH@HAFHAHFFH@B$H@kSBNuJkJkJgJgEBERBJfgzNV-BH~Lx$ht=p4<HFBDHDچׄDBUH@HA02JgLSvp҄уdTGfLRBSBdN^NuNuJgBNuJ9frt("gjDhLNuQBᘰgUrNu &<x*BEa8JkJgJBoƔ| lDBgDNuRn <Nu<| |FF†Nu&(*kaBNJk>Jg:fnH.H@мla aaBdRBH@kSBaaO Nu(HD ∀LDdpH@Nu&(*LHNL8NSBNury;)\nND,ڢ!h2טÐGeF3h@#!laUW,$krl.Bp|Ԙ`=sMf /(zB|:e* u%SRک4ź ۝30@q9h ΍J۷,k_yN <BY}ifsV5;Sn]1-sڢ!h0{ KOMLRհI$ MɵbmPA(ոA\5W!B~Xl;:x1H0Hsbbk˯>y Ûӣ y2D;C"_HafH?LSWgL8NL8N`L8NH>L`SWgL8NL8N`THN&(*NHaH?LSWgL8NL8N`OL8NL8a0Jkd|oJgL8NVaTB|meLzN`JBo LzaJgBAhaVNuJkv|oPf|l"L8:NHN?NL8aAaL?NL8 H LNL8_O NNuJkd|oJgf?t3dSWRBa>Aa*L8LN6H0HNL8zNL8NNuHL8NL8HLaL8N|o:JkJgHB?BBHBA|RF|gA XmnLeJFf Ava`ؼ|fa|A`aL8SEN`|f(&(*LNA.aL8a`Hp??L8WENSWf(H AL@HL8NL8NHL$L8 NL8NAa,L8NO0HB6BHBNu<NA|n|aL8.`DCgA Kd?L8BEHEa6`Nu~ގS1C%cz:@ ɿ6ŭ+pkxIϦՓGɀ =p ѷXe,wa敔M[ϱE9'9,F|dW(_#LDAH~#J9g$-mll$mb*//NڏJ9g+E// Bg?<JNA ataA,J9g m$ (ga"A,##NAa?<`Hz#NuJ9fAa~`a`&9g0Apad09>aFAqaTAxtJgaXHtaBaNuHz?<&NN\ONuxp<0<:m^a"QNuHQO ON OaPONuga`H ?/<NM\OLNuBaF#3.y yB oN`?9?<LNAAH x2| hg"h$#Nup98tg xp4Ug p5Sgp6 xαd y$f y|?/``p7 o`Apa(#Aa#Nu ypa y0</??<NMPONu Runtime error: at offset: ????. Not enough space for heap Accessory errorSystem2 UNI2*</ 9k Ol ~,Br`( 2SYSTEM2NCHAR128]^ ND <PCHAR128 ]D$TEXTREC]FINPFLAG QFOUTFLAG QFHANDLEQFBUFSIZE QFBUFPOSQFBUFENDQpFBUFPTRQ DV FINOUTPROC Qf@^FUSERQ,FNAMEQh @TFBUFFERQhFILEREC]d2FINPFLAG QFOUTFLAG Q|FHANDLEQfFBUFSIZE QNFPRIVATE QJ2 " 6zFUSERQFNAMEQ @TDEVBUF] |t KEYPRESSED 6XREADKEY6:(CLRSCR D6CLREOS DDCLREOL DRINSLINED`DELLINEDnGOTOXY D |ztWHEREX 6\>RWWHEREY 66>RWOMIT 6INCLUDE6SPTR 66.DELAYD b RUNFROMMEMORY6l VALIDREAL6 L>*@ _0||VOBSystem System2SYSTEM2KEYPRESSREADKEYCLRSCRCLREOSCLREOL(INSLINE4DELLINEGOTOXYZOMITfINCLUDE$~DELAYrRUNFROMMWRITECHSREADKEY2|:OUTESC*6DR(`4nNNCONIO@Z$f@rV~*j~GETHZ200CALLDOS2,(,. D*2d dddddd d&dZdrdddh|&h6h|h|&h|:hJh| h.d<dPdZddd hdddd( ddd@dh h&h.*h4hENHNDL \*EACCDN \EIHNDL \ENSMEM \EIMBA\EDRIVE \ENSAME \ENMFIL \ERANGE \EINTRN \xEPLFMT \dEGSBF\RREADONLY \<HIDDEN \(SYSFILE\VOLUMEID \^ DIRECTORY\ARCHIVE\ ANYFILE\?COMSTR ]PATHSTR]PODIRSTR ] \DCNAMESTR]08 EXTSTR ]TC_STR]  v SEARCHREC]rjRESERVED Q vl`ATTR QNTIME Q:SIZE Q&NAME Q ^  .DATETIME ]hT>*YEAR QMONTHQDAYQHOUR QMINQnSECQ \ JDOSERROR Q0 TOSVERSION 6ENVCOUNT 6(ENVSTR 6 6GETENV 6 D GETVERIFYD R SETVERIFYD `\ PARAMCOUNT 6@nPARAMSTR 6 |PACKTIME D UNPACKTIME D FINDFIRSTDrbFINDNEXT D rZSETFATTR D46JGETFATTR D 0GETDIR D ~CHDIRD  MKDIRD  RMDIRD  rDSETFTIME DRTNGETFTIME D$R("FSPLIT D2 0TFEXPAND6 @DISKSIZE 6 NDISKFREE 6 \|GETDATEDjXRLFzSETDATEDx"GETTIMEDSETTIMEDSETDRIVE D RGETDRIVE 6jSUPER6 fNfBEXEC D SWAPVECTORSD:MALLOC 6 fMFREED fMSHRINKDf$]BSystemOSystem2 Dos X.TOSVERSIDENVCOUNTPENVSTR\GETENVGETVERIFSETVERIFPARAMCOUPARAMSTRPACKTIMEUNPACKTIFINDFIRS FINDNEXTSETFATTR"GETFATTR:GETDIRFCHDIRRMKDIR^RMDIRSETFTIMEGETFTIMEdFSPLIT`FEXPANDlDISKSIZExDISKFREEGETDATESETDATEGETTIMESETTIMESETDRIVEGETDRIVESUPEREXECSWAPVECTMALLOCMFREEMSHRINK  V:<:,T$TF` @l Nx,\,jx2B0bHd 44&N(NINE@hRhITZFDELAt WR|@*TO2v0J848BB*DD(P 6\8Dv0vh AR<`2,NAPn |^>4 `8"B.D:FfR2^2x2xrj, $T2, (,P$ ddd,ddddd .d8d&<ddd &d0d&4ddFdFddFdF ldld*.l|l|d(@d6Rl|^lll|l|dd0dddh$d ld dn&l|6l@dRl|4d(dl|"d,2d@BdRl|dZd.l|l|"d,4dl|"d,4dd:dt\dl|"d,*dl|"d,*dl|"d,*d dFdjdjvl|~dll|l|l|ll*l:l|Rlbl|vl|l|lldl|&l|6d,FddFdFNV"n Jf "n nS @c0<`QN^ _PNNV"n n p`QBN^ _PNNVJ@m By` 3B@N^NuNV8HGI8*L/./ N n m :gU?<NATOAa: \g&@H?/ ?<GNAPOJ@kJf|\f(Mg \g at` ,.f: ,\fU`* ,.f ,\fW ,:g $\fJf ,:f\BHn8/. NL8` @am @zn@ NuN^.NuNV?.Hn?<6NAPO .-@ N^ _TNNV?.Hn?<6NAPO .-@ N^ _TNNV?<*NATO24@ n 0IA n0JJB n0a`L/BBl6B@A(0HBJf nSCHC n0&NuN^ _ONNV2. AII02. IA2.A??<+NAXON^ _\NNV?<,NATO""nBQ@@"n 2 H@?"n2p i"n2N^ _ONNV2.II02. IA2. IA??<-NAXON^ _PNNV?.?<NAXON^ _TNNV?<NATO=@N^NuNV/.?< NA\O-@ N^.NuNV0. 2@"n20H@?"n 2p i"n20."2@"n20H@"n2p iA"n2N^ _ONNV n0.HH2.IA2. IA00.@HH2.IA2.A0N^ _ONNV?</NATO#N^NuNV y"H,.p QB@ 1@N^NuNV#N/.?<NA\O?./. ?<NNAPO3nN/9?<NA\ON^ _O NNV#N/.?<NA\O?<ONATO3nN/9?<NA\ON^.NuNV?. /.?<GNAPONN^ _\NNV/.?<;NA\ONN^.NuNV/.?<9NA\O3N^.NuNV/.?<:NA\ONN^.NuNV?.?. /.?<CNA N=@N^ _PNNV"n0. nBrB1a@gNS@ga&f`=@=A`Sn0.r n0 \f =n `0.nfBn N^.NuNqNqNV/.Hn?<ONU/N=_Jno*HnHn?<?.NHn/.?<CN`4p. @fHn/.?<CN`Hz/.?<CNHn?<p n?NHzHnN=_JnoVHnHn?<0.S@?NHn/. ?<NHnHn?.p.?NHn/.?<N`"Hn/. ?<NHz/.?<NN^ _ON .NV/9?<?<NMP/9?<?<NMPN^NuNV/./. /.Bg?<KNA3N^ _O NNqNqNV,/. Hn?<ON/.Hn0?<NB,HnHn0NHn,Hn0Hn0NN^ _PNNV/.?<HNA\O-@ N^.NuNV/.?<INA\ONN^.NuNV/./. Bg?<JNA NN^ _PNCrttem2`$FBSystemOSystem2 Printer(NPRINTER(IBBF*B 4N" ( dld d*l0d8l< dldl ldd4l dNqNqNVHyHz0NHyHy?<NHyBNN^NuPRN: NqNqNV#HyNN^NuNqNqNV#H@#NN^NuBiosterUNI2 jOhNh*phh~ $ R P  D l  F : : >r *   , x nBIOS NDMAREAD6^RRLF@DMAWRITE 6&(R NVMACCESS66RBCONMAP6 fD ESETSHIFT6 R~ EGETSHIFT6l`ESETBANK 6 Ln@ ESETCOLOR6 &| ESETPALETTEDR` EGETPALETTEDRESETGRAY 6  ESETSMEAR6 l`INITMOUS Df:f4.SSBRK6 f PHYSBASE 6fLOGBASE6fGETREZ 6 SETSCREENDff~ SETPALETTE D fVSETCOLOR 6 <$0*FLOPRD 62ffFLOPWR 6@ffFLOPFMT6 N vpjd^XRfLfFMIDIWS D\f"MFPINT DjfIOREC6 fxjKEYTBL 6ffff@X_RANDOM 6*PROTOBTD\VPfJ>FLOPVER62& ffSCRDMP DCURSCONF 6 XSETTIME D XGETTIME 6xBIOSKEYS DIKBDWS Df.(JDISINTD JENABINT D  GIACCESS 6 .RSCONF 6<|vpOFFGIBIT D JJONGIBITD X&DXBTIMERDffDOSOUNDD tf SETPRT 6 KBDVBASE 6fKBRATE 6 pd^PRTBLK D f:VSYNCDSUPEXECD fPUNTAESD GETMPB D fBCONSTAT 6  BCONIN 6 znBCONOUTD JDRWABS6."f SETEXC 6f*fTICKCAL68GETBPB 6 fF@BCOSTAT6 TzMEDIACH6 bbVDRVMAP 6>pKBSHIFT6 ~E_OK \ERROR\"EDRVNR \EUNCMD \E_CRC\$EBADRG \E_SEEK \EMEDIA \|ESECNF \hEPAPER \TEWRITEF\@EREADF \,0EWRPRO \E_CHNG \EUNDEV \`EBADSF \EOTHER \$BSystemOSystem2 Bios d,dDMAREADDMAWRITENVMACCESBCONMAPESETSHIFEGETSHIFESETBANKESETCOLOESETPALEEGETPALEESETGRAYESETSMEAINITMOUS(SSBRK4PHYSBASE@LOGBASELGETREZXSETSCREEdSETPALETpSETCOLOR|FLOPRDFLOPWRFLOPFMTMIDIWSMFPINTIORECKEYTBLX_RANDOMPROTOBTFLOPVERSCRDMP CURSCONFXSETTIME$XGETTIME0BIOSKEYS<IKBDWSHJDISINTTJENABINT`GIACCESSRSCONFlOFFGIBITxONGIBITXBTIMERDOSOUNDSETPRTKBDVBASEKBRATEPRTBLKVSYNCSUPEXECPUNTAESGETMPBBCONSTATBCONINBCONOUT RWABS,SETEXC8TICKCALDGETBPBPBCOSTAT\MEDIACHhDRVMAPtKBSHIFT,(,6,DR`n|""("4@LXd$p$|28@8N@\jx<4((8 $0<HT `.lJxXf(t ,0*8 8DFPT\bhpt~NV?./.?. /.?<*NN-@N^ _O NNV?./.?. /.?<+NN-@N^ _O NNV/.?. ?. ?.?<.NN =@N^ _O NNV?.?<,NNXO-@ N^ _TNNV?.?<PNNXO=@ N^ _TNNV?<QNNTO=@N^NuNV?.?<RNNXO=@ N^ _TNNV?. ?.?<SNN\O=@ N^.NuNV/. ?. ?.?<TNN N^ _PNNV/. ?. ?.?<UNN N^ _PNNV?.?<VNNXO=@ N^ _TNNV?.?<WNNXO=@ N^ _TNNV/./. ?.BgNN N^ _O NNV?.?<NNXO-@ N^ _TNNV?<NNTO-@N^NuNV?<NNTO-@N^NuNV?<NNTO=@N^NuNV?./. /.?<NN N^ _O NNV/.?<NN\ON^.NuNV?. ?.?<NN\O=@ N^.NuNV?.?.?.?.?./. /.?<NN=@N^ _ONNV?.?.?.?.?./. /.?< NN=@N^ _ONNV?./.?.?.?.?.?./. /.?< NN=@ N^ _ONNV/. ?.?< NNPON^ _\NNV/. ?.?< NNPON^ _\NNV?.?<NNXO-@ N^ _TNNV?.?.?.?. ?. ?.?<NN-@N^ _O NNV/./. /.?<NN-@N^ _O NNV?<NNTO-@N^NuNV?.?./. /.?<NNN^ _O NNV?.?.?.?.?./. /.?<NN-@N^ _ONNV?<NNTON^NuNV?. ?.?<NN\O=@ N^.NuNV/.?<NN\ON^.NuNV?<NNTO-@N^NuNV?<NNTON^NuNV/. ?.?<NNPON^ _\NNV?.?<NNXON^ _TNNV?.?<NNXON^ _TNNV?. ?.?<NN\O=@ N^.NuNV?.?<NNXON^ _TNNV?.?<NNXON^ _TNNV/.?. ?. ?.?<NN N^ _O NNV/.?< NN\ON^.NuNV?.?<!NNXO=@ N^ _TNNV?<"NNTO-@N^NuNV?. ?.?<#NN\O=@ N^.NuNV?<$NN\ON^.NuNV?<%NNTON^NuNV/.?<&NN\ON^.NuNV>|'NNTON^NuNV/.BgNM\ON^.NuNV?.?<NMXO?N^ _TNNV?.?<NMXO-@ N^ _TNNV?. ?.?<NM\ON^.NuNV?.?.?./. ?.?<NM-@N^ _O NNV/. ?.?<NMPO-@N^ _\NNV?<NMTO-@N^NuNV?.?<NMXO-@ N^ _TNNV?.?<NMXO-@ N^ _TNNV?.?< NMXO-@ N^ _TNNV?< NMTO-@N^NuNV?.?< NMXO-@ N^ _TN@@$$  P$@@$$  Q$@$ $$   A<#A,^       t 4@     : 4J     0     0      *TnVl."* rBRH v x    & "",  0   4*$:DF ,  $   &    "       &.   0 * &$    2*$0 2  &&& 2@ $ j&"     0(@ *4l>   $"  $"  Zt r4(2~P$   ,$ ( "   "4 " zd:D.Dh 6(*>   H DfB$" H   0@*@ "@   D  NEW_DIAL>.NEW_MENUNEW_WINDnNEXT_RECOBJ_DRAWpOBJ_FIND OBJ_FLAG|OBJ_OFFSOBJ_REDROBJ_SETF OBJ_SETSOBJ_SIZE OBJ_STATOPEN_WINPAINT_ARPAINT_CO PAINT_OUPAINT_OVjPAINT_REPAINT_ROPAINT_ST:PLINEFLINE^PLOTzRECT_INT<REDO_DIARUBBERBOSET_CLIPSET_COLO SET_DEBgNXN^NuwNqNqNVyN^NuNqNqNV.9g:J.gYBN#`Y/9N#N^ _TNNVHYN-_/. nHh"?<}NUN"n2pr@m<=@=A`Rn0.HU? 100 objects) - abortingNVHU/.N=_0.&nG7n0+@ n7@Bk 0. 7@0. 7@0. 7@0. 7@?.HnN?<N?<N?<N?<NXHnNgFHnHxN(nBBB9| Bl9n9n BlBl'n `7n 7n/.Bg?.N0.@LN^ _ONNVH/. Hn?<N.H&nG0+ @g @ g @f*Hk p.R@H/NHn/+ N` @fp.H2+ HA7@ ` @g @g @g @fd(k JgHT0,H/NHTp.R@H/NHn/NBB9n .H9@p.R@9@BlLN^ _ONNVH/.Hn?<N/.Hn?<N/. Hn?<N.H&n&s JgHS0+H/NJgHk0+H/NJg HkNp.HzHn&N_TC=CHS0.H/NHn/NHkp.R@H/NHn/+NHkp.R@H/NHn/+N7n .H7@7np.R@7@.H&nG0+@7@LN^ _ON_NqNqNV. H"n3 J.g/.. H?BgBgBgBgBgNN^ _O NNqNqNV.H n =p N^ _\NNVH. H&n G0+@ n7@&_N^ _PNNqNqNV.H n =pN^ _\NNqNqNV/.HyHyHyHyNN^.NuNVH&n 0+[@=@0+[@=@0+@ =@0+@ =@BgBgBgBgBg?.?.?.?.N/. Bg?<BgBgBgBgNU/. ?.N=_&_N^ _\NNqNqNV. H n p //.NN^ _O NNqNqNVU/. ?.N=_N^ _\NNVH&n0+[@=@0+[@=@0+@ =@0+@ =@?<BgBgBgBg?.?.?.?.N&_N^.NuNqNqNV/. HnN/.HnNHnHnHnNHn/. NHn/.Np n =@0.r n 0 \g Sn`Hn/. ?<?.N/.HnNHn/.?<PN nWD@N^ _PNNqNqNV/.Hn?<NHnHnNHzHnNHnHn?<N/.HnN/. HnNHnHnHnHnNHn/.NHn/. Np n=@0.r n0 \g Sn`Hn/.?<?.N/. HnNHn/. ?<PN nWD@N^ _O NNqNqNV/. Hn?<NY?<BgBg?<&?<N-_U/.?<Bg?<Bgp.??<??.?.4?.2?.0?..?.?.*?.(?.&?.$/. .8H? .8XH?/./. /./././.N=_DN^ _OHnNHn/.?<NU?. nHhN=_N^ _\NNqNqNV"n2$"n3n"n3n "n3n" "n3y /.# /.#/.#HyL#/. #J.g`0.HrAmR=A=@`Rn0.d0.H29 "nq`0.H29"nq0.nfHy "psNBJ.g`0.HrAmR=A=@`Rn0.d0.H29 "n q`0.H29"n q0.nfN^ _ONNqNqNV383:3 <3 >3@Hy "0<NBN^ _O NNqNqNVHy8# HyP#$/.#(/.#,/. #0/.#40. @ f?< Bg?<BgBgN` @ f?< ?<?<?<BgN` @ f?< ?<?<?<BgN` @ f?< Bg?<?<BgN` @f?<?<?<?<BgN`` @f?<?<?<?<BgN`< @f?<Bg?<BgBgN` @f?<Bg?<BgBgN` @f?<?<?<BgBgN` @f?<?<?<BgBgN` @f?<Bg?<?<BgN` @f?<?<?<BgBgN`t @f?<?<?<?<BgN`P @f?<?<?<BgBgN`. @f?<?<?<?<BgN` @f?<?<?<?<BgN` @ f?< ?<?<?<BgN` @!f?<!?<?<?<BgN` @"f?<"?<?<?<BgN`z @#f?<#?<?<?<BgN`V @(f?<(?<?<?<BgN`2 @)f?<)?<?<?<BgN` @*f?<*?<?<?<BgN` @+f?<+?<?<?<BgN` @,f?<,?<?<?<BgN` @-f?<-?<?<?<BgN`~ @.f?<.?<?<?<BgN`Z @/f?</?<?<?<BgN`6 @2f?<2?<?<?<BgN` @3f?<3?< ?<BgBgN` @4f?<4?<?<?<BgN` @5f?<5?<?<BgBgN` @6f?<6Bg?<?<BgN` @Ff?<F?<?<BgBgN`f @Gf?<G?<?<BgBgN`D @Hf?<H?<?<BgBgN`" @If?<I?<?<BgBgN` @Jf?<J?<?<BgBgN` @Kf?<K?<?<?<BgN` @Lf?<L?<?<?<BgN` @Mf?<MBg?<BgBgN`v @Nf?<N?<?<?<BgN`R @Of?<OBg?<BgBgN`2 @Pf?<PBg?<?<BgN` @Qf?<QBg?<?<BgN` @Zf?<ZBg?<?<BgN` @[f?<[Bg?<?<BgN` @df?<d?<?<BgBgN` @ef?<e?<?<BgBgN`f @ff?<f?<?<BgBgN`D @gf?<g?<?<BgBgN`" @hf?<h?<?<BgBgN` @if?<i?<?<BgBgN` @jf?<j?<?<BgBgN` @kf?<k?<?<BgBgN` @lf?<l?<?<BgBgN`x @mf?<mBgBgBgBgN`Z @nf?<nBg?<?<BgN`8 @of?<oBg?<BgBgN` @pf?<p?<?<Bg?<N` @qf?<q?<?<?<BgN` @xf?<xBg?<?<BgN` @yf?<y?<?<?<BgN` @zf?<z?<?<?<BgN`f @{f?<{?<?<?<BgN`B @|f?<|Bg?<?<BgN` @}f?<}Bg?<?<BgNN^ _ONNqNqNV?.?.?.?.?.?.?.?./. /.NN^ _ONNqNqNV?.?.?.?./. /.NN^ _ONNqNqNV?.?. ?.?.?. ?.NN^ _O NNqNqNV?.?.?.?.?.?. ?. ?.NN^ _ONNqNqNV?.?.?.?.?.?. ?. ?.NN^ _ONNqNqNV?9?.NN^ _TNNqNqNV?9?. ?.NN^.NuNqNqNV?9?.NN^ _TNNqNqNV/.Hn?<NHnHnNHz\HnNHnHn?<N?90.y?0.y ?Hn?.?.?. NN^ _ONNqNqNV?9?. ?.Hn HnNN^.NuNqNqNVU/.?.?. ?. ?.N=_N^ _O NNqNqNV/.?./. /.NN^ _ONNqNqNVU?. ?.N=_ N^.NuNqNqNV?. ?.HnN-n N^.NuNVH0.&nG"n2"n2"n 2"n2&_N^ _ONNqNqNV/..H?.H??.?. ?. ?.NN^ _ONNqNqNV0.r h2.IA2. IAn=@J. g0.@=@=nN^ _O NNqNqNV/. .H??<BgBgBgBgNN^ _\NNqNqNV?9?.HyHyHyHyNN^ _TNNqNqNV/.Bg?<BgBgBgBgNN^.NuNqNqNVByByByBy By"B9NN^NuUNI2V h^V26txx7~,P\ffUTILUNIT NVERSION\*`?STRINQ>BSTROUT Q>,STRDATAQINT2STR6 EXIST6 (WAITTOGO D 6NOSPACES 6 DUPPERSTR 6 lR` CLEARSTRINOUTD`HZ2006&n,BSystemoOSystem2]DOS UtilUnit |UTILUNITINT2STREXISTWAITTOGONOSPACESUPPERSTRCLEARSTR|HZ200n"(h0:6( Dd$R`2$STRINOUTB p`pBpBp|&p*p8p*<pPppTppB p0p|pBl(pBp|&p>pFpZp|pBp|Rpzp|pBdpd$p(ppBd$d,p2d@dJp|^pndzdppBddp d*p.p2d:p.>pBdLpPpTd\p<`pNNVB?< NA-x/@NA\ON^NuNNVXNqNq/.Hn?<ONHnZHnNNHnZB?<NN=_XJnXfHnZNNJnXWD@ N^.NuNNVNqNq0.H/BgHn?<NHn/. ?<NN^ _TNNNVNqNqUN0r.AfN^ _TNNNVNqNq/.Hn?<NHzDHnN0J@oHnHz,HnN?<N`Hn/. ?<NN^.Nu NNVNqNq/.Hn?<Np.reDA@`R.p.r.tA0?Nr2C..fHn/. ?<NN^.NuNNVNqNqHyNJfHyNN`N^NuNNVH&nJg<*9,:9p(Jgp<<7nz~&RPNNWIDTH\hDIGITS \TCR \D BS \4REAL ]*"ERRORQ INPUTSTRINGQ| CHARINPUTD  TOPOFSTACK 6*($JgBSystemOSystem2 RPN6 RPN(CHARINPU6TOPOFSTA(PPPOPBjHjPUSH\XSWAPXYvFADD8SUBHMULT8DIVIDEv* ADDCHfMAKEVALU v d dd dd"d(d8ddBdB*l2d\dB l(dB:lBd\dBdB*l2d\dB.l:d\>dLdB^lfd\ d*d6l`FlNdXl|pdvl~dd\dl ddd\dddd\dl|0dLd`dfltdddddldddlddBld\,dv<dLd\dlddl|d$d*dNqNqNVA"n""2N^NuNVHGA"n""2A C""2AC ""2AC""2&_N^NuNVH nC""2GAC""2A C""2AC ""2AC""2&_N^.NuNqNqNV @+f N`. @-f N` @*f N` @/fNN^ _TN.? NVHHz`Hy?<N3B9<*9,:9p(Jgp<<7nz~&RPNNWIDTH\hDIGITS \TCR \D BS \4REAL ]*"ERRORQ INPUTSTRINGQ| CHARINPUTD  TOPOFSTACK 6*($JgBSystemOSystem2 RPN6 RPN(CHARINPU6TOPOFSTA(PPPOPBjHjPUSH\XSWAPXYvFADD8SUBHMULT8DIVIDEv* ADDCHfMAKEVALU v d dd dd"d(d8ddBdB*l2d\dB l(dB:lBd\dBdB*l2d\dB.l:d\>dLdB^lfd\ d*d6l`FlNdXl|pdvl~dd\dl ddd\dddd\dl|0dLd`dfltdddddldddlddBld\,dv<dLd\dlddl|d$d*dNqNqNVA"n""2N^NuNVHGA"n""2A C""2AC ""2AC""2&_N^NuNVH nC""2GAC""2A C""2AC ""2AC""2&_N^.NuNqNqNV @+f N`. @-f N` @*f N` @/fNN^ _TN.? NVHHz`Hy?<N3B9      ) 5=8=@6 w/ h