|
@@ -0,0 +1,103 @@
|
|
|
+.define .sar
|
|
|
+.define .lar
|
|
|
+.define .aar
|
|
|
+
|
|
|
+ !register usage:
|
|
|
+ ! a0 : descriptor address
|
|
|
+ ! d0 : index
|
|
|
+ ! a1 : base address
|
|
|
+ .text
|
|
|
+.aar:
|
|
|
+ movem.l d0/d1/a0/a1,.savreg
|
|
|
+ move.l (sp)+,.retara ! return address
|
|
|
+ move.l (sp)+,a0 ! descriptor address
|
|
|
+ move.l (sp)+,d0 ! index
|
|
|
+ move.l (sp)+,a1 ! base address
|
|
|
+ sub.l (a0),d0 ! index - lower bound : relative index
|
|
|
+ move.l 8(a0),-(sp) ! # bytes / element
|
|
|
+ move.l d0,-(sp)
|
|
|
+ jsr .mlu
|
|
|
+ add.l d1,a1 ! address of element
|
|
|
+ move.l a1,-(sp) ! returned on stack
|
|
|
+ move.l .retara,-(sp)
|
|
|
+ movem.l d0/d1/a0/a1,.savreg
|
|
|
+ rts
|
|
|
+
|
|
|
+
|
|
|
+.lar:
|
|
|
+ ! register usage: like .aar
|
|
|
+ ! d2 : # bytes / element
|
|
|
+
|
|
|
+ movem.l d0/d1/d2/a0/a1,.savreg
|
|
|
+ move.l (sp)+,.retara ! return address
|
|
|
+ move.l (sp)+,a0
|
|
|
+ move.l (sp)+,d0
|
|
|
+ move.l (sp)+,a1
|
|
|
+ sub.l (a0),d0
|
|
|
+ move.l 8(a0),d2 ! # bytes / element
|
|
|
+ move.l d0,-(sp)
|
|
|
+ move.l d2,-(sp)
|
|
|
+ jsr .mlu
|
|
|
+ add.l d1,a1 ! address of element
|
|
|
+ add.l d2,a1 ! a1++ because of predecrement
|
|
|
+ clr.l d1 !?nodig?
|
|
|
+ asr #1,d2
|
|
|
+ bne 3f
|
|
|
+ move.b -(a1),d1 ! 1 byte element
|
|
|
+ move.l d1,-(sp)
|
|
|
+ bra 5f
|
|
|
+3:
|
|
|
+ asr #1,d2
|
|
|
+ bne 4f
|
|
|
+ move.w -(a1),d1 ! 2 byte element
|
|
|
+ move.l d1,-(sp)
|
|
|
+ bra 5f
|
|
|
+4:
|
|
|
+ sub.l #1,d2
|
|
|
+1:
|
|
|
+ move.l -(a1),-(sp) ! 4n byte element (n = 1,2,...)
|
|
|
+ dbf d2,1b
|
|
|
+5:
|
|
|
+ move.l .retara,-(sp)
|
|
|
+ movem.l .savreg,d0/d1/d2/a0/a1
|
|
|
+ rts
|
|
|
+
|
|
|
+
|
|
|
+.sar:
|
|
|
+ !register usage: same as lar
|
|
|
+
|
|
|
+ movem.l d0/d1/a0/a1,.savreg
|
|
|
+ move.l (sp)+,.retara
|
|
|
+ move.l (sp)+,a0
|
|
|
+ move.l (sp)+,d0
|
|
|
+ move.l (sp)+,a1
|
|
|
+ sub.l (a0),d0
|
|
|
+ move.l 8(a0),d2 ! # bytes / element
|
|
|
+ move.l d0,-(sp)
|
|
|
+ move.l d2,-(sp)
|
|
|
+ jsr .mlu
|
|
|
+ add.l d1,a1
|
|
|
+ clr.l d1 !?nodig?
|
|
|
+ asr #1,d2
|
|
|
+ bne 3f
|
|
|
+ move.l (sp)+,d1
|
|
|
+ move.b d1,(a1) ! 1 byte element
|
|
|
+ bra 4f
|
|
|
+3:
|
|
|
+ asr #1,d2
|
|
|
+ bne 5f
|
|
|
+ move.l (sp)+,d1
|
|
|
+ move.w d1,(a1) ! 2 byte element
|
|
|
+ bra 4f
|
|
|
+5:
|
|
|
+ sub.l #1,d2
|
|
|
+1:
|
|
|
+ move.l (sp)+,(a1)+ ! 4n byte element (n = 1,2,...)
|
|
|
+ dbf d2,1b
|
|
|
+4:
|
|
|
+ move.l .retara,-(sp)
|
|
|
+ movem.l .savreg,d0/d1/a0/a1
|
|
|
+ rts
|
|
|
+.data
|
|
|
+.retara: .long 0
|
|
|
+.align 2
|