home *** CD-ROM | disk | FTP | other *** search
-
-
- UNIT NEATUNIT;
-
-
- {$F+}
-
- INTERFACE
-
-
- CONST NEAT = $22;
- RTC = $70;
- ON = TRUE;
- OFF = FALSE;
-
- CONST BITMASK : ARRAY[0..7] OF BYTE = (1,2,4,8,$10,$20,$40,$80);
-
- { FÜR EGA / VGA }
- TYPE CHARTYP = ARRAY[0..31] OF BYTE;
- TYPE CHARSETTYP = ARRAY[0..255] OF CHARTYP;
- CONST VSEQ = $3C4;
- GCTRL = $3CE;
- CONST CSI : ARRAY[0..7] OF BYTE = (0,2,4,6,1,3,5,7);
- VAR CHSET : ARRAY[0..6] OF CHARSETTYP ABSOLUTE $A000:0000;
- {}
-
-
- FUNCTION ISAT:BOOLEAN;
- FUNCTION ISNEAT:BOOLEAN;
- PROCEDURE STI; INLINE($FB);
- PROCEDURE CLI; INLINE($FA);
- PROCEDURE PUSHF; INLINE($9C);
- PROCEDURE POPF; INLINE($9D);
-
- FUNCTION GETPORT(PORTADR:WORD;INDEX:BYTE):BYTE;
- PROCEDURE SETPORT(PORTADR:WORD;INDEX,DAT:BYTE);
- PROCEDURE XORPORT(PORTADR:WORD;INDEX,DAT:BYTE);
- PROCEDURE ORPORT (PORTADR:WORD;INDEX,DAT:BYTE);
- PROCEDURE ANDPORT(PORTADR:WORD;INDEX,DAT:BYTE);
- FUNCTION GETBIT (PORTADR:WORD;INDEX,NR:BYTE):CHAR;
- PROCEDURE SETBIT (PORTADR:WORD;INDEX,NR:BYTE);
- PROCEDURE RESBIT (PORTADR:WORD;INDEX,NR:BYTE);
- PROCEDURE NMI(SWITCH:BOOLEAN);
- PROCEDURE RESET_PARITY_ERROR;
-
- PROCEDURE SETREG(REG:WORD;INDEX,WERT:BYTE);
- FUNCTION GETREG(REG:WORD;INDEX:BYTE):BYTE;
- PROCEDURE SETCHAR(BLOCK:BYTE;NR:CHAR;WERT:CHARTYP);
-
-
- IMPLEMENTATION
-
-
- FUNCTION ISAT:BOOLEAN;
- VAR I : BYTE;
- B : ARRAY[1..5] OF BYTE;
- BEGIN
- ISAT := TRUE;
- FOR I := 1 TO 5 DO B[I] := GETPORT(RTC,0);
- IF (B[1] = $FF) AND
- (B[2] = $FF) AND
- (B[3] = $FF) AND
- (B[4] = $FF) AND
- (B[5] = $FF) THEN BEGIN
- ISAT := FALSE;
- EXIT;
- END;
- IF (B[1] <> B[2]) AND
- (B[1] <> B[3]) AND
- (B[1] <> B[4]) AND
- (B[1] <> B[5]) THEN BEGIN
- ISAT := FALSE;
- EXIT;
- END;
- END;
-
-
- FUNCTION ISNEAT:BOOLEAN;
- BEGIN
- IF NOT ISAT THEN BEGIN
- ISNEAT := FALSE;
- EXIT;
- END;
- ISNEAT := TRUE;
- IF GETPORT(RTC,0) = GETPORT(RTC,64) THEN ISNEAT := FALSE ELSE EXIT;
- { WEGEN TIME- CHANGE- FLAG SICHERHEITSHALBER NOCHMALS PRÜFEN }
- IF GETPORT(RTC,0) = GETPORT(RTC,64) THEN ISNEAT := FALSE
- ELSE ISNEAT := TRUE;
- END;
-
-
- PROCEDURE SETREG(REG:WORD;INDEX,WERT:BYTE);
- BEGIN
- PORT[REG] := INDEX;
- PORT[SUCC(REG)] := WERT;
- END;
-
-
- FUNCTION GETREG(REG:WORD;INDEX:BYTE):BYTE;
- BEGIN
- PORT[REG] := INDEX;
- GETREG := PORT[SUCC(REG)];
- END;
-
-
- { FÜR EGA / VGA }
- PROCEDURE SETCHAR(BLOCK:BYTE;NR:CHAR;WERT:CHARTYP);
- BEGIN
- CLI;
- SETREG(VSEQ,0,1); { SYNCH RESET }
- SETREG(VSEQ,2,4); { MAP MASK MAP = 2 }
- (*
- SETBLOCK(0,BLOCK);
- *)
- SETREG(VSEQ,4,7); { SEQUENZIELLE ADRESSIERUNG }
- SETREG(VSEQ,0,3); { SYNCH RESET AUFHEBEN }
- STI;
-
- SETREG(GCTRL,4,2); { READ MAP = 2 }
- SETREG(GCTRL,5,0); { SEQUENZIELL }
- SETREG(GCTRL,6,$04); { VIDEORAM ADRESSE 0A000:0, 64K BYTES }
-
- CHSET[CSI[BLOCK]][ORD(NR)] := WERT;
-
- CLI;
- SETREG(VSEQ,0,1); { SYNCH RESET }
- SETREG(VSEQ,2,3); { MAP MASK MAP = 0 & 1 }
- SETREG(VSEQ,4,3); { ODD / EVEN ADRESSIERUNG }
- SETREG(VSEQ,0,3); { SYNCH RESET AUFHEBEN }
- STI;
-
- SETREG(GCTRL,4,0); { READ MAP = 0 & 1 }
- SETREG(GCTRL,5,$10); { ODD / EVEN }
- SETREG(GCTRL,6,$0E);
- END;
-
-
- FUNCTION GETPORT(PORTADR:WORD;INDEX:BYTE):BYTE;
- BEGIN
- PUSHF;
- CLI;
- PORT[PORTADR] := INDEX;
- GETPORT := PORT[PORTADR+1];
- POPF;
- END;
-
- PROCEDURE SETPORT(PORTADR:WORD;INDEX,DAT:BYTE);
- BEGIN
- PUSHF;
- CLI;
- PORT[PORTADR] := INDEX;
- PORT[PORTADR+1] := DAT;
- POPF;
- END;
-
-
- PROCEDURE XORPORT(PORTADR:WORD;INDEX,DAT:BYTE);
- BEGIN
- SETPORT(PORTADR,INDEX,(GETPORT(PORTADR,INDEX) XOR DAT));
- END;
-
-
- PROCEDURE ORPORT(PORTADR:WORD;INDEX,DAT:BYTE);
- BEGIN
- SETPORT(PORTADR,INDEX,(GETPORT(PORTADR,INDEX) OR DAT));
- END;
-
-
- PROCEDURE ANDPORT(PORTADR:WORD;INDEX,DAT:BYTE);
- BEGIN
- SETPORT(PORTADR,INDEX,(GETPORT(PORTADR,INDEX) AND DAT));
- END;
-
-
- FUNCTION GETBIT(PORTADR:WORD;INDEX,NR:BYTE):CHAR;
- BEGIN
- GETBIT := CHAR(GETPORT(PORTADR,INDEX) SHR NR AND 1 + $30);
- END;
-
-
- PROCEDURE SETBIT(PORTADR:WORD;INDEX,NR:BYTE);
- BEGIN
- SETPORT(PORTADR,INDEX,GETPORT(PORTADR,INDEX) OR BITMASK[NR]);
- END;
-
-
- PROCEDURE RESBIT(PORTADR:WORD;INDEX,NR:BYTE);
- BEGIN
- SETPORT(PORTADR,INDEX,GETPORT(PORTADR,INDEX) AND NOT BITMASK[NR]);
- END;
-
-
- PROCEDURE NMI(SWITCH:BOOLEAN);
- BEGIN
- IF SWITCH THEN ORPORT(RTC,$1E,0)
- ELSE ORPORT(RTC,$9E,0);
- (*
- IF SWITCH THEN PORT[$61] := PORT[$61] AND $F3
- ELSE PORT[$61] := PORT[$61] OR $0C;
- *)
- END;
-
-
- PROCEDURE RESET_PARITY_ERROR;
- BEGIN
- PORT[$61] := PORT[$61] OR $0C;
- PORT[$61] := PORT[$61] AND $F3;
- END;
-
-
- END.
-