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);