ara.s 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. .define .sar
  2. .define .lar
  3. .define .aar
  4. .sect .text
  5. .sect .rom
  6. .sect .data
  7. .sect .bss
  8. !register usage:
  9. ! a0 : descriptor address
  10. ! d0 : index
  11. ! a1 : base address
  12. .sect .text
  13. .aar:
  14. move.l (sp)+,d2 ! return address
  15. move.l (sp)+,a0
  16. move.w (sp)+,d0
  17. move.l (sp)+,a1
  18. sub (a0),d0 ! index - lower bound : relative index
  19. !chk 2(a0),d0
  20. !blt 9f
  21. !cmp 2(a0),d0
  22. !bgt 9f
  23. mulu 4(a0),d0 ! total # bytes
  24. add d0,a1 ! address of element
  25. move.l a1,-(sp)
  26. move.l d2,-(sp)
  27. rts
  28. .lar:
  29. move.l (sp)+,d2 ! return address
  30. move.l (sp)+,a0
  31. move.w (sp)+,d0
  32. move.l (sp)+,a1
  33. sub (a0),d0
  34. !chk 2(a0),d0
  35. !blt 9f
  36. !cmp 2(a0),d0
  37. !bgt 9f
  38. move 4(a0),d1
  39. mulu d1,d0
  40. add d0,a1
  41. add d1,a1
  42. asr #1,d1
  43. bne 3f
  44. clr d1
  45. move.b -(a1),d1
  46. move d1,-(sp)
  47. bra 4f
  48. 3:
  49. move -(a1),-(sp)
  50. sub #1,d1
  51. bgt 3b
  52. 4:
  53. move.l d2,-(sp)
  54. rts
  55. !9:
  56. !move.w #EARRAY,-(sp)
  57. !jmp .fat
  58. .sar:
  59. move.l (sp)+,d2
  60. move.l (sp)+,a0
  61. move.w (sp)+,d0
  62. move.l (sp)+,a1
  63. sub (a0),d0
  64. !chk 2(a0),d0
  65. !blt 9b
  66. !cmp 2(a0),d0
  67. !bgt 9b
  68. move 4(a0),d1
  69. mulu d1,d0
  70. add d0,a1
  71. asr #1,d1
  72. bne 3f
  73. move (sp)+,d1
  74. move.b d1,(a1)
  75. bra 4f
  76. 3:
  77. move (sp)+,(a1)+
  78. sub #1,d1
  79. bgt 3b
  80. 4:
  81. move.l d2,-(sp)
  82. rts