RECORDFORMAT  PARMF(INTEGER  DEST,SRCE,P1,P2,P3,P4,P5,P6)
RECORDFORMAT  DDTFORM(INTEGER  SER,PTS,PROPADDR,STATUS, C 
      CCA,RQA,LBA,ALA,STATE,IW1,IW2,SENSE1,SENSE2,SENSE3,SENSE4,C 
      REPSNO,BASE,ID,DLVN,MNEMONIC,STRING (6)LAB,BYTEINTEGER  MECH)
!
RECORDFORMAT  PROPFORM(INTEGER  TRACKS,CYLS,PPERTRK,BLKSIZE,TOTPAGES,C 
      RQBLKSIZE,LBLKSIZE,ALISTSIZE,KEYLEN,SECTINDX)
!
RECORDFORMAT  RQBFORM(INTEGER  LSEGPROP,LSEGADDR,LBPROP,LBADDR,ALPROP,C 
      ALADDR,W6,W7,W8)
!
RECORDFORMAT  COMF(INTEGER  OCPTYPE,IPLDEV,SBLKS,SEPGS,NDISCS,  C 
         DLVNADDR,GPCTABSIZE,GPCA,SFCTABSIZE,SFCA,SFCK,DIRSITE,  C 
         DCODEDA,SUPLVN,TOJDAY,DATE0,DATE1,DATE2,  C 
         TIME0,TIME1,TIME2,EPAGESIZE,USERS,CATTAD,EXDQADDR,  C 
         BYTEINTEGER  NSACS,RESV1,SACPORT1,SACPORT0, C 
         NOCPS,RESV2,OCPPORT1,OCPPORT0, C 
         INTEGER  ITINT,CONTYPEA,GPCCONFA,FPCCONFA,SFCCONFA, C 
         BLKADDR,RATION,SMACS,TRANS,LONGINTEGER  KMON,  C 
         INTEGER  DITADDR,SMACPOS,SUPVSN,PSTVA,SECSFRMN,SECSTOCD, C 
         SYNC1DEST,SYNC2DEST,ASYNCDEST,MAXPROCS,INSPERSEC,ELAPHEAD, C 
         COMMSRECA,STOREAAD,PROCAAD,SFCCTAD,DRUMTAD,TSLICE,FEPS,  C 
         MAXCBT,SP1,SP2,SP3,SP4,SP5,SP6,SP7, C 
         LSTL,LSTB,PSTL,PSTB,HKEYS,HOOT,SIM,CLKX,CLKY,CLKZ,  C 
         HBIT,SLAVEOFF,INHSSR,SDR1,SDR2,SDR3,  C 
         SDR4,SESR,HOFFBIT,S2,S3,S4,END)
CONSTINTEGER  DISCSNO=X'00200000'
CONSTINTEGER  SD=X'58000000';           ! STRING DESRCPTR FOR ADDRSS LIST
!
EXTERNALROUTINESPEC  DEFINE(STRING (63)S)
EXTERNALROUTINESPEC  DOUT18(RECORDNAME  P)
EXTERNALROUTINESPEC  DPON(RECORDNAME  P)
EXTERNALROUTINESPEC  DPOFF(RECORDNAME  P)
EXTERNALROUTINESPEC  PROMPT(STRING (15) S)

CONSTBYTEINTEGERARRAY  H(0:15)='0','1','2','3','4','5','6','7',
               '8','9','A','B','C','D','E','F';
STRING (8) FN  STRHEX(INTEGER  VALUE)
STRING (8) S
      *LD_S; *LSS_8; *ST_(DR )
      *INCA_1; *STD_TOS ; *STD_TOS 
      *LSS_0; *LUH_VALUE; *MPSR_X'24';  ! SET CC=1
      *SUPK_L =8
      *LD_TOS ; *ANDS_L =8,0,15;        ! FORCE ZONE CODE TO 0
      *LSS_H+4; *LUH_X'18000010'
      *LD_TOS ; *TTR_L =8
      RESULT =S
