home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 17 / ascii.xms < prev    next >
Encoding:
Text File  |  1989-12-29  |  2.9 KB  |  96 lines

  1. (* ------------------------------------------------------ *)
  2. (*                       ASCII.XMS                        *)
  3. (*    Verwaltung der ASCII-Tabelle im Extended Memory     *)
  4. (* ------------------------------------------------------ *)
  5.  
  6. VAR
  7.   SavePage, VideoPage, AsciiTable : XMS.Descriptor;
  8.  
  9. PROCEDURE SaveScreen(CurrentPage : ScreenPtr);
  10.   (* sichert den Bildschirminhalt bei "CurrentPage".      *)
  11. BEGIN
  12.   VideoPage.RAM := TRUE;          (* Bereich liegt im RAM *)
  13.   VideoPage.Address := CurrentPage;
  14.   XMS.MoveMemory(VideoPage, SavePage, SizeOf(Screen) DIV 2);
  15. END;
  16.  
  17. PROCEDURE RestoreScreen(CurrentPage : ScreenPtr);
  18.   (* restauriert den Bildschirminhalt bei "CurrentPage".  *)
  19. BEGIN
  20.   VideoPage.Address := CurrentPage;
  21.   XMS.MoveMemory(SavePage, VideoPage, SizeOf(Screen) DIV 2);
  22. END;
  23.  
  24. PROCEDURE DisplayAsciiTable(CurrentPage : ScreenPtr);
  25.   (* bringt die Ascii-Tabelle auf den Bildschirm.         *)
  26. VAR
  27.   Row : BYTE;
  28. BEGIN
  29.   FOR Row:=1 TO RowSize DO BEGIN
  30.     AsciiTable.Offset := Pred(Row) * ColSize * 2;
  31.     VideoPage.Address := @CurrentPage^[YOfs+Row-1, XOfs];
  32.     XMS.MoveMemory(AsciiTable, VideoPage, ColSize);
  33.   END;
  34. END;
  35.  
  36. PROCEDURE AllocateBuffers;
  37.   (* Anforderung und Vorbereitung der benötigten Puffer.  *)
  38.  
  39.   FUNCTION KBytes(Bytes : LONGINT) : WORD;
  40.     (* Größenumrechnung von Bytes nach Kilobytes.         *)
  41.   BEGIN
  42.     IF Bytes MOD 1024 <> 0 THEN BEGIN
  43.       KBytes := Bytes DIV 1024 + 1;
  44.     END ELSE BEGIN
  45.       KBytes := Bytes DIV 1024;
  46.     END;
  47.   END;
  48.  
  49. BEGIN
  50.   IF NOT XMS.Installed THEN BEGIN
  51.     FatalError('HIMEM.SYS nicht installiert!');
  52.   END;
  53.   WITH AsciiTable DO BEGIN
  54.     RAM := FALSE;
  55.     Handle := XMS.AllocateMemory(KBytes(SizeOf(Window)));
  56.     Offset := 0;
  57.   END;
  58.   WITH SavePage DO BEGIN
  59.     RAM := FALSE;
  60.     Handle := XMS.AllocateMemory(KBytes(SizeOf(Screen)));
  61.     Offset := 0;
  62.   END;
  63.   IF XMS.Result <> XMS.Ok THEN BEGIN
  64.     FatalError('Nicht genügend Extended Memory vorhanden!');
  65.   END;
  66. END;
  67.  
  68. PROCEDURE DeallocateBuffers;
  69.   (* benötigte Puffer bei Programmende wieder freigeben.  *)
  70. BEGIN
  71.   XMS.DeallocateMemory(AsciiTable.Handle);
  72.   XMS.DeallocateMemory(SavePage.Handle);
  73. END;
  74.  
  75. PROCEDURE SetTable(Col, Row, Attr : BYTE; Ch : CHAR);
  76.   (* belegt die Tabellenposition (Col,Row) mit dem Zei-
  77.      chen "Ch" und dem Videoattribut "Attr".              *)
  78. VAR
  79.   Entry : WORD;
  80.   Source : XMS.Descriptor;
  81. BEGIN
  82.   Entry := Word(Attr)*256 + Ord(Ch);
  83.   Source.RAM := TRUE;             (* Bereich liegt im RAM *)
  84.   Source.Address := @Entry;
  85.   AsciiTable.Offset := (Pred(Row)*ColSize + Pred(Col)) * 2;
  86.   XMS.MoveMemory(Source, AsciiTable, 1);
  87. END;
  88.  
  89. PROCEDURE PrepareExit;
  90.   (* Maßnahmen für das Installationsende treffen.         *)
  91. BEGIN
  92.   { Nichts zu tun! }
  93. END;
  94. (* ------------------------------------------------------ *)
  95. (*                  Ende von ASCII.XMS                    *)
  96.