;*************************************************************************
;** Oberon-A 1.6                                                        **
;** Contributor: L.Lucius                               Sept 23rd 1995  **
;** Modified for HOp:   Thomas Richter  (thor)          Nov  1st  1997  **
;** Function:    Modify 68000 math routines to use 68020+ instructions. **
;*************************************************************************


;*************************************************************************
;
; DIV
;
#match
#code
48E7 3C00                       ;   MOVEM.L     D2-D5,-(A7)
4A80                            ;   TST.L       D0
5BC4                            ;   SMI         D4
6A02                            ;   BPL.B       0042
4480                            ;   NEG.L       D0
4A81                            ;   TST.L       D1
5BC5                            ;   SMI         D5
6A02                            ;   BPL.B       004A
4481                            ;   NEG.L       D1
4A81                            ;   TST.L       D1
6612                            ;   BNE.B       0060
7069                            ;   MOVEQ       #69,D0
41FA 009C                       ;   LEA         009C(PC),A0
2239 0001 0000                  ;   MOVE.L      00010000,D1
4EB9 RRRR RRRR                  ;   JSR         Kernel_Halt
B081                            ;   CMP.L       D1,D0
620E                            ;   BHI.B       0072
6706                            ;   BEQ.B       006C
2200                            ;   MOVE.L      D0,D1
7000                            ;   MOVEQ       #00,D0
6070                            ;   BRA.B       00DC
7001                            ;   MOVEQ       #01,D0
7200                            ;   MOVEQ       #00,D1
606A                            ;   BRA.B       00DC
B2BC 0000 0001                  ;   CMP.L       #00000001,D1
6604                            ;   BNE.B       007E
7200                            ;   MOVEQ       #00,D1
605E                            ;   BRA.B       00DC
B0BC 0000 FFFF                  ;   CMP.L       #0000FFFF,D0
620E                            ;   BHI.B       0094
80C1                            ;   DIVU.W      D1,D0
4840                            ;   SWAP        D0
7200                            ;   MOVEQ       #00,D1
3200                            ;   MOVE.W      D0,D1
4240                            ;   CLR.W       D0
4840                            ;   SWAP        D0
6048                            ;   BRA.B       00DC
B2BC 0000 FFFF                  ;   CMP.L       #0000FFFF,D1
6220                            ;   BHI.B       00BC
2400                            ;   MOVE.L      D0,D2
4242                            ;   CLR.W       D2
4842                            ;   SWAP        D2
84C1                            ;   DIVU.W      D1,D2
7600                            ;   MOVEQ       #00,D3
3602                            ;   MOVE.W      D2,D3
4843                            ;   SWAP        D3
3400                            ;   MOVE.W      D0,D2
84C1                            ;   DIVU.W      D1,D2
2202                            ;   MOVE.L      D2,D1
4241                            ;   CLR.W       D1
4841                            ;   SWAP        D1
7000                            ;   MOVEQ       #00,D0
3002                            ;   MOVE.W      D2,D0
D083                            ;   ADD.L       D3,D0
6020                            ;   BRA.B       00DC
7401                            ;   MOVEQ       #01,D2
7600                            ;   MOVEQ       #00,D3
B280                            ;   CMP.L       D0,D1
6206                            ;   BHI.B       00CA
D482                            ;   ADD.L       D2,D2
D281                            ;   ADD.L       D1,D1
6AF6                            ;   BPL.B       00C0
B280                            ;   CMP.L       D0,D1
6204                            ;   BHI.B       00D2
8682                            ;   OR.L        D2,D3
9081                            ;   SUB.L       D1,D0
E289                            ;   LSR.L       #1,D1
E28A                            ;   LSR.L       #1,D2
66F2                            ;   BNE.B       00CA
2200                            ;   MOVE.L      D0,D1
2003                            ;   MOVE.L      D3,D0
BA04                            ;   CMP.B       D4,D5
6702                            ;   BEQ.B       00E2
4480                            ;   NEG.L       D0
4A04                            ;   TST.B       D4
6702                            ;   BEQ.B       00E8
4481                            ;   NEG.L       D1
4CDF 003C                       ;   MOVEM.L     (A7)+,D2-D5
4E75                            ;   RTS
;
;
#replace
4C41 0801                       ;   DIVSL.L     D1,D1:D0
4E75                            ;   RTS
#end


;*************************************************************************
;
; MUL
;
#match
#code
48E7 3800                       ;   MOVEM.L     D2-D4,-(A7)
4A80                            ;   TST.L       D0
5BC4                            ;   SMI         D4
6A02                            ;   BPL.B       000C
4480                            ;   NEG.L       D0
4A81                            ;   TST.L       D1
6A04                            ;   BPL.B       0014
4604                            ;   NOT.B       D4
4481                            ;   NEG.L       D1
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
4A04                            ;   TST.B       D4
6702                            ;   BEQ.B       0030
4480                            ;   NEG.L       D0
4CDF 001C                       ;   MOVEM.L     (A7)+,D2-D4
4E75                            ;   RTS
;
;
#replace
4C01 0800                       ;   MULS.L      D1,D0
4E75                            ;   RTS
#end

