.TITLE ASCINT ; ; EQUIVALENT PASCAL DECLARATION ; FUNCTION ASCINT(VAR C:CHAR):INTEGER; ; ; PARAMETER STACK OFFSETS C = 4 .ENTRY ASCINT,^M CLRL R5 ; USED FOR SIGN FLAG CLRL R6 ; COUNT FOR DIGITS PLACE (<=4) CLRL R4 ; START RESULT AT ZERO CLRL R2 ; CLEAR DIGIT MOVL C(AP),R7 ; ADDRESS OF ALPHABETIC NUMBER 10$: CMPB (R7),#^A/ / ; IGNORE LEADING BLANKS BNEQ 20$ INCL R7 BRB 10$ 20$: CMPB (R7),#^A/-/ ; IS IT A NEGATIVE NUMBER? BNEQ NEXT ; BR IF NOT INCL R7 ; SKIP THIS CHAR INCL R5 ; SET SIGN FLAG TRUE NEXT: CMPB (R7),#^A/+/ ; PRECEDING '+' SIGN? BNEQ AFTSGN INCL R7 ; IGNORE '+' SIGN AFTSGN: MOVZBL (R7)+,R2 ; GET THE DIGIT CHAR SUBL2 #^A/0/,R2 ; CHANGE TO NUMBER BLSS FINI ; IF <0 THEN MUST BE DONE CMPL R2,#^D9 ; IF >9 THEN MUST BE DONE BGTR FINI ASHL #1,R4,R4 MOVL R4,R3 ASHL #2,R3,R3 ADDL2 R3,R4 ADDL2 R2,R4 ; ASSERT NEW VALUE INCL R6 ; DON'T DO NUMBERS > 99999 CMPL R6,#5 ; DID WE DO 5 DIGITS? BLSS NEXT ; BR IF NYET FINI: TSTL R5 ; WAS IT NEGATIVE? BEQL 1$ MNEGL R4,R4 1$: MOVL R4,R0 MOVL R7,R1 RET .END