*DECK ALPHAED 
          IDENT  ALPHAED
          COMMENT  ALPHA EDITING
ALPHAED   TITLE    ALPHAED - EDIT ALPHA ITEMS 
* ACCOMPLISH ALPHA EDITING, IE ACCOMMODATE PICTURES SUCH AS XXBBXX, 
* XX000X, AABAA, AA000A. ADAPTED FROM COBOL COMPILER ROUTINE DDEDAL.
* CALLS CMOVE FOR CHARACTER MOVES.
* HANDLES ALPHA EDITING WITHOUT REGARD TO SIZE. 
* 
*         INPUT REQUIREMENTS
*                CCONVERT COMMON AREA MUST BE INITIALIZED AS FOLLOWS
*                  SOURCEW CONTAINS ADDRESS OF SOURCE 
*                  SOURCEB CONTAINS BYTE OFFSET OF SOURCE 
*                  SOURCEL CONTAINS LESSER LENGTH, SINK OR SOURCE 
*                  SOURCEA CONTAINS ADDRESS OF ITEM"S ATTRIBUTES TABLE
*                  SINKBYT CONTAINS BYTE OFFSET OF SINK 
*                  SINKWOR CONTAINS ADDRESS OF SINK 
*                  MURALAD CONTAINS ADDRESS OF EDIT MURAL 
* 
*         OUTPUT IS UNDETERMINED IF THE MURAL CONTAINS NUMERIC EDITING
*         CHARACTERS, OR IS AN INVALID MURAL, AND THE DIAGNOSTIC NUMBER 
*         289 IS RETURNED IN WORD *RETURNC* OF /CCONVER/. 
* 
*         CALLING SEQUENCE FOR CMOVE (SYMPL PARAMETER LIST) 
*                A1  LOCATION OF PARAMETER LIST CONTAINING, IN ORDER, 
*                  1 LOCATION OF SOURCE BASE
*                 2 SOURCE BYTE OFFSET
*                  3 LENGTH OF MOVE IN CHARACTERS 
*                  4 LOCATION OF SINK BASE
*                  5 SINK BYTE OFFSET 
* 
*         REGISTERS PRESERVED 
*                NONE 
* 
          ENTRY  ALPHAED
          EXT    CMOVE
* 
* 
 ALPHAED  DATA   0
          SA2    MURALAD     FETCH ADDRESS OF MURAL 
          SA3    SINKWOR     LOAD ADDRESS OF SINK INTO X3 
          ZR     X2,SICK     IF NO MURAL PROVIDED, RETURN ERROR CODE
          SA1    X2          FETCH 1ST WORD OF MURAL
          BX6    X1 
          SX7    X3 
          LX6    4           SHIFT MURAL INDICATOR BITS 
          SA7    MPLIST+3    STORE SINK ADDRESS INTO CMOVE PARAM LIST 
          SA6    MURAL       SAVE 1ST WORD OF MURAL 
* 
*                  THE NEXT MURAL CODE IS INTERPRETED.
* 
 NEXTCODE SA1    MURAL       LOAD MURAL INTO X1 
          SB1    1           SET INCREMENT VALUE
          MX0    56          FORM MASK FOR MURAL CODE 
          SB4    B1          INITIALIZE REPEAT BIT COUNTER
          LX1    5           CUE BIT AND MURAL CODE RIGHT-JUSTIFIED 
          BX5    -X0*X1      MASK MURAL CODE
 CKREPEAT SB5    X5          MOVE MURAL CODE TO B5
          PL     X1,INTERP   JUMP IF NO REPEAT BIT
 REPBIT   LX1    1           LOOK AT NEXT BIT 
          SB4    B4+B1       BUMP REPEAT BIT COUNTER
          NG     X1,REPBIT   JUMP IF ANOTHER REPEAT BIT ELSE
