# HG changeset patch # User Michael Pavone # Date 1661835517 25200 # Node ID 53411df7fc713d510197ffb324ea47a411de3a90 # Parent 71b0cb7c34a69b4b112aee9a9f3c3dcbdf34c76d More 68K disassembler refactoring and fix Windows build failure diff -r 71b0cb7c34a6 -r 53411df7fc71 68kinst.c --- 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 #include @@ -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); } diff -r 71b0cb7c34a6 -r 53411df7fc71 68kinst.h --- 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 +#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 diff -r 71b0cb7c34a6 -r 53411df7fc71 Makefile --- 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 diff -r 71b0cb7c34a6 -r 53411df7fc71 dis.c --- 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) { diff -r 71b0cb7c34a6 -r 53411df7fc71 disasm.c --- 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 +#include +#include 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]; diff -r 71b0cb7c34a6 -r 53411df7fc71 disasm.h --- 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);