home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / tp_util / neatunit.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-05-02  |  4.5 KB  |  213 lines

  1.  
  2.  
  3. UNIT NEATUNIT;
  4.  
  5.  
  6. {$F+}
  7.  
  8. INTERFACE
  9.  
  10.  
  11. CONST NEAT = $22;
  12.       RTC  = $70;
  13.       ON   = TRUE;
  14.       OFF  = FALSE;
  15.  
  16. CONST BITMASK : ARRAY[0..7] OF BYTE = (1,2,4,8,$10,$20,$40,$80);
  17.  
  18. { FÜR EGA / VGA }
  19. TYPE  CHARTYP    = ARRAY[0..31] OF BYTE;
  20. TYPE  CHARSETTYP = ARRAY[0..255] OF CHARTYP;
  21. CONST VSEQ       = $3C4;
  22.       GCTRL      = $3CE;
  23. CONST CSI        : ARRAY[0..7] OF BYTE = (0,2,4,6,1,3,5,7);
  24. VAR   CHSET      : ARRAY[0..6] OF CHARSETTYP ABSOLUTE $A000:0000;
  25. {}
  26.  
  27.  
  28. FUNCTION  ISAT:BOOLEAN;
  29. FUNCTION  ISNEAT:BOOLEAN;
  30. PROCEDURE STI;   INLINE($FB);
  31. PROCEDURE CLI;   INLINE($FA);
  32. PROCEDURE PUSHF; INLINE($9C);
  33. PROCEDURE POPF;  INLINE($9D);
  34.  
  35. FUNCTION  GETPORT(PORTADR:WORD;INDEX:BYTE):BYTE;
  36. PROCEDURE SETPORT(PORTADR:WORD;INDEX,DAT:BYTE);
  37. PROCEDURE XORPORT(PORTADR:WORD;INDEX,DAT:BYTE);
  38. PROCEDURE ORPORT (PORTADR:WORD;INDEX,DAT:BYTE);
  39. PROCEDURE ANDPORT(PORTADR:WORD;INDEX,DAT:BYTE);
  40. FUNCTION  GETBIT (PORTADR:WORD;INDEX,NR:BYTE):CHAR;
  41. PROCEDURE SETBIT (PORTADR:WORD;INDEX,NR:BYTE);
  42. PROCEDURE RESBIT (PORTADR:WORD;INDEX,NR:BYTE);
  43. PROCEDURE NMI(SWITCH:BOOLEAN);
  44. PROCEDURE RESET_PARITY_ERROR;
  45.  
  46. PROCEDURE SETREG(REG:WORD;INDEX,WERT:BYTE);
  47. FUNCTION  GETREG(REG:WORD;INDEX:BYTE):BYTE;
  48. PROCEDURE SETCHAR(BLOCK:BYTE;NR:CHAR;WERT:CHARTYP);
  49.  
  50.  
  51. IMPLEMENTATION
  52.  
  53.  
  54. FUNCTION  ISAT:BOOLEAN;
  55. VAR   I  : BYTE;
  56.       B  : ARRAY[1..5] OF BYTE;
  57. BEGIN
  58.   ISAT := TRUE;
  59.   FOR I := 1 TO 5 DO B[I] := GETPORT(RTC,0);
  60.   IF (B[1] = $FF) AND
  61.      (B[2] = $FF) AND
  62.      (B[3] = $FF) AND
  63.      (B[4] = $FF) AND
  64.      (B[5] = $FF) THEN BEGIN
  65.     ISAT := FALSE;
  66.     EXIT;
  67.   END;
  68.   IF (B[1] <> B[2]) AND
  69.      (B[1] <> B[3]) AND
  70.      (B[1] <> B[4]) AND
  71.      (B[1] <> B[5]) THEN BEGIN
  72.     ISAT := FALSE;
  73.     EXIT;
  74.   END;
  75. END;
  76.  
  77.  
  78. FUNCTION ISNEAT:BOOLEAN;
  79. BEGIN
  80.   IF NOT ISAT THEN BEGIN
  81.     ISNEAT := FALSE;
  82.     EXIT;
  83.   END;
  84.   ISNEAT := TRUE;
  85.   IF GETPORT(RTC,0) = GETPORT(RTC,64) THEN ISNEAT := FALSE ELSE EXIT;
  86. { WEGEN TIME- CHANGE- FLAG SICHERHEITSHALBER NOCHMALS PRÜFEN }
  87.   IF GETPORT(RTC,0) = GETPORT(RTC,64) THEN ISNEAT := FALSE
  88.                                       ELSE ISNEAT := TRUE;
  89. END;
  90.  
  91.  
  92. PROCEDURE SETREG(REG:WORD;INDEX,WERT:BYTE);
  93. BEGIN
  94.   PORT[REG] := INDEX;
  95.   PORT[SUCC(REG)] := WERT;
  96. END;
  97.  
  98.  
  99. FUNCTION GETREG(REG:WORD;INDEX:BYTE):BYTE;
  100. BEGIN
  101.   PORT[REG] := INDEX;
  102.   GETREG := PORT[SUCC(REG)];
  103. END;
  104.  
  105.  
  106. { FÜR EGA / VGA }
  107. PROCEDURE SETCHAR(BLOCK:BYTE;NR:CHAR;WERT:CHARTYP);
  108. BEGIN
  109.   CLI;
  110.   SETREG(VSEQ,0,1); { SYNCH RESET }
  111.   SETREG(VSEQ,2,4); { MAP MASK MAP = 2 }
  112. (*
  113.   SETBLOCK(0,BLOCK);
  114. *)
  115.   SETREG(VSEQ,4,7); { SEQUENZIELLE ADRESSIERUNG }
  116.   SETREG(VSEQ,0,3); { SYNCH RESET AUFHEBEN }
  117.   STI;
  118.  
  119.   SETREG(GCTRL,4,2);   { READ MAP = 2 }
  120.   SETREG(GCTRL,5,0);   { SEQUENZIELL }
  121.   SETREG(GCTRL,6,$04); { VIDEORAM ADRESSE 0A000:0, 64K BYTES }
  122.  
  123.   CHSET[CSI[BLOCK]][ORD(NR)] := WERT;
  124.  
  125.   CLI;
  126.   SETREG(VSEQ,0,1); { SYNCH RESET }
  127.   SETREG(VSEQ,2,3); { MAP MASK MAP = 0 & 1 }
  128.   SETREG(VSEQ,4,3); { ODD / EVEN ADRESSIERUNG }
  129.   SETREG(VSEQ,0,3); { SYNCH RESET AUFHEBEN }
  130.   STI;
  131.  
  132.   SETREG(GCTRL,4,0);   { READ MAP = 0 & 1 }
  133.   SETREG(GCTRL,5,$10); { ODD / EVEN }
  134.   SETREG(GCTRL,6,$0E);
  135. END;
  136.  
  137.  
  138. FUNCTION GETPORT(PORTADR:WORD;INDEX:BYTE):BYTE;
  139. BEGIN
  140.   PUSHF;
  141.   CLI;
  142.   PORT[PORTADR] := INDEX;
  143.   GETPORT := PORT[PORTADR+1];
  144.   POPF;
  145. END;
  146.  
  147. PROCEDURE SETPORT(PORTADR:WORD;INDEX,DAT:BYTE);
  148. BEGIN
  149.   PUSHF;
  150.   CLI;
  151.   PORT[PORTADR] := INDEX;
  152.   PORT[PORTADR+1] := DAT;
  153.   POPF;
  154. END;
  155.  
  156.  
  157. PROCEDURE XORPORT(PORTADR:WORD;INDEX,DAT:BYTE);
  158. BEGIN
  159.   SETPORT(PORTADR,INDEX,(GETPORT(PORTADR,INDEX) XOR DAT));
  160. END;
  161.  
  162.  
  163. PROCEDURE ORPORT(PORTADR:WORD;INDEX,DAT:BYTE);
  164. BEGIN
  165.   SETPORT(PORTADR,INDEX,(GETPORT(PORTADR,INDEX) OR DAT));
  166. END;
  167.  
  168.  
  169. PROCEDURE ANDPORT(PORTADR:WORD;INDEX,DAT:BYTE);
  170. BEGIN
  171.   SETPORT(PORTADR,INDEX,(GETPORT(PORTADR,INDEX) AND DAT));
  172. END;
  173.  
  174.  
  175. FUNCTION GETBIT(PORTADR:WORD;INDEX,NR:BYTE):CHAR;
  176. BEGIN
  177.   GETBIT := CHAR(GETPORT(PORTADR,INDEX) SHR NR AND 1 + $30);
  178. END;
  179.  
  180.  
  181. PROCEDURE SETBIT(PORTADR:WORD;INDEX,NR:BYTE);
  182. BEGIN
  183.   SETPORT(PORTADR,INDEX,GETPORT(PORTADR,INDEX) OR BITMASK[NR]);
  184. END;
  185.  
  186.  
  187. PROCEDURE RESBIT(PORTADR:WORD;INDEX,NR:BYTE);
  188. BEGIN
  189.   SETPORT(PORTADR,INDEX,GETPORT(PORTADR,INDEX) AND NOT BITMASK[NR]);
  190. END;
  191.  
  192.  
  193. PROCEDURE NMI(SWITCH:BOOLEAN);
  194. BEGIN
  195.   IF SWITCH THEN ORPORT(RTC,$1E,0)
  196.             ELSE ORPORT(RTC,$9E,0);
  197. (*
  198.   IF SWITCH THEN PORT[$61] := PORT[$61] AND $F3
  199.             ELSE PORT[$61] := PORT[$61]  OR $0C;
  200. *)
  201. END;
  202.  
  203.  
  204. PROCEDURE RESET_PARITY_ERROR;
  205. BEGIN
  206.   PORT[$61] := PORT[$61]  OR $0C;
  207.   PORT[$61] := PORT[$61] AND $F3;
  208. END;
  209.  
  210.  
  211. END.
  212.  
  213.