FTN4,L,C
      PROGRAM CMM3 (3,90) 
C 
C 
C                  MIKE MANLEY          REVISION 2
C 
C 
      DIMENSION IPBUF(33),LU(5),IBUF(25),IREG(2),IMESS5(6),IDP(22)
      DIMENSION IMESS0(8),IMESS1(9),IMES11(6),IMESS3(6),IMESS7(7) 
      DIMENSION IMESS2(11),IWHAT(6),IMESS8(11),IPRAM(6),IVALU2(13)
      DIMENSION IARRAY(64),IDISC(26),MDISK(10),IVALUE(9),ITEL33(28) 
      DIMENSION IEXT(4),ITEL22(14),ITEL23(20),ITEL24(17),ITEL25(22) 
      DIMENSION IX(8),I1(11),I2(13),I3(12),I4(9),I5(13),I6(12)
      DIMENSION I7(9),I9(14),IG(11),IH(11),IJ(11),IK(9),IOUT(7) 
      DIMENSION IL(12),IO(15),IP(16),IQ(17),IR(21),IDI(28),MEMR(7)
      DIMENSION IN(8),IM(22),IPACK(23),MORUSE(8),ITEL30(5),ITEL31(17) 
      DIMENSION ITEL1(9),ITEL2(9),ITEL3(16),ITEL4(5),ITEL5(19),ITEL6(12)
      DIMENSION ITEL7(6),ITEL8(5),ITEL9(23),ITEL10(5),ITEL11(26)
      DIMENSION ITEL12(7),ITEL13(11),ITEL14(22),ITEL15(11),ITEL16(16) 
      DIMENSION ITEL17(13),ITEL18(17),ITEL19(6),ITEL20(6),ITEL21(6) 
      DIMENSION IGTOUT(27),ITAT(12),ISYS(5),IAUX(5),LDISC(5),IABS(7)
      DIMENSION IT(17),ITEL26(2),ITEL27(5),ITEL28(13),ITEL34(13)
      DIMENSION IPR(14),ILE(17),ITEL35(2),IGO(27),IRP(6)
      DIMENSION IPG(19),ITEL36(13)
      EQUIVALENCE(IREG,REG,IA),(IREG(2),IB) 
      EQUIVALENCE(IPBUF(2),IPRS1),(IPBUF(6),IPRS2),(IPBUF(10),IPRS3)
      EQUIVALENCE(IPBUF(14),IPRS4),(IPBUF(18),IPRS5)
