
  Patch um den Bug in der GEMX-LONGINT-MODULO-Funktion zu beseitigen,
  soda das zur INTEGER-MODULO-Funktion analoge Resultat geliefert wird.
    Z.B.:
           13 MOD  5 = 3, -13 MOD  5 = -3,
           13 MOD -5 = 3, -13 MOD -5 = -3,
           13 MOD  0 = 0

(*$P-  No entry/exit code, 'cause jumping directly to DIVU32.*)
PROCEDURE DIVS32 (Dividend, Divisor: LONGINT);
 CONST P1 = 4; (* Offset of dividend/quotient on stack.*)
       P2 = 0; (* Offset of divisor/remainder on stack.*)
 BEGIN
  CODE ( 201FH,         (* MOVE.L  (A7)+, D0 *)
         2E2FH, P1,     (* MOVE.L  4H(A7), D7 ; get dividend *)
         2C2FH, P2,     (* MOVE.L  0H(A7), D6 ; get divisor  *)
        0BF86H,         (* EOR.L   D7, D6    *)
         5BC6H,         (* SMI.B   D6 ; signs different? must neg quotient.*)
         4AAFH, P2,     (* TST.L   0H(A7)    *)
         6A04H,         (* BPL.S   [04]      *)
         44AFH, P2,     (* NEG.L   0H(A7)    *)
         4A87H,         (* TST.L   D7        *)
         5BC7H,         (* SMI.B   D7 ; remainder must get dividend's sign,*)
         6A04H,         (* BPL.S   [04] ;   to be compatible with word-MOD.*)
         44AFH, P1 );   (* NEG.L   4H(A7)    *)
  SETREG (8, DIVU32);
  CODE ( 4E90H,         (* JSR     (A0)      *)
         4A07H,         (* TST.B   D7        *)
         6704H,         (* BEQ.S   [04]      *)
         44AFH, P2,     (* NEG.L   0H(A7)    *)
         4A06H,         (* TST.B   D6        *)
         6704H,         (* BEQ.S   [04]      *)
         44AFH, P1,     (* NEG.L   4H(A7)    *)
         2F00H,         (* MOVE.L  D0, -(A7) *)
         4E75H );       (* RTS *)  END DIVS32;

(*
Disassembling des alten DIVS32:

     procnum = 11
     0H       201F                     MOVE.L  (A7)+,D0
     2H       2E2F 0000                MOVE.L  0000(A7),D7
     6H       2C2F 0004                MOVE.L  0004(A7),D6
     AH       BF86                     EOR.L   D7,D6
     CH       5BC6                     SMI     D6
     EH       4AAF 0004                TST.L   0004(A7)
    12H       6A04                     BPL     [04H] = 00000018H
    14H       44AF 0004                NEG.L   0004(A7)
    18H       4A87                     TST.L   D7
    1AH       5BC7                     SMI     D7
    1CH       6A04                     BPL     [04H] = 00000022H
    1EH       44AF 0000                NEG.L   0000(A7)
    22H       207C 0000 0000           MOVE.L  #0000000H,A0
    28H       4E90                     JSR     (A0)
    2AH       4A07                     TST.B   D7
    2CH       6704                     BEQ     [04H] = 00000032H
    2EH       44AF 0000                NEG.L   0000(A7)
    32H       4A06                     TST.B   D6
    34H       6704                     BEQ     [04H] = 0000003AH
    36H       44AF 0004                NEG.L   0004(A7)
    3AH       2F00                     MOVE.L  D0,-(A7)
    3CH       4E75                     RTS
*)

Disassembling der INTEGER-MODULO-Funktion:

MODULE TestMOD;
(*  1993-94 ROLF SCHRADER. * 15.11.93 *)
(*$T-,$S-,$Q+*)
VAR   z,m,r: INTEGER;
BEGIN z := 13; m := 5; r := z MOD m END TestMOD.


scmod init code, procnum =  0, entrypoint =     0H, number of bytes = 56
 DECODE --------                        INSTRUCTION
     0H        4EF9 0000 0000           JMP     00000000H
     6H        4E56 0000                LINK    A6,#0000H
     AH        33FC 000D 0000 0000      MOVE.W  #000DH,00000000H
    12H        33FC 0005 0000 0002      MOVE.W  #0005H,00000002H
    1AH        3A39 0000 0000           MOVE.W  00000000H,D5
    20H        48C5                     EXT.L   D5
    22H        8BF9 0000 0002           DIVS    00000002H,D5
    28H        4845                     SWAP    D5
    2AH        33C5 0000 0004           MOVE.W  D5,00000004H
    30H        4E5E                     UNLK    A6
    32H        4EF9 0000 0000           JMP     00000000H
  checksum: o.k.

