*DECK BUG202P 
          PROC  BUG202PRINT;
  
#**       BUG202PRINT -  PRINT A CGEN COMMAND FOR DEBUG 
* 
*         CALLED IN CGEN WHEN BUG202C$ANYF[0] IS TRUE.
* 
*         COMMON BLOCK /BUG202C/ CONTAINS DEBUG CONTROL FLAGS 
*         AND INFORMATION ABOUT THE LAST EXECUTED COMMAND.
* 
*         THE DEBUG CONTROL FLAG ASSOCIATED WITH THE LAST EXECUTED
*         COMMAND IS CHECKED. 
*         IF ON,  DEBUG INFOMATION IS PRINTED.
*         INFORMATION IN /BUG202C/ ABOUT THE LAST COMMAND IS RESET
*         FOR THE NEXT COMMAND. 
# 
  
          BEGIN 
          $BEGIN
  
  
*CALL M$
  
*CALL W$
  
          SWITCH  BUG202AL
*CALL BUG202AS
  
*CALL BUG202C 
  
*CALL INT$
  
*CALL LISTCTL 
  
*CALL INSTDEFS
  
*CALL OTXT$ 
  
*CALL RAPLUSC 
  
          XREF
              BEGIN 
              PROC  CBLIST;            # PROCESS COBOL LIST FILE       #
              FUNC  DEC        C(10);  # DECIMAL DISPLAY VALUE         #
              PROC  EVALADDRESS;       # EVALUATE ADDRESS FROM COMMAND #
              PROC  GETBITS;           # GET BITS FROM COMMAND STRING  #
              FUNC  OCT        C(20);  # OCTAL DISPLAY VALUE           #
              END 
  
  
          COMMON  BUG202T;
              BEGIN 
              BASED ARRAY BUG202TACTS [0:0] S(1); 
                  BEGIN 
                  ITEM  BUG202T$ACTS U(0, 0,60);
                  END 
              BASED ARRAY BUG202TCMND [0:0] S(1); 
                  BEGIN 
                  ITEM  BUG202T$CMND C(0, 0, 8);
                  END 
              BASED ARRAY BUG202TFIX [0:0] S(1);
                  BEGIN 
                  ITEM  BUG202T$FIXL U(0, 0, 6);
                  ITEM  BUG202T$FIX  C(0, 6, 9);
                  END 
              BASED ARRAY BUG202TFUN [0:0] S(1);
                  BEGIN 
                  ITEM  BUG202T$FUNL U(0, 0, 6);
                  ITEM  BUG202T$FUN  C(0, 6, 9);
                  END 
              BASED ARRAY BUG202TINS [0:0] S(1);
                  BEGIN 
                  ITEM  BUG202T$INSL U(0, 0, 6);
                  ITEM  BUG202T$INS  C(0, 6, 9);
                  END 
              BASED ARRAY BUG202TMOD [0:0] S(1);
                  BEGIN 
                  ITEM  BUG202T$MODL U(0, 0, 6);
                  ITEM  BUG202T$MOD  C(0, 6, 9);
                  END 
              BASED ARRAY BUG202TTBL [0:0] S(1);
                  BEGIN 
                  ITEM  BUG202T$TBLL U(0, 0, 6);
                  ITEM  BUG202T$TBL  C(0, 6, 9);
                  END 
              END  # BUG202T #
  
          ITEM  ACT          I;        # PRINT ACTION                  #
          ITEM  ACTPOS       I;        # POSITION OF NEXT ACT          #
          ITEM  COL          I;        # NEXT AVAILABLE COLUMN IN LINE #
          ITEM  EGONAME      C(7) = " ";         # LAST PRINTED NAME   #
          ITEM  I            I;        # SCRATCH INDEX                 #
          ITEM  ILIM         I;        # LIMIT FOR I                   #
          ITEM  OPCODE       I;        # INDEX TO COMMAND TABLE        #
          ITEM  J            I;        # SCRATCH                       #
          ITEM  LINE         C(160);   # LINE FOR PRINTING (+ OVERFLOW)#
          ITEM  N            I; 
          ITEM  VFUN         I; 
CONTROL EJECT;
  
          OPCODE = BUG202C$OP;
          IF BUG202T$CMND[OPCODE] EQ "SUBCOM  "  THEN 
              OPCODE = M$C + BUG202C$SOP; 
  
          I = B<0,6>BUG202T$ACTS[OPCODE]; 
          IF B<I,1>BUG202C$WORD[0] EQ 0  THEN 