C 
      DATA IMESS1/2H  ,2HID,2H S,2HEG,2H O,2HF /
      DATA MEMR/2H  ,2HME,2HM ,2HRE,2HS ,2HPR,2HOG/ 
      DATA IEXT/2H  ,2HEX,2HTE,2HNT/
      DATA IVALUE/2H  ,2HWO,2HRD,2H ,,2H V,2HAL,2HUE,2H  ,2H  / 
      DATA IVALU2/2H  ,2HLU,2H,T,2HRK,2H,S,2HEC,2HTR,2H,W,2HOR, 
     &            2HD,,2HVA,2HLU,2HE /
      DATA MDISK/2H  ,2HMO,2HDI,2HFY,2H O,2HP ,2HSY,2HST,2HEM,2H ?/ 
      DATA IGTOUT/2H  ,2HDI,2HSC,2H M,2HOD,2H !,2H  ,2HEN,2HTE,2HR ,
     &            2HA ,2H/D,2H A,2HT ,2HAN,2HY ,2HTI,2HME,2H T,2HO ,
     &            2HEX,2HIT,2H T,2HHI,2HS ,2HMO,2HDE/ 
      DATA IWHAT/2H  ,2HSA,2HY ,2HWH,2HAT,2H ?/ 
      DATA IMESS2/2H  ,2HEQ,2HT ,2H# ,2H  ,2H  ,2H  ,2H  ,2HDV,2HR /
      DATA IMES11/2H  ,2HNO,2HT ,2HFO,2HUN,2HD /
      DATA IMESS3/2H  ,2HDR,2HT ,2HPA,2HRT,2H  /
      DATA IMESS5/2H  ,2HIN,2HT ,2HTA,2HBL,2HE /
      DATA IMESS0/2H  ,2H =,2HCM,2HM3,2H D,2HON,2HE ,2H! /
      DATA IBUF/2H24,2H99,2H9-,2H16,2H05,2H2 ,2H17,2H52,2H S,2HOF,
     &          2HTW,2HAR,2HE ,2HSE,2HRV,2HIC,2HE ,2HKI,2HT ,2HSY,
     &          2HST,2HEM,2H 1,2H00,2H0 / 
      DATA IMESS7/2H  ,2HYE,2HS ,2HOR,2H N,2HO ,2H? / 
      DATA IMESS8/2HIN,2HT ,2HTA,2HBL ,2HE ,2HST,2HAR,2HTS, 
     &            2H A,2HT ,2H6./ 
      DATA IDISC/2H  ,2HLU,2H =,2H  ,2H  ,2H  ,2HTR,2HK ,2H= ,
     &           2H  ,2H  ,2H  ,2HSE,2HCT,2HR ,2H= ,2H  ,2H  ,2H  , 
     &           2H  ,2HWO,2HRD,2H =,2H  ,2H  ,2H  /
      DATA IOUT/2H  ,2HOU,2HT ,2HOF,2H R,2HAN,2HGE/ 
      DATA ITEL1/2H  ,2HID,2H,P,2HRO,2HGR,2HAM,2H N,2HAM,2HE /
      DATA ITEL2/2H  ,2HID,2H,S,2HEG,2HME,2HNT,2H N,2HAM,2HE /
      DATA ITEL3/2H  ,2HID,2H,N,2HUM,2HBR,2H =,2H A,2HLL,2H I,
     &           2HD',2HS ,2HIN,2H S,2HYS,2HTE,2HM /
      DATA ITEL4/2H  ,2HEQ,2H,N,2HUM,2HBR/
      DATA ITEL5/2H  ,2HEQ,2H,N,2HUM,2HBR,2H,N,2HUM,2HBR,2H  ,
     &           2HGI,2HVE,2HS ,2HEQ,2HTS,2H I,2HNC,2HLU,2HSI,
     &           2HVE/
      DATA ITEL6/2H  ,2HLM,2H,A,2HDD,2HRE,2HSS,2H,#,2H O,2HF ,
     &           2HWO,2HRD,2HS /
      DATA ITEL7/2H  ,2HLM,2H,A,2HDD,2HRE,2HSS/ 
      DATA ITEL8/2H  ,2HDR,2H,N,2HUM,2HBR/
      DATA ITEL9/2H  ,2HDR,2H,N,2HUM,2HBR,2H,N,2HUM,2HBR,2H  ,
     &           2HGI,2HVE,2HS ,2HDR,2HT ,2HEN,2HTR,2HIE,2HS ,
     &           2HIN,2HCL,2HUS,2HIV,2HE /
      DATA ITEL10/2H  ,2HIN,2H,N,2HUM,2HBR/ 
      DATA ITEL11/2H  ,2HIN,2H,N,2HUM,2HBR,2H,N,2HUM,2HBR,2H  , 
     &            2HGI,2HVE,2HS ,2HIN,2HT ,2HTA,2HBL,2HE ,2HEN, 
     &            2HTR,2HIE,2HS ,2HIN,2HCL,2HUS,2HIV,2HE /
      DATA ITEL12/2H  ,2HLL,2H,L,2HIS,2HT ,2HLU,2H# / 
      DATA ITEL13/2H  ,2HPM,2H,A,2HDD,2HRE,2HSS,2H,N,2HEW,
     &            2H V,2HAL,2HUE/ 
      DATA ITEL14/2H  ,2HF/,2H,V,2HAL,2HUE,2H T,2HO ,2HFI,2HND, 
     &            2H,S,2HTA,2HRT,2H A,
     &            2HDD,2HRE,2HSS,2H,#,2H O,2HF ,2HWO,2HRD,2HS / 
      DATA ITEL15/2H  ,2HLI,2H,E,2HNT,2HRY,2H P,2HOI,2HNT,2H N, 
     &            2HAM,2HE /
      DATA ITEL16/2H  ,2HDL,2H,L,2HU,,2HTR,2HK,,2HSE,2HCT,2HR,, 
     &            2H #,2H O,2HF ,2HSE,2HCT,2HOR,2HS / 
      DATA ITEL17/2H  ,2HDS,2H,L,2HU,,2HTR,2HK,,2HVA,2HLU,2HE , 
     &            2HTO,2H F,2HIN,2HD /
      DATA ITEL26/2H  ,2HTA/
      DATA ITEL27/2H  ,2HTA,2H,L,2HU ,2H# / 
      DATA ITEL28/2H  ,2HTA,2H,L,2HU ,2H#,,2HTR,2HK ,2H#,,
     &            2H #,2H O,2HF ,2HTR,2HKS/ 
      DATA ITEL18/2H  ,2HDM,2H  ,2H  ,2HDI,2HSC,2H M,2HOD,2H  , 
     &            2H  ,2H<I,2HNT,2HER,2HAC,2HTI,2HVE,2H> /
      DATA ITEL19/2H  ,2HEX,2H  ,2H  ,2HEX,2HIT/
      DATA ITEL20/2H  ,2HEN,2H  ,2H  ,2HEX,2HIT/
      DATA ITEL21/2H  ,2H/E,2H  ,2H  ,2HEX,2HIT/
      DATA ITEL22/2H  ,2HXL,2H,A,2HDD,2HRE,2HSS,2H  ,2H  ,2H(S, 
     &            2HYS,2HTE,2HM ,2HMA,2HP)/ 
      DATA ITEL23/2H  ,2HXL,2H,A,2HDD,2HRE,2HSS,2H,#,2H O,2HF , 
     &            2HWO,2HRD,2HS ,2H  ,2H(S,2HYS,2HTE,2HM ,2HMA, 
     &            2HP)/ 
      DATA ITEL24/2H  ,2HXP,2H,A,2HDD,2HRE,2HSS,2H,V,2HAL,2HUE, 
     &            2H  ,2H  ,2H(S,2HYS,2HTE,2HM ,2HMA,2HP)/
      DATA ITEL25/2H  ,2HXF,2H,V,2HAL,2HUE,2H T,2HO ,2HFI,2HND, 
     &            2H,S,2HTA,2HRT,2H A,2HDD,2HRE,2HSS,2H,#,2H O, 
     &            2HF ,2HWO,2HRD,2HS /
      DATA ITEL30/2H  ,2HDP,2H,V,2HAL,2HUE/ 
      DATA ITEL31/2H  ,2HTR,2H,S,2HTA,2HRT,2H L,2HOC,2HAT,2HIO,2HN,,
     &2HLI,2HST,2H D,2HEL,2HIM,2HIT,2HER/ 
      DATA ITEL33/2H  ,2HDI,2H,E,2HNT,2HRY,2H P,2HOI,2HNT,2H N,2HAM,
     &2HE / 
      DATA ITEL34/2H  ,2HLP,2H,P,2HRO,2HG ,2HNA,2HME,2H,R,2HEL, 
     &2H A,2HDD,2HRE,2HSS/
      DATA ITEL35/2H  ,2HLE/
      DATA ITEL36/2H  ,2HPG,2H, ,2HPG,2H#,,2H# ,2HOF,2H W,2HOR,2HDS,
     &2H,O,2HFS,2HET/ 
      DATA IX/2H I,2HNP,2HUT,2H  ,2HFU,2HNC,2HTI,2HON/
      DATA I1/2H  ,2HID,2H  ,2HLI,2HST,2H I,2HD ,2HSE,2HGM,2HEN,2HT / 
      DATA I2/2H  ,2HEQ,2H  ,2HLI,2HST,2H E,2HQT,2H A,2HND,2H E,2HXT, 
     &        2HEN,2HTS/
      DATA I3/2H  ,2HDR,2H  ,2HLI,2HST,2H D,2HEV,2H R,2HEF,2H T,2HAB, 
     &        2HLE/ 
      DATA I4/2H  ,2HLM,2H  ,2HLI,2HST,2H M,2HEM,2HOR,2HY / 
      DATA IP/2H  ,2HXL,2H  ,2HLI,2HST,2H M,2HEM,2HOR,2HY ,2H  ,
     &        2H(S,2HYS,2HTE,2HM ,2HMA,2HP)/
      DATA I5/2H  ,2HIN,2H  ,2HLI,2HST,2H I,2HNT,2HER,2HUP,2HT ,2HTA, 
     &        2HBL,2HE /
      DATA I6/2H  ,2HLL,2H  ,2HCH,2HAN,2HGE,2H L,2HIS,2HT ,2HDE,2HVI, 
     &        2HCE/ 
      DATA I7/2H  ,2HPM,2H  ,2HPA,2HTC,2HH ,2HME,2HMO,2HRY/ 
      DATA IQ/2H  ,2HXP,2H  ,2HPA,2HTC,2HH ,2HME,2HMO,2HRY,2H  ,2H  , 
     &        2H(S,2HYS,2HTE,2HM ,2HMA,2HP)/
      DATA I9/2H  ,2HF/,2H  ,2HFI,2HND,2H A,2H V,2HAL,2HUE,2H I,2HN , 
     &        2HME,2HMO,2HRY/ 
      DATA IR/2H  ,2HXF,2H  ,2HFI,2HND,2H A,2H V,2HAL,2HUE,2H I,2HN , 
     &        2HME,2HMO,2HRY,2H  ,2H(S,2HYS,2HTE,2HM ,2HMA,2HP)/
      DATA IG/2H  ,2HLI,2H  ,2HLI,2HST,2H E,2HNT,2HRY,2H P,2HOI,2HNT/ 
      DATA IDI/2H  ,2HDI,2H  ,2HRE,2HPO,2HRT,2H D,2HIS,2HC ,2HDI,2HCT,
     &2HIO,2HNA,2HRY,2H A,2HDD,2HRE,2HSS,2H O,2HF ,2H A,2HN ,2HEN,2HTR, 
     &2HY ,2HPO,2HIN,2HT /
      DATA ILE/2H  ,2HLE,2H  ,2HLI,2HST,2H A,2HLL,2H E,2HNT,2HRY, 
     &2H P,2HOI,2HNT,2HS ,2HIN,2H S,2HYS/ 
      DATA IH/2H  ,2HDL,2H  ,2HLI,2HST,2H D,2HIS,2HC ,2HSE,2HCT,2HOR/ 
      DATA IJ/2H  ,2HDM,2H  ,2HDI,2HSC,2H M,2HOD,2H  ,2HAN,2HY ,2HLU/ 
      DATA IK/2H  ,2HDS,2H  ,2HDI,2HSC,2H S,2HEA,2HRC,2HH / 
      DATA IL/2H  ,2H/E,2H O,2HR ,2HEN,2H O,2HR ,2HEX,2H T,2HO ,
     &2HEX,2HIT/
      DATA IDP/2H  ,2HDP,2H  ,2HDI,2HSP,2HLA,2HY ,2HIN,2HPU,2HT , 
     &2HIN,2H O,2HCT,2HAL,2H D,2HEC,2HIM,2HAL,2H &,2H A,2HSC,2HII/
      DATA IN/2H  ,2HTR,2H  ,2HTR,2HAC,2HE ,2HLI,2HST/
      DATA IPG/2H  ,2HPG,2H  ,2HLI,2HST,2H A,2HNY,2H L,2HOC,2HAT,2HIO,
     &2HN ,2HIN,2H P,2HHY,2HS ,2HME,2HMO,2HRY/
      DATA IM/2H  ,2HXT,2H  ,2HTR,2HAC,2HE ,2HLI,2HST,2H (,2HSY,
     &2HST,2HEM,2H M,2HAP,2H) / 
      DATA IPR/2H  ,2HLP,2H  ,2HLI,2HST,2H D,2HIS,2HC ,2HRE,2HS , 
     &2HPR, 2HOG,2HRA,2HM / 
      DATA IPACK/2H  ,2HA ,2HPK,2H A,2HFT,2HER,2H T,2HHE,2H I,2HNP, 
     &2HUT,2H G,2HIV,2HES,2H A,2H P,2HAC,2HKE,2HD ,2HLI,2HST,2HIN,
     &2HG / 
      DATA MORUSE/2H  ,2HOR,2H U,2HSE,2H  ,2H  ,2HPK,2H, /
      DATA IT/2H  ,2HTA,2H  ,2HLI,2HST,2H T,2HRA,2HCK,2H A,2HSS,
     &2HIG,2HNM,2HEN,2HT ,2HTA,2HBL,2HE / 
      DATA IO/2H  ,2HFO,2HR ,2HMO,2HRE,2H I,2HNF,2HO ,2HDO,2H A,
     &        2H ?,2H?,,2HIN,2HPU,2HT / 
      DATA ITAT/2H  ,2HTR,2HAC,2HK ,2HAS,2HSI,2HGN,2HME,2HNT, 
     &2H T,2HAB,2HLE/ 
      DATA ISYS/2H  ,2HSY,2HS ,2HDI,2HSC/ 
      DATA IAUX/2H  ,2HAU,2HX ,2HDI,2HSC/ 
      DATA IRP/2H  ,2HRP,2H  /
      DATA LDISC/2H  ,2HDI,2HSC,2H R,2HES/
      DATA IABS/2H  ,2HAB,2HS ,2H  /
      DATA IGO/2HID,2HEQ,2HDR,2HXL,2HLM,2HIN,2HLL,2HPM,2HXP,2HF/, 
     &         2HXF,2HLI,2HDI,2HLE,2HDL,2HDM,2HDS,2HTA,2HTR,2HXT, 
     &         2HDP,2HLP,2H??,2H/E,2HEX,2HEN,2HPG/
C 
      CALL RMPAR(LU)
      LU1=LU
      IF(LU1.EQ.0) LU1=1
      LU2 = LU1+200B
C 
      CALL EXEC(2,LU1,IBUF,25)
C 
      IPRMPT = 2H=
C 
C     SET UP THE IPRAM BUFFER.  THIS BUFFER IS USED BY THE I/O
C     SUBROUTINES (DOIO & DISC3) TO DETERMINE HOW THE I/O IS
C     TO BE DONE. 
C 
1     IPRAM = 1 
      IPRAM(2) = 0
      IPRAM(3) = 0
      IPRAM(4) = 0
      IPRAM(5) = 0
      IPRAM(6) = -1 
      CALL EXEC(2,LU1+ 2000B,IPRMPT,-2) 
      REG = REIO(1,LU1 + 400B,IBUF,17)
      CALL PARSE(IBUF,IB*2,IPBUF) 
