Add SNES disassembler

This commit is contained in:
condret 2013-11-29 17:30:58 +01:00 committed by pancake
parent 4c86f43a14
commit c949e467a0
7 changed files with 356 additions and 1 deletions

View File

@ -0,0 +1,275 @@
/* radare - GPL3 - 2013 condret@runas-racer.com */
#include <r_types.h>
enum{
SNES_OP_8BIT = 1,
SNES_OP_16BIT,
SNES_OP_24BIT,
SNES_OP_32BIT
};
typedef struct{
const char *name;
ut8 len;
} snes_op_t;
snes_op_t snes_op[]={
{"brk 0x%02x", SNES_OP_16BIT},
{"ora (0x%02x,x)", SNES_OP_16BIT},
{"cop 0x%02x", SNES_OP_16BIT},
{"ora 0x%02x,s", SNES_OP_16BIT},
{"tsb 0x%02x", SNES_OP_16BIT},
{"ora 0x%02x", SNES_OP_16BIT},
{"asl 0x%02x", SNES_OP_16BIT},
{"ora [0x%02x]", SNES_OP_16BIT},
{"php", SNES_OP_8BIT},
{"ora #0x%02x", SNES_OP_16BIT},
{"asl a", SNES_OP_8BIT},
{"phd", SNES_OP_8BIT},
{"tsb 0x%04x", SNES_OP_24BIT},
{"ora 0x%04x", SNES_OP_24BIT},
{"asl 0x%04x", SNES_OP_24BIT},
{"ora 0x%06x", SNES_OP_32BIT},
{"bpl 0x%02x", SNES_OP_16BIT},
{"ora (0x%02x),y", SNES_OP_16BIT},
{"ora (0x%02x)", SNES_OP_16BIT},
{"ora (0x%02x,s),y", SNES_OP_16BIT},
{"trb 0x%02x", SNES_OP_16BIT},
{"ora 0x%02x,x", SNES_OP_16BIT},
{"asl 0x%02x,x", SNES_OP_16BIT},
{"ora [0x%02x],y", SNES_OP_16BIT},
{"clc", SNES_OP_8BIT},
{"ora 0x%04x,y", SNES_OP_24BIT},
{"inc a", SNES_OP_8BIT},
{"tas", SNES_OP_8BIT},
{"trb 0x%04x", SNES_OP_24BIT},
{"ora 0x%04x,x", SNES_OP_24BIT},
{"asl 0x%04x,x", SNES_OP_24BIT},
{"ora 0x%06x,x", SNES_OP_32BIT},
{"jsr 0x%04x", SNES_OP_24BIT},
{"and (0x%02x,x)", SNES_OP_16BIT},
{"jsr 0x%06x", SNES_OP_32BIT},
{"and 0x%02x,s", SNES_OP_16BIT},
{"bit 0x%02x", SNES_OP_16BIT},
{"and 0x%02x", SNES_OP_16BIT},
{"rol 0x%02x", SNES_OP_16BIT},
{"and [0x%02x]", SNES_OP_16BIT},
{"plp", SNES_OP_8BIT},
{"and #0x%02x", SNES_OP_16BIT},
{"rol a", SNES_OP_8BIT},
{"pld", SNES_OP_8BIT},
{"bit 0x%04x", SNES_OP_24BIT},
{"and 0x%04x", SNES_OP_24BIT},
{"rol 0x%04x", SNES_OP_24BIT},
{"and 0x%06x", SNES_OP_32BIT},
{"bmi 0x%02x", SNES_OP_16BIT},
{"and (0x%02x),y", SNES_OP_16BIT},
{"and (0x%02x)", SNES_OP_16BIT},
{"and (0x%02x,s),y", SNES_OP_16BIT},
{"bit 0x%02x,x", SNES_OP_16BIT},
{"and 0x%02x,x", SNES_OP_16BIT},
{"rol 0x%02x,x", SNES_OP_16BIT},
{"and [0x%02x],y", SNES_OP_16BIT},
{"sec", SNES_OP_8BIT},
{"and 0x%04x,y", SNES_OP_24BIT},
{"dec a", SNES_OP_8BIT},
{"tsa", SNES_OP_8BIT},
{"bit 0x%04x,x", SNES_OP_24BIT},
{"and 0x%04x,x", SNES_OP_24BIT},
{"rol 0x%04x,x", SNES_OP_24BIT},
{"and 0x%06x,x", SNES_OP_32BIT},
{"rti", SNES_OP_8BIT},
{"eor (0x%02x,x)", SNES_OP_16BIT},
{"wdm", SNES_OP_8BIT},
{"eor 0x%02x,s", SNES_OP_16BIT},
{"mvp 0x%02x,0x%02x", SNES_OP_24BIT},
{"eor 0x%02x", SNES_OP_16BIT},
{"lsr 0x%02x", SNES_OP_16BIT},
{"eor [0x%02x]", SNES_OP_16BIT},
{"pha", SNES_OP_8BIT},
{"eor #0x%02x", SNES_OP_16BIT},
{"lsr a", SNES_OP_8BIT},
{"phk", SNES_OP_8BIT},
{"jmp 0x%04x", SNES_OP_24BIT},
{"eor 0x%04x", SNES_OP_24BIT},
{"lsr 0x%04x", SNES_OP_24BIT},
{"eor 0x%06x", SNES_OP_32BIT},
{"bvc 0x%02x", SNES_OP_16BIT},
{"eor (0x%02x),y", SNES_OP_16BIT},
{"eor (0x%02x)", SNES_OP_16BIT},
{"eor (0x%02x,s),y", SNES_OP_16BIT},
{"mvn 0x%02x,0x%02x", SNES_OP_16BIT},
{"eor 0x%02x,x", SNES_OP_16BIT},
{"lsr 0x%02x,x", SNES_OP_16BIT},
{"eor [0x%02x],y", SNES_OP_16BIT},
{"cli", SNES_OP_8BIT},
{"eor 0x%04x,y", SNES_OP_24BIT},
{"phy", SNES_OP_8BIT},
{"tad", SNES_OP_8BIT},
{"jmp 0x%06x", SNES_OP_32BIT},
{"eor 0x%04x,x", SNES_OP_24BIT},
{"lsr 0x%04x,x", SNES_OP_24BIT},
{"eor 0x%06x,x", SNES_OP_32BIT},
{"rts", SNES_OP_8BIT},
{"adc (0x%02x,x)", SNES_OP_16BIT},
{"per 0x%04x", SNES_OP_24BIT},
{"adc 0x%02x,s", SNES_OP_16BIT},
{"stz 0x%02x", SNES_OP_16BIT},
{"adc 0x%02x", SNES_OP_16BIT},
{"ror 0x%02x", SNES_OP_16BIT},
{"adc [0x%02x]", SNES_OP_16BIT},
{"pla", SNES_OP_8BIT},
{"adc #0x%02x", SNES_OP_16BIT},
{"ror a", SNES_OP_8BIT},
{"rtl", SNES_OP_8BIT},
{"jmp (0x%04x)", SNES_OP_24BIT},
{"adc 0x%04x", SNES_OP_24BIT},
{"ror 0x%04x", SNES_OP_24BIT},
{"adc 0x%06x", SNES_OP_32BIT},
{"bvs 0x%02x", SNES_OP_16BIT},
{"adc (0x%02x),y", SNES_OP_16BIT},
{"adc (0x%02x)", SNES_OP_16BIT},
{"adc (0x%02x,s),y", SNES_OP_16BIT},
{"stz 0x%02x,x", SNES_OP_16BIT},
{"adc 0x%02x,x", SNES_OP_16BIT},
{"ror 0x%02x,x", SNES_OP_16BIT},
{"adc [0x%02x],y", SNES_OP_16BIT},
{"sei", SNES_OP_8BIT},
{"adc 0x%04x,y", SNES_OP_24BIT},
{"ply", SNES_OP_8BIT},
{"tda", SNES_OP_8BIT},
{"jmp (0x%04x,x)", SNES_OP_24BIT},
{"adc 0x%04x,x", SNES_OP_24BIT},
{"ror 0x%04x,x", SNES_OP_24BIT},
{"adc 0x%06x,x", SNES_OP_32BIT},
{"bra 0x%02x", SNES_OP_16BIT},
{"sta (0x%02x,x)", SNES_OP_16BIT},
{"brl 0x%04x", SNES_OP_24BIT},
{"sta 0x%02x,s", SNES_OP_16BIT},
{"sty 0x%02x", SNES_OP_16BIT},
{"sta 0x%02x", SNES_OP_16BIT},
{"stx 0x%02x", SNES_OP_16BIT},
{"sta [0x%02x]", SNES_OP_16BIT},
{"dey", SNES_OP_8BIT},
{"bit #0x%02x", SNES_OP_16BIT},
{"txa", SNES_OP_8BIT},
{"phb", SNES_OP_8BIT},
{"sty 0x%04x", SNES_OP_24BIT},
{"sta 0x%04x", SNES_OP_24BIT},
{"stx 0x%04x", SNES_OP_24BIT},
{"sta 0x%06x", SNES_OP_32BIT},
{"bcc 0x%02x", SNES_OP_16BIT},
{"sta (0x%02x),y", SNES_OP_16BIT},
{"sta (0x%02x)", SNES_OP_16BIT},
{"sta (0x%02x,s),y", SNES_OP_16BIT},
{"sty 0x%02x,x", SNES_OP_16BIT},
{"sta 0x%02x,x", SNES_OP_16BIT},
{"stx 0x%02x,y", SNES_OP_16BIT},
{"sta [0x%02x],y", SNES_OP_16BIT},
{"tya", SNES_OP_8BIT},
{"sta 0x%04x,y", SNES_OP_24BIT},
{"txs", SNES_OP_8BIT},
{"txy", SNES_OP_8BIT},
{"stz 0x%04x", SNES_OP_24BIT},
{"sta 0x%04x,x", SNES_OP_24BIT},
{"stz 0x%04x,x", SNES_OP_24BIT},
{"sta 0x%06x,x", SNES_OP_32BIT},
{"ldy #0x%02x", SNES_OP_16BIT},
{"lda (0x%02x,x)", SNES_OP_16BIT},
{"ldx #0x%02x", SNES_OP_16BIT},
{"lda 0x%02x,s", SNES_OP_16BIT},
{"ldy 0x%02x", SNES_OP_16BIT},
{"lda 0x%02x", SNES_OP_16BIT},
{"ldx 0x%02x", SNES_OP_16BIT},
{"lda [0x%02x]", SNES_OP_16BIT},
{"tay", SNES_OP_8BIT},
{"lda #0x%02x", SNES_OP_16BIT},
{"tax", SNES_OP_8BIT},
{"plb", SNES_OP_8BIT},
{"ldy 0x%04x", SNES_OP_24BIT},
{"lda 0x%04x", SNES_OP_24BIT},
{"ldx 0x%04x", SNES_OP_24BIT},
{"lda 0x%06x", SNES_OP_32BIT},
{"bcs 0x%02x", SNES_OP_16BIT},
{"lda (0x%02x),y", SNES_OP_16BIT},
{"lda (0x%02x)", SNES_OP_16BIT},
{"lda (0x%02x,s),y", SNES_OP_16BIT},
{"ldy 0x%02x,x", SNES_OP_16BIT},
{"lda 0x%02x,x", SNES_OP_16BIT},
{"ldx 0x%02x,y", SNES_OP_16BIT},
{"lda [0x%02x],y", SNES_OP_16BIT},
{"clv", SNES_OP_8BIT},
{"lda 0x%04x,y", SNES_OP_24BIT},
{"tsx", SNES_OP_8BIT},
{"tyx", SNES_OP_8BIT},
{"ldy 0x%04x,x", SNES_OP_24BIT},
{"lda 0x%04x,x", SNES_OP_24BIT},
{"ldx 0x%04x,y", SNES_OP_24BIT},
{"lda 0x%06x,x", SNES_OP_32BIT},
{"cpy #0x%02x", SNES_OP_16BIT},
{"cmp (0x%02x,x)", SNES_OP_16BIT},
{"rep #0x%02x", SNES_OP_16BIT},
{"cmp 0x%02x,s", SNES_OP_16BIT},
{"cpy 0x%02x", SNES_OP_16BIT},
{"cmp 0x%02x", SNES_OP_16BIT},
{"dec 0x%02x", SNES_OP_16BIT},
{"cmp [0x%02x]", SNES_OP_16BIT},
{"iny", SNES_OP_8BIT},
{"cmp #0x%02x", SNES_OP_16BIT},
{"dex", SNES_OP_8BIT},
{"wai", SNES_OP_8BIT},
{"cpy 0x%04x", SNES_OP_24BIT},
{"cmp 0x%04x", SNES_OP_24BIT},
{"dec 0x%04x", SNES_OP_24BIT},
{"cmp 0x%06x", SNES_OP_32BIT},
{"bne 0x%02x", SNES_OP_16BIT},
{"cmp (0x%02x),y", SNES_OP_16BIT},
{"cmp (0x%02x)", SNES_OP_16BIT},
{"cmp (0x%02x,s),y", SNES_OP_16BIT},
{"pei (0x%02x)", SNES_OP_16BIT},
{"cmp 0x%02x,x", SNES_OP_16BIT},
{"dec 0x%02x,x", SNES_OP_16BIT},
{"cmp [0x%02x],y", SNES_OP_16BIT},
{"cld", SNES_OP_8BIT},
{"cmp 0x%04x,y", SNES_OP_24BIT},
{"phx", SNES_OP_8BIT},
{"stp", SNES_OP_8BIT},
{"jmp [0x%04x]", SNES_OP_24BIT},
{"cmp 0x%04x,x", SNES_OP_24BIT},
{"dec 0x%04x,x", SNES_OP_24BIT},
{"cmp 0x%06x,x", SNES_OP_32BIT},
{"cpx #0x%02x", SNES_OP_16BIT},
{"sbc (0x%02x,x)", SNES_OP_16BIT},
{"sep #0x%02x", SNES_OP_16BIT},
{"sbc 0x%02x,s", SNES_OP_16BIT},
{"cpx 0x%02x", SNES_OP_16BIT},
{"sbc 0x%02x", SNES_OP_16BIT},
{"inc 0x%02x", SNES_OP_16BIT},
{"sbc [0x%02x]", SNES_OP_16BIT},
{"inx", SNES_OP_8BIT},
{"sbc #0x%02x", SNES_OP_16BIT},
{"nop", SNES_OP_8BIT},
{"swa", SNES_OP_8BIT},
{"cpx 0x%04x", SNES_OP_24BIT},
{"sbc 0x%04x", SNES_OP_24BIT},
{"inc 0x%04x", SNES_OP_24BIT},
{"sbc 0x%06x", SNES_OP_32BIT},
{"beq 0x%02x", SNES_OP_16BIT},
{"sbc (0x%02x),y", SNES_OP_16BIT},
{"sbc (0x%02x)", SNES_OP_16BIT},
{"sbc (0x%02x,s),y", SNES_OP_16BIT},
{"pea 0x%04x", SNES_OP_24BIT},
{"sbc 0x%02x,x", SNES_OP_16BIT},
{"inc 0x%02x,x", SNES_OP_16BIT},
{"sbc [0x%02x],y", SNES_OP_16BIT},
{"sed", SNES_OP_8BIT},
{"sbc 0x%04x,y", SNES_OP_24BIT},
{"plx", SNES_OP_8BIT},
{"xce", SNES_OP_8BIT},
{"jsr (0x%04x,x)", SNES_OP_24BIT},
{"sbc 0x%04x,x", SNES_OP_24BIT},
{"inc 0x%04x,x", SNES_OP_24BIT},
{"sbc 0x%06x,x", SNES_OP_32BIT}
};

