IMPLEMENTATION MODULE GSXMAIN; FROM SYSTEM IMPORT ADR, BDOS; PROCEDURE ResetAddr; (* Set up parablock addresses *) BEGIN WITH PB DO CTRLADD := ADR ( CB ); CINADD := ADR ( CARDIN ); PINADD := ADR ( PTSIN ); COUTADD := ADR ( CARDOUT); POUTADD := ADR ( PTSOUT ); END; END ResetAddr; PROCEDURE ResetPara; (* Set no input parameters *) BEGIN WITH CB DO PINLEN := 0; CINLEN := 0; END; END ResetPara; PROCEDURE simple ( Opcode : CARDINAL ); (* some GSX calls need only an opcode *) BEGIN CB.OPCODE := Opcode; BDOS ( 115, ADR ( PB ) ); ResetPara; END simple; PROCEDURE simplESC ( Opcode : CARDINAL ); (* ESC calls with ESC opcode *) BEGIN CB.ESCID := Opcode; simple ( 5 ); END simplESC; PROCEDURE oneCARD ( Opcode, Para : CARDINAL ); (* calls with one CARDIN para *) BEGIN CARDIN[1] := Para; CB.CINLEN := 1; simple ( Opcode ); END oneCARD; PROCEDURE SetText ( Text : ARRAY OF CHAR ); (* used to transfer text -> CARDIN *) VAR i, m : CARDINAL; c : CHAR; BEGIN i := 0; m := HIGH ( Text ); IF m > CinLen THEN m := CinLen; END; LOOP c := Text[i]; IF ORD ( c ) = 0 THEN EXIT END; INC ( i ); CARDIN[i] := CARDINAL ( c ); IF i > m THEN EXIT END; END; CB.CINLEN := i; END SetText; PROCEDURE numPTS ( Opcode, Number : CARDINAL; VAR Points : ARRAY OF VECTOR ); BEGIN CB.PINLEN := Number; PB.PINADD := ADR ( Points ); simple ( Opcode ); ResetAddr; END numPTS; (***********************************************************************************) PROCEDURE OpenStation ( Identifier : CARDINAL ); BEGIN WITH PB DO CINADD := ADR ( OpenParas ); COUTADD := ADR ( OpenCards ); POUTADD := ADR ( OpenPtrs ); END; OpenParas[1] := Identifier; CB.CINLEN := 10; simple ( 1 ); ResetAddr; END OpenStation; PROCEDURE CloseStation; BEGIN simple ( 2 ); END CloseStation; PROCEDURE ClearStation; BEGIN simple ( 3 ); END ClearStation; PROCEDURE UpdateStation; BEGIN simple ( 4 ); END UpdateStation; PROCEDURE GraphMode; BEGIN simplESC ( 2 ); END GraphMode; PROCEDURE TextMode; BEGIN simplESC ( 3 ); END TextMode; PROCEDURE HardCopy; BEGIN simplESC ( 17 ); END HardCopy; PROCEDURE SetCursor ( X,Y : CARDINAL ); BEGIN PTSIN[1].X := X; PTSIN[1].Y := Y; CB.PINLEN := 1; simplESC ( 18 ); END SetCursor; PROCEDURE RemoveCursor; BEGIN simplESC ( 19 ); END RemoveCursor; PROCEDURE DefineColor ( Index, Red, Green, Blue : CARDINAL ); BEGIN CARDIN[1] := Index; CARDIN[2] := Red; CARDIN[3] := Green; CARDIN[4] := Blue; CB.CINLEN := 4; simple ( 14 ); END DefineColor; PROCEDURE ExamineColor ( Index : CARDINAL; Realized : BOOLEAN ); BEGIN CARDIN[1] := Index; CARDIN[2] := ORD ( Realized ); CB.CINLEN := 2; PB.COUTADD:= ADR ( ColorExamined ); simple ( 26 ); ResetAddr; END ExamineColor; PROCEDURE DrawMode ( Mode : CARDINAL ); BEGIN oneCARD ( 32, Mode ); END DrawMode; BEGIN (* Initialisation *) ResetAddr; ResetPara; OpenParas[1] := CRT; (* default workstation identifier *) OpenParas[2] := 1; (* default polyline type = solid *) OpenParas[3] := 7; (* default polyline color = white *) OpenParas[4] := 3; (* default marker type = asterix *) OpenParas[5] := 7; (* default marker color = white *) OpenParas[6] := 1; (* default text font = first one *) OpenParas[7] := 7; (* default text color = white *) OpenParas[8] := 0; (* default fill style = hollow *) OpenParas[9] := 1; (* default fill index = first one *) OpenParas[10]:= 7; (* default fill color = white *) END GSXMAIN.