.TITLE INPI INPUT INTEGER STRING .PSECT INPI ;; ;; FORTRAN CALL: ;; I=INPI(STRING[,LEN][,ERR][,I]) ;; ;; STRING: THE STRING THAT IS TO BE CONVERTED FROM ;; DECIMAL NUMERALS TO BINARY ;; ;; LEN: THE MAX LENGTH OF THE STRING. IF THIS ;; PARAMETER IS MISSING, THE STRING IS ASSUMED TO ;; BE TERMINATED BY A ZERO BYTE. ;; ;; ERR: A 0 (.FALSE.) IS RETURNED IN THIS PARAMETER ;; IF THERE IS A CONVERSION ERROR IN THE STRING. ;; ;; I: ALTERNATE RETURN FOR THE RESULT IF INPI IS ;; CALLED AS A SUBROUTINE INSTEAD OF A FUNCTION. ;; INPI:: JSR PC,LEN TST R0 BMI ERROR ;STRING IS NOT PROPERLY TERMINATED CLR R1 ;CLEAR THE RESULT CLR R4 ;CLEAR THE SIGN FLAG MOV 2(R5),R2 ;GET POINTER TO FIRST CHARACTER SPCHK: DEC R0 ;COUNT DOWN CHARACTERS BMI DONE ;NONE LEFT MOVB (R2)+,R3 ;GET NEXT CHARACTER CMPB R3,#' ;IS IT A SPACE? BEQ SPCHK ;YES! IGNORE LEADING SPACES CMPB R3,#'- ;NOPE, IS IT A MINUS SIGN? BNE NUMBER ;NO, IT'S NOT A NUMBER EITHER INC R4 ;SET THE SIGN FLAG BR SPCHK ;AND GO LOOK FOR MORE SPACES NUMBER: CMPB R3,#'0 ;IS THIS A NUMBER? BLT TERMIN ;NOPE CMPB R3,#'9 ;PERHAPS... BGT TERMIN ;BUT NOT REALLY. MUL #10.,R1 ;MULTIPLY RESULT BY TEN SUB #'0,R3 ;CONVERT CHARACTER TO A NUMBER ADD R3,R1 ;AND ADD TO RESULT DEC R0 ;COUNT DOWN CHARACTERS BMI DONE ;NO MORE LEFT MOVB (R2)+,R3 ;GET NEXT ONE BR NUMBER ;AND GO BACK UP TO CHECK IT TERMIN: CMPB R3,#', ;WAS IT TERMINATED WITH A COMMA? BEQ DONE ;YUP, THAT'S OK. CMPB R3,#' ;WAS IT TERMINATED BY A SPACE? BEQ DONE ;YUP, TAT'S OK ALSO CMPB R3,#'- ;WELL, IS IT TERMINATED BY A HYPHEN? BEQ DONE ;YUP, IT MADE IT ERROR: MOV R1,R0 CMPB (R5),#2 ;HOW MANY ARGS? BLE RETURN ;NOT ENOUGH CMP 6(R5),#-1 ; IS THIS A NULL ARGUMENT? BEQ TST4 ;YES, CAN'T RETURN AN ERROR CLR @6(R5) ;RETURN FALSE FOR ERROR RTS PC DONE: MOV R1,R0 TST R4 ;TEST SIGN FLAG BEQ POSIT ;POSITIVE NUMBER NEG R0 ;NEGATIVE NUMBER POSIT: CMPB (R5),#2 ;HOW MANY ARGUMENTS? BLE RETURN ;NO ERROR ARG CMP 6(R5),#-1 ;IS IT A NULL ARGUMENT? BEQ TST4 ;YES, SKIP IT MOV #-1,@6(R5) ;NO, SENT TRUE FORNO ERROR TST4: CMPB (R5),#3 ;IS THERE A RETURN PARAMETER? BLE RETURN ;NOPE MOV R0,@10(R5) ;YES, RETURN THE RESULT THERE ALSO RETURN: RTS PC .END