*DECK BCONV 
          IDENT  BCONV
          ENTRY  BCONV
          EXT    XTRACE 
          SST 
*#
*1DC  BCONV 
*     1. PROC NAME           AUTHOR              DATE 
*        BCONV               J. C. LEE           76/07/28 
*                            Y. HSIEH            77/06/06 
* 
*     2. FUNCTIONAL DESCRIPTION.
*        THIS ROUTINE IS RESPONSIBLE FOR CHARACTER CONVERSION. IT TAKES 
*        CHARACTER STRINGS IN 8-BIT BYTES ASCII AND CONVERTS IT TO
*        THE CHARACTER TYPE REQUESTED - 12-BIT BYTES ASCII OR 
*       6-BIT BYTES DISPLAY CODE (63 OR 64 CHARACTER TYPE). 
* 
*     3. METHOD USED. 
*        ENTRY AND EXIT PARAMETERS ARE PASSED VIA COMMON FORDEQ 
*        GET CHARACTER STRING FROM DATA RING
*        STORE PROCESSED CHARACTER STRING INTO BUFFER 
* 
*     4. ENTRY PARAMETERS.
*          ACT               CHARACTER TYPE TO CONVERT TO 12 BIT ASCII
*          DRPTR             FWA OF BUFFER BEFORE CONVERSION
*          CHARCNT           NUMBER OF CHARACTERS TO CONVERT
* 
*     5. EXIT PARAMETERS. 
*          BUFFIN            FWA OF BUFFER AFTER CONVERSION 
* 
*     6. COMDECKS CALLED. 
*          MACDEF  INPARU  DEQCOM(FORDEQ) 
* 
*     7. ROUTINES CALLED. 
*          XTRACE            TRACE CALLS
* 
*     7. DAYFILE MESSAGES.  NONE
* 
*#
  
**
*CALL MACDEF
*CALL INPARU
  
*CALL DEQCOM
  
  
**        TABLE FOR CHARACTER CONVERSION
*         DISPLAY CODE FOR CORRESPONDING ASCII VALUE
*         THIS COMMON BLOCK IS ALSO USED BY ISCP AT NIP INIT. TIME
*         TO ADJUST THE TABLE FOR 63 OR 64 CHAR. SET
  
          USE    /COMVERT/
CTABLE    VFD    6/55B,6/55B,6/55B,6/55B,6/55B,6/55B,6/55B,6/55B,12/0 
          VFD    6/55B,6/55B,6/55B,6/55B,6/55B,6/55B,6/55B,6/55B,12/0 
          VFD    6/55B,6/55B,6/55B,6/55B,6/55B,6/55B,6/55B,6/55B,12/0 
          VFD    6/55B,6/55B,6/55B,6/55B,6/55B,6/55B,6/55B,6/55B,12/0 
          VFD    6/55B,6/54D,6/52D,6/48D,6/43D,6/51D,6/55D,6/56D,12/0 
          VFD    6/41D,6/42D,6/39D,6/37D,6/46D,6/38D,6/47D,6/40D,12/0 
          VFD    6/27D,6/28D,6/29D,6/30D,6/31D,6/32D,6/33D,6/34D,12/0 
SET63A    VFD    6/35D,6/36D,6/55B,6/63D,6/58D,6/44D,6/59D,6/57D,12/0 
          VFD    6/60D,6/01D,6/02D,6/03D,6/04D,6/05D,6/06D,6/07D,12/0 
          VFD    6/08D,6/09D,6/10D,6/11D,6/12D,6/13D,6/14D,6/15D,12/0 
          VFD    6/16D,6/17D,6/18D,6/19D,6/20D,6/21D,6/22D,6/23D,12/0 
          VFD    6/24D,6/25D,6/26D,6/49D,6/61D,6/50D,6/62D,6/53D,12/0 
SET63B    VFD    6/60D,6/01D,6/02D,6/03D,6/04D,6/05D,6/06D,6/07D,12/0 
          VFD    6/08D,6/09D,6/10D,6/11D,6/12D,6/13D,6/14D,6/15D,12/0 
          VFD    6/16D,6/17D,6/18D,6/19D,6/20D,6/21D,6/22D,6/23D,12/0 
          VFD    6/24D,6/25D,6/26D,6/49D,6/61D,6/50D,6/62D,6/53D,12/0 
          USE    *
          SPACE  5
**        BCONV -  ENTRY POINT CALLED BY BDELINK
*              TO CONVERT INBOUND DATA FROM 8-BIT ASCII 
*              TO 12-BIT ASCII OR 6-BIT DISPLAY CODE
* 
*         REGISTER USAGE
* 
*              X0 = MASK FOR 8-BIT BYTES (52 OR 53-WITH NO PARITY BIT)
*              X1 = SCRATCH 
*              X2 = INPUT WORD
*              X3 = SCRATCH 
*              X4 = SCRATCH 
*              X5 = SCRATCH 
*              X6 = OUTPUT WORD 
*              X7 = 0 IF 12-BIT ASCII, 54 FOR 6-BIT DISPLAY CODE BYTES
* 
*              B0 = 0 
*              B1 = TOTAL CHARACTER COUNT 
*              B2 = INPUT BUFFER INDEX
*              B3 = OUTPUT BUFFER INDEX 
*              B4 = 64, USED TO CHECK IF HALF CHAR. EXIST AT WORD BOUND.
*              B5 = OUTPUT DATA SHIFT COUNT 
*              B6 = INPUT DATA SHIFT COUNT
*              B7 = SCRATCH 
  