View File

@ -0,0 +1,33 @@
/* radare - GPL3 - 2013 condret@runas-racer.com */
#include <r_types.h>
#include <r_util.h>
#include <r_asm.h>
#include <r_lib.h>
#include <string.h>
#include "snes_op_table.h"
static int snesDisass(RAsmOp *op, const ut8 *buf, ut64 len){
if (len<snes_op[buf[0]].len)
return 0;
switch(snes_op[buf[0]].len)
{
case SNES_OP_8BIT:
sprintf(op->buf_asm,"%s",snes_op[buf[0]].name);
break;
case SNES_OP_16BIT:
sprintf(op->buf_asm,snes_op[buf[0]].name,buf[1]);
break;
case SNES_OP_24BIT:
if(buf[0]==0x44||0x54){
sprintf(op->buf_asm, snes_op[buf[0]].name, buf[1], buf[2]);
} else {
sprintf(op->buf_asm, snes_op[buf[0]].name,buf[1]+0x100*buf[2]);
}
break;
case SNES_OP_32BIT:
sprintf (op->buf_asm, snes_op[buf[0]].name,buf[1]+0x100*buf[2]+0x10000*buf[3]);
break;
}
return snes_op[buf[0]].len;
}

View File

@ -13,7 +13,7 @@ ALL_TARGETS=
# TODO: rename to enabled plugins
ARCHS=mips.mk sparc.mk java.mk bf.mk arm.mk dalvik.mk x86_as.mk x86_nz.mk
ARCHS+=ppc.mk x86_olly.mk x86.mk csr.mk x86_nasm.mk psosvm.mk avr.mk
ARCHS+=msil.mk sh.mk arm_winedbg.mk c55plus.mk gb.mk
ARCHS+=msil.mk sh.mk arm_winedbg.mk c55plus.mk gb.mk snes.mk
include $(ARCHS)
all: ${ALL_TARGETS}

