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, ;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,[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, ;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,-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, ;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,-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,>(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,(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,(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, ;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,(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, ;FIXUP SYSORG TO ACCOUNT FOR HIDDEN SYMBOL ; TABLE, MOVE SYMBOL TABLE TO HIGH MEMORY IFN FTXMON, ;SET UP EXEC DATA VECTOR IFE FTXMON, ;MAP BOOT INTO THE MONITOR'S ADDRESS SPACE PUSHJ P,BSTRNG ;BUILD BOOTS COMMAND FOR AUTO-RELOAD IFN FTKL10, ;CLEAN MEMORY CONTROLLERS IFN FTXMON, ;GET INTO SECTION 1 SO CAN LOOK AT THINGS HIGHIN: IFN FTXMON, ;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,-> ;-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, ;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,(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,(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,(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,[*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, ;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, ;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, ;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,-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,) X (PARITY,) X (POWER,) X (STATIC,) X (HARDWA,) X (NXM,) X (HALT,) X (LOOP,) X (HUNG,) ;;PREVIOUS NON-TIMESHARED USE OF SYSTEM: X (PM,) X (CM,) X (SA,) ;;DIFFERENT MONITORS X (NEW,) X (SCHED,) ;;OPERATOR DOESN'T KNOW OR WON'T TELL US X (OTHER,) > ;END DEFINE OPTINS DEFINE X (NAME,TEXT),> WHYTAB: OPTINS WHYLEN==.-WHYTAB ;LENGTH DEFINE X (NAME,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, ;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,) X (DEFINE,.DEFIN,) X (DESTROY,.DESTR##,) X (DISSOLVE,.DISSO##,) X (GO,.GO,) X (NOINITIA,.NOINI,) X (REFRESH,.REFRE##,) X (SHOW,.SHOW,) >; END DEFINE OPTINS ;SWITCHES FOR START-UP OPTIONS DEFINE SWTCHS,< X (NOASL,NOASL,) X (NOCOPY,NOCOPY,) IFN FTKL10,< X (NOPRIMARY,NOPRIM,) >;; END IFN FTKL10 X (NOSDL,NOSDL,) X (NOSSL,NOSSL,) X (NOVALIDATE,NOVALI,) X (STANDALONE,STAND,) >; END DEFINE SWTCHS ;STARTUP OPTION COMMAND NAMES DEFINE X (NAME,ADDR,HELP),> OPTTAB: OPTINS OPTLEN==.-OPTTAB ;LENGTH OF START-UP OPTIONS TABLE ;STARTUP OPTION COMMAND DISPATCH DEFINE X (NAME,ADDR,HELP), OPTADR: OPTINS ;STARTUP OPTION COMMAND HELP TEXT DEFINE X (NAME,ADDR,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),> SWTTAB: SWTCHS SWTLEN==.-SWTTAB ;LENGTH OF SWITCH TABLE ;STARTUP OPTION SWITCH DISPATCH DEFINE X (NAME,ADDR,HELP), SWTADR: SWTCHS ;STARTUP OPTION SWITCH HELP TEXT DEFINE X (NAME,ADDR,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),> CHGTAB: CHGOPT CHGLEN==.-CHGTAB DEFINE X (NAME,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, >; END DEFINE MONTH. MONTHS: MONTH. () 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),> DEFTAB: DEFOPT DEFLEN==.-DEFTAB DEFINE X (NAME,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),> SHWTAB: SHWOPT SHWLEN==.-SHWTAB DEFINE X (NAME,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,-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, ;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, ;KL10 PI BITS IFN FTKS10, ;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, ;INITIALIZE PI CHANNELS AND RT DEVICES IFN FTLOCK, ;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, ;GO INIT THE KMC/DUP LINES IFN FTNET,< ANFSTR: PUSHJ P,NETINI## ;INITIALIZE ANF-10 >; END IFN FTNET FEKSTR: IFN FTENET, ;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, ;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, ;TURN ON ALL PI CHANNELS (ENABLE MEM PARITY) IFN FTKL10, ;INITIALIZE PRIMARY PROTOCOL IFN FTMP, ;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,[B2+PM.WRT+PM.PUB+] ;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, ;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,(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,(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,(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,(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,(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,(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,+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,(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,[B2+PM.WRT+PM.PUB+PM.KPM+PM.CSH] ;GET CODE MAP BITS NZSCGT: MOVSI T3,(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 ; ; 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, ;APR CLOCK TICKED? IFN FTKS10, ;APR CLOCK TICKED? POPJ P, ;NO IFN FTKL10, ;YES, WE'VE NOTICED, CLEAR THE FLAG IFN FTKS10, ;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, ;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,(B2^!B2) ;ANYTHING BESIDES DIRECT POINTER? TLNN T2,(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,(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 ; 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 ; 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 ; ;RAN OUT OF DATA ; ;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 ; 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 ; 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 ; 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 ; ;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 ;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 ;LINE BUFFER (LONG ENOUGH FOR WHY RELOAD) ONCTSZ==-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