.TITLE ASCNUM .IDENT /2404.1/ ; ; ; ; WRITTEN BY RAY DI MARCO ; 24-APR-79 ; ; ; VERSION 240479/01 ; ; ; ;----------------------------------------------------------------- ; ; ; THE ROUTINE CONVERTS AN ASCII STRING OF DIGITS INTO A BINARY ; NUMBER. ALL REGISTERS EXCEPT R0 AND R1 ARE PRESERVED. AT ENTRY ; R1 POINTS TO THE START OF THE ASCII STRING. THE ASCII STRING ; IS TERMINATED WITH A NULL. THE ROUTINE SCANS THROUGH TO THE FIRST DIGIT, ; AND THEN CONVERTS THE FOLLOWING DIGIT UNTIL IT REACHS A NON-DIGIT ; CHARACTER. AT EXIT, R1 POINTS TO THE NON-DIGIT CHARACTER. THE ; NUMBER IS RETURNED IN 'R0'. ; ; ; ; ; ; ; ; ; .SBTTL DECLARATIONS ; ; .MCALL .PUSH,.POP ; ; .GLOBL ASCNUM ; .PSECT CODE ; OPEN CODE SECTION ; ------ ---- ; ; ; .SBTTL ROUTINE - 'ASCNUM' ... ASCII -> NUMBER ; ; ASCNUM: .PUSH R2 ; SAVE WORK REGISTER CLR R0 ; CLEAR ACCUMULATOR CALL LOCDIG ; LOCATE FIRST DIGIT IN STRING BEQ 20$ ; SKIP IF CAN'T FIND A DIGIT ; 10$: ASL R0 ; MUL NUM*2 MOV R0,-(SP) ; NUM*2 -> @(SP) ASL R0 ; NUM*4 -> R0 ASL R0 ; NUM*8 -> R0 ADD (SP)+,R0 ; NUM*8+NUM*2 -> R0 ADD R2,R0 ; ADD IN NEXT DIGIT IN STRING CALL GETDIG ; GO GET A DIGIT BNE 10$ ; LOOP IF GOT ANOTHER DIGIT ; 20$: .POP R2 ; RESTORE R2 RETURN ; HOME ; ; ; ; ; ; .SBTTL ROUTINE - 'LOCDIG' ... LOCATE AND RETURN FIRST DIGIT ; ; LOCDIG: MOVB (R1)+,R2 ; GET NEXT DIGIT BNE 10$ ; SKIP IF A LEGAL CHARACTER TSTB -(R1) ; RESET POINTER TO E.O.T. POINTER RETURN ; HOME - AT E.O.T. 10$: BIC #^C377,R2 ; MASK TO 8 BITS SUB #'0,R2 ; TAKE AWAY ASCII '0' BMI LOCDIG ; <0 -> NOT A DIGIT - TRY AGAIN CMP #10.,R2 ; CHECK AGAINST HIGH LIMIT BLE LOCDIG ; TRY AGAIN IF NOT IN RANGE RETURN ; HOME - SUCCEEDED ; ; ; .SBTTL ROUTINE - 'GETDIG' ... RETURN NEXT DIGIT IN NUMBER ; ; GETDIG: MOVB (R1)+,R2 ; GET NEXT DIGIT BNE 10$ ; SKIP IF A LEGAL CHARACTER TSTB -(R1) ; RESET POINTER TO E.O.T. POINTER RETURN ; HOME - AT E.O.T. ; 10$: BIC #^C377,R2 ; MASK TO 8 BITS SUB #'0,R2 ; TAKE AWAY ASCII '0' BMI 20$ ; <0 -> NOT A DIGIT - FAILED CMP #10.,R2 ; CHECK AGAINST HIGH LIMIT BGT 30$ ; SKIP IF WITH IN RANGE ; 20$: TSTB -(R1) ; POINT BACK TO CHARACTER SEZ ; SET FAILED FLAG 30$: RETURN ; HOME - SUCCEEDED ; ; ; .END