NESticle/Source/BACK/DISASM.BAK
2019-04-25 18:26:42 +07:00

120 lines
4.1 KiB
Text
Executable file

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "types.h"
/*
byte *mn[]=
{
"adc ","and ","asl ","bcc ","bcs ","beq ","bit ","bmi ",
"bne ","bpl ","brk","bvc ","bvs ","clc","cld","cli",
"clv","cmp ","cpx ","cpy ","dec ","dex","dey","inx",
"iny","eor ","inc ","jmp ","jsr ","lda ","nop ","ldx ",
"ldy ","lsr ","ora ","pha","php","pla","plp","rol ",
"ror ","rti","rts","sbc ","sta ","stx ","sty ","sec ",
"sed","sei","tax","tay","txa","tya","tsx","txs"
};
*/
byte *mn[]=
{
"adc","and","asl","bcc","bcs","beq","bit","bmi",
"bne","bpl","brk","bvc","bvs","clc","cld","cli",
"clv","cmp","cpx","cpy","dec","dex","dey","inx",
"iny","eor","inc","jmp","jsr","lda","nop","ldx",
"ldy","lsr","ora","pha","php","pla","plp","rol",
"ror","rti","rts","sbc","sta","stx","sty","sec",
"sed","sei","tax","tay","txa","tya","tsx","txs"
};
enum Addressing_Modes { Ac=0,Il,Im,Ab,Zp,Zx,Zy,Ax,Ay,Rl,Ix,Iy,In,No };
byte ad[512]=
{
10,Il, 34,Ix, No,No, No,No, No,No, 34,Zp, 2,Zp, No,No,
36,Il, 34,Im, 2,Ac, No,No, No,No, 34,Ab, 2,Ab, No,No,
9,Rl, 34,Iy, No,No, No,No, No,No, 34,Zx, 2,Zx, No,No,
13,Il, 34,Ay, No,No, No,No, No,No, 34,Ax, 2,Ax, No,No,
28,Ab, 1,Ix, No,No, No,No, 6,Zp, 1,Zp, 39,Zp, No,No,
38,Il, 1,Im, 39,Ac, No,No, 6,Ab, 1,Ab, 39,Ab, No,No,
7,Rl, 1,Iy, No,No, No,No, No,No, 1,Zx, 39,Zx, No,No,
47,Il, 1,Ay, No,No, No,No, No,No, 1,Ax, 39,Ax, No,No,
41,Il, 25,Ix, No,No, No,No, No,No, 25,Zp, 33,Zp, No,No,
35,Il, 25,Im, 33,Ac, No,No, 27,Ab, 25,Ab, 33,Ab, No,No,
11,Rl, 25,Iy, No,No, No,No, No,No, 25,Zx, 33,Zx, No,No,
15,Il, 25,Ay, No,No, No,No, No,No, 25,Ax, 33,Ax, No,No,
42,Il, 0,Ix, No,No, No,No, No,No, 0,Zp, 40,Zp, No,No,
37,Il, 0,Im, 40,Ac, No,No, 27,In, 0,Ab, 40,Ab, No,No,
12,Rl, 0,Iy, No,No, No,No, No,No, 0,Zx, 40,Zx, No,No,
49,Il, 0,Ay, No,No, No,No, No,No, 0,Ax, 40,Ax, No,No,
No,No, 44,Ix, No,No, No,No, 46,Zp, 44,Zp, 45,Zp, No,No,
22,Il, No,No, 52,Il, No,No, 46,Ab, 44,Ab, 45,Ab, No,No,
3,Rl, 44,Iy, No,No, No,No, 46,Zx, 44,Zx, 45,Zy, No,No,
53,Il, 44,Ay, 55,Il, No,No, No,No, 44,Ax, No,No, No,No,
32,Im, 29,Ix, 31,Im, No,No, 32,Zp, 29,Zp, 31,Zp, No,No,
51,Il, 29,Im, 50,Il, No,No, 32,Ab, 29,Ab, 31,Ab, No,No,
4,Rl, 29,Iy, No,No, No,No, 32,Zx, 29,Zx, 31,Zy, No,No,
16,Il, 29,Ay, 54,Il, No,No, 32,Ax, 29,Ax, 31,Ay, No,No,
19,Im, 17,Ix, No,No, No,No, 19,Zp, 17,Zp, 20,Zp, No,No,
24,Il, 17,Im, 21,Il, No,No, 19,Ab, 17,Ab, 20,Ab, No,No,
8,Rl, 17,Iy, No,No, No,No, No,No, 17,Zx, 20,Zx, No,No,
14,Il, 17,Ay, No,No, No,No, No,No, 17,Ax, 20,Ax, No,No,
18,Im, 43,Ix, No,No, No,No, 18,Zp, 43,Zp, 26,Zp, No,No,
23,Il, 43,Im, 30,Il, No,No, 18,Ab, 43,Ab, 26,Ab, No,No,
5,Rl, 43,Iy, No,No, No,No, No,No, 43,Zx, 26,Zx, No,No,
48,Il, 43,Ay, No,No, No,No, No,No, 43,Ax, 26,Ax, No,No
};
int DAsm(char *S,byte *A,word PC)
{
byte *B,J;
word OP,TO;
B=A;OP=(*B++)*2;
switch(ad[OP+1])
{
case Ac: sprintf(S,"%s a",mn[ad[OP]]);break;
case Il: sprintf(S,"%s",mn[ad[OP]]);break;
case Rl: J=*B++;TO=PC+2+((J<0x80)? J:(J-256));
sprintf(S,"%s $%04X",mn[ad[OP]],TO);break;
case Im: sprintf(S,"%s #$%02X",mn[ad[OP]],*B++);break;
case Zp: sprintf(S,"%s $%02X",mn[ad[OP]],*B++);break;
case Zx: sprintf(S,"%s $%02X,x",mn[ad[OP]],*B++);break;
case Zy: sprintf(S,"%s $%02X,y",mn[ad[OP]],*B++);break;
case Ix: sprintf(S,"%s ($%02X,x)",mn[ad[OP]],*B++);break;
case Iy: sprintf(S,"%s ($%02X),y",mn[ad[OP]],*B++);break;
case Ab: sprintf(S,"%s $%04X",mn[ad[OP]],B[1]*256+B[0]);B+=2;break;
case Ax: sprintf(S,"%s $%04X,x",mn[ad[OP]],B[1]*256+B[0]);B+=2;break;
case Ay: sprintf(S,"%s $%04X,y",mn[ad[OP]],B[1]*256+B[0]);B+=2;break;
case In: sprintf(S,"%s ($%04X)",mn[ad[OP]],B[1]*256+B[0]);B+=2;break;
default: sprintf(S,".db $%02X; <Invalid OPcode>",OP/2);
}
return(B-A);
}
//disassembles instruction at base[pc] to string s
void disasm(char *s,byte *base,word pc)
{
char t[128];
DAsm(t,&base[pc],pc);
sprintf(s,"[%X]: %s",pc,t);
}