*DECK XPAND 
          IDENT  XPAND
          ENTRY  XPAND
 XPAND    TITLE  XPAND - MOVES 8-BIT CHRS TO 12-BIT CHR FIELDS
* 
************************************************************************
*** 
* 
*      FUNCTION 
*         XPAND  MOVES 8 BIT CHRS WORD ALIGNED, 7 CHR. PER WORD, BITS 
*                56-59 ZEROED FROM THE STRING-P FIELD  TO  12 BIT CHRS
*                (4 ZERO BITS INSERTED TO THE LEFT OF EACH CHR) IN
*                STRING-U.
*         FOR CALLING SEQUENCE DESCRIPTION SEE  XPACK 
* 
**    METHODS 
*         1. CALL TDCRACK TO CRACK THE PARAMETERS AND FILL IN THE 
*          NEEDED WORDS IN T8.COM1. 
* 
*         2. RETRIEVE 8 BITS AT A TIME FROM THE PACKED SOURCE FIELD 
*          USING NXBITS, SKIPPING THE FIRST 4 BITS IN EACH WORD. SAVE 
*          THE 8 BITS CHRS IN 12 BIT FIELDS IN X5 AND UPDATED THE T.SRC1
*          (UNPACKED) BCP BY 12 BITS FOR EACH CHR. WHEN THE BCP REACHES 
*          60, STORE X5 IN THE UNPACKED FIELD, REINITIALIZE THE 
*          T.SRC1 BCP TO 0 AND UPDATE THE FIELD POINTER.
* 
*         3. WHEN THE SOURCE PACKED BIT LENGTH SPECIFIED IN T.SRC2
*          IS EXHAUSTED (I.E. X2=0) DO NULL FILL FOR THE UNPACKED 
*          FIELD IF NEEDED. OTHERWISE, LEFT JUSTIFY THE CHRS IN X5, 
*          MAKE A HOLE FOR THESE CHRS IN THE CURRENT WORD OF THE
*          UNPACKED FIELD AND THEN INSERT THE CHRS FROM X5. 
* 
          SPACE  1
* 
*CALL COM1
 TC.XPAND VFD    42/5HXPAND,18/XPAND   TRACEBACK WORD 
 XPAND1   SA1    T.SAVEA0 
          SX6    B0 
          SX7    B0 
          SA0    X1 
 XPAND    DATA   0           ENTRY
          SX6    A0 
          SX7    TC.XPAND 
          SB2    -1          FLAG TO SIGNAL XPAND IS CALLING
*                            TDCRACK
          SA6    T.SAVEA0 
          SB6    BACK1       RETURN FROM TDCRACK
          EQ     TDCRACK
 BACK1    BSS    0
          MX0    0
          SA1    T.SRC1      STRING-U DESCRIPTOR
          SA2    X1          LOAD FIRST WRD IN STRING-U 
          LX1    24 
          AX1    42          RT JUST + ISOLATE BCP IN BITS OF U FIELD 
          SB3    X1          SHFT CNT 
          SB3    X1          SHIFT CNT
          ZR     X1,XPD2     BR IF BCP=0
          SB2    X1-1        MASK RT SHIFT CNT
          MX0    1
          AX0    B2 
 XPD2     BX5    X0*X2       PRESERVE BCP BITS IN FIRST WRD 
          LX5    B3          RT JUST THOSE BITS 
          SA1    T.SRC2      STRING-P DESCRIPTOR
 LOOP1    BSS    0           EVERY 7TH CHR FROM STRING-P IS 12 BITS 
          SB5    7
          MX0    18 
          SX4    4
          LX0    36          BCP MASK 
          BX1    -X0*X1      MAKE HOLE FOR BCP
          LX4    18 
          IX1    X1+X4       FORCE BCP TO 4 BITS
 LOOP2    SB6    BACK2       RETURN FOR NXBITS
          SX2    8           CHR SZ 
          EQ     NXBITS      GET NEXT CHR FROM STRING-P 
 BACK2    ZR     X2,LASTWRD        BR IF NO MORE CHRS TO GET
          LX5    12          MAKE HOLE FOR EXPANDED CHR 
          BX5    X5+X6       INSERT NEW CHR 
          MX0    18 
          SA2    T.SRC1      STRING-U DESCRIPTOR
          LX0    36          BCP MASK 
          BX3    X0*X2       U-BCP
          AX3    18          RT JUST BCP
          SX6    X3+12       UPDATED BCP
          SX4    X6-60
          BX7    -X0*X2      MAKE HOLE FOR NEW BCP
          LX6    18          ALIGN NEW BCP
          ZR     X4,STWRD    BR IF BCP NOW=60 (START NEW WORD)
          IX7    X7+X6       INSERT NEW BCP INTO
          SA7    A2             T.SRC2
 DECIDE   SB5    B5-B1       DECREMENT 7 CHRS CNTR
          NE     B5,B0,LOOP2       BR IF NEXT CHR IS 12 BITS INSTEAD
