;CALLED EVERY 60TH OF A SECOND WHEN CURRENT JOB IS USER MODE\r
;CALLED WHEN CURRENT JOB IS IN EXEC MODE AND:\r
; 1. JUST STARTED TO WAIT FOR IO\r
-\r
; 2. JUST STARTED TO WAIT FOR A BUSY SHARABLE DEVICE\r
; 3. RETURNING TO USER AFTER TYPING CONTROL C\r
; 4. RETURNING TO USER AFTER CLOCK TRIED TO INTERRUPT\r
CONO PI,REQCLK ;REQUEST INTERRUPT ON CLK CHANNEL\r
CONSZ APR,@APRIN1 ;IS USER ENABLE FOR ANY FLAGS(INCLUDING CLOCK)\r
; RH ALSO MODIFIED EACH TIME A USER RUNS\r
- JRST APRER ;YES, GO PROCESS TRAP\r
+ JRST APRER1 ;YES, GO PROCESS TRAP\r
CONO APR,1000+APRCHN ;NO, CLEAR ONLY THE CLOCK FLAG\r
JEN @APRCHL ;DISMISS INTERRUPT\r
\r
EXCH JDAT,JOBDAT ;RESTORE JDAT,JOBDAT\r
CONO APR,440+APRCHN ;DISBALE FOV, AROVF IN CASE ON\r
;SO USER MUST REENABLE WITH SETAPR UUO\r
-\r
APRER3: TLZ TAC,440000 ;CLEAR FOV (PC CHANGE ON PDP-6) AND AR OVF FLAGS\r
; SO INTERRUPT MAY BE DISMISSED\r
EXCH TAC,APRCHL ;RESTORE TAC & APRCHL\r
;THEN CALLS SCHEDULER\r
;IF THE CURRENT JOB IS IN EXEC MODE THE ABOVE 4 TASKS ARE\r
;DELAYED UNTIL THE CURRENT JOB ENTERS A STOPPABLE STATE: I.E., UNTIL\r
-\r
; 1. JOB STARTS TO WAIT FOR A BUSY SHARABLE DEVICE\r
; 2. JOB STARTS TO WAIT FOR A IO TO COMPLETE\r
; 3. CONTROL ABOUT TO RETURN TO USER MODE\r
MOVEI AC3,JOBDAC(JDAT) ;SAVE ACS 0-16 IN DUMP ACS\r
BLT AC3,JOBD16(JDAT) ;IN CURRENT JOB DATA AREA\r
MOVEI PDP,NULPDL ;NULL JOB PD LIST\r
- HRLI PDP,MJOBP1 ; OTHERWISE GET PD OUF\r
-\r
+ HRLI PDP,MJOBP1 ;USED TO CALL SCHEDULER AND COMMAND DECODE\r
+ ; OTHERWISE GET PD OUF\r
JRST RSCHED ;GO RESCHEDULE\r
\r
;HERE AT UUO LEVEL WHEN CURRENT JOB RETURNS TO USER MODE\r
JEN @CLKCHL\r
\r
SAVPC: MOVEM 17,USRPC ;SAVE PC IN PROTECTED PART OF SYSTEM DATA\r
-\r
; STORAGE FOR CURRENT JOB\r
CLKERR: SKIPN 17,JOBDAT ;CURRENT JOB DATA AREA, IS THERE ONE?\r
MOVEI 17,NULDAT ;NO, MUST BE NULL JOB OR CORE 0\r
; SINCE IT DOES IO INTO AND OUT OF\r
; CHANNEL LOCATIONS (JOBJDA+1..,JOBJDA+17),\r
ADD JA,T1 ;RELOCATE TO USER AREA\r
- BLT T,JOBJDA(JA) ; STOP WITH USER CHANNEL 0-1+C(USRHCU)\r
+ BLT T,JOBJDA(JA) ;MOVE TO USER JOB DATA AREA\r
+ ; STOP WITH USER CHANNEL 0-1+C(USRHCU)\r
\f;RESTORE SOFTWARE STATE OF NEW JOB,THEN HARDWARE STATE\r
\r
INTERNAL NULJOB,NULADR\r
MOVEI T,USRPRT ;NO, DEST,#PROTECTED AREA IN MONITOR\r
HRLI T,JOBPRT(JA) ;SOURCE#FIRST PROTECT LOC. IN JB DATA AREA\r
SKIPL T1,JOBHCU(JA) ;MOVE NO. OF USER IO CHAN. IN USE\r
- \r
CAILE T1,17 ;MUST BE 17 OR LESS(IO MIGHT CLOBBER\r
; IF ADRRESS CHECKING MISSES\r
MOVEI T1,0 ;MOVEJUST CHAN 0 IF NEG. OR GREATER THAN 17\r
ANDCAM TAC,JBTSTS(ITEM)\r
IFN FTLOGIN,<\r
EXTERN PRJPRG\r
+\r
SETZM PRJPRG(ITEM) ;CLEAR PROJECT-PROGRAMMER NUMBER WHEN JOB LOGS OUT\r
>\r
; IF THIS IS THE LARGEST JOB IN USE,FIND NEXT\r
IFN FTSWAP,<\r
JRST REQUE ;SET REQUE JOB FLAG\r
>\r
+\r
SKIPL TAC,JBTSTS(ITEM) ;RUN FLAG OFF?\r
TLNN TAC,JERR ;YES, ERROR FLAG ON?\r
JRST STOP2 ;NO\r
;OR IS IN CORE AND HAS ACTIVE DEVICES.\r
;CALLED FROM COMMAND DECODER\r
;CALL: MOVE ITEM,JOB NO.\r
- PUSHJ PDP,DLYCOM\r
+; PUSHJ PDP,DLYCOM\r
\r
INTERNAL DLYCOM\r
\r
USTART: MOVE TAC,JOBPC(JDAT) ;GET OLD PC\r
TLNE TAC,USRMOD ;IS IT IN USER MODE TOO?\r
JRST USTRT1 ;YES, DUMP ACS AND PC FLAGS ARE ALREADY HIS\r
-\r
MOVEI TAC,JOBDAC(JDAT) ;NO. MOVE USERS(UUO) ACS TO DUMP ACS\r
HRL TAC,JDAT ;SOURCE=REL, 0,DEST,=JOBDAC IN JOB DATA AREA\r
BLT TAC,JOBD17(JDAT) ;MOVE ALL ACS\r
MSTART: MOVEM TAC1,JOBPC(JDAT) ;STORE NEW PC\r
MOVSI TAC,JERR+WTMASK\r
ANDCAM TAC,JBTSTS(ITEM) ;CLEAR ERROR AND WAIT STATUS BITS\r
- ;SET TTY STATE TO INITAL COND.\r
+ JRST TTYSET ;SET TTY STATE TO INITAL COND.\r
; TTYUSR OR TTYURC SHOULD BE CALLED\r
; TO INDICATE WHETHER TTY TO USER OR EXEC MODE\r
; AND THAT JOB IS TO RUN(RUN BIT =1) WHEN\r
; MONITOR COMMAND RESPONSE FINISHES.\r
; SEE SETRUN BELOW\r
\f\r
+\r
;ROUTINE TO SET JOB STATUS RUN BIT(RUN)\r
;CALLED BY SCANNER SERVICE WHEN TTY MONITOR COMMAND\r
;RESPONSE FINISHES, THIS ACTION IS ENABLED BY CALLING\r
EXTERNAL JOB,REQTAB\r
\r
MTWAIT:DTWAIT:DCWAIT:STWAIT:DAWAIT:MQWAIT:AUWAIT:\r
-\r
DVWAIT: MOVE AC1,(PDP) ;GET ADR. OF CALLER\r
MOVE AC1,-2(AC1) ;GEET AOSLE XXREQ INSTRUCTION\r
JRST .+2\r
\r
PJBS2: POINT JWSIZ,JBTSTS(TAC),JWPOS ;BYTE POINTER TO JOB STATUS\r
; WORD QUEUE CODE\r
+\r
STTIOD: MOVEI TAC1,TSQ ;SET TTY IO WAIT SATISFIED QUEUE CODE\r
AOS TSAVAL\r
JRST SETIO1\r
AOS WSAVAL ;INCR, NO, OF JOBS WITH IO WAIT\r
; SATISFIED, NON-ZERO WSAVAL WILL\r
; CAUSE SCHED, TO SCAN FOR IO\r
+ ; SATISFIED JOB.\r
SETIO1: LDB TAC,PJOBN\r
DPB TAC1,PJBS2 ;IN JOB STATUS WORD\r
\r
POPJ PDP, ;RETURN\r
PUSHJ PDP,WSYNC ;WAIT\r
JRST WAIT1\r
-\f;WSYNC IS CALLED TO WAIT UNTIL SETIOD IS CALLED BY INTERRUPT SERVICE ROUTINE\r
+\f\r
+;WSYNC IS CALLED TO WAIT UNTIL SETIOD IS CALLED BY INTERRUPT SERVICE ROUTINE\r
;IE UNTIL CURRENT BUFFER ACTIVITY IS COMPLETE\r
;CALLED ONLY FROM UUO LEVEL\r
;CALL: MOVE DEVDAT,ADR. OF DEVICE DATA BLOCK\r
TLNE AC3,DVTTY ;IS THIS DEVICE A TTY?\r
MOVEI AC1,TIOWQ ;YES, SET TTY WAIT STATE CODE\r
MOVE AC3,JOB ;CURRENT JOB NO.\r
-\r
MOVEI AC2,IOACT ;DEVICE ACTIVE BIT\r
CONO PI, PIOFF ;TURN PI OFF\r
TDNN AC2,DEVIOS(DEVDAT) ;IS THE DEVICE ACTIVE?\r
ANDCAB IOS, DEVIOS(DEVDAT) ;CLEAR DEVIVCE IO-WAIT BIT\r
POPJ PDP,\r
\r
+\r
CLKEND: END\r
-A.RLX_CDRSR6.REL,CDRSRX.REL,CLKCSS.REL,CLOCK1.REL,COMCON.REL,CORE1.REL
-B.RLX_DCSINT.REL,DIS340.REL,DIST30.REL,DLSINT.REL,DPDINT.REL,DSKINT.REL
-C.RLX_DSKSER.REL,DTASRN.REL,DTCSRN.REL,ERRCON.REL,JOBDAT.REL,LPTSER.REL
-D.RLX_MTASRX.REL,MTCSR6.REL,NULSEG.REL,SEGCON.REL,PLTSER.REL,PTPSER.REL
-E.RLX_PTRSER.REL,PTYSRF.REL,PTYSRH.REL,SCHEDB.REL,SCNSRF.REL,UUOCON.REL
-F.RLX_PATCH.REL,SYSINI.REL,SYSMAK.REL,EDDT.REL,ONCEB.REL
-SYS50.REL/B_A.RLX,B.RLX,C.RLX,D.RLX,E.RLX,F.RLX
-DSK:/D_*.RLX
+A.RLX_CDRSR6.REL,CDRSRX.REL,CLKCSS.REL,CLOCK1.REL,COMCON.REL,CORE1.REL\r
+B.RLX_DCSINT.REL,DIS340.REL,DIST30.REL,DLSINT.REL,DPDINT.REL,DSKINT.REL\r
+C.RLX_DSKSER.REL,DTASRN.REL,DTCSRN.REL,ERRCON.REL,JOBDAT.REL,LPTSER.REL\r
+D.RLX_MTASRX.REL,MTCSR6.REL,NULSEG.REL,SEGCON.REL,PLTSER.REL,PTPSER.REL\r
+E.RLX_PTRSER.REL,PTYSRF.REL,PTYSRH.REL,SCHEDB.REL,SCNSRF.REL,UUOCON.REL\r
+F.RLX_PATCH.REL,SYSINI.REL,SYSMAK.REL,EDDT.REL,ONCEB.REL\r
+SYS50.REL/B_A.RLX,B.RLX,C.RLX,D.RLX,E.RLX,F.RLX\r
+DSK:/D_*.RLX\r
-A.RLX_CDRSR6.REL,CDRSRX.REL,CLKCSS.REL,CLOCK1.REL,COMCON.REL,CORE1.REL
-B.RLX_DCSINT.REL,DIS340.REL,DIST30.REL,DLSINT.REL,DPDINT.REL,DSKINT.REL
-C.RLX_DSKSER.REL,DTASRN.REL,DTCSRN.REL,ERRCON.REL,JOBDAT.REL,LPTSER.REL
-D.RLX_MTASRX.REL,MTCSR6.REL,NULSEG.REL,PLTSER.REL,PTPSER.REL
-E.RLX_PTRSER.REL,PTYSRF.REL,PTYSRH.REL,SCHEDB.REL,SCNSRF.REL,UUOCON.REL
-F.RLX_PATCH.REL,SYSINI.REL,SYSMAK.REL,EDDT.REL,ONCEB.REL
-SYS50.REL/B_A.RLX,B.RLX,C.RLX,D.RLX,E.RLX,F.RLX
-DSK:/D_*.RLX
+A.RLX_CDRSR6.REL,CDRSRX.REL,CLKCSS.REL,CLOCK1.REL,COMCON.REL,CORE1.REL\r
+B.RLX_DCSINT.REL,DIS340.REL,DIST30.REL,DLSINT.REL,DPDINT.REL,DSKINT.REL\r
+C.RLX_DSKSER.REL,DTASRN.REL,DTCSRN.REL,ERRCON.REL,JOBDAT.REL,LPTSER.REL\r
+D.RLX_MTASRX.REL,MTCSR6.REL,NULSEG.REL,PLTSER.REL,PTPSER.REL\r
+E.RLX_PTRSER.REL,PTYSRF.REL,PTYSRH.REL,SCHEDB.REL,SCNSRF.REL,UUOCON.REL\r
+F.RLX_PATCH.REL,SYSINI.REL,SYSMAK.REL,EDDT.REL,ONCEB.REL\r
+SYS50.REL/B_A.RLX,B.RLX,C.RLX,D.RLX,E.RLX,F.RLX\r
+DSK:/D_*.RLX\r
TITLE COMCON - COMMAND DECODER AND SAVEGET ROUTINES - V433\r
SUBTTL /RCC 03 JUN 69\r
XP VCOMCN,433\r
+\r
;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB\r
\r
ENTRY COMCON ;ALWAYS LOAD COMCON IF LIBRARY SEARCH\r
COMCON:\r
\r
;CALLED FROM CLOCK ROUTINE WHEN 'COMCNT' IS GREATER THAN 0\r
-\r
;AS SET BY TTY SERVICE ROUTINE\r
;ALL AC'S HAVE BEEN SAVED BY CLOCK CHANNEL\r
;THE COMMAND DECODER CALLS TTYCOM WHICH SCANS FOR TTY WHICH TYPED\r
JRST CHKNO ;YES\r
JSP TAC,COMER ;NO, TYPE "LOGIN PLEASE"\r
ASCIZ /LOGIN PLEASE\r
-/>\r
+/\r
+>\r
CHKNO: JUMPN ITEM,CHKRUN ;JOB NUMBER ALREADY ASSIGNED?\r
TLNE TAC1,NOJOBN ;NO, DOES THIS COMMAND NEED A JOB NUMBER?\r
JRST COMGO ;NO\r
JSP TAC,COMER ;YES, NONE LEFT, PRINT "JOB CAPACITY EXCEEDED"\r
ASCIZ /JOB CAPACITY EXCEEDED\r
/\r
+\r
; EVEN THROUGH THIS IS A NEW JOB NUMBER\r
; IT MAY HAVE CORE ASSIGNED NOW BECAUSE IT WAS DELAYED\r
; UNTIL IT COULD BE SWAPPED IN(LOGIN WITH CORE FULL)\r
+\r
NEWJOB: MOVEI T1,ASSCON ;SET ASSIGNED BY CONSOLE BIT FOR TTY\r
IORM T1,DEVMOD(DEVDAT) ;SO OTHER JOBS CAN NOT USE\r
SETZM DEVLOG(DEVDAT) ;SET LOGICAL NAME TO ZERO\r
ANDCAM IOS,(PDP) ;NO, CLEAR REQUEU BIT IN DISP. FLAGS\r
MOVEM T,JBTSTS(ITEM)\r
\r
+\r
COMDIS: MOVEI IOS,0 ;CLEAR IOS FOR SETTING DISPATCH ADDRESSES\r
PUSHJ PDP,(TAC1) ;DISPATCH TO COMMAND SETUP ROUTINE.\r
\f;RETURN FROM COMMAND SETUP ROUTINE\r
LDB ITEM,PJOBN ;GET JOB NUMBER FROM TTY DEVICE DATA BLOCK\r
JUMPE ITEM,CPOPJ \r
TLNE T1,CMWRQ ;REQUEUE JOB AFTER COMMAND WAIT OR ERROR?\r
-\r
JRST REQUE ;YES\r
>\r
POPJ PDP,\r
; WHEN COMMAND RESPONSE STOPS TYPING\r
NOMESS=10 ;NO COMMAND RESPONSE EVER, DO NOT CALL TTYSTR\r
\r
- ;T TAKEN ABOVE BY 'PLSXPN' BIT\r
+ ;4 TAKEN ABOVE BY 'PLSXPN' BIT\r
+\r
\r
ERRFLG=1 ;COMMAND ERROR\r
\fDEFINE NAMES<\r
DEFINE C(A,B,D) <\r
<SIXBIT /A/>\r
>\r
+\r
COMTAB: NAMES\r
+ XWD NOCORE+NOJOBN+NOLOGIN+NOINCK,NOCOM\r
DISPL=.-COMTAB ;LENGTH OF TABLE\r
\f;GENERATE THE DISPATCH TABLE PLUS SPECIAL BITS\r
\r
Z B (D)\r
>\r
DISP: NAMES\r
-\f;CALLED FROM COMMAND DECODER WHICH IS CALLED FROM CLOCK ROUTINE\r
+\f\r
+;CALLED FROM COMMAND DECODER WHICH IS CALLED FROM CLOCK ROUTINE\r
;WITH FOLLOWING AC'S SET:\r
;TAC= BYTE POINTER TO COMMAND STRING(SPACE OR CR AFTER COMMAND NAME)\r
;ITEM = JOB NUMBER\r
PUSHJ PDP,TTYKIL ;RETURN TTY TO VIRGIN STATE\r
JRST KSTOP ;CLEAR JOB STATUS WORD AND STOP JOB\r
\r
+\r
;ERROR IN COMMAND\r
\r
+\r
CERR: JRST ERRMES\r
\r
JOBKB: SETZM -1(PDP) ;CLEAR NOJOBN SO COMRET WILL PRINT ERROR MSG.\r
; IF ASKING FOR 0 CORE\r
>\r
LSH TAC1,12 ;CONVERT 1K BLOCKS TO WORDS\r
- \r
MOVEI TAC,-1(TAC1) ;HIGHEST RELATIVE ADDRESS=LENGTH-1 OF LOW SEG\r
PUSHJ PDP,CORE0 ;TRY TO ASSIGN CORE\r
JRST COR2 ;CORE NOT AVAILABLE. GO PRINT MESSAGE\r
\r
CCLRUN: MOVE TAC,[SIXBIT /COMPIL/] ;CUSP NAME\r
JRST ARCOM ;RUN IT\r
+\r
>\r
;"LOGIN" - LOGIN COMMAND\r
\r
; BEFORE [P,P] IN ATT AND GET COMMANDS.\r
JRST CPOPJ2 ;YES. SKIP RETURN\r
CAIE TEM,"-" ;DASH?\r
- CAIG TEM,400 ;SPACE OR CONTROL CHAR?\r
+ CAIG TEM,40 ;SPACE OR CONTROL CHAR?\r
JRST CPOPJ2 ;YES, ONLY LEGAL TERMINATORS\r
CAIE TEM,"," ;COMMA?\r
CAIN TEM,"]" ;RIGHT BRACKET?\r
--- /dev/null
+TITLE COPY V006 31MAR\r
+;COPYRIGHT 1968, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.\r
+REPEAT 0,<\r
+\r
+\r
+ COPY WILL RUN IN ANY AMOUNT OF CORE, HOWEVER, EFFICIENCY \r
+INCREASES WITH CORE SIZE. SWITCHES ARE PRECEDED BY A SLASH OR\r
+ENCLOSED IN PARENTHESES AND MAY APPEAR ANYWHERE IN THE COMMAND\r
+STRING. THE GENERAL COMMAND STRING FORMAT IS:\r
+ (OUTPUT DECTAPE):_(INPUT DECTAPE):/C\r
+\r
+ /C COPY ALL BLOCKS FROM THE INPUT DECTAPE ONTO\r
+ THE OUTPUT DECTAPE.\r
+ /Z ZERO ALL BLOCKS OF THE OUTPUT DECTAPE, CLEAR\r
+ THE DIRECTORY.\r
+ /V PERFORM A WORD BY WORD COMPARISION BETWEEN\r
+ EVERY WORD OF THE INPUT AND OUTPUT DECTAPES.\r
+ /L LOAD A BOOTSTRAP LOADER INTO A CORE BUFFER.\r
+ COPY LOOKS FOR "BSLDR.REL" ON LOGICAL DEVICE\r
+ "PTR". NOTE COPY MUST BE "SAVED" IF THE LOADER\r
+ IS TO BE PRESERVED WITH THE COPY CORE IMAGE.\r
+ /T CAUSES A BOOTSTRAP LOADER TO BE WRITTEN ONTO\r
+ BLOCKS 0,1 AND 2 OF THE OUTPUT TAPE. COPY TYPES\r
+ "TYPE CORE BANK OR OFFSET FOR BSLDR."\r
+ OFFSET = OCTAL NUMBER 1000 TO 777600.\r
+ CORE-BANK = NNNK = 16K TO 256K,\r
+ EX: NNNK=64K\r
+ THEN OFFSET=177000 (TOP OF COPE - 1000)\r
+ /N DON'T OUTPUT A DIRECTORY.\r
+ /6 LOOK FOR A DIRECTORY IN BLOCK ONE, NOT BLOCK 144.\r
+ /G DON'T RESTART THE PROGRAM AFTER A PARITY ERROR\r
+ (BIT20), OUTPUT AN ERROR MESSAGE AND CONTINUE.\r
+ NO SW'S SET C AND V SWITCHES (DEFAULT CONDITION).\r
+\r
+ NOTE........AT COMPLETION THE OUTPUT DECTAPE SHOULD BE REASSIGNED\r
+ TO ENSURE THAT THE DIRECTORY IN CORE IS UP TO DATE.\r
+\r
+\fTHE FOLLOWING MESSAGES MAY BE OUTPUT TO THE USER'S TELETYPE.\r
+\r
+ ?WRITE LOCK ERROR\r
+ ?INPUT (OR OUTPUT) DEVICE ERROR\r
+ ?INPUT (OR OUTPUT) CHECKSUM OR PARITY ERROR\r
+ ?INPUT (OR OUTPUT) BLOCK TOO LARGE\r
+ ?INPUT (OR OUTPUT) PREMATURE END OF FILE\r
+ 000000 VERIFICATION ERRORS\r
+ ?COMMAND ERROR\r
+ ?SWITCH ERROR\r
+ ?DEVICE INIT FAILURE\r
+ ?DEVICE MUST BE A DECTAPE\r
+ ?INPUT AND OUTPUT DECTAPES MAY NOT BE THE SAME DEVICE.\r
+\r
+THE FOLLOWING MAY BE OUTPUT WHILE PROESSING "/L".\r
+ ?PTR INIT FAILURE\r
+ ?LOOKUP FAILED, "BSLDR.REL"\r
+ ?DATA ERROR ON DEVICE PTR\r
+ ?ILLEGAL BLOCKTYPE\r
+ ?CANNOT PROCESS EXTERNAL SYMBOLS\r
+ ?CANNOT PROCESS HIGH SEG'S\r
+ ?NO END BLOCK ENCOUNTERED\r
+ ?BOOTSTRAP LOADER WILL NOT FIT IN 3 BLOCKS\r
+\r
+THE FOLLOWING MAY BE OUTPUT WHILE PROCESSING "/T".\r
+ TYPE CORE BANK OR OFFSET FOR DTBOOT\r
+ ?OFFSET = 1000 TO 777600 (OCTAL)\r
+ ?EXPECTED FORMAT IS "NNNK" = 16K T0 256K\r
+ ?BOOTSTRAP LOADER IS NOT IN COPY; TRY "/L".\r
+>\r
+\f\r
+FLP=400000 ;NOT SW MODE **FLAGS ARE IN LH OF F**\r
+FLC=200000 ;COPY\r
+FLZ=100000 ;ZERO\r
+FLV= 40000 ;VERIFY\r
+FLT= 20000 ;TENDMP\r
+FLG= 10000 ;IGNORE PARITY ERRORS\r
+FLL= 4000 ;LIST DIR\r
+FLK= 2000 ;COLON\r
+FLA= 1000 ;LEFT ARROW\r
+FLI= 400 ;INPUT DEVICE\r
+FL2= 200 ;CHANEL TWO\r
+HSW= 100 ;HELP\r
+LSW= 20 ;REQ TO LOAD A BSLDR\r
+LFL= 10 ;A BOOTSTRAP LOADER IS IN "COPY"\r
+NSW= 4 ;NO DIRECTORY\r
+FL6= 2 ;6 FORMATTED\r
+FPT= 1 ;A PDP-10\r
+ANYSW=FLC+FLZ+FLV+FLT ;ANYSW=0 IMPLIES FLC+FLV\r
+JOBVER=137\r
+\r
+AC0=0\r
+AC1=1\r
+AC2=2\r
+AC3=3\r
+AC4=4\r
+AC5=5\r
+AC6=6\r
+V1=1 ;VERIFY CMDLST\r
+VZ1=2 ;CMDLST TERMINATOR\r
+V2=3 ;VERIFY CMDLST\r
+VZ2=4 ;CMDLST TERM\r
+BP=5 ;BYTE POINTER\r
+C=6 ;CURRENT CHARACTER\r
+LOC=7 ;BLOCK NUMBER\r
+T=10 ;TEMP\r
+U=T+1 ;TEMP\r
+F=12 ;FLAGS\r
+UNSD2=14 ;UNUSED\r
+UNSD3=15 ;UNUSED\r
+IOS=16 ;IO STATUS\r
+P=17 ;PUSH DOWN LIST\r
+ EXTERN JOBFF,JOBREL,JOBSA,JOBREN\r
+ LOC JOBVER\r
+ XWD 0,6 ;;VERSION #\r
+ RELOC\r
+\f\r
+ST: CALLI 0\r
+ MOVE P,[IOWD 20,TTYIN+23] ;PUSH DOWN LIST\r
+ INIT 17,1 ;ASCII LINE\r
+ SIXBIT /TTY/\r
+ XWD TOUT,TIN\r
+ HALT . ;INIT ERROR\r
+ PUSH P,JOBFF\r
+ MOVEI T,TTYIN\r
+ MOVEM T,JOBFF\r
+ INBUF 17,1 ;SET THE BUFFER ADR TO TTYIN\r
+ MOVEI T,TTYOUT\r
+ MOVEM T,JOBFF\r
+ OUTBUF 17,1 ;SET THE BUFFER ADR TO TTYOUT\r
+ OUTPUT 17, ;DUMMY\r
+ SETZB F,IDEV\r
+ SETZB T,ODEV\r
+ POP P,JOBFF\r
+\r
+ MOVE T,JOBREL\r
+ SUB T,JOBFF ;T=NO. OF FREE LOC\r
+ MOVE C,JOBFF ;\r
+ MOVEI AC0,3777(C) ;\r
+ CAIGE T,3777 ;TRY FOR AT LEAST 2K OF BUFFER AREA\r
+ CALLI AC0,11 ;CORE UUO\r
+ JFCL ;O WELL\r
+ SUBI C,1 ;IOWD FORMAT "ADR-1"\r
+ ANDI T,-200 ;T=NO. OF FREE WORDS\r
+ MOVNM T,U ;IOWD FORMAT "-N"\r
+ LSH T,-7 ;T=NO. OF BLOCKS PER COPY INPUT\r
+ MOVEM T,INC ;COPY INCREMENT\r
+ LSH T,-1 ;T=NO. OF BLOCKS PER VERIFY INPUT\r
+ MOVEM T,INCV ;VERIFY INCREMENT\r
+ HRLM U,C ;ASSEMBLE\r
+ MOVEM C,LISTC ;COPY IOWD\r
+ ASH U,-1 ;HALVE THE "-N" FOR VERIFY\r
+ TRNE U,100 ;"-N" MUST AGREE WITH THE INCREMENT\r
+ ADDI U,100 ;ADJUST\r
+ HRL C,U ;ASSEMBLE\r
+ MOVEM C,LISTV1 ;VERIFY IOWD #1\r
+ MOVMM U,U ;\r
+ ADD C,U ;ASSEMBLE\r
+ MOVEM C,LISTV2 ;VERIFY IOWD #2\r
+\r
+\f MOVEI C,"*"\r
+ PUSHJ P,TYPC ;OUTPUT CHAR\r
+ INPUT 17,\r
+ MOVE F,FSAVE ;INITIAL FLAGS\r
+ SKIPA BP,[POINT 6,ODEV] ;ASSUME AN OUTPUT DEV\r
+COIDEV: MOVE BP,[POINT 6,IDEV] ;INPUT IF LEFT-ARROW + COLON WERE SEEN \r
+COTGET: PUSHJ P,TYPGET ;RETURN A CHAR TO C\r
+ CAIN C,"/"\r
+ JRST COSLSH ;SLASH\r
+ CAIN C,"("\r
+ JRST COLPRN ;LEFT PAREN\r
+ CAIN C,":"\r
+ JRST COCOLN ;COLON\r
+ CAIE C,12\r
+ CAIN C,15\r
+ JRST COCRET ;CR OR LF\r
+ CAIE C,175 ;ALTMODE?\r
+ CAIN C,33 ;ALTMODE?\r
+ JRST COCRET ;YES\r
+ CAIN C,176 ;ALTMODE?\r
+ JRST COCRET ;YES\r
+ CAIE C,"=" ;==_\r
+ CAIN C,"_"\r
+ JRST COLARO ;LEFT ARROW\r
+ CAIGE C,"0" ;\r
+ JRST ERRCMD ;\r
+ CAILE C,"9" ;ILLEGAL CHAR?\r
+ CAIL C,"A" ;\r
+ CAILE C,"Z" ;\r
+ JRST ERRCMD ;\r
+ SUBI C,40 ;6 BITIZE IT\r
+ TLNE BP,770000 ;ACCEPY 6 CHARS ONLY\r
+ IDPB C,BP ;ASSEMBLE AN I/O DEV NAME\r
+ JRST COTGET ;\r
+\fCOLPRN: TLZA F,FLP ;ENTER PAREN MODE\r
+COEXIT: JUMPL F,COTGET ;NORMAL EXIT\r
+COSLSH: PUSHJ P,TYPGET ;SLASH - RETURN SW IN C\r
+ MOVSI U,-LEN ;U=-SWTAB LEN,0\r
+COSWLP: MOVE T,SWTAB(U) ;T=FLAG,CHAR\r
+ CAIN C,(T) ;C=0,CHAR\r
+ TDOA F,T ;F=FLAGS,CHARS ANDED\r
+ AOBJN U,COSWLP ;MORE SW'S? LOOP\r
+ JUMPL U,COEXIT ;MATCH OR MORE SW? LOOP\r
+ JRST ERRSW ;NOT A SWITCH\r
+\r
+COLARO: TLZE F,FLK ;CLEAR COLON FLAG\r
+ TLOE F,FLA ;SET LEFT ARROW FLAG\r
+ JRST ERRCMD ;TOO MANY ARROWS,NOT ENOUGH KOLONS\r
+ JRST COIDEV ;NEXT DEVICE MUST BE INPUT\r
+\r
+COCOLN: TLZ BP,770000 ;ACCEPT NO MORE CHARS.\r
+ TLON F,FLK ;SET KOLON FLAG\r
+ JUMPGE BP,COTGET ;NORMAL EXIT\r
+ JRST ERRCMD ;NULL NAME, TOO MANY COLONS\r
+\r
+COCRET: TLZE F,HSW ;HELP?\r
+ JRST HELP ;\r
+ TLZE F,LSW ;LOADING A LOADER?\r
+ JRST BSLDR ;YES\r
+ TLNE F,FLA ;LEFT ARO ?\r
+ JRST COSTRT ;_,SO OK\r
+ SKIPE ODEV ;\r
+ JRST ERRCMD ;NO_,SOME ODEV\r
+ TLNN F,ANYSW ;\r
+ JRST ST ;NO_,NO ODEV,NO SW =*\r
+ JRST ERRCMD ;NO_,NO ODEV, NO SW\r
+\r
+COSTRT: TLNN F,ANYSW ;ANY SW=SKIP\r
+ TLO F,FLC+FLV ;DEFAULT=COPY+VERIFY\r
+ TLNE F,FLC ;IF COPY\r
+ TLZ F,FLZ ;DONT ZERO\r
+ TLNE F,FLZ ;IF ZERO\r
+ TLZ F,FLV ;DONT VERIFY\r
+ SKIPN T,IDEV\r
+ TLNE F,FLC+FLV\r
+ JUMPE T,ERRCMD ;AN INDEVICE IS REQUIRED\r
+ TLNN F,FLT ;IS 10DMP WANTED?\r
+ JRST CINIT ;NO, PROCEED\r
+\r
+\f ;HERE TO ACCEPT THE BOOTSTRAP LOADER OFFSET (/T)\r
+\r
+CTENDM: TLNN F,LFL ;IS A BOOTSTRAP LOADER LOADED?\r
+ JRST ERRTNH ;NO, COMPLAIN\r
+CTEN1: SETZB AC1,OFFSET ;\r
+ TTCALL 3,[ASCIZ /\r
+TYPE CORE BANK OR OFFSET FOR /]\r
+ MOVEI BP,PNAME\r
+ PUSHJ P,TYPEIT ;BSLDR'S NAME\r
+ INPUT 17,\r
+CTEN0: PUSH P,TIN+1 ;SAVE PTR FOR RESCAN\r
+ MOVEI AC0,6 ;MAX CHARS TO ACCEPT\r
+ PUSHJ P,TYPGET ;\r
+ CAIN C,"K" ;\r
+ JRST CTEN10 ;K, MUST BE A CORE-BANK\r
+ SOJG AC0,.-3\r
+ POP P,TIN+1 ;\r
+ MOVEI AC0,6 ;ACCEPT 6 NUMBERS\r
+CTEN2: PUSHJ P,TYPGET ;GET A CHAR\r
+ CAIL C,"0" ;\r
+ CAILE C,"7" ;\r
+ JRST CTEN7 ;NOT A OCTAL NUMBER, TERM?\r
+ LSH AC1,3 ;MAKE ROOM\r
+ TRZ C,777770 ;CLEAR HI-ORDER BITS\r
+ ADD AC1,C ; FOR THIS CHAR\r
+ SOJG AC0,CTEN2 ;LOOK FOR 6 CHARS\r
+CTEN3: CAIL AC1,1000 ;LOWER LIMIT\r
+ CAILE AC1,777600 ;UPPER LIMIT\r
+ JRST CTEN8 ;COMPLAIN\r
+CTEN4: HRLI AC1,W ;SO [HRRI W,@OFFSET] WILL WORK\r
+ MOVEM AC1,OFFSET ;SAVIT\r
+ JRST CINIT ;\r
+\r
+CTEN7: CAIL C,12 ;"LF"\r
+ CAILE C,15 ;"CR"\r
+ CAIN C,33 ;ALTMODE\r
+ JRST CTEN3 ;A TERMINATOR\r
+CTEN8: TTCALL 3,[ASCIZ /\r
+?OFFSET = 1000 TO 777600 (OCTAL)/]\r
+ JRST CTEN1 ;\r
+\r
+\f ;LOOK FOR A CORE BANK, 16K-256K\r
+CTEN10: POP P,TIN+1 ;RESCAN TTYBUF\r
+ MOVEI AC0,3 ;ONLY 3 CHARS MAX IS "256"\r
+CTEN11: PUSHJ P,TYPGET ;\r
+ CAIL C,"0" ;\r
+ CAILE C,"9" ;\r
+ JRST CTEN17 ;\r
+ IMULI AC1,^D10 ;MAKE ROOM FOR NEXT CHAR... DEC TO OCT\r
+ ANDI C,17 ;EXTRACT DECIMAL NUMBER\r
+ ADD AC1,C ;\r
+ SOJG AC0,CTEN11 ;\r
+\r
+CTEN12: TRNE AC1,17 ;CHECK FOR MODULO 16\r
+ JRST CTEN18 ;ILL\r
+ JUMPE AC1,CTEN18 ;ILL\r
+ LSH AC1,-4 ;PUSH OFF ZEROES\r
+ CAILE AC1,20 ;MAX IS 256\r
+ JRST CTEN18 ;ILL\r
+ IMULI AC1,40000 ;TURN IT INTO AN OFFSET\r
+ SUBI AC1,1 ;\r
+ TRZ AC1,777 ;1K BELOW TOP OF THIS BANK\r
+ JRST CTEN4 ;\r
+CTEN17: CAIN C,"K" ;SKIP IF TERM\r
+ JRST CTEN12 ;\r
+\r
+CTEN18: TTCALL 3,[ASCIZ /\r
+?EXPECTED FORMAT IS "NNNK" = 16K TO 256K.\r
+/]\r
+ JRST CTEN1\r
+\fCINIT: MOVEI T,134 ;BUFRD MODE\r
+ PUSHJ P,INIT ;FIRST INIT\r
+ TLNE F,FLC!FLZ ;BEGIN HERE ___******\r
+ PUSHJ P,COPZRO ;ZERO OR COPY\r
+ TLNE F,FLC!FLZ ;IF C OR Z-\r
+ PUSHJ P,LALA ;THEN REWIND\r
+ TLNN F,FLZ ;WASIT /Z ?\r
+ JRST CNOZRO ;NO\r
+ SETSTS 2,16 ;YES\r
+ CALLI 2,13 ;CLEAR DIR IN CORE\r
+ RELEAS 2, ;AND ON TAPE\r
+ MOVEI T,14 ;AND\r
+ PUSHJ P,INIT ;REINIT\r
+CNOZRO: TLNE F,FLV ;VERIFY ?\r
+ PUSHJ P,VERZRO ;YES\r
+ TLNE F,FLV ;IF VERIFY-\r
+ PUSHJ P,LALA ;THEN REWIND\r
+ TLNE F,FLT ;TEN DUMP ?\r
+ PUSHJ P,TENINT ;YES\r
+ JRST ST ;GO AGAIN ******\r
+\r
+LALA: MTAPE 2,1 ;\r
+ SKIPE C,IDEV ;\r
+ MTAPE 1,1 ;\r
+ JFCL 1,.+1 ;PROCESSOR TEST\r
+ JRST .+1 ;\r
+ JFCL 1,.+3 ;6-JUMP\r
+ TLO F,FPT ;PDP-10 FLAG\r
+ JRST LSTEST ;10-JUMP\r
+ JUMPE C,LSTES0 ;JUMP IF NO INPUT DEV\r
+ USETI 1,1\r
+ INPUT 1,REWIND ;IOWD 1,DATA\r
+LSTES0: USETI 2,1\r
+ INPUT 2,REWIND\r
+LSTEST: TLZE F,FLL ;LIST A DIR?\r
+ JRST DLST ;YES\r
+ MOVEI C,^D15 ;SECONDS\r
+GDNITE: TLNE F,FPT ;6-SKIP\r
+ CALLI C,31 ;TO SLEEP\r
+ POPJ P, ;\r
+\r
+SWTAB: XWD FLP,")" ;XIT\r
+ XWD FLC,"C" ;COPY\r
+ XWD FLZ,"Z" ;ZERO\r
+ XWD FLV,"V" ;VERIFY\r
+ XWD FLT,"T" ;TENDMP\r
+ XWD FLG,"G" ;IGNORE\r
+ XWD HSW,"H" ;HELP\r
+ XWD LSW,"L" ;LOAD BSLDR\r
+ XWD NSW,"N" ;NO DIR\r
+ XWD FL6,"6" ;PDP6 DIR\r
+ LEN=.-SWTAB\r
+\fDSAV: TLON F,FLL ;ENTER THIS CODE ONCE ONLY\r
+ TLNE F,FL6 ;SKIP IF ITS NOT 6FMT\r
+ POPJ P, ;2ND PASS OR 6FMT-EXIT.\r
+ MOVEI 1,-144(LOC) ;FIRST BLK OF NEXT OUTPUT\r
+ SUB 1,INC ;FIND A\r
+ IMULI 1,-200 ; DIRECTORY,\r
+ ADD 1,LISTC ;GRAB\r
+ HRLI 1,1(1) ; A\r
+ HRRI 1,DIRECT ; DIRECTORY.\r
+ BLT 1,DIRECT+177 ;SAVE IT.\r
+ POPJ P, ;RETURN\r
+\r
+DATE: SETZ AC2,\r
+ LDB AC5,DATEP\r
+ IDIVI AC5,^D31 ;PICK OFF THE DAY\r
+ ADDI AC6,1 ;MAKE IT RIGHT\r
+ PUSHJ P,DATE1 ;RETURNS TWO SIXBIT NUMBERS\r
+ DPB AC6,DAY ;XXDDXX\r
+ IDIVI AC5,^D12 ;PICK OFF THE MONTH\r
+ MOVE AC6,MONPH(AC6) ;CONVERT TO ALPHA\r
+ DPB AC6,MONTH ;MMDDXX\r
+ MOVEI AC6,^D64 ;GET THE BASE YEAR\r
+ ADD AC6,AC5 ;PLUS YEARS SINCE THEN\r
+ PUSHJ P,DATE1 ;SIXBIT\r
+ DPB AC6,YEAR ;YYMMDD-DATE FINISHED\r
+ POPJ P, ;\r
+\r
+DATE1: IDIVI AC6,^D10 ;DIVIDE OUT A DECIMAL NUMBER\r
+ LSH AC6,6 ;MAKE ROOM FOR THE REMIANDER\r
+ ADDI AC6,152020(LOC) ;CONVERT TO SIXBIT\r
+ POPJ P, ;RETURN\r
+\r
+DAY: POINT 12,AC2,11\r
+MONTH: POINT 24,AC2,35\r
+YEAR: POINT 18,AC3,17\r
+DATEP: POINT 12,DNAM+^D22(AC1),35\r
+FREE: SIXBIT /FREE: +/\r
+BLKS: SIXBIT /-BLKS +/\r
+FILES: SIXBIT /-FILES#/\r
+\fMONPH: SIXBIT / -JAN/\r
+ SIXBIT / -FEB/\r
+ SIXBIT / -MAR/\r
+ SIXBIT / -APR/\r
+ SIXBIT / -MAY/\r
+ SIXBIT / -JUN/\r
+ SIXBIT / -JUL/\r
+ SIXBIT / -AUG/\r
+ SIXBIT / -SEP/\r
+ SIXBIT / -OCT/\r
+ SIXBIT / -NOV/\r
+ SIXBIT / -DEC/\r
+\r
+ ;STANDARD OCTAL TO ASCII ROUTINE\r
+DECMAL: IDIVI C,^D10 ;\r
+ HRLM C+1,(P) ;\r
+ SKIPE C ;\r
+ PUSHJ P,DECMAL ;\r
+ HLRZ C,(P) ;\r
+ ADDI C,60 ;\r
+ JRST TYPC ;\r
+\r
+DLST: TLNE F,NSW ;DIRECTORY WANTED?\r
+ JRST DXIT ;NO\r
+ TLNE F,FL6 ;6FMT?\r
+ JRST D6LST ;YES.\r
+DLST1: SETZM TOTAL ;TOTAL FREE BLOCKS\r
+ MOVE 3,[XWD TOTAL,TOTAL+1] ;CLEAR THE ^D23\r
+ BLT 3,TOTAL+^D22 ; WORD TABLE\r
+ MOVE 2,[POINT 5,DIRECT,4] ;POINT TO FIRST BLK SLOT\r
+ MOVEI 1,<7*^D83>-3 ;1102 SLOTS\r
+DLST2: ILDB 3,2 ;PICK UP A FILE NUMBER\r
+ CAIG 3,^D22 ;SKIP IF BLK IS SPECIAL\r
+ AOS TOTAL(3) ;COUNT BLKS/FILE\r
+ SOJG 1,DLST2 ;LOOP\r
+ MOVEI BP,FREE ;FREE:\r
+ PUSHJ P,TYPEIT ;\r
+ MOVE C,TOTAL ;NUMBER OF FREE BLOCKS\r
+ PUSHJ P,DECMAL ;\r
+ MOVEI BP,BLKS ;-BLKS\r
+ PUSHJ P,TYPEIT ;\r
+ MOVEI C,^D22 ;26 FILES MAX\r
+ HRLZI AC1,-^D22 ;\r
+DLST7: SKIPE DNAM(AC1) ;\r
+ SOS C ;DECREMENT MAX NO. OF BLKS\r
+ AOBJN AC1,DLST7 ;\r
+ PUSHJ P,DECMAL ;\r
+ MOVEI BP,FILES ;\r
+ PUSHJ P,TYPEIT ;\r
+ HRLZI 1,-^D22 ;LOOP 26 TIMES\r
+\r
+\fDLST3: HRLZI 3,161300 ;TERMINATOR\r
+ SKIPN 2,DNAM(1) ;FILE NAME\r
+ JRST DLST5 ;\r
+ MOVEI BP,2 ;\r
+ PUSHJ P,TYPEIT ;\r
+ HLLZ 2,DNAM+^D22(1) ;EXTENSION\r
+ HRRI 2,13 ;\r
+ MOVEI BP,2 ;\r
+ PUSHJ P,TYPEIT ;\r
+ MOVE C,TOTAL+1(1) ;NUMBER OF BLKS\r
+ PUSHJ P,DECMAL ;\r
+ MOVEI C," " ;SPACE\r
+ PUSHJ P,TYPC ;\r
+ PUSHJ P,DATE ;CREATION DATE\r
+ MOVEI BP,2 ;\r
+ HRRI 3,30000 ;"#"\r
+ PUSHJ P,TYPEIT ;\r
+DLST5: AOBJN 1,DLST3 ;LOOP\r
+DXIT: MOVEI C,^D15 ;15 SECONDS\r
+ JRST GDNITE ;TO SLEEP.\r
+\r
+D6LST: MOVEI 0,36 ;MAX NO. OF ENTRIES\r
+ HRRZ 1,DIRECT ;LOC OF FIRST DIR BLK\r
+D6BEG: HRLI 3,130000 ;"-" TERMINATOR\r
+ MOVEI BP,2 ;\r
+ SKIPN 2,DIRECT(1) ;IS THERE A FILENAME?\r
+ JRST DXIT ;NORMAL EXIT\r
+ PUSHJ P,TYPEIT ;FILENAME\r
+ HLLZ 2,DIRECT+1(1) ;EXTENSION\r
+ SKIPN 2 ;IF NULL,\r
+ JRST D6FIN ;JUMP\r
+ MOVEI C," " ;OTHERWISE\r
+ PUSHJ P,TYPC ;TAB\r
+ HRRI 2,130000 ;"-"\r
+ MOVEI BP,2 ;TERM.\r
+ PUSHJ P,TYPEIT ;\r
+D6FIN: PUSHJ P,TYPCL ;CR-LF\r
+ ADDI 1,4 ;\r
+ SOJG 0,D6BEG ;IN CASE\r
+ JRST DXIT ;DIR WAS FULL\r
+\f\r
+TYPEIT: HRLI BP,440600 ;BP=MESSAGE ADR\r
+TYPLOP: ILDB C,BP ;\r
+ CAIN C,13 ;PLUS?\r
+ POPJ P, ;GET THE WHOLE MESSASE\r
+ CAIN C,3 ;#?\r
+ JRST TYPCL ;APPEND CR LF AND TYPE\r
+ ADDI C,40 ;ASCIZE IT\r
+ IDPB C,TOUT+1 ;TO THE BUFFER\r
+ JRST TYPLOP ;+LOOP\r
+\r
+TYPGET: ILDB C,TIN+1 ;GET CHAR\r
+ CAIE C," " ;SPACE?\r
+ CAIN C," " ;TAB?\r
+ JRST TYPGET ;FORGET IT\r
+ CAIGE C,141 ;LC "A"\r
+ POPJ P,\r
+ CAIG C,172 ;LC "Z"\r
+ SUBI C,40 ;LC TO UC\r
+ POPJ P,\r
+\r
+TYPCCL: IDPB C,TOUT+1 ;TYPE CHAR,CRLF\r
+TYPCL: MOVEI C,15 ;TYPE CRLF\r
+ IDPB C,TOUT+1\r
+ MOVEI C,12\r
+TYPC: IDPB C,TOUT+1 ;TYPE CHAR\r
+TYPBUF: OUTPUT 17, ;DO IT\r
+ POPJ P,\r
+\r
+\fHELP: TTCALL 3,.+2\r
+ JRST COCRET\r
+ASCIZ %\r
+/C COPY \r
+/V VERIFY\r
+/Z ZERO ALL BLOCKS\r
+/L LOAD A BOOTSTRAP LOADER FROM PTR:BSLDR.REL\r
+/T "TYPE CORE BANK OR OFFSET FOR BSLDR"\r
+ CORE-BANK = NNNK (16K TO 256K)\r
+ OFFSET = <OCTAL 1000 TO 777600>\r
+ WRITE A BSLDR ONTO BLOCKS 0,1 AND 2\r
+/N DONT TYPE A DIRECTORY\r
+/6 PDP6 DIR\r
+/G IGNORE ERRORS\r
+NO SW'S IMPLY /C/V\r
+%\r
+\fERRT1I: TLOA F,FLI ;INPUT ERROR\r
+ERRT1O: TLZ F,FLI ;OUTPUT ERROR\r
+ STATUS 1,IOS ;STATUS TO IOS\r
+ TRNE IOS,360000 ;ALL THE ERRORS\r
+ JRST ERRCHK ;FOUND AN ERROR\r
+ POPJ P,\r
+\r
+ERRT2I: TLOA F,FLI ;INPUT ERROR\r
+ERRT2O: TLZ F,FLI ;OUTPUT ERROR\r
+ STATUS 2,IOS ;FLAGS TO IOS\r
+ TRNN IOS,760000 ;PLUS WRITE LOCK\r
+ POPJ P, ;NO ERRORS\r
+ TLO F,FL2 ;IT'S A CHANNEL 2 ERROR\r
+\r
+ERRCHK: TRNE IOS,400000\r
+ PUSHJ P,ERR400 ;WRITE LOCK\r
+ TRNE IOS,200000\r
+ PUSHJ P,ERR200 ;DEVICE ERROR\r
+ TRNE IOS,100000\r
+ PUSHJ P,ERR100 ;CKSUM/PARITY\r
+ TRNE IOS,040000\r
+ PUSHJ P,ERR040 ;BLOCK TOO LARGE\r
+ TRNE IOS,020000 ;PREMATURE EOF,PDP9-DTA?\r
+ PUSHJ P,ERR020 ;\r
+ TRNN IOS,600000 ;THESE BITS IMPLY RESTART\r
+ TLNN F,FLG ;/G+PARITY ERR = CONTINUE\r
+ JRST ST ;RESTART\r
+ TRZ IOS,740000 ;ZERO IN\r
+ TLNN F,FL2\r
+ SETSTS 1,(IOS) ;TURN OFF\r
+ TLZE F,FL2\r
+ SETSTS 2,(IOS) ;AND\r
+ POPJ P, ;POP OUT\r
+\fERR400: MOVEI BP,MES400\r
+ JRST TYPEIT\r
+MES400: SIXBIT /?WRITE LOCK ERROR#/\r
+ERR200: PUSHJ P,ERRCOM\r
+ MOVEI BP,MES200\r
+ JRST TYPEIT\r
+MES200: SIXBIT / DEVICE ERROR#/\r
+ERR100: PUSHJ P,ERRCOM\r
+ MOVEI BP,MES100\r
+ JRST TYPEIT\r
+MES100: SIXBIT / CHECKSUM OR PARITY ERROR#/\r
+ERR040: PUSHJ P,ERRCOM\r
+ MOVEI BP,MES040\r
+ JRST TYPEIT\r
+MES040: SIXBIT / BLOCK TOO LARGE#/\r
+ERR020: PUSHJ P,ERRCOM\r
+ MOVEI BP,MES020\r
+ JRST TYPEIT\r
+MES020: SIXBIT / PREMATURE END OF FILE#/\r
+ERRCOM: MOVEI BP,SXBINP\r
+ TLNN F,FLI\r
+ MOVEI BP,SXBOUT\r
+ JRST TYPEIT\r
+SXBINP: SIXBIT /?INPUT+/\r
+SXBOUT: SIXBIT /?OUTPUT+/\r
+\fERRVER: MOVE T,[POINT 6,MESVER]\r
+ MOVE BP,[POINT 3,U,17]\r
+ERRVE1: ILDB C,BP ;LOAD AN OCTAL NUMBER\r
+ ADDI C,20 ;6BITIZE IT\r
+ IDPB C,T ;INSERT IN MESS\r
+ TLNE T,770000 ;ONE WORD ONLY\r
+ JRST ERRVE1 ;LOOP 6 TIMES\r
+ MOVEI BP,MESVER\r
+ JRST TYPEIT\r
+MESVER: SIXBIT /000000 VERIFICATION ERRORS#/\r
+ERRCMD: MOVEI BP,MESCMD\r
+ PUSHJ P,TYPEIT\r
+ JRST ST\r
+MESCMD: SIXBIT /?COMMAND ERROR#/\r
+ERRSW: MOVEI BP,MESSW\r
+ PUSHJ P,TYPEIT\r
+ JRST ST\r\r\r
+MESSW: SIXBIT /?SWITCH ERROR#/\r
+ERRIN1: SKIPA T,IDEV\r
+ERRIN2: MOVE T,ODEV\r
+ TTCALL 3,[ASCIZ /?/]\r
+ MOVEM T,MESINI\r
+ MOVEI BP,MESINI\r
+ PUSHJ P,TYPEIT\r
+ JRST ST\r
+MESINI: SIXBIT / INIT FAILURE#/\r
+ERRDT1: SKIPA T,IDEV\r
+ERRDT2: MOVE T,ODEV\r
+ TTCALL 3,[ASCIZ /?/]\r
+ MOVEM T,MESDTA\r
+ MOVEI BP,MESDTA\r
+ PUSHJ P,TYPEIT\r
+ JRST ST\r
+MESDTA: SIXBIT / MUST BE A DECTAPE#/\r
+\fERRTNH: MOVEI BP,MESTNH\r
+ PUSHJ P,TYPEIT\r
+ JRST ST\r
+MESTNH: SIXBIT %?BOOTSTRAP LOADER IS NOT IN COPY. TRY "/L".#%\r
+\rPTERR1: TTCALL 3,[ASCIZ /?PTR INIT FAILURE\r
+/]\r
+ JRST ST\r
+\r
+PTERR2: TTCALL 3,[ASCIZ /?LOOKUP FAILED, "BSLDR.REL"\r
+/]\r
+ JRST ST\r
+\f ;WRITE A BOOOTSTRAP LOADER IN BLOCKS 0,1 AND 2\r
+TENINT: PUSH P,JOBFF\r
+ SETSTS 2,134 ;SO I CAN WRITE IN BLK 0\r
+ USETO 2,0\r
+ OUTBUF 2,1\r
+ OUTPUT 2, ;DUMMY!\r
+\r
+ MOVE AC0,[POINT 36,BSBUF]\r
+ MOVEM AC0,BSPTR ;WHERE THE LOADER IS KEPT\r
+ HRRZ AC0,JOBFF ;\r
+ HRLI AC0,(POINT 36,)\r
+ MOVEM AC0,FFPTR ;WHERE ITS WRITTEN FROM\r
+\r
+ ILDB W,BSPTR ;IOWD\r
+ MOVE CNT,OFFSET ;\r
+ HRRI W,-1(CNT) ;FINISH THE IOWD\r
+ IDPB W,FFPTR ;\r
+\r
+TEN1: PUSHJ P,NBLK ;GET THE NEXT BLOCK, SKIPE XIT IS NORMAL\r
+ JRST RELDA5 ;TERMINATE THE BSLDR\r
+ TRNN CNT,-1 ;EMPTY?\r
+ JRST TEN1 ;YES\r
+ ILDB OS,BSPTR ;OFFSET FOR THIS BLK\r
+ LSH RB,2 ;OS'S RELBITS\r
+ AOBJN CNT,.+1 ;ACCOUNT FOR IT\r
+RELDAT: TRNN CNT,-1 ;ANY MORE DATA?\r
+ JRST TEN1 ;NO\r
+ ILDB W,BSPTR ;PROGRAM WORD\r
+ JUMPGE RB,RELDA1 ;CHECK LEFT HALF\r
+ HRLZ I,OFFSET ;\r
+ ADD W,I ;RELOCATE IT\r
+\r
+RELDA1: TLNE RB,200000 ;CHECK RIGHT HALF\r
+ HRRI W,@OFFSET ;RELOCATE IT\r
+ IDPB W,FFPTR ;\r
+ LSH RB,2 ;NEXT RELOCATION BITS\r
+ AOBJN CNT,RELDAT ;NEXT WORD\r
+ TRNE CNT,-1 ;\r
+ PUSHJ P,NSEC ;NEXT SECTION OF BLOCK\r
+ JRST RELDAT ;\r
+\r
+\fNBLK: ILDB CNT,BSPTR ;GET THE BLOCK WRD CNT\r
+ SKIPL CNT ;\r
+ AOS (P) ;SKIP EXIT IS NORMAL\r
+ MOVN CNT,CNT ;\r
+NSEC: ILDB RB,BSPTR ;RELOCATION BITS\r
+ HRLI CNT,-22 ;WRDS/SECTION\r
+ POPJ P,\r
+\r
+RELDA5: MOVE W,SASAV ;THIS JRST IS EXECUTED\r
+ HRR W,OFFSET(W) ;RELOCATE THE SA ADR\r
+ IDPB W,FFPTR ;THE LAST WORD\r
+ HRLZ BP,JOBFF ;BEG OF BSLDR\r
+ HRR BP,OUT2+1 ;BLT PTR\r
+ MOVEM BP,C ;SAVE IT\r
+ BLT BP,177(C) ;ZAP 1\r
+ OUTPUT 2, ;BLK 0\r
+ ADD C,[XWD 200,0]\r
+ MOVEM C,BP ;2ND PTR SAVED\r
+ BLT BP,177(C) ;ZAP 2\r
+ USETO 2,1\r
+ OUTPUT 2, ;BLK 1\r
+ ADD C,[XWD 200,0]\r
+ MOVEM C,BP\r
+ BLT BP,177(C)\r
+ USETO 2,2\r
+ OUTPUT 2,\r
+ PUSHJ P,ERRT2O ;ERRORS?\r
+ POP P,JOBFF\r
+ POPJ P,\r
+\fCOPZRO: PUSH P,JOBFF ;SAVE JOBFF\r
+ TLNE F,FLC ;SKIP IO TO UNASSIGNED CHAN.\r
+ SETSTS 1,134 ;\r
+ SETSTS 2,134 ;\r
+ OUTBUF 2,1 ;WITH ONE BUFFER MODE-134\r
+ USETO 2,0 ;FOR BLOCK ZERO\r
+ OUTPUT 2, ;DUMMY\r
+ TLNN F,FLC ;COPY\r
+ JRST COPBKZ ;NO, MUST BE ZERO\r
+ INBUF 1,1 ;ONE BUFFER MODE-134\r
+ USETI 1,0 ;BLOCK ZERO\r
+ INPUT 1, ;GET IT\r
+ PUSHJ P,ERRT1I ;OK?\r
+ MOVEI T,177 ;LOOP LENGTH\r
+ LDB C,IN1+1 ;FIRST WORD\r
+ DPB C,OUT2+1 ;TO THE BUFFER\r
+COPLPZ: ILDB C,IN1+1 ;OTHER WORDS\r
+ IDPB C,OUT2+1 ;TO THE BUFFER\r
+ SOJG T,COPLPZ ;TO LOOP\r
+ SETSTS 1,136 ;INPUT DEVICE\r
+ USETI 1,1 ;SIX FORMATTED DIRECTORY\r
+ INPUT 1,DIRWRD ;GET IT\r
+COPBKZ: OUTPUT 2, ;DUMP THE BUFFER\r
+ POP P,JOBFF ;FOR VERIFY?\r
+ PUSHJ P,ERRT2O ;OK?\r
+ SETSTS 2,136 ;DUMP MODE\r
+ MOVE U,JOBREL ;UPPER LIMIT\r
+ MOVE T,BLTWRD ;FROM,TO\r
+ SETZM @ZROWRD ;START\r
+ BLT T, (U) ;ZAP\r
+ MOVEI LOC,1 ;START AT BLOCK ONE\r
+COPSET: TLNE F,FLC ;SKIP\r
+ USETI 1,(LOC) ;IO 2 UNASGND CH\r
+ USETO 2,(LOC) ;SET THE BLOCK NO.\r
+ ADD LOC,INC ;ADD THE INCREMENT\r
+ CAILE LOC,1102 ;WILL IT FIT?\r
+ JRST COPFIN ;NO\r
+ PUSHJ P,COPYIT ;ONE BUFFER\r
+ JRST COPSET ;AND LOOP\r
+COPFIN: MOVEI T,-1102(LOC) ;N BLOCKS WON'T FIT\r
+ IMULI T,200 ;N WORDS WON'T FIT\r
+ MOVSS T ;GET ORGANIZED\r
+ ADDM T,LISTC ;SUB N WORDS FROM LIST\r
+ SKIPL LISTC ;IF LH OF IOWD = 0,\r
+ POPJ P, ;EXIT\r
+COPYIT: TLNN F,FLC ;COPY?\r
+ JRST COPOUT ;ZERO!\r
+ INPUT 1,LISTC ;COPY!\r
+ PUSHJ P,ERRT1I ;OK?\r
+ CAILE LOC,144 ;SKIP IF NO CHANCE\r
+ PUSHJ P,DSAV ;TRY FOR A DIRECTORY\r
+COPOUT: OUTPUT 2,LISTC ;COPY AND ZERO\r
+ JRST ERRT2O ;OK?\r
+\fVERZRO: PUSH P,JOBFF\r
+ SETZB VZ1,VZ2 ;CMDLST TERMINATOR\r
+ SETSTS 1,134 ;SET\r
+ SETSTS 2,134 ;IB MODE\r
+ USETI 1,0 ;AND\r
+ USETI 2,0 ;BLOCK 0\r
+ INBUF 1,1 ;WITH\r
+ INBUF 2,1 ;ONE BUFFER EA\r
+ INPUT 1, ;GET A BLOCK\r
+ PUSHJ P,ERRT1I ;OK\r
+ INPUT 2, ;GET ANOTHER\r
+ PUSHJ P,ERRT2I ;OK\r
+ HRRZ V1,IN1 ;DUMMY\r
+ HRRZ V2,IN2 ;IOWD\r
+ HRLI V1,-200 ;FOR VERIFY LOOP\r
+ POP P,JOBFF ;RECLAIM BUFFERS\r
+ PUSHJ P,VERIFY ;VERIFY AND EXIT THIS PAGE\r
+VERONE: SETSTS 1,136 ;SET\r
+ SETSTS 2,136 ;DUMP MODE\r
+ MOVEI LOC,1 ;START AT BLOCK 1\r\r\r
+VERSET: MOVE V1,LISTV1 ;IOWDS\r
+ MOVE V2,LISTV2 ;TO ACS\r
+ USETI 1,(LOC) ;MASTER\r
+ USETI 2,(LOC) ;AND COPY\r
+ ADD LOC,INCV ;ADD IN THE INCREMENT\r
+ CAILE LOC,1102 ;AM I ASKING TOO MUCH?\r
+ JRST VERFIN ;YEP\r
+ PUSHJ P,VERIN ;COUPLE OF INPUTS AND VERIFY\r
+ JRST VERSET\r
+\r
+VERFIN: SUBI LOC,1102 ;HOW MUCH TOO MUCH?\r
+ IMULI LOC,200 ;IN WORDS PLEASE\r
+ MOVSS LOC ;BACKWARDS\r
+ ADD V1,LOC ;SUB WORDS FROM LIST\r
+ ADD V2,LOC ;I.E. ASK FOR LESS\r
+ SKIPL V1 ;IF LH OF IOWD = 0,\r
+ POPJ P, ;EXIT\r
+\r
+VERIN: INPUT 1,V1 ;ONE FOR THE MASTER\r
+ PUSHJ P,ERRT1I ;OK?\r
+ INPUT 2,V2 ;ONE FOR THE COPY\r
+ PUSHJ P,ERRT2I ;OK?\r
+\r
+VERIFY: SETZ U, ;CLR THE ERROR CNT\r
+ MOVE T,1(V1) ;MASTER WORD\r
+ CAME T,1(V2) ;SAME AS COPY WORD?\r
+ AOS U ;NO, COUNT THE ERRORS\r
+ AOS V2 ;PLUS ONE\r
+ AOBJN V1,VERIFY+1 ;BOTH HALVES AND LOOP\r
+ JUMPN U,ERRVER ;ERROR MESS IF APPROPIATE\r
+ POPJ P, ;UNLESS V1 IS POSITIVE\r
+\fINIT: INIT 2,(T)\r
+ODEV: Z\r
+ XWD OUT2,IN2\r
+ JRST ERRIN2\r
+ MOVE BP,ODEV ;MAKE SURE ITS A DTA.\r
+ CALLI BP,4\r
+ TLNN BP,100\r
+ JRST ERRDT2 ;ERROR, ITS NOT A DTA\r
+ SKIPN BP,IDEV ;IF NULL\r
+ POPJ P, ;NO INPUT DEV REQUIRED\r
+ CAMN BP,ODEV ;SAME DEVICES?\r
+ JRST INITER ;YEPER\r
+ INIT 1,(T)\r
+IDEV: Z\r
+ XWD 0,IN1\r
+ JRST ERRIN1\r
+ MOVE BP,IDEV ;MAKE SURE ITS A DTA\r
+ CALLI BP,4\r
+ TLNN BP,100\r
+ JRST ERRDT1 ;ERROR\r
+ POPJ P,\r
+\r
+INITER: TTCALL 3,[ASCIZ /INPUT AND OUTPUT DEC-TAPES MAY NOT BE THE SAME DEVICE.\r
+/]\r
+ JRST ST\r
+\f; LOAD A BOOTSTRAP LOADER, \r
+\r
+I=1 ;PTR TO BSBUF\r
+W=2 ;WORD OF TENDMP.REL\r
+CNT=3 ;# OF WORDS IN CURRENT BLOCK\r
+TYPE=4 ;TYPE OF BLOCK\r
+OS=4 ;OFFSET\r
+RB=5 ;RELOCATION BITS\r
+\r
+FFPTR: BLOCK 1 ;BYTEPTR TO RELOCATED BSLDR\r
+BSPTR: BLOCK 1 ;BYTPTR TO UNRLCTD BSLDR\r
+OFFSET: BLOCK 1 ;THE OFFSET\r
+RELBTS: BLOCK 1 ;RELOCATION BITS\r
+SASAV: BLOCK 1 ;STARTING ADDRESS\r
+PNAME: BLOCK 1 ;PROGRAM NAME\r
+ SIXBIT /#/ ;# = "CRLF"\r
+\r
+\r
+BSLDR: MOVE AC0,[SIXBIT /BSLDR/] ;LOOKUP BLOCK\r
+ HRLZI AC1,(SIXBIT /REL/)\r
+ SETZB AC2,AC3 ;\r
+ INIT 16,13 ;IMAGE-BINARY\r
+ SIXBIT /PTR/ ;\r
+ EXP PTRBUF ;\r
+ JRST PTERR1 ;INIT FAILURE ERROR\r
+ INBUF 16,1 ;ONE BUFFER\r
+ LOOKUP 16, ;BSLDR.REL\r
+ JRST PTERR2 ;LOOKUP FAILURE\r
+ MOVEI I,BSBUF ;PP PTR FOR BOOTSTRAP-LOADER-BUF\r
+\r
+NEWBLK: PUSHJ P,GETWRD ;GET ONE WORD FROM PTR FILE\r
+ HLRZM W,TYPE ;SAVE BLOCK-TYPE\r
+ HRRZM W,CNT ;SAVE WRD-COUNT FOR THIS BLK\r
+ CAIN TYPE,1 ;\r
+ PUSH I,W ;SAVE BLOCK HDR-WRD\r
+ PUSHJ P,GETWRD ;\r
+ MOVEM W,RELBTS ;SAVE RELOCATION-BITS\r
+ CAIN TYPE,1 ;BLKTYP=1?\r
+ PUSH I,W ;YEP, SAVE THE BITS\r
+ CAIG TYPE,7 ;ILL-BLK-TYP?\r
+ JRST @TYPTAB(TYPE) ;NO, OFF TO BLOCK HANDLER\r\r\r
+\r
+TTCALL 3,[ASCIZ /?ILLEGAL BLOCK TPYE\r
+/]\r
+ JRST ST ;\r
+\r
+\fTYPTAB: Z BLK0\r
+ Z BLK1\r
+ Z BLK2\r
+ Z BLK3\r
+ Z BLK4\r
+ Z BLK5\r
+ Z BLK6\r
+ Z BLK7\r
+\r
+GETWRD: SOSG PTRBUF+2 ;EMPTY BUF?\r
+ PUSHJ P,GETBUF ;GET A BUFFER\r
+ ILDB W,PTRBUF+1 ;\r
+ POPJ P,\r
+\r
+GETBUF: IN 16, ;GET BUFFER\r
+ POPJ P,\r
+ STATZ 16,20000 ;EOF?\r
+ TTCALL 3,[ASCIZ /?NO END BLOCK ENCOUNTERED\r
+/]\r
+ STATZ 16,74000 ;ERRORS?\r
+ TTCALL 3,[ASCIZ /?DATA ERROR ON DEVICE PTR\r
+/]\r
+ JRST ST\r
+ ;THIS IS NOT A BLOCK, IGNORE IT\r
+BLK0: JUMPE CNT,NEWBLK ;\r
+ PUSHJ P,GETWRD ;PASS A WRD\r
+ SOJA CNT,BLK0 ;\r
+\r
+ ;THIS IS THE PROGRAM\r
+BLK1: MOVN CNT,CNT ;TOTAL NUMBER OF WRDS THIS BLK\r
+BLK1A: HRLI CNT,-22 ;MAX NUMBER PER SECTION\r
+BLK1B: TRNN CNT,-1 ;ANY MORE WRDS?\r
+ JRST NEWBLK ;NO\r
+ PUSHJ P,GETWRD ;\r
+ PUSH I,W ;SAVE IN BSBUF\r
+ AOBJN CNT,BLK1B ;ANY MORE WRDS THIS SECTION?\r
+ TRNN CNT,-1 ;NO, ...THIS BLK?\r
+ JRST NEWBLK ;NO\r
+ PUSHJ P,GETWRD ;GET THE REL-BITS FOR NXT SECT\r
+ PUSH I,W ;SAVEM\r
+ JRST BLK1A ;\r
+\r
+\f ;THIS IS THE SYMBOL TABLE\r
+BLK2: MOVN CNT,CNT ;\r
+BLK2A: HRLI CNT,-22 ;\r
+BLK2B: TRNN CNT,-1 ;\r
+ JRST NEWBLK ;\r
+ PUSHJ P,GETWRD ;\r
+ TLNE W,200000 ;\r
+ JUMPL W,BLK2ER ;ERROR - ITSA EXTERNAL SYMBOL\r
+ AOBJN CNT,.+1 ;IGNORE THE VALUE\r
+ PUSHJ P,GETWRD ;\r
+ AOBJN CNT,BLK2B ;\r
+ TRNN CNT,-1 ;\r
+ JRST NEWBLK ;\r
+ JRST BLK2A\r
+BLK2ER: TTCALL 3,[ASCIZ /?CANNOT PROCESS EXTERNAL SYMBOLS\r
+/]\r
+ JRST ST\r
+\r
+ ;HIGHSEG FLAG, GIVE ERROR EXIT\r
+BLK3: TTCALL 3,[ASCIZ /?CANNOT PROCESS HIGH-SEG'S\r
+/]\r
+ JRST ST\r
+\r
+ ;ENTRY BLOCK, IGNORE THIS BLOCK\r
+BLK4: MOVN CNT,CNT ;\r
+BLK4A: HRLI CNT,-22 ;\r
+ TRNN CNT,-1 ;\r
+ JRST NEWBLK ;\r
+ PUSHJ P,GETWRD ;\r
+ AOBJN CNT,BLK4A+1 ;PASS/IGNORE \r
+ TRNN CNT,-1 ;\r
+ JRST NEWBLK ;\r
+ PUSHJ P,GETWRD ;\r
+ JRST BLK4A ;\r
+\r
+ ;THIS IS LAST BLK, MUST BE SEEN, ALSO IS PROG-BREAK\r
+BLK5: PUSHJ P,GETWRD ;\r
+ MOVNI AC0,1(W) ;\r
+ HRLM AC0,BSBUF ;START THE IOWD\r
+ CAILE W,600 ;MUST FIT IN LESS-THAN 4 BLKS\r
+ JRST BLK5ER ;ERROR IF'E CAN'T\r
+ TLO W,400000 ;NOTE THE END\r
+ PUSH I,W ;\r
+ HRLZI LFL ;NOTE BSLDR IS IN "COPY"\r
+ IORM FSAVE ;SAVE IT\r
+ TLO F,LFL ;\r
+ CLOSE 16, ;\r
+ JRST COCRET ;THE ONLY WAY OUT\r
+BLK5ER: TTCALL 3,[ASCIZ /?BOOTSTRAP LOADER WILL NOT FIT IN 3 BLOCKS\r
+/]\r
+ JRST ST\r
+\r
+\f ;PROG-NAME IN RADIX50\r
+BLK6: PUSHJ P,GETWRD ;\r
+ PUSHJ P,UNWIND ;CONVRT RX50 TO 6BIT PROG-NAME\r
+ SOJA CNT,BLK4 ;I.E. IGNORE REST OF THIS BLK\r
+\r
+UNWIND: MOVE AC4,[POINT 6,PNAME]\r
+ SETZM PNAME\r
+ MOVEM W,AC5 ;\r
+ HRROI AC0,-6 ;6 CHARS\r
+ TLZ W,740000 ;CLEAR THE CODE BITS\r
+UNW1: IDIVI AC5,50 ;\r
+ HRLM AC6,(P) ;SAVE REMAINDER\r
+ AOJGE AC0,UNW2 ;LOOP\r
+ PUSHJ P,UNW1 ;LOOP\r
+UNW2: HLRZ AC6,(P) ;PICK OFF THE REMAINDER + DECODE IT\r
+ JUMPE AC6,UNW3 ;DONE\r
+ ADDI AC6,20-1\r
+ CAILE AC6,31\r
+ ADDI AC6,41-32\r
+ CAILE AC6,72\r
+ SUBI AC6,74-4\r
+ CAIN AC6,3\r
+ MOVEI AC6,16\r
+\r
+ IDPB AC6,AC4\r
+UNW3: POPJ P,\r
+\r
+ ;STARTING ADR.\r
+BLK7: PUSHJ P,GETWRD ;\r
+ HRLI W,(JRST) ;JUMP TO THE STARTING ADDRESS\r
+ MOVEM W,SASAV ;SAVE STARTING ADDRESS\r
+ SOJA CNT,BLK4 ;IGNORE REST OF BLK\r
+\r
+\fBLTWRD: XWD END.,END.+1 ;ZRO FROM,TO\r
+ZROWRD: EXP END. ;START\r
+FSAVE: XWD FLP,0 ;MODIFIED WHEN BSLDR IS LOADED\r
+LISTC: IOWD 0,END.\r
+ Z\r
+LISTV1: IOWD 0,END.\r
+LISTV2: IOWD 0,END.\r
+INC: BLOCK 1\r
+INCV: BLOCK 1\r
+DIRECT: BLOCK 123\r
+DNAM: BLOCK 55\r
+TOTAL: BLOCK 26 ;BLOCK TABLE\r
+DIRWRD: IOWD 200,DIRECT\r
+ Z\r
+REWIND: IOWD 1,PTRBUF\r
+ Z\r
+TTYIN: BLOCK 23+20\r
+TTYOUT: BLOCK 23\r
+IN1: BLOCK 3\r
+IN2: BLOCK 3\r
+OUT2: BLOCK 3\r
+TIN: BLOCK 3\r
+TOUT: BLOCK 3\r
+PTRBUF: BLOCK 3\r
+BSBUF: BLOCK 720 ;ENUF FOR 3BLOCKS PLUS HDR WRDS\r
+ VAR\r
+ LIT\r
+END.: END ST ;;22-JUN\r
+\f\r
--- /dev/null
+COPY.OPR\r
+\r
+TO LOAD TYPE "LOAD COPY"\r
+TO SAVE TYPE "SAVE COPY"\r
+\r
+THE DISTRIBUTION COPY WAS LOADED WITH DTBOOT AS FOLLOWS:\r
+\r
+ .RENAME BSLDR.REL=DTBOOT.REL\r
+ .ASSIGN DSK PTR\r
+ .EXECUTE COPY\r
+ */L\r
+ *^C\r
+ .SAVE COPY\r
-CDRSR6=CDRSR6
-CDRSRX=CDRSRX
-CLOCK1=CLOCK1
-CLKCSS=CLKCSS
-COMCON=COMCON
-COMMON=COMMON
-CORE1=CORE1
-DIS340=DIS340
-DIST30=DIST30
-DCSINT=DCSINT
-DLSINT=DLSINT
-DPDINT=DPDINT
-DSKINT=DSKINT
-DSKSER=DSKSER
-DTCSRN=DTCSRN
-DTASRN=DTASRN
-EDDT=EDDT
-ERRCON=ERRCON
-JOBDAT=JOBDAT
-LPTSER=LPTSER
-MTCSR6=MTCSR6
-MTASRX=MTASRX
-NULSEG=NULSEG
-SEGCON=SEGCON
-PLTSER=PLTSER
-PTRSER=PTRSER
-PTPSER=PTPSER
-PTYSRF=PTYSRF
-PTYSRH=PTYSRH
-PATCH=PATCH
-SYSINI=SYSINI
-SYSMAK=SYSMAK
-ONCEB=ONCEB
-SCNSRF=SCNSRF
-SCHEDB=SCHEDB
-UUOCON=UUOCON
+CDRSR6=CDRSR6\r
+CDRSRX=CDRSRX\r
+CLOCK1=CLOCK1\r
+CLKCSS=CLKCSS\r
+COMCON=COMCON\r
+COMMON=COMMON\r
+CORE1=CORE1\r
+DIS340=DIS340\r
+DIST30=DIST30\r
+DCSINT=DCSINT\r
+DLSINT=DLSINT\r
+DPDINT=DPDINT\r
+DSKINT=DSKINT\r
+DSKSER=DSKSER\r
+DTCSRN=DTCSRN\r
+DTASRN=DTASRN\r
+EDDT=EDDT\r
+ERRCON=ERRCON\r
+JOBDAT=JOBDAT\r
+LPTSER=LPTSER\r
+MTCSR6=MTCSR6\r
+MTASRX=MTASRX\r
+NULSEG=NULSEG\r
+SEGCON=SEGCON\r
+PLTSER=PLTSER\r
+PTRSER=PTRSER\r
+PTPSER=PTPSER\r
+PTYSRF=PTYSRF\r
+PTYSRH=PTYSRH\r
+PATCH=PATCH\r
+SYSINI=SYSINI\r
+SYSMAK=SYSMAK\r
+ONCEB=ONCEB\r
+SCNSRF=SCNSRF\r
+SCHEDB=SCHEDB\r
+UUOCON=UUOCON\r
--- /dev/null
+TITLE DTBOOT - V003 - DECTAPE BOOTSTRAP (BIG TENDMP) -\r
+SUBTTL R. CLEMENTS /RCC/JEF - 16 MAR 71\r
+\r
+;(C) COPYRIGHT DIGITAL EQUIPMENT CORPORATION, MAYNARD MASS 1971\r
+\r
+;"THESE BOOTS WERE MADE FOR WALKIN'." - N.S.\r
+\r
+;AC'S\r
+\r
+F=0 ;FLAGS\r
+A=1 ;GENERAL AC'S\r
+B=2 ; ..\r
+C=3 ; ..\r
+X=4 ;MEMORY ADDRESS COUNTER\r
+W=5 ;WORD RETURNED BY RWORD OR SIXBRD\r
+NAME=6 ;NAME OF FILE BEING SEARCHED FOR\r
+EXT=7 ;EXTENSION OF FILE BEING SEARCHED FOR\r
+Q=10 ;COUNTER TO STEP THROUGH BUFFER OF 200 DATA WORDS\r
+N=12 ;NUMBER ASSEMBLER IN TYPEIN, COUNTER IN SEARCH,RDBLK,WRBLK\r
+M=13 ;MEMORY AOBJN POINTER FOR READING THE DATA TO CORE\r
+FN=14 ;FILE NUMBER, 1 TO NFILES\r
+BP=15 ;POINTER TO CURRENT DIR BYTE (ALSO SIXBIT INPUT)\r
+LBN=16 ;TAPE BLOCK NUMBER TO READ\r
+P=17 ;STACK POINTER\r
+\f;CORE ALLOCATION\r
+IFNDEF REL,<REL=0> ;REL=1 CAUSES A RELOCATABLE ASSEMBLY\r
+IFG REL,<BASE: CORE=BASE+1000>\r
+IFNDEF CORE,<CORE=200000> ;ASSUME 64K\r
+\r
+ZZ=CORE-2000+140 ;SET ABOVE JOB DATA AREA OF TOP K\r
+\r
+CLRTOP=ZZ-1 ;WHEN CLEARING CORE, CLEAR TO HERE\r
+\r
+DEFINE U(Z)<\r
+ UU(Z,1)> ;ONE WORD ALLOCATION\r
+DEFINE UU(Z,N)< Z=ZZ\r
+ZZ=ZZ+N\r
+IFGE <ZZ-CORE+1000>,<\r
+PRINTX ALLOCATION ERROR\r
+>>\r
+\r
+OPDEF PJRST [JRST]\r
+IFE REL,<LOC CORE-1000 ;ABSOLUTE ASSEMBLY\r
+RIM10B> ;PAPER TAPE FORMAT\r
+\r
+U(DEVICE) ;DEVICE NAME FROM COMMAND\r
+U(FNAME) ;FILE NAME FROM COMMAND\r
+U(FEXT) ;FILE EXTENSION FROM COMMAND\r
+U(SWITCH) ;SWITCHES FROM COMMAND\r
+U(TAPEID) ;TAPE NAME FOR Z COMMAND\r
+U(PRVLBN) ;LBN SOUGHT ON PREVIOUS SEARCH\r
+U(FBN) ;FIRST BLOCK NUMBER, FOR LINK\r
+\r
+UU(HBUF,200) ;DIRECTORY OF DTA\r
+UU(DBUF,200) ;DATA BUFFER\r
+FIRSTW==20 ;FIRST LOCATION CONSIDERED ON WRITE\r
+PDLL==20 ;STACK LENGTH\r
+\r
+\f;I/O DEVICE PARAMETERS\r
+\r
+DTC==320 ;DEVICE CODE FOR DTA CONTROL\r
+DTS==324 ;DEVICE CODE FOR DTA STATUS\r
+O.NOP==0 ;OPCODES FOR THE DTA CONTROL CONO\r
+O.SRCH==200 ;SEARCH\r
+O.READ==300 ;READ\r
+O.WRIT==700 ;WRITE\r
+C.STOP==400000 ;CONO BITS\r
+C.FWD==200000 ;GO FORWARD\r
+C.REV==100000 ;GO REVERSE\r
+C.NDEL==040000 ;NO DELAY AFTER CONO\r
+C.SEL==020000 ;SELECT A UNIT\r
+C.DSEL==010000 ;DESELECT CURRENT UNIT\r
+S.DAT==1 ;DATA DONE FLAG\r
+S.INT==2 ;INT REQ FLAG\r
+S.END==020000 ;END ZONE HIT\r
+S.JOBD==100000 ;JOB DONE FLAG\r
+S.ERR==653300 ;ERRORS TO GIVE UP ON.\r
+;FLAGS, LEFT HALF OF F\r
+\r
+L.DOT=1 ;DOT SEEN IN FILE SPEC\r
+L.UPA==2 ;UPARROW (TAPE ID)\r
+L.SLA==10 ;SLASH SEEN IN FILE SPEC\r
+L.ALL==13 ;ABOVE FLAGS TOGETHER.\r
+L.UPA2==20 ;UPARROW AGAIN FOR READING AT ZERO ROUTINE\r
+L.REV==400000 ;TAPE MOVING IN REVERSE. SIGN BIT REQ?\r
+L.REVA==40 ;ALLOCATION PASS IS GOING IN REVERSE\r
+L.TURN==100 ;ALLOCATION PASS HAD TO TURN AROUND\r
+\r
+;FLAGS, RIGHT HALF OF F\r
+\r
+R.MRG==1 ;MERGE, NOT LOAD.\r
+R.WEOF==2 ;ON WHILE WRITING JRST WORD(S) IN LAST BLK\r
+R.DIRI==4 ;DIRECTORY IN CORE IS VALID\r
+R.STRT==10 ;ON IF LOAD AND GO. OFF IF JUST LOAD\r
+\r
+;SYSTEM PARAMETERS WHICH MUST AGREE WITH TIMESHARING SYSTEM\r
+\r
+DIRBLK==144 ;WHERE DIRECTORY IS ON TAPE\r
+D.BYT==0 ;WORD OF BYTES IN DIRECTORY\r
+D.NAM==123 ;FIRST NAME IN DIRECTORY\r
+D.EXT==151 ;START OF EXTENSIONS IN DIR\r
+NFILES==26 ;HOW MANY FILES FIT IN DIR\r
+MAXBLK==1101 ;LAST BLOCK ON THE TAPE\r
+BLKFAC==2 ;BLOCKING FACTOR - WRITE ONE OF N BLKS\r
+\f;START HERE\r
+\r
+GO: MOVEI F,0 ;CLEAR ALL FLAGS\r
+ CONO 200000 ;I/O BUS RESET\r
+ CONO 4,10400 ;CLEAR PI SYSTEM\r
+ SETZM DEVICE ;CLEAR REQUESTED DEVICE NAME\r
+REGO: MOVE P,PDP ;INITIAL STACK POINTER\r
+ ANDI F,R.DIRI ;CLEAR OUT RANDOM FLAGS\r
+ SETZM FNAME ;CLEAR REQUESTED FILE NAME\r
+ SETZM FEXT ;CLEAR REQUESTED FILE EXTENSION\r
+ SETZM SWITCH ;CLEAR COMMAND SWITCHES\r
+ PUSHJ P,CRLF ;SAY HELLO\r
+GOL: MOVE BP,SIXPTR ;POINTER TO THE WORD.\r
+ SETZB N,W ;CLEAR ANSWERS.\r
+SIXBRL: CONSO TTY,40 ;WAIT FOR A KEY TO BE ST(R)UCK\r
+ JRST .-1 ; ..\r
+ DATAI TTY,C ;GET THE CHAR\r
+ PUSHJ P,TYO ;ECHO IT\r
+ ANDI C,177 ;ONLY 7 BITS\r
+ CAIN C,177 ;RUBOUT?\r
+ JRST REGO ;YES. QUIT.\r
+ CAIG C,172 ;CHECK FOR LOWER CASE\r
+ CAIGE C,140 ; ..\r
+ SKIPA ;NOT L.C.\r
+ TRZ C,40 ;L.C., MAKE U.C.\r
+ CAIG C,"Z" ;LETTER?\r
+ CAIGE C,"A" ; ..\r
+ SKIPA ;NOT A LETTER.\r
+ JRST SIXLTR ;LETTER.\r
+ CAIG C,"9" ;NUMBER?\r
+ CAIGE C,"0" ; ..\r
+ JRST GO0 ;NO. RETURN WITH BREAK CHAR.\r
+ LSH N,3 ;BUILD OCTAL NUMBER\r
+ ADDI N,-60(C) ;ADD IN THIS DIGIT\r
+SIXLTR: TRC C,40 ;MAKE SIXBIT\r
+ TLNE BP,770000 ;ONLY 6 CHARS\r
+ IDPB C,BP ;STORE CHAR IN W\r
+ JRST SIXBRL ;LOOP FOR MORE.\r
+\fGO0: CAIE C,":" ;UNIT DELIMITER?\r
+ JRST GO1 ;NO.\r
+ TRZ F,R.DIRI ;DIRECTORY NO GOOD, SELECTING A TAPE\r
+ ANDI N,7 ;JUST THREE BITS OF UNIT NUMBER\r
+ MOVEM N,DEVICE ;YES. SAVE NUMBER OF DEVICE\r
+ JRST GOL ;GO READ MORE.\r
+GO1: TLNN F,L.ALL ;ANY SYNTAX REQUESTS?\r
+ JRST GO6 ;NO. SEE IF FILE NAME.\r
+ TLZE F,L.DOT ;WAS THERE A DOT?\r
+ HLLOM W,FEXT ;YES. STORE EXT. RH IS FLAG IF BLANK.\r
+ TLZE F,L.UPA ;UPARROW?\r
+ MOVEM W,TAPEID ;YES. SAVE TAPE NAME.\r
+ TLZE F,L.SLA ;SLASH SWITCH?\r
+ MOVEM W,SWITCH ;YES. SAVE SWITCH WORD\r
+GO7: CAIGE C,175 ;ALTMODE?\r
+ CAIG C,40 ;SPACE OR CONTROL CHAR?\r
+ JRST DO ;YES. GO PROCESS COMMAND\r
+ CAIE C,"." ;FILE EXTENSION REQUEST?\r
+ JRST GO3 ;NO.\r
+ TLO F,L.DOT ;YES. REMEMBER THAT\r
+ JRST GOL ;AND READ ON.\r
+\r
+GO3: CAIE C,"/" ;SLASH?\r
+ JRST GO5 ;NO.\r
+ TLO F,L.SLA ;YES. MARK SWITCH COMING\r
+ JRST GOL ;RETURN TO SCAN\r
+GO5: CAIN C,"^" ;UPARROW?\r
+ TLO F,L.UPA+L.UPA2 ;YES. NOTE IT.\r
+ JRST GOL ;LOOP FOR MORE.\r
+GO6: SKIPE W ;NO PUNCTUATION. NAME TYPED?\r
+ MOVEM W,FNAME ;YES. STORE NAME\r
+ JRST GO7 ;GO CHECK PUNCTUATION\r
+\f;HERE WHEN COMMAND STRING SUCCESSFULLY READ. DO THE JOB.\r
+\r
+DO: PUSHJ P,CRLF ;SIGNAL STARTING I/O\r
+ LDB A,SWPTR ;GET FIRST CHAR OF SWITCHES\r
+ CAIN A,"Z"-40 ;ZERO COMMAND?\r
+ JRST ZERO ;YES.\r
+ CAIN A,"G"-40 ;GO COMMAND?\r
+PROGSA: JRST GO ;YES. *** RH MODIFIED ***\r
+ CAIL A,"0"-40 ;NUMERIC?\r
+ CAILE A,"7"-40 ; OCTAL, THAT IS,\r
+ SKIPA ;NO.\r
+ JRST SETSA ;YES. GO SET STARTING ADDRESS\r
+ PUSHJ P,RDDIR ;REST OF COMMANDS NEED DIRECTORY\r
+ LDB A,SWPTR ;GET FIRST CHAR OF SWITCHES\r
+ CAIN A,"M"-40 ;MERGE?\r
+ TROA F,R.MRG ;YES. SKIP INTO LOAD, FLAGGING MERGE ONLY\r
+ CAIN A,"L"-40 ;LOAD COMMAND?\r
+ JRST LOAD ;YES.\r
+ CAIN A,"D"-40 ;DUMP COMMAND?\r
+ JRST DUMP\r
+ CAIN A,"F"-40 ;FILE DIRECTORY?\r
+ JRST FILDIR ;YES.\r
+ CAIN A,"K"-40 ;KILL A FILE (DELETE)?\r
+ JRST KILL ;YES.\r
+ JUMPE A,RUN ;IF NO SWITCH, ASSUME LOAD AND RUN\r
+ PUSHJ P,ERROR ;NO OTHERS IMPLEMENTED\r
+\r
+SETSA: HRRM N,PROGSA ;STORE PROGRAM STARTING ADDR\r
+ JRST REGO ;AND WAIT FOR ANOTHER COMMAND\r
+\r
+FILDIR: MOVSI N,-NFILES ;LIST A QUICK DIRECTORY\r
+FILDL: SKIPN B,HBUF+D.NAM(N) ;GET A NAME, IF ANY IN THIS SLOT\r
+ JRST FILDN ;NONE HERE\r
+ PUSHJ P,SIXOUT ;TYPE C(B) IN SIXBIT\r
+ HLLZ B,HBUF+D.EXT(N) ;GET EXTENSION\r
+ JUMPE B,FILD1 ;IF NOT BLANK,\r
+ MOVEI C,"." ;DOT\r
+ PUSHJ P,TYO ;TYPE DOT\r
+ PUSHJ P,SIXOUT ;TYPE EXT\r
+FILD1: PUSHJ P,CRLF ;A CARRIAGE RETURN\r
+FILDN: AOBJN N,FILDL ;LOOP FOR ALL NAMES\r
+ JRST REGO1 ;STOP TAPE AND GO FOR NEXT COMMAND\r
+\f;LOAD AND RUN COMMANDS\r
+\r
+RUN: TRO F,R.STRT ;LOAD AND START PROGRAM\r
+LOAD: MOVSI FN,-NFILES ;SEARCH TO SEE IF ONLY ONE SAV FILE ON DT\r
+ MOVEI A,0 ;WHERE NAME WILL GO IF FOUND\r
+RUN5: HLRZ EXT,HBUF+D.EXT(FN) ;CHECK AN EXTENSION\r
+ CAIN EXT,(SIXBIT /SAV/) ;IS IT A SAV FILE?\r
+ JRST RUN2 ;YES. GO NOTE IT\r
+RUN4: AOBJN FN,RUN5 ;LOOP THRU COUNTING ALL FILES\r
+ SKIPN A ;WAS ONE AND ONLY ONE FOUND?\r
+RUN3: MOVE A,SYSTEM ;DEFAULT READ-FILE NAME\r
+ SKIPN FNAME ;NAME SUPPLIED?\r
+ MOVEM A,FNAME ;NO. PLUG IN DEFAULT.\r
+ PUSHJ P,LOOK ;TRY TO FIND FILE\r
+ PUSHJ P,ERROR ;NOT THERE. FAIL.\r
+ MOVEI LBN,1 ;HAVE TO FIND A BLOCK OF FILE\r
+ MOVE BP,BYTPTR ;LOOK THRU DIRECTORY\r
+RUNL: ILDB N,BP ;GET A BYTE\r
+ CAIN N,0(FN) ;BELONG TO THIS FILE?\r
+ JRST RUN1 ;YES.\r
+ CAIL LBN,MAXBLK ;LOOKED TOO FAR?\r
+ PUSHJ P,ERROR ;YES. NO BLKS IN FILE!\r
+ AOJA LBN,RUNL ;LOOK FURTHER\r
+RUN1: PUSHJ P,RDDAT1 ;READ THE DATA BLOCK TO FIND FBN\r
+ LDB A,[POINT 10,DBUF+0,27] ;FIRST BLOCK OF FILE\r
+ HRLM A,DBUF+0 ;PUT IT IN LINK SLOT TO BE READ NEXT\r
+RFILE: SETZB Q,40 ;CLEAR CORE BEFORE READING FILE\r
+ ;AND INITIALLY NO WORDS IN DATA BUFFER\r
+ MOVE A,BLTXWD ; ..\r
+ TRNN F,R.MRG ;UNLESS MERGE ONLY,\r
+ BLT A,CLRTOP ;CLEAR UP TO BASE OF THIS PROGRAM\r
+RFILL1: PUSHJ P,RWORD ;READ A POINTER OR JRST WORD\r
+ SKIPL M,W ;WHICH IS IT?\r
+ JRST STARTQ ;TRANSFER WORD\r
+RFILL2: PUSHJ P,RWORD ;READ A WORD OF DATA\r
+ MOVEM W,1(M) ;STORE IT IN CORE\r
+ AOBJN M,RFILL2 ;COUNT THE CORE POINTER.\r
+ JRST RFILL1 ;IT RAN OUT. GET ANOTHER.\r
+\r
+RUN2: JUMPN A,RUN3 ;IF ALREADY ONE, THIS IS 2. QUIT.\r
+ MOVE A,HBUF+D.NAM(FN) ;FIRST SAV FILE. GET ITS NAME.\r
+ JRST RUN4 ;AND SEE IF ANY MORE.\r
+\fSTARTQ: HRRM W,PROGSA ;SAVE THE STARTING ADDRESS\r
+REGO1: CONO DTC,C.STOP ;STOP THE TAPE\r
+ TRNE F,R.STRT ;LOAD OR START?\r
+ JRST 0(W) ;START\r
+ JRST REGO ;JUST LOAD. GO GET ANOTHER COMMAND\r
+\r
+;SUBROUTINE TO READ A DATA WORD FROM THE FILE.\r
+\r
+RWORD1: MOVE Q,DBUFP ;PREPARE TO COUNT DATA WORDS\r
+RWORD: JUMPGE Q,RWNXTB ;NEED ANOTHER BLOCK?\r
+ MOVE W,0(Q) ;NO. GET A WORD.\r
+ AOBJN Q,.+1 ;COUNT IT.\r
+ POPJ P,0 ;RETURN FROM RWORD\r
+RWNXTB: PUSHJ P,RDDATA ;NO. READ NEXT DATA BLOCK, IF ANY\r
+ JRST RWORD1 ;READ FROM THIS BLOCK\r
+\r
+DUMP: MOVE A,CRASH ;DEFAULT FILE NAME\r
+ SKIPN FNAME ;NAME ALREADY SET?\r
+ MOVEM A,FNAME ;NO. USE DEFAULT\r
+ PUSHJ P,ENTR ;TRY TO FIND THE FILE.\r
+ PUSHJ P,ERROR ;NO FREE SLOTS (OR MAYBE NO BLKS LEFT)\r
+ MOVEM LBN,FBN ;SAVE AS FIRST BLOCK NUMBER\r
+ MOVEI Q,0 ;INITIALIZE DATA BLOCK COUNTER\r
+ MOVEI M,FIRSTW-1 ;AND CORE ADDRESS COUNTER\r
+DUMPL2: HRRZS X,M ;START OF A BLOCK\r
+DUMPL1: SKIPN 1(X) ;THIS WORD ZERO IN CORE?\r
+ JRST DUMP1 ;YES. SEE IF END OF A BLOCK.\r
+ CAIGE X,CLRTOP ;LOOKED AT ALL OF CORE?\r
+ AOJA X,DUMPL1 ;NO. COUNT PART OF THIS BLOCK, LOOK ON.\r
+DUMP1: MOVEI W,0(M) ;END OF BLOCK. IS BLOCK EMPTY?\r
+ SUBI W,0(X) ;START MINUS END OF BLK\r
+ JUMPE W,DUMP2 ;JUMP IF BLOCK EMPTY\r
+ HRL M,W ;MAKE -COUNT,,START-1 FOR COUNTER\r
+ MOVE W,M ;AND FOR DATA IN FILE\r
+ PUSHJ P,WWORD ;WRITE IT OUT AS DATA\r
+DUMPL3: MOVE W,1(M) ;GET THE WORD FROM CORE\r
+ PUSHJ P,WWORD ;OUTPUT TO FILE\r
+ AOBJN M,DUMPL3 ;OUTPUT ALL OF BLOCK\r
+DUMP2: CAIGE X,CLRTOP ;CONSIDERED ALL OF CORE?\r
+ AOJA M,DUMPL2 ;NO. MOVE ON.\r
+ TRO F,R.WEOF ;FLAG WRITING LAST BLK, SO NO ALLOC\r
+ MOVE W,PROGSA ;YES. APPEND STARTING ADDRESS\r
+ PUSHJ P,WWORD ;WRITE OUT THIS WORD\r
+ JUMPL Q,.-1 ;IF MORE TO GO IN BLOCK, WRITE AGAIN\r
+ JRST CLS ;WRITE OUT THE DIRECTORY\r
+ ;AND RESTART PROGRAM FOR NEXT COMMAND\r
+\f;SUBROUTINE TO WRITE A WORD INTO THE FILE\r
+\r
+WWORD: SKIPL Q ;NEED A NEW POINTER?\r
+ MOVE Q,DBUFP ;YES.\r
+ MOVEM W,0(Q) ;PUT WORD INTO BUFFER\r
+ AOBJN Q,CPOPJ ;COUNT POINTER. DONE?\r
+ MOVE A,FBN ;GET FIRST BLOCK NUMBER\r
+ LSH A,10 ;PUT IN RIGHT PLACE\r
+ TRO A,177 ;DECLARE 127 WORDS IN BLOCK USED\r
+ HRRZM A,DBUF+0 ;PUT IN LINK WORD\r
+ TRNE F,R.WEOF ;WRITING LAST BLK?\r
+ JRST WWORD1 ;YES. DONT ALLOCATE ANOTHER\r
+ PUSH P,LBN ;SAVE BLOCK ABOUT TO WRITE\r
+ PUSHJ P,ALLOC ;GET NEXT BLOCK OF FILE\r
+ PUSHJ P,ERROR ;NONE AVAILABLE\r
+ HRLM LBN,DBUF+0 ;PUT IN LINK WORD\r
+ POP P,LBN ;RESTORE BLOCK FOR WRITING NOW\r
+WWORD1: PUSHJ P,WRDATA ;OUTPUT BLOCK, IF POSSIBLE\r
+ HLRZ LBN,DBUF+0 ;GET LINK TO NEXT BLOCK IN LBN\r
+ POPJ P,0 ;OK. RETURN.\r
+\r
+;SUBROUTINE TO LOOK FOR FILE\r
+\r
+LOOK: MOVE NAME,FNAME ;GET DESIRED FILENAME\r
+ MOVSI EXT,(SIXBIT /SAV/) ;DEFAULT EXTENSION\r
+ SKIPE FEXT ;ANY SUPPLIED?\r
+ HLLZ EXT,FEXT ;YES. USE IT.\r
+SRCHFD: MOVSI FN,-NFILES ;MAKE AOBJN COUNTER\r
+SCHL2: MOVE B,HBUF+D.NAM(FN) ;GET A FILE NAME\r
+ CAME B,NAME ;IS NAME RIGHT?\r
+ JRST SCHN2 ;NO. MOVE ON.\r
+ HLLZ B,HBUF+D.EXT(FN) ;CHECK THE EXTENSION\r
+ CAMN B,EXT ;IS IT RIGHT TOO?\r
+ AOJA FN,CPOPJ1 ;YES. GOOD RETURN, ANSWER IS FILE NUMBER IN FN\r
+SCHN2: AOBJN FN,SCHL2 ;COUNT FILE, EXT. CHECK NEXT FILE IN FD\r
+ POPJ P,0 ;FAIL RETURN, NOT FOUND.\r
+\f;SUBROUTINE TO READ NEXT BLOCK OF DATA INTO DBUF\r
+\r
+RDDATA: HLRZ LBN,DBUF+0 ;LINK\r
+ JUMPE LBN,ERROR ;JUMP IF END OF FILE\r
+RDDAT1: MOVEI A,DBUF ;SELECT DATA BUFFER\r
+RDBLK: PUSHJ P,PROCBK ;PROCESS A BLOCK\r
+ CONO DTC,O.READ ;ARGS TO PROCBK\r
+ DATAI DTC,0(A) ; TO CAUSE IT TO READ THE BLOCK\r
+ POPJ P,0 ;SUCCESS. RETURN\r
+\r
+RDDIR: TRNE F,R.DIRI ;IS THE DIRECTORY IN CORE OK?\r
+ POPJ P,0 ;YES. DONT READ IT AGAIN\r
+ MOVEI A,HBUF ;MUST READ. WHERE TO PUT IT.\r
+ MOVEI LBN,DIRBLK ;BLOCK ON TAPE TO READ\r
+ PUSHJ P,RDBLK ;READ IT\r
+ CONO DTC,C.STOP ;STOP TAPE IN CASE OF /F COMMAND\r
+ TRO F,R.DIRI ;HAVE A GOOD DIRECTORY IN CORE NOW\r
+ POPJ P,0 ;RETURN FROM RDDIR\r
+\r
+ZERO: MOVE A,TAPEID ;COPY TAPE NAME IF ANY\r
+ MOVEM A,HBUF+177 ; ..\r
+ TLZN F,L.UPA2 ;WAS ONE THERE?\r
+ PUSHJ P,RDDIR ;NO. GET THE ONE ON TAPE\r
+ SETZM HBUF ;CLEAR OUT REST OF DIR\r
+ MOVE A,[XWD HBUF,HBUF+1] ; ..\r
+ BLT A,HBUF+176 ; ..\r
+ MOVSI A,(<36B4+36B9>) ;ALLOCATE BLOCKS 1 AND 2\r
+ MOVEM A,HBUF+D.BYT+0 ; ..\r
+ MOVSI A,(36B9) ;AND BLOCK 144\r
+ MOVEM A,HBUF+D.BYT+16 ; ..\r
+ HRLOI A,7 ;AND THE NONEXISTENT ONES\r
+ MOVEM A,HBUF+D.BYT+122 ; ..\r
+CLS: PUSHJ P,WRDIR ;WRITE OUT THE DIRECTORY\r
+ JRST REGO1 ;STOP TAPE AND RETURN TO COMMAND SCANNER\r
+\r
+WRDIR: MOVEI LBN,DIRBLK ;BLOCK TO WRITE\r
+ MOVEI A,HBUF ;DATA TO WRITE\r
+ PJRST WRBLK ;WRITE IT\r
+\r
+WRDATA: MOVEI A,DBUF ;WRITE FROM DATA BUFFER\r
+WRBLK: PUSHJ P,PROCBK ;PROCESS THE BLOCK\r
+ CONO DTC,O.WRIT ;ARGS TO PROCBK TO CAUSE IT\r
+ DATAO DTC,0(A) ;TO WRITE THE BLOCK ONTO TAPE\r
+ POPJ P,0 ;RETURN FROM WRBLK\r
+\fPROCBK: PUSHJ P,SEARCH ;ROUTINE TO READ OR WRITE A BLOCK OF TAPE\r
+ ; FIRST FIND THE BLOCK (EITHER DIRECTION)\r
+ MOVEI N,200 ;NUMBER OF WORDS IN A BLOCK\r
+ TLNE F,L.REV ;WHICH WAY WE GOING?\r
+ ADDI A,177 ;BACKWARDS. WRITE FROM TOP OF CORE DOWN\r
+ XCT @0(P) ;CONO WRITE OR READ\r
+ AOS 0(P) ;COUNT ON TO DATAI OR DATAO\r
+PROCLP: CONSZ DTS,S.ERR!S.END ;TROUBLE?\r
+ PUSHJ P,ERROR ;YES. QUIT\r
+ CONSO DTS,S.DAT ;WANT DATA MOVED YET?\r
+ JRST PROCLP ;NO. WAIT SOME MORE.\r
+ XCT @0(P) ;YES. DATAI OR DATAO TO/FROM BUFFER\r
+ ADDI A,1 ;COUNT BUFFER POINTER\r
+ TLNE F,L.REV ;GOING BACKWARDS?\r
+ SUBI A,2 ;YES. THEN COUNT POINTER BACKWARDS TOO\r
+ SOJG N,PROCLP ;TRANSFERRED WHOLE BLOCK?\r
+ CONO DTS,1 ;YES. TELL IT TO DO CHECKSUMMING AND QUIT\r
+ CONSO DTS,S.JOBD ;DONE?\r
+ JRST .-1 ;NOT YET. WAIT.\r
+ JRST CPOPJ1 ;YES. RETURN AFTER THE DATAI/O ARGUMENT\r
+\r
+SEARCH: MOVE C,DEVICE ;GET DRIVE NUMBER\r
+ LSH C,11 ;PUT IN UNIT DIGIT FOR CONO\r
+ CONSZ DTC,C.FWD!C.REV ;TAPE GOING AT THE MOMENT?\r
+ JRST SRCHC ;YES.\r
+ TRO C,C.FWD!C.DSEL ;NO. MAKE IT GO FORWARD\r
+ TLZ F,L.REV ;AND GET THE FLAG TO SAY THAT\r
+SRCHC: CONO DTC,O.SRCH!C.SEL(C) ;MAKE IT SEARCH\r
+SRCHW: CONSZ DTS,S.END ;AT END ZONE?\r
+ JRST SRCHTA ;YES. TURN AROUND.\r
+ CONSZ DTS,S.ERR ;ANY ERRORS?\r
+ PUSHJ P,ERROR ;YES. QUIT.\r
+ CONSO DTS,S.DAT ;BLOCK NUMBER FOUND?\r
+ JRST SRCHW ;NO. WAIT FOR IT\r
+ DATAI DTC,N ;YES. SEE WHAT BLOCK WE ARE AT\r
+ ANDI N,7777 ;JUST FOR SAFETY, MASK JUNK OUT\r
+ SUBI N,0(LBN) ;GET THE DISTANCE TO GO\r
+ JUMPE N,CPOPJ ;IF FOUND, RETURN WITH TAPE ROLLING INTO DESIRED BLK\r
+ TLNE F,L.REV ;NOT THERE. WHICH WAY WE GOING?\r
+ MOVNS N ;BACKWARDS. NEGATE.\r
+ JUMPL N,SEARCH ;IF SHOULD KEEP GOING, ITS MINUS.\r
+SRCHTA: CONO DTC,C.FWD!C.REV ;MUST TURN AROUND (END ZONE OR PASSED)\r
+ TLC F,L.REV ;COMPLEMENT DIRECTION FLAG\r
+ JRST SEARCH ;SEARCH SOME MORE\r
+\fDELETE: PUSHJ P,LOOK ;SEE IF FILE EXISTS ALREADY\r
+ POPJ P,0 ;NO. FAIL RETURN\r
+ SETZB B,HBUF+D.NAM-1(FN) ;FOUND IT. CLEAR NAME\r
+ SETZM HBUF+D.EXT-1(FN) ;AND EXT IN DIRECTORY\r
+ MOVE BP,BYTPTR ;INITIAL BYTE POINTER TO DIRECTORY BYTES\r
+ MOVEI N,MAXBLK ;SEARCH ALL BYTES FOR THIS FILE\r
+ ILDB A,BP ;GET A DIRECTORY BYTE\r
+ CAIN A,0(FN) ;BELONG TO THIS FILE?\r
+ DPB B,BP ;YES. CLEAR IT OUT, ITS FREE NOW\r
+ SOJG N,.-3 ;LOOP FOR WHOLE DIRECTORY\r
+CPOPJ1: AOS 0(P) ;SUCCESSFUL RETURN\r
+CPOPJ: POPJ P,0 ;RETURN.\r
+\r
+KILL: PUSHJ P,DELETE ;REMOVE FILE FROM DIRECTORY\r
+ PUSHJ P,ERROR ;NOT THERE, GIVE A BELL\r
+ JRST CLS ;WRITE DIRECTORY AND RETURN TO CMD SCAN\r
+\r
+ENTR: PUSHJ P,DELETE ;FIRST REMOVE OLD FILE BY THIS NAME\r
+ JFCL ;MAY NOT HAVE BEEN ONE, THATS OK\r
+ MOVSI FN,-NFILES ;SEARCH FOR A FREE SLOT\r
+ SKIPN HBUF+D.NAM(FN) ;SLOT FREE?\r
+ AOJA FN,ENTR1 ;YES. CONVERT RH TO FILE NUMBER, GO USE.\r
+ AOBJN FN,.-2 ;LOOK FOR ANOTHER\r
+ POPJ P,0 ;NONE FREE. WE LOSE.\r
+\fENTR1: MOVEM NAME,HBUF+D.NAM-1(FN) ;STORE THE FILE NAME IN FREE SLOT\r
+ HLLZM EXT,HBUF+D.EXT-1(FN) ;AND THE EXTENSION\r
+ALLOCI: SETZM PRVLBN ;INITIALIZE POINTERS FOR ALLOCATOR\r
+ MOVE BP,BYTPTR ;START HAVING CHECKED BLK 0.\r
+ TLZ F,L.REVA ;NOT REVERSE ALLOCATING\r
+ALLOC: TLZ F,L.TURN ;ALLOCATOR HASNT TURNED AROUND\r
+ MOVE LBN,PRVLBN ;RESTORE PREVIOUS LBN\r
+ALLOCP: TLNE F,L.REVA ;WHICH WAY WE LOOKING?\r
+ JRST ALCN2 ;NEXT BACK\r
+ JRST ALCN1 ;NEXT FORWARD\r
+\fALCL1: ILDB N,BP ;GET A BLOCK BYTE\r
+ JUMPE N,ALLOC1 ;IF ITS FREE, MAY USE IT\r
+ALCN1: CAIGE LBN,MAXBLK ;LOOKED ALL THRU FORWARD?\r
+ AOJA LBN,ALCL1 ;NO. TRY ANOTHER\r
+ALLOCT: TLOE F,L.TURN ;TURN SEARCH AROUND. BETTER NOT BE SECOND TURN\r
+ POPJ P,0 ;LOOKED THRU AND DIDNT FIND ANYTHING. QUIT.\r
+ TLC F,L.REVA ;LOOK THE OTHER WAY\r
+ JRST ALLOCP ;GO SEE WHICH WAY NOW\r
+\r
+ALCL2: ADD BP,[XWD 050000,0] ;MOVE LEFT A BYTE\r
+ SKIPGE BP ;OFF THE END OF THE WORD?\r
+ SUB BP,[XWD 430000,1] ;YES. BACK A WORD, RIGHT 35 BITS\r
+ LDB N,BP ;GET THIS BYTE\r
+ JUMPE N,ALLOC1 ;IF ITS FREE MAY USE IT.\r
+ALCN2: CAILE LBN,1 ;GONE ALL THE WAY TO THE FRONT?\r
+ SOJA LBN,ALCL2 ;NO, LOOK FURTHER\r
+ JRST ALLOCT ;YES. MUST TURN ALLOCATOR AROUND\r
+\r
+ALLOC1: MOVE N,PRVLBN ;HAVE A FREE ONE. WANT IT?\r
+ SUBI N,0(LBN) ;FIND DISTANCE FROM LAST ONE\r
+ MOVMS N ;WHICHEVER DIRECTION\r
+ CAIGE N,BLKFAC ;IS IT FAR ENOUGH AWAY?\r
+ TLNE F,L.TURN ;OR ARE WE TURNING ALLOCATOR AROUND?\r
+ JRST ALLOCY ;YES. USE THIS ONE.\r
+ JRST ALLOCP ;NO. PROCEED TO ANOTHER BLOCK\r
+\r
+ALLOCY: DPB FN,BP ;PUT THIS FILE NUMBER IN THE BLOCK'S BYTE\r
+ MOVEM LBN,PRVLBN ;SAVE AS PREVIOUS BLOCK ALLOCATED\r
+ JRST CPOPJ1 ;AND RETURN WITH LBN SET UP\r
+\f;TTY I/O SUBRS\r
+\r
+ERROR: MOVEI C,207 ;MAKE A BELL, EVEN PARITY\r
+ PUSHJ P,TYO ;TYPE IT OUT\r
+ JRST GO ;AND RESTART.\r
+\r
+CRLF: MOVEI C,215 ;CR, EVEN\r
+ PUSHJ P,TYO ;TYPE IT.\r
+ MOVEI C,12 ;LF, EVEN\r
+TYO: DATAO TTY,C ;SEND OUT CHAR\r
+ CONSZ TTY,20 ;WAIT FOR IDLE\r
+ JRST .-1 ; ..\r
+ POPJ P,0 ;DONE.\r
+\r
+SIXOUT: MOVEI C,0 ;SO DONT SHIFT IN JUNK\r
+ ROTC B,6 ;GET A SIXBIT CHAR IN C\r
+ ADDI C,40 ;MAKE IT ASCII\r
+ PUSHJ P,TYO ;TYPE IT\r
+ JUMPN B,SIXOUT ;IF ANY MORE, TYPE THEM\r
+ POPJ P,0 ;AND RETURN\r
+\f;CONSTANTS AND TEMPS.\r
+\r
+SYSTEM: SIXBIT /SYSTEM/ ;DEFAULT FILENAME\r
+CRASH: SIXBIT /CRASH/ ;DEFAULT DUMP NAME\r
+DBUFP: XWD -177,DBUF+1 ;POINTER TO DATA BLOCK\r
+BLTXWD: XWD 40,41 ;FOR CORE-CLEARING\r
+SIXPTR: XWD 440600,W ;POINTER FOR SIXBIT NAME\r
+BYTPTR: POINT 5,HBUF+D.BYT ;POINTER TO BYTES IN DIRECTORY\r
+SWPTR: POINT 6,SWITCH,5 ;POINTER TO FIRST SWITCH CHARACTER\r
+\r
+LIT\r
+\r
+UU(PDL,PDLL) ;STACK\r
+PDP: XWD -PDLL,PDL-1 ;STACK POINTER\r
+\r
+UU(ZZMAX,0)\r
+\r
+SLOP==576-<.-GO> ;MUST BE POSITIVE IF WANT\r
+ ;THIS TO FIT IN BLKS 0,1,2 OF DTA\r
+ ;THREE BLOCKS INCLUDING HRI BLKI WD AND JRST WD\r
+ END GO\r
+\f
\ No newline at end of file
JRST OUTCHS ;AND OUTPUT IN SCNSRF\r
>\r
IFE FTTTYSER,<\r
-\r
IDPB TAC,DAT ;ADD CHAR TO HALGF DUPLEX OUTPUT STREAM\r
POPJ PDP,\r
>\r
\r
ERREND: END\r
\f\r
-\0
\ No newline at end of file
+\0\r
-;THIS SUB-PROGRAM ASSEMBLED WITH CONFIGURATION DEPENDENT FEATURE SWITCHES - FT40DB.MAC(V003)
- XLIST
-; TH/RC TS3.19 24 SEP 68 V002
-;CONFIGURATION DEPENDENT FEATURE SWITCHES FOR CONDITIONAL ASSEMBLY
-;-1 MEANS INCLUDE THE ASSOCIATED FEATURE, 0 MEANS ELIMINATE IT
-
-FTSWAP=0 ;SWAPPING SYSTEM
- ;IF FTSWAP=-1, THEN FTDISK MUST BE -1
-
-FTDISK=-1 ;DISK SYSTEM(MAY OR MAY NOT HAVE SWAPPING)
- ;IF FTDISK=-1, THEN FTLOGIN MUST BE -1
- ;IF FTSWAP=-1, THEN FTDISK MUST BE -1
-
-FTLOGIN=-1 ;LOGIN-LOGOUT COMMAND AND UUOS
- ;FTDISK=-1 IMPLIES FTLOGIN=-1
-
-FTCCL=-1 ;CONCISE COMMAND LANGUAGE COMMANDS
- ;USED IN APRSER
- ;SHOULD BE 0 IN NON-DISK SYSTEMS
- ;SHOULD BE -1 IN DISK SYSTEMS, WHEN IMPLEMENTED
-
-
-FTRC10=-1 ;NEW PDP-10 DISK(MODEL RC-10) INSTEAD OF DATA PRODUCTS DISK
-
-FTKCT=0 ;ACCUMULATE CORE*RUNNING TIME FOR CHARGING FOR EACH USER
-
-FTPRV=0 ;PRIVILEGE BITS FOR EACH USER
-
-FTGETTAB=0 ;GETTAB UUO - RETURN CONTENTS OF MONITOR JOBTABLES
-
-;LAST PAGE SHOULD BE WRITTEN WITH 'HP' TECO COMMAND SO FORM-FEED IS
-;NOT APPENDED AFTER LIST CAUSING EXTRA BLANK PAGE IN MONITOR LISTING
-
- LIST
+;THIS SUB-PROGRAM ASSEMBLED WITH CONFIGURATION DEPENDENT FEATURE SWITCHES - FT40DB.MAC(V003)\r
+ XLIST\r
+; TH/RC TS3.19 24 SEP 68 V002\r
+;CONFIGURATION DEPENDENT FEATURE SWITCHES FOR CONDITIONAL ASSEMBLY\r
+;-1 MEANS INCLUDE THE ASSOCIATED FEATURE, 0 MEANS ELIMINATE IT\r
+\r
+FTSWAP=0 ;SWAPPING SYSTEM\r
+ ;IF FTSWAP=-1, THEN FTDISK MUST BE -1\r
+\r
+FTDISK=-1 ;DISK SYSTEM(MAY OR MAY NOT HAVE SWAPPING)\r
+ ;IF FTDISK=-1, THEN FTLOGIN MUST BE -1\r
+ ;IF FTSWAP=-1, THEN FTDISK MUST BE -1\r
+\r
+FTLOGIN=-1 ;LOGIN-LOGOUT COMMAND AND UUOS\r
+ ;FTDISK=-1 IMPLIES FTLOGIN=-1\r
+\r
+FTCCL=-1 ;CONCISE COMMAND LANGUAGE COMMANDS\r
+ ;USED IN APRSER\r
+ ;SHOULD BE 0 IN NON-DISK SYSTEMS\r
+ ;SHOULD BE -1 IN DISK SYSTEMS, WHEN IMPLEMENTED\r
+\r
+\r
+FTRC10=-1 ;NEW PDP-10 DISK(MODEL RC-10) INSTEAD OF DATA PRODUCTS DISK\r
+\r
+FTKCT=0 ;ACCUMULATE CORE*RUNNING TIME FOR CHARGING FOR EACH USER\r
+\r
+FTPRV=0 ;PRIVILEGE BITS FOR EACH USER\r
+\r
+FTGETTAB=0 ;GETTAB UUO - RETURN CONTENTS OF MONITOR JOBTABLES\r
+\r
+;LAST PAGE SHOULD BE WRITTEN WITH 'HP' TECO COMMAND SO FORM-FEED IS\r
+;NOT APPENDED AFTER LIST CAUSING EXTRA BLANK PAGE IN MONITOR LISTING\r
+\r
+ LIST\r
-;THIS SUB-PROGRAM ASSEMBLED WITH CONFIGURATION DEPENDENT FEATURE SWITCHES - FT40DD.MAC(V003)
- XLIST
-; TH/RC TS3.19 27 SEP 68 V002
-;CONFIGURATION DEPENDENT FEATURE SWITCHES FOR CONDITIONAL ASSEMBLY
-;-1 MEANS INCLUDE THE ASSOCIATED FEATURE, 0 MEANS ELIMINATE IT
-
-FTSWAP=0 ;SWAPPING SYSTEM
- ;IF FTSWAP=-1, THEN FTDISK MUST BE -1
-
-FTDISK=-1 ;DISK SYSTEM(MAY OR MAY NOT HAVE SWAPPING)
- ;IF FTDISK=-1, THEN FTLOGIN MUST BE -1
- ;IF FTSWAP=-1, THEN FTDISK MUST BE -1
-
-FTLOGIN=-1 ;LOGIN-LOGOUT COMMAND AND UUOS
- ;FTDISK=-1 IMPLIES FTLOGIN=-1
-
-FTCCL=-1 ;CONCISE COMMAND LANGUAGE COMMANDS
- ;USED IN APRSER
- ;SHOULD BE 0 IN NON-DISK SYSTEMS
- ;SHOULD BE -1 IN DISK SYSTEMS, WHEN IMPLEMENTED
-
-FTRC10=0 ;NEW PDP-10 DISK(MODEL RC-10) INSTEAD OF DATA PRODUCTS DISK
-
-FTKCT=0 ;ACCUMULATE CORE*RUNNING TIME FOR CHARGING FOR EACH USER
-
-FTPRV=0 ;PRIVILEGE BITS FOR EACH USER
-
-FTGETTAB=0 ;GETTAB UUO - RETURN CONTENTS OF MONITOR JOBTABLES
-
-;LAST PAGE SHOULD BE WRITTEN WITH 'HP' TECO COMMAND SO FORM-FEED IS
-;NOT APPENDED AFTER LIST CAUSING EXTRA BLANK PAGE IN MONITOR LISTING
-
- LIST
+;THIS SUB-PROGRAM ASSEMBLED WITH CONFIGURATION DEPENDENT FEATURE SWITCHES - FT40DD.MAC(V003)\r
+ XLIST\r
+; TH/RC TS3.19 27 SEP 68 V002\r
+;CONFIGURATION DEPENDENT FEATURE SWITCHES FOR CONDITIONAL ASSEMBLY\r
+;-1 MEANS INCLUDE THE ASSOCIATED FEATURE, 0 MEANS ELIMINATE IT\r
+\r
+FTSWAP=0 ;SWAPPING SYSTEM\r
+ ;IF FTSWAP=-1, THEN FTDISK MUST BE -1\r
+\r
+FTDISK=-1 ;DISK SYSTEM(MAY OR MAY NOT HAVE SWAPPING)\r
+ ;IF FTDISK=-1, THEN FTLOGIN MUST BE -1\r
+ ;IF FTSWAP=-1, THEN FTDISK MUST BE -1\r
+\r
+FTLOGIN=-1 ;LOGIN-LOGOUT COMMAND AND UUOS\r
+ ;FTDISK=-1 IMPLIES FTLOGIN=-1\r
+\r
+FTCCL=-1 ;CONCISE COMMAND LANGUAGE COMMANDS\r
+ ;USED IN APRSER\r
+ ;SHOULD BE 0 IN NON-DISK SYSTEMS\r
+ ;SHOULD BE -1 IN DISK SYSTEMS, WHEN IMPLEMENTED\r
+\r
+FTRC10=0 ;NEW PDP-10 DISK(MODEL RC-10) INSTEAD OF DATA PRODUCTS DISK\r
+\r
+FTKCT=0 ;ACCUMULATE CORE*RUNNING TIME FOR CHARGING FOR EACH USER\r
+\r
+FTPRV=0 ;PRIVILEGE BITS FOR EACH USER\r
+\r
+FTGETTAB=0 ;GETTAB UUO - RETURN CONTENTS OF MONITOR JOBTABLES\r
+\r
+;LAST PAGE SHOULD BE WRITTEN WITH 'HP' TECO COMMAND SO FORM-FEED IS\r
+;NOT APPENDED AFTER LIST CAUSING EXTRA BLANK PAGE IN MONITOR LISTING\r
+\r
+ LIST\r
;NOT APPENDED AFTER LIST CAUSING EXTRA BLANK PAGE IN MONITOR LISTING\r
\r
LIST\r
-\f\r
CONSO APR,NXM ;NON-EXISTENT?\r
SOJG TAC, .-3 ;NO,KEEP LOOKING AS LONG AS NOT TOP OF MEMORY\r
SUBI DAT,700 ;MAKE ROOM FOR TENDUMP AT TOP OF CORE\r
+ JSR MOVSTP ;MOVE DDT SYMBOL TABLE POINTER TO LOWER CORE\r
; (DDTSYM=36) WHERE EXEC DDT EXPECTS IT.\r
; IF NOT ALREADY MOVED THERE. RETURN POINTER IN UUO\r
HLRE TAC1,UUO ;-LENGTH OF S. T.\r
;INITIALIZE DISK\r
\r
EXTERN NULPDL,DSKINI\r
-\r
MOVEI PDP,NULPDL\r
PUSHJ PDP,DSKINI ;INITIALIZE THE DISK\r
; AFTER SETTING UP CHANNEL LOC\r
0 ;LOC 60/61 TRAPPED TO FOR UNIMPLEMENTED OP CODES ON PDP-10\r
;OP CODE 100 IS USED TO DISMISS USER MODE INTERRUPTS(SEE TRPSET UUO)\r
JSR UUO2 ;GO SEE IF OP CODE 100 OR SOME OTHER ONE\r
+\r
\fIFN FT2REL,<\r
;SET LOC TWOREG TO -1 IF MACHINE HAS TWO RELOC REG,0 IF ONLY ONE RELOC REG\r
EXTERN TWOREG,SEGN,SEGPTR,AND2RG,JOBN\r
MOVNI TAC,SEGN ;SET LH OF POINTER TO FIRST SEG IN JBTXX TABLES\r
HRLI TAC,JOBN ;SET RH OF POINTER TO FIRST HIGH SEG\r
;THIS MUST BE DONE HERE BECAUSE SEGPTR APPEARS IN FIRST\r
+\r
; WHICH BUILD FORBITS FROM HAVING EXTERNALS\r
MOVSM TAC,SEGPTR ;POINTER USED FOR AOBJN LOOPS\r
CONO PI,10000 ;CLEAR PI SYSTEM\r
; 2. JUNK JUNK(NON-NEG) S.T.PTR\r
; 3. S.T.PTR S.T.PTR JUNK\r
\r
-;CALL: JSP MOVSTR\r
+;CALL: JSP MOVSTP\r
; RETURN WITH AC UUO SET TO SYMBOL TABLE POINTER\r
;CALLED FROM MANDATORY ONCE ONLY CODE AND 141 START CODE(WHICHEVER OCCURS FIRST)\r
\r
- INTERN MOVSTR\r
+ INTERN MOVSTP\r
EXTERN T30SYM,JOBSYM,DDTSYM,DDTX,SYSDDT\r
\r
-MOVSTR: 0 ;JSR HERE FROM MANDATORY ONCE ONLY CODE AND\r
+MOVSTP: 0 ;JSR HERE FROM MANDATORY ONCE ONLY CODE AND\r
; FIRST JUMP TO EXEC DDT IF BEFORE MONITOR STARTED\r
MOVJMP: JRST .+1 ;PATCHED TO SETUUO AFTER FIRST EXECUTION\r
MOVE UUO,T30SYM ;ASSUME LOADED BY REGULAR 10/30\r
SETUUO: MOVE UUO,DDTSYM ;RETURN THE CORRECT(MAYBEUPDATED IF\r
; EXEC DDT PATCHES MADE BEFORE MONITOR SAVED OR\r
; STARTED) SYMBOL TABLE POINTER\r
- JRST @MOVSTR ;RETURN\r
+ JRST @MOVSTP ;RETURN\r
\r
;HERE IF EXEC DDT IS STARTED UP BEFORE MONITOR(TO MAKE A PATCH FOR EXAMPLE)\r
\r
INTERN PATSYM\r
EXTERN DDTX\r
\r
-PATSYM: JSR MOVSTR ;MOVE DDT SYMBOL TABLE POINTER SO EXEC DDT WILL\r
+PATSYM: JSR MOVSTP ;MOVE DDT SYMBOL TABLE POINTER SO EXEC DDT WILL\r
; FIND IT AND PATCH 141 TO GO DIRECTLY TO EXEC DDT\r
JRST DDTX ;AND GO DIRECTLY TO EXEC DDT\r
\f\r
JRST TIMLOP ;ILLEGAL CHARACTER\r
MOVE TAC,TAC1\r
IDIVI TAC,^D100 ;TAC=HRS.TAC1=MINS\r
-\r
SKIPL TAC ;HRS NEGATIVE?\r
CAILE TAC,^D23 ;OR .G. 23?\r
JRST TIMLOP ;OUT OF BOUNDS\r
MOVEI TAC,2\r
PUSHJ PDP,RADX10 ;NO. SECOND REG EXISTS.\r
PUSHJ PDP,INLMES\r
- ASCIZ /RELOC. REG.\r
+ ASCIZ / RELOC. REG.\r
/\r
PUSHJ PDP,OPOUT\r
>\r
ASCIZ / /\r
HLLZ TAC1,DEVNAM(AC1) ;DEVICE NAME\r
PUSHJ PDP,PRNAME ;PRINT IT\r
- SOJLE UUO,SINGLE ;IS THIS JUST A SIGNLE DEVICE?\r
+ SOJLE UUO,SINGLE ;IS THIS JUST A SINGLE DEVICE?\r
PUSHJ PDP,INLMES ;NO, APPEND 'S TO DEVICE NAME\r
ASCIZ /'S/\r
SINGLE: PUSHJ PDP,CRLF ;PRINT CR LF\r
DELETE: IFN FTTTYSER,< PUSHJ PDP,DCPUTR\r
JRST DELET1>\r
IFE FTTTYSER,<\r
- JUMPE ITEM,DELET1 ;AT BEGINNING OF LINE?>\r
+ JUMPE ITEM,DELET1 ;AT BEGINNING OF LINE?\r
ADD TAC,[XWD 070000,0] ;NO, BACK UP BYTE POINTER\r
TLNE TAC,400000 ;FINISHED THIS WORD YET?\r
ADD TAC,[XWD 347777,-1] ;YES, BACK UP ADDRESS>\r
\r
;MESSAGES\r
\r
-TSEXEC: ASCIZ /MONITOR JUST LOADED\r
+TSEXEC: ASCIZ / MONITOR JUST LOADED\r
/\r
TODATE: ASCIZ /\r
TYPE TODAY'S DATE AS MM-DD-YY\r
\r
IFN FTRC10, <\r
HRRZ TAC,SATPTR\r
-SETS5X: CAIL TAC,SATTOP\r
+SETS5X: CAIL TAC,SATTOP\r
JRST SAT05 ;EXIT FROM DFWUNS BACK TO DSKINI IN DSKSER........\r
ADDI TAC,SENTSZ\r
MOVEI TAC1,411000 ;ON THE NEW PDP-10 DISK SYSTEM SET THE SAT ENTRY\r
POP PDP,LBHIGH ;RESTORE PREVIOUSLY EXISTING VALUE OF THE HIGHEST\r
; LEGAL LOGICAL DISK BLOCK NUMBER.\r
POPJ PDP, ;***SUBROUTINE EXIT***.......\r
-i\r
+\r
\r
CPCT3: POP PDP,TAC\r
CONSZ DSK,NRDY ;NON-EXISTENT DISK?\r
WRLKM1: ASCIZ /DISK BLOCK 0 WRITE ERROR DURING WRITE-LOCK CHECK.\r
/\r
WRLKM2: ASCIZ /"MAINTENANCE SEGMENT" SWITCH MUST BE OFF. AND\r
-DIS WRITE PROTECTION SWITCHES MUST BE SET TO 0000 AND "LESS THAN",\r
+DISK WRITE PROTECTION SWITCHES MUST BE SET TO 0000 AND "LESS THAN",\r
FIX THEM ! !\r
/\r
\f\r
LINE=TAC1 ;SCANNER LINE NUMBER\r
HPOS=ITEM ;HORIZONTAL POSITION OF TTY,(0-71)\r
\r
+\r
;SPECIAL SYMBOLS\r
\r
PION=200 ;TURN PI ON BIT\r
IDLECH=1 ;DELAY CHAR FOR TABS, ETC,\r
; SHOULD BE ^V, BUT FOR 37'S\r
\r
+\r
;BYTE POINTERS\r
\r
+\r
INTERNAL TPCJOBN,TYPX,FULTWX,TYPE,TAKR,BREAKB\r
\r
PHPOS: POINT 7,DEVIAD(DEVDAT),12 ;HORIZONTAL POSITION\r
HLLM TAC,LINTAB(TAC1) ;LEAVING REST OF BITS AS THEY WERE\r
AOBJN TAC1,SCN2\r
POPJ PDP,\r
+\r
\f;ROUTINES TO SET UP BUFFERS\r
\r
INTERNAL TSETBF,SETBFI,PUTCHI\r
MOVEM TAC,PCTR(DAT)\r
HLRZ TAC,BUF(DAT) ;CHARACTER COUNT\r
MOVEM TAC,FCTR(DAT) ;UPDATE FREE CHARACTER COUNT\r
+ POPJ PDP,\r
\r
;ROUTINE TO PUT A CHARACTER INTO A BUFFER (FOR INPUT,MERTPO, AND ONCE)\r
;CALL MOVEI DAT,TTYBUF(DDB) ;TO SPECIFY BUFFER\r
PUTCI0: AOS FCTR(DAT) ;READJUST FREE COUNTER\r
POPJ PDP,\r
\r
+\r
;ROUTINE TO PLACE A CHARACTER INTO THE OUTPUT BUFFER\r
;CALLED AT INTERRUPT LEVEL\r
;CALL MOVE CHREC,CHARACTER TO PLACE INTO BUFFER\r
DDT5: MOVSI IOS,IO+DDTM\r
IORB IOS,DEVIOS(DDB)\r
HRLI UUO,PROG ;POINT TO USER AC\r
- HRRI UUO,-1(PROG) ;COMPENSATE FOR GETWD1\r
+ HRRI UUO,-1(UUO) ;COMPENSATE FOR GETWD1\r
DDT2: MOVE DAT,[XWD 440700,TAC] ;BYTE POINTER TO TAC\r
PUSHJ PDP,GETWD1 ;GET THE USER'S WORD\r
DDT3: TLNN DAT,760000 ;ANY CHARS LEFT?\r
;TO ADJUST HPOS FOR OUTPUT OF CHREC\r
;SKIPS IF SPCHECK SAYS SPECIAL CHAR\r
\r
-ADJHP: CAIL CHREC,174 ;HIGH SPECIALS?\r
+ADJHP: CAILE CHREC,174 ;HIGH SPECIALS?\r
JRST SPCHEK ;YES, NO HPOS MOTION\r
CAIL CHREC,40 ;CONTROL CHARACTERS?\r
AOJA HPOS,SPCHEK ;NO. COUNT HPOS FOR PRINT CHAR\r
EXTERNAL JOB\r
\r
\r
+\r
TTYFNU: MOVE ITEM,JOB\r
TTYFND: PUSHJ PDP,TTYSRC\r
TTYDAT: MOVEI DAT,TTOBUF(DDB)\r
POPJ PDP,\r
\r
+\r
;PUT JOB IN IO WAIT IF TTY BUFFER NOT EMPTY\r
;CALLED BY NON ERROR MESSAGE ROUTINES AT UUO LEVEL\r
\r
POPJ PDP,\r
MOVE IOS,DEVIOS(DEVDAT) ;IS TTY IN MONITOR MODE AND LEFT HAND MARGIN?\r
MOVE TAC1,-3(PDP) ;TTY GIVING TALK COMMAND\r
-\r
MOVE TAC1,DEVNAM(TAC1) ;ITS NAME\r
MOVE TAC,DEVNAM(DEVDAT) ;OPR IS NEVER TOO BUSY...\r
CAME TAC1,DEVOPR ;EITHER ONE OPR?\r
;OTHERWISE, DDB ONLY USED TO TYPE A\r
JRST TTYKIL ;MESSAGE; KILL TTY DDB\r
\r
-\r
XMTIN2: CONO PI,PION\r
PUSHJ PDP,GETCHR ;NO, GET NEXT CHAR. IN BUFFER\r
JUMPE CHREC,XMTIN1 ;IGNORE NULLS\r
AOJDPX: AOJA HPOS,DUPLX1 ;OUTPUT AND COUNT HPOS\r
\r
RUBOU1: TLZE LINE,ROBTPD ;END OF INPUT STREAM REACHED\r
- \r
PUSHJ PDP,BSECHO ;OUTPUT A BACKSLASH\r
JRST CRLFEC ;AND A CR LF\r
\r
TRNE TAC,17 ;DONE YET?\r
SOJA TAC,.-2 ;NO. OUTPUT MORE\r
POPJ PDP,0 ;DONE\r
+\r
\fSIMFF: TLO TAC,ECHSUP ;DON'T OUTPUT FF OR VT TO A 33\r
PUSHJ PDP,TTIPUT ;PUT IT IN BUFFER\r
MOVEI CHREC,12 ;SIMULATE WITH LF'S\r
HLRZ DEVDAT,DEVSER(DEVDAT) ;CHAIN THRU DDBS\r
TDNE TAC,DEVMOD(DEVDAT) ;USE,ATTACH OR ASSIGN BITS ON?\r
AOBJN IOS,.-2 ;YES. DONE?\r
-\r
JUMPGE IOS,CPOPJ ;YES. DEVICE DATA BLOCK FOUND?\r
MOVSI TAC,TOIP ;CLEAR TOIP IN DDB\r
ANDCAM TAC,TTYPTR(DDB) ;IN CASE OF PREVIOUS DETACH\r