* long divide and mod routines

 name Long_Div

* temp storage

 bss

drtrn rmb 2
dtemp rmb 2
ldcnt rmb 1
rsn rmb 1
op1s rmb 1
ltemp rmb 4

 text

* general dive routine

gdiv ldd 8,s
 bne 2f
 ldd 6,s
 beq 9f
2 lda #1
3 inca
 asl 9,s
 rol 8,s
 rol 7,s
 rol 6,s
 bpl 3b
 sta ldcnt
4 ldd 12,s
 subd 8,s
 std 12,s
 ldd 10,s
 sbcb 7,s
 sbca 6,s
 std 10,s
 bcc 5f
 ldd 12,s
 addd 8,s
 std 12,s
 ldd 10,s
 adcb 7,s
 adca 6,s
 std 10,s
 clc
 bra 6f
5 sec
6 rol 5,s
 rol 4,s
 rol 3,s
 rol 2,s
 lsr 6,s
 ror 7,s
 ror 8,s
 ror 9,s
 dec ldcnt
 bne 4b
9 rts

* unsigned long divide

 global udivlong
udivlong std dtemp
 puls d
 std drtrn
 ldd #0
 pshs d
 pshs d
 bsr gdiv
 ldd 0,s
 std 8,s
 ldd 2,s
 std 10,s
 leas 8,s
 ldd dtemp
 jmp [drtrn]

* signed long divide

 global divlong
divlong std dtemp
 puls d
 std drtrn
 bsr makpos
 ldd #0
 pshs d
 pshs d
 jsr gdiv
 ldd 0,s
 std 8,s
 ldd 2,s
 std 10,s
 leas 8,s
 bsr setrslt
 ldd dtemp
 jmp [drtrn]

* signed long mod

 global modlong
modlong std dtemp
 puls d
 std drtrn
 bsr makpos
 ldd #0
 pshs d
 pshs d
 jsr gdiv
 lda op1s
 sta rsn
 leas 8,s
 bsr setrslt
 ldd dtemp
 jmp [drtrn]

* unsigned long mod

 global umodlong
umodlong std dtemp
 puls d
 std drtrn
 ldd #0
 pshs d
 pshs d
 jsr gdiv
 leas 8,s
 ldd dtemp
 jmp [drtrn]

* make operands positive

makpos lda 6,s
 eora 2,s
 anda #$80
 sta rsn
 clr op1s
 tst 6,s
 bpl 2f
 inc op1s
 ldd #0
 subd 8,s
 std 8,s
 ldd #0
 sbcb 7,s
 sbca 6,s
 std 6,s
2 tst 2,s
 bpl 4f
 ldd #0
 subd 4,s
 std 4,s
 ldd #0
 sbcb 3,s
 sbca 2,s
 std 2,s
4 rts

* set result sign

setrslt tst rsn
 beq 2f
 ldd #0
 subd 4,s
 std 4,s
 ldd #0
 sbcb 3,s
 sbca 2,s
 std 2,s
2 rts

* reversed  long signed divide

 global rdivlong
rdivlong bsr revops
 jmp divlong

* reversed long unsigned divide

 global rudivlong
rudivlong bsr revops
 jmp udivlong

* reversed long signed mod

 global rmodlong
rmodlong bsr revops
 jmp modlong

* reversed long unsigned mod

 global rumodlong
rumodlong bsr revops
 jmp umodlong

* reverse operands

revops pshs d
 ldd 6,s
 std ltemp
 ldd 8,s
 std ltemp+2
 ldd 10,s
 std 6,s
 ldd 12,s
 std 8,s
 ldd ltemp
 std 10,s
 ldd ltemp+2
 std 12,s
 puls d,pc

