summaryrefslogtreecommitdiff
path: root/asmmon.c
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2019-12-08 20:45:55 -0500
committermrb0nk500 <b0nk@b0nk.xyz>2019-12-08 20:45:55 -0500
commit3dfde833082fc66cededd0206ae5fc76162867b6 (patch)
tree70ab1961552731bf58c13e82f57199b817ef8c5f /asmmon.c
parent1e3787256c8fb98c41e3263fe697f30557a895fe (diff)
Added support for resolving fixup labels.
AKA, referencing a label before it has been declared yet.
Diffstat (limited to 'asmmon.c')
-rw-r--r--asmmon.c234
1 files changed, 146 insertions, 88 deletions
diff --git a/asmmon.c b/asmmon.c
index 8d899cc..5b30fdc 100644
--- a/asmmon.c
+++ b/asmmon.c
@@ -4,7 +4,7 @@
#define debug 1
-#define OPNUM 85
+#define OPNUM 87
#define SETOP(num, _mne, _IMM, _ZM, _ZMX, _ZMY, _ABS, _IMPL) \
{opcodes[num].mnemonic[3] = '\0'; strncpy(opcodes[num].mnemonic, _mne, 3); \
opcodes[num].imm = _IMM; \
@@ -54,19 +54,74 @@ struct label *mklabel(const char *name, uint64_t adr, uint8_t def) {
return l;
}
-void use_label(const char *name, uint64_t *adr) {
+uint64_t use_label(const char *name, uint64_t adr) {
struct label *l = mklabel(name, 0, 0);
+ adr++;
if (l->def) {
- *adr = l->adr;
+ addr[adr] = l->adr & 0xFF;
+ if (l->adr & 0xFF00)
+ addr[adr+1] = l->adr >> 8;
+ if (l->adr & 0xFF000000) {
+ addr[adr+2] = l->adr >> 16;
+ addr[adr+3] = l->adr >> 24;
+ }
+ if (l->adr & 0xFF00000000000000) {
+ addr[adr+4] = l->adr >> 32;
+ addr[adr+5] = l->adr >> 40;
+ addr[adr+6] = l->adr >> 48;
+ addr[adr+7] = l->adr >> 56;
+ }
+ return l->adr;
} else {
+ printf("oof, label %s, does not exist, yet.\n", name);
struct fixup *f = malloc(sizeof(*f));
f->nxt = fixups;
- f->adr = *adr;
+ f->adr = adr;
f->l = l;
fixups = f;
+ return adr-1;
+ }
+}
+void reslv_fixups(void) {
+ struct fixup *f;
+ for (f = fixups; f; f = f->nxt) {
+ if (f->l->def) {
+ addr[f->adr] = f->l->adr & 0xFF;
+ if (f->l->adr & 0xFF00)
+ addr[f->adr+1] = f->l->adr >> 8;
+ if (f->l->adr & 0xFF000000) {
+ addr[f->adr+2] = f->l->adr >> 16;
+ addr[f->adr+3] = f->l->adr >> 24;
+ }
+ if (f->l->adr & 0xFF00000000000000) {
+ addr[f->adr+4] = f->l->adr >> 32;
+ addr[f->adr+5] = f->l->adr >> 40;
+ addr[f->adr+6] = f->l->adr >> 48;
+ addr[f->adr+7] = f->l->adr >> 56;
+ }
+ } else {
+ printf("oof, undefined reference to '%s', at $%016llx.\n", f->l->name, f->adr);
+ }
+ }
+}
+void viewmem(uint64_t address) {
+ printf("\t\t\t");
+ for (int ind = 0; ind < 0x10; ind++) {
+ printf("%02x", ind);
+ if (ind < 0x0F)
+ printf(" ");
+ }
+ printf("\n\n");
+ for (int hi = 0; hi < 0x10; hi++) {
+ printf("%016llx:\t", (address & ~0xF)+(hi*0x10));
+ for (int lo = 0; lo < 0x10; lo++) {
+ printf("%02x", addr[(address & ~0xF)+lo+(hi*0x10)]);
+ if (lo < 0x0F)
+ printf(" ");
+ }
+ printf("\n");
}
}
-
int asmmon() {
opent opcodes[OPNUM];
/* mne IMM ZM ZMX ZMY ABS IMPL*/
@@ -95,66 +150,68 @@ int asmmon() {
SETOP(22, "ANX", 0x24, 0x84, 0x00, 0x00, 0x54, 0x00);
SETOP(23, "AAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x25);
SETOP(24, "STT", 0x28, 0x00, 0x00, 0x00, 0x00, 0x00);
- SETOP(25, "BPO", 0x00, 0x00, 0x00, 0x00, 0x30, 0x00);
- SETOP(26, "ORA", 0x31, 0x3B, 0x00, 0x00, 0x39, 0x00);
- SETOP(27, "ORY", 0x32, 0x00, 0x00, 0x00, 0x62, 0x00);
- SETOP(28, "OAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x33);
- SETOP(29, "ORX", 0x34, 0x94, 0x00, 0x00, 0x64, 0x00);
- SETOP(30, "OAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x35);
- SETOP(31, "SEI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x38);
- SETOP(32, "BNG", 0x00, 0x00, 0x00, 0x00, 0x40, 0x00);
- SETOP(33, "XOR", 0x41, 0x4B, 0x00, 0x00, 0x49, 0x00);
- SETOP(34, "XRY", 0x42, 0xA2, 0x00, 0x00, 0x72, 0x00);
- SETOP(35, "XAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x43);
- SETOP(36, "XRX", 0x44, 0xA4, 0x00, 0x00, 0x74, 0x00);
- SETOP(37, "XAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x45);
- SETOP(38, "CLI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x48);
- SETOP(39, "BCS", 0x00, 0x00, 0x00, 0x00, 0x50, 0x00);
- SETOP(40, "LSL", 0x51, 0x55, 0x00, 0x00, 0x53, 0x00);
- SETOP(41, "SEC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x58);
- SETOP(42, "STA", 0x00, 0x7B, 0x8B, 0x9B, 0x5B, 0x00);
- SETOP(43, "STY", 0x00, 0x7D, 0x8D, 0x00, 0x5D, 0x00);
- SETOP(44, "STX", 0x00, 0x7E, 0x00, 0x9E, 0x5E, 0x00);
- SETOP(45, "BCC", 0x00, 0x00, 0x00, 0x00, 0x60, 0x00);
- SETOP(46, "LSR", 0x61, 0x65, 0x00, 0x00, 0x63, 0x00);
- SETOP(47, "CLC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x68);
- SETOP(48, "LDA", 0x69, 0x79, 0x89, 0x99, 0x59, 0x00);
- SETOP(49, "LDY", 0x6A, 0x7A, 0x8A, 0x00, 0x5A, 0x00);
- SETOP(50, "LDX", 0x6C, 0x7C, 0x00, 0x9C, 0x5C, 0x00);
- SETOP(51, "BEQ", 0x00, 0x00, 0x00, 0x00, 0x70, 0x00);
- SETOP(52, "ROL", 0x71, 0x75, 0x00, 0x00, 0x73, 0x00);
- SETOP(53, "SSP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x78);
- SETOP(54, "BNE", 0x00, 0x00, 0x00, 0x00, 0x80, 0x00);
- SETOP(55, "ROR", 0x81, 0x85, 0x00, 0x00, 0x83, 0x00);
- SETOP(56, "CSP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x88);
- SETOP(57, "BVS", 0x00, 0x00, 0x00, 0x00, 0x90, 0x00);
- SETOP(58, "MUL", 0x91, 0x95, 0x00, 0x00, 0x93, 0x00);
- SETOP(59, "SEV", 0x00, 0x00, 0x00, 0x00, 0x00, 0x98);
- SETOP(60, "BVC", 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00);
- SETOP(61, "DIV", 0xA1, 0xA5, 0x00, 0x00, 0xA3, 0x00);
- SETOP(62, "CLV", 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8);
- SETOP(63, "RTS", 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0);
- SETOP(64, "CMP", 0xB1, 0xF5, 0x00, 0x00, 0xE5, 0x00);
- SETOP(65, "CPY", 0xB2, 0xF2, 0x00, 0x00, 0xE2, 0x00);
- SETOP(66, "CAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0xB3);
- SETOP(67, "CPX", 0xB4, 0xF4, 0x00, 0x00, 0xE4, 0x00);
- SETOP(68, "CAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5);
- SETOP(69, "ENT", 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00);
- SETOP(70, "RTI", 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0);
- SETOP(71, "INC", 0x00, 0xE3, 0x00, 0x00, 0xE1, 0xC1);
- SETOP(72, "INY", 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2);
- SETOP(73, "IAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3);
- SETOP(74, "INX", 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4);
- SETOP(75, "IAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5);
- SETOP(76, "DEC", 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1);
- SETOP(77, "DEY", 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2);
- SETOP(78, "DAY", 0x00, 0xF3, 0x00, 0x00, 0xF1, 0xD3);
- SETOP(79, "DEX", 0x00, 0x00, 0x00, 0x00, 0x00, 0xD4);
- SETOP(80, "DAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5);
- SETOP(81, "JSL", 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00);
- SETOP(82, "NOP", 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8);
- SETOP(83, "RTL", 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0);
- SETOP(84, "BRK", 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8);
+ SETOP(25, "TSX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E);
+ SETOP(26, "BPO", 0x00, 0x00, 0x00, 0x00, 0x30, 0x00);
+ SETOP(27, "ORA", 0x31, 0x3B, 0x00, 0x00, 0x39, 0x00);
+ SETOP(28, "ORY", 0x32, 0x00, 0x00, 0x00, 0x62, 0x00);
+ SETOP(29, "OAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x33);
+ SETOP(23, "ORX", 0x34, 0x94, 0x00, 0x00, 0x64, 0x00);
+ SETOP(31, "OAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x35);
+ SETOP(32, "SEI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x38);
+ SETOP(33, "TXS", 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00);
+ SETOP(34, "BNG", 0x00, 0x00, 0x00, 0x00, 0x40, 0x00);
+ SETOP(35, "XOR", 0x41, 0x4B, 0x00, 0x00, 0x49, 0x00);
+ SETOP(36, "XRY", 0x42, 0xA2, 0x00, 0x00, 0x72, 0x00);
+ SETOP(37, "XAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x43);
+ SETOP(38, "XRX", 0x44, 0xA4, 0x00, 0x00, 0x74, 0x00);
+ SETOP(39, "XAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x45);
+ SETOP(40, "CLI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x48);
+ SETOP(41, "BCS", 0x00, 0x00, 0x00, 0x00, 0x50, 0x00);
+ SETOP(42, "LSL", 0x51, 0x55, 0x00, 0x00, 0x53, 0x00);
+ SETOP(43, "SEC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x58);
+ SETOP(44, "STA", 0x00, 0x7B, 0x8B, 0x9B, 0x5B, 0x00);
+ SETOP(45, "STY", 0x00, 0x7D, 0x8D, 0x00, 0x5D, 0x00);
+ SETOP(46, "STX", 0x00, 0x7E, 0x00, 0x9E, 0x5E, 0x00);
+ SETOP(47, "BCC", 0x00, 0x00, 0x00, 0x00, 0x60, 0x00);
+ SETOP(48, "LSR", 0x61, 0x65, 0x00, 0x00, 0x63, 0x00);
+ SETOP(49, "CLC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x68);
+ SETOP(50, "LDA", 0x69, 0x79, 0x89, 0x99, 0x59, 0x00);
+ SETOP(51, "LDY", 0x6A, 0x7A, 0x8A, 0x00, 0x5A, 0x00);
+ SETOP(52, "LDX", 0x6C, 0x7C, 0x00, 0x9C, 0x5C, 0x00);
+ SETOP(53, "BEQ", 0x00, 0x00, 0x00, 0x00, 0x70, 0x00);
+ SETOP(54, "ROL", 0x71, 0x75, 0x00, 0x00, 0x73, 0x00);
+ SETOP(55, "SSP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x78);
+ SETOP(56, "BNE", 0x00, 0x00, 0x00, 0x00, 0x80, 0x00);
+ SETOP(57, "ROR", 0x81, 0x85, 0x00, 0x00, 0x83, 0x00);
+ SETOP(58, "CSP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x88);
+ SETOP(59, "BVS", 0x00, 0x00, 0x00, 0x00, 0x90, 0x00);
+ SETOP(60, "MUL", 0x91, 0x95, 0x00, 0x00, 0x93, 0x00);
+ SETOP(61, "SEV", 0x00, 0x00, 0x00, 0x00, 0x00, 0x98);
+ SETOP(62, "BVC", 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00);
+ SETOP(63, "DIV", 0xA1, 0xA5, 0x00, 0x00, 0xA3, 0x00);
+ SETOP(64, "CLV", 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8);
+ SETOP(65, "RTS", 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0);
+ SETOP(66, "CMP", 0xB1, 0xF5, 0x00, 0x00, 0xE5, 0x00);
+ SETOP(67, "CPY", 0xB2, 0xF2, 0x00, 0x00, 0xE2, 0x00);
+ SETOP(68, "CAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0xB3);
+ SETOP(69, "CPX", 0xB4, 0xF4, 0x00, 0x00, 0xE4, 0x00);
+ SETOP(70, "CAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5);
+ SETOP(71, "ENT", 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00);
+ SETOP(72, "RTI", 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0);
+ SETOP(73, "INC", 0x00, 0xE3, 0x00, 0x00, 0xE1, 0xC1);
+ SETOP(74, "INY", 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2);
+ SETOP(75, "IAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3);
+ SETOP(76, "INX", 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4);
+ SETOP(77, "IAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5);
+ SETOP(78, "DEC", 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1);
+ SETOP(79, "DEY", 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2);
+ SETOP(80, "DAY", 0x00, 0xF3, 0x00, 0x00, 0xF1, 0xD3);
+ SETOP(81, "DEX", 0x00, 0x00, 0x00, 0x00, 0x00, 0xD4);
+ SETOP(82, "DAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5);
+ SETOP(83, "JSL", 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00);
+ SETOP(84, "NOP", 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8);
+ SETOP(85, "RTL", 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0);
+ SETOP(86, "BRK", 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8);
uint8_t done = 0;
uint64_t address = 0x0000;
while (!(done & 1)) {
@@ -164,7 +221,7 @@ int asmmon() {
char mode[3];
opent op;
uint8_t addrmode = 0;
- uint64_t value;
+ uint64_t value = 0;
char *oprand;
char *cmd;
char *tmp = malloc(sizeof(char *)*128);
@@ -181,26 +238,12 @@ int asmmon() {
oprand = strtok(NULL, "\t\n ");
strtok_r(ins, ".", &postfix);
}
- if (strcasecmp(cmd, "quit") == 0 || strcasecmp(cmd, "q") == 0)
+ if (strcasecmp(cmd, "quit") == 0 || strcasecmp(cmd, "q") == 0) {
return 2;
+ }
if (strcasecmp(cmd, "viewmem") == 0) {
done |= 4;
- printf("\t\t\t");
- for (int ind = 0; ind < 0x10; ind++) {
- printf("%02x", ind);
- if (ind < 0x0F)
- printf(" ");
- }
- printf("\n\n");
- for (int hi = 0; hi < 0x10; hi++) {
- printf("%016llx:\t", (address & ~0xF)+(hi*0x10));
- for (int lo = 0; lo < 0x10; lo++) {
- printf("%02x", addr[(address & ~0xF)+lo+(hi*0x10)]);
- if (lo < 0x0F)
- printf(" ");
- }
- printf("\n");
- }
+ viewmem(address);
}
if (oprand == NULL && ins == NULL && postfix == NULL) {
done |= 2;
@@ -245,7 +288,7 @@ int asmmon() {
break;
}
if (isalnum(oprand[i]) || oprand[i] == '_') {
- use_label(oprand, &value);
+ use_label(oprand, address);
sprintf(oprand, "%llx", value);
break;
}
@@ -281,6 +324,10 @@ int asmmon() {
}
}
+ if (oprand == NULL && !strcasecmp(ins, "TXS"))
+ addrmode = 1;
+ else if (oprand != NULL && !strcasecmp(ins, "TXS"))
+ addr[address++] = 0x17;
if (!(done & 2) && oprand != NULL) {
if (oprand[0] == '#' || oprand[0] == '$') {
if(oprand[0] == '#' && (oprand[1] == '$' || oprand[1] == '%')) {
@@ -323,19 +370,20 @@ int asmmon() {
break;
}
if (isalnum(oprand[i]) || oprand[i] == '_') {
- use_label(oprand, &value);
+ value = use_label(oprand, address);
if (value == 0)
addrmode = 2;
- if (value & 0xFFFFFFFF) {
+ if (value & 0xFFFFFFFF || value == 0) {
char *stf[] = {"BPO", "BNG", "BCS", "BCC", "BEQ", "BNE", "BVS", "BVC"};
for (int i = 0; i < 8; i++) {
- if (strcasecmp(ins, stf[i]) == 0) {
+ if (!strcasecmp(ins, stf[i])) {
addrmode = 5;
break;
} else {
addrmode = 2;
}
}
+
} else if (value & 0xFFFFFFFF00000000) {
addrmode = 5;
}
@@ -362,6 +410,7 @@ int asmmon() {
case PLY:
case PLX:
case STT:
+ case TXS:
case LSL:
case LSR:
case ROL:
@@ -429,6 +478,8 @@ int asmmon() {
break;
case 1:
if (op.imm) {
+ if (addr[address-1] == 0x17 && op.imm == TXS)
+ r = 0x17;
addr[address++] = op.imm;
switch (op.imm) {
case PHP:
@@ -447,6 +498,13 @@ int asmmon() {
case ENT:
addr[address++] = value & 0xFF;
break;
+ case TXS:
+ if (r == 0x17) {
+ addr[address] = value & 0xFF;
+ addr[address+2] = value >> 8;
+ address+=2;
+ }
+ break;
default:
addr[address] = value & 0xFF;
if (r & 0x10)
@@ -462,7 +520,6 @@ int asmmon() {
address+=(1 << ((r & 0x30) >> 4));
break;
-
}
break;
} else {
@@ -541,5 +598,6 @@ int asmmon() {
}
}
}
+ reslv_fixups();
return 0;
}