mkavrreg.pp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. {
  2. Copyright (c) 1998-2002 by Peter Vreman and Florian Klaempfl
  3. Convert spreg.dat to several .inc files for usage with
  4. the Free pascal compiler
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. program mkspreg;
  12. const Version = '1.00';
  13. max_regcount = 200;
  14. var s : string;
  15. i : longint;
  16. line : longint;
  17. regcount:byte;
  18. regcount_bsstart:byte;
  19. names,
  20. regtypes,
  21. supregs,
  22. numbers,
  23. stdnames,
  24. stabs,dwarf : array[0..max_regcount-1] of string[63];
  25. regnumber_index,
  26. std_regname_index : array[0..max_regcount-1] of byte;
  27. function tostr(l : longint) : string;
  28. begin
  29. str(l,tostr);
  30. end;
  31. function readstr : string;
  32. var
  33. result : string;
  34. begin
  35. result:='';
  36. while (s[i]<>',') and (i<=length(s)) do
  37. begin
  38. result:=result+s[i];
  39. inc(i);
  40. end;
  41. readstr:=result;
  42. end;
  43. procedure readcomma;
  44. begin
  45. if s[i]<>',' then
  46. begin
  47. writeln('Missing "," at line ',line);
  48. writeln('Line: "',s,'"');
  49. halt(1);
  50. end;
  51. inc(i);
  52. end;
  53. procedure skipspace;
  54. begin
  55. while (s[i] in [' ',#9]) do
  56. inc(i);
  57. end;
  58. procedure openinc(var f:text;const fn:string);
  59. begin
  60. writeln('creating ',fn);
  61. assign(f,fn);
  62. rewrite(f);
  63. writeln(f,'{ don''t edit, this file is generated from avrreg.dat }');
  64. end;
  65. procedure closeinc(var f:text);
  66. begin
  67. writeln(f);
  68. close(f);
  69. end;
  70. procedure build_regnum_index;
  71. var h,i,j,p,t:byte;
  72. begin
  73. {Build the registernumber2regindex index.
  74. Step 1: Fill.}
  75. for i:=0 to regcount-1 do
  76. regnumber_index[i]:=i;
  77. {Step 2: Sort. We use a Shell-Metzner sort.}
  78. p:=regcount_bsstart;
  79. repeat
  80. for h:=0 to regcount-p-1 do
  81. begin
  82. i:=h;
  83. repeat
  84. j:=i+p;
  85. if numbers[regnumber_index[j]]>=numbers[regnumber_index[i]] then
  86. break;
  87. t:=regnumber_index[i];
  88. regnumber_index[i]:=regnumber_index[j];
  89. regnumber_index[j]:=t;
  90. if i<p then
  91. break;
  92. dec(i,p);
  93. until false;
  94. end;
  95. p:=p shr 1;
  96. until p=0;
  97. end;
  98. procedure build_std_regname_index;
  99. var h,i,j,p,t:byte;
  100. begin
  101. {Build the registernumber2regindex index.
  102. Step 1: Fill.}
  103. for i:=0 to regcount-1 do
  104. std_regname_index[i]:=i;
  105. {Step 2: Sort. We use a Shell-Metzner sort.}
  106. p:=regcount_bsstart;
  107. repeat
  108. for h:=0 to regcount-p-1 do
  109. begin
  110. i:=h;
  111. repeat
  112. j:=i+p;
  113. if stdnames[std_regname_index[j]]>=stdnames[std_regname_index[i]] then
  114. break;
  115. t:=std_regname_index[i];
  116. std_regname_index[i]:=std_regname_index[j];
  117. std_regname_index[j]:=t;
  118. if i<p then
  119. break;
  120. dec(i,p);
  121. until false;
  122. end;
  123. p:=p shr 1;
  124. until p=0;
  125. end;
  126. procedure read_spreg_file;
  127. var infile:text;
  128. begin
  129. { open dat file }
  130. assign(infile,'avrreg.dat');
  131. reset(infile);
  132. while not(eof(infile)) do
  133. begin
  134. { handle comment }
  135. readln(infile,s);
  136. inc(line);
  137. while (s[1]=' ') do
  138. delete(s,1,1);
  139. if (s='') or (s[1]=';') then
  140. continue;
  141. i:=1;
  142. names[regcount]:=readstr;
  143. readcomma;
  144. regtypes[regcount]:=readstr;
  145. readcomma;
  146. supregs[regcount]:=readstr;
  147. readcomma;
  148. stdnames[regcount]:=readstr;
  149. readcomma;
  150. stabs[regcount]:=readstr;
  151. readcomma;
  152. dwarf[regcount]:=readstr;
  153. { Create register number }
  154. if supregs[regcount][1]<>'$' then
  155. begin
  156. writeln('Missing $ before number, at line ',line);
  157. writeln('Line: "',s,'"');
  158. halt(1);
  159. end;
  160. numbers[regcount]:=regtypes[regcount]+'0000'+copy(supregs[regcount],2,255);
  161. if i<length(s) then
  162. begin
  163. writeln('Extra chars at end of line, at line ',line);
  164. writeln('Line: "',s,'"');
  165. halt(1);
  166. end;
  167. inc(regcount);
  168. if regcount>max_regcount then
  169. begin
  170. writeln('Error: Too much registers, please increase maxregcount in source');
  171. halt(2);
  172. end;
  173. end;
  174. close(infile);
  175. end;
  176. procedure write_inc_files;
  177. var
  178. norfile,stdfile,supfile,
  179. numfile,stabfile,dwarffile,confile,
  180. rnifile,srifile:text;
  181. first:boolean;
  182. begin
  183. { create inc files }
  184. openinc(confile,'ravrcon.inc');
  185. openinc(supfile,'ravrsup.inc');
  186. openinc(numfile,'ravrnum.inc');
  187. openinc(stdfile,'ravrstd.inc');
  188. openinc(stabfile,'ravrsta.inc');
  189. openinc(dwarffile,'ravrdwa.inc');
  190. openinc(norfile,'ravrnor.inc');
  191. openinc(rnifile,'ravrrni.inc');
  192. openinc(srifile,'ravrsri.inc');
  193. first:=true;
  194. for i:=0 to regcount-1 do
  195. begin
  196. if not first then
  197. begin
  198. writeln(numfile,',');
  199. writeln(stdfile,',');
  200. writeln(stabfile,',');
  201. writeln(dwarffile,',');
  202. writeln(rnifile,',');
  203. writeln(srifile,',');
  204. end
  205. else
  206. first:=false;
  207. writeln(supfile,'RS_',names[i],' = ',supregs[i],';');
  208. writeln(confile,'NR_'+names[i],' = ','tregister(',numbers[i],')',';');
  209. write(numfile,'tregister(',numbers[i],')');
  210. write(stdfile,'''',stdnames[i],'''');
  211. write(stabfile,stabs[i]);
  212. write(dwarffile,dwarf[i]);
  213. write(rnifile,regnumber_index[i]);
  214. write(srifile,std_regname_index[i]);
  215. end;
  216. write(norfile,regcount);
  217. close(confile);
  218. close(supfile);
  219. closeinc(numfile);
  220. closeinc(stdfile);
  221. closeinc(stabfile);
  222. closeinc(dwarffile);
  223. closeinc(norfile);
  224. closeinc(rnifile);
  225. closeinc(srifile);
  226. writeln('Done!');
  227. writeln(regcount,' registers procesed');
  228. end;
  229. begin
  230. writeln('Register Table Converter Version ',Version);
  231. line:=0;
  232. regcount:=0;
  233. read_spreg_file;
  234. regcount_bsstart:=1;
  235. while 2*regcount_bsstart<regcount do
  236. regcount_bsstart:=regcount_bsstart*2;
  237. build_regnum_index;
  238. build_std_regname_index;
  239. write_inc_files;
  240. end.