; SUBROUTINE STRCON ; STRING CONCATENATION ROUTINE ; TO TAKE A VARIABLE NUMBER OF STRINGS AND CONCATENATE THEM ; INTO ONE STRING. ; FORTRAN CALL: ; CALL STRCON(LENA,LEN,STR,LEN1,STR1[,LEN2,STR2,...]) ; WHERE: ; LENA = ACTUAL LENGTH OF CONCATENATED STRING ; + INDICATES SUCCESSFUL CONCATENATION ; 0 INDICATES ERROR IN CALL ; - INDICATES OVERFLOW, VALUE = LEN ; LEN = MAX. LENGTH OF OUTPUT STRING ; STR = START OF OUTPUT STRING ; LEN1 = LENGTH OF FIRST INPUT STRING ; STR1 = START OF FIRST STRING ; ETC. .TITLE STRCON .GLOBL STRCON .CSECT STRCON: MOVB (R5),R0 ;GET NO. OF ARGUMENTS IN R0 BIT #1,R0 ;CHECK FOR ODD NO. OF ARGS BEQ ERROR1 ;IF NOT, ERROR CMP R0,#5 ;SEE IF ENOUGH ARGS BLT ERROR1 ;IF NOT, ERROR SUB #3,R0 ;GET NUMBER OF STRINGS ASR R0 ;IN R0 TST (R5)+ ;POINT TO LENA MOV (R5)+,-(SP) ;PUT ADDRESS OF LENA ON STACK MOV @(R5)+,R1 ;LEN OF OUTPUT IN R1 MOV R1,@(SP) ;AND IN LENA MOV (R5)+,R2 ;ADDRESS OF OUTPUT IN R2 2$: MOV @(R5)+,R3 ;LEN OF INPUT STRING IN R3 MOV (R5)+,R4 ;ADDRESS OF INPUT STRING IN R4 TST R3 ;CHECK FOR ZERO LENGTH BEQ 3$ ;IF ZERO, SKIP TRANSFER 1$: DEC R1 ;NUMBER LEFT AFTER CHAR XFER IN R1 BLT ERROR2 ;REPORT OVERFLOW IF RAN OUT MOVB (R4)+,(R2)+ ;TRANSFER A CHARACTER SOB R3,1$ ;KEEP GOING TILL STRING TRANSFERRED 3$: SOB R0,2$ ;GET ANOTHER STRING TILL DONE MOV (SP)+,R0 ;LENA ADDRESS IN R0 MOV (R0),R2 ;MAX STRING LEN IN R2 SUB R1,R2 ;MAX - REMAINING = ACTUAL MOV R2,(R0) ;PUT IT AWAY RTS PC ;RETURN ERROR1: TST (R5)+ ;POINT TO LENA CLR @(R5) ;INDICATE ERROR RTS PC ERROR2: NEG @(SP)+ ;SET NEG FLAG ON LENA RTS PC .END