void Dasm(unsigned op, unsigned PC, unsigned A,unsigned X, unsigned Y,unsigned Flags,unsigned SP, unsigned PPU_X, unsigned PPU_Scanline) { static const char modetable[] = "@VaFCSsC@A`AHXxHBWwGDTtD@Z@JIYyIHVaFSSsC@A`AXXxHBWwGDTtD@Z@JIYyI" "@VaFCSsC@A`AHXxHBWwGDTtD@Z@JIYyI@VaFCSsC@A`AKXxHBWwGDTtD@Z@JIYyI" "afAFcccC@a@AhhhHBggGddeE@j@JIiJIAVAFSSSC@A@AXXXHBWWGTTUE@Z@JYYZJ" "AVAFSSsC@A@AXXxHBWwGDTtD@Z@JIYyIAVAFSSsC@A@AXXxHBWwGDTtD@Z@JIYyI" "@@@"; static const char flag2[] = " *** * ** * *** * *** * ** * * * *** * *** *" " *** * * * *** * *** * *** * * * *** * *** *" " ** * * * ** * ** ** * * * * ** * * *" " ** * * * *** * *** * ** * * *** * *** *" " *"; static const char grammar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghioklmnpqjrstuvwxyz-.+%<=>@?[]&"; static const char opmatch[] = "6Zhu1ZhuIZh%1ZhuAZhu1ZhuQZ1u1Zhu7aiv0aivJai%0aivBaiv1aivRa1v1aiv" "8bow1bowKbo4fn.Gfn.1fn.Vf1.1fn.5g1+5gp+Pg1g5gp+Hgp+1gp+Wg1+1gp+" "[]&"; static const char opnames[] = "bitnopstyldycpycpxbrkjsrrtirtsbplbmibvcbvsbccbcsbnebeqphpplpphapladeytay" "inyinxclcseccliseiclvcldsedtyajmporaandeoradcstaldacmpsbcaslrollsrrorstx" "ldxdecinctxataxdextxstsxslorlasrerrasaxlaxlasdcpisbancasrarrsbxshyshx" "NMIRESINT"; unsigned mode = modetable[op], on = opmatch[op]; const char* insname = strchr(grammar,on) ? opnames+3*(strchr(grammar,on)-grammar) : "???"; const char* pfx = "\0---#\0--(\0--,x\0-,y\0-,x)\0),y\0)"+4*("010000220002"[mode&15]&15); const char* sfx = "\0---#\0--(\0--,x\0-,y\0-,x)\0),y\0)"+4*("000034560347"[mode&15]&15); const unsigned n = "01111111222220000"[mode&15]&15; unsigned a,m,addr; printf("%04X%s%02X", PC-1, op<0x100?" ":" ", op); for(a=1; a<3; ++a) printf(a<=n?" %02X":" ", ROM_Read(PC+a-1)); printf(" %c", flag2[op]); // unofficial/official m = printf("%.3s %s%s", insname, pfx, n?"$":""); if((op&0x9F) == 0x0A) m += printf(" a"); // implied addr = 0; if((mode&15) == 2) m += printf("%04X", addr = PC+1+s8(ROM_Read(PC))); else for(a=n; a-->=1; ) { unsigned v = ROM_Read(PC+a); addr = addr*256 + v; m += printf("%02X", v); } m += printf("%s", sfx); if(n>0 && (mode&15)>2 && *insname != 'j') { m += printf(" = %02X", addr<0x2000 ? RAM[addr&0x7FF] : (ROM_Read(addr)) ); } printf("%*s", 32-m, ""); printf("A:%02X X:%02X Y:%02X P:%02X SP:%02X CYC:%3u SL:%d\n", A, X, Y, (Flags & 0xEF) | 0x20, SP, PPU_X, PPU_Scanline); }