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

    {
     KB> Hello.  I was wondering if someone could tell me how to read in PCX
     KB> files in Turbo Pascal using either resolution (320 X 200, 640 X 480
     KB> etc.) with 256 colours. I was using a program called clip but it does
     KB> not read PCX files that are in 256 colours.  Any help is appreciated.

    I can help you with the 320x200x256 mode.

    Here come a little program (mostly in asm) to display a PCX-image in that
    resulution.

    To load a PCX-image, use the procedure PCX_LOAD(PicName, Init), where
    PicName = Path+Filename of image to be displayed.
    Init    = Should the procedure init mode 13h before displaying the pic?

    Hope you can use this.
    }

    program PCX_LOAD;

    {$G+}

    Var
     Pic:Array [0..63999] Of Byte;
     Pcx:File;
     Read_Result:Integer;

    Procedure Load_Pcx(Name:String; Init:Boolean);
    begin
      If Init Then
       Asm
         Mov  AX, 13h
         Int  10h
       End;
       Asm
         Mov  AL, 0
         Mov  DX, 03C8h
         Out  DX, AL
         Inc  DX
         Mov  CX, 1023
    @l1: Out  DX, AL
         Loop @l1
      End;
      Assign(PCX, name);
      Reset(PCX, 1);
      BlockRead(PCX, Pic, SizeOf(Pic), Read_Result);
      Close(PCX);
      Asm
         Cld
         Mov  AX, 0A000h
         Mov  ES, AX
         Lea  BX, Pic
         Add  BX, 128
         Xor  DI, DI
         Xor  DX, DX
         Xor  AX, AX
         Xor  CX, CX
    @l2: Mov  AL, [BX]
         Inc  BX
         Cmp  AL, 0C0h
         Ja   @r1
         Stosb
         Inc  DX
         Jmp  @r3
    @r1: Sub  AL, 0C0h
         Mov  CL, AL
         Add  DX, AX
         Mov  AL, [BX]
         Inc  BX
     Rep Stosb
    @r3: Cmp  DX, 64000
         Jnz  @l2
         Inc  BX
         Mov  DX, 03C8h
         Mov  AL, 00h
         Out  DX, AL
         Inc  DX
         Mov  CX, 255
    @r4: Mov  AL, [BX]
         Shr  AL, 2
         Out  DX, AL
         Mov  AL, [BX+1]
         Shr  AL, 2
         Out  DX, AL
         Mov  AL, [BX+2]
         Shr  AL, 2
         Out  DX, AL
         Add  BX, 3
         Loop @r4
      End;
    End;

    begin
      load_pcx('D:\artpack\esilogo.PCX', True);
      Asm
       Mov AH, 000h
       Int 16h
       Mov AX, 003h
       Int 10h
      End;
    end.

    Oh, btw. this program can't handle a picture larger than 64000 bytes, but i
    hope you can find a way around that. If not, write a mail to me, and i will
    see what i can do...

    TTYL
       Allan Bang Andersen

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