*COMDECK COMCBUN
 BUN      CTEXT  COMCBUN - BURST/BUILD CHARACTERS WITH NO BLANK SQUEEZE.
 BUN      SPACE  4,10 
          IF     -DEF,QUAL$,1 
          QUAL   COMCBUN
          BASE   D
 BUN      SPACE  4,10 
***       BUN - BURST/BUILD CHARACTERS WITH NO BLANK SQUEEZE. 
*         P CLARE  77/01/20 
 BUN      SPACE  4,10 
***       BUN - BURST/BUILD CHARACTERS WITH NO BLANK SQUEEZE. 
* 
* 
*         THIS ROUTINE, VIA A LEFT-TO-RIGHT SCAN, BURSTS CONSECUTIVE
*         CHARACTERS FROM A PACKED (10 CHARACTER PER WORD) SOURCE 
*         LINE, AND BUILDS THEM INTO A SINGLE *GROUP* OF CHARACTERS.
*         UNLIKE *COMCBUB*, *BUN* IGNORES NO CHARACTERS (I.E. BLANKS
*         ARE NOT SQUEEZED).
* 
*         *COMCBUN* IS PRIMARILY INTENDED TO BE USED WITH *COMATOK* 
*         AND *COMCTOK*, THE GENERAL PURPOSE ENTOKENING DISCIPLINE. 
*         *COMCTOK* CALLS *BUN* TO PERFORM EACH 
*         *TOGEL* /GROUP,...,NSQZ/. 
* 
*         IN THE INTEREST OF BREVITY, THE DESCRIPTION OF HOW THIS 
*         ROUTINE WORKS HAS BEEN OMITTED.  IT CAN BE FOUND, HOWEVER,
*         WITH *COMCBUB* AS THESE 2 ROUTINES WORK MUCH IN THE SAME
*         WAY.  I ALSO SUGGEST READING THE FTN 5 IMS FOR THE DECK *LEX*,
*         BECAUSE THAT PRESENTATION TENDS TO BE MORE LEISURELY
*         AND EASIER TO FOLLOW... 
* 
*         IN THE SECTIONS THAT FOLLOW, *ASSEMBLY-TIME DEPENDENCIES* 
*         ARE DEFINED TO BE THE INTERFACES THAT THE *COMCBUN* INSTALLER 
*         MUST PROVIDE.  *ASSEMBLY-TIME OPTIONS* ARE THOSE INTERFACES 
*         WHICH ARE OPTIONAL, I.E. INTERFACES WHICH HAVE DEFAULT
*         CONDITIONS. 
* 
*         ASSEMBLY-TIME DEPENDENCIES -- 
* 
**********************************************************************
* 
*         THE INSTALLER MUST PROVIDE THE FOLLOWING COMDECKS --
*                COMADEF   COMAREG
* 
************************************************************************
* 
*         ASSEMBLY-TIME OPTIONS --
* 
************************************************************************
* 
*         BICH - BIAS CHARACTER.            (DEFAULT =1RM)
* 
*         *BICH* SPECIFIES THE CHARACTER THAT IS TO OCCUPY BIT 59 
*         OF (X1), I.E. THE CHARACTER THAT HAS AN *RCS* VALUE OF 00B. 
* 
************************************************************************
* 
*         *BB.XXXL* AND *BB.XXXP* ARE SYMBOLS THAT DEFINE A *COMADEF* 
*         STRUCTURE THAT DESCRIBES THE FORM OF THE *GROUP*S THAT *BUN*
*         WILL GENERATE.  FOR EXAMPLE, SUPPOSE THE CALLING PROGRAM IS 
*         USING *BUN* TO GENERATE TOKENS FOR INPUT SOURCE LINE
*         CHARACTERS.  THE *BB.* STRUCTURE WOULD DESCRIBE/DEFINE WHAT 
*         HOST TOKENS LOOK LIKE.  SEE *COMADEF* AND *BB.* DEFINITIONS 
*         BELOW.
* 
************************************************************************
 DEFS     SPACE  4,10 
**        MISCELLANEOUS SYMBOL DEFINITIONS. 
  
  
          IF     -DEF,BICH,1
 BICH     =      1RM
  
          IF     -DEF,CHAR,1
 CHAR     =      6           NR OF BITS IN CHARACTER
 BB.      SPACE  4,10 
**        BB. - *BUN* GROUP STRUCTURE.
* 
*         *BB.* SYMBOLS ARE OF THE FORM --
* 
*                BB.XXXL  AND  BB.XXXP
* 
*         WHERE FIELDS *XXX* ARE -- 
* 
*         TOC  = TOKEN CHARACTERS.  *TOC* DESCRIBE/DEFINES THE
*                LOCATION WITHIN PACKING REGISTER (X6) THAT *BUN* 
*                IS TO PLACE *GROUP*ED CHARACTERS.  *BB.TOCL* IS
*                THE LENGTH (IN BITS) OF THIS FIELD, AND *BB.TOCP*
*                IS THE LOWEST (I.E. RIGHT-MOST) BITS POSITION IN THIS
*                FIELD.  DEFAULTS --  BB.TOCL = 60D, AND BB.TOCP = 00B. 
* 
*         TOT  = TOKEN TYPE.  EACH *GROUP* CAN BE ASSIGNED A TOKEN OR 
*                *GROUP* TYPE AT EXECUTION TIME.  SEE (X6) ON ENTRY.
*                THIS FIELD DESCRIBE/DEFINES WHERE *BUN* IS TO PLACE
*                THE TOKEN TYPE IN PACKING REGISTER (X6).  THIS FIELD 
*                IS NORMALLY THE COMPLEMENT TO *TOC*.  THAT IS, 
*                BN.TOCL+BN.TOTL = 60D, I.E. A FULL WORD. 
*                DEFAULTS --  BN.TOTL = 0, AND BN.TOTP = 0. 
  
  
 .BN      IF     -DEF,BN.TOCP 
  
          DESCRIBE BN.
 TOC      DEFINE 60 
 TOT      DEFINE 0
 .BN      ENDIF 
 BUN      SPACE  4,10 
