home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 08 / grdlagen / pacman.pas < prev    next >
Pascal/Delphi Source File  |  1990-07-05  |  5KB  |  110 lines

  1. (* ====================================================== *)
  2. (*                        PACMAN.PAS                      *)
  3. (*                    Das EGA/VGA-BIOS:                   *)
  4. (*      Pacman -  Der residente Kommandozeilenfresser     *)
  5. (*            (C) 1990 Matthias Uphoff & TOOLBOX          *)
  6. (* ====================================================== *)
  7.  
  8. {$M 1024,0,0}        (* Speicherbedarf auf Minimum setzen *)
  9.                      (* wegen residenter Installierung.   *)
  10. USES Dos, Bios5;
  11.  
  12. CONST CSize = 16;        (* VGA-Zeichenhöhe, für EGA 14 *)
  13.       ScrSize = 80 * 25; (* Anzahl Bildschirm-Zeichen *)
  14.       ScrSeg = $B800;    (* Segmentadresse Bildspeicher *)
  15.       ScrOfs = 0;        (* Offsetadresse Bildspeicher *)
  16.       Back = #222;       (* #222 = Pacman-Hinterteil *)
  17.       Open = #223;       (* #223 = Vorderteil, Maul offen *)
  18.       Closed = #224;     (* #224 = Vorderteil, Maul zu *)
  19.  
  20. TYPE  ScrRec = RECORD    (* Zeichen/Attributpaar *)
  21.                  c: Char;
  22.                  a: Byte;
  23.                END;
  24.         (* Textbildspeicher *)
  25.       TextScreen = ARRAY[0..ScrSize-1] OF ScrRec;
  26.         (* Zeichenmatrix *)
  27.       CharMatrix = ARRAY[0..CSize-1] OF Byte;
  28.  
  29. CONST (* --------------- Die Pacmanfigur ---------------- *)
  30.       (* Für EGA: Das jeweils 1. und 16. Byte streichen   *)
  31.       CMBack: CharMatrix =
  32.                 ($00,$07,$1F,$3F,$7F,$7F,$FF,$FF,
  33.                  $FF,$FF,$7F,$7F,$3F,$1F,$07,$00);
  34.       CMOpen: CharMatrix =
  35.                 ($00,$E0,$F8,$3E,$3E,$F0,$C0,$00,
  36.                 $00,$C0,$F0,$FE,$FE,$F8,$E0,$00);
  37.       CMClosed: CharMatrix =
  38.                 ($00,$E0,$F8,$3E,$3E,$FF,$FF,$CC,
  39.                 $33,$FF,$FF,$FE,$FE,$F8,$E0,$00);
  40.  
  41. VAR Screen: TextScreen ABSOLUTE ScrSeg:ScrOfs;
  42.     NewPtrTable: PtrTableType; (* Kopie der Zeigertabelle *)
  43.     NewChar: TextFontDescriptor; (* Fontdeskriptor-Record *)
  44.     SaveInt8: Pointer;     (* alter Timer-Interruptvektor *)
  45.     TickCount: Byte;       (* Zähler für Timerinterrupts  *)
  46.  
  47. PROCEDURE CheckScreen; Interrupt;
  48.    (* Neuer Timer-Interrupthandler *)
  49.    VAR i: Word;
  50. BEGIN
  51.     (* Alte Timer-Routine aufrufen *)
  52.   INLINE($9C/$FF/$1E/SaveInt8);
  53.   IF VideoMode AND $7F = 3 THEN BEGIN   (* Modus 3 aktiv: *)
  54.     Inc(TickCount);                     (* Zähler erhöhen *)
  55.     IF TickCount = 4 THEN BEGIN        (* Wenn Zähler = 4 *)
  56.       TickCount := 0;              (* Zähler zurücksetzen *)
  57.       i := ScrSize;           (* Index = Bildspeicherende *)
  58.       REPEAT
  59.         i := i - 1;               (* Eine Position zurück *)
  60.         IF Screen[i].c = Open THEN BEGIN
  61.        (* Offenes Maul gefunden; testen, ob Zeichen folgt *)
  62.           IF (Screen[i+1].c <> #32) OR
  63.                (Screen[i+2].c <> #32) THEN BEGIN
  64.             Screen[i+1].c := Closed;         (* Klappe zu *)
  65.             Screen[i].c := Back;           (* Pacman eine *)
  66.             Screen[i-1].c := #32;   (* Stelle nach rechts *)
  67.           END;
  68.           i := 0;                       (* Ende der Suche *)
  69.         END
  70.         ELSE IF Screen[i].c = Closed THEN BEGIN
  71.           (* geschlossenes Maul gefunden *)
  72.           Screen[i].c := Open;             (* Maul öffnen *)
  73.           i := 0;                       (* Ende der Suche *)
  74.         END;
  75.       UNTIL i <= 1;             (* bis Bildspeicheranfang *)
  76.     END;
  77.   END;
  78. END;
  79.  
  80. PROCEDURE SetVideoMode(Mode: Byte);
  81.    (* Videomodus initialisieren *)
  82.    VAR R: Registers;
  83. BEGIN
  84.   R.AH := 0; R.AL := Mode;
  85.   Intr($10,R);
  86. END;
  87.  
  88. BEGIN  (* Hauptprogramm, Fontdeskriptor bestücken: *)
  89.   NewChar.CharSize := CSize;               (* Zeichenhöhe *)
  90.   NewChar.BlockNr := 0;        (* Installation in Block 0 *)
  91.   NewChar.FirstChar := ORD(Back);  (* Erste Zeichennummer *)
  92.   NewChar.NrOfChar := 3;                (* 3 neue Zeichen *)
  93.   NewChar.FontPtr := Addr(CMBack);   (* Adresse Matritzen *)
  94.   NewChar.Rows := 25;                    (* 25 Textzeilen *)
  95.   NewChar.Modes[0] := 3;        (* Nur in Modus 3 wirksam *)
  96.   NewChar.Modes[1] := $FF;               (* Endmarkierung *)
  97.   NewPtrTable := SaveTablePtr^; (* Zeigertabelle kopieren *)
  98.     (* Deskriptoradresse eintragen *)
  99.   NewPtrTable.TextFontPtr := Addr(NewChar);
  100.     (* Neue Save Table - Adresse im BIOS-RAM setzen *)
  101.   SaveTablePtr := Addr(NewPtrTable);
  102.   SetVideoMode(3);          (* Textmodus 3 initialisieren *)
  103.   TickCount := 0;                (* Zähler initialisieren *)
  104.   GetIntVec(8,SaveInt8);     (* Alten INT 8-Vektor retten *)
  105.     (* Neuen Interrupthandler installieren *)
  106.   SetIntVec(8,Addr(CheckScreen));
  107.   Keep(0);                    (* Programm resident machen *)
  108. END.
  109. (* ====================================================== *)
  110. (*                     PACMAN.PAS                         *)