-//\r
-// 65C02 disassembler\r
-//\r
-// by James L. Hammons\r
-// (c) 2005 Underground Software\r
-//\r
-\r
-#include <stdio.h>\r
-#include <string>\r
-#include "dis65c02.h"\r
-//#include "types.h"\r
-#include "v65c02.h"\r
-#include "log.h"\r
-\r
-using namespace std;\r
-\r
-// External shit\r
-\r
-extern V65C02REGS mainCPU;//Hm. Shouldn't we pass this shit in?\r
-\r
-// Private globals variables\r
-\r
-static uint8 op_mat[256] = {\r
- 14, 6, 0, 0, 2, 2, 2, 2, 14, 1, 14, 0, 8, 8, 8, 13,\r
- 13, 7, 5, 0, 2, 3, 3, 2, 14, 10, 14, 0, 8, 9, 9, 13,\r
- 8, 6, 0, 0, 2, 2, 2, 2, 14, 1, 14, 0, 8, 8, 8, 13,\r
- 13, 7, 5, 0, 3, 3, 3, 2, 14, 10, 14, 0, 9, 9, 9, 13,\r
- 14, 6, 0, 0, 0, 2, 2, 2, 14, 1, 14, 0, 8, 8, 8, 13,\r
- 13, 7, 5, 0, 0, 3, 3, 2, 14, 10, 14, 0, 0, 9, 9, 13,\r
- 14, 6, 0, 0, 2, 2, 2, 2, 14, 1, 14, 0, 11, 8, 8, 13,\r
- 13, 7, 5, 0, 3, 3, 3, 2, 14, 10, 14, 0, 12, 9, 9, 13,\r
- 13, 6, 0, 0, 2, 2, 2, 2, 14, 1, 14, 0, 8, 8, 8, 13,\r
- 13, 7, 5, 0, 3, 3, 4, 2, 14, 10, 14, 0, 8, 9, 9, 13,\r
- 1, 6, 1, 0, 2, 2, 2, 2, 14, 1, 14, 0, 8, 8, 8, 13,\r
- 13, 7, 5, 0, 3, 3, 4, 2, 14, 10, 14, 0, 9, 9, 10, 13,\r
- 1, 6, 0, 0, 2, 2, 2, 2, 14, 1, 14, 0, 8, 8, 8, 13,\r
- 13, 7, 5, 0, 0, 3, 3, 2, 14, 10, 14, 0, 0, 9, 9, 13,\r
- 1, 6, 0, 0, 2, 2, 2, 2, 14, 1, 14, 0, 8, 8, 8, 13,\r
- 13, 7, 5, 0, 0, 3, 3, 2, 14, 10, 14, 0, 0, 9, 9, 13 };\r
-\r
-static uint8 mnemonics[256][6] = {\r
- "BRK ","ORA ","??? ","??? ","TSB ","ORA ","ASL ","RMB0 ",\r
- "PHP ","ORA ","ASL ","??? ","TSB ","ORA ","ASL ","BBR0 ",\r
- "BPL ","ORA ","ORA ","??? ","TRB ","ORA ","ASL ","RMB1 ",\r
- "CLC ","ORA ","INC ","??? ","TRB ","ORA ","ASL ","BBR1 ",\r
- "JSR ","AND ","??? ","??? ","BIT ","AND ","ROL ","RMB2 ",\r
- "PLP ","AND ","ROL ","??? ","BIT ","AND ","ROL ","BBR2 ",\r
- "BMI ","AND ","AND ","??? ","BIT ","AND ","ROL ","RMB3 ",\r
- "SEC ","AND ","DEC ","??? ","BIT ","AND ","ROL ","BBR3 ",\r
- "RTI ","EOR ","??? ","??? ","??? ","EOR ","LSR ","RMB4 ",\r
- "PHA ","EOR ","LSR ","??? ","JMP ","EOR ","LSR ","BBR4 ",\r
- "BVC ","EOR ","EOR ","??? ","??? ","EOR ","LSR ","RMB5 ",\r
- "CLI ","EOR ","PHY ","??? ","??? ","EOR ","LSR ","BBR5 ",\r
- "RTS ","ADC ","??? ","??? ","STZ ","ADC ","ROR ","RMB6 ",\r
- "PLA ","ADC ","ROR ","??? ","JMP ","ADC ","ROR ","BBR6 ",\r
- "BVS ","ADC ","ADC ","??? ","STZ ","ADC ","ROR ","RMB7 ",\r
- "SEI ","ADC ","PLY ","??? ","JMP ","ADC ","ROR ","BBR7 ",\r
- "BRA ","STA ","??? ","??? ","STY ","STA ","STX ","SMB0 ",\r
- "DEY ","BIT ","TXA ","??? ","STY ","STA ","STX ","BBS0 ",\r
- "BCC ","STA ","STA ","??? ","STY ","STA ","STX ","SMB1 ",\r
- "TYA ","STA ","TXS ","??? ","STZ ","STA ","STZ ","BBS1 ",\r
- "LDY ","LDA ","LDX ","??? ","LDY ","LDA ","LDX ","SMB2 ",\r
- "TAY ","LDA ","TAX ","??? ","LDY ","LDA ","LDX ","BBS2 ",\r
- "BCS ","LDA ","LDA ","??? ","LDY ","LDA ","LDX ","SMB3 ",\r
- "CLV ","LDA ","TSX ","??? ","LDY ","LDA ","LDX ","BBS3 ",\r
- "CPY ","CMP ","??? ","??? ","CPY ","CMP ","DEC ","SMB4 ",\r
- "INY ","CMP ","DEX ","??? ","CPY ","CMP ","DEC ","BBS4 ",\r
- "BNE ","CMP ","CMP ","??? ","??? ","CMP ","DEC ","SMB5 ",\r
- "CLD ","CMP ","PHX ","??? ","??? ","CMP ","DEC ","BBS5 ",\r
- "CPX ","SBC ","??? ","??? ","CPX ","SBC ","INC ","SMB6 ",\r
- "INX ","SBC ","NOP ","??? ","CPX ","SBC ","INC ","BBS6 ",\r
- "BEQ ","SBC ","SBC ","??? ","??? ","SBC ","INC ","SMB7 ",\r
- "SED ","SBC ","PLX ","??? ","??? ","SBC ","INC ","BBS7 " };\r
-\r
-//\r
-// Display bytes in mem in hex\r
-//\r
-static void DisplayBytes(uint16 src, uint32 dst)\r
-{\r
- WriteLog("%04X: ", src);\r
- uint8 cnt = 0; // Init counter...\r
-\r
- if (src > dst)\r
- dst += 0x10000; // That should fix the FFFF bug...\r
-\r
- for(uint32 i=src; i<dst; i++)\r
- {\r
- WriteLog("%02X ", mainCPU.RdMem(i));\r
- cnt++; // Bump counter...\r
- }\r
-\r
- for(int i=cnt; i<5; i++) // Pad the leftover spaces...\r
- WriteLog(" ");\r
-}\r
-\r
-//\r
-// Decode a 65C02 instruction\r
-//\r
-int Decode65C02(uint16 pc)\r
-{\r
-/*\r
- 0) illegal\r
- 1) imm = #$00\r
- 2) zp = $00\r
- 3) zpx = $00,X\r
- 4) zpy = $00,Y\r
- 5) izp = ($00)\r
- 6) izx = ($00,X)\r
- 7) izy = ($00),Y\r
- 8) abs = $0000\r
- 9) abx = $0000,X\r
-10) aby = $0000,Y\r
-11) ind = ($0000)\r
-12) iax = ($0000,X)\r
-13) rel = $0000 (PC-relative)\r
-14) inherent\r
-*/\r
- char outbuf[80];\r
-\r
- uint16 addr = pc;\r
- uint8 opcode = mainCPU.RdMem(addr++); // Get the opcode\r
-\r
- switch (op_mat[opcode]) // Decode the addressing mode...\r
- {\r
- case 0: // Illegal\r
- sprintf(outbuf, "???");\r
- break;\r
- case 1: // Immediate\r
- sprintf(outbuf, "%s #$%02X", mnemonics[opcode], mainCPU.RdMem(addr++));\r
- break;\r
- case 2: // Zero page\r
- sprintf(outbuf, "%s $%02X", mnemonics[opcode], mainCPU.RdMem(addr++));\r
- break;\r
- case 3: // Zero page, X\r
- sprintf(outbuf, "%s $%02X,X", mnemonics[opcode], mainCPU.RdMem(addr++));\r
- break;\r
- case 4: // Zero page, Y\r
- sprintf(outbuf, "%s $%02X,Y", mnemonics[opcode], mainCPU.RdMem(addr++));\r
- break;\r
- case 5: // Zero page indirect\r
- sprintf(outbuf, "%s ($%02X)", mnemonics[opcode], mainCPU.RdMem(addr++));\r
- break;\r
- case 6: // Zero page, X indirect\r
- sprintf(outbuf, "%s ($%02X,X)", mnemonics[opcode], mainCPU.RdMem(addr++));\r
- break;\r
- case 7: // Zero page, Y indirect\r
- sprintf(outbuf, "%s ($%02X),Y", mnemonics[opcode], mainCPU.RdMem(addr++));\r
- break;\r
- case 8: // Absolute\r
- sprintf(outbuf, "%s $%04X", mnemonics[opcode], mainCPU.RdMem(addr++) | (mainCPU.RdMem(addr++) << 8));\r
- break;\r
- case 9: // Absolute, X\r
- sprintf(outbuf, "%s $%04X,X", mnemonics[opcode], mainCPU.RdMem(addr++) | (mainCPU.RdMem(addr++) << 8));\r
- break;\r
- case 10: // Absolute, Y\r
- sprintf(outbuf, "%s $%04X,Y", mnemonics[opcode], mainCPU.RdMem(addr++) | (mainCPU.RdMem(addr++) << 8));\r
- break;\r
- case 11: // Indirect\r
- sprintf(outbuf, "%s ($%04X)", mnemonics[opcode], mainCPU.RdMem(addr++) | (mainCPU.RdMem(addr++) << 8));\r
- break;\r
- case 12: // Indirect, X\r
- sprintf(outbuf, "%s ($%04X,X)", mnemonics[opcode], mainCPU.RdMem(addr++) | (mainCPU.RdMem(addr++) << 8));\r
- break;\r
- case 13: // Relative\r
-// sprintf(outbuf, "%s $%04X", mnemonics[opcode], ++addr + (int16)(int8)mainCPU.RdMem(addr));\r
- sprintf(outbuf, "%s $%04X", mnemonics[opcode], addr + (int16)((int8)mainCPU.RdMem(addr)) + 1);\r
- addr++;\r
- break;\r
- case 14: // Inherent\r
- sprintf(outbuf, "%s ", mnemonics[opcode]);\r
- break;\r
- }\r
-\r
- DisplayBytes(pc, addr); // Show bytes\r
- WriteLog("%-16s", outbuf); // Display opcode & addressing, etc.\r
-\r
- return addr - pc;\r
-}\r
+//
+// 65C02 disassembler
+//
+// by James L. Hammons
+// (c) 2005 Underground Software
+//
+
+#include "dis65c02.h"
+
+#include <stdio.h>
+#include <string>
+#include "v65c02.h"
+#include "log.h"
+
+using namespace std;
+
+// External shit
+
+extern V65C02REGS mainCPU;//Hm. Shouldn't we pass this shit in? ANSWER: YES. !!! FIX !!!
+
+// Private globals variables
+
+static uint8 op_mat[256] = {
+ 14, 6, 0, 0, 2, 2, 2, 2, 14, 1, 14, 0, 8, 8, 8, 13,
+ 13, 7, 5, 0, 2, 3, 3, 2, 14, 10, 14, 0, 8, 9, 9, 13,
+ 8, 6, 0, 0, 2, 2, 2, 2, 14, 1, 14, 0, 8, 8, 8, 13,
+ 13, 7, 5, 0, 3, 3, 3, 2, 14, 10, 14, 0, 9, 9, 9, 13,
+ 14, 6, 0, 0, 0, 2, 2, 2, 14, 1, 14, 0, 8, 8, 8, 13,
+ 13, 7, 5, 0, 0, 3, 3, 2, 14, 10, 14, 0, 0, 9, 9, 13,
+ 14, 6, 0, 0, 2, 2, 2, 2, 14, 1, 14, 0, 11, 8, 8, 13,
+ 13, 7, 5, 0, 3, 3, 3, 2, 14, 10, 14, 0, 12, 9, 9, 13,
+ 13, 6, 0, 0, 2, 2, 2, 2, 14, 1, 14, 0, 8, 8, 8, 13,
+ 13, 7, 5, 0, 3, 3, 4, 2, 14, 10, 14, 0, 8, 9, 9, 13,
+ 1, 6, 1, 0, 2, 2, 2, 2, 14, 1, 14, 0, 8, 8, 8, 13,
+ 13, 7, 5, 0, 3, 3, 4, 2, 14, 10, 14, 0, 9, 9, 10, 13,
+ 1, 6, 0, 0, 2, 2, 2, 2, 14, 1, 14, 0, 8, 8, 8, 13,
+ 13, 7, 5, 0, 0, 3, 3, 2, 14, 10, 14, 0, 0, 9, 9, 13,
+ 1, 6, 0, 0, 2, 2, 2, 2, 14, 1, 14, 0, 8, 8, 8, 13,
+ 13, 7, 5, 0, 0, 3, 3, 2, 14, 10, 14, 0, 0, 9, 9, 13 };
+
+static uint8 mnemonics[256][6] = {
+ "BRK ","ORA ","??? ","??? ","TSB ","ORA ","ASL ","RMB0 ",
+ "PHP ","ORA ","ASL ","??? ","TSB ","ORA ","ASL ","BBR0 ",
+ "BPL ","ORA ","ORA ","??? ","TRB ","ORA ","ASL ","RMB1 ",
+ "CLC ","ORA ","INC ","??? ","TRB ","ORA ","ASL ","BBR1 ",
+ "JSR ","AND ","??? ","??? ","BIT ","AND ","ROL ","RMB2 ",
+ "PLP ","AND ","ROL ","??? ","BIT ","AND ","ROL ","BBR2 ",
+ "BMI ","AND ","AND ","??? ","BIT ","AND ","ROL ","RMB3 ",
+ "SEC ","AND ","DEC ","??? ","BIT ","AND ","ROL ","BBR3 ",
+ "RTI ","EOR ","??? ","??? ","??? ","EOR ","LSR ","RMB4 ",
+ "PHA ","EOR ","LSR ","??? ","JMP ","EOR ","LSR ","BBR4 ",
+ "BVC ","EOR ","EOR ","??? ","??? ","EOR ","LSR ","RMB5 ",
+ "CLI ","EOR ","PHY ","??? ","??? ","EOR ","LSR ","BBR5 ",
+ "RTS ","ADC ","??? ","??? ","STZ ","ADC ","ROR ","RMB6 ",
+ "PLA ","ADC ","ROR ","??? ","JMP ","ADC ","ROR ","BBR6 ",
+ "BVS ","ADC ","ADC ","??? ","STZ ","ADC ","ROR ","RMB7 ",
+ "SEI ","ADC ","PLY ","??? ","JMP ","ADC ","ROR ","BBR7 ",
+ "BRA ","STA ","??? ","??? ","STY ","STA ","STX ","SMB0 ",
+ "DEY ","BIT ","TXA ","??? ","STY ","STA ","STX ","BBS0 ",
+ "BCC ","STA ","STA ","??? ","STY ","STA ","STX ","SMB1 ",
+ "TYA ","STA ","TXS ","??? ","STZ ","STA ","STZ ","BBS1 ",
+ "LDY ","LDA ","LDX ","??? ","LDY ","LDA ","LDX ","SMB2 ",
+ "TAY ","LDA ","TAX ","??? ","LDY ","LDA ","LDX ","BBS2 ",
+ "BCS ","LDA ","LDA ","??? ","LDY ","LDA ","LDX ","SMB3 ",
+ "CLV ","LDA ","TSX ","??? ","LDY ","LDA ","LDX ","BBS3 ",
+ "CPY ","CMP ","??? ","??? ","CPY ","CMP ","DEC ","SMB4 ",
+ "INY ","CMP ","DEX ","??? ","CPY ","CMP ","DEC ","BBS4 ",
+ "BNE ","CMP ","CMP ","??? ","??? ","CMP ","DEC ","SMB5 ",
+ "CLD ","CMP ","PHX ","??? ","??? ","CMP ","DEC ","BBS5 ",
+ "CPX ","SBC ","??? ","??? ","CPX ","SBC ","INC ","SMB6 ",
+ "INX ","SBC ","NOP ","??? ","CPX ","SBC ","INC ","BBS6 ",
+ "BEQ ","SBC ","SBC ","??? ","??? ","SBC ","INC ","SMB7 ",
+ "SED ","SBC ","PLX ","??? ","??? ","SBC ","INC ","BBS7 " };
+
+//
+// Display bytes in mem in hex
+//
+static void DisplayBytes(uint16 src, uint32 dst)
+{
+ WriteLog("%04X: ", src);
+ uint8 cnt = 0; // Init counter...
+
+ if (src > dst)
+ dst += 0x10000; // That should fix the FFFF bug...
+
+ for(uint32 i=src; i<dst; i++)
+ {
+ WriteLog("%02X ", mainCPU.RdMem(i));
+ cnt++; // Bump counter...
+ }
+
+ for(int i=cnt; i<5; i++) // Pad the leftover spaces...
+ WriteLog(" ");
+}
+
+//
+// Decode a 65C02 instruction
+//
+int Decode65C02(uint16 pc)
+{
+/*
+ 0) illegal
+ 1) imm = #$00
+ 2) zp = $00
+ 3) zpx = $00,X
+ 4) zpy = $00,Y
+ 5) izp = ($00)
+ 6) izx = ($00,X)
+ 7) izy = ($00),Y
+ 8) abs = $0000
+ 9) abx = $0000,X
+10) aby = $0000,Y
+11) ind = ($0000)
+12) iax = ($0000,X)
+13) rel = $0000 (PC-relative)
+14) inherent
+*/
+ char outbuf[80];
+
+ uint16 addr = pc;
+ uint8 opcode = mainCPU.RdMem(addr++); // Get the opcode
+
+ switch (op_mat[opcode]) // Decode the addressing mode...
+ {
+ case 0: // Illegal
+ sprintf(outbuf, "???");
+ break;
+ case 1: // Immediate
+ sprintf(outbuf, "%s #$%02X", mnemonics[opcode], mainCPU.RdMem(addr++));
+ break;
+ case 2: // Zero page
+ sprintf(outbuf, "%s $%02X", mnemonics[opcode], mainCPU.RdMem(addr++));
+ break;
+ case 3: // Zero page, X
+ sprintf(outbuf, "%s $%02X,X", mnemonics[opcode], mainCPU.RdMem(addr++));
+ break;
+ case 4: // Zero page, Y
+ sprintf(outbuf, "%s $%02X,Y", mnemonics[opcode], mainCPU.RdMem(addr++));
+ break;
+ case 5: // Zero page indirect
+ sprintf(outbuf, "%s ($%02X)", mnemonics[opcode], mainCPU.RdMem(addr++));
+ break;
+ case 6: // Zero page, X indirect
+ sprintf(outbuf, "%s ($%02X,X)", mnemonics[opcode], mainCPU.RdMem(addr++));
+ break;
+ case 7: // Zero page, Y indirect
+ sprintf(outbuf, "%s ($%02X),Y", mnemonics[opcode], mainCPU.RdMem(addr++));
+ break;
+ case 8: // Absolute
+ sprintf(outbuf, "%s $%04X", mnemonics[opcode], mainCPU.RdMem(addr++) | (mainCPU.RdMem(addr++) << 8));
+ break;
+ case 9: // Absolute, X
+ sprintf(outbuf, "%s $%04X,X", mnemonics[opcode], mainCPU.RdMem(addr++) | (mainCPU.RdMem(addr++) << 8));
+ break;
+ case 10: // Absolute, Y
+ sprintf(outbuf, "%s $%04X,Y", mnemonics[opcode], mainCPU.RdMem(addr++) | (mainCPU.RdMem(addr++) << 8));
+ break;
+ case 11: // Indirect
+ sprintf(outbuf, "%s ($%04X)", mnemonics[opcode], mainCPU.RdMem(addr++) | (mainCPU.RdMem(addr++) << 8));
+ break;
+ case 12: // Indirect, X
+ sprintf(outbuf, "%s ($%04X,X)", mnemonics[opcode], mainCPU.RdMem(addr++) | (mainCPU.RdMem(addr++) << 8));
+ break;
+ case 13: // Relative
+// sprintf(outbuf, "%s $%04X", mnemonics[opcode], ++addr + (int16)(int8)mainCPU.RdMem(addr));
+ sprintf(outbuf, "%s $%04X", mnemonics[opcode], addr + (int16)((int8)mainCPU.RdMem(addr)) + 1);
+ addr++;
+ break;
+ case 14: // Inherent
+ sprintf(outbuf, "%s ", mnemonics[opcode]);
+ break;
+ }
+
+ DisplayBytes(pc, addr); // Show bytes
+ WriteLog("%-16s", outbuf); // Display opcode & addressing, etc.
+
+ return addr - pc;
+}