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

{ here's a unit to view PCX-files in 320x200x256 }

UNIT PCX;

INTERFACE

USES crt;

PROCEDURE DoPCXPalette;
FUNCTION LoadPCX  (Filename:String; Where:Word):Boolean;
  { Load a PCX file to the screen "where"
    Dopal = True sets up the correct PCX pallette, otherwise it leaves
            the pallette alone }

VAR Palette: ARRAY[0..767] OF Byte;
    loop1:Word;
IMPLEMENTATION


PROCEDURE DoPal(Col,R,G,B : Byte); ASSEMBLER; ASM
   mov    dx,3c8h
   mov    al,[col]
   out    dx,al
   inc    dx
   mov    al,[r]
   out    dx,al
   mov    al,[g]
   out    dx,al
   mov    al,[b]
   out    dx,al
END;

PROCEDURE DoPCXPalette;
BEGIN
  FOR loop1:=0 TO 255 DO
      DoPal (loop1,palette[loop1*3] shr 2,palette[loop1*3+1] shr 2,
            palette[loop1*3+2] shr 2);
END;

FUNCTION LoadPCX (Filename:String; Where:Word):Boolean; VAR f:File;
    Res:Word;
    Temp:Pointer;
BEGIN
    Assign (f,Filename);
    Reset (f,1);
    Seek(f,FileSize(f)-768);
    BlockRead(f,Palette,768);
    Seek(f,128);
    GetMem (Temp,65535);
    BlockRead (f,Temp^,65535,Res);
  ASM
    push ds
    mov  ax,where
    mov  es,ax
    xor  di,di
    xor  ch,ch
    lds  si,temp
@Loop1 :
    lodsb
    mov  bl,al
    and  bl,$c0
    cmp  bl,$c0
    jne  @Single

    mov  cl,al
    and  cl,$3f
    lodsb
    rep  stosb
    jmp  @Fin
@Single :
    stosb
@Fin :
    cmp  di,63999
    jbe  @Loop1
    pop  ds
  END;
  FreeMem (Temp,65535);
  Close (f);
END;

BEGIN

END.

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