2 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
4 ;;; This program is free software; you can redistribute it and/or
5 ;;; modify it under the terms of the GNU General Public License as
6 ;;; published by the Free Software Foundation; either version 2 of the
7 ;;; License, or (at your option) any later version.
9 ;;; This program is distributed in the hope that it will be useful,
10 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 ;;; General Public License for more details.
14 ;;; You should have received a copy of the GNU General Public License
15 ;;; along with this program; if not, write to the Free Software
16 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 .SEE COPY ;COPY BLOCK TO BLOCK
19 .SEE DUP ;DUPLICATE ENTIRE DISC PACK
20 .SEE TRAN ;LOAD FROM MAG TAPE UNIT 5
21 .SEE UCOP ;COPY UDIRS FROM DRIVE TO DRIVE
22 .SEE ZAP ;ZERO DIR BLOCKS, WRITE OUT EMPTY TUT,MFD, WRITE READIN BLOCK
23 .SEE SPKID ;SET PACK ID IN TUT
24 .SEE DSKTST ;SIMPLE DISK TEST (WRITE THEN READ)
25 .SEE SEKTST ;DISK TEST WHICH SEEKS BACK AND FORTH (DOES NO WRITING)
26 .SEE MARK ;FORMAT PACK
27 .SEE MARK69 ;FINISH FORMATTING PACK
28 .SEE MFDR ;TRY TO RECONSTRUCT MFD FROM USER DIRS
30 .SEE GOGO ;SALVAGER - (AUTO FOR ALL DRIVES)
31 .SEE GETSTS ;GET CONTROLLER AND CURRENT DRIVE STATUS
32 .SEE RDHEAD ;READ HEADER FROM TRACK
33 .SEE LISTF ;PRINT USER DIRECTORY ON LPTR
34 .SEE UNLOCK ;TEST & UNLOCK A BLOCK
35 .SEE REMAP ;REMAP PACK #S AND FIX UFDS
37 .SEE PUNCH ;VARIABLE TO BE SET NON-ZERO IF COPYING OF TTY OUTPUT TO PAPER TAPE IS WANTED
38 .SEE HCRASH ;VARIABLE TO BE SET NON-ZERO IF DUP'ING A DISK AFTER HEAD CRASH
39 .SEE NOQUES ;IF NON-ZERO, NO QUESTIONS IN GOGOX MODE
40 .SEE FERRS ;COUNT OF CORRECTABLE ERRORS
41 .SEE CERRS ;COUNT OF ECC-CORRECTED ERRORS (RP04 ONLY)
42 .SEE DUPRER ;COUNT OF BLOCKS THAT COULDN'T BE READ IN `DUP'
43 .SEE DUPWER ;COUNT OF BLOCKS THAT COULDN'T BE WRITTEN IN `DUP'
46 IF2,[ PRINTX/SALVATION /
76 IFE SIXBIT/A/-SIXBIT/B/,TERMIN ;SUBSTITUTE FOR IFSE THAT IGNORES CASE
81 PRINTX /Run under time-sharing? /
83 IRPS Z,,[YES Y AYE DA JA]
86 IRPS ZZ,,[DC10P RP10P RH10P OLPTP NLPTP TTLPTP KL10P]
94 IFNDEF ITS,[ ;run stand alone
96 PRINTX /Which machine? /
99 FIRSPK==1 ;first pack that must be mounted in gogo mode
100 LASTPK==5 ;last pack that must be mounted in gogo mode
123 NLPTP==0 ;rest in pieces
144 SA==105*2000 ; MC system is big, need to push SALV higher.
151 T300P==3 ;UNIT 3 IS FIRST T-300 UNIT
155 TTLPTP==0 ;NO LPT AT ALL
158 NDRIVE==6 ;8 DOESN'T FIT IN 128K
162 IFNDEF FIRSPK, .FATAL UNKNOWN MACHINE "MCHN"
165 ;Formerly we knew number of units, now these are set to maximum and at run
166 ; time we find out which units are present and on-line with the right packs.
167 IFNDEF NDRIVE, NDRIVE==8 ;# physical units
168 IFNDEF NUNITS, NUNITS==8 ;# virtual units
170 IFE NUNITS-NDRIVE,[ ;Hack for virtual units in pre-Calcomp AI-KA system.
184 ;MACROS FOR CONDITIONALIZATION
213 DEFINE INFORM A,B,C,D,E,F,G
214 PRINTX \A!B!C!D!E!F!G
222 MOVE A,[440700,,[ASCIZ \C\]]
235 TS INFORM Runs under time-sharing on any machine
236 DC INFORM Systems Concepts disk control
237 RP INFORM DEC RP10 disk control
238 RH INFORM DEC RH10 disk control
239 INFORM Number of drives=,\ndrives
240 ; INFORM Number of virtual units=,\nunits
243 IFN OLPTP, INFORM Old LPT Interface
244 IFN NLPTP, INFORM New LPT Interface
245 IFN TTLPTP, INFORM LPT on MTY line number ,\TTLPTP&77
247 IFN T300P, INFORM Support for Trident T-300 via PDP-11
251 IFNDEF SA,SA==100*2000
253 NLPT=464 ;device code of ML lpt
254 MTY==400 ;device code of scanner
260 IFN T300P, DLB==60 ;DL-10
266 JRST GOGO ;make easy to start from ITS core load
267 SALVRT: 0 ;system may JSR here
271 ;DISK PHYSICAL PARAMETERS
282 TS, NTUTBL==4 ;MAXIMUM NUMBER OF BLOCKS PER TUT ON ANY ITS
284 ;FILE SYSTEM PARAMETERS
286 .INSRT SYSTEM;FSDEFS >
290 ;DL10 COMMUNICATIONS AREA IN NON-ENCACHED LOW CORE
291 DL10AR==500 ;ACTUAL STORAGE LAYOUT DEFINED IN ITS AND IN T300 DEFS
294 MXTUTB==NTUTB1 ;MAXIMUM OF NTUTBL AND NTUTB1
300 DCOPY A(-<B>_2&37774)!TERMIN
303 ;DEFINE CHANNEL PROGRAM AREA
311 JRST MEMSIZ-4000 ;FOR 'DDT' COMMAND IN KLDCP
335 TS,[ NBLKS==10000. ;FAKE
337 MFDBLK==-1 ;JUST TO AVOID UNDEF SYM ERROR, VALUE NEVER USED
342 SUBTTL COPY BLOCK TO BLOCK
348 UNTMES COPY BLOCK FROM UNIT #
383 COPYB: MOVEI A,TUT ;HANDY PLACE FOR A BREAKPOINT
388 DTYI: MOVEI B,0 ;DECIMAL TYPEIN
398 OTYI: MOVEI B,0 ;OCTAL TYPEIN
405 CPERR: TYPE READ ERROR
409 SUBTTL TEST AND UNLOCK SOME BLOCKS
413 UNTMES UNLOCK BLOCKS ON UNIT #
426 JRST UNLK1 ;USE ^Z TO GET OUT
428 ;UNLOCK A BLOCK, NUMBER IN A, UNIT IN FROM
430 UNLOCB: INSIRP PUSH P,[J K Q D B TT]
433 SETZM CYLBUF ;ZERO OUT IN CASE CAN'T READ
434 MOVE A,[CYLBUF,,CYLBUF+1]
446 UNLK2: MOVE A,[RXWDS,,WXWDS]
453 JUMPL T,[TYPE READ-BACK ERROR
458 UNLK3: MOVE TT,CYLBUF(T)
459 CAME TT,CYLBUF+2000(T)
460 JRST [ TYPE READ-BACK COMPARE ERROR
471 JUMPE J,[ TYPE CAN'T ACCESS TUT
474 MOVEI B,1 ;SAFEST ... NEXT SALVAGE WILL PUT CORRECT VALUE
479 AOS -6(P) ;WINNING, SKIP RETURN
480 UNLOCX: INSIRP POP P,[TT B D Q K J]
483 WRERR: TYPE WRITE ERROR
486 SUBTTL DUP - COPY ENTIRE PACK
489 DUP1: UNTMES FROM UNIT #
505 UNTMES COPY FROM UNIT #
528 DC, DPB A,[DUNFLD CYLRIR]
530 .ELSE [ MOVE A,PKNUM(I)
535 DC, DPB A,[DUNFLD CYLRIW]
536 MOVEI J,NCYLS+XCYLS-1 ;DETERMINE HOW MANY CYLINDERS THIS DRIVE
537 RP,[ MOVSI A,(DNOOPC)
538 DPB I,[DUNFLD A] ;SELECT DESTINATION DRIVE
542 DPB I,[DUNFLD A] ;SELECT SOURCE DRIVE
547 JRST [ TYPE CAN'T COPY RP02 TO RP03 OR VICE VERSA
550 MOVEI J,MCYLS+XCYLS-1 ;DRIVES ARE RP03S, MORE CYLINDERS TO COPY
554 JRST T3DUP ;HAVE TO DO IT THE SLOW WAY
557 JRST [ TYPE CAN ONLY GO T-300 TO T-300
563 JUMPL T,DLUP1 ;LOST, TRY BLOCK AT A TIME
568 DC, MOVEI T,CYLRIR ;COPY READ-IN BLOCK
573 TYPE ECC-CORRECTED ERRORS.
578 DUPLUZ: TYPE PACK # DFRS
585 JRST [ TYPE CAN ONLY GO T-300 TO T-300
587 TYPE THIS WILL TAKE A WHILE...
589 MOVEI J,NBLKS1+XBLKS1-1
590 T3DUP1: MOVEI A,CYLBUF
601 IFE RH10P,[ ;BLOCK AT A TIME
609 MOVE I,[RXWDS,,WXWDS]
610 DLUPEW: BLT I,WXWDS+4-1
619 RH,[ ;SECTOR AT A TIME ON RP04 SO GET EXTRA SECTORS
620 DLUP1: MOVEI T,NHEDS*NSECS
622 DLUP3: SOS W,DLUPT ;NEXT SECTOR (GOING BACKWARDS THROUGH CYLINDER)
623 IDIVI W,NSECS ;TRACK IN W, SECTOR IN U
626 HRL W,J ;NOW W HAS DISK ADDRESS
628 MOVE U,[-200,,CYLBUF-1]
649 JRST DLUPE4 ;SPEED IS OF THE ESSENCE, DON'T TYPE ANYTHING
650 TYPE Read error on block #
652 DLUPE4: SETZM CYLBUF ;COULDN'T READ THE BLOCK, SUBSTITUTE ALL ZEROS
653 MOVE A,[CYLBUF,,CYLBUF+1]
655 MOVE I,[DLUPE5,,WXWDS] ;WITH SPECIAL EXTRA WORDS
656 JRST DLUPEW ;RESUME DLUP AT WRITE
664 HLRZ A,RHPGA ;CYLINDER
666 LDB W,[101000,,RHPGA] ;HEAD
668 LDB U,[001000,,RHPGA] ;SECTOR
671 ADD A,W ;INACCURATE IF UNUSED SECTOR AT END OF CYLINDER
675 JRST GSTS ;HARDWARE STATUS
679 JRST DLUPEX ;SPEED IS OF THE ESSENCE, DON'T TYPE ANYTHING
680 TYPE Write error on block #
684 ;SUITABLE EXTRA WORDS FOR BLOCKS THAT COULDN'T BE READ
686 DLUPE5: 0 ;WORD COUNT=2000, LAST BLOCK=0
687 SIXBIT /??????/ ;DUMMY DIRECTORY
691 DC,[ SUBTTL CYLINDER I/O, DC10
692 READCY: SKIPA T,[DREADC+DUNENB] ;READ CONTINUOUS
693 WRITCY: MOVSI T,(DWRITC+DUNENB) ;WRITE CONTINUOUS
701 CYL1: SKIPLE TT,PKNUM(I)
711 DPB TT,[DPKID CYLCM3]
717 JRST RW1 ;TRY TRANSFER UNTIL SUCCEEDS
720 DALU+DLDBWC+DLLB -2004*NBLKSC(3) ;LOAD WORD COUNT WITH -2004*NO. OF BLOCKS/CYL
722 CYLCM3: DRCC ;READ COMPARE CONTINUOUS
723 DALU+DLDBWC+DLLB -2004*NBLKSC(3)
728 DCOPY CYLBUF(-LRIBLK_2&37774)
729 CYLRIW: DWRITE+DUNENB
730 DCOPY CYLBUF(-LRIBLK_2&37774)
734 RP,[ SUBTTL CYLINDER I/O, RP10 & RH10 CONTROLS
736 ;RP10 CYLINDER I/O ALWAYS SUCCEEDS. IF PROBLEMS OCCUR, GOES SECTOR
737 ;AT A TIME, TYPING OUT WHAT IS GOING ON, ZEROING SECTORS THAT CAN'T BE READ,
738 ;THEN RETURNS CLAIMING TO HAVE WON.
750 IFN 0,[ ;I DON'T THINK THIS CODE WORKS
755 JRST [ TYPE WRITE ERROR ON BLOCK
757 TYPE READ ERROR ON BLOCK
774 PUSHJ P,GSTS ;EXPLAIN WHAT HAPPENED TO THIS SECTOR
775 MOVE T,RPIOOP ;IF READ, ZERO THE BUFFER
776 HRLZ TT,RPAOBJ ;IF WAS REALLY IN SECTOR AT A TIME MODE
785 RPCY1: AOS T,RPIOSC ;ADVANCE TO NEXT SECTOR
791 POPJ P, ;MUST BE DONE
792 RPCY2: MOVE T,[200,,200]
794 JUMPL T,RPCY0 ;GO DO THE REST OF THE CYLINDER
796 POPJ P, ;HMM, MUST BE DONE
799 RH,[ ;CYLINDER I/O, RH10 CONTROL
801 READCY: SKIPA TT,[%HMRED]
802 WRITCY: MOVEI TT,%HMWRT
805 JRST 4,. ;NOT CODED YET
809 HRLZM J,RHPGA ;SET ADDRESS TO START OF CYLINDER
810 MOVEI T,-1(A) ;SET UP IOWD TO TRANSFER WHOLE CYLINDER
811 HRLI T,-200*NHEDS*NSECS ;- NUMBER OF WORDS TO TRANSFER
816 SUBTTL TRAN - LOAD FROM MAG TAPE
846 JUMPE B,POPJ1 ;NOT A LINK
848 MOVE A,[-3,,LNKNM1] ;READ LINK INFO
852 MBADHD: LPR BAD HEADER
857 MBDTHD: TYPE BAD TAPE HEADER
864 TRAN2: SKIPGE QACT(I)
868 MOVEI A,5 ;READS FROM TAPE UNIT 5
880 MOVE A,MHFN1 ;DON'T RELOAD DIRECTORIES!
882 CAMN A,[SIXBIT/.FILE./]
883 CAME B,[SIXBIT/(DIR)/]
886 CAMN A,[SIXBIT/M.F.D./]
887 CAME B,[SIXBIT/(FILE)/]
904 SKIPN C,MFD+MNUNAM(A)
914 TOLDU: HRREI J,-2000(A) ;CONVERT MFD INDEX TO BLOCK NO
924 TNEWU: MOVE A,[NUSRD,,NUSRD+1]
934 MOVEM B,MFD+MNUNAM(A)
935 HRREI J,-2000(A) ;CONVERT MFD INDEX TO BLOCK NO
947 TDNE T,NUSRD+UNRNDM(A)
949 SKIPN T,NUSRD+UNFN1(A)
953 CAMN C,NUSRD+UNFN2(A)
958 TULKZ: SKIPN NUSRD+UNFN2(A)
967 IGFIL: MOVE A,[-2000,,FDBUF]
978 TNEWCR: MOVE T,NUSRD+UDESCP
982 MOVEM B,NUSRD+UNFN1(A)
983 MOVEM C,NUSRD+UNFN2(A)
984 DC, MOVEM B,WXWDS+XWFN1
985 DC, MOVEM C,WXWDS+XWFN2
987 DC, MOVEM B,WXWDS+XWSYSN
988 DC, SETZM WXWDS+XWBWC
990 DPB B,[UNDSCP NUSRD+UNRNDM(A)]
992 MOVEM B,NUSRD+UNDATE(A)
995 DPB B,[UNPKN NUSRD+UNRNDM(A)]
996 MOVEI A,NUSRD+UNRNDM(A)
998 MOVEM A,TRNDEP' ;DPB WC OF LAST BLOCK LATER
1004 JRST TRNLNK ;JUMP IF APPENDING LINK
1006 TBLKL1: MOVE A,[-2000,,FDBUF]
1009 DC, DPB T,[XWAWC WXWDS+XWBWC]
1010 DPB T,TRNDEP ;STORE WORD COUNT IN DIRECTORY
1012 DC, DPB T,[XWBLK WXWDS+XWBWC]
1020 TNEWCK: SKIPN NUSRD+UNFN1(A)
1021 SKIPE NUSRD+UNFN2(A)
1033 TRNLNK: MOVE A,LNKSNM
1060 READFN: SKIPA I,FROM
1063 READC: JUMPL T,[JRST 4,.]
1066 WRBLK: MOVE J,TUT+QTUTP
1097 WRLUZ: SETCMB J,TUTLUZ'
1105 WRLUZ1: TYPE DISK FULL
1110 WRBS: ADDI J,UDTKMX-1
1111 BYDEP: MOVE T,NUSRD+UDESCP
1134 TMDON: MOVE J,[WXWDS,,WXWDS+1]
1145 TMDON2: SKIPL QACT(I)
1153 TMDON1: CAIGE I,NUNITS-1
1160 SUBTTL UCOP - COPY DIRECTORIES FROM DRIVE TO DRIVE
1170 UCOPL: SUBI Q,LMNBLK
1175 HRREI J,-2000(Q) ;CONVERT MFD INDEX TO BLOCK NO
1186 SUBTTL SPKID - SET PACK ID IN TUT
1191 UNTMES SET PACK ID ON UNIT #
1205 TYPE , CHANGE ID FROM
1217 \fSUBTTL REMAP - REASSIGN PACK#S AND FIX UFDS
1219 REMAPP: REPEAT 40, -1 ;INDEX BY PACK #. LH=NEW PACK #, RH=DISK ADDR OFFSET
1222 UNTMES REMAP THE COPY OF THE UFDS ON UNIT #
1229 MOVEI A,MFD ;GET MFD
1234 REMAP1: CAIL Q,2000 ;NEXT UFD
1236 SKIPN B,MFD+MNUNAM(Q)
1242 ADD J,NUDS ;UFD BLOCK NUMBER
1249 REMAP2: CAIL K,2000 ;NEXT FILE
1252 TDNE C,UNRNDM+OUSRD(K)
1253 JRST REMAP5 ;DON'T MANGLE LINKS
1254 LDB C,[UNDSCP UNRNDM+OUSRD(K)]
1257 ADDI C,UDDESC+OUSRD ;C HAS DESC POINTER
1258 LDB D,[UNPKN UNRNDM+OUSRD(K)] ;D HAS PK #
1259 SKIPGE A,REMAPP(D) ;GET MAPPING
1260 JRST 4,. ;LOSER FORGOT TO PATCH IT IN
1261 HLRZ D,A ;GET NEW PACK #
1262 DPB D,[UNPKN UNRNDM+OUSRD(K)] ;CHANGE IT
1263 HRRE D,A ;D HAS BLOCK # OFFSET
1268 JRST REMAP3 ;DOESN'T DEPEND ON ABS DISK ADDRESSES
1269 ANDI A,37 ;MASK OUT LOAD-ADDR-BIT
1275 ADD A,D ;RELOCATE THE ADDRESS
1276 REPEAT 6,JFCL ;PATCH AREA
1277 MOVE C,H ;GET BACK B.P. TO START OF LOAD-ADDR DESCRIPTOR
1278 MOVE H,[<UFDBYT*NXLBYT+UFDBYT>_36+UFDBYT_30+A]
1281 IFE .RPCNT, ADDI B,40
1286 REMAP5: ADDI K,LUNBLK
1289 REMAP6: MOVEI A,OUSRD
1292 REMAP9: ADDI Q,LMNBLK
1295 SUBTTL ZAP - ZERO DIR BLOCKS, WRITE EMPTY TUT & MFD
1299 UNTMES INIT DIRS ON UNIT #
1308 X DTYI ;IF RP, NO PK # IN HARDWARE, GET IT FROM HUMAN
1311 ] PUSHJ P,RESET ;IF DC OR RH, WILL USE PACK # FROM HARDWARE
1312 MOVE A,[WXWDS-1,,WXWDS]
1314 SETZM MFD ;INIT ALL BLOCKS TO ZERO
1317 MOVN J,NUDS ;GET AOBJN PTR TO UFD BLOCKS
1319 KL, ADD J,[2,,2] ;PROTECT KLDCP?
1325 DC,[ CONO DC0,DCCSET+DCDENB
1326 DATAO DC0,[DJMP DZAP]
1337 DZAP: DWRITE ;ZERO READ-IN BLOCK
1338 DCSKIP (-LRIBLK_2&37774)
1342 SUBTTL SIMPLE DISK TESTS
1344 ;THIS ONE JUST WRITES A SINGLE BLOCK, READS IT BACK, AND CHECKS THAT IT'S THE SAME.
1346 SETOM HCRASH ;DON'T DO ERROR RETRY
1354 TYPE GOT A SCRATCH PACK ON UNIT #
1360 MOVEI J,NBLKSC*15. ;RANDOMLY USE CYLINDER 15.
1362 MOVEI B,1 ;FIRST PART OF PATTERN IS FLOATING 1S
1363 DSKT0A: MOVEM B,D0(A)
1367 HRROI B,-2 ;NEXT IS FLOATING 0S
1368 DSKT0B: MOVEM B,D0(A)
1373 DSKT0C: MOVEM A,D0(A) ;REST IS AN ADDRESS PATTERN
1382 DSKT1A: MOVE A,D1(B)
1384 DSKTS2: AOBJN B,DSKT1A
1385 JUMP DSKTS4 ;CHANGE TO JUMPA FOR NO TYPEOUT
1386 JUMPGE B,DSKTS3 ;JUMP IF COMPARED ALL
1402 DSKTS3: JUMPGE T,DSKTS1 ;AFTER PRINTING COMPARISON, IF DISK NOTICED ERROR
1403 X GSTS ; ALSO PRINT THAT
1406 DSKTS4: DATAO LIGHTS,[0]
1413 ;SEEK TEST. THIS LOOPS OVER ALL HEADS, AND OPTIONALLY LOOPS OVER DIFFERENT
1414 ; LENGTH SEEKS. IT DOESN'T WRITE, BUT IS A TEST OF SEEKING AND SEARCHING.
1415 ;SETOM HCRASH IF YOU WANT TO DO NO ERROR RETRIES ON READ/SEARCH ERRORS
1416 ;(SEEK INCOMPLETES WILL ALWAYS BE RETRIED.)
1419 TYPE SEEK TEST UNIT #
1427 TYPE ALWAYS DO FULL LENGTH SEEKS?
1431 MOVEM A,SEKINC' ;IF NO, DO DECREASING LENGTH SEEKS
1434 MOVSI A,(DNOOPC) ;DETERMINE HOW MANY CYLINDERS THIS DRIVE
1438 MOVEI A,<NCYLS-1>*NBLKSC ;RP02
1440 MOVEI A,<MCYLS-1>*NBLKSC ;RP03
1442 .ELSE MOVEI A,<NCYLS-1>*NBLKSC
1445 MOVEI A,<NCYLS1-1>*NBLKC1 ;T-300
1449 SEKTS1: SETZM SEKHDN' ;RESET HEAD
1450 SEKTS2: MOVE J,SEKCY1 ;BLOCK ADDRESS OF OUTER CYLINDER
1451 ADD J,SEKHDN ;SELECT A BLOCK ON THE DESIRED HEAD
1455 SEKTS3: X GSTS ;JFCL THIS IF YOU DON'T WANT ERROR MESSAGES
1456 MOVE J,SEKCY2 ;BLOCK ADDRESS OF INNER CYLINDER
1457 ADD J,SEKHDN ;SELECT SAME HEAD
1463 MOVEI J,NSECS/SECBLK ;ADVANCE TO NEXT HEAD
1465 CAIGE J,NBLKSC ;SKIP IF TOUCHED ALL HEADS
1467 MOVN B,SEKINC ;YES, CHANGE CYLINDERS
1473 JRST SEKTS0 ;RECYCLE
1488 SUBTTL DC-10 PACK FORMATTING
1491 UNTMES FORMAT PACK ON UNIT #
1498 CONO DC1,(TT) ;SETUP DRIVE # FOR LATENCY TIMER
1502 CONSO DC1,DFUNSF\DOFFL
1507 MARK1: MOVE A,[DSPC+DSCWIM+DSWIDX+DSWNUL]
1510 PUSHJ P,RDLAT ;READ LATENCY TIMER
1520 IFN 0,[ ;THIS HARDWARE HAS BEEN BROKEN FOR YEARS
1523 IDIVI A,10. ;NO. OF MILLISECONDS
1531 TYPE MILLISECONDS ROTATION TIME
1534 CAIGE B,254. ;LIKELY JUST NO INDEX ON THIS PACK
1536 TYPE TOO DAMN LONG TO BE CREDIBLE, USING 24.5 MS.
1540 MARK1B: IMULI B,1000 ;CONVERT TO NUMBER OF BITS/TRACK
1541 IDIVI B,36. ;NO. OF WORDS PER SECTOR
1545 PUSHJ P,STOBLK ;ENOUGH ONES TO WIPE OUT THIS TRACK
1549 AOJ J, ;INTER-SECTOR GAP LENGTH
1550 SUBI J,3+3+7+3011 ;HEADER CODE+HEADER DATA+"ONES"+BLOCK+CHECKSUM
1553 HRLI B,HBLK ;SETUP COPYS FOR HEADER PREAMBLE,DATA,POSTAMBLE
1559 HRRM B,-2(D) ;POINT COPY TO THIS SECTORS ENCODED DATA
1560 MOVEI B,103. ;103 BLOCKS OF 10 ZEROS (ENCODED)
1561 MOVE A,[QCOPY EZERS,15.,]
1564 MOVE B,J ;ENOUGH ONES TO FILL OUT REMAINING PART OF SECTOR
1568 ;SETUP STUFF FOR POSSIBLY WRITING READIN BLOCK
1569 MARK1D: MOVE A,[QCOPY EONES,3,]
1572 MOVSI A,(DOPR+DOHXFR)
1577 SUBI B,3+3+7+LRIBLK*3/2+3 ;HEADER+LRIBLK+CHECKSUM
1585 MOVSI A,(DJMP) ;PATCH JUMP AROUND RIBLK CODE, WILL BE CLOBBERED FOR BLOCK 0 ONLY
1595 MOVEI B,-3(D) ;PATCH AOJN .-1 ADDRESS
1602 MOVE I,[440300,,RIHEDR] ;ENCODE READIN HEADER
1606 MOVEI J,<NBLKS+XBLKS>/NSECS-1
1609 ;WRITE IMAGE COMMAND - (START AT SECTOR PULSE)
1610 ;COPY <ENCODED ONES> ;ENOUGH TO WIPE OUT FULL TRACK
1611 ;(THEN FOR EACH SECTOR):
1614 ; ONES FOLLWED BY SINGLE ZERO
1616 ; TWO 28 BIT HEADER WORDS
1617 ; A SERIES OF ONES FOLLWED BY 01
1618 ;ENCODED ZEROS FOR DATA BLOCK (2004) WORDS + 2 WORDS CHECKSUM
1619 ;ENOUGH ENCODED ONES TO FILL OUT REST OF SECTOR (EXCEPT ON LAST SECTOR)
1623 ; NORMALLY: FOR BLOCK 0:
1624 ;RIWP: HANG FOR END OF TRANSFER WRITE ONES
1625 ; JUMP AROUND WRITE READIN WRITE ONES
1626 ; READIN HEADER PREAMBLE
1628 ; READIN HEADER POSTAMBLE
1630 ; ONES TO PAD OUT REST OF TRACK
1631 ; DALU SETUP CONTROL COUNTER
1632 ;ENDP: READ COMPARE COMMAND
1633 ; COPY 4 WORDS ZEROS
1644 DPB A,[DPKID DHED0] ;PACK ID FOR HEADER
1645 DPB A,[DPKID @ENDP] ;PACK ID FOR READ-COMPARE COMMAND
1648 MOVE A,[QCOPY EONES,3,]
1651 MARK2C: IDIVI J,NHEDS
1655 ADDI J,NCYLS+XCYLS ;OFFSET IF DOUBLE SIZE PHYSICAL PACK
1656 IRP A,,[CYLBUF,@ENDP,DHED0] ;SETUP INITIAL WRITE-IMAGE COMMAND
1657 DPB J,[DCYL A] ; " READ-COMPARE COMMAND
1658 DPB K,[DSURF A] ; " HEADER WORD
1660 POP P,J ;VIRTUAL CYLINDER #
1662 DPB W,[DHNXAD DHED1]
1663 MOVEI W,1 ;END OF TRACK
1665 MOVEI W,2 ;END OF CYLINDER
1667 CAIN J,NCYLS+XCYLS-1
1668 TRO W,1 ;END OF DISK
1669 MOVE I,[440300,,DHEDR]
1673 MARK2B: CAIN Q,1 ;PUT IN INCREMENT CODE
1674 DPB W,[DHNXAD DHED1]
1675 PUSHJ P,HCOMP ;ENCODE HEADERS
1678 MARK2A: CONO DC0,DCCSET\DCDENB
1679 DATAO DC0,[DJMP CYLBUF]
1682 JRST 14 ;WAIT IN AC'S FOR DISC, THEN FALL THRU
1683 MARK2D: CONSO DC0,DSSERR
1685 CONSZ DC1,DCPERR\DNXM\DDOBSY
1689 CONSZ DC1,DOFFL\DFUNSF
1691 CONSO DC1,DWTHER\DCKSER\DOVRRN\DRCER\DRLNER
1700 DWLUP: CONSZ DC0,DSSACT
1704 MARK3A: TYPE MACHINE LOSSAGE
1707 MARK3B: TYPE NOT WRT ENABLED
1710 MARK3C: TYPE DRIVE LOSSAGE
1713 MARK3D: TYPE CONTROLLER LOSSAGE
1720 ;INITIALIZE MFD AND TUT
1721 ; TOU AND PKNUM+n MUST BE ALREADY SET UP
1725 TYPE SWAPPING ALLOC =
1742 MOVE A,TUT+QSWAPA ;SET UP FREE SPACE POINTER
1745 ADDI A,NBLKSC-1 ;JUST IN CASE QSWAPA NOT ON CYLINDER BOUNDARY
1754 6TYI: MOVE C,[440600,,B]
1781 HCOMP2: TDNN B,DSKBP
1818 ENC2B: JUMPE A,ENC1A
1848 RDLAT: CONI DC1,A ;READ LATENCY TIMER INTO A
1857 STBLK: MOVEM A,(D) ;STORE C(A) IN B WORDS AT D
1858 SOJLE B,[AOJA D,CPOPJ]
1866 STOBLK: MOVE A,[QCOPY EONES,LOBLK,]
1868 JUMPE B,STOBL3 ;LESS THAN ONE BLOCK NEEDED??
1874 STOBL2: PUSHJ P,STBLK
1882 HBLK: QCOPY PREAMB,3, ;NORMAL HEADER
1886 WRTRI: QCOPY PREAMB,3, ;READIN HEADER, DATA BLOCK
1889 QCOPY EZERS,<LRIBLK*3/2+3>,
1892 RCBLK: DALU+DLCC+DLLB -401*NSECS(3) ;READ COMPARE "LOOP" FOR DATA WORDS
1902 DHEDR: BLOCK 3*NSECS
1906 RIHED1: -LRIBLK&37777
1909 EZERS: REPEAT LRIBLK*3/2+3,252525252525
1911 EONES: REPEAT LOBLK+3,-1
1915 655326553265 ;1.10101.10101.10101.10101.10101.10101.10101
1917 POSTMB: REPEAT 6,-1 ;ONES...01
1924 SUBTTL RH-10 PACK FORMATTING
1928 KL,[ SWPUA ;TURN THE CACHE OFF
1936 UNTMES FORMAT PACK ON UNIT #
1947 TYPE ARE YOU SURE YOU WANT TO FORMAT PACK ON DRIVE #
1958 MOVSI A,%HRSER ;GET DRIVE SERIAL NUMBER
1962 TLZ D,600000 ;FIRST "KEY" WORD IS SERIAL NO OF DRIVE FORMATTED ON
1963 HRR D,PKNUM(I) ;SECOND "KEY" WORD IS I.T.S. PACK NUMBER
1964 SETZB A,B ;GENERATE PATTERN FOR SURFACE
1965 RHFMP1: MOVEM B,CYLBUF(A) ;CYL 0 TRACK 0 SECTOR (B) IS FIRST HEADER WORD
1966 MOVEM D,CYLBUF+1(A) ;PUT DRIVE SERIAL NUMBER IN 3.1-4.7 OF HDR WD 2
1968 SETZB C,H ;FILL SECTOR WITH WORST CASE PATTERN
1969 RHFMP2: MOVE T,RHWC(H)
1977 CAIGE B,NSECS-1 ;DO NEXT SECTOR
1980 JRST 4,. ;WRONG AMOUNT OF CRUFT GENERATED
1981 MOVE A,[-202*NSECS_4,,CYLBUF-1] ;SET UP IOWD
1986 JRST RHFMT0 ;GO FORMAT
1988 RHWC: 726666666676 ;RP04 10-MODE WORST CASE PATTERN
1998 RHMKER: TYPE DISK ERROR
2003 RHFMT0: MOVEI J,NCYLS+XCYLS
2004 RHFMT1: SOJL J,RHFMT4 ;LOOP ON CYLINDERS
2006 RHFMT2: SOJL K,RHFMT1 ;LOOP ON SURFACES
2007 MOVEI B,NSECS ;ADJUST THE HEADER WORDS
2009 RHFMT3: DPB J,[221100,,CYLBUF(C)]
2010 DPB K,[100500,,CYLBUF(C)]
2013 MOVSI A,%HRADR ;SET UP ADDRESS IN DRIVE
2017 MOVSI A,%HRCYL ;LEAVE CYLINDER NUMBER IN RH10 "DIB" LIGHTS
2022 MOVSI A,%HRCTL ;SET UP WRITE HEADERS AND DATA COMMAND
2034 RHFMT4: TYPE FORMATTING COMPLETE, VERIFICATION BEGINS
2036 MOVEI J,NCYLS+XCYLS-1
2037 RHFMT5: MOVEI A,CYLBUF
2049 RHFMT6: SETZB A,H ;VERIFY DATA. RELIES ON SECTOR SIZE BEING
2050 RHFMT7: MOVE B,CYLBUF(A) ; A MULTIPLE OF RHWCL
2058 RHFMT9: SOJGE J,RHFMT5
2062 TYPE ECC-CORRECTED ERRORS DURING VERIFICATION.
2064 JRST MARK69 ;HARDWARE FORMATTED, DO SOFTWARE
2083 SUBTTL RP-10 PACK FORMATTING
2086 KL,[ SWPUA ;TURN THE CACHE OFF
2094 UNTMES FORMAT PACK ON UNIT #
2105 MOVSI A,(DNOOPC) ;DETERMINE TYPE OF DRIVE
2117 JRST [ TYPE WRITE HEADER LOCKOUT SWITCH IS ON
2119 TYPE ARE YOU SURE YOU WANT TO FORMAT PACK ON RP0
2134 SETZB A,B ;GENERATE TEMPLATE TRACK
2135 RPFMP1: MOVEI T,31. ;SYNC ZONE OF 30 ZERO WORDS
2139 AOS CYLBUF-1(A) ;AND ONE WORD CONTAINING 1 IN BIT 35
2140 MOVEM B,CYLBUF(A) ;THEN ADDRESS WORD
2141 REPEAT 4,SETZM CYLBUF+1+.RPCNT(A) ;THEN ADDR PARITY WORD AND 3 ZERO WORDS SYNC
2143 MOVE T,RPWC ;THEN 128 DATA WORDS OF WORST CASE PATTERN
2149 CAIGE B,NSECS-1 ;DO NEXT SECTOR
2152 JRST 4,. ;WRONG AMOUNT OF CRUFT GENERATED
2153 MOVE A,[-244*NSECS,,CYLBUF-1] ;SET UP IOWD
2158 JRST RPFMT0 ;GO FORMAT
2160 RPMKER: TYPE DISK ERROR
2165 RPFMT0: MOVE J,LAST ;HIGHEST CYLINDER # + 1
2166 RPFMT1: SOJL J,RPFMT4 ;LOOP ON CYLINDERS
2168 RPFMT2: SOJL K,RPFMT1 ;LOOP ON SURFACES
2169 MOVEI B,NSECS ;ADJUST THE HEADER WORDS
2171 RPFMT3: DPB J,[121100,,CYLBUF+37(C)]
2172 DPB K,[050500,,CYLBUF+37(C)]
2173 MOVE D,CYLBUF+37(C) ;COMPUTE HEADER PARITY WORD
2175 MOVSI TT,(SETZ) ;ODD PARITY
2180 MOVEM TT,CYLBUF+40(C)
2183 MOVSI A,300000 ;WRITE FORMAT
2186 ROT J,-8 ;EXTRA BIT FOR RP03
2201 RPFMT4: TYPE FORMATTING COMPLETE, VERIFICATION BEGINS
2204 RPFMT5: MOVEI A,CYLBUF
2210 TYPE DOESN'T READ -- GIVING UP ON IT.
2216 RPFMT6: SETZB A,H ;VERIFY DATA.
2218 LSH D,1 ;CONTROL DROPS ONE BIT DURING WRITE FORMAT
2219 RPFMT7: MOVE B,CYLBUF(A)
2224 RPFMT9: SOJGE J,RPFMT5
2226 JRST MARK69 ;HARDWARE FORMATTED, DO SOFTWARE
2243 RPWC: 714533,,462556 ;WORST CASE PATTERN
2248 SUBTTL MFDR - RECONSTRUCT MFD FROM UFDS
2251 PUSHJ P,CRR ;RECONSTRUCT MFD BY GETTING NAMES FROM UFD'S
2252 UNTMES RECONSTRUCT MFD FROM UNIT #
2262 MOVE B,TUT+UDESCP ;LOOK LIKE LEGIT UFD?
2264 JRST MRUFDL ;SHOULD BE F.S. PNTR
2265 CAIL B,<2000.-11.>*6
2268 SKIPE TUT+UDNAME ;USER NAME
2270 JRST MRUFDL ;PNTR TO BEG OF NAME AREA
2271 MOVEI B,(J) ;CONVERT BLOCK NO TO MFD INDEX
2275 MOVE C,TUT+UDNAME ;USER NAME
2300 SUBTTL INITIALIZE MFD
2305 MOVE A,[SIXBIT /M.F.D./]
2313 SUBTTL INITIALIZE TUT
2315 ;DRIVE NUMBER IN I, SWAPPING ALLOC IN A
2319 BLT B,TUT+<2000*MXTUTB>-1
2323 MOVE K,NUDS ;K HAS BASE OF FILE AREA
2324 MOVEI J,NBLKS ;DETERMINE HOW MANY BLOCKS THIS DRIVE
2325 RP,[ MOVSI A,(DNOOPC)
2326 DPB I,[DUNFLD A] ;SELECT DRIVE
2330 MOVEI J,MBLKS ;RP03 HAS MORE BLOCKS
2336 MOVEM J,TUT+QLASTB ;LAST REGULAR BLOCK IS LAST TUT'ED
2338 MOVEI A,<2000*NTUTBL-LTIBLK>*TUTEPW
2340 MOVEI A,<2000*NTUTB1-LTIBLK>*TUTEPW
2343 .ELSE SUBI J,<2000*NTUTBL-LTIBLK>*TUTEPW ;SUBTRACT MAX NUMBER OF TUTABLE BLOCKS
2344 CAMLE J,K ;IS THERE ROOM FOR ALL OF FILE AREA?
2350 TUTFIL: MOVEI K,TUTLK ;ENTER HERE FROM SALV1, A -> TUT
2351 MOVSI D,440000+TUTBYT_6
2356 TUTI1: IDPB K,D ;MARK OUT USER DIR AREA
2361 TUTI2: SKIPGE J,SBTAB(D)
2362 JRST TUTI3 ;NOT REALLY THERE
2365 DPB K,J ;MARK OUT BLOCK
2366 TUTI3: AOBJN D,TUTI2
2367 MOVE D,NTBL(I) ;MARK OUT TUT (SIZE VARIES)
2376 ;TUTPNT - ROUTINE TO ACCESS THE TUT
2377 ; CALL WITH BLOCK NUMBER IN J, POINTER TO TUT IN B
2378 ; RETURNS WITH BYTE POINTER IN J (0 IF BLOCK NOT TUT'ED)
2381 ;TUTPNN - SAME BUT CALL WITH DISK NUMBER IN I, CLOBBERS B TO NEW TUT ADDR
2383 ;TUTPNO - SAME BUT CALL WITH DISK NUMBER IN I, CLOBBERS B TO OLD TUT ADDR
2385 TUTPNN: SKIPA B,QNTUTO(I)
2387 TUTPNO: MOVE B,QOTUTO(I)
2389 TUTPNT: CAMGE J,QLASTB(B)
2393 POPJ P, ;BLOCK NOT TUT'ED, RETURN J=0
2395 JRST [ TYPE OLD FORMAT TUT?
2402 \fSUBTTL MAIN SALVAGER
2404 GOGO: JRST GOGO0 ;VECTOR OF MYSTERIES
2405 SALVAG: JRST GOGO1 ;(IN CASE UP CREEK WITHOUT SYMBOL TABLE)
2408 JFCL LPBUST ;-> LPT BUSTED FLAG
2409 JFCL NOQUES ;-> NO QUESTIONS FLAG
2410 JFCL GOODUN ;-> ONLY ROUTINE THAT KNOWS WHICH ARE "RIGHT" PACKS
2411 JFCL GETSTS ;-> ROUTINE TO TYPEOUT CURRENT DISK STATUS
2412 JFCL DSKTST ;-> SIMPLE READ/WRITE TEST
2413 JFCL SEKTST ;-> SIMPLE SEEK TEST (READ ONLY)
2414 JFCL DUP ;-> DISK COPYING ROUTINE
2415 JFCL HCRASH ;-> AS FAST AS POSSIBLE FLAG
2419 SETOM NOQUES ;IF STARTED BY BEG$G IN ITS, BE FAST.
2420 JRST GOGO2 ;(NO ROUTINE TYPEOUT)
2423 GOGO2: SETOM GOGOX ;AUTOMATIC MODE
2429 SETOM QACT(A) ;ALL UNITS ACTIVE
2431 PUSHJ P,ACTUN ;ACTIVATE ALL UNITS THAT ARE ON-LINE
2432 PUSHJ P,GOODUN ;MAKE SURE ALL PACKS THAT SHOULD BE MOUNTED ARE
2433 MOVEM I,MDSK ;FIRST ACTIVE UNIT IS DSK TO GET MFD FROM
2434 MOVEM I,UDSK ;.. DSK TO GET UFD'S FROM
2435 PUSHJ P,DRPHAS ;VERIFY THAT DIRECTORIES ON ALL PACKS ARE IN PHASE
2436 SETZM CKFLSW ;DON'T CHECK ALL BLOCKS
2439 CHKR0: JSR INIT ;ASK QUESTIONS MODE
2447 TYPE ACTIVE UNITS ARE:
2456 CHKR3: UNTMES USE MFD FROM UNIT:
2464 PUSHJ P,DRPHAS ;VERIFY THAT DIRECTORIES ON ALL PACKS ARE IN PHASE
2467 DC, TYPE CHECK FILES FOR CLOBBERED BLOCKS?
2468 .ELSE TYPE READ ALL BLOCKS OF ALL FILES?
2474 DC,[ TYPE FIX POINTERS THEN?
2479 CHKR4: UNTMES GET USR DIRS FROM UNIT:
2489 ACTUN: MOVEI C,NUNITS-1
2490 ACTUN2: SKIPN QACT(C)
2494 SKIPN QACT(C) ;STILL THERE?
2521 JRST ACTUN4 ;PKNUM NOT REALLY SET UP
2530 JRST [ TYPE (RESERVED)
2536 ACTUN1: SOJGE C,ACTUN2
2540 ACTUE1: TYPE Error reading TUT block
2545 ACTUE3: TYPE Error reading MFD block
2549 ACTIVE: 0 ;-1 IF ALREADY HAVE RESET DRIVES
2551 ;MAKE SURE ALL NECESSARY PACKS ARE MOUNTED
2553 NTS,[ MOVEI A,FIRSPK ;AND RETURN MASTER DISK # IN I
2554 GOODN1: MOVEI C,NUNITS-1
2555 GOODN2: SKIPE QACT(C)
2558 JUMPL C,GOODN3 ;THIS PACK MISSING
2561 MOVEI A,LASTPK-FIRSPK+1 ;NUMBER OF PRIMARY PACKS
2562 MOVEI C,NUNITS-1 ;SCAN FOR SECONDARY PACKS
2563 GOODN4: SKIPN QACT(C)
2569 ADDI A,1 ;THIS SECONDARY PACK IS OK TO HAVE MOUNTED
2570 GOODN5: SOJGE C,GOODN4
2572 MOVEI C,NUNITS-1 ;AND FIND MASTER DISK (LOWEST NUMBERED ACTIVE UNIT)
2573 SKIPE QACT(C) ;ALSO COMPUTE GOOD PACKS - ALL PACKS IN A
2578 NTS, TYPE EXTRA PACKS MOUNTED.
2589 ;CHECK THAT DIRECTORIES ARE IN PHASE ON ALL PACKS
2590 DRPHAS: MOVEI I,NUNITS-1
2591 DRPHS1: SKIPN QACT(I) ;FIRST, GET ALL THE MFDS
2597 DRPHS2: SOJGE I,DRPHS1
2598 MOVE I,MDSK ;GET MASTER DISK'S ASCENDING DIRECTORY NUMBER
2599 MOVE A,@QNTUTO(I) .SEE MDNUM
2602 MOVEI I,NUNITS-1 ;SEE IF ALL OTHERS ARE THE SAME, OR AT MOST 1 LESS
2603 DRPHS3: SKIPE QACT(I)
2604 JRST [ CAMG B,@QNTUTO(I) .SEE MDNUM
2605 CAMGE A,@QNTUTO(I) .SEE MDNUM
2611 DRPHS6: TYPE DIRECTORIES OUT OF PHASE.
2614 DRPHS4: SKIPN QACT(I)
2623 MOVE A,@QNTUTO(I) .SEE MDNUM
2626 DRPHS5: CAIGE I,NUNITS-1
2628 TYPE VERIFY THAT THE PROPER PACKS ARE MOUNTED. IF YOU AREN'T SURE,
2630 TYPE GET HELP. IF THEY ARE PROPER, AND ONE IS JUST COMING ON-LINE
2632 TYPE AFTER BEING OFF FOR A WHILE, YOU WILL HAVE TO UCOP TO IT.
2638 SALV1: SETZM MFDWRT ;-1 IF MFD MODIFIED (DIRECTORIES DELETED)
2641 SALV2: SKIPN QACT(I)
2643 HRRZ B,QNTUTO(I) ;ZERO OUT NEW TUT
2648 BLT B,2000*MXTUTB-1(A)
2649 HRRZ B,QNTUTO(I) ;COPY RANDOM INFO FROM OLD TUT TO NEW
2654 PUSHJ P,TUTFIL ;FILL IN BLOCKS AREA OF TUT
2655 SALV3: SOJGE I,SALV2
2663 JRST [ TYPE Wrong NUDSL version =
2667 CAME A,[SIXBIT /M.F.D./]
2668 JRST [ TYPE MFD check word garbaged?
2677 MFDLUP: CAIL Q,MFD+2000
2684 MFDLU1: ADDI Q,LMNBLK
2687 DELUSR: MOVE A,MNUNAM(Q)
2688 CAMN A,[SIXBIT /.LPTR./]
2691 TYPE ; NO FILES, USER DIRECTORY DELETED
2697 USRLUP: MOVEM A,USRNAM
2699 SETZM UFDSEE ;-1 IF ANY ERROR OCCURS, PRINT WHOLE UFD
2702 SUBI J,MFD+2000 ;MAP MFD ENTRY INTO UFD BLOCK
2703 IDIVI J,LMNBLK ; -Nth USER DIRECTORY
2704 ADD J,NUDS ;END OF USER DIR AREA - N
2706 PUSH P,UDSK ;SAVE UFD DISK, MIGHT CHANGE IF UFD IS BAD
2709 USRLU1: MOVEI A,OUSRD ;COME BACK TO HERE ON TRY NEXT DRIVE
2715 MOVE Q,[OUSRD,,NUSRD]
2716 BLT Q,NUSRD+1777 ;COPY OLD FOR GARBAGE CHECK
2717 MOVEI Q,2000-LUNBLK+OUSRD
2719 ADD J,UDNAMP(J) ;LOWEST FILE NAME BLOCK
2721 CAIGE J,OUSRD+UDDESC
2722 JRST USRLE3 ;NAME POINTER OUTSIDE BLOCK! (try next drive)
2727 JRST USRLE7 ;NAME AND DESCRIPTOR AREAS OVERLAP (try next drive)
2728 PUSH P,J ; FILE NAME POINTER
2733 SETOM FILEER ; PRINT FILE NAME ONLY ON FIRST ERROR
2734 SETZM BADFIL ; SET IF BAD RETRIEVAL DISCOVERED
2741 LDB C,[UNPKN UNRNDM(Q)]
2742 LDB A,[UNDSCP UNRNDM(Q)]
2744 JRST DIRLE1 ;POINTS OUTSIDE DESC AREA (ignore)
2752 JUMPN B,DIRLE2 ;NOT PRECEEDED BY ZERO (ignore)
2756 JUMPE B,DIRLE3 ;POINTS TO ZERO (ignore)
2757 DIRL3: MOVE TT,UNRNDM(Q)
2761 PUSHJ P,FINDPK ;FIND WHICH PACK
2764 SETOM NOTUT ;FILE ON UNMOUNTED PACK, DON'T HACK TUT
2773 CAIN B,UDWPH ; WRITE PLACE HOLDER, OR NULL FILE
2784 JRST DIRLE4 ;NO STARTING BLOCK (ignore untill jmp)
2785 SKIPE NOTUT ;IF NOT ON ACTIVE UNIT, SKIP FILE
2789 JRST DIRLE5 ;BLOCK OFF DSK (ignore block)
2793 JRST DIRLE6 ;POINTS TO UFDS (ignore block)
2794 CKFL2A: MOVSI D,-LSBTAB
2796 JRST DIRLE6 ;SPECIAL BLOCK
2811 MOVE D,J ;SEE IF BLOCK LOCKED
2812 SUBI D,NTUT0-OTUT0 ;(LOCK BYTES NOT IN NEW TUT YET)
2818 JSR DIRLE7 ;SHARED BLOCK
2829 OLDFIL: SETOM UFDSEE ;PRINT WHOLE UFD LATER
2832 TYPE !!! Over-writing user-directory area block
2847 CKFLBP: JUMPL T,CKFLE1
2849 DC,[ MOVE A,RXWDS+XWSYSN
2852 CKFL5: LDB A,[XWBLK RXWDS]
2855 CKFL6A: SKIPE CKFIX ;FIX ERRORS?
2856 SKIPGE XWDSEE ;ANY ERRORS?
2863 MOVEM A,WXWDS+XWSYSN
2883 CKFLE1: PUSHJ P,PNTNAM
2884 TYPE ERROR READING BLOCK
2892 CKFLE2: JRST CKFL6A ;JFCL THIS IF YOU HATE ARCHIVES
2898 LPR Retrieval User-name differs
2906 CKFL6: JRST CKFL6A ;JFCL THIS IF YOU HATE ARCHIVES
2912 CKFLE4: LPR Chain pointer wrong, Last block=
2919 LOAD: SETOM ADRSET ;B HAS BYTE WHERE UDWPH < BYTE <=77
2920 ANDCMI B,20 ;DM FUNNY BITS
2932 JRST LOAD2 ;THIS DRIVE NOT ACTIVE
2934 PUSHJ P,TUTPNN ;GET POINTER TO NEW TUT
2935 ADD J,[TUTBYT_14,,] ;BACK UP FOR ILDB
2939 SKIPF: SUBI B,UDTKMX
2956 JRST DIRLE8 ;LINK NOT FOLLOWED BY ZERO (ignore)
2961 JUMPE A,CPOPJ ;NON SKIP RETURN IF FOLLOWED BY ZERO
2967 LTYPE3: SOJG B,LTYPE2
2968 JRST POPJ1 ;SKIP RETURN IF ENDS NATURALLY
2970 DIRLUP: SKIPN BADFIL
2974 DIRLP1: MOVE Q,LASTQ
2981 FINDPK: PUSH P,B ;MAP PACK NUMBER IN C, TO UNIT NUMBER
2994 USRLE2: TYPE USR DIRECTORY READ ERROR
2995 SETOM FLAG' ;HARDWARE ERROR
2996 USRL2A: PUSHJ P,TSPAC
3003 PUSHJ P,GSTS ;PRINT CONTROLLER STATUS
3006 TYPE TRY NEXT DRIVE?
3017 MOVEM I,UDSK ;WILL GET POPED BEFORE NEXT USER
3018 SETOM UFDLOS ;CAUSE DIR TO BE WRITTEN ON ALL DRIVES
3022 USRLE3: TYPE User directory name-pointer scrambled
3026 USRLE7: TYPE Name area, descriptor area overlap
3030 USRLE4: 0 ;USR NAME IN DIR DIFFERS
3031 TYPE USER NAME IN DIRECTORY DIFFERS
3048 TYPE CORRECT IT? (MFD ENTRY TAKEN AS GOOD)
3054 MOVEM A,OUSRD+UDNAME
3059 USRLE5: SETOM UFDSEE
3067 ANDCAM A,OUSRD(Q) ;CLEAR OUT THE GARBAGE
3072 PGARBF: LPR GARBAGE IN FREE AREA
3086 USRLE6: SETOM UFDSEE
3100 PEXGAR: LPR EXTRA GARBAGE IN UFD
3115 PNTNAM: PUSH P,NOLPT
3121 LPTNAM: PUSH P,A ;DIRLE5 ETC.
3127 LPTFIL: PUSH P,A ;AVOID PDL SCREWAGE
3136 LDB C,[UNPKN UNRNDM(B)]
3140 X FINDPK ;FIND PACK FILE IS ON
3145 LPTFI1: PUSHJ P,LCRR
3146 INSIRP POP P,[C B A]
3149 PNTXWD: PUSH P,NOLPT
3158 LPR Extra words: Block #
3175 LPR , Chain pointer=
3178 LPR , active wd cnt=
3184 SETZM XWDSEE .SEE CKFL6A
3186 \fDIRLE1: PUSHJ P,LPTNAM
3187 LPR DESC POINTS OUT OF DESC AREA
3194 DIRLE2: PUSHJ P,LPTNAM
3195 LPR FILE NOT PRECEEDED BY ZERO
3202 DIRLE3: PUSHJ P,LPTNAM
3203 LPR FILE POINTS TO ZERO
3210 DIRLE4: PUSHJ P,LPTNAM
3211 LPR STARTING ADDRESS NOT SET
3218 DIRLE5: PUSHJ P,LPTNAM
3219 LPR BLOCK POINTS OFF DSK
3223 DIRLE6: PUSHJ P,LPTNAM
3224 LPR BLOCK IN RESERVED AREA
3230 LPR SHARES BLOCK WITH SOME OTHER FILE
3232 AOS SHARED ;SHARED BLOCK FLAG
3235 SETZM SALVRT ;NO AUTOMATIC SYS START
3238 DIRLEC: PUSHJ P,LPTNAM
3239 LPR LINK NOT THREE NAMES
3242 DIRLE8: PUSHJ P,LPTNAM
3243 LPR LINK NOT FOLLOWED BY A ZERO
3244 DIRLED: PUSHJ P,LCRR
3250 DIRLE9: SKIPE NOQUES
3252 LPR FILE UNPROTECTED IN OLD TUT -
3260 DIRLEB: PUSHJ P,LPTNAM
3261 LPR FILE CONTAINS LOCKED BLOCK
3264 SETZM SALVRT ;NO AUTO SYS STARTUP
3267 USRFIN: CLEARM GARBF
3270 MOVE Q,[440600,,NUSRD+UDDESC]
3271 GARB2: CAML J,OUSRD+UDESCP
3274 JUMPN B,USRLE6 ;GARBAGE IN DESCRIPTOR AREA (clear out)
3277 USRFN2: TLNE Q,770000
3279 MOVEI Q,-NUSRD+1(Q) ;FIRST WORD ABOVE DESCRIPTOR AREA
3280 GARB6: CAML Q,NUSRD+UDNAMP
3284 JRST USRLE5 ;GARBAGE IN NAME AREA (clear out)
3292 TYPE UFD NEEDS UPDATE - WRITE?
3295 GARB5A: MOVEI A,OUSRD
3298 GARB7: SKIPE QACT(I)
3307 SUBTTL LISTF - DUMP OUT USER DIRECTORY
3309 SKIPL ACTIVE ;ALREADY DID RESET
3318 LISTF3: SKIPN QACT(I)
3323 JUMPL T,[TYPE ERROR READING TUT #
3331 LISTF2: SOJGE I,LISTF3
3335 SKIPGE I,FUNIT ;USE FIRST ACTIVE UNIT
3336 JRST LISTF4 ;NO DISKS ACTIVE??
3338 JUMPL T,[TYPE ERROR READING MFD
3347 JRST [ TYPE USER NOT FOUND -
3352 JRST [ ADDI Q,LMNBLK
3359 MOVE I,FUNIT ;USE FIRST ACTIVE UNIT
3362 JUMPL T,[TYPE ERROR READING USER DIRECTORY
3371 CONTIN: TYPE CONTINUE?
3378 LISTF4: TYPE NO ACTIVE UNIT TO GET DIR FROM
3381 UFDPR: SETZM SALVRT ;NO AUTO SYS STARTUP
3383 JRST [ TYPE Errors in directory
3388 USEE0: MOVE Q,OUSRD+UDNAME
3399 CAIGE J,OUSRD+UDDESC
3400 JRST [ LPR UFD NAME AREA POINTER OUT OF RANGE
3406 JRST [ LPR DESCRIPTOR FREE POINTER OVERLAPS NAME AREA
3409 MOVEI Q,OUSRD+2000-LUNBLK
3410 USEE1: CAMGE Q,LAST ;PER FILE LOOP
3418 LDB C,[UNPKN UNRNDM(Q)]
3420 MOVEM C,FUNIT ;KLUDGE KLUDGE (LOOKS AT TUTS)
3421 LDB A,[UNDSCP UNRNDM(Q)]
3423 JRST [ LPR FILE DESCRIPTOR POINTER POINTS OUTSIDE DESCRIPTOR AREA
3434 JUMPN B,[ LPR - IS NOT PRESENT
3439 ILDB B,A ;PEEK AT NEXT BYTE
3441 LPR (FIRST BYTE SHOULD BE NON-ZERO)
3442 JRST USEELY] ;SHOULD BE NON-ZERO
3443 LDB A,[UNDSCP UNRNDM(Q)]
3444 X LOPT ;SHOW DESC ADDR BEFORE FIRST DESC BYTE
3445 USEE3: MOVE TT,UNRNDM(Q)
3457 JRST [ LPR (WRITE-PLACE-HOLDER)
3470 JRST USLP3 ;PACK NOT MOUNTED
3474 JRST USLPE ;BAD BLOCK
3475 ILDB TT,J ;TUT ENTRY
3488 JRST USLPE ;OVERLAPS TUT OR MFD
3490 SKIPL FUNIT ;FILE NOT ON ACTIVE UNIT
3500 USLPE: LPR ?? BAD BLOCK # ??
3503 USEELP: MOVE Q,LASTQ
3507 USLOAD: SETOM ADRSET
3508 ANDCMI B,20 ;DM FUNNY BITS
3519 PUSHJ P,TUTPNO ;GET POINTER TO OLD TUT
3520 ADD J,[TUTBYT_14,,] ;BACK UP FOR ILDB
3528 USSKIP: SUBI B,UDTKMX
3549 ADD N,[060000,,] ;ENDS WITH ZERO, RE-READ THE ZERO BYTE
3556 LPR ?? NO END ZERO ??
3560 USLIN3: LPR ?? ENDS EARLY ??
3565 JUMPE A,CPOPJ ;NON SKIP RETURN IF FOLLOWED BY ZERO
3567 JRST POPJ1 ;SKIP RETURN IF ENDS NATURALLY
3568 CAIN A,': ;QUOTE CHAR
3573 JRST POPJ1 ;SKIP RETURN IF ENDS NATURALLY
3589 USSELP: MOVE Q,LASTQ
3597 SUBTTL MAIN SALVAGER - WRITE MFD & TUT
3600 MFDFN0: SKIPE QACT(I)
3605 JRST SHARCK ;MFD DIDN'T HAVE ANY CHANGES
3606 MFDWR0: SKIPE NOQUES
3608 TYPE WRITE OUT CHANGES IN MFD?
3611 MFDWR1: MOVE J,MFDBK
3617 PUSHJ P,GSTS ;ERROR WRITING MFD
3622 MFDWR3: SOJGE I,MFDWR2
3625 TUTCMP: SETZM TUTDFR ;FIRST SEE IF ANY DIFFERENCES
3628 SETZM TUTCHG ;MAKE SUMMARY TABLE OF DIFFERENCES
3629 MOVE Q,[TUTCHG,,TUTCHG+1]
3630 BLT Q,TUTCHG+<TUTMAX*TUTMAX>-1
3632 HRR Q,QNTUTO(I) ;NEW B.P.
3635 HRR J,QOTUTO(I) ;OLD B.P.
3636 MOVE TT,QFRSTB(J) ;BLOCK NUMBER
3639 MOVEM B,TUTHIB' ;HIGHEST BLOCK #
3646 JRST [ MOVE B,D ;IF LOCKED, STAY LOCKED
3648 AOS NLKBKS ;COUNT BLOCKS LOCKED DUE TO DISK ERRORS
3650 PUSHJ P,LCKRPT ;IN CHKR MODE, REPORT LOCKED BLOCKS
3653 TUTC2: CAMGE TT,TUTHIB
3659 UNTMES LOCKED BLOCKS ON UNIT #
3664 POPJ P, ;NO DIFFERENCES THIS TUT
3665 JRST TUTCM0 ;DIFFERENCES, GO HANDLE
3667 TUTC4: IMULI B,TUTMAX
3669 MOVE T,QOTUTO(I) ;DON'T LIST TUT CHANGES IN SWAPPING AREA
3676 TUTCM0: SKIPE NOQUES ;HERE WHEN TUT HAS DIFFERENCES
3677 JRST TUTCM3 ;IF NO QUESTIONS, JUST WRITE
3678 MOVEI A,TUTMAX*TUTMAX-1 ;SEE IF ANY TUT DIFFERENCES NOT IN SWAPPING AREA
3681 JUMPL A,TUTCM4 ;NONE, GO ASK IF SHOULD WRITE
3682 SETZM LINPOS ;OTHERWISE, SUMMARIZE TUT DIFFERENCES
3687 TUTSM1: MOVEI D,TUTMAX-1
3706 TUTSM3: SOJGE D,TUTSM2
3712 ;HERE TO PRINT OUT THE TUT
3716 HRR Q,QNTUTO(I) ;NEW B.P.
3719 HRR J,QOTUTO(I) ;OLD B.P.
3720 MOVE TT,QFRSTB(J) ;BLOCK NUMBER
3723 MOVEM B,TUTHIB' ;HIGHEST BLOCK #
3729 TUTCM2: CAMGE TT,TUTHIB
3734 X LFORM ;SOMETHING PRINTED, ADVANCE LPT PAPER
3738 TYPE NEEDS UPDATING - WRITE?
3745 PUSHJ P,GSTS ;ERROR WRITING TUT
3752 TUTCHG: BLOCK TUTMAX*TUTMAX
3754 TUTDF1: MOVE T,QOTUTO(I)
3758 JRST TUTCM2 ;IN SWAPPING AREA, IGNORE
3762 JRST TUTDF7 ;NO MORE ROOM ON LINE
3763 MOVEI A,40 ;PRINT MULTIPLE FROBS PER LINE
3764 PUSHJ P,LPTR ;SO THE LINE PRINTER WILL GO FASTER
3767 NEWOLD: SKIPN TUTDFR
3779 TUTTYP: SETOM TUTDFR
3781 LPR TUT DIFFERENCES FOR DRIVE #
3784 TUTDF7: MOVNI A,5 ;START NEW LINE, ROOM FOR 5 BLOCKS IF TTY
3786 MOVNI A,9 ;OR 9 IF LPT
3790 LCKRPT: TYPE LOCKED BLOCK
3800 SUBTTL TRACK DOWN SHARED BLOCKS
3802 SHARCK: SKIPN SHARED
3803 JRST CRDDT ;NO SHARED TRACKS, WE ARE DONE
3806 LPR LOOKING FOR SHARED BLOCKS
3815 SMFDLP: CAIL Q,MFD+2000
3820 SMFDL1: ADDI Q,LMNBLK
3827 SUSRLP: HRREI J,-MFD-2000(Q) ;CONVERT MFD INDEX TO BLOCK NUMBER
3834 SUSRL1: MOVEI A,OUSRD
3837 MOVEI Q,2000-LUNBLK+OUSRD
3848 LDB C,[UNPKN UNRNDM(Q)]
3849 LDB A,[UNDSCP UNRNDM(Q)]
3858 SDIRL3: MOVE TT,UNRNDM(Q)
3865 CAIG B,UDWPH ; A LOAD FIRST THING
3885 SLOAD: ANDCMI B,20 ;DM FUNNY BIT
3894 PUSHJ P,TUTPNN ;GET PNTR TO TUT
3895 ADD J,[TUTBYT_14,,] ;COMPENSATE FOR ILDB
3899 SSKIPF: SUBI B,UDTKMX
3930 SUSRE2: TYPE USER DIRECTORY PARITY ERROR
3943 TYPE TRY NEXT DRIVE?
3961 SDIRLP: MOVE Q,LASTQ
3970 SUBTTL INITIALIZATION
3975 CONO 675550 ;RESET APR
3976 CONO PI,710000 ;RESET PI
3977 MOVE TT,[JSR UUOHLT] ;HALT ON UUO
3980 MOVEI A,SA ;MAKE SURE ALL NECESSARY MEMORY IS PRESENT
3983 JRST [ TYPE NXM IN SALV MEM
3990 SETZM DTEOPR ;BTB IF QUIT OUT AND RESTART
3991 CONO APR,267760 ;I/O RESET, CLEAR + DISABLE ALL FLAGS
3992 CONO PI,010000 ;CLEAR P.I. SYSTEM
3994 JRST .+4 ;JUMP IF CACHE LOOK ENABLE
3995 SWPIA ;IF CACHE OFF, INVALIDATE IT BEFORE TURNING ON
3998 MOVEI TT,SALVPF ;SET TO HALT ON PAGE FAIL (E.G. PARITY ERROR)
4000 CONO PAG,600000+EPT/1000 ;SET UP EPT, ENABLE CACHE, DISABLE PAGING AND TRAPS
4001 DATAO PAG,[100000,,400000+EPT/1000] ;UPT=EPT
4003 SKIPN EPT+430 ;HALT ON KERNEL UUO
4005 MOVEI A,SA ;MAKE SURE ALL NECESSARY MEMORY IS PRESENT
4008 JRST [ TYPE NXM IN SALV MEM
4014 RH, TLNN TT,(%HID22)
4015 RH, JRST [ TYPE DF10 IN KA MODE??
4017 IFN T300P,[ ;TURN ON DL10 TO ACCESS T-300
4018 CONO DLC,400000 ;MR CLR
4019 CONO DLB,1 ;TURN OFF EXCESS LIGHTS
4022 CONO DLB,DL10AR ;64 WORDS FOR PDP11 #0 AT DL10AR
4023 DATAO DLC,[200001,,] ;KA INTERRUPT MODE
4024 CONO DLC,100020 ;ENB PDP11 PORT #0 NO INTERRUPTS
4031 JRST [ TYPE [WRITE HEADERS ENABLED]
4035 SETOM DRIVE ;ALL DRIVES ASSUMED TO BE ON-LINE
4036 MOVE A,[DRIVE,,DRIVE+1]
4037 BLT A,DRIVE+NDRIVE-1
4038 MOVEI A,SLVIOWD ;SET UP CHANNEL PROGRAM AREA
4046 SETOM QPKN(A) ;TUT NOT IN YET
4049 .OPEN TYIC,[SIXBIT / $TTY/]
4051 .OPEN TYOC,[SIXBIT / !TTY/]
4053 .CORE <THEEND-1>_-10.+1
4055 MOVE A,[SQUOZE 0,NQS]
4059 MOVE A,[SQUOZE 0,QACT]
4063 MOVE A,[SQUOZE 0,NUDSL]
4067 MOVE A,[SQUOZE 0,MFDBLK]
4071 MOVE B,[SQUOZE 0,NTUTBL]
4078 .VALUE ;NOT ASSEMBLED FOR BIG ENOUGH TUTS
4079 MOVE B,[SQUOZE 0,T300P] ;NEED KLUDGES FOR 2 SIZES OF TUT
4083 MOVE C,[SQUOZE 0,NTUTB1]
4091 INI03: MOVE A,[SQUOZE 0,NBLKS]
4101 SETOM NOLPT ;ASSUME THE WORST
4104 SETOM LPFRST' ;FLAG LPT NOT USED YET
4109 SETOM LPBUST ;ASK ONLY ONCE
4111 .OPEN LPTC,[.UAO,,'LPT]
4119 IFN OLPTP,[ ;BRING UP AI-KA LPT
4123 LPTUP1: SOJLE A,LPTUP2
4130 IFN NLPTP,[ ;BRING UP ML LPT
4131 LPTUP3: SETOM LPTBFC
4132 MOVE A,[<.BYTE 7 ? 15 ? 15 ? 15 ? 15 ? 15>]
4135 CONO NLPT,1000 ;IMAGE MODE
4136 DATAO NLPT,[23*2] ;MOTOR ON
4138 MOVEI A,200000 ;1 SECOND
4139 LPTUP1: SOJLE A,LPTUP2
4140 CONSO NLPT,100 ;IS IT ON?
4142 SETZM NOLPT ;WELL, YES
4144 CONO NLPT,100 ;SET OUTPUT DONE
4148 IFN TTLPTP,[ ;BRING UP LPT ATTACHED VIA MTY
4149 LPTUP3: MOVEI A,200000
4150 LPTUP1: SOJLE A,LPTUP2
4152 TRNN B,40 ;ANY INPUT?
4157 JRST LPTUP1 ;NOT FROM LPT
4159 SETZM NOLPT ;IS FROM LPT -> WIN
4160 MOVEI B,TTLPTP_14 ;LINE NUMBER IN RIGHT PLACE
4161 CONO MTY,10(B) ;SET OUTPUT DONE
4165 IFN OLPTP+NLPTP+TTLPTP,[
4166 ;ROUTINE TO ASK IF UP
4167 LPTUP2: TYPE LPT DOWN (Y OR N)
4168 IFN OLPTP, TYPE [MAYBE NEEDS RESET BUTTON PUSHED]
4174 JRST LPTUP3 ;"N", CHECK IT AGAIN
4177 LPTUP4: SETOM LPBUST
4178 ];IFN OLPTP+NLPTP+TTLPTP
4186 JRST 4,. ;HERE IF UUO IN STAND-ALONE MODE (ELSE HALT IN ITS)
4189 SUBTTL LPT & TTY I/O
4197 LDPT0: PUSHJ P,LDPT1
4211 LOPT1: LSHC A,-35. ;IN CASE NEGATIVE
4223 JRST TYLPT ;TYPE ON TTY INSTEAD
4233 OLP1: CAIN A,12 ;SUPPRESS LF, MAKE CR=CR-LF
4246 SUBI A,40 ;LOWER CASE -> UPPER CASE
4249 HRLZI B,2 ;3 SECOND TIMEOUT
4257 TYPE HIT RESET BUTTON ON LPT
4259 HRLZI B,15 ;20 SECOND TIMEOUT
4270 IFN NLPTP,[ ;SEND CHARACTER TO NLPT
4272 SOSLE LPTBFC ;MORE TO GO
4274 LPTR01: MOVEI B,5 ;NO, NEW WORD
4276 MOVE B,[440700,,LPTBUF]
4278 MOVEI B,-1 ;TIMEOUT FOR DEAD LPT
4283 LPTR0: IDPB A,LPTBFP ;BUFFER 5 AT A TIME
4285 CAILE A,14 ;LF OR FF, FORCE BUFFER NOW
4293 ;NLPT BUFFERING CRUFT
4294 LPTBUF: -1 ;5 CHAR LPT BUFFER
4295 LPTBFC: 5 ;COUNT OF CHARS LEFT IN BUF
4296 LPTBFP: @. ;BYTE POINTER INTO LPT BUFFER
4298 LPTFIN: SKIPL LPFRST ;DO NOTHING IF NEVER OUTPUT TO LPT
4299 SKIPGE NOLPT ;WAS LPT INIT'ED?
4300 POPJ P, ;NO, DON'T HANG
4301 MOVE A, [<.BYTE 7 ? 15 ? 14 ? 15 ? 15 ? 15>]
4308 LPTFN1: CONSO NLPT,100 ;WAIT FOR THAT TO HAPPEN
4311 CONSO NLPT,100 ;WAIT FOR THAT TO HAPPEN
4318 ; call with ascii char in A
4319 ; saves and restores all AC's
4321 ANDI A,177 ;MASK TO 7 BIT ASCII
4322 CAIGE A,40 ;SKIP IF NOT CTL CHAR
4323 CAIN A,14 ;SKIP IF NOT FF
4324 JRST LPTOP ;PRINT LITERALLY FF, GRAPHICS
4325 CAIN A,15 ;SKIP IF NOT CR
4326 JRST LPCR ;JUMP TO CR ROUT
4327 CAIN A,12 ;SKIP IF NOT LF
4328 JRST LPLF ;JUMP TO LF ROUT
4329 CAIN A,11 ;SKIP IF NOT TAB
4330 JRST LPTAB ;JUMP TO TAB ROUT
4331 MOVEI A,"^ ;HERE FOR RANDOM CTL CHAR
4332 PUSHJ P,LPTO ;PUT OUT ^FOO
4333 MOVE A,(P) ;RETREIVE CHAR
4334 ADDI A,100 ;MAKE IT A 'LETTER'
4338 LPCR: SKIPE LPTPOS ;SKIP IF STILL AT LEFT MARGIN
4339 PUSHJ P,LPTO ;ELSE PUT OUT CR
4340 SETZM LPTPOS ;MARK 'AT LEFT MARGIN'
4341 SETOM LPCRLF ;MARK LF AFTER CR
4343 JRST LPTOP ;OUTPUT IT
4345 LPLF: AOSE LPCRLF ;SKIP IF THIS LF AFTER CR
4346 JRST LPTOP ;ELSE PUT IT OUT
4349 LPTAB: MOVEI A,40 ;SPACES FOR TAB
4351 MOVE A,LPTPOS ;CHECK POS
4352 TRNE A,7 ;SKIP IF POS = 0 MOD 8
4353 JRST LPTAB ;ELSE PUT ANOTHER SPACE
4356 LPTO: CAIL A,40 ;SKIP FOR CTL CHAR NOT COUNTED
4357 AOS LPTPOS ;COUNT CHAR
4360 MOVEI A,-1 ;TIMER FOR FLAG
4361 LPWAIT: SOJLE A,LPTOUT
4362 CONI MTY,B ;GET STATUS
4363 TRNE B,40 ;SKIP IF NO INPUT FLAG
4364 JRST FLSINP ;ELSE JUMP TO FLUSH INPUT
4365 TRNN B,10 ;SKIP IF OUTPUT FLAG
4366 JRST LPWAIT ;ELSE LOOP
4367 LDB B,[140500,,B] ;GET SUBDEV #
4368 CAIE B,TTLPTP&77 ;SKIP IF THIS IS LPT #
4369 JRST FLSOUT ;ELSE FLUSH
4370 LPTOUT: MOVEI B,TTLPTP_14 ;GET LPT NO IN SUBDEV POSITION
4371 CONO MTY,(B) ;SELECT SUBDEV
4373 MOVE A,(P) ;GET CHAR
4374 LSH A,35 ;PUT IN FUNNY POSITION
4375 DATAO MTY,A ;PUT OUT 1 CHAR
4378 FLSINP: DATAI MTY,B ;READ INPUT
4379 JRST LPWAIT ;AND IGNORE
4381 FLSOUT: LSH B,14 ;SHIFT TO SELECT
4382 CONO MTY,200(B) ;RESET FLAG, IT'S NOT LPT
4385 LPTPOS: 0 ;PRINT POSITION FROM LEFT MARGIN
4386 LPCRLF: 0 ;# CHARS AFTER LAST CR, -1 IF TO IGNORE LF
4390 JRST CRR ;NO FF ON TTY
4394 T6B: PUSH P,B ;OUTPUT SIXBIT IN A
4407 L6B: PUSH P,B ;OUTPUT SIXBIT IN A
4409 MOVE B,[440600,,(P)] ;ALWAYS OUTPUTS SIX COLUMNS
4410 L6B1: ILDB A,B ;CAN YOU GUESS WHY? WIN A KEWPIE DOLL!
4441 TDPT1: LSHC A,-35. ;IN CASE NEGATIVE
4453 PUSHJ P,LSPAC ;OLD LPT LACKS TABS
4460 MOVEI A,11 ;NLPT HAS HARDWARE TABS
4507 OUTSTR: HRLI B,440700
4514 TYPE *** ERROR *** SYSTEM MAY NOT BE BROUGHT BACK UP
4515 CRDDTE: NTS, SETZM SALVRT ;CAN'T RETURN TO SYSTEM
4520 IFN NLPTP, PUSHJ P,LPTFIN ;UNBUFFER LINE PRINTER
4525 JRST 4,. ;NO DDT LOADED?
4528 TS,[ .VALUE [ASCIZ\
\17:
\e\16DDT
\17\e\16
4557 CONSZ PTP,20 ;WAIT FOR NOT BUSY
4572 KL,[ ;DTE20 COMMUNICATION ROUTINE ... COPIED FROM DEC "SUBRTN" PROGRAM
4574 DTEXIO: SETZM DTEFLG
4585 NTYI: PUSHJ P,TYI ;INPUT DIGIT, SKIP IF WIN
4594 SIXI1: MOVE C,[440600,,B]
4612 TYI: ;INPUT CHAR INTO A
4621 MOVEI A,3400 ;"DDT MODE" INPUT
4627 CAIL A,"a ;MIGHT NOT BE KSR-35
4635 ;RETURN TO DDT IF CHARACTER TYPED
4636 TYIPSE: PUSHJ P,TYIP
4641 ;SKIP IF INPUT AVAILABLE
4657 Y.OR.N: PUSH P,A ;YES OR NO, SKIP IF YES
4664 JRST YORN1 ;TELETYPE KEYBOARD LOSSAGE?
4672 NTS,[ MTC==340 ;MAG TAPE CHANNEL FOR FUNCTIONS
4673 MTS==344 ;MAG TAPE CHANNEL FOR STOPPING AND STATUS
4675 ;SHIFTS FOR FIELDS IN CONO MTC,
4684 MAGCOM=5_<UNITNO>+1_<PARITY>+800BPI_<DENSTY>+1_<CDUMP>
4687 NOOP1=0_<FUNC>+MAGCOM ;CLEAR INTERRUPT FLAGS
4688 NOOP2=10_<FUNC>+MAGCOM ;INTERRUPT WHEN TRANSPORT IDLE
4689 REWIND=1_<FUNC>+MAGCOM ;REWIND
4690 REED=2_<FUNC>+MAGCOM ;READ
4691 SPACR=7_<FUNC>+MAGCOM ;SPACE REVERSE
4698 ;NOTE - TM10B HAS DATA PIA (CONI MTC, 1.1-1.3) STUCK AT 7
4703 CONO MTC,NOOP1 ;CLEAR INTERRRUPT FLAGS
4704 CONO MTC,REWIND ;INITIATE REWIND
4705 CONSO MTS,JOBDON ;WAIT FOR REWIND TO BEGIN
4707 CONO MTC,NOOP2 ;SET JOB DONE WHEN TRANSPORT IDLE
4708 CONSO MTS,JOBDON ;WAIT FOR JOB DONE
4711 POPJ P, ;REWIND DONE
4716 MREAD7: SKIPGE B,MAGBFP
4726 MERR2: MOVE B,[-2000,,MAGBUF]
4729 CONO MTC,NOOP1 ;CLEAR FLAGS
4730 CONSO MTC,7 ;IS THIS A TM10B?
4732 KA, MOVE B,[-2000,,MAGBUF-1] ;YES SET UP CHANNEL PROGRAM
4733 KL, MOVE B,[-2000_4,,MAGBUF-1]
4738 KL,[ SWPUA ;UNLOAD THE CACHE
4740 MOVE A,[CONSZ APR,200000]
4746 MREADA: CONO MTC,REED
4747 MREAD2: CONSO MTS,DATREQ+EOFF+JOBDON+EOTF ;WAIT FOR NEXT DATA REQUEST
4763 MREAD6: SETOM SHORTL
4764 MREAD9: CONSZ MTC,7 ;SKIP IF TM10A
4771 MREADB: HRRZ B,SLVICWA+1
4775 MOVSI B,0 ;EOF MARK => NO WORDS READ
4779 MREAD3: TRNE C,DATREQ
4780 CONSZ MTC,7 ;SKIP IF TM10A
4781 JRST MREAD2 ;TM10B OR NO DATA REQUEST
4789 CONSZ MTS,440000 ;X HUNG + ILL OP
4791 MREAD8: CONSO MTS,20600
4802 CONSZ MTC,7 ;SKIP IF TM10A
4812 MERR1: AOS FERRS ;IGNORE ERR
4831 MREOT: CONO MTS,1 ;STOP TAPE IF STILL MOVING
4838 SUBTTL TYPE CONTROLLER AND DRIVE STATUS
4846 GSTS: INSIRP PUSH P,[A B C D T]
4849 TYPE CONTROLLER STATUS:
4854 CONO DC0,DCCSET+DCDENB
4855 DATAO DC0,[DJMP GETUNT]
4859 LDB A,[DUNFLD GOTUNT]
4860 DPB A,[DUNFLD STOSTS]
4864 DATAO DC0,[DJMP STOSTS]
4872 LDB A,[101100,,STATUS]
4875 INSIRP POP P,[T D C B A]
4878 TYPSTS: SETOM FIRST'
4881 HLRZ T,B ;FLAGS TO TEST
4897 DC0STS: STS 4000,ERROR-FLG
4903 DC1STS: STS 4000,INTERNAL-PARITY-ERROR
4904 STS 2000,RECORD-LENGTH
4905 STS 1000,READ-COMPARE
4907 STS 200,CHECKSUM/DECODER
4909 STS 40,FILE-UNSAFE/SEEK-INCOMPLETE/END-OF-DISC
4910 STS 20,OFF-LINE/MULTIPLE-SELECT
4911 STS 10,RDG-KEY/PROTECT/READONLY
4912 STS 4,DATAO-WHILE-BUSY
4914 STS 1,CORE-PARITY-ERROR
4917 DRVSTS: STS 4,UNIT-SELECTED
4920 STS 40,SEEK-INCOMPLETE
4923 STS 400,WRITE-CURRENT-SENSED(?)
4930 STOSTS: DSDRST+DUNENB STATUS(74)
4938 GSTS: INSIRP PUSH P,[A B C D T]
4948 TLC D,1 ;REVERSE SENSE OF WRITE HEADER LOCKOUT SWITCH
4959 TYPE , LAST ADDRESSED CYL=
4969 INSIRP POP P,[T D C B A]
4972 TYPSTS: SETOM FIRST'
4975 HLLZ T,B ;FLAGS TO TEST
4992 ; CONI STATUS TABLE (RH)
4994 CNISTS: STS 400000,SEARCH DONE
4995 STS 200000,END OF CYLINDER
4996 STS 100000,POWER FAILURE
4997 STS 040000,SEARCH ERROR
5000 STS 002000,DRIVE NOT READY
5001 STS 001000,WRITE PROTECT
5002 STS 000400,DATAO WHEN BUSY
5003 STS 000200,SECTOR ADDRESS ERROR
5004 STS 000100,SURFACE ADDRESS ERROR
5009 ; CONI STATUS TABLE (LH)
5011 CNLSTS: STS 000010,CONTROL WORD PARITY ERROR
5012 STS 000004,SECTOR PARITY ERROR
5013 STS 000002,MEMORY WORD PARITY ERROR
5014 STS 000001,DISK WORD PARITY ERROR
5017 ; DATAI STATUS TABLE (LH)
5019 DTISTS: STS 000100,SEEK INCOMPLETE
5020 STS 000040,ON CYLINDER
5021 STS 000020,DISK ON-LINE
5022 STS 000010,FILE UNSAFE
5023 STS 000004,NON EXISTENT DRIVE
5024 STS 000002,DRIVE IS READ-ONLY
5025 STS 000001,WRITE HEADER LOCKOUT OFF!!
5035 JRST T3STS ;LAST OPERATION WAS REALLY TO T-300
5037 INSIRP PUSH P,[A B C D T I K]
5038 TYPE CONTROLLER STATUS:
5046 TYPE CURRENT REGISTER:
5050 PUSHJ P,TOPT ;TYPE REG NO, STATUS, AND CONTENTS IN OCTAL
5051 JUMPL D,GSTS0 ;DO FOLLOWING ONLY FOR DRIVE REGS
5056 CAIA ;DON'T GIVE BLANK LINE
5062 MOVEI I,NUNITS-1 ;CONVERT BACK TO VIRTUAL UNIT
5063 CAME A,QTRAN(I) ;TO MAKE RHGET HAPPY
5065 JUMPL I,GSTS3 ;FOO!! ADDRESSING NON EXISTENT DRIVE
5067 MOVSI K,-LGSTSR ;DISPLAY DRIVE REGS SPEC'ED IN TABLE
5068 GSTS1: MOVE D,GSTSRT(K)
5069 PUSHJ P,TYPRGN ;TYPE REG NAME
5070 HRRZ C,D ;C -> STATUS BIT TABLE
5071 HLLZ A,D ;A := REG NUMBER
5072 PUSHJ P,RHGET ;GET CONTENTS OF REG
5074 PUSHJ P,TOPT ;GIVE CONTENTS IN OCTAL
5076 MOVS D,A ;AND SYMBOLICLY
5079 GSTS3: INSIRP POP P,[K I T D C B A]
5086 JRST GSTS3 ;DON'T TRY ANY MORE REGS
5088 TYPSTS: SETOM FIRST'
5091 HLLZ T,B ;FLAGS TO TEST
5103 TYPRGN: LDB A,[360600,,D] ;TYPE NAME OF REGISTER ADDRESSED BY D
5112 ;TABLE OF DRIVE REGISTERS THAT NEED TO BE DISPLAYED
5113 ; LH = REG ADDR, RH = STATUS BITS TABLE ADDR
5127 A,,[ASCIZ \B\] ? TERMIN
5131 CNLSTS: STS 400000,AR FULL
5134 STS 020000,CHANNEL ACTIVE
5135 STS 010000,CHANNEL PULSE
5136 STS 004000,22-BIT CHANNEL
5137 STS 000400,CXR ILL FUNC
5138 STS 000200,CXR DRIVE ACCESS ERR
5139 STS 000004,MEMORY PARITY
5140 STS 000002,CONTROL WORD PARITY
5146 CNISTS: STS 400000,DATA BUS PARITY
5147 STS 200000,DRIVE EXCEPTION
5148 STS 100000,CHANNEL ERROR
5149 STS 020000,CHANNEL OVERRUN
5150 STS 010000,DRIVE RESPONSE ERR
5151 STS 004000,CXR ILL CMD
5152 STS 002000,CXR POWER FAIL
5153 STS 000200,CONTROL BUS OVERRUN
5155 STS 000040,ATTN INTR
5166 IFLE N-ZZ, .ERR REG OUT OF ORDER
5167 REPEAT N-ZZ-1, REGH [ASCIZ\????\]
5178 RHRGTB: REG 0,DRV CTL
5183 REG 5,DRV TRACK-SECTOR
5185 REG 7,DRV LOOK-AHEAD
5186 REG 10,DRV SERIAL NO
5188 REG 12,DRV DESIRED CYL
5189 REG 13,DRV CURRENT CYL
5198 REG 74,CHANNEL BUFFER
5201 EXPUNGE REG,REGH,XX,YY,ZZ
5203 ; BITS IN DIB REGISTER
5205 DIBSTS: STS 004000,CTL-TO-DRIVE
5206 STS 002000,CTL BUS TIMEOUT
5207 STS 001000,CTL BUS PARITY
5208 STS 000400,DIB DATA LATE
5209 STS 000200,DIB ILL CMD
5212 ; DRIVE STATUS REGISTER
5214 STSSTS: STS 1,FWD 5 IPS
5216 STS 4,INNER GUARD BAND
5220 STS 100,VOLUME VALID
5222 STS 400,CONN THIS CTRLR
5223 STS 2000,LAST SECTOR XFERD
5225 STS 10000,MEDIUM ONLINE
5226 STS 20000,POSITIONING IN PROGRESS
5228 STS 100000,ATTENTION
5231 ; DRIVE ERROR REGISTER 1
5233 ER1STS: STS 1,ILL FUNC
5235 STS 4,REG MOD REFUSE
5236 STS 10,BUS PARITY ERR
5237 STS 20,PACK FORMAT ERR
5238 STS 40,WRITE CLOCK FAIL
5239 STS 100,ECC HARD ERR
5240 STS 200,HEADER WRONG
5241 STS 400,HEADER CRC ERR
5242 STS 1000,ADDR OVERFLOW
5243 STS 2000,INVALID ADDR
5244 STS 4000,WRITE LOCK ERR
5245 STS 10000,DRV TIMING ERR
5246 STS 20000,OP NOT COMPLETE
5248 STS 100000,DATA CHECK
5251 ; DRIVE ERROR REGISTER 2
5253 ER2STS: STS 1,WRITE CURRENT UNSAFE
5254 STS 2,CURRENT SINK FAILURE
5255 STS 4,WRITE SELECT UNSAFE
5256 STS 10,CURRENT SWITCH UNSAFE
5257 STS 20,MOTOR SEQUENCE ERR
5258 STS 40,TRANSITIONS DET FAIL
5259 STS 100,TRANSITIONS UNSAFE
5260 STS 200,"UNSAFE EXCEPT R/W"
5261 STS 400,WRITE READY UNSAFE
5262 STS 1000,MULTIPLE HEAD SELECT
5263 STS 2000,NO HEAD SELECT
5264 STS 4000,INDEX ERROR
5265 STS 10000,30 VOLT UNSAFE
5266 STS 20000,PHASE LK OSC UNSAFE
5267 STS 100000,AC UNSAFE
5270 ; DRIVE ERROR REGISTER 3
5272 ER3STS: STS 1,PACK SPEED UNSAFE
5273 STS 2,VELOCITY UNSAFE
5274 STS 10,UNSAFE EXCEPT R/W
5277 STS 40000,SEEK INCOMPLETE
5278 STS 100000,OFF CYLINDER
5281 ; DRIVE OFFSET REGISTER
5283 OFSSTS: STS 2000,HDR COMPARE INH
5284 STS 4000,ECC INHIBIT
5285 STS 10000,PDP-11 FORMAT
5290 ;PRINT STATUS OF T300 (ERROR FROM LAST COMMAND)
5291 ;LATER THIS WILL BE INTEGRATED INTO GSTS
5294 T3STS: INSIRP PUSH P,[A B C D T I K]
5295 TYPE T-300 AND 2561 STATUS:
5298 TRNN D,%DFRST+%DFCQE+%DFNXM+%DFPAR
5300 MOVEI C,[ STS %DFRST,CONTROLLER POWER-CYCLED AND RESET
5301 STS %DFCQE,COMMAND-QUEUE ERROR
5303 STS %DFPAR,RQB PARITY ERROR
5305 MOVSS D ;TYPSTS WANTS BITS IN LEFT HALF
5307 TYPE , PDP-11 ERROR ADDRESS=
5308 LDB A,[000200,,DSCFLT]
5317 JRST [ TYPE ILLEGAL FAULT CODE=
5321 MOVE B,(D)[ [ASCIZ/FAULT CODE 0?/]
5322 [ASCIZ/DRIVE NOT READY/]
5323 [ASCIZ/ILLEGAL HEAD OR SECTOR/]
5324 [ASCIZ/SEEK TIMEOUT/]
5325 [ASCIZ/DISK STATUS BAD AFTER ON-CYLINDER (FAULT CODE 4)/]
5326 [ASCIZ/TIME OUT WRITING SECTOR ID (FAULT CODE 5)/]
5327 [ASCIZ/FIFO ERROR IN FORMAT WRITE (FAULT CODE 6)/]
5328 [ASCIZ/WRITE TIMEOUT (FAULT CODE 7)/]
5329 [ASCIZ/SEEK TIMEOUT (FAULT CODE 10)/]
5330 [ASCIZ/HEADS NOT LOADED/]
5331 [ASCIZ/READ TIMEOUT (FAULT CODE 12)/]
5332 [ASCIZ/INDEX TIMEOUT (FAULT CODE 13)/]
5333 [ASCIZ/SECTOR TIMEOUT (FAULT CODE 14)/]
5334 [ASCIZ/FAULT CODE 15?/]
5335 [ASCIZ/DMA TIMEOUT (FAULT CODE 16)/]
5336 [ASCIZ/DMA TIMEOUT IN ECC (FAULT CODE 17)/] ]
5339 ;COMMAND OK, CHECK ORDINARY ERROR STATUS
5340 T3STS2: MOVE D,DSCSTS
5341 MOVEI C,[ STS %DSRTR,COMMAND WAS RETRIED
5342 STS %DSECH,UNCORRECTABLE DATA ERROR
5343 STS %DSECC,CORRECTED DATA ERROR
5345 STS %DSHCE,HEADER COMPARE ERROR
5346 STS %DSPRT,WRITE-PROTECTED SECTOR
5347 STS %DSALT,ALTERNATE-SECTOR FLAG
5349 STS %DSSKE,SEEK ERROR
5350 STS %DSOFL,DRIVE OFF-LINE OR FAULT
5351 STS %DSFLT,DRIVE FAULT
5352 STS %DSNXM,PDP11 MEMORY NXM
5353 STS %DSPAR,PDP11 MEMORY PARITY ERROR
5354 STS %DSSFL,SYSTEM FAULT
5355 STS %DSWLK,DRIVE WRITE-LOCKED
5357 MOVSS D ;TYPSTS WANTS D IN LEFT HALF
5359 PUSHJ P,CRR ;NOW SHOW DISK COMMAND AND ADDRESS
5364 MOVEI B,[ASCIZ/(UNKNOWN?)/]
5366 MOVEI B,[ASCIZ/(SENSE)/]
5368 MOVEI B,[ASCIZ/(DIAGNOSTICS)/]
5370 MOVEI B,[ASCIZ/(RECALIBRATE)/]
5372 MOVEI B,[ASCIZ/(SEEK)/]
5374 MOVEI B,[ASCIZ/(WRITE)/]
5376 JRST [ CAIG A,%DMRED+10
5377 MOVE B,(A)[ [ASCIZ/(READ)/]
5378 [ASCIZ/(READ EARLY-DATA-STROBE)/]
5379 [ASCIZ/(READ LATE-DATA-STROBE)/]
5380 [ASCIZ/(READ POSITIVE-CYLINDER-OFFSET)/]
5381 [ASCIZ/(READ NEGATIVE-CYLINDER-OFFSET)/]
5382 [ASCIZ/(READ EARLY-DATA-STROBE POSITIVE-CYLINDER-OFFSET)/]
5383 [ASCIZ/(READ EARLY-DATA-STROBE NEGATIVE-CYLINDER-OFFSET)/]
5384 [ASCIZ/(READ LATE-DATA-STROBE POSITIVE-CYLINDER-OFFSET)/]
5385 [ASCIZ/(READ LATE-DATA-STROBE NEGATIVE-CYLINDER-OFFSET)/]
5404 SUBTTL READ & TYPE OUT HEADERS
5406 DC,[ ;FOR NOW, DC10 ONLY
5407 RDHDHD==20 ;2WORDS PER SEC, MANY SECS
5409 RDHEAD: JSR INIT ;READ ALL HEADERS ON A TRACK
5432 DPB A,[DSURF READHD]
5433 DATAO DC0,[DJMP READHD]
5437 JRST [ TYPE ERROR---
5442 RDHD2: MOVE D,HEADBF(T)
5445 JRST RDHD1 ;GONE AROUND ONCE
5449 LDB A,[DPKID HEADBF(T)]
5456 TLNE A,1000 ;INDIRECT BIT OF HEADER
5464 LDB A,[1600,,A] ;LENGTH FIELD
5466 LDB A,[270200,,HEADBF+1(T)] ;ANY NEXT-ADDRESS CODE?
5470 RDHD3: MOVE A,HEADBF+1(T)
5472 JRST [ MOVEI B,[ASCIZ /,WRITE PROTECT/]
5475 RDHD6: SETO C, ;PARITY
5485 MOVEI B,[ASCIZ /,BAD PARITY!!/]
5492 READHD: DSPC+DSWIDX+DSWNUL+DSCRHD ;WAIT FOR INDEX, THENREAD HEADERS
5493 QCOPY HEADBF,RDHDHD*NSECS
5496 HEADBF: BLOCK RDHDHD*NSECS
5502 [ASCIZ /,END-OF-TRACK/]
5503 [ASCIZ /,END-OF-CYLINDER/]
5504 [ASCIZ /,END-OF-DISC/]
5535 RECAL: CONO DC0,DCCSET+DCDENB
5537 SKIPL DRIVE(T) ;SKIP IF DRIVE NOT KNOWN TO BE DEAD ALREADY
5538 JRST [ SETZM QACT(I)
5541 DPB T,[DUNFLD STOSTS]
5542 DATAO DC0,[DJMP STOSTS]
5546 TDNN T,[DDSONL] ;ON LINE
5551 CONSO DC1,20 ;OFF LINE OR MULTIPLE SELECT
5553 OFFL1: SETZM QACT(I)
5555 POPJ P, ;IN GOGO MODE, WILL CHECK FOR RIGHT PACKS MOUNTED
5556 TYPE Drive off line #
5570 DATAO DPC,[DEASEC 776]
5577 JRST RESET9 ;IN GOGO MODE, WILL CHECK FOR RIGHT PACKS MOUNTED
5587 JRST RESET9 ;IN GOGO MODE, WILL CHECK FOR RIGHT PACKS MOUNTED
5588 TYPE NO SUCH DRIVE #
5596 DATAO DPC,[DEASEC 776]
5599 RESET9: SETZM QACT(I) ;THIS DRIVE LOST
5606 RESET: PUSHJ P,RECAL
5607 MOVE T,QTRAN(I) ;GET PACK ID FROM HARDWARE
5608 DPB T,[DUNFLD GPKID]
5613 CONO DC0,DCCSET+DCDENB
5614 DATAO DC0,[DJMP GPKID]
5621 DRST: DSPC+DSRCAL+DSWINF+DUNENB
5622 GPKID: DSPC+DSCRHD+DSWNUL+DUNENB+TUTCYL_11.+TUTSRF_6+TUTSEC
5635 HRRZ A,SQACT ;SYSTEM QACT TABLE
5639 .GETLOC A, ;COPY SYSTEMS QACT
5640 SKIPE A ;0 MEANS ON-LINE TO ITS
5646 OFFLIN: TYPE Drive off line #
5651 OFFL2: SETZM QACT(I)
5658 RESET: MOVE T,QTRAN(I) ;GET PHYS DRIVE
5664 JRST [ SETZM QACT(I) ;DRIVE ALREADY KNOWN TO BE DOWN
5667 MOVE A,[%HRDCL,,%HMCLR] ;CLEAR THE DRIVE
5669 JRST RESETL ;HMM, NO DRIVE
5670 MOVE A,[%HRDCL,,%HMRDP] ;I SAID, "CLEAR THE DRIVE"!
5673 MOVE A,[%HROFS,,0] ;CLEAR THE FRIGGING DRIVE!!!
5676 MOVSI A,%HRTYP ;GET DRIVE TYPE
5682 JRST RESETL ;FIXED HEADS?
5683 MOVE A,[%HRDCL,,%HMACK] ;PACK ACKNOWLEDGE
5690 JRST RESET4 ;PACK NOT MOUNTED
5691 MOVE A,[%HRDCL,,%HMREC] ;RECALIBRATE
5694 MOVEI B,80000. ;A LITTLE OVER 1/2 SEC
5695 RESET0: MOVSI A,%HRSTS ;GET STATUS
5697 JRST RESETL ;DRIVE VANISHED?
5699 JRST RESETL ;GOT ERROR RECALIBRATING?
5700 TRC A,%HSVV+%HSMOL+%HSRDY ;CHECK FOR GOOD BITS
5701 TRCE A,%HSVV+%HSMOL+%HSRDY
5702 SOJG B,RESET0 ;BITS NOT ALL ON, WAIT MORE
5703 JUMPG B,RESET5 ;WON.
5704 ;TIMED OUT, FALL INTO RESETL
5706 RESETL: SETZM QACT(I) ;LOST
5708 JRST POPAJ ;IN GOGO MODE, WILL CHECK FOR RIGHT PACKS MOUNTED
5713 TYPE MISC ERROR DRIVE #
5714 MOVEI A,GSTS ;CALL GSTS BEFORE RETURNING
5719 RESET2: TYPE ILC OR RAE DRIVE #
5722 RESET1: TYPE DRIVE NOT PRESENT #
5723 RESET3: HRRZ A,QTRAN(I)
5728 RESET4: SETZM QACT(I)
5730 JRST POPAJ ;IN GOGO MODE, WILL CHECK FOR RIGHT PACKS MOUNTED
5731 TYPE DRIVE OFF LINE #
5735 JRST POPAJ ;PACK NOT FORMATTED YET
5743 MOVE A,[-2_4,,SLVIOWD-1]
5750 MOVE A,[%HRCTL,,SLVICWA_6+%HMRHD]
5757 HRRZ A,SLVIOWD+1 ;GET I.T.S. PACK NUMBER
5764 MOVEI D,%DMSNS ;FIRST, SENSE STATUS (RECALIBRATE HANGS IF
5765 PUSHJ P,T3CMD ; DRIVE OFF LINE, AND TIMEOUT LEAVES 11 WEDGED)
5766 JUMPL T,T3RSTL ;TIMEOUT, 11 MUST BE DOWN
5767 TDNE T,[%DFRST,,%DSOFL+%DSSFL]
5768 JRST T3RSTL ;DRIVE OFF-LINE, LEAVE IT ALONE
5769 MOVEI D,%DMREC ;SEND A RECALIBRATE
5771 JUMPN T,T3RSTL ;JUMP IF ERROR
5772 SETOM PKNUM(I) ;PACK NUMBER NOT GOTTEN FROM HARDWARE!
5776 T3RSTL: SETZM QACT(I) ;OFF LINE
5782 ;DO COMMAND IN D ON DRIVE NUMBER IN I, RETURN STATUS IN T (0 IF OK)
5783 ;LH(T) GETS DSCFLT, RH(T) GETS DSCSTS
5784 ;YOU MUST SET UP DSCCYL, ETC. BEFORE CALLING
5791 KL,[ SWPUO 0 ;UNLOAD PAGE 0 FROM THE CACHE
5797 KL,[ SWPUO 0 ;UNLOAD PAGE 0 FROM THE CACHE
5798 CONSZ APR,200000 ;AGAIN SO 11 WILL SEE DSCREQ ON IN INTERRUPT
5801 CONO DLC,100040 ;INTERRUPT 11
5802 MOVEI T,60000. ;I THINK THIS TIMEOUT IS ABOUT 3 SECONDS
5803 ;UNFORTUNATELY, THIS TIMEOUT DOESN'T WORK ANYWAY
5804 ;REALLY, BECAUSE IF DRIVE 0 IS OFFLINE THE
5805 ;CONTROLLER HANGS AND EXECUTES COMMANDS WRONG
5806 ;AND OTHERWISE LOSES ITS ASS.
5808 KL,[ SWPUO 0 ;UNLOAD PAGE 0 FROM THE CACHE
5809 CONSZ APR,200000 ;AGAIN SO DSCDON GETS PICKED UP FROM MAIN MEMORY
5814 JUMPLE T,[ MOVSI T,(SETZ) ;SIGNAL TIMEOUT (DRIVE OFFLINE?)
5815 POPJ P, ] ;DSCFLT & DSCSTS WILL SAY NON-ERROR
5817 CONO DLC,10 ;11 IS TRYING TO INTERRUPT -10, TURN IT OFF
5820 TRZE T,%DSRTR+%DSECC ;THESE ARE NOT ERRORS
5826 SUBTTL READ & WRITE TUT
5828 ;DISK NUMBER IN I, CORE ADDR IN A, ERROR RETURN HAS T NEGATIVE
5834 WRTUT0: PUSHJ P,WRITE
5846 RDTUT0: PUSHJ P,READ
5854 TS,[ TUTPAG==600000 ;READ TUT BY MAPPING IN ABS PAGE
5855 MOVE T,NTBL(I) ;SIZE OF TUT ON THIS DRIVE
5856 MOVE J,[SQUOZE 0,QTUTO] ;AND WHERE ARE THEY LOCATED?
5861 ADD J,I ;-> -> FIRST BLOCK THIS TUT
5866 LSH J,-10. ;FIRST BLOCK# OF TUT
5868 HRL J,I ;AOBJN PTR FOR BLOCKS OF THIS TUT
5869 RDTUT1: .CALL [ SETZ
5871 MOVEI 210000 ;READ ONLY
5874 MOVEI 400000 ;FROM SYSTEM
5881 BLT I,1777(A) ;COPY IN A BLOCK OF TUT
5889 .VALUE ;OLDER FORMAT?
5896 WRITE: HRRZM J,LBLK'
5907 READ: MOVEI T,DRD ;A/ CORE LOCN, I/ DRIVE J/TRACK #
5918 MOVE TT,QTRAN(I) ;GET PHYSICAL DRIVE #
5931 ADDI T,NCYLS+XCYLS ;MAP INTO 2ND HALF OF CALCOMP
5939 TLZ T,340000 ;CHANGE TO READ COMPARE
5943 MOVEI T,0 ;SPEED IS OF THE ESSENCE - TRY ONLY ONCE
5944 RW2: CONO DC0,DCCSET\DCDENB
5946 MOVSI TT,3 ;WAIT AT MOST 3 SECONDS
5962 DCOPY .(-2000_2&37774)
5963 DCOPY RXWDS(-4_2&37774)
5965 DCCOMP .(-2000_2&37774)
5966 DCCOMP RXWDS (-4_2&37774)
5970 DCOPY .(-2000_2&37774)
5971 DCOPY WXWDS(-4_2&37774)
5973 DCCOMP .(-2000_2&37774)
5974 DCCOMP WXWDS(-4_2&37774)
5984 JRST [ .OPEN QIN,[.BII,,'DSK
5990 .VALUE ;SOME RANDOM DISK BLOCK
5991 .SUSET [.SSNAM,,USRNAM]
5992 .OPEN QIN,[.BII,,'DSK
6002 \fRP,[ ;RP10 I/O - FALL IN FROM WRITE
6020 DRD: DREADC+SLVICWA+5000 ;DISABLE PARITY ERROR STOPS
6023 ;VARIABLES SET UP TO CONTROL TRANSFER
6024 ;WHEN AN ERROR OCCURS, IT GOES INTO SECTOR AT A TIME MODE, AND
6025 ;THESE VARIABLES ARE STEPPED ALONG TO REFLECT THAT.
6026 RPAOBJ: 0 ;AOBJN POINTER TO WORDS TO BE TRANSFERRED
6027 RPIOCY: 0 ;CYLINDER TO START AT
6028 RPIOHD: 0 ;HEAD TO START AT
6029 RPIOSC: 0 ;SECTOR TO START AT
6030 RPIOOP: 0 ;COMMAND WORD. SLVICWA ALREADY ADDED IN
6033 ;HIGH-LEVEL I/O ROUTINE. TRIES TO DO IT ALL AT ONCE,
6034 ;IF THAT LOSES TWICE TRIES IT A SECTOR AT A TIME.
6035 ;IF HCRASH IS SET, TRY ONLY ONCE.
6036 ;SMASHES T, TT. RETURNS T NEGATIVE IF ERROR.
6042 PUSHJ P,RPXIO ;TRY IT
6049 JRST RPIO9 ;GIVE UP IF HCRASH
6050 PUSHJ P,RPRCAL ;RECALIBRATE, THEN
6051 PUSHJ P,RPXIO ;TRY IT AGAIN
6059 ;SECTOR AT A TIME MODE
6062 JRST RPIO9 ;TRANSFER EXHAUSTED, WON
6066 MOVEI T,10. ;TRY THIS SECTOR 10 TIMES
6069 JUMPL T,RPIO9 ;GIVE UP
6070 MOVE T,[200,,200] ;ADVANCE TO NEXT SECTOR
6081 JRST 4,. ;CYLINDER OVERFLOW?
6083 ;LOW-LEVEL IO, JUST DO THE OPERATION SPECIFIED IN THE VARIABLES.
6086 RPXIO: MOVEI TT,SLVIOWD ;SET UP DF10 COMMAND
6090 PUSHJ P,SEEK ;MAKE SURE AT DESIRED CYLINDER
6091 JRST POPTJ ;SEEK FAILED
6093 MOVE A,RPIOOP ;SET UP RP10 DATAO
6104 SKIPN HCRASH ;IF HCRASH, MAY BE MONITORING SOMETHING IN LIGHTS?
6106 DATAO DPC,A ;ISSUE COMMAND
6107 CONSO DPC,DONE ;AWAIT DONE
6109 CONSZ DPC,ALLER ;SKIP-RETURN UNLESS ERROR
6111 HLRO TT,RPAOBJ ;SEEMS SUCCESSFUL, CHECK THE CHANNEL CONTROL WORD STORED
6113 SUB A,TT ;SUPPOSED END OF TRANSFER
6116 DF10FK: POPJ P, ;CHANNEL TRYING TO FUCK YOU OVER
6119 ;RECALIBRATE UNIT IN I, SMASHES T,TT
6120 RPRCAL: CONO DPC,DCLEAR
6122 DPB I,[DUNFLD T] ;LEAVE PROPER UNIT SELECTED FOR GETSTS
6123 DATAO DPC,T ;CLEAR ATTNS
6126 RPRCL1: DATAI DPC,TT
6130 POPJ P, ;NO SUCH DRIVE
6132 JRST RPRCL1 ;AWAIT ATTENTION
6133 DATAO DPC,T ;GOT ATTENTION, CLEAR IT
6134 RPRCL2: TLNE TT,(ONCYL+SKINC)
6137 JRST RPRCL2 ;ON CYLINDER SOMETIMES TAKES A WHILE TO SET
6139 ;SEEK TO CYLINDER IN RPIOCY ON UNIT I, SMASHES T,TT, SKIPS ON SUCCESS.
6142 SEEK1: CONSZ DPC,BUSY
6144 DATAO DPC,[DEASEC 776]
6156 DPB I,[DUNFLD T] ;LEAVE PROPER UNIT SELECTED FOR GETSTS
6157 PUSHJ P,RPRCL1 ;AWAIT COMPLETION
6158 TLNE TT,(ONCYL) ;SUCCEED IF ON CYLINDER
6160 SOSGE T,SEEKC ;COUNT FAILURES
6162 PUSHJ P,RPRCAL ;RECALIBRATE
6163 JRST SEEK1 ;AND TRY AGAIN
6165 \fRH,[ ;RH10 I/O - FALL IN FROM WRITE
6167 ;ENTER WITH: A ADDRESS, J BLOCK NUMBER, I VIRTUAL UNIT
6168 .SEE RHCMD ;VARIABLES CONTROLLING WHAT GOES ON HERE
6169 ;INSIDE RW2 TT GENERALLY HAS THE DISK COMMAND AND T HAS THE RETRY COUNT
6170 ;ONLY T AND TT CLOBBERED
6171 ;ON RETURN T MINUS IF ERROR
6174 READ: MOVEI TT,%HMRED
6184 IDIVI TT,NBLKSC ;TT:=CYLINDER, T:=BLOCKS INTO CYLINDER
6185 HRLZM TT,RHPGA ;SAVE CYLINDER
6186 MOVE TT,T ;GET BLOCKS INTO CYLINDER
6187 IMULI TT,SECBLK ;SECTORS INTO CYLINDER
6188 IDIVI TT,NSECS ;TT:=HEAD, T:=SECTOR
6189 LSH TT,8 ;FORM ADDRESS WORD
6191 HRRM TT,RHPGA ;COMPLETE THE ADDRESS
6192 MOVEI T,-1(A) ;SET UP IOWD TO TRANSFER ONE BLOCK
6195 ;ENTER HERE WITH RHCMD, RHIOW, AND RHPGA SET UP. I HAS UNIT#.
6196 RW1: MOVEI T,5 ;INIT LOSAGE COUNT
6199 ;HERE TO RETURN. T SAYS WHETHER WINNING OR LOSING.
6200 RW5: MOVE A,[%HRDCL,,%HMCEN] ;RETURN TO CENTER-LINE IF NECESSARY
6206 MOVE A,RHIOW ;RESTORE A
6212 JRST RWL0 ;SPEED IS OF THE ESSENCE, TRY ONLY ONCE
6213 PUSHJ P,RW2 ;HMM, TRY AGAIN
6214 JRST RWLOSS ;STILL LOSING, COGITATE
6215 JRST RW5 ;WINNING NOW
6217 RWLOSS: MOVSI A,%HROFS ;ATTACK OFFSET REGISTER
6218 HRR A,OFFSTB(T) ;SET APPROPRIATE OFFSET VALUE
6219 SETOM OFFSTF' ;REMEMBER TO RETURN TO CENTERLINE LATER
6222 MOVE A,[%HRDCL,,%HMOFS]
6225 MOVEI A,20000. ;WAIT 10 MS OR SO FOR GOOD LUCK
6227 PUSHJ P,RW2 ;TRY IT NOW
6228 SOJGE T,RWLOSS ;LOSE, TRY WITH DIFFERENT OFFSET
6229 JUMPGE T,RW5 ;WON, SO TAKE WIN RETURN
6230 RWL0: SETO T, ;COMPLETE LOSS, RETURN NOW
6239 \f;RH10 I/O ROUTINE PROPER
6240 ;FIRST STEP IS TO SET UP CHANNEL COMMAND LIST
6241 RW2: MOVE TT,RHIOW ;SET UP ADDRESSES
6245 ;RE-ENTER HERE AFTER ECC ERROR
6248 MOVE A,[-6,,SLVIOWD] ;POINTS TO WHERE CCWS WILL BE STORED
6249 HLRO C,RHTIOW ;MINUS NUMBER OF WORDS TO TRANSFER
6251 HRRZ B,RHTIOW ;ADDRESS MINUS ONE
6252 RW2CC1: MOVN TT,C ;WORDS TO TRANSFER IN THIS CCW
6253 CAIL C,40000-200 ;WC IS ONLY A 14-BIT FIELD
6255 MOVEM B,(A) ;STORE CA
6256 DPB TT,[$DFWC (A)] ;STORE WC
6257 ADD C,TT ;LESS WORDS TO DO
6258 SUB B,TT ;ADVANCE ADDRESS
6259 AOBJP A,[JRST 4,.] ;ADVANCE CCW PTR, HALT IF TOO BIG!
6260 JUMPG C,RW2CC1 ;NEED MORE WORDS
6261 SETZM (A) ;END CCW LIST
6262 HRRZI A,SLVIOWD ;POINT CHANNEL AT IT
6264 SETZM SLVICWA+1 ;INIT FOR CONTROL WORD WRITING
6267 MOVEI A,SLVICWA ;BUILD DATAO CMD
6270 TLO TT,%HRCTL ;FILL OUT COMMAND WORD
6271 ;NOW BEFORE GIVING COMMAND CHECK STATUS
6272 CONSZ DSK,%HIBSY ;WAIT FOR DSK CONTROL
6274 CONO DSK,%HOCLR ;CLEAR ANY LEFT-OVER ERROR INDICATORS
6275 RW2A: MOVSI A,%HRSTS ;CHECK DRIVE STATUS
6277 JRST RW3 ;DRIVE VANISHED??
6278 TRNE A,%HSPIP ;WAIT FOR POSITIONING
6279 JRST RW2A ;(MIGHT BE OFFSETTING HEADS?)
6280 TRNE A,%HSERR ;ANY ERRORS IN DRIVE?
6281 JRST RW6 ;YES, TRY TO RECOVER
6282 TRC A,%HSVV+%HSMOL+%HSRDY ;CHECK FOR ALL READY BITS ON
6283 TRCE A,%HSVV+%HSMOL+%HSRDY
6284 JRST RW3 ;NOT READY??
6285 HLRZ A,RHTPGA ;SET CYLINDER
6289 HRRZ A,RHTPGA ;SET TRACK-SECTOR
6293 KL,[ MOVE A,RHTIOW ;SWEEP THE CACHE
6294 AOS A ;RH ADDRESS OF BUFFER, LH - # WDS
6297 TLO A,777000 ;A NOW HAS AOBJN PTR TO PAGES
6298 RWSWP3: TRNE TT,10 ;SWEEP ONE PAGE
6299 SWPIO (A) ;IF READING, INVALIDATE
6301 SWPUO (A) ;IF WRITING, UNLOAD
6302 CONSZ APR,200000 ;WAIT UNTIL SWEEPER WAKES
6305 SWPUO 0 ;STORE CHANNEL PROGRAM IN CORE
6311 RWGO: MOVE A,TT ;ISSUE I/O COMMAND
6314 CONSO DSK,%HIDONE ;WAIT FOR COMPLETION
6316 MOVSI A,%HRSTS ;CHECK DISK STATUS, ERRORS DON'T ALWAYS SHOW UP IN CONI
6322 JRST POPJ1 ;NO ERROR, SKIP RETURN FROM RW2
6323 ;FOLLOWING TWO LINES CAUSE ECC NOT TO WORK
6325 ; POPJ P, ;NOT DRIVE EXCEPTION, PROBABLY CORRIGIBLE BY RETRY
6326 TRNN A,%HSERR ;ANYTHING IN ERR REGS?
6327 JRST RW3 ;FOO, WHAT IS GOING ON??
6328 MOVSI A,%HRER2 ;MAKE SURE NO UNSAFES
6336 MOVSI A,%HRER1 ;GET ERROR1 REG
6339 TRNE A,077067 ;GROSS ERROR?
6340 JRST RW3 ;YES, ABORT
6341 TRZE A,100000 ;SEE IF CORRECTABLE DATA ERROR
6342 JUMPE A,RWECC ;YES, GO FIX IT
6343 POPJ P, ;ERROR, BUT RETRY MAY WIN
6345 RW6: MOVE A,[%HRDCL,,%HMCLR] ;ERROR IN DRIVE, TRY CLEARING
6353 ;LOST, FALL INTO RW3
6355 RW3: POP P,(P) ;UNCORRECTABLE ERROR, RW FAILS
6358 ;ERROR CORRECTION CODE -- TAKEN FROM MAINDEC-10-DDRPF
6359 ; THAT CODE HAD NO HOPE WHATSOEVER OF WORKING. RETAKEN FROM ITS.
6360 ; THAT CODE DIDN'T WORK EITHER. TAKEN FROM NEWER ITS.
6362 RWECC: TRNN TT,10 ;SKIP IF READ
6363 POPJ P, ;RETRY IF WRITE
6364 INSIRP PUSH P,[B W U J K H]
6365 DW1==W ;FIRST WORD IN ERROR
6366 DW2==U ;SECOND WORD IN ERROR
6367 EP1==J ;FIRST WORD OF ERROR PATTERN
6368 EP2==K ;SECOND WORD OF ERROR PATTERN
6369 ADR==H ;ADDRESS OF LOSING WORDS
6371 SKIPN A,SLVICWA+1 ;GET ADDRESS OF LAST WORD TRANSFERRED
6372 JRST 4,.-1 ;CHANNEL SHOULD HAVE STORED CONTROL WORD
6373 SOS ADR,A ;LAST WORD TRANSFERRED (SUPPOSEDLY)
6374 ANDI ADR,-200 ;IN ANY CASE, THIS MAKES ADR -> START OF SECTOR
6375 HRRZ A,RHTIOW ;ADR-1 OF START OF TRANSFER
6377 SOS B,A ;NUMBER OF WORDS SUCCESSFULLY TRANSFERRED
6378 MOVEM B,RHSUCC ;SAVE
6381 CAIL B,0 ;CHECK FOR CHANNEL LYING
6383 JRST RWECC3 ;FRAUD, TRANSFERRED NEGATIVE OR TOO MANY WORDS
6384 MOVSI A,%HRPOS ;GET ERROR POSITION
6387 SOJL A,RWECC3 ;WHICH IS OFF BY 1. IF ZERO, LOSE.
6388 IDIVI A,36. ;CONVERT TO WORD AND BIT
6390 MOVS DW1,(ADR) ;FETCH THE TWO LOSING WORDS
6392 MOVSI A,%HRPAT ;GET ERROR PATTERN
6397 ROTC EP1,(B) ;ALIGN IT
6398 XOR DW1,EP1 ;FIX THE ERRONEOUS BITS
6400 RWECCB: ;SET BREAK HERE IF DON'T TRUST...
6401 MOVSM DW1,(ADR) ;PUT CORRECTED DATA BACK
6403 INSIRP POP P,[H K J U W]
6405 AOS CERRS ;COUNT NUMBER OF TIMES ECC DONE
6406 MOVEI A,%HMCLR ;CLEAR THE ECC-ERROR CONDITION
6409 MOVEI A,200 ;ALLOW FOR THE SECTOR WE CORRECTED
6410 ADDB A,RHSUCC ;GET BACK NUMBER OF WORDS TRANSFERRED
6411 IDIVI A,200 ;NUMBER OF SECTORS TRANSFERRED INCLUDING CORRECTED ONE
6412 LDB B,[$HASEC RHTPGA] ;UPDATE DISK ADDRESS
6415 DPB B,[$HASEC RHTPGA]
6416 LDB B,[$HATRK RHTPGA]
6418 DPB A,[$HATRK RHTPGA] ;NO NEED TO IDIVI A,NHEDS SINCE ALL XFERS WITHIN CYLINDER
6419 MOVE A,RHSUCC ;NOW ADVANCE CCW
6424 JRST RW2OVR ;NOT EXHAUSTED, CONTINUE DISK XFER
6425 JRST POPJ1 ;ECC IN LAST SECTOR OF XFER, XFER COMPLETED SUCCESSFULLY
6427 RWECC3: INSIRP POP P,[H K J U W B]
6430 ;ROUTINES TO ACCESS RH10 CONTROLLER AND DRIVE REGISTERS
6433 ; A REGISTER NUMBER IN LH
6434 ; NON-SKIP RETURN IF RAE ERROR
6435 ; SKIP RETURN IF WIN
6438 ;SET REGISTER. TAKES DATA TO GO IN REGISTER IN RH OF A
6439 ;CLOBBERS A (PROBABLY)
6441 RHSET: TLOA A,%HRLOD ;TELL HARDWARE IS SET INSTEAD OF GET
6442 ;AND FALL INTO RHGET
6444 ;GET REGISTER. RETURNS 16 BITS RIGHT-JUSTIFIED IN A
6447 TLO A,(I) ;INSERT PHYS DRV NO
6448 DATAO DSK,A ;TELL RH10 TO FETCH REGISTER
6449 MOVEM A,RHLAST' ;SAVE FOR REBUGGING
6450 MOVEI A,4 ;ENSURE 3 USEC DELAY BEFORE DATAI
6451 SOJG A,. ;TO ALLOW MASSBUS TRANSACTION TO COMPLETE
6452 DATAI DSK,A ;GET REG CONTENTS AND FLAGS
6453 TLNE A,%HDERR ;ERROR?
6454 JRST RHRAE ;YES, GO REPORT
6455 ANDI A,177777 ;MASK TO 16 BITS
6456 AOS (P) ;AND TAKE SUCCESS RETURN
6459 RHRAE: MOVSI A,%HRRAE+%HRLOD(I)
6460 DATAO DSK,A ;CLEAR RAE REGISTER IN CONTROLLER
6461 POPJ P, ;AND TAKE NON-SKIP RETURN
6463 ;DISK ROUTINE VARIABLES
6465 RHCMD: 0 ;%HMRED OR %HMWRT
6466 RHIOW: 0 ;IOWD -NWDS,,ADR-1 FOR TRANSFER
6467 RHTIOW: 0 ;TEMPORARY IOWD FOR CONTINUING FROM ECC
6468 RHPGA: 0 ;DISK ADDRESS CYL,,HED_8+SEC
6469 RHTPGA: 0 ;TEMPORARY DISK ADDRESS FOR CONTINUING FROM ECC
6470 RHSUCC: 0 ;NUMBER OF WORDS SUCCESSFULLY TRANSFERRED BEFORE ECC
6473 IFN T300P,[ ;T-300 I/O - FALL IN FROM WRITE
6475 ;ENTER WITH: A ADDRESS, J BLOCK NUMBER, I VIRTUAL UNIT
6476 ; TT %HMWRT OR %HMRED
6477 ;ONLY T AND TT CLOBBERED
6478 ;ON RETURN T MINUS IF ERROR
6480 T3IO: INSIRP PUSH P,[A B C D]
6482 CAIE TT,%HMRED ;GET READ OR WRITE COMMAND
6485 T3IO1: HRRZ A,J ;GUBBISH IN LH
6486 IDIVI A,NBLKC1 ;A CYLINDER, B BLOCK WITHIN CYLINDER
6488 IMULI B,SECBL1 ;B SECTOR WITHIN CYLINDER
6489 IDIVI B,NSECS1 ;B HEAD, C SECTOR
6492 MOVE B,-3(P) ;ORIGINAL ADDRESS
6493 HRLI B,730000 ;12-BIT BYTES, START WITH FIRST BYTE IN WORD
6494 MOVE C,[-4,,DSCPNT] ;SET UP BYTE POINTERS
6498 KL,[ SWPUA ;DUMP EVERYTHING OUT OF CACHE
6502 PUSHJ P,T3CMD ;PERFORM THE OPERATION
6503 JUMPE T,T3IO2 ;RETURN IF SUCCESS
6504 MOVE A,T ;SEE IF ERROR MAY BE RECOVERABLE
6505 TRZ A,%DSECH+%DSIDE+%DSHCE
6506 JUMPN A,T3IO3 ;IF IRRECOVERABLE
6507 TRNE D,%DMRED ;OR IF NOT A READ COMMAND
6508 CAIN D,%DMRED+10 ;OR IF TRIED ALL RECOVERY FEATURES
6509 T3IO3: TLOA T,(SETZ) ;ENSURE T NEGATIVE TO INDICATE ERROR
6510 AOJA D,T3IO1 ;OTHERWISE RETRY USING NEXT ERROR RECOVERY FEATURE
6511 T3IO2: INSIRP POP P,[D C B A]
6515 SUBTTL MISCELLANEOUS VARIABLES
6517 KL,SALVPF: JRST 4,. ;COME HERE IF PAGE FAIL IN SALVAGER
6526 THTPN: 0 ;TAPE #,,REEL # IN THIS DUMP
6527 THDATE: 0 ;TAPE CREATION DATE
6528 THTYPE: 0 ;0=>RANDOM >0 => FULL <0 => INCR
6531 MHBLK: -LMHBLK,,0 ;FILE HEADER BLOCK
6536 MHDATE: 0 ;CREATION DATE
6538 LNKFLG: 0 ;NONZERO => RELOADING LINK
6541 LNKSNM: 0 ;LINK SNAME
6554 SBTAB: -1 ;FOR PATCHING
6558 MFDBK: MFDBLK ;SPECIAL RESERVED BLKS
6559 ;TUT USED TO BE HERE, BUT NO LONGER
6562 ;THIS IS AN ARRAY INDEXED BY UNIT GIVING THE NUMBER
6563 ;OF BLOCKS IN THE TUT ON THAT UNIT.
6564 ;THESE BLOCKS ARE ALWAYS RIGHT BEFORE THE MFD.
6566 IFE T300P, REPEAT NUNITS, NTUTBL
6568 REPEAT T300P, NTUTBL
6569 REPEAT NUNITS-T300P, NTUTB1
6572 RXWDS: BLOCK 4 ;THE EXTRA WORDS
6577 NOLPT: 0 ;-1 FOR NO LPT
6578 LPBUST: -1 ;-1 LPT IS BUSTED DON'T KEEP ASKING
6579 PUNCH: 0 ;SET TO -1 WITH DDT IF COPY TTY OUTPUT TO PUNCH
6580 HCRASH: 0 ;SET TO -1 WITH DDT IF EMERGENCY DUP AFTER HEAD CRASH
6581 ;SACRAFICE EVERYTHING FOR SPEED SINCE PACK IS BEING SCRAPED BY HEADS
6582 NUDS: NTS,[NUDSL]+0 ;NUMBER OF USER DIRECTORY BLOCKS
6583 ADRSET: 0 ;ADDRESS SET
6584 FMBLK: 0 ;FROM BLOCK
6588 SHARED: 0 ;NUMBER OF SHARED BLOCKS
6589 GOGOX: 0 ;-1 FOR AUTOMATIC MODE
6590 NOQUES: 0 ;-1 TO ASK NO QUESTIONS (ONLY EFFECTIVE IN GOGOX MODE)
6591 MDSK: 0 ;DISK TO GET MFD FROM
6592 UDSK: 0 ;DSK TO GET UFD'S FROM
6593 CKFLSW: 0 ;CHECK FILES FOR CLOBBERED BLOCKS
6594 MFDWRT: 0 ;MFD CHANGED
6595 TUTDFR: 0 ;FLAG TO SHOW TUT CHANGED
6596 TTDFPS: 0 ;COUNT FROBS PER LINE WHEN PRINTING TUT
6597 LFILES: 0 ;NUMBER OF FILES IN DIRECTORY
6598 USRNAM: 0 ;M.F.D. USR NAME
6599 UFDLOS: 0 ;SOME GARBAGE IN UFD
6600 UFDSEE: 0 ; -1 IF A STRANGE UFD, PRINT WHOLE THING
6601 FILEPK: 0 ; PACK FILE IS ON
6602 LAST: 0 ; LAST FILE IN UFD
6603 DBLK: 0 ;STORAGE FOR DIRECTORY NUMBER
6604 FILEER: 0 ;ERROR IN FILE
6605 BADFIL: 0 ; BLOCKS IN FILE WITH RETRIEVAL ERRORS
6606 XWDSEE: 0 ; -1 IF HAVENT TYPED EXTRA WORDS YET
6607 LASTQ: 0 ;STORAGE FOR Q
6608 NOTUT: 0 ;TUT NOT ACTIVE FOR THIS FILE
6609 LSTBLK: 0 ;LAST BLOCK STORAGE
6610 BLK: 0 ; LAST BLOCK READ OR WRITTEN FROM
6611 CKFIX: 0 ; -1 IF AUTO FIX RETRIEVAL POINTERS
6613 FUNIT: 0 ; UNIT FILE IS ON, -1 IF PACK NOT MOUNTED
6614 FERRS: 0 ;TRANSFER ERRORS
6615 CERRS: 0 ;ERRORS CORRECTED BY ECC LOGIC
6616 DUPRER: 0 ;DUP READ ERROR COUNT
6617 DUPWER: 0 ;DUP WRITE ERROR COUNT
6619 GARBF: 0 ;GARBAGE IN FREE AREA
6620 EXGARB: 0 ;EXTRA GARBAGE IN UFD
6621 MARKF: 0 ;MARKING PACK
6633 DC,[ 0 ;RH IS PHYSICAL DRIVE
6634 1 ;4.9 BIT MEANS SECOND HALF
6635 2 ;(NO LONGER DOES ANYTHING, NOW THAT MEMOWRECKS HAVE BEEN
6636 3 ; FLUSHED, BUT KEEP AROUND IN CASE EVER NEEDED AGAIN.)
6642 .ELSE REPEAT NDRIVE, .RPCNT ;OTHERWISE NOTHING SPECIAL
6644 IFN .-QTRAN-NUNITS,.ERR BARF AT QTRAN!!
6646 QTTBLI: REPEAT 36./TUTBYT+1, 440000+TUTBYT_6-TUTBYT_12.*.RPCNT,,
6649 TS, NQS: 0 ;SYSTEMS NUMBER OF DRIVES
6650 TS, SQACT: 0 ;LOCATION OF QACT IN SYSTEM
6651 TS, SALVRT: 0 ;DUMMY
6654 SNBLKS: NBLKS ;SYSTEM NBLKS (INIT'ED IN TS)
6655 DRIVE: REPEAT NDRIVE,-1 ;-1 IF DRIVE ON LINE
6656 QACT: REPEAT NUNITS,-1 ;-1 IF UNIT ACTIVE
6657 QPKN: REPEAT NUNITS,-1 ;PACK NUMBER ACCORDING TO TUT
6658 PKNUM: BLOCK NUNITS ;PACK NUMBER ACCORDING TO HARDWARE
6663 Q!A!O: REPEAT NUNITS,CONC A,\.RPCNT,
6677 REPEAT NUNITS,CONC A,\.RPCNT,: BLOCK 2000*MXTUTB
6682 RH, CYLSIZ==200*NHEDS*NSECS
6683 RP, CYLSIZ==NBLKSC*2000
6684 DC, CYLSIZ==NBLKSC*2004
6685 NTS, IFL .-CYLBUF-CYLSIZ,LOC CYLBUF+CYLSIZ
6689 IFN .-THEEND, .ERR CRUFT AFTER THEEND
6691 INFORM HIGHEST USED = ,\THEEND
6693 IFG THEEND-400000, .ERR TOO MOBY (MUST FIT IN 128K TO AVOID HOLE IF SOME MEM DOWN)
6694 ;This error check doesn't really matter for MC much, since memory has
6695 ;to be switched out in 128K increments, which means that the system
6696 ;can't work with any holes in the low 256K.
6698 IF2, NTS, KL, PAG=<BLKO PAG,>-<BLKO>
6700 TS, END DDT ;ALWAYS STARTED BY <COMMAND>
\eG
6701 NTS,END <MEMSIZ-4000> ;DON'T CLOBBER I.T.S. START ADDR WHEN LOADED TOGETHER