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