Browse Source

improved printf

ceriel 36 years ago
parent
commit
24ae923037
1 changed files with 84 additions and 124 deletions
  1. 84 124
      mach/m68k4/libem/printf.s

+ 84 - 124
mach/m68k4/libem/printf.s

@@ -1,128 +1,88 @@
-.define _printn
 .define _printf
-.extern _printf
-.sect .text;.sect .rom;.sect .data;.sect .bss
 .sect .text
-_putchar:
-move.l	#1,-(sp)
-lea	8(sp),a0
-move.l	8(sp),d0
-move.b	d0,(a0)
-move.l	a0,-(sp)
-move.l	#1,-(sp)
-jsr	_write
-add.l	#12,sp
-rts
-_printf:
-tst.b -56(sp)
-link	a6,#-16
-!Local -4 into d7
-!Local -12 into d6
-!Local -8 into a5
-!Local 8 into a4
-!Local -16 into a3
-movem.l d7/d6/a5/a4/a3,-(sp)
-move.l 8(a6),a4
-lea 12(a6),a1
-move.l a1, a5
-I0014:
-move.l a4, a0
-add.l #1,a4
-clr.l d0
-move.b (a0),d0
-move.l d0, d7
-cmp.l #37,d7
-beq I0015
-tst.l d7
-beq I0012
-move.l d7,-(sp)
-jsr _putchar
-add #4,sp
-jmp I0014
-I0015:
-move.l a4, a0
-add.l #1,a4
-clr.l d0
-move.b (a0),d0
-move.l d0, d7
-cmp.l #100,d7
-beq I0018
-cmp.l #117,d7
-bne I0017
-I0018:
-move.l a5, a0
-add.l #4,a5
-move.l (a0), d6
-cmp.l #100,d7
-bne I0019
-tst.l d6
-bge I0019
-clr.l d2
-sub.l d6,d2
-move.l d2, d6
-pea 45
-jsr _putchar
-add #4,sp
-I0019:
-move.l d6,-(sp)
-jsr _printn
-add #4,sp
-jmp I0014
-I0017:
-cmp.l #115,d7
-bne I0014
-move.l a5, a0
-add.l #4,a5
-move.l (a0), a3
-I001c:
-move.l a3, a0
-add.l #1,a3
-clr.l d0
-move.b (a0),d0
-move.l d0, d7
-tst.l d7
-beq I0014
-move.l d7,-(sp)
-jsr _putchar
-add #4,sp
-jmp I001c
-I0012:
-movem.l (sp)+,d7/d6/a5/a4/a3
-unlk a6
-rts
-.extern _printn
-_printn:
-tst.b -44(sp)
-link	a6,#-4
-!Local -4 into d7
-move.l d7,-(sp)
+.sect .rom
+.sect .data
+.sect .bss
+.sect .bss
+_getal:
+	.space	12
+_char:
+	.space	1
+	.align  4
 .sect .data
-_14:
-.data4	808530483
-.data4	875902519
-.data4	943259648
+hexs:
+	.ascii	"0123456789abcdef"
+	.align	4
 .sect .text
-move.l 8(a6),-(sp)
-pea 10
-jsr .dvu
-move.l d1, d7
-tst.l d7
-beq I0023
-move.l d7,-(sp)
-jsr _printn
-add #4,sp
-I0023:
-pea _14
-move.l 8(a6),-(sp)
-pea 10
-jsr .dvu
-move.l (sp)+,a1
-add.l d2,a1
-clr.l d0
-move.b (a1),d0
-move.l d0,-(sp)
-jsr _putchar
-add #4,sp
-move.l (sp)+,d7
-unlk a6
-rts
+_printf:
+	movem.l	d0/d1/d2/a0/a1/a2/a3/a4/a5/a6, -(sp)
+	lea	44(sp), a6	! a6 <- address of arguments
+	move.l	(a6)+, a5	! a5 <- address of format
+next:	move.b	(a5)+, d0
+	beq	out
+	cmp.b	#'%', d0
+	beq	procnt
+put:	move.l	d0, -(sp)
+	jsr	_putchar	! long argument on stack
+	tst.l	(sp)+
+	bra	next
+
+procnt:	move.b	(a5)+, d0
+	cmp.b	#'d', d0	! NOTE: %d means unsigned.
+	beq	digit
+	cmp.b	#'x', d0
+	beq	hex
+	cmp.b	#'s', d0
+	beq	string
+	cmp.b	#'%', d0	! second % has to be printed.
+	beq	put
+	tst.b	-(a5)		! normal char should be printed
+	bra	next
+
+string:	move.l	(a6)+, a2	! a2 <- address of string
+sloop:	move.b	(a2)+, d0
+	beq	next
+	move.l	d0, -(sp)
+	jsr	_putchar	! long argument on stack
+	tst.l	(sp)+
+	bra	sloop
+
+digit:	move.l	(a6)+, d1	! d1 <- integer
+	move.l	#_getal+12, a2	! a2 <- ptr to last part of buf
+	clr.b	-(a2)		! stringterminator
+1:	
+	move.l	d1,-(sp)
+	move.l	#10,-(sp)
+	jsr	.dvu		! d1 <- qotient; d0 <- remainder
+	add.l	#'0', d0
+	move.b	d0, -(a2)
+	tst.l	d1		! if quotient = 0 then ready
+	bne	1b
+	bra	sloop		! print digitstring.
+
+hex:	move.l	(a6)+, d1	! d1 <- integer
+	move.l	#_getal+12, a2	! a2 <- ptr to last part of buf
+	clr.b	-(a2)		! stringterminator
+	move.l	#7, d2		! loop control
+1:	move.l	d1, d0
+	and.l	#15, d0
+	move.l	#hexs,a0
+	add.l	d0,a0
+	move.b	(a0), -(a2) ! hex digit
+	asr.l	#4, d1
+	dbf	d2, 1b
+	bra	sloop
+
+out:
+	movem.l	(sp)+, d0/d1/d2/a0/a1/a2/a3/a4/a5/a6
+	rts
+
+
+_putchar:
+	move.l	#1, -(sp)
+	pea	11(sp)
+	move.l	#1, -(sp)
+	jsr	_write
+	lea	12(sp), sp
+	rts
+.align 2