BSD 2 development
[unix-history] / src / ex / doprnt.s
CommitLineData
ba695518
BJ
1/ C library -- conversions
2
3width=-8.
4formp=-10.
5rjust=-12.
6ndfnd=-14.
7ndigit=-16.
8zfill=-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
24loop:
25 mov sp,r3
26 mov formp(r5),r1
272:
28 movb (r1)+,r2
29 beq 2f
30 cmp r2,$'%
31 beq 2f
32 movb r2,(r3)+
33 br 2b
342:
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
462:
47 tst r2
48 bne 2f
49 jmp cret
502:
51 mov sp,r3
522:
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)
602:
61 cmpb *formp(r5),$'0
62 bne 2f
63 mov $'0,zfill(r5)
642:
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)
721:
73 mov $swtab,r1
741:
75 mov (r1)+,r2
76 bne 2f
77 movb r0,(r3)+
78 jmp prbuf
792:
80 cmp r0,(r1)+
81 bne 1b
82 jmp (r2)
83 .data
84swtab:
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
104general:
105 mov ndigit(r5),r0
106 mov ndfnd(r5),r2
107 jsr pc,pgen
108 jbr prbuf
109
110longorunsg:
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
124octal:
125 clr r0
126 br 1f
127loct:
128 mov (r4)+,r0
1291:
130 mov $8.,r2
131 br 2f
132
133hex:
134 clr r0
135 br 1f
136
137lhex:
138 mov (r4)+,r0
1391:
140 mov $16.,r2
1412:
142 mov (r4)+,r1
143 br compute
144
145decimal:
146 mov (r4)+,r1
147 sxt r0
148 bmi 3f
149 br 2f
150
151unsigned:
152 clr r0
153 br 1f
154
155long:
156 mov (r4)+,r0
157 bge 1f
158 mov (r4)+,r1
1593:
160 neg r0
161 neg r1
162 sbc r0
163 movb $'-,(r3)+
164 br 2f
165
166lunsigned:
167 mov (r4)+,r0
1681:
169 mov (r4)+,r1
1702:
171 mov $10.,r2
172
173/
174/ Algorithm courtesy Keith Davis
175/
176compute:
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)+
1881:
189 jsr pc,1f
190 mov (sp)+,r4
191 mov (sp)+,r5
192 br prbuf
193
1941:
195 clr r0
196 mov r4,r1
197 beq 2f
198 div r2,r0
199 mov r0,r4
200 mov r1,r0
2012:
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
2112:
212 mov r1,-(sp)
213 mov r0,r5
214 bne 2f
215 tst r4
216 beq 1f
2172:
218 jsr pc,1b
2191:
220 mov (sp)+,r0
221 add $'0,r0
222 cmp r0,$'9
223 ble 1f
224 add $'a-'0-10.,r0
2251:
226 movb r0,(r3)+
227 rts pc
228
229charac:
230 movb (r4)+,(r3)+
231 bne 1f
232 dec r3
2331:
234 movb (r4)+,(r3)+
235 bne prbuf
236 dec r3
237 br prbuf
238
239string:
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)
2471:
248 tstb (r2)+
249 beq 1f
250 inc r3
251 sob r1,1b
2521:
253 mov (r4)+,r2
254 br prstr
255
256float:
257 mov ndigit(r5),r0
258 mov ndfnd(r5),r2
259 jsr pc,pfloat
260 br prbuf
261
262scien:
263 mov ndigit(r5),r0
264 inc r0
265 tst ndfnd(r5)
266 bne 1f
267 mov $7,r0
2681:
269 mov pc,r2
270 jsr pc,pscien
271 br prbuf
272
273remote:
274 mov (r4)+,r4
275 mov (r4)+,formp(r5)
276 jmp loop
277
278prbuf:
279 mov sp,r2
280prstr:
281 sub r2,r3
282 mov width(r5),r1
283 sub r3,r1
284 bge 1f
285 clr r1
2861:
287 tst rjust(r5)
288 bne 1f
289 neg r1
2901:
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
300gnum:
301 clr ndfnd(r5)
302 clr r1
3031:
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
3112:
312 cmp r0,$9.
313 bhi 1f
3143:
315 inc ndfnd(r5)
316 mul $10.,r1
317 add r0,r1
318 br 1b
3191:
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
331nulstr:
332 <(null)\0>