[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]
(*
Name: GETPUT
Version: 1.0
Date of release: 02/Ago/1994
Language: it can be used with Turbo Pascal 6.0 or
Borland Pascal 7.0
Donated to the public domain by: Calabro' Davide
P.O.Box 65
21019 Somma Lombardo (VA)
Italy
E-mail: calabro@dsi.unimi.it
Send comments,modifications or conversions in any other
language to me thanks!
This unit implements a useful Backup/Restore text video-portions feature.
No static buffers are used to retain the saved video memory. Be sure
to have enough heap space when call the GetVideo function or you'll get
an "Heap overflow error" at runtime!
This is an easy example of use of the GetPut unit:
+--- START EXAMPLE ----------------------------------------------------+
| Uses GETPUT; |
| |
| Var A:PGetPut; {<---- Each saved portion has its own pointer} |
| |
| Begin |
| A:=GetVideo(10,10,30,5); |
| { +--|--|-|---- Start X position } |
| { +--|-|---- Start Y position } |
| { +-|---- Length on X axis } |
| { +---- Length on Y axis } |
| |
| PutVideo(A); {<---- Restore the previously saved portion } |
| { Warning: Dinamic buffer is disposed, don't } |
| { call with same buffer twice! } |
| |
| End. |
+--- END EXAMPLE ------------------------------------------------------+
*)
Unit GETPUT;
INTERFACE
Type PGetPut=^TGetPut;
TGetPut=Record
Item:Byte;
Next:PGetPut;
End;
Function GetVideo(X,Y,LX,LY:Byte):PGetPut;
Procedure PutVideo(BufPunt:PGetPut);
IMPLEMENTATION
Var GenPunt1,
GenPunt2:PGetPut;
Loop1:Byte;
Loop:Word;
StartAddr:Word;
Function GetVideo;
Begin
New(GenPunt1);
GetVideo:=GenPunt1;
For Loop:=1 To 4 Do
Begin
Case Loop Of
1: GenPunt1^.Item:=X;
2: GenPunt1^.Item:=Y;
3: GenPunt1^.Item:=LX;
4: GenPunt1^.Item:=LY;
End;
New(GenPunt2);
GenPunt1^.Next:=GenPunt2;
GenPunt1:=GenPunt2;
End;
StartAddr:=160*(Y-1)+2*(X-1);
For Loop1:=1 To LY Do
Begin
For Loop:=StartAddr To StartAddr+2*LX-1 Do
Begin
GenPunt1^.Item:=Mem[$B800:Loop];
New(GenPunt2);
GenPunt1^.Next:=GenPunt2;
GenPunt1:=GenPunt2;
End;
Inc(StartAddr,160);
End;
GenPunt1^.Next:=Nil;
End;
Procedure PutVideo;
Var X,Y,LX,LY:Byte;
Begin
GenPunt1:=BufPunt;
For Loop:=1 To 4 Do
Begin
Case Loop Of
1: X:=GenPunt1^.Item;
2: Y:=GenPunt1^.Item;
3: LX:=GenPunt1^.Item;
4: LY:=GenPunt1^.Item;
End;
GenPunt2:=GenPunt1^.Next;
Dispose(GenPunt1);
GenPunt1:=GenPunt2;
End;
StartAddr:=160*(Y-1)+2*(X-1);
For Loop1:=1 To LY Do
Begin
For Loop:=StartAddr To StartAddr+2*LX-1 Do
Begin
Mem[$B800:Loop]:=GenPunt1^.Item;
GenPunt2:=GenPunt1^.Next;
Dispose(GenPunt1);
GenPunt1:=GenPunt2;
End;
Inc(StartAddr,160);
End;
End;
Begin
End.
[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]