00010 *************************
00020 *
00030 * ATONCV.ASM
00040 * MDJ 09-26-90
00050 *
00060 * CONVERTS A STRING OF
00070 * ASCII CHARACTERS TO
00080 * A NUMBER
00090 *
00100 *************************
00110 *
00120 * REQUIRES: M3208
00130 *
00140 * NUMBER BASE MUST 
00150 * ALREADY BE SET AT BASE
00160 * ($03DD)
00170 *
00180 * ON ENTRY:
00190 *  NUMBER OF CHARACTERS
00200 *   IN STRING MUST BE IN
00210 *   REGISTER X
00220 *  STRING START LOCATION
00230 *   MUST BE IN REGISTER Y
00240 *
00250 * ON RETURN:
00260 *  IF NOT A VALID NUMBER,
00270 *   16-BIT FALSE FLAG
00280 *   ($0000) ON U-STACK
00290 *  IF A VALID 16-BIT
00300 *   NUMBER, 16-BIT TRUE
00310 *   FLAG ($FFFF) ON TOP
00320 *   OF 16-BIT NUMBER ON
00330 *   U-STACK
00340 *  IF A VALID 32-BIT
00350 *   NUMBER, MODIFIED
00360 *   16-BIT TRUE FLAG
00370 *   ($00FF) ON TOP OF
00380 *   32-BIT NUMBER ON
00390 *   U-STACK
00400 *
00410 *************************
00420 *
00430 BASEL2  EQU     $FD     NUMBER BASE
00440 M3208   EQU     $4460   UNSIGNED 32 BY 8 MULTIPLY ROUTINE
00450 MLTIC1  EQU     $CB     32-BIT MULTIPLICAND
00460 MLTICB  EQU     $CF     8-BIT MULTIPLICAND
00470 RESULT  EQU     $CF     32-BIT RESULT
00471 ATONW   EQU     $478E   LAST DIGIT ADJUSTMENT ROUTINE
00480         ORG     $44A9
00490 ATONCV  PSHS    A,B
00500         CLR     TSV     = 0 IMPLIES A POSITIVE NUMBER
00510         CLR     TDV     = 0 IMPLIES A 16-BIT NUMBER
00520         CLR     NUMBER  CLEAR TEMPORARY COMBINED RESULT
00530         CLR     NUMBER+1
00540         CLR     NUMBER+2
00550         CLR     NUMBER+3
00560 ATONA   LDB     ,Y+     GET CHARACTER
00570         CMPB    #45     MINUS SIGN?
 
 
 
 
 
 
 
 
00580         BNE     ATONB   GO IF NO
00590         LDA     #$FF    NEGATIVE NUMBER CODE
00600         STA     TSV
00620         BRA     ATONZ   GO FOR NEXT CHARACTER
00630 ATONB   CMPB    #37     "%" (DOUBLE # IDENTIFIER)?
00640         BNE     ATONC   GO IF NO
00650         LDA     #$FF    DOUBLE NUMBER CODE
00660         STA     TDV
00670 ATONZ   LEAX    -1,X    DECREMENT CHARACTER COUNT
00671         LBEQ    ATONW   GO IF END OF CONVERSION
00680         BRA     ATONA   GO FOR NEXT CHARACTER
00690 ATONC   SUBB    #48     ASCII "0" CODE
00700         CMPB    #0      BELOW VALID CHARACTER NUMBER?
00710         BLO     ERRX    GO IF YES
00720         CMPB    #10     ABOVE STANDARD DIGIT NUMBER?
00730         BLO     ATOND   GO IF NO
00740         SUBB    #7      ASCII "A" OFFSET
00750         CMPB    #10     BELOW VALID CHARACTER NUMBER?
00760         BLO     ERRX    GO IF YES
00770         CMPB    BASEL2  BELOW BASE?
00790         BHS     ERRX    GO IF NO
00800 ATOND   CLRA            CHARACTER VALUE IN B NOW IN D
00810         ADDD    NUMBER+2 ADD TO RESULT HOLDER
00820         STD     NUMBER+2
00830         LDA     NUMBER+1
00840         ADCA    #0
00850         STA     NUMBER+1
00860         LDA     NUMBER
00870         ADCA    #0
00880         STA     NUMBER
00890         LEAX    -1,X    DECREMENT CHARACTER COUNTER
00900         BEQ     ATONX   GO IF END OF CONVERSION
00910         LDD     NUMBER
00920         STD     MLTIC1
00930         LDD     NUMBER+2
00940         STD     MLTIC1+2
00950         LDB     BASEL2
00970         STB     MLTICB
00980         JSR     M3208   GO MULTIPLY
00990         LDD     RESULT
01000         STD     NUMBER
01010         LDD     RESULT+2
01020         STD     NUMBER+2
01030         BRA     ATONA   GO FOR NEXT CHARACTER
01040 ATONX   LDA     TSV     GET SIGN
01050         CMPA    #0      POSITIVE?
01060         BEQ     ATONE   GO IF YES
01070         LDA     TDV     GET DOUBLE NUMBER CODE
01080         CMPA    #0      IS IT A SINGLE NUMBER?
01090         BEQ     ATONY   GO IF YES
01100         JSR     NEG32   NEGATE DOUBLE NUMBER
01110         BRA     ATONE
01120 ATONY   JSR     NEG16   NEGATE SINGLE NUMBER
01130 ATONE   LDD     NUMBER+2 16-BIT BYTES
01140         PSHU    A,B
01150         LDD     #$FFFF  16-BIT TRUE FLAG
01160         PSHU    A,B
01170         LDA     TDV     GET DOUBLE NUMBER CODE
 
 
 
 
 
 
 
 
01180         CMPA    #0      IS IT A SINGLE NUMBER?
01190         BEQ     ATONF   GO IF YES
01200         PULU    A,B     DISCARD 16-BIT TRUE FLAG
01210         LDD     NUMBER  GET 32-BIT HIGH BYTES
01220         PSHU    A,B
01230         LDD     #$FF    DOUBLE NUMBER MODIFIED TRUE FLAG
01240         PSHU    A,B
01250         BRA     ATONF
01260 ERRX    LDD     #0      FALSE FLAG
01270         PSHU    A,B
01280 ATONF   PULS    A,B
01290         RTS
01300 NUMBER  RMB     4       TEMPORARY COMBINED RESULT
01310 TSV     RMB     1       TEMPORARY SIGN VARIABLE
01320 TDV     RMB     1       TEMPORARY DOUBLE NUMBER VARIABLE
01330 NEG16   PSHS    A,B     16-BIT NEGATE ROUTINE
01340         LDD     #$FFFF
01350         SUBD    NUMBER+2
01360         ADDD    #1
01370         STD     NUMBER+2
01380         PULS    A,B
01390         RTS
01400 NEG32   PSHS    A,B     32-BIT NEGATE ROUTINE
01410         JSR     NEG16
01420         LDD     #$FFFF
01430         SUBD    NUMBER
01440         STD     NUMBER
01450         LDD     NUMBER+2
01460         CMPD    #0      WAS NUMBER+2 ORIGINALLY ZERO?
01470         BNE     NEG32A  GO IF NO
01480         LDD     NUMBER
01490         ADDD    #1
01500         STD     NUMBER
01510 NEG32A  PULS    A,B
01520 ZEND    RTS
01530         END
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
