diff --git a/asm.c b/asm.c index b7a01ae..6c2117f 100644 --- a/asm.c +++ b/asm.c @@ -11,20 +11,20 @@ uint32_t ip; struct Token { - char Text[max_string + 1]; - char Expression[max_string + 1]; + struct Token* next; + struct Token* prev; uint32_t type; uint32_t size; uint32_t address; - struct Token* next; - struct Token* prev; + char Text[max_string + 1]; + char Expression[max_string + 1]; }; enum type { EOL = 1, comment = (1 << 1), - address = (1 << 2) + label = (1 << 2) }; struct Token* newToken() @@ -113,6 +113,11 @@ Restart: p->type = p->type | comment; store[i] = (char)c; } + else if((!(p->type & comment )) && (58 == c)) + { + p->type = p->type | label; + store[i] = (char)c; + } else { store[i] = (char)c; @@ -379,7 +384,7 @@ void assign_addresses(struct Token* p) uint32_t get_address(struct Token* p, char match[]) { - if(0 == strncmp(p->Text, match, max_string)) + if((label & p->type) && (0 == strncmp(p->Text, match, max_string))) { return p->address; } @@ -396,9 +401,13 @@ void update_jumps(struct Token* head, struct Token* p) { uint32_t dest = -1; + if('@' == p->Text[0]) { - dest = get_address(head, p->Text + 1); + char temp[256] = {0}; + strncpy(temp, p->Text, max_string); + temp[0] = ':'; + dest = get_address(head, temp); } if(-1 != (int32_t)dest) diff --git a/stage0/stage0_monitor.s b/stage0/stage0_monitor.s index 41eaf69..8aad139 100644 --- a/stage0/stage0_monitor.s +++ b/stage0/stage0_monitor.s @@ -1,4 +1,4 @@ -start +:start LOADUI R10 0x0F ; Byte mask LOADUI R11 1 ; Our toggle LOADUI R13 0x600 ; Where we are starting our Stack @@ -13,7 +13,7 @@ start LOADUI R0 0x1101 FOPEN_WRITE -loop +:loop LOADUI R1 0 ; Read from tty FGETC ; Read a Char @@ -22,12 +22,12 @@ loop JUMP.NE R14 @.L0 CALLI R13 @finish -.L0 +:.L0 ;; Check for EOF JUMP.P R0 @.L1 CALLI R13 @finish -.L1 +:.L1 LOADUI R1 0x1101 ; Write to TAPE_02 FPUTC ; Print the Char CALLI R13 @hex ; Convert it @@ -39,7 +39,7 @@ loop FALSE R11 ; Flip the toggle JUMP @loop -.L99 +:.L99 SL0I R15 4 ; Shift our first nibble AND R0 R0 R10 ; Mask out top ADD R0 R0 R15 ; Combine nibbles @@ -48,7 +48,7 @@ loop FPUTC ; To TAPE_01 JUMP @loop ; Try to get more bytes -hex +:hex ;; Deal with line comments starting with # CMPUI R14 R0 35 JUMP.E R14 @ascii_comment @@ -76,19 +76,19 @@ hex ;; Ignore the rest JUMP @ascii_other -ascii_num +:ascii_num SUBUI R0 R0 48 RET R13 -ascii_low +:ascii_low SUBUI R0 R0 87 RET R13 -ascii_high +:ascii_high SUBUI R0 R0 55 RET R13 -ascii_other +:ascii_other TRUE R0 RET R13 -ascii_comment +:ascii_comment LOADUI R1 0 ; Read from tty FGETC ; Read another char CMPUI R14 R0 10 ; Stop at the end of line @@ -97,7 +97,7 @@ ascii_comment JUMP.NE R14 @ascii_comment ; Otherwise keep looping JUMP @ascii_other -finish +:finish LOADUI R0 0x1100 ; Close TAPE_01 FCLOSE LOADUI R0 0x1101 ; Close TAPE_02 diff --git a/stage1/stage1_assembler-0.s b/stage1/stage1_assembler-0.s index ed6a9c6..845df61 100644 --- a/stage1/stage1_assembler-0.s +++ b/stage1/stage1_assembler-0.s @@ -1,7 +1,9 @@ -start +:start LOADUI R10 0x0F ; Byte mask LOADUI R11 1 ; Our toggle LOADUI R13 0x600 ; Where we are starting our Stack + ;; R14 is storing our condition code + ;; R15 is storing our nybble ;; Prep TAPE_01 LOADUI R0 0x1100 @@ -11,7 +13,7 @@ start LOADUI R0 0x1101 FOPEN_WRITE -loop +:loop LOADUI R1 0x1100 ; Read from tape_01 FGETC ; Read a Char @@ -20,7 +22,7 @@ loop JUMP.GE R14 @.L1 CALLI R13 @finish -.L1 +:.L1 LOADUI R1 0 ; Write to Char to TTY FPUTC ; Print the Char CALLI R13 @hex ; Convert it @@ -33,7 +35,7 @@ loop FALSE R11 ; Flip the toggle JUMP @loop -.L99 +:.L99 SL0I R15 4 ; Shift our first nibble AND R0 R0 R10 ; Mask out top ADD R0 R0 R15 ; Combine nibbles @@ -42,7 +44,7 @@ loop FPUTC ; To TAPE_02 JUMP @loop ; Try to get more bytes -hex +:hex ;; Deal with line comments starting with # CMPUI R14 R0 35 JUMP.E R14 @ascii_comment @@ -70,19 +72,19 @@ hex ;; Ignore the rest JUMP @ascii_other -ascii_num +:ascii_num SUBUI R0 R0 48 RET R13 -ascii_low +:ascii_low SUBUI R0 R0 87 RET R13 -ascii_high +:ascii_high SUBUI R0 R0 55 RET R13 -ascii_other +:ascii_other TRUE R0 RET R13 -ascii_comment +:ascii_comment LOADUI R1 0x1100 ; Read from TAPE_01 FGETC ; Read another char CMPUI R14 R0 10 ; Stop at the end of line @@ -91,7 +93,7 @@ ascii_comment JUMP.NE R14 @ascii_comment ; Otherwise keep looping JUMP @ascii_other -finish +:finish LOADUI R0 0x1100 ; Close TAPE_01 FCLOSE LOADUI R0 0x1101 ; Close TAPE_02 diff --git a/stage1/stage1_assembler-1a.s b/stage1/stage1_assembler-1a.s index 867a748..c5a18b8 100644 --- a/stage1/stage1_assembler-1a.s +++ b/stage1/stage1_assembler-1a.s @@ -1,4 +1,4 @@ -start +:start LOADUI R8 @table ; Where we are putting our address pointers LOADUI R9 0xFF ; Byte mask LOADUI R10 0x0F ; nybble mask @@ -17,7 +17,7 @@ start FOPEN_WRITE ;; Function for collecting the address of all labels -getLables +:getLables LOADUI R1 0x1100 ; Read from tape_01 FGETC ; Read a Char @@ -40,7 +40,7 @@ getLables ADDUI R12 R12 2 ; The pointer will end up taking 2 bytes JUMP @getLables -.L0 +:.L0 ;; Otherwise attempt to process CALLI R13 @hex ; Convert it CMPSKIP.GE R0 0 ; Don't record, nonhex values @@ -53,14 +53,14 @@ getLables FALSE R11 ; Flip the toggle JUMP @getLables -.L1 +:.L1 ;; Deal with case of second half of byte TRUE R11 ; Flip the toggle ADDUI R12 R12 1 ; increment PC now that we have a full byte JUMP @getLables ;; Function for storing the address of the label -storeLabel +:storeLabel ;; Get the char of the Label LOADUI R1 0x1100 ; Read from tape_01 FGETC ; Read a Char @@ -75,7 +75,7 @@ storeLabel RET R13 ;; Main Functionality -stage2 +:stage2 ;; We first need to rewind tape_01 to perform our second pass LOADUI R0 0x1100 REWIND @@ -84,7 +84,7 @@ stage2 LOADUI R11 1 ; Our toggle FALSE R12 ; Our PC counter -loop +:loop LOADUI R1 0x1100 ; Read from tape_01 FGETC ; Read a Char @@ -101,14 +101,14 @@ loop FGETC ; Read a Char JUMP @loop -.L97 +:.L97 ;; Check for Pointer CMPUI R14 R0 64 ; If it is a pointer Deal with it JUMP.NE R14 @.L98 ; Otherwise attempt to process it CALLI R13 @storePointer JUMP @loop -.L98 +:.L98 ;; Process Char LOADUI R1 0 ; Write to Char to TTY FPUTC ; Print the Char @@ -122,7 +122,7 @@ loop FALSE R11 ; Flip the toggle JUMP @loop -.L99 +:.L99 SL0I R15 4 ; Shift our first nibble AND R0 R0 R10 ; Mask out top ADD R0 R0 R15 ; Combine nibbles @@ -132,7 +132,7 @@ loop ADDUI R12 R12 1 ; increment PC now that we have a full byte JUMP @loop ; Try to get more bytes -storePointer +:storePointer ;; Correct the PC to reflect the size of the pointer ADDUI R12 R12 2 ; Exactly 2 bytes @@ -160,7 +160,7 @@ storePointer FPUTC ; Write the byte to TAPE_02 RET R13 -hex +:hex ;; Deal with line comments starting with # CMPUI R14 R0 35 JUMP.E R14 @ascii_comment @@ -188,19 +188,19 @@ hex ;; Ignore the rest JUMP @ascii_other -ascii_num +:ascii_num SUBUI R0 R0 48 RET R13 -ascii_low +:ascii_low SUBUI R0 R0 87 RET R13 -ascii_high +:ascii_high SUBUI R0 R0 55 RET R13 -ascii_other +:ascii_other TRUE R0 RET R13 -ascii_comment +:ascii_comment LOADUI R1 0x1100 ; Read from TAPE_01 FGETC ; Read another char CMPUI R14 R0 10 ; Stop at the end of line @@ -209,7 +209,7 @@ ascii_comment JUMP.NE R14 @ascii_comment ; Otherwise keep looping JUMP @ascii_other -finish +:finish LOADUI R0 0x1100 ; Close TAPE_01 FCLOSE LOADUI R0 0x1101 ; Close TAPE_02 @@ -217,4 +217,4 @@ finish HALT ;; Where all of our pointers will be stored for our locations -table +:table