#***GOTO#     GOTO RESET; 
  
          LINE = "MODNAME+7777B/99        +***B"; 
          C<0,7>LINE = C<0,7>RAPLUS[INT$MODADR];
          C<8,4>LINE = OCT(BUG202C$ADDR-INT$MODADR, 16, 4); 
          C<127,5>LINE = DEC(BUG202C$LINE); 
          C<14,2>LINE = DEC(BUG202C$POS); 
  
          IF BUG202C$EGNM NQ EGONAME  THEN
              BEGIN 
              C<17,7>LINE = BUG202C$EGNM; 
              EGONAME = BUG202C$EGNM; 
              END 
  
          I = BUG202C$ADDR - BUG202C$EGAD;
  
          IF I GQ 0 
           AND I LQ O"777"  THEN
              C<25,3>LINE = OCT(I, 17, 3);
  
          C<31,8>LINE = BUG202T$CMND[OPCODE]; 
  
#      PERFORM THE PRINT ACTIONS INDICATED BY THIS COMMAND             #
  
          ACTPOS = 6;                            # SKIP FLAG NUMBER    #
          COL = 39;                    # START INSERTING IN COLUMN 39  #
          ACT = B<6,4>BUG202T$ACTS[OPCODE];      # GET FIRST ACTION    #
  
          FOR J=J  WHILE ACT NQ 0  DO 
              BEGIN 
              GOTO BUG202AL[ACT];                # GO PERFORM ACTION   #
DONEACT:                                         #   RETURN TO HERE    #
              ACTPOS = ACTPOS + 4;               # GET NEXT ACT        #
              ACT = B<ACTPOS,4>BUG202T$ACTS[OPCODE];
              END 
  
          C<39,1>LINE = " ";
          CBLIST(LISTCTL"LINE", LINE, 132); 
  
  
#      RESET /BUG202C/ FOR THE NEXT COMMAND                            #
  
RESET:  
          FOR I = 1 STEP 1 UNTIL BUG202C$PTR  DO
              BEGIN 
              BUG202C$ARG[I] = O"77777777777777777777"; 
              BUG202C$FUN[I] = O"77777777777777777777"; 
              BUG202C$TABL[I] = O"77777777777777777777";
              BUG202C$VARG[I] = O"77777777777777777777";
              BUG202C$VFIX[I] = O"77777777777777777777";
              BUG202C$VFUN[I] = O"77777777777777777777";
              END 
          BUG202C$PTR = 0;
  
  
#      PRINT OTEXT FOR LAST COMMAND IF DESIRED                         #
  
          IF BUG202C$DMPO[0]
           AND OTXT$PTR NQ BUG202C$OTXT  THEN 
              BEGIN 
              LINE = "    OTEXT WORD 999 IS"; 
              FOR I = BUG202C$OTXT STEP 1 UNTIL OTXT$PTR-1  DO
                  BEGIN 
                  C<15,4>LINE = DEC(I); 
                  C<23,20>LINE = OCT(OTXT$WORD[I], 0, 20);
                  CBLIST(LISTCTL"LINE", LINE, 50);
                  END 
              BUG202C$OTXT = OTXT$PTR;
              END 
  
          RETURN; 
CONTROL EJECT;
  
          FUNC  LDEC(X)  I; 
          BEGIN 
          ITEM  X            I; 
          ITEM  I            I; 
          ITEM  T            C(10); 
          T = DEC(X); 
          I = 9;
          FOR J=J  WHILE C<I,1>T EQ " "  DO 
              I = I - 1;
  
          LDEC = I + 1; 
          END  #LDEC# 
CONTROL EJECT;
  
ADDR: 
          ADDRESS;
#***GOTO# GOTO DONEACT; 
  
  
DEPTH:  
          IF COL EQ 39  THEN
              COL = 40; 
          C<COL,12>LINE = " AT DEPTH   "; 
          C<COL+10,2>LINE = DEC(BUG202C$SPTR);
          COL = COL + 12; 
#***GOTO# GOTO DONEACT; 
  
  
EGO:  
          IF BUG202C$VFUN[1] GR BUG202C$EGON  THEN       # IF NO TRACE #