C     SEE IF THE PACKED FORM OF THE OUTPUT IS DESIRED 
      IF(IPBUF(3).EQ.2HPK) IPRAM(5) = 1 
C 
C 
C     FIND OUT WHICH COMMAND IT WAS 
C 
C 
      DO 20 I = 1,27
      IF(IPRS1.EQ.IGO(I)) GO TO(100,200,300,400,410,500,600,710,700,
     &810,800,900,900,900,1000,1100,1400,1500,1610,1600,1700,100,9000,
     &50,50,50,1900) I
20    CONTINUE
C 
C 
C      ILLEGAL COMMAND
C 
C 
25    CALL EXEC(2,LU1,IWHAT,-12)
      GO TO 1 
30    CALL EXEC(2,LU1,IOUT,7) 
      GO TO 1 
50    CALL EXEC(2,LU1,IMESS0,-16) 
      CALL EXEC(6,0)
C 
C 
C     **********GET ID SEGMENT INFO************** 
100   KYWORD = IGET(1657B) -1 
      IF(IPBUF(5).EQ.1) GO TO 175 
C 
C 
150   DO 170 I = 1,257
      KYWORD = KYWORD +1
      IF(IGET(KYWORD).EQ.0) GO TO 190 
      IF(((IPRS2.EQ.IGET(IGET(KYWORD)+12)).AND. 
     &  (IPBUF(7).EQ.IGET(IGET(KYWORD)+13))).AND. 
     &  (IPBUF(8).EQ.IOR(IAND(IGET(IGET(KYWORD)+14),177400B),40B))) 
     &  GO TO 176 
170   CONTINUE
175   KYWORD = KYWORD +1
      IF(IPRAM(3).EQ.9999) GO TO 1
      IF(IGET(KYWORD).EQ.0) GO TO 1 
      IF(IGET(IGET(KYWORD)+12).NE.0) GO TO 176
      IMESS1(7) = 2H<F
      IMESS1(8) = 2HRE
      IMESS1(9) = 2HE>
      GO TO 180 
176   IMESS1(7) = IGET(IGET(KYWORD)+12) 
      IMESS1(8) = IGET(IGET(KYWORD)+13) 
      IMESS1(9) = IGET(IGET(KYWORD)+14) 
C 
180   ISTART = IGET(KYWORD) 
      ISTOP = ISTART +27
      ITEMP = IAND(IGET(IGET(KYWORD) +14),17B)
      ITEMP1= IAND(IGET(IGET(KYWORD) +14),20B)
      IF(ITEMP1.EQ.20B) ISTART= IGET(KYWORD) +11
      IF(ITEMP1.EQ.20B) ISTOP = ISTART + 8
      IF(ITEMP.EQ.1) ISTOP = ISTART + 21
C 
C     SEE IF THIS IS 'ID' OR 'PL' COMMAND 
C 
      IF(IPRS1 .EQ.2HLP) GO TO 1800 
C 
C     'ID' COMMAND, SO GIVE HIM THE ID SEGMENT !! 
      CALL EXEC(3,LU2+1100B,1)
      CALL EXEC(2,LU2,IMESS1,-17) 
      CALL DOIO(ISTART,ISTOP,LU2,IPRAM) 
      IF(IPBUF(5).EQ.1) GO TO 175 
      GO TO 1 
190   CALL EXEC(2,LU1,IMES11,-12) 
      GO TO 1 
C 
C 
C     **********GET EQT INFO************* 
C 
C 
200   IEQTA = IGET(1650B) 
      IEQTNO = IGET(1651B)
      IF(IPRS3 .GT. IEQTNO) IPRS3 = IEQTNO
      IF(IPRS2.GT.IEQTNO) GO TO 25
      IF(IPRS2.LT. 1) IPRS2 = 1 
C 
C 
      DO 210 I = IPRS2,IPRS3
      IF(IPRAM(3) .EQ. 9999) GO TO 1
      ISTART = IEQTA + (I - 1)*15 
      CALL CNUMD(I,IBUF(2)) 
      IMESS2(4) = IBUF(4) 
      IBUF = (IAND(IGET(ISTART+4),37400B)/256)
      IBUF = IBUF + 2*(IBUF/8)
      CALL CNUMD(IBUF,IBUF(2))
C     INSERT A 0 SO DVR00 DOESNT LOOK LIKE DVR 0
      IF (IAND(IBUF(4),177400B).EQ.20000B) IBUF(4) = IBUF(4) + 10000B 
      IMESS2(11) = IBUF(4)
C 
      CALL EXEC(3,LU2+1100B,1)
      CALL EXEC(2,LU2,IMESS2,11)
      CALL DOIO(ISTART,ISTART +14,LU2,IPRAM)
C 
C 
C     GET THE DISC ADDRESS OF THE EQT 
      CALL DTRK(ISTART+11,ITRK,ISECTR,IWORD,ISTOP,IARRAY) 
C     GET THE SECTOR
      CALL EXEC(1,102B,IARRAY,64,ITRK,ISECTR) 
C     IF IT IS DVR00 THERE ARE NO EXTENTS 
C     IF # OF EXTENT WORDS IS NEG THERE ARE NO EXTENTS
      IF((IARRAY(IWORD).LT.1).OR.(IBUF(4).EQ.30060B)) GO TO 210 
      IDRT = IARRAY(IWORD)
C     NOW GET THE ADDRESS OF THE EXTENT 
      CALL DTRK(ISTART+12,ITRK,ISECTR,IWORD,ISTOP,IARRAY) 
      CALL EXEC(1,102B,IARRAY,64,ITRK,ISECTR) 
C     IF ADDRESS OF EXTENT IS NEG THERE ARE NO EXTENTS
      IF(IARRAY(IWORD).LT.1) GO TO 210
C 
C 
      CALL EXEC(3,LU2+1100B,1)
      CALL EXEC(2,LU2,IEXT,4) 
      CALL DOIO(IARRAY(IWORD),IARRAY(IWORD)+IDRT-1,LU2,IPRAM) 
210   CONTINUE
      GO TO 1 
C 
C 
C 
C     **********GET DEVICE REF TABLE**************
C 
300   IDRT = IGET(1652B)
      LUMAX = IGET(1653B) 
      IMESS3(6) = 61B 
C 
C 
      CALL EXEC(2,LU2,IMESS3,6) 
      IF(IPRS3.GT.LUMAX) IPRS3 = LUMAX
      IF(IPRS2.LE.0) IPRS2 = 1
      CALL DOIO(IDRT + IPRS2-1,IDRT + IPRS3-1,LU2,IPRAM)
      IMESS3(6) = 62B 
      CALL EXEC(3,LU2+1100B,1)
      CALL EXEC(2,LU2,IMESS3,6) 
      CALL DOIO(IDRT+IPRS2-1+LUMAX,IDRT+IPRS3-1+LUMAX,LU2,IPRAM)
      GO TO 1 
C 
C 
C 
C     ***********LIST ANY MEMORY LOCATION REQUESTED**************** 
C 
C 
400   IPRAM(4) = -1 
      IF((IPRS2.LT.0).OR.(IPRS3+IPRS2-1.LT.0)) GO TO 30 
410   CALL DOIO(IPRS2,IPRS2+IPRS3-1,LU2,IPRAM)
      GO TO 1 
C 
C 
C     *************GET THE INTERUPT TABLE*****************
C 
C 
500   INTBA = IGET(1654B) 
      INTLG = IGET(1655B) 
C 
C 
      IF(IPRS2.LT.6) GO TO 550
      CALL EXEC(2,LU2,IMESS5,-12) 
      IF(IPRS3.GT.INTLG) IPRS3 = INTLG
      IF(IPRS2.LE.0) IPRS2 = 1
      ISTART = INTBA + IPRS2 -6 
      ISTOP = INTBA +IPRS3 -1 
      IPRAM = IPRS2 
      IPRAM(2) = 1
      CALL DOIO(ISTART,ISTOP,LU2,IPRAM) 
      GO TO 1 
550   CALL EXEC(2,LU1,IMESS8,-22) 
      GO TO 1 
C 
C 
C 
C     ***********CHANGE OUTPUT LU***************
C 
C 
600   LU2 = IPRS2 + 200B
      GO TO 1 
C 
C 
C 
C     ***********PATCH MEMORY ANY MEMORY LOCATION**************** 
C 
700   IPRAM(4) = -1 
710   CALL DOIO(IPRS2,IPRS2,LU2,IPRAM)
      CALL EXEC(2,LU1,IMESS7,-14) 
      CALL REIO(1,LU1+400B,IPBUF(7),1)
C     IF YOU CHANGE YOUR MIND THIS IS THE ESCAPE ROUTE
      IF(IPBUF(7).NE.2HYE) GO TO 1
      IF(IPRAM(4).EQ.0)CALL IPUT(IPRS2,IPRS3) 
      IF(IPRAM(4).EQ.-1)CALL XPUT(IPRS2,IPRS3)
      CALL DOIO(IPRS2,IPRS2,LU2,IPRAM)
      GO TO 1 
