FTN4,L
C 
C    VERSION   4 / 24 / 76   JRT
C    VERSION   6 / 08 / 77   MCC
C    VERSION   8 / 24 / 78   TEF
C    VERSION   1 / 18 / 79   LW/TEF SESSION MONITOR 
C    VERSION   9 / 24 / 79   DHP
C 
      PROGRAM JRSTR (3,60),24999-16049 REV.2024 800611  
C 
      DIMENSION LU(5),IREG(2),MBUF(52),IPBUF(33),IMBUF(33)
      DIMENSION IBUF(8321),JBUF(20000B),IANS(2),IHEAD(25) 
      DIMENSION KFILE(5)
      INTEGER FILE,SFLAG  
C 
      DIMENSION MESS1(8),MESS2(6),MESS3(9),MESS4(11),MESS5(9),MESS6(10) 
      DIMENSION MESS7(3),MESS9(4),MES10(22),MES11(19),MES12(6)
      DIMENSION MES20(19),MES21(14),MES22(17),MES23(14),MES24(15) 
      DIMENSION MES25(14),MES26(23),MES27(14),MES28(20),MES29(6)
      DIMENSION IVMESS(9),MES30(51),MES14(15) 
C 
      EQUIVALENCE (IA,IREG),(IB,IREG(2)),(X,IREG) 
      EQUIVALENCE (IBUF,ITRAK),(JBUF,IBUF(2)),(LU(2),LIST)
C 
      EQUIVALENCE (MBUF,IMBUF(2)),(MBUF(2),MBUF2),(IPBUF(2),IPBUF2),
     +            (JBUF(2),JBUF2),(JBUF(3),JBUF3),(JBUF(7),JBUF7),
     +            (JBUF(8),JBUF8),(JBUF(9),JBUF9),(JBUF(10),JBUF10),
     +            (IPBUF(5),IPBUF5),(IPBUF(6),IPBUF6) 
