summaryrefslogtreecommitdiff
path: root/asmmon.c
diff options
context:
space:
mode:
Diffstat (limited to 'asmmon.c')
-rw-r--r--asmmon.c89
1 files changed, 70 insertions, 19 deletions
diff --git a/asmmon.c b/asmmon.c
index fd7c636..1a41214 100644
--- a/asmmon.c
+++ b/asmmon.c
@@ -103,7 +103,7 @@ int asmmon() {
char *cmd;
char *tmp = malloc(sizeof(char *)*128);
size_t size;
- done &= ~6;
+ done &= ~14;
getline(&buf, &size, stdin);
cmd = strtok_r(buf, "\n", &tmp);
if (cmd != NULL) {
@@ -213,28 +213,79 @@ int asmmon() {
}
}
}
- if (postfix != NULL && !(done & 6)) {
- if (strcasecmp(postfix, "w") == 0) {
- addr[address++] = 1;
- } else if (strcasecmp(postfix, "d") == 0) {
- addr[address++] = 2;
- } else if (strcasecmp(postfix, "q") == 0) {
- addr[address++] = 3;
- } else {
- addr[address++] = 0;
- }
- } else if (postfix == NULL && !(done & 6)) {
- addr[address++] = 0;
- }
if (ins != NULL && !(done & 6)) {
uint8_t i;
for (i = 0; i < 77; i++) {
if (strcasecmp(opcodes[i].mnemonic, ins) == 0) {
+ if (addrmode == 0 && (opcodes[i].impl || opcodes[i].impl == CPS)) {
+ done |= 8;
+ } else if (addrmode == 1) {
+ switch (opcodes[i].imm) {
+ case PHP:
+ case PHA:
+ case PHY:
+ case PHX:
+ case PLP:
+ case PLA:
+ case PLY:
+ case PLX:
+ case STT:
+ case LSL:
+ case LSR:
+ case ROL:
+ case ROR:
+ case ENT:
+ done |= 8;
+ break;
+ }
+ } else {
+ if (strcasecmp(ins, "JMP") == 0)
+ done |=8;
+ if (strcasecmp(ins, "JSR") == 0)
+ done |=8;
+ if (strcasecmp(ins, "JSL") == 0)
+ done |=8;
+ if (strcasecmp(ins, "INC") == 0)
+ done |=8;
+ if (strcasecmp(ins, "BPO") == 0)
+ done |=8;
+ if (strcasecmp(ins, "BNG") == 0)
+ done |=8;
+ if (strcasecmp(ins, "BCS") == 0)
+ done |=8;
+ if (strcasecmp(ins, "BCC") == 0)
+ done |=8;
+ if (strcasecmp(ins, "BEQ") == 0)
+ done |=8;
+ if (strcasecmp(ins, "BNE") == 0)
+ done |=8;
+ if (strcasecmp(ins, "BVS") == 0)
+ done |=8;
+ if (strcasecmp(ins, "BVC") == 0)
+ done |=8;
+ }
op = opcodes[i];
break;
}
}
- uint8_t r = addr[address-1] & 3;
+ if (postfix != NULL && !(done & 8)) {
+ if (strcasecmp(postfix, "w") == 0) {
+ addr[address++] = 0x17;
+ } else if (strcasecmp(postfix, "d") == 0) {
+ addr[address++] = 0x27;
+ } else if (strcasecmp(postfix, "q") == 0) {
+ addr[address++] = 0x37;
+ } else {
+ done |=8;
+ }
+ } else if (postfix == NULL && !(done & 8)) {
+ done |=8;
+ }
+ uint8_t r;
+ if (!(done & 8))
+ r = addr[address-1];
+ else
+ r = 0;
switch (addrmode) {
case 0:
if (op.impl || op.impl == CPS) {
@@ -266,18 +317,18 @@ int asmmon() {
break;
default:
addr[address] = value & 0xFF;
- if (r & 1)
+ if (r & 0x10)
addr[address+1] = value >> 8;
- if (r & 2)
+ if (r & 0x20)
addr[address+2] = value >> 16;
addr[address+3] = value >> 24;
- if (r & 3)
+ if (r & 0x30)
addr[address+4] = value >> 32;
addr[address+5] = value >> 40;
addr[address+6] = value >> 48;
addr[address+7] = value >> 56;
- address+=(1 << (r & 3));
+ address+=(1 << ((r & 0x30) >> 4));
break;
}