C 
C 
C*******FIND A WORD BETWEEN GIVEN LIMITS IN MEMORY********
C 
800   IPRAM(4) = -1 
810   IF((IPRS3.LT.0).OR.(IPRS3+IPRS4-1.LT.0)) GO TO 30 
      DO 850 I = IPRS3,IPRS3+IPRS4-1
      IF((IGET(I).EQ.IPRS2).AND.(IPRAM(4).EQ.0)) GO TO 820
      IF((IXGET(I).EQ.IPRS2).AND.(IPRAM(4).EQ.-1)) GO TO 820
      GO TO 850 
820   CALL DOIO(I,I,LU2,IPRAM)
      IF(IPRAM(3).EQ.9999) GO TO 1
      IPRAM(3) = 1
      IPRAM = IPRAM + 1 
850   CONTINUE
      IF(IPRAM(3).EQ.0) GO TO 190 
      GO TO 1 
C 
C 
C*******FIND ADDRESS OF SELECTED SYSTEM ENTRY POINTS********
C 
C 
C 
C 
C 
C 
900   ITRK = IGET(1761B)/128
      ISECTR = IAND(IGET(1761B),177B)-1 
      DO 993 I = 1,IGET(1762B)/16 + 1 
      ISECTR = ISECTR + 1 
      IF(ISECTR.NE.96) GO TO 910
      ISECTR = 0
      ITRK = ITRK + 1 
910   CALL EXEC(1,102B,IARRAY,64,ITRK,ISECTR) 
      DO 992 J = 1,64,4 
      IF(IFBRK(IDUMY))1,911 
911   IF(IPRS1.EQ.2HLE) GO TO 965 
      IF(((IARRAY(J).EQ.IPBUF(6)).AND.(IARRAY(J+1).EQ.IPBUF(7))).AND. 
     &(IOR(IAND(IARRAY(J+2),177400B),40B).EQ.IPBUF(8))) GO TO 970 
      GO TO 992 
C 
965   CALL EXEC(2,LU2,IARRAY(J),-5) 
C 
C 
C 
970   IF(IPRS1.EQ.2HDI) GO TO 995 
      MYTYPE = IAND(IARRAY(J+2),177B) + 1 
      GO TO (975,980,190,985,990) MYTYPE
C 
C 
975   CALL DOIO(IARRAY(J+3),IARRAY(J+3),LU2,IPRAM)
      IF(IPRAM(3).EQ.9999) GO TO 1
      IPRAM(3) = 1
      IPRAM = IPRAM + 1 
      GO TO 991 
C 
C 
980   CALL EXEC(2,LU2,LDISC,5)
      IDISC(6) = 2H 
      CALL CNUMD((IARRAY(J+3)/128),IDISC(9))
      CALL CNUMD(IAND(IARRAY(J+3),177B),IDISC(17))
      CALL EXEC(2,LU2,IDISC(6),14)
      GO TO 991 
C 
C 
C 
985   CALL CNUMO(IARRAY(J+3),IABS(5)) 
      CALL EXEC(2,LU2,IABS,7) 
      GO TO 991 
C 
C 
990   CALL CNUMO(IARRAY(J+3),IRP(4))
      CALL EXEC(2,LU2,IRP,6)
C 
991   IF(IPRS1.EQ.2HLI) GO TO 1 
992   CONTINUE
993   CONTINUE
      IF(IPRS1.EQ.2HLE) GO TO 1 
      GO TO 190 
C 
995   IPRAM = 0 
      CALL DISC3(2,ITRK,ISECTR,J,IARRAY,IPRAM,LU2,IDISC)
      GO TO 1 
C 
C 
C********LOOK AT ANY DISC LOCATION************
1000  DO 1050 J = 1,IPRS5 
      CALL EXEC(1,IPRS2 + 100B,IARRAY,64,IPRS3,IPRS4) 
      CALL DISC3(IPRS2,IPRS3,IPRS4,IPRAM,IARRAY,IPRAM,LU2,IDISC)
      IF(IPRAM(3).EQ.9999) GO TO 1
      IPRS4 = IPRS4 + 1 
      IF(IPRS4.LT.96) GO TO 1050
      IPRS4 = 0 
      IPRS3 = IPRS3 + 1 
1050  CONTINUE
      GO TO 1 
C 
C 
C 
C*************MODIFY OP SYSTEM ON THE DISC****************
C 
C 
C 
1100  CALL EXEC(2,LU1,IGTOUT,27)
      CALL EXEC(2,LU1,MDISK,10) 
      CALL EXEC(2,LU1+2000B,IMESS7,7) 
      REG = REIO(1,LU1+400B,IBUF,1) 
      IF(IBUF.EQ.2H/D) GO TO 1
      IF(IBUF.NE.2HYE) GO TO 1150 
C 
C 
C 
C  ASK FOR THE LOCATION AND REPLACEMENT VALUE 
C 
1125  CALL EXEC(2,LU1+2000B,IVALUE,9) 
      REG = REIO(1,LU1 +400B,IBUF,10) 
      CALL PARSE(IBUF,IB*2,IPBUF) 
      IF(IPBUF.EQ.2) GO TO 1
      IFIX = IPRS2
      ILU = 2 
      INULL = IPBUF(5)
C 
      CALL DTRK(IPRS1,ITRK,ISECTR,IWORD,ISTOP,IARRAY) 
C SEE IF WORD IS BEYOND ACTUAL OP SYSTEM SIZE 
C 
      IF(IPRS1.GT.ISTOP) GO TO 30 
C 
      ASSIGN 1125 TO ILABEL 
C 
      GO TO 1210
C 
C 
C** THIS SECTION ALLOWS MODIFICATION OF ANY DISC**
C 
C 
1150  CALL EXEC(2,LU1+2000B,IVALU2,13)
      REG=REIO(1,LU1+400B,IBUF,10)
      CALL PARSE(IBUF,IB*2,IPBUF) 
      IF(IPBUF.EQ.2) GO TO 1
      ILU= IPRS1
      ITRK= IPRS2 
      ISECTR = IPRS3
      IWORD = IPRS4 
      IF(IWORD .LE. 0 ) GO TO 25
      IFIX = IPBUF(18)
      INULL = IPBUF(17) 
C 
      ASSIGN 1150 TO ILABEL 
C 
C 
1210  CALL EXEC(1,ILU+100B,IARRAY,64,ITRK,ISECTR) 
      IPRAM = 0 
      CALL DISC3(ILU,ITRK,ISECTR,IWORD,IARRAY,IPRAM,LU2,IDISC)
C 
      IF (INULL.EQ.0) GO TO ILABEL
      CALL EXEC(2,LU1+2000B,IMESS7,-14) 
      CALL REIO(1,LU1+400B,IPBUF(7),1)
      IF(IPBUF(7).EQ. 2H/D) GO TO 1 
      IF(IPBUF(7).NE. 2HYE) GO TO ILABEL
C 
C 
C 
C     LETS GO MODIFY THE TRACK ASSIGNMENT TABLE SO WE CAN WRITE 
C     ON SYSTEM TRACKS. 
C 
1300  LUTYP = 0 
      IF(ILU.EQ.3) LUTYP = IGET(1756B)
      ITAT = IGET(1656B) + ITRK +LUTYP
      IARRAY(IWORD) = IFIX
      ISTART = IGET(ITAT) 
      IF(ILU.LT.4)CALL IPUT(ITAT,IGET(1717B)) 
C     !!!!!PATCH DISC!!!!!! 
      CALL EXEC(100002B,ILU+100B,IARRAY,64,ITRK,ISECTR) 
      GO TO 1310
C 
C     FIX TRACK ASSIGNMENT TABLE
1310  IF(ILU.LT.4)CALL IPUT(ITAT,ISTART)
C 
C 
C 
C 
      INULL = 0 
      GO TO 1210
C 
C 
C 
C 
C***THIS SECTION WILL SEARCH A TRACK FOR ALL OCCURRENCES OF A *** 
C***    GIVEN VALUE.  USE THIS SECTION TO UNPURGE A FILE.     *** 
C*** HINT ! IF YOU UNPURGE DON'T FORGET THE EXTENTS OR YOU WILL *** 
C***  DEVELOP A FMGR -005 ERROR . 
C 
C 
C 
1400  DO 1450 I =0,95 
      CALL EXEC(1,IPRS2 + 100B,IARRAY,64,IPRS3,I) 
      DO 1425 J = 1,64
      IF(IARRAY(J).NE.IPRS4) GO TO 1425 
      CALL CNUMD(I,IDISC(17)) 
      CALL CNUMD(J,IDISC(24)) 
      CALL EXEC(2,LU2,IDISC(12),15) 
1425  CONTINUE
1450  CONTINUE
      GO TO 1 
C 
C*********** PRINT OUT THE TRACK ASSIGNMENT TABLE ******************
C 
1500  CALL EXEC(2,LU2,ITAT,12)
      IPRAM = 0 
      IF((IPRS2.GT.3).OR.(IPRS2.LT.0)) GO TO 25 
C     GET # OF TRACKS ON AUX DISC 
      INEED =-( IGET(1755B))- IGET(1756B) 
C     GET STOP ADDRESS OF TAT FOR SYS DISC
      ISTOP = IGET(1656B) + IGET(1756B) - 1 
      IF (IPRS2 .EQ. 3) GO TO 1510
