.LIST TTM .ENABLE LC .TITLE STRING .IDENT /KSR/ .NLIST .SBTTL STRING...String handling subroutines .LIST ; ; STRING HANDLING SUBROUTINES ; ; STRNGF -- ROUTINE TO RETURN THE VALUE OF A BYTE IN A STRING ; CALL IS : CALL STRNGF(N,I,J) ; ; STRNGS -- ROUTINE TO STUFF A BYTE IN A STRING ; CALL IS : CALL STRNGS(J,I,K) ; ; SMOV -- ROUTINE TO MOVE ONE STRING INTO ANOTHER ; CALL IS : CALL SMOV(I1,J,I2,K,L) ; ; STRCMP -- ROUTINE TO COMPARE TWO STRINGS ; CALL IS : CALL STRCMP (I1,J,I2,K,L,M) ; ; NUMOUT -- ROUTINE TO CONVERT AN ASCII STRING TO INTEGER VALUE ; CALL IS : NUM=NUMOUT(I,J,K) ; MASK=177400 .NLIST .SBTTL STRNGF .LIST .PAGE ; ; STRNGF -- ROUTINE TO RETURN THE VALUE OF A BYTE IN A STRING ; ; CALL IS : CALL STRNGF(N,I,J) ; ; WHERE N = VALUE RETURNED (INTEGER) ; I = NAME OF INTEGER ARRAY FULL OF ASCII ; J = BYTE # IN IARRAY (BYTE 0 = 1) ; (INTEGER VARIABLE) ; STRNGF:: CMP (R5)+,#3 ; 3 ITEMS ? BNE 1$ ; ERROR IF NOT MOV (R5)+,R2 ; GET POINTER TO RESULT MOV (R5)+,R1 ; GET IARRAY POINTER ADD @(R5)+,R1 ; ADD POSITION # DEC R1 ; BASE IS 0 CLR R0 MOVB (R1),R0 ; GET CHARACTER ; BIC #MASK,R0 ; STRIP OFF JUNK MOV R0,(R2) ; SAVE RESULT 1$: RETURN .NLIST .SBTTL STRNGS .LIST .PAGE ; ; ; STRNGS -- ROUTINE TO STUFF A BYTE IN A STRING ; ; CALL IS : CALL STRNGS(J,I,K) ; ; WHERE J = VALUE TO STUFF (INTEGER) ; I = IARRAY ; K = BYTE # ; STRNGS:: CMP (R5)+,#3 ; 3 ITEMS ? BNE 1$ ; BR IF NOT MOV @(R5)+,R2 ; GET VALUE TO STUFF MOV (R5)+,R1 ; GET IARRAY POINTER ADD @(R5)+,R1 ; ADD ELEMENT # DEC R1 ; BASE IS 0 MOVB R2,(R1) ; MOVE IN VALUE 1$: RETURN .NLIST .SBTTL SMOV .LIST .PAGE ; ; ; SMOV -- ROUTINE TO MOVE ONE STRING INTO ANOTHER ; ; CALL IS : CALL SMOV(I1,J,I2,K,L) ; ; WHERE I1 = DESTINATION STRING ; J = " START BYTE ; I2 = SOURCE STRING ; K = " START BYTE ; L = # OF BYTES TO MOVE ; SMOV:: CMP (R5)+,#5 ; 5 ITEMS ? BNE 2$ ; ERROR IF NOT JSR R4,UNSTAK ; GET VARIABLES AND POINTERS BR 2$ ; ERROR 1$: MOVB (R1)+,(R2)+ ; MOVE STRING SOB R0,1$ 2$: RETURN .NLIST .SBTTL STRCMP .LIST .PAGE ; ; STRCMP -- ROUTINE TO COMPARE TWO STRINGS ; ; CALL IS : CALL STRCMP (I1,J,I2,K,L,M) ; ; WHERE I1 = NAME OF STRING1 ; J = STRING1 START BYTE ; I2 = NAME OF STRING2 ; K = STRING2 START BYTE ; L = NUMBER OF BYTES TO COMPARE ; M = RETURN KEY VALUE ; = -1 IF STRING1 < STRING2 ; = 0 IF STRING1 = STRING2 ; = +1 IF STRING1 > STRING2 ; STRCMP:: CMP (R5)+,#6 ; 6 ITEMS ? BNE 3$ ; RETURN IF NOT JSR R4,UNSTAK ; UNSTACK THE POINTERS BR 3$ ; ERROR CLR R3 ; ASSUME EQUAL STRINGS 1$: CMPB (R1)+,(R2)+ ; BYTES EQUAL ? BLT 4$ ; BR IF 2 < 1 BGT 5$ ; BR IF 1 < 2 SOB R0,1$ ; KEEP CHECKING IF EQUAL 2$: MOV R3,@(R5)+ ; RETURN KEY VALUE TO USER 3$: RETURN 4$: INC R3 ; SET +1 FOR RETURN VALUE BR 2$ 5$: DEC R3 ; SET -1 FOR RETURN VALUE BR 2$ .NLIST .SBTTL NUMOUT .LIST .PAGE ; ; NUMOUT -- ROUTINE TO CONVERT AN ASCII STRING TO INTEGER VALUE ; ; ; CALL IS : NUM=NUMOUT(I,J,K) ; ; WHERE NUM=RETURNED INTEGER VALUE ; I=ASCII STRING START ADDRESS ; J=BYTE NUMBER TO START (BYTE0=1) ; K=# OF BYTES TO CONVERT ; ; NUM=-1 IF STRING ERROR ; ; NUMOUT:: TST (R5)+ ; POP ARGUMENT COUNT MOV (R5)+,R2 ; GET STRING ADDRESS MOV @(R5)+,R0 ; GET START BYTE ADD R0,R2 ; ADJUST STRING DEC R2 ; ADDRESS MOV @(R5)+,R0 ; GET # OF BYTES BLE 10$ ; ERROR IF LE 0 CMP R0,#6 ; 6 DIGITS MAX BGT 10$ ; ERROR IF MORE CLR R1 ; R1 ACCUMULATES CLR R3 ; R3 IS FLAG FOR - SIGN ; ; START OF LOOP...GET A CHARACTER ; 1$: MOVB (R2)+,R4 ; GET NEXT CHAR BEQ 10$ ; ERROR IF NULL CMPB R4,#40 ; SPACE ? BNE 2$ ; SKIP LEADING SPACES TST R1 ; ANYTHING YET ? BEQ 5$ ; IGNORE IF NOT BR 4$ ; DONE IF IT IS ; ; CHECK FOR MINUS SIGN ; 2$: CMPB R4,#55 ; - ? BNE 3$ ; BR IF NO TST R1 ; ANY NUMBER YET BNE 10$ ; ERROR IF THERE IS INC R3 ; SET NEGATE FLAG BR 5$ ; GET MORE ; ; CHECK FOR PLUS SIGN ; 3$: CMPB R4,#53 ; + ? BNE 8$ ; BR IF NO TST R1 ; ANY NUMBER YET BNE 10$ ; ILLEGAL IF SO BR 5$ ; LEGAL SPACE 8$: SUB #60,R4 ; STRIP OFF ASCII BMI 10$ ; ERROR IF LT '0' CMP R4,#9. ; TRY GT '9' BGT 10$ ; ERROR IF IT IS MUL #10.,R1 ; NUM=NUM*10 ADD R4,R1 ; NUM=NUM+DIGIT 5$: SOB R0,1$ ; DO ALL DIGITS 4$: TST R3 ; NEGATE ? BEQ 6$ ; BR IF NOT NEG R1 ; NUM=-NUM 6$: MOV R1,R0 ; RETURN RESULT 7$: RETURN 10$: MOV #-1,R0 ; ERROR RETURN BR 7$ .NLIST .SBTTL UNSTAK .LIST .PAGE ; ; SUBROUTINE TO UNSTACK 5 ITEMS FROM R5 ; UNSTAK: MOV (R5)+,R2 ; GET POINTER TO STRING1 ADD @(R5)+,R2 ; ADD START DEC R2 ; BASE IS 0 MOV (R5)+,R1 ; GET POINTER TO STRING2 ADD @(R5)+,R1 ; ADD START POINT DEC R1 ; BASE IS 0 MOV @(R5)+,R0 ; GET NUMBER OF BYTES TO CONSIDER BLE 1$ ; ERROR IF LE 0 TST (R4)+ ; SKIP ERROR RETURN 1$: RTS R4 .END