home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / modula2 / library / fst / console / console.mod < prev   
Text File  |  1988-04-18  |  12KB  |  360 lines

  1. IMPLEMENTATION MODULE Console;
  2.  
  3. (************************************************************************)
  4. (* COPYRIGHT 1988 by David Albert                                       *)
  5. (* You may use this module in any of your work and distribute it freely *)
  6. (* Provided that:    1) The copyright notice is not changed or removed  *)
  7. (*                   2) The module is not modified                      *)
  8. (*                   3) Under NO conditions is this module to be sold   *)
  9. (************************************************************************)
  10.  
  11. IMPORT ASCII;
  12. FROM SYSTEM   IMPORT ASSEMBLER;
  13. FROM TermBase IMPORT AssignWrite, UnAssignWrite;
  14.  
  15. CONST  BIOSVidInt = 10H;
  16.        SetMode    = 0000H;  (* Set video mode 0-7                   *)
  17.        GetMode    = 0F00H;  (* Get current video mode               *)
  18.        SetCurSize = 0100H;  (* Set cursor size 0-7 or 0-13          *)
  19.        MoveCursor = 0200H;  (* Move cursor to position X,Y          *)
  20.        CursorPos  = 0300H;  (* Get current cursor position          *)
  21.        ReadLtPen  = 0400H;  (* Get light pen position and status    *)
  22.        SetPage    = 0500H;  (* Set video page 0-7 or 0-3            *)
  23.        ScrlUp     = 0600H;  (* Scroll a window up N lines           *)
  24.        ScrlDn     = 0700H;  (* Scroll a window down N lines         *)
  25.        GetChAttr  = 0800H;  (* Get character and attribute at X,Y   *)
  26.        PutChAttr  = 0900H;  (* Put character and attribute to X,Y   *)
  27.        PutCh      = 0A00H;  (* Put character at X,Y leave cur. attr *)
  28.        SetColor   = 0B00H;  (* Set color in modes 1-4               *)
  29.        WritePixel = 0C00H;  (* Set the color of a pixel X,Y         *)
  30.        ReadPixel  = 0D00H;  (* Get the color of pixel X,Y           *)
  31.        WriteTTY   = 0E00H;  (* Teletype character output            *)
  32.  
  33. VAR WriteStolen  : BOOLEAN;
  34.  
  35. PROCEDURE ClearScreen ();
  36. BEGIN
  37.   ScrollUp(0);             (* Clear Screen via BIOS                 *)
  38.   GotoXY(1,1);             (* Home cursor                           *)
  39. END ClearScreen;
  40.  
  41. PROCEDURE ClearEOL();
  42. VAR NumSpaces : CARDINAL;
  43. BEGIN
  44.   NumSpaces := CurWindow.X2 - WhereX();
  45.   PutChar(' ',NumSpaces);
  46. END ClearEOL;
  47.  
  48. PROCEDURE GetVidCh() : CARDINAL;
  49. VAR Char : CARDINAL;
  50. BEGIN
  51.   ASM
  52.      MOV  AH, 08H
  53.      MOV  BX, 00H
  54.      PUSH BP
  55.      INT  10H
  56.      POP  BP
  57.      MOV  Char, AX
  58.   END;
  59.   RETURN Char;
  60. END GetVidCh;
  61.  
  62. PROCEDURE GetVidMode() : CARDINAL;
  63. VAR Mode : CARDINAL;
  64. BEGIN
  65.   ASM
  66.      MOV  AH, 0FH          (* Setup to read video mode              *)
  67.      PUSH BP
  68.      INT  10H              (* Perform interrupt                     *)
  69.      POP  BP
  70.      MOV  Mode, AX         (* Mode returned in AH (scr width in AL) *)
  71.   END;
  72.   Mode :=  Mode MOD 100H;  (* Separate mode and screen width        *)
  73.   RETURN Mode;
  74. END GetVidMode;
  75.  
  76. PROCEDURE GotoXY (X,Y : CARDINAL);
  77. VAR Position : CARDINAL;
  78. BEGIN
  79.   X := X + CurWindow.X1 - 1;                (* Adjust coordinates to    *)
  80.   Y := Y + CurWindow.Y1 - 1;                (* current window           *)
  81.   WITH CurWindow DO
  82.     IF (X >= X1) AND (X <= X2) AND          (* Test to see if point X,Y *)
  83.        (Y >= Y1) AND (Y <= Y2)              (* falls within window      *)
  84.     THEN                                    (* If so, then              *)
  85.        Position := (Y-1) * 100H + (X-1);    (* Convert position to word *)
  86.        ASM
  87.           MOV  AH, 02H
  88.           MOV  BX, 00H                      (* Set video page to 0      *)
  89.           MOV  DX, Position                 (* Store position in DX     *)
  90.           PUSH BP                           (* PUSH BP                  *)
  91.           INT  10H                          (* Perform interrupt        *)
  92.           POP  BP                           (* POP BP                   *)
  93.        END;
  94.     END;
  95.   END;
  96. END GotoXY;
  97.  
  98. PROCEDURE Highlight();
  99. BEGIN
  100.   CurWindow.Attribute := 15;
  101. END Highlight;
  102.  
  103. PROCEDURE Inverse ();
  104. BEGIN
  105.   CurWindow.Attribute := 112;
  106. END Inverse;
  107.  
  108. PROCEDURE KeyPressed () : BOOLEAN;
  109. VAR Result : CHAR;
  110. BEGIN
  111.   ASM
  112.     MOV AH, 0BH
  113.     INT 21H
  114.     MOV Result, AL
  115.   END;
  116.   RETURN (Result <> 0C)
  117. END KeyPressed;
  118.  
  119. PROCEDURE Normal();
  120. BEGIN
  121.   CurWindow.Attribute := 7;
  122. END Normal;
  123.  
  124. PROCEDURE PutChar (Ch : CHAR; Num : CARDINAL);
  125. VAR Attr : CARDINAL;
  126. BEGIN
  127.   IF (Num > 0) THEN
  128.     Attr := CurWindow.Attribute;
  129.     ASM
  130.        MOV  AH, 09H          (* Set up for function call              *)
  131.        MOV  AL, Ch           (* Load character into AL                *)
  132.        MOV  BX, Attr         (* Load vid page and attr into BX *)
  133.        MOV  CX, Num          (* CX gets number of characters to write *)
  134.        PUSH BP               (* PUSH BP                               *)
  135.        INT  10H              (* Perform interrupt                     *)
  136.        POP  BP               (* POP BP                                *)
  137.     END;
  138.   END;
  139. END PutChar;
  140.  
  141. PROCEDURE PutVidCh (ChAttr : CARDINAL);
  142. VAR Char : CHAR;
  143.     Attr : CARDINAL;
  144. BEGIN
  145.   Char := CHR(ChAttr MOD 100H);
  146.   Attr := ChAttr DIV 100H;
  147.   ASM
  148.      MOV  AH, 09H          (* Setup for BIOS call                   *)
  149.      MOV  AL, Char         (* Load character into AL                *)
  150.      MOV  BX, Attr         (* Load video page and attribute into BX *)
  151.      MOV  CX, 01H          (* CX gets number of characters to write *)
  152.      PUSH BP               (* PUSH BP                               *)
  153.      INT  10H              (* Perform interrupt                     *)
  154.      POP  BP               (* POP BP                                *)
  155.   END;
  156. END PutVidCh;
  157.  
  158. PROCEDURE Read(VAR Ch : CHAR);
  159. VAR Key : CHAR;
  160. BEGIN
  161.   ASM
  162.     MOV  AH, 08
  163.     INT  21H
  164.     MOV  Key, AL
  165.   END;
  166.   Ch := Key;
  167. END Read;
  168.  
  169. PROCEDURE ScrollDown(Lines : CARDINAL) ;
  170. VAR TL,BR : CARDINAL;
  171. BEGIN
  172.   WITH CurWindow DO
  173.     TL := Y1 * 100H + X1;                   (* calculate top left corner*)
  174.     BR := Y2 * 100H + X2;                   (* calculate bot rt. corner *)
  175.   END;
  176.   Lines := Lines + 0700H;                   (* Setup to scroll down     *)
  177.   ASM
  178.      MOV AX, Lines                          (* Set lines to scroll      *)
  179.      MOV BX, 0700H                          (* Set attr. for new lines  *)
  180.      MOV CX, TL                             (* Store top left in CX     *)
  181.      MOV DX, BR                             (* Store bottom right in DX *)
  182.      PUSH BP                                (* PUSH BP                  *)
  183.      INT  10H                               (* Call BIOS video interrupt*)
  184.      POP  BP                                (* POP BP                   *)
  185.   END;
  186. END ScrollDown ;
  187.  
  188. PROCEDURE ScrollUp(Lines : CARDINAL) ;
  189. VAR TL,BR : CARDINAL;
  190. BEGIN
  191.   WITH CurWindow DO
  192.     TL := (Y1-1) * 100H + (X1-1);           (* calculate top left corner*)
  193.     BR := (Y2-1) * 100H + (X2-1);           (* calculate bot rt. corner *)
  194.   END;
  195.   Lines := Lines + 0600H;                   (* Setup to scroll up       *)
  196.   ASM
  197.      MOV AX, Lines                          (* Set lines to scroll      *)
  198.      MOV BX, 0700H                          (* Set attr. for new lines  *)
  199.      MOV CX, TL                             (* Store top left in CX     *)
  200.      MOV DX, BR                             (* Store bottom right in DX *)
  201.      PUSH BP                                (* PUSH BP                  *)
  202.      INT  10H                               (* BIOS Video interrupt     *)
  203.      POP  BP                                (* POP BP                   *)
  204.   END;
  205. END ScrollUp ;
  206.  
  207. PROCEDURE SetCursorSize(Top, Bottom : CARDINAL);
  208. BEGIN
  209.   ASM
  210.      MOV AH, 01
  211.      MOV CH, BYTE Top
  212.      MOV CL, BYTE Bottom
  213.      PUSH BP
  214.      INT  10H
  215.      POP  BP
  216.   END;
  217. END SetCursorSize;
  218.  
  219. PROCEDURE SetVidMode (Mode : CARDINAL);
  220. BEGIN
  221.   ASM
  222.      MOV  AX, Mode          (* Load AX with new video mode          *)
  223.      PUSH BP                (* PUSH BP                              *)
  224.      INT  10H               (* Perform interrupt                    *)
  225.      POP  BP                (* POP  BP                              *)
  226.   END;
  227. END SetVidMode;
  228.  
  229. PROCEDURE WhereX () : CARDINAL;
  230. VAR Pos : CARDINAL;
  231. BEGIN
  232.   ASM
  233.      MOV  AH, 03H          (* BIOS Call to read cursor position     *)
  234.      MOV  BX, 00H          (* Set current video page to 0           *)
  235.      PUSH BP               (* PUSH BP                               *)
  236.      INT  10H              (* Perform interrupt                     *)
  237.      POP  BP               (* POP BP                                *)
  238.      MOV  Pos, DX          (* Read cursor position from DX          *)
  239.   END;
  240.   Pos := (Pos MOD 100H)+1; (* separate X position                   *)
  241.   WITH CurWindow DO
  242.      IF (Pos >= X1) AND (Pos <=X2)
  243.        THEN Pos := Pos - X1 + 1;
  244.        ELSE Pos := 0;
  245.      END;
  246.   END;
  247.   RETURN Pos;
  248. END WhereX;
  249.  
  250. PROCEDURE WhereY () : CARDINAL;
  251. VAR Pos : CARDINAL;
  252. BEGIN
  253.   ASM
  254.      MOV  AH, 03H          (* Prepare to read cursor position       *)
  255.      MOV  BX, 00H          (* Set current video page to 0           *)
  256.      PUSH BP               (* PUSH BP                               *)
  257.      INT  10H              (* Perform interrupt                     *)
  258.      POP  BP               (* POP BP                                *)
  259.      MOV  Pos, DX          (* Read cursor position from DX          *)
  260.   END;
  261.   Pos := (Pos DIV 100H)+1; (* separate Y position                   *)
  262.   WITH CurWindow DO
  263.      IF (Pos >= Y1) AND (Pos <= Y2)
  264.        THEN Pos := Pos - Y1 + 1;
  265.        ELSE Pos := 0;
  266.      END;
  267.   END;
  268.   RETURN Pos;
  269. END WhereY;
  270.  
  271. PROCEDURE Window(X1, Y1, X2, Y2 : CARDINAL);
  272. BEGIN
  273.   CurWindow.X1 := X1;  CurWindow.Y1 := Y1;
  274.   CurWindow.X2 := X2;  CurWindow.Y2 := Y2;
  275. END Window;
  276.  
  277. PROCEDURE WriteChar (Ch : CHAR);
  278. BEGIN
  279.   ASM
  280.      MOV  AH, 0EH          (* Use teletype output                   *)
  281.      MOV  AL, Ch           (* Char to be printed goes in AL         *)
  282.      PUSH BP               (* PUSH BP                               *)
  283.      INT  10H              (* Perform interrupt                     *)
  284.      POP  BP               (* POP BP                                *)
  285.   END;
  286. END WriteChar;
  287.  
  288. PROCEDURE Write (Ch : CHAR);
  289. BEGIN
  290.   WITH CurWindow DO
  291.     CASE Ch OF
  292.       ASCII.EOL: IF (WhereY() < (Y2 - Y1) )
  293.                     THEN GotoXY(1,(WhereY()+1));
  294.                     ELSE ScrollUp(1);
  295.                          GotoXY(1,Y2-Y1);
  296.                  END;
  297.     | ASCII.CR : IF (WhereY() < (Y2 - Y1) )
  298.                     THEN GotoXY(1,(WhereY()+1));
  299.                     ELSE ScrollUp(1);
  300.                          GotoXY(1,Y2-Y1);
  301.                  END;
  302.     | ASCII.LF : IF (WhereY() < (Y2-Y1) )
  303.                     THEN GotoXY(WhereX(),(WhereY() + 1));
  304.                     ELSE ScrollUp(1);
  305.                          GotoXY(WhereX(),Y2-Y1);
  306.                  END;
  307.     | ASCII.BS : IF (WhereX() > 1)
  308.                     THEN GotoXY((WhereX()-1),WhereY());
  309.                  END;
  310.     | ASCII.BEL: WriteChar(07C);
  311.       ELSE       PutChar(Ch,1);
  312.                  IF (WhereX() >= (X2-X1+1))
  313.                     THEN IF (WhereY() = (Y2-Y1+1))
  314.                            THEN ScrollUp(1);
  315.                                 GotoXY(1,Y2-Y1+1);
  316.                            ELSE GotoXY(1,(WhereY()+1));
  317.                          END;
  318.                     ELSE GotoXY((WhereX()+1),WhereY());
  319.                 END;
  320.     END;  (* Case statment     *)
  321.   END;    (* With CurWindow Do *)
  322. END Write;
  323.  
  324. PROCEDURE WriteLn ();
  325. BEGIN
  326.   Write(ASCII.CR);
  327. END WriteLn;
  328.  
  329. PROCEDURE WriteString(S : ARRAY OF CHAR);
  330. VAR Ndx : CARDINAL;
  331. BEGIN
  332.   Ndx := 0;
  333.   WHILE (Ndx <= HIGH(S)) AND (S[Ndx] # 0C) DO
  334.     Write(S[Ndx]);
  335.     INC(Ndx);
  336.   END;
  337. END WriteString;
  338.  
  339. PROCEDURE StealWrite ();
  340. BEGIN
  341.   IF (NOT WriteStolen) THEN
  342.      AssignWrite(Write,WriteStolen);
  343.   END;
  344. END StealWrite;
  345.  
  346. PROCEDURE ReturnWrite ();
  347. BEGIN
  348.   IF WriteStolen THEN
  349.      UnAssignWrite(WriteStolen);
  350.      WriteStolen := NOT WriteStolen;
  351.   END;
  352. END ReturnWrite;
  353.  
  354. BEGIN
  355.   WriteStolen := FALSE;
  356.   Window(1,1,ScreenSizeX,ScreenSizeY);
  357.   Normal();
  358.   StealWrite;
  359. END Console.
  360.