home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / educatin / k-ching.lbr / KSCREEN.MZD / KSCREEN.MOD
Text File  |  1987-12-04  |  4KB  |  138 lines

  1. IMPLEMENTATION MODULE KScreen;
  2. FROM Terminal IMPORT WriteChar;
  3. FROM SYSTEM IMPORT OUT;
  4.  
  5. (*
  6. TYPE
  7.     VideoAttribute =
  8.     (HiInverse,Dim,Flash,Underline,Cursor,LoInverse,Normal);
  9. *)
  10.  
  11. PROCEDURE SetVideo(Attribute: VideoAttribute; Switch: BOOLEAN);
  12.     (* Turns various Kaypro-specific options  on and off, according to Switch.
  13.     Normal,FALSE will undo everything except the Cursor attribute --
  14.     Normal,TRUE will undo everything and turn the cursor ON.
  15.     SetVideo uses the standard Write procedure and does not affect
  16.     cursor position.*)
  17. CONST
  18.     ESC = 33C;
  19.     B = 'B';
  20.     C = 'C';
  21. VAR x: CARDINAL;
  22. BEGIN
  23.     IF ORD(Attribute)<=4 THEN
  24.         WriteChar(ESC);
  25.         IF Switch THEN WriteChar(B) ELSE WriteChar(C); END;
  26.         WriteChar(CHR(ORD(Attribute)+48));
  27.  
  28.     ELSIF ORD(Attribute)=5 THEN
  29.         WriteChar(ESC);
  30.         IF Switch THEN WriteChar(B) ELSE WriteChar(C);END;
  31.         WriteChar('0');
  32.  
  33.         WriteChar(ESC);
  34.         IF Switch THEN WriteChar(B) ELSE WriteChar(C);END;
  35.         WriteChar('1');
  36.  
  37.     ELSIF ORD(Attribute)=6 THEN
  38.         FOR x := 48 TO 51 DO
  39.             WriteChar(ESC);
  40.             WriteChar(C);
  41.             WriteChar(CHR(x));
  42.         END;
  43.         IF Switch THEN
  44.             WriteChar(ESC);WriteChar(B);WriteChar('4');
  45.         END;
  46.     END;
  47. END SetVideo;
  48.  
  49.  
  50.  
  51. PROCEDURE DrawLine
  52.           (fromX, fromY, toX, toY: CARDINAL; DrawEr: BOOLEAN);
  53.     (* Draws or Erases a line from X,Y to X,Y according to whether the fifth
  54.     parameter, DrawEr is True or False [ie TRUE will Draw].
  55.     Due to the "Step" nature of mapping linear equations with integer co-ords
  56.     the line x1,y1,x2,y2 <> x2,y2,x1,y1! Rather it is its mirror image.
  57.     To ensure consistant results, be sure to always specify line co-ords in
  58.     the same order, particularly when erasing a previously drawn line.
  59.     If ANY of the CO-ORDS is outside accepted range, nothing happens!*)
  60. CONST   ESC = 33C;
  61. BEGIN
  62.     IF  (fromX>=0) AND (fromY>=0) AND (toX>=0) AND (toY>=0)
  63.     AND (fromX<160) AND (fromY<100) AND (toX<160) AND (toY<100)
  64.     THEN
  65.         WriteChar(ESC);
  66.         IF DrawEr THEN WriteChar('L') ELSE WriteChar('D'); END;
  67.         WriteChar(CHR(fromY+32));
  68.         WriteChar(CHR(fromX+32));
  69.         WriteChar(CHR(toY+32));
  70.         WriteChar(CHR(toX+32));
  71.     END;
  72. END DrawLine;
  73.  
  74.  
  75. PROCEDURE Pixel(xpos,ypos: CARDINAL; DrawErase: BOOLEAN);
  76.     (* Draws or Erases a pixel at the screen co-ord given by [xpos,,ypos] if
  77.     DrawErase is TRUE or FALSE. This procedure will only place a pixel on the
  78.     screen if that character position is BLANK [ie occupied by a space].
  79.     If Xpos or Ypos is outside the normal screen range of 0..159,0..99
  80.     it will be drawn, but at MOD160 or MOD100, respectively. *)
  81. BEGIN
  82.     xpos:= xpos MOD 160 + 32;
  83.     ypos:= ypos MOD 100 + 32;
  84.     WriteChar(33C); (*ESC*)
  85.     IF DrawErase THEN WriteChar('*') ELSE WriteChar(' '); END;
  86.     WriteChar(CHR(ypos));
  87.     WriteChar(CHR(xpos));
  88. END Pixel;
  89.  
  90.  
  91.  
  92. PROCEDURE GCharWrite(GraphicsCharacter: CHAR);
  93.     (* WRITES the 8-bit graphics character specified by the ordinal value of
  94.     GraphicsCharacter at the present cursor position. GraphicsCharacter must be
  95.     in the normal CHAR range of 0..255 and is composed of 8 pixels which are
  96.     turned on according to the following bitmap:
  97.               2   1
  98.               8   4
  99.              32  16
  100.             128  64
  101.      *)
  102. VAR x: CARDINAL;
  103. BEGIN
  104.     x:= ORD(GraphicsCharacter);
  105.     IF x = 0 THEN WriteChar(' ');
  106.     ELSIF x = 255 THEN
  107.         SetVideo(LoInverse,TRUE);
  108.         WriteChar(' ');
  109.         SetVideo(LoInverse,FALSE);
  110.     ELSIF (x>0) AND (x<128) THEN 
  111.         SetVideo(Dim,TRUE);
  112.         WriteChar(CHR(x+128));
  113.         SetVideo(Dim,FALSE);
  114.     ELSE  (*x>=128 and x<255*)
  115.         x:= 255+(128-x);
  116.         SetVideo(LoInverse,TRUE);
  117.         WriteChar(CHR(x));
  118.         SetVideo(LoInverse,FALSE);
  119.     END;
  120. END GCharWrite;
  121.  
  122.  
  123.  
  124. PROCEDURE BlinkBlock(Blink,Block:BOOLEAN);
  125. VAR x: INTEGER;
  126. BEGIN
  127.     IF Blink AND Block THEN x:=-32;
  128.     ELSIF Blink AND NOT Block THEN x:=-17;
  129.     ELSIF NOT Blink AND NOT Block THEN x:=15;
  130.     ELSE (* NOT Blink AND Block *) x:=0;
  131.     END;
  132.     OUT(28,10);
  133.     OUT(29,x);
  134. END BlinkBlock;
  135.  
  136.  
  137.  
  138. END KScreen.