#***GOTO#     GOTO RESET; 
          C<40,10>LINE = DEC(BUG202C$VFUN[1]);
#***GOTO# GOTO DONEACT; 
  
  
FUNC1:  
          C<COL,1>LINE = ","; 
          COL = COL + 1;
          N = 1;
          FUNCT;
#***GOTO# GOTO DONEACT; 
  
  
FUNC2:  
          C<COL,1>LINE = ","; 
          COL = COL + 1;
          N = 2;
          FUNCT;
#***GOTO# GOTO DONEACT; 
  
  
FUNC3:  
          C<COL,1>LINE = ","; 
          COL = COL + 1;
          N = 3;
          FUNCT;
#***GOTO# GOTO DONEACT; 
  
  
FUNC4:  
          C<COL,1>LINE = ","; 
          COL = COL + 1;
          N = 4;
          FUNCT;
#***GOTO# GOTO DONEACT; 
  
  
FUNC5:  
          C<COL,1>LINE = ","; 
          COL = COL + 1;
          N = 5;
          FUNCT;
#***GOTO# GOTO DONEACT; 
  
  
FUNC6:  
          C<COL,1>LINE = ","; 
          COL = COL + 1;
          N = 6;
          FUNCT;
#***GOTO# GOTO DONEACT; 
  
  
FUNC7:  
          C<COL,1>LINE = ","; 
          COL = COL + 1;
          N = 7;
          FUNCT;
#***GOTO# GOTO DONEACT; 
  
  
FUNC8:  
          C<COL,1>LINE = ","; 
          COL = COL + 1;
          N = 8;
          FUNCT;
#***GOTO# GOTO DONEACT; 
  
  
GENVFD: 
          N = 1;
          VFUN = BUG202C$VFUN[1]; 
GENVFD$1: 
          C<40,10>LINE = DEC(VFUN); 
          COL = 40 + LDEC(VFUN) + 1;
          C<COL-1,1>LINE = "/"; 
          N = N + 1;
          VFUN = BUG202C$VFUN[N]; 
          VALUE;
          N = N + 1;
          VFUN = BUG202C$VFUN[N]; 
  
          IF B<30,30>VFUN NQ O"7777777777"  THEN
              BEGIN 
              CBLIST(LISTCTL"LINE", LINE, 132); 
              LINE = " "; 
#***GOTO#     GOTO GENVFD$1;
              END 
  
#***GOTO# GOTO DONEACT; 
  
  
INSTR:  
          VFUN = BUG202C$VFUN[1]; 
          C<40,9>LINE = BUG202T$INS[VFUN];
          COL = 40 + BUG202T$INSL[VFUN];
#***GOTO# GOTO DONEACT; 
  
  
NOTE: 
          C<40,10>LINE = C<0,10>BUG202C$VFUN[1];
          C<50,10>LINE = C<0,10>BUG202C$VFUN[2];
          C<60,10>LINE = C<0,10>BUG202C$VFUN[3];
#***GOTO# GOTO DONEACT; 
  
  
POP:  
          FOR N = BUG202C$PTR STEP -1 UNTIL 1  DO 
              BEGIN 
              C<COL,1>LINE = ","; 
              COL = COL + 1;
              FUNCT;
              END 
#***GOTO# GOTO DONEACT; 
  
  
PUSH: 
          FOR N = 1 STEP 1 UNTIL BUG202C$PTR  DO
              BEGIN 
              C<COL,1>LINE = ","; 
              COL = COL + 1;
              FUNCT;
              END 
#***GOTO# GOTO DONEACT; 
CONTROL EJECT;
          PROC  ADDRESS;
  
#**       ADDRESS -  APPEND A MNEMONIC ADDRESS
* 
*         BUG202C$JUMP IS THE ADDRESS 
* 
*         E.G.  MODNAME+0123B=EGONAME+003B
# 
  
          BEGIN 
          ITEM  EGAD         I;        # LATEST EGO ADDRESS            #
          ITEM  EGNM         C(10);    # LATEST EGO NAME               #
          ITEM  MODADR       I;        # LATEST MODULE ADDRESS         #
  
  
          IF COL GR 115  THEN 
              BEGIN 
              C<39,1>LINE = " ";
              CBLIST(LISTCTL"LINE", LINE, 132); 
              LINE = " "; 
              COL = 40; 
              END 
  
          IF BUG202C$JUMP EQ 0  THEN
              BEGIN 
              C<COL,7>LINE = ",RETURN"; 
              COL = COL + 7;
