.TITLE SDELET ; ;AUTHOR: MARTY PORTNER ; WORLD BOOK-CHILDCRAT, INC. ;SUBROUTINE TO DELETE A SPECIFIED NUMBER OF CHARACTERS WITHIN ;A CHARACTER STRING. ;CALLING FORMAT: ; ; CALL SDELET(STR,POS,LEN) ; ;WHERE STR IS THE STRING, POS IS THE POSITION AT WHICH LEN NUMBER ;OF CHARACTERS WILL BE DELETED. ; ; DEFAULTS SUPPLIED: POS <<<<<>>>>> +1 ; LEN <<<<<>>>>> ISIZE(STR)-POS ; .IDENT *SDELE1* .PSECT $$STRG,RO,I,CON,LCL SDELET:: CMPB #1,@R5 ;TEST ARG VALIDITY BLT 1$ ;IF MORE THAN ONE ARG, CHECK FOR DEFAULTS BEQ 20$ ;SPECIAL CASE (SAME AS NULL) JMP .RTN$ ;EXIT IF TOO FEW ARGS 20$: CMP #-1,2(R5) ;STR THERE ?? BEQ .RTN$ ; MOV 2(R5),-(SP) ;MOVE ADDR. OF STR ON STACK CLRB @(SP)+ ;ACTS LIKE 'CALL NULL(STR)' JMP .RTN$ ;EXIT 1$: CMPB #2,@R5 ;TWO ARGS ?? BLT 2$ ; CMP #-1,4(R5) ;POS THERE ?? BEQ .RTN$ ; TST @4(R5) ;IS POS <= 0 ?? BLE .RTN$ ;IF SO, RETURN MOV 2(R5),-(SP) ;ELSE SAVE ADDR. OF STR ON STACK ADD @4(R5),(SP) ; DEC (SP) ; SPECIAL CASE-- ACTS LIKE TRUNC CLRB (SP)+ ; JMP .RTN$ ; 2$: CMP #-1,2(R5) ; BEQ .RTN$ ; CMP #-1,6(R5) ; BNE 3$ ; JMP 100$ ;BAD ARGS. 3$: MOV R3,-(SP) ;SAVE REGISTERS (FIRST SET) MOV R4,-(SP) ; MOV @6(R5),R3 ;SAVE LEN PARAMETER BLE 100$ ;BAD LEN PARAMETER ??-- IF SO RETURN 5$: CMP #-1,4(R5) ;ELSE, KEEP CHECKING BNE 6$ ;DEFAULT POS ?? MOV #1,R4 ;SUPPLY DEFAULT POS VALUE OF +1 JMP 7$ 6$: MOV @4(R5),R4 ;ELSE USE SUPPLIED POS VALUE BLE 100$ ;BAD POS PARAMETER ??--IF SO, RETURN 7$: MOV R0,-(SP) ;SAVE REGISTERS (SECOND SET) MOV 2(R5),R0 ;ADDR OF STR IS IN R0 10$: TSTB (R0)+ ;FIND LENGTH OF STR BNE 10$ ; SUB 2(R5),R0 ; DEC R0 ;VALUE IS IN R0 CMP R0,R4 ;POS>ISIZE(STR) ?? BGE 40$ ;IF NOT, CONTINUE JMP 100$ ;ELSE LEAVE 40$: MOV R1,-(SP) ; MOV R2,-(SP) ;SAVE REGISTERS (THIRD SET) MOV R3,R1 ;R1 HAS LEN PARAMETER ADD R4,R1 ;CALC MOVE ADDR. (SKIP OVER BYTES TO DELETE) DEC R1 ; CMP R1,R0 ;LEN+POS>ISIZE(STR) ?? BLE 90$ ;YES-- SAME AS TRUNC MOV 2(R5),R0 ;R0 HAS ADDR. OF STR ADD R4,R0 ;TRUNCATE AT POSISTION POS WITHIN STR CLRB -(R0) ;TRUNCATE JMP 60$ ; 90$: MOV 2(R5),R2 ;PLACE ADDR. OF STR IN R2 MOV R2,R1 ;AND R1 ADD R4,R1 ;BUMP R1,R2 TO POSITION POS ADD R4,R2 ; DEC R1 ;SKIP OVER ZERO BYTE IN STR DEC R2 ADD R3,R2 ;R2 POINTS TO POSITION [ADDR. OF STR]+POS +LEN-1 70$: MOVB (R2)+,(R1)+ ;TRANSFER DATA (DELETE BY OVERWRITE) BNE 70$ ;DELETE 60$: MOV (SP)+,R2 ;RESTORE REGISTERS MOV (SP)+,R1 100$: MOV (SP)+,R0 ; MOV (SP)+,R4 ; MOV (SP)+,R3 ; .RTN$: RTS PC ;RETURN .END