From 6c843c99fd7b1e24f949778ee48b016d289ca12e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Henrik=20Sk=C3=A5rstedt?= Date: Mon, 7 Dec 2015 22:26:04 -0800 Subject: [PATCH] Disassembler improvements - More aggressive local labels - Double checking code sections after detection phase - Zero page instructions added to labels (65816 uses direct page and will generate slightly off labels) --- bin/x65_win32.zip | Bin 98641 -> 99184 bytes bin/x65_x64.zip | Bin 123103 -> 123544 bytes disassembler/c64.lbl | 2 +- disassembler/x65dsasm.cpp | 259 +++++++++++++++++++++++++++----------- 4 files changed, 184 insertions(+), 77 deletions(-) diff --git a/bin/x65_win32.zip b/bin/x65_win32.zip index 820f0026c4b17d08f11e1dd4ca200f72894b6fe5..5deeb7dc6722d708b57afef5c9f7f22206ca667a 100644 GIT binary patch delta 19277 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 A{Qv*} delta 18729 zcmYg$1yG(nux@d8cS>=0DK5pG;!qrlyUUBayGwC*cPZ}f?(PoX?SIa_GdD9kd3LjT zvYSaJGfA$4p=bP|eH*}>xq#Hh014uY+yQRMFJHbSe))pv}QDMGdb7s zbi-W0%9)s?l&LeohC`)DZyc0v|D8a;H~_T~Xcd|+harky0$HO*kZ;W~E^Q8Hm1#Ax z&nm55xvHRDVJ-Mtq=zON(Uzf)j(U(+SgRNn?!0SAV1+;sU-yy43)FwznOUv=sGmPy zZ+%+7>pEIrV!vLA@>fNLL<7PCNuA&Z1#_;^J~bf?EG}(};I)f8yv$PyZx3W}xHeix zofXDXx~Cn^aCDnDUJIGLHC?6Pvc@*?~B29-B!h@s~7y7+3mksE6`QX`8MNZXM};5>xAHx$;LROC{U zNd{Zm@o=va8q4Yq=kd@877I%8x}Al5Iwd8>T0n1{{tj1n;s^e`z;gLr>z9Xn3wDQ6BU}LHbIo+yVs;FJ=c{Fc7p4;77Gf_agCcbbo z4%Zm0JC_0oj1H<}Wyx!hDvNT#$U)UP5PD-5t^l5IY}T2O-FEdJeT(uA2=rMFWQQ`% zJMXKNu(|>7CoeHCf!X{CpEr;Brf=(a4Ja8GCP(I=jFqluzKg!2$j8yUh6vNQj`}sr z`;8?yk-0(foN2Q$z#j!H@h~bSd_4X$0bN*Q6+>&g9RkZiKF3->>o_Pu$S>hKuMWm~ z@59@))C^oOiPCP;{aM$l=_qSsQ}t$`pzXWMPaXh$>3#Cl^edVZxxdTD1LWt%H_BTK zHstDixY0?gM;oKM2xazyo9oM zRT#9)MHtXD+2Q^^E^*cLUE8~VrNaU{oh?IO{8X&9{E($-mPL(Ry(gfZS4L|*`!xJH zetiz~T{ZA>1|KRoS7s~kUf8~P(*LcG@K(LQ)J-}eo*5`TRsV}+F?ySg+EY#Vsg0^u?RzpXXwyEOBCes~x#wm_hs zBd1Wh-CXat@u)@d{kx3TB3EOEGebG07vHms=PowS!2pTIQ%lk|&qD>NQ7>Yb_M&CRR3a6jcLzh+cP)U4J!RLc>qCU$k+c0ZY zqFdntMo(o=UP}HPNo--T?bgOvQfy_|vYp{awjngc<0w)|O!qPf_9SbbW>%I*b6i4qEG!1n&g7Lo z5p91^*&h8^718kk`J^pLw}sAbR3Vc(d-A6locX zgJ}FLQ+2_I^!e@jMgu-O8fy$_r*?K=A}t*k$y3^X_4V_u2NMMwt*U}@mbk%JqSgK8 zfgFTUH{`8YNg%T-SdO~L4Rhfzo!xgjh)oOBLh9-Dde~?phcT=1q1DF{GVK?G!C)*W z9_MnrCUf97i%V2oQV$$mSWASV59)8*Ri2X6yk^xT17k$%06S>Wf&qxlZ;qirmp)Sy zw%Cd|DVbdjnvI}d`28vOWx1@IEnTu^v66ln3e8lw>m(c2r*Qh643aRXIRz#YHrTt2 z-e>`H}Qw6+eEJ= zCsk%+oXR9Sb#c6;S@^PxXFF*mMT1ZY!*rYm6Rh6Jf`@}PgIx(+r*-mObo50&@*!nM~S4~Uel0dqor<_DBnmbn_|dy zvjY8`-+bryCF(fQEI`2yvhxm_E?Ji8tK{tOYw0VN(vRjZH(g{jg5(bZSFvu9tylij z!BE&+3QDR)>o9JE8NNa=*9k&mFqKG{2S* z z7%Cpf2FM^6BlrA~d6w_=I z1vW6nXr6)UJ!C_KYsQEkUC}=5xE&p}S9Fa$jBFDoWPI^9S_OIcRNs~*JIyy+) zH^joEc*rXE^2%>@f*2>$t=z?vF69Mat9tQ=hHf(cu?25hCt6V%d{h_FyGC&jxCCc= zfpz=qJFna66O2nqiNmP+<10+iGFIManYl*HJN z-dsDT!P>rAZdDB%3lH{EDY&lC1;wq8Rn%fCPvrg2ww2qpErSmKcghwGM6D;F)LA0r z7j}ua%eB#bHrX_4X^rGs=1lYXmwITYGav9bG?@C)h$OeNcRY%0%B_-ti#ok9UgI3} zsrXLmbuvIF%xpM?_NLSUSvJ0Mz-(kLsYNckY{1Mg3qPgcnoBr9vd}?UemffKn$fzv zX}ZR1ZE^)Zs%_tY`Z$%3i~SW~!8yz3NNW_19AVl;elTR|Uh|5l2mzdm>Ax`O}Yp`K}=7t@5)XDW;#H zmmizzg-BZmr##{Aq0LOsTE!q^PciszgRj9c*-Y;~4PO~)I`0XSiQR~SsS(l6vjj6_ z=TdLM+)3O^QNiNuCw(icU^vY^gGL)R9X;!Jyg{k2Q3(^cR5{E;VLW}v04optQ8o*_ zV|;(;9E`XT?#j>NHnD=*`o9h?*CgQv2kz;2DmmPAk`n@E=PYcUdJ?FtBC&6Yr&|Rb zT%omrCHo-1&nP-6rcg;Bb>~U5^%gsPFhGLbd4^W%(dyQtNacS_H#HC6#Kx|=+_;Me(}5=9D^;`s2z7tD_ zj`P!8oZ`%>Z>LnERP6yN5RY4s3&^z2_1^~;q=|pF|M)QlBol?(zhv~ z_zic5;(HUq2)&owV|iIZQ4=F}j}oYbA}XN8GfN(rnm?eX#>{O{Hus6SqD{|CiCNY? z#!K30S%T1*jag75awVzK4JHHzZhezw1l&`c`HGJ?NkMuIT9Z_`J=3ft~4O3Jmc zp@5V_Ak%Z29<00NkPx^{qx_t_m)(7Yz+5t^8H7Er>N0{87#;bky})Kvuck6JD<(3$P`CaTOAZPq}H=KaXef~Z4S^IggMT)CsGb#``T zo|`|xJpPHD(>S0Ek8wQjL#;7jQA02UzYdcRP*uW4I?4iY$A6=Lsjbje)zf^#b|S2m z+A$ju?%ZIotraTZM|-#6y*)Oa2OHvsK8X`3d?@*HUUxU}N7ztB-gD9aX*ntzmin2x z3e7Y(@#u^D^d!C>-QOvc`b^>GGUT2X{b_8+#I+}9< zV8$B}jaX)C3{%#TUYhU6r1I_``k4aqEP@mLF;5nP6db9)^$6iZsnN*tcl78?R9V>c z=#^}el^0?4`It*wZMe{Z8~Xe`jkZ{Bk7k}5)z5#vaoRR4^p3*o4(3J`l8I}6Ks1C$ zlsNPLuA%d<9l+zfZ?7Pw;&Cb0h=soF1sWYYo#Phi8ayvH4cxH_4A>eUTpGVd^Htve zVLl{69(?vik|(U;rTQ`3MnumndkHzCdrhSXBX`x+sO12^R(-#(|5F3clh9{ zK}b`YW^dIQ>9`h+>yY^r6*zd z({lumM1-8Mh3_*e*ll1n^ir@(E;#zNK_FS>XfbrAYw9CJoUp9Rn))B8H?r(`lDRJl zeGBj2kqrD5ul1U7tEⅇ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 z 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 diff --git a/bin/x65_x64.zip b/bin/x65_x64.zip index 5215dc83f45d1ccf17aad5be035989e77b3265e8..423a1565c42f3d70da47bf3ee2154ba2db974186 100644 GIT binary patch delta 20920 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

