Skip to content

Commit

Permalink
Oberon0, ORL, ORX - Add more checks for R.eof in ExtractCode
Browse files Browse the repository at this point in the history
  • Loading branch information
andreaspirklbauer committed Feb 26, 2024
1 parent 2a787dc commit 0a60b08
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 22 deletions.
Binary file modified Documentation/S3RISCinstall.tar.gz
Binary file not shown.
13 changes: 7 additions & 6 deletions Sources/ORL.Mod
Expand Up @@ -435,26 +435,27 @@ MODULE ORL; (*Oberon boot linker/loader for RISC / AP 1.3.24 Extended Oberon*)
END Run;

PROCEDURE ExtractCode(F: Files.File; start: INTEGER; VAR codelen, entry, res: INTEGER);
VAR n, p, data: INTEGER; ch: CHAR; b: BYTE; (*codelen in words, entry in bytes*)
VAR n, p, data: INTEGER; (*codelen in words, entry in bytes*)
ch: CHAR; b: BYTE;
R: Files.Rider;
name: ARRAY 32 OF CHAR;
BEGIN Files.Set(R, F, 0); Files.ReadString(R, name); Files.ReadInt(R, data); (*key*)
Files.ReadByte(R, b); (*version*) Files.ReadInt(R, data); (*size*)
Files.ReadString(R, name); (*imports*)
WHILE name[0] # 0X DO Files.ReadInt(R, data); (*key*) Files.ReadString(R, name) END ;
WHILE ~R.eof & (name[0] # 0X) DO Files.ReadInt(R, data); (*key*) Files.ReadString(R, name) END ;
Files.ReadInt(R, n); (*variable space*)
Files.ReadInt(R, n); Files.Set(R, F, Files.Pos(R) + n); (*strings*)
Files.ReadInt(R, n); Files.Set(R, F, Files.Pos(R) + n); (*type descriptors*)
Files.ReadInt(R, n); codelen := n;
IF start + n < limit THEN p := start;
WHILE n > 0 DO Files.ReadInt(R, data); SYSTEM.PUT(p, data); INC(p, 4); DEC(n) END ; (*code*)
WHILE ~R.eof & (n > 0) DO Files.ReadInt(R, data); SYSTEM.PUT(p, data); INC(p, 4); DEC(n) END ; (*program code*)
Files.ReadString(R, name);
WHILE name[0] # 0X DO Files.ReadInt(R, data); Files.ReadString(R, name) END ; (*commands*)
WHILE ~R.eof & (name[0] # 0X) DO Files.ReadInt(R, data); Files.ReadString(R, name) END ; (*commands*)
Files.ReadInt(R, n); Files.Set(R, F, Files.Pos(R) + n*4); (*entries*)
Files.ReadInt(R, data);
WHILE data >= 0 DO Files.ReadInt(R, data) END ; (*pointer references*)
WHILE ~R.eof & (data >= 0) DO Files.ReadInt(R, data) END ; (*pointer references*)
Files.ReadInt(R, data);
WHILE data >= 0 DO Files.ReadInt(R, data) END ; (*procedure variable references*)
WHILE ~R.eof & (data >= 0) DO Files.ReadInt(R, data) END ; (*procedure variable references*)
Files.ReadInt(R, data); (*fixorgP*) Files.ReadInt(R, data); (*fixorgD*)
Files.ReadInt(R, data); (*fixorgT*) Files.ReadInt(R, data); (*fixorgM*)
Files.ReadInt(R, entry); (*body*) Files.ReadInt(R, data); (*final*)
Expand Down
15 changes: 8 additions & 7 deletions Sources/ORX.Mod
@@ -1,4 +1,4 @@
MODULE ORX; (*Oberon boot converter for RISC / AP 1.11.21 Extended Oberon*)
MODULE ORX; (*Oberon boot converter for RISC / AP 1.3.24 Extended Oberon*)
IMPORT Files, Texts, Oberon;
CONST CR = 0DX; noerr = 0; badfile = 4; (*copied from Modules for use as cross development tool*)

Expand All @@ -23,8 +23,9 @@ MODULE ORX; (*Oberon boot converter for RISC / AP 1.11.21 Extended Oberon*)
Files.Write(R, CR)
END WriteHex;

PROCEDURE OutCode(VAR R, R1: Files.Rider; write: Writer; VAR codelen, entry, res: INTEGER);
VAR n, data: INTEGER; ch: CHAR; b: BYTE; (*codelen in words, entry in bytes*)
PROCEDURE ExtractCode(VAR R, R1: Files.Rider; write: Writer; VAR codelen, entry, res: INTEGER);
VAR n, data: INTEGER; (*codelen in words, entry in bytes*)
ch: CHAR; b: BYTE;
F: Files.File;
name: ARRAY 32 OF CHAR;
BEGIN F := Files.Base(R); Files.ReadString(R, name); Files.ReadInt(R, data); (*key*)
Expand All @@ -48,7 +49,7 @@ MODULE ORX; (*Oberon boot converter for RISC / AP 1.11.21 Extended Oberon*)
Files.ReadInt(R, entry); (*body*) Files.ReadInt(R, data); (*final*)
Files.Read(R, ch);
IF ch # "O" THEN res := badfile ELSE res := noerr END
END OutCode;
END ExtractCode;

PROCEDURE WriteFile*; (*write code section of M.rsc in hex format to output file*)
VAR f, g: Files.File; Rf, Rg: Files.Rider;
Expand All @@ -63,7 +64,7 @@ MODULE ORX; (*Oberon boot converter for RISC / AP 1.11.21 Extended Oberon*)
IF f # NIL THEN
IF Files.Length(f) > 0 THEN
g := Files.New(S.s); Files.Set(Rf, f, 0); Files.Set(Rg, g, 0);
OutCode(Rf, Rg, WriteHex, codelen, entry, res);
ExtractCode(Rf, Rg, WriteHex, codelen, entry, res);
IF res = noerr THEN
filelen := ((codelen DIV 512) + 1) * 512; n := codelen;
WHILE n < filelen DO WriteHex(Rg, 0); INC(n) END ; (*zero-fill*)
Expand Down Expand Up @@ -94,7 +95,7 @@ MODULE ORX; (*Oberon boot converter for RISC / AP 1.11.21 Extended Oberon*)
IF f # NIL THEN
IF Files.Length(f) > 0 THEN
g := Files.New(S.s); Files.Set(Rf, f, 0); Files.Set(Rg, g, 0);
OutCode(Rf, Rg, Files.WriteInt, codelen, entry, res);
ExtractCode(Rf, Rg, Files.WriteInt, codelen, entry, res);
IF res = noerr THEN
Texts.WriteInt(W, codelen*4, 6); Texts.WriteInt(W, entry, 6);
Texts.WriteString(W, " done"); Files.Register(g)
Expand Down Expand Up @@ -156,5 +157,5 @@ MODULE ORX; (*Oberon boot converter for RISC / AP 1.11.21 Extended Oberon*)
EndLine; Oberon.Return(res)
END WriteStream;

BEGIN Texts.OpenWriter(W); Texts.WriteString(W, "OR boot converter AP 1.11.21"); EndLine
BEGIN Texts.OpenWriter(W); Texts.WriteString(W, "OR boot converter AP 1.3.24"); EndLine
END ORX.
19 changes: 10 additions & 9 deletions Sources/Oberon0.Mod
@@ -1,4 +1,4 @@
MODULE Oberon0; (*Oberon-0 command interpreter / AP 1.5.22 Extended Oberon*)
MODULE Oberon0; (*Oberon-0 command interpreter / AP 1.3.24 Extended Oberon*)
IMPORT SYSTEM, Kernel, Disk, FileDir, Files, Modules, RS232, PCLink0;
CONST swi = -60; (*switches*)
stat = -52; (*RS-232*)
Expand Down Expand Up @@ -257,32 +257,33 @@ MODULE Oberon0; (*Oberon-0 command interpreter / AP 1.5.22 Extended Oberon*)
END ClearDirectory;

PROCEDURE ExtractCode(F: Files.File; VAR code: ARRAY OF LONGINT; VAR codelen, entry, res: INTEGER);
VAR n, data: INTEGER; ch: CHAR; b: BYTE; (*codelen in words, entry in bytes*)
VAR n, data: INTEGER; (*codelen in words, entry in bytes*)
ch: CHAR; b: BYTE;
R: Files.Rider;
name: ARRAY 32 OF CHAR;
BEGIN Files.Set(R, F, 0); Files.ReadString(R, name); Files.ReadInt(R, data); (*key*)
Files.ReadByte(R, b); (*version*) Files.ReadInt(R, data); (*size*)
Files.ReadString(R, name); (*imports*)
WHILE name[0] # 0X DO Files.ReadInt(R, data); (*key*) Files.ReadString(R, name) END ;
WHILE ~R.eof & (name[0] # 0X) DO Files.ReadInt(R, data); (*key*) Files.ReadString(R, name) END ;
Files.ReadInt(R, n); (*variable space*)
Files.ReadInt(R, n); Files.Set(R, F, Files.Pos(R) + n); (*strings*)
Files.ReadInt(R, n); Files.Set(R, F, Files.Pos(R) + n); (*type descriptors*)
Files.ReadInt(R, codelen);
IF codelen > LEN(code) THEN res := Modules.nospace
ELSE n := 0;
WHILE n < codelen DO Files.ReadInt(R, data); code[n] := data; INC(n) END ; (*program code*)
IF codelen <= LEN(code) THEN n := 0;
WHILE ~R.eof & (n < codelen) DO Files.ReadInt(R, data); code[n] := data; INC(n) END ; (*program code*)
Files.ReadString(R, name);
WHILE name[0] # 0X DO Files.ReadInt(R, data); Files.ReadString(R, name) END ; (*commands*)
WHILE ~R.eof & (name[0] # 0X) DO Files.ReadInt(R, data); Files.ReadString(R, name) END ; (*commands*)
Files.ReadInt(R, n); Files.Set(R, F, Files.Pos(R) + n*4); (*entries*)
Files.ReadInt(R, data);
WHILE data >= 0 DO Files.ReadInt(R, data) END ; (*pointer references*)
WHILE ~R.eof & (data >= 0) DO Files.ReadInt(R, data) END ; (*pointer references*)
Files.ReadInt(R, data);
WHILE data >= 0 DO Files.ReadInt(R, data) END ; (*procedure variable references*)
WHILE ~R.eof & (data >= 0) DO Files.ReadInt(R, data) END ; (*procedure variable references*)
Files.ReadInt(R, data); (*fixorgP*) Files.ReadInt(R, data); (*fixorgD*)
Files.ReadInt(R, data); (*fixorgT*) Files.ReadInt(R, data); (*fixorgM*)
Files.ReadInt(R, entry); (*body*) Files.ReadInt(R, data); (*final*)
Files.Read(R, ch);
IF ch # "O" THEN res := Modules.badfile ELSE res := Modules.noerr END
ELSE res := Modules.nospace
END
END ExtractCode;

Expand Down

0 comments on commit 0a60b08

Please sign in to comment.