87 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
	
		
			1.1 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	(sp)+,d2	! return address
 | 
						|
	move.l	(sp)+,a0
 | 
						|
	move.w	(sp)+,d0
 | 
						|
	move.l	(sp)+,a1
 | 
						|
	sub	(a0),d0		! index - lower bound : relative index
 | 
						|
	!chk	2(a0),d0
 | 
						|
	!blt	9f
 | 
						|
	!cmp	2(a0),d0
 | 
						|
	!bgt	9f
 | 
						|
	mulu	4(a0),d0	! total # bytes 
 | 
						|
	add	d0,a1		! address of element
 | 
						|
	move.l	a1,-(sp)
 | 
						|
	move.l	d2,-(sp)
 | 
						|
	rts
 | 
						|
 | 
						|
 | 
						|
.lar:
 | 
						|
	move.l	(sp)+,d2	! return address
 | 
						|
	move.l	(sp)+,a0
 | 
						|
	move.w	(sp)+,d0
 | 
						|
	move.l	(sp)+,a1
 | 
						|
	sub	(a0),d0
 | 
						|
	!chk	2(a0),d0
 | 
						|
	!blt	9f
 | 
						|
	!cmp	2(a0),d0
 | 
						|
	!bgt	9f
 | 
						|
	move	4(a0),d1
 | 
						|
	mulu	d1,d0
 | 
						|
	add	d0,a1
 | 
						|
	add	d1,a1
 | 
						|
	asr	#1,d1
 | 
						|
	bne	3f
 | 
						|
	clr	d1
 | 
						|
	move.b	-(a1),d1
 | 
						|
	move	d1,-(sp)
 | 
						|
	bra	4f
 | 
						|
3:
 | 
						|
	move	-(a1),-(sp)
 | 
						|
	sub	#1,d1
 | 
						|
	bgt	3b
 | 
						|
4:
 | 
						|
	move.l	d2,-(sp)
 | 
						|
	rts
 | 
						|
 | 
						|
 | 
						|
!9:
 | 
						|
	!move.w	#EARRAY,-(sp)
 | 
						|
	!jmp	.fat
 | 
						|
.sar:
 | 
						|
	move.l	(sp)+,d2
 | 
						|
	move.l	(sp)+,a0
 | 
						|
	move.w	(sp)+,d0
 | 
						|
	move.l	(sp)+,a1
 | 
						|
	sub	(a0),d0
 | 
						|
	!chk	2(a0),d0
 | 
						|
	!blt	9b
 | 
						|
	!cmp	2(a0),d0
 | 
						|
	!bgt	9b
 | 
						|
	move	4(a0),d1
 | 
						|
	mulu	d1,d0
 | 
						|
	add	d0,a1
 | 
						|
	asr	#1,d1
 | 
						|
	bne	3f
 | 
						|
	move	(sp)+,d1
 | 
						|
	move.b	d1,(a1)
 | 
						|
	bra	4f
 | 
						|
3:
 | 
						|
	move	(sp)+,(a1)+
 | 
						|
	sub	#1,d1
 | 
						|
	bgt	3b
 | 
						|
4:
 | 
						|
	move.l	d2,-(sp)
 | 
						|
	rts
 |