*                            NEXT BIT IS A CUE BIT
 INTERP   BX6    X1          MOVE SHIFTED MURAL TO X6 
          EQ     B5,B0,ALPHAED RETURN IF END OF MURAL 
          SB6    B5-14B 
          SA6    MURAL       SAVE MURAL 
          EQ     B5,B1,MOVE  JUMP IF CODE IS 9,X, OR A
          ZR     B6,BLANKED  JUMP IF BLANK EDIT 
          SX6    ZEROS       FWA OF DISPLAY CODED ZEROS 
          EQ     B6,B1,BORZMOVE  IF MURAL CODE FOR 0 INSERTION
          SB6    B5-16B 
          SX6    COMMAS      FWA OF DISPLAY CODED COMMAS
          EQ     B6,BORZMOVE IF MURAL CODE FOR , INSERTION
          SX6    SLASHS      FWA OF DISPLAY CODED SLASHES 
          EQ     B6,B1,BORZMOVE  IF MURAL CODE FOR / INSERTION
          SB7    B5-4 
          NZ     B7,SICK     JUMP IF CODE IS NOT END OF MURAL WORD (IE
*                            IF CODE IS ILLEGAL FOR ALPHANUMIC EDITING.)
          SA3    MURALAD     LOAD POINTER TO CURRENT MURAL WORD INTO X3 
          SA1    X3+B1       LOAD NEXT MURAL WORD IN X1 
          SX7    A1          MOVE PTR TO CURRENT MURAL WORD TO X7 
          LX1    5           SHIFT MURAL WORD 
          SA7    A3          STORE PTR TO CURRENT MURAL WORD
          BX5    -X0*X1      MASK MURAL CODE
          SB4    B1          RESET REPEAT BIT COUNTER (FOR CASE WHEN
*                            HARD EDITING CASE CROSSES WORD BOUNDARY, 
*                            THE INDICATOR BITS WOULD HAVE BEEN FALSELY 
*                            TREATED AS REPEAT BITS)
          EQ     CKREPEAT    GO CHECK FOR FOLLOWING REPEAT BITS 
* 
 MOVE     BSS    0           PROCESS 9,X OR A CHARS 
          SX6    B4          MOVE REPEAT COUNT TO X6
          SA1    SOURCEL     LOAD SOURCE LENGTH INTO X1 
          NG     X1,BLANKED  JUMP IF SOURCE LENGTH LESS THAN OR 
          ZR     X1,BLANKED  EQUAL TO ZERO (HAVE TO FILL WITH BLANKS) 
          SA6    MSIZE       STORE LENGTH OF MOVE 
          SA3    SOURCEW     LOAD SOURCE ADDRESS INTO X3
          IX7    X1-X6       DECREMENT SOURCE LENGTH BY MOVE SIZE 
          BX6    X3 
          SA7    A1          STORE REMAINING SOURCE LENGTH
          BX0    X7 
          SA6    MPLIST      STORE SOURCE ADDRESS INTO CMOVE PARAM LIST.
          SX7    SOURCEB     LOAD ADDRESS OF SOURCE BYTE OFFSET IN TO X7
          SA1    A6          PASS PARAMETER LIST TO CMOVE.
          SA7    A6+B1       STORE ADDRESS OF BYTE OFFSET IN PARAM LIST 
          NG     X0,RTFILL   HAVE TO PAD SINK WITH BLANKS.
          RJ     CMOVE       CALL CMOVE 
          SB7    NEXTCODE    RETURN LOCATION
          EQ     SINKSRCE    CALCULATE NEW SINK AND SOURCE POINTERS 
 RTFILL   BSS    0           PARTIAL RIGHT FILL WITH BLANKS NECESSARY 
          RJ     CMOVE       CALL CMOVE 
          SB7    BLNKFILL    RETURN LOCATION
          EQ     SINKSRCE    CALCULATE NEW SINK AND SOURCE POINTERS 
 BLNKFILL SA1    SOURCEL     GET COMPLEMENT OF NR BLANKS NEEDED FOR FILL
          BX5    -X1
          SB4    X5          BLANK FILL COUNTER 
 BLANKED  BSS    0           BLANK FILL ENTRY 
          SX6    BLANKS      LOAD ADDRESS OF BLANKS IN X6 
 BORZMOVE SA6    MPLIST      STORE ADDR OF BLANKS OR ZEROS IN PARAM LIST
          SB5    B4-50       DECREMENT COUNTER
          SX6    BINZERO     LOAD ADDRESS OF ZERO FOR SOJRCE BYTE OFFSET
          SX7    B5          MOVE NEW COUNT TO X7 
          SA6    MPLIST+1    STORE 0 BYTE OFFSET INTO CMOVE PARAM LIST. 
          LT     B5,B1,LASTBLKS JUMP IF LT 51 BLANKS TO FILL
          SA7    LONG        SAVE DECREMENTED COUNT 
 LONGBLKS SX6    50          LOAD MOVE LENGTH INTO X6 
          SA1    MPLIST      PASS PARAMETER LIST TO CMOVE 
          SA6    MSIZE       STORE MOVE LENGTH
          RJ     CMOVE       CALL CMOVE 
          SB7    MOREBLKS    RETURN LOCATION
          EQ     SINKONLY    CALCULATE NEW SINK POINTERS
 MOREBLKS SA2    LONG        LOAD COUNTER 
          SB5    X2-50       DECREMENT COUNTER
          SX7    B5          MOVE NEW COUNT TO X7 
          LT     B0,B5,LONGBLKS JUMP IF 51 OR MORE BLANKS LEFT TO MOVE
 LASTBLKS SX7    X7+50       GET NUMBER OF BLANKS LEFT TO MOVE
          SA1    MPLIST      PASS PARAMETER LIST TO CMOVE 
          SA7    MSIZE       STORE MOVE LENGTH
          RJ     CMOVE       CALL CMOVE 
          SB7    NEXTCODE    RETURN LOCATION
          EQ     SINKONLY    CALCULATE NEW SINK POINTERS