C     PRINT OUT SYS DISC TRACK ASSIGNMENTS
      CALL EXEC(2,LU2,ISYS,5) 
C 
      IF(IPRS3.EQ.0) GO TO 1505 
      IPRAM = IPRS3 
C 
      ISTART = IGET(1656B) + IPRS3
      IF(ISTART .GT. ISTOP ) GO TO 25 
      IF(ISTART+IPRS4-1.LT.ISTOP)ISTOP=ISTART+IPRS4-1 
1505  CALL DOIO(IGET(1656B)+IPRS3,ISTOP,LU2,IPRAM)
C 
C 
      IF(IPRAM(3).EQ.9999) GO TO 1
1510  IF(IPRS2.EQ.2) GO TO 1
      IF (INEED .EQ.0 ) GO TO 1 
C 
      CALL EXEC(3,LU2+1100B,1)
      CALL EXEC(2,LU2,IAUX,5) 
      ISTART = ISTOP + 1 + IPRS3
      ISTOP = ISTOP + INEED 
      IF(ISTART .GT.ISTOP) GO TO 25 
      IF(IPRS3 .EQ. 0 ) GO TO 1520
      IPRAM = IPRS3 
      IF(ISTART+IPRS4-1 .LT. ISTOP)ISTOP = ISTART+IPRS4-1 
1520  CALL DOIO(ISTART,ISTOP,LU2,IPRAM) 
      IF(IPRAM(3) .EQ. 9999) GO TO 1
      GO TO 1 
C 
C 
C******************* TRACE A LIST IN ANY MAP ************************** 
C 
1600  IPRAM(4) = -1 
1610  IF((IPRS2 .LT.1).OR. (IPRS2 .EQ.IPRS3))  GO TO 1
      CALL DOIO(IPRS2,IPRS2,LU2,IPRAM)
      IPRAM(3) = 1
      IF(IPRAM(4).EQ.0) IPRS2 = IGET(IPRS2) 
      IF(IPRAM(4).EQ.-1) IPRS2 = IXGET(IPRS2) 
      GO TO 1610
C 
C*********DISPLAY WHATEVER THE USER HAS INPUT ************
C 
C 
1700  IARRAY = IPRS2
      IPRAM = 0 
      IPRAM(3) = 1
      CALL DISC3(1,1,1,1,IARRAY,IPRAM,LU2,IDISC)
      GO TO 1 
C 
C 
C*********DISPLAY ABSOLUTE PROGRAM ON THE DISC*********** 
C 
C 
1800  IF(ISTOP - ISTART .EQ. 21) GO TO 1880 
      IF(ISTOP - ISTART .EQ. 8) ISTOP = ISTOP +1
      ISTART = IGET(ISTOP-1)
      IPRS2 = 2 
      IF(ISTART.LT.0) IPRS2 = 3 
      ISECTR = IAND(ISTART,177B)
      ITRK = (IAND(ISTART,77777B)/128)
C     SET A FLAG FOR THE DTRK SUBROUTINE
      IARRAY = -1 
      CALL DTRK(IPRS3+2,IARRAY,IARRAY(2),IPRAM,ISTOP,IARRAY)
C     ON RETURN IARRAY(1) =TRK#,IARRAY(2) = SECTR#
C     IWORD = WORD #
C 
      IPRS3 = ITRK+IARRAY 
      IPRS4 = ISECTR + IARRAY(2)
      IPRS5 = 1 
      IPRAM(4) = 1
      IF((IPRS4 -95).LE.0) GO TO 1850 
C     OPPS TOO MANY SECTORS 
C 
      IPRS3 = IPRS3 + 1 
      IPRS4 = IPRS4 - 96
C 
1850  GO TO 1000
1880  CALL EXEC(2,LU1,MEMR,7) 
      GO TO 1 
C 
C 
C************ LIST ANY LOCATION IN PHYSICAL MEMORY *********
C 
C 
1900  IF(((IPRS2.GT.1023).OR.(IPRS2.LT.0)).OR.(IPRS3.LT.1)) GO TO 25
      CALL DUMMY(IARRAY,ISTART) 
      IF(IPRS4.LT.1024) GO TO 1910
      ISTOP = IPRS4/1024
      IPRS2 = IPRS2 + ISTOP 
      IPRS4 = IPRS4 -(ISTOP * 1024) 
C 
1910  ISTOP = 63
      J = IPRS3 
      IPRAM(2) = 1
C 
      DO 1950 I = 1,IPRS3,64
      IPRAM = IPRS4 
      IPRAM(6) = IPRS2
      CALL MAPXX(IPRS2,IPRS4,IARRAY)
      IF(J .LT. 64) ISTOP = J - 1 
      CALL DOIO(ISTART,ISTART + ISTOP,LU2,IPRAM)
C 
      IF(IPRAM(3).EQ.9999) GO TO 1
      IPRAM(3) = 1
      J = J - 64
1950  CONTINUE
      GO TO 1 
C 
C 
C********  MAKE THE PROGRAM FRIENDLY FOR THE PEOPLE  ************ 
C 
9000  DO 9025 I = 1,27
      IF(IPRS2.EQ.IGO(I)) GO TO(9100,9200,9300,9960,9400,9500,9600, 
     &9700,9970,9800,9980,9900,9988,9992,9905,9910,9920,9930,9984,
     &9984,9982,9990,25,9940,9940,9940,9994) I
9025  CONTINUE
C 
C 
      CALL EXEC(2,LU2,IX,8) 
      CALL EXEC(2,LU2,I1,11)
      CALL EXEC(2,LU2,I2,13)
      CALL EXEC(2,LU2,I3,12)
      CALL EXEC(2,LU2,I4,9) 
      CALL EXEC(2,LU2,IP,16)
      CALL EXEC(2,LU2,I5,13)
      CALL EXEC(2,LU2,IT,17)
      CALL EXEC(2,LU2,IN,8) 
      CALL EXEC(2,LU2,IM,15)
      CALL EXEC(2,LU2,IPR,14) 
      CALL EXEC(2,LU2,IDP,22) 
      CALL EXEC(2,LU2,IPG,19) 
      CALL EXEC(2,LU2,I6,12)
      CALL EXEC(2,LU2,I7,9) 
      CALL EXEC(2,LU2,IQ,17)
      CALL EXEC(2,LU2,I9,14)
      CALL EXEC(2,LU2,IR,21)
      CALL EXEC(2,LU2,IG,11)
      CALL EXEC(2,LU2,IDI,28) 
      CALL EXEC(2,LU2,ILE,17) 
      CALL EXEC(2,LU2,IH,11)
      CALL EXEC(2,LU2,IJ,11)
      CALL EXEC(2,LU2,IK,9) 
      CALL EXEC(2,LU2,IL,12)
      CALL EXEC(2,LU2,IO,15)
      CALL EXEC(2,LU2,IPACK,23) 
      GO TO 1 
C 
C 
C 
C 
9100  CALL EXEC(2,LU2,ITEL1,9)
      CALL EXEC(2,LU2,ITEL2,9)
      CALL EXEC(2,LU2,ITEL3,16) 
      GO TO 9999
9200  CALL EXEC(2,LU2,ITEL4,5)
      CALL EXEC(2,LU2,ITEL5,19) 
      GO TO 9999
9300  CALL EXEC(2,LU2,ITEL8,5)
      CALL EXEC(2,LU2,ITEL9,23) 
      GO TO 9999
9400  CALL EXEC(2,LU2,ITEL7,6)
      CALL EXEC(2,LU2,ITEL6,12) 
      GO TO 9999
9500  CALL EXEC(2,LU2,ITEL10,5) 
      CALL EXEC(2,LU2,ITEL11,26)
      GO TO 9999
9600  CALL EXEC(2,LU2,ITEL12,7) 
      GO TO 1 
9700  CALL EXEC(2,LU2,ITEL13,11)
      GO TO 1 
9800  CALL EXEC(2,LU2,ITEL14,22)
      GO TO 1 
9900  CALL EXEC(2,LU2,ITEL15,11)
      GO TO 1 
9905  CALL EXEC(2,LU2,ITEL16,16)
      GO TO 9999
9910  CALL EXEC(2,LU2,ITEL18,17)
      GO TO 1 
9920  CALL EXEC(2,LU2,ITEL17,13)
      GO TO 1 
9930  CALL EXEC(2,LU2,ITEL26,2) 
      CALL EXEC(2,LU2,ITEL27,5) 
      CALL EXEC(2,LU2,ITEL28,13)
      GO TO 9999
9940  CALL EXEC(2,LU2,ITEL21,6) 
      CALL EXEC(2,LU2,ITEL20,6) 
      CALL EXEC(2,LU2,ITEL19,6) 
      GO TO 1 
9960  CALL EXEC(2,LU2,ITEL22,14)
      CALL EXEC(2,LU2,ITEL23,19)
      GO TO 9999
9970  CALL EXEC(2,LU2,ITEL24,17)
      GO TO 1 
9980  CALL EXEC(2,LU2,ITEL25,22)
      GO TO 1 
9982  CALL EXEC(2,LU2,ITEL30,5) 
      GO TO 1 
9984  ITEL31(2) = IPRS2 
      CALL EXEC(2,LU2,ITEL31,17)
      GO TO 1 
9988  CALL EXEC(2,LU2,ITEL33,11)
      GO TO 1 
9990  CALL EXEC(2,LU2,ITEL34,13)
      GO TO 9999
9994  CALL EXEC(2,LU2,ITEL36,13)
C 
9999  MORUSE(6) = IPRS2 
      CALL EXEC(2,LU2,MORUSE,8) 
      GO TO 1 
9992  CALL EXEC(2,LU2,ITEL35,2) 
      GO TO 1 
      END 
      SUBROUTINE DOIO(ISTART,ISTOP,LU,IPRAM)
      DIMENSION IBUF(25),IMESS(27),IPRAM(6),LMESS(17) 
      DIMENSION IPAGE(11) 
      INTEGER OBUF(37)
C 
      DATA IMESS/2H  ,2H  ,2H  ,2HWO,2HRD,
     &2H  ,2H  ,2HLO,2HCA,2HTI,2HON,2H  , 
     &2HVA,2HLU,2HE(,2H8),2H  ,2HVA,2HLU,2HE(,2H10,2H) ,
     &2HVA,2HLU,2HE(,2HAS,2H) / 
      DATA IPAGE/2H  ,2HPH,2HYS,2HIC,2HAL,2H P,2HAG,2HE / 
      DATA LMESS/2H  ,2HLO,2HCA,2HTI,2HON,2HS ,2H  ,2H  ,2H  ,
     &2H T,2HHR,2HOU,2HGH,2H  / 
      DATA IBUF/25*2H  /
C 
C 
C     THE IPRAM ARRAY TELLS HOW TO DO THE I/O 
C     IPRAM(1) = WORD # TO START COUNTING AT, 
C     IPRAM(2) = 0 MEANS WORD COUNT TO BE IN DECIMAL
C     IPRAM(2) = 1 MEANS WORD COUNT TO BE IN OCTAL
C     IPRAM(3) = 0 MEANS PRINT HEADER.  = 1 MEANS NO HEADER.
C     IPRAM(4) =-1 MEANS WE ARE DOING A CROSS MAP LOAD
C     IPRAM(5) = 1 MEANS A PACKED LISTING IS DESIRED
C     IPRAM(6) =+N MEANS A MAPPED IN LISTING OF PHYS MEMORY 
C                  WHERE N = PHYSICAL PAGE NUMBER 
C     IPRAM(6) =-1 MEANS WE ARE DOING NORMAL I/O
C 
C     ISTART IS LOCATION TO START COUNTING AT 
C     ISTOP IS LOCATION TO STOP COUNTING AT.
C     LU IS THE OUTPUT LU.
C 
C 
      K = IPRAM-1 
C 
      IF(IPRAM(5).EQ.1) GO TO 500 
C 
      IF(IPRAM(6).LT.0) GO TO 1 
      CALL CNUMD(IPRAM(6),IPAGE(9)) 
      CALL EXEC(2,LU,IPAGE,11)
1     IF(IPRAM(3).EQ. 0) CALL EXEC(2,LU,IMESS,-54)
C 
C 
      DO 100 I = ISTART,ISTOP 
      K = K + 1 
      IF((IPRAM(6).LT.0).OR.(K.NE.1024)) GO TO 2
      K = 0 
      IPRAM(6) = IPRAM(6) + 1 
2     CALL CNUMD(K,IBUF(3)) 
      IF(IPRAM(2) .EQ.1) CALL CNUMO(K,IBUF(3))
      CALL CNUMO(I,IBUF(8)) 
      IF(IPRAM(6).LT.0) GO TO 5 
      CALL CNUMD(IPRAM(6),IBUF(8))
      IBUF(8) = 2HPG
5     IF(IPRAM(4) .NE.-1) GO TO 50
      CALL CNUMO(IXGET(I),IBUF(13)) 
      CALL CNUMD(IABS(IXGET(I)),IBUF(18)) 
      IF(IXGET(I).LT.0)IBUF(18) = IBUF(18) + 6400B
C 
      CALL IASCI(IXGET(I),IBUF(25)) 
C 
      GO TO 75
50    CALL CNUMO(IGET(I),IBUF(13))
      CALL CNUMD(IABS(IGET(I)),IBUF(18))
      IF (IGET(I).LT.0) IBUF(18) = IBUF(18) + 6400B 
C 
      CALL IASCI(IGET(I),IBUF(25))
C 
75    CALL EXEC(2,LU,IBUF,-50)
      IF(IFBRK(IDMY))200,100
100   CONTINUE
      GO TO 300 
200   IPRAM(3) = 9999 
300   RETURN
C 
C 
500   K = ISTART
550   IF((ISTOP-K).LT.0) RETURN 
      CALL CNUMO(K,LMESS(7))
      CALL CNUMO(ISTOP,LMESS(15)) 
      IF(((ISTOP-K)/64).GT.0) CALL CNUMO(K + 63,LMESS(15))
C 
      IF(IPRAM(6).LT.0) GO TO 551 
      CALL CNUMO(IPRAM,LMESS(7))
      CALL CNUMO(IPRAM+ISTOP - ISTART,LMESS(15))
      CALL CNUMD(IPRAM(6),IPAGE(9)) 
C 
551   CALL EXEC(3,LU + 1100B,1) 
      IF(IPRAM(6).GE.0) CALL EXEC(2,LU,IPAGE,11)
      CALL EXEC(2,LU,LMESS,17)
      CALL EXEC(3,LU + 1100B,1) 
C 
      DO 800 I = 1,8
C 
      CALL PACK (ISTOP - K + 1,IPRAM(4)+1,K,OBUF) 
      CALL EXEC(2,LU,OBUF,37) 
C 
      K = K + 8 
      IF((ISTOP-K).LT.0) RETURN 
      IF(IFBRK(IDMY)) 200,800 
800   CONTINUE
C 
      GO TO 550 
      END 
      SUBROUTINE DISC3(LU,ITRK,ISECTR,INDEX,IARRAY,IPRAM,LU2,IDISC) 
      DIMENSION IARRAY(64),IPRAM(6),IBUF(17)
      INTEGER OBUF(37)
      DIMENSION IDISK(20),IDISC(20) 
      DATA IDISK/2H  ,2HWO,2HRD,2H  ,2H V,2HAL,2HUE,2H(8,2H) ,
     &           2H V,2HAL,2HUE,2H(1,2H0),2H  ,2HVA,2HLU,2HE(,
     &           2HAS,2H) / 
      DATA IBUF/17*2H  /
C 
C 
C    THIS SUBROUTINE DOES THE I/O FOR ALL DISC READS.  THE MAIN 
C    PROGRAM DOES THE READ PASSING THE 64 WORDS READ IN IARRAY. 
C    THIS ROUTINE FORMATS THE OUTPUT. 
C 
C    IN ADDITION IT DOES THE OUTPUT FOR THE ' DP ' INSTRUCTION
C    THIS IS A SLIGHT PERTERBATION FROM THE SUBROUTINES REAL
C    PURPOSE. 
C 
C 
C    IF IPRAM(1) #0  THEN 64 WORDS ARE OUTPUT 
C    IF IPRAM(1) =0  THEN ONLY ONE WORD IS OUTPUT 
C    IF IPRAM(3) # 0 THEN NO DISC TRK & SECTOR INFO IS PRINTED
C    IF IPRAM(4) = 1 THEN 64 WORDS ARE OUTPUT PLUS THE WORD # 
C    IF IPRAM(5) = 0 THEN A PACKED LISTING IS DESIRED 
C 
      CALL CNUMD(INDEX,IDISC(24)) 
      IF(IPRAM .EQ.0) GO TO 55
      NUMBR = 64
      INDEX = 1 
      ID = 19 
      IF(IPRAM(4).EQ.1) ID = 26 
      GO TO 100 
C 
55    NUMBR = 1 
      ID = 26 
C 
100   CALL CNUMD(LU,IDISC(3)) 
      CALL CNUMD(ITRK,IDISC(9)) 
      CALL CNUMD(ISECTR,IDISC(17))
      IF(IPRAM(3).NE.1) CALL EXEC(2,LU2,IDISC,ID) 
      IF(IPRAM(5).NE.1) CALL EXEC(2,LU2,IDISK,20) 
C 
      IF(IPRAM(5).EQ.1) GO TO 2000
C 
C 
      DO 1020 I = INDEX,NUMBR 
C 
      CALL IASCI(IARRAY(I),IBUF(17))
C 
C 
C 
C 
      CALL CNUMD(I,IBUF)
      CALL CNUMO(IARRAY(I),IBUF(5)) 
      CALL CNUMD(IABS(IARRAY(I)),IBUF(10))
      IF (IARRAY(I).LT.0) IBUF(10) = IBUF(10) + 6400B 
      CALL EXEC(2,LU2,IBUF,17)
      IF(IFBRK(IDUMY)) 999,1020 
1020  CONTINUE
      RETURN
 999  IPRAM(3) = 9999 
      RETURN
C 
C 
C     FIX UP A POINTER TO THE ARRAY IARRAY SO THAT THE
C     PACK ROUTINE WILL WORK. 
C 
2000  CALL DUMMY(IARRAY,IPOINT) 
C 
      DO 3000 I = 1,8 
      CALL PACK(8,1,IPOINT,OBUF)
      CALL EXEC(2,LU2,OBUF,37)
      IPOINT = IPOINT + 8 
      IF(IFBRK(IDUMY)) 999,3000 
3000  CONTINUE
      END 
      SUBROUTINE DTRK(IPRS1,ITRK,ISECTR,IWORD,ISTOP,IARRAY) 
      DIMENSION IARRAY(64)
C 
C     SEE WHETHER WE ARE LOOKING AT A PROGRAM OR OP SYS.
C 
      IF(ITRK.GE.0) GO TO 1200
C 
C     A PROGRAM ! 
C 
      IPAST = IPRS1 
      ISTART = 0
      GO TO 1240
C 
1200  CALL EXEC(1,102B,IARRAY,64,0,1) 
      DO 1207 I = 1,64
      IF(((IARRAY(I).EQ.2).AND.(IARRAY(I+1).EQ.2000B)).AND. 
     &(IARRAY(I+3).EQ.2000B))GO TO 1208 
1207  CONTINUE
C 
C 
C     GRANDFATHER DISC
C 
C 
C     BASE PAGE STARTS HERE 
      IBASE = 2 
C     ASSUME OP SYSTEM ENDS HERE
      ISTOP = 77770B
C     OP SYSTEM STARTS HERE 
      ISTART = 18 
C 
      GO TO 1233
C 
C 
C     STARTING SECTOR OF OP SYSTEM ON DISC
1208  ISTART = IARRAY(I+5)
C     LAST WORD OF OP SYSTEM
      ISTOP = IARRAY(I+4) 
C     STARTING SECTOR OF BASE PAGE VALUES ON THE DISC 
      IBASE = IARRAY(I+2) 
C 
C 
C SEE IF WORD IS ON BASE PAGE 
C 
1233  IPAST = IPRS1 - 1024
      IF(IPAST.GE. 0) GO TO 1240
C 
C     WORD ON BASE PAGE 
C 
      ITRK = 0
      ISTART = IBASE
      ITEMP = IPRS1 - 2 
      GO TO 1250
C 
C 
1240  ITRK = IPAST/6144 
      ITEMP = IPAST - (ITRK * 6144) 
1250  ISECTR = ITEMP/64 
      IWORD = ITEMP - (ISECTR * 64) 
      ISECTR = ISECTR +ISTART 
      IF((ISECTR - 95).LE.0) GO TO 1210 
C 
C OOPS TOO MANY SECTORS 
C 
      ITRK = ITRK + 1 
      ISECTR = ISECTR - 96
C 
C 
C 
C     CHANGE RANGE OF WORD FROM 0-63 TO 1-64 SO FORTRAN CAN HANDLE IT.
1210  IWORD = IWORD + 1 
      END 
ASMB,L
      NAM IXGET,7 
      ENT IXGET,XPUT,PACK,IASCI,DUMMY,MAPXX 
*     ENT IGET,IPUT 
      EXT $LIBR,$LIBX,.ENTR,.ENTP 
* 
* 
* 
*GET  NOP 
*     DLD IGET,I
*     SWP 
*     LDA A,I 
*     LDA A,I 
*     JMP B,I 
* 
* 
* 
IXGET NOP 
      DLD IXGET,I 
      SWP 
      LDA A,I 
      XLA A,I 
      JMP B,I 
* 
* 
* 
*PUT  NOP 
*     JSB $LIBR 
*     NOP 
*     LDA IPUT,I
*     STA IGET
*     ISZ IPUT
*     DLD IPUT,I
*     LDA A,I 
*     LDB B,I 
*     STB A,I 
*     JSB $LIBX 
*     DEF IGET
* 
* 
* 
XPUT  NOP 
      JSB $LIBR 
      NOP 
      LDA XPUT,I
      STA IXGET 
      ISZ XPUT
      DLD XPUT,I
      LDA A,I 
      LDB B,I 
      XSB A,I 
      JSB $LIBX 
      DEF IXGET 
