amos-professional/extensions/Intuition-41.95/Intuition/src2/iutils.s

85 lines
1.6 KiB
ArmAsm
Raw Normal View History

2020-04-26 00:58:13 +00:00
;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