annotate dis.c @ 2146:0c0d4233d826

Fix SP end address in disassembler
author Michael Pavone <pavone@retrodev.com>
date Sat, 26 Mar 2022 20:10:21 -0700
parents 7451f970ee66
children 4c265d2f6c88
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
467
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 197
diff changeset
1 /*
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 197
diff changeset
2 Copyright 2013 Michael Pavone
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
3 This file is part of BlastEm.
467
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 197
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.
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 197
diff changeset
5 */
2
5df303bf72e6 Improve 68K instruction decoding. Add simple disassembler.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #include "68kinst.h"
5df303bf72e6 Improve 68K instruction decoding. Add simple disassembler.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
7 #include <stdio.h>
5df303bf72e6 Improve 68K instruction decoding. Add simple disassembler.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
8 #include <stdlib.h>
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
9 #include <string.h>
805
3eced113081c Pre-release cleanup
Michael Pavone <pavone@retrodev.com>
parents: 704
diff changeset
10 #include <stdarg.h>
947
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
11 #include <ctype.h>
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
12 #include "vos_program_module.h"
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
13 #include "tern.h"
947
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
14 #include "util.h"
2
5df303bf72e6 Improve 68K instruction decoding. Add simple disassembler.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
15
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
16 uint8_t visited[(16*1024*1024)/16];
635
6992a1b07714 Fix logic for automatic label generation.
Michael Pavone <pavone@retrodev.com>
parents: 634
diff changeset
17 uint16_t label[(16*1024*1024)/8];
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
18
805
3eced113081c Pre-release cleanup
Michael Pavone <pavone@retrodev.com>
parents: 704
diff changeset
19 void fatal_error(char *format, ...)
3eced113081c Pre-release cleanup
Michael Pavone <pavone@retrodev.com>
parents: 704
diff changeset
20 {
3eced113081c Pre-release cleanup
Michael Pavone <pavone@retrodev.com>
parents: 704
diff changeset
21 va_list args;
3eced113081c Pre-release cleanup
Michael Pavone <pavone@retrodev.com>
parents: 704
diff changeset
22 va_start(args, format);
3eced113081c Pre-release cleanup
Michael Pavone <pavone@retrodev.com>
parents: 704
diff changeset
23 vfprintf(stderr, format, args);
3eced113081c Pre-release cleanup
Michael Pavone <pavone@retrodev.com>
parents: 704
diff changeset
24 va_end(args);
3eced113081c Pre-release cleanup
Michael Pavone <pavone@retrodev.com>
parents: 704
diff changeset
25 exit(1);
3eced113081c Pre-release cleanup
Michael Pavone <pavone@retrodev.com>
parents: 704
diff changeset
26 }
3eced113081c Pre-release cleanup
Michael Pavone <pavone@retrodev.com>
parents: 704
diff changeset
27
3eced113081c Pre-release cleanup
Michael Pavone <pavone@retrodev.com>
parents: 704
diff changeset
28
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
29 void visit(uint32_t address)
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
30 {
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
31 address &= 0xFFFFFF;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
32 visited[address/16] |= 1 << ((address / 2) % 8);
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
33 }
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
34
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
35 void reference(uint32_t address)
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
36 {
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
37 address &= 0xFFFFFF;
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
38 //printf("referenced: %X\n", address);
635
6992a1b07714 Fix logic for automatic label generation.
Michael Pavone <pavone@retrodev.com>
parents: 634
diff changeset
39 label[address/16] |= 1 << (address % 16);
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
40 }
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
41
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
42 uint8_t is_visited(uint32_t address)
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
43 {
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
44 address &= 0xFFFFFF;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
45 return visited[address/16] & (1 << ((address / 2) % 8));
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
46 }
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
47
635
6992a1b07714 Fix logic for automatic label generation.
Michael Pavone <pavone@retrodev.com>
parents: 634
diff changeset
48 uint16_t is_label(uint32_t address)
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
49 {
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
50 address &= 0xFFFFFF;
635
6992a1b07714 Fix logic for automatic label generation.
Michael Pavone <pavone@retrodev.com>
parents: 634
diff changeset
51 return label[address/16] & (1 << (address % 16));
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
52 }
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
53
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
54 typedef struct {
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
55 uint32_t num_labels;
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
56 uint32_t storage;
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
57 uint32_t full_address;
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
58 char *labels[];
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
59 } label_names;
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
60
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
61 tern_node * weak_label(tern_node * head, const char *name, uint32_t address)
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
62 {
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
63 char key[MAX_INT_KEY_SIZE];
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
64 tern_int_key(address & 0xFFFFFF, key);
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
65 label_names * names = tern_find_ptr(head, key);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
66 if (names)
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
67 {
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
68 if (names->num_labels == names->storage)
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
69 {
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
70 names->storage = names->storage + (names->storage >> 1);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
71 names = realloc(names, sizeof(label_names) + names->storage * sizeof(char *));
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
72 }
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
73 } else {
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
74 names = malloc(sizeof(label_names) + 4 * sizeof(char *));
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
75 names->num_labels = 0;
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
76 names->storage = 4;
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
77 head = tern_insert_ptr(head, key, names);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
78 }
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
79 names->labels[names->num_labels++] = strdup(name);
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
80 names->full_address = address;
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
81 return head;
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
82 }
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
83 tern_node *add_label(tern_node * head, const char *name, uint32_t address)
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
84 {
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
85 reference(address);
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
86 return weak_label(head, name, address);
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
87 }
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
88
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
89 typedef struct deferred {
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
90 uint32_t address;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
91 struct deferred *next;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
92 } deferred;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
93
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
94 deferred * defer(uint32_t address, deferred * next)
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
95 {
639
e263e1ac6038 Ignore odd addresses in calls to defer in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 635
diff changeset
96 if (is_visited(address) || address & 1) {
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
97 return next;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
98 }
111
8b50d2c975b2 Fix decoding of Scc
Mike Pavone <pavone@retrodev.com>
parents: 103
diff changeset
99 //printf("deferring %X\n", address);
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
100 deferred * d = malloc(sizeof(deferred));
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
101 d->address = address;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
102 d->next = next;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
103 return d;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
104 }
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
105
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
106 void check_reference(m68kinst * inst, m68k_op_info * op)
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
107 {
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
108 switch(op->addr_mode)
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
109 {
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
110 case MODE_PC_DISPLACE:
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
111 reference(inst->address + 2 + op->params.regs.displacement);
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
112 break;
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
113 case MODE_ABSOLUTE:
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
114 case MODE_ABSOLUTE_SHORT:
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
115 reference(op->params.immed);
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
116 break;
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
117 }
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
118 }
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
119
634
4a6ec64acd79 Better support for labels sourced from VOS program module header
Michael Pavone <pavone@retrodev.com>
parents: 633
diff changeset
120 int label_fun(char *dst, uint32_t address, void * data)
4a6ec64acd79 Better support for labels sourced from VOS program module header
Michael Pavone <pavone@retrodev.com>
parents: 633
diff changeset
121 {
4a6ec64acd79 Better support for labels sourced from VOS program module header
Michael Pavone <pavone@retrodev.com>
parents: 633
diff changeset
122 tern_node * labels = data;
4a6ec64acd79 Better support for labels sourced from VOS program module header
Michael Pavone <pavone@retrodev.com>
parents: 633
diff changeset
123 char key[MAX_INT_KEY_SIZE];
4a6ec64acd79 Better support for labels sourced from VOS program module header
Michael Pavone <pavone@retrodev.com>
parents: 633
diff changeset
124 label_names * names = tern_find_ptr(labels, tern_int_key(address & 0xFFFFFF, key));
4a6ec64acd79 Better support for labels sourced from VOS program module header
Michael Pavone <pavone@retrodev.com>
parents: 633
diff changeset
125 if (names)
4a6ec64acd79 Better support for labels sourced from VOS program module header
Michael Pavone <pavone@retrodev.com>
parents: 633
diff changeset
126 {
4a6ec64acd79 Better support for labels sourced from VOS program module header
Michael Pavone <pavone@retrodev.com>
parents: 633
diff changeset
127 return sprintf(dst, "%s", names->labels[0]);
4a6ec64acd79 Better support for labels sourced from VOS program module header
Michael Pavone <pavone@retrodev.com>
parents: 633
diff changeset
128 } else {
4a6ec64acd79 Better support for labels sourced from VOS program module header
Michael Pavone <pavone@retrodev.com>
parents: 633
diff changeset
129 return m68k_default_label_fun(dst, address, NULL);
4a6ec64acd79 Better support for labels sourced from VOS program module header
Michael Pavone <pavone@retrodev.com>
parents: 633
diff changeset
130 }
4a6ec64acd79 Better support for labels sourced from VOS program module header
Michael Pavone <pavone@retrodev.com>
parents: 633
diff changeset
131 }
4a6ec64acd79 Better support for labels sourced from VOS program module header
Michael Pavone <pavone@retrodev.com>
parents: 633
diff changeset
132
947
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
133 char * strip_ws(char * text)
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
134 {
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
135 while (*text && (!isprint(*text) || isblank(*text)))
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
136 {
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
137 text++;
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
138 }
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
139 char * ret = text;
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
140 text = ret + strlen(ret) - 1;
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
141 while (text > ret && (!isprint(*text) || isblank(*text)))
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
142 {
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
143 *text = 0;
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
144 text--;
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
145 }
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
146 return ret;
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
147 }
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
148
2132
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
149 typedef struct {
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
150 uint32_t address_off;
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
151 uint32_t address_end;
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
152 uint16_t *buffer;
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
153 } rom_def;
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
154
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
155 uint16_t fetch(uint32_t address, void *data)
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
156 {
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
157 rom_def *rom = data;
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
158 if (address >= rom->address_off && address < rom->address_end) {
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
159 return rom->buffer[((address & 0xFFFFFF) - rom->address_off) >> 1];
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
160 }
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
161 return 0;
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
162 }
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
163
2
5df303bf72e6 Improve 68K instruction decoding. Add simple disassembler.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
164 int main(int argc, char ** argv)
5df303bf72e6 Improve 68K instruction decoding. Add simple disassembler.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
165 {
5df303bf72e6 Improve 68K instruction decoding. Add simple disassembler.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
166 long filesize;
2091
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
167 unsigned short *filebuf = NULL;
2
5df303bf72e6 Improve 68K instruction decoding. Add simple disassembler.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
168 char disbuf[1024];
5df303bf72e6 Improve 68K instruction decoding. Add simple disassembler.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
169 m68kinst instbuf;
5df303bf72e6 Improve 68K instruction decoding. Add simple disassembler.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
170 unsigned short * cur;
151
6b593ea0ed90 Implement MULU/MULS and DIVU/DIVS
Mike Pavone <pavone@retrodev.com>
parents: 148
diff changeset
171 deferred *def = NULL, *tmpd;
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
172
632
80e111b48d4b Add -r option to indicate VOS program module contains a 68K reset vector
Michael Pavone <pavone@retrodev.com>
parents: 631
diff changeset
173 uint8_t labels = 0, addr = 0, only = 0, vos = 0, reset = 0;
947
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
174 tern_node * named_labels = NULL;
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
175
1078
c4bfbf55d418 Added some hacky support for specifying a start offset in 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 947
diff changeset
176 uint32_t address_off = 0, address_end;
2105
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
177 uint8_t do_cd_labels = 0, main_cpu = 0;
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
178 for(uint8_t opt = 2; opt < argc; ++opt) {
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
179 if (argv[opt][0] == '-') {
197
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
180 FILE * address_log;
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
181 switch (argv[opt][1])
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
182 {
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
183 case 'l':
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
184 labels = 1;
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
185 break;
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
186 case 'a':
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
187 addr = 1;
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
188 break;
151
6b593ea0ed90 Implement MULU/MULS and DIVU/DIVS
Mike Pavone <pavone@retrodev.com>
parents: 148
diff changeset
189 case 'o':
6b593ea0ed90 Implement MULU/MULS and DIVU/DIVS
Mike Pavone <pavone@retrodev.com>
parents: 148
diff changeset
190 only = 1;
6b593ea0ed90 Implement MULU/MULS and DIVU/DIVS
Mike Pavone <pavone@retrodev.com>
parents: 148
diff changeset
191 break;
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
192 case 'v':
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
193 vos = 1;
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
194 break;
632
80e111b48d4b Add -r option to indicate VOS program module contains a 68K reset vector
Michael Pavone <pavone@retrodev.com>
parents: 631
diff changeset
195 case 'r':
80e111b48d4b Add -r option to indicate VOS program module contains a 68K reset vector
Michael Pavone <pavone@retrodev.com>
parents: 631
diff changeset
196 reset = 1;
80e111b48d4b Add -r option to indicate VOS program module contains a 68K reset vector
Michael Pavone <pavone@retrodev.com>
parents: 631
diff changeset
197 break;
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
198 case 'c':
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
199 do_cd_labels = 1;
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
200 break;
2105
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
201 case 'm':
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
202 main_cpu = 1;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
203 break;
1078
c4bfbf55d418 Added some hacky support for specifying a start offset in 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 947
diff changeset
204 case 's':
c4bfbf55d418 Added some hacky support for specifying a start offset in 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 947
diff changeset
205 opt++;
c4bfbf55d418 Added some hacky support for specifying a start offset in 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 947
diff changeset
206 if (opt >= argc) {
c4bfbf55d418 Added some hacky support for specifying a start offset in 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 947
diff changeset
207 fputs("-s must be followed by an offset\n", stderr);
c4bfbf55d418 Added some hacky support for specifying a start offset in 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 947
diff changeset
208 exit(1);
c4bfbf55d418 Added some hacky support for specifying a start offset in 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 947
diff changeset
209 }
c4bfbf55d418 Added some hacky support for specifying a start offset in 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 947
diff changeset
210 address_off = strtol(argv[opt], NULL, 0);
c4bfbf55d418 Added some hacky support for specifying a start offset in 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 947
diff changeset
211 break;
197
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
212 case 'f':
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
213 opt++;
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
214 if (opt >= argc) {
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
215 fputs("-f must be followed by a filename\n", stderr);
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
216 exit(1);
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
217 }
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
218 address_log = fopen(argv[opt], "r");
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
219 if (!address_log) {
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
220 fprintf(stderr, "Failed to open %s for reading\n", argv[opt]);
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
221 exit(1);
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
222 }
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
223 while (fgets(disbuf, sizeof(disbuf), address_log)) {
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
224 if (disbuf[0]) {
947
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
225 char *end;
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
226 uint32_t address = strtol(disbuf, &end, 16);
197
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
227 if (address) {
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
228 def = defer(address, def);
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
229 reference(address);
947
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
230 if (*end == '=') {
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
231 named_labels = add_label(named_labels, strip_ws(end+1), address);
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
232 }
197
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
233 }
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
234 }
7c227a8ec53d Add instruction address logging to translator and support for reading an address log to the disassembler
Mike Pavone <pavone@retrodev.com>
parents: 164
diff changeset
235 }
1594
137dbd05ceab Fix some issues identified by cppcheck
Michael Pavone <pavone@retrodev.com>
parents: 1078
diff changeset
236 fclose(address_log);
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
237 }
151
6b593ea0ed90 Implement MULU/MULS and DIVU/DIVS
Mike Pavone <pavone@retrodev.com>
parents: 148
diff changeset
238 } else {
947
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
239 char *end;
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
240 uint32_t address = strtol(argv[opt], &end, 16);
151
6b593ea0ed90 Implement MULU/MULS and DIVU/DIVS
Mike Pavone <pavone@retrodev.com>
parents: 148
diff changeset
241 def = defer(address, def);
6b593ea0ed90 Implement MULU/MULS and DIVU/DIVS
Mike Pavone <pavone@retrodev.com>
parents: 148
diff changeset
242 reference(address);
947
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
243 if (*end == '=') {
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
244 named_labels = add_label(named_labels, end+1, address);
d29722e3359c Allow specification of named labels as command line arguments to the 68K disassembler
Michael Pavone <pavone@retrodev.com>
parents: 805
diff changeset
245 }
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
246 }
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
247 }
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
248 FILE * f = fopen(argv[1], "rb");
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
249 fseek(f, 0, SEEK_END);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
250 filesize = ftell(f);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
251 fseek(f, 0, SEEK_SET);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
252
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
253 char int_key[MAX_INT_KEY_SIZE];
2091
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
254 uint8_t is_scd_iso = 0;
2105
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
255 uint8_t has_manual_defs = !!def;
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
256 if (vos)
2
5df303bf72e6 Improve 68K instruction decoding. Add simple disassembler.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
257 {
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
258 vos_program_module header;
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
259 vos_read_header(f, &header);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
260 vos_read_alloc_module_map(f, &header);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
261 address_off = header.user_boundary;
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
262 address_end = address_off + filesize - 0x1000;
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
263 def = defer(header.main_entry_link.code_address, def);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
264 named_labels = add_label(named_labels, "main_entry_link", header.main_entry_link.code_address);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
265 for (int i = 0; i < header.n_modules; i++)
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
266 {
632
80e111b48d4b Add -r option to indicate VOS program module contains a 68K reset vector
Michael Pavone <pavone@retrodev.com>
parents: 631
diff changeset
267 if (!reset || header.module_map_entries[i].code_address != header.user_boundary)
80e111b48d4b Add -r option to indicate VOS program module contains a 68K reset vector
Michael Pavone <pavone@retrodev.com>
parents: 631
diff changeset
268 {
80e111b48d4b Add -r option to indicate VOS program module contains a 68K reset vector
Michael Pavone <pavone@retrodev.com>
parents: 631
diff changeset
269 def = defer(header.module_map_entries[i].code_address, def);
80e111b48d4b Add -r option to indicate VOS program module contains a 68K reset vector
Michael Pavone <pavone@retrodev.com>
parents: 631
diff changeset
270 }
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
271 named_labels = add_label(named_labels, header.module_map_entries[i].name.str, header.module_map_entries[i].code_address);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
272 }
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
273 fseek(f, 0x1000, SEEK_SET);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
274 filebuf = malloc(filesize - 0x1000);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
275 if (fread(filebuf, 2, (filesize - 0x1000)/2, f) != (filesize - 0x1000)/2)
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
276 {
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
277 fprintf(stderr, "Failure while reading file %s\n", argv[1]);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
278 }
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
279 fclose(f);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
280 for(cur = filebuf; cur - filebuf < ((filesize - 0x1000)/2); ++cur)
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
281 {
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
282 *cur = (*cur >> 8) | (*cur << 8);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
283 }
632
80e111b48d4b Add -r option to indicate VOS program module contains a 68K reset vector
Michael Pavone <pavone@retrodev.com>
parents: 631
diff changeset
284 if (reset)
80e111b48d4b Add -r option to indicate VOS program module contains a 68K reset vector
Michael Pavone <pavone@retrodev.com>
parents: 631
diff changeset
285 {
80e111b48d4b Add -r option to indicate VOS program module contains a 68K reset vector
Michael Pavone <pavone@retrodev.com>
parents: 631
diff changeset
286 def = defer(filebuf[2] << 16 | filebuf[3], def);
80e111b48d4b Add -r option to indicate VOS program module contains a 68K reset vector
Michael Pavone <pavone@retrodev.com>
parents: 631
diff changeset
287 named_labels = add_label(named_labels, "reset", filebuf[2] << 16 | filebuf[3]);
80e111b48d4b Add -r option to indicate VOS program module contains a 68K reset vector
Michael Pavone <pavone@retrodev.com>
parents: 631
diff changeset
288 }
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
289 } else if (filesize > 0x1000) {
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
290 long boot_size = filesize > (32*1024) ? 32*1024 : filesize;
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
291 filebuf = malloc(boot_size);
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
292 if (fread(filebuf, 1, boot_size, f) != boot_size) {
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
293 fprintf(stderr, "Failure while reading file %s\n", argv[1]);
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
294 return 1;
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
295 }
2091
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
296 is_scd_iso = !memcmp("SEGADISCSYSTEM ", filebuf, 0x10);
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
297 if (!is_scd_iso && !memcmp("SEGADISCSYSTEM ", filebuf + 0x8, 0x10)) {
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
298 is_scd_iso = 1;
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
299 uint32_t end = 16 * 2352;
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
300 if (end > filesize) {
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
301 end = (filesize / 2352) * 2352;
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
302 }
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
303 for(uint32_t offset = 0x10, dst_offset = 0; offset < end; offset += 2352, dst_offset += 2048)
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
304 {
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
305 memmove(filebuf + dst_offset/2, filebuf + offset/2, 2048);
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
306 }
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
307 boot_size = (end / 2352) * 2048;
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
308 }
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
309 if (is_scd_iso) {
2105
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
310 fclose(f);
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
311 for(cur = filebuf; cur - filebuf < (boot_size/2); ++cur)
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
312 {
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
313 *cur = (*cur >> 8) | (*cur << 8);
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
314 }
2105
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
315 if (main_cpu) {
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
316 uint32_t main_start = 0x200;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
317 uint32_t extra_start = filebuf[0x30/2] << 16 | filebuf[0x32/2];
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
318 uint32_t main_end = (filebuf[0x34/2] << 16 | filebuf[0x36/2]) + extra_start;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
319 if (main_end > boot_size) {
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
320 main_end = boot_size;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
321 }
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
322 address_off = 0xFF0000;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
323 address_end = address_off + main_end-main_start;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
324 filebuf += main_start / 2;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
325 named_labels = add_label(named_labels, "start", 0xFF0000);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
326 if (!has_manual_defs || !only) {
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
327 def = defer(0xFF0000, def);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
328 }
2110
f1238ffb30a3 Some very minor Sega CD disassembler improvements
Michael Pavone <pavone@retrodev.com>
parents: 2105
diff changeset
329 uint32_t user_start;
f1238ffb30a3 Some very minor Sega CD disassembler improvements
Michael Pavone <pavone@retrodev.com>
parents: 2105
diff changeset
330 if (filebuf[0xA/2] == 0x57A) {
f1238ffb30a3 Some very minor Sega CD disassembler improvements
Michael Pavone <pavone@retrodev.com>
parents: 2105
diff changeset
331 //US
f1238ffb30a3 Some very minor Sega CD disassembler improvements
Michael Pavone <pavone@retrodev.com>
parents: 2105
diff changeset
332 user_start = 0xFF0584;
f1238ffb30a3 Some very minor Sega CD disassembler improvements
Michael Pavone <pavone@retrodev.com>
parents: 2105
diff changeset
333 } else if (filebuf[0xA/2] == 0x564) {
f1238ffb30a3 Some very minor Sega CD disassembler improvements
Michael Pavone <pavone@retrodev.com>
parents: 2105
diff changeset
334 //EU
f1238ffb30a3 Some very minor Sega CD disassembler improvements
Michael Pavone <pavone@retrodev.com>
parents: 2105
diff changeset
335 user_start = 0xFF056E;
f1238ffb30a3 Some very minor Sega CD disassembler improvements
Michael Pavone <pavone@retrodev.com>
parents: 2105
diff changeset
336 } else {
f1238ffb30a3 Some very minor Sega CD disassembler improvements
Michael Pavone <pavone@retrodev.com>
parents: 2105
diff changeset
337 //JP
f1238ffb30a3 Some very minor Sega CD disassembler improvements
Michael Pavone <pavone@retrodev.com>
parents: 2105
diff changeset
338 user_start = 0xFF0156;
f1238ffb30a3 Some very minor Sega CD disassembler improvements
Michael Pavone <pavone@retrodev.com>
parents: 2105
diff changeset
339 }
f1238ffb30a3 Some very minor Sega CD disassembler improvements
Michael Pavone <pavone@retrodev.com>
parents: 2105
diff changeset
340 named_labels = add_label(named_labels, "user_start", user_start);
2105
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
341 do_cd_labels = 1;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
342 } else {
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
343 uint32_t sub_start =filebuf[0x40/2] << 16 | filebuf[0x42/2];
2146
0c0d4233d826 Fix SP end address in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2132
diff changeset
344 uint32_t sub_end = sub_start + (filebuf[0x44/2] << 16 | filebuf[0x46/2]);
2105
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
345 if (sub_start > (boot_size - 0x20)) {
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
346 fprintf(stderr, "System Program start offset is %X, but image is only %X bytes\n", sub_start, (uint32_t)boot_size);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
347 return 1;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
348 }
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
349 if (sub_end > boot_size) {
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
350 sub_end = boot_size;
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
351 }
2105
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
352 uint32_t offset_start = (filebuf[(sub_start + 0x18)/2] << 16 | filebuf[(sub_start + 0x1A)/2]) + sub_start;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
353 for(uint32_t cur = offset_start, index = 0; cur < sub_end && filebuf[cur/2]; cur+=2, ++index)
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
354 {
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
355 uint32_t offset = offset_start + filebuf[cur/2];
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
356 if (offset >= boot_size) {
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
357 break;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
358 }
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
359 static const char* fixed_names[3] = {
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
360 "init",
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
361 "main",
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
362 "int_2"
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
363 };
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
364 char namebuf[32];
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
365 const char *name;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
366 if (index < 3) {
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
367 name = fixed_names[index];
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
368 } else {
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
369 name = namebuf;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
370 sprintf(namebuf, "usercall%u", index);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
371 }
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
372 uint32_t address = 0x6000 + offset - sub_start;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
373 named_labels = add_label(named_labels, name, address);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
374 if (!has_manual_defs || !only) {
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
375 def = defer(address, def);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
376 }
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
377 }
2105
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
378
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
379 do_cd_labels = 1;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
380 filebuf += sub_start / 2;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
381 address_off = 0x6000;
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
382 address_end = sub_end-sub_start + address_off;
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
383 }
2091
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
384 }
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
385 }
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
386 if (!vos && !is_scd_iso) {
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
387 if (filebuf) {
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
388 if (filesize > (32*1024)) {
2091
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
389 filebuf = realloc(filebuf, filesize);
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
390 fseek(f, 32*1024, SEEK_SET);
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
391 uint32_t to_read = filesize/2 - 16*1024;
2091
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
392 if (fread(filebuf + 16*1024, 2, to_read, f) != to_read)
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
393 {
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
394 fprintf(stderr, "Failure while reading file %s\n", argv[1]);
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
395 }
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
396 }
2091
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
397 } else {
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
398 filebuf = malloc(filesize);
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
399 if (fread(filebuf, 2, filesize/2, f) != filesize/2)
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
400 {
2091
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
401 fprintf(stderr, "Failure while reading file %s\n", argv[1]);
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
402 }
2091
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
403 }
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
404 address_end = address_off + filesize;
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
405 fclose(f);
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
406 for(cur = filebuf; cur - filebuf < (filesize/2); ++cur)
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
407 {
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
408 *cur = (*cur >> 8) | (*cur << 8);
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
409 }
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
410 if (!address_off) {
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
411 uint32_t start = filebuf[2] << 16 | filebuf[3];
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
412 uint32_t int_2 = filebuf[0x68/2] << 16 | filebuf[0x6A/2];
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
413 uint32_t int_4 = filebuf[0x70/2] << 16 | filebuf[0x72/2];
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
414 uint32_t int_6 = filebuf[0x78/2] << 16 | filebuf[0x7A/2];
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
415 named_labels = add_label(named_labels, "start", start);
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
416 named_labels = add_label(named_labels, "int_2", int_2);
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
417 named_labels = add_label(named_labels, "int_4", int_4);
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
418 named_labels = add_label(named_labels, "int_6", int_6);
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
419 if (!def || !only) {
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
420 def = defer(start, def);
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
421 def = defer(int_2, def);
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
422 def = defer(int_4, def);
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
423 def = defer(int_6, def);
2044
460e14497120 zlib support in vgmplay
Michael Pavone <pavone@retrodev.com>
parents: 1892
diff changeset
424 }
2132
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
425 named_labels = weak_label(named_labels, "illegal_inst", filebuf[0x10/2] << 16 | filebuf[0x12/2]);
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
426 named_labels = weak_label(named_labels, "div_zero", filebuf[0x14/2] << 16 | filebuf[0x16/2]);
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
427 named_labels = weak_label(named_labels, "chk_exception", filebuf[0x18/2] << 16 | filebuf[0x1A/2]);
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
428 named_labels = weak_label(named_labels, "trapv", filebuf[0x1C/2] << 16 | filebuf[0x1E/2]);
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
429 named_labels = weak_label(named_labels, "line_a_trap", filebuf[0x28/2] << 16 | filebuf[0x2A/2]);
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
430 named_labels = weak_label(named_labels, "line_f_trap", filebuf[0x2C/2] << 16 | filebuf[0x2E/2]);
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
431 }
2
5df303bf72e6 Improve 68K instruction decoding. Add simple disassembler.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
432 }
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
433 if (do_cd_labels) {
2105
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
434 if (main_cpu) {
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
435 named_labels = weak_label(named_labels, "_bios_reset", 0x280);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
436 named_labels = weak_label(named_labels, "_bios_entry", 0x284);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
437 named_labels = weak_label(named_labels, "_bios_init", 0x288);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
438 named_labels = weak_label(named_labels, "_bios_init_sp", 0x28C);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
439 named_labels = weak_label(named_labels, "_bios_vint", 0x290);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
440 named_labels = weak_label(named_labels, "_bios_set_hint", 0x294);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
441 named_labels = weak_label(named_labels, "_bios_poll_io", 0x298);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
442 named_labels = weak_label(named_labels, "_bios_detect_io", 0x29C);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
443 named_labels = weak_label(named_labels, "_bios_clear_vram", 0x2A0);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
444 named_labels = weak_label(named_labels, "_bios_clear_nmtbl", 0x2A4);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
445 named_labels = weak_label(named_labels, "_bios_clear_vsram", 0x2A8);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
446 named_labels = weak_label(named_labels, "_bios_init_vdp", 0x2AC);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
447 named_labels = weak_label(named_labels, "_bios_vdp_loadregs", 0x2B0);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
448 named_labels = weak_label(named_labels, "_bios_vdp_fill", 0x2B4);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
449 named_labels = weak_label(named_labels, "_bios_clear_vram_range", 0x2B8);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
450 named_labels = weak_label(named_labels, "_bios_clear_vram_range_dma", 0x2BC);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
451 named_labels = weak_label(named_labels, "_bios_vram_dma_fill", 0x2C0);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
452 named_labels = weak_label(named_labels, "_bios_update_nmtbl", 0x2C4);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
453 named_labels = weak_label(named_labels, "_bios_update_nmtbl_template", 0x2C8);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
454 named_labels = weak_label(named_labels, "_bios_fill_nmtbl", 0x2CC);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
455 named_labels = weak_label(named_labels, "_bios_vdp_dma", 0x2D0);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
456 named_labels = weak_label(named_labels, "_bios_vdp_dma_wordram", 0x2D4);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
457 named_labels = weak_label(named_labels, "_bios_vdp_display_enable", 0x2D8);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
458 named_labels = weak_label(named_labels, "_bios_vdp_display_disable", 0x2DC);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
459 named_labels = weak_label(named_labels, "_bios_pal_buffer", 0x2E0);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
460 named_labels = weak_label(named_labels, "_bios_pal_buffer_update", 0x2E4);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
461 named_labels = weak_label(named_labels, "_bios_pal_dma", 0x2E8);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
462 named_labels = weak_label(named_labels, "_bios_gfx_decomp", 0x2EC);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
463 named_labels = weak_label(named_labels, "_bios_gfx_decomp_ram", 0x2F0);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
464 named_labels = weak_label(named_labels, "_bios_update_sprites", 0x2F4);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
465 named_labels = weak_label(named_labels, "_bios_clear_ram", 0x2F8);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
466 named_labels = weak_label(named_labels, "_bios_display_sprite", 0x300);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
467 named_labels = weak_label(named_labels, "_bios_wait_vint", 0x304);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
468 named_labels = weak_label(named_labels, "_bios_wait_vint_flags", 0x308);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
469 named_labels = weak_label(named_labels, "_bios_dma_sat", 0x30C);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
470 named_labels = weak_label(named_labels, "_bios_set_hint_direct", 0x314);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
471 named_labels = weak_label(named_labels, "_bios_disable_hint", 0x318);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
472 named_labels = weak_label(named_labels, "_bios_print", 0x31C);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
473 named_labels = weak_label(named_labels, "_bios_load_user_font", 0x320);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
474 named_labels = weak_label(named_labels, "_bios_load_bios_font", 0x324);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
475 named_labels = weak_label(named_labels, "_bios_load_bios_font_default", 0x328);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
476 //TODO: more functions in the middle here
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
477 named_labels = weak_label(named_labels, "_bios_prng_mod", 0x338);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
478 named_labels = weak_label(named_labels, "_bios_prng", 0x33C);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
479 named_labels = weak_label(named_labels, "_bios_clear_comm", 0x340);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
480 named_labels = weak_label(named_labels, "_bios_comm_update", 0x344);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
481 //TODO: more functions in the middle here
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
482 named_labels = weak_label(named_labels, "_bios_sega_logo", 0x364);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
483 named_labels = weak_label(named_labels, "_bios_set_vint", 0x368);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
484 //TODO: more functions at the end here
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
485
2110
f1238ffb30a3 Some very minor Sega CD disassembler improvements
Michael Pavone <pavone@retrodev.com>
parents: 2105
diff changeset
486 named_labels = weak_label(named_labels, "WORD_RAM", 0x200000);
2105
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
487 named_labels = weak_label(named_labels, "CD_RESET_IFL2", 0xA12000);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
488 named_labels = weak_label(named_labels, "CD_RESET_IFL2_BYTE", 0xA12001);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
489 named_labels = weak_label(named_labels, "CD_WRITE_PROTECT", 0xA12002);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
490 named_labels = weak_label(named_labels, "CD_MEM_MODE", 0xA12003);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
491 named_labels = weak_label(named_labels, "CDC_CTRL", 0xA12004);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
492 named_labels = weak_label(named_labels, "HINT_VECTOR", 0xA12006);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
493 named_labels = weak_label(named_labels, "CDC_HOST_DATA", 0xA12008);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
494 named_labels = weak_label(named_labels, "STOP_WATCH", 0xA1200C);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
495 named_labels = weak_label(named_labels, "COMM_MAIN_FLAG", 0xA1200E);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
496 named_labels = weak_label(named_labels, "COMM_SUB_FLAG", 0xA1200F);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
497 named_labels = weak_label(named_labels, "COMM_CMD0", 0xA12010);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
498 named_labels = weak_label(named_labels, "COMM_CMD1", 0xA12012);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
499 named_labels = weak_label(named_labels, "COMM_CMD2", 0xA12014);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
500 named_labels = weak_label(named_labels, "COMM_CMD3", 0xA12016);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
501 named_labels = weak_label(named_labels, "COMM_CMD4", 0xA12018);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
502 named_labels = weak_label(named_labels, "COMM_CMD5", 0xA1201A);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
503 named_labels = weak_label(named_labels, "COMM_CMD6", 0xA1201C);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
504 named_labels = weak_label(named_labels, "COMM_CMD7", 0xA1201E);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
505 named_labels = weak_label(named_labels, "COMM_STATUS0", 0xA12020);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
506 named_labels = weak_label(named_labels, "COMM_STATUS1", 0xA12022);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
507 named_labels = weak_label(named_labels, "COMM_STATUS2", 0xA12024);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
508 named_labels = weak_label(named_labels, "COMM_STATUS3", 0xA12026);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
509 named_labels = weak_label(named_labels, "COMM_STATUS4", 0xA12028);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
510 named_labels = weak_label(named_labels, "COMM_STATUS5", 0xA1202A);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
511 named_labels = weak_label(named_labels, "COMM_STATUS6", 0xA1202C);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
512 named_labels = weak_label(named_labels, "COMM_STATUS7", 0xA1202E);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
513 } else {
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
514 named_labels = weak_label(named_labels, "bios_common_work", 0x5E80);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
515 named_labels = weak_label(named_labels, "_setjmptbl", 0x5F0A);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
516 named_labels = weak_label(named_labels, "_waitvsync", 0x5F10);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
517 named_labels = weak_label(named_labels, "_buram", 0x5F16);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
518 named_labels = weak_label(named_labels, "_cdboot", 0x5F1C);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
519 named_labels = weak_label(named_labels, "_cdbios", 0x5F22);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
520 named_labels = weak_label(named_labels, "_usercall0", 0x5F28);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
521 named_labels = weak_label(named_labels, "_usercall1", 0x5F2E);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
522 named_labels = weak_label(named_labels, "_usercall2", 0x5F34);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
523 named_labels = weak_label(named_labels, "_usercall2Address", 0x5F36);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
524 named_labels = weak_label(named_labels, "_usercall3", 0x5F3A);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
525 named_labels = weak_label(named_labels, "_adrerr", 0x5F40);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
526 named_labels = weak_label(named_labels, "_adrerrAddress", 0x5F42);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
527 named_labels = weak_label(named_labels, "_coderr", 0x5F46);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
528 named_labels = weak_label(named_labels, "_coderrAddress", 0x5F48);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
529 named_labels = weak_label(named_labels, "_diverr", 0x5F4C);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
530 named_labels = weak_label(named_labels, "_diverrAddress", 0x5F4E);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
531 named_labels = weak_label(named_labels, "_chkerr", 0x5F52);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
532 named_labels = weak_label(named_labels, "_chkerrAddress", 0x5F54);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
533 named_labels = weak_label(named_labels, "_trperr", 0x5F58);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
534 named_labels = weak_label(named_labels, "_trperrAddress", 0x5F5A);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
535 named_labels = weak_label(named_labels, "_spverr", 0x5F5E);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
536 named_labels = weak_label(named_labels, "_spverrAddress", 0x5F60);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
537 named_labels = weak_label(named_labels, "_trace", 0x5F64);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
538 named_labels = weak_label(named_labels, "_traceAddress", 0x5F66);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
539 named_labels = weak_label(named_labels, "_nocod0", 0x5F6A);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
540 named_labels = weak_label(named_labels, "_nocod0Address", 0x5F6C);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
541 named_labels = weak_label(named_labels, "_nocod0", 0x5F70);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
542 named_labels = weak_label(named_labels, "_nocod0Address", 0x5F72);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
543 named_labels = weak_label(named_labels, "_slevel1", 0x5F76);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
544 named_labels = weak_label(named_labels, "_slevel1Address", 0x5F78);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
545 named_labels = weak_label(named_labels, "_slevel2", 0x5F7C);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
546 named_labels = weak_label(named_labels, "_slevel2Address", 0x5F7E);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
547 named_labels = weak_label(named_labels, "_slevel3", 0x5F82);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
548 named_labels = weak_label(named_labels, "_slevel3Address", 0x5F84);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
549 named_labels = weak_label(named_labels, "WORD_RAM_2M", 0x80000);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
550 named_labels = weak_label(named_labels, "WORD_RAM_1M", 0xC0000);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
551 named_labels = weak_label(named_labels, "LED_CONTROL", 0xFFFF8000);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
552 named_labels = weak_label(named_labels, "VERSION_RESET", 0xFFFF8001);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
553 named_labels = weak_label(named_labels, "MEM_MODE_WORD", 0xFFFF8002);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
554 named_labels = weak_label(named_labels, "MEM_MODE_BYTE", 0xFFFF8003);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
555 named_labels = weak_label(named_labels, "CDC_CTRL", 0xFFFF8004);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
556 named_labels = weak_label(named_labels, "CDC_AR", 0xFFFF8005);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
557 named_labels = weak_label(named_labels, "CDC_REG_DATA_WORD", 0xFFFF8006);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
558 named_labels = weak_label(named_labels, "CDC_REG_DATA", 0xFFFF8007);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
559 named_labels = weak_label(named_labels, "CDC_HOST_DATA", 0xFFFF8008);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
560 named_labels = weak_label(named_labels, "CDC_DMA_ADDR", 0xFFFF800A);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
561 named_labels = weak_label(named_labels, "STOP_WATCH", 0xFFFF800C);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
562 named_labels = weak_label(named_labels, "COMM_MAIN_FLAG", 0xFFFF800E);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
563 named_labels = weak_label(named_labels, "COMM_SUB_FLAG", 0xFFFF800F);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
564 named_labels = weak_label(named_labels, "COMM_CMD0", 0xFFFF8010);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
565 named_labels = weak_label(named_labels, "COMM_CMD1", 0xFFFF8012);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
566 named_labels = weak_label(named_labels, "COMM_CMD2", 0xFFFF8014);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
567 named_labels = weak_label(named_labels, "COMM_CMD3", 0xFFFF8016);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
568 named_labels = weak_label(named_labels, "COMM_CMD4", 0xFFFF8018);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
569 named_labels = weak_label(named_labels, "COMM_CMD5", 0xFFFF801A);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
570 named_labels = weak_label(named_labels, "COMM_CMD6", 0xFFFF801C);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
571 named_labels = weak_label(named_labels, "COMM_CMD7", 0xFFFF801E);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
572 named_labels = weak_label(named_labels, "COMM_STATUS0", 0xFFFF8020);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
573 named_labels = weak_label(named_labels, "COMM_STATUS1", 0xFFFF8022);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
574 named_labels = weak_label(named_labels, "COMM_STATUS2", 0xFFFF8024);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
575 named_labels = weak_label(named_labels, "COMM_STATUS3", 0xFFFF8026);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
576 named_labels = weak_label(named_labels, "COMM_STATUS4", 0xFFFF8028);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
577 named_labels = weak_label(named_labels, "COMM_STATUS5", 0xFFFF802A);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
578 named_labels = weak_label(named_labels, "COMM_STATUS6", 0xFFFF802C);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
579 named_labels = weak_label(named_labels, "COMM_STATUS7", 0xFFFF802E);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
580 named_labels = weak_label(named_labels, "TIMER_WORD", 0xFFFF8030);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
581 named_labels = weak_label(named_labels, "TIMER", 0xFFFF8031);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
582 named_labels = weak_label(named_labels, "INT_MASK_WORD", 0xFFFF8032);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
583 named_labels = weak_label(named_labels, "INT_MASK", 0xFFFF8033);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
584 named_labels = weak_label(named_labels, "CDD_FADER", 0xFFFF8034);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
585 named_labels = weak_label(named_labels, "CDD_CTRL_WORD", 0xFFFF8036);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
586 named_labels = weak_label(named_labels, "CDD_CTRL_BYTE", 0xFFFF8037);
1bda10d60b29 Add some enhancements for disassembling Main CPU Sega CD code
Michael Pavone <pavone@retrodev.com>
parents: 2102
diff changeset
587 }
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
588 }
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
589 uint32_t size, tmp_addr;
139
cce22fb4c450 Properly support references to odd addresses in label generation in disassembler. Add labels for start and interrupts.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
590 uint32_t address;
2132
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
591 rom_def rom = {
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
592 .address_off = address_off,
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
593 .address_end = address_end,
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
594 .buffer = filebuf
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
595 };
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
596 uint8_t valid_address;
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
597 while(def) {
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
598 do {
2132
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
599 valid_address = 0;
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
600 address = def->address;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
601 if (!is_visited(address)) {
2091
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
602 address &= 0xFFFFFF;
2132
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
603 if (address < address_end && address >= address_off) {
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
604 valid_address = 1;
2091
36a9cf4db65f Fix some disassembler bugs introduced with Sega CD changes
Michael Pavone <pavone@retrodev.com>
parents: 2085
diff changeset
605 }
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
606 }
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
607 tmpd = def;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
608 def = def->next;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
609 free(tmpd);
2132
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
610 } while(def && !valid_address);
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
611 if (!valid_address) {
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
612 break;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
613 }
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
614 for(;;) {
1892
1afd6e85ec26 Properly mask addresses to 24-bit in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 1594
diff changeset
615 if ((address & 0xFFFFFF) > address_end || address < address_off) {
48
0bdda50c7364 Don't try to disassemble addresses beyond the end of the cartridge
Mike Pavone <pavone@retrodev.com>
parents: 47
diff changeset
616 break;
0bdda50c7364 Don't try to disassemble addresses beyond the end of the cartridge
Mike Pavone <pavone@retrodev.com>
parents: 47
diff changeset
617 }
47
4b6c667326a1 Fix bug in address visitation in disassembler
Mike Pavone <pavone@retrodev.com>
parents: 44
diff changeset
618 visit(address);
2132
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
619 address = m68k_decode(fetch, &rom, &instbuf, address);
111
8b50d2c975b2 Fix decoding of Scc
Mike Pavone <pavone@retrodev.com>
parents: 103
diff changeset
620 //m68k_disasm(&instbuf, disbuf);
8b50d2c975b2 Fix decoding of Scc
Mike Pavone <pavone@retrodev.com>
parents: 103
diff changeset
621 //printf("%X: %s\n", instbuf.address, disbuf);
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
622 check_reference(&instbuf, &(instbuf.src));
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
623 check_reference(&instbuf, &(instbuf.dst));
148
4a400aec81bb Bail out of disassembly of a particular stream when we hit an invalid instruction
Mike Pavone <pavone@retrodev.com>
parents: 139
diff changeset
624 if (instbuf.op == M68K_ILLEGAL || instbuf.op == M68K_RTS || instbuf.op == M68K_RTE || instbuf.op == M68K_INVALID) {
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
625 break;
164
afbfb0ac0256 Small fix to disassembler
Mike Pavone <pavone@retrodev.com>
parents: 151
diff changeset
626 }
afbfb0ac0256 Small fix to disassembler
Mike Pavone <pavone@retrodev.com>
parents: 151
diff changeset
627 if (instbuf.op == M68K_BCC || instbuf.op == M68K_DBCC || instbuf.op == M68K_BSR) {
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
628 if (instbuf.op == M68K_BCC && instbuf.extra.cond == COND_TRUE) {
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
629 address = instbuf.address + 2 + instbuf.src.params.immed;
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
630 reference(address);
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
631 if (is_visited(address)) {
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
632 break;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
633 }
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
634 } else {
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
635 tmp_addr = instbuf.address + 2 + instbuf.src.params.immed;
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
636 reference(tmp_addr);
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
637 def = defer(tmp_addr, def);
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
638 }
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
639 } else if(instbuf.op == M68K_JMP) {
80
7b1e16e981ef Fix bug in disassembler that caused it to disassemble addresses it shouldn't
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
640 if (instbuf.src.addr_mode == MODE_ABSOLUTE || instbuf.src.addr_mode == MODE_ABSOLUTE_SHORT) {
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
641 address = instbuf.src.params.immed;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
642 if (is_visited(address)) {
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
643 break;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
644 }
564
316facea756d Fix PC displacement mode check in disassembler so that jmps involving a register are handled correctly
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
645 } else if (instbuf.src.addr_mode == MODE_PC_DISPLACE) {
114
e821b6fde0e4 Allow jmp/jsr to follow pc-relative addresses in disassembler
Mike Pavone <pavone@retrodev.com>
parents: 111
diff changeset
646 address = instbuf.src.params.regs.displacement + instbuf.address + 2;
e821b6fde0e4 Allow jmp/jsr to follow pc-relative addresses in disassembler
Mike Pavone <pavone@retrodev.com>
parents: 111
diff changeset
647 if (is_visited(address)) {
e821b6fde0e4 Allow jmp/jsr to follow pc-relative addresses in disassembler
Mike Pavone <pavone@retrodev.com>
parents: 111
diff changeset
648 break;
e821b6fde0e4 Allow jmp/jsr to follow pc-relative addresses in disassembler
Mike Pavone <pavone@retrodev.com>
parents: 111
diff changeset
649 }
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
650 } else {
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
651 break;
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
652 }
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
653 } else if(instbuf.op == M68K_JSR) {
80
7b1e16e981ef Fix bug in disassembler that caused it to disassemble addresses it shouldn't
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
654 if (instbuf.src.addr_mode == MODE_ABSOLUTE || instbuf.src.addr_mode == MODE_ABSOLUTE_SHORT) {
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
655 def = defer(instbuf.src.params.immed, def);
164
afbfb0ac0256 Small fix to disassembler
Mike Pavone <pavone@retrodev.com>
parents: 151
diff changeset
656 } else if (instbuf.src.addr_mode == MODE_PC_DISPLACE) {
114
e821b6fde0e4 Allow jmp/jsr to follow pc-relative addresses in disassembler
Mike Pavone <pavone@retrodev.com>
parents: 111
diff changeset
657 def = defer(instbuf.src.params.regs.displacement + instbuf.address + 2, def);
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
658 }
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
659 }
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
660 }
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
661 }
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
662 if (labels) {
640
c806b96b86eb Add equates for address references below address_off
Michael Pavone <pavone@retrodev.com>
parents: 639
diff changeset
663 for (address = 0; address < address_off; address++) {
c806b96b86eb Add equates for address references below address_off
Michael Pavone <pavone@retrodev.com>
parents: 639
diff changeset
664 if (is_label(address)) {
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
665 char key[MAX_INT_KEY_SIZE];
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
666 tern_int_key(address, key);
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
667 label_names *names = tern_find_ptr(named_labels, key);
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
668 if (names) {
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
669 for (int i = 0; i < names->num_labels; i++)
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
670 {
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
671 printf("%s equ $%X\n", names->labels[i], address);
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
672 }
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
673 } else {
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
674 printf("ADR_%X equ $%X\n", address, address);
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
675 }
640
c806b96b86eb Add equates for address references below address_off
Michael Pavone <pavone@retrodev.com>
parents: 639
diff changeset
676 }
c806b96b86eb Add equates for address references below address_off
Michael Pavone <pavone@retrodev.com>
parents: 639
diff changeset
677 }
2085
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
678 for (address = address_end; address < (16*1024*1024); address++) {
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
679 if (is_label(address)) {
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
680 char key[MAX_INT_KEY_SIZE];
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
681 tern_int_key(address, key);
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
682 label_names *names = tern_find_ptr(named_labels, key);
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
683 if (names) {
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
684 for (int i = 0; i < names->num_labels; i++)
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
685 {
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
686 printf("%s equ $%X\n", names->labels[i], names->full_address);
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
687 }
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
688 } else {
1ff67ce37085 Add some Sega CD specific enhancements to disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2044
diff changeset
689 printf("ADR_%X equ $%X\n", address, address);
704
1a14f5f6c6a1 Properly print equ for named labels that point outside the cartridge area in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 652
diff changeset
690 }
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
691 }
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
692 }
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
693 puts("");
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
694 }
633
a759f4e38488 Fix translation of 68K address to buffer location when address_off != 0
Michael Pavone <pavone@retrodev.com>
parents: 632
diff changeset
695 for (address = address_off; address < address_end; address+=2) {
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
696 if (is_visited(address)) {
2132
7451f970ee66 Add some weak labels for a few exception vectors in disassembler
Michael Pavone <pavone@retrodev.com>
parents: 2110
diff changeset
697 m68k_decode(fetch, &rom, &instbuf, address);
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
698 if (labels) {
634
4a6ec64acd79 Better support for labels sourced from VOS program module header
Michael Pavone <pavone@retrodev.com>
parents: 633
diff changeset
699 m68k_disasm_labels(&instbuf, disbuf, label_fun, named_labels);
631
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
700 char keybuf[MAX_INT_KEY_SIZE];
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
701 label_names * names = tern_find_ptr(named_labels, tern_int_key(address, keybuf));
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
702 if (names)
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
703 {
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
704 for (int i = 0; i < names->num_labels; i++)
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
705 {
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
706 printf("%s:\n", names->labels[i]);
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
707 }
de6f00204fa2 Add support for disassembling VOS program modules
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
708 } else if (is_label(instbuf.address)) {
134
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
709 printf("ADR_%X:\n", instbuf.address);
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
710 }
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
711 if (addr) {
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
712 printf("\t%s\t;%X\n", disbuf, instbuf.address);
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
713 } else {
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
714 printf("\t%s\n", disbuf);
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
715 }
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
716 } else {
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
717 m68k_disasm(&instbuf, disbuf);
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
718 printf("%X: %s\n", instbuf.address, disbuf);
ab50421b1b7a Improve disassembler
Mike Pavone <pavone@retrodev.com>
parents: 114
diff changeset
719 }
44
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
720 }
ec71370820f2 Add logic for following control flow based on logic in the translator
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
721 }
2
5df303bf72e6 Improve 68K instruction decoding. Add simple disassembler.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
722 return 0;
5df303bf72e6 Improve 68K instruction decoding. Add simple disassembler.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
723 }