;*************************************************************************
;** HCE 1.0 & NorthC 1.2 MUL(S)/DIV(S)/MOD(S)                           **
;** Contributor: L.Lucius                               Sept 23rd 1995  **
;** Modified for HOp:   Thomas Richter  (thor)          Nov  1st  1997  **
;** Function:    Modify 68000 math routines to use 68020+ instructions. **
;*************************************************************************



;*************************************************************************
;
; Divs
;
#match
#code
202F 0004                       ;   MOVE.L      0004(A7),D0
6A02                            ;   BPL.B       0008
4480                            ;   NEG.L       D0
222F 0008                       ;   MOVE.L      0008(A7),D1
6A08                            ;   BPL.B       0016
4481                            ;   NEG.L       D1
0A2F 0080 0004                  ;   EORI.B      #80,0004(A7)
6100 008E                       ;   BSR.W       00A6
4A2F 0004                       ;   TST.B       0004(A7)
6A02                            ;   BPL.B       0022
4480                            ;   NEG.L       D0
4E75                            ;   RTS
;
; MULS()
;
202F 0004                       ;   MOVE.L      0004(A7),D0
6A02                            ;   BPL.B       002C
4480                            ;   NEG.L       D0
222F 0008                       ;   MOVE.L      0008(A7),D1
6A08                            ;   BPL.B       003A
4481                            ;   NEG.L       D1
0A2F 0080 0004                  ;   EORI.B      #80,0004(A7)
614E                            ;   BSR.B       008A
4A2F 0004                       ;   TST.B       0004(A7)
6A02                            ;   BPL.B       0044
4480                            ;   NEG.L       D0
4E75                            ;   RTS
;
; MODS()
;
202F 0004                       ;   MOVE.L      0004(A7),D0
6A02                            ;   BPL.B       004E
4480                            ;   NEG.L       D0
222F 0008                       ;   MOVE.L      0008(A7),D1
6A02                            ;   BPL.B       0056
4481                            ;   NEG.L       D1
614E                            ;   BSR.B       00A6
2001                            ;   MOVE.L      D1,D0
4A2F 0004                       ;   TST.B       0004(A7)
6A02                            ;   BPL.B       0062
4480                            ;   NEG.L       D0
4E75                            ;   RTS
;
; DIVU()
;
202F 0004                       ;   MOVE.L      0004(A7),D0
222F 0008                       ;   MOVE.L      0008(A7),D1
6138                            ;   BSR.B       00A6
4E75                            ;   RTS
;
; MULU()
;
202F 0004                       ;   MOVE.L      0004(A7),D0
222F 0008                       ;   MOVE.L      0008(A7),D1
6110                            ;   BSR.B       008A
4E75                            ;   RTS
;
; MODU()
;
202F 0004                       ;   MOVE.L      0004(A7),D0
222F 0008                       ;   MOVE.L      0008(A7),D1
6120                            ;   BSR.B       00A6
2001                            ;   MOVE.L      D1,D0
4E75                            ;   RTS
XXXX                            ;   MOVEA.L     D3,A2    | MOVE.L D3,-(A7)
3401                            ;   MOVE.W      D1,D2
C4C0                            ;   MULU.W      D0,D2
2601                            ;   MOVE.L      D1,D3
4843                            ;   SWAP        D3
C6C0                            ;   MULU.W      D0,D3
4840                            ;   SWAP        D0
C0C1                            ;   MULU.W      D1,D0
D083                            ;   ADD.L       D3,D0
4840                            ;   SWAP        D0
4240                            ;   CLR.W       D0
D082                            ;   ADD.L       D2,D0
XXXX                            ;   MOVE.L      A2,D3    | MOVE.L (A7)+,D3
4E75                            ;   RTS
4A81                            ;   TST.L       D1
660E                            ;   BNE.B       00B8
80FC 0000                       ;   DIVU.W      #0000,D0
203C 8000 0000                  ;   MOVE.L      #80000000,D0
2200                            ;   MOVE.L      D0,D1
4E75                            ;   RTS
XXXX                            ;   MOVEA.L     D3,A2    | MOVE.L D3,-(A7)
B081                            ;   CMP.L       D1,D0
6212                            ;   BHI.B       00D0
;
;
#replace
;
; DIVS()
;
202F 0004                       ;   MOVE.L      0004(A7),D0
222F 0008                       ;   MOVE.L      0008(A7),D1
4C41 0801                       ;   DIVSL.L     D1,D1:D0
4E75                            ;   RTS
4481                            ;   NEG.L       D1
0A2F 0080 0004                  ;   EORI.B      #80,0004(A7)
6100 008E                       ;   BSR.W       00A6
4A2F 0004                       ;   TST.B       0004(A7)
6A02                            ;   BPL.B       0022
4480                            ;   NEG.L       D0
4E75                            ;   RTS
;
; MULS()
;
202F 0004                       ;   MOVE.L      0004(A7),D0
4C2F 0800 0008                  ;   MULS.L      0008(A7),D0
4E75                            ;   RTS
6A08                            ;   BPL.B       003A
4481                            ;   NEG.L       D1
0A2F 0080 0004                  ;   EORI.B      #80,0004(A7)
614E                            ;   BSR.B       008A
4A2F 0004                       ;   TST.B       0004(A7)
6A02                            ;   BPL.B       0044
4480                            ;   NEG.L       D0
4E75                            ;   RTS
;
; MODS()
;
202F 0004                       ;   MOVE.L      0004(A7),D0
222F 0008                       ;   MOVE.L      0008(A7),D1
4C41 0801                       ;   DIVSL.L     D1,D1:D0
C141                            ;   EXG         D0,D1
4E75                            ;   RTS
614E                            ;   BSR.B       00A6
2001                            ;   MOVE.L      D1,D0
4A2F 0004                       ;   TST.B       0004(A7)
6A02                            ;   BPL.B       0062
4480                            ;   NEG.L       D0
4E75                            ;   RTS
;
; DIVU()
;
202F 0004                       ;   MOVE.L      0004(A7),D0
222F 0008                       ;   MOVE.L      0008(A7),D1
6138                            ;   BSR.B       00A6
4E75                            ;   RTS
;
; MULU()
;
202F 0004                       ;   MOVE.L      0004(A7),D0
222F 0008                       ;   MOVE.L      0008(A7),D1
6110                            ;   BSR.B       008A
4E75                            ;   RTS
;
; MODU()
;
202F 0004                       ;   MOVE.L      0004(A7),D0
222F 0008                       ;   MOVE.L      0008(A7),D1
6120                            ;   BSR.B       00A6
2001                            ;   MOVE.L      D1,D0
4E75                            ;   RTS
4C01 0000                       ;   MULU.L      D1,D0
4E75                            ;   RTS
2601                            ;   MOVE.L      D1,D3
4843                            ;   SWAP        D3
C6C0                            ;   MULU.W      D0,D3
4840                            ;   SWAP        D0
C0C1                            ;   MULU.W      D1,D0
D083                            ;   ADD.L       D3,D0
4840                            ;   SWAP        D0
4240                            ;   CLR.W       D0
D082                            ;   ADD.L       D2,D0
260A                            ;   MOVE.L      A2,D3
4E75                            ;   RTS
4A81                            ;   TST.L       D1
660E                            ;   BNE.B       00B8
80FC 0000                       ;   DIVU.W      #0000,D0
203C 8000 0000                  ;   MOVE.L      #80000000,D0
2200                            ;   MOVE.L      D0,D1
4E75                            ;   RTS
4C41 0001                       ;   DIVUL.L     D1,D1:D0
4E75                            ;   RTS
#end

