Commit | Line | Data |
---|---|---|
ba695518 BJ |
1 | / C library -- conversions |
2 | ||
3 | width=-8. | |
4 | formp=-10. | |
5 | rjust=-12. | |
6 | ndfnd=-14. | |
7 | ndigit=-16. | |
8 | zfill=-18. | |
9 | .globl __doprnt | |
10 | ||
11 | .globl pfloat | |
12 | .globl pscien | |
13 | .globl pgen | |
14 | ||
15 | .globl __strout | |
16 | .globl csv | |
17 | .globl cret | |
18 | ||
19 | __doprnt: | |
20 | jsr r5,csv | |
21 | sub $128.+12.,sp | |
22 | mov 4(r5),formp(r5) / format | |
23 | mov 6(r5),r4 | |
24 | loop: | |
25 | mov sp,r3 | |
26 | mov formp(r5),r1 | |
27 | 2: | |
28 | movb (r1)+,r2 | |
29 | beq 2f | |
30 | cmp r2,$'% | |
31 | beq 2f | |
32 | movb r2,(r3)+ | |
33 | br 2b | |
34 | 2: | |
35 | mov r1,formp(r5) | |
36 | cmp r3,sp | |
37 | beq 2f | |
38 | mov sp,r0 | |
39 | mov 8(r5),-(sp) | |
40 | clr -(sp) | |
41 | mov r3,-(sp) | |
42 | sub r0,(sp) | |
43 | mov r0,-(sp) | |
44 | jsr pc,__strout | |
45 | add $8,sp | |
46 | 2: | |
47 | tst r2 | |
48 | bne 2f | |
49 | jmp cret | |
50 | 2: | |
51 | mov sp,r3 | |
52 | 2: | |
53 | clr rjust(r5) | |
54 | clr ndigit(r5) | |
55 | mov $' ,zfill(r5) | |
56 | cmpb *formp(r5),$'- | |
57 | bne 2f | |
58 | inc formp(r5) | |
59 | inc rjust(r5) | |
60 | 2: | |
61 | cmpb *formp(r5),$'0 | |
62 | bne 2f | |
63 | mov $'0,zfill(r5) | |
64 | 2: | |
65 | jsr r3,gnum | |
66 | mov r1,width(r5) | |
67 | clr ndfnd(r5) | |
68 | cmp r0,$'. | |
69 | bne 1f | |
70 | jsr r3,gnum | |
71 | mov r1,ndigit(r5) | |
72 | 1: | |
73 | mov $swtab,r1 | |
74 | 1: | |
75 | mov (r1)+,r2 | |
76 | bne 2f | |
77 | movb r0,(r3)+ | |
78 | jmp prbuf | |
79 | 2: | |
80 | cmp r0,(r1)+ | |
81 | bne 1b | |
82 | jmp (r2) | |
83 | .data | |
84 | swtab: | |
85 | decimal; 'd | |
86 | octal; 'o | |
87 | hex; 'x | |
88 | float; 'f | |
89 | scien; 'e | |
90 | general; 'g | |
91 | charac; 'c | |
92 | string; 's | |
93 | longorunsg; 'l | |
94 | longorunsg; 'L | |
95 | unsigned; 'u | |
96 | remote; 'r | |
97 | long; 'D | |
98 | loct; 'O | |
99 | lhex; 'X | |
100 | lunsigned; 'U | |
101 | 0; 0 | |
102 | .text | |
103 | ||
104 | general: | |
105 | mov ndigit(r5),r0 | |
106 | mov ndfnd(r5),r2 | |
107 | jsr pc,pgen | |
108 | jbr prbuf | |
109 | ||
110 | longorunsg: | |
111 | movb *formp(r5),r0 | |
112 | inc formp(r5) | |
113 | cmp r0,$'o | |
114 | beq loct | |
115 | cmp r0,$'x | |
116 | beq lhex | |
117 | cmp r0,$'d | |
118 | beq long | |
119 | cmp r0,$'u | |
120 | beq lunsigned | |
121 | dec formp(r5) | |
122 | br unsigned | |
123 | ||
124 | octal: | |
125 | clr r0 | |
126 | br 1f | |
127 | loct: | |
128 | mov (r4)+,r0 | |
129 | 1: | |
130 | mov $8.,r2 | |
131 | br 2f | |
132 | ||
133 | hex: | |
134 | clr r0 | |
135 | br 1f | |
136 | ||
137 | lhex: | |
138 | mov (r4)+,r0 | |
139 | 1: | |
140 | mov $16.,r2 | |
141 | 2: | |
142 | mov (r4)+,r1 | |
143 | br compute | |
144 | ||
145 | decimal: | |
146 | mov (r4)+,r1 | |
147 | sxt r0 | |
148 | bmi 3f | |
149 | br 2f | |
150 | ||
151 | unsigned: | |
152 | clr r0 | |
153 | br 1f | |
154 | ||
155 | long: | |
156 | mov (r4)+,r0 | |
157 | bge 1f | |
158 | mov (r4)+,r1 | |
159 | 3: | |
160 | neg r0 | |
161 | neg r1 | |
162 | sbc r0 | |
163 | movb $'-,(r3)+ | |
164 | br 2f | |
165 | ||
166 | lunsigned: | |
167 | mov (r4)+,r0 | |
168 | 1: | |
169 | mov (r4)+,r1 | |
170 | 2: | |
171 | mov $10.,r2 | |
172 | ||
173 | / | |
174 | / Algorithm courtesy Keith Davis | |
175 | / | |
176 | compute: | |
177 | mov r5,-(sp) | |
178 | mov r4,-(sp) | |
179 | mov r0,r4 | |
180 | mov ndigit(r5),r0 / patch | |
181 | mov r1,r5 | |
182 | ashc $0,r4 | |
183 | beq 1f | |
184 | / tst ndigit(r5) | |
185 | tst r0 / patch | |
186 | beq 1f | |
187 | movb $'0,(r3)+ | |
188 | 1: | |
189 | jsr pc,1f | |
190 | mov (sp)+,r4 | |
191 | mov (sp)+,r5 | |
192 | br prbuf | |
193 | ||
194 | 1: | |
195 | clr r0 | |
196 | mov r4,r1 | |
197 | beq 2f | |
198 | div r2,r0 | |
199 | mov r0,r4 | |
200 | mov r1,r0 | |
201 | 2: | |
202 | mov r5,r1 | |
203 | asl r2 | |
204 | div r2,r0 | |
205 | asr r2 | |
206 | asl r0 | |
207 | cmp r2,r1 | |
208 | bgt 2f | |
209 | sub r2,r1 | |
210 | inc r0 | |
211 | 2: | |
212 | mov r1,-(sp) | |
213 | mov r0,r5 | |
214 | bne 2f | |
215 | tst r4 | |
216 | beq 1f | |
217 | 2: | |
218 | jsr pc,1b | |
219 | 1: | |
220 | mov (sp)+,r0 | |
221 | add $'0,r0 | |
222 | cmp r0,$'9 | |
223 | ble 1f | |
224 | add $'a-'0-10.,r0 | |
225 | 1: | |
226 | movb r0,(r3)+ | |
227 | rts pc | |
228 | ||
229 | charac: | |
230 | movb (r4)+,(r3)+ | |
231 | bne 1f | |
232 | dec r3 | |
233 | 1: | |
234 | movb (r4)+,(r3)+ | |
235 | bne prbuf | |
236 | dec r3 | |
237 | br prbuf | |
238 | ||
239 | string: | |
240 | mov ndigit(r5),r1 | |
241 | mov (r4),r2 | |
242 | mov r2,r3 | |
243 | bne 1f | |
244 | mov $nulstr,r2 | |
245 | mov r2,r3 | |
246 | mov r2,(r4) | |
247 | 1: | |
248 | tstb (r2)+ | |
249 | beq 1f | |
250 | inc r3 | |
251 | sob r1,1b | |
252 | 1: | |
253 | mov (r4)+,r2 | |
254 | br prstr | |
255 | ||
256 | float: | |
257 | mov ndigit(r5),r0 | |
258 | mov ndfnd(r5),r2 | |
259 | jsr pc,pfloat | |
260 | br prbuf | |
261 | ||
262 | scien: | |
263 | mov ndigit(r5),r0 | |
264 | inc r0 | |
265 | tst ndfnd(r5) | |
266 | bne 1f | |
267 | mov $7,r0 | |
268 | 1: | |
269 | mov pc,r2 | |
270 | jsr pc,pscien | |
271 | br prbuf | |
272 | ||
273 | remote: | |
274 | mov (r4)+,r4 | |
275 | mov (r4)+,formp(r5) | |
276 | jmp loop | |
277 | ||
278 | prbuf: | |
279 | mov sp,r2 | |
280 | prstr: | |
281 | sub r2,r3 | |
282 | mov width(r5),r1 | |
283 | sub r3,r1 | |
284 | bge 1f | |
285 | clr r1 | |
286 | 1: | |
287 | tst rjust(r5) | |
288 | bne 1f | |
289 | neg r1 | |
290 | 1: | |
291 | mov zfill(r5),-(sp) | |
292 | mov 8(r5),-(sp) | |
293 | mov r1,-(sp) | |
294 | mov r3,-(sp) | |
295 | mov r2,-(sp) | |
296 | jsr pc,__strout | |
297 | add $10.,sp | |
298 | jmp loop | |
299 | ||
300 | gnum: | |
301 | clr ndfnd(r5) | |
302 | clr r1 | |
303 | 1: | |
304 | movb *formp(r5),r0 | |
305 | inc formp(r5) | |
306 | sub $'0,r0 | |
307 | cmp r0,$'*-'0 | |
308 | bne 2f | |
309 | mov (r4)+,r0 | |
310 | br 3f | |
311 | 2: | |
312 | cmp r0,$9. | |
313 | bhi 1f | |
314 | 3: | |
315 | inc ndfnd(r5) | |
316 | mul $10.,r1 | |
317 | add r0,r1 | |
318 | br 1b | |
319 | 1: | |
320 | add $'0,r0 | |
321 | rts r3 | |
322 | ||
323 | /.bss | |
324 | /width: .=.+2 | |
325 | /formp: .=.+2 | |
326 | /rjust: .=.+2 | |
327 | /ndfnd: .=.+2 | |
328 | /ndigit: .=.+2 | |
329 | /zfill: .=.+2 | |
330 | .data | |
331 | nulstr: | |
332 | <(null)\0> |