mk68kreg.pp 7.4 KB

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