+++ /dev/null
-//
-// 6808 disassembler
-//
-// by James Hammons
-//
-// (c) 2004, 2014 Underground Software
-//
-
-#include "dis6808.h"
-
-#include <stdio.h>
-#include <string>
-#include "v6808.h"
-#include "log.h"
-
-using namespace std;
-
-// External shit
-
-#warning "THIS ISN'T GENERIC ENOUGH... !!! FIX !!!"
-/*extern*/ V6808REGS soundCPU;//Hm.
-
-// Private globals variables
-
-static char op_mat[256] = {
- 0, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 0, 0, 0, 0, 5, 5, 0, 5, 0, 5, 0, 0, 0, 0,
- 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 0, 0, 5, 5,
- 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5,
- 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5,
- 7, 0, 0, 7, 7, 0, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7,
- 2, 0, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2,
- 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 8, 9, 3, 9, 0,
- 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
- 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 8, 0, 0, 9, 0,
- 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1,
- 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7,
- 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2
-};
-
-static char mnemonics[256][6] = {
- "??? ","NOP ","??? ","??? ","??? ","??? ","TAP ","TPA ",
- "INX ","DEX ","CLV ","SEV ","CLC ","SEC ","CLI ","SEI ",
- "SBA ","CBA ","??? ","??? ","??? ","??? ","TAB ","TBA ",
- "??? ","DAA ","??? ","ABA ","??? ","??? ","??? ","??? ",
- "BRA ","??? ","BHI ","BLS ","BCC ","BCS ","BNE ","BEQ ",
- "BVC ","BVS ","BPL ","BMI ","BGE ","BLT ","BGT ","BLE ",
- "TSX ","INS ","PULA ","PULB ","DES ","TXS ","PSHA ","PSHB ",
- "??? ","RTS ","??? ","RTI ","??? ","??? ","WAI ","SWI ",
- "NEGA ","??? ","??? ","COMA ","LSRA ","??? ","RORA ","ASRA ",
- "ASLA ","ROLA ","DECA ","??? ","INCA ","TSTA ","??? ","CLRA ",
- "NEGB ","??? ","??? ","COMB ","LSRB ","??? ","RORB ","ASRB ",
- "ASLB ","ROLB ","DECB ","??? ","INCB ","TSTB ","??? ","CLRB ",
- "NEG ","??? ","??? ","COM ","LSR ","??? ","ROR ","ASR ",
- "ASL ","ROL ","DEC ","??? ","INC ","TST ","JMP ","CLR ",
- "NEG ","??? ","??? ","COM ","LSR ","??? ","ROR ","ASR ",
- "ASL ","ROL ","DEC ","??? ","INC ","TST ","JMP ","CLR ",
- "SUBA ","CMPA ","SBCA ","??? ","ANDA ","BITA ","LDAA ","??? ",
- "EORA ","ADCA ","ORAA ","ADDA ","CPX ","BSR ","LDS ","??? ",
- "SUBA ","CMPA ","SBCA ","??? ","ANDA ","BITA ","LDAA ","STAA ",
- "EORA ","ADCA ","ORAA ","ADDA ","CPX ","??? ","LDS ","STS ",
- "SUBA ","CMPA ","SBCA ","??? ","ANDA ","BITA ","LDAA ","STAA ",
- "EORA ","ADCA ","ORAA ","ADDA ","CPX ","JSR ","LDS ","STS ",
- "SUBA ","CMPA ","SBCA ","??? ","ANDA ","BITA ","LDAA ","STAA ",
- "EORA ","ADCA ","ORAA ","ADDA ","CPX ","JSR ","LDS ","STS ",
- "SUBB ","CMPB ","SBCB ","??? ","ANDB ","BITB ","LDAB ","??? ",
- "EORB ","ADCB ","ORAB ","ADDB ","??? ","??? ","LDX ","??? ",
- "SUBB ","CMPB ","SBCB ","??? ","ANDB ","BITB ","LDAB ","STAB ",
- "EORB ","ADCB ","ORAB ","ADDB ","??? ","??? ","LDX ","STX ",
- "SUBB ","CMPB ","SBCB ","??? ","ANDB ","BITB ","LDAB ","STAB ",
- "EORB ","ADCB ","ORAB ","ADDB ","??? ","??? ","LDX ","STX ",
- "SUBB ","CMPB ","SBCB ","??? ","ANDB ","BITB ","LDAB ","STAB ",
- "EORB ","ADCB ","ORAB ","ADDB ","??? ","??? ","LDX ","STX "
-};
-
-//
-// Display bytes in mem in hex
-//
-static void DisplayBytes(uint16_t src, uint32_t dst)
-{
- WriteLog("%04X: ", src);
- uint8_t cnt = 0; // Init counter...
-
- if (src > dst)
- dst += 0x10000; // That should fix the FFFF bug...
-
- for(uint32_t i=src; i<dst; i++)
- {
- WriteLog("%02X ", soundCPU.RdMem(i));
- cnt++; // Bump counter...
- }
-
- for(int i=cnt; i<5; i++) // Pad the leftover spaces...
- WriteLog(" ");
-}
-
-//
-// Decode a 6808 instruction
-//
-int Decode6808(uint16_t pc)
-{
- char outbuf[80];
-
- uint16_t addr = pc, offset;
- uint8_t opcode = soundCPU.RdMem(addr++); // Get the opcode
-
- switch (op_mat[opcode]) // Decode the addressing mode...
- {
- case 0: // Illegal
- sprintf(outbuf, "??? ");
- break;
- case 1: // Zero page
- sprintf(outbuf, "%s $%02X ", mnemonics[opcode], soundCPU.RdMem(addr++));
- break;
- case 2: // Absolute
-// sprintf(outbuf, "%s $%04X", mnemonics[opcode], (soundCPU.RdMem(addr++) << 8) | soundCPU.RdMem(addr++));
- offset = (soundCPU.RdMem(addr + 0) << 8) | soundCPU.RdMem(addr + 1);
- addr += 2;
- sprintf(outbuf, "%s $%04X ", mnemonics[opcode], offset);
- break;
- case 3: // Relative
-// sprintf(outbuf, "%s $%04X", mnemonics[opcode], ++addr + (int16_t)(int8_t)soundCPU.RdMem(addr));
- offset = addr + 1 + (int16_t)(int8_t)soundCPU.RdMem(addr);
- addr++;
- sprintf(outbuf, "%s $%04X ", mnemonics[opcode], offset);
- break;
- case 5: // Inherent
- sprintf(outbuf, "%s ", mnemonics[opcode]);
- break;
- case 7: // Indexed
- sprintf(outbuf, "%s $%02X,X ", mnemonics[opcode], soundCPU.RdMem(addr++));
- break;
- case 8: // Immediate
- sprintf(outbuf, "%s #$%02X ", mnemonics[opcode], soundCPU.RdMem(addr++));
- break;
- case 9: // Long Immediate
-// sprintf(outbuf, "%s #$%04X", mnemonics[opcode], (soundCPU.RdMem(addr++) << 8) | soundCPU.RdMem(addr++));
- offset = (soundCPU.RdMem(addr + 0) << 8) | soundCPU.RdMem(addr + 1);
- addr += 2;
- sprintf(outbuf, "%s #$%04X ", mnemonics[opcode], offset);
- break;
- }
-
- DisplayBytes(pc, addr); // Show bytes
- WriteLog("%s", outbuf); // Display opcode & addressing, etc.
-
- return addr - pc;
-}