home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1999 September
/
Chip_1999-09_cd.bin
/
internet
/
Jeremy
/
tp
/
downloads
/
savewind.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1999-08-03
|
2KB
|
68 lines
unit SaveWind;
interface
type pbuf=^tbuf; { ukazatel na typ tbuf}
tbuf=array [1..2000] of word; { pole 2000 slov pro uchování celé obrazovky}
{ (80 * 25) = 2000 }
function VioSeg:word; { Segment pam╪ti, na kterém zaƒíná videopam╪£}
{ je to $B000 pro Hercules, $B800 pro ostatní}
Procedure SaveWin(x1,y1,x2,y2:byte; var buffer:pbuf);
{ ukládá okno o dan∞ch sou²adnicích do bufferu}
Procedure RestoreWin(x1,y1,x2,y2:byte; var buffer:pbuf);
{ obnovuje okno o dan∞ch sou²adnic z bufferu}
implementation
function VioSeg:word; assembler;
asm
push BX
push ES
mov ES,Seg0040
mov BX,ES:[0049h]
cmp BL,07
jz @@1 {hercules}
mov AX,SegB800
jmp @@2
@@1: mov AX,SegB000
@@2: pop ES
pop BX
end;
Procedure SaveWin(x1,y1,x2,y2:byte; var buffer:pbuf);
var x,y:byte; {naçte dané okno do pole }
ofs,vseg,index:word;
begin
if buffer=nil then new(buffer); { není-li pro buffer rezervována pam╪£,
ud╪lej to}
ofs:=((y1-1)*80+x1-1)*2; { offset pozice x1,y1}
vseg:=VioSeg; { segment ve videopam╪ti, ze které se ƒte}
index:=1;
for y:=1 to (y2-y1+1) do { procházej a ukládej okno po ²ádcích}
begin
for x:=0 to (x2-x1) do { od zaƒátku ²ádku do konce}
begin
buffer^[index]:=memw[vseg:ofs+x*2]; { uloº obsah videopam╪ti pro danou
pozici (x,y)}
inc(index); { zv╪tτení indexu pole o 1}
end;
inc(ofs,160) { posun o 1 ²ádek; 160 = 80 znakà * 2 byte}
end
end;
Procedure RestoreWin(x1,y1,x2,y2:byte; var buffer:pbuf);
var x,y:byte; {obnoví okno z pole na obrazovku}
ofs,vseg,index:word;
begin
ofs:=((y1-1)*80+x1-1)*2; { ofset pozice x1,y1}
vseg:=VioSeg; index:=1;
for y:=1 to (y2-y1+1) do
begin
for x:=0 to (x2-x1) do
begin
memw[vseg:ofs+x*2]:=buffer^[index]; { obnov pàvodní obsah videopam╪ti}
inc(index);
end;
inc(ofs,160) {posun o 1 ²ádek}
end
end;
end.