C 
      DATA KFILE/6412B,2H F,2HIL,2HE ,2H  / 
      DATA IVMESS/2H/J,2HRS,2HTR,2H: ,2HVE,2HRI,2HFY,2H ?,2H _/ 
      DATA JLNTH/20000B/,FILE/1/,SFLAG/0/ 
      DATA IMBUF/6412B/,IMBUF(32)/2H ?/,IMBUF(33)/2H _/ 
      DATA IHEAD/2H24,2H99,2H9-,2H16,2H04,2H9 ,2H20,2H24,2H S,2HOF,2HTW,
     &           2HAR,2HE ,2HSE,2HRV,2HIC,2HE ,2HKI,2HT ,2HSY,2HST,2HEM,
     &           2H 1,2H00,2H0 /
      DATA MESS1/6412B,2HMA,2HG ,2HTA,2HPE,2H L,2HU:,2H _/
      DATA MESS2/6412B,2HDI,2HSC,2H L,2HU:,2H _/
      DATA MESS3/2HTH,2HAT,2H'S,2H N,2HOT,2H A,2H D,2HIS,2HC!/
      DATA MESS4/2HTH,2HAT,2H'S,2H N,2HOT,2H A,2H M,2HAG,2H T,2HAP,2HE!/
      DATA MESS5/2HCA,2HN',2HT ,2HDO,2H T,2HHA,2HT ,2HLU,2H! /
      DATA MESS6/2HMA,2HX ,2H= ,2H50,2H, ,2HMI,2HN ,2H =,2H 1,2H! / 
      DATA MESS7/2HEN,2HD?,2H _/
      DATA MESS9/6412B,2HDO,2HNE,2H! /
      DATA MES10/6412B,2HMA,2HG ,2HTA,2HPE,2H F,2HIL,2HE:,2H (,2H-1,
     &           2H =,2H D,2HIR,2HEC,2HTO,2HRY,2H, ,2H0 ,2H= ,
     &           2HEN,2HD),2H _/
      DATA MES11/6412B,2H /,2HJR,2HST,2HR:,2H F,2HIL,2HE ,2H  ,2H U,
     &           2HNK,2HNO,2HWN,2H T,2HAP,2HE ,2HFO,2HRM,2HAT/
      DATA MES12/6412B,2HEO,2HF ,2HFO,2HUN,2HD!/
      DATA MES14/2H/J,2HSA,2HVE,2H: ,2HWA,2HIT,2HIN,2HG ,2HFO,
     &           2HR ,2HLU,2H# ,3*2H  / 
      DATA MES20/6412B,2HDI,2HRE,2HCT,2HOR,2HY ,2HIN,2HCO,2HNS,2HIS,
     &           2HTE,2HNC,2HY!,2H #,2H T,2HRA,2HCK,2H =,2H? /
      DATA MES21/2HLO,2HAD,2HIN,2HG ,2HCA,2HRT,2HRI,2HDG,2HE ,2H' ,2H  ,
     &           2H  ,2H  ,2H' /
      DATA MES22/2HPR,2HEV,2HIO,2HUS,2H D,2HIR,2HCT,2HOR,2HY ,2HAT,2H T,
     &           2HRA,2HCK,2H: ,2H  ,2H  ,2H  / 
      DATA MES23/2HDI,2HSC,2H (,2H L,2HU ,2H) ,2HMA,2HX ,2HTR,2HAC,2HK ,
     &           2H  ,2H  ,2H  /
      DATA MES24/2HLO,2HWE,2HST,2H T,2HRA,2HCK,2H O,2HN ,2HTH,
     &          2HIS,2H C,2HR:,2H  ,2H  ,2H  /
      DATA MES25/2HMO,2HVE,2H D,2HIR,2HCT,2HOR,2HY ,2HTO,2H N,2HEW, 
     &           2H T,2HRA,2HCK,2H ?/ 
      DATA MES26/6412B,2H(Y,2HES,2H,N,2HO,,2H O,2HR ,2HNE,2HW ,2HTR,
     &           2HAC,2HK ,2HNU,2HMB, 
     &           2HER,2H [,2H<=,2H0 ,2H= ,2HAB,2HOR,2HT],2H _/
      DATA MES27/2HDI,2HRE,2HCT,2HOT,2HY ,2HNO,2HW ,2HON,2H T,2HRA,2HCK,
     &           2H  ,2H  ,2H  /
      DATA MES28/6412B,2HCR,2H ',2H  ,2H  ,2H  ,2H' ,2HDI,2HRE,2HCT,
     &           2HOR,2HY ,2HON,2H T,2HRA,2HCK,2H  ,2H  ,2H  ,2H  / 
      DATA MES29/2HIN,2HPU,2HT ,2HER,2HRO,2HR! /
C 
      DATA MES30/6412B,2H /,2HJR,2HST,2HR:,2H W,2HAR,2HNI,2HNG,2H! ,
     + 2HDA,2HTA,2H E,2HXC,2HEE,2HDS,2H D,2HIS,2HC ,2HSP,2HAC,2HE , 
     +           2HFO,2HR ,2HLU,6412B,2H /,2HJR,2HST,2HR:,2H D,2HAT,
     +           2HA ,2HFR,2HOM,2H T,2HRA,2HCK,3*2H  ,2H O,2HN ,2HNO, 
     +           2HT ,2HRE,2HST,2HOR,2HED,2H! ,6412B/ 
C 
C 
      CALL RMPAR(LU)
      IF(LU.EQ.0)LU=1 
      IF(LIST .EQ. 0)LIST = LU
      ILU=LU+400B 
      CALL EXEC(2,ILU,IHEAD,25) 
      ASSIGN 30 TO IRTN 
C 
C 
C   GET MAG TAPE LU 
C 
10    CALL EXEC(2,ILU,MESS1,8)
      X=REIO(1,ILU,MBUF,10) 
      CALL PARSE(MBUF,IB*2,IPBUF) 
      MTLU=IPBUF2 
C 
      CALL EXEC(13,MTLU,ISTAT)
      LU2LK = MTLU
C 
C     ONLY DVR 23 OR 24 DEVICES ALLOWED.
C 
      IF(IAND(ISTAT,37400B)*2.EQ.23000B)GO TO 20
      IF(IAND(ISTAT,37400B)*2.EQ.24000B)GO TO 20
      CALL EXEC(2,ILU,MESS4,11) 
      GO TO 10
C 
20    IREG=LURQ(100001B,LU2LK,1)  
      IF(IREG.EQ.0)GO TO IRTN 
C 
C LOCK UNSUCCESSFUL, SO REPORT
C 
      CALL CNUMD(MTLU,MES14(13))
      IF (IMESS .EQ. 0)CALL EXEC(2,LU,MES14,15) 
C 
      IMESS = 1 
      CALL EXEC(12,0,2,0,-3)
      IF(IFBRK(IDMMY))410,20
30    REWIND MTLU 
      FILE=1
      IBROKE = 0
C 
C 
C  GET MAG TAPE FILE NUMBER  0 = END    <0 = PRINT DIRECTORY
C 
40    CONTINUE
C 
C     ASK FOR FILE #. 
C 
50    CALL EXEC(2,ILU,MES10,22) 
      SFLAG=1 
      LASTTR = 0
      IBUF = 2H   
      X=REIO(1,ILU,MBUF,10) 
      CALL PARSE(MBUF,IB*2,IPBUF) 
      NFILE=IPBUF2
      IF(NFILE .EQ. 0)GO TO 400 
C 
C     IF < 0 GO DO A DIRECTORY LIST 
C 
      IF(IBROKE .GE. 0)GO TO 60 
      CALL EXEC(3,MTLU+1400B) 
      X = EXEC(3,MTLU+600B) 
      IA = IAND(IA,100B)
      IF(IA .EQ. 0)CALL EXEC(3,MTLU+1300B)
60    IF(NFILE.LT.0)GO TO 310 
C 
C     IF = 0 QUIT.
C 
      IF(NFILE.LE.50)GO TO 65 
      CALL EXEC(2,ILU,MESS6,10) 
      GO TO 40
C 
C  DEOF FOUND RESTART 
C 
63    CALL EXEC(2,ILU,MES12,6)
      GO TO 40
C 
C   POSITION THE TAPE 
C 
C********************************** 
65    IF(NFILE .GT. 1)GO TO 67
      REWIND MTLU 
      FILE = 1
      GO TO 120 
67    IF(FILE.EQ.NFILE)GO TO 110
      CALL EXEC(3,MTLU+1400B) 
      IF(FILE.EQ.1)GO TO 70 
      CALL EXEC(3,MTLU+1300B) 
70    CALL EXEC(1,MTLU,MBUF,50) 
      CALL HEADL(MBUF,LEN,50) 
      KFILE(5)=KCVT(FILE) 
      CALL EXEC(2,ILU,KFILE,5)
      CALL EXEC(2,ILU,MBUF,LEN) 
C 
C                   FORWORD-BACK WORD  UP PROCESSOR 
C 
C 
      IF(NFILE.GT.FILE)GO TO 80 
      GO TO 90
C 
C 
C                   FORWORD 
C 
C 
80    CALL EXEC(3,MTLU+1300B) 
      FILE=FILE+1 
      IF(FILE.EQ.NFILE)GO TO 120
      KFILE(5)=KCVT(FILE) 
      CALL EXEC(2,ILU,KFILE,5)
      CALL EXEC(1,MTLU,MBUF,50) 
      CALL HEADL(MBUF,LEN,50) 
      CALL EXEC(2,ILU,MBUF,LEN) 
      GO TO 80
C 
C 
C                   BACK WORD 
C 
C 
90    FILE=FILE-1 
      CALL EXEC(3,MTLU+1400B) 
      CALL EXEC(3,MTLU+1400B) 
      IF(FILE.EQ.1)GO TO 120
      CALL EXEC(3,MTLU+1300B) 
      IF(FILE .EQ. NFILE)GO TO 120
      CALL EXEC(1,MTLU,MBUF,50) 
      KFILE(5)=KCVT(FILE) 
      CALL EXEC(2,ILU,KFILE,5)
      CALL HEADL(MBUF,LEN,50) 
      CALL EXEC(2,ILU,MBUF,LEN) 
      GO TO 90
C 
C 
C   GET HEADER AND CHECK IF THAT'S WHAT HE WANTS
C 
110   CALL EXEC(3,MTLU+1400B) 
      IF(FILE.EQ.1)GOTO 120 
      CALL EXEC(3,MTLU+1300B) 
120   X =  EXEC(1,MTLU,IBUF,JLNTH+1)
      HEDLNT = IB 
      IF(HEDLNT .EQ. 0)GO TO 63 
C 
C  IF DSAVE TAPE, SKIP HEADR STUFF
C 
      IF(HEDLNT .GT. 300)GO TO 180
C 
C  IF SAVE OR LSAVE FORMAT TELL HIM BUT STILL DISPLAY THE HEADR 
C 
      KFILE(5)=KCVT(FILE) 
      CALL EXEC(2,ILU,KFILE,5)
C       
C  CHECK FOR SAVE FORMAT
C 
      IF(HEDLNT .NE. 140)GO TO 122
      CALL HEADL(IBUF,LEN,36) 
      CALL EXEC(2,ILU,38H /JRSTR: SAVE FORMAT CAN NOT RESTOR !!,-38)  
      CALL EXEC(2,ILU,IBUF,LEN) 
      GO TO 50  
C 
C  CHECK FOR LSAVE FORMAT 
C 
122   IF(HEDLNT .NE. 247)GO TO 124
      CALL HEADL(IBUF,LEN,75) 
      CALL EXEC(2,ILU,39H /JRSTR: LSAVE FORMAT CAN NOT RESTOR !!,-39) 
      CALL EXEC(2,ILU,IBUF,LEN) 
      GO TO 50  
C 
C     SET UP A ' ? _' IN THE BUFFER.
C 
124   CALL HEADL(IBUF,LEN,50) 
      LEN=LEN+1 
      IBUF(LEN)=20077B
      LEN = LEN + 1 
      IBUF(LEN)=20137B
C***********************************************
      CALL EXEC(2,ILU,IBUF,LEN) 
      CALL REIO(1,ILU,IANS,2) 
      IF(IANS.EQ.2HYE)GO TO 180 
      IF(IANS.EQ.2HNO)GO TO 50
C**************************** 
      CALL EXEC(3,MTLU+1400B) 
      IF(FILE.EQ.1)GO TO 140
      CALL EXEC(3,MTLU+1300B) 
140   GO TO 120 
C 
C 
C     ASK FOR DISK LU #.
C 
180   CALL EXEC(2,ILU,MESS2,6)
      X=REIO(1,ILU,MBUF,10) 
      MES23(12)=MBUF
      MES23(13)=MBUF2 
      CALL PARSE(MBUF,IB*2,IPBUF) 
      IDISC=IABS(IPBUF2)
      IF(IPBUF5 .EQ. 1)LASTTR = IPBUF6
C 
C     DISK LU OK IF > 6 
C 
      IF(IDISC.GT.6.AND.IDISC.LT.63)GO TO 190 
      IF(IDISC.EQ.0)GO TO 40  
      CALL EXEC(2,ILU,MESS5,9)
      GO TO 180 
C 
190   CALL EXEC(13,IDISC,ISTAT) 
      ITYPE=IAND(ISTAT,37400B)/256
C 
C     THIS LU OK IF DVR IS 30 OR 32 
C 
      IF((ITYPE.EQ.31B).OR.(ITYPE.EQ.32B))GO TO 200 
      CALL EXEC(2,ILU,MESS3,9)
      GO TO 180 
C 
C   GET DIRECTORY TRACKS - PERHAPS MODIFY DIRECTORY TO PUT IT IN
C   A DIFFERENT TRACK THAN WHAT IT CAME FROM, AS FROM 7905 TO 7905
C   WITH DIFFERENT # TRACKS PER CARTRIDGE.
C 
C    MAG TAPE RECORD GIVES TRACK NUMBER THAT THE DIRECTORY CAME FROM... 
C    EXEC CALL GIVES LAST TRACK OF THE DISC WE'RE WRITING TO
C     IF THEY'RE THE SAME, JUST PROCEED.... 
C     IF DIFFERENT PRINT OUT CURRENT VALUES AND REQUEST OPERATOR
C       FOR DESIRED LOCATION OF DIRECTORY.
C 
C    NOW...  READ THE TAPE TO FIND SPECIFIED TRACK
C            GET MAX TRACK ON THIS DISC 
C            REQUEST CHANGE (IF ANY)
C            MODIFY DIRECTORY 
C            COPY ALL DIRECTORY TRACKS
C            GO TO COPY DOWN REMAINING TRACKS 
C 
C 
C     READ THE NEXT RECORD IF THE LAST WAS A HEADER (LENGTH <= 100).
C 
200   IF(HEDLNT.LE.100)CALL EXEC(1,MTLU,IBUF,JLNTH+1) 
      JLNTH = JBUF7 * 64
      LODIR=JBUF8 
      NDIR=ITRAK-LODIR+1
      LOWEST=JBUF10 
      MES21(11)=JBUF
      MES21(12)=JBUF2 
      MES21(13)=JBUF3 
      MES28(4) =JBUF
      MES28(5) =JBUF2 
      MES28(6) =JBUF3 
C 
C     #TRACKS SPECIFIED & FOUND ON TAPE DONT' MATCH.
C 
      IF(NDIR.EQ.-JBUF9)GO TO 210 
      CALL EXEC(2,ILU,MES20,19) 
      GO TO 40
C 
C     FORCE A SEEK BEYOND THE END OF THIS LU TO GET # TRKS. 
C 
210   X=EXEC(1,IDISC,IDMMY,1,32766,0) 
      MAXTRK=IB-1 
      IDELT=0 
      IMES = 0
      IF(LASTTR .EQ. 0)GO TO 220
      IPBUF2 = LASTTR 
      GO TO 230 
220   IF(ITRAK.EQ.MAXTRK)GO TO 250
C 
230   CALL CNUMD(ITRAK,MES22(15)) 
      CALL CNUMD(MAXTRK,MES23(12))
      CALL CNUMD(LOWEST,MES24(13))
      CALL EXEC(2,ILU,MES21,14) 
      CALL EXEC(2,ILU,MES22,17) 
      CALL EXEC(2,ILU,MES24,15) 
      CALL EXEC(2,ILU,MES23,14) 
      IF(LASTTR .NE. 0)GO TO 240
      CALL EXEC(2,ILU,MES25,14) 
      CALL EXEC(2,ILU,MES26,23) 
      X=REIO(1,ILU,MBUF,10) 
      CALL PARSE(MBUF,IB*2,IPBUF) 
C 
      IF(IPBUF2.LE.0)GO TO 40 
      IF(IPBUF.EQ.1)GO TO 240 
      IF(IPBUF2.NE.2HYE)GO TO 250 
      IPBUF2 = MAXTRK 
C 
240   IF(IPBUF2.GT.MAXTRK)GO TO 300 
      IDELT=IPBUF2-ITRAK
      IF(LOWEST .GT. (LODIR+IDELT))JBUF10 = LODIR + IDELT 
C 
C    HAVE ALL LU'S, NOW GO COPY THE DISC... 
C 
250   LASTTR = ITRAK + IDELT
      CALL CNUMD(LASTTR,MES28(18))
      CALL EXEC(2,ILU,MES28,20) 
      JBUF8=JBUF8+IDELT 
      GO TO 280 
C 
260   IF(IFBRK(0).GE.0)GO TO 270
      IBROKE = -1 
      GO TO 40
270   X=EXEC(1,MTLU,IBUF,JLNTH+1) 
      CALL EXEC(13,MTLU,ISTAT)
C 
C     END IF EOF ENCOUNTERED. 
C 
      IF(IAND(ISTAT,200B).NE.0)GO TO 360
280   KTRAK=ITRAK 
      IF(ITRAK .LT. LODIR .AND. ITRAK .GE. (LODIR+IDELT))GO TO 290
      IF(ITRAK.GE.LODIR)KTRAK=ITRAK+IDELT 
      CALL EXEC(2,IDISC,JBUF,JLNTH,KTRAK,0) 
      GO TO 260 
290   IF(IMES .EQ. 1)GO TO 260
      IMES = 1
C 
C " /JRSTR: WARNING! DATA EXCEEDS DISC SPACE FOR LU"
C " /JRSTR: DATA FROM TRACK XXXXXX ON NOT RESTORED!"
C 
      CALL CNUMD(ITRAK,MES30(39)) 
      CALL EXEC(2,ILU,MES30,51) 
      GO TO 260 
C 
C  ERROR
C 
300   CALL EXEC(2,ILU,MES29,6)
      GO TO 40
C 
C  DIRECTORY OF MAG TAPE
C 
C 
C     READ ONE RECORD FROM TAPE - LOOK FOR DEOF TO SIGNIFY
C     THE END OF TAPE.
C 
310   REWIND MTLU 
      FILE = 1
      IF (LIST .EQ. ILU)GO TO 315 
C 
C  GO LOCK LIST DEVICE
C 
      ASSIGN 315 TO IRTN
      LU2LK = LIST
      GO TO 20
315   X=EXEC(1,MTLU,JBUF,JLNTH) 
      IF(IB.NE.0)GO TO 320
C 
C  IF DEOF BACK UP TO BETWEEN DEOF
C 
      CALL EXEC(3,MTLU+1400B) 
      CALL EXEC(3,LIST+1100B,-1)
      GO TO 40
C 
320   IF(IFBRK(0).GE.0)GO TO 330
      CALL EXEC(3,MTLU+0200B) 
      CALL EXEC(3,LIST+1100B,-1)
      GO TO 40
C 
C     IF TRANSMISSION LOG TELLS US WHAT KIND OF FILE WE HAVE
C     BASED ON THE FOLLOWING LENGTHS: 
C 
C     JSAVE,WRITT  = <= 50 WORDS
C     DSAVE        = JLNTH WORDS
C     SAVE         = 140 WORDS
C     LSAVE,USAVE  = 247 WORDS
C 
330   KFILE(5) = KCVT(FILE) 
      CALL EXEC(2,LIST,KFILE,5) 
      IF(IB.LE.50)GO TO 334 
C 
C  CHECK FOR SAVE FORMAT
C 
      IF(IB.NE.140)GO TO 331
      CALL HEADL(IBUF,LEN,36) 
      CALL EXEC(2,LIST,39H  /JRSTR: SAVE FORMAT CAN NOT RESTOR !!,-39)    
      CALL EXEC(2,LIST,IBUF,LEN)  
      GO TO 340 
331   IF(IB.NE.247)GO TO 332
C 
C  CHECK FOR LSAVE FORMAT 
C 
      CALL HEADL(IBUF,LEN,75) 
      CALL EXEC(2,LIST,40H  /JRSTR: LSAVE FORMAT CAN NOT RESTOR !!,-40)   
      CALL EXEC(2,LIST,IBUF,LEN)  
      GO TO 340 
332   IF(IB.NE.JLNTH)GO TO 350
      CALL EXEC(2,LIST,22H, /JRSTR: DSAVE FORMAT ,11) 
      GO TO 340 
C 
C     ELSE - DISPLAY THE HEADER 
C 
334   CALL HEADL(IBUF,LEN,50) 
      LINE1 = LEN 
      DO 335 J=1,LEN
      IF (IBUF(J) .NE. 6412B)GO TO 335
      LINE1 = J 
      IBUF(J) = 2H
335   CONTINUE
      CALL EXEC(2,LIST,IBUF,LINE1)
      IF(LINE1.LT.LEN)CALL EXEC(2,LIST,IBUF(LINE1),LEN-LINE1) 
C 
C     AND FF TO THE NEXT FILE.
C 
340   CALL EXEC(3,MTLU+1300B) 
      FILE=FILE+1 
      GO TO 315 
C 
C  UNRECOGNIZED TAPE FORMAT 
C 
350   MES11(9) = KCVT(FILE) 
      CALL EXEC(2,LIST,MES11,19)  
      GO TO 340 
C 
C     SET UP A TEST FOR VERIFICATION
C 
360   FILE = FILE + 1 
C 
      CALL EXEC(2,ILU,IVMESS,9) 
      CALL REIO(1,ILU,IANS,1) 
      IF(IANS .NE. 2HYE) GO TO 390
C 
C     2-BF & 1-FF REQUIRED IF NOT FILE #2 
C 
      IF(FILE .EQ. 2) GO TO 380 
      CALL EXEC(3,MTLU+1400B) 
      CALL EXEC(3,MTLU+1400B) 
380   IF(FILE .EQ. 2)REWIND MTLU
      IF(FILE .NE. 2)CALL EXEC(3,MTLU+300B) 
C 
C     READ THE HEADER AGAIN 
C 
      X =  EXEC(1,MTLU,IBUF,100)
      CALL EXEC(2,ILU,IBUF,IB)
      CALL JVRFY(IBUF,LU,IDISC,MTLU,IDELT)
C 
C     UPDATE CRN ON DIRECTORY OF LU 2 
C 
390   CONTINUE
      CALL JDCMC(LU,IDISC,LASTTR) 
      GO TO 40
C 
C 
C  END:   REWIND TAPE AND TERMINATE 
C 
400   REWIND MTLU 
      CALL EXEC(2,ILU,MESS9,4)
C 
410   END 
      SUBROUTINE HEADL(IBUF,LEN,MAX)
     +,            REV.2024 800611  
      DIMENSION IBUF(MAX) 
C 
C     DO BACK SCAN ON IBUF TO FIND TRUE LENGTH OF RECORD
C 
10    DO 20  I=MAX,1,-1 
      IF(IBUF(I) .EQ. 2H  )GO TO 20 
      IF(IBUF(I) .NE.6412B)GO TO 30 
      I = I - 2 
      GO TO 30
20    CONTINUE
      LEN = 1 
30    LEN = I + 1 
C 
      RETURN
      END 
      SUBROUTINE JVRFY(IBUFF,LUCRT,LUDISK,LUMT,IDELT) 
     +,24999-16163 REV.1932  790810 
C 
C     THIS SUBROUTINE IS DESIGNED TO COMPARE THE CONTENTS OF
C     A MAG TAPE FILE AGAINST THE CONTENTS OF A DISK TRACK. 
C     THE MAG TAPE FORMAT SHOULD BE:
C                   6145 OR 8193 WORDS LONG 
C                   WHERE WORD #1 IS THE TRACK #. 
C                   TERMINATION WILL OCCUR UPON READING EOF.
C     THE MAG TAPE MUST BE POSITIONED TO THE FIRST DISC IMAGE RECORD
C     BEFORE SCHEDULING THIS SUBROUTINE.
C 
C     FORM OF CALL: 
C                   CALL JVRFY(IBUFF,LUCRT,LUDISK,LUMT,IDELT) 
C 
C     WHERE:
C                   LUCRT - LU WHERE MESSAGES WILL BE SENT
C 
C                   LUDISK - LU # OF THE DISK SUBCHANNEL
C                   TO BE VERIFIED. 
C 
C                   LUMT - LU # OF THE MAG TAPE.
C 
C                   IDELT = OFFSET BETWEEN THE OLD DIRECTORY AND A
C                           THE NEW DIRECTORY IF IT HAS BEEN MOVED
C 
C     IPBUF(1) = 0 - COMPARE GOOD.
C     IPBUF(2) = # OF MAG TAPE RECORDS TESTED.
C 
C     IPBUF(1) = -1 MAG TAPE COMPARE ERROR
C     IPBUF(2) = MAG TAPE RECORD NUMBER 
C     IPBUF(3) = TRACK #
C     IPBUF(4) = SECTR #
C     IPBUF(5) = WORD OFFSET
C 
C     IPBUF(1) = -2 - MAG TAPE STATUS ERROR 
C     IPBUF(2) = MAG TAPE RECORD NUMBER 
C     IPBUF(3) = EQT #5 STATUS INFO 
C 
C     IPBUF(1) = -3 - MAG TAPE RECORD LENGTH ERROR
C     IPBUF(2) = MAG TAPE RECORD NUMBER 
C     IPBUF(3) = LENGTH OF MAG TAPE RECORD. 
C 
C     IPBUF(1) = -4 - DISK READ ERROR.
C     IPBUF(2) = MAG TAPE RECORD NUMBER 
C     IPBUF(3) = EQT #5 STATUS INFO.
C 
      DIMENSION IBUFF(1),IPBUF(5),LENB(7),ISCTRS(7),IREG(2) 
      DIMENSION LENC(7) 
C 
      DIMENSION JVM10(28),JVM20(31),JVM30(28),JVM40(46),JVM50(18) 
C 
      EQUIVALENCE (REG,IREG),(IREG(2),IBREG)
C 
      EQUIVALENCE (IPBUF(1),IPBUF1),(IPBUF(2),IPBUF2),(IPBUF(3),IPBUF3),
     +            (IPBUF(4),IPBUF4),(IPBUF(5),IPBUF5) 
C 
      EQUIVALENCE (JVM10(18),JVM118),(JVM10(26),JVM126) 
      EQUIVALENCE (JVM20(21),JVM221),(JVM20(29),JVM229) 
      EQUIVALENCE (JVM30(18),JVM318),(JVM30(26),JVM326) 
      EQUIVALENCE (JVM40(17),JVM417),(JVM40(29),JVM429),
     +            (JVM40(37),JVM437),(JVM40(44),JVM444) 
      EQUIVALENCE (JVM50(12),JVM512)
C 
      DATA JVM10/2H /,2HJS,2HAV,2HE:,2H D,2HIS,2HK ,2HRE,2HAD,2H E,2HRR,
     &           2HOR,2H -,2H S,2HTA,2HTU,2HS ,3*2H  ,2H R,2HEC,2HOR, 
     &           2HD ,2H# ,3*2H  /
C 
      DATA JVM20/2H /,2HJS,2HAV,2HE:,2H M,2HT ,2HRE,2HCO,2HRD,2H L,2HEN,
     &           2HGT,2HH ,2HER,2HRO,2HR ,2H- ,2HLE,2HNG,2HTH,3*2H  , 
     &           2H R,2HEC,2HOR,2HD ,2H# ,3*2H  / 
C 
      DATA JVM30/2H /,2HJS,2HAV,2HE:,2H M,2HT ,2HST,2HAT,2HUS,2H E,2HRR,
     &           2HOR,2H -,2H S,2HTA,2HTU,2HS ,3*2H  ,2H R,2HEC,2HOR, 
     &           2HD ,2H# ,3*2H  /
C 
      DATA JVM40/2H /,2HJS,2HAV,2HE:,2H C,2HOM,2HPA,2HRE,2H E,2HRR,2HOR,
     &           2H R,2HEC,2HOR,2HD ,2H# ,3*2H  ,6412B, 
     &           2H /,2HJS,2HAV,2HE:,2H T,2HRA,2HCK,2H #,3*2H  ,2H S, 
     &           2HEC,2HTO,2HR ,2H# ,3*2H  ,2H O,2HFF,2HSE,2HT ,3*2H  / 
C 
      DATA JVM50/2H /,2HJS,2HAV,2HE:,2H C,2HOM,2HPA,2HRE,2H G,2HOO,2HD.,
     &           3*2H  ,2H R,2HEC,2HOR,2HDS/
C 
      DATA LENB/128,256,512,1024,2048,2176,2048/
      DATA LENC/129,257,513,1025,2049,4097,6273/
      DATA ISCTRS/0,2,6,14,30,62,96/
C 
C 
      ICOUNT = 0
C 
C     GET A MAG TAPE RECORD AND TEST FOR EOF
C 
10    IF(IFBRK(IDMY) .LT. 0) GO TO 100
      REG=EXEC(1,LUMT,IBUFF(128),8193)
C 
C  IF FIRST TIME THROGH SET VALUES
C     (IBUFF(136) == WORD 7 OF DIRECTORY [LOWEST DIRECTORY TRACK])
C     (IBUFF(138) == WORD 9 OF DIRECTORY [NEXT AVAILABLE TRACK])
C 
      IF(ICOUNT .GT. 0)GO TO 15 
      LODIR = IBUFF(136)
      IBUFF(136) = IBUFF(136) + IDELT 
      IF(IBUFF(138) .GT. IBUFF(136))IBUFF(138) = IBUFF(136) 
C 
C     FINISHED IF EOF FOUND 
C 
15    IF(IAND(IREG,200B) .NE. 0) GO TO 100
C 
C     ANY OTHER STATUS EXCEPT NO WRITE RING IS AN ABORT CONDITION.
C 
      IF(IAND(IREG,373B) .NE. 0) GO TO 200
C 
C     RECORD LENGTH MUST BE 6145 OR 8193
C 
      IF(IBREG .NE. 6145) GO TO 20
      ITMS = 6
      GO TO 40
20    IF(IBREG .NE. 8193) GO TO 300 
      ITMS = 7
C 
C     TRACK # IS IN FIRST WORD. 
C 
40    ITRK = IBUFF(128) 
      IF(ITRK .GE. LODIR)ITRK = ITRK + IDELT
       ICOUNT = ICOUNT + 1
      IF(ITRK .LT. LODIR .AND. ITRAK .GE. (LODIR+IDELT))GO TO 10
C 
C     NOW GET AND TEST THE CONTENTS OF ONE TRACK (6 READS)
C 
      DO 50 I=1,ITMS
      LENGTH = LENB(I)
      INDEX = LENC(I) 
C 
      REG = EXEC(1,LUDISK,IBUFF,LENGTH,ITRK,ISCTRS(I))
C 
      IF(IAND(IREG,1) .NE. 0) GO TO 400 
C 
      CALL CMPWD(IBUFF,IBUFF(INDEX),LENGTH,IERR)
      IF(IERR .NE. 0) GO TO 500 
C 
50    CONTINUE
      GO TO 10
C 
C     GOOD COMPLETION 
C 
100   IPBUF1 = 0
      GO TO 1000
C 
C     MAG TAPE STATUS ERROR.
C 
200   IPBUF1 = -2 
      IPBUF3 = IREG 
      GO TO 1000
C 
C     MAG TAPE RECORD LENGTH ERROR. 
C 
300   IPBUF1 = -3 
      IPBUF3 = IBREG
      GO TO 1000
C 
C     DISK READ ERROR.
C 
400   IPBUF1 = -4 
      IPBUF3 = IREG 
      GO TO 1000
C 
C     COMPARE ERROR.
C 
500   IPBUF1 = -1 
      IPBUF3 = ITRK 
      IPBUF4 = ISCTRS(I) + IERR/64
      IPBUF5 = MOD(IERR,64) 
C 
C     FINISHED. 
C 
C     WRITE A MESG IF LUCRT IS GIVEN
C 
1000  IPBUF2 = ICOUNT 
C 
      IGO = IPBUF1 + 5
      GO TO (1010,1020,1030,1040,1050),IGO
C 
1010  CALL CNUMO(IPBUF3,JVM118) 
      CALL CNUMD(IPBUF2,JVM126) 
      CALL EXEC(2,LUCRT,JVM10,28) 
C011  FORMAT(" /JVRFY: DISK READ ERROR - STATUS ",K6," RECORD #",I4)
      GO TO 2000
C 
1020  CALL CNUMD(IPBUF3,JVM221) 
      CALL CNUMD(IPBUF2,JVM229) 
      CALL EXEC(2,LUCRT,JVM20,31) 
C021  FORMAT(" /JVRFY: MT RECORD LENGTH ERROR - LENGTH ", 
C    +       I5," RECORD #",I4) 
      GO TO 2000
C 
1030  CALL CNUMO(IPBUF3,JVM318) 
      CALL CNUMD(IPBUF2,JVM326) 
      CALL EXEC(2,LUCRT,JVM30,28) 
C031  FORMAT(" /JVRFY: MT STATUS ERROR - STATUS ",K6," RECORD #",I4)
      GO TO 2000
C 
C 
1040  CALL CNUMD(IPBUF2,JVM417) 
      CALL CNUMD(IPBUF3,JVM429) 
      CALL CNUMD(IPBUF4,JVM437) 
      CALL CNUMD(IPBUF5,JVM444) 
      CALL EXEC(2,LUCRT,JVM40,46) 
C041  FORMAT(" /JVRFY: COMPARE ERROR RECORD #",I4/, 
C    +       " /JVRFY: TRACK #",I4," SECTOR #",I4," OFFSET",I4) 
      GO TO 2000
C 
1050  CALL CNUMD(IPBUF2,JVM512) 
      CALL EXEC(2,LUCRT,JVM50,18) 
C051  FORMAT(" /JVRFY: COMPARE GOOD. ",I4," RECORDS") 
C 
2000  IBUFF = IPBUF1
      RETURN
      END 
      END$
ASMB,R,L,C,Z
      IFN 
      HED WORD COMPARE FOR 2100 & EARLIER CPU 
      NAM CMPWD,7 WORD COMPARE FOR 2100 & EARLIER CPU 6/10/77 
      XIF 
      IFZ 
      HED WORD COMPARE FOR 21MX & LATER CPU 
      NAM CMPWD,7 WORD COMPARE FOR 21MX & LATER CPU 6/10/77 
      XIF 
      ENT CMPWD 
      EXT .ENTR 
      SKP 
*     THIS PROGRAM WILL COMPARE THE CONTENTS OF TWO BUFFERS 
*      AND RETURN:
*                   IERR = 0  -  GOOD COMPARE 
*                   IERR = +N -  ERROR DETECTED.
*     WHERE N = BUFFER INDEX OF FAILED COMPARISON.
* 
*     THIS PROGRAM WILL RETURN AFTER ENCOUNTERING THE FIRST 
*     COMPARE FAILURE.
* 
*     THIS PROGRAM IS FORTRAN CALLABLE AS FOLLOWS:
*     CALL CMPWD(BUF1,BUF2,LENGTH,IERR) 
*            - OR - 
*     REG = CMPWD(BUF1,BUF2,LENGTH,IERR)
*     WHERE IERR IS RETURNED IN THE 'A' REGISTER. 
* 
*     CONDITIONAL ASSEMBLY REQUIRED FOR COMPUTER TYPE:
*                   N FOR 2100 OR EARLIER MODELS
*                   Z FOR 21MX OR LATER MODELS
* 
*     MCC 6/10/77 
* 
      SKP 
BUFF1 NOP 
BUFF2 NOP 
LENTH NOP 
IERR  NOP 
CMPWD NOP 
      SPC 1 
      JSB .ENTR 
      DEF BUFF1 
      SPC 1 
      IFN 
      LDA LENTH,I    GET THE BUFFER LENGTH
      CMA,INA       COMPLEMENT AND SAVE IT
      STA COUNT 
      SPC 1 
LOOP  LDA BUFF1,I   GET FIRST WORD
      XOR BUFF2,I   XOR WITH SECOND 
      SZA           OK IF ZERO RESULTS. 
      JMP ERROR     NO - ERROR. 
      SPC 1 
      ISZ COUNT     YES - FINISHED IF COUNT = 0 
      JMP INCR
      SPC 1 
      JMP OUT         FINISHED
      SPC 1 
INCR  ISZ BUFF1     INCREMENT BOTH BUFFER ADDRESSES 
      ISZ BUFF2 
      JMP LOOP      GO TEST THE NEXT TWO. 
      SPC 1 
ERROR ISZ COUNT     SET UP THE
      LDA LENTH,I   ERROR COUNT 
      ADA COUNT     FOR RETURN
      JMP BAD       THEN RETURN 
      SKP 
      XIF 
      IFZ 
      LDA BUFF1     GET THE TWO ADDRESSES IN 'A' & 'B'
      LDB BUFF2 
      CMW LENTH,I   GO TEST THESE ARRAYS
      JMP OUT       GOOD RETURN HERE. 
      SPC 1 
      NOP           ERROR RETURN HERE 
      LDB BUFF1     GET THE START ADDRESS 
      CMB,INB       AND SUBTRACT FROM 
      ADA B         PRESENT ADDRESS FOUND IN 'B'
      INA 
      JMP BAD       RETURN THE ERROR INDEX
      XIF 
      SKP 
OUT   CLA           GOOD RETURN HERE. 
      SPC 1 
BAD   STA IERR,I
      JMP CMPWD,I 
      SKP 
COUNT NOP 
A     EQU 0 
B     EQU 1 
      END 
ASMB,R,L
* 
************************************************************* 
*                                                           * 
*      UTILITY TO PERFORM A                                 * 
*           :DC,-LU                                         * 
*           :MC,LU                                          * 
*      WITHOUT CHANGING THE ORDER OF THE CARTRIDGES         * 
*      IN THE DIRECTORY.                                    * 
*                                                           * 
*      THIS UTILITY PATCHES THE CARTRIDGE DIRECTORY         * 
*      ON LU 2.                                             * 
*                                                           * 
*      WRITTEN BY:   TEF 8/24/78                            * 
*     MODIFIED BY:   DHP 8/10/79 FOR SESION MONITOR         * 
*                                                           * 
************************************************************* 
* 
      NAM  JDCMC,7   UTILITY TO DO A DCMC 790919
* 
      EXT  .ENTR,EXEC,$LIBR,$LIBX,REIO,PARSE,CNUMD
      EXT  $BMON,KCVT 
* 
      ENT  JDCMC
* 
      SUP PRESS EXTRANIOUS LISTINGS 
* 
*     CARTRIDGE DIRECTORY 
* 
STRCK BSS  1
SICNW OCT  000102 
SBUF  BSS  128
SBAD  DEF  SBUF 
SBADR DEF  SBUF 
SOVFL DEF  SBUF+124 
POINT BSS  1
* 
*     FILE DIRECTORY
* 
FTRCK BSS  1
FICNW OCT  074100 
FBUF  BSS  128
* 
*     TRACK ASSIGNMENT TABLE SAVE VALUES
* 
LTAT  BSS  1
DRTR  BSS  1
* 
*     INPUT/OUTPUT
* 
OUTMS ASC  2,LU # 
OUTLU BSS  3
      ASC 9, ALREADY OWNS ID #
OUTID BSS  3
      ASC  8, ENTER NEW ID? _ 
INCTL OCT  000400 
INID  BSS  33 
INLN  DEC  33 
PBUF  BSS  33 
* 
*     CONSTANTS 
* 
DISID NOP           -LU OF DISC 
SIZE  NOP           NUMBER OF TRACKS
SCBCD NOP           SST LENGTH WORD 
D0    DEC  0
D1    DEC  1
D2    DEC  2
D3    DEC  3
D4    DEC  4
D6    DEC  6
D25   DEC  25 
D128  DEC  128
DN1   DEC  -1 
* 
*     ERROR OUTPUT
* 
EMES  ASC  5,DCMC ERR 
ENUM  BSS  1
E1    ASC  1,L2 
E2    ASC  1,L3 
E3    ASC  1,NF 
E4    ASC  1,L0 
E5    ASC  1, 5 
E6    ASC  1,OV 
E7    ASC  1,NN 
E8    ASC  1,NG 
E9    ASC  1,ZE 
* 
      SKP 
************************************************************* 
*                                                           * 
*      START JDCMC                                           *
*                                                           * 
************************************************************* 
* 
LU    NOP           CRT 
IDISC NOP           DISC LU 
LASTR NOP           LAST TRACK OF CART. JUST RESTORED 
* 
JDCMC NOP 
      JSB  .ENTR    GET LU FROM INPUT PARAMETER 
      DEF LU
      LDA LU,I      GET CRT 
      STA LU         SAVE AS LOCAL VALUE
      LDA IDISC,I   SAME FOR DISC 
      STA IDISC      SAVE IT LOCAL TOO
      CMA,INA       SAVE AS -LU ALSO
      STA DISID 
      LDA LASTR,I     AND FINALLY 
      STA LASTR 
      ADA D1        ADD 1 FOR SIZE
      STA SIZE
* 
      LDA $BMON     CHECK WHAT OP. SYS. WHERE IN
      SZA,RSS 
      JMP DC.1      RTE -IV A 
* 
      JSB KCVT      CONVERT LU TO ASCII 
      DEF *+2 
      DEF IDISC 
      STA MES1+21   SAVE IN MESSAGE 
      STA MES1+27 
* 
      JSB EXEC      PRINT MESSAGE TO DO 
      DEF RTN         A :DC :MC ON LU XX. 
      DEF D2
      DEF LU
      DEF MES1
      DEF LEN1      LENGTH
RTN   JSB JDCMC,I   RETURN TO CALLER
* 
LEN1  DEC 29
MES1  OCT 6412
      ASC 13, TO UPDATE YOUR CART. LIST 
      OCT 6412
      ASC 14, DO A ':DC,-00,RR & :MC,00'. 
* 
*  THE FOLLOWING CODE CAN BE USED FOR AUTOMATIC MOUNTING OF THE DISC
*  LU.  IT HAS A NUMBER OF LIMITATIONS HOWEVER AND WAS NOT ADDED
*  IN THE INTEREST OF VERSATILITY AND PROGRAM SIZE.  FUTURE REVISIONS 
*  MAY INCLUDE THESE ENHANCEMENTS DEPENDING ON THE NEED.
* 
*     JSB $ESTB     GET THE SST LENGTH WORD 
*     STB SCBCD 
* 
*     JSB DCMC      CALL SESSION TO DO A DCMC 
*     DEF RTN 
*     DEF ENUM
*     DEF D3        CODE = 3 MOUNT LU AND CHANGE CRN IN CL
*     DEF DISID     -LU OF DISC 
*     DEF D0        P/G = 0 = PRIVATE 
*     DEF SIZE      SIZE OF THE DISC
*     DEF D0        IDENT (NOT USED)
*     DEF D0        DIRTK (NOT USED)
*     DEF D0        LABEL (NOT USED)
*     DEF SCBCD     SSB LENGTH WORD 
*     DEF D0        SECT (NOT USED) 
*RTN  JMP JDCMC,I   RETURN TO CALLER
* 
*     READ CARTRIDGE DIRECTORY
DC.1  LDA  1756B    A=#TRACKS ON LU2
      ADA  DN1      A=LAST FMP TRACK ON LU2 
      STA  STRCK
      JSB  EXEC     READ
      DEF  *+7
      DEF  D1 
      DEF  SICNW         CARTRIDGE
      DEF  SBUF 
      DEF  D128 
      DEF  STRCK
      DEF  D0                 DIRECTORY 
*     FIND CARTRIDGE POINTED TO BY LU 
D.1   LDB  SBADR    B=START OF SBUF 
      LDA  1,I      A=LU OF 1ST CARTRIDGE 
      SZA,RSS 
      JMP  ER3      CARTRIDGE NOT FOUND 
      CPA  LU+1 
      JMP  D.2      CARTRIDGE FOUND 
      ADB  D4       B=ADDRESS OF NEXT LU
      STB  SBADR    SBADR= "  "   "    "
      CMB,INB       CHECK 
      ADB  SOVFL         FOR
      SSB,RSS                 OVERFLOW
      JMP  D.1      CHECK NEXT LU 
      JMP  ER6      OVERFLOW ERROR
*     LU FOUND IN CARTRIDGE TABLE 
*     FIND CARTRIDGE SPEC ENTRY 
D.2   LDA LASTR     A=LAST FMP TRACK ON LU
      STA  FTRCK
      LDA  IDISC     PREPARE
      IOR  FICNW
      STA  FICNW         ICNWD
      JSB  EXEC     READ
      DEF  *+7
      DEF  D1 
      DEF  FICNW
      DEF  FBUF          FILE 
      DEF  D128 
      DEF  FTRCK
      DEF  D0                 DIRECTORY 
* 
*     CHECK FOR DUPLICATE ID'S
* 
      LDB  SBAD               B=START OF BUFFER 
      RSS 
D.3   LDB  POINT              POINT POINTS TO CURRENT LU
      CPB  SBADR              IS THIS THE LU TO BE CHANGED? 
      RSS                     YES 
      JMP  *+4                NO
      ADB  D4                 B POINTS TO NEXT LU 
      STB  POINT              POINT " " " 
      JMP  D.3                DO IT AGAIN 
      LDA  1,I                A " " " 
      SZA,RSS                 END OF LIST ? 
      JMP  D.5                YES 
      ADB  D2                 B POINTS TO CARTRIDGE/
      LDA  1,I                A=CURRENT ID
      CPA  FBUF+3             CHECK ID
      JMP  D.4                DUPLICATE ID FOUND
      ADB  D2                 B=ADDRESS OF NEXT LU
      STB  POINT              SAVE THIS 
      CMB,INB                 CHECK 
      ADB  SOVFL                 FOR
      SSB,RSS                       OVERFLOW
      JMP  D.3                CHECK NEXT LU 
      JMP  ER6                OVERFLOW
*     DUPLICATE ID - GET NEW ID FROM LOGLU
D.4   LDA  POINT              GET DUP LU ADDRESS
      STA  *+3                SAVE FOR OUTPUT 
      JSB  CNUMD              CONVERT 
      DEF  *+3                   LU 
      BSS  1                        TO
      DEF  OUTLU                       ASCII
      JSB  CNUMD              CONVERT 
      DEF  *+3                   ID 
      DEF  FBUF+3                   TO
      DEF  OUTID                       ASCII
      JSB  EXEC               OUTPUT
      DEF  *+5
      DEF  D2                    WARNING
      DEF  LU 
      DEF  OUTMS                    MESSAGE 
      DEF  D25
      LDA  INCTL
      IOR  LU 
      STA  INCTL
      JSB  REIO               INPUT 
      DEF  *+5
      DEF  D1 
      DEF  INCTL
      DEF  INID                  NEW
      DEF  INLN                      ID 
      RBL 
      STB  INLN 
      JSB  PARSE              PARSE 
      DEF  *+4
      DEF  INID                  ID 
      DEF  INLN 
      DEF  PBUF 
      LDA  PBUF+1             A=NEW ID
      SSA                     IS INPUT NEGATIVE 
      JMP  ER8                YES 
      SZA,RSS                 IS INPUT ZERO 
      JMP  ER9                YES 
      STA  FBUF+3             SAVE NEW ID 
      JSB  EXEC               KEEP
      DEF  *+7
      DEF  D2                    NEW
      DEF  FICNW
      DEF  FBUF                     FILE
      DEF  D128 
      DEF  FTRCK
      DEF  D0                          DIRECTORY
      JMP  D.3-2              DO IT AGAIN 
* 
*     MOVE LABEL WORD TO SBUF 
* 
D.5   LDA  FBUF+3   GET LABEL WORD
      LDB  SBADR
      ADB  D2       B POINTS TO LABEL WORD IN CART TABLE
      STA  1,I      LABEL STORED IN CARTRIDGE TABLE 
*     PATCH TRACK ASSIGNMENT TABLE
      JSB  PATCH
*     PATCH CARTRIDGE TABLE 
      JSB  EXEC     KEEP
      DEF  *+7
      DEF  D2            NEW
      DEF  SICNW
      DEF  SBUF               CARTRIDGE 
      DEF  D128 
      DEF  STRCK
      DEF  D0                      TABLE
*     UNPATCH TRACK ASSIGNMENT TABLE
      JSB UPTCH 
*     RETURN TO CALLING PROGRAM 
      JMP JDCMC,I 
* 
*     SUBROUTINES TO PATCH AND UNPATCH TAT
* 
*     PATCH TRACK ASSIGNMENT TABLE
PATCH NOP 
      JSB  $LIBR    TURN OFF MEMORY PROTECT 
      NOP 
      LDA  1656B    1656=FIRST WORD OF TRACK ASSIGNMENT TABLE 
      ADA  STRCK    A=LOCATION OF CARTRIDGE DIRECTORY ENTRY 
      STA  LTAT     LTAT= " " " " 
      LDB  0,I      GET D.RTR'S ID SEGMENT FROM TAT 
      STB  DRTR     SAVE THIS!!!!!!!!!!!!!!!
      LDB  1717B    GET THIS PROGRAM'S ID SEGMENT 
      STB  0,I      PATCH TAT 
      JSB  $LIBX    TURN ON MEMORY PROTECT
      DEF  PATCH
*     UNPATCH TRACK ASSIGNMENT TABLE
UPTCH NOP 
      JSB  $LIBR    TURN OFF MEMORY PROTECT 
      NOP 
      LDA  LTAT     LOCATION IN TRACK ASSIGNMENT TABLE
      LDB  DRTR     B=D.RTR'S ID SEGMENT FROM TAT 
      STB  0,I      PUT IT BACK!
      JSB  $LIBX    TURN ON MEMORY PROTECT
      DEF  UPTCH
* 
*     ERROR ROUTINE 
* 
ER1   LDA  E1 
      JMP  ESTP 
ER2   LDA  E2 
      JMP  ESTP 
ER3   LDA  E3 
      JMP  ESTP 
ER4   LDA  E4 
      JMP  ESTP 
ER5   LDA  E5 
      JMP  ESTP 
ER6   LDA  E6 
      JMP  ESTP 
ER7   LDA  E7 
      JMP  ESTP 
ER8   LDA  E8 
      JMP  ESTP 
ER9   LDA  E9 
ESTP  STA  ENUM 
      JSB  EXEC 
      DEF  *+5
      DEF  D2 
      DEF  LU 
      DEF  EMES 
      DEF  D6 
*     RETURN TO CALLING PROGRAM 
      JMP JDCMC,I 
      END 
                                                                              