home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
612b.lha
/
IAS_Library
/
IASLIBRA.S
< prev
next >
Wrap
Text File
|
1992-02-11
|
9KB
|
699 lines
SAD MACRO
movem.l d0-d7/a0-a6,-(sp)
ENDM
GAD MACRO
movem.l (sp)+,d0-d7/a0-a6
ENDM
SAD2 MACRO
movem.l d0-d5,-(sp)
ENDM
GAD2 MACRO
movem.l (sp)+,d0-d5
ENDM
SAD3 MACRO
movem.l d0-d1,-(sp)
ENDM
GAD3 MACRO
movem.l (sp)+,d0-d1
ENDM
SAD4 MACRO
movem.l d0-d6,-(sp)
ENDM
GAD4 MACRO
movem.l (sp)+,d0-d6
ENDM
SAD5 MACRO
movem.l d0-d7,-(sp)
ENDM
GAD5 MACRO
movem.l (sp)+,d0-d7
ENDM
NOLIST
INCLUDE 'exec/types.i'
INCLUDE 'exec/libraries.i'
INCLUDE 'exec/lists.i'
INCLUDE 'exec/alerts.i'
INCLUDE 'exec/initializers.i'
INCLUDE 'exec/resident.i'
INCLUDE 'exec/asmsupp.i'
INCLUDE 'libraries/ias.i'
_AbsExecBase = $4
_LVOOpenLibrary = -552
_LVOCloseLibrary = -414
_LVOAlert = -108
_LVOFreeMem = -210
_LVORemove = -252
start
moveq #-1,d0
rts
MYPRI = 0
initDDescrip
dc.w RTC_MATCHWORD
dc.l initDDescrip
dc.l EndCode
dc.b RTF_AUTOINIT
dc.b VERSION
dc.b NT_LIBRARY
dc.b MYPRI
dc.l iasName
dc.l idstring
dc.l init
iasName IASNAME
even
VERSION = 33
REVISION = 1
idstring dc.b 'IASlibrary 33.1 ( (c)Craig Eales 20 Sep 1991)',13,10,0
ds.w 0
init
dc.l IasBase_SIZEOF
dc.l funcTable
dc.l dataTable
dc.l initRoutine
funcTable
dc.l Open
dc.l Close
dc.l Expunge
dc.l Null
dc.l INTmulu
dc.l INTdivu
dc.l IASdivs
dc.l IASabs
dc.l IASneg
dc.l IAScif
dc.l IAScfi
dc.l IASsub
dc.l IASadd
dc.l IASmuls
dc.l IASdivi
dc.l IAScfa
dc.l INTcia
dc.l -1
dataTable
INITBYTE LN_TYPE,NT_LIBRARY
INITLONG LN_NAME,iasName
INITBYTE LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
INITWORD LIB_VERSION,VERSION
INITWORD LIB_REVISION,REVISION
INITLONG LIB_IDSTRING,idstring
dc.l 0
initRoutine
move.l a5,-(sp)
move.l d0,a5
move.l a6,iasb_SysLib(a5)
move.l a0,iasb_SegList(a5)
move.l a5,d0
move.l (sp)+,a5
rts
Open
addq.w #1,LIB_OPENCNT(a6)
bclr #LIBB_DELEXP,iasb_Flags(a6)
move.l a6,d0
rts
Close
CLEAR d0
subq.w #1,LIB_OPENCNT(a6)
bne.s .templab
btst #LIBB_DELEXP,iasb_Flags(a6)
beq.s .templab
bsr Expunge
.templab
rts
Expunge
movem.l d2/a5/a6,-(sp)
move.l a6,a5
move.l iasb_SysLib(a5),a6
tst.w LIB_OPENCNT(a5)
beq.s .templab
bset #LIBB_DELEXP,iasb_Flags(a5)
CLEAR d0
bra.s Expunge_End
.templab
move.l iasb_SegList(a5),d2
move.l a5,a1
CALLSYS Remove
CLEAR d0
move.l a5,a1
move.w LIB_NEGSIZE(a5),d0
sub.l d0,a1
add.w LIB_POSSIZE(a5),d0
CALLSYS FreeMem
move.l d2,d0
Expunge_End
movem.l (sp)+,d2/a5/a6
rts
Null
CLEAR d0
rts
***** 32 bit multiply ******
;times d0*d1 to d2
INTmulu
movem.l d0-d4,-(a7)
clr.l d4
move.l d0,d2
move.l d1,d3
swap d2
and.l #$ffff,d2
and.l #$ffff,d3
mulu d2,d3
and.l #$ffff,d3
swap d3
add.l d3,d4
move.l d0,d2
move.l d1,d3
swap d3
and.l #$ffff,d3
and.l #$ffff,d2
mulu d2,d3
and.l #$ffff,d3
swap d3
add.l d3,d4
move.l d0,d2
move.l d1,d3
and.l #$ffff,d2
and.l #$ffff,d3
mulu d2,d3
add.l d3,d4
move.l d4,result
movem.l (a7)+,d0-d4
move.l result,d2
rts
***** ARP 32 bit divide *****
;32 bit divide d0/d1 to d2
INTdivu
movem.l d0-d3,-(a7)
swap d1
tst.w d1
bne.s lab5
swap d1
move.w d1,d3
move.w d0,d2
clr.w d0
swap d0
divu d3,d0
move.l d0,d1
swap d0
move.w d2,d1
divu d3,d1
move.w d1,d0
clr.w d1
swap d1
move.l d0,result
movem.l (a7)+,d0-d3
move.l result,d2
rts
lab5
swap d1
move.l d1,d3
move.l d0,d1
clr.w d1
swap d1
swap d0
clr.w d0
moveq #$f,d2
lab7
add.l d0,d0
addx.l d1,d1
cmp.l d1,d3
bhi.s lab6
sub.l d3,d1
addq.w #1,d0
lab6
dbf d2,lab7
move.l d0,result
movem.l (a7)+,d0-d3
move.l result,d2
rts
***** Full IAS divide ***
;divide d0 by d1 to d2 (all IAS)
IASdivs
SAD5
move.l d0,d3
move.l d1,d4
and.l #$7ffffff,d0
and.l #$7ffffff,d1
move.l d0,d5
move.l d1,d6
jsr INTdivu ;now in d7 ab/cd=e
move.l d2,d7
and.l #$ffff,d7
swap d7
SAD4
move.l d2,d0
move.l d6,d1
jsr INTmulu
move.l d2,result
GAD4
move.l result,d6
sub.l d6,d5 ;rem now in d5
move.l d0,d6
move.l #$80000000,d0
jsr INTdivu
lsl.l #1,d2
SAD4
move.l d5,d0
move.l d2,d1
jsr INTmulu
move.l d2,result
GAD4
move.l result,d2
swap d2
and.l #$ffff,d2
add.l d2,d7
eor.l d3,d4
and.l #$80000000,d4
or.l d4,d7
move.l d7,result
GAD5
move.l result,d2
rts
***** Absolute IAS ******
;find abs value of d0
IASabs
and.l #$7ffffff,d0
move.l d0,result
rts
***** Negate IAS ********
;Make IAS in d0 neg
IASneg
eor.l #$80000000,d0
move.l d0,result
rts
***** Integer To IAS *****
;convert integer in d0 to IAS
IAScif
tst.l d0
bmi.s .doneg
and.l #$ffff,d0
swap d0
move.l d0,result
rts
.doneg
neg.l d0
and.l #$ffff,d0
swap d0
or.l #$80000000,d0
move.l d0,result
rts
******* IAS to Integer ****
;convert IAS in d0 to integer
IAScfi
SAD3
move.l d0,d1
and.l #$80000000,d1
bne.s .negbit
swap d0
and.l #$ffff,d0
move.l d0,result
GAD3
move.l result,d0
rts
.negbit
and.l #$7fffffff,d0
swap d0
and.l #$ffff,d0
neg.l d0
move.l d0,result
GAD3
move.l result,d0
rts
***** Fixed Point Sub *****
;Sub d1 from d0 and store in d2
IASsub
SAD3
eor.l #$80000000,d1
jsr IASadd
GAD3
move.l result,d2
rts
***** Fixed Point Add *****
;add d0 to d1 and put in d2
IASadd
SAD2
move.l d0,d2
move.l d1,d3
move.l d1,d4
eor.l d2,d4
and.l #$80000000,d4
beq.s .justaddem
move.l d0,d4
and.l #$80000000,d4
bne.s .swopem
.swoped
and.l #$7fffffff,d2
and.l #$7fffffff,d3
sub.l d3,d2,
cmp.l d3,d0
blt.s .makeneg
.madeneg
move.l d2,result
GAD2
move.l result,d2
rts
.swopem
move.l d0,d4
move.l d1,d0
move.l d4,d1
move.l d0,d2
move.l d1,d3
bra.s .swoped
.makeneg
neg.l d2
or.l #$80000000,d2
bra.s .madeneg
.justaddem
move.l d1,d5
and.l #$7fffffff,d5
and.l #$7fffffff,d2
add.l d5,d2
move.l d0,d4
and.l #$80000000,d4
or.l d4,d2
move.l d2,result
GAD2
move.l result,d2
rts
**** Fixed Point Multiply ****
;Times d0 and d1 into d2
IASmuls
SAD2
move.l d0,d2
move.l d1,d3
and.l #$7fffffff,d3
and.l #$7fffffff,d2
swap d3
and.l #$ffff,d3
swap d2
and.l #$ffff,d2
mulu d3,d2
and.l #$ffff,d2
swap d2
move.l d0,d3
move.l d1,d4
and.l #$7fffffff,d3
and.l #$ffff,d4
swap d3
and.l #$ffff,d3
mulu d3,d4
add.l d4,d2
move.l d0,d3
move.l d1,d4
and.l #$ffff,d3
and.l #$7fffffff,d4
swap d4
and.l #$ffff,d4
mulu d3,d4
add.l d4,d2
move.l d0,d3
move.l d1,d4
and.l #$ffff,d3
and.l #$ffff,d4
mulu d3,d4
swap d4
and.l #$ffff,d4
add.l d4,d2
eor.l d0,d1
and.l #$80000000,d1
beq.s .end
or.l #$80000000,d2
.end
move.l d2,result
GAD2
move.l result,d2
rts
**** Divide IAS by integer **
;Divides IAS in d0 by integer in d1 to IAS in d2
IASdivi
SAD2
move.l d0,d2
move.l d1,d3
clr.l d5
clr.l d4
and.l #$7fffffff,d2
tst.l d3
bpl.s .isplus
neg.l d3
.isplus
swap d2
and.l #$ffff,d2
divu d3,d2
swap d2
move.w d2,d5
swap d2
and.l #$ffff,d2
swap d2
move.l #$00010000,d4
divu d3,d4
and.l #$ffff,d4
mulu d4,d5
add.l d5,d2
move.l d0,d4
and.l #$ffff,d4
move.l d1,d5
divu d5,d4
and.l #$ffff,d4
add.l d4,d2
move.l d0,d3
and.l #$80000000,d3
move.l d1,d4
tst.l d4
bmi.s .divbyneg
tst.l d3
beq.s .doneall
or.l #$80000000,d2
bra.s .doneall
.divbyneg
tst.l d3
bne.s .doneall
or.l #$80000000,d2
.doneall
move.l d2,result
GAD2
move.l result,d2
rts
**** Convert IAS to ASCII ***
;Converts IAS in d0 to ASCII at a0 (12 bytes)
IAScfa
SAD
move.l d0,d1
and.l #$80000000,d1
beq.s .doplus
move.b #'-',(a0)+
bra.s .donsign
.doplus
move.b #'+',(a0)+
.donsign
and.l #$7fffffff,d0
move.l d0,d2
move.l a0,a1
swap d0
and.l #$ffff,d0
clr.l d1
move.l #buffer1,a0
jsr convert
add.l #5,a0
move.b (a0)+,(a1)+
move.b (a0)+,(a1)+
move.b (a0)+,(a1)+
move.b (a0)+,(a1)+
move.b (a0)+,(a1)+
move.b #'.',(a1)+
move.l d2,d0
and.l #$ffff,d0
move.l #15259,d1
mulu d1,d0
clr.l d1
move.l #buffer1,a0
jsr convert
add.l #1,a0
move.b (a0)+,(a1)+
move.b (a0)+,(a1)+
move.b (a0)+,(a1)+
move.b (a0)+,(a1)+
move.b #0,(a1)+
GAD
rts
**** Convert Integer to ASCII ***
; INT d0 to a0
INTcia
SAD
move.l #$1,d1
jsr convert
GAD
rts
**** Convert d0 to ASCII ****
;d0 source
;d1 Flags - bit 0 signed - bit 1 strip
;a0 dest
convert
SAD
and.l #$1,d1
beq .donesign
tst.l d0
bmi.s .dominus
move.b #'+',(a0)+
.donesign
lea cols,a1
move.w #9,d3
.digits
move.l (a1)+,d1
bsr.s .dodigit
dbra d3,.digits
GAD
SAD
move.l d1,d2
and.l #$2,d1
beq.s .removed
and.l #$1,d2
beq.s .strip
addq.l #1,a0
.strip
cmp.b #'0',(a0)
bne.s .removed
bra.s .remove
.removed
GAD
rts
.dodigit
clr.l d2
.loop
addq.l #1,d2
sub.l d1,d0
bpl.s .loop
add.l d1,d0
subq.l #1,d2
add.b #'0',d2
move.b d2,(a0)+
rts
.dominus
move.b #'-',(a0)+
not.l d0
add.l #1,d0
bra.s .donesign
.remove
SAD
move.l #9,d1
.nexts
move.b 1(a0),(a0)+
dbra d1,.nexts
GAD
bra.s .strip
cols dc.l 1000000000,100000000,10000000
dc.l 1000000,100000,10000,1000,100,10,1
**** FLAGS ETC *****
result dc.l 0
buffer1 dc.l 0,0,0
EndCode: END