END 
EXTERNALROUTINE  TRACKREAD(STRING  (63) S)
!***********************************************************************
!*    READS A COMPLETE TRACK WITH CYCLIC CHECKS ETC FROM EDS           *
!***********************************************************************
ROUTINESPEC  DUMP(INTEGER  CYL,TRK,ADDR,L)
RECORD  P(PARMF)
RECORDNAME  DDT(DDTFORM)
RECORDNAME  PROP(PROPFORM)
RECORDNAME  RQB(RQBFORM)
RECORDNAME  COM(COMF)
BYTEINTEGERARRAY  DATA(0:19*1024)
INTEGER   STATE,MNEM,SLOT,DSNO,TRACK,CYL,PPTRK
INTEGER  I,J,ALA,LBA,KEYLEN
      COM==RECORD(X'80C00000')
      CYCLE  I=0,1,19*1024
         DATA(I)=X'EE'
      REPEAT 
      PRINTSTRING("DEVICE??") AND  RETURN  UNLESS  LENGTH(S)=4
      CYCLE  I=0,1,3
         BYTEINTEGER(ADDR(MNEM)+I)=CHARNO(S,I+1)
      REPEAT 
      PROMPT("CYL:")
      READ(CYL)
      PROMPT("TRACK:")
      READ(TRACK)
!
! CLAIM THE DISC FOR PRIVATE USE
!
      P_DEST=DISCSNO+1
      P_P2=1
      P_SRCE=1
      P_P3=MNEM
      P_P1=M'TKRD'
      DPON(P)
      DPOFF(P) UNTIL  P_P1=M'TKRD'
      SLOT=P_P3
      DSNO=P_P2
        IF  DSNO=0 THEN  C 
