From e55416bb8d82bd7e92ea9983457576c4feab5922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Henrik=20Sk=C3=A5rstedt?= Date: Thu, 3 Dec 2015 22:53:16 -0800 Subject: [PATCH] Disassembler improvements and c64 labels file - Adding a labels file with all the c64 hardware addresses - Labels are tracked outside of the binary file range - Zero page tracking - Improved code vs data tracking a bit --- bin/x65_win32.zip | Bin 98291 -> 98641 bytes bin/x65_x64.zip | Bin 122658 -> 123103 bytes disassembler/README.MD | 3 + disassembler/c64.lbl | 75 +++++++++++++++++++ disassembler/x65dsasm.cpp | 154 +++++++++++++++++++++++++------------- 5 files changed, 178 insertions(+), 54 deletions(-) create mode 100644 disassembler/c64.lbl diff --git a/bin/x65_win32.zip b/bin/x65_win32.zip index 59871244886a4e427352a12a5c424370207a0eb1..820f0026c4b17d08f11e1dd4ca200f72894b6fe5 100644 GIT binary patch delta 18720 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

5gJB;A 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 CC7j9t diff --git a/bin/x65_x64.zip b/bin/x65_x64.zip index dbd9a63987422c7f358939ca2d7496ca53ab5583..5215dc83f45d1ccf17aad5be035989e77b3265e8 100644 GIT binary patch delta 20372 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

