{=========================================================================== Date: 08-23-93 (08:26) From: NORMAN YEN Subj: RE: .PCX AND COMM ROUTINE --------------------------------------------------------------------------- MB> I heard something in this echo about someone having Pascal source to MB> view .PCX MB> files and I would appreciate if they would re-post the source if it's MB> not too MB> long or tell me where I can get it. I am also looking for some good MB> COMM routines for Pascal, anyone have any or no where I can get some? The routine I have will only work with 320x200x256c images. Hope it helps! Norman { For all those Pascal programmers who just want something simple to display a 320x200x256 colour PCX file on the screen here it is. This was a direct translation from the C source code of PCXVIEW written by Lee Hamel (Patch), Avalanche coder. I removed the inline assembly code so that you beginners can see what was going on behind those routines. Norman Yen Infinite Dreams BBS August 11, 1993 } type pcxheader_rec=record manufacturer: byte; version: byte; encoding: byte; bits_per_pixel: byte; xmin, ymin: word; xmax, ymax: word; hres: word; vres: word; palette: array [0..47] of byte; reserved: byte; colour_planes: byte; bytes_per_line: word; palette_type: word; filler: array [0..57] of byte; end; var header: pcxheader_rec; width, depth: word; bytes: word; palette: array [0..767] of byte; f: file; c: byte; procedure Read_PCX_Line(vidoffset: word); var c, run: byte; n: integer; w: word; begin n:=0; while (n < bytes) do begin blockread (f, c, 1); { if it's a run of bytes field } if ((c and 192)=192) then begin { and off the high bits } run:=c and 63; { get the run byte } blockread (f, c, 1); n:=n+run; for w:=0 to run-1 do begin mem [$a000:vidoffset]:=c; inc (vidoffset); end; end else begin n:=n+1; mem [$a000:vidoffset]:=c; inc (vidoffset); end; end; end; procedure Unpack_PCX_File; var i: integer; begin for i:=0 to 767 do palette [i]:=palette [i] shr 2; asm mov ax,13h int 10h mov ax,1012h xor bx,bx mov cx,256 mov dx,offset palette int 10h end; for i:=0 to depth-1 do Read_PCX_Line (i*320); asm xor ax,ax int 16h mov ax,03h int 10h end; end; begin if (paramcount > 0) then begin assign (f, paramstr (1)); reset (f,1); blockread (f, header, sizeof (header)); if (header.manufacturer=10) and (header.version=5) and (header.bits_per_pixel=8) and (header.colour_planes=1) then begin seek (f, filesize (f)-769); blockread (f, c, 1); if (c=12) then begin blockread (f, palette, 768); seek (f, 128); width:=header.xmax-header.xmin+1; depth:=header.ymax-header.ymin+1; bytes:=header.bytes_per_line; Unpack_PCX_File; end else writeln ('Error reading palette.'); end else writeln ('Not a 256 colour PCX file.'); close (f); end else writeln ('No file name specified.'); end.