PRINTSTRING("TRACK READ CLAIM FAILS
")     AND  RETURN 
      DDT==RECORD(INTEGER(COM_DITADDR+SLOT*4))
      PROP==RECORD(DDT_PROPADDR)
      KEYLEN=PROP_KEYLEN
            ALA=DDT_ALA
            LBA=DDT_LBA
            RQB==RECORD(DDT_RQA)
            INTEGER(LBA)=X'00C03E00';!DIAGREAD &IGNORE SB&LB
            INTEGER(ALA)=SD+19*1024
            INTEGER(ALA+4)=ADDR(DATA(0))
!
            RQB_W7=X'1E001300';         ! SEEK CYL & DO CHAIN
            RQB_W8=CYL<<16!TRACK;       ! SEEK DATA
            P_DEST=DSNO
            P_SRCE=2
            P_P6=ADDR(DATA(0))
            P_P5=X'80000000'!19*1024
            P_P2=CYL<<16!TRACK
            P_P1=M'TKRD'
            DOUT18(P)
            IF  P_P2#0 THEN  START ;    ! FAILURE
               PRINTSTRING('CYL ')
               WRITE(CYL,1)
               PRINTSTRING(' TRK ')
               WRITE(TRACK,1)
               PRINTSTRING(' FAULTY
')
               PRINTSTRING(STRHEX(P_P3)." ")
               CYCLE  I=0,4,12
                  PRINTSTRING(STRHEX(INTEGER(P_P6+I))." ")
               REPEAT 
               NEWLINE
            FINISH 
      PRINTSTRING('TRACK READ COMPLETE
')
! RETURN DEVICE
      P_DEST=DISCSNO+1
      P_P3=SLOT
      STATE=0
      P_P2=0
      DPON(P)
      DEFINE("ST9,.LP")
      SELECT OUTPUT(9)
      DUMP(CYL,TRACK,ADDR(DATA(0)),19*1024)
      SELECT OUTPUT(0)
      RETURN 
ROUTINE  DUMP(INTEGER  CYL,TRK,ADD, LENGTH)
INTEGER  I, K, END, SPTR, VAL
STRING  (132) S
      ADD=ADD&(-32)
   PRINTSTRING("
DUMP OF CYL&TRK ".STRHEX(CYL<<16!TRK))
   NEWLINE
   END = ADD+LENGTH;  I = 1
   S = " "
   UNTIL  ADD >= END CYCLE 
      *LDTB_X'18000020';  *LDA_ADD
      *VAL_(LNB +1);  *JCC_3,<INVL>
      IF  I = 0 THEN  START 
         CYCLE  K = ADD,4,ADD+28
            -> ON IF  INTEGER(K) # INTEGER(K-32)
         REPEAT 
         S = "O";  -> UP
      FINISH 
ON:
      CHARNO(S,2) = '(';  SPTR = 3
      CYCLE  I = 28,-4,0
         CHARNO(S,SPTR) = H((ADD>>I)&15)
         SPTR = SPTR+1
      REPEAT 
      CHARNO(S,SPTR) = ')'
      CHARNO(S,SPTR+1) = ' '
      SPTR = SPTR+2
      CYCLE  K = ADD,4,ADD+28
         VAL = INTEGER(K)
         CYCLE  I = 28,-4,0
            CHARNO(S,SPTR) = H((VAL>>I)&15)
            SPTR = SPTR+1
         REPEAT 
         CHARNO(S,SPTR) = ' '
         SPTR = SPTR+1
      REPEAT 
      CHARNO(S,SPTR) = ' '
      SPTR = SPTR+1
      CYCLE  K = ADD,1,ADD+31
         I = BYTEINTEGER(K)&X'7F'
         UNLESS  32 <= I <= 95 THEN  I = ' '
         CHARNO(S,SPTR) = I
         SPTR = SPTR+1
      REPEAT 
      CHARNO(S,SPTR) = ' '
      SPTR = SPTR+1
      CHARNO(S,SPTR) = NL
      BYTEINTEGER(ADDR(S)) = SPTR
      PRINTSTRING(S)
      S = " "
UP:   ADD = ADD+32
      I = 0
   REPEAT 
   RETURN 
INVL:

   PRINTSTRING("ADDRESS VALIDATION FAILS
")
END ;                                   !ROUTINE DUMP
END 
EXTERNALROUTINE  FLAGTRACK(STRING  (63) S)
!***********************************************************************
!*    FLAGS A SINGLE TRACK BY WRITING A HOME ADDRESS WITH TRKCHECK SET *
!***********************************************************************
RECORD  P(PARMF)
RECORDNAME  DDT(DDTFORM)
RECORDNAME  PROP(PROPFORM)
RECORDNAME  RQB(RQBFORM)
RECORDNAME  COM(COMF)
BYTEINTEGERARRAY  DATA(0:1024)
INTEGER   STATE,MNEM,SLOT,DSNO,TRACK,CYL,PPTRK
INTEGER  I,J,ALA,LBA,KEYLEN
      COM==RECORD(X'80C00000')
      CYCLE  I=0,1,1024
         DATA(I)=0
      REPEAT 
      PRINTSTRING("DEVICE??") AND  RETURN  UNLESS  LENGTH(S)=4
      CYCLE  I=0,1,3
         BYTEINTEGER(ADDR(MNEM)+I)=CHARNO(S,I+1)
      REPEAT 
      PROMPT("CYL:")
      READ(CYL)
      PROMPT("TRACK:")
      READ(TRACK)
!
! CLAIM THE DISC FOR PRIVATE USE
!
      P_DEST=DISCSNO+1
      P_P2=1
      P_SRCE=1
      P_P3=MNEM
      P_P1=M'FLTK'
      DPON(P)
      DPOFF(P) UNTIL  P_P1=M'FLTK'
      SLOT=P_P3
      DSNO=P_P2
        IF  DSNO=0 THEN  C 
PRINTSTRING("FLAG TRACK CLAIM FAILS
")     AND  RETURN 
      DDT==RECORD(INTEGER(COM_DITADDR+SLOT*4))
      PROP==RECORD(DDT_PROPADDR)
      KEYLEN=PROP_KEYLEN
            ALA=DDT_ALA
            LBA=DDT_LBA
            RQB==RECORD(DDT_RQA)
            DATA(0)=2
            DATA(1)=CYL>>8
            DATA(2)=CYL&255
            DATA(3)=0
            DATA(4)=TRACK
            INTEGER(LBA)=X'80000300';! WRITE HOME ADDRESS
            INTEGER(ALA)=SD+5
            INTEGER(ALA+4)=ADDR(DATA(0))
!
            RQB_W7=X'1E001300';         ! SEEK CYL & DO CHAIN
            RQB_W8=CYL<<16!TRACK;       ! SEEK DATA
            P_DEST=DSNO
            P_SRCE=2
            P_P6=ADDR(DATA(0))
            P_P5=X'80000000'!1024
            P_P2=CYL<<16!TRACK
            P_P1=M'FLTK'
            DOUT18(P)
            IF  P_P2#0 THEN  START ;    ! FAILURE
               PRINTSTRING('CYL ')
               WRITE(CYL,1)
               PRINTSTRING(' TRK ')
               WRITE(TRACK,1)
               PRINTSTRING(' FAULTY
')
               PRINTSTRING(STRHEX(P_P3)." ")
               CYCLE  I=0,4,12
                  PRINTSTRING(STRHEX(INTEGER(P_P6+I))." ")
               REPEAT 
               NEWLINE
            FINISH 
      PRINTSTRING('TRACK FLAGGED
')
! RETURN DEVICE
      P_DEST=DISCSNO+1
      P_P3=SLOT
      STATE=0
      P_P2=0
      DPON(P)
      RETURN 
CONSTBYTEINTEGERARRAY  H(0:15)='0','1','2','3','4','5','6','7',
               '8','9','A','B','C','D','E','F';
END 
ENDOFFILE