Mercurial > repos > blastem
changeset 2213:53411df7fc71
More 68K disassembler refactoring and fix Windows build failure
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 29 Aug 2022 21:58:37 -0700 |
parents | 71b0cb7c34a6 |
children | 7591c67b8d1e |
files | 68kinst.c 68kinst.h Makefile dis.c disasm.c disasm.h |
diffstat | 6 files changed, 23 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/68kinst.c Sun Aug 28 22:49:26 2022 -0700 +++ b/68kinst.c Mon Aug 29 21:58:37 2022 -0700 @@ -4,6 +4,7 @@ BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text. */ #include "68kinst.h" +#include "disasm.h" #include <string.h> #include <stdio.h> @@ -2590,12 +2591,7 @@ } } -int m68k_default_label_fun(char * dst, uint32_t address, void * data) -{ - return sprintf(dst, "ADR_%X", address); -} - -int m68k_disasm_ex(m68kinst * decoded, char * dst, uint8_t labels, format_label_fun label_fun, void * data) +int m68k_disasm_ex(m68kinst * decoded, char * dst, uint8_t labels, format_label_fun label_fun, disasm_context *data) { int ret,op1len; uint8_t size; @@ -2707,11 +2703,7 @@ return m68k_disasm_ex(decoded, dst, 0, NULL, NULL); } -int m68k_disasm_labels(m68kinst * decoded, char * dst, format_label_fun label_fun, void * data) +int m68k_disasm_labels(m68kinst * decoded, char * dst, disasm_context *disasm) { - if (!label_fun) - { - label_fun = m68k_default_label_fun; - } - return m68k_disasm_ex(decoded, dst, 1, label_fun, data); + return m68k_disasm_ex(decoded, dst, 1, format_label, disasm); }
--- a/68kinst.h Sun Aug 28 22:49:26 2022 -0700 +++ b/68kinst.h Mon Aug 29 21:58:37 2022 -0700 @@ -7,6 +7,7 @@ #define M68KINST_H_ #include <stdint.h> +#include "disasm.h" #ifdef M68030 #define M68020 @@ -333,7 +334,6 @@ VECTOR_USER0 = 64 } m68k_vector; -typedef int (*format_label_fun)(char * dst, uint32_t address, void * data); typedef uint16_t (*m68k_fetch_fun)(uint32_t address, void *data); uint32_t m68k_decode(m68k_fetch_fun fetch, void *data, m68kinst * dst, uint32_t address); @@ -341,8 +341,7 @@ uint8_t m68k_is_branch(m68kinst * inst); uint8_t m68k_is_noncall_branch(m68kinst * inst); int m68k_disasm(m68kinst * decoded, char * dst); -int m68k_disasm_labels(m68kinst * decoded, char * dst, format_label_fun label_fun, void * data); -int m68k_default_label_fun(char * dst, uint32_t address, void * data); +int m68k_disasm_labels(m68kinst * decoded, char * dst, disasm_context *disasm); #endif
--- a/Makefile Sun Aug 28 22:49:26 2022 -0700 +++ b/Makefile Mon Aug 29 21:58:37 2022 -0700 @@ -178,7 +178,7 @@ endif TRANSOBJS=gen.o backend.o $(MEM) arena.o tern.o -M68KOBJS=68kinst.o +M68KOBJS=68kinst.o disasm.o ifdef NEW_CORE Z80OBJS=z80.o z80inst.o
--- a/dis.c Sun Aug 28 22:49:26 2022 -0700 +++ b/dis.c Mon Aug 29 21:58:37 2022 -0700 @@ -33,16 +33,6 @@ } } -int label_fun(char *dst, uint32_t address, void * data) -{ - disasm_context *context = data; - label_def *def = find_label(context, address); - if (def && def->num_labels) { - return sprintf(dst, "%s", def->labels[0]); - } - return m68k_default_label_fun(dst, address, NULL); -} - typedef struct { uint32_t address_off; uint32_t address_end; @@ -419,7 +409,7 @@ if (is_visited(context, address)) { m68k_decode(fetch, &rom, &instbuf, address); if (labels) { - m68k_disasm_labels(&instbuf, disbuf, label_fun, context); + m68k_disasm_labels(&instbuf, disbuf, context); label_def *label = find_label(context, address); if (label) { if (label->num_labels) {
--- a/disasm.c Sun Aug 28 22:49:26 2022 -0700 +++ b/disasm.c Mon Aug 29 21:58:37 2022 -0700 @@ -1,4 +1,7 @@ #include "disasm.h" +#include <stdlib.h> +#include <string.h> +#include <stddef.h> label_def *find_label(disasm_context *context, uint32_t address) { @@ -7,6 +10,15 @@ return tern_find_ptr(context->labels, key); } +int format_label(char *dst, uint32_t address, disasm_context *context) +{ + label_def *def = find_label(context, address); + if (def && def->num_labels) { + return sprintf(dst, "%s", def->labels[0]); + } + return sprintf(dst, "ADR_%X", address); +} + label_def *add_find_label(disasm_context *context, uint32_t address) { char key[MAX_INT_KEY_SIZE];
--- a/disasm.h Sun Aug 28 22:49:26 2022 -0700 +++ b/disasm.h Mon Aug 29 21:58:37 2022 -0700 @@ -22,7 +22,10 @@ uint32_t visit_preshift; } disasm_context; +typedef int (*format_label_fun)(char * dst, uint32_t address, disasm_context * context); + label_def *find_label(disasm_context *context, uint32_t address); +int format_label(char *dst, uint32_t address, disasm_context *context); void weak_label(disasm_context *context, const char *name, uint32_t address); void reference(disasm_context *context, uint32_t address); void add_label(disasm_context *context, const char *name, uint32_t address);