From 0058db90443996a80d31190d38f7606285420335 Mon Sep 17 00:00:00 2001 From: Olaf Seibert Date: Sat, 12 Jun 2021 18:37:45 +0200 Subject: [PATCH] Name the addressing modes. --- assemble_aux.h | 7 +++++++ parse.c | 29 ++++++++++++++++------------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/assemble_aux.h b/assemble_aux.h index f5727e6..6351e57 100644 --- a/assemble_aux.h +++ b/assemble_aux.h @@ -19,6 +19,13 @@ typedef struct addr_mode { EX_TREE *offset; /* Expression giving the offset */ } ADDR_MODE; +#define MODE_INDIRECT 010 /* (R0), @(R0)+, @-(R0), @42(R0) */ +#define MODE_REG 000 /* R0 */ +#define MODE_AUTO_INCR 020 /* (R0)+ */ +#define MODE_AUTO_DECR 040 /* -(R0) */ +#define MODE_OFFSET 060 /* 42(R0) */ +#define MODE_PC 007 + void push_cond( int ok, STREAM *str); diff --git a/parse.c b/parse.c index b3fc671..9928520 100644 --- a/parse.c +++ b/parse.c @@ -202,13 +202,14 @@ int get_mode( /* @ means "indirect," sets bit 3 */ if (*cp == '@') { cp++; - mode->type |= 010; + mode->type |= MODE_INDIRECT; } /* Immediate modes #imm and @#imm */ if (*cp == '#') { cp++; - mode->type |= 027; + mode->type |= MODE_AUTO_INCR | MODE_PC; + mode->offset = parse_expr(cp, 0); if (endp) *endp = mode->offset->cp; @@ -240,7 +241,7 @@ int get_mode( free_tree(value); return FALSE; } - mode->type |= 040 | reg; + mode->type |= MODE_AUTO_DECR | reg; if (endp) *endp = tcp; free_tree(value); @@ -272,22 +273,23 @@ int get_mode( tcp++; /* It's (Rn)+ */ if (endp) *endp = tcp; - mode->type |= 020 | reg; + mode->type |= MODE_AUTO_INCR | reg; free_tree(value); return TRUE; } - if (mode->type == 010) { /* For @(Rn) there's an implied 0 offset */ + if (mode->type == MODE_INDIRECT) { /* For @(Rn) there's an + implied 0 offset */ mode->offset = new_ex_lit(0); - mode->type |= 060 | reg; + mode->type |= MODE_OFFSET | reg; free_tree(value); if (endp) *endp = tcp; return TRUE; } - mode->type |= 010 | reg; /* Mode 10 is register indirect as - in (Rn) */ + mode->type |= MODE_INDIRECT | reg; /* Mode 10 is register indirect + as in (Rn) */ free_tree(value); if (endp) *endp = tcp; @@ -322,7 +324,7 @@ int get_mode( return FALSE; /* Syntax error in addressing mode */ } - mode->type |= 060 | reg; + mode->type |= MODE_OFFSET | reg; free_tree(value); @@ -351,14 +353,15 @@ int get_mode( /* It's either 067 (PC-relative) or 037 (absolute) mode, depending */ /* on user option. */ - if (mode->type & 010) { /* Have already noted indirection? */ - mode->type |= 067; /* If so, then PC-relative is the only + if (mode->type & MODE_INDIRECT) { /* Have already noted indirection? */ + mode->type |= MODE_OFFSET|MODE_PC;/* If so, then PC-relative is the only option */ mode->rel = 1; /* Note PC-relative */ } else if (enabl_ama) { /* User asked for absolute adressing? */ - mode->type |= 037; /* Give it to him. */ + mode->type |= MODE_INDIRECT|MODE_AUTO_INCR|MODE_PC; + /* Give it to him. */ } else { - mode->type |= 067; /* PC-relative */ + mode->type |= MODE_OFFSET|MODE_PC; /* PC-relative */ mode->rel = 1; /* Note PC-relative */ }