2 ; Ullrich von Bassewitz, 17.08.1998
3 ; Christian Krueger, 11-Mar-2017, added 65SC02 optimization
5 ; CC65 runtime: division for long unsigned ints
8 .export tosudiv0ax, tosudiveax, getlop, udiv32
10 .importzp sp, sreg, tmp3, tmp4, ptr1, ptr2, ptr3, ptr4
15 .if (.cpu .bitand ::CPU_ISET_65SC02)
25 jsr getlop ; Get the paramameters
26 jsr udiv32 ; Do the division
27 lda ptr1 ; Result is in ptr1:sreg
31 ; Pop the parameters for the long division and put it into the relevant
32 ; memory cells. Called from the signed divisions also.
34 getlop: sta ptr3 ; Put right operand in place
41 .if (.cpu .bitand ::CPU_ISET_65SC02)
45 ldy #0 ; Put left operand in place
58 jmp addysp1 ; Drop parameters
60 ; Do (ptr1:sreg) / (ptr3:ptr4) --> (ptr1:sreg), remainder in (ptr2:tmp3:tmp4)
61 ; This is also the entry point for the signed division
78 ; Do a subtraction. we do not have enough space to store the intermediate
79 ; result, so we may have to do the subtraction twice.
91 ; Overflow, do the subtraction again, this time store the result
93 sta tmp4 ; We have the high byte already
103 inc ptr1 ; Set result bit