mk68kreg.pp 7.6 KB

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