50 lines
635 B
ArmAsm
50 lines
635 B
ArmAsm
.define .lar
|
|
! use .mli2
|
|
|
|
! 2-byte descriptor elements
|
|
! any size array elements
|
|
! parameters:
|
|
! on stack
|
|
! uses .mli2
|
|
! no range checking
|
|
! adapted from .aar and .los
|
|
|
|
|
|
|
|
.lar:
|
|
pop hl
|
|
pop ix
|
|
ex (sp),hl
|
|
ld c,(ix+0)
|
|
ld b,(ix+1)
|
|
xor a
|
|
sbc hl,bc
|
|
ld c,(ix+4)
|
|
ld b,(ix+5)
|
|
ex de,hl
|
|
call .mli2
|
|
pop ix
|
|
pop de
|
|
add hl,de ! address of array element
|
|
add hl,bc
|
|
dec hl ! pointer to highest byte of element
|
|
srl b
|
|
rr c
|
|
jr nc,1f
|
|
ld a,c ! skip check to save runtime
|
|
or b
|
|
jr nz,.trp.z ! size was odd but <> 1
|
|
ld c,(hl)
|
|
push bc
|
|
jp (ix)
|
|
1: ld d,(hl)
|
|
dec hl
|
|
ld e,(hl)
|
|
dec hl
|
|
push de
|
|
dec bc
|
|
ld a,b
|
|
or c
|
|
jr nz,1b
|
|
jp (ix)
|