00001 *************************
00002 *
00003 * DS3216.ASM
00004 * MDJ 09-26-90
00005 *
00006 * 32-BIT BY 16-BIT
00007 * SIGNED INTEGER DIVIDE
00008 *
00009 *************************
00010 *
00011 * REQUIRES: D3216
00012 *
00013 * ON ENTRY, 32-BIT SIGNED
00014 * DIVIDEND MUST BE IN 
00015 * DIVDND AND 16-BIT
00016 * SIGNED DIVISOR MUST BE
00017 * IN DIVSOR
00018 *
00019 * ON EXIT, 32-BIT SIGNED
00020 * QUOTIENT IS IN QUOTNT,
00021 * 16-BIT SIGNED QUOTIENT
00022 * (IF VALID) IS IN Q16,
00023 * AND 16-BIT SIGNED
00024 * MODULUS (REMAINDER) IS
00025 * IN MODLUS
00026 *
00027 *************************
00028 *
00029 * THIS IS A FLOORED
00030 * DIVISION ROUTINE
00031 *
00032 * REF. 1983 FORTH
00033 * STANDARD FOR DEFINITION
00034 * OF FLOORED DIVISION
00035 *
00036 *************************
00037 *
00038 D3216   EQU     $437E   UNSIGNED DIVISION ROUTINE
00039 DIVDND  EQU     $CB     32-BIT DIVIDEND (SCRATCHPAD)
00040 DIVSOR  EQU     $CF     16-BIT DIVISOR (SCRATCHPAD)
00041 DIVHLD  EQU     $D9     TEMPORARY SCRATCH VARIABLE
00042 QUOTNT  EQU     $CB     32-BIT QUOTIENT (SCRATCHPAD)
00043 MODLUS  EQU     $CF     16-BIT MODULUS (SCRATCHPAD)
00044 Q16     EQU     $CD     16-BIT QUOTIENT (SCRATCHPAD)
00045         ORG     $43F6
00046 DS3216  PSHS    A,B
00047         LDA     DIVSOR
00048         PSHU    CC      TEMPORARILY STORE SIGN OF MODULUS
00049         EORA    DIVDND
00050         PSHU    CC      TEMPORARILY STORE QUOTIENT SIGN
00051         LDA     DIVDND  TEST SIGN OF DIVIDEND
00052         BPL     DS32A   GO IF +
00053         JSR     DS32X   GET 32-BIT ABSOLUTE VALUE
00054 DS32A   LDA     DIVSOR  TEST DIVISOR SIGN
00055         BPL     DS32B   GO IF +
00056         JSR     DS32Y   GET 16-BIT ABSOLUTE VALUE
00057 DS32B   LDD     DIVSOR
00058         STD     DIVHLD  TEMPORARILY STORE DIVISOR
 
 
 
 
 
 
 
 
00059         PULS    A,B
00060         JSR     D3216   GO DO UNSIGNED DIVIDE
00061         PSHS    A,B
00062         PULU    CC      GET SIGN OF QUOTIENT
00063         BPL     DS32C   GO IF +
00064         JSR     DS32F   FLOOR QUOTIENT
00065         JSR     DS32X   NEGATE QUOTIENT
00066         LDD     MODLUS  ADJUST MODULUS
00067         SUBD    DIVHLD
00068         STD     MODLUS
00069         PULU    CC      GET SIGN OF MODULUS
00070         BMI     DS32D   GO IF MINUS
00071         JSR     DS32Y   NEGATE MODULUS
00072         BRA     DS32D
00073 DS32C   PULU    CC      GET SIGN OF MODULUS
00074         BPL     DS32D   GO IF +
00075         JSR     DS32Y   NEGATE MODULUS
00076 DS32D   PULS    A,B
00077         RTS
00078 DS32X   COM     QUOTNT  32-BIT NEGATE ROUTINE
00079         COM     QUOTNT+1
00080         COM     QUOTNT+2
00081         COM     QUOTNT+3
00082 DS32F   LDD     QUOTNT+2 QUOTIENT FLOORING ENTRY POINT
00083         ADDD    #1
00084         STD     QUOTNT+2
00085         LDA     QUOTNT+1
00086         ADCA    #0
00087         STA     QUOTNT+1
00088         LDA     QUOTNT
00089         ADCA    #0
00090         STA     QUOTNT
00091         RTS
00092 DS32Y   LDD     #0      16-BIT NEGATE ROUTINE
00093         SUBD    MODLUS
00094         STD     MODLUS
00095 ZEND    RTS
00096         END
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
