mkppcreg.pp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Peter Vreman and Florian Klaempfl
  4. Convert ppcreg.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 mkppcreg;
  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. numbers,
  23. stdnames,
  24. motnames,
  25. stabs : array[0..max_regcount-1] of string[63];
  26. regnumber_index,
  27. std_regname_index,
  28. mot_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 ppcreg.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_mot_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. mot_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 motnames[mot_regname_index[j]]>=motnames[mot_regname_index[i]] then
  166. break;
  167. t:=mot_regname_index[i];
  168. mot_regname_index[i]:=mot_regname_index[j];
  169. mot_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_ppcreg_file;
  179. var infile:text;
  180. begin
  181. { open dat file }
  182. assign(infile,'ppcreg.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. numbers[regcount]:=readstr;
  199. readcomma;
  200. stdnames[regcount]:=readstr;
  201. readcomma;
  202. motnames[regcount]:=readstr;
  203. readcomma;
  204. stabs[regcount]:=readstr;
  205. if i<length(s) then
  206. begin
  207. writeln('Extra chars at end of line, at line ',line);
  208. writeln('Line: "',s,'"');
  209. halt(1);
  210. end;
  211. inc(regcount);
  212. if regcount>max_regcount then
  213. begin
  214. writeln('Error: Too much registers, please increase maxregcount in source');
  215. halt(2);
  216. end;
  217. end;
  218. close(infile);
  219. end;
  220. procedure write_inc_files;
  221. var
  222. norfile,stdfile,motfile,supfile,
  223. numfile,stabfile,confile,
  224. rnifile,srifile,mrifile:text;
  225. first:boolean;
  226. begin
  227. { create inc files }
  228. openinc(confile,'rppccon.inc');
  229. openinc(supfile,'rppcsup.inc');
  230. openinc(numfile,'rppcnum.inc');
  231. openinc(stdfile,'rppcstd.inc');
  232. openinc(motfile,'rppcmot.inc');
  233. openinc(stabfile,'rppcstab.inc');
  234. openinc(norfile,'rppcnor.inc');
  235. openinc(rnifile,'rppcrni.inc');
  236. openinc(srifile,'rppcsri.inc');
  237. openinc(mrifile,'rppcmri.inc');
  238. first:=true;
  239. for i:=0 to regcount-1 do
  240. begin
  241. if not first then
  242. begin
  243. writeln(numfile,',');
  244. writeln(stdfile,',');
  245. writeln(motfile,',');
  246. writeln(stabfile,',');
  247. writeln(rnifile,',');
  248. writeln(srifile,',');
  249. writeln(mrifile,',');
  250. end
  251. else
  252. first:=false;
  253. writeln(confile,'NR_',names[i],' = ',regtypes[i],'0000',copy(numbers[i],2,255),';');
  254. writeln(supfile,'RS_',names[i],' = ',numbers[i],';');
  255. write(numfile,'NR_',names[i]);
  256. write(stdfile,'''',stdnames[i],'''');
  257. write(motfile,'''',motnames[i],'''');
  258. write(stabfile,stabs[i]);
  259. write(rnifile,regnumber_index[i]);
  260. write(srifile,std_regname_index[i]);
  261. write(mrifile,mot_regname_index[i]);
  262. end;
  263. write(norfile,regcount);
  264. close(confile);
  265. close(supfile);
  266. closeinc(numfile);
  267. closeinc(stdfile);
  268. closeinc(motfile);
  269. closeinc(stabfile);
  270. closeinc(norfile);
  271. closeinc(rnifile);
  272. closeinc(srifile);
  273. closeinc(mrifile);
  274. writeln('Done!');
  275. writeln(regcount,' registers procesed');
  276. end;
  277. begin
  278. writeln('Register Table Converter Version ',Version);
  279. line:=0;
  280. regcount:=0;
  281. read_ppcreg_file;
  282. regcount_bsstart:=1;
  283. while 2*regcount_bsstart<regcount do
  284. regcount_bsstart:=regcount_bsstart*2;
  285. build_regnum_index;
  286. build_std_regname_index;
  287. build_mot_regname_index;
  288. write_inc_files;
  289. end.
  290. {
  291. $Log$
  292. Revision 1.3 2003-09-03 19:35:24 peter
  293. * powerpc compiles again
  294. Revision 1.2 2003/09/03 15:55:01 peter
  295. * NEWRA branch merged
  296. Revision 1.1.2.1 2003/09/02 20:48:22 peter
  297. * powerpc registers
  298. }