loi.s 774 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. .define .loi
  2. .sect .text
  3. .sect .rom
  4. .sect .data
  5. .sect .bss
  6. .sect .text
  7. ! Load indirect
  8. ! Expects in de-registers: number of bytes to be loaded
  9. ! (this number should be 1 or even )
  10. ! Expects on stack: base address
  11. ! Yields on stack: result
  12. .loi: pop h
  13. shld .retadr
  14. mov l,c ! free bc for scratch
  15. mov h,b
  16. shld .bcreg
  17. pop h ! hl = base address
  18. dad d ! hl = load pointer
  19. xra a ! clear carry bit
  20. mov a,d ! divide d by 2
  21. rar
  22. mov d,a
  23. mov a,e
  24. rar
  25. mov e,a
  26. jnc 1f
  27. ! if 1 byte has to be loaded only:
  28. mov a,d
  29. ora e
  30. cnz eoddz ! trap if number is odd and <> 1
  31. dcx h
  32. mov c,m
  33. mvi b,0
  34. push b
  35. jmp 2f
  36. 1: dcx h
  37. mov b,m
  38. dcx h
  39. mov c,m
  40. push b
  41. dcx d ! is count exhausted?
  42. mov a,d
  43. ora e
  44. jnz 1b
  45. 2: lhld .bcreg
  46. mov c,l
  47. mov b,h
  48. lhld .retadr
  49. pchl