diff --git a/bin/x65_win32.zip b/bin/x65_win32.zip index 6720aa5..915d5cd 100644 Binary files a/bin/x65_win32.zip and b/bin/x65_win32.zip differ diff --git a/bin/x65_x64.zip b/bin/x65_x64.zip index 241e2a0..f27d59c 100644 Binary files a/bin/x65_x64.zip and b/bin/x65_x64.zip differ diff --git a/disassembler/x65dsasm.cpp b/disassembler/x65dsasm.cpp index 10aecbc..5663b6b 100644 --- a/disassembler/x65dsasm.cpp +++ b/disassembler/x65dsasm.cpp @@ -289,7 +289,10 @@ enum MNM_Base { mnm_xce, mnm_inv, mnm_pla, - mnm_bbs0, + + mnm_wdc_and_illegal_instructions, + + mnm_bbs0 = mnm_wdc_and_illegal_instructions, mnm_bbs1, mnm_bbs2, mnm_bbs3, @@ -305,6 +308,7 @@ enum MNM_Base { mnm_bbr5, mnm_bbr6, mnm_bbr7, + mnm_ahx, mnm_anc, mnm_aac, @@ -1306,7 +1310,7 @@ int GetLabelIndex(int addr) { } -void GetReferences(unsigned char *mem, size_t bytes, bool acc_16, bool ind_16, int addr, const dismnm *opcodes, int init_data, strref labels) +void GetReferences(unsigned char *mem, size_t bytes, bool acc_16, bool ind_16, int addr, bool ill_wdc, const dismnm *opcodes, int init_data, strref labels) { int start_addr = addr; int end_addr = addr + (int)bytes; @@ -1446,8 +1450,10 @@ void GetReferences(unsigned char *mem, size_t bytes, bool acc_16, bool ind_16, i } } - arg_size = opcodes[op].arg_size;; - mode = opcodes[op].addrMode; + bool not_valid = opcodes[op].mnemonic==mnm_inv || (!ill_wdc && opcodes[op].mnemonic>=mnm_wdc_and_illegal_instructions); + + arg_size = not_valid ? 0 : opcodes[op].arg_size;; + mode = not_valid ? AM_NON : opcodes[op].addrMode; switch (mode) { case AM_IMM_DBL_A: arg_size = acc_16 ? 2 : 1; @@ -1546,8 +1552,10 @@ void GetReferences(unsigned char *mem, size_t bytes, bool acc_16, bool ind_16, i } } - int arg_size = opcodes[op].arg_size;; - int mode = opcodes[op].addrMode; + bool not_valid = opcodes[op].mnemonic==mnm_inv || (!ill_wdc && opcodes[op].mnemonic>=mnm_wdc_and_illegal_instructions); + + int arg_size = not_valid ? 0 : opcodes[op].arg_size;; + int mode = not_valid ? AM_NON : opcodes[op].addrMode; switch (mode) { case AM_IMM_DBL_A: arg_size = acc_16 ? 2 : 1; @@ -1592,7 +1600,7 @@ void GetReferences(unsigned char *mem, size_t bytes, bool acc_16, bool ind_16, i if (curr_label < (int)refs.size()) { if (refs[curr_label].label) { refs[curr_label].separator = 1; // user labels are always global - was_data = refs[curr_label].data==DT_DATA; + was_data = refs[curr_label].data!=DT_CODE; } else { bool prev_data = was_data; was_data = separator && !(!was_data && op==0x4c && prev_op==0x4c); @@ -1638,7 +1646,7 @@ void GetReferences(unsigned char *mem, size_t bytes, bool acc_16, bool ind_16, i refs[curr_label].separator = separator; refs[curr_label].data = was_data ? DT_DATA : DT_CODE; } - if (was_data) { + if (was_data && refs[curr_label].data != DT_PTRS && refs[curr_label].data != DT_PTRS_DATA) { int start = curr; int end = (curr_label+1)<(int)refs.size() ? refs[curr_label+1].address : (int)(addr + bytes); for (int k = 0; k<(int)refs.size(); ++k) { @@ -1652,7 +1660,7 @@ void GetReferences(unsigned char *mem, size_t bytes, bool acc_16, bool ind_16, i } } } - if (refs[curr_label].pRefs->size()==0) { + if (refs[curr_label].pRefs->size()==0 && !refs[curr_label].label) { int lbl = curr_label; while (lbl && refs[lbl].pRefs->size()==0) lbl--; @@ -1874,7 +1882,7 @@ bool IsReadOnlyInstruction(MNM_Base op_base) } static const char spacing[] = " "; -void Disassemble(strref filename, unsigned char *mem, size_t bytes, bool acc_16, bool ind_16, int addr, const dismnm *opcodes, bool src, int init_data, strref labels) +void Disassemble(strref filename, unsigned char *mem, size_t bytes, bool acc_16, bool ind_16, int addr, bool ill_wdc, const dismnm *opcodes, bool src, int init_data, strref labels) { FILE *f = stdout; bool opened = false; @@ -1892,7 +1900,7 @@ void Disassemble(strref filename, unsigned char *mem, size_t bytes, bool acc_16, int end_addr = addr + (int)bytes; refs.clear(); - GetReferences(mem, bytes, acc_16, ind_16, addr, opcodes, init_data, labels); + GetReferences(mem, bytes, acc_16, ind_16, addr, ill_wdc, opcodes, init_data, labels); int curr_label_index = 0; bool separator = false; @@ -2040,8 +2048,10 @@ void Disassemble(strref filename, unsigned char *mem, size_t bytes, bool acc_16, } } - int arg_size = opcodes[op].arg_size;; - int mode = opcodes[op].addrMode; + bool not_valid = opcodes[op].mnemonic==mnm_inv || (!ill_wdc && opcodes[op].mnemonic>=mnm_wdc_and_illegal_instructions); + + int arg_size = not_valid ? 0 : opcodes[op].arg_size;; + int mode = not_valid ? AM_NON : opcodes[op].addrMode; switch (mode) { case AM_IMM_DBL_A: arg_size = acc_16 ? 2 : 1; @@ -2122,6 +2132,9 @@ void Disassemble(strref filename, unsigned char *mem, size_t bytes, bool acc_16, } } + if (not_valid) + out.sprintf_append("dc.b $%02x ; $%04x ", op, curr_addr); + const char *fmt = (src && lblname) ? aAddrModeFmtSrc[mode] : aAddrModeFmt[mode]; const char *mnemonic = zsMNM[opcodes[op].mnemonic]; switch (mode) { @@ -2263,6 +2276,7 @@ int main(int argc, char **argv) bool ind_16 = true; bool src = false; bool prg = false; + bool ill_wdc = false; const dismnm *opcodes = a6502_ops; strref labels; @@ -2314,6 +2328,13 @@ int main(int argc, char **argv) opcodes = a65C02_ops; else if (arg.same_str("6502")) opcodes = a6502_ops; + else if (arg.same_str("65C02WDC")) { + opcodes = a65C02_ops; + ill_wdc = true; + } else if (arg.same_str("6502ILL")) { + opcodes = a6502_ops; + ill_wdc = true; + } } } } @@ -2339,7 +2360,7 @@ int main(int argc, char **argv) size_t bytes = size - skip; if (end && bytes > size_t(end - skip)) bytes = size_t(end - skip); - Disassemble(out, mem + skip, bytes, acc_16, ind_16, addr, opcodes, src, data, labels); + Disassemble(out, mem + skip, bytes, acc_16, ind_16, addr, ill_wdc, opcodes, src, data, labels); } free(mem); }