mirror of
https://github.com/PDP-10/its.git
synced 2026-03-27 02:24:15 +00:00
disk parameters to separate file (system;rp04 >) from system;rh10 >. Made build default to RP04 when RH10 is specified, but switches can select RP06 for relevant components. Resolves #1648.
1994 lines
48 KiB
Plaintext
1994 lines
48 KiB
Plaintext
;;; -*-Midas-*-
|
||
;;; Copyright (c) 1999 Massachusetts Institute of Technology
|
||
;;; See the COPYING file at the top-level directory of this project.
|
||
|
||
TITLE DSKDMP
|
||
|
||
.MLLIT==1
|
||
|
||
DEFINE SETF TEXT,FLG
|
||
IFDEF FLG,.STOP
|
||
.TAG FOOBAR
|
||
PRINTC "TEXT
|
||
FLG="
|
||
.TTYMAC FLAG
|
||
.TTYFLG==.TTYFLG+1
|
||
PRINTX/FLAG
|
||
/
|
||
.TTYFLG==.TTYFLG-1
|
||
IFSE FLAG,YES,FLG==1
|
||
IFSE FLAG,NO,FLG==0
|
||
IFSE FLAG,Y,FLG==1
|
||
IFSE FLAG,N,FLG==0
|
||
IFNDEF FLG,FLG==FLAG
|
||
TERMIN
|
||
IFNDEF FLG,.GO FOOBAR
|
||
TERMIN
|
||
|
||
IF1,[
|
||
PRINTC "Configuration (KSRP06, KSRP07, KSRM03, KSRM80 or ASK) ? "
|
||
.TTYMAC MACH
|
||
IFSE MACH,KSRP06,[
|
||
HRIFLG==0
|
||
R11R6P==1
|
||
KS10P==1
|
||
NUDSL==500.
|
||
] ;KSRP06
|
||
IFSE MACH,KSRP07,[
|
||
HRIFLG==0
|
||
R11R6P==0
|
||
R11R7P==1
|
||
KS10P==1
|
||
NUDSL==500.
|
||
] ;KSRP07
|
||
IFSE MACH,KSRM03,[
|
||
HRIFLG==0
|
||
R11R6P==0
|
||
R11R7P==0
|
||
RM03P==1
|
||
KS10P==1
|
||
NUDSL==500.
|
||
] ;KSRM03
|
||
IFSE MACH,KSRM80,[
|
||
HRIFLG==0
|
||
R11R6P==0
|
||
R11R7P==0
|
||
RM03P==0
|
||
RM80P==1
|
||
KS10P==1
|
||
NUDSL==500.
|
||
] ;KSRM80
|
||
IFSN MACH,ASK,[
|
||
IFNDEF NUDSL,[ PRINTC /No known configuration for "MACH".
|
||
/ ]]
|
||
TERMIN
|
||
] ;IF1
|
||
|
||
SETF [Readin Mode Paper Tape?]HRIFLG
|
||
SETF [Assemble BOOT? (If no, full DSKDMP)]BOOTSW
|
||
|
||
SETF [RH11/RP06 disk system?]R11R6P
|
||
IFE R11R6P,[
|
||
SETF [RH11/RP07 disk system?]R11R7P
|
||
IFE R11R7P,[
|
||
SETF [RH11/RM03 disk system?]RM03P
|
||
IFE RM03P,[
|
||
SETF [RH11/RM80 disk system?]RM80P
|
||
IFE RM80P,[
|
||
SETF [RH10 (MC-KL) disk control?]RH10P
|
||
IFN RH10P,[
|
||
SETF [RH10/RP06 disk system?]R10R6P
|
||
IFN R10R6P,R10R4P==0
|
||
IFE R10R6P,R10R4P==1
|
||
RP10P==0
|
||
RP07P==0
|
||
RM80P==0
|
||
RM03P==0
|
||
]
|
||
IFE RH10P,[
|
||
SETF [AIKA disk control? (no => RP02/RP03)]DC10P
|
||
IFDEF DC10P,[
|
||
RH11P==0
|
||
RH10P==0
|
||
RP10P==1
|
||
RP06P==0
|
||
RP07P==0
|
||
RP04P==0
|
||
]]]]]]
|
||
|
||
IFDEF R11R6P,[
|
||
IFN R11R6P,[
|
||
RH11P==1
|
||
RH10P==0
|
||
RP06P==1
|
||
RP04P==0
|
||
RP07P==0
|
||
]]
|
||
IFDEF R11R7P,[
|
||
IFN R11R7P,[
|
||
RH11P==1
|
||
RH10P==0
|
||
RP06P==0
|
||
RP04P==0
|
||
RP07P==1
|
||
]]
|
||
IFDEF RM80P,[
|
||
IFN RM80P,[
|
||
RH11P==1
|
||
RH10P==0
|
||
RP06P==0
|
||
RP04P==0
|
||
RP07P==0
|
||
RM03P==0
|
||
]]
|
||
IFDEF RM03P,[
|
||
IFN RM03P,[
|
||
RH11P==1
|
||
RH10P==0
|
||
RP06P==0
|
||
RP04P==0
|
||
RP07P==0
|
||
RM80P==0
|
||
]]
|
||
IFDEF R10R6P,[
|
||
IFN R10R6P,[
|
||
RH10P==1
|
||
RH11P==0
|
||
RP10P==0
|
||
RP06P==1
|
||
RP04P==0
|
||
]
|
||
IFN R10R4P,[
|
||
RH10P==1
|
||
RH11P==0
|
||
RP10P==0
|
||
RP04P==1
|
||
RP06P==0
|
||
]]
|
||
|
||
IFN RH11P, RH10P==0
|
||
IFN RH11P+RH10P, DC10P==0
|
||
IFN RH10P+RH11P+DC10P, RP10P==0
|
||
|
||
IFN RH11P,[
|
||
IFN RP06P, RP07P==0
|
||
IFN RP06P+RP07P, RM03P==0
|
||
IFN RP06P+RP07P+RM03P, RM80P==0
|
||
]
|
||
IFN RH10P,[
|
||
IFN RP06P, RP04P==0
|
||
]
|
||
|
||
;IFN RP06P+RP07P+RM03P+RM80P, RH10P==0
|
||
;IFN RP06P+RP07P+RM03P+RM80P+RH10P, DC10P==0
|
||
;IFN RP06P+RP07P+RM03P+RM80P+RH10P+DC10P, RP10P==0
|
||
;IFE RP06P+RP07P+RM03P+RM80P+RH10P+DC10P, RP10P==1
|
||
|
||
IFE BOOTSW, SETF [Number of dirs? (DM-KA: 200., ML-KA: 250., AI-KA: 440., all others: 500.)]NUDSL
|
||
|
||
SETF [KS10 processor?]KS10P
|
||
IFE KS10P, SETF [KL10 processor? (no => KA10)]KL10P
|
||
IFN KS10P, KL10P==0
|
||
IFN KS10P+KL10P, KA10P==0
|
||
IFE KS10P+KL10P, KA10P==1
|
||
|
||
DEFINE RP
|
||
IFN RP10P!TERMIN
|
||
DEFINE SC
|
||
IFN DC10P!TERMIN
|
||
DEFINE RH
|
||
IFN RH10P!TERMIN
|
||
DEFINE PH
|
||
IFN RH11P!TERMIN
|
||
|
||
DEFINE KA
|
||
IFN KA10P!TERMIN
|
||
DEFINE KL
|
||
IFN KL10P!TERMIN
|
||
DEFINE KS
|
||
IFN KS10P!TERMIN
|
||
|
||
RP, PRINTC/Using RP10 controller
|
||
/
|
||
SC, PRINTC/Using DC10 controller
|
||
/
|
||
RH, PRINTC/Using RH10 controller
|
||
/
|
||
PH, PRINTC/Using RH11 controller
|
||
/
|
||
|
||
IFN HRIFLG,[
|
||
NOSYMS ;MAKE PAPER TAPE SHORTER
|
||
RIM10
|
||
]
|
||
|
||
C=1 ;C-A-B FOR LINKS
|
||
A=2
|
||
B=3
|
||
D=4
|
||
BLKIN=5 ;PSEUDO-CORE BLOCK IN CBUF
|
||
WRITE=6 ;NEG MEANS DUMP, RH 0 OR WRBIT
|
||
DIFF=7 ;DIFF CONO ALSO TEMP
|
||
HEAD=10 ;HEAD CONO ALSO TEMP
|
||
P=11 ;JSP AC
|
||
BLOK=12
|
||
UNIT=13 ;UNIT AND M.A. DATAO
|
||
CMD=14 ;COMMAND CHAR
|
||
T=15 ;VERY TEMP
|
||
TT=16 ;ANOTHER JSP AC, ALSO VERY TEMP
|
||
BUFP=17 ;DBUF PNTR--LAST WORD USED
|
||
|
||
IF1,[ ;DON'T TAKE A WEEK AND A HALF TO ASSEMBLE.
|
||
RP, .INSRT SYSTEM;RP10 >
|
||
SC, .INSRT SYSTEM;DC10 >
|
||
RH, .INSRT SYSTEM;RH10 >
|
||
PH, .INSRT SYSTEM;RH11 >
|
||
|
||
IFN RP06P, .INSRT SYSTEM;RP06 >
|
||
IFN RP07P, .INSRT SYSTEM;RP07 >
|
||
IFN RP04P, .INSRT SYSTEM;RP04 >
|
||
IFN RM03P, .INSRT SYSTEM;RM03 >
|
||
IFN RM80P, .INSRT SYSTEM;RM80 >
|
||
|
||
IFE BOOTSW, .INSRT SYSTEM;FSDEFS >
|
||
IFE BOOTSW, KL, .INSRT SYSTEM;EPT >
|
||
KS, .INSRT SYSTEM;KSDEFS >
|
||
KA, TTY==120
|
||
]
|
||
|
||
;PARAMETER FILE FOR DSKDMP
|
||
|
||
MEMSIZ=1000000 ;ACTUAL SIZE OF MEM
|
||
IFNDEF DBGSW,DBGSW==0 ;1 TO DEBUG THIS WITH DDT
|
||
DDT==MEMSIZ-4000
|
||
IFN DBGSW,MEMSIZ==MEMSIZ-10000 ;MOVE DOWN UNDER DDT IF DEBUG MODE
|
||
CORE==MEMSIZ-10000-<2000*NTUTBL> ;HIGHEST ADR ALWAYS IN CORE+1
|
||
CORES==CORE_<-12> ;BLK # OF ABOVE (FIRST OF BLKS SWAPPED OUT FOR BUFFER AREAS)
|
||
NSWBL==4+NTUTBL ;# BLOCKS SWAPPED OUT FOR BUFFER AREAS, +1 FOR DSKDMP ITSELF
|
||
HIGH==MEMSIZ-100 ;HIGHEST ADR LOADED/DUMPED+1
|
||
|
||
NDSK==8 ;MAX POSSIBLE. L$n$ DEFINES WHICH ARE REALLY THERE
|
||
RP,ICWA=34
|
||
RH,ICWA=34
|
||
|
||
PH, UBPG==:17 ; Use last (usable) page in Unibus map
|
||
|
||
KA, LPM=102000,,
|
||
KA, LPMR=LPM 2,
|
||
KL, PAG=<BLKI 10,>-<BLKI>
|
||
|
||
DEFINE INFORM A,B
|
||
IF1,[ PRINTX A = B
|
||
] TERMIN
|
||
|
||
;COMMANDS ARE:
|
||
; L$file LOAD FILE INTO CORE
|
||
; T$file LOAD FILE INTO CORE AND GIVE SYMBOLS TO DDT AND START DDT
|
||
; M$file LOAD FILE INTO CORE WITHOUT CLEARING CORE FIRST, DOESN'T LOAD SYMBOLS
|
||
; K$file DELETE FILE
|
||
; D$file DUMP CORE INTO FILE
|
||
; I$file VERIFY FILE AGAINST CORE
|
||
; G$ START AT STARTING ADDRESS
|
||
; U$dir; LIST DIRECTORY
|
||
; F$ LIST CURRENT DIRECTORY
|
||
; S$ LIST PACK IDS THEN MFD
|
||
; nnn$ SET STARTING ADDRESS TO nnn
|
||
; L$n$ PUT DISK n ONLINE
|
||
; K$n$ TAKE DISK n OFFLINE
|
||
|
||
;ERROR MESSAGES ARE:
|
||
; CMPERR VERIFY FAILED TO MATCH
|
||
; DIRFUL DIRECTORY FULL
|
||
; EOF UNEXPECTED EOF
|
||
; DIRNF DIRECTORY DOES NOT EXIST
|
||
; FNF FILE NOT FOUND
|
||
; PKNMTD FILE IS ON PACK THAT IS NOT MOUNTED
|
||
; CKSERR CHECKSUM ERROR
|
||
; DSKFUL DISK FULL
|
||
; NODDT CAN'T ADDRESS DDT SYMBOL TABLE (BUG)
|
||
; ?BUG? BUG
|
||
; SEEKFL DISK SEEK ERROR
|
||
; CLOBRD DISK READ ERROR
|
||
; CLOBWR DISK WRITE ERROR
|
||
; DIRCLB DIR NAME DIFFERS, TUT DISAGREES WITH DIR
|
||
; MFDCLB M.F.D. CLOBBERED
|
||
; DSKLUZ DISK LOSSAGE (OFFLINE OR UNSAFE OR MASSBUS ERROR)
|
||
|
||
KS, LOC 4000 ; Avoid MTBOOT and KSRIM
|
||
|
||
IFE BOOTSW,[
|
||
ZZZ: IFE DBGSW,[
|
||
MOVE T,.... ;THIS CODE BLTS THE FOLLOWING OFFSET CODE
|
||
BLT T,MEMSIZ-1-1 ;INTO HIGH MEMORY AND WRITES DSKDMP ON ITS
|
||
MOVE T,PROG+MEMSIZ-2-BEG+1
|
||
MOVEM T,BEG+MEMSIZ-2-BEG+1 ;AVOID LOSING DUE TO -1 BLT LOSSAGE
|
||
]
|
||
MOVSI T,-NDSK+1 ;MAKE ALL BUT DISK 0 BE DEAD (MUST DO L$ TO MAKE THEM ALIVE)
|
||
SETOM QDED+1(T)
|
||
MOVNS QDED+1(T)
|
||
AOBJN T,.-2
|
||
SETZM QDED+0
|
||
RP,[ MOVEI T,ICWA+2 ;SET UP CHANNEL JUMP
|
||
MOVEM T,ICWA ;IN INITIAL CHANNEL ADDRESS
|
||
SETZM ICWA+1 ;AND CLEAR REMAINING STUFF
|
||
SETZM ICWA+3
|
||
DATAO DPC,SUNIT0
|
||
DATAI DPC,B
|
||
TRNN B,RP03BT
|
||
JRST WBOOT1
|
||
MOVEI B,MBLKS ;UNIT 0 IS AN RP03, ADJUST WORLD
|
||
HRRM B,CBLK
|
||
MOVE B,RP3ADJ
|
||
MOVSI A,-NSWBL
|
||
XORM B,SWPSK(A)
|
||
AOBJN A,.-1
|
||
WBOOT1: HLLZS BOOT0
|
||
MOVEI UNIT,BEG ;MAGIC BLOCK THEN STARTS IT
|
||
HRRZ BLOK,CBLK
|
||
ADDI BLOK,NSWBL ;FIRST BLOCK AFTER CORE BUFFER IS WHERE DSKDMP LIVES
|
||
MOVEI WRITE,10
|
||
JSP TT,WRD3
|
||
HRRZ BLOK,CBLK
|
||
ADDI BLOK,NSWBL+1
|
||
MOVEI WRITE,10
|
||
JSP TT,WRD3
|
||
CONSZ DPC,ALLER
|
||
IFN DBGSW,JRST DDT
|
||
IFE DBGSW,JRST 4,. ;FORMERLY JRST MEMSIZ-400 (??)
|
||
JRST BEG
|
||
];RP
|
||
PH,[ MOVEI T,%HYCLR ; Clear controller
|
||
IOWRQ T,%HRCS2 ; (Selects drive 0)
|
||
WBOOT0: IORDQ T,%HRCS1
|
||
TRNN T,%HXDVA
|
||
JRST WBOOT0 ; Await drive available (well, it is a dual
|
||
; ported drive... perhaps someday?)
|
||
MOVEI UNIT,BEG
|
||
HRRZ BLOK,CBLK
|
||
ADDI BLOK,NSWBL ; FIRST BLOCK AFTER CORE BUFFER IS WHERE
|
||
; DSKDMP LIVES
|
||
MOVEI WRITE,10
|
||
JSP TT,WRD3
|
||
HRRZ BLOK,CBLK
|
||
ADDI BLOK,NSWBL+1
|
||
MOVEI WRITE,10
|
||
JSP TT,WRD3
|
||
IORDQ TT,%HRCS1
|
||
TRNE TT,%HXTRE+%HXMCP
|
||
IFN DBGSW, JRST DDT
|
||
IFE DBGSW, JRST 4,. ; Formerly JRST MEMSIZ-400 (??)
|
||
JRST BEG
|
||
];PH
|
||
RH,[ MOVEI T,ICWA+2 ;SET UP CHANNEL JUMP
|
||
MOVEM T,ICWA ;IN INITIAL CHANNEL ADDRESS
|
||
SETZM ICWA+1 ;AND CLEAR REMAINING STUFF
|
||
SETZM ICWA+3
|
||
WBOOT0: DATAO DSK,[%HRDCL,,]
|
||
MOVEI A,20
|
||
SOJG A,.
|
||
DATAI DSK,A
|
||
TRNN A,%HCDVA
|
||
JRST WBOOT0 ;AWAIT DRIVE AVAILABLE
|
||
MOVEI UNIT,BEG ;MAGIC BLOCK THEN STARTS IT
|
||
HRRZ BLOK,CBLK
|
||
ADDI BLOK,NSWBL ;FIRST BLOCK AFTER CORE BUFFER IS WHERE DSKDMP LIVES
|
||
MOVEI WRITE,10
|
||
JSP TT,WRD3
|
||
HRRZ BLOK,CBLK
|
||
ADDI BLOK,NSWBL+1
|
||
MOVEI WRITE,10
|
||
JSP TT,WRD3
|
||
CONSZ DSK,%HIERR
|
||
IFN DBGSW,JRST DDT
|
||
IFE DBGSW,JRST 4,. ;FORMERLY JRST MEMSIZ-400 (??)
|
||
JRST BEG
|
||
];RP
|
||
SC,[ MOVEI UNIT,BEG ;MAGIC BLOCK THEN STARTS IT
|
||
MOVEI BLOK,NBLKS+NSWBL
|
||
MOVEI WRITE,60
|
||
JSP TT,WRD3
|
||
MOVEI BLOK,NBLKS+NSWBL+1
|
||
MOVEI WRITE,60
|
||
JSP TT,WRD3
|
||
DATAO DC0,.....
|
||
CONSZ DC0,DSSACT
|
||
JRST .-1
|
||
CONSZ DC0,DSSERR
|
||
IFN DBGSW,JRST DDT
|
||
IFE DBGSW,JRST 4,. ;FORMERLY JRST MEMSIZ-400 (??)
|
||
JRST BEG
|
||
|
||
.....: DJMP .+1
|
||
DWRITE
|
||
DCOPY ......(-LRIBLK_2&37774)
|
||
DHLT
|
||
|
||
......: DWRITE+DUNENB+DADR ;FOR READIN
|
||
DCOPY BEG(-2000_2&37774)
|
||
DREAD+DADR1
|
||
DCOPY BEG(-2000_2&37774)
|
||
DHLT
|
||
];SC
|
||
|
||
IFE DBGSW,[
|
||
....: PROG,,BEG
|
||
|
||
KA, LOC 2000 ; MAKE OFFSET CONVENIENT
|
||
KL, LOC 2000
|
||
KS, LOC 6000 ; Avoid MTBOOT and KSRIM
|
||
PROG: OFFSET CORE+<<NSWBL-1>*2000>-.
|
||
]IFN DBGSW,LOC MEMSIZ-2000
|
||
|
||
BEG:
|
||
KA,[ CONO 635550 ;ENTER HERE, CLEAR WORLD
|
||
JRST .+1
|
||
JFCL 1,[JRST 4,.] ;A PDP6??
|
||
LPMR [0]-2 ;TURN OFF EXEC PAGING
|
||
]
|
||
KL,[ CONO 327740 ;CLEAR APR
|
||
CONSZ PAG,660000 ;PAGING AND CACHE BETTER BE OFF
|
||
JRST 4,.
|
||
]
|
||
KS,[ CONO 127760 ; Enable, and Clear all.
|
||
RDEBR B
|
||
TRNE B,60000 ; Paging and Tops-20 better be off.
|
||
JRST 4,.
|
||
SETZM 8SWIT0 ; Clear 8080 Communications area to prevent
|
||
MOVE B,[8SWIT0,,8SWIT0+1] ; mysterious IO behavior.
|
||
BLT B,8RHBAS-1
|
||
;; If the machine has just been powered on, there is likely to be
|
||
;; bad parity all over the place. I guess that isn't our problem
|
||
;; as long as we don't touch any of it...
|
||
]
|
||
MOVSI B,-NDSK ;FOR NUMBER OF DISKS
|
||
SETOM PKNUM(B) ;SET DISK TO UNKNOWN
|
||
AOBJN B,.-1
|
||
MOVE T,[JRST LOADG1] ;SET BOOTSTRAP TO MIDDLE OF WORLD
|
||
MOVEM T,BOOT
|
||
MOVE D,['DSKDMP] ;ANNOUNCE SELF
|
||
JSP TT,PD
|
||
JRST READ ;CRLF AND BEGIN READING COMMANDS
|
||
|
||
ERROR: 0
|
||
CLEARM MEMSIZ-1 ;DON'T READ ANY MORE COMMANDS FROM MEMORY
|
||
SOS T,ERROR ;PICK UP ERROR CODE FROM THE AC FIELD OF
|
||
LDB T,[270400+T,,] ;THE JSR ERROR
|
||
MOVE D,ERMESS(T)
|
||
JSP TT,PD ;PRINT OUT APPROPRIATE COMMENT
|
||
CAIL T,EBUG
|
||
JRST READ ;BAD ERROR - NO MORE DISKING
|
||
LOADG1:
|
||
KA, DATAI TTY,C ;FLUSH RANDOM CHARACTER
|
||
KS, SETZM 8CTYIN ; ".RESET"
|
||
TRO CMD,10 ;MAKE SURE PSEUDO-CORE IN CORE
|
||
JRST LOADG ;BY SIMULATING END OF LOADING, NON-GOING COMMAND
|
||
|
||
ERMESS: IRP XX,,[ECMP,EDIR,EEOF,ESNF,EFNF,EPNM,ECKS
|
||
EDSK,EDDT,EBUG,EC63,ECRD,ECWR,ECDR,EMFC,EDLZ]YY,,[CMPERR,DIRFUL
|
||
EOF,DIRNF,FNF,PKNMTD,CKSERR,DSKFUL,NODDT,?BUG?,SEEKFL
|
||
CLOBRD,CLOBWR,DIRCLB,MFDCLB,DSKLUZ]
|
||
XX==.-ERMESS
|
||
SIXBIT \YY\
|
||
TERMIN
|
||
|
||
PD: JSP P,CRLF ;TYPE A CR
|
||
PD2: MOVEI C,40
|
||
JSP P,TYO ;AND A SPACE
|
||
MOVE B,[440600,,D]
|
||
PD1: ILDB C,B ;AND THE SIXBIT CONTENTS OF D
|
||
ADDI C,40
|
||
JSP P,TYO
|
||
TLNE B,770000
|
||
JRST PD1
|
||
JRST (TT)
|
||
|
||
PNO:
|
||
C12: IDIVI C,10. ;PRINT CONTENTS OF C AS A TWO-DIGIT
|
||
DPB C,[60600,,A] ;DECIMAL NUMBER PRECEDED
|
||
MOVEI D,(SIXBIT /#00/+A) ;BY <SPACE>#
|
||
MOVE B,[300600,,D]
|
||
JRST PD1
|
||
|
||
WRCB: MOVEI UNIT,CBUF ;WRITE OUT CONTENTS OF CBUF
|
||
LSH BLKIN,-12 ;ON APPROPRIATE BLOCK
|
||
HRRZ BLOK,CBLK
|
||
ADDI BLOK,-CORES(BLKIN)
|
||
JRST WRM
|
||
|
||
LODUMP: MOVEI UNIT,CORE ;DEPENDING ON SIGN BIT OF WRITE, LOAD OR DUMP
|
||
HRRZ BLOK,CBLK ;PSEUDO-CORE (766000-775777)
|
||
LODMP1: JSP TT,WRDM
|
||
ADDI UNIT,2000
|
||
CAIGE UNIT,BEG
|
||
AOJA BLOK,LODMP1
|
||
MOVEI BLKIN,CORE
|
||
JRST (P)
|
||
|
||
FD: HRRZ C,B ;SET UP POINTER IN C TO FETCH OR DEPOSIT
|
||
;CONTENTS OF ADDRESS IN RIGHT HALF OF B
|
||
IFN DBGSW, SKIPGE WRITE ;LOAD DDT WHEN IN DEBUG MODE
|
||
CAIGE C,HIGH
|
||
CAIGE C,40
|
||
JRST (P)
|
||
CAIGE C,CORE ;IF ADDR IS IN REAL CORE, RETURN IMMEDIATELY
|
||
JRST 1(P)
|
||
FDX: CAIL C,(BLKIN) ;ADDR IS IN PSEUDO-CORE--CHECK IF RIGHT
|
||
CAILE C,1777(BLKIN) ;BLOCK IS IN CBUF
|
||
JRST FD3 ;IT'S NOT THERE--READ IT IN
|
||
FD4: SUBI C,-CORE(BLKIN) ;IT'S THERE--SET UP RIGHT POINTER IN C
|
||
JRST 1(P) ;AND RETURN
|
||
FD3: JUMPLE WRITE,FD3A ;IF DUMP OR VERIFY DON'T BOTHER
|
||
;TO WRITE OUT CURRENT BLOCK
|
||
FD3B: JSP TT,WRCB ;IF LOAD, WRITE CURRENT BLOCK FIRST
|
||
FD3A: MOVEI UNIT,CBUF
|
||
MOVE BLKIN,C
|
||
ANDI BLKIN,776000
|
||
LDB BLOK,[121000,,BLKIN]
|
||
ADD BLOK,CBLK
|
||
MOVEI BLOK,-CORES(BLOK)
|
||
JSP TT,RDM ;READ IN CORRECT BLOCK
|
||
JRST FD4 ;SET UP POINTER AND RETURN
|
||
|
||
GBP: IDIVI C,6 ;TURN USER DIRECTORY CHARACTER ADDR IN C
|
||
IMULI A,-60000 ;INTO A BYTE POINTER
|
||
HRLI C,440600(A)
|
||
ADDI C,DIR+UDDESC
|
||
JRST (TT)
|
||
|
||
WD: AOBJN BUFP,WD1 ;READ, WRITE, OR VERIFY WORD IN D FROM, INTO,
|
||
JSP TT,NXTBLK ;OR AGAINST WORD IN DBUF
|
||
JSP TT,WRDB ;TIME TO REFILL OR EMPTY DBUF
|
||
MOVSI BUFP,-2000 ;RESET BUFFER POINTER
|
||
WD1: JUMPG WRITE,WD2 ;JUMP ON LOAD
|
||
JUMPL WRITE,WD3 ;JUMP ON WRITE
|
||
CAME D,DBUF(BUFP) ;HERE IF VERIFY
|
||
JSR ECMP,ERROR ;VERIFY COMPARE LOST
|
||
JRST (P)
|
||
WD2: SKIPA D,DBUF(BUFP) ;LOAD
|
||
WD3: MOVEM D,DBUF(BUFP) ;DUMP
|
||
JRST (P)
|
||
|
||
NXTTUT: HRRZ B,CU ;SELECT NEXT UNIT AND READ ITS TUT
|
||
AOJ B,
|
||
CAIN B,NDSK
|
||
MOVEI B,0
|
||
HRRM B,CU
|
||
CAIN B,@MU
|
||
JRST 1(TT) ;SKIP IF NO MORE
|
||
SKIPE QDED(B)
|
||
JRST NXTTUT ;UNIT NOT ON LINE
|
||
RDTUT: MOVEI BLOK,TUTBLK ;READ TUT OF CURRENT UNIT
|
||
MOVEI UNIT,TUT
|
||
SETOM PKNUM(B) ;ALWAYS READ HEADER FOR TUT
|
||
IFG NTUTBL-1,[ ;READ IN MULTI-BLOCK TUT
|
||
HRRM TT,RDTUTX ;SAVE RETURN ADDRESS
|
||
REPEAT NTUTBL-1,[
|
||
JSP TT,RD
|
||
ADDI UNIT,2000
|
||
AOS BLOK
|
||
]
|
||
RDTUTX: MOVEI TT,.
|
||
]
|
||
JRST RD
|
||
|
||
NXTBW3: 0
|
||
IBP DIRPT ;DO AN IDPB T,DIRPT CHECKING TO SEE IF
|
||
LDB DIFF,[1200,,DIRPT] ;RUNNING INTO NAME AREA
|
||
CAML DIFF,DIR+UDNAMP
|
||
JSR EDIR,ERROR
|
||
DPB T,DIRPT
|
||
JRST @NXTBW3
|
||
|
||
NXTBW: MOVE BLOK,LBLOCK ;FIND NEXT FREE BLOCK TO WRITE
|
||
MOVEI HEAD,1(BLOK)
|
||
ILDB T,TUTPT
|
||
JUMPN T,NXTBW1 ;JUMP IF VERY NEXT BLOCK NOT FREE
|
||
AOSG T,BLKCNT
|
||
NXTBW5: SOJA HEAD,NXTBW4 ;GENERATE LOAD ADR IF FIRST TIME (COMPENSATE FOR LBLOCK OFF BY 1)
|
||
CAIG T,UDTKMX-1
|
||
JRST NXTBW2 ;NO NEED TO MODIFY DIRECTORY YET
|
||
CLEARM BLKCNT ;14 IN A ROW--RESET COUNTER AND
|
||
NXTBW6: JSR NXTBW3 ;DPB BYTE INTO DIRECTORY
|
||
NXTBW2: MOVE BLOK,HEAD
|
||
CAML BLOK,TUT+QLASTB
|
||
JSR EDSK,ERROR ;NO MORE DISK LEFT
|
||
MOVEI T,1
|
||
DPB T,TUTPT ;MARK BLOCK USED IN TUT
|
||
JRST WRDB1
|
||
|
||
NXTBW1: ADDI HEAD,1 ;SEARCH FOR NEXT FREE BLOCK
|
||
ILDB T,TUTPT
|
||
JUMPN T,NXTBW1
|
||
SUBM HEAD,BLOK
|
||
SKIPLE T,BLKCNT ;COME UP WITH DESC BYTE FOR LAST FEW BLOCKS
|
||
JSR NXTBW3
|
||
CLEARM BLKCNT
|
||
JUMPL T,NXTBW5 ;FIRST TIME
|
||
MOVEI T,UDTKMX-1(BLOK)
|
||
CAIGE T,UDWPH ;CAN WE SAY SKIP N--TAKE 1?
|
||
JRST NXTBW6 ;YES
|
||
NXTBW4: MOVEI BLOK,NXLBYT
|
||
MOVE T,HEAD
|
||
ROT T,-NXLBYT*6
|
||
ADDI T,UDWPH+1
|
||
JSR NXTBW3
|
||
ROT T,6
|
||
SOJG BLOK,.-2
|
||
JRST NXTBW6
|
||
|
||
NXTBLK: JUMPL WRITE,NXTBW ;GET NEXT BLOCK OF FILE--IF DUMP, FIND FREE
|
||
MOVE BLOK,LBLOCK ;BLOCK
|
||
NXTB6: SOSLE BLKCNT ;HAVE WE RUN OUT OF "TAKE N"?
|
||
AOJA BLOK,WRDB1 ;NO--TAKE NEXT BLOCK
|
||
ILDB T,DIRPT ;YES--GET NEXT DESC BYTE
|
||
CAILE T,UDWPH
|
||
JRST NXTB1 ;IT'S A LOAD ADDR
|
||
CAIE T,UDWPH
|
||
JUMPN T,NXTB2 ;IT'S A TAKE OR SKIP
|
||
CAIE CMD,'D ;IT'S 0 OR NULL--IF THIS IS A LOAD, IT'S AN
|
||
CAIN CMD,'K ;UNEXPECTED END OF FILE
|
||
JRST KILL1 ;IF DUMP OR KILL, O.K.
|
||
JSR EEOF,ERROR
|
||
|
||
NXTB1: MOVEI BLOK,-UDWPH-1(T) ;LOAD ADR
|
||
MOVEI BUFP,NXLBYTS
|
||
NXTB1A: MOVEI T,0
|
||
CAIE CMD,'D
|
||
CAIN CMD,'K
|
||
DPB T,DIRPT ;IF KILLING FILE, ZERO THIS BYTE (OTHERS ZEROED AT KILL)
|
||
LSH BLOK,6
|
||
ILDB T,DIRPT
|
||
ADD BLOK,T ;GET COMPLETE BLOCK NUMBER
|
||
SOJG BUFP,NXTB1A
|
||
JRST NXTB3
|
||
|
||
NXTB2: MOVEM T,BLKCNT
|
||
CAIG T,UDTKMX
|
||
AOJA BLOK,WRDB1 ;TAKE N STARTING WITH NEXT ONE
|
||
ADDI BLOK,-UDTKMX+1(T) ;SKIP N-<MAX TAKE> AND TAKE 1
|
||
NXTB3: CLEARM BLKCNT
|
||
WRDB1: MOVEM BLOK,LBLOCK
|
||
JRST (TT)
|
||
;RP10 IO ROUTINE
|
||
RP,[
|
||
WRDM: SKIPL WRITE ;SEE WHETHER LOAD OR DUMP/VERIFY
|
||
RDM: TRZA WRITE,(WRITE) ;READ FROM MASTER UNIT
|
||
WRM: HRRI WRITE,10 ;WRITE ON MASTER UNIT
|
||
MU: IORI WRITE,0 ;MASTER UNIT SELECT STORED HERE
|
||
JRST WRD3A
|
||
|
||
WRDB: MOVEI UNIT,DBUF ;READ OR WRITE DBUF FROM/ON CURRENT UNIT
|
||
WRD: SKIPL WRITE ;READ OR WRITE FROM/ON CURRENT UNIT
|
||
RD: TRZA WRITE,(WRITE) ;READ FROM CURRENT UNIT
|
||
WR: HRRI WRITE,10 ;WRITE ON CURRENT UNIT
|
||
CU: IORI WRITE,0 ;CURRENT UNIT SELECT STORED HERE
|
||
WRD3A:
|
||
WRD3: DPB WRITE,[360600,,DBLK] ;SET OP, UNIT SEL
|
||
DPB WRITE,[DUNFLD SEEK]
|
||
DPB WRITE,[DUNFLD RECAL]
|
||
HRLI UNIT,-2000 ;ADDRESS COMES IN IN `UNIT'
|
||
MOVEM UNIT,@ICWA
|
||
SOS @ICWA
|
||
LDB UNIT,[300,,WRITE] ;ISOLATE FROM GARBAGE
|
||
MOVNI DIFF,16. ;INITIALIZE ERROR COUNTER
|
||
MOVEM DIFF,ERRCT ;15. LOSSES PERMITTED
|
||
WRD5: HRRZ DIFF,BLOK
|
||
IMULI DIFF,SECBLK
|
||
IDIVI DIFF,NSECS
|
||
DPB HEAD,[DSECT DBLK]
|
||
IDIVI DIFF,NHEDS
|
||
DPB HEAD,[DSURF DBLK]
|
||
DPB DIFF,[DCYL DBLK]
|
||
DPB DIFF,[DCYL SEEK]
|
||
DATAO DPC,CLATT ;CLEAR ATTENTIONS
|
||
LSH DIFF,-8 ;EXTRA CYLINDER BIT FOR RP03
|
||
DPB DIFF,[DCYLXB DBLK]
|
||
DPB DIFF,[DCYLXB SEEK]
|
||
DATAO DPC,SEEK
|
||
DATAI DPC,DIFF
|
||
TRNN DIFF,ALLATT
|
||
JRST .-2
|
||
DATAO DPC,CLATT
|
||
TLNN DIFF,(ONCYL)
|
||
JRST WRD0
|
||
DATAO DPC,DBLK
|
||
CONSO DPC,DONE
|
||
JRST .-1
|
||
CONSO DPC,ALLER
|
||
JRST WRDX
|
||
HRRZM BLOK,BADBLK
|
||
AOSG ERRCT ;HARDWARE ERROR--CHECK COUNTER
|
||
JRST WRD5 ;TRY AGAIN
|
||
TRNE WRITE,10 ;GIVE UP--DISTINGUISH BETWEEN
|
||
JSR ECWR,ERROR ;WRITE ERRORS AND
|
||
JSR ECRD,ERROR ;READ ERRORS
|
||
|
||
WRDX: HRRZ UNIT,@ICWA ;RESTORE ADDR
|
||
ADDI UNIT,1 ;COMPENSATE FOR IOWD LOSSAGE
|
||
TRZ WRITE,-1 ;FLUSH GARBAGE
|
||
JRST (TT)
|
||
|
||
WRD0: AOSLE ERRCT
|
||
JSR EC63,ERROR
|
||
DATAO DPC,RECAL
|
||
DATAI DPC,DIFF
|
||
TRNN DIFF,ALLATT
|
||
JRST .-2
|
||
JRST WRD5
|
||
|
||
DBLK: ICWA
|
||
SEEK: DSEEKC
|
||
RECAL: DRCALC
|
||
CLATT: DEASEC ALLATT
|
||
];RP
|
||
;RH11 IO ROUTINE
|
||
PH,[
|
||
WRDM: SKIPL WRITE ;SEE WHETHER LOAD OR DUMP/VERIFY
|
||
RDM: TRZA WRITE,(WRITE) ;READ FROM MASTER UNIT
|
||
WRM: HRRI WRITE,10 ;WRITE ON MASTER UNIT
|
||
MU: IORI WRITE,0 ;MASTER UNIT SELECT STORED HERE
|
||
JRST WRD3A
|
||
|
||
WRDB: MOVEI UNIT,DBUF ;READ OR WRITE DBUF FROM/ON CURRENT UNIT
|
||
WRD: SKIPL WRITE ;READ OR WRITE FROM/ON CURRENT UNIT
|
||
RD: TRZA WRITE,(WRITE) ;READ FROM CURRENT UNIT
|
||
WR: HRRI WRITE,10 ;WRITE ON CURRENT UNIT
|
||
CU: IORI WRITE,0 ;CURRENT UNIT SELECT STORED HERE
|
||
WRD3A:
|
||
WRD3: TRNE UNIT,1777 ; Better be on a page boundary!
|
||
JRST 4,.
|
||
LDB DIFF,[111100,,UNIT] ; Point Unibus map at page in question
|
||
TRO DIFF,%UQFST+%UQVAL
|
||
IOWRQ DIFF,UBAPAG+UBPG_1
|
||
ADDI DIFF,1
|
||
IOWRQ DIFF,UBAPAG+UBPG_1+1
|
||
LDB DIFF,[000300,,WRITE] ; Select drive
|
||
IOWRQ DIFF,%HRCS2
|
||
JSP HEAD,RHCHEK ; Check for immediate trouble
|
||
MOVEI DIFF,%HMRDP ; Init the drive
|
||
IOWRQ DIFF,%HRCS1
|
||
MOVNI DIFF,16. ;INITIALIZE ERROR COUNTER
|
||
MOVEM DIFF,ERRCT ;15. LOSSES PERMITTED
|
||
WRD5: MOVNI DIFF,4000
|
||
IOWRQ DIFF,%HRWC ; 4000 half words
|
||
MOVEI DIFF,UBPG_14
|
||
IOWRQ DIFF,%HRBA ; "Byte" base address
|
||
HRRZ DIFF,BLOK
|
||
IDIVI DIFF,NBLKSC
|
||
IOWRQ DIFF,%HRCYL ; Desire cylinder
|
||
MOVE DIFF,HEAD
|
||
IMULI DIFF,SECBLK
|
||
IDIVI DIFF,NSECS
|
||
DPB DIFF,[$HATRK HEAD]
|
||
IOWRQ HEAD,%HRADR ; Desire track and sector
|
||
MOVEI DIFF,%HMRED
|
||
TRNE WRITE,10
|
||
MOVEI DIFF,%HMWRT
|
||
IOWRQ DIFF,%HRCS1 ; Do it (implied seek)
|
||
WRD7: IORDQ DIFF,%HRCS1
|
||
TRNN DIFF,%HXRDY ; Wait for controller to finish
|
||
JRST WRD7
|
||
TRNN DIFF,%HXTRE+%HXMCP ; Trouble?
|
||
JRST WRDX ; Nope, exit
|
||
HRRZM BLOK,BADBLK
|
||
AOSG ERRCT ;HARDWARE ERROR--CHECK COUNTER
|
||
JRST WRD0 ;RECALIBRATE AND TRY AGAIN
|
||
TRNE WRITE,10 ;GIVE UP--DISTINGUISH BETWEEN
|
||
JSR ECWR,ERROR ;WRITE ERRORS AND
|
||
JSR ECRD,ERROR ;READ ERRORS
|
||
|
||
WRDX: TRZ WRITE,-1 ;FLUSH GARBAGE
|
||
JRST (TT)
|
||
|
||
WRD0: MOVEI DIFF,%HYCLR ; Clear controller
|
||
IOWRQ DIFF,%HRCS2
|
||
LDB DIFF,[000300,,WRITE] ; Select drive
|
||
IOWRQ DIFF,%HRCS2
|
||
MOVEI DIFF,%HMCLR ; Clear drive
|
||
IOWRQ DIFF,%HRCS1
|
||
JSP HEAD,RHCHEK ; Immediate lossage?
|
||
MOVEI DIFF,%HMREC ; Recalibrate
|
||
IOWRQ DIFF,%HRCS1
|
||
MOVEI HEAD,100000.
|
||
WRD0A: SOSGE HEAD
|
||
JSR EC63,ERROR
|
||
IORDQ DIFF,%HRSTS
|
||
TRNE DIFF,%HSPIP ; WAIT FOR DRIVE TO FINISH
|
||
JRST WRD0A
|
||
ANDI DIFF,%HSDPR+%HSMOL+%HSVV+%HSRDY+%HSERR
|
||
CAIE DIFF,%HSDPR+%HSMOL+%HSVV+%HSRDY
|
||
JSR EDLZ,ERROR
|
||
JRST WRD5
|
||
|
||
;;; JSP HEAD,RHCHEK to check for errors.
|
||
RHCHEK: IORDQ DIFF,%HRCS1
|
||
TRNE DIFF,%HXTRE+%HXMCP
|
||
JSR EDLZ,ERROR
|
||
JRST (HEAD)
|
||
];PH
|
||
;RH10 IO ROUTINE
|
||
RH,[
|
||
WRDM: SKIPL WRITE ;SEE WHETHER LOAD OR DUMP/VERIFY
|
||
RDM: TRZA WRITE,(WRITE) ;READ FROM MASTER UNIT
|
||
WRM: HRRI WRITE,10 ;WRITE ON MASTER UNIT
|
||
MU: IORI WRITE,0 ;MASTER UNIT SELECT STORED HERE
|
||
JRST WRD3A
|
||
|
||
WRDB: MOVEI UNIT,DBUF ;READ OR WRITE DBUF FROM/ON CURRENT UNIT
|
||
WRD: SKIPL WRITE ;READ OR WRITE FROM/ON CURRENT UNIT
|
||
RD: TRZA WRITE,(WRITE) ;READ FROM CURRENT UNIT
|
||
WR: HRRI WRITE,10 ;WRITE ON CURRENT UNIT
|
||
CU: IORI WRITE,0 ;CURRENT UNIT SELECT STORED HERE
|
||
WRD3A:
|
||
WRD3: HRLI UNIT,-2000 ;ADDRESS COMES IN IN `UNIT'
|
||
CONI DSK,HEAD ;SET WORD COUNT TO ONE BLOCK
|
||
TLNE HEAD,(%HID22) ;ACCORDING TO TYPE OF CHANNEL
|
||
HRLI UNIT,-2000_4
|
||
MOVEM UNIT,@ICWA
|
||
LDB UNIT,[300,,WRITE] ;ISOLATE FROM GARBAGE
|
||
SOS @ICWA ;ADJUST FOR DF10 LOSSAGE
|
||
MOVNI DIFF,16. ;INITIALIZE ERROR COUNTER
|
||
MOVEM DIFF,ERRCT ;15. LOSSES PERMITTED
|
||
WRD5: MOVSI DIFF,%HRDCL(UNIT)
|
||
HRRI DIFF,%HMRDP ;INIT THE DRIVE
|
||
JSP HEAD,RHSET
|
||
HRRZ DIFF,BLOK
|
||
IDIVI DIFF,NBLKSC
|
||
EXCH DIFF,HEAD
|
||
MOVEM HEAD,DBLK ;SAVE CYLINDER
|
||
IMULI DIFF,SECBLK
|
||
IDIVI DIFF,NSECS
|
||
EXCH DIFF,HEAD
|
||
DPB HEAD,[$HATRK DIFF]
|
||
TLO DIFF,%HRADR(UNIT)
|
||
JSP HEAD,RHSET
|
||
MOVE DIFF,DBLK
|
||
TLO DIFF,%HRCYL(UNIT)
|
||
JSP HEAD,RHSET
|
||
MOVSI DIFF,%HRCTL(UNIT)
|
||
IORI DIFF,ICWA_6
|
||
TRNE WRITE,10
|
||
TROA DIFF,%HMWRT
|
||
TRO DIFF,%HMRED
|
||
JSP HEAD,RHSET ;DO IT (USE IMPLIED SEEK)
|
||
CONSO DSK,%HIDON
|
||
JRST .-1
|
||
CONSO DSK,%HIERR
|
||
JRST WRDX
|
||
HRRZM BLOK,BADBLK
|
||
AOSG ERRCT ;HARDWARE ERROR--CHECK COUNTER
|
||
JRST WRD0 ;RECALIBRATE AND TRY AGAIN
|
||
TRNE WRITE,10 ;GIVE UP--DISTINGUISH BETWEEN
|
||
JSR ECWR,ERROR ;WRITE ERRORS AND
|
||
JSR ECRD,ERROR ;READ ERRORS
|
||
|
||
WRDX: HRRZ UNIT,@ICWA ;RESTORE ADDR
|
||
ADDI UNIT,1 ;COMPENSATE FOR IOWD LOSSAGE
|
||
TRZ WRITE,-1 ;FLUSH GARBAGE
|
||
JRST (TT)
|
||
|
||
WRD0: MOVSI DIFF,%HRDCL(UNIT)
|
||
HRRI DIFF,%HMCLR
|
||
JSP HEAD,RHSET
|
||
MOVSI DIFF,%HRDCL(UNIT)
|
||
HRRI DIFF,%HMREC
|
||
JSP HEAD,RHSET
|
||
MOVEI DIFF,100000.
|
||
MOVEM DIFF,DBLK
|
||
WRD0A: SOSGE DBLK
|
||
JSR EC63,ERROR
|
||
MOVSI DIFF,%HRSTS(UNIT)
|
||
JSP HEAD,RHGET
|
||
TRNE DIFF,%HSPIP
|
||
JRST WRD0A
|
||
ANDI DIFF,%HSVV+%HSRDY+%HSMOL+%HSERR
|
||
CAIE DIFF,%HSVV+%HSRDY+%HSMOL
|
||
JSR EDLZ,ERROR
|
||
JRST WRD5
|
||
|
||
;RH10 HACKING ROUTINES. CALL BY JSP HEAD,. DIFF HAS REGISTER ADDRESS IN LH, DATA IN RH.
|
||
RHSET: TLOA DIFF,%HRLOD
|
||
RHGET: TLZ DIFF,%HRLOD
|
||
DATAO DSK,DIFF
|
||
MOVEI DIFF,20
|
||
SOJG DIFF,.
|
||
DATAI DSK,DIFF
|
||
TLNE DIFF,%HDERR
|
||
JSR EDLZ,ERROR
|
||
ANDI DIFF,177777
|
||
JRST (HEAD)
|
||
|
||
DBLK: 0
|
||
];RH
|
||
;SC DISK IO ROUTINE
|
||
SC,[
|
||
WRDM: SKIPL WRITE ;SEE WHETHER LOAD OR DUMP/VERIFY
|
||
RDM: TRZA WRITE,(WRITE) ;READ FROM MASTER UNIT
|
||
WRM: HRRI WRITE,60#120 ;WRITE ON MASTER UNIT
|
||
MU: IORI WRITE,0 ;MASTER UNIT SELECT STORED HERE
|
||
JRST WRD3A
|
||
|
||
WRDB: MOVEI UNIT,DBUF ;READ OR WRITE DBUF FROM/ON CURRENT UNIT
|
||
WRD: SKIPL WRITE ;READ OR WRITE FROM/ON CURRENT UNIT
|
||
RD: TRZA WRITE,(WRITE) ;READ FROM CURRENT UNIT
|
||
WR: HRRI WRITE,60#120 ;WRITE ON CURRENT UNIT
|
||
CU: IORI WRITE,0 ;CURRENT UNIT SELECT STORED HERE
|
||
WRD3A: TRC WRITE,120
|
||
WRD3: DPB WRITE,[330700,,DBLK] ;SET OP, UNIT SEL
|
||
DPB UNIT,[DCCA DBLK+1] ; & CORE ADDR
|
||
DPB UNIT,[DCCA DBLK1+1]
|
||
LDB UNIT,[400,,WRITE] ;ISOLATE FROM GARBAGE
|
||
MOVNI DIFF,16. ;INITIALIZE ERROR COUNTER
|
||
MOVEM DIFF,ERRCT ;15. LOSSES PERMITTED
|
||
WRD5: HRRZ DIFF,BLOK
|
||
IDIVI DIFF,NSECS
|
||
DPB HEAD,[DSECT DBLK]
|
||
IDIVI DIFF,NHEDS
|
||
DPB HEAD,[DSURF DBLK]
|
||
DPB DIFF,[DCYL DBLK]
|
||
CONO DC0,DCCSET\DCDENB ;RESET ALL, THEN SET DCDENB
|
||
CAIL DIFF,NCYLS
|
||
TDZA DIFF,DIFF
|
||
SKIPLE DIFF,PKNUM(UNIT)
|
||
JRST WRD4 ;PKID IN
|
||
MOVE DIFF,QTRAN(UNIT) ;READ PACK ID
|
||
DPB DIFF,[DUNFLD GPKID]
|
||
MOVEI DIFF,TUTCYL
|
||
SKIPGE QTRAN(UNIT)
|
||
ADDI DIFF,NCYLS+XCYLS
|
||
DPB DIFF,[DCYL GPKID]
|
||
DATAO DC0,[DJMP GPKID]
|
||
CONSZ DC0,DSSACT
|
||
JRST .-1
|
||
CONSZ DC0,DSSERR
|
||
JRST WRD0
|
||
CONO DC0,DCCSET\DCDENB ;RESET POSSIBLE "FUTURE" IP OR RLCERR
|
||
LDB DIFF,[DPKID RPKID]
|
||
MOVEM DIFF,PKNUM(UNIT)
|
||
WRD4: DPB DIFF,[DPKID DBLK]
|
||
MOVE DIFF,DBLK
|
||
DPB DIFF,[3300,,DBLK1]
|
||
MOVE DIFF,QTRAN(UNIT)
|
||
DPB DIFF,[DUNFLD DBLK]
|
||
JUMPGE DIFF,WRD4A
|
||
LDB DIFF,[DCYL DBLK] ;2ND HALF UNIT
|
||
ADDI DIFF,NCYLS+XCYLS
|
||
DPB DIFF,[DCYL DBLK]
|
||
WRD4A: DATAO DC0,[DJMP DBLK]
|
||
CONSZ DC0,DSSACT
|
||
JRST .-1
|
||
CONSO DC0,DSSERR
|
||
JRST WRDX ;XFER OK
|
||
MOVE DIFF,ERRCT
|
||
TRNN DIFF,2 ;DO RECALIBRATE 2 OUT OF 4 RETRIES
|
||
JRST WRD2
|
||
WRD0: AOSLE ERRCT ;POSITIONER ERROR--CHECK ERROR COUNT
|
||
JSR EC63,ERROR ;TOO MANY--GIVE UP
|
||
DATAO DC0,[DSPC+DSRCAL+DSWINF]
|
||
CONSO DC0,DSSATT
|
||
JRST .-1
|
||
JRST WRD5 ;TRY AGAIN AFTER RESETTING UNIT
|
||
|
||
WRD2: HRRZM BLOK,BADBLK
|
||
AOSG ERRCT ;HARDWARE ERROR--CHECK COUNTER
|
||
JRST WRD5 ;TRY AGAIN
|
||
TRNE WRITE,40 ;GIVE UP--DISTINGUISH BETWEEN
|
||
JSR ECWR,ERROR ;WRITE ERRORS AND
|
||
JSR ECRD,ERROR ;READ ERRORS
|
||
|
||
WRDX: DPB BLOK,[XWBLK XWDS] ;PNTR TO PREV BLOCK
|
||
LDB UNIT,[DCCA DBLK+1] ;RESTORE ADR
|
||
TRZ WRITE,-1 ;FLUSH GARBAGE
|
||
JRST (TT)
|
||
|
||
DBLK: DREAD+DUNENB
|
||
DCOPY .(-2000_2&37774)
|
||
DCOPY XWDS(-4_2&37774)
|
||
DBLK1: DRC
|
||
DCOPY .(-2000_2&37774)
|
||
DCOPY XWDS(-4_2&37774)
|
||
DHLT
|
||
|
||
GPKID: DSPC+DSCRHD+DSWIDX+DSWNUL+DUNENB+TUTCYL_11.+TUTSRF_6+TUTSEC
|
||
DCOPY RPKID(37774)
|
||
DHLT
|
||
];SC
|
||
|
||
;JSP P,TYI RETURNS CHAR IN C.
|
||
;JSP P,TYI0 ALSO SKIPS IF NO INPUT AVAILABLE.
|
||
TYI: ILDB C,MEMSIZ-1 ;CHECK FOR COMMANDS FROM MEMORY
|
||
JUMPN C,(P) ;FOUND ONE--RETURN
|
||
CLEARM MEMSIZ-1
|
||
TYI0: ;ENTRY TO SKIP IF NO INPUT AVAILABLE
|
||
KA,[ CONSO TTY,40
|
||
JRST TYI1
|
||
DATAI TTY,C
|
||
]
|
||
KS,[ SKIPN C,8CTYIN
|
||
JRST TYI1
|
||
ANDI C,177
|
||
SETZM 8CTYIN
|
||
]
|
||
KL,[ MOVEI C,3400 ;DDT MODE INPUT
|
||
SETZM DTEFLG
|
||
MOVEM C,DTECMD
|
||
CONO DTE,%DBL11
|
||
SKIPN DTEFLG
|
||
JRST .-1
|
||
MOVE C,DTEF11
|
||
SETZM DTEFLG
|
||
JUMPE C,TYI1
|
||
] ANDI C,177
|
||
CAIGE C,175
|
||
CAIN C,33
|
||
JRST (P) ;DON'T ECHO GRITCHES
|
||
;DROP INTO TYO
|
||
|
||
;JSP P,TYO TYPES OUT CHAR IN C. CLOBBERS A,C.
|
||
TYO: ;SKIPE MEMSIZ-1
|
||
; JRST (P) ;DON'T ECHO COMMANDS FROM MEMORY
|
||
KA,[ HRRZ A,C ;COMPUTE PARITY
|
||
IMULI A,40201
|
||
AND A,[1111111]
|
||
IMUL A,[1111111]
|
||
TLNE A,1
|
||
IORI C,200
|
||
CONSZ TTY,20
|
||
JRST .-1
|
||
DATAO TTY,C
|
||
ANDCMI C,200
|
||
]
|
||
KS,[ MOVE A,C
|
||
ANDI A,177
|
||
TRO A,400
|
||
MOVEM A,8CTYOT
|
||
CONI A
|
||
IORI A,80INT
|
||
CONO (A)
|
||
SKIPE 8CTYOT
|
||
JRST .-1
|
||
]
|
||
KL,[ MOVE A,C
|
||
ANDI A,177
|
||
SETZM DTEFLG
|
||
MOVEM A,DTECMD
|
||
CONO DTE,%DBL11
|
||
SKIPN DTEFLG
|
||
JRST .-1
|
||
SETZM DTEFLG
|
||
]
|
||
JUMPGE C,(P) ;CHECK FOR CRLF (AS OPPOSED TO ECHOING A CR)
|
||
SKIPA C,C12 ;TYPE AN LF
|
||
CRLF: HRROI C,15
|
||
JRST TYO
|
||
|
||
TYI1: HRRZ C,-1(P) ;NO INPUT AVAILABLE
|
||
CAIE C,TYI0
|
||
JRST TYI ;WAIT FOR IT
|
||
JRST 1(P) ;CALL WAS TO TYI0, SKIP RETURN
|
||
|
||
LINK: CAIE CMD,'D
|
||
CAIN CMD,'K
|
||
MOVSI WRITE,-1 ;MAKE THIS INFO MORE CONVENIENT
|
||
MOVE D,[440600,,C]
|
||
MOVEI T,0
|
||
LINKL: ILDB TT,DIRPT
|
||
SKIPGE WRITE
|
||
DPB T,DIRPT ;CLOBBER CHARS READ FOR DUMP OR KILL
|
||
CAIN TT,';
|
||
JRST LINKN
|
||
CAIN TT,':
|
||
JRST LINKQ
|
||
JUMPE TT,LINKN
|
||
LINKQ1: IDPB TT,D
|
||
TLNE D,770000
|
||
JRST LINKL
|
||
LINKN1: CAMGE D,[600,,B] ;THROUGH WITH FN2?
|
||
JRST LINKL
|
||
JUMPL WRITE,KILL1
|
||
MOVEM A,FN1
|
||
MOVEM B,FN2
|
||
JRST MLOOK2
|
||
|
||
LINKN: TLNN D,770000
|
||
JRST LINKN1
|
||
IDPB T,D ;FILL OUT WITH SPACES
|
||
JRST LINKN
|
||
|
||
LINKQ: ILDB TT,DIRPT
|
||
JUMPGE WRITE,LINKQ1
|
||
DPB T,DIRPT
|
||
JRST LINKQ1
|
||
|
||
READ: MOVEI BLKIN,CORE
|
||
JSP P,CRLF
|
||
MOVEI CMD,0 ;INITIALIZE COMMAND
|
||
READ1A: MOVEI WRITE,0 ;INITIALIZE NUMBER
|
||
MOVSI B,(SIXBIT \@\) ;INITIALIZE 1ST FILE NAME
|
||
READ1: MOVEM B,FN1
|
||
READ3A: MOVSI B,(SIXBIT \@\) ;INITIALIZE CURRENT FILE NAME
|
||
MOVE D,[440600,,B]
|
||
READ2: JSP P,TYI
|
||
CAIN C,177
|
||
JRST READ ;IF RUBOUT START OVER
|
||
CAIGE C,175
|
||
CAIN C,33
|
||
JRST ALTMOD ;JUMP IF 33, 175, 176
|
||
ASH WRITE,3 ;DOES NOT CHANGE SIGN OF WRITE
|
||
CAIL C,"0
|
||
CAILE C,"7
|
||
TLOA WRITE,400000 ;NON-NUMERIC CHAR--MAKE WRITE NEGATIVE
|
||
ADDI WRITE,-"0(C) ;NUMERIC CHAR--ACCUMULATE NUMBER
|
||
CAIN C,";
|
||
JRST READ3 ;SET SYSTEM NAME
|
||
CAIN C,40
|
||
JRST READ1 ;SET FIRST FILE NAME
|
||
CAIN C,^Q
|
||
JSP P,TYI ;QUOTED CHARACTER
|
||
CAIGE C,140 ;CHECK FOR LOWER CASE
|
||
SUBI C,40
|
||
JUMPL C,DOIT ;IF LESS THAN 40 (EXC. ^Q) END OF COMMAND
|
||
TLNE D,770000 ;SKIP IF ALREADY SIX CHARS
|
||
IDPB C,D
|
||
JRST READ2
|
||
|
||
READ3: MOVEM B,SYSN
|
||
CAIE CMD,'U
|
||
JRST READ3A
|
||
JRST DOIT ;IF COMMAND IS U GO LIST DIRECTORY
|
||
|
||
ONOFF: CAIGE WRITE,NDSK
|
||
DPB CMD,[100,,QDED(WRITE)] ;LOW BIT OF CMD DETERMINES ON/OFF LINE STATUS
|
||
JRST READ ; (K=13, L=14)
|
||
|
||
ALT1: LDB CMD,D ;PICK UP COMMAND CHAR
|
||
CAIE CMD,'K
|
||
TRNN CMD,2
|
||
JRST READ1A ;GET FILE NAME
|
||
JRST DOIT ;DON'T WANT FILE NAME--GO TO WORK
|
||
|
||
ALTMOD: MOVEI C,"$
|
||
JSP P,TYO ;ECHO DOLLAR SIGN
|
||
JUMPLE WRITE,ALT2 ;JUMP IF NOT <NUMBER><ALTMODE> LAST TYPED
|
||
JUMPN CMD,ONOFF ;JUMP IF <CMD><ALTMODE><NUMBER><ALTMODE>
|
||
HRRM WRITE,SADR ;SET STARTING ADDR
|
||
JRST READ
|
||
|
||
ALT2: TLC D,360000
|
||
TLCN D,360000 ;SKIP IF SINGLE CHARACTER BEFORE <ALTMODE>
|
||
JUMPE CMD,ALT1 ;JUMP IF NO COMMAND ALREADY TYPED
|
||
DOIT: MOVEM B,FN2 ;STORE SECOND FILE NAME
|
||
HRRZ B,MU
|
||
HRRM B,CU ;MAKE MASTER UNIT CURRENT UNIT
|
||
MOVNI WRITE,1
|
||
JSP P,LODUMP ;DUMP OUT PSEUDO-CORE
|
||
CAIN CMD,'G
|
||
JRST LOADG0 ;GO
|
||
JSP TT,RDTUT
|
||
MOVE C,SYSN
|
||
MLOOK2: MOVSI WRITE,1 ;MAKE WRITE INDICATE LOAD
|
||
MOVEI BLOK,MFDBLK
|
||
MOVEI UNIT,DIR
|
||
JSP TT,RD ;READ MASTER DIRECTORY TO FIND WHERE USER DIRECTORY IS
|
||
MOVE T,DIR+MDCHK
|
||
CAME T,[SIXBIT/M.F.D./]
|
||
JSR EMFC,ERROR
|
||
MOVE T,DIR+MDNUDS
|
||
CAIE T,NUDSL
|
||
JSR EMFC,ERROR
|
||
CAIN CMD,'S
|
||
JRST LISTS ;LIST DISK ID'S AND SYSTEM NAMES
|
||
MOVE T,DIR+MDNAMP
|
||
MLOOK: CAMN C,DIR+MNUNAM(T) ;LOOK UP SYSTEM NAME
|
||
JRST MLOOK1
|
||
ADDI T,LMNBLK
|
||
CAIGE T,2000
|
||
JRST MLOOK
|
||
JSR ESNF,ERROR ;NOT FOUND
|
||
|
||
MLOOK1: MOVEI BLOK,2*NUDSL-2000(T) ;CONVERT USER SLOT TO BLOCK NUMBER
|
||
LSH BLOK,-1
|
||
HRRM BLOK,UDBLK ;REMEMBER FOR KILL OR DUMP
|
||
MOVEI UNIT,DIR
|
||
JSP TT,RDM ;READ USER DIRECTORY
|
||
ULOOK: CAME C,DIR+UDNAME
|
||
JSR ECDR,ERROR ;WRONG ONE??
|
||
CAIE CMD,'F
|
||
CAIN CMD,'U
|
||
JRST LISTFC ;LIST USER DIRECTORY
|
||
MOVSI TT,UNIGFL
|
||
MOVE T,DIR+UDNAMP
|
||
MOVE A,FN1
|
||
MOVE B,FN2
|
||
ULOOK1: CAMN A,DIR+UNFN1(T) ;LOOK UP FILE NAME
|
||
CAME B,DIR+UNFN2(T)
|
||
JRST ULOOK2
|
||
TDNN TT,DIR+UNRNDM(T) ;IS THIS FILE FOR REAL?
|
||
JRST ULOOK3
|
||
ULOOK2: ADDI T,LUNBLK
|
||
CAIGE T,2000
|
||
JRST ULOOK1
|
||
CAIE CMD,'D ;IF NOT FOUND BETTER BE DUMP
|
||
JSR EFNF,ERROR
|
||
MOVE T,DIR+UDNAMP
|
||
ULOOK4: SKIPN DIR+UNFN1(T) ;FIND FREE SLOT FOR NEW FILE
|
||
JRST DUMP
|
||
ADDI T,LUNBLK
|
||
CAIGE T,2000
|
||
JRST ULOOK4
|
||
MOVNI T,LUNBLK ;NO FREE SLOTS--TRY TO EXTEND NAME AREA DOWN
|
||
ADDM T,DIR+UDNAMP
|
||
MOVE T,DIR+UDESCP
|
||
IDIVI T,6
|
||
ADDI T,UDDESC
|
||
CAMGE T,DIR+UDNAMP ;DID WE RUN INTO DESCRIPTOR AREA?
|
||
JRST DUMP0
|
||
JSR EDIR,ERROR ;YES
|
||
|
||
ULOOK3: HRRM T,DMP4 ;IF FILE FOUND, SAVE SLOT NUMBER FOR DUMP
|
||
LDB C,[UNDSCP DIR+UNRNDM(T)]
|
||
JSP TT,GBP
|
||
MOVEM C,DIRPT ;SET UP DESCRIPTOR AREA BYTE POINTER
|
||
MOVSI TT,UNLINK
|
||
TDNE TT,DIR+UNRNDM(T)
|
||
JRST LINK ;FILE IS A LINK
|
||
LDB A,[UNPKN DIR+UNRNDM(T)]
|
||
ULOOK5: CAMN A,TUT+QPKNUM ;SEE IF IT'S MOUNTED
|
||
JRST LOAD
|
||
JSP TT,NXTTUT
|
||
JRST ULOOK5
|
||
JSR EPNM,ERROR
|
||
|
||
LOAD: CAIE CMD,'D ;GET HERE IF FILE FOUND
|
||
CAIN CMD,'K ;IF DUMP OR KILL, DELETE IT
|
||
JRST KILL
|
||
ZERO: MOVEI TT,CORE-1
|
||
TRNN CMD,20 ;SKIP IF T$ SYMBOL LOADING COMMAND
|
||
JRST ZERO1
|
||
MOVEI B,DDT-1 ;ASSUME ALWAYS USING MOBY DDT
|
||
JSP P,FD ;GET DDT'S SYMBOL TABLE POINTER
|
||
JSR EDDT,ERROR ;CAN'T GET IT??
|
||
HRROS B,(C) ;TELL DDT ITS SYMBOL TABLE WAS BUGGERED
|
||
CAME B,[-1,,DDT-2] ;VERIFY THAT IT'S REALLY A MOBY DDT LIKE WE THOUGHT
|
||
JSR EDDT,ERROR
|
||
SKIPE D,-2(C) ;FLUSH ALL BUT INITIAL SYMBOLS
|
||
MOVEM D,-1(C)
|
||
MOVE D,-1(C)
|
||
MOVEI TT,CORE-1
|
||
CAILE TT,-1(D)
|
||
MOVEI TT,-1(D) ;DON'T ZERO SYMBOL TABLE NOR DDT
|
||
ZERO1: TRNE CMD,1
|
||
JRST LOAD1 ;NON-ZEROING COMMAND
|
||
SETZM 40 ;BEGIN CLEARING CORE
|
||
MOVE T,[40,,41] ;SET UP BLT POINTER
|
||
;CODE TO SKIP OVER NXM
|
||
ZERO2: CAIG TT,10*2000-1(T) ;MORE THAN 8K LEFT TO ZERO?
|
||
JRST ZERO4 ;NO, ZERO REMAINING WORDS AND PROCEED
|
||
MOVE D,T ;AVOID KA/KL INCOMPAT BY COPYING BLT PNTR
|
||
BLT D,10*2000-1(T) ;ZERO NEXT 8K
|
||
ZERO3: ADDI T,10*2000 ;MOVE DEST OF BLT PNTR UP 8K
|
||
ANDCMI T,1777 ;ROUND DOWN TO 1K BOUNDARY
|
||
KA, CONO 10000 ;CLEAR NXM
|
||
MOVES (T) ;SET NXM IF HOLE
|
||
KA, CONSZ 10000 ;NXM GENERATED?
|
||
KA, JRST ZERO3 ;YES, GO TO NEXT 8K
|
||
JRST ZERO2 ;NO, CLEAR THIS 8K
|
||
|
||
ZERO4: BLT T,(TT) ;AND CLEAR TO TOP BOUNDARY
|
||
TRNE CMD,20
|
||
JRST LOAD1 ;IF SYMBOL-LOADING COMMAND, STOP THERE
|
||
CLEARM CBUF
|
||
MOVE T,[CBUF,,CBUF+1]
|
||
BLT T,CBUF+1777
|
||
MOVEI UNIT,CBUF
|
||
MOVE BLOK,CBLK ;-NSWBL IN LH
|
||
JSP TT,WRM ;CLEAR PSEUDO-CORE
|
||
AOBJN BLOK,.-1
|
||
LOAD1: SETZB BUFP,BLKCNT ;SET UP BUFP SO FIRST CALL TO WD WILL READ
|
||
LOAD2: JSP P,WD ;FIRST BLOCK OF FILE
|
||
CAME D,[JRST 1] ;LOOK FOR END OF SBLK LOADER
|
||
JRST LOAD2
|
||
CAIN CMD,'I ;IF VERIFY, START SIMULATING DUMP
|
||
JRST DUMP.5
|
||
LOAD3: JSP P,WD ;READ BLOCK HEADER
|
||
JUMPGE D,LOADS ;IT'S A JUMP BLOCK
|
||
MOVE A,D
|
||
MOVE B,D
|
||
JSR LOADB ;LOAD LOGICAL BLOCK INTO CORE
|
||
JRST LOAD3
|
||
|
||
LOADB: 0
|
||
LOAD4: JSP P,WD ;LOAD A LOGICAL BLOCK--AOBJN POINTER IN B,
|
||
ROT A,1 ;BLOCK HEADER IN A (FOR CHECKSUM)
|
||
ADD A,D ;ADD NEW WORD INTO CHECKSUM
|
||
JSP P,FD ;AND PREPARE TO SMASH IT AWAY
|
||
JRST .+2 ;LOCATION CAN'T BE LOADED
|
||
MOVEM D,(C) ;SMASH WORD AWAY
|
||
AOBJN B,LOAD4
|
||
JSP P,WD
|
||
CAMN A,D ;CHECK THE CHECKSUM
|
||
JRST @LOADB
|
||
JSR ECKS,ERROR ;BAD CHECKSUM
|
||
|
||
LOADS: CAIN CMD,'M
|
||
JRST LOADG0 ;DON'T LOAD SYMBOLS NOR SADR
|
||
MOVEM D,NXTBW3 ;SAVE S.A.
|
||
MOVEI B,DDT-1 ;ASSUME IS ALWAYS MOBY DDT.
|
||
JSP P,FD ;GET DDT'S SYMBOL TABLE POINTER
|
||
JSR EDDT,ERROR ;CAN'T GET IT??
|
||
SKIPN (C)
|
||
JRST LOADJ ;AIN'T GOT NO DDT, IGNORE SYMBOLS
|
||
HRROS B,(C) ;TELL DDT ITS SYMBOL TABLE WAS BUGGERED
|
||
CAMN B,[-1,,DDT-2] ;VERIFY THAT IT'S REALLY A MOBY DDT LIKE WE THOUGHT
|
||
JSP P,FD ;FETCH SYMBOL TABLE POINTER
|
||
JSR EDDT,ERROR
|
||
MOVE D,(C)
|
||
MOVEM D,DDTM2
|
||
LOADS1: MOVE B,DDTM2 ;GET LOWEST SYMBOL LOC SO FAR
|
||
JSP P,WD ;GET SYMBOL BLOCK HEADER
|
||
JUMPGE D,LOADS2 ;JUMP IF END OF SYMBOLS
|
||
TRNE D,-1 ;SKIP IF REALLY SYMBOLS AND NOT SOME OTHER BRAIN-DAMAGED CRUFT
|
||
JRST LOADBD
|
||
MOVSS D
|
||
HRLI D,-1(D)
|
||
ADD B,D ;EFFECTIVELY SUBTRACTS LENGTH OF BLOCK FROM BOTH HALVES
|
||
MOVEM B,DDTM2 ;OF SYMBOL TABLE POINTER
|
||
HRL B,D ;SET UP AOBJN POINTER IN B
|
||
HRLZ A,D ;AND RECREATE HEADER IN A
|
||
JSR LOADB ;LOAD THE SYMBOLS
|
||
JRST LOADS1
|
||
|
||
LOADBD: HLRO B,D ;-# WORDS TO SKIP (NOT COUNTING CHECKSUM)
|
||
JSP P,WD
|
||
AOJLE B,.-1
|
||
JRST LOADS1 ;TRY NEXT SYMBOL BLOCK
|
||
|
||
LOADS2: MOVE D,DDTM2 ;GET UPDATED DDT SYMBOL PNTR
|
||
LOADS4: MOVEI B,DDT-2 ;WE KNOW WHERE IT ALWAYS GOES
|
||
JSP P,FD ;PUT BACK SYMBOL TABLE POINTER
|
||
JSR EBUG,ERROR ;CAN'T PUT IT BACK??
|
||
MOVEM D,(C)
|
||
MOVEI B,DDT-4 ;GIVE STARTING ADDRESS TO DDT
|
||
JSP P,FD
|
||
JSR EBUG,ERROR
|
||
MOVE D,NXTBW3
|
||
MOVEM D,(C)
|
||
MOVEI D,DDT ;AND SET DSKDMP START ADDRESS TO DDT
|
||
LOADJ: HRRM D,SADR ;SET STARTING ADDRESS FROM JUMP BLOCK
|
||
LOADG0: MOVE T,BOOTNS ;APPROP DISK WAIT FOR NON BUSY INSTR
|
||
MOVEM T,BOOT
|
||
LOADG: JSP TT,WRCB ;MAKE SURE ALL LOADED CRUFT IN PSEUDO-CORE IS OUT
|
||
MOVEI WRITE,0
|
||
JSP P,LODUMP ;AND LOAD IT ALL IN
|
||
TRNE CMD,10
|
||
JRST READ ;NON-GOING COMMAND
|
||
GO:
|
||
PH,[
|
||
JRST PHGO ; Go boot DSKDMP in. See comments there
|
||
; explaining why RH11 code was moved to bootstrap.
|
||
];PH
|
||
|
||
RH,[ MOVE B,ERRWD
|
||
CONI DSK,HEAD
|
||
TLNE HEAD,(%HID22)
|
||
HRLI B,-1700_4
|
||
MOVEM B,@ICWA
|
||
MOVSI B,-6
|
||
GO1: CONSZ DSK,%HIBSY
|
||
JRST .-1
|
||
MOVE DIFF,SWPOU1(B)
|
||
JSP HEAD,RHSET
|
||
AOBJN B,GO1
|
||
JRST WAIT
|
||
];RH
|
||
RP,[ MOVE B,ERRWD
|
||
MOVEM B,@ICWA
|
||
DATAO DPC,SWPSK
|
||
JSP P,SKWAIT
|
||
DATAO DPC,SWPOU1
|
||
CONSO DPC,DONE
|
||
JRST .-1
|
||
DATAO DPC,SWPOU2
|
||
JRST WAIT
|
||
];RP
|
||
SC,[ DATAO DC0,[DJMP SWPOUT]
|
||
JRST WAIT
|
||
];SC
|
||
|
||
LISTS: JSP P,CRLF
|
||
LISTS2: JSP P,TYI0
|
||
JRST LOADG1 ;SHUT UP IF KEY HIT
|
||
MOVE C,TUT+QPKNUM ;TYPE PACK NUMBER
|
||
JSP TT,PNO
|
||
MOVE D,TUT+QPAKID ;AND I.D.
|
||
JSP TT,PD2
|
||
JSP TT,NXTTUT ;SAME FOR ALL DIRECTORIES
|
||
JRST LISTS2
|
||
MOVE T,DIR+MDNAMP
|
||
LISTS1: CAIGE T,2000
|
||
JSP P,TYI0 ;STOP TYPING IF TTI FLAG ON
|
||
JRST LOADG1
|
||
SKIPE D,DIR+MNUNAM(T)
|
||
JSP TT,PD ;TYPE OUT USER NAME
|
||
ADDI T,LMNBLK
|
||
JRST LISTS1
|
||
|
||
LISTFC: MOVE T,DIR+UDNAMP
|
||
LISTF1:
|
||
KA, CONSO TTY,40 ;STOP TYPING IF TTI FLAG ON
|
||
KS, SKIPN 8CTYIN ; Stop typing if character waiting
|
||
CAIL T,2000
|
||
JRST LOADG1
|
||
SKIPN DIR+UNFN1(T) ;SKIP IF FILE IN THIS SLOT
|
||
JRST LISTF2
|
||
JSP P,CRLF
|
||
LDB C,[UNPKN DIR+UNRNDM(T)]
|
||
JSP TT,PNO ;TYPE PACK NUMBER
|
||
MOVE D,DIR+UNFN1(T)
|
||
JSP TT,PD2 ;TYPE FIRST FILE NAME
|
||
MOVE D,DIR+UNFN2(T)
|
||
JSP TT,PD2 ;AND SECOND FILE NAME
|
||
LISTF2: ADDI T,LUNBLK
|
||
JRST LISTF1
|
||
|
||
KILL: JSP TT,NXTB6 ;GET HERE ON KILL OR DUMP OF EXISTING FILE
|
||
MOVEI T,0 ;ZERO BYTES IN USER DIRECTORY DESCIPTOR AREA
|
||
DPB T,DIRPT ;NXTB6 JUMPS TO KILL1 AT END OF FILE
|
||
MOVE C,BLOK
|
||
JSP TT,GTP
|
||
ILDB T,C
|
||
CAIGE T,TUTLK-1 ;SOS USAGE OF THIS BLOCK
|
||
SOJL T,[JSR ECDR,ERROR]
|
||
DPB T,C
|
||
JRST KILL
|
||
|
||
KILL1: HRRZ T,DMP4 ;CLEAR OUT USER DIRECTORY SLOT
|
||
CLEARM DIR+UNFN1(T)
|
||
CLEARM DIR+UNFN2(T)
|
||
CLEARM DIR+UNRNDM(T)
|
||
MOVSI WRITE,-1
|
||
CAIN CMD,'K
|
||
JRST KILDMP ;IF KILL DON'T DUMP
|
||
JRST DMP4 ;MUST DUMP ON SAME UNIT
|
||
|
||
DUMP0: MOVE T,DIR+UDNAMP ;GET HERE IF SLOT CREATED AT BOTTOM OF NAME AREA
|
||
DUMP: HRRM T,DMP4 ;GET HERE IF EMPTY SLOT FOUND IN NAME AREA
|
||
DMP0: MOVEI D,0 ;GET HERE IF USING SLOT OF OLD FILE
|
||
DMP1: ;MOVE C,TUT+QSWAPA
|
||
MOVEI C,0 ;NOTE START AT 0 NOT QSWAPA
|
||
MOVE B,C
|
||
SUB B,TUT+QLASTB
|
||
HRLZ B,B ;LH(B) COUNTS BLOCKS, RH(B) COUNTS FREE BLOCKS
|
||
JSP TT,GTP
|
||
DMP2: ILDB T,C
|
||
SKIPE T
|
||
KA, SUBI B,1 ;THIS RELIES ON CARRY PROPAGATING FROM RH TO LH IN AOBJN
|
||
KL, HRRI B,-1(B) ;ON KI10, KL10 CHANGE SUBI B,1 TO HRRI B,-1(B)
|
||
KS, HRRI B,-1(B) ;KS too...
|
||
AOBJN B,DMP2
|
||
CAIG B,(D) ;RH OF D IS HIGHEST SO FAR, LH SAYS WHICH UNIT
|
||
JRST DMP5 ;NOT BETTER THAN RECORD
|
||
MOVE D,B ;NEW RECORD--RECORD IT
|
||
HRL D,CU
|
||
DMP5: JSP TT,NXTTUT ;TRY NEXT
|
||
JRST DMP1
|
||
;FALLS THROUGH AT END
|
||
DMP3: HLRM D,CU ;SET CURRENT UNIT TO ONE WITH MOST FREE BLOCKS
|
||
JSP TT,RDTUT ;GET ITS TUT
|
||
DMP4: MOVEI T,.
|
||
MOVE A,FN1
|
||
MOVE B,FN2
|
||
MOVEM A,DIR+UNFN1(T) ;PUT CRUFT INTO SLOT
|
||
MOVEM B,DIR+UNFN2(T)
|
||
SETOM DIR+UNDATE(T) ; Unknown creation date
|
||
HRROI C,777000 ; Unknown reference date
|
||
MOVEM C,DIR+UNREF(T) ; Unknown author, 36. bit bytes
|
||
SC,[ MOVEM A,XWDS+XWFN1
|
||
MOVEM B,XWDS+XWFN2
|
||
MOVE C,SYSN
|
||
MOVEM C,XWDS+XWSYSN
|
||
] MOVE C,DIR+UDESCP ;PUT DESCRIPTOR CHARACTER ADDRESS
|
||
MOVE B,TUT+QPKNUM ;AND PACK NUMBER
|
||
DPB B,[UNPKN C]
|
||
MOVEM C,DIR+UNRNDM(T) ;INTO USER DIRECTORY SLOT
|
||
;MOVE C,TUT+QSWAPA ;COMMENTED OUT INSN DUMPS INTO FILE AREA
|
||
MOVEI C,0 ;DUMP INTO SWAPPING AREA TO AVOID Y FILES
|
||
MOVEM C,LBLOCK ;A DAEMON WILL COPY INTO FILE AREA AFTER SALVAGE
|
||
JSP TT,GTP
|
||
MOVEM C,TUTPT ;INITIALIZE TUT POINTER
|
||
MOVE C,DIR+UDESCP
|
||
JSP TT,GBP
|
||
MOVEM C,DIRPT ;INITIALIZE DESCRIPTOR AREA POINTER
|
||
SETOB WRITE,BLKCNT ;FORCE NXTBW TO LOAD ADR
|
||
KA, HRLOI BUFP,-2001-1 ;SET UP BUFP SO FIRST WORD GOES IN DBUF+0
|
||
KL, HRLOI BUFP,-2001
|
||
KS, HRLOI BUFP,-2001
|
||
MOVE D,[JRST 1]
|
||
JSP P,WD ;END OF SBLK LOADER
|
||
;DROPS THROUGH
|
||
|
||
;DROPS IN
|
||
DUMP.5: MOVSI WRITE,-'I(CMD) ;GET HERE IF VERIFY--SET WRITE NEGATIVE IF
|
||
MOVEI B,40 ;DUMP AND ZERO IF VERIFY--FIRST ADDR DUMPED IS 40
|
||
HRRM B,DUMP4
|
||
HLLOS DUMP6
|
||
SETZM DUMP9S
|
||
SETZM DUMP9J
|
||
SETZM DUMP9K
|
||
MOVEI B,DDT-3 ;SET UP TO NOT DUMP SYMBOLS AS PART OF CORE IMAGE
|
||
JSP P,FD
|
||
JSR EBUG,ERROR
|
||
SKIPN A,(C) ;GET PNTR TO BUILT IN SYMBOLS
|
||
JRST DUMP4 ;NO DDT, DON'T HACK THIS
|
||
HRRM A,DUMP7 ;THIS IS WHERE WE START DUMPING AGAIN
|
||
MOVEM A,DUMP9K ;THIS WILL BE INITIAL SYMBOL TABLE PNTR WHEN DDT LOADED
|
||
MOVNI A,(A)
|
||
ADD A,1(C) ;GET MINUS SIZE OF NON-BUILTIN SYMBOL TABLE IN RH(A)
|
||
HRL A,1(C) ;GET PNTR TO SYMBOL TABLE
|
||
HLRM A,DUMP6 ;THIS IS WHERE WE STOP DUMPING
|
||
MOVSM A,DUMP9S ;SAVE AOBJN PNTR TO NON-BUILTIN SYMBOLS
|
||
MOVE A,-1(C) ;PICK UP START ADDRESS
|
||
MOVEM A,DUMP9J ;SAVE
|
||
MOVE B,-2(C) ;DUMP LOW CORE (ACS) OUT OF PLACE SAVED IN DDT
|
||
HLLZ A,B ;HERE B HAS ADDRESS DUMPING FROM
|
||
JRST DUMP3B ;AND A AND D HAVE VIRTUAL ADDRESS
|
||
|
||
DUMP1: ;SKIP OVER NXM ON DUMPING
|
||
KA,[ CONSO 10000 ;NXM SET?
|
||
JRST DUMP1A ;NO, CONTINUE IN SEQUENCE
|
||
ADDI B,10*2000-1 ;SKIP 8K
|
||
TRZ B,1777 ;ROUND DOWN TO 8K BOUDARY
|
||
CONO 10000 ;CLEAR NXM
|
||
DUMP1A:
|
||
];KA
|
||
DUMP6: CAIGE B,. ;SKIP IF REACHED SYMBOL TABLE
|
||
JRST DUMP8
|
||
DUMP7: MOVEI B,. ;SKIP OVER SYMBOLS, DUMP DDT
|
||
HLLOS DUMP6 ;DEFUSE TEST
|
||
DUMP8: JSP P,FD
|
||
JRST DUMPJ ;TIME TO WRITE JUMP BLOCK AND SYMBOL TABLE
|
||
SKIPN (C) ;LOOK FOR NON-ZEROES
|
||
AOJA B,DUMP1
|
||
MOVE A,B ;SAVE START OF BLOCK
|
||
DUMP2: TLZ A,-1 ;LOOK FOR TWO CONSECUTIVE ZEROES
|
||
DUMP2A: CAIL B,200(A) ;BUT DON'T DUMP MORE THAN 200 WORDS AT A TIME
|
||
JRST DUMP3
|
||
XCT DUMP6
|
||
JSP P,FD
|
||
JRST DUMP3 ;END OF CORE, WRITE OUT LAST BLOCK
|
||
SKIPE (C)
|
||
AOJA B,DUMP2 ;NONZERO
|
||
TLON A,-1 ;ZERO, WAS PREV LOC ZERO ALSO?
|
||
AOJA B,DUMP2A ;NO, CHECK FOLLOWING LOC
|
||
SOJA B,DUMP3 ;YES, DUMP THE NON-ZERO THAT PRECEDES IT
|
||
|
||
DUMP3: HRRM B,DUMP4 ;SAVE ADDRESS TO CONTINUE SEARCH
|
||
SUBM A,B ;RH(B) GETS MINUS THE LENGTH OF THE BLOCK
|
||
HRL A,B ;SET UP HEADER IN A
|
||
MOVE B,A ;AND B
|
||
DUMP3B: MOVE D,A ;AND D
|
||
JSP P,WD ;WRITE HEADER
|
||
DUMP3A: JSP P,FD
|
||
JSR EBUG,ERROR ;CAN'T FETCH WORD WE FETCHED BEFORE??
|
||
MOVE D,(C)
|
||
ROT A,1
|
||
ADD A,D ;COMPUTE CHECKSUM
|
||
JSP P,WD ;WRITE DATA WORD
|
||
AOBJN B,DUMP3A
|
||
MOVE D,A
|
||
JSP P,WD ;WRITE OUT CHECKSUM
|
||
DUMP4: MOVEI B,. ;AND CONTINUE SEARCHING
|
||
JUMPN B,DUMP1 ;IF MRC EVER SEES THIS --SELFMODIFYING CODE-- ....
|
||
JRST DUMP9 ;FINISHED DUMPING SYMBOLS
|
||
|
||
DUMPJ: SKIPN DUMP9K
|
||
JRST DMP9J1
|
||
HRROI D,DDT-2 ;BUGGER THE SYMBOL TABLE
|
||
MOVE A,D
|
||
JSP P,WD
|
||
MOVE D,DUMP9K
|
||
ROT A,1
|
||
JSP P,WD
|
||
ADD D,A
|
||
JSP P,WD
|
||
DMP9J1: SKIPN D,DUMP9J
|
||
MOVE D,SADR
|
||
JSP P,WD ;WRITE OUT JUMP BLOCK
|
||
SKIPN B,DUMP9S ;WRITE SYMBOLS
|
||
JRST DUMP9 ;NO SYMBOLS
|
||
HLLZ A,B
|
||
HLLZS DUMP4 ;DUMP SYMBOL BLOCK, RETURN TO DUMP9
|
||
JRST DUMP3B
|
||
|
||
DUMP9: JUMPE WRITE,LOADG1 ;IF VERIFY, THAT'S ALL
|
||
SKIPN D,DUMP9J
|
||
MOVE D,SADR
|
||
JSP P,WD ;SECOND JUMP BLOCK
|
||
HRRZ T,DMP4 ; GET POINTER TO NAME AREA
|
||
AOS BUFP
|
||
DPB BUFP,[UNWRDC+DIR+UNRNDM(T)]
|
||
JSP TT,NXTBLK
|
||
JSP TT,WRDB ;WRITE OUT LAST BLOCK
|
||
SKIPE T,BLKCNT
|
||
JSR NXTBW3 ;STORE LAST DESCRIPTOR BYTE
|
||
MOVEI T,0
|
||
JSR NXTBW3 ;AND INDICATE END OF FILE
|
||
LDB T,[360600,,DIRPT]
|
||
IDIVI T,6
|
||
HRRZ TT,DIRPT
|
||
IMULI TT,6
|
||
SUBI TT,6*<DIR+UDDESC>-5-1(T)
|
||
HRRZM TT,DIR+UDESCP ;INDICATE NEW END OF DESCRIPTOR AREA
|
||
KILDMP: MOVEI UNIT,TUT
|
||
MOVEI BLOK,TUTBLK
|
||
JSP TT,WRD ;WRITE OUT TUT ON THIS UNIT
|
||
REPEAT NTUTBL-1,[
|
||
ADDI UNIT,2000
|
||
ADDI BLOK,1
|
||
JSP TT,WRD
|
||
]
|
||
HRRZ B,CU
|
||
HRRM B,KD2 ;WRITE OUT USER DIRECTORY ON ALL UNITS
|
||
KD1: ADDI B,1
|
||
CAIN B,NDSK
|
||
MOVEI B,0
|
||
HRRM B,CU
|
||
SKIPE QDED(B)
|
||
JRST KD2
|
||
MOVEI UNIT,DIR
|
||
UDBLK: MOVEI BLOK,.
|
||
MOVE TT,DIR+UDNAME
|
||
CAME TT,SYSN
|
||
JSR EBUG,ERROR
|
||
JSP TT,WR
|
||
KD2: CAIN B,.
|
||
JRST LOADG1
|
||
JRST KD1
|
||
|
||
GTP: SKIPGE TUT+QPKNUM
|
||
JSR EBUG,ERROR ;MUST BE OLD-STYLE TUT?
|
||
SUB C,TUT+QFRSTB
|
||
JUMPL C,[JSR EBUG,ERROR]
|
||
IDIVI C,TUTEPW
|
||
IMULI A,-10000*TUTBYT
|
||
HRLI C,440000+TUTBYT_6(A)
|
||
ADDI C,TUT+LTIBLK
|
||
JRST (TT)
|
||
|
||
SC,[ ;LOGICAL TO PHYSICAL DISK MAPPING
|
||
QTRAN: 0 ;INDEX BY LOG DSK #
|
||
1 ;4.9 => USE HIGH HALF OF DRIVE, RH = PHYS DRIVE #
|
||
2 ;(NO LONGER DOES ANYTHING, NOW THAT MEMOWRECKS ARE GONE,
|
||
3 ; BUT KEEP AROUND JUST IN CASE EVER NEEDED AGAIN.)
|
||
4
|
||
5
|
||
6
|
||
7
|
||
IFL .-QTRAN-NDSK,.ERR QTRAN LOSES!!
|
||
];SC
|
||
|
||
ERRCT: 0 ;ERROR COUNTER
|
||
DDTM2: 0 ;DDT SYMBOL TABLE POINTER
|
||
DUMP9J: 0 ;START INSTRUCTION (AT DUMP9)
|
||
DUMP9S: 0 ;SYMBOL TABLE POINTER (AT DUMP9)
|
||
DUMP9K: 0 ;INITIAL SYMBOL TABLE PNTR (AT DUMP9)
|
||
LBLOCK: 0 ;LAST BLOCK WRITTEN OR READ
|
||
BLKCNT: 0 ;NUMBER OF BLOCKS READ OR WRITTEN CONSECUTIVELY
|
||
DIRPT: 0 ;DESCRIPTOR AREA BYTE POINTER
|
||
TUTPT: 0 ;TUT BYTE POINTER
|
||
FN1: 0 ;FILE NAME 1
|
||
FN2: 0 ;FILE NAME 2
|
||
PKNUM: REPEAT NDSK,-1 ;PACK NUMBER INDEXED BY DRIVE NUMBER
|
||
QDED: BLOCK NDSK ;-1 IF DRIVE NOT TO BE USED
|
||
XWDS: BLOCK 4
|
||
RPKID: 0
|
||
BOOTNS: RP, CONSZ DPC,BUSY
|
||
SC, CONSZ DC0,DSSACT
|
||
RH, CONSZ DSK,%HIBSY
|
||
PH, IORD B,SWPCS1 ; UGH!
|
||
|
||
CONSTANTS
|
||
|
||
IFL BEG+1677-., .ERR BLOAT
|
||
INFORM SPACE LEFT,\BEG+1677-.
|
||
BLOCK BEG+1677-.
|
||
|
||
BADBLK: 0 ;BLOCK WITH HDWE ERROR
|
||
INFORM BADBLK,\.-1-BEG+<MEMSIZ-2000>
|
||
|
||
];END IFE BOOTSW
|
||
|
||
IFN BOOTSW,[
|
||
BEG=MEMSIZ-2000
|
||
LOC MEMSIZ-100
|
||
]
|
||
|
||
CBOOT: CLEARM MEMSIZ-1 ;BOOTSTRAP
|
||
RP,[
|
||
BOOT:
|
||
IFE BOOTSW, JRST BEG ;OR CONSZ DPC,BUSY OR JRST LOADG1
|
||
IFN BOOTSW, CONSZ DPC,BUSY
|
||
JRST .-1
|
||
MOVEI B,ICWA+2 ;SET UP CHANNEL PROG
|
||
MOVEM B,ICWA
|
||
SETZM ICWA+1
|
||
SETZM ICWA+3
|
||
DATAO DPC,CLATT1
|
||
DATAO DPC,SUNIT0
|
||
DATAI DPC,B
|
||
BOOT0: TRNN B,RP03BT
|
||
JRST BOOT1
|
||
MOVEI B,MBLKS ;UNIT 0 IS AN RP03, ADJUST WORLD
|
||
HRRM B,CBLK
|
||
MOVE B,RP3ADJ
|
||
MOVSI A,-NSWBL
|
||
XORM B,SWPSK(A)
|
||
AOBJN A,.-1
|
||
BOOT1: HLLZS BOOT0 ;PREVENT TRNN FROM SKIPPING AGAIN
|
||
MOVE B,ERRWD
|
||
MOVEM B,@ICWA
|
||
DATAO DPC,SWPSK
|
||
JSP P,SKWAIT
|
||
DATAO DPC,SWPIN1
|
||
CONSO DPC,DONE
|
||
JRST .-1
|
||
DATAO DPC,SWPIN2
|
||
CONSO DPC,DONE
|
||
JRST .-1
|
||
JRST BEG
|
||
|
||
ERRWD: -1700,,BEG-1
|
||
CLATT1: DEASEC ALLATT
|
||
SWPSK: DSEEKC+200._22.
|
||
SWPIN1: DWRITC+200._22.+3_17.+2._12.+ICWA ;NBLKS 4
|
||
SWPIN2: DREADC+200._22.+4_17.+8._12.+ICWA
|
||
SWPOU1: DWRITC+200._22.+4_17.+8._12.+ICWA
|
||
SWPOU2: DREADC+200._22.+3_17.+2_12.+ICWA
|
||
IFN NSWBL-5, .ERR THE PRECEDING 4 CONSTANTS ARE WRONG!
|
||
CBLK: -NSWBL,,NBLKS ;DISK ADDR OF CORE BUFFER, - # BLOCKS IN LH
|
||
RP3ADJ: <<MCYLS#NCYLS>&377>_22.+<.BM DCYLXB>
|
||
SUNIT0: DNOOPC
|
||
|
||
SKWAIT: DATAI DPC,A ;AWAIT SEEK DONE UNIT 0
|
||
TRNN A,ALLATT
|
||
JRST SKWAIT
|
||
DATAO DPC,CLATT1
|
||
MOVEI A,30.
|
||
SOJG A,.
|
||
DATAI DPC,A
|
||
TLNN A,(ONCYL)
|
||
JRST SKWAIT
|
||
JRST (P)
|
||
|
||
WAIT: CONSO DPC,DONE
|
||
JRST .-1
|
||
];RP
|
||
|
||
PH,[ ;; Initially we could not use IORDQ or IOWRQ because they were
|
||
;; macros that used a literal. There is nothing to stop us now,
|
||
;; except the fact that this code works fine and is as small as you
|
||
;; could possibly want.
|
||
|
||
BOOT:
|
||
IFE BOOTSW, JRST BEG ; or IORD B,SWPCS1 or JRST LOADG1
|
||
IFN BOOTSW, IORD B,SWPCS1
|
||
TRNN B,%HXRDY
|
||
JRST BOOT
|
||
KS, WREBR 0 ; No paging or caching
|
||
MOVEI A,0
|
||
IOWR A,SWPCS2 ; Select drive
|
||
BOOT0: IORD A,SWPCS1
|
||
TRNN A,%HXDVA
|
||
JRST BOOT0 ; Await drive available
|
||
MOVSI B,-LSWPADR
|
||
BOOT1: HLRZ A,SWPVAL(B)
|
||
IOWR A,SWPADR(B)
|
||
BOOT2: IORD A,SWPCS1
|
||
TRNN A,%HXRDY ; Wait for controller
|
||
JRST BOOT2
|
||
TRNE A,%HXTRE+%HXMCP ; Lossage?
|
||
JRST 4,. ; Foo!
|
||
AOBJN B,BOOT1
|
||
JRST BEG
|
||
|
||
ZZ1==<NSWBL-1>*SECBLK ;BLOCK CONTAINING CORE SWAPPED OUT TO BRING DSKDMP IN
|
||
ZZ2==<NSWBL>*SECBLK ;DSKDMP RESIDENCE BLOCK
|
||
ZZ3==ZZ1/NSECS
|
||
ZZ4==ZZ2/NSECS
|
||
ZZ1==ZZ3*400+<ZZ1-NSECS*ZZ3> ;CONVERT ADDR TO DISK FORMAT
|
||
ZZ2==ZZ4*400+<ZZ2-NSECS*ZZ4>
|
||
|
||
SWPADR: UBAQ,,UBAPAG+UBPG_1 ; Set up Unibus map
|
||
UBAQ,,UBAPAG+UBPG_1+1
|
||
UBAQ,,%HRCS2 ; Clear controller
|
||
SWPCS2: UBAQ,,%HRCS2 ; Select drive
|
||
SWPCS1: UBAQ,,%HRCS1 ; Initialize
|
||
UBAQ,,%HRCYL ; Desire cylinder
|
||
UBAQ,,%HRWC ; Set (half) word count
|
||
UBAQ,,%HRBA ; Set Unibus address
|
||
UBAQ,,%HRADR ; Desire track and sector
|
||
UBAQ,,%HRCS1 ; Write
|
||
UBAQ,,%HRWC ; Reset (half) word count
|
||
UBAQ,,%HRBA ; Reset Unibus address
|
||
UBAQ,,%HRADR ; Desire track and sector
|
||
UBAQ,,%HRCS1 ; Read
|
||
LSWPADR==:.-SWPADR
|
||
|
||
IFN BEG&1777, .ERR BEG does not lie on a page boundary?
|
||
|
||
;;; LH FOR SWAP IN, RH FOR SWAP OUT
|
||
SWPVAL: %UQVAL+%UQFST+BEG_-9,,%UQVAL+%UQFST+BEG_-9 ; Set up Unibus map
|
||
%UQVAL+%UQFST+BEG_-9+1,,%UQVAL+%UQFST+BEG_-9+1
|
||
%HYCLR,,%HYCLR ; Clear controller
|
||
0,,0 ; Select drive
|
||
%HMRDP,,%HMRDP ; Initialize
|
||
NCYLS,,NCYLS ; Desire cylinder
|
||
-1700*2,,-1700*2 ; Set (half) word count
|
||
UBPG_14,,UBPG_14 ; Set Unibus address
|
||
ZZ1,,ZZ2 ; Desire track and sector
|
||
%HMWRT,,%HMWRT ; Write
|
||
-1700*2,,-1700*2 ; Reset (half) word count
|
||
UBPG_14,,UBPG_14 ; Reset Unibus address
|
||
ZZ2,,ZZ1 ; Desire track and sector
|
||
%HMRED,,%HMRED ; Read
|
||
IFN .-SWPVAL-LSWPADR, .ERR SWPVAL wrong length.
|
||
|
||
CBLK: -NSWBL,,NBLKS
|
||
|
||
; Bootstrap entry point to swap DSKDMP into memory.
|
||
; This code used to live at GO: but has been moved into the bootstrap
|
||
; to avoid a horrible race condition where it blissfully commanded the
|
||
; disk to write over the GO-code before it jumped out of harm's way.
|
||
; A real RH11 is slow enough that this used to work, but under the
|
||
; KLH10 emulator it can and does get clobbered! --KLH
|
||
|
||
PHGO: MOVSI B,-LSWPADR
|
||
PHGO1: IORD DIFF,SWPCS1
|
||
TRNN DIFF,%HXRDY ; Wait for controller
|
||
JRST PHGO1
|
||
HRRZ DIFF,SWPVAL(B)
|
||
IOWR DIFF,SWPADR(B)
|
||
AOBJN B,PHGO1
|
||
|
||
PHWAIT: IORD B,SWPCS1
|
||
TRNN B,%HXRDY
|
||
JRST PHWAIT
|
||
; Fall through when bootstrap has finished loading full DSKDMP.
|
||
];PH
|
||
|
||
RH,[
|
||
BOOT:
|
||
IFE BOOTSW, JRST BEG ;OR CONSZ DSK,%HIBSY OR JRST LOADG1
|
||
IFN BOOTSW, CONSZ DSK,%HIBSY
|
||
JRST .-1
|
||
KL, CONSZ PAG,660000 ;PAGING AND CACHE MUST BE DISABLED
|
||
KL, JRST 4,.
|
||
MOVEI B,ICWA+2 ;SET UP CHANNEL PROG
|
||
MOVEM B,ICWA
|
||
SETZM ICWA+1
|
||
SETZM ICWA+3
|
||
BOOT0: DATAO DSK,[%HRDCL,,]
|
||
MOVEI A,20
|
||
SOJG A,.
|
||
DATAI DSK,A
|
||
TRNN A,%HCDVA
|
||
JRST BOOT0 ;AWAIT DRIVE AVAILABLE
|
||
MOVE B,ERRWD
|
||
CONI DSK,A
|
||
TLNE A,(%HID22)
|
||
HRLI B,-1700_4
|
||
MOVEM B,@ICWA
|
||
MOVSI B,-6
|
||
BOOT1: DATAO DSK,SWPIN1(B)
|
||
MOVEI A,20
|
||
SOJG A,.
|
||
CONSZ DSK,%HIBSY
|
||
JRST .-1
|
||
AOBJN B,BOOT1
|
||
CONSZ DSK,%HIERR
|
||
JRST 4,.
|
||
JRST BEG
|
||
|
||
ZZ1==<NSWBL-1>*SECBLK ;BLOCK CONTAINING CORE SWAPPED OUT TO BRING DSKDMP IN
|
||
ZZ2==<NSWBL>*SECBLK ;DSKDMP RESIDENCE BLOCK
|
||
ZZ3==ZZ1/NSECS
|
||
ZZ4==ZZ2/NSECS
|
||
ZZ1==ZZ3*400+<ZZ1-NSECS*ZZ3> ;CONVERT ADDR TO DISK FORMAT
|
||
ZZ2==ZZ4*400+<ZZ2-NSECS*ZZ4>
|
||
|
||
ERRWD: -1700,,BEG-1
|
||
SWPIN1: %HRLOD+%HRDCL,,%HMRDP
|
||
SWPIN2: %HRLOD+%HRCYL,,NCYLS+1 ;AVOID CYLINDER 406 WHICH KLDCP USES
|
||
SWPIN3: %HRLOD+%HRADR,,ZZ1
|
||
SWPIN4: %HRLOD+%HRCTL,,%HMWRT+ICWA_6
|
||
SWPIN5: %HRLOD+%HRADR,,ZZ2
|
||
SWPIN6: %HRLOD+%HRCTL,,%HMRED+ICWA_6
|
||
|
||
SWPOU1: %HRLOD+%HRDCL,,%HMRDP
|
||
SWPOU2: %HRLOD+%HRCYL,,NCYLS+1 ;AVOID CYLINDER 406 WHICH KLDCP USES
|
||
SWPOU3: %HRLOD+%HRADR,,ZZ2
|
||
SWPOU4: %HRLOD+%HRCTL,,%HMWRT+ICWA_6
|
||
SWPOU5: %HRLOD+%HRADR,,ZZ1
|
||
SWPOU6: %HRLOD+%HRCTL,,%HMRED+ICWA_6
|
||
|
||
CBLK: -NSWBL,,NBLKS+NBLKSC ;AVOID CYLINDER 406 WHICH KLDCP USES
|
||
|
||
WAIT: CONSO DSK,%HIDON
|
||
JRST .-1
|
||
];RH
|
||
|
||
SC,[
|
||
BOOT:
|
||
IFE BOOTSW, JRST BEG ;OR CONSZ DC0,DSSACT OR JRST LOADG1
|
||
IFN BOOTSW, CONSZ DC0,DSSACT
|
||
JRST .-1
|
||
DATAO DC0,SWPINJ
|
||
CONSZ DC0,DSSACT
|
||
JRST .-1
|
||
JRST BEG
|
||
|
||
SWPINJ: DJMP SWPIN
|
||
|
||
DADR==NCYLS_13+<<NSWBL-1>/2>_6+<<NSWBL-1>&1> ;ADDR OF LAST BLOCK IN CORE BUFFER
|
||
DADR1==NCYLS_13+<NSWBL/2>_6+<NSWBL&1> ;ADDR OF NEXT BLOCK (CONTAINS
|
||
SWPIN: DWRITE+DUNENB+DADR ; WORKING COPY OF DSKDMP)
|
||
DCOPY BEG(-2000_2&37774)
|
||
DCSKIP (-4_2&37774)
|
||
DRC+DADR
|
||
DCOPY BEG(-2000_2&37774)
|
||
DCSKIP (-4_2&37774)
|
||
DREAD+DADR1
|
||
DCOPY BEG(-1700_2&37774)
|
||
DCSKIP (-104_2&37774)
|
||
DRC+DADR1
|
||
DCOPY BEG(-1700_2&37774)
|
||
DCSKIP (-104_2&37774)
|
||
DHLT
|
||
|
||
SWPOUT: DWRITE+DUNENB+DADR1
|
||
DCOPY BEG(-2000_2&37774)
|
||
DCSKIP (-4_2&37774)
|
||
DRC+DADR1
|
||
DCOPY BEG(-2000_2&37774)
|
||
DCSKIP (-4_2&37774)
|
||
DREAD+DADR
|
||
DCOPY BEG(-1700_2&37774)
|
||
DCSKIP (-104_2&37774)
|
||
DRC+DADR
|
||
DCOPY BEG(-1700_2&37774)
|
||
DCSKIP (-104_2&37774)
|
||
DHLT
|
||
|
||
CBLK: -NSWBL,,NBLKS ;DISK ADDR OF CORE BUFFER, - # BLOCKS IN LH
|
||
WAIT: CONSZ DC0,DSSACT
|
||
JRST .-1
|
||
];SC
|
||
|
||
; End of last-100-words bootstrap.
|
||
; Fall through to here from device-specific code when I/O complete
|
||
SADR: JRST BOOT ;AND GO TO PROGRAM TO BE STARTED
|
||
SYSN: SIXBIT /./ ;CURRENT DIRECTORY
|
||
|
||
; Make sure bootstrap didn't go off edge of world (777777)
|
||
IFG .+1-MEMSIZ,.ERR BOOT BLOAT
|
||
|
||
IFE BOOTSW,{ ;CURLY BRACKETS TO AVOID ERROR MESSAGE
|
||
OFFSET 0
|
||
LOC CORE
|
||
|
||
;THESE ARE THE BLOCKS THAT GET WRITTEN ON DISK
|
||
; STARTING AT THE BEGINNING OF THE FIRST EXTRA CYLINDER
|
||
|
||
CBUF: BLOCK 2000 ;PSEUDO-CORE BUFFER
|
||
DBUF: BLOCK 2000 ;DISK BUFFER
|
||
DIR: BLOCK 2000 ;DIRECTORY BUFFER
|
||
TUT: BLOCK 2000*NTUTBL ;TUT BUFFER
|
||
IFN .-BEG,.ERR BLOCKS LOST
|
||
; BLOCK 2000 ;CORE OVERLAYED BY DSKDMP
|
||
; BLOCK 2000 ;COPY OF DSKDMP
|
||
; BLOCK 2000 ;SPARE COPY OF DSKDMP
|
||
|
||
END ZZZ
|
||
};END IFE BOOTSW
|
||
IFN BOOTSW, END CBOOT
|