[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]

    {
    With this program you can view monocrome pcx files, smaller than 60KB. It
    will only work on VGA cards.

    A Program to view monocrome PCX files

    A MacSoft production in 1994 by Andreas Oestlund
    }
    Type
        TPCX_Header = Record
                            Manufacturer   : Byte;                {always A0h }
                            Version        : Byte;                {version }
                            Encoding       : Byte;                {always 1}
                            Bits_Per_Pixel : Byte;                {color bits}
                            XMin,YMin      : Word;                {image origin}
                            XMax,YMax      : Word;                {dimensions}
                            HRes           : Word;                {resolution val}
                            VRes           : Word;                {}
                            Palette        : Array[1..48] Of Byte;{palette}
                            Reserved       : Byte;                {}
                            Color_Planes   : Byte;                {color planes}
                            Bytes_Per_Line : Word;                {line buffer
    size}                        Palette_Type   : Word;                {gray or
    color pal}                        Filler         : Array[1..58] Of Byte;{}
                      End;

        TPCXData    = Array[1..60000] Of Byte;

    Procedure SetMode (m : Byte); Assembler;
         Asm
              Mov  AH, 0
              Mov  AL, m
              Int  10h
         End;

    Var
       Header     : TPCX_Header;
       F          : File;
       B,C        : Byte;
       Line_Table : Array[0..479] Of Word;
       PcxData    : ^TPcxData;

       Width,
       Height,
       Bytes_Per_Line : Word;

       NuRead         : Word;

    Procedure Decode_PCX_Line (l : Word);
    Var
       i,j      : Word;

    Const
         Data_NDX : Word = 0;

         Begin
              i := 0;
              While i < Bytes_Per_Line Do
                  Begin
                       Inc (Data_NDX);
                       B := PcxData^[Data_NDX];

                       If (B And $C0) = $C0 Then
                        Begin
                             B := B And $3F;

                             Inc (Data_NDX);
                             C := PcxData^[Data_NDX];
                             For j := 1 To B Do
                               Begin
                                    Mem[$A000:Line_Table[l]+i] := C;
                                    Inc (i);
                               End;
                        End
                       Else
                           Begin
                                Mem[$A000:Line_Table[l]+i] := B;
                                Inc (i);
                           End;
                  End;
         End;

    Var
       i : Word;
       Mem2Get : Word;

    Begin
         If Paramcount = 0 then HALT;
         Assign (F,ParamStr(1));
         Reset (F,1);

         BlockRead (F,Header,SizeOf(TPCX_Header));
         Width  := (Header.XMax - Header.XMax)+1;
         Height := (Header.YMax - Header.YMin)+1;
         Bytes_Per_Line := Header.Bytes_Per_Line;
         For i := 0 To 479 Do Line_Table[i] := i*80;

         Mem2Get := FileSize(F) - FilePos(F);
         GetMem (PcxData,Mem2Get);
         BlockRead (F,PcxData^,60000,NuRead);

         SetMode ($12);

         For i := 0 To (Height-1) Do Decode_PCX_Line (i);

         Readln;

         FreeMem (PcxData,Mem2Get);
         SetMode (3);
         Close (F);
    End.

[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]