00001 *************************
00002 *
00003 * SAB.ASM
00004 * MDJ 11-19-90
00005 *
00006 * ARITHMETIC OPERATORS
00007 *
00008 *************************
00009 *
00010 * REQUIRES: M1616
00011 *           MS1616
00012 *           D3216
00013 *           DS3216
00014 *           ATONCV
00015 *           SAA
00016 *
00017 *************************
00018 *
00019 MLTIC1  EQU     $CB     WORKING MULTIPLICATION VARIABLES
00020 MLTIC2  EQU     $CD
00021 R16     EQU     $D1
00022 RS16    EQU     $D9
00023 DIVDND  EQU     $CB     WORKING DIVISION VARIABLES
00024 DIVSOR  EQU     $CF
00025 RESULT  EQU     $CF
00026 Q16     EQU     $CD
00027 NUMBER  EQU     $4564   NUMBER CONVERSION VARIABLE
00028 NEG16   EQU     $456A   16-BIT NEGATE
00029 NEG32   EQU     $457B   32-BIT NEGATE
00030 M1616   EQU     $4327   16 BY 16 UNSIGNED MULTIPLY
00031 MS1616  EQU     $43A8   16 BY 16 SIGNED MULTIPLY
00032 D3216   EQU     $437E   32 BY 16 UNSIGNED DIVIDE
00033 DS3216  EQU     $43F6   32 BY 16 SIGNED DIVIDE
00034 ROLL    EQU     $4884   SAA ROUTINE
00035         ORG     $48AF
00036 *
00037 *************************
00038 *
00039 * PLUS
00040 * (w1 w2 -- w3)
00041 * w3 IS THE ARITHMETIC
00042 * SUM OF w1 PLUS w2
00043 *
00044 *************************
00045 *
00046 PLUS    PSHS    A,B,X   +
00047         PULU    A,B
00048         ADDD    ,U
00049         PULU    X
00050         PSHU    A,B
00051         PULS    A,B,X
00052         RTS
00053 *
00054 *************************
00055 *
00056 * MINUS
00057 * (w1 w2 -- w3)
00058 * w3 IS THE RESULT OF
 
 
 
 
 
 
 
 
00059 * SUBTRACTING w2 FROM w1
00060 *
00061 *************************
00062 *
00063 MINUS   PSHS    A,B,X   -
00064         LDD     2,U
00065         SUBD    ,U
00066         PULU    X
00067         PULU    X
00068         PSHU    A,B
00069         PULS    A,B,X
00070         RTS
00071 *
00072 *************************
00073 *
00074 * MULT
00075 * (w1 w2 -- w3)
00076 * w3 IS THE LEAST
00077 * SIGNIFICANT 16 BITS OF
00078 * THE ARITHMETIC PRODUCT
00079 * OF w1 TIMES w2
00080 *
00081 *************************
00082 *
00083 MULT    PSHS    A,B     *
00084         PULU    A,B
00085         STD     MLTIC1
00086         PULU    A,B
00087         STD     MLTIC2
00088         JSR     MS1616
00089         LDD     RS16
00090         PSHU    A,B
00091         PULS    A,B
00092         RTS
00093 *
00094 *************************
00095 *
00096 * DIV
00097 * (n1 n2 -- n3)
00098 * n3 IS THE FLOOR OF THE
00099 * QUOTIENT OF n1 DIVIDED
00100 * BY n2
00101 *
00102 *************************
00103 *
00104 DIV     PSHS    A,B,X,Y /
00105         JSR     DIVY    WORKING DIVISION ROUTINE
00106         PULU    A,B
00107         PULU    A,B
00108         PSHU    X
00109         PULS    A,B,X,Y
00110         RTS
00111 *
00112 *************************
00113 *
00114 * ABS
00115 * (n -- u)
00116 * u IS THE ABSOLUTE VALUE
 
 
 
 
 
 
 
 
00117 * OF n
00118 *
00119 *************************
00120 *
00121 ABS     PSHS    A,B
00122         PULU    A,B
00123         CMPD    #0
00124         BGE     ABS1
00125         STD     NUMBER+2
00126         JSR     NEG16
00127         LDD     NUMBER+2
00128 ABS1    PSHU    A,B
00129         PULS    A,B
00130         RTS
00131 *
00132 *************************
00133 *
00134 * DIVM
00135 * (n1 n2 -- n3 n4)
00136 * n3 IS THE REMAINDER AND
00137 * n4 IS THE FLOOR OF THE
00138 * QUOTIENT OF n1 DIVIDED
00139 * BY n2.  n3 HAS THE SAME
00140 * SIGN AS n2 OR IS ZERO
00141 *
00142 *************************
00143 *
00144 DIVM    PSHS    A,B,X,Y /MOD
00145         JSR     DIVY    WORKING DIVISION ROUTINE
00146         PULU    A,B
00147         PULU    A,B
00148         PSHU    Y
00149         PSHU    X
00150         PULS    A,B,X,Y
00151         RTS
00152 *
00153 *************************
00154 *
00155 * MULTD
00156 * (n1 n2 n3 -- n4)
00157 * n1 IS FIRST MULTIPLIED
00158 * BY n2 PRODUCING AN
00159 * INTERMEDIATE 32-BIT
00160 * RESULT.  n4 IS THE
00161 * FLOOR OF THE QUOTIENT
00162 * OF THE INTERMEDIATE
00163 * 32-BIT RESULT DIVIDED
00164 * BY n3
00165 *
00166 *************************
00167 *
00168 MULTD   PSHS    A,B,X,Y */
00169         JSR     MDIV    WORKING MULTIPLICATION ROUTINE
00170         JSR     DIVX    WORKING DIVISION ROUTINE
00171         PULU    A,B
00172         PULU    A,B
00173         PULU    A,B
00174         PSHU    X
 
 
 
 
 
 
 
 
00175         PULS    A,B,X,Y
00176         RTS
00177 *
00178 *************************
00179 *
00180 * MLTDM
00181 * (n1 n2 n3 -- n4 n5)
00182 * n1 IS FIRST MULTIPLIED
00183 * BY n2 PRODUCING AN
00184 * INTERMEDIATE 32-BIT
00185 * RESULT.  n4 IS THE
00186 * REMAINDER AND n5 IS THE
00187 * FLOOR OF THE QUOTIENT
00188 * OF THE INTERMEDIATE
00189 * 32-BIT RESULT DIVIDED
00190 * BY n3.  n4 HAS THE SAME
00191 * SIGN AS n3 OR IS ZERO
00192 *
00193 *************************
00194 *
00195 MLTDM   PSHS    A,B,X,Y */MOD
00196         JSR     MDIV    WORKING MULTIPLICATION ROUTINE
00197         JSR     DIVX    WORKING DIVISION ROUTINE
00198         PULU    A,B
00199         PULU    A,B
00200         PULU    A,B
00201         PSHU    Y
00202         PSHU    X
00203         PULS    A,B,X,Y
00204         RTS
00205 *
00206 *************************
00207 *
00208 * MOD
00209 * (n1 n2 -- n3)
00210 * n3 IS THE REMAINDER
00211 * AFTER DIVIDING n1 BY
00212 * n2.  n3 HAS THE SAME
00213 * SIGN AS n2 OR IS ZERO
00214 *
00215 *************************
00216 *
00217 MOD     PSHS    A,B,X,Y
00218         JSR     DIVY    WORKING DIVISION ROUTINE
00219         PULU    A,B
00220         PULU    A,B
00221         PSHU    Y
00222         PULS    A,B,X,Y
00223         RTS
00224 *
00225 *************************
00226 *
00227 * NGT
00228 * (n1 -- n2)
00229 * n2 IS THE TWO'S
00230 * COMPLEMENT OF n1, i.e.
00231 * ZERO MINUS n1
00232 *
 
 
 
 
 
 
 
 
00233 *************************
00234 *
00235 NGT     PSHS    A,B     NEGATE
00236         PULU    A,B
00237         STD     NUMBER+2
00238         JSR     NEG16
00239         LDD     NUMBER+2
00240         PSHU    A,B
00241         PULS    A,B
00242         RTS
00243 *
00244 *************************
00245 *
00246 * DNGT
00247 * (d1 -- d2)
00248 * d2 IS THE TWO'S
00249 * COMPLEMENT OF d1
00250 *
00251 *************************
00252 *
00253 DNGT    PSHS    A,B     DNEGATE
00254         PULU    A,B
00255         STD     NUMBER
00256         PULU    A,B
00257         STD     NUMBER+2
00258         JSR     NEG32
00259         LDD     NUMBER+2
00260         PSHU    A,B
00261         LDD     NUMBER
00262         PSHU    A,B
00263         PULS    A,B
00264         RTS
00265 *
00266 *************************
00267 *
00268 * DPLUS
00269 * (wd1 wd2 -- wd3)
00270 * wd3 IS THE ARITHMETIC
00271 * SUM OF wd1 PLUS wd2
00272 *
00273 *************************
00274 *
00275 DPLUS   PSHS    A,B,X,Y D+
00276         LDD     2,U
00277         ADDD    6,U
00278         PSHS    CC
00279         TFR     D,X
00280         PULU    A,B
00281         ADDD    2,U
00282         PULS    CC
00283         BCC     DPLS1
00284         ADDD    #1
00285 DPLS1   PULU    Y
00286         PULU    Y
00287         PULU    Y
00288         PSHU    X
00289         PSHU    A,B
00290         PULS    A,B,X,Y
 
 
 
 
 
 
 
 
00291         RTS
00292 *
00293 *************************
00294 *
00295 * MAX
00296 * (n1 n2 -- n3)
00297 * n3 IS THE GREATER OF 
00298 * n1 AND n2 ACCORDING TO
00299 * THE OPERATION OF >
00300 *
00301 *************************
00302 *
00303 MAX     PSHS    A,B,X
00304         PULU    A,B
00305         CMPD    ,U
00306         BLE     MAX1
00307         PULU    X
00308         PSHU    A,B
00309 MAX1    PULS    A,B,X
00310         RTS
00311 *
00312 *************************
00313 *
00314 * MIN
00315 * (n1 n2 -- n3)
00316 * n3 IS THE LESSER OF n1
00317 * AND n2 ACCORDING TO THE
00318 * OPERATION OF <
00319 *
00320 *************************
00321 *
00322 MIN     PSHS    A,B,X
00323         PULU    A,B
00324         CMPD    ,U
00325         BGE     MIN1
00326         PULU    X
00327         PSHU    A,B
00328 MIN1    PULS    A,B,X
00329         RTS
00330 *
00331 *************************
00332 *
00333 * TWOD
00334 * (n1 -- n2)
00335 * n2 IS THE RESULT OF
00336 * ARITHMETICALLY SHIFTING
00337 * n1 RIGHT ONE BIT.  THE
00338 * SIGN IS INCLUDED IN THE
00339 * SHIFT AND REMAINS
00340 * UNCHANGED
00341 *
00342 *************************
00343 *
00344 TWOD    PSHS    A,B,X,Y 2/
00345         LDD     #2
00346         PSHU    A,B
00347         JSR     DIVY    WORKING DIVISION ROUTINE
00348         PULU    A,B
 
 
 
 
 
 
 
 
00349         PULU    A,B
00350         PSHU    X
00351         PULS    A,B,X,Y
00352         RTS
00353 *
00354 *************************
00355 *
00356 * ONEPL
00357 * (w1 -- w2)
00358 * w2 IS THE RESULT OF
00359 * ADDING ONE TO w1
00360 * ACCORDING TO THE
00361 * OPERATION OF +
00362 *
00363 *************************
00364 *
00365 ONEPL   PSHS    A,B     1+
00366         PULU    A,B
00367         ADDD    #1
00368         PSHU    A,B
00369         PULS    A,B
00370         RTS
00371 *
00372 *************************
00373 *
00374 * TWOPL
00375 * (w1 -- w2)
00376 * w2 IS THE RESULT OF
00377 * ADDING TWO TO w1
00378 * ACCORDING TO THE
00379 * OPERATION OF +
00380 *
00381 *************************
00382 *
00383 TWOPL   PSHS    A,B     2+
00384         PULU    A,B
00385         ADDD    #2
00386         PSHU    A,B
00387         PULS    A,B
00388         RTS
00389 *
00390 *************************
00391 *
00392 * ONEMN
00393 * (w1 -- w2)
00394 * w2 IS THE RESULT OF
00395 * SUBTRACTING ONE FROM w1
00396 * ACCORDING TO THE
00397 * OPERATION OF -
00398 *
00399 *************************
00400 *
00401 ONEMN   PSHS    A,B     1-
00402         PULU    A,B
00403         SUBD    #1
00404         PSHU    A,B
00405         PULS    A,B
00406         RTS
 
 
 
 
 
 
 
 
00407 *
00408 *************************
00409 *
00410 * TWOMN
00411 * (w1 -- w2)
00412 * w2 IS THE RESULT OF
00413 * SUBTRACTING TWO FROM w1
00414 * ACCORDING TO THE
00415 * OPERATION OF -
00416 *
00417 *************************
00418 *
00419 TWOMN   PSHS    A,B     2-
00420         PULU    A,B
00421         SUBD    #2
00422         PSHU    A,B
00423         PULS    A,B
00424         RTS
00425 *
00426 *************************
00427 *
00428 * UMT
00429 * (u1 u2 -- ud)
00430 * ud IS THE UNSIGNED
00431 * PRODUCT OF u1 TIMES u2
00432 *
00433 *************************
00434 *
00435 UMT     PSHS    A,B     UM*
00436         PULU    A,B
00437         STD     MLTIC1
00438         PULU    A,B
00439         STD     MLTIC2
00440         JSR     M1616
00441         LDD     R16
00442         PSHU    A,B
00443         LDD     RESULT
00444         PSHU    A,B
00445         PULS    A,B
00446         RTS
00447 *
00448 *************************
00449 *
00450 * UMMOD
00451 * (ud u1 -- u2 u3)
00452 * u2 IS THE REMAINDER AND
00453 * u3 IS THE FLOOR OF THE
00454 * QUOTIENT AFTER DIVIDING
00455 * ud BY u1.  ALL VALUES
00456 * AND ARITHMETIC ARE
00457 * UNSIGNED
00458 *
00459 *************************
00460 *
00461 UMMOD   PSHS    A,B,X   UM/MOD
00462         PULU    X
00463         STX     DIVSOR
00464         PULU    A,B
 
 
 
 
 
 
 
 
00465         STD     DIVDND
00466         PULU    A,B
00467         STD     DIVDND+2
00468         JSR     D3216
00469         LDD     DIVSOR
00470         PSHU    A,B
00471         LDD     DIVDND+2
00472         PSHU    A,B
00473         PULS    A,B,X
00474         RTS
00475 *
00476 *************************
00477 *
00478 * WORKING ROUTINES
00479 *
00480 *************************
00481 *
00482 MSGN    RMB     1
00483 QSGN    RMB     1
00484 DSGN    RMB     1
00485 MDIV    LDD     2,U
00486         STD     MLTIC1
00487         LDD     4,U
00488         STD     MLTIC2
00489         JSR     MS1616
00490         LDD     RESULT
00491         STD     2,U
00492         LDD     RESULT+2
00493         STD     4,U
00494         RTS
00495 DIVX    CLR     MSGN
00496         CLR     QSGN
00497         CLR     DSGN
00498         LDX     ,U
00499         CMPX    #0
00500         BGE     DIVA
00501         INC     MSGN
00502         STX     NUMBER+2
00503         JSR     NEG16
00504         LDX     NUMBER+2
00505         STX     ,U
00506 DIVA    LDX     4,U
00507         STX     NUMBER+2
00508         LDX     2,U
00509         CMPX    #0
00510         BGE     DIVB
00511         INC     DSGN
00512         STX     NUMBER
00513         JSR     NEG32
00514         LDX     NUMBER+2
00515         STX     4,U
00516         LDX     NUMBER
00517         STX     2,U
00518 DIVB    LDA     DSGN
00519         CMPA    MSGN
00520         BEQ     DIVCA
00521         INC     QSGN
00522 DIVCA   LDD     2,U
 
 
 
 
 
 
 
 
00523         LDY     4,U
00524         LDX     ,U
00525         STD     DIVDND
00526         STY     DIVDND+2
00527         STX     DIVSOR
00528         JSR     D3216
00529         BRA     DIV5
00530 DIVY    CLR     MSGN
00531         CLR     QSGN
00532         CLR     DSGN
00533         LDX     ,U
00534         CMPX    #0
00535         BGE     DIV1
00536         INC     MSGN
00537         STX     NUMBER+2
00538         JSR     NEG16
00539         LDX     NUMBER+2
00540         STX     ,U
00541 DIV1    LDX     2,U
00542         CMPX    #0
00543         BGE     DIV2
00544         INC     DSGN
00545         STX     NUMBER+2
00546         JSR     NEG16
00547         LDX     NUMBER+2
00548         STX     2,U
00549 DIV2    LDA     DSGN
00550         CMPA    MSGN
00551         BEQ     DIV3
00552         INC     QSGN
00553 DIV3    CLR     DIVDND
00554         CLR     DIVDND+1
00555         LDD     2,U
00556         LDX     ,U
00557         STD     DIVDND+2
00558         STX     DIVSOR
00559         JSR     D3216
00560 DIV5    LDX     Q16
00561         LDY     DIVSOR
00562         LDA     QSGN
00563         CMPA    #0
00564         BEQ     DIV6
00565         CMPY    #0
00566         BEQ     DIV5A
00567         LEAX    1,X
00568 DIV5A   STX     NUMBER+2
00569         JSR     NEG16
00570         LDX     NUMBER+2
00571         CMPY    #0
00572         BEQ     DIV6
00573         LDD     ,U
00574         SUBD    DIVSOR
00575         TFR     D,Y
00576 DIV6    LDA     MSGN
00577         CMPA    #0
00578         BEQ     ZEND
00579         STY     NUMBER+2
00580         JSR     NEG16
 
 
 
 
 
 
 
 
00581         LDY     NUMBER+2
00582 ZEND    RTS
00583         END
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
