ret.s 686 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. .define .ret
  2. .define .lfr
  3. .sect .text
  4. .sect .rom
  5. .sect .data
  6. .sect .bss
  7. ! 'ret' and 'lfr' for sizes > 4 (and <= 8)
  8. retarea: .space 8
  9. .sect .text
  10. .ret:
  11. ! parameters:
  12. ! de: size in bytes
  13. ! stack: return value
  14. pop ix ! save return address
  15. ld hl,retarea
  16. srl d
  17. rr e ! divide size by 2
  18. 1:
  19. pop bc
  20. ld (hl), c
  21. inc hl
  22. ld (hl), b
  23. inc hl
  24. dec de
  25. ld a,d
  26. or e
  27. jr nz,1b ! done?
  28. jp (ix) ! yes, return
  29. .lfr:
  30. ! parameters:
  31. ! de: size in bytes
  32. ! result on stack: return value
  33. pop ix ! save return address
  34. ld hl,retarea
  35. add hl,de
  36. srl d
  37. rr e ! divide size by 2
  38. 1:
  39. dec hl
  40. ld b,(hl)
  41. dec hl
  42. ld c,(hl)
  43. push bc
  44. dec de
  45. ld a,d
  46. or e
  47. jr nz,1b ! done?
  48. jp (ix) ! yes, return