Gw&H{( zut|pR;6laC$+zC3bq31#EHQb-?`CPPMlEm^7$0vWpBt6<^ zSvyktqeX7G&FzmK&x#C#2Hu&<3ru^T7X_xpRi1@H$4o_7afGJzu=zcS`7EFBO#?h_wqx1$<^mjn>8q2X2$ z*U@P=YgdXb3gC#LuH{R$z-oW=TT|th1ZblyVz1$df5Oc&;{QNUweE-a`4q6rpc>t$ z6OGuc084(3Oy|+*g(a<}TGo${SRd_C@R`h#Ds1K>O8Fb=>W{n&qE+WYf?PijDcq^6 zg5{+)u-AIrttn&bxro;9lZyA!;(1k==d7-2O|>8Z;;*GhXvG&W`CNaerc!J+w1!Gt z$y#V&PWLX6&t{hiPY}tQdF7=menR;xY(eX;UNRFg^;1X@nICV+E2A_#Oy8&A#1nE> zsef(#yTNGH4B&gSgcSHLl|-jJ!?{us*EP`|gB}v=Hlrn5_9z{<{fZuAwCpik-W&mG zMfUTQ6d$7M2RMZjGHZY4$Xi>J=S|0`KcWVy3I*}#)vexM`4SsPB}a|fFDymPbY{Ec zX)eyFXdD$yirIFWZZV2}Dha|I-MGYNL$xZFf$-`j4iMr~)IsnLrx781hbRAV4kyUs z$GOcmBQw@^K&CE*A3Gy6*l(rN2D@y)V2?<~U_mmn1I3@gbDw_^VCoD<;!P_oTRN`T2X(wLOX7A$)H{Ww7*jIhcHTIKYD7V*8C%;R`QYWT{gynF}@zZk91H9G0A z$!ur`Iu1%k;~=Yxqa)$~gE4MF7qu@Cb!iQ@a-`V-u@oyr@+yA~Z>AR{XAamv3_Ar< zV)|o-7poyldntdtk$mmqH{y`?Y0L~`67XKH=xkZB;J3Ix%K*qTwd5e-C5>zrAf*^PllYD~_fJnMB`&`Z%J5I|Fs^hjS6^h}flPEaaQfc5|=E z2up;q8zg@U?&W`sST!!XfTP~T6I2XWI4V~-q!K>wbnF%%7>?sou1KNHU>R_|!j%ly zD^RFnT^&R|kci~)0O8%pVJHm)(7nFMGc*Q!nD{e;62_C+DOux_<3a1<6N8nG0;H=8 z`S~^*T4+$s_j2_R9DD*ct^9B~2hl_bS`H{~Q44=@7ihG@oXBc&BExG% zXW1Z474~s075-vrzjAVLyFVJ7>x!Fu@?=yudE27 z%Me>72yhh9Wk$XPe;b)bp%N%?%6j&*V|3cF@o7#p+;9n4;mm~H_ed1}Y8^;j_@RI7 zRP?AQ)*l2O#GmU8d^TdqB=%R_pW(dOEPIP0pMY4>nQ3_8AR1x@SE7A#&Qw7#*I2gh zG5NHSW=yaqV+Yw^B(XGsEoKL+T#kmoQ4_QH zqzBKq%$&iQCthMOM03#Eh5>5OL9(p)46{yUn??FA$=54B@J*~1q#VQwOmn)0B=xk2 zV%>KP>N{Z_vBTUxGwF}}-2WB*U-kf#7cM*v6O&sAmM?_42-vo?2)kta8n}Ns9haEQ z52@WX*qudMwE&enXPQ*sKb-gx z;3`|zh*>sq_qIjF(Z~vajs9lj3o?V_1S!T({o}YSu&c+41Ai2Tfy;jKS8h(tlNk~; zXo{>7H;)7rd7~!YXn*>uK)iqEO`|2A+l_{~ynCayxEW#0PFTgww85?wH{)LK=0!Pd z53GM}+2hf!!tij4ho6JPB(q^^H#C66{vtlyq&ERfww{nRZVTa5U3~B+P(>|25h~t? zz-^q9g^2KF;73%r%WG0$s?*$+LH4&0%76d^&E$v$GRah27 zJiZiBl>p%34%5|IFcMG`z%U zsP>Z9R5>r^8xLRkAginiM@bYVCOQ8p*-R5rDYOyhb7={_c?TlAzpXNCFRxt5z)lj_s3K zr_9RC;=;Nj6aew7#T!)6|(Qn|mxD0<= z)9c5Gp|~MQOZO-kpiYqI6T?4HQ-m~VZPkyY&EeG+ zh((hUeo7S&rp+92 z^E?X;lVy%Ec(i63ZM#?$aEV2s5-eXkp8evKP$%+>us}`>-j4EalnGt;VVgv&pUR5d zM2+WAW3M@OLD$8CKxh*hgHQ)f9Q$M*5Hl3bhk}3kgmxhh4{|Lq=x_v>wRTO#I5ffx z8sU=u*-`gr?)sVBbl2ZSb(*$$U2mN-I@VEa1X~ zK#PAbO{3*}iCX&`s_d@h!5m`$X!UX-JPsASjls4vrkPsgj{s4u%i@Ms;M&?y{o#>h zspp#3Nn(JJVAMDEoAunnFinKtP7wsdej!J!{$buGUwCk!EP=s(bfX}UOUV5)t}D+N z^{Xxln$Fk2TS6_7;pA@)?M)cRYnNG!zzBc0A-LKvH5|ndk^6foT}Nzh5kv$+`Fg?h zDIBHSHx5S0z8D1%q-T<%B;y;t&o9L`E33P~vpp*}&1Y3ZO6X01@#r@Bx1r{F2W2`& z@$-(Xja>9vspFX6i%1(z%fqvkn1Z8^|NOiIjre)TA7bPZT|^1g&IeuvAHqzl;0%9d zgp^fg#*#ImE+?bd3UrbW5Gvg;M$p7piQx zC!Tq~Mvns^@=3}Luiq0#@QM`q`A{SiS8kGO`*^^g-ebyvLr~hF+FWoTxIe%H{IX_r zZ9-z=$`>htPX&pAqXwG`WU_HG^(p9exd&G)Tjf}3mR|5Gj@dYW{Rs~knW}&G;S#l8 z@H`4QLGPbT4@qkI1r>2!Zj#~}3Hs0rmZjT2L=RfAR_RC$Q(CP2rM`I%N{AuZ1E7hq zuGfpS_kZXnss$O|^kJ)AK~{-S(pxt)o9}NfxhnJ8j}p7heFRiaqAN1Y%iAQjOPunY zyB!5u;8y|mmuD=h7I_f2Cj)=%orb{r0Q&%e94+#ThQQi}z$)^;787!TeH`_czy^9D z98I^;Jr+&JItrmji!%C>~CoY zs|2s8E_;ju#8F!F%iWQ6@MZE9eOGLrjzf`0aH}6O=aJ;WHsbsx$p3$Wv&a&D(j0g! zK!JTFi}>Xtv3@SCDa@5<6R!JCLxxvR;ni-jo|YWu1$9VJ+LA|P^q+jam13I7E(=xH z_k_JbVLH~4y<+g22t(C;eUbt$-BNUqoF2(f;WGIasjB~5x|%?oY+6ZK_=01bpV5YNo5BDtohl>5QZbG=!@Xs z5t+BfGViy-{R=+&tz?ohy2a**Q)O_n^<00iEuAm8I*iw3HMn_%%kMwfldmh3_HfR7yfylCQP$ zcYEA?_f9ce%0|n((UM>zD+jht z{snkqZy1fMHziuntvkPGJ_Z=4F& zKSy`PTlFr2Nq)Lh*Hb?Qs5L!@Z7m#=@1X1>c<3DSpBrUPNaC#Il3*V%bs5CH#eece*?5!X1@I2KdvV*v;^+5O%4V?G_>*rfjqW zWuUVjC#y$c#zXUsnn_Urg(%1ZzrrKp0}zFXynzw+QC$fn-(xU(Av16`Afw8qvSvDQ zeI)sACrPJ$nCC>8Vfi4wmn+&QIDtZ2=tjoSX!U;%Tp-X3>H*`4i$x@kxxP*gI$wv% zhR!_g{m!eLA#Gk^NL%1qay1U#qwg(J*oUE5Wg*jqw3Dx}cj4SG#mk_bxT~n$cTkDV z9>xwP^WxYPbSsJ?LoG5+HVlJ~bh1lxL#ljR?Kc2jQ2k1ix1o7s1KL!$zHu1o_^!yhEZUh1V0YfPX zZG$0b&v{oyW)y=Tt;vyXM;TF?qbDDofn~NK5sY}txIn>F}=u zY=PNqUb@+W60-A30DCYh768O>od=x?;R7Jtw?Q zH@F3V&#+0seT>Rs5HUZxfJ98oIeaED!Pl8k3!|Rv?$0k8kKcDBZkkR9u>LV$S45#`Ko&m`t*(4to&8leg9QZf~ZjKDS zgH9EbqN~72Oq7T;HwBq9H~`t*L^eeF0Mk#po4!D#dtfXl-EMjT5de4@BA6yq$k#F7 zAk!-fC`Qy`t(;PGGn5+idnSLx`cD4CDMWmBEIEWrmV$pE#0_4;8vhkf3Z(I8SzOk< zjBIdgnq5%869qs3>@x7K?LOlj)Z=_-)EnILqyhOKZHeEFJ zfGgJ&nq2t?zq)1nK*9S~3UMVerwk7D@W~Q677du{V15P0k!(+#bI!muYNbI=j^=CB z=0!k;qv};+(gi?oEh>NiHrmACUJwQ;tgQ%&4~*eh#xGE!ot=uN^zp8fivdIs-_;BL z2#B+cpC+0){(XE1^F`q^;c#6VhfjooI9zpR9NGl~hi~fzmvD%f{Ycfo-y6au#~Bo{ zcZ*I$y@w+}5_BR}peiL79{i*$gC)nPtb{_#>06K3%lJhM2snTGZJ6SY%*z40ah0`$ zE=P~Url78~=QEons0nE8KnNg&#!23||1V=7LXle#+Bg;&p(GN{mAwgFKNiV424kVk z+4T!>`#_nPnnZ6jE=2qnGsIQSlX@gOISX1MWlxSoLbb)HCEx#5Lvj)QlVUEl2v1s} zFx%u3PDaI%vSWV*!lOL#Zbf`H|Mdv03Hafhinv_S+dro0+0!YWD)b+jjyo`GNI?9$)*$Q4JJ`_)_f@Iq}4^n>!P7Z6@>L+)nb8d0#GnU{h zt*WO<)dHRPBt<7ryRn|3ZgIHXf^JT)8=ikWEC^|sPw-4-pCQH0;+x99ta+=QQ2jGV zZ1Qv=jtPlh^cXD$kWs5dp{Wf7cI7`a9*ZW6ah zqm3fYj0^CfFSg?MxzqEM8211=CeC?d(2 z-cmOOEI55~u~tKnX7QyfY&O>H{zJ)eK-RM#RLrY;Et0KlC^%7RntCQo&76s0baVfq zu&r)?WZ39LGZq81pZ5x`FXb^Z=of!a!4`BCJu+8$Wj727ykSCo*O7-6 z7vX$i!5%?~h6;-j)L1)`li*q;$y<%RpUZy(>0KubfEfnBz7d2Q09x$rcNsrvm~!|x zTlk3Jgx`Ut$(J3R*h-vmJ*HM&*2_?@(rZ4ntwpb74H}T{uJ?ab`YSK5$F>`xMa!3aE~GHuj_w_ z*pn-Ah{K7N9rMYHD(TXq5N`#sR z$Xibv^pj`?9KI%!-4^EA)@?a9!Qci(pL~mG+-Gs1nRn|LS{9$dUfElTrhBJ=*5!8* zZ*kd6j=g4|UqNd?&rlP{9|i!z(jI>lBlpua9Fp5HPu)c;v<@XSYK#3IJXr)P`-b_{ z=%9{Q$7xZ&PAyw(maIYLEdTqLb1ZGHbfE=>v2-CC-ZdN;3fM8}pAqx-ds~MPUnaf6 z{?LcE9v$mV@1HN{@fFF`I5U;#&2BGH;Ptj@bYzJ} zf`34%4X8g)=k@1LPS@`<>hENR|w&ITPty13MyhEsK^0ZOcZBW~|3WH~DlQkQsMdzsn^4?3?juC-m&k;mN}T zEnZ>^ik^XwXWE}Zx%hCr*|g2@K8^n*f1f6fcI=QL$?mclwiw&9cS>~fn!AkabKRc( zQe(S~bf(oPKwN_#Z~rLCAs#+x<8l*{LNAy|HRxn^T0+D+c`XOZNQq`tBvHcU1ocS| zE)v4;a1~MCYBPU$bCIIe(=f1!V!Tjld=yzjkk&U4+J)9k3%ZAexX_{kXbz-{jkjr< z&?kIyh+yiEBy9{A2p(#tXN3l>%`ryv>jigkaURL-d2L*LlKnO=n}6tTxAPDxQEORR zmr%nsIi{mx7{-^GhN2~MOevRUE7nA8k@%V;cY^$ddcjw@E)U@BG~m<=;>bZi zUqa76Uh#PKe zkhd;y^hj1QJXG8)S)-lZ%A=|k?jwe2yS{&GMYpblmKT#6&itLhf7d(xOL*|e;%Te( zLK475O|S&y0m`v@MxDYsm?OE3E;5)BIQ`dkUl+E<|L)&Y-!jsTo6NkK{>e-anrV-j z=9=*5n&~Vvz0yo?GSezEZ8FoZo9(}i{J_7W2aL27>7c)uk-TG;zig(X&GP%re1(6R z{u(KV|6Kp?neYt{n)5L8n`49FD*j2?mFqeYL(vNrLPCO$0wE)a#P-ki6{_XfG7|Z4b*%D;tM$T+=yX>kg(q5+~wTkYmehs2KoMY z`MmEzm;IlN#QZgkp5u2JcXNEq_=$hxPZ@78zTx~^_CIr9XW3uPc#(OV8Mh7ktGMn1 z<16N^XMD%;7mNoOCycikuP~lx91r&C*}y+L>wXX6<6U4c{{0sF>pR@Xc!%)?<449H zjABEFml$6#eq+J z{7mLT8dEFTkstkwXRT~Sr5D2JYU*d{Ts>ia(cxM=TUM9e@KNM(KzhigHKFj^dPuad7`t=Cx zNcK67^>hckL7%(19r)K%;AVfK_xyfeN7Af4f6yoN+;CqUR>pd9rkewP`t14bu)f`~ z^hXZOclOBf-bUkho;Q&>pfk41d~e;T*z@1Ox4FUiROZ1DujbxS@-3KH`wMRFF%w-PZ&UZQ3O z9%3eM@kl(dWk9aQlk5XTgj$FBACPx32D@oVp|4!wLGMM?0s~3tW|amv2M2v*$hnx0 zPoS!95GyFt_t9?-y^Mdd%Fw5S2Lfvg5Uz9(SFBy34RX>f5`W<;j0rh=Wjb8LSw4>!+jJ@*B+miQ-N z=wTE4%600sE-J6BOKVH#^MtspC)(;t>0C@~U5e43olfk+IS%RUite7k4fuCH?J-0b zSpOo=DMs%0C>MK)2m60l{kv|uc@i0{)YB;uYf?#)Ltq<6VtwTN){EX)oJcCEhU2Mn zm>?l?wPzt{8DD>j4f!0Vu9)jGLCZUQx8NKQAprLZ>{j2q_j?yT^bv~c?DzYCe?qME zN0%JLPOM!^HY0LYQDdi6Lfptq8wkiew}hdZIUPBCY(EYz@WQ?W2?0E=Iyu$jwc*I& z+(}o8tf-`IMP5X2j}IQ#w7XX{*H^abD!+MCT#w49wgrC-IFLUT<@Q1wpJ}F>YsGS0 zFT<&QD+fVDkNE7mJGH&TD8B>jojmJUObVmLVpgb`P<7>HQ90r2Qi~&pLl92eLOX$= zw{sQ$&pQ<<6?H(4ncV7nPP)aEXjnuAW<^yLqQ` zOy-MHdUPLe6_J@*-AnVAp_?AP!4?xEr>^(PY;AvpRBB$%jr3?lRykf+u7j|8S~#z* zaK*#4YuzCj3$%*sE4^oqbzShHlf*CDt|!KYFpB?X%+|Ej7NtleNX4JX8dV~KU?m7* ztV%X^MbjNDmW*z(#9=i^<4-g~;^5FY_294(hsC9F+G8aS8>hyp2ZtUU+<4#2>vZNz ziHm=iy!`Th?|tvR@0*$LYkK(#w`_W#W4W>2NkMNK68qbk%|oKOGh$P@ac+dl?aJ(- z)u3layCod?ah-n;Pq?^)@c^UAILv4(+m0 z%=)_kNdF|N$m8=5-u2a%aw%QvQ~p2Jk9`KJM)r3Wde+NF=`U;5Zf zV~ir87yrKghkX7)DVB0{U4O$DH*oU6$x8W1-_7dKz6ZxY>*eU{bvl5Nox^kx4byJ` zp_X%++Exxi*02g$O?t3Da}+V)o5Fv07$&WYAZaZG-VV08D^~?KbqQF64wp0xd?IeU z$4vm2fgaDkW%=(;?7Jwo_vAKyuMrb*hB0#f0$`G@3%h?HlN{{d=d6ju2{KEZ+2Kw( zeFfuA3vN2V9d`27Bu2-6W0uI87Hn40_R@Kq_G7gS>h%Yk4xbnL|Lj~>A)g;VK!zc5e<7tOWXbQCbfP*>0wezqxoy1yY1y;0{HI~-nHD{CwtnN|KGddr&1fVYin)itV0`~Ha zI+iOh5NYW3P))Pv7^=DI5>VDCcCm)VU0iuI)cxCTkQro`C`+~|YbhjVXgrBY)=*?< zA+qaP~6Ca}*n8oAs$uxz)wtXSly9i|wjofvf}!z64IvQi4rha25l zClW9pTM=UXsrZB)g?)Q3U<0Jme^6i*jBNRW-)+M$5F!fWd}#fScX1`Q?v^IjuU=T< zKSzu_V=E;~*lfl)1Wp#+yOI7a&_=xA3BvpCvHRI>h&5&@GolvmlfDF9|D2%7OuOe> z%VL<=#$NnA^yk1P4mv7;v7~wI`N>3SLfqw5)Yi_<~;z7^#^h70>iZrXOa_^ZiNFn;FXK261 zi-Y4P&Uq~px3UQ4A7P0kODl;&I(2E>jjGD~c|JP!beC^iK-U&DQfSDUWR2rv5ZBKCaTA>DJ|cXFRwzS5WeQFqNFY8YO3XcqALz5o(w z>|Qd%m~Lk8r+meY(v;YNx-TD8QCxg8wZW@f46ozt>1p6%`|K#@Ma07L*xw0;`}EuJ zLB!S|)B|-F8}It@TPc7_7Umrjnh!V11GGq|YeivQ|S(3qo+F+g@ zetI;`aOlompS?35o#frwC8@G^MASIQG=i0A+FsQ@HI|}Pqj=!+#AIt75f_Wyr-zak zR13B)$OvhjS$R#4miXjABEZ*LE(M#^Zm3CPE1V2u_+LCZ>nN9S*;&bnWFB1fvikTg z7WM-4u*S~-())H1gx^E?Lj5m`S?IhSjQ# z-6>nVGG#|PxYc)PY_}cM@~ua0Fk!LcukE0YU!QDWwY_Sak=x=tu*9NCt$#+(2AbT0uoO-usyIFU4{z%_}o2PUaf0>!E1o9P zC%Yr89alL!7~h5gHvSKxnkoLH^T0TLGgTSko4*n6QSzD0&y}AbcXi?PHVdWPGSTMo zE~9SI6)0|JsCEY^Klhb- z-{OgbcH+inT~n(F%1zdE4cP`kAXcRwP@3Jzqnh3dIIxG`0Pe_(m(%S8fh)j(m6g>S zUI_3>N=jla4z{DLcJuMN1WbU}TmYVYP~t2P*QBM@Sg1-Axl%im+~9O|di)06Gv*hR zH9g6QCZg$tWMdL>%s!FpPm*T(h6;mW@Hj&@nvIA)6e?Iv1(=$a#N$+=Z8M1F z5<&Rm5FT$tqm_q9{weLz@a#J^Q5|xZ$SDV-TJ6shrSwSVOn_`jRHdGbL$xQ+35aD6 z0eE$Y(7wivNlW6?djQSgkN!qgF-yw&PQ(oVk!C7?XigEIlaI9pO_yVqxLfse+w724 z&RoP!9VG_a`v(27Ii&%^-BT8U6Xkfs4s#=-jY35tsiLeCW1U09Ir3H@Np_tS!!))8 zFy}V}g8>SmUwqvjXU)#zEED>4@sZR-)>;xCOhA8VPA#PFLNuc{He%Q!@s@ZcuK|9x zEeKym2=r8gQc5KKy&F*C29mc-wy9^*i3fq&=AwcPr3JU2XHx#z+8xj0kWzQDBT!zTKGnF4hEBkLq z%w93rzvm1O9p5i{CaK@sKyHu7nIy|Wk~kDSvG^vH4EMxm3L{)c(5sOSQxW<-d6+&0 z2AZr$`OH9Xbb}lgZLQVq!SPXjn zw&qSU(m>!X7>#4#SYzPuf-%>xfUAMvM1!l{bkK%U0DM?o0-Z+y*EhY7Sa@~=eFY4n zfK5MuB{1Um0npHmnZ?G(&4bJhWd^0hoVJ^x2GY1=;EW%a45xv68PCCD3WDA{```Hl zPd4=90{>`sKIhp0iub%FTM!FwV>ZA})i^_IZm%Y=04)9Q3Vy~Tus9B!1@mLb;BWwM zw|y>=0d}x^m5uL$Q{v-v@N+tdwp{`U4RmSH(Ei~YaLw9o37nK-qIV9&k%669ueD*j zd0+=glc%~aji(Ll`@Y=rt6qo~gFzwkO zwCfAFMj^6*#X{LrMi99a0IMZj>-6O8+`#&=CDAIZ(~ay0sp0}l=K}JTlgkX~P?iTb zb*q6*6ajJHX^8K{-~UtK9dj^=qlw6T51RS`qo4{$8>A0_#yf1~wGhTXE}*e@5lk@$ zQ@4Pp4a{C7m;WE(DX<7~^T0fgE?7Ma0HoL<@G$2xxXKL~e#m1r5m^HuzFK(gC;#bd zhK_@LROY`#RvNgc z5d(8bcuRE3c;B1w7M=8#h<%GldW+!UgtwE;k$aHSRVmJjvBrR$m7*7|&uD8YMTI>_Y}p}lpIRc_;69~*x)2;gnnRXK_92WBB9 z$x&j0tTlwvzyN^Vjvc&~v0-QSP~5mm3_}Fcjp&NQl_x{4vP!|gb`y1Z&oQsi5WRJ8 zRxZ&z3I-HSy_o;Vezj>b(mFSPSpFxZK4X6N~g(D-HXu@r+LDn;d#d-^&hNlQ+lwLAiiQ ziWOIfK0Pd<`T5Ji2BQ=eWP~4S3_2#4sOsuDNp&7RueYN0Hq@W5O1GoM-C^0`Y;TfS zJpVqZH4r9kWomMgaa4hGA~Nah;~0MNUQPXxMf{!7EjVOD8W685{6akum2u<`JhmlX za1!}bF)9$ zXxH>w`t)uH!i#0vErrbY|8@~=6uIB2M$i9ZaysMp)`d&Q3Z(EJ6@NAGvE^4+R#4?|Fbz^LM zC?1<=rz{(6A$HW!YuCBeT`BXhOv{79q)<5^#m7WJY%o+VWp2(#E+v&7W1ma!oio@o z$jeaH0?Q4h_WahTd(!$z8OLn0wVHLBY^yqCF9kepHDZ4AdK4|X|7&qu|CtgU_m&~o z>A<$Z^POw2GD;J3)1mfWUygVAQ?CAaeRr$B23cJ2M z)sL8}oXfH@6Xs}*-MkF2&c3TG4~dYOafC(kI3;@5WOqo;b=Ql2c|o_Q$k|s@W@zsW z8@igcnrbTU9e&k5kJ5T+LAn0mqU+ROE*CF+{p#XzdHci{_s2V?EA@5jM;t0n-xt(1 z-I6m<^&ZAb?+cbux5+t#EKtA*%LvtcF1NX7BverE-t04)X%5W<_RL_Y3qvJCYRcQo z!)7~-o8Dahu!q7q43sO9>Ts6`Bf$U-jt;NI&e^5#~4F zpSLdruApw4i)xy2dSaWWr;e=BnF?3G@#RUOZ+GjBuT__AQqNz0y?vwc#)#hNZI742 zrxb%z?AoUcPD_(C`fXG4_|!zAn8|Q_}@X delta 19905 zcmV(#K;*yQ!3Uzg2Y|EzOOOt3vwlYs{CiL{O#lD@zL!~$0UUowTgpwLg+f7shFL6X zB|ZYdk=x$T8%zYJJf@(`N^!#nqlw6*&@RpB-66`H4))Z!hq@MAO2LAd*U=ic;TVXuGo&jQJLedjyh`M&Rb=bZ1H)8OrE1+yRs7JM~L5H<<= z$1D6BACn*q9;jIay8vg?+ojciT^I9+v*jf9-F>Zb$gSx!~~GJiKYR#KY;s z=kjpI@LLe7cSMKH=5=Na8-noX=gNoA;^7O!^f18FU-*A=#l3|0VqKW&6NG!dF+kXR zeYNf~$X)-t(o zOVqf9@F!}{qPQS5?(XveeDy`)hhGr>mj4ib{6&A^2VM}~dQteMmoEf={dxYP@XIa;znt3XPOG;$?EzJG z76gCPfYWj7>^bOhiNek(v5<3t!j2?&YMSOlx73i+5nxRUJE$<5me20u-7dN7&N~|W z@N1F~%8V?x2_f?aQ{%+=XWLijIc?O2J-|!~J1Q1sD6FeeTxD?vqw&yP0X7PeW1-nH zyUl5nC*5L`#nM}BAix(r5Go569~Q@Wh01@*G(XG4jd^BC+-QrHzC2~bGILFXBPQvw zgu}1JC+`domb8QvY0$z4Q)b{{4Rl_RRvQo;-(V7*lMJ=@nl-d5ZV2vpl z^P8sJ7|P~M_#o1vrOZsr)1mc-nQj33XB#lq&y9~-{ zj1x@Ezpth%bJ-9{+}aY$dp!1qWGwF%)CeE-)g1_BbR1<3&`%RumZ-s@ga`OU3=7mo z*2)h7Y)12u&WwjfBBvyr2Zd2gHEnZGCys{)`Xlj-Nc=q11N8z_AH{$6AlaDa*mT~y zP274Q@@`4$lGya8YPzgOdQNI^Z2HTT9>&u*NDNB7GjYNqX9HJwlf)8@27dzVh|Dm= zSp!jNr!L#kdGwG-Z1)*7N<`!cPGc_;Z3;+~bQ-DVG|=~NQdZba8CnBnpbx}xk!+ER z_xa32{i+#s`qW!(-BN!A|1*4b@z9q7ESJW`7iEk$9|qh^m?W9(?-xvzbb(P>Qp`)H z$RgFm`&gw0X>xOT455;=7GMjvpi0V2u>qS*G_YN9!*oJ?S&3G2;)FTTWlnUOixYhn zEWlp#t9KOm)m!a;4CGm}=Sa6nv!vP59Di(aLaBXkAJ8%1BL9D%$N3+3(*FRfUS)1j zeaC&Sx8!<^2f1E$Iwf&@)h2Na=)cYB^|QUns!ug7FzFtrSFHOxY>temBG$c?L0z16 zQi%ne-sGyYnx-(s6!f?d2Ad4f(3(lk@L)wtXgd`ZWh%0DaQk@zU*Yt!b{J5_$39k~ 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 Wp9^$^oz3|+4^!qX`~~CmY5PBV4|qfX diff --git a/disassembler/README.MD b/disassembler/README.MD index b832adf..cd9947c 100644 --- a/disassembler/README.MD +++ b/disassembler/README.MD @@ -26,6 +26,9 @@ x65dsasm binary disasm.txt [$skip[-$end]] [addr=$xxxx] [cpu=6502/65C02/65816] ### Updates +* c64.lbl file defining all c64 hardware addresses +* Tracking label references outside of the code including zero page +* Data / Code distinction improvements * **Local labels** to improve code readability * Improvements to code vs data determination * Instrument labels through labels text file diff --git a/disassembler/c64.lbl b/disassembler/c64.lbl new file mode 100644 index 0000000..2c65390 --- /dev/null +++ b/disassembler/c64.lbl @@ -0,0 +1,75 @@ +6510_Port_Data_Direction = 0 data +6510_Port_Data = 1 data +C64_System_Interrupt = $314-$316 data +C64_System_NMI = $318-$31a data +Vic_Sprite_Pos = $d000-$d011 data +Vic_Screen_Ctrl = $d011 data +Vic_Raster_Line = $d012 data +Vic_Light_Pen = $d013-$d015 data +Vic_Sprite_Enable = $d015 data +Vic_Sprite_Ctrl = $d016 data +Vic_Sprite_Height_Dbl = $d017 data +Vic_Memory_Setup = $d018 data +Vic_Int_Status = $d019-$d01b data +Vic_Sprite_Pri = $d01b data +Vic_Sprite_MultiCol = $d01C data +Vic_Sprite_Width_Dbl = $d01d data +Vic_Sprite_Sprite_Coll = $d01e data +Vic_Sprite_Background_Coll = $d01f data +Vic_Border_Color = $d020 data +Vic_Back_Color = $d021-$d025 data +Vic_Sprite_Color_Extra = $d025-$d027 data +Vic_Sprite_Color = $d027-$d02f data +Vic = $d02f-$d400 data +SID_Voice1_Freq = $d400-$d402 data +SID_Voice1_Pulse = $d402-$d404 data +SID_Voice1_Ctrl = $d404 data +SID_Voice1_AttackDecay = $d405 data +SID_Voice1_SustainRelease = $d406 data +SID_Voice2_Freq = $d407-$d409 data +SID_Voice2_Pulse = $d409-$d40b data +SID_Voice2_Ctrl = $d40b data +SID_Voice2_AttackDecay = $d40c data +SID_Voice2_SustainRelease = $d40d data +SID_Voice3_Freq = $d40e-$d410 data +SID_Voice3_Pulse = $d410-$d412 data +SID_Voice3_Ctrl = $d412 data +SID_Voice3_AttackDecay = $d413 data +SID_Voice3_SustainRelease = $d414 data +SID_Filter_Cutoff = $d415-$d417 data +SID_Filter_Ctrl = $d417 data +SID_Volume_Filter_Mode = $d418 data +SID_Paddles = $d419-$d41b data +SID_Voice3_Wave_Out = $d41b data +SID_Voice3_ADSR_Out = $d41c data +SID = $D41d-$D800 data +ColorRam = $D800-$DC00 data +CIA1_PortA_KBD_Joy2 = $dc00 data +CIA1_PortB_KBD_Joy1 = $dc01 data +CIA1_PortA_Data_Dir = $dc02 data +CIA1_PortB_Data_Dir = $dc03 data +CIA1_TimerA = $dc04-$dc06 data +CIA1_TimerB = $dc06-$dc08 data +CIA1_TimeOfDay = $dc08-$dc0c data +CIA1_Serial_Shift = $dc0c data +CIA1_Interrupt_Ctrl_Status = $dc0d data +CIA1_TimerA_Ctrl = $dc0e data +CIA1_TimerB_Ctrl = $dc0f data +CIA1 = $DC10-$DD00 data +CIA2_PortA_Serial = $dd00 data +CIA2_PortB_RS232 = $dd01 data +CIA2_PortA_Data_Dir = $dd02 data +CIA2_PortB_Data_Dir = $dd03 data +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_TimerA_Ctrl = $dd0e data +CIA2_TimerB_Ctrl = $dd0f data +CIA2 = $dd10-$de00 data +IO_Area1 = $de00-$df00 data +IO_Area2 = $df00-$e000 data +Interrupt_NMI_Address = $fffa-$fffc data +Reset_Address = $fffc-$fffe data +Interrupt_Address = $fffe-$10000 data diff --git a/disassembler/x65dsasm.cpp b/disassembler/x65dsasm.cpp index f6cb94b..038c728 100644 --- a/disassembler/x65dsasm.cpp +++ b/disassembler/x65dsasm.cpp @@ -1,6 +1,5 @@ - -// -// x65.cpp +// +// x65dsasm.cpp // // // Created by Carl-Henrik Skårstedt on 9/23/15. @@ -944,6 +943,7 @@ enum RefType { RT_JUMP, // jmp RT_JSR, // jsr RT_DATA, // lda $... + RT_ZP, // using a zero page / direct page instruction RT_COUNT }; @@ -953,7 +953,7 @@ enum DataType { DT_PTRS }; -const char *aRefNames[RT_COUNT] = { "???", "branch", "long branch", "jump", "subroutine", "data" }; +const char *aRefNames[RT_COUNT] = { "???", "branch", "long branch", "jump", "subroutine", "data", "zp" }; struct RefLink { int instr_addr; @@ -1127,9 +1127,13 @@ void GetReferences(unsigned char *mem, size_t bytes, bool acc_16, bool ind_16, i 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 (reference >= start_addr && reference <= end_addr && type != RT_NONE) { + if (/*reference >= start_addr && reference <= end_addr &&*/ reference>=0 && type != RT_NONE) { bool found = false; for (std::vector::iterator i = refs.begin(); i != refs.end(); ++i) { if (i->address == reference || (reference>i->address && (reference-i->size)address)) { @@ -1163,16 +1167,24 @@ 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 = init_data ? 1 : 0; + int curr_label = 0; int prev_addr = -1; bool was_data = init_data>0; - refs[curr_label].data = DT_CODE; bool separator = false; int prev_op = 0xff; addr += init_data; bytes -= init_data; mem += init_data; bool cutoff = false; + + while (curr_label<(int)refs.size() && refs[curr_label].addresscurr && type == RT_BRANCH) && type != RT_DATA) { - was_data = false; - prev_data = false; - break; + if (!prev_data) { + for (size_t j = 0; jcurr && type == RT_BRANCH) && type != RT_DATA) { + was_data = false; + prev_data = false; + break; + } } } if (!was_data && prev_data) { bool only_data_ref = pRefs.size() ? true : false; + if (!curr_label || refs[curr_label-1].data == DT_CODE) { + for (size_t j = 0; jsize()==0) { + int lbl = curr_label; + while (lbl && refs[lbl].pRefs->size()==0) + lbl--; + was_data = refs[lbl].data != DT_CODE; + } } curr_label++; } @@ -1323,13 +1358,8 @@ void GetReferences(unsigned char *mem, size_t bytes, bool acc_16, bool ind_16, i } std::vector::iterator k = refs.begin(); - if (k != refs.end()) { - ++k; // don't delete the initial label - if (init_data && k != refs.end()) - ++k; // don't delete the initial label - } while (k!=refs.end()) { - if (k->pRefs && k->pRefs->size()==0 && !k->label && !k->separator) { + if (k->pRefs && k->pRefs->size()==0 && !k->label && !k->separator && k->address!=addr_orig) { delete k->pRefs; k = refs.erase(k); } else @@ -1451,9 +1481,9 @@ void Disassemble(strref filename, unsigned char *mem, size_t bytes, bool acc_16, prv_addr = refs[k].address; } if (refs[lbl].label) - out.sprintf("%s; Referenced from " STRREF_FMT " + $%x (%s)\n", spc, + out.sprintf("%s; Referenced from " STRREF_FMT " + $%x (%s, $%02x)\n", spc, STRREF_ARG(refs[lbl].label), ref_addr - prv_addr, - aRefNames[(*ref.pRefs)[j].type]); + aRefNames[(*ref.pRefs)[j].type], ref_addr); else { out.sprintf("%s; Referenced from", spc); if (refs[lbl].local) { @@ -1462,11 +1492,14 @@ void Disassemble(strref filename, unsigned char *mem, size_t bytes, bool acc_16, lbl_glb--; if (refs[lbl].label) out.append(refs[lbl].label); - else - out.sprintf_append(" %s_%d /", refs[lbl_glb].local ? ".l" : (refs[lbl_glb].data==DT_CODE ? "Code" : "Data"), refs[lbl_glb].number); + else { + RefAddr &ra = refs[lbl_glb]; + out.sprintf_append(" %s_%d /", ra.local ? ".l" : (ra.data==DT_CODE ? "Code" : (ra.address>=0 && ra.address<0x100 ? "zp" : "Data")), ra.number); + } } - out.sprintf_append(" %s_%d + $%x (%s)\n", refs[lbl].local ? ".l" : (refs[lbl].data==DT_CODE ? "Code" : "Data"), - refs[lbl].number, ref_addr - prv_addr, aRefNames[(*ref.pRefs)[j].type]); + RefAddr &ra = refs[lbl]; + out.sprintf_append(" %s_%d + $%x (%s, $%02x)\n", ra.local ? ".l" : (ra.data==DT_CODE ? "Code" : (ra.address>=0 && ra.address<0x100 ? "zp" : "Data")), + ra.number, ref_addr - prv_addr, aRefNames[(*ref.pRefs)[j].type], ra.address); } } else out.sprintf("%s; Referenced from $%04x (%s)\n", spc, (*ref.pRefs)[j].instr_addr, @@ -1474,19 +1507,27 @@ void Disassemble(strref filename, unsigned char *mem, size_t bytes, bool acc_16, fputs(out.c_str(), f); } } - out.clear(); - if (refs[curr_label_index].comment) - out.sprintf_append("%s; " STRREF_FMT"\n", spc, STRREF_ARG(refs[curr_label_index].comment)); - if (refs[curr_label_index].label) - out.sprintf_append("%s" STRREF_FMT ": ; $%04x\n", spc, - STRREF_ARG(refs[curr_label_index].label), addr); - else - out.sprintf_append("%s%s_%d: ; $%04x\n", spc, - refs[curr_label_index].local ? ".l" : (refs[curr_label_index].data==DT_CODE ? "Code" : "Data"), - refs[curr_label_index].number, addr); + if (addr>refs[curr_label_index].address) { + if (ref.label) + out.sprintf(STRREF_FMT " = %02x\n", STRREF_ARG(ref.label), ref.address); + else + out.sprintf("%s_%d = $%02x\n", ref.local ? ".l" : (ref.data==DT_CODE ? "Code" : (ref.address>=0 && ref.address<0x100 ? "zp" : "Data")), + ref.number, ref.address); + } else { + out.clear(); + if (ref.comment) + out.sprintf_append("%s; " STRREF_FMT"\n", spc, STRREF_ARG(ref.comment)); + if (ref.label) + out.sprintf_append("%s" STRREF_FMT ": ; $%04x\n", spc, + STRREF_ARG(ref.label), ref.address); + else + out.sprintf_append("%s%s_%d: ; $%04x\n", spc, + ref.local ? ".l" : (ref.data==DT_CODE ? "Code" : (ref.address>=0 && ref.address<0x100 ? "zp" : "Data")), + ref.number, ref.address); + } fputs(out.c_str(), f); - is_data = !!refs[curr_label_index].data; - is_ptrs = is_data && refs[curr_label_index].data==DT_PTRS; + is_data = !!ref.data; + is_ptrs = is_data && ref.data==DT_PTRS; separator = false; curr_label_index++; } @@ -1507,10 +1548,12 @@ void Disassemble(strref filename, unsigned char *mem, size_t bytes, bool acc_16, if (refs[lbl].label) { out.append(refs[lbl].label); out.sprintf_append(" ; $%04x " STRREF_FMT "\n", a, STRREF_ARG(refs[lbl].comment)); - } else - out.sprintf_append("%s%s_%d: ; $%04x%s\n", spc, - refs[lbl].local ? ".l" : (refs[lbl].data==DT_CODE ? "Code" : "Data"), - refs[lbl].number, a, STRREF_ARG(refs[lbl].comment)); + } else { + RefAddr &ra = refs[lbl]; + out.sprintf_append("%s%s_%d: ; $%04x" STRREF_FMT "\n", spc, + ra.local ? ".l" : (ra.data==DT_CODE ? "Code" : (ra.address>=0 && ra.address<0x100 ? "zp" : "Data")), + ra.number, a, STRREF_ARG(ra.comment)); + } } else out.sprintf_append("$%04x\n", a); fputs(out.c_str(), f); @@ -1618,13 +1661,16 @@ void Disassemble(strref filename, unsigned char *mem, size_t bytes, bool acc_16, if (reference == refs[i].address || (reference>=start_addr &&reference<=end_addr && reference>=refs[i].address)) { if (i==(refs.size()-1) || reference refs[i].address) - lblname.sprintf_append(" + $%x", reference - refs[i].address); + lblname.sprintf("%s_%d", + ra.local ? ".l" : (ra.data==DT_CODE ? "Code" : + (ra.address>=0 && ra.address<0x100 ? "zp" : "Data")), ra.number); + lblcmt = ra.comment; + if (reference > ra.address) + lblname.sprintf_append(" + $%x", reference - ra.address); break; } }