home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
08
/
grdlagen
/
pacman.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1990-07-05
|
5KB
|
110 lines
(* ====================================================== *)
(* PACMAN.PAS *)
(* Das EGA/VGA-BIOS: *)
(* Pacman - Der residente Kommandozeilenfresser *)
(* (C) 1990 Matthias Uphoff & TOOLBOX *)
(* ====================================================== *)
{$M 1024,0,0} (* Speicherbedarf auf Minimum setzen *)
(* wegen residenter Installierung. *)
USES Dos, Bios5;
CONST CSize = 16; (* VGA-Zeichenhöhe, für EGA 14 *)
ScrSize = 80 * 25; (* Anzahl Bildschirm-Zeichen *)
ScrSeg = $B800; (* Segmentadresse Bildspeicher *)
ScrOfs = 0; (* Offsetadresse Bildspeicher *)
Back = #222; (* #222 = Pacman-Hinterteil *)
Open = #223; (* #223 = Vorderteil, Maul offen *)
Closed = #224; (* #224 = Vorderteil, Maul zu *)
TYPE ScrRec = RECORD (* Zeichen/Attributpaar *)
c: Char;
a: Byte;
END;
(* Textbildspeicher *)
TextScreen = ARRAY[0..ScrSize-1] OF ScrRec;
(* Zeichenmatrix *)
CharMatrix = ARRAY[0..CSize-1] OF Byte;
CONST (* --------------- Die Pacmanfigur ---------------- *)
(* Für EGA: Das jeweils 1. und 16. Byte streichen *)
CMBack: CharMatrix =
($00,$07,$1F,$3F,$7F,$7F,$FF,$FF,
$FF,$FF,$7F,$7F,$3F,$1F,$07,$00);
CMOpen: CharMatrix =
($00,$E0,$F8,$3E,$3E,$F0,$C0,$00,
$00,$C0,$F0,$FE,$FE,$F8,$E0,$00);
CMClosed: CharMatrix =
($00,$E0,$F8,$3E,$3E,$FF,$FF,$CC,
$33,$FF,$FF,$FE,$FE,$F8,$E0,$00);
VAR Screen: TextScreen ABSOLUTE ScrSeg:ScrOfs;
NewPtrTable: PtrTableType; (* Kopie der Zeigertabelle *)
NewChar: TextFontDescriptor; (* Fontdeskriptor-Record *)
SaveInt8: Pointer; (* alter Timer-Interruptvektor *)
TickCount: Byte; (* Zähler für Timerinterrupts *)
PROCEDURE CheckScreen; Interrupt;
(* Neuer Timer-Interrupthandler *)
VAR i: Word;
BEGIN
(* Alte Timer-Routine aufrufen *)
INLINE($9C/$FF/$1E/SaveInt8);
IF VideoMode AND $7F = 3 THEN BEGIN (* Modus 3 aktiv: *)
Inc(TickCount); (* Zähler erhöhen *)
IF TickCount = 4 THEN BEGIN (* Wenn Zähler = 4 *)
TickCount := 0; (* Zähler zurücksetzen *)
i := ScrSize; (* Index = Bildspeicherende *)
REPEAT
i := i - 1; (* Eine Position zurück *)
IF Screen[i].c = Open THEN BEGIN
(* Offenes Maul gefunden; testen, ob Zeichen folgt *)
IF (Screen[i+1].c <> #32) OR
(Screen[i+2].c <> #32) THEN BEGIN
Screen[i+1].c := Closed; (* Klappe zu *)
Screen[i].c := Back; (* Pacman eine *)
Screen[i-1].c := #32; (* Stelle nach rechts *)
END;
i := 0; (* Ende der Suche *)
END
ELSE IF Screen[i].c = Closed THEN BEGIN
(* geschlossenes Maul gefunden *)
Screen[i].c := Open; (* Maul öffnen *)
i := 0; (* Ende der Suche *)
END;
UNTIL i <= 1; (* bis Bildspeicheranfang *)
END;
END;
END;
PROCEDURE SetVideoMode(Mode: Byte);
(* Videomodus initialisieren *)
VAR R: Registers;
BEGIN
R.AH := 0; R.AL := Mode;
Intr($10,R);
END;
BEGIN (* Hauptprogramm, Fontdeskriptor bestücken: *)
NewChar.CharSize := CSize; (* Zeichenhöhe *)
NewChar.BlockNr := 0; (* Installation in Block 0 *)
NewChar.FirstChar := ORD(Back); (* Erste Zeichennummer *)
NewChar.NrOfChar := 3; (* 3 neue Zeichen *)
NewChar.FontPtr := Addr(CMBack); (* Adresse Matritzen *)
NewChar.Rows := 25; (* 25 Textzeilen *)
NewChar.Modes[0] := 3; (* Nur in Modus 3 wirksam *)
NewChar.Modes[1] := $FF; (* Endmarkierung *)
NewPtrTable := SaveTablePtr^; (* Zeigertabelle kopieren *)
(* Deskriptoradresse eintragen *)
NewPtrTable.TextFontPtr := Addr(NewChar);
(* Neue Save Table - Adresse im BIOS-RAM setzen *)
SaveTablePtr := Addr(NewPtrTable);
SetVideoMode(3); (* Textmodus 3 initialisieren *)
TickCount := 0; (* Zähler initialisieren *)
GetIntVec(8,SaveInt8); (* Alten INT 8-Vektor retten *)
(* Neuen Interrupthandler installieren *)
SetIntVec(8,Addr(CheckScreen));
Keep(0); (* Programm resident machen *)
END.
(* ====================================================== *)
(* PACMAN.PAS *)