[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
(*
Hi..
This Unit is made all by myself, And There may be some problems with it, If
so please let me know..
All the routines that are present here come from one big unit that i have,
so there could be something missing( but as i said, just let me know))
there are some thing You have to keep in Mind when you are using these
routines, But i will go over them..
There are routines where the x coordinate isn't 640 but 80 (Like Text),
I've done this because I use 8x8 Text. (I now know that it isn't very hard
for me to change it so you can put a char on every x-coordinate, But i don't
feel much like it at the moment, Maybe in a couple of days))
Oh Yeah, None of my routines check if the coordinates are correct..
Andre Jakobs
MicroBrain Technologies Inc.
The Netherlands
Procedure Plot12h(x,y:word;Color:byte);
{x (0-639)
y (0-479)
Color (0-15)
Plots a pixel in [Color] at [x],[y]}
Procedure HLine12h(x,y,Length:word;Color:byte);
{x (0-639)
y (0-479)
Length (0-639)(But can of course be larger, cause there is no checking)
Color (0-15)
Draws a horizontal Line in [Color] at [x],[y]}
Procedure VLine12h(x,y,Length:word;Color:byte);
{x (0-639)
y (0-479)
Length (0-479)
Color (0-15)
Draws a vertical Line in [Color] at [x],[y]}
Procedure Block12h(x,y,Width,Height:word;Color:byte);
{x (0-639)
y (0-479)
Width (0-639)
Height (0-479)
Color (0-15)
Draws a Box in [Color] at [x],[y] wich is [Width] Wide and [Height] High}
Procedure Frame12h(x,y,Width,Height:word;Color:byte);
{x (0-639)
y (0-479)
Width (0-639)
Height (0-479)
Color (0-15)
Draws a Frame in [Color] at [x],[y] wich is [Width] Wide and [Height] High}
Procedure PutChar12h(x,y:word;color:byte;cha:char);
{x (0-79) !!!
y (0-479)
Color (0-15)
cha ('Character')
Puts a character in [Color] at [x],[y]
Doesn't erase background, So if there already is a character use block to
erase it.
example:
Block(50 shl 3,100,8,8,1);
^^^^^^^^ (50 is the x coordinate that is used for the char
but because block uses 0-639 and not (0-79) you
have to multiply it by 8 (shl 3))
PutChar(50,100,7,'A');}
Procedure PutString12h(x,y:word;Color:byte;Str:String);
{x (0-79) !!!
y (0-479)
Color (0-15)
Str ('String')
Puts a String in [Color] at [x],[y]
Doesn't erase background, So if there already is a String use block to
erase it.
example:
Block(50 shl 3,100,Length(String) shl 8,8,1);
^^^^^^^^ (50 is the x coordinate that is used for the char
but because block uses 0-639 and not (0-79) you
have to multiply it by 8 (shl 3))
PutString(50,100,7,'A');}
Procedure Window12h(x,y,Width,Height:word;Color0,Color1,Color2:byte);
{x (0-79) !!!
y (0-479)
Width (0-79) !!!
Height (0-479)
Color1 (0-15) (Darkest Color)
Color2 (0-15) (Window Main Color)
Color3 (0-15) (Lightest Color)
Draws a Window at [x],[y] wich is [Width] Wide and [Height] High
example:
Window12h(9,89,39,79,8,7,15)
}
Procedure CloseWindow12h;
{closes Last opened Window, there is a max of 16 windows at the moment, But you
can increase it if you want}
Procedure SaveScreen12h;
{Saves a complete Mode 12h Screen}
Procedure RestoreScreen12h;
{Restores Screen that is saved using SaveScreen12h}
Procedure Mode12h;{640x480x16, write mode 2}
{Sets Up mode 12h}
Procedure Button(x,y,W,H:Word;Color0,Color1,Color2:byte);
{x (0-639)
y (0-479)
Width (0-639)
Height (0-479)
Color1 (0-15) (Darkest Color)
Color2 (0-15) (Window Main Color)
Color3 (0-15) (Lightest Color)
Draws a Button at [x],[y] wich is [Width] Wide and [Height] High
}
Procedure LoadFont;
{This Loads a 8x8 Font into an array '_8x8P' that is used to display the text
You can optain this font by saving the 8x8 ROM font to a binary file and then
load it into this array.. (you can use a font util to save the font to disk
try some at (x2ftp.oulu.fi msdos/programming, and search for something that
has the name 2l8 (Too Late) font editor v1.20)},
Or you can load the _8x8Seg,_8x8Ofs with the Segment and Offset to the VGA 8x8
ROM Font..
Hope You can use these routines, Cause I use them alot now (Don't use textmode
anymore, But this Mode)..
*)
UNIT VGA_12h;
INTERFACE
USES CRT,DOS;
Type
PlotProc =Procedure(x,y:word;Color:byte);
HLineProc =Procedure(x,y,Length:word;Color:byte);
VLineProc =Procedure(x,y,Length:word;Color:byte);
BlockProc =Procedure(x,y,Width,Height:word;Color:byte);
FrameProc =Procedure(x,y,Width,Height:word;Color:byte);
PutCharProc =Procedure(x,y:word;color:byte;cha:char);
PutStringProc=Procedure(x,y:word;Color:byte;Str:String);
var
Result : word;
{Procedures}
ClrScr : Procedure; {Clear Screen}
Plot : PlotProc; {Plot(x,y,Color)}
HLine : HLineProc; {HorizontalLine(x,y,Length,Color)}
VLine : VLineProc; {VerticalLine(x,y,Length,Color)}
Block : BlockProc; {Block(x,y,Width,Height,Color)}
Frame : FrameProc;
PutChar : PutCharProc; {PutCharacter(x,y,Color,Char)}
PutString : PutStringProc; {PutString(x,y,Color,String)}
SaveScreen : Procedure; {SaveScreen}
RestoreScreen: Procedure; {RestoreScreen}
{Mode 12h Routines}
Procedure Plot12h(x,y:word;Color:byte);
Procedure HLine12h(x,y,Length:word;Color:byte);
Procedure VLine12h(x,y,Length:word;Color:byte);
Procedure Block12h(x,y,Width,Height:word;Color:byte);
Procedure Frame12h(x,y,Width,Height:word;Color:byte);
Procedure PutChar12h(x,y:word;color:byte;cha:char);
Procedure PutString12h(x,y:word;Color:byte;Str:String);
Procedure Window12h(x,y,Width,Height:word;Color0,Color1,Color2:byte);
Procedure CloseWindow12h;
Procedure SaveScreen12h;
Procedure RestoreScreen12h;
Procedure Mode12h;{640x480x16, write mode 2}
Procedure Button(x,y,W,H:Word;Color0,Color1,Color2:byte);
IMPLEMENTATION
Type
Window12hType = record
Width : byte;
Height: word;
VidOfs: word;
Plane0: pointer;
Plane1: pointer;
Plane2: pointer;
Plane3: pointer;
end;
Var
WindowList12h : Array [1..16] of ^Window12hType;
LastWindow12h : byte;
ScreenGrab : Array [0..3] of pointer;
_8x8Seg,_8x8Ofs : word;
_8x8P : Array [0..2048] of byte;
{*****************************************************************
GRAPHICS & TEXT ROUTINES
*****************************************************************}
Procedure LoadFont;
var
F : file;
begin
assign(F,'8x8');
reset(F,1);
blockread(f,_8x8P[0],2048);
close(F);
_8x8Seg:=Seg(_8x8P[0]);
_8x8Ofs:=Ofs(_8x8P[0]);
end;
Procedure Mode12h;{Assembler;{640x480x16}
begin
@Plot:=@Plot12h;
@VLine:=@VLine12h;
@HLine:=@HLine12h;
@Block:=@Block12h;
@Frame:=@Frame12h;
@PutChar:=@PutChar12h;
@PutString:=@PutString12h;
@SaveScreen:=@SaveScreen12h;
@RestoreScreen:=@RestoreScreen12h;
Asm
Mov AH,00
Mov AL,12h
Int 10h
mov dx,03ceh {Graphics Controller}
mov ax,0205h {Mode Register, Write Mode 2}
out dx,ax
end;
end;
Procedure Button(x,y,W,H:Word;Color0,Color1,Color2:byte);
begin
Block(x,y,W,H,Color1);
HLine(x+1,y,W-2,Color2);
VLine(x,y+1,H-2,Color2);
HLine(x+1,y+H-1,W-1,Color0);
VLine(x+W-1,y+1,H-1,Color0);
end;
Procedure ClrScr12h;assembler;
asm
mov es,SegA000
mov di,00h
mov ax,00h
mov cx,19200
rep stosw
end;
Procedure Plot12h(x,y:word;Color:byte); assembler;
asm
mov ax,SegA000 {Calculate Offset}
mov es,ax
mov bx,[y]
mov di,bx
shl di,6 {80*y}
shl bx,4
add di,bx
mov cx,[x]
mov bx,cx
shr bx,3 {/8}
add di,bx {80*y+ (x/8)}
and cx,7 {Get Bit that Changes}
mov ah,128
shr ah,cl
mov dx,03ceh
mov al,8
out dx,ax
mov dl,[es:di]
mov al,[Color]
mov [es:di],al
end;
Procedure HLine12h(x,y,Length:word;Color:byte);Assembler;
asm
mov bx,[x]
mov si,[Length]
or si,si {Check if Length=0}
jz @D_End {If So then jump to End}
mov dx,03ceh {Graphics Controller}
mov ax,SegA000 {Calculate Offset}
mov es,ax
mov ax,[y]
mov di,ax
shl di,6 {80*y}
shl ax,4
add di,ax
mov ax,bx
shr ax,3 {/8}
add di,ax {80*y+ (x/8)}
{di = Offset in VMem}
{Si = Length}
{bx = x}
{dx = Graphix Controller}
{ax = empty}
{cx = empty}
mov cx,bx {Get StartBit}
and cx,07h
mov ax,si
add ax,cx
cmp ax,8 {Is x+Length<One Byte}
jb @D_One
mov ah,0ffh {11111111b}
shr ah,cl {BitMask}
mov al,8 {BitMask Register}
out dx,ax {Write BitMask}
mov al,[es:di]
mov al,[Color]
mov [es:di],al
inc di
mov al,8 {BitMask Register}
mov ah,0ffh {BitMask}
out dx,ax {Write BitMask}
mov ax,si
mov ch,8
sub ch,cl
mov cl,ch
xor ch,ch
sub ax,cx
shr ax,3 {Length div 8}
mov cx,ax
mov al,[Color]
rep stosb
mov cx,bx {cx:=x+Length}
add cx,si
and cx,07h {cx and 07}
mov ah,0ffh
shr ah,cl {BitMask}
cmp ah,0
je @D_End
not ah
mov al,8 {BitMask Register}
out dx,ax {Write BitMask}
mov cl,[es:di]
mov al,[Color]
mov [es:di],al
jmp @D_End
@D_One:
mov ah,0ffh
shr ah,cl {Left BitMask}
add bx,si
dec bx
and bx,07h
mov cx,7
sub cx,bx
mov bl,0ffh
shl bl,cl {Right BitMask}
and ah,bl {Full BitMask}
mov al,8 {BitMask Register}
out dx,ax {Write BitMask}
mov dl,[es:di] {Fill Latches}
mov al,[Color]
mov [es:di],al {Write Pixel}
@D_End:
end;
Procedure VLine12h(x,y,Length:word;Color:byte);Assembler;
asm
mov ax,SegA000 {Calculate Offset}
mov es,ax
mov bx,[y]
mov di,bx
shl di,6 {80*y}
shl bx,4
add di,bx
mov cx,[x]
mov bx,cx
shr bx,3 {/8}
add di,bx {80*y+ (x/8)}
and cx,7 {Get Bit that Changes}
mov ah,80h
shr ah,cl {BitMask Value}
mov dx,03ceh {Graphics Controller}
mov al,8 {BitMask Register}
out dx,ax {BitMask Setup}
mov bx,[Length]
mov al,[Color]
@D_L:
mov dl,[es:di]
mov [es:di],al {Put Byte at Offset}
add di,80
dec bx
jnz @D_L
end;
Procedure Block12h(x,y,Width,Height:word;Color:byte);Assembler;
asm
mov bx,[x]
mov si,[Width]
or si,si {Check if Length=0}
jz @D_End {If So then jump to End}
mov ax,SegA000 {Calculate Offset}
mov es,ax
mov ax,[y]
mov di,ax
shl di,6 {80*y}
shl ax,4
add di,ax
mov ax,bx
shr ax,3 {/8}
add di,ax {80*y+ (x/8)}
{di = Offset in VMem}
{Si = Length}
{bx = x}
{dx = Graphix Controller}
{ax = empty}
{cx = empty}
mov cx,bx {Get StartBit}
and cx,07h
mov ax,si
add ax,cx
cmp ax,8 {Is x+Length<One Byte}
jb @D_One
mov ah,0ffh {11111111b}
shr ah,cl {BitMask}
mov al,8 {BitMask Register}
mov dx,03ceh {Graphics Controller}
out dx,ax {Write BitMask}
push cx
mov ah,[Color]
mov cx,[Height]
mov dx,di
@D_LL: {Draw Left of Box}
mov al,[es:di]
mov [es:di],ah
add di,80 {di:=di+80}
dec cx
jnz @D_LL
mov di,dx
inc di
pop cx
mov al,8 {BitMask Register}
mov ah,0ffh {BitMask}
mov dx,03ceh {Graphics Controller}
out dx,ax {Write BitMask}
mov ax,si
mov ch,8
sub ch,cl
mov cl,ch
xor ch,ch
sub ax,cx
shr ax,3 {Length div 8}
push di
push bx
mov bx,[Height]
mov dx,ax
mov al,[Color]
@D_LC:
mov cx,dx
rep stosb
add di,80
sub di,dx
dec bx
jnz @D_LC
pop bx
pop di
add di,dx
mov cx,bx {cx:=x+Length}
add cx,si
and cx,07h {cx and 07}
mov ah,0ffh
shr ah,cl {BitMask}
cmp ah,0
je @D_End
not ah
mov al,8 {BitMask Register}
mov dx,03ceh {Graphics Controller}
out dx,ax {Write BitMask}
mov cx,[Height]
mov al,[Color]
@D_LR:
mov ah,[es:di]
mov [es:di],al
add di,80
dec cx
jnz @D_LR
jmp @D_End
@D_One:
mov ah,0ffh
shr ah,cl {Left BitMask}
add bx,si
dec bx
and bx,07h
mov cx,7
sub cx,bx
mov bl,0ffh
shl bl,cl {Right BitMask}
and ah,bl {Full BitMask}
mov al,8 {BitMask Register}
mov dx,03ceh {Graphics Controller}
out dx,ax {Write BitMask}
mov cx,[Height]
mov al,[Color]
@D_L:
mov dl,[es:di] {Fill Latches}
mov [es:di],al {Write Pixel}
add di,80
dec cx
jnz @D_L
@D_End:
end;
Procedure Frame12h(x,y,Width,Height:word;Color:byte);
begin
HLine(x,y,Width,Color);
VLine(x,y,Height,Color);
VLine(x+Width-1,y,Height,Color);
HLine(x,y+Height-1,Width,Color);
end;
Procedure PutChar12h(x,y:word;Color:byte;cha:char);Assembler;
asm
push ds
xor bx,bx
mov bl,[cha]
shl bx,3
mov ax,_8x8Seg
mov ds,ax
mov si,_8x8Ofs
add si,bx
mov ax,SegA000 {Calculate Offset}
mov es,ax
mov di,[y]
mov ax,di
shl ax,6
shl di,4
add di,ax
add di,[x]
mov cx,8
mov dx,03ceh
mov al,8
mov bl,[Color]
@D_L:
mov ah,[ds:si]
out dx,ax
mov ah,[es:di]
mov [es:di],bl
inc si
add di,80
dec cx
jnz @D_L
pop ds
end;
Procedure PutString12h(x,y:word;Color:byte;Str:String);
var
f1 : byte;
Cha : char;
begin
for f1:=1 to ord(Str[0]) do
begin
cha:=Str[f1];
asm
push ds
mov ax,_8x8Seg
mov ds,ax
mov si,_8x8Ofs
xor ax,ax
mov al,cha
shl ax,3
add si,ax
mov ax,SegA000 {Calculate Offset}
mov es,ax
mov di,[y]
mov ax,di
shl ax,6
shl di,4
add di,ax
add di,[x]
mov cx,8
mov dx,03ceh
mov al,8
mov bl,[Color]
@D_L:
mov ah,[ds:si]
out dx,ax
mov ah,[es:di]
mov [es:di],bl
inc si
add di,80
dec cx
jnz @D_L
pop ds
end;
inc(x);
end;{For}
end;
Procedure Window12h(x,y,Width,Height:word;Color0,Color1,Color2:byte);
var
VidOfs : word;
ImOfs,ImSeg : word;
ScrW : word;
O0,S0,O1,S1 : word;
O2,S2,O3,S3 : word;
begin
if LastWindow12h<16 then
begin
inc(LastWindow12h);
new(WindowList12h[LastWindow12h]);
VidOfs:=(y shl 6)+(y shl 4)+x;
WindowList12h[LastWindow12h]^.VidOfs:=VidOfs;
WindowList12h[LastWindow12h]^.Width :=Width;
WindowList12h[LastWindow12h]^.Height:=Height;
ScrW:=Width*Height;
GetMem(WindowList12h[LastWindow12h]^.Plane0,ScrW);
GetMem(WindowList12h[LastWindow12h]^.Plane1,ScrW);
GetMem(WindowList12h[LastWindow12h]^.Plane2,ScrW);
GetMem(WindowList12h[LastWindow12h]^.Plane3,ScrW);
S0:=Seg(WindowList12h[LastWindow12h]^.Plane0^);
O0:=Ofs(WindowList12h[LastWindow12h]^.Plane0^);
S1:=Seg(WindowList12h[LastWindow12h]^.Plane1^);
O1:=Ofs(WindowList12h[LastWindow12h]^.Plane1^);
S2:=Seg(WindowList12h[LastWindow12h]^.Plane2^);
O2:=Ofs(WindowList12h[LastWindow12h]^.Plane2^);
S3:=Seg(WindowList12h[LastWindow12h]^.Plane3^);
O3:=Ofs(WindowList12h[LastWindow12h]^.Plane3^);
ScrW:=80-Width;
asm
push ds
mov bx,[Width]
mov cx,[Height]
mov si,[VidOfs]
mov ds,SegA000 {ds:si VideoMem}
mov dx,03ceh {Graphics Controller}
mov ax,0005h {Mode Register, Write 0, Read 0}
out dx,ax
mov di,[O3] {Read Plane 3}
mov es,[S3] {es:di ImageOfset}
mov ax,0304h {Read Plane Select}
out dx,ax
push si {Save 'Start Window in VideoMem'}
push cx
mov ax,cx {cx=Height}
@B3:
mov cx,bx {bx=Width}
rep movsb {Read 8 Pixels}
add si,[ScrW] {Goto Next Line by adding ScrWidth}
dec ax
jnz @B3
pop cx
pop si {Restore 'Start Window in VideoMem'}
mov di,[O2] {Read Plane 2}
mov es,[S2] {es:di ImageOfset}
mov ax,0204h {Read Plane Select}
out dx,ax
push si {Save 'Start Window in VideoMem'}
push cx
mov ax,cx {cx=Height}
@B2:
mov cx,bx {bx=Width}
rep movsb {Read 8 Pixels}
add si,[ScrW] {Goto Next Line by adding ScrWidth}
dec ax
jnz @B2
pop cx
pop si {Restore 'Start Window in VideoMem'}
mov di,[O1] {Read Plane 1}
mov es,[S1] {es:di ImageOfset}
mov ax,0104h {Read Plane Select}
out dx,ax
push si {Save 'Start Window in VideoMem'}
push cx
mov ax,cx {cx=Height}
@B1:
mov cx,bx {bx=Width}
rep movsb {Read 8 Pixels}
add si,[ScrW] {Goto Next Line by adding ScrWidth}
dec ax
jnz @B1
pop cx
pop si {Restore 'Start Window in VideoMem'}
mov di,[O0] {Read Plane 0}
mov es,[S0] {es:di ImageOfset}
mov ax,0004h {Read Plane Select}
out dx,ax
mov ax,cx {cx=Height}
@B0:
mov cx,bx {bx=Width}
rep movsb {Read 8 Pixels}
add si,[ScrW] {Goto Next Line by adding ScrWidth}
dec ax
jnz @B0
mov ax,0205h {Mode Register, Write Mode 2}
out dx,ax
pop ds
end;
Width:=Width shl 3;
x:=x shl 3;
Block(x,y,Width,Height,Color1);
HLine(x+1,y,Width-2,Color2);
VLine(x,y+1,Height-2,Color2);
HLine(x+1,y+Height-1,Width-1,Color0);
VLine(x+width-1,y+1,Height-1,Color0);
end;
end;
Procedure CloseWindow12h;
var
Width,Height : word;
SegWin,OfsWin : word;
OfsVid : word;
ScrW : word;
O0,S0,O1,S1 : word;
O2,S2,O3,S3 : word;
begin
if LastWindow12h>0 then
begin
Width:=WindowList12h[LastWindow12h]^.Width;
Height:=WindowList12h[LastWindow12h]^.Height;
OfsVid:=WindowList12h[LastWindow12h]^.VidOfs;
S0:=Seg(WindowList12h[LastWindow12h]^.Plane0^);
O0:=Ofs(WindowList12h[LastWindow12h]^.Plane0^);
S1:=Seg(WindowList12h[LastWindow12h]^.Plane1^);
O1:=Ofs(WindowList12h[LastWindow12h]^.Plane1^);
S2:=Seg(WindowList12h[LastWindow12h]^.Plane2^);
O2:=Ofs(WindowList12h[LastWindow12h]^.Plane2^);
S3:=Seg(WindowList12h[LastWindow12h]^.Plane3^);
O3:=Ofs(WindowList12h[LastWindow12h]^.Plane3^);
ScrW:=80-Width;
Asm
push ds
{GET OFFSET IN VIDEOMEM/MOUSEBACKUP}
mov bx,[Width]
mov cx,[Height]
mov es,SegA000
mov di,[OfsVid] {es:di Start in VideoMem}
mov dx,03ceh {Graphics Controller}
mov ax,0805h {Mode Register, Write Mode 0, Read Mode
1}
out dx,ax
mov ax,0007h {color don't care Register}
out dx,ax
mov ax,0ff08h {BitMask Register}
out dx,ax
mov dx,03c4h {Sequencer Controller}
cli
mov si,[O3]
mov ds,[S3] {ds:si Start in Memory}
mov ax,0802h {Write Plane Select,Plane 3}
out dx,ax {Write Read Plane Select}
push di {Save 'Start Window in VideoMem'}
mov ax,[Height] {Height}
@R3:
mov cx,bx {bx=Width}
rep movsb {Draw 8 Pixels}
add di,[ScrW] {Goto Next Line by adding ScrWidth}
dec ax
jnz @R3
pop di {Restore 'Start Window in VideoMem'}
mov si,[O2]
mov ds,[S2] {ds:si Start in Memory}
mov ax,0402h {Write Plane Select,Plane 2}
out dx,ax {Write Read Plane Select}
push di {Save 'Start Window in VideoMem'}
mov ax,[Height] {Height}
@R2:
mov cx,bx {bx=Width}
rep movsb {Draw 8 Pixels}
add di,[ScrW] {Goto Next Line by adding ScrWidth}
dec ax
jnz @R2
pop di {Restore 'Start Window in VideoMem'}
mov si,[O1]
mov ds,[S1] {ds:si Start in Memory}
mov ax,0202h {Write Plane Select,Plane 1}
out dx,ax {Write Read Plane Select}
push di {Save 'Start Window in VideoMem'}
mov ax,[Height] {Height}
@R1:
mov cx,bx {bx=Width}
rep movsb {Draw 8 Pixels}
add di,[ScrW] {Goto Next Line by adding ScrWidth}
dec ax
jnz @R1
pop di {Restore 'Start Window in VideoMem'}
mov si,[O0]
mov ds,[S0] {ds:si Start in Memory}
mov ax,0102h {Write Plane Select,Plane 2}
out dx,ax {Write Read Plane Select}
mov ax,[Height] {Height}
@R0:
mov cx,bx {bx=Width}
rep movsb {Draw 8 Pixels}
add di,[ScrW] {Goto Next Line by adding ScrWidth}
dec ax
jnz @R0
mov ax,0f02h {Set All Planes to write}
out dx,ax
mov dx,03ceh {Graphics Controller}
mov ax,0205h {Mode Register, Write Mode 2}
out dx,ax
sti
pop ds
end;
ScrW:=Width*Height;
FreeMem(WindowList12h[LastWindow12h]^.Plane0,ScrW);
FreeMem(WindowList12h[LastWindow12h]^.Plane1,ScrW);
FreeMem(WindowList12h[LastWindow12h]^.Plane2,ScrW);
FreeMem(WindowList12h[LastWindow12h]^.Plane3,ScrW);
Dispose(WindowList12h[LastWindow12h]);
dec(LastWindow12h);
end;
end;
Procedure SaveScreen12h;
var
O0,S0,O1,S1 : word;
O2,S2,O3,S3 : word;
begin
GetMem(ScreenGrab[0],38592);{80*480+64*3(Palet)}
GetMem(ScreenGrab[1],38400);{80*480}
GetMem(ScreenGrab[2],38400);{80*480}
GetMem(ScreenGrab[3],38400);{80*480}
S0:=Seg(ScreenGrab[0]^);
O0:=Ofs(ScreenGrab[0]^);
S1:=Seg(ScreenGrab[1]^);
O1:=Ofs(ScreenGrab[1]^);
S2:=Seg(ScreenGrab[2]^);
O2:=Ofs(ScreenGrab[2]^);
S3:=Seg(ScreenGrab[3]^);
O3:=Ofs(ScreenGrab[3]^);
asm
push ds
mov di,[O3]
mov es,[S3]
{es:di ImageOfset}
mov ds,SegA000
xor si,si
{ds:si VideoMem}
mov dx,03ceh {Graphics Controller}
mov ax,0005h {Mode Register, Write 0, Read 0}
out dx,ax
mov ax,0304h {Read Plane Select}{Plane 3}
out dx,ax
mov cx,19200
rep movsw
mov es,[S2]
mov di,[O2]
xor si,si
dec ah {Plane 2}
out dx,ax
mov cx,19200
rep movsw
mov es,[S1]
mov di,[O1]
xor si,si
dec ah {Plane 1}
out dx,ax
mov cx,19200
rep movsw
mov es,[S0]
mov di,[O0]
xor si,si
dec ah {Plane 0}
out dx,ax
mov cx,19200
rep movsw
mov dx,03ceh {Graphics Controller}
mov ax,0205h {Mode Register, Write Mode 2}
out dx,ax
mov dx,03c7h {Save Palette behind Plane 0}
mov al,0
out dx,al
mov dx,03c9h
mov cx,192 {64 Colors RxGxB starting}
rep insb
pop ds
end;
end;
Procedure RestoreScreen12h;
var
O0,S0,O1,S1 : word;
O2,S2,O3,S3 : word;
Label
C1,C2,rt1,rt2;
begin
S0:=Seg(ScreenGrab[0]^);
O0:=Ofs(ScreenGrab[0]^);
S1:=Seg(ScreenGrab[1]^);
O1:=Ofs(ScreenGrab[1]^);
S2:=Seg(ScreenGrab[2]^);
O2:=Ofs(ScreenGrab[2]^);
S3:=Seg(ScreenGrab[3]^);
O3:=Ofs(ScreenGrab[3]^);
Asm
push ds
mov dx,03c8h
mov al,0
out dx,al
inc dx
mov cx,192
C1:
out dx,al
dec cx
jnz C1
mov dx,03ceh {Graphics Controller}
mov ax,0805h {Mode Register, Write Mode 0, Read Mode 1}
out dx,ax
mov ax,0007h {color don't care Register}
out dx,ax
mov ax,0ff08h {BitMask Register}
out dx,ax
mov dx,03c4h {Sequencer Controller}
{GET OFFSET IN VIDEOMEM}
mov es,SegA000
xor di,di
{es:di Start in VideoMem}
mov si,[O3]
mov ds,[S3]
{ds:si Start in Memory}
mov ax,0802h {Write Plane Select}
out dx,ax
cli
mov cx,19200
rep movsw
xor di,di
{es:di Start in VideoMem}
mov si,[O2]
mov ds,[S2]
{ds:si Start in Memory}
mov ax,0402h {Write Plane Select}
out dx,ax
mov cx,19200
rep movsw
xor di,di
{es:di Start in VideoMem}
mov si,[O1]
mov ds,[S1]
{ds:si Start in Memory}
mov ax,0202h {Write Plane Select}
out dx,ax
mov cx,19200
rep movsw
xor di,di
{es:di Start in VideoMem}
mov si,[O0]
mov ds,[S0]
{ds:si Start in Memory}
mov ax,0102h {Write Plane Select}
out dx,ax
mov cx,19200
rep movsw
sti
mov ax,0f02h {Set All Planes to write}
out dx,ax
mov dx,03ceh {Graphics Controller}
mov ax,0205h {Mode Register, Write Mode 2}
out dx,ax
mov dx,03c8h
mov al,0
out dx,al
inc dx
mov cx,192
rep outsb
pop ds
end;
FreeMem(ScreenGrab[3],38400);{80*480}
FreeMem(ScreenGrab[2],38400);{80*480}
FreeMem(ScreenGrab[1],38400);{80*480}
FreeMem(ScreenGrab[0],38592);{80*480+64*3}
end;
begin
LastWindow12h:=0;
LoadFont;
end.
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]