Move jdh8 asm plugin to anal

This commit is contained in:
pancake 2022-05-06 10:17:45 +02:00 committed by GitHub
parent c52cd8b7de
commit eceef902b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 85 additions and 87 deletions

View File

@ -137,7 +137,7 @@ V850, CRIS, XAP, PIC, LM32, 8051, 6502, i4004, i8080, Propeller,
Tricore, CHIP-8, LH5801, T8200, GameBoy, SNES, SPC700, MSP430, Xtensa,
NIOS II, Java, Dalvik, WebAssembly, MSIL, EBC, TMS320 (c54x, c55x,
c55+, c64x), Hexagon, Brainfuck, Malbolge, whitespace, DCPU16, LANAI,
MCORE, mcs96, RSP, SuperH-4, VAX, KVX, Am29000, LOONGARCH.
MCORE, mcs96, RSP, SuperH-4, VAX, KVX, Am29000, LOONGARCH, JDH8.
## File Formats

View File

@ -5,6 +5,7 @@ anal.evm_cs
anal.arm_cs
anal.arm_v35
anal.arm_gnu
anal.jdh8
anal.avr
anal.i4004
anal.bf
@ -119,7 +120,6 @@ asm.alpha
asm.mcs96
asm.pic
asm.pyc
asm.jdh8
bin.any
bin.tic
bin.wasm

32
libr/anal/p/anal_jdh8.c Normal file
View File

@ -0,0 +1,32 @@
/* radare - LGPL3 - Copyright 2021-2022 - condret, slowhand99 */
#include <r_anal.h>
#include <r_lib.h>
#include "../../asm/arch/jdh8/jdh8dis.c"
static int jdh8_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *buf, int len, RAnalOpMask mask) {
int dlen = 0;
char *o = jdh8Disass (buf, len, &dlen);
op->mnemonic = strdup (o);
op->size = R_MAX (0, dlen);
// honor DISASM, add esil and more
return dlen;
}
RAnalPlugin r_anal_plugin_jdh8 = {
.name = "jdh8",
.desc = "jdh-8 toy architecture",
.license = "LGPL3",
.arch = "jdh8",
.bits = 16,
.endian = R_SYS_ENDIAN_LITTLE,
.op = &jdh8_op,
};
#ifndef R2_PLUGIN_INCORE
R_API RLibStruct radare_plugin = {
.type = R_LIB_TYPE_ANAL,
.data = &r_anal_plugin_jdh8,
.version = R2_VERSION
};
#endif

9
libr/anal/p/jdh8.mk Normal file
View File

@ -0,0 +1,9 @@
OBJ_JDH8=anal_jdh8.o
STATIC_OBJ+=${OBJ_JDH8}
TARGET_JDH8=anal_jdh8.${EXT_SO}
ALL_TARGETS+=${TARGET_JDH8}
${TARGET_JDH8}: ${OBJ_JDH8}
${CC} $(call libname,anal_jdh8) ${LDFLAGS} ${CFLAGS} -o anal_jdh8.${EXT_SO} ${OBJ_JDH8}

View File

