mirror of
https://github.com/cc65/cc65.git
synced 2024-12-27 15:29:46 +00:00
65 lines
1.3 KiB
ArmAsm
65 lines
1.3 KiB
ArmAsm
;
|
|
; Ullrich von Bassewitz, 2009-11-04
|
|
;
|
|
; CC65 runtime: 32by16 => 16 signed division
|
|
;
|
|
|
|
.export idiv32by16r16
|
|
.import negax, udiv32by16r16m
|
|
|
|
.include "zeropage.inc"
|
|
|
|
|
|
;---------------------------------------------------------------------------
|
|
; 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
|
|
;
|
|
|
|
|
|
idiv32by16r16:
|
|
stx tmp1
|
|
cpx #0
|
|
bpl @L1
|
|
jsr negax
|
|
@L1: sta ptr3
|
|
stx ptr3+1
|
|
|
|
lda ptr2+1
|
|
eor tmp1
|
|
sta tmp1
|
|
bit ptr2+1
|
|
bpl @L3
|
|
|
|
; Negate the value in ptr1:ptr2
|
|
|
|
ldx #0
|
|
ldy #4
|
|
sec
|
|
@L2: lda ptr1,x
|
|
eor #$FF
|
|
adc #$00
|
|
sta ptr1,x
|
|
inx
|
|
dey
|
|
bne @L2
|
|
|
|
; Call the unsigned division routine
|
|
|
|
@L3: jsr udiv32by16r16m
|
|
|
|
; Check the sign of the result
|
|
|
|
bit tmp1
|
|
bmi @L4
|
|
rts
|
|
|
|
; Negate the result. We do this here only for the result, not for the
|
|
; remainder!
|
|
|
|
@L4: jmp negax
|
|
|