Updated syntax of assembler to simplify task of identifying labels
This commit is contained in:
parent
321ee1d3e3
commit
9c19a41d2c
23
asm.c
23
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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue