78 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| .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
 |