76 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
.define .lar2
 | 
						|
.sect .text
 | 
						|
.sect .rom
 | 
						|
.sect .data
 | 
						|
.sect .bss
 | 
						|
.sect .text
 | 
						|
 | 
						|
! Load array element, descriptor contains 2-bytes integers
 | 
						|
! Expects on stack:	pointer to array descriptor
 | 
						|
!			index
 | 
						|
!			base address
 | 
						|
! Yields on stack:	array element
 | 
						|
! Adapted from .aar2 and .loi
 | 
						|
 | 
						|
.lar2:
 | 
						|
	pop h
 | 
						|
	shld .retadr1
 | 
						|
	mov h,b
 | 
						|
	mov l,c
 | 
						|
	shld .bcreg
 | 
						|
 | 
						|
	pop h		! hl = pointer to descriptor
 | 
						|
        pop d           ! de = index
 | 
						|
	mov a,e		! bc = index - lower bound
 | 
						|
	sub m
 | 
						|
	inx h
 | 
						|
	mov c,a
 | 
						|
	mov a,d
 | 
						|
	sbb m
 | 
						|
	inx h
 | 
						|
	mov b,a
 | 
						|
	push b		! first operand to multiply
 | 
						|
	inx h
 | 
						|
	inx h
 | 
						|
	mov c,m		! bc = size
 | 
						|
	inx h
 | 
						|
	mov b,m
 | 
						|
	push b		! second operand to multiply
 | 
						|
	call .mli2	! de = size * (index - lower bound)
 | 
						|
	pop h		! hl = base address
 | 
						|
	dad d		! hl = address of array[index]
 | 
						|
	dad b		! hl= load pointer
 | 
						|
	xra a		! clear carry bit
 | 
						|
	mov a,b		! divide bc by 2
 | 
						|
	rar
 | 
						|
	mov b,a
 | 
						|
	mov a,c
 | 
						|
	rar
 | 
						|
	mov c,a
 | 
						|
	jnc 1f
 | 
						|
	
 | 
						|
! for 1 byte array element only:
 | 
						|
	mov a,c		! trap if bc odd and <>1
 | 
						|
	ora b
 | 
						|
	cnz eoddz
 | 
						|
	dcx h
 | 
						|
	mov e,m
 | 
						|
	mvi d,0
 | 
						|
	push d
 | 
						|
	jmp 2f
 | 
						|
 | 
						|
1:	dcx h
 | 
						|
	mov d,m
 | 
						|
	dcx h
 | 
						|
	mov e,m
 | 
						|
	push d
 | 
						|
	dcx b
 | 
						|
	mov a,b
 | 
						|
	ora c
 | 
						|
	jnz 1b
 | 
						|
 | 
						|
2:	lhld .bcreg
 | 
						|
	mov b,h
 | 
						|
	mov c,l
 | 
						|
	lhld .retadr1
 | 
						|
	pchl
 |