1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-20 06:25:45 +00:00
Files
PDP-10.its/src/system/salv.313
Lars Brinkhoff e4d8240dc7 Add two more disk packs to KA ITS.
- Add packs to SALV.
- Increase NQS in ITS.
- Add new drives to the emulator configuration.
- Mark two more packs in SALV.
- Before booting into the new ITS, use UCOP to copy the MFD to the fresh packs.
2018-06-29 22:26:26 +02:00

6719 lines
123 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;;; -*- Mode:MIDAS -*-
;;; Copyright (c) 1999 Massachusetts Institute of Technology
;;; See the COPYING file at the top-level directory of this project.
.SEE COPY ;COPY BLOCK TO BLOCK
.SEE DUP ;DUPLICATE ENTIRE DISC PACK
.SEE TRAN ;LOAD FROM MAG TAPE UNIT 5
.SEE UCOP ;COPY UDIRS FROM DRIVE TO DRIVE
.SEE ZAP ;ZERO DIR BLOCKS, WRITE OUT EMPTY TUT,MFD, WRITE READIN BLOCK
.SEE SPKID ;SET PACK ID IN TUT
.SEE DSKTST ;SIMPLE DISK TEST (WRITE THEN READ)
.SEE SEKTST ;DISK TEST WHICH SEEKS BACK AND FORTH (DOES NO WRITING)
.SEE MARK ;FORMAT PACK
.SEE MARK69 ;FINISH FORMATTING PACK
.SEE MFDR ;TRY TO RECONSTRUCT MFD FROM USER DIRS
.SEE CHKR ;SALVAGER
.SEE GOGO ;SALVAGER - (AUTO FOR ALL DRIVES)
.SEE GETSTS ;GET CONTROLLER AND CURRENT DRIVE STATUS
.SEE RDHEAD ;READ HEADER FROM TRACK
.SEE LISTF ;PRINT USER DIRECTORY ON LPTR
.SEE UNLOCK ;TEST & UNLOCK A BLOCK
.SEE REMAP ;REMAP PACK #S AND FIX UFDS
.SEE PUNCH ;VARIABLE TO BE SET NON-ZERO IF COPYING OF TTY OUTPUT TO PAPER TAPE IS WANTED
.SEE HCRASH ;VARIABLE TO BE SET NON-ZERO IF DUP'ING A DISK AFTER HEAD CRASH
.SEE NOQUES ;IF NON-ZERO, NO QUESTIONS IN GOGOX MODE
.SEE FERRS ;COUNT OF CORRECTABLE ERRORS
.SEE CERRS ;COUNT OF ECC-CORRECTED ERRORS (RP04 ONLY)
.SEE DUPRER ;COUNT OF BLOCKS THAT COULDN'T BE READ IN `DUP'
.SEE DUPWER ;COUNT OF BLOCKS THAT COULDN'T BE WRITTEN IN `DUP'
IF1, TITLE SALVATION
IF2,[ PRINTX/SALVATION /
.TYO6 .FNAM2
PRINTX/
/]
DEFINE SUBTTL A/
TERMIN
;AC'S
ZR=0
A=1
B=2
C=3
D=4
N=5
I=6
Q=7
H=10
TT=11
T=12
W=13
U=14
J=15
K=16
P=17
SUBTTL CONFIGURATION
DEFINE IFCE A,B
IFE SIXBIT/A/-SIXBIT/B/,TERMIN ;SUBSTITUTE FOR IFSE THAT IGNORES CASE
;OPTIONS
IF1,[
PRINTX /Run under time-sharing? /
.TTYMAC TS
IRPS Z,,[YES Y AYE DA JA]
IFCE Z,TS,{
ITS==1
IRPS ZZ,,[DC10P RP10P RH10P OLPTP NLPTP TTLPTP KL10P]
ZZ==0
TERMIN
.ISTOP
}
TERMIN
TERMIN
IFNDEF ITS,[ ;run stand alone
ITS==0
PRINTX /Which machine? /
.TTYMAC MCHN
IFCE MCHN,AIKA,[
FIRSPK==1 ;first pack that must be mounted in gogo mode
LASTPK==5 ;last pack that must be mounted in gogo mode
NUDSL==440.
DC10P==1
RP10P==0
RH10P==0
T300P==0
KL10P==0
OLPTP==0 ;R.I.P.
NLPTP==0
TTLPTP==0
TCMXH==55.
LIGHTS==4 ;PI
];AIKA
IFCE MCHN,ML,[
FIRSPK==2
LASTPK==3
NUDSL==250.
DC10P==0
RP10P==1
RH10P==0
T300P==0
KL10P==0
OLPTP==0
NLPTP==0 ;rest in pieces
TTLPTP==0
TCMXH==55.
LIGHTS==4 ;PI
];ML
IFCE MCHN,KA,[
FIRSPK==0
LASTPK==3
NUDSL==250.
DC10P==0
RP10P==1
RH10P==0
T300P==0
KL10P==0
OLPTP==0
NLPTP==0 ;rest in pieces
TTLPTP==0
TCMXH==55.
LIGHTS==4 ;PI
];KA
IFCE MCHN,DM,[
FIRSPK==17.
LASTPK==21.
NUDSL==200.
DC10P==0
RP10P==1
RH10P==0
T300P==0
KL10P==0
OLPTP==0
NLPTP==0
TTLPTP==100
TCMXH==55.
LIGHTS==4 ;PI
];DM
IFCE MCHN,MC,[
SA==105*2000 ; MC system is big, need to push SALV higher.
FIRSPK==0
LASTPK==1
NUDSL==500.
DC10P==0
RP10P==0
RH10P==1
T300P==3 ;UNIT 3 IS FIRST T-300 UNIT
KL10P==1
OLPTP==0
NLPTP==0
TTLPTP==0 ;NO LPT AT ALL
TCMXH==100. ;LA36
LIGHTS==500 ;KL-UDGE
NDRIVE==6 ;8 DOESN'T FIT IN 128K
NUNITS==6
];KL
TERMIN
IFNDEF FIRSPK, .FATAL UNKNOWN MACHINE "MCHN"
];IFNDEF ITS
;Formerly we knew number of units, now these are set to maximum and at run
; time we find out which units are present and on-line with the right packs.
IFNDEF NDRIVE, NDRIVE==8 ;# physical units
IFNDEF NUNITS, NUNITS==8 ;# virtual units
IFE NUNITS-NDRIVE,[ ;Hack for virtual units in pre-Calcomp AI-KA system.
DEFINE UNTMES A/
TYPE A
TERMIN
]
IFN NUNITS-NDRIVE,[
DEFINE UNTMES A/
DEFINE ZZQ UNIT
TYPE A
TERMIN
ZZQ [VIRTUAL UNIT]
TERMIN
]
;MACROS FOR CONDITIONALIZATION
DEFINE TS
IFN ITS!TERMIN
DEFINE NTS
IFE ITS!TERMIN
DEFINE DC
IFN DC10P!TERMIN
DEFINE RP
IFN RP10P!TERMIN
DEFINE RH
IFN RH10P!TERMIN
DEFINE KA
IFE KL10P!TERMIN
DEFINE KL
IFN KL10P!TERMIN
DEFINE INSIRP I,[X]
IRPS Z,,X
I,Z
TERMIN
TERMIN
DEFINE INFORM A,B,C,D,E,F,G
PRINTX \A!B!C!D!E!F!G
\
TERMIN
DEFINE CONC A,B
A!B!TERMIN
DEFINE STRA C/
MOVE A,[440700,,[ASCIZ \C\]]
TERMIN
DEFINE LPR B/
JSR LOUTST
[ASCIZ \B\]
TERMIN
DEFINE TYPE TXT/
JSR TOUTST
[ASCIZ \TXT\]
TERMIN
TS INFORM Runs under time-sharing on any machine
DC INFORM Systems Concepts disk control
RP INFORM DEC RP10 disk control
RH INFORM DEC RH10 disk control
INFORM Number of drives=,\ndrives
; INFORM Number of virtual units=,\nunits
KA INFORM KA-10
KL INFORM KL-10
IFN OLPTP, INFORM Old LPT Interface
IFN NLPTP, INFORM New LPT Interface
IFN TTLPTP, INFORM LPT on MTY line number ,\TTLPTP&77
TS, T300P==0
IFN T300P, INFORM Support for Trident T-300 via PDP-11
];IF1
MEMSIZ==1000000
IFNDEF SA,SA==100*2000
NLPT=464 ;device code of ML lpt
MTY==400 ;device code of scanner
APR==0
PI==4
KA, TTY==120
KA, PTP==100
IFN T300P, DLB==60 ;DL-10
.ALSO DLC==64
X=PUSHJ P,
NTS,[ LOC SA
JRST GOGO ;make easy to start from ITS core load
SALVRT: 0 ;system may JSR here
JRST SALVAG
];NTS
;DISK PHYSICAL PARAMETERS
DC,[
.INSRT SYSTEM;DC10 >
]
RP,[
.INSRT SYSTEM;RP10 >
]
RH,[
.INSRT SYSTEM;RH10 >
]
TS, NTUTBL==4 ;MAXIMUM NUMBER OF BLOCKS PER TUT ON ANY ITS
;FILE SYSTEM PARAMETERS
.INSRT SYSTEM;FSDEFS >
IFN T300P,[
;DL10 COMMUNICATIONS AREA IN NON-ENCACHED LOW CORE
DL10AR==500 ;ACTUAL STORAGE LAYOUT DEFINED IN ITS AND IN T300 DEFS
.INSRT SYSTEM;T300 >
MXTUTB==NTUTB1 ;MAXIMUM OF NTUTBL AND NTUTB1
];T300P
.ELSE MXTUTB==NTUTBL
DC,[
DEFINE QCOPY A,B
DCOPY A(-<B>_2&37774)!TERMIN
];DC
;DEFINE CHANNEL PROGRAM AREA
NTS,[
KL,[
.INSRT SYSTEM;EPT >
ZZ==.
LOC EPTDDT
JRST MEMSIZ-4000 ;FOR 'DDT' COMMAND IN KLDCP
LOC ZZ
PAG==10
..D010==0
SWPIA=701440,,0
SWPUO=701740,,0
SWPIO=701640,,0
SWPUA=701540,,0
];KL
KA,[
SLVICWA=20
SLVIOWD=22
];KA
];NTS
TS,[
TYIC==1
TYOC==2
LPTC==3
QIN==4
]
IF2,[
TS,[ NBLKS==10000. ;FAKE
TBLKS==10000. ;FAKE
MFDBLK==-1 ;JUST TO AVOID UNDEF SYM ERROR, VALUE NEVER USED
; TUTBLK==-1 ;..
];TS
];IF2
SUBTTL COPY BLOCK TO BLOCK
NTS,[
COPY: JSR INIT
PUSHJ P,CRR
UNTMES COPY BLOCK FROM UNIT #
PUSHJ P,NTYI
JRST COPY
CAIL A,NUNITS
JRST COPY
MOVEM A,FROM
MOVE I,A
PUSHJ P,RESET
CP1: PUSHJ P,CRR
TYPE BLOCK #
PUSHJ P,OTYI
CAIL A,TBLKS
JRST CP1
MOVEM A,FMBLK
CP2: PUSHJ P,CRR
UNTMES ONTO UNIT #
PUSHJ P,NTYI
JRST CP2
CAIL A,NUNITS
JRST CP2
MOVEM A,TOU
MOVE I,A
PUSHJ P,RESET
PUSHJ P,CRR
CP3: TYPE BLOCK #
PUSHJ P,OTYI
PUSHJ P,CRR
CAIL A,TBLKS
JRST CP3
MOVEM A,TOBLK
MOVEI A,TUT
MOVE J,FMBLK
MOVE I,FROM
PUSHJ P,READ
JUMPL T,CPERR
COPYB: MOVEI A,TUT ;HANDY PLACE FOR A BREAKPOINT
MOVE J,TOBLK
PUSHJ P,WRITT
JRST DDT
DTYI: MOVEI B,0 ;DECIMAL TYPEIN
DTYI1: X NTYI
JRST DTYI2
IMULI B,10.
ADD B,A
JRST DTYI1
DTYI2: MOVE A,B
POPJ P,
OTYI: MOVEI B,0 ;OCTAL TYPEIN
OTYI1: X NTYI
JRST DTYI2
LSH B,3
ADD B,A
JRST OTYI1
CPERR: TYPE READ ERROR
X CRR
JRST DDT
SUBTTL TEST AND UNLOCK SOME BLOCKS
UNLOCK: JSR INIT
X CRR
UNTMES UNLOCK BLOCKS ON UNIT #
X NTYI
JRST UNLOCK
CAIL A,NUNITS
JRST UNLOCK
MOVEM A,FROM
MOVE I,A
X RESET
UNLK1: X CRR
TYPE BLOCK #
X OTYI
PUSHJ P,UNLOCB
JFCL
JRST UNLK1 ;USE ^Z TO GET OUT
;UNLOCK A BLOCK, NUMBER IN A, UNIT IN FROM
UNLOCB: INSIRP PUSH P,[J K Q D B TT]
MOVE J,A
MOVEM J,FMBLK
SETZM CYLBUF ;ZERO OUT IN CASE CAN'T READ
MOVE A,[CYLBUF,,CYLBUF+1]
BLT A,CYLBUF+4000-1
MOVE I,FROM
MOVEI A,CYLBUF
PUSHJ P,READ
JUMPGE T,UNLK2
TYPE READ ERROR
X CRR
X GSTS
TYPE PROCEED?
X Y.OR.N
JRST UNLOCX
UNLK2: MOVE A,[RXWDS,,WXWDS]
BLT A,WXWDS+4-1
MOVEI A,CYLBUF
X WRITE
JUMPL T,WRERR
MOVEI A,CYLBUF+2000
X READ
JUMPL T,[TYPE READ-BACK ERROR
X CRR
X GSTS
JRST UNLOCX]
MOVSI T,-2000
UNLK3: MOVE TT,CYLBUF(T)
CAME TT,CYLBUF+2000(T)
JRST [ TYPE READ-BACK COMPARE ERROR
X CRR
JRST UNLOCX]
AOBJN T,UNLK3
MOVEI A,TUT
X RDTUT
JUMPL T,CPERR
MOVE J,FMBLK
MOVEI B,TUT
X TUTPNT
JUMPE J,[ TYPE CAN'T ACCESS TUT
X CRR
JRST UNLOCX ]
MOVEI B,1 ;SAFEST ... NEXT SALVAGE WILL PUT CORRECT VALUE
DPB B,J
MOVEI A,TUT
X WRTUT
JUMPL T,WRERR
AOS -6(P) ;WINNING, SKIP RETURN
UNLOCX: INSIRP POP P,[TT B D Q K J]
POPJ P,
WRERR: TYPE WRITE ERROR
JRST CRDDT
SUBTTL DUP - COPY ENTIRE PACK
DUP1A: PUSHJ P,CRR
DUP1: UNTMES FROM UNIT #
PUSHJ P,NTYI
JRST DUP1A
CAIL A,NUNITS
JRST DUP1A
MOVE I,A
PUSHJ P,RESET
DUP2: MOVEM A,FROM
TO: PUSHJ P,CRR
UNTMES ONTO UNIT #
PUSHJ P,NTYI
JRST TO
CAIL A,NUNITS
JRST TO
MOVEM A,TOU
X CRR
UNTMES COPY FROM UNIT #
MOVE A,FROM
X DPT
UNTMES ONTO UNIT #
MOVE A,TOU
X DPT
TYPE , OK?
X Y.OR.N
JRST DDT
MOVE I,TOU
PUSHJ P,RESET
POPJ P,
DUP: JSR INIT
SETZM USRDS'
SETZM USWRTS'
SETZM DUPRER
SETZM DUPWER
RH, SETZM CERRS
TYPE DUPLICATE DISK
PUSHJ P,DUP1
MOVE I,FROM
DC, MOVE A,QTRAN(I)
DC, DPB A,[DUNFLD CYLRIR]
RP, MOVE I,TOU
.ELSE [ MOVE A,PKNUM(I)
MOVE I,TOU
CAME A,PKNUM(I)
JRST DUPLUZ
]DC, MOVE A,QTRAN(I)
DC, DPB A,[DUNFLD CYLRIW]
MOVEI J,NCYLS+XCYLS-1 ;DETERMINE HOW MANY CYLINDERS THIS DRIVE
RP,[ MOVSI A,(DNOOPC)
DPB I,[DUNFLD A] ;SELECT DESTINATION DRIVE
DATAO DPC,A
DATAI DPC,B
MOVE I,FROM
DPB I,[DUNFLD A] ;SELECT SOURCE DRIVE
DATAO DPC,A
DATAI DPC,A
XOR A,B
TRNE A,2000
JRST [ TYPE CAN'T COPY RP02 TO RP03 OR VICE VERSA
JRST CRDDT ]
TRNE B,2000
MOVEI J,MCYLS+XCYLS-1 ;DRIVES ARE RP03S, MORE CYLINDERS TO COPY
];RP
IFN T300P,[
CAIL I,T300P
JRST T3DUP ;HAVE TO DO IT THE SLOW WAY
MOVE I,FROM
CAIL I,T300P
JRST [ TYPE CAN ONLY GO T-300 TO T-300
JRST CRDDT ]
];T300P
MOVEI A,CYLBUF
DLUP: MOVE I,FROM
PUSHJ P,READCY
JUMPL T,DLUP1 ;LOST, TRY BLOCK AT A TIME
MOVE I,TOU
PUSHJ P,WRITCY
JUMPL T,DLUP1
DLUP2: SOJGE J,DLUP
DC, MOVEI T,CYLRIR ;COPY READ-IN BLOCK
DC, PUSHJ P,RW0
RH,[ SKIPN A,CERRS
JRST DDT
X TDPT
TYPE ECC-CORRECTED ERRORS.
JRST CRDDT
]
.ELSE JRST DDT
DUPLUZ: TYPE PACK # DFRS
PUSHJ P,CRR
JRST DDT
IFN T300P,[
T3DUP: MOVE I,FROM
CAIGE I,T300P
JRST [ TYPE CAN ONLY GO T-300 TO T-300
JRST CRDDT ]
TYPE THIS WILL TAKE A WHILE...
X CRR
MOVEI J,NBLKS1+XBLKS1-1
T3DUP1: MOVEI A,CYLBUF
MOVE I,FROM
X READ
JUMPL T,CPERR
MOVE I,TOU
X WRITE
JUMPL T,WRERR
SOJGE J,T3DUP1
JRST CRDDT
];T300P
IFE RH10P,[ ;BLOCK AT A TIME
DLUP1: PUSH P,J
IMULI J,NBLKSC
CLEARM DLUPT
DLUP3: MOVE I,FROM
MOVEI A,CYLBUF
PUSHJ P,READ
JUMPL T,DLUPE1
MOVE I,[RXWDS,,WXWDS]
DLUPEW: BLT I,WXWDS+4-1
PUSHJ P,WRITT
JUMPL T,DLUPE2
DLUPEX: AOS TT,DLUPT
CAIGE TT,NBLKSC
AOJA J,DLUP3
POP P,J
JRST DLUP2
]
RH,[ ;SECTOR AT A TIME ON RP04 SO GET EXTRA SECTORS
DLUP1: MOVEI T,NHEDS*NSECS
MOVEM T,DLUPT
DLUP3: SOS W,DLUPT ;NEXT SECTOR (GOING BACKWARDS THROUGH CYLINDER)
IDIVI W,NSECS ;TRACK IN W, SECTOR IN U
LSH W,8
IOR W,U
HRL W,J ;NOW W HAS DISK ADDRESS
MOVEM W,RHPGA
MOVE U,[-200,,CYLBUF-1]
MOVEM U,RHIOW
MOVE I,FROM
MOVEI TT,%HMRED
MOVEM TT,RHCMD
PUSHJ P,RW1
JUMPL T,DLUPE1
DLUPEW: MOVE I,TOU
MOVEI TT,%HMWRT
MOVEM TT,RHCMD
PUSHJ P,RW1
JUMPL T,DLUPE2
DLUPEX: SKIPE DLUPT
JRST DLUP3
JRST DLUP2
];RH
DLUPT: 0
DLUPE1: AOS DUPRER
SKIPE HCRASH
JRST DLUPE4 ;SPEED IS OF THE ESSENCE, DON'T TYPE ANYTHING
TYPE Read error on block #
PUSHJ P,DLUPE3
DLUPE4: SETZM CYLBUF ;COULDN'T READ THE BLOCK, SUBSTITUTE ALL ZEROS
MOVE A,[CYLBUF,,CYLBUF+1]
BLT A,CYLBUF+2000-1
MOVE I,[DLUPE5,,WXWDS] ;WITH SPECIAL EXTRA WORDS
JRST DLUPEW ;RESUME DLUP AT WRITE
DLUPE3: MOVE A,I
X DPT
MOVEI A,"-
X TYO
IFE RH10P, MOVE A,J
IFN RH10P,[
HLRZ A,RHPGA ;CYLINDER
IMULI A,NBLKSC
LDB W,[101000,,RHPGA] ;HEAD
IMULI W,NSECS
LDB U,[001000,,RHPGA] ;SECTOR
ADD W,U
IDIVI W,SECBLK
ADD A,W ;INACCURATE IF UNUSED SECTOR AT END OF CYLINDER
];RH10P
PUSHJ P,DPT
PUSHJ P,CRR
JRST GSTS ;HARDWARE STATUS
DLUPE2: AOS DUPWER
SKIPE HCRASH
JRST DLUPEX ;SPEED IS OF THE ESSENCE, DON'T TYPE ANYTHING
TYPE Write error on block #
PUSHJ P,DLUPE3
JRST DLUPEX
;SUITABLE EXTRA WORDS FOR BLOCKS THAT COULDN'T BE READ
DLUPE5: 0 ;WORD COUNT=2000, LAST BLOCK=0
SIXBIT /??????/ ;DUMMY DIRECTORY
SIXBIT /(DISK)/
SIXBIT/LOSSAG/
DC,[ SUBTTL CYLINDER I/O, DC10
READCY: SKIPA T,[DREADC+DUNENB] ;READ CONTINUOUS
WRITCY: MOVSI T,(DWRITC+DUNENB) ;WRITE CONTINUOUS
MOVE TT,QTRAN(I)
DPB TT,[DUNFLD T]
MOVE TT,J
SKIPGE QTRAN(I)
ADDI TT,NCYLS+XCYLS
DPB TT,[DCYL T]
DPB TT,[DCYL CYLCM3]
CYL1: SKIPLE TT,PKNUM(I)
JRST CYL2
PUSH P,T
PUSHJ P,RESET
POP P,T
JRST CYL1
CYL2: CAIL J,NCYLS
MOVEI TT,0
DPB TT,[DPKID T]
DPB TT,[DPKID CYLCM3]
MOVEM T,CYLCOM
DPB A,[DCCA CYLCM1]
DPB A,[DCCA CYLCM2]
MOVEI T,CYLCOM
RW0: HRRM T,DGO
JRST RW1 ;TRY TRANSFER UNTIL SUCCEEDS
CYLCOM: 0
DALU+DLDBWC+DLLB -2004*NBLKSC(3) ;LOAD WORD COUNT WITH -2004*NO. OF BLOCKS/CYL
CYLCM1: DCOPY .
CYLCM3: DRCC ;READ COMPARE CONTINUOUS
DALU+DLDBWC+DLLB -2004*NBLKSC(3)
CYLCM2: DCCOMP .
DHLT
CYLRIR: DREAD+DUNENB
DCOPY CYLBUF(-LRIBLK_2&37774)
CYLRIW: DWRITE+DUNENB
DCOPY CYLBUF(-LRIBLK_2&37774)
DHLT
];DC
RP,[ SUBTTL CYLINDER I/O, RP10 & RH10 CONTROLS
;RP10 CYLINDER I/O ALWAYS SUCCEEDS. IF PROBLEMS OCCUR, GOES SECTOR
;AT A TIME, TYPING OUT WHAT IS GOING ON, ZEROING SECTORS THAT CAN'T BE READ,
;THEN RETURNS CLAIMING TO HAVE WON.
READCY: SKIPA T,DRD
WRITCY: MOVE T,DWR
MOVEM T,RPIOOP
MOVEM J,RPIOCY
SETZM RPIOHD
SETZM RPIOSC
MOVEM A,RPAOBJ
MOVNI T,NBLKSC*2000
HRLM T,RPAOBJ
RPCY0: PUSHJ P,RPIO
JUMPGE T,CPOPJ ;WON
IFN 0,[ ;I DON'T THINK THIS CODE WORKS
SKIPE HCRASH
POPJ P,
MOVE T,RPIOOP
CAMN T,DWR
JRST [ TYPE WRITE ERROR ON BLOCK
JRST .+3 ]
TYPE READ ERROR ON BLOCK
PUSH P,A
PUSH P,B
MOVE A,I
X DPT
TYPE -
MOVE A,RPIOHD
IMULI A,NSECS
ADD A,RPIOSC
IDIVI A,SECBLK
MOVE B,RPIOCY
IMULI B,NBLKSC
ADD A,B
X DPT
X CRR
POP P,B
POP P,A
PUSHJ P,GSTS ;EXPLAIN WHAT HAPPENED TO THIS SECTOR
MOVE T,RPIOOP ;IF READ, ZERO THE BUFFER
HRLZ TT,RPAOBJ ;IF WAS REALLY IN SECTOR AT A TIME MODE
CAMN T,DRD
CAIE TT,-200
JRST RPCY1
MOVE TT,RPAOBJ
SETZM (TT)
HRLZ T,TT
HRRI T,1(TT)
BLT T,177(TT)
RPCY1: AOS T,RPIOSC ;ADVANCE TO NEXT SECTOR
CAIGE T,NSECS
JRST RPCY2
SETZM RPIOSC
AOS T,RPIOHD
CAIL T,NHEDS
POPJ P, ;MUST BE DONE
RPCY2: MOVE T,[200,,200]
ADDB T,RPAOBJ
JUMPL T,RPCY0 ;GO DO THE REST OF THE CYLINDER
];IFN 0
POPJ P, ;HMM, MUST BE DONE
];RP
RH,[ ;CYLINDER I/O, RH10 CONTROL
READCY: SKIPA TT,[%HMRED]
WRITCY: MOVEI TT,%HMWRT
IFN T300P,[
CAIL I,T300P
JRST 4,. ;NOT CODED YET
SETZM T3IOP
];T300P
MOVEM TT,RHCMD
HRLZM J,RHPGA ;SET ADDRESS TO START OF CYLINDER
MOVEI T,-1(A) ;SET UP IOWD TO TRANSFER WHOLE CYLINDER
HRLI T,-200*NHEDS*NSECS ;- NUMBER OF WORDS TO TRANSFER
MOVEM T,RHIOW
JRST RW1
];RH
SUBTTL TRAN - LOAD FROM MAG TAPE
MAGOP: AOSE ITAPE
JRST MTR1
HRROI A,MAGHD ;READ TAPE HEADER
PUSHJ P,MREAD
MOVE A,MAGHD
TRNE A,-1
JRST MBDTHD
CAMGE A,[-LTHBLK,,]
JRST MBDTHD
ADD A,[1,,THBLK+1]
PUSHJ P,MREAD
TYPE TAPE #
HLRZ A,THTPN
PUSHJ P,TDPT
PUSHJ P,CRR
MTR1: HRROI A,MAGHD ;READ FILE HEADER
PUSHJ P,MREAD
JUMPE T,CPOPJ ;EOF
MOVE A,MAGHD
TRNE A,-1
JRST MBADHD
CAMGE A,[-LMHBLK,,0]
JRST MBADHD ;HEADER TOO LONG
ADD A,[1,,MHBLK+1]
PUSHJ P,MREAD
SETZM LNKFLG
HLRZ B,MHPKN
JUMPE B,POPJ1 ;NOT A LINK
SETOM LNKFLG
MOVE A,[-3,,LNKNM1] ;READ LINK INFO
PUSHJ P,MREAD
CAIN T,3
JRST [ MOVE A,[-1,,MHDATE+1]
PUSHJ P,MREAD ;FLUSH BUFFER
JUMPN T,MBDLNK ;IT SHOULD BE EMPTY
CLEARM EOUF
JRST POPJ1 ]
MBDLNK: LPR BAD LINK
JRST CRDDT
MBADHD: LPR BAD HEADER
PUSHJ P,LCRR
PUSHJ P,IGFIL
JRST MTR1
MBDTHD: TYPE BAD TAPE HEADER
JRST CRDDT
TRAN: PUSHJ P,REW
TRAN1: JSR INIT
PUSHJ P,CRR
MOVEI I,0
TRAN2: SKIPGE QACT(I)
PUSHJ P,RESET
CAIGE I,NUNITS-1
AOJA I,TRAN2
MOVEI A,5 ;READS FROM TAPE UNIT 5
PUSHJ P,DUP2
MOVEI A,TUT
MOVE I,TOU
PUSHJ P,RDTUT
JUMPL T,READC
MOVEI A,MFD
MOVE J,MFDBK
PUSHJ P,READT
TNAML: PUSHJ P,MAGOP
JRST MREOT
MOVE A,MHFN1 ;DON'T RELOAD DIRECTORIES!
MOVE B,MHFN2
CAMN A,[SIXBIT/.FILE./]
CAME B,[SIXBIT/(DIR)/]
CAIA
JRST TIGNF
CAMN A,[SIXBIT/M.F.D./]
CAME B,[SIXBIT/(FILE)/]
SKIPA A,MHSNM
JRST TIGNF
PUSHJ P,SIXLPT
PUSHJ P,LSPAC
MOVE A,MHFN1
PUSHJ P,SIXLPT
PUSHJ P,LSPAC
MOVE A,MHFN2
PUSHJ P,SIXLPT
PUSHJ P,LSPAC
CLEARM FERRS
MOVE B,MHSNM
MOVE A,MFD+MDNAMP
SETZM IBLK
TMLKP: CAIL A,2000
JRST TNEWU
SKIPN C,MFD+MNUNAM(A)
JRST TMLKZ
CAMN B,C
JRST TOLDU
TMLKL: ADDI A,LMNBLK
JRST TMLKP
TMLKZ: MOVEM A,IBLK
JRST TMLKL
TOLDU: HRREI J,-2000(A) ;CONVERT MFD INDEX TO BLOCK NO
ASH J,-1
ADD J,NUDS
MOVEM J,UFDTA
MOVEI A,NUSRD
PUSHJ P,READT
CAME B,NUSRD+UDNAME
JRST 4,.
JRST TOLDUR
TNEWU: MOVE A,[NUSRD,,NUSRD+1]
SETZM NUSRD
BLT A,NUSRD+1777
MOVEM B,NUSRD+UDNAME
MOVEI A,2000
MOVEM A,NUSRD+UDNAMP
SKIPE A,IBLK
JRST .+3
MOVNI A,LMNBLK
ADDB A,MFD+MDNAMP
MOVEM B,MFD+MNUNAM(A)
HRREI J,-2000(A) ;CONVERT MFD INDEX TO BLOCK NO
ASH J,-1
ADD J,NUDS
MOVEM J,UFDTA
TOLDUR:
MOVE B,MHFN1
MOVE C,MHFN2
MOVE A,NUSRD+UDNAMP
SETZM IBLK
TULKP: CAIL A,2000
JRST TNEWF
MOVSI T,UNCDEL
TDNE T,NUSRD+UNRNDM(A)
JRST TULKD
SKIPN T,NUSRD+UNFN1(A)
JRST TULKZ
CAME B,T
JRST TULKL
CAMN C,NUSRD+UNFN2(A)
JRST TOLDF
TULKL: ADDI A,LUNBLK
JRST TULKP
TULKZ: SKIPN NUSRD+UNFN2(A)
TULKD: MOVEM A,IBLK
JRST TULKL
TOLDF: LPR EXISTS
PUSHJ P,LCRR
TIGNF: PUSHJ P,IGFIL
JRST TNAML
IGFIL: MOVE A,[-2000,,FDBUF]
PUSHJ P,MREAD
SKIPN EOUF
JRST IGFIL
CLEARM EOUF
POPJ P,
TNEWF: SKIPE A,IBLK
JRST TNEWCK
MOVNI A,LUNBLK
ADDB A,NUSRD+UDNAMP
TNEWCR: MOVE T,NUSRD+UDESCP
IDIVI T,6
CAIL T,-UDDESC(A)
JRST 4,.
MOVEM B,NUSRD+UNFN1(A)
MOVEM C,NUSRD+UNFN2(A)
DC, MOVEM B,WXWDS+XWFN1
DC, MOVEM C,WXWDS+XWFN2
MOVE B,NUSRD+UDNAME
DC, MOVEM B,WXWDS+XWSYSN
DC, SETZM WXWDS+XWBWC
SETZI B,
SKIPE LNKFLG
MOVSI B,UNLINK ;SET LINK FLAG IN UFD
MOVEM B,NUSRD+UNRNDM(A)
MOVE B,NUSRD+UDESCP
DPB B,[UNDSCP NUSRD+UNRNDM(A)]
MOVE B,MHDATE
MOVEM B,NUSRD+UNDATE(A)
HRROI B,777000 ;NO REFERENCE DATE, NO AUTHOR, 36-BIT BYTES
MOVEM B,NUSRD+UNREF(A)
MOVE B,TUT+QPKNUM
DPB B,[UNPKN NUSRD+UNRNDM(A)]
MOVEI A,NUSRD+UNRNDM(A)
HRLI A,(UNWRDC)
MOVEM A,TRNDEP' ;DPB WC OF LAST BLOCK LATER
SETZM CBYT'
SETZM OBLKS'
SETZM IBLK'
SETZM LBLK'
SKIPE LNKFLG
JRST TRNLNK ;JUMP IF APPENDING LINK
TBLKL:
TBLKL1: MOVE A,[-2000,,FDBUF]
PUSHJ P,MREAD
JUMPE T,TBLKL2
DC, DPB T,[XWAWC WXWDS+XWBWC]
DPB T,TRNDEP ;STORE WORD COUNT IN DIRECTORY
MOVE T,LBLK
DC, DPB T,[XWBLK WXWDS+XWBWC]
AOS IBLK
PUSHJ P,WRBLK
TBLKL2: SKIPN EOUF
JRST TBLKL
SETZM EOUF
JRST TBDON
TNEWCK: SKIPN NUSRD+UNFN1(A)
SKIPE NUSRD+UNFN2(A)
JRST 4,.
JRST TNEWCR
TBDON: PUSHJ P,EBYT
MOVEI J,UDWPH
SKIPN LBLK
PUSHJ P,BYDEP
TBDON1: MOVEI J,0
PUSHJ P,BYDEP
JRST TMDON
TRNLNK: MOVE A,LNKSNM
PUSHJ P,TRNLK1
MOVE A,LNKNM1
PUSHJ P,TRNLK1
MOVE A,LNKNM2
PUSHJ P,TRNLK1
JRST TBDON1
TRNLK1: MOVE K,A
MOVEI A,6
TRNLK2: MOVEI J,0
LSHC J,6
JUMPE J,TRNLK4
CAIE J,':
CAIN J,';
JRST [ PUSH P,J
MOVEI J,':
PUSHJ P,BYDEP
POP P,J
JRST .+1 ]
PUSHJ P,BYDEP
SOJG A,TRNLK2
POPJ P,
TRNLK4: MOVEI J,';
JRST BYDEP
READFN: SKIPA I,FROM
READT: MOVE I,TOU
PUSHJ P,READ
READC: JUMPL T,[JRST 4,.]
POPJ P,
WRBLK: MOVE J,TUT+QTUTP
AOS TUT+QTUTP
CAML J,TUT+QLASTB
JRST WRLUZ
MOVEM J,LBLK
SETZM TUTLUZ
MOVEI B,TUT
PUSHJ P,TUTPNT
LDB B,J
JUMPN B,WRBLK
MOVEI B,1
DPB B,J
MOVE J,LBLK
MOVEI A,FDBUF
PUSHJ P,WRITT
SUB J,OBLKS
ADDM J,OBLKS
CAIN J,1
JRST WRBC
PUSHJ P,EBYT
CAIG J,UDWPH-UDTKMX
JRST WRBS
MOVE J,OBLKS
LSHC J,-NXLBYT*6
MOVEI U,NXLBYT+1
ADDI J,UDWPH+1
WRBL: PUSHJ P,BYDEP
LSHC J,6
SOJG U,WRBL
POPJ P,
WRLUZ: SETCMB J,TUTLUZ'
JUMPE J,WRLUZ1
MOVE J,TUT+QSWAPA
CAMGE J,TUT+QFRSTB
MOVE J,TUT+QFRSTB
MOVEM J,TUT+QTUTP
JRST WRBLK
WRLUZ1: TYPE DISK FULL
SKIPN NOLPT
X LCRR
JRST CRDDT
WRBS: ADDI J,UDTKMX-1
BYDEP: MOVE T,NUSRD+UDESCP
AOS NUSRD+UDESCP
IDIVI T,6
ADDI T,UDDESC
CAML T,NUSRD+UDNAMP
JRST 4,.
ADDI T,NUSRD
HLL T,QBTBL(W)
DPB J,T
POPJ P,
WRBC: AOS J,CBYT
CAIGE J,UDTKMX
POPJ P,
EBYT: PUSH P,J
SKIPN J,CBYT
JRST POPJJ
PUSHJ P,BYDEP
SETZM CBYT
POPJJ: POP P,J
POPJ P,
TMDON: MOVE J,[WXWDS,,WXWDS+1]
SETZM WXWDS
BLT J,WXWDS+3
MOVE A,TUT+QTUTP
IDIVI A,NBLKSC
IMULI A,NBLKSC
MOVEM A,TUT+QTUTP
MOVEI A,TUT
MOVE I,TOU
PUSHJ P,WRTUT
MOVEI I,0
TMDON2: SKIPL QACT(I)
JRST TMDON1
MOVE J,MFDBK
MOVEI A,MFD
PUSHJ P,WRITE
MOVE J,UFDTA
MOVEI A,NUSRD
PUSHJ P,WRITE
TMDON1: CAIGE I,NUNITS-1
AOJA I,TMDON2
SKIPN FERRS
LPR OK
PUSHJ P,LCRR
JRST TNAML
SUBTTL UCOP - COPY DIRECTORIES FROM DRIVE TO DRIVE
UCOP: JSR INIT
TYPE COPY DIRS
PUSHJ P,DUP1
MOVEI A,D0
MOVE J,MFDBK
PUSHJ P,READFN
PUSHJ P,WRITT
MOVEI Q,2000
UCOPL: SUBI Q,LMNBLK
CAMGE Q,D0+MDNAMP
JRST DDT
SKIPN B,D0(Q)
JRST UCOPL
HRREI J,-2000(Q) ;CONVERT MFD INDEX TO BLOCK NO
ASH J,-1
ADD J,NUDS
MOVEI A,OUSRD
PUSHJ P,READFN
CAME B,OUSRD+UDNAME
JRST 4,.
PUSHJ P,WRITT
JUMPL T,WRERR
JRST UCOPL
SUBTTL SPKID - SET PACK ID IN TUT
SPKID: JSR INIT
CAIA
SPKID0: X CRR
UNTMES SET PACK ID ON UNIT #
X NTYI
JRST SPKID0
CAIL A,NUNITS
JRST SPKID0
X CRR
MOVE I,A
PUSHJ P,RESET
MOVEI A,TUT
PUSHJ P,RDTUT
JUMPL T,ZAPLUZ
TYPE PACK NO=
MOVE A,TUT+QPKNUM
X TDPT
TYPE , CHANGE ID FROM
MOVE A,TUT+QPAKID
X T6B
TYPE TO
X SIXIN
X CRR
JUMPE B,ZAPLUZ
MOVEM B,TUT+QPAKID
MOVEI A,TUT
PUSHJ P,WRTUT
JUMPL T,ZAPLUZ
JRST DDT
SUBTTL REMAP - REASSIGN PACK#S AND FIX UFDS
REMAPP: REPEAT 40, -1 ;INDEX BY PACK #. LH=NEW PACK #, RH=DISK ADDR OFFSET
REMAP: JSR INIT
UNTMES REMAP THE COPY OF THE UFDS ON UNIT #
PUSHJ P,NTYI
JRST REMAP
X CRR
CAIL A,NUNITS
JRST REMAP
MOVE I,A
MOVEI A,MFD ;GET MFD
MOVE J,MFDBK
PUSHJ P,READ
JUMPL T,ACTUE3
MOVE Q,MFD+MDNAMP
REMAP1: CAIL Q,2000 ;NEXT UFD
JRST CRDDT
SKIPN B,MFD+MNUNAM(Q)
JRST REMAP9
MOVEM B,USRNAM
MOVE J,Q
SUBI J,2000
IDIVI J,LMNBLK
ADD J,NUDS ;UFD BLOCK NUMBER
MOVEI A,OUSRD
PUSHJ P,READ
JUMPL T,CPERR
CAME B,OUSRD+UDNAME
JRST CPERR
MOVE K,OUSRD+UDNAMP
REMAP2: CAIL K,2000 ;NEXT FILE
JRST REMAP6
MOVSI C,UNLINK
TDNE C,UNRNDM+OUSRD(K)
JRST REMAP5 ;DON'T MANGLE LINKS
LDB C,[UNDSCP UNRNDM+OUSRD(K)]
IDIVI C,UFDBPW
HLL C,QBTBLI(D)
ADDI C,UDDESC+OUSRD ;C HAS DESC POINTER
LDB D,[UNPKN UNRNDM+OUSRD(K)] ;D HAS PK #
SKIPGE A,REMAPP(D) ;GET MAPPING
JRST 4,. ;LOSER FORGOT TO PATCH IT IN
HLRZ D,A ;GET NEW PACK #
DPB D,[UNPKN UNRNDM+OUSRD(K)] ;CHANGE IT
HRRE D,A ;D HAS BLOCK # OFFSET
REMAP3: MOVE H,C
ILDB A,C ;GET DESC
JUMPE A,REMAP5 ;EOF
CAIG A,UDWPH
JRST REMAP3 ;DOESN'T DEPEND ON ABS DISK ADDRESSES
ANDI A,37 ;MASK OUT LOAD-ADDR-BIT
REPEAT NXLBYT,[
LSH A,UFDBYT
ILDB B,C
ADD A,B
]
ADD A,D ;RELOCATE THE ADDRESS
REPEAT 6,JFCL ;PATCH AREA
MOVE C,H ;GET BACK B.P. TO START OF LOAD-ADDR DESCRIPTOR
MOVE H,[<UFDBYT*NXLBYT+UFDBYT>_36+UFDBYT_30+A]
REPEAT NXLBYT+1,[
ILDB B,H
IFE .RPCNT, ADDI B,40
IDPB B,C
]
JRST REMAP3
REMAP5: ADDI K,LUNBLK
JRST REMAP2
REMAP6: MOVEI A,OUSRD
PUSHJ P,WRITE
JUMPL T,WRERR
REMAP9: ADDI Q,LMNBLK
JRST REMAP1
SUBTTL ZAP - ZERO DIR BLOCKS, WRITE EMPTY TUT & MFD
ZAP: JSR INIT
X CRR
UNTMES INIT DIRS ON UNIT #
PUSHJ P,NTYI
JRST ZAP
CAIL A,NUNITS
JRST ZAP
PUSHJ P,CRR
MOVEM A,TOU
MOVE I,A
RP,[ TYPE PACK NO =
X DTYI ;IF RP, NO PK # IN HARDWARE, GET IT FROM HUMAN
X CRR
MOVEM A,PKNUM(I)
] PUSHJ P,RESET ;IF DC OR RH, WILL USE PACK # FROM HARDWARE
MOVE A,[WXWDS-1,,WXWDS]
BLT A,WXWDS+3
SETZM MFD ;INIT ALL BLOCKS TO ZERO
MOVE A,[MFD,,MFD+1]
BLT A,MFD+1777
MOVN J,NUDS ;GET AOBJN PTR TO UFD BLOCKS
HRLZ J,J
KL, ADD J,[2,,2] ;PROTECT KLDCP?
MOVEI A,MFD
ZAPL: PUSHJ P,WRITE
JUMPL T,ZAPLUZ
AOBJN J,ZAPL
DC,[ CONO DC0,DCCSET+DCDENB
DATAO DC0,[DJMP DZAP]
CONSZ DC0,DSSACT
JUMPA .-1
CONSO DC0,DSSERR
];DC
JRST MARK69
ZAPLUZ: TYPE LOSE
JRST CRDDT
DC,[
DZAP: DWRITE ;ZERO READ-IN BLOCK
DCSKIP (-LRIBLK_2&37774)
DHLT
];DC
SUBTTL SIMPLE DISK TESTS
;THIS ONE JUST WRITES A SINGLE BLOCK, READS IT BACK, AND CHECKS THAT IT'S THE SAME.
DSKTST: JSR INIT
SETOM HCRASH ;DON'T DO ERROR RETRY
TYPE TEST UNIT #
X NTYI
JRST DSKTST
X CRR
CAIL A,NUNITS
JRST DSKTST
MOVE I,A
TYPE GOT A SCRATCH PACK ON UNIT #
X TOPT
TYPE ?
X Y.OR.N
JRST CRDDT
DSKTS0: X RESET
MOVEI J,NBLKSC*15. ;RANDOMLY USE CYLINDER 15.
MOVSI A,-2000
MOVEI B,1 ;FIRST PART OF PATTERN IS FLOATING 1S
DSKT0A: MOVEM B,D0(A)
LSH B,1
SKIPE B
AOBJN A,DSKT0A
HRROI B,-2 ;NEXT IS FLOATING 0S
DSKT0B: MOVEM B,D0(A)
JUMPGE B,DSKT0C
LSH B,1
AOS B
AOBJN A,DSKT0B
DSKT0C: MOVEM A,D0(A) ;REST IS AN ADDRESS PATTERN
AOBJN A,DSKT0C
MOVEI A,D0
X WRITE
JUMPL T,WRERR
DSKTS1: MOVEI A,D1
X READ
PUSHJ P,TYIPSE
MOVSI B,-2000
DSKT1A: MOVE A,D1(B)
CAMN A,D0(B)
DSKTS2: AOBJN B,DSKT1A
JUMP DSKTS4 ;CHANGE TO JUMPA FOR NO TYPEOUT
JUMPGE B,DSKTS3 ;JUMP IF COMPARED ALL
HRRZ A,B
X TOPT
TYPE /
MOVE A,D0(B)
X THWO
X TSPAC
MOVE A,D1(B)
X THWO
X TSPAC
MOVE A,D0(B)
XOR A,D1(B)
X THWO
X CRR
JRST DSKTS2
DSKTS3: JUMPGE T,DSKTS1 ;AFTER PRINTING COMPARISON, IF DISK NOTICED ERROR
X GSTS ; ALSO PRINT THAT
JRST DSKTS1
DSKTS4: DATAO LIGHTS,[0]
JUMPGE B,DSKTS1
MOVE A,B
XOR A,CYLBUF(B)
DATAO LIGHTS,A
JRST DSKTS2
;SEEK TEST. THIS LOOPS OVER ALL HEADS, AND OPTIONALLY LOOPS OVER DIFFERENT
; LENGTH SEEKS. IT DOESN'T WRITE, BUT IS A TEST OF SEEKING AND SEARCHING.
;SETOM HCRASH IF YOU WANT TO DO NO ERROR RETRIES ON READ/SEARCH ERRORS
;(SEEK INCOMPLETES WILL ALWAYS BE RETRIED.)
SEKTST: JSR INIT
TYPE SEEK TEST UNIT #
X NTYI
JRST SEKTST
X CRR
CAIL A,NUNITS
JRST SEKTST
MOVE I,A
X RESET
TYPE ALWAYS DO FULL LENGTH SEEKS?
SETZM SEKINC
MOVEI A,10.*NBLKSC
X Y.OR.N
MOVEM A,SEKINC' ;IF NO, DO DECREASING LENGTH SEEKS
SEKTS0:
RP,[
MOVSI A,(DNOOPC) ;DETERMINE HOW MANY CYLINDERS THIS DRIVE
DPB I,[DUNFLD A]
DATAO DPC,A
DATAI DPC,B
MOVEI A,<NCYLS-1>*NBLKSC ;RP02
TRNE B,2000
MOVEI A,<MCYLS-1>*NBLKSC ;RP03
];RP
.ELSE MOVEI A,<NCYLS-1>*NBLKSC
IFN T300P,[
CAIL I,T300P
MOVEI A,<NCYLS1-1>*NBLKC1 ;T-300
];T300P
MOVEM A,SEKCY2'
SETZM SEKCY1'
SEKTS1: SETZM SEKHDN' ;RESET HEAD
SEKTS2: MOVE J,SEKCY1 ;BLOCK ADDRESS OF OUTER CYLINDER
ADD J,SEKHDN ;SELECT A BLOCK ON THE DESIRED HEAD
MOVEI A,CYLBUF
X READ ;READ IT
SKIPGE T
SEKTS3: X GSTS ;JFCL THIS IF YOU DON'T WANT ERROR MESSAGES
MOVE J,SEKCY2 ;BLOCK ADDRESS OF INNER CYLINDER
ADD J,SEKHDN ;SELECT SAME HEAD
MOVEI A,CYLBUF
X READ
SKIPGE T
XCT SEKTS3
PUSHJ P,TYIPSE
MOVEI J,NSECS/SECBLK ;ADVANCE TO NEXT HEAD
ADDB J,SEKHDN
CAIGE J,NBLKSC ;SKIP IF TOUCHED ALL HEADS
JRST SEKTS2
MOVN B,SEKINC ;YES, CHANGE CYLINDERS
ADDB B,SEKCY2
MOVE C,SEKINC
ADDB C,SEKCY1
CAMG C,B
JRST SEKTS1
JRST SEKTS0 ;RECYCLE
THWO: PUSH P,A
PUSH P,B
TLNN A,-1
JRST THWO1
HLRZS A
X TOPT
TYPE ,,
HRRZ A,-1(P)
THWO1: X TOPT
POP P,B
POP P,A
POPJ P,
DC,[
SUBTTL DC-10 PACK FORMATTING
MARK: JSR INIT
X CRR
UNTMES FORMAT PACK ON UNIT #
PUSHJ P,NTYI
JRST MARK
CAIL A,NUNITS
JRST MARK
PUSHJ P,CRR
HRRZ TT,QTRAN(A)
CONO DC1,(TT) ;SETUP DRIVE # FOR LATENCY TIMER
MOVEM A,TOU
MOVE I,A
PUSHJ P,RECAL
CONSO DC1,DFUNSF\DOFFL
JRST MARK1
TYPE DRIVE OK?
JRST CRDDT
MARK1: MOVE A,[DSPC+DSCWIM+DSWIDX+DSWNUL]
MOVEM A,CYLBUF
MOVEI D,CYLBUF+1
PUSHJ P,RDLAT ;READ LATENCY TIMER
JUMPE A,.-1
MARK1A: CONI DC1,A
CONI DC1,C
LDB A,[DSLAT A]
LDB C,[DSLAT C]
CAME A,C
JRST MARK1A
JUMPN A,[MOVE B,A
JRST MARK1A]
IFN 0,[ ;THIS HARDWARE HAS BEEN BROKEN FOR YEARS
PUSH P,B
MOVE A,B
IDIVI A,10. ;NO. OF MILLISECONDS
PUSH P,B
PUSHJ P,TDPT
MOVEI A,".
PUSHJ P,TYO
POP P,A
ADDI A,"0
PUSHJ P,TYO
TYPE MILLISECONDS ROTATION TIME
PUSHJ P,CRR
POP P,B
CAIGE B,254. ;LIKELY JUST NO INDEX ON THIS PACK
JRST MARK1B
TYPE TOO DAMN LONG TO BE CREDIBLE, USING 24.5 MS.
PUSHJ P,CRR
];IFN 0
MOVEI B,245.
MARK1B: IMULI B,1000 ;CONVERT TO NUMBER OF BITS/TRACK
IDIVI B,36. ;NO. OF WORDS PER SECTOR
AOJ B,
MOVEM B,MAXT'
SETZ A,
PUSHJ P,STOBLK ;ENOUGH ONES TO WIPE OUT THIS TRACK
MOVE J,MAXT
IDIVI J,NSECS
CAIL K,NSECS/2
AOJ J, ;INTER-SECTOR GAP LENGTH
SUBI J,3+3+7+3011 ;HEADER CODE+HEADER DATA+"ONES"+BLOCK+CHECKSUM
MOVEI Q,NSECS
MARK1C: MOVEI B,(D)
HRLI B,HBLK ;SETUP COPYS FOR HEADER PREAMBLE,DATA,POSTAMBLE
ADDI D,3
BLT B,-1(D)
MOVNI B,-NSECS(Q)
IMULI B,3
ADDI B,DHEDR
HRRM B,-2(D) ;POINT COPY TO THIS SECTORS ENCODED DATA
MOVEI B,103. ;103 BLOCKS OF 10 ZEROS (ENCODED)
MOVE A,[QCOPY EZERS,15.,]
PUSHJ P,STBLK
SOJLE Q,MARK1D
MOVE B,J ;ENOUGH ONES TO FILL OUT REMAINING PART OF SECTOR
PUSHJ P,STOBLK
JRST MARK1C
;SETUP STUFF FOR POSSIBLY WRITING READIN BLOCK
MARK1D: MOVE A,[QCOPY EONES,3,]
MOVEM A,(D)
AOJ D,
MOVSI A,(DOPR+DOHXFR)
MOVEM A,(D)
MOVEM D,RIWP'
ADDI D,2
MOVE B,J
SUBI B,3+3+7+LRIBLK*3/2+3 ;HEADER+LRIBLK+CHECKSUM
LSH B,-1
SUBI B,3*3
PUSHJ P,STOBLK
MOVEI B,(D)
HRLI B,WRTRI
ADDI D,5
BLT B,-1(D)
MOVSI A,(DJMP) ;PATCH JUMP AROUND RIBLK CODE, WILL BE CLOBBERED FOR BLOCK 0 ONLY
ADDI A,(D)
MOVE B,RIWP
MOVEM A,1(B)
MOVEI B,(D)
MOVEM B,ENDP'
AOS ENDP
HRLI B,RCBLK
ADDI D,5
BLT B,-1(D)
MOVEI B,-3(D) ;PATCH AOJN .-1 ADDRESS
HRRM B,-2(D)
TYPE PACK NO =
PUSHJ P,DTYI
PUSHJ P,CRR
MOVE I,TOU
MOVEM A,PKNUM(I)
MOVE I,[440300,,RIHEDR] ;ENCODE READIN HEADER
PUSHJ P,ENCI
MOVEI I,RIHED0
PUSHJ P,HCOMP
MOVEI J,<NBLKS+XBLKS>/NSECS-1
MOVEM J,TRKN'
;SO FAR
;WRITE IMAGE COMMAND - (START AT SECTOR PULSE)
;COPY <ENCODED ONES> ;ENOUGH TO WIPE OUT FULL TRACK
;(THEN FOR EACH SECTOR):
;HEADER PREAMBLE
; ONES FOLLWED BY SINGLE ZERO
; 8 BYTES OF 10101
; TWO 28 BIT HEADER WORDS
; A SERIES OF ONES FOLLWED BY 01
;ENCODED ZEROS FOR DATA BLOCK (2004) WORDS + 2 WORDS CHECKSUM
;ENOUGH ENCODED ONES TO FILL OUT REST OF SECTOR (EXCEPT ON LAST SECTOR)
;AFTER LAST SECTOR
;A FEW ONES
; NORMALLY: FOR BLOCK 0:
;RIWP: HANG FOR END OF TRANSFER WRITE ONES
; JUMP AROUND WRITE READIN WRITE ONES
; READIN HEADER PREAMBLE
; READIN HEADER
; READIN HEADER POSTAMBLE
; READIN BLOCK
; ONES TO PAD OUT REST OF TRACK
; DALU SETUP CONTROL COUNTER
;ENDP: READ COMPARE COMMAND
; COPY 4 WORDS ZEROS
; AOJN CC,.-1
; HALT
MARK2: MOVEI K,5
MOVEM K,NTRYS'
SETZM DHED0
CAIL J,NBLKS/NSECS
JRST MARK2C
MOVE I,TOU
MOVE A,PKNUM(I)
DPB A,[DPKID DHED0] ;PACK ID FOR HEADER
DPB A,[DPKID @ENDP] ;PACK ID FOR READ-COMPARE COMMAND
JUMPN J,MARK2C
MOVE B,RIWP
MOVE A,[QCOPY EONES,3,]
MOVEM A,(B)
MOVEM A,1(B)
MARK2C: IDIVI J,NHEDS
PUSH P,J
MOVE W,TOU
SKIPGE QTRAN(W)
ADDI J,NCYLS+XCYLS ;OFFSET IF DOUBLE SIZE PHYSICAL PACK
IRP A,,[CYLBUF,@ENDP,DHED0] ;SETUP INITIAL WRITE-IMAGE COMMAND
DPB J,[DCYL A] ; " READ-COMPARE COMMAND
DPB K,[DSURF A] ; " HEADER WORD
TERMIN
POP P,J ;VIRTUAL CYLINDER #
MOVEI W,0
DPB W,[DHNXAD DHED1]
MOVEI W,1 ;END OF TRACK
CAIN K,NHEDS-1
MOVEI W,2 ;END OF CYLINDER
CAIE J,NCYLS-1
CAIN J,NCYLS+XCYLS-1
TRO W,1 ;END OF DISK
MOVE I,[440300,,DHEDR]
PUSHJ P,ENCI
MOVEI I,DHED0
MOVEI Q,NSECS
MARK2B: CAIN Q,1 ;PUT IN INCREMENT CODE
DPB W,[DHNXAD DHED1]
PUSHJ P,HCOMP ;ENCODE HEADERS
AOS DHED0
SOJG Q,MARK2B
MARK2A: CONO DC0,DCCSET\DCDENB
DATAO DC0,[DJMP CYLBUF]
MOVE A,[DWLUP,,14]
BLT A,16
JRST 14 ;WAIT IN AC'S FOR DISC, THEN FALL THRU
MARK2D: CONSO DC0,DSSERR
JRST MARK4
CONSZ DC1,DCPERR\DNXM\DDOBSY
JRST MARK3A
CONSZ DC1,DPROT
JRST MARK3B
CONSZ DC1,DOFFL\DFUNSF
JRST MARK3C
CONSO DC1,DWTHER\DCKSER\DOVRRN\DRCER\DRLNER
JRST MARK3D
MTROV: SOSLE NTRYS
JRST MARK2A
CONSZ DC1,DOVRRN
JRST MARK3A
TYPE DISK BAD
JRST CRDDT
DWLUP: CONSZ DC0,DSSACT
JRST 14
JRST MARK2D
MARK3A: TYPE MACHINE LOSSAGE
JRST CRDDT
MARK3B: TYPE NOT WRT ENABLED
JRST CRDDT
MARK3C: TYPE DRIVE LOSSAGE
JRST CRDDT
MARK3D: TYPE CONTROLLER LOSSAGE
JRST CRDDT
MARK4: SOSL J,TRKN
JRST MARK2
];DC
;INITIALIZE MFD AND TUT
; TOU AND PKNUM+n MUST BE ALREADY SET UP
MARK69: MOVE I,TOU
X MFDINN
TYPE SWAPPING ALLOC =
PUSHJ P,OTYI
PUSHJ P,CRR
X TUTINI
MOVE A,PKNUM(I)
MOVEM A,TUT+QPKNUM
TYPE PACK # =
X TDPT
X CRR
TYPE PACK ID =
PUSHJ P,6TYI
PUSHJ P,CRR
MOVEM B,TUT+QPAKID
MOVEI A,MFD
MOVE J,MFDBK
PUSHJ P,WRITT
JUMPL T,WRERR
MOVE A,TUT+QSWAPA ;SET UP FREE SPACE POINTER
CAMGE A,NUDS
MOVE A,NUDS
ADDI A,NBLKSC-1 ;JUST IN CASE QSWAPA NOT ON CYLINDER BOUNDARY
IDIVI A,NBLKSC
IMULI A,NBLKSC
MOVEM A,TUT+QTUTP
MOVEI A,TUT
PUSHJ P,WRTUT
JUMPL T,WRERR
JRST DDT
6TYI: MOVE C,[440600,,B]
MOVEI B,0
6TYL: PUSHJ P,TYI
SUBI A,40
JUMPLE A,CPOPJ
TLNE C,770000
IDPB A,C
JRST 6TYL
DC,[
HCOMP: SETOM HPAR'
MOVEI J,(I)
HRLI J,-2
HCOMP1: MOVEI B,14.
MOVE A,(J)
XORM A,HPAR
LSH A,-2
SOJG B,.-2
AOBJN J,HCOMP1
MOVE B,(I)
PUSHJ P,ENCH
MOVE B,HPAR
ANDI B,3
LSH B,20.
XORB B,1(I)
PUSHJ P,ENCH
MOVSI B,770000
HCOMP2: TDNN B,DSKBP
POPJ P,
PUSHJ P,ENCDO
JRST HCOMP2
ENCO: SKIPA A,C1
ENCZ: MOVEI A,0
ENC: ANDI A,1
HRRZ T,ENCS'
JRST @ENCT(T)
ENCT: ENC1
ENC2
ENC1
ENCZ2
ENCDO: SKIPA A,[3]
ENCDZ: MOVEI A,0
ENCD: ANDI A,3
HRRZ T,ENCS
JRST @ENCDT(T)
ENCDT: ENC2A
[JRST 4,.]
ENCZ2A
[JRST 4,.]
ENC1: HRLM A,ENCS
ENC1A: AOS ENCS
POPJ P,
ENC2: ROT A,-1
HLR A,ENCS
ROT A,2
JRST ENC2B
ENC2A: LSH A,1
AOS ENCS
ENC2B: JUMPE A,ENC1A
C1: TRO A,1
IDPB A,DSKBP'
ENC3: SETZM ENCS
POPJ P,
ENCZ2: ROT A,-1
HLR A,ENCS
JRST .+2
ENCZ2A: ROT A,-1
ASH A,2
TRO A,2
IDPB A,DSKBP
ROT A,2
TRO A,5
IDPB A,DSKBP
JRST ENC3
ENCH: LSH B,36.-28.
SKIPA C,[14.]
ENCW: MOVEI C,18.
LSHC A,2
PUSHJ P,ENCD
SOJG C,.-2
POPJ P,
ENCI: MOVEM I,DSKBP
SETZM ENCS
POPJ P,
RDLAT: CONI DC1,A ;READ LATENCY TIMER INTO A
LDB A,[DSLAT A]
RDLAT2: MOVEM A,T
CONI DC1,A
LDB A,[DSLAT A]
CAME A,T
JRST RDLAT2
POPJ P,
STBLK: MOVEM A,(D) ;STORE C(A) IN B WORDS AT D
SOJLE B,[AOJA D,CPOPJ]
HRLI D,1(D)
ADDI B,1(D)
MOVS D,D
EXCH B,D
BLT B,-1(D)
POPJ P,
STOBLK: MOVE A,[QCOPY EONES,LOBLK,]
IDIVI B,LOBLK
JUMPE B,STOBL3 ;LESS THAN ONE BLOCK NEEDED??
JUMPE C,STOBL2
CAIL C,3
JRST STOBL2
SOJ B,
ADDI C,LOBLK
STOBL2: PUSHJ P,STBLK
STOBL3: CAIGE C,3
MOVEI C,3
MOVNI C,(C)
DPB C,[DCWC A]
MOVEM A,(D)
AOJA D,CPOPJ
HBLK: QCOPY PREAMB,3, ;NORMAL HEADER
QCOPY .,3,
QCOPY POSTMB,7,
WRTRI: QCOPY PREAMB,3, ;READIN HEADER, DATA BLOCK
QCOPY RIHEDR,3,
QCOPY POSTMB,7,
QCOPY EZERS,<LRIBLK*3/2+3>,
QCOPY EONES,3,
RCBLK: DALU+DLCC+DLLB -401*NSECS(3) ;READ COMPARE "LOOP" FOR DATA WORDS
DRCC
QCOPY ZERS,4
DJMP+DAOJNC .
DHLT
LOBLK==60
DHED0: 0
DHED1: -2004&37777
DHEDR: BLOCK 3*NSECS
RIHED0: 0
RIHED1: -LRIBLK&37777
RIHEDR: BLOCK 3
EZERS: REPEAT LRIBLK*3/2+3,252525252525
EONES: REPEAT LOBLK+3,-1
PREAMB: -1 ;ONES
-26 ;ONES...0.1010
655326553265 ;1.10101.10101.10101.10101.10101.10101.10101
POSTMB: REPEAT 6,-1 ;ONES...01
-3
ZERS: BLOCK 4
];DC
RH,[
SUBTTL RH-10 PACK FORMATTING
MARK: JSR INIT
SETZM CERRS
KL,[ SWPUA ;TURN THE CACHE OFF
CONSZ APR,200000
JRST .-1
CONI PAG,A
TRZ A,600000
CONO PAG,(A)
];KL
X CRR
UNTMES FORMAT PACK ON UNIT #
X NTYI
JRST MARK
CAIL A,NUNITS
JRST MARK
X CRR
MOVE I,A
MOVEM I,TOU
SETOM MARKF
PUSHJ P,RESET
SETZM MARKF
TYPE ARE YOU SURE YOU WANT TO FORMAT PACK ON DRIVE #
X TOPT
TYPE ?
X TYI
X CRR
CAIE A,"Y
JRST DDT
TYPE PACK NO =
PUSHJ P,DTYI
PUSHJ P,CRR
MOVEM A,PKNUM(I)
MOVSI A,%HRSER ;GET DRIVE SERIAL NUMBER
PUSHJ P,RHGET
JRST RHMKER
HRLZ D,A
TLZ D,600000 ;FIRST "KEY" WORD IS SERIAL NO OF DRIVE FORMATTED ON
HRR D,PKNUM(I) ;SECOND "KEY" WORD IS I.T.S. PACK NUMBER
SETZB A,B ;GENERATE PATTERN FOR SURFACE
RHFMP1: MOVEM B,CYLBUF(A) ;CYL 0 TRACK 0 SECTOR (B) IS FIRST HEADER WORD
MOVEM D,CYLBUF+1(A) ;PUT DRIVE SERIAL NUMBER IN 3.1-4.7 OF HDR WD 2
ADDI A,2
SETZB C,H ;FILL SECTOR WITH WORST CASE PATTERN
RHFMP2: MOVE T,RHWC(H)
MOVEM T,CYLBUF(A)
AOS H
CAIL H,RHWCL
MOVEI H,0
AOS A
CAIGE C,200-1
AOJA C,RHFMP2
CAIGE B,NSECS-1 ;DO NEXT SECTOR
AOJA B,RHFMP1
CAIE A,202*NSECS
JRST 4,. ;WRONG AMOUNT OF CRUFT GENERATED
MOVE A,[-202*NSECS_4,,CYLBUF-1] ;SET UP IOWD
MOVEM A,SLVIOWD
SETZM SLVIOWD+1
MOVEI A,SLVIOWD
MOVEM A,SLVICWA
JRST RHFMT0 ;GO FORMAT
RHWC: 726666666676 ;RP04 10-MODE WORST CASE PATTERN
555555555753
333333337266
666666765555
555557533333
333372666666
667655555555
573333333333
RHWCL==.-RHWC
RHMKER: TYPE DISK ERROR
X CRR
PUSHJ P,GSTS
JRST DDT
RHFMT0: MOVEI J,NCYLS+XCYLS
RHFMT1: SOJL J,RHFMT4 ;LOOP ON CYLINDERS
MOVEI K,NHEDS
RHFMT2: SOJL K,RHFMT1 ;LOOP ON SURFACES
MOVEI B,NSECS ;ADJUST THE HEADER WORDS
MOVEI C,0
RHFMT3: DPB J,[221100,,CYLBUF(C)]
DPB K,[100500,,CYLBUF(C)]
ADDI C,202
SOJG B,RHFMT3
MOVSI A,%HRADR ;SET UP ADDRESS IN DRIVE
DPB K,[$HATRK A]
PUSHJ P,RHSET
JRST RHMKER
MOVSI A,%HRCYL ;LEAVE CYLINDER NUMBER IN RH10 "DIB" LIGHTS
HRR A,J
PUSHJ P,RHSET
JRST RHMKER
SETZM SLVICWA+1
MOVSI A,%HRCTL ;SET UP WRITE HEADERS AND DATA COMMAND
HRRI A,%HMWHD
MOVEI B,SLVICWA
DPB B,[$HCICWA A]
PUSHJ P,RHSET
JRST RHMKER
CONSO DSK,%HIDONE
JRST .-1
CONSZ DSK,%HIERR
JRST RHMKER
JRST RHFMT2
RHFMT4: TYPE FORMATTING COMPLETE, VERIFICATION BEGINS
X CRR
MOVEI J,NCYLS+XCYLS-1
RHFMT5: MOVEI A,CYLBUF
PUSHJ P,READCY
JUMPGE T,RHFMT6
TYPE CYLINDER
MOVE A,J
X TOPT
TYPE IN ERROR
X CRR
X GSTS
X CRR
JRST RHFMT9
RHFMT6: SETZB A,H ;VERIFY DATA. RELIES ON SECTOR SIZE BEING
RHFMT7: MOVE B,CYLBUF(A) ; A MULTIPLE OF RHWCL
CAME B,RHWC(H)
PUSHJ P,RHFMT8
ADDI H,1
CAIL H,RHWCL
MOVEI H,0
CAIGE A,200*NSECS
AOJA A,RHFMT7
RHFMT9: SOJGE J,RHFMT5
SKIPN A,CERRS
JRST RHFMTX
X TDPT
TYPE ECC-CORRECTED ERRORS DURING VERIFICATION.
RHFMTX: X CRR
JRST MARK69 ;HARDWARE FORMATTED, DO SOFTWARE
RHFMT8: PUSH P,A
TYPE WORD
X TOPT
TYPE OF CYLINDER
MOVE A,J
X TOPT
TYPE CORRECT
MOVE A,RHWC(H)
X TOPT
TYPE ACTUAL
MOVE A,B
X TOPT
X CRR
JRST POPAJ
];RH
RP,[
SUBTTL RP-10 PACK FORMATTING
MARK: JSR INIT
KL,[ SWPUA ;TURN THE CACHE OFF
CONSZ APR,200000
JRST .-1
CONI PAG,A
TRZ A,600000
CONO PAG,(A)
];KL
X CRR
UNTMES FORMAT PACK ON UNIT #
X NTYI
JRST MARK
CAIL A,NUNITS
JRST MARK
X CRR
MOVE I,A
MOVEM I,TOU
SETOM MARKF
PUSHJ P,RESET
SETZM MARKF
MOVSI A,(DNOOPC) ;DETERMINE TYPE OF DRIVE
DPB I,[DUNFLD A]
DATAO DPC,A
DATAI DPC,A
MOVEI B,"2
MOVEI C,NCYLS+XCYLS
TRNN A,2000
JRST .+3
MOVEI B,"3
MOVEI C,MCYLS+XCYLS
MOVEM C,LAST
TLNE A,1
JRST [ TYPE WRITE HEADER LOCKOUT SWITCH IS ON
JRST CRDDT ]
TYPE ARE YOU SURE YOU WANT TO FORMAT PACK ON RP0
MOVE A,B
X TYO
TYPE #
MOVE A,I
X TOPT
TYPE ?
X TYI
X CRR
CAIE A,"Y
JRST DDT
TYPE PACK NO =
PUSHJ P,DTYI
PUSHJ P,CRR
MOVEM A,PKNUM(I)
SETZB A,B ;GENERATE TEMPLATE TRACK
RPFMP1: MOVEI T,31. ;SYNC ZONE OF 30 ZERO WORDS
SETZM CYLBUF(A)
AOS A
SOJG T,.-2
AOS CYLBUF-1(A) ;AND ONE WORD CONTAINING 1 IN BIT 35
MOVEM B,CYLBUF(A) ;THEN ADDRESS WORD
REPEAT 4,SETZM CYLBUF+1+.RPCNT(A) ;THEN ADDR PARITY WORD AND 3 ZERO WORDS SYNC
ADDI A,5
MOVE T,RPWC ;THEN 128 DATA WORDS OF WORST CASE PATTERN
MOVEM T,CYLBUF(A)
MOVSI T,CYLBUF(A)
HRRI T,CYLBUF+1(A)
BLT T,CYLBUF+177(A)
ADDI A,200
CAIGE B,NSECS-1 ;DO NEXT SECTOR
AOJA B,RPFMP1
CAIE A,244*NSECS
JRST 4,. ;WRONG AMOUNT OF CRUFT GENERATED
MOVE A,[-244*NSECS,,CYLBUF-1] ;SET UP IOWD
MOVEM A,SLVIOWD
SETZM SLVIOWD+1
MOVEI A,SLVIOWD
MOVEM A,SLVICWA
JRST RPFMT0 ;GO FORMAT
RPMKER: TYPE DISK ERROR
X CRR
PUSHJ P,GSTS
JRST DDT
RPFMT0: MOVE J,LAST ;HIGHEST CYLINDER # + 1
RPFMT1: SOJL J,RPFMT4 ;LOOP ON CYLINDERS
MOVEI K,NHEDS
RPFMT2: SOJL K,RPFMT1 ;LOOP ON SURFACES
MOVEI B,NSECS ;ADJUST THE HEADER WORDS
MOVEI C,0
RPFMT3: DPB J,[121100,,CYLBUF+37(C)]
DPB K,[050500,,CYLBUF+37(C)]
MOVE D,CYLBUF+37(C) ;COMPUTE HEADER PARITY WORD
MOVEI T,36.
MOVSI TT,(SETZ) ;ODD PARITY
RPFMTP: TRNE D,1
TLC TT,(SETZ)
ROT D,1
SOJG T,RPFMTP
MOVEM TT,CYLBUF+40(C)
ADDI C,244
SOJG B,RPFMT3
MOVSI A,300000 ;WRITE FORMAT
ADDI A,SLVICWA
DPB J,[DCYL A]
ROT J,-8 ;EXTRA BIT FOR RP03
DPB J,[DCYLXB A]
ROT J,8
DPB K,[DSURF A]
DPB I,[DUNFLD A]
MOVEM J,RPIOCY
PUSHJ P,SEEK
JRST RPMKER
DATAO DPC,A
CONSO DPC,DONE
JRST .-1
CONSZ DPC,ALLER
JRST RPMKER
JRST RPFMT2
RPFMT4: TYPE FORMATTING COMPLETE, VERIFICATION BEGINS
X CRR
SOS J,LAST
RPFMT5: MOVEI A,CYLBUF
PUSHJ P,READCY
JUMPGE T,RPFMT6
TYPE CYLINDER
MOVE A,J
X TOPT
TYPE DOESN'T READ -- GIVING UP ON IT.
X CRR
X GSTS
X CRR
JRST RPFMT9
RPFMT6: SETZB A,H ;VERIFY DATA.
MOVE D,RPWC
LSH D,1 ;CONTROL DROPS ONE BIT DURING WRITE FORMAT
RPFMT7: MOVE B,CYLBUF(A)
CAME B,D
PUSHJ P,RPFMT8
CAIGE A,200*NSECS
AOJA A,RPFMT7
RPFMT9: SOJGE J,RPFMT5
X CRR
JRST MARK69 ;HARDWARE FORMATTED, DO SOFTWARE
RPFMT8: PUSH P,A
TYPE WORD
X TOPT
TYPE OF CYLINDER
MOVE A,J
X TOPT
TYPE CORRECT
MOVE A,RPWC
X TOPT
TYPE ACTUAL
MOVE A,B
X TOPT
X CRR
JRST POPAJ
RPWC: 714533,,462556 ;WORST CASE PATTERN
];RP
CONSTA
];NTS
NTS,[
SUBTTL MFDR - RECONSTRUCT MFD FROM UFDS
MFDR: MOVEI P,PDL
PUSHJ P,CRR ;RECONSTRUCT MFD BY GETTING NAMES FROM UFD'S
UNTMES RECONSTRUCT MFD FROM UNIT #
PUSHJ P,NTYI
JRST MFDR
MOVE I,A
PUSHJ P,MFDINN
SETOM IMNFLG
MOVEI J,0
MFDR1: MOVEI A,TUT
PUSHJ P,READ
JUMPL T,MFDRL
MOVE B,TUT+UDESCP ;LOOK LIKE LEGIT UFD?
TLNE B,-1
JRST MRUFDL ;SHOULD BE F.S. PNTR
CAIL B,<2000.-11.>*6
JRST MRUFDL
MOVE B,TUT+UDNAMP
SKIPE TUT+UDNAME ;USER NAME
TLNE B,-1
JRST MRUFDL ;PNTR TO BEG OF NAME AREA
MOVEI B,(J) ;CONVERT BLOCK NO TO MFD INDEX
SUB B,NUDS
LSH B,1
ADDI B,2000
MOVE C,TUT+UDNAME ;USER NAME
MOVEM C,MFD(B)
AOSN IMNFLG
MOVEM B,MFD+MDNAMP
JRST MRUFDW
MFDRL: JRST 4,.+1
MRUFDL: JFCL
MRUFDW:
ADDI J,1
CAMGE J,NUDS
JRST MFDR1
TYPE WRITE?
PUSHJ P,TYI
CAIE A,"Y
JRST DDT
MFDWR: MOVEI A,MFD
MOVE J,MFDBK
PUSHJ P,WRITE
JRST DDT
];NTS
IMNFLG: 0
SUBTTL INITIALIZE MFD
MFDINN: CLEARM MFD
MOVE A,[MFD,,MFD+1]
BLT A,MFD+1777
MOVE A,[SIXBIT /M.F.D./]
MOVEM A,MFD+MDCHK
MOVE A,NUDS
MOVEM A,MFD+MDNUDS
MOVEI A,2000
MOVEM A,MFD+MDNAMP
POPJ P,
SUBTTL INITIALIZE TUT
;DRIVE NUMBER IN I, SWAPPING ALLOC IN A
TUTINI: CLEARM TUT
MOVE B,[TUT,,TUT+1]
BLT B,TUT+<2000*MXTUTB>-1
MOVEM A,TUT+QSWAPA
MOVE K,A
CAMGE K,NUDS
MOVE K,NUDS ;K HAS BASE OF FILE AREA
MOVEI J,NBLKS ;DETERMINE HOW MANY BLOCKS THIS DRIVE
RP,[ MOVSI A,(DNOOPC)
DPB I,[DUNFLD A] ;SELECT DRIVE
DATAO DPC,A
DATAI DPC,A
TRNE A,2000
MOVEI J,MBLKS ;RP03 HAS MORE BLOCKS
];RP
IFN T300P,[
CAIL I,T300P
MOVEI J,NBLKS1
];T300P
MOVEM J,TUT+QLASTB ;LAST REGULAR BLOCK IS LAST TUT'ED
IFN T300P,[
MOVEI A,<2000*NTUTBL-LTIBLK>*TUTEPW
CAIL I,T300P
MOVEI A,<2000*NTUTB1-LTIBLK>*TUTEPW
SUB J,A
];T300P
.ELSE SUBI J,<2000*NTUTBL-LTIBLK>*TUTEPW ;SUBTRACT MAX NUMBER OF TUTABLE BLOCKS
CAMLE J,K ;IS THERE ROOM FOR ALL OF FILE AREA?
JRST 4,. ;NOPE
SKIPGE J
MOVEI J,0
MOVEM J,TUT+QFRSTB
MOVEI A,TUT
TUTFIL: MOVEI K,TUTLK ;ENTER HERE FROM SALV1, A -> TUT
MOVSI D,440000+TUTBYT_6
ADDI D,LTIBLK(A)
MOVE B,NUDS
SUB B,QFRSTB(A)
JUMPLE B,TUTI1A
TUTI1: IDPB K,D ;MARK OUT USER DIR AREA
SOJG B,TUTI1
TUTI1A: MOVEI B,(A)
MOVSI D,-LSBTAB
TUTI2: SKIPGE J,SBTAB(D)
JRST TUTI3 ;NOT REALLY THERE
PUSHJ P,TUTPNT
MOVEI K,TUTLK
DPB K,J ;MARK OUT BLOCK
TUTI3: AOBJN D,TUTI2
MOVE D,NTBL(I) ;MARK OUT TUT (SIZE VARIES)
TUTI4: MOVE J,MFDBK
SUB J,D
PUSHJ P,TUTPNT
MOVEI K,TUTLK
DPB K,J
SOJG D,TUTI4
POPJ P,
;TUTPNT - ROUTINE TO ACCESS THE TUT
; CALL WITH BLOCK NUMBER IN J, POINTER TO TUT IN B
; RETURNS WITH BYTE POINTER IN J (0 IF BLOCK NOT TUT'ED)
; K IS CLOBBERED
;
;TUTPNN - SAME BUT CALL WITH DISK NUMBER IN I, CLOBBERS B TO NEW TUT ADDR
;
;TUTPNO - SAME BUT CALL WITH DISK NUMBER IN I, CLOBBERS B TO OLD TUT ADDR
TUTPNN: SKIPA B,QNTUTO(I)
TUTPNO: MOVE B,QOTUTO(I)
TUTPNT: CAMGE J,QLASTB(B)
CAMGE J,QFRSTB(B)
TDZA J,J
CAIA
POPJ P, ;BLOCK NOT TUT'ED, RETURN J=0
SKIPGE QPKNUM(B)
JRST [ TYPE OLD FORMAT TUT?
JRST ERRDDT ]
SUB J,QFRSTB(B)
IDIVI J,TUTEPW
HLL J,QTTBL(K)
ADDI J,LTIBLK(B)
POPJ P,
SUBTTL MAIN SALVAGER
GOGO: JRST GOGO0 ;VECTOR OF MYSTERIES
SALVAG: JRST GOGO1 ;(IN CASE UP CREEK WITHOUT SYMBOL TABLE)
CHKR: JRST CHKR0
NTS,[
JFCL LPBUST ;-> LPT BUSTED FLAG
JFCL NOQUES ;-> NO QUESTIONS FLAG
JFCL GOODUN ;-> ONLY ROUTINE THAT KNOWS WHICH ARE "RIGHT" PACKS
JFCL GETSTS ;-> ROUTINE TO TYPEOUT CURRENT DISK STATUS
JFCL DSKTST ;-> SIMPLE READ/WRITE TEST
JFCL SEKTST ;-> SIMPLE SEEK TEST (READ ONLY)
JFCL DUP ;-> DISK COPYING ROUTINE
JFCL HCRASH ;-> AS FAST AS POSSIBLE FLAG
];NTS
GOGO1: JSR INIT
SETOM NOQUES ;IF STARTED BY BEG$G IN ITS, BE FAST.
JRST GOGO2 ;(NO ROUTINE TYPEOUT)
GOGO0: JSR INIT
GOGO2: SETOM GOGOX ;AUTOMATIC MODE
TYPE SALVAGER.
MOVE A,[.FNAM2]
X T6B
X CRR
MOVEI A,NUNITS-1
SETOM QACT(A) ;ALL UNITS ACTIVE
SOJGE A,.-1
PUSHJ P,ACTUN ;ACTIVATE ALL UNITS THAT ARE ON-LINE
PUSHJ P,GOODUN ;MAKE SURE ALL PACKS THAT SHOULD BE MOUNTED ARE
MOVEM I,MDSK ;FIRST ACTIVE UNIT IS DSK TO GET MFD FROM
MOVEM I,UDSK ;.. DSK TO GET UFD'S FROM
PUSHJ P,DRPHAS ;VERIFY THAT DIRECTORIES ON ALL PACKS ARE IN PHASE
SETZM CKFLSW ;DON'T CHECK ALL BLOCKS
JRST SALV1
CHKR0: JSR INIT ;ASK QUESTIONS MODE
TYPE SALVAGER.
MOVE A,[.FNAM2]
PUSHJ P,T6B
PUSHJ P,CRR
MOVEI A,NUNITS-1
SETZM QACT(A)
SOJGE A,.-1
TYPE ACTIVE UNITS ARE:
CHKR1: PUSHJ P,NTYI
JRST CHKR2
CAIGE A,NUNITS
SETOM QACT(A)
JRST CHKR1
CHKR2: PUSHJ P,CRR
PUSHJ P,ACTUN
CHKR3: UNTMES USE MFD FROM UNIT:
PUSHJ P,NTYI
JRST CHKR3
CAIGE A,NUNITS
SKIPN QACT(A)
JRST CHKR3
MOVEM A,MDSK
PUSHJ P,CRR
PUSHJ P,DRPHAS ;VERIFY THAT DIRECTORIES ON ALL PACKS ARE IN PHASE
SETZM CKFLSW
SETZM CKFIX
DC, TYPE CHECK FILES FOR CLOBBERED BLOCKS?
.ELSE TYPE READ ALL BLOCKS OF ALL FILES?
PUSHJ P,TYI
CAIN A,"Y
SETOB A,CKFLSW
PUSHJ P,CRR
JUMPGE A,CHKR4
DC,[ TYPE FIX POINTERS THEN?
SETOM CKFIX
X Y.OR.N
SETZM CKFIX
];DC
CHKR4: UNTMES GET USR DIRS FROM UNIT:
PUSHJ P,NTYI
JRST CHKR4
CAIGE A,NUNITS
SKIPN QACT(A)
JRST CHKR4
PUSHJ P,CRR
MOVEM A,UDSK
JRST SALV1
ACTUN: MOVEI C,NUNITS-1
ACTUN2: SKIPN QACT(C)
JRST ACTUN1
MOVE I,C
PUSHJ P,RESET
SKIPN QACT(C) ;STILL THERE?
JRST ACTUN1
MOVE I,C
MOVE A,QOTUTO(I)
PUSHJ P,RDTUT
JUMPL T,ACTUE1
MOVE I,QOTUTO(C)
MOVE A,QPKNUM(I)
ANDI A,37
MOVEM A,QPKN(C)
SKIPE NOQUES
JRST ACTUN1
TYPE UNIT #
MOVE A,C
PUSHJ P,DPT
TYPE ID IS
MOVE A,QPAKID(I)
PUSHJ P,T6B
TYPE PK #
MOVE A,QPKNUM(I)
PUSHJ P,TDPT
IFN DC10P+RH10P,[
MOVE A,PKNUM(C)
CAMN A,QPKNUM(I)
JRST ACTUN4
IFN T300P,[
CAIL C,T300P
JRST ACTUN4 ;PKNUM NOT REALLY SET UP
];T300P
TYPE (HARDWARE SAYS
PUSHJ P,TDPT
TYPE )
ACTUN4: ]
SKIPN A,QTRSRV(I)
JRST ACTUN5
CAMN A,[-1]
JRST [ TYPE (RESERVED)
JRST ACTUN5 ]
PUSHJ P,TSPAC
PUSHJ P,SIXTYP
TYPE :
ACTUN5: PUSHJ P,CRR
ACTUN1: SOJGE C,ACTUN2
SETOM ACTIVE
POPJ P,
ACTUE1: TYPE Error reading TUT block
PUSHJ P,CRR
PUSHJ P,GSTS
JRST ERRDDT
ACTUE3: TYPE Error reading MFD block
PUSHJ P,CRR
PUSHJ P,GSTS
JRST ERRDDT
ACTIVE: 0 ;-1 IF ALREADY HAVE RESET DRIVES
;MAKE SURE ALL NECESSARY PACKS ARE MOUNTED
GOODUN:
NTS,[ MOVEI A,FIRSPK ;AND RETURN MASTER DISK # IN I
GOODN1: MOVEI C,NUNITS-1
GOODN2: SKIPE QACT(C)
CAME A,QPKN(C)
SOJGE C,GOODN2
JUMPL C,GOODN3 ;THIS PACK MISSING
CAIGE A,LASTPK
AOJA A,GOODN1
MOVEI A,LASTPK-FIRSPK+1 ;NUMBER OF PRIMARY PACKS
MOVEI C,NUNITS-1 ;SCAN FOR SECONDARY PACKS
GOODN4: SKIPN QACT(C)
JRST GOODN5
MOVE B,QOTUTO(C)
SKIPE B,QTRSRV(B)
CAMN B,[-1]
JRST GOODN5
ADDI A,1 ;THIS SECONDARY PACK IS OK TO HAVE MOUNTED
GOODN5: SOJGE C,GOODN4
];NTS
MOVEI C,NUNITS-1 ;AND FIND MASTER DISK (LOWEST NUMBERED ACTIVE UNIT)
SKIPE QACT(C) ;ALSO COMPUTE GOOD PACKS - ALL PACKS IN A
JRST [ MOVE I,C
SOJA A,.+1 ]
SOJGE C,.-2
NTS, JUMPGE A,CPOPJ
NTS, TYPE EXTRA PACKS MOUNTED.
NTS, JRST ERRDDT
TS, POPJ P,
GOODN3: TYPE PACK #
X TDPT
TYPE NOT MOUNTED
JRST ERRDDT
TS, DRPHAS: POPJ P,
NTS,[
;CHECK THAT DIRECTORIES ARE IN PHASE ON ALL PACKS
DRPHAS: MOVEI I,NUNITS-1
DRPHS1: SKIPN QACT(I) ;FIRST, GET ALL THE MFDS
JRST DRPHS2
MOVE J,MFDBK
MOVE A,QNTUTO(I)
PUSHJ P,READ
JUMPL T,ACTUE3
DRPHS2: SOJGE I,DRPHS1
MOVE I,MDSK ;GET MASTER DISK'S ASCENDING DIRECTORY NUMBER
MOVE A,@QNTUTO(I) .SEE MDNUM
MOVE B,A
SUBI B,1
MOVEI I,NUNITS-1 ;SEE IF ALL OTHERS ARE THE SAME, OR AT MOST 1 LESS
DRPHS3: SKIPE QACT(I)
JRST [ CAMG B,@QNTUTO(I) .SEE MDNUM
CAMGE A,@QNTUTO(I) .SEE MDNUM
JRST DRPHS6
JRST .+1 ]
SOJGE I,DRPHS3
POPJ P,
DRPHS6: TYPE DIRECTORIES OUT OF PHASE.
X CRR
MOVEI I,0
DRPHS4: SKIPN QACT(I)
JRST DRPHS5
UNTMES UNIT #
HRRZ A,I
X TOPT
TYPE PACK #
MOVE A,QPKN(I)
X TDPT
TYPE , MDNUM=
MOVE A,@QNTUTO(I) .SEE MDNUM
X TOPT
X CRR
DRPHS5: CAIGE I,NUNITS-1
AOJA I,DRPHS4
TYPE VERIFY THAT THE PROPER PACKS ARE MOUNTED. IF YOU AREN'T SURE,
X CRR
TYPE GET HELP. IF THEY ARE PROPER, AND ONE IS JUST COMING ON-LINE
X CRR
TYPE AFTER BEING OFF FOR A WHILE, YOU WILL HAVE TO UCOP TO IT.
SKIPE GOGOX
JRST ERRDDT
JRST CRR
];NTS
SALV1: SETZM MFDWRT ;-1 IF MFD MODIFIED (DIRECTORIES DELETED)
SETZM SHARED
MOVEI I,NUNITS-1
SALV2: SKIPN QACT(I)
JRST SALV3
HRRZ B,QNTUTO(I) ;ZERO OUT NEW TUT
HRL B,B
SETZM (B)
MOVE A,B
AOS B
BLT B,2000*MXTUTB-1(A)
HRRZ B,QNTUTO(I) ;COPY RANDOM INFO FROM OLD TUT TO NEW
HRL B,QOTUTO(I)
MOVE A,B
BLT A,LTIBLK-1(B)
HRRZ A,QNTUTO(I)
PUSHJ P,TUTFIL ;FILL IN BLOCKS AREA OF TUT
SALV3: SOJGE I,SALV2
MOVE I,MDSK
MOVEI A,MFD
MOVE J,MFDBK
PUSHJ P,READ
JUMPL T,ACTUE3
MOVE A,MFD+MDNUDS
CAME A,NUDS
JRST [ TYPE Wrong NUDSL version =
X TDPT
JRST ERRDDT]
MOVE A,MFD+MDCHK
CAME A,[SIXBIT /M.F.D./]
JRST [ TYPE MFD check word garbaged?
X T6B
X CRR
SKIPN GOGOX
X CONTIN
JRST ERRDDT
JRST .+1]
MOVE Q,MFD+MDNAMP
ADDI Q,MFD
MFDLUP: CAIL Q,MFD+2000
JRST MFDFIN
SKIPN A,MNUNAM(Q)
JRST MFDLU1
PUSHJ P,USRLUP
SKIPN LFILES
PUSHJ P,DELUSR
MFDLU1: ADDI Q,LMNBLK
JRST MFDLUP
DELUSR: MOVE A,MNUNAM(Q)
CAMN A,[SIXBIT /.LPTR./]
POPJ P,
PUSHJ P,T6B
TYPE ; NO FILES, USER DIRECTORY DELETED
PUSHJ P,CRR
SETZM MNUNAM(Q)
SETOM MFDWRT
POPJ P,
USRLUP: MOVEM A,USRNAM
SETZM UFDLOS
SETZM UFDSEE ;-1 IF ANY ERROR OCCURS, PRINT WHOLE UFD
SETZM LFILES
MOVE J,Q
SUBI J,MFD+2000 ;MAP MFD ENTRY INTO UFD BLOCK
IDIVI J,LMNBLK ; -Nth USER DIRECTORY
ADD J,NUDS ;END OF USER DIR AREA - N
PUSH P,Q
PUSH P,UDSK ;SAVE UFD DISK, MIGHT CHANGE IF UFD IS BAD
MOVEM J,DBLK
MOVE I,UDSK
USRLU1: MOVEI A,OUSRD ;COME BACK TO HERE ON TRY NEXT DRIVE
PUSHJ P,READ
JUMPL T,USRLE2
MOVE Q,OUSRD+UDNAME
CAME Q,USRNAM
JSR USRLE4
MOVE Q,[OUSRD,,NUSRD]
BLT Q,NUSRD+1777 ;COPY OLD FOR GARBAGE CHECK
MOVEI Q,2000-LUNBLK+OUSRD
MOVEI J,OUSRD
ADD J,UDNAMP(J) ;LOWEST FILE NAME BLOCK
CAIG J,OUSRD+2000
CAIGE J,OUSRD+UDDESC
JRST USRLE3 ;NAME POINTER OUTSIDE BLOCK! (try next drive)
MOVE T,OUSRD+UDESCP
IDIVI T,6
ADDI T,OUSRD+UDDESC
CAML T,J
JRST USRLE7 ;NAME AND DESCRIPTOR AREAS OVERLAP (try next drive)
PUSH P,J ; FILE NAME POINTER
;PER FILE LOOP
DIRL1: CAMGE Q,J
JRST USRFIN
SETOM FILEER ; PRINT FILE NAME ONLY ON FIRST ERROR
SETZM BADFIL ; SET IF BAD RETRIEVAL DISCOVERED
MOVEM Q,LASTQ
SKIPN A,UNFN1(Q)
SKIPE UNFN2(Q)
CAIA
JRST DIRLUP
AOS LFILES
LDB C,[UNPKN UNRNDM(Q)]
LDB A,[UNDSCP UNRNDM(Q)]
CAML A,OUSRD+UDESCP
JRST DIRLE1 ;POINTS OUTSIDE DESC AREA (ignore)
IDIVI A,6
ADDI A,OUSRD+UDDESC
HLL A,QBTBLI(B)
TLNE A,400000
SUB A,[440000,,1]
MOVEI ZR,0
LDB B,A
JUMPN B,DIRLE2 ;NOT PRECEEDED BY ZERO (ignore)
DIRL2: MOVE N,A
MOVEI J,0
ILDB B,A
JUMPE B,DIRLE3 ;POINTS TO ZERO (ignore)
DIRL3: MOVE TT,UNRNDM(Q)
TLNE TT,UNLINK
JRST LINK
SETZM NOTUT
PUSHJ P,FINDPK ;FIND WHICH PACK
SKIPL C
SKIPN QACT(C)
SETOM NOTUT ;FILE ON UNMOUNTED PACK, DON'T HACK TUT
MOVEM C,FUNIT
SETZM LSTBLK
SETZM ADRSET
TRLUP: MOVE TT,N
ADDI TT,NUSRD-OUSRD
IDPB ZR,TT
ILDB B,N
JUMPE B,DIRLUP
CAIN B,UDWPH ; WRITE PLACE HOLDER, OR NULL FILE
JRST TRLUP
CAIL B,UDWPH
JRST LOAD
CAILE B,UDTKMX
JRST SKIPF
JRST TLUP
TLUP: AOS Q
TLUP1: MOVE A,Q
SKIPN ADRSET
JRST DIRLE4 ;NO STARTING BLOCK (ignore untill jmp)
SKIPE NOTUT ;IF NOT ON ACTIVE UNIT, SKIP FILE
JRST CKFL3
MOVE D,QOTUTO(C)
CAML A,QLASTB(D)
JRST DIRLE5 ;BLOCK OFF DSK (ignore block)
CAMGE A,QFRSTB(D)
JRST DIRLE5
CAMGE A,NUDS
JRST DIRLE6 ;POINTS TO UFDS (ignore block)
CKFL2A: MOVSI D,-LSBTAB
CAMN A,SBTAB(D)
JRST DIRLE6 ;SPECIAL BLOCK
AOBJN D,.-2
MOVE D,MFDBK
SUB D,NTBL(C)
CAML A,D
CAMLE A,MFDBK
CAIA
JRST DIRLE6 ;TUT
NTS,[ SKIPGE CKFLSW
PUSHJ P,CKFL
];NTS
MOVEM Q,LSTBLK
SKIPN NOTUT
SKIPN ADRSET
JRST CKFL3
MOVE D,J ;SEE IF BLOCK LOCKED
SUBI D,NTUT0-OTUT0 ;(LOCK BYTES NOT IN NEW TUT YET)
ILDB D,D
CAIN D,TUTLK
PUSHJ P,DIRLEB
ILDB D,J
SKIPE D
JSR DIRLE7 ;SHARED BLOCK
CAIGE D,TUTMNY
AOS D
DPB D,J
MOVE K,J
SUBI K,NTUT0-OTUT0
LDB D,K
JUMPE D,DIRLE9
CKFL3: SOJG B,TLUP
JRST TRLUP
OLDFIL: SETOM UFDSEE ;PRINT WHOLE UFD LATER
AOSE FILEER
JRST CKFL2A
TYPE !!! Over-writing user-directory area block
MOVE A,Q
X DPT
TYPE , BY
X PNTNAM
JRST CKFL2A
CKFL: PUSH P,J
PUSH P,I
SETOM XWDSEE
MOVE J,A
MOVEI A,FDBUF
MOVE I,C
PUSHJ P,READ
CKFLBP: JUMPL T,CKFLE1
CKFL4:
DC,[ MOVE A,RXWDS+XWSYSN
CAME A,USRNAM
JRST CKFLE2
CKFL5: LDB A,[XWBLK RXWDS]
CAME A,LSTBLK
JRST CKFL6
CKFL6A: SKIPE CKFIX ;FIX ERRORS?
SKIPGE XWDSEE ;ANY ERRORS?
JRST CKFL7
LDB A,[XWAWC RXWDS]
DPB A,[XWAWC WXWDS]
MOVE A,LSTBLK
DPB A,[XWBLK WXWDS]
MOVE A,USRNAM
MOVEM A,WXWDS+XWSYSN
MOVE Q,LASTQ
MOVE A,UNFN1(Q)
MOVEM A,WXWDS+XWFN1
MOVE A,UNFN2(Q)
MOVEM A,WXWDS+XWFN2
MOVEI A,FDBUF
PUSHJ P,WRITE
MOVEI A,FDBUF
PUSHJ P,READ
JUMPL T,CKFLE1
LPR RETRIEVAL NOW:
PUSHJ P,LPTXWD
SETOM XWDSEE
JRST CKFL4
];DC
CKFL7: POP P,I
POP P,J
POPJ P,
CKFLE1: PUSHJ P,PNTNAM
TYPE ERROR READING BLOCK
CKFLE3: MOVE A,J
PUSHJ P,DPT
PUSHJ P,CRR
PUSHJ P,PNTXWD
PUSHJ P,GSTS
JRST CKFL4
DC,[
CKFLE2: JRST CKFL6A ;JFCL THIS IF YOU HATE ARCHIVES
AOS BADFIL
PUSHJ P,LPTNAM
X LTAB
X LPTXWD
X LTAB
LPR Retrieval User-name differs
LDB A,[XWBLK RXWDS]
CAMN A,LSTBLK
JRST [ X LCRR
JRST CKFL6A]
LPR ,
JRST CKFLE4
CKFL6: JRST CKFL6A ;JFCL THIS IF YOU HATE ARCHIVES
AOS BADFIL
PUSHJ P,LPTNAM
X LTAB
X LPTXWD
X LTAB
CKFLE4: LPR Chain pointer wrong, Last block=
MOVE A,LSTBLK
PUSHJ P,LOPT
PUSHJ P,LCRR
JRST CKFL6A
];DC
LOAD: SETOM ADRSET ;B HAS BYTE WHERE UDWPH < BYTE <=77
ANDCMI B,20 ;DM FUNNY BITS
MOVEI J,-UDWPH-1(B)
MOVEI K,NXLBYT
LOAD1: MOVE TT,N
ADDI TT,NUSRD-OUSRD
IDPB ZR,TT
ILDB B,N
LSH J,6
ADD J,B
SOJG K,LOAD1
MOVE Q,J
SKIPE NOTUT
JRST LOAD2 ;THIS DRIVE NOT ACTIVE
MOVE I,C
PUSHJ P,TUTPNN ;GET POINTER TO NEW TUT
ADD J,[TUTBYT_14,,] ;BACK UP FOR ILDB
LOAD2: MOVEI B,1
JRST TLUP1
SKIPF: SUBI B,UDTKMX
IBP J
AOS Q
SOJG B,.-2
MOVEI B,1
JRST TLUP
LINK: MOVE TT,N
ADDI TT,NUSRD-OUSRD
PUSHJ P,LTYPE
JRST DIRLEC
PUSHJ P,LTYPE
JRST DIRLEC
PUSHJ P,LTYPE
JRST DIRLUP
ILDB B,N
JUMPE B,DIRLUP
JRST DIRLE8 ;LINK NOT FOLLOWED BY ZERO (ignore)
LTYPE: MOVEI B,6
LTYPE2: IDPB ZR,TT
ILDB A,N
JUMPE A,CPOPJ ;NON SKIP RETURN IF FOLLOWED BY ZERO
CAIN A,':
JRST [ ILDB A,N
IDPB ZR,TT
JRST LTYPE3]
CAIE A,';
LTYPE3: SOJG B,LTYPE2
JRST POPJ1 ;SKIP RETURN IF ENDS NATURALLY
DIRLUP: SKIPN BADFIL
JRST DIRLP1
TYPE BAD RETRIEVAL:
X PNTNAM
DIRLP1: MOVE Q,LASTQ
MOVE J,(P)
MOVSI A,UNMARK
ANDCAM A,UNRNDM(Q)
SUBI Q,LUNBLK
JRST DIRL1
FINDPK: PUSH P,B ;MAP PACK NUMBER IN C, TO UNIT NUMBER
MOVEI B,NUNITS-1
CAMN C,QPKN(B)
JRST FINDP1
SOJGE B,.-2
SETOM C
POP P,B
POPJ P,
FINDP1: HRRZ C,B
POP P,B
POPJ P,
USRLE2: TYPE USR DIRECTORY READ ERROR
SETOM FLAG' ;HARDWARE ERROR
USRL2A: PUSHJ P,TSPAC
MOVE A,USRNAM
PUSHJ P,SIXTYP
MOVEI A,";
PUSHJ P,TYO
PUSHJ P,CRR
SKIPE FLAG
PUSHJ P,GSTS ;PRINT CONTROLLER STATUS
SKIPE GOGOX
JRST ERRDDT
TYPE TRY NEXT DRIVE?
PUSHJ P,TYI
CAIE A,"Y
JRST CRDDT
PUSHJ P,CRR
MOVE I,UDSK
USRL2B: AOS I
CAIL I,NUNITS
SUBI I,NUNITS
SKIPN QACT(I)
JRST USRL2B
MOVEM I,UDSK ;WILL GET POPED BEFORE NEXT USER
SETOM UFDLOS ;CAUSE DIR TO BE WRITTEN ON ALL DRIVES
MOVE J,DBLK
JRST USRLU1
USRLE3: TYPE User directory name-pointer scrambled
SETZM FLAG
JRST USRL2A
USRLE7: TYPE Name area, descriptor area overlap
SETZM FLAG
JRST USRL2A
USRLE4: 0 ;USR NAME IN DIR DIFFERS
TYPE USER NAME IN DIRECTORY DIFFERS
PUSHJ P,TSPAC
MOVE A,USRNAM
PUSHJ P,T6B
TYPE ; BLOCK
MOVE A,DBLK
X DPT
UNTMES , UNIT
MOVE A,I
PUSHJ P,DPT
TYPE , DIR HAS
X TSPAC
MOVE A,OUSRD+UDNAME
X T6B
PUSHJ P,CRR
SKIPE GOGOX
JRST ERRDDT
TYPE CORRECT IT? (MFD ENTRY TAKEN AS GOOD)
PUSHJ P,TYI
X CRR
CAIE A,"Y
JRST ERRDDT
MOVE A,USRNAM
MOVEM A,OUSRD+UDNAME
MOVEI A,OUSRD
PUSHJ P,WRITE
JRST @USRLE4
USRLE5: SETOM UFDSEE
SKIPN GARBF
PUSHJ P,PGARBF
LPR , POINTER=
MOVE A,Q
PUSHJ P,LOPT
LPR , GARBAGE IS
MOVE A,NUSRD(Q)
ANDCAM A,OUSRD(Q) ;CLEAR OUT THE GARBAGE
PUSHJ P,LOPT
PUSHJ P,LCRR
AOJA Q,GARB6
PGARBF: LPR GARBAGE IN FREE AREA
PUSHJ P,LCRR
MOVE A,USRNAM
PUSHJ P,L6B
LPR ; Block #
MOVE A,DBLK
PUSHJ P,LOPT
PUSHJ P,LCRR
SKIPE GOGOX
JRST ERRDDT
SETOM UFDLOS
SETOM GARBF
POPJ P,
USRLE6: SETOM UFDSEE
SKIPN EXGARB
PUSHJ P,PEXGAR
MOVE A,J
PUSHJ P,LOPT
PUSHJ P,LSPAC
MOVE A,B
PUSHJ P,LOPT
PUSHJ P,LCRR
MOVE TT,Q
SUBI TT,NUSRD-OUSRD
DPB ZR,TT
JRST GARB3
PEXGAR: LPR EXTRA GARBAGE IN UFD
PUSHJ P,LCRR
MOVE A,USRNAM
PUSHJ P,L6B
LPR ; Block #
MOVE A,DBLK
PUSHJ P,LOPT
PUSHJ P,LCRR
SKIPE GOGOX
JRST ERRDDT
SETOM UFDLOS
SETOM EXGARB
POPJ P,
PNTNAM: PUSH P,NOLPT
SETOM NOLPT
X LPTNAM
POP P,NOLPT
POPJ P,
LPTNAM: PUSH P,A ;DIRLE5 ETC.
MOVE A,USRNAM
PUSHJ P,L6B
MOVEI A,";
PUSHJ P,LTYO
CAIA
LPTFIL: PUSH P,A ;AVOID PDL SCREWAGE
PUSH P,B
PUSH P,C
MOVE B,LASTQ
MOVE A,UNFN1 (B)
PUSHJ P,L6B
PUSHJ P,LSPAC
MOVE A,UNFN2(B)
PUSHJ P,L6B
LDB C,[UNPKN UNRNDM(B)]
LPR PACK
MOVE A,C
X LDPT
X FINDPK ;FIND PACK FILE IS ON
JUMPL C,LPTFI1
LPR , UNIT #
MOVE A,C
X LDPT
LPTFI1: PUSHJ P,LCRR
INSIRP POP P,[C B A]
POPJ P,
PNTXWD: PUSH P,NOLPT
SETOM NOLPT
X LPTXWD
POP P,NOLPT
POPJ P,
LPTXWD:
DC,[
PUSH P,A
LPR Extra words: Block #
MOVE A,UNIT
X LDPT
MOVEI A,"-
X LTYO
MOVE A,BLK
X LOPT
X LSPAC
MOVE A,RXWDS+XWSYSN
PUSHJ P,L6B
MOVEI A,";
PUSHJ P,LTYO
MOVE A,RXWDS+XWFN1
PUSHJ P,L6B
PUSHJ P,LSPAC
MOVE A,RXWDS+XWFN2
PUSHJ P,L6B
LPR , Chain pointer=
LDB A,[XWBLK RXWDS]
PUSHJ P,LOPT
LPR , active wd cnt=
LDB A,[XWAWC RXWDS]
PUSHJ P,LOPT
PUSHJ P,LCRR
POP P,A
];DC
SETZM XWDSEE .SEE CKFL6A
POPJ P,
DIRLE1: PUSHJ P,LPTNAM
LPR DESC POINTS OUT OF DESC AREA
PUSHJ P,LCRR
SKIPE GOGOX
JRST ERRDDT
SETOM UFDSEE
JRST DIRLUP
DIRLE2: PUSHJ P,LPTNAM
LPR FILE NOT PRECEEDED BY ZERO
PUSHJ P,LCRR
SKIPE GOGOX
JRST ERRDDT
SETOM UFDSEE
JRST DIRL2
DIRLE3: PUSHJ P,LPTNAM
LPR FILE POINTS TO ZERO
PUSHJ P,LCRR
SKIPE GOGOX
JRST ERRDDT
SETOM UFDSEE
JRST DIRL3
DIRLE4: PUSHJ P,LPTNAM
LPR STARTING ADDRESS NOT SET
DIRL4A: X LCRR
SKIPE GOGOX
JRST ERRDDT
SETOM UFDSEE
JRST CKFL3
DIRLE5: PUSHJ P,LPTNAM
LPR BLOCK POINTS OFF DSK
X LOPT
JRST DIRL4A
DIRLE6: PUSHJ P,LPTNAM
LPR BLOCK IN RESERVED AREA
X LOPT
JRST DIRL4A
DIRLE7: 0
PUSHJ P,LPTNAM
LPR SHARES BLOCK WITH SOME OTHER FILE
X LCRR
AOS SHARED ;SHARED BLOCK FLAG
; SKIPN NOLPT
; SETOM UFDSEE
SETZM SALVRT ;NO AUTOMATIC SYS START
JRST @DIRLE7
DIRLEC: PUSHJ P,LPTNAM
LPR LINK NOT THREE NAMES
JRST DIRLED
DIRLE8: PUSHJ P,LPTNAM
LPR LINK NOT FOLLOWED BY A ZERO
DIRLED: PUSHJ P,LCRR
SKIPE GOGOX
JRST ERRDDT
SETOM UFDSEE
JRST DIRLUP
DIRLE9: SKIPE NOQUES
JRST CKFL3
LPR FILE UNPROTECTED IN OLD TUT -
X LPTNAM
LPR Block
MOVE A,Q
X LOPT
X LCRR
JRST CKFL3
DIRLEB: PUSHJ P,LPTNAM
LPR FILE CONTAINS LOCKED BLOCK
MOVE A,Q
X LOPT
SETZM SALVRT ;NO AUTO SYS STARTUP
JRST LCRR
USRFIN: CLEARM GARBF
CLEARM EXGARB
CLEARB ZR,J
MOVE Q,[440600,,NUSRD+UDDESC]
GARB2: CAML J,OUSRD+UDESCP
JRST USRFN2
GARB4: ILDB B,Q
JUMPN B,USRLE6 ;GARBAGE IN DESCRIPTOR AREA (clear out)
GARB3: AOJA J,GARB2
USRFN2: TLNE Q,770000
JRST GARB4
MOVEI Q,-NUSRD+1(Q) ;FIRST WORD ABOVE DESCRIPTOR AREA
GARB6: CAML Q,NUSRD+UDNAMP
JRST GARB5
SKIPN NUSRD(Q)
AOJA Q,GARB6
JRST USRLE5 ;GARBAGE IN NAME AREA (clear out)
GARB5: SKIPE UFDSEE
PUSHJ P,UFDPR
SKIPN UFDLOS
JRST USRFN5
SKIPE NOQUES
JRST GARB5A
TYPE UFD NEEDS UPDATE - WRITE?
X Y.OR.N
JRST USRFN5
GARB5A: MOVEI A,OUSRD
MOVEI I,NUNITS-1
MOVE J,DBLK
GARB7: SKIPE QACT(I)
PUSHJ P,WRITE
SOJGE I,GARB7
USRFN5: POP P,J
POP P,UDSK
POP P,Q
POPJ P,
SUBTTL LISTF - DUMP OUT USER DIRECTORY
LISTF: JSR INIT
SKIPL ACTIVE ;ALREADY DID RESET
X ACTUN
X CRR
TYPE USER?=
X SIXIN
X CRR
JUMPE B,DDT
MOVEI I,NUNITS-1
SETOM FUNIT
LISTF3: SKIPN QACT(I)
JRST LISTF2
MOVEM I,FUNIT
MOVE A,QNTUTO(I)
PUSHJ P,RDTUT
JUMPL T,[TYPE ERROR READING TUT #
MOVE A,I
X DPT
X CRR
X GSTS
X CONTIN
JRST DDT
JRST .+1]
LISTF2: SOJGE I,LISTF3
MOVEM B,USRNAM
MOVEI A,MFD
MOVE J,MFDBK
SKIPGE I,FUNIT ;USE FIRST ACTIVE UNIT
JRST LISTF4 ;NO DISKS ACTIVE??
X READ
JUMPL T,[TYPE ERROR READING MFD
X CRR
X GSTS
X CONTIN
JRST DDT
JRST .+1]
MOVE D,USRNAM
MOVE Q,MFD+MDNAMP
LISTF1: CAIL Q,2000
JRST [ TYPE USER NOT FOUND -
MOVE A,D
X T6B
JRST CRDDT]
CAME D,MFD(Q)
JRST [ ADDI Q,LMNBLK
JRST LISTF1]
SUBI Q,2000
IDIVI Q,LMNBLK
HRRZ J,Q
ADD J,NUDS
MOVEM J,DBLK
MOVE I,FUNIT ;USE FIRST ACTIVE UNIT
MOVEI A,OUSRD
X READ
JUMPL T,[TYPE ERROR READING USER DIRECTORY
X CRR
X GSTS
X CONTIN
JRST CRDDT
JRST .+1]
X USEE0
JRST CRDDT
CONTIN: TYPE CONTINUE?
X TYI
X CRR
CAIN A,"Y
AOS (P)
POPJ P,
LISTF4: TYPE NO ACTIVE UNIT TO GET DIR FROM
JRST CRDDT
UFDPR: SETZM SALVRT ;NO AUTO SYS STARTUP
SKIPN NOLPT
JRST [ TYPE Errors in directory
MOVE A,OUSRD+UDNAME
X T6B
X CRR
JRST .+1 ]
USEE0: MOVE Q,OUSRD+UDNAME
PUSHJ P,LFORM
LPR USER DIRECTORY:
MOVE A,Q
X L6B
MOVEI A,";
X LTYO
X LCRR
MOVEI J,OUSRD
ADD J,UDNAMP(J)
CAIG J,OUSRD+2000
CAIGE J,OUSRD+UDDESC
JRST [ LPR UFD NAME AREA POINTER OUT OF RANGE
JRST USEEF ]
MOVE T,OUSRD+UDESCP
IDIVI T,6
ADDI T,OUSRD+UDDESC
CAML T,J
JRST [ LPR DESCRIPTOR FREE POINTER OVERLAPS NAME AREA
JRST USEEF ]
MOVEM J,LAST
MOVEI Q,OUSRD+2000-LUNBLK
USEE1: CAMGE Q,LAST ;PER FILE LOOP
JRST USEEF
MOVEM Q,LASTQ
SKIPN A,UNFN1(Q)
SKIPE UNFN2(Q)
CAIA
JRST USEELP
X LPTFIL
LDB C,[UNPKN UNRNDM(Q)]
X FINDPK
MOVEM C,FUNIT ;KLUDGE KLUDGE (LOOKS AT TUTS)
LDB A,[UNDSCP UNRNDM(Q)]
CAML A,OUSRD+UDESCP
JRST [ LPR FILE DESCRIPTOR POINTER POINTS OUTSIDE DESCRIPTOR AREA
JRST USEELY ]
IDIVI A,6
ADDI A,OUSRD+UDDESC
HLL A,QBTBLI(B)
TLNE A,400000
SUB A,[440000,,1]
LDB B,A
X LTAB
X USBYTE
LPR (INITIAL ZERO)
JUMPN B,[ LPR - IS NOT PRESENT
JRST USEELY ]
X LCRR
USEE2: MOVE N,A
MOVEI J,0
ILDB B,A ;PEEK AT NEXT BYTE
JUMPE B,[X USBYTE
LPR (FIRST BYTE SHOULD BE NON-ZERO)
JRST USEELY] ;SHOULD BE NON-ZERO
LDB A,[UNDSCP UNRNDM(Q)]
X LOPT ;SHOW DESC ADDR BEFORE FIRST DESC BYTE
USEE3: MOVE TT,UNRNDM(Q)
TLNE TT,UNLINK
JRST USLINK
;FALLS THROUGH
SETZM ADRSET
USLUP: ILDB B,N
X LTAB
X USBYTE
JUMPE B,[LPR (STOP)
X LCRR
JRST USEELP]
CAIN B,UDWPH
JRST [ LPR (WRITE-PLACE-HOLDER)
X LCRR
JRST USLUP]
CAIL B,UDWPH
JRST USLOAD
CAILE B,UDTKMX
JRST USSKIP
LPR (TAKE-N BLOCKS)
USLP1: AOS Q
USLP2: MOVE A,Q
X LOPT
X LSPAC
SKIPGE TT,FUNIT
JRST USLP3 ;PACK NOT MOUNTED
MOVE TT,QOTUTO(TT)
CAMGE Q,QLASTB(TT)
SKIPN ADRSET
JRST USLPE ;BAD BLOCK
ILDB TT,J ;TUT ENTRY
CAMGE Q,NUDS
JRST USLPE
MOVSI D,-LSBTAB
CAMN Q,SBTAB(D)
JRST USLPE
AOBJN D,.-2
MOVE A,FUNIT
MOVE D,MFDBK
SUB D,NTBL(A)
CAML Q,MFDBK
CAMLE Q,D
CAIA
JRST USLPE ;OVERLAPS TUT OR MFD
SKIPL FUNIT ;FILE NOT ON ACTIVE UNIT
CAIN TT,1
JRST USLP3
LPR ?? TUT=
MOVE A,TT
X LDPT
LPR ??
USLP3: SOJG B,USLP1
X LCRR
JRST USLUP
USLPE: LPR ?? BAD BLOCK # ??
JRST USLP3
USEELP: MOVE Q,LASTQ
SUBI Q,LUNBLK
JRST USEE1
USLOAD: SETOM ADRSET
ANDCMI B,20 ;DM FUNNY BITS
MOVEI J,-UDWPH-1(B)
MOVEI K,NXLBYT
USLOD1: ILDB B,N
X USBYTE
LSH J,6
ADD J,B
SOJG K,USLOD1
MOVE Q,J
SKIPGE I,FUNIT
TDZA J,J ;NO TUT
PUSHJ P,TUTPNO ;GET POINTER TO OLD TUT
ADD J,[TUTBYT_14,,] ;BACK UP FOR ILDB
LPR (JUMP
MOVE A,Q
X LOPT
LPR )
MOVEI B,1
JRST USLP2
USSKIP: SUBI B,UDTKMX
LPR (SKIP
MOVE A,B
X LOPT
LPR )
IBP J
AOS Q
SOJG B,.-2
MOVEI B,1
JRST USLP1
USLINK: X LTAB
LPR (LINK)
X USLINP
JRST USLIN3
MOVEI A,";
X LTYO
X USLINP
JRST USLIN3
X LSPAC
X USLINP
ADD N,[060000,,] ;ENDS WITH ZERO, RE-READ THE ZERO BYTE
X LCRR
ILDB B,N
X LTAB
X USBYTE
LPR (ZERO)
JUMPE B,USLIN4
LPR ?? NO END ZERO ??
USLIN4: X LCRR
JRST USEELP
USLIN3: LPR ?? ENDS EARLY ??
JRST USLIN4
USLINP: MOVEI B,6
USLIN2: ILDB A,N
JUMPE A,CPOPJ ;NON SKIP RETURN IF FOLLOWED BY ZERO
CAIN A,';
JRST POPJ1 ;SKIP RETURN IF ENDS NATURALLY
CAIN A,': ;QUOTE CHAR
ILDB A,N
ADDI A,40
X LTYO
SOJG B,USLIN2
JRST POPJ1 ;SKIP RETURN IF ENDS NATURALLY
USBYTE: PUSH P,A
PUSH P,B
LDB A,[30300,,(P)]
ADDI A,"0
X LTYO
LDB A,[300,,(P)]
ADDI A,"0
X LTYO
X LSPAC
POP P,B
POP P,A
POPJ P,
USEELY: X LCRR
USSELP: MOVE Q,LASTQ
SUBI Q,LUNBLK
JRST USEE1
USEEF: X LCRR
X LFORM
POPJ P,
SUBTTL MAIN SALVAGER - WRITE MFD & TUT
MFDFIN: MOVEI I,0
MFDFN0: SKIPE QACT(I)
PUSHJ P,TUTCMP
CAIGE I,NUNITS-1
AOJA I,MFDFN0
SKIPN MFDWRT
JRST SHARCK ;MFD DIDN'T HAVE ANY CHANGES
MFDWR0: SKIPE NOQUES
JRST MFDWR1
TYPE WRITE OUT CHANGES IN MFD?
X Y.OR.N
JRST SHARCK
MFDWR1: MOVE J,MFDBK
MOVEI I,NUNITS-1
MFDWR2: MOVEI A,MFD
SKIPE T,QACT(I)
PUSHJ P,WRITE
JUMPGE T,MFDWR3
PUSHJ P,GSTS ;ERROR WRITING MFD
SKIPN GOGOX
JRST MFDWR0
JRST ERRDDT
MFDWR3: SOJGE I,MFDWR2
JRST SHARCK
TUTCMP: SETZM TUTDFR ;FIRST SEE IF ANY DIFFERENCES
SETZM TTDFPS
SETZM NLKBKS'
SETZM TUTCHG ;MAKE SUMMARY TABLE OF DIFFERENCES
MOVE Q,[TUTCHG,,TUTCHG+1]
BLT Q,TUTCHG+<TUTMAX*TUTMAX>-1
MOVE Q,QTTBLI
HRR Q,QNTUTO(I) ;NEW B.P.
ADDI Q,LTIBLK
MOVE J,Q
HRR J,QOTUTO(I) ;OLD B.P.
MOVE TT,QFRSTB(J) ;BLOCK NUMBER
MOVE B,QLASTB(J)
SOS B
MOVEM B,TUTHIB' ;HIGHEST BLOCK #
ADDI J,LTIBLK
TUTC1: ILDB B,Q
ILDB D,J
CAMN B,D
JRST TUTC2
CAIN D,TUTLK
JRST [ MOVE B,D ;IF LOCKED, STAY LOCKED
DPB B,Q
AOS NLKBKS ;COUNT BLOCKS LOCKED DUE TO DISK ERRORS
SKIPN GOGOX
PUSHJ P,LCKRPT ;IN CHKR MODE, REPORT LOCKED BLOCKS
JRST TUTC2 ]
PUSHJ P,TUTC4
TUTC2: CAMGE TT,TUTHIB
AOJA TT,TUTC1
SKIPN NOQUES
SKIPN A,NLKBKS
JRST TUTC3
X TDPT
UNTMES LOCKED BLOCKS ON UNIT #
HRRZ A,I
X DPT
X CRR
TUTC3: SKIPN TUTDFR
POPJ P, ;NO DIFFERENCES THIS TUT
JRST TUTCM0 ;DIFFERENCES, GO HANDLE
TUTC4: IMULI B,TUTMAX
ADD B,D
MOVE T,QOTUTO(I) ;DON'T LIST TUT CHANGES IN SWAPPING AREA
CAML TT,NUDS
CAML TT,QSWAPA(T)
AOS TUTCHG(B)
AOS TUTDFR
POPJ P,
TUTCM0: SKIPE NOQUES ;HERE WHEN TUT HAS DIFFERENCES
JRST TUTCM3 ;IF NO QUESTIONS, JUST WRITE
MOVEI A,TUTMAX*TUTMAX-1 ;SEE IF ANY TUT DIFFERENCES NOT IN SWAPPING AREA
SKIPN TUTCHG(A)
SOJGE A,.-1
JUMPL A,TUTCM4 ;NONE, GO ASK IF SHOULD WRITE
SETZM LINPOS ;OTHERWISE, SUMMARIZE TUT DIFFERENCES
TYPE TUT #
HRRZ A,I
X DPT
MOVEI B,TUTMAX-1
TUTSM1: MOVEI D,TUTMAX-1
TUTSM2: MOVE A,B
IMULI A,TUTMAX
ADD A,D
SKIPN A,TUTCHG(A)
JRST TUTSM3
X TSPAC
X TDPT
X TSPAC
MOVE A,B
X DPT
TYPE _
MOVE A,D
X DPT
MOVE A,LINPOS
CAIGE A,60.
JRST TUTSM3
X CRR
SETZM LINPOS
TUTSM3: SOJGE D,TUTSM2
SOJGE B,TUTSM1
TYPE , PRINT?
X Y.OR.N
JRST TUTCM4
;HERE TO PRINT OUT THE TUT
SETZM TUTDFR
MOVE Q,QTTBLI
HRR Q,QNTUTO(I) ;NEW B.P.
ADDI Q,LTIBLK
MOVE J,Q
HRR J,QOTUTO(I) ;OLD B.P.
MOVE TT,QFRSTB(J) ;BLOCK NUMBER
MOVE B,QLASTB(J)
SOS B
MOVEM B,TUTHIB' ;HIGHEST BLOCK #
ADDI J,LTIBLK
TUTCM1: ILDB B,Q
ILDB D,J
CAME B,D
JRST TUTDF1
TUTCM2: CAMGE TT,TUTHIB
AOJA TT,TUTCM1
SKIPE TTDFPS
X LCRR
X LFORM ;SOMETHING PRINTED, ADVANCE LPT PAPER
TUTCM4: TYPE TUT #
HRRZ A,I
X DPT
TYPE NEEDS UPDATING - WRITE?
X Y.OR.N
POPJ P,
TUTCM3:
MOVE A,QNTUTO(I)
PUSHJ P,WRTUT
JUMPGE T,CPOPJ
PUSHJ P,GSTS ;ERROR WRITING TUT
SKIPN GOGOX
JRST TUTCM4
JRST ERRDDT
TUTMAX=1_TUTBYT
TUTCHG: BLOCK TUTMAX*TUTMAX
TUTDF1: MOVE T,QOTUTO(I)
CAML TT,NUDS
CAML TT,QSWAPA(T)
CAIA
JRST TUTCM2 ;IN SWAPPING AREA, IGNORE
PUSHJ P,NEWOLD
PUSH P,[TUTCM2]
AOSL TTDFPS
JRST TUTDF7 ;NO MORE ROOM ON LINE
MOVEI A,40 ;PRINT MULTIPLE FROBS PER LINE
PUSHJ P,LPTR ;SO THE LINE PRINTER WILL GO FASTER
JRST LPTR
NEWOLD: SKIPN TUTDFR
PUSHJ P,TUTTYP
MOVE A,TT
PUSHJ P,LOPT
PUSHJ P,LSPAC
MOVE A,B
PUSHJ P,LOPT
MOVEI A,"_
PUSHJ P,LPTR
MOVE A,D
JRST LOPT
TUTTYP: SETOM TUTDFR
PUSHJ P,LCRR
LPR TUT DIFFERENCES FOR DRIVE #
HRRZ A,I
PUSHJ P,LOPT
TUTDF7: MOVNI A,5 ;START NEW LINE, ROOM FOR 5 BLOCKS IF TTY
SKIPN NOLPT
MOVNI A,9 ;OR 9 IF LPT
MOVEM A,TTDFPS
JRST LCRR
LCKRPT: TYPE LOCKED BLOCK
HRRZ A,I
X TDPT
MOVEI A,"-
X TYO
MOVE A,TT
X TOPT
X CRR
POPJ P,
SUBTTL TRACK DOWN SHARED BLOCKS
SHARCK: SKIPN SHARED
JRST CRDDT ;NO SHARED TRACKS, WE ARE DONE
TYPE SHARED BLOCKS
PUSHJ P,LCRR
LPR LOOKING FOR SHARED BLOCKS
PUSHJ P,LCRR
MOVE I,MDSK
MOVEI A,MFD
MOVE J,MFDBK
PUSHJ P,READ
JUMPL T,ACTUE3
MOVE Q,MFD+MDNAMP
ADDI Q,MFD
SMFDLP: CAIL Q,MFD+2000
JRST SHRCKF ;DONE
SKIPN A,MNUNAM(Q)
JRST SMFDL1
PUSHJ P,SUSRLP
SMFDL1: ADDI Q,LMNBLK
JRST SMFDLP
SHRCKF: SKIPN GOGOX
JRST CRDDT
JRST ERRDDT
SUSRLP: HRREI J,-MFD-2000(Q) ;CONVERT MFD INDEX TO BLOCK NUMBER
ASH J,-1
ADD J,NUDS
MOVEM A,USRNAM
PUSH P,Q
MOVE I,UDSK
PUSH P,UDSK
SUSRL1: MOVEI A,OUSRD
PUSHJ P,READ
JUMPL T,SUSRE2
MOVEI Q,2000-LUNBLK+OUSRD
MOVEI J,OUSRD
ADD J,UDNAMP(J)
PUSH P,J
SDIRL1: CAMGE Q,J
JRST SUSRFN
MOVEM Q,LASTQ
SKIPE A,UNFN1(Q)
JRST .+3
SKIPN UNFN2(Q)
JRST SDIRLP
LDB C,[UNPKN UNRNDM(Q)]
LDB A,[UNDSCP UNRNDM(Q)]
IDIVI A,6
ADDI A,OUSRD+UDDESC
HLL A,QBTBLI(B)
TLNE A,400000
SUB A,[440000,,1]
SDIRL2: MOVE N,A
MOVEI J,0
ILDB B,A
SDIRL3: MOVE TT,UNRNDM(Q)
TLNE TT,UNLINK
JRST SDIRLP
PUSHJ P,FINDPK
SKIPL C
SKIPN QACT(C)
JRST SDIRLP
CAIG B,UDWPH ; A LOAD FIRST THING
JRST SDIRLP
STRLUP: ILDB B,N
JUMPE B,SDIRLP
CAIN B,UDWPH
JRST STRLUP
CAIL B,UDWPH
JRST SLOAD
CAILE B,UDTKMX
JRST SSKIPF
JRST STLUP
STLUP: AOS Q
STLUP1: ILDB D,J
CAIE D,1
PUSHJ P,SPNT
SOJG B,STLUP
JRST STRLUP
SLOAD: ANDCMI B,20 ;DM FUNNY BIT
MOVEI J,-UDWPH-1(B)
MOVEI K,NXLBYT
SLOAD1: ILDB B,N
LSH J,6
ADD J,B
SOJG K,SLOAD1
MOVE Q,J
MOVE I,C
PUSHJ P,TUTPNN ;GET PNTR TO TUT
ADD J,[TUTBYT_14,,] ;COMPENSATE FOR ILDB
MOVEI B,1
JRST STLUP1
SSKIPF: SUBI B,UDTKMX
IBP J
AOS Q
SOJG B,.-2
MOVEI B,1
JRST STLUP
SPNT: MOVE A,USRNAM
PUSHJ P,L6B
MOVEI A,";
PUSHJ P,LTYO
EXCH Q,LASTQ
MOVE A,UNFN1(Q)
PUSHJ P,L6B
PUSHJ P,LSPAC
MOVE A,UNFN2(Q)
PUSHJ P,L6B
PUSHJ P,LSPAC
HRRZ A,C
PUSHJ P,LDPT
MOVEI A,"-
PUSHJ P,LTYO
MOVE A,LASTQ
PUSHJ P,LOPT
LPR , TUT=
MOVE A,D
X LDPT
PUSHJ P,LCRR
EXCH Q,LASTQ
POPJ P,
SUSRE2: TYPE USER DIRECTORY PARITY ERROR
PUSHJ P,TSPAC
TYPE BLOCK #
MOVEM J,DBLK
MOVE A,J
PUSHJ P,DPT
UNTMES UNIT #
MOVE A,I
PUSHJ P,DPT
PUSHJ P,CRR
PUSHJ P,GSTS
SKIPE GOGOX
JRST ERRDDT
TYPE TRY NEXT DRIVE?
X Y.OR.N
JRST ERRDDT
MOVE I,UDSK
SUSR2B: AOS I
CAIL I,NUNITS
SUBI I,NUNITS
SKIPN QACT(I)
JRST SUSR2B
MOVEM I,UDSK
MOVE J,DBLK
JRST SUSRL1
SUSRFN: POP P,J
POP P,UDSK
POP P,Q
POPJ P,
SDIRLP: MOVE Q,LASTQ
SUBI Q,LUNBLK
MOVE J,(P)
JRST SDIRL1
POPBAJ: POP P,B
POPAJ: POP P,A
POPJ P,
SUBTTL INITIALIZATION
INIT: 0
MOVEI P,PDL
NTS,[ KA,[
CONO 675550 ;RESET APR
CONO PI,710000 ;RESET PI
MOVE TT,[JSR UUOHLT] ;HALT ON UUO
SKIPN 41
MOVEM TT,41
MOVEI A,SA ;MAKE SURE ALL NECESSARY MEMORY IS PRESENT
INIT0: MOVE B,(A)
CONSZ 10000
JRST [ TYPE NXM IN SALV MEM
JRST ERRDDT ]
ADDI A,2000
CAIGE A,THEEND
JRST INIT0
];KA
KL,[
SETZM DTEOPR ;BTB IF QUIT OUT AND RESTART
CONO APR,267760 ;I/O RESET, CLEAR + DISABLE ALL FLAGS
CONO PI,010000 ;CLEAR P.I. SYSTEM
CONSZ PAG,400000
JRST .+4 ;JUMP IF CACHE LOOK ENABLE
SWPIA ;IF CACHE OFF, INVALIDATE IT BEFORE TURNING ON
CONSZ APR,200000
JRST .-1
MOVEI TT,SALVPF ;SET TO HALT ON PAGE FAIL (E.G. PARITY ERROR)
MOVEM TT,PFNPC
CONO PAG,600000+EPT/1000 ;SET UP EPT, ENABLE CACHE, DISABLE PAGING AND TRAPS
DATAO PAG,[100000,,400000+EPT/1000] ;UPT=EPT
MOVEI TT,UUOHLT
SKIPN EPT+430 ;HALT ON KERNEL UUO
MOVEM TT,EPT+430
MOVEI A,SA ;MAKE SURE ALL NECESSARY MEMORY IS PRESENT
INIT0: MOVE B,(A)
CONSZ 2000
JRST [ TYPE NXM IN SALV MEM
JRST ERRDDT ]
ADDI A,1000
CAIGE A,THEEND
JRST INIT0
RH, CONI DSK,TT
RH, TLNN TT,(%HID22)
RH, JRST [ TYPE DF10 IN KA MODE??
RH, JRST ERRDDT ]
IFN T300P,[ ;TURN ON DL10 TO ACCESS T-300
CONO DLC,400000 ;MR CLR
CONO DLB,1 ;TURN OFF EXCESS LIGHTS
CONO DLB,2 ;..
CONO DLB,3 ;..
CONO DLB,DL10AR ;64 WORDS FOR PDP11 #0 AT DL10AR
DATAO DLC,[200001,,] ;KA INTERRUPT MODE
CONO DLC,100020 ;ENB PDP11 PORT #0 NO INTERRUPTS
];T300P
];KL
DC, SETZM ENCS
RH, SETZM MARKF
RP,[ DATAI DPC,A
TLNN A,NOWRIH
JRST [ TYPE [WRITE HEADERS ENABLED]
X CRR
JRST .+1 ]
];RP
SETOM DRIVE ;ALL DRIVES ASSUMED TO BE ON-LINE
MOVE A,[DRIVE,,DRIVE+1]
BLT A,DRIVE+NDRIVE-1
MOVEI A,SLVIOWD ;SET UP CHANNEL PROGRAM AREA
MOVEM A,SLVICWA
SETZM SLVIOWD+1
SETZM SLVICWA+1
];NTS
SETZM GOGOX
SETZM NOQUES
MOVEI A,NUNITS-1
SETOM QPKN(A) ;TUT NOT IN YET
SOJGE A,.-1
TS,[
.OPEN TYIC,[SIXBIT / $TTY/]
.VALUE
.OPEN TYOC,[SIXBIT / !TTY/]
.VALUE
.CORE <THEEND-1>_-10.+1
.VALUE
MOVE A,[SQUOZE 0,NQS]
.EVAL A,
.VALUE
MOVEM A,NQS
MOVE A,[SQUOZE 0,QACT]
.EVAL A,
.VALUE
MOVEM A,SQACT
MOVE A,[SQUOZE 0,NUDSL]
.EVAL A,
.VALUE
MOVEM A,NUDS
MOVE A,[SQUOZE 0,MFDBLK]
.EVAL A,
.VALUE
MOVEM A,MFDBK
MOVE B,[SQUOZE 0,NTUTBL]
.EVAL B,
.VALUE
MOVEI C,NUNITS-1
MOVEM B,NTBL(C)
SOJGE C,.-1
CAILE B,MXTUTB
.VALUE ;NOT ASSEMBLED FOR BIG ENOUGH TUTS
MOVE B,[SQUOZE 0,T300P] ;NEED KLUDGES FOR 2 SIZES OF TUT
.EVAL B,
MOVEI B,0
JUMPE B,INI03
MOVE C,[SQUOZE 0,NTUTB1]
.EVAL C,
.VALUE
CAILE C,MXTUTB
.VALUE ;TOO BIG
MOVEM C,NTBL(B)
CAIGE B,NUNITS-1
AOJA B,.-2
INI03: MOVE A,[SQUOZE 0,NBLKS]
.EVAL A,
.VALUE
MOVEM A,SNBLKS
SUBI A,1
MOVEM A,SNBLKS-1
];TS
;BRING UP THE LPT
SETOM NOLPT ;ASSUME THE WORST
SKIPE LPBUST
JRST LPTDWN
SETOM LPFRST' ;FLAG LPT NOT USED YET
TS,[ TYPE WANT LPT?
PUSHJ P,TYI
X CRR
SETOM LPBUST ;ASK ONLY ONCE
CAIN A,"Y
.OPEN LPTC,[.UAO,,'LPT]
JRST LPTDWN
SETZM NOLPT
SETZM LPBUST
];TS
;DROPS THROUGH
;DROPS IN
NTS,[
IFN OLPTP,[ ;BRING UP AI-KA LPT
LPTUP3: CONO LPT,10
DATAO LPT,[440]
MOVEI A,200000
LPTUP1: SOJLE A,LPTUP2
CONSZ LPT,10
JRST LPTUP1
SETZM NOLPT
JRST LPTDWN
];IFN OLPTP
IFN NLPTP,[ ;BRING UP ML LPT
LPTUP3: SETOM LPTBFC
MOVE A,[<.BYTE 7 ? 15 ? 15 ? 15 ? 15 ? 15>]
MOVEM A,LPTBUF
CONO NLPT,200
CONO NLPT,1000 ;IMAGE MODE
DATAO NLPT,[23*2] ;MOTOR ON
MOVEI A,200000 ;1 SECOND
LPTUP1: SOJLE A,LPTUP2
CONSO NLPT,100 ;IS IT ON?
JRST LPTUP1
SETZM NOLPT ;WELL, YES
CONO NLPT,200
CONO NLPT,100 ;SET OUTPUT DONE
JRST LPTDWN ;ITS UP
];IFN NLPTP
IFN TTLPTP,[ ;BRING UP LPT ATTACHED VIA MTY
LPTUP3: MOVEI A,200000
LPTUP1: SOJLE A,LPTUP2
CONI MTY,B
TRNN B,40 ;ANY INPUT?
JRST LPTUP1
LDB B,[140500,,B]
DATAI MTY,C
CAIE B,TTLPTP&77
JRST LPTUP1 ;NOT FROM LPT
SETZM NOLPT ;IS FROM LPT -> WIN
MOVEI B,TTLPTP_14 ;LINE NUMBER IN RIGHT PLACE
CONO MTY,10(B) ;SET OUTPUT DONE
JRST LPTDWN
];IFN TTLPTP
IFN OLPTP+NLPTP+TTLPTP,[
;ROUTINE TO ASK IF UP
LPTUP2: TYPE LPT DOWN (Y OR N)
IFN OLPTP, TYPE [MAYBE NEEDS RESET BUTTON PUSHED]
PUSHJ P,TYI
X CRR
CAIN A,"Y
JRST LPTUP4
CAIN A,"N
JRST LPTUP3 ;"N", CHECK IT AGAIN
JRST LPTUP2
LPTUP4: SETOM LPBUST
];IFN OLPTP+NLPTP+TTLPTP
];NTS
LPTDWN: JRST @INIT
NTS,[
UUOHLT:
KA, 0
JRST 4,. ;HERE IF UUO IN STAND-ALONE MODE (ELSE HALT IN ITS)
];NTS
SUBTTL LPT & TTY I/O
LDPT: PUSH P,A
PUSH P,B
JUMPGE A,LDPT0
MOVEI A,"-
PUSHJ P,LTYO
MOVN A,-1(P)
LDPT0: PUSHJ P,LDPT1
JRST POPBAJ
LDPT1: IDIVI A,10.
HRLM B,(P)
SKIPE A
PUSHJ P,LDPT1
JRST LDPT2
LOPT: PUSH P,A
PUSH P,B
PUSHJ P,LOPT1
JRST POPBAJ
LOPT1: LSHC A,-35. ;IN CASE NEGATIVE
LSH B,-1
DIVI A,8
HRLM B,(P)
SKIPE A
PUSHJ P,LOPT1
LDPT2: HLRZ A,(P)
ADDI A,"0
;DROPS IN
LTYO:
LPTR:
LPTR1: SKIPE NOLPT
JRST TYLPT ;TYPE ON TTY INSTEAD
PUSH P,A
AOSE LPFRST
JRST LPTR2
TYPE (INFO ON LPT)
X CRR
LPTR2:
IFN OLPTP,[
OLP1: CAIN A,12 ;SUPPRESS LF, MAKE CR=CR-LF
JRST POPAJ
CAIN A,15
JRST [ CONO LPT,10
MOVEI A,440
JRST .+1]
CAIN A,14
MOVEI A,441
CAIN A,33
MOVEI A,"$
CAIL A,"a
CAILE A,"z
CAIA
SUBI A,40 ;LOWER CASE -> UPPER CASE
SUBI A,40
PUSH P,B
HRLZI B,2 ;3 SECOND TIMEOUT
CONSZ LPT,10
SOJG B,.-1
JUMPLE B,OLP2
OLP3: DATAO LPT,A
JRST POPBAJ
OLP2: X CRR
TYPE HIT RESET BUTTON ON LPT
X CRR
HRLZI B,15 ;20 SECOND TIMEOUT
CONSZ LPT,10
SOJG B,.-1
JUMPLE B,OLP2
JRST OLP3
];IFN OLPTP
TS,[ .IOT LPTC,A
JRST POPAJ
];TS
IFN NLPTP,[ ;SEND CHARACTER TO NLPT
PUSH P,B
SOSLE LPTBFC ;MORE TO GO
JRST LPTR0 ;YES
LPTR01: MOVEI B,5 ;NO, NEW WORD
MOVEM B,LPTBFC
MOVE B,[440700,,LPTBUF]
MOVEM B,LPTBFP
MOVEI B,-1 ;TIMEOUT FOR DEAD LPT
CONSO NLPT,100
SOJG B,.-1
DATAO NLPT,LPTBUF
LPTR0: IDPB A,LPTBFP ;BUFFER 5 AT A TIME
CAIL A,12
CAILE A,14 ;LF OR FF, FORCE BUFFER NOW
JRST POPBAJ
MOVEI A,15
LPTR00: SOSG LPTBFC
JRST LPTR01
IDPB A,LPTBFP
JRST LPTR00
;NLPT BUFFERING CRUFT
LPTBUF: -1 ;5 CHAR LPT BUFFER
LPTBFC: 5 ;COUNT OF CHARS LEFT IN BUF
LPTBFP: @. ;BYTE POINTER INTO LPT BUFFER
LPTFIN: SKIPL LPFRST ;DO NOTHING IF NEVER OUTPUT TO LPT
SKIPGE NOLPT ;WAS LPT INIT'ED?
POPJ P, ;NO, DON'T HANG
MOVE A, [<.BYTE 7 ? 15 ? 14 ? 15 ? 15 ? 15>]
MOVEI B, 15
LPTFN0: SOSG LPTBFC
JRST LPTFN1
IDPB B, LPTBFP
JRST LPTFN0
LPTFN1: CONSO NLPT,100 ;WAIT FOR THAT TO HAPPEN
JRST .-1
DATAO NLPT, LPTBUF
CONSO NLPT,100 ;WAIT FOR THAT TO HAPPEN
JRST .-1
DATAO NLPT, A
POPJ P,
];IFN NLPTP
IFN TTLPTP,[
; call with ascii char in A
; saves and restores all AC's
ANDI A,177 ;MASK TO 7 BIT ASCII
CAIGE A,40 ;SKIP IF NOT CTL CHAR
CAIN A,14 ;SKIP IF NOT FF
JRST LPTOP ;PRINT LITERALLY FF, GRAPHICS
CAIN A,15 ;SKIP IF NOT CR
JRST LPCR ;JUMP TO CR ROUT
CAIN A,12 ;SKIP IF NOT LF
JRST LPLF ;JUMP TO LF ROUT
CAIN A,11 ;SKIP IF NOT TAB
JRST LPTAB ;JUMP TO TAB ROUT
MOVEI A,"^ ;HERE FOR RANDOM CTL CHAR
PUSHJ P,LPTO ;PUT OUT ^FOO
MOVE A,(P) ;RETREIVE CHAR
ADDI A,100 ;MAKE IT A 'LETTER'
LPTOP: PUSHJ P,LPTO
JRST POPAJ
LPCR: SKIPE LPTPOS ;SKIP IF STILL AT LEFT MARGIN
PUSHJ P,LPTO ;ELSE PUT OUT CR
SETZM LPTPOS ;MARK 'AT LEFT MARGIN'
SETOM LPCRLF ;MARK LF AFTER CR
MOVEI A,12 ;LF
JRST LPTOP ;OUTPUT IT
LPLF: AOSE LPCRLF ;SKIP IF THIS LF AFTER CR
JRST LPTOP ;ELSE PUT IT OUT
JRST POPAJ
LPTAB: MOVEI A,40 ;SPACES FOR TAB
PUSHJ P,LPTO
MOVE A,LPTPOS ;CHECK POS
TRNE A,7 ;SKIP IF POS = 0 MOD 8
JRST LPTAB ;ELSE PUT ANOTHER SPACE
JRST POPAJ
LPTO: CAIL A,40 ;SKIP FOR CTL CHAR NOT COUNTED
AOS LPTPOS ;COUNT CHAR
PUSH P,A
PUSH P,B
MOVEI A,-1 ;TIMER FOR FLAG
LPWAIT: SOJLE A,LPTOUT
CONI MTY,B ;GET STATUS
TRNE B,40 ;SKIP IF NO INPUT FLAG
JRST FLSINP ;ELSE JUMP TO FLUSH INPUT
TRNN B,10 ;SKIP IF OUTPUT FLAG
JRST LPWAIT ;ELSE LOOP
LDB B,[140500,,B] ;GET SUBDEV #
CAIE B,TTLPTP&77 ;SKIP IF THIS IS LPT #
JRST FLSOUT ;ELSE FLUSH
LPTOUT: MOVEI B,TTLPTP_14 ;GET LPT NO IN SUBDEV POSITION
CONO MTY,(B) ;SELECT SUBDEV
POP P,B ;RESTORE AC
MOVE A,(P) ;GET CHAR
LSH A,35 ;PUT IN FUNNY POSITION
DATAO MTY,A ;PUT OUT 1 CHAR
JRST POPAJ
FLSINP: DATAI MTY,B ;READ INPUT
JRST LPWAIT ;AND IGNORE
FLSOUT: LSH B,14 ;SHIFT TO SELECT
CONO MTY,200(B) ;RESET FLAG, IT'S NOT LPT
JRST LPWAIT
LPTPOS: 0 ;PRINT POSITION FROM LEFT MARGIN
LPCRLF: 0 ;# CHARS AFTER LAST CR, -1 IF TO IGNORE LF
];IFN TTLPTP
TYLPT: CAIN A,14
JRST CRR ;NO FF ON TTY
JRST TYO
SIXTYP:
T6B: PUSH P,B ;OUTPUT SIXBIT IN A
PUSH P,A
LSHC A,-36.
T6B1: LSHC A,6
ADDI A,40
PUSHJ P,TYO
MOVEI A,0
JUMPN B,T6B1
POP P,A
POPBJ: POP P,B
POPJ P,
SIXLPT:
L6B: PUSH P,B ;OUTPUT SIXBIT IN A
PUSH P,A
MOVE B,[440600,,(P)] ;ALWAYS OUTPUTS SIX COLUMNS
L6B1: ILDB A,B ;CAN YOU GUESS WHY? WIN A KEWPIE DOLL!
ADDI A,40
PUSHJ P,LPTR
TLNE B,770000
JRST L6B1
POP P,A
POP P,B
POPJ P,
SLPT: PUSH P,B
MOVE B,A
SL1: ILDB A,B
JUMPE A,POPBJ
PUSHJ P,LPTR
JRST SL1
DPT:
TOPT: PUSH P,A
PUSH P,B
MOVEI B,8
MOVEM B,ORADIX
PUSHJ P,TDPT1
JRST POPBAJ
TDPT: PUSH P,A
PUSH P,B
MOVEI B,10.
MOVEM B,ORADIX'
PUSHJ P,TDPT1
JRST POPBAJ
TDPT1: LSHC A,-35. ;IN CASE NEGATIVE
LSH B,-1
DIV A,ORADIX
HRLM B,(P)
SKIPE A
PUSHJ P,TDPT1
HLRZ A,(P)
ADDI A,"0
JRST TYO
LTAB:
IFN OLPTP,[
PUSHJ P,LSPAC ;OLD LPT LACKS TABS
PUSHJ P,LSPAC
PUSHJ P,LSPAC
JRST LSPAC
];IFN OLPTP
.ELSE [ PUSH P,A
MOVEI A,11 ;NLPT HAS HARDWARE TABS
JRST L1
];ELSE
LCRR: PUSH P,A
MOVEI A,15
PUSHJ P,LPTR
MOVEI A,12
PUSHJ P,LPTR
JRST POPAJ
LSPAC: PUSH P,A
MOVEI A,40
L1: PUSHJ P,LPTR
POP P,A
POPJ P,
LFORM: PUSH P,A
MOVEI A,14
PUSHJ P,LPTR
JRST POPAJ
LOUTST: 0
PUSH P,A
PUSH P,B
HRRZ B,@LOUTST
HRLI B,440700
LOUT2: ILDB A,B
JUMPE A,LOUT1
X LPTR
JRST LOUT2
LOUT1: POP P,B
POP P,A
AOS LOUTST
JRST 2,@LOUTST
TOUTST: 0
PUSH P,A
PUSH P,B
HRRZ B,@TOUTST
PUSHJ P,OUTSTR
AOS TOUTST
POP P,B
POP P,A
JRST 2,@TOUTST
OUTSTR: HRLI B,440700
OUTST1: ILDB A,B
JUMPE A,CPOPJ
PUSHJ P,TYO
JRST OUTST1
ERRDDT: PUSHJ P,CRR
TYPE *** ERROR *** SYSTEM MAY NOT BE BROUGHT BACK UP
CRDDTE: NTS, SETZM SALVRT ;CAN'T RETURN TO SYSTEM
CRDDT: PUSHJ P,CRR
DDT:
NTS,[
IFN NLPTP, PUSHJ P,LPTFIN ;UNBUFFER LINE PRINTER
SKIPE SALVRT
JRST @SALVRT
TYPE DDT
SKIPN MEMSIZ-4000
JRST 4,. ;NO DDT LOADED?
JRST MEMSIZ-4000
];NTS
TS,[ .VALUE [ASCIZ\:DDT
\]
JRST DDT
];TS
CRR: PUSH P,A
PUSHJ P,CRR1
SETZM LINPOS'
JRST POPAJ
CRR1: MOVEI A,15
PUSHJ P,TYO
MOVEI A,12
JRST TYO
TSPAC: PUSH P,A
MOVEI A,40
X TYO
JRST POPAJ
TYO:
TS, .IOT TYOC,A
NTS,[
KA,[
CONSZ TTY,20
JRST .-1
DATAO TTY,A
SKIPN PUNCH
JRST TYO0
CONSZ PTP,20 ;WAIT FOR NOT BUSY
JRST .-1
DATAO PTP,A
TYO0:
];KA
KL,[
PUSH P,A
ANDI A,177
PUSHJ P,DTEXIO
POP P,A
];KL
];NTS
AOS LINPOS
POPJ P,
KL,[ ;DTE20 COMMUNICATION ROUTINE ... COPIED FROM DEC "SUBRTN" PROGRAM
DTEXIO: SETZM DTEFLG
MOVEM A,DTECMD
SETZM DTEF11
CONO DTE,%DBL11
SKIPN DTEFLG
JRST .-1
SETZM DTEFLG
MOVE A,DTEF11
POPJ P,
];KL
NTYI: PUSHJ P,TYI ;INPUT DIGIT, SKIP IF WIN
CAIL A,"0
CAILE A,"9
POPJ P,
SUBI A,"0
POPJ1: AOS (P)
POPJ P,
SIXIN: PUSH P,C
SIXI1: MOVE C,[440600,,B]
SETZ B,
SIXIL: X TYI
CAIL A,140
JRST [ TYPE XXX
JRST SIXI1]
CAIG A,40
JRST SIXIX
CAIN A,";
JRST SIXIL
SUBI A,40
TLNE C,770000
IDPB A,C
JRST SIXIL
SIXIX: POP P,C
POPJ P,
TYI: ;INPUT CHAR INTO A
TS, .IOT TYIC,A
NTS,[
KA,[
CONSO TTY,40
JRST .-1
DATAI TTY,A
];KA
KL,[
MOVEI A,3400 ;"DDT MODE" INPUT
PUSHJ P,DTEXIO
JUMPE A,.-2
];KL
];NTS
ANDI A,177
CAIL A,"a ;MIGHT NOT BE KSR-35
CAILE A,"z
CAIA
SUBI A,40
CAIN A,^Z
JRST CRDDTE
JRST TYO
;RETURN TO DDT IF CHARACTER TYPED
TYIPSE: PUSHJ P,TYIP
POPJ P,
PUSHJ P,TYI
JRST DDT
;SKIP IF INPUT AVAILABLE
TYIP: PUSH P,A
TS,[ .LISTEN A,
SKIPE A
];TS
NTS,[
KA, CONSZ TTY,40
KL,[ MOVEI A,3400
PUSHJ P,DTEXIO
SKIPE A
];KL
];NTS
AOS -1(P)
POP P,A
POPJ P,
Y.OR.N: PUSH P,A ;YES OR NO, SKIP IF YES
YORN1: X TYI
X CRR
CAIE A,"Y
CAIN A,"N
JRST YORN2
TYPE (Y OR N)
JRST YORN1 ;TELETYPE KEYBOARD LOSSAGE?
YORN2: CAIN A,"Y
AOS -1(P)
JRST POPAJ
SUBTTL MAG TAPE I/O
NTS,[ MTC==340 ;MAG TAPE CHANNEL FOR FUNCTIONS
MTS==344 ;MAG TAPE CHANNEL FOR STOPPING AND STATUS
;SHIFTS FOR FIELDS IN CONO MTC,
UNITNO==15.
PARITY==14.
CDUMP==13.
FUNC==9.
DENSTY==6.
800BPI==2
MAGCOM=5_<UNITNO>+1_<PARITY>+800BPI_<DENSTY>+1_<CDUMP>
;FUNCTIONS
NOOP1=0_<FUNC>+MAGCOM ;CLEAR INTERRUPT FLAGS
NOOP2=10_<FUNC>+MAGCOM ;INTERRUPT WHEN TRANSPORT IDLE
REWIND=1_<FUNC>+MAGCOM ;REWIND
REED=2_<FUNC>+MAGCOM ;READ
SPACR=7_<FUNC>+MAGCOM ;SPACE REVERSE
;FLAGS
JOBDON==100
DATREQ==1
EOFF==10000
EOTF==4000
;NOTE - TM10B HAS DATA PIA (CONI MTC, 1.1-1.3) STUCK AT 7
REW: CLEARM EOFCNT
CLEARM MAGBFP
CLEARM SHORTL
CONO MTC,NOOP1 ;CLEAR INTERRRUPT FLAGS
CONO MTC,REWIND ;INITIATE REWIND
CONSO MTS,JOBDON ;WAIT FOR REWIND TO BEGIN
JRST .-1
CONO MTC,NOOP2 ;SET JOB DONE WHEN TRANSPORT IDLE
CONSO MTS,JOBDON ;WAIT FOR JOB DONE
JRST .-1
SETOM ITAPE
POPJ P, ;REWIND DONE
ITAPE: 0
MREAD: MOVEI T,0
PUSH P,B
MREAD7: SKIPGE B,MAGBFP
JRST MREAD5
SKIPN EOFLG
JRST MREAD1
SETZM EOFLG
SETOM EOUF
JRST POPBJ
MREAD1: MOVEI B,10.
MOVEM B,MTRYS
MERR2: MOVE B,[-2000,,MAGBUF]
MOVEM B,MAGBFP
SETZM SLVIOWD
CONO MTC,NOOP1 ;CLEAR FLAGS
CONSO MTC,7 ;IS THIS A TM10B?
JRST MREADA ;NO
KA, MOVE B,[-2000,,MAGBUF-1] ;YES SET UP CHANNEL PROGRAM
KL, MOVE B,[-2000_4,,MAGBUF-1]
MOVEM B,SLVIOWD
SETZM SLVICWA+1
SETZM SLVIOWD+1
DATAO MTS,[SLVICWA]
KL,[ SWPUA ;UNLOAD THE CACHE
PUSH P,A
MOVE A,[CONSZ APR,200000]
MOVE B,[JRST A]
MOVE C,[POPJ P,]
PUSHJ P,A
POP P,A
]
MREADA: CONO MTC,REED
MREAD2: CONSO MTS,DATREQ+EOFF+JOBDON+EOTF ;WAIT FOR NEXT DATA REQUEST
JRST .-1
MOVEI C,20.
SOJG C,.
CONI MTS,C
TRNE C,EOTF
JRST MREOT
TRNN C,JOBDON
JRST MREAD3
TRNN C,EOFF
JRST MREAD6
AOS EOFCNT
SETOM EOFLG
CLEARM SHORTL
JRST MREAD9
MREAD6: SETOM SHORTL
MREAD9: CONSZ MTC,7 ;SKIP IF TM10A
JRST MREADB
HLLZS B
MOVNS B
ADDM B,MAGBFP
JRST MREAD4
MREADB: HRRZ B,SLVICWA+1
JUMPE B,.-1
MOVNI B,1-MAGBUF(B)
SKIPE EOFLG
MOVSI B,0 ;EOF MARK => NO WORDS READ
HRLM B,MAGBFP
JRST MREAD4
MREAD3: TRNE C,DATREQ
CONSZ MTC,7 ;SKIP IF TM10A
JRST MREAD2 ;TM10B OR NO DATA REQUEST
DATAI MTC,(B)
SKIPE SHORTL
JRST 4,.
AOBJN B,MREAD2
MREAD4: CONO MTS,1
CONSO MTS,JOBDON
JRST .-1
CONSZ MTS,440000 ;X HUNG + ILL OP
JRST 4,MERR
MREAD8: CONSO MTS,20600
JRST MREAD7
MERR: SOSG MTRYS
JRST MERR1
SETZM SLVIOWD
KL,[ SWPUO 0
CONSZ APR,200000
JRST .-1
]
CONO MTC,NOOP1
CONO MTC,SPACR
CONSZ MTC,7 ;SKIP IF TM10A
JRST .+4
CONSO MTS,DATREQ
JRST .-1
DATAO MTC,
CONO MTS,1
CONSO MTS,JOBDON
JRST .-1
JRST MERR2
MERR1: AOS FERRS ;IGNORE ERR
JRST MREAD7
MREAD5: HLRE C,B
CAMG B,A
HLRE C,A
HRLZS B
HRR B,A
MOVNS C
HRLS C
ADDI C,-1(A)
BLT B,(C)
HLRS C
ADD A,C
ADDM C,MAGBFP
ADDI T,(C)
JUMPGE A,POPBJ
JRST MREAD7
MREOT: CONO MTS,1 ;STOP TAPE IF STILL MOVING
CONO MTC,NOOP1
LPR EOT
X LCRR
JRST DDT
];NTS
SUBTTL TYPE CONTROLLER AND DRIVE STATUS
TS,[
GSTS: POPJ P,
];TS
DC,[
GETSTS: MOVEI P,PDL
PUSH P,[DDT]
GSTS: INSIRP PUSH P,[A B C D T]
CONI DC0,D
MOVEI C,DC0STS
TYPE CONTROLLER STATUS:
PUSHJ P,TYPSTS
CONI DC1,D
MOVEI C,DC1STS
PUSHJ P,TYPSTS
CONO DC0,DCCSET+DCDENB
DATAO DC0,[DJMP GETUNT]
CONSZ DC0,DSSACT
JRST .-1
TYPE CURRENT UNIT=
LDB A,[DUNFLD GOTUNT]
DPB A,[DUNFLD STOSTS]
PUSHJ P,TDPT
TYPE ,DRIVE STATUS:
PUSHJ P,CRR
DATAO DC0,[DJMP STOSTS]
CONSZ DC0,DSSACT
JRST .-1
MOVE D,STATUS
LSH D,-15.
MOVEI C,DRVSTS
PUSHJ P,TYPSTS
TYPE CYLINDER=
LDB A,[101100,,STATUS]
PUSHJ P,TOPT
PUSHJ P,CRR
INSIRP POP P,[T D C B A]
POPJ P,
TYPSTS: SETOM FIRST'
TYPST1: SKIPN B,(C)
JRST CRR
HLRZ T,B ;FLAGS TO TEST
TDNN D,T
AOJA C,TYPST1
MOVEI A,",
AOSE FIRST
PUSHJ P,TYO
MOVE A,LINPOS
CAILE A,TCMXH
PUSHJ P,CRR
PUSHJ P,OUTSTR
AOJA C,TYPST1
;DC
DEFINE STS A,B/
A,,[ASCIZ \B\]
TERMIN
DC0STS: STS 4000,ERROR-FLG
STS 1000,ATTENTION
STS 200,RUN
STS 100,ACTIVE
0
DC1STS: STS 4000,INTERNAL-PARITY-ERROR
STS 2000,RECORD-LENGTH
STS 1000,READ-COMPARE
STS 400,OVERRUN
STS 200,CHECKSUM/DECODER
STS 100,BARK!!
STS 40,FILE-UNSAFE/SEEK-INCOMPLETE/END-OF-DISC
STS 20,OFF-LINE/MULTIPLE-SELECT
STS 10,RDG-KEY/PROTECT/READONLY
STS 4,DATAO-WHILE-BUSY
STS 2,NON-EX-MEM
STS 1,CORE-PARITY-ERROR
0
DRVSTS: STS 4,UNIT-SELECTED
STS 10,ON-LINE
STS 20,READY
STS 40,SEEK-INCOMPLETE
STS 100,READ-ONLY
STS 200,UNSAFE
STS 400,WRITE-CURRENT-SENSED(?)
0
GETUNT: DJSR .+1
GOTUNT: 0
DHLT
STOSTS: DSDRST+DUNENB STATUS(74)
DHLT
STATUS: 0
];DC
RP,[
GETSTS: MOVEI P,PDL
PUSH P,[DDT]
GSTS: INSIRP PUSH P,[A B C D T]
TYPE DISK STATUS:
CONI DPC,D
MOVEI C,CNLSTS
TLNE D,-1
PUSHJ P,TYPSTS
MOVSS D
MOVEI C,CNISTS
PUSHJ P,TYPSTS
DATAI DPC,D
TLC D,1 ;REVERSE SENSE OF WRITE HEADER LOCKOUT SWITCH
MOVEI C,DTISTS
PUSHJ P,TYPSTS
TYPE CURRENT UNIT=
LDB A,[DUNFLI D]
PUSHJ P,TDPT
TYPE , CYLINDER=
LDB A,[DCYLI D]
TRNE D,.BM DCYLXI
ADDI A,400
PUSHJ P,TOPT
TYPE , LAST ADDRESSED CYL=
MOVE A,RPIOCY
X TOPT
TYPE , SURF=
MOVE A,RPIOHD
X TOPT
TYPE , SEC=
MOVE A,RPIOSC
X TOPT
PUSHJ P,CRR
INSIRP POP P,[T D C B A]
POPJ P,
TYPSTS: SETOM FIRST'
TYPST1: SKIPN B,(C)
JRST CRR
HLLZ T,B ;FLAGS TO TEST
TDNN D,T
AOJA C,TYPST1
MOVEI A,",
AOSE FIRST
PUSHJ P,TYO
MOVE A,LINPOS
CAILE A,TCMXH
PUSHJ P,CRR
PUSHJ P,OUTSTR
AOJA C,TYPST1
;RP
DEFINE STS A,B/
A,,[ASCIZ \B\]
TERMIN
; CONI STATUS TABLE (RH)
CNISTS: STS 400000,SEARCH DONE
STS 200000,END OF CYLINDER
STS 100000,POWER FAILURE
STS 040000,SEARCH ERROR
STS 020000,OVERRUN
STS 010000,NXM
STS 002000,DRIVE NOT READY
STS 001000,WRITE PROTECT
STS 000400,DATAO WHEN BUSY
STS 000200,SECTOR ADDRESS ERROR
STS 000100,SURFACE ADDRESS ERROR
STS 000020,BUSY
STS 000010,DONE
0
; CONI STATUS TABLE (LH)
CNLSTS: STS 000010,CONTROL WORD PARITY ERROR
STS 000004,SECTOR PARITY ERROR
STS 000002,MEMORY WORD PARITY ERROR
STS 000001,DISK WORD PARITY ERROR
0
; DATAI STATUS TABLE (LH)
DTISTS: STS 000100,SEEK INCOMPLETE
STS 000040,ON CYLINDER
STS 000020,DISK ON-LINE
STS 000010,FILE UNSAFE
STS 000004,NON EXISTENT DRIVE
STS 000002,DRIVE IS READ-ONLY
STS 000001,WRITE HEADER LOCKOUT OFF!!
0
];RP
RH,[
GETSTS: MOVEI P,PDL
PUSH P,[DDT]
GSTS:
IFN T300P,[
SKIPE T3IOP
JRST T3STS ;LAST OPERATION WAS REALLY TO T-300
];T300P
INSIRP PUSH P,[A B C D T I K]
TYPE CONTROLLER STATUS:
CONI DSK,D
MOVEI C,CNLSTS
TLNE D,-1
PUSHJ P,TYPSTS
MOVSS D
MOVEI C,CNISTS
PUSHJ P,TYPSTS
TYPE CURRENT REGISTER:
DATAI DSK,D
PUSHJ P,TYPRGN
MOVE A,D
PUSHJ P,TOPT ;TYPE REG NO, STATUS, AND CONTENTS IN OCTAL
JUMPL D,GSTS0 ;DO FOLLOWING ONLY FOR DRIVE REGS
MOVEI A,",
PUSHJ P,TYO
MOVEI C,DIBSTS
PUSHJ P,TYPSTS
CAIA ;DON'T GIVE BLANK LINE
GSTS0: PUSHJ P,CRR
TYPE CURRENT DRIVE=
LDB A,[$HCDRV D]
PUSHJ P,TDPT
PUSHJ P,CRR
MOVEI I,NUNITS-1 ;CONVERT BACK TO VIRTUAL UNIT
CAME A,QTRAN(I) ;TO MAKE RHGET HAPPY
SOJGE I,.-1
JUMPL I,GSTS3 ;FOO!! ADDRESSING NON EXISTENT DRIVE
MOVSI K,-LGSTSR ;DISPLAY DRIVE REGS SPEC'ED IN TABLE
GSTS1: MOVE D,GSTSRT(K)
PUSHJ P,TYPRGN ;TYPE REG NAME
HRRZ C,D ;C -> STATUS BIT TABLE
HLLZ A,D ;A := REG NUMBER
PUSHJ P,RHGET ;GET CONTENTS OF REG
JRST GSTSER ;??
PUSHJ P,TOPT ;GIVE CONTENTS IN OCTAL
PUSHJ P,TSPAC
MOVS D,A ;AND SYMBOLICLY
PUSHJ P,TYPSTS
AOBJN K,GSTS1
GSTS3: INSIRP POP P,[K I T D C B A]
POPJ P,
GSTSER: TYPE BARF:
MOVE D,A
MOVEI C,DIBSTS
PUSHJ P,TYPSTS
JRST GSTS3 ;DON'T TRY ANY MORE REGS
TYPSTS: SETOM FIRST'
TYPST1: SKIPN B,(C)
JRST CRR
HLLZ T,B ;FLAGS TO TEST
TDNN D,T
AOJA C,TYPST1
MOVEI A,",
AOSE FIRST
PUSHJ P,TYO
MOVE A,LINPOS
CAILE A,TCMXH
PUSHJ P,CRR
PUSHJ P,OUTSTR
AOJA C,TYPST1
TYPRGN: LDB A,[360600,,D] ;TYPE NAME OF REGISTER ADDRESSED BY D
ROT A,-1
MOVE B,RHRGTB(A)
JUMPL A,.+2
MOVSS B
PUSHJ P,OUTSTR
MOVEI A,"=
JRST TYO
;TABLE OF DRIVE REGISTERS THAT NEED TO BE DISPLAYED
; LH = REG ADDR, RH = STATUS BITS TABLE ADDR
GSTSRT: %HRDCL,,[0]
%HRSTS,,STSSTS
%HRCYL,,[0]
%HRCCY,,[0]
%HRADR,,[0]
%HROFS,,OFSSTS
%HRER1,,ER1STS
%HRER2,,ER2STS
%HRER3,,ER3STS
LGSTSR==.-GSTSRT
;RH
DEFINE STS A,B/
A,,[ASCIZ \B\] ? TERMIN
; CONI STATUS (LH)
CNLSTS: STS 400000,AR FULL
STS 200000,CB FULL
STS 040000,CC INH
STS 020000,CHANNEL ACTIVE
STS 010000,CHANNEL PULSE
STS 004000,22-BIT CHANNEL
STS 000400,CXR ILL FUNC
STS 000200,CXR DRIVE ACCESS ERR
STS 000004,MEMORY PARITY
STS 000002,CONTROL WORD PARITY
STS 000001,NXM
0
; CONI STATUS (RH)
CNISTS: STS 400000,DATA BUS PARITY
STS 200000,DRIVE EXCEPTION
STS 100000,CHANNEL ERROR
STS 020000,CHANNEL OVERRUN
STS 010000,DRIVE RESPONSE ERR
STS 004000,CXR ILL CMD
STS 002000,CXR POWER FAIL
STS 000200,CONTROL BUS OVERRUN
STS 000100,RAE INTR
STS 000040,ATTN INTR
STS 000020,BUSY
STS 000010,DONE
0
; REGISTERS
ZZ==-1
XX==0
YY==0
DEFINE REG N,T/
IFLE N-ZZ, .ERR REG OUT OF ORDER
REPEAT N-ZZ-1, REGH [ASCIZ\????\]
REGH [ASCIZ\T\]
TERMIN
DEFINE REGH [A]
ZZ==ZZ+1
IFE XX, YY==A
IFN XX, YY,,A
XX==1-XX
TERMIN
RHRGTB: REG 0,DRV CTL
REG 1,DRV STATUS
REG 2,DRV ER1
REG 3,DRV MAINT
REG 4,ATTENTION
REG 5,DRV TRACK-SECTOR
REG 6,DRV TYPE
REG 7,DRV LOOK-AHEAD
REG 10,DRV SERIAL NO
REG 11,DRV OFFSET
REG 12,DRV DESIRED CYL
REG 13,DRV CURRENT CYL
REG 14,DRV ER2
REG 15,DRV ER3
REG 16,DRV ECC POS
REG 17,DRV ECC PAT
REG 40,CONTROL
REG 44,INTR ADDR
REG 50,DATA BUFFER
REG 54,RAE STATUS
REG 74,CHANNEL BUFFER
REG 100,FOO
LOC RHRGTB+40
EXPUNGE REG,REGH,XX,YY,ZZ
; BITS IN DIB REGISTER
DIBSTS: STS 004000,CTL-TO-DRIVE
STS 002000,CTL BUS TIMEOUT
STS 001000,CTL BUS PARITY
STS 000400,DIB DATA LATE
STS 000200,DIB ILL CMD
0
; DRIVE STATUS REGISTER
STSSTS: STS 1,FWD 5 IPS
STS 2,FWD 20 IPS
STS 4,INNER GUARD BAND
STS 10,GO REVERSE
STS 20,DIFF < 64
STS 40,DIFF = 1
STS 100,VOLUME VALID
STS 200,DRIVE READY
STS 400,CONN THIS CTRLR
STS 2000,LAST SECTOR XFERD
STS 4000,WRITE LOCK
STS 10000,MEDIUM ONLINE
STS 20000,POSITIONING IN PROGRESS
STS 40000,ERR
STS 100000,ATTENTION
0
; DRIVE ERROR REGISTER 1
ER1STS: STS 1,ILL FUNC
STS 2,ILL REG
STS 4,REG MOD REFUSE
STS 10,BUS PARITY ERR
STS 20,PACK FORMAT ERR
STS 40,WRITE CLOCK FAIL
STS 100,ECC HARD ERR
STS 200,HEADER WRONG
STS 400,HEADER CRC ERR
STS 1000,ADDR OVERFLOW
STS 2000,INVALID ADDR
STS 4000,WRITE LOCK ERR
STS 10000,DRV TIMING ERR
STS 20000,OP NOT COMPLETE
STS 40000,UNSAFE
STS 100000,DATA CHECK
0
; DRIVE ERROR REGISTER 2
ER2STS: STS 1,WRITE CURRENT UNSAFE
STS 2,CURRENT SINK FAILURE
STS 4,WRITE SELECT UNSAFE
STS 10,CURRENT SWITCH UNSAFE
STS 20,MOTOR SEQUENCE ERR
STS 40,TRANSITIONS DET FAIL
STS 100,TRANSITIONS UNSAFE
STS 200,"UNSAFE EXCEPT R/W"
STS 400,WRITE READY UNSAFE
STS 1000,MULTIPLE HEAD SELECT
STS 2000,NO HEAD SELECT
STS 4000,INDEX ERROR
STS 10000,30 VOLT UNSAFE
STS 20000,PHASE LK OSC UNSAFE
STS 100000,AC UNSAFE
0
; DRIVE ERROR REGISTER 3
ER3STS: STS 1,PACK SPEED UNSAFE
STS 2,VELOCITY UNSAFE
STS 10,UNSAFE EXCEPT R/W
STS 40,AC LOW
STS 100,DC LOW
STS 40000,SEEK INCOMPLETE
STS 100000,OFF CYLINDER
0
; DRIVE OFFSET REGISTER
OFSSTS: STS 2000,HDR COMPARE INH
STS 4000,ECC INHIBIT
STS 10000,PDP-11 FORMAT
0
];RH
IFN T300P,[
;PRINT STATUS OF T300 (ERROR FROM LAST COMMAND)
;LATER THIS WILL BE INTEGRATED INTO GSTS
T300ST: MOVEI P,PDL
PUSH P,[DDT]
T3STS: INSIRP PUSH P,[A B C D T I K]
TYPE T-300 AND 2561 STATUS:
SKIPN D,DSCFLT
JRST T3STS2
TRNN D,%DFRST+%DFCQE+%DFNXM+%DFPAR
JRST T3STS1
MOVEI C,[ STS %DFRST,CONTROLLER POWER-CYCLED AND RESET
STS %DFCQE,COMMAND-QUEUE ERROR
STS %DFNXM,RQB NXM
STS %DFPAR,RQB PARITY ERROR
0 ]
MOVSS D ;TYPSTS WANTS BITS IN LEFT HALF
PUSHJ P,TYPSTS
TYPE , PDP-11 ERROR ADDRESS=
LDB A,[000200,,DSCFLT]
LSH A,16.
IOR A,DSCSTS
PUSHJ P,TOPT
T3STS9: PUSHJ P,CRR
JRST GSTS3
;FAULT CODE
T3STS1: CAILE D,17
JRST [ TYPE ILLEGAL FAULT CODE=
MOVE A,D
PUSHJ P,TOPT
JRST T3STS9 ]
MOVE B,(D)[ [ASCIZ/FAULT CODE 0?/]
[ASCIZ/DRIVE NOT READY/]
[ASCIZ/ILLEGAL HEAD OR SECTOR/]
[ASCIZ/SEEK TIMEOUT/]
[ASCIZ/DISK STATUS BAD AFTER ON-CYLINDER (FAULT CODE 4)/]
[ASCIZ/TIME OUT WRITING SECTOR ID (FAULT CODE 5)/]
[ASCIZ/FIFO ERROR IN FORMAT WRITE (FAULT CODE 6)/]
[ASCIZ/WRITE TIMEOUT (FAULT CODE 7)/]
[ASCIZ/SEEK TIMEOUT (FAULT CODE 10)/]
[ASCIZ/HEADS NOT LOADED/]
[ASCIZ/READ TIMEOUT (FAULT CODE 12)/]
[ASCIZ/INDEX TIMEOUT (FAULT CODE 13)/]
[ASCIZ/SECTOR TIMEOUT (FAULT CODE 14)/]
[ASCIZ/FAULT CODE 15?/]
[ASCIZ/DMA TIMEOUT (FAULT CODE 16)/]
[ASCIZ/DMA TIMEOUT IN ECC (FAULT CODE 17)/] ]
PUSHJ P,OUTSTR
PUSHJ P,CRR
;COMMAND OK, CHECK ORDINARY ERROR STATUS
T3STS2: MOVE D,DSCSTS
MOVEI C,[ STS %DSRTR,COMMAND WAS RETRIED
STS %DSECH,UNCORRECTABLE DATA ERROR
STS %DSECC,CORRECTED DATA ERROR
STS %DSIDE,ID ERROR
STS %DSHCE,HEADER COMPARE ERROR
STS %DSPRT,WRITE-PROTECTED SECTOR
STS %DSALT,ALTERNATE-SECTOR FLAG
STS %DSOVR,OVERRUN
STS %DSSKE,SEEK ERROR
STS %DSOFL,DRIVE OFF-LINE OR FAULT
STS %DSFLT,DRIVE FAULT
STS %DSNXM,PDP11 MEMORY NXM
STS %DSPAR,PDP11 MEMORY PARITY ERROR
STS %DSSFL,SYSTEM FAULT
STS %DSWLK,DRIVE WRITE-LOCKED
0 ]
MOVSS D ;TYPSTS WANTS D IN LEFT HALF
PUSHJ P,TYPSTS
PUSHJ P,CRR ;NOW SHOW DISK COMMAND AND ADDRESS
TYPE DISK COMMAND:
MOVE A,DSCCMD
PUSHJ P,TOPT
PUSHJ P,TSPAC
MOVEI B,[ASCIZ/(UNKNOWN?)/]
CAIN A,%DMSNS
MOVEI B,[ASCIZ/(SENSE)/]
CAIN A,%DMTST
MOVEI B,[ASCIZ/(DIAGNOSTICS)/]
CAIN A,%DMREC
MOVEI B,[ASCIZ/(RECALIBRATE)/]
CAIN A,%DMSEK
MOVEI B,[ASCIZ/(SEEK)/]
CAIN A,%DMWRT
MOVEI B,[ASCIZ/(WRITE)/]
TRNE A,%DMRED
JRST [ CAIG A,%DMRED+10
MOVE B,(A)[ [ASCIZ/(READ)/]
[ASCIZ/(READ EARLY-DATA-STROBE)/]
[ASCIZ/(READ LATE-DATA-STROBE)/]
[ASCIZ/(READ POSITIVE-CYLINDER-OFFSET)/]
[ASCIZ/(READ NEGATIVE-CYLINDER-OFFSET)/]
[ASCIZ/(READ EARLY-DATA-STROBE POSITIVE-CYLINDER-OFFSET)/]
[ASCIZ/(READ EARLY-DATA-STROBE NEGATIVE-CYLINDER-OFFSET)/]
[ASCIZ/(READ LATE-DATA-STROBE POSITIVE-CYLINDER-OFFSET)/]
[ASCIZ/(READ LATE-DATA-STROBE NEGATIVE-CYLINDER-OFFSET)/]
]-%DMRED
JRST .+1 ]
PUSHJ P,OUTSTR
TYPE , DRIVE=
MOVE A,DSCDRV
PUSHJ P,TOPT
TYPE , CYL=
MOVE A,DSCCYL
PUSHJ P,TOPT
TYPE , HEAD=
MOVE A,DSCHED
PUSHJ P,TOPT
TYPE , SEC=
MOVE A,DSCSEC
PUSHJ P,TOPT
JRST T3STS9
];T300P
SUBTTL READ & TYPE OUT HEADERS
DC,[ ;FOR NOW, DC10 ONLY
RDHDHD==20 ;2WORDS PER SEC, MANY SECS
RDHEAD: JSR INIT ;READ ALL HEADERS ON A TRACK
PUSHJ P,CRR
UNTMES UNIT=
PUSHJ P,GETNUM
JRST RDHEAD
CAIL A,NUNITS
JRST RDHEAD
MOVEM A,TOU
MOVE I,A
PUSHJ P,RESET
RDHD1: TYPE CYL=
PUSHJ P,GETNUM
JRST DDT
CAIL A,NCYLS+XCYLS
JRST RDHD1
SKIPGE QTRAN(I)
ADDI A,NCYLS+XCYLS
DPB A,[DCYL READHD]
TYPE SURF=
PUSHJ P,GETNUM
SETZ A,
CAIL A,NHEDS
JRST RDHD1
DPB A,[DSURF READHD]
DATAO DC0,[DJMP READHD]
CONSZ DC0,DSSACT
JRST .-1
CONSZ DC0,DSSERR
JRST [ TYPE ERROR---
JRST GETSTS]
SETOM SECT0'
SETOM FIRST
SETZ T,
RDHD2: MOVE D,HEADBF(T)
TLZ D,777000
CAMN D,SECT0
JRST RDHD1 ;GONE AROUND ONCE
AOSN FIRST
MOVEM D,SECT0
TYPE PKID=
LDB A,[DPKID HEADBF(T)]
PUSHJ P,TOPT
PUSHJ P,TCOMMA
MOVE D,HEADBF(T)
PUSHJ P,TYPLOC
PUSHJ P,CRR
MOVE A,HEADBF+1(T)
TLNE A,1000 ;INDIRECT BIT OF HEADER
JRST [ MOVEI A,"@
PUSHJ P,TYO
MOVE D,HEADBF+1(T)
PUSHJ P,TYPLOC
JRST RDHD6]
TYPE LENGTH=
MOVN A,HEADBF+1(T)
LDB A,[1600,,A] ;LENGTH FIELD
PUSHJ P,TOPT
LDB A,[270200,,HEADBF+1(T)] ;ANY NEXT-ADDRESS CODE?
JUMPE A,RDHD3
MOVE B,NXTADR(A)
PUSHJ P,OUTSTR
RDHD3: MOVE A,HEADBF+1(T)
TLNE A,200
JRST [ MOVEI B,[ASCIZ /,WRITE PROTECT/]
PUSHJ P,OUTSTR
JRST .+1]
RDHD6: SETO C, ;PARITY
HRLI T,-2
RDHD4: MOVEI D,14.
MOVE A,HEADBF(T)
XORM A,C
LSH A,-2
SOJG D,.-2
AOBJN T,RDHD4
TRNN C,3 ;BOTH ODD?
JRST RDHD5
MOVEI B,[ASCIZ /,BAD PARITY!!/]
PUSHJ P,OUTSTR
RDHD5: PUSHJ P,CRR
CAIL T,RDHDHD*NSECS
JRST RDHD1
JRST RDHD2
READHD: DSPC+DSWIDX+DSWNUL+DSCRHD ;WAIT FOR INDEX, THENREAD HEADERS
QCOPY HEADBF,RDHDHD*NSECS
DHLT
HEADBF: BLOCK RDHDHD*NSECS
TCOMMA: MOVEI A,",
JRST TYO
NXTADR: 0
[ASCIZ /,END-OF-TRACK/]
[ASCIZ /,END-OF-CYLINDER/]
[ASCIZ /,END-OF-DISC/]
TYPLOC: TYPE CYL=
LDB A,[DCYL D]
PUSHJ P,TOPT
TYPE ,SURF=
LDB A,[DSURF D]
PUSHJ P,TOPT
TYPE ,SECT=
LDB A,[DSECT D]
JRST TOPT
GETNUM: SETZ C,
SETOM FIRST
GETNM1: PUSHJ P,TYI
CAIL A,"0
CAILE A,"9
JRST [ MOVE A,C
SKIPL FIRST
AOS (P)
JRST CRR]
AOS FIRST
IMULI C,10
ADDI C,-"0(A)
JRST GETNM1
];DC
SUBTTL DRIVE RESET
NTS,[
DC,[
RECAL: CONO DC0,DCCSET+DCDENB
MOVE T,QTRAN(I)
SKIPL DRIVE(T) ;SKIP IF DRIVE NOT KNOWN TO BE DEAD ALREADY
JRST [ SETZM QACT(I)
POPJ P,]
DPB T,[DUNFLD DRST]
DPB T,[DUNFLD STOSTS]
DATAO DC0,[DJMP STOSTS]
CONSZ DC0,DSSACT
JRST .-1
MOVE T,STATUS
TDNN T,[DDSONL] ;ON LINE
JRST OFFL1
DATAO DC0,DRST
CONSO DC0,DSSATT
JRST .-1
CONSO DC1,20 ;OFF LINE OR MULTIPLE SELECT
POPJ P,
OFFL1: SETZM QACT(I)
SKIPE GOGOX
POPJ P, ;IN GOGO MODE, WILL CHECK FOR RIGHT PACKS MOUNTED
TYPE Drive off line #
PUSH P,A
HRRZ A,QTRAN(I)
SETZM DRIVE(A)
PUSHJ P,DPT
POP P,A
PUSHJ P,CRR
POPJ P,
];DC
RP,[
RESET: PUSH P,A
CONSZ DPC,BUSY
JRST .-1
DATAO DPC,[DEASEC 776]
DPB I,[DUNFLD DRST]
DATAO DPC,DRST
RESET0: DATAI DPC,T
TLNE T,20
JRST RESET1
SKIPE GOGOX
JRST RESET9 ;IN GOGO MODE, WILL CHECK FOR RIGHT PACKS MOUNTED
TYPE OFF LINE #
MOVE A,I
PUSHJ P,DPT
PUSHJ P,CRR
JRST RESET9
RESET1: TLNN T,4
JRST RESET2
SKIPE GOGOX
JRST RESET9 ;IN GOGO MODE, WILL CHECK FOR RIGHT PACKS MOUNTED
TYPE NO SUCH DRIVE #
MOVE A,I
PUSHJ P,DPT
PUSHJ P,LCRR
JRST RESET9
RESET2: TRNN T,776
JRST RESET0
DATAO DPC,[DEASEC 776]
JRST POPAJ
RESET9: SETZM QACT(I) ;THIS DRIVE LOST
JRST POPAJ
DRST: DRCALC
];RP
DC,[
RESET: PUSHJ P,RECAL
MOVE T,QTRAN(I) ;GET PACK ID FROM HARDWARE
DPB T,[DUNFLD GPKID]
MOVEI T,TUTCYL
SKIPGE QTRAN(I)
ADDI T,NCYLS+XCYLS
DPB T,[DCYL GPKID]
CONO DC0,DCCSET+DCDENB
DATAO DC0,[DJMP GPKID]
CONSZ DC0,DSSACT
JRST .-1
LDB T,[DPKID RPKID]
MOVEM T,PKNUM(I)
POPJ P,
DRST: DSPC+DSRCAL+DSWINF+DUNENB
GPKID: DSPC+DSCRHD+DSWNUL+DUNENB+TUTCYL_11.+TUTSRF_6+TUTSEC
DCOPY RPKID(37774)
DHLT
];DC
];NTS
TS,[
RESET: PUSH P,A
HRRZ A,QTRAN(I)
SKIPL DRIVE(A)
JRST OFFL2
CAML I,NQS
JRST OFFL2
HRRZ A,SQACT ;SYSTEM QACT TABLE
ADD A,I
MOVSS A
HRRI A,A
.GETLOC A, ;COPY SYSTEMS QACT
SKIPE A ;0 MEANS ON-LINE TO ITS
JRST OFFLIN
POP P,A
POPJ P,
OFFLIN: TYPE Drive off line #
HRRZ A,QTRAN(I)
SETZM DRIVE(A)
PUSHJ P,DPT
PUSHJ P,CRR
OFFL2: SETZM QACT(I)
POP P,A
POPJ P,
];TS
NTS,[
RH,[
RESET: MOVE T,QTRAN(I) ;GET PHYS DRIVE
IFN T300P,[
CAIL I,T300P
JRST T3RST
];T300P
SKIPL DRIVE(T)
JRST [ SETZM QACT(I) ;DRIVE ALREADY KNOWN TO BE DOWN
POPJ P, ]
PUSH P,A
MOVE A,[%HRDCL,,%HMCLR] ;CLEAR THE DRIVE
PUSHJ P,RHSET
JRST RESETL ;HMM, NO DRIVE
MOVE A,[%HRDCL,,%HMRDP] ;I SAID, "CLEAR THE DRIVE"!
PUSHJ P,RHSET
JRST RESETL
MOVE A,[%HROFS,,0] ;CLEAR THE FRIGGING DRIVE!!!
PUSHJ P,RHSET
JRST RESETL
MOVSI A,%HRTYP ;GET DRIVE TYPE
PUSHJ P,RHGET
JRST RESETL ;??
TRNE A,140000
JRST RESETL ;TAPE?
TRNN A,020000
JRST RESETL ;FIXED HEADS?
MOVE A,[%HRDCL,,%HMACK] ;PACK ACKNOWLEDGE
PUSHJ P,RHSET
JRST RESETL
MOVSI A,%HRSTS
PUSHJ P,RHGET
JRST RESETL
TRNN A,%HSMOL
JRST RESET4 ;PACK NOT MOUNTED
MOVE A,[%HRDCL,,%HMREC] ;RECALIBRATE
PUSHJ P,RHSET
JRST RESETL
MOVEI B,80000. ;A LITTLE OVER 1/2 SEC
RESET0: MOVSI A,%HRSTS ;GET STATUS
PUSHJ P,RHGET
JRST RESETL ;DRIVE VANISHED?
TRNE A,%HSERR
JRST RESETL ;GOT ERROR RECALIBRATING?
TRC A,%HSVV+%HSMOL+%HSRDY ;CHECK FOR GOOD BITS
TRCE A,%HSVV+%HSMOL+%HSRDY
SOJG B,RESET0 ;BITS NOT ALL ON, WAIT MORE
JUMPG B,RESET5 ;WON.
;TIMED OUT, FALL INTO RESETL
RESETL: SETZM QACT(I) ;LOST
SKIPE GOGOX
JRST POPAJ ;IN GOGO MODE, WILL CHECK FOR RIGHT PACKS MOUNTED
CONSZ DSK,%HIDRE
JRST RESET1
CONSZ DSK,%HIILC
JRST RESET2
TYPE MISC ERROR DRIVE #
MOVEI A,GSTS ;CALL GSTS BEFORE RETURNING
EXCH A,(P)
PUSH P,A
JRST RESET3
RESET2: TYPE ILC OR RAE DRIVE #
JRST RESET3
RESET1: TYPE DRIVE NOT PRESENT #
RESET3: HRRZ A,QTRAN(I)
X DPT
X CRR
JRST POPAJ
RESET4: SETZM QACT(I)
SKIPE GOGOX
JRST POPAJ ;IN GOGO MODE, WILL CHECK FOR RIGHT PACKS MOUNTED
TYPE DRIVE OFF LINE #
JRST RESET3
RESET5: SKIPE MARKF
JRST POPAJ ;PACK NOT FORMATTED YET
MOVSI A,%HRCYL
HRRI A,TUTCYL
PUSHJ P,RHSET
JRST RESETL
MOVSI A,%HRADR
PUSHJ P,RHSET
JRST RESETL
MOVE A,[-2_4,,SLVIOWD-1]
MOVEM A,SLVICWA
SETZM SLVICWA+1
KL,[ SWPUO 0
CONSZ APR,200000
JRST .-1
]
MOVE A,[%HRCTL,,SLVICWA_6+%HMRHD]
PUSHJ P,RHSET
JRST RESETL
CONSO DSK,%HIDONE
JRST .-1
CONSZ DSK,%HIERR
JRST RESETL
HRRZ A,SLVIOWD+1 ;GET I.T.S. PACK NUMBER
MOVEM A,PKNUM(I)
JRST POPAJ
];RH
IFN T300P,[
T3RST: PUSH P,D
MOVEI D,%DMSNS ;FIRST, SENSE STATUS (RECALIBRATE HANGS IF
PUSHJ P,T3CMD ; DRIVE OFF LINE, AND TIMEOUT LEAVES 11 WEDGED)
JUMPL T,T3RSTL ;TIMEOUT, 11 MUST BE DOWN
TDNE T,[%DFRST,,%DSOFL+%DSSFL]
JRST T3RSTL ;DRIVE OFF-LINE, LEAVE IT ALONE
MOVEI D,%DMREC ;SEND A RECALIBRATE
PUSHJ P,T3CMD
JUMPN T,T3RSTL ;JUMP IF ERROR
SETOM PKNUM(I) ;PACK NUMBER NOT GOTTEN FROM HARDWARE!
POP P,D
POPJ P,
T3RSTL: SETZM QACT(I) ;OFF LINE
POP P,D
SKIPN GOGOX
JRST T3STS
POPJ P,
;DO COMMAND IN D ON DRIVE NUMBER IN I, RETURN STATUS IN T (0 IF OK)
;LH(T) GETS DSCFLT, RH(T) GETS DSCSTS
;YOU MUST SET UP DSCCYL, ETC. BEFORE CALLING
T3CMD: MOVEI T,2561
MOVEM T,DSCCHK
MOVEM D,DSCCMD
MOVEI T,-T300P(I)
MOVEM T,DSCDRV
SETZM DSCDON
KL,[ SWPUO 0 ;UNLOAD PAGE 0 FROM THE CACHE
CONSZ APR,200000
JRST .-1
];KL
MOVEI T,1
MOVEM T,DSCREQ
KL,[ SWPUO 0 ;UNLOAD PAGE 0 FROM THE CACHE
CONSZ APR,200000 ;AGAIN SO 11 WILL SEE DSCREQ ON IN INTERRUPT
JRST .-1
];KL
CONO DLC,100040 ;INTERRUPT 11
MOVEI T,60000. ;I THINK THIS TIMEOUT IS ABOUT 3 SECONDS
;UNFORTUNATELY, THIS TIMEOUT DOESN'T WORK ANYWAY
;REALLY, BECAUSE IF DRIVE 0 IS OFFLINE THE
;CONTROLLER HANGS AND EXECUTES COMMANDS WRONG
;AND OTHERWISE LOSES ITS ASS.
T3CMD1:
KL,[ SWPUO 0 ;UNLOAD PAGE 0 FROM THE CACHE
CONSZ APR,200000 ;AGAIN SO DSCDON GETS PICKED UP FROM MAIN MEMORY
JRST .-1
];KL
SKIPN DSCDON
SOJG T,T3CMD1
JUMPLE T,[ MOVSI T,(SETZ) ;SIGNAL TIMEOUT (DRIVE OFFLINE?)
POPJ P, ] ;DSCFLT & DSCSTS WILL SAY NON-ERROR
SETZM DSCDON
CONO DLC,10 ;11 IS TRYING TO INTERRUPT -10, TURN IT OFF
HRLZ T,DSCFLT
HRR T,DSCSTS
TRZE T,%DSRTR+%DSECC ;THESE ARE NOT ERRORS
AOS CERRS
POPJ P,
];T300P
];NTS
SUBTTL READ & WRITE TUT
;DISK NUMBER IN I, CORE ADDR IN A, ERROR RETURN HAS T NEGATIVE
WRTUT:
TS, JRST SUCCESS
NTS,[ MOVE J,MFDBK
SUB J,NTBL(I)
WRTUT0: PUSHJ P,WRITE
JUMPL T,CPOPJ
ADDI A,2000
ADDI J,1
CAMGE J,MFDBK
JRST WRTUT0
POPJ P,
];NTS
RDTUT:
NTS,[ MOVE J,MFDBK
SUB J,NTBL(I)
RDTUT0: PUSHJ P,READ
JUMPL T,CPOPJ
ADDI A,2000
ADDI J,1
CAMGE J,MFDBK
JRST RDTUT0
POPJ P,
];NTS
TS,[ TUTPAG==600000 ;READ TUT BY MAPPING IN ABS PAGE
MOVE T,NTBL(I) ;SIZE OF TUT ON THIS DRIVE
MOVE J,[SQUOZE 0,QTUTO] ;AND WHERE ARE THEY LOCATED?
.EVAL J,
.VALUE
PUSH P,A
PUSH P,I
ADD J,I ;-> -> FIRST BLOCK THIS TUT
MOVSS J
HRRI J,J
.GETLOC J,
HRRZS J
LSH J,-10. ;FIRST BLOCK# OF TUT
MOVN I,T
HRL J,I ;AOBJN PTR FOR BLOCKS OF THIS TUT
RDTUT1: .CALL [ SETZ
'CORBLK
MOVEI 210000 ;READ ONLY
MOVEI -1 ;INTO SELF
MOVEI TUTPAG/2000
MOVEI 400000 ;FROM SYSTEM
SETZI (J) ]
.VALUE
MOVSI I,TUTPAG
JRST RDTUT3
RDTUT3: HRRI I,(A)
BLT I,1777(A) ;COPY IN A BLOCK OF TUT
ADDI A,2000
AOBJN J,RDTUT1
POP P,I
POP P,A
SKIPGE QPKNUM(A)
.VALUE ;OLD FORMAT?
SKIPN QLASTB(A)
.VALUE ;OLDER FORMAT?
JRST SUCCESS
];TS
SUBTTL DISK I/O
WRITT: MOVE I,TOU
WRITE: HRRZM J,LBLK'
TS,[ HRRZ TT,I
CAML TT,NQS
.VALUE
HRRZ TT,J
CAIGE TT,TBLKS
SKIPGE TT
.VALUE
JRST SUCCESS
];TS
DC,[ SKIPA T,[DWR]
READ: MOVEI T,DRD ;A/ CORE LOCN, I/ DRIVE J/TRACK #
HRRM T,DGO
HRRZM J,BLK
MOVEM I,UNIT
HRRZ TT,I
CAIL TT,NUNITS
JRST 4,.
HRRZ TT,J
CAIGE TT,TBLKS
SKIPGE TT
JRST 4,.
MOVE TT,QTRAN(I) ;GET PHYSICAL DRIVE #
DPB TT,[DUNFLD (T)]
DPB A,[DCCA 1(T)]
DPB A,[DCCA 4(T)]
HRRZ TT,J
CAIL TT,NBLKS+XBLKS
JRST 4,.
IDIVI TT,NSECS
DPB T,[DSECT @DGO]
IDIVI TT,NHEDS
DPB T,[DSURF @DGO]
MOVE T,TT
SKIPGE QTRAN(I)
ADDI T,NCYLS+XCYLS ;MAP INTO 2ND HALF OF CALCOMP
DPB T,[DCYL @DGO]
MOVE T,PKNUM(I)
CAIL TT,NCYLS
MOVEI T,0
DPB T,[DPKID @DGO]
HRRZ TT,DGO
MOVE T,(TT)
TLZ T,340000 ;CHANGE TO READ COMPARE
MOVEM T,3(TT)
RW1: MOVEI T,30.
SKIPE HCRASH
MOVEI T,0 ;SPEED IS OF THE ESSENCE - TRY ONLY ONCE
RW2: CONO DC0,DCCSET\DCDENB
DATAO DC0,DGO
MOVSI TT,3 ;WAIT AT MOST 3 SECONDS
CONSZ DC0,DSSACT
SOJGE TT,.-1
JUMPL TT,[ PUSH P,T
X RECAL
POP P,T
JRST .+2 ]
CONSZ DC0,DSSERR
SOJGE T,RW2
SKIPGE T
AOS FERRS
POPJ P,
DGO: DJMP .
DRD: DREAD+DUNENB
DCOPY .(-2000_2&37774)
DCOPY RXWDS(-4_2&37774)
DRC
DCCOMP .(-2000_2&37774)
DCCOMP RXWDS (-4_2&37774)
DHLT
DWR: DWRITE+DUNENB
DCOPY .(-2000_2&37774)
DCOPY WXWDS(-4_2&37774)
DRC
DCCOMP .(-2000_2&37774)
DCCOMP WXWDS(-4_2&37774)
DHLT
];DC
TS,[
READ: HRRZ TT,I
CAIL TT,NUNITS
.VALUE
HRRZ TT,J
CAMN TT,MFDBK
JRST [ .OPEN QIN,[.BII,,'DSK
SIXBIT /M.F.D./
SIXBIT /(FILE)/]
.VALUE
JRST RDIN]
CAML TT,NUDS
.VALUE ;SOME RANDOM DISK BLOCK
.SUSET [.SSNAM,,USRNAM]
.OPEN QIN,[.BII,,'DSK
SIXBIT /.FILE./
SIXBIT /(DIR)/]
.VALUE
RDIN: HRLI A,-2000
.IOT QIN,A
.CLOSE QIN,
SUCCES: MOVEI T,30.
POPJ P,
];TS
RP,[ ;RP10 I/O - FALL IN FROM WRITE
SKIPA T,DWR
READ: MOVE T,DRD
MOVEM T,RPIOOP
HRRZ TT,J
CAIL TT,MBLKS+XBLKS
JRST 4,.
IMULI TT,SECBLK
IDIVI TT,NSECS
MOVEM T,RPIOSC
IDIVI TT,NHEDS
MOVEM T,RPIOHD
MOVEM TT,RPIOCY
MOVEM A,RPAOBJ
MOVNI T,2000
HRLM T,RPAOBJ
JRST RPIO ;DO IT
DRD: DREADC+SLVICWA+5000 ;DISABLE PARITY ERROR STOPS
DWR: DWRITC+SLVICWA
;VARIABLES SET UP TO CONTROL TRANSFER
;WHEN AN ERROR OCCURS, IT GOES INTO SECTOR AT A TIME MODE, AND
;THESE VARIABLES ARE STEPPED ALONG TO REFLECT THAT.
RPAOBJ: 0 ;AOBJN POINTER TO WORDS TO BE TRANSFERRED
RPIOCY: 0 ;CYLINDER TO START AT
RPIOHD: 0 ;HEAD TO START AT
RPIOSC: 0 ;SECTOR TO START AT
RPIOOP: 0 ;COMMAND WORD. SLVICWA ALREADY ADDED IN
;UNIT IS IN I
;HIGH-LEVEL I/O ROUTINE. TRIES TO DO IT ALL AT ONCE,
;IF THAT LOSES TWICE TRIES IT A SECTOR AT A TIME.
;IF HCRASH IS SET, TRY ONLY ONCE.
;SMASHES T, TT. RETURNS T NEGATIVE IF ERROR.
RPIO: PUSH P,A
SETZM SLVIOWD+1
MOVE T,RPAOBJ
SOS T
MOVEM T,SLVIOWD
PUSHJ P,RPXIO ;TRY IT
JRST RPIO1
MOVEI T,102 ;WON
JRST RPIO9
RPIO1: SETOM T
SKIPE HCRASH
JRST RPIO9 ;GIVE UP IF HCRASH
PUSHJ P,RPRCAL ;RECALIBRATE, THEN
PUSHJ P,RPXIO ;TRY IT AGAIN
JRST RPIO2
MOVEI T,101 ;WON
RPIO9: SKIPGE T
AOS FERRS
POP P,A
POPJ P,
;SECTOR AT A TIME MODE
RPIO2: MOVEI T,100
SKIPL TT,RPAOBJ
JRST RPIO9 ;TRANSFER EXHAUSTED, WON
SOS TT
HRLI TT,-200
MOVEM TT,SLVIOWD
MOVEI T,10. ;TRY THIS SECTOR 10 TIMES
PUSHJ P,RPXIO
SOJGE T,.-1
JUMPL T,RPIO9 ;GIVE UP
MOVE T,[200,,200] ;ADVANCE TO NEXT SECTOR
ADDM T,RPAOBJ
AOS T,RPIOSC
CAIGE T,NSECS
JRST RPIO2
SETZM RPIOSC
AOS T,RPIOHD
CAIGE T,NHEDS
JRST RPIO2
SKIPL RPAOBJ
JRST RPIO2
JRST 4,. ;CYLINDER OVERFLOW?
;LOW-LEVEL IO, JUST DO THE OPERATION SPECIFIED IN THE VARIABLES.
;CLOBBER A,TT.
;SKIP IF SUCCESS.
RPXIO: MOVEI TT,SLVIOWD ;SET UP DF10 COMMAND
HRRZM TT,SLVICWA
SETZM SLVICWA+1
PUSH P,T
PUSHJ P,SEEK ;MAKE SURE AT DESIRED CYLINDER
JRST POPTJ ;SEEK FAILED
POP P,T
MOVE A,RPIOOP ;SET UP RP10 DATAO
DPB I,[DUNFLD A]
MOVE TT,RPIOCY
DPB TT,[DCYL A]
LSH TT,-8 ;FOR RP03
DPB TT,[DCYLXB A]
MOVE TT,RPIOHD
DPB TT,[DSURF A]
MOVE TT,RPIOSC
DPB TT,[DSECT A]
CONO DPC,DCLEAR
SKIPN HCRASH ;IF HCRASH, MAY BE MONITORING SOMETHING IN LIGHTS?
DATAO LIGHTS,A
DATAO DPC,A ;ISSUE COMMAND
CONSO DPC,DONE ;AWAIT DONE
JRST .-1
CONSZ DPC,ALLER ;SKIP-RETURN UNLESS ERROR
POPJ P,
HLRO TT,RPAOBJ ;SEEMS SUCCESSFUL, CHECK THE CHANNEL CONTROL WORD STORED
HRRZ A,RPAOBJ
SUB A,TT ;SUPPOSED END OF TRANSFER
HRRZ TT,SLVICWA+1
CAIE A,1(TT)
DF10FK: POPJ P, ;CHANNEL TRYING TO FUCK YOU OVER
JRST POPJ1
;RECALIBRATE UNIT IN I, SMASHES T,TT
RPRCAL: CONO DPC,DCLEAR
MOVE T,[DEASEC 776]
DPB I,[DUNFLD T] ;LEAVE PROPER UNIT SELECTED FOR GETSTS
DATAO DPC,T ;CLEAR ATTNS
DPB I,[DUNFLD DRST]
DATAO DPC,DRST
RPRCL1: DATAI DPC,TT
TLNN TT,(ONLINE)
POPJ P, ;OFF LINE
TLNE TT,(NSCHDR)
POPJ P, ;NO SUCH DRIVE
TRNN TT,776
JRST RPRCL1 ;AWAIT ATTENTION
DATAO DPC,T ;GOT ATTENTION, CLEAR IT
RPRCL2: TLNE TT,(ONCYL+SKINC)
POPJ P, ;DONE
DATAI DPC,TT
JRST RPRCL2 ;ON CYLINDER SOMETIMES TAKES A WHILE TO SET
;SEEK TO CYLINDER IN RPIOCY ON UNIT I, SMASHES T,TT, SKIPS ON SUCCESS.
SEEK: MOVEI TT,10.
MOVEM TT,SEEKC
SEEK1: CONSZ DPC,BUSY
JRST .-1
DATAO DPC,[DEASEC 776]
MOVSI TT,(DSEEKC)
DPB I,[DUNFLD TT]
MOVE T,RPIOCY
DPB T,[DCYL TT]
LSH T,-8 ;FOR RP03
DPB T,[DCYLXB TT]
SKIPN HCRASH
DATAO LIGHTS,TT
CONO DPC,DCLEAR
DATAO DPC,TT
MOVE T,[DEASEC 776]
DPB I,[DUNFLD T] ;LEAVE PROPER UNIT SELECTED FOR GETSTS
PUSHJ P,RPRCL1 ;AWAIT COMPLETION
TLNE TT,(ONCYL) ;SUCCEED IF ON CYLINDER
JRST POPJ1
SOSGE T,SEEKC ;COUNT FAILURES
POPJ P, ;GIVE UP
PUSHJ P,RPRCAL ;RECALIBRATE
JRST SEEK1 ;AND TRY AGAIN
];RP
RH,[ ;RH10 I/O - FALL IN FROM WRITE
;ENTER WITH: A ADDRESS, J BLOCK NUMBER, I VIRTUAL UNIT
.SEE RHCMD ;VARIABLES CONTROLLING WHAT GOES ON HERE
;INSIDE RW2 TT GENERALLY HAS THE DISK COMMAND AND T HAS THE RETRY COUNT
;ONLY T AND TT CLOBBERED
;ON RETURN T MINUS IF ERROR
SKIPA TT,[%HMWRT]
READ: MOVEI TT,%HMRED
IFN T300P,[
CAIL I,T300P
JRST T3IO
SETZM T3IOP
];T300P
MOVEM TT,RHCMD
HRRZ TT,J
CAIL TT,TBLKS
JRST 4,.
IDIVI TT,NBLKSC ;TT:=CYLINDER, T:=BLOCKS INTO CYLINDER
HRLZM TT,RHPGA ;SAVE CYLINDER
MOVE TT,T ;GET BLOCKS INTO CYLINDER
IMULI TT,SECBLK ;SECTORS INTO CYLINDER
IDIVI TT,NSECS ;TT:=HEAD, T:=SECTOR
LSH TT,8 ;FORM ADDRESS WORD
IOR TT,T
HRRM TT,RHPGA ;COMPLETE THE ADDRESS
MOVEI T,-1(A) ;SET UP IOWD TO TRANSFER ONE BLOCK
HRLI T,-2000
MOVEM T,RHIOW
;ENTER HERE WITH RHCMD, RHIOW, AND RHPGA SET UP. I HAS UNIT#.
RW1: MOVEI T,5 ;INIT LOSAGE COUNT
PUSHJ P,RW2 ;TRY
JRST RW7 ;FAILED
;HERE TO RETURN. T SAYS WHETHER WINNING OR LOSING.
RW5: MOVE A,[%HRDCL,,%HMCEN] ;RETURN TO CENTER-LINE IF NECESSARY
AOSN OFFSTF
PUSHJ P,RHSET
JFCL
SKIPGE T
AOS FERRS
MOVE A,RHIOW ;RESTORE A
MOVEI A,1(A)
POPJ P,
;HERE IF LOSING.
RW7: SKIPE HCRASH
JRST RWL0 ;SPEED IS OF THE ESSENCE, TRY ONLY ONCE
PUSHJ P,RW2 ;HMM, TRY AGAIN
JRST RWLOSS ;STILL LOSING, COGITATE
JRST RW5 ;WINNING NOW
RWLOSS: MOVSI A,%HROFS ;ATTACK OFFSET REGISTER
HRR A,OFFSTB(T) ;SET APPROPRIATE OFFSET VALUE
SETOM OFFSTF' ;REMEMBER TO RETURN TO CENTERLINE LATER
PUSHJ P,RHSET
JRST RWL0 ;WHAT??
MOVE A,[%HRDCL,,%HMOFS]
PUSHJ P,RHSET
JRST RWL0
MOVEI A,20000. ;WAIT 10 MS OR SO FOR GOOD LUCK
SOJG A,.
PUSHJ P,RW2 ;TRY IT NOW
SOJGE T,RWLOSS ;LOSE, TRY WITH DIFFERENT OFFSET
JUMPGE T,RW5 ;WON, SO TAKE WIN RETURN
RWL0: SETO T, ;COMPLETE LOSS, RETURN NOW
JRST RW5
OFFSTB: 260
60
240
40
220
20
;RH10 I/O ROUTINE PROPER
;FIRST STEP IS TO SET UP CHANNEL COMMAND LIST
RW2: MOVE TT,RHIOW ;SET UP ADDRESSES
MOVEM TT,RHTIOW
MOVE TT,RHPGA
MOVEM TT,RHTPGA
;RE-ENTER HERE AFTER ECC ERROR
RW2OVR: PUSH P,B
PUSH P,C
MOVE A,[-6,,SLVIOWD] ;POINTS TO WHERE CCWS WILL BE STORED
HLRO C,RHTIOW ;MINUS NUMBER OF WORDS TO TRANSFER
MOVNS C ;POSITIVE
HRRZ B,RHTIOW ;ADDRESS MINUS ONE
RW2CC1: MOVN TT,C ;WORDS TO TRANSFER IN THIS CCW
CAIL C,40000-200 ;WC IS ONLY A 14-BIT FIELD
MOVNI TT,40000-200
MOVEM B,(A) ;STORE CA
DPB TT,[$DFWC (A)] ;STORE WC
ADD C,TT ;LESS WORDS TO DO
SUB B,TT ;ADVANCE ADDRESS
AOBJP A,[JRST 4,.] ;ADVANCE CCW PTR, HALT IF TOO BIG!
JUMPG C,RW2CC1 ;NEED MORE WORDS
SETZM (A) ;END CCW LIST
HRRZI A,SLVIOWD ;POINT CHANNEL AT IT
MOVEM A,SLVICWA
SETZM SLVICWA+1 ;INIT FOR CONTROL WORD WRITING
POP P,C
POP P,B
MOVEI A,SLVICWA ;BUILD DATAO CMD
MOVE TT,RHCMD
DPB A,[$HCICWA TT]
TLO TT,%HRCTL ;FILL OUT COMMAND WORD
;NOW BEFORE GIVING COMMAND CHECK STATUS
CONSZ DSK,%HIBSY ;WAIT FOR DSK CONTROL
JRST .-1
CONO DSK,%HOCLR ;CLEAR ANY LEFT-OVER ERROR INDICATORS
RW2A: MOVSI A,%HRSTS ;CHECK DRIVE STATUS
PUSHJ P,RHGET
JRST RW3 ;DRIVE VANISHED??
TRNE A,%HSPIP ;WAIT FOR POSITIONING
JRST RW2A ;(MIGHT BE OFFSETTING HEADS?)
TRNE A,%HSERR ;ANY ERRORS IN DRIVE?
JRST RW6 ;YES, TRY TO RECOVER
TRC A,%HSVV+%HSMOL+%HSRDY ;CHECK FOR ALL READY BITS ON
TRCE A,%HSVV+%HSMOL+%HSRDY
JRST RW3 ;NOT READY??
HLRZ A,RHTPGA ;SET CYLINDER
TLO A,%HRCYL
PUSHJ P,RHSET
JRST RW3
HRRZ A,RHTPGA ;SET TRACK-SECTOR
TLO A,%HRADR
PUSHJ P,RHSET
JRST RW3
KL,[ MOVE A,RHTIOW ;SWEEP THE CACHE
AOS A ;RH ADDRESS OF BUFFER, LH - # WDS
LSH A,-9.
TRZ A,777000
TLO A,777000 ;A NOW HAS AOBJN PTR TO PAGES
RWSWP3: TRNE TT,10 ;SWEEP ONE PAGE
SWPIO (A) ;IF READING, INVALIDATE
TRNN TT,10
SWPUO (A) ;IF WRITING, UNLOAD
CONSZ APR,200000 ;WAIT UNTIL SWEEPER WAKES
JRST .-1
AOBJN A,RWSWP3
SWPUO 0 ;STORE CHANNEL PROGRAM IN CORE
CONSZ APR,200000
JRST .-1
];KL
;DROPS THROUGH
;DROPS IN
RWGO: MOVE A,TT ;ISSUE I/O COMMAND
PUSHJ P,RHSET
JRST RW3
CONSO DSK,%HIDONE ;WAIT FOR COMPLETION
JRST .-1
MOVSI A,%HRSTS ;CHECK DISK STATUS, ERRORS DON'T ALWAYS SHOW UP IN CONI
PUSHJ P,RHGET
JRST RW3
TRNN A,%HSERR
CONSZ DSK,%HIERR
CAIA
JRST POPJ1 ;NO ERROR, SKIP RETURN FROM RW2
;FOLLOWING TWO LINES CAUSE ECC NOT TO WORK
; CONSO DSK,%HIEXC
; POPJ P, ;NOT DRIVE EXCEPTION, PROBABLY CORRIGIBLE BY RETRY
TRNN A,%HSERR ;ANYTHING IN ERR REGS?
JRST RW3 ;FOO, WHAT IS GOING ON??
MOVSI A,%HRER2 ;MAKE SURE NO UNSAFES
PUSHJ P,RHGET
JRST RW3
JUMPN A,RW3
MOVSI A,%HRER3
PUSHJ P,RHGET
JRST RW3
JUMPN A,RW3
MOVSI A,%HRER1 ;GET ERROR1 REG
PUSHJ P,RHGET
JRST RW3
TRNE A,077067 ;GROSS ERROR?
JRST RW3 ;YES, ABORT
TRZE A,100000 ;SEE IF CORRECTABLE DATA ERROR
JUMPE A,RWECC ;YES, GO FIX IT
POPJ P, ;ERROR, BUT RETRY MAY WIN
RW6: MOVE A,[%HRDCL,,%HMCLR] ;ERROR IN DRIVE, TRY CLEARING
PUSHJ P,RHSET
JRST RW3
MOVSI A,%HRSTS
PUSHJ P,RHGET
JRST RW3
TRNN A,%HSERR
JRST RW2A ;WON
;LOST, FALL INTO RW3
RW3: POP P,(P) ;UNCORRECTABLE ERROR, RW FAILS
JRST RWL0
;ERROR CORRECTION CODE -- TAKEN FROM MAINDEC-10-DDRPF
; THAT CODE HAD NO HOPE WHATSOEVER OF WORKING. RETAKEN FROM ITS.
; THAT CODE DIDN'T WORK EITHER. TAKEN FROM NEWER ITS.
RWECC: TRNN TT,10 ;SKIP IF READ
POPJ P, ;RETRY IF WRITE
INSIRP PUSH P,[B W U J K H]
DW1==W ;FIRST WORD IN ERROR
DW2==U ;SECOND WORD IN ERROR
EP1==J ;FIRST WORD OF ERROR PATTERN
EP2==K ;SECOND WORD OF ERROR PATTERN
ADR==H ;ADDRESS OF LOSING WORDS
;B ;SO CAN DIVIDE A
SKIPN A,SLVICWA+1 ;GET ADDRESS OF LAST WORD TRANSFERRED
JRST 4,.-1 ;CHANNEL SHOULD HAVE STORED CONTROL WORD
SOS ADR,A ;LAST WORD TRANSFERRED (SUPPOSEDLY)
ANDI ADR,-200 ;IN ANY CASE, THIS MAKES ADR -> START OF SECTOR
HRRZ A,RHTIOW ;ADR-1 OF START OF TRANSFER
SUBM ADR,A
SOS B,A ;NUMBER OF WORDS SUCCESSFULLY TRANSFERRED
MOVEM B,RHSUCC ;SAVE
HLRO K,RHTIOW
MOVNS K
CAIL B,0 ;CHECK FOR CHANNEL LYING
CAILE B,-200(K)
JRST RWECC3 ;FRAUD, TRANSFERRED NEGATIVE OR TOO MANY WORDS
MOVSI A,%HRPOS ;GET ERROR POSITION
PUSHJ P,RHGET
JRST RWECC3
SOJL A,RWECC3 ;WHICH IS OFF BY 1. IF ZERO, LOSE.
IDIVI A,36. ;CONVERT TO WORD AND BIT
ADD ADR,A
MOVS DW1,(ADR) ;FETCH THE TWO LOSING WORDS
MOVS DW2,1(ADR)
MOVSI A,%HRPAT ;GET ERROR PATTERN
PUSHJ P,RHGET
JRST RWECC3
MOVE EP1,A
SETZ EP2,
ROTC EP1,(B) ;ALIGN IT
XOR DW1,EP1 ;FIX THE ERRONEOUS BITS
XOR DW2,EP2
RWECCB: ;SET BREAK HERE IF DON'T TRUST...
MOVSM DW1,(ADR) ;PUT CORRECTED DATA BACK
MOVSM DW2,1(ADR)
INSIRP POP P,[H K J U W]
AOS CERRS ;COUNT NUMBER OF TIMES ECC DONE
MOVEI A,%HMCLR ;CLEAR THE ECC-ERROR CONDITION
PUSHJ P,RHSET
JFCL
MOVEI A,200 ;ALLOW FOR THE SECTOR WE CORRECTED
ADDB A,RHSUCC ;GET BACK NUMBER OF WORDS TRANSFERRED
IDIVI A,200 ;NUMBER OF SECTORS TRANSFERRED INCLUDING CORRECTED ONE
LDB B,[$HASEC RHTPGA] ;UPDATE DISK ADDRESS
ADD A,B
IDIVI A,NSECS
DPB B,[$HASEC RHTPGA]
LDB B,[$HATRK RHTPGA]
ADD A,B
DPB A,[$HATRK RHTPGA] ;NO NEED TO IDIVI A,NHEDS SINCE ALL XFERS WITHIN CYLINDER
MOVE A,RHSUCC ;NOW ADVANCE CCW
HRL A,A
ADDB A,RHTIOW
POP P,B
TLNE A,-1
JRST RW2OVR ;NOT EXHAUSTED, CONTINUE DISK XFER
JRST POPJ1 ;ECC IN LAST SECTOR OF XFER, XFER COMPLETED SUCCESSFULLY
RWECC3: INSIRP POP P,[H K J U W B]
JRST RW3
;ROUTINES TO ACCESS RH10 CONTROLLER AND DRIVE REGISTERS
;CALL WITH
; I UNIT NUMBER
; A REGISTER NUMBER IN LH
; NON-SKIP RETURN IF RAE ERROR
; SKIP RETURN IF WIN
;CLOBBERS ONLY A
;SET REGISTER. TAKES DATA TO GO IN REGISTER IN RH OF A
;CLOBBERS A (PROBABLY)
RHSET: TLOA A,%HRLOD ;TELL HARDWARE IS SET INSTEAD OF GET
;AND FALL INTO RHGET
;GET REGISTER. RETURNS 16 BITS RIGHT-JUSTIFIED IN A
RHGET: TLZ A,%HRLOD
TLO A,(I) ;INSERT PHYS DRV NO
DATAO DSK,A ;TELL RH10 TO FETCH REGISTER
MOVEM A,RHLAST' ;SAVE FOR REBUGGING
MOVEI A,4 ;ENSURE 3 USEC DELAY BEFORE DATAI
SOJG A,. ;TO ALLOW MASSBUS TRANSACTION TO COMPLETE
DATAI DSK,A ;GET REG CONTENTS AND FLAGS
TLNE A,%HDERR ;ERROR?
JRST RHRAE ;YES, GO REPORT
ANDI A,177777 ;MASK TO 16 BITS
AOS (P) ;AND TAKE SUCCESS RETURN
POPJ P,
RHRAE: MOVSI A,%HRRAE+%HRLOD(I)
DATAO DSK,A ;CLEAR RAE REGISTER IN CONTROLLER
POPJ P, ;AND TAKE NON-SKIP RETURN
;DISK ROUTINE VARIABLES
RHCMD: 0 ;%HMRED OR %HMWRT
RHIOW: 0 ;IOWD -NWDS,,ADR-1 FOR TRANSFER
RHTIOW: 0 ;TEMPORARY IOWD FOR CONTINUING FROM ECC
RHPGA: 0 ;DISK ADDRESS CYL,,HED_8+SEC
RHTPGA: 0 ;TEMPORARY DISK ADDRESS FOR CONTINUING FROM ECC
RHSUCC: 0 ;NUMBER OF WORDS SUCCESSFULLY TRANSFERRED BEFORE ECC
];RH
IFN T300P,[ ;T-300 I/O - FALL IN FROM WRITE
;ENTER WITH: A ADDRESS, J BLOCK NUMBER, I VIRTUAL UNIT
; TT %HMWRT OR %HMRED
;ONLY T AND TT CLOBBERED
;ON RETURN T MINUS IF ERROR
T3IO: INSIRP PUSH P,[A B C D]
SETOM T3IOP'
CAIE TT,%HMRED ;GET READ OR WRITE COMMAND
SKIPA D,[%DMWRT]
MOVEI D,%DMRED
T3IO1: HRRZ A,J ;GUBBISH IN LH
IDIVI A,NBLKC1 ;A CYLINDER, B BLOCK WITHIN CYLINDER
MOVEM A,DSCCYL
IMULI B,SECBL1 ;B SECTOR WITHIN CYLINDER
IDIVI B,NSECS1 ;B HEAD, C SECTOR
MOVEM B,DSCHED
MOVEM C,DSCSEC
MOVE B,-3(P) ;ORIGINAL ADDRESS
HRLI B,730000 ;12-BIT BYTES, START WITH FIRST BYTE IN WORD
MOVE C,[-4,,DSCPNT] ;SET UP BYTE POINTERS
MOVEM B,(C)
ADDI B,400
AOBJN C,.-2
KL,[ SWPUA ;DUMP EVERYTHING OUT OF CACHE
CONSZ APR,200000
JRST .-1
];KL
PUSHJ P,T3CMD ;PERFORM THE OPERATION
JUMPE T,T3IO2 ;RETURN IF SUCCESS
MOVE A,T ;SEE IF ERROR MAY BE RECOVERABLE
TRZ A,%DSECH+%DSIDE+%DSHCE
JUMPN A,T3IO3 ;IF IRRECOVERABLE
TRNE D,%DMRED ;OR IF NOT A READ COMMAND
CAIN D,%DMRED+10 ;OR IF TRIED ALL RECOVERY FEATURES
T3IO3: TLOA T,(SETZ) ;ENSURE T NEGATIVE TO INDICATE ERROR
AOJA D,T3IO1 ;OTHERWISE RETRY USING NEXT ERROR RECOVERY FEATURE
T3IO2: INSIRP POP P,[D C B A]
POPJ P,
];T300P
SUBTTL MISCELLANEOUS VARIABLES
KL,SALVPF: JRST 4,. ;COME HERE IF PAGE FAIL IN SALVAGER
CONSTANTS
VARIABLES
POPTJ: POP P,T
CPOPJ: POPJ P,
THBLK: -LTHBLK,,0
THTPN: 0 ;TAPE #,,REEL # IN THIS DUMP
THDATE: 0 ;TAPE CREATION DATE
THTYPE: 0 ;0=>RANDOM >0 => FULL <0 => INCR
LTHBLK==.-THBLK
MHBLK: -LMHBLK,,0 ;FILE HEADER BLOCK
MHSNM: 0 ;SYS NAME
MHFN1: 0 ;FN1
MHFN2: 0 ;FN2
MHPKN: 0 ;PACK #
MHDATE: 0 ;CREATION DATE
0 ;IGNORE
0 ;IGNORE
LMHBLK==.-MHBLK
LNKFLG: 0 ;NONZERO => RELOADING LINK
LNKNM1: 0 ;LINK FN1
LNKNM2: 0 ;LINK FN2
LNKSNM: 0 ;LINK SNAME
MAGHD: 0
EOTFLG: 0
EOFCNT: 0
EOUF: 0
SHORTL: 0
MTRYS: 0
MAGBFP: 0
EOFLG: 0
FROM: 0
TOU: 0
SBTAB: -1 ;FOR PATCHING
-1
-1
-1
MFDBK: MFDBLK ;SPECIAL RESERVED BLKS
;TUT USED TO BE HERE, BUT NO LONGER
LSBTAB==.-SBTAB
;THIS IS AN ARRAY INDEXED BY UNIT GIVING THE NUMBER
;OF BLOCKS IN THE TUT ON THAT UNIT.
;THESE BLOCKS ARE ALWAYS RIGHT BEFORE THE MFD.
NTBL:
IFE T300P, REPEAT NUNITS, NTUTBL
IFN T300P,[
REPEAT T300P, NTUTBL
REPEAT NUNITS-T300P, NTUTB1
];T300P
RXWDS: BLOCK 4 ;THE EXTRA WORDS
0 ;FOR BLT
WXWDS: BLOCK 4
NOLPT: 0 ;-1 FOR NO LPT
LPBUST: -1 ;-1 LPT IS BUSTED DON'T KEEP ASKING
PUNCH: 0 ;SET TO -1 WITH DDT IF COPY TTY OUTPUT TO PUNCH
HCRASH: 0 ;SET TO -1 WITH DDT IF EMERGENCY DUP AFTER HEAD CRASH
;SACRAFICE EVERYTHING FOR SPEED SINCE PACK IS BEING SCRAPED BY HEADS
NUDS: NTS,[NUDSL]+0 ;NUMBER OF USER DIRECTORY BLOCKS
ADRSET: 0 ;ADDRESS SET
FMBLK: 0 ;FROM BLOCK
TOBLK: 0 ;TO BLOCK
LFRMSW: 0
SEEKC: 0
SHARED: 0 ;NUMBER OF SHARED BLOCKS
GOGOX: 0 ;-1 FOR AUTOMATIC MODE
NOQUES: 0 ;-1 TO ASK NO QUESTIONS (ONLY EFFECTIVE IN GOGOX MODE)
MDSK: 0 ;DISK TO GET MFD FROM
UDSK: 0 ;DSK TO GET UFD'S FROM
CKFLSW: 0 ;CHECK FILES FOR CLOBBERED BLOCKS
MFDWRT: 0 ;MFD CHANGED
TUTDFR: 0 ;FLAG TO SHOW TUT CHANGED
TTDFPS: 0 ;COUNT FROBS PER LINE WHEN PRINTING TUT
LFILES: 0 ;NUMBER OF FILES IN DIRECTORY
USRNAM: 0 ;M.F.D. USR NAME
UFDLOS: 0 ;SOME GARBAGE IN UFD
UFDSEE: 0 ; -1 IF A STRANGE UFD, PRINT WHOLE THING
FILEPK: 0 ; PACK FILE IS ON
LAST: 0 ; LAST FILE IN UFD
DBLK: 0 ;STORAGE FOR DIRECTORY NUMBER
FILEER: 0 ;ERROR IN FILE
BADFIL: 0 ; BLOCKS IN FILE WITH RETRIEVAL ERRORS
XWDSEE: 0 ; -1 IF HAVENT TYPED EXTRA WORDS YET
LASTQ: 0 ;STORAGE FOR Q
NOTUT: 0 ;TUT NOT ACTIVE FOR THIS FILE
LSTBLK: 0 ;LAST BLOCK STORAGE
BLK: 0 ; LAST BLOCK READ OR WRITTEN FROM
CKFIX: 0 ; -1 IF AUTO FIX RETRIEVAL POINTERS
UNIT: 0 ; UNIT "
FUNIT: 0 ; UNIT FILE IS ON, -1 IF PACK NOT MOUNTED
FERRS: 0 ;TRANSFER ERRORS
CERRS: 0 ;ERRORS CORRECTED BY ECC LOGIC
DUPRER: 0 ;DUP READ ERROR COUNT
DUPWER: 0 ;DUP WRITE ERROR COUNT
UFDTA: 0
GARBF: 0 ;GARBAGE IN FREE AREA
EXGARB: 0 ;EXTRA GARBAGE IN UFD
MARKF: 0 ;MARKING PACK
PDL: BLOCK 200
QBTBLI: 440600,,
QBTBL: 360600,,
300600,,
220600,,
140600,,
60600,,
600,,
QTRAN:
DC,[ 0 ;RH IS PHYSICAL DRIVE
1 ;4.9 BIT MEANS SECOND HALF
2 ;(NO LONGER DOES ANYTHING, NOW THAT MEMOWRECKS HAVE BEEN
3 ; FLUSHED, BUT KEEP AROUND IN CASE EVER NEEDED AGAIN.)
4
5
6
7
];DC
.ELSE REPEAT NDRIVE, .RPCNT ;OTHERWISE NOTHING SPECIAL
IFN .-QTRAN-NUNITS,.ERR BARF AT QTRAN!!
QTTBLI: REPEAT 36./TUTBYT+1, 440000+TUTBYT_6-TUTBYT_12.*.RPCNT,,
QTTBL=QTTBLI+1
TS, NQS: 0 ;SYSTEMS NUMBER OF DRIVES
TS, SQACT: 0 ;LOCATION OF QACT IN SYSTEM
TS, SALVRT: 0 ;DUMMY
NBLKS-1 ;SNBLKS-1
SNBLKS: NBLKS ;SYSTEM NBLKS (INIT'ED IN TS)
DRIVE: REPEAT NDRIVE,-1 ;-1 IF DRIVE ON LINE
QACT: REPEAT NUNITS,-1 ;-1 IF UNIT ACTIVE
QPKN: REPEAT NUNITS,-1 ;PACK NUMBER ACCORDING TO TUT
PKNUM: BLOCK NUNITS ;PACK NUMBER ACCORDING TO HARDWARE
RPKID: 0
IRP A,,[OTUT,NTUT]
Q!A!O: REPEAT NUNITS,CONC A,\.RPCNT,
TERMIN
PAT:
PATCH: BLOCK 100
LOC <.+1777>&776000
CYLBUF:
OUSRD: BLOCK 2000
NUSRD: BLOCK 2000
FDBUF: BLOCK 2000
MFD: BLOCK 2000
MAGBUF: BLOCK 2000
IRPS A,,OTUT NTUT
REPEAT NUNITS,CONC A,\.RPCNT,: BLOCK 2000*MXTUTB
TERMIN
D0==OTUT0
D1==OTUT1
TUT=NTUT0
RH, CYLSIZ==200*NHEDS*NSECS
RP, CYLSIZ==NBLKSC*2000
DC, CYLSIZ==NBLKSC*2004
NTS, IFL .-CYLBUF-CYLSIZ,LOC CYLBUF+CYLSIZ
THEEND:
CONSTANTS
VARIABLES
IFN .-THEEND, .ERR CRUFT AFTER THEEND
INFORM HIGHEST USED = ,\THEEND
IFG THEEND-400000, .ERR TOO MOBY (MUST FIT IN 128K TO AVOID HOLE IF SOME MEM DOWN)
;This error check doesn't really matter for MC much, since memory has
;to be switched out in 128K increments, which means that the system
;can't work with any holes in the low 256K.
IF2, NTS, KL, PAG=<BLKO PAG,>-<BLKO>
TS, END DDT ;ALWAYS STARTED BY <COMMAND>G
NTS,END <MEMSIZ-4000> ;DON'T CLOBBER I.T.S. START ADDR WHEN LOADED TOGETHER