Emit a sort of symbol table.
This commit is contained in:
parent
4a1770b1cc
commit
ff69046a4c
|
|
@ -33,7 +33,7 @@ Mark II
|
||||||
word(0), % Zero root cell.
|
word(0), % Zero root cell.
|
||||||
do_offset(Reset), % Oberon bootloader writes MemLim to RAM[12] and
|
do_offset(Reset), % Oberon bootloader writes MemLim to RAM[12] and
|
||||||
allocate(_, 20), % stackOrg to RAM[24], we don't need these
|
allocate(_, 20), % stackOrg to RAM[24], we don't need these
|
||||||
label(Reset), % but they must not be allowed to corrupt our code.
|
label(reset, Reset), % but they must not be allowed to corrupt our code.
|
||||||
|
|
||||||
mov_imm(0, 0), % zero out the root cell. (After reset.)
|
mov_imm(0, 0), % zero out the root cell. (After reset.)
|
||||||
store_word(0, 0, 0),
|
store_word(0, 0, 0),
|
||||||
|
|
@ -44,7 +44,7 @@ Mark II
|
||||||
mov_imm(TERM, 0),
|
mov_imm(TERM, 0),
|
||||||
store_word(TOS, SP, 0) % RAM[SP] := 0
|
store_word(TOS, SP, 0) % RAM[SP] := 0
|
||||||
],⟐([
|
],⟐([
|
||||||
label(Main), % Mainloop.
|
label(main, Main), % Mainloop.
|
||||||
if_zero(EXPR_addr, HALT),
|
if_zero(EXPR_addr, HALT),
|
||||||
load(EXPR, EXPR_addr),
|
load(EXPR, EXPR_addr),
|
||||||
% At this point EXPR holds the record word of the expression.
|
% At this point EXPR holds the record word of the expression.
|
||||||
|
|
@ -58,7 +58,7 @@ Mark II
|
||||||
% if it is a symbol the rest of it is the pointer to the machine code.
|
% if it is a symbol the rest of it is the pointer to the machine code.
|
||||||
lookup(TERM, TEMP0), % Jump to command.
|
lookup(TERM, TEMP0), % Jump to command.
|
||||||
% going into push we have the term
|
% going into push we have the term
|
||||||
label(PUSH),
|
label(push, PUSH),
|
||||||
% push2(TOS, TEMP1, SP), % stack = TERM, stack
|
% push2(TOS, TEMP1, SP), % stack = TERM, stack
|
||||||
incr(SP),
|
incr(SP),
|
||||||
if_zero(TermAddr, JustPushEmptyList)
|
if_zero(TermAddr, JustPushEmptyList)
|
||||||
|
|
@ -74,11 +74,11 @@ Mark II
|
||||||
lsl_imm(TOS, TOS, 15), % TOS := TOS << 15
|
lsl_imm(TOS, TOS, 15), % TOS := TOS << 15
|
||||||
ior_imm(TOS, TOS, 4), % TOS := TOS | 4
|
ior_imm(TOS, TOS, 4), % TOS := TOS | 4
|
||||||
do_offset(Done),
|
do_offset(Done),
|
||||||
label(JustPushEmptyList),
|
label(jpel, JustPushEmptyList),
|
||||||
mov_imm(TOS, 4), % TOS is a pair record with 0 as the head addr
|
mov_imm(TOS, 4), % TOS is a pair record with 0 as the head addr
|
||||||
% and the previous word in RAM as tail addr.
|
% and the previous word in RAM as tail addr.
|
||||||
|
|
||||||
label(Done),
|
label(done, Done),
|
||||||
store_word(TOS, SP, 0), % RAM[SP] := TOS
|
store_word(TOS, SP, 0), % RAM[SP] := TOS
|
||||||
do_offset(Main)
|
do_offset(Main)
|
||||||
|
|
||||||
|
|
@ -86,7 +86,7 @@ Mark II
|
||||||
|
|
||||||
halt(HALT),
|
halt(HALT),
|
||||||
|
|
||||||
definition(Cons), % ======================================
|
definition(cons, Cons), % ======================================
|
||||||
|
|
||||||
unpack_pair(TOS, TEMP0, TOS, SP),
|
unpack_pair(TOS, TEMP0, TOS, SP),
|
||||||
% TEMP0 = Address of the list to which to append.
|
% TEMP0 = Address of the list to which to append.
|
||||||
|
|
@ -105,11 +105,11 @@ Mark II
|
||||||
chain_link(TOS, TEMP3),
|
chain_link(TOS, TEMP3),
|
||||||
jump(Done), % Rely on mainloop::Done to write TOS to RAM.
|
jump(Done), % Rely on mainloop::Done to write TOS to RAM.
|
||||||
|
|
||||||
definition(Dup), % ======================================
|
definition(dup, Dup), % ======================================
|
||||||
head_addr(TOS, TermAddr),
|
head_addr(TOS, TermAddr),
|
||||||
jump(PUSH),
|
jump(PUSH),
|
||||||
|
|
||||||
definition(I), % ======================================
|
definition(i, I), % ======================================
|
||||||
unpack_pair(TOS, TEMP0, TOS, SP),
|
unpack_pair(TOS, TEMP0, TOS, SP),
|
||||||
% TEMP0 = Address of the quoted program.
|
% TEMP0 = Address of the quoted program.
|
||||||
% TOS = Address of the stack tail.
|
% TOS = Address of the stack tail.
|
||||||
|
|
@ -149,11 +149,11 @@ Mark II
|
||||||
sub_base_merge_and_store(TEMP0, TEMP1, SP),
|
sub_base_merge_and_store(TEMP0, TEMP1, SP),
|
||||||
jump(Main), % We already wrote the stack cell so 'Main' not 'Done'.
|
jump(Main), % We already wrote the stack cell so 'Main' not 'Done'.
|
||||||
|
|
||||||
definition(New), % ======================================
|
definition(new, New), % ======================================
|
||||||
asm(mov_imm(TermAddr, 0)), % Rely on push machinery.
|
asm(mov_imm(TermAddr, 0)), % Rely on push machinery.
|
||||||
jump(PUSH),
|
jump(PUSH),
|
||||||
|
|
||||||
definition(Swap), % ======================================
|
definition(swap, Swap), % ======================================
|
||||||
unpack_pair(TOS, TEMP0, TEMP1, SP),
|
unpack_pair(TOS, TEMP0, TEMP1, SP),
|
||||||
% TEMP0 = Address of the first item on the stack.
|
% TEMP0 = Address of the first item on the stack.
|
||||||
% TEMP1 = Address of the stack tail.
|
% TEMP1 = Address of the stack tail.
|
||||||
|
|
@ -169,11 +169,11 @@ Mark II
|
||||||
merge_and_store(TEMP3, TEMP0, SP), % Push second item onto stack.
|
merge_and_store(TEMP3, TEMP0, SP), % Push second item onto stack.
|
||||||
jump(Main),
|
jump(Main),
|
||||||
|
|
||||||
definition(Unit, [New, Cons], DoDef, TOS),
|
definition(unit, Unit, [New, Cons], DoDef, TOS),
|
||||||
definition(X, [Dup, I], DoDef, TOS),
|
definition(x, X, [Dup, I], DoDef, TOS),
|
||||||
definition(Swons, [Swap, Cons], DoDef, TOS),
|
definition(swons, Swons, [Swap, Cons], DoDef, TOS),
|
||||||
|
|
||||||
label(DoDef), % TOS points to body expr, set by definition.
|
label(dodef, DoDef), % TOS points to body expr, set by definition.
|
||||||
asm(mov_imm(TEMP1, 4)), % Used for linking to previous cell.
|
asm(mov_imm(TEMP1, 4)), % Used for linking to previous cell.
|
||||||
incr(SP),
|
incr(SP),
|
||||||
sub_base_from_offset(TOS, SP),
|
sub_base_from_offset(TOS, SP),
|
||||||
|
|
@ -183,7 +183,7 @@ Mark II
|
||||||
asm(do(TEMP1)),
|
asm(do(TEMP1)),
|
||||||
|
|
||||||
% ======================================
|
% ======================================
|
||||||
label(Expression),
|
label(expression, Expression),
|
||||||
dexpr([New, Dup, Swons, I])
|
dexpr([New, Dup, Swons, I])
|
||||||
]).
|
]).
|
||||||
|
|
||||||
|
|
@ -221,6 +221,7 @@ language.
|
||||||
⟐(load(From, To)) --> [load_word(From, To, 0)].
|
⟐(load(From, To)) --> [load_word(From, To, 0)].
|
||||||
|
|
||||||
⟐(label(L)) --> [label(L)]. % Pass through.
|
⟐(label(L)) --> [label(L)]. % Pass through.
|
||||||
|
⟐(label(Name, L)) --> [label(Name, L)]. % Pass through.
|
||||||
⟐(dexpr(L)) --> dexpr(L). % Pass through.
|
⟐(dexpr(L)) --> dexpr(L). % Pass through.
|
||||||
|
|
||||||
⟐(jump(To)) --> [do_offset(To)]. % Pass through.
|
⟐(jump(To)) --> [do_offset(To)]. % Pass through.
|
||||||
|
|
@ -256,9 +257,9 @@ language.
|
||||||
[mov_imm_with_shift(In, 2), % In := 4 << 15
|
[mov_imm_with_shift(In, 2), % In := 4 << 15
|
||||||
ior(In, In, Term)].
|
ior(In, In, Term)].
|
||||||
|
|
||||||
⟐(definition(Name)) --> [label(Name), symbol(Name)].
|
⟐(definition(Name, Label)) --> [label(Name, Label), symbol(Label)].
|
||||||
|
|
||||||
⟐(definition(Name, Body, DoDef, TEMP)) --> ⟐(definition(Name)),
|
⟐(definition(Name, Label, Body, DoDef, TEMP)) --> ⟐(definition(Name, Label)),
|
||||||
[mov_imm(TEMP, BodyList),
|
[mov_imm(TEMP, BodyList),
|
||||||
do_offset(DoDef),
|
do_offset(DoDef),
|
||||||
label(BodyList)],
|
label(BodyList)],
|
||||||
|
|
@ -340,6 +341,7 @@ linker(ASM) --> enumerate_asm(ASM, 0, _).
|
||||||
enumerate_asm( [], N, N) --> !, [].
|
enumerate_asm( [], N, N) --> !, [].
|
||||||
enumerate_asm( [Term|Terms], N, M) --> !, enumerate_asm(Term, N, O), enumerate_asm(Terms, O, M).
|
enumerate_asm( [Term|Terms], N, M) --> !, enumerate_asm(Term, N, O), enumerate_asm(Terms, O, M).
|
||||||
enumerate_asm( label(N) , N, N) --> !, [].
|
enumerate_asm( label(N) , N, N) --> !, [].
|
||||||
|
enumerate_asm( label(Name, N) , N, N) --> !, [], {writeln(Name-N)}. % Emit "symbol table" by side-effect.
|
||||||
enumerate_asm(allocate(N, Bytes), N, M) --> !, {Bits is 8 * Bytes}, [skip(Bits)], {align(N, Bytes, M)}.
|
enumerate_asm(allocate(N, Bytes), N, M) --> !, {Bits is 8 * Bytes}, [skip(Bits)], {align(N, Bytes, M)}.
|
||||||
enumerate_asm( Instr, N, M) --> [(Z, Instr)], {align(N, 0, Z), align(Z, 4, M)}.
|
enumerate_asm( Instr, N, M) --> [(Z, Instr)], {align(N, 0, Z), align(Z, 4, M)}.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
reset-28
|
||||||
|
main-56
|
||||||
|
push-140
|
||||||
|
jpel-176
|
||||||
|
done-180
|
||||||
|
cons-192
|
||||||
|
dup-344
|
||||||
|
i-360
|
||||||
|
new-628
|
||||||
|
swap-640
|
||||||
|
unit-800
|
||||||
|
x-820
|
||||||
|
swons-840
|
||||||
|
dodef-860
|
||||||
|
expression-908
|
||||||
Loading…
Reference in New Issue