2
0

mk68kreg.pp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  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. gasnames,
  25. stabs : array[0..max_regcount-1] of string[63];
  26. regnumber_index,
  27. std_regname_index,gas_regname_index : array[0..max_regcount-1] of byte;
  28. function tostr(l : longint) : string;
  29. begin
  30. str(l,tostr);
  31. end;
  32. function readstr : string;
  33. var
  34. result : string;
  35. begin
  36. result:='';
  37. while (s[i]<>',') and (i<=length(s)) do
  38. begin
  39. result:=result+s[i];
  40. inc(i);
  41. end;
  42. readstr:=result;
  43. end;
  44. procedure readcomma;
  45. begin
  46. if s[i]<>',' then
  47. begin
  48. writeln('Missing "," at line ',line);
  49. writeln('Line: "',s,'"');
  50. halt(1);
  51. end;
  52. inc(i);
  53. end;
  54. procedure skipspace;
  55. begin
  56. while (s[i] in [' ',#9]) do
  57. inc(i);
  58. end;
  59. procedure openinc(var f:text;const fn:string);
  60. begin
  61. writeln('creating ',fn);
  62. assign(f,fn);
  63. rewrite(f);
  64. writeln(f,'{ don''t edit, this file is generated from m68kreg.dat }');
  65. end;
  66. procedure closeinc(var f:text);
  67. begin
  68. writeln(f);
  69. close(f);
  70. end;
  71. procedure build_regnum_index;
  72. var h,i,j,p,t:byte;
  73. begin
  74. {Build the registernumber2regindex index.
  75. Step 1: Fill.}
  76. for i:=0 to regcount-1 do
  77. regnumber_index[i]:=i;
  78. {Step 2: Sort. We use a Shell-Metzner sort.}
  79. p:=regcount_bsstart;
  80. repeat
  81. for h:=0 to regcount-p-1 do
  82. begin
  83. i:=h;
  84. repeat
  85. j:=i+p;
  86. if numbers[regnumber_index[j]]>=numbers[regnumber_index[i]] then
  87. break;
  88. t:=regnumber_index[i];
  89. regnumber_index[i]:=regnumber_index[j];
  90. regnumber_index[j]:=t;
  91. if i<p then
  92. break;
  93. dec(i,p);
  94. until false;
  95. end;
  96. p:=p shr 1;
  97. until p=0;
  98. end;
  99. procedure build_std_regname_index;
  100. var h,i,j,p,t:byte;
  101. begin
  102. {Build the registernumber2regindex index.
  103. Step 1: Fill.}
  104. for i:=0 to regcount-1 do
  105. std_regname_index[i]:=i;
  106. {Step 2: Sort. We use a Shell-Metzner sort.}
  107. p:=regcount_bsstart;
  108. repeat
  109. for h:=0 to regcount-p-1 do
  110. begin
  111. i:=h;
  112. repeat
  113. j:=i+p;
  114. if stdnames[std_regname_index[j]]>=stdnames[std_regname_index[i]] then
  115. break;
  116. t:=std_regname_index[i];
  117. std_regname_index[i]:=std_regname_index[j];
  118. std_regname_index[j]:=t;
  119. if i<p then
  120. break;
  121. dec(i,p);
  122. until false;
  123. end;
  124. p:=p shr 1;
  125. until p=0;
  126. end;
  127. procedure build_gas_regname_index;
  128. var h,i,j,p,t:byte;
  129. begin
  130. {Build the registernumber2regindex index.
  131. Step 1: Fill.}
  132. for i:=0 to regcount-1 do
  133. gas_regname_index[i]:=i;
  134. {Step 2: Sort. We use a Shell-Metzner sort.}
  135. p:=regcount_bsstart;
  136. repeat
  137. for h:=0 to regcount-p-1 do
  138. begin
  139. i:=h;
  140. repeat
  141. j:=i+p;
  142. if gasnames[gas_regname_index[j]]>=gasnames[gas_regname_index[i]] then
  143. break;
  144. t:=gas_regname_index[i];
  145. gas_regname_index[i]:=gas_regname_index[j];
  146. gas_regname_index[j]:=t;
  147. if i<p then
  148. break;
  149. dec(i,p);
  150. until false;
  151. end;
  152. p:=p shr 1;
  153. until p=0;
  154. end;
  155. procedure read_spreg_file;
  156. var infile:text;
  157. begin
  158. { open dat file }
  159. assign(infile,'m68kreg.dat');
  160. reset(infile);
  161. while not(eof(infile)) do
  162. begin
  163. { handle comment }
  164. readln(infile,s);
  165. inc(line);
  166. while (s[1]=' ') do
  167. delete(s,1,1);
  168. if (s='') or (s[1]=';') then
  169. continue;
  170. i:=1;
  171. names[regcount]:=readstr;
  172. readcomma;
  173. regtypes[regcount]:=readstr;
  174. readcomma;
  175. supregs[regcount]:=readstr;
  176. readcomma;
  177. stdnames[regcount]:=readstr;
  178. readcomma;
  179. gasnames[regcount]:=readstr;
  180. readcomma;
  181. stabs[regcount]:=readstr;
  182. { Create register number }
  183. if supregs[regcount][1]<>'$' then
  184. begin
  185. writeln('Missing $ before number, at line ',line);
  186. writeln('Line: "',s,'"');
  187. halt(1);
  188. end;
  189. numbers[regcount]:=regtypes[regcount]+'0000'+copy(supregs[regcount],2,255);
  190. if i<length(s) then
  191. begin
  192. writeln('Extra chars at end of line, at line ',line);
  193. writeln('Line: "',s,'"');
  194. halt(1);
  195. end;
  196. inc(regcount);
  197. if regcount>max_regcount then
  198. begin
  199. writeln('Error: Too much registers, please increase maxregcount in source');
  200. halt(2);
  201. end;
  202. end;
  203. close(infile);
  204. end;
  205. procedure write_inc_files;
  206. var
  207. norfile,stdfile,gasfile,supfile,
  208. numfile,stabfile,confile,
  209. rnifile,srifile,grifile:text;
  210. first:boolean;
  211. begin
  212. { create inc files }
  213. openinc(confile,'r68kcon.inc');
  214. openinc(supfile,'r68ksup.inc');
  215. openinc(numfile,'r68knum.inc');
  216. openinc(stdfile,'r68kstd.inc');
  217. openinc(gasfile,'r68kgas.inc');
  218. openinc(stabfile,'r68ksta.inc');
  219. openinc(norfile,'r68knor.inc');
  220. openinc(rnifile,'r68krni.inc');
  221. openinc(srifile,'r68ksri.inc');
  222. openinc(grifile,'r68kgri.inc');
  223. first:=true;
  224. for i:=0 to regcount-1 do
  225. begin
  226. if not first then
  227. begin
  228. writeln(numfile,',');
  229. writeln(stdfile,',');
  230. writeln(gasfile,',');
  231. writeln(stabfile,',');
  232. writeln(rnifile,',');
  233. writeln(srifile,',');
  234. writeln(grifile,',');
  235. end
  236. else
  237. first:=false;
  238. writeln(supfile,'RS_',names[i],' = ',supregs[i],';');
  239. writeln(confile,'NR_'+names[i],' = ','tregister(',numbers[i],')',';');
  240. write(numfile,'tregister(',numbers[i],')');
  241. write(stdfile,'''',stdnames[i],'''');
  242. write(gasfile,'''',gasnames[i],'''');
  243. write(stabfile,stabs[i]);
  244. write(rnifile,regnumber_index[i]);
  245. write(srifile,std_regname_index[i]);
  246. write(grifile,gas_regname_index[i]);
  247. end;
  248. write(norfile,regcount);
  249. close(confile);
  250. close(supfile);
  251. closeinc(numfile);
  252. closeinc(stdfile);
  253. closeinc(gasfile);
  254. closeinc(stabfile);
  255. closeinc(norfile);
  256. closeinc(rnifile);
  257. closeinc(srifile);
  258. closeinc(grifile);
  259. writeln('Done!');
  260. writeln(regcount,' registers procesed');
  261. end;
  262. begin
  263. writeln('Register Table Converter Version ',Version);
  264. line:=0;
  265. regcount:=0;
  266. read_spreg_file;
  267. regcount_bsstart:=1;
  268. while 2*regcount_bsstart<regcount do
  269. regcount_bsstart:=regcount_bsstart*2;
  270. build_regnum_index;
  271. build_std_regname_index;
  272. build_gas_regname_index;
  273. write_inc_files;
  274. end.