home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* SCREENIO.INC *)
- (* Speichern u. Laden des Bildschirm-RAM in allen Text- *)
- (* und Grafikmodi *)
- (* ------------------------------------------------------ *)
-
- TYPE name = STRING[64];
- feld = ARRAY[0..11] OF BYTE;
- Hscreen = ARRAY[0..16383] OF BYTE;
- font8x8 = ARRAY[CHAR, 0..7] OF BYTE;
-
- CONST grafik : BOOLEAN = FALSE;
- Gdata : feld = ($35, $2d, $2e, $07, $5b, $02,
- $57, $57, $02, $03, $00, $00);
- Tdata : feld = ($61, $50, $52, $0f, $19, $06,
- $19, $19, $02, $0d, $0b, $0c);
-
- VAR saved, ConOut,
- X_Pos, Y_Pos : INTEGER;
- Puffer : ARRAY[0..32767] OF BYTE;
- HercBase : BYTE ABSOLUTE $B000:0000;
- datei : FILE;
- font, font1, font2 : ^font8x8;
- screen : ^Hscreen;
-
- (* ------------------------------------------------------ *)
- FUNCTION get_modus (VAR seite : BYTE) : BYTE;
-
- VAR regs : regs8088_ ;
-
- BEGIN
- regs.AH := $0f;
- INTR($10, regs);
- get_modus := regs.AL;
- seite := regs.BH;
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE set_modus (neu : BYTE);
-
- VAR regs : regs8088_ ;
-
- BEGIN
- regs.AH := $00;
- regs.AL := neu;
- INTR($10, regs);
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE wo_cursor (VAR x, y : INTEGER);
-
- VAR Active_Page : BYTE ABSOLUTE $0040:$0062;
- Crt_Pages : ARRAY[0..7]
- OF INTEGER ABSOLUTE $0040:$0050 ;
- BEGIN
- x := Crt_Pages[active_page];
- y := Hi(x) + 1;
- x := Lo(x) + 1;
- END;
-
- (* ------------------------------------------------------ *)
- FUNCTION ByteOffset (x, y : INTEGER) : INTEGER;
-
- BEGIN
- ByteOffset := (y AND $0003) SHL 13 + 90 * (y SHR 2)
- + (x SHR 3)
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE texttreiber (ch : CHAR);
-
- VAR I : INTEGER;
- font : ^font8x8;
-
- BEGIN
- IF X_Pos=80 THEN BEGIN
- X_Pos := 1; Y_Pos := Y_Pos + 1;
- END;
- IF ch = #10 THEN BEGIN
- X_Pos := 1; Exit;
- END;
- IF ch = #13 THEN BEGIN
- Y_Pos := Y_Pos + 1; Exit;
- END;
- IF ch <= #127 THEN font := font1
- ELSE BEGIN
- font := font2;
- ch := Chr( Ord(ch) - 128);
- END;
- FOR I := 0 TO 7 DO
- screen^[ByteOffset( (X_Pos-1)*8, (Y_Pos-1)*14+I) ]
- := font^[ch, I];
- X_Pos := X_Pos + 1;
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE GraphMode;
-
- VAR I : INTEGER;
-
- BEGIN
- screen := Ptr($B000, $0000);
- font1 := Ptr($f000, $fa6e);
- font2 := Ptr(memW[0: $007e], memW[0: $007c] );
- X_Pos := 1; Y_Pos := 1;
- grafik := TRUE;
- ConOut := ConOutPtr;
- ConOutPtr := ofs(texttreiber);
- Port[$3b8] := $02;
- FOR I := 0 TO 11 DO BEGIN
- Port[$3b4] := I;
- Port[$3b5] := Gdata[I];
- END;
- FillChar(screen^, 32767, $0);
- Port[$3bf] := $03;
- Delay(100);
- Port[$3b8]:=$02 OR $08;
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE TextMode;
-
- VAR I : INTEGER;
-
- BEGIN
- screen := Ptr($B000, $0000);
- font1 := Ptr($f000, $fa6e);
- font2 := Ptr(memW[0: $007e], memW[0: $007c] );
- X_Pos := 1; Y_Pos := 1;
- grafik := FALSE;
- ConOutPtr :=ConOut;
- Port[$3b8] := $20;
- FOR I := 0 TO 11 DO BEGIN
- Port[$3b4] := I;
- Port[$3b5] := Tdata[I];
- END;
- FillChar(screen^, 2000, $0);
- Port[$3bf] := $01;
- Delay(100);
- Port[$3b8] := $20 OR $08;
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE checkmode; (* Check auf Grafikmodus der HGC *)
-
- VAR sign : CHAR;
-
- BEGIN
- Write('okay (j/n) ? ');
- Read(Kbd, sign);
- IF sign = #27 THEN
- IF grafik THEN TextMode ELSE GraphMode;
- Move(Puffer[0], HercBase, 32767);
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE HercSave (DateiName : name);
-
- CONST okay : BOOLEAN = FALSE;
-
- BEGIN
- REPEAT
- Assign(datei, DateiName);
- ReWrite(datei);
- Move(HercBase, Puffer[0], 32767);
- BlockWrite(datei, Puffer[0], 256, saved);
- IF saved < 256 THEN Write(^G) ELSE okay := TRUE;
- Flush(datei);
- Close(datei);
- UNTIL okay;
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE HercLoad (DateiName : name);
-
- VAR ch : CHAR;
-
- BEGIN
- Assign(datei, DateiName); ReSet(datei);
- BlockRead(datei, Puffer[0], 256, saved);
- Move(Puffer[0], HercBase, 32767);
- Close(datei);
- END;
-
- (* ------------------------------------------------------ *)
- (* CGA Routinen *)
- (* ------------------------------------------------------ *)
-
- VAR CgaBase : BYTE ABSOLUTE $B800:0000;
- modus, seite : BYTE;
-
- PROCEDURE set_seite (seite : BYTE);
- VAR regs : regs8088_ ;
- BEGIN
- regs.AH := $05;
- regs.AL := seite;
- INTR($10, regs);
- END;
-
- PROCEDURE CgaSave (DateiName : name);
- CONST okay : BOOLEAN = FALSE;
- BEGIN
- modus := get_modus(seite);
- REPEAT
- Assign(datei, DateiName);
- ReWrite(datei);
- Move(CgaBase, Puffer[0], 16383);
- Puffer[16500] := modus;
- Puffer[16501] := seite;
- BlockWrite(datei, Puffer[0], 129, saved);
- IF saved < 129 THEN Write(^G) ELSE okay := TRUE;
- Flush(datei);
- Close(datei);
- UNTIL okay;
- END;
-
- PROCEDURE CgaLoad (DateiName : name);
- VAR regs : regs8088_ ;
- BEGIN
- Assign(datei, DateiName); ReSet(datei);
- BlockRead(datei, Puffer[0], 129, saved);
- modus := Puffer[16500];
- seite := Puffer[16501];
- set_modus(modus);
- set_seite(seite);
- Move(Puffer[0], CgaBase, 16383);
- Close(datei);
- END;
-
- (* ------------------------------------------------------ *)
- (* EGA Routinen *)
- (* ------------------------------------------------------ *)
-
- VAR EgaBase : BYTE ABSOLUTE $A000:0000;
-
- PROCEDURE EgaScreen ( nr : INTEGER);
- VAR regs : regs8088_ ;
- BEGIN
- nr := nr AND 1;
- regs.AX := $0500 + nr;
- INTR($10, regs);
- END;
-
- PROCEDURE EgaSave (DateiName : name);
- CONST okay : BOOLEAN = FALSE;
- VAR I : INTEGER;
- BEGIN
- REPEAT
- modus := get_modus(seite);
- Puffer[0] := modus;
- Assign(datei, DateiName);
- ReWrite(datei);
- BlockWrite(datei, Puffer[0], 1, saved);
- FOR I := 0 TO 3 DO BEGIN
- Port[$03ce] := 4;
- Port[$03cf] := I AND 3;
- Move(EgaBase, Puffer[0], 28000);
- BlockWrite(datei, Puffer[0], 219, saved);
- IF saved < 219 THEN Write(^G) ELSE okay := TRUE;
- Flush(datei);
- END;
- Close(datei);
- UNTIL okay;
- END;
-
- PROCEDURE EgaLoad (DateiName : name);
- VAR regs : regs8088_ ;
- I : INTEGER;
- BEGIN
- EgaScreen(0);
- Assign(datei, DateiName); ReSet(datei);
- BlockRead(datei, Puffer[0], 1, saved);
- modus := Puffer[0];
- set_modus(modus);
- FOR I := 0 TO 3 DO BEGIN
- Port[$03c4] := $02;
- Port[$03c5] := (1 SHL I);
- BlockRead(datei, Puffer[0], 219, saved);
- Move(Puffer[0], EgaBase, 28000);
- END;
- Close(datei);
- END;
- (* ------------------------------------------------------ *)
- (* Ende von SCREENIO.INC *)
-