.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