@ -1,8 +1,6 @@
/* radare - LGPL3 - Copyright 2021 - condret, slowhand99 */
/* radare - LGPL3 - Copyright 2021-2022 - condret, slowhand99 */
#include <r_types.h>
#include <r_util.h>
#include <r_asm.h>
static const int jdh_len[16] = {
2, 3, 3, 1, 1, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2
@ -15,128 +13,130 @@ static int jdh_get_ins_len(ut8 hex) {
int ret = jdh_len[high];
if (ret == 3) {
ret = (hex & 8) ? 2 : 3;
}
else if (ret == 1) {
} else if (ret == 1) {
ret = (hex & 8) ? 1 : 2;
}
return ret;
}
static int jdh8Disass(RAsmOp *op, const ut8 *buf, int len) {
static char *jdh8Disass(const ut8 *buf, int len, int *dlen) {
char *dis = NULL;
int ilen = jdh_get_ins_len (*buf);
const ut8 high = (*buf & 0xf0) >> 4;
const ut8 low = (*buf & 0xf);
if (ilen > len) {
return op->size = 0;
}
switch (high) {
ilen = 0;
} else switch (high) {
case 0:
if (low & 8) {
r_strbuf_setf (&op->buf_asm, "mw %c, %c", reg[low & 7], reg[buf[1]]);
dis = r_str_newf ("mw %c, %c", reg[low & 7], reg[buf[1]]);
} else {
r_strbuf_setf (&op->buf_asm, "mw %c, 0x%02x", reg[low & 7], buf[1]);
dis = r_str_newf ("mw %c, 0x%02x", reg[low & 7], buf[1]);
}
break;
case 1:
if (ilen == 2) {
r_strbuf_setf (&op->buf_asm, "lw %c, %c", reg[low & 7], reg[buf[1]]);
dis = r_str_newf ("lw %c, %c", reg[low & 7], reg[buf[1]]);
} else {
r_strbuf_setf (&op->buf_asm, "lw %c, 0x%02x", reg[low & 7], buf[1]);
dis = r_str_newf ("lw %c, 0x%02x", reg[low & 7], buf[1]);
}
break;
case 2:
if (ilen == 2) {
r_strbuf_setf (&op->buf_asm, "sw %c, %c", reg[low & 7], reg[buf[1]]);
dis = r_str_newf ("sw %c, %c", reg[low & 7], reg[buf[1]]);
} else {
r_strbuf_setf (&op->buf_asm, "sw 0x%04x, %c", ((ut16)(buf[1] << 8) | buf[2]), reg[low & 7]);
dis = r_str_newf ("sw 0x%04x, %c", ((ut16)(buf[1] << 8) | buf[2]), reg[low & 7]);
}
break;
case 3:
if (ilen == 1) {
r_strbuf_setf (&op->buf_asm, "push %c", reg[low & 7]);
dis = r_str_newf ("push %c", reg[low & 7]);
} else {
r_strbuf_setf (&op->buf_asm, "push 0x%02x", buf[1]);
dis = r_str_newf ("push 0x%02x", buf[1]);
}
break;
case 4:
r_strbuf_setf (&op->buf_asm, "pop %c", reg[low & 7]);
dis = r_str_newf ("pop %c", reg[low & 7]);
break;
case 5:
r_strbuf_setf (&op->buf_asm, "lda 0x%03x", ((ut16)(buf[1] << 8) | buf[2]));
dis = r_str_newf ("lda 0x%03x", ((ut16)(buf[1] << 8) | buf[2]));
break;
case 6:
if (ilen == 1) {
r_strbuf_setf (&op->buf_asm, "jnz %c", reg[low & 7]);
dis = r_str_newf ("jnz %c", reg[low & 7]);
} else {
r_strbuf_setf (&op->buf_asm, "jnz 0x%02x", buf[1]);
dis = r_str_newf ("jnz 0x%02x", buf[1]);
}
break;
case 7:
if (low & 8) {
r_strbuf_setf (&op->buf_asm, "inb %c, %c", reg[low & 7], reg[buf[1]]);
dis = r_str_newf ("inb %c, %c", reg[low & 7], reg[buf[1]]);
} else {
r_strbuf_setf (&op->buf_asm, "inb %c, 0x%02x", reg[low & 7], buf[1]);
dis = r_str_newf ("inb %c, 0x%02x", reg[low & 7], buf[1]);
}
break;
case 8:
if (low & 8) {
r_strbuf_setf (&op->buf_asm, "outb %c, %c", reg[low & 7], reg[buf[1]]);
dis = r_str_newf ("outb %c, %c", reg[low & 7], reg[buf[1]]);
} else {
r_strbuf_setf (&op->buf_asm, "outb %c, 0x%02x", reg[low & 7], buf[1]);
dis = r_str_newf ("outb %c, 0x%02x", reg[low & 7], buf[1]);
}
break;
case 9:
if (low & 8) {
r_strbuf_setf (&op->buf_asm, "add %c, %c", reg[low & 7], reg[buf[1]]);
dis = r_str_newf ("add %c, %c", reg[low & 7], reg[buf[1]]);
} else {
r_strbuf_setf (&op->buf_asm, "add %c, 0x%02x", reg[low & 7], buf[1]);
dis = r_str_newf ("add %c, 0x%02x", reg[low & 7], buf[1]);
}
break;
case 10:
if (low & 8) {
r_strbuf_setf (&op->buf_asm, "adc %c, %c", reg[low & 7], reg[buf[1]]);
dis = r_str_newf ("adc %c, %c", reg[low & 7], reg[buf[1]]);
} else {
r_strbuf_setf (&op->buf_asm, "adc %c, 0x%02x", reg[low & 7], buf[1]);
dis = r_str_newf ("adc %c, 0x%02x", reg[low & 7], buf[1]);
}
break;
case 11:
if (low & 8) {
r_strbuf_setf (&op->buf_asm, "and %c, %c", reg[low & 7], reg[buf[1]]);
dis = r_str_newf ("and %c, %c", reg[low & 7], reg[buf[1]]);
} else {
r_strbuf_setf (&op->buf_asm, "and %c, 0x%02x", reg[low & 7], buf[1]);
dis = r_str_newf ("and %c, 0x%02x", reg[low & 7], buf[1]);
}
break;
case 12:
if (low & 8) {
r_strbuf_setf (&op->buf_asm, "or %c, %c", reg[low & 7], reg[buf[1]]);
dis = r_str_newf ("or %c, %c", reg[low & 7], reg[buf[1]]);
} else {
r_strbuf_setf (&op->buf_asm, "or %c, 0x%02x", reg[low & 7], buf[1]);
dis = r_str_newf ("or %c, 0x%02x", reg[low & 7], buf[1]);
}
break;
case 13:
if (low & 8) {
r_strbuf_setf (&op->buf_asm, "nor %c, %c", reg[low & 7], reg[buf[1]]);
dis = r_str_newf ("nor %c, %c", reg[low & 7], reg[buf[1]]);
} else {
r_strbuf_setf (&op->buf_asm, "nor %c, 0x%02x", reg[low & 7], buf[1]);
dis = r_str_newf ("nor %c, 0x%02x", reg[low & 7], buf[1]);
}
break;
case 14:
if (low & 8) {
r_strbuf_setf (&op->buf_asm, "cmp %c, %c", reg[low & 7], reg[buf[1]]);
dis = r_str_newf ("cmp %c, %c", reg[low & 7], reg[buf[1]]);
} else {
r_strbuf_setf (&op->buf_asm, "cmp %c, 0x%02x", reg[low & 7], buf[1]);
dis = r_str_newf ("cmp %c, 0x%02x", reg[low & 7], buf[1]);
}
break;
case 15:
if (low & 8) {
r_strbuf_setf (&op->buf_asm, "sbb %c, %c", reg[low & 7], reg[buf[1]]);
dis = r_str_newf ("sbb %c, %c", reg[low & 7], reg[buf[1]]);
} else {
r_strbuf_setf (&op->buf_asm, "sbb %c, 0x%02x", reg[low & 7], buf[1]);
dis = r_str_newf ("sbb %c, 0x%02x", reg[low & 7], buf[1]);
}
break;
default:
r_strbuf_set (&op->buf_asm, "invalid");
dis = strdup ("invalid");
break;
}
return op->size = ilen;
if (dlen) {
*dlen = len;
}
return dis;
}

View File

@ -1,31 +0,0 @@
/* radare - LGPL3 - Copyright 2021 - condret, slowhand99 */
#include <r_types.h>
#include <r_util.h>
#include <r_asm.h>
#include <r_lib.h>
#include "../arch/jdh8/jdh8dis.c"
static int disassemble(RAsm *a, RAsmOp *r_op, const ut8 *buf, int len) {
int dlen = jdh8Disass(r_op, buf, len);
return r_op->size = R_MAX (0, dlen);
}
RAsmPlugin r_asm_plugin_jdh8 = {
.name = "jdh8",
.desc = "jdh-8 toy architecture",
.arch = "jdh-8",
.author = "condret, slowhand99",
.license = "LGPL3",
.bits = 16,
.endian = R_SYS_ENDIAN_LITTLE,
.disassemble = &disassemble,
};
#ifndef R2_PLUGIN_INCORE
R_API RLibStruct radare_plugin = {
.type = R_LIB_TYPE_ASM,
.data = &r_asm_plugin_jdh8,
.version = R2_VERSION
};
#endif

View File

@ -1,11 +0,0 @@
OBJ_JDH8=asm_jdh8.o
STATIC_OBJ+=${OBJ_JDH8}
TARGET_JDH8=asm_jdh8.${EXT_SO}
ifeq ($(WITHPIC),1)
ALL_TARGETS+=${TARGET_JDH8}
${TARGET_JDH8}: ${OBJ_JDH8}
${CC} ${call libname,asm_jdh8} ${CFLAGS} $(LDFLAGS) -o ${TARGET_JDH8} ${OBJ_JDH8}
endif

View File

@ -2241,6 +2241,7 @@ extern RAnalPlugin r_anal_plugin_mcore;
extern RAnalPlugin r_anal_plugin_mips_cs;
extern RAnalPlugin r_anal_plugin_mips_gnu;
extern RAnalPlugin r_anal_plugin_loongarch_gnu;
extern RAnalPlugin r_anal_plugin_jdh8;
extern RAnalPlugin r_anal_plugin_msp430;
extern RAnalPlugin r_anal_plugin_nios2;
extern RAnalPlugin r_anal_plugin_or1k;

View File

@ -249,8 +249,6 @@ extern RAsmPlugin r_asm_plugin_pyc;
extern RAsmPlugin r_asm_plugin_pdp11_gnu;
extern RAsmPlugin r_asm_plugin_alpha;
extern RAsmPlugin r_asm_plugin_vasm;
extern RAsmPlugin r_asm_plugin_jdh8;
extern RAsmPlugin r_asm_plugin_loongarch_gnu;
#endif