Fix comment spacing and added Return stack operations
This commit is contained in:
parent
968f5852bf
commit
eea718599e
627
stage2/forth.s
627
stage2/forth.s
|
@ -21,11 +21,11 @@
|
|||
;; Loads contents of tape_01
|
||||
;; Starts interface until Halted
|
||||
:start
|
||||
LOADUI R15 1 ; Since 1MB can't fit in 16 bits
|
||||
SL0I R15 20 ; 1 shifted 20 bits should do the trick
|
||||
LOADUI R14 3 ; Since 1.5MB can't fit into 16 bits
|
||||
SL0I R14 19 ; 3 shifted 19 bits should do the trick
|
||||
LOADUI R11 $NEXT ; Get Address of Next
|
||||
LOADUI R15 1 ; Since 1MB can't fit in 16 bits
|
||||
SL0I R15 20 ; 1 shifted 20 bits should do the trick
|
||||
LOADUI R14 3 ; Since 1.5MB can't fit into 16 bits
|
||||
SL0I R14 19 ; 3 shifted 19 bits should do the trick
|
||||
LOADUI R11 $NEXT ; Get Address of Next
|
||||
CALLI R15 @cold_start
|
||||
HALT
|
||||
|
||||
|
@ -40,9 +40,9 @@
|
|||
;; Jumps to updated current
|
||||
;; Affects only Next and current
|
||||
:NEXT
|
||||
LOAD R12 R13 0 ; Get Address stored which is pointed at by next
|
||||
ADDUI R13 R13 4 ; Increment Next
|
||||
JSR_COROUTINE R12 ; Jump to next thing
|
||||
LOAD R12 R13 0 ; Get Address stored which is pointed at by next
|
||||
ADDUI R13 R13 4 ; Increment Next
|
||||
JSR_COROUTINE R12 ; Jump to next thing
|
||||
|
||||
;; Some Forth primatives
|
||||
|
||||
|
@ -50,108 +50,108 @@
|
|||
:Drop_Text
|
||||
"DROP"
|
||||
:Drop_Entry
|
||||
NOP ; No previous link elements
|
||||
&Drop_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Drop Top of stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
NOP ; No previous link elements
|
||||
&Drop_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Drop Top of stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; SWAP
|
||||
:Swap_Text
|
||||
"SWAP"
|
||||
:Swap_Entry
|
||||
&Drop_Entry ; Pointer to Drop
|
||||
&Swap_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
&Drop_Entry ; Pointer to Drop
|
||||
&Swap_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14
|
||||
POPR R1 R14
|
||||
PUSHR R0 R14
|
||||
PUSHR R1 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; DUP
|
||||
:Dup_Text
|
||||
"DUP"
|
||||
:Dup_Entry
|
||||
&Swap_Entry ; Pointer to Swap
|
||||
&Dup_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
LOAD R0 R14 0 ; Get top of stack
|
||||
PUSHR R0 R14 ; Push copy onto it
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&Swap_Entry ; Pointer to Swap
|
||||
&Dup_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
LOAD R0 R14 0 ; Get top of stack
|
||||
PUSHR R0 R14 ; Push copy onto it
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; OVER
|
||||
:Over_Text
|
||||
"OVER"
|
||||
:Over_Entry
|
||||
&Dup_Entry ; Pointer to DUP
|
||||
&Over_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
LOAD R0 R14 -4 ; Get second from Top of stack
|
||||
PUSHR R0 R14 ; Push it onto top of stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&Dup_Entry ; Pointer to DUP
|
||||
&Over_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
LOAD R0 R14 -4 ; Get second from Top of stack
|
||||
PUSHR R0 R14 ; Push it onto top of stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; ROT
|
||||
:Rot_Text
|
||||
"ROT"
|
||||
:Rot_Entry
|
||||
&Over_Entry ; Pointer to Over
|
||||
&Rot_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
&Over_Entry ; Pointer to Over
|
||||
&Rot_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14
|
||||
POPR R1 R14
|
||||
POPR R2 R14
|
||||
PUSHR R1 R14
|
||||
PUSHR R0 R14
|
||||
PUSHR R2 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; -ROT
|
||||
:-Rot_Text
|
||||
"-ROT"
|
||||
:-Rot_Entry
|
||||
&Rot_Entry ; Pointer to ROT
|
||||
&-Rot_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
&Rot_Entry ; Pointer to ROT
|
||||
&-Rot_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14
|
||||
POPR R1 R14
|
||||
POPR R2 R14
|
||||
PUSHR R0 R14
|
||||
PUSHR R2 R14
|
||||
PUSHR R1 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; 2DROP
|
||||
:2Drop_Text
|
||||
"2DROP"
|
||||
:2Drop_Entry
|
||||
&-Rot_Entry ; Pointer to -ROT
|
||||
&2Drop_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
&-Rot_Entry ; Pointer to -ROT
|
||||
&2Drop_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14
|
||||
POPR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; 2DUP
|
||||
:2Dup_Text
|
||||
"2DUP"
|
||||
:2Dup_Entry
|
||||
&2Drop_Entry ; Pointer to 2Drop
|
||||
&2Dup_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
LOAD R0 R14 0 ; Get top of stack
|
||||
LOAD R1 R14 -4 ; Get second on stack
|
||||
&2Drop_Entry ; Pointer to 2Drop
|
||||
&2Dup_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
LOAD R0 R14 0 ; Get top of stack
|
||||
LOAD R1 R14 -4 ; Get second on stack
|
||||
PUSHR R1 R14
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; 2SWAP
|
||||
:2Swap_Text
|
||||
"2Swap"
|
||||
:2Swap_Entry
|
||||
&2Dup_Entry ; Pointer to 2Dup
|
||||
&2Swap_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
&2Dup_Entry ; Pointer to 2Dup
|
||||
&2Swap_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14
|
||||
POPR R1 R14
|
||||
POPR R2 R14
|
||||
|
@ -160,251 +160,251 @@
|
|||
PUSHR R0 R14
|
||||
PUSHR R3 R14
|
||||
PUSHR R2 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
|
||||
;; ?DUP
|
||||
:QDup_Text
|
||||
"?DUP"
|
||||
:QDup_Entry
|
||||
&2Swap_Entry ; Pointer to 2Swap
|
||||
&QDup_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
LOAD R0 R14 0 ; Get Top of stack
|
||||
CMPSKIPI.E R0 0 ; Skip if Zero
|
||||
PUSHR R0 R14 ; Duplicate value
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&2Swap_Entry ; Pointer to 2Swap
|
||||
&QDup_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
LOAD R0 R14 0 ; Get Top of stack
|
||||
CMPSKIPI.E R0 0 ; Skip if Zero
|
||||
PUSHR R0 R14 ; Duplicate value
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; +
|
||||
:Add_Text
|
||||
"+"
|
||||
:Add_Entry
|
||||
&QDup_Entry ; Pointer to ?Dup
|
||||
&Add_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Get top of stack
|
||||
POPR R1 R14 ; Get second item on Stack
|
||||
ADD R0 R0 R1 ; Perform the addition
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&QDup_Entry ; Pointer to ?Dup
|
||||
&Add_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Get top of stack
|
||||
POPR R1 R14 ; Get second item on Stack
|
||||
ADD R0 R0 R1 ; Perform the addition
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; -
|
||||
:Sub_Text
|
||||
"-"
|
||||
:Sub_Entry
|
||||
&Add_Entry ; Pointer to +
|
||||
&Sub_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14
|
||||
POPR R1 R14
|
||||
SUB R0 R0 R1
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&Add_Entry ; Pointer to +
|
||||
&Sub_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Get top of stack
|
||||
POPR R1 R14 ; Get second item on Stack
|
||||
SUB R0 R0 R1 ; Perform the subtraction
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; MUL
|
||||
:MUL_Text
|
||||
"*"
|
||||
:MUL_Entry
|
||||
&Sub_Entry ; Pointer to -
|
||||
&MUL_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14
|
||||
POPR R1 R14
|
||||
MUL R0 R0 R1
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&Sub_Entry ; Pointer to -
|
||||
&MUL_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Get top of stack
|
||||
POPR R1 R14 ; Get second item on Stack
|
||||
MUL R0 R0 R1 ; Perform the multiplication and keep bottom half
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; MULH
|
||||
:MULH_Text
|
||||
"MULH"
|
||||
:MULH_Entry
|
||||
&MUL_Entry ; Pointer to *
|
||||
&MULH_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14
|
||||
POPR R1 R14
|
||||
MULH R0 R0 R1
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&MUL_Entry ; Pointer to *
|
||||
&MULH_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Get top of stack
|
||||
POPR R1 R14 ; Get second item on Stack
|
||||
MULH R0 R0 R1 ; Perform multiplcation and keep top half
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; /
|
||||
:DIV_Text
|
||||
"/"
|
||||
:DIV_Entry
|
||||
&MULH_Entry ; Pointer to MULH
|
||||
&DIV_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14
|
||||
POPR R1 R14
|
||||
DIV R0 R0 R1
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&MULH_Entry ; Pointer to MULH
|
||||
&DIV_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Get top of stack
|
||||
POPR R1 R14 ; Get second item on Stack
|
||||
DIV R0 R0 R1 ; Perform division and keep top half
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; %
|
||||
:MOD_Text
|
||||
"%"
|
||||
:MOD_Entry
|
||||
&DIV_Entry ; Pointer to /
|
||||
&MOD_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14
|
||||
POPR R1 R14
|
||||
MOD R0 R0 R1
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&DIV_Entry ; Pointer to /
|
||||
&MOD_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Get top of stack
|
||||
POPR R1 R14 ; Get second item on Stack
|
||||
MOD R0 R0 R1 ; Perform division and keep remainder
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; =
|
||||
:Equal_Text
|
||||
"="
|
||||
:Equal_Entry
|
||||
&MOD_Entry ; Pointer to %
|
||||
&Equal_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R1 R14
|
||||
POPR R2 R14
|
||||
FALSE R0 ; Assume comparision is True
|
||||
CMPSKIP.E R1 R2 ; Check if they are equal and skip if they are
|
||||
TRUE R0 ; Looks like our assumption was wrong
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&MOD_Entry ; Pointer to %
|
||||
&Equal_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R1 R14 ; Get top of stack
|
||||
POPR R2 R14 ; Get second item on Stack
|
||||
FALSE R0 ; Assume comparision is True
|
||||
CMPSKIP.E R1 R2 ; Check if they are equal and skip if they are
|
||||
TRUE R0 ; Looks like our assumption was wrong
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; !=
|
||||
:NEqual_Text
|
||||
"!="
|
||||
:NEqual_Entry
|
||||
&Equal_Entry ; Pointer to =
|
||||
&NEqual_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R1 R14
|
||||
POPR R2 R14
|
||||
FALSE R0 ; Assume comparision is True
|
||||
CMPSKIP.NE R1 R2 ; Check if they are not equal and skip if they are
|
||||
TRUE R0 ; Looks like our assumption was wrong
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&Equal_Entry ; Pointer to =
|
||||
&NEqual_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R1 R14 ; Get top of stack
|
||||
POPR R2 R14 ; Get second item on Stack
|
||||
FALSE R0 ; Assume comparision is True
|
||||
CMPSKIP.NE R1 R2 ; Check if they are not equal and skip if they are
|
||||
TRUE R0 ; Looks like our assumption was wrong
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; <
|
||||
:Less_Text
|
||||
"<"
|
||||
:Less_Entry
|
||||
&NEqual_Entry ; Pointer to !=
|
||||
&Less_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R1 R14
|
||||
POPR R2 R14
|
||||
FALSE R0 ; Assume comparision is True
|
||||
CMPSKIP.L R1 R2 ; Check if less than and skip if they are
|
||||
TRUE R0 ; Looks like our assumption was wrong
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&NEqual_Entry ; Pointer to !=
|
||||
&Less_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R1 R14 ; Get top of stack
|
||||
POPR R2 R14 ; Get second item on Stack
|
||||
FALSE R0 ; Assume comparision is True
|
||||
CMPSKIP.L R1 R2 ; Check if less than and skip if they are
|
||||
TRUE R0 ; Looks like our assumption was wrong
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; <=
|
||||
:LEqual_Text
|
||||
"<="
|
||||
:LEqual_Entry
|
||||
&Less_Entry ; Pointer to <
|
||||
&LEqual_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R1 R14
|
||||
POPR R2 R14
|
||||
FALSE R0 ; Assume comparision is True
|
||||
CMPSKIP.LE R1 R2 ; Check if they are less than or equal and skip if they are
|
||||
TRUE R0 ; Looks like our assumption was wrong
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&Less_Entry ; Pointer to <
|
||||
&LEqual_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R1 R14 ; Get top of stack
|
||||
POPR R2 R14 ; Get second item on Stack
|
||||
FALSE R0 ; Assume comparision is True
|
||||
CMPSKIP.LE R1 R2 ; Check if they are less than or equal and skip if they are
|
||||
TRUE R0 ; Looks like our assumption was wrong
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; >
|
||||
:Greater_Text
|
||||
">"
|
||||
:Greater_Entry
|
||||
&LEqual_Entry ; Pointer to <=
|
||||
&Greater_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R1 R14
|
||||
POPR R2 R14
|
||||
FALSE R0 ; Assume comparision is True
|
||||
CMPSKIP.G R1 R2 ; Check if greater and skip if they are
|
||||
TRUE R0 ; Looks like our assumption was wrong
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&LEqual_Entry ; Pointer to <=
|
||||
&Greater_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R1 R14 ; Get top of stack
|
||||
POPR R2 R14 ; Get second item on Stack
|
||||
FALSE R0 ; Assume comparision is True
|
||||
CMPSKIP.G R1 R2 ; Check if greater and skip if they are
|
||||
TRUE R0 ; Looks like our assumption was wrong
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; >=
|
||||
:GEqual_Text
|
||||
">="
|
||||
:GEqual_Entry
|
||||
&Greater_Entry ; Pointer to >
|
||||
&GEqual_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R1 R14
|
||||
POPR R2 R14
|
||||
FALSE R0 ; Assume comparision is True
|
||||
CMPSKIP.GE R1 R2 ; Check if they are equal and skip if they are
|
||||
TRUE R0 ; Looks like our assumption was wrong
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&Greater_Entry ; Pointer to >
|
||||
&GEqual_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R1 R14 ; Get top of stack
|
||||
POPR R2 R14 ; Get second item on Stack
|
||||
FALSE R0 ; Assume comparision is True
|
||||
CMPSKIP.GE R1 R2 ; Check if they are equal and skip if they are
|
||||
TRUE R0 ; Looks like our assumption was wrong
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; AND
|
||||
:AND_Text
|
||||
"AND"
|
||||
:AND_Entry
|
||||
&GEqual_Entry ; Pointer to >=
|
||||
&AND_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14
|
||||
POPR R1 R14
|
||||
AND R0 R0 R1
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&GEqual_Entry ; Pointer to >=
|
||||
&AND_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Get top of stack
|
||||
POPR R1 R14 ; Get second item on Stack
|
||||
AND R0 R0 R1 ; Perform AND
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; OR
|
||||
:OR_Text
|
||||
"OR"
|
||||
:OR_Entry
|
||||
&AND_Entry ; Pointer to AND
|
||||
&OR_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14
|
||||
POPR R1 R14
|
||||
OR R0 R0 R1
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&AND_Entry ; Pointer to AND
|
||||
&OR_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Get top of stack
|
||||
POPR R1 R14 ; Get second item on Stack
|
||||
OR R0 R0 R1 ; Perform OR
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; XOR
|
||||
:XOR_Text
|
||||
"XOR"
|
||||
:XOR_Entry
|
||||
&OR_Entry ; Pointer to OR
|
||||
&XOR_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14
|
||||
POPR R1 R14
|
||||
XOR R0 R0 R1
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&OR_Entry ; Pointer to OR
|
||||
&XOR_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Get top of stack
|
||||
POPR R1 R14 ; Get second item on Stack
|
||||
XOR R0 R0 R1 ; Perform XOR
|
||||
PUSHR R0 R14 ; Store the result
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; NOT
|
||||
:NOT_Text
|
||||
"NOT"
|
||||
:NOT_Entry
|
||||
&XOR_Entry ; Pointer to XOR
|
||||
&NOT_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14
|
||||
NOT R0 R0
|
||||
PUSHR R0 R14
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&XOR_Entry ; Pointer to XOR
|
||||
&NOT_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Get top of stack
|
||||
NOT R0 R0 ; Bit flip it
|
||||
PUSHR R0 R14 ; Store it back onto stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; LIT
|
||||
:LIT_Text
|
||||
"LIT"
|
||||
:LIT_Entry
|
||||
&NOT_Entry ; Pointer to NOT
|
||||
&LIT_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
LOAD R0 R11 0 ; Get contents of NEXT
|
||||
ADDUI R11 R11 4 ; Increment NEXT
|
||||
PUSHR R0 R14 ; Put immediate onto stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&NOT_Entry ; Pointer to NOT
|
||||
&LIT_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
LOAD R0 R11 0 ; Get contents of NEXT
|
||||
ADDUI R11 R11 4 ; Increment NEXT
|
||||
PUSHR R0 R14 ; Put immediate onto stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; Memory manipulation instructions
|
||||
|
||||
|
@ -412,113 +412,114 @@
|
|||
:Store_Text
|
||||
"!"
|
||||
:Store_Entry
|
||||
&LIT_Entry ; Pointer to LIT
|
||||
&Store_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Destination
|
||||
POPR R1 R14 ; Contents
|
||||
STORE R1 R0 0 ; Write out
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&LIT_Entry ; Pointer to LIT
|
||||
&Store_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Destination
|
||||
POPR R1 R14 ; Contents
|
||||
STORE R1 R0 0 ; Write out
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; FETCH
|
||||
:Fetch_Text
|
||||
"@"
|
||||
:Fetch_Entry
|
||||
&Store_Entry ; Pointer to Store
|
||||
&Fetch_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Source address
|
||||
LOAD R0 R0 0 ; Get Contents
|
||||
PUSHR R0 R14 ; Push Contents
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&Store_Entry ; Pointer to Store
|
||||
&Fetch_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Source address
|
||||
LOAD R0 R0 0 ; Get Contents
|
||||
PUSHR R0 R14 ; Push Contents
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; ADDSTORE
|
||||
:AStore_Text
|
||||
"+!"
|
||||
:AStore_Entry
|
||||
&Fetch_Entry ; Pointer to Fetch
|
||||
&AStore_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Destination
|
||||
POPR R1 R14 ; How much to add
|
||||
LOAD R2 R0 0 ; Get contents of address
|
||||
ADD R1 R1 R2 ; Combine
|
||||
STORE R1 R0 0 ; Write out
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&Fetch_Entry ; Pointer to Fetch
|
||||
&AStore_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Destination
|
||||
POPR R1 R14 ; How much to add
|
||||
LOAD R2 R0 0 ; Get contents of address
|
||||
ADD R1 R1 R2 ; Combine
|
||||
STORE R1 R0 0 ; Write out
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; SUBSTORE
|
||||
:SStore_Text
|
||||
"-!"
|
||||
:SStore_Entry
|
||||
&AStore_Entry ; Pointer to ADDSTORE
|
||||
&SStore_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Destination
|
||||
POPR R1 R14 ; How much to sub
|
||||
LOAD R2 R0 0 ; Get contents of address
|
||||
SUB R1 R2 R1 ; Subtract
|
||||
STORE R1 R0 0 ; Write out
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&AStore_Entry ; Pointer to ADDSTORE
|
||||
&SStore_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Destination
|
||||
POPR R1 R14 ; How much to sub
|
||||
LOAD R2 R0 0 ; Get contents of address
|
||||
SUB R1 R2 R1 ; Subtract
|
||||
STORE R1 R0 0 ; Write out
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; STOREBYTE
|
||||
:SByte_Text
|
||||
"C!"
|
||||
:SByte_Entry
|
||||
&SStore_Entry ; Pointer to SUBSTORE
|
||||
&SByte_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Destination
|
||||
POPR R1 R14 ; Contents
|
||||
STORE8 R1 R0 0 ; Write out
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&SStore_Entry ; Pointer to SUBSTORE
|
||||
&SByte_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Destination
|
||||
POPR R1 R14 ; Contents
|
||||
STORE8 R1 R0 0 ; Write out
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; FETCHBYTE
|
||||
:FByte_Text
|
||||
"C@"
|
||||
:FByte_Entry
|
||||
&SByte_Entry ; Pointer to STOREBYTE
|
||||
&FByte_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Source address
|
||||
LOADU8 R0 R0 0 ; Get Contents
|
||||
PUSHR R0 R14 ; Push Contents
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&SByte_Entry ; Pointer to STOREBYTE
|
||||
&FByte_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Source address
|
||||
LOADU8 R0 R0 0 ; Get Contents
|
||||
PUSHR R0 R14 ; Push Contents
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; CMOVE
|
||||
:CMove_Text
|
||||
"CMOVE"
|
||||
:CMove_Entry
|
||||
&FByte_Entry ; Pointer to FETCHBYTE
|
||||
&CMove_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Get number of bytes to Move
|
||||
POPR R1 R14 ; Where to put the result
|
||||
POPR R2 R14 ; Where it is coming from
|
||||
FALSE R4 ; Prepare for Zeroing
|
||||
&FByte_Entry ; Pointer to FETCHBYTE
|
||||
&CMove_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Get number of bytes to Move
|
||||
POPR R1 R14 ; Where to put the result
|
||||
POPR R2 R14 ; Where it is coming from
|
||||
FALSE R4 ; Prepare for Zeroing
|
||||
|
||||
:Cmove_Main
|
||||
CMPSKIPI.GE R0 4 ; Loop if we have 4 or more bytes to move
|
||||
JUMP @Cmove_Slow ; Otherwise slowly move bytes
|
||||
LOAD R3 R2 0 ; Get 4 Bytes
|
||||
STORE R4 R2 0 ; Overwrite that memory with Zeros
|
||||
STORE R3 R1 0 ; Store them at the destination
|
||||
ADDUI R1 R1 4 ; Increment Source by 4
|
||||
ADDUI R2 R2 4 ; Increment Destination by 4
|
||||
SUBI R0 R0 4 ; Decrement number of bytes to move by 4
|
||||
JUMP @Cmove_Main ; Loop more
|
||||
CMPSKIPI.GE R0 4 ; Loop if we have 4 or more bytes to move
|
||||
JUMP @Cmove_Slow ; Otherwise slowly move bytes
|
||||
LOAD R3 R2 0 ; Get 4 Bytes
|
||||
STORE R4 R2 0 ; Overwrite that memory with Zeros
|
||||
STORE R3 R1 0 ; Store them at the destination
|
||||
ADDUI R1 R1 4 ; Increment Source by 4
|
||||
ADDUI R2 R2 4 ; Increment Destination by 4
|
||||
SUBI R0 R0 4 ; Decrement number of bytes to move by 4
|
||||
JUMP @Cmove_Main ; Loop more
|
||||
|
||||
:Cmove_Slow
|
||||
CMPSKIPI.G R0 0 ; While number of bytes is greater than 0
|
||||
JUMP @Cmove_Done ; Otherwise be done
|
||||
LOADU8 R3 R2 0 ; Get 4 Bytes
|
||||
STORE8 R4 R2 0 ; Overwrite that memory with Zeros
|
||||
STORE8 R3 R1 0 ; Store them at the destination
|
||||
ADDUI R1 R1 1 ; Increment Source by 1
|
||||
ADDUI R2 R2 1 ; Increment Destination by 1
|
||||
SUBI R0 R0 1 ; Decrement number of bytes to move by 1
|
||||
JUMP @Cmove_Slow ; Loop more
|
||||
CMPSKIPI.G R0 0 ; While number of bytes is greater than 0
|
||||
JUMP @Cmove_Done ; Otherwise be done
|
||||
LOADU8 R3 R2 0 ; Get 4 Bytes
|
||||
STORE8 R4 R2 0 ; Overwrite that memory with Zeros
|
||||
STORE8 R3 R1 0 ; Store them at the destination
|
||||
ADDUI R1 R1 1 ; Increment Source by 1
|
||||
ADDUI R2 R2 1 ; Increment Destination by 1
|
||||
SUBI R0 R0 1 ; Decrement number of bytes to move by 1
|
||||
JUMP @Cmove_Slow ; Loop more
|
||||
|
||||
:Cmove_Done
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; Global variables
|
||||
|
||||
|
@ -526,31 +527,75 @@
|
|||
:State_Text
|
||||
"STATE"
|
||||
:State_Entry
|
||||
&CMove_Entry ; Pointer to CMOVE
|
||||
&State_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
PUSHR R10 R14 ; Put STATE onto stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&CMove_Entry ; Pointer to CMOVE
|
||||
&State_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
PUSHR R10 R14 ; Put STATE onto stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; LATEST
|
||||
:Latest_Text
|
||||
"LATEST"
|
||||
:Latest_Entry
|
||||
&State_Entry ; Pointer to STATE
|
||||
&Latest_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
PUSHR R9 R14 ; Put LATEST onto stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&State_Entry ; Pointer to STATE
|
||||
&Latest_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
PUSHR R9 R14 ; Put LATEST onto stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; HERE
|
||||
:Here_Text
|
||||
"HERE"
|
||||
:Here_Entry
|
||||
&Latest_Entry ; Pointer to
|
||||
&Here_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
PUSHR R8 R14 ; Put HERE onto stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
&Latest_Entry ; Pointer to LATEST
|
||||
&Here_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
PUSHR R8 R14 ; Put HERE onto stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; Return Stack functions
|
||||
|
||||
;; >R
|
||||
:TOR_Text
|
||||
">R"
|
||||
:TOR_Entry
|
||||
&Here_Entry ; Pointer to HERE
|
||||
&TOR_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R14 ; Get top of Parameter stack
|
||||
PUSHR R0 R15 ; Shove it onto return stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; R>
|
||||
:FROMR_Text
|
||||
"R>"
|
||||
:FROMR_Entry
|
||||
&TOR_Entry ; Pointer to >R
|
||||
&FROMR_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R0 R15 ; Get top of Return stack
|
||||
PUSHR R0 R14 ; Shove it onto parameter stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; RSP@
|
||||
:RSPFetch_Text
|
||||
"RSP@"
|
||||
:RSPFetch_Entry
|
||||
&FROMR_Entry ; Pointer to R>
|
||||
&RSPFetch_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
PUSHR R14 R15 ; Push Return stack pointer onto Parameter stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
;; RSP!
|
||||
:RSPStore_Text
|
||||
"RSP!"
|
||||
:RSPStore_Entry
|
||||
&RSPFetch_Entry ; Pointer to RSP@
|
||||
&ore_Text ; Pointer to Name
|
||||
NOP ; Flags
|
||||
POPR R15 R14 ; Replace Return stack pointer from parameter stack
|
||||
JSR_COROUTINE R11 ; NEXT
|
||||
|
||||
:cold_start
|
||||
;;
|
||||
|
|
Loading…
Reference in New Issue