1 /****************************************************************************
2 format.c -- Joseph LoCicero, IV -- 22.2.96
3 Dave Shadoff -- 20.3.96
4 Zeograd -- 26.5.99
5
6 line-formatting routines for disassembler
7 ****************************************************************************/
8
9 #include <stdio.h>
10 #include <stdlib.h>
11
12 #include "format.h"
13
14
15 /* lineprinters, to keep code clean. */
16 /*@ -bufferoverflowhigh */
17
18 void
lineprint1(char * outf,long ctr,unsigned char * op,char * outstring)19 lineprint1 (char *outf, long ctr, unsigned char *op, char *outstring)
20 {
21 sprintf (outf, "%02X %s", *op, outstring);
22 }
23
24 void
lineprint2(char * outf,long ctr,unsigned char * op,char * outstring)25 lineprint2 (char *outf, long ctr, unsigned char *op, char *outstring)
26 {
27 sprintf (outf, "%02X %02X %s", *op, *(op + 1), outstring);
28 }
29
30 void
lineprint3(char * outf,long ctr,unsigned char * op,char * outstring)31 lineprint3 (char *outf, long ctr, unsigned char *op, char *outstring)
32 {
33 sprintf (outf, "%02X %02X %02X %s", *op, *(op + 1), *(op + 2),
34 outstring);
35 }
36
37 void
lineprint4(char * outf,long ctr,unsigned char * op,char * outstring)38 lineprint4 (char *outf, long ctr, unsigned char *op, char *outstring)
39 {
40 sprintf (outf, "%02X %02X %02X %02X %s", *op, *(op + 1), *(op + 2),
41 *(op + 3), outstring);
42 }
43
44 void
lineprint7(char * outf,long ctr,unsigned char * op,char * outstring)45 lineprint7 (char *outf, long ctr, unsigned char *op, char *outstring)
46 {
47 sprintf (outf, "%02X %02X %02X %02X %02X %02X %02X %s",
48 *op, *(op + 1), *(op + 2), *(op + 3), *(op + 4),
49 *(op + 5), *(op + 6), outstring);
50 }
51
52
53 /* common addressing-mode formatters */
54 /* look/act as wrappers around lineprint functions */
55
56 void
implicit(char * outf,long ctr,unsigned char * op,char * str)57 implicit (char *outf, long ctr, unsigned char *op, char *str)
58 {
59 char buf[256];
60 sprintf (buf, "%-4s", str);
61 lineprint1 (outf, ctr, op, buf);
62 }
63
64 void
immed(char * outf,long ctr,unsigned char * op,char * str)65 immed (char *outf, long ctr, unsigned char *op, char *str)
66 {
67 char buf[256];
68 sprintf (buf, "%-4s #$%02X", str, *(op + 1));
69 lineprint2 (outf, ctr, op, buf);
70 }
71
72 void
relative(char * outf,long ctr,unsigned char * op,char * str)73 relative (char *outf, long ctr, unsigned char *op, char *str)
74 {
75 char buf[256];
76 long newadd;
77 int offset = (int) *(op + 1);
78
79
80 if (offset >= 128)
81 offset -= 256;
82
83 newadd = (ctr + 2) + offset;
84
85 sprintf (buf, "%-4s $%04lX", str, (unsigned long)newadd);
86 lineprint2 (outf, ctr, op, buf);
87 }
88
89 void
ind_zp(char * outf,long ctr,unsigned char * op,char * str)90 ind_zp (char *outf, long ctr, unsigned char *op, char *str)
91 {
92 char buf[256];
93 sprintf (buf, "%-4s $%02X", str, *(op + 1));
94 lineprint2 (outf, ctr, op, buf);
95 }
96
97 void
ind_zpx(char * outf,long ctr,unsigned char * op,char * str)98 ind_zpx (char *outf, long ctr, unsigned char *op, char *str)
99 {
100 char buf[256];
101 sprintf (buf, "%-4s $%02X,X", str, *(op + 1));
102 lineprint2 (outf, ctr, op, buf);
103 }
104
105 void
ind_zpy(char * outf,long ctr,unsigned char * op,char * str)106 ind_zpy (char *outf, long ctr, unsigned char *op, char *str)
107 {
108 char buf[256];
109 sprintf (buf, "%-4s $%02X,Y", str, *(op + 1));
110 lineprint2 (outf, ctr, op, buf);
111 }
112
113 void
ind_zpind(char * outf,long ctr,unsigned char * op,char * str)114 ind_zpind (char *outf, long ctr, unsigned char *op, char *str)
115 {
116 char buf[256];
117 sprintf (buf, "%-4s ($%02X)", str, *(op + 1));
118 lineprint2 (outf, ctr, op, buf);
119 }
120
121 void
ind_zpix(char * outf,long ctr,unsigned char * op,char * str)122 ind_zpix (char *outf, long ctr, unsigned char *op, char *str)
123 {
124 char buf[256];
125 sprintf (buf, "%-4s ($%02X,X)", str, *(op + 1));
126 lineprint2 (outf, ctr, op, buf);
127 }
128
129 void
ind_zpiy(char * outf,long ctr,unsigned char * op,char * str)130 ind_zpiy (char *outf, long ctr, unsigned char *op, char *str)
131 {
132 char buf[256];
133 sprintf (buf, "%-4s ($%02X),Y", str, *(op + 1));
134 lineprint2 (outf, ctr, op, buf);
135 }
136
137 void
absol(char * outf,long ctr,unsigned char * op,char * str)138 absol (char *outf, long ctr, unsigned char *op, char *str)
139 {
140 char buf[256];
141 sprintf (buf, "%-4s $%02X%02X", str, *(op + 2), *(op + 1));
142 lineprint3 (outf, ctr, op, buf);
143 }
144
145 void
absind(char * outf,long ctr,unsigned char * op,char * str)146 absind (char *outf, long ctr, unsigned char *op, char *str)
147 {
148 char buf[256];
149 sprintf (buf, "%-4s ($%02X%02X)", str, *(op + 2), *(op + 1));
150 lineprint3 (outf, ctr, op, buf);
151 }
152
153 void
absindx(char * outf,long ctr,unsigned char * op,char * str)154 absindx (char *outf, long ctr, unsigned char *op, char *str)
155 {
156 char buf[256];
157 sprintf (buf, "%-4s ($%02X%02X,X)", str, *(op + 2), *(op + 1));
158 lineprint3 (outf, ctr, op, buf);
159 }
160
161 void
absx(char * outf,long ctr,unsigned char * op,char * str)162 absx (char *outf, long ctr, unsigned char *op, char *str)
163 {
164 char buf[256];
165 sprintf (buf, "%-4s $%02X%02X,X", str, *(op + 2), *(op + 1));
166 lineprint3 (outf, ctr, op, buf);
167 }
168
169 void
absy(char * outf,long ctr,unsigned char * op,char * str)170 absy (char *outf, long ctr, unsigned char *op, char *str)
171 {
172 char buf[256];
173 sprintf (buf, "%-4s $%02X%02X,Y", str, *(op + 2), *(op + 1));
174 lineprint3 (outf, ctr, op, buf);
175 }
176
177 void
pseudorel(char * outf,long ctr,unsigned char * op,char * str)178 pseudorel (char *outf, long ctr, unsigned char *op, char *str)
179 {
180 char buf[256];
181 long newadd;
182 int offset = (int) *(op + 2);
183
184 if (offset >= 128)
185 offset -= 256;
186
187 newadd = (ctr + 3) + offset;
188
189 sprintf (buf, "%-4s $%02X, $%04lX", str, *(op + 1), (unsigned long)newadd);
190 lineprint3 (outf, ctr, op, buf);
191 }
192
193 void
tst_zp(char * outf,long ctr,unsigned char * op,char * str)194 tst_zp (char *outf, long ctr, unsigned char *op, char *str)
195 {
196 char buf[256];
197
198 sprintf (buf, "%-4s $%02X, $%02X", str, *(op + 1), *(op + 2));
199 lineprint3 (outf, ctr, op, buf);
200 }
201
202 void
tst_abs(char * outf,long ctr,unsigned char * op,char * str)203 tst_abs (char *outf, long ctr, unsigned char *op, char *str)
204 {
205 char buf[256];
206
207 sprintf (buf, "%-4s $%02X, $%02X%02X", str, *(op + 1), *(op + 3),
208 *(op + 2));
209 lineprint4 (outf, ctr, op, buf);
210 }
211
212 void
tst_zpx(char * outf,long ctr,unsigned char * op,char * str)213 tst_zpx (char *outf, long ctr, unsigned char *op, char *str)
214 {
215 char buf[256];
216
217 sprintf (buf, "%-4s $%02X, $%02X", str, *(op + 1), *(op + 2));
218 lineprint3 (outf, ctr, op, buf);
219 }
220
221 void
tst_absx(char * outf,long ctr,unsigned char * op,char * str)222 tst_absx (char *outf, long ctr, unsigned char *op, char *str)
223 {
224 char buf[256];
225
226 sprintf (buf, "%-4s $%02X, $%02X%02X", str, *(op + 1), *(op + 3),
227 *(op + 2));
228 lineprint4 (outf, ctr, op, buf);
229 }
230
231 void
xfer(char * outf,long ctr,unsigned char * op,char * str)232 xfer (char *outf, long ctr, unsigned char *op, char *str)
233 {
234 char buf[256];
235
236 sprintf (buf, "%-4s $%02X%02X, $%02X%02X, $%02X%02X",
237 str, *(op + 2), *(op + 1), *(op + 4), *(op + 3), *(op + 6),
238 *(op + 5));
239 lineprint7 (outf, ctr, op, buf);
240 }
241
242 /*@ =bufferoverflowhigh */
243