From 15c279f935122e36790292bba186c1551970c7d6 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Thu, 4 Jul 2019 18:30:40 +0200 Subject: [PATCH] Initial changes to use SALV with RH20. --- src/system/salv.330 | 6790 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 6790 insertions(+) create mode 100644 src/system/salv.330 diff --git a/src/system/salv.330 b/src/system/salv.330 new file mode 100644 index 00000000..f4217cb5 --- /dev/null +++ b/src/system/salv.330 @@ -0,0 +1,6790 @@ +;;; -*- 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 RH20P 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 + IFCE MCHN,KL,[ + ;SA==105*2000 ; MC system is big, need to push SALV higher. + FIRSPK==0 + LASTPK==2 + NUDSL==500. + DC10P==0 + RP10P==0 + RH10P==0 + RH20P==1 + T300P==0 ;UNIT 3 IS FIRST T-300 UNIT + KL10P==1 + OLPTP==0 + NLPTP==0 + TTLPTP==0 ;NO LPT AT ALL + TCMXH==100. ;LA36 + LIGHTS==4 ;KL-UDGE + NDRIVE==3 ;8 DOESN'T FIT IN 128K + NUNITS==3 + ];M2 +TERMIN +IFNDEF FIRSPK, .FATAL UNKNOWN MACHINE "MCHN" +IFNDEF RH20P, RH20P==0 +];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+RH20P!TERMIN + +DEFINE RH10 +IFN RH10P!TERMIN + +DEFINE RH20 +IFN RH20P!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 +RH10 INFORM DEC RH10 disk control +RH20 INFORM DEC RH20 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 > +KA, $DFWC==222200,, +RH20, DSK==540 +] +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(-_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,[_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,*NBLKSC ;RP02 + TRNE B,2000 + MOVEI A,*NBLKSC ;RP03 +];RP +.ELSE MOVEI A,*NBLKSC +IFN T300P,[ + CAIL I,T300P + MOVEI A,*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,/NSECS-1 + MOVEM J,TRKN' + ;SO FAR +;WRITE IMAGE COMMAND - (START AT SECTOR PULSE) +;COPY ;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,, + 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 +KA, MOVE A,[-202*NSECS,,CYLBUF-1] ;SET UP IOWD +KL, MOVE A,[-202*NSECS_4,,CYLBUF-1] + 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+-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 +RH10, CONI DSK,TT +RH10, TLNN TT,(%HID22) +RH10, JRST [ TYPE DF10 IN KA MODE?? +RH10, 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 _-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_+1_+800BPI_+1_ + +;FUNCTIONS + NOOP1=0_+MAGCOM ;CLEAR INTERRUPT FLAGS + NOOP2=10_+MAGCOM ;INTERRUPT WHEN TRANSPORT IDLE + REWIND=1_+MAGCOM ;REWIND + REED=2_+MAGCOM ;READ + SPACR=7_+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: +RH10,[ + 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 +RH10, STS 100000,CHANNEL ERROR +RH20, STS 100000,LONG WORD ERROR +RH20, STS 040000,SHORT WORD ERROR +RH10, STS 020000,CHANNEL OVERRUN +RH20, STS 020000,CHANNEL ERROR + STS 010000,DRIVE RESPONSE ERR +RH10, STS 004000,CXR ILL CMD +RH20, STS 004000,EXT REG ERR +RH10, STS 002000,CXR POWER FAIL +RH20, STS 002000,READY +RH20, STS 001000,OVERRUN +RH20, STS 000400,ENABLE +RH10, STS 000200,CONTROL BUS OVERRUN +RH20, STS 000200,ATTN +RH10, STS 000100,RAE INTR +RH20, STS 000100,SCR FULL + 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 +RH10,[ REG 40,CONTROL + REG 44,INTR ADDR + REG 50,DATA BUFFER + REG 54,RAE STATUS + REG 74,CHANNEL BUFFER +] +RH20,[ REG 70,SBAR + REG 71,STCR + REG 72,PBAR + REG 73,PTCR + REG 74,IVIR + REG 75,RR + REG 76,WR + REG 77,DCR +] + REG 100,FOO +LOC RHRGTB+40 +EXPUNGE REG,REGH,XX,YY,ZZ + +; BITS IN DIB REGISTER + +DIBSTS: +RH10,[ 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 +] +RH20,[ + STS 000001,GO + STS 000100,INTERRUPT ENABLE + STS 000200,READY + STS 000400,A16 + STS 001000,A17 + STS 002000,PORT SELECT + STS 004000,DRIVE AVAILABLE + STS 020000,PARITY ERROR + STS 040000,TRANSFER ERROR + STS 100000,SPECIAL CONDITION +] + 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 +KA, MOVE A,[-2,,SLVIOWD-1] +KL, 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: +RH10,[ MOVSI A,%HRRAE+%HRLOD(I) + DATAO DSK,A ;CLEAR RAE REGISTER IN CONTROLLER +] +RH20,[ CONO DSK,4000 +] + 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 +IFNDEF OTUT1, OTUT1: BLOCK 2000*MXTUTB +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=- + +TS, END DDT ;ALWAYS STARTED BY G +NTS,END ;DON'T CLOBBER I.T.S. START ADDR WHEN LOADED TOGETHER