summaryrefslogtreecommitdiff
path: root/asmmon.c
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2019-12-24 22:18:32 -0500
committermrb0nk500 <b0nk@b0nk.xyz>2019-12-24 22:18:32 -0500
commit1dfc78b8bf5b708cb1118a9d6646397772a1b894 (patch)
treef3e9a0a87c4aa5a13a773fc1046a6d17fb4631f4 /asmmon.c
parentcd08c7e030dd269ffd0d3bdb6170e15998c796ec (diff)
Added support for Indirect addressing modes, and allow
for use of the B register as an operand, for ALU based instructions. This allows for both low code size, and high performance. This means we can save upto 9 bytes, by just using the B register for ALU operations, rather than using a memory address. The indirect addressing modes, give Sux the abillity to now use pointers. Hope you guys have a Merry Christmas! From mr b0nk 500 <b0nk@b0nk.xyz>
Diffstat (limited to 'asmmon.c')
-rw-r--r--asmmon.c357
1 files changed, 203 insertions, 154 deletions
diff --git a/asmmon.c b/asmmon.c
index 000cf49..7af4695 100644
--- a/asmmon.c
+++ b/asmmon.c
@@ -4,11 +4,12 @@
#define debug 1
-#define OPNUM 91
-#define SETOP(num, _mne, _IMM, _ZM, _ZMX, _ZMY, _ABS, _IMPL) \
+#define OPNUM 93
+#define SETOP(num, _mne, _IMM, _ZM, _ZMX, _ZMY, _IND, _INX, _INY, _ABS, _IMPL) \
{opcodes[num].mnemonic[3] = '\0'; strncpy(opcodes[num].mnemonic, _mne, 3); \
opcodes[num].imm = _IMM; \
opcodes[num].zm = _ZM; opcodes[num].zmx = _ZMX; opcodes[num].zmy = _ZMY; \
+opcodes[num].ind = _IND; opcodes[num].inx = _INX; opcodes[num].iny = _INY; \
opcodes[num].abs = _ABS; opcodes[num].impl = _IMPL;}
@@ -125,98 +126,100 @@ void viewmem(uint64_t address) {
}
int asmmon(const char *fn) {
opent opcodes[OPNUM];
- /* mne IMM ZM ZMX ZMY ABS IMPL*/
- SETOP(0, "CPS", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
- SETOP(1, "ADC", 0x01, 0x05, 0x00, 0x00, 0x03, 0x00);
- SETOP(2, "PHP", 0x08, 0x00, 0x00, 0x00, 0x00, 0x00);
- SETOP(3, "PHA", 0x09, 0x00, 0x00, 0x00, 0x00, 0x00);
- SETOP(4, "PHY", 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00);
- SETOP(5, "TAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B);
- SETOP(6, "PHX", 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00);
- SETOP(7, "TAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D);
- SETOP(8, "TYX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E);
- SETOP(9, "JMP", 0x00, 0xD0, 0x00, 0x00, 0x10, 0x00);
- SETOP(10, "SBC", 0x11, 0x15, 0x00, 0x00, 0x13, 0x00);
- SETOP(11, "PLP", 0x18, 0x00, 0x00, 0x00, 0x00, 0x00);
- SETOP(12, "PLA", 0x19, 0x00, 0x00, 0x00, 0x00, 0x00);
- SETOP(13, "PLY", 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00);
- SETOP(14, "TYA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B);
- SETOP(15, "PLX", 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00);
- SETOP(16, "TXA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D);
- SETOP(17, "TXY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E);
- SETOP(18, "JSR", 0x00, 0x20, 0x00, 0x00, 0x00, 0x00);
- SETOP(19, "AND", 0x21, 0x2B, 0x00, 0x00, 0x29, 0x00);
- SETOP(20, "ANY", 0x22, 0x82, 0x00, 0x00, 0x52, 0x00);
- SETOP(21, "AAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x23);
- 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, "TAB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C);
- SETOP(26, "TSX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E);
- SETOP(27, "BPO", 0x00, 0x00, 0x00, 0x00, 0x30, 0x00);
- SETOP(28, "ORA", 0x31, 0x3B, 0x00, 0x00, 0x39, 0x00);
- SETOP(29, "ORY", 0x32, 0x00, 0x00, 0x00, 0x62, 0x00);
- SETOP(23, "OAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x33);
- SETOP(31, "ORX", 0x34, 0x94, 0x00, 0x00, 0x64, 0x00);
- SETOP(32, "OAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x35);
- SETOP(33, "SEI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x38);
- SETOP(34, "TBA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C);
- SETOP(35, "TXS", 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00);
- SETOP(36, "BNG", 0x00, 0x00, 0x00, 0x00, 0x40, 0x00);
- SETOP(37, "XOR", 0x41, 0x4B, 0x00, 0x00, 0x49, 0x00);
- SETOP(38, "XRY", 0x42, 0xA2, 0x00, 0x00, 0x72, 0x00);
- SETOP(39, "XAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x43);
- SETOP(40, "XRX", 0x44, 0xA4, 0x00, 0x00, 0x74, 0x00);
- SETOP(41, "XAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x45);
- SETOP(42, "CLI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x48);
- SETOP(43, "BCS", 0x00, 0x00, 0x00, 0x00, 0x50, 0x00);
- SETOP(44, "LSL", 0x51, 0x55, 0x00, 0x00, 0x53, 0x00);
- SETOP(45, "SEC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x58);
- SETOP(46, "STA", 0x00, 0x7B, 0x8B, 0x9B, 0x5B, 0x00);
- SETOP(47, "STY", 0x00, 0x7D, 0x8D, 0x00, 0x5D, 0x00);
- SETOP(48, "STX", 0x00, 0x7E, 0x00, 0x9E, 0x5E, 0x00);
- SETOP(49, "BCC", 0x00, 0x00, 0x00, 0x00, 0x60, 0x00);
- SETOP(50, "LSR", 0x61, 0x65, 0x00, 0x00, 0x63, 0x00);
- SETOP(51, "CLC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x68);
- SETOP(52, "LDA", 0x69, 0x79, 0x89, 0x99, 0x59, 0x00);
- SETOP(53, "LDY", 0x6A, 0x7A, 0x8A, 0x00, 0x5A, 0x00);
- SETOP(54, "LDX", 0x6C, 0x7C, 0x00, 0x9C, 0x5C, 0x00);
- SETOP(55, "BEQ", 0x00, 0x00, 0x00, 0x00, 0x70, 0x00);
- SETOP(56, "ROL", 0x71, 0x75, 0x00, 0x00, 0x73, 0x00);
- SETOP(57, "SSP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x78);
- SETOP(58, "BNE", 0x00, 0x00, 0x00, 0x00, 0x80, 0x00);
- SETOP(59, "ROR", 0x81, 0x85, 0x00, 0x00, 0x83, 0x00);
- SETOP(60, "CSP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x88);
- SETOP(61, "BVS", 0x00, 0x00, 0x00, 0x00, 0x90, 0x00);
- SETOP(62, "MUL", 0x91, 0x95, 0x00, 0x00, 0x93, 0x00);
- SETOP(63, "SEV", 0x00, 0x00, 0x00, 0x00, 0x00, 0x98);
- SETOP(64, "BVC", 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00);
- SETOP(65, "DIV", 0xA1, 0xA5, 0x00, 0x00, 0xA3, 0x00);
- SETOP(66, "CLV", 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8);
- SETOP(67, "ASR", 0xA9, 0xAD, 0x00, 0x00, 0xAB, 0x00);
- SETOP(68, "RTS", 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0);
- SETOP(69, "CMP", 0xB1, 0xF5, 0x00, 0x00, 0xE5, 0x00);
- SETOP(70, "CPY", 0xB2, 0xF2, 0x00, 0x00, 0xE2, 0x00);
- SETOP(71, "CAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0xB3);
- SETOP(72, "CPX", 0xB4, 0xF4, 0x00, 0x00, 0xE4, 0x00);
- SETOP(73, "CAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5);
- SETOP(74, "ENT", 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00);
- SETOP(75, "RTI", 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0);
- SETOP(76, "INC", 0x00, 0xE3, 0x00, 0x00, 0xE1, 0xC1);
- SETOP(77, "INY", 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2);
- SETOP(78, "IAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3);
- SETOP(79, "INX", 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4);
- SETOP(80, "IAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5);
- SETOP(81, "DEC", 0x00, 0xF3, 0x00, 0x00, 0xF1, 0xD1);
- SETOP(82, "DEY", 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2);
- SETOP(83, "DAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3);
- SETOP(84, "DEX", 0x00, 0x00, 0x00, 0x00, 0x00, 0xD4);
- SETOP(85, "DAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5);
- SETOP(86, "WAI", 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8);
- SETOP(87, "JSL", 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00);
- SETOP(88, "NOP", 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8);
- SETOP(89, "RTL", 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0);
- SETOP(90, "BRK", 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8);
+ /* mne IMM ZM ZMX ZMY IND INX INY ABS IMPL*/
+ SETOP( 0, "CPS", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ SETOP( 1, "ADC", 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00);
+ SETOP( 2, "AAB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02);
+ SETOP( 3, "PHB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06);
+ SETOP( 4, "PHP", 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ SETOP( 5, "PHA", 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ SETOP( 6, "PHY", 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ SETOP( 7, "TAY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B);
+ SETOP( 8, "PHX", 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ SETOP( 9, "TAX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D);
+ SETOP(10, "TYX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E);
+ SETOP(11, "JMP", 0x00, 0xD0, 0x00, 0x00, 0x04, 0x14, 0x24, 0x10, 0x00);
+ SETOP(12, "SBC", 0x11, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00);
+ SETOP(13, "SAB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12);
+ SETOP(14, "PLB", 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ SETOP(15, "PLP", 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ SETOP(16, "PLA", 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ SETOP(17, "PLY", 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ SETOP(18, "TYA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B);
+ SETOP(19, "PLX", 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ SETOP(20, "TXA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D);
+ SETOP(21, "TXY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E);
+ SETOP(22, "JSR", 0x00, 0x20, 0x00, 0x00, 0x34, 0x44, 0x54, 0x00, 0x00);
+ SETOP(23, "AND", 0x21, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00);
+ SETOP(24, "ABA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22);
+ SETOP(25, "STT", 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ SETOP(26, "TAB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26);
+ SETOP(27, "TSX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E);
+ SETOP(28, "BPO", 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00);
+ SETOP(29, "ORA", 0x31, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00);
+ SETOP(30, "OAB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32);
+ SETOP(31, "TBA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36);
+ SETOP(32, "SEI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38);
+ SETOP(33, "TXS", 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ SETOP(34, "BNG", 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00);
+ SETOP(35, "XOR", 0x41, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00);
+ SETOP(36, "XAB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42);
+ SETOP(37, "CLI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48);
+ SETOP(38, "BCS", 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00);
+ SETOP(39, "LSL", 0x51, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00);
+ SETOP(40, "LLB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52);
+ SETOP(41, "STB", 0x00, 0x7F, 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0x5F, 0x00);
+ SETOP(42, "SEC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58);
+ SETOP(43, "STA", 0x00, 0x7B, 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0x5B, 0x00);
+ SETOP(44, "STY", 0x00, 0x7D, 0x8D, 0x00, 0xAD, 0xBD, 0x00, 0x5D, 0x00);
+ SETOP(45, "STX", 0x00, 0x7E, 0x00, 0x9E, 0xAE, 0x00, 0xCE, 0x5E, 0x00);
+ SETOP(46, "BCC", 0x00, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00);
+ SETOP(47, "LSR", 0x61, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00);
+ SETOP(48, "LRB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62);
+ SETOP(49, "LDB", 0x66, 0x76, 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0x56, 0x00);
+ SETOP(50, "CLC", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68);
+ SETOP(51, "LDA", 0x69, 0x79, 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0x59, 0x00);
+ SETOP(52, "LDY", 0x6A, 0x7A, 0x8A, 0x00, 0xAA, 0xBA, 0x00, 0x5A, 0x00);
+ SETOP(53, "LDX", 0x6C, 0x7C, 0x00, 0x9C, 0xAC, 0x00, 0xCC, 0x5C, 0x00);
+ SETOP(54, "BEQ", 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00);
+ SETOP(55, "ROL", 0x71, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00);
+ SETOP(56, "RLB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72);
+ SETOP(57, "SSP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78);
+ SETOP(58, "BNE", 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00);
+ SETOP(59, "ROR", 0x81, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00);
+ SETOP(60, "RRB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82);
+ SETOP(61, "CSP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88);
+ SETOP(62, "BVS", 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00);
+ SETOP(63, "MUL", 0x91, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x00);
+ SETOP(64, "MAB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92);
+ SETOP(65, "SEV", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98);
+ SETOP(66, "BVC", 0x00, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00);
+ SETOP(67, "DIV", 0xA1, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3, 0x00);
+ SETOP(68, "DAB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2);
+ SETOP(69, "CLV", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8);
+ SETOP(70, "RTS", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0);
+ SETOP(71, "CMP", 0xB1, 0xB5, 0x00, 0x00, 0xE9, 0xEB, 0xED, 0xB3, 0x00);
+ SETOP(72, "CAB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB2);
+ SETOP(73, "CPY", 0x2A, 0x3B, 0x00, 0x00, 0xEA, 0xFA, 0x00, 0x2B, 0x00);
+ SETOP(74, "CPX", 0xBC, 0x3D, 0x00, 0x00, 0xEC, 0x00, 0xFC, 0x2D, 0x00);
+ SETOP(75, "CPB", 0xD6, 0xF6, 0x00, 0x00, 0xDF, 0xEF, 0xFF, 0xE6, 0x00);
+ SETOP(76, "ENT", 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+ SETOP(77, "RTI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0);
+ SETOP(78, "INC", 0x00, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xC1);
+ SETOP(79, "IAB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2);
+ SETOP(80, "INY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A);
+ SETOP(81, "INX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C);
+ SETOP(82, "DEC", 0x00, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xD1);
+ SETOP(83, "DBA", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2);
+ SETOP(84, "DEY", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A);
+ SETOP(85, "DEX", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C);
+ SETOP(86, "WAI", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8);
+ SETOP(87, "JSL", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00);
+ SETOP(88, "ASR", 0xE1, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x00);
+ SETOP(89, "ARB", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2);
+ SETOP(90, "NOP", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8);
+ SETOP(91, "RTL", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0);
+ SETOP(92, "BRK", 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8);
FILE *fp;
if (strcasecmp(fn, "stdin") != 0) {
fp = fopen(fn, "r");
@@ -256,30 +259,31 @@ int asmmon(const char *fn) {
strtok_r(ins, ".", &postfix);
if (oprand != NULL) {
for (int i = 0; i < strlen(oprand); i++) {
+ if (oprand[i] == '(')
+ addrmode = 6;
if (oprand[i] == '"')
break;
- if (oprand[i] == 'x' || oprand[i] == 'X') {
- ir[0] = 'x';
- ir[1] = '\0';
- break;
- }
- if (oprand[i] == 'y' || oprand[i] == 'Y') {
- ir[0] = 'y';
- ir[1] = '\0';
- break;
+ if (a && oprand[a] == ',') {
+ if (oprand[i] == 'x' || oprand[i] == 'X') {
+ ir[0] = 'x';
+ ir[1] = '\0';
+ }
+ if (oprand[i] == 'y' || oprand[i+1] == 'Y') {
+ ir[0] = 'y';
+ ir[1] = '\0';
+ }
}
- if (oprand[i] == ',' || oprand[i] == ';') {
+ if (oprand[i] == ',' || oprand[i] == ';')
a = i;
- }
}
if (a)
oprand[a] = '\0';
}
}
- if (strcasecmp(cmd, "quit") == 0 || strcasecmp(cmd, "q") == 0) {
+ if (!strcasecmp(cmd, "quit") || !strcasecmp(cmd, "q")) {
return 2;
}
- if (strcasecmp(cmd, "viewmem") == 0) {
+ if (!strcasecmp(cmd, "viewmem") || !strcasecmp(cmd, "vm") || !strcasecmp(cmd, "v")) {
done |= 4;
viewmem(address);
}
@@ -437,51 +441,56 @@ int asmmon(const char *fn) {
}
}
- if (oprand == NULL && !strcasecmp(ins, "TXS"))
+ if (oprand == NULL && !strcasecmp(ins, "TXS")) {
addrmode = 1;
+ done |= 32;
+ }
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] == '%')) {
- mode[1] = oprand[1];
- mode[2] = '\0';
- } else {
- mode[1] = '\0';
- }
- mode[0] = oprand[0];
- oprand = strtok(oprand, "#$%");
+ mode[0] = oprand[0];
+ mode[1] = oprand[1];
+ if (oprand[0] == '#' || oprand[0] == '$' || oprand[0] == '(') {
+ oprand = strtok(oprand, "#($%");
if (mode[0] == '#') {
addrmode = 1;
+ done |= 32;
if (mode[1] == '$')
value = strtoull(oprand, NULL, 16);
- if (mode[1] == '%')
+ else if (mode[1] == '%')
value = strtoull(oprand, NULL, 2);
- }
- if (mode[0] == '$') {
- value = strtoull(oprand, NULL, 16);
- if (value == 0)
- addrmode = 2;
- if (value & 0xFFFFFFFF) {
- char *stf[] = {"BPO", "BNG", "BCS", "BCC", "BEQ", "BNE", "BVS", "BVC"};
- for (int i = 0; i < 8; i++) {
- if (strcasecmp(ins, stf[i]) == 0) {
- addrmode = 5;
- break;
- } else {
- addrmode = 2;
- }
+ else
+ value = strtoull(oprand, NULL, 10);
+ } else {
+ if (mode[0] == '$' || mode[1] == '$')
+ value = strtoull(oprand, NULL, 16);
+ else if (mode[0] == '%' || mode[1] == '%')
+ value = strtoull(oprand, NULL, 2);
+ else
+ value = strtoull(oprand, NULL, 10);
+ if (mode[0] != '(') {
+ if (value & 0xFFFFFFFF || !value) {
+ addrmode = 2;
+ } else if (value & 0xFFFFFFFF00000000) {
+ addrmode = 5;
}
- } else if (value & 0xFFFFFFFF00000000) {
- addrmode = 5;
}
- if (addrmode == 2 && ir != NULL) {
+ if ((addrmode == 2 || addrmode == 6) && ir != NULL) {
switch (ir[0]) {
case 'x':
- addrmode = 3;
+ if (addrmode == 2)
+ addrmode = 3;
+ else if (addrmode == 6)
+ addrmode = 7;
break;
case 'y':
- addrmode = 4;
+ if (addrmode == 2)
+ addrmode = 4;
+ else if (addrmode == 6)
+ addrmode = 8;
+ break;
+ default:
+ done |= 32;
break;
}
}
@@ -494,28 +503,29 @@ int asmmon(const char *fn) {
}
if ((isalnum(oprand[i]) || oprand[i] == '_') && oprand[i] != '"') {
value = use_label(oprand, address);
- if (value == 0)
- addrmode = 2;
- 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])) {
- addrmode = 5;
- break;
- } else {
- addrmode = 2;
- }
+ if (mode[0] != '(') {
+ if (value & 0xFFFFFFFF || !value) {
+ addrmode = 2;
+ } else if (value & 0xFFFFFFFF00000000) {
+ addrmode = 5;
}
- } else if (value & 0xFFFFFFFF00000000) {
- addrmode = 5;
}
- if (addrmode == 2 && ir != NULL) {
+ if ((addrmode == 2 || addrmode == 6) && ir != NULL && a) {
switch (ir[0]) {
case 'x':
- addrmode = 3;
+ if (addrmode == 2)
+ addrmode = 3;
+ else if (addrmode == 6)
+ addrmode = 7;
break;
case 'y':
- addrmode = 4;
+ if (addrmode == 2)
+ addrmode = 4;
+ else if (addrmode == 6)
+ addrmode = 8;
+ break;
+ default:
+ done |= 32;
break;
}
}
@@ -716,6 +726,45 @@ int asmmon(const char *fn) {
fprintf(stderr, "oof, %s cannot be an absolute dictator.\n", op.mnemonic);
}
break;
+ case 6:
+ if (op.ind) {
+ addr[address++] = op.ind;
+ addr[address] = value & 0xFF;
+ addr[address+1] = value >> 8;
+ addr[address+2] = value >> 16;
+ addr[address+3] = value >> 24;
+ address+=4;
+ break;
+ } else {
+ fprintf(stderr, "oof, %s cannot use pointers.\n", op.mnemonic);
+ }
+ break;
+ case 7:
+ if (op.inx) {
+ addr[address++] = op.inx;
+ addr[address] = value & 0xFF;
+ addr[address+1] = value >> 8;
+ addr[address+2] = value >> 16;
+ addr[address+3] = value >> 24;
+ address+=4;
+ break;
+ } else {
+ fprintf(stderr, "oof, %s does not use Indexed Indirect.\n", op.mnemonic);
+ }
+ break;
+ case 8:
+ if (op.iny) {
+ addr[address++] = op.iny;
+ addr[address] = value & 0xFF;
+ addr[address+1] = value >> 8;
+ addr[address+2] = value >> 16;
+ addr[address+3] = value >> 24;
+ address+=4;
+ break;
+ } else {
+ fprintf(stderr, "oof, %s does not use Indirect Indexed.\n", op.mnemonic);
+ }
+ break;
}
#if debug
if (!(done & 6)) {
@@ -726,7 +775,7 @@ int asmmon(const char *fn) {
printf("Postfix: %s, ", (postfix[0] != '\0') ? postfix : "none");
#endif
printf("Operand: %s, ", (oprand != NULL && !(done & 16)) ? oprand : "none");
- printf("Index Register: %s, ", (ir != NULL) ? ir : "none");
+ printf("Index Register: %s, ", (ir != NULL && !(done & 32)) ? ir : "none");
printf("Address: $%llx\n", address);
}
#endif