;FROM A TAPE\r
SPACE=4 ;NUMBER OF BLOCKS SEPERATING CONTIGUOUS BLKS OF A FILE\r
\r
+\r
;DDB MAGIC CELLS\r
FSTBLK=13\r
DLOC=14\r
UDSD=100\r
LSTSAV=20000\r
\r
+\r
;FLAGS IN LH OF IOS\r
NOLINK=200\r
CHNGDR=400\r
RUNBIT=200000\r
RECKON=400000 ;THIS TAPE IS DEAD-RECKONING.\r
; (MUST BE SIGN BIT)\r
-\r
CPBIT=-1 ;FEATURE TEST TO ALLOW IO INTO USER AREA DIRECTLY\r
;IT WILL ONLY HAPPEN ON DUMP MODE WITH NON-STANDARD BIT\r
;(UDSD) ON\r
+\r
\f EXTERN JIFSEC\r
\r
INTERN DTAINT,DTADDB,DTAINI,DTADDS,DTADSP\r
EXP DTADSP\r
XWD 1107,154403\r
EXP 0,0\r
-\r
XWD PROG,0\r
XWD PROG,0\r
EXP 0,0,0\r
-\r
EXP DTADIR\r
EXP 0,0,0,0,0\r
-\r
-\r
DTADIR: BLOCK 200\r
DTADDS=.-DTADDB\r
\r
+\r
JRST DTAINI\r
JRST HUNGTP ;HUNG DEVICE\r
DTADSP: JRST UREL\r
SOJA TAC1,MTAP0\r
POPJ PDP, ;OTHERS ARE NO-OPS\r
\r
+\r
;INITIALIZE DTC\r
DTAINI: CONO DTC,0\r
SETZM DISCON\r
\r
;COME HERE TO RENAME TO A REAL NEW NAME\r
RENAM2: MOVE DAT,TAC ;SAVE LOC OF NAME IN DIRECTORY\r
-\r
PUSHJ PDP,DSERCH ;SEARCH FOR NEW NAME\r
SKIPA ;NOT FOUND - GOOD\r
JRST RENER2 ;NAME ALREADY EXISTS - ERROR\r
SOJA DAT,CPOPJ\r
HRLI DAT,060500\r
SOJA DAT,CPOPJ\r
-\r
\f;COME HERE TO DELETE THE FILE WHOSE INDEX IS INN TAC\r
DLETE: MOVEI TAC1,0 ;SET TO DELETE BLOCKS\r
PUSHJ PDP,BLKSRC ;FIND A BLOCK BELONGING TO FILE\r
\r
;HERE FOR NEW FILE NAME ON ENTER\r
NEWENT: SUB TAC,[XWD 26,26];START AT BEGINNING OF DIRECT.\r
-\r
SKIPN (TAC) ;FIND A FREE SLOT\r
AOJA UUO,ENTR2 ;RETURN WITH UUO POINTING TO WRD 2\r
AOBJN TAC,.-2\r
POPJ PDP, ;NONE AVAILABLE.\r
\r
+\r
;SET UP LENGTH OF FILE IN DIRECTORY FOR A SAVE FILE\r
SETWD4: HLRE TAC1,@UUO ;GET -LENGTH\r
MOVNS TAC1 ;+LENGTH\r
MOVE TAC,BLK ;TELL USER THE BLOCK NUMBER\r
JRST STOTAC\r
\r
+\r
;GET NEXT (OR PREVIOUS) FREE BLOCK\r
USRFRE: MOVEI TEM,SPACE ;BLOCKS "SPACE" APART\r
LDB BLK,PIOMOD ;EXCEPT DUMP AND SAVMOD FILES\r
USLSTA: PUSHJ PDP,LSTFRE ;THIS ONE\r
JRST CALNXT+1\r
\r
+\r
;NO FREE BLOCKS AVAILABLE. GIVE HIGH BLOCK,SET IOBKTL LATER\r
NOBLKS: MOVEI BLK,TOPBLK+1 ;SET HIGH BLOCK\r
POPJ PDP,\r
MOVEM IOS,DEVIOS(DEVDAT) ;SAVE IOS\r
JRST OUT ;GO TO WRITE RECORD\r
\r
+\r
+\r
;HERE TO CLOSE A DUMP MODE FILE\r
CLSDMP: TLO IOS,DMPCLS+IO+DMPMOD ;SET SWITCHES\r
PUSHJ PDP,GETDT ;GET CONTROL\r
PUSHJ PDP,WRTBLK ;WRITE UT\r
PUSHJ PDP,WAIT1 ;WAIT TILL IT HAS BEEN WRITTEN\r
\r
+\r
UREL2: MOVE TAC,DEVIAD(DEVDAT) ;BITS 1,2 ARE COUNT OF CHANS\r
TLNE TAC,200000 ;DEV INITED ON ANOTHER CHANNEL TOO?\r
-\r
QUANTL: POPJ PDP,QUANT ;YES, DON'T ZAP IOS OR DDB\r
\r
;SOME BITS IN THE IOS WORD AND THE DDB WILL NORMALLY BE CHANGED ON THE\r
;IT WILL WORK (CHECK IS MADE AT ENTER)\r
SETZM FSTBLK(DEVDAT)\r
JRST STOIOS ;STORE IOS AND RETURN\r
+\r
+\r
\fGETDT0: PUSHJ PDP,SETACT ;WAIT TILL TAPE COMES OUT OF REWIND\r
PUSHJ PDP,WSYNC ;BEFORE DOING ANYTHING ELSE TO IT\r
;GET DEC TAPE CONTROLLER\r
JUMPE BLK,EOF ;0 MEANS EOF\r
PUSHJ PDP,BLKCHK ;CHECK LEGALITY OF BLOCK NUMBER\r
TLNN IOS,DMPMOD ;DUMP MODE?\r
-\r
CAIE BLK,DIRBLK ;TRYING TO READ DIRECTORY?\r
JRST READBF ;NO. GO READ\r
\r
JRST STOIOS\r
JRST DMPEOF ;GIVE UP CONTROL IF DUMP-MODE\r
\r
+\r
;ZERO USER'S CORE ON SAVE-MODE INPUT\r
ZERCOR: MOVEI TAC,JOBDDT(PROG) ;ZERO CORE\r
HRLI TAC,1(TAC)\r
CAIN BLK,DIRBLKK ;CHECK IF WRITING DIRECTORY\r
JRST COR2HM ;YES, WRITE CORE IMAGE\r
JUMPE BLK,FAKADV ;DONT WRITE IF NO BLOCK GIVEN\r
-\r
PUSHJ PDP,BLKCHK ;CHECK FOR LEGAL BLOCK\r
UOUT2: TLNN IOS,DMPMOD ;ALREADY HAVE CONTROL IF DUMP-MODE\r
PUSHJ PDP,GETDT ;GET DEC TAPE CONTROLLER\r
OUTBL2: HRRZ BLK,OBLK(DEVDAT)\r
PUSHJ PDP,STOIOS\r
\r
+\r
WRTBLK: PUSHJ PDP,FNDBLK ;GO SEARCH FOR BLOCK\r
MOVE TAC1,[BLKO DTC,700] ;HERE WE ARE - GO WRITE\r
JRST RDWRT\r
DMPTS1: POP PDP,TAC\r
JRST THRUTD\r
\r
+\r
IFN CPBIT, <\r
;HERE TO START DUMP-MODE INTO USER AREA DIRECTLY\r
TOUSER: JUMPE AC2,NOBLK0 ;CANT READ BLK 0 IN NON-STD DUMP MODE\r
POP PDP,TAC ;WRITING - THIS WILL SAVE LOTS OF TIME\r
JRST OUTBL2\r
\r
+\r
NOBLK0: TRO IOS,IOIMPM\r
POP PDP,TAC ;RETURN TO UUOCON WITH ERROR BIT SET\r
JRST THRUTD\r
MOVEM TAC,BUF ;WD CNT =177\r
JRST OUFULL ;GO WRITE PART OF STUFF\r
\r
+\r
;GET NEXT COMMAND FROM LIST\r
NXTCOM: SKIPN DMPLST(DEVDAT) ;END OF COMMANDS?\r
JRST NXTCM2 ;YES. RETURN\r
JUMPG TAC,NXTCM1 ;GO-TO WORD\r
ADDI TAC,(PROG) ;REAL COMMAND - ADD RELOCATION\r
AOJA TAC,CPOPJ1 ;AND RETURN\r
+\r
\f;END OF DUMP-MODE LIST\r
NXTCM2: SETZM SVDWRD(DEVDAT) ;ZERO POINTERS\r
SETZM DMPLST(DEVDAT)\r
POPJ PDP,\r
\r
+\r
DMPFLC: SKIPE TAC,SVDWRD(DEVDAT) ;IS THERE ANOTHER COMMAND\r
JRST DMPFLA ;YES. GET IT\r
JRST DMPTH2 ;NO. THROUGH\r
SKIPA TAC,BFPNTR ;NO. INTO BUF\r
HRR TAC,DLOC(DEVDAT) ;YES. LOC OF DIRECTORY\r
CONSZ DTC,100000 ;IN REVERSE?\r
-\r
JRST IORVRS ;YES\r
SOS TAC ;ADDRESS -1\r
MOVE TEM,IOWD ;GET IOWD\r
MOVE TEM,[JSR RVERS]\r
JRST IOGO ;COMPILCATED STUFF FOR EACH WORD\r
\r
+\r
;HERE FOR AY DATA WORD WITH TAPE IN REVERSE\r
RVERS: 0\r
IOWD: BLKI DTC,PNTR ;READ (WRITE) A WORD\r
MOVEI BLK,0 ;SEARCH FOR BLOCK 0\r
PUSHJ PDP,FNDBLK ;GO FIND BLOCK\r
\r
+\r
;CONTROL COMES HERE ON INTERRUPT CHANNEL WHEN THE BLOCK IS FOUND\r
TLNE IOS,RUNBIT ;REWIND UNLOAD?\r
JRST .+3 ;YES, CONTINUE\r
MOVE IOS,DEVIOS(DEVDAT) ;RESET IOS\r
JRST REWDUN ;DECREASE DTREQ. STOP TAP\r
\r
+\r
;HERE TO PUT C(TAC) IN THE CLOCK QUEUE\r
CLKREQ: 0\r
CONO PI,PIOFF ;TURN OFF PI\r
TLNE TAC,2000 ;IS CONTROL STILL ACTIVE?\r
JRST SRCHD ;YES. MUST BE IN "PSEUDO END-ZONE"\r
DATAI DTC,TAC ;NO. READ A BLOCK NUMBER\r
- TLZ TAC,-1 ;LEGAL BLOCK NUMBER>\r
+ TLZ TAC,-1 ;INSURANCE\r
+ CAILE TAC,TOPBLK ;LEGAL BLOCK NUMBER?\r
JRST SRCHB ;NO. SET ERROR SWITCH\r
SUB TAC,BLOCK ;NOW-WANTED\r
IFN CPBIT, <\r
SRCHA: CONSZ DTC,100000 ;IF TAPE IS IN REVERSE\r
MOVNS TAC ;SWITCH TURN-AROUND TEST\r
JUMPLE TAC,.+3 ;TEST FOR DISCONNECT IF DIRECTION IS CORRECT\r
-\r
;***\r
CONO DTC,DTTURN ;TURN AROUND\r
JRST SRCHXT ;AND GO AWAY\r
CONO DTS,770001 ;FUNCTION STOP\r
JRST SRCHXT ;GO AWAY\r
\r
+\r
IFN CPBIT, <\r
SRCHC: CONSZ DTC,100000 ;GOING FORWARD?\r
TLCA TAC,400000 ;NO. SWITCH TURN AROUND TEST. ENSURE FORWARD\r
LDB TAC1,PJOBN ;ASSOCIATED JOB NUMBER\r
HRRM TAC1,MONB2 ;SAVE IN WD 2 OF MONITOR BUFFER\r
HRLM DEVDAT,MONB2 ;SAVE ADDRESS OF DTA\r
-\r
CONSZ DTC,200000\r
IMULI TAC,62 ;COMPUTE A TIME TO BLOCK\r
CONSZ DTC,100000 ;BASED ON 50 MSEC/BLOCK FORWARD\r
TIMREQ: XWD BACK,0\r
TIMRQ2: XWD BACKA,1\r
\r
+\r
IFN ALMACT,<\r
EXTERN PRIIN\r
;COME HERE ON THE CLOCK LEVEL TO BRING THE JOB ASSOCIATED WITH\r
ANDCAM TAC,DEVIOS(DEVDAT) ;ZAP BIT SO IT WONT BE SWAPPED OUT AGAIN\r
POPJ PDP,\r
\r
+\r
;HERE WHEN SWAPPER DOES GET THE JOB BACK INTO CORE\r
SWPBAK: MOVE IOS,DEVIOS(DEVDAT)\r
SETM MONB2 ;CLEAR JOB NO, FROM MON BUFFER\r
HLRZ TAC1,IBLK(DEVDAT) ;BLOCK NEEDED\r
DPB TAC1,[POINT 10,BLOCK,35]\r
HRRZ TAC,CLOCK\r
-\r
HRLI TAC1,CPOPJ ;FIND CLOCK-QUEUE REFERENVCE TO BACKC\r
BACK3: CAIN TAC,CIPWTM\r
JRST BACKD ;NOT THERE, TAPE MUST HAVE BEEN STOPPED\r
EXCH TAC,DISCON ;UNIT TO CONNECT TO\r
JRST BACK2 ;GO RECONNECT\r
\r
+\r
;IF WE GET HERE THERE IS A SLOW TAPE ON THE SELECTED DRIVE\r
BACKC: CONO PI,PIOFF ;CANT RISK CHANGING THE INTERRUPT ENABLES HRE\r
CONI DTS,TAC ;READ IN ENABLE FLAGS\r
FNDPDP: XWD -2,.\r
0\r
\r
+\r
IFN CPBIT, <\r
;HERE WHERE DUMP-MODE POINTER RUNS OUT\r
DMPADV: 0\r
CONSZ DTS,670000 ;AND NO ERRORS?\r
JRST ERRS ;NO. TOUGH LUCK\r
SKIPGE BLOCK ;BAD BLOCK NUMBER ON TAPE?\r
+ JRST DERR ;YES, TURN ON IODERR\r
DTAIN2: TLNE IOS,DMPMOD ;DUMP MODE?\r
JRST DMPTHR ;YES. GO ELSEWHERE\r
TLNN IOS,SINGL\r
JRST OUTHRU ;YES\r
\fEXTERN JBTSTS,PJOBN\r
\r
+\r
;HERE ON END OF AN INPUT BLOCK\r
HRROI TAC1,177 ;MASK OUT 1ST-BLK DATA\r
TRNN IOS,UDSD ;UNLESS IN NON-STD\r
JRST THRUIN\r
PUSHJ PDP,ADVBFF ;GET NEXT BUFFER\r
JRST THRUIN ;EMPTY BUF NOT AVAILABLE\r
-\r
SKIPLE DISCON ;TAPE TIMED OUT?\r
JRST BACKB ;YES. GO RECONNECT\r
SKIPE BLK ;EXIT IF EOF OR BLOCK TOO LARGE\r
SKIPG DTREQ ;YES. ANYONE ELSE WANT IT?\r
JRST READBC ;NO. READ NEXT BLOCK\r
\r
+\r
THRUIN: HRRZ TAC,OBLK(DEVDAT) ;TAPE ALSO BEING WRITTEN?\r
JUMPN TAC,THRUTP ;YES. DONT CHANGE REVERSE BIT\r
TLZ IOS,RVERSE ;NO. SET IOS BIT TO CORRECT DIRECTION\r
;WHEN THE TAPE TIMES OUT FNDBLK WILL RESET THE HUNG TIME, AND\r
;IF IT IS STILL HUNG AT ITS END THE ERROR MESSAGE WILL OCCUR\r
\r
+\r
INTERN FTSWAP\r
EXTERN SHFWAT\r
;HERE ON END OF BLOCK WHEN THE JOB IS STILL SWAPPED OUT\r
JRST FILBUF ;NO. GO WRITE NEXT BLOCK\r
JRST THRUTP ;YES. GIVE UP TAPE\r
\r
+\r
;TURN TAPE AROUND AFTER END-ZONE INTERRUPT\r
TURN: CONSZ DTC,500 ;READ BLOCK NUMBERS?\r
JRST DIREOF ;NO. END ZONE WHILE READING DATA\r
HRRM BLK,IBLK(DEVDAT) ;SAVE IN DDB\r
JRST CPOPJ1\r
\r
+\r
IFN CPBIT, <\r
;HERE WHEN THROUGH DUMP-MODE DIRECTLY TO USER\r
USDMTH: MOVEI TAC1,IBLK(DEVDAT)\r
;EOF BEFORE ALL DATA IS IN - DUMP MODE\r
DMPEOF: TRO IOS,IODEND ;LIGHT EOF BIT\r
JRST DMPTH2 ;GIVE UP TAPE\r
-\fSVADER: PUSHJ PDP,DMPTH2 ;GIVE UP CONTROL\r
+\f\r
+\r
+SVADER: PUSHJ PDP,DMPTH2 ;GIVE UP CONTROL\r
JRST ADRERR ;TYPE ERROR MESSAGE\r
;COME HERE ON ERROR\r
ERRS: AOS TAC,ERRCNT ;BUMP COUNT\r
IFN CPBIT, <\r
BLKCNT: 0\r
SVPNTR: 0\r
-\r
USPNTR: 0\r
DIRCTN: 0\r
>\r