if_literal and lookup
This commit is contained in:
parent
7a821a4eaf
commit
8405d3f863
|
|
@ -54,29 +54,21 @@ Mark II
|
||||||
]),[
|
]),[
|
||||||
% TermAddr has the address of the term record.
|
% TermAddr has the address of the term record.
|
||||||
% Now TERM has the term's record data and TermAddr has the address of the term.
|
% Now TERM has the term's record data and TermAddr has the address of the term.
|
||||||
mov(EXPR_addr, TEMP0),
|
mov(EXPR_addr, TEMP0)
|
||||||
% EXPR_addr now holds the address of the next cell of the expression list.
|
% EXPR_addr now holds the address of the next cell of the expression list.
|
||||||
|
],⟐([
|
||||||
% if_literal(TERM, PUSH),
|
if_literal(TERM, PUSH, TEMP0),
|
||||||
asr_imm(TEMP0, TERM, 30), % get just the two tag bits.
|
|
||||||
and_imm(TEMP0, TEMP0, 2), % mask the two tag bits.
|
|
||||||
sub_imm(TEMP0, TEMP0, 2), % if this is a symbol result is zero.
|
|
||||||
ne_offset(PUSH),
|
|
||||||
|
|
||||||
% 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), % Jump to command.
|
lookup(TERM, TEMP0) % Jump to command.
|
||||||
mov_imm_with_shift(TEMP0, 0x3fff), % TEMP0 = 0x3fffffff
|
]),[
|
||||||
ior_imm(TEMP0, TEMP0, 0xffff),
|
|
||||||
and(TEMP0, TEMP0, TERM),
|
|
||||||
do(TEMP0),
|
|
||||||
|
|
||||||
% going into push we have the term
|
% going into push we have the term
|
||||||
label(PUSH)],
|
label(PUSH)
|
||||||
% push2(TOS, TEMP1, SP), % stack = TERM, stack
|
% push2(TOS, TEMP1, SP), % stack = TERM, stack
|
||||||
|
],⟐(
|
||||||
⟐(incr(SP)),
|
incr(SP)
|
||||||
|
),[
|
||||||
% SP points to the future home of the new stack cell.
|
% SP points to the future home of the new stack cell.
|
||||||
[sub(TOS, TermAddr, SP), % TOS := &temp - sp
|
sub(TOS, TermAddr, SP), % TOS := &temp - sp
|
||||||
% Er, what if it's negative?
|
% Er, what if it's negative?
|
||||||
hi_offset(Bar0),
|
hi_offset(Bar0),
|
||||||
and_imm(TOS, TOS, 0x7fff), % Mask off high bits so
|
and_imm(TOS, TOS, 0x7fff), % Mask off high bits so
|
||||||
|
|
@ -162,6 +154,19 @@ language.
|
||||||
|
|
||||||
⟐(incr(SP)) --> [sub_imm(SP, SP, 4)]. % SP -= 1 (word, not byte).
|
⟐(incr(SP)) --> [sub_imm(SP, SP, 4)]. % SP -= 1 (word, not byte).
|
||||||
|
|
||||||
|
⟐(if_literal(TERM, Push, TEMP)) -->
|
||||||
|
[asr_imm(TEMP, TERM, 30), % get just the two tag bits.
|
||||||
|
and_imm(TEMP, TEMP, 2), % mask the two tag bits.
|
||||||
|
sub_imm(TEMP, TEMP, 2), % if this is a symbol result is zero.
|
||||||
|
ne_offset(Push)].
|
||||||
|
|
||||||
|
⟐(lookup(TERM, TEMP)) -->
|
||||||
|
% if it is a symbol the rest of it is the pointer to the machine code.
|
||||||
|
[mov_imm_with_shift(TEMP, 0x3fff), % TEMP = 0x3fffffff
|
||||||
|
ior_imm(TEMP, TEMP, 0xffff),
|
||||||
|
and(TEMP, TEMP, TERM),
|
||||||
|
do(TEMP)]. % Jump to command.
|
||||||
|
|
||||||
|
|
||||||
do :-
|
do :-
|
||||||
compile_program(Binary),
|
compile_program(Binary),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue