From c2b91243e9f73334516b743b7eb49d1c071d6014 Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Mon, 15 Sep 2014 22:14:08 +0400 Subject: [PATCH] improved risc crosscompiler, added example and readme. --- src/voc07R/CompatTexts.Mod | 10 +- src/voc07R/ORTool.Mod | 251 ++++++++++++++++++++++++++++++++++++ src/voc07R/Oberon.Mod | 8 ++ src/voc07R/Oberon10.Scn.Fnt | Bin 0 -> 2284 bytes src/voc07R/README.md | 29 +++++ src/voc07R/test.Mod | 10 -- src/voc07R/test/Oberon.rsc | Bin 0 -> 7295 bytes src/voc07R/test/Oberon.smb | Bin 0 -> 1372 bytes src/voc07R/test/Test.Mod | Bin 0 -> 248 bytes src/voc07R/test/Texts.rsc | Bin 0 -> 12142 bytes src/voc07R/test/Texts.smb | Bin 0 -> 1212 bytes src/voc07R/test/readme | 3 + 12 files changed, 298 insertions(+), 13 deletions(-) create mode 100644 src/voc07R/ORTool.Mod create mode 100644 src/voc07R/Oberon10.Scn.Fnt create mode 100644 src/voc07R/README.md delete mode 100644 src/voc07R/test.Mod create mode 100644 src/voc07R/test/Oberon.rsc create mode 100644 src/voc07R/test/Oberon.smb create mode 100644 src/voc07R/test/Test.Mod create mode 100644 src/voc07R/test/Texts.rsc create mode 100644 src/voc07R/test/Texts.smb create mode 100644 src/voc07R/test/readme diff --git a/src/voc07R/CompatTexts.Mod b/src/voc07R/CompatTexts.Mod index f94b3151..62b9073a 100644 --- a/src/voc07R/CompatTexts.Mod +++ b/src/voc07R/CompatTexts.Mod @@ -167,12 +167,16 @@ MODULE CompatTexts; (*JG 21.11.90 / NW 11.7.90 / 24.12.95 / 22.11.10 / 26.3.2014 rlen := rlen + q.len; q := q.next END; (*Dict[N] := p.fnt.name;*) - COPY(p.fnt.name, Dict[N]); (* voc adaptation by noch *) + IF p.fnt # NIL THEN COPY(p.fnt.name, Dict[N]) END; (* voc adaptation by noch *) n := 1; - WHILE Dict[n] # p.fnt.name DO INC(n) END; + IF p.fnt # NIL THEN (* voc adaptation by noch *) + WHILE Dict[n] # p.fnt.name DO INC(n) END; + END; (*Files.WriteByte(W, n);*) Files.WriteByte(W, SHORT(SHORT(n))); (* voc adaptation by noch *) - IF n = N THEN Files.WriteString(W, p.fnt.name); INC(N) END; + IF p.fnt # NIL THEN (* voc adaptation by noch *) + IF n = N THEN Files.WriteString(W, p.fnt.name); INC(N) END; + END; (*Files.WriteByte(W, p.col);*) Files.WriteByte(W, SHORT(SHORT(p.col))); (* voc adaptation by noch *) (*Files.WriteByte(W, p.voff);*) diff --git a/src/voc07R/ORTool.Mod b/src/voc07R/ORTool.Mod new file mode 100644 index 00000000..3c3f9411 --- /dev/null +++ b/src/voc07R/ORTool.Mod @@ -0,0 +1,251 @@ +MODULE ORTool; (*NW 18.2.2013*) + IMPORT SYSTEM, Files, Texts, Oberon, ORB; + VAR W: Texts.Writer; + Form: INTEGER; (*result of ReadType*) + mnemo0, mnemo1: ARRAY 16, 4 OF CHAR; (*mnemonics*) + + PROCEDURE Read(VAR R: Files.Rider; VAR n: INTEGER); + VAR b: BYTE; + BEGIN Files.ReadByte(R, b); + IF b < 80H THEN n := b ELSE n := b - 100H END + END Read; + + PROCEDURE ReadType(VAR R: Files.Rider); + VAR key, len, lev, size, off: INTEGER; + ref, mno, class, form, readonly: INTEGER; + name, modname: ARRAY 32 OF CHAR; + BEGIN Read(R, ref); Texts.Write(W, " "); Texts.Write(W, "["); + IF ref < 0 THEN Texts.Write(W, "^"); Texts.WriteInt(W, -ref, 1) + ELSE Texts.WriteInt(W, ref, 1); + Read(R, form); Texts.WriteString(W, " form = "); Texts.WriteInt(W, form, 1); + IF form = ORB.Pointer THEN ReadType(R) + ELSIF form = ORB.Array THEN + ReadType(R); Files.ReadNum(R, len); Files.ReadNum(R, size); + Texts.WriteString(W, " len = "); Texts.WriteInt(W, len, 1); + Texts.WriteString(W, " size = "); Texts.WriteInt(W, size, 1) + ELSIF form = ORB.Record THEN + ReadType(R); (*base type*) + Files.ReadNum(R, off); Texts.WriteString(W, " exno = "); Texts.WriteInt(W, off, 1); + Files.ReadNum(R, off); Texts.WriteString(W, " extlev = "); Texts.WriteInt(W, off, 1); + Files.ReadNum(R, size); Texts.WriteString(W, " size = "); Texts.WriteInt(W, size, 1); + Texts.Write(W, " "); Texts.Write(W, "{"); Read(R, class); + WHILE class # 0 DO (*fields*) + Files.ReadString(R, name); + IF name[0] # 0X THEN Texts.Write(W, " "); Texts.WriteString(W, name); ReadType(R) + ELSE Texts.WriteString(W, " --") + END ; + Files.ReadNum(R, off); Texts.WriteInt(W, off, 4); Read(R, class) + END ; + Texts.Write(W, "}") + ELSIF form = ORB.Proc THEN + ReadType(R); Texts.Write(W, "("); Read(R, class); + WHILE class # 0 DO + Texts.WriteString(W, " class = "); Texts.WriteInt(W, class, 1); Read(R, readonly); + IF readonly = 1 THEN Texts.Write(W, "#") END ; + ReadType(R); Read(R, class) + END ; + Texts.Write(W, ")") + END ; + Files.ReadString(R, modname); + IF modname[0] # 0X THEN + Files.ReadInt(R, key); Files.ReadString(R, name); + Texts.Write(W, " "); Texts.WriteString(W, modname); Texts.Write(W, "."); Texts.WriteString(W, name); + Texts.WriteHex(W, key) + END + END ; + Form := form; Texts.Write(W, "]") + END ReadType; + + PROCEDURE DecSym*; (*decode symbol file*) + VAR class, typno, k: INTEGER; + name: ARRAY 32 OF CHAR; + F: Files.File; R: Files.Rider; + S: Texts.Scanner; + BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S); + IF S.class = Texts.Name THEN + Texts.WriteString(W, "OR-decode "); Texts.WriteString(W, S.s); + Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf); + F := Files.Old(S.s); + IF F # NIL THEN + Files.Set(R, F, 0); Files.ReadInt(R, k); Files.ReadInt(R, k); + Files.ReadString(R, name); Texts.WriteString(W, name); Texts.WriteHex(W, k); + Read(R, class); Texts.WriteInt(W, class, 3); (*sym file version*) + IF class = ORB.versionkey THEN + Texts.WriteLn(W); Read(R, class); + WHILE class # 0 DO + Texts.WriteInt(W, class, 4); Files.ReadString(R, name); Texts.Write(W, " "); Texts.WriteString(W, name); + ReadType(R); + IF class = ORB.Typ THEN + Texts.Write(W, "("); Read(R, class); + WHILE class # 0 DO (*pointer base fixup*) + Texts.WriteString(W, " ->"); Texts.WriteInt(W, class, 4); Read(R, class) + END ; + Texts.Write(W, ")") + ELSIF (class = ORB.Const) OR (class = ORB.Var) THEN + Files.ReadNum(R, k); Texts.WriteInt(W, k, 5); (*Reals, Strings!*) + END ; + Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf); + Read(R, class) + END + ELSE Texts.WriteString(W, " bad symfile version") + END + ELSE Texts.WriteString(W, " not found") + END ; + Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf) + END + END DecSym; + +(* ---------------------------------------------------*) + + PROCEDURE WriteReg(r: LONGINT); + BEGIN Texts.Write(W, " "); + IF r < 12 THEN Texts.WriteString(W, " R"); Texts.WriteInt(W, r MOD 10H, 1) + ELSIF r = 12 THEN Texts.WriteString(W, "MT") + ELSIF r = 13 THEN Texts.WriteString(W, "SB") + ELSIF r = 14 THEN Texts.WriteString(W, "SP") + ELSE Texts.WriteString(W, "LNK") + END + END WriteReg; + + PROCEDURE opcode(w: LONGINT); + VAR k, op, u, a, b, c: LONGINT; + BEGIN + k := w DIV 40000000H MOD 4; + a := w DIV 1000000H MOD 10H; + b := w DIV 100000H MOD 10H; + op := w DIV 10000H MOD 10H; + u := w DIV 20000000H MOD 2; + IF k = 0 THEN + Texts.WriteString(W, mnemo0[op]); + IF u = 1 THEN Texts.Write(W, "'") END ; + WriteReg(a); WriteReg(b); WriteReg(w MOD 10H) + ELSIF k = 1 THEN + Texts.WriteString(W, mnemo0[op]); + IF u = 1 THEN Texts.Write(W, "'") END ; + WriteReg(a); WriteReg(b); w := w MOD 10000H; + IF w >= 8000H THEN w := w - 10000H END ; + Texts.WriteInt(W, w, 7) + ELSIF k = 2 THEN (*LDR/STR*) + IF u = 1 THEN Texts.WriteString(W, "STR ") ELSE Texts.WriteString(W, "LDR") END ; + WriteReg(a); WriteReg(b); w := w MOD 100000H; + IF w >= 80000H THEN w := w - 100000H END ; + Texts.WriteInt(W, w, 8) + ELSIF k = 3 THEN (*Branch instr*) + Texts.Write(W, "B"); + IF ODD(w DIV 10000000H) THEN Texts.Write(W, "L") END ; + Texts.WriteString(W, mnemo1[a]); + IF u = 0 THEN WriteReg(w MOD 10H) ELSE + w := w MOD 100000H; + IF w >= 80000H THEN w := w - 100000H END ; + Texts.WriteInt(W, w, 8) + END + END + END opcode; + + PROCEDURE Sync(VAR R: Files.Rider); + VAR ch: CHAR; + BEGIN Files.Read(R, ch); Texts.WriteString(W, "Sync "); Texts.Write(W, ch); Texts.WriteLn(W) + END Sync; + + PROCEDURE Write(VAR R: Files.Rider; x: INTEGER); + BEGIN Files.WriteByte(R, x) (* -128 <= x < 128 *) + END Write; + + PROCEDURE DecObj*; (*decode object file*) + VAR class, i, n, key, size, fix, adr, data, len: INTEGER; + ch: CHAR; + name: ARRAY 32 OF CHAR; + F: Files.File; R: Files.Rider; + S: Texts.Scanner; + BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S); + IF S.class = Texts.Name THEN + Texts.WriteString(W, "decode "); Texts.WriteString(W, S.s); F := Files.Old(S.s); + IF F # NIL THEN + Files.Set(R, F, 0); Files.ReadString(R, name); Texts.WriteLn(W); Texts.WriteString(W, name); + Files.ReadInt(R, key); Texts.WriteHex(W, key); Read(R, class); Texts.WriteInt(W, class, 4); (*version*) + Files.ReadInt(R, size); Texts.WriteInt(W, size, 6); Texts.WriteLn(W); + Texts.WriteString(W, "imports:"); Texts.WriteLn(W); Files.ReadString(R, name); + WHILE name[0] # 0X DO + Texts.Write(W, 9X); Texts.WriteString(W, name); + Files.ReadInt(R, key); Texts.WriteHex(W, key); Texts.WriteLn(W); + Files.ReadString(R, name) + END ; + (* Sync(R); *) + Texts.WriteString(W, "type descriptors"); Texts.WriteLn(W); + Files.ReadInt(R, n); n := n DIV 4; i := 0; + WHILE i < n DO Files.ReadInt(R, data); Texts.WriteHex(W, data); INC(i) END ; + Texts.WriteLn(W); + Texts.WriteString(W, "data"); Files.ReadInt(R, data); Texts.WriteInt(W, data, 6); Texts.WriteLn(W); + Texts.WriteString(W, "strings"); Texts.WriteLn(W); + Files.ReadInt(R, n); i := 0; + WHILE i < n DO Files.Read(R, ch); Texts.Write(W, ch); INC(i) END ; + Texts.WriteLn(W); + Texts.WriteString(W, "code"); Texts.WriteLn(W); + Files.ReadInt(R, n); i := 0; + WHILE i < n DO + Files.ReadInt(R, data); Texts.WriteInt(W, i, 4); Texts.Write(W, 9X); Texts.WriteHex(W, data); + Texts.Write(W, 9X); opcode(data); Texts.WriteLn(W); INC(i) + END ; + (* Sync(R); *) + Texts.WriteString(W, "commands:"); Texts.WriteLn(W); + Files.ReadString(R, name); + WHILE name[0] # 0X DO + Texts.Write(W, 9X); Texts.WriteString(W, name); + Files.ReadInt(R, adr); Texts.WriteInt(W, adr, 5); Texts.WriteLn(W); + Files.ReadString(R, name) + END ; + (* Sync(R); *) + Texts.WriteString(W, "entries"); Texts.WriteLn(W); + Files.ReadInt(R, n); i := 0; + WHILE i < n DO + Files.ReadInt(R, adr); Texts.WriteInt(W, adr, 6); INC(i) + END ; + Texts.WriteLn(W); + (* Sync(R); *) + Texts.WriteString(W, "pointer refs"); Texts.WriteLn(W); Files.ReadInt(R, adr); + WHILE adr # -1 DO Texts.WriteInt(W, adr, 6); Files.ReadInt(R, adr) END ; + Texts.WriteLn(W); + (* Sync(R); *) + Files.ReadInt(R, data); Texts.WriteString(W, "fixP = "); Texts.WriteInt(W, data, 8); Texts.WriteLn(W); + Files.ReadInt(R, data); Texts.WriteString(W, "fixD = "); Texts.WriteInt(W, data, 8); Texts.WriteLn(W); + Files.ReadInt(R, data); Texts.WriteString(W, "fixT = "); Texts.WriteInt(W, data, 8); Texts.WriteLn(W); + Files.ReadInt(R, data); Texts.WriteString(W, "entry = "); Texts.WriteInt(W, data, 8); Texts.WriteLn(W); + Files.Read(R, ch); + IF ch # "O" THEN Texts.WriteString(W, "format eror"); Texts.WriteLn(W) END + (* Sync(R); *) + ELSE Texts.WriteString(W, " not found"); Texts.WriteLn(W) + END ; + Texts.Append(Oberon.Log, W.buf) + END + END DecObj; + +BEGIN Texts.OpenWriter(W); Texts.WriteString(W, "ORTool 18.2.2013"); + Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf); + mnemo0[0] := "MOV"; + mnemo0[1] := "LSL"; + mnemo0[2] := "ASR"; + mnemo0[3] := "ROR"; + mnemo0[4] := "AND"; + mnemo0[5] := "ANN"; + mnemo0[6] := "IOR"; + mnemo0[7] := "XOR"; + mnemo0[8] := "ADD"; + mnemo0[9] := "SUB"; + mnemo0[10] := "MUL"; + mnemo0[11] := "DIV"; + mnemo0[12] := "FAD"; + mnemo0[13] := "FSB"; + mnemo0[14] := "FML"; + mnemo0[15] := "FDV"; + mnemo1[0] := "MI "; + mnemo1[8] := "PL"; + mnemo1[1] := "EQ "; + mnemo1[9] := "NE "; + mnemo1[2] := "LS "; + mnemo1[10] := "HI "; + mnemo1[5] := "LT "; + mnemo1[13] := "GE "; + mnemo1[6] := "LE "; + mnemo1[14] := "GT "; + mnemo1[15] := "NO "; +END ORTool. diff --git a/src/voc07R/Oberon.Mod b/src/voc07R/Oberon.Mod index 736d664c..b2da7dee 100644 --- a/src/voc07R/Oberon.Mod +++ b/src/voc07R/Oberon.Mod @@ -1,5 +1,12 @@ MODULE Oberon; +(* this module emulates Oberon.Log and Oberon.Par in order to pass agruments to Oberon programs, as it's in Oberon environment; + it creates Oberon.Par from command line arguments; + procedure Dump dumps Oberon.Log to standard output. + + -- noch *) + +(* Files are commented out, because it's not necessary for work, but can be very useful for debug. See WriteTextToFile procedure; -- noch *) IMPORT Args, Strings, Texts := CompatTexts, (*Files := CompatFiles,*) Out := Console; VAR Log*: Texts.Text; @@ -34,6 +41,7 @@ BEGIN WHILE i < Args.argc DO Args.Get(i, opt); Strings.Append(opt, opts);(* Strings.Append (" ", opts);*) + (* ORP calls Texts.Scan, which returns filename, and nextCh would be set to " " if we append here " ". However after that ORP will check nextCh, and if it finds that nextCh is not "/" it's not gonna parse options. That's why Strings.Append is commented out; -- noch *) INC(i) END; diff --git a/src/voc07R/Oberon10.Scn.Fnt b/src/voc07R/Oberon10.Scn.Fnt new file mode 100644 index 0000000000000000000000000000000000000000..15f999211bf7ec25781c232d43af678d6d0b9385 GIT binary patch literal 2284 zcmaJ?&5qgTsd;#1@;->u+P8+B)H6F z;mUz$*=L!_exIv7P7e~5j$JC(&sSeL>JRe6XKN8@<$jJ*ON91ZewJV4SNTnTmp|lB z`Ahy5`lvKwp?G*MH3M6Xr;$@l{b-|BX$q_^Wijygi10Y6B&1jmTMdtS_P~>Otf96l*%UobPyN{KQ(H!_ zNZH3zjaXQ>PJIwnu1o%y&jMcsjY121ReUY9hq(bSA)N-qE?LV+m#pR3l0{>QzQkr! zWS3$edt*l>Hl|a~zSM{bAF(JKjG*md4hd;SRk-pg3;ha$+%LPMaQ5Z2M3gLL`n1h6 zCwO`f$bCp1@qX#83FxiNTp1_3@v+OLEmz~TC>8u@yT|QRO=C~_yPqxYWM+-`o*WoN zWUfk$r`kRG$Tg_3OV+JVG-A;ktMlb8q43t{87(vOR56nw#xh_2W;__-P2_i!zbMXw zJXtVE3CNq#$HinaLwWj3RK<4674u~#mA{;2=~ryZpGEy*`#&w;Vt&7zLgDnk)wD}~ zk6AP`=W8k-hv+L~s?bk;sLah3Yuh#aoVCf{T4(T5U}@dtT8G8)aN@$lrs;+xU2^obn@lo? z&@>HRZa1-ACnXr$!T*zuv7<(BC&uILLbH8#f!$=hX@9-0s`cwhCalo$l~~jaqka3& z-QC^4-@LiKJ$$|2H%*T;c>6Jdw_`t$l%ekd6fd{5zd2l80s2VL6JFXWl~p0LBsc}Y zKBVWp@c9_UujwSjwxSUMPE>^O>O z`q-r&gS9o>I*a8J$Lg;oa8-^(fNG^e4|M$w^5a{LVWo(1p%PP|h8Ck|@Rh48Q`arB z_1317sC|(|vPouRtm_z4qsNwA)1yUPI4make + +Run +=== + +>./ORP test.Mod /s + +like that. + +you may need symbol (.smb) files from RISC Oberon system in order to write programs that import some modules. + +some answers +============ + +- why Oberon10.Scn.Fnt ? +- it's actually not really necessary. because Texts are patched (test for NIL) to not crash if this file does not exist. however, unless I remove dependency from Fonts.Mod I have decided to keep this file here, and thus my added test for NIL is not necessary, and generated output file is completely correct Oberon Text file. Otherwise it would not contain the font name, for instance. + diff --git a/src/voc07R/test.Mod b/src/voc07R/test.Mod deleted file mode 100644 index d97a7e52..00000000 --- a/src/voc07R/test.Mod +++ /dev/null @@ -1,10 +0,0 @@ -MODULE test; -VAR b : BOOLEAN; -i : INTEGER; -BEGIN -b := FALSE; -i := ORD(b); - -END test. - - diff --git a/src/voc07R/test/Oberon.rsc b/src/voc07R/test/Oberon.rsc new file mode 100644 index 0000000000000000000000000000000000000000..d0e49fa8d0fcdda90d1814c62979d5dbe3af6c4b GIT binary patch literal 7295 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 literal 0 HcmV?d00001 diff --git a/src/voc07R/test/Oberon.smb b/src/voc07R/test/Oberon.smb new file mode 100644 index 0000000000000000000000000000000000000000..148bd4143863ecdd9e2db981b0cf3209b2feb8a9 GIT binary patch literal 1372 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 HGG_h_Vq;QE literal 0 HcmV?d00001 diff --git a/src/voc07R/test/readme b/src/voc07R/test/readme new file mode 100644 index 00000000..9108c517 --- /dev/null +++ b/src/voc07R/test/readme @@ -0,0 +1,3 @@ +put ORP binary here and run + +> ./ORP Test.Mod