85 lines
1.6 KiB
ArmAsm
85 lines
1.6 KiB
ArmAsm
;Internal utility routines for Intuition Extension. Note that these follow
|
|
;the Commodore library function standard for registers: D0/D1/A0/A1 are
|
|
;trashed (unless the function says otherwise; e.g. a return value), while all
|
|
;other registers are preserved.
|
|
;
|
|
;This file just contains very basic routines.
|
|
|
|
include "offsets.i"
|
|
include "defs.i"
|
|
include "errordefs.i"
|
|
include "macros.i"
|
|
include "macros2.i"
|
|
|
|
ifd CREATOR
|
|
incdir "/AMOS1.3"
|
|
else
|
|
incdir "/AMOS"
|
|
endc
|
|
; include "equ.s" ;PhxAss is buggy...
|
|
EcNumber equ 188
|
|
Bnk_BitData equ 0
|
|
Bnk_BitChip equ 1
|
|
Bnk_BitBob equ 2
|
|
Bnk_BitIcon equ 3
|
|
|
|
section text,code
|
|
|
|
xdef LongMul
|
|
xdef LongDiv
|
|
xdef StrLen
|
|
xdef RTS
|
|
|
|
|
|
LongMul: ;Multiply a 32-bit number in D0 by a 16-bit number in
|
|
; D1. Returns 32-bit product in D0. Multiplication
|
|
; is unsigned. Registers A0-A1 are preserved.
|
|
move.l d2,-(a7)
|
|
move.w d0,d2
|
|
mulu d1,d2
|
|
swap d0
|
|
mulu d1,d0
|
|
swap d0
|
|
tst.w d0
|
|
bne .ovrflw
|
|
clr.w d0
|
|
add.l d2,d0
|
|
move.l (a7)+,d2
|
|
tst.l d0
|
|
rts
|
|
.ovrflw move.l (a7)+,d2
|
|
or.w #2,ccr
|
|
rts
|
|
|
|
LongDiv: ;Divide a 32-bit number in D0 by a 16-bit number in D1
|
|
; without overflow. Returns 32-bit quotient in D0
|
|
; and remainder in D1. Division is unsigned.
|
|
; Registers A0-A1 are preserved.
|
|
movem.l d2-d3,-(a7)
|
|
move.l d0,d2
|
|
clr.w d0
|
|
swap d0
|
|
divu d1,d0
|
|
move.w d0,d3
|
|
swap d3
|
|
move.w d2,d0
|
|
divu d1,d0
|
|
move.w d0,d3
|
|
swap d0
|
|
moveq #0,d1
|
|
move.w d0,d1
|
|
move.l d3,d0
|
|
movem.l (a7)+,d2-d3
|
|
rts
|
|
|
|
StrLen: ;Return length of string in A0. Leaves A0 alone.
|
|
move.l a0,a1
|
|
moveq #-1,d0
|
|
.lp addq.l #1,d0
|
|
tst.b (a1)+
|
|
bne .lp
|
|
rts
|
|
|
|
RTS: ;Just an RTS. Possibly useful in some cases.
|
|
rts
|