summaryrefslogtreecommitdiff
path: root/compiler/utils/fixnasm.pp
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/utils/fixnasm.pp')
-rw-r--r--compiler/utils/fixnasm.pp99
1 files changed, 99 insertions, 0 deletions
diff --git a/compiler/utils/fixnasm.pp b/compiler/utils/fixnasm.pp
new file mode 100644
index 0000000000..01041ede83
--- /dev/null
+++ b/compiler/utils/fixnasm.pp
@@ -0,0 +1,99 @@
+{
+ Copyright (c) 1998-2002 by Peter Vreman
+
+ Convert insns.dat from Nasm to an i386ins.dat for usage with
+ the Free pascal compiler
+
+ See the file COPYING.FPC, included in this distribution,
+ for details about the copyright.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+program fixnasm;
+
+{$ifndef FPC}
+ procedure readln(var t:text;var s:string);
+ var
+ c : char;
+ i : longint;
+ begin
+ c:=#0;
+ i:=0;
+ while (not eof(t)) and (c<>#10) do
+ begin
+ read(t,c);
+ if c<>#10 then
+ begin
+ inc(i);
+ s[i]:=c;
+ end;
+ end;
+ if (i>0) and (s[i]=#13) then
+ dec(i);
+ s[0]:=chr(i);
+ end;
+{$endif}
+
+const
+ spaces=' ';
+var
+ t,f : text;
+ para,bytes,flags,
+ opcode,lastop,
+ s : string;
+ i,j : longint;
+begin
+ writeln('Fixing insns.dat -> i386ins.dat');
+ assign(t,'insns.dat');
+ reset(t);
+ assign(f,'insns.new');
+ rewrite(f);
+ lastop:='';
+ while not eof(t) do
+ begin
+ readln(t,s);
+ if (s<>'') and (s[1]<>';') then
+ begin
+ i:=pos(' ',s);
+ j:=pos(',',s);
+ if (j>0) and (j<i) then
+ opcode:=Copy(s,1,j-1)
+ else
+ opcode:=Copy(s,1,i-1);
+ if opcode<>lastop then
+ begin
+ writeln(f,'');
+ writeln(f,'[',Copy(s,1,i-1),']');
+ writeln(f,'(Ch_All, Ch_None, Ch_None)');
+ lastop:=opcode;
+ end;
+ while (i<length(s)) and (s[i+1]=' ') do
+ inc(i);
+ Delete(s,1,i);
+ i:=pos(' ',s);
+ para:=Copy(s,1,i-1);
+ para:=para+Copy(spaces,1,22-length(para));
+ while (i<length(s)) and (s[i+1]=' ') do
+ inc(i);
+ Delete(s,1,i);
+ i:=pos(' ',s);
+ bytes:=Copy(s,1,i-1);
+ bytes:=bytes+Copy(spaces,1,32-length(bytes));
+ while (i<length(s)) and (s[i+1]=' ') do
+ inc(i);
+ Delete(s,1,i);
+ i:=pos(' ',s);
+ if i=0 then
+ i:=255;
+ flags:=Copy(s,1,i-1);
+ writeln(f,para,bytes,flags);
+ end
+ else
+ writeln(f,s);
+ end;
+ close(f);
+ close(t);
+end.