[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{
Here's some code for SWAG to dump the current mode $13 screen to a PCX file.
Feel free to use/modify, just give credit. Also, if you do a good mod of it
(ie, A mode X version, faster compression, whatever), I'd love to see it.
Reference: Bit-Mapped Graphics (2nd Edition)
Steve Rimmer
ISBN 0-8306-4209-9
(C code but still pretty useful)
PCX is of course (tm) Z-Soft Corp.
Copyright 1995 Kevin M. Luck
}
Unit SavePCX;
Interface
Uses Dos,CRT;
Procedure Save_PCX (FN : String);
Implementation
Procedure Save_PCX (FN : String);
Var
F : File;
Ln : Byte;
Procedure Write_Header;
Const
OldPal : Array [1..48] of Byte = (0,0,0,216,152,56,120,116,4,112,108,4,236,
172,76,248,196,128,64,36,36,36,40,20,248,
188,104,212,144,156,60,36,36,116,112,8,
120,116,8,124,120,8,52,48,4,240,196,136);
Var
B,L : Byte;
I : Integer;
Begin
B := 10; (* Manufacturer *)
BlockWrite (F,B,1);
B := 5; (* Version *)
BlockWrite (F,B,1);
B := 1; (* Encoding *)
BlockWrite (F,B,1);
B := 8; (* Bytes Per Pixel *)
BlockWrite (F,B,1);
I := 0; (* Min X *)
BlockWrite (F,I,2);
I := 0; (* Min Y *)
BlockWrite (F,I,2);
I := 319; (* Max X *)
BlockWrite (F,I,2);
I := 199; (* Max Y *)
BlockWrite (F,I,2);
I := 320; (* Horizontal Resolution *)
BlockWrite (F,I,2);
I := 200; (* Vertical Resolution *)
BlockWrite (F,I,2); (* Default Palette *)
BlockWrite (F,Mem [Seg (OldPal):Ofs (OldPal)],48);
B := 0; (* Reserved *)
BlockWrite (F,B,1);
B := 1; (* Color Planes *)
BlockWrite (F,B,1);
I := 320; (* Bytes Per Line *)
BlockWrite (F,I,2);
I := 0; (* Palette Type *)
BlockWrite (F,I,2);
B := 0;
For L := 1 to 58 Do BlockWrite (F,B,1);
End;
Procedure Encode_Line (Ln : Byte);
Var
B : Array [1..64] of Byte;
I,J,T : Word;
A : Byte;
P : Array [0..319] of Byte;
Begin
I := 0;
J := 0;
T := 0;
Move (Mem [$a000:Ln * 320],P,320);
While T < 320 Do
Begin
I := 0;
While ((P [T + I] = P [T + I + 1]) And ((T + I) < 320) And (I < 63)) Do
Inc (I);
If I > 0 Then
Begin
A := I Or 192;
BlockWrite (F,A,1);
BlockWrite (F,P [T],1);
Inc (T,I);
Inc (J,2);
End
Else Begin
If (((P [T]) And 192) = 192) Then
Begin
A := 193;
BlockWrite (F,A,1);
Inc (J);
End;
BlockWrite (F,P [T],1);
Inc (T);
Inc (J);
End;
End;
End;
Procedure Write_Palette;
Var
L,R,G,B : Byte;
Procedure GetPal (ColorNo : Byte; Var R,G,B : Byte);
Begin
Port [$3c7] := ColorNo;
R := Port [$3c9];
G := Port [$3c9];
B := Port [$3c9];
End;
Begin
L := 12;
BlockWrite (F,L,1);
For L := 0 to 255 Do
Begin
GetPal (L,R,G,B);
R := R * 4;
G := G * 4;
B := B * 4;
BlockWrite (F,R,1);
BlockWrite (F,G,1);
BlockWrite (F,B,1);
End;
End;
Begin
Assign (F,FN);
{$I-}
Rewrite (F,1);
{$I+}
Write_Header;
For Ln := 0 to 199 Do Encode_Line (Ln);
Write_Palette;
Close (F);
End;
End.
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]