ugt.o \
ule.o \
ult.o \
+ udiv32by16r16.o \
umod.o \
umul16x16r32.o \
xor.o \
; CC65 runtime: 16x16 => 32 signed multiplication
;
- .export imul16x16r32, _cc65_imul16x16r32
- .import popax, negax, umul16x16r32m, negeax
+ .export imul16x16r32
+ .import negax, umul16x16r32m, negeax
.importzp ptr1, ptr3, tmp1
; There is probably a faster way to do this.
;
-
-_cc65_imul16x16r32:
- sta ptr1
- stx ptr1+1
- jsr popax
-
imul16x16r32:
stx tmp1
cpx #0
--- /dev/null
+;
+; Ullrich von Bassewitz, 2009-11-04
+;
+; CC65 runtime: 32by16 => 16 unsigned division
+;
+
+ .export udiv32by16r16, udiv32by16r16m
+ .importzp ptr1, ptr2, ptr3, sreg
+
+
+;---------------------------------------------------------------------------
+; 32by16 division. Divide ptr1:ptr2 by ptr3. Result is in ptr1, remainder
+; in sreg.
+;
+; lhs rhs result result also in remainder
+; -----------------------------------------------------------------------
+; ptr1:ptr2 ptr3 ax ptr1 sreg
+;
+
+
+udiv32by16r16:
+ sta ptr3
+ stx ptr3+1
+udiv32by16r16m:
+ lda #0
+ sta sreg+1
+ ldy #32
+
+L0: asl ptr1
+ rol ptr1+1
+ rol ptr2
+ rol ptr2+1
+ rol a
+ rol sreg+1
+
+ pha
+ cmp ptr3
+ lda sreg+1
+ sbc ptr3+1
+ bcc L1
+
+ sta sreg+1
+ pla
+ sbc ptr3
+ pha
+ inc ptr1
+
+L1: pla
+ dey
+ bne L0
+ sta sreg
+ lda ptr1
+ ldx ptr1+1
+ rts
+
; CC65 runtime: 16x16 => 32 unsigned multiplication
;
- .export _cc65_umul16x16r32, umul16x16r32, umul16x16r32m
- .import popax
+ .export umul16x16r32, umul16x16r32m
.importzp ptr1, ptr3, sreg
; ptr1 ax ax:sreg ptr1:sreg
;
-_cc65_umul16x16r32:
- sta ptr1
- stx ptr1+1
- jsr popax
-
umul16x16r32:
sta ptr3
stx ptr3+1