36
libr/asm/p/asm_snes.c Normal file
View File

@ -0,0 +1,36 @@
/* radare - LGPL - Copyright 2012-2013 - pancake
2013 - condret */
// copypasta from asm_gb.c
#include <r_types.h>
#include <r_util.h>
#include <r_asm.h>
#include <r_lib.h>
#include "../arch/snes/snesdis.c"
static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, ut64 len) {
int dlen = snesDisass(op,buf,len);
if(dlen<0) dlen=0;
op->inst_len=dlen;
return dlen;
}
RAsmPlugin r_asm_plugin_snes = {
.name = "snes",
.desc = "SNES disassembly plugin",
.arch = "snes",
.bits = (int[]){ 16, 8, 0 }, /* supported wordsizes */
.init = NULL,
.fini = NULL,
.disassemble = &disassemble,
.modify = NULL,
.assemble = NULL,
};
#ifndef CORELIB
struct r_lib_struct_t radare_plugin = {
.type = R_LIB_TYPE_ASM,
.data = &r_asm_plugin_snes
};
#endif

9
libr/asm/p/snes.mk Normal file
View File

@ -0,0 +1,9 @@
OBJ_SNES=asm_snes.o
STATIC_OBJ+=${OBJ_SNES}
TARGET_SNES=asm_snes.${EXT_SO}
ALL_TARGETS+=${TARGET_SNES}
${TARGET_SNES}: ${OBJ_SNES}
${CC} ${call libname,asm_snes} ${CFLAGS} -o ${TARGET_SNES} ${OBJ_SNES}

View File

@ -184,6 +184,7 @@ extern RAsmPlugin r_asm_plugin_dcpu16;
extern RAsmPlugin r_asm_plugin_8051;
extern RAsmPlugin r_asm_plugin_c55plus;
extern RAsmPlugin r_asm_plugin_gb;
extern RAsmPlugin r_asm_plugin_snes;
#endif
#ifdef __cplusplus

View File

@ -30,6 +30,7 @@ asm.8051
asm.msil
asm.c55plus
asm.gb
asm.snes
anal.sh
anal.x86_im
anal.x86_udis