(* 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.