mirror of
https://github.com/PDP-10/stacken.git
synced 2026-02-19 22:05:10 +00:00
4902 lines
168 KiB
Plaintext
4902 lines
168 KiB
Plaintext
TITLE ONCMOD LEVEL D OPTIONAL & MANDATORY ONCE ONLY CODE V11532
|
||
SUBTTL D. MASTROVITO/DPM 23-AUG-88
|
||
|
||
SEARCH F,S,DEVPRM
|
||
IFN FTCIDSK,<
|
||
SEARCH KLPPRM,MSCPAR
|
||
>; END IFN FTCIDSK
|
||
$RELOC
|
||
$INIT
|
||
|
||
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
|
||
; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
|
||
;
|
||
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION
|
||
; 1973,1974,1975,1976,1977,1978,1979,1980,1982,1984,1986,1988.
|
||
;ALL RIGHTS RESERVED.
|
||
|
||
.CPYRT<1973,1988>
|
||
|
||
;
|
||
XP VONCMD,11532
|
||
|
||
ONCMOD::ENTRY ONCMOD
|
||
|
||
SALL ;CLEAN LISTINGS
|
||
.DIRECT FLBLST ;CLEANER LISTINGS
|
||
ND UNTPLN,^D5 ;UNITS/LINE TYPED BY TYPUNS/TYPNMU
|
||
SUBTTL ASL PROCESSING -- CHGASL - CHANGE
|
||
|
||
|
||
CHGASL::JRST DEFASL ;SAME AS DEFINE
|
||
SUBTTL ASL PROCESSING -- CRESST - CREATE SWAPPING SATS
|
||
|
||
|
||
CRESST: SE1ENT ;ENTER SECTION ONE
|
||
IFN FTXMON,<SKIPL UNIPTR(U)> ;ALREADY HAVE?
|
||
SKIPGE UNISUN(U) ;IS UNIT IN ASL?
|
||
POPJ P, ;NO--DONE
|
||
LDB T2,UNYK4S## ;GET # K FOR SWAPPING ON THIS UNIT
|
||
JUMPE T2,CPOPJ## ;RETURN IF NO SWAPPING SPACE
|
||
LSH T2,K2PLSH ;DOUBLE SIZE IF SWAPPING PAGES
|
||
MOVEI T2,^D36(T2) ;INCLUDE EXTRA WORD
|
||
IDIVI T2,^D36
|
||
MOVN T1,T2 ;MAKE LENGTH -VE FOR AOBJN WORD
|
||
HRLM T1,UNIPTR(U) ;STORE IT IN UNIT DATA BLOCK
|
||
LSH T2,1 ;DOUBLE ALLOCATION FOR COPY FOR 143 RESTARTS
|
||
PUSHJ P,CORGRS ;GET CORE
|
||
HRRM T1,UNIPTR(U) ;STORE IT IN UNIT DATA BLOCK FOR AOBJN WORD
|
||
IFN FTXMON,<
|
||
MOVEI T1,(MS.SAT) ;DATA SECTION 1
|
||
DPB T1,UNYSNS## ;STORE THAT FOR SWPSER
|
||
> ;END IFN FTXMON
|
||
POPJ P, ;RETURN
|
||
SUBTTL ASL PROCESSING -- DEFASL - DEFINE
|
||
|
||
|
||
DEFASL::PUSHJ P,SAVE2## ;SAVE P1 AND P2
|
||
PUSH P,U ;SAVE U
|
||
MOVEI T1,ASLTXT ;PROMPT STRING
|
||
MOVE T2,[IFIW ASLVAL] ;ROUTINE TO VALIDATE RESPONSES
|
||
MOVE T3,[-SWPMAX##,,SUDTAB] ;AOBJN POINTER TO STORE RESULTS
|
||
PUSHJ P,PRSLST## ;PROMPT AND FETCH ANSWERS
|
||
MOVE P1,T1 ;GET UPDATED AOBJN POINTER TO TABLE
|
||
SETZ P2, ;INIT POSITION COUNTER
|
||
MOVEI U,SYSUNI##-UNISYS## ;SET PREDESSOR
|
||
|
||
DEFAS1: HLRZ U,UNISYS(U) ;LINK TO NEXT UNIT IN SYSTEM
|
||
JUMPE U,DEFAS2 ;DONE?
|
||
SKIPL UNISUN(U) ;NOT IN THE ASL?
|
||
PUSHJ P,SETCHG ;THEN HOME BLOCKS WILL CHANGE
|
||
SETOM UNISUN(U) ;REMOVE FROM THE ASL
|
||
JRST DEFAS1 ;LOOP FOR ALL STRS
|
||
|
||
DEFAS2: MOVEI U,SYSUNI##-UNISYS## ;SET PREDESSOR
|
||
MOVE T1,(P1) ;GET A UNIT NAME
|
||
|
||
DEFAS3: HLRZ U,UNISYS##(U) ;LINK TO NEXT UNIT
|
||
JUMPE U,DEFAS4 ;SHOULD NEVER BE 0 CUZ UNIT WAS VALIDATED
|
||
CAME T1,UDBNAM(U) ;DRIVE NAME?
|
||
CAMN T1,UNIHID(U) ;OR LOGICAL UNIT?
|
||
CAIA ;YES
|
||
JRST DEFAS3 ;TRY ANOTHER UNIT
|
||
MOVEM P2,UNISUN(U) ;STORE FAKED UP POSITION IN THE ASL
|
||
AOS P2 ;INCREMENT FOR NEXT TIME
|
||
PUSHJ P,SETCHG ;MARK HOME BLOCKS TO BE REWRITTEN
|
||
|
||
DEFAS4: AOBJN P1,DEFAS2 ;LOOP BACK FOR ANOTHER UNIT
|
||
POP P,U ;RESTORE U
|
||
SETZM PREASL## ;DON'T BELEIVE BOOT VECTOR
|
||
PJRST VFCORE ;GO VERIFY INCORE DATA BASE
|
||
SUBTTL ASL PROCESSING -- DELSST - DELETE SWAPPING SATS
|
||
|
||
|
||
DELSST: SKIPL UNIPTR(U) ;HAVE SWAPPING SATS?
|
||
POPJ P, ;NO
|
||
LDB T1,UNYK4S## ;GET # K FOR SWAPPING ON THIS UNIT
|
||
JUMPE T1,CPOPJ## ;RETURN IF NO SWAPPING SPACE
|
||
SE1ENT ;ENTER SECTION ONE
|
||
LSH T1,K2PLSH ;DOUBLE SIZE IF SWAPPING PAGES
|
||
MOVEI T1,^D36(T1) ;INCLUDE EXTRA WORD
|
||
IDIVI T1,^D36
|
||
LSH T1,1 ;DOUBLE ALLOCATION FOR COPY FOR 143 RESTARTS
|
||
HRRZ T2,UNIPTR(U) ;GET SECTION-RELATIVE ADDRESS
|
||
IFE FTXMON,<PUSHJ P,GIVWDS##> ;RETURN CORE
|
||
IFN FTXMON,<
|
||
HRLI T2,(MS.SAT) ;INCLUDE SECTION NUMBER
|
||
PUSHJ P,GVFWDS## ;RETURN CORE
|
||
SETZ T1, ;GET A ZERO
|
||
DPB T1,UNYSNS## ;CLEAR OUT SECTION NUMBER
|
||
> ;END IFN FTXMON
|
||
SETZM UNIPTR(U) ;ZERO POINTER TO SATS
|
||
POPJ P, ;RETURN
|
||
SUBTTL ASL PROCESSING -- DSKASL - BUILD ASL FROM DISK
|
||
|
||
|
||
DSKASL: PUSHJ P,SAVE4## ;SAVE SOME ACS
|
||
PUSH P,U ;SAVE U
|
||
MOVSI P1,-SWPMAX## ;AOBJN POINTER TO SWPTAB
|
||
MOVEI P2,SWPUNI##-UNISWP ;SET PREDESSOR
|
||
SETZB P3,P4 ;START WITH CLASS 0 & ZERO K4S TALLY
|
||
|
||
DSKAS1: HLRZ U,SYSUNI## ;GET ADDR OF FIRST UDB IN SYSTEM
|
||
|
||
DSKAS2: SKIPGE UNISUN(U) ;UNIT IN ACTIVE SWAPPING LIST?
|
||
JRST DSKAS4 ;CAN'T LINK THIS UNIT
|
||
LDB T1,UNYCFS## ;GET SWAPPING CLASS
|
||
CAIE T1,(P3) ;MATCH?
|
||
JRST DSKAS4 ;NO
|
||
SKIPE P3 ;SLOW SWAPPING CLASS?
|
||
SKIPE SWPUN2## ;YES--SLOW SWAPPING POINTER SETUP YET?
|
||
JRST DSKAS3 ;JUST LINK INTO THE CHAIN
|
||
HRLM U,SWPUN2## ;SAVE FIRST SLOW SWAPPING UNIT
|
||
HRRM T1,SWPUN2## ;AND THE CLASS NUMBER
|
||
|
||
DSKAS3: PUSHJ P,CRESST ;CREATE SWAPPING SATS
|
||
HRRZM P1,UNISUN(U) ;SET SWAPPING UNIT NUMBER
|
||
HRLM U,UNISWP(P2) ;LINK THIS UNIT TO PREVIOUS IN SWAP LIST
|
||
MOVE P2,U ;NOW SET PREDECESSOR FOR NEXT UNIT (IF ANY)
|
||
MOVEM U,SWPTAB##(P1) ;PUT IN SWAPPER TABLE TOO
|
||
LDB T1,UNYK4S## ;GET K FOR SWAPPING ON THIS UNIT
|
||
ADD P4,T1 ;ACCUMULATE
|
||
MOVE T1,UDBNAM(U) ;DRIVE NAME (INCAES OF HWP)
|
||
MOVEI T2,[ASCIZ /swapping unit is hardware write protected/]
|
||
MOVSI T3,UNPHWP ;GET HWP BIT
|
||
TDNE T3,UNIDES(U) ;CAN WE WRITE ON THIS UNIT?
|
||
PUSHJ P,UWARN ;WARN OPERATOR
|
||
AOBJP P1,DSKAS5 ;DONE THE MAXIMUM YET?
|
||
|
||
DSKAS4: HLRZ U,UNISYS(U) ;LINK TO NEXT UNIT
|
||
JUMPN U,DSKAS2 ;LOOP FOR MORE
|
||
SKIPN P3 ;DONE BOTH CLASSES?
|
||
AOJA P3,DSKAS1 ;NOW PROCESS CLASS 1
|
||
HLRZ U,SWPUNI## ;GET FIRST SWAPPING UNIT
|
||
JUMPN U,DSKAS5 ;ARE THERE ANY UNITS IN ASL?
|
||
AOS SERIUS ;CALL THIS A SERIOUS ERROR
|
||
MOVEI T1,[ASCIZ /% No units in active swapping list/]
|
||
PUSHJ P,CONOUT## ;PRINT MESSAGE
|
||
JRST DSKAS6 ;AND CONTINUE
|
||
DSKAS5: MOVE T1,MEMSIZ## ;GET WORDS OF CORE
|
||
LSH T1,W2KLSH ;CONVERT TO K
|
||
CAML P4,T1 ;ENOUGH FOR THE AMOUNT OF CORE WE HAVE?
|
||
JRST DSKAS6 ;YES
|
||
AOS SERIUS ;CALL THIS A SERIOUS ERROR
|
||
MOVEI T1,[ASCIZ /% Insufficient swapping space allocated/]
|
||
PUSHJ P,CONOUT## ;PRINT TEXT
|
||
MOVEI T1,[ASCIZ / Swapping space = /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
MOVE T1,P4 ;GET TOTAL SWAPPING SPACE ALLOCATED
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
MOVEI T1,[ASCIZ /K, memory size = /]
|
||
PUSHJ P,CONMES## ;PRINT IT
|
||
MOVE T1,MEMSIZ## ;GET AMOUNT OF CORE
|
||
LSH T1,W2KLSH ;CONVERT TO K
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
MOVEI T1,[ASCIZ /K/] ;TERMINATOR
|
||
PUSHJ P,CONMES## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
DSKAS6: HLRZ U,SYSUNI## ;POINT TO FIRST UNIT IN SYSTEM
|
||
|
||
DSKAS7: SKIPGE UNISUN(U) ;IN THE ASL?
|
||
PUSHJ P,DELSST ;NO--DELETE ANY SWAPPING SATS
|
||
HLRZ U,UNISYS(U) ;LINK TO NEXT
|
||
JUMPN U,DSKAS7 ;LOOP BACK FOR MORE
|
||
JRST UPOPJ## ;RESTORE U AND RETURN
|
||
SUBTTL ASL PROCESSING -- SHWASL - SHOW
|
||
|
||
|
||
SHWASL::PUSHJ P,SAVE1## ;SAVE P1
|
||
PUSH P,U ;SAVE U
|
||
MOVEI T1,SWPTXT ;POINT TO HEADER
|
||
PUSHJ P,CONOUT## ;PRINT IT
|
||
MOVEI U,SYSUNI##-UNISYS ;SET PREDESSOR
|
||
SETZ P1, ;CLEAR "*" FLAG
|
||
|
||
SHWAS1: HLRZ U,UNISYS(U) ;LINK TO NEXT
|
||
JUMPE U,SHWAS3 ;DONE?
|
||
LDB T1,UNYK4S## ;GET K FOR SWAPPING
|
||
JUMPE T1,SHWAS1 ;HAVE SOME?
|
||
|
||
SHWAS2: PUSHJ P,OTSET## ;SET UP BUFFER
|
||
MOVEI T3,11 ;TAB
|
||
PUSHJ P,COMTYO## ; OVER
|
||
MOVEI T3," " ;LEADING SPACE IF NOT IN LIST
|
||
SKIPL UNISUN(U) ;IS IT?
|
||
MOVEI T3,"*" ;YES--CHANGE TO A SPACE
|
||
SKIPL UNISUN(U) ;CHECK AGAIN
|
||
AOS P1 ;FLAG THE ASTERISK
|
||
PUSHJ P,COMTYO## ;PRINT THE FLAG
|
||
MOVE T2,UDBNAM(U) ;DRIVE NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
MOVEI T3,11 ;TAB
|
||
PUSHJ P,COMTYO## ; OVER
|
||
MOVE T2,UNIHID(U) ;UNIT ID
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
MOVEI T1,[ASCIZ / /]
|
||
PUSHJ P,CONMES## ;SPACE OVER
|
||
LDB T1,UNYCFS## ;SWAPPING CLASS
|
||
PUSHJ P,PRTDI8## ;PRINT IT
|
||
MOVEI T1,[ASCIZ / /]
|
||
PUSHJ P,CONMES## ;SPACE OVER
|
||
LDB T1,UNYK4S## ;GET K FOR SWAPPING
|
||
MOVEI T2,^D9 ;COLUMN COUNT
|
||
PUSHJ P,NUMTYP ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
JRST SHWAS1 ;LOOP BACK FOR MORE
|
||
|
||
SHWAS3: POP P,U ;RESTORE U
|
||
SKIPE .UONCE## ;USER MODE?
|
||
JRST SHWAS4 ;SKIP THE MEMSIZ STUFF
|
||
MOVEI T1,[ASCIZ / (Memory size = /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
MOVE T1,MEMSIZ## ;GET WORDS OF CORE
|
||
LSH T1,W2KLSH ;CONVERT TO K
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
MOVEI T1,[ASCIZ /K)/] ;TERMINATOR
|
||
PUSHJ P,CONMES## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
SHWAS4: JUMPE P1,CPOPJ1## ;RETURN IF NO UNITS FLAGGED
|
||
MOVEI T1,[ASCIZ /
|
||
* indicates unit currently in the ASL/]
|
||
PUSHJ P,CONOUT## ;PRINT TEXT + CRLF
|
||
JRST CPOPJ1## ;RETURN
|
||
|
||
SWPTXT: ASCIZ /
|
||
Swapping Units:
|
||
Unit UnitID Class Space (K)
|
||
------ ------ ----- ---------/
|
||
SUBTTL ASL PROCESSING -- MISCELLANEOUS
|
||
|
||
|
||
;VALIDATE AN ASL ENTRY
|
||
ASLVAL: MOVEI T2,[ASCIZ /does not exist/] ;INCASE OF ERROR
|
||
MOVEI T3,SYSUNI##-UNISYS ;SET PREDESSOR
|
||
ASLVA1: HLRZ T3,UNISYS(T3) ;LINK TO NEXT UDB
|
||
JUMPE T3,UWARN ;END OF CHAIN?
|
||
CAME T1,UDBNAM(T3) ;PHYSICAL DRIVE NAME?
|
||
CAMN T1,UNIHID(T3) ;LOGICAL UNIT ID?
|
||
SKIPA ;YES TO EITHER
|
||
JRST ASLVA1 ;TRY ANOTHER
|
||
EXCH T3,U ;SWAP ACS
|
||
LDB T4,UNYK4S## ;GET K FOR SWAPPING
|
||
EXCH T3,U ;RESTORE ACS
|
||
JUMPN T4,CPOPJ1## ;RETURN GOODNESS IF OK
|
||
MOVEI T2,[ASCIZ /has no swapping space allocated/]
|
||
PJRST UWARN ;WARN OPERATOR AND RETURN
|
||
|
||
ASLTXT: ASCIZ /
|
||
Enter names of units to appear in the active swapping list, one
|
||
per line. Terminate list with a blank line./
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETASL - SINGLE UNIT ASL
|
||
|
||
|
||
GETASL: JUMPE P2,GETAS1 ;UNIT PART OF A STRUCTURE?
|
||
HRRZ T1,STRUNM##(P2) ;NUMBER OF UNITS IN STR
|
||
SOJG T1,CPOPJ## ;QUESTION ONLY VALID OF A SINGLE PACK STRUCTURE
|
||
LDB T1,UNYK4S## ;GET K FOR SWAPPING
|
||
JUMPE T1,CPOPJ## ;RETURN IF NONE ALLOCATED
|
||
GETAS1: MOVEI T1,[ASCIZ / Make this the only unit in the ASL/]
|
||
MOVSI T2,'NO ' ;DEFAULT ANSWER
|
||
JUMPE P2,GETAS2 ;UNIT PART OF A STRUCTURE?
|
||
MOVE T3,['KLAD '] ;SPECIAL NAME FOR DEC DIAG DISKS
|
||
CAMN T3,STRNAM##(P2) ;IS THIS A KLAD PACK?
|
||
MOVSI T2,'YES' ;CHANGE THE DEFAULT
|
||
GETAS2: PUSHJ P,PRSYNQ## ;PROMPT AND FETCH ANSWER
|
||
JUMPE T1,CPOPJ## ;RETURN IF HE SAID "NO"
|
||
PUSH P,U ;SAVE U
|
||
MOVEI U,SYSUNI##-UNISYS ;SET PREDESSOR
|
||
|
||
GETAS3: HLRZ U,UNISYS(U) ;LINK TO NEXT UNIT
|
||
JUMPE U,GETAS4 ;DONE ALL UNITS?
|
||
SKIPL UNISUN(U) ;IN THE ASL ALREADY?
|
||
PUSHJ P,SETCHG ;YES--MARK HOME BLOCKS TO BE REWRITTEN
|
||
SETOM UNISUN(U) ;EMPTY THE ASL
|
||
JRST GETAS3 ;LOOP BACK FOR MORE
|
||
|
||
GETAS4: POP P,U ;RESTORE U
|
||
HRLM U,SWPUNI## ;SET AS FIRST IN THE ASL
|
||
HRRZS UNISWP(U) ;MAKE IT THE LAST IN THE CHAIN
|
||
SETZM UNISUN(U) ;SET POSITION TO ZERO
|
||
MOVSI T1,-SWPMAX## ;AOBJN POINTER
|
||
MOVEM U,SWPTAB##(T1) ;STORE IN THE SWAPPER TABLE
|
||
AOBJP T1,CPOPJ## ;RETURN IF A SHORT TABLE
|
||
SETZM SWPTAB##(T1) ;CLEAR OUT
|
||
AOBJN T1,.-1 ; THE REMAINDER
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETBAT - READ BAT BLOCKS
|
||
|
||
|
||
GETBAT: PUSHJ P,SAVE4## ;SAVE SOME ACS
|
||
PUSH P,T1 ;SAVE MANDATORY REWRITE FLAG
|
||
PUSHJ P,GTMNB1 ;GET MONITOR BUFFER
|
||
SETZM BATBAD ;CLEAR "BAT" BLOCK BAD FLAG
|
||
MOVSI P2,'BAT' ;BLOCK NAME
|
||
MOVE P3,[CODBAT##] ;SPECIAL CODE
|
||
MOVE P4,[LBOBAT##,,LBOBAT##] ;FIRST,,SECOND BLOCK OFFSETS
|
||
ADD P4,UNIHOM(U) ;CONVERT TO BLOCK NUMBERS
|
||
PUSHJ P,REDRUN ;GO READ & VERIFY BLOCKS
|
||
JRST TPOPJ## ;BOTH BAD, SO MUST REWRITE THEM
|
||
SKIPE REDERR ;ANY ERRORS IN EITHER ONE
|
||
SETOM BATBAD ;SET BAT BLOCK BAD FLAG
|
||
HRRZ T1,BAFFIR##(P1) ;GET START OF BAD REGION PAIRS
|
||
CAIL T2,BLKCOD## ;MAKE SURE IT'S WITHIN THE BLOCK
|
||
JRST TPOPJ## ;IT ISN'T SO MUST REWRITE THE BLOCKS
|
||
MOVE T3,P1 ;COPY BUFFER ADDRESS FOR LDB
|
||
LDB P2,BAYNBR## ;GET # BAD REGIONS FOUND BY MAP PROGRAM
|
||
ADD P2,BAFCNT##(P1) ;ADD IN # FOUND BY MONITOR
|
||
JUMPE P2,TPOPJ1## ;RETURN IF NONE & DON'T REWRITE BAT BLOCKS
|
||
SKIPN BATFLG ;WANT TO SEE THE BAD REGIONS?
|
||
JRST TPOPJ1## ;NO
|
||
MOVE T1,UDBNAM(U) ;GET DRIVE NAME
|
||
MOVEI T2,[ASCIZ /bad blocks:/]
|
||
PUSHJ P,UWARN ;WARN OPERATOR
|
||
MOVEI T1,[ASCIZ/ First block No. CPU Cont Unit Error/]
|
||
PUSHJ P,CONOUT## ;PRINT TEXT
|
||
MOVEI T1,[ASCIZ/ ------------ --- ----- ---- ---- -----/]
|
||
PUSHJ P,CONOUT## ;PRINT TEXT
|
||
MOVE T3,P1 ;COPY BLOCK ADDRESS FOR LDB
|
||
LDB P2,BAYNBR## ;GET # BAD REGIONS FOUND BY MAP PROGRAM
|
||
ADD P2,BAFCNT##(P1) ;ADD IN # FOUND BY MONITOR
|
||
MOVNS P2 ;NEGATE
|
||
HRLZS P2 ;COUNT IN LH
|
||
HRR P2,BAFFIR##(P1) ;MAKE AN AOBJN POINTER
|
||
ADDI P2,(P1) ;RELOCATE TO WITHIN THE BUFFER
|
||
|
||
GETBA1: MOVEI T1,[ASCIZ / /] ;SPACE
|
||
PUSHJ P,ICONM## ; OVER
|
||
MOVE T1,BAFELB##(P2) ;GET START OF REGION
|
||
TLZ T1,BATMSK## ;MASK OUT ALL BUT ADDR
|
||
MOVEI T2,BAPNTP## ;IF OLD STYLE
|
||
TDNN T2,BAFAPN##(P2) ;CHECK IT
|
||
HRRZS T1 ;ONLY 18 BITS COUNT
|
||
MOVEI T2,^D12 ;COLUMN COUNT
|
||
PUSHJ P,NUMTYP ;PRINT STARTING BLOCK NUMBER
|
||
MOVEI T1,[ASCIZ / /] ;SPACE
|
||
PUSHJ P,CONMES## ; OVER
|
||
MOVE T2,P2 ;COPY POINTER
|
||
LDB T1,BAYNBB## ;GET BAD BLOCKS-1 IN THIS REGION
|
||
AOS T1 ;ADJUST SO NUMBER IS PLEASING TO THE EYE
|
||
MOVEI T2,^D3 ;COLUMN COUNT
|
||
PUSHJ P,NUMTYP ;PRINT IT
|
||
MOVEI T1,[ASCIZ / /] ;SPACE
|
||
PUSHJ P,CONMES## ; OVER
|
||
MOVE T2,P2 ;COPY POINTER
|
||
LDB T1,BAYAPN## ;GET CPU WHICH DETECED THE ERROR
|
||
MOVEI T2,^D5 ;COLUMN COUNT
|
||
PUSHJ P,NUMTYP ;PRINT IT
|
||
MOVEI T1,[ASCIZ / /] ;SPACE
|
||
PUSHJ P,CONMES## ; OVER
|
||
MOVE T2,P2 ;COPY POINTER
|
||
LDB T1,BAYKNM## ;GET KONTROLLER NUMBER
|
||
MOVEI T2,^D4 ;COLUMN COUNT
|
||
PUSHJ P,NUMTYP ;PRINT IT
|
||
MOVEI T1,[ASCIZ / /] ;SPACE
|
||
PUSHJ P,CONMES## ; OVER
|
||
LDB T1,UNYKTP## ;GET KONTROLLER TYPE
|
||
CAIN T1,TYPRA ;CI DISK?
|
||
JRST GETBA3 ;THEN UNIT IS MEANINGLESS
|
||
MOVE T1,BAFPUB##(P2) ;GET WORD CONTAINING UNIT NUMBER
|
||
LSH T1,14 ;LEFT JUSTIFY MASK
|
||
JFFO T1,.+1 ;FIND FIRST BIT
|
||
MOVEI T1,7 ;HIGHEST LEGAL UNIT IN A BAT BLOCK
|
||
SUBI T1,(T2) ;COMPUTE ACTUAL UNIT NUMBER
|
||
MOVEI T2,^D4 ;COLUMN COUNT
|
||
PUSHJ P,NUMTYP ;PRINT IT
|
||
JRST GETBA4 ;SKIP AROUND
|
||
|
||
GETBA3: MOVEI T1,[ASCIZ / /]
|
||
PUSHJ P,CONMES## ;SKIP COLUMN
|
||
|
||
GETBA4: MOVEI T1,[ASCIZ / /] ;SPACE
|
||
PUSHJ P,CONMES## ; OVER
|
||
MOVE T2,BAFERR##(P2) ;GET ERROR WORD
|
||
MOVEI T1,[ASCIZ /???/]
|
||
TLNE T2,BAPOTR## ;OTHER?
|
||
MOVEI T1,[ASCIZ /Other/]
|
||
TLNE T2,BAPDTR## ;DATA ERROR?
|
||
MOVEI T1,[ASCIZ /Data/]
|
||
TLNE T2,BAPHDR## ;SEARCH OR HEADER COMPARE?
|
||
MOVEI T1,[ASCIZ /Search or header compare/]
|
||
PUSHJ P,CONMES## ;PRINT TEXT
|
||
|
||
GETBA5: PUSHJ P,CRLFOP## ;END LINE
|
||
AOS P2 ;ACCOUNT FOR TWO WORD ENTRIES
|
||
AOBJN P2,GETBA1 ;LOOP
|
||
POP P,T1 ;GET MANDATORY REWRITE FLAG BACK
|
||
JUMPN T1,CPOPJ## ;RETURN NOW IF NO OPERATOR OPTION
|
||
MOVEI T1,[ASCIZ /Initialize BAT blocks/]
|
||
MOVSI T2,'NO ' ;DEFAULT
|
||
PUSHJ P,PRSYNQ## ;PROMPT AND FETCH ANSWER
|
||
JUMPN T1,CPOPJ## ;IF "YES", THEN TAKE THE APPROPRIATE RETURN
|
||
JRST CPOPJ1## ;ELSE DON'T INIT BAT BLOCKS
|
||
|
||
|
||
NUMTYP: PUSHJ P,SAVE1## ;SAVE P1
|
||
MOVEI P1,(T2) ;COPY COLUMN COUNT
|
||
NUMTY1: IDIVI T1,12 ;DIVIDE BY RADIX
|
||
PUSH P,T2 ;SAVE REMAINDER
|
||
SOS P1 ;COUNT DIGITS
|
||
SKIPE T1 ;DONE?
|
||
PUSHJ P,NUMTY1 ;RECURSE
|
||
SKIPLE P1 ;NEED TO PAD ANY COLUMNS?
|
||
PUSHJ P,PRSPC## ;PRINT A SPACE
|
||
SOJG P1,.-1 ;PAD OUT
|
||
POP P,T3 ;GET DIGIT BACK
|
||
ADDI T3,"0" ;MAKE ASCII
|
||
PJRST COMTYO## ;PRINT IT AND RETURN
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETBPC - BLOCKS PER CLUSTER
|
||
|
||
|
||
GETBPC: SETZM ONCTCH## ;DEFEAT PRSCON
|
||
HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
MOVEI T1,[ASCIZ / *Blocks per cluster/]
|
||
LDB T2,UNYKTP## ;GET KONTROLLER TYPE
|
||
SKIPN CHGFLG## ;CHANGE?
|
||
SKIPA T2,BPCDEF(T2) ;LOAD UP A RESONABLE DEFAULT
|
||
LDB T2,UNYBPC## ;USE CURRENT VALUE
|
||
MOVEI T3,3 ;LOW RANGE
|
||
MOVEI T4,377777 ;HIGH RANGE
|
||
PUSHJ P,PRSDEC## ;PROMPT AND FETCH ANSWER
|
||
MOVE P1,T1 ;COPY TO UNORTHODOX PLACE
|
||
; PJRST BPCSTO ;GO STORE RESULTS
|
||
BPCSTO: LDB T1,UNYBPC## ;GET CURRENT VALUE
|
||
CAME T1,P1 ;SAME A NEW?
|
||
PUSHJ P,REFCHS ;NO--MUST REFRESH
|
||
MOVE T1,[DPB P1,UNYBPC##];GET INSTR. TO BE EXECUTED BY STOUNI
|
||
PUSHJ P,STOUNI ;STORE VALUE IN EVERY UNIT IN STR
|
||
HLRZ U,STRUNI##(P2) ;GET ADR. OF 1ST. UNIT DATA BLOCK IN STR
|
||
PUSHJ P,COMLCA ;COMPUTE LAST CLUSTER ADR. ON UNIT
|
||
JFFO T2,.+2 ;FIND POSITION OF 1ST. 1 BIT
|
||
MOVEI T3,^D35 ;NONE - BUT FIELD MUST BE AT LEAST 1 BIT WIDE
|
||
MOVN P1,T3 ;NEGATE FOR ADDI INSTR.
|
||
ADDI P1,^D36 ;COMPUTE FIELD WIDTH FOR CLUSTER ADR.
|
||
LDB T1,[POINT 6,STYCLP##(P2),11]
|
||
CAME T1,P1 ;NEW SAME AS OLD?
|
||
PUSHJ P,REFCHS ;NO
|
||
DPB P1,[POINT 6,STYCLP##(P2),11] ;PUT IT IN BYTE POINTER
|
||
HLRZ U,STRUNI##(P2) ;GET ADR. OF 1ST. UNIT DATA BLOCK IN STR
|
||
LDB T3,UNYBPC## ;GET # BLOCKS/CLUSTER
|
||
MOVE T1,STRHGH##(P2) ;HIGHEST BLOCK IN STR
|
||
ADDI T1,-1(T3)
|
||
IDIVI T1,(T3)
|
||
HLRZ P1,T1 ;DIVIDE BY 2**18
|
||
ADDI P1,1 ;AND ROUND UP
|
||
IMUL P1,T3 ;COMPUTE # BLOCKS PER SUPER CLUSTER
|
||
HLRZ T1,STRBSC##(P2) ;GET CURRENT # BLOCKS PER SUPER CLUSTER
|
||
CAME T1,P1 ;NEW SAME AS OLD?
|
||
PUSHJ P,REFCHS ;NO
|
||
HRLM P1,STRBSC##(P2) ;STORE IT
|
||
MOVE T2,STRBPU##(P2) ;GET # BLOCKS PER UNIT
|
||
SUBI T2,1
|
||
IDIV T2,P1 ;DIVIDE BY # BLOCKS PER SUPER CLUSTER
|
||
ADDI T2,1
|
||
MOVE P1,T2 ;GET NEW VALUE INTO A KOSHER AC FOR 'TRFCHG'
|
||
HRRZ T1,STRSCU##(P2) ;GET CURRENT # SUPER CLUSTERS PER UNIT
|
||
CAME T1,P1 ;NEW SAME AS OLD?
|
||
PUSHJ P,REFCHS ;NO
|
||
HRRM P1,STRSCU##(P2) ;STORE # SUPER CLUSTERS PER UNIT
|
||
POPJ P,
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETCFS - CLASS FOR SWAPPING
|
||
|
||
|
||
GETCFS: SETZM ONCTCH## ;DEFEAT PRSCON
|
||
LDB T1,UNYK4S## ;GET K FOR SWAPPING
|
||
JUMPE T1,CPOPJ## ;RETURN IF NOT A SWAPPING UNIT
|
||
MOVEI T1,[ASCIZ / Swapping class/]
|
||
SKIPN CHGFLG## ;CHANGE?
|
||
TDZA T2,T2 ;DEFAULT TO CLASS ZERO
|
||
LDB T2,UNYCFS## ;ELSE USE CURRENT VALUE
|
||
MOVEI T3,0 ;LOW RANGE
|
||
MOVEI T4,1 ;HIGH RANGE
|
||
PUSHJ P,PRSDEC## ;PROMPT AND FETCH ANSWER
|
||
LDB T2,UNYCFS## ;GET OLD VALUE
|
||
DPB T1,UNYCFS## ;STORE NEW VALUE
|
||
CAME T1,T2 ;SAME AS BEFORE?
|
||
PUSHJ P,SETCHG ;NO--MUST REWRITE HOME BLOCKS
|
||
POPJ P, ;RETURN
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETCNP - BITS PER CLUSTER COUNT
|
||
|
||
|
||
GETCNP: SETZM ONCTCH## ;DEFEAT PRSCON
|
||
HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
MOVEI T1,[ASCIZ / *Bits per cluster count/]
|
||
LDB T2,UNYKTP## ;GET KONTROLLER TYPE
|
||
SKIPN CHGFLG## ;CHANGE?
|
||
SKIPA T2,CNPDEF(T2) ;LOAD UP A REASONABLE DEFAULT
|
||
LDB T2,[POINT 6,STYCNP##(P2),11] ;USE CURRENT VALUE
|
||
MOVEI T3,1 ;LOW RANGE
|
||
LDB T4,[POINT 6,STYCLP##(P2),11] ;HIGH RANGE
|
||
MOVNS T4 ;NEGATE
|
||
ADDI T4,^D36 ;ROUND UP
|
||
CAILE T4,LIMCNP## ;MAKE SURE DOESNT EXCEED LIMCMP
|
||
MOVEI T4,LIMCNP## ;KEEP WITHIN BOUNDS
|
||
PUSHJ P,PRSDEC## ;PROMPT AND FETCH ANSWER
|
||
MOVE P1,T1 ;COPY TO UNORTHODOX PLACE
|
||
; PJRST CNPSTO ;GO STORE RESULTS
|
||
CNPSTO: LDB T1,[POINT 6,STYCNP##(P2),11] ;GET OLD VALUE
|
||
CAME P1,T1 ;IF CHANGED,
|
||
PUSHJ P,REFCHS ;STR AND UNITS NEED REFRESHING
|
||
DPB P1,[POINT 6,STYCNP##(P2),11] ;SAVE NEW ONE
|
||
LDB T3,[POINT 6,STYCLP##(P2),11]
|
||
ADD P1,T3
|
||
MOVNS P1
|
||
ADDI P1,^D36
|
||
LDB T1,[POINT 6,STYCKP##(P2),11]
|
||
CAME T1,P1 ;NEW SAME AS OLD?
|
||
PUSHJ P,REFCHS ;NO
|
||
DPB P1,[POINT 6,STYCKP##(P2),11]
|
||
ADD P1,T3
|
||
LDB T1,[POINT 6,STYCNP##(P2),5]
|
||
CAME T1,P1 ;NEW SAME AS OLD?
|
||
PUSHJ P,REFCHS ;NO
|
||
DPB P1,[POINT 6,STYCNP##(P2),5]
|
||
MOVE P1,T3
|
||
LDB T1,[POINT 6,STYCKP##(P2),5]
|
||
CAME T1,P1 ;NEW SAME AS OLD?
|
||
PUSHJ P,REFCHS ;NO
|
||
DPB P1,[POINT 6,STYCKP##(P2),5]
|
||
POPJ P,
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETDSN - DISK-SET NUMBERS
|
||
|
||
|
||
GETDSN: SETZM ONCTCH## ;DEFEAT PRSCON
|
||
HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
MOVEI T1,[ASCIZ / Disk-set (1 - 36,ALL,NONE)/]
|
||
SKIPN CHGFLG## ;CHANGE?
|
||
TDZA T2,T2 ;DEFAULT TO "ALL"
|
||
LDB T2,STYSET## ;USE CURRENT DEFAULT
|
||
SETZ T4, ;CLEAR RESULT
|
||
CAIN T2,0 ;ZERO?
|
||
MOVSI T4,'ALL' ;YES
|
||
CAIN T2,^D37 ;NONE?
|
||
MOVE T4,['NONE '] ;YES
|
||
JUMPN T4,GETDS2 ;SPECIAL NUMBERS?
|
||
GETDS1: IDIVI T2,12 ;DIVIDE BY RADIX
|
||
ADDI T3,'0' ;CONVERT TO SIXBIT
|
||
LSHC T3,-6 ;SAVE RESULTS
|
||
JUMPN T2,GETDS1 ;LOOP FOR MORE
|
||
GETDS2: MOVE T2,T4 ;COPY RESULT
|
||
PUSHJ P,PRSSIX## ;PROMPT AND FETCH ANSWER
|
||
MOVE T3,T1 ;MAKE A COPY
|
||
CAMN T3,['ALL '] ;ALL?
|
||
JRST GETDS4 ;YES
|
||
CAMN T3,['NONE '] ;NONE?
|
||
JRST GETDS5 ;YES
|
||
SETZ T1, ;CLEAR RESULT
|
||
|
||
GETDS3: LSHC T2,6 ;GET A CHARACTER
|
||
ANDI T2,77 ;MASK OUT JUNK
|
||
CAIL T2,'0' ;RANGE
|
||
CAILE T2,'9' ; CHECK
|
||
JRST GETDS7 ;NOT A NUMBER
|
||
IMULI T1,12 ;SHIFT
|
||
ADDI T1,-'0'(T2) ;ADD IN RESULTS
|
||
JUMPN T3,GETDS3 ;LOOP FOR MORE
|
||
CAIL T1,0 ;RANGE
|
||
CAILE T1,^D36 ; CHECK
|
||
JRST GETDS7 ;NO GOOD
|
||
JRST GETDS6 ;GO STORE RESULTS
|
||
|
||
GETDS4: TDZA T1,T1 ;ALL = 0
|
||
GETDS5: MOVEI T1,^D37 ;NONE = 37
|
||
GETDS6: LDB T2,STYSET## ;GET OLD VALUE
|
||
DPB T1,STYSET## ;STORE NEW VALUE
|
||
CAME T1,T2 ;SAME AS BEFORE?
|
||
PUSHJ P,CHGSTX ;REMEMBER FOR LATER
|
||
POPJ P, ;RETURN
|
||
|
||
GETDS7: MOVEI T1,[ASCIZ /% Bad response, try again/]
|
||
PUSHJ P,CONOUT## ;PRINT THE MESSAGE
|
||
JRST GETDSN ;LOOP BACK
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETGAR - GUARANTEED BLOCKS
|
||
|
||
|
||
GETGAR: POPJ P, ;UNIMPLEMENTED
|
||
SETZM ONCTCH## ;DEFEAT PRSCON
|
||
HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
MOVEI T1,[ASCIZ / Sum of blocks guaranteed to users/]
|
||
LDB T2,UNYKTP## ;GET KONTROLLER TYPE
|
||
SKIPN CHGFLG## ;CHANGE?
|
||
SKIPA T2,GARDEF(T2) ;LOAD UP A REASONABLE DEFAULT
|
||
MOVE T2,STRGAR##(P2) ;GET CURRENT VALUE
|
||
MOVEI T3,0 ;LOW RANGE
|
||
MOVE T4,STRSIZ##(P2) ;HIGH RANGE
|
||
PUSHJ P,PRSDEC## ;PROMPT AND FETCH ANSWER
|
||
MOVE T2,STRGAR##(P2) ;GET OLD VALUE
|
||
MOVEM T1,STRGAR##(P2) ;STORE NEW VALUE
|
||
CAME T1,T2 ;SAME AS BEFORE?
|
||
PUSHJ P,CHGSTX ;REMEMBER FOR LATER
|
||
POPJ P, ;RETURN
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETGRP - BLOCKS TO ALLOCATION ON OUTPUT
|
||
|
||
|
||
GETGRP: SETZM ONCTCH## ;DEFEAT PRSCON
|
||
HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
MOVEI T1,[ASCIZ / Consecutive blocks tried for on output/]
|
||
LDB T2,UNYKTP## ;GET KONTROLLER TYPE
|
||
SKIPN CHGFLG## ;CHANGE?
|
||
SKIPA T2,GRPDEF(T2) ;LOAD UP A REASONABLE DEFAULT
|
||
HLRZ T2,UNIGRP(U) ;USE CURRENT VALUE
|
||
MOVEI T3,0 ;LOW RANGE
|
||
MOVEI T4,-1 ;HIGH RANGE
|
||
PUSHJ P,PRSDEC## ;PROMPT AND FETCH ANSWER
|
||
SETZ T3, ;CLEAR FLAG
|
||
|
||
GETGR1: HLRZ T2,UNIGRP(U) ;GET OLD VALUE
|
||
HRLM T1,UNIGRP(U) ;STORE NEW VALUE
|
||
CAME T1,T2 ;SAME AS BEFORE?
|
||
AOS T3 ;NO
|
||
HLRZ U,UNISTR(U) ;GET NEXT UNIT DATA BLOCK ADR. IN THIS STR
|
||
JUMPN U,GETGR1 ;STORE VALUE IN IT
|
||
SKIPE T3 ;DID ANYTHING CHANGE?
|
||
PUSHJ P,CHGSTX ;YES
|
||
POPJ P, ;RETURN
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETK4C - K FOR CRASH.SAV
|
||
|
||
|
||
GETK4C: SETZM ONCTCH## ;DEFEAT PRSCON
|
||
HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
MOVEI T1,[ASCIZ / *Number of K for CRASH.EXE/]
|
||
LDB T2,UNYKTP## ;GET KONTROLLER TYPE
|
||
SKIPN CHGFLG## ;CHANGE?
|
||
SKIPA T2,K4CDEF(T2) ;LOAD UP A REASONABLE DEFAULT
|
||
HRRZ T2,STRK4C##(P2) ;USE CURRENT VALUE
|
||
MOVE T3,['KLAD '] ;SPECIAL NAME FOR DEC DIAGNOSTIC PACKS
|
||
SKIPN CHGFLG## ;CHANGE?
|
||
CAME T3,STRNAM##(P2) ;IS THIS A KLAD PACK?
|
||
SKIPA ;LEAVE DEFAULT ALONE
|
||
MOVEI T2,10000 ;CHANGE DEFAULT TO THE MAXIMUM IF DEFINE
|
||
SKIPGE T2 ;MINUS ONE?
|
||
MOVEI T2,M.NKC## ;THEN USE DEFAULT FROM MONGEN
|
||
MOVEI T3,0 ;LOW RANGE
|
||
MOVEI T4,10000 ;HIGH RANGE
|
||
PUSHJ P,PRSDEC## ;PROMPT AND FETCH ANSWER
|
||
MOVE P1,T1 ;COPY TO UNORTHODOX PLACE
|
||
HRRZ T1,STRK4C##(P2) ;GET CURRENT VALUE
|
||
CAME T1,P1 ;NEW SAME AS OLD?
|
||
PUSHJ P,REFCHS ;STR NEEDS REFRESHING, REWRITE HOME BLOCKS
|
||
HRRM P1,STRK4C##(P2) ;STORE NEW VALUE
|
||
POPJ P, ;DONE
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETK4S - K FOR SWAPPING
|
||
|
||
|
||
GETK4S: SETZM ONCTCH## ;DEFEAT PRSCON
|
||
JUMPN P2,GETK41 ;BRANCH IF UNIT KNOWN TO BE IN STRUCTURE
|
||
MOVEI T3,LB2HOM##+4 ;1ST BLOCK AVAILABLE IF NO STRUCTURE
|
||
JRST GETK44 ;COMPUTE MAX K FOR SWAPPING
|
||
|
||
GETK41: MOVEI T1,LB2HOM##+2 ;LAST BLOCK NOT AVAILABLE FOR SWAP THIS UNIT
|
||
LDB T2,UNYBPC## ;BLOCKS PER CLUSTER
|
||
IDIV T1,T2 ;T1=LAST CLUSTER NOT AVAILABLE
|
||
LDB T3,UNYSPU## ;COUNT 1 CLUSTER FOR EACH SAT ON UNIT
|
||
ADDI T3,1(T1) ;PLUS CLUSTERS FOR HOME STUFF
|
||
LDB T1,UNYLUN## ;LOGICAL UNIT IN STR
|
||
JUMPN T1,GETK42 ;JUMP IF NOT 1ST UNIT IN STR
|
||
ADDI T3,RB1UN## ;+CLUSTERS FOR RIBS ON 1ST UNIT REFRESHER MAKES
|
||
ADDI T3,3 ;ACCOUNT FOR MFD+SYS+SPL
|
||
|
||
GETK42: HRRZ T1,STRUNM##(P2) ;NUMBER OF UNITS IN STR
|
||
LDB T2,UNYLUN## ;LOGICAL UNIT IN STR
|
||
CAIE T1,1(T2) ;SKIP IF THIS IS LAST UNIT IN STR
|
||
JRST GETK43 ;NO
|
||
ADDI T3,RBLUN## ;COUNT RIBS REFRESHER WRITES ON LAST UNIT
|
||
HRRZ T1,STRK4C##(P2) ;K FOR CRASH SAV
|
||
LSH T1,BLKSPK ;CONVERT TO BLOCKS
|
||
ADDI T1,2+4 ;+6 FOR RIBS AND EXE DIRECTORY
|
||
LDB T2,UNYBPC## ;BLOCKS PER CLUSTER
|
||
ADDI T1,-1(T2)
|
||
IDIV T1,T2 ;CLUSTERS FOR CRASH EXE
|
||
ADD T3,T1
|
||
MOVEI T1,2 ;2 BLOCKS FOR SNAP SYS AND RECOV SYS
|
||
LDB T2,UNYBPC##
|
||
ADDI T1,-1(T2)
|
||
IDIV T1,T2 ;CLUSTERS FOR SNAP SYS
|
||
LSH T1,2
|
||
ADD T3,T1
|
||
|
||
GETK43: LDB T2,UNYBPC## ;BLOCKS PER CLUSTER
|
||
IMUL T3,T2 ;T3=1ST BLOCK AVAILABLE FOR SWAPPING
|
||
GETK44: TRZ T3,3 ;ROUND DOWN (MAYBE WE SHOULD ROUND UP?)
|
||
MOVEM T3,TMPSWM ;SAVE MINIMUM BLOCK NUMBER TO SWAP ON
|
||
SOJ T3, ;(T3)=LAST BLOCK NOT AVAILABLE FOR SWAP
|
||
MOVE T1,UNIBPU(U) ;BLOCKS ON UNIT
|
||
SUB T1,T3 ;T1=BLOCKS AVAILABLE FOR SWAPPING
|
||
HRRZ T2,UNICPS(U) ;NOW GET CLUSTERS PER SAT
|
||
LDB T3,UNYBPC## ;AND GET BLOCKS PER CLUSTER
|
||
JUMPE T3,GETK45 ;FORGET IT IF NOT IN A STR
|
||
IMULI T3,-2(T2) ;MULTIPLY TO GET BLOCKS PER SAT - 2 CLUSTERS
|
||
CAMLE T1,T3 ;WILL 1 SAT BLOCK HOLD MORE THAN THIS STR
|
||
MOVE T1,T3 ;NO, CAN'T USE ALL OF STR FOR SWAPPING
|
||
|
||
GETK45: LSH T1,MBKSPK ;CONVERT TO MAX K FOR SWAPPING
|
||
MOVEI T2,1
|
||
LSH T2,LIMK4S##-K2PLSH
|
||
SUBI T2,1 ;MAX THAT FITS IN FIELD
|
||
CAMLE T1,T2
|
||
MOVE T1,T2 ;MIN OF FIELD, BLOCKS AVAILABLE
|
||
MOVE T4,T1 ;HIGH RANGE
|
||
MOVEI T1,[ASCIZ / *K for swapping/]
|
||
LDB T2,UNYKTP## ;GET KONTROLLER TYPE
|
||
SKIPN CHGFLG## ;CHANGE?
|
||
SKIPA T2,K4SDEF(T2) ;LOAD UP A RESONABLE DEFAULT
|
||
LDB T2,UNYK4S## ;USE CURRENT VALUE
|
||
MOVE T3,['KLAD '] ;SPECIAL NAME FOR DEC DIAGNOSTIC PACKS
|
||
SKIPN CHGFLG## ;CHANGE?
|
||
CAME T3,STRNAM##(P2) ;IS THIS A KLAD PACK?
|
||
SKIPA ;LEAVE DEFAULT ALONE
|
||
MOVE T2,[EXP ^D4096*2] ;CHANGE DEFAULT TO REASONABLE NUMBER
|
||
MOVEI T3,0 ;LOW RANGE
|
||
CAMLE T2,T4 ;IF DEFAULT NOT IN RANGE,
|
||
MOVE T2,T4 ;KEEP IT THERE
|
||
PUSHJ P,PRSDEC## ;PROMPT AND FETCH ANSWER
|
||
LSH T1,BLKSPK ;COMPUTE BLOCKS NEEDED FOR SWAPPING
|
||
MOVE T3,UNIBPU(U) ;GET BLOCKS ON UNIT
|
||
SUB T3,T1 ;COMPUTE FIRST BLOCK FOR SWAPPING
|
||
LSH T3,-1 ;DIVIDE BY 2 SO SWAP AREA CENTERED ON DISK
|
||
TRZ T3,3
|
||
CAMGE T3,TMPSWM ;ABOVE MINIMUM BLOCK FOR SWAPPING?
|
||
MOVE T3,TMPSWM ;NO, USE MINIMUM BLOCK INSTEAD
|
||
MOVEM T3,TMPSWB ;SAVE TEMPORARY SWAP BLOCK NUMBER
|
||
LSH T1,MBKSPK ;CONVERT BLOCKS FOR SWAPPING BACK INTO K
|
||
LDB T2,UNYK4S## ;GET OLD VALUE
|
||
CAME T1,T2 ;SAME AS BEFORE?
|
||
PUSHJ P,REFCHU ;NO--MUST REWRITE HOME BLOCKS & REFRESH
|
||
DPB T1,UNYK4S## ;STORE NEW VALUE
|
||
POPJ P, ;RETURN
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETOPP - OWNER PPN
|
||
|
||
|
||
GETOPP: SETZM ONCTCH## ;DEFEAT PRSCON
|
||
HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
MOVEI T1,[ASCIZ / Owner PPN/]
|
||
SKIPE CHGFLG## ;CHANGE?
|
||
SKIPN T2,STRPPN##(P2) ;USE CURRENT VALUE IF CHANGE
|
||
MOVE T2,['NONE '] ;ASSUME NONE FOR DEFINE
|
||
MOVE T3,[-1,,['NONE ']] ;ACCEPT "NONE" IN ANY CASE
|
||
PUSHJ P,PRSPPN## ;PROMPT AND FETCH ANSWER
|
||
MOVE T2,STRPPN##(P2) ;GET CURRENT VALUE
|
||
MOVEM T1,STRPPN##(P2) ;SET/CLEAR PPN
|
||
CAME T1,T2 ;ANY CHANGE?
|
||
PUSHJ P,CHGSTX ;REMEMBER FOR LATER
|
||
POPJ P, ;RETURN
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETOVR - OVERDRAW
|
||
|
||
|
||
GETOVR: SETZM ONCTCH## ;DEFEAT PRSCON
|
||
HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
MOVEI T1,[ASCIZ / Blocks allowed for overdraw per user/]
|
||
LDB T2,UNYKTP## ;GET KONTROLLER TYPE
|
||
SKIPN CHGFLG## ;CHANGE?
|
||
SKIPA T2,OVRDEF(T2) ;LOAD UP A REASONABLE DEFAULT
|
||
MOVM T2,STROVR##(P2) ;USE CURRENT VALUE
|
||
MOVEI T3,0 ;LOW RANGE
|
||
MOVE T4,STRSIZ##(P2) ;HIGH RANGE
|
||
PUSHJ P,PRSDEC## ;PROMPT AND FETCH ANSWER
|
||
MOVM T2,STROVR##(P2) ;GET CURRENT VALUE
|
||
MOVNM T1,STROVR##(P2) ;STORE NEW VALUE
|
||
CAME T1,T2 ;ANY CHANGE?
|
||
PUSHJ P,CHGSTX ;REMEMBER FOR LATER
|
||
POPJ P, ;RETURN
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETPRV - PRIVATE STRUCTURE
|
||
|
||
|
||
GETPRV: HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
MOVEI T1,[ASCIZ / Private structure/]
|
||
SKIPN CHGFLG## ;CHANGE?
|
||
TDZA T2,T2 ;LOAD UP A REASONABLE DEFAULT
|
||
LDB T2,STYPVS## ;USE CURRENT VALUE
|
||
MOVE T2,[EXP <'NO '>,<'YES '>](T2) ;SET DEFAULT TEXT
|
||
PUSHJ P,PRSYNQ## ;GET YES/NO RESPONSE
|
||
LDB T2,STYPVS## ;GET CURRENT SETTING
|
||
DPB T1,STYPVS## ;STORE NEW SETTING
|
||
CAME T1,T2 ;DID IT CHANGE?
|
||
PUSHJ P,CHGSTX ;YES, NOTE THAT
|
||
POPJ P, ;RETURN
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETSDL - SINGLE STRUCTURE SDL
|
||
|
||
|
||
GETSDL: HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
MOVEI T1,[ASCIZ / Make this the only structure in the SDL/]
|
||
MOVSI T2,'NO ' ;DEFAULT ANSWER
|
||
MOVE T3,['KLAD '] ;SPECIAL NAME FOR DEC DIAG DISKS
|
||
CAMN T3,STRNAM##(P2) ;IS THIS A KLAD PACK?
|
||
MOVSI T2,'YES' ;CHANGE THE DEFAULT
|
||
PUSHJ P,PRSYNQ## ;PROMPT AND FETCH ANSWER
|
||
JUMPE T1,CPOPJ## ;RETURN IF HE SAID "NO"
|
||
PUSH P,U ;SAVE U
|
||
PUSH P,P2 ;SAVE P2
|
||
PUSH P,STRSDL##(P2) ;SAVE CURRENT POSITION
|
||
MOVEI P2,SYSSTR##-STRSYS## ;SET PREDESSOR
|
||
|
||
GETSD1: HLRZ P2,STRSYS##(P2) ;LINK TO NEXT STR
|
||
JUMPE P2,GETSD2 ;DONE?
|
||
SKIPL STRSDL##(P2) ;IN THE SDL ALREADY?
|
||
PUSHJ P,CHGSTX ;YES--MARK HOME BLOCKS TO BE REWRITTEN
|
||
SETOM STRSDL##(P2) ;EMPTY THE SDL
|
||
JRST GETSD1 ;LOOP BACK FOR MORE
|
||
|
||
GETSD2: POP P,T1 ;GET OLD POSITION BACK
|
||
POP P,P2 ;RESTORE P2
|
||
POP P,U ;RESTORE U
|
||
SETZM STRSDL##(P2) ;MAKE IT THE FIRST STRUCTURE IN THE SDL
|
||
CAME T1,STRSDL##(P2) ;SAME AS BEFORE?
|
||
PUSHJ P,CHGSTX ;MARK HOME BLOCKS TO BE REWRITTEN
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETSIC - SATS IN CORE
|
||
|
||
|
||
GETSIC: SETZM ONCTCH## ;DEFEAT PRSCON
|
||
MOVEI T1,[ASCIZ / SAT blocks in core/]
|
||
LDB T2,UNYSPU## ;LOAD UP A REASONABLE DEFAULT
|
||
SKIPE CHGFLG## ;CHANGE?
|
||
LDB T2,UNYSIC## ;USE CURRENT VALUE
|
||
MOVEI T3,1 ;LOW RANGE
|
||
LDB T4,UNYSPU## ;HIGH RANGE
|
||
CAIE T2,0 ;SKIP IF NO SATS IN CORE
|
||
CAMLE T2,T4 ;SKIP IF NOT TOO MANY SATS IN CORE
|
||
MOVE T2,T4 ;USE MAX IF NONE OR TOO MANY
|
||
PUSHJ P,PRSDEC## ;PROMPT AND FETCH ANSWER
|
||
LDB T2,UNYSIC## ;GET OLD VALUE
|
||
CAMN T1,T2 ;SAME AS BEFORE?
|
||
POPJ P, ;THEN ALL DONE
|
||
PUSH P,T1 ;SAVE NEW VALUE
|
||
PUSHJ P,DELSAB ;DELETE EXISTING SAB RING AND SPT TABLE
|
||
POP P,T1 ;GET NEW VALUE BACK
|
||
DPB T1,UNYSIC## ;STORE NEW VALUE
|
||
PUSHJ P,CRESAB ;CREATE A NEW SAB RING AND SPT TABLE
|
||
PJRST SETCHG ;NEED TO REWRITE HOME BLOCKS
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETSNM - GET STRUCTURE NAME/STR DB
|
||
|
||
|
||
GETSNM: MOVEI T1,[ASCIZ /Structure to define/]
|
||
SETZ T2, ;NO DEFAULT STRUCTURE NAME
|
||
PUSHJ P,PRSSIX## ;GET A SIXBIT QUANTITY
|
||
JUMPE T1,CPOPJ## ;GIVE UP IF NO RESPONSE
|
||
PUSHJ P,CHKSN0 ;CHECK OUT PROPOSED NAME
|
||
JRST GETSNM ;LET OPR TRY AGAIN
|
||
PUSH P,T1 ;SAVE STR NAME
|
||
PUSHJ P,GETSTR ;CREATE STR DATA BLOCK
|
||
JRST GETSNE ;TOO MANY STRUCTURES
|
||
POP P,T1 ;GET STRUCTURE NAME BACK
|
||
MOVEM T1,STRNAM##(P2) ;SAVE IT
|
||
POPJ P, ;RETURN WITH STR DB SETUP
|
||
|
||
GETSNE: POP P,(P) ;PHASE STACK
|
||
MOVEI T2,[ASCIZ /No room for additional structures/]
|
||
PUSHJ P,SWARN ;WARN OPERATOR
|
||
SETZ T1, ;SAY NO STRUCTURE
|
||
POPJ P, ;AND RETURN
|
||
CHKSNM: PUSHJ P,SAVE4## ;SAVE SOME ACS
|
||
CHKSN0: TRNE T1,7777 ;CHECK THE NAME NOW
|
||
JRST CHKSND ;SINCE FNSTR WILL TRIM IT SILENTLY
|
||
PUSHJ P,FNSTR ;ALREADY EXIST?
|
||
JRST CHKSN1 ;NO
|
||
MOVE T1,STRNAM##(P2) ;GET OFFENDING NAME
|
||
MOVEI T2,[ASCIZ /already exists/]
|
||
PJRST SWARN ;GIVE UP ON HIM
|
||
|
||
CHKSN1: MOVSI T2,-SDVLEN## ;AOBJN POINTER
|
||
CHKSN2: HLLZ T3,SDVTBL##(T2) ;GET AN ERSATZ DEVICE NAME
|
||
CAMN T1,T3 ;MATCH?
|
||
JRST CHKSNA ;CAN'T HAVE THAT
|
||
AOBJN T2,CHKSN2 ;SEARCH TABLE
|
||
HRLI P1,PHONLY## ;FLAG FOR UUOCON TO CHECK
|
||
MOVEI J,1_CTXLSH##!1 ;FOR JCH 1.1
|
||
SKIPE .UONCE## ;UNLESS IN USER MODE,
|
||
PUSHJ P,DEVPHU## ;THEN CALL KROCK ROUTINE
|
||
PUSHJ P,DEVPHY## ;CONFLICT WITH A DDB NAME?
|
||
JRST CPOPJ1## ;SPECIFIED NAME IS OK
|
||
CAIN F,DSKDDB## ;GENERIC DISK NAME?
|
||
JRST CHKSNC ;YES
|
||
JRST CHKSNB ;DDB CONFLICT
|
||
|
||
CHKSNA: MOVEI T2,[ASCIZ /conflicts with ersatz device name/]
|
||
PJRST SWARN
|
||
CHKSNB: MOVEI T2,[ASCIZ /conflicts with DDB name/]
|
||
PJRST SWARN
|
||
CHKSNC: MOVEI T2,[ASCIZ /conflicts with generic disk/]
|
||
PJRST SWARN
|
||
CHKSND: MOVEI T2,[ASCIZ /has more than four characters in name/]
|
||
PJRST SWARN
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETSPU - SATS PER UNIT
|
||
|
||
|
||
GETSPU: SETZM ONCTCH## ;DEFEAT PRSCON
|
||
MOVE T2,UNIBPU(U) ;NUMBER BLOCKS ON UNIT
|
||
LDB T4,UNYBPC## ;AND BLOCKS PER CLUSTER
|
||
IDIV T2,T4 ;COMPUTE LAST CLUSTER ADDRESS ON UNIT
|
||
MOVE T1,T2 ;COPY RESULTS
|
||
IDIVI T2,<MXSADA==^D118>*^D36
|
||
AOS T3,T2 ;LOW RANGE
|
||
IDIVI T1,^D36 ;COMPUTE GREATEST # SATS POSSIBLE ON THIS UNIT
|
||
ADDI T1,1 ;MAX # OF SATS BASED ON USING ONE WORD PER SAT
|
||
MOVEI T4,1 ;ASSUME AT LEAST 1 UNIT PER STR
|
||
SKIPE P2 ;SKIP IF NO STR AFTER ALL
|
||
HRRZ T4,STRUNM##(P2) ;ONE UNIT CHANGE POINTER REQUIRED PER UNIT
|
||
SUBI T4,RIBLEN##-3 ;SUBTRACT THESE PLUS (2 RIBS + EOF)
|
||
MOVNS T4 ;MAX # OF SATS WHICH CAN FIT IN ONE RIB
|
||
CAILE T1,(T4) ;LESS THAN THIS?
|
||
MOVE T1,T4 ;NO--PUT IN AS NEW MAX
|
||
MOVE T4,T1 ;HIGH RANGE
|
||
MOVEI T1,[ASCIZ / *SAT blocks per unit/]
|
||
SKIPN CHGFLG## ;CHANGE?
|
||
SKIPA T2,T3 ;USE LOW RANGE VALUE AS DEFAULT
|
||
LDB T2,UNYSPU## ;GET CURRENT VALUE
|
||
CAMLE T3,T2 ;SKIP IF DEFAULT ISN'T TOO LOW
|
||
MOVE T2,T3 ;IF TOO LOW, MAKE DEFAULT THE MINIMUM
|
||
CAMLE T2,T4 ;SKIP IF DEFAULT ISN'T TOO HIGH
|
||
MOVE T2,T4 ;IF TOO HIGH, MAKE DEFAULT THE MAXIMUM
|
||
PUSHJ P,PRSDEC## ;PROMPT AND FETCH ANSWER
|
||
LDB T2,UNYSPU## ;GET OLD VALUE
|
||
CAMN T1,T2 ;SAME AS BEFORE?
|
||
POPJ P, ;THEN ALL DONE
|
||
PUSH P,T1 ;SAVE NEW VALUE
|
||
PUSHJ P,CKUSTR ;JUST TO BE SURE
|
||
JRST TPOPJ## ;DON'T WORRY ABOUT IT
|
||
PUSHJ P,DELSAB ;DELETE EXISTING SAB RING AND SPT TABLE
|
||
POP P,T1 ;GET NEW VALUE BACK
|
||
DPB T1,UNYSPU## ;STORE NEW VALUE
|
||
PUSHJ P,CRESAB ;CREATE A NEW SAB RING AND SPT TABLE
|
||
PJRST REFCHU ;MUST REWRITE HOME BLOCKS & REFRESH
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETSSL - SINGLE STRUCTURE SSL
|
||
|
||
|
||
GETSSL: HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
MOVEI T1,[ASCIZ / Make this the only structure in the SSL/]
|
||
MOVSI T2,'NO ' ;DEFAULT ANSWER
|
||
MOVE T3,['KLAD '] ;SPECIAL NAME FOR DEC DIAG DISKS
|
||
CAMN T3,STRNAM##(P2) ;IS THIS A KLAD PACK?
|
||
MOVSI T2,'YES' ;CHANGE THE DEFAULT
|
||
PUSHJ P,PRSYNQ## ;PROMPT AND FETCH ANSWER
|
||
JUMPE T1,CPOPJ## ;RETURN IF HE SAID "NO"
|
||
PUSH P,U ;SAVE U
|
||
PUSH P,P2 ;SAVE P2
|
||
PUSH P,STRSRC##(P2) ;SAVE CURRENT POSITION
|
||
MOVEI P2,SYSSTR##-STRSYS## ;SET PREDESSOR
|
||
|
||
GETSS1: HLRZ P2,STRSYS##(P2) ;LINK TO NEXT STR
|
||
JUMPE P2,GETSS2 ;DONE?
|
||
SKIPL STRSRC##(P2) ;IN THE SSL ALREADY?
|
||
PUSHJ P,CHGSTX ;YES--MARK HOME BLOCKS TO BE REWRITTEN
|
||
SETOM STRSRC##(P2) ;EMPTY THE SSL
|
||
JRST GETSS1 ;LOOP BACK FOR MORE
|
||
|
||
GETSS2: POP P,T1 ;GET OLD POSITION BACK
|
||
POP P,P2 ;RESTORE P2
|
||
POP P,U ;RESTORE U
|
||
SETZM STRSRC##(P2) ;MAKE IT THE FIRST STRUCTURE IN THE SSL
|
||
CAME T1,STRSRC##(P2) ;SAME AS NEW POSITION?
|
||
PUSHJ P,CHGSTX ;MARK HOME BLOCK TO BE REWRITTEN
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETSTN - STRUCTURE NAME
|
||
|
||
|
||
GETSTN: SETZM ONCTCH## ;DEFEAT PRSCON
|
||
HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
MOVEI T1,[ASCIZ / Structure name/]
|
||
MOVE T2,STRNAM##(P2) ;GET OLD NAME FOR DEFAULT
|
||
PUSHJ P,PRSSIX## ;PROMPT AND FETCH ANSWER
|
||
CAMN T1,STRNAM##(P2) ;SAME AS BEFORE?
|
||
POPJ P, ;ALL DONE
|
||
PUSHJ P,CHKSNM ;VALIDATE PROPOSED NEW NAME
|
||
JRST GETSTN ;NO GOOD, TRY AGAIN
|
||
MOVEM T1,STRNAM##(P2) ;UPDATE POSSIBLY NEW NAME
|
||
MOVE T1,[PUSHJ P,GETSTX] ;SET UP CALL TO STOUNI
|
||
PJRST STOUNI ;LOOP THROUGH ALL UNITS IN STRUCTURE
|
||
|
||
;HELPER ROUTINE EXECUTED FROM STOUNI TO MARK HOME BLOCKS NEED TO BE
|
||
;REWRITTEN AND TO UPDATE UNILOG FOR ALL UNITS IN THE STRUCTURE.
|
||
|
||
GETSTX: LDB T1,UNYLUN## ;GET LOGICAL UNIT NUMBER OF THIS UNIT
|
||
PUSHJ P,CMPLOG ;COMPUTE AND STORE UNILOG
|
||
PJRST SETCHG ;MARK THIS UNIT NEEDS HOME BLOCKS REWRITTEN
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETSWB - FIRST SWAPPING BLOCK NUMBER
|
||
|
||
|
||
GETSWB: SETZM ONCTCH## ;DEFEAT PRSCON
|
||
LDB T1,UNYK4S## ;GET K FOR SWAPPING
|
||
JUMPE T1,CPOPJ## ;RETURN IF NOT A SWAPPING UNIT
|
||
LDB T4,UNYK4S## ;GET # K FOR SWAPPING
|
||
LSH T4,BLKSPK ;COMPUTE # BLOCKS FOR SWAPPING ON UNIT
|
||
MOVE T2,UNIBPU(U) ;GET # BLOCKS ON UNIT
|
||
SUB T2,T4 ;COMPUTE HIGHEST 1ST. LOG. BLOCK # POSSIBLE
|
||
HRRZ T1,UNICPS(U) ;GET CLUSTERS/SAT
|
||
LDB T3,UNYSPU## ;GET SATS/UNIT
|
||
SUBI T3,1 ;MINUS 1
|
||
IMUL T1,T3 ;COMPUTE CLUSTERS IN ALL BUT LAST SAT
|
||
LDB T3,UNYBPC## ;GET BLOCKS/CLUSTER
|
||
IMUL T1,T3 ;COMPUTE BLOCKS IN ALL BUT LAST SAT
|
||
ADD T1,T4 ;ADD IN BLOCKS FOR SWAPPING ON UNIT
|
||
CAMLE T1,UNIBPU(U) ;GREATER THAN UNIT SIZE?
|
||
SUB T2,T3 ;YES, RESERVE A CLUSTER IN LAST SAT FOR THE SAT
|
||
TRZ T2,3
|
||
PUSH P,T2 ;SAVE HIGHEST LEGAL BLOCK
|
||
MOVE T1,UNISLB(U) ;GET FIRST BLOCK FOR SWAPPING
|
||
CAILE T1,LB2HOM##+1 ;IS IT BETWEEN 0 & SECOND BAT BLOCK?
|
||
JRST GETSW1 ;NO
|
||
MOVE T1,TMPSWB ;GET COMPUTED VALUE
|
||
MOVE T2,UNISLB(U) ;AND PREVIOUS
|
||
CAME T1,T2 ;SEE IF THE SAME AS BEFORE
|
||
PUSHJ P,REFCHU ;NO, SO MUST REFRESH
|
||
MOVEM T1,UNISLB(U) ;SAVE NEW VALUE
|
||
|
||
GETSW1: MOVEI T1,[ASCIZ / *First logical block for swapping/]
|
||
MOVE T2,UNISLB(U) ;GET COMPUTED (OR CURRENT) VALUE
|
||
MOVE T3,TMPSWM ;LOW RANGE
|
||
POP P,T4 ;HIGH RANGE
|
||
PUSHJ P,PRSDEC## ;PROMPT AND FETCH ANSWER
|
||
TRZ T1,3
|
||
MOVE T2,UNISLB(U) ;GET OLD VALUE
|
||
CAME T1,T2 ;SAME AS BEFORE?
|
||
PUSHJ P,REFCHU ;NO--MUST REWRITE HOME BLOCKS & REFRESH
|
||
MOVEM T1,UNISLB(U) ;STORE NEW VALUE
|
||
POPJ P, ;RETURN
|
||
SUBTTL DIALOGUE SUBROUTINES -- GETUID - UNIT ID
|
||
|
||
|
||
GETUID: SETZM ONCTCH## ;DEFEAT PRSCON
|
||
MOVEI T1,[ASCIZ / Unit ID/]
|
||
SKIPN CHGFLG## ;CHANGE?
|
||
SKIPA T2,UNILOG(U) ;DEFAULT UID IS SAME AS LOGICAL UNIT NAME
|
||
MOVE T2,UNIHID(U) ;USE CURRENT VALUE
|
||
PUSHJ P,PRSSIX## ;GET A SIXBIT QUANTITY
|
||
JUMPN T1,GETUI1 ;CONTINUE IF HAVE SOMETHING
|
||
MOVE T1,UDBNAM(U) ;DRIVE NAME
|
||
MOVEI T2,[ASCIZ /requires a name/]
|
||
PUSHJ P,UWARN ;WARN OPERATOR
|
||
JRST GETUID ;TRY AGAIN
|
||
|
||
GETUI1: CAMN T1,UNIHID(U) ;ARE WE LEAVING THIS UNCHANGED?
|
||
POPJ P, ;YES--GET OUT WHILE WE STILL CAN
|
||
HLRZ T2,SYSUNI## ;GET FIRST UDB IN SYSTEM
|
||
GETUI2: CAMN T1,UNIHID(U) ;THIS ONE ALREADY IN USE?
|
||
JRST GETUI3 ;CAN'T HAVE THAT
|
||
HLRZ T2,UNISYS(T2) ;LINK TO NEXT UDB
|
||
JUMPN T2,GETUI2 ;KEEP SEARCHING
|
||
JRST GETUI4 ;NOT A DUPLICATE
|
||
|
||
GETUI3: MOVEI T3,[ASCIZ /Unit id /]
|
||
MOVEI T2,[ASCIZ /already exists/]
|
||
PUSHJ P,XWARN ;WARN OPERATOR
|
||
JRST GETUID ;TRY AGAIN
|
||
|
||
GETUI4: MOVEM T1,UNIHID(U) ;STORE NEW VALUE
|
||
PJRST SETCHG ;MUST REWRITE HOME BLOCKS
|
||
SUBTTL DIALOGUE SUBROUTINES -- TABLES OF STRUCTURE & UNIT DEFAULTS
|
||
|
||
|
||
; MACROS TO BUILD DEFAULT TABLES FOR STRUCTURE AND UNIT DATA BLOCKS.
|
||
; EACH TABLE IS INDEXED BY CONTROLLER TYPE, TAKEN FROM UNYKTP. THE
|
||
; CONTROLLER TYPE CODES ARE:
|
||
; 0=DR, 1=FH, 2=DP, 3=MF, 4=FS, 5=RP, 6=RN, 7=RA
|
||
;
|
||
; CONTROLLER CODES FOR "DR" (FUTURE DRUM ON AN ???? CONTROLLER) AND
|
||
; "MF" (MASS FILE UNIT ON AN MD10 "MOBY DISK" CONTROLLER) WERE NEVER
|
||
; SUPPORTED BY TOPS10, BUT TABLE ENTRIES EXIST BECAUSE THOSE CODES HAD
|
||
; BEEN RESERVED IN ANTICIPATION OF FUTURE HARDWARE.
|
||
;
|
||
; ARGUMENTS TO THE SUDEFS MACRO ARE:
|
||
; KON = CONTROLLER NAME
|
||
; BSA = NUMBER OF BLOCKS FOR SEQUENTIAL OUTPUT
|
||
; BPC = BLOCKS PER CLUSTER
|
||
; GAR = NUMBER OF BLOCKS GUARANTEED
|
||
; OVR = NUMBER OF BLOCKS OVERDRAW
|
||
; K4C = K FOR CRASH.SAV
|
||
; BCC = BITS PER CLUSTER COUNT
|
||
; K4S = K FOR SWAPPING
|
||
; MUS = MAXIMUM NUMBER OF UNITS PER STRUCTURE
|
||
; NSB = NUMBER OF STRUCTURES TO BUILD
|
||
; SSN = STARTING STRUCTURE NAME
|
||
|
||
DEFINE SUDEFS,<
|
||
|
||
RADIX 10
|
||
|
||
; (KON,BSA,BPC,GAR,OVR, K4C ,BCC, K4S ,MUS,NSB,SSN )
|
||
X (DR , 0, 0, 0, 0, 0, 12, 0, 0, 0, )
|
||
X (FH , 10, 1, 0,200, 0, 12, 0, 0, 0, )
|
||
X (DP , 30, 5, 0,500, -1, 12, 0, 32, 1,DSKE)
|
||
X (MF , 30, 10, 0,500, 256, 12, 0, 0, 0, )
|
||
X (FS , 10, 1, 0,100, 0, 12, 200, 32, 1,DSKA)
|
||
X (RP , 30, 10, 0,500, -1, 12, 1000, 16, 3,DSKB)
|
||
X (RN , 30, 50, 0,500, 0, 12, 0, 16, 3,DSKF)
|
||
X (RA , 30, 10, 0,500, 0, 12, 0, 8, 3,DSKI)
|
||
|
||
RADIX 8
|
||
>
|
||
; CONTROLLER NAME
|
||
DEFINE X (KON,BSA,BPC,GAR,OVR, K4C ,BCC, K4S ,MUS,NSB,SSN ),<SIXBIT /KON/>
|
||
KONTBL: SUDEFS
|
||
EXP 0 ;TERMINATE TABLE
|
||
|
||
|
||
; BLOCKS TO TRY FOR ON SEQUENTIAL ALLOCATION
|
||
DEFINE X (KON,BSA,BPC,GAR,OVR, K4C ,BCC, K4S ,MUS,NSB,SSN ),<EXP BSA>
|
||
GRPDEF: SUDEFS
|
||
|
||
|
||
; BLOCKS PER CLUSTER
|
||
DEFINE X (KON,BSA,BPC,GAR,OVR, K4C ,BCC, K4S ,MUS,NSB,SSN ),<EXP BPC>
|
||
BPCDEF: SUDEFS
|
||
|
||
|
||
; BLOCKS GUARANTEED TO ALL USERS
|
||
DEFINE X (KON,BSA,BPC,GAR,OVR, K4C ,BCC, K4S ,MUS,NSB,SSN ),<EXP GAR>
|
||
GARDEF: SUDEFS
|
||
|
||
|
||
; OVERDRAW
|
||
DEFINE X (KON,BSA,BPC,GAR,OVR, K4C ,BCC, K4S ,MUS,NSB,SSN ),<EXP OVR>
|
||
OVRDEF: SUDEFS
|
||
|
||
|
||
; K FOR CRASH.SAV
|
||
DEFINE X (KON,BSA,BPC,GAR,OVR, K4C ,BCC, K4S ,MUS,NSB,SSN ),<EXP K4C>
|
||
K4CDEF: SUDEFS
|
||
|
||
|
||
; BITS FOR CLUSTER COUNT FIELD
|
||
DEFINE X (KON,BSA,BPC,GAR,OVR, K4C ,BCC, K4S ,MUS,NSB,SSN ),<EXP BCC>
|
||
CNPDEF: SUDEFS
|
||
|
||
|
||
; K FOR SWAPPING
|
||
DEFINE X (KON,BSA,BPC,GAR,OVR, K4C ,BCC, K4S ,MUS,NSB,SSN ),<EXP K4S>
|
||
K4SDEF: SUDEFS
|
||
|
||
|
||
; MAXIMUM NUMBER OF UNITS PER STRUCTURE
|
||
DEFINE X (KON,BSA,BPC,GAR,OVR, K4C ,BCC, K4S ,MUS,NSB,SSN ),<EXP MUS>
|
||
MUSDEF: SUDEFS
|
||
|
||
|
||
; STARTING STRUCTURE NAME
|
||
DEFINE X (KON,BSA,BPC,GAR,OVR, K4C ,BCC, K4S ,MUS,NSB,SSN ),<EXP <SIXBIT /SSN/>>
|
||
SSNDEF: SUDEFS
|
||
SUBTTL DIALOGUE SUBROUTINES -- XWARN - GENERATE WARNING MESSAGES
|
||
|
||
|
||
;ROUTINE TO PRINT A WARNING MESSAGE ON THE CTY
|
||
;CALL: MOVE T1, SIXBIT NAME
|
||
; MOVE T2, TEXT STRING ADDRESS
|
||
; PUSHJ P,KWARN ;FOR KONTROLLERS
|
||
; PUSHJ P,SWARN ;FOR STRUCTURES
|
||
; PUSHJ P,UWARN ;FOR UNITS
|
||
; <RETURN>
|
||
|
||
KWARN: MOVEI T3,[ASCIZ /Controller /]
|
||
JRST XWARN ;ENTER COMMON CODE
|
||
|
||
SWARN:: MOVEI T3,[ASCIZ /Structure /]
|
||
JRST XWARN ;ENTER COMMON CODE
|
||
|
||
UWARN: MOVEI T3,[ASCIZ /Unit /]
|
||
; JRST XWARN ;ENTER COMMON CODE
|
||
|
||
XWARN: PUSH P,T2 ;SAVE TEXT
|
||
PUSH P,T1 ;SAVE DEVICE
|
||
PUSH P,T3 ;SAVE PREFIX
|
||
MOVEI T1,[ASCIZ /% /] ;START OF MESSAGE
|
||
PUSHJ P,ICONM## ;PRINT IT
|
||
POP P,T1 ;GET PREFIX BACK
|
||
PUSHJ P,CONMES## ;PRINT IT
|
||
POP P,T2 ;GET DEVICE BACK
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
PUSHJ P,PRSPC## ;SEPARATOR
|
||
POP P,T1 ;GET TEXT BACK
|
||
PUSHJ P,CONMES## ;PRINT IT
|
||
PJRST CRLFOP## ;APPEND A CRLF AND OUTPUT
|
||
SUBTTL DISK READING -- RDDISK - MAIN LOOP
|
||
|
||
|
||
;THIS ROUTINE IS THE FIRST OF THE THREE MAJOR SECTIONS OF THE OPTIONAL
|
||
;DISK DIALOGUE. ITS PURPOSE IS TO READ THE DISKS AND BUILD THE IN-CORE
|
||
;DATA BASE OF STRUCTURES, UNITS, AND SYSTEM LISTS.
|
||
;CALL: PUSHJ P,RDDISK
|
||
; <NON-SKIP> ;SOME ERRORS DETECTED
|
||
; <SKIP> ;DATA BASE BUILT CORRECTLY
|
||
;
|
||
;ON THE ERROR RETURN, WARNINGS HAVE BEE ISSUED TO THE OPERATOR FOR ALL
|
||
;INCONSISTANCIES DETECTED DURING THIS PROCESS. AT THIS POINT, THE CALLER
|
||
;SHOULD DO WHATEVER CLEANUP IS NECESSARY AND RETURN TO THE "STARTUP OPTION"
|
||
;PROMPT. THIS WILL ALLOW THE OPERATOR TO CORRECT THE ERRORS IN QUESTION.
|
||
|
||
RDDISK::PUSHJ P,RDINIT ;RESET FLAGS, RETURN OLD CORE, ETC.
|
||
MOVEI T1,[ASCIZ \
|
||
[Reading HOM blocks]\]
|
||
SKIPE .UONCE## ;IF AN IMPATIENT USER,
|
||
PUSHJ P,CONOUT## ;LET HIM KNOW WE'RE ALIVE
|
||
HLRZ U,SYSUNI## ;GET ADDR OF FIRST UNIT IN SYSTEM
|
||
SETZM ERRHOM ;NO ERRORS READING THS DISK YET
|
||
|
||
RDDIS1: AOS T1,SYSGEN## ;GET A UNIQUE UNIT GENERATION NUMBER
|
||
HRRM T1,UNIGEN(U) ;SET INITIAL VALUE
|
||
MOVE J,UDBKDB(U) ;GET ADDR OF KDB FOR UNIT
|
||
PUSHJ P,TRYKON ;SEE IF KONTROLLER IS ALIVE
|
||
JRST RDDIS7 ;DOWN SO FLAG UNIT AS OFFLINE
|
||
PUSHJ P,TRYUNI ;CHECK OUT UNIT
|
||
JRST RDDIS7 ;OFFLINE OR UNUSABLE FOR SOME REASON
|
||
JRST RDDIS9 ;SKIP THE REST FOR SECONDARY PORTS
|
||
|
||
;CHECK HOME BLOCKS
|
||
RDDIS2: MOVEI T1,UNVPIM ;IF WE READ HOME BLOCKS
|
||
DPB T1,UNYUST## ;A PACK MUST BE MOUNTED
|
||
PUSHJ P,TRYHOM ;TRY READING THE HOME BLOCKS
|
||
JRST RDDIS7 ;CALL IT OFFLINE FOR SOME REASON
|
||
|
||
;CHECK BAT BLOCKS
|
||
RDDIS3: JRST RDDIS8 ;CONTINUE SCAN OF NEXT UNIT
|
||
|
||
;HERE TO FLAG UNIT AS OFFLINE AND NO PACK MOUNTED
|
||
RDDIS7: MOVEI T1,UNVNPM ;SET STATUS TO NO PACK MOUNTED
|
||
DPB T1,UNYUST## ;STORE UNIT STATUS
|
||
MOVSI T1,UNPOFL ;BIT TO TEST
|
||
IORM T1,UNIDES(U) ;MARK UNIT OFFLINE
|
||
SETZB T1,UNILOG(U) ;MAKE SURE NOT IN STR FLAG CLEARED
|
||
DPB T1,UNYSIC## ;MAKE SURE NO SATS IN CORE
|
||
MOVEI T1,O2COD ;IF DEVICE DOES POSITIONS,
|
||
SKIPL KONPOS(J) ; WE'LL GET AN INTERRUPT WHEN IT COMES UP,
|
||
MOVEM T1,UNISTS(U) ; SO MARK IT DOWN FOR NOW
|
||
SETOM UNISUN(U) ;CAN'T BE PART OF THE ASL IF OFFLINE
|
||
SETZM UNISTR(U) ;IN CASE IT WAS UP, <ALT> TYPE
|
||
|
||
RDDIS8: HLRZ U,UNISYS(U) ;GET NEXT UNIT DATA BLOCK
|
||
RDDIS9: JUMPN U,RDDIS1 ;LOOP AROUND AGAIN IF ANY LEFT
|
||
PUSHJ P,TRYQST ;FIND QUEUE STRUCTURE
|
||
SKIPN ERRHOM ;ANY ERRORS?
|
||
AOS (P) ;SKIP TO INDICATE SUCCESSFUL
|
||
POPJ P, ;RETURN
|
||
SUBTTL DISK READING -- GTHOM - READ THE HOME BLOCKS
|
||
|
||
|
||
;ROUTINE TO READ THE HOME BLOCKS INTO CORE FOR A GIVEN UNIT
|
||
;CALL: MOVE U, UDB ADDRESS
|
||
; PUSHJ P,GTHOM
|
||
; <NON-SKIP> ;ERRORS READING HOME BLOCK
|
||
; <SKIP> ;HOME BLOCKS READ INTO CORE
|
||
|
||
GTHOM:: MOVSI P2,'HOM' ;BLOCK NAME
|
||
MOVE P3,[CODHOM##] ;CODE WORD FOR "HOME" BLOCKS
|
||
MOVE P4,UNIHOM(U) ;GET HOME BLOCK NUMBERS
|
||
PUSHJ P,REDRUN ;READ THE HOME BLOCKS
|
||
JRST GTHOM1 ;BOTH BAD
|
||
MOVE T1,HOMOKC##(P1) ;GET K FOR CRASH.SAV
|
||
SKIPN HOMVSY##(P1) ;OLD DISK?
|
||
MOVEM T1,HOMK4C##(P1) ;YES--PUT IN NEW PLACE
|
||
JRST CPOPJ1## ;RETURN
|
||
|
||
GTHOM1: SETZM UNILOG(U) ;IN CASE SECOND TIME THROUGH
|
||
IFN FTDUAL,<
|
||
SKIPE T1,UNI2ND(U) ;ALTERNATE PORT?
|
||
SETZM UNILOG(T1) ;ZAP IT TOO
|
||
> ;END IFN FTDUAL
|
||
POPJ P, ;RETURN INDICATING HOME BLOCKS ARE BAD
|
||
SUBTTL DISK READING -- RDINIT - INITIALIZE DISK READING
|
||
|
||
|
||
;ROUTINE TO ALL FLAGS, RETURN CORE, AND DO GENERAL CLEANUP BEFORE
|
||
;READING DATA OFF THE DISKS.
|
||
;CALL: PUSHJ P,RDINIT
|
||
; <RETURN>
|
||
|
||
RDINIT: HLRZ T1,SYSUNI## ;SEE IF WE FOUND ANY DISK UNITS
|
||
SKIPN T1 ;IF NOT,
|
||
STOPCD .,STOP,NODISK, ;++ NO DISK UNITS CONFIGURED
|
||
SETOM BLURBF ;NO DIALOGUE BLURB SEEN YET
|
||
SETOM PRESSL## ;INIT PRESERVED SSL FLAG
|
||
SETOM PREASL## ;INIT PRESERVED ASL FLAG
|
||
SETOM PRESDL## ;INIT PRESERVED SDL FLAG
|
||
SETZM SYSGEN## ;START UNIGEN'S AFRESH
|
||
SETZM SYSSTR## ;INITIALLY NO FILE STRUCTURES IN SYSTEM
|
||
MOVE T1,STRAOB## ;AOBJN POINTER TO STR DATA BLOCKS
|
||
SETZM TABSTR##(T1) ;CLEAR TABLE ENTRY
|
||
AOBJN T1,.-1 ;ZERO ALL ENTRIES
|
||
|
||
HRRZS SWPUNI## ;INITIALLY NO UNITS IN ASL
|
||
SETZM SWPUN2## ;SO NO SLOW CLASS SWAPPING SPACE YET
|
||
MOVSI T1,MSWPMX## ;AOBJN POINTER TO SWAPPING UNITS
|
||
SETZM SWPTAB##(T1) ;CLEAR TABLE ENTRY
|
||
AOBJN T1,.-1 ;ZERO ALL ENTRIES
|
||
|
||
MOVEI R,.USMBF ;ASSUME ONCE
|
||
SKIPE .UONCE## ;CHECK FLAG
|
||
MOVEI R,TWCMBF## ;TWICE
|
||
MOVEM R,ONCMBF ;ADDRESS OF MONITOR BUFFER TO BE USED
|
||
SKIPE .UONCE## ;USER MODE (TWICE)?
|
||
JRST RDINI1 ;YES
|
||
PUSHJ P,RTNCOR ;RETURN SPACE USED FOR SDBS, SATS, AND SPTS
|
||
CONO PI,PI.ON ;TURN PI SYSTEM ON FOR WAITS
|
||
|
||
RDINI1: PUSH P,F ;SAVE F
|
||
PUSHJ P,GTODDB ;GET ONCE-ONLY DDB ADDRESS
|
||
MOVE T1,F ;COPY IT
|
||
POP P,F ;RESTORE F
|
||
HRRZS SWPDDB##+DEVSER ;CLEAR LINK SO ONCE WONT LOOP
|
||
PUSHJ P,SETDDO## ;CREATE A DDB FOR ONCE ONLY I/O
|
||
STOPCD .,STOP,NMC, ;++NO MORE CORE
|
||
PUSHJ P,GTMNB1 ;GET MONITOR BUFFER FOR READING HOME BLOCKS
|
||
POPJ P, ;RETURN
|
||
SUBTTL DISK READING -- REDRUN - READ & CHECK SPECIAL BLOCKS
|
||
|
||
|
||
;THIS ROUTINE WILL READ AND CHECK SPECIAL (HOME, BAT, & RIB) DISK BLOCKS.
|
||
;CALL: PUSHJ P,REDRUN
|
||
; <NON-SKIP> ;ERRORS ON BOTH BLOCKS
|
||
; <SKIP> ;AT LEAST ONE BLOCK OK
|
||
|
||
REDRUN::PUSHJ P,GTODDB ;GET ONCE-ONLY DDB ADDRESS
|
||
HRRZ P1,@ONCMBF ;GET ADR. OF MONITOR BUFFER FOR DISK BLOCK
|
||
SKIPN P1 ;SKIP IF WE GOT ONE
|
||
STOPCD CPOPJ##,DEBUG,ONCMBM, ;++MONITOR BUFFER MISSING
|
||
ADDI P1,1
|
||
SETZM REDERR ;CLEAR ERROR FLAG
|
||
|
||
REDRU1: SETOM WHICH ;INDICATE READING 1ST. BLOCK
|
||
HLRZ T2,P4 ;GET ITS BLOCK #
|
||
PUSHJ P,REDCHK ;READ BLOCK & CHECK FOR ERRORS
|
||
JRST REDRU2 ;ERROR(S) DETECTED - GO TRY 2ND. BLOCK
|
||
JUMPG T2,CPOPJ1## ;IF 2ND. BLOCK BAD BUT 1ST. OK - SKIP RETURN
|
||
|
||
REDRU2: SETZM WHICH ;INDICATE READING 2ND. BLOCK
|
||
HRRZ T2,P4 ;GET ITS BLOCK #
|
||
PUSHJ P,REDCHK ;READ BLOCK & CHECK FOR ERRORS
|
||
JUMPL T2,CPOPJ## ;ERROR ON 1ST. BLOCK GIVES ERROR RETURN
|
||
JUMPG T2,REDRU1 ;IF 2ND. BAD BUT 1ST. OK, GO TRY 1ST. AGAIN
|
||
JRST CPOPJ1## ;GIVE SKIP RETURN
|
||
;SUBROUTINE TO READ A SPECIAL BLOCK AND CHECK FOR ERRORS
|
||
; ENTER WITH T2 = BLOCK # TO BE READ. F = FILE DATA BLOCK. U = UNIT DATA BLOCK ADR.
|
||
; RETURN T2 & S = 0 IF NO ERRORS. NON SKIP RETURN IF ERROR ON EITHER BLOCK
|
||
; RETURN RH T2 =-1 IF ERROR ON 2ND. BLOCK
|
||
; " LH T2 =-1 " " " 1ST. "
|
||
; & S HAS APPROPRIATE RH ERROR BITS SET
|
||
|
||
REDCHK: PUSHJ P,OMNRED ;READ THE BLOCK
|
||
SKIPA T2,P2 ;ERROR--GET BLOCK NAME
|
||
JRST CONCHK ;NO READ ERRORS - GO MAKE CONSISTANCY CHECKS
|
||
MOVEI T1,[ASCIZ . block hardware read error.]
|
||
PUSHJ P,RDNMSG ;PRINT ERROR MSG. FOR BLOCK TYPE
|
||
TRO S,IODTER ;NOTE DATA ERROR
|
||
JRST TSTCHK ;DON'T PRINT CONSISTENCY ERROR MESSAGE
|
||
CONCHK: TRNN P1,777776 ;SKIP IF WE GOT A BUFFER
|
||
XCT ONCMBM ;COMPLAIN IF MONITOR BUFFER NOT ALLOCATED
|
||
CAMN P2,[SIXBIT /SAT/] ;IS THIS THE SAT.SYS "RIB" BLOCK WE'RE READING?
|
||
CAME P2,RIBNAM##(P1) ;YES - IS THE NAME IN THE "RIB" = 'SAT'?
|
||
CAMN P2,BLKNAM##(P1) ;NO - CHECK BLOCK NAME(THIS ALWAYS FAILS WITH "RIB")
|
||
CAME P3,BLKCOD##(P1) ;OK - CHECK CODE WORD
|
||
SKIPA T2,P2 ;NO CHECK--GET BLOCK NAME
|
||
JRST TSTCHK ;EXIT CHECKING ERRORS ON THE WAY
|
||
MOVEI T1,[ASCIZ . block consistency error.]
|
||
PUSHJ P,RDNMSG ;PRINT ERROR MSG. FOR BLOCK TYPE
|
||
TRO S,IOIMPM ;SET AN ERROR BIT FOR ERROR CHECK
|
||
TSTCHK: MOVE T2,REDERR ;PICK UP ERROR WORD FOR CHECKING BY CALLER
|
||
JUMPE S,CPOPJ1## ;SKIP RETURN IF NO ERRORS
|
||
POPJ P,
|
||
;SUBROUTINE TO PRINT ERROR MESSAGE FOR REDCHK
|
||
;CALL: MOVE T1, SIXBIT BLOCK NAME
|
||
; MOVE T2, TEXT STRING ADDRESS
|
||
; PUSHJ P,RDNMSG
|
||
; <RETURN>
|
||
|
||
RDNMSG: PUSH P,T1 ;SAVE BLOCK NAME
|
||
PUSH P,T2 ;SAVE TEXT ADDRESS
|
||
MOVEI T1,[ASCIZ /% /] ;START OF MESSAGE
|
||
PUSHJ P,ICONM## ;PRINT IT
|
||
MOVE T2,UDBNAM(U) ;GET UNIT NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
PUSHJ P,PRSPC## ;SEPARATOR
|
||
MOVEI T1,[ASCIZ /first /] ;ASSUME ERROR ON FIRST BLOCK
|
||
SKIPE WHICH ;SECOND BLOCK?
|
||
JRST RDNMS1 ;NO
|
||
HLLOS REDERR ;INDICATE ERROR ON SECOND BLOCK
|
||
SKIPA T1,[[ASCIZ /second /]]
|
||
|
||
RDNMS1: HRROS REDERR ;INDICATE ERROR ON FIRST BLOCK
|
||
PUSHJ P,CONMES## ;PRINT TEXT
|
||
POP P,T2 ;GET BLOCK NAME
|
||
CAMN T2,['SAT '] ;IF THIS WAS A "RIB" BLOCK
|
||
MOVSI T2,'RIB' ; TYPE "RIB" INSTEAD OF "SAT"
|
||
PUSHJ P,PRNAME## ;PRINT NAME
|
||
POP P,T1 ;GET TEXT BACK
|
||
PUSHJ P,CONMES## ;PRINT IT
|
||
PJRST CRLFOP## ;APPEND A CRLF AND OUTPUT
|
||
|
||
|
||
WHICH: 0 ;FLAG TO INDICATE FIRST OR SECOND BLOCK READ
|
||
REDERR: 0 ;ERROR WORD FOR REDRUN
|
||
; RH=-1 IF ERROR ON SECOND BLOCK
|
||
; LH " " " " FIRST "
|
||
SUBTTL DISK READING -- TRYHOM - CHECK HOME BLOCKS
|
||
|
||
|
||
;ROUTINE TO READ AND VERIFY THE HOME BLOCKS, AND SET UP THE
|
||
;IN-CORE DATA BASE
|
||
;CALL: PUSHJ P,TRYHOM
|
||
; <NON-SKIP> ;OFFLINE OR UNUSABLE
|
||
; <SKIP> ;HOME BLOCKS OK
|
||
|
||
TRYHOM: PUSHJ P,GTHOM ;GET "HOME" BLOCK INTO CORE
|
||
CAIA ;ERRORS ON BOTH HOME BLOCKS - T2 NON-ZERO
|
||
JRST TRYHO1 ;AT LEAST ONE HOME BLOCK OK
|
||
SETZM HOMSIC##(P1) ;0 SATS IN CORE (FLAG FOR BAD HOME BLOCKS)
|
||
JRST CPOPJ1## ;UNIT OK FOR I/O
|
||
|
||
TRYHO1: PUSH P,T2 ;SAVE FLAG
|
||
PUSHJ P,CHKVSY ;DO WE UNDERSTAND THIS PACK?
|
||
JRST TRYHO2 ;YES
|
||
PUSH P,T1 ;SAVE PACK TYPE
|
||
MOVE T1,UDBNAM(U) ;GET UNIT NAME
|
||
MOVEI T2,[ASCIZ /foreign pack mounted (considered offline)/]
|
||
PUSHJ P,UWARN ;PRINT MESSAGE
|
||
MOVEI T1,[ASCIZ / Type = /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
POP P,T1 ;GET PACK TYPE BACK
|
||
PUSHJ P,CONMES## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
JRST TPOPJ## ;PHASE STACK AND INDICATE OFFLINE
|
||
|
||
TRYHO2: POP P,T2 ;RESTORE HOME BLOCK FLAG
|
||
SKIPE T2 ;EITHER HOME BLOCK BAD?
|
||
PUSHJ P,SETCHG ;YES, MARK TO REWRITE THEM
|
||
LDB T2,UNYKTP## ;GET KONTROLLER TYPE
|
||
CAIE T2,TYPDP ;SKIP IF RP10
|
||
JRST TRYHO3 ;NOT RP10 PROCEED
|
||
LDB T1,UNYUTP## ;GET UNIT TYPE TO MAKE SURE PACK IS
|
||
CAIN T1,2 ; COMPATIBLE, SKIP IF RP03
|
||
CAMN T1,HOMUTP##(P1) ;SINCE RP03 DRIVE CAN READ RP02 PACKS
|
||
JRST TRYHO3 ;PACK WRITTEN BY RP03, PROCEED
|
||
MOVE T1,UDBNAM(U) ;GET UNIT NAME
|
||
MOVEI T2,[ASCIZ /is an RP03 drive but pack written on an RP02/]
|
||
PUSHJ P,UWARN ;PRINT MESSAGE
|
||
POPJ P, ;INDICATE OFFLINE
|
||
|
||
TRYHO3: PUSHJ P,MOVUNI ;MOVE PARAMS FROM HOM BLOCK TO UNIT DATA BLOCK
|
||
MOVEI P2,0 ;SET STR DB ADR. = 0 IN CASE NO STR FOUND
|
||
SKIPN DSKSET## ;DO WE NOTICE DISK SETS?
|
||
JRST TRYHO4 ;NO, BYPASS CHECKS ON SET NUMBER
|
||
LDB T1,HOYSET## ;GET SET NUMBER THIS STRUCTURE BELONGS TO
|
||
JUMPE T1,TRYHO4 ;SPECIAL CASE OF THE "ALL" SET
|
||
MOVE T2,BITTBL##-1(T1) ;GET THE APPROPRIATE BIT
|
||
CAIG T1,^D36 ;IN THE "NO" SET?
|
||
TDNN T2,DSKSET## ;WANT TO MOUNT THIS STRUCTURE AT ONCE TIME?
|
||
SKIPA ;NO, THEN DON'T SET UP SDB
|
||
JRST TRYHO4 ;PROCEED
|
||
MOVE T1,HOMSNM##(P1) ;GET STR NAME FROM HOME BLOCK
|
||
CAMN T1,DDTDSK## ;IF WE WANT THIS DISK FOR DEBUGGING,
|
||
JUMPN T1,TRYHO4 ;IGNORE ITS DISK SET
|
||
MOVSI T1,UNPNMU ;GET THE TEMPORARY BIT
|
||
IORM T1,UNIDES(U) ;SET IN THE UNIT DATA BLOCK
|
||
JRST TRYHO7 ;INDICATE NO STRUCTURE MOUNTED
|
||
|
||
TRYHO4: MOVE T1,HOMSNM##(P1) ;GET STR NAME FROM HOME BLOCK
|
||
JUMPE T1,TRYHO5 ;DON'T LOOK FOR OR CREATE A ZERO STR NAME
|
||
PUSHJ P,FNSTR ;FIND STR(IF IT EXISTS)
|
||
CAIA ;NOT FOUND--MUST CREATE A NEW STR DB
|
||
JRST TRYHO5 ;FOUND
|
||
PUSHJ P,GETSTR ;CREATE STR DATA BLOCK IN UPPER CORE
|
||
JRST TRYHO6 ;ATTEMPT TO CREATE MORE STR'S THAN ALLOWED
|
||
PUSHJ P,MOVSTR ;MOVE PARAMS FROM HOM BLOCK TO STR DATA BLOCK
|
||
|
||
TRYHO5: MOVE P4,UNIBPU(U) ;UNIT SIZE
|
||
CAMLE P4,STRBPU##(P2) ;BIGGEST UNIT IN STR?
|
||
MOVEM P4,STRBPU##(P2) ;YES, SAVE NEW SIZE
|
||
PUSHJ P,LNKSTR ;LINK ALL UNITS IN THIS STR
|
||
PUSHJ P,CRESAB ;CREATE SAB RING AND SPT TABLE
|
||
PUSHJ P,VALMFD ;VALIDATE THE MFD
|
||
JRST CPOPJ1## ;RETURN
|
||
|
||
TRYHO6: SETOM ERRHOM ;INDICATE ERROR READING HOM BLOCKS
|
||
TRYHO7: SETOM UNISUN(U) ;INDICATE UNIT NOT IN ASL
|
||
SETZM UNILOG(U) ;INDICATE UNIT NOT IN AN STR
|
||
JRST CPOPJ1## ;RETURN
|
||
SUBTTL DISK READING -- TRYKON - CHECK KONTROLLER STATUS
|
||
|
||
|
||
;ROUTINE TO SEE IF KONTROLLER IS OFFLINE, ETC.
|
||
;CALL: PUSHJ P,TRYKON
|
||
; <NON-SKIP> ;OFFLINE OR UNUSABLE
|
||
; <SKIP> ;ONLINE AND READY FOR I/O
|
||
|
||
TRYKON: MOVSI T1,KOPDWN ;BIT TO TEST
|
||
TDNE T1,KONDWN(J) ;ALREADY MARKED AS DOWN?
|
||
POPJ P, ;YES
|
||
MOVE J,UDBKDB(U) ;RESET J
|
||
XCTCPU (UNI,CHKKON) ;GET KONTROLLER ON/OFF-LINE STATUS
|
||
JRST TRYKO1 ;DOWN
|
||
JUMPN T1,CPOPJ1## ;KONTROLLER IS OK
|
||
JRST TRYKO2 ;IT'S SET WRONG
|
||
|
||
TRYKO1: MOVE T1,KDBNAM(J) ;GET KONTROLLER NAME
|
||
MOVEI T2,[ASCIZ /is offline/]
|
||
PUSHJ P,KWARN ;PRINT WARNING
|
||
MOVSI T1,KOPDWN ;KONTROLLER DOWN BIT
|
||
IORM T1,KONDWN(J) ;FLAG KONTROLLER AS DOWN
|
||
POPJ P, ;RETURN INDICATING DOWN KONTROLLER
|
||
|
||
TRYKO2: MOVSI T1,KOPWHL ;BIT TO TEST
|
||
TDNE T1,KONUPA(J) ;ALREADY CHECKED WRITE-HEADER-LOCKOUT?
|
||
JRST CPOPJ1## ;YES--NO MORE CHATTER
|
||
MOVE T1,KDBNAM(J) ;GET KONTROLLER NAME
|
||
MOVEI T2,[ASCIZ /write-header-lockout switch allows writing headers/]
|
||
PUSHJ P,KWARN ;PRINT WARNING
|
||
JRST CPOPJ1## ;AND RETURN
|
||
SUBTTL DISK READING -- TRYQST - CHECK QUEUE STRUCTURE
|
||
|
||
|
||
TRYQST: SKIPN T1,QUESTR## ;GET PRESET STR NAME
|
||
JRST TRYQS1 ;NONE SELECTED
|
||
MOVE T2,STRAOB## ;SEE IF IT EXISTS
|
||
CAME T1,@TABSTR##(T2) ;STRNAM IS FIRST WORD
|
||
AOBJN T2,.-1 ;LOOK AT ALL STRS
|
||
JUMPL T2,CPOPJ## ;RETURN IF A MATCH
|
||
|
||
TRYQS1: MOVE T1,TABST0## ;ADR. OF FASTEST FILE STRUCTURE
|
||
MOVE T1,STRNAM##(T1) ;FILE STRUCTURE NAME
|
||
MOVEM T1,QUESTR## ;STORE FOR QUEUEING CUSPS GETTAB UUO
|
||
POPJ P, ;RETURN
|
||
SUBTTL DISK READING -- TRYUNI - CHECK UNIT STATUS
|
||
|
||
|
||
;ROUTINE TO SEE IF UNIT IS OFFLINE, ETC.
|
||
;CALL: PUSHJ P,TRYUNI
|
||
; <NON-SKIP> ;OFFLINE OR UNUSABLE
|
||
; <SKIP> ;ONLINE AND READY FOR I/O
|
||
|
||
TRYUNI: MOVSI T1,UNPOFL ;BIT TO TEST
|
||
TDNE T1,UNIDES(U) ;IS UNIT OFF-LINE OR DOWN?
|
||
POPJ P, ;JUST RETURN
|
||
XCTCPU (UNI,CHKCPY) ;CHECK CAPACITY OF UNIT
|
||
JFCL ;IGNORE ERRORS FOR NOW
|
||
MOVEM T1,UNIBPU(U) ;BLOCKS PER UNIT (REGULAR)
|
||
MOVEM T2,UNIBPM(U) ;BLOCKS PER UNIT INCL. MAINT CYLS
|
||
MOVEM T3,UNIBUC(U) ;BLOCKS PER UNIT IN COMPAT. MODE
|
||
DPB W,UNYBPY## ;BLOCKS PER CYLINDER
|
||
HLRZ T3,W ;BLOCKS PER TRACK
|
||
DPB T3,UNYBPT## ;STORE # OF BLOCKS PER TRACK ON THIS UNIT
|
||
DPB T4,UNYUTP## ;STORE UNIT TYPE #
|
||
|
||
TRYUN1:
|
||
IFN FTDUAL,<
|
||
HRRZ W,UNIALT(U) ;SAVE UNIALT TO CHECK IF THIS IS FIRST UNIT
|
||
PUSHJ P,MATUN## ;ANY OTHER DRIVE WITH SAME SERIAL NUMBER?
|
||
JRST TRYUN2 ;NO
|
||
JUMPE W,TRYUN2 ;IF FIRST UNIT, DON'T NUKE IT, WAIT FOR SECOND
|
||
HLRZ T1,UNISYS(U) ;GET LINK TO NEXT UNIT BEFORE CALLING LN2ND
|
||
PUSH P,T1 ;(CAN'T TRUST UNISYS AFTER UNIT UNLINKED)
|
||
PUSHJ P,LN2ND## ;SETUP UNI2ND & UNLINK ALT PORT FROM UNISYS
|
||
POP P,U ;NEW UNIT TO RESUME WITH
|
||
TLNE T4,KOPNSU!KOPUHE ;NO SUCH UNIT OR UNIT HAD ERRORS?
|
||
POPJ P, ;SAY DRIVE IS UNUSABLE
|
||
JRST CPOPJ1## ;ELSE STOP PROCESSING ON THIS UNIT
|
||
> ;END IFN FTDUAL
|
||
|
||
TRYUN2: TLNE T4,KOPNSU!KOPUHE ;NO SUCH UNIT OR UNIT HAD ERRORS?
|
||
POPJ P, ;SAY DRIVE IS UNUSABLE
|
||
MOVSI T1,UNPHWP ;GET HWP BIT
|
||
ANDCAM T1,UNIDES(U) ;CLEAR IT
|
||
DPB T1,UNYAWL## ;CLEAR SOFTWARE WRITE-LOCKED
|
||
XCTCPU (UNI,CHKWLK) ;SEE IF UNIT IS WRITE ENABLED
|
||
JRST TRYUN3 ;IT IS
|
||
MOVEI T2,[ASCIZ /is hardware write protected/]
|
||
LDB T1,UNYAWL## ;DID SOFTWARE WRITE-LOCK SET?
|
||
SKIPE T1 ; TEST
|
||
MOVEI T2,[ASCIZ /is read-only/] ;CHANGE MESSAGE IF SO
|
||
MOVE T1,UDBNAM(U) ;GET UNIT NAME
|
||
PUSHJ P,UWARN ;PRINT MESSAGE
|
||
MOVSI T1,UNPHWP ;HARDWARE WRITE-PROTECT BIT
|
||
IORM T1,UNIDES(U) ;FLAG UNIT AS WRITE PROTECTED
|
||
|
||
TRYUN3: LDB T1,UNYUST## ;GET CURRENT STATE
|
||
PUSH P,T1 ;SAVE MOMENTARILY
|
||
LDB T1,UNYKTP##
|
||
CAIE T1,TYPRP ;IF THIS IS AN RP04
|
||
JRST TRYUN4 ;NOPE
|
||
MOVEI T1,UNVPIM ;IF WE READ HOME BLOCKS
|
||
DPB T1,UNYUST## ;A PACK MUST BE MOUNTED
|
||
MOVEI T2,0 ;FORMAT ERROR CAN ONLY BE DETECTED
|
||
PUSHJ P,OMNRED ; ON SECTOR 0, SO READ IT
|
||
TRNE S,IODTER ;IODTER = IODERR = 1
|
||
TRNN S,IODERR ; MEANS FORMAT ERROR (PDP-11 PACK)
|
||
JRST TRYUN4 ;ALL IS WELL SO FAR
|
||
MOVE T1,UDBNAM(U) ;GET UNIT NAME
|
||
MOVEI T2,[ASCIZ /contains a PDP-11 pack (considered offline)/]
|
||
PUSHJ P,UWARN ;PRINT MESSAGE
|
||
POP P,T1 ;GET OLD STATE BACK
|
||
DPB T1,UNYUST## ;RESET IT
|
||
POPJ P, ;INDICATE OFFLINE
|
||
|
||
TRYUN4: POP P,T1 ;GET OLD STATE BACK
|
||
DPB T1,UNYUST## ;RESET IT
|
||
JRST CPOPJ2## ;UNIT IS READY FOR I/O
|
||
SUBTTL DISK-SET PROCESSING -- CHGSET - CHANGE
|
||
|
||
|
||
CHGSET::PUSHJ P,SAVE1## ;SAVE P1
|
||
SETZ P1, ;GET A ZERO INITIALLY (ALL SETS)
|
||
MOVEI T1,SETTXT ;PROMPT STRING
|
||
PUSHJ P,ICONM## ;START THE MESSAGE
|
||
PUSHJ P,OPOUT## ;PUSH OUTPUT OUT
|
||
|
||
CHGSE1: PUSHJ P,GETLIN## ;GET OPERATOR'S RESPONSE
|
||
JRST CHGSE3 ;DONE
|
||
PUSHJ P,DECIN## ;READ RESPONSE
|
||
JRST CHGSE4 ;BAD RESPONSE
|
||
JRST CHGSE2 ;NOT DECIMAL
|
||
CAIL T2,^D1 ;IN RANGE OF 1
|
||
CAILE T2,^D36 ; TO 36?
|
||
JRST CHGSE4 ;NO
|
||
IOR P1,BITTBL##-1(T2) ;INCLUDE BIT FOR THIS SET NUMBER
|
||
JRST CHGSE1 ;ASK AGAIN
|
||
|
||
CHGSE2: PUSHJ P,CTEXT1## ;TRY FOR A KEYWORD
|
||
CAME T2,['ALL '] ;MOUNT ALL DISK-SETS?
|
||
JRST CHGSE4 ;BAD RESPONSE
|
||
MOVEI P1,0 ;ZERO MEANS ALL
|
||
|
||
CHGSE3: EXCH P1,DSKSET## ;STORE NEW VALUE, SAVE OLD
|
||
CAME P1,DSKSET## ;IF CHANGED,
|
||
JRST CHGSE5 ;GO EVALUATE THE SAFETY OF THIS
|
||
JRST CPOPJ1## ;RETURN
|
||
|
||
CHGSE4: MOVEI T1,[ASCIZ /% Bad response, try again/]
|
||
PUSHJ P,CONOUT## ;PRINT THE MESSAGE
|
||
JRST CHGSE1 ;ASK AGAIN
|
||
|
||
CHGSE5: SETZ T1, ;WE WANT THE FIRST ONE
|
||
PUSHJ P,RFIND ;SEE IF ANY STR NEEDS REFRESHING
|
||
TRNA ;NO--LOOK FOR CHANGE-FLAGGED UNITS
|
||
JRST CHGSE6 ;YES--GO MAKE SURE
|
||
PUSHJ P,CHKCHG ;SEE IF NEED TO REWRITE ANY HOM BLOCKS
|
||
JRST CHGSE8 ;NO--BUT WE NEED TO RE-READ THEM
|
||
|
||
CHGSE6: MOVEI T1,[ASCIZ /HOM blocks need re-writing./]
|
||
PUSHJ P,CONOUT## ;TYPE A MESSAGE
|
||
MOVEI T1,[ASCIZ /Re-write HOM blocks/]
|
||
MOVSI T2,'YES' ;DEFAULT TO KEEP CURRENT CHANGES
|
||
PUSHJ P,PRSYNQ## ;SEE WHAT THE OPERATOR WANTS
|
||
JUMPE T1,CHGSE8 ;HE'S A BRAVE FOOL
|
||
PUSHJ P,VFCORE ;CHECK WHAT WE HAVE NOW
|
||
SKIPE IGNORE## ;ERRORS--SEE IF WE CARE
|
||
JRST CHGSE7 ;IT'S OK--GO REWRITE THE HOM BLOCKS
|
||
MOVEI T1,[ASCIZ /Proceed despite errors/]
|
||
MOVSI T2,'NO ' ;GIVE IT A GO
|
||
PUSHJ P,PRSYNQ## ;ANOTHER CHANCE AT SANITY
|
||
JUMPN T1,CHGSE7 ;THIS ONE'S CRAZY, TOO
|
||
MOVEM P1,DSKSET## ;PUT THE DISK SET BACK
|
||
MOVEI T1,[ASCIZ /% Disk set change aborted/]
|
||
PUSHJ P,CONOUT## ;LET HIM KNOW
|
||
JRST CPOPJ1## ;RETURN HAPPY
|
||
|
||
CHGSE7: PUSHJ P,GOHOME ;RE-WRITE ALL HOM BLOCKS
|
||
|
||
CHGSE8: MOVEI T1,[ASCIZ /[Re-reading HOM blocks]/]
|
||
SKIPN .UONCE## ;EXEC MODE WON'T NORMALLY SAY THIS
|
||
PUSHJ P,CONOUT## ;BUT WE SHOULD FOR THIS CASE
|
||
SETOM ALTMFL## ;CLAIM THAT ALTMODE WAS TYPED SO WE WILL RE-READ
|
||
PUSHJ P,ALTM## ;MAKE SURE
|
||
JRST CPOPJ1## ;AND SUCCEED
|
||
|
||
SETTXT: ASCIZ /
|
||
Enter the desired disk-set numbers (1 - 36) or "ALL" for all
|
||
disk-sets, one per line. Terminate list with a blank line.
|
||
/
|
||
SUBTTL DISK-SET PROCESSING -- SHWSET - SHOW
|
||
|
||
|
||
SHWSET::PUSHJ P,SAVE3## ;SAVE SOME ACS
|
||
MOVEI T1,[ASCIZ /Disk-sets: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
MOVNI P3,1 ;INIT A FLAG
|
||
MOVE P1,DSKSET## ;GET DISK-SET
|
||
CAME P1,[EXP -1] ;BOZO TYPE IN ALL 36 SETS?
|
||
JUMPN P1,SHWSE1 ;JUMP IF NOT ALL
|
||
MOVSI T2,'ALL' ;ALL DISK-SETS
|
||
PUSHJ P,PRNAME## ;PRINT TEXT
|
||
PJRST CRLFOP## ;END LINE AND RETURN
|
||
|
||
SHWSE1: JFFO P1,.+1 ;FIND FIRST BIT
|
||
ANDCM P1,BITTBL##(P2) ;CLEAR BIT
|
||
AOJE P3,SHWSE2 ;FIRST TIME THROUGH?
|
||
MOVEI T1,[ASCIZ /, /] ;NO
|
||
PUSHJ P,CONMES## ;SEPARATE FROM PREVIOUS
|
||
|
||
SHWSE2: MOVEI T1,1(P2) ;COPY SET NUMBER
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
JUMPN P1,SHWSE1 ;LOOP IF MORE SETS
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
PUSHJ P,CRLFOP## ;AN EXTRA CRLF FOR GOOD MEASURE
|
||
JRST CPOPJ1## ;RETURN
|
||
SUBTTL FILSER CORE INITIALIZATION
|
||
|
||
|
||
FILMEM::MOVE T1,SYSSIZ## ;GET SYSTEM SIZE INTO T1
|
||
ADDI T1,CRWDM1## ;MAKE SURE 4 WORD BLOCKS HAVE BOTTOM 2 BITS = 0
|
||
TRZ T1,CRWDM1##
|
||
MOVEM T1,SYSSIZ## ;FAKE OUT CALLS TO INICOR
|
||
MOVE T1,CORNUM## ;NUMBER OF 4-WORD BLOCKS TO GENERATE
|
||
IMULI T1,CORWDS## ;CONVERT TO WORDS
|
||
PUSHJ P,INICOR## ;ALLOCATE CORE
|
||
HRLZM T2,SYSCOR## ;SAVE STARTING ADDRESS
|
||
MOVE T1,CORNUM## ;GET BLOCK COUNT BACK
|
||
ADDI T2,CORWDS## ;ADVANCE POINTER
|
||
HRLZM T2,CORLNK##-CORWDS##(T2) ;SAVE ADDR OF NEXT BLOCK
|
||
SOJG T1,.-2 ;FINISHED YET?
|
||
SETZM CORLNK##-CORWDS##(T2) ;ZERO LINK TO SIGNAL END OF LIST
|
||
POPJ P, ;RETURN
|
||
SUBTTL SDL PROCESSING -- CHGSDL - CHANGE
|
||
|
||
|
||
CHGSDL::JRST DEFSDL ;SAME AS DEFINE
|
||
SUBTTL SDL PROCESSING -- DEFSDL - DEFINE
|
||
|
||
|
||
DEFSDL::PUSHJ P,SAVE4## ;SAVE AGAINST FNSTR
|
||
PUSH P,U ;SAVE U
|
||
MOVEI T1,SDLTXT ;PROMPT STRING
|
||
MOVE T2,[IFIW SDLVAL] ;ROUTINE TO VALIDATE RESPONSES
|
||
MOVE T3,[-^D36,,SUDTAB] ;AOBJN POINTER TO STORE RESULTS
|
||
PUSHJ P,PRSLST## ;PROMPT AND FETCH ANSWERS
|
||
MOVEI P2,SYSSTR##-STRSYS## ;SET PREDESSOR
|
||
|
||
DEFSD1: HLRZ P2,STRSYS##(P2) ;LINK TO NEXT STR IN SYSTEM
|
||
JUMPE P2,DEFSD2 ;DONE?
|
||
SKIPL STRSDL##(P2) ;NOT IN THE SDL?
|
||
PUSHJ P,CHGSTX ;THEN HOME BLOCKS WILL CHANGE
|
||
SETOM STRSDL##(P2) ;REMOVE FROM THE SDL
|
||
JRST DEFSD1 ;LOOP FOR ALL STRS
|
||
|
||
DEFSD2: MOVE P1,T1 ;GET UPDATED AOBJN POINTER TO TABLE
|
||
PUSH P,[-1] ;INIT POSITION COUNTER
|
||
|
||
DEFSD3: MOVE T1,(P1) ;GET A STRUCTURE NAME
|
||
PUSHJ P,FNSTR ;FIND IT
|
||
JRST DEFSD4 ;CANNOT HAPPEN SINCE NAME WAS VALIDATED
|
||
AOS T2,(P) ;GET NEXT POSITION NUMBER
|
||
MOVEM T2,STRSDL##(P2) ;SET POSITION IN STR DB
|
||
PUSHJ P,CHGSTX ;MARK HOME BLOCKS TO BE REWRITTEN
|
||
DEFSD4: AOBJN P1,DEFSD3 ;LOOP FOR ALL SPECIFIED STRUCTURES
|
||
ADJSP P,-1 ;TOSS JUNK
|
||
SETZM PRESDL## ;AND OTHER JUNK TOO
|
||
POP P,U ;RESTORE U
|
||
PJRST VFCORE ;GO VERIFY INCORE DATA BASE
|
||
SUBTTL SDL PROCESSING -- SHWSDL - SHOW
|
||
|
||
|
||
SHWSDL::PUSHJ P,SAVE3## ;SAVE SOME ACS
|
||
MOVEI T1,[ASCIZ /System dump list: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
MOVNI P1,1 ;INIT A FLAG
|
||
MOVEI P2,SYSSTR##-STRSYS## ;SET PREDESSOR
|
||
MOVEI P3,6 ;SET A COUNTER
|
||
|
||
SHWSD1: HLRZ P2,STRSYS##(P2) ;LINK TO NEXT
|
||
JUMPE P2,SHWSD3 ;DONE?
|
||
SKIPGE STRSDL##(P2) ;STRUCTURE IN SSL?
|
||
JRST SHWSD1 ;NO
|
||
MOVEI T1,[ASCIZ /, /] ;PRINT
|
||
AOSE P1 ;FIRST TIME THROUGH?
|
||
PUSHJ P,CONMES## ; SEPARATOR
|
||
SOJG P3,SHWSD2 ;ROOM ON THE LINE FOR MORE?
|
||
PUSHJ P,CRLFOP## ;END THIS LINE
|
||
MOVEI T1,[ASCIZ / /]
|
||
PUSHJ P,ICONM## ;PRINT BLANKS
|
||
MOVEI P3,6 ;RESET COUNTER
|
||
|
||
SHWSD2: MOVE T2,STRNAM##(P2) ;GET STRUCTURE NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
JRST SHWSD1 ;LOOP FOR MORE
|
||
|
||
SHWSD3: PUSHJ P,CRLFOP## ;END LINE
|
||
PUSHJ P,CRLFOP## ;AN EXTRA CRLF FOR GOOD MEASURE
|
||
JRST CPOPJ1## ;RETURN
|
||
SUBTTL SDL PROCESSING -- MISCELLANEOUS
|
||
|
||
|
||
;VALIDATE AN SDL ENTRY
|
||
SDLVAL: MOVEI T2,[ASCIZ /does not exist/] ;INCASE OF ERROR
|
||
MOVEI T3,SYSSTR##-STRSYS## ;SET PREDESSOR
|
||
SDLVA1: HLRZ T3,STRSYS##(T3) ;LINK TO NEXT STR DB
|
||
JUMPE T3,SWARN ;END OF CHAIN?
|
||
CAME T1,STRNAM##(T3) ;KNOWN STRUCTURE?
|
||
JRST SDLVA1 ;TRY ANOTHER
|
||
SKIPE STRK4C##(T3) ;DOES IT HAVE CRASH SPACE?
|
||
JRST CPOPJ1## ;RETURN GOODNESS
|
||
MOVEI T2,[ASCIZ /has no crash space allocated/]
|
||
PJRST SWARN ;WARN OPERATOR AND RETURN
|
||
|
||
SDLTXT: ASCIZ /
|
||
Enter names of structures to appear in the system dump list, one
|
||
per line. Terminate list with a blank line./
|
||
SUBTTL SSL PROCESSING -- CHGSSL - CHANGE
|
||
|
||
|
||
CHGSSL::JRST DEFSSL ;SAME AS DEFINE
|
||
SUBTTL SSL PROCESSING -- DEFSSL - DEFINE
|
||
|
||
|
||
DEFSSL::PUSHJ P,SAVE4## ;SAVE AGAINST FNSTR
|
||
PUSH P,U ;SAVE U
|
||
MOVEI T1,SSLTXT ;PROMPT STRING
|
||
MOVE T2,[IFIW SSLVAL] ;ROUTINE TO VALIDATE RESPONSES
|
||
MOVE T3,[-.FSMAX,,SUDTAB] ;AOBJN POINTER TO STORE RESULTS
|
||
PUSHJ P,PRSLST## ;PROMPT AND FETCH ANSWERS
|
||
MOVEI P2,SYSSTR##-STRSYS## ;SET PREDESSOR
|
||
|
||
DEFSS1: HLRZ P2,STRSYS##(P2) ;LINK TO NEXT STR IN SYSTEM
|
||
JUMPE P2,DEFSS2 ;DONE?
|
||
SKIPL STRSRC##(P2) ;NOT IN THE SSL?
|
||
PUSHJ P,CHGSTX ;THEN HOME BLOCKS WILL CHANGE
|
||
SETOM STRSRC##(P2) ;REMOVE FROM THE SSL
|
||
JRST DEFSS1 ;LOOP FOR ALL STRS
|
||
|
||
DEFSS2: MOVE P1,T3 ;GET AOBJN POINTER TO LIST OF ANSWERS
|
||
PUSH P,[-1] ;INIT POSITION COUNTER
|
||
|
||
DEFSS3: MOVE T1,(P1) ;GET A STRUCTURE NAME
|
||
PUSHJ P,FNSTR ;FIND IT
|
||
JRST DEFSS4 ;CANNOT HAPPEN SINCE NAME WAS VALIDATED
|
||
AOS T2,(P) ;GET NEXT POSITION NUMBER
|
||
MOVEM T2,STRSRC##(P2) ;SET POSITION IN STR DB
|
||
PUSHJ P,CHGSTX ;MARK HOME BLOCKS TO BE REWRITTEN
|
||
DEFSS4: AOBJN P1,DEFSS3 ;LOOP FOR ALL SPECIFIED STRUCTURES
|
||
ADJSP P,-1 ;TOSS JUNK
|
||
SETZM PRESSL## ;AND OTHER JUNK TOO
|
||
POP P,U ;RESTORE U
|
||
PJRST VFCORE ;GO VERIFY INCORE DATA BASE
|
||
SUBTTL SSL PROCESSING -- DSKSSL - BUILD SSL FROM DISK
|
||
|
||
|
||
DSKSSL: PUSHJ P,SAVE4## ;SAVE SOME ACS
|
||
MOVE T1,[SUDTAB,,SUDTAB+1] ;SET UP BLT
|
||
SETZM SUDTAB ;CLEAR FIRST WORD
|
||
BLT T1,SUDTAB+.FSMAX-1 ;CLEAR OUT TABLE
|
||
SETZB P1,P3 ;INIT STRUCTURE & ERROR COUNTERS
|
||
MOVEI P2,SYSSTR##-STRSYS## ;SET PREDESSOR
|
||
|
||
DSKSS1: HLRZ P2,STRSYS##(P2) ;LINK TO NEXT STR
|
||
JUMPE P2,DSKSS2 ;DONE?
|
||
SKIPGE T1,STRSRC##(P2) ;IS THIS STRUCTURE IN THE SSL?
|
||
JRST DSKSS1 ;NO
|
||
SKIPE SUDTAB(T1) ;ENTRY ALREADY IN USE?
|
||
AOJA P3,DSKSS2 ;ERROR
|
||
MOVE T2,STRNAM##(P2) ;GET STR NAME
|
||
MOVEM T2,SUDTAB(T1) ;STORE IN RESPECTIVE SLOT
|
||
AOJA P1,DSKSS1 ;LOOP THROUGH FOR ALL STRS
|
||
|
||
DSKSS2: JUMPN P3,DSKSS5 ;JUMP IF MULTIPLE LOGICAL UNITS
|
||
MOVSI P3,-.FSMAX ;AOBJN POINTER
|
||
|
||
DSKSS3: SKIPE SUDTAB(P3) ;ENTRY IN USE?
|
||
JRST DSKSS4 ;NO
|
||
MOVEI T1,[ASCIZ /% Missing logical unit /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
HRRZ T1,(P3) ;GET NUMBER
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
MOVEI T1,[ASCIZ / in the system search list/]
|
||
PUSHJ P,CONMES## ;PRINT TEXT
|
||
|
||
DSKSS4: CAIL P1,(P3) ;CHECK ALL ENTRIES YET?
|
||
AOBJN P3,DSKSS3 ;LOOP FOR MORE
|
||
JUMPN P1,CPOPJ## ;NO--RETURN IF FOUND AT LEAST ONE STR
|
||
MOVEI T1,[ASCIZ/% No structures in system search list/]
|
||
PUSHJ P,CONOUT## ;PRINT MESSAGE AND RETURN
|
||
AOS SERIUS ;CALL THIS A SERIOUS ERROR
|
||
POPJ P, ;AND GIVE UP
|
||
|
||
DSKSS5: MOVEI T1,DSKSST ;POINT TO HEADER
|
||
PUSHJ P,CONOUT## ;PRINT MESSAGE
|
||
AOS SERIUS ;CALL THIS A SERIOUS ERROR
|
||
SETZ P1, ;INIT A COUNTER
|
||
MOVEI P2,SYSSTR##-STRSYS## ;SET PREDESSOR
|
||
|
||
DSKSS6: HLRZ P2,STRSYS##(P2) ;LINK TO NEXT STRUCTURE
|
||
JUMPE P2,CPOPJ## ;DONE?
|
||
SKIPGE STRSRC##(P2) ;IN THE SSL?
|
||
JRST DSKSS6 ;NO
|
||
MOVEI T1,[ASCIZ / /]
|
||
PUSHJ P,CONMES## ;SPACE OVER
|
||
MOVE T2,STRNAM##(P2) ;GET STRUCTURE NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
MOVEI T1,[ASCIZ / /]
|
||
PUSHJ P,CONMES## ;SPACE OVER
|
||
MOVE T1,STRSRC##(P2) ;GET POSITION IN THE SSL
|
||
MOVEI T2,^D2 ;COLUMN COUNT
|
||
PUSHJ P,NUMTYP ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
JRST DSKSS6 ;LOOP BACK FOR MORE
|
||
|
||
DSKSST: ASCIZ \
|
||
% System search list errors:
|
||
Structure Position
|
||
--------- --------\
|
||
SUBTTL SSL PROCESSING -- SHWSSL - SHOW
|
||
|
||
|
||
SHWSSL::PUSHJ P,SAVE3## ;SAVE SOME ACS
|
||
MOVE T1,[SUDTAB,,SUDTAB+1] ;SET UP BLT
|
||
SETZM SUDTAB ;CLEAR FIRST WORD
|
||
BLT T1,SUDTAB+.FSMAX-1 ;CLEAR TABLE
|
||
MOVE T1,[POSTAB,,POSTAB+1] ;SET UP BLT
|
||
SETZM POSTAB ;CLEAR FIRST WORD
|
||
BLT T1,POSTAB+.FSMAX-1 ;CLEAR TABLE
|
||
MOVSI P1,-.FSMAX ;AOBJN POINTER
|
||
MOVEI P2,SYSSTR##-STRSYS## ;SET PREDESSOR
|
||
|
||
SHWSS1: HLRZ P2,STRSYS##(P2) ;LINK TO NEXT
|
||
JUMPE P2,SHWSS2 ;DONE?
|
||
SKIPGE T1,STRSRC##(P2) ;STRUCTURE IN SSL?
|
||
JRST SHWSS1 ;NO
|
||
MOVEM T1,POSTAB(P1) ;SAVE POSITION
|
||
MOVE T2,STRNAM##(P2) ;GET STRUCTURE NAME
|
||
MOVEM T2,SUDTAB(P1) ;STORE IN RESPECTIVE SLOT
|
||
AOBJN P1,SHWSS1 ;LOOP FOR MORE
|
||
|
||
SHWSS2: MOVEI T1,SHWSST ;POINT TO HEADER
|
||
PUSHJ P,CONOUT## ;PRINT TEXT
|
||
MOVSI P1,-.FSMAX ;AOBJN POINTER
|
||
|
||
SHWSS3: SKIPN SUDTAB(P1) ;GET A NAME
|
||
JRST SHWSS4 ;EMPTY SLOT
|
||
MOVEI T1,[ASCIZ / /]
|
||
PUSHJ P,ICONM## ;SPACE OVER
|
||
MOVE T2,SUDTAB(P1) ;GET STRUCTURE NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
MOVEI T1,[ASCIZ / /]
|
||
PUSHJ P,CONMES## ;SPACE OVER
|
||
MOVE T1,POSTAB(P1) ;GET POSITION
|
||
MOVEI T2,^D2 ;COLUMN COUNT
|
||
PUSHJ P,NUMTYP ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
SHWSS4: AOBJN P1,SHWSS3 ;LOOP FOR MORE
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
JRST CPOPJ1## ;RETURN
|
||
|
||
SHWSST: ASCIZ \
|
||
System search list:
|
||
Structure Position
|
||
--------- --------\
|
||
SUBTTL SSL PROCESSING -- MISCELLANEOUS
|
||
|
||
|
||
;VALIDATE AN SSL ENTRY
|
||
SSLVAL: MOVEI T2,[ASCIZ /does not exist/] ;INCASE OF ERROR
|
||
MOVEI T3,SYSSTR##-STRSYS## ;SET PREDESSOR
|
||
SSLVA1: HLRZ T3,STRSYS##(T3) ;LINK TO NEXT STR DB
|
||
JUMPE T3,SWARN ;END OF CHAIN?
|
||
CAME T1,STRNAM##(T3) ;KNOWN STRUCTURE?
|
||
JRST SSLVA1 ;TRY ANOTHER
|
||
JRST CPOPJ1## ;RETURN GOODNESS
|
||
|
||
SSLTXT: ASCIZ /
|
||
Enter names of structures to appear in the system search list,
|
||
one per line. Terminate list with a blank line./
|
||
SUBTTL STARTUP OPTION -- COMMON TEXT
|
||
|
||
|
||
INTRO: ASCIZ \
|
||
In the following dialogue, all numbers are decimal unless
|
||
otherwise indicated. Values within parenthesis are options.
|
||
Values within square brackets are defaults which will be
|
||
substituted if RETURN is pressed.\
|
||
|
||
|
||
REFPRM: ASCIZ \
|
||
Any question preceeded with an asterisk indicates changing that
|
||
parameter will require the structure to be refreshed.
|
||
\
|
||
|
||
INIMSG: ASCIZ \
|
||
*** Note ***
|
||
HOME blocks will be initialized immediately after all units in
|
||
the structure have been entered.
|
||
|
||
\
|
||
GETUNM: MOVEI P3,STRUNI##(P2) ;SET PREDESSOR UDB
|
||
SETZ P1,
|
||
|
||
GETUN1: PUSHJ P,PRSSET## ;SET UP SPECIAL BUFFER, .CPTOA, ETC.
|
||
PUSH P,T1 ;SAVE OLD CHARACTER TYPER
|
||
MOVEI T1,[ASCIZ /Disk drive for logical unit /]
|
||
PUSHJ P,CONMES## ;STORE IN BUFFER
|
||
MOVE T1,STRUNM##(P2) ;GET COUNT SO FAR
|
||
PUSHJ P,PRTDI8## ;STORE IN BUFFER
|
||
POP P,.CPTOA## ;RESTORE CHARACTER STICKER
|
||
|
||
GETUN2: MOVEI T1,TXTBUF## ;POINT TO PROMPT STRING
|
||
SETZ T2, ;NO DEFAULT DISK DRIVE
|
||
PUSHJ P,PRSSIX## ;GET A SIXBIT QUANTITY
|
||
SKIPE T2,T1 ;COPY TO A DIFFERENT PLACE
|
||
JRST GETUN3 ;AND GO CHECK IT OUT
|
||
SKIPE STRUNM##(P2) ;ANY UNITS IN THIS STRUCTURE?
|
||
JRST CPOPJ1## ;YES--SO ALL DONE
|
||
MOVE T1,STRNAM##(P2) ;GET STR NAME
|
||
MOVEI T2,[ASCIZ /has no logical units/]
|
||
PUSHJ P,SWARN ;WARN OPERATOR
|
||
POPJ P, ;BUT LET HIM OUT
|
||
|
||
GETUN3: HLRZ U,SYSUNI## ;GET FIRST UNIT DATA BLOCK IN SYSTEM
|
||
GETUN4: CAME T2,UNIHID(U) ;ACCEPT MATCH ON UNIT ID
|
||
CAMN T2,UDBNAM(U) ;MATCH?
|
||
JRST GETUN5 ;YES
|
||
HLRZ U,UNISYS(U) ;GET NEXT UNIT DATA BLOCK ADR. IN SYSTEM
|
||
JUMPN U,GETUN4 ;REPEAT IF THERE IS ONE
|
||
MOVEI T2,[ASCIZ /does not exist/]
|
||
PUSHJ P,UWARN ;WARN OPERATOR
|
||
JRST GETUN2 ;TRY AGAIN
|
||
|
||
GETUN5: PUSHJ P,CKUSTR ;MAKE SURE IT'S NOT PART OF A MOUNTED STRUCTURE
|
||
JRST GETUN2 ;TRY AGAIN IF IT IS
|
||
HRRZ T1,UNISTR(U) ;SEE IF THIS UNIT IS ALREADY IN AN STR
|
||
JUMPE T1,GETUN6 ;T1 = 0 IF IT ISN'T
|
||
MOVE T1,UDBNAM(U) ;GET DRIVE NAME
|
||
MOVEI T2,[ASCIZ /is part of an existing structure/]
|
||
PUSHJ P,UWARN ;ISSUE WARNING TO OPERATOR
|
||
JRST GETUN2 ;AND TRY AGAIN
|
||
|
||
GETUN6: PUSHJ P,INSUN1 ;NO - JUST PUT THIS UNIT INTO THE STR
|
||
JRST GETUN2 ;UNIT ALREADY IN A STRUCTURE
|
||
PUSHJ P,HGHSIZ ;COMPUTE STRHGH & STRSIZ FOR THIS STR
|
||
JRST GETUN1 ;GET THE NEXT UNIT
|
||
;INITIALIZE BAT BLOCKS
|
||
INIBAT: PUSHJ P,SAVE1## ;SAVE P1
|
||
PUSH P,P4 ;SAVE P4
|
||
PUSHJ P,GTODDB ;GET ONCE-ONLY DDB ADDRESS
|
||
PUSHJ P,GTMNB1 ;GET MONITOR BUFFER
|
||
AOS P1,T1 ;SAVE ADDRESS
|
||
HRRZS P1 ;NO JUNK IN LH
|
||
MOVE T1,P1 ;COPY BUFFER ADDRESS
|
||
HRLS T1 ;PUT IN LH TOO
|
||
AOS T1 ;MAKE A BLT POINTER
|
||
SETZM (P1) ;CLEAR FIRST WORD
|
||
BLT T1,BLKSIZ##-1(P1) ;CLEAR ENTIRE BUFFER
|
||
MOVSI T1,'BAT' ;NAME
|
||
MOVEM T1,BLKNAM##(P1)
|
||
MOVEI T1,CODBAT ;UNIQUE CODE
|
||
MOVEM T1,BLKCOD##(P1)
|
||
MOVSI T1,MBRMAX## ;SETUP AOBJN PTR. TO BE STORED IN BLOCK
|
||
HRRI T1,BAFREG## ;ORIGIN OF FIRST BAD REGION
|
||
MOVEM T1,BAFFIR##(P1)
|
||
MOVE J,UDBKDB(U) ;GET KDB ADDRESS
|
||
MOVE T1,KDBDVC(J) ;AND DEVICE CODE FOR THE KONTROLLER
|
||
DPB T1,BAYKDC## ;SAVE IT IN THE BLOCK
|
||
MOVE P4,[LBOBAT##,,LBOBAT##] ;FIRST,,SECOND BAT BLOCK NUMBERS
|
||
ADD P4,UNIHOM(U) ;OFFSET TO BAT BLOCKS
|
||
PUSHJ P,WRTRUN ;WRITE BOTH BAT BLOCKS
|
||
SETZ P1, ;INDICATE FAILURE
|
||
PUSHJ P,GVMNB0 ;RETURN MONITOR BUFFER
|
||
PUSHJ P,GVODDB ;RETURN ONCE DDB
|
||
POP P,P4 ;RESTORE P4
|
||
JUMPE P1,CPOPJ## ;RETURN ON ERRORS
|
||
MOVEI T1,[ASCIZ /[BAT blocks initialized on /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
MOVE T2,UDBNAM(U) ;GET DRIVE NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
MOVEI T1,[ASCIZ /]/] ;END MESSAGE
|
||
PUSHJ P,CONMES## ;PRINT IT
|
||
PJRST CRLFOP## ;END LINE AND RETURN
|
||
;INITIALIZE HOME BLOCKS
|
||
INIHOM: PUSHJ P,SAVE1## ;SAVE P1
|
||
PUSH P,T1 ;SAVE TYPEOUT FLAG
|
||
PUSH P,P4 ;SAVE P4
|
||
PUSHJ P,GTODDB ;GET ONCE-ONLY DDB ADDRESS
|
||
PUSHJ P,GTMNB1 ;GET MONITOR BUFFER
|
||
AOS P1,T1 ;SAVE ADDRESS
|
||
HRRZS P1 ;NO JUNK IN LH
|
||
MOVE T1,P1 ;COPY BUFFER ADDRESS
|
||
HRLS T1 ;PUT IN LH TOO
|
||
AOS T1 ;MAKE A BLT POINTER
|
||
SETZM (P1) ;CLEAR FIRST WORD
|
||
BLT T1,BLKSIZ##-1(P1) ;CLEAR ENTIRE BUFFER
|
||
MOVSI T1,'HOM' ;NAME
|
||
MOVEM T1,BLKNAM##(P1)
|
||
MOVEI T1,CODHOM ;UNIQUE CODE
|
||
MOVEM T1,BLKCOD##(P1)
|
||
MOVE P4,[LBNHOM##,,LB2HOM##] ;FIRST,,SECOND HOME BLOCK NUMBERS
|
||
MOVEM P4,HOMHOM##(P1)
|
||
SETOM HOMSUN##(P1) ;INDICATE UNIT NOT IN ASL
|
||
SETOM HOMSRC##(P1) ;INDICATE STR NOT IN SSL
|
||
SETOM HOMSDL##(P1) ;INDICATE STR NOT IN SDL
|
||
LDB T1,UNYUTP##
|
||
MOVEM T1,HOMUTP##(P1) ;SET RIGHT UNIT IN HOME BLOCK
|
||
PUSHJ P,WRTVID ;SETUP SYSTEM TYPE IN FUNNY FORMAT
|
||
PUSHJ P,WRTRUN ;WRITE BOTH "HOME" BLOCKS
|
||
SETZ P1, ;INDICATE ERRORS
|
||
PUSHJ P,GVMNB0 ;RETURN MONITOR BUFFER
|
||
PUSHJ P,GVODDB ;RETURN ONCE DDB
|
||
POP P,P4 ;RESTORE P4
|
||
JUMPE P1,TPOPJ## ;RETURN ON ERRORS
|
||
POP P,T1 ;GET FLAG BACK
|
||
JUMPE T1,CPOPJ## ;RETURN IF NO TYPEOUT WANTED
|
||
MOVEI T1,[ASCIZ /[HOM blocks initialized on /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
MOVE T2,UDBNAM(U) ;GET DRIVE NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
MOVEI T1,[ASCIZ /]/] ;END MESSAGE
|
||
PUSHJ P,CONMES## ;PRINT IT
|
||
PJRST CRLFOP## ;END LINE AND RETURN
|
||
SUBTTL STARTUP OPTION -- .DESTR - DESTROY
|
||
|
||
|
||
.DESTR::MOVEI T1,[ASCIZ/
|
||
% WARNING: All structures will be refreshed. All disk files
|
||
will be destroyed. All information on currently spinning packs
|
||
will be lost. Do not proceed unless you are positive that you
|
||
want to do this./]
|
||
PUSHJ P,CONOUT## ;PRINT WARNING
|
||
MOVEI T1,[ASCIZ /Proceed/]
|
||
MOVSI T2,'NO ' ;DEFAULT ANSWER
|
||
PUSHJ P,PRSYNQ## ;PROMPT AND FETCH ANSWER
|
||
JUMPE T1,CPOPJ## ;RETURN IF HE SAID "NO"
|
||
HLRZ U,SYSUNI## ;FIRST UNIT IN SYSTEM
|
||
|
||
DESTR1: PUSHJ P,DELSAB ;DELETE SAB RING AND SPT TABLE
|
||
MOVSI T1,UNPOFL!UNPHWP ;BITS WHICH MAKE THIS UNIT USELESS
|
||
TDNE T1,UNIDES(U) ;ANY CHANCE OF USING THIS ONE?
|
||
JRST DESTR2 ;NOPE
|
||
MOVEI T1,0 ;CODE FOR SILENT INITIALIZATION
|
||
PUSHJ P,INIHOM ;INITIALIZE HOME BLOCKS
|
||
MOVEI T1,1 ;CODE FOR MANDATORY INIT OF BAT BLOCKS
|
||
PUSHJ P,GETBAT ;CHECK OUT BAT BLOCKS
|
||
PUSHJ P,INIBAT ;NEED TO INITIALIZE BAT BLOCKS
|
||
MOVSI T1,UNPCHG
|
||
ANDCAM T1,UNIDES(U) ;CLEAR OUT UNPCHG
|
||
DESTR2: HLRZ U,UNISYS(U) ;NEXT UNIT
|
||
JUMPN U,DESTR1 ;UNITS ARE LEFT-GO FOR MORE
|
||
MOVEI T1,[ASCIZ /[HOME blocks initialized on all units]/]
|
||
PUSHJ P,CONOUT## ;PRINT MESSAGE
|
||
PUSHJ P,GTODDB ;GET ONCE-ONLY DDB ADDRESS
|
||
PUSHJ P,GVMNB0 ;GIVE BACK MONITOR BUFFER
|
||
PUSHJ P,RDDISK ;READ THE DISKS AGAIN
|
||
JFCL ;IGNORE ERRORS
|
||
PUSHJ P,REDBAT ;READ BAT BLOCKS ALSO
|
||
PUSHJ P,GTODDB ;GET ONCE-ONLY DDB ADDRESS
|
||
JRST CPOPJ1## ;RETURN
|
||
SUBTTL STARTUP OPTION -- .DISSO - DISOLVE STRUCTURE
|
||
|
||
|
||
.DISSO::MOVEI T1,[ASCIZ /Structure to dissolve/]
|
||
SETZ T2, ;NO DEFAULT STRUCTURE NAME
|
||
PUSHJ P,PRSSIX## ;GET A SIXBIT QUANTITY
|
||
JUMPE T1,VFCORE ;GO VERIFY INCORE DATA BASE IF NO MORE
|
||
PUSHJ P,FNSTR ;ALREADY EXIST?
|
||
SKIPA T2,[[ASCIZ /does not exist/]]
|
||
JRST DISSO1 ;ONWARD
|
||
PUSHJ P,SWARN ;WARN OPERATOR
|
||
JRST .DISSO ;TRY AGAIN
|
||
|
||
DISSO1: MOVEI T1,[ASCIZ /All data will be destroyed. Are you sure/]
|
||
MOVSI T2,'NO ' ;DEFAULT ANSWER
|
||
PUSHJ P,PRSYNQ## ;ASK THE OPERATOR
|
||
JUMPE T1,.DISSO ;QUIT THIS ONE NOW IF "NO"
|
||
HLRZ U,STRUNI##(P2) ;GET FIRST UNIT IN STRUCTURE
|
||
JUMPE U,DISSO2 ;JUST UNLINK STR IF IT HAS NO UNITS
|
||
PUSHJ P,CKUSTR ;SEE IF WE SHOULD ABORT WITH A MOUNTED STR
|
||
JRST .DISSO ;YES--LET HIM TRY WITH ANOTHER
|
||
PUSHJ P,DISSO3 ;GO TAKE CARE OF ALL UNITS IN STR
|
||
|
||
DISSO2: HLL T3,STRSYS##(P2) ;GET NEXT STR DB IN SYSTEM
|
||
HLLM T3,STRSYS##(P3) ;LINK TO PREDESSOR
|
||
SKIPL T1,STRSRC##(P2) ;WAS THIS STR IN SSL?
|
||
PUSHJ P,FIXSSL ;YES, CLOSE UP THE SLOT
|
||
SKIPL T1,STRSDL##(P2) ;WAS THIS STR IN SDL?
|
||
PUSHJ P,FIXSDL ;YES, CLOSE UP THE SLOT
|
||
PUSHJ P,KSTR ;KILL OFF THE STR DB
|
||
JRST .DISSO ;AND LOOP BACK FOR ANOTHER STRUCTURE
|
||
|
||
DISSO3: MOVSI T1,UNPNNA ;USER-MODE TIMESHARED BIT
|
||
ANDCAM T1,UNIDES(U) ;DISSOLVE MEANS IT'S TOO LATE TO BE SORRY
|
||
SETZM UNIHID(U) ;CLEAR OUT LOGICAL UNIT NAME
|
||
SETZB T3,UNILOG(U) ;CLEAR OUT NAME OF LOGICAL UNIT WITHIN STR
|
||
EXCH T3,UNISTR(U) ;CLEAR OUT LINKS TO STR & NEXT UNIT DATA BLOCKS
|
||
HLRZS T3 ;PUT IN A BETTER HALF-WORD
|
||
PUSH P,T3 ;AND SAVE FROM IMPENDING DISASTER
|
||
HRRZS UNIGRP(U) ;CLEAR # CLUSTERS TRIED FOR ON O/P
|
||
PUSHJ P,DELSST ;RETURN SWAPPING SATS
|
||
PUSHJ P,DELSAB ;DELETE SAB RING AND SPT TABLE
|
||
MOVEI T1,0 ;GET A ZERO
|
||
DPB T1,UNYBPC## ;CLEAR # BLOCKS PER CLUSTER
|
||
DPB T1,UNYSPU## ;SET SPU AND SIC TO ZEROES...
|
||
DPB T1,UNYSIC## ;SO GETSPU AND GETSIC WILL RECREATE THE SAB
|
||
;IF THIS UNIT IS PUT INTO A NEW STRUCTURE
|
||
PUSHJ P,SETCHG ;HOME BLOCKS MUST BE REWRITTEN
|
||
POP P,U ;GET NEXT UNIT IN STRUCTURE BACK
|
||
JUMPN U,DISSO3 ;LOOP BACK IF MORE
|
||
POPJ P, ;ELSE RETURN
|
||
SUBTTL STARTUP OPTION -- .REFRE - REFRESH
|
||
|
||
|
||
.REFRE::SETZ T1, ;FIND FIRST STRUCTURE TO REFRESH
|
||
PUSHJ P,RFIND ;...
|
||
JRST REFRE4 ;THERE ARE NONE SO JUST PROMPT
|
||
PUSHJ P,CRLFOP## ;START WITH A CRLF
|
||
MOVEI T1,[ASCIZ /Needs refreshing: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
JRST REFRE2 ;ENTER LOOP
|
||
REFRE1: SKIPN P4,TABSTR##(P3) ;GET A STR DB
|
||
JRST REFRE3 ;NONE HERE
|
||
HLLZ T2,STRREF##(P4) ;NEEDS REFRESHING FLAG
|
||
JUMPE T2,REFRE3 ;NOT THIS ONE
|
||
|
||
REFRE2: MOVEI T1,[ASCIZ /, /] ;SEPARATOR
|
||
CAME P1,STRNAM##(P4) ;THE FIRST STRUCTURE?
|
||
PUSHJ P,CONMES## ;NO--SEPARATE FROM PREVIOUS
|
||
MOVE T2,STRNAM##(P4) ;GET STR NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
|
||
REFRE3: AOBJN P3,REFRE1 ;LOOP FOR ALL STRS
|
||
PUSHJ P,CRLFOP## ;TERMINATE LINE
|
||
|
||
REFRE4: SETZ T1, ;WANT FIRST NEEDING TO BE REFRESHED
|
||
PUSHJ P,RFIND ;LOOK FOR A STR
|
||
SETZ T1, ;NONE NEED REFRESHING
|
||
MOVE T2,T1 ;LOAD UP DEFAULT STRUCTURE NAME
|
||
MOVEI T1,[ASCIZ /Structure to refresh/]
|
||
PUSHJ P,PRSSIX## ;ASK OPERATOR
|
||
JUMPE T1,VFCORE ;GO VERIFY INCORE DATA BASE IF NO MORE
|
||
REFRE5: PUSHJ P,RFIND ;MAKE SURE REQUESTED STR REALLY EXISTS
|
||
SKIPA T2,[[ASCIZ /does not exist/]]
|
||
JRST REFRE6 ;ONWARD
|
||
PUSHJ P,SWARN ;WARN THE OPERATOR
|
||
JRST REFRE4 ;LET THE FOOL TRY AGAIN
|
||
|
||
REFRE6: HLLZ T2,STRREF##(P2) ;IF STR NEEDS REFRESHING
|
||
JUMPN T2,REFRE7 ; DON'T ASK IF HE IS SURE
|
||
MOVEI T1,[ASCIZ /Structure does not need refreshing. Are you sure/]
|
||
MOVSI T2,'NO ' ;DEFAULT ANSWER
|
||
PUSHJ P,PRSYNQ## ;ASK THE OPERATOR
|
||
JUMPE T1,REFRE4 ;CAN'T MAKE UP HIS MIND
|
||
HLRZ U,STRUNI##(P2) ;GET FIRST UNIT IN STRUCTURE
|
||
PUSHJ P,CKUSTR ;MAKE SURE IT'S NOT MOUNTED
|
||
JRST REFRE4 ;LET HIM OUT OF THIS ONE
|
||
SKIPGE STRSDL##(P2) ;STR IN THE SDL?
|
||
SKIPL STRSRC##(P2) ;OR THE SSL?
|
||
SKIPA T1,[[ASCIZ /This is a system structure. Are you positive/]]
|
||
JRST REFRE7 ;NOT IN SYS SEARCH LIST. DO IT
|
||
MOVSI T2,'NO ' ;DEFAULT ANSWER
|
||
PUSHJ P,PRSYNQ## ;ASK THE OPERATOR
|
||
JUMPE T1,REFRE4 ;WIMP
|
||
|
||
REFRE7: PUSHJ P,GTMNB1 ;GET A MONITOR BUFFER
|
||
HLRZ U,STRUNI##(P2) ;GET FIRST UNIT IN STRUCTURE
|
||
|
||
REFR10: MOVSI T1,UNPHWP!UNPOFL ;WRITE-PROTECT OR OFFLINE
|
||
TDNN T1,UNIDES(U) ;CHECK SUCH BADNESS
|
||
JRST REFR11 ;NOT A PROBLEM--KEEP LOOKING
|
||
MOVE T1,UDBNAM(U) ;GET UNIT NAME
|
||
MOVEI T2,[ASCIZ /is off-line or hardware write-protected/]
|
||
PUSHJ P,UWARN ;COMPLAIN ABOUT THE UNIT
|
||
MOVE T1,STRNAM##(P2) ;GET STR NAME
|
||
MOVEI T2,[ASCIZ /cannot be refreshed/]
|
||
PUSHJ P,SWARN ;THEN COMPLAIN ABOUT THE STRUCTURE
|
||
JRST REFRE4 ;TRY FOR ANOTHER
|
||
|
||
REFR11: SKIPN UNISAB(U) ;IF NO SAB CREATED YET,
|
||
PUSHJ P,CRESAB ;DO IT. REFSTR NEEDS IT.
|
||
MOVSI T1,UNPCHG ;THE 'CHANGED' BIT
|
||
TDNN T1,UNIDES(U) ;DID WE CHANGE ANYTHING?
|
||
JRST REFR12 ;NO--NO NEED TO RE-WRITE HOM BLOCKS
|
||
PUSHJ P,HOMWRT ;YES--DO IT
|
||
MOVEI T1,[ASCIZ /[Updated HOM blocks on unit /]
|
||
PUSHJ P,ICONM## ;SAY WHAT WE DID
|
||
MOVE T2,UDBNAM(U) ;GET UNIT NAME
|
||
PUSHJ P,PRNAME## ;SAY TO WHICH UNIT
|
||
PUSHJ P,PRRBKC## ;END BRACKET AND LINE
|
||
PUSHJ P,OPOUT## ;FLUSH THE OUTPUT
|
||
|
||
REFR12: HLRZ U,UNISTR(U) ;GET NEXT UNIT IN STRUCTURE
|
||
JUMPN U,REFR10 ;CHECK ALL UNITS IN THE STRUCTURE
|
||
|
||
PUSHJ P,REFSTR## ;REFRESH STR
|
||
JRST REFR13 ;GO GIVE ERROR MESSAGE
|
||
HLRZ U,STRUNI##(P2) ;GET FIRST UNIT IN STRUCTURE
|
||
PUSH P,P2 ;SAVE STR DB
|
||
PUSH P,[EXP -1] ;INIT A FLAG
|
||
|
||
REFRE8: PUSHJ P,DELSST ;CLEAR OUT SOME POSSIBLY STALE DATA
|
||
PUSHJ P,DELSAB ;IN CASE THE REFRESH WAS FLAWED
|
||
PUSHJ P,GTHOM ;READ THE HOME BLOCKS
|
||
JRST REFRE9 ;CAN'T HAPPEN (WE THINK)
|
||
MOVE P2,-1(P) ;GET STR DB BACK
|
||
AOSN (P) ;FIRST TIME THROUGH?
|
||
PUSHJ P,MOVSTR ;UPDATE STR DB FROM HOME BLOCKS
|
||
PUSHJ P,MOVUNI ;UPDATE CHANGES MADE TO HOME BLOCKS IN UDBS
|
||
PUSHJ P,CRESAB ;RESTORE SAB RING & SPT
|
||
HLRZ U,UNISTR(U) ;LINK TO NEXT UNIT IN STRUCTURE
|
||
JUMPN U,REFRE8 ;LOOP FOR MORE UNITS
|
||
|
||
REFRE9: ADJSP P,-2 ;PHASE STACK
|
||
MOVEI T1,[ASCIZ /[Structure /]
|
||
PUSHJ P,ICONM## ;BEGIN OUR MESSAGE
|
||
MOVE T2,STRNAM##(P2) ;GET STRUCTURE NAME
|
||
PUSHJ P,PRNAME## ;SAY WHICH STRUCTURE
|
||
MOVEI T1,[ASCIZ / refreshed]/]
|
||
PUSHJ P,CONMES## ;SAY WHAT WE DID
|
||
PUSHJ P,CRLFOP## ;FLUSH THE LINE
|
||
JRST REFRE4 ;ASK FOR ANOTHER STR NAME TO BE REFRESHED
|
||
|
||
REFR13: MOVE T1,STRNAM##(P2) ;GET STR NAME
|
||
MOVEI T2,[ASCIZ /could not be refreshed/]
|
||
PUSHJ P,SWARN ;COMPLAIN ABOUT THE PROBLEM
|
||
JRST REFRE4 ;ASK FOR ANOTHER VICTIM
|
||
;FIND A STRUCTURE WHICH NEEDS TO BE REFRESHED
|
||
;CALL: MOVE T1, NAME OR ZERO FOR FIRST STR NEEDING TO BE REFRESHED
|
||
; PUSHJ P,RFIND
|
||
;
|
||
;RETURNS WITH P1 = STR NAME & P2 = STR DATA BLOCK ADDRESS
|
||
|
||
RFIND: MOVE P3,STRAOB## ;AOBJN POINTER TO STRUCTURE TABLE
|
||
SETZB P1,P2 ;NO STR NAME OR STR DATA BLOCK YET
|
||
RFIND1: SKIPN P4,TABSTR##(P3) ;ADDR OF NEXT STR DATA BLOCK
|
||
JRST RFIND5 ;NONE HERE
|
||
JUMPE T1,RFIND2 ;JUMP IF WANT FIRST NEEDING REFRESHING
|
||
CAMN T1,STRNAM##(P4) ;THE ONE WE WANTED?
|
||
JRST RFIND3 ;YES
|
||
RFIND2: HLLZ T2,STRREF##(P4) ;NEEDS REFRESHING FLAG
|
||
JUMPE T2,RFIND5 ;NOT THIS ONE
|
||
JUMPE T1,RFIND3 ;USE THIS STRUCTURE IF FIRST REQUESTED
|
||
CAME T1,STRNAM##(P4) ;THE ONE WE WANTED?
|
||
JRST RFIND5 ;NO
|
||
RFIND3: SKIPN .UONCE## ;USER MODE?
|
||
JRST RFIND4 ;NO--JUST DO REFRESH
|
||
PUSHJ P,UCKREF## ;SEE IF MOUNTED UNDER TIMESHARING
|
||
JRST RFIND5 ;CAN'T REFRESH MOUNTED STRUCTURE
|
||
RFIND4: MOVE P1,STRNAM##(P4) ;SET IT UP
|
||
MOVE P2,P4 ;COPY STR DB ADDRESS
|
||
JRST CPOPJ1## ;RETURN GOODNESS
|
||
RFIND5: AOBJN P3,RFIND1 ;KEEP SEARCHING
|
||
POPJ P, ;NO SUCH STR
|
||
SUBTTL STRUCTURE ROUTINES -- CHGSTR - CHANGE
|
||
|
||
|
||
CHGSTR::AOSE BLURBF ;OPERATOR SEEN THIS TEXT BEFORE?
|
||
JRST CHGST1 ;YES
|
||
PUSHJ P,PRSCON## ;SEE IF WE WANT THIS CRUFT
|
||
JRST CHGST1 ;NO--DON'T CLOBBER THE TYPEAHEAD
|
||
MOVEI T1,INTRO ;INTRODUCTORY TEXT
|
||
PUSHJ P,CONOUT## ;PRINT IT
|
||
MOVEI T1,REFPRM ;SPECIAL PARAMETER DISCLAIMER
|
||
PUSHJ P,CONOUT## ;PRINT IT
|
||
|
||
CHGST1: MOVEI T1,[ASCIZ /Structure to change/]
|
||
SETZ T2, ;NO DEFAULT
|
||
PUSHJ P,PRSSIX## ;PROMPT AND FETCH ANSWER
|
||
JUMPE T1,VFCORE ;GO VERIFY INCORE DATA BASE IF NO MORE
|
||
PUSHJ P,FNSTR ;FIND STRUCTURE
|
||
SKIPA T2,[[ASCIZ /does not exist/]]
|
||
JRST CHGST2 ;FOUND
|
||
PUSHJ P,SWARN ;WARN OPERATOR
|
||
JRST CHGSTR ;AND TRY AGAIN
|
||
|
||
CHGST2: MOVEI T1,[ASCIZ /Change unit parameters for this structure/]
|
||
MOVSI T2,'NO ' ;DEFAULT
|
||
PUSHJ P,PRSYNQ## ;PROMPT AND FETCH ANSWER
|
||
MOVEM T1,UNITFL ;SAVE FLAG
|
||
HLRZ U,STRUNI##(P2) ;GET FIRST UNIT IN STRUCTURE
|
||
PUSHJ P,CKUSTR ;MAKE SURE WE WANT TO PROCEED IF MOUNTED
|
||
JRST CHGSTR ;TRY AGAIN IF NOT
|
||
SKIPN UNITFL ;IF NOT CHANGING UNITS,
|
||
JRST CHGST3 ;THEN DON'T CHANGE BAT BLOCKS
|
||
MOVEI T1,[ASCIZ /Do you want to see the BAT blocks/]
|
||
MOVSI T2,'NO ' ;DEFAULT
|
||
PUSHJ P,PRSYNQ## ;PROMPT AND FETCH ANSWER
|
||
MOVEM T1,BATFLG ;SAVE FOR LATER USE
|
||
|
||
CHGST3: MOVEI T1,[ASCIZ /Parameters for structure /]
|
||
PUSHJ P,ICONM## ;PRINT MESSAGE
|
||
MOVE T2,STRNAM(P2) ;GET STRUCTURE NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
PUSHJ P,GETSTN ;GET NEW NAME
|
||
PUSHJ P,GETBPC ;GET BLOCKS PER CLUSTER
|
||
PUSHJ P,GETPRV ;GET PRIVATE STATUS
|
||
PUSHJ P,GETOPP ;GET OWNER PPN
|
||
PUSHJ P,GETDSN ;GET DISK-SET NUMBERS
|
||
PUSHJ P,GETK4C ;GET K FOR CRASH.SAV
|
||
PUSHJ P,GETOVR ;GET OVERDRAW
|
||
PUSHJ P,GETGAR ;GET GUARANTEED BLOCKS
|
||
PUSHJ P,GETGRP ;GET BLOCKS TO TRY FOR ON OUTPUT
|
||
PUSHJ P,GETCNP ;GET BITS PER CLUSTER COUNT
|
||
|
||
SKIPN UNITFL ;CHANGING UNIT PARAMETERS TOO?
|
||
JRST CHGST6 ;NO
|
||
HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
CHGST4: PUSHJ P,CRLFOP## ;START WITH A BLANK LINE
|
||
MOVEI T1,[ASCIZ /Parameters for unit /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
MOVE T2,UDBNAM(U) ;GET NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
PUSHJ P,GETUID ;GET UNIT ID
|
||
PUSHJ P,GETSPU ;GET SATS PER UNIT
|
||
PUSHJ P,GETSIC ;GET SATS IN CORE
|
||
PUSHJ P,GETK4S ;GET K FOR SWAPPING
|
||
PUSHJ P,GETSWB ;GET FIRST SWAPPING BLOCK NUMBER
|
||
PUSHJ P,GETCFS ;GET CLASS FOR SWAPPING
|
||
SKIPN BATFLG ;DO WE WANT TO SEE THE BAT BLOCKS?
|
||
JRST CHGST5 ;NO--SKIP THIS
|
||
MOVEI T1,0 ;YES--GET FLAG FOR OPTIONAL INIT OF BAD BLOCKS
|
||
PUSHJ P,GETBAT ;CHECK AND DISPLAY THE BAF
|
||
PUSHJ P,INIBAT ;INITIALIZE IF NEEDED
|
||
|
||
CHGST5: HLRZ U,UNISTR(U) ;LINK TO NEXT UNIT IN STRUCTURE
|
||
JUMPN U,CHGST4 ;LOOP IF MORE
|
||
|
||
CHGST6: JRST CHGST1 ;LOOP BACK FOR ANOTHER STRUCTURE
|
||
SUBTTL STRUCTURE ROUTINES -- CHKSTR - MAKE SURE STRS HAVE ALL NEEDED UNITS
|
||
|
||
|
||
CHKSTR: HLRZ P2,SYSSTR## ;GET ADDR OF FIRST STR DATA BLOCK IN SYSTEM
|
||
JUMPE P2,CPOPJ## ;THERE ARE NONE - NON SKIP RETURN
|
||
CHKST1: HRRZ T1,STRUNM##(P2)
|
||
JUMPN T1,CHKST3 ;WAS THE LAST UNIT IN THIS STR FOUND?
|
||
PUSH P,STRREF##(P2) ;SAVE STATE OF 'NEEDS REFRESHING' FLAG
|
||
MOVEI T1,[ASCIZ /
|
||
% Last unit wasn't found in structure /]
|
||
PUSHJ P,MSGSTR ;NO - PRINT MSG. FOLLOWED BY SIXBIT STR NAME
|
||
HLRZ T1,STRUNI##(P2) ;GET ADR. OF 1ST. UNIT DATA BLOCK IN STR
|
||
CHKST2: MOVE U,T1 ;LOAD UP UDB
|
||
HLRZ T1,UNISTR(U) ;GET ADR. OF NEXT UNIT DATA BLOCK IN STR
|
||
JUMPN T1,CHKST2 ;REPEAT UNTIL LAST ONE FOUND
|
||
LDB T1,UNYLUN## ;GET ITS LOG. UNIT # IN STR
|
||
ADDI T1,1 ;MAKE INTO # UNITS IN STR
|
||
HRRM T1,STRUNM##(P2) ; & STORE IT
|
||
POP P,T1 ;RESTORE STATE OF 'NEEDS REFRESHING' FLAG
|
||
HLLM T1,STRREF##(P2) ;(RH OF STRREF IS STRUNM, SET ABOVE)
|
||
CHKST3: HLRZ U,STRUNI##(P2) ;GET ADR. OF 1ST. UNIT DATA BLOCK IN THIS STR
|
||
SETOM P4 ;SETUP FAKE PREVIOUS LOG. UNIT #
|
||
CAIA
|
||
CHKST4: HLLM T2,UNIGRP(U) ;STORE # CLUSTERS TRIED ON O/P IN EACH UNIT
|
||
LDB P1,UNYLUN## ;GET LOG. UNIT # OF THIS UNIT WITHIN STR
|
||
EXCH P1,P4 ;PUT THIS & PREVIOUS LOG. UNITS IN PROPER ACS
|
||
CAME P4,P1 ;ARE LOG. UNIT #'S THE SAME?
|
||
JRST CHKST5 ;NO - CHECK FOR MISSING UNITS
|
||
MOVEI T3,[ASCIZ /
|
||
% Two logical unit /]
|
||
MOVEI T1,[ASCIZ /s found in structure /]
|
||
PUSHJ P,MSGLNG ;PRINT MSGS FOLLOWED BY SIXBIT STR NAME
|
||
JRST CHKST6 ;CHECK NEXT PAIR OF UNITS
|
||
CHKST5: CAIN P4,1(P1) ;IS THIS UNIT 1 GREATER THAN LAST ONE?
|
||
JRST CHKST6 ;YES - CHECK NEXT PAIR OF UNITS
|
||
ADDI P1,1 ;INCREMENT TO GET CORRECT MISSING LOG. UNIT #
|
||
MOVEI T3,[ASCIZ /
|
||
% Logical unit /]
|
||
MOVEI T1,[ASCIZ / missing from structure /]
|
||
PUSHJ P,MSGLNG
|
||
JRST CHKST5 ;REPEAT UNTIL ALL MISSING ARE TYPED OUT
|
||
CHKST6: MOVE T1,UNIBPU(U) ;GET # BLOCKS ON THIS UNIT
|
||
ADDM T1,STRSIZ##(P2) ;ADD TO TOTAL # IN THIS STR
|
||
MOVE T1,STRBPU##(P2) ;GET # OF BLOCKS ON LARGEST UNIT IN STR
|
||
ADDM T1,STRHGH##(P2) ;ADD TO TOTAL LOGICAL # IN THIS STR
|
||
HLL T2,UNIGRP(U) ;GET # OF CONSECUTIVE CLUSTERS TRIED FOR ON O/P
|
||
HLRZ U,UNISTR(U) ;GET ADR. OF NEXT UNIT DATA BLOCK IN STR
|
||
JUMPN U,CHKST4 ;JUMP IF MORE TO DO
|
||
SOS STRHGH##(P2) ;MAKE STRHGH BE HIGHEST LOG. BLOCK # IN STR
|
||
HLRZ P2,STRSYS##(P2) ;GET NEXT STR DATA BLOCK ADR. WITHIN SYSTEM
|
||
JUMPN P2,CHKST1 ;REPEAT IF THERE IS ONE
|
||
POPJ P, ;ELSE RETURN
|
||
SUBTTL STRUCTURE ROUTINES -- CRESAB - CREATE SAB AND SPT TABLE
|
||
|
||
|
||
CRESAB: SE1ENT ;ENTER SECTION ONE
|
||
PUSHJ P,SAVE4## ;SAVE SOME ACS
|
||
CRESA1: LDB P1,UNYSIC## ;GET # SATS TO BE IN CORE FOR THIS UNIT
|
||
JUMPLE P1,CPOPJ## ;DON'T TRY TO SETUP ANYTHING IF 0 OR -VE
|
||
S0PSHJ CMCWPS ;COMPUTE # CLUSTERS & WORDS PER SAT
|
||
LDB P3,UNYWPS## ;GET # WORDS PER SAT
|
||
MOVN P2,P3 ;MAKE -VE
|
||
HRLZS P2 ;SETUP LH. OF PTR. FOR SABSCN
|
||
ADDI P3,SABBIT## ;COMPUTE # WORDS FOR EACH SAB BLOCK
|
||
MOVEI P4,UNISAB-SABRNG##(U) ;GET LINK TO FIRST SAB BLOCK IN RING
|
||
CRESA2: MOVE T2,P3 ;SETUP ARG. FOR CORE GRABBER
|
||
PUSHJ P,CORGRS ;GET CORE
|
||
MOVEM T1,SABRNG##(P4) ;STORE LINK FROM PREVIOUS TO CURRENT SAB
|
||
MOVE P4,T1 ;PREVIOUS SAB _ CURRENT SAB
|
||
HRRI P2,SABBIT## ;FILL IN RH. OF AOBJN PTR.
|
||
MOVEM P2,SABSCN##(P4) ;STORE IT IN THIS SAB BLOCK
|
||
SKIPN UNILOG(U) ;THIS UNIT PART OF A STRUCTURE?
|
||
SETZM SABFIR##(P4) ;NO
|
||
SOJG P1,CRESA2 ;LOOP IF ANY MORE SATS
|
||
MOVE T1,UNISAB(U) ;GET ADR. OF 1ST. SAB BLOCK IN RING
|
||
MOVEM T1,SABRNG##(P4) ;MAKE LAST POINT TO FIRST
|
||
|
||
CRESPT: LDB T2,UNYSPU## ;GET # SATS ON THIS UNIT
|
||
ADDI T2,SPTFIR##+1 ;COMPUTE LENGTH OF SPT TABLE
|
||
MOVEI P3,(T2) ;SAVE IN P3
|
||
PUSHJ P,CORGRS ;GET CORE
|
||
MOVEM T1,UNISPT(U) ;STORE ADR. OF SPT TABLE IN UNIT DATA BLOCK
|
||
ADDI T1,-1(P3) ;COMPUTE ADR. OF LAST WORD IN SPT TABLE
|
||
SETZM (T1) ;ZERO IT TO INDICATE END OF TABLE
|
||
POPJ P, ;RETURN
|
||
SUBTTL STRUCTURE ROUTINES -- DEFSTR - DEFINE
|
||
|
||
|
||
DEFSTR::AOS BLURBF ;COUNT PASSES THROUGH HERE
|
||
PUSHJ P,PRSCON## ;SEE IF WE KNOW WHAT WE'RE DOING
|
||
JRST DEFST2 ;LOOKS LIKE IT--LEAVE USER IN PEACE
|
||
SKIPE BLURBF ;WAS THIS THE FIRST TIME HERE?
|
||
JRST DEFST1 ;NO--GIVE THE USER SOME PEACE
|
||
MOVEI T1,INTRO ;INTRODUCTORY TEXT
|
||
PUSHJ P,CONOUT## ;PRINT IT
|
||
MOVEI T1,REFPRM ;SPECIAL PARAMETER DISCLAIMER
|
||
PUSHJ P,CONOUT## ;PRINT IT
|
||
|
||
DEFST1: MOVEI T1,INIMSG ;HOME BLOCK WARNING
|
||
PUSHJ P,CONOUT## ;PRINT IT
|
||
|
||
DEFST2: PUSHJ P,GETSNM ;GET STRUCTURE NAME AND CREATE STR DB
|
||
JUMPE T1,VFCORE ;GO VERIFY INCORE DATA BASE IF NO MORE
|
||
PUSHJ P,GETUNM ;GET AND LINK ALL UNITS
|
||
JRST DEFST6 ;BRANCH IF NO UNITS SPECIFIED
|
||
MOVEI T1,[ASCIZ /Do you want to see the bad regions/]
|
||
MOVSI T2,'NO ' ;DEFAULT
|
||
PUSHJ P,PRSYNQ## ;PROMPT AND FETCH ANSWER
|
||
MOVEM T1,BATFLG ;SAVE FOR LATER
|
||
|
||
HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
DEFST3: MOVEI T1,1 ;CODE TO REPORT INITIALIZATION
|
||
PUSHJ P,INIHOM ;INITIALIZE HOME BLOCKS ON THIS UNIT
|
||
MOVEI T1,0 ;CODE FOR OPTIONAL INIT OF BAT BLOCKS
|
||
PUSHJ P,GETBAT ;CHECK OUT BAT BLOCKS
|
||
PUSHJ P,INIBAT ;NEED TO INITIALIZE BAT BLOCKS
|
||
HLRZ U,UNISTR(U) ;GET NEXT UNIT IN STRUCTURE
|
||
JUMPN U,DEFST3 ;LOOP BACK FOR MORE
|
||
PUSHJ P,CRLFOP## ;START WITH A BLANK LINE
|
||
MOVEI T1,[ASCIZ /Parameters for structure /]
|
||
PUSHJ P,ICONM## ;PRINT MESSAGE
|
||
MOVE T2,STRNAM(P2) ;GET STRUCTURE NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
PUSHJ P,GETBPC ;GET BLOCKS PER CLUSTER
|
||
PUSHJ P,GETPRV ;GET PRIVATE STATUS
|
||
PUSHJ P,GETOPP ;GET OWNER PPN
|
||
PUSHJ P,GETDSN ;GET DISK-SET NUMBERS
|
||
PUSHJ P,GETK4C ;GET K FOR CRASH.SAV
|
||
PUSHJ P,GETOVR ;GET OVERDRAW
|
||
PUSHJ P,GETGAR ;GET GUARANTEED BLOCKS
|
||
PUSHJ P,GETGRP ;GET BLOCKS TO TRY FOR ON OUTPUT
|
||
PUSHJ P,GETCNP ;GET BITS PER CLUSTER COUNT
|
||
PUSHJ P,GETSSL ;GET SINGLE STRUCTURE SSL INFO
|
||
PUSHJ P,GETSDL ;GET SINGLE STRUCTURE SDL INFO
|
||
|
||
HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
DEFST4: PUSHJ P,CRLFOP## ;START WITH A BLANK LINE
|
||
MOVEI T1,[ASCIZ /Parameters for unit /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
MOVE T2,UDBNAM(U) ;GET NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
PUSHJ P,GETUID ;GET UNIT ID
|
||
PUSHJ P,GETSPU ;GET SATS PER UNIT
|
||
PUSHJ P,GETSIC ;GET SATS IN CORE
|
||
PUSHJ P,GETK4S ;GET K FOR SWAPPING
|
||
PUSHJ P,GETSWB ;GET FIRST SWAPPING BLOCK NUMBER
|
||
PUSHJ P,GETCFS ;GET CLASS FOR SWAPPING
|
||
PUSHJ P,GETASL ;GET SINGLE UNIT ASL INFO
|
||
PUSHJ P,REFCHZ ;JUST INCASE HE DEFAULTED EVERYTHING
|
||
HLRZ U,UNISTR(U) ;LINK TO NEXT UNIT IN STRUCTURE
|
||
JUMPN U,DEFST4 ;LOOP IF MORE
|
||
MOVE T1,[PUSHJ P,CRESAB] ;INSTRUCTION TO EXECUTE PER UNIT
|
||
PUSHJ P,STOUNI ;TO MAKE THE SAB RINGS FOR THIS STRUCTURE
|
||
MOVE T1,STRNAM##(P2) ;GET THE STR NAME
|
||
MOVEI T2,[ASCIZ /must be refreshed before it can be used./]
|
||
PUSHJ P,SWARN ;MAKE SURE HE KNOWS TO REFRESH IT
|
||
|
||
DEFST5: PUSHJ P,OTSET## ;RESET OUTPUT BYTE POINTER, ETC.
|
||
PUSHJ P,CRLFOP## ;PUT OUT A BLANK LINE
|
||
JRST DEFST2 ;LOOP BACK FOR ANOTHER STRUCTURE
|
||
|
||
DEFST6: HLL T1,STRSYS##(P2) ;GET NEXT STR, IF ANY
|
||
HLLM T1,SYSSTR## ;AND MAKE SYSTEM POINT BEYOND US
|
||
PUSHJ P,KSTR ;KILL OFF STR DB
|
||
JRST DEFST2 ;AND THEN REPROMPT FOR ANOTHER
|
||
SUBTTL STRUCTURE ROUTINES -- DELSAB - DELETE SAB AND SPT TABLE
|
||
|
||
|
||
DELSAB: SE1ENT ;ENTER SECTION ONE
|
||
PUSHJ P,SAVE1## ;SAVE P1
|
||
S0PSHJ CMCWPS ;COMPUTE # CLUSTERS & WORDS PER SAT
|
||
SKIPE P1,UNISAB(U) ;HAVE A SAB RING?
|
||
LDB P1,UNYSIC## ;GET SATS IN CORE
|
||
JUMPLE P1,DELSA2 ;NONE
|
||
DELSA1: LDB T1,UNYWPS## ;GET WORDS PER SAT
|
||
ADDI T1,SABBIT## ;PLUS OVERHEAD
|
||
MOVE T2,UNISAB(U) ;GET A SAB ADDRESS
|
||
MOVE T3,SABRNG##(T2) ;LINK TO NEXT
|
||
MOVEM T3,UNISAB(U) ;STORE BACK FOR NEXT TIME
|
||
IFE FTXMON,<PUSHJ P,GIVWDS##> ;RETURN CORE
|
||
IFN FTXMON,<PUSHJ P,GVFWDS##> ;RETURN CORE
|
||
SOJG P1,DELSA1 ;LOOP BACK FOR MORE
|
||
DELSA2: SETZM UNISAB(U) ;INDICATE NO SABS
|
||
|
||
DELSPT: SKIPN T2,UNISPT(U) ;GET SPT TABLE ADDRESS
|
||
POPJ P, ;NOTHING THERE??
|
||
LDB T1,UNYSPU## ;GET # SATS ON THIS UNIT
|
||
ADDI T1,SPTFIR##+1 ;COMPUTE LENGTH OF SPT TABLE
|
||
IFE FTXMON,<PUSHJ P,GIVWDS##> ;RETURN CORE
|
||
IFN FTXMON,<PUSHJ P,GVFWDS##> ;RETURN CORE
|
||
SETZM UNISPT(U) ;CLEAR ADDRESS OUT
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL STRUCTURE ROUTINES -- LNKSTR - LINK UNITS WITHIN A STRUCTURE
|
||
|
||
|
||
LNKSTR: JUMPE P2,CPOPJ## ;IF UNIT NOT IN STR SETUP SAB RING & SPT TABLE
|
||
LDB T2,UNYLUN## ;GET LOGICAL UNIT # WITHIN STR
|
||
SKIPE HOMNXT##(P1) ;IS THIS LAST UNIT IN STR?
|
||
JRST LNKST2 ;NO - GO LINK UNIT DATA BLOCK INTO STR
|
||
HRRZ T1,STRUNM##(P2) ;HAVE WE ALREADY SEEN A LAST UNIT FOR THIS STR?
|
||
JUMPE T1,LNKST1 ;NO - NOW WE HAVE
|
||
PUSH P,T2 ;SAVE LOG. UNIT #
|
||
MOVEI T1,[ASCIZ /
|
||
% More than one last unit in structure /]
|
||
PUSHJ P,MSGSTR ;PRINT MSG FOLLOWED BY SIXBIT STR NAME
|
||
POP P,T2 ;RESTORE LOG. UNIT #
|
||
LNKST1: ANDI T2,77 ;MAX. OF 64 UNITS IN STR
|
||
HRRM T2,STRUNM##(P2) ;STORE LOG. # OF LAST UNIT IN STR
|
||
AOS STRUNM##(P2) ;LEAVE T2 ALONE BUT MAKE MEMORY OK
|
||
LNKST2: MOVEI T4,STRUNI##(P2) ;GET ADDR OF LINK TO FIRST UDB IN STR
|
||
JRST LNKST4
|
||
LNKST3: LDB T3,UNYLN1## ;YES - GET LOG. UNIT # OF NEXT UNIT
|
||
CAMLE T3,T2 ;IS IT GREATER THAN UNIT JUST READ?
|
||
JRST LNKST5 ;YES - INSERT UNIT DATA BLOCK HERE
|
||
MOVEI T4,UNISTR(T1) ;GET ADR. OF LINK TO NEXT UNIT
|
||
LNKST4: HLRZ T1,(T4) ;GET ADR. OF NEXT UNIT DATA BLOCK IN STR
|
||
JUMPN T1,LNKST3 ;MORE DATA BLOCKS?
|
||
LNKST5: HRLM T1,UNISTR(U) ;SAVE LINKS TO STR & NEXT UNIT DATA BLOCK
|
||
HRRM P2,UNISTR(U) ; IN THIS UNIT DATA BLOCK
|
||
HRLM U,(T4) ;SAVE THIS UDB IN PREVIOUS UNIT DATA BLOCK
|
||
POPJ P, ;RETURN
|
||
SUBTTL STRUCTURE ROUTINES -- SHWSTR - SHOW
|
||
|
||
|
||
SHWSTR::HLRZ P2,SYSSTR## ;GET FIRST STRUCTURE IN SYSTEM
|
||
JUMPE P2,[ ;MAKE SURE WE HAVE ONE
|
||
MOVEI T1,[ASCIZ /% No structures found/]
|
||
AOS (P) ;WRONG, BUT SKIP ANYWAY
|
||
PJRST CONOUT] ;AFTER GIVING OUR WARNING
|
||
MOVEI T1,[ASCIZ /Structure/]
|
||
SETZ T2, ;NO DEFAULT STRUCTURE NAME
|
||
PUSHJ P,PRSSIX## ;GET A SIXBIT QUANTITY
|
||
JUMPE T1,CPOPJ1## ;GIVE UP IF NO RESPONSE
|
||
PUSHJ P,FNSTR ;ALREADY EXIST?
|
||
SKIPA ;NO, SEE IF THIS IS ALL
|
||
JRST SHWST1 ;YES, TYPE OUT INFO AND LOOP BACK
|
||
PUSHJ P,FNDALL ;DID THE USER TYPE ALL?
|
||
SKIPA T2,[[ASCIZ /does not exist/]] ;NO
|
||
JRST SHWSAL ;SHOW ALL STRUCTURES
|
||
PUSHJ P,SWARN ;WARN OPERATOR
|
||
JRST SHWSTR ;TRY AGAIN
|
||
|
||
SHWST1: PUSHJ P,SHWSTU ;SHOW ONE STRUCTURE
|
||
JRST SHWSTR ;AND ASK FOR ANOTHER
|
||
|
||
SHWSAL: HLRZ P2,SYSSTR## ;GET FIRST STRUCTURE IN SYSTEM
|
||
SHWSA1: PUSHJ P,SHWSTU ;SHOW A STRUCTURE
|
||
HLRZ P2,STRSYS##(P2) ;GET THE NEXT STRUCTURE
|
||
JUMPN P2,SHWSA1 ;SHOW THE NEXT STRUCTURE IF MORE.
|
||
JRST SHWSTR ;LOOP IN CASE HE WANTS TO SEE ONE AGAIN
|
||
|
||
SHWSTU: HLRZ U,STRUNI##(P2) ;POINT TO FIRST UNIT IN STRUCTURE
|
||
PUSHJ P,CRLFOP## ;START WITH A BLANK LINE
|
||
MOVEI T1,[ASCIZ /Parameters for structure /]
|
||
PUSHJ P,ICONM## ;PRINT MESSAGE
|
||
MOVE T2,STRNAM(P2) ;GET STRUCTURE NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
MOVEI T1,[ASCIZ / *Blocks per cluster: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
LDB T1,UNYBPC## ;PICK UP DATA FROM FIRST UNIT IN STR
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
MOVEI T1,[ASCIZ / Private structure: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
LDB T1,STYPVS## ;GET BIT
|
||
MOVE T2,[EXP <'NO '>,<'YES '>](T1) ;TRANSLATE
|
||
PUSHJ P,PRNAME## ;PRINT VALUE
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
MOVEI T1,[ASCIZ / Owner PPN: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
MOVEI T3,PRNAME## ;ASSUME NOTHING
|
||
SKIPN T2,STRPPN##(P2) ;GET PPN
|
||
SKIPA T2,['NONE '] ;THERE ISN'T ONE
|
||
SKIPA T3,[IFIW PRTPPN##] ;PPN TYPER
|
||
MOVE T3,[IFIW PRNAME##] ;SIXBIT TYPER
|
||
PUSHJ P,(T3) ;CALL SUBR
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
MOVEI T1,[ASCIZ / Disk-set: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
LDB T1,STYSET## ;GET DISK-SET
|
||
SETZ T2, ;ASSUME NO KEYWORD
|
||
MOVE T3,[IFIW PRTDIG##] ;ASSUME A SINGLE SET
|
||
CAIN T1,0 ;ALL?
|
||
MOVSI T2,'ALL' ;YES
|
||
CAIN T1,^D37 ;NONE?
|
||
MOVE T2,['NONE '] ;YES
|
||
SKIPE T2 ;SINGLE DISK-SET?
|
||
HRRI T3,PRNAME## ;NO
|
||
PUSHJ P,(T3) ;PRINT SOMETHING
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
MOVEI T1,[ASCIZ / *Number of K for CRASH.EXE: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
HRRZ T1,STRK4C##(P2) ;GET K FOR CRASH.SAV
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
MOVEI T1,[ASCIZ / Blocks allowed for overdraw per user: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
MOVM T1,STROVR##(P2) ;GET OVERDRAW
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
JRST SHWST2 ;UNIMPLEMENTED
|
||
MOVEI T1,[ASCIZ / Sum of blocks guaranteed to users: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
MOVE T1,STRGAR##(P2) ;GET GUARANTEED BLOCKS
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
SHWST2: MOVEI T1,[ASCIZ / Consecutive blocks tried for on output: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
HLRZ T1,UNIGRP(U) ;GET SIZE FROM FIRST UNIT
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
MOVEI T1,[ASCIZ / *Bits per cluster count: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
LDB T1,[POINT 6,STYCNP##(P2),11] ;GET NUMBER OF BITS
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
MOVEI T1,[ASCIZ / Position in the SSL: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
SKIPGE T1,STRSRC##(P2) ;IN THE SSL?
|
||
SKIPA T2,['NONE '] ;NO
|
||
SKIPA T3,[IFIW PRTDIG##] ;IF A POSITION
|
||
MOVE T3,[IFIW PRNAME##] ;IF NONE
|
||
PUSHJ P,(T3) ;PRINT SOMETHING
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
MOVEI T1,[ASCIZ / Unit in the SDL: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
SKIPGE STRSDL##(P2) ;IN THE SDL?
|
||
TDZA T1,T1 ;NO
|
||
MOVEI T1,1 ;YES
|
||
MOVE T2,[EXP <'NO '>,<'YES '>](T1) ;TRANSLATE
|
||
PUSHJ P,PRNAME## ;PRINT VALUE
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
MOVEI T1,[ASCIZ / Unit/]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
HRRZ T2,STRUNM##(P2) ;GET # UNITS IN STR
|
||
MOVEI T1,[ASCIZ /s/] ;POSSIBLE TEXT
|
||
CAIE T2,1 ;IF MULTI-PACK STRUCTURE,
|
||
PUSHJ P,CONMES## ;MAKE IT PLURAL
|
||
MOVEI T1,[ASCIZ /: /]
|
||
PUSHJ P,CONMES## ;SEPARATION
|
||
|
||
SHWST3: MOVE T2,UDBNAM(U) ;GET THE PHYSICAL UNIT NAME
|
||
PUSHJ P,PRNAME## ;TYPE IT
|
||
HLRZ U,UNISTR(U) ;GET NEXT UNIT IN THIS STR
|
||
JUMPE U,SHWST4 ;END LIST IF NO MORE
|
||
MOVEI T1,[ASCIZ /, /] ;SEPARATION IF MORE
|
||
PUSHJ P,CONMES## ;TYPE COMMA SPACE
|
||
JRST SHWST3 ;THEN NEXT UNIT NAME
|
||
|
||
SHWST4: PUSHJ P,CRLFOP## ;END THE LINE
|
||
|
||
POPJ P, ;RETURN
|
||
SUBTTL STRUCTURE ROUTINES -- VALMFD - VALIDATE THE MFD
|
||
|
||
|
||
VALMFD: PUSHJ P,SAVE2## ;SAVE P1 AND P2
|
||
SKIPN UNILOG(U) ;SKIP IF UNIT IS IN A FILE STRUCTURE
|
||
POPJ P, ;NOT IN A FILE STRUCTURE
|
||
HRRZ P2,UNISTR(U) ;ADDR OF STR DATA BLOCK
|
||
JUMPE P2,CPOPJ## ;UNILOG WAS BOGUS
|
||
HLLZ T1,STRREF##(P2) ;NEEDS REFRESHING FLAG
|
||
JUMPN T1,CPOPJ## ;NO MFD IF NEEDS REFRESHING
|
||
HRRZ P1,@ONCMBF ;ADDR FROM IOWD PTR TO HOME BLOCK
|
||
ADDI P1,1
|
||
LDB T2,UNYLUN## ;LOGICAL UNIT IN FILE STRUCTURE
|
||
CAME T2,HOMUN1##(P1) ;SKIP IF MFD STARTS ON THIS UNIT
|
||
POPJ P, ;IT DOESN'T
|
||
IMUL T2,STRBPU##(P2) ;T2=1ST LOGICAL BLOCK ON THIS UNIT
|
||
SUB T2,HOMMFD##(P1) ;MINUS BLOCK FOR MFD RIB
|
||
MOVNS T2 ;T2=BLOCK ON UNIT FOR MFD RIB
|
||
PUSHJ P,OMNRED ;READ MFD RIB
|
||
STOPCD LNKSTR,DEBUG,ERM,DIEUNI##, ;++ERROR READING MFD
|
||
SKIPE .UONCE## ;IF USER-MODE,
|
||
POPJ P, ;WE DON'T CARE (AND TWICE.BIN COULD SCREW US)
|
||
HRRZ T1,P1 ;ADDR OF 1ST WORD OF MFD RIB
|
||
ADD T1,(P1) ;PTR TO 1ST RETRIEVAL PTR
|
||
SKIPE 2(T1) ;SKIP IF ONLY 1 PTR
|
||
POPJ P, ;DONE
|
||
MOVEI T1,STP1PT## ;ONLY 1 PTR BIT
|
||
IORM T1,STR1PT##(P2) ;SAVE
|
||
POPJ P, ;RETURN
|
||
SUBTTL STRUCTURE ROUTINES -- DSKSDL - BUILD SDL FROM DISK
|
||
|
||
|
||
DSKSDL: MOVSI T1,-^D36 ;AOBJN POINTER
|
||
MOVEI T2,SYSSTR##-STRSYS## ;PREDECESSOR OF FIRST STR
|
||
JRST DSKSD2 ;ENTER LOOP FROM THE BOTTOM
|
||
|
||
DSKSD1: SKIPGE STRSDL(T2) ;IN THE SDL?
|
||
JRST DSKSD2 ;NO
|
||
HRRZM T1,STRSDL(T2) ;SET POSITION IN THE SDL
|
||
AOBJP T1,CPOPJ## ;RETURN IF ALL FILLED UP
|
||
|
||
DSKSD2: HLRZ T2,STRSYS(T2) ;LINK TO NEXT STR
|
||
JUMPN T2,DSKSD1 ;LOOP BACK FOR ANOTHER
|
||
POPJ P, ;DONE
|
||
SUBTTL MANDATORY ONCE ONLY CODE -- FILMAN - SETUP FILSER DATA BASE
|
||
|
||
|
||
FILMAN::SETOM BATMAN ;NOTE IN MANDANTORY PART NOW
|
||
PUSHJ P,REDBAT ;READ BAT BLOCKS TO SET UP SWAPPING SATS
|
||
MOVEI P2,SYSSTR##-STRSYS## ;PREDECESSOR TO FIRST STR
|
||
JRST LSTRT1 ;ENTER LOOP FROM THE BOTTOM
|
||
NXTSIS: SETZB P4,STRTAL##(P2) ;CLEAR FREE BLOCK TALLY & LAST RET. PTR. FLAG
|
||
HLRZ U,STRUNI##(P2) ;GET ADR. OF 1ST. UNIT IN STR
|
||
PUSHJ P,GTSRB ;READ SAT.SYS "RIB" BLOCK FOR THIS STR
|
||
JRST [MOVE T1,UDBNAM##(U)
|
||
MOVEI T2,[ASCIZ /SAT read errors/]
|
||
PUSHJ P,UWARN ;WARN OPERATOR
|
||
JRST NXTSIE] ;AND CONTINUE
|
||
HRRZ T1,P1 ;GET ADR. OF "RIB" BLOCK IN CORE
|
||
ADD T1,RIBFIR##(P1) ;CREATE AOBJN PTR. FOR SCANNING RET. INFO.
|
||
AOBJN T1,.+2 ;SKIP OVER 1ST. PTR. AS IT IS A "RIB"
|
||
STOPCD NXTSIE,DEBUG,NRS,DIEUNI##, ;++NO RIB IN SAT
|
||
HRRZ P2,UNISTR(U) ;GET ADR. OF STR - P2 CLOBBERED BY GTSRB
|
||
IFN FTXMON,SE1JRS ;MUST BE EXECUTED IN SECTION 1
|
||
NXTUIS: SETZM UNITAL(U) ;CLEAR FREE BLOCK TALLY FOR THIS UNIT
|
||
PUSH P,T1 ;SAVE PTR.
|
||
LDB T3,UNYLUN## ;GET LOG. UNIT # OF THIS UNIT IN STR
|
||
SKIPN T3 ;IF THIS UNIT IS LOG. UNIT # 0
|
||
SKIPA T2,-1(T1) ; SKIP BACK OVER "RIB" TO GET NEW UNIT PTR.
|
||
MOVE T2,(T1) ;GET NEW UNIT PTR.
|
||
TRNN T2,RIPNUB## ;IS IT REALLY A NEW UNIT PTR?
|
||
STOPCD NXTSI1,DEBUG,NNU,DIEUNI##, ;++NOT NEW UNIT
|
||
ANDI T2,77 ;IT SHOULD BE LOG. UNIT # SO MASK OUT EXTRA BITS
|
||
CAME T2,T3 ;IS IT?
|
||
STOPCD NXTSI1,DEBUG,RPM,DIEUNI##, ;++RET. PTR. MISMATCH
|
||
MOVE T4,UNISPT(U) ;GET ADR. OF UNIT'S SPT TABLE
|
||
MOVPTR: AOBJP T1,MOVPT2 ;HAVE WE RUN OUT OF RET. INFO?
|
||
MOVE T2,(T1) ;NO - GET NEXT WORD
|
||
LDB T3,STYCNP##(P2) ;GET CLUSTER COUNT
|
||
JUMPE T3,MOVPT1 ;IF 0 WE MUST HAVE RUN OUT OF PTRS. FOR THIS UNIT
|
||
LDB T2,STYCLP##(P2) ;GET CLUSTER ADR.
|
||
DPB T2,SPYCLA## ;STORE IN SPT TABLE FOR THIS UNIT
|
||
AOJA T4,MOVPTR ;BUMP SPT TABLE ADR. & RETURN FOR MORE PTRS.
|
||
|
||
NXTSI1: POP P,T1 ;RESTORE PTR. TO RET. INFO FROM STACK.
|
||
NXTSIE: MOVEI T2,1 ;GET A BIT
|
||
DPB T2,UNYAWL## ;SET SOFTWARE WRITE PROTECT FOR ALL JOBS
|
||
NXTSI2: HRRZ P2,UNISTR(U) ;RESET P2 TO POINT TO STR
|
||
JRST LSTRT1 ;AND GO ON TO NEXT STR
|
||
|
||
MOVPT1: MOVEM T1,(P) ;SAVE PTR. ON STACK FOR NEXT UNIT SCAN
|
||
JUMPN T2,MOVPT3 ;WAS IT 0 ENTRY INDICATING END OF LIST?
|
||
MOVPT2: SUBI T4,1 ;YES - DECREMENT T4 SO THAT LAST ENTRY IN SPT TABLE,
|
||
; WHICH IS A "RIB", GETS CLEARED
|
||
SETOM P4 ;YES - SET END OF LIST FLAG
|
||
MOVPT3: SETZM (T4) ;ZERO END OF SPT TABLE FOR THIS UNIT
|
||
;NOW READ ALL SATS ON THIS UNIT - COMPUTE THE # OF FREE CLUSTERS LEFT IN EACH SAT
|
||
|
||
PUSH P,P2 ;SAVE ADR. OF THIS STR
|
||
LDB P1,UNYSPU## ;GET # SAT BLOCKS ON THIS UNIT
|
||
MOVNS P1 ;MAKE -VE
|
||
HRLZS P1 ;MAKE IT INTO AN AOBJN PTR.
|
||
MOVEI P2,UNISAB-SABRNG##(U) ;SETUP OFFSET TO POINT TO 1ST. SAB BLOCK ADR.
|
||
NXTSAT: MOVE P2,SABRNG##(P2) ;GET ADR. OF NEXT SAB BLOCK FOR THIS UNIT
|
||
MOVE T4,UNISPT(U) ;GET ADR. OF SPT TABLE
|
||
ADDI T4,(P1) ;ADD IN INDEX FOR LDB SPYCLA
|
||
LDB T1,SPYCLA## ;GET CLUSTER ADR. OF THIS SAT BLOCK
|
||
LDB T2,UNYBPC## ;GET # BLOCKS PER CLUSTER
|
||
IMUL T2,T1 ;COMPUTE LOGICAL BLOCK # FOR THIS SAT
|
||
PUSHJ P,REDSAT ;READ SAT & COMPUTE # FREE CLUSTERS LEFT IN IT
|
||
STOPCD LSTRT0,DEBUG,SRE,DIEUNI##, ;++SAT READ ERROR
|
||
MOVE T4,UNISPT(U) ;GET ADR. OF SPT TABLE FOR THIS UNIT
|
||
ADDI T4,(P1) ;ADD IN INDEX FOR DPB SPYTAL
|
||
DPB T2,SPYTAL## ;STORE FREE CLUSTERS FOR SAT BLOCK IN SPT TABLE
|
||
LDB T1,UNYBPC## ;GET # BLOCKS PER CLUSTER FOR THIS UNIT
|
||
IMUL T1,T2 ;COMPUTE # FREE BLOCKS IN THIS SAT BLOCK
|
||
HRRZ T2,UNISTR(U) ;LOC OF STR DATA BLOCK
|
||
HLLZ T3,STRREF##(T2)
|
||
JUMPE T3,NXTSA1 ;IF STR NEEDS REFRESHING,
|
||
MOVEI T3,1 ; PRETEND IT'S WRITE-LOCKED
|
||
DPB T3,UNYAWL##
|
||
JRST NXTSA2 ; AND LEAVE UNITAL=STRTAL=0
|
||
NXTSA1: ADDM T1,UNITAL(U) ;ADD TO TOTAL FOR THIS UNIT
|
||
ADDM T1,STRTAL##(T2) ;ADD TO TOTAL FOR THIS STR
|
||
NXTSA2: AOBJN P1,NXTSAT ;GO READ NEXT SAT IF THERE IS ONE
|
||
MOVE T2,UNIBPU(U) ;GET NO OF BLOCK ON UNIT
|
||
LDB T3,UNYK4S## ;K FOR SWAPPING
|
||
LSH T3,BLKSPK ;CONVERT TO BLOCKS
|
||
SUB T2,T3 ;COMPUTE SAFETY FACTOR
|
||
IDIVI T2,UNVRSF## ; BLOCKS TO USE WHEN UNIT FULL
|
||
CAILE T2,^D500 ;MAX SAFETY FACTOR = 500 BLOCKS
|
||
MOVEI T2,^D500
|
||
MOVNS T2
|
||
ADDM T2,UNITAL(U) ;SUBTRACT FACTOR FROM UNIT
|
||
HRRZ T1,UNISTR(U)
|
||
ADDM T2,STRTAL##(T1) ; AND FROM STR
|
||
POP P,P2 ;POP OFF ADR. OF THIS STR DATA BLOCK FROM STACK
|
||
POP P,T1 ;RESTORE PTR. TO RET. INFO. FROM STACK
|
||
HLRZ U,UNISTR(U) ;GET ADR. OF NEXT UNIT DATA BLOCK IN STR
|
||
JUMPL P4,LSTRTP ;HAS LAST RET. PTR. BEEN SEEN?
|
||
JUMPN U,NXTUIS ;NO - IS THERE ANOTHER UNIT IN THIS STR TO CHECK
|
||
STOPCD .,STOP,ROU,DIESTR##, ;++RAN OUT OF UNITS
|
||
LSTRTP: SKIPE U ;IS THERE ANOTHER UNIT IN THIS STR TO CHECK
|
||
STOPCD .,STOP,TMU,DIESTR##, ;++TOO MANY UNITS
|
||
JRST LSTRT1 ;ALREADY RESTORED T1 AND P2
|
||
LSTRT0: MOVEI T1,1 ;SET SOFTWARE WRITE PROTECT FOR ALL JOBS
|
||
DPB T1,UNYAWL##
|
||
POP P,P2 ;POP OFF ADR. OF THIS STR. DATA BLOCK FROM STACK
|
||
POP P,T1 ;RESTORE PTR. TO RE. INFO FROM STACK
|
||
LSTRT1:
|
||
IFN FTXMON,<XJRST [MCSEC0+.+1]> ;RETURN TO SECTION ZERO
|
||
HLRZ P2,STRSYS##(P2) ;GET ADR. OF NEXT STR DATA BLOCK IN SYSTEM
|
||
JUMPN P2,NXTSIS ;IF THERE IS ONE REPEAT
|
||
PUSH P,P2 ;INIT TEMP PTR TO SYS. SL.
|
||
MOVE P2,SYSSRC##
|
||
MOVEM P2,TEMPTR
|
||
PUSHJ P,SLINI## ;AND EMPTY THE SYS SL.
|
||
POP P,P2
|
||
MOVE P4,[PUSHJ P,DEPCLR] ;SETUP INSTR. FOR XCT IN FNDSRC
|
||
|
||
PUSHJ P,FNDSRC ;GO SETUP "SYS" SEARCH LIST
|
||
PUSHJ P,SSLBLD## ;LOAD THE SSL INTO THE BOOTSTRAP VECTOR
|
||
JFCL ;NOT AVAILABLE
|
||
PUSHJ P,ASLBLD## ;LOAD THE ASL INTO THE BOOTSTRAP VECTOR
|
||
JFCL ;NOT AVAILABLE
|
||
PUSHJ P,SDLBLD## ;LOAD THE SDL INTO THE BOOTSTRAP VECTOR
|
||
JFCL ;NOT AVAILABLE
|
||
MOVEI P1,SYSSTR##-STRSYS## ;SETUP LINK POINTING TO 1ST. STR IN SYSTEM
|
||
JRST ADJSR1
|
||
ADJSTR: SETZM STRMNT##(P1) ;CLEAR MOUNT COUNT(TIMESHARED AS STRSAT)
|
||
SETZM STRJOB##(P1) ;CLEAR SINGLE ACCESS OWNER(TIMESHARED AS STRSRC)
|
||
ADJSR1: HLRZ P1,STRSYS##(P1) ;GET ADR. OF NEXT STR IN SYSTEM
|
||
JUMPN P1,ADJSTR ;REPEAT IF ANY MORE STRS
|
||
|
||
HLRZ U,SYSUNI## ;GET ADR. OF 1ST UNIT DATA BLOCK IN SYSTEM
|
||
ADJUNI: HRRZ T2,UNISTR(U) ;GET STR ADR. THIS UNIT IS IN
|
||
JUMPE T2,ADJUN1 ;IS IT 0?
|
||
IFN FTDUAL,<
|
||
SKIPE T2,UNI2ND(U) ;DRIVE DUAL PORTED?
|
||
PUSHJ P,CPYUD## ;COPY INFORMATION TO SECOND PORT
|
||
>; END IFN FTDUAL
|
||
ADJUN1: HLRZ U,UNISYS(U) ;GET ADR. OF NEXT UNIT DATA BLOCK IN SYSTEM
|
||
JUMPN U,ADJUNI ;REPEAT IF ANY LEFT
|
||
SWPFAC: PUSHJ P,GVMNB0 ;RETURN MONITOR BUFFER USED FOR "RIB" BLOCK
|
||
PUSHJ P,TYPNMU ;TYPE UNITS IN STRUCTURES NOT MOUNTED TO THIS SYS
|
||
|
||
|
||
;CALCULATE DATA NEEDED FOR THE MCU FUNCTION.
|
||
;SET PROT AND PROT0 ACCORDING TO THE FIRST UNIT
|
||
;IN THE ACTIVE SWAPPING LIST USING THE AVERAGE TIME PER PAGE
|
||
;FOR PROT AND THE AVERAGE LATENCY TIME FOR PROT0
|
||
|
||
|
||
MOVEI P1,BKPMAX ;LAST ENTRY IN UNIT TYPE TABLES
|
||
SWPFC1: MOVEI T1,PAGSIZ ;GET WORDS PER PAGE
|
||
LSH T1,-7 ;CONVERT TO BLOCKS PER PAGE (128 WORDS PER BLOCK)
|
||
IMUL T1,MSPREV(P1) ;MULTIPLY BY MICROSECS PER REVOLUTION
|
||
IDIV T1,BKPREV(P1) ;DIVIDE BY BLOCKS PER REVOLUTION TO
|
||
;GET MICROSECS PER PAGE
|
||
MOVEM T1,MCUATP##(P1) ;SAVE IN TABLE FOR MCU CALCULATION
|
||
MOVE T1,AVSEEK(P1) ;GET AVG SEEK TIME IN MICROSECS
|
||
LSH T1,1 ;*2
|
||
ADD T1,MSPREV(P1) ;ADD IN MICROSECS PER REV
|
||
LSH T1,-1 ;/2 TO GET AVERAGE LATENCY
|
||
MOVEM T1,MCUALT##(P1) ;IN MICROSECS. SAVE FOR MCU.
|
||
SOJGE P1,SWPFC1 ;LOOP FOR ALL TYPES OF UNIT.
|
||
|
||
|
||
;NOW CALCULATE DEFAULT PROT AND PROT0 WHICH WILL BE USED
|
||
;IN THE ABSENCE OF THE MINIMUM CORE USAGE FUNCTION.
|
||
|
||
MOVSI T3,MSWPMX## ;AOBJN POINTER TO SWPTAB
|
||
SKIPN U,SWPTAB##(T3) ;GET FIRST NON-ZERO ENTRY
|
||
AOBJN T3,.-1
|
||
LDB T1,UNYKTP## ;GET KONTROLLER TYPE
|
||
MOVE T1,TYPTAB##(T1) ;GET OFFSET INTO UNIT TYPE TABLES
|
||
LDB P1,UNYUTP## ;GET UNIT TYPE
|
||
ADD P1,T1 ;GET FINAL POSITION IN UNIT TYPE TABLES
|
||
MOVE T1,PRT0TB(P1) ;GET PROT0 FOR THIS DEVICE
|
||
MOVEM T1,PROT0## ;(MICRO SECONDS)
|
||
IMUL T1,TICSEC## ;TICS PER SECOND
|
||
IDIV T1,[^D1000000] ;CONVERT PROT0 TO TICKS
|
||
MOVEM T1,PROT1## ;AND SAVE AS TICS VERSION OF PROT0
|
||
MOVE T1,PROTTB(P1) ;GET MULTIPLIER FOR THIS DEVICE
|
||
MOVEM T1,PROT## ;(MICRO SECONDS)
|
||
MOVE T1,PRTMTB(P1) ;GET MAXIMUM FOR THIS DEVICE
|
||
MOVEM T1,PROTM## ;(MICRO SECONDS)
|
||
IFN FTNSCHED,<
|
||
MOVE T1,MCUATP##(P1) ;AVG TIME PER PAGE IN MICROSEC.
|
||
IMULI T1,PAVJSP## ;PREDICTED AVG JOB SIZE IN PAGES
|
||
ADD T1,MCUALT##(P1) ;PLUS AVG LATENCY IN MICROSEC.
|
||
IMUL T1,TICSEC## ;MICROTICS
|
||
IDIV T1,[^D1000000] ;CONVERT TO TICS
|
||
ADDI T1,1 ;ROUND UP TO NEXT TIC
|
||
MOVEM T1,SCDSWP## ;CYCLE TIME FOR PQ2 SWAPIN SCAN
|
||
>
|
||
; NOW SET QUANTUM TABLES
|
||
MOVE T1,MAXTAB(P1) ;GET MAXIMUM PQ2 QUANTUM RUN TIME
|
||
IMUL T1,TICSEC ;CONVERT TO TICKS
|
||
IDIV T1,[^D1000000]
|
||
MOVEM T1,QMXTAB##+1
|
||
MOVE T1,ADDTAB(P1) ;GET MINIMUM PQ2 QUANTUM RUN TIME
|
||
IMUL T1,TICSEC ;CONVERT TO TICKS
|
||
IDIV T1,[^D1000000]
|
||
MOVEM T1,QADTAB##+1
|
||
MOVE T1,MULTAB(P1) ;GET PQ2 QUANTUM RUN TIME MULTIPLIER
|
||
IMUL T1,TICSEC ;CONVERT TO TICKS
|
||
IDIV T1,[^D1000000]
|
||
MOVEM T1,QMLTAB##+1 ;AND AS PQ2 MULTIPLIER
|
||
;PQ1 QUANTA ARE INITIALIZED IN COMMON.
|
||
;INSERT ANY NON-STANDARD CODE FOR
|
||
;INITIALIZING PQ1 QUANTA HERE.
|
||
MOVEI T1,STRSYS##
|
||
HRRM T1,SYSSTR##
|
||
|
||
MOVSI T1,MSWPMX## ;CAN'T HAVE SWAP SPACE
|
||
MOVNI T2,4 ; START AT BLOCK0,
|
||
SKIPE T3,SWPTAB##(T1) ; SO DECREMENT UNISLB
|
||
ADDM T2,UNISLB(T3) ; AND START AT LOGICAL
|
||
AOBJN T1,.-2 ; SWAP BLOCK1
|
||
POPJ P, ;FINALLY DONE
|
||
;BLOCKS PER REVOLUTION TABLE
|
||
|
||
BKPREV: 0 ;NEW DRUM
|
||
0 ;DITTO
|
||
^D20 ;RD10
|
||
^D30 ;RM10B
|
||
^D5 ;RP01
|
||
^D10 ;RP02
|
||
^D10 ;RP03
|
||
^D11 ;DUAL POSITIONER MD10
|
||
^D11 ;SINGLE POSITIONER MD10
|
||
^D32 ;RS04
|
||
^D20 ;RP04
|
||
^D20 ;RP06
|
||
^D30 ;RM03
|
||
^D30 ;RP07
|
||
^D25 ;RP20
|
||
^D23 ;RA80
|
||
^D23 ;RA81
|
||
^D19 ;RA60
|
||
BKPMAX==.-BKPREV-1 ;MAXIMUM INDEX TO THESE TABLES
|
||
|
||
;MICROSECONDS PER REVOLUTION TABLE
|
||
|
||
MSPREV: 0 ;NEW DRUM
|
||
0 ;DITTO
|
||
^D33000 ;RD10
|
||
^D17000 ;RM10B
|
||
^D25000 ;RP01
|
||
^D25000 ;RP02
|
||
^D25000 ;RP03
|
||
^D50000 ;DUAL POSITIONER MD10
|
||
^D50000 ;SINGLE POSITIONER MD10
|
||
^D17000 ;RS04
|
||
^D17000 ;RP04
|
||
^D17000 ;RP06
|
||
^D17000 ;RM03
|
||
^D17000 ;RP07
|
||
^D17000 ;RP20
|
||
^D17000 ;RA80
|
||
^D17000 ;RA81
|
||
^D17000 ;RA60
|
||
AVSEEK: 0 ;NEW DRUM
|
||
0 ;DITTO
|
||
0 ;RD10
|
||
0 ;RM10B
|
||
^D50000 ;RP01
|
||
^D50000 ;RP02
|
||
^D50000 ;RP03
|
||
^D110000 ;DUAL POSITIONER MD10
|
||
^D110000 ;SINGLE POSITIONER MD10
|
||
0 ;RS04
|
||
^D27000 ;RP04
|
||
^D27000 ;RP06
|
||
^D27000 ;RM03
|
||
^D23000 ;RP07
|
||
^D25000 ;RP20
|
||
0 ;RA80
|
||
0 ;RA81
|
||
0 ;RA60
|
||
|
||
|
||
TEMPTR: 0 ;ACTUAL PTR. USED
|
||
;TABLE OF MINIMUM IN-CORE-PROTECT TIMES FOR VARIOUS DEVICES (PROT0)
|
||
PRT0TB: ^D3000000 ;NEW DRUM - UNKNOWN
|
||
^D3000000 ;DITTO
|
||
^D3000000 ;RD10
|
||
^D1500000 ;RM10B
|
||
^D7000000 ;RP01
|
||
^D5000000 ;RP02
|
||
^D5000000 ;RP03
|
||
^D8000000 ;DUAL POSITIONER MD10
|
||
^D8000000 ;SINGLE POSITIONER MD10
|
||
^D1500000 ;RS04
|
||
^D2000000 ;RP04
|
||
^D2000000 ;RP06
|
||
^D2000000 ;RM03
|
||
^D2000000 ;RP07
|
||
^D2000000 ;RP20
|
||
^D2000000 ;RA80
|
||
^D2000000 ;RA81
|
||
^D2000000 ;RA60
|
||
|
||
;TABLE OF IN-CORE-PROTECT TIME MULTIPLIERS BY DEVICE (PROT)
|
||
PROTTB: 0 ;NEW DRUM - UNKNOWN
|
||
0 ;DITTO
|
||
0 ;RD10
|
||
0 ;RM10B
|
||
0 ;RP01
|
||
0 ;RP02
|
||
0 ;RP03
|
||
0 ;DUAL POSITIONER MD10
|
||
0 ;SINGLE POSITIONER MD10
|
||
0 ;RS04
|
||
0 ;RP04
|
||
0 ;RP06
|
||
0 ;RM03
|
||
0 ;RP07
|
||
0 ;RP20
|
||
0 ;RA80
|
||
0 ;RA81
|
||
0 ;RA60
|
||
;TABLE OF MAXIMUM IN-CORE-PROTCT TIMES FOR VARIOUS DEVICES (PROTM)
|
||
PRTMTB: ^D3000000 ;NEW DRUM - UNKNOWN
|
||
^D3000000 ;DITTO
|
||
^D3000000 ;RD10
|
||
^D1500000 ;RM10B
|
||
^D7000000 ;RP01
|
||
^D5000000 ;RP02
|
||
^D5000000 ;RP03
|
||
^D8000000 ;DUAL POSITIONER MD10
|
||
^D8000000 ;SINGLE POSITIONER MD10
|
||
^D1500000 ;RS04
|
||
^D2000000 ;RP04
|
||
^D2000000 ;RP06
|
||
^D2000000 ;RM03
|
||
^D2000000 ;RP07
|
||
^D2000000 ;RP20
|
||
^D2000000 ;RA80
|
||
^D2000000 ;RA81
|
||
^D2000000 ;RA60
|
||
|
||
;TABLE OF MINIMUM PQ2 IN QUEUE TIMES BY DEVICE (QADTAB+1)
|
||
ADDTAB: ^D3000000/4 ;NEW DRUM - UNKNOWN
|
||
^D3000000/4 ;DITTO
|
||
^D3000000/4 ;RD10
|
||
^D1500000/4 ;RM10B
|
||
^D7000000/4 ;RP01
|
||
^D5000000/4 ;RP02
|
||
^D5000000/4 ;RP03
|
||
^D8000000/4 ;DUAL POSITIONER MD10
|
||
^D8000000/4 ;SINGLE POSITIONER MD10
|
||
^D1500000/4 ;RS04
|
||
^D2000000/4 ;RP04
|
||
^D2000000/4 ;RP06
|
||
^D2000000/4 ;RM03
|
||
^D2000000/4 ;RP07
|
||
^D2000000/4 ;RP20
|
||
^D2000000/4 ;RA80
|
||
^D2000000/4 ;RA81
|
||
^D2000000/4 ;RA60
|
||
;TABLE OF PQ2 MULTIPLIERS FOR IN QUEUE TIME BY DEVICE (QMLTAB+1)
|
||
MULTAB: ^D3000000/4 ;NEW DRUM - UNKNOWN
|
||
^D3000000/4 ;DITTO
|
||
^D3000000/4 ;RD10
|
||
^D1500000/4 ;RM10B
|
||
^D7000000/4 ;RP01
|
||
^D5000000/4 ;RP02
|
||
^D5000000/4 ;RP03
|
||
^D8000000/4 ;DUAL POSITIONER MD10
|
||
^D8000000/4 ;SINGLE POSITIONER MD10
|
||
^D1500000/4 ;RS04
|
||
^D2000000/4 ;RP04
|
||
^D2000000/4 ;RP06
|
||
^D2000000/4 ;RM03
|
||
^D2000000/4 ;RP07
|
||
^D2000000/4 ;RP20
|
||
^D2000000/4 ;RA80
|
||
^D2000000/4 ;RA81
|
||
^D2000000/4 ;RA60
|
||
|
||
;TABLE OF MAXIMUM PQ2 IN QUEUE TIMES BY DEVICE (QMXTAB+1)
|
||
MAXTAB: ^D3000000/2 ;NEW DRUM - UNKNOWN
|
||
^D3000000/2 ;DITTO
|
||
^D3000000/2 ;RD10
|
||
^D1500000/2 ;RM10B
|
||
^D7000000/2 ;RP01
|
||
^D5000000/2 ;RP02
|
||
^D5000000/2 ;RP03
|
||
^D8000000/2 ;DUAL POSITIONER MD10
|
||
^D8000000/2 ;SINGLE POSITIONER MD10
|
||
^D1500000/2 ;RS04
|
||
^D2000000/2 ;RP04
|
||
^D2000000/2 ;RP06
|
||
^D2000000/2 ;RM03
|
||
^D2000000/2 ;RP07
|
||
^D2000000/2 ;RP20
|
||
^D2000000/2 ;RA80
|
||
^D2000000/2 ;RA81
|
||
^D2000000/2 ;RA60
|
||
SUBTTL MANDATORY ONCE ONLY CODE -- GOHOME - REWRITE HOME BLOCKS
|
||
|
||
|
||
GOHOME::PUSHJ P,GTMNB1 ;GET A MONITOR BUFFER
|
||
HLRZ U,SYSUNI## ;POINT TO FIRST UNIT IN SYSTEM
|
||
PUSH P,[EXP 0] ;INIT COUNTER
|
||
|
||
GOHOM1: MOVSI T1,UNPHWP!UNPOFL ;BITS TO TEST
|
||
MOVSI T2,UNPCHG ;AND MORE
|
||
TDNN T1,UNIDES(U) ;HARDWARE WRITE PROTECT OR OFFLINE?
|
||
TDNN T2,UNIDES(U) ;PARAMETERS CHANGE?
|
||
JRST GOHOM2 ;IGNORE THIS UNIT
|
||
PUSHJ P,HOMWRT ;REWRITE THE HOME BLOCKS
|
||
AOS (P) ;INDICATE DISK WAS WRITTEN
|
||
|
||
GOHOM2: MOVEI T3,UNVNPM ;NO-PACK-MOUNTED STATE
|
||
MOVSI T1,UNPNMU ;NOT-OUR-DISK-SET FLAG
|
||
TDNE T1,UNIDES(U) ;IS IT ON?
|
||
DPB T3,UNYUST## ;YES--MAKE IT USEABLE
|
||
MOVSI T1,UNPTSB ;GET TIMESHARED BIT(S) IN UNIDES
|
||
ANDCAM T1,UNIDES(U) ;CLEAR THEM OUT
|
||
IFN FTDUAL,<
|
||
LDB T3,UNYUST## ;GET STATE TO PROPAGATE
|
||
SKIPE T2,UNI2ND(U) ;ALTERNATE PORT?
|
||
ANDCAM T1,UNIDES(T2) ;CLEAR THEM HERE TOO
|
||
EXCH T2,U ;SWAP FOR BYTE POINTERS
|
||
SKIPE U ;IF A SECOND PORT,
|
||
DPB T3,UNYUST## ;PROPAGATE PACK STATE
|
||
EXCH T2,U ;SWAP BACK
|
||
>; END IFN FTDUAL
|
||
HLRZ U,UNISYS(U)
|
||
JUMPN U,GOHOM1 ;UNITS ARE LEFT-GO FOR MORE
|
||
POP P,T1 ;GET FLAG BACK
|
||
JUMPE T1,GOHOM3 ;NO MESSAGE IF NOTHING HAPPENED
|
||
MOVEI T1,[ASCIZ /[HOME blocks updated]/]
|
||
PUSHJ P,CONOUT## ;PRINT MESSAGE
|
||
|
||
GOHOM3: PUSHJ P,GTODDB ;GET ONCE-ONLY DDB ADDRESS
|
||
SETZ T1, ;FIND FIRST STRUCTURE TO REFRESH
|
||
PUSHJ P,RFIND ;...
|
||
SKIPA ;NOTHING TO REFRESH
|
||
PUSHJ P,.REFRE ;REFRESH SOMETHING
|
||
JFCL ;IGNORE ERRORS
|
||
POPJ P, ;RETURN
|
||
SUBTTL MANDATORY ONCE ONLY CODE -- KONCE - KILL OFF ONCE-ONLY DATA BASE
|
||
|
||
|
||
KONCE:: PUSHJ P,SAVE2## ;SAVE P1 AND P2
|
||
PUSH P,U ;SAVE U
|
||
HLRZ U,SYSUNI## ;POINT TO START OF UNITS
|
||
|
||
KONCE1: PUSHJ P,KUNIT ;KILL OFF UNIT-RELATED PARAMETERS
|
||
HLRZ U,UNISYS(U) ;LINK TO NEXT UNIT
|
||
JUMPN U,KONCE1 ;LOOP FOR ALL UNITS
|
||
MOVE P1,STRAOB## ;AOBJN POINTER TO STRUCTURE TABLE
|
||
|
||
KONCE2: SKIPE P2,TABSTR##(P1) ;GET A STR DB
|
||
PUSHJ P,KSTR ;KILL IT OFF
|
||
AOBJN P1,KONCE2 ;LOOP FOR ALL STRUCTURES
|
||
POP P,U ;RESTORE U
|
||
POPJ P, ;RETURN
|
||
KSTR: MOVEI T1,STRLEN## ;STR DB LENGTH
|
||
MOVE T2,P2 ;STR DB ADDRESS
|
||
PUSH P,STRFSN##(P2) ;SAVE OUR FSN
|
||
PUSHJ P,GIVWDS## ;RELEASE CORE
|
||
POP P,T1 ;RESTORE THE FSN
|
||
HRRZS T1 ;ISOLATE FSN
|
||
SETZM TABSTR##(T1) ;CLEAR TABSTR ENTRY
|
||
POPJ P, ;RETURN
|
||
|
||
KUNIT: SETZM UNIHID(U) ;CLEAR OUT LOGICAL UNIT NAME
|
||
SETZM UNILOG(U) ;CLEAR OUT NAME OF LOGICAL UNIT WITHIN STR
|
||
SETZM UNISTR(U) ;CLEAR OUT LINKS TO STR
|
||
HRRZS UNIGRP(U) ;CLEAR CLUSTERS TRIED FOR ON O/P
|
||
SETOM UNISUN(U) ;SAY NOT IN ASL
|
||
PUSHJ P,DELSAB ;DELETE SAB RING AND SPT TABLE
|
||
MOVEI T1,0 ;GET A ZERO
|
||
DPB T1,UNYBPC## ;CLEAR BLOCKS PER CLUSTER
|
||
DPB T1,UNYSIC## ;CLEAR SATS IN CORE
|
||
DPB T1,UNYSPU## ;CLEAR SATS PER UNIT
|
||
PUSHJ P,DELSST ;DELETE SWAPPING SATS
|
||
MOVSI T1,UNPNMU ;WRONG-DISK-SET FLAG
|
||
ANDCAM T1,UNIDES(U) ;CLEAR IT UNTIL NEXT TIME WE SET IT
|
||
POPJ P, ;RETURN
|
||
SUBTTL UNIT ROUTINES -- CHGUNI - CHANGE
|
||
|
||
|
||
CHGUNI::AOSE BLURBF ;OPERATOR SEEN THIS TEXT BEFORE?
|
||
JRST CHGUN1 ;YES--SKIP IT
|
||
PUSHJ P,PRSCON## ;DOES HE KNOW WHAT HE'S DOING?
|
||
JRST CHGUN1 ;MAYBE--GIVE HIM A BREAK
|
||
MOVEI T1,INTRO ;POINT TO INTRODUCTORY TEXT
|
||
PUSHJ P,CONOUT## ;PRINT IT
|
||
MOVEI T1,REFPRM ;SPECIAL PARAMETER DISCLAIMER
|
||
PUSHJ P,CONOUT## ;PRINT IT
|
||
|
||
CHGUN1: MOVEI T1,[ASCIZ /Unit to change/]
|
||
SETZ T2, ;NO DEFAULT
|
||
PUSHJ P,PRSSIX## ;PROMPT AND FETCH ANSWER
|
||
JUMPE T1,VFCORE ;GO VERIFY INCORE DATA BASE IF NO MORE
|
||
HLRZ U,SYSUNI## ;GET FIRST UNIT DATA BLOCK IN SYSTEM
|
||
|
||
CHGUN2: CAME T1,UNIHID(U) ;MATCH ON UNIT ID
|
||
CAMN T1,UDBNAM(U) ; OR DRIVE NAME
|
||
JRST CHGUN3 ;FOUND IT
|
||
HLRZ U,UNISYS(U) ;LINK TO NEXT UNIT IN SYSTEM
|
||
JUMPN U,CHGUN2 ;LOOP BACK AND TRY AGAIN
|
||
MOVEI T2,[ASCIZ /does not exist/]
|
||
PUSHJ P,UWARN ;WARN OPERATOR
|
||
JRST CHGUNI ;AND TRY AGAIN
|
||
|
||
CHGUN3: PUSHJ P,CKUSTR ;MAKE SURE WE ASK ABOUT MOUNTED UNITS
|
||
JRST CHGUNI ;HE ABORTED THIS ONE
|
||
HRRZ P2,UNISTR##(U) ;LOAD UP THE STR POINTER, IF ANY
|
||
MOVEI T1,[ASCIZ /Do you want to see the BAT blocks/]
|
||
MOVSI T2,'NO ' ;DEFAULT
|
||
PUSHJ P,PRSYNQ## ;PROMPT AND FETCH ANSWER
|
||
MOVEM T1,BATFLG ;SAVE FOR LATER USE
|
||
MOVEI T1,[ASCIZ /Parameters for unit /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
MOVE T2,UDBNAM(U) ;GET NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
PUSHJ P,GETUID ;GET UNIT ID
|
||
PUSHJ P,GETSPU ;GET SATS PER UNIT
|
||
PUSHJ P,GETSIC ;GET SATS IN CORE
|
||
PUSHJ P,GETK4S ;GET K FOR SWAPPING
|
||
PUSHJ P,GETSWB ;GET FIRST SWAPPING BLOCK NUMBER
|
||
PUSHJ P,GETCFS ;GET CLASS FOR SWAPPING
|
||
PUSHJ P,GETASL ;GET SINGLE UNIT ASL INFO
|
||
SKIPN BATFLG ;DO WE WANT TO SEE THE BAT BLOCKS?
|
||
JRST CHGUN4 ;NO--SKIP THIS
|
||
MOVEI T1,0 ;YES--GET FLAG FOR OPTIONAL INIT OF BAD BLOCKS
|
||
PUSHJ P,GETBAT ;CHECK AND DISPLAY THE BAF
|
||
PUSHJ P,INIBAT ;INITIALIZE IF NEEDED
|
||
|
||
CHGUN4: JRST CHGUNI ;LOOP BACK FOR ANOTHER UNIT
|
||
SUBTTL UNIT ROUTINES -- ONCBND - BIND CI UNITS
|
||
|
||
|
||
;ROUTINE CALLED BEFORE READING HOM BLOCKS TO BIND UNATTACHED UNITS.
|
||
;CALL:
|
||
; PUSHJ P,ONCBND
|
||
;RETURN:
|
||
; CPOPJ ALWAYS
|
||
|
||
IFN FTCIDSK,<
|
||
ONCBND::SKIPE [M.RAX##] ;SKIP IF RAXKON NOT INCLUDED
|
||
SKIPE BNDFLG## ;ALREADY BEEN HERE?
|
||
POPJ P, ;YES
|
||
PUSHJ P,SAVT## ;SAVE ACS
|
||
MOVEI T1,[SE1ENT ;LOAD ROUTINE TO EXECUTE
|
||
SKIPN T2,.CPPCB##-.CPCDB##(P1) ;GET PCB ADDRESS
|
||
POPJ P, ;NONE, RETURN
|
||
MOVE T2,.PCSTS(T2) ;GET STATUS FLAGS
|
||
TLNN T2,(ST.DED) ;IS THE KLIPA DEAD?
|
||
SETO T3, ;NO, REMEMBER WE HAD A RUNNING ONE
|
||
POPJ P,]
|
||
SETZ T3, ;START AFRESH
|
||
PUSHJ P,CPUAPP## ;DOES ANY CPU HAVE A KLIPA WHICH IS RUNNING?
|
||
JUMPE T3,CPOPJ## ;IF NOT, DON'T BOTHER WAITING
|
||
MOVEI T1,[ASCIZ /
|
||
[Initializing CI network] /] ;GET MESSAGE
|
||
PUSHJ P,ICONM## ;TELL THE OPERATOR
|
||
PUSHJ P,OPOUT## ;FORCE OUTPUT
|
||
MOVE T1,BNDTIM ;HOW MANY SECONDS TO WAIT
|
||
IMUL T1,TICSEC## ;CONVERT TO TICKS
|
||
ADD T1,BNDBEG ;FIND OUT WHEN THE WAIT IS OVER
|
||
ONCBN1: CAMLE T1,APRTIM## ;HAVE WE WAITED LONG ENOUGH?
|
||
JRST [REPEAT 4,<IMULI P,1> ;STALL
|
||
JRST ONCBN1] ;CHECK AGAIN
|
||
MOVEI T1,[ASCIZ /
|
||
|
||
/]
|
||
PUSHJ P,ICONM## ;START THE MESSAGE
|
||
PUSHJ P,OPOUT## ;FLUSH THE OUTPUT
|
||
ONCBN2: SETOM BNDFLG## ;WE'RE READY TO BIND THE UNITS NOW
|
||
; SO FUTURE ONLINES SHOULD BIND THEMSELVES
|
||
MOVEI J,KDBTAB##+.TYDSK-KDBNXT ;SET UP INITIAL LINK
|
||
ONCBN3: SKIPN J,KDBNXT(J) ;GET NEXT KDB ADDRESS
|
||
POPJ P, ;RETURN WHEN DONE
|
||
LDB T1,KOYKTP## ;GET KONTROLLER TYPE
|
||
CAIE T1,TYPRA ;CI DISK?
|
||
JRST ONCBN3 ;NO, SKIP IT
|
||
SETZB P1,ONLFLG ;START WITH CPU0, SET END PACKET FLAGS TO ZERO
|
||
ONCBN4: MOVEI P2,1 ;GET A BIT
|
||
LSH P2,(P1) ;POSITION FOR CPUN
|
||
TDNN P2,KDBCAM(J) ;CAN THIS CPU ACCESS THIS KONTROLLER?
|
||
JRST ONCBN8 ;NO, ON TO NEXT CPU
|
||
HLRE P3,KDBIUN(J) ;GET -VE NUMBER OF UNITS
|
||
SETCA P3,P3 ;START WITH HIGHEST UNIT
|
||
|
||
ONCBN5: SKIPN U,@KONPTR(J) ;GET A UDB ADDRESS
|
||
JRST ONCBN7 ;NOT FOR THIS UNIT NUMBER
|
||
HRRZ T1,UNIALT(U) ;SEE IF ALTERNATE PORT ALREADY ATTACHED
|
||
JUMPE T1,ONCBN6 ;JUMP IF NO ALTERNATE
|
||
MOVEI T2,CPUMSK ;MASK FOR ALL CPU BITS
|
||
TDNE T2,UDBCAM(T1) ;ANY CPU HAVE ALTERNATE PORT ATTACHED?
|
||
JRST ONCBN7 ;YES, DON'T BIND THIS UNIT
|
||
MOVE T1,UDBKDB(T1) ;ALTERNATE KDB
|
||
MOVE T1,KONBSY(T1) ;HAVE WE ALREADY PROCESSED ALTERNATE KDB?
|
||
TLNE T1,KOPBND
|
||
JRST ONCBN6 ;YES, BIND UNIT HERE AS WILL NOT BE BOUND ELSEWHERE
|
||
LDB T1,KOYKNM## ;GET KONTROLLER NUMBER
|
||
LDB T2,UNYKOF## ;GET KONTAB OFFSET
|
||
XOR T1,T2 ;TRY TO BIND HALF OF THE UNITS ON EACH KDB
|
||
TRNE T1,1 ;...
|
||
JRST ONCBN7 ;LET ALTERNATE KDB TACKLE THIS ONE
|
||
ONCBN6: TDNE P2,UDBCAM(U) ;IS THIS UNIT ALREADY BOUND ON THIS CPU?
|
||
JRST ONCBN7 ;YES
|
||
PUSH P,U ;SAVE UDB ADDRESS
|
||
HRRZ U,UNIALT(U) ;ALTERNATE UNIT
|
||
SKIPE U ;IF AN ALTERNATE,
|
||
PUSHJ P,DETUDB## ; REMOVE FROM UNISYS CHAIN, PUT ON SYSDET CHAIN
|
||
POP P,U ;RESTORE UDB ADDRESS
|
||
MOVE T1,P1 ;COPY CPU NUMBER
|
||
XCTCPU (CPN,ONCONL) ;BIND THE UNIT
|
||
PUSHJ P,BNDERR ;ERROR, PRINT SOMETHING
|
||
ONCBN7: SOJGE P3,ONCBN5 ;LOOP FOR ALL UNITS
|
||
ONCBN8: CAIGE P1,M.CPU##-1 ;DONE THEM ALL?
|
||
AOJA P1,ONCBN4 ;NO, LOOP FOR OTHER CPUS
|
||
MOVSI T1,KOPBND ;GET A BIT TO TEST
|
||
IORM T1,KONBSY(J) ;SHOW WE'VE PROCESSED THIS KDB
|
||
JRST ONCBN3 ;BACK TO NEXT KONTROLLER
|
||
;HERE IF ONLINE FAILED
|
||
|
||
BNDERR: PUSHJ P,PRSSET## ;SET UP SPECIAL BUFFER, .CPTOA, ETC.
|
||
PUSH P,T1 ;SAVE OLD CHARACTER TYPER
|
||
MOVEI T1,[ASCIZ /online failed/]
|
||
PUSHJ P,CONMES## ;STORE TEXT
|
||
IFN FTMP,<
|
||
MOVEI T1,[ASCIZ / via CPU/]
|
||
PUSHJ P,CONMES## ;MORE
|
||
MOVEI T3,"0"(P1) ;GET CPU NUMBER
|
||
PUSHJ P,COMTYO## ;PRINT DIGIT
|
||
>; END IFN FTMP
|
||
POP P,.CPTOA## ;RESTORE CHARACTER STICKER
|
||
MOVE T1,UDBNAM(U) ;GET DRIVE NAME
|
||
MOVEI T2,TXTBUF## ;POINT TO GENERATED TEXT
|
||
PJRST UWARN ;WARN OPERATOR AND RETURN
|
||
|
||
BNDBEG::BLOCK 1 ;TIME STAMP
|
||
BNDTIM: M.BNDT## ;SECS TO WAIT FOR CI NETWORK TO SETTLE
|
||
>; END IFN FTCIDSK
|
||
|
||
SUBTTL UNIT ROUTINES -- SHWUNI - SHOW
|
||
|
||
|
||
SHWUNI::HLRZ U,SYSUNI## ;FIND FIRST UNIT IN SYSTEM
|
||
JUMPE U,[ ;JUMP IF NONE
|
||
MOVEI T1,[ASCIZ /% No units found/]
|
||
AOS (P) ;SKIP ANYWAY
|
||
PJRST CONOUT] ;GIVE WARNING AND RETURN
|
||
MOVEI T1,[ASCIZ /Unit/]
|
||
SETZ T2, ;NO DEFAULT STRUCTURE NAME
|
||
PUSHJ P,PRSSIX## ;GET A SIXBIT QUANTITY
|
||
JUMPE T1,CPOPJ1## ;GIVE UP IF NO RESPONSE
|
||
HLRZ U,SYSUNI## ;FIRST UNIT IN SYSTEM
|
||
PUSHJ P,FNDALL ;DID THE USER ASK FOR ALL?
|
||
JRST SHWUN2 ;NO, GO FIND THE UNIT
|
||
|
||
SHWUN1: PUSHJ P,SHWUNT ;SHOW A UNIT
|
||
HLRZ U,UNISYS(U) ;GET THE NEXT UNIT
|
||
JUMPN U,SHWUN1 ;LOOP IF MORE
|
||
JRST SHWUNI ;LOOP IN CASE HE WANTS TO SEE ONE AGAIN
|
||
|
||
SHWUN2: CAME T1,UDBNAM(U) ;DRIVE NAME?
|
||
CAMN T1,UNIHID(U) ; OR UNIT ID?
|
||
JRST SHWUN3 ;YES
|
||
HLRZ U,UNISYS(U) ;LINK TO NEXT
|
||
JUMPN U,SHWUN2 ;KEEP SEARCHING
|
||
MOVEI T2,[ASCIZ /does not exist/]
|
||
PUSHJ P,UWARN ;WARN OPERATOR
|
||
JRST SHWUNI ;TRY AGAIN
|
||
|
||
SHWUN3: PUSHJ P,SHWUNT ;SHOW THE UNIT
|
||
MOVSI T1,UNPNMU ;WRONG-DISK-SET FLAG
|
||
TDNE T1,UNIDES(U) ;CHECK IT
|
||
JRST SHWUN4 ;CAN'T DO THIS IF SO
|
||
MOVEI T1,[ASCIZ /Do you want to see the bad regions/]
|
||
MOVSI T2,'NO ' ;DEFAULT
|
||
PUSHJ P,PRSYNQ## ;PROMPT AND FETCH ANSWER
|
||
JUMPE T1,SHWUN4 ;NO--SKIP THIS
|
||
MOVEM T1,BATFLG ;SAVE FOR LATER
|
||
MOVEI T1,1 ;CODE FOR NO OPERATOR OPTION
|
||
PUSHJ P,GETBAT ;CHECK OUT BAT BLOCKS
|
||
JFCL ;IGNORE ERRORS
|
||
|
||
SHWUN4: JRST SHWUNI ;AND LOOP FOR MORE
|
||
|
||
SHWUNT: PUSHJ P,CRLFOP## ;START WITH A BLANK LINE
|
||
MOVEI T1,[ASCIZ /Parameters for unit /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
MOVE T2,UDBNAM(U) ;GET NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
MOVEI T1,[ASCIZ / Unit ID: /]
|
||
PUSHJ P,ICONM## ;PRINT IT
|
||
MOVE T2,UNIHID(U) ;GET ID
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
MOVEI T1,[ASCIZ / *K for swapping: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
LDB T1,UNYK4S## ;GET K FOR SWAPPING
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
LDB T1,UNYK4S## ;GET K FOR SWAPPING
|
||
JUMPE T1,SHWUT1 ;NO SWAPPING STUFF IF NO SPACE ALLOCATED
|
||
|
||
MOVEI T1,[ASCIZ / *First logical block for swapping: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
MOVE T1,UNISLB(U) ;GET VALUE
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
MOVEI T1,[ASCIZ / Swapping class: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
LDB T1,UNYCFS## ;GET CLASS
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
SHWUT1: MOVEI T1,[ASCIZ / *SAT blocks per unit: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
LDB T1,UNYSPU## ;GET SATS PER UNIT
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
MOVEI T1,[ASCIZ / SAT blocks in core: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
LDB T1,UNYSIC## ;GET SATS IN CORE
|
||
PUSHJ P,PRTDIG## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
MOVEI T1,[ASCIZ / Unit in the ASL: /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
SKIPGE UNISUN(U) ;IN THE ASL?
|
||
TDZA T1,T1 ;NO
|
||
MOVEI T1,1 ;YES
|
||
MOVE T2,[EXP <'NO '>,<'YES '>](T1) ;TRANSLATE
|
||
PUSHJ P,PRNAME## ;PRINT VALUE
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
HRRZ T1,UNISTR(U) ;GET UPWARD POINTER TO STRUCTURE
|
||
JUMPE T1,SHWUT2 ;NOT IN A STR
|
||
MOVEI T1,[ASCIZ / Unit in structure /]
|
||
PUSHJ P,ICONM## ;PRINT TEXT
|
||
HRRZ T2,UNISTR(U) ;GET STR POINTER
|
||
MOVE T2,STRNAM##(T2) ;AND ITS NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
PUSHJ P,CRLFOP## ;END LINE
|
||
|
||
SHWUT2: MOVSI T1,UNPNMU ;WRONG-DISK-SET BIT
|
||
TDNN T1,UNIDES(U) ;IS IT SET?
|
||
JRST SHWUT3 ;NO--DON'T SAY IT IS
|
||
MOVEI T1,[ASCIZ / Unit in a disk set not mounted to this system/]
|
||
PUSHJ P,CONOUT## ;DUMP THE MESSAGE
|
||
|
||
SHWUT3: POPJ P, ;RETURN
|
||
|
||
|
||
FNDALL: TRNE T1,-1 ;DOES RESPONSE HAVE MORE THAN 3 CHARACTERS?
|
||
POPJ P, ;YES, THEN IT'S NOT ALL, RETURN
|
||
REPEAT 0,<
|
||
MOVE T2,[SIXBIT /ALL/] ;SET UP AC FOR COMPARE
|
||
TLNE T1,77 ;DO WE HAVE THREE CHARACTERS EXACTLY?
|
||
JRST FNDAL1 ;YES
|
||
TLNE T1,7777 ;DO WE HAVE TWO OR ONE?
|
||
TLZA T2,77 ;TWO, MASK COMPARE AC
|
||
TLZ T2,7777 ;JUST ONE, FIX COMPARE AC
|
||
FNDAL1: CAMN T1,T2 ;DID THE USER ASK FOR ALL?
|
||
> ;END OF REPEAT 0
|
||
CAMN T1,[SIXBIT /ALL/] ;DID THE USER ASK FOR ALL?
|
||
AOS (P) ;YES, SKIP RETURN
|
||
POPJ P, ;RETURN
|
||
|
||
SUBTTL VOLUME ID PROCESSING -- CHKVSY - CHECK ID
|
||
|
||
|
||
;SUBROUTINE TO CHECK VOLUME ID TYPE
|
||
;CALL WITH:
|
||
; P1 = ADDRESS OF HOME BLOCK
|
||
; PUSHJ P,CHKVSY
|
||
; RETURN HERE IF VOLUME ID TYPE IS 'TOPS-10'
|
||
; RETURN HERE IF VOLUME ID TYPE IS NOT 'TOPS-10', WITH
|
||
; T1 = BYTE POINTER TO VOLUME ID TYPE STRING IN ASCIZ
|
||
|
||
CHKVSY: PUSHJ P,SAVE2## ;SAVE P1-P2
|
||
MOVEI P1,HOMVSY## ;OFFSET TO VOLUME ID
|
||
LSH P1,2 ;MAKE BYTE ADDRESS
|
||
MOVE T3,[POINT 7,VSYBFR] ;POINTER TO TEMP BUFFER
|
||
MOVEI T4,3*4 ;3 WORDS OF 4 BYTES EACH
|
||
|
||
CHKVS1: MOVE T1,P1 ;T1 IS BYTE ADDRESS
|
||
PUSHJ P,VOLIDP ;GET POINTER
|
||
ADD T1,-2(P) ;ADD ADDRESS OF BUFFER
|
||
LDB T2,T1 ;GET THE BYTE
|
||
SKIPN T2 ;IF NULL,
|
||
MOVEI T2," " ; MAKE A BLANK
|
||
IDPB T2,T3 ;STUFF IN TEMP BUFFER
|
||
CAIE T2," " ;NON-BLANK?
|
||
MOVE P2,T3 ;YES, SAVE POINTER TO END OF SYSTEM TYPE
|
||
SOSLE T4 ;QUIT IF DONE
|
||
AOJA P1,CHKVS1 ;LOOP FOR MORE
|
||
DMOVE T1,VSYBFR ;GET DECODED SYSTEM TYPE
|
||
MOVE T3,VSYBFR+2 ;3 WORDS WORTH
|
||
CAMN T1,[ASCII .TOPS-.] ;IS IT 'TOPS-10'?
|
||
CAME T2,[ASCII .10 .] ;...
|
||
JRST CHKVS2 ;NO
|
||
CAMN T3,[ASCII . .] ;LAST WORD HAVE 2 BLANKS?
|
||
POPJ P, ;YES, SYSTEM TYPE IS VALID
|
||
|
||
CHKVS2: AOS (P) ;SET FOR SKIP RETURN
|
||
CAMN T1,[ASCII . .] ;NULL SYSTEM TYPE?
|
||
CAME T2,[ASCII . .] ;...
|
||
JRST CHKVS3 ;NO
|
||
CAMN T3,[ASCII . .] ;LAST WORD HAVE 2 BLANKS?
|
||
SKIPA T1,[[ASCIZ /unknown/]] ;GENERIC TEXT
|
||
|
||
CHKVS3: MOVEI T1,VSYBFR ;ADDRESS OF DECODED SYSTEM TYPE TEXT
|
||
SETZ T2, ;GET A ZERO
|
||
IDPB T2,P2 ;TERMINATE SYSTEM TYPE AS ASCIZ
|
||
POPJ P, ;RETURN
|
||
|
||
;BUFFER TO EXTRACT SYSTEM TYPE FIELD FROM VOLUME ID BLOCK
|
||
|
||
VSYBFR: BLOCK 3 ;12 CHARACTERS OF SYSTEM TYPE
|
||
SUBTTL VOLUME ID PROCESSING -- VOLIDN - STORE ONE SIXBIT WORD
|
||
|
||
|
||
;SUBROUTINE TO STORE 1 SIXBIT WORD IN VOLUME ID
|
||
;CALL WITH:
|
||
; T1 = BYTE # WITHIN HOME BLOCK (PDP-11 WISE)
|
||
; T2 = WORD
|
||
; P1 = ADDRESS OF HOME BLOCK
|
||
; PUSHJ P,VOLIDN
|
||
; RETURN HERE
|
||
;
|
||
VOLIDN: PUSHJ P,SAVE1## ;SAVE P1
|
||
PUSH P,T1
|
||
MOVEI P1,-1(T1) ;SETUP ADDRESS
|
||
MOVEI T4,6 ;BYTE COUNT
|
||
|
||
VOLDN1: MOVEI T3,0 ;CLEAR WORD
|
||
ROTC T2,6 ;COPY BYTE
|
||
ADDI T3,"0"-'0' ;CONVERT TO ASCII
|
||
AOS T1,P1 ;T1 IS BYTE ADDRESS
|
||
PUSHJ P,VOLIDP ;GET POINTER
|
||
ADD T1,-2(P) ;ADD ADDRESS OF BUFFER
|
||
DPB T3,T1 ;STORE IN BUFFER
|
||
SOJG T4,VOLDN1 ;LOOP OVER WHOLE WORD
|
||
JRST TPOPJ## ;RETURN
|
||
SUBTTL VOLUME ID PROCESSING -- VOLIDP - COMPUTE BYTE POINTERS
|
||
|
||
|
||
;SUBROUTINE TO COMPUTE BYTE POINTER TO BYTE IN VOLID PART
|
||
;CALL WITH:
|
||
; T1 = BYTE NUMBER WITHIN HOME BLOCK
|
||
; PUSHJ P,VOLIDP
|
||
; RETURN HERE WITH POINTER IN T1
|
||
;
|
||
VOLIDP: PUSH P,T2
|
||
IDIVI T1,4 ;T1=WORD #, T2=BYTE #
|
||
ADD T1,VOLPTT(T2) ;GET CORRECT POINTER
|
||
JRST T2POPJ## ;RETURN
|
||
|
||
VOLPTT: POINT 7,0,17 ;BYTE 0
|
||
POINT 7,0,9 ;BYTE 1
|
||
POINT 7,0,35 ;BYTE 2
|
||
POINT 7,0,27 ;BYTE 3
|
||
SUBTTL VOLUME ID PROCESSING -- VOLPPN - GENERATE A PPN
|
||
|
||
|
||
; SUBROUTINE TO GENERATE A PPN
|
||
; CALL: PUSHJ P,VOLPPN
|
||
; RETURN HERE WITH T1&T2 CONTAINING PPN STRING IN SIXBIT
|
||
;
|
||
VOLPPN: PUSHJ P,SAVE2## ;SAVE P1 AND P2
|
||
SETZB T1,T2 ;CLEAR RESULT
|
||
MOVE P2,[POINT 6,T1] ;BYTE POINTER TO STORE RESULT
|
||
MOVEI T3,'[' ;GET A BRACKET
|
||
PUSHJ P,VOLCHR ;STORE IT
|
||
HLRZ T3,HOMOPP##(P1) ;GET PROJECT #
|
||
CAIN T3,777777 ;WILD?
|
||
JRST [MOVEI T3,'*' ;YES
|
||
PUSHJ P,VOLCHR ;TYPE *
|
||
JRST .+2] ;ONWARD
|
||
PUSHJ P,VOLOCT ;CONVERT IT
|
||
MOVEI T3,',' ;GET A COMMA
|
||
PUSHJ P,VOLCHR ;STORE IT
|
||
HRRZ T3,HOMOPP##(P1) ;GET PROGRAMMER #
|
||
CAIN T3,777777 ;WILD?
|
||
JRST [MOVEI T3,'*' ;YES
|
||
PUSHJ P,VOLCHR ;TYPE *
|
||
JRST .+2] ;ONWARD
|
||
PUSHJ P,VOLOCT ;CONVERT IT
|
||
MOVEI T3,']' ;GET A BRACKET
|
||
PJRST VOLCHR ;STORE IT AND RETURN
|
||
|
||
|
||
VOLOCT: IDIVI T3,10 ;DIVIDE BY RADIX
|
||
PUSH P,T4 ;SAVE REMAINDER
|
||
SKIPE T3 ;DONE?
|
||
PUSHJ P,VOLOCT ;NO - RECURSE
|
||
POP P,T3 ;GET CHARACTER
|
||
ADDI T3,'0' ;MAKE IT SIXBIT
|
||
|
||
VOLCHR: TRNN T2,77 ;12 CHARACTERS MAXIMUM
|
||
IDPB T3,P2 ;STORE CHARACTER
|
||
POPJ P, ;RETURN
|
||
SUBTTL VOLUME ID PROCESSING -- WRTVID - WRITE VOLUME ID FIELDS
|
||
|
||
|
||
;SUBROUTINE TO SETUP VOLUME ID FIELDS IN HOME BLOCK
|
||
;CALL WITH:
|
||
; P1 = ADDRESS OF HOME BLOCK
|
||
; PUSHJ P,WRTVID
|
||
; RETURN HERE
|
||
;
|
||
WRTVID: MOVEI T1,HOMVID## ;GET OFFSET TO VOLUME ID
|
||
LSH T1,2 ;MAKE BYTE ADDRESS
|
||
MOVE T2,HOMHID##(P1) ;GET PACK NAME
|
||
PUSHJ P,VOLIDN ;STORE IN BLOCK
|
||
ADDI T1,6 ;SKIP AHEAD
|
||
MOVEI T2,0 ;BLANKS
|
||
PUSHJ P,VOLIDN ;STORE IN BLOCK
|
||
MOVEI T1,HOMVSY## ;GET SYSTEM TYPE
|
||
LSH T1,2 ;CONVERT TO BYTES
|
||
MOVE T2,[SIXBIT "TOPS-1"]
|
||
PUSHJ P,VOLIDN ;STORE IN BLOCK
|
||
ADDI T1,6 ;BUMP 1 1/2 WORDS
|
||
MOVSI T2,'0 ' ;ADD IN ZERO
|
||
PUSHJ P,VOLIDN ;STORE NAME
|
||
DMOVE T1,[EXP <SIXBIT/SYSTEM/>,0] ;ASSUME NO OWNER PPN
|
||
SKIPE HOMOPP##(P1) ;IS THERE AN OWNER
|
||
PUSHJ P,VOLPPN ;YES -GENERATE PPN
|
||
EXCH T1,T2 ;SWAP WORDS
|
||
PUSH P,T1 ;SAVE SECOND WORD
|
||
MOVEI T1,HOMOWN##
|
||
LSH T1,2
|
||
PUSHJ P,VOLIDN
|
||
ADDI T1,6
|
||
POP P,T2 ;GET SECOND WORD BACK
|
||
PJRST VOLIDN
|
||
;START OF VERIFY CODE
|
||
VFCORE::SETZM SERIUS ;INIT SERIOUS ERROR FLAG
|
||
SETZM BATMAN ;ASSUME OPTIONAL FOR VENDING BAT BLOCKS
|
||
PUSHJ P,CHKSTR ;MAKE SURE ALL STRS HAVE ALL NECESSARY UNITS
|
||
PUSHJ P,BOOTDB## ;IF DEBUGGING, HACK UP THE SSL/SDL/ASL
|
||
PUSHJ P,BLDSSL## ;BUILD SYSTEM SEARCH LIST FROM PRESERVED COPY
|
||
PUSHJ P,DSKSSL ;USE THE DISK DATA BASE
|
||
PUSHJ P,BLDASL## ;BUILD ACTIVE SWAPPING LIST FROM PRESERVED COPY
|
||
JFCL ;IGNORE ERRORS
|
||
PUSHJ P,DSKASL ;USE THE DISK DATA BASE
|
||
PUSHJ P,BLDSDL## ;BUILD SYSTEM DUMP LIST FROM PRESERVED COPY
|
||
PUSHJ P,DSKSDL ;USE THE DISK DATA BASE
|
||
MOVE T1,SERIUS ;GET SERIOUS ERROR COUNT
|
||
IOR T1,ERRHOM ;AND HOME BLOCK ERROR COUNT
|
||
SKIPN T1 ;ANY ERRORS?
|
||
AOS (P) ;NO - SKIP RETURN
|
||
POPJ P, ;RETURN
|
||
SUBTTL SUBROUTINES
|
||
|
||
;SUBROUTINE TO READ A SAT BLOCK & COUNT THE # OF FREE CLUTERS IN IT
|
||
|
||
REDSAT:
|
||
IFN FTXMON,<
|
||
SE1JRS ;MAKE THE SAB RING ADDRESSABLE
|
||
MOVEI T1,(MS.SAT) ;WHERE TO READ THE DATA
|
||
HRRM T1,DEVISN(F) ;STORE SECTION NUMBER FOR MAPIO
|
||
>
|
||
HLLZ T1,SABSCN##(P2) ;GET -VE LENGTH OF THIS SAT BLOCK
|
||
ADDI T1,-1+SABBIT##(P2) ;MAKE AN IOWD PTR. FOR MONRED
|
||
IFN FTXMON,<
|
||
JRST @[0,,.+1] ;OMNRED CAN'T HACK IT IN SECTION 1
|
||
>
|
||
PUSH P,@ONCMBF ;PRESERVE CURRENT MON. BUFFER ADR.
|
||
MOVEM T1,@ONCMBF ;STORE NEW IOWD FOR SAT BLOCK
|
||
PUSHJ P,OMNRED ;GO READ IN "SAT" BLOCK
|
||
JRST REDST1 ;ERROR WHILE READING SAT BLOCK - NON SKIP RETURN
|
||
AOS T1,@ONCMBF ;MAKE IOWD BACK INTO AN AOBJN PTR.
|
||
PUSH P,R ;SAVE R
|
||
IFN FTXMON,<
|
||
SE1JRS ;BACK TO SECTION 1
|
||
MOVSI R,(MS.SAT) ;DATA SECTION
|
||
>
|
||
IFE FTXMON,<
|
||
SETZ R,
|
||
>
|
||
PUSHJ P,SATCN## ;COUNT 0 BITS IN SAT BLOCK
|
||
POP P,R ;RESTORE R
|
||
HRRZM T2,SABTAL##(P2) ;STORE FREE CLUSTERS IN THIS SAT
|
||
SETOM SABHOL##(P2) ;DONT KNOW SIZE OF LARGEST HOLE
|
||
HRRZS T2 ;CLEAR OUT LH
|
||
MOVSI T1,SAPDOB## ;CLEAR SAT BAD & SAT IN CORE DIFFERENT FROM ON DISK
|
||
ANDCAM T1,SABFIR##(P2)
|
||
DPB P1,SAZNDX## ;STORE SAT BLOCK INDEX # IN IN SAB BLOCK
|
||
HRRZ T1,UNICPS(U) ;GET # CLUSTERS PER SAT FOR THIS UNIT
|
||
IMULI T1,(P1) ;TIMES SAT BLOCK INDEX
|
||
DPB T1,SAYCLA##
|
||
AOS -1(P) ;SKIP RETURN
|
||
REDST1:
|
||
IFN FTXMON,<
|
||
HLLZS DEVISN(F) ;I/O IS NOW TO SECTION ZERO
|
||
>
|
||
POP P,@ONCMBF ;RESTORE ORIGINAL MON BUFFER ADR.
|
||
POPJ P, ;RETURN
|
||
;SUBROUTINE TO READ THE "RIB" BLOCK FOR SAT.SYS
|
||
|
||
GTSRB: MOVE P4,STRSAT##(P2) ;GET LOG. BLOCK #'S OF 1ST. & 2ND. "RIB" BLOCKS
|
||
MOVE P3,[EXP CODRIB##] ;GET CODE WORD FOR "RIB" BLOCKS
|
||
MOVSI P2,(SIXBIT .SAT.)
|
||
PJRST REDRUN ;READ & VERIFY "RIB" BLOCKS
|
||
|
||
;SUBROUTINE TO GET ONCE-ONLY DDB
|
||
GTODDB: PUSH P,T1
|
||
PUSH P,T2
|
||
MOVEI T1,DDBLEN## ;WORDS REQUIRED
|
||
SKIPN T2,ONCDDB ;ALREADY HAVE DDB?
|
||
PUSHJ P,INICOR## ;ALLOCATE CORE
|
||
MOVEM T2,ONCDDB ;SAVE ADDRESS
|
||
MOVE F,T2 ;SET UP F
|
||
JRST TTPOPJ## ;RESTORE ACS AND RETURN
|
||
|
||
;SUBROUTINE TO RETURN ONCE-ONLY DDB
|
||
GVODDB: MOVEI T1,DDBLEN## ;LENGTH
|
||
SKIPE T2,ONCDDB ;FETCH ADDRESS
|
||
PUSHJ P,GIVWDS## ;GIVE BACK CORE
|
||
SETZM ONCDDB ;ZAP ADDRESS
|
||
POPJ P, ;RETURN
|
||
|
||
;SUBROUTINE TO GIVE THE MONITOR BUFFER TO A DDB
|
||
;RETURNS AN IOWD FOR THE MON BUF IN .UPMBF
|
||
GTMNB1: MOVE T1,[MBLKSZ##,,MONBUF-1]
|
||
MOVEM T1,@ONCMBF
|
||
POPJ P,
|
||
|
||
;SUBROUTINE TO RETURN THE MONITOR BUFFER
|
||
GVMNB0: SETZM @ONCMBF
|
||
POPJ P,
|
||
;SUBROUTINE TO MOVE PARAMETERS FROM "HOME" BLOCK TO UNIT DATA BLOCK
|
||
|
||
MOVUNI: MOVE T1,HOMLOG##(P1)
|
||
MOVEM T1,UNILOG(U)
|
||
MOVE T1,HOMHID##(P1)
|
||
MOVEM T1,UNIHID(U)
|
||
MOVE T1,HOMSID##(P1)
|
||
MOVEM T1,UNISID(U)
|
||
MOVE T1,HOMLUN##(P1)
|
||
DPB T1,UNYLUN##
|
||
SKIPLE T1,HOMHOM##(P1)
|
||
MOVEM T1,UNIHOM(U)
|
||
MOVE T1,HOMGRP##(P1)
|
||
HRLM T1,UNIGRP(U)
|
||
MOVE T1,HOMBPC##(P1)
|
||
DPB T1,UNYBPC##
|
||
MOVE T1,HOMSUN##(P1)
|
||
MOVEM T1,UNISUN(U)
|
||
MOVE T1,HOMSLB##(P1)
|
||
MOVEM T1,UNISLB(U)
|
||
MOVE T1,HOMK4S##(P1)
|
||
DPB T1,UNYK4S##
|
||
MOVE T1,HOMCFS##(P1)
|
||
DPB T1,UNYCFS##
|
||
MOVE T1,HOMSIC##(P1)
|
||
DPB T1,UNYSIC##
|
||
MOVE T1,HOMSPU##(P1)
|
||
DPB T1,UNYSPU##
|
||
MOVSI T2,UNPMSB
|
||
ANDCAM T2,UNIDES(U)
|
||
CAIE T1,1
|
||
IORM T2,UNIDES(U)
|
||
POPJ P,
|
||
;SUBROUTINE TO FIND AN STR DATA BLOCK GIVEN A SIXBIT NAME
|
||
; ENTER WITH T1 = SIXBIT STR NAME TO BE SEARCHED FOR
|
||
; IF NO STR DATA BLOCK FOUND - RETURN WITH:
|
||
; P2 = 0. P3 = LAST STR DATA BLOCK ADR.(DIFSTR IF NO STRS)
|
||
; IF FOUND - SKIP RETURN WITH:
|
||
; P2 = ADR. OF THE STR DATA BLOCK. P4= SYSTEM STR # OF THIS STR
|
||
; P3 = ADR. OF PREVIOUS STR DATA BLOCK (OR DIFSTR IF THE ONLY STR)
|
||
; IN BOTH CASES THE LEADING 4 SIXBIT CHS. IN T1 ARE RESPECTED
|
||
|
||
FNSTR:: TRZ T1,7777 ;STR NAMES CAN BE NO LONGER THAN 4 CHS.
|
||
MOVE P4,STRAOB## ;POINT AT FIRST ENTRY IN STR TABLE
|
||
FNSTR1: SKIPE P2,TABSTR##(P4) ;SKIP IF AN UNUSED SLOT
|
||
CAME T1,STRNAM##(P2) ;SKIP IF USED SLOT MATCHES
|
||
AOBJN P4,FNSTR1 ;LOOP IF EMPTY SLOT OR SLOT DOESN'T MATCH
|
||
JUMPL P4,FNSTR2 ;BRANCH AHEAD IF WE FIND A MATCHING STR
|
||
SETZ P2, ;MAKE SURE P2 RETURNS A ZERO IF WE FAIL
|
||
POPJ P, ;GIVE NONSKIP RETURN IF WE FAIL
|
||
|
||
;HERE IF WE FIND IT. SCAN LIST IN FORWARD DIRECTION FOR PREDECESSOR
|
||
FNSTR2: HRRZS P4 ;RETURN FSN ONLY
|
||
MOVEI P3,DIFSTR## ;SET (SYSSTR-STRSYS) AS 1ST PREDECESSOR
|
||
FNSTR3: HLRZ T2,STRSYS(P3) ;LOOK AT POSSIBLE PREDECESSOR SUCCESOR
|
||
CAIN T2,(P2) ;SKIP IF HIS SUECCESOR IS NOT US
|
||
JRST CPOPJ1## ;EXIT WITH P2=STR, P3=PRED, P4=FSN
|
||
MOVE P3,T2 ;STEP TO NEXT PREDECESSOR
|
||
JUMPN P3,FNSTR3 ;LOOP IF THERE IS ANOTHER STR IN THE LIST
|
||
SETZ P2, ;WE CAN'T GET HERE, BUT FORGET MATCH IF WE DO
|
||
POPJ P, ;...AND GIVE ERROR RETURN
|
||
|
||
;SUBROUTINE TO CREATE AN STR DATA BLOCK IN UPPER CORE & ZERO IT OUT
|
||
; P2 IS RETURNED WITH ADR. OF THIS STR DATA BLOCK
|
||
|
||
GETSTR: MOVE P4,STRAOB## ;GET AOBJN POINTER INTO TABSTR
|
||
SKIPE TABSTR##(P4) ;SKIP IF WE FOUND A FREE FSN
|
||
AOBJN P4,.-1 ;LOOP UNTIL WE FIND A FREE FSN, OR WE RUN OUT
|
||
JUMPGE P4,CPOPJ## ;PASS ALONG ERROR IF NO FREE FSNS
|
||
MOVEI T2,STRLEN## ;GET SIZE OF STR DATA BLOCK
|
||
PUSHJ P,CORGRB ;GET CORE FOR STR DATA BLOCK
|
||
HRRZ P2,T1 ;GET ADR. OF NEW STR INTO A KOSHER AC
|
||
HRLI T1,STRDB## ;PUT AD. OF PROTOTYPE STR DATA BLOCK IN RH
|
||
BLT T1,-1(T2) ;ZERO IT (T2 SET TO LAST LOC. +1 BY CORGRB)
|
||
MOVEM P2,TABSTR(P4) ;STORE ADR. OF STR IN TABLE BY ITS LOG. #
|
||
HRRM P4,STRFSN##(P2) ;INSERT FSN# INTO THE NEW STR DB
|
||
SETOM STRSRC##(P2) ;NOT IN SSL YET
|
||
HLRZ T1,SYSSTR## ;GET 1ST STR IN SYSTEM FROM BEFORE THIS ONE
|
||
HRLM T1,STRSYS##(P2) ;NOW MAKE US POINT AT THAT OLD ONE
|
||
HRLM P2,SYSSTR## ;AND POINT THE SYSTEM AT US
|
||
JRST CPOPJ1## ;PASS ALONG GOOD RETURN
|
||
;SUBROUTINE TO GRAB CORE FOR THE ONCE ONLY CODE
|
||
; ENTER WITH T2 = # WORDS TO GRAB
|
||
; RETURN WITH T1 = ADR. OF THE GRABBED CORE
|
||
; & T2 = ADR. OF 1ST. FREE WORD
|
||
|
||
IFE FTXMON,<
|
||
CORGRS: ;HERE TO GET CORE FOR SATS
|
||
>
|
||
CORGRB: MOVEI T1,(T2) ;COPY WORDS NEEDED
|
||
PUSHJ P,INICOR## ;ALLOCATE CORE
|
||
EXCH T1,T2 ;T1=ADDR, T2=WORD COUNT
|
||
ADDI T2,(T1) ;PUT FIRST FREE ADDR IN T2
|
||
POPJ P, ;AND RETURN
|
||
;SUBROUTINE TO GRAB CORE FROM THE FIRST MONITOR DATA SECTION FOR THE ONCE ONLY CODE
|
||
; ENTER WITH T2 = # WORDS TO GRAB IN UPPER CORE
|
||
; RETURN WITH T1 = ADR. OF THE GRABBED CORE
|
||
; & T2 = ADR. OF 1ST. FREE WORD
|
||
|
||
IFN FTXMON,<
|
||
CORGRS: PUSH P,T2 ;SAVE AMOUNT DESIRED
|
||
MOVEI T1,(MS.SAT) ;SECTION NUMBER TO ALLOCATE FROM
|
||
PUSHJ P,GFWNZN## ;ALLOCATE THE SPACE
|
||
STOPCD .,STOP,NOCSAT, ;++NO CORE FOR SATS
|
||
POP P,T2 ;RESTORE SIZE
|
||
ADD T2,T1 ;LIKE ADVERTISED
|
||
PUSHJ P,SAVE3## ;SAVE XBLT ACS
|
||
MOVE P1,T2 ;COMPUTE WORD
|
||
SUB P1,T1 ; COUNT FOR BLT
|
||
SOS P1 ;NEED NUMBER OF WORDS -1
|
||
AOS P3,T1 ;SET UP
|
||
SOS P2,T1 ; BLT ACS
|
||
SETZM (T1) ;ZERO FIRST WORD
|
||
EXTEND P1,[XBLT] ;ZERO CORE
|
||
POPJ P, ;RETURN
|
||
>; END IFN FTXMON
|
||
;SUBROUTINE TO MOVE PARAMETERS FROM "HOME" BLOCK TO STR DATA BLOCK
|
||
|
||
MOVSTR: MOVE T1,HOMSNM##(P1)
|
||
MOVEM T1,STRNAM##(P2)
|
||
MOVE T1,HOMOPP##(P1)
|
||
MOVEM T1,STRPPN##(P2)
|
||
MOVE T1,HOMK4C##(P1)
|
||
HRRM T1,STRK4C##(P2)
|
||
MOVE T1,HOMSAT##(P1)
|
||
HRLS T1
|
||
MOVEM T1,STRSAT##(P2)
|
||
MOVE T1,UNIBPU(U)
|
||
CAMLE T1,STRBPU##(P2)
|
||
MOVEM T1,STRBPU##(P2)
|
||
MOVE T1,HOMGAR##(P1)
|
||
MOVEM T1,STRGAR##(P2)
|
||
MOVE T1,HOMOVR##(P1)
|
||
MOVEM T1,STROVR##(P2)
|
||
MOVE T1,HOMBSC##(P1)
|
||
HRLM T1,STRBSC##(P2)
|
||
MOVE T1,HOMSCU##(P1)
|
||
HRRM T1,STRSCU##(P2)
|
||
MOVE T1,HOMSRC##(P1)
|
||
MOVEM T1,STRSRC##(P2)
|
||
SKIPL T1,HOMSDL##(P1)
|
||
SUBI T1,1
|
||
MOVEM T1,STRSDL##(P2)
|
||
MOVE T1,HOMCRS##(P1)
|
||
MOVEM T1,STRCRS##(P2)
|
||
HLLZ T1,HOMCNP##(P1)
|
||
TLZ T1,77
|
||
HLLM T1,STYCNP##(P2)
|
||
HLLZ T1,HOMCKP##(P1)
|
||
TLZ T1,77
|
||
HLLM T1,STYCKP##(P2)
|
||
HLLZ T1,HOMCLP##(P1)
|
||
TLZ T1,770077
|
||
HLLM T1,STYCLP##(P2)
|
||
MOVE T2,HOMPT1##(P1) ;GET FIRST RETRIEVAL POINTER TO MFD
|
||
SETZ T1, ;GET A ZERO
|
||
DPB T1,STYCNP##(P2) ;ZERO THE COUNT FIELD IN FIRST POINTER
|
||
MOVEM T2,STRPT1##(P2) ; SO UFDNXT WILL GET FIRST POINTER FROM MFD RIB
|
||
MOVE T1,HOMREF##(P1)
|
||
HLLM T1,STRREF##(P2)
|
||
MOVE T1,STRUN1##(P2)
|
||
MOVE T2,HOMUN1##(P1)
|
||
DPB T2,UN1PTR##
|
||
MOVEM T1,STRUN1##(P2)
|
||
LDB T1,HOYPVS##
|
||
DPB T1,STYPVS##
|
||
LDB T1,HOYSET## ;GET SET NUMBER
|
||
DPB T1,STYSET## ;STORE IN SDB
|
||
POPJ P,
|
||
MSGLNG: HRROS STRREF##(P2) ;INDICATE STR NEEDS REFRESHING
|
||
PUSH P,T1 ;SAVE 2ND. MSG ADR. IN T1
|
||
MOVE T1,T3 ;GET ADR OF 1ST. MSG
|
||
PUSHJ P,ICONM##
|
||
MOVE T1,P1
|
||
PUSHJ P,RADX10##
|
||
PUSHJ P,OPOUT## ;O/P BUFFER
|
||
POP P,T1 ;RESTORE 2ND. MSG ADR.
|
||
CAIA
|
||
|
||
MSGSTR: HRROS STRREF##(P2) ;INDICATE STR NEEDS REFRESHING
|
||
PUSHJ P,ICONM## ;PUT MSG. IN BUFFER
|
||
SETOM ERRHOM ;INDICATE ERROR READING HOM BLOCKS
|
||
SETOM SERIUS ;SERIOUS ERROR - CAN'T START SYSTEM
|
||
MOVE T2,STRNAM##(P2) ;GET SIXBIT STR NAME
|
||
PUSHJ P,PRNAME## ;PRINT NAME
|
||
PJRST CRLFOP## ;END LINE
|
||
;SUBROUTINE TO READ & VERIFY ALL "BAT" BLOCKS IN THE SYSTEM
|
||
;AND SET UP SWAPPING SAT TABLES.
|
||
|
||
REDBAT: HLRZ U,SYSUNI## ;GET ADR. OF 1ST. UNIT DATA BLOCK IN THE SYSTEM
|
||
CHKBT1: MOVSI T1,UNPOFL ;GET OFFLINE FLAG
|
||
TDNE T1,UNIDES(U) ;UNIT OFFLINE?
|
||
JRST CHKBT2 ;YES, GO READ NEXT BAT BLOCK
|
||
PUSHJ P,CHKBAT ;NO - GO CHECK "BAT" BLOCKS FOR THIS UNIT
|
||
JFCL ;IGNORE ERRORS
|
||
SKIPN BATMAN ;IN MANDATORY ONCE-ONLY?
|
||
JRST CHKBT2 ;NO POINT SETTING UP SWAPPING SAT IF OPTIONAL
|
||
SE1ENT ;ENTER SECTION ONE
|
||
HRRZ T3,P1 ;LOC OF BAT BLOCK
|
||
LDB T1,BAYNBR## ;NO OF REGION FOUND BY MAPPER
|
||
ADD T1,BAFCNT##(T3) ;+ NO FOUND BY MONITOR
|
||
HLRE T3,BAFFIR##(T3) ;- TOTAL NO OF SLOTS
|
||
ASH T3,-1 ;2 WORDS PER ENTRY
|
||
ADD T3,T1 ;+ NO OF ENTRIES LEFT
|
||
MOVNS T3
|
||
DPB T3,UNYBCT## ;SAVE IN UDB
|
||
MOVE T2,UNIPTR(U) ;T2=AOBJN PTR TO SWAPPING SAT FOR THIS UNIT
|
||
SKIPGE UNISUN(U) ;IN ACTIVE SWAPPING LIST?
|
||
JRST CHKBT2 ;NO, NO SWAPPING SAT
|
||
HLRE T1,T2 ;T1=-LENGTH OF SWAPPING SAT
|
||
SUB T2,T1 ;T2=ADDR OF SECOND COPY (-T1=+LENGTH)
|
||
MOVE T1,T2 ;T1=PTR TO SECOND COPY
|
||
LDB T3,UNYK4S## ;T3=K FOR SWAPPING ON UNIT
|
||
LSH T3,K2PLSH ;DOUBLE SIZE IF SWAPPING PAGES
|
||
ADDI T3,1 ;+1 BECAUSE 0 WAS THROWN AWAY
|
||
IDIVI T3,^D36 ;T3=FULL WORDS
|
||
JUMPE T4,FULSST ;JUMP IF NO WASTED BITS
|
||
ADDI T2,(T3) ;T2=ADDR OF LAST WORD
|
||
MOVNI T3,-1(T4) ;T3=-BITS TO SET TO 0 +1
|
||
MOVSI T4,400000 ;SET SIGN BIT
|
||
ASH T4,(T3) ;SET BITS TO BE 0 TO 1
|
||
SSX T2,MS.SAT ;SECTION CONTAINING SWAPPING SATS
|
||
SETCAM T4,(T2) ;COMPLEMENT AND STORE
|
||
FULSST: AOBJP T1,NOSST ;JUMP IF 0 OR 1 WORD IN SWAPPING SAT
|
||
IFE FTXMON,<
|
||
SETZM -1(T1) ;CLEAR FIRST WORD OF SECOND COPY
|
||
HRLI T1,-1(T1) ;LH=ADDR OF FIRST WORD
|
||
MOVEI T3,(T1) ;1ST ADDR +1 = LAST ADDR? ONLY IF EXACTLY 2 WORDS
|
||
CAIGE T3,(T2) ;SKIP IF YES, NO MORE LOCATIONS TO CLEAR
|
||
BLT T1,-1(T2) ;CLEAR REST OF SECOND COPY
|
||
>
|
||
IFN FTXMON,<
|
||
HLL T1,T2 ;SECTION NUMBER
|
||
SETZM -1(T1) ;ZERO WORD 0
|
||
MOVE T3,T1 ;FIRST WORD TO ZERO
|
||
SUBM T2,T1 ;NUMBER OF WORDS TO ZERO
|
||
JUMPLE T1,NOSST ;JUMP IF THE SAT IS ONLY 2 WORDS LONG
|
||
MOVE T2,T3 ;ADDRESS OF THE 0
|
||
SUBI T2,1
|
||
EXTEND T1,[XBLT] ;ZERO THE REST
|
||
>
|
||
;FALL INTO NOSST
|
||
NOSST: MOVEI T1,-1(P1) ;T1=ADDR OF BAT BLOCK IN CORE -1
|
||
MOVE T2,[PUSHJ P,SETSST];T2=INSTRUCTION TO EX FOR BAD BLOCKS
|
||
PUSHJ P,SCNBAT## ;SCAN BAT BLOCK, CALL SETSST FOR BAD BLOCKS
|
||
MOVE T1,UDBKDB(U) ;KONTROLLER FOR THIS UNIT
|
||
SKIPGE KONPOS(T1) ;DOES IT POSITION?
|
||
JRST CHKBT2 ;NO--GO ON
|
||
PUSH P,P1 ;MAKE P1 AVAILABLE
|
||
TDZA P1,P1 ;ZERO IT AND HOP OVER NEXT INSTRUCTION
|
||
CHKCYL: PUSHJ P,SETSST ;MARK OUT PAGE IN SWAP SAT
|
||
CHKCY1: LDB T3,UNYBPY ;BLKS/CYL FOR UNIT
|
||
ADD P1,T3 ;COMPUTE NEXT LBN ON CYL BOUNDARY
|
||
CAMLE P1,UNIBPU(U) ;PAST END OF UNIT?
|
||
JRST CHKCY2 ;YES--ALL DONE
|
||
MOVE T2,P1 ;COPY OF THIS LBN
|
||
SUB T2,UNISLB(U) ;COMPUTE RELATIVE BLK NO. IN SWAP SPACE
|
||
IDIVI T2,SWBKPP## ;IS A SWAP PAGE SPLIT ACROSS CYL BOUNDARY?
|
||
JUMPE T3,CHKCY1 ;NO IF SWBKPP DIVIDES EVENLY
|
||
MOVE T1,P1 ;YES--THIS PAGE WILL NOW BE MARKED
|
||
JRST CHKCYL ; AS UNAVAILBLE IN THE SWAP SAT
|
||
; BECAUSE FILSER/VMSER DOESN'T LIKE THIS
|
||
CHKCY2: POP P,P1 ;RESTORE P1
|
||
CHKBT2: HLRZ U,UNISYS(U) ;GET ADR. OF NEXT UNIT DATA BLOCK IN SYSTEM
|
||
IFN FTXMON,<XJRST [MCSEC0+.+1]>
|
||
JUMPN U,CHKBT1 ;REPEAT IF THERE IS ONE
|
||
POPJ P, ;NONE LEFT - EXIT
|
||
CHKBAT: SETZM BATBAD ;CLEAR "BAT" BLOCK BAD FLAG
|
||
SETZM BTHBAD ;CLEAR BOTH BAD FLAG
|
||
PUSHJ P,GTBAT ;READ BOTH BAT BLOCKS & VERIFY
|
||
SETOM BTHBAD ;BOTH BAD--REMEMBER
|
||
SKIPE REDERR ;IF READ ERRORS
|
||
AOS BATANY ;ALSO FLAG THAT SOME UNIT HAS ERRORS
|
||
SKIPE REDERR ;ANY ERRORS IN EITHER ONE
|
||
SETOM BATBAD ;SET BAT BLOCK BAD FLAG
|
||
SKIPN BATMAN ;SKIP IF MANDATORY
|
||
JRST CKBAT1
|
||
SKIPN BATBAD ;ANY ERRORS IN EITHER??
|
||
POPJ P, ;NO, GO TO NEXT UNIT
|
||
HRRZ T3,P1 ;ADDR OF BAT BLOCK IN CORE
|
||
SKIPE BTHBAD ;BOTH BAD??
|
||
PJRST INTBAT ;YES-MAY AS WELL REWRITE THEM
|
||
MOVEI T2,LBOBAT## ;ONE IS GOOD & SITTING IN MBF
|
||
HLRZ T3,UNIHOM(U)
|
||
SKIPL REDERR ;SKIP IF BLOCK 2 IS GOOD & 1 IS BAD
|
||
HRRZ T3,UNIHOM(U)
|
||
ADD T2,T3 ;BLOCK 2 IS BAD-WRITE GOOD ONE ON IT
|
||
MOVEM T2,BLKSLF##(P1) ;THIS BLOCK MUST KNOW WHAT IT IS
|
||
PUSHJ P,OMNWRT ;WRITE PROPER BLOCK
|
||
PUSHJ P,WRTCHK ;ERROR-TELL OPR ABOUT IT
|
||
POPJ P,
|
||
CKBAT1: HRRZ T3,P1 ;GET ADR. OF "BAT" BLOCK INTO A BETTER AC
|
||
LDB T2,BAYNBR## ;GET # BAD REGIONS FOUND BY MAP PROGRAM.
|
||
ADD T2,BAFCNT##(T3) ;ADD IN # FOUND BY MONITOR
|
||
ADDM T2,BATANY ;ALSO FLAG THAT SOME UNIT HAS ERRORS
|
||
SKIPN BATBAD ;LIKEWISE IF ANY BAD REGIONS OR ERRORS DETECTED
|
||
POPJ P, ;EXIT
|
||
; JRST INTBAT ;GO INITIALIZE
|
||
INTBAT: MOVE T1,UDBNAM(U) ;GET DRIVE NAME
|
||
MOVEI T2,[ASCIZ /- both BAT blocks are bad/]
|
||
SKIPE BTHBAD ;BOTH BLOCKS BAD?
|
||
PUSHJ P,UWARN ;WARN OPERATOR
|
||
MOVSI T1,UNPHWP ;BIT TO TEST
|
||
TDNE T1,UNIDES(U) ;HARDWARE WRITE PROTECT TURNED ON?
|
||
POPJ P, ;THEN CAN'T INIT BAT BLOCKS
|
||
MOVEI T1,[ASCIZ /Initialize BAT blocks/]
|
||
MOVSI T2,'NO ' ;DEFAULT ANSWER
|
||
PUSHJ P,PRSYNQ## ;PROMPT AND FETCH ANSWER
|
||
JUMPE T1,CPOPJ## ;RETURN IF HE SAID "NO"
|
||
MOVEI T1,[ASCIZ /This is not normally done. Are you sure/]
|
||
MOVSI T2,'NO ' ;DEFAULT ANSWER
|
||
PUSHJ P,PRSYNQ## ;PROMPT AND FETCH ANSWER
|
||
JUMPE T1,CPOPJ## ;RETURN IF HE SAID "NO"
|
||
PUSHJ P,SETBAT ;SETUP "BAT" BLOCK PARAMETERS
|
||
HRRZ T3,P1 ;GET BUFFER ADDRESS IN BETTER AC
|
||
MOVSI T1,(T3) ;SETUP BLT PTR. TO CLEAR "BAT" BLOCK
|
||
HRRI T1,1(T3)
|
||
SETZM (T3) ;CLEAR OUT 1ST. WORD
|
||
BLT T1,BLKSLF##(T3) ;CLEAR OUT THE REST OF THE BLOCK
|
||
MOVEM P2,BLKNAM##(T3) ;PUT SIXBIT 'BAT' IN THE BLOCK
|
||
MOVEM P3,BLKCOD##(T3) ;SAVE THE CODE FOR "BAT" BLOCKS IN THE BLOCK
|
||
MOVSI T1,MBRMAX## ;SETUP AOBJN PTR. TO BE STORED IN BLOCK
|
||
HRRI T1,BAFREG##
|
||
MOVEM T1,BAFFIR##(T3) ;SAVE IT IN THE BLOCK
|
||
MOVE J,UDBKDB(U) ;GET UNIT'S KONTROLLER DATA BLOCK ADR.
|
||
MOVE T1,KDBDVC(J) ;GET DEVICE CODE FOR THE KONTROLLER
|
||
DPB T1,BAYKDC## ;SAVE IT IN THE BLOCK
|
||
MOVEI T1,[ASCIZ/Initializing BAT blocks/]
|
||
PUSHJ P,CONOUT##
|
||
PJRST WRTRUN ;WRITE BOTH "BAT" BLOCKS
|
||
|
||
BATBAD: 0 ;0 INDICATES VIRGIN "BAT" BLOCKS(INITIALIZED)
|
||
; LH = -1 INDICATES ERROR(S) DETECTED WHILE READING
|
||
; RH = # BAD REGIONS ON UNIT
|
||
BTHBAD: 0 ;0=NOT BOTH BAD, -1 = BOTH BAD
|
||
BATMAN: 0 ;0=OPTIONAL, -1=MANDANTORY
|
||
|
||
BATANY: 0 ;NON-ZERO IF ANY BAD REGIONS ON ANY UNITS
|
||
|
||
LSTBAT: 0 ;NON-ZERO IF LIST # BAD REGIONS
|
||
|
||
GTBAT: PUSHJ P,SETBAT ;SETUP "BAT" BLOCK PARAMETERS FOR REDRUN
|
||
PJRST REDRUN ;GO READ & VERIFY BLOCKS
|
||
|
||
SETBAT: MOVSI P2,(SIXBIT .BAT.)
|
||
MOVE P3,[EXP CODBAT## ]
|
||
MOVE P4,[XWD LBOBAT##,LBOBAT ]
|
||
ADD P4,UNIHOM(U)
|
||
POPJ P,
|
||
;SUBROUTINE TO SET BITS IN SWAPPING SAT TABLE FOR BAD BLOCKS IN SWAPPING SPACE
|
||
;ARGS T1=BLOCK NUMBER WITHIN UNIT
|
||
|
||
SETSST: SKIPGE UNISUN(U) ;UNIT IN A.S.L?
|
||
POPJ P, ;NO, RETURN
|
||
PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
SUB T1,UNISLB(U) ;T1=RELATIVE BLOCK IN SWAPPING SPACE
|
||
JUMPL T1,CPOPJ## ;EXIT IF BLOCK BELOW SWAPPING SPACE
|
||
LDB P3,UNYK4S## ;P3=K FOR SWAPPING ON THIS UNIT
|
||
JUMPE P3,CPOPJ## ;EXIT IF NO SWAPPING SPACE ON UNIT
|
||
MOVE T2,P3
|
||
LSH T2,BLKSPK ;CONVERT TO BLOCKS
|
||
CAML T1,T2 ;SKIP IF BLOCK IN SWAPPING SPACE
|
||
POPJ P, ;NO, PAST END
|
||
MOVEI P1,SWBKPP## ;8 BLOCKS PER K
|
||
SETZ P2, ;STARTING AT LOGICAL K 0
|
||
SUBI P3,1 ;LAST LOGICAL J NUMBER
|
||
MOVE P4,UNIPTR(U) ;PTR TO SWAPPING SAT
|
||
HLRE T2,P4 ;T2=-LENGTH OF SWAPPING SAT
|
||
SUB P4,T2 ;P4=AOBJN PTR TO SECOND COPY
|
||
SUBI P4,1 ;MAKE IOWD PTR
|
||
ADDI T1,SWBKPP## ;SWAPPING SPACE STARTS AT 1 FOR VM
|
||
SSX P4,MS.SAT ;SECTION NUMBER FOR SWAPPING SATS
|
||
;ADDRESS OF THE SAT
|
||
PUSHJ P,CHKBIT## ;FIND BIT
|
||
ORM T4,(T1) ;WAS NOT ON, SET IT
|
||
POPJ P, ;THATS ALL
|
||
;SUBROUTINE TO TYPE ALL UNITS IN SYSTEM THAT ARE NOT IN ANY STR
|
||
; RETURN WITH P1,P4,F,U & J DESTROYED
|
||
|
||
TYPUNS: PUSHJ P,OTSET##
|
||
HLRZ U,SYSUNI## ;GET ADR. OF 1ST. UNIT DATA BLOCK IN SYSTEM
|
||
PUSH P,[0] ;INITIALIZE COUNTER
|
||
TDZA P4,P4 ;INDICATE UNIT ID TO BE TYPED IN TYPUNI
|
||
TYPNS1: HLRZ U,UNISYS(U) ;GET ADR. OF NEXT UNIT DATA BLOCK IN SYSTEM
|
||
JUMPE U,TYPNS4 ;EXIT IF NONE LEFT
|
||
SKIPE UNILOG(U) ;IS THIS UNIT IN AN STR?
|
||
JRST TYPNS1 ;YES - CHECK NEXT UNIT
|
||
MOVEI P1,[ASCIZ .,.] ;ASSUMUE DEFAULT CASE:NON-FIRST UNIT ON A LINE
|
||
SOSLE T1,(P) ;FINISHED ON THIS LINE?
|
||
JRST TYPNS3 ;OUTPUT STANDARD CASE
|
||
MOVEI P1,[ASCIZ .,
|
||
.]
|
||
JUMPE T1,TYPNS2 ;AND IF THAT IS TRUE,CHARGE AHEAD
|
||
MOVEI P1,[ASCIZ .
|
||
Units not in a file structure:
|
||
.]
|
||
TYPNS2: MOVEI T1,UNTPLN ;RESET COUNTER
|
||
MOVEM T1,(P)
|
||
TYPNS3: PUSHJ P,TYPUN1
|
||
JRST TYPNS1
|
||
TYPNS4: POP P,T1
|
||
JUMPLE T1,OPOUT## ;IF FOUND NO UNITS TO TYPE
|
||
PJRST CRLFOP## ;IF FOUND AT LEAST ONE
|
||
;SUBROUTINE TO TYPE ALL UNITS IN SYSTEM THAT ARE IN AN STR WHICH IS
|
||
;NOT MOUNTED TO THIS SYSTEM
|
||
; RETURN WITH P1,P4,F,U & J DESTROYED
|
||
|
||
TYPNMU: PUSHJ P,OTSET##
|
||
HLRZ U,SYSUNI## ;GET ADR. OF 1ST. UNIT DATA BLOCK IN SYSTEM
|
||
PUSH P,[0] ;INITIALIZE COUNTER
|
||
TDZA P4,P4 ;INDICATE UNIT ID TO BE TYPED IN TYPUNI
|
||
TYPNM1: HLRZ U,UNISYS(U) ;GET ADR. OF NEXT UNIT DATA BLOCK IN SYSTEM
|
||
JUMPE U,TYPNM4 ;EXIT IF NONE LEFT
|
||
MOVSI T1,UNPNMU ;GET THE FLAG
|
||
TDNN T1,UNIDES(U) ;DOES THIS UNIT GET MOUNTED?
|
||
JRST TYPNM1 ;YES - CHECK NEXT UNIT
|
||
MOVEI P1,[ASCIZ .,.] ;ASSUMUE DEFAULT CASE:NON-FIRST UNIT ON A LINE
|
||
SOSLE T1,(P) ;FINISHED ON THIS LINE?
|
||
JRST TYPNM3 ;OUTPUT STANDARD CASE
|
||
MOVEI P1,[ASCIZ .,
|
||
.]
|
||
JUMPE T1,TYPNM2 ;AND IF THAT IS TRUE,CHARGE AHEAD
|
||
MOVEI P1,[ASCIZ .
|
||
Units in a disk-set which is not mounted to this system:
|
||
.]
|
||
TYPNM2: MOVEI T1,UNTPLN ;RESET COUNTER
|
||
MOVEM T1,(P)
|
||
TYPNM3: PUSHJ P,TYPUN1
|
||
JRST TYPNM1
|
||
TYPNM4: POP P,T1
|
||
JUMPLE T1,OPOUT## ;IF FOUND NO UNITS TO TYPE
|
||
PJRST CRLFOP## ;IF FOUND AT LEAST ONE
|
||
;SUBROUTINE TO TYPE SIXBIT UNIT NAME FOLLOWED BY (ID/SWAPPING CLASS)
|
||
; ENTER WITH U = UNIT DATA BLOCK ADR.
|
||
; P4 = 0 TO TYPE UNIT ID. P4 = -VE TO TYPE SWAPPING CLASS
|
||
|
||
TYPUNI: MOVEI P1,[ASCIZ .,.]
|
||
TYPUN1: MOVE T1,P1 ;GET MSG. ADR. INTO KOSHER AC
|
||
PUSHJ P,CONMES## ;PUT "," OR MSG. IN BUFFER
|
||
JUMPE U,CPOPJ## ;JUST O/P MSG. IF NO UNITS IN ASL
|
||
MOVE T1,UDBNAM(U) ;GET DRIVE NAME
|
||
PUSHJ P,PRNAME## ;PRINT IT
|
||
MOVEI T1,[ASCIZ .(.]
|
||
PUSHJ P,CONMES## ;PUT "(" IN BUFFER
|
||
JUMPL P4,TYPUN2 ;JUMP IF CLASS FOR SWAPPING TO BE TYPED
|
||
MOVE T2,UNIHID(U) ;GET SIXBIT UNIT ID - IF ANY
|
||
TLNE T2,777777 ;AVOID 0,,JUNK
|
||
PUSHJ P,PRNAME## ;PUT IT IN THE BUFFER
|
||
JRST TYPUN3
|
||
|
||
TYPUN2: LDB T1,UNYCFS## ;GET CLASS FOR SWAPPING
|
||
PUSHJ P,RADX10## ;PUT DECIMALLY IN THE BUFFER
|
||
TYPUN3: MOVEI T1,[ASCIZ .).]
|
||
PJRST CONMES##
|
||
FNDSRC: MOVSI P3,-.SLMXS ;SETUP AOBJN PTR. FOR MAX. # STRS IN SEARCH LIST
|
||
FNDSR1: HLRZ P2,SYSSTR## ;GET ADR. OF 1ST. STR IN SYSTEM
|
||
JUMPE P2,CPOPJ## ;QUIT NOW IF NO FILE STRUCTURES
|
||
FNDSR2: MOVE T1,STRSRC##(P2) ;GET LOG. # OF STR IN SEARCH LIST
|
||
CAIE T1,(P3) ;IS IT THE ONE WE'RE LOOKING FOR?
|
||
JRST FNDSR3 ;NO - GET NEXT STR
|
||
XCT P4 ;EXECUTE INSTR. SUPPLIED BY CALLER
|
||
AOBJP P3,CPOPJ## ;EXIT IF MAX. # STRS SEEN
|
||
JRST FNDSR1
|
||
|
||
FNDSR3: HLRZ P2,STRSYS##(P2) ;GET ADR. OF NEXT STR DATA BLOCK IN SYSTEM
|
||
JUMPN P2,FNDSR2 ;REPEAT IF ANY LEFT
|
||
AOBJN P3,FNDSR1 ;LOOK FOR NEXT LOG. STR #
|
||
POPJ P, ;EXIT
|
||
|
||
|
||
DEPCLR: HRRZ T1,STRFSN##(P2) ;GET # OF THIS STR
|
||
EXCH P2,TEMPTR ;PUT IT IN SYS SL.
|
||
PUSHJ P,SLAPD##
|
||
PUSHJ P,SLXAES## ;STOPCD AES IF NO ROOM
|
||
PUSH P,P2 ;SAVE CURRENT LOC IN SL.
|
||
MOVEI T1,.FSFNC ;INSERT A FENCE
|
||
PUSHJ P,SLAPD##
|
||
PUSHJ P,SLXAES##
|
||
POP P,P2 ;BACK UP OVER THE FENCE
|
||
EXCH P2,TEMPTR
|
||
POPJ P, ;EXIT
|
||
HGHSIZ: MOVE T1,UNIBPU(U) ;GET # BLOCKS ON UNIT
|
||
ADDM T1,STRSIZ##(P2) ;ADD TO TOTAL # BLOCKS IN STR
|
||
MOVE T1,STRBPU##(P2) ;GET MAX. # BLOCKS PER UNIT IN STR
|
||
ADDM T1,STRHGH##(P2) ;ADD TO HIGHEST LOG. BLOCK # IN STR
|
||
HLRZ U,UNISTR(U) ;GET ADR. OF NEXT UNIT DATA BLOCK IN STR
|
||
JUMPN U,HGHSIZ ;REPEAT IF ANY LEFT
|
||
SOS STRHGH##(P2) ;MAKE STRHGH BE HIGHEST LOG. BLOCK # IN STR
|
||
POPJ P, ;RETURN
|
||
|
||
INSUNI: HRRZ T1,UNISTR(U) ;SEE IF THIS UNIT IS ALREADY IN AN STR
|
||
JUMPE T1,INSUN1 ;T1 = 0 IF IT ISN'T
|
||
MOVEI T1,[ASCIZ .
|
||
?Unit already in file structure
|
||
.]
|
||
PJRST CONOUT## ;TYPE MSG. & EXIT
|
||
|
||
INSUN1: HRLM U,(P3) ;LINK THIS UNIT DATA BLOCK TO PREVIOUS ONE
|
||
HRRZM P2,UNISTR(U) ;ATTACH THIS UNIT DATA BLOCK TO THIS STR
|
||
HRRZ T1,STRUNM##(P2) ;GET LOGICAL UNIT # WITHIN STR
|
||
DPB T1,UNYLUN## ;SAVE IT IN UNIT DATA BLOCK
|
||
PUSHJ P,CMPLOG ;COMPUTE SIXBIT LOGICAL UNIT NUM, STORE IN UNILOG
|
||
MOVE T1,UNIBPU(U)
|
||
CAMLE T1,STRBPU##(P2)
|
||
MOVEM T1,STRBPU##(P2)
|
||
CAIE P1,0 ;SKIP IF 1ST UNIT
|
||
CAMGE T1,UNIBPU(P1) ;COMPARE WITH SMALLEST SO FAR
|
||
MOVE P1,U ;SAVE ADDR OF SMALLEST IN P1
|
||
AOS STRUNM##(P2) ;INCREMENT # OF UNITS IN STR
|
||
PUSHJ P,SETCHG ;FLAG THAT UNIT'S "HOME" BLOCKS MUST BE REWRITTEN
|
||
MOVEI P3,UNISTR(U) ;MAKE CURRENT UNIT PREDECESSOR
|
||
JRST CPOPJ1## ;SKIP RETURN
|
||
;SUBROUTINE TO SET DEFAULTS IN STR DATA BLOCK
|
||
;ARGS P1=ADDR OF SMALLEST UNIT IN STR
|
||
|
||
PARSET: MOVE U,P1 ;U=ADDR OF SMALLEST UNIT IN STR
|
||
LDB P1,UNYKTP## ;CONTROLLER TYPE OF SMALLEST UNIT
|
||
MOVE T2,GRPDEF(P1) ;UNIGRP DEFAULT
|
||
MOVE T1,[HRLM T2,UNIGRP(U)]
|
||
PUSHJ P,STOUNI ;STORE IN ALL UNIT DATA BLOCKS
|
||
PUSH P,P1 ;SAVE CONTROLLER TYPE
|
||
MOVE P1,BPCDEF(P1) ;P1 IS ARG FOR BPCSTO
|
||
PUSHJ P,BPCSTO ;STORE BPC AND SET UP BYTE POINTERS
|
||
MOVE T3,(P) ;CONTROLLER TYPE TO T3
|
||
MOVE P1,CNPDEF(T3) ;DEFAULT BITS PER CLUSTER COUNT FIELD
|
||
LDB T3,[POINT 6,STYCLP##(P2),11] ;BITS PER CLUSTER ADDR FIELD
|
||
PUSHJ P,CNPSTO ;STORE THAT IN BYTE POINTERS
|
||
POP P,P1 ;RESTORE CONTROLLER TYPE
|
||
MOVE T1,GARDEF(P1) ;DEFAULT RESERVE
|
||
MOVEM T1,STRGAR##(P2)
|
||
MOVE T1,OVRDEF(P1) ;DEFAULT OVERDRAW
|
||
MOVNM T1,STROVR##(P2) ;STORED NEGATIVE
|
||
SKIPGE T1,K4CDEF(P1) ;GET K FOR CRASH.EXE
|
||
MOVEI T1,M.NKC## ;-1 MEANS USE DEFAULT FROM MONGEN
|
||
HRRM T1,STRK4C##(P2) ;K FOR CRASH.SAV
|
||
PJRST CHGSTX ;SET BIT TO WRITE OUT HOME BLOCKS
|
||
|
||
|
||
;SUBROUTINE TO CLOSE UP SLOTS IN SDL AND SSL WHEN DISSOLVING AN STR
|
||
;ARGS T1=POSITION IN SDL/SSL OF DISSOLVED STR
|
||
|
||
FIXSSL: SETZM PRESSL## ;FORGET PRESERVED SSL
|
||
PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
DMOVE P3,[CAML P1,STRSRC##(P2) ;INSTRUCTIONS TO TEST
|
||
SOS STRSRC##(P2)] ;...
|
||
JRST FIXSSD ;ON YOUR WAY
|
||
FIXSDL: SETZM PRESDL## ;FORGET PRESERVED SDL
|
||
PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
DMOVE P3,[CAML P1,STRSDL##(P2) ;INSTRUCTIONS TO TEST
|
||
SOS STRSDL##(P2)] ;...
|
||
FIXSSD: MOVE P1,T1 ;COPY POSITION OF DISSOLVED STR
|
||
MOVEI P2,SYSSTR##-STRSYS## ;SET LINK FOR FIRST STRUCTURE
|
||
FIXSS1: HLRZ P2,STRSYS##(P2) ;GET NEXT STRUCTURE
|
||
JUMPE P2,CPOPJ## ;RETURN IF JUST CHECKED LAST STR
|
||
XCT P3 ;THIS STR AFTER THE ONE WHICH WAS JUST DISSOLVED?
|
||
JRST FIXSS1 ;NO
|
||
XCT P4 ;YES, MOVE IT DOWN ONE PLACE
|
||
PUSHJ P,CHGSTX ;FLAG UNITS AS NEEDING THEIR HOME BLOCKS REWRITTEN
|
||
JRST FIXSS1 ;LOOP FOR MORE
|
||
;SUBROUTINE TO DETERMINE IF ANY UNITS ARE NOT IN STR'S
|
||
;SKIP RETURN IF YES, NO SKIP IF NO
|
||
|
||
HLRZ U,SYSUNI## ;U=1ST UNIT IN SYSTEM
|
||
ALLINS: JUMPE U,CPOPJ## ;NO MORE UNITS, ALL MUST BE IN STRS
|
||
SKIPN UNILOG(U) ;SKIP IF THIS UNIT IS IN AN STR
|
||
JRST CPOPJ1##
|
||
HLRZ U,UNISYS(U) ;NEXT UNIT IN SYSTEM
|
||
JRST ALLINS
|
||
|
||
;SUBROUTINE TO COMPUTE SIXBIT LOGICAL UNIT NUMBER WITHIN STR
|
||
|
||
CMPLOG: PUSH P,P3
|
||
MOVE P3,T1
|
||
LSH P3,-^D3
|
||
ADDI P3,20
|
||
LSH P3,^D6
|
||
ANDI T1,7
|
||
ADDI P3,20(T1)
|
||
MOVE T1,STRNAM##(P2)
|
||
PUSHJ P,MSKUNI##
|
||
SETCA T2,0
|
||
JFFO T2,.+2
|
||
STOPCD .+1,DEBUG,JDJ, ;++JFFO DIDN'T JUMP
|
||
MOVEI T2,^D24
|
||
TRNE P3,700
|
||
JRST INSUN2
|
||
TRZ P3,7700
|
||
MOVEI T2,^D30
|
||
INSUN2: SUB T2,T3
|
||
LSH P3,(T2)
|
||
ADD T1,P3
|
||
MOVEM T1,UNILOG(U)
|
||
POP P,P3
|
||
POPJ P,
|
||
;ROUTINE TO CLEAR OUT ENTIRE ACTIVE SWAPPING LIST...
|
||
;DOES NOT ASSUME ACTIVE SWAPPING LIST IS ALREADY SETUP.
|
||
|
||
KASL: SETZM PREASL## ;FORGET PRESERVED ASL
|
||
MOVEI U,SYSUNI##-UNISYS
|
||
KASL1: HLRZ U,UNISYS(U)
|
||
JUMPE U,KASL2
|
||
PUSHJ P,SETCHG ;MARK AS NEEDING HOM BLOCKS REWRITTEN
|
||
SETOM UNISUN(U) ;UNIT NO LONGER IN ASL
|
||
HRRZS UNISWP(U) ;CLEAR LINK
|
||
JRST KASL1
|
||
KASL2: MOVE T1,[XWD SWPTAB##,SWPTAB##+1] ;GET BLT POINTER TO CLEAR OUT
|
||
SETZM SWPTAB## ;SWPTAB
|
||
BLT T1,SWPTBE## ;CLEAR TO THE LAST DROP
|
||
POPJ P, ;RETURN
|
||
;ROUTINE TO GIVE UP CORE USED BY SDBS, SATS, AND SPTS
|
||
|
||
RTNCOR: PUSHJ P,SAVE2## ;FREE UP P1 AND P2
|
||
|
||
;SDBS
|
||
MOVE P1,STRAOB## ;GET AOBJN POINTER INTO TABSTR
|
||
RTNCR1: MOVEI T1,STRLEN## ;NUMBER OF WORDS FOR A STRUCTURE DATA BLOCK
|
||
SKIPE T2,TABSTR##(P1) ;GET ADDRESS, SKIP IF STRUCTURE NOT DEFINED
|
||
PUSHJ P,GIVWDS## ;RETURN THE SPACE
|
||
SETZM TABSTR##(P1) ;ZERO THE POINTER
|
||
AOBJN P1,RTNCR1 ;LOOP FOR ALL POSSIBLE STRUCTURES
|
||
|
||
;LOOP OVER EACH UNIT RETURNING SPACE
|
||
HLRZ U,SYSUNI## ;GET FIRST UNIT DATA BLOCK
|
||
RTNCR2:
|
||
IFE FTXMON,<
|
||
|
||
;SATS
|
||
LDB P1,UNYSIC## ;GET NUMBER OF SATS IN CORE
|
||
JUMPLE P1,RTNCR4 ;NOTHING TO RETURN IF UNYSIC = 0
|
||
MOVE P2,UNISAB(U) ;GET ADDRESS OF FIRST SAB IN RING
|
||
RTNCR3: MOVE T2,P2 ;COPY SAB ADDRESS
|
||
MOVE P2,SABRNG##(P2) ;REMEMBER ADDRESS OF NEXT SAB
|
||
LDB T1,UNYWPS## ;GET WORDS PER SAT
|
||
ADDI T1,SABBIT## ;INCLUDE OVERHEAD WORDS
|
||
PUSHJ P,GIVWDS## ;GIVE BACK THE SPACE
|
||
SOJG P1,RTNCR3 ;LOOP FOR ALL SABS
|
||
RTNCR4: SETZM UNISAB(U) ;FORGET ABOUT IT
|
||
|
||
;SPT
|
||
LDB T1,UNYSPU## ;GET NUMBER OF SATS PER UNIT
|
||
ADDI T1,SPTFIR##+1 ;INCLUDE OVERHEAD WORDS
|
||
HRRZ T2,UNISPT(U) ;GET ADDRESS OF SPT
|
||
SKIPE T2 ;IF THERE IS ONE,
|
||
PUSHJ P,GIVWDS## ; RETURN IT
|
||
SETZM UNISPT(U) ;FORGET ABOUT IT
|
||
|
||
;SWAPPING SAT
|
||
HLRE T1,UNIPTR(U) ;GET -VE LENGTH OF SWAPPING SAT
|
||
JUMPE T1,RTNCR5 ;NOTHING TO RETURN IF NO SST
|
||
MOVMS T1 ;GET JUST THE MAGNITUDE
|
||
LSH T1,1 ;ACCOUNT FOR DOUBLE ALLOCATION (SEE CRESST)
|
||
HRRZ T2,UNIPTR(U) ;GET ADDRESS OF SST
|
||
SKIPE T2 ;IF THERE IS ONE,
|
||
PUSHJ P,GIVWDS## ; RETURN IT
|
||
SETZM UNIPTR(U) ;FORGET ABOUT IT
|
||
|
||
RTNCR5:
|
||
IFN FTDUAL,<
|
||
SKIPN T1,UNI2ND(U) ;GET POINTER TO SECOND PORT
|
||
JRST RTNCR6 ;NONE
|
||
SETZM UNISAB(T1) ;ZERO OUT COPIED POINTERS
|
||
SETZM UNISPT(T1)
|
||
SETZM UNIPTR(T1)
|
||
RTNCR6:
|
||
>; END IFN FTDUAL
|
||
>; END IFE FTXMON
|
||
|
||
HLRZ U,UNISYS(U) ;GET NEXT UNIT
|
||
JUMPN U,RTNCR2 ;LOOP IF MORE UNITS
|
||
POPJ P, ;RETURN
|
||
CKUSTR: SKIPN .UONCE## ;IF EXEC MODE,
|
||
JRST CPOPJ1## ;THEN IT ISN'T MOUNTED IN USER MODE
|
||
PJRST UCKSTR## ;USER MODE HAS TO CHECK
|
||
|
||
REFCHU: SKIPN .UONCE## ;IF EXEC MODE,
|
||
JRST REFCHZ ;JUST GO DO IT
|
||
PUSH P,T2 ;SAVE THE OLD VALUE
|
||
PUSHJ P,UCKSTR## ;SEE IF WE REALLY WANT TO DO THIS
|
||
JRST TPOPJ## ;NO--GO BACK TO THE OLD VALUE
|
||
POP P,T2 ;YES--PROCEED TO MAKE THE CHANGE
|
||
REFCHZ: SKIPE P2 ;UNIT PART OF A STRUCTURE?
|
||
HRROS STRREF##(P2) ;YES - INDICATE STR NEEDS REFRESHING
|
||
PJRST SETCHG ;FLAG "HOME" BLOCKS MUST BE REWRITTEN
|
||
|
||
REFCHS: HLRZ U,STRUNI##(P2) ;GET FIRST UNIT IN STRUCTURE
|
||
MOVSI T2,UNPNNA ;AND USER-MODE 'MOUNTED' FLAG
|
||
SKIPE .UONCE## ;NOT A PROBLEM IN EXEC MODE
|
||
TDNN T2,UNIDES(U) ;DO WE NEED TO WORRY?
|
||
JRST REFCHY ;NO--JUST DO IT
|
||
PUSH P,T1 ;YES--SAVE OLD VALUE
|
||
PUSHJ P,UCKSTR## ;MAKE SURE WE WANT TO PROCEED
|
||
JRST P1POPJ## ;NO--GO BACK TO THE OLD VALUE
|
||
POP P,T1 ;YES--PROCEED TO MAKE A DRASTIC CHANGE
|
||
REFCHY: HRROS STRREF##(P2) ;INDICATE STR NEEDS REFRESHING
|
||
CHGSTX: MOVE T1,[PUSHJ P,SETCHG] ;GET INSTR. TO BE EXECUTED BY STOUNI
|
||
;JRST STOUNI ;FALL INTO STOUNI
|
||
;SUBROUTINE TO EXECUTE AN INSTRUCTION FOR ALL UNITS WITHIN AN STR
|
||
; USUALLY STORES A BYTE
|
||
;T1=INSTRUCTION TO BE EXECUTED, P1=ARG., P2=STR DATA BLOCK ADR.
|
||
|
||
STOUNI: HLRZ U,STRUNI##(P2)
|
||
PUSH P,T1
|
||
STOUN1: XCT (P) ;EXECUTE INSTRUCTION SUPPLIED IN AC T1
|
||
HLRZ U,UNISTR(U)
|
||
JUMPN U,STOUN1
|
||
JRST TPOPJ##
|
||
|
||
;SUBROUTINE TO COMPUTE # CLUSTERS & WORDS PER SAT
|
||
|
||
CMCWPS: PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
PUSHJ P,COMLC1 ;NOW COMPUTE # CLUSTERS PER SAT
|
||
SOS T2
|
||
LDB P1,UNYSPU## ;GET # SATS PER UNIT IN THIS STR
|
||
IDIV T2,P1
|
||
HRRM T2,UNICPS(U) ;STORE COMPUTED VALUE
|
||
AOS UNICPS(U) ;MAKE VALUE IN UNIT DATA BLOCK RIGHT
|
||
IDIVI T2,^D36
|
||
ADDI T2,1
|
||
DPB T2,UNYWPS## ;STORE COMPUTED VALUE
|
||
POPJ P, ;EXIT
|
||
COMLCA: HLRZ U,STRUNI##(P2) ;GET ADR. OF 1ST. UNIT DATA BLOCK IN STR
|
||
JRST COMLC2 ;IS UNIT IN AN STR?
|
||
COMLC1: SKIPA T2,UNIBPU(U) ;NO - GET # BLOCKS ON UNIT
|
||
COMLC2: MOVE T2,STRBPU##(P2) ;YES - GET # BLOCKS PER UNIT
|
||
LDB T4,UNYBPC## ;GET # BLOCKS PER CLUSTER
|
||
IDIV T2,T4 ;COMPUTE LAST CLUSTER ADR. ON UNIT
|
||
POPJ P, ;RETURN
|
||
;T2 & T3 ARE RESPECTED
|
||
SETCHG: PUSH P,T1 ;NEED TO SAVE T1 THESE DAYS
|
||
MOVSI T1,UNPCHG ;PREPARE TO FLAG "HOME" BLOCKS NEED REWITING
|
||
MOVSI T4,UNPWPO
|
||
TDNN T4,UNIDES(U) ;IS UNIT WRITE PROTECTED OR OFF-LINE?
|
||
IORM T1,UNIDES(U) ;SET UNPCHG FLAG
|
||
JRST TPOPJ## ;RETURN
|
||
|
||
;SUBROUTINE TO SEE IF ANY UNIT IN THE SYSTEM HAS THE 'UNPCHG' BIT ON
|
||
|
||
CHKCHG: MOVSI T1,UNPCHG ;BIT TO TEST
|
||
HLRZ U,SYSUNI## ;GET FIRST UNIT DATA BLOCK IN SYSTEM
|
||
CHKCH1: TDNE T1,UNIDES(U) ;NEED TO REWRITE HOME BLOCKS?
|
||
JRST CPOPJ1## ;YES - SKIP RETURN
|
||
HLRZ U,UNISYS(U) ;GET ADR. OF NEXT UNIT DATA BLOCK IN SYSTEM
|
||
JUMPN U,CHKCH1 ;REPEAT IF THERE IS ONE LEFT
|
||
POPJ P, ;NO "HOME" BLOCKS NEED REWRITING
|
||
;ROUTINE JUST TO WRITE OUT A HOME BLOCK FOR A UNIT WITHOUT READING IT IN.
|
||
;CALLED WITH UNIT DATA BLOCK ADRESS IN U
|
||
|
||
HOMWRT: PUSHJ P,GTHOM ;GET "HOME" BLOCK INTO CORE
|
||
JFCL ;IGNORE ERRORS
|
||
HRRZ P1,@ONCMBF ;ADRESS OF MONITOR BUFFER
|
||
ADDI P1,1 ;POINT IT PAST FIRST IOWD
|
||
MOVSI P2,'HOM' ;BLOCK NAME
|
||
MOVE P3,[CODHOM##] ;IDENTIFYING CODE
|
||
MOVEM P2,BLKNAM##(P1) ;SAVE SIXBIT "HOME" BLOCK IDENTIFIER
|
||
HRRZ P2,UNISTR(U) ;GET STR DATA BLOCK ADR.
|
||
MOVE T1,UNIHID(U) ;GET SIXBIT UNIT ID
|
||
MOVEM T1,HOMHID##(P1) ;SAVE IN "HOME" BLOCK
|
||
SETZM HOMLEN##+1(P1)
|
||
HRLZI T1,HOMLEN##+1(P1)
|
||
HRRI T1,HOMLEN##+2(P1)
|
||
BLT T1,HOMLEN##+4(P1)
|
||
MOVEI T1,MFDSIZ## ;MAKE UFD'S FOR [1,1] AND [1,4]
|
||
MOVEM T1,HOMLEN##+3(P1) ; EXTRA LONG TO MINIMISE DSK READ
|
||
MOVEM T1,HOMLEN##+5(P1)
|
||
HLRZ T1,UNISTR(U) ;GET NEXT UNIT DATA BLOCK ADR. IN STR
|
||
SKIPE T1 ;SAVE 0 IF LAST UNIT IN STR OR NOT IN AN STR
|
||
MOVE T1,UNIHID(T1) ;GET ITS ID
|
||
MOVEM T1,HOMNXT##(P1) ;SAVE IN "HOME" BLOCK
|
||
SKIPE T1,P2 ;SAVE 0 STR NAME IF UNIT NOT IN AN STR
|
||
MOVE T1,STRNAM##(P2) ;GET SIXBIT STR NAME
|
||
MOVEM T1,HOMSNM##(P1) ;SAVE IN "HOME" BLOCK
|
||
SKIPE T1,P2 ;STORE 0 FOR OWNER PPN IF UNIT NOT IN A STR
|
||
MOVE T1,STRPPN##(P2) ;GET OWNER PPN
|
||
MOVEM T1,HOMOPP##(P1) ;SAVE IN "HOME" BLOCK
|
||
JUMPE P2,HOMWR3 ;BYPASS ALL REFERENCES TO VALUES IN STR
|
||
HLRZ T1,STRUNI##(P2) ;GET ADR. OF 1ST UNIT DATA BLOCK IN STR
|
||
|
||
HOMWR1: JUMPE T1,HOMWR2 ;IF NONE LEFT SAVE 0 IN HOMPRV
|
||
HLRZ T2,UNISTR(T1) ;GET ADR. OF NEXT UNIT DATA BLOCK IN STR
|
||
MOVE T3,UNIHID(T1) ;GET CURRENT UNIT'S SIXBIT ID
|
||
MOVE T1,T2 ;CURRENT UNIT_NEXT UNIT
|
||
CAME T2,U ;ADDR OF NEXT UNIT SAME AS THIS ONE?
|
||
JRST HOMWR1 ;PUT SIXBIT ID INTO THIS UNIT'S "HOME" BLOCK
|
||
|
||
HOMWR2: MOVEM T3,HOMPRV##(P1) ;SAVE IN "HOME" BLOCK
|
||
HLRZ T1,STRBSC##(P2) ;GET # BLOCKS PER SUPER CLUSTER
|
||
MOVEM T1,HOMBSC##(P1) ;SAVE IN "HOME" BLOCK
|
||
HRRZ T1,STRSCU##(P2) ;GET # SUPER CLUSTERS PER UNIT
|
||
MOVEM T1,HOMSCU##(P1) ;SAVE IN "HOME" BLOCK
|
||
MOVE T1,STRSRC##(P2) ;GET LOG. STR # OF STR IN "SYS" SEARCH LIST
|
||
MOVEM T1,HOMSRC##(P1) ;SAVE IN "HOME" BLOCK
|
||
SKIPL T1,STRSDL##(P2) ;CONVERT POS IN SDL FROM INTERNAL 0...N-1
|
||
ADDI T1,1 ; TO 1...N IN HOME BLOCK BUT LEAVE -1 ALONE
|
||
MOVEM T1,HOMSDL##(P1) ;STORE IN HOME BLOCK
|
||
MOVE T1,STYCNP##(P2) ;GET BYTE PTR. FOR CLUSTER COUNT
|
||
MOVEM T1,HOMCNP##(P1) ;SAVE IN "HOME" BLOCK
|
||
MOVE T1,STYCKP##(P2) ;GET BYTE PTR. FOR CHECKSUM
|
||
MOVEM T1,HOMCKP##(P1) ;SAVE IN "HOME" BLOCK
|
||
MOVE T1,STYCLP##(P2) ;GET BYTE PTR. FOR CLUSTER ADR.
|
||
MOVEM T1,HOMCLP##(P1) ;SAVE IN "HOME" BLOCK
|
||
MOVE T1,STRGAR##(P2) ;GET # BLOCKS GUARANTEED TO USER BY RESERVATION
|
||
MOVEM T1,HOMGAR##(P1) ;SAVE IN "HOME" BLOCK
|
||
HLLZ T1,STRREF##(P2) ;GET 'REFRESH' FLAG
|
||
HLLM T1,HOMREF##(P1) ;SAVE IN "HOME" BLOCK
|
||
MOVE T1,STROVR##(P2) ;GET -VE # BLOCKS USER IS ALLOWED TO OVERDRAW
|
||
MOVEM T1,HOMOVR##(P1) ;SAVE IN "HOME" BLOCK
|
||
HRRZ T1,STRK4C##(P2) ;GET # K FOR CRASH.SAV
|
||
MOVEM T1,HOMK4C##(P1) ;SAVE IN "HOME" BLOCK
|
||
LSH T1,BLKSPK ;CONVERT TO # BLOCKS
|
||
SKIPE T1 ;NO EXE DIRECTORY IF NO FILE
|
||
ADDI T1,4 ;ALLOCATE 1 MORE PAGE FOR EXE DIRECTORY
|
||
MOVEM T1,HOMLEN##(P1) ;SAVE IN "HOME" BLOCK
|
||
LDB T1,STYPVS## ;GET PRIVATE STR BIT
|
||
DPB T1,HOYPVS## ;SAVE IN "HOME" BLOCK
|
||
LDB T1,STYSET## ;GET SET NUMBER
|
||
DPB T1,HOYSET## ;SAVE IN "HOME" BLOCK
|
||
|
||
HOMWR3: MOVE T1,UNILOG(U) ;GET SIXBIT LOGICAL UNIT WITHIN STR
|
||
MOVEM T1,HOMLOG##(P1) ;SAVE IN "HOME" BLOCK
|
||
LDB T1,UNYLUN## ;GET LOGICAL UNIT # WITHIN STR
|
||
MOVEM T1,HOMLUN##(P1) ;SAVE IN "HOME" BLOCK
|
||
MOVE T1,UNIHOM(U) ;GET LOG. BLOCK #'S OF BOTH "HOME" BLOCKS
|
||
MOVEM T1,HOMHOM##(P1) ;SAVE IN "HOME" BLOCK
|
||
HLL T1,UNIGRP(U) ;GET # CONSECUTIVE CLUSTERS TRIED FOR ON O/P
|
||
HLRZM T1,HOMGRP##(P1) ;SAVE IN "HOME" BLOCK
|
||
LDB T1,UNYK4S## ;GET # K FOR SWAPPING ON THIS UNIT
|
||
MOVEM T1,HOMK4S##(P1) ;SAVE IN "HOME" BLOCK
|
||
LDB T1,UNYBPC## ;GET # BLOCKS PER CLUSTER
|
||
MOVEM T1,HOMBPC##(P1) ;SAVE IN "HOME" BLOCK
|
||
LDB T1,UNYSIC## ;GET # SAT BLOCKS IN CORE FOR THIS UNIT
|
||
MOVEM T1,HOMSIC##(P1) ;SAVE IN "HOME" BLOCK
|
||
MOVE T1,UNISUN(U) ;GET LOG. UNIT # IN ASL
|
||
MOVEM T1,HOMSUN##(P1) ;SAVE IN "HOME" BLOCK
|
||
SKIPE T1,SWPTAB##+1(T1) ;GET UNIT OF NEXT UNIT IN ASL
|
||
MOVE T1,UNIHID(T1) ;GET ITS SIXBIT ID
|
||
MOVEM T1,HOMSID##(P1) ;SAVE IN "HOME" BLOCK
|
||
MOVE T1,UNISLB(U) ;GET 1ST. LOG. BLOCK # FOR SWAPPING
|
||
MOVEM T1,HOMSLB##(P1) ;SAVE IN "HOME" BLOCK
|
||
LDB T1,UNYCFS## ;GET CLASS FOR SWAPPING
|
||
MOVEM T1,HOMCFS##(P1) ;SAVE IN "HOME" BLOCK
|
||
LDB T1,UNYSPU## ;GET # SAT BLOCKS PER UNIT
|
||
MOVEM T1,HOMSPU##(P1) ;SAVE IN "HOME" BLOCK
|
||
LDB T1,UNYUTP## ;GET UNIT TYPE
|
||
MOVEM T1,HOMUTP##(P1) ;SAVE IN 'HOME' BLOCK
|
||
|
||
;HERE TO CLEAR UNUSED PORTIONS OF HOME BLOCK
|
||
MOVEI T1,HOMEND##+1(P1) ;FIRST WORD TO CLEAR
|
||
CAILE T1,HOMCOD##-1(P1) ;SKIP IF AT LEAST ONE WORD
|
||
JRST HOMWR4
|
||
SETZM (T1) ;CLEAR THE FIRST WORD
|
||
CAIN T1,HOMCOD##-1(P1) ;SKIP IF MORE
|
||
JRST HOMWR4
|
||
HRLZI T1,HOMEND##+1(P1)
|
||
HRRI T1,HOMEND##+2(P1)
|
||
BLT T1,HOMCOD##-1(P1) ;CLEAR UNUSED WORDS
|
||
|
||
HOMWR4: PUSHJ P,WRTVID ;STORE VOLID STUFF IN HOME BLOCK
|
||
MOVEM P3,BLKCOD##(P1) ;SAVE CODE WORD IN "HOME" BLOCK
|
||
MOVE P4,UNIHOM(U) ;GET LOG BLOCK #'S OF 1ST. & 2ND. "HOME" BLOCKS
|
||
PUSHJ P,WRTRUN ;WRITE OUT BOTH "HOME" BLOCKS
|
||
JFCL ;IGNORE ERRORS
|
||
MOVSI T1,UNPCHG ;CLEAR CHANGED FLAG
|
||
ANDCAM T1,UNIDES(U) ; IN UDB
|
||
POPJ P, ;RETURN
|
||
;SUBROUTINE TO WRITE REDUNDANT BLOCKS(HOM,BAT & RIB)
|
||
; ENTER WITH F = FILE DATA BLOCK ADR. U = UNIT DATA BLOCK ADR.
|
||
; P1 = ADR. OF BLOCK IN CORE. P4 = XWD 1ST. LOG. BLOCK #,2ND. LOG. BLOCK #
|
||
; RETURN WITH S = 0 IF NO ERRORS. OTHERWISE IT HAS STANDARD RH ERROR BITS SET
|
||
; T2=0 IF NO ERRORS, OTHERWISE RH=-1 IF ERROR ON 2ND. BLOCK & LH=-1 IF ON 1ST.
|
||
|
||
WRTRUN::SETZM REDERR ;CLEAR OUT ERROR SWITCH
|
||
SETOM WHICH ;INDICATE WRITING 1ST. BLOCK
|
||
WRTRN1: HLRZM P4,BLKSLF##(P1) ;SAVE THIS BLOCK # IN BLOCK
|
||
HLRZ T2,P4 ;GET LOG. BLOCK # TO WRITE
|
||
HRLZS P4 ;SETUP P3 FOR BLOCK #2
|
||
PUSHJ P,OMNWRT ;GO WRITE OUT BLOCK
|
||
PUSHJ P,WRTCHK ;ERROR - GO PRINT MSG.
|
||
SETZM WHICH ;INDICATE WRITING 2ND. BLOCK
|
||
JUMPN P4,WRTRN1 ;HAVE WE WRITTEN BOTH BLOCKS?
|
||
MOVE T2,REDERR ;PICK UP ERROR WORD FOR CHECKING BY CALLER
|
||
JUMPE S,CPOPJ1## ;SKIP RETURN IF NO ERRORS
|
||
POPJ P, ;EXIT
|
||
|
||
WRTCHK: MOVEI T1,[ASCIZ .% Hardware write error.]
|
||
MOVE T2,P2 ;COPY BLOCK NAME
|
||
PJRST RDNMSG ;PRINT MESSAGE AND RETURN
|
||
;SUBROUTINE TO READ OR WRITE A BLOCK FOR THE ONCE ONLY & REFRESHER
|
||
; ENTER WITH T2 = LOG. BLOCK # TO READ OR WRITE. U = UNIT DATA BLOCK ADR.
|
||
; F = FILE DATA BLOCK ADR.
|
||
; RETURN WITH S = 0 IF NO ERRORS. OTHERWISE IT HAS STANDARD RH ERROR BITS SET
|
||
|
||
OMNWRT::SKIPA T3,[MONWRU##] ;GET ADR. OF WRITE RTNE. IN FILSER
|
||
|
||
OMNRED::MOVEI T3,MONRDU## ;GET ADR. OF READ RTNE. IN FILSER
|
||
;(BOTH TO NOT USE THE DISK CACHE)
|
||
OMONIO: MOVEI S,0 ;CLEAR S FOR ERROR STATUS CHECKING
|
||
PUSHJ P,STORU## ;SETUP DEVUNI FOR MONRED/WRT SINCE IT DOESN'T USE U
|
||
MOVE T1,[JRST ONCWAT##] ;SETUP A FAKE PWAIT1
|
||
MOVEM T1,PWAIT1##
|
||
MOVSI T1,DVDSK ;MAKE SURE THE DDB
|
||
IORM T1,DEVMOD(F) ; LOOKS LIKE A DISK
|
||
MOVE J,UDBKDB(U) ;RELOAD J
|
||
MOVE T1,@ONCMBF ;GET IOWD FOR MONRED/WRT
|
||
XCTCPU (UNI,ONCIOX) ;DO I/O
|
||
TRO S,IODERR ;OTHER CPU DIDN'T RESPOND
|
||
TLZ S,IO ;FOR JUMPE S,WIN
|
||
TRNN S,IOIMPM!IODERR!IODTER!IOBKTL ;CHECK FOR ERRORS
|
||
AOS (P) ;NO ERRORS - SKIP RETURN
|
||
RSPWTC::MOVE T1,PWAITZ## ;RESTORE REAL PWAIT1
|
||
MOVEM T1,PWAIT1##
|
||
POPJ P,
|
||
|
||
|
||
IFN FTMP,<
|
||
;ROUTINE TO DO THE IO FOR THE REFRESHER
|
||
;ALWAYS RETURNS CPOPJ1
|
||
REFWRT::SKIPA T3,[MONWRU##] ;WRITE NOT USING DISK CACHE
|
||
REFRED::MOVEI T3,MONRDU## ;READ NOT USING DISK CACHE
|
||
PUSH P,@ONCMBF
|
||
MOVEM T1,@ONCMBF ;T1 HAS IOWD FOR THE OPERATION
|
||
PUSHJ P,OMONIO ;DO THE IO
|
||
JFCL
|
||
POP P,@ONCMBF ;RE@ONCMBF
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
>
|
||
SUBTTL CPU DEPENDANT ROUTINES
|
||
|
||
|
||
; CHECK ON/OFF-LINE STATUS OF A KONTROLLER
|
||
; CALL: PUSHJ P,CHKKON
|
||
; <NON-SKIP> ;OFF-LINE
|
||
; <SKIP> ;ON-LINE, T1 ZERO IF WRITE-HEADER-LOCKOUT OFF
|
||
CHKKON: SETZ T1, ;ASSUME WHL ON
|
||
SKIPE .UONCE## ;USER MODE?
|
||
AOJA T1,CPOPJ1## ;KONTROLLER ALWAYS ALIVE
|
||
PUSHJ P,@KONUPA(J) ;IS KONTROLLER UP?
|
||
POPJ P, ;NO--DOWN
|
||
JRST CPOPJ1## ;RETURN
|
||
|
||
|
||
; SUBROUTINE TO CHECK WRITE-LOCKED STATUS OF A UNIT
|
||
; RETURNS CPOPJ1 IF WRITE-LOCKED.
|
||
;
|
||
CHKWLK: SKIPE .UONCE## ;USER MODE?
|
||
JRST UCKWLK## ;YES
|
||
PUSHJ P,@KONHWP(J) ;CHECK UNIT
|
||
POPJ P, ;WRITE-ENABLED
|
||
JRST CPOPJ1## ;WRITE-LOCKED
|
||
|
||
|
||
; CHECK THE CAPACITY OF A DISK UNIT
|
||
; CALL: PUSHJ P,CHKCPY
|
||
; <NON-SKIP> ;ERRORS: OFF-LINE, NO SUCH UNIT, ILLEGAL SECTOR
|
||
; <SKIP> ;T1 THROUGH T4 LOADED BY KONCPY ROUTINE
|
||
;
|
||
CHKCPY: SKIPE .UONCE## ;USER MODE?
|
||
JRST UCKCPY## ;DO IT THE HARD WAY
|
||
PUSHJ P,@KONCPY(J) ;CRANK UP FILSER
|
||
POPJ P, ;ERRORS
|
||
JRST CPOPJ1## ;RETURN
|
||
|
||
|
||
; PERFORM I/O
|
||
; CALL: PUSHJ P,ONCIOX
|
||
;
|
||
; *** NOTE *** THIS ROUTINE WILL ALWAYS SKIP!
|
||
;
|
||
ONCIOX: SKIPN .UONCE## ;NO PI STUFF IN USER MODE (TWICE)
|
||
CONO PI,PI.ON ;MAKE SURE THE PI SYSTEM IS ON FOR ONCWAT
|
||
PUSHJ P,(T3) ;DO I/O
|
||
JRST CPOPJ1## ;RETURN
|
||
IFN FTCIDSK,<
|
||
|
||
;ROUTINE TO DO AN ONLINE OF A CI DISK
|
||
;CALL:
|
||
; J/ KDB ADDRESS
|
||
; U/ UDB ADDRESS
|
||
;RETURN:
|
||
; CPOPJ IF ERROR
|
||
; CPOPJ1 IF SUCCESS
|
||
|
||
ONCONL: SETZM ONLDON ;START AFRESH
|
||
PUSHJ P,SAVE4## ;SAVE SOME AC'S AGAINST CORRUPTION
|
||
SE1ENT ;ENSURE WE RUN IN NZS
|
||
HRRZ P4,J ;GET KDB ADDRESS
|
||
ADD P4,.CPCPN## ;OFFSET BY OUR CPU NUMBER
|
||
MOVE P4,RAKCTI##(P4) ;GET THE CONNECT TABLE INDEX
|
||
PUSHJ P,MSCGBF## ;GET A BUFFER TO USE
|
||
POPJ P, ;NONE AVAILABLE?
|
||
HLLZ T1,ONLFLG ;GET FLAGS FROM LAST ONLINE END PACKET
|
||
PUSHJ P,REVFUL## ;PUT THEM BACK AS THE HSC WANTS THEM
|
||
MOVEM T1,P.UNFL(P2) ;STORE FLAGS
|
||
MOVE T1,UDBPDN(U) ;PHYSICAL DRIVE NUMBER
|
||
MOVEI R,.RROON ;RECALL CODE
|
||
PUSHJ P,MSCUON## ;DO A UNIT ONLINE
|
||
MOVSI T1,3*ONCTIM## ;WAIT A WHILE
|
||
SKIPN ONLDON ;DID IT COMPLETE YET?
|
||
SOJG T1,.-1 ;NO, WAIT A WHILE LONGER
|
||
JUMPG T1,CPOPJ1## ;SKIP RETURN IF IT SUCCEEDED
|
||
POPJ P, ;RETURN
|
||
|
||
ONLDON::0 ;SET NON-ZERO WHEN RAXKON GETS A RESPONSE TO
|
||
; A SET UNIT ONLINE COMMAND TO THE HSC
|
||
ONLFLG::0 ;FLAGS FROM LAST UNIT ONLINE COMMAND
|
||
>; END IFN FTCIDSK
|
||
SUBTTL DATA STORAGE
|
||
|
||
TMPSWB: BLOCK 1 ;TEMPORARY SWAP BLOCK NUMBER
|
||
TMPSWM: BLOCK 1 ;TEMPORARY MINIMUM SWAP BLOCK NUMBER
|
||
ONCMBF::BLOCK 1 ;ADDRESS OF MONITOR BUFFER FOR ONCE/TWICE
|
||
MONBUF: BLOCK 200 ;STORAGE FOR MONITOR BUFFER
|
||
ERRHOM: 0 ;FLAG FOR ERRORS WHILE READING A "HOME" BLOCK
|
||
SERIUS: 0 ;-1 WHEN IF START SYSTEM EVEN IF QUICK OPTION
|
||
ONCDDB: BLOCK 1 ;ADDRESS OF ONCE-ONLY DDB
|
||
BATFLG: BLOCK 1 ;NON-ZERO WE WANT TO LOOK AT BAD REGIONS
|
||
BLURBF: BLOCK 1 ;NON-ZERO IF DIALOGUE BLURB TYPED
|
||
UNITFL: BLOCK 1 ;NON-ZERO IF CHANGING UNITS WITH STR
|
||
SUDTAB: BLOCK ^D36 ;STRUCTURE/UNIT/DISK-SET NAME TABLE
|
||
POSTAB: BLOCK ^D36 ;STRUCTURE/UNIT/DISK-SET POSITION TABLE
|
||
|
||
XLIST
|
||
LIT
|
||
VAR
|
||
LIST
|
||
|
||
ONCEND: END
|