.TITLE DUPL ; AUTHOR: MARTY PORTNER ; WORLD BOOK-CHILDCRAFT, INC. ; SUBROUTINE TO DUPLICATE A STRING FOR A SPECIFIED AMOUNT OF ; TIMES. ; CALLING FORMAT: ; CALL DUPL(STR1,NTIMES,STR2) ; THIS WILL DUPLICATE 'STR1' 'NTIMES' TIMES AND STORE THE ; RESULT IN 'STR2' ; DEFAULTS SUPPLIED: NONE ; .IDENT $DUPL8$ .PSECT $$STRG,RO,I,CON,LCL DUPL:: CMPB #3,@R5 ;ENOUGH ARGS ?? BNE $XIT ;NO-- EXIT CMP #-1,2(R5) ;ELSE CHECK ARG VALIDITY BEQ $XIT CMP #-1,4(R5) ; BEQ $XIT ; CMP #-1,6(R5) ; BEQ $XIT ;EXIT IF ANY ARGUMENT IS NULL MOV R0,-(SP) ;SAVE REGISTERS MOV R1,-(SP) ; MOV R2,-(SP) ; 11$: MOV SP,R0 ;STORE SOURCE TO PREVENT OVERWRITING SUB #2,R0 ;USE REMAINDER OF STACK SPACE MOV 2(R5),R1 ;R1 HAS ADDRESS OF 'STR1' 12$: MOVB (R1)+,-(R0) ;TRANSFER 'STR1' TO STACK BYTE BY BYTE BNE 12$ ; MOV SP,R0 ;SAVE STACK POINTER IN ORDER TO RETRIEVE 'STR1' MOV R0,-(SP) ; SUB #2,(SP) ;TOP OF STACK IS ADDRESS IN STACK WHERE ;'STR1' BEGINS 10$: MOV 6(R5),R0 ;ADDR OF DESTINATION IS IN R0 MOV @4(R5),R1 ;'NTIMES' IS IN R1 BLE 4$ ;'NTIMES'<=0 (BAD !!) SO EXIT 1$: MOV (SP),R2 ;ADDR. OF 'STR1' WITHIN STACK IS NOW IN R2 2$: MOVB -(R2),(R0)+ ;COPY 'STR1' TO 'STR2' BNE 2$ ; DEC R0 ;DECREMENT R0 TO OVERWRITE ZERO BYTE SOB R1,1$ ;REPEAT 'NTIMES' TIMES CLRB (R0) ;ZERO BYTE ADDED TO END OF 'STR2' 4$: TST (SP)+ ;POP OFF JUNK MOV (SP)+,R2 ;RESTORE REGISTERS MOV (SP)+,R1 ; MOV (SP)+,R0 ; $XIT: RTS PC ;RETURN .END