home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC-Online 1998 February
/
PCOnline_02_1998.iso
/
filesbbs
/
os2
/
pgp263.arj
/
PGP263I.SRC
/
PGP263II.ZIP
/
src
/
amiga_asm.a
< prev
next >
Wrap
Text File
|
1995-02-21
|
4KB
|
153 lines
; 68000.s for SAS/asm v6.x
; register parameters, small code/small data model
SECTION code
XREF _global_precision
; r1 = r1 + r2 + carry
; boolean P_ADDC(unitptr r1, unitptr r2, boolean carry)
; D0.B A0 A1 D0.B
XDEF _P_ADDC
XDEF @P_ADDC
_P_ADDC:
move.l 4(SP),a0
move.l 8(SP),a1
move.l 12(SP),d0
@P_ADDC:
move.l d2,-(sp)
move.b d0,d1
sne d1
moveq.l #0,d2
move.w _global_precision(a4),d2
asl.l #2,d2
add.l d2,a0
add.l d2,a1
asr.l #2,d2
subq.l #1,d2
asr.b #1,d1
add_loop:
addx.l -(a1),-(a0)
dbf d2,add_loop
scs d0
move.l (sp)+,d2
rts
; r1 = r1 - r2 - borrow
; boolean P_SUBB(unitptr r1, unitptr r2, boolean borrow)
; D0.B A0 A1 D0.B
XDEF _P_SUBB
XDEF @P_SUBB
_P_SUBB:
move.l 4(SP),a0
move.l 8(SP),a1
move.l 12(SP),d0
@P_SUBB:
move.l d2,-(sp)
move.b d0,d1
sne d1
moveq.l #0,d2
move.w _global_precision(a4),d2
asl.l #2,d2
add.l d2,a0
add.l d2,a1
asr.l #2,d2
subq.l #1,d2
asr.b #1,d1
sub_loop:
subx.l -(a1),-(a0)
dbf d2,sub_loop
scs d0
move.l (sp)+,d2
rts
; r1 = r1 << 1 | carry;
; boolean P_ROTL(unitptr r1, boolean carry)
; D0.B A0 D0.B
XDEF _P_ROTL
XDEF @P_ROTL
_P_ROTL:
move.l 4(SP),a0
move.l 8(SP),d0
@P_ROTL:
move.l d2,-(sp)
move.b d0,d1
sne d1
moveq.l #0,d2
move.w _global_precision(a4),d2
asl.l #2,d2
add.l d2,a0
asr.l #1,d2
subq.l #1,d2
asr.b #1,d1
rol_loop:
roxl.w -(a0)
dbf d2,rol_loop
scs d0
move.l (sp)+,d2
rts
XDEF _P_SETP
XDEF @P_SETP
_P_SETP:
@P_SETP:
rts
;********************************************************************
; P_SMUL copied from the sun3 mc68020.s and modified RKNOP 940612
; P_SMUL(*a,*b,x) performs a+=b*x. Pointers are to LSB despite
; Motorola byte ordering
;********************************************************************
IFD _M68020
XDEF _P_SMUL
XDEF @P_SMUL
_P_SMUL:
move.l 4(SP),a0
move.l 8(SP),a1
move.l 12(SP),d0
@P_SMUL:
tst.l d0 ; test to speed multiplies by 0
beq.b .exit
movem.l d2-d5,-(sp) ;Save registers
move.l d0,d1 ; &a in a0, &b in a1, x in d0
move.w _global_precision(a4),d5 ;longword count
subq.w #2,d5 ; first longword not handled in loop
clr.l d4 ; Clear d4 so we have a 0 for adding X-bit later
move.l (a1),d2 ; d2 has lower byte of product
mulu.l d1,d3:d2 ; d3 has carry (high byte of product)
add.l d2,(a0) ; accumulate
tst.w d5 ;This code is needed if global_precision<2
blt.b .SMUL2 ; only one longword?
.SMUL1 move.l -(a0),d0 ; Predecrement 'cause a0 started pointing at LSB
addx.l d3,d0 ; accumulate carry and X-bit
move.l -(a1),d2
mulu.l d1,d3:d2
addx.l d4,d3 ;add X-bit to carry
add.l d2,d0 ;accumulate
move.l d0,(a0)
dbf d5,.SMUL1 ;loop until ((--d5)==-1)
.SMUL2 addx.l d4,d3 ; add X-bit to carry
move.l d3,-(a0) ; And put that in the highest byte of (a0)
movem.l (sp)+,d2-d5 ;restore registers saved earlier
.exit rts
ENDC ; _M68020
END