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.
43 PRINTC "Configuration (KSRP06, KSRP07, KSRM03, KSRM80 or ASK) ? "
76 IFNDEF NUDSL,[ PRINTC /No known configuration for "MACH".
81 SETF [Readin Mode Paper Tape?]HRIFLG
82 SETF [Assemble BOOT? (If no, full DSKDMP)]BOOTSW
84 SETF [RH11/RP06 disk system?]RP06P
86 SETF [RH11/RP07 disk system?]RP07P
88 SETF [RH11/RM03 disk system?]RM03P
90 SETF [RH11/RM80 disk system?]RM80P
92 SETF [RH10 (MC-KL) disk control?]RH10P
94 SETF [AIKA disk control? (no => RP02/RP03)]DC10P
97 IFN RP06P+RP07P, RM03P==0
98 IFN RP06P+RP07P+RM03P, RM80P==0
99 IFN RP06P+RP07P+RM03P+RM80P, RH10P==0
100 IFN RP06P+RP07P+RM03P+RM80P+RH10P, DC10P==0
101 IFN RP06P+RP07P+RM03P+RM80P+RH10P+DC10P, RP10P==0
102 IFE RP06P+RP07P+RM03P+RM80P+RH10P+DC10P, RP10P==1
104 IFE BOOTSW, SETF [Number of dirs? (DM-KA: 200., ML-KA: 250., AI-KA: 440., all others: 500.)]NUDSL
106 SETF [KS10 processor?]KS10P
107 IFE KS10P, SETF [KL10 processor? (no => KA10)]KL10P
109 IFN KS10P+KL10P, KA10P==0
110 IFE KS10P+KL10P, KA10P==1
112 RH11P==:RP06P+RP07P+RM03P+RM80P
131 NOSYMS ;MAKE PAPER TAPE SHORTER
139 BLKIN=5 ;PSEUDO-CORE BLOCK IN CBUF
140 WRITE=6 ;NEG MEANS DUMP, RH 0 OR WRBIT
141 DIFF=7 ;DIFF CONO ALSO TEMP
142 HEAD=10 ;HEAD CONO ALSO TEMP
145 UNIT=13 ;UNIT AND M.A. DATAO
148 TT=16 ;ANOTHER JSP AC, ALSO VERY TEMP
149 BUFP=17 ;DBUF PNTR--LAST WORD USED
151 IF1,[ ;DON'T TAKE A WEEK AND A HALF TO ASSEMBLE.
152 RP, .INSRT SYSTEM;RP10 >
153 SC, .INSRT SYSTEM;DC10 >
154 RH, .INSRT SYSTEM;RH10 >
155 PH, .INSRT SYSTEM;RH11 >
156 IFN RP06P, .INSRT SYSTEM;RP06 >
157 IFN RP07P, .INSRT SYSTEM;RP07 >
158 IFN RM03P, .INSRT SYSTEM;RM03 >
159 IFN RM80P, .INSRT SYSTEM;RM80 >
160 IFE BOOTSW, .INSRT SYSTEM;FSDEFS >
161 IFE BOOTSW, KL, .INSRT SYSTEM;EPT >
162 KS, .INSRT SYSTEM;KSDEFS >
166 ;PARAMETER FILE FOR DSKDMP
168 MEMSIZ=1000000 ;ACTUAL SIZE OF MEM
169 IFNDEF DBGSW,DBGSW==0 ;1 TO DEBUG THIS WITH DDT
171 IFN DBGSW,MEMSIZ==MEMSIZ-10000 ;MOVE DOWN UNDER DDT IF DEBUG MODE
172 CORE==MEMSIZ-10000-<2000*NTUTBL> ;HIGHEST ADR ALWAYS IN CORE+1
173 CORES==CORE_<-12> ;BLK # OF ABOVE (FIRST OF BLKS SWAPPED OUT FOR BUFFER AREAS)
174 NSWBL==4+NTUTBL ;# BLOCKS SWAPPED OUT FOR BUFFER AREAS, +1 FOR DSKDMP ITSELF
175 HIGH==MEMSIZ-100 ;HIGHEST ADR LOADED/DUMPED+1
177 NDSK==8 ;MAX POSSIBLE. L$n$ DEFINES WHICH ARE REALLY THERE
181 PH, UBPG==:17 ; Use last (usable) page in Unibus map
185 KL, PAG=<BLKI 10,>-<BLKI>
188 IF1,[ PRINTX
\1c A = B
192 ; L$file LOAD FILE INTO CORE
193 ; T$file LOAD FILE INTO CORE AND GIVE SYMBOLS TO DDT AND START DDT
194 ; M$file LOAD FILE INTO CORE WITHOUT CLEARING CORE FIRST, DOESN'T LOAD SYMBOLS
196 ; D$file DUMP CORE INTO FILE
197 ; I$file VERIFY FILE AGAINST CORE
198 ; G$ START AT STARTING ADDRESS
199 ; U$dir; LIST DIRECTORY
200 ; F$ LIST CURRENT DIRECTORY
201 ; S$ LIST PACK IDS THEN MFD
202 ; nnn$ SET STARTING ADDRESS TO nnn
203 ; L$n$ PUT DISK n ONLINE
204 ; K$n$ TAKE DISK n OFFLINE
207 ; CMPERR VERIFY FAILED TO MATCH
208 ; DIRFUL DIRECTORY FULL
210 ; DIRNF DIRECTORY DOES NOT EXIST
212 ; PKNMTD FILE IS ON PACK THAT IS NOT MOUNTED
213 ; CKSERR CHECKSUM ERROR
215 ; NODDT CAN'T ADDRESS DDT SYMBOL TABLE (BUG)
217 ; SEEKFL DISK SEEK ERROR
218 ; CLOBRD DISK READ ERROR
219 ; CLOBWR DISK WRITE ERROR
220 ; DIRCLB DIR NAME DIFFERS, TUT DISAGREES WITH DIR
221 ; MFDCLB M.F.D. CLOBBERED
222 ; DSKLUZ DISK LOSSAGE (OFFLINE OR UNSAFE OR MASSBUS ERROR)
224 KS, LOC 4000 ; Avoid MTBOOT and KSRIM
228 MOVE T,.... ;THIS CODE BLTS THE FOLLOWING OFFSET CODE
229 BLT T,MEMSIZ-1-1 ;INTO HIGH MEMORY AND WRITES DSKDMP ON ITS
230 MOVE T,PROG+MEMSIZ-2-BEG+1
231 MOVEM T,BEG+MEMSIZ-2-BEG+1 ;AVOID LOSING DUE TO -1 BLT LOSSAGE
233 MOVSI T,-NDSK+1 ;MAKE ALL BUT DISK 0 BE DEAD (MUST DO L$ TO MAKE THEM ALIVE)
238 RP,[ MOVEI T,ICWA+2 ;SET UP CHANNEL JUMP
239 MOVEM T,ICWA ;IN INITIAL CHANNEL ADDRESS
240 SETZM ICWA+1 ;AND CLEAR REMAINING STUFF
246 MOVEI B,MBLKS ;UNIT 0 IS AN RP03, ADJUST WORLD
253 MOVEI UNIT,BEG ;MAGIC BLOCK THEN STARTS IT
255 ADDI BLOK,NSWBL ;FIRST BLOCK AFTER CORE BUFFER IS WHERE DSKDMP LIVES
264 IFE DBGSW,JRST 4,. ;FORMERLY JRST MEMSIZ-400 (??)
267 PH,[ MOVEI T,%HYCLR ; Clear controller
268 IOWRQ T,%HRCS2 ; (Selects drive 0)
269 WBOOT0: IORDQ T,%HRCS1
271 JRST WBOOT0 ; Await drive available (well, it is a dual
272 ; ported drive... perhaps someday?)
275 ADDI BLOK,NSWBL ; FIRST BLOCK AFTER CORE BUFFER IS WHERE
284 TRNE TT,%HXTRE+%HXMCP
286 IFE DBGSW, JRST 4,. ; Formerly JRST MEMSIZ-400 (??)
289 RH,[ MOVEI T,ICWA+2 ;SET UP CHANNEL JUMP
290 MOVEM T,ICWA ;IN INITIAL CHANNEL ADDRESS
291 SETZM ICWA+1 ;AND CLEAR REMAINING STUFF
293 WBOOT0: DATAO DSK,[%HRDCL,,]
298 JRST WBOOT0 ;AWAIT DRIVE AVAILABLE
299 MOVEI UNIT,BEG ;MAGIC BLOCK THEN STARTS IT
301 ADDI BLOK,NSWBL ;FIRST BLOCK AFTER CORE BUFFER IS WHERE DSKDMP LIVES
310 IFE DBGSW,JRST 4,. ;FORMERLY JRST MEMSIZ-400 (??)
313 SC,[ MOVEI UNIT,BEG ;MAGIC BLOCK THEN STARTS IT
314 MOVEI BLOK,NBLKS+NSWBL
317 MOVEI BLOK,NBLKS+NSWBL+1
325 IFE DBGSW,JRST 4,. ;FORMERLY JRST MEMSIZ-400 (??)
330 DCOPY ......(-LRIBLK_2&37774)
333 ......: DWRITE+DUNENB+DADR ;FOR READIN
334 DCOPY BEG(-2000_2&37774)
336 DCOPY BEG(-2000_2&37774)
343 KA, LOC 2000 ; MAKE OFFSET CONVENIENT
345 KS, LOC 6000 ; Avoid MTBOOT and KSRIM
346 PROG: OFFSET CORE+<<NSWBL-1>*2000>-.
347 ]IFN DBGSW,LOC MEMSIZ-2000
350 KA,[ CONO 635550 ;ENTER HERE, CLEAR WORLD
352 JFCL 1,[JRST 4,.] ;A PDP6??
353 LPMR [0]-2 ;TURN OFF EXEC PAGING
355 KL,[ CONO 327740 ;CLEAR APR
356 CONSZ PAG,660000 ;PAGING AND CACHE BETTER BE OFF
359 KS,[ CONO 127760 ; Enable, and Clear all.
361 TRNE B,60000 ; Paging and Tops-20 better be off.
363 SETZM 8SWIT0 ; Clear 8080 Communications area to prevent
364 MOVE B,[8SWIT0,,8SWIT0+1] ; mysterious IO behavior.
366 ;; If the machine has just been powered on, there is likely to be
367 ;; bad parity all over the place. I guess that isn't our problem
368 ;; as long as we don't touch any of it...
370 MOVSI B,-NDSK ;FOR NUMBER OF DISKS
371 SETOM PKNUM(B) ;SET DISK TO UNKNOWN
373 MOVE T,[JRST LOADG1] ;SET BOOTSTRAP TO MIDDLE OF WORLD
375 MOVE D,['DSKDMP] ;ANNOUNCE SELF
377 JRST READ ;CRLF AND BEGIN READING COMMANDS
380 CLEARM MEMSIZ-1 ;DON'T READ ANY MORE COMMANDS FROM MEMORY
381 SOS T,ERROR ;PICK UP ERROR CODE FROM THE AC FIELD OF
382 LDB T,[270400+T,,] ;THE JSR ERROR
384 JSP TT,PD ;PRINT OUT APPROPRIATE COMMENT
386 JRST READ ;BAD ERROR - NO MORE DISKING
388 KA, DATAI TTY,C ;FLUSH RANDOM CHARACTER
389 KS, SETZM 8CTYIN ; ".RESET"
390 TRO CMD,10 ;MAKE SURE PSEUDO-CORE IN CORE
391 JRST LOADG ;BY SIMULATING END OF LOADING, NON-GOING COMMAND
393 ERMESS: IRP XX,,[ECMP,EDIR,EEOF,ESNF,EFNF,EPNM,ECKS
394 EDSK,EDDT,EBUG,EC63,ECRD,ECWR,ECDR,EMFC,EDLZ]YY,,[CMPERR,DIRFUL
395 EOF,DIRNF,FNF,PKNMTD,CKSERR,DSKFUL,NODDT,?BUG?,SEEKFL
396 CLOBRD,CLOBWR,DIRCLB,MFDCLB,DSKLUZ]
401 PD: JSP P,CRLF ;TYPE A CR
403 JSP P,TYO ;AND A SPACE
405 PD1: ILDB C,B ;AND THE SIXBIT CONTENTS OF D
413 C12: IDIVI C,10. ;PRINT CONTENTS OF C AS A TWO-DIGIT
414 DPB C,[60600,,A] ;DECIMAL NUMBER PRECEDED
415 MOVEI D,(SIXBIT /#00/+A) ;BY <SPACE>#
419 WRCB: MOVEI UNIT,CBUF ;WRITE OUT CONTENTS OF CBUF
420 LSH BLKIN,-12 ;ON APPROPRIATE BLOCK
422 ADDI BLOK,-CORES(BLKIN)
425 LODUMP: MOVEI UNIT,CORE ;DEPENDING ON SIGN BIT OF WRITE, LOAD OR DUMP
426 HRRZ BLOK,CBLK ;PSEUDO-CORE (766000-775777)
434 FD: HRRZ C,B ;SET UP POINTER IN C TO FETCH OR DEPOSIT
435 ;CONTENTS OF ADDRESS IN RIGHT HALF OF B
436 IFN DBGSW, SKIPGE WRITE ;LOAD DDT WHEN IN DEBUG MODE
440 CAIGE C,CORE ;IF ADDR IS IN REAL CORE, RETURN IMMEDIATELY
442 FDX: CAIL C,(BLKIN) ;ADDR IS IN PSEUDO-CORE--CHECK IF RIGHT
443 CAILE C,1777(BLKIN) ;BLOCK IS IN CBUF
444 JRST FD3 ;IT'S NOT THERE--READ IT IN
445 FD4: SUBI C,-CORE(BLKIN) ;IT'S THERE--SET UP RIGHT POINTER IN C
446 JRST 1(P) ;AND RETURN
447 FD3: JUMPLE WRITE,FD3A ;IF DUMP OR VERIFY DON'T BOTHER
448 ;TO WRITE OUT CURRENT BLOCK
449 FD3B: JSP TT,WRCB ;IF LOAD, WRITE CURRENT BLOCK FIRST
450 FD3A: MOVEI UNIT,CBUF
453 LDB BLOK,[121000,,BLKIN]
455 MOVEI BLOK,-CORES(BLOK)
456 JSP TT,RDM ;READ IN CORRECT BLOCK
457 JRST FD4 ;SET UP POINTER AND RETURN
459 GBP: IDIVI C,6 ;TURN USER DIRECTORY CHARACTER ADDR IN C
460 IMULI A,-60000 ;INTO A BYTE POINTER
465 WD: AOBJN BUFP,WD1 ;READ, WRITE, OR VERIFY WORD IN D FROM, INTO,
466 JSP TT,NXTBLK ;OR AGAINST WORD IN DBUF
467 JSP TT,WRDB ;TIME TO REFILL OR EMPTY DBUF
468 MOVSI BUFP,-2000 ;RESET BUFFER POINTER
469 WD1: JUMPG WRITE,WD2 ;JUMP ON LOAD
470 JUMPL WRITE,WD3 ;JUMP ON WRITE
471 CAME D,DBUF(BUFP) ;HERE IF VERIFY
472 JSR ECMP,ERROR ;VERIFY COMPARE LOST
474 WD2: SKIPA D,DBUF(BUFP) ;LOAD
475 WD3: MOVEM D,DBUF(BUFP) ;DUMP
478 NXTTUT: HRRZ B,CU ;SELECT NEXT UNIT AND READ ITS TUT
484 JRST 1(TT) ;SKIP IF NO MORE
486 JRST NXTTUT ;UNIT NOT ON LINE
487 RDTUT: MOVEI BLOK,TUTBLK ;READ TUT OF CURRENT UNIT
489 SETOM PKNUM(B) ;ALWAYS READ HEADER FOR TUT
490 IFG NTUTBL-1,[ ;READ IN MULTI-BLOCK TUT
491 HRRM TT,RDTUTX ;SAVE RETURN ADDRESS
502 IBP DIRPT ;DO AN IDPB T,DIRPT CHECKING TO SEE IF
503 LDB DIFF,[1200,,DIRPT] ;RUNNING INTO NAME AREA
509 NXTBW: MOVE BLOK,LBLOCK ;FIND NEXT FREE BLOCK TO WRITE
512 JUMPN T,NXTBW1 ;JUMP IF VERY NEXT BLOCK NOT FREE
514 NXTBW5: SOJA HEAD,NXTBW4 ;GENERATE LOAD ADR IF FIRST TIME (COMPENSATE FOR LBLOCK OFF BY 1)
516 JRST NXTBW2 ;NO NEED TO MODIFY DIRECTORY YET
517 CLEARM BLKCNT ;14 IN A ROW--RESET COUNTER AND
518 NXTBW6: JSR NXTBW3 ;DPB BYTE INTO DIRECTORY
519 NXTBW2: MOVE BLOK,HEAD
521 JSR EDSK,ERROR ;NO MORE DISK LEFT
523 DPB T,TUTPT ;MARK BLOCK USED IN TUT
526 NXTBW1: ADDI HEAD,1 ;SEARCH FOR NEXT FREE BLOCK
530 SKIPLE T,BLKCNT ;COME UP WITH DESC BYTE FOR LAST FEW BLOCKS
533 JUMPL T,NXTBW5 ;FIRST TIME
534 MOVEI T,UDTKMX-1(BLOK)
535 CAIGE T,UDWPH ;CAN WE SAY SKIP N--TAKE 1?
537 NXTBW4: MOVEI BLOK,NXLBYT
546 NXTBLK: JUMPL WRITE,NXTBW ;GET NEXT BLOCK OF FILE--IF DUMP, FIND FREE
547 MOVE BLOK,LBLOCK ;BLOCK
548 NXTB6: SOSLE BLKCNT ;HAVE WE RUN OUT OF "TAKE N"?
549 AOJA BLOK,WRDB1 ;NO--TAKE NEXT BLOCK
550 ILDB T,DIRPT ;YES--GET NEXT DESC BYTE
552 JRST NXTB1 ;IT'S A LOAD ADDR
554 JUMPN T,NXTB2 ;IT'S A TAKE OR SKIP
555 CAIE CMD,'D ;IT'S 0 OR NULL--IF THIS IS A LOAD, IT'S AN
556 CAIN CMD,'K ;UNEXPECTED END OF FILE
557 JRST KILL1 ;IF DUMP OR KILL, O.K.
560 NXTB1: MOVEI BLOK,-UDWPH-1(T) ;LOAD ADR
565 DPB T,DIRPT ;IF KILLING FILE, ZERO THIS BYTE (OTHERS ZEROED AT KILL)
568 ADD BLOK,T ;GET COMPLETE BLOCK NUMBER
572 NXTB2: MOVEM T,BLKCNT
574 AOJA BLOK,WRDB1 ;TAKE N STARTING WITH NEXT ONE
575 ADDI BLOK,-UDTKMX+1(T) ;SKIP N-<MAX TAKE> AND TAKE 1
577 WRDB1: MOVEM BLOK,LBLOCK
581 WRDM: SKIPL WRITE ;SEE WHETHER LOAD OR DUMP/VERIFY
582 RDM: TRZA WRITE,(WRITE) ;READ FROM MASTER UNIT
583 WRM: HRRI WRITE,10 ;WRITE ON MASTER UNIT
584 MU: IORI WRITE,0 ;MASTER UNIT SELECT STORED HERE
587 WRDB: MOVEI UNIT,DBUF ;READ OR WRITE DBUF FROM/ON CURRENT UNIT
588 WRD: SKIPL WRITE ;READ OR WRITE FROM/ON CURRENT UNIT
589 RD: TRZA WRITE,(WRITE) ;READ FROM CURRENT UNIT
590 WR: HRRI WRITE,10 ;WRITE ON CURRENT UNIT
591 CU: IORI WRITE,0 ;CURRENT UNIT SELECT STORED HERE
593 WRD3: DPB WRITE,[360600,,DBLK] ;SET OP, UNIT SEL
594 DPB WRITE,[DUNFLD SEEK]
595 DPB WRITE,[DUNFLD RECAL]
596 HRLI UNIT,-2000 ;ADDRESS COMES IN IN `UNIT'
599 LDB UNIT,[300,,WRITE] ;ISOLATE FROM GARBAGE
600 MOVNI DIFF,16. ;INITIALIZE ERROR COUNTER
601 MOVEM DIFF,ERRCT ;15. LOSSES PERMITTED
605 DPB HEAD,[DSECT DBLK]
607 DPB HEAD,[DSURF DBLK]
610 DATAO DPC,CLATT ;CLEAR ATTENTIONS
611 LSH DIFF,-8 ;EXTRA CYLINDER BIT FOR RP03
612 DPB DIFF,[DCYLXB DBLK]
613 DPB DIFF,[DCYLXB SEEK]
627 AOSG ERRCT ;HARDWARE ERROR--CHECK COUNTER
629 TRNE WRITE,10 ;GIVE UP--DISTINGUISH BETWEEN
630 JSR ECWR,ERROR ;WRITE ERRORS AND
631 JSR ECRD,ERROR ;READ ERRORS
633 WRDX: HRRZ UNIT,@ICWA ;RESTORE ADDR
634 ADDI UNIT,1 ;COMPENSATE FOR IOWD LOSSAGE
635 TRZ WRITE,-1 ;FLUSH GARBAGE
653 WRDM: SKIPL WRITE ;SEE WHETHER LOAD OR DUMP/VERIFY
654 RDM: TRZA WRITE,(WRITE) ;READ FROM MASTER UNIT
655 WRM: HRRI WRITE,10 ;WRITE ON MASTER UNIT
656 MU: IORI WRITE,0 ;MASTER UNIT SELECT STORED HERE
659 WRDB: MOVEI UNIT,DBUF ;READ OR WRITE DBUF FROM/ON CURRENT UNIT
660 WRD: SKIPL WRITE ;READ OR WRITE FROM/ON CURRENT UNIT
661 RD: TRZA WRITE,(WRITE) ;READ FROM CURRENT UNIT
662 WR: HRRI WRITE,10 ;WRITE ON CURRENT UNIT
663 CU: IORI WRITE,0 ;CURRENT UNIT SELECT STORED HERE
665 WRD3: TRNE UNIT,1777 ; Better be on a page boundary!
667 LDB DIFF,[111100,,UNIT] ; Point Unibus map at page in question
668 TRO DIFF,%UQFST+%UQVAL
669 IOWRQ DIFF,UBAPAG+UBPG_1
671 IOWRQ DIFF,UBAPAG+UBPG_1+1
672 LDB DIFF,[000300,,WRITE] ; Select drive
674 JSP HEAD,RHCHEK ; Check for immediate trouble
675 MOVEI DIFF,%HMRDP ; Init the drive
677 MOVNI DIFF,16. ;INITIALIZE ERROR COUNTER
678 MOVEM DIFF,ERRCT ;15. LOSSES PERMITTED
679 WRD5: MOVNI DIFF,4000
680 IOWRQ DIFF,%HRWC ; 4000 half words
682 IOWRQ DIFF,%HRBA ; "Byte" base address
685 IOWRQ DIFF,%HRCYL ; Desire cylinder
689 DPB DIFF,[$HATRK HEAD]
690 IOWRQ HEAD,%HRADR ; Desire track and sector
694 IOWRQ DIFF,%HRCS1 ; Do it (implied seek)
695 WRD7: IORDQ DIFF,%HRCS1
696 TRNN DIFF,%HXRDY ; Wait for controller to finish
698 TRNN DIFF,%HXTRE+%HXMCP ; Trouble?
699 JRST WRDX ; Nope, exit
701 AOSG ERRCT ;HARDWARE ERROR--CHECK COUNTER
702 JRST WRD0 ;RECALIBRATE AND TRY AGAIN
703 TRNE WRITE,10 ;GIVE UP--DISTINGUISH BETWEEN
704 JSR ECWR,ERROR ;WRITE ERRORS AND
705 JSR ECRD,ERROR ;READ ERRORS
707 WRDX: TRZ WRITE,-1 ;FLUSH GARBAGE
710 WRD0: MOVEI DIFF,%HYCLR ; Clear controller
712 LDB DIFF,[000300,,WRITE] ; Select drive
714 MOVEI DIFF,%HMCLR ; Clear drive
716 JSP HEAD,RHCHEK ; Immediate lossage?
717 MOVEI DIFF,%HMREC ; Recalibrate
723 TRNE DIFF,%HSPIP ; WAIT FOR DRIVE TO FINISH
725 ANDI DIFF,%HSDPR+%HSMOL+%HSVV+%HSRDY+%HSERR
726 CAIE DIFF,%HSDPR+%HSMOL+%HSVV+%HSRDY
730 ;;; JSP HEAD,RHCHEK to check for errors.
731 RHCHEK: IORDQ DIFF,%HRCS1
732 TRNE DIFF,%HXTRE+%HXMCP
738 WRDM: SKIPL WRITE ;SEE WHETHER LOAD OR DUMP/VERIFY
739 RDM: TRZA WRITE,(WRITE) ;READ FROM MASTER UNIT
740 WRM: HRRI WRITE,10 ;WRITE ON MASTER UNIT
741 MU: IORI WRITE,0 ;MASTER UNIT SELECT STORED HERE
744 WRDB: MOVEI UNIT,DBUF ;READ OR WRITE DBUF FROM/ON CURRENT UNIT
745 WRD: SKIPL WRITE ;READ OR WRITE FROM/ON CURRENT UNIT
746 RD: TRZA WRITE,(WRITE) ;READ FROM CURRENT UNIT
747 WR: HRRI WRITE,10 ;WRITE ON CURRENT UNIT
748 CU: IORI WRITE,0 ;CURRENT UNIT SELECT STORED HERE
750 WRD3: HRLI UNIT,-2000 ;ADDRESS COMES IN IN `UNIT'
751 CONI DSK,HEAD ;SET WORD COUNT TO ONE BLOCK
752 TLNE HEAD,(%HID22) ;ACCORDING TO TYPE OF CHANNEL
755 LDB UNIT,[300,,WRITE] ;ISOLATE FROM GARBAGE
756 SOS @ICWA ;ADJUST FOR DF10 LOSSAGE
757 MOVNI DIFF,16. ;INITIALIZE ERROR COUNTER
758 MOVEM DIFF,ERRCT ;15. LOSSES PERMITTED
759 WRD5: MOVSI DIFF,%HRDCL(UNIT)
760 HRRI DIFF,%HMRDP ;INIT THE DRIVE
765 MOVEM HEAD,DBLK ;SAVE CYLINDER
769 DPB HEAD,[$HATRK DIFF]
770 TLO DIFF,%HRADR(UNIT)
773 TLO DIFF,%HRCYL(UNIT)
775 MOVSI DIFF,%HRCTL(UNIT)
780 JSP HEAD,RHSET ;DO IT (USE IMPLIED SEEK)
786 AOSG ERRCT ;HARDWARE ERROR--CHECK COUNTER
787 JRST WRD0 ;RECALIBRATE AND TRY AGAIN
788 TRNE WRITE,10 ;GIVE UP--DISTINGUISH BETWEEN
789 JSR ECWR,ERROR ;WRITE ERRORS AND
790 JSR ECRD,ERROR ;READ ERRORS
792 WRDX: HRRZ UNIT,@ICWA ;RESTORE ADDR
793 ADDI UNIT,1 ;COMPENSATE FOR IOWD LOSSAGE
794 TRZ WRITE,-1 ;FLUSH GARBAGE
797 WRD0: MOVSI DIFF,%HRDCL(UNIT)
800 MOVSI DIFF,%HRDCL(UNIT)
807 MOVSI DIFF,%HRSTS(UNIT)
811 ANDI DIFF,%HSVV+%HSRDY+%HSMOL+%HSERR
812 CAIE DIFF,%HSVV+%HSRDY+%HSMOL
816 ;RH10 HACKING ROUTINES. CALL BY JSP HEAD,. DIFF HAS REGISTER ADDRESS IN LH, DATA IN RH.
817 RHSET: TLOA DIFF,%HRLOD
818 RHGET: TLZ DIFF,%HRLOD
830 \f;SC DISK IO ROUTINE
832 WRDM: SKIPL WRITE ;SEE WHETHER LOAD OR DUMP/VERIFY
833 RDM: TRZA WRITE,(WRITE) ;READ FROM MASTER UNIT
834 WRM: HRRI WRITE,60#120 ;WRITE ON MASTER UNIT
835 MU: IORI WRITE,0 ;MASTER UNIT SELECT STORED HERE
838 WRDB: MOVEI UNIT,DBUF ;READ OR WRITE DBUF FROM/ON CURRENT UNIT
839 WRD: SKIPL WRITE ;READ OR WRITE FROM/ON CURRENT UNIT
840 RD: TRZA WRITE,(WRITE) ;READ FROM CURRENT UNIT
841 WR: HRRI WRITE,60#120 ;WRITE ON CURRENT UNIT
842 CU: IORI WRITE,0 ;CURRENT UNIT SELECT STORED HERE
844 WRD3: DPB WRITE,[330700,,DBLK] ;SET OP, UNIT SEL
845 DPB UNIT,[DCCA DBLK+1] ; & CORE ADDR
846 DPB UNIT,[DCCA DBLK1+1]
847 LDB UNIT,[400,,WRITE] ;ISOLATE FROM GARBAGE
848 MOVNI DIFF,16. ;INITIALIZE ERROR COUNTER
849 MOVEM DIFF,ERRCT ;15. LOSSES PERMITTED
852 DPB HEAD,[DSECT DBLK]
854 DPB HEAD,[DSURF DBLK]
856 CONO DC0,DCCSET\DCDENB ;RESET ALL, THEN SET DCDENB
859 SKIPLE DIFF,PKNUM(UNIT)
861 MOVE DIFF,QTRAN(UNIT) ;READ PACK ID
862 DPB DIFF,[DUNFLD GPKID]
865 ADDI DIFF,NCYLS+XCYLS
866 DPB DIFF,[DCYL GPKID]
867 DATAO DC0,[DJMP GPKID]
872 CONO DC0,DCCSET\DCDENB ;RESET POSSIBLE "FUTURE" IP OR RLCERR
873 LDB DIFF,[DPKID RPKID]
874 MOVEM DIFF,PKNUM(UNIT)
875 WRD4: DPB DIFF,[DPKID DBLK]
877 DPB DIFF,[3300,,DBLK1]
878 MOVE DIFF,QTRAN(UNIT)
879 DPB DIFF,[DUNFLD DBLK]
881 LDB DIFF,[DCYL DBLK] ;2ND HALF UNIT
882 ADDI DIFF,NCYLS+XCYLS
884 WRD4A: DATAO DC0,[DJMP DBLK]
890 TRNN DIFF,2 ;DO RECALIBRATE 2 OUT OF 4 RETRIES
892 WRD0: AOSLE ERRCT ;POSITIONER ERROR--CHECK ERROR COUNT
893 JSR EC63,ERROR ;TOO MANY--GIVE UP
894 DATAO DC0,[DSPC+DSRCAL+DSWINF]
897 JRST WRD5 ;TRY AGAIN AFTER RESETTING UNIT
899 WRD2: HRRZM BLOK,BADBLK
900 AOSG ERRCT ;HARDWARE ERROR--CHECK COUNTER
902 TRNE WRITE,40 ;GIVE UP--DISTINGUISH BETWEEN
903 JSR ECWR,ERROR ;WRITE ERRORS AND
904 JSR ECRD,ERROR ;READ ERRORS
906 WRDX: DPB BLOK,[XWBLK XWDS] ;PNTR TO PREV BLOCK
907 LDB UNIT,[DCCA DBLK+1] ;RESTORE ADR
908 TRZ WRITE,-1 ;FLUSH GARBAGE
912 DCOPY .(-2000_2&37774)
913 DCOPY XWDS(-4_2&37774)
915 DCOPY .(-2000_2&37774)
916 DCOPY XWDS(-4_2&37774)
919 GPKID: DSPC+DSCRHD+DSWIDX+DSWNUL+DUNENB+TUTCYL_11.+TUTSRF_6+TUTSEC
924 ;JSP P,TYI RETURNS CHAR IN C.
925 ;JSP P,TYI0 ALSO SKIPS IF NO INPUT AVAILABLE.
926 TYI: ILDB C,MEMSIZ-1 ;CHECK FOR COMMANDS FROM MEMORY
927 JUMPN C,(P) ;FOUND ONE--RETURN
929 TYI0: ;ENTRY TO SKIP IF NO INPUT AVAILABLE
939 KL,[ MOVEI C,3400 ;DDT MODE INPUT
951 JRST (P) ;DON'T ECHO GRITCHES
954 ;JSP P,TYO TYPES OUT CHAR IN C. CLOBBERS A,C.
956 ; JRST (P) ;DON'T ECHO COMMANDS FROM MEMORY
957 KA,[ HRRZ A,C ;COMPUTE PARITY
987 JUMPGE C,(P) ;CHECK FOR CRLF (AS OPPOSED TO ECHOING A CR)
988 SKIPA C,C12 ;TYPE AN LF
992 TYI1: HRRZ C,-1(P) ;NO INPUT AVAILABLE
994 JRST TYI ;WAIT FOR IT
995 JRST 1(P) ;CALL WAS TO TYI0, SKIP RETURN
999 MOVSI WRITE,-1 ;MAKE THIS INFO MORE CONVENIENT
1002 LINKL: ILDB TT,DIRPT
1004 DPB T,DIRPT ;CLOBBER CHARS READ FOR DUMP OR KILL
1013 LINKN1: CAMGE D,[600,,B] ;THROUGH WITH FN2?
1020 LINKN: TLNN D,770000
1022 IDPB T,D ;FILL OUT WITH SPACES
1025 LINKQ: ILDB TT,DIRPT
1030 READ: MOVEI BLKIN,CORE
1032 MOVEI CMD,0 ;INITIALIZE COMMAND
1033 READ1A: MOVEI WRITE,0 ;INITIALIZE NUMBER
1034 MOVSI B,(SIXBIT \@\) ;INITIALIZE 1ST FILE NAME
1036 READ3A: MOVSI B,(SIXBIT \@\) ;INITIALIZE CURRENT FILE NAME
1040 JRST READ ;IF RUBOUT START OVER
1043 JRST ALTMOD ;JUMP IF 33, 175, 176
1044 ASH WRITE,3 ;DOES NOT CHANGE SIGN OF WRITE
1047 TLOA WRITE,400000 ;NON-NUMERIC CHAR--MAKE WRITE NEGATIVE
1048 ADDI WRITE,-"0(C) ;NUMERIC CHAR--ACCUMULATE NUMBER
1050 JRST READ3 ;SET SYSTEM NAME
1052 JRST READ1 ;SET FIRST FILE NAME
1054 JSP P,TYI ;QUOTED CHARACTER
1055 CAIGE C,140 ;CHECK FOR LOWER CASE
1057 JUMPL C,DOIT ;IF LESS THAN 40 (EXC. ^Q) END OF COMMAND
1058 TLNE D,770000 ;SKIP IF ALREADY SIX CHARS
1065 JRST DOIT ;IF COMMAND IS U GO LIST DIRECTORY
1067 ONOFF: CAIGE WRITE,NDSK
1068 DPB CMD,[100,,QDED(WRITE)] ;LOW BIT OF CMD DETERMINES ON/OFF LINE STATUS
1069 JRST READ ; (K=13, L=14)
1071 ALT1: LDB CMD,D ;PICK UP COMMAND CHAR
1074 JRST READ1A ;GET FILE NAME
1075 JRST DOIT ;DON'T WANT FILE NAME--GO TO WORK
1078 JSP P,TYO ;ECHO DOLLAR SIGN
1079 JUMPLE WRITE,ALT2 ;JUMP IF NOT <NUMBER><ALTMODE> LAST TYPED
1080 JUMPN CMD,ONOFF ;JUMP IF <CMD><ALTMODE><NUMBER><ALTMODE>
1081 HRRM WRITE,SADR ;SET STARTING ADDR
1085 TLCN D,360000 ;SKIP IF SINGLE CHARACTER BEFORE <ALTMODE>
1086 JUMPE CMD,ALT1 ;JUMP IF NO COMMAND ALREADY TYPED
1087 DOIT: MOVEM B,FN2 ;STORE SECOND FILE NAME
1089 HRRM B,CU ;MAKE MASTER UNIT CURRENT UNIT
1091 JSP P,LODUMP ;DUMP OUT PSEUDO-CORE
1096 MLOOK2: MOVSI WRITE,1 ;MAKE WRITE INDICATE LOAD
1099 JSP TT,RD ;READ MASTER DIRECTORY TO FIND WHERE USER DIRECTORY IS
1101 CAME T,[SIXBIT/M.F.D./]
1107 JRST LISTS ;LIST DISK ID'S AND SYSTEM NAMES
1109 MLOOK: CAMN C,DIR+MNUNAM(T) ;LOOK UP SYSTEM NAME
1114 JSR ESNF,ERROR ;NOT FOUND
1116 MLOOK1: MOVEI BLOK,2*NUDSL-2000(T) ;CONVERT USER SLOT TO BLOCK NUMBER
1118 HRRM BLOK,UDBLK ;REMEMBER FOR KILL OR DUMP
1120 JSP TT,RDM ;READ USER DIRECTORY
1121 ULOOK: CAME C,DIR+UDNAME
1122 JSR ECDR,ERROR ;WRONG ONE??
1125 JRST LISTFC ;LIST USER DIRECTORY
1130 ULOOK1: CAMN A,DIR+UNFN1(T) ;LOOK UP FILE NAME
1133 TDNN TT,DIR+UNRNDM(T) ;IS THIS FILE FOR REAL?
1135 ULOOK2: ADDI T,LUNBLK
1138 CAIE CMD,'D ;IF NOT FOUND BETTER BE DUMP
1141 ULOOK4: SKIPN DIR+UNFN1(T) ;FIND FREE SLOT FOR NEW FILE
1146 MOVNI T,LUNBLK ;NO FREE SLOTS--TRY TO EXTEND NAME AREA DOWN
1151 CAMGE T,DIR+UDNAMP ;DID WE RUN INTO DESCRIPTOR AREA?
1155 ULOOK3: HRRM T,DMP4 ;IF FILE FOUND, SAVE SLOT NUMBER FOR DUMP
1156 LDB C,[UNDSCP DIR+UNRNDM(T)]
1158 MOVEM C,DIRPT ;SET UP DESCRIPTOR AREA BYTE POINTER
1160 TDNE TT,DIR+UNRNDM(T)
1161 JRST LINK ;FILE IS A LINK
1162 LDB A,[UNPKN DIR+UNRNDM(T)]
1163 ULOOK5: CAMN A,TUT+QPKNUM ;SEE IF IT'S MOUNTED
1169 LOAD: CAIE CMD,'D ;GET HERE IF FILE FOUND
1170 CAIN CMD,'K ;IF DUMP OR KILL, DELETE IT
1172 ZERO: MOVEI TT,CORE-1
1173 TRNN CMD,20 ;SKIP IF T$ SYMBOL LOADING COMMAND
1175 MOVEI B,DDT-1 ;ASSUME ALWAYS USING MOBY DDT
1176 JSP P,FD ;GET DDT'S SYMBOL TABLE POINTER
1177 JSR EDDT,ERROR ;CAN'T GET IT??
1178 HRROS B,(C) ;TELL DDT ITS SYMBOL TABLE WAS BUGGERED
1179 CAME B,[-1,,DDT-2] ;VERIFY THAT IT'S REALLY A MOBY DDT LIKE WE THOUGHT
1181 SKIPE D,-2(C) ;FLUSH ALL BUT INITIAL SYMBOLS
1186 MOVEI TT,-1(D) ;DON'T ZERO SYMBOL TABLE NOR DDT
1188 JRST LOAD1 ;NON-ZEROING COMMAND
1189 SETZM 40 ;BEGIN CLEARING CORE
1190 MOVE T,[40,,41] ;SET UP BLT POINTER
1191 ;CODE TO SKIP OVER NXM
1192 ZERO2: CAIG TT,10*2000-1(T) ;MORE THAN 8K LEFT TO ZERO?
1193 JRST ZERO4 ;NO, ZERO REMAINING WORDS AND PROCEED
1194 MOVE D,T ;AVOID KA/KL INCOMPAT BY COPYING BLT PNTR
1195 BLT D,10*2000-1(T) ;ZERO NEXT 8K
1196 ZERO3: ADDI T,10*2000 ;MOVE DEST OF BLT PNTR UP 8K
1197 ANDCMI T,1777 ;ROUND DOWN TO 1K BOUNDARY
1198 KA, CONO 10000 ;CLEAR NXM
1199 MOVES (T) ;SET NXM IF HOLE
1200 KA, CONSZ 10000 ;NXM GENERATED?
1201 KA, JRST ZERO3 ;YES, GO TO NEXT 8K
1202 JRST ZERO2 ;NO, CLEAR THIS 8K
1204 ZERO4: BLT T,(TT) ;AND CLEAR TO TOP BOUNDARY
1206 JRST LOAD1 ;IF SYMBOL-LOADING COMMAND, STOP THERE
1208 MOVE T,[CBUF,,CBUF+1]
1211 MOVE BLOK,CBLK ;-NSWBL IN LH
1212 JSP TT,WRM ;CLEAR PSEUDO-CORE
1214 LOAD1: SETZB BUFP,BLKCNT ;SET UP BUFP SO FIRST CALL TO WD WILL READ
1215 LOAD2: JSP P,WD ;FIRST BLOCK OF FILE
1216 CAME D,[JRST 1] ;LOOK FOR END OF SBLK LOADER
1218 CAIN CMD,'I ;IF VERIFY, START SIMULATING DUMP
1220 LOAD3: JSP P,WD ;READ BLOCK HEADER
1221 JUMPGE D,LOADS ;IT'S A JUMP BLOCK
1224 JSR LOADB ;LOAD LOGICAL BLOCK INTO CORE
1228 LOAD4: JSP P,WD ;LOAD A LOGICAL BLOCK--AOBJN POINTER IN B,
1229 ROT A,1 ;BLOCK HEADER IN A (FOR CHECKSUM)
1230 ADD A,D ;ADD NEW WORD INTO CHECKSUM
1231 JSP P,FD ;AND PREPARE TO SMASH IT AWAY
1232 JRST .+2 ;LOCATION CAN'T BE LOADED
1233 MOVEM D,(C) ;SMASH WORD AWAY
1236 CAMN A,D ;CHECK THE CHECKSUM
1238 JSR ECKS,ERROR ;BAD CHECKSUM
1241 JRST LOADG0 ;DON'T LOAD SYMBOLS NOR SADR
1242 MOVEM D,NXTBW3 ;SAVE S.A.
1243 MOVEI B,DDT-1 ;ASSUME IS ALWAYS MOBY DDT.
1244 JSP P,FD ;GET DDT'S SYMBOL TABLE POINTER
1245 JSR EDDT,ERROR ;CAN'T GET IT??
1247 JRST LOADJ ;AIN'T GOT NO DDT, IGNORE SYMBOLS
1248 HRROS B,(C) ;TELL DDT ITS SYMBOL TABLE WAS BUGGERED
1249 CAMN B,[-1,,DDT-2] ;VERIFY THAT IT'S REALLY A MOBY DDT LIKE WE THOUGHT
1250 JSP P,FD ;FETCH SYMBOL TABLE POINTER
1254 LOADS1: MOVE B,DDTM2 ;GET LOWEST SYMBOL LOC SO FAR
1255 JSP P,WD ;GET SYMBOL BLOCK HEADER
1256 JUMPGE D,LOADS2 ;JUMP IF END OF SYMBOLS
1257 TRNE D,-1 ;SKIP IF REALLY SYMBOLS AND NOT SOME OTHER BRAIN-DAMAGED CRUFT
1261 ADD B,D ;EFFECTIVELY SUBTRACTS LENGTH OF BLOCK FROM BOTH HALVES
1262 MOVEM B,DDTM2 ;OF SYMBOL TABLE POINTER
1263 HRL B,D ;SET UP AOBJN POINTER IN B
1264 HRLZ A,D ;AND RECREATE HEADER IN A
1265 JSR LOADB ;LOAD THE SYMBOLS
1268 LOADBD: HLRO B,D ;-# WORDS TO SKIP (NOT COUNTING CHECKSUM)
1271 JRST LOADS1 ;TRY NEXT SYMBOL BLOCK
1273 LOADS2: MOVE D,DDTM2 ;GET UPDATED DDT SYMBOL PNTR
1274 LOADS4: MOVEI B,DDT-2 ;WE KNOW WHERE IT ALWAYS GOES
1275 JSP P,FD ;PUT BACK SYMBOL TABLE POINTER
1276 JSR EBUG,ERROR ;CAN'T PUT IT BACK??
1278 MOVEI B,DDT-4 ;GIVE STARTING ADDRESS TO DDT
1283 MOVEI D,DDT ;AND SET DSKDMP START ADDRESS TO DDT
1284 LOADJ: HRRM D,SADR ;SET STARTING ADDRESS FROM JUMP BLOCK
1285 LOADG0: MOVE T,BOOTNS ;APPROP DISK WAIT FOR NON BUSY INSTR
1287 LOADG: JSP TT,WRCB ;MAKE SURE ALL LOADED CRUFT IN PSEUDO-CORE IS OUT
1289 JSP P,LODUMP ;AND LOAD IT ALL IN
1291 JRST READ ;NON-GOING COMMAND
1293 PH,[ MOVSI B,-LSWPADR
1294 GO1: IORD DIFF,SWPCS1
1295 TRNN DIFF,%HXRDY ; Wait for controller
1307 GO1: CONSZ DSK,%HIBSY
1322 SC, DATAO DC0,[DJMP SWPOUT]
1327 JRST LOADG1 ;SHUT UP IF KEY HIT
1328 MOVE C,TUT+QPKNUM ;TYPE PACK NUMBER
1330 MOVE D,TUT+QPAKID ;AND I.D.
1332 JSP TT,NXTTUT ;SAME FOR ALL DIRECTORIES
1335 LISTS1: CAIGE T,2000
1336 JSP P,TYI0 ;STOP TYPING IF TTI FLAG ON
1338 SKIPE D,DIR+MNUNAM(T)
1339 JSP TT,PD ;TYPE OUT USER NAME
1343 LISTFC: MOVE T,DIR+UDNAMP
1345 KA, CONSO TTY,40 ;STOP TYPING IF TTI FLAG ON
1346 KS, SKIPN 8CTYIN ; Stop typing if character waiting
1349 SKIPN DIR+UNFN1(T) ;SKIP IF FILE IN THIS SLOT
1352 LDB C,[UNPKN DIR+UNRNDM(T)]
1353 JSP TT,PNO ;TYPE PACK NUMBER
1355 JSP TT,PD2 ;TYPE FIRST FILE NAME
1357 JSP TT,PD2 ;AND SECOND FILE NAME
1358 LISTF2: ADDI T,LUNBLK
1361 KILL: JSP TT,NXTB6 ;GET HERE ON KILL OR DUMP OF EXISTING FILE
1362 MOVEI T,0 ;ZERO BYTES IN USER DIRECTORY DESCIPTOR AREA
1363 DPB T,DIRPT ;NXTB6 JUMPS TO KILL1 AT END OF FILE
1367 CAIGE T,TUTLK-1 ;SOS USAGE OF THIS BLOCK
1368 SOJL T,[JSR ECDR,ERROR]
1372 KILL1: HRRZ T,DMP4 ;CLEAR OUT USER DIRECTORY SLOT
1375 CLEARM DIR+UNRNDM(T)
1378 JRST KILDMP ;IF KILL DON'T DUMP
1379 JRST DMP4 ;MUST DUMP ON SAME UNIT
1381 DUMP0: MOVE T,DIR+UDNAMP ;GET HERE IF SLOT CREATED AT BOTTOM OF NAME AREA
1382 DUMP: HRRM T,DMP4 ;GET HERE IF EMPTY SLOT FOUND IN NAME AREA
1383 DMP0: MOVEI D,0 ;GET HERE IF USING SLOT OF OLD FILE
1384 DMP1: ;MOVE C,TUT+QSWAPA
1385 MOVEI C,0 ;NOTE START AT 0 NOT QSWAPA
1388 HRLZ B,B ;LH(B) COUNTS BLOCKS, RH(B) COUNTS FREE BLOCKS
1392 KA, SUBI B,1 ;THIS RELIES ON CARRY PROPAGATING FROM RH TO LH IN AOBJN
1393 KL, HRRI B,-1(B) ;ON KI10, KL10 CHANGE SUBI B,1 TO HRRI B,-1(B)
1394 KS, HRRI B,-1(B) ;KS too...
1396 CAIG B,(D) ;RH OF D IS HIGHEST SO FAR, LH SAYS WHICH UNIT
1397 JRST DMP5 ;NOT BETTER THAN RECORD
1398 MOVE D,B ;NEW RECORD--RECORD IT
1400 DMP5: JSP TT,NXTTUT ;TRY NEXT
1402 ;FALLS THROUGH AT END
1403 DMP3: HLRM D,CU ;SET CURRENT UNIT TO ONE WITH MOST FREE BLOCKS
1404 JSP TT,RDTUT ;GET ITS TUT
1408 MOVEM A,DIR+UNFN1(T) ;PUT CRUFT INTO SLOT
1409 MOVEM B,DIR+UNFN2(T)
1410 SETOM DIR+UNDATE(T) ; Unknown creation date
1411 HRROI C,777000 ; Unknown reference date
1412 MOVEM C,DIR+UNREF(T) ; Unknown author, 36. bit bytes
1413 SC,[ MOVEM A,XWDS+XWFN1
1417 ] MOVE C,DIR+UDESCP ;PUT DESCRIPTOR CHARACTER ADDRESS
1418 MOVE B,TUT+QPKNUM ;AND PACK NUMBER
1420 MOVEM C,DIR+UNRNDM(T) ;INTO USER DIRECTORY SLOT
1421 ;MOVE C,TUT+QSWAPA ;COMMENTED OUT INSN DUMPS INTO FILE AREA
1422 MOVEI C,0 ;DUMP INTO SWAPPING AREA TO AVOID Y FILES
1423 MOVEM C,LBLOCK ;A DAEMON WILL COPY INTO FILE AREA AFTER SALVAGE
1425 MOVEM C,TUTPT ;INITIALIZE TUT POINTER
1428 MOVEM C,DIRPT ;INITIALIZE DESCRIPTOR AREA POINTER
1429 SETOB WRITE,BLKCNT ;FORCE NXTBW TO LOAD ADR
1430 KA, HRLOI BUFP,-2001-1 ;SET UP BUFP SO FIRST WORD GOES IN DBUF+0
1431 KL, HRLOI BUFP,-2001
1432 KS, HRLOI BUFP,-2001
1434 JSP P,WD ;END OF SBLK LOADER
1438 DUMP.5: MOVSI WRITE,-'I(CMD) ;GET HERE IF VERIFY--SET WRITE NEGATIVE IF
1439 MOVEI B,40 ;DUMP AND ZERO IF VERIFY--FIRST ADDR DUMPED IS 40
1445 MOVEI B,DDT-3 ;SET UP TO NOT DUMP SYMBOLS AS PART OF CORE IMAGE
1448 SKIPN A,(C) ;GET PNTR TO BUILT IN SYMBOLS
1449 JRST DUMP4 ;NO DDT, DON'T HACK THIS
1450 HRRM A,DUMP7 ;THIS IS WHERE WE START DUMPING AGAIN
1451 MOVEM A,DUMP9K ;THIS WILL BE INITIAL SYMBOL TABLE PNTR WHEN DDT LOADED
1453 ADD A,1(C) ;GET MINUS SIZE OF NON-BUILTIN SYMBOL TABLE IN RH(A)
1454 HRL A,1(C) ;GET PNTR TO SYMBOL TABLE
1455 HLRM A,DUMP6 ;THIS IS WHERE WE STOP DUMPING
1456 MOVSM A,DUMP9S ;SAVE AOBJN PNTR TO NON-BUILTIN SYMBOLS
1457 MOVE A,-1(C) ;PICK UP START ADDRESS
1458 MOVEM A,DUMP9J ;SAVE
1459 MOVE B,-2(C) ;DUMP LOW CORE (ACS) OUT OF PLACE SAVED IN DDT
1460 HLLZ A,B ;HERE B HAS ADDRESS DUMPING FROM
1461 JRST DUMP3B ;AND A AND D HAVE VIRTUAL ADDRESS
1463 DUMP1: ;SKIP OVER NXM ON DUMPING
1464 KA,[ CONSO 10000 ;NXM SET?
1465 JRST DUMP1A ;NO, CONTINUE IN SEQUENCE
1466 ADDI B,10*2000-1 ;SKIP 8K
1467 TRZ B,1777 ;ROUND DOWN TO 8K BOUDARY
1468 CONO 10000 ;CLEAR NXM
1471 DUMP6: CAIGE B,. ;SKIP IF REACHED SYMBOL TABLE
1473 DUMP7: MOVEI B,. ;SKIP OVER SYMBOLS, DUMP DDT
1474 HLLOS DUMP6 ;DEFUSE TEST
1476 JRST DUMPJ ;TIME TO WRITE JUMP BLOCK AND SYMBOL TABLE
1477 SKIPN (C) ;LOOK FOR NON-ZEROES
1479 MOVE A,B ;SAVE START OF BLOCK
1480 DUMP2: TLZ A,-1 ;LOOK FOR TWO CONSECUTIVE ZEROES
1481 DUMP2A: CAIL B,200(A) ;BUT DON'T DUMP MORE THAN 200 WORDS AT A TIME
1485 JRST DUMP3 ;END OF CORE, WRITE OUT LAST BLOCK
1487 AOJA B,DUMP2 ;NONZERO
1488 TLON A,-1 ;ZERO, WAS PREV LOC ZERO ALSO?
1489 AOJA B,DUMP2A ;NO, CHECK FOLLOWING LOC
1490 SOJA B,DUMP3 ;YES, DUMP THE NON-ZERO THAT PRECEDES IT
1492 DUMP3: HRRM B,DUMP4 ;SAVE ADDRESS TO CONTINUE SEARCH
1493 SUBM A,B ;RH(B) GETS MINUS THE LENGTH OF THE BLOCK
1494 HRL A,B ;SET UP HEADER IN A
1496 DUMP3B: MOVE D,A ;AND D
1497 JSP P,WD ;WRITE HEADER
1499 JSR EBUG,ERROR ;CAN'T FETCH WORD WE FETCHED BEFORE??
1502 ADD A,D ;COMPUTE CHECKSUM
1503 JSP P,WD ;WRITE DATA WORD
1506 JSP P,WD ;WRITE OUT CHECKSUM
1507 DUMP4: MOVEI B,. ;AND CONTINUE SEARCHING
1508 JUMPN B,DUMP1 ;IF MRC EVER SEES THIS --SELFMODIFYING CODE-- ....
1509 JRST DUMP9 ;FINISHED DUMPING SYMBOLS
1513 HRROI D,DDT-2 ;BUGGER THE SYMBOL TABLE
1521 DMP9J1: SKIPN D,DUMP9J
1523 JSP P,WD ;WRITE OUT JUMP BLOCK
1524 SKIPN B,DUMP9S ;WRITE SYMBOLS
1525 JRST DUMP9 ;NO SYMBOLS
1527 HLLZS DUMP4 ;DUMP SYMBOL BLOCK, RETURN TO DUMP9
1530 DUMP9: JUMPE WRITE,LOADG1 ;IF VERIFY, THAT'S ALL
1533 JSP P,WD ;SECOND JUMP BLOCK
1534 HRRZ T,DMP4 ; GET POINTER TO NAME AREA
1536 DPB BUFP,[UNWRDC+DIR+UNRNDM(T)]
1538 JSP TT,WRDB ;WRITE OUT LAST BLOCK
1540 JSR NXTBW3 ;STORE LAST DESCRIPTOR BYTE
1542 JSR NXTBW3 ;AND INDICATE END OF FILE
1543 LDB T,[360600,,DIRPT]
1547 SUBI TT,6*<DIR+UDDESC>-5-1(T)
1548 HRRZM TT,DIR+UDESCP ;INDICATE NEW END OF DESCRIPTOR AREA
1549 KILDMP: MOVEI UNIT,TUT
1551 JSP TT,WRD ;WRITE OUT TUT ON THIS UNIT
1558 HRRM B,KD2 ;WRITE OUT USER DIRECTORY ON ALL UNITS
1575 GTP: SKIPGE TUT+QPKNUM
1576 JSR EBUG,ERROR ;MUST BE OLD-STYLE TUT?
1578 JUMPL C,[JSR EBUG,ERROR]
1580 IMULI A,-10000*TUTBYT
1581 HRLI C,440000+TUTBYT_6(A)
1585 SC,[ ;LOGICAL TO PHYSICAL DISK MAPPING
1586 QTRAN: 0 ;INDEX BY LOG DSK #
1587 1 ;4.9 => USE HIGH HALF OF DRIVE, RH = PHYS DRIVE #
1588 2 ;(NO LONGER DOES ANYTHING, NOW THAT MEMOWRECKS ARE GONE,
1589 3 ; BUT KEEP AROUND JUST IN CASE EVER NEEDED AGAIN.)
1594 IFL .-QTRAN-NDSK,.ERR QTRAN LOSES!!
1597 ERRCT: 0 ;ERROR COUNTER
1598 DDTM2: 0 ;DDT SYMBOL TABLE POINTER
1599 DUMP9J: 0 ;START INSTRUCTION (AT DUMP9)
1600 DUMP9S: 0 ;SYMBOL TABLE POINTER (AT DUMP9)
1601 DUMP9K: 0 ;INITIAL SYMBOL TABLE PNTR (AT DUMP9)
1602 LBLOCK: 0 ;LAST BLOCK WRITTEN OR READ
1603 BLKCNT: 0 ;NUMBER OF BLOCKS READ OR WRITTEN CONSECUTIVELY
1604 DIRPT: 0 ;DESCRIPTOR AREA BYTE POINTER
1605 TUTPT: 0 ;TUT BYTE POINTER
1608 PKNUM: REPEAT NDSK,-1 ;PACK NUMBER INDEXED BY DRIVE NUMBER
1609 QDED: BLOCK NDSK ;-1 IF DRIVE NOT TO BE USED
1612 BOOTNS: RP, CONSZ DPC,BUSY
1613 SC, CONSZ DC0,DSSACT
1614 RH, CONSZ DSK,%HIBSY
1615 PH, IORD B,SWPCS1 ; UGH!
1619 IFL BEG+1677-., .ERR BLOAT
1620 INFORM SPACE LEFT,\BEG+1677-.
1623 BADBLK: 0 ;BLOCK WITH HDWE ERROR
1624 INFORM BADBLK,\.-1-BEG+<MEMSIZ-2000>
1632 CBOOT: CLEARM MEMSIZ-1 ;BOOTSTRAP
1635 IFE BOOTSW, JRST BEG ;OR CONSZ DPC,BUSY OR JRST LOADG1
1636 IFN BOOTSW, CONSZ DPC,BUSY
1638 MOVEI B,ICWA+2 ;SET UP CHANNEL PROG
1645 BOOT0: TRNN B,RP03BT
1647 MOVEI B,MBLKS ;UNIT 0 IS AN RP03, ADJUST WORLD
1653 BOOT1: HLLZS BOOT0 ;PREVENT TRNN FROM SKIPPING AGAIN
1667 CLATT1: DEASEC ALLATT
1668 SWPSK: DSEEKC+200._22.
1669 SWPIN1: DWRITC+200._22.+3_17.+2._12.+ICWA ;NBLKS 4
1670 SWPIN2: DREADC+200._22.+4_17.+8._12.+ICWA
1671 SWPOU1: DWRITC+200._22.+4_17.+8._12.+ICWA
1672 SWPOU2: DREADC+200._22.+3_17.+2_12.+ICWA
1673 IFN NSWBL-5, .ERR THE PRECEDING 4 CONSTANTS ARE WRONG!
1674 CBLK: -NSWBL,,NBLKS ;DISK ADDR OF CORE BUFFER, - # BLOCKS IN LH
1675 RP3ADJ: <<MCYLS#NCYLS>&377>_22.+<.BM DCYLXB>
1678 SKWAIT: DATAI DPC,A ;AWAIT SEEK DONE UNIT 0
1689 WAIT: CONSO DPC,DONE
1693 PH,[ ;; Initially we could not use IORDQ or IOWRQ because they were
1694 ;; macros that used a literal. There is nothing to stop us now,
1695 ;; except the fact that this code works fine and is as small as you
1696 ;; could possibly want.
1699 IFE BOOTSW, JRST BEG ; or IORD B,SWPCS1 or JRST LOADG1
1700 IFN BOOTSW, IORD B,SWPCS1
1703 KS, WREBR 0 ; No paging or caching
1705 IOWR A,SWPCS2 ; Select drive
1706 BOOT0: IORD A,SWPCS1
1708 JRST BOOT0 ; Await drive available
1710 BOOT1: HLRZ A,SWPVAL(B)
1712 BOOT2: IORD A,SWPCS1
1713 TRNN A,%HXRDY ; Wait for controller
1715 TRNE A,%HXTRE+%HXMCP ; Lossage?
1720 ZZ1==<NSWBL-1>*SECBLK ;BLOCK CONTAINING CORE SWAPPED OUT TO BRING DSKDMP IN
1721 ZZ2==<NSWBL>*SECBLK ;DSKDMP RESIDENCE BLOCK
1724 ZZ1==ZZ3*400+<ZZ1-NSECS*ZZ3> ;CONVERT ADDR TO DISK FORMAT
1725 ZZ2==ZZ4*400+<ZZ2-NSECS*ZZ4>
1727 SWPADR: UBAQ,,UBAPAG+UBPG_1 ; Set up Unibus map
1728 UBAQ,,UBAPAG+UBPG_1+1
1729 UBAQ,,%HRCS2 ; Clear controller
1730 SWPCS2: UBAQ,,%HRCS2 ; Select drive
1731 SWPCS1: UBAQ,,%HRCS1 ; Initialize
1732 UBAQ,,%HRCYL ; Desire cylinder
1733 UBAQ,,%HRWC ; Set (half) word count
1734 UBAQ,,%HRBA ; Set Unibus address
1735 UBAQ,,%HRADR ; Desire track and sector
1736 UBAQ,,%HRCS1 ; Write
1737 UBAQ,,%HRWC ; Reset (half) word count
1738 UBAQ,,%HRBA ; Reset Unibus address
1739 UBAQ,,%HRADR ; Desire track and sector
1743 IFN BEG&1777, .ERR BEG does not lie on a page boundary?
1745 ;;; LH FOR SWAP IN, RH FOR SWAP OUT
1746 SWPVAL: %UQVAL+%UQFST+BEG_-9,,%UQVAL+%UQFST+BEG_-9 ; Set up Unibus map
1747 %UQVAL+%UQFST+BEG_-9+1,,%UQVAL+%UQFST+BEG_-9+1
1748 %HYCLR,,%HYCLR ; Clear controller
1750 %HMRDP,,%HMRDP ; Initialize
1751 NCYLS,,NCYLS ; Desire cylinder
1752 -1700*2,,-1700*2 ; Set (half) word count
1753 UBPG_14,,UBPG_14 ; Set Unibus address
1754 ZZ1,,ZZ2 ; Desire track and sector
1755 %HMWRT,,%HMWRT ; Write
1756 -1700*2,,-1700*2 ; Reset (half) word count
1757 UBPG_14,,UBPG_14 ; Reset Unibus address
1758 ZZ2,,ZZ1 ; Desire track and sector
1759 %HMRED,,%HMRED ; Read
1760 IFN .-SWPVAL-LSWPADR, .ERR SWPVAL wrong length.
1771 IFE BOOTSW, JRST BEG ;OR CONSZ DSK,%HIBSY OR JRST LOADG1
1772 IFN BOOTSW, CONSZ DSK,%HIBSY
1774 KL, CONSZ PAG,660000 ;PAGING AND CACHE MUST BE DISABLED
1776 MOVEI B,ICWA+2 ;SET UP CHANNEL PROG
1780 BOOT0: DATAO DSK,[%HRDCL,,]
1785 JRST BOOT0 ;AWAIT DRIVE AVAILABLE
1792 BOOT1: DATAO DSK,SWPIN1(B)
1802 ZZ1==<NSWBL-1>*SECBLK ;BLOCK CONTAINING CORE SWAPPED OUT TO BRING DSKDMP IN
1803 ZZ2==<NSWBL>*SECBLK ;DSKDMP RESIDENCE BLOCK
1806 ZZ1==ZZ3*400+<ZZ1-NSECS*ZZ3> ;CONVERT ADDR TO DISK FORMAT
1807 ZZ2==ZZ4*400+<ZZ2-NSECS*ZZ4>
1810 SWPIN1: %HRLOD+%HRDCL,,%HMRDP
1811 SWPIN2: %HRLOD+%HRCYL,,NCYLS+1 ;AVOID CYLINDER 406 WHICH KLDCP USES
1812 SWPIN3: %HRLOD+%HRADR,,ZZ1
1813 SWPIN4: %HRLOD+%HRCTL,,%HMWRT+ICWA_6
1814 SWPIN5: %HRLOD+%HRADR,,ZZ2
1815 SWPIN6: %HRLOD+%HRCTL,,%HMRED+ICWA_6
1817 SWPOU1: %HRLOD+%HRDCL,,%HMRDP
1818 SWPOU2: %HRLOD+%HRCYL,,NCYLS+1 ;AVOID CYLINDER 406 WHICH KLDCP USES
1819 SWPOU3: %HRLOD+%HRADR,,ZZ2
1820 SWPOU4: %HRLOD+%HRCTL,,%HMWRT+ICWA_6
1821 SWPOU5: %HRLOD+%HRADR,,ZZ1
1822 SWPOU6: %HRLOD+%HRCTL,,%HMRED+ICWA_6
1824 CBLK: -NSWBL,,NBLKS+NBLKSC ;AVOID CYLINDER 406 WHICH KLDCP USES
1826 WAIT: CONSO DSK,%HIDON
1832 IFE BOOTSW, JRST BEG ;OR CONSZ DC0,DSSACT OR JRST LOADG1
1833 IFN BOOTSW, CONSZ DC0,DSSACT
1842 DADR==NCYLS_13+<<NSWBL-1>/2>_6+<<NSWBL-1>&1> ;ADDR OF LAST BLOCK IN CORE BUFFER
1843 DADR1==NCYLS_13+<NSWBL/2>_6+<NSWBL&1> ;ADDR OF NEXT BLOCK (CONTAINS
1844 SWPIN: DWRITE+DUNENB+DADR ; WORKING COPY OF DSKDMP)
1845 DCOPY BEG(-2000_2&37774)
1848 DCOPY BEG(-2000_2&37774)
1851 DCOPY BEG(-1700_2&37774)
1852 DCSKIP (-104_2&37774)
1854 DCOPY BEG(-1700_2&37774)
1855 DCSKIP (-104_2&37774)
1858 SWPOUT: DWRITE+DUNENB+DADR1
1859 DCOPY BEG(-2000_2&37774)
1862 DCOPY BEG(-2000_2&37774)
1865 DCOPY BEG(-1700_2&37774)
1866 DCSKIP (-104_2&37774)
1868 DCOPY BEG(-1700_2&37774)
1869 DCSKIP (-104_2&37774)
1872 CBLK: -NSWBL,,NBLKS ;DISK ADDR OF CORE BUFFER, - # BLOCKS IN LH
1873 WAIT: CONSZ DC0,DSSACT
1876 SADR: JRST BOOT ;AND GO TO PROGRAM TO BE STARTED
1877 SYSN: SIXBIT /./ ;CURRENT DIRECTORY
1878 IFG .+1-MEMSIZ,.ERR BOOT BLOAT
1880 IFE BOOTSW,{ ;CURLY BRACKETS TO AVOID ERROR MESSAGE
1884 ;THESE ARE THE BLOCKS THAT GET WRITTEN ON DISK
1885 ; STARTING AT THE BEGINNING OF THE FIRST EXTRA CYLINDER
1887 CBUF: BLOCK 2000 ;PSEUDO-CORE BUFFER
1888 DBUF: BLOCK 2000 ;DISK BUFFER
1889 DIR: BLOCK 2000 ;DIRECTORY BUFFER
1890 TUT: BLOCK 2000*NTUTBL ;TUT BUFFER
1891 IFN .-BEG,.ERR BLOCKS LOST
1892 ; BLOCK 2000 ;CORE OVERLAYED BY DSKDMP
1893 ; BLOCK 2000 ;COPY OF DSKDMP
1894 ; BLOCK 2000 ;SPARE COPY OF DSKDMP
1898 IFN BOOTSW, END CBOOT