101 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| .define .sar
 | |
| .define .lar
 | |
| .define .aar
 | |
| .sect .text
 | |
| .sect .rom
 | |
| .sect .data
 | |
| .sect .bss
 | |
| 
 | |
| 	!register usage:
 | |
| 	! a0 : descriptor address
 | |
| 	! d0 : index
 | |
| 	! a1 : base address
 | |
| 	.sect .text
 | |
| .aar:
 | |
| 	move.l	4(sp),a0	! descriptor address
 | |
| 	move.l	8(sp),d0	! index
 | |
| 	sub.l	(a0),d0		! index - lower bound : relative index
 | |
| 	move.l	8(a0),-(sp)	! # bytes / element
 | |
| 	move.l	d0,-(sp)
 | |
| 	jsr	.mlu
 | |
| 	move.l	12(sp),a1	! base address
 | |
| 	add.l	d1,a1		! address of element
 | |
| 	move.l	(sp)+,a0	! return address
 | |
| 	add.l	#8,sp		! pop arguments
 | |
| 	move.l	a1,(sp)		! returned on stack
 | |
| 	jmp	(a0)
 | |
| 
 | |
| .lar:
 | |
| 	! register usage: like .aar
 | |
| 
 | |
| 	move.l	4(sp),a0
 | |
| 	move.l	8(sp),d0
 | |
| 	move.l	12(sp),a1
 | |
| 	sub.l	(a0),d0
 | |
| 	move.l	d0,-(sp)
 | |
| 	move.l	8(a0),-(sp)
 | |
| 	jsr	.mlu
 | |
| 	move.l	12(sp),a1
 | |
| 	move.l	4(sp),a0
 | |
| 	add.l	d1,a1		! address of element
 | |
| 	move.l	8(a0),d0
 | |
| 	add.l	d0,a1		! a1++ because of predecrement
 | |
| 	move.l	(sp)+,a0	! return address
 | |
| 	add.l	#12,sp		! pop parameters
 | |
| 	clr.l	d1		!?nodig?
 | |
| 	asr	#1,d0
 | |
| 	bne	3f
 | |
| 	move.b	-(a1),d1	! 1 byte element
 | |
| 	move.l	d1,-(sp)
 | |
| 	bra	5f
 | |
| 3:
 | |
| 	asr	#1,d0
 | |
| 	bne	4f
 | |
| 	move.w	-(a1),d1	! 2 byte element
 | |
| 	move.l	d1,-(sp)
 | |
| 	bra 	5f
 | |
| 4:
 | |
| 	sub.l	#1,d0
 | |
| 1:
 | |
| 	move.l	 -(a1),-(sp)	! 4n byte element (n = 1,2,...)
 | |
| 	dbf 	d0,1b
 | |
| 5:
 | |
| 	jmp	(a0)
 | |
| 
 | |
| .sar:
 | |
| 	!register usage: same as lar
 | |
| 
 | |
| 	move.l	4(sp),a0
 | |
| 	move.l	8(sp),d0
 | |
| 	move.l	12(sp),a1
 | |
| 	sub.l	(a0),d0
 | |
| 	move.l	d0,-(sp)
 | |
| 	move.l	8(a0),-(sp)
 | |
| 	jsr	.mlu
 | |
| 	move.l	12(sp),a1
 | |
| 	move.l	4(sp),a0
 | |
| 	add.l	d1,a1
 | |
| 	move.l	8(a0),d0	! # bytes / element
 | |
| 	move.l	(sp)+,a0	! return address
 | |
| 	add.l	#12,sp		! pop parameters
 | |
| 	clr.l	d1		!?nodig?
 | |
| 	asr	#1,d0
 | |
| 	bne	3f
 | |
| 	move.l	(sp)+,d1
 | |
| 	move.b	d1,(a1)		! 1 byte element 
 | |
| 	bra	4f
 | |
| 3:
 | |
| 	asr	#1,d0
 | |
| 	bne	5f
 | |
| 	move.l	(sp)+,d1
 | |
| 	move.w	d1,(a1)		! 2 byte element 
 | |
| 	bra	4f
 | |
| 5:
 | |
| 	sub.l	#1,d0
 | |
| 1:
 | |
| 	move.l	(sp)+,(a1)+	! 4n byte element (n = 1,2,...)
 | |
| 	dbf	d0,1b
 | |
| 4:
 | |
| 	jmp	(a0)
 | |
| 
 | |
| .align 2
 |