1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- .define .sar
- .sect .text
- .sect .rom
- .sect .data
- .sect .bss
- EILLINS=18
- .sect .text
- ! (on entry d0 contains the integer size in the descriptor)
- .sar:
- 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
- ! For address calculation; see comment in 'aar.s'.
- ! If the element size is a fraction of EM_WSIZE (4)
- ! the calculation is done by adding.
- move.l (sp)+, d1 ! return address
- move.l (sp)+, a0
- move.l (sp)+, d0
- move.l (sp)+, a1
- move.l d1,-(sp) ! return address
- sub.l (a0), d0
- move.l (8,a0), d1 ! # bytes / element
- cmp.l #1, d1
- bne 2f
- move.l (sp)+,a0
- move.l (sp)+, d1
- move.b d1, (a1,d0.l) ! store one byte element
- jmp (a0)
- 2:
- cmp.l #2, d1
- bne 4f
- move.l (sp)+,a0
- move.l (sp)+, d1
- move.w d1, (a1,d0.l*2) ! store two byte element
- jmp (a0)
- 4: ! here: 4n byte element
- muls.l d1, d0
- add.l d0, a1 ! address of 4n byte element
- asr.l #2, d1
- move.l (sp)+,a0
- 1:
- move.l (sp)+, (a1)+
- sub.l #1, d1
- bne 1b
- jmp (a0)
- .align 2
|