home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* ASCII.XMS *)
- (* Verwaltung der ASCII-Tabelle im Extended Memory *)
- (* ------------------------------------------------------ *)
-
- VAR
- SavePage, VideoPage, AsciiTable : XMS.Descriptor;
-
- PROCEDURE SaveScreen(CurrentPage : ScreenPtr);
- (* sichert den Bildschirminhalt bei "CurrentPage". *)
- BEGIN
- VideoPage.RAM := TRUE; (* Bereich liegt im RAM *)
- VideoPage.Address := CurrentPage;
- XMS.MoveMemory(VideoPage, SavePage, SizeOf(Screen) DIV 2);
- END;
-
- PROCEDURE RestoreScreen(CurrentPage : ScreenPtr);
- (* restauriert den Bildschirminhalt bei "CurrentPage". *)
- BEGIN
- VideoPage.Address := CurrentPage;
- XMS.MoveMemory(SavePage, VideoPage, SizeOf(Screen) DIV 2);
- END;
-
- PROCEDURE DisplayAsciiTable(CurrentPage : ScreenPtr);
- (* bringt die Ascii-Tabelle auf den Bildschirm. *)
- VAR
- Row : BYTE;
- BEGIN
- FOR Row:=1 TO RowSize DO BEGIN
- AsciiTable.Offset := Pred(Row) * ColSize * 2;
- VideoPage.Address := @CurrentPage^[YOfs+Row-1, XOfs];
- XMS.MoveMemory(AsciiTable, VideoPage, ColSize);
- END;
- END;
-
- PROCEDURE AllocateBuffers;
- (* Anforderung und Vorbereitung der benötigten Puffer. *)
-
- FUNCTION KBytes(Bytes : LONGINT) : WORD;
- (* Größenumrechnung von Bytes nach Kilobytes. *)
- BEGIN
- IF Bytes MOD 1024 <> 0 THEN BEGIN
- KBytes := Bytes DIV 1024 + 1;
- END ELSE BEGIN
- KBytes := Bytes DIV 1024;
- END;
- END;
-
- BEGIN
- IF NOT XMS.Installed THEN BEGIN
- FatalError('HIMEM.SYS nicht installiert!');
- END;
- WITH AsciiTable DO BEGIN
- RAM := FALSE;
- Handle := XMS.AllocateMemory(KBytes(SizeOf(Window)));
- Offset := 0;
- END;
- WITH SavePage DO BEGIN
- RAM := FALSE;
- Handle := XMS.AllocateMemory(KBytes(SizeOf(Screen)));
- Offset := 0;
- END;
- IF XMS.Result <> XMS.Ok THEN BEGIN
- FatalError('Nicht genügend Extended Memory vorhanden!');
- END;
- END;
-
- PROCEDURE DeallocateBuffers;
- (* benötigte Puffer bei Programmende wieder freigeben. *)
- BEGIN
- XMS.DeallocateMemory(AsciiTable.Handle);
- XMS.DeallocateMemory(SavePage.Handle);
- END;
-
- PROCEDURE SetTable(Col, Row, Attr : BYTE; Ch : CHAR);
- (* belegt die Tabellenposition (Col,Row) mit dem Zei-
- chen "Ch" und dem Videoattribut "Attr". *)
- VAR
- Entry : WORD;
- Source : XMS.Descriptor;
- BEGIN
- Entry := Word(Attr)*256 + Ord(Ch);
- Source.RAM := TRUE; (* Bereich liegt im RAM *)
- Source.Address := @Entry;
- AsciiTable.Offset := (Pred(Row)*ColSize + Pred(Col)) * 2;
- XMS.MoveMemory(Source, AsciiTable, 1);
- END;
-
- PROCEDURE PrepareExit;
- (* Maßnahmen für das Installationsende treffen. *)
- BEGIN
- { Nichts zu tun! }
- END;
- (* ------------------------------------------------------ *)
- (* Ende von ASCII.XMS *)