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

    Program Display;

    Uses Crt;

    procedure loadpcx(fname:string);
    var f             : file ;
        buf           : array[1..16] of byte;
        pcxdata,palet : pointer ;
        pcxlen        : word;

    begin
       assign(f,fname);
       {$I-}
       reset(f,1);
       if ioresult<>0 then exit; { couldnt open file}
       blockread(f,buf,16);
       if ioresult<>0 then exit; { Read error }
       if buf[1]<>$0a then exit;  {no pcx file}
       if (buf[2]<>5) or (buf[4]<>8) then exit; {no 256 colors}
       if (buf[13]<>$40) or (buf[14]<>$01) or (buf[15]<>$c8) or (buf[16]<>0)
       then Exit;

       pcxlen:=filesize(f)-128-768;
       getmem(pcxdata,pcxlen);
       seek(f,128);
       blockread(f,pcxdata^,pcxlen);
       if ioresult<>0 then exit;
       {$I+}
    {---- read body ----}
       asm
         push ds
         Mov DI,$A000
         Mov ES,DI
         And Di,0
         lds si,pcxdata
         mov bx,di
         add bx,64000
    @nextpcxbyte:
         mov al,[si]
         inc si
         mov cl,al
         and cl,$c0
         cmp cl,$c0
         je @herhaling
         mov cl,1
    @verder:
         rep stosb
         cmp di,bx
         je @end
         jmp @nextpcxbyte
    @herhaling:
         mov cl,al
         and cl,$3f
         mov al,[si] ; inc si
         jmp @verder
    @end: pop ds
       end;

    {-------- read palette --------}
          seek(f,filesize(f)-768);
          GetMem(palet,768);
          blockread(f,palet^,768);
          if ioresult<>0 then exit;
          asm
            les di,palet
               mov ax,768
            mov cl,2
           @1:
            shr es:[di],cl
            inc di
            dec ax
               jnz @1
            mov ax,$1012
            mov bx,0
            mov cx,255;
            les dx,palet
            int $10
          end;
       close(f);
    end;

    Begin

      Asm Mov AX,$13; Int $10 End;

      IF Paramcount > 0 THEN
         BEGIN
         LoadPcx(ParamStr(1));
         ReadLn;
         END;

      Asm Mov AX,$3; Int $10 End;

    End.

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