IMPLEMENTATION MODULE Regis; IMPORT ASCII; FROM STextIO IMPORT WriteChar, WriteString; FROM NumberIO IMPORT WriteCard, WriteInt; IMPORT IO, termios, FIO; VAR savedTerm : termios.TERMIOS; flushFlag : INTEGER; haveTerm : BOOLEAN; PROCEDURE Pair(x, y : CARDINAL); (* [x,y] *) BEGIN WriteChar("["); WriteCard(x, 1); WriteChar(","); WriteCard(y, 1); WriteChar("]"); END Pair; PROCEDURE Signed(n : INTEGER); (* +n / -n *) BEGIN IF n < 0 THEN WriteInt(n, 1); ELSE WriteChar("+"); WriteCard(VAL(CARDINAL, n), 1); END; END Signed; PROCEDURE PairRel(dx, dy : INTEGER); (* [+dx,-dy] *) BEGIN WriteChar("["); Signed(dx); WriteChar(","); Signed(dy); WriteChar("]"); END PairRel; PROCEDURE Enter; (* DCS 1 p *) BEGIN WriteChar(ASCII.esc); WriteChar("P"); WriteString("1p"); END Enter; PROCEDURE EnterResume; (* DCS p *) BEGIN WriteChar(ASCII.esc); WriteChar("P"); WriteChar("p"); END EnterResume; PROCEDURE Exit; (* ST *) BEGIN WriteChar(ASCII.esc); WriteChar("\"); END Exit; PROCEDURE ScreenErase; BEGIN WriteChar("S"); WriteString("(E)"); END ScreenErase; PROCEDURE AddressWindow(x0, y0, x1, y1 : CARDINAL); BEGIN WriteChar("S"); WriteString("(A"); Pair(x0, y0); Pair(x1, y1); WriteChar(")"); END AddressWindow; PROCEDURE MoveTo(x, y : CARDINAL); BEGIN WriteChar("P"); Pair(x, y); END MoveTo; PROCEDURE MoveRel(dx, dy : INTEGER); BEGIN WriteChar("P"); PairRel(dx, dy); END MoveRel; PROCEDURE LineTo(x, y : CARDINAL); BEGIN WriteChar("V"); Pair(x, y); END LineTo; PROCEDURE LineRel(dx, dy : INTEGER); BEGIN WriteChar("V"); PairRel(dx, dy); END LineRel; PROCEDURE Dot; BEGIN WriteChar("V"); WriteString("[]"); END Dot; PROCEDURE Rect(x0, y0, x1, y1 : CARDINAL); BEGIN WriteChar("P"); Pair(x0, y0); WriteChar("V"); Pair(x1, y0); WriteChar("V"); Pair(x1, y1); WriteChar("V"); Pair(x0, y1); WriteChar("V"); Pair(x0, y0); END Rect; PROCEDURE Circle(edgeX, edgeY : CARDINAL); BEGIN WriteChar("C"); Pair(edgeX, edgeY); END Circle; PROCEDURE CircleCenter(cx, cy : CARDINAL); BEGIN WriteChar("C"); WriteString("(C)"); Pair(cx, cy); END CircleCenter; PROCEDURE Arc(degrees : INTEGER; x, y : CARDINAL); BEGIN WriteChar("C"); WriteString("(A"); WriteInt(degrees, 1); WriteChar(")"); Pair(x, y); END Arc; PROCEDURE FillTriangle(x1, y1, x2, y2 : CARDINAL); BEGIN WriteChar("F"); WriteString("(V"); Pair(x1, y1); Pair(x2, y2); WriteChar(")"); END FillTriangle; PROCEDURE TextOut(s : ARRAY OF CHAR); BEGIN WriteChar("T"); WriteChar("'"); WriteString(s); WriteChar("'"); END TextOut; PROCEDURE TextSize(n : CARDINAL); BEGIN WriteChar("T"); WriteString("(S"); WriteCard(n, 1); WriteChar(")"); END TextSize; PROCEDURE TextSizeWH(w, h : CARDINAL); BEGIN WriteChar("T"); WriteString("(S"); Pair(w, h); WriteChar(")"); END TextSizeWH; PROCEDURE TextDir(deg : CARDINAL); BEGIN WriteChar("T"); WriteString("(D"); WriteCard(deg, 1); WriteChar(")"); END TextDir; PROCEDURE TextSlant(deg : CARDINAL); BEGIN WriteChar("T"); WriteString("(I"); WriteCard(deg, 1); WriteChar(")"); END TextSlant; PROCEDURE UseColor(reg : CARDINAL); BEGIN WriteChar("W"); WriteString("(I"); WriteCard(reg, 1); WriteChar(")"); END UseColor; PROCEDURE ColorName(c : CHAR); BEGIN WriteChar("W"); WriteString("(I("); WriteChar(c); WriteString("))"); END ColorName; PROCEDURE SetRGB(reg, r, g, b : CARDINAL); BEGIN WriteChar("S"); WriteString("(M"); WriteCard(reg, 1); WriteString("(R"); WriteCard(r, 1); WriteChar("G"); WriteCard(g, 1); WriteChar("B"); WriteCard(b, 1); WriteString("))"); END SetRGB; PROCEDURE SetHLS(reg, h, l, s : CARDINAL); BEGIN WriteChar("S"); WriteString("(M"); WriteCard(reg, 1); WriteString("(H"); WriteCard(h, 1); WriteChar("L"); WriteCard(l, 1); WriteChar("S"); WriteCard(s, 1); WriteString("))"); END SetHLS; PROCEDURE BgRegister(reg : CARDINAL); BEGIN WriteChar("S"); WriteString("(I"); WriteCard(reg, 1); WriteChar(")"); END BgRegister; PROCEDURE WriteOverlay; BEGIN WriteChar("W"); WriteString("(V)"); END WriteOverlay; PROCEDURE WriteReplace; BEGIN WriteChar("W"); WriteString("(R)"); END WriteReplace; PROCEDURE WriteComplement; BEGIN WriteChar("W"); WriteString("(C)"); END WriteComplement; PROCEDURE WriteErase; BEGIN WriteChar("W"); WriteString("(E)"); END WriteErase; PROCEDURE Pattern(n : CARDINAL); BEGIN WriteChar("W"); WriteString("(P"); WriteCard(n, 1); WriteChar(")"); END Pattern; PROCEDURE PatternBits(s : ARRAY OF CHAR); BEGIN WriteChar("W"); WriteString("(P"); WriteString(s); WriteChar(")"); END PatternBits; PROCEDURE LineWidth(n : CARDINAL); BEGIN WriteChar("W"); WriteString("(L"); WriteCard(n, 1); WriteChar(")"); END LineWidth; PROCEDURE PVMult(n : CARDINAL); BEGIN WriteChar("W"); WriteString("(M"); WriteCard(n, 1); WriteChar(")"); END PVMult; PROCEDURE ShadeOn; BEGIN WriteChar("W"); WriteString("(S1)"); END ShadeOn; PROCEDURE ShadeOff; BEGIN WriteChar("W"); WriteString("(S0)"); END ShadeOff; PROCEDURE ShadeRefY(y : CARDINAL); BEGIN WriteChar("W"); WriteString("(S[,"); WriteCard(y, 1); WriteString("])"); END ShadeRefY; PROCEDURE MacroDef(name : CHAR); BEGIN WriteChar("@"); WriteChar(":"); WriteChar(name); END MacroDef; PROCEDURE MacroEnd; BEGIN WriteChar("@"); WriteChar(";"); END MacroEnd; PROCEDURE MacroRun(name : CHAR); BEGIN WriteChar("@"); WriteChar(name); END MacroRun; PROCEDURE MacroClearAll; BEGIN WriteChar("@"); WriteChar("."); END MacroClearAll; PROCEDURE ReportPosition; BEGIN WriteChar("R"); WriteString("(P)"); END ReportPosition; PROCEDURE ReportError; BEGIN WriteChar("R"); WriteString("(E)"); END ReportError; PROCEDURE Unbuffered; BEGIN flushFlag := termios.tcsflush(); savedTerm := termios.InitTermios(); haveTerm := termios.tcgetattr(FIO.StdIn, savedTerm) # -1; IO.UnBufferedMode(0, TRUE); IO.UnBufferedMode(1, TRUE); END Unbuffered; PROCEDURE Buffered; VAR res : INTEGER; BEGIN IO.BufferedMode(0, TRUE); IO.BufferedMode(1, TRUE); IF haveTerm THEN haveTerm := FALSE; res := termios.tcsetattr(FIO.StdIn, flushFlag, savedTerm); END; END Buffered; END Regis.