IFE FTDISK+FTRC10+2,< TITLE ONCEB - ONCE ONLY OPERATOR DIALOGUE AND IO DEVICE INIT.(BURROUGHS DISK) > IFE FTDISK+FTRC10+1,< TITLE ONCED - ONCE ONLY OPERATOR DIALOGUE AND IO DEVICE INIT.(DATA PRODUCTS DISK) > IFE FTDISK+FTRC10+0,< TITLE ONCEN - ONCE ONLY OPERATOR DIALOGUE AND IO DEVICE INIT.(NO DISK) > SUBTTL T. HASTINGS/RCC/CHW TS 04 JUN 69 V414 XP VONCE,414 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP INTERNAL FTRC10 ;THIS SINGLE SOURCE FILE MAY BE ASSEMBLED FOR EITHER ; THE NEW PDP-10 (BURROUGHS) DISK, OR THE OLD PDP-6 (DATA ; PRODUCTS) DISK (FTRC10 = -1 OR 0, RESPECTIVELY, IN S). ;"ONCE" SHOULD BE THE LAST LOADED PROGRAM BEFORE SYSMAK AND DDT ;THUS IF IT OVERFLOWS INTO THE USER AREA NO HARM IS DONE. ;ONCE ONLY CODE IS DIVIDED INTO 3 PARTS ; 1. MANDITORY ONCE ONLY(LINKSR) - NO CTY NEEDED ; (GOOD REPEATED STARTUPS DURING DEBUGGING ; 2. USUAL SHROT ONCE ONLY CODE(ONCE) - CTY FOR DATE AND TIME ; 3. OPTIONAL ONCE ONLY CODE - CTY DIALOG TO CHANGE MONITOR ; OR REFRESH DISK(ALT-MODE INSTEAD OF CR AFTER TIME) ;INITIALIZE PRIORITY CHANNELS AND SETUP INTERRUPT SERVICE ROUTINE CHAIN T=TAC ;DEFINE ACCUMULATOR T ;LINK TO SERVICE ROUTINES INTERNAL LINKSR,FT2REL EXTERNAL JOBSYM,JOBPFI,XJBPFI LINKSR: 0 ;CALLED WITH JSR FROM SYSINI MOVSI T,JOBPFI ;SET LH OF XJBPFI WITH JOBPFI MOVEM T,XJBPFI ;LOADER DORES NOT HANDLE GLOBALS IN LH IFN FT2REL,< JSR TSTREG ;GO TEST IF TWO RELOC REGISTERS EXIST > ;HIGHEST LOC. IN JOB AREA PROTECTED FROM IO ;MOVE SYMBOL TABLE UP IN MEMORY ;EXEC MUST BE LOADED IN 15K OR LESS IF GOING INTO 16K MACHINE ;FIRST FIND THE FIRST LOCATION OF NON-EXISTENT MEMORY EXTERN DDTSYM SETZB DAT,IOS ;(ACCUMULATOR IOS MUST ALSO BE CLEARED FOR SCNSER) CONO APR,NXM ;CLEAR NON-EX MEM FLAG MOVEI TAC,^D256 ;IN CASE MEMORY HAS NO NON EXISTANT BANKS ADDI DAT,2000 ;TRY NEXT 1K BLOCK MOVE TAC1,(DAT) ;REFERENCE THIS LOCATION CONSO APR,NXM ;NON-EXISTENT? SOJG TAC, .-3 ;NO,KEEP LOOKING AS LONG AS NOT TOP OF MEMORY SUBI DAT,700 ;MAKE ROOM FOR TENDUMP AT TOP OF CORE JSR MOVSTP ;MOVE DDT SYMBOL TABLE POINTER TO LOWER CORE ; (DDTSYM=36) WHERE EXEC DDT EXPECTS IT. ; IF NOT ALREADY MOVED THERE. RETURN POINTER IN UUO HLRE TAC1,UUO ;-LENGTH OF S. T. ;NOTE THAT THE SYMBOL TABLE POINTER IS MOVED FROM ; JOBSYM(JDAT) TO DDTSYM(JDAT) BY SYSMAK WHEN THE SYSTEM ; IS FIRST CREATED. JUMPE TAC1,JRSTI1 ;0 IF NO S. T. TO MOVE UP MOVNS TAC1 ;+LENGTH HRRZ TAC,UUO ;FIRST ADDRESS ADDI TAC,(TAC1) ;LENGTH+FIRST ADDRESS HRL TAC,TAC1 ;XWD LENGTH,LENGTH+FIRST ADDRESS SUBI DAT,1(TAC) ;NEW LAST+1-OLD LAST+1 HRRM DAT,STO1 ;DIST, TO MOVE MOVE TAC1,UUO ;-N,FIRST ADD. ADDI TAC1,1(DAT) ;FROM NEW S.T. POINTER MOVEM TAC1,DDTSYM ;STORE IN LOWER CORE MOVE TAC1,-1(TAC) STO1: MOVEM TAC1,.(TAC) SUB TAC,[XWD 1,1] JUMPGE TAC,.-3 EXTERN DEVLST,INTNUM,INTTAB ;SETUP LOCATIONS 40 THRU 61 JRSTI1: MOVE TAC,[XWD LOC40,40] ;SET UP LOWER CORE PI LOCATIONS BLT TAC,61 ;LINK DEVICE SERVICE ROUTINES TOGETHER - IF NOT LOADED BY BUILD SKIPE DEVLST ;HAS SERVICE ROUTINES ALREADY BEEN CHAINED TOGETHER? JRST ALRCHN ;YES, MUST HAVE BEEN LOADD WITH BUILD MOVSI TAC,INTNUM ;NO, NEG. NO. OF SERVICE ROTUINES*2 INTLOP: HLRZ DAT,INTTAB(TAC) ;GET NEXT PI NUMBER ANDI DAT,7 ;MASIC OUT NUMBER OF DDB'S LSH DAT,1 ;SHIFT LEFT ONE SO MATCH PI LOCATIONS JUMPE DAT,NOPICH ;DOES THIS DEVICE HAVE A PI CHANNEL (PTY)? MOVE ITEM,40(DAT) ;YES, PICK UP JSR CH'N FROM LOWER CORE INTLP1: MOVE DAT,ITEM ;SAVE IT IN DAT (EITHER A JRST DEV'NT OR ; JEN @CH'N MOVE ITEM,1(DAT) ;PICK UP INSTR. FOLLOWING INTERRUPT CONSO TLNN ITEM,000740 ;IS IT A JEN? JRST INTLP1 ;NO, KEEP LOOKING MOVE TAC1,INTTAB(TAC) ;YES, LAST DEVICE SO FAR, GET DEV'NT HRLI TAC1,(JRST) ;MAKE JRST INSTR. MOVEM TAC1,1(DAT) ;CHANGE JEN @CH'N TO JRST DEV'NT MOVEM ITEM,1(TAC1) ;MAKE DEV'NT+1 BE JEN @CH'N NOPICH: AOBJN TAC,.+1 ;PICKUP EVERY OTHER WORD? AOBJN TAC,INTLOP ;ANY MOVE INTERRUPT SERVICE ROUTINES? ALRCHN: IFN FTDISK,< ;INITIALIZE DISK EXTERN NULPDL,DSKINI MOVEI PDP,NULPDL PUSHJ PDP,DSKINI ;INITIALIZE THE DISK ; AFTER SETTING UP CHANNEL LOC ; BUT BEFORE OVERWRITTING ONCE WITH DDB'S > MOVE TAC,JRSTI MOVEM TAC,LINKSR+1 ;DO ONCE ONLY SKIPN DEVLST ;HAVE DEVICE DATA BLOCKS BEEN LINKED? JRST LINKDB ;NO, GO LINK DATA BLOCKS ;RETURN @LINKSR ;MULTIPLE DEVICE DATA BLOCKS ARE CREATED ;AS SPECIFIED BY SYSSIZ AND MAY ERASE PART ;OF ONCE ONLY CODE JRSTI: JRST @LINKSR ;YES,RETURN EXTERN UUO0,ERROR,UUO2,LINKDB,DEVLST EXTERN CH1,CH2,CH3,CH4,CH5,CH6,CH7 LOC40: 0 ;UUO PC INTERNAL UUOTRP UUOTRP: JSR UUO0 ;TO UUO HANDLER JSR CH1 JSP DAT,ERROR JSR CH2 JSP DAT,ERROR JSR CH3 JSP DAT,ERROR JSR CH4 JSP DAT,ERROR JSR CH5 JSP DAT,ERROR JSR CH6 JSP DAT,ERROR JSR CH7 JSP DAT,ERROR 0 ;LOC 60/61 TRAPPED TO FOR UNIMPLEMENTED OP CODES ON PDP-10 ;OP CODE 100 IS USED TO DISMISS USER MODE INTERRUPTS(SEE TRPSET UUO) JSR UUO2 ;GO SEE IF OP CODE 100 OR SOME OTHER ONE IFN FT2REL,< ;SET LOC TWOREG TO -1 IF MACHINE HAS TWO RELOC REG,0 IF ONLY ONE RELOC REG EXTERN TWOREG,SEGN,SEGPTR,AND2RG,JOBN TSTREG: 0 MOVE TAC,[JSR TSTAPR] ;REPLACE UUO JSR WIT A JSR HERE IN ONCE MOVEM TAC,41 CONO APR,ILM!1 ;TURN ON PI & ASSIGN ILM FLAG ;FOR POSSIBLE ILLEGAL MEMORY REF BELOW MOVEM TAC,42 ;PUT A JSR IN CHAN 1 INT. LOC. CONO PI,12300 ;CLR PI SYSTEM, ACTIVATE PI SYSTEM. TURN ON CHAN 1 DATAO APR,[XWD 376776,000400] ;SET LOW AND HIGH SEG TO 128K LONG ; EACH STARTING AT ABS LOC 0 ; RELOC. FOR HIGH SEG IS 400000 TO DO THIS JRST 1,.+1 ;ENTER USER MODE .+1 MOVE TAC,400100 ;TRY TO REFERENCE REL LOC 100 IN HIGH SEG ; AVOID SHADOW ACS WHICH LIKELY HAVE BAD ;PARITY CAUSED BY POWER TURN ON AND TURN OFF MOVEI 17,400000 ;MOVE HARDWARE ACS INTO SHADOW ACS TO CLEAR PARITY ;IF HARDWARE ACS TURNED OFF, ACS WILL BE PRESERVED BLT 17,400017 ;STOP WITH SHADOW AC 17 CALL ;COME BACK TO EXEC MODE AT TSTAPR TSTAPR: 0 ;PLACE TO SIDE JSR PC SETZM TWOREG ;ASSUME NO SECOND REG. CONSO APR,ILM ;WAS MEMORY REF OUT OF BOUNDS? SETOM TWOREG ;NO, MUST HAVE SECOND REG. HARDWARE, SET -1 CONO APR,ILM ;CLEAR APR FLAGS AGAIN MOVEI TAC,AND2RG ;=0 IF SOFTWARE CANNOT HANDLE 2 SEG(NULSEG LOADED) ANDM TAC,TWOREG ;=-1 IF IT CAN(SEGCON LOADED) ;TWOSEG SET TO AND OF SOFTWARE AND HARDWARE CAPABILITIES MOVNI TAC,SEGN ;SET LH OF POINTER TO FIRST SEG IN JBTXX TABLES HRLI TAC,JOBN ;SET RH OF POINTER TO FIRST HIGH SEG ;THIS MUST BE DONE HERE BECAUSE SEGPTR APPEARS IN FIRST ; WHICH BUILD FORBITS FROM HAVING EXTERNALS MOVSM TAC,SEGPTR ;POINTER USED FOR AOBJN LOOPS CONO PI,10000 ;CLEAR PI SYSTEM JRST @TSTREG > ;ROUTINE TO FIND THE EXEC DDT SYMBOL TABLE POINTER AND MOVE IT TO THE PLACE ;WHERE EXEC DDT EXPECTS IT(DDTSYM=36) ;THE MONITOR CAN BE LOADED IN ANY OF 3 WAYS(IN ORDER OF PERFERNCE): ; 1. UNDER TIME SHARING WITH REGULAR LOADER AND COMMON ; 2. UNDER REGULAR 10/30 MONITOR WITH REGULAR 10/30 LOADER AND COMMON ; 3. UNDER SPECIAL 10/30 MONITOR(SPMON) WITH BUILD ;THE 3 WAYS LEAVE DDTSYM(36),JOBSYM(116),T30SYM(131) IN DIFFERENT STATES: ; DDTSYM(36) JOBSYM(116) T30SYM(131) ; 1. JUNK S.T.PTR JUNK ; 2. JUNK JUNK(NON-NEG) S.T.PTR ; 3. S.T.PTR S.T.PTR JUNK ;CALL: JSP MOVSTP ; RETURN WITH AC UUO SET TO SYMBOL TABLE POINTER ;CALLED FROM MANDATORY ONCE ONLY CODE AND 141 START CODE(WHICHEVER OCCURS FIRST) INTERN MOVSTP EXTERN T30SYM,JOBSYM,DDTSYM,DDTX,SYSDDT MOVSTP: 0 ;JSR HERE FROM MANDATORY ONCE ONLY CODE AND ; FIRST JUMP TO EXEC DDT IF BEFORE MONITOR STARTED MOVJMP: JRST .+1 ;PATCHED TO SETUUO AFTER FIRST EXECUTION MOVE UUO,T30SYM ;ASSUME LOADED BY REGULAR 10/30 SKIPL JOBSYM ;OR IS JOBSYM NEGATIVE(MEANING IT IS S.T.PTR)? JRST REGT30 ;WAS LOADED BY REGULAR 10/30 MOVE UUO,JOBSYM ;ASSUME LOADED BY TIME SHARING MONITOR AND LOADER SKIPE DEVLST ;OR HAS BUILD PATCHED THE DDB CHAIN? MOVE UUO,DDTSYM ;YES, DDTSYM HAS SYMBOL TABLE POINTER AS STORED ; BY SPMON REGT30: MOVEM UUO,DDTSYM ;STORE THE SYMBOL TABLE POINTER FOR EXEC DDT MOVEI TAC,DDTX ;MAKE SYSTEM STARTUP LOC(141) GO DIRECTLY TO EXEC ; DDT AND BY PASS THIS FOOLISHNESS HRRM TAC,SYSDDT MOVEI TAC,SETUUO ;MAKE SURE THIS IS DONE ONLY ONCE HRRM TAC,MOVJMP SETUUO: MOVE UUO,DDTSYM ;RETURN THE CORRECT(MAYBEUPDATED IF ; EXEC DDT PATCHES MADE BEFORE MONITOR SAVED OR ; STARTED) SYMBOL TABLE POINTER JRST @MOVSTP ;RETURN ;HERE IF EXEC DDT IS STARTED UP BEFORE MONITOR(TO MAKE A PATCH FOR EXAMPLE) INTERN PATSYM EXTERN DDTX PATSYM: JSR MOVSTP ;MOVE DDT SYMBOL TABLE POINTER SO EXEC DDT WILL ; FIND IT AND PATCH 141 TO GO DIRECTLY TO EXEC DDT JRST DDTX ;AND GO DIRECTLY TO EXEC DDT ;ONCE ONLY CODE - OPERATOR SETUP DIALOGUE IFN FTRC10, < ENTRY RCXWNZ ;THIS SYMBOL IS SOLELY TO PERMIT THE SYSTEM RCXWNZ: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE. INTERNAL ONCE > IFE FTRC10, < ENTRY ONCE > EXTERNAL CONMES,RADX10,CRLF,DECIN1,OCTPNT EXTERNAL CONFIG,SYSDAT INTERN FTTTYSER IFE FTTTYSER,< DEFINE SETTYO DEFINE TYPE DEFINE NEXTC > IFN FTTTYSER,< DEFINE SETTYO DEFINE TYPE DEFINE NEXTC EXTERN TSETBF,SETBFI,SCNDDB,TTIBUF,TTOBUF,OUTCHS,GETCHR,TIBF,TOBF > INTERN PATSIZ EXTERN PATCH ONCE: 0 PATSIZ: MOVEI TAC,PATCH ;SET SIZE OF SYSTEM TO BEGINING OF PATCH MOVEM TAC,SYSSIZ ;IN CASE ONCE ONLY DIALOG RESTARTD BEFORE OVERWRITTEN ;PATSIZ SHOULG BE UPDATED EVERY TIME A PATCH ; IS MADE. SYSSIZ SHOULD ALSO BE UPDATED IF 146 ; START IS GOING TO BE USED(DDT DEBUGGIN OR CTY DOWN) MOVE PDP,[XWD -ONCEPN,ONCEPD] SETTYO PUSHJ PDP,CRLF MOVEI TAC,CONFIG PUSHJ PDP,CONMES MOVEI TAC,[ASCIZ / /] PUSHJ PDP,CONMES MOVEI TAC,SYSDAT PUSHJ PDP,CONMES MOVEI TAC,TSEXEC PUSHJ PDP,CONMES PUSHJ PDP,OPOUT ;ASK FOR TODAY'S DATE AND CONVERT ;DATE STORED AS ((Y-64)*12.+M-1)*31.+D-1 EXTERNAL THSDAT,JIFMIN,SKIPS PUSHJ PDP,DATLOP JRST .-1 DATLOP: SETZM THSDAT MOVEI TAC,TODATE PUSHJ PDP,ICONM PUSHJ PDP,OPOUT PUSHJ PDP,GETLIN JRST DATLOP PUSHJ PDP,SKIPS PUSHJ PDP,DECIN1 ;MONTH JRST DATLOP JRST DATLOP ;ERROR SKIPE TAC1 CAILE TAC1,^D12 JRST DATLOP SUBI TAC1,1 IMULI TAC1,^D31 ADDM TAC1,THSDAT NEXTC PUSHJ PDP,DECIN1 ;DAY JRST DATLOP JRST DATLOP SKIPE TAC1 CAILE TAC1,^D31 JRST DATLOP SUBI TAC1,1 ADDM TAC1,THSDAT NEXTC PUSHJ PDP,DECIN1 ;YEAR JRST DATLOP JRST DATLOP CAIL TAC1,^D69 CAILE TAC1,^D99 JRST DATLOP SUBI TAC1,^D64 ;YEAR ZERO IMULI TAC1,^D12*^D31 ADDM TAC1,THSDAT ;GET TIME OF DAY EXTERNAL TIME POP PDP,TAC PUSHJ PDP,TIMLOP JRST .-1 TIMLOP: SETZM TIME MOVEI TAC,TIMEM PUSHJ PDP,ICONM PUSHJ PDP,OPOUT PUSHJ PDP,GETLIN JRST TIMLOP ;JUST A CR PUSHJ PDP,SKIPS PUSHJ PDP,DECIN1 ;READ THE TIME (1-4 CHARACTERS) JRST TIMLOP ;NO ARGUMENT JRST TIMLOP ;ILLEGAL CHARACTER MOVE TAC,TAC1 IDIVI TAC,^D100 ;TAC=HRS.TAC1=MINS SKIPL TAC ;HRS NEGATIVE? CAILE TAC,^D23 ;OR .G. 23? JRST TIMLOP ;OUT OF BOUNDS CAILE TAC1,^D59 ;MINUTES .G. 59 JRST TIMLOP ;OUT OF BOUNDS IMULI TAC,^D60 ;CONVERT TO MINUTES ADD TAC,TAC1 ;MINUTES SINCE MIDNIGHT IMULI TAC,JIFMIN ;JIFFIES SINCE MIDNIGHT MOVEM TAC,TIME ;TIME=JIFFIES SINCE MIDNIGHT JUMPGE ITEM,QUICK ;SKIP NEXT PART OF DIALOGUE UNLESS THE LAST ITEM ; TYPED IN (NAMELY TIME OF DAT) WAS TERMINATED BY ; AN "ALT MODE". (ACCUMULATOR "ITEM" IS SET UP ; IN THE "GETLIN" SUBROUTINE CALLED ABOVE.) ;PRINT IO CONFIGURATION EXTERNAL DEVLST,TCONLN,INLMES,PRNAME,INTTB1,INTTAB EXTERNAL OCTPNT IFN FT2REL,< JSR TSTREG ;TEST IF 2 RELOC REG SET TWOSEG 0 OK-1 MOVEI TAC,CRLFMS ;PRINT CRLF PUSHJ PDP,ICONM MOVEI TAC,1 ;ASSUME 1 SKIPE TWOREG MOVEI TAC,2 PUSHJ PDP,RADX10 ;NO. SECOND REG EXISTS. PUSHJ PDP,INLMES ASCIZ / RELOC. REG. / PUSHJ PDP,OPOUT > MOVEI TAC,IOCONF PUSHJ PDP,ICONM HLRZ AC1,DEVLST JUMPN AC1,ALRLNK ;DEVICE DATA BLOCK ALREADY LINKED? MOVSI PROG,INTNUM ;NO, NOT LOADED BY BULD,-NO. OF DEVICES*2 CONFLP: SKIPN AC1,INTTB1(PROG) ;INT LOC HAVE DEV DATA BLOCK? JRST NODDB ;NO, GO GET NEXT DEVICE DATA BLOCK LDB UUO,[POINT 8,INTTAB(PROG),8] ;YES. NO. OF DEV DATA BLKS HRRZ TAC,UUO ;PRINT PUSHJ PDP,RADX10 ;IN DECIMAL PUSHJ PDP,INLMES ;PRINT 1 SPACE ASCIZ / / HLLZ TAC1,DEVNAM(AC1) ;DEVICE NAME PUSHJ PDP,PRNAME ;PRINT IT SOJLE UUO,SINGLE ;IS THIS JUST A SINGLE DEVICE? PUSHJ PDP,INLMES ;NO, APPEND 'S TO DEVICE NAME ASCIZ /'S/ SINGLE: PUSHJ PDP,CRLF ;PRINT CR LF NODDB: AOBJN PROG,.+1 ; AOBJN PROG,CONFLP ;FINISHED ALL DEVICES? JRST ONCE7A ;YES ALRLNK: ONCE5: MOVEI TAC,1 HLLZ ITEM,DEVNAM(AC1) ONCE4: HLRZ AC1,DEVSER(AC1) JUMPE AC1,ONCE6 HLLZ TAC1,DEVNAM(AC1) CAMN TAC1,ITEM AOJA TAC,ONCE4 ONCE6: MOVE PROG,TAC ;SAVE NO. PUSHJ PDP,RADX10 MOVEI CHREC," " TYPE MOVEI UUO,3 MOVE TAC,[POINT 6,ITEM] ONCE7: ILDB CHREC,TAC ADDI CHREC,40 TYPE SOJG UUO,ONCE7 MOVEI TAC,[ASCIZ /'S/] CAILE PROG,1 PUSHJ PDP,CONMES PUSHJ PDP,CRLF JUMPN AC1,ONCE5 ONCE7A: PUSHJ PDP,OPOUT MOVEI TAC,CRLFMS PUSHJ PDP,ICONM MOVEI TAC,TCONLN ;PRINT NO, OF TTY SCANNER LINES PUSHJ PDP,OCTPNT PUSHJ PDP,INLMES ASCIZ / (OCTAL) TTY SCANNER LINES / PUSHJ PDP,OPOUT ;ASK FOR OPERATORS CONSOLE TO BE SPECIFIED EXTERNAL INLMES,DEVOPR,CTEXT,DEVPHY ONCEOP: MOVEI TAC,OPRM PUSHJ PDP,ICONM PUSHJ PDP,OPOUT PUSHJ PDP,GETLIN JRST ONCE8 ;JUST CR PUSHJ PDP,CTEXT MOVE TAC,TAC1 CAMN TAC,[SIXBIT /CTY/] ;CTY? JRST .+3 ;YES. JUST STORE IT. PUSHJ PDP,DEVPHY JRST ONCEOP ;PHYSICAL NAME NOT FOUND MOVEM TAC,DEVOPR ;SET FOR SYSTEM ;DEVICE "OPR" WILL BE SAME AS THIS ;ASK IF SYSMAK IS WANTED EXTERN MAKEND,SYSSIZ ONCE8: MOVEI TAC,SYSM PUSHJ PDP,YESNO JRST ONCE2 ;NO SYSMAK MOVEI TAC,MAKEND ;YES MOVEM TAC,SYSSIZ ;IS EXEC DDT WANTED? EXTERNAL DDTEND ONCE2: MOVEI TAC,SYSDM PUSHJ PDP,YESNO JRST ONCE3 ;NO MOVEI TAC,DDTEND ;FIRST FREE LOC. ABOVE EXEC DDT MOVEM TAC,SYSSIZ ;SET NEW MONITOR SIZE ;FIND CORE TO BE USED FOR MULTIPLE DEVICE DATA BLOCKS ; INCLUDING DISK EXTERNAL CNTDB ONCE3: PUSH PDP,SYSSIZ ;SAVE CURRENT VALUE JSP TAC,CNTDB ;UPDATE SYSSIZ BY SPACE USED ; FOR DEVICE DATA BLOCKS FOR DSK,DTA,MTA,TTY,PTY) ;PRINT OCTAL SIZE OF MONITOR MOVEI TAC,EXECIS PUSHJ PDP,ICONM MOVE TAC,SYSSIZ PUSHJ PDP,OCTPNT MOVEI TAC,LENGTH PUSHJ PDP,CONMES PUSHJ PDP,CRLF PUSHJ PDP,OPOUT POP PDP,SYSSIZ ;RESTORE SYSSIZ PRIOR TO ACTUAL CREATION ; OF DEVICE DATA BLOCKS EXTERN DECIN,CORLIM,USRLIM,RADX10 ONCE4A: MOVEI TAC,MXKMES ;PRINT "MAX. K CORE FOR SINGLE USER IS " PUSHJ PDP,ICONM MOVEI TAC,USRLIM PUSHJ PDP,RADX10 PUSHJ PDP,CRLF PUSHJ PDP,OPOUT MOVEI TAC,DESMES ;PRINT "TYPE DESIRED MAX.(DEC). CR IF OK AS IS PUSHJ PDP,ICONM ;" PUSHJ PDP,OPOUT PUSHJ PDP,GETLIN JRST ONCE5A ;LEAVE LIMIT AS SET BY BUILDER QUESTION. IFN FTTTYSER, PUSHJ PDP,DECIN JRST ONCE4A JRST ONCE4A SKIPE TAC1 ;UNLESS HE SAID 0 LIKE IN MONGEN. HRRM TAC1,CORLIM ;PATCH CORLIM FOR USER CORE SIZE LIMIT ; IF NOT PATCHED, LEAVE COMMON'S VALUE ONCE5A: INTERNAL FTDISK IFN FTDISK,< PUSHJ PDP,REF ;GO THROUGH THE REFRESH DIALOG. > QUICK: ;THIS IS THE SHORT-CUT EXIT TO BY-PASS MOST OF THE DIALOGUE INTERNAL FTCHECK IFN FTCHECK,< PUSHJ PDP,OK ;CHECKSUM MONITOR AND SAVE THE ANSWER. > JRST @ONCE ;***EXIT FROM THE "ONCE-ONLY CODE"*** IFN FTDISK,< EXTERNAL OCTIN,MFDBLK,SATXWD,NUMBLK,SYSPP,REFLAG ;REFRESH DIALOGUE REF: MOVEI TAC,REF1M ;DO YOU WANT TO REFRESH? PUSHJ PDP,YESNO POPJ PDP, ;NO MOVEI TAC,REF2M ;YES, ARE YOU SURE? PUSHJ PDP,YESNO POPJ PDP, ;NO REF6: ;YES. DO YOU WANT TO CHANGE THE LOC MOVEI TAC,REF3M ;OF THE MFD? PUSHJ PDP,YESNO JRST REF3 ;NO REF2: ;YES MOVEI TAC,REF4M ;TYPE LOGICAL DISK ADDRESS OF MFD RETR, INFO PUSHJ PDP,ICONM PUSHJ PDP,OPOUT PUSHJ PDP,GETLIN JRST REF2 IFN FTTTYSER, PUSHJ PDP,OCTIN JRST REF2 JRST REF2 IFE FTRC10, < PUSH PDP,TAC1 ;IS IT A MULTIPLE OF NUMBLK? MOVEI TAC,(TAC1) IDIVI TAC,NUMBLK JUMPN TAC1,REF4 ;NO POP PDP,TAC1 > HRRZM TAC1,MFDBLK AOS TAC1 HRRM TAC1,SATXWD REF3: INTERNAL FTSWAP IFN FTSWAP, PUSHJ PDP,DECIN JRST REF3 JRST REF3 CAILE TAC1,MXK2SWP ;ANSWER TOO BIG? JRST REF3 ;YES, REPEAT QUESTION HRRZM TAC1,K4SWAP ;NO. SAVE THIS CRUCIAL PARAMETER. REF3A: >> PUSHJ PDP,REFRES ;REFRESH. JRST REF5 ;ERROR MOVEI TAC,REF6M ;REFRESHING SUCCESSFULLY COMPLETED ! PUSHJ PDP,ICONM PUSHJ PDP,OPOUT ;TYPE "REFRESHED !" MOVE TAC,SYSPP MOVEM TAC,REFLAG ;TO PERMIT AUTOMATIC LOG-IN UNDER ; PROJ-PROG NUMBER [1,1] EVEN MOVEI TAC,REF8M ; THOUGH THE LOG-IN CUSP IS CLEARLY NOT PUSHJ PDP,ICONM ; ON THE NEWLY REFRESHED DISK. PUSHJ PDP,OPOUT POPJ PDP, IFE FTRC10, < REF4: POP PDP,TAC1 MOVEI TAC,REF5M PUSHJ PDP,ICONM PUSHJ PDP,OPOUT JRST REF2 > REF5: PUSH PDP,TAC ;ERROR. ON COMMING HERE, TAC HAS LOGICAL BLOCK ; NUMBER WHICH COULD NOT BE WRITTEN MOVEI TAC,REF7M PUSHJ PDP,ICONM POP PDP,TAC PUSHJ PDP,OCTPNT PUSHJ PDP,CRLF PUSHJ PDP,OPOUT JRST REF6 ;GO BACK TO TRY AGAIN., REF1M: ASCIZ /DO YOU WANT TO REFRESH THE DISK ? (Y OR CR) / REF2M: ASCIZ /ARE YOU SURE(Y OR CR)? / REF3M: ASCIZ /DO YOU WANT TO CHANGE THE LOCATION OF THE MFD(Y OR CR)? / REF4M: ASCIZ /TYPE THE LOGICAL DISK ADDRESS OF THE MFT RETREIVAL INFORMATION / IFE FTRC10, < REF5M: ASCIZ /MUST BE A MULTIPLE OF NUMBLK. / > REF6M: ASCIZ /REFRESHED ! / REF7M: ASCIZ /ERROR WHILE WRITING BLOCK / REF8M: ASCIZ /TO AUTOMATICALLY LOG-IN UNDER [1,1], TYPE "LOGIN" / IFN FTRC10, < REF9M: ASCIZ /HOW MANY (DECIMAL) 1K DISK BLOCKS ARE TO BE ALLOCATED FOR SWAPPING ? / > > ;THIS CLOSES AN FTDISK CONDITIONAL SERVAL PAGES BACK. ;ROUTINE TO READ A LINE FROM OPERATORS CONSOLE ;CALL: PUSHJ PDP,GETLIN ; JUST A CR TYPED IN ; A LINE TYPED IN,TAC SEYT AS BYTE POINTER CHREC=TEM ;CHAR TO TYPE OUT (MUST BE SAME AS SCNSER ROUTINE) LINE=TAC1 ;TTY LINE NO. (ALSO SAME AS SCNSER) IFN FTTTYSER, EXTERNAL CPOPJ1 GETLIN: IFE FTTTYSER, IFN FTTTYSER,< PUSHJ PDP,SETBFI> SETZB ITEM,CHREC GET1: PUSHJ PDP,TYI DATAI TTY,CHREC ANDI CHREC,177 CAIN CHREC,177 ;RUBOUT? JRST DELETE CAIN CHREC,33 ;ALTMODE ? JRST GETLN1 ;YES CAIE CHREC,175 ;VARIATION OF ALT-MODE ? CAIN CHREC,176 ;OR YET THIS THIRD VARIATION ? JRST GETLN1 ;YES GET2: PUSHJ PDP,TYO ;ECHO CHARACTER CAIL CHREC,140 ;IS THIS LOWER CASE? TRZ CHREC,40 ;YES,MAKE IT UPPER CASE IFE FTTTYSER, IFN FTTTYSER, CAIE CHREC,15 AOJA ITEM,GET1 MOVEI CHREC,12 ;OUTPUT LF PUSHJ PDP,TYO ;TYPE OUT IFE FTTTYSER,< MOVE TAC,LINEP ;RESET BYTE POINTER> JUMPN ITEM,CPOPJ1 ;NULL LINE? POPJ PDP, ;YES, DON'T SKIP RETURN DELETE: IFN FTTTYSER,< PUSHJ PDP,DCPUTR JRST DELET1> IFE FTTTYSER,< JUMPE ITEM,DELET1 ;AT BEGINNING OF LINE? ADD TAC,[XWD 070000,0] ;NO, BACK UP BYTE POINTER TLNE TAC,400000 ;FINISHED THIS WORD YET? ADD TAC,[XWD 347777,-1] ;YES, BACK UP ADDRESS> MOVEI CHREC,134 ;OUTPUT BACK SLASH PUSHJ PDP,TYO SOJA ITEM,GET1 DELET1: MOVEI CHREC,15 PUSHJ PDP,TYO MOVEI CHREC,12 PUSHJ PDP,TYO JRST GETLIN GETLN1: SETOM ITEM ;MECHANISM USED TO BY-PASS PART OF DIALOGUE MOVEI CHREC,15 ;WHEN ALTMODEIS TYPED. JRST GET2 ;ROUTINE TO TYPE A LINE ON OPERATOR CONSOLE ;ECHO CHECK STOPS LINE AND RETURNS ;CALL: DAT SET TO END OF MESSAGE IFN FTTTYSER, OPOUT: IFE FTTTYSER, IFN FTTTYSER, CONO TTY,1000 ;CLEAR INPUT OPOUT1: IFE FTTTYSER,< CAMN TAC,DAT POPJ PDP,> CONSZ TTY,40 JRST OPOUT2 ;ECHO CHECK NEXTC IFN FTTTYSER,< JUMPE CHREC,CPOPJ> PUSHJ PDP,TYO JRST OPOUT1 OPOUT2: MOVEI CHREC,15 PUSHJ PDP,TYO MOVEI CHREC,12 PUSHJ PDP,TYO CONO TTY,1000 ;CLEAR INPUT ;WAIT TILL OUTPUT BUSY OFF BEFORE TYPING OUT CHAR. EXTERNAL TCONLN,TYPL TYO: PUSHJ PDP,APRCHK ;CHECK CLOCK CONSZ TTY,20 JRST TYO PUSH PDP,TAC PUSH PDP,LINE MOVE TAC,CHREC IMULI TAC,200401 AND TAC,[OCT 11111111] IMUL TAC,[OCT 11111111] TLNE TAC,10 TRO CHREC,200 DATAO TTY,CHREC TRZ CHREC,200 POP PDP,LINE POP PDP,TAC POPJ PDP, ;WAIT TIL INPUT DONE ONE BEFORE RETURNING WITH NEXT CHAR. TYI: PUSHJ PDP,APRCHK CONSO TTY,40 JRST TYI POPJ PDP, ;CHECK APR FOR CLOCK FLAG SO TIME USER TYPES IN WILL BE ACCURATE APRCHK: CONSO APR,1000 ;IS CLOCK FLAG ON? POPJ PDP, ;NO CONO APR,1000 ;YES, CLEAR CLOCK FLAG AOS TIME ;INCREMENT TIME POPJ PDP, ICONM: PUSH PDP,TAC SETTYO ;INITIALIZE LINE BUFFER POP PDP,TAC JRST CONMES ;OUTPUT MESSAGE IFN FTTTYSER,< OTSET: MOVEI DEVDAT,SCNDDB MOVSI TEM,120 ;TTYCHR HRRI TEM,TIBF(DEVDAT) MOVEM TEM,TTIBUF(DEVDAT) ;INIT INPUT POINTER HRRI TEM,TOBF(DEVDAT) ;AND OUTPUT POINTER MOVEM TEM,TTOBUF(DEVDAT) JRST TSETBF ;NOW CLEAR THE BUFFERS > YESNO: PUSHJ PDP,ICONM ;FIRST OUTPUT THE QUESTION PUSHJ PDP,OPOUT PUSHJ PDP,GETLIN ;NOW GET RESPONSE POPJ PDP,0 ;JUST A C-R NEXTC TRZ CHREC,40 ;FIRST CHAR OF RESPONSE (U.C.) CAIN CHREC,"Y" ;WAS IT A Y? AOS 0(PDP) ;YES, SKIP POPJ PDP, ;NO. MAYBE IT WAS "N", SO DONT SKIP ;CONSTANTS AND PUSH DOWN LIST ONCEPN=20 ONCEPD: BLOCK ONCEPN ;PUSH DOWN LIST LINEP: POINT 7,LINBUF ;INPUT AND OUTPUT LINE BUFFERE LINBUF: BLOCK 30 ;MESSAGES TSEXEC: ASCIZ / MONITOR JUST LOADED / TODATE: ASCIZ / TYPE TODAY'S DATE AS MM-DD-YY / TIMEM: ASCIZ / TYPE TIME AS HHMM / IOCONF: ASCIZ / IO CONFIGURATION / OPRM: ASCIZ / TYPE NAME OF OPR CONSOLE / SYSM: ASCIZ / DO YOU WANT SYSMAK (TYPE Y IF YES, CR IF NO)? / SYSDM: ASCIZ / EXEC DDT? / EXECIS: ASCIZ / EXEC IS / LENGTH: ASCIZ / OCTAL LOCATIONS LONG. / MXKMES: ASCIZ /MAX K CORE FOR SINGLE USER IS / DESMES: ASCIZ /TYPE DESIRED MAX,(DEC), CR IF OK AS IS / CRLFMS: ASCIZ / / ;INITIALIZE SAT SEARCH ENTRIES ;THIS "DFWUNS" ROUTINE IS CALLED BY MANDATORY ONCE ONLY CODE(LINKSR) ; AFTER ALL MULTIPLE DEVICE DATA BLOCKS HAVE BEEN GENERATED IN CORE ; ABOVE C(SYSSIZ)( AND SYSSIZ HAS BEEN INCREMENTED) ; IT IS CALLED WHETHER OR NOT THE DISK WAS REFRESHED. IF REFRESHING WAS ; PERFORMED, DFWUNS IS CALLED AFTER REFRES SINCE SYSINI CALLS LINKSR AFTER ONCE. INTERNAL FTDISK IFN FTDISK,< INTERNAL DFWUNS EXTERNAL SAT05,JSAT06,SATENT,SATPTR,SATBK2,SATXWD,SATPTR EXTERNAL SAT,SENTSZ,DSKDDB,DSKBUF,WSYNC,MQIN,MQOUT,DFGETF,SETFRE EXTERNAL WLBIT,NUMBIT,DSKCNT DFWUNS: IFN FTRC10, < PUSHJ PDP,WRITLK ;FORCE THE WRITE-LOCK SWITCH SETTINGS TO BE ZERO. PUSHJ PDP,RDSTAT ;READ VITAL DISK STATISTICS BLOCK, STORE PARAMETERS PUSHJ PDP,CAPCTY ;DETERMINE CURRENT SYSTEM CAPACITY (HOW MANY DISKS). CAMN TAC,LBHIGH ;HAS CAPACITY CHANGED SINCE LAST REFRESH ? JRST DFWNZ1 ;NO, EVERYTHING APPPEARS TO BE OKAY. SETTYO ;YES, PRINT WARNING MESSAGE... PUSHJ PDP,INLMES ASCIZ /DISK CAPACITY HAS CHANGED SINCE LAST REFRESHING. EITHER RESTORE PREVIOUS DISK CONFIGURATION OR REFRESH. / PUSHJ PDP,OPOUT ;START TTY PUSHJ PDP,REF ;GO THROUGH THE REFRESH DIALOGUE JRST DFWUNS ;NOW TRY AGAIN. DFWNZ1: > MOVEI TAC,SATENT MOVEM TAC,SATPTR MOVEI PROG,0 MOVEI DEVDAT,DSKDDB MOVE TAC1,SATBK2 MOVEM TAC1,DSKBUF(DEVDAT) PUSH PDP,WSYNC MOVE TAC,JSAT06 MOVEM TAC,WSYNC SKIPA TAC,SATXWD ;READ EACH SAT BLOCK FROM THE DISK AND SET SATENT TABLE TO MATCH INFO ON DISK. SETS1: ADDM TAC1,SATPTR SETS2: PUSH PDP,TAC SETZB IOS,DEVIOS(DEVDAT) PUSHJ PDP,MQIN ;READ A SAT BLOCK JRST 4,SETS6 ;ERROR HALT MOVE DAT,SATPTR ;RESET THE ENTRY MOVE TAC,SATBK2 MOVEM TAC,2(DAT) MOVSI TAC1,400000 MOVEM TAC1,1(DAT) MOVEI DAT,0 SETS3: MOVE AC1,(TAC) ;COUNT ONE-BITS AOJN AC1,SETS3A ;IS THE WORD = -1? ADDI DAT,44 ;YES JRST SETS5 SETS3A: SOJE AC1,SETS5 ;NO, IS IT = 0? SETS4: TDNE TAC1,(TAC) ;NO, COUNT THE BITS ADDI DAT,1 ROT TAC1,-1 JUMPGE TAC1,SETS4 SETS5: AOBJN TAC,SETS3 ;LOOP THRU ENTIRE BLOCK HRRM DAT,@SATPTR IFE FTRC10, < ;BITS HAVE BEEN COUNTED, CHECK FOR WRITE-LOCK CAIL DAT,NUMBIT ;BLOCK FULL? JRST SETS8 PUSHJ PDP,DFGETF ;NO. GET A FREE BLOCK PUSHJ PDP,SETS7 ;WRITE PUSHJ PDP,SETFRE ;FREE THE BLOCK > SETS5B: MOVEI TAC1,SENTSZ ;PREPARE TO BUMP SATPTR POP PDP,TAC AOBJN TAC,SETS1 ;DO ALL SAT BLOCKS IFE FTRC10, < JRST SAT05 ;RETURN > IFN FTRC10, < HRRZ TAC,SATPTR SETS5X: CAIL TAC,SATTOP JRST SAT05 ;EXIT FROM DFWUNS BACK TO DSKINI IN DSKSER........ ADDI TAC,SENTSZ MOVEI TAC1,411000 ;ON THE NEW PDP-10 DISK SYSTEM SET THE SAT ENTRY HRRM TAC1,(TAC) ; TABLE TO SHOW ALL NON-EXISTENT DISKS AS JRST SETS5X ; BOTH WRITE-LOCKED AND FULL. > SETS6: POP PDP,TAC ;ERROR, TRY AGAIN JRST SETS2 IFE FTRC10, < ;WRITE-LOCK DETERMINATION ON THE OLD PDP-6 (DATA PRODUCTS) DISK -- SETS7: PUSH PDP,TAC ;SAVE BLOCK ADDRESS SETS7A: PUSHJ PDP,MQOUT JRST SETS7C ;ERROR SETS7B: POP PDP,TAC POPJ PDP, SETS7C: MOVE TAC,(PDP) MOVE TAC1,DSKCNT(DEVDAT) TRNN TAC1,IOIMPM ;WRITE LOCK? JRST 4,SETS7A ;NO MOVEI TAC,WLBIT ;YES. SET BIT ORM TAC,@SATPTR JRST SETS7B SETS8: MOVEI TAC,SETS9 ;BLOCK FULL, READ FIRST ONE HRRM TAC,DSKBUF(DEVDAT) HLRZ TAC,@SATPTR PUSHJ PDP,MQIN JRST 4,.-2 ;ERROR HLRZ TAC,@SATPTR ;WRITE IT BACK PUSHJ PDP,SETS7 MOVEI TAC,SAT ;RESET HRRM TAC,DSKBUF(DEVDAT) JRST SETS5B SETS9: BLOCK 204 > ;CLOSE THE IFE FTRC10 > ;CLOSES AN IFN FTDISK A COUPLE PAGES BACK. IFN FTDISK,< ;DISK REFRESHING ROUTINES --- IFE FTRC10, < ;DISK REFRESHER FOR THE OLD PDP-6 (DATA PRODUCTS) DISK -- EXTERNAL MFDBLK,NUMSAT,CHKCNT,CHKSUM,NUMBLK,DSKINI,SETSAT,DSKCHN,DSKCHL REFRESH: MOVEI PROG,0 ;SETUP IO MOVEI DEVDAT,DSKDDB PUSH PDP,SETSAT MOVE TAC,RPOPJ MOVEM TAC,SETSAT PUSHJ PDP,DSKINI POP PDP,SETSAT MOVEI TAC,DSKCHN LSH TAC,1 ADDI TAC,40 MOVE TAC1,[JSR DSKCHL] MOVEM TAC1,(TAC) PUSH PDP,WSYNC MOVE TAC,JSAT06 MOVEM TAC,WSYNC ;SETUP NULL SAT BLOCK SETOM DAT MOVE TAC1,[XWD NULBLK,NULBLK+1] SETZM NULBLK BLT TAC1,NULBLK+177 MOVEI TAC,NUMBLK ;END OF BLOCK BYTE POINTER IDIVI TAC,^D36 SUBI TAC1,^D36 MOVMS TAC1 ROT TAC1,-6 ADDI TAC,NULBLK HLL TAC,TAC1 TLOA TAC,100 IDPB DAT,TAC TLNE TAC,770000 JRST .-2 AOS TAC MOVEM DAT,(TAC) HRLS TAC AOS TAC BLT TAC,NULBLK+177 ;SET UP SAT BLOCK WITH MFD AND SAT BLOCKS ALLOCATED MOVE TAC,[XWD NULBLK,SATBL1] BLT TAC,SATBL1+177 MOVE TAC,[POINT 1,SATBL1] MOVEI TAC1,NUMSAT HRLM TAC1,SATRET+3 ADDI TAC1,3 IDPB DAT,TAC SOJG TAC1,.-1 ;COMPUTE CHECKSUMS IF REQUIRED MOVEI DAT,CHKCNT JUMPE DAT,REFR1 MOVE TAC,[XWD -200,MFD1] PUSHJ PDP,CHKSUM HRLM TAC1,MFDRET+4 MOVE TAC,[XWD -200,NULBLK] PUSHJ PDP,CHKSUM HRLM TAC1,SATRET+4 MOVE TAC,[XWD -200,SATBL1] PUSHJ PDP,CHKSUM MOVE DAT,TAC1 ;RELOCATE POINTERS RELATIVE TO MFDBLK REFR1: MOVE TAC,MFDBLK HRRM TAC,MFDRET+177 HRRM TAC,MFD1+1 ADDI TAC,NUMSAT AOS TAC HRRM TAC,SATRET+177 HRRM TAC,MFD1+3 AOS TAC HRRM TAC,MFDRET+4 MOVNI TAC1,NUMSAT MOVSS TAC1 HRRI TAC1,1 MOVE TAC,MFDBLK HLL TAC,SATRET+4 HRRZM TAC1,SATRET+3(TAC1) ADDM TAC,SATRET+3(TAC1) AOBJN TAC1,.-2 ;FIX CHECKSUM FOR SATBL1 MOVE TAC,MFDBLK IDIVI TAC,NUMBLK HRLM DAT,SATRET+3(TAC) MOVE DAT,TAC ;WRITE BLOCKS ON DISK MOVE TAC,MFDBLK ;MFD RETREIVAL INFORMATION MOVE TAC1,[XWD -200,MFDRET] MOVEM TAC1,DSKBUF(DEVDAT) SETZB IOS,DEVIOS(DEVDAT) PUSHJ PDP,MQOUT JRST REFER ;ERROR MOVEI TAC,1 REFR2: MOVE TAC1,[XWD -200,NULBLK] ;SAT BLOCKS CAMN TAC,DAT MOVE TAC1,[XWD -200,SATBL1] PUSH PDP,TAC ADD TAC,MFDBLK SETZB IOS,DEVIOS(DEVDAT) MOVEM TAC1,DSKBUF(DEVDAT) PUSHJ PDP,MQOUT JRST REFER1 ;ERROR POP PDP,TAC CAIGE TAC,NUMSAT AOJA TAC,REFR2 AOS TAC ;SAT RETREIVAL INFORMATION ADD TAC,MFDBLK SETZB IOS,DEVIOS(DEVDAT) MOVE TAC1,[XWD -200,SATRET] MOVEM TAC1,DSKBUF(DEVDAT) PUSHJ PDP,MQOUT JRST REFER ;ERROR MOVE TAC,MFDBLK ;MFD ADDI TAC,NUMSAT ADDI TAC,2 MOVE TAC1,[XWD -200,MFD1] MOVEM TAC1,DSKBUF(DEVDAT) SETZB IOS,DEVIOS(DEVDAT) PUSHJ PDP,MQOUT JRST REFER ;ERROR POP PDP,WSYNC JRST CPOPJ1 REFER1: POP PDP,TAC1 REFER: POP PDP,WSYNC RPOPJ: POPJ PDP, DEFINE ZEROES (A), LIST> DEFINE ONES (A), LIST> DEFINE BLOCKR (NAME,EXT,PROT,PROGX,B,F,Z),< NAME EXT EXP PROT*1B8+14B12 XWD 1,PROGX EXP Z ZEROES 172 BYTE (4) F (14) 0 (18) B > MFDRET: BLOCKR ,,45,1,0,4,20 ;MFD RETREIVAL INFO SATBL1: XWD 777776,0 ;THIS SAT BLOCK CONTAINSS ZEROES 5400/44-1 ;ALLOCATION FOR MFD AND SAT BLOCKS XWD 001777,-1 ONES 200+SATBL1-. SATRET: BLOCKR ,,555,1,0,1,16 MFD1: XWD 1,1 ;MFD XWD 654644,0 SIXBIT /*SAT*/ XWD 637163,17 ;RELOCATED ZEROES 174 NULBLK: ZEROES 5400/44-1 ;NULL SAT BLOCK XWD 001777,-1 ONES 200+NULBLK-. > ;END OF THE REFRESHER FOR THE OLD PDP-6 DISK. IFN FTRC10, < ;DISK REFRESHER FOR THE NEW PDP-10 MODEL RC-10 (BURROUGHS) DISK-- EXTERNAL CPOPJ1,THSDAT,TIME EXTERNAL MFDBLK,SATXWD,NUMSAT,NUMBLK,SATTOP,SENTSZ EXTERNAL DISKUP,DFRED,DFWRT,DSKFDG,CHKSUM,RCXCCW,RCXFIN EXTERNAL K4SWAP IFN FTSWAP,< EXTERNAL MAXSWP,MXK2SWP,BLKSPK > EXTERNAL LBHIGH INTERNAL STATBK STATBK=1 ;FIXED LOGICAL BLOCK NUMBER FOR THE "VITAL ; STATISTICS" BLOCK OF THE DISK. DSK=170 ;DEFINE DEVICE NUMBER OF THE MODEL RC-10 DISK SYNCHRONIZER. ;THESE NEXT TWO PAGES ARE LIFED DIRECTLY FROM "DSKINIT" IN ORDER TO DEFINE THE ; CONO AND CONI BITS USED HERE IN "ONCE". ;CONI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER -- ;BITS 00 - 17 MAINTENANCE PANEL SWITCH SETTINGS INDICATORS -- ;BITS 00 - 04 UNUSED MSS=1B5 ;SET INDICATES "MAINTENANCE SEGMENT SELECTED" (SEGMENT 81), PLGSW=1B6 ;1 = WRITE-PROTECT EVERYTHING BELOW (LESS THAN) THE BOUNDARY, ; 0 = WRITE-PROTECT EVERYTHING ABOVE (GREATER THAN) BOUNDARY, ;THE CURRENT IMPLEMENTATION OF THE RC-10 DISK SYNCHRONIZER ; DOES NOT PERMIT SENSING THE INCLUSION OF THE BOUNDARY. ;BITS 07 - 17 THE WRITE-PROTECTION THE INCLUSION OF THE BOUNDARY. DTOP=1B18 ;SET INDICATES DATA TRANSFER IN PROGRESS. ;BITS 19 -29 ERROR CONDITIONS INDICATORS (ERROR WHEN SET) -- SRCHE=1B19 ;SEARCH ERROR (DISK TIMING TRACK PROBLEMS!!) DDE=1B20 ;DISK DESIGNATION ERROR TSE=1B21 ;TRACK SELECT ERROR (OR EXCEEDS SYSTEM CAPACITY) NRDY=1B22 ;DISK NOT READY (OR NON-EXISTENT DISK REFERENCED) PSF=1B23 ;POWER SUPPLY FAILURE DPAR=1B24 ;DISK PARITY ERROR CHDPAR=1B25 ;CHANNEL DATA PARITY ERROR CHCPAR=1B26 ;CHANNEL CONTROL PARITY ERROR NXMEM=1B27 ;NON-EXISTENT MEMORY REFERENCED WRPE=1B28 ;ATTEMPTED TO WRITE IN PROTECTED DISK AREA (SEE BITS 06 - 17) OVR=1B29 ;OVERRUN, I.E., MEMORY DIDN'T RESPOND QUICKLY ENOUGH ;BIT 30 CHANNEL CONTROL WORD WRITTEN IN MEMORY (THIS BIT IS ;TURNED ON ON ALMOST ALL TERMINATIONS.) BUSYBT=1B31 ;BUSY (SYNCHRONIZER PERFORMING A COMMAND SEQUENCE) DONEFLG=1B32 ;DONE -- THIS ACTUALLY CAUSES THE INTERRUPT. ;BITS 33 - 35 PI CHANNEL SELECTION BITS. ;COMBINATIONS OF ERRO BITS GROUPED BY TYPE -- DATERR=DPAR!CHDPAR ;DATA ERRORS. DEVERR=SRCHE!PSF!CHCPAR!OVR ;DEVICE ERRORS. SETERR=DDE!TSE!NRDY!WRPE!NXMEM ;SOFTWARE-PREVENTABLE ERRORS. ;CONO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER ;BITS 00 - 17 UNUSED ;BITS 18 - 19 SELECT DISK FOR SECTOR COUNTER READ-OUT A(SEE DATAI BITS 28-35) ;BITS 20 - 29 RESET THE CORRESPONDING CONI ERROR BIT ;(BUT PSE MAY REFUSE TO BE RESET) WRCCWD=1B30 ;WRITE THE CHANNEL CONTROL WORD INTO MEMORY (NOW!) STPBIT=1B31 ;STOP -- IMMEDIATELY CEASE PRESENT I/O AND CLEAR THE CHANNEL. RESETB=1B32 ;RESET THE DONE FLAG (CORRESPONDING CONI BIT) TO CLEAR INTERRUPT ;BITS 33 - 35 PI CHANNEL SELECTION BITS ;DATAI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER -- ;BITS 00 - 17 UNUSED ;BITS 18 - 23 PARITY REGISTER ;BITS 24 - 25 UNUSED ;BITS 26 - 27 DISK SELECTED BY BITS 18-19 OF LAST CONO ;BITS 28 - 35 CURRENT SECTOR POSITION OF SELECTED DISK (FOR LATENCY OPTIMIZATION!) ;DATAO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER -- ;BITS 00 - 17 DISK ADDRESS ELECTION ;BITS 00 - 01 DISK SELECT ;BITS 02 - 10 TRACK SELECT (BCD, BUT FIRST CHAR IS JUST 1 BIT) ;BITS 11 - 17 SEGMENT SELECT (BCD, BUT FIRST CHAR HAS ONLY 3 BITS) ;BITS 18 - 23 INITIAL PARITY REGISTER SETTING 9ZERO EXCEPT FOR DIAGNOSTIC PROGRAMS) DDSKPE=1B24 ;DISABLE DISK PARITY ERROR STOP DCHNPE=1B25 ;DISABLE CHANNEL DATA PARITY ERROR STOP WRBIT=1B26 ;SET MEANS WRITE ON DISK, RESET MEANS READ FROM DISK ;BITS 27 - 34 ;CORRESPONDING BITS OF INITIAL CHANNEL CONTROL ADDRESS, HENCE, ; THIS ADDRESS MUST BE EVEN AND IN THE FIRST 1K OF CORE MEMORY! ;BIT 35 ;WRITE EVEN PARITY DATA INTO MEMORY (DIAGNOSTICS ONLY!) REFRESH: PUSHJ PDP,DISKUP ;BE SURE THE DISK IS UP AND READY. PUSHJ PDP,WRITLK ;BE SURE WRITE-LOCK SWITCHES ARE OFF. PUSHJ PDP,CAPCTY ;DETERMINE THE CURRENT DISK CAPACITY OF THE ; SYSTEM, I.E. HOW MANY DISKS ARE ATTACHED TODAY ? MOVEM TAC,LBHIGH ;STORE HIGHEST LEGAL LOGICAL BLOCK NUMBER AOS TAC IFN FTSWAP,< MOVE TAC1,K4SWAP LSH TAC1,BLKSPK ;COMPUTE AND SAVE THE LOWEST LOGICAL BLOCK SUBM TAC,TAC1 ; NUMBER RESERVED FOR SWAPPING. MOVEM TAC1,LOWSWP CAIG TAC1,STATBK ;SWAPPING AREA MUST NOT OVERLAY THE JRST RFRSHE ; VITAL STATISTICS BLOCK. > IDIVI TAC,NUMBLK MOVN TAC1,TAC ;SET SATXWD TO SHOW ONLY THE NUMBER OF HRLM TAC1,SATXWD ; SAT BLOCKS ACTUALLY IN EXISTENCE. HRRZ TAC1,MFDBLK ADDI TAC,2(TAC1) IFN FTSWAP,< CAML TAC,LOWSWP ;MAKE VARIOUS CONSISTENCY CHECK TO DETERMINE JRST RFRSHE ; THAT THE DISK PARAMETERS SPECIFIED DURING THE > CAIG TAC1,STATBK ; ONCE-ONLY DIALOGUE DO NOT CAUS THE DISK CAIGE TAC,STATBK ; SWAPPING AREA, VITAL STATISTICS BLOCK, AND/OR JRST RFRSH1 ; THE MFD AND SAT BLOCK TO OVERLAP ONE ANOTHER. RFRSHE: MOVEI TAC,RFSHME ;IF THERE IS SOME OVERLAPPING OF PUSHJ PDP,IOCON ; THESE DISK STORAGE AREAS, PRING AN PUSHJ PDP,OPOUT ; ERROR MESSAGE AND THEN GO BACK TO THE POP PDP,TAC ; DIALOGUE TO AK THE PARAMETER SPECIFICATION JRST REF6 ; QUESTIONS AGAIN. RFSHME: ASCIZ /PARAMETER SPECIFICATION ERROR. TRY AGAIN. / RFRSH1: PUSHJ PDP,WRSTAT ;WRITE OUT THE VITAL STATISTICS BLOCK ON THE DISK. JRST REFERR ; AN ERROR ON THIS WRITE IS BAD TROUBLE !! ;NEXT WRITE THE MFD (MASTER FILE DIRECTORY) ONTO THE DISK PUSHJ PDP,WNZCLR ;CLEAR THE OUTPUT BUFFER MOVE TAC,[XWD 1,1] ;THE FIRST ENTRY IN THE MFD IS FOR MOVEM TAC,WNZBUF ; THE MFD ITSELF. MOVE TAC,[SIXBIT/UFD/] HRR TAC,MFDBLK ;POINTER TO MFD RETRIEVAL INFORMATION MOVEM TAC,WNZBUF+1 MOVE TAC,[SIXBIT/*SAT*/] ;THE ONLY OTHER ENTRY INITIALLY IN THE MOVEM TAC,WNZBUF+2 ; MFD IS FOR THE FILE NAMED *SAT*.SYS WHICH HLRZ TAC1,SATXWD ; PERMITS ACCESS TO THE SAT BLOCKS FOR HRRZ TAC,MFDBLK ; ANYONE WHO WANTS TO LOOK AT THEM. SUBI TAC,-1(TAC1) ;COMPUTE POINTER TO THE RETRIEVAL INFORMATION HLL TAC,[SIXBIT/SYS/] ; FOR THE *SAT*.SYS FILE. MOVEM TAC,WNZBUF+3 HRRZS TAC ADDI TAC,1 ;COMPUTE LOGICAL BLOCK NUMBER OF THE MFD. PUSHJ PDP,WNZWR ;WRITE THE MFD OUT ONTO THE DISK. JRST REFERR ;ERROR MOVE TAC,[XWD -200,WNZBUF] PUSHJ PDP,CHKSUM HRRZM TAC1,CHKSAV ;SAVE CHECKSUM TO GO INTO RETRIEVAL INFORMATION. ;NEXT WRITE MFD RETRIEVAL INFORMATION BLOCK ONTO THE DISK PUSHJ PDP,WNZCLR ;CLEAR OUTPUT BUFFER MOVE TAC,[XWD 1,1] MOVEM TAC,WNZBUF ;FILE NAME HRRZ TAC,THSDAT HLL TAC,[SIXBIT /UFD/] MOVEM TAC,WNZBUF+1 ;FILE EXTENSION, DATE HRLZI TAC,045000 ;PROTECTION (ANY PROJECT 1 USER MAY WRITE IN MFD) PUSHJ PDP,MDTMOT ;FILL IN TIME, DATE, AND MODE MOVEM TAC,WNZBUF+2 MOVE TAC,[XWD -200,1] ;NEGATIVE WORD COUNT AND PROGRAMMER NUMBER MOVEM TAC,WNZBUF+3 ;GO INTO WORD 4 OF RETRIEVAL INFO HLRZ TAC1,SATXWD MOVE TAC,MFDBLK SUBI TAC,-2(TAC1) ;COMPUTE POINTER TO THE MFD. HRL TAC,CHKSAV ;RETRIEVE SAVED CHECKSUM OF MFD. MOVEM TAC,WNZBUF+4 MOVE TAC,MFDBLK ;THE LAST WORD OF ANY BLOCK OF RETRIEVAL INFORMATION MOVEM TAC,WNZBUF+177 ; MUST CONTAIN ITS OWN BLOCK NUMBER. PUSHJ PDP,WNZWR ;WRITE MFD RETRIEVAL INFOMRATION ONTO THE DISK JRST REFERR ;ERROR ;NEXT CREATE THE NECESSARY SAT BLOCKS ON THE DISK PUSH PDP,SATXWD ;SATXWD CONTROLS THE OUTER LOOP MOVEI TAC,SATENT ;SET UP SATPTR TO SHUFFLE THROUGH THE BLOCKS REFST1: MOVEM TAC,SATPTR PUSHJ PDP,WNZCLR ;CLEAR THE BUFFER MOVEI TAC1,NUMBIT SUBI TAC1,NUMBLK MOVEI TAC,NUMBLK PUSHJ PDP,SETWNZ ;MARK UNAVAILABLE BITS AT END OF THE BLOCK IFN FTSWAP,< HLRZ TAC1,@SATPTR ;GET FIRST LOGICAL BLOCK NUMBER IN THIS SAT BLOCK CAMGE TAC1,LOWSWP ;IS ENTIRE BLOCK WITHIN SWAPPING AREA? JRST REFST2 ;NO, JUMP AHEAD MOVEI TAC1,NUMBIT ;YES, MARK IT ALL OFF LIMITS MOVEI TAC,0 PUSHJ PDP,SETWNZ JRST REFST7 ;HAVING SET ALL BITS, NO FURTHER TESTING IS NEEDED, REFST2: MOVN TAC,TAC1 ADDI TAC1,NUMBLK SUB TAC1,LOWSWP ;IS ANY OF SWAPPING AREA WITHIN THIS SAT BLOCK? JUMPLE TAC1,REFST3 ;NO, JUMP AHEAD ADD TAC,LOWSWP ;YES, MARK SWAPPING AREA AS UNAVAILABLE. PUSHJ PDP,SETWNZ > REFST3: HLRZ TAC1,@SATPTR ;GET FIRST LOGICAL BLOCK NUMBER IN THIS SAT BLOCK. JUMPN TAC1,RFST3A ;ONLY FOR FIRST SAT BLOCK-- HRLZI TAC,400000 ;MARK LOGICAL BLOCK 0 AS BEING IN USE. IORM TAC,WNZBUF RFST3A: HRRZI TAC,STATBK CAIL TAC,(TAC1) ;IS THE VITAL STATISTICS BLOCK WITHIN CAIL TAC,NUMBLK(TAC1) ; THE RANGE OF THIS SAT BLOCK ? JRST REFST4 ;NO, JUMP AHEAD SUB TAC,TAC1 MOVEI TAC1,1 ;YES, MARK IT UNAVAILABLE, PUSHJ PDP,SETWNZ REFST4: MOVE TAC,SATXWD ;SET UP TO LOOP THRU LOGICAL BLOCK NUMBERS FOR MFD. SUB TAC,[XWD 3,1] ; MFD RETRVL INFO. SAT BLOCKS, AND SAT RETRVL INFO. REFST5: PUSH PDP,TAC HRRZS TAC HLRZ TAC1,@SATPTR CAIL TAC,(TAC1) ;IS THE INDICATED LOGICAL BLOCK NUMBER WITHIN CAIL TAC,NUMBLK(TAC1) ; THIS PARTICULAR SAT BLOCK ? JRST REFST6 ;NO, JUMP AHEAD SUB TAC,TAC1 MOVEI TAC1,1 ;YES, MARK IN-USE BIT. PUSHJ PDP,SETWNZ REFST6: POP PDP,TAC ;LOOP THROUGH THE WHOLE SET OF SPECIAL BLOCKS AOBJN TAC,REFST5 ; WHICH MUST BE MARKED UNAVAILABLE. REFST7: MOVE TAC,[XWD -200,WNZBUF] PUSHJ PDP,CHKSUM ;COMPUTE CHECKSUM MOVE TAC,SATPTR HRRZM TAC1,1(TAC) ;STORE IT TEMPORARILY IN THE SATENT TABLE. HRRZ TAC,(PDP) ;LOGICAL BLOCK NUMBER TO BE WRITTEN PUSHJ PDP,WNZWR ;WRITE THIS SAT BLOCK ONTO THE DISK JRST REFER1 ;ERROR POP PDP,TAC AOBJN TAC,.+2 ;LAST SAT BLOCK WRITTEN ? JRST REFSRF ;YES, GO WRITE SAT RETRIEVAL INFORMATION. PUSH PDP,TAC ;NO, ADVANCE SATPTR AND LOOP MOVE TAC,SATPTR ; BACK TO DO NEXT SAT BLOCK. ADDI TAC,SENTSZ JRST REFST1 ;FINALLY, WRITE OUT THE RETRIEVAL INFORMATION FOR THE FILE *SAT*.SYS REFSRF: PUSHJ PDP,WNZCLR ;CLEAR THE BUFFER MOVE TAC,[SIXBIT /*SAT*/] MOVEM TAC,WNZBUF ;STORE FILE NAME HRRZ TAC,THSDAT HLL TAC,[SIXBIT /SYS/] MOVEM TAC,WNZBUF+1 ;STORE EXTENSION AND DATE HRLZI TAC,555000 ;PROTECTION CODE (UNTOUCHABLE FILE ! ) PUSHJ PDP,MDTMOT ;FILL IN TIME, DATE AND MOTE MOVEM TAC,WNZBUF+2 HLLZ TAC,SATXWD ;COMPUTE NEGATIVE WORD COUNT LSH TAC,7 HRRI TAC,1 ;PROGRAMMER NUMBER=1 MOVEM TAC,WNZBUF+3 MOVEI TAC,SATENT ;PREPARE TO STORE POINTERS TO ALL THE SAT BLOCKS. MOVE TAC1,SATXWD MOVEI AC2,0 REFSRL: HRRZ AC1,TAC1 ;GET LOGICAL BLOCK NUMBER OF SAT BLOCK. HRL AC1,1(TAC) ;RETRIEVE THE CORRESPONDING CHECK-SUM. MOVEM AC1,WNZBUF+4(AC2) ;STORE A POINTER WORD IN THE BUFFER. MOVSI AC1,400000 ;RESTORE SATENT ENTRY TO CORRECT INITIAL VALUE. MOVEM AC1,1(TAC) AOS AC2 ADDI TAC,SENTSZ AOBJN TAC1,REFSRL ;IS THAT ALL THE POINTERS ? IF NOT, LOOP BACK. MOVE TAC,MFDBLK ;YES. ADDI TAC,1(AC2) ;NOW COMPUTE LOGICAL BLOCK NUMBER OF THIS SAT MOVEM TAC,WNZBUF+177 ; RETRIEVAL INFORMATION, AND STORE IT IN ; THE LAST WORD OF THE BLOCK (THIS IS ; REQUIRED FORMAT OF ALL RETRVL INFO). PUSHJ PDP,WNZWR ;WRITE THE *SAT*.SYS RETRVL INFO ONTO THE DISK. JRST REFERR ;ERROR JRST CPOPJ1 ;***EXIT FROM PDP-10 DISK REFRESHER.***......... ;ROUTINE TO WRITE THE FIXED BLOCK OF VITAL STATISTICS ONTO THE DISK. WRSTAT: PUSHJ PDP,WNZCLR ;CLEAR THE OUTPUT BUFFER MOVE TAC,[XWD -WRSTSZ,0] WRSTA1: MOVE TAC1,@WRSTA9(TAC) ;STORE KEY QUANTITIES IN THE OUTPUT BUFFER MOVEM TAC1,WNZBUF(TAC) AOBJN TAC,WRSTA1 MOVE TAC,[SIXBIT/STATBK/] ;STORE AN IDENTIFIER NEAR THE MOVEM TAC,WNZBUF+^D126 ; END OF THE VITAL STATISTICS BLOCK. MOVEI TAC,STATBK PUSHJ PDP,WNZWR ;WRITE THIS VITAL STATISTICS BLOCK ONTO THE DISK. JRST WRSTA2 ;WRITE ERROR JRST CPOPJ1 ;GOOD WRITE. ***SUBROUTINE EXIT***........... WRSTA2: MOVEI TAC,WRSTM1 PUSHJ PDP,ICONM ;PRINT ERROR MESSAGE IF THIS VITAL WRITE FAILS. PUSHJ PDP,OPOUT POPJ PDP, ;THEN ALSO GIVE AN ERROR RETURN FOR FURTHER ACTION. WRSTM1: ASCIZ /CANNOT WRITE VITAL STATISTICS BLOCK ON DISK. HELP!! / ;TABLE OF POINTERS TO THE VITAL STATISTICS THAT ARE STORED IN "STATBK" ON THE DISK. WRSTA9: XWD ,MFDBLK ;LOGICAL BLOCK NUMBER OF MFD RETRIEVAL INFORMATION XWD ,SATXWD ;LH = - NUMBER OF SAT BLOCKS ACTUALLY IN EXISTENCE. ;RH = LOGICAL BLOCK NUMBER OF FIRST SAT BLOCK XWD ,LBHIGH ;HIGHEST LEGAL LOGICAL BLOCK NUMBER ON DISK(S) XWD ,LOWSWP ;LOWEST LOGICAL BLOCK NUMBER ALLOCATED FOR SWAPPING XWD ,K4SWAP ;NUMBER OF 1K BLOCKS OF DISK SPACE FOR SWAPPING IFN FTSWAP,< XWD ,MAXSWP ;MAXIMUM NUMBER OF THOSE 1K BLOCKS ACTUALLY ; USED SINCE THE DISK WAS LAST REFRESHED. > IFE FTSWAP,< XWD 0,LOWSWP ;LOWSWP DOES DOUBLE DUMMY DUTY IN ; NON-SWAPPING SYSTEM > WRSTSZ=.-WRSTA9 ;ROUTINE TO READ IN THE FIXED BLOCK OF "VITAL STATISTICS" FROM ; THE DISK AND DISTRUBUTE THEM TO THE APPROPRIATE CORE LOCATIONS. RDSTAT: MOVEI TAC,STATBK PUSHJ PDP,WNZRD ;READ IN THE VITAL STATISTICS BLOCK. JRST RDSTA2 ;ERROR MOVE TAC,WNZBUF+^D126 ;CHECK THE IDENTIFIER TO VERIFY THAT CAME TAC,[SIXBIT /STATBK/] ; THE CORRECT BLOCK WAS READ. JRST RDSTA2 ;ERROR, STATISTICS BLOCK APPARENTLY WAS CLOBBERED. MOVE TAC,[XWD -WRSTSZ,0] ;STORE AWAY THESE IMPORTANT PARAMETERS RDSTA1: MOVE TAC1,WNZBUF(TAC) ; UNDER CONTROL OF A TABLE IN THE "WRSTAT" MOVEM TAC1,@WRSTA9(TAC) ; ROUTINE WHICH WRITES OUT THE VITAL AOBJN TAC,RDSTA1 ; STATISTICS BLOCK ONTO THE DISK. POPJ PDP, ;***SUBROUTINE EXIT***........ RDSTA2: MOVEI TAC,RDSTM1 ;PRINT ERROR MESSAGE IF THE VITAL PUSHJ PDP,ICONM ; STATISTICS BLOCK CANNOT BE READ PUSHJ PDP,OPOUT PUSHJ PDP,REF ;GO THRU THE REFRESH DIALOGUE IN "ONCE". JRST RDSTAT ;NOW TRY AGAIN. RDSTM1: ASCIZ /VITAL DISK STATISTICS LOST, SUGGEST REFRESHING! / ;ROUTINE TO DETERMINE THE CURRENT SYSTEM'S DISK CAPACITY. I.E., THE NUMBER OF ; DISKS ATTACHED TO THE RC-10 DISK SYNCHRONIZER TODAY. ;ON EXIT FROM THIS SUBROUTINE ; C(TAC) = HIGHEST LOGICAL DISK BLOCK NUMBER NOW EXTANT. CAPCTY: MOVEI TAC,NUMSAT IMULI TAC,NUMBLK ;COMPUTE AND SAVE MAXIMUM POSSIBLE CAPACITY. PUSH PDP,LBHIGH ;SAVE EXISTING VALUE OF HIGHEST LEGAL BLOCK NUMBER. MOVEM TAC,LBHIGH ;TEMPORARILY CHANGE THIS VALYUE SO THAT THE VALIDITY ; CHECK IN "DSKINT" WILL NOT FAIL SPURIOUSLY. MOVEI TAC,0 CPCT1: PUSH PDP,TAC PUSHJ PDP,WNZRD ;ATTEMPT TO READ FIRST BLOK OF EACH SUCCESSIVE DISK., JRST CPCT3 ;ERROR POP PDP,TAC ADDI TAC,NUMBLK CAMGE TAC,LBHIGH ;ALREADY TRIED ALL DISKS (MAXIMUM CAPACITY) ? JRST CPCT1 ;NO, GO TRY THE NEXT ONE. CPCT2: SUBI TAC,1 POP PDP,LBHIGH ;RESTORE PREVIOUSLY EXISTING VALUE OF THE HIGHEST ; LEGAL LOGICAL DISK BLOCK NUMBER. POPJ PDP, ;***SUBROUTINE EXIT***....... CPCT3: POP PDP,TAC CONSZ DSK,NRDY ;NON-EXISTENT DISK? JUMPN TAC,CPCT2 ;YES, THE LIMIT OF DISK STORAGE HAS BEEN FOUND. ; HOWEVER, DISK 0 MUST ALWAYS BE PRESENT. MOVEI TAC,CPCTM1 ;NO, SOME OTHER TYPE OF READ ERROR. PUSHJ PDP,ICONM PUSHJ PDP,OPOUT ;PRINT ERROR MESSAGE POP PDP,LBHIGH JRST CAPCTY ;TRY AGAIN CPCTM1: ASCIZ /DISK READ ERROR DURING CAPACITY SEARCH INITIALIZATION / ;ROUTINE TO ASSURE THAT THE STATUS OF THE WRITE-LOCK SWITCHES ON THE ; DISK MAINTENANCE PANEL IS SUCH THAT THEY ARE PROTECTING "LESS THAN 0000". ;THIS ROUTINE LOOPS PRINTING AN ERROR MESSAGE UNTIL THE SWITCHES ARE O.K. WRITLK: CONI DSK,TAC TLNN TAC,13777 ;BOUNDARY ZERO AND MAINTENANCE-SEGMENT OFF ? TLNN TAC,B53 ;YES, IS ROTARY SWITCH SET ; TO EITHER X UNDER OR OVER(AS OPPOSED ; TO UNDER OR X OVER) JRST WRLK8 ;NO. GO PRINT ERROR MESSAGE AND LOOP. ;AN UNFORTUNATE HARDWARE OVERSIGHT MAKES IT IMPOSSIBLE TO SENSE THE DIFFERENCE ; BETWEEN "PROTECT LESS THAN" AND "PROTECT LESS THAN OR EQUAL". THEREFORE ; THIS ROUTINE MUST ACTUALLY TRY WRITING ON TRACK 0000. MOVE TAC,[252525252525] MOVEM TAC,WNZBUF MOVE TAC,[XWD WNZBUF,WNZBUF+1] BLT TAC,WNZBUF+177 MOVEI TAC,0 PUSHJ PDP,WNZWR ;WRITE PATTERN IN BLOCK 0. JRST WRLK2 ;ERROR POPJ PDP, ;***GOOD EXIT FROM WRITLK SUBROUTINE***......... WRLK2: MOVEI TAC,WRLKM1 CONSZ DSK,WRPE ;WRITE-PROTECTION ERROR ? ;YES, PROTECT SWITCH ERRONEOUSLY SET ON "LESS THAN ; OR EQUAL" INSTEAD OF "LESS THAN". ;NO, SOME OTHER FAILURE DURING THE WRITE OF BLOCK 0. WRLK8: MOVEI TAC,WRLKM2 ;WRITE-LOCK SWITCHES SET INCORRECTLY. WRLK9: PUSHJ PDP,ICONM ;PRINT ERROR MESSAGE PUSHJ PDP,OPOUT JRST WRITLK ;GO TRY AGAIN WRLKM1: ASCIZ /DISK BLOCK 0 WRITE ERROR DURING WRITE-LOCK CHECK. / WRLKM2: ASCIZ /"MAINTENANCE SEGMENT" SWITCH MUST BE OFF. AND DISK WRITE PROTECTION SWITCHES MUST BE SET TO 0000 AND "LESS THAN", FIX THEM ! ! / ;DISK READING ROUTINE FOR USE ONLY DURING ONCE-ONLY CODE. ; AVOIDS USING THE MONITOR OUFUFS AND INTERRUPT STRUCTURE. ;ON ENTRY TO THIS SUBROUTINE, TAG CONTAINS THE LOGICAL BLOCK NUMBER OF THE DISK ; BLOCK WHICH IS TO BE READ INTO THE ONCE-ONLY DISK BUFFER AREA. WNZRD: CONO DSK,DATERR!DEVERR!SETERR!RESETB ;CLEAR THE DISK SYNCHRONIZER CONSZ DSK,BUSYBT!DONEFLG JRST WNZRD ;DON'T PROCEED UNLESS THE CLEAR WORKED. PUSH PDP,DSKFDG ;SAVE THIS INSTRUCTION FROM "DSKINT" MOVE TAC1,[HRRZI TAC,0] ;NOW TAMPER WITH THAT SAVED LOCATION SO MOVEM TAC1,DSKFDG ; THAT DSKINT WILL NOT ENABLE ANY INTERRUPT CHANNEL. MOVE TAC1,[XWD -200,WNZBUF-1] PUSHJ PDP,DFRED ;CALL DEVICE-DEPENDENT ROUTINE IN "DSKINT" DIRECTLY. WNZRDC: POP PDP,DSKFDG ;RESTORE THE MOLESTED INSTRUCTION IN DSKINT. PUSHJ PDP,WNZWAT ;WAIT UNTIL THE READ IS FINISHED. CONSZ DSK,DATERR!DEVERR!SETERR ;ANY ERRORS ? JRST WNZRDX ;YES, GIVE ERROR RETURN. MOVE TAC1,RCXCCW ;NO, BUT CHECK THAT THE FINAL VALUE OF THE CAMN TAC1,RCXFIN ; CHANNEL CONTROL WORD WAS AS EXCPECTED ALSO. AOS (PDP) ;***GOOD RETURN***........ WNZRDX: POPJ PDP, ;ERROR RETURN, ;DISK WRITING ROUTINE FOR USE ONLY DURING ONCE-ONLY CODE. ; AVOIDS USING THE MONITOR QUEUES AND INTERRUPT STRUCTURE. ;ON ENTRY TO THIS SUBROUTINE, TAC CONTAINS THE LOGICAL BLOCK NUMBER OF THE DISK ; BLOCK WHICH IS TO BE WRITTEN ONTO THE DISK FROM THE ONCE-ONLY DISK BUFFER AREA. WNZWR: CONO DSK,DATERR!DEVERR!SETERR!RESETB ;CLEAR THE DISK SYNCHRONIZER. CONSZ DSK,BUSYBT!DONEFLG JRST WNZWR ;DON'T PROCEED UNLESS THAE CLEAR WORKED. MOVEM TAC,LBSAVE ;SAVE LOGICAL BLOCK NUMBER IN CASE AN ERROR RETURN ; MUST BE TAKEN FROM THE "REFRESH" SUBROUTINE. PUSH PDP,DSKFDG ;SAVE THIS ISNTRUCTION FROM "DSKINT". MOVE TAC1,[HRRZI TAC,0] ;NOW TAMPER WITH THAT SAVED LOCATION SO MOVEM TAC1,DSKFDG ; THAT DSKINT WILL NOT ENABLE ANY INTERRUPT CHANNEL. MOVE TAC1,[XWD -200,WNZBUF-1] PUSHJ PDP,DFWRT ;CALL DEVICE-DEPENDENT ROUTINE IN "DSKINT" DIRECTLY. JRST WNZRDC ;THE REMAINDER OF THE WRITE ROUTINE IS IDENTICAL ; TO THE READ ROUTINE ;SUBROUTINE TO WATCH FOR THE DONE FLAG TO COME ON AND TIME OUT IF ; IT DOESN'T COME UP SOON ENOUGH (SAY 5 SEC OR SO). WNZWAT: MOVE TAC,[^D1000000] ;AT MOST ONE MILLION TIMES THRU THE CONSZ-SOJG LOOP WNZWTL: CONSZ DSK,DONEFLG ;DONE FLAG ON YET ? POPJ PDP, ;YES, GOOD EXIT....... SOJG TAC,WNZWTL ;NO, TIMED OUT YET ? ;YES, PRINT "DISK HUNG" ERROR MESSAGE. MOVEI TAC,WATMSG PUSHJ PDP,ICONM PUSHJ PDP,OPOUT POP PDP,TAC ;SKIP UP A SUBROUTINE LEVEL, AND GIVE AN POPJ PDP, ; ERROR RETURN FROM WNZRD OR WNZWR....... WATMSG: ASCIZ /DISK HUNG. / ;SUBROUTINE TO SET SPECIFIED BITS IN A SAT BLOCK WHILE FORMING IT IN WNZBUF ;ENTRY CONDITIONS -- C(TAC) = FIRST BIT NUMBER TO SET (NUMBERED BEGINNING AT 0) ; C(TAC1) = NUMBER OF BITS TO SET SETWNZ: MOVE AC1,TAC1 IDIVI TAC,^D36 MOVSI AC2,400000 MOVNS TAC1 ROT AC2,(TAC1) STWNZ1: ORM AC2,WNZBUF(TAC) ROT AC2,-1 JUMPG AC2,STWNZ2 ADDI TAC,1 STWNZ2: SOJN AC1,STWNZ1 POPJ PDP, ;SUBROUTINE EXIT........... ;SUBROUTINE TO CLEAR THE ONCE-ONLY OUTPUT BUFFER, WNZBUF WNZCLR: SETZM WNZBUF MOVE TAC,[XWD WNZBUF,WNZBUF+1] BLT TAC,WNZBUF+177 POPJ PDP, ;SUBROUTINE EXIT........... ;SUBROUTINE TO MASK THE TIME, DATE, AND DATA MODE (=14 FOR BINARY MODE0 INTO ACCUMU- ; LATOR TAC IN THE FORMAT USED IN WORD 3 OF A DISK RETRIEVAL INFORMATION BLOCK. MDTMOT: PUSH PDP,TAC MOVE TAC,TIME ;GET TIME IN JIFFIES. IDIVI TAC,JIFMIN ;CONVERT TO MINUTES LSH TAC,^D12 IOR TAC,THSDAT ;TODAY'S DATE TLO TAC,14B<^D12*^D18> ;BINARY MODE IORM TAC,(PDP) POP PDP,TAC POPJ PDP, ;SUBROUTINE EXIT............ ;ERROR EXIT FROM "REFRESH" WHEN A BAD WRITE ON THE DISK OCCURS DURING REFREHSING. REFER1: POP PDP,TAC ;CORRECT PDP IF EXTRA PUSH HAD OCCURRED. REFERR: MOVE TAC,LBSAVE ;GET BLOCK NUMBER FOR THE ERROR MESSAGE AT REF4. POPJ PDP, ;THIS NO-SKIP RETURN RE-ENTERS THE REFRESH DIALOGUE. ;MISCELLANEOUS STORAGE SPACE USED BY THE PDP-10 DISK REFRESHING ROUTINE. CHKSAV: 0 LBSAVE: 0 WNZBUF: BLOCK 200 ;BUFFER FOR READING AND WRITING DISK ; BLOCKS DURING THE ONCE-ONLY CODE. LOWSWP: 0 ;LOWEST LOGICAL BLOCK FOR SWAPPING > ;END OF REFRESH PROCEDURE FOR THE RD10 DISK. > ;CLOSE AN EVEN EARLIER FTDISK CONDITIONAL. INTERNAL FTCHECK IFN FTCHEC,< EXTERNAL CHKREG,CHKEND,CHECK,MONPTR,MONSUM CK: MOVEI TAC,CHKBEG SUBI TAC,CHKEND HRLI TAC,CHKBEG MOVSS TAC PUSHJ PDP,CHECK ;COMPUTE AND STORE CHECKSUM OF THE PURE AREA OF MOVEM TAC1,MONSUM ; THE TIME-SHARING MONITOR. POPJ PDP, > ONCEND: END