**        BUN - BURST/BUILD WITH NO BLANK SQUEEZE.
* 
* 
*         ENTRY  (B1) = 1 
*                (A5) = ADDR OF 1ST WORD TO BURST/BUILD 
*                (X5) = 1ST WORD TO BURST/BUILD, CONTAINING CHARS 
*                       TO BURST/BUILD IN PACKED (10 CHAR/WORD) FMT.
*                       (X5) IS SHIFTED SO THAT 1ST CHAR TO BU/BU IS
*                       IN BITS 5 THRU 0. 
*                (B6) = NR OF BITS IN (X5) REMAINING TO BU/BU.
*                       IF (B6) .LE. 0, THEN (X5) IS EMPTY.  IN THIS
*                       CASE, THE NEXT SOURCE LINE IMAGE WORD AT
*                       (A5)+1 WILL BE LOADED INTO (X5) BEFORE
*                       PROCEEDING.  IF (B6) = 60D, THEN (X5) IS FULL.
*                (B7) = NR OF SOURCE LINE IMAGE WORDS REMAINING TO BE 
*                       BU/BU.  IF (B7) .LE. 0 UPON ENTRY .AND. (B6)
*                       INDICATES THAT (X5) NOT EMPTY, THEN *BUN* WILL
*                       BU/BU (X5) BEFORE CHECKING (B7).
*                (A6)+1 = ADDR TO STORE 1ST TOKEN GENERATED 
*                (X6) = PACKING REGISTER FOR BUILDING TOKENS. 
* 
*         EXIT   (B1) = 1 
*                (A5,X5),(B6),(B7),(A6),(B3) ADJUSTED IF NECESSARY
* 
*         USES   ALL BUT (A0) 
* 
*         CALLS  NONE 
  
  
 BUN      SUBR               ** ENTRY/EXIT ** 
  
*         INITIALIZATION. 
  
          SA3    60D         (A3) = NR OF BITS IN A WORD (CONSTANT) 
          SB4    BN.TOCP     (B4) = LOWEST BIT POSITION THAT WE CAN 
*                                   SHIFT CHARS INTO (X6) 
          SB7    A3-B7       (B7) = -(BIT COUNT-60) 
          MI     X4,BUN3     IF (X4) DOES NOT CONTAIN A USEABLE CHAR
          SB6    B6+CHAR
          EQ     BUN4 
  
*         BURST/BUILD LOOP  ** INSTACK ** 
  
 BUN2     SB7    B7+60D 
          SA5    A5+1 
          GE     B7,B0,BUN5  IF NO MORE SOURCE WORDS TO BU/BU 
          SB6    10*CHAR
  
 BUN3     LX5    CHAR 
          LE     B6,B0,BUN2  IF SOURCE WORD (X5) IS EXHAUSTED 
          BX4    -X0*X5 
  
 BUN4     SB6    B6-CHAR
          SB2    X4+10000B-BICH 
          LX7    X1,B2
          EQ     B5,B0,BUN6  IF CHARACTER COUNT EXHAUSTED 
          LX3    X4,B3
          PL     X7,BUN6     IF NEXT CHAR TO PACK NOT IN THIS GROUP 
          SB3    B3-CHAR
          SB5    B5-B1
          BX6    X6+X3
          GE     B3,B4,BUN3  IF PACKING REGISTER (X6) NOT FULL
  
*         HERE IF PACKING REGISTER (X6) IS FULL.
  
          MX3    -BN.TOTL 
          SA6    A6+B1
          SB3    BN.TOCP+BN.TOCL-CHAR 
          LX3    BN.TOTP-0
          BX6    -X3*X6      CLEAR *TOC*
          EQ     BUN3        BACK INTO THE FIRE...
  
*         HERE AT FINAL/LAST SOURCE WORD. 
* 
*           1. IF NEED TO BURST/BUILD FINAL SOURCE WORD, THEN GO BACK 
*              AND DO IT. 
* 
*           2. IF HAVE ALREADY BU/BU FINAL SOURCE WORD, THEN DONE...
  
 BUN5     SB6    A3-B7
          GT     B6,B0,BUN3  IF NEED TO BU/BU FINAL SOURCE WORD 
  
*         FINAL PROCESSING...(X6) MIGHT NEED TO BE STORED OUT.
  
 BUN6     SB4    B3-BN.TOCP-BN.TOCL+CHAR
          SB7    A3-B7       RESTORE (B7) TO A CIVIL/HUMAN NUMBER 
          ZR     B4,EXIT.    IF (X6) IS EMPTY, DONE...
          SA6    A6+1 
          EQ     EXIT.
 BUN      SPACE  4,10 
          BASE   *
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 BUN      =      /COMCBUN/BUN 
 QUAL$    ENDIF 
 COMCBUN  ENDX
