xref: /original-bsd/usr.bin/ex/OTHER/ovdoprnt.s (revision bafc759a)
1/ Copyright (c) 1991 The Regents of the University of California.
2/ All rights reserved.
3/
4/ %sccs.include.proprietary.c%
5/
6/	@(#)ovdoprnt.s	1.3 (Berkeley) 04/17/91
7/
8
9/ C library -- conversions
10/ Overlay modification -- wfj 8/80
11/ stack frame is one word larger...
12
13/ width=-8.
14/ formp=-10.
15/ rjust=-12.
16/ ndfnd=-14.
17/ ndigit=-16.
18/ zfill=-18.
19width=-10.
20formp=-12.
21rjust=-14.
22ndfnd=-16.
23ndigit=-18.
24zfill=-20.
25.globl	__doprnt
26
27.globl	__strout
28.globl	csv
29.globl	cret
30
31__doprnt:
32	jsr	r5,csv
33	sub	$128.+12.,sp
34	mov	4(r5),formp(r5)		/ format
35	mov	6(r5),r4
36loop:
37	mov	sp,r3
38	mov	formp(r5),r1
392:
40	movb	(r1)+,r2
41	beq	2f
42	cmp	r2,$'%
43	beq	2f
44	movb	r2,(r3)+
45	br	2b
462:
47	mov	r1,formp(r5)
48	cmp	r3,sp
49	beq	2f
50	mov	sp,r0
51	mov	8(r5),-(sp)
52	clr	-(sp)
53	mov	r3,-(sp)
54	sub	r0,(sp)
55	mov	r0,-(sp)
56	jsr	pc,__strout
57	add	$8,sp
582:
59	tst	r2
60	bne	2f
61	jmp	cret
622:
63	mov	sp,r3
642:
65	clr	rjust(r5)
66	clr	ndigit(r5)
67	mov	$' ,zfill(r5)
68	cmpb	*formp(r5),$'-
69	bne	2f
70	inc	formp(r5)
71	inc	rjust(r5)
722:
73	cmpb	*formp(r5),$'0
74	bne	2f
75	mov	$'0,zfill(r5)
762:
77	jsr	r3,gnum
78	mov	r1,width(r5)
79	clr	ndfnd(r5)
80	cmp	r0,$'.
81	bne	1f
82	jsr	r3,gnum
83	mov	r1,ndigit(r5)
841:
85	mov	$swtab,r1
861:
87	mov	(r1)+,r2
88	bne	2f
89	movb	r0,(r3)+
90	jmp	prbuf
912:
92	cmp	r0,(r1)+
93	bne	1b
94	jmp	(r2)
95	.data
96swtab:
97	decimal;	'd
98	octal;		'o
99	hex;		'x
100	charac;		'c
101	string;		's
102	longorunsg;	'l
103	longorunsg;	'L
104	unsigned;	'u
105	remote;		'r
106	long;		'D
107	loct;		'O
108	lhex;		'X
109	lunsigned;	'U
110	0;  0
111	.text
112
113longorunsg:
114	movb	*formp(r5),r0
115	inc	formp(r5)
116	cmp	r0,$'o
117	beq	loct
118	cmp	r0,$'x
119	beq	lhex
120	cmp	r0,$'d
121	beq	long
122	cmp	r0,$'u
123	beq	lunsigned
124	dec	formp(r5)
125	br	unsigned
126
127octal:
128	clr	r0
129	br	1f
130loct:
131	mov	(r4)+,r0
1321:
133	mov	$8.,r2
134	br	2f
135
136hex:
137	clr	r0
138	br	1f
139
140lhex:
141	mov	(r4)+,r0
1421:
143	mov	$16.,r2
1442:
145	mov	(r4)+,r1
146	br	compute
147
148decimal:
149	mov	(r4)+,r1
150	sxt	r0
151	bmi	3f
152	br	2f
153
154unsigned:
155	clr	r0
156	br	1f
157
158long:
159	mov	(r4)+,r0
160	bge	1f
161	mov	(r4)+,r1
1623:
163	neg	r0
164	neg	r1
165	sbc	r0
166	movb	$'-,(r3)+
167	br	2f
168
169lunsigned:
170	mov	(r4)+,r0
1711:
172	mov	(r4)+,r1
1732:
174	mov	$10.,r2
175
176/
177/ Algorithm courtesy Keith Davis
178/
179compute:
180	mov	r5,-(sp)
181	mov	r4,-(sp)
182	mov	r0,r4
183	mov	ndigit(r5),r0
184	mov	r1,r5
185	ashc	$0,r4
186	beq	1f
187	tst	r0
188	beq	1f
189	movb	$'0,(r3)+
1901:
191	jsr	pc,1f
192	mov	(sp)+,r4
193	mov	(sp)+,r5
194	br	prbuf
195
1961:
197	clr	r0
198	mov	r4,r1
199	beq	2f
200	div	r2,r0
201	mov	r0,r4
202	mov	r1,r0
2032:
204	mov	r5,r1
205	asl	r2
206	div	r2,r0
207	asr	r2
208	asl	r0
209	cmp	r2,r1
210	bgt	2f
211	sub	r2,r1
212	inc	r0
2132:
214	mov	r1,-(sp)
215	mov	r0,r5
216	bne	2f
217	tst	r4
218	beq	1f
2192:
220	jsr	pc,1b
2211:
222	mov	(sp)+,r0
223	add	$'0,r0
224	cmp	r0,$'9
225	ble	1f
226	add	$'a-'0-10.,r0
2271:
228	movb	r0,(r3)+
229	rts	pc
230
231charac:
232	mov	$' ,zfill(r5)
233	mov	(r4)+,r0
234	bic	$!377,r0
235	beq	prbuf
236	movb	r0,(r3)+
237	br	prbuf
238
239string:
240	mov	$' ,zfill(r5)
241	mov	ndigit(r5),r1
242	mov	(r4),r2
243	mov	r2,r3
244	bne	1f
245	mov	$nulstr,r2
246	mov	r2,r3
247	mov	r2,(r4)
2481:
249	tstb	(r2)+
250	beq	1f
251	inc	r3
252	sob	r1,1b
2531:
254	mov	(r4)+,r2
255	br	prstr
256
257remote:
258	mov	(r4)+,r4
259	mov	(r4)+,formp(r5)
260	jmp	loop
261
262prbuf:
263	mov	sp,r2
264prstr:
265	sub	r2,r3
266	mov	width(r5),r1
267	sub	r3,r1
268	bge	1f
269	clr	r1
2701:
271	tst	rjust(r5)
272	bne	1f
273	neg	r1
2741:
275	mov	zfill(r5),-(sp)
276	mov	8(r5),-(sp)
277	mov	r1,-(sp)
278	mov	r3,-(sp)
279	mov	r2,-(sp)
280	jsr	pc,__strout
281	add	$10.,sp
282	jmp	loop
283
284gnum:
285	clr	ndfnd(r5)
286	clr	r1
2871:
288	movb	*formp(r5),r0
289	inc	formp(r5)
290	sub	$'0,r0
291	cmp	r0,$'*-'0
292	bne	2f
293	mov	(r4)+,r0
294	br	3f
2952:
296	cmp	r0,$9.
297	bhi	1f
2983:
299	inc	ndfnd(r5)
300	mul	$10.,r1
301	add	r0,r1
302	br	1b
3031:
304	add	$'0,r0
305	rts	r3
306
307.data
308nulstr:
309	<(null)\0>
310