Added several more important forth functions
This commit is contained in:
parent
07fe743b2f
commit
2716530746
123
stage2/forth.s
123
stage2/forth.s
|
@ -45,6 +45,14 @@
|
||||||
ADDUI R13 R13 4 ; Increment Next
|
ADDUI R13 R13 4 ; Increment Next
|
||||||
JSR_COROUTINE R12 ; Jump to next thing
|
JSR_COROUTINE R12 ; Jump to next thing
|
||||||
|
|
||||||
|
;; DOCOL Function
|
||||||
|
;; The Interpreter for DO COLON
|
||||||
|
;; Jumps to NEXT
|
||||||
|
:DOCOL
|
||||||
|
PUSHR R13 R15 ; Push NEXT onto Return Stack
|
||||||
|
ADDUI R13 R12 4 ; Update NEXT to point to the instruction after itself
|
||||||
|
JUMP @NEXT ; Use NEXT
|
||||||
|
|
||||||
;; Some Forth primatives
|
;; Some Forth primatives
|
||||||
|
|
||||||
;; Drop
|
;; Drop
|
||||||
|
@ -653,6 +661,10 @@
|
||||||
&Emit_Entry ; Pointer to Emit
|
&Emit_Entry ; Pointer to Emit
|
||||||
&Word_Text ; Pointer to Name
|
&Word_Text ; Pointer to Name
|
||||||
NOP ; Flags
|
NOP ; Flags
|
||||||
|
CALLI R15 @Word_Direct ; Trick for direct calls
|
||||||
|
JSR_COROUTINE R11 ; NEXT
|
||||||
|
|
||||||
|
:Word_Direct
|
||||||
COPY R1 R7 ; Using designated IO
|
COPY R1 R7 ; Using designated IO
|
||||||
FALSE R2 ; Starting at index 0
|
FALSE R2 ; Starting at index 0
|
||||||
|
|
||||||
|
@ -696,7 +708,7 @@
|
||||||
CMPSKIPI.LE R2 0 ; If number of bytes is greater than 0
|
CMPSKIPI.LE R2 0 ; If number of bytes is greater than 0
|
||||||
ADDUI R2 R2 1 ; Add a null to end of string
|
ADDUI R2 R2 1 ; Add a null to end of string
|
||||||
ADD R8 R8 R2 ; Update HEAP pointer
|
ADD R8 R8 R2 ; Update HEAP pointer
|
||||||
JSR_COROUTINE R11 ; NEXT
|
RET R15
|
||||||
|
|
||||||
;; NUMBER
|
;; NUMBER
|
||||||
:Number_Text
|
:Number_Text
|
||||||
|
@ -819,5 +831,114 @@
|
||||||
PUSHR R3 R14 ; Push pointer or Zero onto parameter stack
|
PUSHR R3 R14 ; Push pointer or Zero onto parameter stack
|
||||||
JSR_COROUTINE R11 ; NEXT
|
JSR_COROUTINE R11 ; NEXT
|
||||||
|
|
||||||
|
;; >CFA
|
||||||
|
:TCFA_Text
|
||||||
|
">CFA"
|
||||||
|
:TCFA_Entry
|
||||||
|
&Find_Entry ; Pointer to Find
|
||||||
|
&TCFA_Text ; Pointer to Name
|
||||||
|
NOP ; Flags
|
||||||
|
POPR R0 R14 ; Get Node pointer
|
||||||
|
ADDUI R0 R0 12 ; Move to CFA
|
||||||
|
PUSHR R0 R14 ; Push the result
|
||||||
|
JSR_COROUTINE R11 ; NEXT
|
||||||
|
|
||||||
|
;; >DFA
|
||||||
|
:TDFA_Text
|
||||||
|
">DFA"
|
||||||
|
:TDFA_Entry
|
||||||
|
&TCFA_Entry ; Pointer to >CFA
|
||||||
|
&TDFA_Text ; Pointer to Name
|
||||||
|
NOP ; Flags
|
||||||
|
POPR R0 R14 ; Get Node pointer
|
||||||
|
ADDUI R0 R0 16 ; Move to DFA
|
||||||
|
PUSHR R0 R14 ; Push the result
|
||||||
|
JSR_COROUTINE R11 ; NEXT
|
||||||
|
|
||||||
|
;; CREATE
|
||||||
|
:Create_Text
|
||||||
|
"CREATE"
|
||||||
|
:Create_Entry
|
||||||
|
&TDFA_Entry ; Pointer to >DFA
|
||||||
|
&Create_Text ; Pointer to Name
|
||||||
|
NOP ; Flags
|
||||||
|
COPY R0 R8 ; Preserve HERE for next LATEST
|
||||||
|
PUSHR R9 R8 ; Store LATEST onto HEAP
|
||||||
|
POPR R1 R14 ; Get pointer to string
|
||||||
|
PUSHR R1 R8 ; Store string pointer onto HEAP
|
||||||
|
FALSE R1 ; Prepare NOP for Flag
|
||||||
|
PUSHR R1 R8 ; Push NOP Flag
|
||||||
|
MOVE R0 R9 ; Set LATEST
|
||||||
|
JSR_COROUTINE R11 ; NEXT
|
||||||
|
|
||||||
|
;; DEFINE
|
||||||
|
:Define_Text
|
||||||
|
"DEFINE"
|
||||||
|
:Define_Entry
|
||||||
|
&Create_Entry ; Pointer to Create
|
||||||
|
&Define_Text ; Pointer to Name
|
||||||
|
NOP ; Flags
|
||||||
|
CALLI R15 @Word_Direct ; Get Word
|
||||||
|
COPY R0 R8 ; Preserve HERE for next LATEST
|
||||||
|
PUSHR R9 R8 ; Store LATEST onto HEAP
|
||||||
|
POPR R1 R14 ; Get pointer to string
|
||||||
|
PUSHR R1 R8 ; Store string pointer onto HEAP
|
||||||
|
TRUE R1 ; Prepare HIDDEN for Flag
|
||||||
|
PUSHR R1 R8 ; Push HIDDEN Flag
|
||||||
|
LOADR R1 @Define_DOCOL ; Get address of DOCOL
|
||||||
|
PUSHR R1 R8 ; Push DOCOL Address onto HEAP
|
||||||
|
MOVE R9 R0 ; Set LATEST
|
||||||
|
LOADUI R10 1 ; Set STATE to Compile Mode
|
||||||
|
LOADUI R0 $EXIT ; Load pointer to EXIT
|
||||||
|
JSR_COROUTINE R0 ; EXIT
|
||||||
|
:Define_DOCOL
|
||||||
|
&DOCOL ; Store the address of DOCOL
|
||||||
|
|
||||||
|
;; COMA
|
||||||
|
:Comma_Text
|
||||||
|
","
|
||||||
|
:Comma_Entry
|
||||||
|
&Define_Entry ; Pointer to DEFINE
|
||||||
|
&Comma_Text ; Pointer to Name
|
||||||
|
NOP ; Flags
|
||||||
|
POPR R0 R14 ; Get top of parameter stack
|
||||||
|
PUSHR R0 R8 ; Push onto HEAP and increment HEAP pointer
|
||||||
|
JSR_COROUTINE R11 ; NEXT
|
||||||
|
|
||||||
|
;; [
|
||||||
|
:LBRAC_Text
|
||||||
|
"["
|
||||||
|
:LBRAC_Entry
|
||||||
|
&Comma_Entry ; Pointer to Comma
|
||||||
|
&LBRAC_Text ; Pointer to Name
|
||||||
|
NOP ; Flags
|
||||||
|
FALSE R10 ; Set STATE to Interpret Mode
|
||||||
|
JSR_COROUTINE R11 ; NEXT
|
||||||
|
|
||||||
|
;; ]
|
||||||
|
:RBRAC_Text
|
||||||
|
"]"
|
||||||
|
:RBRACK_Entry
|
||||||
|
&LBRAC_Entry ; Pointer to LBRAC
|
||||||
|
&RBRAC_Text ; Pointer to Name
|
||||||
|
NOP ; Flags
|
||||||
|
LOADUI R10 1 ; Set State to Compile Mode
|
||||||
|
JSR_COROUTINE R11 ; NEXT
|
||||||
|
|
||||||
|
;; ;
|
||||||
|
:SEMICOLON_Text
|
||||||
|
";"
|
||||||
|
:SEMICOLON_Entry
|
||||||
|
&RBRACK_Entry ; Pointer to RBRAC
|
||||||
|
&SEMICOLON_Text ; Pointer to Name
|
||||||
|
NOP ; Flags
|
||||||
|
LOADUI R0 $EXIT ; Get EXIT Pointer
|
||||||
|
PUSHR R0 R8 ; Push EXIT onto HEAP and increment HEAP pointer
|
||||||
|
FALSE R0 ; Prep NULL for Flag
|
||||||
|
STORE R0 R9 8 ; Set Flag
|
||||||
|
FALSE R10 ; Set State to Interpret Mode
|
||||||
|
LOADUI R0 $EXIT ; Load pointer to EXIT
|
||||||
|
JSR_COROUTINE R0 ; EXIT
|
||||||
|
|
||||||
:cold_start
|
:cold_start
|
||||||
;;
|
;;
|
||||||
|
|
Loading…
Reference in New Issue