annotate jagdis.c @ 1483:001120e91fed nuklear_ui

Skip loading menu ROM if Nuklear UI is enabled. Allow disabling Nuklear UI in favor of old menu ROM both at compile time and in config. Fall back to ROM UI if GL is unavailable
author Michael Pavone <pavone@retrodev.com>
date Sat, 25 Nov 2017 20:43:20 -0800
parents 4987fddd42a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1093
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 /*
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 Copyright 2013 Michael Pavone
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 This file is part of BlastEm.
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text.
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 */
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #include <stdio.h>
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 #include <stdlib.h>
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 #include <string.h>
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9 #include <stdarg.h>
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10 #include <ctype.h>
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11 #include "tern.h"
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12 #include "util.h"
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 #include "jagcpu.h"
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15 uint8_t visited[(16*1024*1024)/16];
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 uint16_t label[(16*1024*1024)/8];
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 void fatal_error(char *format, ...)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 va_list args;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 va_start(args, format);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 vfprintf(stderr, format, args);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23 va_end(args);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 exit(1);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 void visit(uint32_t address)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 address &= 0xFFFFFF;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 visited[address/16] |= 1 << ((address / 2) % 8);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
34 void reference(uint32_t address)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36 address &= 0xFFFFFF;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 //printf("referenced: %X\n", address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 label[address/16] |= 1 << (address % 16);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
40
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
41 uint8_t is_visited(uint32_t address)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
42 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
43 address &= 0xFFFFFF;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
44 return visited[address/16] & (1 << ((address / 2) % 8));
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
45 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
47 uint16_t is_label(uint32_t address)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 address &= 0xFFFFFF;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50 return label[address/16] & (1 << (address % 16));
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53 typedef struct {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54 uint32_t num_labels;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55 uint32_t storage;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56 char *labels[];
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57 } label_names;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59 tern_node * add_label(tern_node * head, char * name, uint32_t address)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 char key[MAX_INT_KEY_SIZE];
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 address &= 0xFFFFFF;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63 reference(address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 tern_int_key(address, key);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 label_names * names = tern_find_ptr(head, key);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 if (names)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 if (names->num_labels == names->storage)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70 names->storage = names->storage + (names->storage >> 1);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 names = realloc(names, sizeof(label_names) + names->storage * sizeof(char *));
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 } else {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 names = malloc(sizeof(label_names) + 4 * sizeof(char *));
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 names->num_labels = 0;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 names->storage = 4;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77 head = tern_insert_ptr(head, key, names);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79 names->labels[names->num_labels++] = strdup(name);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 return head;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83 typedef struct deferred {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84 uint32_t address;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85 struct deferred *next;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 } deferred;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
88 deferred * defer(uint32_t address, deferred * next)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
89 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
90 if (is_visited(address) || address & 1) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
91 return next;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
92 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93 //printf("deferring %X\n", address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
94 deferred * d = malloc(sizeof(deferred));
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
95 d->address = address;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96 d->next = next;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97 return d;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 void check_reference(uint16_t inst, uint32_t address, uint8_t is_gpu)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 if (jag_opcode(inst, is_gpu) == JAG_JR) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103 reference(jag_jr_dest(inst, address));
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
107 char * strip_ws(char * text)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
108 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
109 while (*text && (!isprint(*text) || isblank(*text)))
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
110 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
111 text++;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
112 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
113 char * ret = text;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
114 text = ret + strlen(ret) - 1;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
115 while (text > ret && (!isprint(*text) || isblank(*text)))
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
116 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
117 *text = 0;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
118 text--;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
119 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
120 return ret;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
121 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
122
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
123 int main(int argc, char ** argv)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
124 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
125 long filesize;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
126 unsigned short *filebuf;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
127 char disbuf[1024];
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
128 unsigned short * cur;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
129 deferred *def = NULL, *tmpd;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
130 uint32_t start = 0xFFFFFFFF;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
131
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
132 uint8_t labels = 0, addr = 0, only = 0, vos = 0, reset = 0;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
133 tern_node * named_labels = NULL;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
134
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
135 uint32_t address_off = 0xFFFFFFFF, address_end;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
136 uint8_t is_gpu = 1;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
137 for(uint8_t opt = 2; opt < argc; ++opt) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
138 if (argv[opt][0] == '-') {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
139 FILE * address_log;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
140 switch (argv[opt][1])
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
141 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
142 case 'l':
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
143 labels = 1;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
144 break;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
145 case 'a':
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
146 addr = 1;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147 break;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
148 case 'o':
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
149 only = 1;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
150 break;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
151 case 'r':
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
152 reset = 1;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
153 break;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
154 case 's':
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
155 opt++;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
156 if (opt >= argc) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
157 fputs("-s must be followed by an offset\n", stderr);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
158 exit(1);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
159 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
160 address_off = strtol(argv[opt], NULL, 0);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
161 break;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
162 case 'p':
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
163 opt++;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
164 if (opt >= argc) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
165 fputs("-p must be followed by a starting PC value\n", stderr);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166 exit(1);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
167 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
168 start = strtol(argv[opt], NULL, 0);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
169 break;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
170 case 'd':
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
171 is_gpu = 0;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172 break;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173 case 'f':
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174 opt++;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
175 if (opt >= argc) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
176 fputs("-f must be followed by a filename\n", stderr);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
177 exit(1);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
178 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
179 address_log = fopen(argv[opt], "r");
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
180 if (!address_log) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
181 fprintf(stderr, "Failed to open %s for reading\n", argv[opt]);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
182 exit(1);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
183 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
184 while (fgets(disbuf, sizeof(disbuf), address_log)) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
185 if (disbuf[0]) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
186 char *end;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
187 uint32_t address = strtol(disbuf, &end, 16);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
188 if (address) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
189 def = defer(address, def);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
190 reference(address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
191 if (*end == '=') {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
192 named_labels = add_label(named_labels, strip_ws(end+1), address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
193 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
194 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
195 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
196 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
197 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
198 } else {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
199 char *end;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
200 uint32_t address = strtol(argv[opt], &end, 16);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
201 def = defer(address, def);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
202 reference(address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
203 if (*end == '=') {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
204 named_labels = add_label(named_labels, end+1, address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
205 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
206 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
207 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
208 if (address_off == 0xFFFFFFFF) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
209 address_off = is_gpu ? 0xF03000 : 0xF1B000;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
210 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
211 if (start == 0xFFFFFFFF) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
212 start = address_off;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
213 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
214 FILE * f = fopen(argv[1], "rb");
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
215 fseek(f, 0, SEEK_END);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
216 filesize = ftell(f);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
217 fseek(f, 0, SEEK_SET);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
218
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
219 char int_key[MAX_INT_KEY_SIZE];
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
220 address_end = address_off + filesize;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
221 filebuf = malloc(filesize);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
222 if (fread(filebuf, 2, filesize/2, f) != filesize/2)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
223 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
224 fprintf(stderr, "Failure while reading file %s\n", argv[1]);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
225 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
226 fclose(f);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
227 for(cur = filebuf; cur - filebuf < (filesize/2); ++cur)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
228 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
229 *cur = (*cur >> 8) | (*cur << 8);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
230 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
231 named_labels = add_label(named_labels, "start", start);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
232 if (!def || !only) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
233 def = defer(start, def);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
234 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
235
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
236 uint16_t *encoded, *next;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
237 uint32_t size, tmp_addr;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
238 uint32_t address;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
239 while(def) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
240 do {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
241 encoded = NULL;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
242 address = def->address;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
243 if (!is_visited(address)) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
244 encoded = filebuf + (address - address_off)/2;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
245 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
246 tmpd = def;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
247 def = def->next;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
248 free(tmpd);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
249 } while(def && encoded == NULL);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
250 if (!encoded) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
251 break;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
252 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
253 for(;;) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
254 if (address > address_end || address < address_off) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
255 break;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
256 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
257 visit(address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
258 uint16_t inst = *encoded;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
259 uint32_t inst_address = address;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
260 check_reference(inst, address, is_gpu);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
261 uint16_t opcode = jag_opcode(inst, is_gpu);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
262 if (opcode == JAG_MOVEI) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
263 address += 6;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
264 encoded += 3;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
265 } else {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
266 address += 2;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
267 encoded++;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
268 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
269
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
270
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
271 if (opcode == JAG_JR || opcode == JAG_JUMP) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
272 if (!(jag_reg2(inst) & 0xF)) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
273 //unconditional jump
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
274 if (opcode == JAG_JR) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
275 address = jag_jr_dest(inst, inst_address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
276 reference(address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
277 if (is_visited(address)) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
278 break;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
279 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
280 } else {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
281 break;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
282 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
283 } else if (opcode == JAG_JR) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
284 uint32_t dest = jag_jr_dest(inst, inst_address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
285 reference(dest);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
286 def = defer(dest, def);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
287 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
288 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
289 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
290 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
291 if (labels) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
292 for (address = 0; address < address_off; address++) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
293 if (is_label(address)) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
294 printf("ADR_%X equ $%X\n", address, address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
295 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
296 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
297 for (address = filesize; address < (16*1024*1024); address++) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
298 char key[MAX_INT_KEY_SIZE];
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
299 tern_int_key(address, key);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
300 label_names *names = tern_find_ptr(named_labels, key);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
301 if (names) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
302 for (int i = 0; i < names->num_labels; i++)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
303 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
304 printf("%s equ $%X\n", names->labels[i], address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
305 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
306 } else if (is_label(address)) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
307 printf("ADR_%X equ $%X\n", address, address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
308 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
309 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
310 puts("");
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
311 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
312 for (address = address_off; address < address_end; address+=2) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
313 if (is_visited(address)) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
314 encoded = filebuf + (address-address_off)/2;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
315 jag_cpu_disasm(&encoded, address, disbuf, is_gpu, labels);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
316 if (labels) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
317 char keybuf[MAX_INT_KEY_SIZE];
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
318 label_names * names = tern_find_ptr(named_labels, tern_int_key(address, keybuf));
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
319 if (names)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
320 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
321 for (int i = 0; i < names->num_labels; i++)
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
322 {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
323 printf("%s:\n", names->labels[i]);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
324 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
325 } else if (is_label(address)) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
326 printf("ADR_%X:\n", address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
327 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
328 if (addr) {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
329 printf("\t%s\t;%X\n", disbuf, address);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
330 } else {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
331 printf("\t%s\n", disbuf);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
332 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
333 } else {
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
334 printf("%X: %s\n", address, disbuf);
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
335 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
336 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
337 }
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
338 return 0;
4987fddd42a0 Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
339 }