*                            OF 8 
          EQ     LOOP1       GO GET NEXT PACKED CHR 
 STWRD    BSS    0           STORE AN UNPACKED WORD AND GO ON 
          SA2    T.SRC1      STRING-U DESCRIPTOR
          BX6    X5          CHRS TO BE PUT IN UNPACKED FIELD 
          SX7    X2+B1       UPDATE STRING-U PTR
          SA6    X2          STORE NEXT WORD
          SA7    A2          STORE UPDATED T.SRC2 
          SX5    B0          REINITIALIZE X5
          EQ     DECIDE 
 LASTWRD  SA1    T.EXL1      NUM OF EXCESS BITS IN STRING-U 
          NZ     X1,LOOP3    BR IF NULL FILL REQUIRED 
 DONE2    SA2    T.SRC1      STRING-U DESCRIPTOR
          SX3    X2          PTR TO CURRENT STRING-U WRD
          AX2    18          RT JUST BCP
          SB3    X2          BCP TO B3
          SB2    X2-1        BCP-1(IN BITS) 
          EQ     B3,B0,XPAND1 
          MX2    1
          AX0    X2,B2       MASK, BCP BITS LONG
          SA2    X3          STRING-U WORD
          BX6    -X0*X2      PRESERVE REST OF STRING-U WORD 
          SB4    B3-60
          SB5    -B4         SHFT CNT TO LEFT JUST C(X5)
          LX5    X5,B5       LEFT JUST X5 
          IX7    X6+X5       INSERT NEW CHRS
          SA7    X3          STORE IN STRING-U
          EQ     XPAND1 
 LOOP3    LX5    12          MAKE HOLE FOR NEXT CHR 
          SX1    X1-12       DECREMENT T.EXL2 (U FIELD) BY 1 CHR
          MX0    18 
          SA2    T.SRC1      STRING-U DESCRIPTOR
          LX0    36          BCP MASK 
          BX3    X0*X2       STRING-U CURRENT BCP 
          AX3    18          RT JUST BCP
          SX3    X3+12       UPDATE BCP 
          SX4    X3-60
          BX7    -X0*X2      MAKE HOLE FOR NEW BCP
          ZR     X4,STWRD2   BR IF NEW WORD NECESSARY 
          LX3    18          ALIGN NEW BCP
          IX7    X7+X3       INSERT NEW BCP 
          SA7    A2          STORE UPDATED T.SRC2 
          NZ     X1,LOOP3    BR IF MORE NULL FILL NEEDED
          EQ     DONE2       GO FINISH UP LAST WORD 
 STWRD2   BX7    X5          SINK WORD
          SX6    X2+B1       UPDATED T.SRC1 
          SA7    X2          STORE STRING-U WORD
          SA6    A2          T.SRC1--UPDATED
          SX5    B0          REINITIALIZE X5
          EQ     LOOP3
          END 
