.define .lar .sect .text .sect .rom .sect .data .sect .bss .sect .text ! (on entry d0 contains the integer size in the descriptor) .lar: cmp.l #4, d0 beq 9f move.l #EILLINS, -(sp) jmp (.fatal) 9: ! register usage: ! a0: descriptor address ! a1: base address ! d0: index ! d1: # bytes / element ! d2: save return address ! For address calculation; see comment in 'aar.s'. move.l (sp)+, d2 ! return address move.l (sp)+, a0 ! descriptor address move.l (sp)+, d0 ! index move.l (sp)+, a1 ! array base address sub.l (a0), d0 ! relative index move.l (8,a0), d1 ! # bytes / element cmp.l #1, d1 bne 2f clr.l -(sp) move.b (a1,d0.l), (3,sp) ! one byte element bra 5f 2: cmp.l #2, d1 bne 4f clr.l -(sp) move.w (a1,d0.l*2), (2,sp) ! two byte element bra 5f 4: muls.l d1, d0 add.l d0, a1 ! address of 4n byte element add.l d1, a1 ! because of predecrement asr.l #2, d1 sub.l #1, d1 1: move.l -(a1), -(sp) dbf d1, 1b 5: move.l d2,a0 jmp (a0) .align 2