.define _printf
.define _putchar
.define _getal
.define _char
.bss
_getal:
	.space	12
_char:
	.space	1
	.align  2
.data
sav:
	.long	0
.text
_printf:
	movem.l	d0/d1/d2/a0/a1/a2/a3/a4/a5/a6,.savreg
	move.l	(sp)+,sav	!return address
	move.l	sp,a6		!a6 <- address of arguments
	move.l	(a6)+,a5	!a5 <- address of format
	clr.l	d0		!d0 <- char to be printed
next:	move.b	(a5)+,d0
	beq	out
	cmp.b	#'%',d0
	beq	procnt
put:	move.l	d0,-(sp)
	jsr	_putchar	!argument is long en op de stack
	tst.l	(sp)+
	jmp	next

procnt:	move.b	(a5)+,d0
	cmp.b	#'d',d0		!NOTE: %d means unsigned.
	beq	digit
	cmp.b	#'s',d0
	beq	string
	cmp.b	#'%',d0		!second % has to be printed.
	beq	put
	tst.b	-(a5)		!normal char should be printed
	jmp	next

string:	move.l	(a6)+,a2	!a2 <- address of string
sloop:	move.b	(a2)+,d0
	beq	next
	move.l	d0,-(sp)
	jsr	_putchar	!argument is long en op de stack
	tst.l	(sp)+
	jmp	sloop

digit:	move.l	(a6)+,d1	!d1 <- integer
	move.l	#_getal+12,a3	!a3 <- ptr to last part of buf
	move.b	#0,-(a3)	!stringterminator
dloop:	move.l	d1,-(sp)
	move.l	#10,-(sp)
	jsr	.dvu		!d1 <- quotient d2 <- remainder
	add.l	#'0',d2
	move.b	d2,-(a3)
	tst.l	d1		!if quotient = 0 then ready
	bne	dloop
	move.l	a3,a2
	jmp	sloop		!print digitstring.

out:
	move.l	sav,-(sp)
	movem.l	.savreg,d0/d1/d2/a0/a1/a2/a3/a4/a5/a6
	rts


_putchar:
	movem.l	d0,.savreg
	move.l	4(sp),d0
	move.b	d0,_char
	move.l	#1,-(sp)
	move.l	#_char,-(sp)
	move.l	#1,-(sp)
	jsr	_write
	add.l	#12,sp
	movem.l	.savreg,d0
	rts
.align 2
