* integer divide and mod routines

 name Int_Div

 text

* mod operations

 global irmod
irmod pshs d
 ldd 4,s
 bsr imod
 leas 2,s
 rts

 global urmod
urmod pshs d
 ldd 4,s
 bsr umod
 leas 2,s
 rts

 global umod
umod pshs d
 ldd 4,s
 pshs d
 ldd 2,s
 bsr udiv
 leas 4,s
 ldd work
 rts

 global imod
imod pshs d
 ldd 4,s
 pshs d
 ldd 2,s
 bsr idiv
 leas 4,s
 tst op1sgn
 bne 2f
 ldd work
 rts
2 ldd work
 nega
 negb
 sbca #0
 cmpd #0
 rts

* integer divide

 global irdiv
irdiv pshs d
 ldd 4,s
 bsr idiv
 leas 2,s
 rts

 global udiv
udiv cmpd #0
 lbeq 9f
 pshs d
 ldd #$0100
 pshs d
 bra 3f

 global urdiv
urdiv pshs d
 ldd 4,s
 bsr udiv
 leas 2,s
 rts

 global idiv
idiv cmpd #0
 lbeq 9f
 pshs d
 ldd #$0100
 pshs d
 clr op1sgn
 tst 2,s
 bpl 2f
 ldd 2,s
 nega
 negb
 sbca #0
 std 2,s
 dec 1,s
2 ldd 6,s
 bpl 3f
 inc op1sgn
 nega
 negb
 sbca #0
 std 6,s
 inc 1,s
3 inc 0,s
 asl 3,s
 rol 2,s
 bpl 3b
 ldd 6,s
 clr 6,s
 clr 7,s
4 subd 2,s
 bcc 5f
 addd 2,s
 clc
 bra 6f
5 sec
6 rol 7,s
 rol 6,s
 lsr 2,s
 ror 3,s
 dec 0,s
 bne 4b
 std work
 ldd 6,s
 tst 1,s
 beq 7f
 nega
 negb
 sbca #0
7 leas 4,s
 cmpd #0
8 rts
9 std work
 rts

 bss

op1sgn rmb 1
work rmb 2

 text
 end
