mk68kreg.pp 7.1 KB

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