home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol270 / rel2pas.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1986-05-22  |  5.5 KB  |  247 lines

  1. { REL to TURBO PASCAL inline code by K.Nakazato
  2.                          Ver. 1.0  Dec. 7, 1984 }
  3.  
  4. const
  5.   size=$1FFF;
  6.   a_type=0;
  7.   b_type=1;
  8.   e_type=2;
  9.   p_type=3;
  10. type
  11.   linetype=string[20];
  12.   hextype=string[2];
  13.   labeltype=string[6];
  14.   link=^item;
  15.   item=record
  16.          next:link;
  17.          addr:integer;
  18.          name:labeltype
  19.        end;
  20. var
  21.   code,ref:array [0..size] of byte;
  22.   rel_code:array [0.. 127] of byte;
  23.   r_name  :array [0.. 127] of labeltype;
  24.   p_size:integer;
  25.   bit_,b_count,r_count:byte;
  26.   root:link;
  27.   infile :file;
  28.   outfile:text;
  29.  
  30. procedure error(line:linetype);
  31. begin
  32.   writeln('error:',line); halt
  33. end;
  34.  
  35. procedure read_rel;
  36. begin
  37.   blockread(infile,rel_code,1); b_count:=0
  38. end;
  39.  
  40. procedure init;
  41. var
  42.   i,j,len:integer;
  43.   comline:string[127] absolute $80;
  44.   inname,outname:linetype;
  45.  
  46. function get_name(var name:linetype):boolean;
  47. begin
  48.   while (comline[i] =' ') and (i<=len) do i:=i+1;
  49.   name:='';
  50.   while (comline[i]<>' ') and (i<=len) do
  51.     begin name:=name+comline[i]; i:=i+1 end;
  52.   get_name:=(length(name)=0)
  53. end;
  54.  
  55. begin
  56.   bit_:=128;
  57.   i:=1; len:=length(comline);
  58.   if get_name(inname) then
  59.     begin
  60.       writeln('Transform relocatable code to Pascal inline code');
  61.       writeln('usage: >rel2pas relocatable_file_name [inline_file_name]');
  62.       writeln('  When inline_file_name is absent, the same file name as');
  63.       writeln('  relocatable_file_name with extension "INC" is assumed.');
  64.       halt
  65.     end;
  66.   j:=pos('.',inname); if j>0 then inname[0]:=chr(j-1);
  67.   if get_name(outname) then outname:=inname+'.inc';
  68.   assign(infile,inname+'.rel');
  69.   {$I-} reset(infile); {$I+}
  70.   if ioresult<>0 then error('file can''t open');
  71.   read_rel; assign(outfile,outname)
  72. end;
  73.  
  74. function get_bit(x:integer):integer;
  75.  
  76. function get_1bit:integer;
  77. begin
  78.   if (rel_code[b_count] and bit_)=0 then get_1bit:=0 else get_1bit:=1;
  79.   bit_:=bit_ shr 1;
  80.   if bit_=0 then
  81.     begin
  82.       b_count:=b_count+1;
  83.       if b_count=128 then read_rel;
  84.       bit_:=128
  85.     end
  86. end;
  87.  
  88. var val,i:integer;
  89. begin
  90.   val:=0;
  91.   for i:=1 to x do val:=val shl 1+get_1bit;
  92.   get_bit:=val
  93. end;
  94.  
  95. procedure hex(x:integer; var h:hextype);
  96.  
  97. procedure hex1(x:integer);
  98. begin
  99.   if x>9 then x:=x+55 else x:=x+48;
  100.   h:=h+chr(x)
  101. end;
  102.  
  103. begin
  104.   h:=''; hex1(x shr 4); hex1(x and $F)
  105. end;
  106.  
  107. procedure afield(var t,k:integer);
  108. begin
  109.   t:=get_bit(2);
  110.   k:=get_bit(8)+256*get_bit(8)
  111. end;
  112.  
  113. procedure bfield(var label_:labeltype);
  114. var i,t,c:integer;
  115. begin
  116.   label_:=''; t:=get_bit(3);
  117.   for i:=1 to t do
  118.     begin
  119.       c:=get_bit(8);
  120.       if (c>=ord('A')) and (c<=ord('Z')) then c:=c-ord('A')+ord('a');
  121.       label_:=label_+chr(c)
  122.     end
  123. end;
  124.  
  125. procedure special(var flag:boolean);
  126. var k,t:integer; p,q:link; label_:labeltype;
  127. begin
  128.   case get_bit(4) of
  129.     0..3:bfield(label_);
  130.     5:error('common size');
  131.     6:begin
  132.         afield(t,k); bfield(label_);
  133.         if t=1 then
  134.           begin
  135.             repeat
  136.               t:=ref[k];
  137.               ref[k]:=e_type;
  138.               ref[k+1]:=r_count;
  139.               k:=code[k]+256*code[k+1]
  140.             until t=a_type;
  141.             r_name[r_count]:=label_;
  142.             r_count:=r_count+1
  143.           end
  144.       end;
  145.     7:begin
  146.         afield(t,k); bfield(label_);
  147.         if t=1 then
  148.           begin
  149.             p:=root; while p^.next^.addr<k do p:=p^.next;
  150.             new(q); q^.addr:=k; q^.name:=label_;
  151.             q^.next:=p^.next; p^.next:=q
  152.           end
  153.       end;
  154.     9 :error('external offset');
  155.     10:begin afield(t,k); if k<>0 then error('data area size') end;
  156.     11:begin afield(t,k); if t<>1 then error('set loc counter') end;
  157.     12:afield(t,k);
  158.     13:afield(t,p_size);
  159.     14:flag:=false;
  160.   end
  161. end;
  162.  
  163. procedure input;
  164. var k:integer; flag:boolean;
  165. begin
  166.   new(root); new(root^.next);
  167.   root^.next^.next:=nil;
  168.   root^.next^.addr:=maxint;
  169.   r_count:=0; k:=0; flag:=true;
  170.   while flag do
  171.     case get_bit(1) of
  172.       0:begin
  173.           ref [k]:=a_type;
  174.           code[k]:=get_bit(8);
  175.           k:=k+1
  176.         end;
  177.       1:case get_bit(2) of
  178.           0:special(flag);
  179.           1:begin
  180.               ref[k]:=p_type;
  181.               code[k]:=get_bit(8);
  182.               k:=k+1;
  183.               code[k]:=get_bit(8);
  184.               k:=k+1
  185.             end;
  186.           else error('relative');
  187.         end
  188.     end;
  189.   close(infile)
  190. end;
  191.  
  192. procedure output;
  193. var i,k,l:integer; p:link; h:hextype;
  194. begin
  195.   p:=root^.next;
  196.   rewrite(outfile);
  197.   k:=0; l:=0;
  198.   while k<p_size do
  199.     begin
  200.       if k=p^.addr then
  201.         begin
  202.           if k>0 then
  203.             begin
  204.               writeln(outfile,')');
  205.               writeln(outfile,'end;');
  206.               writeln(outfile)
  207.             end;
  208.           l:=0;
  209.           writeln(outfile,'procedure ',p^.name,';');
  210.           writeln(outfile,'begin');
  211.           write(outfile,'  inline ( ');
  212.           p:=p^.next
  213.         end;
  214.       if l>=8 then
  215.         begin
  216.           l:=0;
  217.           writeln(outfile,'/');
  218.           write(outfile,' ':11)
  219.         end;
  220.       if l>0 then write(outfile,'/ ');
  221.       case ref[k] of
  222.         a_type:begin
  223.                  hex(code[k],h);
  224.                  write(outfile,'$',h)
  225.                end;
  226.         e_type:begin
  227.                  k:=k+1;
  228.                  write(outfile,r_name[ref[k]])
  229.                end;
  230.         p_type:begin
  231.                  i:=code[k]+256*code[k+1]-k;
  232.                  write(outfile,'*');
  233.                  if      i>0 then write(outfile,'+',i:0)
  234.                  else if i<0 then write(outfile,i:0);
  235.                  k:=k+1
  236.                end;
  237.       end;
  238.       k:=k+1; l:=l+1
  239.     end;
  240.   writeln(outfile,')'); writeln(outfile,'end;');
  241.   close(outfile)
  242. end;
  243.  
  244. begin
  245.   init; input; output
  246. end.
  247.