.TITLE CONCAT ;AUTHOR: MARTY PORTNER ; WORLD BOOK-CHILDCRAFT, INC. ; SUBROUTINE TO CONCATENATE 2 CHARACTER STRINGS AND ; PLACE THE RESULT IN A THIRD. ; CALLING FORMAT: ; ; CALL CONCAT(STR1,STR2,STR3) ; ; THIS CALL WILL RESULT IN 'STR1' BEING CONCATENATED TO 'STR2' ; AND THE RESULT BEING PLACED IN 'STR3'. ; ; DEFAULTS SUPPLIED: STR3 -> STR1 ; .IDENT $CONCA8$ .PSECT $$STRG,RO,I,CON,LCL CONCAT:: CMPB #3,@R5 ;ENOUGH ARGUMENTS ?? BGE 10$ ; JMP $OUT ;IF NOT, EXIT 10$: CMP #-1,2(R5) ;CHECK ARG. VALIDITY BEQ $OUT ; CMP #-1,4(R5) ; BEQ $OUT ; MOV R0,-(SP) ;SAVE REGISTERS MOV R1,-(SP) ; CMPB #2,@R5 ;SHOULD DEFAULT BE SUPPLIED ? ;DEFAULT PARAMETER FOR 'STR3' IS 'STR1' BEQ 11$ ; CMP #-1,6(R5) ;IS 'STR3' PRESENT ?? BNE 20$ ;YES-- USE 'STR3' 11$: MOV 2(R5),-(SP) ;ELSE SUPPLY MISSING ARGUMENT 'STR1' JMP 21$ ; 20$: MOV 6(R5),-(SP) ;DESTINATION (NO DEFAULT) 21$: MOV SP,R0 ;SAVE STACK POINTER MOV 2(R5),R1 ;XFER STR1 TO STACK BYTE BY BYTE 30$: MOVB (R1)+,-(R0) ; BNE 30$ ; INC R0 ; MOV 4(R5),R1 ;PREPARE TO CONCATENATE STR1 AND STR2 40$: MOVB (R1)+,-(R0) ;XFER STR2 (ACTUAL CONCATENATION) BNE 40$ ; MOV SP,R0 ;XFER TO DESTINATION 'STR3' MOV (SP)+,R1 ;DEST (STR3) 50$: MOVB -(R0),(R1)+ ; BNE 50$ ; MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R0 ; $OUT: RTS PC .END