.TITLE SINSRT ;AUTHOR: MARTY PORTNER ; WORLD BOOK-CHILDCRAFT, INC. ; ; SUBROUTINE TO INSERT A CHARACTER STRING WITHIN ANOTHER ; ; CALLING FORMAT: ; ; CALL SINSRT(STRA,POS,STRB) ; ; WHERE STRA IS THE STRING IN WHICH STRB WILL BE INSERTED AT ; POSITION POS. ; ; DEFAULTS SUPPLIED: POS <<<<<>>>>> +1 .IDENT $SINSR1$ .PSECT $$STRG,RO,I,CON,LCL SINSRT:: CMPB #2,@R5 ;COUNT AND VALIDATE ARGUMENTS BLT 1$ ; JMP .OUT. ;NOT ENOUGH. 1$: CMP #-1,2(R5) ; BEQ .OUT. ; CMP #-1,6(R5) ; BEQ .OUT. ; MOV R0,-(SP) ;SAVE REGISTERS MOV R1,-(SP) ; MOV R2,-(SP) ; CMP #-1,4(R5) ;DECIDE WHETHER POS IS PRESENT BEQ 2$ ; MOV @4(R5),-(SP) ;SAVE POS IN THIS CASE BGT 3$ JMP 9$ ;RETURN IF POS <= 0 2$: MOV #1,-(SP) ;SUPPLY DEFAULT POS ASSIGNMENT OF +1 3$: MOV 2(R5),R0 ;ADDR. OF DESTINATION IS IN R0 4$: TSTB (R0)+ ;OBTAIN LENGTH OF STRA BNE 4$ ; SUB 2(R5),R0 ; CMP R0,(SP) ;POS>ISIZE(STR)+1 ?? BLT 9$ ;YES-- EXIT MOV SP,R1 ;ELSE BUILD TEMP ON STACK SUB #2,R1 ; MOV 2(R5),R0 ; ADD (SP),R0 ; DEC R0 ;SAVE REMAINDER OF STRING ON STACK 5$: MOVB (R0)+,-(R1) ; BNE 5$ ; MOV 6(R5),R2 ;R2 HAS ADDR. OF STRB MOV 2(R5),R1 ;R1 HAS ADDR. OF STRA DEC R1 ; ADD (SP),R1 ;BUMP R1 TO POSITION POS+[ADDR. OF STRA] 7$: MOVB (R2)+,(R1)+ ;INSERT STRB AT THIS POSITION BNE 7$ ; DEC R1 ;R1 POINTS TO END OF INSERTION MOV SP,R2 ;RETRIEVE REST OF STRA SUB #2,R2 ;PLACE REMAINDER OF STRING IN STRA 8$: MOVB -(R2),(R1)+ ; BNE 8$ ; 9$: TST (SP)+ ;POP OFF JUNK 10$: MOV (SP)+,R2 ;RESTORE REGISTERS MOV (SP)+,R1 MOV (SP)+,R0 .OUT.: RTS PC ;RETURN .END