mirror of
https://github.com/athros/NESticle.git
synced 2025-04-02 10:52:50 -04:00
120 lines
4.1 KiB
Text
Executable file
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);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|