.TITLE MR06.. STRING PROCEDURES IN MACRO ; .IDENT /MR06../ ; .PAGE .SBTTL . WEDGE ONE STRING WITHIN ANOTHER STRING ; ; R$WEDGE:: ; ; ENTRY CONDITIONS ; ; R1 -> MASTER STRING ADDRESS ; R2 -> WEDGE INSERT STRING ; R3 = POSITION WHERE INSERT MUST START ; ; ; ; ; TST R3 ;IS WEDGE INSERT POSITION WITHIN STRING BLT 62$ ;J IF BEFORE START OF STRING TST @R2 ;ARE THERE ANY CHARACTERS TO INSERT BLE 62$ ;J IF NO CHARACTERS CMP R3,@R1 ;IS WEDGE POSITION BEYOND STRING BGT 62$ ;J IF WEDGE POSITION BEYOND STRING ; SAVE ;SAVE REGISTERS R0 -> R5 MOV @R1,R0 ;HOLD LENGTH OF MASTER STRING ADD @R2,R0 ;HOLD POSITION OF FINAL CHARACTER ; MOV @R1,R5 ;HOLD POSITION OF LAST CHAR IN MASTER INC R5 ;OFFSET CORRECTION FACTOR ADD R1,R5 ;R5 -> LAST CHARACTER IN MASTER MOV @R1,R4 ;HOLD STRING LENGTH OF MASTER SUB R3,R4 ;HOLD COUNTER OF NUMBER OF CHARACTERS ;TO MOVE UP STRING TO LEAVE ROOM FOR ;THE INSERT STRING BEQ 30$ ;J IF NO CHARACTERS TO MOVE ; 20$: CALL 140$ ;COPY UP STRING ONE CHARACTER ;AND MODIFY POINTERS SOB R4,20$ ;LOOP TILL ALL CHARACTERS MOVED ; ; ; NOW INCLUDE THE WEDGE STRING INTO THE MASTER ; 30$: MOV @R2,R4 ;HOLD LENGTH OF WEDGE STRING MOV R4,R5 ;CALCULATE ADDRESS OF LAST CHAR IN WEDGE INC R5 ;OFFSET CORRECTION ADD R2,R5 ;ABSOLUTE ADDRESS OF LAST CHARACTER ; 35$: CALL 140$ ;INSERT A CHARACTER FROM WEDGE STRING SOB R4,35$ ;LOOP TILL ALL CHARACTER COPPIED ACROSS ; ; ; .PAGE ; ; ; CORRECT THE VALUE HELD AS THE STRING LENGTH ; ADD @R2,@R1 ;ASSUME LENGTH = MASTER+WEDGE CMP -2(R1),@R1 ;DOES LENGTH EXCEED MAXIMUM LENGTH BGE 61$ ;J IF LENGTH WITHIN LIMITS MOV -2(R1),@R1 ;SET LENGTH AS STRING MAXIMUM ; ; 61$: UNSAVE ;RESTORE ALL REGISTERS 62$: RETURN ;EXIT ; ; ; ; COPY A CHARACTER ; ; ENTRY CONDITIONS ; R0 = LOAD POSITION ; R5 -> CHARACTER TO COPY ; ; EXIT CONDITIONS ; R0 = LOAD POSITION - 1 ; R5 -> CHARACTER POSITION -1 BYTE ; 140$: ; CMP -2(R1),R0 ;IS THIS CHARACTER POSITION BEYOND END OF STRING BLT 150$ ;J IF BEYOND STRING MAXIMUM LIMIT SAVE R0 ;SAVE R0 AS VALUE MODIFIED IN SUBROUTINE INC R0 ;OFFSET CORRECTION ADD R1,R0 ;HOLD ABSOLUTE ADDRESS OF LOAD POINT MOVB @R5,@R0 ;COPY ACROSS CHARACTER UNSAVE R0 ;RESTORE REGISTER R0 150$: CMPB -(R0),-(R5) ;SET CHARACTER POINTER TO PREVIOUS CHARACTER ;AND DECREMENT LOAD POSITION POINTER RETURN ;EXIT ; .END ; ;