diff --git a/stage1/M0-macro.s b/stage1/M0-macro.s index 75a927a..a8c13f4 100644 --- a/stage1/M0-macro.s +++ b/stage1/M0-macro.s @@ -3,17 +3,17 @@ ;; We will be using R14 for our condition codes LOADUI R15 $stack ; Put stack at end of program - ;; Main program - ;; Reads contents of Tape_01 and applies all Definitions - ;; Writes results to Tape_02 +;; Main program +;; Reads contents of Tape_01 and applies all Definitions +;; Writes results to Tape_02 ;; Accepts no arguments and HALTS when done :main ;; Prep TAPE_01 LOADUI R0 0x1100 FOPEN_READ - FALSE R0 ; Head is NULL - LOADUI R0 0x1100 ; Read Tape_01 + FALSE R13 ; Head is NULL + MOVE R1 R0 ; Read Tape_01 FALSE R14 ; We haven't yet reached EOF :main_0 CALLI R15 @Tokenize_Line ; Call Tokenize_Line @@ -60,10 +60,10 @@ NOP - ;; Tokenize_Line function - ;; Recieves pointer to Head in R0 and desired input in R1 - ;; Alters R14 when EOF Reached - ;; Returns to whatever called it +;; Tokenize_Line function +;; Recieves pointer to Head in R0 and desired input in R1 +;; Alters R14 when EOF Reached +;; Returns to whatever called it :Tokenize_Line ;; Preserve registers PUSHR R0 R15 @@ -232,11 +232,11 @@ RET R15 - ;; Add_Token Function - ;; Recieves pointers in R0 R1 - ;; Alters R0 if NULL - ;; Appends nodes together - ;; Returns to whatever called it +;; Add_Token Function +;; Recieves pointers in R0 R1 +;; Alters R13 if R) is NULL +;; Appends nodes together +;; Returns to whatever called it :Add_Token ;; Preserve Registers PUSHR R2 R15 @@ -245,8 +245,9 @@ ;; Handle if Head is NULL JUMP.NZ R0 @Add_Token_0 - POPR R0 R15 - PUSHR R1 R15 + COPY R13 R1 ; Fix head + POPR R0 R15 ; Clean up register + PUSHR R1 R15 ; And act like we passed the reverse JUMP @Add_Token_2 :Add_Token_0 @@ -273,6 +274,7 @@ POPR R2 R15 RET R15 + ;; strcmp function ;; Recieves pointers to null terminated strings ;; In R0 and R1 @@ -360,10 +362,10 @@ "DEFINE" - ;; Line_Macro Function - ;; Recieves a node pointer in R0 - ;; Causes macros to be applied - ;; Returns to whatever called it +;; Line_Macro Function +;; Recieves a node pointer in R0 +;; Causes macros to be applied +;; Returns to whatever called it :Line_Macro ;; Preserve Registers PUSHR R0 R15 @@ -498,7 +500,7 @@ ADDUI R2 R2 4 ; Pointer Text pointer to next 4 bytes ADDUI R4 R4 8 ; Increment storage space required CMPSKIP.E R3 0 ; If byte was NULL - JUMP @Hexify_String + JUMP @Hexify_String_0 ;; Done ADDUI R0 R4 1 ; Lead space for NULL terminator @@ -543,5 +545,68 @@ RET R15 ; Get next nybble or return if done +;; Eval_Immediates function +;; Recieves a node in R0 +;; Converts number into Hex +;; And write into Memory and fix pointer +:Eval_Immediates + ;; Preserve Registers + PUSHR R0 R15 + PUSHR R1 R15 + PUSHR R2 R15 + PUSHR R3 R15 + PUSHR R4 R15 + PUSHR R5 R15 + PUSHR R6 R15 + + ;; Initialize + FALSE R5 ; Zero for checking return of numerate_string + +;; Process Text +:Eval_Immediates_0 + COPY R6 R0 ; Safely preserve pointer to node + LOAD32 R4 R0 0 ; Load Node->Next + LOAD32 R3 R0 4 ; Load Node type + LOAD32 R2 R0 12 ; Load Expression pointer + LOAD32 R1 R0 8 ; Load Text pointer + JUMP.NZ R2 @Eval_Immediates_1 ; Don't do anything if Expression is set + JUMP.NZ R3 @Eval_Immediates_1 ; Don't do anything if Typed + CALLI R15 @numerate_string ; Convert to number in R0 + LOAD8 R1 R1 0 ; Get first char of Text + CMPSKIP.E R1 48 ; Skip next comparision if '0' + CMPJUMP.E R0 R5 @Eval_Immediates_1 ; Don't do anything if string isn't a number + MOVE R1 R0 ; Preserve number + LOADUI R0 5 ; Allocate enough space for 4 hex and a null + CALLI R15 @malloc ; Obtain the pointer the newly allocated Expression + STORE R0 R6 12 ; Preserve pointer to expression + SWAP R0 R1 ; Fix order for call to hex16 + CALLI R15 @hex16 ; Shove our number into expression + +;; Handle looping +:Eval_Immediates_1 + CMPJUMP.E R4 R5 @Eval_Immediates_2 ; If null be done + MOVE R0 R4 ; Prepare for next loop + JUMP @Eval_Immediates_0 ; And loop + +;; Clean up +:Eval_Immediates_2 + ;; Restore Registers + POPR R6 R15 + POPR R5 R15 + POPR R4 R15 + POPR R3 R15 + POPR R2 R15 + POPR R1 R15 + POPR R0 R15 + RET + + +;; numerate_string function +;; Recieves pointer To string in R0 +;; Returns number in R0 equal to value of string +;; Or Zero in the event of invalid string +:numerate_string + + ;; Where we are putting the start of our stack :stack