From eea718599ea5724c2ef88f4917599f32d32a20c3 Mon Sep 17 00:00:00 2001 From: Jeremiah Orians Date: Sat, 29 Oct 2016 14:26:00 -0400 Subject: [PATCH] Fix comment spacing and added Return stack operations --- stage2/forth.s | 627 ++++++++++++++++++++++++++----------------------- 1 file changed, 336 insertions(+), 291 deletions(-) diff --git a/stage2/forth.s b/stage2/forth.s index a7e9b41..e3013ea 100644 --- a/stage2/forth.s +++ b/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 ;;