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
 |