.TITLE SUBSTR ;AUTHOR: MARTY PORTNER ; WORLD BOOK-CHILDCRAFT, INC. ; SUBROUTINE TO CREATE A SUBSTRING OF AN ALREADY EXISTING ; STRING. CALLING FORMAT IS: ; ; CALL SUBSTR(STR1,START,LEN,STR2) ; ; 'STR1' IS THE SOURCE STRING, 'START' IS THE CHARACTER POSITION ; IN 'STR1' AT WHICH THE SUBSTRIG IS TO START, LEN IS HOW MANY ; CHARACTERS FROM 'STR1' TO COPY AND 'STR2' IS THE DESTINATION. ; 'SUBSTR' PUTS A ZERO BYTE AFTER THE LAST CHARACTER COPIED ; INTO 'STR2'. ; ; DEFAULTS SUPPLIED: STR2 <<<<<<>>>>>> STR1 .IDENT $SUBST6$ .PSECT $$STRG,RO,I,CON,LCL SUBSTR:: CMPB #4,@R5 ;ENOUGH ARGS ?? BLT XIT$ ; CMP #-1,2(R5) ; BEQ XIT$ ;CHECK ARG. VALIDITY CMP #-1,4(R5) ; BEQ XIT$ CMP #-1,6(R5) ; BEQ XIT$ ; MOV 2(R5),-(SP) TSTB (SP)+ ;IF STR1 IS NULL, RETURN BEQ XIT$ TST @6(R5) ;IF 'LEN' IS <=0, RETURN BLE XIT$ MOV R0,-(SP) ;SAVE REGISTERS MOV R1,-(SP) ; MOV R2,-(SP) ; CMPB #3,@R5 ; BEQ 10$ ;DEFAULT ARG. NEEDED ?? CMP #-1,10(R5) ; BNE 11$ ; 10$: MOV 2(R5),-(SP) ;SUPPLY DEFAULT ARG. OF STR1 FOR STR2 JMP 12$ ; 11$: MOV 10(R5),-(SP) ;USED SUPPLIED STR2 12$: MOV 2(R5),R0 ;R0 HAS ADDR. OF STR1 ADD @4(R5),R0 ;CALC. START ADDR. OF SUBSTRING DEC R0 ; MOV R0,R2 ;CHECK VALIDITY OF 'START' INC R2 ; 20$: TSTB -(R2) ;IF 'END OF STRING' FOUND, EXIT BEQ 2$ ;THIS IS THE CASE WHERE POS>ISIZE(STR1) CMP 2(R5),R2 ;EXIT CONDITION BLT 20$ MOV @6(R5),R2 ;'LEN' IS IN R2 MOV (SP),R1 ;ADDR OF DESTINATION IS IN R1 1$: MOVB (R0)+,(R1)+ ;CREATE SUBSTRING BEQ 2$ ;'LEN' GREATER THAN ISIZE(SOURCE) ??--YES EXIT SOB R2,1$ ;ELSE, CONTINUE CLRB (R1) ;ADD ZERO BYTE 2$: TST (SP)+ ;POP OFF JUNK MOV (SP)+,R2 ; MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R0 ; XIT$: RTS PC ; .END