WIth push2 finished that's the mainloop converted.
This commit is contained in:
parent
65d55cf7b4
commit
3f843ed4cc
|
|
@ -132,10 +132,12 @@ CPUs.)
|
|||
% has a copy of the address of the record.
|
||||
split_pair(TERM, TEMP1, EXPR, TEMP0),
|
||||
% Now Term has the term's record data and temp1 has the address of the term.
|
||||
% temp0 still has the address of the expression record.
|
||||
if_literal(TERM, PUSH),
|
||||
% if it is a symbol the rest of it is the pointer to the machine code.
|
||||
lookup(TERM), % Jump to command.
|
||||
label(PUSH), push(TOS, TERM, SP), % stack = TERM, stack
|
||||
% going in to push we have the term
|
||||
label(PUSH), push2(TOS, TEMP1, SP), % stack = TERM, stack
|
||||
label(DONE), write_ram(SP, TOS), % RAM[SP] := TOS
|
||||
jump(MAIN)
|
||||
|Ts]) -->
|
||||
|
|
@ -286,6 +288,12 @@ language.
|
|||
ior(TOS, TOS, SP), % TOS := TOS | SP
|
||||
add_imm(SP, SP, 4)]. % SP += 1 (word, not byte)
|
||||
|
||||
⟐(push2(TOS, TERMADDR, SP)) -->
|
||||
[sub_imm(SP, SP, 4), % SP -= 1 (word, not byte)
|
||||
sub(TOS, TERMADDR, SP), % TOS := &temp - sp
|
||||
lsl_imm(TOS, TOS, 15), % TOS := TOS << 15
|
||||
ior(TOS, TOS, 4)]. % TOS := TOS | 4
|
||||
|
||||
⟐( write_ram(To, From)) --> [store_word(From, To, 0)].
|
||||
⟐(write_cell(From, SP)) --> [add_imm(SP, SP, 4), store_word(From, SP, 0)].
|
||||
|
||||
|
|
|
|||
|
|
@ -112,3 +112,45 @@ lookup(DICT_PTR, DICT_TOP, TERM, HALT)
|
|||
It turns out that you don;t need anything but the record since it's
|
||||
already been looked up. The symbol contains the jump address.
|
||||
|
||||
|
||||
|
||||
Next, push
|
||||
|
||||
push(TOS, TERM, SP)
|
||||
|
||||
There's a note saying
|
||||
|
||||
set(sp, 2), % Reg 2 points to just under top of stack.
|
||||
|
||||
But I've forgotten if that's exactly true. I want to just point to TOS
|
||||
pair record in SP. If that's the case, then the PUSH operation is:
|
||||
|
||||
Since the record we are constructing is going to have the rest of the
|
||||
stack as its tail and it's going to be written to the next word in RAM
|
||||
after (before) the SP (the address of the stack/tail) the offset is +4.
|
||||
|
||||
The address of the term is in a register, the address of the pair record
|
||||
that we are contrsucting will be SP - 4, to get the offset we have to
|
||||
subtract that from the term's address. Since we need it anyway, and
|
||||
we're going to do it sooner or later, let's subtract 4 from the SP right
|
||||
off:
|
||||
|
||||
sp = sp - 4
|
||||
|
||||
Then we can use it to calculate the offset and put it in tos:
|
||||
|
||||
tos = &temp - sp
|
||||
tos = tos << 15
|
||||
|
||||
If I was as slick as I like to pretend I would insert a check here that
|
||||
the two high bits are indeed 00. ...
|
||||
|
||||
With the offset of the term in the tos register already we just have to
|
||||
OR 4:
|
||||
|
||||
tos = tos | 4
|
||||
|
||||
And write it to the (already decremented) sp.
|
||||
|
||||
ram[sp] = tos
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue