*DECK,BUGCLO
      SUBROUTINE BUGCLO, RETURNS(I) 
C 
C  THIS SUBROUTINE TAKES DEBUG INFORMATION FROM CENTRAL MEMORY AND
C  PLACES IT IN A RANDOM FILE 
C  ENTRY: POW  = 0 ALL DEBUG TABLES ARE DUMPED TO DISK
C            .NE.0 DUMP AS MANY AREA LISTS AS IS POSSIBLE TO DISK.
C                  THIS CONDITION HOLDS WHEN MORE ROOM IS NEEDED FOR
C                  EITHER AN OPTIONS OR AN AREA LIST. 
C         DFOPFLG  = 0 IF OPTIONS NOT IN CORE 
C                .NE.0 IF OPTIONS ARE IN CORE 
C         AREAEND = THE ENDING ADDRESS OF THE AREA LIST 
C         DFNESTW = THE LAST ADDRESS OF THE OPTIONS LIST
C         OPREC = THE RECORD NUMBER OF THE CURRENT OPTIONS LIST 
C         SDRL = THE STARTING ADDRESS OF THE DRL
C         EDRL = THE ENDING ADDRESS OF THE DRL - SDRL 
C         SDVL = THE STARTING ADDRESS OF THE DVL
C         EDVL = THE ENDING ADDRESS OF THE DVL - SDVL 
C         OPDRL = THE ORDINAL OF THE CURRENT OPTIONS LIST IN THE DRL
C 
*CALL LDBGCOM 
      IF (DFPACK .EQ. 0) RETURN I 
      IF (DFNOGO .LT. 0) RETURN 
      IF (SDRL .NE. EDRL) GO TO 26
      INDEXNO = 1 
      RETURN
   26 IF (OPENFL .EQ. 0) CALL WRTMS1
C  SEND THE OPTIONS TO DISK IF THEY ARE COMPLETE BUT STILL IN CORE
      IF ((DFOPFLG .EQ. 0) .OR. (POW .NE. 0)) GO TO 20
      IF ( (DFNESTW - AREAEND) .EQ. 0) GO TO 22 
      IF (DFNEST .NE. 4) GO TO 24 
      IF ( (DFNESTW - AREAEND - 1) .EQ. 0) GO TO 25 
      DFNEST = -1 
      DFNESTW = DFNESTW - 1 
   24 DFNEST = DFNEST + 1 
   25 OH = MINZERO
      CALL PUT IN 
      CALL WRTMS2 (DEBUG(AREAEND + 1), DFNESTW - AREAEND, OPREC)
      CALL WRTMS3 
      IF (DFNEST .EQ. 4) DFNESTW = DFNESTW - 1
   22 DFOPFLG = 0 
      DEBUG(SDBGIND + OPREC) = (DEBUG(SDBGIND + OPREC) .AND.
     ,   SHIFT(MASK(42), 24)) .OR. (SHIFT((DFNESTW - AREAEND), 24)) 
      DEBUG(OPDRL + 1) = (DEBUG(OPDRL + 1) .AND.SHIFT(MASK(42), 24))
     ,   .OR. SHIFT(DFNESTW - AREAEND, 24)
C 
C  SEND AREA LISTS TO DISK BY NAME OF ROUTINE 
C 
   20 DRL = SDRL - 2
  310 IF (POW .GE. 0) GO TO 300 
      DRL = DRL + 2 
      IF (DRL .EQ. EDRL) GO TO 320
      IF (ADDRESS(DEBUG(DRL)) .EQ. 0) GO TO 310 
      DEBUG(DRL) = 0
      DEBUG(DRL+1) = 0
      GO TO 310 
  300 NO OF WDS = 0 
      DLFLG = 5 
   70 RECORD = RECORD + 1 
      IF (RECORD .LT. LNGIND) GO TO 400 
  380 IF (ELAST - DFNESTW .GT. 50) GO TO 390
      IF (NO OF WDS .NE. 0) GO TO 330 
      POW = -1
      GO TO 310 
  330 CALL DMVWDS ( ELAST - (SAREA + NO OF WDS), DEBUG(SAREA +NOOFWDS), 
     ,    DEBUG(SAREA)) 
      AREAEND = AREAEND - NO OF WDS 
      DFNESTW = DFNESTW - NO OF WDS 
      BOUND WD = BOUND WD - NO OF WDS 
      OP WORD = OP WORD - NO OF WDS 
      TEMP = OPWORD 
  331 TEMP1 = ADDRESS(DEBUG(TEMP))
      IF (TEMP1 .EQ. 0) GO TO 332 
      DEBUG(TEMP) = DEBUG(TEMP) - 50
      TEMP = TEMP1
      GO TO 331 
  332 NDRL = SDRL - 2 
  350 NDRL = NDRL + 2 
      IF (NDRL .EQ. EDRL) GO TO 370 
      IF (ADDRESS(DEBUG(NDRL))) 340, 350, 360 
  340 DEBUG(NDRL) = DRLELT(DEBUG(NDRL)) .OR. SHIFT(MASK(18),18) - 
     ,    ADDRESS(DEBUG(NDRL))
  360 DEBUG(NDRL+1) = DEBUG(NDRL+1) - NO OF WDS 
      DEBUG(NDRL) = DEBUG(NDRL) - NO OF WDS 
      GO TO 350 
  370 NO OF WDS = 0 
      GO TO 380 
  390 IF (AREAEND .GT. DFNESTW) DFNESTW = AREAEND 
      CALL DMVWDS (DFNESTW -(SAREA - 1), DEBUG(SAREA), DEBUG(SAREA +50))
      SAREA = SAREA + 50
      AREAEND = AREAEND + 50
      DFNESTW = DFNESTW + 50
      LNG IND = LNG IND + 50
      NDRL = SDRL - 2 
  420 NDRL = NDRL + 2 
      IF (NDRL .EQ. EDRL) GOTO 400
      IF(ADDRESS(DEBUG(NDRL))) 410, 420, 440
  410 DEBUG(NDRL) = DRLELT(DEBUG(NDRL)) .OR. SHIFT(MASK(18),18) - 
     ,    ADDRESS(DEBUG(NDRL))
  440 DEBUG(NDRL+1) = DEBUG(NDRL+1) + 50
      DEBUG(NDRL) = DEBUG(NDRL) + 50
      GO TO 420 
  400 ALNG = 0
      TLNG = 0
   40 DRL = DRL + 2 
      IF (DRL.EQ.EDRL) GO TO 30 
      IF (ADDRESS(DEBUG(DRL)).EQ.0) GO TO 40
      NXT ADD = ADDRESS(DEBUG(DRL+1)) 
      IF (DRLELT(DEBUG(NXT ADD)) .EQ. DRLELT(DEBUG(OPDRL)) .AND.
     ,    POW .NE. 0) GO TO 40
  100 TEMP = DEBUG(NXT ADD) 
      DEBUG(NXT ADD) = DEBUG(NXT ADD + 1) 
      DEBUG(NXT ADD + 1) = TEMP 
      TEMP = SDRL - 2 
   61 TEMP = TEMP + 2 
      IF (TEMP .EQ. EDRL) GO TO 80
      IF (DRLELT(DEBUG(NXT ADD + 1)) .NE. DRLELT(DEBUG(TEMP))) GO TO 61 
      TLNG = TLNG + LENGTH(DEBUG(TEMP + 1)) 
   60 LNG = LENGTH(DEBUG(NXT ADD))
      ALNG = ALNG + LNG - 1 
      NO OF WDS = NO  OF WDS + LNG
      TLNG = TLNG + LNG - 1 
      CALL WRTMS2 (DEBUG(NXT ADD + 1), LNG - 1, RECORD) 
      NXT ADD = ADDRESS(DEBUG(NXT ADD)) 
      IF (SHIFT(NXT ADD, 42)) 500, 80, 60 
  500 NXT ADD = SHIFT(MASK(18), 18) - NXT ADD 
      IF (DRLELT(DEBUG(NXT ADD)) .NE. DRLELT(DEBUG(OPDRL)) .OR. 
     ,    POW .EQ. 0) GO TO 100 
   80 CALL WRTMS3 
      DEBUG(DRL) = (DEBUG(DRL).AND.MASK(42)) .OR. NXT ADD 
      DEBUG(DRL+1) = MASK(1) .OR. SHIFT(ALNG, 24) .OR.RECORD
      DEBUG(SDBGIND+RECORD)=SHIFT(MASK(18),18).AND.DEBUG(SDBGIND+RECORD)
      DEBUG(SDBGIND + RECORD) = DEBUG(SDBGIND + RECORD) .OR.
     ,    SHIFT(TLNG, 42) .OR. SHIFT(ALNG, 24)
      GO TO 70
   30 IF (POW .NE. 0) GO TO 120 