sY_We?a(b2X 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 delta 20456 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 diff --git a/disassembler/c64.lbl b/disassembler/c64.lbl index 2c65390..600272a 100644 --- a/disassembler/c64.lbl +++ b/disassembler/c64.lbl @@ -64,7 +64,7 @@ CIA2_TimerA = $dd04-$dd06 data CIA2_TimerB = $dd06-$dd08 data CIA2_TimeOfDay = $dd08-$dd0c data CIA2_Serial_Shift = $dd0c data -CIA1_Interrupt_Ctrl_Status = $dd0d data +CIA2_Interrupt_Ctrl_Status = $dd0d data CIA2_TimerA_Ctrl = $dd0e data CIA2_TimerB_Ctrl = $dd0f data CIA2 = $dd10-$de00 data diff --git a/disassembler/x65dsasm.cpp b/disassembler/x65dsasm.cpp index 038c728..0875418 100644 --- a/disassembler/x65dsasm.cpp +++ b/disassembler/x65dsasm.cpp @@ -1080,57 +1080,80 @@ void GetReferences(unsigned char *mem, size_t bytes, bool acc_16, bool ind_16, i if (size_t(init_data)>bytes) return; - addr += init_data; - bytes -= init_data; - mem += init_data; + if (refs.size()) + qsort(&refs[0], refs.size(), sizeof(RefAddr), _sortRefs); + + bool curr_data = !!init_data; + int curr_label = 0; + int start_labels = (int)refs.size(); + while (curr_labelrefs[curr_label].address) { + curr_data = refs[curr_label].data == DT_CODE; + ++curr_label; + } while (bytes) { + if (curr_label=refs[curr_label].address) { + curr_data = refs[curr_label].data != DT_CODE; + if (!refs[curr_label].size) + ++curr_label; + } else if (refs[curr_label].size && addr>(refs[curr_label].address + refs[curr_label].size)) { + curr_data = false; + curr_label++; + } + } else + curr_data = false; + unsigned char op = *mem++; int curr = addr; bytes--; addr++; - if (opcodes == a65816_ops) { - if (op == 0xe2) { // sep - if ((*mem)&0x20) acc_16 = false; - if ((*mem)&0x10) ind_16 = false; - } else if (op == 0xc2) { // rep - if ((*mem)&0x20) acc_16 = true; - if ((*mem)&0x10) ind_16 = true; - } - } - - int arg_size = opcodes[op].arg_size;; - int mode = opcodes[op].addrMode; - switch (mode) { - case AM_IMM_DBL_A: - arg_size = acc_16 ? 2 : 1; - break; - case AM_IMM_DBL_I: - arg_size = ind_16 ? 2 : 1; - break; - } - int reference = -1; RefType type = RT_NONE; + int arg_size = 0; + int mode = 0; - if (mode == AM_BRANCH) { - reference = curr + 2 + (char)*mem; - type = RT_BRANCH; - } else if (mode == AM_BRANCH_L) { - reference = curr + 2 + (short)(unsigned short)mem[0] + ((unsigned short)mem[1]<<8); - type = RT_BRA_L; - } else if (mode == AM_ABS || mode == AM_ABS_Y || mode == AM_ABS_X || mode == AM_REL || mode == AM_REL_X || mode == AM_REL_L) { - reference = (unsigned short)mem[0] + ((unsigned short)mem[1]<<8); - if (op == 0x20 || op == 0xfc || op == 0x22) // jsr opcodes - type = RT_JSR; - else if (op == 0x4c || op == 0x6c || op == 0x7c || op == 0x5c || op == 0xdc) // jmp opcodes - type = RT_JUMP; - else - type = RT_DATA; - } else if (mode == AM_ZP || mode == AM_ZP_REL || mode == AM_ZP_REL_L || mode == AM_ZP_REL_X || mode == AM_ZP_REL_Y || - mode == AM_ZP_X || mode == AM_ZP_Y || mode == AM_ZP_REL_L || mode == AM_ZP_REL_Y_L) { - reference = mem[0]; - type = RT_ZP; + if (!curr_data) { + if (opcodes == a65816_ops) { + if (op == 0xe2) { // sep + if ((*mem)&0x20) acc_16 = false; + if ((*mem)&0x10) ind_16 = false; + } else if (op == 0xc2) { // rep + if ((*mem)&0x20) acc_16 = true; + if ((*mem)&0x10) ind_16 = true; + } + } + + arg_size = opcodes[op].arg_size;; + mode = opcodes[op].addrMode; + switch (mode) { + case AM_IMM_DBL_A: + arg_size = acc_16 ? 2 : 1; + break; + case AM_IMM_DBL_I: + arg_size = ind_16 ? 2 : 1; + break; + } + + if (mode == AM_BRANCH) { + reference = curr + 2 + (char)*mem; + type = RT_BRANCH; + } else if (mode == AM_BRANCH_L) { + reference = curr + 2 + (short)(unsigned short)mem[0] + ((unsigned short)mem[1]<<8); + type = RT_BRA_L; + } else if (mode == AM_ABS || mode == AM_ABS_Y || mode == AM_ABS_X || mode == AM_REL || mode == AM_REL_X || mode == AM_REL_L) { + reference = (unsigned short)mem[0] + ((unsigned short)mem[1]<<8); + if (op == 0x20 || op == 0xfc || op == 0x22) // jsr opcodes + type = RT_JSR; + else if (op == 0x4c || op == 0x6c || op == 0x7c || op == 0x5c || op == 0xdc) // jmp opcodes + type = RT_JUMP; + else + type = RT_DATA; + } else if (mode == AM_ZP || mode == AM_ZP_REL || mode == AM_ZP_REL_L || mode == AM_ZP_REL_X || mode == AM_ZP_Y_REL || + mode == AM_ZP_REL_Y || mode == AM_ZP_X || mode == AM_ZP_Y || mode == AM_ZP_REL_Y_L) { + reference = mem[0]; + type = RT_ZP; + } } if (/*reference >= start_addr && reference <= end_addr &&*/ reference>=0 && type != RT_NONE) { @@ -1167,7 +1190,7 @@ void GetReferences(unsigned char *mem, size_t bytes, bool acc_16, bool ind_16, i mem = mem_orig; bytes = bytes_orig; addr = addr_orig; - int curr_label = 0; + curr_label = 0; int prev_addr = -1; bool was_data = init_data>0; bool separator = false; @@ -1234,7 +1257,13 @@ void GetReferences(unsigned char *mem, size_t bytes, bool acc_16, bool ind_16, i if (curr == refs[curr_label].address || (curr > refs[curr_label].address && prev_addr>=0)) { if (curr != refs[curr_label].address && !refs[curr_label].label) { - refs[curr_label].address = prev_addr; + int curr_look_ahead = curr_label; + while ((curr_look_ahead+1)<(int)refs.size() && curr>refs[curr_look_ahead].address && curr>=refs[curr_look_ahead+1].address) + curr_look_ahead++; + if (curr_look_ahead>curr_label) + curr_label = curr_look_ahead; + if (curr>refs[curr_label].address) + refs[curr_label].address = prev_addr; } std::vector &pRefs = *refs[curr_label].pRefs; if (curr_label < (int)refs.size()) { @@ -1389,48 +1418,108 @@ void GetReferences(unsigned char *mem, size_t bytes, bool acc_16, bool ind_16, i // figure out which labels can be local + k = refs.begin(); // make all labels that are not assigned something local + bool was_sep = false; + while (k!=refs.end()) { + if (k->label || k->address<0x200 || k->separator) + k->local = false; + else + k->local = true; + was_sep = !!k->separator; + ++k; + } + + // check over and over for global labels breaking local boundaries + bool check_locals_completed = false; + while (!check_locals_completed) { + check_locals_completed = true; + k = refs.begin(); // make all labels that are not assigned something local + while (k!=refs.end()) { + if (k->local) { + std::vector &links = *k->pRefs; + for (std::vector::iterator l = links.begin(); k->local && l!=links.end(); ++l) { + int trg_addr = l->instr_addr; + bool skip_global = false; + std::vector::iterator j = k; + if (trg_addraddress) { // backward check + for (;;) { + if (!j->local) + skip_global = true; + if (j!=refs.begin()) + --j; + if (trg_addr>=j->address || j == refs.begin()) + break; + } + } else { // forward check + while (j!=refs.end()) { + ++j; + if (j!=refs.end() && !j->local) + skip_global = true; + if (j==refs.end() || trg_addraddress) + break; + } + } + if (skip_global) { + if (j!=refs.end()) { + k->local = false; + check_locals_completed = false; + } + } + } + } + ++k; + } + } + + // now simply assign label numbers according to locality k = refs.begin(); int label_count_code_global = 1; int label_count_data_global = 1; + int label_count_local = 1; while (k!=refs.end()) { - if (k->separator && k->data == DT_CODE) { - int address = k->address; + if (k->local) { + k->number = label_count_local++; + } else if (k->data==DT_CODE) { + label_count_local = 1; + k->number = label_count_data_global++; + } else { + label_count_local = 1; k->number = label_count_code_global++; + } + ++k; + } - std::vector::iterator f = k; // f = first local - ++f; - std::vector::iterator e = f; // e = end of locals - while (e!=refs.end()) { - if (e->label || e->data != DT_CODE) - break; - std::vector &r = *(e->pRefs); - bool ext_ref = false; - for (std::vector::iterator i = r.begin(); i!=r.end(); ++i) { - if ((i->type != RT_BRANCH && i->type != RT_DATA) || i->instr_addraddress) { - ext_ref = true; + // re-check for code references to code being mislabeled + bool adjusted_code_ref = true; + while (adjusted_code_ref) { + adjusted_code_ref = false; + k = refs.begin(); + while (k!=refs.end()) { + if (k->data != DT_CODE && !k->label) { + std::vector &links = *k->pRefs; + for (std::vector::iterator l = links.begin(); l!=links.end(); ++l) { + RefType t = l->type; + if (t==RT_BRANCH || t==RT_BRA_L || t==RT_JUMP || t==RT_JSR) { + int trg_addr = l->instr_addr; + std::vector::iterator j = k; + if (trg_addraddress) { + while (j!=refs.begin() && trg_addraddress) + --j; + } else { + std::vector::iterator n = j; + while (n!=refs.end() && trg_addr>n->address) { + j = n; + ++n; + } + } + if (j->data == DT_CODE) { + k->data = DT_CODE; + adjusted_code_ref = true; + } break; } } - if (ext_ref) - break; - ++e; } - int label_count_code_local = 1; - while (f!=e) { - f->number = label_count_code_local++; - f->local = 1; - ++f; - } - if (k!=e) - k = e; - else - ++k; - } else { - k->local = 0; - if (k->data == DT_CODE) - k->number = label_count_code_global++; - else - k->number = label_count_data_global++; ++k; } } @@ -1654,6 +1743,9 @@ void Disassemble(strref filename, unsigned char *mem, size_t bytes, bool acc_16, reference = addr + (short)(unsigned short)mem[0] + ((unsigned short)mem[1]<<8); else if (mode == AM_ABS || mode == AM_ABS_Y || mode == AM_ABS_X || mode == AM_REL || mode == AM_REL_X || mode == AM_REL_L) reference = (int)mem[0] | ((int)mem[1])<<8; + else if (mode == AM_ZP || mode == AM_ZP_REL || mode == AM_ZP_REL_L || mode == AM_ZP_REL_X || mode == AM_ZP_Y_REL || + mode == AM_ZP_REL_Y || mode == AM_ZP_X || mode == AM_ZP_Y || mode == AM_ZP_REL_Y_L) + reference = mem[0]; strown<64> lblname; strref lblcmt; @@ -1736,6 +1828,21 @@ void Disassemble(strref filename, unsigned char *mem, size_t bytes, bool acc_16, out.sprintf_append(fmt, opcodes[op].name, mem[0], addr + (char)mem[1]); break; + case AM_ZP: + case AM_ZP_REL: + case AM_ZP_REL_L: + case AM_ZP_REL_X: + case AM_ZP_REL_Y: + case AM_ZP_X: + case AM_ZP_Y: + case AM_ZP_REL_Y_L: + case AM_ZP_Y_REL: + if (src && lblname) + out.sprintf_append(fmt, opcodes[op].name, lblname.c_str()); + else + out.sprintf_append(fmt, opcodes[op].name, mem[0], mem[1]); + break; + default: out.sprintf_append(fmt, opcodes[op].name, mem[0], mem[1]); break;