Fix comment spacing and added Return stack operations

This commit is contained in:
Jeremiah Orians 2016-10-29 14:26:00 -04:00
parent 968f5852bf
commit eea718599e
No known key found for this signature in database
GPG Key ID: 7457821534D2ACCD
1 changed files with 336 additions and 291 deletions

View File

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