.TITLE ASCITO .PSECT UTILS ; ASCII TO OCTAL AND ASCII TO INTEGER CONVERSION. ; CALLING SEQUENCE: ; PUSH ASCII FIELD START (ADRS) ; PUSH LENGTH OF ASCII FIELD (# CHARS) ; JSR PC,ASCOCT (OR ASCINT) ; RETURNS WITH RESULT ON TOP OF STK. ; ERROR RETURNS WITH C BIT SET AND THE RESULT VALUE WILL ; HAVE BEEN SET TO ZERO. ASCOCT::;ENTRY POINT IF CONVERTING ASCII TO OCTAL. MOV #67,-(SP) ;SET OCTAL INDICATOR. .enable LSB BR 5$ ASCINT::;ENTRY POINT IF CONVERTING ASCII TO INTEGER. MOV #471,-(SP) ;SET DECIMAL INDICATOR. 5$: .DSABLE LSB MOV R1,-(SP) ;SAVE R1. MOV 8.(SP),R1 ;GET STRING START. ADD 6(SP),8.(SP) ;GET END+1. MOV 4(SP),6(SP) ;FIDDLE RETURN POINTER. MOV R0,4(SP) ;SAVE R0. MOV R2,-(SP) ;SAVE R2. CLR -(SP) ;CLEAR SIGN. CLR R0 ;CLEAR WORK SPACE. 10$: MOVB (R1)+,R2 ;GET A CHARACTER. BIC #177600,R2 ;ENSURE A CLEAN CHAR. CMPB R2,#' ; ;THIS CHAR A SPACE? BNE 15$ ;NO... CMP R1,12.(SP) ;MORE TO SCAN? BLT 10$ ;YES. GO DO IT. BR 45$ ;NO. WE;RE DONE W/SCAN. 15$: TSTB 7(SP) ;IF OCTAL CONVERSION, BNE 20$ ;DO NOT PERMIT SIGNS. INC @SP ;ITS OCTAL. FAKE A SIGN. BR 30$ ; 20$: CMPB R2,#'+ ;IS THIS A PLUS SIGN? BEQ 40$ ;YES... CMPB R2,#'- ;NO. IS IT A MINUS? BNE 30$ ;NO... INC @SP ;YES. SET SIGN TO MINUS. BR 40$ ;GO PROCESS IT. 25$: MOVB (R1)+,R2 ;GET NEXT CHARACTER. BIC #177600,R2 ;ENSURE CLEAN ASCII. CMPB R2,#' ; ;THIS A LEADING SPACE? BNE 30$ ;NO... MOVB #60,R2 ;YES. REPLACE WITH ZERO. 30$: CMPB R2,#'0 ;AT LEAST EQ TO ZERO? BLT 50$ ;NO!... CMPB R2,6(SP) ;BUT NOT GT ? BGT 50$ ;NOT A VALID CHAR!! ERR! SUB #60,R2 ;CHAR OK. STRIP ASCII. TSTB 7(SP) ;WORKING OCTAL OR ASCII? BNE 35$ ;BR IF WORKING DECIMAL. ;WE ARE WORKING AN OCTAL NUMBER. ROL R0 ;SHIFT 3 BITS... BCS 50$ ;...LEFT, CONFIRMING... ROL R0 ;...ALL IS... BCS 50$ ;...OKAY... ROL R0 ;...AS WE... BCS 50$ ;...GO. ADD R2,R0 ;ADD THIS OCTAL DIGIT. BR 40$ ;GO GET NEXT CHARACTER. 35$: ;WE ARE WORKING A DECIMAL NUMBER. ASL R0 ;R0 = BASE*R0+R2. BVS 50$ SUB R0,R2 ASL R0 BVS 50$ ASL R0 BVS 50$ SUB R2,R0 BVS 50$ 40$: CMP R1,12.(SP) ;MORE TO DO? BLT 25$ ;YES... 45$: ROR (SP)+ ;THIS PLUS OR MINUS? BCS 60$ ;BR IF MINUS. NEG R0 ;MAKE IT NEGATIVE. BVS 55$ ;BR IF GTE MAXNEG. CLC ;ALL OK. SIGNAL SUCCESS. BR 60$ 50$: ;OOPS! WE HAVE ENCOUNTERED AN ERROR! TST (SP)+ ;FLUSH FLAG. 55$: CLR R0 ;CLEAN UP ABORTION. COM 4(SP) ;SET C BIT FOR ERROR. 60$: ;WIN OR LOSE IT'S TIME TO GET OUT. MOV (SP)+,R2 ;RESTORE R2... MOV (SP)+,R1 ;...AND R1. ROL (SP)+ ;FLUSH FLAG AND SET THE ;C BIT, IF ERROR. MOV R0,4(SP) ;PUT RESULT ON STACK. MOV (SP)+,R0 ;RESTORE R0. RETURN ;RETURN TO CALLER. .END