* 
 SICK     BSS    0           BAD MURAL
          SX7    289         DIAG NUMBER FOR BAD MURAL
          SA7    RETURNC     RETURNCODE WORD OF CCONVERT COMMON AREA
          EQ     ALPHAED     RETURN 
* 
 SINKONLY BSS    0           CALCULATE NEW SINK POINTERS ONLY 
          SB7    -B7         SET FLAG FOR SINK ONLY 
 SINKSRCE BSS    0           CALCULATE NEW SINK AND SOURCE POINTERS 
          SA1    SINKBYT     LOAD SINK BYTE OFFSET INTO X1
          SA2    MSIZE       LOAD NUMBER OF CHARACTERS MOVED
          SA3    TNTH        LOAD .1 24 BIT FRACTION PART 
          SA5    MPLIST+3    LOAD SINK ADDRESS INTO X5. 
          IX1    X1+X2       FIND NEW SINK BYTE OFFSET
          SB3    X5          MOVE SINK ADDRESS TO B3
          PX7    B0,X1       FLOAT OFFSET (UNNORMALIZED)
          MX0    36          FORM 36 BIT MASK 
          DX6    X3*X7       OFFSET * .1
          SB5    3           SHIFT COUNT
          BX1    -X0*X6      FRAC PART
          LX4    B5,X1       FRAC PART * 8
          BX7    X0*X6       INTEGER PART 
          IX4    X1+X4       FRAC PART * 9
          AX7    24          WORD OFFSET
          IX6    X1+X4       FRAC PART * 10 
          SX7    B3+X7       NEW SINK ADDRESS IN X7 
          AX6    24          SINK OFFSET MOD 10 
          SA7    A5          SAVE NEW SINK BASE 
          SA6    A1          SAVE NEW SINK BYTE OFFSET
          GT     B7,B0,BOTH  JUMP IF CALCULATING BOTH SINK AND SOURCE 
          SB7    -B7         RESET RETURN LOCATION
          JP     B7          RETURN 
 BOTH     BSS    0           CALCULATE NEW SOURCE POINTERS
          SA1    SOURCEB     LOAD SOURCE BYTE OFFSET INTO X1
          SA5    SOURCEW     LOAD SOURCE ADDRESS INTO X5
          IX1    X1+X2       FIND NEW SOURCE BYTE OFFSET (ADD MOVE SIZE)
          SB3    X5          MOVE SOURCE ADDRESS TO B3
          PX7    B0,X1       FLOAT OFFSET 
          DX6    X7*X3       OFFSET * .1
          BX1    -X0*X6      FRAC PART
          LX4    B5,X1       FRAC PART * 8
          BX7    X0*X6       INTEGER PART 
          IX4    X1+X4       FRAC PART * 9
          AX7    24          WORD OFFSET
          IX6    X1+X4       FRAC PART * 10 
          SX7    B3+X7       NEW SOURCE BASE IN X7
          AX6    24          SOURCE OFFSET MOD 10 
          SA7    A5          SAVE NEW SOURCE BASE 
          SA6    A1          SAVE NEW SOURCE BYTE OFFSET
          JP     B7          RETURN 
* 
 MSOURCE  DATA   0                     SOURCE ADDRESS FOR CMOVE 
 MOFFSRCE DATA   0                     SOURCE BYTE OFFSET FOR CMOVE 
 MSIZE    DATA   0                     SIZE OF MOVE IN CHARACTERS 
 MURAL    DATA   0                     CURRENT (IE POSITIONED) MURAL
 LONG     DATA   0                     TEMP STORAGE FOR NEXT MOVE SIZE
TNTH      DATA   20000000000006314632B .1 (24 BIT FRACTION) 
 BINZERO  DATA   0
 MPLIST   DATA   0           PARAMETER LIST FOR CALLS TO CMOVE. 
          DATA   0
          VFD    42/0,18/MSIZE
          DATA   0
          CON    SINKBYT
 BLANKS   DATA   50H
 ZEROS    DATA   10H0000000000
          DATA   10H0000000000
          DATA   10H0000000000
          DATA   10H0000000000
          DATA   10H0000000000
 COMMAS   DATA   50H,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
 SLASHS   DATA   50H//////////////////////////////////////////////////
          USE    /CCONVER/
 REQUEST  BSS    1
 SOURCEB  BSS    1
 SOURCEW  BSS    1
 SOURCEL  BSS    1
 SOURCEA  BSS    1
 SINKBYT  BSS    1
 SINKWOR  BSS    1
 SINKLEN  BSS    1
 SINKATT  BSS    1
 MURALAD  BSS    1
 EDITING  BSS    1
 RETURNC  BSS    1
          END 
