[Oberon] Standalone BootLoader format
JR
joerg.straube at iaeth.ch
Thu May 14 15:59:32 CEST 2020
Tomas
PROCEDURE Close*; (* added SB *)
BEGIN Put1(Mov, 0, 0, 0); Put3(0, 7, 0); (* setting SB *) Put1(Mov, SB, 0, (pc+8)*4);
END Close;
Are you sure, Close() is a good place to initialize SB?
Try to find out, when your added instruction is executed.
br
Jörg
> Am 14.05.2020 um 15:08 schrieb Tomas Kral <thomas.kral at email.cz>:
>
>> Prof. Wirth's compilers store instructions into an array
>> 0..(pc-1) and pc is reported as the size.
>
> Yes, and I try setting SB pointing to pc when storing this array to
> file. This mimics what RISC.Mod emulator does R[13] := pc*4 prior
> execution.
>
>> the first
>> instruction is a branch to the body over any procedures
>> there are a further seven instructions reserved, e.g. for a branch
>> when using interrupts in a von-Neumann (as opposed to modified >
>> Harvard) setup.
>
> Actually I thought we are branching over boot limits, did not know about
> interrupts in a von-Neumann
>
> 0 A branch instruction to the initializing body of module Modules (* set by OLR.Link *)
> 12 The limit of available memory
> 16 The address of the end of the module space loaded
> 20 The current root of the links of loaded modules
> 24 The current limit of the module area
>
>> Note that the serial bootfile format is different from
>> See BootLoad.Mod for details.
>
> Yes, now it works. But I have two jumps, not neat, but with more
> understanding, I can improve further, to have a single branch.
>
> 0 E7000007 B 7 (* currently hardcoded *)
> 1 00000000 (* boot limit area *)
> 2 00000000 (* 7 words *)
> 3 00000000
> 4 00000000
> 5 00000000
> 6 00000000
> 7 00000000
> (* setting SB past the code block *)
> 8 4D000090 MOV SB R0 144
> (* branch over procedures, no procedures := 0 *)
> 9 E7000000 B 0
> 10 40000000 MOV R0 R0 0
> 11 A0D00008 STW R0 SB 8
> 12 80D00008 LDW R0 SB 8
> 13 5100FFC4 MOV R1 R0 -60
> 14 A0100000 STW R0 R1 0
> 15 400003E8 MOV R0 R0 1000
> 16 A0D00000 STW R0 SB 0
> 17 400003E8 MOV R0 R0 1000
> 18 A0D00004 STW R0 SB 4
> 19 80D00004 LDW R0 SB 4
> 20 40090001 SUB R0 R0 1
> 21 A0D00004 STW R0 SB 4
> 22 80D00004 LDW R0 SB 4
> 23 40090000 SUB R0 R0 0
> 24 E9FFFFFA BNE -6
> 25 80D00000 LDW R0 SB 0
> 26 40090001 SUB R0 R0 1
> 27 A0D00000 STW R0 SB 0
> 28 80D00000 LDW R0 SB 0
> 29 40090000 SUB R0 R0 0
> 30 E9FFFFF2 BNE -14
> 31 80D00008 LDW R0 SB 8
> 32 40080001 ADD R0 R0 1
> 33 A0D00008 STW R0 SB 8
> 34 E7FFFFE9 B -23
> 35 40000000 MOV R0 R0 0
> 36 C7000000 B R0
>
> PROCEDURE Close*; (* added SB *)
> BEGIN Put1(Mov, 0, 0, 0); Put3(0, 7, 0); (* setting SB *) Put1(Mov, SB, 0, (pc+8)*4);
> END Close;
>
> In the OSG.Mod there is a `dc := 0' what is the meaning; Code displacement???
> Perhaps I could learn to use.
>
> PROCEDURE StoreBoot*;
> VAR F: Files.File; R: Files.Rider; i: INTEGER;
> BEGIN
> F := Files.New("Risc.bin"); Files.Set(R, F, 0);
> Texts.WriteString(W, "store Risc.bin"); Texts.Append(Oberon.Log, W.buf);
> Files.WriteInt(R, 0E7000007H); (* B 7 relative*)
> FOR i := 1 TO 7 DO Files.WriteInt(R, 0H) END ; (* 7 words reserved *)
> Files.WriteInt(R, code[pc-1]); DEC(pc);
> i := 0; REPEAT Files.WriteInt(R, code[i]); INC(i)
> UNTIL i = pc; Files.Register(F);
> Texts.WriteString(W, " done.");
> Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
> END StoreBoot;
>
> --
> Tomas Kral <thomas.kral at email.cz>
> --
> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
> https://lists.inf.ethz.ch/mailman/listinfo/oberon
More information about the Oberon
mailing list