CONCATENATE TWO CHARACTER STRINGS
  LOC  OBJECT CODE    ADDR1 ADDR2  STMT   SOURCE STATEMENT
000000                                2 P1       START
000000 05C0                           3          BALR  12,0
                            00002     4          USING *,12
                                      5 * YOUR PROGRAM GOES HERE
                                      6 * OBJECTIVE:  TO ILLUSTRATE THE USE OF CHARACTER STRING
                                      7 * OUR FORMAT IS THAT A CHARACTER STRING IS A POINTER TO THE
                                      8 * BEGINNING OF THE CHARACTER STRING
                                      9 * AT THE POINTER -4 IS THE LENGTH (OR ACTUAL NUMBER OF CHARS IN
                                     10 * THE STRING)
                                     11 * AT THE POINTER -8  IS THE MAXIMUM LENGTH (OR SPACE ALLOCATTED)
000002 4110 C022            00024    12          LA     1,STRING1
000006 5010 C036            00038    13          ST     1,CSCB
00000A 4110 C032            00034    14          LA     1,STRING2
00000E 5010 C03A            0003C    15          ST     1,CSCB+4
000012 4110 C036            00038    16          LA     1,CSCB
000016 45F0 C03E            00040    17          BAL    15,CS
00001A 07FE                          18          BR     14
                                     19 *
00001C 00000006                      20          DC     A(STRING1L)
000020 00000003                      21          DC     A(STRING1A)
000024 C1C2C3                        22 STRING1  DC     C'ABC'
                            00003    23 STRING1A EQU    *-STRING1      ACTUAL LENGTH OF STRING TO START
000027 404040                        24          DC     C'   '
                            00006    25 STRING1L EQU    *-STRING1      HOW MUCH ROOM WE HAVE
00002A 0000
00002C 00000004                      26          DC     A(STRING2L)
000030 00000004                      27          DC     A(STRING2L)
000034 C4C5C6C7                      28 STRING2  DC     C'DEFG'
                            00004    29 STRING2L EQU    *-STRING2
i000038                               30 CSCB     DS     2F
         CONCATENATE TWO CHARACTER STRINGS
  LOC  OBJECT CODE    ADDR1 ADDR2  STMT   SOURCE STATEMENT
                            00040    32 CS       EQU    *
                                     33 *        CONCATENATES STRING1 AND STRING2, PUTTING THE RESULT IN
                                     34 *        STRING1
                                     35 *        IF  THERE IS INSUFFICIENT ROOM IN STRING1 (AS DETERMINED BY
                                     36 *        ITS  MAXIMUM LENGTH), THE RESULT WILL BE TRUNCATED
                                     37 *        APPROPRIATELY
                                     38 *
                                     39 *        ON ENTRY R1 WILL POINT TO A CSCB (CONCATENATE STRING CONTROL
                                     40 *        BLOCK)
                                     41 *        ITS WORDS WILL BE  (+0) POINTER TO FIRST STRING
                                     42 *        (+4) POINTER TO SECOND STRING
                                     43 *
                                     44 * REGISTER USAGE
                                     45 * R1 -  POINTER TO CSCB
                                     46 * R15 - RETURN ADDRESS
                                     47 * NOTE, WE ARE NOT USING IBM CALL/RETURN CONVENTIONS
                                     48 * R2 -  I
                                     49 * R3 -  J
                                     50 * R4 -  ADDRESS IN FIRST STRING, CORRESPONDING TO ADDRESS OF
                                     51 *       STRING1.CHARS[I]
                                     52 * R5 -  ADDRESS IN SECOND STRING, CORRESPONDING TO ADDRESS OF
                                     53 *       STRING2.CHARS[J]
                                     54 * R6 -  MAXIMUM LENGTH OF STRING1
                                     55 * R7 -  NUMBER OF CHARACTERS IN STRING2
                                     56 * R8 -  ADDRESS OF FIRST STRING
                                     57 * R9 -  ADDRESS OF SECOND STRING
                                     58 * R10 - TEMPORARY STORAGE
                                     59 * R11 - INITIAL VALUE FOR ACTUAL LENGTH OF STRING1
                                     60 *
000040 5880 1000            00000    61         L     8,0(0,1)
000044 5890 1004            00004    62         L     9,4(0,1)
                                     63 * GET MAXIMUM LENGTH  OF STRING 1
000048 18A8                          64         LR    10,8
00004A 5AA0 C0AE            000B0    65         A     10,=F'-8'
00004E 5860 A000            00000    66         L     6,0(0,10)
                                     67 * GET ACTUAL LENGTH  OF STRING 2
000052 18A9                          68         LR    10,9
000054 5AA0 C0B2            000B4    69         A     10,=F'-4'
000058 5870 A000            00000    70         L     7,0(0,10)
                                     71 * GET ACTUAL LENGTH  OF STRING 1
00005C 18A8                          72         LR    10,8
00005E 5AA0 C0B2            000B4    73         A     10,=F'-4'
000062 58B0 A000            00000    74         L     11,0(0,10)
                                     75 * I:=STRING1.ACTUALLENGTH+1
000066 182B                          76         LR    2,11
000068 5A20 C0B6            000B8    77         A     2,=F'1'
                                     78 * J:=1
00006C 5830 C0B6            000B8    79         L     3,=F'1'
                                     80 *
000070 1848                          81         LR    4,8
000072 1A4B                          82         AR     4,11   R4 NOW POINTS TO PLACE TO PUT FIRST CHAR OF STRING2
                                     83 *
000074 1859                          84         LR     5,9    R5 NOW POINTS TO FIRST CHAR TO MOVE
                                     85 * WHILE
i                                    86 * CONCATENATE TWO CHARACTER STRINGS
  LOC  OBJECT CODE    ADDR1 ADDR2  STMT   SOURCE STATEMENT
                            00076    87 CS001   EQU *
                                     88 *
                                     89 * (I<=STRING1.MAXLENGTH) AND
000076 1926                          90         CR    2,6
000078 4720 C09C            0009E    91         BC    2,CS001E
                                     92 * (J<=STRING2.ACTUALLENGTH)
00007C 1937                          93         CR    3,7
00007E 4720 C09C            0009E    94         BC    2,CS001E
                                     95 * STRING1.CHARS[I]:=STRING2.CHARS[J]
000082 43A0 5000            00000    96         IC    10,0(0,5)
000086 42A0 4000            00000    97         STC   10,0(0,4)
                                     98 * INCREMENT I,J AND ADDRESS POINTERS
00008A 5A20 C0B6            000B8    99         A     2,=F'1'
00008E 5A30 C0B6            000B8   100         A     3,=F'1'
000092 5A40 C0B6            000B8   101         A     4,=F'1'
000096 5A50 C0B6            000B8   102         A     5,=F'1'
                                    103 * END WHILE
00009A 47F0 C074            00076   104         B     CS001
                            0009E   105 CS001E  EQU   *
                                    106 * STORE NEW ACTUAL LENGTH
00009E 18A8                         107         LR    10,8
0000A0 5AA0 C0B2            000B4   108         A     10,=F'-4'
0000A4 5A20 C0BA            000BC   109         A     2,=F'-1'
0000A8 5020 A000            00000   110         ST    2,0(0,10)
                                    111 * END SUBROUTINE
0000AC 07FF                         112         BR    15
                                    113         END
0000B0 FFFFFFF8                     114                =F'-8'
0000B4 FFFFFFFC                     115                =F'-4'
0000B8 00000001                     116                =F'1'
0000BC FFFFFFFF                     117                =F'-1'