* 
* 
* 
* 
* 
* 
* 
* 
*  THIS ROUTINE ACCEPTS UP TO 8 WORDS OF INPUT AND CONVERTS THOSE 
*  WORDS TO OCTAL ASCII IN A PACKED FORMAT .  EIGHT WORDS OF OCTAL
*  DELIMITED BY A * AND THEN THEIR ASIII REPRESENTATION.
*  THE WORDS MAY EITHOR BE IN THE SYSTEM MAP OR THE USER MAP
*  THE ROUTINE IS FORTRAN CALLABLE AS:
* 
*        CALL PACK(#WORDS,MAP,INPUT BUFFER,OUTPUT BUFFER) 
* 
*        MAP =  0    SYSTEM MAP 
*        MAP >= 1    USER MAP 
* 
*     THE OUTPUT BUFFER MUST BE 36 WORDS LONG 
* 
* 
* 
KOUNT NOP 
MAP   NOP 
INBUF NOP 
ASSLC NOP 
PACK  NOP 
      JSB .ENTR     GET THE PARAMETER ADDRESSES 
      DEF KOUNT 
* 
      LDA KOUNT,I    GET THE # OF WORDS TO CONVERT
BACK  CMA,INA       MAKE NEG AND
      SSA,RSS       IF 0 OR NEG WORDS INPUT THEN FORGET IT
      JMP PACK,I
      STA KOUNT     NOW SAVE FOR LOOP 
* 
      ADA D8        ADD 8 TO SEE IF INPUT # 
      SSA,RSS       GREATER THAN 8
      JMP CONTU     ALL IS WELL ! 
      LDA D8
      JMP BACK
* 
* 
CONTU LDA MAP,I     GET THE MAP AND SAVE
      STA MAP       FOR LATER 
* 
      LDA INBUF,I 
      STA INBUF 
* 
      LDA ASSLC     GET THE ADDRESS 
      LDB ASSLC     TWICE 
      STB TEMP      SAVE TEMPORARIALLY
      INA           BUMP IT 
      CLE,ELA       CONVERT TO A BYTE ADDRESS 
      STA ASSLC     AND SAVE FOR LATER
      ADB D29       NOW DEFINE THE ASCII ADDRESS
      STB OABUF     AND SAVE FOR THE IASCI SUBROUTINE 
      STB YTEMP 
* 
      LDA DM37      NOW CLEAR OUT THE OLD BUFFER
      STA XTEMP 
      LDB BLANK     GET A BLANK READY 
* 
LOOPX STB TEMP,I    SET A BLANK INTO THE OUTPUT BUFFER
      ISZ TEMP      STEP BUFFER POINTER 
      ISZ XTEMP     DONE YET ?
      JMP LOOPX     NO
* 
* 
* 
LOOP  LDB INBUF      GET THE 1ST WORD 
      LDA MAP        GET THE MAP TO USE 
      SZA,RSS        SYS MAP ?
      JMP SYSTM     YES 
      LDB B,I        NO 
      JMP OUT 
SYSTM XLB B,I        GET THE INFO FROM THE SYSTEM MAP 
OUT   STB XTEMP     SAVE FOR THE IASCI SUBROUTINE 
      JSB ASCI       AND CONVERT TO OCTAL ASCII 
* 
      JSB IASCI      AND PLACE THROUGH THE ASCII FILTER 
      DEF *+3 
      DEF XTEMP 
      DEF TEMP
* 
      STB OABUF,I    PUT RESULT INTO THE OUTPUT BUFFER
* 
      ISZ INBUF       BUMP OUR
      ISZ OABUF       POINTERS
      ISZ ASSLC       AND THE CHAR ADDRESS
* 
      ISZ KOUNT       ARE WE DONE ? 
      JMP LOOP        NOT YET 
* 
      CCB              YES,GET THE END OF THE OCTAL #'S 
      ADB YTEMP 
      LDA B,I       NOW GET THE LAST WORD 
      IOR ASTRK     PUT IN AN ASTRISK 
      STA B,I       NOW PUT IT BACK 
* 
      JMP PACK,I      RETURN TO THE CALLER
* 
* 
* 
*      ** DATA TO OCTAL ASCII CONVERSION ** 
      SPC 1 
*     CALLING SEQUENCE:  LDB (DATA WORD)
*                        LDA (ADDRESS AT START OF STORAGE)
*                        JSB ASCI 
      SPC 1 
ASCI  NOP           OUTPUT 6 DIGITS 
*     STA ASSLC     SET THE ADDRESS (NOT USED AT THE MOMENT ) 
      LDA KM6       GET NO. OF DIGITS TO CONVERT
      RBL           MOVE FIRST DIGIT TO LOW B 
      JSB NUM.F     CONVERT THE NUMBER
      JMP ASCI,I    RETURN
      SPC 2 
*SCI2 NOP           5 DIGITS & BLANK
*     LDA KM5       GET NO OF DIGITS TO CONVERT 
*     BLF           POSITION FIRST DIGIT
*     JSB NUM.F     CONVERT THE NUMBER
*     JMP ASCI2,I   RETURN
* 
*                   *********************************** 
*                   * CONVERT DIGITS TO ASCII  BASE 8 * 
*                   *********************************** 
* 
* 
NUM.F NOP 
      STA T1NUM     SAVE THE DIGIT COUNT
      CPA KM6       IF 6 THEN 
      CLA,INA,RSS   USE 1 AS A MASK FOR FIRST DIGIT 
NUM00 LDA K7        ELSE USE 7
      AND B         ISOLATE THE DIGIT 
      ADA "0"       ADD 60 TO MAKE ASCII
      JSB PUT.F     PUT IN THE BUFFER 
      BLF,RBR       POSITION THE NEXT DIGIT 
      ISZ T1NUM     DONE? 
      JMP NUM00     NO  DO NEXT DIGIT 
* 
      JMP NUM.F,I   YES RETURN
* 
T1NUM NOP 
KM6   DEC -6
* 
      SPC 2 
* 
*                   ********************************
*                   * PUT CHARACTER IN LIST BUFFER *
*                   ********************************
* 
PUT.F NOP 
      STB T1PUT     SAVE B
      LDB ASSLC     GET CURRENT BUFFER ADDRESS
      AND B177      ISOLATE THE CHARACTER 
      CLE,ERB       WORD ADDRESS TO B E=UPPER,LOWER FLAG
      SEZ,RSS       IF UPPER CHAR 
      ALF,SLA,ALF   POSITION AND SKIP 
      XOR B,I       INCLUSION OF HIGHER CHAR. 
      XOR B40       ADD,TAKE AWAY LOWER BLANK 
      STA B,I       SET THE WORD DOWN 
      ISZ ASSLC     STEP THE CHAR ADDRESS 
      LDB T1PUT     RESTORE B 
      JMP PUT.F,I   RETURN
* 
T1PUT NOP 
OABUF NOP 
B40   OCT 40
K7    DEC 7 
D8    DEC 8 
"0"   OCT 60
D29   DEC 29
DM37  DEC -37 
BLANK ASC 1,
ASTRK OCT 52        LOWER BYTE = *
B177  OCT 177 
TEMP  NOP 
D64   DEC 64
D1024 DEC 1024
XTEMP NOP 
YTEMP NOP 
ADDRS NOP 
PONTR NOP 
DUMMY NOP           THIS IS A DUMMY SUBROUTINE TO FIX UP A POINTER
      JSB .ENTR     SO THAT THE PACK ROUTINE CAN WORK WITH ARRAYS 
      DEF ADDRS     IN A PROGRAM AS WELL AS MEMORY ADDRESSES. 
* 
      LDA ADDRS 
      STA PONTR,I 
      JMP DUMMY,I 
      SPC 1 
* 
* 
* 
* 
* 
* 
*  THE IASCI SUBROUTINE TAKES ONE WORD OF INPUT AND CONVERTS THAT 
*  WORD TO ASCII.  IF ANY BYTE CAN NOT BE CONVERTED TO ASCII THEN 
*  AN ASCII BLANK IS RETURNED FOR THAT BYTE.
* 
* 
*    CALLING SEQUENCE :    JSB IASCI
*                          DEF RETURN 
*                          DEF VALUE    VALUE TO BE CONVERTED 
*                          DEF ASCII    RETURNED ASCII VALUE
*                       ----
* 
*   ON RETURN, THE B REGISTER HAS THE ASCII VALUE 
* 
VALUE NOP 
LOCTN NOP 
IASCI NOP 
      JSB .ENTR 
      DEF VALUE 
* 
      LDA VALUE,I   GET THE VALUE TO CONVERT
      STA TEMP1     SAVE IT 
      AND M377      KEEP ONLY LOWER BYTE
      JSB CNVRT     AND CONVERT 
      STB VALUE     SAVE THE RETURNED VALUE 
* 
      LDA TEMP1     GET THE WORD BACK AGAIN 
      AND M1774     KEEP ONLY THE UPPER BYTE
      ALF,ALF       SHIFT TO LOW ORDER
      JSB CNVRT     AND GO CONVERT
      BLF,BLF       PUT INTO UPPER BYTE 
      ADB VALUE     NOW MERGE ADD IN LOWER BYTE 
      STB LOCTN,I   AND RETURN IT TO THE USER 
      JMP IASCI,I 
* 
* 
*   THIS SUBROUTINE CONVERTS LOWER BYTE OF A TO ASCII AND PLACES
*   THE RETURNED ASCII INTO B 
* 
CNVRT NOP 
      STA B      AND SAVE 
      CMA,INA 
      ADA B135
      SSA           IS IT OK
      JMP BLNK2     NO
      LDA B40 
      CMA,INA 
      ADA B 
      SSA           OK ?
BLNK2 LDB B40       NO
      JMP CNVRT,I 
* 
* 
* 
* 
A     EQU 0 
B     EQU 1 
M1774 OCT 177400
B135  OCT 137 
M377  OCT 377 
TEMP1 NOP 
DM64  DEC -64 
SIGN  OCT 100000
* 
* 
*            ************************************** 
*            * MAP IN ANY PAGE OF PHYSICAL MEMORY * 
*            ************************************** 
* 
* 
* THE PURPOSE OF THIS SUBROUTINE IS TO MAP IN THE PAGE REQUESTED
* AND READ 64 WORDS OF THAT MAPPED PAGE.  THE ROUTINE IS FORTRAN
* CALLABLE.  TO BE USED ONE OF TWO CONDITIONS MUST BE MET.
* THE PROGRAM USING THE ROUTINE MUST NOT BE GREATER THAN 30K
* IN LENGTH (IE IF PROGRAM IS 10K AND LARGEST ADDRESSABLE 
* PARTITION IS 12K YOUR OK. IF LARGEST ADDRESSABLE PARTITION IS 
* 11K YOU HAVE PROBLEMS).  ALTERNATELY IF THE PROGRAM EXTENDS 
* INTO THE LAST TWO PAGES OF MEMORY MAKE SURE THIS ROUTINE
* AND THE INPUT PARAMETERS TO THIS ROUTINE DO NOT RESIDE THERE
* AND YOU WILL BE ALLRIGHT. 
* 
* THE PROGRAM MODIFIES THE USER MAP REGISTERS BUT ALSO RESTORES THEM. 
* 
* 
*      CALLING SEQUENCE  JSB MAPXX
*                        DEF RETURN 
*                        DEF PAGE#
*                        DEF OFFSET     (NOT GREATER THAN 1023 DECIMAL) 
*                        DEF ARRAY      (ARRAY OF 64 WORDS) 
* 
* 
* 
PAGE# NOP 
OFSET NOP 
ARRAY NOP 
* 
MAPXX NOP 
      JSB $LIBR 
      NOP 
      JSB .ENTP 
      DEF PAGE# 
* 
      LDA MPBUF     GET THE ADDRESS OF THE MAP BUFFER 
      ADA SIGN      SET THE SIGN BIT SO IT IS A READ
      USA           GET THE USER MAP
* 
      LDA MAP31     GET THE OLD VALUE 
      STA OLD31     AND SAVE IT 
      LDA MAP32     OLD VALUE.
      STA OLD32     SAVE THIS TOO 
      LDB PAGE#,I   GET THE DESIRED PAGE
      STB MAP31     PUT IT INTO THE OLD PAGE
      INB           BUMP PAGE # TO ACCOUNT FOR OVERFLOW 
      STB MAP32     SET NEXT PAGE INTO THE LAST LOCATION
* 
      LDA MPBUF     GET THE USER MAP BUFFER ADDRESS 
      USA           !!!!!! LOAD THE USER MAP !!!!!! 
* 
* 
* 
      LDA DM64      GET LOOP INDEX
      STA XTEMP 
      LDA START     GET THE START ADDRESS 
      ADA OFSET,I   ADD IN THE OFFSET 
      STA YTEMP     SAVE POINTER
      LDA ARRAY     GET ARRAY ADDRESS 
MLOOP LDB YTEMP,I   GET THE WORD
      STB A,I       AND PUT INTO BUFFER 
      ISZ YTEMP     BUMP OUR
      INA           POINTERS
      ISZ XTEMP     DONE ?
      JMP MLOOP     NO
* 
* 
      LDA OLD31     YES RESTORE THE USER MAP
      STA MAP31 
      LDA OLD32 
      STA MAP32 
* 
      LDA OFSET,I   GET THE OFFSET
      ADA D64       ADD 64 WORDS FOR WHAT WE JUST DID 
      CLB 
      DIV D1024     DIVIDE NEW OFFSET BY # OF WORDS IN PAGE 
      ADA PAGE#,I   ADD OLD PAGE # TO GIVE NEW PAGE # 
      STA PAGE#,I   AND SEND THE RESULT BACK
      STB OFSET,I   SEND THE NEW OFFSET BACK TOO
* 
      LDA MPBUF 
      USA           !!!!!!  RESTORE THE USER MAP  !!!!!!! 
* 
      JSB $LIBX     RESTORE INTERUPT SYSTEM 
      DEF MAPXX     AND RETURN TO CALLER
* 
* 
* 
START OCT 74000     START ADDRESS OF NEWLY MAPPED AREA
MPBUF DEF MAPIT 
MAPIT BSS 30         BUFFER FOR 1ST 30 WORDS OF USER MAP
MAP31 NOP            THIS LOCATION IS USED TO CHANGE MAP
MAP32 NOP            THIS LOCATION IS FOR I/O OVERFLOW
OLD31 NOP 
OLD32 NOP 
* 
* 
      END 
FTN4,L
      END$
                                                                                                                