lar.s 693 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. .define .lar
  2. .sect .text
  3. .sect .rom
  4. .sect .data
  5. .sect .bss
  6. .sect .text
  7. ! use .mli2
  8. ! 2-byte descriptor elements
  9. ! any size array elements
  10. ! parameters:
  11. ! on stack
  12. ! uses .mli2
  13. ! no range checking
  14. ! adapted from .aar and .los
  15. .lar:
  16. pop hl
  17. pop ix
  18. ex (sp),hl
  19. ld c,(ix+0)
  20. ld b,(ix+1)
  21. xor a
  22. sbc hl,bc
  23. ld c,(ix+4)
  24. ld b,(ix+5)
  25. ex de,hl
  26. call .mli2
  27. pop ix
  28. pop de
  29. add hl,de ! address of array element
  30. add hl,bc
  31. dec hl ! pointer to highest byte of element
  32. srl b
  33. rr c
  34. jr nc,1f
  35. ld a,c ! skip check to save runtime
  36. or b
  37. jr nz,.trp.z ! size was odd but <> 1
  38. ld c,(hl)
  39. push bc
  40. jp (ix)
  41. 1: ld d,(hl)
  42. dec hl
  43. ld e,(hl)
  44. dec hl
  45. push de
  46. dec bc
  47. ld a,b
  48. or c
  49. jr nz,1b
  50. jp (ix)