Example of TRT and EX

In one of the assignments in this course, we have a data file in which each line contains 0 or more integers, separated by spaces. We might have lines like these:

      45        789
  271

         62           511    9999

Suppose we want to read all these integers and store them in a table as fullwords. We can do this using TRT, EX and CVB.

For the sake of simplicity, we will assume all the integers are non-negative. We will also assume there are no more than 100 numbers in the file.


We will need to declare some items:

BUFFER   DC    81C' '                  Input buffer
*
TABLE    DS    100F                    Table in which to store integers
EOT      DS    F                       End-of-table address
*
DIGITS   DC    256X'00'                Search table to look for digits
         ORG   DIGITS+X'F0'
         DC    10X'01'
         ORG
*
SPACES   DC    256X'00'                Search table to look for spaces
         ORG   DIGITS+X'40'
         DC    X'01'
         ORG
*
TEMP     DS    D                       Used with CVB
*
THEPACK  PACK  TEMP(8),0(0,5)          Executed by EX

The code we need would look something like this:

         LA    7,TABLE                 7 is our table pointer
LOOP1    XREAD BUFFER,80               Read a line
         BC    B'0100',END1            End-of-file?  End the outer loop
         LA    1,BUFFER                1 = address of BUFFER
LOOP2    TRT   0(80,1),DIGITS          Search for a digit  
         BC    B'1000',END2            No numbers?  End the inner loop
         LR    4,1                     4 = address of first digit 
         TRT   0(80,1),SPACES          Search for a space
         LR    5,1                     5 = address of next space 
         SR    5,4                     Now 5 = actual length  
         BCTR  5,0                     Adjust the length
         EX    5,THEPACK               Pack the number into TEMP
         CVB   6,TEMP                  Now 6 = the number (binary)
         ST    6,0(0,7)                Store it in the table
         LA    7,4(0,7)                Advance table pointer
         BC    B'1111',LOOP2           Repeat the inner loop
END2     DS    0H
         BC    B'1111',LOOP1           Repeat the outer loop 
END1     DS    0H
         ST    7,EOT                   Store end-of-table address


In the PACK instruction, the lengths are 8 and 0. When this is encoded, they will be 7 and 0. (A length of 0 is encoded as 0, not -1.) When the EX is executed, we will have a copy of the encoded form of the PACK instruction, and the second byte will be modified:

  second byte = second byte OR 4th byte of register 5

All that is in register 5 is the adjusted length, so all of it is zeros except the last hex digit. The effect of the OR instruction is to leave the 7 alone and replace the 0 with the adjusted length.

Why was BUFFER declared as 81 characters long? The last character is there, initialized as a space, so we can be sure TRT will find a space after the last number. In theory, the number could be in the last few columns of BUFFER and we want to make sure register 1 will point to the space after it.

If we want to deal with negative integers as well, we would need to modify DIGITS to search for C'+' and C'-' as well. After using TRT, we would need to use CLI to see if we found C'+' or C'-'. If we did find a sign, we would need to advance register 1 by 1 to point to the first digit. If the sign was negative, we would later need to use LCR to fix the sign of the binary value in register 6 before storing it.

If the file might contain more than 100 integers, we could deal with that as well. We could maintain a counter and see if the counter exceeds 100, or we could check register 7 at the bottom of LOOP2 to see if it is equal to A(TABLE+400). Either way, if the table is full, stop both loops by branching to END1.

One other point is that if we have a number in the file which is too large into a 32-bit signed binary integer, CVB will ABEND the program with a fixed-point divide exception. Therefore, we might want to add code to check for this. Specifically, if the actual length of the number (in register 5 before BCTR) is more than 9 bytes, we should probably not proceed with EX and CVB.