comparison structures.h @ 0:4410c9c7750d

Initial import.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 24 Feb 2015 18:53:52 +0200
parents
children 0990d9322fc8
comparison
equal deleted inserted replaced
-1:000000000000 0:4410c9c7750d
1 /*\
2 * dxa v0.1.1 -- symbolic 65xx disassembler
3 *
4 * Copyright (C) 1993, 1994 Marko M\"akel\"a
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 *
20 * Contacting the author:
21 *
22 * Via Internet E-mail:
23 * <Marko.Makela@FTP.FUNET.FI>
24 *
25 * Via Snail Mail:
26 * Marko M\"akel\"a
27 * Sillitie 10 A
28 * FIN-01480 VANTAA
29 * Finland
30 \*/
31
32 /* structures.h - memory structures and related constants and macros */
33 #ifndef _STRUCTURES_H_
34 #define _STRUCTURES_H_
35
36 #ifndef FALSE
37 #define FALSE 0
38 #define TRUE !FALSE
39 #endif
40
41 #ifndef NULL
42 #define NULL (void *)0
43 #endif
44
45 #define MAXLINE 50 /* maximum amount of bytes used when reading a label in */
46
47 typedef unsigned short int ADDR_T; /* 16-bit unsigned integer */
48 typedef unsigned char DATA_T; /* 8-bit unsigned integer */
49
50 /********************\
51 * Program code table *
52 \********************/
53
54 #ifndef _MAIN_C_
55 extern
56 #endif
57 DATA_T Memory[1 << 16];
58
59 /*************************\
60 * Memory place type table *
61 \*************************/
62
63 #ifndef _MAIN_C_
64 extern
65 #endif
66 unsigned MemType[(1 << 14) / sizeof(unsigned)];
67
68 #define GetMemType(address) \
69 ((MemType[((ADDR_T)address) / (4 * sizeof *MemType)] >> \
70 ((address % (4 * sizeof *MemType)) << 1)) & 3)
71
72 #define SetMemType(address, type) \
73 (MemType[((ADDR_T)address) / (4 * sizeof *MemType)] = \
74 (MemType[((ADDR_T)address) / (4 * sizeof *MemType)] & \
75 ~(3 << ((address % (4 * sizeof *MemType)) << 1))) | \
76 (type << ((address % (4 * sizeof *MemType)) << 1)))
77
78 /* The table consists of bit pairs with the following values: */
79
80 #define MEM_UNPROCESSED 0 /* the memory place has not been processed yet */
81 #define MEM_INSTRUCTION 1 /* a machine language instruction starts at
82 this memory place */
83 #define MEM_DATA 2 /* the memory place contains data */
84 #define MEM_PARAMETER 3 /* a parameter of a machine language
85 instruction is at this place */
86
87 /*************************\
88 * Memory place flag table *
89 \*************************/
90
91 #ifndef _MAIN_C_
92 extern
93 #endif
94 unsigned
95 MemFlag[(1 << 13) / sizeof(unsigned)],
96 MemLabel[(1 << 13) / sizeof(unsigned)],
97 LowByte[(1 << 8) / sizeof(unsigned)],
98 HighByte[(1 << 8) / sizeof(unsigned)];
99
100 #define GetMemFlag(address) \
101 ((MemFlag[((ADDR_T)address) / (8 * sizeof *MemFlag)] >> \
102 (address % (8 * sizeof *MemFlag))) & 1)
103
104 #define SetMemFlag(address) \
105 (MemFlag[((ADDR_T)address) / (8 * sizeof *MemFlag)] |= \
106 (1 << (address % (8 * sizeof *MemFlag))))
107
108 /* The flag table indicates if there may be a valid routine at the address.
109 If a flag is set, there cannot be valid routines at the address. */
110
111 #define IsLabeled(address) \
112 ((MemLabel[((ADDR_T)address) / (8 * sizeof *MemLabel)] >> \
113 (address % (8 * sizeof *MemLabel))) & 1)
114
115 #define PutLabel(address) \
116 (MemLabel[((ADDR_T)address) / (8 * sizeof *MemLabel)] |= \
117 (1 << (address % (8 * sizeof *MemLabel))))
118
119 /* These macros tell if there is a label for a given address, or cause a
120 label to be produced for an address. */
121
122 #define IsLowByte(address) \
123 ((LowByte[((unsigned char)address) / (8 * sizeof *LowByte)] >> \
124 (address % (8 * sizeof *LowByte))) & 1)
125
126 #define PutLowByte(address) \
127 (LowByte[((unsigned char)address) / (8 * sizeof *LowByte)] |= \
128 (1 << (address % (8 * sizeof *LowByte))))
129
130 /* Corresponding macros for the low byte address table. */
131
132 #define IsHighByte(address) \
133 ((HighByte[(address >> 8) / (8 * sizeof *HighByte)] >> \
134 ((address >> 8) % (8 * sizeof *HighByte))) & 1)
135
136 #define PutHighByte(address) \
137 (HighByte[(address >> 8) / (8 * sizeof *HighByte)] |= \
138 (1 << ((address >> 8) % (8 * sizeof *HighByte))))
139
140 /* Corresponding macros for the high byte address table. */
141
142 /***************************************\
143 * Routine/warning address table entries *
144 \***************************************/
145
146 typedef struct table
147 {
148 ADDR_T address;
149 ADDR_T parent;
150 unsigned char type;
151 } table;
152
153 /* The table.type byte has the following format: */
154
155 #define RTN_SURE 0x80 /* address must point to a valid subprogram */
156 #define RTN_POTENTIAL 0x81 /* address may point to a valid subprogram (an
157 address following a conditional branch
158 instruction) */
159 #define RTN_SUSPECTED 0x82 /* address might point to a valid subprogram
160 (an address encountered during processing
161 an RTN_POTENTIAL entry) */
162 #define RTN_SUSP_POT 0x83 /* address might point to a subprogram (an
163 address following a conditional branch
164 instruction that was encountered during
165 processing an RTN_SUSPECTED or
166 RTN_POTENTIAL entry) */
167 #define RTN_B_TEMPORARY 0x10 /* declares the entry as temporary */
168 #define RTN_B_PROCESSED 0x20 /* address seems to point to a valid
169 subprogram (a successfully processed
170 RTN_SUSPECTED entry is
171 RTN_SUSPECTED | RTN_B_PROCESSED) */
172
173 #define MASK_ANY 0xc0 /* mask for determining the type of the entry */
174
175 #define RTN_ANY 0x80 /* mask for determining if an entry is a
176 routine or not */
177
178 #define WRN_PARAM_WRITTEN_TO 0x40 /* the parameter of the instruction is
179 written to */
180 #define WRN_INSTR_WRITTEN_TO 0x41 /* the instruction is modified by the
181 program */
182
183 #define WRN_PARAM_JUMPED_TO 0x42 /* a jump occurs in the middle of the
184 instruction, e.g. BIT $01A9 */
185 #define WRN_RTN_TRUNCATED 0x43 /* the routine is truncated, the rest of
186 the instructions are retrieved outside
187 the loaded file (very fatal error) */
188 #define WRN_I_ACCESSED 0x44 /* not an actual warning: an unprocessed
189 memory place is accessed by an
190 RTN_POTENTIAL or RTN_SUSPECTED routine */
191 #define WRN_I_LABEL_NEEDED 0x45 /* not an actual warning: a label will be
192 needed for this memory place */
193
194 #define WRN_B_TEMPORARY 0x20 /* mask for determining whether a warning
195 is temporary and may be deleted later */
196
197 #define WRN_ANY 0x40 /* mask for determining whether an
198 entry is a warning or not */
199
200 #define TBL_DELETED 0 /* the entry may be reused */
201
202 /*********************\
203 * Label table entries *
204 \*********************/
205
206 typedef struct label
207 {
208 ADDR_T address;
209 char *name;
210 } label;
211
212 /********************\
213 * Word table entries *
214 \********************/
215
216 typedef struct words
217 {
218 ADDR_T start, end;
219 } words;
220
221 #ifndef _MAIN_C_
222 extern char *prog;
223 extern ADDR_T StartAddress, EndAddress;
224 extern int fVerbose;
225 #else
226 char *prog;
227 ADDR_T StartAddress, EndAddress;
228 int fVerbose = FALSE;
229 #endif /* _MAIN_C_ */
230
231 #ifndef _TABLE_C_
232 extern unsigned int entrycount;
233 extern table *scantable; /* table of all warnings generated or routines
234 encountered */
235 #else
236 unsigned int entrycount = 0;
237 table *scantable = NULL;
238 #endif /* _TABLE_C_ */
239
240 #ifndef _DUMP_C_
241 extern int listwidth; /* maximum amount of bytes dumped on a source line */
242 #else
243 int listwidth = 0;
244 #endif /* _DUMP_C_ */
245
246 #endif /* _STRUCTURES_H_ */