#RETURN#      RETURN; 
              END 
  
          MODADR = INT$MODADR;
          EGAD = BUG202C$EGAD;
          EGNM = BUG202C$EGNM;
  
          I = B<0,W$C>RAPLUS[BUG202C$JUMP]; 
          J = B<W$C,W$SUBCOM>RAPLUS[BUG202C$JUMP];
  
          IF BUG202T$CMND[I] EQ "SUBCOM  "
           AND BUG202T$CMND[W$C+J] EQ "EGO     "  THEN
              BEGIN 
              I = B<W$C+W$SUBCOM+4,4>RAPLUS[BUG202C$JUMP];
              B<0,60-W$C-W$SUBCOM-4-4>J = 
               B<W$C+W$SUBCOM+4+4,60-W$C-W$SUBCOM-4-4>
                                                   RAPLUS[BUG202C$JUMP];
          B<60-W$C-W$SUBCOM-4-4,W$C+W$SUBCOM+4+4>J =
           B<0,W$C+W$SUBCOM+4+4>RAPLUS[BUG202C$JUMP+1]; 
              EGNM = "          ";
              C<0,I>EGNM = C<10-I,I>J;
          EGAD = BUG202C$JUMP;
          IF I LQ 7  THEN 
              MODADR = B<0,18>RAPLUS[BUG202C$JUMP+1]; 
          ELSE
              MODADR = B<6,18>RAPLUS[BUG202C$JUMP+1]; 
              END 
  
          C<COL,1>LINE = ","; 
          COL = COL + 1;
  
          I = BUG202C$JUMP - MODADR;
  
          IF I GQ 0 
           AND I LQ O"7777"  THEN 
              BEGIN 
              C<COL,7>LINE = C<0,7>RAPLUS[MODADR];
              C<COL+7,6>LINE = "+****B";
              C<COL+8,4>LINE = OCT(I, 16, 4); 
              COL = COL + 13; 
  
              I = BUG202C$JUMP - EGAD;
              IF I GQ 0 
               AND I LQ O"777"  THEN
                  BEGIN 
                  C<COL,1>LINE = "="; 
                  C<COL+1,7>LINE = C<0,7>EGNM;
                  C<COL+8,5>LINE = "+***B"; 
                  C<COL+9,3>LINE = OCT(I, 17, 3); 
                  COL = COL + 13; 
                  END 
              END 
          ELSE
              BEGIN 
              C<COL,6>LINE = OCT(BUG202C$JUMP, 14, 6);
              C<COL+6,1>LINE = "B"; 
              COL = COL + 7;
              END 
  
          END 
CONTROL EJECT;
          PROC  FUNCT;
  
#**       FUNC -  APPEND MNEMONIC FUNCTION TO LINE
* 
*         N = INDEX TO FUNCTION VALUES
*         COL = INDEX TO NEXT AVAILABLE CHARACTER IN *LINE* 
* 
*         E.G.  (BCPOF,59/REGX=3)=11B=9 
*               T1=410023B
*               144B=100
*               -33B=27 
*               (FWA$OF,DNAT$,0023B)+30B=24 
# 
  
          BEGIN 
          ITEM  ARG          I; 
          ITEM  CTEMP        C(9);     # SCRATCH                       #
          ITEM  FUN          I; 
          ITEM  NULLVALUE    I = O"77777777777777777777"; 
          ITEM  VARG         I; 
          ITEM  LEN          I; 
  
          IF COL GR 115  THEN 
              BEGIN 
              C<39,1>LINE = " ";
              CBLIST(LISTCTL"LINE", LINE, 132); 
              LINE = " "; 
              COL = 40; 
              END 
          ARG = BUG202C$ARG[N]; 
          VARG = BUG202C$VARG[N]; 
          FUN = BUG202C$FUN[N]; 
          VFUN = BUG202C$VFUN[N]; 
  
          IF B<30,30>FUN EQ O"7777777777"  THEN 
              GOTO FUNC$FIXED;
          CTEMP = BUG202T$FUN[FUN];              # NAME OF FUNCTION    #
          IF CTEMP EQ "EQUALS   "  THEN 
              GOTO FUNC$EQUALS; 
          IF CTEMP EQ "SETSYOF  "  THEN 
              GOTO FUNC$SETSYOF;
          IF CTEMP EQ "CONSTOF  "  THEN 
              GOTO FUNC$CONSTOF;
  
