ack/mach/m68k2/libem/ara.s
1984-12-14 15:41:14 +00:00

84 lines
1.1 KiB
ArmAsm

.define .sar
.define .lar
.define .aar
!register usage:
! a0 : descriptor address
! d0 : index
! a1 : base address
.text
.aar:
move.l (sp)+,d2 ! return address
move.l (sp)+,a0
move.w (sp)+,d0
move.l (sp)+,a1
sub (a0),d0 ! index - lower bound : relative index
!chk 2(a0),d0
!blt 9f
!cmp 2(a0),d0
!bgt 9f
mulu 4(a0),d0 ! total # bytes
add d0,a1 ! address of element
move.l a1,-(sp)
move.l d2,-(sp)
rts
.lar:
move.l (sp)+,d2 ! return address
move.l (sp)+,a0
move.w (sp)+,d0
move.l (sp)+,a1
sub (a0),d0
!chk 2(a0),d0
!blt 9f
!cmp 2(a0),d0
!bgt 9f
move 4(a0),d1
mulu d1,d0
add d0,a1
add d1,a1
asr #1,d1
bne 3f
clr d1
move.b -(a1),d1
move d1,-(sp)
bra 4f
3:
move -(a1),-(sp)
sub #1,d1
bgt 3b
4:
move.l d2,-(sp)
rts
!9:
!move.w #EARRAY,-(sp)
!jmp .fat
.sar:
move.l (sp)+,d2
move.l (sp)+,a0
move.w (sp)+,d0
move.l (sp)+,a1
sub (a0),d0
!chk 2(a0),d0
!blt 9b
!cmp 2(a0),d0
!bgt 9b
move 4(a0),d1
mulu d1,d0
add d0,a1
asr #1,d1
bne 3f
move (sp)+,d1
move.b d1,(a1)
bra 4f
3:
move (sp)+,(a1)+
sub #1,d1
bgt 3b
4:
move.l d2,-(sp)
rts