mk68kreg.pp 7.6 KB

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