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

{
> I need to put a 64k Raw Image onto Page 0 in 320x200 X-Mode.

Well, that wasn't too hard. Faster then the following one doesn't seem
possible. Don't try to make the f_bufsize too large: it'll probably hang your
computer and it won't speed up the picture display. You could, however, set the
palette to all black when displaying the picture, and when it's ready, set the
colors of the picture correctly.

You can alter the offsets of the palette and the picture as you like. The
defaults are for the ColoRIX/EGA Paint format, converted with VPic.
}
{$a+,b-,d+,e+,f-,g+,i+,l+,n-,o-,p-,q-,r-,s+,t-,v+,x+} { tp7.0 directives }
{$m 16384,0,655360}

program putmodexpicture;
{ Display raw picture in mode-x (320x200x256x4), by Bas van Gaalen,
  fido 2:285/213.8, email bas.van.gaalen@schotman.nl, Aug. '94 }

uses
  crt,dos;                   { crt for keypressed, dos for pathstr }

const
  pal_offset=$000a;          { offset of palette in pic-file }
  pic_offset=$030a;          { offset of picture in pic-file }
  f_bufsize=4096;            { file-buffer size }
  vidseg:word=$a000;         { VGA graphics segment }

type
  errmsg=string[80];
  f_buf=array[0..f_bufsize-1] of byte;
  pal_buf=array[0..$2ff] of byte;

var
  p_file:file;

procedure error(err:errmsg); begin writeln; writeln(err); halt(1); end;

procedure setpal(c,r,g,b:byte); assembler; asm
  mov dx,3c8h; mov al,[c]; 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 setmodex; assembler; asm
  mov ax,13h; int 10h; mov dx,3c4h; mov ax,0604h; out dx,ax; mov ax,0f02h
  out dx,ax; mov cx,320*200; mov es,vidseg; xor ax,ax; mov di,ax; rep stosw
  mov dx,3d4h; mov ax,0014h; out dx,ax; mov ax,0e317h; out dx,ax; end;

procedure putpixel(offs:word; col:byte); assembler; asm
  mov dx,03c4h; mov al,2; mov cx,[offs]; and cx,3; mov ah,1; shl ah,cl
  out dx,ax; mov es,vidseg; mov ax,[offs]; shr ax,2; mov di,ax
  mov al,[col]; mov [es:di],al; end;

procedure retrace; assembler; asm
  mov dx,3dah; @vert1: in al,dx; test al,8; jz @vert1
  @vert2: in al,dx; test al,8; jnz @vert2; end;

procedure initfile(filename:pathstr);
begin
  if filename='' then error('Enter raw-picture filename on commandline.');
  assign(p_file,filename);
  {$i-} reset(p_file,1); {$i+}
  if ioresult<>0 then error(fexpand(filename)+' not found.');
end;

procedure initpal;
var buf:pal_buf; c:word; i:byte;
begin
  seek(p_file,pal_offset);
  blockread(p_file,buf,$300);
  setmodex;
  c:=0;
  for i:=0 to 255 do begin
    setpal(i,buf[c],buf[c+1],buf[c+2]);
    inc(c,3);
  end;
end;

procedure displaypic;
var buf:f_buf; i,bufidx:word; nofread:integer;
begin
  bufidx:=0;
  repeat
    blockread(p_file,buf,f_bufsize,nofread);
    for i:=0 to nofread do putpixel(bufidx+i,buf[i]);
    inc(bufidx,nofread);
  until nofread<>f_bufsize;
  close(p_file);
end;

var dummy:byte;
begin
  initfile(paramstr(1));
  initpal;
  port[$03c0]:=0; { screen blanck }
  displaypic;
  retrace; dummy:=port[$03da]; port[$03c0]:=32; { show screen }
  repeat until keypressed;
  asm mov ax,3; int 10h; end;
end.


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