(*******************************************************************)
(** Release history:                                              **)
(**    17th January 1985   version 1.0.0 First port to new world  **)
(*******************************************************************)
IMPLEMENTATION MODULE rawBBC;

FROM TOBBC IMPORT ToBBC;

PROCEDURE VduByte(I: INTEGER);
BEGIN
  ToBBC(CARDINAL(I) MOD 256);
END VduByte;
  
PROCEDURE VduWord(I: INTEGER);
BEGIN
  IF (I < -32768) OR(I > 65535) THEN (* error *) I := 0 END;
  IF I < 0 THEN INC(I,65536) END;
  ToBBC(I MOD 256); ToBBC(I DIV 256)
END VduWord;

PROCEDURE PrinterOn();
BEGIN
  ToBBC(3)
END PrinterOn;

PROCEDURE TextCursor();
BEGIN
  ToBBC(4)
END TextCursor;

PROCEDURE GraphCursor();
BEGIN
  ToBBC(5)
END GraphCursor;

PROCEDURE ScreenOn();
BEGIN
  ToBBC(6)
END ScreenOn;

PROCEDURE Bell();
BEGIN
  ToBBC(7)
END Bell;

PROCEDURE CursorLeft();
BEGIN
  ToBBC(8)
END CursorLeft;

PROCEDURE CursorRight();
BEGIN
  ToBBC(9)
END CursorRight;

PROCEDURE CursorDown();
BEGIN
  ToBBC(10)
END CursorDown;

PROCEDURE CursorUp();
BEGIN
  ToBBC(11)
END CursorUp;

PROCEDURE ClearTextArea();
BEGIN
  ToBBC(12)
END ClearTextArea;

PROCEDURE StartOfLine();
BEGIN
  ToBBC(13)
END StartOfLine;

PROCEDURE PageModeOn();
BEGIN
  ToBBC(14)
END PageModeOn;

PROCEDURE PageModeOff();
BEGIN
  ToBBC(15)
END PageModeOff;

PROCEDURE ClearGraphicsArea();
BEGIN
  ToBBC(16)
END ClearGraphicsArea;

PROCEDURE TextColour(Colour: INTEGER);
BEGIN
  ToBBC(17); VduByte(Colour)
END TextColour;

PROCEDURE GraphicsColour(Mode, Colour: INTEGER);
BEGIN
  ToBBC(18); VduByte(Mode); VduByte(Colour)
END GraphicsColour;

PROCEDURE SetColour(Logical, Physical: INTEGER);
BEGIN
  ToBBC(19); VduByte(Logical); VduByte(Physical);
  ToBBC(0); ToBBC(0); ToBBC(0);
END SetColour;

PROCEDURE ResetColours();
BEGIN
  ToBBC(20)
END ResetColours;

PROCEDURE ScreenOff();
BEGIN
  ToBBC(21);
END ScreenOff;

PROCEDURE Mode(I: INTEGER);
BEGIN
  ToBBC(22); VduByte(I)
END Mode;

PROCEDURE DefChar(C, R1, R2, R3, R4, R5, R6, R7, R8: INTEGER);
BEGIN
  ToBBC(23); VduByte(C);
  VduByte(R1); VduByte(R2); VduByte(R3); VduByte(R4);
  VduByte(R5); VduByte(R6); VduByte(R7); VduByte(R8)
END DefChar;

PROCEDURE GraphicsWindow(Xl, Yb, Xr, Yt: INTEGER);
VAR I: INTEGER;
BEGIN
  IF Xl < 0 THEN Xl := 0 ELSIF Xl > 1279 THEN Xl := 1279 END;
  IF Yb < 0 THEN Yb := 0 ELSIF Yb > 1023 THEN Yb := 1023 END;
  IF Xr > 1279 THEN Xr := 1279 ELSIF Xr < 0 THEN Xr := 0 END;
  IF Yt > 1023 THEN Yt := 1023 ELSIF Yt < 0 THEN Yt := 0 END;
  IF Xl > Xr THEN I := Xl; Xl := Xr; Xr := I END;
  IF Yb > Yt THEN I := Yb; Yb := Yt; Yt := I END;
  ToBBC(24); VduWord(Xl); VduWord(Yb); VduWord(Xr); VduWord(Yt);
  (* Could do with a spot of warning here if something amiss?? *)
END GraphicsWindow;
  
PROCEDURE Plot(Code, X, Y: INTEGER);
BEGIN
  ToBBC(25); VduByte(Code); VduWord(X); VduWord(Y)
END Plot;

PROCEDURE ResetWindows();
BEGIN
  ToBBC(26)
END ResetWindows;

PROCEDURE Escape();
BEGIN
  ToBBC(27)
END Escape;

PROCEDURE TextWindow(Xl, Yb, Xr, Yt: INTEGER);
BEGIN
  ToBBC(28);
  VduByte(Xl); VduByte(Yb); VduByte(Xr); VduByte(Yt)
END TextWindow;

PROCEDURE GraphicsOrigin(X, Y: INTEGER);
BEGIN
  ToBBC(29); VduWord(X); VduWord(Y)
END GraphicsOrigin;

PROCEDURE CursorHome();
BEGIN
  ToBBC(30)
END CursorHome;

PROCEDURE CursorTo(X, Y: INTEGER);
BEGIN
  ToBBC(31); VduByte(X); VduByte(Y)
END CursorTo;

PROCEDURE DeleteChar();
BEGIN
  ToBBC(127)
END DeleteChar;

PROCEDURE MoveAbs(X, Y: INTEGER);
BEGIN
  Plot(4, X, Y)
END MoveAbs;

PROCEDURE MoveRel(X, Y: INTEGER);
BEGIN
  Plot(0, X, Y)
END MoveRel;

PROCEDURE LineAbs(X, Y: INTEGER);
BEGIN
  Plot(5, X, Y)
END LineAbs;

PROCEDURE LineRel(X, Y: INTEGER);
BEGIN
  Plot(1, X, Y)
END LineRel;

PROCEDURE FillTriangleAbs(X, Y: INTEGER);
BEGIN
  Plot(85, X, Y)
END FillTriangleAbs;

PROCEDURE FillTriangleRel(X, Y: INTEGER);
BEGIN
  Plot(81, X, Y)
END FillTriangleRel;

END rawBBC.
