uses vbios,utils,{$ifndef unix}crt{$else}xcrt{$endif};

type
 tp=array[0..3,0..63,0..7] of byte;
 tph=array[0..3,0..31,0..3] of byte;

var
 buf:array[0..4095] of byte;
 p:tp;
 ph:tph;

 e:file;
 f:file of tp;
 g:file of tph;

 s:string;
 i,j,n,k,l,m,x,z:word;

procedure showp(x,y,n:word);
var
 p:tp;
 i,j,o:word;
begin
 seek(f,n);
 read(f,p);
 o:=y*80+x div 8;
 for i:=0 to 3 do begin
  port[$3c4]:=2;
  port[$3c5]:=1 shl i;
  for j:=0 to 63
  do move(p[i,j],mem[$a000:o+j*80],8);
 end;
 port[$3c4]:=2;
 port[$3c5]:=$f;
end;

procedure showph(x,y,n:word);
var
 ph:tph;
 i,j,o:word;
begin
 seek(g,n);
 read(g,ph);
 o:=y*80+x div 8;
 for i:=0 to 3 do begin
  port[$3c4]:=2;
  port[$3c5]:=1 shl i;
  for j:=0 to 31
  do move(ph[i,j],mem[$a000:o+j*80],4);
 end;
 port[$3c4]:=2;
 port[$3c5]:=$f;
end;

begin
 directvideo:=false;
 s:=paramstr(1);
 if (paramcount<>3)and(paramcount<>1)or(pos('?',s)<>0)or(pos('.',s)<>0)
 then begin
  writeln('Raw2DBG DBGfile [rawfile pos#]');
  writeln('DBGfile mut be in directory, sepecified without ".DBG"');
  writeln('pos# must be in 0..312');
  halt(1);
 end;
 assign(f,s+'.DBG');
 assign(g,s+'.DBH');
 if paramcount=1 then begin
  windmax:=29*256+79;
  reset(f);
  reset(g);
  setvideomode($12);
  for n:=0 to 10 do begin
   for i:=0 to 5 do begin
    for j:=0 to 4 do begin
     k:=n*5*6+i*5+j;
     if k>312 then k:=312;
     showp(j*128,i*80,k);
     showph(j*128+64+16,i*80+16,k);
     writex(j*16+10,i*5+1,$f,strg(k))
    end;
   end;
   readln;
  end;
 end else begin
  s:=paramstr(3);
  val(s,z,integer(k));
  if (k<>0)or(z>312) then begin
   writeln('format failure in pos#');
   halt;
  end;
  {$i-}
  reset(f);
  {$i+}
  if ioresult<>0 then begin
   rewrite(f);
   rewrite(g);
   fillchar(buf,sizeof(buf),0);
   for i:=0 to 312 do write(f,tp((@buf)^));
   for i:=0 to 312 do write(g,tph((@buf)^));
  end else reset(g);
  assign(e,paramstr(2));
  reset(e,1);
  blockread(e,buf,80);
  blockread(e,buf,4096);
  fillchar(p,sizeof(p),0);
  for n:=0 to 3 do begin
   for i:=0 to 63 do for j:=0 to 7 do begin
    p[n,i,j]:=0;
    for k:=0 to 7 do p[n,i,j]:=p[n,i,j]*2 or((buf[i*64+j*8+k]shr n)and 1);
   end;
  end;
  seek(f,z);
  write(f,p);
  for n:=0 to 3 do for i:=0 to 31 do for j:=0 to 3 do begin
   randseed:=0;
   k:=((p[n,i*2  ,j*2])shl 8) or ((p[n,i*2  ,j*2+1]));
   l:=((p[n,i*2+1,j*2])shl 8) or ((p[n,i*2+1,j*2+1]));
   m:=0;
   for x:=0 to 7
   do if (k shr(2*x))and 1+(k shr(2*x+1))and 1+
	 (l shr(2*x))and 1+(l shr(2*x+1))and 1+1>2
   then m:=m or 1 shl x;
   ph[n,i,j]:=m;
  end;
  seek(g,z);
  write(g,ph);
 end;
 if videomode=$12 then setvideomode(3);
 textattr:=textattr and $7f;
 writeln('OK');
end.