00001 *************************
00002 *
00003 * SAD.ASM
00004 * MDJ 11-20-90
00005 *
00006 * NUMBER CONVERSION
00007 * OPERATORS
00008 *
00009 *************************
00010 *
00011 * REQUIRES: D3216
00012 *           ATONCV
00013 *           SAA
00014 *           SAB
00015 *           SAC
00016 *
00017 *************************
00018 *
00019 DIVDND  EQU     $CB     WORKING MATH VARIABLES
00020 DIVSOR  EQU     $CF
00021 QUOTNT  EQU     $CB
00022 MODLUS  EQU     $CF
00023 MLTIC1  EQU     $CB
00024 MLTICB  EQU     $CF
00025 RESULT  EQU     $CF
00026 BASEL   EQU     $FC     SYSTEM VARIABLES
00027 DPL     EQU     $01D3
00028 FLD     EQU     $01D4
00029 PADL    EQU     $036A
00030 D3216   EQU     $437E   32 BY 16 UNSIGNED DIVIDE
00031 M3208   EQU     $4460   32 BY 8 UNSIGNED MULTIPLY
00032 ATONCV  EQU     $44A9   ASCII TO NUMBER CONVERSION
00033 DROP    EQU     $4811   SAA WORDS
00034 OVER    EQU     $484E
00035 ROT     EQU     $4857
00036 PLUS    EQU     $48AF   SAB WORDS
00037 MINUS   EQU     $48BC
00038 DPLUS   EQU     $4979
00039 EXCL    EQU     $4B2D   SAC WORDS
00040 EXPL    EQU     $4B38
00041 AT      EQU     $4B45
00042 CEXCL   EQU     $4B50
00043         ORG     $4CF7
00044 *
00045 *************************
00046 *
00047 * BASE
00048 * ( -- addr)
00049 * THE ADDRESS OF A
00050 * VARIABLE CONTAINING
00051 * THE CURRENT NUMERIC
00052 * CONVERSION RADIX
00053 *
00054 *************************
00055 *
00056 BASE    PSHS    X
00057         LDX     #BASEL
00058         PSHU    X
 
 
 
 
 
 
 
 
00059         PULS    X
00060         RTS
00061 *
00062 *************************
00063 *
00064 * PAD
00065 * ( -- addr)
00066 * THE LOWER ADDRESS OF A
00067 * SCRATCH AREA USED TO
00068 * HOLD DATA FOR
00069 * INTERMEDIATE PROCESSING
00070 *
00071 *************************
00072 *
00073 PAD     PSHS    X
00074         LDX     #PADL
00075         PSHU    X
00076         PULS    X
00077         RTS
00078 *
00079 *************************
00080 *
00081 * TRAIL
00082 * (addr +n1 -- addr +n2)
00083 * THE CHARACTER COUNT +n1
00084 * OF A TEXT STRING 
00085 * BEGINNING AT addr IS
00086 * ADJUSTED TO EXCLUDE
00087 * TRAILING SPACES
00088 *
00089 *************************
00090 *
00091 TRAIL   PSHS    A,B,X,Y -TRAILING
00092         PULU    A,B     +n1
00093         TFR     D,Y     SAVE CHARACTER COUNT
00094         CMPD    #0      IS +n1 = 0 ?
00095         BEQ     TRAIL2  GO IF YES
00096         ADDD    ,U      END OF STRING +1
00097         TFR     D,X     SAVE END OF STRING LOCATION
00098 TRAIL1  LDA     ,-X     GET CHARACTER AND BUMP LOCATION
00099         CMPA    #32     IS IT A SPACE?
00100         BNE     TRAIL2  GO IF NO
00101         LEAY    -1,Y    DECREMENT CHARACTER COUNT
00102         BRA     TRAIL1  GO GET NEXT CHARACTER
00103 TRAIL2  PSHU    Y       REVISED COUNT TO U-STACK
00104         PULS    A,B,X,Y
00105         RTS
00106 *
00107 *************************
00108 *
00109 * DECML
00110 * ( -- )
00111 * SET NUMBER CONVERSION
00112 * RADIX TO DECIMAL 10
00113 *
00114 *************************
00115 *
00116 DECML   PSHS    A,B,X   DECIMAL
 
 
 
 
 
 
 
 
00117         LDX     #BASEL
00118         LDD     #10
00119         STD     ,X
00120         PULS    A,B,X
00121         RTS
00122 *
00123 *************************
00124 *
00125 * HEX
00126 * ( -- )
00127 * SET NUMBER CONVERSION
00128 * RADIX TO DECIMAL 16
00129 *
00130 *************************
00131 *
00132 HEX     PSHS    A,B,X
00133         LDX     #BASEL
00134         LDD     #16
00135         STD     ,X
00136         PULS    A,B,X
00137         RTS
00138 *
00139 *************************
00140 *
00141 * HOLD
00142 * (char -- )
00143 * char IS INSERTED INTO A
00144 * PICTURED NUMERIC OUTPUT
00145 * STRING
00146 *
00147 *************************
00148 *
00149 HOLD    PSHS    X
00150         LDX     #$FFFF  -1
00151         PSHU    X
00152         JSR     HLDX    HLD
00153         JSR     EXPL    +!
00154         JSR     HLDX    HLD
00155         JSR     AT      @
00156         JSR     CEXCL   C!
00157         PULS    X
00158         RTS
00159 HLDX    PSHS    X
00160         LDX     #HLD    CHARACTER POINTER VARIABLE FOR NUMBER CONVERSION
00161         PSHU    X
00162         PULS    X
00163         RTS
00164 HLD     RMB     2
00165 *
00166 *************************
00167 *
00168 * LNUM
00169 * ( -- )
00170 * INITIALIZE PICTURED
00171 * NUMERIC OUTPUT
00172 * CONVERSION
00173 *
00174 *************************
 
 
 
 
 
 
 
 
00175 *
00176 LNUM    PSHS    X       <#
00177         JSR     PAD     PAD
00178         LDX     #149
00179         PSHU    X       149
00180         JSR     PLUS    +
00181         JSR     HLDX    HLD
00182         JSR     EXCL    !
00183         PULS    X
00184         RTS
00185 *
00186 *************************
00187 *
00188 * NUMG
00189 * (32b -- addr +n)
00190 * PICTURED NUMERIC
00191 * OUTPUT CONVERSION IS
00192 * ENDED DROPPING 32b.
00193 * addr IS THE ADDRESS OF
00194 * THE RESULTING OUTPUT
00195 * STRING.  +n IS THE 
00196 * NUMBER OF CHARACTERS
00197 * IN THE OUTPUT STRING
00198 *
00199 *************************
00200 *
00201 NUMG    PSHS    X       #>
00202         JSR     DROP    DROP 32b
00203         JSR     DROP
00204         JSR     HLDX    HLD
00205         JSR     AT      @
00206         JSR     PAD     PAD
00207         LDX     #149
00208         PSHU    X       149
00209         JSR     PLUS    +
00210         JSR     OVER    OVER
00211         JSR     MINUS   -
00212         PULS    X
00213         RTS
00214 *
00215 *************************
00216 *
00217 * SIGN
00218 * (n -- )
00219 * IF n IS NEGATIVE, AN
00220 * ASCII MINUS SIGN IS
00221 * APPENDED TO THE 
00222 * PICTURED NUMERIC
00223 * OUTPUT STRING
00224 *
00225 *************************
00226 *
00227 SIGN    PSHS    X
00228         PULU    X
00229         CMPX    #0      n < 0 ?
00230         BGE     SIGN1   GO IF NO
00231         LDX     #45     ASCII MINUS SIGN
00232         PSHU    X
 
 
 
 
 
 
 
 
00233         JSR     HOLD    HOLD
00234 SIGN1   PULS    X
00235         RTS
00236 *
00237 *************************
00238 *
00239 * NUM
00240 * (+d1 -- +d2)
00241 * THE REMAINDER OF +d1
00242 * DIVIDED BY THE VALUE OF
00243 * BASE IS CONVERTED TO AN
00244 * ASCII CHARACTER AND
00245 * APPENDED TO THE OUTPUT
00246 * STRING TOWARD LOWER
00247 * MEMORY ADDRESSES.  +d2
00248 * IS THE QUOTIENT AND IS
00249 * MAINTAINED FOR FURTHER
00250 * PROCESSING
00251 *
00252 *************************
00253 *
00254 NUM     PSHS    X
00255         LDX     BASEL   BASE
00256         STX     DIVSOR
00257         PULU    X       d1 HIGH BYTES
00258         STX     DIVDND
00259         PULU    X       d1 LOW BYTES
00260         STX     DIVDND+2
00261         JSR     D3216   GO DO DIVIDE
00262         LDX     QUOTNT+2        d2 LOW BYTES
00263         PSHU    X
00264         LDX     QUOTNT  d2 HIGH BYTES
00265         PSHU    X
00266         LDX     MODLUS  REMAINDER
00267         CMPX    #10     IS REMAINDER < 10 ?
00268         BLO     NUM1    GO IF YES
00269         LEAX    7,X     ASCII OFFSET
00270 NUM1    LEAX    48,X    ASCII BASE
00271         PSHU    X       PUT CHARACTER ON U-STACK
00272         JSR     HOLD    HOLD
00273         PULS    X
00274         RTS
00275 *
00276 *************************
00277 *
00278 * NUMS
00279 * (+d -- 0 0)
00280 * +d IS CONVERTED 
00281 * APPENDING EACH
00282 * RESULTANT CHARACTER 
00283 * INTO THE PICTURED 
00284 * NUMERIC OUTPUT STRING
00285 * UNTIL THE QUOTIENT IS
00286 * ZERO
00287 *
00288 *************************
00289 *
00290 NUMS    PSHS    X
 
 
 
 
 
 
 
 
00291         LDX     ,U      CHECK IF +d = 0
00292         CMPX    #0
00293         BNE     NUMS2
00294         LDX     2,U
00295         CMPX    #0
00296         BNE     NUMS2
00297         LDX     #48
00298         PSHU    X
00299         JSR     HOLD
00300         BRA     NUMS3
00301 NUMS1   LDX     ,U      CHECK IF END OF ITERATIONS
00302         CMPX    #0
00303         BNE     NUMS2
00304         LDX     2,U
00305         CMPX    #0
00306         BEQ     NUMS3
00307 NUMS2   JSR     NUM     GO CONVERT TO CHARACTER
00308         BRA     NUMS1   RETURN FOR NEXT ITERATION
00309 NUMS3   PULS    X
00310         RTS
00311 *
00312 *************************
00313 *
00314 * CNVRT
00315 * (+d1 addr1 -- 
00316 *  +d2 addr2)
00317 * +d2 IS THE RESULT OF 
00318 * CONVERTING THE
00319 * CHARACTERS WITHIN THE
00320 * TEXT BEGINNING AT 
00321 * addr1+1 INTO DIGITS,
00322 * USING THE VALUE OF 
00323 * BASE, AND ACCUMULATING
00324 * EACH INTO +d1 AFTER
00325 * MULTIPLYING +d1 BY THE
00326 * VALUE OF BASE.  
00327 * CONVERSION CONTINUES
00328 * UNTIL AN UNCONVERTIBLE
00329 * CHARACTER IS 
00330 * ENCOUNTERED.  addr2 IS
00331 * THE LOCATION OF THE 
00332 * FIRST UNCONVERTIBLE
00333 * CHARACTER
00334 *
00335 *************************
00336 *
00337 CNVRT   PSHS    A,B,X,Y
00338         CLR     DPL     CLEAR FRACTIONAL POINT LOCATION
00339         CLR     FLD     CLEAR FIELD LENGTH
00340         PULU    Y       STRING START ADDRESS
00341         LEAY    1,Y     POINT TO FIRST CHARACTER
00342         LDX     #0      CHARACTER COUNTER
00343 CV1     LDB     ,Y+     GET CHARACTER AND BUMP POINTER
00344         CMPB    #45     MINUS SIGN?
00345         BEQ     CV4     GO IF YES
00346         CMPB    #37     "%" (DOUBLE NUMBER IDENTIFIER)?
00347         BEQ     CV4     GO IF YES
00348         CMPB    #46     "." (FLOATING POINT IDENTIFIER)?
 
 
 
 
 
 
 
 
00349         BNE     CV2     GO IF NO
00350         PSHS    B       TEMPORARY SAVE B
00351         TFR     X,D     COUNT TO D
00352         STB     DPL     STORE FRACTIONAL POINT LOCATION
00353         PULS    B       RESTORE B
00354         BRA     CV4     GO FOR NEXT CHARACTER
00355 CV2     SUBB    #48     ASCII BASE
00356         CMPB    #0      BELOW VALID CHARACTER NUMBER?
00357         BLO     CV5     GO IF YES
00358         CMPB    #10     ABOVE STANDARD DIGIT NUMBER?
00359         BLO     CV3     GO IF NO
00360         SUBB    #7      ASCII OFFSET
00361         CMPB    #10     BELOW VALID CHARACTER NUMBER?
00362         BLO     CV5     GO IF YES
00363         CLRA
00364         CMPD    BASEL   BELOW BASE?
00365         BHS     CV5     GO IF NO
00366 CV3     PSHS    X       CONVERTIBLE - TEMPORARY SAVE X
00367         PULU    X       d HIGH BYTES
00368         STX     MLTIC1
00369         PULU    X       d LOW BYTES
00370         STX     MLTIC1+2
00371         LDA     BASEL+1 BASE
00372         STA     MLTICB
00373         JSR     M3208   GO DO MULTIPLY
00374         LDX     RESULT+2        d RESULT LOW BYTES
00375         PSHU    X
00376         LDX     RESULT  d RESULT HIGH BYTES
00377         PSHU    X
00378         CLRA
00379         PSHU    A,B     THE CHARACTER AS LOW BYTES
00380         LDX     #0      DUMMY HIGH BYTES
00381         PSHU    X
00382         JSR     DPLUS   GO ADD
00383         PULS    X       RESTORE X
00384 CV4     LEAX    1,X     INCREMENT COUNTER
00385         BRA     CV1     RETURN FOR NEXT CHARACTER
00386 CV5     LEAY    -1,Y    UNCONVERTIBLE - BUMP POINTER BACK
00387         PSHU    Y       addr2 TO U-STACK
00388         STX     FLD     STORE FIELD LENGTH
00389         PULS    A,B,X,Y
00390 ZEND    RTS
00391         END
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
