diff lwdisasm/do_raw.c @ 409:cba03436c720

Checkpoint disassembler
author lost@l-w.ca
date Mon, 02 Aug 2010 18:07:04 -0600
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lwdisasm/do_raw.c	Mon Aug 02 18:07:04 2010 -0600
@@ -0,0 +1,74 @@
+/*
+do_raw.c
+
+Copyright © 2010 William Astle
+
+This file is part of LWTOOLS.
+
+LWTOOLS is free software: you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation, either version 3 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+more details.
+
+You should have received a copy of the GNU General Public License along with
+this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "lwdisasm.h"
+
+void do_disasm_raw(disasmstate_t *as)
+{
+	linedata_t *l;
+	symbol_t *s;
+	char bytebuf[11];
+	int i;
+	
+	// initialize disassembly
+	as -> curoff = as -> entry;
+	as -> crange = lookup_range(as, as -> curoff);
+	
+	
+	while (l = disasm_insn(as))
+	{
+		if (!as -> ltail)
+			as -> lhead = l;
+		else
+			as -> ltail -> next = l;
+		l -> prev = as -> ltail;
+		as -> ltail = l;
+		
+		if (l -> target != -1)
+		{
+			s = register_symbol(as, l -> target, l -> sectionref, NULL);
+			l -> symbol = s;
+		}
+	}
+
+	attach_symbols(as);
+
+	for (l = as -> lhead; l; l = l -> next)
+	{
+		if (l -> target != -1)
+			redisasm_insn(as, l);
+	}
+
+	for (l = as -> lhead; l; l = l -> next)
+	{
+		bytebuf[0] = 0;
+		for (i = 0; i < l -> length; i++)
+		{
+			sprintf(bytebuf, "%s%02X", bytebuf, l -> bytes[i]);
+		}
+		printf("%04X %-10s %-15s %s\n", l -> address, bytebuf, l -> isref ? l -> symbol -> symbol : "", l -> disasm);	
+	}
+}