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