12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- .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
|