1 | /*****************************************************************************/ |
2 | /* */ |
3 | /* codeinfo.h */ |
4 | /* */ |
5 | /* Additional information about 6502 code */ |
6 | /* */ |
7 | /* */ |
8 | /* */ |
9 | /* (C) 2001-2002 Ullrich von Bassewitz */ |
10 | /* Wacholderweg 14 */ |
11 | /* D-70597 Stuttgart */ |
12 | /* EMail: uz@cc65.org */ |
13 | /* */ |
14 | /* */ |
15 | /* This software is provided 'as-is', without any expressed or implied */ |
16 | /* warranty. In no event will the authors be held liable for any damages */ |
17 | /* arising from the use of this software. */ |
18 | /* */ |
19 | /* Permission is granted to anyone to use this software for any purpose, */ |
20 | /* including commercial applications, and to alter it and redistribute it */ |
21 | /* freely, subject to the following restrictions: */ |
22 | /* */ |
23 | /* 1. The origin of this software must not be misrepresented; you must not */ |
24 | /* claim that you wrote the original software. If you use this software */ |
25 | /* in a product, an acknowledgment in the product documentation would be */ |
26 | /* appreciated but is not required. */ |
27 | /* 2. Altered source versions must be plainly marked as such, and must not */ |
28 | /* be misrepresented as being the original software. */ |
29 | /* 3. This notice may not be removed or altered from any source */ |
30 | /* distribution. */ |
31 | /* */ |
32 | /*****************************************************************************/ |
33 | |
34 | |
35 | |
36 | #ifndef CODEINFO_H |
37 | #define CODEINFO_H |
38 | |
39 | |
40 | |
41 | /*****************************************************************************/ |
42 | /* Forwards */ |
43 | /*****************************************************************************/ |
44 | |
45 | |
46 | |
47 | struct CodeSeg; |
48 | |
49 | |
50 | |
51 | /*****************************************************************************/ |
52 | /* Data */ |
53 | /*****************************************************************************/ |
54 | |
55 | |
56 | |
57 | /* Forward to struct RegContents */ |
58 | struct RegContents; |
59 | |
60 | /* Defines for registers. */ |
61 | #define REG_NONE 0x0000U |
62 | #define REG_A 0x0001U |
63 | #define REG_X 0x0002U |
64 | #define REG_Y 0x0004U |
65 | #define REG_TMP1 0x0008U |
66 | #define REG_PTR1_LO 0x0010U |
67 | #define REG_PTR1_HI 0x0020U |
68 | #define REG_PTR2_LO 0x0040U |
69 | #define REG_PTR2_HI 0x0080U |
70 | #define REG_SREG_LO 0x0100U |
71 | #define REG_SREG_HI 0x0200U |
72 | #define REG_SAVE_LO 0x0400U |
73 | #define REG_SAVE_HI 0x0800U |
74 | #define REG_SP_LO 0x1000U |
75 | #define REG_SP_HI 0x2000U |
76 | |
77 | |
78 | /* Combined register defines */ |
79 | #define REG_PTR1 (REG_PTR1_LO | REG_PTR1_HI) |
80 | #define REG_PTR2 (REG_PTR2_LO | REG_PTR2_HI) |
81 | #define REG_SREG (REG_SREG_LO | REG_SREG_HI) |
82 | #define REG_SAVE (REG_SAVE_LO | REG_SAVE_HI) |
83 | #define REG_SP (REG_SP_LO | REG_SP_HI) |
84 | #define REG_AX (REG_A | REG_X) |
85 | #define REG_AY (REG_A | REG_Y) |
86 | #define REG_XY (REG_X | REG_Y) |
87 | #define REG_AXY (REG_AX | REG_Y) |
88 | #define REG_EAX (REG_AX | REG_SREG) |
89 | #define REG_EAXY (REG_EAX | REG_Y) |
90 | #define REG_ZP 0xFFF8U |
91 | #define REG_ALL 0xFFFFU |
92 | |
93 | |
94 | |
95 | /* Zero page register info */ |
96 | typedef struct ZPInfo ZPInfo; |
97 | struct ZPInfo { |
98 | unsigned char Len; /* Length of the following string */ |
99 | char Name[11]; /* Name of zero page symbol */ |
100 | unsigned short ByteUse; /* Register info for this symbol */ |
101 | unsigned short WordUse; /* Register info for 16 bit access */ |
102 | }; |
103 | |
104 | |
105 | |
106 | /* Defines for the conditions in a compare */ |
107 | typedef enum { |
108 | CMP_INV = -1, |
109 | CMP_EQ, |
110 | CMP_NE, |
111 | CMP_GT, |
112 | CMP_GE, |
113 | CMP_LT, |
114 | CMP_LE, |
115 | CMP_UGT, |
116 | CMP_UGE, |
117 | CMP_ULT, |
118 | CMP_ULE |
119 | } cmp_t; |
120 | |
121 | |
122 | |
123 | /*****************************************************************************/ |
124 | /* Code */ |
125 | /*****************************************************************************/ |
126 | |
127 | |
128 | |
129 | void GetFuncInfo (const char* Name, unsigned short* Use, unsigned short* Chg); |
130 | /* For the given function, lookup register information and store it into |
131 | ** the given variables. If the function is unknown, assume it will use and |
132 | ** load all registers. |
133 | */ |
134 | |
135 | const ZPInfo* GetZPInfo (const char* Name); |
136 | /* If the given name is a zero page symbol, return a pointer to the info |
137 | ** struct for this symbol, otherwise return NULL. |
138 | */ |
139 | |
140 | unsigned GetRegInfo (struct CodeSeg* S, unsigned Index, unsigned Wanted); |
141 | /* Determine register usage information for the instructions starting at the |
142 | ** given index. |
143 | */ |
144 | |
145 | int RegAUsed (struct CodeSeg* S, unsigned Index); |
146 | /* Check if the value in A is used. */ |
147 | |
148 | int RegXUsed (struct CodeSeg* S, unsigned Index); |
149 | /* Check if the value in X is used. */ |
150 | |
151 | int RegYUsed (struct CodeSeg* S, unsigned Index); |
152 | /* Check if the value in Y is used. */ |
153 | |
154 | int RegAXUsed (struct CodeSeg* S, unsigned Index); |
155 | /* Check if the value in A or(!) the value in X are used. */ |
156 | |
157 | int RegEAXUsed (struct CodeSeg* S, unsigned Index); |
158 | /* Check if any of the four bytes in EAX are used. */ |
159 | |
160 | unsigned GetKnownReg (unsigned Use, const struct RegContents* RC); |
161 | /* Return the register or zero page location from the set in Use, thats |
162 | ** contents are known. If Use does not contain any register, or if the |
163 | ** register in question does not have a known value, return REG_NONE. |
164 | */ |
165 | |
166 | cmp_t FindBoolCmpCond (const char* Name); |
167 | /* Check if the given string is the name of one of the boolean transformer |
168 | ** subroutine, and if so, return the condition that is evaluated by this |
169 | ** routine. Return CMP_INV if the condition is not recognised. |
170 | */ |
171 | |
172 | cmp_t FindTosCmpCond (const char* Name); |
173 | /* Check if this is a call to one of the TOS compare functions (tosgtax). |
174 | ** Return the condition code or CMP_INV on failure. |
175 | */ |
176 | |
177 | |
178 | |
179 | /* End of codeinfo.h */ |
180 | |
181 | #endif |
182 | |