55 lines
		
	
	
	
		
			774 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
	
		
			774 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
.define .loi
 | 
						|
.sect .text
 | 
						|
.sect .rom
 | 
						|
.sect .data
 | 
						|
.sect .bss
 | 
						|
.sect .text
 | 
						|
 | 
						|
! Load indirect
 | 
						|
! Expects in de-registers: number of bytes to be loaded
 | 
						|
!			   (this number should be 1 or even )
 | 
						|
! Expects on stack:	   base address
 | 
						|
! Yields on stack:	   result
 | 
						|
 | 
						|
.loi:	pop h
 | 
						|
	shld .retadr
 | 
						|
	mov l,c		! free bc for scratch
 | 
						|
	mov h,b
 | 
						|
	shld .bcreg
 | 
						|
 | 
						|
	pop h		! hl = base address
 | 
						|
	dad d		! hl = load pointer
 | 
						|
	xra a		! clear carry bit
 | 
						|
	mov a,d		! divide d by 2
 | 
						|
	rar
 | 
						|
	mov d,a
 | 
						|
	mov a,e
 | 
						|
	rar
 | 
						|
	mov e,a
 | 
						|
	jnc 1f
 | 
						|
 | 
						|
! if 1 byte has to be loaded only:
 | 
						|
	mov a,d
 | 
						|
	ora e
 | 
						|
	cnz eoddz	! trap if number is odd and <> 1
 | 
						|
	dcx h
 | 
						|
	mov c,m
 | 
						|
	mvi b,0
 | 
						|
	push b
 | 
						|
	jmp 2f
 | 
						|
 | 
						|
1:	dcx h
 | 
						|
	mov b,m
 | 
						|
	dcx h
 | 
						|
	mov c,m
 | 
						|
	push b
 | 
						|
	dcx d		! is count exhausted?
 | 
						|
	mov a,d
 | 
						|
	ora e
 | 
						|
	jnz 1b
 | 
						|
 | 
						|
2:	lhld .bcreg
 | 
						|
	mov c,l
 | 
						|
	mov b,h
 | 
						|
	lhld .retadr
 | 
						|
	pchl
 |