1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-01-31 05:42:03 +00:00
Files
PDP-10.stacken/files/stacken-tape-backup/dskb:10_7/mon/sysini.mac
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

4599 lines
158 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE SYSINI - SYSTEM INITIALIZATION AND ONCE-ONLY DIALOGUE - V2075
SUBTTL JOSEPH A. DZIEDZIC /JAD 13-SEP-88
SEARCH F,S,DEVPRM,NETPRM,BTSPRM
$RELOC
$INIT
.DIREC FLBLST ;FOR CLEANER LISTINGS
;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 1969,1970,1971,1972,1973,1974,
; 1975,1976,1977,1978,1979,1980,1982,1984,1986,1988.
;ALL RIGHTS RESERVED.
.CPYRT<1969,1988>
XP VSYSII,2075 ;MODULE VERSION NUMBER
ENTRY SYSINI ;SYSTEM INITIALIZATION ROUTINE
;THE MONITOR MODULES SYSINI AND ONCE WERE COMBINED INTO ONE MODULE NAMED
;"SYSINI" IN THE VERSION 7.04 MONITOR. THE AUTHORS OF THOSE MODULES WERE:
;ONCE - T. HASTINGS/CHW/RCC/AF/DAL
;SYSINI - TH/RCC/TL/AF/PH/DAL/BGE/RLD/JBS
;NOTE THAT SYSINI MAY INCLUDE INITIALIZATION ROUTINES WHICH SHOULD NOT
;BE CALLED. THIS HAPPENS IF THE FEATURE TEST SWITCH FOR A FEATURE IS ON,
;BUT THE MODULE IS NOT LOADED BECAUSE OF THE ANSWER TO A MONGEN QUESTION.
;TO SOLVE THIS PROBLEM, COMMON DEFINES SYMBOLS =0 IF THE ROUTINE IS
;NOT TO BE CALLED, = NON-0 IF IT IS TO BE CALLED.
SAVITM=40 ;SAVED DEVICE DISPATCH ADDRESS IN IOGO
SUBTTL SYSTEM DEBUGGING STARTUP
;CODE TO SET MONITOR FOR DEBUGGING SESSION WITH EXEC DDT
;MAKE STARTUP BE FAST
;SYSTEM PROGRAMMER TYPES DEBUG$G TO START MONITOR
;ALLOW SAME COPY OF MONITOR TO BE USED FOR REGULAR SYSTEM
;SIMPLY BY NOT STARTING AT DEBUG.
DEBUG::
IFN FTXMON,<XJRST [MCSEC0+.+1]> ;ALWAYS STARTUP IN SECTION ZERO
MOVEI T1,DDTEND## ;END OF DDT
HRRM T1,PATSIZ ;INCLUDE DDT IN SYSTEM SIZE
;PATCH DDTCPU WITH A JFCL TO BYPASS SMP DEBUGGING FEATURES
IFN FTMP,<
MOVE T1,BOOTCP## ;GET OUR CPU NUMBER
DDTCPU: MOVEM T1,DEBCPU## ;SAVE FOR DEBUGGING SMP
>; END IFN FTMP
MOVSI T1,(DF.SBD+DF.NAR) ;FLAG SYSTEM DEBUGGING IN PROGRESS,
; DISABLE AUTOMATIC SYSTEM RELOAD
IORM T1,DEBUGF## ;FLAG DEBUGGING MODE
; SO WHY RELOAD, LONG DIALOG
; UNITS OFF-LINE NOT ASKED
;ALSO, NOTICES 21 NON-ZERO
; RETURN IS BY GOBACK$G
MOVEI T1,ST.NRT ;TURN OFF REMOTE
IORM T1,STATES## ; TTY'S
JRST SYSINI ;START UP SYSTEM
;IF PATCHED WITH A SIXBIT STRUCTURE NAME, SAID STRUCTURE WILL BE STUFFED
;INTO THE SDL AND SSL, AND THE LOGICAL UNITID INTO THE ASL. A MINUS ONE
;MEANS USE THE BOOTSTRAP STRUCTURE.
DDTDSK::EXP 0 ;DEFAULT TO NORMAL ASL/SDL/SSL STUFF
;ROUTINE TO SEE IF MONITOR WILL RUN WITH EDDT
DDTCHK: HRRZ T1,PATSIZ ;GET START OF PATCH SPACE
SKIPL DEBUGF## ;DEBUGGING?
CAIN T1,DDTEND## ;KEEPING EDDT?
JRST DDTCH2 ;YES
SKIPA T2,[-$NB##,,0] ;AOBJN POINTER TO DDT'S BREAKPOINTS
DDTCH1: ADDI T2,$2B##-$1B##-1 ;OFFSET TO NEXT BREAKPOINT
SKIPG $1B##(T2) ;THIS BREAKPOINT SET?
AOBJN T2,DDTCH1 ;NO, CHECK THE REST
JUMPGE T2,CPOPJ## ;NORMAL STARTUP?
DDTCH2: MOVEI T1,DDTEND## ;FIX UP PATSIZ
HRRM T1,PATSIZ ;...
JRST CPOPJ1## ;INDICATE RUNNING WITH EDDT
SUBTTL PRIMARY SYSTEM INITIALIZATION
;SYSINI IS BRANCHED TO FROM SYSTRT (COMMON) OR DEBUG (SYSINI) TO
;BEGIN SYSTEM INITIALIZATION. PAGING HAS BEEN TURNED ON.
SYSINI::CONO APR,AP.IOR ;IO RESET
MOVE P,.CPNPD## ;SET UP A PDL FOR THIS
SETZM CLKDDT ;ZERO OUT LOCATIONS
SETZM CPNDDT ; WHICH MIGHT CAUSE
SETZM CRSHWD ; PROBLEMS DURING
SETZM SYSSNP ; INITIALIZATION OR LATER
MOVEI F,CT.P6 ;ASSUME A 166 (PDP-6) PROCESSOR
JFCL 17,.+1 ;CLEAR ALL FLAGS
JRST .+1 ;SET PC CHANGE FLAG IF CPU IS A 166
JFCL 1,CPU166 ;BRANCH IF PDP-6
SETZ T1, ;THE TEST FOR A KL10 PROCESSOR
BLT T1,0 ;IS A NO-OP BLKT LEAVING AC NON-ZERO
JUMPE T1,CPU166 ;JUMP IF NOT KL OR KS
MOVEI P1,1
SETZ P2, ;BIG BINARY INTEGER
MOVEI P4,1 ;ONE DIGIT BYTE
EXTEND P1,[CVTBDO] ;CONVERT WILL ABORT
TLNN P4,200000 ;TEST EFFECT ON N
JRST CPKS10
; JRST CPKL10
CPKL10: SKIPA F,[CT.KL] ;SET TYPE AS KL10
CPKS10: MOVEI F,CT.KS ;SET TYPE AS KS
CPU166: CAME F,.CPTYP## ;DO WHAT THE MONITOR WAS BUILT FOR AND
; THE CURRENT MACHINE AGREE?
STOPCD .,HALT,WCT ;++WRONG CPU TYPE
SYSIN1:
IFN FTKL10,<
APRID T1 ;READ MISCELLANEOUS JUNK
MOVEI T2,^D60 ;ASSUME NORTH AMERICAN LINE FREQUENCY
TRNE T1,ID.50H ;50 CYCLE DYNAMOS?
MOVEI T2,^D50 ;YES
> ;END IFN FTKL10
IFN FTKS10,<
MOVEI T2,M.TPS## ;THERE'S GOT TO BE A BETTER WAY OF DOING THIS
> ;END IFN FTKS10
MOVEM T2,TICSEC## ;SAVE TICKS/SECOND FOR CLOCK1, GETTABS, ETC.
MOVSI T3,(ST.CYC) ;SET BIT SIX OF STATES IF 50 HZ POWER
CAIN T2,^D50 ;50 HERTZ POWER?
IORM T3,STATES## ;YES
IMULI T2,^D60 ;COMPUTE THE NUMBER OF TICKS PER MINUTE
MOVEM T2,TICMIN## ;SAVE FOR CURIOUS EYES
IMULI T2,^D60*^D24 ;NUMBER OF TICS PER DAY
MOVEM T2,MIDNIT## ;SAVE THAT FOR MIDNIGHT CHECKING
IFN FTMP,<
MOVEI T1,M.CPU## ;SETUP COUNTER
SYSIN2: MOVNI T2,(T1) ;MINUS CPU NUMBER
IMUL T2,TICSEC## ;COMPUTE INITIAL OK WORD
MOVEM T2,COKTAB##-1(T1) ;STORE AWAY
SOJG T1,SYSIN2 ;FILL THE TABLE
> ;END IFN FTMP
IFN FTKL10,<
MOVE T1,.CPCPN## ;FOR THIS CPU
PUSHJ P,DTEINI## ;INITIALIZE DTE'S EARLY
PUSHJ P,ENTSPC## ;START SECONDARY PROTOCOL ON MASTER DTE
>; END IFN FTKL10
IFN FTKS10,<
PUSHJ P,DISKAL## ;DISABLE KEEP-ALIVE COUNTING
SETZM CTYIWD ;ZERO OUT 8080 COMMS WORDS
MOVE T1,[CTYIWD,,CTYIWD+1]
BLT T1,KLIOWD
>; END IFN FTKS10
IFN FTMP,<
PUSHJ P,BCOM0## ;ESTABLISH CPU 0
>; END IFN FTMP
MOVE T1,[<PM.DCD>B2+PM.WRT+PM.PUB+NUPMPP##] ;SET UP NULL JOB MAPPING
MOVEM T1,NLUPMP##+.UMUPT ; FOR UPT
MOVEM T1,NLUPMP##+.UMUPM ; FOR S0 MAP
MOVEM T1,NLUPMP##+.UMUUP ; FOR CACHED UPMP REFERENCES
MOVEM T1,NLUPMP##+.UMJDT ; FOR .JDAT REFERENCES
CLRPGT ;MAKE SURE CHANGES IN MAPPING ARE VISIBLE
PUSHJ P,BOOTNX ;COPY BOOTSTRAP NXMTAB
PUSHJ P,BOOTSZ ;FIXUP SYSORG TO ACCOUNT FOR UNMAPPED BOOTSTRAP
PUSHJ P,BOOTFX ;FIND OUT WHERE THE MONITOR WAS READ FROM
IFN FTXMON,<PUSHJ P,BOOTMP> ;MAP BOOT INTO THE MONITOR'S ADDRESS SPACE
PUSHJ P,PATFIX ;FIXUP "PAT" GLOBAL BEFORE MOVING SYMBOL TABLE
SUBTTL MOVE MONITOR PSECTS TO FINAL RESTING PLACES
;THE ORDER IN WHICH THE VARIOUS PIECES OF THE MONITOR ARE MOVED AROUND
;IS VERY IMPORTANT DUE TO THE ORDERING OF THE PSECTS IN THE .EXE FILE.
;DON'T CHANGE THIS ORDER UNLESS YOU KNOW WHAT YOU ARE DOING, AND THEN
;BE SMART AND DON'T CHANGE THE ORDER ANYWAY.
;
;FOR NON-EXTENDED MONITOR: MOVE HIGH SEGMENT AND THEN SYMBOL TABLE.
;
;FOR EXTENDED MONITOR: MOVE EXTENDED HIGH SEGMENT, EXTENDED SYMBOL TABLE,
;HIGH SEGMENT, AND THEN COMMON SUBROUTINES PSECT.
;FIRST SETUP MONVFF, SYSLEN, AND CSBLEN (IFN FTXMON)
SETLEN: MOVE T1,MONEND## ;GET LAST ADDRESS IN HIGH SEGMENT
SUBI T1,MONORG##-1 ;SUBTRACT ORIGIN OF HIGH SEGMENT
TRZE T1,PG.BDY ;ROUND UP
ADDI T1,PAGSIZ ;LENGTH OF THE HIGH SEGMENT IN WORDS
MOVEM T1,SYSLEN## ;STORE THE LENGTH OF THE HIGH SEGMENT
ADDI T1,MONORG## ;ADD IN START OF HIGH SEGMENT
MOVEM T1,MONVFF## ;SET UP HONORABLE (BUT NO LONGER USED) VARIABLE
MOVEI T1,HLCSAD## ;HIGHEST LEGAL ADDRESS IN HIGH SEGMENT
SUB T1,MONVFF## ;SUBTRACT FIRST ADDRESS FOLLOWING HIGH SEGMENT
ASH T1,W2PLSH ;CONVERT TO A NUMBER OF PAGES
JUMPLE T1,SETLN1 ;QUIT IF NOTHING TO ZERO
MOVEI T2,<HLCSAD##/PAGSIZ>-1 ;LAST PAGE TO CLEAR MAPPING FOR
ADD T2,.CPMAP## ;ADD IN ADDRESS OF SECTION 0/1 MAP
SETZM (T2) ;CLEAR AN ENTRY IN THE MAP
SOSLE T1 ;QUIT WHEN COUNT EXHAUSTED
SOJA T2,.-2 ;LOOP FOR ALL MAP SLOTS TO CLEAR
SETLN1:
IFN FTXMON,<
MOVE T1,CSBEND## ;GET LAST ADDRESS IN COMMON SUBS PSECT
SUBI T1,CSBORG##-1 ;SUBTRACT ORIGIN OF COMMON SUBS PSECT
TRZE T1,PG.BDY ;ROUND UP
ADDI T1,PAGSIZ ;LENGTH OF THE COMMON SUBS PSECT IN WORDS
MOVEM T1,CSBLEN## ;STORE THE LENGTH OF THE COMMON SUBS PSECT
SUBI T1,<MONORG##-CSBORG##> ;CALCULATE NUMBER OF WORDS NOT IN CSUB
JUMPGE T1,SETLN2 ;JUMP IF NO LEFT OVER WORDS
ASH T1,W2PLSH ;CONVERT TO NUMBER OF PAGES TO CLEAR
MOVEI T2,<MONORG##/PAGSIZ>-1 ;LAST PAGE TO CLEAR MAPPING FOR
ADD T2,.CPMAP## ;ADD IN ADDRESS OF SECTION 0/1 MAP
SETZM (T2) ;CLEAR AN ENTRY IN THE MAP
AOSGE T1 ;QUIT WHEN COUNT EXHAUSTED
SOJA T2,.-2 ;LOOP FOR ALL MAP SLOTS TO CLEAR
SETLN2:
>; END IFN FTXMON
;MOVE EXTENDED HIGH SEGMENT
IFN FTXMON,<
MOVXHI: MOVE T1,[XHIORG##] ;WHERE EXTENDED HIGH SEGMENT STARTS
MOVE T2,XHIEND## ;WHERE IT ENDS
CAMLE T1,T2 ;IS THERE ANY CODE TO MOVE?
JRST MOVXH1 ;NO, SKIP OVER SOME CODE
PUSHJ P,MOVPSE ;MOVE THE PSECT TO IT'S FINAL RESTING PLACE
IFN FTKL10,<
MOVE T1,.CPEPT## ;GET ADDRESS OF THIS CPU'S EPT
MOVSI T2,(PM.KPM) ;"KEEP ME" BIT
SKIPE .CPKPM## ;IF CPU HAS AN MCA25,
IORM T2,<SECTAB+<(MS.HGH)>>(T1) ; LIGHT THE BIT IN XHIGH SEC PTR
>; END IFN FTKL10
MOVXH1:
MOVXST: PUSHJ P,SYTBFX ;MOVE SYMBOL TABLE TO SECTION 35
;STILL IN IFN FTXMON
;MAP EXTENDED LOW SEGMENT 1:1 VIA INDIRECT POINTERS TO SECTION 0/1 MAP
MAPXLS: MOVE T3,.CPEPT## ;THIS CPU'S EPT
MOVE T1,<SECTAB+(MS.HGH)>(T3) ;SECTION POINTER FOR EXTENDED HIGH SEG MAP
MOVE T3,.CPMAP## ;THIS CPU'S MAP
MOVEM T1,.ECKSM/PAGSIZ(T3) ;TO MAKE THE MAP ADDRESSABLE
CLRPT .ECKSM ;MAKE NEW MAPPING VISIBLE
MOVEI T1,(<PM.ICD>B2+PM.WRT+PM.PUB+PM.CSH+PM.KPM+PM.SWB)
; INDIRECT POINTERS TO SECTION 0 MAP
HRLI T1,SPTLOW##-SPTTAB## ;SPT SLOT USED FOR MAPPING EXTENDED HIGH SEGMENT
MOVS T2,.CPCPN## ;OUR CPU NUMBER
ADD T1,T2 ;ADD THAT TO THE SPT INDEX
MOVEI T2,0 ;STARTING AT PAGE 0
MAPXL1: SKIPE (T3) ;IF THE PAGE EXISTS IN THE SECTION 0 MAP,
MOVSM T1,.ECKSM(T2) ;POINT AT IT IN THE EXTENDED HIGH SEG MAP
ADDI T1,1 ;NEXT PAGE
ADDI T3,1 ; ..
CAIGE T2,CSBORG##/PAGSIZ-1 ;UP TO COMMON SUBROUTINES ORIGIN?
AOJA T2,MAPXL1 ;NO, DO THE NEXT PAGE
TRZ T1,(PM.SWB) ;WRITE LOCKED FROM HERE ON OUT
ADDI T2,1 ;ACCOUNT FOR MISSING AOS AT END OF LOOP ABOVE
MOVE T4,CSBEND## ;GET END OF COMMON SUBROUTINES ENTRY
LSH T4,W2PLSH ;CONVERT TO HIGHEST PAGE TO MAP
MAPXL2: MOVSM T1,.ECKSM(T2) ;POINT AT IT IN THE EXTENDED HIGH SEG MAP
ADDI T1,1 ;NEXT PAGE
CAMGE T2,T4 ;THROUGH THE END OF THE COMMON SUBROUTINES?
AOJA T2,MAPXL2 ;NO, DO THE NEXT PAGE
ADDI T2,1 ;ACCOUNT FOR MISSING AOS AT END OF LOOP ABOVE
MOVEI T1,<XHIORG##&777777> ;IN-SECTION ORIGIN OF EXTENDED HIGH SEG
MOVEI T3,CSBORG## ;ORIGIN OF COMMON SUBROUTINES
ADD T3,CSBLEN## ;PLUS LENGTH
SUB T1,T3 ;CALCULATE NUMBER OF PAGES TO ZERO MAPPING FOR
ASH T1,W2PLSH
JUMPLE T1,MAPXL3 ;GO IF SOMETHING FUNNY HAPPENED
SETZM .ECKSM(T2) ;ZERO A WORD
SOSLE T1 ;DECREMENT COUNT, SKIP WHEN DONE
AOJA T2,.-2 ;LOOP FOR ALL
MAPXL3: MOVE T1,.CPMAP## ;NOW SETUP SKIP CPU MAPPING
MOVE T1,.EVCDB##/PAGSIZ(T1) ;GET MAPPING FOR FIRST CDB PAGE
TLO T1,(PM.SWB) ;WRITE ENABLE
MOVSI T2,-CDBPGS## ;NUMBER OF CDB PAGES TO MAP
MOVEM T1,.ECKSM+.EVCDB##/PAGSIZ(T2) ;STORE IN XHIGH SEG MAP
AOBJP T2,.+2 ;LOOP FOR ALL PAGES
AOJA T1,.-2 ;...
>; END IFN FTXMON
;MOVE .INIT. PSECT (BY HAND - SIGH)
MOVINI: MOVE P1,.CPMAP## ;GET ADDRESS OF S0/S1 MAP
MOVEI P2,.UPMAP-PAGSIZ ;LAST PAGE IN FUNNY SPACE AREA TO MOVE
MOVEI P3,<.UPMAP-PAGSIZ>/PAGSIZ ;INDEX INTO NULL JOB'S PAGE MAP
MOVI.1: PUSHJ P,GTPHPG ;GET A PHYSICAL PAGE
HRLI T1,(<PM.DCD>B2+PM.WRT) ;ACCESSIBLE AND WRITABLE
MOVEM T1,.ECKSM/PAGSIZ(P1) ;VIA ADDRESS .ECKSM
CLRPT .ECKSM ;MAKE NEW MAPPING VISIBLE
MOVS T2,P2 ;COPY SOURCE ADDRESS
HRRI T2,.ECKSM ;DESTINATION ADDRESS
BLT T2,.ECKSM+PG.BDY ;TRANSFER THE PAGE
HRRM T1,NLUPMP##(P3) ;STORE NEW MAPPING
SUBI P2,PAGSIZ ;BACK OFF BY ONE PAGE
CAIL P2,FYSORG ;DONE THEM ALL?
SOJA P3,MOVI.1 ;NO, LOOP
CLRPGT ;MAKE NEW FUNNY SPACE MAPPING VISIBLE
;MOVE HIGH SEGMENT
MOVHGH: MOVEI T1,MONORG## ;ORIGIN OF PSECT
MOVE T2,MONEND## ;END OF PSECT
PUSHJ P,MOVPSE ;MOVE THE PSECT TO IT'S FINAL RESTING PLACE
;MOVE COMMON SUBROUTINES PSECT
IFN FTXMON,<
MOVCSB: MOVEI T1,CSBORG## ;GET START OF PSECT
MOVE T2,CSBEND## ;GET END OF COMMON SUBROUTINES SEGMENT
PUSHJ P,MOVPSE ;MOVE THE PSECT TO IT'S FINAL RESTING PLACE
>; END IFN FTXMON
;FINISH UP WITH LOOSE ENDS
IFE FTXMON,<PUSHJ P,SYTBFX> ;FIXUP SYSORG TO ACCOUNT FOR HIDDEN SYMBOL
; TABLE, MOVE SYMBOL TABLE TO HIGH MEMORY
IFN FTXMON,<PUSHJ P,SETEDV##> ;SET UP EXEC DATA VECTOR
IFE FTXMON,<PUSHJ P,BOOTMP> ;MAP BOOT INTO THE MONITOR'S ADDRESS SPACE
PUSHJ P,BSTRNG ;BUILD BOOTS COMMAND FOR AUTO-RELOAD
IFN FTKL10,<PUSHJ P,CLRSBD##> ;CLEAN MEMORY CONTROLLERS
IFN FTXMON,<XJRST [MCSEC1+HIGHIN]> ;GET INTO SECTION 1 SO CAN LOOK AT THINGS
HIGHIN:
IFN FTXMON,<XJRST [MCSEC0+.+1]> ;RETURN TO SECTION 0
SUBTTL INITIALIZE TABLE OF LOWER CORE FOUR WORD BLOCKS FOR I/O
IFN FTKL10,<
SETLOW: MOVE T1,LOWPTR## ;ABOJN POINTER TO LOWTAB
SETOM (T1) ;SET IT TO ALL ONES
AOBJN T1,.-1 ; ..
MOVEI P1,LTINIT## ;ADDRESS OF TABLE CONTAINING ADDRESSES OF
; LOWER CORE FOUR WORD BLOCKS
HRRZ P2,LTINIT## ;ADDRESS OF FIRST FOUR WORD BLOCK
MOVEM P2,LOWLOC## ;STORE THAT AS ORIGIN OF FOUR WORD IOWD SPACE
SETLO1: SKIPN T2,(P1) ;NEXT CHUNK OF FOUR WORD SPACE
JRST SETLO2 ;ALL DONE
HLRZ T1,(P1) ;NUMBER OF FOUR WORD BLOCKS IN THIS CHUNK
HRRZS T2 ;0,,STARTING ADDRESS OF THIS CHUNK
SUBI T2,(P2) ;RELATIVE ADDRESS WITHIN IOWD SPACE
LSH T2,-2 ;FOUR WORDS PER BLOCK
IDIVI T2,^D36 ;NUMBER OF BITS REPRESENTING FOUR WORD BLOCKS
HRLS T2 ;WHERE THEY START IN THE TABLE
ADD T2,LOWPTR## ;MAKE AN AOBJN POINTER TO THE TABLE
PUSHJ P,SETZRS## ;INDICATE THAT THOSE BLOCKS ARE AVAILABLE
AOJA P1,SETLO1 ;LOOP UNTIL ALL CHUNKS ARE MARKED IN BIT TABLE
SETLO2: MOVEI T1,<<.LMMBL-.LMEBH>+3>/4 ;# OF 4-WORDS BLOCKS (= # OF BITS)
MOVEI T2,.LMEBH ;START OF EBOX/MBOX COUNTS IN UPT
PUSHJ P,MRKIOW ;MARK THE IOWD(S) IN USE
MOVEI T1,<<.EPPAC+1-.EPTMB>+3>/4 ;# 4-WORD BLOCKS (= # BITS)
MOVEI T2,.EPTMB ;START OF TIME BASE/PERF COUNT IN EPT
PUSHJ P,MRKIOW ;MARK THE IOWD(S) IN USE
>; END IFN FTKL10
SUBTTL ALLOCATE SECTION MAPS AND SCA FREE POOL
SETOM DINITF## ;TELL AUTCON WHAT KIND OF CORE TO GET
IFN FTXMON,<
MOVSI T1,(MS.MEM) ;DATA SECTION FOR PAGTAB/MEMTAB
PUSHJ P,ALCSMP ;ALLOCATE A SECTION MAP FOR SECTION 3
MOVSI T1,(MS.SCN) ;DATA SECTION FOR SCNSER DATA BASE
PUSHJ P,ALCSMP ;ALLOCATE A SECTION MAP FOR SECTION 4
MOVSI T1,(MS.SAT) ;DATA SECTION FOR SATS, ETC.
PUSHJ P,ALCSMP ;ALLOCATE A MAP FOR THIS SECTION
>; END IFN FTXMON
SUBTTL SET UP SPT AND SECTION MAP MAPPINGS
SETSPT: MOVEI T1,NUPMPP## ;PAGE NUMBER OF NULL JOB'S UPT
MOVNI T2,M.CPU## ;NUMBER OF CPUS
MOVEI T3,.E0MAP##/PAGSIZ ;PAGE NUMBER OF CPU0'S MAP
SETSP1: MOVEM T1,JBTUPM##(T2) ;SETUP CONTEXT SLOTS IN THE SPT
MOVEM T3,SPTLOW##+M.CPU##(T2) ;SPT ENTRIES FOR EXTENDED HIGH SECTION
ADDI T3,EPTDIF##/PAGSIZ ;NEXT MAP
AOJL T2,SETSP1 ;LOOP FOR ALL CPUS
MOVEM T1,JBTUPM##+0 ;AND JBTUPM FOR THE NULL JOB
IFN FTXMON,<
MOVSI T1,-<MXSECN-<(MS.FMD)>> ;-VE NUMBER OF SPTCOM SLOTS
MOVE T3,.CPEPT## ;ADDR OF OUR MAPPING PAGE
SETSP2: SKIPN T2,SECTAB+<(MS.FMD)>(T3) ;GET COMMON DATA SECTION MAP PAGE
MOVSI T2,1 ;MAKE ILLEGAL POINTER IF NOT ASSIGNED
MOVEM T2,SPTCOM##(T1) ;STORE FOR SPYING USERS
AOS T3 ;ADVANCE SECTION POINTER INDEX
AOBJN T1,SETSP2 ;LOOP OVER ALL SUCH SLOTS
MOVSI T1,-<(MS.FMD)>-1 ;AOBJN POINTER TO HARDWIRED SECTION MAPS
SETSP3: HRRZ T2,T1 ;GET SECTION NUMBER
ADD T2,.CPEPT## ;PLUS THE EPT ADDRESS
MOVE T2,SECTAB(T2) ;FETCH SECTION MAP POINTER
MOVEM T2,.CPMMA##(T1) ;MAKE ADDRESSABLE IN SECTION 37
AOBJN T1,SETSP3 ;LOOP FOR ALL HARDWIRED SECTIONS
>; END IFN FTXMON
SUBTTL INITIALIZE CORE ALLOCATION AND PRINT SYSTEM NAME
MOVE T1,[NZSFCH##,,NZSFCE##] ;SET UP END TABLE FOR ALLOCATION
BLT T1,NZSFCE##+NZSFCL##-1 ;COPY THE HEAD TABLE OVER
PUSHJ P,PATSIZ ;SET UP SYSSIZ, CHECK FOR B.P.'S AND NO EDDT
MOVE T1,ANFNUM## ;GET CENTRAL SITE STATION NUMBER
MOVEM T1,JBTLOC## ;AND SAVE IN JOB LOCATION TABLE
PUSHJ P,AUTINI## ;INITIALIZE AUTCON
CONO PI,PI.CPI ;CLEAR PI SYSTEM
IFN FTKS10,<PUSHJ P,UBAPIS##> ;ASSIGN PIS TO UNIBUS ADAPTERS
PUSHJ P,ONCINT ;START INTERVAL TIMER GIVING CLOCK TICKS
; FOR ONCE, SET UP ONCKLT SO APRINT AND
; OPRFIL CAN USE IT TO START UP TIMER AGAIN.
PUSHJ P,OTSET ;INITIALIZE OUTPUT BUFFER
PUSHJ P,CRLF## ;TYPE CR-LF
MOVEI T1,CONFIG## ;POINT AT SYSTEM NAME
PUSHJ P,CONMES## ;TYPE IT
PUSHJ P,PRSPC## ;SPACE OVER
MOVEI T1,SYSDAT## ;POINT AT SYSTEM CREATION DATE
PUSHJ P,CONMES## ;TYPE IT
PUSHJ P,CRLFOP ;ADD CRLF AND PUSH IT OUT
SUBTTL CHECK FOR FULL AMOUNT OF MEMORY ONLINE
CHKMEM: MOVSI T1,-NXMTBL## ;AOBJN POINTER
MOVEI R,NXMTAB## ;TABLE ADDRESS
PUSHJ P,SATCN## ;COUNT UP THE ZERO BITS
LSH T2,P2WLSH ;CONVERT TO WORDS
SKIPL DEBUGF## ;DEBUGGING?
CAML T2,NWCORE## ;OR AT LEAST AS MUCH AS SPECIFIED BY MONGEN?
JRST SYSLIM ;YES--SKIP MEMORY CHECK
TDZA P2,P2 ;FLAG FIRST TIME WE ASKED
CHKME1: TLO P2,400000 ;FOR CALLS TO A SUBROUTINE IN SYSINI
SETZB U,P4 ;INITIALIZE HIGHEST LOC TO ZERO
MOVEI P1,CORBLK## ;MAXIMUM PAGES OF PHYSICAL MEMORY POSSIBLE
CHKME2: CONO APR,AP.NXE## ;CLEAR NXM FLAG
CHKME3: ADDI U,PAGSIZ ;TRY NEXT PAGE
SETZ T2, ;CLEAR FLAGS
PUSHJ P,REFMEM## ;REFERENCE C(U)
CONSZ APR,AP.NXM## ;NON-EXISTANT?
SKIPA ;NXM
SOJG P1,CHKME3 ;KEEP LOOKING AS LONG AS NOT TOP OF MEMORY
SKIPN P4 ;FIRST TIME THROUGH?
MOVE P4,U ;YES, REMEMBER LOCATION OF LOWEST NON-EX MEM
SOJL P1,CHKME5 ;ACCOUNT FOR MISSED SOJ AND SEE IF FINISHED
MOVE P3,U ;NOW SEE IF ANY MEMORY EXISTS HIGHER UP
CHKME4: CONO APR,AP.NXE## ;CLEAR NXM FLAG
ADDI P3,PAGSIZ ;TRY NEXT PAGE
PUSH P,U ;SAVE U
MOVE U,P3 ;SET ARG FOR REFMEM
PUSHJ P,REFMEM## ;REFERENCE IT
POP P,U ;RESTORE U
CONSZ APR,AP.NXM## ;IS IT THERE?
SOJG P1,CHKME4 ;NO, LOOP THROUGH ALL GEN'D MEMORY
SOJLE P1,CHKME5 ;JUMP IF NO MORE EXISTANT MEMORY
PUSHJ P,MEMBAD ;TELL THE OPERATOR HE HAS HOLES IN MEMORY
JRST CHKME1 ;HE SAID HE FIXED IT. GO SEE IF HE DID.
JFCL ;OFF-LINE
MOVE U,P3 ;HE SAID ITS BROKEN
JRST CHKME2 ;GO SEE IF THERE ARE ANY MORE HOLES
CHKME5: SKIPL DEBUGF## ;DEBUGGING? (ALREADY REPORTED HOLES)
CAML U,NWCORE## ;AS MUCH MEMORY AS SPECIFIED BY MONGEN?
JRST CHKME6 ;THERE IS SO NO REASON TO COMPLAIN
MOVE P3,NWCORE## ;REMIND HIM OF HOW MUCH MONGEN'ED MEMORY
PUSHJ P,MEMBAD ;TELL THE OPERATOR THERE'S NOT THAT MUCH THERE
JRST CHKME1 ;OPR SAID FIXED, SEE IF HE REALLY DID
MOVEM U,NWCORE## ;OPR SAID DOWN, NO EXTRA CORE FOR PAGTAB, ETC.
;BRING SYSTEM UP WITHOUT ALL OF MEMORY ONLINE
CHKME6: SKIPE P2 ;IF WE COMPLAINED,
PUSHJ P,SUNXMT ; MUST SET NXMTAB UP AGAIN
SUBTTL INITIALIZE NXMPTR AND CORE ALLOCATION VARIABLES
;SET UP BYTE POINTER TO NXMTAB AND CORE ALLOCATION VARIABLES
SYSLIM: MOVEI T1,CORBLK## ;MAXIMUM # OF PAGES OF MEMORY POSSIBLE
MOVEI F,PAGSIZ ;CORE SIZE INCREMENT
SETZB U,P1 ;CLEAR AMOUNT OF CONTIGUOUS MEMORY DETECTED
; AND MAXIMUM SIZE OF SINGLE USER
MOVE P3,[POINT 1,NXMTAB##] ;GET BYTE POINTER TO NXMTAB
SYSLM1: ILDB T4,P3 ;GET BYTE FROM NXMTAB
CAML U,SYSSIZ## ;STILL IN MONITOR (FIRST LOC NOT USED BY MON)?
SKIPE T4 ;NO, IS THIS PAGE NON-EXISTANT?
JRST SYSLM2 ;NOT PAST END OF MONITOR OR NON-EXISTANT PAGE
MOVEM U,MEMSIZ## ;SET SIZE OF PHYSICAL MEMORY EVEN HIGHER
HRRZ T3,CORLIM## ;MAXIMUM CORE AVAILABLE TO A SINGLE USER.
; DEFINED BY MONGEN, MODIFIED BY ONCE
CAMGE P1,T3 ;REACHED MAX YET FOR SINGLE USER?
ADDM F,CORMAX## ;NO, INCREASE MAX SIZE CORE AVAIL. TO A USER
ADDM F,MAXMAX## ;INCREMENT HIGHEST LEGAL CORMAX
ADDM F,RMCMAX## ;REAL MAXIMUM LEGAL CORMAX
AOS P1,CORTAL## ;INCREMENT NO. OF FREE 1K BLOCKS
SYSLM2: ADD U,F ;INCREMENT MEMORY REF
SOJG T1,SYSLM1 ;CHECKED EVERY POSSIBLE PAGE YET?
ADDM F,MEMSIZ## ;SET SIZE OF PHYSICAL MEMORY SO EQUAL
; TO THE FIRST NON-EX MEM ADR
MOVE T1,MEMSIZ## ;SIZE OF MEMORY =
LSH T1,W2PLSH ;PAGE NUMBER OF HIGHEST EXISTANT PAGE
TRZE T1,PG.BDY ;ROUND UP TO 256K BOUNDARY
ADDI T1,PP256K##
IDIVI T1,^D36
MOVNI T1,1(T1) ;NUMBER OF WORDS IN NXMTAB
HRLI T1,NXMTAB## ;FORM AN AOBJN POINTER
MOVSM T1,NXMPTR## ;STORE IT FOR DAEMON AND MONBTS
SUBTTL ALLOCATE MEMORY MANAGEMENT TABLES
MMTALC: MOVE T1,MEMSIZ## ;HIGHEST ADDRESS + 1
CAMGE T1,NWCORE## ;GREATER THAN HIGHEST ADDRESS SYSTEM WAS MONGENED FOR?
MOVE T1,NWCORE## ;NO, USE THAT TO SETUP PAGTAB AND MEMTAB
MOVEM T1,NWCORE## ;SAVE LARGER AS MAX CORE WHICH CAN BE SET ON LINE
MOVS T1,NWCORE## ;GET AMOUNT OF MEMORY SYSTEM WILL SUPPORT
TLZE T1,-1 ;CHECK IF EXACTLY A MULTIPLE OF 256K
ADDI T1,1 ;NO, 1 MORE PAGE REQUIRED FOR PAGTAB
LSH T1,P2WLSH ;NUMBER OF WORDS FOR EACH OF PAGTAB AND MEMTAB
MOVEM T1,MMTSIZ ;SAVE SIZE OF MEMORY MANAGEMENT TABLES
IFE FTXMON,<
PUSH P,MONVFF## ;SAVE HIGHEST VIRTUAL ADDRESS USED
MOVEI T2,PAGTAB ;VIRTUAL ADDRESS TO ALLOCATE AT
MOVEM T2,MONVFF## ;MAP PAGES TO PAGTAB
MOVSI T2,(<PM.DCD>B2+PM.WRT+PM.PUB+PM.SWB) ;PAGE MAP BITS
SKIPN [M.CPU##-1] ;ONLY ONE CPU?
TLO T2,(PM.CSH) ;YES, MAKE IT CACHED
PUSHJ P,ONCMAR ;ALLOCATE AND MAP IN PAGTAB
MOVE T1,MMTSIZ ;NUMBER OF WORDS REQUIRED
MOVEI T2,PT2TAB ;VIRTUAL ADDRESS TO ALLOCATE AT
MOVEM T2,MONVFF## ;MAP PAGES TO PT2TAB
MOVSI T2,(<PM.DCD>B2+PM.WRT+PM.PUB+PM.SWB) ;PAGE MAP BITS
SKIPN [M.CPU##-1] ;ONLY ONE CPU?
TLO T2,(PM.CSH) ;YES, MAKE IT CACHED
PUSHJ P,ONCMAR ;ALLOCATE AND MAP IN PAGTAB
MOVE T1,MMTSIZ ;NUMBER OF WORDS REQUIRED
MOVEI T2,MEMTAB ;VIRTUAL ADDRESS TO ALLOCATE AT
MOVEM T2,MONVFF## ;MAP PAGES TO MEMTAB
MOVSI T2,(<PM.DCD>B2+PM.WRT+PM.PUB+PM.SWB) ;PAGE MAP BITS
SKIPN [M.CPU##-1] ;ONLY ONE CPU?
TLO T2,(PM.CSH) ;YES, MAKE IT CACHED
PUSHJ P,ONCMAR ;ALLOCATE AND MAP IN MEMTAB
POP P,MONVFF## ;PUT THINGS BACK
>
IFN FTXMON,<
XJRST [MCSEC1+.+1] ;ENTER SECTION ONE
MOVE T1,[EXP MS.MEM+PAGTAB] ;EXTENDED VIRTUAL ADDRESS OF PAGTAB
MOVE T2,T1 ;COPY IT
ADD T2,MMTSIZ ;CALCULATE FIRST FREE FOLLOWING PAGTAB
PUSHJ P,NZSCGT ;ALLOCATE SPACE FOR PAGTAB
MOVE T1,[EXP MS.MEM+PT2TAB] ;EXTENDED VIRTUAL ADDRESS OF PT2TAB
MOVE T2,T1 ;COPY IT
ADD T2,MMTSIZ ;CALCULATE FIRST FREE FOLLOWING PT2TAB
PUSHJ P,NZSCGT ;ALLOCATE SPACE FOR PT2TAB
MOVE T1,[EXP MS.MEM+MEMTAB] ;EXTENDED VIRTUAL ADDRESS OF MEMTAB
MOVE T2,MMTSIZ ;NUMBER OF WORDS REQUIRED
ADD T2,T1 ;CALCULATE FIRST FREE FOLLOWING MEMTAB
PUSHJ P,NZSCGT ;ALLOCATE SPACE FOR MEMTAB
MOVSI T1,-MEMPGS ;NUMBER OF PAGES USED BY TABLES
MOVSI T2,1 ;JUNK MAP SLOT ENTRY
MMTAL1: HRRZ T3,T1 ;GET PAGE NUMBER
ADD T3,[<MS.MAP+MMAPS+<<(MS.MEM)>*PAGSIZ>>+<MEMBEG/PAGSIZ>]
SKIPN (T3) ;PAGE IN USE?
MOVEM T2,(T3) ;RESERVE IT SO TABLES CAN BE EXPANDED
AOBJN T1,MMTAL1 ;LOOP FOR ALL PAGES
>; END IFN FTXMON
MOVE T1,MMTSIZ ;SIZE OF TABLES IN WORDS
IFE FTXMON,<
SETZM PAGTAB ;ZERO THE FIRST WORD OF PAGTAB
MOVE T2,[PAGTAB,,PAGTAB+1]
BLT T2,PAGTAB-1(T1) ;ZERO ALL OF PAGTAB
SETZM PT2TAB ;ZERO THE FIRST WORD OF PT2TAB
MOVE T2,[PT2TAB,,PT2TAB+1]
BLT T2,PT2TAB-1(T1) ;ZERO ALL OF PT2TAB
SETOM MEMTAB ;SET MEMTAB TO -1 SO THAT USE WITHOUT SETUP
MOVE T2,[MEMTAB,,MEMTAB+1] ;WILL LIKELY CAUSE A STOPCD
BLT T2,MEMTAB-1(T1) ;ZAP, ITS ALL - 1
>; END IFE FTXMON
IFN FTXMON,<
DMOVE T2,[EXP MS.MEM+PAGTAB,MS.MEM+PAGTAB+1] ;SET UP XBLT SOURCE/DEST
SUBI T1,1 ;DECREMENT SIZE OF TABLES (WORDS TO ZERO)
PUSH P,T1 ;SAVE IT
SETZM (T2) ;ZERO THE FIRST WORD OF PAGTAB
EXTEND T1,[XBLT] ;ZERO ALL OF PAGTAB
DMOVE T2,[EXP MS.MEM+PT2TAB,MS.MEM+PT2TAB+1] ;SET UP XBLT SOURCE/DEST
MOVE T1,(P) ;NUMBER OF WORDS TO ZERO
SETZM (T2) ;ZERO THE FIRST WORD OF PT2TAB
EXTEND T1,[XBLT] ;ZERO ALL OF PT2TAB
POP P,T1 ;NUMBER OF WORDS TO ZERO
DMOVE T2,[EXP MS.MEM+MEMTAB,MS.MEM+MEMTAB+1] ;SET UP XBLT SOURCE/DEST
SETOM (T2) ;SET MEMTAB TO -1 SO THAT USE WITHOUT SETUP
EXTEND T1,[XBLT] ; WILL LIKELY CAUSE A STOPCD
>; END IFN FTXMON
SUBTTL MARK AND LINK MEMORY MANAGEMENT TABLES
;STILL IN SECTION 1 IFN FTXMON
MMTINI: LDB T2,[POINT 14,LOWLIM##,26] ;GET NUMBER OF LOW SEGMENT PAGES
ADDI T2,1 ;SINCE LOWLIM IS THE HIGHEST ADDRESS
MOVSI T1,MONTRB ;BIT WHICH SAYS THIS PAGE CONTAINS THE MONITOR
MOVEI T3,1 ;STARTING AT PAGE 1,
SSX T3,MS.MEM ;PAGTAB SECTION
SETZB T4,PT2TAB-1(T3) ;FIRST PAGE IN PT2TAB
MMTIN1: HRRZM T3,PAGTAB-1(T3) ;TURN IT ON
HLLM T1,PAGTAB-1(T3) ;+ MONTRB
HRRZM T4,PT2TAB(T3) ;SET UP BACKWARD LINK IN PT2TAB
AOS T4 ;NEXT PAGE
CAIE T2,1(T3) ;FOR ALL PAGES UP TO SYSSIZ
AOJA T3,MMTIN1 ; ..
HRRZM T3,LMPAG## ;SET LAST MONITOR PAGE SEEN
MOVEI T1,MONORG## ;WHERE TO START LOOKING
MOVE T4,MONVFF## ;FIRST FREE MONITOR VIRTUAL ADDRESS
SUBI T4,MONORG## ;MINUS MONITOR ORGIN
LSH T4,W2PLSH ;EQUALS NUMBER OF MONITOR HI SEG PAGES
PUSHJ P,SETMRB ;MARK PAGES OF MONITOR CODE AND DATA
IFN FTXMON,<
MOVEI T1,CSBORG## ;WHERE COMMON SUBROUTINES BEGIN
MOVE T4,CSBLEN## ;GET THE LENGTH
LSH T4,W2PLSH ;CONVERT TO PAGES
PUSHJ P,SETMRB ;MARK OFF THOSE PAGES
>; END IFN FTXMON
IFE FTXMON,<
MOVEI T1,PAGTAB ;MARK PAGTAB ITSELF AS TAKEN
MOVE T4,MMTSIZ ;NUMBER OF PAGES IN PAGTAB
LSH T4,W2PLSH
PUSHJ P,SETMRB ;MARK THE ENTRIES IN PAGTAB FOR PAGTAB
MOVEI T1,PT2TAB ;MARK PT2TAB
MOVE T4,MMTSIZ
LSH T4,W2PLSH
PUSHJ P,SETMRB ;MARK
MOVEI T1,MEMTAB ;AND MEMTAB TOO
MOVE T4,MMTSIZ ;SAME SIZE AS PAGTAB
LSH T4,W2PLSH
PUSHJ P,SETMRB
>; END IFE FTXMON
IFN FTXMON,<
MOVEI T4,HLGSNO-3 ;NUMBER OF SECTIONS TO CONSIDER
MOVEI T1,SECTAB+3 ;SECTION 0, 1, AND 37 ARE SPECIAL
ADD T1,.CPEPT## ;STARTING ADDRESS IN THE SECTION TABLE
PUSHJ P,SETMRP ;MARK PAGES AS IN USE BY THE MONITOR
MOVEI J,(MS.FMD) ;AS WAS STATED, SECTIONS 0 AND 1 ARE SPECIAL
MMTIN2: MOVE T1,.CPEPT## ;ADDRESS OF OUR PROCESS TABLE
ADDI T1,SECTAB(J) ;ADDRESS OF THE ENTRY IN THE SECTION TABLE
SKIPN T2,(T1) ;HAS THIS SECTION BEEN ALLOCATED?
JRST MMTIN3 ;NO, SAVE TIME
MOVE T1,.CPMAP## ;ADDRESS OF OUR MAP
MOVEM T2,.EUPMP/PAGSIZ(T1) ;SECTION MAP
CLRPT .EUPMP ;MAKE SECTION MAP ADDRESSABLE
MOVEI T1,.EUPMP ;VIRTUAL ADDRESS OF THE SECTION MAP
MOVEI T4,^D512 ;NUMBER OF PAGES IN A SECTION
CAIN J,(MS.HGH) ;EXTENDED HIGH SEGMENT?
MOVEI T4,HLCSAD##/PAGSIZ ;YES, DON'T LOOK AT EXEC VIRTUAL MAPPINGS
PUSHJ P,SETMRP ;MARK ALLOCATED PAGES IN THIS SECTION
MMTIN3: CAIGE J,HLGSNO-1 ;LOOKED AT ALL SECTIONS?
AOJA J,MMTIN2 ;NO, LOOP OVER ALL
>; END IFN FTXMON
PUSHJ P,BTAVAL## ;GET ADDRESS OF BOOTSTRAP VECTOR
JRST MMTIN6 ;BOOTSTRAP NOT AVAILABLE
MOVE T1,BOOTPA ;GET PHYSICAL ADDRESS OF BOOTSTRAP
LSH T1,W2PLSH ;GET STARTING PAGE NUMBER
HLRE T2,.BTSIZ(T2) ;GET -VE NUMBER OF PAGES IN BOOTSTRAP
MOVMS T2 ;GET NUMBER OF PAGES
PUSHJ P,SETCTB ;SET THE "PHYSICALLY CONTIGUOUS" BIT IN PAGTAB
MMTIN6: MOVE U,[POINT 1,NXMTAB##]
MOVE T1,MMTSIZ ;NUMBER OF WORDS IN PAGTAB
SETZB T2,T3 ;INITIALIZE
PUSH P,T3 ;SAVE BITS
MMTIN7: ILDB T4,U ;NEXT PAGE IN NXMTAB
JUMPE T4,MMTIN9 ;JUMP IF PAGE EXISTS
SKIPE @[IW MS.MEM,PAGTAB(T3)] ;IS THE PAGE FREE?
STOPCD .,STOP,MNM, ;++MONITOR IN NON-EXISTANT MEMORY
TLO T3,NXMBIT ;INDICATE NON-EXISTANT PAGE
TLZ T3,MONTRB
JUMPE T2,MMTIN8 ;JUMP IF NO PREDECESSOR
SSX T2,MS.MEM ;SET SECTION NUMBER IN INDEX
HLLM T3,(P) ;SAVE LATEST BITS
MOVEM T3,PAGTAB(T2) ;STORE THAT IN PAGTAB
MMTIN8: HRRZS T2,T3 ;PREDESSOR TO THIS PAGE
MMTIN9: CAIE T1,1(T3) ;LOOKED AT EVERY PAGE IN PAGTAB?
AOJA T3,MMTIN7 ;NO, LOOP OVER ALL PAGES
POP P,T3 ;RESTORE BITS
SSX T2,MS.MEM ;SECTION NUMBER
TRNE T2,-1 ;ANY NON-EXISTANT PAGES AT ALL
HLLZM T3,PAGTAB(T2) ;YES, INDICATE THE LAST ONE
LDB T1,[POINT 14,MEMSIZ##,26]
MOVEI T1,PAGTAB-1(T1) ;HIGHEST PAGE IN THE MONITOR - 1
SSX T1,MS.MEM ;PAGTAB SECTION
MOVEM T1,CORLST## ;HIGHEST PAGE IN PAGTAB
MOVEI T1,1000 ;START FREE LIST AT 256K
SSX T1,MS.MEM ;SET PAGTAB SECTION
SETZ T2, ;NO PREDECESSOR
SSX T2,MS.MEM ;SET PAGTAB SECTION
SETZ T3, ;NO FREE PAGES SEEN YET
MOVE T4,MMTSIZ ;SET UP A LOOP COUNTER
SUBI T4,1000 ;WE SKIPPED THE FIRST 1000 PAGES
SETO P1, ;MARK FIRST PASS THROUGH PAGTAB
MMIN10: SKIPE PAGTAB(T1) ;IS THIS PAGE FREE?
JRST MMIN13 ;NO
TRNE T2,-1 ;FIRST FREE PAGE?
JRST MMIN11 ;NO
HRRZM T1,PAGPTR## ;YES, STORE ORGIN OF THE FREE CORE LIST
SETZM PT2TAB(T1) ;INIT TAIL OF LIST
JRST MMIN12 ;CONTINUE
MMIN11: PUSH P,T1 ;SAVE PAGTAB POINTER
HRLI T1,FREPAG ;INDICATE A FREE PAGE
MOVEM T1,PAGTAB(T2) ;STORE THAT IN PAGTAB
SSX T1,MS.MEM
HRRZM T2,PT2TAB(T1) ;SET BACKWARDS LINK
POP P,T1 ;RESTORE PAGTAB POINTER
MMIN12: MOVE T2,T1 ;SAVE PREDECESSOR
ADDI T3,1 ;NEXT PAGE
MMIN13: SOSLE T4 ;LOOKED AT ALL PAGES IN PAGTAB?
AOJA T1,MMIN10 ;NO
AOJN P1,MMIN14 ;JUMP IF WE'VE MADE TWO PASSES THROUGH PAGTAB
SETZ T1, ;START OVER AT THE BEGINNING
SSX T1,MS.MEM ;SET PAGTAB SECTION
MOVEI T4,1000 ;JUST LOOK AT FIRST 1000 PAGES
JRST MMIN10 ;NOW DO IT AGAIN
MMIN14: MOVSI T1,FREPAG ;LAST FREE PAGE
HLLZM T1,PAGTAB(T2) ;TERMINATE LINKED LIST OF FREE PAGES
MOVEM T3,BIGHOL## ;STORE THE NUMBER OF EXISTANT PHYSICAL PAGES
MOVEM T3,CORTAL## ; OF USER CORE SEEN
MOVEM T3,USRCOR## ;TOTAL AMOUNT OF USER CORE
LSH T3,P2WLSH ;CONVERT TO NUMBER OF WORDS
MOVEM T3,MAXMAX## ;MAX CORMAX CAN BE SET TO
MOVE T2,T3
SUBI T2,NWMCP+PAGSIZ
MOVEM T2,RMCMAX## ;REAL MAXIMUM CORMAX
HRRZ T1,CORLIM## ;MAXIMUM NUMBER OF PAGES ALLOWED A SINGLE
; USER (MONGEN SPECIFIED)
LSH T1,P2WLSH ;CONVERT TO NUMBER OF WORDS
CAMGE T1,T3 ;.GE. THE NUMBER OF PAGES AVAILABLE TO USERS?
MOVE T3,T1 ;NO, MAXIMUM AVAILABLE TO USERS
CAMLE T3,T2
MOVE T3,T2
MOVEM T3,CORMAX## ;NO ONE CAN GET LARGER THAN THIS (HOPEFULLY)
IFN FTXMON,<
;NOW ZERO OUT THE SECTION ENTRIES FOR WHICH NZS CORE CANNOT BE ALLOCATED
SETZM NZSFCH##+<(MCSEC1)>
SETZM NZSFCH##+<(MS.HGH)>
SETZM NZSFCH##+<(MS.SNP)>
SETZM NZSFCH##+<(MS.MAP)>
XJRST [MCSEC0+.+1] ;BACK INTO SECTION 0
> ;END IFN FTXMON
PUSHJ P,RSTDEF ;RESET DEFAULT TIMEOUT VALUE, ETC. FOR INITIAL
;PROMPTS WHICH WE WANT TO TIMEOUT IF THE
;OPERATOR FELL ASLEEP.
SUBTTL CHECK AND ASK ABOUT OFF-LINE CPUS
;ROUTINE TO CHECK IF A CPU IS OFF-LINE, AND ASK THE OPERATOR IF
;IT SHOULD BE RUNNING OR NOT, THEN GIVE THEM A CHANCE TO START IT.
ASKCPU:
IFN FTMP,<
MOVEI P1,.C0CDB## ;START WITH CPU0
SETZ P2, ;INIT COUNT OF NON-RUNNING CPUS
ASKCP1: MOVE T1,.CPCPN##-.CPCDB##(P1) ;GET CPU NUMBER
CAMN T1,.CPCPN## ;IS IT ME?
JRST ASKCP2 ;YES
XCTCPU (CPN,CPOPJ1##) ;TRY TO WAKE HIM OUT OF HIS AC LOOP
AOSA P2 ;FAILED, COUNT ONE NOT RUNNING
JRST ASKCP2 ;SUCCEEDED
PUSHJ P,PRSSET ;SET UP SPECIAL BUFFER, .CPTOA, ETC.
PUSH P,T1 ;SAVE OLD CHARACTER TYPER
MOVEI T1,[ASCIZ /% /] ;STARTING TEXT
PUSHJ P,CONMES ;PRINT IT
MOVE T2,.CPLOG##-.CPCDB##(P1) ;GET CPU NAME
PUSHJ P,PRNAME## ;PUT IN MESSAGE
MOVEI T1,[ASCIZ/ #/]
PUSHJ P,CONMES## ;TYPE TEXT
MOVE T1,.CPASN##-.CPCDB##(P1) ;GET SERIAL NUMBER
PUSHJ P,PRTDIG## ;TYPE IT
MOVEI T1,[ASCIZ / is not running. Set CPU status/]
PUSHJ P,CONMES## ;PRINT TEXT
POP P,.CPTOA## ;RESTORE CHARACTER STICKER
MOVEI T1,[ASCIZ //] ;NULL TEXT
CAIN P2,1 ;FIRST TIME THROUGH?
PUSHJ P,CONOUT ;YES--START WITH A CRLF
MOVEI T1,TXTBUF ;POINT TO PROMPT STRING
MOVE T2,['DOWN '] ;DEFAULT
MOVE T3,[-2,,ASKCPT] ;TABLE OF RESPONSES
PUSHJ P,PRSKEY ;PROMPT AND FETCH ANSWER
JFCL ;SHOULDN'T HAPPEN
JUMPN T1,ASKCP1 ;CHECK AGAIN IF "UP" WAS REQUESTED
MOVSI T1,(CR.RMV!CR.DET!CR.NRN) ;GET THE BITS
IORM T1,.CPRUN##-.CPCDB##(P1) ;SET IN THE RUNNABILITY WORD
SOS NCPRUN## ;COUNT DOWN RUNNABLE CPUS
ASKCP2: HLRZ P1,.CPCDB##-.CPCDB##(P1) ;GET NEXT CDB
JUMPN P1,ASKCP1 ;LOOP IF ANOTHER CPU TO CHECK
JRST CLRCCB ;ONWARD
ASKCPT: SIXBIT /DOWN/
SIXBIT /UP/
>; END IFN FTMP
SUBTTL CLEAR CACHE BITS FOR LOW SEGMENT PAGES
CLRCCB:
IFN FTXMON,<XJRST [MCSEC1+.+1]> ;GET INTO SECTION 1 FOR PAGTAB REFS
IFN FTMP,<
SKIPG [M.CPU##-1] ;MORE THAN ONE CPU?
JRST CLRCC3 ;NO, TURN OFF CACHE FOR A FEW PAGES
SETZ T1, ;ON 1088 SYSTEMS, MUST TURN OFF
MOVEI T2,CSBORG##-1 ; CACHE FOR ENTIRE LOWSEG
PUSHJ P,CCTRNG ;CLEAR
MOVEI T1,CSHFIR## ;START UP INTERRUPT LEVEL PDL'S AND STUFF
MOVEI T2,CSHLAS## ;CAN CACHE ALL OF THAT
PUSHJ P,CSBRNG ;SINCE NOT REALLY SHARED BETWEEN CPUS
IFE FTXMON,<
MOVE T2,MMTSIZ ;SIZE OF MEMORY MANAGEMENT TABLES
MOVEI T1,PAGTAB ;START OF PAGTAB
ADDI T2,-1(T1) ;END OF PAGTAB
PUSHJ P,CCTRNG ;CLEAR CACHE BITS FOR PAGTAB
MOVE T2,MMTSIZ ;NUMBER OF WORDS AGAIN
MOVEI T1,MEMTAB ;START OF MEMTAB
ADDI T2,-1(T1) ;END OF MEMTAB
PUSHJ P,CCTRNG ;CLEAR CACHE BITS FOR MEMTAB
>; END IFE FTXMON
IFN FTXMON,<
MOVE J,.CPEPT## ;GET EPT ADDRESS
ADDI J,<(MS.FMD)>+1 ;START AT FIRST REAL DATA SECTION
CLRCC1: SKIPE T1,SECTAB(J) ;GET SECTION MAP POINTER
TLNN T1,(PM.CSH) ;ALLOW FOR UNCACHED SECTION
JRST CLRCC2 ;SKIP THIS SECTION
MOVE T2,.CPMAP## ;GET ADDRESS OF S0 MAP
MOVEM T1,.EUPMP/PAGSIZ(T2) ;MAKE SECTION MAP VISIBLE VIA .EUPMP
CLRPT .EUPMP ;MAKE NEW MAPPING VISIBLE
PUSHJ P,CCTRNS ;MARK PAGES
CLRCC2: MOVE T1,.CPEPT## ;GET EPT ADDRESS
CAIGE J,MXSECN-1(T1) ;DONE ALL POSSIBLE SECTIONS?
AOJA J,CLRCC1 ;NO, LOOP FOR MORE
>; END IFN FTXMON
MOVEI T1,OUCHTB## ;OUCHTB MUST BE UNCACHED
MOVEI T2,OUCHTB##+7
PUSHJ P,CCTRNG
CLRCC3:
>; END IFN FTMP
MOVSI T1,(ST%LSC) ;LOW SEG IS CACHED BIT
ANDCAM T1,CNFST2## ;INITIALLY CLEAR LOW SEG IS CACHED BIT
MOVE T2,NCPRUN## ;NUMBER OF RUNNABLE CPUS
CAIN T2,1 ;ONLY 1 CPU?
IORM T1,CNFST2## ;YES, WE CACHED LOW SEGMENT
IFN FTKL10,<
SETZ P1, ;CLEAR LTINIT INDEX
CLRCC4: SKIPN T1,LTINIT##(P1) ;LTINIT ENDS WITH A ZERO
JRST CLRCC5 ;DONE
HLRZ T2,T1 ;GET NUMBER OF 4 WORD BLOCKS
LSH T2,2 ;MAKE IT NUMBER OF WORDS
ADDI T2,-1(T1) ;GET END ADDRESS OF THIS CHUNK
HRRZS T1 ;CLEAR LEFT HALF FOR CCBRNG
PUSHJ P,CCBRNG ;CLEAR CACHE BITS IN EXEC MAP
AOJA P1,CLRCC4 ;AND GET NEXT ENTRY IN LTINIT
CLRCC5: MOVEI T1,DLXFST## ;CLEAR OUT CACHE BITS FOR DC75
MOVEI T2,DLXLST##
CAIN T1,(T2) ;ANY DL10 WINDOWS DEFINED
JRST CLRCC6 ;NO, DON'T BOTHER
PUSHJ P,CCBRNG
MOVEI T1,.C0UPT## ;DC76 LOOKS AT UPTIME FOR CPU0
MOVE T2,T1 ;UNCACHE JUST THIS
PUSHJ P,CCBRNG ;CLEAR OUT CACHE FOR UPTIME
MOVEI T1,.CPUPT## ;UNCACHE THE OTHER VIRTUAL MAPPING TOO
MOVE T2,T1 ;ONLY THE ONE WORD
SKIPN .CPCPN## ;UNLESS WE'RE NOT CPU #0.
PUSHJ P,CCBRNG ; (ONLY PLACE A DC76 CAN BE).
CLRCC6:
>; END IFN FTKL10
IFN FTKS10,< ;ONLY KS-10'S HAVE KMC/DUP-11S
MOVEI T1,KDLFST## ;GET THE ADDRESS OF THE FIRST KDL PAGE
MOVEI T2,KDLLST## ;GET ADDR OF LAST WORD OF THE LAST
CAIE T1,(T2) ;IF ANY KDL PAGES ARE DEFINED, THEN
PUSHJ P,CCBRNG ; MAKE SURE THAT THEY ARE UNCACHED.
>; END IFN FTKS10
REPEAT 0,<
SKIPL DEBUGF## ;IF DEBUGGING WITH EDDT
JRST CLRCC7 ;NO-DONT BOTHER
MOVEI T1,DDT## ;CLEAR THE CACHE BITS FOR EDDT
MOVEI T2,DDTEND## ;TO DDTEND, SYMBOL TABLE IS NEVER WRITTEN
PUSHJ P,CCBRNG
;THE ABOVE CODE, IF ALLOWED TO ASSEMBLE (PUT ";" IN FRONT OF THE REPEAT
;AND THE CLOSING ANGLE BRACKET ABOVE) WILL KEEP DDT OUT OF THE CACHE. THIS IS HANDY IF YOU
;ARE DEBUGGING MONITOR PORTIONS WHICH HANDLE CACHE!!!
CLRCC7: MOVEI T1,APRPAR## ;KEEP THE APR PARITY RECOVERY CODE
MOVEI T2,APPCP2## ;OUT OF THE CACHE UNTIL
;THE CACHE HAS BEEN SWEPT BACK TO CORE
;THIS WILL CLOSE DOWN (BUT NOT SHUT) THE WINDOW
;OF RECURSIVE FAILURES
PUSHJ P,CCBRNG ;AND SHOULD IMPROVE RECOVERY CHANCES
>;END REPEAT 0
MOVE T1,LOWLIM## ;NOW CLEAR CACHE BITS FROM
ADDI T1,1 ; LOWLIM+1 (WHERE SYSSIZ WINDS UP)
MOVEI T2,CSBORG##-1 ; TO END OF LOW SEG FOR LOCK/REAL TIME
CAMG T1,T2
PUSHJ P,CCBRNG
IFN FTXMON,<XJRST [MCSEC0+.+1]> ;RETURN TO SECTION 0
SUBTTL ALLOCATE AND INITIALIZE SCA
SCAINI:
IFN FTSCA,<
SKIPN [SCASIZ##] ;ANY SCA FREE POOL?
JRST NOSCA ;NO, NO SECTION MAP OR BUFFERS NEEDED
IFN FTXMON,<
MOVEI T1,(MS.SCA) ;SECTION NUMBER FOR SCA STUFF
MOVEI T2,SCASIZ## ;SIZE OF THE POOL
PUSHJ P,GFWNZN## ;ALLOCATE THE SPACE
HALT . ;*** FOR NOW
MOVEM T1,SCALOC## ;SAVE ADDRESS OF FREE POOL
>; END IFN FTXMON
PUSHJ P,BHDINI## ;INITIALIZE BUFFER HEADERS AND DESCRIPTORS
MOVE T1,BHDADR## ;ADDRESS OF BUFFER HEADER DESCRIPTOR AREA
LSH T1,W2PLSH ;GET STARTING PAGE NUMBER
MOVE T2,BHDPGS## ;GET NUMBER OF PAGES
PUSHJ P,SETCTB ;SET THE "PHYSICALLY CONTIGUOUS" BIT IN PAGTAB
MOVE T1,BSDADR## ;ADDRESS OF BUFFER SEGMENT DESCRIPTOR AREA
LSH T1,W2PLSH ;GET STARTING PAGE NUMBER
MOVE T2,BSDPGS## ;GET NUMBER OF PAGES
PUSHJ P,SETCTB ;SET THE "PHYSICALLY CONTIGUOUS" BIT IN PAGTAB
PUSHJ P,SC.INI## ;INITIALIZE THE SCA PROTOCOL MODULE
NOSCA:
>; END IFN FTSCA
IFN FTENET,<
ETHSTR:
IFN FTKL10,<PUSHJ P,KNISYS##> ;INIT KLNI BIT MAPPED CORE
PUSHJ P,ETHINI## ;INITIALIZE ETHERNET DRIVER
> ;END IFN FTENET
SUBTTL ASK REASON FOR RELOAD
;ASK OPERATOR REASON FOR RELOAD
;ANSWER WILL BE PUT IN LOG FILE DAEMON
;ALONG WITH ARBITRARY OPERATOR COMMENT, IF ANY.
;ALLOW UNIQUE ABBREVIATION
WHYLOP: SETZM WHYTXT## ;CLEAR OUT AREA FOR OPERATOR COMMENT
MOVE T1,[XWD WHYTXT##,WHYTXT##+1]
BLT T1,WHYTXT##+WHYSIZ##-1
SKIPL DEBUGF## ;DEBUGGING STAND-ALONE?
JRST WHYLP1 ;NO,
MOVSI T1,'SA ' ;STAND ALONE CODE
MOVEM T1,WHYCOD## ;FOR DAEMON
JRST WHYLP7 ;GO FINISH UP
WHYLP1: MOVE T1,CRSWHY ;GET STOPCD CHECKSUM FROM PREVIOUS LOAD
JUMPE T1,WHYLP2 ;JUMP IF NONE
PUSHJ P,CHKDCS ;CHECK DATE/TIME CHECKSUM
JRST WHYLP2 ; IF PINK CRASH
MOVEM T1,WHYCOD## ;AND STORE AS REASON FOR RELOAD
JRST WHYLP7 ;SKIP QUESTION
WHYLP2: MOVE T1,DEFSP ;GET VIRGIN POINTER
MOVEM T1,DEFPTR ;RESET IT
MOVEI T1,[ASCIZ /OTHER ;Operator did not answer/]
PUSHJ P,DEFTXT ;STORE IN DEFAULT BUFFER
MOVE T1,DEFSP ;INITIAL STRING POINTER AGAIN
MOVEM T1,DEFPTR ;RESET FOR TIMEOUT
MOVEI T1,[ASCIZ /Why reload/]
SETZ T2, ;NO DEFAULT
PUSHJ P,PRSSIX ;PROMPT AND FETCH ANSWER
JUMPE T1,[PUSHJ P,WHELP ;GIVE SHORT HELP
JRST WHYLOP] ;AND TRY AGAIN
MOVE T2,T1 ;COPY TO A BETTER AC
MOVE T1,[-1,,['HELP ']] ;SHORT TABLE
PUSHJ P,FNDNAM## ;DID THE OPERATOR ASK FOR HELP?
JRST WHYLP3 ;NO, MAYBE A REAL ANSWER
PUSH P,OPTPTR ;SAVE COMMAND POINTER
PUSH P,OPTHLP ;AND COMMAND HELP TEXT
PUSH P,SWTPTR ;NO SWITCHES
MOVE T1,[-WHYLEN,,WHYTAB] ;WHY RELOAD COMMAND POINTER
MOVEM T1,OPTPTR
MOVEI T1,WHYHLP ;WHY RELOAD HELP TEXT
MOVEM T1,OPTHLP
SETZM SWTPTR ;NO SWITCHES
PUSHJ P,.HELP ;PROCESS AS A HELP COMMAND
JFCL ;FOOL
POP P,SWTPTR ;RESTORE
POP P,OPTHLP ;...
POP P,OPTPTR ;ONE MORE
JRST WHYLOP ;TRY AGAIN
WHYLP3: MOVE T1,[-WHYLEN,,WHYTAB] ;POINT TO TABLE
PUSHJ P,FNDNAM## ;LOOKUP ABBREV.
JRST [PUSHJ P,WHELP ;GIVE SHORT HELP
JRST WHYLOP] ;AND TRY AGAIN
MOVE T1,WHYTAB(T1) ; GET UNABBREVIATED SIXBIT CODE
MOVEM T1,WHYCOD## ;AND STORE IN GETTAB FOR DAEMON
MOVE P1,SAWCMT ;GET THE COMMENT FLAG
JUMPN P1,WHYLP4 ;GO IF MORE THAN JUST THE "WHY RELOAD" REASON
CAME T1,['OTHER '] ;IF END OF LINE AND RESPONSE WAS OTHER,
JRST WHYLP7 ; TELL HIM THAT OTHER REQUIRES A COMMENT
MOVEI T1,[ASCIZ /% OTHER requires a comment/]
PUSHJ P,CONOUT ;WARN OPERATOR
JRST WHYLOP ;GO BACK AND ASK WHY RELOAD AGAIN
;HERE TO GET OPERATOR COMMENT AND STORE IN CRASH ACS
WHYLP4: MOVEI P2,<WHYSIZ##*5>-1 ;NUMBER OF ASCIZ CHARACTERS
MOVE P1,[POINT 7,WHYTXT##] ;BYTE POINTER FOR WHERE TO STORE
WHYLP5: PUSHJ P,COMTYI## ;GET NEXT CHARACTER (EVEN IF ;)
JUMPE T3,WHYLP6 ;END OF STRING? (GETLIN STORES NULL)
CAIL T3,12 ;NO, END OF LINE CHAR?
CAILE T3,15 ;"
SKIPA ;NO
JRST WHYLP6 ;YES, DO NOT STORE, JUST GO STORE NULL
SOJLE P2,WHYLP6 ;QUIT IF NO MORE ROOM LEFT IN BLOCK
IDPB T3,P1 ;STILL ROOM, STORE ASCIZ CHARACTER
JRST WHYLP5 ;GO GET MORE
;HERE WHEN FINISHED COPYING OPERATOR COMMENT TO CRASH ACS
WHYLP6: MOVEI T3,0 ;NULL
IDPB T3,P1 ;STORE ON END SO ASCIZ
WHYLP7: PUSHJ P,CHGDAT ;GET DATE/TIME
JFCL ;ALWAYS SKIPS
JRST STACON ;GO CRANK UP AUTCON
WHELP: PUSH P,OPTPTR ;SAVE COMMAND POINTER
MOVE T1,[-WHYLEN,,WHYTAB] ;AOBJN POINTER TO OPTIONS
MOVEM T1,OPTPTR ;SAVE TEMPORARILY
PUSHJ P,SHELP ;GIVE SHORT HELP
POP P,OPTPTR ;RESTORE COMMAND POINTER
POPJ P, ;RETURN
;LIST OF POSSIBLE WHY RELOAD ANSWERS (CAN BE ABBREVIATED)
; ORDER IS IMPORTANT. OPERATOR SHOULD ANSWER THE EARLIEST ONE
; IN TABLE WHICH APPLIES (WHEN MORE THAN ONE DOES)
DEFINE OPTINS,<
;;PREVIOUS SYSTEM PROBLEM:
X (OPR,<Operator error>)
X (PARITY,<Memory parity errors>)
X (POWER,<Power failure>)
X (STATIC,<Static electricity>)
X (HARDWA,<Hardware failure>)
X (NXM,<Non-existant memory errors>)
X (HALT,<Monitor halted>)
X (LOOP,<Monitor looping>)
X (HUNG,<Monitor hung>)
;;PREVIOUS NON-TIMESHARED USE OF SYSTEM:
X (PM,<Preventive maintenance>)
X (CM,<Corrective maintenance>)
X (SA,<Stand alone>)
;;DIFFERENT MONITORS
X (NEW,<Loading new monitor>)
X (SCHED,<Scheduled monitor change>)
;;OPERATOR DOESN'T KNOW OR WON'T TELL US
X (OTHER,<None of the above>)
> ;END DEFINE OPTINS
DEFINE X (NAME,TEXT),<EXP <SIXBIT /NAME/>>
WHYTAB: OPTINS
WHYLEN==.-WHYTAB ;LENGTH
DEFINE X (NAME,TEXT),<IFIW [ASCIZ /TEXT/]>
WHYHLP: OPTINS
SUBTTL CONFIGURE DEVICES
STACON: PUSHJ P,AUTCPU## ;CALL AUTCON ON THE BOOT CPU
IFN FTMP,<
SKIPN [M.CPU##-1] ;MORE THAN ONE CPU IN SYSTEM?
JRST STACN3 ;NOPE
MOVEI P1,.C0CDB## ;START WITH CPU0
SETZ P2, ;CLEAR MASK OF CPUS
STACN1: MOVE T1,.CPCPN##-.CPCDB##(P1) ;GET CPU NUMBER
CAME T1,.CPCPN## ;IS IT ME?
XCTCPU (CPN,AUTCPU##,XC.ASY) ;NO--FIRE UP AUTCON ON THIS CPU
HLRZ P1,.CPCDB##-.CPCDB##(P1) ;NEXT CDB
JUMPN P1,STACN1 ;LOOP IF ANOTHER CPU TO CHECK
MOVEI T2,-1 ;TIME TO WASTE
SOJG T2,. ;GIVE THE OTHER CPUS A CHANCE TO START
MOVE T2,CPUTIM ;WAIT AS LONG AS XCTCPU WOULD
STACN2: SETZ T3, ;CLEAR A FLAG
HRROI T1,[SKIPL .CPATO##-.CPCDB##(P1) ;CPU STILL CONFIGURING?
SETO T3, ;YES
POPJ P,]
PUSHJ P,CPUAPP## ;MAKE SURE ALL CPU'S ARE THRU AUTCON
SKIPE T3 ; SINCE BOOT'S MAP MIGHT BE CHANGED
SOJGE T2,STACN2 ;TIME OUT IN CASE SOMEONE'S NOT RUNNING
SKIPGE T2 ;DID IT TIME OUT?
STOPCD .,DEBUG,AUTTTL, ;++AUTCON TOOK TOO LONG
STACN3:
>; END IFN FTMP
SUBTTL SET UP AND LINK DDBS
GETOPT: PUSHJ P,SLCLDS ;SET UP LOW CORE LOCATIONS
IFN FTCIDSK,<
MOVE T1,APRTIM ;STORE TIME STAMP
MOVEM T1,BNDBEG## ; FOR BINDING LOGIC
>; END IFN FTCIDSK
CONO PI,PI.ON+DSKPIN## ;START GETTING DISK INTERRUPTS
PUSHJ P,AUTSYS## ;CREATE SYSINI DDB LINKAGES
PUSHJ P,XTCLNK## ;CREATE AND LINKUP DA28 KDBS AND UDBS
PUSHJ P,FILMEM## ;SETUP FILSER CORE BLOCKS
PUSHJ P,SETFPT ;SET UP FREPTR AND FREE CORE POOL
IFN FTCIDSK,<PUSHJ P,ONCBND##> ;BIND CI DISKS
; JRST STRTUP ;GO TO STARTUP OPTION
SUBTTL ASK FOR START-UP OPTION
;TYPING ESCAPE DURING ONCE WILL BRING YOU BACK HERE TO TRY AGAIN.
STRTUP::MOVE P,.CPNPD## ;RESET STACK INCASE OF RESTART
PUSHJ P,KONCE## ;KILL OFF ONCE-ONLY DATA STRUCTURES
PUSHJ P,RDDISK## ;READ THE DISKS
JFCL ;IGNORE ERRORS
SETZM GOFLAG ;NO ONE'S TYPED "GO" YET
SKIPL DEBUGF## ;DEBUGGING?
JRST STRTU1 ;NO--NORMAL STARTUP
SKIPL ALTMFL ;BUT WAS ALTMODE TYPED?
JRST STRTU6 ;SKIP THE VERBIAGE
STRTU1: SETZM ALTMFL ;CLEAR FLAG THAT SAYS ALTMODE WAS TYPED
SETZM ONCTCH ;ALLOW NO 'TYPEAHEAD' THROUGH PRSCON
SKIPE GOFLAG ;READY TO START TIMESHARING?
JRST STRTU7 ;YES
SETZM IGNORE ;NO--CLEAR /NOERROR FLAG
MOVE T1,DEFSP ;GET VIRGIN POINTER
MOVEM T1,DEFPTR ;RESET IT
MOVEI T1,[ASCIZ /GO ;Operator did not answer/]
PUSHJ P,DEFTXT ;STORE IN DEFAULT BUFFER
MOVE T1,DEFSP ;INITIAL STRING POINTER AGAIN
MOVEM T1,DEFPTR ;RESET FOR TIMEOUT
MOVEI T1,[ASCIZ /Startup option/]
SETZ T2, ;NO DEFAULT
PUSHJ P,PRSSIX ;PROMPT AND FETCH ANSWER
JUMPE T1,[PUSHJ P,SHELP ;GIVE SHORT HELP
JRST STRTU1] ;AND TRY AGAIN
PUSHJ P,ALTM ;BACK TO STARTUP OPTION IF ALTMODE TYPED
MOVE T2,T1 ;COPY ANSWER FOR FNDNAM
;PROCESS SWITCHES
STRTU2: MOVE T3,ONCTCH ;RESTORE DELIMITER
CAIE T3,"/" ;SWITCH COMING?
JRST STRTU3 ;NO, CHECK OPTION
PUSH P,T2 ;SAVE OPTION
PUSHJ P,CTEXT## ;PICK UP SWITCH NAME
MOVE T1,SWTPTR ;GET POINTER TO SWITCH NAMES
PUSHJ P,FNDNAM## ;LOOKUP NAME
JRST [PUSHJ P,SHELP ;GIVE SHORT HELP
JRST STRTU1] ;AND TRY AGAIN
ADD T1,SWTDSP ;INDEX INTO DISPATCH TABLE
PUSHJ P,@(T1) ;DO SOMETHING
JFCL ;IGNORE ERRORS
POP P,T2 ;RESTORE OPTION NAME
JRST STRTU2 ;SEE IF ANOTHER SWITCH COMING
;PROCESS COMMANDS
STRTU3: MOVE T1,[-1,,['HELP ']] ;SPECIAL HACK
PUSHJ P,FNDNAM## ;WAS "HELP" TYPED?
JRST STRTU4 ;NO
MOVEI T1,[IFIW .HELP] ;FAKE UP A HELP COMMAND
JRST STRTU5 ;AND GO PROCESS IT
STRTU4: MOVE T1,OPTPTR ;GET POINTER TO COMMAND NAMES
PUSHJ P,FNDNAM## ;LOOKUP NAME
JRST [PUSHJ P,SHELP ;GIVE SHORT HELP
JRST STRTU1] ;AND TRY AGAIN
MOVE T2,OPTPTR ;GET COMMAND TABLE AGAIN
ADDI T2,(T1) ;INDEX TO SPECIFIED COMMAND
MOVE T2,(T2) ;GET FULL COMMAND NAME
MOVEM T2,STOPTN## ;SAVE STARTUP OPTION FOR GETTAB
ADD T1,OPTDSP ;INDEX INTO DISPATCH TABLE
;COMMAND DISPATCH
STRTU5: HRLOI T2,777 ;A BIG NUMBER
MOVEM T2,OPRCNT ;SET FUTURE PARSER TIMEOUTS TO INFINITE
SETZM DEFALW ;INDICATE WE SAW SOME INPUT
PUSHJ P,@(T1) ;DO SOMETHING
JFCL ;IGNORE ERRORS
JRST STRTU1 ;LOOP BACK FOR MORE COMMANDS
;HERE TO START SYSTEM WHEN DEBUGGING
STRTU6: MOVE T1,['NOINIT'] ;SPECIAL HACK SO SCNSER
MOVEM T1,STOPTN## ; DOESN'T DRIVE US CRAZY
PUSHJ P,.NOINI ;MAKE IT LOOK LIKE "NOINITIA"
JFCL ;IGNORE ERRORS
;HERE WHEN DONE SCANNING COMMANDS AND SWITCHES
STRTU7: HRRZ T1,CRSSTS ;STATES BEFORE THE RELOAD
TRO T1,ST.NOP ;ASSUME NO OPR IN ATTENDANCE
SKIPGE DEFALW ;DID THE OPR ANSWER?
HRRM T1,STATES## ;NO, STORE STATES AS PREVIOUSLY SET BY OPR
SETZM CRSWHY ;SO WILL ASK "WHY RELOAD" NEXT TIME
SETZM GOFLAG ;CLEAR "GO" TO AVOID LOOPING ON ERRORS
PUSHJ P,VFCORE## ;VERIFY IN-CORE DISK DATA BASE
JRST [SKIPN IGNORE ;UNLESS /NOERROR,
JRST STRTU1 ;LET OPERATOR CORRECT ERRORS
JRST .+1] ;WRONG--CONTINUE IN BLIND FAITH
PUSHJ P,GOHOME## ;REWRITE HOME BLOCKS IF NECESSARY
PUSHJ P,FILMAN## ;DO ONCE-ONLY MANDATORY FILE SYSTEM SETUP
SKIPN .UONCE## ;USER-MODE?
SKIPN REFLAG## ;NO--AUTOMATIC "LOGIN" WANTED?
JRST STRTU8 ;THEN NO LOGIN OPTION
MOVE T1,FFAPPN## ;[OPR]
MOVEM T1,REFLAG## ;SET AS FREE LOGIN PPN
MOVEI T1,[ASCIZ /To automatically log in under /]
PUSHJ P,ICONM ;PRINT TEXT
MOVE T2,FFAPPN## ;GET [OPR]
PUSHJ P,PRTPPN## ;PRINT PPN
MOVEI T1,[ASCIZ / type "LOGIN"/]
PUSHJ P,CONMES## ;PRINT TEXT
PUSHJ P,CRLFOP ;APPEND A CRLF
STRTU8: PJRST PVQCK ;NOW START TIMESHARING
;SWITCH AND OPTION ACTION MACROS
;START-UP OPTIONS
DEFINE OPTINS,<
X (CHANGE,.CHANG,<Change system parameters>)
X (DEFINE,.DEFIN,<Define structures and system lists>)
X (DESTROY,.DESTR##,<Dissolve all structures in the system>)
X (DISSOLVE,.DISSO##,<Dissolve a single structure>)
X (GO,.GO,<Start timesharing>)
X (NOINITIA,.NOINI,<Start timesharing without system initialization>)
X (REFRESH,.REFRE##,<Refresh selected structures>)
X (SHOW,.SHOW,<Display system parameters>)
>; END DEFINE OPTINS
;SWITCHES FOR START-UP OPTIONS
DEFINE SWTCHS,<
X (NOASL,NOASL,<Don't use preserved active swapping list>)
X (NOCOPY,NOCOPY,<Don't start CRSCPY>)
IFN FTKL10,<
X (NOPRIMARY,NOPRIM,<Start timesharing in secondary protocol>)
>;; END IFN FTKL10
X (NOSDL,NOSDL,<Don't use preserved system dump list>)
X (NOSSL,NOSSL,<Don't use preserved system search list>)
X (NOVALIDATE,NOVALI,<Don't require account validation>)
X (STANDALONE,STAND,<Start timesharing with SCHED 10 set>)
>; END DEFINE SWTCHS
;STARTUP OPTION COMMAND NAMES
DEFINE X (NAME,ADDR,HELP),<EXP <SIXBIT/NAME/>>
OPTTAB: OPTINS
OPTLEN==.-OPTTAB ;LENGTH OF START-UP OPTIONS TABLE
;STARTUP OPTION COMMAND DISPATCH
DEFINE X (NAME,ADDR,HELP),<IFIW ADDR>
OPTADR: OPTINS
;STARTUP OPTION COMMAND HELP TEXT
DEFINE X (NAME,ADDR,HELP),<IFIW [ASCIZ \'HELP\]>
OPTTXT: OPTINS
;LOCATIONS POKED BY USRONC WITH USER-MODE TABLE ADDRESSES
OPTPTR::-OPTLEN,,OPTTAB ;COMMAND TABLE
OPTDSP::IFIW OPTADR ;COMMAND DISPATCH TABLE
OPTHLP::IFIW OPTTXT ;COMMAND HELP TEXT
;STARTUP OPTION SWITCH NAMES
DEFINE X (NAME,ADDR,HELP),<EXP <SIXBIT /NAME/>>
SWTTAB: SWTCHS
SWTLEN==.-SWTTAB ;LENGTH OF SWITCH TABLE
;STARTUP OPTION SWITCH DISPATCH
DEFINE X (NAME,ADDR,HELP),<IFIW ADDR>
SWTADR: SWTCHS
;STARTUP OPTION SWITCH HELP TEXT
DEFINE X (NAME,ADDR,HELP),<IFIW [ASCIZ \'HELP\]>
SWTTXT: SWTCHS
;LOCATIONS POKED BY USRONC WITH USER-MODE TABLE ADDRESSES
SWTPTR::-SWTLEN,,SWTTAB ;SWITCH TABLE
SWTDSP::IFIW SWTADR ;SWITCH DISPATCH TABLE
SWTHLP::IFIW SWTTXT ;SWITCH HELP TEXT
SUBTTL STARTUP OPTION COMMANDS -- .CHANG - CHANGE
.CHANG::SETOM CHGFLG ;INDICATE CHANGE, NOT DEFINE
MOVEI T1,[ASCIZ /Change/] ;PROMPT
SETZ T2, ;NO DEFAULT KEYWORD
MOVE T3,CHGPTR ;TABLE OF LEGAL RESPONSES
PUSHJ P,PRSKEY ;FETCH A KEYWORD
JRST CPOPJ1## ;GUESS HE CHANGED HIS MIND
ADD T1,CHGDSP ;INDEX INTO THE CHANGE DISPATCH TABLE
JRST @(T1) ;GO DEFINE SOMETHING
DEFINE CHGOPT,<
X (ASL,CHGASL##)
X (DATE,CHGDAT)
X (NETWOR,CHGNET)
X (SDL,CHGSDL##)
X (SETS,CHGSET##)
X (SSL,CHGSSL##)
X (STRUCT,CHGSTR##)
X (UNIT,CHGUNI##)
> ;END DEFINE CHGOPT
DEFINE X (NAME,ADDR),<EXP <SIXBIT/NAME/>>
CHGTAB: CHGOPT
CHGLEN==.-CHGTAB
DEFINE X (NAME,ADDR),<IFIW ADDR>
CHGADR: CHGOPT
;USRONC REWRITES THESE LOCATIONS
CHGPTR::-CHGLEN,,CHGTAB
CHGDSP::IFIW CHGADR
;CHANGE DATE
CHGDAT: SETZM ONCTCH ;DEFEAT PRSCON
SETZM FETFLG ;ASSUME NO FE TIME
SKIPN .UONCE## ;USER MODE CAN'T ASK THE FRONT ENDS
PUSHJ P,GFETIM ;SEE IF FRONT END KNOWS TIME
JRST DATLP1 ;IT DOES NOT, TRY FOR LAST CRASH TIME
JRST DATLP2 ;IT DOES, USE IT FOR A DEFAULT
DATHLP: PUSHJ P,RSTDEF ;SOMETHING WENT WRONG, GIVE OPR TIME TO PONDER
SETZM FETFLG ;FORGET WHATEVER THE FE MAY HAVE TOLD US
SKIPA T1,[[ASCIZ /Please type today's date as MON-DD(-YY)
/]]
DATLP1: MOVEI T1,[ASCIZ /Date: /]
SETOM LOCSEC## ;NO TIME KNOWN YET
SETOM CRSDAY ;FAR FAR DISTANT PAST
PUSHJ P,CHKDCS ;CRASH CHECKSUM REASONABLE?
JRST ASKDAT ;NO, SO MUST ASK FOR DATE AND TIME
MOVE T2,T4 ;COPY DATE
ANDI T2,17 ;MASK OUT MONTH
MOVEM T2,LOCMON## ;STORE
MOVE T1,T4 ;COPY DATE AGAIN
LSH T1,-4 ;SHIFT OFF MONTH
MOVE T2,T1 ;COPY DATE
ANDI T2,37 ;MASK OUT DAY
MOVEM T2,LOCDAY## ;STORE IN COMMON
LSH T1,-5 ;SHIFT OFF DAY
ADDI T1,^D1970 ;ADD IN BASE
MOVEM T1,LOCYER## ;STORE
HRRZ T1,CRSDTM ;GET TIME
IDIVI T1,^D60*^D60 ;GET HOURS
IDIVI T2,^D60 ;GET MIN
MOVEM T1,LOCHOR## ;STORE HOURS
MOVEM T2,LOCMIN## ;STORE MIN
MOVEM T3,LOCSEC## ;STORE SECONDS
PUSHJ P,CHKMNT## ;SEE IF PASSED THROUGH MIDNIGHT WHILE RELOADING
CAIA ;SKIP
DATLP2: SETOM FETFLG ;GOT TIME FROM FE
SKIPGE DEFALW ;SEE IF ALREADY DEFAULTING
MOVMS FETFLG ;YES--REMEMBER THAT
PUSHJ P,THSDA## ;RECOMPUTE THSDAT
PUSHJ P,SUDATE## ;COMPUTE DATE TOO (FOR DOW PRINTING)
DATLP3: MOVE T1,THSDAT## ;GET THSDAT
MOVEM T1,CRSDAY ;SAVE FOR LATER
MOVE T1,DEFSP ;GET DEFAULT STRING POINTER
MOVEM T1,DEFPTR ;STORE AS POINTER
MOVE T1,LOCDAY## ;GET THE DAY
PUSHJ P,DECDEF ;STORE AS PART OF DEFAULT
MOVEI T1,"-" ;ADD A DASH
IDPB T1,DEFPTR ; ..
MOVE T1,LOCMON## ;GET MONTH
MOVEI T1,MONTHS-1(T1) ;POINT AT ASCII MNEMONIC PLUS "-" AT END
PUSHJ P,DEFTXT ;STUFF IT
MOVE T1,LOCYER## ;GET THE YEAR
PUSHJ P,DECDEF ;ADD THAT ON
SKIPN FETFLG ;GOT TIME FROM FE?
JRST DATLP4 ;NO
SETOM CRSDAY ;YES, FORGET CRASH TIME
SKIPA T1,[[ASCIZ / ;From FE clock/]]
DATLP4: MOVEI T1,[ASCIZ / ;From last crash/]
PUSHJ P,DEFTXT ;ADD TO DEFAULT
MOVEI T1,[ASCIZ /Date: /]
MOVEI T2,DEFBUF
SKIPN FETFLG ;TIME FROM FE?
SKIPA T3,OPRCNT ;NO, USE OPRCNT
MOVEI T3,^D5 ;YES, REDUCE WAIT TO 5 SECS
PUSHJ P,ASKDEF ;ASK QUESTION
JRST HAVDAT
JRST ASKDT1 ;GO PARSE THE ANSWER
;HERE WHEN WE MUST ASK THE OPERATOR THE DATE (PROMPT STRING IN T1)
ASKDAT: PUSHJ P,ICONM ;OUTPUT THE QUESTION
PUSHJ P,OPOUT ;PUSH OUTPUT OUT
PUSHJ P,GETLIN ;READ A LINE
JRST DATHLP ;GIVE THEM SOME HELP
ASKDT1: MOVEI T1,LOCYER## ;POINT AT YEAR/MONTH/DAY TRIPLET
PUSHJ P,GTDATE## ;GET DATE
JRST DATHLP ;ERROR
MOVE T2,LOCYER## ;GET THE YEAR THE OPERATOR CLAIMED
SUBI T2,^D1900 ;SUBTRACT BASE
CAMGE T2,ONCYER ;WAY OUT OF LINE?
JRST DATHLP ;YES, GIVE THEM SOME HELP
MOVE T1,LOCMON## ;NOW CHECK DAY ARG
SOS T1 ;INDEX INTO MONTAB
LDB T2,PMONTB## ;GET NUMBER OF DAYS (MINUS 1) THAT MONTH
AOS T2 ;MAKE DAYS IN THAT MONTH
SOJN T1,ASKDT2 ;JUMP IF NOT FEB
MOVE T1,LOCYER## ;LEAP YEAR?
TRNN T1,3
AOS T2 ;YES - 29 DAYS
ASKDT2: CAML T2,LOCDAY## ;CHECK DAY ARG
JRST HAVDAT ;OK
MOVEI T1,[ASCIZ/?Illegal day of month
/]
PUSHJ P,ICONM ;START MESSAGE
PUSHJ P,OPOUT ;PUSH OUTPUT OUT
JRST DATHLP ;GIVE THEM SOME HELP
HAVDAT: PUSHJ P,THSDA## ;COMPUTE & STORE THSDAT
PUSHJ P,SUDATE## ;COMPUTE DATE TOO (FOR DOW PRINTING)
MOVE T1,THSDAT## ;GET THSDAT
CAML T1,CRSDAY ;SPECIFIED DATE AFTER LAST CRASH?
JRST VALID ;YES, GO VALIDATE THE DATE
MOVEI T1,[ASCIZ /
%Specified date is prior to last crash.
Last crash date: /]
PUSHJ P,ICONM ;START MESSAGE
MOVEI T1,DEFBUF ;POINT AT THEIR RESPONSE
JRST VALID2 ;PRINT SUSPECT DATE AND ASK IF CORRECT
VALID: MOVE T1,ONCMON ;FORM 12 BIT DATE FOR COMPARISON
IMULI T1,^D31
MOVEM T1,CHKDAT
MOVE T1,ONCDAY
SUBI T1,1+^D31
ADDM T1,CHKDAT
MOVE T1,ONCYER
SUBI T1,^D64 ;ADJUST TO T=0
IMULI T1,^D12*^D31
ADD T1,CHKDAT
CAMLE T1,THSDAT## ;SPECIFIED DATE PRIOR TO SYSTEM CREATION DATE?
JRST VALID1 ;YES
SKIPE DTCKFL ;DATE OK, WANT TO VERIFY DATE/TIME ENTERED?
JRST VALID3 ;ASK OPR TO CONFIRM WHAT HE TYPED
JRST TIMLOP ;GO GET TIME
VALID1: MOVEI T1,[ASCIZ /
%Specified date is prior to monitor creation date.
Creation date: /]
PUSHJ P,ICONM ;QUESTION EARLY DATE
MOVEI T1,SYSDAT## ;POINT AT SYSTEM CREATION DATE
VALID2: PUSHJ P,CONMES## ;OUTPUT IT
PUSHJ P,OPOUT ;PUSH OUTPUT OUT
VALID3: MOVEI T1,[ASCIZ /
Specified date: /]
PUSHJ P,ICONM ;START MESSAGE
PUSHJ P,PRDOFW## ;PRINT DAY OF THE WEEK
PUSHJ P,PRSPC## ;SPACE OVER
PUSHJ P,PRDAYD## ;PRINT DATE AND TIME
PUSHJ P,OPOUT ;PUSH OUTPUT OUT
SKIPE FETFLG ;DID DATE/TIME COME FROM FE?
PUSHJ P,RSTDEF ;YES, GIVE OPR TIME TO DISLIKE
MOVEI T1,[ASCIZ /Is this correct/]
MOVSI T2,'YES' ;DEFAULT ANSWER
PUSHJ P,PRSYNQ ;GET YES/NO RESPONSE
JUMPE T1,DATHLP ;HE SAID "NO"
JRST TIMLOP ;HE LIKES IT ANYWAY
SUBTTL ASK FOR TIME OF DAY
TIMHLP: SETZM FETFLG ;FORGET ANY TIME FROM THE FE
PUSHJ P,RSTDEF ;GIVE OPR TIME TO PONDER
SKIPA T1,[[ASCIZ /Please type time as HHMMSS or HH:MM:SS
/]]
TIMLOP: MOVEI T1,[ASCIZ /Time: /]
SKIPGE LOCSEC## ;DO WE KNOW TIME
JRST ASKTIM ;NO--GO ASK FOR IT
MOVE T1,DEFSP ;SET UP BYTE POINTER TO DEFBUF
MOVEM T1,DEFPTR
MOVE T1,LOCHOR## ;SETUP DEFAULT
PUSHJ P,DECDEF ; ..
MOVEI T1,":"
IDPB T1,DEFPTR
MOVE T1,LOCMIN## ; ..
PUSHJ P,DECDEF ; ..
MOVEI T1,":"
IDPB T1,DEFPTR
MOVE T1,LOCSEC## ; ..
PUSHJ P,DECDEF ; ..
SKIPE FETFLG ;GOT TIME FROM FE?
SKIPA T1,[[ASCIZ / ;From FE clock/]]
MOVEI T1,[ASCIZ / ;From last crash or previous answer/]
PUSHJ P,DEFTXT ;ADD TO DEFAULT
MOVEI T1,[ASCIZ /Time: /]
MOVEI T2,DEFBUF
SKIPN FETFLG ;TIME FROM FE?
SKIPA T3,OPRCNT ;NO, USE OPRCNT
MOVEI T3,^D5 ;YES, REDUCE WAIT TO 5 SECS
PUSHJ P,ASKDEF ;GO ASK ABOUT TIME
JRST HAVTIM ;JUST A CR
JRST ASKTM1 ;GO PARSE TIME
ASKTIM: PUSHJ P,ICONM ;OUTPUT THE QUESTION
PUSHJ P,OPOUT ;PUSH OUTPUT OUT
PUSHJ P,GETLIN ;READ A LINE
JRST TIMHLP ;JUST A CR
ASKTM1: PUSHJ P,RDTIM## ;GET TIME OF DAY
JRST [PUSHJ P,ERRCRL## ;ISSUE CRLF AND ERROR MESSAGE
PUSHJ P,OPOUT ;PUSH OUTPUT OUT
JRST TIMHLP] ;LOOP BACK AND TRY AGAIN
IDIVI T1,^D60*^D60 ;T1:= HOURS
IDIVI T2,^D60 ;T2:= MINUTES, T3:= SECONDS
MOVEM T1,LOCHOR## ;SAVE HOURS
MOVEM T2,LOCMIN## ;SAVE MINUTES
MOVEM T3,LOCSEC## ;SAVE SECONDS
; PJRST HAVTIM ;GO COMPARE AGAINST LAST CRASH TIME
HAVTIM: MOVE T1,LOCHOR## ;GET HOURS
MOVE T2,LOCMIN## ;GET MINUTES
IMULI T1,^D60 ;CONVERT HOURS TO MINUTES
ADD T1,T2 ;MINUTES SINCE MIDNIGHT
IMUL T1,TICMIN## ;JIFFIES SINCE MIDNIGHT
MOVEM T1,TIME## ;TIME=JIFFIES SINCE MIDNIGHT
MOVE T1,LOCSEC## ;SECONDS INTO THIS MINUTE
IMUL T1,TICSEC## ;JIFFIES INTO THIS MINUTE
ADDB T1,TIME## ;TIME=JIFFIES SINCE MIDNIGHT
HRRZ T2,CRSDTM ;GET TIME OF DAY IN SECONDS AT LAST CRASH
SUBI T2,RLDTIM## ;SUBTRACT TIME REQUIRED FOR AUTO-RELOAD
IMUL T2,TICSEC## ;CONVERT SECONDS TO TICKS
MOVE T3,THSDAT## ;GET SPECIFIED DATE
CAMGE T1,T2 ;SPECIFIED TIME PRIOR TO CRASH TIME?
CAME T3,CRSDAY ;YES, IF DAY AND CRASH DAY MATCH, COMPLAIN
SKIPA ;TIME IS LEGAL, SEE IF OPR VERIFICATION REQ'D
JRST HAVTM1 ;INVALID TIME, COMPLAIN
SKIPE DTCKFL ;OPR NEED TO VERIFY TIME?
JRST HAVTM3 ;YES, CHECK IT OUT
JRST HAVTM5 ;NO, GOOD TIME, MOVE ONWARD
HAVTM1: SKIPE DTCKFL ;OPR NEED TO VERIFY TIME?
JRST HAVTM2 ;YES, DO THIS DIFFERENTLY
MOVEI T1,[ASCIZ /
%Specified time is prior to last crash.
Specified time: /]
PUSHJ P,ICONM ;START MESSAGE
PUSHJ P,PRDTIM## ;PRINT TIME OF DAY BASED ON LOCHOR/MIN/SEC
MOVEI T1,[ASCIZ /Last crash time: /]
PUSHJ P,CONMES##
HRRZ T1,CRSDTM ;GET TIME OF LAST CRASH (SECS PAST MIDNIGHT)
SUBI T1,RLDTIM## ;SUBTRACT TIME FOR RELOAD
IMUL T1,TICSEC## ;CONVERT TO TICKS
PUSHJ P,PRTIME## ;PRINT TIME OF DAY
PUSHJ P,OPOUT ;PUSH OUTPUT OUT
JRST HAVTM4 ;SEE IF THEY LIKE IT
HAVTM2: MOVEI T1,[ASCIZ /
%Specified time is prior to last crash time.
Crash time: /]
PUSHJ P,ICONM ;START MESSAGE
HRRZ T1,CRSDTM ;GET TIME OF LAST CRASH (SECS PAST MIDNIGHT)
SUBI T1,RLDTIM## ;SUBTRACT TIME FOR RELOAD
IMUL T1,TICSEC## ;CONVERT TO TICKS
PUSHJ P,PRTIMS## ;PRINT TIME
PUSHJ P,CRLF ;AND CRLF
PUSHJ P,OPOUT ;PUSH OUTPUT OUT
HAVTM3: MOVEI T1,[ASCIZ/
Specified time: /]
PUSHJ P,ICONM ;START MESSAGE
MOVE T1,TIME## ;GET TIME
PUSHJ P,PRTIMS## ;PRINT IT
MOVEI T1,[ASCIZ/ (/] ;GET TEXT
PUSHJ P,CONMES## ;TYPE
MOVE T1,TIME## ;GET TIME AGAIN
PUSHJ P,PRAMPM## ;TYPE AS AM/PM
MOVEI T1,[ASCIZ/)/] ;
PUSHJ P,CONMES## ;
PUSHJ P,OPOUT ;PUSH OUTPUT OUT
HAVTM4: SKIPE FETFLG ;DID DATE/TIME COME FROM FE?
PUSHJ P,RSTDEF ;YES, GIVE OPR TIME TO DISLIKE
MOVEI T1,[ASCIZ /Is this correct/]
MOVSI T2,'YES' ;DEFAULT ANSWER
PUSHJ P,PRSYNQ ;GET YES/NO RESPONSE
JUMPE T1,DATLP3 ;HE SAID "NO"
HAVTM5: SKIPGE FETFLG ;DID DATE/TIME COME FROM FE?
PUSHJ P,RSTDEF ;YES, GIVE OPR TIME TO REPLY AGAIN
JRST CPOPJ1## ;FINALLY DONE
;TABLE OF ASCIZ MONTH NAMES USED IN DEFAULTING DATE STRING
DEFINE MONTH.(NAME),<
IRP NAME,<ASCIZ /'NAME'-/>
>; END DEFINE MONTH.
MONTHS: MONTH. (<Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec>)
ONCMON: M.MON## ;MONTH MONITOR WAS GEN'D
ONCDAY: M.DAY## ;DAY MONITOR WAS GEN'D
ONCYER: M.YEAR## ;YEAR MONITOR WAS GEN'D
DTCKFL: M.DTCK## ;FLAG IF -1 OPR MUST VERIFY DATE/TIME
;CHANGE NETWORKS
CHGNET: SETZM ONCTCH ;DEFEAT PRSCON
SKIPN [M.NET##] ;HAVE ANY NETWORKS?
JRST CPOPJ1## ;NO
MOVEI T1,[ASCIZ /System-wide node name/]
SKIPN T2,ANFNAM## ;ANF-10 NAME OVERWRITES OTHERS
MOVE T2,DCNNAM## ;TRY DECNET
PUSHJ P,PRSSIX ;PROMPT AND PARSE RESULTS
MOVEM T1,STANAM## ;UPDATE
;ANF-10
CHGNE1: SKIPN [M.ANF##] ;NECESSARY SOFTWARE LOADED?
JRST CHGNE2 ;NO
MOVEI T1,[ASCIZ /ANF-10 node name/]
MOVE T2,ANFNAM## ;DEFAULT
PUSHJ P,PRSSIX ;PROMPT AND PARSE RESULTS
MOVEM T1,ANFNAM## ;UPDATE
MOVEI T1,[ASCIZ /ANF-10 node number/]
MOVE T2,ANFNUM## ;DEFAULT
MOVEI T3,1 ;LOW RANGE
MOVEI T4,77 ;HIGH RANGE
PUSHJ P,PRSOCT ;PROMPT AND PARSE RESULTS
MOVEM T1,ANFNUM## ;UPDATE
PUSHJ P,NETINI## ;ADJUST NDB, DDBS, ETC.
CHGNE2: SKIPN [M.DECN##] ;NECESSARY SOFTWARE LOADED?
JRST CHGNE3 ;NO
MOVEI T1,[ASCIZ /DECnet node name/]
MOVE T2,DCNNAM## ;DEFAULT
PUSHJ P,PRSSIX ;PROMPT AND PARSE RESULTS
MOVEM T1,DCNNAM## ;UPDATE
MOVEI T1,[ASCIZ /DECnet area number/]
MOVE T2,DCNHOM## ;DEFAULT
MOVEI T3,1 ;LOW RANGE
MOVEI T4,^D63 ;HIGH RANGE
PUSHJ P,PRSDEC ;PROMPT AND PARSE RESULTS
MOVEM T1,DCNHOM## ;UPDATE
MOVEI T1,[ASCIZ /DECnet node number/]
MOVE T2,DCNNUM## ;DEFAULT
MOVEI T3,1 ;LOW RANGE
MOVEI T4,^D1023 ;HIGH RANGE
PUSHJ P,PRSDEC ;PROMPT AND PARSE RESULTS
MOVEM T1,DCNNUM## ;UPDATE
CHGNE3: SKIPN [M.LAT##] ;NECESSARY SOFTWARE LOADED?
JRST CHGNE4 ;NO
MOVEI T1,[ASCIZ /LAT service name/]
MOVE T2,LATNAM## ;DEFAULT
PUSHJ P,PRSSIX ;PROMPT AND PARSE RESULTS
MOVEM T1,LATNAM## ;UPDATE
CHGNE4: JRST CPOPJ1## ;RETURN
SUBTTL STARTUP OPTION COMMANDS -- .DEFIN - DEFINE
.DEFIN::SETZM CHGFLG ;INDICATE DEFINE, NOT CHANGE
MOVEI T1,[ASCIZ /Define/] ;PROMPT
SETZ T2, ;NO DEFAULT KEYWORD
MOVE T3,[-DEFLEN,,DEFTAB] ;TABLE OF LEGAL RESPONSES
PUSHJ P,PRSKEY ;FETCH A KEYWORD
JRST CPOPJ1## ;HE HAD SECOND THOUGHTS
JRST @DEFDSP(T1) ;GO DEFINE SOMETHING
DEFINE DEFOPT,<
X (ASL,DEFASL##)
X (SDL,DEFSDL##)
X (SSL,DEFSSL##)
X (STRUCT,DEFSTR##)
> ;END DEFINE DEFOPT
DEFINE X (NAME,ADDR),<EXP <SIXBIT/NAME/>>
DEFTAB: DEFOPT
DEFLEN==.-DEFTAB
DEFINE X (NAME,ADDR),<IFIW ADDR>
DEFDSP: DEFOPT
SUBTTL STARTUP OPTION COMMANDS -- .GO - GO
.GO:: SETOM GOFLAG ;SAY WE'RE DONE ASKING QUESTIONS
JRST CPOPJ1## ;AND RETURN
SUBTTL STARTUP OPTION COMMANDS -- .HELP - HELP
.HELP: PUSHJ P,SAVE2## ;SAVE P1 AND P2
PUSHJ P,OTSET ;SETUP OUTPUT BYTE POINTER, ETC.
PUSHJ P,CRLFOP ;START WITH A CRLF
PUSHJ P,CRLFOP ;ONE MORE FOR CLARITY
MOVEI T1,[ASCIZ /Options are:/]
PUSHJ P,CONOUT ;PRINT TEXT
HLLZ P1,OPTPTR ;AOBJN POINTER TO TABLES
HELP1: PUSHJ P,OTSET ;RESET OUTPUT BYTE POINTER, ETC.
HRRZ T2,P1 ;GET TABLE INDEX
ADD T2,OPTPTR ;OFFSET INTO NAME TABLE
MOVE T2,(T2) ;GET NAME
PUSHJ P,PRNAME## ;PRINT IT
MOVEI T1,[ASCIZ / - /]
PUSHJ P,CONMES## ;PRINT SEPARATOR
HRRZ T1,P1 ;GET TABLE OFFSET
ADD T1,OPTHLP ;OFFSET INTO HELP TEXT TABLE
MOVE T1,(T1) ;FETCH STRING ADDRESS
PUSHJ P,CONMES## ;PRINT IT
PUSHJ P,CRLFOP ;APPEND A CRLF
AOBJN P1,HELP1 ;LOOP FOR ALL OPTIONS
SKIPN SWTPTR ;HAVE ANY SWITCHES?
JRST HELP3 ;NO
PUSHJ P,OTSET ;RESET OUTPUT BYTE POINTER, ETC.
PUSHJ P,CRLFOP ;START WITH A CRLF
PUSHJ P,CRLFOP ;ONE MORE FOR CLARITY
MOVEI T1,[ASCIZ /Switches are:/]
PUSHJ P,CONOUT ;PRINT TEXT
HLLZ P1,SWTPTR ;AOBJN POINTER TO TABLES
HELP2: PUSHJ P,OTSET ;RESET OUTPUT BYTE POINTER, ETC.
HRRZ T2,P1 ;GET TABLE INDEX
ADD T2,SWTPTR ;OFFSET INTO NAME TABLE
MOVE T2,(T2) ;GET NAME
PUSHJ P,PRNAME## ;PRINT IT
MOVEI T1,[ASCIZ / - /]
PUSHJ P,CONMES## ;PRINT SEPARATOR
HRRZ T1,P1 ;GET TABLE OFFSET
ADD T1,SWTHLP ;OFFSET INTO HELP TEXT TABLE
MOVE T1,(T1) ;FETCH STRING ADDRESS
PUSHJ P,CONMES## ;PRINT IT
PUSHJ P,CRLFOP ;APPEND A CRLF
AOBJN P1,HELP2 ;LOOP FOR ALL OPTIONS
HELP3: PUSHJ P,OTSET ;RESET OUTPUT BYTE POINTER, ETC.
PJRST CRLFOP ;END WITH AN EXTRA CRLF
SUBTTL STARTUP OPTION COMMANDS -- SHELP - SHORT HELP
SHELP: PUSHJ P,SAVE2## ;SAVE P1 AND P2
MOVE P1,OPTPTR ;AOBJN POINTER TO OPTION NAMES
MOVEI P2,6 ;SIX OPTIONS PER LINE
PUSHJ P,CRLFOP ;START WITH A CRLF
PUSHJ P,CRLFOP ;ONE MORE FOR CLARITY
MOVEI T1,[ASCIZ /Options are:/]
PUSHJ P,ICONM ;PRINT TEXT
SHELP1: MOVEI T1,[ASCIZ / /] ;TAB OVER
PUSHJ P,CONMES## ;START LINE
MOVE T2,(P1) ;GET OPTION NAME
PUSHJ P,PRNAME## ;PRINT IT
SOJG P2,SHELP2 ;ROOM FOR MORE ON THE LINE?
PUSHJ P,CRLFOP ;START ANOTHER LINE
MOVEI T1,[ASCIZ / /] ;TAB
PUSHJ P,ICONM ; OVER
MOVEI P2,6 ;RESET COUNT
SHELP2: AOBJN P1,SHELP1 ;LOOP FOR ANOTHER COMMAND
PUSHJ P,CRLFOP ;END WITH A CRLF
MOVEI T1,[ASCIZ /Type "HELP" for additional information/]
PJRST CONOUT ;PRINT TEXT AND RETURN
SUBTTL STARTUP OPTION COMMANDS -- .NOINI - NOINITIA
.NOINI: PUSHJ P,NOCOPY ;PREVENT CRSCPY FROM RUNNING
SETOM GOFLAG ;READY TO START THE MONITOR
JRST CPOPJ1## ;RETURN
SUBTTL STARTUP OPTION COMMANDS -- .SHOW - SHOW
.SHOW:: MOVEI T1,[ASCIZ /Show/]
SETZ T2, ;NO DEFAULT
MOVE T3,SHWPTR ;TABLE OF OPTIONS
PUSHJ P,PRSKEY ;GET AN ANSWER
JRST CPOPJ1## ;BACK OUT OF SHOW
ADD T1,SHWDSP ;INDEX INTO THE DISPATCH TABLE
PUSHJ P,@(T1) ;DO SOMETHING
JFCL ;FOOL
JRST CPOPJ1## ;RETURN
DEFINE SHWOPT,<
X (ASL,SHWASL##)
X (DATE,SHWDAT)
X (NETWOR,SHWNET)
X (SDL,SHWSDL##)
X (SETS,SHWSET##)
X (SSL,SHWSSL##)
X (STRUCT,SHWSTR##)
X (UNIT,SHWUNI##)
> ;END DEFINE SHWOPT
DEFINE X (NAME,ADDR),<EXP <SIXBIT/NAME/>>
SHWTAB: SHWOPT
SHWLEN==.-SHWTAB
DEFINE X (NAME,ADDR),<IFIW ADDR>
SHWADR: SHWOPT
;USRONC WRITES THESE LOCATIONS
SHWPTR::-SHWLEN,,SHWTAB
SHWDSP::IFIW SHWADR
;SHOW DATE
SHWDAT: PUSHJ P,OTSET ;SET UP OUTPUT BUFFER
PUSHJ P,DAYTIM## ;PRINT DAY, DATE, & TIME
PUSHJ P,CRLFOP ;APPEND A CRLF
JRST CPOPJ1## ;AND RETURN
;SHOW NETWORKS
SHWNET::MOVEI T1,[ASCIZ /
Networks:
System-wide node name: /]
PUSHJ P,ICONM ;PRINT TEXT
MOVE T2,STANAM## ;GET NAME
PUSHJ P,PRNAME## ;PRINT IT
PUSHJ P,CRLFOP ;END LINE
SHWNE1: SKIPN [M.ANF##] ;NECESSARY SOFTWARE LOADED?
JRST SHWNE2 ;NO
MOVEI T1,[ASCIZ / ANF-10 node /]
PUSHJ P,ICONM ;PRINT TEXT
MOVE T2,ANFNAM## ;GET NAME
PUSHJ P,PRNAME## ;PRINT IT
MOVEI T3,"(" ;START OF DELIMITER
PUSHJ P,COMTYO## ;PRINT IT
MOVE T1,ANFNUM## ;GET NUMBER
PUSHJ P,PRTDI8## ;PRINT IT
MOVEI T3,")" ;END OF DELIMITER
PUSHJ P,COMTYO## ;PRINT IT
PUSHJ P,CRLFOP ;END LINE
SHWNE2: SKIPN [M.DECN##] ;NECESSARY SOFTWARE LOADED?
JRST SHWNE3 ;NO
MOVEI T1,[ASCIZ / DECnet node /]
PUSHJ P,ICONM ;PRINT TEXT
MOVE T2,DCNNAM## ;GET NAME
PUSHJ P,PRNAME## ;PRINT IT
MOVEI T3,"(" ;START OF DELIMITER
PUSHJ P,COMTYO## ;PRINT IT
MOVE T1,DCNHOM## ;GET AREA
PUSHJ P,PRTDIG## ;PRINT IT
PUSHJ P,PRPER## ;SEPARATOR
MOVE T1,DCNNUM## ;GET NUMBER
PUSHJ P,PRTDIG## ;PRINT IT
MOVEI T3,")" ;END OF DELIMITER
PUSHJ P,COMTYO## ;PRINT IT
PUSHJ P,CRLFOP ;END LINE
SHWNE3: SKIPN [M.LAT##] ;NECESSARY SOFTWARE LOADED?
JRST SHWNE4 ;NO
MOVEI T1,[ASCIZ / LAT service: /]
PUSHJ P,ICONM ;PRINT TEXT
MOVE T2,LATNAM## ;GET NAME
PUSHJ P,PRNAME## ;PRINT IT
PUSHJ P,CRLFOP ;END LINE
SHWNE4: JRST CPOPJ1## ;RETURN
SUBTTL STARTUP OPTION SWITCHES -- /NOASL
NOASL: SETZM PREASL ;INVLAIDATE CORE COPY OF ASL
POPJ P, ;RETURN
SUBTTL STARTUP OPTION SWITCHES -- /NOCOPY
NOCOPY: MOVSI T1,(DF.DCC) ;DISABLE INVOCATION OF
IORM T1,DEBUGF## ; CRSCPY AT STARTUP
POPJ P, ;RETURN
SUBTTL STARTUP OPTION SWITCHES -- /NOPRIMARY
IFN FTKL10,<
NOPRIM: MOVSI T1,(ST%NPP) ;GET BIT
IORM T1,CNFST2## ;DISABLE PRIMARY PROTOCOL STARTUP
POPJ P, ;RETURN
> ;END IFN FTKL10
SUBTTL STARTUP OPTION SWITCHES -- /NOSDL
NOSDL: SETZM PRESDL ;INVALIDATE CORE COPY OF SDL
POPJ P, ;RETURN
SUBTTL STARTUP OPTION SWITCHES -- /NOSSL
NOSSL: SETZM PRESSL ;INVALIDATE CORE COPY OF SSL
POPJ P, ;RETURN
SUBTTL STARTUP OPTION SWITCHES -- /NOVALIDATE
NOVALI: MOVSI T1,(ST%ACV) ;ACCOUNT VALIDATION BIT
ANDCAM T1,CNFST2## ;TELL [SYSTEM]ACCOUNTING TO BE FORGIVING
POPJ P, ;RETURN
SUBTTL STARTUP OPTION SWITCHES -- /STANDALONE
STAND: MOVEI T1,ST.NRT ;NO REMOTE TERMINALS
IORM T1,STATES## ;SET SCHED 10
POPJ P, ;RETURN
PRSSET::MOVE T1,[TXTBUF,,TXTBUF+1] ;SET UP BLT
SETZM TXTBUF ;CLEAR FIRST WORD
BLT T1,TXTBUF+TXTLEN-1 ;CLEAR BUFFER
MOVE T1,[POINT 7,TXTBUF] ;BYTE POINTER TO STORAGE
MOVEM T1,TXTPTR ;SAVE
MOVEI T1,<TXTLEN*5>-1 ;BYTE COUNT
MOVEM T1,TXTCNT ;SAVE
SETZM ONCTCH ;NO LONGER HAVE A VALID SEPARATOR
MOVEI T1,PRSTYO ;NEW CHARACTER TYPER
EXCH T1,.CPTOA## ;SWAP
POPJ P, ;RETURN
PRSTYO: SOSLE TXTCNT ;COUNT DOWN
IDPB T3,TXTPTR ;STORE CHARACTER
POPJ P, ;RETURN
PRSCON::LDB T3,ONCTIP ;GET LAST SEPARATOR SEEN
CAMN T3,ONCTCH ;IF IT'S THE SAME AS WHAT'S STORED,
CAIE T3," " ;AND IT'S A SPACE,
JRST CPOPJ1## ;(WRONG--GIVE MUST-PROMPT RETURN)
PUSH P,ONCTCH ;YES--SAVE CHARACTER
PUSH P,ONCTIP ;AND TYPEIN POINTER
PUSHJ P,SKIPS1## ;SEE IF MORE ON THIS LINE
AOS -2(P) ;NO--STILL NEED TO PROMPT
POP P,ONCTIP ;RESTORE TYPEIN POINTER
POP P,ONCTCH ;AND THE CHARACTER
POPJ P, ;RETURN NON-SKIP TO AVOID THE PROMPT
PRSKEY: PUSHJ P,SAVE2## ;SAVE P1 AND P2
PUSH P,T1 ;SAVE PROMPT STRING
PUSH P,T2 ;SAVE DEFAULT ANSWER
PUSH P,T3 ;SAVE TABLE ADDRESS
PUSHJ P,PRSCON ;SEE IF WE CAN CONTINUE
JRST PRSKE0 ;YES--DO SO
PRSKE1: MOVE T1,-2(P) ;GET PROMPT
PUSHJ P,ICONM ;START THE LINE
SKIPN P1,(P) ;ANY KEYWORDS?
JRST PRSKE2 ;NO
MOVNI P2,1 ;INIT A FLAG
MOVEI T1,[ASCIZ / (/] ;START OF LIST
PUSHJ P,CONMES## ;START OF RANGE
PUSHJ P,OPTKEY ;PUT OUT A LIST OF OPTIONS
MOVEI T1,[ASCIZ /)/] ;END OF LIST
PUSHJ P,CONMES## ;PRINT TERMINATOR
PRSKE2: SKIPN -1(P) ;HAVE A DEFAULT?
JRST PRSKE3 ;NOPE
MOVEI T1,[ASCIZ / [/] ;START OF DEFAULT
PUSHJ P,CONMES## ;PRINT TEXT
MOVE T2,-1(P) ;GET KEYWORD
PUSHJ P,PRNAME## ;PRINT IT
PUSH P,.CPTOA## ;SAVE TYPEOUT ADDRESS
MOVEI T1,DEFTYO ;TYPEOUT ROUTINE TO SETUP DEFAULT TEXT
MOVEM T1,.CPTOA## ;SET IT UP
MOVE T1,DEFSP ;INITIAL STRING POINTER
MOVEM T1,DEFPTR ;STORE AT BEGINNING OF DEFAULT BUFFER
MOVE T2,-2(P) ;GET DEFAULT AGAIN
PUSHJ P,PRNAME## ;STUFF INTO THE BUFFER
MOVEI T1,[ASCIZ / ;Operator did not answer/]
PUSHJ P,DEFTXT ;ADD SOME MORE TO THE DEFAULT BUFFER
MOVE T1,DEFSP ;INITIAL POINTER
MOVEM T1,DEFPTR ;RESET FOR PARSING
POP P,.CPTOA## ;RESTORE TYPEOUT ADDRESS
MOVEI T1,[ASCIZ /]/] ;END OF DEFAULT
PUSHJ P,CONMES## ;PRINT IT
PRSKE3: MOVEI T1,[ASCIZ /: /]
PUSHJ P,CONMES## ;PRINT COLON
PUSHJ P,OPOUT ;FORCE OUTPUT
PUSHJ P,GETLIN ;GET OPERATOR'S RESPONSE
JRST PRSKE4 ;GO USE DEFAULT
PRSKE0: PUSHJ P,ALTM ;BACK TO STARTUP OPTION IF ALTMODE TYPED
PUSHJ P,SIXIN ;GET ANSWER
JRST PRSKE7 ;BAD RESPONSE
JRST PRSKE7 ;BAD RESPONSE
MOVE T2,T1 ;COPY KEYWORD
JRST PRSKE5 ;DON'T NEED DEFAULT
PRSKE4: SKIPN T2,-1(P) ;PICK UP DEFAULT
JRST PRSKE6 ;THERE IS NO DEFAULT, HE WANTS OUT
PRSKE5: MOVE T1,(P) ;AND GET AOBJN POINTER TO TABLE
PUSHJ P,ALTM ;BACK TO STARTUP OPTION IF ALTMODE TYPED
PUSHJ P,FNDNAM## ;NOW LOOKUP NAME IN TABLE
JRST PRSKE7 ;NO MATCH
AOS -3(P) ;SKIP RETURN
PRSKE6: POP P,T3 ;RESTORE T3
POP P,T2 ;RESTORE T2
POP P,(P) ;PHASE STACK
POPJ P, ;RETURN WITH RESULT IN T1
PRSKE7: MOVEI T1,[ASCIZ /% Bad response, try again/]
PUSHJ P,CONOUT ;PRINT MESSAGE
JRST PRSKE1 ;LOOP BACK
;PUT OUT A LIST OF KEYWORD OPTIONS
OPTKEY: MOVNI P2,1 ;INIT A FLAG
OPTKE1: MOVEI T1,[ASCIZ /,/] ;SEPARATOR
AOSE P2 ;FIRST KEYWORD?
PUSHJ P,CONMES## ;NO--PRINT SEPARATOR
MOVE T2,(P1) ;GET A KEYWORD
PUSHJ P,PRNAME## ;PRINT IT
AOBJN P1,OPTKE1 ;LOOP FOR ALL KEYWORDS
POPJ P, ;RETURN
;LIST OF NAMES
PRSLST::PUSHJ P,SAVE2## ;SAVE P1 AND P2
PUSH P,T1 ;SAVE PROMPT STRING
PUSH P,T2 ;SAVE VALIDATION ROUTINE
PUSH P,T3 ;SAVE TABLE ADDRESS
SETZM (T3) ;CLEAR A WORD
AOBJN T3,.-1 ;DO THE WHOLE TABLE
PRSLS1: MOVE T1,-2(P) ;GET PROMPT
PUSHJ P,CONOUT ;PRINT IT
MOVE P1,(P) ;GET AOBJN POINTER TO TABLE
PRSLS2: PUSHJ P,GETLIN ;GET OPERATOR'S RESPONSE
JRST PRSLS4 ;NO MORE TYPEIN
JUMPGE P1,PRSLS3 ;ERROR IF TABLE IS FULL
PUSHJ P,ALTM ;BACK TO STARTUP OPTION IF ALTMODE TYPED
PUSHJ P,SIXIN ;GET ANSWER
JRST PRSLS5 ;BAD RESPONSE
JRST PRSLS5 ;BAD RESPONSE
MOVE P2,T1 ;COPY NAME TO A SAFE PLACE
PUSHJ P,@-1(P) ;CALL VALIDATION ROUTINE
JRST PRSLS2 ;DIDN'T PASS TEST
TDZA T1,T1 ;CONTINUE RETURN
MOVEI T1,1 ;LAST RETURN
MOVEM P2,(P1) ;SAVE RESULTS IN TABLE
AOBJN P1,.+1 ;ADVANCE POINTER
JUMPN T1,PRSLS4 ;SKIP ON IF DONE
JRST PRSLS2 ;NO, GET ANOTHER REPLY
PRSLS3: MOVEI T1,[ASCIZ /% Table is full/]
PUSHJ P,CONOUT ;PRINT THE MESSAGE
PRSLS4: HRRZ T1,(P) ;GET STARTING ADDRESS OF TABLE
HRRZ T2,P1 ;AND WHERE IT IS NOW
SUBI T1,(T2) ;COMPUTE DIFFERENCE
HRLZS T1 ;PUT -LENGTH IN LH
HRR T1,(P) ;RETURN AOBJN POINTER TO READ RESULTS
POP P,T3 ;RESTORE T3
POP P,T2 ;RESTORE T2
POP P,(P) ;PHASE STACK
POPJ P, ;RETURN
PRSLS5: MOVEI T1,[ASCIZ /% Bad response, try again/]
PUSHJ P,CONOUT ;PRINT THE MESSAGE
JRST PRSLS2 ;LOOP BACK
;RANDOM TEXT
PRSTXT::PUSHJ P,SAVE2## ;SAVE P1 AND P2
PUSH P,T1 ;SAVE PROMPT STRING
PUSH P,T2 ;SAVE DEFAULT ANSWER
PRSTX1: MOVE T1,-1(P) ;GET PROMPT
PUSHJ P,ICONM ;START THE LINE
SKIPN (P) ;HAVE A DEFAULT
JRST PRSTX2 ;NO
MOVEI T1,[ASCIZ / [/]
PUSHJ P,CONMES## ;PRINT BRACKET
MOVE T1,(P) ;GET DEFAULT
MOVE T1,DEFSP ;INITIAL STRING POINTER
MOVEM T1,DEFPTR ;SET IT UP
MOVE T1,(P) ;GET THE DEFAULT AGAIN
PUSHJ P,DEFTXT ;STUFF IT INTO THE DEFAULT BUFFER
MOVEI T1,[ASCIZ / ;Operator did not answer/]
PUSHJ P,DEFTXT ;APPEND NOTICE THAT WE ARE DEFAULTING
MOVE T1,DEFSP ;INITIAL STRING POINTER AGAIN
MOVEM T1,DEFPTR ;RESET FOR PARSING
PUSHJ P,CONMES## ;PRINT IT
MOVEI T1,[ASCIZ /]/]
PUSHJ P,CONMES## ;PRINT BRACKET
PRSTX2: MOVEI T1,[ASCIZ /: /]
PUSHJ P,CONMES## ;PRINT COLON
PUSHJ P,OPOUT ;FORCE OUTPUT
PUSHJ P,GETLIN ;GET OPERATOR'S RESPONSE
JRST PRSTX3 ;NOTHING TYPED SO DO DEFAULTING
PUSHJ P,ALTM ;BACK TO STARTUP OPTION IF ALTMODE TYPED
JRST PRSTX6 ;FINISH UP
PRSTX3: PUSHJ P,ALTM ;BACK TO STARTUP OPTION IF ALTMODE TYPED
SKIPN T1,(P) ;POINT TO DEFAULT
JRST PRSTX5 ;NO DEFAULT
MOVEI T2,ONCTSZ ;MAXIMUM BYTE COUNT
PRSTX4: HRLI T1,(POINT 7,) ;MAKE A BYTE POINTER
ILDB T3,(T1) ;GET A CHARACTER
IDPB T3,LINEP ;PUT A CHARACTER
SOSLE T2 ;COUNT CHARACTERS
JUMPN T3,PRSTX4 ;LOOP FOR ENTIRE STRING
PRSTX5: MOVE T1,[POINT 7,LINBUF] ;RESET POINTER
MOVEM T1,LINEP ;SO CALLER CAN GRAB CHARACTERS
PRSTX6: POP P,T2 ;RESTORE T2
POP P,(P) ;PHASE STACK
MOVEI T1,LINBUF ;POINT TO BUFFER
POPJ P, ;RETURN WITH RESULT IN T1
;PPN
PRSPPN::PUSHJ P,SAVE2## ;SAVE P1 AND P2
PUSH P,T1 ;SAVE PROMPT STRING
PUSH P,T2 ;SAVE DEFAULT ANSWER
PUSH P,T3 ;SAVE POSSIBLE KEYWORD TABLE ADDRESS
PUSHJ P,PRSCON ;SEE IF 'TYPEAHEAD' PRESENT
JRST PRSPP0 ;YES--JUST USE IT
PRSPP1: MOVE T1,-2(P) ;GET PROMPT
PUSHJ P,ICONM ;START THE LINE
MOVEI T1,[ASCIZ / (/] ;START OF OPTIONS LIST
PUSHJ P,CONMES## ;PRINT TEXT
SETO P2, ;IN CASE NO KEYWORD LIST
SKIPE P1,(P) ;HAVE A KEYWORD LIST?
PUSHJ P,OPTKEY ;YES--PUT OUT A LIST OF OPTIONS
MOVEI T1,[ASCIZ /,/] ;SEPARATOR
AOSE P2 ;FIRST KEYWORD?
PUSHJ P,CONMES## ;NO--PRINT SEPARATOR
MOVEI T1,[ASCIZ /[p,pn])/]
PUSHJ P,CONMES## ;LAST ALTERNATIVE
SKIPN -1(P) ;HAVE SOME KIND OF DEFAULT?
JRST PRSPP2 ;NO
MOVEI T1,[ASCIZ / [/]
PUSHJ P,CONMES## ;PRINT BRACKET
MOVE T1,-1(P) ;GET DEFAULT
MOVE T2,T1 ;MAKE A COPY
TLC T2,-1 ;WANT TO TEST FOR -1
TLCE T2,-1 ;WAS IT (AND NOW AGAIN)?
SKIPL T2 ;NO--OTHER NEGATIVE IS SIXBIT
SKIPA T3,[PRTPPN##] ;YES--TYPE AS A PPN
MOVEI T3,PRNAME## ;HERE FOR SIXBIT TYPEOUT FROM WRONG REGISTER
PUSH P,T3 ;SAVE FORMAT ROUTINE FOR RE-USE
PUSHJ P,(T3) ;PRINT SOMETHING
MOVEI T3,DEFTYO ;TYPEOUT ROUTINE TO USE FOR DEFAULT TEXT
EXCH T3,.CPTOA## ;SET IT UP AND GET OLD
EXCH T3,(P) ;SAVE AND RESTORE FORMAT ROUTINE
MOVE T1,DEFSP ;INITIAL STRING POINTER
MOVEM T1,DEFPTR ;START STUFFING INTO BEGINNING OF DEFAULT BUFFER
MOVE T1,-2(P) ;GET DEFAULT VALUE BACK
PUSHJ P,(T3) ;STORE IT IN THE BUFFER
MOVEI T1,[ASCIZ / ;Operator did not answer/]
PUSHJ P,DEFTXT ;APPEND THE USUAL NOTICE ABOUT DEFAULTING
MOVE T1,DEFSP ;INITIAL POINTER AGAIN
MOVEM T1,DEFPTR ;RESET FOR PARSING
POP P,.CPTOA## ;RESTORE TYPEOUT ADDRESS
MOVEI T1,[ASCIZ /]/]
PUSHJ P,CONMES## ;PRINT BRACKET
PRSPP2: MOVEI T1,[ASCIZ /: /]
PUSHJ P,CONMES## ;PRINT COLON
PUSHJ P,OPOUT ;FORCE OUTPUT
PUSHJ P,GETLIN ;GET OPERATOR'S RESPONSE
JRST PRSPP5 ;GO DEFAULT THE ANSWER
PRSPP0: PUSHJ P,ALTM ;BACK TO STARTUP OPTION IF ALTMODE TYPED
PUSHJ P,SIXIN ;FIRST TRY FOR A KEYWORD
JRST PRSPP5 ;GO DEFAULT THE ANSWER
SKIPA ;TRY FOR A PPN INSTEAD
JRST PRSPP4 ;GO CHECKOUT THE KEYWORD
PUSHJ P,GTPPN ;TRY TO READ A PPN
PRSPP3: SKIPA T1,[[ASCIZ /% Bad response, try again/]]
JRST PRSPP6 ;GO FINISH UP
PUSHJ P,CONOUT ;PRINT THE MESSAGE
JRST PRSPP1 ;TRY AGAIN
PRSPP4: MOVE T1,(P) ;AND GET AOBJN POINTER TO TABLE
PUSHJ P,FNDNAM## ;NOW LOOKUP NAME IN TABLE
JRST PRSPP3 ;NO MATCH
JRST PRSPP6 ;GO FINISH UP
PRSPP5: PUSHJ P,ALTM ;BACK TO STARTUP OPTION IF ALTMODE TYPED
MOVE T2,-1(P) ;GET DEFAULT ANSWER
HLRZ T1,T2 ;ISOLATE LH OF ANSWER
CAIE T1,-1 ;IF NOT [*,...]
JUMPL T2,PRSPP4 ;THEN IT HAD BETTER BE SIXBIT IN THE KEYS LIST
MOVE T1,T2 ;PPN--PUT IN RIGHT REGISTER
PRSPP6: POP P,T3 ;RESTORE T3
POP P,T2 ;RESTORE T2
POP P,(P) ;PHASE STACK
POPJ P, ;RETURN WITH RESULT IN T1
GTPPN: CAIE T3,"[" ;BEGINNING OF PPN
POPJ P, ;NOT THERE
PUSHJ P,GETOCT ;GET THE FIRST OCTAL NUMBER
JUMPE T2,CPOPJ## ;NULL PROJECT NUMBER IS BAD
TLNN T2,777777 ;TOO BIG?
CAIE T3,"," ;OR A BAD P,PN SEPARATER
POPJ P, ;YEP
PUSH P,T2 ;SAVE IT
PUSHJ P,GETOCT ;GET THE PROGRAMMER NUMBER
POP P,T1 ;GET PROJECT NUMBER BACK
JUMPE T2,CPOPJ## ;NULL PROGRAMMER NUMBER IS BAD
CAIE T3,"]" ;CHECK FOR LEGAL TERMINATER
CAIN T3,0 ;CRLF IS OK TOO
TLNE T2,777777 ;TOO BIG?
POPJ P, ;YEP
HRL T1,T2 ;GET PROGRAMMER NUMBER
MOVSS T1 ;SET IT UP AS [PROJ,PROG]
AOS (P) ;GIVE A SKIP
POPJ P, ;AND RETURN
GETOCT: MOVEI T2,777777 ;ASSUME WILD
PUSHJ P,COMTYS## ;GET NEXT CHARACTER
CAIE T3,"*" ;WILD?
TDZA T2,T2 ;NO - CLEAR RESULT
GETOC1: PUSHJ P,COMTYS## ;GET NEXT CHARACTER
CAIL T3,"0" ;IN RANGE?
CAILE T3,"7"
POPJ P,
LSH T2,3 ;CLEAR NULL DIGIT
SUBI T3,"0" ;CONVERT TO BINARY
ADDI T2,(T3) ;ADD TO TOTAL
JRST GETOC1 ;LOOP UNTIL DONE
;OCTAL
PRSOCT::PUSHJ P,SAVE2## ;SAVE P1 AND P2
MOVEI P1,PRTDI8## ;TYPEOUT ROUTINE
MOVEI P2,OCTIN## ;TYPEIN ROUTINE
PJRST PRSANS ;ENTER COMMON CODE
;DECIMAL
PRSDEC::PUSHJ P,SAVE2## ;SAVE P1 AND P2
MOVEI P1,RADX10## ;TYPEOUT ROUTINE
MOVEI P2,DECIN## ;TYPEIN ROUTINE
PJRST PRSANS ;ENTER COMMON CODE
;SIXBIT
PRSSIX::PUSHJ P,SAVE2## ;SAVE P1 AND P2
MOVEI P1,SIXOUT ;TYPEOUT ROUTINE
MOVEI P2,SIXIN ;TYPEIN ROUTINE
SETZB T3,T4 ;NO RANGE
PJRST PRSANS ;ENTER COMMON CODE
;YES/NO
PRSYN0: POP P,T1 ;RESTORE POINTER TO QUESTION
PRSYNQ::PUSH P,T1 ;SAVE POINTER TO QUESTION
SETZM ONCTCH ;DEFEAT PRSCON
MOVE T3,[-2,,[SIXBIT /NO YES /]] ;AOBJN POINTER TO TABLE
PUSHJ P,PRSKEY ;PARSE KEYWORD
JRST PRSYN0 ;HMMMMM, LET'S TRY AGAIN
POP P,(P) ;REPHASE STACK
POPJ P, ;RETURN
SIXIN: PUSHJ P,CTEXT## ;READ SIXBIT QUANTITY
SKIPE T1,T2 ;GET RESULT
AOS (P) ;NO RESPONSE
AOS (P) ;NOT SIXBIT
POPJ P, ;RETURN
SIXOUT: MOVE T2,T1 ;GET QUANTITY
PJRST PRNAME## ;PRINT AND RETURN
PRSANS: PUSH P,T1 ;SAVE PROMPT STRING
PUSH P,T2 ;SAVE DEFAULT ANSWER
PUSH P,T3 ;SAVE LOW RANGE
PUSH P,T4 ;SAVE HIGH RANGE
PUSHJ P,PRSCON ;SEE IF MORE ON SAME LINE
JRST PRSAN0 ;YES--JUST GO USE THE TEXT
PRSAN1: MOVE T1,-3(P) ;GET PROMPT
PUSHJ P,ICONM ;START THE LINE
SKIPN (P) ;ANY RANGE RESTRICTIONS?
JRST PRSAN2 ;NO
MOVEI T1,[ASCIZ / (/]
PUSHJ P,CONMES## ;START OF RANGE
MOVE T1,-1(P) ;GET LOW NUMBER
PUSHJ P,(P1) ;PRINT IT
MOVEI T1,[ASCIZ / - /]
PUSHJ P,CONMES## ;PRINT SEPARATOR
MOVE T1,(P) ;GET HIGH NUMBER
PUSHJ P,(P1) ;PRINT IT
MOVEI T1,[ASCIZ /)/]
PUSHJ P,CONMES## ;END OF NUMBER
PRSAN2: MOVE T1,-2(P) ;GET DEFAULT
CAIN P2,SIXIN ;SIXBIT?
JUMPE T1,PRSAN3 ;THEN NOT DEFAULTING
MOVEI T1,[ASCIZ / [/]
PUSHJ P,CONMES## ;PRINT BRACKET
MOVE T1,-2(P) ;GET DEFAULT ANSWER
PUSHJ P,(P1) ;PRINT IT
PUSH P,.CPTOA## ;SAVE OUTPUT ADDRESS
MOVEI T1,DEFTYO ;TYPEOUT ROUTINE TO STORE DEFAULT TEXT
MOVEM T1,.CPTOA## ;SET IT UP
MOVE T1,DEFSP ;INITIAL STRING POINTER
MOVEM T1,DEFPTR ;SETUP FOR DEFAULTING
MOVE T1,-3(P) ;GET DEFAULT ANSWER AGAIN
PUSHJ P,(P1) ;STUFF IT INTO THE DEFAULT BUFFER
MOVEI T1,[ASCIZ / ;Operator did not answer/]
PUSHJ P,DEFTXT ;APPEND SOME ADDITIONAL TEXT
MOVE T1,DEFSP ;INITIAL STRING POINTER AGAIN
MOVEM T1,DEFPTR ;RESET FOR PARSING
POP P,.CPTOA## ;RESTORE TYPEOUT ADDRESS
MOVEI T1,[ASCIZ /]/]
PUSHJ P,CONMES## ;PRINT BRACKET
PRSAN3: MOVEI T1,[ASCIZ /: /]
PUSHJ P,CONMES## ;PRINT COLON
PUSHJ P,OPOUT ;FORCE OUTPUT
PUSHJ P,GETLIN ;GET OPERATOR'S RESPONSE
JRST [MOVE T1,-2(P) ;PICK UP DEFAULT
JRST PRSAN4] ;AND CONTINUE
PRSAN0: PUSHJ P,ALTM ;BACK TO STARTUP OPTION IF ALTMODE TYPED
PUSHJ P,(P2) ;GET ANSWER
JRST PRSAN5 ;BAD RESPONSE
JRST PRSAN5 ;BAD RESPONSE
MOVE T1,T2 ;POSITION RETURN VALUE PROPERLY
PRSAN4: PUSHJ P,ALTM ;BACK TO STARTUP OPTION IF ALTMODE TYPED
SKIPN -1(P) ;RANGE
SKIPE (P) ; CHECKING?
TRNA ;YES--DO THE TESTS
JRST PRSAN6 ;SKIP TESTS
CAML T1,-1(P) ;RANGE
CAMLE T1,(P) ; CHECK
SKIPA ;NO GOOD
JRST PRSAN6 ;FINISH UP
PRSAN5: MOVEI T1,[ASCIZ /% Bad response, try again/]
PUSHJ P,CONOUT ;PRINT THE MESSAGE
JRST PRSAN1 ;LOOP BACK
PRSAN6: POP P,T4 ;RESTORE T4
POP P,T3 ;RESTORE T3
POP P,T2 ;RESTORE T2
POP P,(P) ;PHASE STACK
POPJ P, ;RETURN WITH RESULT IN T1
SUBTTL EXIT FROM STARTUP OPTION
;HERE ON EXIT FROM STARTUP OPTION
PVQCK:: SKIPE .UONCE## ;IF THIS IS USER-MODE, THEN "GO" IS QUIT
CALLI 12 ;EXIT
SETZM .CPJOB## ;CLEAR CURRENT JOB
IFE FTMP,<SETOM .CPOK##> ;MAKE THE ONE AND ONLY LOOK ALIVE
SUBTTL SORT DDB CHAIN AND SET UP GENERIC DEVICE TABLE
;WE MUST NOW SORT ALL DDB'S SO THAT ALL DDB'S OF A GIVEN DEVICE CLASS
; (DTA, LPT, CDR, ...) ARE CONTIGUOUS ON THE CHAIN. THEN, WE SET UP
; THE GENERIC DEVICE TABLE TO POINT TO THE 1ST DDB IN EACH SUCH DEVICE
; CLASS. THIS WILL SPEED UP THE GENERIC SEARCH
HLRZ F,DEVLST## ;GET START OF CHAIN
GNSRC1: MOVE T1,GENPTR## ;AOBJN POINTER TO GENTAB
GNSRC2: MOVE T2,GENTAB##(T1) ;GET DEVICE NAME FROM TABLE (IN RH)
HLRZ T3,DEVNAM(F) ; AND NAME FROM DDB
CAIE T2,(T3) ;FOUND DEVICE IN TABLE?
JRST GNSRC3 ;NO, CONTINUE THE SEARCH
HRRZ T2,GENTAB##+1(T1) ;YES, GET THE DDB ADDRESS
JUMPN T2,GNSRC4 ;IF ALREADY SET UP, EXIT
HRRM F,GENTAB##+1(T1) ;NO, PUT DDB ADDRESS IN TABLE
JRST GNSRC4 ;LEAVE THIS SEARCH ROUTINE
GNSRC3: AOBJN T1,.+1 ;ACCOUNT FOR TWO WORD ENTRIES
AOBJN T1,GNSRC2 ;LOOP THROUGH THE TABLE
JRST GNSRC7 ;NOT FOUND IN GENTAB - TRY NEXT DDB
;FROM HERE ON, WE MUST SORT ALL DDB'S ACCORDING TO DEVICE TYPES
;AC USAGE:
; F = CURRENT DDB
; T1 = PTR TO "LAST" DDB IN DEVICE GROUP
; T2 = MOVING PTR WITHIN DEVICE GROUP
GNSRC4: MOVE T2,F ;INIT MOVING PTR
GNSRC5: MOVE T1,T2 ;INIT "LAST" DDB IN DEVICE GROUP
HLRZ T2,DEVSER(T2) ;GET NEXT DDB
JUMPE T2,GNSRC8 ;END OF CHAIN, WE'RE THRU
HLRZ T3,DEVNAM(F) ;GET DEVICE NAME OF CURRENT DDB
HLRZ T4,DEVNAM(T2) ; AND OF THIS DDB
CAMN T3,T4 ;SAME DEVICE?
JRST GNSRC5 ;YES, GO UNTIL WE GET OUT OF DEVICE GOURP
GNSRC6: MOVE P3,T2 ;SAVE THIS ADDRESS
HLRZ T2,DEVSER(T2) ;NOW, WE START SEARCH TO FIND ANOTHER
JUMPE T2,GNSRC8 ;..DEVICE IN THIS GROUP
HLRZ T3,DEVNAM(F) ;FETCH NAME AGAIN
HLRZ T4,DEVNAM(T2) ;AND NEW NAME
CAME T3,T4 ;IS THIS DDB OUT OF ORDER?
JRST GNSRC6 ;NO
;WE HAVE NOW FOUND A DDB WHICH IS NOT CONTIGUOUS WITH OTHER DDB'S
; OF ITS DEVICE GROUP. WE MUST RE-LINK THEM SO THAT IT BECOMES
; CONTIGUOUS.
HLRZ T3,DEVSER(T2) ;GET NEXT DDB PTR
HRLM T3,DEVSER(P3) ;REMOVE THIS DDB FROM CHAIN
HLRZ T3,DEVSER(T1) ;GET NEXT PTR FROM "LAST" DDB IN GROUP
HRLM T3,DEVSER(T2) ;MAKE US POINT TO NEXT DDB
HRLM T2,DEVSER(T1) ;MAKE LAST DDB POINT TO US
MOVE T1,T2 ;CONTINUE SEARCH
JRST GNSRC6
GNSRC7: MOVE T1,F ;NOT IN GENTAB, TRY NEXT DDB
GNSRC8: HLRZ F,DEVSER(T1) ;GO TO NEXT DDB AFTER THIS GROUP
JUMPN F,GNSRC1 ;CONTINUE SEARCH IF MORE
;ALL DDB'S ARE SORTED, FALL THROUGH TO NEXT PAGE
SUBTTL SWPSER/QUESER INITIALIZATION
SETZ J, ;CLEAR J TO SET UP A PDB FOR THE NULL JOB
PUSHJ P,CREPDB## ;ALLOCATE A PDB
STOPCD .,STOP,CCPNUL, ;++CAN'T CREATE PDB FOR NULL JOB
PUSHJ P,SWPINI ;INIT SWAPPING SPACE ALLOCATION
PUSHJ P,ENQINI## ;INITIALIZE ENQ/DEQ
IFN FTKL10,<
MOVE T1,SYSSIZ## ;HIGHEST ADDRESS IN THE LOW SEGMENT
LSH T1,W2PLSH ;HIGHEST PAGE
MOVE T2,.CPKPM## ;KEEP ME BIT OR 0
MOVE T3,.CPMAP## ;ADDRESS OF THIS CPU'S MAP
IORM T2,(T3) ;TURN ON "KEEP ME" IF THIS CPU HAS AN MCA25
AOS T3 ;NEXT PAGE
SOJG T1,.-2 ;FOR ALL LOW SEGMENT PAGES
>; END IFN FTKL10
PUSHJ P,SCDINI## ;INITIALIZE SCHEDULER
SUBTTL INITIALIZE ALL I/O DEVICES
IFN FTKL10,<PIBITS==PI.CPI!PI.TFP!PI.OFF!LI.ACO!LI.CPP> ;KL10 PI BITS
IFN FTKS10,<PIBITS==PI.CPI!PI.TFP!PI.OFF!SI.ACO!SI.CPP> ;KS10 PI BITS
IOGO: CONO PI,PIBITS ;CLEAR PI SYSTEM (AND MEM PARITY)
IFN FTKL10,<
CONO APR,LP.CSF!LP.PAR ;CLEAR PARITY ERROR
>; END IFN FTKL10
IFN FTKS10,<
WRAPR SP.DSF!SP.CSF!SP.HMP!SP.SMP!SP.NXM ;CLEAR PARITY/NXM ERROR
>; END IFN FTKS10
CONO APR,APRNUL## ;SET UP THE APR (DON'T DO I/O RESET)
HRRZS .CPMPC## ;CLEAR SERIOUS PARITY ERROR FLAG WHICH
; CAUSES HALT AFTER CTY PRINTING
;CALL DEVICE-SPECIFIC INITIALIZATION ROUTINE FOR EACH DEVICE
IOGO1: HLRZ P3,DEVLST## ;ADDR OF FIRST DDB
SETZB S,SAVITM
IOGO3: MOVE F,P3 ;SET UP F FOR INITIALIZATION CODE
; (NOT ALWAYS USED)
MOVE P3,DEVSER(P3)
IFN FTMP,<
LDB T1,DEYCPF## ;CPU OWNING THE DEVICE
CAIE T1,CPFBOO## ;GENERIC BOOT CPU?
CAIN T1,CPFBIT## ;FOR DUAL PORTED BEASTY?
JRST IOGO4 ;YES, THAT'S US
CAME T1,.CPCPN## ;THIS CPU?
JRST IOGO5 ;NO
IOGO4:
>; END IFN FTMP
HRRZ T1,P3
CAIE T1,@SAVITM ;SAME DEVICE
PUSHJ P,DINI(P3) ;NO. INITIALIZE IT.
HRRZM P3,SAVITM ;SKIPS IF CODE TO BE CALLED FOR EACH DEVICE
IOGO5: HLRZS P3
JUMPN P3,IOGO3 ;GO IF MORE DEVICES
SETZM DINITF## ;NO LONGER INITIALIZING
IFN FTRTTRP,<PUSHJ P,RTINI##> ;INITIALIZE PI CHANNELS AND RT DEVICES
IFN FTLOCK,<PUSHJ P,LOKINI##> ;INITIALIZATION FOR LOCK UUO
SUBTTL TIME AND ACCOUNTING INITIALIZATION
TACINI: MOVE T1,TIME## ;GET TIME OF DAY AS UPDATED DURING TTY LOOP
MOVE T2,TICSEC## ;TICS PER SECOND
LSH T2,-1 ;DIVIDE BY 2
ADD T1,T2 ;AND ROUND
IDIV T1,TICMIN## ;MINUTES IN T1, REMAINDER IN TICS
PUSH P,T2 ;SAVE REMAINDER
IDIVI T1,^D60 ;HOURS IN T1, MINUTES IN T2
MOVEM T1,LOCHOR## ;UPDATE GETTAB HOURS
MOVEM T2,LOCMIN## ;AND MINUTES
POP P,T1 ;GET BACK REMAINING TICS
IDIV T1,TICSEC## ;AND ROUND TO SECONDS
MOVEM T1,LOCSEC## ;AND STORE
SUBI T1,^D60 ;-VE SECONDS UNTIL NEXT MINUTE
MOVNM T1,.CPSEC## ;STORE POSITIVE NUMBER FOR ONCE-A-MINUTE CALLS
SUB T2,TICSEC## ;-VE TICKS UNTIL NEXT SECOND
MOVNM T2,.CPHTM## ;STORE POSITIVE FOR ONCE-A-SECOND CALLS
PUSHJ P,SUDATE## ;SET UP UNIVERSAL DATE-TIME
PUSHJ P,CHKMNT## ;CHECK IF WENT PAST MIDNIGHT
MOVE T1,TIME## ;GET UPDATED TIME OF DAY
MOVEM T1,.CPTML## ;INITIALIZE LAST TIME OF DAY
PUSHJ P,SETIME## ; TO INITILIZE GETIME
PUSHJ P,OMSTIM## ;COMPUTE TIME TO FIRST OPR MESSAGE
IFN FTKL10,<
MOVE T3,.CPAPD## ;PROCESSOR HARDWARE OPTIONS
DMOVE T1,[M.EBPS## ;ASSUME A MODEL A PROCESSOR
M.MBPS##]
TRNE T3,ID.XKL ;IS IT A MODEL B PROCESSOR?
DMOVE T1,[^D30*M.EBPS##/^D25 ;YES, USE DIFFERENT EBOX/MBOX CALABRATION CONSTANTS
^D30*M.MBPS##/^D25]
MOVEM T1,.CPEBS## ;STORE AS EBOX TICS/SEC
MOVEM T2,.CPMBS## ;STORE AS MBOX TICS/SEC
IDIV T1,TICSEC## ;AND NOW GET EBOX COUNTS/JIFFY
IMULI T1,.EBCPT ;MULITPLY BY EBOX COUNTS/TICK
MOVEM T1,.CPEBJ## ;STORE IN CDB VARIABLE
MOVE T1,.CPMBS## ;GET MBOX TICKS/SECOND
IDIV T1,TICSEC## ;GET MBOX COUNTS/JIFFY
IMULI T1,.MBCPT ;MULTIPLY BY MBOX COUNTS/TICK
MOVEM T1,.CPMBJ## ;SAVE
PUSHJ P,TIMINI ;START JIFFIES COMING
IFN FTEMRT,<
PUSHJ P,ACCMON## ;START UP ACCOUNTING METERS
PUSHJ P,CLREMB## ;CLEAR OUT E AND MBOX ACCOUNTING METERS
PUSHJ P,ABKCHK## ;CHECK & POSSIBLY SET EXEC MODE ADDRESS BREAK
>;END IFN FTEMRT
>;END IFN FTKL10
IFN FTKS10,<
PUSHJ P,TIMINI ;START JIFFIES COMING
>; END IFN FTKS10
SUBTTL INITIALIZE TABLE OF AVAILABLE EXEC VIRTUAL MEMORY
MOVE T1,EVMPTR## ;AOBJN POINTER TO EVBTAB
SETZM (T1) ;INITIALIZE TO ALL BITS OFF
AOBJN T1,.-1 ;SET EVERY WORD IN THE TABLE
MOVE T1,[-1_-<^D<512-36*<512/36>>>]
MOVEM T1,EVBTAB##+^D<512/36>
MOVE T3,SYSSIZ## ;FROM 0 THROUGH SYSSIZ
LSH T3,W2PLSH ;NUMBER OF PAGES
MOVSI T4,^D36 ;STARTING AT PAGE 0
HRRI T4,EVBTAB##+0 ;WHERE IN THE TABLE
MOVEM T3,.C0EVU## ;ACCUMULATE PAGES USED
PUSHJ P,CSETOS## ;MARK THE BITS (NOT AVAILABLE FOR EVM)
MOVEI T3,HLCSAD##/PAGSIZ ;FIRST PAGE OF NON-CODE SPACE
IDIVI T3,^D36 ;WORD NUMBER AND BIT POSITION
SUBI T4,^D36
MOVNS T4 ;BIT POSITION
MOVSS T4 ;TO THE LEFT HALF
HRRI T4,EVBTAB##(T3) ;STARTING WORD WITHIN TABLE
MOVEI T3,<<1,,0>-HLCSAD##>/PAGSIZ ;NUMBER OF PAGES
ADDM T3,.C0EVU## ;ACCUMULATE PAGES USED
PUSHJ P,CSETOS## ;MARK OFF BITS REPRESENTING FS AND PP SLOTS
IFN FTXMON,<
MOVEI T3,CSBORG##/PAGSIZ ;ORIGIN OF COMMON SUBROUTINES
IDIVI T3,^D36 ;WORD NUMBER AND BIT POSITION
SUBI T4,^D36
MOVNS T4 ;MAKE AN AOBJN POINTER
MOVSS T4
HRRI T4,EVBTAB##(T3)
MOVE T3,CSBLEN## ;GET LENGTH OF COMMON SUBRTNS PSECT
TRZE T3,PG.BDY ;ROUND UP
ADDI T3,PAGSIZ
LSH T3,W2PLSH ;NUMBER OF BITS TO SET
ADDM T3,.C0EVU## ;ACCUMULATE PAGES USED
PUSHJ P,CSETOS## ;MONITOR PAGES ARE NOT AVAILABLE AS EVM
>; END IFN FTXMON
MOVEI T3,MONORG##/PAGSIZ ;ORIGIN OF HIGH SEGMENT
IDIVI T3,^D36 ;WORD NUMBER AND BIT POSITION
SUBI T4,^D36
MOVNS T4 ;MAKE AN AOBJN POINTER
MOVSS T4
HRRI T4,EVBTAB##(T3)
MOVE T3,MONVFF## ;FIRST FREE VIRTUAL LOCATION ABOVE THE MONITOR
SUBI T3,MONORG## ;MINUS START OF THE MONITOR
LSH T3,W2PLSH ;NUMBER OF BITS TO SET
ADDM T3,.C0EVU## ;ACCUMULATE PAGES USED
PUSHJ P,CSETOS## ;MONITOR PAGES ARE NOT AVAILABLE AS EVM
MOVE P1,EVMPTR## ;AOBJN POINTER TO EVM TABLE
MOVEI P2,0
MOVEI P3,-1
PUSHJ P,GETZ## ;FIND THE LARGEST CONTIGUOUS PIECE OF EVM
MOVEM P2,EVBMAX## ;STORE THAT AS THE LARGEST IOWD SIZE
MOVEI T1,^D512 ;MAXIMUM SIZE OF EVM
SUB T1,.C0EVU## ;MINUS AMOUNT USED BY MONITOR
MOVEM T1,.C0EVM## ;NUMBER OF PAGES AVAILABLE FOR LOCKING IN EVM
SETZM .C0EVU## ;NUMBER OF PAGES IN USE FOR LOCKING IN EVM
SUBTTL MISCELLANEOUS INITIALIZATION
IFN FTKL10,<
PUSHJ P,GIVPMR## ;INITIALIZE PERFORMANCE METER
SETOM .CPPTF## ;INITIALIZE FLAG WHICH ALLOWS IO PAGE TABLE
>; END IFN FTKL10
PUSHJ P,WRTLOK ;WRITE LOCK CODE SEGMENTS
IFE FTXMON,<
JRSTF @[EXP IC.UOU+.+1] ;LIGHT USER IOT IN THE PC
>; END IFE FTXMON
IFN FTXMON,<
XJRSTF [IC.UOU
0,,.+1] ;SAME BUT ENTER SECTION 0
>; END IFN FTXMON
MOVEI T1,0 ;USER APR ENABLE BITS
PUSHJ P,SETCNA## ;SETUP APR ENABLE BITS AND CONSO MASK
EXECAC ;MAKE SURE AC BLOCKS ARE OK
IFN FTKL10,<
PUSHJ P,SETCSH## ;SET CACHE STRATEGY AS ESTABLISHED BY KLI
CONO APR,LP.CSF+LP.CSD ;CLEAR CACHE SWEEP DONE
SWPUA ;SWEEP CACHE, UNLOAD ALL
CONSO APR,LP.CSD ;WAIT UNTIL COMPLETED
JRST .-1
CONO APR,LP.CSF+LP.CSD ;CLEAR CACHE SWEEP DONE
CONO PAG,@.CPEBR## ;ENABLE CACHE IF DESIRED
>; END IFN FTKL10
IFN FTKS10,<
WREBR @.CPEBR##
PUSHJ P,ENAKAL## ;ENABLE KEEP-ALIVE COUNTING
>; END IFN FTKS10
SETZM .USPFW ;CLEAR NULL JOB'S PAGE FAIL WORD
SUBTTL NETWORK INITIALIZATION
IFN FTKS10,<PUSHJ P,KDPONC##> ;GO INIT THE KMC/DUP LINES
IFN FTNET,<
ANFSTR: PUSHJ P,NETINI## ;INITIALIZE ANF-10
>; END IFN FTNET
FEKSTR:
IFN FTENET,<PUSHJ P,D8EINI##> ;INITIALIZE ANF/ETHERNET FEK SERVICE
MOVEI J,FEKFST## ;GET THE ADDR OF FIRST FEK (0 IF NONE)
JRST FEKST2 ;ENTER FEK "ONCE ONLY" LOOP
FEKST1: MOVEI T1,FF.ONC ;GET THE "ONCE ONLY" FUNCTION CODE
XCT FEKDSP(J) ;CALL THE "DISPATCH ROUTINE"
HRRZ J,FEKBLK(J) ;STEP TO THE NEXT FEK
FEKST2: JUMPN J,FEKST1 ;IF NO MORE FEKS, GO CONTINUE SYSINI
IFN FTDECNET,<
D36STR: PUSHJ P,D36INI## ;INITIALIZE DECNET
>; END IFN FTDECNET
IFN FTENET,<
LATSTR: PUSHJ P,LATINI## ;INITIALIZE LAT TERMINAL SERVICE
IFN FTKL10,<
LLMSTR: PUSHJ P,LLMINI## ;INITIALIZE LLMOP
>; END IFN FTKL10
>; END IFN FTENET
IFN FTKS10,<PUSHJ P,DMRONC##> ;INITIALIZE THE DMR11 LINES
SUBTTL FINAL CPU AND DEVICE INITIALIZATION
CONO APR,APRNUL## ;CLEAR ALL APR ERRORS (DO NOT DO RESET)
CONO PI,PI.CPI!PI.TNP!PI.ON!II.ACO!IFN FTKL10,<PI.EPE> ;TURN ON ALL PI CHANNELS (ENABLE MEM PARITY)
IFN FTKL10,<PUSHJ P,STAPPC##> ;INITIALIZE PRIMARY PROTOCOL
IFN FTMP,<PUSHJ P,BECOM1##> ;ESTABLISH "CTY" ON BOOT PROCESSOR
MOVEI T1,.ERWHY ;MONITOR RELOAD CODE
PUSHJ P,DAERPT## ;TELL DAEMON MONITOR WAS RELOADED
PUSHJ P,CTXINI## ;COMPUTE SYSTEM CONTEXT QUOTAS BASED ON
; THE NUMBER OF JOBS AND THE AMOUNT OF
; SWAPPING SPACE AVAILABLE
PUSHJ P,FRCCPY## ;COPY ANY CRASHES
MOVEI T1,DF.BPT ;GET MASK OF ALL CPU BREAKPOINT ENABLE BITS
MOVEI T2,JS.BPT ;GET THE "SET EDDT BREAKPOINT" ON BIT
TDNE T1,DEBUGF## ;ANY CPUS SET TO BREAKPOINT?
IORM T2,JBTSTS##+0 ;YES--ALLOW ^D TO DO IT'S THING
PUSHJ P,CSHINI## ;INIT MONITOR DISK CACHE
MOVSI T1,(CAI) ;SETUP NO-OP IN CASE NO EDDT
NODDT: HLLM T1,SYSDDT## ;TURN 401 INTO A CAI UNLESS EDDT STILL AROUND
MOVE T1,[<PM.DCD>B2+PM.WRT+PM.PUB+<DOORBL##/PAGSIZ>] ;STORE MAPPING
MOVEM T1,NLUPMP##(T1) ; FOR DOORBELL
MOVE 17,[SYSINH,,2] ;BLT REMAINDER OF INITIALIZATION CODE INTO ACS
BLT 17,7
MOVE 0,[NUPPPM##,,NUPPPM##+1] ;SET UP BLT WORD IN AC 0
JRST 2 ;FINISH UP
SYSINH: SETZM NUPPPM## ;(2) ZERO PER-PROCESS MAPPING IN NULL JOB'S MAP
BLT 0,NLUPMP##+.UMUPM-1 ;(3)
CLRPGT ;(4) FLUSH OLD MAPPING
IFN FTMP,<
MOVEI 0,1 ;(5)
MOVEM 0,ONCCOM## ;(6) TELL ALL CPUS TO START
>; END IFN FTMP
SJSP U,NULJB1## ;(7) START THE NULL JOB (U NON-ZERO)
IFE FTMP,<EXP 0,0> ;PAD OUT THE BLOCK
SUBTTL MULTI-CPU I/O PROCESSING
IFN FTMP,<
; UDBS
CPUUNI::DMOVEM T1,CPUACS+T1 ;SAVE TEMPS
DMOVEM T3,CPUACS+T3 ;...
MOVE T1,UDBCAM(U) ;GET TARGET CPU NUMBER
PUSHJ P,CAMCPU## ;DETERMINE CPU NUMBER TO USE
DMOVE T2,CPUACS+T2 ;GET TEMPS BACK
MOVE T4,CPUACS+T4 ;...
CPUCPN::! ;CPU NUMBER ALREADY IN T1
CPUXCT: SKIPN .UONCE## ;IF TWICE, NO OTHER CPU TO WORRY ABOUT
CAMN T1,.CPCPN## ;IS IT US?
JRST CPUXC4 ;GO HANDLE REQUEST ON OUR CPU
PUSH P,T2 ;SAVE T2 A SEC
MOVEI T2,1 ;GET ASYNCH IO PENDING BIT FOR CPU0
LSH T2,(T1) ;POSITION IT FOR A TEST OF TARGET CPU
;THE PARANOID MIGHT WANT TO CPUTIM-OUT THIS LOOP...
TDNE T2,CPUASF ;SEE IF STILL PROCESSING A PREVIOUS COMMAND
JRST .-1 ; ON THIS CPU. WAIT TILL DONE IF SO.
IORM T2,CPUASF ;REMEMBER THAT IT IS NOW BUSY
POP P,T2 ;RESTORE T2
MOVEM T1,CPUNUM ;SAVE TARGET CPU NUMBER
SETZM CPUFLG ;INITIALLY SET FAILURE FLAG
MOVE T1,CPUACS+T1 ;RESET T1 SO BLT DOESN'T CLOBBER SAVED COPY
MOVEM 0,CPUACS+0 ;SAVE AC 0
MOVE 0,[1,,CPUACS+1] ;SET UP BLT
BLT 0,CPUACS+17 ;SAVE THE ACS
MOVE 0,CPUACS+0 ;RELOAD AC 0
XMOVEI T1,@(P) ;GET ADDRESS OF SUBROUTINE
MOVE T2,CPUNUM ;GET TARGET CPU NUMBER
MOVE T3,@T1 ;GET SUBROUTINE TO EXECUTE (WITH FLAGS)
MOVEM T3,CPUSUB ;SAVE IT'S ADDRESS
POP P,(P) ;PRUNE STACK
MOVEM P,CPUACS+P ;UPDATE PUSH DOWN LIST POINTER
MOVE T1,CPUTMS ;TIME TO WAIT FOR CPU TO START PROCESSING
TLNN T3,(XC.LNG) ;LONG WAIT?
LSH T1,-2 ;NO, WAIT ONE FOURTH OF THE USUAL TIME
MOVE P1,T2 ;CPU INDEX
IMULI P1,.CPLEN## ;POINT TO THE TARGET CPU'S CDB
HLLOS ONCCOM## ;MARK REQUEST QUEUED
CPUXC1: SKIPE CRSHWD ;RELOADING SYSTEM BECAUSE OF STOPCD?
PJRST REBOOT## ;YES
TRNN T1,17 ;EVERY 20 TIMES THROUGH THIS
AOS .C0OK##(P1) ;BUMP CPU'S OK WORD SO IT WILL WAKE UP
SKIPE ONCCOM## ;HAS THE OTHER CPU STARTED PROCESSING YET?
SOJG T1,CPUXC1 ;NO--WAIT
MOVE T2,CPUSUB ;GET ADDRESS OF ROUTINE BEING CALLED
TLNE T2,(XC.ASY) ;WAS THIS AN ASYNCHRONOUS REQUEST?
JRST [JUMPN T1,CPUXC3 ;YES, JUMP IF CPU STARTED REQUEST
MOVE T1,.C0CPN##(P1) ;ASYNCH REQUEST DIDN'T START, CPU #
PUSHJ P,CPUDSB ;CLEAR I/O PENDING FOR NEXT REQUEST
JRST CPUXC3] ;AND EXIT
MOVE P2,T1 ;SYNCHRONOUS I/O, SAVE RESPONSE TIME
MOVE T1,.C0CPN##(P1) ;GET CPU NUMBER OF TARGET CPU
PUSHJ P,CPUDSB ;CLEAR I/O PENDING BIT
JUMPE P2,CPUXC3 ;NO RESPONSE
MOVE T1,CPUTIM ;GET CPU HUNG TIMER
MOVE T2,CPUSUB ;GET FLAGS
TLNN T2,(XC.LNG) ;LONG WAIT?
LSH T1,-2 ;NO, WAIT ONE FOURTH OF THE USUAL TIME
CPUXC2: SKIPE CRSHWD ;RELOADING SYSTEM BECAUSE OF STOPCD?
PJRST REBOOT## ;YES
SKIPL ONCCOM## ;REQUEST COMPLETED YET?
SOJG T1,CPUXC2 ;NO--WAIT
CPUXC3: SETZM ONCCOM## ;TELL OTHER CPUS TO LOOP IN THE ACS
MOVEM P,CPUACS+P ;SO BLT DOESN'T WIPE P
MOVSI 17,CPUACS ;SET UP BLT
BLT 17,17 ;RESTORE THE ACS
SKIPE CPUFLG ;SUCESS?
AOS (P) ;YES
POPJ P, ;PROPAGATE CPOPJ/CPOPJ1 BACK TO CALLER
CPUXC4: XMOVEI T1,@(P) ;GET ADDRESS OF SUBROUTINE
MOVE T1,@T1 ;GET SUBROUTINE TO EXECUTE
TLZ T1,-1 ;CLEAR FLAGS
MOVEM T1,CPUSUB ;SAVE IT'S ADDRESS
POP P,(P) ;TRIM STACK
MOVE T1,CPUACS+T1 ;RELOAD T1
PUSHJ P,@CPUSUB ;DO CPU DEPENDANT STUFF
POPJ P, ;FAILED
JRST CPOPJ1## ;RETURN
; STILL UNDER IFN FTMP
CPUDSP::MOVE T1,.CPCPN## ;GET OUR CPU NUMBER
CAME T1,CPUNUM ;SANITY CHECK
POPJ P, ;REQUEST IS FOR SOMEONE ELSE
MOVEM P,CPUACS+P ;SO BLT DOESN'T WIPE P
MOVSI 17,CPUACS ;SET UP BLT
BLT 17,17 ;LOAD OUR ACS
PUSH P,CPUSUB ;SAVE ROUTINE ADDRESS AND FLAGS
SETZM ONCCOM## ;START PROCESSING REQUEST
EXCH T1,(P) ;GET ROUTINE ADDRESS AND FLAGS
TLNE T1,(XC.ASY) ;SEE IF ASYNCHRNOUS IO
JRST CPUDSA ;IF SO, DO DIFFERENTLY
TLZ T1,-1 ;CLEAR FLAGS
EXCH T1,(P) ;PUT ROUTINE ADDRESS BACK - WITHOUT FLAGS
PUSHJ P,@(P) ;DO SOMETHING
SKIPA ;FAILURE
SETOM CPUFLG ;INDICATE SUCESS
ADJSP P,-1 ;TOSS ROUTINE ADDRESS
MOVEM 0,CPUACS+0 ;SAVE AC 0
MOVE 0,[1,,CPUACS+1] ;SET UP BLT
BLT 0,CPUACS+17 ;SAVE THE UPDATED ACS
SETOM ONCCOM## ;REQUEST COMPLETED
POPJ P, ;RETURN
;HERE IF REQUEST IS ASYNCHRONOUS
CPUDSA: TLZ T1,-1 ;CLEAR FLAGS
EXCH T1,(P) ;GET T1 BACK, SAVE ADDRESS WITHOUT FLAGS
PUSHJ P,@(P) ;DO WHATEVER WE DO
JFCL ;ASYNCHRONOUS I/O DOESN'T EXACTLY SKIP...
ADJSP P,-1 ;CLEAN SUBROUTINE ADDRESS OFF STACK
MOVE T1,.CPCPN## ;NOR DOES IT RETURN ACS. GET CPU NUMBER
CPUDSB: MOVEI T2,1 ;GET ASYNCHRONOUS IO BUSY BIT FOR CPU 0
LSH T2,(T1) ;POSITION IT FOR THIS CPU
ANDCAM T2,CPUASF ;CLEAR IO IN PROGRESS BIT
POPJ P, ;RETURN
> ;END IFN FTMP
SUBTTL GET DATE/TIME FROM ANY FE WILLING TO TALK
;ROUTINE TO ASK FRONT ENDS FOR DATE/TIME. RETURNS CPOPJ IF NONE
;KNOW THE DATE/TIME, CPOPJ1 IF ONE DOES.
GFETIM: PUSHJ P,SAVE1## ;SAVE AN AC
MOVSI P1,-M.CPU## ;TRY ALL CPUS
GFETM1: HRRZ T1,P1 ;SET UP CPU NUMBER
XCTCPU (CPN,SPCGDT##) ;ASK FE FOR DATE/TIME (DTESER/KSSER)
CAIA ;THIS CPU CAN'T HELP
JRST CPOPJ1## ;LOCxxx NOW MATCH FE
AOBJN P1,GFETM1 ;TRY NEXT POSSIBLE CPU
POPJ P, ;NONE WERE HELPFUL, RETURN FAILURE
SUBTTL SET UP NXMTAB
SUNXMT: PUSH P,P1 ;SAVE WORKING ACS
PUSH P,P2
SETZB T4,NXMTAB## ;ZERO HIGHEST EXISTANT ADDRESS SEEN, AND NXMTAB
MOVE T1,[NXMTAB##,,NXMTAB##+1]
MOVEI T2,NXMTAB## ; ..
BLT T1,NXMTBL##-1(T2)
MOVEI P1,CORBLK## ;NUMBER OF PAGES OF CORE POSSIBLE
MOVE T2,[POINT 1,NXMTAB##]
MOVEI T3,1 ;TO MARK A PAGE AS NON-EXISTANT
SETZ U, ;START LOOKING FOR NXM AT ADDRESS 0
SUNXM1: CONO APR,AP.NXE## ;CLEAR NXM FLAG
IBP T2 ;NEXT BYTE IN NXMTAB
MOVEI P2,MEMITL## ;NUMBER OF WAYS THE MEMORY CAN BE INTERLEAVED
SUNXM2: PUSH P,U ;SAVE THE CURRENT ADDRESS
ADDI U,-1(P2) ;CHECK PAGE PLUS INTERLEAVE OFFSET
PUSHJ P,REFMEM## ;REFERENCE TIS ADDRESS
POP P,U ;RESTORE THE CURRENT ADDRESS
SOJG P2,SUNXM2 ;LOOK AT NEXT ADDRESS WITHIN THIS PAGE
CONSO APR,AP.NXM## ;NON-EXISTANT MEMORY SEEN?
JRST SUNXM3 ;NO
DPB T3,T2 ;YES, MARK THE PAGE AS NON-EXISTANT
JUMPN T4,SUNXM4 ;JUMP IF THE LAST PAGE LOOKED AT WAS NXM
SKIPA T4,U ;NOT SO, SO REMEMBER THE ADDRESS OF HIGHEST
; EXISTANT PAGE SEEN SO FAR
SUNXM3: MOVEI T4,0 ;MEMORY EXISTS, HAVEN'T SEEN THE HIGHEST EXISTANT PAGE YET
SUNXM4: ADDI U,PAGSIZ ;GO ON TO THE NEXT PAGE OF MEMORY
SOJG P1,SUNXM1 ; PROVIDED ALL POSSIBLE MEMORY HASN'T BEEN CHECKED
SUNXM5: IDPB T3,T2 ;ONES TO THE END OF THIS WORD IN NXMTAB
TLNE T2,770000 ; ..
JRST SUNXM5 ; ..
SKIPN T4 ;SKIP IF THE HIGHEST POSSIBLE PAGE OF MEMORY DIDNT EXIST
MOVE T4,U ;IT DID, SO U CONTAINS THE ADDRESS OF THE HIGHEST PAGE
POP P,P2 ;RESTORE ACS
POP P,P1
POPJ P,
SUBTTL ONCE-ONLY/BOOTSTRAP INTERFACE -- FIXUP ASL/SSL/SDL FOR DEBUGGING
BOOTDB::SKIPN T3,DDTDSK ;WANT TO HACK THE ASL, ETC.?
POPJ P, ;NO
SE1ENT ;ENTER SECTION ONE
CAMN T3,[EXP -1] ;USE BOOTSTRAP DEVICE?
MOVE T3,DEVICE ;YES
MOVE T1,STRAOB## ;AOBJN POINTER
CAME T3,@TABSTR##(T1) ;MATCH SPECIFIED STRUCTURE NAME?
AOBJN T1,.-1 ;KEEP SEARCHING
JUMPGE T1,CPOPJ## ;GIVE UP IF JUNK SPECIFIED
MOVE T4,TABSTR##(T1) ;GET STR ADDR
HLRZ T4,STRUNI##(T4) ;GET UDB
MOVE T4,UNILOG##(T4) ;AND FINALLY THE LOGICAL UNITID
MOVEI T1,.BTSSL ;SSL
PUSHJ P,ZLIST ;FETCH, STORE & ZERO REMAINDER OF LIST
MOVEI T1,.BTSDL ;SDL
PUSHJ P,ZLIST ;FETCH, STORE & ZERO REMAINDER OF LIST
MOVE T3,T4 ;COPY LOGICAL UNITID
MOVEI T1,.BTASL ;ASL
PUSHJ P,ZLIST ;FETCH, STORE & ZERO REMAINDER OF LIST
POPJ P, ;RETURN
ZLIST: PUSHJ P,BTDATA## ;FETCH ADDRESS IN BOOTSTRAP VECTOR
JRST TPOPJ## ;NOT THERE--POP OFF CALLER AND RETURN
MOVEM T3,(T2) ;STORE IN LIST
AOBJP T1,CPOPJ## ;ACCOUNT FOR THE FIRST WORD
AOS T2 ;...
SETZM (T2) ;ZERO NEXT
AOBJN T1,.-2 ;CLEAN OUT THE TABLE
POPJ P, ;RETURN
SUBTTL ONCE-ONLY/BOOTSTRAP INTERFACE -- COPY NXMTAB
BOOTNX: SETOM NXMTAB## ;INITIALIZE NXMTAB TO -1'S
MOVE T1,[NXMTAB##,,NXMTAB##+1]
BLT T1,NXMTAB##+NXMTBL##-1
SKIPN U,BOOTPA ;PHYSICAL ADDRESS OF BOOT ORIGIN
JSP T4,BOOTN4 ;GIVE UP
ADDI U,.BTNAM ;OFFSET TO IDENTIFIER
PUSHJ P,REFMEM## ;FETCH
CAME T1,['BOOT '] ;SANITY CHECK
JSP T4,BOOTN4 ;DON'T KNOW HOW WE WERE BOOTED
MOVE U,BOOTPA ;BASE ADDRESS
ADDI U,.BTSIZ ;OFFSET TO SIZE WORD
PUSHJ P,REFMEM## ;FETCH
SKIPL T1 ;MUST BE NEGATIVE
JSP T4,BOOTN4 ;ELSE FATAL ERROR
MOVE U,BOOTPA ;BASE ADDRESS
ADDI U,.BTNXM ;OFFSET TO BOOT'S COPY OF NXMTAB
PUSHJ P,REFMEM## ;FETCH POINTER
HLRE T2,T1 ;GET -LENGTH
MOVNS T2 ;MAKE POSITIVE
CAILE T2,NXMTBL## ;BIGGER THAN THE ONE IN COMMON?
MOVEI T2,NXMTBL## ;YES, USE OUR LENGTH
MOVNS T2 ;NEGATE
HRLZS T2 ;MAKE AN AOBJN POINTER
HRRZ T3,T1 ;COPY OFFSET
ADD T3,BOOTPA ;COMPUTE PHYSICAL START ADDRESS
;LOAD UP OUR COPY OF NXMTAB ONE WORD AT A TIME
BOOTN1: HRRZ U,T2 ;GET OFFSET INTO BOOT'S NXMTAB
ADD U,T3 ;RELOCATE
PUSHJ P,REFMEM## ;FETCH WORD
MOVEM T1,NXMTAB##(T2) ;STORE IT
AOBJN T2,BOOTN1 ;LOOP FOR ALL WORDS
MOVEI T1,NXMTBL##-1 ;OFFSET OF LAST WORD IN NXMTAB
;SEARCH NXMTAB BACKWARDS LOOKING FOR THE HIGHEST EXISTANT PAGE
BOOTN2: MOVE T2,NXMTAB##(T1) ;GET A WORD FROM NXMTAB
CAMN T2,[EXP -1] ;36 NON-EXISTANT PAGES
SOJG T1,BOOTN2 ;KEEP SEARCHING
SKIPG T1 ;4096K SYSTEM?
DMOVE T1,[EXP NXMTBL##-1,0] ;YES
MOVEI T4,^D36 ;36 PAGES MAPPED PER WORD
BOOTN3: LSHC T2,-1 ;GET A BIT IN T3
SKIPGE T3 ;FOUND HIGHEST PAGE YET?
SOJA T4,BOOTN3 ;NO--LOOK TO THE NEXT ONE
IMULI T1,^D36 ;36 PAGES MAPPED PER WORD
ADDI T1,(T4) ;PLUS OVERFLOW
LSH T1,P2WLSH ;CONVERT HIGHEST PAGE TO HIGHEST ADDRESS
MOVEM T1,SYSORG## ;SAVE HIGHEST ADDR AS WHERE TO START ALLOCATING
POPJ P, ;RETURN
BOOTN4: STOPCD .,HALT,BNU, ;++BOOTSTRAP NXMTAB UNAVAILABLE
SUBTTL ONCE-ONLY/BOOTSTRAP INTERFACE -- ACCOUNT FOR CORE USAGE
;SUBROUTINE TO FIXUP SYSORG TO ACCOUNT FOR THE PRESENCE OF THE YET
;TO BE MAPPED BOOTSTRAP. THIS MUST BE DONE IMMEDIATELY AFTER SETTING
;UP NXMTAB AND BEFORE ANY SECTION MAPS ARE ALLOCATED. OTHERWISE,
;PORTIONS OF THE BOOTSTRAP MAY BE TAKEN FOR A SECTION MAP.
BOOTSZ: SKIPN P1,BOOTPA ;PHYSICAL ADDRESS OF BOOT ORIGIN
JRST BOOTZA ;NOT THERE--GO ZERO ADDRESSES
MOVE U,P1 ;COPY IT
HRRI U,.BTNAM(P1) ;POINT TO IDENTIFIER
PUSHJ P,REFMEM## ;FETCH
CAME T1,['BOOT '] ;SANITY CHECK
JRST BOOTZA ;DON'T KNOW HOW WE WERE BOOTED
HRRI U,.BTSIZ(P1) ;OFFSET TO SIZE WORD
PUSHJ P,REFMEM## ;FETCH
JUMPGE T1,BOOTZA ;MUST BE NEGATIVE
HLRE T2,T1 ;GET -PAGE COUNT
MOVNS T2 ;MAKE POSITIVE
HRRZ T3,T1 ;ISOLATE LENGTH IN WORDS
ADDI T3,PAGSIZ ;ROUND UP A PAGE
LSH T3,W2PLSH ;CONVERT TO A PAGE NUMBER
CAME T3,T2 ;MUST MATCH
JRST BOOTZA ;NOT GOOD
HLRES T1 ;GET -LENGTH IN PAGES
LSH T1,P2WLSH ;CONVERT TO -WORD COUNT
MOVEM P1,SYSORG## ;START ALLOCATING AT BOTTOM OF BOOTSTRAP
SUB P1,T1 ;DETERMINE END OF BOOTSTRAP
MOVEM P1,BTSPFF ;SAVE FOR KLUDGERY AT BOOTMP
POPJ P, ;RETURN
BOOTZA: SETZM BOOTPA ;CLEAR PHYSICAL ADDRESS
SETZM BOOTVA## ;CLEAR VIRTUAL ADDRESS
POPJ P, ;RETURN
BTSPFF: 0 ;FIRST PHYSICAL ADDRESS FOLLOWING BOOTSTRAP
; USED TO FAKE OUT ONCMAP TO ALLOCATE THE
; PHYSICAL PAGES CONTAINING THE BOOTSTRAP
SUBTTL ONCE-ONLY/BOOTSTRAP INTERFACE -- MAP BOOTSTRAP
BOOTMP: SKIPN P1,BOOTPA ;PHYSICAL ADDRESS OF BOOT ORIGIN
POPJ P, ;NOT THERE
MOVE U,P1 ;COPY ADDRESS
HRRI U,.BTSIZ(P1) ;OFFSET TO SIZE WORD
PUSHJ P,REFMEM## ;FETCH
HLLZ P2,T1 ;PRESERVE -LENGTH IN PAGES
IFN FTXMON,<
MOVSI T1,(MS.RLC) ;SECTION NUMBER FOR RELOCATABLE CODE
PUSHJ P,ALCSMP ;ALLOCATE A MAP IF NECESSARY
>; END IFN FTXMON
MOVE T1,.CPEPT## ;POINT TO THIS CPU'S MAP
ADDI T1,SECTAB+(MS.RLC) ;OFFSET INTO THE SECTION MAP TABLE
MOVE T2,(T1) ;GET MAP POINTER
MOVE T1,.CPMAP## ;GET ADDRESS OF SECTION ZERO MAP
MOVEM T2,.EUPMP/PAGSIZ(T1) ;MAKE THE MAP ADDRESSABLE
IFE FTXMON,<
HRRZ T2,MONVFF## ;GET FIRST FREE ABOVE HIGH SEGMENT
LSH T2,W2PLSH ;CONVERT TO A PAGE NUMBER
HRRI T1,.EUPMP(T2) ;START HERE
ADDI T2,-PAGSIZ ;GET -REMANING PAGE COUNT IN T2
HRL T1,T2 ;MAKE AN AOBJN POINTER
>; END IFE FTXMON
IFN FTXMON,<
MOVSI T1,-PAGSIZ ;PAGES PER SECTION
HRRI T1,.EUPMP ;START OF SECTION MAP
>; END IFN FTXMON
HRR P2,T1 ;PRESERVE SECTION MAP ADDRESS
BOOTM1: HLL T2,P2 ;GET -PAGE COUNT
BOOTM2: SKIPE (T1) ;PAGE IN USE?
JRST BOOTM1 ;YES--TRY ANOTHER
AOBJP T1,BOOTZA ;GIVE UP IF SECTION IS FULL
AOBJN T2,BOOTM2 ;LOOP FOR THE REQUIRED NUMBER OF PAGES
ANDI T1,PG.BDY ;KEEP ONLY ENDING PAGE NUMBER
HLRE T2,P2 ;GET -LENGTH IN PAGES
ADDI T2,(T1) ;COMPUTE STARTING VIRTUAL PAGE NUMBER
LSH T2,P2WLSH ;CONVERT TO AN ADDRESS
HRLI T2,(MS.RLC) ;INCLUDE SECTION NUMBER FOR RELOCATABLE CODE
MOVEM T2,BOOTVA## ;SAVE ADDRESS
HLRE T1,P2 ;-PAGES NEEDED
MOVNS T1 ;MAKE POSITIVE
LSH T1,P2WLSH ;CONVERT TO A WORD COUNT
MOVSI T2,(<PM.DCD>B2+PM.WRT+PM.PUB+PM.SWB) ;DIRECT POINTER + WRITABLE
PUSH P,SYSORG## ;SAVE SYSORG
PUSH P,MONVFF## ;WILL BE CHANGED BY ONCMAP
MOVE T3,BTSPFF ;FIRST PHYSICAL ADDRESS FOLLOWING BOOTSTRAP
MOVEM T3,SYSORG## ;RESET SYSORG SO WE MARK THOSE PAGES AS TAKEN
PUSHJ P,ONCMAP ;MAP THE PAGES
POP P,MONVFF## ;RESTORE FIRST FREE
POP P,SYSORG## ;RESTORE SYSORG
MOVE T1,P1 ;GET STARTING PHYSICAL ADDRESS
LSH T1,W2PLSH ;CONVERT TO A PAGE NUMBER
HRLI T1,(<PM.DCD>B2+PM.WRT+PM.PUB+PM.SWB) ;DIRECT POINTER + WRITABLE
BOOTM3: MOVEM T1,(P2) ;STORE IN SECTION MAP
AOS T1 ;ADVANCE TO NEXT PAGE
AOBJN P2,BOOTM3 ;LOOP
CLRPT .EUPMP ;MAKE NEW MAPPING VISIBLE
IFE FTXMON,<
MOVE T1,BOOTVA## ;VIRTUAL ADDRESS OF BOOT
HLRE T1,.BTSIZ(T1) ;- LENGTH IN PAGES OF BOOT
MOVMS T1 ;LENGTH IN PAGES
LSH T1,P2WLSH ;LENGTH IN WORDS
ADDM T1,MONVFF## ;UPDATE TO REFLECT PAGES ALLOCATED FOR BOOT
>; END IFE FTXMON
POPJ P, ;DONE
SUBTTL ONCE-ONLY/BOOTSTRAP INTERFACE -- COPY MONITOR FILESPEC
BOOTFX: SKIPN W,BOOTPA ;PHYSICAL ADDRESS OF BOOT ORIGIN
POPJ P, ;NOT THERE
MOVE U,W ;COPY IT
HRRI U,.BTSIZ(W) ;POINT TO SIZE WORD
PUSHJ P,REFMEM## ;FETCH
HRRI U,.BTDEV(W) ;POINT TO START OF FILESPEC
MOVSI T2,-BOOTLN ;-LENGTH OF TRANSLATION TABLE
BOOTF1: HLRZ U,BOOTBL(T2) ;GET AN OFFSET
ADD U,W ;INDEX INTO BOOT VECTOR
PUSHJ P,REFMEM## ;FETCH WORD
HRRZ T3,BOOTBL(T2) ;GET STORAGE LOCATION
MOVEM T1,@T3 ;SAVE WORD
AOBJN T2,BOOTF1 ;LOOP
MOVE T1,DEVICE ;WORD FOR STRUCTURE
SETO T2, ;VALUE TO COMPARE
CAMN T2,DDTDSK ;IF WANT TO USE BOOT STRUCTURE,
MOVEM T1,DDTDSK ;UPDATE THE NAME
POPJ P, ;DONE
BOOTBL: .BTDEV,,DEVICE ;DEVICE
.BTFIL,,FNAME ;FILE NAME
.BTEXT,,FEXT ;EXTENSION
.BTPTH+0,,PPN ;PPN
.BTPTH+1,,SFDLST+0 ;SFD #1
.BTPTH+2,,SFDLST+1 ;SFD #2
.BTPTH+3,,SFDLST+2 ;SFD #3
.BTPTH+4,,SFDLST+3 ;SFD #4
.BTPTH+5,,SFDLST+4 ;SFD #5
BOOTLN==.-BOOTBL ;LENGTH OF TABLE
SUBTTL ONCE-ONLY/BOOTSTRAP INTERFACE -- BUILD BOOTXT
BSTRNG: SKIPN W,BOOTPA ;PHYSICAL ADDRESS OF BOOT ORIGIN
POPJ P, ;NOT THERE
MOVEI T1,BOOTYO ;ROUTINE TO BUILD UP STRING
MOVEM T1,.CPTOA## ; SAVE AS TTY OUTPUT ROUTINE
MOVE T1,[POINT 7,BOOTXT##] ;BYTE POINTER
MOVEM T1,BOOTBP ;STORE THE POINTER
MOVEI T1,[ASCIZ ./D .];FIRST DO A DUMP
PUSHJ P,CONMES## ; ..
SKIPN T2,DEVICE ;A DEVICE SPECIFIED?
POPJ P, ;NO, LEAVE DEFAULT ALONE
MOVEM T2,STRMON##
PUSHJ P,PRNAME## ;YES--PUT IN COMMAND STRING
MOVEI T1,[ASCIZ /:/] ;DELIMIT WITH A COLON
PUSHJ P,CONMES## ; ..
SKIPN T2,FNAME ;FILE NAME?
JRST BSTRN2 ;NO
MOVEM T2,FILMON##
PUSHJ P,PRNAME## ;PUT IN NAME
HLLZ T2,FEXT ;PICK UP EXTENSION
JUMPE T2,BSTRN2 ;NONE--LOOK FOR PPN
MOVEM T2,EXTMON##
LSH T2,-6 ;PUT IN A DOT
TLO T2,('.'B5) ; ..
PUSHJ P,PRNAME## ;TOSS IN EXT
BSTRN2: SKIPN T2,PPN ;A PPN?
JRST BSTRN5 ;NO
MOVEM T2,PPNMON##
PUSHJ P,PRLBK## ;FIRST A BRACKET
HLRZ T1,PPN ;GET PROJECT
PUSHJ P,PRTDI8## ;PRINT IN OCTAL
PUSHJ P,PRCOM## ;ADD A COMMA
HRRZ T1,PPN ;GET PROG NUMBER
PUSHJ P,PRTDI8## ;PRINT PROG
PUSH P,P1 ;SAVE P1
MOVSI P1,-5 ;SETUP AOBJN POINTER TO SFDLST
BSTRN3: SKIPN T2,SFDLST(P1) ;NEXT SFD SPECIFIED?
JRST BSTRN4 ;NO
PUSHJ P,PRCOM## ;PRINT COMMA
PUSHJ P,PRNAME## ;PRINT SFD NAME
AOBJN P1,BSTRN3 ;LOOP FOR ALL
BSTRN4: POP P,P1 ;RESTORE P1
PUSHJ P,PRRBK## ;ADD IN RIGHT SQUARE BRACKET
MOVE T1,[SFDLST,,SFDMON##] ;COPY SFD LIST TO
BLT T1,SFDMON##+4 ;WHERE MONITOR WANTS IT
BSTRN5: MOVEI T3,15
IDPB T3,BOOTBP
MOVEI T3,0
IDPB T3,BOOTBP
POPJ P,
BOOTYO: IDPB T3,BOOTBP ;STORE BYTE IN STRING
POPJ P, ;RETURN
BOOTBP: POINT 7,BOOTXT## ;RELOAD STRING POINTER
SUBTTL MOVE PSECT INTO FINAL POSITION
;ROUTINE TO MOVE A MONITOR PSECT INTO THE FINAL POSITION. PSECTS ARE
;MOVED TO THE END OF PHYSICAL MEMORY (A TRADITION).
;CALL WITH:
; T1/ STARTING VIRTUAL ADDRESS (ASSUMED TO BE ON A PAGE BOUNDARY)
; T2/ ENDING VIRTUAL ADDRESS (LAST ADDRESS USED)
; PUSHJ P,MOVPSE
;CALLS ONCMAP/NZSCGC AS APPROPRIATE TO SET UP MAPPING. THIS ROUTINE
;ASSUMES BOOT HAS LOADED THE MONITOR "IN PLACE", I.E., THERE IS A 1:1
;CORRESPONDANCE BETWEEN VIRTUAL ADDRESSES IN THE .EXE FILE AND THE
;PHYSICAL ADDRESSES CONTAINING THE PSECT TO BE MOVED.
MOVPSE: PUSHJ P,SAVE3## ;SAVE P1-P3
DMOVE P1,T1 ;COPY ARGUMENTS
ADDI P2,1 ;FIRST ADDRESS FOLLOWING PSECT
TRZE P2,PG.BDY ;ROUND UP TO NEXT PAGE BOUNDARY
ADDI P2,PAGSIZ
MOVE P3,P2 ;GET A COPY
SUB P3,P1 ;COMPUTE NUMBER OF WORDS IN AREA
IFN FTXMON,<
TLNN T1,-1 ;IF ADDRESS IS IN SECTION 0/1,
JRST MOVPS1 ; USE ONCMAP TO ALLOCATE SPACE
SE1ENT ;ENTER SECTION 1
PUSHJ P,NZSCGC ;ALLOCATE NON-ZERO SECTION CODE SPACE
JRST MOVPS2 ;CONTINUE
>; END IFN FTXMON
MOVPS1: PUSH P,MONVFF## ;SAVE HONORABLE VARIABLE
MOVEM T1,MONVFF## ;WHERE TO ALLOCATE FROM
MOVE T1,P3 ;COPY NUMBER OF WORDS TO MOVE
MOVSI T2,(<PM.DCD>B2+PM.WRT+PM.PUB+PM.CSH) ;PAGE MAP BITS
PUSHJ P,ONCMAP ;FILL IN MAP SLOTS
POP P,MONVFF## ;RESTORE HONORABLE VARIABLE
MOVPS2: MOVE P1,.CPMAP## ;GET ADDRESS OF SECTION 0/1 MAP
MOVE T3,P2 ;FIRST PAGE (ADDRESS) BEYOND AREA TO MOVE
LSH P2,W2PLSH ;;CONVERT ADDRESS TO PAGE NUMBER
HRLI P2,(<PM.DCD>B2) ;MAKE THAT PAGE ADDRESSABLE
MOVEM P2,.ECKSM/PAGSIZ(P1)
LSH P3,W2PLSH ;GET NUMBER OF PAGES TO MOVE
MOVPS3: SOS .ECKSM/PAGSIZ(P1) ;MAP THE PREVIOUS PAGE
CLRPT .ECKSM ;FLUSH THE MAPPING FOR THE TEMP SLOT
IFE FTXMON,<
SUBI T3,PAGSIZ ;BACK OFF TO START OF PAGE
MOVE T1,T3 ;GET A COPY
HRLI T1,.ECKSM ;VIRTUAL SOURCE ADDRESS
BLT T1,PG.BDY(T3) ;COPY THE PAGE
>; END IFE FTXMON
IFN FTXMON,<
MOVEI T1,PAGSIZ ;NUMBER OF WORDS TO MOVE
XMOVEI T2,.ECKSM ;VIRTUAL SOURCE ADDRESS
SUBI T3,PAGSIZ ;DESTINATION ADDRESS
PUSH P,T3 ;SAVE ACROSS BLT
EXTEND T1,[XBLT] ;COPY THE PAGE
POP P,T3 ;RESTORE DESTINATION ADDRESS
>; END IFN FTXMON
SOJG P3,MOVPS3 ;LOOP FOR ALL PAGES
POPJ P, ;RETURN
SUBTTL ONCE-ONLY HIDDEN SYMBOL TABLE SETUP
SYTBFX:
IFN FTXMON,<
SKIPLE P1,.JBSYM## ;HAVE SYMBOL TABLE?
PUSHJ P,DDTCHK ;AND RUNNING WITH EDDT?
POPJ P, ;DON'T MOVE SYMBOLS
SE1ENT ;ENTER SECTION 1
MOVSI T1,(MS.SYM) ;GET SECTION NUMBER FOR SYMBOLS
PUSHJ P,ALCSMP ;ALLOCATE A SECTION MAP
MOVE T1,.SYSTB+.SYTYP(P1) ;GET FLAGS,,LENGTH OF DEFINED SYMBOL TABLE
AND T1,[SY.LEN] ;KEEP JUST THE LENGTH
ADD T1,.SYSTB+.SYADR(P1) ;COMPUTE LAST ADDRESS IN DEFINED S.T.
MOVE T2,.SYSTB+.SYSTL+.SYTYP(P1) ;GET FLAGS,,LENGTH OF UNDEFINED S.T.
AND T2,[SY.LEN] ;KEEP JUST THE LENGTH
ADD T2,.SYSTB+.SYSTL+.SYADR(P1) ;COMPUTE LAST ADDRESS IN UNDEF S.T.
CAMG T1,T2 ;USE THE GREATER OF THE TWO TABLES
MOVE T1,T2 ; TO COMPUTE NUMBER OF PAGES IN S.T.
SUB T1,.JBSYM## ;SUBTRACT BASE OF TABLE
MOVE P1,T1 ;SAVE LENGTH IN WORDS
ADDI P1,PG.BDY ;ROUND TO A PAGE BOUNDARY
LSH P1,W2PLSH ;REMEMBER NUMBER OF PAGES IN S.T.
SSX T1,MS.SYM ;SECTION NUMBER FOR SYMBOLS
MOVE T2,.JBSYM## ;ADDRESS OF SYMBOL TABLE
SSX T2,MS.SYM ;PLUG IN THE CORRECT SECTION NUMBER
EXCH T1,T2 ;SWAP ARGUMENTS FOR NZSCGT
PUSHJ P,NZSCGT ;ALLOCATE SPACE FOR THE SYMBOL TABLE
;MOVE S.T. PAGE BY PAGE
MOVE T2,.JBSYM## ;START OF SYMBOL TABLE
MOVE T1,P1 ;COPY NUMBER OF PAGES IN SYMBOL TABLE
LSH T1,P2WLSH ;CONVERT TO AN ADDRESS
ADD T2,T1 ;FIRST ADDRESS PAST SYMBOL TABLE
SYTBF1: MOVEI T1,PAGSIZ ;NUMBER OF WORDS TO MOVE
SUBI T2,PAGSIZ ;START AT BEGINNING OF PAGE
PUSH P,T2 ;SAVE SOURCE ADDRESS
MOVE T3,T2 ;SET UP DESTINATION ADDRESS
SSX T3,MS.SYM ;PLUG IN THE SECTION NUMBER
EXTEND T1,[XBLT] ;MOVE ONE PAGE
POP P,T2 ;RESTORE SOURCE ADDRESS
SOJG P1,SYTBF1 ;LOOP FOR ALL PAGES OF SYMBOL SPACE
MOVSI T1,(MS.SYM) ;GET SECTION NUMBER
MOVE T2,.JBSYM## ;GET CURRENT ADDRESS OF SYMBOL TABLE
SSX T2,MS.SYM ;INSERT SECTION NUMBER
HLLM T1,.SYSTB+.SYADR(T2) ;FIXUP ADDRESS OF DEFINED SYMBOL TABLE
HLLM T1,.SYSTB+.SYSTL+.SYADR(T2) ;DITTO FOR UNDEFINED SYMBOL TABLE
HLLM T1,.JBSYM## ;RESET POINTER IN .JBSYM
POPJ P, ;RETURN
>; END IFN FTXMON
;HERE FOR NON-EXTENDED SYMBOL TABLE (KS)
IFE FTXMON,<
SKIPGE P1,.JBSYM## ;HAVE SYMBOL TABLE?
PUSHJ P,DDTCHK ;AND RUNNING WITH EDDT?
POPJ P, ;DON'T MOVE SYMBOLS
HLRE T1,.JBSYM## ;GET LENGTH OF SYMBOL TABLE
MOVMS T1 ;GET REAL LENGTH
HRRZ T2,.JBSYM## ;ADDRESS OF SYMBOL TABLE
ADDI T1,(T2) ;FIRST ADDRESS OUTSIDE OF THE SYMBOL TABLE
SKIPN T2,.JBUSY## ;IN CASE ANY UNDEF'S STILL LYING AROUND
HRRZ T2,.JBSYM## ;NONE, GET SYMBOL TABLE AGAIN
ANDI T2,-1-PG.BDY ;MOVING WHOLE PAGES, ADJUST
SUBI T1,(T2) ;NOW KNOW NUMBER OF WORDS TO MOVE
ADDI T1,PG.BDY ;BUT STILL HAVE TO ROUND IT UP
LSH T1,W2PLSH ;NOW HAVE THE NUMBER OF PAGES
CAILE T1,SYMSIZ## ;ENOUGH SPACE (SYMBK1 IN COMMON.MAC)
MOVEI T1,SYMSIZ## ;NO, REDUCE TO MAXIMUM
LSH T2,W2PLSH ;STARTING PAGE NUMBER
PUSHJ P,MOVSTB ;MOVE THE SYMBOL TABLE
MOVE T2,.JBSYM## ;GET .JBSYM
MOVE T3,.JBUSY## ;GET .JBUSY
TRZ T2,-1-PG.BDY ;KEEP JUST IN-PAGE PORTION
TRO T2,MONORG## ;RELOCATED .JBSYM
TRZ T3,-1-PG.BDY ;KEEP JUST IN-PAGE PORTION
TRO T3,MONORG## ;RELOCATED .JBUSY
MOVEI T1,[ ;SUBROUTINE TO CALL
MOVEM T2,.CPEDV##-.CPCDB##+.EDSYM(P1) ;STORE RELOCATED .JBSYM
MOVEM T3,.CPEDV##-.CPCDB##+.EDUSY(P1) ;STORE RELOCATED .JBUSY
MOVE T4,.CPSYB##+1 ;COUNT OF MAP WORDS TO REPLACE
MOVEM T4,.CPSYB##-.CPCDB##+1(P1) ;STORE
POPJ P,]
PUSHJ P,CPUAPP## ;FILL IN ALL CPU'S EDV'S
PUSHJ P,SETEDV## ;SETUP REMAINDER OF THE EDV
SETZM .JBSYM## ;FORGET ABOUT THESE NOW (OR IF AN ERROR)
SETZM .JBUSY## ;...
POPJ P, ;RETURN
>; END IFE FTXMON
;ROUTINE TO MOVE THE SYMBOL TABLE TO A HIDDEN PLACE.
;CALL:
; T1/ NUMBER OF PAGES TO MOVE
; T2/ FIRST PAGE TO MOVE
; PUSHJ P,MOVSTB
;RETURN:
; CPOPJ ALWAYS
IFE FTXMON,<
MOVSTB: MOVEM T1,.CPSYB##+1 ;NUMBER OF PAGES IN HIDDEN SYMBOL TABLE
PUSH P,P1 ;SAVE THE AC'S
PUSH P,P2 ;...
MOVN P1,T1 ;GET -VE NUMBER OF PAGES TO MOVE
HRLZS P1 ;BUILD AN AOBJN WORD
HRRI P1,-1(T1) ;BACKWARDS INDEX FOR SYMBK1
MOVE P2,T2 ;FIRST PAGE NUMBER
ADDI P2,-1(T1) ; PLUS COUNT-1 GIVES LAST PAGE NUMBER
PUSH P,MONVFF## ;GOING TO FAKE OUT ONCMAP, SAVE REAL ORIGIN
MOVST1: MOVE T1,P2 ;PAGE OF SYMBOLS
MOVE T2,.CPMAP## ;MAP ADDRESS
HRLI T1,(<PM.DCD>B2) ;ALLOW ACCESS
MOVEM T1,.ECKSM/PAGSIZ(T2) ;MAKE ADDRESSABLE
MOVEI T1,.EUPMP ;WHERE WE WANT IT TO BE MAPPED
MOVEM T1,MONVFF## ;SO WE DON'T CHEW UP LOTS OF VIRTUAL SPACE
MOVEI T1,PAGSIZ ;ONLY ALLOCATE ONE PAGE AT A TIME
MOVSI T2,(<PM.DCD>B2+PM.WRT+PM.PUB)
SKIPN [M.CPU##-1]
TDO T2,[PM.CSH]
PUSHJ P,ONCMAR ;ALLOCATE A PAGE FROM SOMEWHERE
HRLI T1,.ECKSM ;OLD SYMBOL TABLE LOCATION (RE-MAPPED)
HRRI T1,.EUPMP ;NEW, SAFER, LOCATION
BLT T1,.EUPMP+PG.BDY ;MOVE PART OF THE SYMBOL TABLE
MOVE T1,.CPMAP## ;GET MAP ADDRESS
MOVE T1,.EUPMP/PAGSIZ(T1) ;GET MAP CONTENTS
MOVEM T1,SYMBK1##(P1) ;STORE SO DDT CAN RE-MAP IT IN
ANDI T1,17777 ;ISOLATE PAGE NUMBER
IDIVI T1,^D36 ;COMPUTE POSITION IN NXMTAB
; MOVE T2,BITTBL##(T2) ;GET BIT FOR PAGE
MOVN T3,T2 ;BITTBL NOT SET UP YET
MOVSI T2,(1B0) ; SO WE MUST DO IT BY HAND
LSH T2,(T3) ;GET THE BIT
IORM T2,NXMTAB##(T1) ;MARK THE PAGE SO IT DOESN'T GET RE-USED
SUBI P1,2 ;EFFECT A "BACKWARDS" AOBJN
SUBI P2,1 ;NEXT PAGE OF THE SYMBOL TABLE
AOBJN P1,MOVST1 ;MOVE THE WHOLE THING
POP P,MONVFF## ;BACK TO NORMAL ALLOCATION NOW
POP P,P2 ;RESTORE AC'S
POP P,P1 ;...
POPJ P, ;RETURN
>; END IFE FTXMON
SUBTTL COMPUTE MONITOR SYMBOL TABLE CHECKSUM, FIXUP PATSIZ
PATFIX: SETZM MSTCKS## ;INITIALIZE MONITOR SYMBOL TABLE CHECKSUM
SKIPGE P1,.JBSYM## ;GET POINTER TO SYMBOL TABLE
JRST PATFI1 ;A NON-EXTENDED SYMBOL TABLE
JUMPE P1,CPOPJ## ;RETURN IF NO SYMBOLS
IFN FTXMON,<
SE1ENT ;ENTER SECTION 1
MOVE T1,.SYCNT(P1) ;GET LENGTH OF VECTOR
CAIGE T1,.SYSTB+<.SYSTL*2> ;IS BLOCK LONG ENOUGH?
STOPCD CPOPJ,DEBUG,SYVCTS, ;++SYMBOL VECTOR TOO SHORT
MOVE P2,.SYSTB+.SYTYP(P1) ;GET FLAGS,,LENGTH OF DEFINED SYMBOL TABLE
AND P2,[SY.LEN] ;KEEP JUST THE LENGTH
MOVE P1,.SYSTB+.SYADR(P1) ;GET ADDRESS OF DEFINED SYMBOL TABLE
JRST PATFI2 ;PROCEED
>; END IFN FTXMON
PATFI1: HLRE P2,P1 ;GET -VE LENGTH OF SYMBOL TABLE
MOVMS P2 ;MAKE IT POSITIVE
HRRZS P1 ;ISOLATE SYMBOL TABLE ADDRESS
PATFI2: SKIPA T1,[RADIX50 4,PAT] ;FIND "PAT" GLOBAL, SKIP AOS OF P1
PATLOP: AOS P1 ;ADVANCE POINTER INTO SYMBOL TABLE
MOVE T3,(P1) ;FETCH A WORD
EXCH T3,MSTCKS## ;SWAP WITH PREVIOUS CHECKSUM
ROT T3,1 ;MUNGE IT AROUND
ADD T3,MSTCKS## ;ADD IN PREVIOUS CHECKSUM
EXCH T3,MSTCKS## ;PUT IT BACK
TRNN P2,1 ;IS THIS THE SYMBOL VALUE WORD?
SOJA P2,PATLOP ;NO, GO DO IT
CAME T1,-1(P1) ;WAS PREVIOUS WORD "PAT"?
JRST PATLO1 ;NO
HRRZ T3,(P1) ;GET VALUE OF "PAT" SYMBOL
HRRZ T4,PATSIZ ;CHECK WITH PATCHED INDICATION
CAMLE T3,T4 ;USE MAX
HRRM T3,PATSIZ
PATLO1: SOJG P2,PATLOP ;GET NEXT SYMBOL,VALUE PAIR
POPJ P, ;DONE
SUBTTL SET UP SYSSIZ, CHECK FOR BREAKPOINTS AND NO EDDT
PATSIZ::MOVEI T1,PAT## ;NO LONGER NEEDED, BUT HABITS ARE HARD TO BREAK
PUSHJ P,DDTCHK ;RUNNING WITH EDDT?
JFCL ;DON'T REALLY CARE
MOVEM T1,SYSSIZ## ;UPDATE FIRST FREE WITH ADDRESS RETURNED IN T1
MOVSI T2,(CAI)
CAIL T1,DDTEND## ;SEE IF EDDT INTACT
TDZA T3,T3 ;YES--CLEAR MASK (PRESERVE DEBUGF BITS)
SKIPA T3,[DF.BPT] ;GET MASK OF ALL CPUS
HLLM T2,NODDT ;LEAVE 401 ALONE
ANDCAM T3,DEBUGF## ;CLEAR CPU MASK IF NO EDDT
PUSHJ P,CPUDDT## ;MAKE SURE CPUS CAN ENTER EDDT
MOVEI T1,CSBORG## ;START OF COMMON CODE AREA
CAIL T1,MONORG## ;DOES IT LIVE ABOVE THE HIGH SEGMENT?
MOVEI T1,MONORG## ;YES--THIS IS FIRST CORE AREA ABOVE LOW SEGMENT
SUBI T1,<M.EVM##*PAGSIZ>+1 ;BACK OFF BY AMOUNT OF RESERVED EVM AND
; ALSO MAKE THIS THE HIGHEST ADDRESS
MOVEM T1,LOWLIM## ;SAVE FOR CURIOUS EYES
CAMG T1,SYSSIZ## ;BETTER BE ENOUGH ROOM TO EVEN ATTEMPT THIS!
STOPCD .,STOP,TME, ;++TOO MANY PAGES RESERVED FOR EVM
POPJ P,
SUBTTL ALLOCATE SECTION MAP
;SUBROUTINE TO ALLOCATE A MAP FOR A NON-ZERO SECTION
;CALL WITH:
; T1 = SECTION NUMBER,,0
;RETURNS WITH A MAP ALLOCATED AND ITS ADDRESS STORED IN THIS CPUS
; EXEC SECTION MAP
IFN FTXMON,<
ALCSMP: HLRZ T2,T1 ;GET DESIRED SECTION
ADDI T2,SECTAB ;OFFSET INTO SECTION MAP TABLE
ADD T2,.CPEPT## ;INDEX INTO THE EPT
SKIPE (T2) ;MAP ALREADY ALLOCATED?
POPJ P, ;YES--DONE
PUSH P,MONVFF## ;SAVE ALLOCATION VARIABLE
PUSH P,T1 ;SAVE DESIRED SECTION NUMBER
MOVEI T1,.EUPMP ;ALLOCATE THIS VIRTUAL ADDRESS
MOVEM T1,MONVFF##
MOVEI T1,PAGSIZ ;LENGTH OF A SECTION MAP
MOVSI T2,(<PM.DCD>B2+PM.WRT+PM.CSH+PM.SWB) ;MAP BITS
PUSHJ P,ONCMAR ;ALLOCATED THE RESERVED PAGE
SETZM .EUPMP ;ZERO OUT THE PAGE
MOVE T1,[.EUPMP,,.EUPMP+1]
BLT T1,.EUPMP+PG.BDY
POP P,T1 ;GET SECTION NUMBER BACK
HLRZS T1 ;PUT IN THE RIGHT HALF
MOVE T2,.CPMAP## ;GET ADDRESS OF S0 MAP
MOVE T3,.EUPMP/PAGSIZ(T2) ;GET PAGE NUMBER WE ALLOCATED
TLZ T3,(PM.KPM) ;TURN OFF "KEEP ME" (ALWAYS SET BY ONCMAR)
IOR T3,.CPKPM## ;LIGHT PM.KPM IF CPU HAS AN MCA25
MOVE T2,.CPEPT## ;GET EPT ADDRESS
ADDI T2,(T1) ;PLUS SECTION NUMBER
MOVEM T3,SECTAB(T2) ;MAKE SECTION ADDRESSABLE
MOVEM T3,.CPMMA##(T1) ;MAKE SECTION MAP ADDRESSABLE IN SECTION 37
CLRPGT ;LET HARDWARE SEE NEW PAGING
POP P,MONVFF## ;RESTORE FIRST FREE FOLLOWING HIGH SEGMENT
POPJ P, ;AND RETURN
>; END IFN FTXMON
SUBTTL ALLOCATE NON-ZERO SECTION MEMORY
;SUBROUTINE TO ALLOCATE NON-ZERO SECTION CORE
;CALL WITH:
; T1 = STARTING VIRTUAL ADDRESS
; T2 = HIGHEST VIRTUAL ADDRESS REQUIRED
;RETURNS WITH:
; T1 = ADDRESS OF CORE ALLOCATED
; T2 = HIGHEST ADDRESS ALLOCATED + 1
;CALL NZSCGT TO ALLOCATE DATA SPACE (WRITABLE), NZSCGC TO ALLOCATE
;CODE SPACE (WRITE LOCKED AND CACHED).
IFN FTXMON,<
NZSCGC: SKIPA T3,[<PM.DCD>B2+PM.WRT+PM.PUB+PM.KPM+PM.CSH] ;GET CODE MAP BITS
NZSCGT: MOVSI T3,(<PM.DCD>B2+PM.WRT+PM.PUB+PM.KPM+PM.SWB) ;GET DATA MAP BITS
CONO PI,PI.OFF ;GUARD AGAINST RACES (KLIPA)
PUSH P,T1
MOVE T1,T2
TRZE T1,PG.BDY ;ROUND DOWN TO PAGE BOUNDARY
ADDI T1,PAGSIZ ;HIGHEST ADDRESS ALLOCATED + 1
PUSH P,T1 ;SAVE THAT
SUBI T1,1 ;HIGHEST ALLOCATED ADDRESS
XOR T1,T2 ;XOR SECTION NUMBERS TOGETHER
TLNE T1,-1 ;DON'T KNOW HOW TO ALLOCATE ACROSS A SECTION BDY
STOPCD .,STOP,CSB, ;++CROSSES SECTION BOUNDARY
SUB T2,-1(P) ;NUMBER OF WORDS REQUIRED
ADDI T2,PG.BDY ;ROUND UP
LSH T2,W2PLSH ;NUMBER OF PAGES
PUSH P,T2 ;SAVE NUMBER OF PAGES REQUIRED
PUSH P,P1 ;IT IS A PRESERVED AC AFTER ALL
HRRZ P1,-3(P) ;ADDRESS WITHIN THE SECTION
ADDI P1,PG.BDY ;ROUND UP
LSH P1,W2PLSH ;PAGE NUMBER WITHIN THE SECTION
LDB T1,[POINT 5,-3(P),17] ;SECTION NUMBER TO ALLOCATE FROM
MOVE T2,.CPEPT## ;ADDRESS OF THIS CPU'S EXEC PROCESS TABLE
ADD T2,T1 ;ADDRESS OF SECTION POINTER
SKIPN T2,SECTAB(T2) ;ENTRY FOR THIS SECTION'S MAP
STOPCD .,STOP,NSA, ;++NO SECTION ALLOCATED
MOVE T1,.CPMAP## ;ADDRESS OF THE MAP
MOVEM T2,.EUPMP/PAGSIZ(T1) ;.EUPMP MAPS THE MAP
CLRPT .EUPMP ;MAKE NEW MAPPING VISIBLE
ADD P1,-1(P) ;GET FIRST PAGE FOLLOWING OUR RANGE
SUBI P1,1 ;START AT LAST PAGE IN OUR RANGE SO PAGES ARE
; PHYSICALLY CONTIGUOUS WITHIN OUR RANGE
PUSH P,T3 ;SAVE PAGE MAP BITS REQUIRED
NZSCG1: PUSHJ P,GTPHPG ;GET A PHYSICAL PAGE
TDO T1,(P) ;SET PAGE BITS
MOVEM T1,.EUPMP(P1) ;STORE IT IN MAP FOR THIS SECTION
SOSLE -2(P) ;ALLOCATED ALL PAGES REQUESTED?
SOJA P1,NZSCG1 ;NO, LOOP FOR MORE
POP P,(P) ;POP OFF JUNK
POP P,P1 ;RESTORE HONORABLE AC
POP P,(P) ;POP OFF JUNK
POP P,T2 ;RESTORE ACS (CAN'T USE TTPOPJ
POP P,T1 ; AS IT'S NOT MAPPED ALWAYS)
CONO PI,PI.ON ;NOW SAFE TO ALLOW INTERRUPTS (KLIPA)
POPJ P, ;AND RETURN
>; END IFN FTXMON
SUBTTL SELECT PHYSICAL AND VIRTUAL ADDRESS SPACE
;SUBROUTINE TO SELECT PHYSICAL AND VIRTUAL ADDRESS FOR SPACE IN HIGH SEGMENT
;CALL: MOVEI T1,NUMBER-OF-WORDS-NEEDED
; MOVEI T2,PAGE-MAP-ACCESS-BITS-DESIRED
ONCMAR: TDZA T4,T4 ;INDICATE NO CHECK ON EXCEEDING HLCSAD
ONCMAP: SETO T4, ;INDICATE SHOULD CHECK ON EXCEEDING HLCSAD
IFN FTKL10,<
TLO T2,(PM.KPM) ;LITE "KEEP ME"
>; END IFN FTKL10
PUSH P,P1 ;SAVE P AC'S
PUSH P,P2 ;...
PUSH P,P3 ;...
MOVE T3,BOOTCP## ;BOOT CPU NUMBER
IMULI T3,.CPLEN## ;OFFSET INTO BOOT CPU'S CDB
PUSH P,.C0MAP##(T3) ;ADDRESS OF THE BOOT CPU'S MAP
MOVEI P1,PG.BDY(T1) ;ROUND UP AMOUNT OF WORDS REQUESTED
TRZ P1,PG.BDY ; TO FULL PAGES
MOVE P2,P1 ;COPY NUMBER OF WORDS
ADDB P1,MONVFF## ;UPDATE FIRST FREE
LSHC P1,W2PLSH ;CONVERT P1 TO VIRTUAL PAGE NUMBER, P2 TO COUNT
SOS P1 ;P1 = HIGHEST VIRTUAL PAGE TO BE ALLOCATED NOW
JUMPE T4,ONCMA1 ;NO CHECK IF CALLER IS ALLOCATING BEYOND HLCSAD
CAIL P1,HLCSAD##/PAGSIZ ;GONE INTO THE RESERVED AREA?
STOPCD .,STOP,OVA, ;++ OUT OF VIRTUAL ADDRESS SPACE
ONCMA1: MOVE P3,T2 ;COPY PAGE MAP BITS
ONCMA2: PUSHJ P,GTPHPG ;GET A PHYSICAL PAGE
TDO T1,P3 ;INCLUDE PAGE MAP BITS
ADD P1,(P) ;OFFSET INTO BOOT CPU'S MAP
MOVEM T1,(P1) ;STORE PAGE MAP ENTRY
SUB P1,(P) ;BACK TO VIRTUAL PAGE NUMBER
SOSLE P2 ;ANY MORE PAGES TO ALLOCATE?
SOJA P1,ONCMA2 ;YES, LOOP FOR THEM
CLRPGT ;LET HARDWARE SEE THE CHANGES
POP P,(P) ;POP OFF JUNK
POP P,P3 ;...
POP P,P2 ;...
POP P,P1 ;...
POPJ P,
SUBTTL ALLOCATE PHYSICAL PAGE
;SUBROUTINE TO ALLOCATE ONE PHYSICAL PAGE. USED BY ONCMAP AND NZSCGT.
;CALL:
; PUSHJ P,GTPHPG
;RETURN:
; T1/ PHYSICAL PAGE NUMBER OBTAINED
GTPHPG: MOVNI T1,PAGSIZ ;AMOUNT TO BACK OFF SYSORG
ADDB T1,SYSORG## ;GET NEXT FREE PHYSICAL ADDRESS
LSH T1,W2PLSH ;CONVERT TO A PAGE NUMBER
MOVE T2,T1 ;COPY IT HERE
IDIVI T2,^D36 ;COMPUTE OFFSET AND BIT IN NXMTAB
MOVNS T3 ;SELECT THE BIT
MOVSI T4,400000
LSH T4,(T3)
TDNE T4,NXMTAB##(T2) ;DOES THIS PAGE EXIST?
JRST GTPHPG ;NO, TRY NEXT LOWER ONE
POPJ P, ;RETURN
SUBTTL MARK OFF IOWD SPACE
;ROUTINE TO MARK OFF SPACE USED FOR IOWD 4-WORD BLOCKS.
;CALL:
; T1/ NUMBER OF BLOCKS
; T2/ STARTING ADDRESS OF BLOCK
; PUSHJ P,MRKIOW
IFN FTKL10,<
MRKIOW: SUB T2,LOWLOC## ;SUBTRACT BASE OF AREA
JUMPL T2,CPOPJ## ;IN CASE THE BLOCK APPEARS BEFORE THE TABLE
PUSHJ P,SAVE4## ;FREE UP ARGUMENT ACS FOR SETOS
LSH T2,-2 ;CONVERT TO BIT NUMBER
IDIVI T2,^D36 ;GET WORD AND BIT IN TABLE
MOVE P4,T2 ;COPY OFFSET TO BIT
ADD P4,LOWPTR## ;ADD IN BASE OF AOBJN POINTER TO TABLE
MOVNS T3 ;GET -VE BIT NUMBER TO START WITH
HRLI P4,^D36(T3) ;BIT POSITION,,ADDRESS
MOVE P3,T1 ;GET NUMBER OF BLOCKS TO RETURN FOR SETOS
PUSHJ P,SETOS## ;MARK OFF THE BITS
POPJ P, ;BLOCK ALREADY MARKED OFF (IE, NOT IN LTINIT)
MOVNS P3 ;GET -VE NUMBER OF BLOCKS WE RETURNED
ADDM P3,NOIOWD## ;DECREMENT NUMBER OF AVAILABLE BLOCKS
POPJ P, ;RETURN
>; END IFN FTKL10
SUBTTL TYPE-IN/TYPE-OUT ROUTINES
CONOUT::PUSHJ P,ICONM
CRLFOP::PUSHJ P,CRLF##
PJRST OPOUT
ICONM:: PUSHJ P,OTSET ;INITIALIZE LINE BUFFER
JRST CONMES## ;OUTPUT MESSAGE
OTSET:: PUSH P,T1 ;SAVE A TEMP
MOVEI T1,ONCTSZ ;SIZE OF BUFFER
MOVEM T1,ONCCNT ;SO CANT OVERFLOW
MOVE T1,LINEP ;INITIAL OUTPUT POINTER
MOVEM T1,ONCTOP
MOVEI T1,ONCTIV ;ADDRESS FOR READ ROUTINES TO USE
MOVEM T1,.CPTIV## ; ..
MOVEI T1,ONCTYO ;ADDRESS FOR TYPEOUT ROUTINES TO GO TO
MOVEM T1,.CPTOA## ; ..
SETZM ONCTCH ;CAN NO LONGER CONTINUE THE COMMAND
JRST TPOPJ## ;RESTORE A TEMP AND RETURN
;ASK A QUESTION WITH A DEFAULT ANSWER
;CALL WITH:
; MOVEI T1,[ASCIZ /QUESTION/]
; MOVEI T2,[ASCIZ /ANSWER/]
; PUSHJ P,ASKDEF
; RETURN HERE ON CRLF
; ELSE RETURN HERE
ASKDEF: PUSH P,OPRCNT ;SAVE OLD OPRCNT
EXCH T3,OPRCNT ;FORCE CALLER'S
TLNE T3,-1 ;UNLESS OLD WAS VERY LARGE - IN WHICH CASE
MOVEM T3,OPRCNT ;OPR TYPED SOMETHING, DON'T INTERFERE
PUSH P,T2 ;SAVE T2
PUSHJ P,ICONM ;OUTPUT QUESTION
PUSHJ P,OPOUT ;PUSH OUTPUT OUT
POP P,T1 ;RESTORE ANSWER
MOVE T2,DEFSP ;GET BYTE POINTER
HLL T1,T2 ; ..
ASKDF1: ILDB T3,T1 ;COPY STRING
IDPB T3,T2 ; ..
JUMPN T3,ASKDF1 ; ..
MOVEI T3,15 ;ADD ON A CR
IDPB T3,T2 ; ..
PUSHJ P,GETLND
CAIA ;PRESERVE SKIPNESS
AOS -1(P) ;...
POP P,OPRCNT ;RESTORE OLD TIMEOUT
POPJ P,
;ROUTINE TO MAKE SURE WE GIVE THE OPR TIME TO ANSWER, BECAUSE WE
;THINK WE MAY HAVE TIMED HIM OUT UNFAIRLY, AND THE NEXT QUESTION IS IMPORTANT
RSTDEF: SKIPL DEFALW ;HAS OPR BEEN TIMED OUT?
POPJ P, ;NO, NOTHING TO DO
PUSH P,T1 ;YES, SAVE T1
MOVEI T1,^D60 ;MAKE TIMEOUT AT LEAST A MINUTE AGAIN
CAMLE T1,OPRCNT ;SO OPR CAN INTERVENE
MOVEM T1,OPRCNT ; (NEW IS LONGER, USE IT)
SETZM DEFALW ;AND FORGET HE ISN'T THERE
JRST TPOPJ## ;RETURN
DEFSP: POINT 7,DEFBUF
DEFLAG: -1
DEFPTR: POINT 7,DEFBUF
DEFBUF: BLOCK 24 ;ENOUGH FOR 99 CHAR DEFAULT
OPRCNT: EXP ^D60 ;SECONDS TILL OPR ASSUMED NOT PRESENT
DEFALW: 0 ;-1 TO TAKE DEFAULT ALWAYS
;SUBROUTINE TO PUT A DECIMAL STRING INTO THE DEFAULT BUFFER
DECDEF: MOVEI T2,"0" ;ALWAYS FORCE 2 DIGITS
CAIGE T1,^D10 ;WILL WE GET MORE THAN ONE ANYWAY?
IDPB T2,DEFPTR ;NO--ADD IN LEADING DIGIT
PUSHJ P,DCDFLP ;STUFF THE TEXT
SETZ T2, ;GET A ZERO
MOVE T1,DEFPTR ;AND A COPY OF THE POINTER
IDPB T2,T1 ;ENSURE PROPER ASCIZ TERMINATION
POPJ P, ;RETURN TO CALLER
DCDFLP: IDIVI T1,12
HRLM T2,(P)
SKIPE T1
PUSHJ P,DCDFLP
HLRZ T1,(P)
ADDI T1,"0"
IDPB T1,DEFPTR
POPJ P,
;TYPEOUT ROUTINE TO STUFF INTO THE DEFAULT BUFFER
DEFTYO: IDPB T3,DEFPTR ;STUFF THE CHARACTER
POPJ P, ;ASSUME THE CALLER WILL MAKE IT ASCIZ
;SUBROUTINE TO PUT AN ASCIZ STRING INTO THE DEFAULT BUFFER
DEFTXT: HRLI T1,(POINT 7,) ;MAKE A BYTE POINTER
DEFTX1: ILDB T2,T1 ;FETCH A CHAR
JUMPE T2,DEFTX2 ;RETURN TO CALLER
IDPB T2,DEFPTR ;STORE THIS ONE
JRST DEFTX1 ;ONWARDS
DEFTX2: MOVE T1,DEFPTR ;GET A COPY OF THE POINTER
IDPB T2,T1 ;MAKE SURE IT'S ASCIZ
POPJ P, ;RETURN TO CALLER
SUBTTL ROUTINE TO WARN ABOUT OFFLINE MEMORY
MEMBAD: PUSHJ P,RSTDEF ;RESET DEFAULT TIMEOUT, ETC.
MOVEI T1,[ASCIZ /%Memory from /]
PUSHJ P,ICONM ;START MESSAGE
MOVE T1,U ;GET LOWER ADDRESS
PUSHJ P,PRT22A## ;PRINT AS 22-BIT OCTAL NUMBER
MOVEI T1,[ASCIZ / to /]
PUSHJ P,CONMES## ;SOME NOISE
MOVE T1,P3 ;GET FIRST ADDRESS PAST HOLE
SUBI T1,1 ;BACK DOWN TO END OF HOLE
PUSHJ P,PRT22A## ;PRINT AS 22-BIT OCTAL NUMBER
MOVEI T1,[ASCIZ / is offline
/]
PUSHJ P,CONMES## ;END MESSAGE
PUSHJ P,OPOUT ;PUSH OUTPUT OUT
MOVEI T1,[ASCIZ /Set memory/]
MOVE T2,['OFFLIN'] ;DEFAULT
MOVE T3,[-3,,MEMOPT] ;TABLE OF OPTIONS
PUSHJ P,PRSKEY ;PROMPT AND FETCH ANSWER
JFCL ;SHOULDN'T HAPPEN
SOJL T1,CPOPJ1## ;RETURN IF "DOWN"
SOJG T1,CPOPJ ;"ONLINE" REQUESTED
JRST CPOPJ2## ;ELSE "OFFLINE" WANTED
MEMOPT: SIXBIT /DOWN/
SIXBIT /OFFLIN/
SIXBIT /ONLINE/
SUBTTL READ A LINE FROM OPERATOR CONSOLE
;ROUTINE TO READ A LINE FROM OPERATORS CONSOLE
;CALL: PUSHJ P,GETLIN
; <JUST A CR TYPED IN>
; <NORMAL RETURN (NOT A BLANK LINE)>
GETLND: MOVE T1,DEFSP ;GET INITIAL STRING POINTER
MOVEM T1,DEFPTR ;SETUP FOR DEFAULTING
GETLIN::PUSHJ P,SAVE1## ;SAVE P1
SETZM SAWCMT ;ZERO THE COMMENT FLAG
MOVE T1,OPRCNT ;ALLOW 60 SEC.
IMUL T1,TICSEC## ; ..
SKIPGE DEFALW ;IF THE OPR HAS BEEN TIMED OUT ALREADY,
MOVEI T1,1 ; HURRY ALONG
MOVEM T1,DEFLAG ;STORE TICKS TILL TIMOUT AS A FLAG
GETLI0: MOVE T1,LINEP
MOVEM T1,ONCTIP ;INITIAL STORAGE POINTER
MOVEI T3," " ;PRIME COMMAND ROUTINES WITH A SPACE
MOVEM T3,ONCTCH ; ..
MOVEI P1,0 ;FLAG NO ALTMODE SEEN, ZERO CHARACTER COUNT (RH
; OF P1), CLEAR DELETE FLAG (LH OF P1)
GET1: PUSHJ P,XTYI ;WAIT FOR A CHARACTER
SKIPGE DEFLAG ;NEED A DEFAULT?
JRST [ILDB T3,DEFPTR ;YES--GET BYTE
SKIPN T3 ;IF HIT END OF STRING,
MOVEI T3,15 ;MAKE IT END OF COMMAND
JRST .+1] ;REJOIN
SKIPL DEFLAG ;NEED A DEFAULT?
MOVE T3,FROMFE ;GET CHAR FROM WHERE IT WAS SAVED
ANDI T3,177 ;STRIP PARITY
CAIE T3,"H"-100 ;BACKSPACE?
CAIN T3,177 ;RUBOUT?
JRST DELETE ;YES
TLZE P1,1
PUSHJ P,BKSLSH ;TERMINAL BACKSLASH IF WE HAD BEEN DELETING
CAIN T3,"R"-100 ;CONTROL-R?
JRST RETYPE ;YES
CAIN T3,"U"-100 ;CONTROL-U?
JRST CNTRLU ;YES
CAIN T3,33 ;ALTMODE/ESCAPE?
JRST GETLN1 ;YES
CAIE T3,175 ;OTHER ALTS?
CAIN T3,176 ; ..
JRST GETLN1 ;YES
GET2: SKIPN .UONCE## ;USER MODE?
PUSHJ P,XTYO ;ECHO
CAIL T3,140 ;LOWER CASE?
TRZ T3,40 ;YES. MAKE UPPER
CAIE T3,";" ;WAS IT ONE KIND OF COMMENT INDICATOR?
CAIN T3,"!" ;OR ANOTHER?
SETOM SAWCMT ;YES - LIGHT FLAG
CAIN T3," " ;WAS IT A SPACE?
SETOM SAWCMT ;THAT'S A COMMENT INDICATOR TOO
IDPB T3,T1 ;STORE IN INPUT BUFFER
CAIE T3,15 ;CAR RET?
AOJA P1,GET1 ;NO. LOOP TILL BREAK
MOVEI T3,12 ;YES. ADD LF
SKIPN .UONCE## ;ALREADY HAD LF IF USER MODE
PUSHJ P,XTYO ;OUTPUT LF
MOVEI T3,0 ;TERMINATE INPUT STRING IN BUFFER
IDPB T3,T1 ; ..
SKIPE P1 ;NON-NULL LINE?
AOS (P) ;TAKE SKIP RETURN
SKIPE .UONCE## ;USER MODE?
CLRBFI ;CLEAN UP
MOVEM P1,ALTMFL ;SAVE ALTMODE TYPED FLAG
POPJ P, ;AND RETURN
;ROUTINE TO SEE IF ALTMODE WAS TYPED IN RESPONSE TO A QUESTION
ALTM:: SKIPGE ALTMFL ;ALTMODE TYPED?
JRST STRTUP ;GO BACK TO THE BEGINING
POPJ P, ;JUST RETURN
DELETE: TRNN P1,-1 ;AT BEGINNING OF LINE ?
JRST DELET1 ;YES
TLON P1,1 ;SET DELETE FLAG
PUSHJ P,BKSLSH ;TYPE BACKSLASH IF JUST STARTING TO DELETE
LDB T3,T1 ;GET PREVIOUS CHARACTER
PUSHJ P,XTYO ;ECHO IT AS WE DELETE IT
ADD T1,[XWD 070000,0] ;BACK UP BYTE POINTER
TLNE T1,400000 ;FINISHED THIS WORD YET ?
ADD T1,[XWD 347777,-1] ;YES, BACK UP ADDRESS
SOJA P1,GET1
DELET1: TLZE P1,1
PUSHJ P,BKSLSH ;TERMINAL BACKSLASH IF DELETED ANY CHARS
DELET2: MOVEI T3,15
PUSHJ P,XTYO
MOVEI T3,12
PUSHJ P,XTYO
HRLOI T1,777 ;DO NOT ALLOW A DEFAULT
MOVEM T1,DEFLAG ;STORE FLAG
JRST GETLI0
CNTRLU: MOVEI T3,"^" ;TYPE UP ARROW
PUSHJ P,XTYO
MOVEI T3,"U" ;TYPE U
PUSHJ P,XTYO
JRST DELET2 ;FINISH UP
BKSLSH: PUSH P,T3
MOVEI T3,134 ;TYPE BACKSLASH
PUSHJ P,XTYO
POP P,T3
POPJ P,
GETLN1: MOVEI T3,"$" ;OUTPUT DOLLAR SIGN IF ALT-MODE TYPED
SKIPN .UONCE## ;ALREADY ECHOED IF USER-MODE
PUSHJ P,XTYO
HRROS P1 ;MECHANISM USED TO BY-PASS PART OF DIALOGUE
MOVEI T3,15 ; WHEN ALTMODE IS TYPED (ALTMFL NEGATIVE ON
JRST GET2 ; RETURN FROM GETLIN).
RETYPE: MOVEI T3,15 ;CARRIAGE RETURN
PUSHJ P,XTYO
MOVEI T3,12 ;LINE FEED
PUSHJ P,XTYO
PUSH P,T1 ;SAVE THE BYTE POINTER
SETZ T3, ;GET A ZERO
IDPB T3,T1 ;MAKE ASCIZ
MOVE T1,LINEP ;GET VIRGIN BYTE POINTER TO INPUT LINE
RETYP1: ILDB T3,T1 ;GET A CHARACTER
JUMPE T3,RETYP2 ;DONE AT NULL
PUSHJ P,XTYO ;TYPE IT
JRST RETYP1 ;LOOP
RETYP2: POP P,T1 ;RESTORE BYTE POINTER
JRST GET1 ;GET NEXT CHARACTER
SUBTTL TYPE A LINE ON OPERATOR CONSOLE
;ROUTINE TO TYPE A LINE ON OPERATOR CONSOLE
;ECHO CHECK STOPS LINE AND RETURNS
;CALL: ONCTOP SET TO END OF MESSAGE
;CALL OPOUTX FOR MESSAGE CONTINUATIONS TO BE SUPPRESSED IF
; THE PREVIOUS PART OF THE MESSAGE WAS ^O'D
OPOUTX::SKIPE CNTRLO ;^O IN EFFECT ?
PJRST OTSET ;YES, JUST CLEAR BUFFER AND GO AWAY
OPOUT:: SETZM CNTRLO ;CLEAR ^O FLAG
SKIPE .UONCE## ;IF USER MODE,
SKPINL ;MAKE SURE TO DEFEAT ^O
JFCL ;IT MIGHT EVEN SKIP
MOVEI T3,0 ;MAKE SURE STRING ENDS
IDPB T3,ONCTOP ;WITH A NULL
MOVE T1,LINEP ;AND RESTART AT BEGINNING
MOVEM T1,ONCTOP ; ..
OPOUT1: SKIPE .UONCE## ;USER MODE?
JRST OPOUT2 ;YES, USER-MODE HAS THE REAL ^O, SKIP THIS CRUFT
IFN FTKL10,<
PUSHJ P,SPCGTI## ;CHECK FOR INPUT, SKIP WITH CHAR IN T3
JRST OPOUT2 ;NO INPUT
JRST OPOUT3 ;YES
>; END IFN FTKL10
IFN FTKS10,<
SKIPN T3,CTYIWD ;SKIP IF CHAR IS THERE
JRST OPOUT2 ;NONE THERE
SETZM CTYIWD ;CLEAR CTYIWD
JRST OPOUT3 ;GO DO CTRL-O
>; END IFN FTKS10
OPOUT2: ILDB T3,ONCTOP ;GET CHAR TO TYPE
JUMPE T3,OTSET ;QUIT ON NULL
PUSHJ P,XTYO ;TYPE CHAR
MOVEI T3,0 ;GET A ZERO
DPB T3,ONCTOP ;CLEAR BUFFER AS WE GO
JRST OPOUT1 ;LOOP
;HERE WHEN KEY STRUCK DURING TYPEOUT
OPOUT3: SETOM CNTRLO ;SET ^O FLAG
MOVEI T3,"^"
PUSHJ P,XTYO
MOVEI T3,"O"
PUSHJ P,XTYO
MOVEI T3,15
PUSHJ P,XTYO ;TYPE OUT CRLF
MOVEI T3,12
PUSHJ P,XTYO
JRST OTSET ;RESET OUTPUT BUFFER, RETURN FROM OPOUT
CNTRLO: 0 ;SUPPRESS TYPE-OUT WHEN -1
SUBTTL LOWEST LEVEL CONSOLE OUTPUT ROUTINE
XTYO:: CAIL T3," " ;CONTROL CHARACTER?
JRST XTYOCH ;NO
CAIN T3,15 ;CARRIAGE RETURN?
SETZM ONCCOL ;YES, BACK AT BEGINNING OF LINE
CAIE T3,11 ;TAB?
JRST XTYOCN ;NO, DON'T COUNT WIDTH OF CONTROL CHARACTERS
PUSH P,T3 ;SAVE ORIGINAL CHARACTER
MOVE T3,ONCCOL ;GET COLUMN
ADDI T3,^D8 ;GET TO NEXT TAB STOP
TRZ T3,7 ;...
SUB T3,ONCCOL ;FIND NUMBER OF SPACES NEEDED
PUSH P,T3 ;SAVE COUNT
MOVEI T3," " ;GET A SPACE
PUSHJ P,XTYOCH ;OUTPUT IT
SOSLE (P) ;NEED ANY MORE?
JRST .-2 ;YES, DO ANOTHER
ADJSP P,-1 ;TOSS THE COUNT
POP P,T3 ;RESTORE ORIGINAL TAB
POPJ P, ;RETURN
XTYOCH: AOS ONCCOL ;INCREMENT COLUMN COUNT
XTYOCN: SKIPE .UONCE## ;USER MODE?
JRST [OUTCHR T3 ;PRINT CHARACTER
POPJ P,] ;AND RETURN
PUSHJ P,PEVEN8## ;GET GOOD PARITY FOR CHAR
IFN FTKL10,<
PUSHJ P,SPCTYO## ;TYPE OUT
PUSHJ P,OPRFIL## ;DO FILLERS
PUSHJ P,APRCHK ;UPDATE TIME
PUSHJ P,SPCWTO## ;WAIT FOR OUTPUT DONE
JRST .-2 ;NOT DONE, WAIT SOME MORE
>; END IFN FTKL10
IFN FTKS10,<
PUSHJ P,APRCHK ;UPDATE TIME
SKIPE CTYOWD ;CAN WE TYPE YET?
JRST .-2 ;NO, WAIT
TRO T3,CTYOVL ;SET VALID FLAG
MOVEM T3,CTYOWD ;PUT IT IN 8080'S WORD
WRAPR SP.SSF+SP.IFE ;INTERRUPT THE 8080
PUSHJ P,APRCHK ;UPDATE TIME
SKIPE CTYOWD ;CHAR TAKEN YET?
JRST .-2 ;NO, WAIT
>; END IFN FTKS10
ANDI T3,177 ;ONLY CHAR FOR COMPARES IN GETLIN
POPJ P, ;RETURN
ONCCOL: 0 ;COLUMN NUMBER FOR TAB SIMULATION
SUBTTL LOWEST LEVEL CONSOLE INPUT ROUTINE
;WAIT TIL INPUT DONE ON BEFORE RETURNING WITH NEXT CHAR.
XTYI: PUSH P,T1 ;SAVE AN AC
SKIPN .UONCE## ;USER MODE?
JRST XTYI1 ;NO
INCHWL T3 ;WAIT ON LINE, READ A CHARACTER
JRST XTYI2 ;GO FINISH UP
XTYI1: PUSHJ P,APRCHK
SKIPGE DEFLAG
JRST XTYI3
IFN FTKL10,<
PUSHJ P,SPCGTI## ;SKIP IF CHAR PRESENT, WITH IT IN T3
JRST XTYI1
> ;END IFN FTKL10
IFN FTKS10,<
SKIPN T3,CTYIWD ;SKIP IF CHAR PRESENT, WITH IT IN T3
JRST XTYI1
SETZM CTYIWD ;CLEAR FOR NEXT TIME
> ;END IFN FTKS10
XTYI2: MOVEM T3,FROMFE ;SAVE CHARACTER FOR USE LATER
HRLOI T1,777 ;RESET THE TIMER
MOVEM T1,DEFLAG ; SO WE DON'T START UP
MOVEM T1,OPRCNT
SETZM DEFALW
JRST TPOPJ## ;RETURN AND RESTORE T1
XTYI3: SETOM DEFALW
JRST TPOPJ##
ONCKLT::BLOCK 1 ;PLACE TO KEEP BITS FOR KL10 INTERVAL TIMER
FROMFE: BLOCK 1 ;PLACE TO KEEP CHAR AFTER XTYO GETS IT
SUBTTL CHECK FOR CLOCK TICK
;CHECK APR FOR CLOCK FLAG SO TIME USER TYPES IN WILL BE ACCURATE
APRCHK::
IFN FTKL10,<SKIPN .CPTIM##> ;APR CLOCK TICKED?
IFN FTKS10,<CONSO APR,SP.ITI> ;APR CLOCK TICKED?
POPJ P, ;NO
IFN FTKL10,<SETZM .CPTIM##> ;YES, WE'VE NOTICED, CLEAR THE FLAG
IFN FTKS10,<WRAPR SP.CSF!SP.ITI> ;SET UP FOR ANOTHER CLOCK TICK
IFN FTMP,<
PUSH P,T1
MOVEI T1,.C0CDB## ;INCREMENT .CPOK FOR ALL CPUS
APRCH1: AOS .CPOK##-.CPCDB##(T1)
HLRZ T1,.CPCDB##-.CPCDB##(T1) ;STEP TO NEXT CPU
JUMPN T1,APRCH1
POP P,T1
>; END IFN FTMP
AOS TIME## ;INCREMENT TIME
IFN FTKS10,<AOS APRTIM> ;KEEP THIS SOMEWHAT CORRECT ALSO
SOS DEFLAG ;SEE IF TIME FOR DEFAULT
IFN FTSCA,<
PUSHJ P,SAVT## ;SAD BUT NEEDED
PUSHJ P,SC.TIC## ;DO ONCE/TICK SCA MEMORY ALLOCATION
PUSHJ P,PPDTIC## ;DITTO FOR THE KLIPA
>; END IFN FTSCA
POPJ P,
APRTIM::BLOCK 1 ;CLOCK TICKS SINCE APR CLOCK TURNED ON
; USEFUL FOR TIMING DURING INITIALIZATION
SUBTTL ONCE TTY INPUT VECTOR
;ONCTIV ONCE TTY INPUT VECTOR.
ONCTIV::PUSHJ P,ONCTYI ;(0 = CTIGNC) GET NEXT CHAR
MOVE T3,ONCTCH ;(1 = CTIGLC) GET LAST CHAR
MOVEM T3,ONCTCH ;(2 = CTISLC) SET LAST CHAR
MOVE T1,ONCTIP ;(3 = CTIGBP) GET BYTE POINTER
MOVEM T1,ONCTIP ;(4 = CTISBP) SET BYTE POINTER
;HERE TO READ THE NEXT CHAR FOR COMCON.
ONCTYI: ILDB T3,ONCTIP ;GET INPUT CHARACTER
MOVEM T3,ONCTCH ;STORE FOR RE-READS
POPJ P, ;AND RETURN TO CALLING ROUTINE
ONCTYO::SOSLE ONCCNT ;COUNT CHARACTERS
IDPB T3,ONCTOP ;PUT IN BUFFER
POPJ P, ;AND RETURN
SUBTTL SWAPPER INITIALIZATION
;ROUTINE TO RE-INITIALIZE THE SWAPPING AVAILABILITY TABLE. CALLED AT
; SYSTEM INITIALIZATION TIME.
SWPINI: MOVEI T1,SWPDDB## ;SWAPPER DDB
HLRZ T2,DSKDDB##+DEVSER ;GET DDB POINTED TO BY PROTOTYPE
HRLM T1,DSKDDB##+DEVSER ;LINK UP SWAPPER DDB
HRLM T2,SWPDDB##+DEVSER ;SPLICE SWAPPER DDB INTO CHAIN
MOVEI T1,ASSCON ;FLAG SWAPPER DDB AS ASSIGNED BY CONSOLE
IORM T1,SWPDDB##+DEVMOD ;SINCE IT APPEARS IN SYSTEM DDB LIST (BEFORE PROTOTYPE
; ELSE USERS COULD INIT IT.
IFN FTMP,<
MOVE T1,DSKDDB##+DEVCPU ;INITIALIZE INTERLOCK POINTER
HRRM T1,SWPDDB##+DEVCPU
>; END IFN FTMP
SETZB T1,R ;MAKE SURE ASSIGNED TO JOB 0
DPB T1,PJOBN##
HLRZ U,SWPUNI## ;GET ADDR OF FIRST UNIT FOR SWAPPING
JUMPE U,CPOPJ## ;EXIT IF NOT A UNIT DATA BLOCK
HRLM U,NXTSUN## ;INITIALIZE NEXT SWAPPING UNIT
SETZM SQREQ## ;CLEAR SWAPPPING LOCS
SETZM VIRTAL## ;START TOTAL VIRTUAL CORE FOR SYSTEM AT 0
IFN FTXMON,<
LDB R,UNYSNS## ;SECTION NUMBER FOR SWAPPING SATS
MOVSS R ;TO THE LEFT HALF
>; END IFN FTXMON
;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE
SE1ENT ;MUST BE IN SECTION 1
SWPIN1: SETZM UNIFKS(U) ;CLEAR FREE J FOR SWAP
SKIPL T1,UNIPTR(U) ;SKIP IF SWAPPING SPACE ON THIS UNIT
JRST SWPIN2 ;NONE
HLRE T2,T1 ;T2=-LENGTH OF SWAPPING SAT
HRLS T1 ;T1=ADDR IN BOTH HALVES
SUBB T1,T2 ;T1=BLT PTR
MOVSS T1
IFE FTXMON,<
BLT T1,-1(T2) ;COPY INITIAL SWAPPING SAT
>; END IFE FTXMON
IFN FTXMON,<
HLRZ T2,T1 ;STARTING ADDRESS, SECTION RELATIVE
HRRZ T3,T1 ;WHERE TO BLT TO, SECTION RELATIVE
ADD T2,R ;ADD IN SECTION NUMBER
ADD T3,R ; DITTO
MOVSI T1,400000 ;MAKE LOGICAL BLOCK 0 BE UNAVAILABLE
IORM T1,(T2)
HLRE T1,UNIPTR(U) ;NEGATIVE LENGTH
MOVMS T1 ;LENGTH
EXTEND T1,[XBLT] ;MOVE IT
>; END IFN FTXMON
MOVE T1,UNIPTR(U) ;PTR TO SWAPPING SAT
IFE FTXMON,<
MOVSI T2,400000 ;MAKE LOGICAL BLOCK 0 BE UNAVAILABLE
IORM T2,(T1) ; SINCE SLOT=0 MEANS PAGE NOT IN USE AT ALL
>; END IFE FTXMON
PUSHJ P,SATCN## ;COUNT 0 BITS=FREE K
ADDM T2,VIRTAL## ;COUNT TOTAL IN SYSTEM
MOVEM T2,UNIFKS(U) ;AND GET FOR UNIT
SWPIN2: HLRZ U,UNISWP(U) ;NEXT UNIT IN SWAP LIST
JUMPN U,SWPIN1 ;LOOP FOR ALL UNITS IN SWAP LIST
MOVE T1,VIRTAL## ;GET #K VIRTUAL CORE IN SYSTEM
MOVEM T1,K4SWAP## ;AS #K FOR SWAPPING IN SYSTEM
MOVEM T1,VMCMAX## ;SAVE AS MAX K FOR VIRTUAL JOBS
POPJ P,
SUBTTL START CLOCK
;THIS ROUTINE CALLED AT THE POINT AT WHICH WE WOULD
; LIKE CLOCK TICKS TO START HAPPENING.
TIMINI:
IFN FTKL10,<
MOVE T1,.CPEPT## ;GET ADDRESS OF EPT
MOVE T1,.EPTII(T1) ;GET ADDRESS OF XPCW BLOCK
MOVEI T2,TIMINT## ;ADDRESS OF INTERRUPT ROUTINE
MOVEM T2,3(T1) ;SALT AWAY IN TM'N'INT BLOCK
CONI MTR,T1
CONO MTR,APRCHN##(T1) ;SETUP METER PI ASSIGNMENT
MOVEI T1,^D1666 ;ASSUME 60HZ
MOVE T2,STATES##
TLNE T2,(ST.CYC) ;IS OUR ASSUMPTION CORRECT?
MOVEI T1,^D2000 ;NO, 2000 IS INTERVAL
CONO TIM,TO.CTD!TO.CIT!TO.SIT(T1) ;START TIMER GOING
>;END IFN FTKL10
IFN FTKS10,<
WRAPR SP.SSF!SP.ITI ;TURN INTERVAL TIMER ON
MOVEI T1,^D17*10000 ;ASSUME 60 HZ
MOVE T2,STATES##
TLNE T2,(ST.CYC) ;IS IT?
MOVEI T1,^D20*10000 ;NO, 50HZ
WRINT T1 ;SET UP INTERVAL REG
>;END IFN FTKS10
POPJ P, ;RETURN
SUBTTL ROUTINES TO MARK AND LINK PAGTAB
;SUBROUTINE TO MARK AND LINK PAGTAB FOR THE PHYSICAL PAGES ALLOCATED TO
; THE MONITORS HIGH SEGMENT ( OR AT LEAST THINGS ABOVE 400000 )
;CALL: T1 = VIRTUAL ADDRESS OF FIRST PAGE TO ACCOUNT FOR
; T3 = LAST PAGE ACCOUNTED FOR ( RETURNED BY THIS ROUTINE )
; T4 = NUMBER OF PAGES TO LOOK AT
;
;RETURNS T3 = SET UP FOR ANY SUBSEQUENT CALL
;ALSO WRITE PROTECTS THE HIGH SEGMENT ON THE WAY THROUGH UNLESS PM.SWB
; IS LIT IN THE PAGE MAP ENTRY.
;THE SCREWY CONVENTIONS HAPPENED TO FALL OUT OF THE WAY KIINI USED TO WORK
SETMRB: LSH T1,W2PLSH
ADD T1,.CPMAP##
SETMRP: HRLI T1,(POINT 36,0)
SETMR1: ILDB T2,T1 ;GET PHYSICAL PAGE CONTAINING THE MONITOR
JUMPE T2,SETMR2 ;OK IF NOT ALLOCATED
TLNN T2,(<PM.ACD>B2^!<PM.DCD>B2) ;ANYTHING BESIDES DIRECT POINTER?
TLNN T2,(<PM.DCD>B2) ;YES, MAKE SURE DIRECT POINTER (RSVD SLOTS)
JRST SETMR2 ;THIS ISN'T A PAGE NUMBER
ANDI T2,17777 ;CLEAR THE ACCESS BITS
TLO T2,MONTRB ;INDICATE THIS PHYSICAL PAGE CONTAINS THE MONITOR
MOVEM T2,PAGTAB(T3) ; IN PAGTAB
SSX T2,MS.MEM
HRRZM T3,PT2TAB(T2) ;SET BACK LINK
HRR T3,T2 ;SAVE LAST MONITOR PAGE SEEN
SETMR2: SOJG T4,SETMR1 ;LOOP OVER ALL THE MONITORS PAGES
MOVSI T2,MONTRB ;IN CASE SOME PAGES WERE SKIPPED (T2=0)
MOVEM T2,PAGTAB(T3) ;INDICATE THE LAST PAGE OF THE MONITOR
HRRZM T3,LMPAG## ;..
POPJ P,
;SUBROUTINE TO MARK PAGES IN PAGTAB WITH THE "PHYSICALLY CONTIGUOUS" BIT.
;CALL:
; T1/ STARTING PHYSICAL PAGE NUMBER
; T2/ NUMBER OF PAGES
; PUSHJ P,SETCTB
;RETURN:
; CPOPJ ALWAYS
SETCTB: SE1ENT ;FOR PAGTAB REFERENCE
SSX T1,MS.MEM ;THE PAGTAB SECTION
MOVSI T3,CONTGB ;THE BIT WE LIKE
SETCT1: IORM T3,PAGTAB(T1) ;LIGHT IT FOR THIS PAGE
SOJLE T2,CPOPJ## ;RETURN IF NO MORE PAGES TO MARK
AOJA T1,SETCT1 ;ELSE LOOP FOR THE NEXT PAGE
SUBTTL ROUTINES TO SET/CLEAR CACHE BITS
;ROUTINE TO SET OR CLEAR CACHE BITS FOR A RANGE OF EXEC ADDRESSES.
; THE RANGE IS C(T1)R THROUGH C(T2)R INCLUSIVE.
; USES ALL T ACS, AC U WITHOUT RESTORING THEM. ORIGINAL ARGUMENTS
; IN T1 AND T2 ARE LOST.
; ARGUMENTS MUST NOT BE IN PER-PROCESS SPACE
; WHEN CALLING CCTRNS, THE SECTION MAP SHOULD BE ADDRESSABLE VIA
; EXEC VIRTUAL ADDRESS .EUPMP (SEE CALL AT CLRCC1-4).
IFN FTMP,<
CCTRNG: TDZA T3,T3 ;NOTE "ADDRESS RANGE" ENTRY
CCTRNS: SETO T3, ;NOTE "ENTIRE SECTION" ENTRY
SE1ENT ;FOR PAGTAB REFERENCES
PUSHJ P,SAVE1## ;NEED P1
MOVE P1,[TLO T2,TNCSHB] ;SET TEMPORARY
MOVE U,NCPRUN## ;GET NUMBER OF RUNNABLE CPUS
CAIN U,1 ;SKIP IF MORE THAN 1 RUNNABLE CPU
SKIPA U,[TLO T1,(PM.CSH)] ;SET CACHE BIT
MOVE U,[TLZ T1,(PM.CSH)] ;CLEAR CACHE BIT
JUMPE T3,CCBRN1 ;GO IF "ADDRESS RANGE" ENTRY
MOVEI T1,0 ;STARTING PAGE NUMBER
MOVEI T2,^D511 ;HIGHEST PAGE NUMBER
MOVEI T4,.EUPMP ;ADDRESS OF ADDRESSABLE SECTION MAP
JRST CCBRN2 ;GO DO THE ENTIRE SECTION
>; END IFN FTMP
CSBRNG: SKIPA U,[TLO T1,(PM.CSH)] ;CLEAR CACHE BIT
CCBRNG: MOVE U,[TLZ T1,(PM.CSH)] ;CLEAR CACHE BIT
IFN FTMP,<
SE1ENT ;FOR PAGTAB REFERENCES
PUSHJ P,SAVE1##
MOVE P1,[TLZ T2,TNCSHB] ;CLEAR TEMPORARY BIT
>; END IFN FTMP
CCBRN1: LSH T1,W2PLSH ;CONVERT TO PAGES
LSH T2,W2PLSH
MOVEI T4,(T1) ;COPY STARTING PAGE NUMBER
ADD T4,.CPMAP## ;ADD IN ADDRESS OF S0/1 MAP
CCBRN2: HRRZ T3,T1 ;SAVE STARTING VIRTUAL PAGE
HRLI T4,(POINT 36,0) ;SET UP BYTE POINTER TO SECTION MAP
CCBRN3: ILDB T1,T4 ;GET CONTENTS OF SLOT
JUMPE T1,CCBRN4
XCT U ;SET OR CLEAR CACHE BIT ACCORDINGLY
DPB T1,T4 ;AND PUT IT IN MAP
IFN FTMP,<
ANDI T1,17777 ;GET PHYSICAL PAGE NUMBER
SSX T1,MS.MEM ;SECTION NUMBER
EXCH T2,PAGTAB(T1) ;GET ENTRY, SAVE T2
TLNE T2,MONTRB ;A MONITOR PAGE
XCT P1 ;YES, SET/CLEAR TEMPORARY UNCACHED
EXCH T2,PAGTAB(T1) ;STORE NEW SETTING, RESTORE T2
>; END IFN FTMP
CCBRN4: CAIGE T3,(T2) ;DID WE JUST DO LAST PAGE?
AOJA T3,CCBRN3 ;LOOP, WE HAVE MORE TO DO.
POPJ P, ;YES, BYE.
SUBTTL WRITE LOCK MONITOR CODE SEGMENTS
;ROUTINE TO TURN OFF PM.WRT IN CODE SEGMENT PAGES.
;ALL OTHER PAGES ARE LEFT WRITE-ENABLED.
WRTLOK: SKIPA DEBUGF## ;PATCH TO SKIPGE IF DEBUGGING WITH MONITOR
; WRITE-ENABLED
POPJ P, ;LEAVE THINGS ALONE
MOVEI T1,WRTLKA ;GET ADDRESS OF ROUTINE
PJRST CPUAPP## ;APPLY OVER ALL CPUS
WRTLKA: MOVE T1,.CPEPT##-.CPCDB##(P1) ;GET ADDRESS OF EPT
HRRZ T2,SECTAB(T1) ;GET PAGE NUMBER OF SECTION 0 MAP
PUSHJ P,WRTLKB ;TWIDDLE THE BITS IN THE PAGE MAP
IFN FTXMON,<
HRRZ T2,SECTAB+<(MS.HGH)>(T1) ;GET PAGE NUMBER OF SECTION 2 MAP
PUSHJ P,WRTLKB ;TWIDDLE THE BITS IN THE PAGE MAP
>; END IFN FTXMON
POPJ P, ;RETURN
WRTLKB: LSH T2,P2WLSH ;CONVERT PAGE NUMBER TO AN ADDRESS
LDB T3,[POINT 14,SYSSIZ##,26] ;GET NUMBER OF LOW SEGMENT PAGES
ADD T2,T3 ;SKIP LOW SEGMENT PAGES (ALWAYS WRITABLE)
MOVNS T3 ;NEGATE THE COUNT
ADDI T3,HLCSAD##/PAGSIZ ;NUMBER OF ENTRIES IN THE MAP TO CONSIDER
WRTLK1: MOVE T4,(T2) ;GET AN ENTRY
TLZN T4,(PM.SWB) ;SKIP IF PAGE SHOULD BE WRITE ENABLED
TLZ T4,(PM.WRT) ;CLEAR WRITE ENABLE
MOVEM T4,(T2) ;SAVE THE PAGE ENTRY AWAY
SOJLE T3,CPOPJ## ;QUIT WHEN ALL ENTRIES HAVE BEEN DONE
AOJA T2,WRTLK1 ;GET NEXT ENTRY
SUBTTL SET UP INTERVAL TIMER TO GIVE CLOCK TICKS
;SETUP INTERNAL TIMER ON KL10 TO MIMIC CLOCKS OF EARLIER CPUS.
ONCINT:
IFN FTKL10,<
CONO MTR,MO.TOF!MO.CTB ;TURN OFF TIMER, CLEAR TIME BASE
MOVE T1,.CPEPT## ;GET ADDRESS OF EPT
MOVE T1,.EPTII(T1) ;GET ADDRESS OF XPCW BLOCK
MOVEM T1,ONCINJ ;SAVE FOR LATER XJEN
MOVEI T2,ONCIN0 ;GET ADDRESS OF INTERRUPT ROUTINE
MOVEM T2,3(T1) ;SALT AWAY IN TM'N'INT BLOCK
CONO MTR,MO.TON!APRCHN## ;TURN ON TIMER
MOVEI T2,^D1666+TO.SIT+TO.CTD ;WORD TO KEEP TIMER GOING
MOVE T1,STATES## ;GET STATES
TLNE T1,(ST.CYC) ;50 HZ?
MOVEI T2,^D2000+TO.SIT+TO.CTD ;50 HZ WORD TO KEEP TIMER GOING
MOVEM T2,ONCKLT ;CONO TIM,@ONCKLT STARTS TIMER GOING AGAIN
CONO TIM,TO.CIT(T2) ;CLEAR INTERNAL TIMER & START FIRST TIME
CONO PI,PI.ON!PI.TNP!<1_<7-APRCHN##>> ;MAKE SURE WE GET INTERRUPTS
POPJ P, ;RETURN
>;END IFN FTKL10
IFN FTKS10,<
WRAPR SP.SSF!SP.ITI ;TURN ON INTERVAL TIMER
MOVEI T2,^D17*10000 ;60HZ
MOVE T1,STATES ;GET STATES
TLNE T1,(ST.CYC) ;50HZ?
MOVEI T2,^D20*10000 ;YES
WRINT T2 ;SET UP INTERVAL REGISTER
POPJ P, ;RETURN
>;END IFN FTKS10
IFN FTKL10,<
;ROUTINE CALLED ON A CLOCK INTERRUPT
ONCIN0: SETOM .CPTIM## ;NOTICE CLOCK HAS TICKED
AOS APRTIM ;COUNT A USEFUL VARIABLE
CONO TIM,@ONCKLT ;CLEAR INTERNAL TIMER DONE AND START UP AGAIN
XJEN @ONCINJ ;DISMISS THE INTERRUPT
ONCINJ: BLOCK 1 ;ADDRESS OF INTERVAL TIMER XPCW BLOCK
>; END IFN FTKL10
SUBTTL CHECK CRASH DATE/TIME CHECKSUM
;ROUTINE TO CHECK DATE/TIME CHECKSUM
;RETURNS CRASH DATE IN T4
CHKDCS: HLRZ T4,CRSDTM
HRRZ T2,CRSDTM
ADD T2,T4 ;ADD DATE AND TIME
HLRZ T3,CRSWHY
ADD T2,T3 ;PLUS STOPCD NAME
HRRZ T3,CRSSTS
ADD T2,T3
ADDI T2,507601 ;PLUS MAGIC CONSTANT
HRRZ T3,CRSCHK ;GET CHECKSUM COMPUTED BY COMMON
CAIN T3,(T2) ;MATCH?
AOS (P)
POPJ P,
SUBTTL SETUP LOWER CORE LOCATIONS
SLCLDS:
IFN FTKL10,<
SKIPE [M.CPU##-1] ;IF MORE THAN 1 CPU,
SKIPA T1,[JRST SYSTOP##] ;LET WARM RESTART=J407
MOVE T1,[JRST APRWRS##] ;WARM RESTART INSTRUCTION
MOVEM T1,WRSINS ;STORE IN WARM RESTART LOCATION
>; END IFN FTKL10
IFN FTMP,<
MOVE T1,[JRST APRRES##] ;POWER FAIL-AUTO-RESTART INSTR.
>; END IFN FTMP
IFE FTMP,<
MOVE T1,[HALT APRRES##] ;HALT IF NOTHING SAVED
>; END IFE FTMP
MOVEM T1,ARSLOC ;STORE IN AUTO-RESTART LOCATION
MOVE T1,[XPCW @.CPKAF##]
MOVEM T1,KAFLOC ;STORE IT IN RIGHT SPOT
MOVE T2,.CPMAP## ;GET ADDRESS OF SECTION 0 MAP
PUSH P,.EUPMP/PAGSIZ(T2) ;SAVE TEMPORARY MAP SLOT
MOVSI T1,(<PM.DCD>B2+PM.WRT) ;MAKE HARDWARE LOCS 0-17 ADDRESSABLE
MOVEM T1,.EUPMP/PAGSIZ(T2) ; VIA .EUPMP - .EUPMP+17
CLRPT .EUPMP ;MAKE NEW MAPPING VISIBLE
MOVEI 17,.EUPMP ;MOVE HARDWARE AC'S INTO SHADOW AC'S TO CLEAR PARITY
BLT 17,.EUPMP+17 ;STOP WITH SHADOW AC 17
MOVE T1,.CPMAP## ;GET ADDRESS OF SECTION 0 MAP
POP P,.EUPMP/PAGSIZ(T1) ;RESTORE TEMPORARY MAP SLOT
CLRPT .EUPMP ;MAKE OLD MAPPING VISIBLE
POPJ P, ;RETURN
SUBTTL SET UP FREE CORE AND BITMAP
SETFPT: MOVE T1,LOWLIM## ;GET HIGHEST ADDRESS IN LOW SEGMENT
AOS T1 ;MAKE IT FIRST ADDRESS PAST LOW SEGMENT
MOVE T2,SYSSIZ## ;CURRENT END OF ALLOCATED LOW SEGMENT CORE
MOVEM T2,FREPTR## ;FREE CORE BITMAP GOES HERE
SUB T1,T2 ;COMPUTE WORDS IN BETWEEN
IDIVI T1,^D36*4 ;COMPUTE NUMBER OF BITMAP WORDS NEEDED
;DON'T ROUND SO FREPTR WON'T DESCRIBE MORE THAN
; THE SPACE UP TO LOWLIM
MOVE T3,T1 ;GET A COPY
IDIVI T3,^D36*4 ;COMPUTE NUMBER OF WORDS USED BY BITMAP
SKIPE T4 ;IF A REMAINDER,
AOS T3 ; ROUND UP
SUB T3,T1 ;SUBTRACT THAT FROM SIZE OF POOL
HRLM T3,FREPTR## ;SET UP AOBJN POINTER TO FREE CORE BITMAP
MOVMS T3 ;GET THE SIZE OF THE BITMAP
ADD T3,FREPTR## ;GET ADDRESS OF START OF FREE CORE
HRRZM T3,LOCORE## ;SET UP LOCORE
MOVE T1,LOWLIM## ;*** GET HIGHEST ADDRESS-1
AOS T1 ;*** BUMP IT
MOVEM T1,SYSSIZ## ;*** FAKE OUT SYSTAT AND FRIENDS
MOVE T1,FREPTR## ;GET POINTER TO BITMAP
SETZM (T1) ;MAKE SURE IT IS ZEROED
AOBJN T1,.-1
POPJ P, ;RETURN
SUBTTL ONCE-ONLY/BOOTSTRAP INTERFACE -- BUILD THE SYSTEM LISTS
BLDSSL::SE1ENT ;ENTER SECTION ONE
MOVEI T1,.BTSSL ;OFFSET
SKIPE PRESSL ;USING THE PRESERVED SSL?
PUSHJ P,BTDATA## ;BOOTSTRAP AVAILABLE?
POPJ P, ;NO
MOVEI T3,[ASCIZ/system search list/]
PUSHJ P,SETENT ;SET POINTERS
BLDSS1: PUSHJ P,NXTENT ;GET NEXT ENTRY
JRST BLDSS2 ;NO MORE DATA--ALL STRUCTURES VALID
PUSHJ P,FNSTR## ;DOES THIS STRUCTURE EXIST?
PUSHJ P,BADSTR ;NO--COMPLAIN TO OPERATOR
JRST BLDSS1 ;GO CHECK OUT THE NEXT STRUCTURE
BLDSS2: PUSHJ P,RSTENT ;RESET POINTERS
SKIPN PRECNT ;ANY ENTRIES FOUND?
AOS PREERR ;NO--CALL THIS AN ERROR
SKIPN PREERR ;ANY ERRORS?
JRST BLDSS3 ;NO
PUSHJ P,BLDDSK ;TELL OPERATOR WE WILL USE DISK DATA BASE
POPJ P, ;GIVE UP
BLDSS3: HLRZ T1,SYSSTR## ;POINT TO START OF STR DB CHAIN
BLDSS4: SETOM STRSRC##(T1) ;EMPTY THE SSL
HLRZ T1,STRSYS##(T1) ;GET NEXT STR DB
JUMPN T1,BLDSS4 ;LOOP
BLDSS5: PUSHJ P,NXTENT ;GET NEXT ENTRY
JRST CPOPJ1## ;RETURN
PUSHJ P,FNSTR## ;FIND THE STR DB
JRST BLDSS5 ;CAN'T HAPPEN
HRRZ T2,BLDPTR ;GET RELATIVE OFFSET IN TABLE
MOVEM T2,STRSRC##(P2) ;MAKE THAT THE POSITION IN THE SSL
JRST BLDSS5 ;LOOP FOR THE NEXT STRUCTURE
BLDASL::SE1ENT ;ENTER SECTION ONE
MOVEI T1,.BTASL ;OFFSET
SKIPE PREASL ;USING THE PRESERVED ASL?
PUSHJ P,BTDATA## ;BOOTSTRAP AVAILABLE?
POPJ P, ;NO
MOVEI T3,[ASCIZ/active swapping list/]
PUSHJ P,SETENT ;SET POINTERS
BLDAS1: PUSHJ P,NXTENT ;GET NEXT ENTRY
JRST BLDAS2 ;NO MORE DATA--ALL UNITS VALID
MOVE T2,T1 ;PUT NAME IN PROPER PLACE
PUSHJ P,FNDUNI ;DOES THIS UNIT EXIST?
JRST [PUSHJ P,BADUNI ;NO--COMPLAIN TO OPERATOR
JRST BLDAS1] ;GO CHECK OUT THE NEXT UNIT
LDB T1,UNYK4S## ;GET SWAPPING SPACE ALLOCATED ON UNIT
SKIPG T1 ;HAVE ANY?
PUSHJ P,BLDSWP ;NO--COMPLAIN TO OPERATOR
JRST BLDAS1 ;GO CHECK OUT THE NEXT UNIT
BLDAS2: PUSHJ P,RSTENT ;RESET POINTERS
SKIPN PRECNT ;ANY ENTRIES FOUND?
AOS PREERR ;NO--CALL THIS AN ERROR
SKIPN PREERR ;ANY ERRORS?
JRST BLDAS3 ;NO
PUSHJ P,BLDDSK ;TELL OPERATOR WE WILL USE DISK DATA BASE
POPJ P, ;GIVE UP
BLDAS3: HLRZ T1,SYSUNI## ;POINT TO START OF UDB CHAIN
BLDAS4: SETOM UNISUN(T1) ;EMPTY THE ASL
HLRZ T1,UNISYS(T1) ;GET NEXT UDB
JUMPN T1,BLDAS4 ;LOOP
BLDAS5: PUSHJ P,NXTENT ;GET NEXT ENTRY
JRST CPOPJ1## ;DONE
MOVE T2,T1 ;PUT NAME IN PROPER PLACE
PUSHJ P,FNDUNI ;FIND THE UDB
JRST BLDAS5 ;CAN'T HAPPEN
HRRZ T2,BLDPTR ;GET RELATIVE OFFSET IN TABLE
MOVEM T2,UNISUN(U) ;MAKE THAT THE POSITION IN THE ASL
JRST BLDAS5 ;LOOP FOR THE NEXT UNIT
FNDUNI: HLRZ U,SYSUNI## ;GET FIRST UNIT DATA BLOCK IN SYSTEM
FNDUN1: CAME T2,UNIHID(U) ;ACCEPT MATCH ON UNIT ID
CAMN T2,UDBNAM(U) ;MATCH?
JRST CPOPJ1## ;YES - SKIP RETURN
HLRZ U,UNISYS(U) ;GET NEXT UNIT DATA BLOCK ADR. IN SYSTEM
JUMPN U,FNDUN1 ;REPEAT IF THERE IS ONE
POPJ P, ;NONE FOUND - NON SKIP RETURN
BLDSDL::SE1ENT ;ENTER SECTION ONE
MOVEI T1,.BTSDL ;OFFSET
SKIPE PRESDL ;USING THE PRESERVED SDL?
PUSHJ P,BTDATA## ;BOOTSTRAP AVAILABLE?
POPJ P, ;NO
MOVEI T3,[ASCIZ/system dump list/]
PUSHJ P,SETENT ;SET POINTERS
BLDSD1: PUSHJ P,NXTENT ;GET NEXT ENTRY
JRST BLDSD2 ;NO MORE DATA--ALL STRUCTURES VALID
PUSHJ P,FNSTR## ;DOES THIS STRUCTURE EXIST?
PUSHJ P,BADSTR ;NO--COMPLAIN TO OPERATOR
JRST BLDSD1 ;GO CHECK OUT THE NEXT STRUCTURE
BLDSD2: PUSHJ P,RSTENT ;RESET POINTERS
SKIPN PRECNT ;ANY ENTRIES FOUND?
AOS PREERR ;NO--CALL THIS AN ERROR
SKIPN PREERR ;ANY ERRORS?
JRST BLDSD3 ;NO
PUSHJ P,BLDDSK ;TELL OPERATOR WE WILL USE DISK DATA BASE
POPJ P, ;GIVE UP
BLDSD3: HLRZ T1,SYSSTR## ;POINT TO START OF STR DB CHAIN
BLDSD4: SETOM STRSDL##(T1) ;EMPTY THE SDL
HLRZ T1,STRSYS##(T1) ;GET NEXT STR DB
JUMPN T1,BLDSD4 ;LOOP
BLDSD5: PUSHJ P,NXTENT ;GET NEXT ENTRY
JRST CPOPJ1## ;DONE
PUSHJ P,FNSTR## ;FIND THE STR DB
JRST BLDSD5 ;CAN'T HAPPEN
HRRZ T2,BLDPTR ;GET RELATIVE OFFSET IN TABLE
MOVEM T2,STRSDL##(P2) ;MAKE THAT THE POSITION IN THE SDL
JRST BLDSD5 ;LOOP FOR THE NEXT STRUCTURE
SUBTTL ONCE-ONLY/BOOTSTRAP INTERFACE -- MISCELLANEOUS ROUTINES
;SET UP TO ACCESS BOOTSTRAP VECTOR ENTRIES
;CALL: MOVE T1, LENGTH OF TABLE
; MOVE T2, TABLE ADDRESS
; MOVE T3, IDENTIFYING TEXT (OR -1 IF NOT TO STORE ANY)
; PUSHJ P,SETENT
; <RETURN>
SETENT: ADJSP T1,-1 ;PREDECREMENT POINTER
SUBI T2,1 ;PREDECREMENT ADDRESS
MOVEM T1,BLDPTR ;SAVE POINTER
MOVEM T1,SAVPTR ;MAKE A COPY
MOVEM T2,BLDTBL ;SAVE ADDRESS
MOVEM T2,SAVTBL ;MAKE A COPY
SKIPL T3 ;STORE BUILD TEXT?
MOVEM T3,BLDTXT ;YES
SETZM PRECNT ;CLEAR COUNT OF ENTRIES FOUND
SETZM PREERR ;CLEAR ERROR FLAG
POPJ P, ;RETURN
;RESET THE VECTOR ENTRY POINTERS
;CALL: PUSHJ P,RSTENT
; <RETURN>
RSTENT: MOVE T1,SAVPTR ;GET SAVED POINTER
MOVEM T1,BLDPTR ;RESET IT
MOVE T1,SAVTBL ;GET SAVED ADDRESS
MOVEM T1,BLDTBL ;RESER IT
POPJ P, ;RETURN
;RETRIEVE THE NEXT ENTRY
;CALL: PUSHJ P,NXTENT
; <NON-SKIP> ;RAN OUT OF DATA
; <SKIP> ;T1 CONTAINS THE ENTRY
NXTENT: MOVE T1,BLDPTR ;GET AOBJN POINTER
AOBJP T1,CPOPJ## ;RETURN IF DONE
MOVEM T1,BLDPTR ;UPDATE
AOS BLDTBL ;ADVANCE POINTER
SKIPN T1,@BLDTBL ;GET NEXT ENTRY
JRST NXTENT ;EMPTY SLOT--TRY AGAIN
AOS PRECNT ;COUNT THE ENTRY
JRST CPOPJ1## ;RETURN
;TELL THE OPERATOR THE PRESERVED DATA CANNOT BE USED
;CALL: PUSHJ P,BLDDSK
; <RETURN>
BLDDSK: MOVEI T1,[ASCIZ /[Rebuilding the /]
PUSHJ P,ICONM ;TYPE TEXT
MOVE T1,BLDTXT ;GET TEXT
PUSHJ P,CONMES## ;TYPE IT
MOVEI T1,[ASCIZ/ from the HOM blocks]
/]
PUSHJ P,CONMES## ;TYPE TEXT
PJRST CRLFOP ;APPEND A CRLF AND RETURN
;TELL THE OPERATOR THAT A STRUCTURE OR LOGICAL UNIT IS MISSING
;CALL: MOVE T1, SIXBIT NAME
; PUSHJ P,BADSTR/BADUNI
; <RETURN>
BADSTR: SKIPA T2,[[ASCIZ/%Structure /]]
BADUNI: MOVEI T2,[ASCIZ/%Logical unit /]
AOS PREERR ;FLAG THE ERROR
PUSH P,T1 ;SAVE STRUCTURE OR LOGICAL UNIT NAME
MOVE T1,T2 ;POINT TO TEXT
PUSHJ P,ICONM ;TYPE IT
POP P,T2 ;GET STRUCTURE NAME BACK
PUSHJ P,PRNAME## ;TYPE IT
MOVEI T1,[ASCIZ/ missing from the /]
PUSHJ P,CONMES## ;TYPE TEXT
MOVE T1,BLDTXT ;GET IDENTIFIER
PUSHJ P,CONMES## ;TYPE IT
PJRST CRLFOP ;APPEND A CRLF AND OUTPUT
;TELL THE OPERATOR A UNIT HAS NO SWAPPING SPACE ALLOCATED
;CALL: MOVE U, UDB ADDRESS
; PUSHJ P,BLDSWP
; <RETURN>
BLDSWP: AOS PREERR ;FLAG THE ERROR
MOVEI T1,[ASCIZ/%No swapping space allocated on /]
PUSHJ P,ICONM ;TYPE TEXT
MOVE T2,UDBNAM(U) ;GET PHYSICAL UNIT NAME
PUSHJ P,PRNAME## ;TYPE IT
SKIPN UNIHID(U) ;HAVE A UNIT-ID?
PJRST CRLFOP ;NO--APPEND A CRLF AND OUTPUT
MOVEI T1,[ASCIZ/ (/] ;SEPARATE FROM
PUSHJ P,CONMES## ; PHYSICAL NAME
MOVE T2,UNIHID(U) ;GET LOGICAL UNIT NAME
PUSHJ P,PRNAME## ;TYPE IT
MOVEI T1,[ASCIZ /)/] ;TERMINATE
PUSHJ P,CONMES## ;TYPE TEXT
PJRST CRLFOP ;APPEND A CRLF AND OUTPUT
SUBTTL CORE ALLOCATOR ROUTINES
;ROUTINE TO ALLOCATE BIT MAP CORE
;CALL: MOVE T1, NUMBER OF WORDS
; PUSHJ P, INICORE
; <RETURN> ;T1 UNCHANGED, T2 HAS ADDRESS
;
;ALL ACS PRESERVED
INICOR::PUSH P,T1 ;SAVE NUMBER OF WORDS
MOVEI T2,(T1) ;COPY WORD COUNT
PUSH P,[EXP 0] ;RESERVE SPACE ON STACK
PUSH P,T3 ;SAVE T3
PUSH P,T4 ;SAVE T4
PUSHJ P,GETWDS## ;ALLOCATE CORE
STOPCD .+1,STOP,NCS, ;++ NO CORE AT SYSINI TIME
MOVEM T1,-2(P) ;SAVE START ADDRESS
SETZM (T1) ;CLEAR FIRST WORD
MOVEI T2,(T1) ;MAKE A COPY
HRLI T1,1(T1) ;ADDR+1
MOVSS T1 ;MAKE A BLT POINTER
ADD T2,-3(P) ;COMPUTE END OF BLT
BLT T1,-1(T2) ;CLEAR CORE
POP P,T4 ;RESTORE T4
POP P,T3 ;RESTORE T3
POP P,T2 ;RESTORE ADDRESS
POP P,T1 ;RESTORE NUMBER OF WORDS
POPJ P, ;RETURN
SUBTTL DATA STORAGE
DEVICE: BLOCK 1 ;MONITOR BOOTSTRAP DEVICE
FNAME: BLOCK 1 ;MONITOR BOOTSTRAP FILE NAME
FEXT: BLOCK 1 ;MONITOR BOOTSTRAP EXTENSION
PPN: BLOCK 1 ;MONITOR BOOTSTRAP PPN
SFDLST: BLOCK 5 ;MONITOR BOOTSTRAP SFDS
PRESSL::BLOCK 1 ;NON-ZERO IF USING PRESERVED SSL
PREASL::BLOCK 1 ;NON-ZERO IF USING PRESERVED ASL
PRESDL::BLOCK 1 ;NON-ZERO IF USING PRESERVED SDL
PRECNT: BLOCK 1 ;COUNT OF ENTRIES FOUND
PREERR: BLOCK 1 ;NON-ZERO IF AN ERROR DETECTED
BLDTXT: BLOCK 1 ;ADDRESS OF IDENTIFYING TEXT
BLDTBL: BLOCK 1 ;ADDRESS OF TABLE IN BOOTSTRAP VECTOR
BLDPTR: BLOCK 1 ;AOBJN POINTER TO TABLE
SAVTBL: BLOCK 1 ;SAVED ADDRESS OF TABLE IN BOOTSTRAP VECTOR
SAVPTR: BLOCK 1 ;SAVED AOBJN POINTER TO TABLE
TXTBUF::BLOCK <TXTLEN==30> ;RANDOM TEXT BUFFER
TXTPTR: BLOCK 1 ;BYTE POINTER TO TXTBUF
TXTCNT: BLOCK 1 ;BYTE COUNT
CHKDAT: BLOCK 1 ;LOCAL STORAGE FOR DATE (12 BIT)
CRSDAY: BLOCK 1 ;DATE OF LAST CRASH
FETFLG: BLOCK 1 ;-1 IF GOT DATE FROM A FE
CHGFLG::BLOCK 1 ;CHANGE RATHER THAN DEFINE
GOFLAG: BLOCK 1 ;NON-ZERO IF "GO" TYPED
MMTSIZ: BLOCK 1 ;SIZE OF MEMORY MANAGEMENT TABLES (IN WORDS)
IGNORE::BLOCK 1 ;/NOERROR FLAG
;CONSTANTS
ONCTIP: 0 ;TYPE-IN POINTER
ONCTCH::0 ;LAST CHAR TYPED IN.
ONCTOP: 0 ;TYPE-OUT POINTER
ONCCNT: 0 ;COUNTER FOR TYO
ALTMFL::0 ;ALTMODE TYPED FLAG
SAWCMT: 0 ;COMMENT CHARACTER SEEN FLAG
LINEP: POINT 7,LINBUF ;INPUT AND OUTPUT LINE BUFFER
LINBUF: BLOCK <BUFLEN==150> ;LINE BUFFER (LONG ENOUGH FOR WHY RELOAD)
ONCTSZ==<BUFLEN*5>-1 ;CHARACTERS WHICH FIT IN OUTPUT BUFFER
IFN FTMP,<
CPUTMS: XWD 3,0 ;TIME TO WAIT FOR A CPU TO START PROCESSING
CPUTIM: XWD <3*ONCTIM##>,0 ;NORMAL HUNG CPU TIMER
CPUSUB::BLOCK 1 ;ADDR OF SUBROUTINE TO EXECUTE
CPUNUM::BLOCK 1 ;TARGET CPU NUMBER
CPUACS::BLOCK 20 ;ACS
CPUFLG::BLOCK 1 ;SUCESS/FAILURE FLAG
CPUASF: EXP 0 ;BIT MASK OF CPUS DOING ASYNCHRONOUS ONCE IO
> ;END IFN FTMP
SUBTTL THE END
RADIX 8
XLIST ;LITERALS
LIT
LIST
VAR ;JUST IN CASE
SYSEND::END ;END OF SYSINI