#      NORMAL FUNCTION REFERENCE                                       #
  
          C<COL,1>LINE = "("; 
          C<COL+1,9>LINE = BUG202T$FUN[FUN];
          COL = COL + 1 + BUG202T$FUNL[FUN];
          C<COL,1>LINE = ","; 
          C<COL+1,10>LINE = DEC(ARG); 
          COL = COL + 1 + LDEC(ARG);
  
          IF B<30,30>VARG NQ O"7777777777"  THEN
              BEGIN 
              C<COL,1>LINE = "/"; 
              C<COL+1,9>LINE = BUG202T$FIX[ARG];
              COL = COL + 1 + BUG202T$FIXL[ARG];
              I = B<30,30>BUG202C$VFIX[N];
              IF I NQ O"7777777777"  THEN 
                  BEGIN 
                  C<COL,1>LINE = "="; 
                  C<COL+1,10>LINE = DEC(I); 
                  COL = COL + 1 + LDEC(I);
                  END 
              C<COL,1>LINE = "="; 
              C<COL+1,10>LINE = DEC(VARG);
              COL = COL + 1 + LDEC(VARG); 
              END 
  
          C<COL,1>LINE = ")"; 
          COL = COL + 1;
  
          IF B<30,30>VFUN NQ O"7777777777"
           OR B<0,30>VFUN NQ O"7777777777"  THEN
              BEGIN 
              C<COL,1>LINE = "="; 
              COL = COL + 1;
              VALUE;
              END 
  
          RETURN; 
  
  
#      FIXED CELL REFERENCE                                            #
  
FUNC$FIXED: 
          C<COL,9>LINE = BUG202T$FIX[ARG];
          COL = COL + BUG202T$FIXL[ARG];
          C<COL,1>LINE = "="; 
          COL = COL + 1;
          VALUE;
          RETURN; 
  
  
#      CONSTANT REFERENCE                                              #
  
FUNC$EQUALS:  
FUNC$CONSTOF: 
          VALUE;
          RETURN; 
  
  
#      TABLE REFERENCE                                                 #
  
FUNC$SETSYOF: 
          C<COL,1>LINE = "("; 
          J = B<30,4>BUG202C$TABL[N]; 
          C<COL+1,4>LINE = BUG202T$MOD[J];
          COL = COL + 1 + BUG202T$MODL[J];
          C<COL,1>LINE = ","; 
          J = B<34,8>BUG202C$TABL[N]; 
          LEN = BUG202T$TBLL[J];
          C<COL+1,LEN>LINE = BUG202T$TBL[J];
          COL = COL + 1 + LEN;
          C<COL,1>LINE = ","; 
          C<COL+1,4>LINE = OCT(BUG202C$TABL[N], 16, 4); 
          C<COL+5,2>LINE = ")+";
          COL = COL + 7;
          VALUE;
          RETURN; 
  
          END  #FUNC# 
CONTROL EJECT;
  
          PROC  VALUE;
  
#**       VALUE -  APPEND A SHORT BUT UNAMBIGUOUS DISPLAY VALUE 
* 
*         VFUN = VALUE
# 
  
          BEGIN 
  
          IF VFUN LS 0  THEN
              BEGIN 
              C<COL,1>LINE = "-"; 
              COL = COL + 1;
              VFUN = -VFUN; 
              END 
  
          I = 3;
  
          FOR J=J 
           WHILE I LQ 57
           AND B<0,I>VFUN EQ 0  DO
              I = I + 3;
  
          I = 21 - I/3; 
          C<COL,20>LINE = OCT(VFUN, 20-I, I); 
          COL = COL + I;
  
          IF I GR 1  THEN 
              BEGIN 
              C<COL,1>LINE = "B"; 
              COL = COL + 1;
              IF I LQ 4  THEN 
                  BEGIN 
                  C<COL,1>LINE = "="; 
                  C<COL+1,10>LINE = DEC(VFUN);
                  COL = COL + 1 + LDEC(VFUN); 
                  END 
              END 
  
          END  #VALUE#
          $END
          END 
          TERM