C 
C  SORT THE ROUTINES IN THE DRL IN ASCENDING ORDER AND SEND THEM TO THE 
C  RANDOM FILE
C 
  320 IF (EDRL .EQ. SDRL) GO TO 32
      IF ( SDRL .EQ. (EDRL - 2) ) GO TO 710 
      IJ = SDRL 
  205 IK = IJ + 2 
  210 IL = 1
  220 IF ((SHIFT(DEBUG(IJ), IL*6) .AND. 77B) -
     ,    (SHIFT(DEBUG(IK), IL*6) .AND. 77B)) 230,240,250 
  240 IL = IL + 1 
      IF (IL .EQ. 8) 230, 220 
  250 TEMP = DEBUG(IJ)
      DEBUG(IJ) = DEBUG(IK) 
      DEBUG(IK) = TEMP
      TEMP = DEBUG(IJ + 1)
      DEBUG(IJ + 1) = DEBUG(IK + 1) 
      DEBUG(IK + 1) = TEMP
  230 IK = IK + 2 
      IF (IK .LT. EDRL) GO TO 210 
      IJ = IJ + 2 
      IF (IJ .LT. (EDRL - 2) ) GO TO 205
  700 IF (DEBUG(SDRL) .NE. 0) GO TO 710 
      SDRL = SDRL + 2 
      GO TO 700 
  710 IX = 1
      IF (DFPACK .LT. 0) IX = 3 
      IF ( EDRL .EQ. SDRL) GO TO 32 
      CALL WRTMS2 (DEBUG(SDRL), EDRL - SDRL, IX)
      SUCCESS = 1 
      CALL WRTMS3 
   32 DEBUG(SDBGIND+IX) = (DEBUG(SDBGIND+IX) .AND. SHIFT(MASK(42),24))
     ,   .OR. SHIFT(EDRL-SDRL, 24)
      IF (EDVL .EQ. SDVL) GO TO 34
      IX = 2
      IF (DFPACK .LT. 0) IX = 4 
      CALL WRTMS2 (DEBUG(SDVL), 1+ EDVL - SDVL, IX) 
      CALL WRTMS3 
      DEBUG(SDBGIND+IX) = (DEBUG(SDBGIND+IX) .AND. SHIFT(MASK(42),24))
     ,   .OR. SHIFT(EDVL-SDVL+1, 24)
   34 CALL WRTMS4 
      IF (POW .LT. 0) RETURN I
      RETURN
C 
C  HERE IF HAVE TO MOVE REMAINS OF AREA AND OPTIONS LISTS DOWN TO AUXTAB
C 
  120 CALL DMVWDS (ELAST - (SAREA + NO OF WDS), DEBUG(SAREA +NO OF WDS),
     ,    DEBUG(SAREA)) 
      AREAEND = AREAEND - NO OF WDS 
      NDRL = EDRL 
      DFNESTW = DFNESTW - NO OF WDS 
      BOUND WD = BOUND WD - NO OF WDS 
      OP WORD = OP WORD - NO OF WDS 
      TEMP = OPWORD 
  121 TEMP1 = ADDRESS(DEBUG(TEMP))
      IF (TEMP1 .EQ. 0) GO TO 122 
      DEBUG(TEMP)= DEBUG(TEMP) - 50 
      TEMP = TEMP1
      GO TO 121 
  122 DRL = SDRL - 2
  130 DRL = SDRL + 2
      IF (DRL.NE.EDRL) GO TO 134
      IF (DLFLG .NE. 0) RETURN
      RETURN I
  134 IF (ADDRESS(DEBUG(DRL))) 129, 130, 131
  129 DEBUG(DRL) = DRLELT(DEBUG(DRL)) .OR. SHIFT(MASK(18),18) - 
     ,    ADDRESS(DEBUG(DRL)) 
  131 IF (NDRL .NE. REFMAP) GO TO 132 
      IF (DLFLG.EQ.0) GO TO 136 
      CALL DMVCON 
      IF (DLFLG.NE.0) GO TO 132 
  136 DEBUG(DRL) = DRLELT(DEBUG(DRL)) 
      GO TO 130 
  132 NXT ADD = ADDRESS(DEBUG(DRL)) 
      DEBUG(DRL) = DRLELT(DEBUG(DRL)) 
      DEBUG(NDRL) = DEBUG(DRL).OR.(SHIFT(MASK(18),18) - NXT ADD + 
     ,    NO OF WDS)
      DEBUG(NDRL + 1) = MASK(1) .OR. (NXT ADD - NO OF WDS)
      NDRL = NDRL + 2 
      NXT ADD = NXT ADD + 1 
  140 IF (ADDRESS(DEBUG(NXT ADD)).EQ.0) GO TO 130 
      NXT ADD1= ADDRESS(DEBUG(NXT ADD)) 
      DEBUG(NXT ADD) = DRLELT(DEBUG(NXT ADD)) .OR. (NXT ADD1 -NO OF WDS)
      NXT ADD = NXT ADD1
      GO TO 140 
      END 