BCONV     DATA   0
          IFEQ   DEBUG,1,6
          SX6    A1 
          SA6    TEMP 
          SX1    XBCONV 
          RJ     XTRACE 
          SA1    TEMP 
          SA1    X1 
  
*             INITIALIZE REGISTERS
  
          SA1    CHARCNT           LOCATION HOLD CHARACTER COUNT
          SB4    12                SHIFT COUNT FOR 12 BIT ASCII CHAR. 
          SB5    48                INIT. OUTPUT DATA SHIFT COUNT
          SA2    DRPTR             FWA OF INPUT BUFFER
          SB1    X1                TOTAL CHARACTER COUNT
          SA3    BUFFIN            FWA OF OUTPUT BUFFER 
          SB2    X2                INPUT BUFFER POINTER 
          SB3    X3                OUTPUT BUFFER POINTER
          SA4    ACT               OUTPUT CHAR TYPE(12-BIT ASCII/DISPLY)
          MX0    52                MASK FOR 8-BIT ASCII CODE
          SB6    8                 INIT. INPUT DATA SHIFT COUNT 
          SX7    X4-CT12ASC        CHECK CHAR-TYPE IS 12-BIT ASCII
          MX6    0                 INIT. OUTPUT WORD TO ZERO
          ZR   X7,BCONVA           SIGNAL 12-BIT ASCII CONVERSION 
          MX0    53                MASK FOR 8 BIT ASCII WITH NO PARITY
          SB4    6                 SHIFT COUNT FOR 6 BIT DISPLAY CHAR.
          MX7    54                MASK FOR 6-BIT DISPLAY CODE
          SB5    B4+B5             INIT. OUTPUT DATA SHIFT COUNT = 54 
  
*             READ IN NEXT WORD FROM INPUT BUFFER AND 
*             HANDLE HALF CHARACTER CASE
  
BCONVA    BSS    0
          BX3    X2                PREVIOUS INPUT WORD
          SB7    B6-64             CHECK FOR HALF CHARACTER CONDITION 
          SA2    B2                READ NEXT WORD FROM INPUT BUFFER 
          SB6    8                 INIT. INPUT DATA SHIFT COUNT 
          SB2    B2+1              INCREMENT INPUT BUFFER INDEX 
          NZ   B7,BCONVB           NO HALF CHARACTER AT WORD BOUNDARY 
          MX5    4                 MASK FOR HALF CHARACTER
          BX1    X5*X2             SECOND HALF OF CHARACTER 
          MX5    56                MASK FOR HALF CHAR. AT LOW BITS
          BX3    -X5*X3            FIRST HALF OF CHARACTER
          BX4    X1+X3
          LX4    4                 CHARACTER AT RIGHTMOST POSITION
          SB6    4                 INIT. INPUT DATA SHIFT COUNT 
          EQ   BCONVC              GO PROCESS CHAR. AT WORD BOUNDARY
  
*             CHECK END-OF-DATA.  IF NOT, PROCESS NEXT CHARACTER
  
BCONVB    BSS    0
          ZR   B1,BCONVE           ALL DONE 
          SB7    B6-64             CHECK FOR WORD BOUNDARY
          PL   B7,BCONVA           HIT WORD BOUNDARY, GO READ NEXT WORD 
          LX3    X2,B6             SHIFT CHAR. TO RIGHTMOST POSITION
          BX4    -X0*X3 
  
BCONVC    BSS    0
          ZR   X7,BCONVD           TYPE IS 12-BIT ASCII 
  
*             CONVERT 8-BIT ASCII TO 6-BIT DISPLAY CODE 
  
          BX3    -X0*X4            THE CURRENT CHARACTER
          AX3    3                 X = CHAR. / 8
          BX1    X3                INDEX TO CONVERSION TABLE
          LX3    3                 Y = X * 8
          IX5    X4-X3             Z = CHAR - Y (REMAINDER OF CHAR/8) 
          IX3    X5+X5             Z * 2
          LX5    2                 Z * 4
          IX4    X3+X5             Z*6 = SHIFT COUNT TO SHIFT CORRESP.
          SB7    X4+6              DISPLAY CODE TO RIGHTMOST POSITION 
          SA5    X1+CTABLE         INDEX TO CONVERSION TABLE
          LX3    X5,B7             DISPLAY CODE TO RIGHTMOST POSITION 
          BX4    -X7*X3 
  
*             APPEND NEW CHARACTER TO OUTPUT WORD AND UPDATE POINTERS 
  
BCONVD    BSS    0
          LX4    X4,B5             SHIFT NEW CHAR TO PROPER POSITION
          BX6    X4+X6             FOR OUTPUT WORD
          SB1    B1-1              DECREMENT TOTAL CHAR COUNT 
          SB5    B5-B4             OUTPUT CHAR POINTER
          SB6    B6+8              INPUT CHAR POINTER 
          PL   B5,BCONVB           OUTPUT WORD NOT FILLED YET 
  
*             WRITE CONVERTED WORD TO OUTPUT BUFFER 
  
BCONVE    BSS    0
          SA6    B3 
          MX6    0                 INIT. OUTPUT WORD TO ZERO
          ZR   B1,BCONV            ALL DONE 
          SB7    60 
          SB5    B7-B4             INIT. OUTPUT DATA SHIFT COUNT
          SB3    B3+1              INCREMENT OUTPUT BUFFER INDEX
          EQ   BCONVB              CONTINUE TO CONVERT NEXT CHARACTER 
  
 XBCONV   DATA   L*BCONV* 
 TEMP     BSS    1
          END 
