home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 September / Chip_1999-09_cd.bin / internet / Jeremy / tp / downloads / savewind.pas < prev    next >
Pascal/Delphi Source File  |  1999-08-03  |  2KB  |  68 lines

  1. unit SaveWind;
  2. interface
  3.  
  4. type pbuf=^tbuf;                   { ukazatel na typ tbuf}
  5.      tbuf=array [1..2000] of word; { pole 2000 slov pro uchování celé obrazovky}
  6.                                    { (80 * 25) = 2000 }
  7. function VioSeg:word;             { Segment pam╪ti, na kterém zaƒíná videopam╪£}
  8.                                   { je to $B000 pro Hercules, $B800 pro ostatní}
  9. Procedure SaveWin(x1,y1,x2,y2:byte; var buffer:pbuf);
  10.             { ukládá okno o dan∞ch sou²adnicích do bufferu}
  11. Procedure RestoreWin(x1,y1,x2,y2:byte; var buffer:pbuf);
  12.             { obnovuje okno o dan∞ch sou²adnic z bufferu}
  13.  
  14. implementation
  15. function VioSeg:word; assembler;
  16. asm
  17.         push BX
  18.         push ES
  19.         mov  ES,Seg0040
  20.         mov  BX,ES:[0049h]
  21.         cmp  BL,07
  22.         jz   @@1      {hercules}
  23.         mov  AX,SegB800
  24.         jmp  @@2
  25. @@1:    mov  AX,SegB000
  26. @@2:    pop  ES
  27.         pop  BX
  28. end;
  29.  
  30. Procedure SaveWin(x1,y1,x2,y2:byte; var buffer:pbuf);
  31. var x,y:byte;          {naçte dané okno do pole }
  32.     ofs,vseg,index:word;
  33. begin
  34.     if buffer=nil then new(buffer); { není-li pro buffer rezervována pam╪£,
  35.                                        ud╪lej to}
  36.     ofs:=((y1-1)*80+x1-1)*2;        { offset pozice x1,y1}
  37.     vseg:=VioSeg;                   { segment ve videopam╪ti, ze které se ƒte}
  38.     index:=1;
  39.     for y:=1 to (y2-y1+1) do        { procházej a ukládej okno po ²ádcích}
  40.     begin
  41.      for x:=0 to (x2-x1) do         { od zaƒátku ²ádku do konce}
  42.      begin
  43.        buffer^[index]:=memw[vseg:ofs+x*2]; { uloº obsah videopam╪ti pro danou
  44.                                              pozici (x,y)}
  45.        inc(index);                  { zv╪tτení indexu pole o 1}
  46.      end;
  47.      inc(ofs,160)                   { posun o 1 ²ádek; 160 = 80 znakà * 2 byte}
  48.     end
  49. end;
  50.  
  51. Procedure RestoreWin(x1,y1,x2,y2:byte; var buffer:pbuf);
  52. var x,y:byte;          {obnoví okno z pole na obrazovku}
  53.     ofs,vseg,index:word;
  54. begin
  55.     ofs:=((y1-1)*80+x1-1)*2;         { ofset pozice x1,y1}
  56.     vseg:=VioSeg; index:=1;
  57.     for y:=1 to (y2-y1+1) do
  58.     begin
  59.      for x:=0 to (x2-x1) do
  60.      begin
  61.        memw[vseg:ofs+x*2]:=buffer^[index]; { obnov pàvodní obsah videopam╪ti}
  62.        inc(index);
  63.      end;
  64.      inc(ofs,160)     {posun o 1 ²ádek}
  65.     end
  66. end;
  67.  
  68. end.