|
|
@@ -5,32 +5,45 @@ |
|
|
|
.equ PADDING 0x20 |
|
|
|
; Offset of the code link relative to the beginning of the word |
|
|
|
.equ CODELINK_OFFSET 10 |
|
|
|
; When set, the interpret should quit |
|
|
|
.equ FLAG_ENDPGM 1 |
|
|
|
|
|
|
|
; *** Variables *** |
|
|
|
.equ INITIAL_SP FORTH_RAMSTART |
|
|
|
.equ CURRENT @+2 |
|
|
|
.equ HERE @+2 |
|
|
|
.equ INPUTPOS @+2 |
|
|
|
.equ FORTH_RAMEND @+2 |
|
|
|
.equ FLAGS @+2 |
|
|
|
.equ FORTH_RAMEND @+1 |
|
|
|
|
|
|
|
; *** Code *** |
|
|
|
MAIN: |
|
|
|
.dw compiledWord |
|
|
|
.dw INTERPRET+CODELINK_OFFSET |
|
|
|
.dw ENDPGM |
|
|
|
.dw CHKEND |
|
|
|
|
|
|
|
ENDPGM: |
|
|
|
; If FLAG_ENDPGM is set, stop the program, else, tweak the RS so that we loop. |
|
|
|
CHKEND: |
|
|
|
.dw nativeWord |
|
|
|
ld hl, FLAGS |
|
|
|
bit FLAG_ENDPGM, (hl) |
|
|
|
jr nz, .endpgm |
|
|
|
; not quitting, loop |
|
|
|
jr forthLoop |
|
|
|
.endpgm: |
|
|
|
ld sp, (INITIAL_SP) |
|
|
|
xor a |
|
|
|
ret |
|
|
|
|
|
|
|
forthMain: |
|
|
|
xor a |
|
|
|
ld (FLAGS), a |
|
|
|
ld (INITIAL_SP), sp |
|
|
|
ld hl, DOT ; last entry in hardcoded dict |
|
|
|
ld (CURRENT), hl |
|
|
|
ld hl, FORTH_RAMEND |
|
|
|
ld (HERE), hl |
|
|
|
forthLoop: |
|
|
|
ld ix, RS_ADDR |
|
|
|
ld iy, MAIN |
|
|
|
jp executeCodeLink |