csa.s 613 B

12345678910111213141516171819202122232425262728293031323334
  1. .define .csa
  2. .sect .text
  3. .sect .rom
  4. .sect .data
  5. .sect .bss
  6. .sect .text
  7. .sect .text
  8. !r0 contains index
  9. !r1 contains pointer to csa descriptor
  10. .csa: movd 4(r1), r2 !get lower bound
  11. cmpd r2, r0
  12. bgt 1f !index out of range
  13. addd 8(r1), r2 !get upper bound
  14. cmpd r2, r0
  15. blt 1f !index out of range
  16. addr 12(r1), r2 !pointer to first pointer
  17. subd 4(r1), r0
  18. muld 4, r0
  19. addd r0,r2 !right pointer
  20. cmpqd 0, 0(r2)
  21. beq 1f !null pointer
  22. movd 0(r2), tos !jump now
  23. ret 4
  24. 1: !jump to default pointer
  25. cmpqd 0, 0(r1)
  26. beq 2f !null pointer
  27. movd 0(r1), tos
  28. ret 4
  29. 2:
  30. movd ECASE, tos
  31. jsr @.trp
  32. ret 0