ag68kgas.pas 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. {
  2. $Id$
  3. Copyright (c) 1998 by the FPC development team
  4. This unit implements an asmoutput class for MOTOROLA syntax with
  5. Motorola 68000 (for GAS v2.52 AND HIGER)
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software
  16. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. ****************************************************************************
  18. What's to do:
  19. o Verify if this actually work as indirect mode with name of variables
  20. o write lines numbers and file names to output file
  21. o generate debugging informations
  22. }
  23. unit ag68kgas;
  24. interface
  25. uses aasm,assemble;
  26. type
  27. pm68kgasasmlist=^tm68kgasasmlist;
  28. tm68kgasasmlist = object(tasmlist)
  29. procedure WriteTree(p:paasmoutput);virtual;
  30. procedure WriteAsmList;virtual;
  31. end;
  32. implementation
  33. uses
  34. dos,globals,systems,cobjects,m68k,
  35. strings,files,verbose
  36. {$ifdef GDB}
  37. ,gdb
  38. {$endif GDB}
  39. ;
  40. const
  41. line_length = 70;
  42. var
  43. infile : pextfile;
  44. includecount,lastline : longint;
  45. function getreferencestring(const ref : treference) : string;
  46. var
  47. s : string;
  48. begin
  49. s:='';
  50. if ref.isintvalue then
  51. s:='#'+tostr(ref.offset)
  52. else
  53. with ref do
  54. begin
  55. if assigned(symbol) then
  56. s:=s+symbol^;
  57. if offset<0 then s:=s+tostr(offset)
  58. else if (offset>0) then
  59. begin
  60. if (symbol=nil) then s:=tostr(offset)
  61. else s:=s+'+'+tostr(offset);
  62. end;
  63. if (index<>R_NO) and (base=R_NO) and (direction=dir_none) then
  64. begin
  65. if (scalefactor = 1) or (scalefactor = 0) then
  66. s:=s+'(,'+gas_reg2str[index]+'.l)'
  67. else
  68. s:=s+'(,'+gas_reg2str[index]+'.l*'+tostr(scalefactor)+')'
  69. end
  70. else if (index=R_NO) and (base<>R_NO) and (direction=dir_inc) then
  71. begin
  72. if (scalefactor = 1) or (scalefactor = 0) then
  73. s:=s+'('+gas_reg2str[base]+')+'
  74. else
  75. InternalError(10002);
  76. end
  77. else if (index=R_NO) and (base<>R_NO) and (direction=dir_dec) then
  78. begin
  79. if (scalefactor = 1) or (scalefactor = 0) then
  80. s:=s+'-('+gas_reg2str[base]+')'
  81. else
  82. InternalError(10003);
  83. end
  84. else if (index=R_NO) and (base<>R_NO) and (direction=dir_none) then
  85. begin
  86. s:=s+'('+gas_reg2str[base]+')'
  87. end
  88. else if (index<>R_NO) and (base<>R_NO) and (direction=dir_none) then
  89. begin
  90. if (scalefactor = 1) or (scalefactor = 0) then
  91. s:=s+'('+gas_reg2str[base]+','+gas_reg2str[index]+'.l)'
  92. else
  93. s:=s+'('+gas_reg2str[base]+','+gas_reg2str[index]+'.l*'+tostr(scalefactor)+')';
  94. end;
  95. end; { end with }
  96. getreferencestring:=s;
  97. end;
  98. function getopstr(t : byte;o : pointer) : string;
  99. var
  100. hs : string;
  101. i: tregister;
  102. begin
  103. case t of
  104. top_reg : getopstr:=gas_reg2str[tregister(o)];
  105. top_ref : getopstr:=getreferencestring(preference(o)^);
  106. top_reglist: begin
  107. hs:='';
  108. for i:=R_NO to R_FPSR do
  109. begin
  110. if i in tregisterlist(o^) then
  111. hs:=hs+gas_reg2str[i]+'/';
  112. end;
  113. delete(hs,length(hs),1);
  114. getopstr := hs;
  115. end;
  116. top_const : getopstr:='#'+tostr(longint(o));
  117. top_symbol :
  118. { compare with i386, where a symbol is considered }
  119. { a constant. }
  120. begin
  121. hs[0]:=chr(strlen(pchar(pcsymbol(o)^.symbol)));
  122. move(pchar(pcsymbol(o)^.symbol)^,hs[1],byte(hs[0]));
  123. { inc(byte(hs[0]));}
  124. if pcsymbol(o)^.offset>0 then
  125. hs:=hs+'+'+tostr(pcsymbol(o)^.offset)
  126. else if pcsymbol(o)^.offset<0 then
  127. hs:=hs+tostr(pcsymbol(o)^.offset);
  128. getopstr:=hs;
  129. end;
  130. else internalerror(10001);
  131. end;
  132. end;
  133. function getopstr_jmp(t : byte;o : pointer) : string;
  134. var
  135. hs : string;
  136. begin
  137. case t of
  138. top_reg : getopstr_jmp:=gas_reg2str[tregister(o)];
  139. top_ref : getopstr_jmp:=getreferencestring(preference(o)^);
  140. top_const : getopstr_jmp:=tostr(longint(o));
  141. top_symbol : begin
  142. hs[0]:=chr(strlen(pchar(pcsymbol(o)^.symbol)));
  143. move(pchar(pcsymbol(o)^.symbol)^,hs[1],byte(hs[0]));
  144. if pcsymbol(o)^.offset>0 then
  145. hs:=hs+'+'+tostr(pcsymbol(o)^.offset)
  146. else if pcsymbol(o)^.offset<0 then
  147. hs:=hs+tostr(pcsymbol(o)^.offset);
  148. getopstr_jmp:=hs;
  149. end;
  150. else internalerror(10001);
  151. end;
  152. end;
  153. {****************************************************************************
  154. T68kGASASMOUTPUT
  155. ****************************************************************************}
  156. var
  157. { different types of source lines }
  158. n_line : byte;
  159. const
  160. ait_const2str:array[ait_const_32bit..ait_const_8bit] of string[8]=
  161. (#9'.long'#9,'',#9'.short'#9,#9'.byte'#9);
  162. procedure tm68kgasasmlist.WriteTree(p:paasmoutput);
  163. var
  164. hp : pai;
  165. ch : char;
  166. consttyp : tait;
  167. s : string;
  168. pos,l,i : longint;
  169. found : boolean;
  170. {$ifdef GDB}
  171. funcname : pchar;
  172. linecount : longint;
  173. {$endif GDB}
  174. begin
  175. {$ifdef GDB}
  176. funcname:=nil;
  177. linecount:=1;
  178. {$endif GDB}
  179. hp:=pai(p^.first);
  180. while assigned(hp) do
  181. begin
  182. { write debugger informations }
  183. {$ifdef GDB}
  184. if cs_debuginfo in aktswitches then
  185. begin
  186. if not (hp^.typ in [ait_external,ait_stabn,ait_stabs,ait_stab_function_name]) then
  187. begin
  188. if assigned(hp^.infile) and (pextfile(hp^.infile)<>infile) then
  189. begin
  190. infile:=hp^.infile;
  191. inc(includecount);
  192. if (hp^.infile^.path^<>'') then
  193. begin
  194. AsmWriteLn(#9'.stabs "'+FixPath(hp^.infile^.path^)+'",'+tostr(n_includefile)+
  195. ',0,0,Ltext'+ToStr(IncludeCount));
  196. end;
  197. AsmWriteLn(#9'.stabs "'+FixFileName(hp^.infile^.name^+hp^.infile^.ext^)+'",'+tostr(n_includefile)+
  198. ',0,0,Ltext'+ToStr(IncludeCount));
  199. AsmWriteLn('Ltext'+ToStr(IncludeCount)+':');
  200. end;
  201. { file name must be there before line number ! }
  202. if (hp^.line<>lastline) and (hp^.line<>0) then
  203. begin
  204. if (n_line = n_textline) and assigned(funcname) and
  205. (target_info.use_function_relative_addresses) then
  206. begin
  207. AsmWriteLn(target_info.labelprefix+'l'+tostr(linecount)+':');
  208. AsmWriteLn(#9'.stabn '+tostr(n_line)+',0,'+tostr(hp^.line)+','+
  209. target_info.labelprefix+'l'+tostr(linecount)+' - '+StrPas(FuncName));
  210. inc(linecount);
  211. end
  212. else
  213. AsmWriteLn(#9'.stabd'#9+tostr(n_line)+',0,'+tostr(hp^.line));
  214. lastline:=hp^.line;
  215. end;
  216. end;
  217. end;
  218. {$endif GDB}
  219. case hp^.typ of
  220. ait_comment,
  221. ait_external : ; { external is ignored }
  222. ait_align : AsmWriteLn(#9'.align '+tostr(pai_align(hp)^.aligntype));
  223. ait_datablock : begin
  224. { ------------------------------------------------------- }
  225. { ----------- ALIGNMENT FOR ANY NON-BYTE VALUE ---------- }
  226. { ------------- REQUIREMENT FOR 680x0 ------------------- }
  227. { ------------------------------------------------------- }
  228. if pai_datablock(hp)^.size <> 1 then
  229. begin
  230. if not(cs_littlesize in aktswitches) then
  231. AsmWriteLn(#9#9'.align 4')
  232. else
  233. AsmWriteLn(#9#9'.align 2');
  234. end;
  235. if pai_datablock(hp)^.is_global then
  236. AsmWrite(#9'.comm'#9)
  237. else
  238. AsmWrite(#9'.lcomm'#9);
  239. AsmWriteLn(StrPas(pai_datablock(hp)^.name)+','+tostr(pai_datablock(hp)^.size));
  240. end;
  241. ait_const_32bit, { alignment is required for 16/32 bit data! }
  242. ait_const_16bit: begin
  243. if not(cs_littlesize in aktswitches) then
  244. AsmWriteLn(#9#9'.align 4')
  245. else
  246. AsmWriteLn(#9#9'.align 2');
  247. AsmWrite(ait_const2str[hp^.typ]+tostr(pai_const(hp)^.value));
  248. consttyp:=hp^.typ;
  249. l:=0;
  250. repeat
  251. found:=(not (Pai(hp^.next)=nil)) and (Pai(hp^.next)^.typ=consttyp);
  252. if found then
  253. begin
  254. hp:=Pai(hp^.next);
  255. s:=','+tostr(pai_const(hp)^.value);
  256. AsmWrite(s);
  257. inc(l,length(s));
  258. end;
  259. until (not found) or (l>line_length);
  260. AsmLn;
  261. end;
  262. ait_const_8bit : begin
  263. AsmWrite(ait_const2str[hp^.typ]+tostr(pai_const(hp)^.value));
  264. consttyp:=hp^.typ;
  265. l:=0;
  266. repeat
  267. found:=(not (Pai(hp^.next)=nil)) and (Pai(hp^.next)^.typ=consttyp);
  268. if found then
  269. begin
  270. hp:=Pai(hp^.next);
  271. s:=','+tostr(pai_const(hp)^.value);
  272. AsmWrite(s);
  273. inc(l,length(s));
  274. end;
  275. until (not found) or (l>line_length);
  276. AsmLn;
  277. end;
  278. ait_const_symbol : Begin
  279. if not(cs_littlesize in aktswitches) then
  280. AsmWriteLn(#9#9'.align 4')
  281. else
  282. AsmWriteLn(#9#9'.align 2');
  283. AsmWriteLn(#9'.long'#9+StrPas(pchar(pai_const(hp)^.value)));
  284. end;
  285. ait_real_64bit : Begin
  286. if not(cs_littlesize in aktswitches) then
  287. AsmWriteLn(#9#9'.align 4')
  288. else
  289. AsmWriteLn(#9#9'.align 2');
  290. AsmWriteLn(#9'.double'#9+double2str(pai_double(hp)^.value));
  291. end;
  292. ait_real_32bit : Begin
  293. if not(cs_littlesize in aktswitches) then
  294. AsmWriteLn(#9#9'.align 4')
  295. else
  296. AsmWriteLn(#9#9'.align 2');
  297. AsmWriteLn(#9'.single'#9+double2str(pai_single(hp)^.value));
  298. end;
  299. ait_real_extended : Begin
  300. if not(cs_littlesize in aktswitches) then
  301. AsmWriteLn(#9#9'.align 4')
  302. else
  303. AsmWriteLn(#9#9'.align 2');
  304. AsmWriteLn(#9'.extend'#9+double2str(pai_extended(hp)^.value));
  305. { comp type is difficult to write so use double }
  306. end;
  307. ait_comp : Begin
  308. if not(cs_littlesize in aktswitches) then
  309. AsmWriteLn(#9#9'.align 4')
  310. else
  311. AsmWriteLn(#9#9'.align 2');
  312. AsmWriteLn(#9'.double'#9+comp2str(pai_extended(hp)^.value));
  313. end;
  314. ait_direct : begin
  315. AsmWritePChar(pai_direct(hp)^.str);
  316. AsmLn;
  317. {$IfDef GDB}
  318. if strpos(pai_direct(hp)^.str,'.data')<>nil then
  319. n_line:=n_dataline
  320. else if strpos(pai_direct(hp)^.str,'.text')<>nil then
  321. n_line:=n_textline
  322. else if strpos(pai_direct(hp)^.str,'.bss')<>nil then
  323. n_line:=n_bssline;
  324. {$endif GDB}
  325. end;
  326. ait_string : begin
  327. pos:=0;
  328. for i:=1 to pai_string(hp)^.len do
  329. begin
  330. if pos=0 then
  331. begin
  332. AsmWrite(#9'.ascii'#9'"');
  333. pos:=20;
  334. end;
  335. ch:=pai_string(hp)^.str[i-1];
  336. case ch of
  337. #0, {This can't be done by range, because a bug in FPC}
  338. #1..#31,
  339. #128..#255 : s:='\'+tostr(ord(ch) shr 6)+tostr((ord(ch) and 63) shr 3)+tostr(ord(ch) and 7);
  340. '"' : s:='\"';
  341. '\' : s:='\\';
  342. else
  343. s:=ch;
  344. end;
  345. AsmWrite(s);
  346. inc(pos,length(s));
  347. if (pos>line_length) or (i=pai_string(hp)^.len) then
  348. begin
  349. AsmWriteLn('"');
  350. pos:=0;
  351. end;
  352. end;
  353. end;
  354. ait_label : begin
  355. if (pai_label(hp)^.l^.is_used) then
  356. AsmWriteLn(lab2str(pai_label(hp)^.l)+':');
  357. end;
  358. ait_labeled_instruction : begin
  359. { labeled operand }
  360. if pai_labeled(hp)^._op1 = R_NO then
  361. AsmWriteLn(#9+mot_op2str[pai_labeled(hp)^._operator]+#9+lab2str(pai_labeled(hp)^.lab))
  362. else
  363. { labeled operand with register }
  364. AsmWriteLn(#9+mot_op2str[pai_labeled(hp)^._operator]+#9+
  365. reg2str(pai_labeled(hp)^._op1)+','+lab2str(pai_labeled(hp)^.lab))
  366. end;
  367. ait_symbol : begin
  368. { ------------------------------------------------------- }
  369. { ----------- ALIGNMENT FOR ANY NON-BYTE VALUE ---------- }
  370. { ------------- REQUIREMENT FOR 680x0 ------------------- }
  371. { ------------------------------------------------------- }
  372. if assigned(hp^.next) and (pai(hp^.next)^.typ in
  373. [ait_const_32bit,ait_const_16bit,ait_const_symbol,
  374. ait_real_64bit,ait_real_32bit,ait_string]) then
  375. begin
  376. if not(cs_littlesize in aktswitches) then
  377. AsmWriteLn(#9#9'.align 4')
  378. else
  379. AsmWriteLn(#9#9'.align 2');
  380. end;
  381. if pai_symbol(hp)^.is_global then
  382. AsmWriteLn('.globl '+StrPas(pai_symbol(hp)^.name));
  383. AsmWriteLn(StrPas(pai_symbol(hp)^.name)+':');
  384. end;
  385. ait_instruction : begin
  386. { old versions of GAS don't like PEA.L and LEA.L }
  387. if (pai68k(hp)^._operator <> A_LEA) and (pai68k(hp)^._operator<> A_PEA) then
  388. s:=#9+mot_op2str[pai68k(hp)^._operator]+gas_opsize2str[pai68k(hp)^.size]
  389. else
  390. s:=#9+mot_op2str[pai68k(hp)^._operator];
  391. if pai68k(hp)^.op1t<>top_none then
  392. begin
  393. { call and jmp need an extra handling }
  394. { this code is only callded if jmp isn't a labeled instruction }
  395. if pai68k(hp)^._operator in [A_JSR,A_JMP] then
  396. s:=s+#9+getopstr_jmp(pai68k(hp)^.op1t,pai68k(hp)^.op1)
  397. else
  398. if pai68k(hp)^.op1t = top_reglist then
  399. s:=s+#9+getopstr(pai68k(hp)^.op1t,@(pai68k(hp)^.reglist))
  400. else
  401. s:=s+#9+getopstr(pai68k(hp)^.op1t,pai68k(hp)^.op1);
  402. if pai68k(hp)^.op2t<>top_none then
  403. begin
  404. if pai68k(hp)^.op2t = top_reglist then
  405. s:=s+','+getopstr(pai68k(hp)^.op2t,@pai68k(hp)^.reglist)
  406. else
  407. s:=s+','+getopstr(pai68k(hp)^.op2t,pai68k(hp)^.op2);
  408. { three operands }
  409. if pai68k(hp)^.op3t<>top_none then
  410. begin
  411. if (pai68k(hp)^._operator = A_DIVSL) or
  412. (pai68k(hp)^._operator = A_DIVUL) or
  413. (pai68k(hp)^._operator = A_MULU) or
  414. (pai68k(hp)^._operator = A_MULS) or
  415. (pai68k(hp)^._operator = A_DIVS) or
  416. (pai68k(hp)^._operator = A_DIVU) then
  417. s:=s+':'+getopstr(pai68k(hp)^.op3t,pai68k(hp)^.op3)
  418. else
  419. s:=s+','+getopstr(pai68k(hp)^.op3t,pai68k(hp)^.op3);
  420. end;
  421. end;
  422. end;
  423. AsmWriteLn(s);
  424. end;
  425. {$ifdef GDB}
  426. ait_stabs : begin
  427. AsmWrite(#9'.stabs ');
  428. AsmWritePChar(pai_stabs(hp)^.str);
  429. AsmLn;
  430. end;
  431. ait_stabn : begin
  432. AsmWrite(#9'.stabn ');
  433. AsmWritePChar(pai_stabn(hp)^.str);
  434. AsmLn;
  435. end;
  436. ait_stab_function_name : funcname:=pai_stab_function_name(hp)^.str;
  437. {$endif GDB}
  438. else
  439. internalerror(10000);
  440. end;
  441. hp:=pai(hp^.next);
  442. end;
  443. end;
  444. procedure tm68kgasasmlist.WriteAsmList;
  445. {$ifdef GDB}
  446. var
  447. p,n,e : string;
  448. {$endif}
  449. begin
  450. {$ifdef EXTDEBUG}
  451. if assigned(current_module^.mainsource) then
  452. comment(v_info,'Start writing gas-styled assembler output for '+current_module^.mainsource^);
  453. {$endif}
  454. infile:=nil;
  455. includecount:=0;
  456. {$ifdef GDB}
  457. if assigned(current_module^.mainsource) then
  458. fsplit(current_module^.mainsource^,p,n,e)
  459. else
  460. begin
  461. p:=inputdir;
  462. n:=inputfile;
  463. e:=inputextension;
  464. end;
  465. { to get symify to work }
  466. AsmWriteLn(#9'.file "'+FixFileName(n+e)+'"');
  467. { stabs }
  468. n_line:=n_bssline;
  469. if (cs_debuginfo in aktswitches) then
  470. begin
  471. if (p<>'') then
  472. AsmWriteLn(#9'.stabs "'+FixPath(p)+'",'+tostr(n_sourcefile)+',0,0,Ltext0');
  473. AsmWriteLn(#9'.stabs "'+FixFileName(n+e)+'",'+tostr(n_sourcefile)+',0,0,Ltext0');
  474. AsmWriteLn('Ltext0:');
  475. end;
  476. infile:=current_module^.sourcefiles.files;
  477. {$endif GDB}
  478. { main source file is last in list }
  479. while assigned(infile^._next) do
  480. infile:=infile^._next;
  481. lastline:=0;
  482. { there should be nothing but externals so we don't need to process
  483. WriteTree(externals); }
  484. WriteTree(debuglist);
  485. { code segment }
  486. AsmWriteln('.text');
  487. {$ifdef GDB}
  488. n_line:=n_textline;
  489. {$endif GDB}
  490. WriteTree(codesegment);
  491. AsmWriteLn('.data');
  492. {$ifdef EXTDEBUG}
  493. AsmWriteLn(#9'.ascii'#9'"compiled by FPC '+version_string+'\0"');
  494. AsmWriteLn(#9'.ascii'#9'"target: '+target_info.target_name+'\0"');
  495. {$endif EXTDEBUG}
  496. {$ifdef GDB}
  497. n_line:=n_dataline;
  498. {$endif GDB}
  499. DataSegment^.insert(new(pai_align,init(4)));
  500. WriteTree(datasegment);
  501. WriteTree(consts);
  502. { makes problems with old GNU ASes
  503. AsmWriteLn('.bss');
  504. bssSegment^.insert(new(pai_align,init(4))); }
  505. {$ifdef GDB}
  506. n_line:=n_bssline;
  507. {$endif GDB}
  508. WriteTree(bsssegment);
  509. AsmLn;
  510. {$ifdef EXTDEBUG}
  511. if assigned(current_module^.mainsource) then
  512. comment(v_info,'Done writing gas-styled assembler output for '+current_module^.mainsource^);
  513. {$endif EXTDEBUG}
  514. end;
  515. end.
  516. {
  517. $Log$
  518. Revision 1.1 1998-03-25 11:18:16 root
  519. Initial revision
  520. Revision 1.3 1998/03/22 12:45:37 florian
  521. * changes of Carl-Eric to m68k target commit:
  522. - wrong nodes because of the new string cg in intel, I had to create
  523. this under m68k also ... had to work it out to fix potential alignment
  524. problems --> this removes the crash of the m68k compiler.
  525. - added absolute addressing in m68k assembler (required for Amiga startup)
  526. - fixed alignment problems (because of byte return values, alignment
  527. would not be always valid) -- is this ok if i change the offset if odd in
  528. setfirsttemp ?? -- it seems ok...
  529. Revision 1.2 1998/03/10 04:22:08 carl
  530. - removed in as it can cause range check errors under BP
  531. Revision 1.1 1998/03/10 01:26:10 peter
  532. + new uniform names
  533. Revision 1.18 1998/03/09 12:58:10 peter
  534. * FWait warning is only showed for Go32V2 and $E+
  535. * opcode tables moved to i386.pas/m68k.pas to reduce circular uses (and
  536. for m68k the same tables are removed)
  537. + $E for i386
  538. Revision 1.17 1998/03/06 00:52:18 peter
  539. * replaced all old messages from errore.msg, only ExtDebug and some
  540. Comment() calls are left
  541. * fixed options.pas
  542. Revision 1.16 1998/03/02 01:48:33 peter
  543. * renamed target_DOS to target_GO32V1
  544. + new verbose system, merged old errors and verbose units into one new
  545. verbose.pas, so errors.pas is obsolete
  546. Revision 1.15 1998/02/23 03:00:00 carl
  547. * bugfix when compiling with extdebug defined
  548. Revision 1.14 1998/02/22 23:03:18 peter
  549. * renamed msource->mainsource and name->unitname
  550. * optimized filename handling, filename is not seperate anymore with
  551. path+name+ext, this saves stackspace and a lot of fsplit()'s
  552. * recompiling of some units in libraries fixed
  553. * shared libraries are working again
  554. + $LINKLIB <lib> to support automatic linking to libraries
  555. + libraries are saved/read from the ppufile, also allows more libraries
  556. per ppufile
  557. Revision 1.13 1998/02/21 20:20:52 carl
  558. * make it work under older versions of GAS
  559. Revision 1.10 1998/02/15 21:16:19 peter
  560. * all assembler outputs supported by assemblerobject
  561. * cleanup with assembleroutputs, better .ascii generation
  562. * help_constructor/destructor are now added to the externals
  563. - generation of asmresponse is not outputformat depended
  564. Revision 1.9 1998/02/13 10:34:59 daniel
  565. * Made Motorola version compilable.
  566. * Fixed optimizer
  567. Revision 1.8 1998/02/12 11:50:04 daniel
  568. Yes! Finally! After three retries, my patch!
  569. Changes:
  570. Complete rewrite of psub.pas.
  571. Added support for DLL's.
  572. Compiler requires less memory.
  573. Platform units for each platform.
  574. Revision 1.7 1998/01/09 19:20:49 carl
  575. + added support for mul/div 68020 syntax
  576. * bugfix of getreferencestring
  577. Revision 1.4 1997/12/09 13:37:50 carl
  578. + ait_align added
  579. * now all non byte values are aligned correctly
  580. Revision 1.3 1997/12/05 14:40:49 carl
  581. * bugfix of scaling, was incorrect under gas.
  582. Revision 1.2 1997/12/04 15:30:14 carl
  583. * forgot to change name of unit! ugh...
  584. Revision 1.1 1997/12/03 14:04:19 carl
  585. + renamed from gasasm6.pas to ag68kgas.pas
  586. Revision 1.3 1997/12/01 17:42:51 pierre
  587. + added some more functionnality to the assembler parser
  588. Revision 1.2 1997/11/28 18:14:32 pierre
  589. working version with several bug fixes
  590. Revision 1.1.1.1 1997/11/27 08:32:56 michael
  591. FPC Compiler CVS start
  592. Pre-CVS log:
  593. CEC Carl-Eric Codere
  594. FK Florian Klaempfl
  595. PM Pierre Muller
  596. + feature added
  597. - removed
  598. * bug fixed or changed
  599. History:
  600. 30th september 1996:
  601. + unit started (FK)
  602. 15th october 1996:
  603. + ti386attasmoutput class started (FK)
  604. 28th november 1996:
  605. ! debugging for simple programs (FK)
  606. 26th february 1997:
  607. + op2str array completed with work of Daniel Manitone (FK)
  608. 25th september 1997:
  609. * compiled by comment ifdef'ed (FK)
  610. 4th october 1997:
  611. + converted to motorola 68000 (same sytnax as gas) (CEC)
  612. 9th october 1997:
  613. * fixed constant bug. (CEC)
  614. + converted from %reg to reg (untested) (CEC)
  615. (according to gas docs, they are accepted).
  616. 28th october 1997:
  617. * bugfix on increment/decrement mode (was never checked). (CEC)
  618. 2nd november 1997:
  619. + added all opcodes , and they are now in correct order of
  620. processor types. (CEC).
  621. }