--- /dev/null
+TITLE CLKCSS - SCHEDULING ALOGRITHM FOR NON-SWAPPING SYSTEMS\r
+SUBTTL T. HASTINGS/TH TS3.17 6 SEP 67 V001\r
+XP VOLKCS,001\r
+ ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+;SCHEDULING ALGORITHM IS:\r
+;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
+; CURRENT JOB WHILE IT WAS IN EXEC MODE\r
+; 5. AND ERROR OCCURRED IN CURRENT JOB\r
+\r
+;CALL: SETOM TIMEF ;IF CLOCK HAS GONE OFF SINCE LAST CALL\r
+; PUSHJ PDP,NXTJOB\r
+; RETURN WITH NEXT JOB TO RUN IN AC ITEM\r
+\r
+;INTIALIZE SCHEDULER(CALLED FROM IOINI1 BEFORE ALL OTHER\r
+; DEVICES ARE INITIALIZED)\r
+\r
+INTERNAL NXTINI\r
+\r
+NXTINI: MOVSI TAC,-NQUEUE ;NO. OF QUEUES\r
+ SETZM AVALTB(TAC) ;CLEAR SHARABLE DEVICE AVAILABLE FLAGS\r
+ SETOM REQTAB(TAC) ;SET SHARABLE DEVICE REQUEST COUNT TO -1\r
+ ;IE NO JOB WAITING OR USING DEVICE\r
+ AOBJN TAC,.-2 ;OTHER DEVICE INITIALIZATION\r
+ POPJ PDP, ;MAY CHOOSE TO SET REQUEST TO MORE\r
+ ;NEG. VALUE IF MORE THEN ON JOB CAN\r
+ ;USE DEVICE AT ONCE\r
+\f\r
+INTERNAL NXTJOB\r
+INTERNAL FTTRPSET,FTDISK\r
+EXTERNAL JOB,TIMEF,JBTSTS,JOBMAX,JOBN,PJBSTS,CPOPJ,CHKSHF\r
+ENTRY XCKCSS\r
+\r
+T=TAC ;TEMPORARY\r
+Q=TAC1 ;QUEUE NO.\r
+Q1=DEVDAT ;QUEUE NO. SHIFTED TO MATCHING POS. OF JBTSTS WORD\r
+C=DAT ;COUNT OF JOB LEFT TO SCAN\r
+\r
+XCKCSS:\r
+NXTJOB: PUSHJ PDP,CHKSHF ;SHUFFLE CORE IF NEEDED\r
+ SETZM T\r
+ SKIPN ITEM,JOB ;CURRENT JOB NO.. IS IT NULL JOB?\r
+ JRST NXT0 ;YES, DO NOT DECREMENT QUANTUM RUN TIME\r
+ SKIPE TIMEF ;NO, IS THIS A CLOCK INTERRUPT CALL?\r
+ SOSA T,JBTSTS(ITEM) ;YES, DECREMENT QUANTUM RUN TIME\r
+ ;IN JOB STATUS WORD\r
+ SKIPA T,JBTSTS(ITEM) ;NO, JUST PICKUP STATUS WORD\r
+ TRNE T,-1 ;REDUCE TIME TO ZERO YET?\r
+ JRST NXT1 ;NO\r
+ HRR T,RNQUNT ;YES, RESET FOR RUN QUEUE QUANTUM\r
+NXT0: SETOM RNAVAL ;FLAG TO SCAN RUN QUEUE FOR DIFFERENT JOB\r
+NXT1: HRRM T,JBTSTS(ITEM) ;STORE MODIFIED QUANTUM RUN TIME\r
+ MOVEI Q,MAXQ ;HIGHEST PRIORITY QUEUE SCANNED FIRST\r
+NXT2: SKIPN AVALTB(Q) ;SHOULD THIS QUEUE BE SCANNED FOR A RUNABLE JOB?\r
+NXT3: SOJGE Q,NXT2 ;NO, LOOK AT NEXT LOWEST PRIORITY QUEUE\r
+ JUMPL Q,NXT7 ;YES, LOOKED AT QUEUES NQUEUE-1..,0?\r
+ MOVE Q1,Q ;MOVE QUEUE INDEX TO PROPER POS.\r
+ ROT Q1,^D17-JWPOS ;TO MATCH JOB STATUS WORD\r
+ MOVEI C,JOBMAX ;NO, SACN ALL JOBS(EXECEPT NULL JOB)\r
+ AOSA ITEM,JOBP(Q) ;SCAN ALL OTHER JOBS IN THIS QUEUE FIRST\r
+\r
+NXT4: SETOM RNAVAL ;FLAG RUN QUEUE BEING SCANNED\r
+\r
+NXT5: CAIL ITEM,JOBN ;GREATER THEN HIGHEST JOB NO.?\r
+ MOVEI ITEM,1 ;YES, RESET TO 1(SKIP NULL JOB)\r
+ HLRZ T,JBTSTS(ITEM) ;IS JOB RUNABLE?\r
+ TRZ T,RUNMSK+CMWB ;MASK OUT JOB STATUS BITS WHICH DO NOT MATTER\r
+ CAIN T,RUNABLE(Q1) ;ADD IN QUEUE NO. IN PROPER POSITION\r
+ JRST NXT8 ;YES, IT IS RUNABLE AND IS IN THIS QUEUE\r
+NXT6: SOJLE C,NXT3 ;NO IT IS NOT, SCANNED ALL JOBS YET?\r
+ AOJA ITEM,NXT5 ;NO, LOOK AT NEXT JOB\r
+\f\r
+;HERE IF NO JOBS FOUND TO RUN(Q=-1)\r
+\r
+NXT7: MOVEI C,JOBN ;SCAN ALL JOBS INCLUDING POSSIBLY NULL JOB\r
+ MOVE ITEM,JOB ;STARTING WITH LAST JOB TO RUN\r
+ SKIPN Q1,RNAVAL ;HAS RUN QUEUE(Q,Q1=7) BEEN SCANNED?\r
+ AOJA Q,NXT4 ;NO, FLAG THAT IS HAS AND SCAN RUN QUEUE(Q,Q1=2)\r
+ SETZB ITEM,RNAVAL ;YES, CLEAR FLAG, SET NULL JOB TO RUN\r
+ POPJ PDP, ;RETURN\r
+\r
+NXT8:\r
+IFN FTTRPSET,<\r
+ EXTERNAL STOPTS\r
+ MOVE T,STOPTS ;HAS A TRPSET UUO BEEN DONE FOR JOB1\r
+ ;WITH NON ZERO AC?\r
+ CAIE ITEM,1 ;IS THIS JOB 1?\r
+ JUMPN T,NXT6 ;KEEP LOOKING IF NOT JOB1 AND\r
+ ;STOPTS FLAG SET\r
+>\r
+\r
+ CAIE Q,TSQ ;IS THIS TTY WAIT SATISFIED Q?\r
+ CAIN Q,WSQ ;IS THIS IO WAIT SATISFIED QUEUE?\r
+ SOSGE AVALTB(Q) ;YES, DECREMENT COUNT OF JOBS WITH SATISFIED IO\r
+ SETZM AVALTB(Q) ;NO, CLEAR AVAILABLE FLAG FOR THIS QUEUE\r
+ MOVEM ITEM,JOBP(Q) ;SAVE JOB NUMBER FOR THIS QUEUE FOR NEXT TIME\r
+ JUMPE Q,CPOPJ ;IS THIS RUN QUEUE?\r
+ MOVEI T,RNQ ;NO, SET STATE CODE TO RUN\r
+ DPB T,PJBSTS ;CLEAR WAIT CODE(SO HE WILL BE IN RUN QUEUE)\r
+ MOVE T,QUANTS(Q) ;SET QUANTUM RUNNING TIME FOR QUEUE\r
+ HRRM T,JBTSTS(ITEM) ;WHICH JOB HAS JUST LEFT\r
+ POPJ PDP, ;RETURN\r
+\f\r
+INTERNAL FTCHECK,FTMONP\r
+\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL JOBP,AVALTB,REQTAB,QUANTS\r
+\r
+DEFINE X(A,B)\r
+< EXTERNAL A'AVAL,A'REQ,A'QUNT\r
+ INTERNAL A'Q\r
+ A'Q=ZZ\r
+ ZZ=ZZ+1\r
+>\r
+ ZZ=0\r
+ QUEUES\r
+ LOC=ZZ\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+;APPROPRIATE ENTRY IS NON-ZERO WHEN SCHEDULER SHOULD LOOK\r
+;AT THAT QUEUE TO FIND A JOB TO RUN\r
+;WSAVAL CONTAINS THE NO. OF JOBS WITH IO WAIT SATISFIED(0=NONE)\r
+;SIMILARLY FOR TSAVAL\r
+\r
+DEFINE X(A,B)\r
+< INTERNAL A'AVAL,A'Q\r
+ A'Q=.-AVALTB\r
+ A'AVAL: 0\r
+>\r
+\r
+INTERNAL AVALTB\r
+\r
+AVALTB: QUEUES ;GENERATE THE AVAL FLAGS\r
+LOC=.-AVALTB\r
+>\r
+\r
+NQUEUE=LOC ;NO. OF QUEUES COUNTING RUN QUEUE\r
+XP MAXQ,NQUEUE-1 ;MAX STATE CODE WHICH HAS A QUEUE\r
+\r
+;DEFINE STATE CODES WHICH DO NOT HAVE QUEUES ASSOCIATED WITH THEM\r
+\r
+\r
+DEFINE X(A)\r
+< INTERNAL A'Q\r
+ A'Q=LOC\r
+ LOC=LOC+1\r
+>\r
+\f\r
+ CODES\r
+\f\r
+IFE FTCHECK+FTMONP,<\r
+;LAST JOB SCHEDULED FOR EACH QUEUE\r
+\r
+JOBP: REPEAT NQUEUE,< EXP 1>\r
+\f\r
+;SHARABLE DEVICE REQUEST TABLE(GENERAL;IZED FOR OTHER QUEUES TOO)\r
+;CONTAINS THE NUMBER OF JOBS WAITING TO USE SHARABLE DEVICE\r
+;WSREG AND RNREG ARE UNUSED\r
+\r
+DEFINE X(A,B)\r
+< A'REQ: 0\r
+ INTERNAL A'REQ\r
+>\r
+\r
+INTERNAL REQTAB\r
+\r
+REQTAB: QUEUES\r
+\f\r
+;QUANTUM RUNNING TIME FOR EACH QUEUE IN JIFFIES(CLOCK TICKS)\r
+\r
+DEFINE X(A,B)\r
+< A'QUNT: EXP 2\r
+ INTERNAL A'QUNT\r
+>\r
+QUANTS: QUEUES\r
+>\r
+ END,\r
--- /dev/null
+TITLE CLOCK1 - CLOCK, CONTEXT SWITCHING, AND JOB STARTING AND STOP ROUTINES - V412\r
+SUBTTL APRINT TH/TH/CHW TS 20 MAY 69\r
+XP VCLOCK1,412\r
+ ; PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+ ENTRY CLOCK1 ;ALWAYS LOAD CLOCK1 IF LIBRARY SEARCH\r
+CLOCK1:\r
+\r
+;THIS SERVICE ROUTINE RUNS ON A HIGH PRIORITY CHANNEL\r
+;AND REQUESTS INTERRUPTS ON LOWER CLK CHANNEL\r
+;FOR SCHEDULING JOBS AND ERROR HANDLING THAT THE USER\r
+;IS NOT ENABLED TO HANDLE HIMSELF\r
+\r
+EXTERNAL TIME,TIMEF,CLKFLG,REQCLK,APRCHL,APRPC,UPTIME\r
+EXTERNAL JOBDAT,JOBTPC,JOBCNI,JOBAPR,APRERR,SCHEDF\r
+\r
+EXTERNAL APRILM,COMMAN,CONMES,DEVCHK,DEVSRC,ERROR,INLMES\r
+EXTERNAL RELEA9,CRSHWD,CRASHX\r
+\r
+INTERNAL FTTTYSER ;THIS ROUTINE MAY BE ASSEMBLED TO WORD EITHER\r
+ ; THE OLD SCNSER OR THE NEW TTYSER.\r
+\r
+INTERNAL FTCHECK,FTMONP\r
+\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL DATA,APRCON,APRIN1,CLKS17,DAMESS,UUO0,CLOCK\r
+INTERNAL UUO1\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+ INTERN CLOCK,DAMESS\r
+ EXTERN CIPWTM\r
+APRCON: 231000 ;MONITOR ENABLED CPU FLAGS\r
+APRIN1: 0 ;USER ENABLED CPU FLAGS\r
+CLKS17: 0 ;PLACE TO SAVE AC17 ON CLOCK INTERRUPT\r
+DAMESS: ASCIZ /-JAN-/\r
+\r
+CLOCK: POINT 36,CIPWTM,35 ;BYTE POINTER TO CLOCK REQ QUEUE\r
+>\r
+\f\r
+ INTERN APRINT\r
+\r
+APRINT: JRST APRPAR ;ALWAYS CHECK APR AND PI DEVICES\r
+ JRST . ;CHECK OTHER DEVICES\r
+\r
+APRPCL: CONO PI,240000 ;TURN OFF MEM PAR, ERR, AND\r
+ ; ENABLE FOR MEM PAR AND TRY AGAIN\r
+ ; (DO NOT TURN OFF POWR FAIL AS THAT PERMANENTLY\r
+ ; DISABLES POWR FAIL INTERRUPT)\r
+APRPAR: CONSZ PI,600000 ;MEM PARITY ERROR OR POWER FAILURE?\r
+ HALT APRPCL ;YES, HALT MACHINE, CLEAR FLAGS AND TRY AGAIN\r
+ ; ON CONTINUE\r
+ CONSO APR,@APRCON ;INTERRUPT FOR APR?\r
+ ; ALWAYS AT LEAST FOR CLOCK,ILM,NXM,PD OVF\r
+ ; RH MODIFIED EACH TIME USER RUNS IN CASE HE IS\r
+ ; ENABLED FOR PC CHANGE OR AR OVF\r
+ JRST APRINT+1 ;NO,CHECK OTHER DEVICES ON THIS PI CHANNEL\r
+ SKIPE CRSHWD ;IS LOC, 30 CLOBBERED?\r
+ JRST CRASHX ;YES ~ GO SAVE AC'S & STATE OF ALL DEVS,\r
+ CONSO APR,001000 ;YES, IS IT CLOCK?\r
+ JRST APRER ;NO, GO CHECK ERROR FLAGS\r
+ AOS TIME ;YES, INCREMENT TIME OF DAY\r
+ AOS UPTIME ;UPTIME IS LOADED AS ZERO,AND IS NEVER CLEARED\r
+ SETOM TIMEF ;FLAG THAT APR CLOCK HAS TICKED\r
+ SETOM CLKFLG ;SET FLAG FOR CLK FORCED 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
+ CONO APR,1000+APRCHN ;NO, CLEAR ONLY THE CLOCK FLAG\r
+ JEN @APRCHL ;DISMISS INTERRUPT\r
+\r
+;HERE ON CLOCK FLAG AND IT OR SOME OTHER FLAG IS ON WHICH USERS WANTS\r
+\r
+APRER1: CONO APR,1000+APRCHN ;NOW CLEAR CLOCK FLAG\r
+ EXCH TAC,APRCHL ;SAVE TAC, GET PC\r
+ TLNE TAC,USRMOD ;IS PC FROM USER MODE?\r
+ JRST APRER4 ;YES, GO TRAP TO HIM\r
+ JRST APRER2 ;NO. GO CHECK IN CASE ALSO A SERIOUS ERROR\r
+\f\r
+;OTHER APR INTERRUPTS BESIDES CLOCK\r
+\r
+APRER: EXCH TAC,APRCHL ;SAVE TAC, GET PC\r
+ TLNE TAC,USRMOD ;IS PC IN USER MODE?\r
+ CONSO APR,@APRIN1 ;YES, IS USER ENABLED FOR THIS ERROR\r
+ JRST APRER2 ;NO, PRINT ERROR MESSAGE AND STOP JOB\r
+APRER4: EXCH JDAT,JOBDAT ;YES, SAVE JDAT, GET CURRENT JOB DATA AREA ADR.\r
+ MOVEM TAC,JOBTPC(JDAT) ;STORE PC IN JOB DATA AREA\r
+\r
+ CONI APR,JOBCNI(JDAT) ;STORE APR IN JOB DATA AREA\r
+ HLLZS JOBENB(JDAT) ;CLEAR SOFTWARE FLAGS SO THAT USER MUST DO\r
+ ; ANOTHER APRENB UUO IN ORDER TO ENABLE TRAPS\r
+ SETZM APRIN1 ;ALSO CLEAR USER APR CONSO FLAGS\r
+ HRRI TAC,231000 ;AND SET MONITOR TO LOOK ONLY FOR\r
+ HRRM TAC,APRCON ;PD OVF,ILM,NXM, AND CLOCK\r
+ HRR TAC,JOBAPR(JDAT) ;GET USER LOC TO TRAP TO\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
+ CONO APR,430110+APRCHN ;CLEAR ALL ERROR FLAGS WHICH CAN CAUSE INTERRUPTS\r
+ ; EXCEPT CLOCK FLAG(ELSE LOSE TIME OF DAY)\r
+ JEN @APRCHL ;DISMISS INTERRUPT\r
+\f\r
+APRER2: CONSO APR,NXM!ILM!POV! ;DOES EXEC CARE?\r
+ JRST APRER3 ;NO. IGNORE EXEC OVERFLOW (MUST BE FOV OR AROVF\r
+ MOVEM TAC,APRPC ;STORE ERROR PC FOR CLK CHANNEL\r
+ CONI APR,APRERR ;STORE ERROR FLAGS\r
+ ; (ALSO USED AS ERROR FLAG)\r
+ SETOM CLKFLG ;SET FLAG FOR CLK INTERRUPT\r
+ SETOM SCHEDF ;FLAG THAT RESCHEDULING IS NEEDED\r
+ ; (EVEN THROUGH PC MAY BE IN EXEC MODE)\r
+ CONO PI,REQCLK ;REQUEST INTERRUPT IN CLK CHANNEL\r
+ CONSZ APR,ILM ;WAS ERROR ILLEGAL MEMORY(FROM USER)?\r
+ HRRI TAC,0 ;YES,CLEAR RH OF PC,SO A SECOND ILM INTERRUPT\r
+ ; WILL NOT OCCUR IF THIS IS A WILD(AND A PDP-10)\r
+IFN FTHALT,<\r
+ CONSZ PI,003400 ;ARE ANY PI'S IN PROGRESS OF LOWER PRIORITY THAN APR?\r
+ ; (PDP-10 BITS ONLY)\r
+ HALT .+1 ;YES, HALT SO CONTINUE WILL TRY TO RECOVER\r
+>\r
+ JRST APRER3 ;NO,MUST BE UUO LEVEL(OR USER MODE AND\r
+ ; MEMORY DROPPED OUT)\r
+\f\r
+SUBTTL CLOCK - LOW PRIORITY CLOCK SERVICE(CLK)\r
+\r
+;THIS ROUTINE RUNS ON THE LOWEST PRIORITY PI CHANNEL AND AT UUO LEVEL\r
+;TO CAUSE AN INTERRUPT ON CLK CHANNEL:\r
+; SETOM CLKFLG ;FLAG THAT INTERRUPT HAS BEEN REQUESTED\r
+; CONO PI,CLKREQ ;REQUEST PI INTERRUPT ON LOWEST PI CHANNEL\r
+;THE FOLLOWING OTHER FLAGS MUST ALSO BE SET\r
+;APRERR-APR DETECTED ERROR IN CURRENT JOB\r
+;SCHEDF-RESCHEDULING MUST TAKE PLACE(EVEN THROUGH PC IN EXEC MODE)\r
+;TIMEF-APR CLOCK HAS TICKED ON HIGH PRIORITY CHANNEL\r
+;SEE APRSER AND RUNCSS TO SEE HOW THIS ROUTINE IS CALLED\r
+\r
+;CLK SERVICE PERFORMS THE FOLLOWING ON A REGULAR BASIS:\r
+;PROCESSES CLOCK QUEUE REQUESTS\r
+;CALLS CONSOLE MONITOR COMMAND DECODER\r
+;CALLS CORE SHUFFLER\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
+;THEN CLK SERVICE IS ENTERED AT THE UU0 LEVEL\r
+\r
+STOR=DAT\r
+T=TAC\r
+T1=TAC1\r
+JA=JDAT\r
+\r
+;THE CLOCK REQUEST QUEUE PROVIDES THE REST OF THE MONITOR\r
+;WITH THE ABILITY TO BE TRAPPED TO AFTER A NUMBER OF CLOCK TICKS\r
+;HAVE OCCURRED\r
+\r
+;TO MAKE A REQUEST:\r
+; CONO PI,PIOFF\r
+; IDPB AC,CLOCK ;STORE CLOCK REQUEST IN QUEUE\r
+; CONO PI,PION ;TURN PI BACK ON\r
+;C(AC)=XWD ADDRESS,NO. OF CLOCK TICKS*DATA*10000\r
+;WHERE DATA IS 6 BITS OF INFO NEEDED WHEN TIME RUNS OUT\r
+;CLK SERVICE WILL PUSHJ PDP,ADR\r
+;WHEN TIME RUNS OUT WITH DATA RIGHT JUSTIFIED IN AC TAC\r
+;ALL ACS ARE FREE TO USE WHEN CALL IS MADE\r
+\r
+INTERNAL CLKINI\r
+EXTERNAL CIPWTM1,PION,PIOFF\r
+\r
+CLKINI: MOVEI TAC,CIPWTM1 ;SETUP CLOCK QUEUE BYTE POINTER\r
+ HRRM TAC,CLOCK ;LH NEVER CHANGES(36 BIT BYTE)\r
+ POPJ PDP,\r
+\f\r
+;HERE AT UUO LEVEL WHEN JOB GOES INTO IO WAIT OR SHARABLE DEVICE WAIT\r
+;CALL: PUSHJ PDP,WSCHED\r
+; RETURN HERE WHEN RUNABLE AGAIN\r
+\r
+INTERNAL WSCHED\r
+EXTERNAL JOBD14,JOBDAC,USRPC,JOBD16,NULPDL\r
+\r
+WSCHED: POP PDP,USRPC ;SAVE PC IN PROTECTED PART OF SYSTEM DATA\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
+ JRST RSCHED ;GO RESCHEDULE\r
+\r
+;HERE AT UUO LEVEL WHEN CURRENT JOB RETURNS TO USER MODE\r
+;FROM A UUO CALL AND EITHER:\r
+; 1. CURRENT JOB TYPED CONTROL C WHILE IN EXEC MODE\r
+; 2. CLOCK FLAG WENT OFF WHILE CURRENT JOB WAS\r
+; IN EXEC MODE\r
+\r
+;CALL: PUSHJ PDP,USCHED ;FROM UUOCON(UUO HANDLER RETURN TO USER)\r
+; RETURN HERE WHEN RUNABLE\r
+\r
+INTERNAL USCHED\r
+EXTERNAL JOBDPG,JOBDPD,USRPC\r
+\r
+USCHED: POP PDP,USRPC ;SAVE PC IN PROTECTED PART OF SYSTEM DATA\r
+ MOVEM PROG,JOBDPG(PROG) ;SAVE PROG IN DUMP AC AREA\r
+ MOVEM PDP,JOBDPD(PROG) ;SAVE PDP\r
+ JRST RSCHED ;GO RESCHEDULE\r
+\f\r
+;HERE AT CLK INTERRUPT LEVEL\r
+\r
+INTERNAL CLKINT\r
+INTERNAL FTTIME\r
+EXTERNAL CLKFLG,JOBD17,CLKCHL,SCHEDF,JOBADR,JOBD16,JOBDAC\r
+EXTERNAL JOBD15,JOBPD1,MJOBP1,APRERR,NULDAT,NULPDL\r
+\r
+CLKINT: SKIPN CLKFLG ;CLK INTERRUPT REQUEST?\r
+ JRST CLKINT ;NO, CHECK OTHER DEVICES\r
+ MOVEM 17,CLKS17 ;SAVE AC 17\r
+ MOVE 17,CLKCHL ;IS CURRENT JOB IN USER MODE?\r
+ TLNN 17,USRMOD\r
+ SKIPE SCHEDF ;NO, IS THIS A FORSCED RESCHEDULING INTERRUPT?\r
+ JRST SAVPC ;YES, IT IS OK TO RESCHEDULE NOW\r
+ MOVE 17,CLKS17 ;NO, LEAVE TIMEF SET AND DISMISS INT.\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
+ ; RUNS AT UUO LEVEL,REQUESTS CLK INT. TO STOP\r
+ MOVEM 16,JOBD16(17) ;SAVE AC 16 IN DUMP AC PART OF JOB DATA AREA\r
+ MOVEI 16,JOBDAC(17) ;SOURCE=0,DESTINATION=DUMP AC 0\r
+ BLT 16,JOBD15(17) ;SAVE ACS 0-15 JUST BELOW AC 16\r
+ MOVE TAC,CLKS17 ;NOW SAVE 17 IN JOB DATA AREA\r
+ MOVEM TAC,JOBD17(17) ;ALONE WITH OTHER ACS\r
+ MOVEI PDP,NULPDL ;SET UP PUSH DOWN LIST IN NULL JOB DATA\r
+ ; AREA IN LOWER CORE\r
+ HRLI PDP,MJOBP1 ;-LENGTH+1(LEAVE ROOM FOR UUO PC)\r
+ SKIPE TAC,APRERR ;IT THIS AN ERROR INTERRUPT?\r
+ PUSHJ PDP,APRILM ;YES, GO PROCESS ERROR, APRILM WILL CLEAR APRERR\r
+ ; FLAG IMMEDIATELY\r
+\f\r
+EXTERNAL COMCNT,NXTJOB,HNGTIM,POTLST,LSTWRD\r
+EXTERNAL TIMEF,APRERR,CLKFLG,SCHEDF,JDB,PMONTB\r
+\r
+RSCHED: SKIPN TIMEF ;HAS CLOCK GONE OFF SINCE LAST CALL?\r
+ JRST CIP6 ;NO, JUST RESCHEDULE\r
+\r
+;TIME ACCOUNTING\r
+\r
+EXTERNAL TIME,MIDNIT,THSDAT,MONTAB\r
+\r
+IFN FTTIME,<\r
+ EXTERNAL RTIME,TTIME,JOB\r
+ SKIPN ITEM,JOB ;WAS LAST JOB NULL JOB?\r
+ SKIPN POTLST ;YES-WAS IT A LOST TICK?\r
+ JRST INCTIM ;NO-PROCEED NORMALLY\r
+ AOS LSTWRD ;YES-INCREMENT LOST TIME COUNT\r
+ SETZM POTLST ;AND CLEAR LOST TICK INDICATION\r
+INCTIM: AOS RTIME(ITEM) ;INCR, CURRENT JOB INCREMENTAL RUN TIME\r
+ AOS TTIME(ITEM) ;INCR, CURRENT JOB TOTAL RUN TIME\r
+>\r
+IFN FTKCT,<\r
+ EXTERN USRREL,JBTKCT\r
+ LDB TAC,[POINT 8,USRREL,25] ;GET NO. OF 1K BLOCKS-1FOR CURRENT USER\r
+ ADDI TAC,1 ;MAKE IT NO. OF 1K BLOCKS\r
+ ADDM TAC,JBTKCT(ITEM) ;ADD IN ACCUMULATED CORE RUNNING TIME PRODUCT\r
+ ; (KILO-CORE TICKS)\r
+\r
+IFN FT2REL,<\r
+ EXTERN CHGHGH\r
+ PUSHJ PDP,CHGHGH ;CHARGE USER FOR HIGH SEGMENT IF HE HAS ONE\r
+>\r
+>\r
+;MIDNITE CHECK\r
+\r
+ MOVE TAC1,TIME\r
+ CAMGE TAC1,MIDNIT ;GONE PAST MIDNITE?\r
+ JRST CIP2 ;NO\r
+CIP3: SETZB IOS,TIME ;YES, RESET TIME OF DAY\r
+ AOS TAC,THSDAT ;UPDATE DAY\r
+ IDIVI TAC,^D31\r
+ DIVI IOS,^D12 ;NO.\r
+ LDB TAC,PMONTB\r
+ CAMGE TAC,TAC1 ;END OF MONTH?\r
+ JRST CIP3 ;YES.\r
+\f\r
+;PROCESS TIMING REQUESTS STORED IN QUEUE\r
+\r
+CIP2: HRRZ STOR,CLOCK ;GET END OF LIST\r
+CIP4: CAIN STOR,CIPWTM1 ;END YET?\r
+ JRST CIP5 ;YES\r
+ SOS TAC1, (STOR) ;DECREMENT TIMING REQUEST\r
+ TRNE TAC1, 7777 ;TIME EXPIRED YET\r
+ SOJA STOR, CIP4 ;NO, CONTINUE SCAN\r
+ CONO PI, PIOFF ;YES, MOVE LAST ITEM IN LIST TO THIS\r
+ MOVE TAC, @CLOCK\r
+ SOS CLOCK\r
+ MOVEM TAC, (STOR)\r
+ CONI PI,PION\r
+ LDB TAC, [POINT 6, TAC1, 23] ;GET 6 BIT DATA ITEM\r
+ MOVSS TAC1 ;SETUP DISPATCH ADDRESS\r
+ PUSH PDP, STOR ;SAVE ONLY VALUABLE AC\r
+ PUSHJ PDP, (TAC1) ;AND DISPATCH TO TIMING REQUEST ROUTINE\r
+ POP PDP, STOR\r
+ SOJA STOR, CIP4 ;GO BACK FOR MORE REQUESTS\r
+\r
+CIP5: SOSG HNGTIM ;DECREMENT HUNG ID DEVICE\r
+ PUSHJ PDP,DEVCHK ;GO CHECK FOR HUNG ID DEVICES\r
+ SKIPE COMCNT ;ANY COMMANDS TO PROCESS?\r
+ PUSHJ PDP,COMMAND ;YES, CALL COMMAND DECODER\r
+CIP6: PUSHJ PDP,NXTJOB ;CALL SCHEDULER\r
+ SETZM CLKFLG ;CLEAR CLK INTERRUPT FLAG\r
+ ; SET ON ALL FORCED CLK INTERRUPTS\r
+ SETZM TIMEF ;CLEAR TIME0 (1 JIFFY) INTERRUPT FLAG,\r
+ SETZM SCHEDF ;CLEAR FORCED SCHEDULING FLAG\r
+ CAMN ITEM,JOB ;IS NEXT JOB SAME AS LAST ONE?\r
+ JRST CIP8 ;YES, JUST RESTORE ACS AND DISMISS\r
+\f\r
+;DIFFERENT JOB. SAVE SOFTWARE STATE(HARDWARE ALREADY SAVED)\r
+\r
+EXTERNAL JOB,JOBDAT,JOBPRT,USRPRT,USRHCU,JOBJDA\r
+\r
+ SKIPN JA,JOBDAT ;NULL JOB OR CORE 0 ON OLD JOB?\r
+ JRST CIP7 ;YES, DO NOT SAVE SOFTWARE STATE\r
+ MOVEI T,JOBPRT(JA) ;DEST,#FIRST LOC PROTECTED FROM USER\r
+ HRLI T,USRPRT ;SOUR,#SYSTEM DATA STORAGE FOR CURRETN JOB\r
+ SKIPL T1,USRHCU ;MOVE NO. OF OLD USER IO CHAN. IN USE\r
+ CAILE T1,17 ;MUST BE 17 OR LESS(IO MIGHT\r
+ ; CLOBBER IF ADDRESS CHECKING MISSES)\r
+ MOVEI T1,0 ;MOVE ONLY CHN 0 IF NEG, OR GR 17\r
+ ; SAVGET SETS LH NEGATIVE DURING IO AS A FLAG\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
+\f\r
+;RESTORE SOFTWARE STATE OF NEW JOB,THEN HARDWARE STATE\r
+\r
+INTERNAL NULJOB,NULADR\r
+EXTERNAL JOB,JBTDAT,JOBDAT,USRPRT,JOBPRT\r
+EXTERNAL JOBHCU,USRJDA,JOBENB,APRCHN,APRNUL,NULDAT,NULERR\r
+\r
+NULJOB: ;TRANSFER HERE FROM SYSINI WITH ITEM=0\r
+CIP7: MOVEM ITEM,JOB ;STORE NEW CURRENT JOB NUMBER\r
+NULADR: PUSHJ PDP,SETRL1 ;GO SETUP HARDWARE AND SOFTWARE RELOCATION\r
+ ; INFORMATION FOR NEW CURRENT USER\r
+ JUMPE ITEM,NULJB ;IS NEW JOB THE NULL JOB?\r
+\r
+IFN FTHALT,<\r
+ SKIPN JA ;DOES JOB HAVE CORE ASSIGNED?\r
+ HALT . ;NO -ELSE CLOBBER MONITOR\r
+>\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
+ ; SAVEGET SETS NUG,DURING IO\r
+ BLT T,USRJDA(T1) ;AND MOVE INTO MONITOR\r
+\r
+;RESTORE HARDWARE STATE OF CURRENT JOB\r
+\r
+CIP8: SKIPN JA,JBTDAT(ITEM) ;JOB DATA AREA(IS THERE ONE?)\r
+ MOVEI JA,NULDAT ;NO, MUST BE NULL JOB\r
+ MOVSI 17,JOBDAC(JA) ;RESTORE DUMP ACS\r
+ BLT 17,17\r
+ SKIPE APRERR ;DID AN ERROR OCCUR WHILE CLKPI IN PROGRESS\r
+ ; (ON CLK PI OR HIGHER)\r
+ JRST CLKERR ;YES, GO PROCESS ERROR\r
+ SKIPN JOB ;IS THIS JOB THE NULL JOB?\r
+ SKIPN NULERR ;YES, HAS AN ERROR OCCURED WHILE NULL JOB\r
+ ; WAS RUNNING? IF YES, RESTORE ACS\r
+ ; ILL UUO LOSED ACS\r
+ JEN @USRPC ;DISMISS CHANNEL(IF INTERRUPT IN PROGRESS)\r
+\r
+;THE NULL JOB\r
+;RUNS IN USER MODE WITH PC=1 AND COUNTS AND AC 0\r
+\r
+EXTERNAL APRNUL,TIME,THSDAT,MIDNIT,NULERR\r
+\r
+NULJB:\r
+IFN FTCHECK,<EXTERNAL MONPRTR,MONSUM,CHECK\r
+ MOVE TAC,MONPTR\r
+ PUSHJ PDP,CHECK\r
+ CAME TAC1,MONSUM\r
+ HALT .+1\r
+>\r
+ SETZB 0,NULERR ;CLEAR AC 0 USED FOR USUAL MONITORING\r
+\f\r
+ ; CLEAR FLAG SAYING ERROR IN NULL JOB\r
+ ; OF NULL TIME INTERVAL\r
+ ; LOC JOBDAT (LOCATION OF NULL JOB DATA AREA) TO 0\r
+ ; AS A FLAG (ONLY DUMP ACS USED IN NULL JOB DATA AREA)\r
+\r
+ ; IF ANY ERRORS (APRERR NON-ZERO) OCCURRED\r
+ ; WHILE CLK IN PROGRESS\r
+ ; CATCH THEM NEXT CLK INTERRUPT\r
+ MOVE 1,[AOJA 0,1] ;INSTR. TO AC1\r
+ JRST 11,1 ;DISMISS IF INTERUPT IN PROGRESS.\r
+\f\r
+;ROUTINE TO SET HARDWARE AND SOFTWARE RELOCATION INFORMATION FOR CURRENT USER\r
+;CALLED FROM:\r
+; CLOCK ROUTINE WHEN NEW USER IS DIRRERENT FROM OLD USER\r
+; CORE ROUTINE WHEN CORE REASSIGNED FOR CURRENT USER\r
+; CORE UUO\r
+; REMAP UUO\r
+; CALL RESET UUO\r
+; CALL SETUWP UUO\r
+\r
+;CALL: STORE RELOCATION AND PROTECTION FOR LOW SEQ IN JOBADR(JOB NUMBER)\r
+; STORE LENGTH-1 AND ABS ORIGIN FOR HIGH SEG IN JBTADR(HIGH SEG NO)\r
+; (MOVE ITEM,JOB NUMBER - IF CALLING SETRL1)\r
+; PUSHJ PDP,SETREL OR SETRL1\r
+; ALWAYS RETURN, C(ITEM)=JOB NUMBER, C(PROG)=XWD PROT,RELOC, FOR LOW SEG\r
+\r
+ INTERN SETREL\r
+ EXTERN JOB,JBTADR,JOBADR,USRREL,JBTDAT,JOBDAT,JOBREL,KT10A\r
+\r
+SETREL: MOVE ITEM,JOB ;CURRENT JOB NUMBER\r
+\r
+SETRL1: MOVE PROG,JBTADR(ITEM) ;XWD PROTECTION,RELOCATION FOR LOW SEG\r
+ MOVEM PROG,JOBADR ;SAVE TO MAKE UUO HANDLER FASTER\r
+ HLRZM PROG,USRREL ;SAVE PROTECTION FOR ADDRESS CHECKING\r
+ ; (HIGHEST LEGAL REL ADDRES FOR CURRENT USER IN LOW SET)\r
+IFN JDAT-PROG,<\r
+ MOVE JA,JBTDAT(ITEM) ;LOC OF JOB DATA AREA\r
+ MOVEM JA,JOBDAT ;SAVE IT TOO FOR UUO HANDLER\r
+>\r
+ JUMPE PROG,SETHRD ;IF 0 (NULL JOB OR JOB DOING CORE 0 OR KJOB)\r
+ ; DO NOT STORE IN JOB DATA AREA (SINCE IT WILL BE\r
+ ; IN EXEC LOWER CORE. ALSO DO NOT STORE\r
+ ; IN LOC 33, SO CAN SEE LAST REAL USER TO RUN\r
+\r
+ HLRZM PROG,JOBREL(JA) ;SET PROTECTION IN USER JOB DATA AREA\r
+ ; FOR HIM TO LOOK AT\r
+IFN FT2REL,<\r
+ EXTERN SETHGH\r
+ PUSHJ PDP,SETHGH ;SET UP FOR HIGH SEG, IF USER HAS ONE\r
+ ; PROG SETUP FOR DATAO\r
+>\r
+IFE FT2REL,<\r
+ TLZ PROG,1777 ;CLEAR OUT PROTECTION FOR HIGH SEG\r
+ ; JUST IN CASE THIS IS A 2 REG. MACHINE(EVEN THOGH\r
+ ; SOFTWARE CANNOT HANDLE 2 SEGS)\r
+>\r
+ MOVEM PROG,KT10A ;STORE IN LOWER CORE SO IT CAN BE FOUND OUT\r
+ ; USING SWITCHES WHAT IS IN SECOND REGISTER\r
+ ; OPTION DOES NOT COME WITH PANEL LIGHTS\r
+ ; SO NOT STORE 0 FOR NULL JOB SO CAN SEE\r
+ ; LAST JOB TO RUN IN LOC 33\r
+\f\r
+SETHRD: DATAO APR,PROG ;SET APR HARDWARE FOR RELOCATION AND PROTECTION\r
+ ; FOR LOW(AND HIGH SEGS)\r
+ SKIPN PROG,JOBADR ;RESTORE PROG TO XWD PROT,RELOC FOR JUST LOW SEG\r
+ ; (IS THERE ONE)?\r
+ TDZA TAC,TAC ;NO, MUST BE NULL JOB OR CORE0 OR KJOB\r
+ ; SET FOR NO SPECIAL INTERRUTPS TO USER\r
+ MOVE TAC,JOBENB(JA) ;USER APR CONSO FLAGS (THE ONES HE WANTS TO HANDLE\r
+ ; FALL INTO SETAPR ROUTINE\r
+\r
+;ROUTINE TO ENABLE/DISABLE APR FOR TRAPPING TO USER AND EXEC\r
+;CALL: MOVE TAC, APR, CONSO FLAGS FOR USER TRAPPING\r
+; PUSHJ PDP,SETAPR\r
+; RETUNRN WITH APR RESET AND INTERRUPT LOCATION CONS'S SET\r
+\r
+ INTERN SETAPR\r
+ EXTERN APRFOV\r
+\r
+SETAPR: ANDI TAC,231010+APRFOV ;MASK OUT ALL BUT PD OVF, ILL MEM, NXM,\r
+ ; CLOCK, FOV(ONLY PDP-10), AND AROVF CONSO FLAGS\r
+ ; FOV=PC CHANGE ON PDP-6 WHICH IS NEVER ALLOWED\r
+ ; UNDER TIME SHARING BECAUSE IT TRAPS MONITOR TOO\r
+ HRLS TAC ;PRESERVE USER BITS IN LH\r
+ TRO TAC,231000 ;MAKE SURE MONITOR ALWAYS LOOKING FOR\r
+ ; PD OVF, IL;M, NXM, CLOCK FLAGS\r
+ MOVE TAC1,TAC ;DUPLICATE BITS IN TAC1 FOR CONO TO APR\r
+ XORI TAC1,110 ;COMPLEMENT FOV(PDP-10 ONLY) AND AROV FLAGS\r
+ ADDI TAC1, 330 ;SET DISABLE OR ENABLE FOR EACH\r
+ ANDI TAC1,660 ;MASK OUT ALL BUT DISABLE/ENABLE\r
+ ; BITS FOR FOV(PDP-10 ONLY) AND AROVF\r
+ CONO PI,PIOFF ;DISABLE PI'S SO NO INTS. MAY OCCUR WHILE\r
+ ;CHANGING HARDWARE & SOFTWARE STATE FOR\r
+ ;APR TRAPPING\r
+ HLRM TAC,APRIN1 ;STORE USER BITS\r
+ HRRM TAC,APRCON ;STORE EXEC BITS\r
+ CONO APR,APRCHN(TAC1) ;ENABLE OR DISABLE APR FOR\r
+ ; FOV(PDP-10 ONLY) AND AR OVF SEPARATELY\r
+ CONO PI,PION ;ENABLE PI'S AGAIN\r
+ POPJ PDP,\r
+\f\r
+SUBTTL RUNCSS - RUN CONTROL(STATRING AND STOPPING OF JOBS)\r
+\r
+;RUN CONTROL IS A COLLECTION OF ROUTINES WHICH\r
+;SET AND CLEAR BITS IN THE JOB STATUS WORDS OF\r
+;ALL JOBS SO THAT THE SCHEDULER WILL START AND STOP\r
+;THEM ACCORDINGLY\r
+\r
+;COMMON ERROR STOPPING ROUTINES\r
+;CALLED AT ANY LEVEL(UUO,CLK, OR INTERRUPT)\r
+;CALL: MOVE ITEM,JOB CAUSING ERROR OR BEING STOPPED\r
+; MOVE DEVDAT,ADDRESS OF THAT JOB TTYP DEVICE DATA BLOCK\r
+; MOVE DAT,BYTE POINTER TO LAST CHAR, ALEADY MOVED\r
+; :TO TTY OUTPUT BUFFER\r
+; PUSHJ PDP,KSTOP,PHOLD,HOLD,OR ESTOP\r
+; NEVER RETURN IF CALLED AT UUO LEVEL\r
+\r
+;ROUTINE TO STOP JONB AFTER KJOB COMMAND\r
+;CALLED AT UUO LEVEL IF JOB HAD CORE,CLK LEVEL IF NOT\r
+\r
+INTERNAL KSTOP\r
+EXTERNAL HIGHJB\r
+\r
+KSTOP: MOVSI TAC,JNA+JLOG+JACCT ;CLEAR JOB NUMBER ASSIGNED AND LOGGED IN BITS\r
+ ANDCAM TAC,JBTSTS(ITEM)\r
+IFN FTLOGIN,<\r
+EXTERN PRJPRG\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
+ ; HIGHEST AND SET HIGHJB\r
+ CAMGE ITEM,HIGHJB ;IS THIS THE BIGGEST JOB NUMBER ASSIGNED?\r
+ JRST ESTOP ;NO, LEAVE HOLD\r
+ MOVSI TAC1,JNA ;YES,JOB NUMBER ASSGINED BIT\r
+ HRRZ TAC,ITEM ;SCAN DOWNWARD\r
+ TDNN TAC1,JBTSTS(TAC) ;IS JNA BIT SET FOR THIS JOB?\r
+ SOJG TAC,-1 ;NO,KEEP LOOKING,FINISHED(TRUE IF THIS THE ONLY JOB\r
+ MOVEM TAC,HIGHJB ;YES,STORE NEW HIGHEST JOB NUMBER ASSIGNED\r
+ JRST ESTOP ;GO SET ERROR BIT\r
+\f\r
+;ROUTINE TO STOP JOB, SET ERROR BIT AND PRINT MESSAGE\r
+;THEM ADD ^TC<CRLF><CRLF><PERIOD>\r
+;CALL: MOVEI TAC,ADR. OF MESSAGE\r
+; PUSHJ PDP,PHOLD\r
+\r
+ INTERN PHOLD\r
+\r
+PHOLD: PUSHJ PDP,CONMES ;MOVE MESSAGE TO TTY OUTPUT BUFFER\r
+ ; FALL INTO HOLD\r
+;ROUTINE TO STOP JOB, SET ERROR BIT.\r
+;AND ADD "^C<CRLF><CRLF><PERIOD>\r
+\r
+INTERNAL HOLD,HOLD1\r
+EXTERNAL TTYSTC\r
+\r
+HOLD: PUSHJ PDP,INLMES\r
+ ASCIZ /\r
+^C\r
+\r
+./\r
+\r
+HOLD1: PUSHJ PDP,TTYSTC ;MAKE SURE TTY STAYS IN MONITOR MODE\r
+ ; AND START TTYP TYPING OUTMESSAGE\r
+ ; FALL INTO ESTOP\r
+\f\r
+;ROUTINE TO STOP USER AND FLAG AS ERROR STOP\r
+\r
+INTERNAL ESTOP,ESTOP1\r
+EXTERNAL JBTSTS,STUSER,STREQ,STAVAL\r
+EXTERNAL SCHEDF,JOB,CPOPJ\r
+\r
+ESTOP: JUMPE ITEM,CPOPJ ;IS THIS ERROR IN JOB 0?\r
+ MOVSI TAC,JACCT ;NO, CLEAR ACCOUNTING BIT(IN CASE LOGGING\r
+ ANDCAM TAC,JBTSTS(ITEM) ;IN OR OUT0 SO USER CAN USE CONTROL C\r
+ ; TO RECOVER\r
+ESTOP1: MOVSI TAC,JERR ;SSET ERROR BIT IN JOB STATUS WORD\r
+ IORM TAC,JBTSTS(ITEM) ;SO JOB CAN NOT CONTINUE(CONT COM.)\r
+ CAME ITEM,STUSER ;SYSTEM TAPE USER?\r
+ JRST STOP1 ;NO\r
+ MOVSI TAC,637163 ;FIND SYS DDB\r
+ PUSHJ PDP,DEVSRC ;SYSTEM ERROR IF NOT FOUND\r
+ JSP DAT,ERROR\r
+\r
+ PUSHJ PDP,RELEA9 ;YES, RELEASE SYSTEM TAPE WITHOUT WAITING\r
+\f\r
+;ROUTINE TO STOP NY JOB FROM BEING SCHEDULED\r
+;CALL:\r
+; MOVE ITEM, JOB NUMBER\r
+; PUSHJ PDP, STOP1\r
+; EXIT ;RETURN HERE IMMEDIATELY, IF CALLED FROM HIGHER\r
+;PRIORITY PI CHANNEL THAN CLK(LOWEST), OTHERWISE WHEN JOB IS RUNABLE\r
+;CALLED FROM COMMAND DECODER WHEN <CONTROL>C TYPED IN BY USER\r
+;OR ON ANY ERROR MESSAGE(SFE PREVIOUS PAGE)\r
+\r
+INTERNAL STOP1\r
+EXTERNAL JBTSTS,PJBSTS,REQTAB,JOB,STUSER,MAXQ,AVALTB\r
+\r
+STOP1: MOVSI TAC,RUN \r
+ CONO PI,PIOFF ;DONE AT INTERRUPT LEVEL HIGHER THEN DT LEVEL\r
+ CAME ITEM,STUSER ;IS THIS JOB CURRENTLY USING THE SYTEM TAPE?\r
+ TDNN TAC,JBTSTS(ITEM) ;NO, IS RUN BIT OFF IN JOB STATUS WORD\r
+ JRST STOP1A ;YES\r
+ ANDCAM TAC,JBTSTS(ITEM) ;NO, SO CLEAR IT\r
+ CONO PI,PION\r
+ LDB TAC,PJBSTS ;GET JOB WAIT QUEUE CODE(IF ANY)\r
+ CAIG TAC,MAXQ ;DOES STATE HAVE Q ?\r
+ SOSL REQTAB(TAC) ;YES. REDUCE IT.\r
+ JRST STOP1A ;NO\r
+ SOSGE AVALTB(TAC) ;YES REDUCE COUNT\r
+ SETZM AVALTB(TAC) ;CLEAR AVAL FLAG IF NO ONE WAITING\r
+STOP1A: CONO PI,PION ;MAKE SURE PI ON\r
+ CAME ITEM, JOB ;NO. IS THIS JONB CURRENT USER\r
+\r
+INTERNAL FTSWAP\r
+\r
+IFE FTSWAP,<\r
+ POPJ PDP, ;NO\r
+>\r
+IFN FTSWAP,<\r
+ JRST REQUE ;SET REQUE JOB FLAG\r
+>\r
+ SKIPL TAC,JBTSTS(ITEM) ;RUN FLAG OFF?\r
+ TLNN TAC,JERR ;YES, ERROR FLAG ON?\r
+ JRST STOP2 ;NO\r
+ SETOM SCHEDF ;YES, FORCE RESCHEDULING EVEN IF JOB IN EXEC MODE\r
+ JRST STOP2 ;YES, MAKE CLK RESCHEDULE ANOTHER JOB\r
+\f\r
+;ROUTINE TO REQUE JOB WHICH HAS HAD A COMMAND TYPED\r
+;WHICH NEEDS CORE AND THE CORE IMAGE IS ON THE DISK.\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
+\r
+INTERNAL DLYCOM\r
+\r
+DLYCOM: MOVSI TAC,CMWB ;SET COMMAND WAIT BIT\r
+IFN FTSWAP,<\r
+ EXCH TAC,JBTSTS(ITEM)\r
+>\r
+ IORM TAC,JBTSTS(ITEM) ;IN JOB STATUS WORD\r
+\r
+INTERNAL FTSWAP\r
+IFN FTSWAP,<\r
+ TLNN TAC,CMWB\r
+ PUSHJ PDP,REQUE\r
+\r
+>\r
+ POPJ PDP,\r
+\r
+;ROUTINE TO PUT JONB IN NO CORE QUEUE\r
+\r
+INTERNAL FTSWAP\r
+IFN FTSWAP,<INTERNAL NOCORQ\r
+ EXTERNAL NULQ\r
+\r
+NOCORQ: MOVEI TAC,NUL1 ;NO JOB NO. OR NO CORE QUEUE\r
+ DPB TAC,PJBSTS\r
+ JRST REQUE\r
+>\r
+\f\r
+;ROUTINE TO SETUP MONITOR JOB TO RUN LATER AT UUO LEVEL\r
+;CALLED BY COMMANDS WHICH MAY OR MAY NOT NEED TO\r
+;RUN MONITOR JOB DEPENDING ON WHETHER JOB HAS CORE(KJOB,IJOB)\r
+;TTY WILL REMAIN IN MONITOR MODE\r
+;JOB MUST HAVE CORE ASSIGNED\r
+;CALL: MOVE ITEM, JOB NUMBER\r
+; MOVEI TAC1,ADDR. OF MONITOR JOB TO BE RUN\r
+; PUSHJ PDP,MONJOB\r
+;WHEN SCHEDULED TO RUN, MONITOR JOB MUST SET UP ITS OWN ACS\r
+\r
+INTERNAL MONJOB\r
+\r
+MONJOB: PUSHJ PDP,MSTART ;START WITH PC IN MONITOR\r
+ JRST SETRUN ;SET TTY TO START JOB WHEN COMMAND RESPONSE\r
+ ; IS FINISHED AND KEEP TTY IN MONITOR MODE\r
+\r
+;ROUTINE TO SETUP ACS FOR MONITOR JOB STARTING AT UUO LEVEL\r
+;SETS UP ITEM, WITH JOB NO.; PROG WITH RELOCATION, AND PDP\r
+;WITH PUSH DOWN LIST ADR. IN JOB DATA AREA\r
+;USED BY KJOB,CORE 0,SAVE,GET,RUN,R,REASSIGN AND FINISH COMMANDS\r
+;CALL: MOVEI TAC1,MONITOR JOB START ADDRESS\r
+; JSP TAC,MONSTR\r
+; RETURN WITH ACS PDP,PROG,JDAT, AND ITEM SETUP\r
+\r
+INTERNAL MONSTR\r
+EXTERNAL JOB,JBTADR,MJOBPD,JOBPDL,TTYFNU,JBTDAT\r
+\r
+MONSTR: MOVE ITEM,JOB ;CURRENT JOB NUMBER\r
+ MOVE JDAT,JBTDAT(ITEM) ;ADR. OF JOB DATA AREA\r
+IFN JDAT-PROG,<\r
+ MOVE PROG,JBTADDR(ITEM) ;JOB RELOCATION\r
+>\r
+ MOVSI PDP,MJOBPD ;MINUS LENGTH OF SYSTEM PD LIST\r
+ HRRI PDP,JOBPDL(JDAT) ;FIRST LOC.-1 OF PD LIST\r
+ PUSH PDP,TAC1 ;SAVE STOP ADDRESS\r
+ JRST (TAC) ;RETURN AND DO MONITOR JOB\r
+ ; WITH TT DDB,OUTPUT BYTE POINTER, AND JOB NO.\r
+\f\r
+;ROUTINE TO SET JOB STATE TO BE SCHEDULED TO RUN\r
+;WITH SPECIFIED STARTING ADDRESS INCLUDING PC FLAGS\r
+;CALLED ONLY WHEN JOB IN CORE AND AFTER JOB HAS BEEN\r
+;SAFELY STOPPED IN ONE OF 3 STATES:\r
+;1) PC IN USER MODE\r
+;2) JOB IN A WAIT FOR SHARABLE DEVICE, OR IO WAIT\r
+;3) JOB JUST ABOUT TO RETURN TO USER MODE FROM A UUO CALL\r
+;CALL: MOVE TAC1,STARTING PC\r
+; MOVE ITEM, JOB NUMBER\r
+; MOVE JDAT,ADR. OF JOB DATA AREA WHICH MUST BE IN CORE\r
+; PUSHJ PDP,USTART(PC TO USER MODE),MSTART(PC TO MONITOR MODE)\r
+; RETURN HERE IMMEDIATELY\r
+\r
+INTERNAL MSTART,USTART\r
+EXTERNAL JOBPC,JOBDAC,JOBD17,TTYSET,JOBOPC,JOBPD1\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
+ MOVE TAC,JOBPD1(JDAT) ;UUO PC HAS LAST PC\r
+ HRRI TAC,-1(TAC) ;SUBTRACT 1 FROM RIGHT HALF AND\r
+ ; PRESERVE LH PC FLAGS\r
+ ; (RH=0 ON HALT 0 OR FIRST START)\r
+USTRT1: MOVEM TAC,JOBOPC(JDAT) ;STORE OLD PC FOR USER TO LOOK AT\r
+ HLL TAC1,TAC ;PRESERVE USER APR FLAGS\r
+ TLO TAC1,USRMOD ;MAKE SURE NEW PC IN USER MODE\r
+ TLZ TAC1,37 ;MAKE SURE NO INDIRECT BITS OR INDEX FIELD\r
+ \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
+ ; 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
+;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
+;TTYUSR. OR TTYURC IN SCNSER\r
+;CALL: MOVE ITEM,JOB NUMBER\r
+; PUSHJ PDP,SETRUN\r
+\r
+INTERNAL SETRUN\r
+EXTERNAL JBTSTS,PJBSTS,REQTAB,AVALTB,RNQUNT\r
+EXTERNAL MAXQ\r
+\r
+SETRUN: LDB TAC,PJBSTS ;GET JOB STATUS WAIT QUEUE CODE\r
+ CAILE TAC,MAXQ ;DOES JOB STATUS CODE HAVE A QUEUE?\r
+ JRST SETR1 ;NO\r
+ AOSLE REQTAB(TAC) ;ADD TO REQUEST COUNT\r
+ JRST SETR1 ;OTHERS WAITING?\r
+ AOSG AVALTB(TAC) ;MAKE AVAILABLE\r
+ SETOM AVALTB(TAC) ;FLAG AS JUST AVAILABLE, BECAUSE\r
+ ; NO JONB WAS USING DEVICE. SCHEDULER\r
+ ; WILL SCAN THIS QUEUE\r
+SETR1: MOVSI TAC,RUN ;SET RUN BIT IN JOB STATUS WORD\r
+ IORM TAC,JBTSTS(ITEM) \r
+SETR2: MOVE TAC,RNQUNT ;SET QUANTUM TIME TO RUN QUEUE QUANTUM\r
+ HRRM TAC,JBTSTS(ITEM) ;RUN QUEUE QUANTUM\r
+\r
+INTERNAL FTSWAP\r
+IFE FTSWAP,<\r
+ JRST NULTST ;GO SEE IF NULL JOB IS RUNNING\r
+>\r
+IFN FTSWAP,<\r
+ INTERNAL REQUE\r
+ EXTERNAL QJOB,JBTSTS\r
+\r
+REQUE: MOVSI TAC,JRQ ;MARK JOB TO BE REQUEUED WITH JRQ BIT\r
+ TDNN TAC,JBTSTS(ITEM) ;INCREMENT COUNT ONLY ONCE FOR EACH JOB\r
+ AOS QJOB ;INCREMENT COUNT OF NO. OF JOBS WAITING TO BE REUEUED\r
+\r
+ IORM TAC,JBTSTS(ITEM) ;SET REQUE BIT FOR SCHEDULER\r
+ POPJ PDP,\r
+\r
+>\r
+\f\r
+;ROUTINE TO PUT A JOB TO SLEEP AND WAKE UP AGAIN LATER\r
+;CALLED AFTER CLOCK QUEUE REQUEST PUT IN BY UUO ROUTINE\r
+\r
+INTERNAL FTSLEEP\r
+\r
+IFN FTSLEEP,<\r
+INTERNAL SETSLP\r
+EXTERNAL JBTSTS,SLPQ\r
+\r
+SETSLP: MOVSI TAC,CLKR ;FLAG THAT A CLOCK REQUEST HAS BEEN PUT IN\r
+ IORM TAC,JBTSTS(ITEM) ;SO ONLY ONE PER JOB\r
+ MOVEI AC1,SLPQ ;SLEEP STATE CODE\r
+ JRST SETSTT ;SET STATUS AND RESCHEDULE\r
+\r
+;HERE AT CLOCK LEVEL WHEN CLOCK REQUEST TIMES OUT FOR SLEEP\r
+;JOB NO. IN AC TAC\r
+\r
+INTERNAL WAKE\r
+\r
+EXTERNAL PJSTS,RNQ,SLPQ\r
+\r
+WAKE: MOVEI TAC1,RNQ ;RUN QUEUE CODE\r
+ MOVE ITEM,TAC ;JOB NO.\r
+ MOVSI TAC,CLKR ;CLEAR CLOCK REQUEST BIT FOR THIS JOB\r
+ ANDCAM TAC,JBTSTS(ITEM) ;SO IT CAN PUT ANOTHER ONE IN\r
+ LDB TAC,PJBSTS ;GET QUEUE CODE\r
+ CAIE TAC,SLPQ ;IS JOB STILL SLEEPING?\r
+ POPJ PDP, ;NO, RETURN TO CLOCK ROUTINE\r
+ DPB TAC1,PJBSTS ;YES, STORE RUN QUEUE CODE\r
+ ; (CONTROL C, START CAN GET JOB OUT SLEEP)\r
+ JRST SETR2\r
+>\r
+\f\r
+;ROUTINE TO GET DATA CONTROL AND ANOTHER SHARABLE DEVICE\r
+;JOB NEVER GETS ONE DEVICE AND WAITS FOR SECOND, SINCE TYPING\r
+;CONTROL C WOULD NEVER FINISH WITH FIRST DEVICE\r
+;CALL PUSHJ PDP,GETDCXX\r
+; AOSE XXREQ ;REQUEST COUNT FOR OTHER DEVICE\r
+; RETURN WHEN BOTH AVAILABLE\r
+\r
+INTERNAL GETDCDT,GETDCMT\r
+EXTERNAL DCREQ,REQTAB,AVALTB,DCAVAL,CPOPJ1\r
+\r
+GETDCDT:GETDCMT: \r
+ XCT @(PDP) ;INCREASE SHARABLE DEVICE REQ. COUNT\r
+GETWT: PUSHJ PDP,DVWAT1 ;NOT AVAIL., GO WAIT FOR IT\r
+ AOSN DCREQ ;IS DATA CONTROL AVAILABLE?\r
+ JRST CPOPJ1 ;YES, RETURN BOTH AVAILABLE\r
+ MOVE AC1,@(PDP) ;DATA CONTROL NOT AVAILABLE\r
+ SUBI AC1,REQTAB\r
+ SOSL REQTAB(AC1) ;REDUCE REQ. COUNT FOR OTHER\r
+ ; SHARABLE DEVICE.\r
+ SETOM AVALTB(AC1) ;SET AVAILABLE IF OTHER JOBS WAITING\r
+ JFCL DCREQ ;ARGUMENT FOR DCQAIT\r
+ PUSHJ PDP,DCWAIT ;WAIT FOR DATA CONTROL FREE\r
+ MOVE AC1,@(PDP) ;INCREMENT REQ. COUNT\r
+ AOSN @AC1 ;NOW IS SHARABLE DEVICE FREE?\r
+ JRST CPOPJ1 ;YES\r
+ SOSL DCREQ ;NO, REDUCE DATA CONTROL REQUEST\r
+ SETOM DCAVAL ;SET AVAIL., SOME OTHER JOB WAITING FOR IT\r
+ JRST GETWT ;TRY AGAIN\r
+\f\r
+;ROUTINE TO WAIT FOR A SHARABLE DEVICE\r
+;CALLED AT UUO LEVEL ONLY BY DEVICE SERVICE ROUTINES\r
+;CALL: AOSLE XXREQ ;ADD 1 TO SHARABLE DEVICE REQUEST COUNT\r
+; ;IS DEVICE AVAILABLE?\r
+; PUSHJ PDP,XXWAIT ;NO, PUT JOB IN WAIT QUEUE\r
+; RETURN WHEN DEVICE AVAILABLE\r
+\r
+;INITIALLY THE REQUEST COUNT IS -N, WHERE N IS THE\r
+;NUMBER OF JOBS WHICH CAN USE THE SHARABLE DEVICE AT THE SAME TIME\r
+;A REQUEST COUNT OF 0 MEANS THE MAXIMUM NO. OF JOBS ARE\r
+;USING THE DEVICE, A POSITIVE NUMBER IS THE\r
+;NUMBER OF JOBS WAITING IN THE SHARABLE DEVICE WAIT QUEUE\r
+\r
+INTERNAL DVWAIT\r
+INTERNAL MTWAIT,STWAIT,DTWAIT,DCWAIT,DAWAIT,MQWAIT,AUWAIT\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
+DVWAT1: MOVE AC1,@-1(PDP) ;GET ADR. OF CALLER OF THIS ROUTINE\r
+ SUBI AC1,REQTAB ;COMPUTE WAIT-STATE QUEUE CODE\r
+SETSTT: MOVE AC3,JOB ;CURRENT JOB NO.\r
+ DPB AC1,PJBS1 ;STORE IN JOB STATUS WORD\r
+ JRST WSCHED ;GO SCHEDULE ANOTHER AND RETURN TO CALLER\r
+ ; WHEN SHARABLE DEVICE BECOMES AVAILABLE\r
+ ; SEE CLOCK AND CLKCSS\r
+\r
+PJBS1: POINT JWSIZ,JBTSTS(AC3),JWPOS ;BYTE POINTER TO JOB STATUS\r
+ ; WORD WAIT QUEUE CODE\r
+\f\r
+;ROUTINE TO SET JOB TO RUN AFTER IT HAS BEEN STOPPED\r
+;BECAUSE IT HAD TO WAIT FOR IO TO COMPLETE FOR SOME DEVICE\r
+;EACH SERVICE ROUTINE WILL AT INTERRUPT LEVEL\r
+;CHECK EACH TIME IT FINISHED A TASK(RUNFFERFUL)\r
+;TO SEE IF THE JOB USING THE DEVICE HAS\r
+;PREVIOUSLY CAUGHT UP WITH DEVICE AND HAS BEEN STOPPED\r
+;CALL: MOVE DEVDAT,ADR, OF DEVICE DATA BLOCK\r
+; MOVE IOS,DEVIOS(DEVDAT) ;GET DEVICE IO STATUS WORD FROM DDB\r
+; TLZE IOS,IOW ;IS JOB AN IO WAIT FOR THIS DEVICE?\r
+; PUSHJ PDP,SETIOD ;YES, GO FLAG JOB TO START UP AGAIN\r
+; RETURN\r
+;SETS THE JOB QUEUE WAIT CODE TO WSQ IN JOB STATUS WORD,\r
+;THE SCHEDULER THEN SEES THAT THIS JOB HAS ITS\r
+;IO WAIT SATISFIED AND IS WAITING TO BE RUN AGAIN\r
+\r
+INTERNAL SETIOD,STTIOD\r
+EXTERNAL WSQ,WSAVAL,TSQ,TSAVAL,JOB,PJOBN\r
+\r
+PJBS2: POINT JWSIZ,JBTSTS(TAC),JWPOS ;BYTE POINTER TO JOB STATUS\r
+ ; WORD QUEUE CODE\r
+STTIOD: MOVEI TAC1,TSQ ;SET TTY IO WAIT SATISFIED QUEUE CODE\r
+ AOS TSAVAL\r
+ JRST SETIO1\r
+SETIOD: MOVEI TAC1,WSQ ;REQUE TO WAIT SATISFIED Q\r
+ AOS WSAVAL ;INCR, NO, OF JOBS WITH IO WAIT\r
+ ; SATISFIED, NON-ZERO WSAVAL WILL\r
+ ; CAUSE SCHED, TO SCAN FOR IO\r
+SETIO1: LDB TAC,PJOBN\r
+ DPB TAC1,PJBS2 ;IN JOB STATUS WORD\r
+\r
+INTERNAL FTSWAP\r
+IFN FTSWAP,<\r
+ EXTERN QJOB,JBTSTS\r
+ MOVSI QJOB,JBTSTS\r
+ MOVSI TAC1,JRQ ;SET JOB TO BE REQUEUED AT NEXT CLOCK TICK\r
+ TDNN TAC1,JBTSTS(TAC) ;IS REQUE BIT ALREADY ON?\r
+ AOS QJOB ;NO, INCREMENT COUNT ONCE FOR EACH JOB\r
+ IORM TAC1,JBTSTS(TAC) ;SET REQUEUEING BIT FOR SCHEDULER\r
+>\r
+NULTST: SKIPE JOB ;IS NULL JOB RUNNING?\r
+ POPJ PDP, ;NO LET OTHER JOB RUN TILL SCHEDULER IS TRAPPED TO\r
+\f\r
+;ROUTINE TO CAUSE CLK TO ROUTINE TO RESCHEDULE\r
+;CALLED AT ANY LEVEL\r
+;CALL: PUSHJ PDP,STOP2\r
+; RETURN IMMEDIATELY EXCEPT IF AT UUO LEVEL\r
+; IF AT UUO LEVEL, RETURN WHEN JOB IS RUNABLE AGAIN\r
+\r
+INTERNAL STOP2\r
+EXTERNAL PICLK,CLKFLG\r
+\r
+STOP2: CONO PI,PIOFF ;PREVENT CLOCK INTERRUPT DURING STOP2 CODE\r
+ SETOM CLKFLG ;SET FLAG TO INDICATE CLK INTERRUPT\r
+ ; EVEN THOUGH CLK INTERRUTP IS NOT A ATIME INTERRUPT\r
+ CONO PI,PICLK ;TURN PI BACK ON AND REQUESST INTERRUPT TO\r
+ ; CLK PI CHANNEL(LOWEST PRIORITY CHANNEL)\r
+ POPJ PDP, ;INTERRUPT IMMEDIATELY IF AT UUO LEVEL\r
+\f\r
+;ROUTINE TO WAIT TILL DEVICE CATCHES UP WITH USER AND BECOMES INCTIVE\r
+,CALLING SEQUENCE\r
+, PUSHJ PDP, WAIT1\r
+, EXIT ALWAYS RETURN HERE\r
+\r
+,IF DEVICE IS INACTIVBE (IOACT=0), RETURNS TO EXIT, OTHERWISE, SETS\r
+,IOW:=1 AND ENTERS WAIT UNLESS IOCT BECOMES ZERO BEFORE THE\r
+,JUMP IS MADE, IN WHICH CASE IT SETS IOW:=0 AND RETURNS TO EXIT,\r
+,ON LEAVING THE WIAT STATE, RETURNS TO EXIT.\r
+,THIS ROUTINE PREVENTS THE STATE IOACT=0 AND IOW=1 FROM OCCURING\r
+,CALLING SEQUENCE\r
+, PUSHJ PDP, WSYNC\r
+, EXIT ALWAYS RETURNS HERE\r
+,SETS IOW:=1 AND ENTERS WAIT ROUTINE. RETURNS TO EXIT WHEN IOACT=0\r
+\r
+INTERNAL WAIT1\r
+\r
+WAIT1: MOVE IOS,DEVIOS(DEVDAT)\r
+ TRNN IOS, IOACT ;IS DEVICE ACTIVE? (IOACT=1?)\r
+ POPJ PDP, ;RETURN\r
+ PUSHJ PDP,WSYNC ;WAIT\r
+ JRST WAIT1\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
+; PUSHJ PDP,WSYNC\r
+; RETURN IMMEDIATELY IF DEVICE IS INACTIVE\r
+; RETURN WHEN DEVICE FINISHES NEXT BUFFER IF IT IS ACTIVE\r
+\r
+INTERNAL WSYNC\r
+EXTERNAL IOWQ,TIOWQ,PION,PIOFF\r
+\r
+WSYNC: MOVSI IOS,IOW ;SETUP DEVICE IO WAIT BIT\r
+ MOVEI AC1,IOWQ ;IO WAIT STATE CODE\r
+ MOVE AC3,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS\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
+ JRST WSYNC1 ;NO\r
+ IORM IOS,DEVIOS(DEVDAT) ;YES, SET DEVICE IO-WAIT BIT\r
+ ; AND SETUP IOS FOR RETURN WHEN WAIT SATISFIED\r
+ DPB AC1,PJBS1 ;SET JOB WAIT STATE CODE\r
+ ; IN JOB STATUS WORD\r
+ CONO PI, PION ;TURN PI ON\r
+ PUSHJ PDP,WSCHED ;CALL SCHEDULER TO FIN ANOTHER JOB TO RUN\r
+ ; RETURN WHEN NEXT BUFFERFUL IS FINISHED\r
+ ; WITH ACS 0-14 OCTAL RESTORED\r
+ ; RETURN WHEN IO-WAIT FINISHED\r
+WSYNC1: CONO PI, PION\r
+ ANDCAB IOS, DEVIOS(DEVDAT) ;CLEAR DEVIVCE IO-WAIT BIT\r
+ POPJ PDP,\r
+\r
+CLKEND: END\r
--- /dev/null
+TITLE COMCON - COMMAND DECODER AND SAVEGET ROUTINES - V433\r
+SUBTTL /RCC 03 JUN 69\r
+XP VCOMCN,433\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
+;THE COMMAND AND THEN DISPATCHES(PUSHJ) TO APPROPRIATE\r
+;COMMAND SETUP ROUTINE OF THE SAME NAME WITH AC'S SET AS:\r
+;ITEM = JOB NUMBER\r
+;TAC = BYTE POINTER TO COMMAND STRING(SPACE OR CR AFTER COMMAND NAME)\r
+;DAT = BYTE POINTER TO LAST OUTPUT CHARACTER\r
+;DEVDAT = ADDRESS OF DEVICE DATA BLOCK TYPING COMMAND\r
+;JDAT = ADDRESS OF JOB AREA, = 0 IF NO JOB AREA\r
+;PROG = ADDRESS OF PROGRAM AREA, 0 MEANS NOT IN CORE OR NO CORE\r
+;IOS IS SET TO 0, USED FOR ADDRESS OF SUBSEQUENT CALLS\r
+;DEVDAT IS ALSO PUSHED ON END OF PO LIST SO IT MAY BE DESTROYED\r
+;UPON RETURN FROM COMMAND SETUP ROUTINE, A CR-LF IS ADDED TO\r
+;MESSAGE AND TTY IS STARTED ON TTYP SPECIFIED BY -1(PDP)\r
+;SEVERAL COMMAND FLAGS ARE CHECKED BEFORE DISPATCHING TO\r
+;COMMAND SETUP ROUTINES TO SEE IF COMMAND IS LEGAL AT THIS TIME\r
+;SEVERAL MORE FLAGS ARE CHECKED UPON RETURN FROM COMMAND SETUP\r
+;ROUTINES(UNLESS AN ERROR HAS OCCURRED) FOR STANDARD\r
+;COMMAND RESPONSE\r
+;IF AN ERROR OCCURS, THE JOB NO.(ITEM) SHOULD BE 0 ON RETURN\r
+;SO THAT JOB WILL NOT BE INITIALIZED IF FIRST COMMAND.\r
+;ERRMES ROUTINE WILL SET ITEM TO 0\r
+\r
+;SINCE THE COMMAND DECODER IS CALLED FROM THE CLOCK ROUTINE\r
+;COMMAND SETUP ROUTINE MUST RUN TO COMPLETION QUICKLY\r
+;IF A COMMAND FUNCTION CANNOT DO THIS, IT MUST JUST SET\r
+;THE JOB TO RUNABLE STATUS AND RETURN IMMEDIATELY\r
+;OR DELAY THE COMMAND FOR LATER EXECUTION\r
+\f\r
+INTERNAL COMMAND\r
+INTERNAL FTLOGIN,FTSWAP,FTTIME\r
+EXTERNAL COMCNT,TTYCOM,JBTSTS,JOBMAX,JBTDAT,JBTADR,JOBHCU\r
+EXTERNAL CONFIG,HIGHJB\r
+EXTERNAL TTYSTR,TTYUSR,TTYATT\r
+EXTERNAL TTYTAB,PUNIT,TTYATI\r
+EXTERNAL ADRERR,ANYACT,ASSASG,CORE0,DAMESS,DEVLG,DEVPHY,DEVSRC\r
+EXTERNAL DLYCOM,ERNAM,ESTOP,GETWD1,GETWDU,KSTOP,CORE1,MONJOB,DECP1\r
+EXTERNAL MONSTR,MSTART,OCTPNT,PHOLD,PRNAME,RADX10,RELEA5\r
+EXTERNAL RELEA6,RESET,SETRUN,STOP1\r
+EXTERNAL STOTAC,UPTIME,USRXIT,USTART,UUOERR\r
+\r
+T=BUFPNT ;TEMPORARY AC'S\r
+T1=BUFWRD\r
+T2=UUO\r
+T3=AC1\r
+T4=AC2\r
+COMMAND:PUSHJ PDP,TTYCOM ;SETUP DEVDAT,DAT,TAC,AND ITEM\r
+ ; FOR ANY TTY WHICH HAS TYPED A COMMAND\r
+COM0: POPJ PDP, ;NONE FOUND\r
+ PUSH PDP,DEVDAT ;SAVE TTY DEVICE DATA BLOCK ADDRESS\r
+ PUSHJ PDP,CTEXT ;SCAN COMMAND NAME, RETURN IT IN TAC1\r
+ MOVE T,TAC1 ;COPY COMMAND.\r
+ MOVNI T1,1 ;SET MASK ALL ONES\r
+ LSH T1,-6 ;CLEAR OUT ONE MORE CHAR.\r
+ LSH T,6 ;SHIFT 1 COMMAND CHAR OFF\r
+ JUMPN T,.-2 ;IF NOT END OF COMMAND. GO AROUND\r
+ MOVEI T4,0 ;CLEAR FLAG REGISTER\r
+ MOVSI T,-DISPL ;SEARCH COMMAND TABLE FOR MATCH\r
+COMLP: MOVE T2,COMTAB(T) ;GET NEXT ENTRY FROM COMMAND TABLE\r
+ TDZ T2,T1 ;MASK OUT CHAR 5\r
+ CAMN TAC1,COMTAB(T) ;EXACT MATCH?\r
+ JRST COMFND ;YES, THIS IS IT.\r
+ CAME TAC1,T2 ;MATCH?\r
+ JRST COMNEQ ;NOT EVEN GOOD MASK\r
+ TROE T4,1 ;MATCHES MASKED, IS THIS FIRST ONE\r
+ TROA T4,2 ;NO, SET 2ND OCCUR FLAG\r
+ MOVE T3,T ;YES, COPY CURRENT INDEX\r
+COMNEQ: AOBJN T,COMLP ;NO, KEEP LOOKING\r
+ CAIN T4,1 ;DID ONE AND ONLY ONE COMMAND MATCH?\r
+ MOVE T,T3 ;YES, GET ITS INDEX\r
+\f\r
+COMFND: MOVE TAC1,DISP(T) ;GET DISPATCH TABLE ENTRY,\r
+ PUSH PDP,TAC1 ;SAVE RH(DISPATCH ADR,+BITS)\r
+ MOVE T,JBTSTS(ITEM) ;JOB STATUS WORD FOR THIS JOB\r
+IFN FTLOGIN,<\r
+ TLNN T,JLOG ;IS JOB LOGGED IN?\r
+ TLNE TAC1,NOLOGIN ;NO, CAN COMMAND PROCEED WITH NO LOGIN?\r
+ JRST CHKNO ;YES\r
+ JSP TAC,COMER ;NO, TYPE "LOGIN PLEASE"\r
+ ASCIZ /LOGIN PLEASE\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
+ MOVEI ITEM,1 ;YES, SCAN FOR ONE STARTING WITH 1\r
+NUMLOP: MOVE T,JBTSTS(ITEM) ;SCAN FOR FREE JOB NO.\r
+ TLNN T,JNA+CMWB ;THIS NUMBER ASSIGNED?\r
+ JRST NEWJOB ;NO, SO USE THIS NUMBER\r
+\r
+ CAIGE ITEM,JOBMAX ;YES, IS THE MAX. JOB NO.?\r
+ AOJA ITEM,NUMLOP ;NO, KEEP LOOKING\r
+ JSP TAC,COMER ;YES, NONE LEFT, PRINT "JOB CAPACITY EXCEEDED"\r
+ ASCIZ /JOB CAPACITY EXCEEDED\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
+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
+ ; "TTY" IS PUBLIC LOGICAL NAME\r
+IFN FTTIME,<\r
+ SETZM RTIME(ITEM) ;CLEAR INCREMENTAL JOB RUNNING TIME\r
+ SETZM TTIME(ITEM) ;CLEAR TOTAL JOB RUNNING TIME\r
+>\r
+IFN FTKCT,<\r
+ EXTERN JBTKCT\r
+ SETZM JBTKCT(ITEM) ;CLEAR CORE-RUNNING TIME CORE\r
+>\r
+ CAMLE ITEM,HIGHJB ;HIGHEST JOB NUMBER ASSIGNED?\r
+ MOVEM ITEM,HIGHJB ;YES,SAVE IT FOR SCHEDULER SCAN OF JOBS\r
+\f\r
+CHKRUN: TLNE T,RUN ;RUN BIT ON IN JOB STATUS?\r
+ TLNN TAC1,NORUN ;YES, DOES THIS COMMAND REQUIRE A JOB?\r
+ JRST CHKACT ;NO\r
+ JSP TAC,COMER ;YES.\r
+ ASCIZ /PLEASE TYPE ^C FIRST\r
+/\r
+\r
+CHKACT:\r
+\r
+IFN PROG-JDAT,<\r
+ MOVE JDAT,JBTDAT(ITEM) ;ADDRESS OF JOB DATA AREA\r
+>\r
+ MOVE PROG,JBTADR(ITEM) ;XWD PROTECTION,RELOCATION\r
+IFN FTSWAP,<\r
+ TLNE TAC1,INCOR!NOTRAN ;MUST JUST NOT BE SWAPPING OR\r
+ ; IF JOB HAS CORE ASSIGNED, MUST IT BE\r
+ ; IN PHYSICAL CORE (RATHER THAN DISK OR ON ITS WAY)\r
+ TLNN T,SWP ;YES, IS JOB ON DISK OR ON ITS WAY?\r
+ JRST CHKCO2 ;NO\r
+ TLNN TAC1,INCOR ;YES, MUST JOB BE IN CORE?\r
+ JUMPE PROG,CHKCO2 ;NO, IS A SWAP FOR THIS JOB IN PROGRESS?\r
+ ; NO, SO COMMAND MUST BE DELAYED\r
+ ; (EITHER BECAUSE SWAP IN PROGRESS OR\r
+ ; JOB ON DISK AND MUST BE IN PHY CORE)\r
+ HRRI TAC1,DLYCM ;ASSUME JOB MUST BE IN PHY CORE\r
+ ; SO SET TO SWAP JOB IN\r
+ TLNN TAC1,INCOR ;IS THIS TRUE?\r
+CHKDLY: HRRI TAC1,DLYCM1 ;NO, JUST DELAY COMMAND UNTIL SWAP OUT OR IN IS FINISHED\r
+ JRST COMDIS ;AND DISPATCH TO DELAY COMMAND\r
+CHKCO2: TLNE TAC1,NOACT ;CAN COMMAND BE PERFORMED WITH ACTIVE DEVICES?\r
+ PUSHJ PDP,RUNCHK ;NO, RETURN IF JOB STOPPED AND NO ACTIVE DEVICES\r
+CHKCO1: TLNE TAC1,NOCORE ;DOES THIS COMMAND NEED CORE?\r
+ JRST COMGO ;NO, GO DISPATCH\r
+ JUMPN PROG,CHKXPN ;YES, IS CORE IN MEMORY?\r
+ JSP TAC,COMER ;NO, PRINT "NO CORE ASSIGNED"\r
+ ASCIZ /NO CORE ASSIGNED\r
+/\r
+\f\r
+CHKXPN: TLNN TAC1,PLSXPN ;DOES THIS COMMAND NEED CORE TO BE EXPANDED?\r
+ JRST COMGO ;NO\r
+ HLRE IOS,JOBHCU(JDAT) ;YES, IS CORE STILL COMPRESSED(SAVE DID NOT GO\r
+ ; TO COMPLETION)\r
+ AOJGE IOS,COMGO ;LH=-2 DURING SAVE, WHEN CORE COMPRESSED\r
+ ;LH=-1 DURING SAVE OF HIGH SEG, OR GET OF LOW\r
+ ; OR HIGH SEG\r
+ PUSHJ PDP,EXPAND ;YES, EXPAND CORE FIRST\r
+ JFCL ;IGNORE ADDRESS CHECK ERROR, WE TRIED\r
+IFN FTSWAP,<\r
+ JRST CHKDLY ;DELAY COMMAND BECAUSE COMMAND DECODER ACS ARE\r
+ ; ALL GONE, NEXT TIME JOBHCU WILL BE 0\r
+>\r
+\r
+IFE FTSWAP,<\r
+ HRRI TAC1,DLYCM1 ;DELAY COMMAND TILL NEXT CLOCK TICK\r
+ JRST COMDIS\r
+>\r
+\r
+COMER: MOVSI TAC1,NOINCK\r
+ MOVEM TAC1,(PDP)\r
+ MOVEI TAC1,CERR ;CALL ERROR MESSAGE ROUTINE\r
+\r
+COMGO: MOVSI IOS,CMWRQ\r
+ TLZN T,CMWB ;CLEAR CMWB; WAS JONB IN COMM WAIT\r
+ ANDCAM IOS,(PDP) ;NO, CLEAR REQUEU BIT IN DISP. FLAGS\r
+ MOVEM T,JBTSTS(ITEM)\r
+\r
+COMDIS: MOVEI IOS,0 ;CLEAR IOS FOR SETTING DISPATCH ADDRESSES\r
+ PUSHJ PDP,(TAC1) ;DISPATCH TO COMMAND SETUP ROUTINE.\r
+\f\r
+;RETURN FROM COMMAND SETUP ROUTINE\r
+\r
+COMRET: POP PDP,T1 ;RESTORE COMMAND FLAGS\r
+ POP PDP,DEVDAT ;RESTORE TTY DDB ADDRESS.\r
+IFN FTTTYSER,<\r
+ EXTERN TITAKR,TISYNC\r
+ LDB TEM,TITAKR(DEVDAT) ;GET BREAK CHARACTER\r
+ PUSHJ PDP,SKPBRK ;SKIP TO BREAK CHAR\r
+ SOS TISYNC(DEVDAT) ;REDUCE LINE COUNT\r
+>\r
+ MOVSI T,400000\r
+ LDB TAC,PUNIT\r
+ ANDCAM T,TTYTAB(TAC) ;YES. TURN OFF SIGN BIT\r
+ SOS COMCNT\r
+ JUMPN ITEM,COMRT1 ;DID AN ERROR OCCUR?\r
+ TLNN T1,NOJOBN ;I.E., ITEM=0 AND NOJOBN=0?\r
+ MOVSI T1,NOINCK+ERRFLG+CMWRQ ;YES, PRINT ERROR MESSAGE ONLY, AND\r
+ ;REQUEUE JOB IF NECESSARY.\r
+\r
+COMRT1: MOVE T,JBTSTS(ITEM) ;JOB STATUS WORD\r
+ TLNN T1,NOINCK ;SUPPRESS JOB INIT. CHECK?\r
+ TLOE T,JNA ;NO, IS JOB INIT BIT ALREADY SET?\r
+ JRST PCRLF ;YES.\r
+ MOVEM T,JBTSTS(ITEM) ;NO, SO SET IT THIS COMMAND\r
+ PUSHJ PDP,TTYATI ;ATTACH TTY TO JOB\r
+ JFCL ;INGORE IF CAN NOT(SHOULD NEVER HAPPEN)\r
+ PUSHJ PDP,INLMES ;AND PRINT "JOB "\r
+ ASCIZ /JOB /\r
+ MOVE TAC,ITEM ;PRINT JOB NUMBER\r
+ PUSHJ PDP,RADX10\r
+ PUSHJ PDP,PRSPC\r
+ MOVEI TAC,CONFIG ;PRINT SYSTEM CONFIGURATION NAME\r
+ PUSHJ PDP,CONMES\r
+IFN FTLOGIN, <\r
+ PUSHJ PDP,CRLF\r
+>\r
+IFE FTLOGIN, <\r
+ PUSHJ PDP,PRSPC\r
+ PUSHJ PDP,DAYTM1\r
+>\r
+\f\r
+PCRLF: TLNE T1,ERRFLG ;DID AN ERROR OCCUR?\r
+ PUSHJ PDP,PRQM ;YES. APPEND ?\r
+ TLNN T1,NOCRLF ;SUPRESS CRLF?\r
+ PUSHJ PDP,CRLF ;NO\r
+ TLNN T1,NOPER ;SUPRESS PRINTING PERIOD?\r
+ PUSHJ PDP,PRPER ;NO\r
+ JUMPE ITEM,PCRLF1 ;JOB DOES NOT RUN IF ERROR OR NO JOB NO. ASSIGNED\r
+ TLNE T1,TTYRNU ;JOB TO RUN WHEN TTY FINISHED TYPING?\r
+ ; COMMAND RESPONSE (TTY TO USER MODE)?\r
+ PUSHJ PDP,TTYUSR ;YES, CALL SCANNER ROUTINE\r
+ TLNE T1,TTYRNC ;NO. JOB TO RUN AND REMAIN IN MONITOR MODE?\r
+ PUSHJ PDP,SETRUN ;YES, CALL SCANNER ROUTINE\r
+PCRLF1: TLNN T1,NOMESS ;IS THERE A MESSAGE?\r
+ PUSHJ PDP,TTYSTR ;YES. START TTY TYPING IT OUT\r
+IFN FTSWAP, <\r
+ EXTERN PJOBN,REQUE\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
+\r
+IFN FTTTYSER, <EXTERN SPCHEK,TITAKR,GETCHR,TPOPJ\r
+\r
+SKPBRK: PUSH PDP,TAC\r
+SKPBR2: PUSHJ PDP,SPCHEK\r
+ JRST SKPBR1\r
+ TLNE TAC,BREAKB ;IS THIS CHAR THE BREAK?\r
+ JRST TPOPJ ;YES, RESTORE TAC, RETURN\r
+SKPBR1: PUSHJ PDP,GETCHR \r
+ JUMPN TEM,SKPBR2 ;LOOK FURTHER FOR BREAK\r
+ JRST TPOPJ ;UNLESS NO MORE CHARS\r
+>\r
+\f\r
+;TABLE OF CONSOLE COMMANDS\r
+\r
+INTERNAL FTATTACH,FTTIME,FTTALK,FTEXAMINE,FTLOGIN,FTREASSIGN\r
+INTERNAL FTFINISH,FTCCL\r
+\r
+;BITS CHECKED BEFORE DISPATCHING TO COMMAND SETUP ROUTINE\r
+\r
+NOCORE=400000 ;NO CORE NEEDED FOR COMMAND\r
+NOJOBN=200000 ;NO JOB NUMBER NEEDED FOR COMMAND\r
+NOLOGIN=100000 ;JOB DOES NOT NEED TO BE ALREADY LOGGED IN.\r
+NOACT=40000 ;COMMAND MUST BE DELAYED IF JOB HAS ACTIVE DEVICES.\r
+NOTRAN=20000 ;COMMAND MUST BE DELAYED IF SWAPPED TRANSFER IN PROGRESS\r
+NORUN=10000 ;AN EXPLICIT ^C MUST BE TYPED BY USER BEFORE COMMAND\r
+ ; IS EXECUTED IF JOB IS RUNNING\r
+ ; JOB MUST BE SWAPPED IN IF IT HAS LOGICAL CORE\r
+INCOR=4000 ;USED ONLY BY COMMAND DISPATCH\r
+ ; DOES NOT APPEAR IN COMMAND TABLE\r
+INCORE=4000!NOTRAN ;COMMAND MUST BE DELAYED IF JOB HAS LOGICAL CORE\r
+ ; WHICH IS ON DISK OR ON ITS WAY IN OR OUT.\r
+ ; JOB WILL BE SWAPPED IN (SEE DLYCOM)\r
+ ; AND IS NOT SITTING QUIETLY IN CORE(IE NO SWAPPING TRANSFER)\r
+PLSXPN=4 ;CORE MUST BE EXPANED IF STILL COMPRESSED BY SAVE NOT GOING\r
+ ; TO COMPLETION(CONTROL C OR DEVICE OK?)\r
+ ; MUST BE USED IN CONJUNCTION WITH COMMANDS WHICH\r
+ ; NEED CORE AND NEED IT IN CORE\r
+\r
+;BITS CHECKED AFTER RETURN FROM COMMAND SETUP ROUTINE\r
+\r
+CMWRQ=2000 ;REQUEUE JOB AFTER COMMAND WAIT\r
+NODATE=1000 ;DON'T PRINT DATE DURING JOB INTERROGATION\r
+NOINCK=400 ;NO CHECK FOR JOB INITIALIZATION (JNA=0)\r
+NOCRLF=200 ;NO PRINTING OF CRLF\r
+NOPER=100 ;NO PRINTING OF PERIOD\r
+TTYRNU=40 ;SET TTY TO USER MODE AND START JOB\r
+ ; WHEN COMMAND RESPONSE STOPS TYPING\r
+TTYRNC=20 ;KEEP TTY IN COMMAND MODE AND START JOB\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
+\r
+ERRFLG=1 ;COMMAND ERROR\r
+\f\r
+DEFINE NAMES<\r
+ C START,START,NOPER!TTYRNU!INCORE!NOACT!NORUN\r
+ C HALT,STOP,NOCORE!NOJOBN!NOLOGIN!NOINCK!CMWRQ\r
+ C KJOB,KJOB,NOCORE!NOJOBN!NOINCK!NOLOGIN!NOACT!NORUN!NOPER!NOCRLF!NOMESS!NOTRAN\r
+ C <>,CBLANK,NOCORE!NOJOBN!NOLOGIN!NOINCK!NOCRLF\r
+ C R,RCOM,NOCORE!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN\r
+ C RUN,RUNCOM,NOCORE!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN\r
+ C CORE,CORE,NOCORE!NORUN!CMWRQ!INCORE!NOACT!NOTRAN\r
+ C GET,GET,NOCRLF!NOPER!TTYRNC!NOCORE!NOACT!NORUN!NOTRAN\r
+ C SAVE,SAVE,NOCRLF!NOPER!TTYRNC!INCORE!NOACT!NORUN!PLSXPN\r
+IFN FT2REL,<\r
+ C SSAVE,SSAVE,NOCRLF!NOPER!TTYRNC!INCORE!NOACT!NORUN!PLSXPN\r
+>\r
+ C CONTINUE,CONT,NOPER!TTYRNU!INCORE!NORUN\r
+IFN FTEXAMINE,<\r
+ C D,DCOM,CMWRQ!INCORE\r
+ C E,ECOM,NOCRLF!CMWRQ!INCORE\r
+>\r
+ C PJOB,PJOB,NOCORE\r
+ C ASSIGN,ASSIGN,NOCORE\r
+ C DEASSI,DEASSIGN,NOCORE!NOJOBN!NOINCK\r
+ C DDT,DDTGO,NOPER!TTYRNU!INCORE!NORUN!PLSXPN\r
+IFN FTFINISH,<\r
+ C FINISH,CFINI,TTYRNC!NOACT!INCORE!NORUN\r
+>\r
+ C REENTER,REENTER,TTYRNU!NOPER!INCORE!NORUN!PLSXPN\r
+ C CSTART,STARTC,TTYRNC!INCORE!NOACT!NORUN!PLSXPN\r
+ C CCONTINUE,CONTC,TTYRNC!INCORE!NORUN\r
+IFN FTATTACH,<\r
+ C DETACH,DETACH,NOPER+NOCRLF+NOCORE!NOJOBN!NOINCK\r
+ C ATTACH,ATTACH,NOCORE!NOJOBN!NOLOGIN!NOINCK\r
+>\r
+ C DAYTIME,DAYTIM,NOCORE!NOJOBN!NOLOGIN!NOINCK\r
+IFN FTTIME,<\r
+ C TIME,RUNTIM,NOCORE!NOLOGIN!NOINCK\r
+>\r
+ C RESOURCES,FREDEV,NOCORE!NOJOBN!NOLOGIN!NOINCK\r
+IFN FTLOGIN,<\r
+ C SCHEDULE,SKEDUL,NOCORE!NOJOBN!NOLOGIN!NOINCK\r
+>\r
+IFN FTTALK,<\r
+ C TALK,TALK,NOCRLF+NOPER+NOCORE!NOJOBN!NOLOGIN!NOMESS!NOINCK\r
+>\r
+IFN FTLOGIN,<\r
+ C LOGIN,CLOGIN,NOCORE!NOLOGIN!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN\r
+>\r
+IFE FTLOGIN,<\r
+ C LOGIN,CPOPJ,NOCORE!NOACT!NORUN!NOTRAN\r
+>\r
+IFN FTREASSIGN,<\r
+ C REASSI,REASS,NOCORE!NOACT!INCORE!CMWRQ!NORUN\r
+>\r
+ C HELP,HELP,NOCORE!NOLOGIN!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN\r
+ C SYSTAT,SYSTAT,NOCORE!NOLOGIN!NOACT!NORUN!NOCRLF!NOPER!TTYRNU!NOTRAN\r
+IFN FTCCL,<\r
+ C COMPILE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+ C CREATE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+ C CREF,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+ C DEBUG,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+ C DELETE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+ C DIRECT,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+ C EDIT,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+ C EXECUTE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+ C LIST,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+ C LOAD,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+ C MAKE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+ C RENAME,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+ C TECO,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+ C TYPE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+ C CTEST,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN\r
+>\r
+>\r
+\f\r
+;GENERATE TABLE OF SIXBIT COMMAND NAMES\r
+\r
+DEFINE C(A,B,D) <\r
+ <SIXBIT /A/>\r
+>\r
+COMTAB: NAMES\r
+DISPL=.-COMTAB ;LENGTH OF TABLE\r
+\f\r
+;GENERATE THE DISPATCH TABLE PLUS SPECIAL BITS\r
+\r
+DEFINE C(A,B,D) <\r
+Z B (D)\r
+>\r
+DISP: NAMES\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
+;DAT = BYTE POINTER TO LAST OUTPUT CHARACTER\r
+;DEVDAT = ADDRESS OF DEVICE DATA BLOCK INITIATING COMMAND\r
+;JDAT = ADDRESS OF JOB DATA AREA, = 0 IF NO JOB AREA\r
+;PROG=XWD PROTECTION,RELOCATION; 0 IF NO CORE\r
+;IOS=0\r
+\r
+;UPON RETURN FROM COMMAND SETUP ROUTINE, A CR-LF IS ADDED IF\r
+;NEEDED AND TTY IS STARTED\r
+\r
+;SINCE THE COMMAND DECODER IS CALLED FROM THE CLOCK ROUTINE\r
+;COMMAND SETUP ROUTINES MUST RUN TO COMPLETION QUICKLY\r
+;IF A COMMAND FUNCTION CANNOT DO THIS, IT MUST JUST SET\r
+;THE JOB TO A RUNABLE STATUS AND RETURN IMMEDIATELY\r
+\r
+ EXTERN TTYFNU\r
+\r
+COR0: JUMPE PROG,CPOPJ ;RETURN IF JOB DOES NOT HAVE CORE\r
+ \r
+ JSP TAC1,MONJOB ;SET TO RUN MONITOR JOB(PC IN EXEC MODE)\r
+ ; RETURN HERE AT UUO LEVEL(NO ACS SET UP)\r
+ MOVEI TAC1,ESTOP ;PUT ERROR STOP ON END OF PDL\r
+ JSP TAC,MONSTR ;START MONITOR JOB BY SETTING UP ACS AND\r
+JOB1: PUSHJ PDP,RESET ;RELEASE ALL IO DEVICES ASSIGNED TO THIS JOB\r
+ PUSHJ PDP,TTYFNU ;FIND TTY FOR THIS JOB(SETUP ITEM WITH JOB NO.)\r
+IFN FTSWAP,<\r
+ EXTERN ZERSWP,NOCORQ\r
+ PUSHJ PDP,NOCORQ ;PUT JOB IN NO CORE Q\r
+ PUSHJ PDP,ZERSWP ;CLEAR SWAP SPACE (IF ANY) FOR LOW SEG\r
+ ; AND CLEAR SWP,SHF,IMGIN,IMGOUT FOR LOW SEG\r
+>\r
+IFN FT2REL,<\r
+ EXTERN KILHGH\r
+ PUSHJ PDP,KILHGH ;HIGH SEG FOR THIS USER. RETURN CORE\r
+ ; REMOVE HIGH SEG FROM THIS USER LOGICAL ADDRESSING SPACE\r
+ ; IF NO OTHER USERS IN CORE ARE USING IT\r
+ ; RETURN DISKL SPACE IF NO LONGER SHARABLE HIGH SEG\r
+>\r
+ MOVEI TAC,0 ;RETURN BOTH PHYSICAL AND LOGICAL CORE\r
+ SOS (PDP) ;NEGATE SKIP RETURN WHICH CORE1 WILL DO\r
+ JRST CORE1 ;GO DO IT AND RETURN TO CALLER\r
+\f\r
+; "PJOB" PRINT JOB NUMBER OF JOB TTY IS ATTACHED TO\r
+\r
+INTERNAL PJOB,DECLF\r
+\r
+PJOB: MOVE TAC,ITEM ;JOB NO.\r
+DECLF: PUSHJ PDP,RADX10 ;PRINT TAC AS DEC. THEN CRLF\r
+ JRST CRLF\r
+\r
+; "KJOB" KILL ATTACHED JOB\r
+\r
+EXTERNAL JBTSTS,TTYKILM,CPOPJ\r
+INTERNAL FTTIME,JOBKL\r
+\r
+KJOB: JUMPE ITEM,JOBKB ;WAS JOB INITIALIZED?\r
+IFN FTLOGIN,<\r
+ TLZN T,JLOG+JACCT ;TEST JACCT ALSO IN CASE COMMAND WAS DELAYED\r
+ JRST KJOB2 ;IF JOB NOT LOGGED IN\r
+ TLO T,JACCT ;DISABLE ^C\r
+ MOVEM T,JBTSTS(ITEM)\r
+IFN FTSWAP, <\r
+ PUSHJ PDP,ALOGN1 ;ATTACH TTY\r
+>\r
+ MOVSI TAC,TTYRNU+NOMESS\r
+ XORM TAC,-1(PDP) ;SET TTYRNU AND CLEAR NOMESS FOR COMRET\r
+ MOVE TAC,[SIXBIT /LOGOUT/] ;NAME OF CUSP\r
+ JRST ARCOM\r
+>\r
+KJOB2:\r
+IFE FTSWAP+FTLOGIN,<\r
+ JUMPE PROG,JOBKA ;YES. DOES JOB HAVE CORE IN MEMORY?\r
+>\r
+ PUSHJ PDP,GETMIN ;GET MINIMAL JOB AREA ON DISK OR CORE\r
+ JUMPE PROG,DLYCM1 ;DELAY COMMAND IF CORE ASSIGNED ON DISK\r
+ JSP TAC1,MONJOB ;YES, SCHEDULE MONITOR JOB(PC IN EXEC MODE)\r
+ ;RETURN HERE AT UUO LEVEL WHEN SCHEDULED\r
+JOBKL: MOVEI TAC1,ESTOP ;PUT ESTOP ON END OF PDL\r
+ JSP TAC,MONSTR ;GO SETUP ACS AND PD LIST\r
+ PUSHJ PDP,JOB1 ;FLUSH CORE AFTER RELEASING DEVICES\r
+JOBKA:\r
+IFN FTTIME,<\r
+IFE FTLOGIN, <\r
+ PUSHJ PDP,PRTTIM ;PRINT JUST TOTAL RUN TIME\r
+ PUSHJ PDP,TTYSTR ;START TTY\r
+>>\r
+ PUSHJ PDP,DEASTY ;DEASSIGN ALL BY TTY\r
+ PUSHJ PDP,TTYKIL ;RETURN TTY TO VIRGIN STATE\r
+ JRST KSTOP ;CLEAR JOB STATUS WORD AND STOP JOB\r
+\r
+;ERROR IN COMMAND\r
+\r
+CERR: JRST ERRMES\r
+\r
+JOBKB: SETZM -1(PDP) ;CLEAR NOJOBN SO COMRET WILL PRINT ERROR MSG.\r
+ JRST ATT4 ;"NOT A JOB"\r
+\f\r
+; "START L" OR "START" - START AT LOC, L OR STARTING ADDRESS\r
+INTERNAL FT2REL\r
+EXTERNAL JOBSA\r
+\r
+START: ;SAME AS CSTART, DIFF BY COMTAB BITS\r
+ ; WHICH PUT TTY IN MONITOR OR USER MODE\r
+\r
+; "CSTART L" OR "CSTART" - START AT LOC. L(TTY IN COMMAND MODE)\r
+\r
+STARTC: PUSHJ PDP,OCTIN ;CONVERT POSSIBLE OCTAL NO ARG.\r
+IFE FT2REL,<\r
+ SKIPA TAC1,JOBSA(JDAT) ;NO START ADR. SPECIFIED RETURN\r
+>\r
+IFN FT2REL,<\r
+ JRST SNOARG ;NO ARG SPECIFIED RETURN\r
+>\r
+ JRST COMERA ;ILLEGAL CHARACTER\r
+IFN FT2REL,<\r
+ EXTERN CHKMED\r
+ PUSHJ PDP,CHKMED ;CHECK TO SEE IF HIGH SEG WHICH IS SHARABLE\r
+ ; IF YES, TURN ON USER MODE WRITE PROTECT\r
+ ; FOR THIS USER, AND SET MEDDLE BIT SO HE CANNOT\r
+ ; TURN UWP OFF.>\r
+ JRST CHKSTR ;START JOB WITH PC IN USER MODE,\r
+ ; IF START ADR IS NON-ZERO\r
+IFN FT2REL,<\r
+SNOARG: SKIPA TAC1,JOBSA(JDAT) ;NO. ARG SPECIFIED, USE START ADR SUPPLIED\r
+ ; BY PROGRAM END STATEMENT AND STORED BY LINKING LOADER\r
+ ; SKIP INTO REENTER, START WITH PC IN USER MODE\r
+>\r
+\f\r
+;"REENTER" - REENTER USER PROGRAM\r
+\r
+EXTERNAL JOBREN\r
+\r
+REENTER:MOVE TAC1,JOBREN(JDAT) ;GET REENTER ADDRESS FORM JOB DATA AREA\r
+ JRST CHKSTR ;START JOB WITH PC IN USER MODE\r
+ ; IF START ADR IS NON-ZERO\r
+\r
+; "DDT" - START EXECUTION AT DDT IN USER AREA\r
+\r
+ EXTERN JOBDDT\r
+\r
+DDTGO: MOVE TAC1,JOBDDT(JDAT) ;DDT STARTING ADR. IN JOB DATA AREA\r
+ ; FALL INTO CHSTR\r
+\r
+;ROUTINE TO CHECK TO SEE IF STARTING ADDRESS IS NON-ZERO, AND START USER IF OK\r
+\r
+CHKSTR: JUMPN TAC1,USTART ;IS IT NON-ZERO?, IS YES\r
+ ; STORE OLD PC IN JOBOPC IN JOB DATA AREA\r
+ ; THEN START WITH PC IN USER MODE\r
+ JSP TAC,ERRMES ;NO, PRINT "NO START ADR"\r
+ ASCII /NO START ADR\r
+/\r
+\f\r
+; "STOP" OR "<CONTROL>C"\r
+;SCANNER ROUTINES DUMMY UP STOP WHEN CONTROL C TYPED IN\r
+;STOP MUST BE DELAYED IF THIS JOB IS SYSTEM TAPE USER\r
+;AND SYSTEM TAPE IS ACTIVE, OTHERWISE, THE JOB WILL NOT BE\r
+;STOPPED WHEN DONE USING THE SYSTEM TAPE.\r
+\r
+INTERNAL FTDISK\r
+EXTERNAL STUSER,JOB,PJBSTS,IOWQ,JOBDAC\r
+\r
+STOP: JUMPE ITEM,STOP8 \r
+ CAMN ITEM,STUSER ;IS THIS SYSTEM TAPE USER?\r
+ JRST CFINS ;YES, DO FINISH SYS COMMAND\r
+IFN FTDISK,<\r
+ \r
+ PUSHJ PDP,STOPCK ;CAN THE JOB STOP?\r
+ JRST DLYCM1 ;NO. DELAY IT.\r
+>\r
+ PUSHJ PDP,STOP1 ;STOP JOB\r
+STOP8: IFE FTTTYSER,<\r
+ JSP TAC,CONMES ;PRINT "^C CRLF CRFL PERIOS"\r
+ ASCIZ /^C\r
+/\r
+>\r
+IFN FTTTYSER,< POPJ PDP,0>\r
+\r
+; "CONTC" - CONTINUE EXECUTION(TTY REMAINS IN COMMAND MODE)\r
+\r
+CONTC: ;SAME AS CONT\r
+\r
+; "CONT" - CONTINUE EXECUTION FROM WHERE LEFT OFF\r
+EXTERNAL JBTSTS\r
+\r
+CONT: MOVSI TAC1,JERR\r
+ TDNN TAC1, JBTSTS(ITEM) ;IS JOB ERROR BIT SET?\r
+ POPJ PDP, ;COMMAND DECODER WILL DO REST\r
+ JSP TAC,ERRMES ;YES, PRINT CANT CONTINUE\r
+\r
+ ASCIZ /CAN'T CONTINUE\r
+/\r
+\f\r
+; "CORE #" - ASSIGNS #*1024 WORDS OF CORE TO JOB\r
+; "CORE" WITH NO ARG. WILL PRINT NO OF FREE BLOCKS LEFT\r
+; WITHOUT AFFECTING CURRENT ASSIGNMENT OF CORE\r
+; JOB NOT IN MIDDLE OF SWAPPING\r
+; EITHER ON DISK OR CORE OR NEITHER PLACE\r
+\r
+EXTERNAL PCORSZ\r
+\r
+CORE: PUSHJ PDP, DECIN ;GET NO. OF 1K BLOCKS\r
+ JRST COR3 ;NO ARG. SPECIFIED, JUST TYPE FREE BLOCK LEFT\r
+ JRST COMERA ;ILLEGAL DECIMAL CHARACTER RETURN\r
+IFE FTSWAP,<\r
+ JUMPE TAC1,COR0 ;RELEASE DEVICES IF USER ASKING FOR 0 CORE\r
+>\r
+IFN FTSWAP,<\r
+ JUMPE TAC1,COR1 ;ASSIGN JUST MINIMAL CORE AND RELEASE DEVICES\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
+ POPJ PDP, ;OK RETURN, CORE ASSIGNED ON DISK OF MEMORY\r
+IFN FTSWAP,<\r
+;USER ASKING FOR 0K\r
+COR1: JUMPN PROG,COR0 ;GO RELEASE ALL DEVICES IF HE HAS CORE IN MEMORY YET\r
+ PUSHJ PDP,GETMIN ;NO, CORE ON DISK OR HAS NONE, ASSIGN MINIMAL\r
+ ; AREA(FLUSH HIGH SEG TOO) IN CORE OR DISK\r
+ JRST DLYCM ;AND DELAY COMMAND TILL CORE IS IN MEMORY\r
+ ; DLYCM WILL SWAP IT IN.\r
+>\r
+\f\r
+COR2: IFN FTTTYSERM,<\r
+ MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB ADR\r
+>\r
+ PUSHJ PDP,INLMES ;PRINT ? FOR PATCH\r
+ ASCIZ /?\r
+/\r
+COR3: PUSHJ PDP,PRTSEG ;PRINT SIZE OF LOW SEG\r
+IFN FT2REL,<\r
+ EXTERN PRTHGH\r
+ PUSHJ PDP,PRTHGH ;PRINT SIZE OF HIGH SEG (+0 IF NONE)\r
+ ; NOTHING IF NOT 2 REG. MACHINE OR SOFTWARE\r
+>\r
+ PUSHJ PDP,INLMES\r
+ ASCIZ "/"\r
+\r
+IFE FTSWAP,<\r
+ EXTERN CORTAL\r
+ MOVE TAC,CORTAL ;NO. OF FREE 1K BLOCKS\r
+>\r
+IFN FTSWAP,<\r
+ EXTERNAL CORMAX\r
+ MOVE TAC,CORMAX ;PRINT MAX. NO. OF BLOCKS IN PHYSICAL CORE\r
+ LSH TAC,-12 ;AVAILABLE TO A SINGLE USER(AS SET\r
+ ; BY BUILD AND/OR ONCE)\r
+>\r
+ PUSHJ PDP,RADX10 ;PRINT NO. OF 1K BLOCKS AVAILABLE\r
+IFE FTSWAP,<\r
+ JSP TAC,CONMAS\r
+ ASCIZ /K CORE\r
+/\r
+>\r
+IFN FTSWAP,<\r
+ EXTERN VIRTAL\r
+ PUSHJ PDP,INLMES\r
+ ASCIZ /K CORE\r
+VIR. CORE LEFT =/\r
+ MOVE TAC,VIRTAL ;PRINT AMOUNT OF FREE SWAP SAPCE LEFT\r
+ JRST RADX10 ;IN DECIMAL\r
+>\r
+\f\r
+; "SSAVE FILENAM.EXT [PROJ,PROG] CORE"\r
+;WORKS LIKE SAVE, EXCEPT THAT HIGH SEG IS SAVED AS SHARABLE(EXT=SHR)\r
+;INSTEAD OF NON-SHARABLE(EXT=HGH)\r
+\r
+; "SAVE FILE-NAME[PROJ.,PROG.] CORE" - SAVES JOB AREA ON RETRIEVABLE DEVICE\r
+;ONLY A SAVE OR A GET IN PROGRESS FOR EACH JOB\r
+;NO ATTEMPT IS MADE TO SAVE DEVICE ASSGINMENTS, AC'S OR PC\r
+\r
+SAVE:IFN FT2REL,<\r
+ TLO IOS,NSRBIT ;SET FLAGE FOR NON-SHARABLE EXT(HGH)\r
+>\r
+SSAVE: HRRI IOS,SAVJOB ;SETUP TO RUN SAVEJOB (IOS CLEARED BEFORE\r
+ PUSHJ PDP,CTEXT1 ;DISPATCH\r
+ SETZM JBTPRG(ITEM) ;CLEAR JOB'S PROGRAM NAME FOR ROOM\r
+ JRST SGSET\r
+\r
+; "GET DEVICE:FILE-NAME[PROJ.,PROG.] CORE" - SETS UP JOB AREA FROM RETREIVABLE\r
+\r
+;DEVICE AND ASSIGNS CORE.\r
+\r
+GET: MOVEI IOS,GETJOB ;SETUP TO RUN GETJOB\r
+ PUSHJ PDP,CTEXT1 ;GET DEVICE NAME\r
+ SETZM JBTPRG(ITEM) ;CLEAR NAME FOR RCOM\r
+ JRST RUNCM \r
+ ; JOB DATA AREA FOR MONITOR JOB\r
+\r
+IFN FTLOGIN,< ;AUTOMATIC LOGIN AFTER DSK REFESH OR WHEN REFLAG SET\r
+\r
+EXTERNAL REFLAG\r
+\r
+LOGREF: MOVEM TAC,PRJPRG(ITEM) ;PRJ,PRG NRS. IN REFLAG\r
+ MOVSI TAC,JLOG\r
+ IORM TAC,JBTSTS(ITEM)\r
+ SETZM -1(PDP) ;CLEAR ALL FLAGS FOR COMRET\r
+ SETZM REFLAG ;ONLY ONCE\r
+ POPJ PDP,\r
+>\r
+\f\r
+;"HELP" -HELP COMMAND\r
+\r
+INTERNAL FTLOGIN\r
+\r
+IFN FTLOGIN,< EXTERNAL HELPPP\r
+HELP1:\r
+ MOVE TAC,HELPPP\r
+ TLN T,JLOG\r
+ JRST ALOGIN\r
+ POPJ PDP,\r
+>\r
+\r
+HELP: IFN FTLOGIN,<\r
+ PUSHJ PDP,HELP1\r
+>\r
+ MOVE TAC,[SIXBIT /HELP/] ;CUSP NAME\r
+ JRST ARCOM ;RUN IT\r
+\r
+SYSTAT: IFN FTLOGIN,<\r
+ PUSHJ PDP,HELP1\r
+>\r
+ MOVE TAC,[SIXBIT /SYSTAT/] ;CUSP NAME\r
+ JRST ARCOM ;RUN IT\r
+\r
+EXTERNAL JBTSTS,TTYATT\r
+\r
+ALOGIN:\r
+INTERNAL FTLOGIN\r
+IFN FTLOGIN,< EXTERNAL PRJPRG\r
+ MOVEM TAC,PRJPRG(ITEM)\r
+ MOVSI TAC,JLOG\r
+ ANDCAM TAC,JBTSTS(ITEM)\r
+>\r
+IFN FTSWAP,<EXTERNAL TTYATT\r
+ALOGN1: PUSHJ PDP,TTYATT ;MAKE SURE TTY IS ATTACHED IN CASE\r
+ ; THIS COMMAND MUST BE DELAYED\r
+ ; BECAUSE NO CORE YET.\r
+ JFCL\r
+>\r
+ POPJ PDP,\r
+\f\r
+INTERN FTCCL\r
+\r
+IFN FTCCL,<\r
+\r
+CCLRUN: MOVE TAC,[SIXBIT /COMPIL/] ;CUSP NAME\r
+ JRST ARCOM ;RUN IT\r
+>\r
+;"LOGIN" - LOGIN COMMAND\r
+\r
+INTERNAL FTLOGIN\r
+IFN FTLOGIN,<\r
+\r
+EXTERNAL SYSPP\r
+\r
+LOGDET: JSP TAC,ERRMES\r
+ ASCIZ /PLEASE KJOB OR DETACH\r
+/\r
+CLOGIN: TLNE T,JLOG ;FORCE USER TO LOGOUT BEFORE\r
+ JRST LOGDET ; LOGGING IN ANEW.\r
+IFN FTSWAP,<\r
+ EXTERN VIRTAL,LOGSIZ\r
+ MOVE TAC,VIRTAL ;AMOUNT OF FREE VIRTUAL CORE LEFT\r
+ CAIL TAC,LOGSIZ ;IS THERE AT LEAST 2K FOR LOGIN?\r
+ ; CUSTOMER CAN REDEFINE TO BE BIGGER THAN 2\r
+ ; WITH MONGEN DIALOG\r
+ JRST CLOG2 ;YES,\r
+ MOVEI ITEM,0 ;NO, SET JOB NUMBER TO 0 FOR COMMAND DECODER\r
+ JRST COR2 ;AND GO TELL USER AMOUNT OF CORE LEFT\r
+>\r
+CLOG2: SKIPE TAC,REFLAG ;REFLAG SET NON-ZERO FOR AUTOMATIC LOGIN?\r
+ JRST LOGREF ;YES, LOG USER IN WITHOUT RUNNING CUSP\r
+ ; SO HE CAN RELOAD THE DISK AFTER REFRESH\r
+ MOVE TAC,SYSPP ;SET PRJPRG TO SYSPP\r
+ PUSHJ PDP,ALOGIN ;AUTOMATIC LOGIN\r
+ MOVSI TAC,JACCT ;FLAG LOGIN OR LOGOUT RUNNING AND\r
+ IORM TAC,JBTSTS(ITEM);DISABLE ^C,\r
+ MOVE TAC,[SIXBIT /LOGIN/] ;CUSP NAME\r
+ JRST ARCOM ;RUN IT\r
+>\r
+\f\r
+; "R CUSTNAME CORE" - DOES "RUN SYS:CUSPNAME"\r
+\r
+RCOM: MOVEI TAC,0 ;NO FILE NAME, TTY WILL SUPPLY IT\r
+ JRST ARCOM1\r
+\r
+ARCOM: IFN FTTTYSER,< PUSHJ PDP,SKPBRK>\r
+ARCOM1: MOVEM TAC,JBTPRG(ITEM) ;STORE FILE NAME\r
+ MOVSI TAC1,(SIXBIT /SYS/) ;READ FROM SYS DEVICE\r
+ JRST RUNCO2\r
+; "RUN DEVICE:FILE[PROJ.PROG.] (CORE)"\r
+;DOES A CORE,GET,START ALL IN ONE\r
+;IF CORE ARG IS MISSING. SIZEIN DIRECTORY IS USED\r
+;JOB ON DISK OR IN CORE OR NO CORE, BUT NOT IN MIDDLE OF SWAP\r
+\r
+EXTERNAL JOBDA\r
+\r
+RUNCOM: PUSHJ PDP,CTEXT1 ;GET DEVICE NAME FROM COMMAND STRING\r
+ SETZM JBTPRG(ITEM) ;CLEAR FILE NAME\r
+RUNCO2:RUNC1: MOVEI IOS,RUNJOB\r
+RUNCM: PUSHJ PDP,GETMIN ;GET MININAL JOB AREA IN CORE OR DISK\r
+ JUMPN PROG,SGSET ;WAS CORE ASSIGNED IN MEMORY? IF YES, GO SCANARGS\r
+IFE FTSWAP,<\r
+ JRST COR2 ;NO. PRINT "0K CORE LEFT"\r
+>\r
+IFN FTSWAP,<\r
+ JRST DLYCM ;NO. DELAY COMMAND UNTIL IN CORE\r
+>\r
+\f\r
+; "ASSIGN DEV:NAME" - ASSIGN DEVICE TO JOB AND GIVE IT LOGICAL NAME\r
+\r
+EXTERNAL DEVLST,PJOBN,SYSTAP\r
+\r
+ASSIGN: PUSHJ PDP, CTEXT1 ;GET FIRST ARGUMENT\r
+ JUMPE TAC1, NOTENF ;NO ARGUEMNT TYPED IF 0\r
+IFN FTLOGIN,<EXTERN PRJPROG\r
+ CAME TAC,[SIXBIT .SYS.]\r
+ JRST ASSG6\r
+ HLRZ T1,PRJPRG(ITEM)\r
+ CAIN T1,1 ;PROJECT NR, 1?\r
+ JRST ASSG7 ;YES\r
+ASSG6:\r
+>\r
+ MOVE T1, TAC1 ;SAVE DEVICE NAME\r
+IFN FTTTYSER,<\r
+ PUSH PDP,DEVDAT ;SAVE TTY\r
+>\r
+IFE FTTTYSER,<\r
+\r
+ PUSH PDP, TAC ;SAVE INPUT BYTE POINT\r
+>\r
+ MOVE TAC,TAC1\r
+ PUSHJ PDP,DEVPHY\r
+ JRST ASSG3\r
+ MOVEI TAC1,ASSCON\r
+ JRST ASSG4\r
+ASSG3: MOVEI TAC1,ASSCON ;SETUP ASSIGNED BY CONSOLE BIT\r
+ HLRZ DEVDAT, DEVLST\r
+ASSG0: MOVE TAC,DEVNAM(DEVDAT)\r
+ CAME T1,DEVNAM(DEVDAT) ;DOES PHYSICAL NAME MATCH?\r
+ JRST ASSG1 ;NO\r
+ASSG4: CAMN T1,[SIXBIT /DSK/] ;IS THIS A DISC?(IF YES,\r
+ JRST ASSG5 ;BYPASS CHECK FOR SYSTEM TAPE AND ASSIGN BELOW\r
+ CAMN TAC,SYSTAP ;IS NEXT DEVICE IN LIST THE SYSTEM TAPE?\r
+ JRST ASSFIN ;YES, DO NOT ASSIGN. CLEAR DIRECTORY IN CORE BIT\r
+ASSG5: PUSHJ PDP,ASSASG ;NO, TRY TO ASSGIN DEVICE\r
+ JRST ASSER1 ;ALREADY ASSIGNED TO ANOTHER JOB\r
+ JRST ASSFIN ;ASSIGNED\r
+\f\r
+;SYSTEM TAPE OR NOT MATCH OF ARG AND PHYSICAL NAME.\r
+\r
+ASSG1: CAMN TAC,SYSTAP ;IS THIS SYSTEM TAPE?\r
+ JRST ASSG2 ;YES\r
+ LDB T, PJOBN ;SAVE OLD JOB NUMBER FOR THIS DEVICE\r
+ TRZ TAC,-1 ;COMAPRE LEFT HALF ONLY\r
+ CAMN TAC, T1\r
+ PUSHJ PDP, ASSASG ;MATCH. TRY TO ASSIGN IT\r
+ JRST ASSG2 ;KEEP LOOKING\r
+ JUMPE T,ASSFIN ;IF OLD JOB NUMBER 0, DEVICE PREVIOSLY UNASSIGNED\r
+\r
+ASSG2: HLRZ DEVDAT, DEVSER(DEVDAT)\r
+ JUMPN DEVDAT, ASSG0\r
+IFN FTTTYSER,<\r
+ POP PDP,DEVDAT ;RESTORE TTY DDB\r
+>\r
+IFE FTTTYSER,<\r
+ POP PDP, TAC\r
+>\r
+ JRST NOTDEV ;PRINT NO SUCH DEVICE\r
+\r
+IFN FTLOGIN,<EXTERN STREQ,SYSTAP\r
+ASSG7: PUSHJ PDP,CTEXT1\r
+ JUMPE TAC1,NOTENF\r
+ SKIPL STREQ\r
+ JRST DLYCM1\r
+ MOVEM TAC1,SYSTAP\r
+ POPJ PDP,\r
+>\r
+\f\r
+;ALREADY ASSIGNED TO ANOTHER JOB\r
+ASSER1:\r
+IFE FTTTYSER,<\r
+ PDP PDP, TAC\r
+ MOVEI TAC, ASSMS2\r
+ PUSHJ PDP,ERRMES\r
+ LDB TAC, PJOBN\r
+ JRST DECLF ;PRINT JOB NUMBER CRLF\r
+>\r
+IFN FTTTYSER,<\r
+ LDB TAC,PJOBN ;GET JOB NUMBER FOR DEVICE\r
+ POP PDP,DEVDAT ;GET DDB FOR TTY\r
+ PUSH PDP,TAC ;SAVE JOB NO.\r
+ MOVEI TAC,ASSMS2 ;TYPE ERROR MESSAGE\r
+ PUSHJ PDP,ERRMES\r
+ POP PDP,TAC ;GET JOB NO. BACK\r
+ JRST DECLF ;AND TYPE IT\r
+>\r
+\r
+ASSMS2: ASCIZ /ALREADY ASSIGNED TO JOB /\r
+\f\r
+;DEVICE ASSIGNED, GIVE IT A LOGICAL NAME\r
+ASSFIN: SETZM DEVLOG(DEVDAT) ;CLEAR LOGICAL NAME\r
+IFE FTTTYSER,<\r
+ POP PDP,TAC ;RESTORE INPUT BYTE POINTER\r
+ PUSH PDP,DEVDAT ;SAVE DDB ADDRESS\r
+>\r
+IFN FTTTYSER,<\r
+ EXCH DEVDAT,0(PDP) ;GET TTYDDB, SAVE DEVICE DDB\r
+>\r
+ PUSHJ PDP,CTEXT1 ;GET SECOND ARG, LOGICAL DEVICE NAME\r
+ SKIPE TAC,TAC1 ;IS THERE A LOGICAL NAME SPECIFIED?\r
+ PUSHJ PDP, DEVLG ;YES, SEE IF IT IS ALREADY IN USE\r
+ ; BY THIS USER\r
+ JRST ASSG1 ;NO \r
+ MOVEI TAC,LOGERR ;YES, PRINT ERROR\r
+ MOVE DEVDAT,-3(PDP) ;RESTORE TTY DDB\r
+ PUSHJ PDP,ERRMES\r
+ MOVEI TAC,0 ;CLEAR LOGICAL NAME FOR THIS DEVICE\r
+ASSF1: POP PDP,DEVDAT\r
+ MOVEM TAC,DEVLOG(DEVDAT);STORE IN DEVICE DATA BLOCK\r
+ MOVSI TAC1,DVDIRIN ;CLEAR DIRECTORY IN CORE BIT\r
+ ANDCAB TAC1,DEVMOD(DEVDAT) ;SETUP TAC1 WITH DEVICE CHARACTERISTICS FOR ASGHGH\r
+IFN FT2REL,<\r
+ EXTERN ASGHGH\r
+ PUSHJ PDP,ASGHGH ;GO CHECK IF THIS DEVICE HAS INITIALIZED ANY SHARED SEGMENTS\r
+ ; IF YES, CLEAR SEG NAMES SO NO NEW SHARING (DTA,MTA ONLY)\r
+>\r
+ MOVE TAC1,DEVNAM(DEVDAT) ;PHYSICAL NAME\r
+ MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB\r
+ PUSHJ PDP,PRNAME ;PRINT IT\r
+ JSP TAC,CONMES\r
+\r
+ ASCIZ / ASSIGNED\r
+/\r
+\r
+LOGERR: ASCIZ /LOGICAL NAME ALREADY IN USE. /\r
+\f\r
+;"DEASSIGN DEV" - DEASSIGNS DEVICE FROM CONSOLE\r
+\r
+INTERNAL NOTDEV\r
+\r
+DEASSI: JUMPE ITEM,CPOPJ ;NO-OP IF NO JOB NUMBER\r
+ PUSHJ PDP,CTEXT1 ;GET DEVICE NAME\r
+ JUMPE TAC1,DEASTY ;NO ARG. IF 0, DEASSIGN ALL BY TTY\r
+ MOVE TAC, TAC1 ;DEVICE NAME\r
+ PUSHJ PDP, DEVSRC ;SEARCH FOR DEVICE\r
+ JRST DEAER1 ;NOT FOUND\r
+ PUSHJ PDP, DEASG ;FOUND, DEASSIGN IT\r
+ JRST DEAER2 ;NOT PREVIOUSLY ASSIGNED\r
+ POPJ PDP, ;DEVICE DEASSIGNED\r
+\r
+NOTDEV:\r
+DEAER1: MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB\r
+ JSP TAC,ERRMES ;PRINT NO SUCH DEVICE\r
+\r
+ ASCIZ /NO SUCH DEVICE\r
+/\r
+\r
+DEAER2: MOVE TAC1,DEVNAM(DEVDAT) ;PRINT PHYSICAL DEVICE NAME\r
+ MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB\r
+ PUSHJ PDP,PRNAME\r
+ JSP TAC,ERRMES\r
+\r
+ ASCIZ / WASN'T ASSIGNED\r
+/\r
+\f\r
+INTERNAL FTREASSIGN\r
+IFE FTREASSIGN,<\r
+REASSI=UUOERR\r
+>\r
+\r
+IFN FTREASSIGN,<\r
+\r
+;REASSIGN UUO\r
+;CALL MOVE AC,JOB NUMBER\r
+; MOVE AC+1,SIXBIT /DEVICE/\r
+; CALL AC,[SIXBIT /REASSIGN/]\r
+;IF C(AC)=0, JOB HAS NOT BEEN INITIALIZED\r
+;IF C(AC+1)=0, DEVICE NOT ASSIGNED TO THIS JOB OR DEVICE IS A TTY\r
+\r
+INTERNAL REASSIGN\r
+EXTERNAL PUUOAC,JOB\r
+\r
+REASSI: LDB UUO,PUUOAC\r
+ HRLI UUO,PROG\r
+ PUSH PDP,@UUO ;STACK JOB NUMBER TO BE REASSIGNED TO\r
+ AOS UUO\r
+ MOVE TAC1,@UUO ;DEVICE NAME\r
+ MOVE ITEM,JOB ;THIS JOB NUMBER\r
+ SOJA UUO,REASS1\r
+\r
+;"REASSIGN DEV:JOB" - REASSIGN DEVICE "DEV" TO JOB "JOB"\r
+\r
+REASS:\r
+ PUSHJ PDP,CTEXT ;GET DEVICE NAME\r
+ JUMPE TAC,NOTENF ;NULL NAME?\r
+ MOVE UUO,TAC1 ;SAVE IT IN UUO\r
+ PUSHJ PDP,DECIN1 ;GET NEW JOB NUMBER\r
+ JRST NOTENF ;NONE SPECIFIED, DOESN'T RETURN IF ERROR\r
+ JRST COMERA ;ILLEGAL CHARACTER\r
+ PUSH PDP,TAC1 ;PUT JOB NUMBER ON STACK, DEVICE\r
+ MOVE TAC1,UUO ;NAME IN TAC1\r
+ SETZM UUO ;SET COMMAND SWITCH\r
+\f\r
+;ROUTINE COMMON TO REASSIGN UUO AND COMMAND\r
+\r
+EXTERNAL JBTSTS,PJOBN,JOBFDV\r
+\r
+REASS1: EXCH ITEM,(PDP) ;NEW JOB NO. IN ITEM\r
+ CAILE ITEM,JOBN ;IS JOB NUMBER OUT OF RANGE\r
+ JRST REASE2 ;YES, DO NOT REASSIGN\r
+ MOVE TAC,JBTSTS(ITEM) ;NEW JOB STATUS\r
+ EXCH ITEM,(PDP) ;RESTORE ITEM AND STACK\r
+ TLNN TAC,JNA ;DOES NEW JOB EXIST?\r
+ JRST REASE1 ;NO.\r
+ MOVE TAC,TAC1\r
+ PUSHJ PDP,DEVSRC ;SEARCH FOR DEV\r
+ JRST REASE2 ;NOT FOUND\r
+ LDB TAC,PJOBN\r
+ CAME TAC,ITEM ;ASSIGNED TO THIS JOB\r
+ JRST REASE3 ;NO\r
+ MOVE TAC,DEVMOD(DEVDAT)\r
+\r
+ TLNE TAC,DVTTY ;IS IT A TTY?\r
+ JRST REASE6 ;YES. CAN'T BE REASSIGNED\r
+ TRNN TAC,ASSPRG ;IS DEVICE INITED?\r
+ JRST REASS3 ;NO.\r
+ JUMPN UUO,REASS4 ;YES. COMMAND LEVEL?\r
+ HRL DEVDAT,(PDP) ;YES. SCHEDULE RELEASE\r
+ MOVEM DEVDAT,JOBFDV(JDAT)\r
+ POP PDP,TAC1\r
+ MOVE DEVDAT,-2(PDP)\r
+ MOVSI TAC1,TTYRNC ;SET TTYRNC SO JOB WILL RUN\r
+ IORM TAC1,-1(PDP)\r
+ JSP TAC1,MSTART\r
+ JSP TAC,MONSTR\r
+ HLRZ TAC,JOBFDV(JDAT)\r
+ PUSH PDP,TAC\r
+ HRRZ DEVDAT,JOBFDV(JDAT)\r
+ MOVE ITEM,JOB\r
+ SETOM UUO ;SET FLAG TO STOP JOB\r
+REASS4: HRRZ DSER,DEVSER(DEVDAT)\r
+ HRRZM DEVDAT,JOBFDV(JDAT)\r
+ MOVE UCHN,USRHCU\r
+\f\r
+REASS2: MOVE DEVDAT,USRJDA(UCHN) ;GET XWD UUO BITS,DDB ADDRESS\r
+ HRRZ TAC,JOBFDV(JDAT) ;GET ADDR. OF DDB SAVED BY COMMAND\r
+ PUSH PDP,UCHN ;SAVE USER CHANNEL\r
+ CAIN TAC,(DEVDAT) ;IS CHOSEN DEVICE ON THHS CHANNEL?\r
+ PUSHJ PDP,RELEA5 ;YES, RELEASE DEVICE\r
+ POP PDP,UCHN\r
+ SOJGE UCHN,REASS2\r
+ MOVE DEVDAT,JOBFDV(JDAT)\r
+ MOVE ITEM,JOB ;CURRENT JOB NUMBER\r
+REASS3: MOVEI TAC,ASSCON ;ASSIGN IT BY CONSOLE\r
+ IORM TAC,DEVMOD(DEVDAT)\r
+ EXCH ITEM,(PDP)\r
+ DPB ITEM,PJOBN ;PUT IN NEW JOB NUMBER\r
+ POP PDP,ITEM\r
+ JUMPL UUO,ESTOP\r
+ POPJ PDP,\r
+\r
+REASE1: POP PDP,TAC\r
+ JUMPE UUO,ATT4 ;JOB NEVER WAS INITIATED\r
+REASE4: SETZM @UUO ;CLEAR C(AC)\r
+ POPJ PDP,\r
+\r
+REASE2: MOVEI TAC,NOTDEV ;NO SUCH DEVICE\r
+REASE5: POP PDP,TAC1\r
+ JUMPE UUO,(TAC)\r
+ AOJA UUO,REASE4\r
+\r
+REASE3: MOVEI TAC,DEAER2 ;WASN'T ASSIGNED\r
+ JRST REASE5\r
+\r
+REASE6: MOVEI TAC,REASE7\r
+ JRST REASE5\r
+REASE7: MOVE TAC1,DEVNAM(DEVDAT)\r
+ MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB\r
+ PUSHJ PDP,PRNAME\r
+ JSP TAC,ERRMES\r
+ ASCIZ / CAN'T BE REASSIGNED\r
+/\r
+>\r
+\f\r
+INTERNAL FTATTACH\r
+IFN FTATTACH,<\r
+\r
+;"ATTACH DEVNAME" -ATTACHES A PREVIOUSLY PARTITIONED DEVICE\r
+; NOTE-MUST BE LOGGED IN UNDER [1,1] TO DO THIS\r
+; "ATTACH N [PROJ.,PROG.]" - ATTACH CONSOLE TO JOB N\r
+;CHANGES ADDRESS OF TTY DEVICE DATA BLOCK STORED IN -2(PDP)\r
+;BY THE COMMAND DECODER\r
+\r
+INTERNAL ATTACH\r
+EXTERNAL TTYATT,JOBN,TTYFND\r
+\r
+ATTACH: IFE FTTTYSER,<\r
+ MOVE AC2,TAC ;SAVE BYTE POINTER>\r
+ PUSHJ PDP,DECIN ;GET JOB NO.\r
+ JRST NOTENF ;NOT A NUMBER OR NONE SPECIFIEED\r
+IFN FTLOGIN, <\r
+ JRST DEVATT ;WANTS TO ATTACH A DEVICE\r
+>\r
+\r
+IFE FTLOGIN, <\r
+ JRST ATT1\r
+>\r
+ SKIPE TAC1 ;0 IS ILLEGAL\r
+ CAIL TAC1, JOBN ;IS JOB NUMBER TOO BIG?\r
+ JRST ATT1 ;ILLEGAL JOB NUMBER\r
+ MOVSI T1,JNA ;HAS THIS JOB NO BEEN ASSIGNED?\r
+ TDNN T1,JBTSTS(TAC1)\r
+ JRST ATT4 ;NO, PRINT ERROR\r
+INTERNAL FTLOGIN\r
+IFN FTLOGIN,<\r
+ MOVE IOS,TAC1 ;SAVE JOB NO.\r
+ PUSHJ PDP,PJPGNO ;GET PROJ,-PROG. NOS. ARG(IF ERROR, PDP SUP LEVEL\r
+ ; OFF 1, PRINT ERROR, AND DO NOT RETRY HERE\r
+\r
+ MOVEM IOS,TAC1 ;RESTORE\r
+ SKIPN AC2 ;DID USER TYPE IN A PROG,PROG # IN []'S?\r
+ MOVE AC2,PRJPRG(ITEM) ;NO. ASSUME PROJ,PROG NUMBER FOR CURRENT JOB\r
+ ; SO USER CAN AVOID TYPEING PROGPROG NO. IF DOING\r
+ ; FROM 1 JOB TO ANOTHER UNDER SAME PROJ,PROG\r
+ CAME AC2,PRJPRG(TAC1) ;IS THIS THE SAME PERSON WHO DETACHED FROM THIS JOB NUMBER?\r
+ JRST ATT3 ;NO-ERROR\r
+ ; YES\r
+>\r
+ MOVE ITEM,TAC1 ;JOB NUMBER TO ITEM\r
+ PUSHJ PDP,TTYATT ;NO, ATTACH TTY\r
+ JRST ATT2 ;ERROR CAN'T ATTACH\r
+ MOVEM DEVDAT,-2(PDP) ;CHANGE DEV DATA BLOCK ADDRESS\r
+IFN FTTTYSER,<\r
+ EXTERN TSETBF\r
+ PUSHJ PDP,TSETBF ;INITIALIZE TTY INPUT BUFFER\r
+>\r
+ JRST TTYFND ;ATTACHED, GO SET UP OUTP. BYTE PTR.\r
+\f\r
+INTERNAL FTLOGIN\r
+IFN FTLOGIN,<\r
+DEVATT: IFE FTTTYSER,<\r
+ MOVE TAC,AC2 ;RESTORE BYTE POINTER>\r
+ PUSHJ PDP,CTEXT1 ;GET DEVICE ARGUMENT\r
+ JFCL ;SHOULD NEVER RETURN\r
+ MOVE T,PRJPRG(ITEM) ;GET PROJ.-PROG. NOS.\r
+ CAME T,SYSPP ;PRJPRG = [1,1]?\r
+ JRST ATT5 ;NO - ERROR\r
+ MOVE TAC,TAC1 ;YES-SET UP DEVICE NAME\r
+ PUSH PDP,DEVDAT ;SAVE DDB FOR THIS TTY\r
+ PUSHJ PDP,DEVSRC ;SEARCH FOR DEVICE\r
+ JRST TEMP1 ;NOT FOUND\r
+ LDB T,PJOBN ;GET JOB NUMBER\r
+ JUMPN T,ATT6 ;IS IT = 0?\r
+ DPB ITEM,PJOBN ;SET JOB NUMBER\r
+ MOVE TAC,DEVMOD(DEVDAT); CHECK TO SEE IF THIS IS A TTY\r
+ LDB TAC1,PUNIT ;\r
+ TLNE TAC,DVTTY ;IS IT A TTY?\r
+ HRRM DEVDAT,TTYTAB(TAC1) ;SET TRANS TABLE TO POINT TO DDB\r
+ POP PDP,DEVDAT ;\r
+ POPJ PDP, ;RETURN\r
+>\r
+\f\r
+ATT1: JSP TAC,ERRMES\r
+ ASCIZ /ILLEGAL JOB NUMBER\r
+/\r
+ATT2: MOVE TAC1,DEVNAM(DEVDAT) ;[PRINT PHYSICAL NAME\r
+ MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB\r
+ PUSHJ PDP,PRNAME\r
+ JSP TAC,ERRMES\r
+ ASCIZ / ALREADY ATTACHED\r
+/\r
+ATT3: JSP TAC,ERRMES\r
+ ASCIZ /CAN'T ATT TO JOB\r
+/\r
+ATT4: JSP TAC,ERRMES\r
+ ASCIZ /NOT A JOB\r
+/\r
+ATT5: JSP TAC,ERRMES\r
+ ASCIZ /CAN'T ATT DEV\r
+/\r
+ATT6: POP PDP,DEVDAT\r
+ JSP TAC,ERRMES\r
+ ASCIZ /WASN'T DET\r
+/\r
+>\r
+\f\r
+INTERNAL FTATTACH\r
+IFN FTATTACH,<\r
+\r
+;"DETACH" - DETACH CONSOLE FROM JOB\r
+;"DETACH DEVNAM" - DETACHES DEVICE FROM THE SYSTEM SOFTWAREWISE\r
+; NOTE - MUST BE LOGGED IN UNDER [1,1] TO DO THIS\r
+\r
+EXTERNAL TTYDET\r
+INTERNAL FTLOGIN\r
+\r
+IFE FTLOGIN,<\r
+DETACH: JRST TTYDET ;GO DETACH TTY\r
+>\r
+\r
+IFN FTLOGIN,<\r
+EXTERNAL PRJPRG,SYSPP,PUNIT,TTYTAB,PJOBN\r
+DETACH: PUSHJ PDP,CTEXT1 ;GET ARGUMENT\r
+ JUMPE TAC1,TTYDET ;ONLY "DET" TYPED\r
+ MOVE T,PRJPRG(ITEM) ;GET PROJ.-PROG. NUMBER\r
+ CAME T,SYSPP ;PRJPRG = [1,1]?\r
+ JRST LOGER1 ;NO-PRINT ERROR MSG.\r
+ MOVE TAC,TAC1 ;YES-SET UP DEVICE NAME\r
+ PUSH PDP,DEVDAT ;SAVE TTY DDB\r
+ PUSHJ PDP,DEVSRC ;SEARCH FOR DEVICE\r
+ JRST TEMP1 ;DEVICE NOT FOUND\r
+ MOVE TAC,DEVMOD(DEVDAT) ;CHECK TO SEE IF THIS IS DSK\r
+ TLNE TAC,DVDSK ;IS IT THE DSK?\r
+ JRST TEMP1 ;YES-PRINT ERROR MSG.\r
+ MOVEI TAC1,ASSCON ;FOUND-SET UP ASSIGNED BY CONSOLE\r
+ PUSHJ PDP,ASSASG ;TRY TO ASSIGN\r
+ JRST TEMP2 ;CAN'T ASSIGN\r
+ TLNE DEVDAT,SYSDEV ;IS THIS SYSTEM DEVICE?\r
+ JRST TEMP1 ;YES-PRINT ERROR MSG.\r
+ XOR T,T ;NO-SET TO ZERO\r
+ DPB T,PJOBN ;SET JOB NO. TO NULL JOB\r
+ MOVE TAC,DEVMOD(DEVDAT) ;CHECK TO SEE IF THIS IS A TTY\r
+ TLNN TAC,DVTTY ;IS IT A TTY?\r
+ JRST .+4 ;NO-GO AHEAD\r
+ LDB TAC,PUNIT ;YES-SET UPO FOR SCNSER\r
+ MOVEI TAC1,-1 ;SET LEFT HALVE TO TTYTAB TO -1\r
+ HRRM TAC1,TTYTAB(TAC) ;SO THAT SCNSER CHECKS FOR THIS\r
+ POP PDP,DEVDAT ;RESTORE TTY DDB\r
+ POPJ PDP, ;SUCCESSFUL RETURN\r
+\f\r
+TEMP1: POP PDP,DEVDAT ;RESTORE TTY DDB\r
+ JRST DEAER1 ;PRINT ERROR MSG. AND RETURN\r
+TEMP2:\r
+IFE FTTTYSER,< POP PDP,DEVDAT ;RESTORE TTY DDB\r
+ JRST ASSER1+1 ;PRINT ERROR MSG. AND RETURN\r
+>\r
+IFN FTTTYSER,<\r
+ JRST ASSER1\r
+>\r
+LOGER1: JSP TAC,ERRMES\r
+ ASCIZ /CAN'T DET DEV\r
+/\r
+\r
+>> ;CLOSE BOTH FTLOGIN AND FTATTACH CONDITIONALS.\r
+\r
+;"DAYTIME" - PRINT TIME OF DAY\r
+\r
+EXTERNAL TIME,THSDAT,MONTAB,JIFMIN\r
+\r
+DAYTIM:\r
+IFN FTLOGIN, <\r
+ JUMPE ITEM,DAYTM1\r
+ PUSHJ PDP,DECIN ;WAS AN ARGUMENT TYPED?\r
+ JRST DAYTM1 ;NO, PRINT TIME\r
+ JRST COMERA ;ERROR\r
+ HLRZ TAC,PRJPRG(ITEM) ;YES\r
+ CAIE TAC,1 ;IS THIS PROJECT 1?\r
+ JRST DAYTM1 ;NO, PRINT TIME OF DAY ANYWAY(IGNORE ARG)\r
+ MOVE TAC,TAC1 ;YES, RESET TIME ACCORDING TO ARGUMENT\r
+ IDIVI TAC,^D100\r
+ IDIVI TAC,^D60 ;\r
+ ADD TAC,TAC1 ;COMPUTE MINUTES\r
+ IMULI TAC,JIFMIN ;COMPUTE JIFFIES\r
+ MOVEM TAC,TIME ;AND STORE\r
+ POPJ PDP,\r
+>\r
+DAYTM1: MOVE TAC,THSDAT ;PRINT TODAY'S DATE\r
+ IDIVI TAC,^D31\r
+ EXCH TAC,TAC1 ;YEAR AND MONTH IN TAC1\r
+ PUSHJ PDP,DECP1 ;ADD 1 TO DAY(IN TAC) AND PRINT DECIMAL\r
+ MOVEI TAC,0\r
+ DIVI TAC,^D12\r
+ EXCH TAC,TAC1\r
+ MOVE TAC,MONTAB(TAC) ;MONTH\r
+ DPB TAC,[POINT 21,DAMESS,27]\r
+ MOVEI TAC,DAMESS\r
+ PUSHJ PDP,CONMES ;PRINT DAY\r
+ MOVEI TAC,^D64(TAC1)\r
+ PUSHJ PDP,RADX10 ;PRINT YEAR\r
+ PUSHJ PDP,PRSPC\r
+ MOVE TAC,TIME ;PRINT TIME OF DAY\r
+ JRST PRTIM1\r
+\f\r
+INTERNAL FTTIME\r
+IFN FTTIME,<\r
+;"TIME (JOB NO.)" - PRINT TOTAL AND INCREMENTAL RUNNING TIME FOR A JOB\r
+;FOLLOWED BY KILO-CORE TICKS\r
+;"TIME 0" IMPLIES RUNTIME FOR NULL JOB AND THE TOTAL TIME SPENT SHUFFLING USERS\r
+; IF NO JOB NO. GIVEN-TIME WILL BE FOR CURRENTLY LOGGGED IN JOB NO.\r
+\r
+EXTERNAL RTIME,TTIME,SHFWRD,WDPJIF,JOBN,JBTSTS,CLRWRD,LSTWRD\r
+\r
+RUNTIM: PUSHJ PDP,DECIN ;GETJOB NO. ARG.\r
+ JRST RUN1 ;NO ARG. GIVEN - LOGGED IN?\r
+ JRST COMERA ;ILLEGAL DECIMAL CHARACTER RETURN\r
+ JUMPE TAC1,RUN2 ;RUNTIME 0 GIVEN\r
+ CAIL TAC1,JOBN ;JOB NO. TO BIG?\r
+ JRST ATT1 ;YES,ILLEGAL JOB. NO.\r
+ MOVE TAC,TTIME(TAC1) ;TIME SINCE LAST LOGGIN\r
+ JRST PRTIME ;PRINT AND RETURN\r
+\r
+RUN2: PUSHJ PDP,INLMES ;PRINT\r
+\r
+ ASCIZ /SHFL / ;"SHUFFLING "\r
+ MOVE TAC,SHFWRD ;NO. WORDS SHUFFLED\r
+ IDIVI TAC,WDPJIF ;NO.WORDS/JIFFY USING BLT\r
+ PUSHJ PDP,PRTIME ;PRINT SHUFFLE TIME\r
+ PUSHJ PDP,INLMES\r
+ ASCIZ /ZCOR /\r
+ MOVE TAC,CLRWRD\r
+ IDIVI TAC,WDPJIF\r
+ PUSHJ PDP,PRTIME ;PRINT TIME SPENT CLEARING CORE\r
+ PUSHJ PDP,INLMES\r
+ ASCIZ /LOST /\r
+ MOVE TAC,LSTWRD\r
+ PUSHJ PDP,PRTIME ;PRINT TME SPENT "LOST" RUNNING NULL JOB\r
+ PUSHJ PDP,INLMES ;PRINT\r
+ ASCIZ /NULL / ;"NULL TIME "\r
+ MOVE TAC,TTIME ;PRINT NULL JOB RUNNING TIME\r
+ PUSHJ PDP,PRTIME ;\r
+ PUSHJ PDP,INLMES ;PRINT TOTAL SYSTEM UP TIME\r
+ ASCIZ /UP /\r
+ MOVE TAC,UPTIME\r
+ JRST PRTIME ;AND RETURN\r
+\f\r
+RUN1:\r
+IFE FTLOGIN,<\r
+ MOVEI TAC,0 ;GET SET TO CLEAR INCREMENTAL RUN TIME\r
+>\r
+IFN FTLOGIN,<\r
+ MOVSI TAC,JLOG ;IS JOB LOGGED IN?\r
+ TDZN TAC,JBTSTS(ITEM) ;TEST JOB STATUS BITS AND CLEAR TAC ALWAYS\r
+ JRST NOTENF ;NO, NEED MORE ARGUMENTS\r
+>\r
+ EXCH TAC,RTIME(ITEM) ;GET CURRENT INCR. TIME AND CLEAR\r
+ PUSHJ PDP,PRTIME ;PRINT TIME SINCE LAST TIME COMM.\r
+PRTTIM: MOVE TAC,TTIME(ITEM) ;GET TOTAL ACCUMULATED TIME\r
+IFN FTKCT,<\r
+ PUSHJ PDP,PRTIME\r
+ EXTERN JBTKCT\r
+ PUSHJ PDP,INLMES ;PRINT "K*CPUSEG=\r
+ ASCIZ /KILO-CORE-SEC=/\r
+ MOVE TAC,JBTKCT(ITEM) ;PRODUCT OF NO. OF K CORE* NO. OF JIFFIES RUN\r
+ IDIVI TAC,JIFSEC ;AT THAT SIZE, CONVERT TO KILO CORE SECONDS\r
+ PUSHJ PDP,RADX10 ;AND PRINT IN DECIMAL\r
+ JRST CRLF ;PRINT IRLF\r
+>\r
+IFE FTKCT,<\r
+ JRST PRTIME ;PRINT IT AND RETURN\r
+>\r
+>\r
+\f\r
+;ROUTINE TO LET TTY TALK TO ANY OTHER RING OF TTYS\r
+; "TALK TTYN"\r
+; TTYN NEED NEVER HAVE BEEN TYPED ON BEFORE\r
+\r
+INTERNAL FTTALK\r
+\r
+IFN FTTALK,<\r
+EXTERNAL TTYTLK\r
+\r
+TALK: PUSHJ PDP,CTEXT1 ;GET ARGUMENT\r
+ JUMPE TAC1,TALK2 ;NONE SPECIFIED\r
+ MOVE TAC,TAC1\r
+ PUSHJ PDP,DEVSRC ;SEARCH FOR DEVICE\r
+ JRST TALK1 ;DEVSRC SHOULD FIND A FREE TTY DDB\r
+ ; EVEN IF TTY NEVER TYPED ON YET\r
+ PUSHJ PDP,TTYTLK\r
+ JRST TALK1\r
+ POPJ PDP,\r
+\r
+TALK2: MOVSI ITEM,NOINCK ;SET FLAGS SO RESPONSE WILL PRINT\r
+ MOVEM ITEM,-1(PDP)\r
+ JRST NOTENF\r
+\r
+TALK1: MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB\r
+ MOVSI ITEM,NOINCK ;SET FLAGS TO PRINT RESPONSE\r
+ MOVEM ITEM,-1(PDP)\r
+ JSP TAC,ERRMES\r
+ ASCIZ /BUSY\r
+/\r
+>\r
+\f\r
+INTERNAL FTEXAMINE\r
+\r
+IFN FTEXAMINE,<\r
+\r
+;"EXAMINE LOC" - LOOKS A CONTENTS OF LOC AND PRINTS IN OCTAL\r
+;IF LOC IS MISSING, NEXT LOC IS PRINTED\r
+;IF PREVIOUS WAS E COMMAND, SAME LOC IF PREVIOUS WAS D COMMAND\r
+;TAB. IS PRINTED INSTEAD OF CRLF(LIKE DDT)\r
+\r
+EXTERNAL TPOPJ,JOBPC\r
+\r
+ECOM: SKIPGE JOBEXM(JDAT) ;WAS PREVIOUS D OR E COMMAND. A D COMMAND?\r
+ AOS JOBEXM(JDAT) ;NO, IT WAS AN E. INCREMENT IN CASE HE TYPES NO ARG\r
+ HRROS JOBEXM(JDAT) ;YES, FLAG THAT E HAPPENED LAST(LH=-1)\r
+ PUSHJ PDP,OCTIN ;GET OCTAL LOCATION\r
+ SKIPA TAC,JOBEXM(JDAT) ;NONE SPECIFIED, USE LAST LOC OF D OR NEXT OF E\r
+ JRST COMERA ;ILLEGAL CHARACTER\r
+ PUSHJ PDP,DEAT ;CHECK FOR AC REFERENCE AND STORE JOBEXM\r
+ HRRZ UUO,TAC1 ;IGNORE LH\r
+ HRLI UUO,PROG ;SET TO RELOCATE\r
+ PUSHJ PDP,GETWRD ;GET WORD FROM LOW OR HIGH SEG\r
+ JRST ECOMA ;ERROR, OUT OF BOUNDS\r
+ PUSH PDP,TAC ;SAVE CONTENTS OF LOC TO BE PRINTED\r
+ HRRZ TAC,JOBEXM(JDAT) ;PRINT LOC BEING EXAMINED\r
+ PUSHJ PDP,OCTPNT\r
+ PUSHJ PDP,INLMES ;PRINT SLASH TAB\r
+ ASCIZ */ *\r
+ HLRZ TAC,(PDP) ;PRINT LEFT HALF\r
+ PUSHJ PDP,OCTPNT\r
+ PUSHJ PDP,INLMES ;PRINT SPACE\r
+ ASCIZ / /\r
+ HRRZ TAC,(PDP) ;PRINT RIGHT HALF\r
+ PUSHJ PDP,OCTPNT\r
+ PUSHJ PDP,INLMES ;PRINT FINAL TAB\r
+ ASCIZ / /\r
+ JRST TPOPJ ;POP PDP,TAC,POPJ PDP,\r
+\f\r
+;"DEPOSIT LH RH LOC" - DEPOSITS XWD LH,RH IN LOCATION LOC\r
+;IF LOC IS MISSING. ASSUME NEXT LOC IF PREVIOUS D, SAME LOC IF PREVIOUS E\r
+\r
+EXTERNAL JOBEXM,JOBPFI\r
+\r
+DCOM: PUSHJ PDP,OCTIN ;GET LH\r
+ JRST NOTENF ;NOT ENOUGH ARGUMENTS\r
+ JRST COMERA ;ILLEGAL CHARACTER\r
+ HRLM TAC1,IOS ;SAVE LH\r
+ PUSHJ PDP,OCTIN ;GET RH\r
+ JRST NOTENF ;NOT ENOUGH ARGUMENTS\r
+ JRST COMERA ;ILLEGAL CHARACTER\r
+ HRRM TAC1,IOS ;SVE RH\r
+ SKIPL JOBEXM(JDAT) ;WAS PREVIOUS D OR E AN E COMMAND?\r
+ ; LH=-1 IF E, LH=0 IF D\r
+ AOS JOBEXM(JDAT) ;NO, INCREMENT IN CASE USER TYPED NOT THIRD ARG\r
+ ; FOR SUCCESSIVE D'S\r
+ HRRZS JOBEXM(JDAT) ;FLAG THAT A D WASDONE LAST(LH=0)\r
+ PUSHJ PDP,OCTIN ;GET LOC\r
+ SKIPA TAC1,JOBEXM(JDAT) ;NOT SPECIFIED, USE LAST OF E OR NEXT OF D\r
+ JRST COMERA ;ILLEGAL CHARACTER\r
+IFN FT2REL,<\r
+ EXTERN CHKMED\r
+ PUSHJ PDP,CHKMED ;CHECK TO SEE IF HIGH SEG IS SHARABLE\r
+ ; IF YES, SET USER-MODE WRITE PROTECT (UWP) ON\r
+ ; FOR THIS USER, AND SET MEDDLE FOR THIS USER\r
+ ; SO HE CANNOT TURN UWP OFF\r
+>\r
+ TRNN TAC1,777760 ;IN USER ACS\r
+ JRST DCOM1 ;YES\r
+ HLRZ TAC,PROG ;GET PROTECTION\r
+ CAILE TAC1,JOBPFI ;NO, GREATER THAN HIGHEST LOC, PROTECTED\r
+ ; FROM IO IN JOB DATA AREA?\r
+ CAMLE TAC1,TAC ;IN BOUNDS?\r
+ JRST DCOMA ;NO\r
+DCOM1: PUSHJ PDP,DEAT ;CHECK FOR AC REFERENCE\r
+ HRLI TAC1,PROG ;SET FOR RELOCATION\r
+ MOVEM IOS,@TAC1 \r
+ POPJ PDP,\r
+\f\r
+DEAT: TLZ TAC1,-1 ;CLEAR LH IN CASE THIS IS A SUCCESSIVE E WITH NO ARG\r
+ HRRM TAC1,JOBEXM(JDAT) ;STORE FOR NEXT TIME, DO NOT TOUCH LH(D OR E LAST)\r
+ ; YES, WAS JOB STOPPED IN USER MODE?\r
+ CAIL TAC1,20 ;IS IT AN AC?\r
+ POPJ PDP, ;NO\r
+ MOVE TAC,JOBPC(JDAT)\r
+ TLNE TAC,USRMOD ;USER MODE?\r
+ ADDI TAC1,20 ;YES USER ACS ARE AT 20 INSTEAD OF 0\r
+\r
+DCOMA:\r
+IFN FT2REL,<\r
+ EXTERN HGHDEP\r
+ PUSHJ PDP,HGHDEP ;IS IT IN BOUNDS AND ALLOWED IN HIGH SEG?\r
+ JRST ECOMA ;NO, PRINT "OUT OF BOUNDS"\r
+ POPJ PDP, ;YES, IOS DEPOSITED, AND JOBEXM UPDATED\r
+>\r
+ECOMA: JSP TAC,ERRMES ;OUT OF BOUNDS\r
+ ASCIZ /OUT OF BOUNDS\r
+/\r
+\r
+>\r
+\f\r
+IFN FTLOGIN,<\r
+;"SCHEDULE OCTN" - SETS RH OF STATES TO OCTN, IF TYPED FROM\r
+; THE OPERATOR CONSOLE (C(DEVOPR)), OTHERWISE ILLEGAL\r
+;"SCHEDULE" WITH NO ARGUMENTS TYPES OUT RH OF STATES, LEGAL FOR ALL.\r
+\r
+ EXTERN DEVOPR,STATES,OCTPNT\r
+\r
+SKEDUL: PUSHJ PDP,OCTIN ;GET THE ARGUMENT IF ANY\r
+ JRST SKED1 ;NO ARGUMENT\r
+ JRST COMERA ;BAD SYNTAX IN OCTAL NUMBER\r
+ MOVE TAC,DEVNAM(DEVDAT) ;AN ARGUMENT. IS THIS THE OPR?\r
+ CAME TAC,DEVOPR\r
+ JRST COMERR ;NO, THIS IS ILLEGAL, THEN.\r
+ HRRM TAC1,STATES ;YES. STORE ARGUMENT IN RH OF STATES\r
+ POPJ PDP,0 ;RETURN\r
+\r
+SKED1: HRRZ TAC,STATES ;SCHEDULE WITH NO ARGUMENTS.\r
+ PUSHJ PDP,OCTPNT ;PRINT RH OF STATES.\r
+ JRST CRLF ;AND RETURN WITH A CRLF\r
+>\r
+;"BLANK" OR NO ALPHA NUMERIC BEFORE BREAK CHAR COMMAND\r
+;DISPATCHED TO LIKE ANY OTHER COMMAND(0 IN COMMAND TABLE)\r
+\r
+CBLANK:\r
+IFE FTTTYSER,<\r
+ LDB TEM,TAC ;GET BREAK CHARACTER\r
+ CAIE TEM,15 ;IS IT A CR\r
+>\r
+IFN FTTTYSER,<\r
+ CAIE TEM,12 ;WAS BREAK A LF\r
+>\r
+ CAIN TEM,";" ;NO, IS IT SEMI COLON(MONITOR COMMENT)\r
+ POPJ PDP, ;YES, IGNORE\r
+ ; FALL IN UNKNOWN COMMAND\r
+\r
+;COMMAND NOT IN COMMAND DICECTORY\r
+\r
+NOCOM: JRST COMERR ;NO, APPEND ? TO WHAT HE TYPED IN\r
+\f\r
+IFN FTFINISH,<\r
+; "FINISH DEVICE" - CLOSES,RELEASE AND DESASSIGNS DEVICE\r
+;JOB MUST HAVE CORE\r
+\r
+ EXTERNAL USRJDA,PUUOAC,JOB,USRHCU,JOBFDV,SYSTAP\r
+CFINI: PUSHJ PDP,CTEXT1 ;GET DEVICE NAME\r
+ JUMPE TAC1,NOTENF ;NOT ENOUGH ARG. IF NONE\r
+ SKIPA TAC,TAC1 ;SEARCH FOR SIXBIT DEVICE NAME\r
+CFINS: MOVE TAC,SYSTAP ;HERE ON CONTROL C ON SYSTEM TAPE USER\r
+ ; DO A FINISH SYS COMMAND FOR HIM\r
+ PUSHJ PDP,DEVSRC \r
+ JRST NOTDEV ;PRINT NOT A DEVICE\r
+ HRRZM DEVDAT,JOBFDV(JDAT) ;STORE DDB ADR. IN JOB DATA AREA\r
+ MOVE DEVDAT,-2(PDP)\r
+ JSP TAC1, MSTART ;SETUP MONITOR JOB AND RETURN\r
+ ; RETURN HERE AT UUO LEVEL WHEN SCHEDULED\r
+ JSP TAC,MONSTR ;SETUP ACS,PROG,JDAT,PDP\r
+ MOVE UCHN,USRHCU ;HIGHEST USER IO CHANNEL IN USE\r
+FDV1: HRRZ DEVDAT,USRJDA(UCHN) ;GET NEXT DEVICE\r
+ MOVSI UUO,071000 ;SETUP RELEASE UUO\r
+ DPB UCHN,PUUOAC ;WITH CHANNEL NO.\r
+ PUSH PDP,UCHN\r
+ CAMN DEVDAT,JOBFDV(JDAT) ;IS THIS DEV. THE ONE TO RELEASE?\r
+ XCT UUO ;YES, RELEASE IT(AND CLOSE)\r
+ POP PDP,UCHN\r
+ SOJGE UCHN,FDV1 ;FINISHED?\r
+ MOVE ITEM,JOB ;GET JOB NUMBER\r
+ MOVE DEVDAT,JOBFDV(JDAT) ;RESET DEVDAT\r
+ PUSHJ PDP,DEASG ;DEASSIGN DEVICE\r
+ JFCL ;IGNORE IF NOT ASSIGNED BY CONSOLE\r
+ JRST ESTOP ;STOP JOB SO HE CANNOT CONTINUE\r
+>\r
+\f\r
+IFN FTTIME,<\r
+;"RESOURCES" - PRINT OUT AVAILABLE DEVICES AND FREE BLOCKS ON THE DISK\r
+\r
+EXTERNAL DEVLST\r
+\r
+FREDEV:\r
+IFN FTDISK, <\r
+EXTERNAL SATENT,SATXWD,WLBIT,SENTSZ,NUMBIT\r
+\r
+ XOR TAC,TAC ;INITIALIZE COUNTER\r
+ HLRE T2,SATXWD ;SET INDEX WITH NUMBER OF SAT BLOCKS IN EXISTENCE,\r
+ MOVNS T2\r
+ HRRI T1,SATENT ;GET SATENT ENTRY POINTER\r
+LOP05: HRRZ TAC1,0(T1) ;GET VALUE\r
+ TRNE TAC1,WLBIT ;IS THIS SPACE WRITE PROTECTED?\r
+ JRST LOP06 ;YES, NO FREE BLOCKS IN THE SAT BLOCK.\r
+ ADDI TAC,NUMBIT ;NO, ADD THE FOLLOWING QUANTITY IN THIS SAT\r
+ SUB TAC,TAC1 ; RUNNING TOTAL: (TOTAL BLOCKS IN THIS SAT\r
+ ; BLOCK) - (BLOCKS ALREADY IN USE).\r
+LOP06: ADDI T1,SENTSZ ;BUMP POINTER\r
+ SOJN T2,LOP05 ;DECREMENT INDEX\r
+ PUSHJ PDP,RADX10 ;CONVERT TO DECIMAL\r
+ PUSHJ PDP,INLMES ;PRINT\r
+ ASCIZ /. BLKS/\r
+>\r
+\r
+ HRLZ T,DEVLST ;GET DDB POINTER\r
+ MOVEI AC2,0 ;SET DEVICE NAME 0 FOR FIRST COMPARE\r
+LOP01: MOVE T1,DEVMOD(T) ;DEVICE CHARACTERISTICS\r
+ TRNN T1,ASSCON!ASSPRG ;DEVICE ASSIGNED BY CONSOLE OR PROGRAM?\r
+ TLNE T1,DVTTY!DVDSK ;NO, IS IT A TTY OR DSK?\r
+ JRST LOP02 ;YES DO NOT PRINT\r
+IFE FTDISK,<\r
+ JUMPE AC2,LOP018 ;SUPPRESS LEADING COMMA IF NO DISK\r
+>\r
+ PUSHJ PDP,INLMES ;PRINT ,(INSTEAD OF CRLF SO WILL FIT IN 1 BUFFER)\r
+ ASCIZ /,/\r
+LOP018: MOVS AC1,DEVNAM(T) ;GET DEVICE NAME\r
+ HLLZ TAC1,AC1 ;ASSUME SAME TYPE AS LAST ONE, PRINT\r
+ ; ONLY RH OF NAME (UNIT NUMBER)\r
+ CAIN AC2,0(AC1) ;IS IT REALLY THE SAME?\r
+ JRST LOP01A ;YES. PRINT THE UNIT NUMBER,\r
+ MOVS TAC1,AC1 ;NO. MUST PRINT WHOLE NAME,\r
+ HRRZ AC2,AC1 ; AND GET THE NEW DEVICE IN FLAG AC.\r
+LOP01A: PUSHJ PDP,PRNAME ;AS BEING FREE\r
+LOP02: HLRZ T,DEVSER(T) ;GET NEXT DEVICE IN CHAIN\r
+ JUMPN T,LOP01 ;IS THERE ONE?\r
+ JRST CRLF ;NO. DONE, PRINT CR. LF AND THEN POPJ\r
+>\r
+\f\r
+EXTERNAL CPOPJ,STUSER\r
+;ROUTINE TO CHECK FOR ACTIVE DEVICES\r
+;NEVER GET HERE DURING SWAP IN OU OUT\r
+;SINCE COMMAND TABLE SHOULD AHVE NOTRAN BIT ON\r
+\r
+RUNCHK: CAMN ITEM,STUSER ;SYSTEM TAPE USER?\r
+ JRST DLYCM1 ;YES. DELY,BUT DO NOT STOP JOB\r
+ACTCHK: JUMPE PROG,ACTCH1 ;DOES JOB HAVE CORE IN MEMORY\r
+ PUSHJ PDP,ANYACT ;YES. ARE DEVICES ACTIVE?\r
+ JRST DLYCM ;YES. DELAY COMMAND.\r
+ACTCH1: MOVE TAC1,-1(PDP) ;RESTORE COMMAND DISPATCH ADDRESS\r
+ MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB ADDRESS\r
+ MOVE T,JBTSTS(ITEM) ;RESTORE JOB STATUS\r
+CONTC1: POPJ PDP,COM0\r
+\r
+;ROUTINE TO DELAY A COMMAND\r
+\r
+;DELAYS COMMAND TO BE EXECUTED WHEN JOB IN CORE MEMORY\r
+;AND CAUSE JOB TO BE SWAPPED IN(COMMAND WAIT BIT IS SET IN JBSTS)\r
+;AND POPD LEVEL UP ONE.\r
+\r
+EXTERNAL TTYCM,LINSAV\r
+\r
+DLYCM: PUSHJ PDP,DLYCOM ;SET COMMAND WAIT BIT IN JOB STATUS AND PUT\r
+ ; JOB IN COMMAND WAIT QUEUE\r
+ ; SO JOB IS NOT RUNNABLE ANY MORE\r
+;ROUTINE TO DELAY A COMMAND IF A SWAP OUT OR IN IS IN PROGRESS\r
+;DIFFERS FROM DLYCM IN THAT JOB IS NOT MADE TO BE SWAPPED IN\r
+;REQUIRES OR DELYAING COMMAND IF SYSTEM\r
+;TAPE USER TYPOES ^C (HALT COMMAND)\r
+\r
+DLYCM1: POP PDP,TAC\r
+ POP PDP,TAC1\r
+ POP PDP,TAC1\r
+ PUSH PDP,CONTC1\r
+ MOVE TAC1,LINSAV\r
+ JRST TTYCM\r
+\f\r
+IFN FTDISK,<\r
+;SEARCH DEVICE CHAIN FOR DSK WITH COUNTS ON\r
+;CALL MOVE ITEM,JOB NO\r
+; PUSHJ PDP,STOPCK\r
+; CAN'T STOP RETURN\r
+; OK TO STOP RETURN\r
+\r
+EXTERNAL DSKDDB,DSKFGS,CPOPJ1\r
+\r
+STOPCK: MOVEI DEVDAT,DSKDDB\r
+ MOVSI TAC1,DSKFGS\r
+STOPD: LDB TAC,PJOBN\r
+ CAIE ITEM,(TAC) ;ASSIGNED TO THIS JOB?\r
+ JRST STOPC ;NO\r
+ TDNE TAC1,DEVIOS(DEVDAT) ;YES. FLAG ON?\r
+ JRST CPOPJ ;YES. DELAY\r
+STOPC: HLRZ DEVDAT,DEVSER(DEVDAT)\r
+ MOVSI TAC,446353\r
+\r
+ CAMN TAC,DEVNAM(DEVDAT)\r
+ JRST STOPD\r
+ JRST CPOPJ1 ;OK TO STOP\r
+>\r
+\f\r
+SUBTTL COMCSS - COMMON COMMAND SUBROUTINES\r
+\r
+;ROUTINE TO RETURN NEXT ALPHANUMERIC STRING\r
+; IN COMMAND LINE (SIXBIT)\r
+;CALL: MOVE TAC,BYTE POINTER TO PREVIOUS CHAR.\r
+; PUSHJ PDP, CTEXT\r
+; SIXBIT STRING RETURN LEFT JUSTIFIED IN AC TAC1\r
+\r
+INTERNAL CTEXT\r
+INTERNAL CTEXT1\r
+\r
+T=BUFPNT ;TEMPORARY AC'S\r
+T1=BUFWRD\r
+T2=UUO\r
+\r
+CTEXT: PUSHJ PDP,SKIPS ;CALL HERE IF AT START OF LINE\r
+ SKIPA\r
+\r
+CTEXT1: PUSHJ PDP,SKIPS1 ;SKIP LEAD SPACES,TABS,NULLS AND CLEAR TAC1\r
+ ; DO NOT RETURN IF CR WAS PERVIOUS BREAK\r
+ MOVE T,[POINT 6,TAC1]\r
+IFE FTTTYSER,<\r
+ LDB TEM,TAC\r
+ JRST CTEX1\r
+CTEX0: ILDB TEM,TAC\r
+>\r
+IFN FTTTYSER,<\r
+EXTERN TAKR,GETCHAR\r
+ LDB TEM,TAKR(DAT) ;GET LAST CHAR.\r
+ JRST CTEX1\r
+CTEX0: PUSHJ PDP,GETCHR ;ROUTINE IN SCNSER TO PICK UP CHAR.\r
+>\r
+\r
+CTEX1: PUSHJ PDP, CTEX ;IS IT ALPHANUMERIC\r
+ TRC TEM,40 ;CONVERT TO SIXBIT\r
+ TLNE T,770000 ;SIX CHARS YET?\r
+ IDPB TEM,T ;NO. BUILD WORD \r
+ JRST CTEX0 ;LOOP FOR MORE\r
+\f\r
+;SCAN FOR ALPHANUMERIC CHAR IN TEM\r
+CTEX: CAILE TEM,"Z"+40 ;GREATER THAN LC Z?\r
+ JRST CTEXA ;YES. NOT SIXBIT.\r
+ CAIL TEM,"A"+40 ;LOWER CASE LETTER?\r
+ TRZ TEM,40 ;YES. MAKE UPPER CASE.\r
+ CAIL TEM, "0"\r
+ CAILE TEM, "Z" ;LETTERS ARE LARGER THEN NOS.\r
+ JRST CTEXA ;NEITHER\r
+ CAILE TEM,"9"\r
+ CAIL TEM,"A"\r
+ POPJ PDP, ;LETTER OR NUMBER RETURN\r
+CTEXA: IFE FTTTYSER,<\r
+ POP PDP,T1 ;REDUCE PDP BY 1 LEVEL\r
+ POPJ PDP, ;AND RETURN\r
+>\r
+IFN FTTTYSER,<\r
+ CAIN TEM,":" ;DEVICE NAME?\r
+ PUSHJ PDP,GETCHR ;YES. SKIP COLON\r
+ CAIE TEM,3 ;CONTROL C?\r
+\r
+ JRST TPOPJ ;NO. RETURN ONE LEVEL UP\r
+CTXCNC: MOVSI TAC1,(SIXBIT /HAL/) ;MAKE PHONY HALT COMMAND\r
+ MOVSI TEM,12 ;WITH LF FOR TERMINATION\r
+ JRST TPOPJ ;AND RETURN UP A LEVEL\r
+>\r
+\f\r
+;ROUTINE TO IGNORE LEADING SPACES, TABS, AND NULLS\r
+;ALSO CLEARS TAC1\r
+;DOES NOT RETURN IF PREVIOUS CHAR. OR NEXT NON-SPACING\r
+;CHAR, IS CR(IE POPS SUBROUTINE LEVEL UP 1 ON RETURN)\r
+;CALL: MOVE TAC,BYTE POINTER TO PREVIOUS BREAK CHAR.\r
+; PUSHJ PDP, SKIPS1\r
+\r
+INTERNAL SKIPS1,SKIPS\r
+\r
+IFE FTTTYSER,<\r
+SKIPS1:\r
+SKIPS: MOVEI TAC1,0 ;CLEAR TAC1\r
+ LDB TEM,TAC ;WAS PRECEDING BREAK A CR?\r
+ CAIN TEM,15\r
+ JRST SKIPS2 ;YES. POP SUB. LEVEL UP 1\r
+SKIPSA:\r
+ ILDB TEM,TAC\r
+ JUMPE TEM,SKIPSA ;NULL?\r
+ CAIE TEM," " ;SPACE?\r
+ CAIN TEM, 11\r
+ JRST SKIPSA\r
+ CAIN TEM,15 ;CR?\r
+SKIPS2: POP PDP,T ;YES. POP SUB. LEVEL UP ONE\r
+>\r
+IFN FTTTYSER,< EXTERNAL GETCHR,SPCHEK,BREAKB,TAKR\r
+\r
+SKIPS: PUSHJ PDP,GETCHR ;GET FIRST CHAR ON LINE\r
+SKIPS1: MOVEI TAC1,0 ;FOR CTEXT, DECIN\r
+ LDB TEM,TAKR(DAT) ;IN CASE TEM CLOBBERED\r
+ CAIN TEM,15 ;SKIP TO LF IF CR\r
+SKIPSA: PUSHJ PDP,GETCHR ;NEXT CHARACTER\r
+ JUMPE TEM,SKIPS3 ;POP UP A LEVEL IF NO CHARS\r
+ PUSHJ PDP,SPCHEK ;SPECIAL?\r
+ JRST SKIPS2 ;NO\r
+ TLNE TAC,BREAKB ;BREAK?(END OF LINE)\r
+ JRST SKIPS3 ;YES. POP UP RETURN\r
+SKIPS2: CAIG TEM,40 ;SPACE OR CONTROL CHAR?\r
+ JRST SKIPSA ;YES.\r
+ POPJ PDP,Z ;NO. RETURN\r
+SKIPS3: CAIN TEM,3 ;^C?\r
+ JRST CTXCNC ;HANDLE IT\r
+ MOVEI TEM,12 ;FOR BREAK CONSISTENCY\r
+ JRST TPOPJ ;RETURN ONE LEVEL UP\r
+>\r
+\f\r
+;ROUTINE TO APPEND A "?" TO INPUT STRING AND SET AS OUTPUT\r
+;CALLED FROM OCTIN, RETURNS TO SECOND LEVEL ON PDL\r
+;CALL: MOVE TAC, BYTE POINTER TO LAST CHAR. IN INPUT STRING\r
+; PUSHJ PDP, COMERA\r
+\r
+INTERNAL COMERA,COMERP\r
+\r
+COMERP: POP PDP,T ;REMOVE SUB. RETURN BEFORE CALLING COMERA\r
+COMERA: IFE FTTTYSER,< IBP TAC>\r
+ IFN FTTTYSER,< PUSHJ PDP,GETCHR> ;MOVE UP, A CH\r
+\r
+;ROUTINE TO REPLACE LAST CHARACTER IN INPUT STRING BY "?"\r
+;AND SET AS OUTPUT\r
+;CALL: MOVE TAC, BYTE POINTER TO LAST CHAR. IN INPUT STRING\r
+; PUSHJ PDP, COMERR\r
+\r
+INTERNAL COMERR\r
+\r
+\r
+COMERR:\r
+IFN FTTTYSER,<\r
+EXTERN OUTCHS,TRESCN,TITAKR,SETBFI,TISYNC\r
+\r
+ MOVE T,TITAKR(DEVDAT) ;SAVE POSISITION IN SCAN\r
+ PUSHJ PDP,TRESCN ;BACK UP TO START OF COMMAND\r
+COMERL: PUSHJ PDP,GETCHR ;GET A CHAR FROM COMMAND\r
+ CAMN T,TITAKR(DEVDAT) ;PASS BAD CHAR YET?\r
+ JRST COMER1 ;YES\r
+ PUSHJ PDP,OUTCHS ;NO. TYPE CHAR.\r
+ JUMPN TEM,COMERL ;LOOP IF NOT OUT OF CHARACTERS\r
+\r
+COMER1: PUSHJ PDP,SETBFI ;CLEAR ANY MORE TYPEIN\r
+ AOS TISYNC(DEVDAT) ;THIS WILL BE SOS-ED AT COMRET\r
+ MOVEI TEM,"?" ;APPEND ? TO ERRONEOUS WORD\r
+ PUSHJ PDP,OUTCHS\r
+>\r
+IFE FTTTYSER,<\r
+ MOVE DAT,TAC\r
+ MOVEI T,"?" ;STORE ? ON TOP OF BREAK CHAR.\r
+ DPB T,DAT\r
+>\r
+ TDZA ITEM,ITEM ;CLEAR JOB NO. AND SKIP INTO CRLF ROUT.\r
+\f\r
+;ROUTINE TO PRINT A COMMAND ERROR MESSAGE\r
+;SAME CALL AS CONMES\r
+\r
+INTERNAL ERRMES\r
+\r
+ ; COMERR SKIPS THIS ROUT,(SEE ABOVE)\r
+ERRMES: TDZA ITEM,ITEM ;CLEAR JOB NUMBER TO INDICATE ERROR\r
+ ; SKIP INTO CONMES ROUTINE\r
+\r
+;ROUTINE TO PRINT CARRIAGE RETURN-LINE-FEED\r
+;CALL: MOVE DAT,BYTE POINTER TO OUTPUT\r
+; PUSHJ PDP,CRLF\r
+\r
+INTERNAL CRLF\r
+\r
+ ; COMERR SKIPS TO HERE(SEE ABOVE)\r
+CRLF: MOVEI TAC,[ASCII /\r
+/]\r
+\r
+;ROUTINE TO MOVE ASCII CHAR. STRING TO CONSOLE OUTPUT BUFFER\r
+; CALL: MOVE DAT, BYTE POINTER TO LAST OUTPUT CHARACTER\r
+; MOVEI TAC, ADDRESS OF ASCII MESSAGE\r
+; PUSHJ PDP, CONMES\r
+; STRING TERMINATED BY NULL\r
+; CONMES DOES NOT START TTY\r
+;CONMS1 - SAME CALLING SEQUENCE A CONMES,EXCEPT LH IS BYTE POINTER \r
+\r
+INTERNAL CONMES\r
+EXTERNAL TPOPJ\r
+\r
+ ; ERRMES SKIPS TO HERE\r
+CONMES: HRLI TAC,440700 ;FORM ASCIZ BYTE POINTER\r
+CONMS1: PUSH PDP,TAC ;SAVE BYTE POINTER\r
+CON0: ILDB TEM,(PDP) ;GET NEXT CHAR.\r
+ JUMPE TEM,TPOPJ ;IS IT NULL?(IF YES, DO POP TAC, POPJ)\r
+TYOINS: ;TAG FOR THE TYPE OUT INSTRUCTION\r
+CONOUT: ;EXECUTED FROM REST OF COMCSS TO OUTPUT CHAR\r
+IFN FTTTYSER,<\r
+EXTERN OUTCHS\r
+ PUSHJ PDP,OUTCHS ;NO. STORE TTY OUTPUT BUFFER\r
+>\r
+IFE FTTTYSER,<\r
+ IDPB TEM,DAT\r
+>\r
+ JRST CON0 ;KEEP GOING\r
+\f\r
+;ROUTINE TO PRINT INLINE ASCIZ MESSAGE\r
+;CALL: PUSHJ PDP,INLMES\r
+; ASCIZ /THE MESSAGE/\r
+;RETURN TO NEXT LOC AFTER MESSAGE\r
+\r
+INTERNAL INLMES\r
+\r
+INLMES: POP PDP,TAC ;SETUP PRINT ADRESS FOR CONMES\r
+ PUSHJ PDP,CONMES \r
+ JRST 1(TAC) ;RETURN TO NEXT LOC AFTER MESSAGE\r
+\r
+;ROUTINE TO APPEND ? TO ERROR MESSAGE\r
+;CALL PUSHJ PDP,PRQM\r
+; RETURN\r
+\r
+INTERNAL PRQM\r
+\r
+PRQM: MOVEI TEM,"?"\r
+IFN FTTTYSER,<\r
+\r
+EXTERN OUTCHS\r
+ JRST OUTCHS\r
+>\r
+IFE FTTTYSER,<\r
+ IDPB TEM,DAT\r
+ POPJ PDP,\r
+>\r
+PRSPC: MOVEI TAC,[ASCIZ / /]\r
+ JRST CONMES\r
+\f\r
+;ROUTINE TO PRINT "TOO FEW ARGUMENTS"\r
+;CALL: MOVE DAT,BYTE POINTER\r
+; PUSHJ PDP,NOTENF\r
+\r
+INTERNAL NOTENF\r
+\r
+NOTENF: JSP TAC,ERRMES\r
+\r
+ASCIZ /TOO FEW ARGUMENTS\r
+/\r
+\r
+;ROUTINE TO PRINT A PERIOD\r
+;CALL: PUSHJ PDP,PRPER\r
+\r
+INTERNAL PRPER\r
+\r
+PRPER: JSP TAC,CONMES\r
+ ASCIZ /./\r
+\f\r
+;ROUTINE TO DEASSIGN A DEVICE\r
+;CALL: MOVE DEVDAT, DEVICE DATA BLOCK\r
+; MOVE ITEM, JOB NUMBER\r
+; PUSHJ PDP, DEASG\r
+; ERROR NOT PREVIOUSLY ASSIGNED\r
+; OK RETURN WITH DEVICE DEASSIGNED\r
+\r
+INTERNAL DEASG\r
+EXTERNAL PJOBN,CPOPJ1,IPOPJ\r
+\r
+DEASG: LDB T, PJOBN ;WAS DEVICE ASSIGNED TO THIS JOB?\r
+ CAME T, ITEM\r
+ POPJ PDP, ;NO, RETURN\r
+ PUSH PDP,ITEM ;SAVE JOB NUMBER\r
+ MOVSI TAC1,DVDIRI ;CLEAR DIRECTORY IN CORE BIT\r
+ ANDCAB TAC1,DEVMOD(DEVDAT) ;SET DEVICE CHARACTERISTICS FOR TEST\r
+ ; AND ASGHGH\r
+ SETZM DEVLOG(DEVDAT) ;CLEAR LOGICAL NAME\r
+\r
+ TRNE TAC1,ASSCON ;IS DEVICE ASSIGNED BY CONSOLE?\r
+ AOS -1(PDP) ;YES, DO OK RETURN\r
+IFN FT2REL,<\r
+ EXTERN ASGHGH\r
+ PUSHJ PDP,ASGHGH ;IF DTA OR MTA, CLEAR ANY HIGH SEGMENT NAMES\r
+ ; FROM THIS DEVICE SO NO NEW SHARING\r
+ ; DEVMOD SETUP IN TAC1 ON CALL\r
+>\r
+ MOVEI TAC1,ASSCON ;SETUP ASSIGNED BE CONSOLE BIT FOR RELEASE\r
+ PUSHJ PDP,RELEA6 ;CLEAR JOB NO. IN DDB IF DDB NOT NEEDED\r
+ JRST IPOPJ ;RESTORE JOB NUMBER AND RETURN\r
+\r
+;ROUTINE TO DEASSIGN ALL DEVICES EXCEPT LOGICAL TTY\r
+;CALL: MOVE ITEM, JOB NUMBER\r
+; MOVE DEVDAT,ADR. OF DEVICE NOT TO BE DEASSIGNED\r
+; PUSHJ PDP, DEASTY\r
+\r
+INTERNAL DEASAL,DEASTY\r
+EXTERNAL DEVLST\r
+\r
+DEASTY:\r
+DEASAL: PUSH PDP,DEVDAT ;SAVE TTY DDB ADDRESS\r
+ HLRZ DEVDAT,DEVLST ;SEARCH ALL DDB'S\r
+DEA1: CAIE DEVDAT,@(PDP) ;IS THIS DEVICE NOT TO BE DEASSIGNED?\r
+ PUSHJ PDP, DEASG ;NO, TRY TO DEASSIGN IT\r
+ JFCL ;IGNORE IF CAN'T\r
+ HLRZ DEVDAT, DEVSER(DEVDAT)\r
+ JUMPN DEVDAT, DEA1\r
+ POP PDP,DEVDAT ;RESTORE TTY DDB ADDRESS\r
+ POPJ PDP,\r
+\f\r
+;ROUTINE TO REA CONSOLE AND CONVERT ANY RADIX NUMBER\r
+; CALL: MOVE TAC1, DESIRED RADIX\r
+; MOVE TAC, BYTE POINTER TO FIRST CHARACTER\r
+; PUSHJ PDP, ANYRIN\r
+; NO ARG. TYPED RETURN, TAC1=0\r
+; ILLEGAL CHARACTER RETURN\r
+; NORMAL EXIT TAC TAC1 CONTAINS NUMBER\r
+;SCAN STOPS ON FIRST OR,DASH,SPACE,OR TAB OR ILLEGAL CHAR.\r
+;SKIPS LEADING SPACES AND TABS\r
+\r
+INTERNAL OCTIN,OCTIN1,DECIN,DECIN1\r
+EXTERNAL CPOPJ1,CPOPJ2\r
+\r
+C=BUFPNT ;CHARACTER AC\r
+R=BUFWRD ;RADIX AC\r
+\r
+DECIN1:\r
+DECIN: MOVEI R,12 ;DECIMAL INPUT\r
+ JRST ANYRIN\r
+\r
+OCTIN1:\r
+OCTIN: MOVEI R,10 ;OCTAL INPUT\r
+ANYRIN: PUSHJ PDP,SKIPS1 ;SKIP LEADING SPACES, TABS, NULLS\r
+ ; DO NOT RETURN IF CR WAS PREVIOUS BREAK\r
+ ; OR THIS BREAK\r
+IFE FTTTYSER,< LDB TEM,TAC>\r
+OCT0: CAIGE TEM,175 ;ALTMODES(175 OR 176)?\r
+ CAIN TEM,"[" ;NO. LEFT BRACKET(SO SPACE NOT REQ\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
+ JRST CPOPJ2 ;YES, ONLY LEGAL TERMINATORS\r
+ CAIE TEM,"," ;COMMA?\r
+ CAIN TEM,"]" ;RIGHT BRACKET?\r
+ JRST CPOPJ2 ;YES.\r
+ SUBI TEM,60 \r
+ JUMPL TEM,CPOPJ1 ;ERROR IF NEG.,REMOVE SUB. RETURN AND PRINT\r
+ CAML TEM, R ;OR .GE. RADIX\r
+ JRST CPOPJ1 ;ERROR, GREATER OR EQUAL TO RADIX\r
+ IMUL TAC1, R\r
+ ADD TAC1,TEM\r
+IFE FTTTYSER,< ILDB TEM,TAC ;NEXT CHAR>\r
+IFN FTTTYSER,< PUSHJ PDP,GETCHR> ;NEXT CHAR\r
+ JRST OCT0\r
+\f\r
+INTERNAL FTLOGIN\r
+IFN FTLOGIN,<\r
+;GET PROJECT-PROGRAMMER NUMBERS\r
+;CALL: MOVE TAC,INPUT BYTE POINTER\r
+; PUSHJ PDP,PJPGNO\r
+;\r
+;(AC2)LH _ PROJECT NUMBER\r
+;(AC2)RH _ PROGRAMMER NUMBER\r
+;(AC2) = 0 IF NO [ ]'S TYPED\r
+;THE TERMINAL ] IS OPTIONAL\r
+\r
+IFE FTTTYSER,<\r
+PJPGNO: SKIPA TAC1,TAC ;SAVE INPUT BYTE POINTER IN CASE NO\r
+ ; [ ]'S WERE TYPED IN.\r
+PP0: IBP TAC ;GET NEXT CHARACTER (2ND TIME THRU LOOP)\r
+ LDB TEM,TAC ;GET CHAR WHICH STOPED PREVIOUS FIELD SCAN\r
+ ; (OR NEXT CHAR ON 2ND TIME THRU LOOP)\r
+>\r
+\r
+IFN FTTTYSER,<\r
+PP0: PUSHJ PDP,SKIPS1\r
+PJPGNO:\r
+>\r
+ CAIN TEM,"[" ;IS IT A "[" ?\r
+ JRST PP1 ;YES, GET PROJECT-PROGRAMMER NUMBERS FROM INSIDE.\r
+ CAIE TEM," " ;NO, IS IT A SPACE ?\r
+ CAIN TEM,11 ; OR A TAB?\r
+ JRST PP0 ;YES, KEEP LOOKING FOR "[".\r
+ MOVEI AC2,0 ;NEITHER SPACE NOT TAB, THUS RETURN A 0 MEANING\r
+ ; NO PROJECT-PROGRAMMER NUMBER ENCOUNTERED.\r
+IFE FTTTYSER,< MOVEM TAC1,TAC ;RESTORE ORIGINAL BYTE POINTER.>\r
+ POPJ PDP, ;EXIT.......\r
+\r
+PP1:\r
+IFN FTTTYSER,< PUSHJ PDP,SKIPS>\r
+ PUSHJ PDP,OCTIN ;GET FIRST ARG.-PROJ. NO.\r
+ JRST COMERP ;NO ARG. GIVEN\r
+ JRST COMERP ;ILLEGAL DECIMAL CHARACTER GIVEN\r
+ HRL AC2,TAC1 ;ENTER\r
+IFN FTTTYSER,< CAIE TEM,","\r
+ JRST COMERP\r
+ PUSHJ PDP,SKIPS>\r
+ PUSHJ PDP,OCTIN ;GET SECOND ARG.-PROG. NO.\r
+ JRST COMERP ;\r
+ JRST COMERP ;\r
+ HRR AC2,TAC1 ;ENTER\r
+ PUSHJ PDP,SKIPS1 ;SKIP BLANKS\r
+ CAIN TEM,"]" ;IS USUAL ENDING A "]"?\r
+IFE FTTTYSER,<IBP TAC> ;YES, SKIP IT\r
+IFN FTTTYSER,<PUSHJ PDP,GETCHR> ;YES, SKIP IT SO FINAL ] IS OPTIONAL\r
+ POPJ PDP, ;RETURN RO CALL\r
+>\r
+\f\r
+;ROUTINE TO PRINT TIME AS HOURS,MINUTES,SECONDS, AND HUNDRETHS\r
+;FORMAT IS HHMM:SS.HH\r
+;CALL: MOVE TAC,TIME IN JIFFIES(60THS,50THS OR MILLISECONDS)\r
+; MOVE DAT,OUTPUT TEXT BYTE POINTER\r
+; PUSHJ PDP,PRTIME\r
+\r
+;SCALEING IS DONE USING THE FOLLOWING GLOBAL SYMBOLS DEFINED\r
+;ON THE CONFIGURATION TAPE (IOINI1)\r
+;THUS ANY INSTALLATION MAY HAVE ANY RATE CLOCK\r
+\r
+EXTERNAL JIFMIN,JIFSEC,JIFSC2\r
+\r
+;JIFMIN=NO. OF JIFFIES(CLOCK TICKS) PER MINUTE\r
+;JIFSEC=NO. OF JIRFIES PER SECOND\r
+;JIFSC2=1/2*JIFSEC(USED FOR ROUNDING)\r
+\r
+INTERNAL PRTIME\r
+\r
+PRTIME: IDIVI TAC,JIFMIN ;FORM MINUTES\r
+ PUSH PDP,TAC1 ;SAVE REMAINDER IN JIFFIES\r
+ JUMPE TAC,PR1 ;SUPRESS 0 HOURS IN MINUTES\r
+ IDIVI TAC,^D60 ;HOURS, MINUTES IN TAC,TAC1\r
+ JUMPE TAC,PR0 ;SUPPRES 0 HOURS\r
+ PUSHJ PDP,RADX10\r
+ PUSHJ PDP,INLMES ;PRINT "HH:" OR "H:"\r
+ ASCIZ /:/\r
+PR0: MOVE TAC,TAC1 ;GET MINUTES\r
+ PUSHJ PDP,PRT2 ;PRINT "MM:"\r
+ PUSHJ PDP,INLMES\r
+ ASCIZ /:/\r
+PR1: POP PDP,TAC ;RESTORE SECONDS(IN JIFFIES)\r
+ IDIVI TAC,JIFSEC ;JIFFIES PER SECOND\r
+ PUSHJ PDP,RADX10 ;PRINT SECONDS\r
+ PUSHJ PDP,PRPER ;PRINT PERIOD\r
+ MOVE TAC,TAC1 ;NO OF JIFFIES(HUNDRETHS)\r
+ IMULI TAC,^D100 ;CONVERT TO HUNDRETHS\r
+ IDIVI TAC,JIFSEC\r
+ CAIL TAC1,JIFSC2 ;ROUND IF GREATER THEN HALF\r
+ AOS TAC\r
+ JRST PRT2LF ;PRINT\r
+\f\r
+PRTIM1: IDIVI TAC,JIFMIN ;\r
+ IDIVI TAC,^D60 ;HOURS,MINUTES IN TAC,TAC1\r
+ PUSHJ PDP,PRT2\r
+ PUSHJ PDP,INLMES ;PRINT "HH:"\r
+ ASCIZ /:/\r
+ MOVE TAC,TAC1\r
+PRT2LF: PUSHJ PDP,PRT2 ;PRINT "MM\r
+ JRST CRLF\r
+\r
+PRT2: MOVEI TEM,"0"\r
+ CAIGE TAC,^D10\r
+ XCT CONOUT ;PUT LEADING 0 IF LESS THEN 10\r
+ JRST RADX10 ;PRINT REST OF NUMBER\r
+\f\r
+;ROUTINE TO PRINT SIZE OF LOGICAL SEGMENT (LOW OR HIGH)\r
+;CALL: MOVE ITEM, HIGH OR LOW SEG NUMBER\r
+; PUSHJ PDP,PRT SEG\r
+; RETURN\r
+;CALLED AT CLOCK LEVEL FROM CORE (UUO ARG) COMMAND AND SEGCON\r
+\r
+ INTERN PRTSEG\r
+ EXTERN PCORSZ\r
+\r
+PRTSEG: PUSHJ PDP,SEGSIZ ;TAC1=SIZE OF HIGH OR LOW SEG\r
+ MOVE TAC,TAC1 ;RADX10 WANT DEC. NO. IN TAC\r
+ JRST RADX10 ;PRINT DECIMAL\r
+\r
+;ROUTINE TO RETURN SIZE OF HIGH OR LOW SEG\r
+;CALL: MOVE ITEM,LOW OR HIGH SEG NUMBER\r
+; PUSHJ PDP,SEGSIZ\r
+; RETURN WITH SIZE IN K IN TAC1\r
+\r
+ INTERN SEGSIZ\r
+ EXTERN CPOPJ\r
+\r
+SEGSIZ:\r
+IFN FTSWAP,<\r
+ EXTERN IMGIN\r
+ LDB TAC1,IMGIN ;SIZE WHEN NEXT SWAPPED IN(IN K)\r
+ JUMPN TAC1,CPOPJ ;0 MEANS NOT SWAPPED OUT\r
+>\r
+ HLRZ TAC1,JBTADR(ITEM) ;SIZE-1 LOW LOW OR HIGH SEG IN WORDS IN CORE\r
+ JUMPE TAC1,CPOPJ ;IS IT IN CORE?\r
+ LSH TAC1,-12 ;YES, CONVERT TO #K-1\r
+ AOJA TAC1,CPOPJ ;ADD 1 AND RETURN NUMBER OF K\r
+\f\r
+;ROUTINE TO ASSIGN A MINIMAL CORE AREA(140 WORDS)\r
+;CALLED FROM CORE,KJOB, AND RUN COMMANDS\r
+;THIS ROUTINE PRESERVES INPUT BYTE POINTER IN TAC\r
+;CALL: PUSHJ PDP,GETMIN\r
+; RETURN PROG=0 IF UNSUCCESSFUL OR CORE ASSIGNED ON DISK\r
+\r
+ EXTERN JOBDA,TPOPJ\r
+\r
+GETMIN:\r
+IFE FTTTYSER,<\r
+ PUSH PDP,TAC ;SAVE INPUT BYTE POINTER TO COMMAND\r
+>\r
+IFN FTTTYSER,<\r
+ PUSH PDP,DEVDAT ;SAVE TTY DDB ADR\r
+>\r
+ PUSH PDP,TAC1 ;SAVE DEVICE NAME(GET)\r
+ PUSH PDP,IOS ;SAVE DISPATCH ADDRESS(ANYACT USES IOS)\r
+IFN FT2REL,<\r
+ EXTERN KILHGH\r
+\r
+ PUSHJ PDP,KILHGH ;KILL HIGH SEG\r
+>\r
+ MOVEI TAC,JOBDA ;LENGTH OF JOBDATA AREA\r
+ PUSHJ PDP,CORE0 ;ASSIGN 140 WORDS ON DISK OR MEMORY\r
+ JFCL ;IGNORE IF CANT(PROG=0)\r
+ POP PDP,IOS \r
+ POP PDP,TAC1 ;RESTORE PUSHED ACS\r
+IFN FTTTYSER,<\r
+ POP PDP,DEVDAT ;RESTORE TTY DDB ADR\r
+ POPJ PDP, ;TAC NOT USER BY FULL DUPLEX SCNSER\r
+>\r
+IFE FTTTYSER,<\r
+ JRST TPOPJ ;RESTORE TAC AND RETURN\r
+>\r
+\f\r
+;ROUTINE TO GET 1 WORD FORM USER ARE WHICH CAN BE IN LOW OR HIGH SEG\r
+;CALL: MOVE PROG,[XWD PROT,RELOC FOR LOW SEG]\r
+; MOVE ITEM,JOB NUMBER\r
+; HRLI UUO,PROG ;FOR RELOCATION\r
+; HRR UUO,USER ADDRESS(IE BEFORE RELOCATION)\r
+; PUSHJ PDP,GETWRD\r
+; ERROR RETURN ADDRESS OUT OF BOUNDS\r
+; OK RETURN, CONTENTS IN AC TAC\r
+;CAN BE CALLED AT CLOCK OR UUO LEVEL\r
+;CALLED FROM E COMMAND,INIT,OPEN AND CALL UUOS\r
+\r
+ INTERN GETWRD\r
+ EXTERN CPOPJ1\r
+\r
+GETWRD: HLRZ TAC,PROG ;LARGEST REL LOC IN LOW SEG\r
+ CAIGE TAC,(UUO) ;IS ADR. IN LOW SEG?\r
+IFN FT2REL,<\r
+ EXTERN HGHWRD\r
+ JRST HGHWRD ;NO, CHECK IF IN HIGH SEG(ERROR RET IF NO)\r
+>\r
+IFE FT2REL,<\r
+ POPJ PDP, ;NO, ERROR RETURN\r
+>\r
+ MOVE TAC,@UUO ;YES, GET IT FROM LOW SEG\r
+ JRST CPOPJ1 ;AND SKIP RETURN\r
+\f\r
+SUBTTL SAVGET - SAVE,GET,R,RUN COMMANDS AND RUN,GETSEG UUOS\r
+\r
+;SAVGET LOWER CORE LOCATIONS USED FOR UUOS TO MONITOR\r
+;USED IN SAVGET IN APRSER AND SAVGET IN SEGCON\r
+;THESE LOCATIONS ARE DEFINED TO BE IN THE USERS UUO ACS\r
+\r
+;FOR LOOKUP,ENTER UUOS:\r
+ XP SGANAM,0 ;FILE NAME\r
+ XP SGAEXT,SGANAM+1 ;FILE EXTENSION\r
+ XP SGADAT,SGANAM+2 ;FILE CREATION DATE+TIME\r
+ XP SGALEN,SGANAM+3 ;LN=-LENGTH,RH=FIRST LOC-1 DUMPED\r
+ ; OR PROJECT-PROGRAMMER NUMBER(DISK)\r
+ XP SGAEND,SGALEN+1 ;LAST WORD OF DUMP COMMAND LIST=0(SAVE AND GET)\r
+ XP SGAREN,SGAEND ; ALSO FIRST WORD FOR RENAME USED AS DELETE\r
+ XP SGAPPN,SGAREN+3 ;FOURTH WORD-PLACE TO SAVE PROJECT-PROGRAMEMR\r
+ ; NUMBER USER TYPED\r
+\r
+;FOR OPEN UUOS:\r
+ XP SGAMOD,10 ;IOS MODE WORD FOR OPEN UUO\r
+ XP SGADEV,SGAMOD+1 ;DEVICE NAME\r
+ XP SGAHED,SGAMOD+2 ;INPUT-OUTPUT BUFFER HEADER ADDRESSES=0\r
+\r
+;MISC. DATA LOCATIONS:\r
+\r
+ XP SGADMP,13 ;DUMP COMMAND IOWD\r
+ XP SGACOR,14 ;AC FOR CORE UUO'S(HIGHEST USER LOC DESIRED)\r
+ XP SGANEW,15 ;NEW CORE ASSIGNMENT AS SPECIFIED BY THIRD ARG\r
+ XP SGAHGH,16 ;LH=EXT TO USE FOR SAVING HIGH SEG\r
+ ; RH=EXT TO DELETE(IE SHRHGH OR HGHSHR)\r
+ XP SGALOW,17 ;LH=EXT WHICH USER TYPED FOR SAVE OR GET COMMAND\r
+ ; OR .SAV IF HE DIDN'T TYPE AN ARG WITH LEADING PERIOD\r
+ ; RH=0\r
+\f\r
+;ROUTINE TO SCAN COMMAND STRING ARGUMENTS FOR SAVE,GET,RUN AND R\r
+;COMAMNDS AND STORE THEM IN JOB DATA AREA WHICH MUST BE IN CORE\r
+;WHEN SGSET IS CALLED FROM COMMAND DECODER\r
+;CALL: MOVE TAC,INPUT BYTE POINTER\r
+; MOVE TAC1,SIXBIT DEVICE NAME\r
+; MOVE DAT,OUTPUT BYTE POINTER\r
+; MOVE IOS,ADR. OF MONITOR JOB(SAVJOB,GETJOB,RUNJOB)\r
+; MOVE PROG, ADR. OF JOB AREA\r
+; PUSHJ PDP,SGSET\r
+\r
+C=BUFPNT\r
+\r
+INTERNAL FTLOGIN,FT2REL,FTDISK\r
+EXTERNAL JOBCOR,JBTPRG\r
+\r
+SGSET: JUMPE TAC1,NOTENF ;NOT ENOUGH ARE IF NO DEVICE NAME\r
+ MOVEM TAC1,SGADEV(PROG) ;STORE DEVICE NAME\r
+ SKIPN TAC1,JBTPRG(ITEM) ;GET AUTOMATIC FILENAME, OR\r
+ PUSHJ PDP, CTEXT1 ;GET FILE NAME FROM COMMAND STRING\r
+ JUMPE TAC1,NOTENF ;THERE MUST BE A FILE NAME\r
+ MOVEM TAC1,SGANAM(PROG) ;STORE FILE NAME\r
+ MOVEM TAC1,JBTPRG(ITEM) ;SAVE FILE NAME FOR SYSTAT COMMAND\r
+ MOVEI TAC1,0 ;ASSUME USER DID NOT SPECIFY AN EXTENSION\r
+ ; 0 WILL BE TURNED INTO SAV OR DMP\r
+IFE FTTTYSER,< LDB TEM,TAC>\r
+ CAIN TEM,"." ;IS AN EXTENSION SPECIFIED?\r
+ PUSHJ PDP,CTEXT ;YES. GET EXTENSION\r
+ HLLZM TAC1,SGAEXT(PROG) ;STORE IT FOR LOOKUP\r
+IFN FT2REL,<\r
+ EXTERN SETEXT ;ALSO SAVE IT AGAIN IN SGALOW FOR LOW SEG\r
+ ; LOOKUP OR ENTER\r
+ PUSHJ PDP,SETEXT ;SET HIGH EXTENSION(SGAHIGH) TO .SHR IF SSAVE OR GET\r
+ ; .HGH IF SAVE(LH IOS=NSRBIT).\r
+>\r
+ SETZM SGADAT(PROG) ;SET DATE(E+2) TO 0, SO MONITOR WILL USE TODAYS\r
+IFN FTLOGIN,<\r
+ PUSHJ PDP,PJPGNO ;GET PROJ, PROG. NO.\r
+ MOVEM AC2,SGAPPN(PROG) ;STORE 0 IF NO []'S TYPED BY USER\r
+>\r
+ PUSHJ PDP,DECIN1 ;AMOUNT OF CORE (OPTIONAL THIRD ARG.)\r
+ JRST SGSET1 ;DOES NOT RETURN IF ERROR. RETURN HERE IF NO ARG.\r
+ JRST COMERA ;ILLEGAL CHARACTER\r
+ LSH TAC,12 ;CONVERT TO HIGHEST REL. LOC.\r
+ SUBI TAC,1\r
+SGSET1: MOVEM TAC1,SGANEW(PROG) ;STORE FOR RUN AND SAVE\r
+ HRRZ TAC1,IOS ;SCHEDULE MONITOR JOB \r
+ ; GUARRANTEE LH OF PC WORD IS 0, SINCE IT WILL\r
+ ; BE ADDED TO STARTING ADDRESS(IF RUN COM)\r
+ JRST MSTART ;START JOB WITH PC IN MONITOR MODE\r
+\f\r
+;ROUTINE TO PICKUP ARGUMENTS FOR RUN AND GETSET UUOS\r
+;THIS ROUTINE DOES SAME THING AS SGSET, EXCEPT THAT ARGUMENTS ARE\r
+;OBTAINED FROM USER UUO ARGUMENTS INSTEAD OF FROM CONSOLE COMMAND\r
+;THE USERS ARG ARE MOVED TO USER ACS(SGA...), THEREBY CLOBBERING HIS AC$S\r
+;USER AC FIELD AND START PC OFFSET(RUN UUO) ARE SAVED ON PD LIST AT JOBPD3\r
+;THEN LOWER CORE IS SET UP(SG2 CALLED) RESET IS NOT DONE (FOR GETSEGUUO)\r
+;JBTPRG NOT SET FOR LOW SET, SINCE GETSEGUUO SHOULD NOT\r
+;CALL: MOVE TAC,CONTENTS OF USER AC(ADR. OF 3 WORD ARG LIST)\r
+; MOVE PROG,JOB RELOCATION\r
+; PUSHJ PDP,GETARG\r
+; RETURN\r
+\r
+ INTERN GETARG\r
+ EXTERN JBTPROG,JOBCORE,PUUOAC\r
+\r
+GETARG: HRR UUO,TAC ;MOVE ADR. OF ARG LIST TO UUO\r
+ EXCH TAC,(PDP) ;AND PUT ON PD LIST\r
+ PUSH PDP,TAC ;MOVE RETURN PC UP ONE IN PD LIST\r
+ LDB TAC,PUUOAC ;USER AC FIELD IN RUN OF GETSEG UUO\r
+\r
+ HRRM TAC,-1(PDP) ;SAVE IN CASE OF ERROR RETURN\r
+ PUSHJ PDP,GETWDU ;GET FIRST ARG FROM USER AREA\r
+ MOVEM TAC,SGADEV(PROG) ;STORE DEVICE NAME\r
+ PUSHJ PDP,GETWD1 ;GET NEXT ARG FROM USER ARREA\r
+ MOVEM TAC,SGANAM(PROG) ;STORE FILE NAME FOR LOOKUP (DO NOT STORE FOR LOWSEG)\r
+ PUSHJ PDP,GETWD1 ;GET THIRD ARG(EXTENSION WORD E+1)\r
+ MOVE TAC1,TAC ;PUT ARG IN TAC1, SO SMAE AS SGSET RETURN FROM CTEXT\r
+ MOVEM TAC1,SGAEXT(PROG) ;STORE EXTENSION AND RH FROM USER\r
+IFN FT2REL,<\r
+ EXTERN SETEX1\r
+ PUSHJ PDP,SETEX1 ;SAVE EXT AGAIN IN SGALOW\r
+ ; SETUP EXT FOR HIGH SEG(SGAHGH="SHR")\r
+ ; SETUP EXTENSION FOR LOW SEG(SGALOW="SAV")\r
+>\r
+ PUSHJ PDP,GETWD1 ;GET FOURTH ARG(DATE WORD)\r
+ MOVEM TAC,SGADAT(PROG)\r
+ PUSHJ PDP,GETWD1 ;GET FIFTH USER ARG FROM USER AREA\r
+ MOVEM TAC,SGAPPN(PROG) ;STORE PROJECT,PROGRAMMER NO. OR 0\r
+ PUSHJ PDP,GETWD1 ;SIX ARG FROM USER\r
+ HRRZM TAC,SGANEW(PROG) ;STORE CORE ARG OR 0(HIGHEST LOC DESIRED)\r
+ ; IGNORE LH\r
+ JRST SG2A ;GO SET UP LOWER CORE AND RETURN\r
+ ; DO NOT DO A RESET\r
+\f\r
+;THIS JOB SAVES A JOB AREA ON RETRIEVABLE STORAGE\r
+;THIS JOB RUNS IN EXEC MODE AND CALLS IO ROUTINES USING REGULAR UUOS\r
+;NO ATTEMPT IS MADE TO SAVE STATUS OF IO DEVICES, JOBDP, OR AC'S\r
+;IN FACT THE ONLY USEFUL THING WHICH MAY BE DONE WITH A JOB AREA\r
+;AFTER IT HAS BEEN SAVED IS TO START EXECUTIUON OVER AT THE STARTING\r
+;ADDRESS\r
+\r
+INTERNAL SAVJOB,SAVERR\r
+EXTERNAL JOB41,JOBS41,JOBDDT,JOBSDD,JOBSV\r
+\r
+SAVJOB: JSP TAC1,SG1 ;SET UP ACS PROG,PDP,JDAT,ITEM.\r
+ ; RESET DEVICES\r
+ HLRE TAC1,SGADMP(PROG) ;-NO. OF WORDS TO WRITE\r
+ PUSHJ PDP,CKIOWD ;CHECK USER'S CORE ARG(IF ANY) WITH AMOUNT\r
+ ; RETURN ONLY IF 0 OR NOT SMALLER\r
+ HRRM TAC,JOBCOR(PROG) ;STORE MAX OF SIZE OF FILE OR CORE ARG\r
+ ; FOR ASSIGNING INITIAL CORE WHEN FILE GOTTEN\r
+IFN FT2REL,<\r
+ EXTERN SAVHGH\r
+ PUSHJ PDP,SAVHGH ;INIT DEV,SAVE HIGH SEG, IF ANY, RETURN IF OK\r
+ JRST SAVFIN ;HIGH SAVED, BUT NO DATA IN LOW SEG, SO DO\r
+ ; NOT WRITE LOW FILE\r
+ ; SKIP RETURN IF LOW SEG TO BE WRITTEN\r
+>\r
+ ; SGALEN, AND SGAEXT RESTORED\r
+SAVJB1: OPEN 0,SGAMOD ;RE INIT DEVICE, SO UGETF WILL SET FIRST FREE\r
+ ; BLOCK BECAUSE NO LOOKUP OR ENTER DONE\r
+ JRST SGERRA ;DEVICE NOT AVAILABLE\r
+ UGETF 0,SGAHED ;GET FIRST FREE BLOCK(MEANINGFUL ONLY IF DTA)\r
+ ; CAUSE ENTER TO ASSIGN FIRST LOBCK OF FILE\r
+ ; AS LOWEST FREE BLOCK SO TENDMP CAN READ\r
+ ENTER 0,SGANAM ;ENTER FILE NAME IN DIRECTORY\r
+ JRST SAVERR ;DIRECTORY FULL OR PROTECTION FAILURE\r
+ MOVE TAC,JOB41(JDAT) ;SAVE USER UUO HANDLING JSR\r
+ MOVEM TAC,JOBS41(JDAT) ;IN UPPER PART OF JOB DATA AREA\r
+\f\r
+ MOVE TAC,JOBDDT(JDAT) ;SAVE DDT STARTING ADDRESS HIGHER UP IN JOB DATA AREA\r
+ MOVEM TAC,JOBSDD(JDAT) ;SO COMPRESS ALWAYS MOVES CODE DOWN\r
+ HRROS USRHCU ;FLAG THAT SAVE GET IS UNDER WAY\r
+ ; SO THAT JOBHRL WILL NOT BE MODIFIED BY SETHGH RUOTINE\r
+ ; TO USER'S HIGH SEG RELOCATION INFO. SINCE\r
+ ; IT WILL CONTAIN COMPRESSION IOWD.\r
+ ; COMPRESSION WILL ALWAYS MOVE DOWN\r
+ HRRZ TEM,JOBSA(JDAT) ;SAV START ADDRESS FOR 10DMP\r
+ MOVEI TAC,JOBSV(PROG) ;POINT TO 1ST DATA WORD\r
+ MOVE TAC1,[XWD PROG,JOBSDD] ;IT STARTS AT JOBSDD\r
+ HLRE ITEM,SGADMP(PROG) ;IOWD FOR THIS SIZE CORE(-LENGTH TO WRITE)\r
+ MOVNS ITEM ;POSITIVE LENGTH\r
+ ADDI ITEM,JOBSVM ;ADD IN FIRST LOC-1 TO WRITE=HIGHEST LOC TO WRITE\r
+ ; TO MAKE END TEST\r
+ HRLI ITEM,PROG ;USE PROG FOR RELOCATION\r
+CMPLP1: MOVEM TAC,DAT ;SAVE 1ST LOC FOR IOWD\r
+ CAMLE TAC1,ITEM ;SEARCH FOR 1ST NON-0 WORD\r
+ AOJA TAC,CMPTHR ;THROUGH\r
+\r
+ SKIPN @TAC1 ;THIS A DATA WORD?\r
+ AOJA TAC1,.-3 ;NO, KEEP LOOKING\r
+ MOVNI AC1,1 ;YES, AC1 WILL BE AN IOWD\r
+ HRLI AC1,-1(TAC1) ;1ST LOCATION - 1\r
+CMPLP2: PUSH TAC,@TAC1 ;SAVE A DATA WORD\r
+ AOS TAC1\r
+ CAMGE TAC1,ITEM ;AT TOP?\r
+ SKIPN @TAC1 ;NO. NEXT WORD NON-0?\r
+ JRST .+2 ;NO. THROUGH THIS BLOCK\r
+ SOJA AC1,CMPLP2 ;COUNT THE WORD AND CHECK NEXT\r
+ MOVSM AC1,(DAT) ;SAVE IOWD IN FRONT OF BLOCK\r
+ AOJA TAC,CMPLP1 ;LOOK FOR NEXT NON-0 BLOCK\r
+CMPTHR: HRLI TEM,254000 ;SET A JRST C(JOBSA)\r
+ MOVEM TEM,-1(TAC) ;AT END OF FILE\r
+ SUBI TAC,JOBSV(JDAT) ;COMPUTE WORD COUNT\r
+ MOVNS TAC ;MAKE AN IOWD\r
+ HRL TAC,SGADMP(PROG) ;START ADDRESS\r
+ MOVSM TAC,SGALEN(PROG) ;IOWD FOR THE OUTPUT UUO\r
+ MOVEI TAC,-2 ;FLAG THAT CORE HAS BEEN COMPRESSED\r
+ HRLM TAC,USRHCU ;KEEP LH NEG. COMMAND DECODER WILL EXPAND\r
+ ; CORE ON START ,ODT,SAVE, REENTER,SSAVE IN CASE\r
+ ; THIS SAE IO DOES NOT GO TO COMPLETION. (CONTROL C\r
+ ; OR DEVICE FULL, SO THAT CORE DOES NOT GET EXPANDED\r
+\f\r
+ PUSHJ PDP,SGDOA ;DO OUTPUT,RELEASE,FIND TTY\r
+ OUTPUT 0,SGALEN ;OUTPUT UUO EXECUTED BY SGDO\r
+ ; RETURN HERE ONLY IF NO ERRORS\r
+SAVFIN: PUSHJ PDP,SGREL ;RELEASE DEVICE AND FIND TTY\r
+ JSP TAC,PHOLD ;PRINT MESSAGE AND STOP JOB\r
+ ASCIZ /JOB SAVED/\r
+SAVERR: MOVEI TAC,PRTERR ;ERROR CORE IN CASE RUN UUO(PROTECTION ERROR)\r
+ ; CHANGE TO DISK ERROR CODE IF DEV IS DSK\r
+ PUSHJ PDP,SGRELL ;CHANGE TO DISK ENTER ERROR CODE IF DSK\r
+ ; RELEASE DEVICE AND RETURN TO USER(IF RUN UUO)\r
+ ; OR FIND TTY=PRINT ?CRLF\r
+ JSP TAC,PHOLD ;PRINT MESSAGE AND STOP JOB\r
+ ASCIZ /DIRECTORY FULL/\r
+\f\r
+;THIS JOB GETS A JOB AREA FROM A RETRIEVABLE DEVICE\r
+;THIS JOB RUNS IN EXEC. MODE AND CALLS IO ROUTINES DIRECTLY\r
+;NO ATTEMPT IS MADE TO RESTORE STATUS OF IO DEVICES, PC, OR AC'S\r
+;JOBPC IS SET TO STARTING ADDRESS OF JOB\r
+;CORE MUST ALREADY HAVE BEEN ASSIGNED AND THE FOLLOWING LOC. SETUP IN\r
+;JOB DATA AREA:\r
+;JOBPDP, JOBREL\r
+\r
+INTERNAL GETJOB\r
+\r
+GETJOB: JSP TAC1,SG1 ;SETUP ACS, SETUP LOWER CORE(SGALEN,SGADMP)\r
+ PUSHJ PDP,GETJB ;GET THE JOB\r
+ JSP TAC,PHOLD ;RETURN ONLY IF EVERYTHING OK\r
+ ASCIZ /JOB SETUP/\r
+\r
+;THIS JOB GETS A JOB AREA FROM A RETRIEVAL DEVICE AND STARTS IT UP\r
+\r
+;JOB HAS JUST A JOB DATA AREA ASSIGNED WHEN CONTROL GETS HERE\r
+;THIS MONITOR JOB GETS A JOB AREA FROM A RETRIEVABLE DEVICE\r
+;ASSIGNS CORE AND START\r
+\r
+INTERNAL RUNJOB\r
+\r
+RUNJOB: JSP TAC1,SG1 ;SETUP ACS, SETUP LOWER CORE(SGALEN,SGADMP)\r
+ JRST URUN1 ;LH PF PC WORD=0(MSTART) SO LH OF TAC1=0 AFTER JSP\r
+ ; PUT TAC1 AS FIRST ITEM ON PD LIST(JOBPN1)\r
+ ; LH USED BY SGRELE ON ERROR TO SEE IF FROM USER\r
+ ; AND LH ADDED TO START PC(JOBSA) BY URUN\r
+\f\r
+;RUN UUO\r
+;CALL: MOVE AC,[XWD N,D]\r
+; CALL AC,[SIXBIT /RUN/]\r
+; ERROR RETURN ;UNLESS LH=HALT(PRINT CONSOLE MESS, IF YES)\r
+; 1K OK, TRANSFER TO C(JOBSA)+N FOR NEW PROGRAM\r
+; USERS ACS CLOBBERED SO CANNOT PASS DATA TO NEW PROGRAM\r
+\r
+;WHERE: D/ DEVICE NAME\r
+; D+1/ FILE NAME\r
+; D+2/ FILE EXT OR 0 (LH SIXBIT)\r
+; D+3/ DATE ETC\r
+; D+4/ PROJECT,PROGRAMMER NO OR 0(CURRENT UFD OR DTA,MTA)\r
+; D+5/ HIGHEST LOC DESIRED(OR 0) ANALOGOUS TO RUN COMMAND\r
+; LH IS IGNORED(RATHER THAN ASSIGNING CORE TO HIGH SEG)\r
+\r
+ INTERN URUN\r
+ EXTERN JOBSA\r
+\r
+URUN: PUSHJ PDP,RESET ;RELEASE DEVICES\r
+ ; WARNING! THIS GOES VERY DEEP IN\r
+ ; PUSHDOWN, SEE MOD 518\r
+ ; (AC UUO PRESERVED IN RESET)\r
+ MOVE TAC,@UUO ;RESTORE CONTENTS OF USERS'S CALLING AC\r
+ PUSHJ PDP,GETARG ;GET 6 ARGS FROM USER AND STORE\r
+ ; SAVE STARTING ADDRESS INCREMENT(LH OF TAC)\r
+ ; AND USER AC NUMBER(IN CASE OF ERROR RETURN)\r
+ ; SETUP ACS,DEVDAT TO DDB\r
+ MOVE TAC,SGANAM(PROG) ;STORE FILE NAME FOR LOW SEG\r
+ MOVEM TAC,JBTPRG(ITEM) ;FOR SYSTAT\r
+URUN1: PUSHJ PDP,GETJB ;GET BOTH LOW AND HIGH SEGMENTS\r
+ HLRZ TAC1,(PDP) ;GET STARTING ADDRESS INCREMENT(0 IF RUN COM)\r
+\r
+IFN FT2REL,<\r
+ EXTERN CHKMED\r
+ CAILE TAC1,1 ;IS START INCREMENT 0 OR 1?\r
+ PUSHJ PDP,CHKMED ;NO, CHECK TO SEE IF THIS IS SHARABLE SEG\r
+ ; AND IF YES, SET MEDDLE BIT FOR THIS USER\r
+ ; SO UWP CANNOT BE TURNED OFF AND CORE FOR HIGH SEG\r
+ ; CANNOT BE INCREASED OR DECREASED (TAC1 PRESERVED)\r
+>\r
+ ADDB TAC1,JOBSA(JDAT) ;ADD STARTING ADDRESS TO BOTH\r
+ ; SO THAT <CONTROL>C START WILL START\r
+ ; PROGRAM AT SAME STARTING ADDRESS\r
+ HRLI TAC1,USRMOD ;SET USER MODE BIT IN PC\r
+ PUSH PDP,TAC1 ;PUT ON PD LIST\r
+ JRST USRXIT ;AND GO TO RETURN TO USER AS IF FROM UUO\r
+\f\r
+;UUO TO GET JUST HIGH SEG AND RETURN TO USER\r
+;CALL IS THE SAME AS FOR RUN UUO EXCEPT THAT OK RETURN IS SKIP RETURN\r
+;IF ERROR RETURN HAS HALT IN LH, STANDARD CONSOLE MESSAGE IS PRINTED AND JOB STOPPED\r
+\r
+ INTERN UGTSEG,UGTERR\r
+UGTSEG:\r
+ \r
+IFN FT2REL,<\r
+ EXTERN UGETHI\r
+ JRST UGETHI ;IN SEGCON\r
+>\r
+UGTERR: MOVEI TAC,ILUERR ;ILLEGAL UUO ERROR CORE\r
+ PUSHJ PDP,SGRELE ;SEE IF USER WANTS ERROR\r
+ JRST UUOERR ;NO, PRINT ILLEGAL UUO\r
+\f\r
+;ROUTINE TO SETUP ACS, RESET IO, AND SETUP LOWER CORE LOCATIONS\r
+;FOR SAVE AND GET(SGALEN SET IO IOWD OR PP IF DTA OR DSK)\r
+;SGADMP SET TO IOWD FOR THIS SIZE CORE\r
+;CALL: JSP TAC1,SG1\r
+; ALWAYS RETURN HERE, UNLESS DEVICE NOT FOUND\r
+; DEVDAT SETUP TO DEVICE DATA BLOCK(BUT NOT INITED, UNLESS FT2REL=0)\r
+; SO THAT INIT NOT NECESSARTY IF SEG ALREADY KNOWN(NO DTA QUEUING)\r
+; DEVICE CHARACTERISTICS WORD(DEVMOD) RETURNED IN AC TAC1\r
+; IF DISK SYSTEM\r
+\r
+ INTERN SG1,SG3,SG4 ;CALLED FROM SEGCON\r
+ EXTERN USRDDT,USRREL,JOBSAV,JOBFF,CPOPJ1\r
+ EXTERN TTYFNU,JOBSVM,IADRCK,SAVDMP\r
+\r
+SG1: JSP TAC,MONSTR ;SETUP PROG.PDP,JDAT,ITEM=JOB NUMBER\r
+ ; PUT TAC1 ON END OF PD LIST(EXEC MODE PC,\r
+ ; SO ERROR MESSAGES WILL ALWAYS PRINT(SEE SGRELE)\r
+\r
+SG2: PUSHJ PDP,RESET ;RELEASE ALL DEVICES\r
+SG2A: MOVEI TAC,DR ;DUMP MODE 16(DUMP BY RECORDS\r
+ ; IN CASE THIS IS MAGTAPE)\r
+\r
+ MOVEM TAC,SGAMOD(PROG) ;STORE FOR OPEN UUO\r
+ SETZM SGAEND(PROG) ;0 END OF DUMPE MODE COMMAND LIST\r
+ SETZM SGAREN+1(PROG) ;FOR DELETE\r
+ SETZM SGAREN+2(PROG) ;FOR DELETE\r
+ HLLZS JOBCOR(JDAT) ;0 THIRD ARG IN JOBDATA AREA(SO CHKARG WILL\r
+ ; WORD ON FIRST CALL(SAVE AND GET)\r
+ SETZM SGAHED(PROG) ;CLEAR BUFFER HEADER ARG, FOR OPEN UUO\r
+IFE FT2REL,<\r
+ OPEN 0,SGAMOD ;TRY TO ASSIGN DEVICE, SINCE IT MUST BE DONE\r
+>\r
+IFN FT2REL,<\r
+ MOVE TAC,SGADEV(PROG) ;PHYSICAL OR LOGICAL DEVICE NAME\r
+ PUSHJ PDP,DEVSRC ;FIND DEVICE AND SETUP DEVDAT TO DDB\r
+ ; DO NOT INIT DEV SINCE IO MAY NOT BE NECESSARY\r
+ ; DO NOT WANT TO WAIT IN DTA SYSTEM\r
+ ; TAPE QUEUE IN 10/40 SYS\r
+>\r
+ JRST SGERRA ;NOT AVAILABLE\r
+ ;DEVICE INITED(OR FOUND)\r
+\f\r
+;COMMON EXIT FROM SAVHGH AND GETHGH ROUTINES(HIGH SEG SAVE AND GET)\r
+;SO THAT SGA... LOCATIONS ARE RESTOREED TO ORIGINAL VALUES FOR LOW SEG\r
+\r
+SG3: MOVE TAC,JOBFF(JDAT) ;FIRST FREE LOC IN JOB(SET FROM LH OF\r
+ ; JOBSA WHICH IS SET BY LOADER\r
+ MOVEI TAC,-1(TAC) ;MAKE LAST LOC TO SAVE OR GET(MAKE 0=777777)\r
+ SKIPN USRDDT ;USER DDT IN USE(IF YES, SAVE ALL OF CORE\r
+ ; SO HIS SYMBOLS WILL BE INCLUDED\r
+ PUSHJ PDP,IADRCK ;NO, ADDRESS TO SMALL OR TO LARGE?\r
+ MOVE TAC,USRREL ;YES, DUMP ALL OF CORE RATHER THEN GIVE\r
+ ; ADDRESS CHECK MESSAGE-HIGHEST REL.ADR.\r
+ MOVNS TAC ;-HIGHEST ADR TO SAVE TO GET\r
+ ADDI TAC,JOBSVM ;LOWER CORE NOT DUMPED\r
+ HRLI TAC,JOBSVM ;IE FIRST LOC-1 TO BE DUMPED\r
+ MOVSM TAC,SGADMP(PROG) ;STORE IOWD WORD OF THIS SIZE CORE\r
+SG4:\r
+IFN FTDISK,<\r
+ MOVE TAC1,DEVMOD(DEVDAT) ;RETURN DEVICE CHARACTERISTICS(IF DISK SYS)\r
+ TLNE TAC1,DVDSK ;IS THIS DEVICE A DISK?\r
+\r
+ MOVS TAC1,SGAPPN(PROG) ;YES. MAKE SURE FORTH WORD IS PROJ,PROG NO.\r
+>\r
+ MOVSM TAC,SGALEN(PROG) ;NO. MAKE SURE FORTH WORD IS IOWD FOR DECTAPE\r
+ ; SINCE DECTAPE USES RH TO COMPUTE LENGTH IN K\r
+ ; FOR BOTH SAVE AND GET\r
+ SKIPN TAC,SGAEXT(PROG) ;DID USER SPECIFY AN EXTENSION ?\r
+ MOVSI TAC,SAVDMP ;NO, USE .SAV OR .DMP\r
+ MOVEM TAC,SGAEXT(PROG) ;AND STORE FOR LOOK UP ORENTER\r
+ POPJ PDP,\r
+\r
+;ERROR ON INIT OR DEVICE SEARCH\r
+\r
+ INTERN SGERRA ;CALLED FROM SEGCON\r
+\r
+SGERRA: JUMPE DEVDAT,SGERR1 ;WAS DEVICE FOUND, BUT JUST UNAVAILABLE?\r
+ MOVEM DEVDAT,(PDP) ;YES, SAVE DDB ADDRESS FOR MESSAGE(ERNAM)\r
+ MOVEI TAC,DNAERR ;ERROR CODE IN CASE RUN UUO(DEVICE NOT AVAILABLE)\r
+ PUSHJ PDP,SGRELE ;RETURN TO USER IF RUN UUO\r
+ ; OR FIND TTY AND PRINT ?CRLF\r
+ PUSHJ PDP,ERNAM ;PRINT DEVICE NAME USING (PDP)\r
+ JSP TAC,PHOLD ;START TTY AND STOP JOB\r
+ ASCIZ / NOT AVAILABLE/\r
+\r
+SGERR1: MOVEI TAC,NSDERR ;ERROR CODE IN CASE RUN UUO(NO SUCH DEVICE)\r
+ PUSHJ PDP,SGRELE ;RETURN TO USER IF RUN UUO\r
+ ; OR FIND TTY AND PRINT ?CRLF\r
+ JSP TAC,PHOLD ;START TTY AND STOP JOB\r
+ ASCIZ /NO SUCH DEVICE/\r
+\f\r
+;ROUTINE TO GET FILE FROM DEVICE(LOW AND/OR HIGH)\r
+;CALL: ACS JDAT,PROG,PDP,DEVDAT SETUP\r
+; MOVE ITEM,JOB NUMBER\r
+; IFN FTDISK,<MOVE TAC1,DEVMOD(DEVDAT) ;DEVICE CHAR.>\r
+; PUSHJ PDP,GETJB\r
+; RETURN ONLY IF EVERYTHING OK\r
+\r
+EXTERNAL JOBCOR,JOB,CPOPJ,JOBS41,JOB41\r
+\r
+GETJB:\r
+IFN FT2REL,<\r
+ EXTERN GETHGH\r
+ PUSHJ PDP,GETHGH ;SEE IF HIGH SEG ALREADY EXISTS AND BEING SHARED\r
+ ; IF NOT, TRY TO LOOKUP AND READ IN HIGH FILE\r
+ ; IF .SHR DOESN'T EXIST, TRY .HGH, IF NEITHER-SKIP RETURN\r
+ ; TAC1=DEVMOD(DEVDAT) IF DISK(DEV CHAR.)\r
+ JRST LOWFIN ;HIGH SEG NOW IN CORE AND NO LOW FILE NEEDED\r
+ ; LOW FILE NEEDED\r
+ ; EITHER BECUASE NOHIGH SEG\r
+ ; ORHIGH SEG ALSO NEEDS LOW FILE\r
+>\r
+ LOOKUP 0,SGANAM ;LOOKUP LOW SEG FILE(EXT=SAV,DMP OR LOW(IF HIGH SEG\r
+ ; REQUIRES LOW SEG AND USER DID NOT TYPE EXT)\r
+ ; MODE=SAVMOD SO DECTAPE SERVICE WILL RETURN\r
+ ; IOWD IN E+3(TEMPORARY)\r
+ JRST NOFILE ;GO PRINT FILE.EXT NOT FOUND\r
+ HLRE TAC1,SGALEN(PROG) ;-NO. OF WORDS IN FILE\r
+ PUSHJ PDP,CKIOWD ;CHECK USER'S SUPPLIED CORE ARG TO MAKE SURE NOT\r
+ ;TOO SMALL, RETURN LARGER OF FILE SIZE OR CORE ARG\r
+ PUSHJ PDP,GETCOR ;OK, TRY TO GET CORE\r
+ MOVE TAC1,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS\r
+ MOVNS TAC\r
+ ADDI TAC,JOBSVM ;-WORD COUNT FOR ALL USERS CORE\r
+ TLNE TAC1,DVMTA ;MAG TAPE?\r
+ HRLM TAC,SGALEN(PROG) ;YES, USE USER-SPECIFIED CORE ARGUMENT\r
+ HRRZS JOBPD1(JDAT) ;TURN OFF USER MODE PC FLAG IN CASE THIS\r
+ ;IS A RUN UUO,SO ERRORS WILL NOT TRY TO RETURN\r
+\r
+ PUSHJ PDP,SGDO ;READ IN FILE INTO LOW SEGMENT\r
+ INPUT 0,SGALEN ;EXECUTED FROM SGDO\r
+ MOVE TAC,JOBS41(JDAT) ;RESTORE USER UUO JSR LOC\r
+ MOVEM TAC,JOB41(JDAT) ;SAVED BY SAVE\r
+LOWFIN: HRRZ TAC,JOBCOR(JDAT) ;CORE ARG FROM PREVIOUS SAVE(THIS MONITOR\r
+ ; ALWAYS STORES SOMETHING)\r
+ SKIP TAC ;IS THIS AN OLD FORMAT FILE WITH NO CORE ARG TO SAVE?\r
+ MOVE TAC,USRREL ;YES, USE ASSIGNMENT MADE WEN LOW FILE READ IN\r
+ PUSHJ PDP,CKSARG ;RETURN ONLY IF USER'S SUPLLIED ARG IS 0 OR NOT\r
+ ; SMALLER THAN SAVE CORE ARG. RETURN LARGER\r
+ PUSHJ PDP,GETCOR ;TRY TO GET THIS AMOUNT OF CORE\r
+ MOVE TAC,USRREL ;HIGHEST LOC ASSIGNED TO LOW SEG\r
+ HRRM TAC,JOBCOR(JDAT) ;SET INITIAL CORE ASSIGNMENT IN JOB DATA AREA FOR\r
+ ; USER TO USE TO RESET CORE TO INITIAL SETTING WHEN\r
+ ; PROGRAM IS RESTARTED\r
+ ; FALL INTO SGREL\r
+;ROUTINE TO RELEASE DEVICE AND FIND TTY\r
+INTERN SGREL\r
+\r
+SGREL: SKIPN DEVDAT,USRJDA ;HAS CHANNEL BEEN RELEASED ALREADY?\r
+ JRST SGREL2 ;YES, FIND TTY AND WAIT FOR OUTPUT TO FINISH\r
+ PUSH PDP,T4 ;NO,\r
+ MOVE TAC1,DEVMOD(DEVDAT)\r
+ TLNE TAC1,DVMTA ;MAGTAPE?\r
+ TLNN DEVDAT,INPB ;YES, WAS AN INPUT DONE?\r
+ JRST SGREL1 ;NO\r
+ CLOSE 0,CLSOUT ;YES, CLOSE MTA INPUT\r
+ STATO 0,IOTEND+IODEND ;AT END OF APTE?\r
+ MTAPE 0,16 ;NO SKIP TO EOF\r
+SGREL1: RELEASE 0, ;NO RELEASE DEVICE\r
+ POP PDP,T4\r
+SGREL2:\r
+ JRST TTYFNU ;FIND TTY FOR CURRENT USER\r
+\f\r
+;ROUTINE TO EXECUTE DUMP MODE COMMAND LIST SETUP IN SGALEN(R)\r
+;AND CHECK FOR ERRORS. USED ONLY TO READ LOW FILE.\r
+;CALL: PUSHJ P,SGDO\r
+; INPUT 0,SGALEN OR OUTPUT 0,SGALEN\r
+; OK RETURN(NO ERRORS)\r
+;SGDOA CALLED FROM SAVE, IT HAS ALREADY SET LH OF USRHCU=-2\r
+;TO INDICATE CORE IS COMPRESSED\r
+\r
+ EXTERN USRHCU,USRJDA,JOBSA,JOBDDT,JOBSDD,JOBSD1,JOBSAV,JOBCOR\r
+ EXTERN JOBSV,JOBSV3,JOBSVD,JOBSDP\r
+\r
+SGDO: HRROS USRHCU ;SET LH OF USRCHU-1 AS A FLAG TO INDICATE SAVE GET\r
+ ; LOW FILE IO IN PROGRESS, SO MONITOR WILL\r
+ ; NOT STORE HIGH SEG PROTECTION IN JOBHRL WHICH\r
+ ; HAS IOWD FOR ZERO COMPRESSION\r
+SGDOA: XCT @(PDP) ;EXECUTE INPUT OR OUTPUT UUO\r
+ MOVE ITEM,JOB ;READ INTO PROTECTED PART OF JOB DATA AREA\r
+ PUSHJ PDP,EXPAND ;EXPAND CORE IMAGE\r
+ JRST ADRERR ;ADDRESS CHECK, PRINT MESSAGE AND STOP JOB\r
+ MOVE TAC1,JOBDDT(PROG) ;COPY DDT STARTING ADR\r
+ MOVEM TAC1,USRDDT ;INTO MONITOR PROTECTED AREA(IN CASE THIS IS GET)\r
+ SETZM USRHCU ;FLAG THAT SAVE-GET IO FINISHED AND CORE EXPANDED\r
+ AOS (PDP) ;SKIP OVER UUO IN CALLING SEQUENCE\r
+\r
+;ROUTINE TO CHECK FOR IO ERRORS(CALLED FROM SEGCON)\r
+;CALL: MOVE F,DEVICE DATA BLOCK ADDRESS\r
+; PUSHJ P,SGIOCK\r
+; RETURN ONLY IF NO ERRORS\r
+\r
+ INTERN SGIOCK\r
+\r
+SGIOCK: MOVE T4,DEVIOS(DEVDAT) ;IO STATUS WORD FOR THIS DEVICE\r
+ TRNN T4,IOBKTL!IODTER!IODERR!IOIMPM ;ANY ERRORS ON SAVE-GET DEVICE?\r
+ POPJ PDP, ;NO, GIVE OK RETURN\r
+ MOVEI TAC,TRNERR ;YES, ERROR CODE IN CASE THIS IS RUN UUO\r
+ ; (TRANSMISSION ERROR)\r
+ PUSHJ PDP,SGRELE ;RELEASE DEVICE AND ERROR RETURN TO USER IF RUN UUO\r
+ ; OF FIND TTY AND PRINT ?CRLF\r
+ JSP TAC,PHOLD ;START TTY AND STOP JOB\r
+ ASCIZ /TRANSMISSION ERROR/\r
+\f\r
+;ROUTINE TO EXPAND CORE AFTER A SAVE(LOW SEG ONLY)\r
+;CALL: MOVE DEVDAT,DEVICE ADR.\r
+; MOVE PROG,JOBADR.\r
+; MOVE ITEM,JOB NUMBER\r
+; PUSHJ PDP,EXPAND\r
+; ERROR RETURN, ADR, CHECK, OR NEED CORE BUT NOT CURRENT USER(COMMAND\r
+; DECODER EXPANDING AFTER USER HAS REDUCED CORE)\r
+; OK RETURN, CORE EXPANDED\r
+;CALLED FROM SAVE AND COMMAND DECODER\r
+;START,CSTART,DDT,REENTER,SAVE,SSAVE COMMANDS IF CORE STILL COMPRESSED\r
+\r
+EXPAND: HLRE AC3,SGALEN(PROG) ;-LENGTH OF FILE\r
+ MOVNS AC3 ;-LENGTH OF FILE\r
+ ADDI AC3,JOBSVM ;ADD FIRST LOC-1 TO FORM HIGHEST LEGAL ADR.\r
+ HRLI AC3,PROG ;PUT PROG IN LH FOR COMPARE\r
+ ; AC3 SET FOR ADDRESS CHECKING BELOW\r
+ SKIPL TAC,JOBSV(PROG) ;IF FIRST LOC IS POSITIVE\r
+ JRST SGDO1 ;OLD FORMAT, SO DONT EXPAND\r
+ HRRZS TAC ;LOOK AT 1ST WORD OF FILE\r
+ CAILE TAC,JOBDDT ;IS IT BELOW JOBJDA?\r
+ JRST EXPND1 ;NO. NEW COMPRESSED FORMAT\r
+ CAIE TAC,JOBSAV ;IS JOBDDT THE DATA WORD?\r
+ JRST EXPND1 ;NO. EXPAND\r
+ SKIPN JOBSV3(JDAT) ;IS THE SAVE FILE FROM CONVERT?\r
+ ; CONVERT DOES NOT ZERO COMPRESS\r
+ ; IT JUST WRITES ENTIRE FILE WITHH 1 IOWD IN FRONT\r
+ SOJA AC3,SGDO1 ;YES, GO BLT DATA DOWN AS IF OLD DISK SAVE FILE\r
+ ; (NON-COMPRESSED)\r
+ HRROI TAC,JOBSD1 ;YES. CHANGE TO IOWD 1,JOBSDD\r
+ EXCH TAC,JOBSV(PROG) ;ZEP, THE IOWD IS FIXED\r
+ HLRES TAC ;WORD COUNT OF IOWD\r
+ AOJE TAC,EXPND1 ;JUST 1 DATA WORD - THROUGH\r
+ MOVSI TAC,1(TAC) ;MAKE IOWD N-2,JOBSAV\r
+ JUMPE TAC,EXPZ\r
+ HRRI TAC,JOBSAV ;SO NEXT DATA WDS WILL BE SKIPPED\r
+ MOVEI TAC1,JOBSV(PROG)\r
+ MOVEM TAC,2(TAC1) ;STORE IN COMPRESSED DATA\r
+ JRST EXPND1\r
+EXPZ: MOVSI TAC,-2\r
+ HLLM TAC,JOBSV(PROG)\r
+\f\r
+;COME HERE TO DO THE ACTUAL EXPANSION OF A FILE\r
+EXPND1: MOVE TAC,[XWD PROG,JOBSV] ;IT WAS READ INTO JOBSV\r
+ MOVE TAC,@TAC ;FIRST IOWD\r
+EXPLP1: HRRZ AC1,TAC1 ;ADDRESS OF IOWD\r
+ CAIGE AC1,JOBSAV ;LEGAL?\r
+ AOJA AC1,TOOLOW ;NO. DELETE DATA WHICH IS TO LOW\r
+ HLRE AC1,TAC1 ;YES. GET WORDCOUNT\r
+ MOVNS AC1 ;+N\r
+ HRLM AC1,TAC1 ;CONVERT IOWD TO +N IN LH\r
+ ADDI TAC,1(AC1) ;ADDRESS OF NEXT IOWD.\r
+ CAMLE TAC,AC3 ;IN BOUNDS?\r
+ JRST SGDOER ;NO. COMPLAIN\r
+ ADDI TAC1,(AC1) ;YES. CHANGE RH OF IOWD\r
+ EXCH TAC1,@TAC ;MAKE IT XWD +N,A+N-1 AFTER DATA BLOCK\r
+ JUMPL TAC1,EXPLP1 ;CONTINUE IF NEXT THING IS AN IOWD\r
+ PUSH PDP,TAC ;SAVE DATA LOCATION\r
+ HRRZ TAC,@TAC ;TOP REAL LOCATION NEEDED\r
+\r
+ TRO TAC,1777 ;MAKE IT NK-1\r
+\r
+ HLRZ TAC1,PROG ;PRESENT SIZ OF LOW SEG\r
+ CAMG TAC,TAC1 ;IS THERE ENOUGH?\r
+ JRST EXPCOR ;YES.\r
+ CAME ITEM,JOB ;NO, IS TIS THE CURENT JOB?\r
+ JRST SGDOER ;NO, GIVE ERRROR RETURN, MUST BE COMMAND DECODER\r
+ ; DOING EXPAND AFTER USER HAS REDUECED CORE\r
+ PUSHJ PDP,GETCOR ;YES. GET IT\r
+EXPCOR: POP PDP,TAC1\r
+ MOVEI AC1,@TAC1 ;TOP DATA LOC\r
+ HRLI AC1,1(AC1) ;SET TO ZERO TO TOP OF CORE\r
+ HRRI AC1,2(AC1)\r
+ SETZM -1(AC1)\r
+ HRLI TAC,PROG ;RELOCATE TOP LOC OF JOB\r
+ BLT AC1,@TAC ;ZAP, CORE IS 0 FROM HERE ...\r
+ HRROI TAC,@TAC1 ;FORM DATA POINTER\r
+EXPLP2: HRRZ AC1,(TAC) ;TO DATA POINTER\r
+ ADDI AC1,(PROG) ;RELOCATE\r
+ HLRZ AC2,(TAC) ;WORD COUNT\r
+ SUBI TAC1,1(AC2) ;POINT TAC1 TO PREVIOUS IOWD\r
+ SETZM (TAC) ;ZERO THIS IOWD\r
+ SOSA TAC ;POINT TO DATA\r
+EXPLP3: SOS AC1\r
+ CAIGE AC1,JOBSDD(PROG) ;DON'T STORE DATA BELOW JOBSDD\r
+ SOSA TAC\r
+ POP TAC,(AC1) ;MOVE A DATA WORD\r
+ SETZM 1(TAC) ;ZERO WHERE IT CAME FROM\r
+ SOJG AC2,EXPLP3 ;LOOP IF MORE DATA\r
+ CAMLE TAC1,[XWD PROG,JOBSV] ;THROUGH?\r
+ JRST EXPLP2 ;NO, DO NEXT BLOCK\r
+ EXCH AC2,JOBSDD(PROG) ;YES, ZERO JOBSDD\r
+ MOVEM AC2,JOBDDT(JDAT) ;SET USER DDT STR ADR\r
+ JRST SGDO2 ;AND SETUP USRDDT IN MONITOR PROTECTED\r
+ ; FROM THIS USER\r
+\f\r
+;THIS ROUTINE WILL DELETE ALL DATA FROM A COMPRESSED FILE\r
+;WHICH IS BELOW JOBSOD (PROBABLY WRITTEN BY TENDUMP)\r
+\r
+TOOLOW: HLRE AC2,@TAC ;WORDCOUNT OF OFFENDING IOWD\r
+ SUB AC1,AC2 ;ADDRESS+N\r
+ CAIG AC1,JOBSDD ;IS ANY DATA IN IT LEGAL?\r
+ AOJA TAC,NXIOWD ;NO, TEST NEXT IOWD\r
+ SUBI AC1,JOBSDD ;YES, NUMBER OF WORDS TO KEEP\r
+ MOVNS AC2 ;TOTAL NUMBER OF WORDS\r
+ SUB AC2,AC1 ;NUMBER OF WORDS TO DROP\r
+ HRLS AC2 ;INTO BOTH HALVES\r
+ ADD AC2,@TAC ;NEW IOWD FOR ONLY GOOD DATA\r
+ ADDI TAC,(AC2) ;POINT TAC TO LAST BAD DATA LOC\r
+ MOVEM AC2,@TAC ;STORE UPDATED IOWD OVER IT\r
+ JRST IOWBLT ;GO BLT OVER BAD DATA\r
+NXIOWD: SUB TAC,AC2 ;POINT TAC TO NEXT IOWD\r
+ HRRZ AC1,@TAC ;GET ADDRESS\r
+ CAIGE AC1,JOBSD1 ;LEGAL?\r
+ AOJA AC1,TOOLOW ;NO, AT LEAST PART OF THE DATA IS LOW\r
+IOWBLT: MOVSI TAC,@TAC ;YES, KEEP THE ENTIRE IOWD DATA\r
+ HRRI TAC1,JOBSV(PROG) ;TAC1 IS A BLT POINTER\r
+ SUBI TAC,JOBSV ;RH OF TAC IS AMOUNT BEING DELETED\r
+ SUBI AC3,(TAC) ;AC3 POINTS TO TOP OF DATA READ IN-(N)\r
+ BLT TAC1,@AC3 ;MOVE ONLY GOOD DATA DOWN\r
+ JRST EXPND1 ;GO EXPAND THE GOOD DATA\r
+\f\r
+SGDO1: MOVEI TAC,JOBDDT(PROG) ;MOVE EVERYTHING DOWN )MUST BE NON-COMPRESSED DSK FILE\r
+ HRLI TAC,JOBSVD(TAC) ;OR CONVERT SAVE FILE\r
+ SKIPGE JOBSV(JDAT) ;IS THIS CONVERT FILE(FIRST WORD IS IOWD)?\r
+ HRLI TAC,JOBSDP(TAC) ;YES, ALSO SKIP OVER IOWD\r
+ SUBI AC3,JOBSVD\r
+ BLT TAC,@AC3\r
+SGDO2: AOSA (PDP) ;SET FOR OK RETURN\r
+SGDOER: POP PDP,TAC\r
+ SETZM JOBHCU(JDAT) ;CLEAR LH AND SET HIGHEST USER CHAN, IN\r
+ ; USE TO 0(WHERE IT SHOULD BE ANYWAY)\r
+ POPJ PDP, ;ERROR RETURN OR OK RETURN\r
+\f\r
+;ROUTINE TO CHECK USER SUPPLIED CORE ARG AND CHECK TO SEE IF 0\r
+;OR GREATER THAN OR EQUAL TO IOWD USED TO SAVE OR GET FILE\r
+;CALL: HLRE TAC1,-NO. OF WORDS IN FILE\r
+; PUSHJ PDP,CKIOWD\r
+; RETURN WITH LARGER OF 2 POSITIVE NOS. IN TAC(1777 ORED IN)\r
+; DO NOT RETURN IF CORE ARG SUPLLIED BY USER IS TOO SMALL\r
+;CALLED FROM SAVE AND GET\r
+\r
+ EXTERN JOBSVM\r
+\r
+CKIOWD: MOVEI TAC,JOBSVM ;FIRST LOC-1 READ OR WRITTEN IN USER AREA\r
+ HRRM TAC,SGALEN(PROG) ;RESTORE RH TO JOBSAV AFTER LOOKUP\r
+ SUB TAC,TAC1 ;HIGHEST LOC=FIRST LOC-1+LENGTH OF FILE\r
+ ; FALL INOT CHSARG\r
+\r
+;ROUTINE TO CHECK USER SUPPLIED CORE ARG AND CHECK IF 0\r
+;OR GREATER THAN OR EQUAL TO CORE ARG FOR PREVIOUS SAVE\r
+;CALL: HRRZ TAC,JOBCOR(JDAT) ;WRITTEN WHEN FILE SAVED\r
+; PUSHJ PDP,CKSARG\r
+; RETURN WITH LARGER OF 2 IN AC TAC, ONLY IF USER ARG NOT TOO SMALL\r
+;CALLED ONLY FROM GET AFTER JOB DATA AREA LOADED FROM FILE(JOBCOR) OR HIGH SEG\r
+\r
+ INTERN NROOM1 ;CALLED FROM SEGCON\r
+\r
+CKSARG: IORI TAC,1777 ;MAKE SURE 1K-1\r
+ CAMG TAC,SGANEW(PROG) ;IS USER SUPPLIED CORE ARG BIGGER?\r
+ SKIPA TAC,SGANEW(PROG) ;YES, RETURN IT\r
+ SKIPN SGANEW(PROG) ;NO, DID USER SUPPLY ONE\r
+ POPJ PDP, ;NO, RETURN LARGER OF TWO\r
+;ROUTINE TO PRINTE #K OF CORE NEEDED\r
+;CALL: MOVE TAC,HIGHEST REL. USER ADR.\r
+; PUSHJ PDP, NROOM1\r
+; NEVER RETURN\r
+\r
+NROOM1: PUSH PDP,TAC ;YES, ERROR, USER'S SUPPLIED CORE ARG TOO SMALL\r
+NOROOM: MOVEI TAC,NECERR ;ERROR CODE IN CASE THIS IS RUN UUO(NOT ENOUGH CORE)\r
+ PUSHJ PDP,SGRELE ;RELEASE DEVICE AND ERROR RETURN TO USER IF RUN UUO\r
+ ; OR FIND TTY AND PRINT ?CRLF\r
+ HRRZ TAC,(PDP) ;GET AMOUNT OF CORE REQUESTED\r
+ LSH TAC,-12 ;CONVERT TO NO. OF 1K BLOCKS-1\r
+ PUSHJ PDP,DECP1 ;ADD 1 TO TAC AND PRINT DECIMAL\r
+ JSP TAC,PHOLD ;START TTY ADN STOP JOB\r
+ ASCIZ /K OF CORE NEEDED/\r
+\f\r
+;ROUTINE TO ASSIGN CORE FOR LOW AND HIGH SEG\r
+;CALL: MOVE PROG,LOW SEG RELOCATION\r
+; HRR TAC,HIGHEST LOC DESIRED\r
+; PUSHJ PDP,GETCORE\r
+; RETURN ONLY IF ASSIGNED\r
+\r
+ INTERN GETCOR\r
+\r
+GETCOR: HRRZM TAC,SGACOR(PROG) ;SOTRE CORE ARG FOR CORE UUO IN USER AC\r
+ PUSH PDP,TAC ;SAVE IN CASE OF ERROR\r
+ CALLI SGACOR,11 ;DO CORE UUO\r
+ JRST NOROOM ;NOT AVAILABLE, PRINT ERROR AND AMOUNT TRYING FOR\r
+ JRST TPOPJ ;OK, REMOVE TAC FROM PD LIST AND RETURN\r
+\f\r
+;ROUTINE TO PRINT NOT A SAVE FILE IF WRONG FORMAT FILE DETECTED\r
+\r
+INTERN GETERR\r
+\r
+GETERR: MOVEI TAC,NSFERR ;ERROR CODE IN CASE THIS IS RUN UUO(NOT SAVE FILE)\r
+ PUSHJ PDP,SGRELE ;RELEASE DEVICE AND ERROR RETURN TO USER IF RUN UUO\r
+ ; OR FIND TTY AND PRINT ?CRLF\r
+ JSP TAC,PHOLD ;START TTY AND STOP JOB\r
+ ASCIZ /NOT A SAVE FILE/\r
+\r
+;ROUTINE TO PRINT FILE NOT FOUND ORNEEDS 2 RELOC REG\r
+\r
+INTERN NOFILE ;CALLED FROM SEGCON\r
+\r
+NOFILE: MOVEI TAC,FNFERR ;ERROR CODE IN CASE THIS IS RUN UUO(FILE NOT FOUND\r
+ ; CHANGE ERROR CODE TO DISK ERROR CODE IF DEV IS DSK\r
+ PUSHJ PDP,SGRELL ;RETURN DISK LOOKUP OR ENTER ERROR CODE IF DSK \r
+ ; RELEASE DEVICE AND ERROR RETURN TO USER IF HE WANTED\r
+ ; OR FIND TTY AND PRINT ?CRLF\r
+ MOVE TAC1,SGANAM(PROG) ;PRINT FILE NAME\r
+ PUSHJ PDP,PRNAME\r
+ PUSHJ PDP,PRPER ;PRINT PERIOD\r
+ HLLZ TAC1,SGAEXT(PROG) ;PRINT EXTENSION\r
+ PUSHJ PDP,PRNAME\r
+ JSP TAC,PHOLD ;START TTY AND STOP JOB\r
+ ASCIZ / NOT FOUND/\r
+\f\r
+;ROUTINE TO RELEASE DEVICE ON AN ERROR AND CHECK TO SEE\r
+;IF THIS IS A MONITOR COMMAND OR USER UUO\r
+;IF USER UUO, GIVE ERROR RETURN TO USER UNLESS THERE IS A HALT\r
+;IN LH OF EROR RETURN WORD, IN WHICH CASE FIND TTY, PRINT ?CRLF\r
+;AND RETURN TO CALLER SO CAN ADD MORE INFO TO ERROR MESSAGE AND STOP JOB\r
+;CALL: MOVEI TAC,ERROR CODE(DEFINED IN S.MAC)\r
+; PUSHJ PDP,SGRELE\r
+;DO NOT RETURN TO CALLER IF USER WANTS ERROR RETURN ON RUN AND GETSEG UUOS\r
+\r
+ EXTERN JOBPD1,JOBPD3,USRJDA\r
+\r
+SGRELL: ;LOOKUP OR ENTER FAILURE\r
+IFN FTDISK,<\r
+ MOVE TAC1,DEVMOD(DEVDAT) ;IS THIS DEVICE A DISK?\r
+ TLNE TAC1,DVDSK\r
+ HRRZ TAC,SGAEXT(PROG) ;YES, RETURN DISK SERVICE ERROR CODE\r
+>\r
+SGRELE: MOVE TAC1,JOBPD1(JDAT) ;GET FIRST PC ON PD LIST\r
+ TLNN TAC1,USRMOD ;IS IT IN USER MODE(IE USER UUO)?\r
+\r
+ JRST SGRLE1 ;NO. MUST BE MONITOR COMMAND OR CALLED OVERLAYED\r
+ ; RELEASE DEVICE, FIND TTY, AND RETURN TO CALLED\r
+ PUSH PDP,TAC ;SAVE ERROR CORE\r
+ HRR UUO,TAC1 ;ADDRESS OF RETURN AFTER RUN OF GETSEG UUO\r
+ PUSHJ PDP,GETWDU ;GET ERROR RETURN WORD FROM RUN OR GETSEG UUO\r
+ HLRZ TAC1,TAC ;GET OP CODE\r
+ POP PDP,TAC ;RESTORE ERROR CODE\r
+ CAIN TAC1,(HALT) ;IS LH HALT?\r
+ JRST SGRLE1 ;YES, RELEASE DEVICE,FIND TTY, AND RETURN TO CALLER\r
+ HRR UUO,JOBPD3(JDAT) ;NO, AC NUMBER OF RUN OR GETSEG UUO\r
+ PUSHJ PDP,STOTAC ;STORE ERROR NUMBER IN USER AC\r
+ SKIPE USRJDA+0 ;DO NOT RELEASE CHANNEL 0 IF NOT INITED YET\r
+ ; UUO HANDLER DOES NOT ALLOW THIS FROM EXEC MODE\r
+ RELEAS 0, ;RELEASE DEVICE(IF INITED)\r
+ JRST USRXIT ;AND RETURN TO USER TO HANDLE ERROR\r
+\r
+SGRLE1: PUSHJ PDP,SGREL ;RELEASE DEVICE AND FIND TTY\r
+ JSP TAC,CONMES ;PRINT ?CRLF AND RETURN TO CALLER\r
+ ; WHO WILL PRINT REST OF ERROR MESSAGE AND STOP JOB\r
+ ASCIZ /?\r
+/\r
+COMEND: END ;END OF COMCON\r
+\r
--- /dev/null
+\f\r
+TITLE COMMON - MONITOR COMMON DATA AREA AND CONFIGURATION DEFINITION - V437\r
+SUBTTL PART 3 COMMON.MAC - T. HASTINGS/RCC TS 03 JUN 69\r
+XP VCOMMN,437\r
+ ;PUT VERSION NUMBER IN GLOB AND LOADER STORAGE MAP\r
+\r
+REPEAT 0, <\r
+\r
+;THE COMMON SUBPROGRAM CONSISTS OF 3 FILES ASSEMBLED TOGETHER AS ONE SUBPROGRAM:\r
+ 1. S.MAC - THE USUAL SYSTEM SYMBOL DEFINITIONS ASSEMBLED WITH\r
+ EVERY MONITOR SUBPROGRAM\r
+ 2. CONFIG.MAC - THE CONFIGURATION DEFINITION FILE GENERATED BY THE\r
+ CONFIGURATION PROGRAM (MONGEN) OR BY AN EDITOR (SEE ABOVE)\r
+ 3. COMMON.MAC - THE REST OF THIS PROGRAM WHICH IS THE SAME SOURCE FOR\r
+ ALL CONFIGURATIONS. HOWEVER, THE ASSEMBLIES ARE CONDITIONED BY\r
+ SYMBOLS AND MACROS DEFINED IN 2.\r
+ THE FOLLOWING SYMBOLS AND TABLES ARE GENERATED BELOW:\r
+\r
+ A. MONITOR STARTUP LOCATIONS (140-147), HENCE LOAD THIS FIRST.\r
+ B. JOB TABLES - LENGTH DEPENDENT ON MAXIMUM NUMBER OF JOBS ALLOWED\r
+ C. ALL VARIABLE STORAGE NOT ASSOCIATED WITH A PARTICULAR DEVICE\r
+ D. COMMON SUBROUTINE RETURNS\r
+ E. COMMON BYTE POINTERS\r
+ F. TABLE OF SERVICE ROUTINE INTERRUPT LOCS TO BE LINKED BY ONCE ONLY CODE\r
+ G. TABLE OF DEVICE DATA BLOCK ADDRESSES AND NUMBER TO BE USED BY ONCE TO LINK\r
+ THEM TOGETHER AND GENERATE MULTIPLE COPIES.\r
+ H. ASSIGNMENT OF PI CHANNELS\r
+ I. PI CHANNEL SAVE AND RESTORE ROUTINES\r
+ J. UUO TRAP LOCATIONS 40/41, 60/61\r
+ K. SYSTEM CRASH STOP CONI'S.\r
+>\r
+\f;THE FOLLOWING STANDARD SYMBOLS CAN BE SUPERCEDED BY A CUSTOMER\r
+;HAVING PREVIOUSLY DEFINED THEM ON THE CONFIG.MAC FILE USING \r
+;MONGEN PROGRAM\r
+\r
+\r
+IFNDEF LISTSN, <LISTSN==1> ;FORCE S.MAC TO BE LISTED WITH COMMON FILE ONLY\r
+ ;UNLESS 'LISTSN' DEFINED TO BE 0 WITH MONGEN\r
+IFNDEF APRSN,<APRSN==0> ;SERIAL NUMBER OF APR\r
+\r
+;STANDARD MAG TAPE DENSITY(556 BPI),PARITY(ODD-BINARY)\r
+ INTERN STDENS ;STANDARD MAG TAPE DENSITY(556 BPI),PARITY(ODD-BINARY)\r
+ IFNDEF STDENS, <STDENS==2> ;STAND. == BINARY AT 556 BPI\r
+ ;STDENS==D+P WHERE D AND P ARE:\r
+ ;D==1(200 BPI);D== (556 BPI);D==3(800 BPI)\r
+ ;P==0(ODD-BINARY PARITY);P=4(EVEN-BCD PARITY)\r
+ INTERN JIFSEC ;NO. OF CLOCK TICKS(JIFFIES) PER SECOND\r
+ IFNDEF JIFSEC,<JIFSEC==^D60> ;STAND.==60 JIFFIES PER SEC.\r
+ XP HNGSEC,2*JIFSEC\r
+\r
+ INTERN DTTRY ;NO. OF TIMES TO TRY ON DECTAPE ERRORS\r
+ IFNDEF DTTRY,<DTTRY==4> ;STAND.==4 TRIES\r
+\r
+ INTERN MTSIZ ;SIZE OF MAGTAPE RECORDS(DATA WORDS IN BUFFER+1)\r
+ IFNDEF MTSIZ,<MTSIZ==^D128> ;STAND.==128 WORDS PER BUFFER\r
+\r
+ INTERN LPTSIZ ;SIZE OF LPT BUFFER(NO. OF DATA WORDS+2)\r
+ IFNDEF LPTSIZ,<LPTSIZ==^D24+2> ;STAND.==24 WORDS PER LPT BUFFER\r
+\r
+ INTERN BLKQNT ;MAX. NO OF CONSECUTIVE DECTAPE BLOCKS SEARCHED BEFORE\r
+ ; RESCHEDULING IF ANOTHER JOB IS WAITING TO USE CONTROL.\r
+ IFNDEF BLKQNT,<BLKQNT==^D50> ;STAND.==50 DT BLOCKS SEARCHED(3 SECS.)\r
+\r
+ INTERN NSPMEM ;NO OF NANO-SECONDS PER MEMORY CYCLE\r
+ IFNDEF NSPMEM,<NSPMEM==^01760> ;STAND.==1760 NANO-SECONDS PER MEMORY CYCLE\r
+INTERNAL JIFSC2,JIFMIN,WDPJIF\r
+ JIFSC2==JIFSEC/2 ;HALF NO. OF JIFFIES IN A SEC (FOR ROUNDING)\r
+ JIFMIN==JIFSEC*^D60 ;NO., OF JIFFIES PER MINUTE\r
+ WDPJIF==^D100000/NSPMEM*^D5000/JIFSEC ;NO. OF WORDS MOVED\r
+ IFNDEF MINCOR,<MINCOR==^D54*JOBN> ;DISK DDB AND ACCESS ENTRY\r
+ ; ALLOCATION REQUIRMENTS IN FREE CORE\r
+ ;USED TO EXPAND SIZE OF MONITOR AT ONCE ONLY TIME\r
+ ;32 WORDS/DDB AND 4 WORDS/ACCESS ENTRY = 36 WORDS\r
+ ;ASSUME 1.5 OPEN FILE/JOB\r
+\r
+INTERN LOGSIZ\r
+IFNDEF LOGSIZ, <LOGSIZ==2> ;MINSIZ OF VIRTUAL CORE LEFT\r
+ ;AND STILL ALLOW LOGIN. MUST BE\r
+ ;AT LEAST AS BIG AS LOGIN CUSP IN K.\r
+ ;(STANDARD = 2K)\r
+\f;SYSTEM INITIALIZATION DISPATCH TABLE, STARTING AT LOCATION 140\r
+;THIS SUBROUTINE MUST BE LOADED FIRST\r
+;ROUTINE "ONCE" IS ONCE ONLY CODE. IT CONVERTS THE DATE\r
+;AND SETS UP I/O SERVICE CHAIN,\r
+\r
+ EXTERN SYSINI,SYSMAK,NULJOB,ONCE,JSR2\r
+ INTERN SYSDSP,SYSDDT\r
+\r
+ COMORG=140 ;ORIGIN OF COMMON IS 140\r
+ LOC COMORG ;MAKE LISTING BE SAME AS LOADING SO IT WILL BE EASY\r
+ ;TO EXAMINE SYSTEM LOCATIONS WITH CONSOLE SWITCHES\r
+ ;WITHOUT NEEDING A STORAGE MAP\r
+\r
+SYSDSP: JRST SYSINI ;INITIALIZE SYSTEM VARIABLES ONCE ONLY\r
+SYSDDT:\r
+IFG DDTN, < ;IF EXEC DDT IS LOADED.....\r
+ EXTERN PATSYM\r
+ JRST PATSYM ;YES, EXEC DDT(PATCH SYMBOL TABLE POINTER FIRST)\r
+\r
+>\r
+ IFE DDTN, <\r
+ HALT . ;NO. EXEC DDT\r
+>\r
+ JRST SYSMAK ;MAKE NEW SYSTEM\r
+ JRST SYSINI ;INITIALIZE SYSTEM VARIABLES ALWAYS\r
+ JEN NULJB1 ;ERROR RECOVERY\r
+ JSR ONCE ;DO ONCE ONLY CODE OVER AGAIN\r
+ JRST JSR2 ;BYPASS ONCE ONLY OPERATOR DIALOGUE\r
+ ;(IN CASE CONSOLE TTY DOWN)\r
+SYSCRS: JRST SYSTOP ;STOP MONITOR IN CASE OF DISASTER\r
+\f;SYSTEM DATA STORAGE\r
+\r
+;SPECIAL ABSOLUTE LOCATIONS IN LOWER MEMORY\r
+\r
+ INTERN SYSSNP,FORTY,NULDAT,SIXTY,NULPDL,ERRPDL,KT10A,RCXIOC,RCXCCW,DDTSYM\r
+ INTERN T30SYM,RAXIOC,RAXCCW,CRSHWD\r
+\r
+ RAXIOC=26 ;XWD 0,ADDRESS FOR RA-10'S DATA CHANNEL\r
+ ; MUST BE EVEN AND .LT. 777\r
+ RAXCCW=RAXIOC+1 ;XWD CONTROL WORD ADDRESS,DATA ADDRESS\r
+ ; STORED ON CHANNEL TERMINATION\r
+ CRSHWD=30 ;NORMALLY THIS WORD WILL BE 0. IF IT IS \r
+ ;ACCIDENTALLY OR PURPOSEFULLY OVERWRITTEN\r
+ ;THE MONITOR WILL ATTEMPT TO SAVE THE \r
+ ;AC'S AND THE STATE OF ALL DEVICES,\r
+ ;[A LA 147 RESTART]\r
+ KT10A=33 ;COPY OF CONTENTS OF RELOCATION AND PROTECTION\r
+ ; DONE BY DATAO APR \r
+ ; NEEDED BECAUSE KT10A MOD DOES NOT COME WITH\r
+ ; LIGHTS FOR 2ND REG.\r
+ RCXIOC=34 ;INITIAL CONTROL WORD FOR DATA CHANNEL\r
+ ; (TRANSFERS CHANNEL TO SEQUENCE OF IOWD'S IN DSKINT)\r
+ ; MUST BE IN EVEN LOC IN FIRST 1K OF MEMORY\r
+ RCXCCW=RCXIOC+1 ;CHANNEL STORES FINAL CONTROL WORD\r
+ ; HERE ON TERMINATION\r
+ SYSSNP=37 ;WHEN DEPOSITED NON-ZERO,PRINTS SNAP SHOT OF SYSTEM\r
+ ; ON LPT SEE LPSNAP SUBPROGRAM\r
+ DDTSYM=36 ;CONTAINS ADDRESS OF POINTER TO EXEC DDT SYMBOL TABLE\r
+ FORTY=40 ;PLACE WHERE UUOS ARE STORED ON TRAP\r
+ NULDAT=42 ;JOB DATA AREA FOR NULL JOB (USES EXEC\r
+ ; 62 THRU 101 20-36 FOR DUMP AC)\r
+ ; AND ABOVE FOR PUSHDOWN LIST\r
+ SIXTY=60 ;PLACE WHERE UNIMPLEMENTED INSTR. ARE STORED ON \r
+ ; TRAP (PDP-10 ONLY)\r
+ NULPDL=101 ;PUSH DOWN LIST FOR NULL JOB\r
+ ; USES EXEC LOCS 102 THRU 137\r
+ ; USED FOR RE-SCHEDULING WHEN CURRENT JOB\r
+ ; GOES INTO IO WAIT\r
+ ERRPDL=120 ;PUSH DOWN LIST FOR ERROR IN NULL JOB\r
+ T30SYM=131 ;PLACE IN 10/30 JOB DATA AREA WHERE SYMBOL TABLE\r
+ ; POINTER IS STORED BY REGULAR 10/30 LOADER\r
+ ; (MOVED TO DDTSYM BY ONCE)\r
+\f;PROTECTED JOB DATA STORAGE AND OTHER LOCATIONS SET EACH TIME\r
+;A NEW JOB IS RUN (SEE APRSER-CLKINT)\r
+\r
+ INTERN SYSBEG,SYSBG1,SYSEND\r
+\r
+SYSBEG: ;FIRST LOCATION CLEARED ON 143 RESTART (SEE SYSINI)\r
+XP SYSBG1,SYSBEG+1\r
+\r
+ INTERN JOB,JOBADR,JOBDAT,USRREL,USRSAV\r
+\r
+JOB: 0 ;CURRENT JOB RUNNING AT UUO LEVEL\r
+JOBDAT: ;LOC OF CURRENT JOBS JOB DATA AREA\r
+ ; SAME AS JBTDAT AND AC JDAT\r
+JOBADR: 0 ;XWD PROTECTION,RELOCATION FOR CURRENT JOB\r
+ ;SAME AS JBTADR(JOB) AND AC PROG\r
+USRREL: 0 ;LH==0, RH CONTAINS CONTENTS OF PROTECTION REGISTER\r
+ ;LOW ORDER BITS==1777, IE THIS IS HIGHEST REL. LOC\r
+ ;IN CURRENT USER AREA (USED FOR ADDRESS CHECKING)\r
+USRSAV: 0 ;TEMPORARY FOR UUO HANDLER (IMPURE ROUTINE!)\r
+\r
+;LOCATIONS COPIED FROM JOB DATA AREA INTO MONITOR WHEN A JOB RUNS\r
+;THIS PREVENTS THE USER FROM CLOBBERING THEM AND MAKES IT\r
+;EASIER FOR THE MONITOR TO LOCATE THESE QUANTITIES WHEN IT\r
+;NEEDS TO FOR THE CURRENT JOB\r
+;CONTENTS ARE COPIED BACK WHEN JOB BECOMES INACTIVE (SEE CLOCK)\r
+;COMPARE WITH JOB DATA AREA (SEE JOBDAT)\r
+;THE FOLLOWING LOCATION MUST BE IN SAME ORDER AS JOBDAT\r
+\r
+ INTERN USRPRT,USRPR1,USRPC,USRDDT,USRHCU,USRSAV,USRJDA,USRLO,USRLO1,USRHI\r
+\r
+USRPRT: ;FIRST LOCATION OF PROTECTED JOB DATA\r
+ USRPR1==USRPRT+1 ;FIRST LOCATION+1\r
+\r
+USRHCU: 0 ;HIGHEST USER I/O CHANNEL IN USE\r
+ ;0 MEANS EITHER NONE OR CHANNEL 0 IN USE\r
+ ;LH=-1 DURING GET OF LOW OR HIGH SEG OR SAVE OF HIGH SEG\r
+ ;SETREL ROUTINE DOESN'T STORE IN JOBHRL(11$) WHEN NEG,\r
+ ;LH=-2 DURING SAVE OF LOW SEG AS FLAG THAT CORE\r
+ ; IS COMPRESSED. \r
+ ;ONLY CHANNEL ASSIGNMENTS IN USE ARE COPIED INTO\r
+ ; MONITOR WHEN JOB RUNS\r
+USRPC: 0 ;JOB PC WHEN SCHEDULER IS CALLED\r
+USRDDT: 0 ;RH==STARTING ADDRESS OF USER DDT, LH UNUSED\r
+USRJDA: BLOCK 20 ;RH==JOB DEVICE ASSIGNMENTS (DEVICE DATA\r
+ ; BLOCK ADDRESSES)\r
+ ;LH==UUO'S DONE SO FAR FOR THIS CHANNEL (SEE SYSPAR)\r
+ ;0 MEANS NO DEVICE INITIALIZED ON THIS CHANNEL\r
+ USRLO==USRJDA ;FIRST LOC CLEARED BY SETUSR ROUTINE\r
+ ;ON A CALL [SIXBIT /RESET/]\r
+ ;ALSO CLEARS USRHCU\r
+ USRLO1==USRLO+1 ;FIRST LOC+1\r
+ USRHI==.-1 ;LAST LOC CLEARED BY SETUSR ROUTINE\r
+\f\r
+;OTHER SYSTEM DATA STORAGE\r
+\r
+ INTERN COMCNT,CLKFLG,TIMEF,APRERR,APRPC,SCHEDF\r
+ INTERN CORLST,CORTAL,HOLEF,SHFWAT\r
+ INTERN FTTRPSET,FTSLEEP,FTTIME,FTSWAP,FT2REL,FTDISK\r
+ INTERN HNGTIM,CIPWT,CIPWTM,NULERR,POTLST\r
+\r
+COMCNT: 0 ;NUMBER OF COMMANDS TYPED-IN BUT NOT DECODED\r
+ ;SET BY SCNSER, DECREMENTED BY COMCON\r
+HNGTIM: 0 ;HUNG DEVICE TIME COUNT CHECK FOR HUNG I/O\r
+ ;DEVICES WHEN THIS GOES TO ZERO (ONCE PER HNGSEC)\r
+CLKFLG: 0 ;NON-ZERO WHEN CLK INTERRUPT FORCED FOR ANY REASON\r
+TIMEF: 0 ;NON-ZERO FOR CLOCK INTERRUPT ON APR\r
+ ;SET BY APRSER, TESTED AND CLEARED BY CLK ROUTINE\r
+APRERR: 0 ;APR ERROR BITS ON NON-EX MEM, ETC.\r
+ ;SET BY APRSER, CLEARED BY CLK ROUTINE (CLOCK)\r
+APRPC: 0 ;PC WHEN APR ERROR DETECTED\r
+SCHEDF: 0 ;FORCED RESCHEDULING FLAG FOR CLK ROUTINE\r
+ ;USED TO FORCE RESCHEDULING WHEN JOB IS IN EXEC MODE\r
+NULERR: 0 ;SET NON-ZERO IF MONITOR DETECTS ERROR WHILE\r
+ ; NULL JOB IS RUNNING\r
+POTLST: 0 ;-1 WHEN SCHEDULER SEES THAT THERE ARE \r
+ ;JOBS WHICH ARE POTENTIALLY RUNABLE BUT\r
+ ;HAS TO RUN NULL JOB.\r
+ ;0 WHEN IT FINDS A REAL JOB TO \r
+ ;RUN OR NULL JOB IS ONLY JOB WHICH WANTS TO\r
+ ;RUN. 'LSTWRD' IS INCREMENTED EVERY JIFFY\r
+ ;IF THIS FLAG IS -1 AND PREVIOUS JOB WAS NULL JOB.\r
+ IFN FTTRPSET,<\r
+ INTERN STOPTS\r
+STOPTS: 0 ;STOP TIME SHARING OTHER USERS BECAUSE JOB 1 DID\r
+ ;A TRPSET UUO WITH NON-ZERO AC(IE SET LOWER CORE\r
+ ; PI TRAP LOCATION,ALSO STOP CORE SHUFFLING\r
+>\r
+ SLJOBN=0 ;NUMBER OF JOBS IF NO SLEEP FEATURE\r
+ IFN FTSLEEP,<SLJOBN=JOBN> ;LEAVE ONE ENTRY PER JOB\r
+CIPWT: BLOCK SLJOBN+3 ;CLOCK REQUEST QUEUE\r
+ ; LH-MONITOR ADDRESS TO PUSHJ TO AT CLOCK LEVEL\r
+ ; WHEN BITS 24-35 COUNT DOWN TO ZERO\r
+ ; BITS 18-23 ARE DATA SET IN AC TAC WHEN PUSHJ DONE\r
+ ; BITS 24-35 ARE NUMBER OF CLK TICKS LEFT TO GO\r
+ CIPWTM=CIPWT-1 ;FIRST LOC-1 OF CLOCK QUEUE\r
+\f;STORAGE FOR VARIOUS CORE ALLOCATION FUNCTIONS\r
+\r
+ INTERN NSWTBL,NSWMXL,CORTAB,CORMAX,CORLST,CORTAL,SHFWAT\r
+ INTERN UPTIME,SHFWRD,STUSER,HIGHJB,CLRWRD,LSTWRD,FTTRACK\r
+\r
+\r
+NSWTBL: ;FIRST LOCATION OF MONITOR DATA STORAGE\r
+ ; RETURNED BY GETTAB UUO (THESE LOCATIONS\r
+ ; PRESENT IN NON-SWAPPING SYSTEMS TOO)\r
+ ; OCTAL NUMBERS IN () CORRESPOND TO GETTAB ARG\r
+CORTAB: BLOCK 10 ;(0-7) BIT=1 IF CORRESPONDING K OF CORE IN USE BY\r
+ ; ACTIVE,IDLE, OR DORMANT HIGH OR LOW SEGS OR NON-EX\r
+ XP CORBLK,^D256\r
+ ;NUMBER OF BITS IN CORE TABLE\r
+CORMAX: 0 ;(10)MAX. CORE REQUEST+1(IE LARGEST REL. ADR.+1)\r
+ ; CAN BE RESTRICTED TO LESS THEN ALL OF USER CORE\r
+ ; BY BUILD AND/OR ONCE\r
+ \r
+\r
+CORLST: 0 ;(11) 1 BIT BYTE POINTER TO LAST FREE BLOCK POSSIBLE\r
+ ; SET BY SYSINI ON 143 STARTUP\r
+CORTAL: 0 ;(12) TOTAL NUMBER OF FREE+DORMANT+IDLE CORE BLKS LEFT\r
+SHFWAT: 0 ;(13) JOB NUMBER SHUFFLER HAS TEMPORARILY STOPPED\r
+ ;UNTIL ITS IO DEVICES TO BECOME INACTIVE BEFORE SHUFFLING\r
+HOLEF: 0 ;(14) ABSOLUTE ADDRESS OF LOWEST HOLE IN CORE, 0=NONE\r
+UPTIME: 0 ;(15) NUMBER OF CLOCK TICKS SINCE SYSTEM LOADED OR\r
+ ; RESTARTED AT 143\r
+SHFWRD: 0 ;(16) TOT NO. OF WORDS SHUFFLED BY SYSTEM\r
+STUSER: 0 ;(17) JOB CURRENTLY USING THE SYSTEM TAPE\r
+ ; NEEDED SO CONTROL C WILL NOT TIE UP SYSTEM TAPE\r
+HIGHJB: 0 ;(20) HIGHEST JOB NUMBER CURRENTLY ASSIGNED\r
+CLRWRD: 0 ;(21) TOTAL NO. OF WORDS CLEARED BY 'CLRCOR' RTN.\r
+LSTWRD: 0 ;(22) TOTAL NO. OF CLOCK TICKS WHEN NULL JOB RAN\r
+ ; BUT OTHER JOBS WANTED TO RUN AND COULD NOT\r
+ ; DO SO BECAUSE: ---\r
+ ; 1. SWAPPED OUT OR ON WAY IN OR OUT\r
+ ; 2. MONITOR WAITING FOR I/O TO STOP SO\r
+ ; IT CAN SHUFFLE OR SWAP\r
+ ; 3. JOB BEING SWAPPED OUT BECAUSE IT IS\r
+ ; EXPANDING CORE\r
+\r
+ ;INSERT NEW LOCATIONS HERE WHICH ARE OF INTEREST\r
+ ; TO USERS IN NON-SWAP AND SWAP SYSTEMS\r
+NSWMXL=<.-NSWTBL-1>B26 ;MAXIMUM ENTRY FOR GETTAB SHIFTED LEFT 9\r
+\r
+;CORE ALLOCATION DATA NOT AVAILABLE VIA GETTAB\r
+IFN FTTRACK, <INTERNAL LASCOR ; (FOR DEBUGGING ONLY)\r
+LASCOR: 0 ;LAST JOB OR HIGH SEG TO CALL CORE ROUTINES\r
+>\r
+\f;DATA LOCATIONS PRESENT ONLY IN SWAPPING SYSTEMS\r
+\r
+ IFG SYS50N, < ;SWAPPING SYSTEM ?\r
+ INTERN SWPTBL,SWPMXL,BIGHOL,FINISH,FORCE,FIT,SWPERC,VIRTAL\r
+ INTERN FULCNT,MAXSIZ,MAXJBN,SUMCOR\r
+SWPTBL: ;FIRST LOCATION OF MONITOR DATA STORAGE\r
+ ; RETURNED BY GETTAB UUO (THESE LOCATIONS\r
+ ; PRESENT ONLY IN SWAP SYSTEMS)\r
+ ; OCTAL NUMBERS IN () CORRESPOND TO GETTAB ARG\r
+BIGHOL: 0 ;(0) CURRENT BIGGEST HOLE IN CORE (1K BLOCKS)\r
+FINISH: 0 ;(1) IF +, THEN JOB NUMBER OF JOB BEING SWAPPED IN,\r
+ ;IF -, THEN JOB NUMBER OF JOB BEING SWAPPED OUT\r
+FORCE: 0 ;(2) JOB NUMBER BEING FORCED TO SWAP OUT\r
+FIT: 0 ;(3) JOB NUMBER WAITING TO BE FITTED INTO CORE\r
+VIRTAL: 0 ;(4) NUMBER OF FREE 1K BLOCKS OF SWAPPING SPACE LEFT\r
+ ; (COUNTING DORMANT SEGMENTS AS IF FREE).\r
+ ; PRINTED WITH CORE COMMAND (NO ARG) OR ERROR\r
+ ; USUALLY THE SAME AS THE AMOUNT OF VIRTUAL CORE\r
+ ; LEFT IN SYSTEM, EXCEPT WHILE R,RUN,KJOB,GET\r
+ ; COMMAND ARE WAITING TO BE SWAPPED IN, BECAUSE\r
+ ; THE OLD DISK SPACE HAS NOT BEEN RETURNED YET,\r
+ ; BUT VIRTUAL CORE IS ONLY 140 WORDS FOR SWAPIN\r
+SWPERC: 0 ;(5) LH= NUMBER OF SWAPPER READ OR WRITE FAILURES\r
+ ; RH= ERROR BITS (BITS 18-21) + NUMBER OF K OF\r
+ ; DISCARDED SWAPPING SPACE\r
+\r
+\r
+\r
+ ;INSERT NEW LOCATIONS HERE WHICH ARE OF INTEREST\r
+ ; TO USER PROGS IN SWAPPING SYSTEMS\r
+SWPMXL=<.-SWPTBL-1>B26 ;MAXIMUM ENTRY FOR GETTAB SHIFTED LEFT 9\r
+\f;MORE SWAPPING SYSTEM LOCATIONS (NOT RETURNED BY GETTAB)\r
+\r
+FULCNT: 0 ;PRINT DISK IS FULL EVERY 30 SECONDS\r
+MAXSIZ: 0 ;SIZE OF LARGEST JOB WHICH MIGHT BE SWAPPED OUT\r
+MAXJBN: 0 ;NUMBER OF THAT JOB\r
+SUMCOR: 0 ;TEMPORARY STORAGE CELL USED BY SWAPPER FOR SUM OF\r
+ ; CORE NEEDED FOR SWAP IN\r
+ IFN FT2REL,<\r
+ INTERN SWPIN,SWPOUT\r
+SWPIN: 0 ;JOB NUMBER BEING SWAPPED IN IF IT HAS A HIGH SEG\r
+ ; USED TO REMEMBER THE JOB NUMBER DURING HIGH SEG\r
+SWPOUT: 0 ;JOB NUMBER BEING SWAPPED OUT IF IT HAS A HIGH SEG\r
+ ; USED TO REMEMBER THE JOB NUMBER DURING HIGH SEG\r
+>\r
+ INTERN FTTRACK\r
+IFN FTTRACK, < \r
+ INTERN LASIN,LASOUT\r
+\r
+LASIN: 0 ;LAST JOB OR HIGH SEG SWAPPED IN\r
+LASOUT: 0 ;LAST JOB OR HIGH SEG SWAPPED OUT\r
+ ; ABOVE TWO FOR DEBUGGING ONLY\r
+>\r
+>\r
+\r
+;DEFINE BLOCK FOR BIT TABLE DENOTING 4 WORD BLOCKS AVAILABLE (=0), IN USE (=1)\r
+; USE MULTIPLES OF 4*^D36 WORDS SO THE TABLE WILL HAVE A MULTIPLE OF ^D36 BITS\r
+; ADD 7 WORDS TO ACCOMODATE A POSSIBLE 1K BEYOND MINCOR AMOUNT\r
+\r
+IFG DSKN, <\r
+INTERNAL DDBTAB,MINCOR\r
+\r
+DDBTAB: BLOCK <MINCOR/^D144>+1+7\r
+>\r
+\r
+\f;MONITOR TABLES WITH ONE ENTRY PER JOB\r
+\r
+ INTERN JBTSTS,JBTADR,JBTDAT,JBTNAM,JBTPRG\r
+ INTERN JOBMAX,JBTMAX,MJOBN,JBTAD1,JOBMXL,JBTMXL\r
+ INTERN FTTIME,FTKCT,FTPRV\r
+\r
+ JOBMAX==JOBN-1 ;MAXIMUM LEGAL JOB NUMBER\r
+ JOBMXL==<JOBMAX>B26 ;HIGHEST JOB NUMBERSHIFTED LEFT 9 (FOR GETTAB UUO)\r
+ MJOBN==-JOBN ;NEGATIVE NUMBERS OF JOBS (COUNTING NULL JOB)\r
+ IFG KT10AN, <SEGN==JOBN+SEGN> ;IF ANY HIGH SEGMENTS,\r
+ ; MUST HAVE AT LEAST AS MANY AS JOBS\r
+ JBTMAX==JOBN+SEGN-1 ;HIGHEST INDEX IN JBT TABLES\r
+ JBTMXL=<JBTMAX>B26 ;HIGHEST JBT ENTRY SHIFTED LEFT 9 (FOR GETTAB UUO)\r
+JBTSTS: BLOCK JOBN+SEGN ;JOB AND HIGH SEG STATUS WORD\r
+ ;LH==STATUS BITS (SEE S.MAC FOR DESCRIPTION)\r
+ ;RH==QUANTUM RUN TIME LEFT (SEE CLKCSS) FOR LOW SEGS\r
+ ;RH=IN CORE COUNT FOR HIGH SEGS\r
+JBTADR: BLOCK JOBN+SEGN ;JOB AND HIGH SEG CORE ASSIGNMENT\r
+ ; LH==PROTECTION (LENGTH-1)\r
+ ; RH==RELOCATION (ABSOLUTE LOCATION IN CORE)\r
+ JBTAD1==JBTADR+1 ;ADDRESS OF JOB 1 (USED BY SYSMAK)\r
+ JBTDAT==JBTADR ;RH==ADDRESS OF JOB DATA AREA\r
+ ;SAME AS JBTADR (JDAT==PROG)\r
+JBTSGN: IFG SEGN, <\r
+ BLOCK JOBN ;RH=SEGMENT NUMBER OF HIGH SEGMENT THIS JOB\r
+ ; IS USING IN CORE OR ON DISK\r
+ ; 0 MEANS JOB DOES NOT HAVE HIGH SEG\r
+ ;LH=USER DEPENDENT HIGH SEG STATUS BITS (SEE S.MAC)\r
+ XP ITMSGN,ITEM+JOBMXL ;LH SYMBOL FOR GETTAB UUO\r
+>\r
+ IFE SEGN, <\r
+ 0 ;SINGLE-ENTRY NULL JBTSGN TABLE....\r
+ XP ITMSGN,JOBMXL ;LH SYMBOL FOR GETTAB UUO SO THAT JBTSGN IS\r
+ ; UNDEFINED, I.E., MAKE INDEXING BY ITEM BE 0, BUT\r
+ ; ALLOW REFERENCES UP TO JOBMXL.\r
+>\r
+ IFG DSKN, < ;DISK SYSTEM ?\r
+ INTERN PRJPRG,JBTDIR\r
+JBTDIR: ;HIGH SEGMENT DIRECTORY NAME (DSK) OR PHYSICAL\r
+ ; DEVICE NAME (DTA,MTA)\r
+PRJPRG: BLOCK JOBN+SEGN ;XWD PROJECT NUMBER,PROGRAMMER NUMBER\r
+>\r
+ IFE DSKN, <IFG SEGN, < ;REENTRANT MONITOR WITHOUT DISK ?\r
+ INTERN JBTDIR\r
+ JBTDIR=.-JOBN ;INDEX BY HIGH SEG NUMBER\r
+ BLOCK SEGN ;HIGH SEGMENT PHYSICAL DEVICE NAME (DTA,MTA)\r
+>>\r
+ IFN FTTIME, <\r
+ INTERN RTIME,TTIME\r
+RTIME: BLOCK JOBN ;TOTAL RUN TIME SINCE LAST IJOB OR RUNTIME\r
+TTIME: BLOCK JOBN ;TOTAL RUN TIME SINCE LAST IJOB\r
+>\r
+\r
+ IFG SYS50N,< ;SWAPPING SYSTEM ?\r
+ INTERNAL JBTSWP,JBTCHK\r
+JBTSWP: BLOCK JOBN+SEGN ;LH:==PROTECT TIME WHILE JOB IS IN CORE.\r
+ ; DISK ADDRESS WHILE SWAPPED OUT\r
+ ;BIT 0=1 IF SEGMENT IS FRAGMENTED\r
+ ; BITS18-26:==OUTCORE IMAGE SIZE\r
+ ; BITS27-35:==INCORE IMAGE SIZE\r
+ ; FOR HIGH SEG, LH ALWAYS DISK ADDRESS\r
+\fJBTCHK: BLOCK JOBN+SEGN ;CHECK SUM FOR SWAPPED OUT JOB DATA AREA OR\r
+ ; SAME AREA FOR HIGH SEG\r
+\r
+>\r
+JBTNAM: ;NAME OF HIGH SEGMENT (FILE IT WAS INITIALIZED FROM)\r
+JBTPRG: BLOCK JOBN+SEGN ;NAME OF FILE USED IN LAST R,RUN,GET, ETC\r
+ ; USED BY SYSTAT PROGRAM\r
+ IFN FTKCT, <\r
+ INTERN JBTKCT\r
+JBTKCT: BLOCK JOBN ;PRODUCT OF CORE LENGTH (IN K) TIMES NUMBER OF JIFFIES\r
+ ; PROGRAM USED CPU. USED FOR TIME ACCOUNTING.\r
+>\r
+ IFN FTPRV, <\r
+ INTERN JBTPRV\r
+JBTPRV: BLOCK JOBN ;PRIVILEGE BITS FOR JOB SET BY LOGIN\r
+>\r
+ IFG DSKN, <\r
+ INTERN MQUEUE,MQTOP\r
+\r
+MQUEUE: BLOCK JOBN ;DISK MONITOR I/O QUEUE\r
+ MQTOP=. ;LAST LOC+1 OF MONITOR QUEUE\r
+>\r
+ IFG SYS50N, <\r
+;THE FOLLOWING ARE USED TO CREATE MXQUE\r
+;THE MAXIMUM QUEUE SIZE, USED BY SWAPPING SCHEDULER (SCHED)\r
+ FTDISK=-DSKN ;DEFINE FEATURE SWITCH FTDISK,SINCE IT APPEARS\r
+ ; IN MACRO QUEUES\r
+ ; WHICH IS DEFINED IN S.MAC\r
+ XP MXQUE,0\r
+\r
+ LALL ;LIST QUEUE DEFINITIONS FOR ALL TO SEE\r
+\r
+ DEFINE X <MXQUE==MXQUE+1;>\r
+ QUEUES\r
+DEFINE X (A)\r
+\r
+ <A'Z==MXQUE\r
+ INTERN A'Z\r
+ MXQUE==MXQUE+1>\r
+ CODES\r
+ MXQUE==MXQUE+3\r
+\r
+ XALL ;BACK TO NORMAL MACRO EXPANSION\r
+\r
+ INTERN JBTQ,JBTQM1,JBTQP1,JBTQMN\r
+\r
+ BLOCK MXQUE ;NUMBER OF QUEUES FOR SWAPPING SCHEDULER\r
+JBTQ: BLOCK JOBN ;ONE ENTRY PER JOB,\r
+ ; LH=PREVIOUS JOB, RH=NEXT JOB IN QUEUE\r
+ ; NEGATIVE MEANS THIS IS FIRST (LH) OR LAST (RH)\r
+ ; JOB IN QUEUE\r
+ JBTQM1==JBTQ-1 ;JBTQ-1\r
+ JBTQP1==JBTQ+1 ;JBTQ+1\r
+ JBTQMN==JBTQ-NULZ ;J1\r
+>\r
+\f;TTY TRANSLATOR TABLE\r
+;INDEXED BY TTY LINE NUMBER, CONTAINS TTY DDB ADDRESS IN RH\r
+;(ASSIGNED WHEN FIRST CHARACTER TYPED ON TTY BY SCNSER\r
+ ;BIT 0==1 IF COMMAND TYPED BUT NOT PROCESSED\r
+ ;BITS 6-11==JOB NUMBER TTYP IS ATTACHED TO\r
+ ;BITS 12-17==NEXT LINE NUMBER IN TALK RING OR ITS SELF IF NOT TALKING\r
+\r
+ INTERN TTYTAB,PTYTAB,TPYTAB,TCONLN,MLTTYL,MTTYLN,TTPLEN,TTMODL,TTPMXL\r
+\r
+TTYTAB: BLOCK HGHLIN+1+1 ;NO OF TTYS PLUS CTY\r
+ TPYTAB==.-1 ;ADDRESS OF LAST ENTRY\r
+ TCONLN==.-1-TTYTAB ;LINE NUMBER OF CTY\r
+ BLOCK PTYN ;PSEUDO TTY TRANSLATOR TABLE\r
+ ; THIS IS FOR LINKED TTY LINES,\r
+ ; NOT THE DEVICE "PTYN"'S DDB\r
+ TTPLEN==.-TTYTAB ;LENGTH OF ENTIRE TABLE\r
+ TTPMXL=<TTPLEN-1>B26 ;HIGHET ENTRY IN TTYTAB SHIFTED LEFT 9(FOR GETTAB UUO)\r
+\r
+ MLTTYL==-JOBN ;NEG, NO OF TTY DDBS (ONE FOR EACH JOB, PLUS 1 ETRA\r
+ ; SO JOB CAPACITY EXCEEDED MESSAGE CAN BE TYPED\r
+ MTTYLN==-TTPLEN ;NEG, LENGTH OF ENTIRE TRANSLATOR TABLE\r
+\r
+PTYTAB: BLOCK PTYN+1 ;ADDRESS OF THE DDBS FOR DEVICE PTYN\r
+ ; NOT THE LINKED TTY LINES. SEE TPYTAB.\r
+;LAST LOCATION CLEARED BY SYSINI ON 143 RESTART\r
+ SYSEND==.-1\r
+\f;ONCE ONLY CODE TO CREATE DEVICE DATA BLOCKS\r
+\r
+ LOC SYSBEG ;PUT IN SYSTEM DATA AREA SO NOT TO TAKE\r
+ ; VALUABLE SPACE. THIS AREA IS CLEARED\r
+ ; BY SYSINI AFTER IT HAS BEEN EXECUTED\r
+\r
+;CNTDB- ROUTINE TO INCREASE SIZE OF MONITOR FOR MULTIPLE DEVICE DATA BLOCKS\r
+; BOTH DISK AND OTHER DEVICES (DTA,MTA,SCN,PTY)\r
+; CALL: JSP TAC,CNTDB (FROM LONG ONCE DIALOG)\r
+;\r
+;LINKDB- ROUTINE TO CREATE MULTIPLE DEVICE DATA BLOCKS (EXCEPT DISK)\r
+; AND LINK THEM. THESE ARE STORED ON TOP OF ONCE ONLY CODE\r
+;CALL: JRST LINKDB (FROM LINKSR)\r
+;BOTH ROUTINES UPDATE SYSSIZ AS MORE DDB SPACE IS CONSUMED\r
+\r
+ INTERN LINKDB,CNTDB\r
+ EXTERN LINKSR\r
+\r
+LINKDB: SETOM DESONC ;PERMIT DESTRUCTION OF ONCE ONLY CODE\r
+ SKIPA TAC,LINKSR ;GET JSRPC OF CALLER OF LINKSR IN ONCE\r
+CNTDB: SETZM DESONC ;PREVENT DESTRUCTION OF ONCE ONLY CODE\r
+ ;SO THAT E.G. SAT TABLES MAY BE SCANNED\r
+ HRRM TAC, LINKED ;STORE EXIT FROM THIS ROUTINE (ONCE ONLY CODE WILL\r
+ ; BE OVERLAYED BY MULTIPLE DEVICE DATA\r
+ ; BLOCK GENERATION)\r
+ MOVSI TAC,INTNUM ;NEG NUMBER OF ENTRIES IN TABLE\r
+ MOVEI DEVDAT,DEVLST-DEVSER ;MAKE DEVLST LOOK LIKE DEVSER IN A DOB\r
+LOOP: MOVE TAC1,INTTB1(TAC) ;GET NEXT DEVICE DATA BLOCK ADDRESS\r
+ JUMPE TAC1,NEXT ;0 MEANS NO DOB FOR DEVICE\r
+ SKIPE DESONC ;OK TO DESTROY ONCE ONLY CODE ?\r
+ HRLM TAC1,DEVSER(DEVDAT) ;YES, STORE IN PREVIOUS DEVICE DATA BLOCK\r
+ HRRZ DEVDAT,TAC1 ;MAKE DEVDAT POINT TO CURRENT DOB\r
+ LDB UUO,DDBNUM ;GET NUMBER OF DDB'S\r
+ SOJLE UUO,NEXT ;ONE OR LESS ?\r
+ HRRZ JBUF,DEVDAT ;NO, CREATE MULTIPLE COPIES OF DOB\r
+ ; SAVE ORIGINAL IN JBUF\r
+ MOVEI AC3,1 ;STARTING WITH DEV1,DEV2,DEV77\r
+ LDB AC1,PUNIT ;START UNIT NUMBER FROM\r
+ ; ASSEMBLE DEVICE DATA BLOCK\r
+ ; PTY STARTS UNIT NUMBER AT 1 INSTEAD OF 0\r
+ ; ALTHOUGH DEVICE NAMES ARE PTY0,PTY1,ETC.\r
+\fMULDDB: HRRZ TAC1,SYSSIZ ;ADR. OF NEXT DDB IS AT END OF MONITOR\r
+ SKIPE DESONC ;OK TO DESTROY ONCE ONLY CODE ?\r
+ HRLM TAC1,DEVSER(DEVDAT) ;YES, MAKE PREVIOUS DDB POINT TO THE ONE ABOUT TO BE CREATED\r
+ HRL DEVDAT,JBUF ;SOURCE ADDRESS TO LH\r
+ HRR DEVDAT,TAC1 ;DESTINATION ADDRESS TO RH\r
+ HLRZ AC2,INTTB1(TAC) ;LENGTH OF DEVICE DATA BLOCK\r
+ ADDB AC2,SYSSIZ ;LAST LOCATION+1 AFTER MOVE\r
+ SKIPN DESONC ;OK TO DESTROY ONCE ?\r
+ JRST JUSTCT ;NO, JUST COUNT DDB SPACE\r
+ BLT DEVDAT,-1(AC2) ;MOVE ORIGINAL TO FREE STORAGE\r
+ SKIPL INTTAB(TAC) ;IS THIS DECTAPE (ANY OF 3 SERVICES)?\r
+ JRST NOTDTA ;NO\r
+ HRRZ AC2,DEVDAT ;YES,DESTINATION\r
+ SUBI AC2,(JBUF) ;-SOURCE=DISTANCE MOVED\r
+ ADDM AC2,14(DEVDAT) ;INCREMENT POINTER TO DIRECTORY BLOCK\r
+ ; (SORRY ABOUT NO SYMBOL)\r
+NOTDTA: MOVE PROG,PHYNAM ;BYTE POINTER TO NEWLY CREATED\r
+ ; DDB PHYSICAL NAME\r
+\r
+ MOVE ITEM,AC3 ;MAKE COPY OF UNIT NUMBER\r
+ TRNN ITEM,70 ;IS IT 10 OR MORE ?\r
+ JRST SMALL ;NO\r
+ ROT ITEM,-3 ;YES, CONVERT HIGH ORDER OCTAL DIGIT TO\r
+ ADDI ITEM,20 ;SIXBIT\r
+ IDPB ITEM,PROG ;AND STORE\r
+ TRZ ITEM,-1 ;CLEAR OUT HIGH ORDER DIGIT\r
+ ROT ITEM,3 ;MOVE LOW ORDER DIGIT BACK\r
+SMALL: ADDI ITEM,20 ;CONVERT LOW ORDER DIGIT IN SIXBIT\r
+ IDPB ITEM,PROG ;AND STORE IN PHYSICAL NAME\r
+ ADDI AC1,1 ;INCREMENT BINARY UNIT NUMBER\r
+ DPB AC1,PUNIT ;STORE UNIT NUMBER\r
+JUSTCT: CAIGE AC3,(UUO) ;COMPARE WITH HIGHEST DEVICE NUMBER\r
+ AOJA AC3,MULDDB ;DO ANOTHER COPY\r
+NEXT: AOBJN TAC,.+1 ;MOVE BY TWOS\r
+ AOBJN TAC,LOOP ;ANY MORE DEVICES\r
+ MOVEI TAC,0 ;NO, FLAG END OF DEVICE DATA BLOCK CHAIN WITH 0 LINK\r
+ SKIPE DESONC ;OK TO DESTROY ONCE ?\r
+ HRLM TAC,DEVSER(DEVDAT) ;YES, STORE 0 IN CASE LAST DDB IS MULTIPLE\r
+IFG DSKN, <\r
+ EXTERNAL LOCORE,CRINIT\r
+ MOVE TAC,SYSSIZ ;SIZE OF MONITOR SO FAR (SYSMAK, EXEC DDT OR NOT)\r
+ MOVEM TAC,LOCORE ;SAVE POINTER TO FIRST 4 WORD BLOCK\r
+ ADDI TAC,MINCOR ;MINIMUM REQUIRED FOR DISK DDBS\r
+ IORI TAC,1777 ;FORCE TO 1K BOUNDARY\r
+ ADDI TAC,1\r
+ MOVEM TAC,SYSSIZ ;STORE SIZE OF MONITOR (FIRST FREE LOC)\r
+ SUB TAC,LOCORE ;FORM LENGTH OF EXCESS CORE\r
+ IDIVI TAC,^D144 ;MUST BE MULTIPLE OF 144. WORDS (SEE DDBTAB)\r
+ MOVN TAC,TAC ; -N\r
+ HRLM TAC,CRINIT ;STORE USEABLE LENGTH OF DDBTAB\r
+>\r
+LINKED: JRST . ;RETURN TO SYSINI\r
+\r
+DESONC: 0 ;FLAG =0 IF CALLED BY JSP TAC,CNTDB\r
+ ; (DO NOT DESTROY ONCE)\r
+ ; FLAG NON-ZERO IF CALLED BY JRST LINKDB\r
+ ; (OK TO DESTROY ONCE CODE)\r
+DDBNUM: POINT 8,INTTAB(TAC),8 ;POINTER TO DDB NUMBER\r
+PHYNAM: POINT 6,DEVNAM(DEVDAT),17 ;BYTE POINTER TO DB PHYSICAL NAME\r
+\r
+\f;MACROS TO DEFINE PI CHANNEL NUMBER AND GENERATE INTERRUPT CHAINING\r
+;INFORMATION FOR ONCE \r
+;SO IT CAN LINK THE DEVICE INTERRUPT SERVICE ROUTINES AND THE DEVICE DATA BLOCKS\r
+;TABLE INTTAB IS GENERATED WITH PAIRS OF ENTRIES FOR EACH DEVICE\r
+;WHICH HAS A DEVICE DATA BLOCK(0-7)\r
+;FIRST WORD: BIT 0==1 IF DECTAPE,BITS 1-9==NO. OF DDBS, BITS 9-17==PI CHANNEL(0-7)\r
+;0 MEANS NO PI CHANNEL (EG PTY)\r
+;SECOND WORD:LH==0 IF SINGLE DEVICE,==LENGTH OF DDB IF MULTIPLE, RH==DDB ADDRESS\r
+\r
+;MACRO FOR DEVICES WHICH ARE ALWAYS PRESENT(AND WHICH DO NOT USE A CHANNEL SAVE ROUTINE\r
+;AND HAVE NO DDB (EX-APR,CTY,PEN,CLK)\r
+\r
+DEFINE SPASGINT (DEV,PI) <\r
+ DEV'N==1\r
+ ASGINT DEV,PI\r
+>\r
+\r
+DEFINE ASGINT (DEV,PI) <\r
+ IFG DEV'N, <IFG PI, <\r
+ IFE <PI-.CH>, <.CHAS==1 ;CHANNEL PI IN USE.>\r
+ INTERNAL DEV'CHN\r
+ DEV'CHN==PI\r
+ EXTERNAL DEV'INT ;INTERRUPT SERVICE CONSO INSTRUCTION\r
+ XWD PI,DEV'INT ;GENERATE INTERRUPT ENTRY POINT FOR ONCE\r
+ XWD 0,0 ;NO DDB TO CHAIN TOGETHER\r
+ ASGIN1 DEV,\PI\r
+>\r
+>>\r
+\r
+DEFINE ASGIN1 (DEV,PI) <\r
+ IFDEF CH'PI, < ;WAIT TILL PASS 2 TO DEFINE\r
+ DEV'CHL==CH'PI\r
+ INTERNAL DEV'CHL\r
+>>\r
+\r
+;MACRO FOR OPTIONAL DEVICES WHICH ALWAYS USE A CHANNEL SAVE ROUTINE\r
+; (EXAMPLES: CDR, DSK, PTR, ETC. ALSO PTY WITH 0 PI)\r
+\r
+DEFINE SPASGSAV (DEV,PI,NUM) <\r
+ DEV'N==NUM\r
+ ASGSAV DEV,PI\r
+>\r
+\r
+DEFINE ASGSAV (DEV,PI) <\r
+ IFG DEV'N, <IFG PI, <\r
+ EXTERN DEV'INT ;INTERRUPT SERVICE CONS INSTRUCTION\r
+ >\r
+ EXTERN DEV'DDB\r
+ ASGSV1 (DEV,\PI)\r
+ >>\r
+\f;MACRO FOR: 1. COMPLETION OF THE DEFINITION REQUIRED FOR THOSE\r
+; DEVICES INVOKING THE ASGSAV MACRO\r
+;\r
+; 2. COMPLETE DEFINITION FOR THOSE DEVICES WITH THEIR\r
+; INTERRUPT ENTRY POINT AND DDB'S HERE IN COMMON\r
+; (EXAMPLE: LPT'S)\r
+\r
+DEFINE ASGSV1 (DEV,PI) <\r
+ IFG PI, <\r
+ IFE <PI-.CH>, <.CHAS==1 ;CHANNEL PI IN USE.>\r
+ DEV'CHN==PI ;DEFINE DEVICE CHANNEL NUMBER\r
+ INTERN DEV'CHN ;DECLARE INTERNAL - ONLY IF DEVICE WANTED\r
+ USED'PI==1 ;SET FLAG SO THAT A CHANNEL SAVE\r
+ ; ROUTINE WILL BE GENERATED FOR\r
+ ; THIS PI CHANNEL\r
+ IFDEF SAV'PI, < ;WAIT TILL CHANNEL SAVE ROUTINES\r
+ ; ARE DEFINED BELOW (IN PASS 2)\r
+\r
+ DEV'SAV==SAV'PI ;CHANNEL AC SAVE ROUTINE LOCATION\r
+ DEV'RET==RET'PI ;CHANNEL AC RESTORE ROUTINE LOCATION\r
+ ; (USUALLY POPJ USED)\r
+ DEV'CHL==CH'PI ;LOCATION WHERE INTERRUPT PC IS STORED\r
+ DEV'SAC==SAVAC'PI ;STARTING CHANNEL SAVE LOCATION FOR AC'S\r
+ INTERN DEV'SAV, DEV'RET, DEV'CHL, DEV'SAC\r
+ >>\r
+\r
+ DTBIT==0 ;ASSUME THIS IS NOT A DECTAPE\r
+\r
+ IFIDN <DEV>, <DTA>, <DTBIT==1> ;IS IT PDP-10 DECTAPES ?\r
+ IFIDN <DEV>, <DTC>, <DTBIT==1> ; OR PDP-6 DECTAPES ?\r
+\r
+ IFE PI, <\r
+ XWD DEV'N*1000+0,0 ;NO PI CHANNEL FOR THIS DEVICE\r
+ >\r
+\r
+ IFG PI, <\r
+ XWD DTBIT*400000+DEV'N*1000+PI,DEV'INT ;FIRST WORD OF INTTAB ENTRY\r
+ >\r
+\r
+ IFG DEV'N-1, <\r
+ XWD DEV'DDS,DEV'DDB ;MULTIPLE DEVICE SECOND WORD OF INTTAB ENTRY\r
+ EXTERN DEV'DDS\r
+ >\r
+ IFE DEV'N-1, <\r
+ XWD 0,DEV'DDB ;SINGLE DEVICE SECOND WORD OF INTTAB ENTRY\r
+ >>\r
+\f\r
+;MACRO'S TO ALLOW GENERATION OF MULTIPLE INTTAB ENTRIES FOR MULTIPLE\r
+; DEVICES SUCH AS LINE-PRINTERS\r
+\r
+DEFINE MULASG (DEV,DE,PI) <\r
+ IFG DEV'N, <\r
+ ZZ==0\r
+ REPEAT DEV'N, <\r
+ DEVASG DE,\ZZ,PI\r
+ ZZ==ZZ+1\r
+ >\r
+ >\r
+>\r
+\r
+DEFINE DEVASG (DE,X,PI) <\r
+ DE'X'N==1\r
+ ASGSV1 DE'X,\PI\r
+>\r
+\r
+\r
+;MACROS TO CONTROL ASSIGNMENT OF PI CHANNELS TO DEVICES\r
+\r
+DEFINE NEXTCH < .CH==.CH+1\r
+.CHAS==0\r
+NEXTCU \.CH \r
+>\r
+DEFINE NEXTCQ < IFN .CHAS,<NEXTCH>>\r
+DEFINE NEXTCU (N) < IFDEF UNIQ'N,<IFN UNIQ'N,<NEXTCH>>>\r
+\r
+\r
+\r
+\r
+\r
+\r
+;ASSUME NO PI CHANNEL SAVE ROUTINES NEEDED\r
+\r
+ USED1==0\r
+ USED2==0\r
+ USED3==0\r
+ USED4==0\r
+ USED5==0\r
+ USED6==0\r
+ USED7==0\r
+\r
+;NOW GENERATE THE TABLE FOR ONCE AND DEFINE PI CHANNEL ASSIGNMENTS\r
+\r
+ INTERN INTTAB,INTTB1,INTNUM,SCNN,CTYN\r
+\r
+ CTYN==1 ;ALWAYS ONE CTY\r
+ SCNN==JOBN ;NUMBER OF SCN DDB\r
+ ; ONE FOR EACH JOB + NULL JOB (EXTRA ONE)\r
+ APRN==1 ;ALWAYS AN APR\r
+ CLKN==1 ;ALWAYS LOWEST PRIORITY CLOCK\r
+\r
+\r
+INTTAB: ;TABLE OF DATA FOR DEFINING PI CHAN AND NUMBER OF DOB\r
+ INTTB1==INTTAB+1\r
+\r
+ ASGSAV PTY,0 \r
+\r
+.CHAS==0\r
+.CH==0\r
+NEXTCH\r
+\r
+;THE FOLLOWING DEVICES MUST HAVE A UNIQUE, HIGH PRIORITY\r
+; CHANNEL FOR BLOCK I/O TRANSFERS.\r
+\r
+;NOTE THAT THE PDP-6 DECTAPE AND MAGTAPE SHARE A\r
+; 136 DATA CONTROL IF BOTH ARE PRESENT.\r
+\r
+ ;DATA PRODUCTS DISK BLKI/BLKO PI CHANNEL:\r
+ IFNDEF DCBCHN, <IFG DPDN, <XP DCBCHN,.CH\r
+ NEXTCH>>\r
+ ;PDP-6 OR PDP-10 MAGTAPE BLKI/BLKO PI CHANNEL:\r
+ IFNDEF MTDCHN, <IFG MTAN, <XP MTDCHN,.CH\r
+ NEXTCH>>\r
+ IFNDEF DCTCHN, <IFG MTCN, <XP DCTCHN,.CH\r
+ NEXTCH>>\r
+ ;PDP-6 OR PDP-10 DECTAPE BLKI/BLKO PI CHANNEL:\r
+ IFNDEF DTDCHN, <IFG DTAN, <XP DTDCHN,.CH\r
+ NEXTCH>>\r
+ IFNDEF DCTCHN, <IFG DTCN, <XP DCTCHN,.CH\r
+ NEXTCH>>\r
+\r
+IFNDEF BLKMXC, <BLKMXC=.CH> ;REMEMBER THIS CHANNEL ON PASS 1\r
+.CH==BLKMXC ;ON PASS 2, SKIP OVER BLKI CHANNELS\r
+\r
+\f;THE FOLLOWING ARE GROUPED ON A CHANNEL FOR HIGH-PRIORITY DEVICES\r
+ ASGSAV CDR,.CH\r
+ ASGINT APR,.CH\r
+\r
+NEXTCQ\r
+\r
+;THE FOLLOWING ARE MEDIUM-PRIORITY DEVICES, AS A GROUP\r
+ ASGSAV SCN,.CH\r
+ ASGSAV PTR,.CH\r
+ MULASG LPT,LP,.CH\r
+ ASGSAV DTA,.CH\r
+ ASGSAV DTC,.CH\r
+ ASGSAV MTA,.CH\r
+ ASGSAV MTC,.CH\r
+ ASGINT CTY,.CH\r
+\r
+NEXTCQ\r
+\f\r
+;THE FOLLOWING ARE LOWER-PRIORITY DEVICES, AS A GROUP\r
+ ASGSAV DSK,.CH\r
+ ASGSAV PEN,.CH\r
+ ASGSAV PTP,.CH\r
+ ASGSAV CDP,.CH\r
+ ASGSAV PLT,.CH\r
+NEXTCQ\r
+\r
+\r
+;THESE DEVICES GET LOW PRIORITY CHANNEL\r
+ ASGSAV DIS,.CH\r
+\r
+NEXTCQ\r
+\f\r
+;LAST IS THE SCHEDULER, ON CHANNEL 7 BY ITSELF\r
+\r
+IFG <.CH-7>, < PRINTX ;NOT ENOUGH PI'S TO SERVICE THIS CONFIGURATION.\r
+ PRINTX ;SUGGEST EDITING COMMON TO PUT MORE DEVICES ON\r
+ PRINTX ; A SINGLE CHANNEL\r
+>\r
+\r
+.CH==7\r
+ ASGINT CLK,.CH\r
+\r
+ SPCINT\r
+ ;GENERATE ANY SPECIAL DEVICES CUSTOMER IS SUPPLYING\r
+ ; WHICH DO NOT USE A CHANNEL SAVE ROUTINE AND HAVE\r
+ ; NO DEVICE DATA BLOCK\r
+ SPCSAV\r
+ ;GENERATE ANY SPECIAL DEVICES CUSTOMER IS SUPPLYING\r
+ ; WHICH DO NEED A CHANNEL SAVE ROUTINE\r
+\r
+;END OF THE ASSIGNMENT TABLE\r
+\r
+ INTNUM==INTTAB-. ;-LENGTH OF INTERRUPT CHANNEL ASSIGNMENT TABLE\r
+\r
+ IFLE .-SYSEND, <LOC SYSEND+1>\r
+ ; SET LOC UP TO SYSEND+1, UNLESS ONCE ONLY CODE\r
+ ; IS BIGGER\r
+\r
+\f\r
+\r
+;SYSTEM CONSTANTS AND PARAMETERS\r
+\r
+ INTERN CNFTBL,CNFMXL,CONFIG,SYSTAP,SYSDAT\r
+\r
+\r
+CNFTBL: ;FIRST LOCATION OF MONITOR DATA STORAGE\r
+ ; RETURNED BE GETTAB UUO (THESE LOCATIONS\r
+ ; NOT CLEARED BY SYSINI)\r
+ ; CNFTBL IS GETTAB TABLE 11 (RH OF AC)\r
+ ; OCTAL NO. IN () CORRESPOND TO GETTAB UUO\r
+CONFIG: SYSNAM\r
+\r
+ LOC CONFIG+5 ;ALWAYS LEAVE 5 WORDS (24 CHARS)\r
+ ; SO GETTAB UUO WILL BE CONSTANT\r
+SYSDAT: SYSDAT\r
+ ;(5,6) GENERATE SYSTEM DATE\r
+ LOC SYSDAT+2 ;ALWAYS LEAVE 2 WORDS SO GETTAB CONSTANT\r
+SYSTAP: SYSDEV\r
+ ;(7) NAME OF SYSTEM DEVICE, IN SIXBIT\r
+\r
+;LOCATIONS SETUP BY ONCE ONLY OPERATOR DIALOGUE AND NEVER RESET ON RESTARTS\r
+\r
+ INTERN TIME,THSDAT,SYSSIZ,DEVOPR,DEVLST,SEGPTR,TWOREG,STATES\r
+ INTERN SERIAL\r
+ EXTERN PATCH\r
+\r
+TIME: 0 ;(10) TIME OF DAY IN JIFFIES (60TH OR 50THS OF A SEC)\r
+THSDAT: 0 ;(11) TODAY'S DATE ((Y-1964)*12+(M-1))*31+(D-1)\r
+SYSSIZ: EXP PATCH ;(12) SIZE OF MONITOR (FIRST LOC NOT USED)\r
+DEVOPR: SIXBIT /CTY/ ;(13) SIXBIT PHYSICAL NAME OF OPERATORS CONSOLE\r
+ ; (IF THIS LOCATION CONTAINS 0, NONE HAS\r
+ ; BEEN DESIGNATED)\r
+ ;PUBLIC LOGICAL NAME "OPR" WILL BE THIS DEVICE.\r
+ ; ALSO UNEXPLAINED MONITOR ERROR MESSAGES\r
+ ; WILL BE TYPED ON TTY OPR\r
+DEVLST: XWD 0,0 ;(14) LH CONTAINS ADDRESS OF FIRST DEVICE DATA BLOCK\r
+ ; ONCE ONLY CODE LINKS DEVICE DATA BLOCKS\r
+\fSEGPTR: XWD -SEGN,JOBN ;(15) AOBJN POINTER TO 1ST HIGH SEG IN JBTXXX TABLES\r
+ ; LH=-NO. OF HIGH SEGS, RH= ST HIGH SEG NO.\r
+TWOREG: 0 ;(16) FLAG TO INDICATE WHETHER BOTH HARDWARE AND SOFTWARE\r
+ ; HAVE 2 RELOC REG CAPACITY\r
+ ; NON-ZERO IF BOTH DO, 0 IF EITHER OR BOTH DO NOT\r
+ ; SET BY ONCE ONLY CODE\r
+\r
+ ZZ==0\r
+ IFG DSKN,<ZZ==ZZ!1B0> ;1 IF DISK SYSTEM (ANALOGOUS TO FTDISK)\r
+ IFG SYS50N,<ZZ==ZZ!1B1> ;1 IF SWAPPING SYSTEM (ANALOGOUS TO FTSWAP)\r
+ IFG LOGINN,<ZZ==ZZ!1B2> ;1 IF LOGIN (ANALOGOUS TO FTLOGIN)\r
+ IFN FTTTYSER,<ZZ==ZZ!1B3> ;1 IF FULL DUPLEX SOFTWARE\r
+ IFN FTPRV,<ZZ==ZZ!1B4> ;1 IF PRIVILEGE FEATURE INCLUDED\r
+ IFN FT2REL,<ZZ==ZZ!1B5> ;1 IF REENTRANT SOFTWARE\r
+ IFE JIFSEC-^D50,<ZZ==ZZ!1B6> ;1 IF 50 CYCLE MACHINE, 0 IF 60 CYCLE\r
+STATES: EXP ZZ ;(17) BITS WHICH DEFINE TYPE OF SYSTEM IN LH\r
+ ; RH PATCHED BY MONITOR COMMAND TO\r
+ ; INDICATE OPERATIONAL STATE OF SYSTEM\r
+SERIAL: EXP APRSN ;(20) SERIAL NUMBER OF APR\r
+CNFMXL==<.-CNFTBL-1>B26 ;MAXIMUM ENTRY IN CNFTBL FOR GETTAB UUO\r
+\fIFG DSKN, <\r
+ INTERN ODPTBL,ODPMXL,SWPHGH,K4SWAP,PROT,PROT0\r
+\r
+IFG SYS50N,< EXTERN ICPROT,ICPRT1 ;THESE ARE DEFINED ONLY IN\r
+ ; A SWAPPING SYSTEM>\r
+IFLE SYS50N,< XP ICPROT,0 ;IF NON-SWAPPING, DECLARE\r
+ XP ICPRT1,0 ; INTERNAL IN COMMON>\r
+\r
+ODPTBL: ;FIRST LOC IN MONITOR DATA AREA FOR DISK\r
+ ; LOCATIONS WHICH ARE NOT SET TO 0 WHEN SYSTEM\r
+ ; STARTED, ODPTBL IS GETTAB UUO TABLE 15\r
+\r
+SWPHGH: 0 ;(0) HIGHEST LOGICAL BLOCK # IN THE SWAPPING\r
+ ; SPACE ON THE DISK (SET BY SWPINI)\r
+K4SWAP: 0 ;(1)K OF DISK WORDS SET ASIDE FOR SWAPPING\r
+ ; ASSIGNED AT ONCE ONLY REFRESH TIME\r
+\r
+PROT: EXP ICPROT ;(2) IN-CORE PROTECT TIME PARAMETER TO BE\r
+ ; MULTIPLIED BY <K-1> OF CORE IN JOB.\r
+PROT0: EXP ICPRT1 ;(3) IN-CORE PROTECT TIME PARAMETER TO \r
+ ; BE ADDED TO ABOVE RESULT.\r
+\r
+ ;INSERT NEW LOCATIONS OF INTEREST SETUP\r
+ ; BY ONCE ONLY CODE HERE FOR DISK SYSTEMS\r
+ODPMXL==<.-ODPTBL-1>B26 ;MAXIMUM ENTRY IN ODPTBL FOR GETTAB UUO\r
+> \r
+\r
+\f;MORE DATA LOCATIONS SETUP AT ASSEMBLY TIME OR ONCE ONLY TIME\r
+; BUT NOT OF INTEREST TO USER PROGRAMS\r
+\r
+ INTERN XJBPFI,PMONTB,MONTAB,MIDNIT\r
+\r
+XJBPFI: XWD .,0 ;LH FILLED IN WITH EXTERNAL JOBPFI (SEE JOBDAT)\r
+ ; JOBPFI==HIGHEST LOC, IN USER JOB DATA AREA\r
+ ; PROTECTED FROM I/O\r
+;MONTH TABLE FOR DAYTIME COMMAND PRINTING\r
+\r
+PMONTB: POINT 6,MONTAB(TAC),5 ;POINTER TO NUMBER OF DAYS INMONTH\r
+MONTAB: EXP ^D30B5+"JAN"\r
+ EXP ^D27B5+"FEB"\r
+ EXP ^D30B5+"MAR"\r
+ EXP ^D29B5+"APR"\r
+ EXP ^D30B5+"MAY"\r
+ EXP ^D29B5+"JUN"\r
+ EXP ^D30B5+"JUL"\r
+ EXP ^D30B5+"AUG"\r
+ EXP ^D29B5+"SEP"\r
+ EXP ^D30B5+"OCT"\r
+ EXP ^D29B5+"NOV"\r
+ EXP ^D30B5+"DEC"\r
+MIDNIT: EXP ^D60*^D60*^D24*JIFSEC ;NO OF JIFFIES TILL MIDNIGHT\r
+\f;STOP PROCEDURE WHEN SHUTTING DOWN SYSTEM\r
+;BECAUSE OF CATOSTROPHIC FAILURE OR ANY OTHER REASON\r
+;WRITE OUT DIRECTORIES STILL IN CORE (DISK)\r
+;TRANSFER HERE FROM LOC 147\r
+\r
+;PROCEDURE TO SAVE CRASHED MONITOR ON DECTAPE FOR LATER DEBUGGING UNDER TIME SHARING\r
+;OPERATOR SHOULD:\r
+; 1. PUSH STOP AND HOLD IT DOWN\r
+; 2. PUSH CONTINUE (APR PI IN PROGRESS SHOULD COME ON)\r
+; THIS PUTS MACHINE INTO EXEC MODE AND STORES PC OC CRASH\r
+; 3. LETUP ON STOP\r
+; 4. SET ADDRESS SWITCHES TO 147\r
+; 5. PUSH START (DO NOT PUSH I/O RESET AS IT WILL CLEAR DEVICES)\r
+\r
+INTERN APRSTS,PISTS,SYSTOP,CRASHX,SWTSTS,TTYSTS,PTRSTS,TMCSTS\r
+INTERN PTPSTS,DLSSTS,DTSSTS,CRSTS,LPTSTS,PLTSTS,TMSSTS,DSKSTS,DSKDTI\r
+EXTERN SYSPDL\r
+\r
+EXTERN CRSHAC ;DEFINED IN SYSINI TO BE 143 RESTART CODE\r
+ ;SO MONITOR CANNOT BE RESTARTED AT 143 AFTER\r
+ ;BEING STARTED AT 147.\r
+\r
+CRASHX: MOVEM 17,CRSHAC+17 ;SAVE AC17\r
+ MOVE 17,TSTLOC\r
+ CAME 17,SYSCRS ;IS LOC 147 WIPED OUT?\r
+ HALT SYSTOP+1 ;YES - LET OPERATOR DECIDE WHAT TO DO\r
+ JRST SYSTOP+1 ;NO - GO SAVE AC'S & DEVICE STATES\r
+TSTLOC: JRST SYSTOP\r
+\r
+SYSTOP: MOVEM 17,CRSHAC+17 ;SAVE ALL ACS\r
+ MOVEI 17,CRSHAC ;SOURCE==0, DESTINATION==CRSHAC\r
+ BLT 17,CRSHAC+16 ;SO DDT CAN LOOK AT SAVED CRASH LATER\r
+\r
+APRSTS: CONI APR,. ;STORE APR STATUS HERE\r
+PISTS: CONI PI,. ;STORE PI STATUS HERE\r
+SWTSTS: DATAI APR,.\r
+TTYSTS: CONI TTY,.\r
+PTRSTS: CONI PTR,.\r
+PTPSTS: CONI PTP,.\r
+DLSSTS: CONI DLS,.\r
+DTSSTS: CONI DTS,.\r
+CRSTS: CONI CR,.\r
+LPTSTS: CONI LPT,.\r
+PLTSTS: CONI PLT,.\r
+TMSSTS: CONI TMS,.\r
+TMCSTS: CONI TMC,.\r
+DSKSTS: CONI DSK,.\r
+DSKDTI: DATAI DSK,.\r
+ CONO APR,APRRST ;RESET SYSTEM\r
+ MOVEI PDP,SYSPDL ;SETUP PDP TO SPARE AREA\r
+ IFG DSKN, <\r
+ EXTERN DSKSTP\r
+ PUSHJ PDP,DSKSTP>\r
+ HALT 137400 ;STOP AT TENDMP(READY TO READ IN ANYTHING)\r
+;ERROR RECOVERY - TRY TO START NULL JOB\r
+\r
+NULJB1: MOVEI ITEM,0 ;SET JOB NUMBER TO 0\r
+ JRST NULJOB ;GO RESTORE NULL JOB\r
+\f\r
+\r
+\r
+;COMMON SUBROUTINE RETURNS\r
+\r
+ INTERN CPOPJ,CPOPJ1,DPOPJ,TPOPJ,TPOPJ1,CPOPJ2,IPOPJ1,IPOPJ\r
+ INTERN CUXIT1,CUXIT,UXIT\r
+ INTERN FTTIME,FTSWAP,FTSLEEP,FTKCT,FT2REL,FTPRV\r
+CPOPJ2: AOS (PDP) ;DOUBLE SKIP SUBROUTINE RETURN\r
+CUXIT1: ;OLD SKIP RETURN FOR UUOS\r
+CPOPJ1: AOSA (PDP) ;SKIP SUBROUTINE RETURN\r
+DPOPJ: MOVEM IOS,DEVIOS(DEVDAT) ;DEPOSIT I/O STATUS WORD IN DDB\r
+UXIT:\r
+CUXIT: ;OLD RETURN FOR UUOS\r
+CPOPJ: POPJ PDP,\r
+\r
+TPOPJ1: AOS -1(PDP) ;RESTORE TAC THEN SKIP RETURN\r
+TPOPJ: POP PDP,TAC ;RESTORE TAC\r
+ POPJ PDP, ;AND RETURN\r
+IPOPJ1: AOS -1(PDP) ;SET FOR SKIP RETURN\r
+IPOPJ: POP PDP,ITEM ;RESTORE ITEM (USUALLY JOB OR HIGH SEG NUMBER)\r
+ POPJ PDP,\r
+\r
+\f; SYSTEM BYTE POINTERS\r
+\r
+ INTERN PUUOAC,PIOMOD,PJOBN,PUNIT,PJBSTS,PDVTIM,PDVCNT,PCORSZ,COREP\r
+ INTERN IADPTR\r
+\r
+PUUOAC: POINT 4,UUO,12 ;UUO AC FIELD\r
+PIOMOD: POINT 4,IOS,35 ;MODE BITS\r
+PJOBN: POINT 6,DEVCHR(DEVDAT),5 ;DEVICE JOB ASSIGNMENT\r
+PUNIT: POINT 6,DEVCHR(DEVDAT),23 ;DEVICE UNIT NUMBER\r
+PJBSTS: POINT JWSIZ,JBTSTS(ITEM),JWPOS ;JOB WAIT STATE (QUEUE) CODE\r
+ ;IN JOB STATUS WORD\r
+PDVTIM: POINT 6,DEVCHR(DEVDAT),17 ;TIME IN SECONDS BEFORE DEVICE\r
+ ;IS SAID TO BE HUNG\r
+PDVCNT: POINT 6,DEVCHR(DEVDAT),11 ;COUNTED DOWN EACH SECOND,\r
+ ;1 TO 0 TRANSITION MEANS HUNG DEVICE\r
+IADPTR: POINT 2,DEVIAD(DEVDAT),2 ;COUNT OF NUMBER OF USER CHANNELS INITED\r
+ ; ON THIS DEVICE (DECTAPE ONLY)\r
+PCORSZ: POINT 8,JBTADR(ITEM),7 ;BYTE POINTER TO LOW OR HIGH SEG CORE SIZE-1\r
+\r
+COREP: POINT 1,CORTAB ;1 BIT POINTER TO CORE ALLOCATION TABLE\r
+\r
+ IFG SYS50N, < ;SWAPPING SYSTEM ?\r
+ INTERN IMGIN,IMGOUT,IMGINT,OUTMSK,INMSK,INLEFT\r
+ INMSK=000377 ;RH MASK TO IMGIN\r
+ INLEFT=12 ;NUMBER OF BITS TO SHIFT TO LEFT JUSTIFY IN RH\r
+\r
+IMGIN: POINT 8,JBTSWP(ITEM),35 ;BYTE POINTER FOR # 1K BLOCKS OF CORE\r
+ ;WHEN JOB OR HIGH SEG NEXT SWAPPED IN\r
+ ;NON-ZERO ONLY WHEN SWAPPED OUT\r
+IMGOUT: POINT 8,JBTSWP(ITEM),26 ;BYTE POINTER FOR # 1K BLOCK OF DISK\r
+ ;WHEN JOB OR HIGH SEG HAS IMAGE ON DISK\r
+ ;ZERO MEANS NO DISK SPACE ALLOCATED\r
+ OUTMSK=377000 ;RH MASK TO IMGOUT. USED TO TEST FOR 0\r
+ ; (IE NO DISK SPACE)\r
+IMGINT: POINT 8,JBTSWP(DEVDAT),35 ;POINTER TO INCORE IMAGE\r
+>\r
+\r
+\f;SPECIAL PROJECT-PROGRAMMER NUMBERS\r
+ IFG DSKN, < ;DISK SYSTEM?\r
+ INTERN CUSPPP,SYSPP,DUMPPP,HELPPP\r
+\r
+CUSPPP: ;CUSP FILE DIRECTORY, MAKE SEPARATE TAG FROM\r
+ ; MFD(SYSPP) \r
+SYSPP: XWD 1,1 ;THE MASTER FILE DIRECTORY PROJECT PROGRAMMER NO.\r
+DUMPPP: XWD 1,2 ;THE FAILSAFE PROJ,PROG NO (CAN READ OF WRITE ANYTHING)\r
+HELPPP: XWD 2,4 ;SYSTAT AND HELP PROJECT,PROGRAMMER NOS IF JOB NOT LOGGED IN ALREADY\r
+>\r
+\f;DEFINE PI CHANNEL SAVE AND RESTORE ROUTINES IF A DEVICE IS ON THE CHANNEL\r
+\r
+ HIGHAC==10 ;HIGHEST AC SAVE ON A PI INTERRUPT\r
+ PDL==25 ;LENGTH OF INTERRUPT PI PUSH DOWN LIST\r
+\r
+DEFINE CHAN (PI)<\r
+ XLIST\r
+ INTERN SAV'PI,RET'PI,CH'PI\r
+CH'PI: 0 ;PC STORED HERE BY JSR ON INTERRUPT TO CHANNEL PI\r
+ JEN @CH'PI ;LAST INSTRUCTION ON CONSO DEV, CHAIN\r
+\r
+;HERE FROM AN INTERRUPT ROUTINE WHICH HAS FOUND ITS DEVICE NEEDS SERVICE\r
+;SAVE ACS 0 THRU HIGHAC, CALLED BY JSR, SETS UP PDP TO PUSH DOWN LIST FOR THIS PI\r
+\r
+SAV'PI: 0 ;CALLED BY JSR\r
+ MOVEM HIGHAC,SAVAC'PI+HIGHAC ;SAVE AC HIGHAC\r
+ MOVEI HIGHAC,SAVAC'PI ;SETUP TO SAVE 0 THRU HIGHAC-1\r
+ BLT HIGHAC,SAVAC'PI+HIGHAC-1 ;SAVE ACS\r
+ MOVE PDP,SAVAC'PI+HIGHAC+1 ;SETUP PUSH DOWN POINTER\r
+ JRST @SAV'PI ;RETURN TO CALLER AND PROCESS INTERRUPT\r
+\r
+;HERE FROM INTERRUPT ROUTINE WHEN IT HAS FINISHED SERVICING INTERRUPT\r
+;RESTORE ACS AND DISMISS INTERRUPT\r
+;USUALLY TRANSFERRED TO BY POPJ PDP,\r
+\r
+RET'PI: MOVSI HIGHAC,SAVAC'PI ;RESTORE ACS 0 THRU HIGHAC\r
+ BLT HIGHAC,HIGHAC\r
+ JEN @CH'PI ;DISMISS INTERRUPT ON THIS PI CHANNEL\r
+\r
+SAVAC'PI: BLOCK HIGHAC+1 ;PLACE TO SAVE ACS 0 THRU HIGHAC\r
+ XWD -PDL+1,.+1 ;INITIAL PUSH DOWN POINTER\r
+CH'PI'PD1: EXP RET'PI ;FIRST WORD ON LIST,\r
+ ; POPJ WILL RETURN TO DISMISS INTERRUPT\r
+ BLOCK PDL-1 ;PUSHDOWN LIST SPACE\r
+ LIST\r
+>\r
+\r
+\f;GENERATE THE CHANNEL SAVE ROUTINE ONLY FOR PI WHICH NEED THEM (ASGSAV MACRO USED)\r
+\r
+ IFN USED1, <CHAN 1>\r
+ IFN USED2, <CHAN 2>\r
+ IFN USED3, <CHAN 3>\r
+ IFN USED4, <CHAN 4>\r
+ IFN USED5, <CHAN 5>\r
+ IFN USED6, <CHAN 6>\r
+ IFN USED7, <CHAN 7>\r
+\r
+\r
+\r
+;GENERATE NULL CHANNEL SAVE ROUTINES FOR THOSE CHANNELS NOT USED\r
+\r
+DEFINE NULL (PI)<\r
+ XLIST\r
+ INTERN CH'PI\r
+CH'PI: 0\r
+ JEN @CH'PI\r
+ LIST\r
+>\r
+\r
+ IFE USED1, <NULL 1>\r
+ IFE USED2, <NULL 2>\r
+ IFE USED3, <NULL 3>\r
+ IFE USED4, <NULL 4>\r
+ IFE USED5, <NULL 5>\r
+ IFE USED6, <NULL 6>\r
+ IFE USED7, <NULL 7>\r
+\f;HERE ON TRAPS TO LOC 60/61 - UNIMPLEMENTED INSTRUCTIONS (PDP-10 ONLY)\r
+;OPCODE AND EFFECTIVE ADDRESS STORED IN SIXTY AND 61 EXECUTED (JSR UUO2)\r
+;OP CODE 100 (UJEN) IS USED TO DISMISS USER MODE INTERRUPTS FOR REAL TIME OPERATION\r
+;USED IN CONJUNCTION WITH TRPSET UUOWHICH IS SOON TO BE REPLACED\r
+;WITH SOME KNAVE-PROOF REAL TIME UUOS. THIS CODE IS HERE ONLY\r
+;BECAUSE MANUAL DESCRIBES TRPSET AND TRPJEN UUOS.\r
+;TRPJEN HAS BEEN REPLACED WITH OPCODE 100 (UJEN).\r
+;CALL: UGEN U ;WHERE U CONTAINS PC STORED BY INTERRUPT JSR\r
+\r
+ INTERN UUO2\r
+\r
+UUO2: 0 ;USER PC STORE HERE BY JSR\r
+ EXCH TAC,UUO2 ;GET USER PC, SAVE TAC\r
+IFN FTTRPSET, <\r
+ TLNN TAC,UIOMOD ;USER I/O MODE ON ?\r
+ JRST UUOER2 ;NO, TREAT AS AN ILLEGAL INSTRUCTION AND PRINT MESS.\r
+ HLL TAC,SIXTY ;YES, GET UNIMPLEMENTED OPCODE WHICH TRAPPED\r
+ TLNE TAC,677777 ;IS IT OPCODE 100 (UJEN)?\r
+ JRST UUOER1 ;NO, TREAT AS ILLEGAL INSTRUCTION\r
+ MOVE TAC,SIXTY ;YES, GET EFFECTIVE ADDRESS\r
+ ADD TAC,JOBADR ;ADD RELOCATION FOR CURRENT JOB\r
+ MOVE TAC,(TAC) ;GET PC STORED BY INTERRUPT JSR\r
+ EXCH TAC,UUO2 ;RESTORE TAC, AND STORE PC\r
+ JEN @UUO2 ;DISMISS INTERRUPT\r
+\r
+UUOER1: HRLI TAC,USRMOD!UIOMOD ;SET USER MODE AND USER I/O MODE BACK ON\r
+>\r
+UUOER2: MOVEM TAC,UUO0 ;STORE PC AS IF AN ILLEGAL INSTR. HAD OCCURRED\r
+ SETOM FORTY ;MAKE IT LOOK LIKE AN ILLEGAL INSTRUCTION\r
+ ; TRAPPED TO 40\r
+ SKIPA TAC,UUO2 ;RETORE TAC AND FALL INTO REGULAR UUO HANDLER\r
+\f;HERE ON TRAPS TO EXEC LOC 40/41 - OPCODES 0,40-77 (0-77 ON PDP-6)\r
+\r
+ INTERN UUO0\r
+ EXTERN UUOUSR,UUOSY1,ERROR\r
+\r
+UUO0: 0 ;JSR HERE FROM LOC 41\r
+ MOVEM 17,USRSAV ;SAVE 17\r
+ MOVE 17,UUO0 ;GET PROCESSOR FLAGS\r
+ TLNN 17,USRMOD ;IS UUO FROM MONITOR ?\r
+ JRST UUOSY1 ;YES, DO NOT SAVE ACS\r
+ SKIPN 17,JOBADR ;IS THERE A JOB DATA AREA ?\r
+ JSP DAT,ERROR ;NO, MUST BE UUO DURING NULL JOB\r
+ ; PRINT ERROR IN MONITOR\r
+IFE PDP10N, < ;FOR PDP-6 OPCODES 1-37\r
+ EXCH TAC,FORTY ;SAVE TAC, PICK UP UUO\r
+ TLNN TAC,740000 ;IS THIS SYSTEM UUO ?\r
+ TLNN TAC,077000 ;NO, IS IT 0 UUO ?\r
+ JRST UUOSYS ;YES\r
+ MOVEM TAC,40(17) ;STORE UUO IN USER'S 40\r
+ HRRZ TAC,41(17) ;PICK UP ADR OF USER'S JSR\r
+ JUMPE TAC,UUOSY2 ;IF ADDRESS=0,ILLEGAL USER UUO****UWA PATCH\r
+ HLL TAC,UUO0 ;USER PD FLAGS (RESTORED ON RETURN)\r
+ MOVEI 17,(TAC) ;17 NOW HAS REL.ADR+1 OF USER JSR\r
+ CAML 17,USRREL ;IS EFFECTIVE ADDRESS IN BOUNDS ?\r
+ JRST UUOSY0 ;ERROR, JSR EFF. ADDR. OUTSIDE USER AREA\r
+ HRRI TAC,1(TAC) ;YES, INCREMENT PC.\r
+ EXCH TAC,UUO0 ;SET UP RETURN TO USER IN UUO0\r
+ ; PICKUP USERS FLAGS,PC\r
+ ADD 17,JOBADR ;MAKE REL. ADDRESS INTO ABSOLUTE ADDRESS\r
+ MOVEM TAC,(17) ;STORE FLAGS AND PC LIKE JSR\r
+ MOVE TAC,FORTY ;RESTORE TAC\r
+ MOVE 17,USRSAV ;RESTORE 17\r
+ JRST 2,@UUO0 ;RETURN TO USER (RESTORING FLAGS)\r
+\r
+UUOSY0: MOVE 17,JOBADR ;SETUP 17 FOR LOW SEGMENT RELOCATION\r
+UUOSY2: EXCH TAC,FORTY ;RESTORE USERS AC(TAC) AND USER'S UUO (FORTY)\r
+> \r
+ JRST UUOUSR ;GO SAVE USER'S ACS IN REL. LOCATION 0-17\r
+ ; AND DISPATCH ON UUO\r
+\f;GENERATE EXTERNAL GLOBALS TO CAUSE LOADING OF PROPER ROUTINES FROM MONITOR LIBRARY TAPE\r
+;IF THERE IS ONE\r
+\r
+\r
+;ALWAYS LOAD CLOCK1,COMCON,CORE1,ERRCON,JOBDAT,ONCE,PATCH,SYSMAK,UUOCON\r
+\r
+EXTERNAL CLOCK1,COMCON,CORE1,ERRCON,DATJOB,ONCE,PATCH,SYSMAK,UUOCON\r
+\r
+;LOAD DDT\r
+ IFG DDTN, <EXTERN DDTX>\r
+ IFE DDTN, <XP DDTEND,0 ;ONCE REFERENCES END OF DDT>\r
+\r
+;LOAD SCHEDULER FOR NON-SWAPPING OR SWAPPING SYSTEM\r
+ IFG SYS40N,<EXTERN XCKCSS> ;CLKCSS\r
+ IFG SYS50N,<EXTERN XCKCSW> ;SCHED\r
+\r
+;LOAD EITHER SEGCON (2REG SOFTWARE) OR NULSEG (1 REG SOFTWARE)\r
+; UNLESS USER HAS EDITTED S WITH FT2REL=0 SO ALL PUSHJ'S\r
+; TO SEGCON (NULSEG) ARE REMOVED\r
+\r
+IFN FT2REL, <\r
+ IFG KT10AN, <EXTERN SEGCON>\r
+\r
+ IFE KT10AN, <EXTERN NULSEG>\r
+>\r
+\r
+\r
+;APR AND PI BITS\r
+ INTERN PION,PIOFF,REQCLK,PICLK,APRCLR,APRCLE,APRNUL,APRRST,NXM,APRFOV\r
+\r
+ CLKBIT==1\r
+ REPEAT 7-CLKCHN, <CLKBIT==CLKBIT*2>\r
+ PION==200 ;CONO PI,PION TURNS PI SYSTEM ON\r
+ PIOFF==400 ;TURN IT OFF\r
+ REQCLK==1B24+CLKBIT ;REQUEST INTERRUPT ON LOW PRIORITY CLK CHANNEL\r
+ PICLK=PION+REQCLK ;TURN ON PI,REQUEST INTERRUPT ON CLK CHANNEL\r
+ APRCLR==1000+APRCHN ;TURN APR CLOCK FLAG OFF\r
+ APRCLE==431550+APRCHN ;CLEAR ALL APR ERROR BITS\r
+ ; AND DISABLE FOV AND AR OVF\r
+ APRNUL==433550+APRCHN ;RESET APR FOR NULL JOB\r
+ ; CLEAR EVERYTHING BUT DON'T I/O RESET\r
+ APRRST==APRNUL+200000 ;RESET APR FOR SYSINI (I/O RESET TOO)\r
+ NXM==10000 ;NON-EX MEM (APR STATUS WORD)\r
+ IFG PDP10N,<APRFOV==100 ;FLOADTING OVERFLOW CAN BE ENABLED ON PDP10\r
+ ; FOR USER TRAPPING>\r
+ IFE PDP10N,<APRFOV==000 ;PC CHANGE CANNOT BE ENABLED ON PDP-6, BEACUSE\r
+ ; IT MAKES MONITOR TRAP ALSO>\r
+\r
+;MAKE SURE THAT PROPER VERSION OF FEATURE SWITCH FILES WERE USED TO ASSEMBLE\r
+;THE REST OF THE MONITOR\r
+;THE LOADER WILL PRINT NUL. DEF. GLOBAL IF A MISTAKE HAS BEEN MADE\r
+ XP FTDISK,-DSKN\r
+ XP FTSWAP,-SYS50N\r
+ XP FTRC10,-RD10N\r
+\r
+ IFG KT10AN,<XP FT2REL,-1> ;IF Z RELOC SOFTWARE, THEN FTZREI MUST BE -1\r
+ IFE COREN,<COREN=^D256 ;NO RESTRICTION IF 0 TYPED>\r
+ XP USRLIM,COREN ;DEFINE GLOBAL RESTRICTING SIZE OF CRE FOR ANY SINGLE USER\r
+ ; ONCE ONLY CODE CAN ALTER THIS VALUE\r
+ ; (PATCH RH CORLIM IN SYSIM)\r
+\f;SCANNER ENTRY POINTS AND BIT DEFINITIONS\r
+\r
+ IFG DLSN, <EXTERN DLSINT> ;DATA LINE SCANNER\r
+ IFG CCIN, <EXTERN CCIINT> ;DA-10 PDP-8 680\r
+ IFG DCSN, <EXTERN DCSINT> ;630 DATA COMMUNICATIONS SYS\r
+\r
+ IFG FULLN, <EXTERN SCNSRF> ;FULL DUPLEX SOFTWARE ENTRY POINT\r
+ IFE FULLN, <EXTERN SCNSRH> ;HALF DUPLEX SOFTWARE ENTRY POINT\r
+\r
+ IFG FULLN, <\r
+ INTERN LINTAB\r
+\r
+LINTAB: ;LINE CHARACTERISTICS BITS (NOT CLEARED ON SYSTEM STARTUP)\r
+\r
+;TELETYPE LINE CHARACTERISTICS (LH OF LINTAB)\r
+;USED IN SCNSRF ALSO\r
+\r
+ XP PTYLIN,400000 ;PSEUDO TTY LINE\r
+ XP CTYLIN,200000 ;CONSOLE TTY\r
+ XP DISLIN,100000 ;KEYBOARD DISPLAY\r
+ XP DSDTLN, 40000 ;DATASET DATA LINE\r
+ XP DSCTLN, 20000 ;DATASET CONTROL LINE(DC10E)\r
+ XP HLFDPX, 10000 ;HALF DUPLEX LINE\r
+ XP TTYRMT, 4000 ;REMOTE TTY\r
+ XP T35, 10 ;TTY HAS HARDWARE TABS\r
+ XP FULTWX, 4 ;SELF-ECHOING LINE\r
+ ;USED IN CCIINT,DCSINT,DLSINT & SCNSRF\r
+\r
+IFG EDITN,< ;HAS COMMON.MAC BEEN EDITED TO DEFINE TTY LINE CHAR.\r
+ ; SO MONGEN TYPE-IN REDUCED?\r
+;IF NO APR NUMBER, AND THIS IS NOT EDITED FOR THE CUSTOMER,\r
+; MAKE ALL LIENS JUST BE MODEL 33 TELETYPES\r
+\r
+IFE APRN,<REPEAT TTPLEN,<0>>\r
+\r
+IFE APRSN-2,<\r
+;FOLLOWING LINE DEFINITIONS FOR DEC PDP12 #2\r
+\r
+ XWD T35,0 ;TTY0\r
+ XWD T35,0 ;TTY1\r
+ XWD T35,0 ;TTY2\r
+ XWD 0,0 ;TTY3\r
+REPEAT 3,< XWD T35,0>;TTY4-6\r
+ XWD T35+TTYRMT,0 ;TTY7 - REMOTE 35\r
+ XWD DSDTLN,0 ;TTY10\r
+ XWD DSDTLN+HLFDPX,0 ;TTY11\r
+ XWD DSDTLN,0 ;TTY12\r
+REPEAT 4,< XWD T35,0>;TTY13-16\r
+REPEAT 8,<XWD TTYRMT,0>\r
+>\r
+\r
+IFE APRSN-^D40,<\r
+;THIS CONFIGURATION FOR DEC SYSTEM NUMBER 40\r
+\r
+REPEAT ^D8,<0 ;MODEL 33'S LOCALLY>\r
+\r
+REPEAT ^D8,< XWD DSDTLN,0 ;DATASET>\r
+>\r
+\r
+; CTY AND PTY SET BY SCNSER\r
+> ;END PRE-EDITED LINE CHARACTERISTICS\r
+\f\r
+\r
+IFE EDITN,< ;MONGEN DIALOG DEFINE TTY CONFIG?\r
+\r
+DEFINE GENLIN(LIN)<\r
+ IFNDEF DSD'LIN,<DSD'LIN=0> ;DATA SET?\r
+ IFNDEF TAB'LIN,<TAB'LIN=0> ;HARDWARE TABS?\r
+ IFNDEF RMT'LIN,<RMT'LIN=0> ;REMOTE?\r
+ IFNDEF HLF'LIN,<HLF'LIN=0> ;HALF DUPLEX SCANNER?\r
+ XWD DSD'LIN*TAB'LIN*T35+RMT'LIN*TTYRMT+HLF'LIN*HLFDPX,0\r
+>\r
+\r
+REPEAT HGHLIN+1,<LINE=.-LINTAB ;DEFINE LINE NUMBER\r
+ GENLIN \LIN>\r
+>\r
+ LOC LINTAB+TTPLEN ;MAKE SURE ENOUGH SPACE FOR CTY+PTY;S\r
+\r
+> ;END OF FULL DUPLEX CONDITIONAL\r
+\r
+ INTERN FSNCHN,SCNON,SCNOFF\r
+\r
+ FSNCHN==SCNCHN*101 ;CHANNEL ASSIGNMENT FOR FULL DUPLEX SCN.\r
+ SCNBIT==<1_<7-SCNCHN>>\r
+ SCNON==2000+SCNBIT ;CONO PI, TURNS SCANNER PI CHANNEL ON\r
+ SCNOFF==1000+SCNBIT ;CONO PI, TURNS SCANNER PI CHANNEL OFF\r
+ IFG TABSN, <TTMODL=-1> ;HARDWARD TABS\r
+ IFE TABSN, <TTMODL=0>\r
+XP SCNNUM,HGHLIN+1 ;# OF SCANNER LINES (USED BY ONCE FOR PRINTING CONFIG)\r
+\f;MAGTAPE ENTRY POINT AND BIT DEFINITIONS\r
+\r
+ IFG MTAN, <EXTERN MTASRX> ;TM10 ENTRY POINT\r
+ IFG MTCN, <EXTERN MTCSR6> ;PDP-6 MAGTAPES ENTRY POINT\r
+\r
+ IFG MTAN, <\r
+\r
+ INTERN MMTSIZ,MTALOC,MTLOC1,MTBOTH,MTFLAG\r
+\r
+ MMTSIZ==-MTSIZ\r
+ MTALOC==40+2*MTDCHN ;BLKI/BLKO LOCATION\r
+ MTLOC1==MTALOC+1 ;NEXT LOCATION\r
+ MTBOTH==MTACHN*10+MTDCHN ;BOTH PI CHANNELS\r
+ MTFLAG==400+MTACHN*10\r
+>\r
+\r
+ IFG MTCN, <\r
+\r
+ INTERN DCLOC,DCLOC1,DCON,DCOFF,DCIN,DCOUT\r
+\r
+ DCLOC==40+2*DCTCHN ;EVEN DC PI CHANNEL LOCATION\r
+ DCLOC1==DCLOC+1 ;NEXT LOCATION\r
+ DCBIT==1\r
+ REPEAT 7-DCTCHN, <DCBIT==DCBIT*2>\r
+ DCON==2000+DCBIT ;TURN DC PI CHANNEL ON\r
+ DCOFF==1000+DCBIT ;TURN DC PI CHANNEL OFF\r
+ DCIN=4010+DCTCHN ;SET DATA CHANNEL FOR INPUT\r
+ DCOUT==3410+DCTCHN ;SET DATA CHANNEL FOR OUTPUT\r
+>\r
+\f\r
+;DECTAPE ENTRY POINT AND BIT DEFINITIONS\r
+\r
+ SAVN==1 ;WE ONLY SUPPORT NEW FORMAT NOW\r
+ ;MONGEN NO LONGER ASKS QUESTION,\r
+\r
+ IFG DTAN, <EXTERN DTASRN> ;TD10 WITH NEW FORMAT\r
+ IFG DTCN, <\r
+ IFG SAVN, <EXTERN DTCSRN> ;556 WITH NEW FORMAT\r
+ IFE SAVN, <EXTERN DTCSRO> ;556 WITH OLD FORMAT\r
+>\r
+ IFG DTAN, < ;DEFINE SYMBOLS IF PDP-10 DECTAPES (TD10)\r
+ INTERNAL DTALOC,DTALC2,DTBOTH,DTTURN\r
+ DTALOC==40+2*DTDCHN ;BLKI/BLKO LOCATION\r
+ DTALC2==DTALOC+1 ;NEXT LOCATION\r
+ DTBOTH==DTDCHN*10+DTACHN\r
+ DTTURN==300200+DTBOTH\r
+>\r
+ IFG DTCN, < ;DEFINE SYMBOLS IF PDP-6 DECTAPES (556)\r
+ INTERNAL DCLOC,DCLOC1,DCON,DCOFF,DCIN,DCOUT\r
+ DCLOC==40+2*DCTCHN ;EVEN DC PI CHANNEL LOC\r
+ DCLOC1==DCLOC+1 ;NEXT LOCATION\r
+ DCBIT==1\r
+ REPEAT 7-DCTCHN, <DCBIT==DCBIT*2>\r
+ DCON==2000+DCBIT ;TURN DC PI CHANNEL ON\r
+ DCOFF==1000+DCBIT ;TURN DC PI CHANNEL OFF\r
+ DCIN==4010+DCTCHN ;SET DATA CHANNEL FOR INPUT\r
+ DCOUT==3410+DCTCHN ;SET DATA CHANNEL FOR OUTPUT\r
+>\r
+\r
+;DEFINE SAVE MODE AND EXTENSION FOR OLD OR NEW FORMAT\r
+\r
+ INTERNAL SAVDMP\r
+ IFE SAVN, <XP SAVMOD,17\r
+ SAVDMP==<SIXBIT / DMP/> ;EXTENSION FOR SAVED FILES == "DMP"\r
+>\r
+ IFN SAVN, <\r
+ SAVDMP==<SIXBIT / SAV/> ;EXTENSION FOR SAVED FILES == "SAV"\r
+>\r
+\f;DISPLAY AND LITE PEN\r
+\r
+ IFG DISN,<\r
+ IFG T340N,<EXTERN DIS340> ;TYPE 340 ENTRY POINT\r
+ IFE T340N,<EXTERN DIST30> ;TYPE 30 ENTRY POINT\r
+ INTERN DISBLK,DISJSR,OFFDIS,DISPON,DISPOF\r
+ DISBLK==40+2*DISCHN ;BLKI/BLKO LOCATION\r
+ DISJSR==DISBLK+1\r
+ ONDIS==100+10*PENCHN+DISCHN\r
+ NONDIS==10*PENCHN+DISCHN\r
+ OFFDIS==0\r
+ DISBIT==1\r
+ REPEAT 7-DISCHN, <DISBIT==DISBIT*2>\r
+ DISPON==2000+DISBIT ;CONO PI, TURNS DIS PI CHANNEL ON\r
+ DISPOF==1000+DISBIT ;CONO PI, TURNS DIS PI CHANNEL OFF\r
+>\r
+\f;LINE PRINTER ENTRY POINT AND DDB DEFINITIONS\r
+\r
+ IFG LPTN, <\r
+\r
+;PROTOTYPE DEFINITION FOR LINE PRINTER DEVICE DATA BLOCKS\r
+\r
+DEFINE LPTDDB (N) <\r
+\r
+ XLIST ;TURN OFF LISTING DURING EXPANSION\r
+\r
+LP'N'SV1=LP'N'SAC+DEVDAT ;DEFINE DEVDAT SAVE LOCATION\r
+\r
+LP'N'INT: CONSO LP'N,0 ;(-4) SKIP IF INTERRUPT FOR THIS LPT\r
+ JRST .-1 ;(-3) GO TO NEXT SKIP CHAIN ELEMENT\r
+ MOVEM DEVDAT,LP'N'SV1 ;(-2) SAVE DEVDAT IN CHANNEL SAVE AREA\r
+ JSP DEVDAT,LPTINT ;(-1) SET UP DDB ADDRESS AND BRANCH\r
+LP'N'DDB:\r
+LP'N'NAM: \r
+ \r
+ IFE LPTN-1, < SIXBIT /LPT/ ;( 0) PHYSICAL DEVICE NAME>\r
+ IFN LPTN-1, < SIXBIT /LPT'N/ ;( 0) PHYSICAL DEVICE NAME>\r
+ XWD ^D60*HUNGST,<N>B23+LPTSIZ ;( 1) DEVICE CHARACTERISTICS\r
+ 0 ;( 2) DEVICE I/O STATUS\r
+ XWD 0,LPTDSP ;( 3) LH=DDB LINK, RH=DSP TABLE ADDR.\r
+LPTMOD==1_A+1_AL+1_I ;LPT LEGAL MODES\r
+ XWD DVOUT+DVLPT,LPTMOD ;( 4) DEVICE CHARACTERISTICS\r
+ 0 ;( 5) LOGICAL DEVICE NAME\r
+ 0 ;( 6) BUFFER HEADER ADDRESSES\r
+LP'N'PTR: 0 ;( 7) BLOCK OUTPUT POINTER\r
+ XWD PROG,0 ;(10) CURRENT OUTPUT BUFFER ADDRESS\r
+ EXP 11*LP'N'CHN ;(11) INTERRUPT CHANNEL ASSIGNMENTS\r
+\r
+ MOVE DEVDAT,LP'N'SV1 ;(12) RESTORE DEVDAT, SAVE AC'S\r
+ JSR LP'N'SAV ;(13) AND ESTABLISH PDP\r
+ MOVEI DEVDAT,LP'N'NAM ;(14) SET UP DDB ADDRESS AND RETURN\r
+ JRST LPTNXT ;(15) TO COMMON INTERRUPT HANDLER\r
+\r
+ MOVE DEVDAT,LP'N'SV1 ;(16) RESTORE DEVDAT AND\r
+ JEN @LP'N'CHL ;(17) DISMISS INTERRUPT\r
+ 0 ;(20) SAVE LOCATION FOR DAT\r
+ CONSZ LP'N,LPTECM ;(21) THE REST OF THE DDB CONTAINS\r
+ CONSO LP'N,LPTDON ;(22) THE ACTUAL I/O INSTRUCTIONS\r
+ CONSO LP'N,(DAT) ;(23) USED BY THE COMMON SERVICE\r
+ CONSZ LP'N,(DAT) ;(24) ROUTINE TO CONTROL A LINE\r
+ CONI LP'N,DAT ;(25) PRINTER. THEY ARE EXECUTED\r
+ CONO LP'N,(DAT) ;(26) BY MEANS OF AN XCT INSTRUCTION\r
+ DATAO LP'N,(DAT) ;(27) INDEXED TO THE PROPER DDB\r
+ BLKO LP'N,LP'N'PTR ;(30)\r
+\r
+ LIST ;TURN LISTING BACK ON AFTER EXPANSION\r
+\f\r
+>\r
+ EXTERN LPTSER, LPTNXT, LPTECM, LPTDON, LPTINT, LPTDSP\r
+\r
+ LPT2=234 ;DEVICE SELECT CODE FOR SECOND LPT\r
+\r
+ IFNDEF LP0, <LP0=LPT> ;DEFINE STANDARD MNEMONIC DEFINITIONS\r
+ IFNDEF LP1, <LP1=LPT2> ; BUT ALLOW FOR OVERRIDE\r
+\r
+ $LPNUM=0 ;TEMPORARY SYMBOL USED TO FACILITATE\r
+ ; MACRO GENERATION\r
+\r
+\r
+ REPEAT LPTN, <\r
+\r
+ LPTDDB \$LPNUM\r
+ $LPNUM=$LPNUM+1\r
+ >\r
+\r
+>\r
+\r
+\f;CARD READER ENTRY POINT AND BITS\r
+\r
+ IFG CDRN, <\r
+ IFG CR10N, <EXTERN CDRSRX> ;CR10 ENTRY POINT\r
+ IFE CR10N, <EXTERN CDRSR6> ;PDP-6 CARD READER\r
+ INTERNAL CDRBTS\r
+ CDRBTS==1670+CDRCHN\r
+>\r
+\r
+\r
+;CARD PUNCH ENTRY POINT\r
+\r
+ IFG CDPN, <\r
+ EXTERN CDPSER ;ENTRY POINT\r
+ >\r
+\f;PLOTTER ENTRY POINT\r
+\r
+ IFG PLTN,<EXTERN PLTSER>\r
+\r
+;PAPER TAPE READER ENTRY POINT AND MASK\r
+\r
+ IFG PTRN, <EXTERN PTRSER ;SAME ROUTINE FOR PDP-6 AND PDP-10 READER\r
+ INTERN PTRMSK\r
+ IFG PDP10N, <PTRMSK==0> ;MASK==0 IF PDP-10 READER\r
+ IFE PDP10N, <PTRMSK==777777> ;MASK==777777 FOR PDP-6 READER\r
+>\r
+\r
+\r
+;PAPER TAPE PUNCH ENTRY POINT\r
+\r
+ IFG PTPN,<EXTERN PTPSER>\r
+\f;DISK ENTRY POINTS AND BITS\r
+\r
+\r
+ IFG DSKN,<\r
+ INTERN DSKBIT,DCBBIT,DSKON,DSKOFF\r
+ DCBBIT==0 ;0 UNLESS DATA PRODUCTS DISK(SEE BELOW)\r
+ DSKBIT==1 ;LOW PRIORITY DISK PI CHANNEL\r
+ REPEAT 7-DSKCHN,<DSKBIT==DSKBIT*2>\r
+ DSKON==2000+DSKBIT ;CONO PI, TURN DISK CHANNEL ON\r
+ DSKOFF=1000+DSKBIT ;CONO PI, TURN DISKCHANNEL OFF\r
+ IFG RD10N,< ;BURROUGHS DISK\r
+ EXTERN RCXINT,DSKSRB,RCXWNZ ;LOAD EARLIER VERSION\r
+ ; DSKINT,DSKSRB,ONCEB\r
+ IFG SYS50N,<EXTERN RCXSKD> ;LOAD EARLIER VERSION OF SCHEDB\r
+ >\r
+ IFG DPDN,< ;IF DATA PRODUCTS DISK\r
+ EXTERNAL LODINT ;LOAD DPDINT\r
+ EXTERNAL DSKSRD ;LOAD ONCE=DSKSR FOR DATA PROD DISK\r
+\r
+ INTERN DCBBIT,DSKX8,DSKX9\r
+ DCBBIT==1\r
+ REPEAT 7-DCBCHN,<DCBBIT==DCBBIT*2>\r
+ DSKX8==40+2*DCBCHN ;DATA-CONTROL BLKI/BLKO OCS\r
+ DSKX9==DSKX8+1\r
+ >\r
+ IFG RA10N,< ;IF BRYANT DISK\r
+ EXTERN MDFINT,DSKSER,MDFWNZ\r
+ IFG SYS50N,<EXTERN RCXSKD>\r
+ >\r
+>\r
+\r
+;PSEUDO TTY ENTRY POINT\r
+\r
+ IFE PTYN, <INTERN PTYPE,PTMNMZ,PTYOW,PTMNMD\r
+PTYPE:PTMNMZ:PTYOW:PTMNMD: HALT CPOPJ ;HALT IF SCNSER CALL PTY ROUTINES\r
+ ; BECAUSE NONE LOADED\r
+>\r
+ IFG PTYN, <\r
+ IFE FULLN,<EXTERN PTYSRH> ;HALF DUPLEX SCANNER SOFTWARE\r
+ IFG FULLN,<EXTERN PTYSRF> ;FULL DUPLEX SCANNER SOFTWARE\r
+>\r
+ LIT\r
+ RELOC .-COMORG ;NOW MAKE RELOCATABLE SO NEXT PROGRAM WILL BE LOADED\r
+ ; IMMEDIATELY AFTER THIS ONE\r
+\r
+COMEND: END\r
+\r
--- /dev/null
+CLOCK1,CLOCK1/C_S,FT40N,CLOCK1/N\r
+CLKCSS,CLKCSS/C_S,FT50SB,CLKCSS/N\r
+COMCON,COMCON/C_S,FT50SB,COMCON/N\r
+COMMON,COMMON/C_S,CONFIG,COMMON/N\r
+CORE1,CORE1/C_S,FT50SB,CORE1/N\r
+DIS340,DIS340/C_S,DISSER/N\r
+DIS34,DIS30/C_S,DIST30,DISSER/N\r
+DCSINT,DCSINT/C_S,DCSINT/N\r
+DLSINT,DLSINT/C_S,DLSINT/N\r
+DPDINT,DPDINT/C_S,DPDINT/N\r
+DSKINT,DSKINT/C_S,DSKINT/N\r
+DSKSER,DSKSER/C_S,FT50SB,DSKSER/N\r
+DTCSRN,DTCSRN/C_S,FT50SB,DTCSRN/N\r
+DTASRN,DTASRN/C_S,FT50SB,DTASRN/N\r
+EDDT,EDDT/C_EDDT/N\r
+ERRCON,ERRCON/C_S,ERRCON/N\r
+JOBDAT,JOBDAT/C_JOBDAT/N\r
+LPTSER,LPTSER/C_S,LPTSER/N\r
+MTCSR6,MTCSR6/C_S,MTCSR6/N\r
+MTASRX,MTASRX/C_S,MTASRX/N\r
+NULSEG,NULSEG/C_S,FT50SB,NULSEG/N\r
+PLTSER,PLTSER/C_S,PLTSER/N\r
+PTRSER,PTRSER/C_S,PTRSER/N\r
+PTPSER,PTPSER/C_S,PTPSER/N\r
+PTYSRF,PTYSRF/C_S,PTYSRF/N\r
+PTYSRH,PTYSRH/C_S,PTYSRH/N\r
+PATCH,PATCH/C_PATCH/N\r
+ONCEB,ONCEB/C_S,FT50SB,ONCEB/N\r
+SCNSRF,SCNSRF/C_S,FT50SB,SCNSRF/N\r
+SCHEDB,SCHEDB/C_S,FT50SB,SCHEDB/N\r
+UUOCON,UUOCON/C_S,FT50SB,UUOCON/N\r
--- /dev/null
+SUBTTL CONFIG - CONFIGURATION DEFINITION FILE OUTPUT BY MONGEN DIALOG\r
+\r
+\r
+;ANSWER THE FOLLOWING QUESTIONS WITH Y OR N OR A DECIMAL NUMBER\r
+\r
+;SHORT DIALOG?[N = LONGER QUESTIONS]\r
+;Y\r
+\r
+\r
+;10/30 SYSTEM TO BE BUILT?[N = 10/40 OR 10/50 SYSTEM]\r
+;N\r
+\r
+\r
+;10/40 SYSTEM TO BE BUILT?[N = ASSUME 10/50 SYSTEM]\r
+;N\r
+\r
+XP SYS40N,0\r
+XP SYS50N,1\r
+XP DSKN,1\r
+XP LOGINN,1\r
+\r
+;RD10 (BURROUGHS) DISK?[ONE DISK TYPE FOR FILES,\r
+;SAME TYPE FOR SWAPPING OR ONE OTHER TYPE FOR SWAPPING]\r
+;Y\r
+\r
+XP RD10N,1\r
+\r
+;RD10 FOR SWAPPING?[N = CAN SWAP ON SOME OTHER TYPE]\r
+;Y\r
+\r
+XP RDSWPN,1\r
+\r
+;RP10 (MEMOREX) DISK PACKS?\r
+;N\r
+\r
+XP RP10N,0\r
+XP RPSWPN,0\r
+\r
+;RA10 (BRYANT) DISK?\r
+;N\r
+\r
+XP RA10N,0\r
+XP RASWPN,0\r
+\r
+;DPD (DATA PRODUCTS) DISK?\r
+;N\r
+\r
+XP DPDN,0\r
+XP DPSWPN,0\r
+\r
+;HOMW MANY JOBS?[ATTACHED AND DETACHED, COUNTING NULL JOB]\r
+;28\r
+XP JOBN,34\r
+\r
+;MAX SIZE OF CORE (IN K) FOR ANY SINGLE USER?\r
+;0 MEANS ALL OF CORE\r
+;0\r
+XP COREN,0\r
+\r
+;PDP-10 PROCESSORE?[N = PDP-6]\r
+;Y\r
+\r
+XP PDP10N,1\r
+\r
+;2 RELOCATION REG, SOFTWARE?[Y = MUST HAVE KT10A,\r
+;N = JUST 1 RELOC. REG.]\r
+;Y\r
+\r
+XP KT10AN,1\r
+\r
+\r
+;HOW MANY MORE SEGMENTS THAN JOBS?[0 UNLESS YOU\r
+;ANTICIPATE A LOT OF DORMANT SEGMENTS]\r
+;0\r
+XP SEGN,0\r
+\r
+;LOAD EXEC DDT?[N = ONLY IF LOADER HAS RUN OUT OF CORE BEFORE]\r
+;Y\r
+\r
+XP DDTN,1\r
+\r
+;LOAD LOCAL SYMBOLS?[N = ONLY IF LOADER HAS RUN OUT OF ROOM BEFORE]\r
+;Y\r
+\r
+\r
+;LOAD USER DDT?[BOTH CAN BE LOADED TOGETHER,\r
+;USE USER DDT FOR PATCHING UNDER TIME SHARING]\r
+;Y\r
+\r
+XP UDDTN,1\r
+\r
+;NAME OF THIS SYSTEM (24 CHARS OR LESS)?\r
+DEFINE SYSNAM\r
+< ASCIZ \4S47 DEC PDP-10 #2\>\r
+\r
+;WHAT IS THE SERIAL NUMBER OF YOUR ARITHMETIC PROCESSOR?\r
+;2\r
+XP APRSN,2\r
+\r
+\r
+;NAME OF SYSTEM DEVICE?[DTA0 USUAL FOR 10/40 SYSTEM,\r
+;DSK USUAL FOR 10/50 SYSTEM]\r
+DEFINE SYSDEV\r
+< SIXBIT "DSK">\r
+DEFINE SYSDAT\r
+< ASCIZ /6-3-69/>\r
+\r
+;DATA LINE SCANNER(DC10)?[N = WILL ASK FOR 680 OR 630]\r
+;Y\r
+\r
+XP DLSN,1\r
+XP CCIN,0\r
+XP DCSN,0\r
+\r
+;HIGHEST (OCTAL) LINE NUMBER?[USUALLY 7,17,27, ETC. FOR DC-10 OR 630\r
+;10, 20, 30 ETC. FOR 680 (TO ALLOW FOR PDP-8 CTY)]\r
+;27\r
+XP HGHLIN,27\r
+\r
+;FULL DUPLEX TTY SOFTWARE?[N = OLD HALF DUPLEX SOFTWARE]\r
+;Y\r
+\r
+XP FULLN,1\r
+XP TABSN,0\r
+\r
+;COMMON.MAC ALREADY EDITED FOR YOUR TTY CONFIGURATION?\r
+;[N = WILL ALLOW YOU TO DEFINE NOW]\r
+;Y\r
+\r
+XP EDITN,1\r
+\r
+;PT READER?\r
+;Y\r
+\r
+PTRN=1 ;NOT GLOBAL BECAUSE OF DSKSER USE\r
+\r
+;PT PUNCH?\r
+;Y\r
+\r
+XP PTPN,1\r
+\r
+;PLOTTER?\r
+;Y\r
+\r
+XP PLTN,1\r
+\r
+;HOW MANY LINE PRINTERS?\r
+;1\r
+XP LPTN,1\r
+\r
+;CARD READER?\r
+;Y\r
+\r
+\r
+;CR10?[Y = CR10A TOO, N IF PDP-6 CARD READER]\r
+;Y\r
+\r
+XP CDRN,1\r
+XP CR10N,1\r
+\r
+;CARD PUNCH\r
+;N\r
+\r
+XP CDPN,0\r
+\r
+;DISPLAY?\r
+;N\r
+\r
+XP DISN,0\r
+XP PENN,0\r
+XP T340N,0\r
+\r
+;HOW MANY DECTAPES?\r
+;8\r
+\r
+;TD10 DECTAPE CONTROL?[N = PDP-6 DECTAPE]\r
+;Y\r
+XP DTAN,10\r
+XP DTCN,0\r
+\r
+;HOW MANY MAGTAPES?\r
+;3\r
+\r
+;TM-10A CONTROL?[N = WILL ASK TM-10B, THEN PDP-6 MAGTAPES]\r
+;Y\r
+\r
+XP MTAN,3\r
+XP MTBN,0\r
+XP MTCN,0\r
+\r
+;HOW MANY PSEUDO-TTY'S?[EACH CONCURRENT BATCH NEEDS ONE]\r
+;2\r
+XP PTYN,2\r
+;TYPE "SYMBOL,VALUE" (VALUE IN DECIMAL)[FOR ANY SYMBOLS\r
+;TO BE DEFINED. TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]\r
+RADIX 10\r
+\r
+RADIX 8\r
+;TYPE "DEVICE-MNEMONIC,CHANNEL"FOR SPECIAL DEVICES\r
+;[WITH NEITHER CHANNEL SAVE ROUTINE NOR DEVICE DATA BLOCK.\r
+;"DEVICE" MUST BE 5 CHARCATERS OR LESS,\r
+;TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]\r
+DEFINE SPCINT\r
+<\r
+>;TYPE "DEVICE-MNEMNIC,CHANNEL,NO.-OF-DEVICES"\r
+;[FOR SPECIAL DEVICE WITH CHANNEL SAVE ROUTINES AND DEVICE DATA BLOCKS\r
+;"DEVICE" MUST BE 5 CHARS. OR LESS.\r
+;TYPE EXTRA CARRIAGE RETUERN WHEN THROUGH.]\r
+DEFINE SPCSAV\r
+<\r
+>;MONGEN FINISHED\r
+;NEXT YOU MUST ASSEMBLE COMMON WITH MACRO\r
+;THEN LOAD IT AND REST OF MONITOR WITH LOADER\r
+;AND FINALLY SAVE IT WITH MONITOR COMMAND SAVE\r
+\r
+;[TO ASSEMBLE COMMON, TYPE\r
+;R MACRO\r
+;DSK:COMMON,LPT:_DSK:S,CONFIG,COMMON\r
+;TO LOAD NEW MONITOR, TYPE\r
+;R LOADER\r
+;/S\r
+;DSK:COMMON,DSK:SYS50/L\r
+;LPT:_/W/D/A/M/P/G\r
+;TO SAVE MONITOR, TYPE\r
+;SAVE DSK MONITOR\r
+;]\r
+; ;END OF CONFIGURATION DEFINITION\r
--- /dev/null
+TITLE CORE1 - LOGICAL AND PHYSICAL CORE ALLOCATION ROUTINES - V414\r
+SUBTTL T. HASTINGS/TH/RCC TS 04 JUN 69\r
+XP VCORE1,414\r
+ ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB\r
+\r
+ ENTRY CORE1 ;ALWAYS LOAD CORE1(FOR LIB SEARCH)\r
+\r
+;CORE ALLOCATION IS DONE ON A 1K BLOCK BASIS\r
+\r
+;USING A USE BIT TABLE(CORTAB) WHICH HAS A 1\r
+;FOR EVERY BLOCK WHICH IS NOT AVAILABLE BECAUSE:\r
+; 1.IN USE BY MONITOR\r
+; 2.IN USE BY USER\r
+; 3.NON-EXISTANT MEMORY\r
+;0 MEANS BLOCK IS NOT IN USE\r
+\r
+;WHEN THE SYSTEM IS STARTED, SYSINI SETS THE CORTAB TABLE\r
+;IT ALSO SETS A BYTE POINTER(CORLST) WHICH POINTS TO THE\r
+;LOWEST NON-EXISTANT BLOCK IMMEDIATELY ABOVE THE HIGHEST\r
+;EXISTANT BLOCK. IT ALSO SETS CORTAL TO THE NO. OF\r
+;FREE BLOCKS AVAILABLE.\r
+;THE CORE1 ROUTINE ASSIGNS CORE IF POSSIBLE. SETS THE USE BITS.\r
+;AND MOVES THE JOB IF NEW ASSIGNEMENT IS A DIFFERENT PLACE THEN OLD\r
+;THE JBTADR TABLE IS ALSO UPDATED BY THE CORE ROUTINES\r
+;LH-PROTECTION,RH=RELOCATION\r
+;JOBADR IS MODIFIED IF CORE FOR CURRENT JOB\r
+;HARDWARE RELOC. AND PROTEC. ARE RESET IF CURRENT JOB\r
+;FINALLY JOBREL(PROTECTION) IN JOB DATA AREA IS ALWAYS UPDATED\r
+\r
+;LIST OF GLOBALS AFFECTED:\r
+;JBTADR,CORTAL,CORTAB,HOLEF,SWFWAT,JOBADR\r
+\r
+;ACS USED(BESIDES TAC,TAC1,JDAT,IOS,DEVDAT,AND POP)\r
+BLK=BUFPNT ;HIGHEST REL. ADR. IN USER AREA\r
+LOC=BUFWRD ;ABS. LOC. OF FIRST BLOCK IN USER AREA\r
+T=AC1 ;TEMPORARY\r
+T1=AC2 ;"\r
+\f;CORE UUO\r
+;CALL MOVEI AC,HIGHEST REL. ADR. DESIRED IN LOW SEG\r
+; HRLI AC,HIGHEST REL. ADR. DESIRED IN HIGH SEG\r
+; CALL AC,[SIXBIT /CORE/]\r
+; ERROR RETURN\r
+; OK RETURN TO USER. JOB MOVED IF NECESSARY\r
+;RETURN NO. OF FREE 1K BLOCKS IN AC(OR MAX. NO. BLOCKS ALLOWED IF SWAPPING SYS)\r
+;BOTH HALVES 0 MEANS ERROR RETURN NO. OF FREE 1K BLOCKS(OR MAX. NO. OF BLOCKS\r
+; ALLOWED IF SWAPPING SYSTEM) IMMEDIATELY WIOTHOUT AFFECTING CORE\r
+; OR WAITING FOR IO DEVICES\r
+;LH=0 MEANS DO NOT CHANGE HIGH SEG ASSIGNMENT\r
+;RH=0 MEANS DO NOT CHANGE LOW SEG ASSIGNMENT\r
+\r
+INTERNAL CORUUO\r
+EXTERNAL USRREL,JOB,CORTAL\r
+EXTERNAL ESTOP1,IOWAIT,OERROR,SETREL,STOTAC,WSCHED\r
+\r
+CORUUO: JUMPE TAC,ZERCOR ;IS HE ASKING FOR ZERO CORE?\r
+ PUSH PDP,TAC ;NO, SAVE HIGHEST DESIRED ADDRESS IN BOTH SEGS\r
+ PUSHJ PDP,IOWAIT ;WAIT FOR ALL DEVICE INACTIVE\r
+ HRRZ TAC,(PDP) ;HIGHEST REL. LOC. DESIRED FOR LOW SEG(RH)\r
+ JUMPE TAC,CORU1 ;IS RH 0(IF YES DO NOT CHANGE LOW SEG)?\r
+ IORI TAC,1777 ;NO, MAKE EVEN MULTIPLE OF 1K-1\r
+ PUSHJ PDP,CORE1 ;TRY TO ASSIGN CORE\r
+ JRST CORERR ;NOT AVIALABLE, ERROR RETURN\r
+ ; SUM OF NEW LOW AND OLD HIGH SEG TO BIG\r
+CORU1: HLRZ TAC,(PDP) ;CHECK TO SEE IF USER REQUESTING HIGH CORE\r
+IFE FT2REL,<\r
+ CAMG TAC,USRREL ;0 MEANS NO CHANGE, 1 THRU TOP OF LOW SEG MEANS\r
+ ; RETURN HIGH CORE (IF ANY), ALWAYS LEGAL\r
+ ; EVEN IF NO HIGH SEB SHARP WARE OR SOFTWARE\r
+>\r
+IFN FT2REL,<\r
+ EXTERN UCORHI\r
+ PUSHJ PDP,UCORHI ;TRY TO ASSIGN CORE TO HIGH SEG.\r
+ ; UCORHI EXPECTS ARG ON PD LIST\r
+ JRST CORERR ;ERROR-ACTIVE IO(SAVE IN PROGRESS FOR SOME USER)\r
+ ; OR SUM OF NEW LOW SEG AND NEW HIGH SEG TOO BIG\r
+>\r
+ AOS -1(PDP) ;SET FOR DK(SKIP) RETURN\r
+CORERR: POP PDP,TAC ;REMOVE ARG FROM LIST\r
+IFN FTSWAP,<\r
+ PUSHJ PDP,WSCHED ;CALL SCHEDULER TO STOP JOB\r
+ ; IN CASE LOW SEG MUST BE SWAPPED OUT TO EXPAND\r
+ ; OR HIGH SEG LOGICAL CORE ASSIGNED ON DISK\r
+ ; SAVE ALL ACS EXECPT AC1,AC2,AC3,\r
+>\r
+ZERCOR:\r
+IFE FTSWAP,<\r
+ MOVE TAC,CORTAL ;RETURN NO. OF FREE 1K BLOCKS (COUNTING\r
+ ; DORMANT AND IDLE SEGMENTS AS FREE)\r
+>\r
+IFN FTSWAP,<\r
+ MOVE TAC,CORMAX ;RETURN MAX. NO. 1K BLOCKS ALLOWED FOR 1 USER TO HAVE\r
+ LSH TAC,-12\r
+>\r
+ JRST STOTAC ;STORE IN USER AC AND RETURN TO USER\r
+\f;ROUTINE TO CHECK JOBS TO SEE IF ANY JOB CAN BE SHUFFLED\r
+;IT IS CALLED EVERY 60TH OF A SECOND BY CLOCK ROUTINE\r
+;PROVIDING CURRENT JOB IS IN USER MODE OR JUST ENTERING\r
+;IO WAIT OR SHARABLE DEVICE WIAT OR RETURNING ON UUO CALLS\r
+;IE CURRENT JOB AND ALL OTHER JOB ARE SHUFFABLE WITH RESPECT\r
+;TO RELOCATION INFO IN MONITOR\r
+;SINCE RESCHEDULING IS NEVER DONE WHEN CURRENT JOB\r
+;IS NOT SHUFFABLE. ALL JOBS ARE SHUFFABLE WHEN\r
+;CHKSHF IS CALLED.\r
+;THE NOSHUFFLE MACRO SHOULD STILL BE USED WHEN EVER\r
+;THE MONITOR MOVES RELOCATION OUT OF ACS PDP,PROG. OR JDAT\r
+;IN CASE IT SHOULD PROVE DESIRABLE IN THE FUTURE TO SHUFFLE\r
+;MORE FREQUENTLY THEN AT THE ABOVE TIMES\r
+;FINALLY A JOB MUST HAVE ALL DEVICES INACTIVE(SINCE SOME\r
+;OF THEM USE ABSOLUTE ADDRESSES)BEFORE IT CAN BE MOVED\r
+;SO CORE CANNOT BE REASSIGNED WHILE DEVICES ARE ACTIVE\r
+;IF DEVICES ARE ACTIVE, JOB WILL BE STOPPED SO THAT IO WILL\r
+;CEASE SOON SO JOB CAN BE SHUFFLED\r
+;ALL DEVICES LOOK AT SHF BIT IN JBTSTS(ADVBEF OR ADVDFE)\r
+;TO SEE IF MONITOR IS WAITING TO SHUFFLE JOB\r
+;THE NSHF BIT IN JOBSTS WHOULD BE SET FOR JOBS USING DISPLAYS\r
+;SINCE DISSER CONTINUALLY REFERENCES USER AREA EVEN THOUGH\r
+;IOAC1 IS OFF.\r
+\r
+;THIS VERSION OF THE CORE SHUFFLER WORKS AS FOLLOWS:\r
+;EVERY CLOCK TICK FOR WHICH ALL JOBS ARE SHUFFABLE(NOT COUNTING ACTIVE\r
+;IO DEVICES). THE JOB IMMEDIATELY ABOVE THE LOWEST HOLE\r
+;(IF ANY) WILL BE MOVED DOWN INTO HOLE. THE HOLEF IS SET NON-ZERO\r
+;TO THE ADDRESS OF JOB IMMEDIATELY ABOVE THE LOWEST\r
+;HOLE(0 IF NONE), EVERY TIME CORE IS REASSIGNED.\r
+;CANNOT BE CALLED WHILE SWAPPING IN PROGRESS FOR THIS JOB(BECAUSE IT CALLS CORE0)\r
+\r
+INTERNAL CHKSHF,FTSWAP\r
+EXTERNAL SHFWAT,HOLEF,CLKCHL,JBTADR,JBTSTS,JBTMAX\r
+\r
+CHKSHF: SKIPE ITEM,SHFWAT ;HAS CHKSHF STOPPED A JOB AND IS WAITING FOR\r
+ ; DEVICES TO BECOME INACTIVE?\r
+ JRST SHFLOP ;YES, SEE IF IO HAS STOPPED YET\r
+ SKIPN TAC,HOLEF ;NO, DOES CORE HAVE A HOLE IN IT?\r
+ POPJ PDP, ;NO\r
+ MOVEI ITEM,JBTMAX ;SEARCH FOR JOB OR HIGH SEG JUST ABOVE HOLE\r
+HOLLOP: HRRZ TAC1,JBTADR(ITEM) ;ADR. OF JOB\r
+\r
+ CAME TAC1,TAC\r
+ SOJG ITEM,HOLLOP ;NOT JOB ABOVE HOLE KEEP LOOKG\r
+ JUMPG ITEM,SHFLOP ;FOUND ONE?\r
+ SETZM HOLEF ;NO, CLEAR HOLEF OR ELSE ERROR WILL BE PRINTED EVERY\r
+ ; CLOCK TICK AND ERROR MESSAGE WILL NEVER PRINT\r
+ JSP DAT,OERROR ;SYSTEM ERROR(TELL OPERATOR)\r
+\r
+SHFLOP: SKIPE PROG,JBTADR(ITEM) ;JOB ABOVE HOLE STILL IN CORE ?\r
+ PUSHJ PDP,ANYACT ;NO ALL DEVICES FINISHED ?\r
+ JRST NOTSHF ;YES, GO SEE IF HOLD STILL THERE\r
+IFN JDAT-PROG,<\r
+ MOVE JDAT,JBTDAT(ITEM) ;JOB DATA AREA\r
+>\r
+ HLRZ TAC,PROG ;YEST, REASSIGN SAME AMOUNT OF CORE.\r
+ PUSHJ PDP,SCORE1 ;IN A LOWER POSITION IN CORE\r
+\r
+NOTSH1: SETZM SHFWAT ;JOB SHUFFLED, CLEAR FLAG\r
+ MOVSI TAC,SHF ;CLEAR SHUFFLE WAIT BIT IN CASE IT WAS ON\r
+ ANDCAM TAC,JBTSTS(ITEM)\r
+ POPJ PDP,\r
+\r
+;JOB CANNOT BE MOVED BECAUSE IT HAS ACTIVE DEVICES OR NSHF BIT SET(DISPLAY,REALTIME)\r
+; SO JOB CANNOT BY SHUFFLED AT THIS TIME\r
+\r
+NOTSHF: SKIPN HOLEF ;IS HOLE STILL THERE?\r
+ JRST NOTSH1 ;NO\r
+IFN FTSWAP,<\r
+ EXTERNAL FIT,FORCE\r
+ MOVE TAC,FORCE\r
+ CAME ITEM,FIT\r
+ CAMN ITEM,TAC\r
+ JRST NOTSH1\r
+>\r
+ MOVEM ITEM,SHFWAT ;SET SHUFFLE WAIT FLAG WITH JOB NO.\r
+ MOVSI TAC,SHF ;SET SHF WAIT BIT IN JOB STATUS WORD\r
+ IORM TAC,JBTSTS(ITEM) ;SO JOB WILL NOT BE RUN\r
+ POPJ PDP, ;AND IO WILL STOP SOON\r
+\f\r
+;ROUTINE TO TEST FOR ANY ACTIVE DEVICES\r
+\r
+;CALL: MOVE ITEM,JOB NUMBER OR HIGH SEG NUMBER\r
+; MOVE JDAT,ADDRESS OF JOB DATA AREA\r
+; PUSHJ PDP,ANYACT\r
+; DEVICES ACTIVE\r
+; DEVICES NOT ACTIVE EXCEPT POSSIBLY TTY\r
+;IN SWAPPIN SYSTEMS ANYACT IS BROKEN INTO 2 CALLS, TRYSWP AND ANYDEV\r
+;TRYSWP TEST WHTETHER SWAPPER SHOULD EVEN CONSIDER SWAPING JOB\r
+\r
+ INTERN ANYACT,ANYDEV\r
+ EXTERN JOBMAX\r
+ANYACT:\r
+IFN FTSWAP,<\r
+ INTERN ANYDEV\r
+ PUSHJ PDP,TRYSWP ;SHOULD SWAPPER MAKE JOB UNRUNNABLE\r
+ ; IN ORDER TO SWAP OUT?\r
+ POPJ PDP, ;NO, ACTIVE SAVE IN PROGRSS OR NSH,NSWP\r
+ ; (REAL TIME OR DISPLAY)\r
+>\r
+ANYDEV: MOVE T,JBTSTS(ITEM) ;IS JOB(OR HIGH SEG) NOT SHUFFABLE?\r
+ TLNE T,NSHF ;DISPLAY AND REAL TIME SET NSHF\r
+ POPJ PDP, ;CANNOT BE SHUFFLED\r
+IFN FT2REL,<\r
+ CAILE ITEM,JOBMAX ;YES IT THIS A HIGH SEG?\r
+ JRST CPOPJ1 ;YES, OK TO SHUFFLE OR SWAP SINCE NSHF,NSWP\r
+ ; AND NO SAVE IN PROGRESS\r
+>\r
+ MOVEI T,JOBJDA(JDAT) ;ASSUME JOB IS NOT CURRENT JOB\r
+ CAMN ITEM,JOB ;IS IT?\r
+ MOVEI T,USRJDA ;IT IS CURRENT JOB\r
+ ; DEVICE ASSIGNMENT TABLE IN MONITOR\r
+ MOVEI IOS,IOACT ;IO DEVICE ACTIVE BIT\r
+ HRRZ T1,JOBJMH(T) ;GET NO. OF USER IO CHANNELS IN USE\r
+ ; FOR JOB(EITHER FROM JOB DATA AREA\r
+ ; OR FROM MONITOR (IGNORE LH WHICH MY BE-1\r
+ ; IF SAVEGET IN PROGRESS)\r
+ TLO T,T1 ;SET TO ADD T TO T1\r
+ MOVSI AC3,DVTTY ;DEVICE IS A TTY BIT\r
+ANY: SKIPE DEVDAT,@T ;IS A DEVICE ASSIGNED TO THIS CHANNEL?\r
+ TDNN IOS,DEVIOS(DEVDAT) ;YES, IS IT ACTIVE?\r
+ANY2: SOJGE T1,ANY ;NO, KEEP LOOKING\r
+ JUMPL T1,CPOPJ1 ;YES, FINISHED YET?\r
+ TDNN AC3,DEVMOD(DEVDAT) ;NOT FINISHED, IS DEVICE TTY?\r
+ POPJ PDP, ;NO, ERROR RETURN, CANNOT ASSIGN CORE\r
+ JRST ANY2 ;YES, KEEP LOOKING FOR AN ACTIVE DEVICE\r
+\f\r
+;ROUTINE TO TEST TO SEE IF JOB OR HIGH SEG CAN BE SWAPPED\r
+; OR WHETHER IT SHOULD BE ALLOWED TO CONITNUE RUNNING\r
+; UNTIL A MORE FAVORABLE ITME\r
+;CALL: MOVE ITEM,HIGH RO LOW SEG NUMBER\r
+; PUSHJ PDP,TRYSWP\r
+; RETURN1 - JOB MUST REMAIN RUNABLE(NSHF,NSWP SET OR SAVE,GET IN PROGRESS); RETURN2 - OK TO SWAP HIGH OR LOW SEG\r
+\r
+IFN FTSWAP,<\r
+ INTERN TRYSWP\r
+ EXTERN JBTSTS,CPOPJ1\r
+\r
+TRYSWP: MOVE T,JBTSTS(ITEM) ;IS JONB OR HIGH SEG NOT SWAPPABLE?\r
+ TLNE T,NSHF!NSWP ;OR SHUFFABLE(DISPLAY,REAL TIME)?\r
+ POPJ PDP, ;YES, ERROR RETURN\r
+IFN FT2REL,<\r
+ EXTERN ANYSAV\r
+ JRST ANYSAV ;NO, SEE IF THIS JOB IS INVLOVED IN A SAVE,GET\r
+ ; WHICH IS STILL ACTIVE\r
+>\r
+IFE FT2REL,<\r
+ JRST CPOPJ1 ;NO, GIVE OK RETURN\r
+>\r
+>\r
+\f\r
+;ROUTINE TO FLUSH PHYSICAL CORE ASSIGNED IN MEMORY\r
+;NOTE: THIS ROUTINE DIFERS SIGNIFICANTLY FROM CORE0 AND CORE1 IN THAT\r
+;IT IS ONLY A PHYSICAL REMOVAL OF CORE(VIRTAL IS NOT AFFECTED)\r
+;SEE COMMENTS FOR CORE1\r
+;CALL: MOVE ITEM,HIGH OR LOW SEGMENT NUMBER\r
+; PUSHJ PDP,KCORE1\r
+; ALWAYS RETURN HERE\r
+;SCORE1 IS CALLED FROM SHUFFLER WITH TAC SET TO SEG SIZE\r
+\r
+ INTERN KCORE1\r
+\r
+KCORE1: MOVEI TAC,0 ;SETUP DESIRED HIGHEST ADR\r
+SCORE1: SOS(PDP) ;CORE1 WILL ALWAYS SKIP RETURN\r
+ JRST CORE1A ;BYPASS LOGICAL CORE ASSIGNMENT PART\r
+ ; AND FLUSH PHYSICAL CORE(LOGICAL CORE UNEFFECTED)\r
+\r
+\r
+;CORE0 IS CALLED BY THE CORE MONITOR COMMAND AND THE CORE SHUFFLER\r
+\r
+;AND RUN COMMAND\r
+;BOTH LOGICAL AND PHYSICAL CORE ASSIGNMENT ARE AFFECTED\r
+\r
+;CALL: MOVE TAC,HIGHEST LEGAL ASSRESSABLE LOC. DESIRED\r
+; MOVE ITEM,JOB NUMBER\r
+; MOVE PROG,[XWD PROT,,RELOC.]=JBTADR(ITEM)\r
+; PUSHJ PDP,CORE0\r
+; ERROR ;EITHER JOB HAS ACTIVE IO\r
+ ; OR NOT ENOUGH CORE\r
+; OK RETURN\r
+;JOB IS MOVED IF NECESSARY TO SATISFY REQUEST\r
+;PROG AND JDAT ARE SET TO NEW CORE ASSIGNMENT ON EITHER RETURN\r
+;0 MEANS NONE ASSIGNED IN MEMORY, ASSIGNED ON DISK\r
+INTERNAL CORE0\r
+INTERNAL CORE1,FTTIME,FTTRPSET,CORGET,FTSWAP\r
+EXTERNAL JOBJDA,JOB,USRJDA,JOBADR,JBTADR\r
+EXTERNAL JOBREL,JOBADR,JOBDAC,JOBPC,JOBDAT,JBTDAT\r
+EXTERNAL CORTAL,CORLST,CORTAB,HOLEF,CLRWRD\r
+EXTERNAL USRREL,CPOPJ1,JOBJMH,JOBENB,JOBDPD,JOBDPG\r
+EXTERNAL JOBPR1,CPOPJ1,JOBPRT,USRPC,CORMAX\r
+;ENTER HERE FROM CORE CONSOLE COMMAND OR INITIAL CORE\r
+;ASSIGNMENT OF JUST A JOB DATA AREA FOR RUN COMMAND\r
+;IE ENTER WHEN DEVICES MAY BE ACTIVE OR JOB MAY HAVE NO PREVIOUS CORE\r
+;JOB CAN HAVE CORE IN MEMORY, CORE ON DISK., OR NONE EITHER PLACE\r
+;JOB CANNOT BE IN PROCESS OF SWAP OUT OR SWAP IN(CALLER'S RESPONSIBILITY)\r
+;CORE0 NO LONGER REASSIGN CORE ON DISK IF OLD CORE ON DISK\r
+;BECAUSE OF FRAGMENTED SWAPPING(TOO HARD) UNLESS 0 BEING ASKED FOR\r
+;THEREFORE THE CORE COMMAND CAUSES JOB TO BE SWAPPED INTO CORE FIRST(INCORE=1)\r
+;HOWEVER, THE R,RUN,GET,KJOB COMMANDS DO NOT REQUIRE HE PREVIOUS CORE IMAGE TO\r
+;BE SWAPPED IN(AS THIS IS SLOW). THEY ASK FOR 140 WORDS, AND LARGER DISK SPACE IS RELINQUISHED\r
+;UPON SWAPIN BY THE SWAPPER, VIRTAL IS INCREASED THEN RATHER THAN\r
+;ON THE CALL TO CORE0.\r
+;IT WILL TRY TO REASSIGN CORE IN MEMORY IF OLD CORE IN MEMORY\r
+;IF THIS FAILS, IT WILL REASSIGN NEW CORE ON DISK AND ASK SWAPPER TO EXPAND\r
+;IF JOB DID NOT HAVE OLD CORE, AN ATTEMPT WILL BE MADE TO ASSIGN CORE IN MEMORY\r
+;IF THIS FAILS, TI WILL BE ASSIGNED ON THE DISK AND ASK SWAPPER TO EXPAND\r
+;THE OTHER PLACES IN THE MONITOR WHERE THE IN-CORE COUNT IS TOUCHED IS\r
+;IN GET WHERE IT INCREMENTS TO SHARE COPY ALREADY IN CORE.\r
+;AND END OF SWPIN OF LOW SEG AND HIGH SEG IS ALREADY IN CORE FOR OTHER USER\r
+;THE CORE ROUTINES DO NOT ALTER THE HIGH SEG IN CORE COUT. IT IS UP TO THE CALLER\r
+;(IN SEGCOR) TO CALL THE CORE ROUTINES ONLY IF IN CORE COUNT IS 0\r
+;AND END OF SWAPIN OF LOW SEG AND HIGH SEG IS ALREADY IN CORE FOR OTHER USER\r
+\f\r
+CORE0:\r
+IFE FTSWAP,<\r
+ JUMPE PROG,CORGET ;IS JOB WITHOUT CORE IN MEMORY?\r
+>\r
+IFN FTSWAP,<\r
+ EXTERN IMGOUT,CPOPJ1,CHGSWP\r
+ JUMPN PROG,CORE0A ;DOES JOB HAVE CORE IN MEMORY?\r
+ ; (ALWAYS TRUE BOTH SEGS IF CORE UUO)\r
+ IFE FT2REL,<\r
+ EXTERN CORMAX\r
+ CAML TAC,CORMAX ;NO, WILL REQUEST FIT IN PHYSICAL CORE?\r
+ ; COMPARE WITH LARGEST PERMITTED ADR+1(BUILD AND\r
+ ; ONCE CAN RESTART CORMAX)\r
+\r
+ >\r
+ IFN FT2REL,<\r
+ EXTERN SUMSEG\r
+ PUSHJ PDP,SUMSEG ;NO, WILL SUM OF BOTHER SEGMENTS FIR IN PHYSICAL CORE?\r
+ ; LARGEST PERMITTED CORE, COMPARE SUM WITH CORMAX\r
+ >\r
+ POPJ PDP, ;NO, GIVE ERROR RETURN\r
+ MOVSI TAC1,SWP ;IS JOB SWAPPED OUT?\r
+ TDNN TAC1,JBTSTS(ITEM) ;(MAY HAVE 0 DISK SPACE ALTHOUGH SWAPPED OUT)\r
+ JRST CORE1 ;NO, TRY TO ASSIGN CORE IN MEMORY\r
+ PUSHJ PDP,CHGSWP ;YES, CHANGE ASSIGNMENT OF SWAPPING SPACE ON DISK\r
+ ; INCREASE VIRTAL(COUNT OF FREE 1K BLOCKS OF SWAPPING\r
+ ; (SHOULD NEVER NEED TO DECREASE VIRTAL SINCE\r
+ ; CORE COMMAND ALWAYSSWAPS JOB IN FIRST).\r
+ ; (FRAGMENTATION POSTPONES RETURNING SPACE AND\r
+ ; INCREASING VIRTAL UNTIL SWAP IN IF NOTASKING\r
+ ; FOR 0 VIRTUAL CORE)\r
+ JRST CPOPJ1 ;GIVE OK RETURN TO CALLER\r
+\r
+CORE0A:\r
+EXTERNAL JBTSWP\r
+>\r
+IFN FTTRPSET,<\r
+ EXTERNAL STOPTS\r
+ SKIPN STOPTS ;NO,IS TIME SHARING STOPPED BY\r
+ ; TRPSET UUO DONE FOR JOB 1?\r
+>\r
+\r
+ PUSHJ PDP,ANYACT ;NO,ANY ACTIVE DEVICE?\r
+ POPJ PDP, ;YES, CANNOT ASSIGN CORE\r
+ ; NO, FALL INTO CORE1\r
+;ROUTINE TO TRY TO ASSIGN CORE IN CORE\r
+;LOW OR HIGH SEG MUST NOT BE SWAPPED OUT(CALLER'S RESPONSIBILITY)\r
+;AND MUST NOT HAVE ANY ACTIVE DEVICES(IT MAY HAVE 0 CORE IN CORE THOUGH)\r
+;IN OTHER WORDS HIGH OR LOW SEG MAY OR MAY NOT HAVE VIRTUAL CORE\r
+;BUT IF IT HAS VIRTUAL CORE IT MUST BE IN PHYSICAL CORE\r
+;THIS IS BOTH A LOGICAL AND A PHYSICAL CORE ASSIGNMENT\r
+;FIRST OLD CORE IS RETURNED TO SYSTEM\r
+;THEN NEW REQUEST IS ATTEMPTED TO BE SATISFIED IN LOWEST \r
+;POSITION POSSIBLE. THUS CORE TENDS TO BE PACKED\r
+;IF NEW REQUEST CANNOT BE GRANTED, OLD AMOUNT OIS RETAINED, IF NON-SWAPPING SYS\r
+;OTHERWISE SWAPPER IS CALLED(XPAND) TO EXPAND CORE BY SWAPPING OUT\r
+\r
+\r
+ EXTERN SEGSIZ\r
+\r
+CORE1: NOSCHEDULE ;PREVENT SCHEDULING\r
+\r
+IFN FTSWAP,<\r
+ EXTERN VIRTAL\r
+ PUSHJ PDP,SEGSIZ ;TAC1=OLD SEG SIZE\r
+ SKIPN LOC,TAC ;IS 0 BEING REQUESTED?\r
+ MOVNI LOC,1 ;YES, PRETEND -1(DEPEND ON ASH BUG WHICH KEEPS -1\r
+ ; ON RT. SHIFT)\r
+ ASH LOC,-12 ;CONVERT TO NO. OF K-1(01,0,1,2,...)\r
+ SUB LOC,TAC1 ;NO. OF K-1 INCREASE=NEW-OLD-1\r
+ CAMGE LOC,VIRTAL ;IS THERE ENOUGH FREE VIRTUAL CORE IN SYSTEM?\r
+>\r
+IFE FT2REL,<\r
+ CAML TAC,CORMAX ; YES, IS REQUEST LESS THAN MAX, ALLOWED COR+1?\r
+>\r
+IFN FT2REL,<\r
+ EXTERN SUMSEG\r
+ PUSHJ PDP,SUMSEG ;YES, IS SUM OF SEGS LESS THEN MAX. ALLOWED CORE+1?\r
+>\r
+ POPJ PDP, ;NO, ERROR RETURN\r
+IFN FTSWAP,<\r
+ ADDI LOC,1 ;YES, GET NO. OF K OF INCREASE\r
+ MOVNS LOC ;MAKE MINUS FOR UPDATE\r
+ ADDM LOC,VIRTAL ;AND UPDATE TOTAL VIRTUAL CORE IN SYSTEM\r
+ ; SINCE THIS REQUEST CAN BE SATISFIIED\r
+>\r
+CORE1A: NOSCHEDULE ;PREVENT JOB SCHEDULING\r
+ JUMPE PROG,CORGET ;OLD ASSIGNMENT 0?\r
+ ; IF YES, DO NOT ATTEMPT TO RETURN OLD CORE\r
+ HRRZ LOC,PROG ;NO. ABS, LOC. OF OLD CORE\r
+ HLRZ BLK,PROG ;HIGHEST LEGAL REL. ADR.\r
+ MOVEI T,0 ;CLEAR FOR CORSTG CALL\r
+ PUSHJ PDP,CORSTG ;RETURN OLD CORE TO FREE STORAGE\r
+;CORGET IS CALLED BY SWAPPER WHEN JOB IS ON DISC AND IS\r
+;WANTED IN CORE.\r
+\r
+CORGET: SETZB LOC,PROG ;SET NEW ASSIGNMENT TO 0 AND DIST. MOVED\r
+ JUMPE TAC,DIDLE1 ;IS ZERO CORE BEING REQUESTED?\r
+ PUSHJ PDP,HOLSRC ;NO, SEARCH FOR HOLE BIG ENOUGH\r
+ JRST BAKOLD ;NONE, GIVE BACK OLD AMOUNT\r
+INTERN FTTRACK\r
+IFN FTTRACK,<\r
+ EXTERN LASCOR\r
+ MOVEM ITEM,LASCOR ;LEAVE TRACKS FOR LAST JOB USING\r
+ ; PHYSICAL CORE ALLOCATION\r
+ ; (FOR DEBUGGING ONLY)\r
+>\r
+ MOVEM LOC,PROG ;SETUP NEW RELOC\r
+ HRLM TAC,PROG ;AND NEW PROTECT.\r
+ MOVEI BLK,(TAC) ;HIGHEST REL ADR. BEING REQUESTED\r
+ MOVEI T,1 ;SET USE BITS IN CORE TBALE\r
+ PUSHJ PDP,CORSTG\r
+ MOVE BLK,JBTADR(ITEM) ;OLD CORE ASSIGNMENT\r
+ JUMPN BLK,MOVCOR ;WAS THERE OLD MEMORY ASSIGNED?\r
+ ; NO,\r
+IFN FTSWAP,<\r
+ LDB TAC1,IMGOUT ;SIZE(IN K) OF SEG ON DISK TO BE SWAAPED IN\r
+ LSH TAC1,12 ;CONVERT TO WORDS\r
+>\r
+IFE FTSWAP,<\r
+ MOVEI TAC1,0 ;JOB HAS NO PREVIOUS VIRT. CORE(NON-SWAP SYS)\r
+>\r
+ MOVE BLK,PROG ;MAKE OLD ASSIGNMENT(BL) APPEAR TO START\r
+ ; AT SAME PLACE AS NEW ASSIGNMENT(FOR CLEARING)\r
+ SOJA TAC1,CLRCR1 ;IF NEW CORE SIZE IS BIGGER THAN\r
+ ;OLD, CLEAR OUT INCREASED SO SECURITY WILL\r
+ ; BE MAINTAINED. TAC1 IS SIZE-1 OF OLD\r
+ ; ASSIGNMENT. -1 OF NO OLD ASSIGNMENT\r
+;HERE WHEN FREE CORE TABLE DOES NOT HAVE ENOUGH ROOM FOR REQUEST\r
+\r
+BAKOLD:\r
+IFN FTSWAP,<\r
+ EXTERN XPAND\r
+ PUSHJ PDP,XPAND ;TELL SWAPPER TO SWAP OUT\r
+>\r
+IFE FTSWAP,<\r
+ IFE FT2REL,<\r
+ SOSO (PDP) ;SET FOR ERROR RETURN AND GET BACK LO CORE\r
+ >\r
+ IFN FT2REL,<\r
+ EXTERN FRECOR\r
+ PUSHJ PDP,FRECOR ;TRY TO DELETE 1 DORMANT HIGH SEGMENT,\r
+ ; IF REQUEST DOES NOT EXCEED FREE CORE+DORMANT SEGS\r
+ SOSA (PDP) ;ERROR RETURN-NOT ENOUGH CORE, GET OLD AMOUNT BACK\r
+ JRST CORGET ;1 DORMANT SEG DELETED, TRY REQUEST AGAIN\r
+ >\r
+>\r
+BKOLD1: HLRZ TAC,JBTADR(ITEM) ;GIVE BACK OLD CORE.\r
+ JRST CORGET\r
+\f\r
+;MOVE OLD CORE TO NEW AREA\r
+\r
+MOVCOR: CAIN LOC,(BLK) ;IS NEW CORE IN SAME PLACE AS OLD?\r
+ JRST CLRCOR ;YES, DO NOT MOVE IT,CLEAR IF INCREASE\r
+ HLRZ TAC1,BLK ;LENGTH OF OLD CORE\r
+ CAILE TAC1,(TAC) ;IS OLD CORE LESS THEN NEW?\r
+ HRRZ TAC1,TAC ;NO, MOVE THE SHORTENED NEW CORE\r
+IFN FTTIME,<\r
+ EXTERNAL SHRWRD\r
+ ADDM TAC1,SHRWRD ;INCREMENT TOTAL NO. WORDS SHUFFLED\r
+>\r
+ ADD TAC1,LOC ;ADD IN NEW RELOC.\r
+ MOVE AC1,LOC ;DEST.=NEW RELOC.\r
+ HRL AC1,BLK ;SOURCE=OLD RELOC.\r
+ SETZM JBTADR(ITEM) ;FLAG THAT CORE IS IN TRANSIT(TTY ROUTINES)\r
+ BLT AC1,(TAC1) ;MOVE CORE TO NEW ASSIGNMENT\r
+\r
+;CLEAR INCREASE IF NEW CORE IS BIGGER THAN OLD\r
+\r
+CLRCOR: HLRZ TAC1,BLK ;OLD CORE SIZE-1\r
+CLRCR1: CAMG TAC,TAC1 ;IS NEW CORE SIZE-1 VREATER THAN OLD CORE SIZE-1\r
+ JRST DIDLE ;NO, DO NOT CLEAR ANY CORE\r
+IFN FTTIME,<\r
+ MOVE AC1,TAC ;NEW CORE SIZE\r
+ SUB AC1,TAC1 ;LESS OLD CORE SIZE\r
+ ADDM AC1,CLRWRD ;ACCUMULATE NO. OF WORDS CLEARED\r
+> \r
+ ADDI TAC1,2(PROG) ;YES, OLD SIZE-1+NEW RELOC+2=2ND LOC TO CLEAR\r
+ ADDI TAC,(PROG) ;NEW SIZE-1+NEW RELOC=LAST LOC TO CLEAR\r
+ SETZM -1(TAC1) ;CLEAR FIRST WORD\r
+ HRLI TAC1,-1(TAC1) ;SET LH TO FIRST ADR. TO CLEAR\r
+ BLT TAC1,(TAC) ;CLEAR THE INCREASE PORTION\r
+;IF THE SHUFFLED JOB IS IN EXEC MODE, ITS DUMP ACS\r
+;(PDP,PROG,JDAT SAVED IN JOB DATA AREA) MUST BE\r
+;ALTERED BY DISTANCE CODE WAS MOVED\r
+\r
+;IF THE SHUFFLED JOB IS CURRENT JOB, THE SOFTWARE STATE OF\r
+;THE MONITOR(IE SOFTWARE INFO OF JOB) MUST BE ALTERED BY AMOUNT\r
+;CORE WAS MOVED\r
+\r
+EXTERNAL SYSSIZ\r
+\r
+DIDLE: SUBI LOC,(BLK) ;DISTANCE JOB WAS MOVED(DIST.-SOURCE)\r
+ CAME ITEM,JOB ;IS THIS CURRENT JOB?\r
+ SKIPA TAC,JOBPC(JDAT) ;NO. GET PC IN JOB DATA AREA\r
+ MOVE TAC,USRPC ;YES, PC IN PROTECTED SYSTEM AREA\r
+IFN FT2REL,<\r
+ EXTERN JOBMAX\r
+ CAIG ITEM,JOBMAX ;IS THIS A HIGH SEGMENT?\r
+>\r
+ TLNE TAC,USRMOD ;NO. IS JOB IN USER MODE?\r
+ JRST DIDLE1 ;YES, DO NOT ALTER DUMP ACS\r
+ ; BECAUSE THEY ARE IN USERS(OR HIGH SEG)\r
+ ADDM LOC,JOBDPD(JDAT) ;NO. ALTER DUMP PDP BY DIST. OF MOVE\r
+ ADDM LOC,JOBDPG(JDAT) ;AND ALTER PROG BY DIST. MOVED\r
+DIDLE1: MOVEM PROG,JBTADR(ITEM) ;STORE NEW CORE ASSIGNMENT(LOW OR HIGH SEG)\r
+ CAME ITEM,JOB ;IS THIS CURRENT JOB?\r
+ JRST DIDLE3 ;NO, DO NOT ALTER STATE OF MONITOR\r
+ MOVE TAC,SYSSIZ ;DONT CHANGE PDP IF LIST\r
+ CAIG TAC,(PDP) ;IS IN SYSTEM\r
+ ADD PDP,LOC ;YES, ALTER PUSH DOWN POINTER BY AMOUNT OF MOVE\r
+ PUSHJ PDP,SETREL ;GO SETUP NEW HARDWARE AND SOFTWARE RELOCATION\r
+ ; INFORMATION FOR HIGH AND LOW SEGS FOR CURRENT JOB\r
+DIDLE3:\r
+IFN FT2REL,<\r
+ EXTERN CURHGH\r
+ PUSHJ PDP,CURHGH ;CHECK TO SEE IF THIS CORE ASSIGNMENT IS FOR\r
+ ; HIGH SEG WHICH CURRENT USER MAY ALSO BE USING\r
+ ; IF YES, RESET HARDWARE AND SOFTWARE RELOC INFO.\r
+ ; OF SEG WHICH HAS JUST HAD CORE REASSIGNED\r
+\r
+>\r
+ SETZB TAC,HOLEF ;CLEAR HOLD FLAG\r
+ PUSHJ PDP,HOLSRC ;IS THERE A NON-ZERO HOLE?\r
+ JRST COROK ;NO\r
+ ADDI LOC,1(BLK) ;YES, FORM ADR. OF JOB JUST ABOVE HOLD\r
+ CAME T,CORLST ;IS HOLE AT TOP OF MEMORY\r
+ MOVEM LOC,HOLEF ;NO, FLAG WITH ADDRESS OF JOB ABOVE HOLE\r
+COROK:\r
+IFN FTSWAP,<\r
+ EXTERNAL BIGHOLE\r
+ MOVEI TAC,-1 ;FIND BIGGEST HOLE\r
+ PUSHJ PDP,HOLSRC ;ALWAYS GET ERROR RETURN\r
+ ASH T1,-^D10 ;CONVERT TPO 1K BLOCKS\r
+ MOVEM T1,BIGHOLE \r
+>\r
+ SCHEDULE\r
+ JRST CPOPJ1 ;SKIP RETURN(UNLES ERROR)\r
+\f\r
+;ROUTINE TO FIND HOLD BIG ENOUGH FOR REQUEST\r
+;CALL: MOVE TAC,HIGHEST REL. ADR. ASKING FOR\r
+; PUSHJ PDP,HOLSRC\r
+; RETURN1 ;NO HOLES BIG ENOUGH\r
+; RETURN2 ;T BYTE SET TO LAST BLOCK+1 IN HOLE\r
+; ;BLK SET TO HIGHEST REL. LOC. IN THAT HOLE\r
+; ;LOC SET TO ADDRESS OF FIRST BLOCK IN HOLE\r
+; ;T1=LARGEST HOLE SEEN\r
+;USES TAC1\r
+\r
+HOLSRC: MOVE T,CORE2P ;BYTE POINTER TO FIRST BIT-1\r
+ SETZB LOC,T1 ;START AT BOTTOM OF MEMORY\r
+ ; LARGEST HOLE SO FAR=0\r
+CORHOL: TDZA BLK,BLK ;START BLK AT 0 AND SKIP\r
+\r
+CORHO0: ADDI BLK,2000 ;INCREMENT HIGHEST REL LOC.\r
+CORHO1: CAMN T,CORLST ;BYTE POINTER TO 1ST NON-EXISTANT BLOCK\r
+ POPJ PDP, ;NO MORE CORE TO SEARCH\r
+ ILDB TAC1,T ;GET NEXT CORE USE BIT\r
+ ADDI LOC,2000 ;INCREMENT ADDRESS OF BLOCK\r
+ JUMPE TAC1,CORHO0 ;IS THIS BLOCK IN USE?\r
+ JUMPE BLK,CORHO1 ;YES, HAVE ANY FREE BLOCKS BEEN SEEN YET?\r
+IFN FTSWAP,<\r
+ CAMLE BLK,T1 ;YES, BIGGEST SO FAR?\r
+ MOVEM BLK,T1 ;YES, SAVE IN T1.\r
+>\r
+ CAMG BLK,TAC ;YES, IS THIS HOLD EQUAL OR GREATER THEN REQUEST?\r
+ JRST CORHOL ;NO, KEEP LOOKING FOR HOLES\r
+ SUBI LOC,2000(BLK) ;YES, SET LOC TO FIRST BLOCK IN HOLD\r
+ SOJA BLK,CPOPJ1 ;SET BLK TO HIGHEST REL. LOC.\r
+ ; AND RETURN\r
+\f\r
+;ROUTINE TO SET AND CLEAR CORE USE TABLE\r
+;CALL: MOVEI T,1 ;TO SET TABLE\r
+ MOVEI T,0 ;TO CLEAR TABLE\r
+; MOVE BLK,HIGHEST REL. LOC. IN USER AREA\r
+; MOVE LOC,ADDRESS OF FIRST BLOCK TO SET CLEAR\r
+\r
+ INTERN CORE2P\r
+ EXTERN TPOPJ\r
+\r
+CORSTG: PUSH PDP,TAC ;SAVE HIGHEST LOC. BEING REQUESTED\r
+ ASH BLK,-12 ;CONVERT TO NO. OF BLOCKS-1\r
+ ADDI BLK,1 ;NO. OF BLOCKS\r
+ SKIPE T ;UPDATE NO OF FREE BLOCKS\r
+ MOVNS BLK ;DECREASE IF SETTING BITS\r
+ ADDM BLK,CORTAL ;INCREASE IF CLEARING,DECREASE IF SSETING BITS\r
+ MOVE TAC,LOC ;ADDRESS OF FIRST BLOCK\r
+ ASH TAC,-12 ;FORM BYTE POINTER TO BIT-1\r
+ IDIVI TAC,^D36 ;TAC=WORD,TAC1=BIT\r
+ ADD TAC,CORE2P ;FORM BYTE POINTER\r
+\r
+ MOVNS TAC1\r
+ ADDI TAC1,^D36\r
+ DPB TAC1,[POINT 6,TAC,5]\r
+ MOVMS BLK ;GET MAG. OF NO. OF BLOCKS INVOLVED\r
+ IDPB T,TAC ;SET OR CLEAR EACH USE BIT\r
+ SOJG BLK,.-1\r
+ JRST TPOPJ ;RESTORE TAC. AND POPJ\r
+\r
+CORE2P: POINT 1,CORTAB ;BYTE POINTER TO FIRST BIT-1\r
+\f\r
+;ROUTINE TO CLEAR PART OF JOB DAT AREA(PART PROTECTED FROM USER IO)\r
+;CALLED WHEN NEW CORE ASSIGNED AND AT SYSTEM RESTART(140)\r
+; MOVE ITEM,JOB NO.\r
+;CALL: MOVE JDAT,ADR. OF JOB DATA AREA\r
+; PUSHJ PDP,CLRJOB\r
+\r
+INTERNAL CLRJOB\r
+EXTERNAL JOBPRT,JOBPR1,JOBPFI,JOBENB\r
+EXTERNAL JOBPD1,JOBDDT\r
+\r
+CLRJOB: SETZM JOBPRT(JDAT) ;FIRST LOC. PROTECED FROM USER\r
+ MOVSI TAC,JOBPRT(JDAT)\r
+ HRRI TAC,JOBPR1(JDAT)\r
+ MOVE TAC1,JOBDDT(JDAT) ;SAVE DDT STARTING ADDRESS\r
+ BLT TAC,JOBPFI(JDAT)\r
+ MOVEM TAC1,JOBDDT(JDAT)\r
+ SETZM JOBENB(JDAT) ;ALSO CLEAR APR ENABLE WORD\r
+ SETZM JOBPD1(JDAT) ;AND UUO PC FLAGS(USED WHEN JOB STARTS)\r
+ JRST ESTOP1 ;GO SET JOB STATUS, SO CONT WILL\r
+ ; NOT WORK,(DO NOT CLEAR JACCT BIT)\r
+\r
+COREND: END\r
--- /dev/null
+CLOCK1=CLOCK1
+CLKCSS=CLKCSS
+COMCON=COMCON
+COMMON=COMMON
+CORE1=CORE1
+DIS340=DIS340
+DIS34=DIS30
+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
+PLTSER=PLTSER
+PTRSER=PTRSER
+PTPSER=PTPSER
+PTYSRF=PTYSRF
+PTYSRH=PTYSRH
+PATCH=PATCH
+ONCEB=ONCEB
+SCNSRF=SCNSRF
+SCHEDB=SCHEDB
+UUOCON=UUOCON
--- /dev/null
+\fTITLE DCSINT - INT. SERV. FOR DATA COMMUNICATION SYSTEM 630 - V402\r
+SUBTTL M. FREDRIKSEN/TH/CHW TS 7 MAY 69\r
+XP VDCSIT,402\r
+ ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+;MODULAR HARDWARE INTERFACE WITH EITHER SCNSER OR TTYSER\r
+\r
+EXTERNAL SCNON,SCNOFF,TYPX\r
+\r
+IFE FTTTYSER,<XP FULTWX,200000>\r
+\r
+IFN FTTTYSER,<XP FULTWX,4>\r
+\f;ACCUMULATOR ASSIGNMENTS\r
+\r
+ CHREC=TEM ;AC FOR CHARACTER\r
+ DDB=DEVDAT ;ADDRESS OF DEVICE DATA BLOCK\r
+ LINE=TAC1 ;SCANNER LINE NUMBER\r
+ HPOS=DAT ;HORIZONTAL POSITION OF TTY.(0-71)\r
+\r
+;BYTE POINTERS\r
+\r
+\r
+EXTERNAL PLASTC\r
+\r
+\f;DEVICE DEPENDENT PORTION OF INITIALIZATION CODE\r
+;CALL: MOVEI TAC,CHANNEL NUMBER\r
+; PUSHJ PDP,SCNINI\r
+\r
+INTERNAL SCNINI\r
+\r
+DCSINI:\r
+SCNINI: MOVEI TAC,100000\r
+ CONO DCSA,4010 ;RELEASE XMITTER, RECEIVER\r
+ CONSZ DCSA, 1000\r
+ CONO DCSA, 4000\r
+ CONSZ DCSA, 10\r
+ DATAI DCSB, TAC1\r
+ SOJG TAC,.-4\r
+ CONO DCSA,FSNCHN ;ASSIGN INTERRUPT CHANNELS\r
+ POPJ PDP,\r
+\r
+;SCANNER INTERRUPT SERVICE ROUTINE.\r
+\r
+ENTRY DCSINT\r
+\r
+INTERNAL SCNINT\r
+EXTERNAL SCNSAV,TCONLN,TTYTAB,XMTINT,TYPE,INUS2,RECINT,FSNCHN\r
+\r
+DCSINT:\r
+SCNINT: CONSO DCSA,1010\r
+ JRST SCNINT\r
+ JSR SCNSAV\r
+ CONSO DCSA,10 ;RECEIVER FLAG?\r
+ JRST SCNIN1 ;NO,XMITTER FLAG\r
+ CONI DCSB,LINE ;SCANNER INPUT.\r
+ DATAI DCSB, CHREC\r
+ CAIL LINE,TCONLN ;ARE WE ENABLED FOR THIS LINE NUMBER?\r
+ POPJ PDP, ;NO, DISMISS INTERRUPT\r
+ JRST RECINT ;RECEIVER INT. HANDLER\r
+\f;COMMON PARTS OF CTY AND SCANNER INTERRUPT SERVICE ROUTINES.\r
+\r
+EXTERNAL INJEST,DDBSRC\r
+INTERNAL TCOMM\r
+\r
+TCOMM:\r
+ SKIPE DDB,TTYTAB(LINE) ;DATA BLOCK ASSIGNED?\r
+ JRST INUSE ;YES\r
+ PUSHJ PDP,DDBSRC ;SEARCH FOR FREE TTY DEV. DATA BLOCK\r
+ JRST TYPX ;NONE FOUND, TYPE X\r
+ MOVEI HPOS,0 ;ASSUME TTY IS AT BEGIN OF FORM\r
+ CAILE LINE,TCONLN ;PSEUDO CONSOLE?\r
+ JRST INJEST ;YES\r
+ CAIE LINE,TCONLN ;IS IT CTY?\r
+ CONSO DCSA,700 ;NO, IS IT HALF DUPLEX?\r
+ JRST INUS2 ;YES, ACCEPT CHAR AND PROCESS\r
+ JRST TYPE ;NO, ECHO CHAR ON FULL DUPLEX\r
+ ;BEFORE PROCESSING IT\r
+\r
+SCNIN1:\r
+ DATAI DCSA,LINE ;GET LINE NO. FROM FULL DUPLEX.\r
+ MOVEI TAC,FSNCHN\r
+ CONO DCSA,4000(TAC) ;RELEASE XMITTER SCANNER\r
+ JRST XMTINT ;IN SCNSER OR TTYSER\r
+\f;COMMON TO RECEIVE AND TRANSMIT.\r
+\r
+INUSE: HRRZS DDB ;LINE DISABLED IF RH TTYTAB=-1\r
+ CAIN DDB,-1\r
+ POPJ PDP,\r
+ MOVE IOS,DEVIOS(DDB) ;SETUP IOS\r
+ CAIGE LINE,TCONLN ;CTY OR PTY?\r
+ CONSO DCSA,700 ;NO, HALF DUPLEX?\r
+ JRST INUS2 ;YES\r
+ TLNE IOS,FULTWX ;IS THIS SELF ECHOEING FULL DUPLEX?\r
+ JRST INUS2 ;YES,(USER TYPED CONROL B)\r
+ CONO DCSB,(LINE) ;FULL DUPLEX SCANNER. ECHO CHAR.\r
+ DATAO DCSA,CHREC\r
+ DPB CHREC,PLASTC\r
+ POPJ PDP, ;DISMISS INTERRUPT\r
+\f;ROUTINE TO OUTPUT A CHARACTER ON A LINE\r
+;CALLED FROM TYP OR TYPL IN SCNSER\r
+\r
+INTERNAL SCNTYP\r
+\r
+SCNTYP:\r
+DCSTYP: CONO PI,SCNOFF ;TURN SCANNER PI OFF IN CASE AT USER LEVEL\r
+ ;SO NO INTERRUPTS BETWEEN CONO, AND DATAO\r
+ CONO DCSB,(LINE) ;NO\r
+ DATAO DCSA,CHREC\r
+ CONO PI,SCNON ;TURN SCANNER PI BACK ON\r
+ SKIPE DDB\r
+ DPB CHREC,PLASTC ;SAVE CHAR FOR FULL DUPLEX\r
+ POPJ PDP,\r
+\r
+\r
+\f END\r
--- /dev/null
+IFNDEF T30,<T30=0>;ASSUME TYPE 30 DISPLAY IF T30 IS UNDEFINED\r
+IFN T30,<\r
+TITLE DIST30 - TYPE 30 DISPLAY SERVICE ROUTINES\r
+ENTRY DIST30\r
+DIST30:\r
+>\r
+IFE T30,<\r
+TITLE DIS340 - TYPE 340 DISPLAY SERVICE ROUTINES\r
+ENTRY DIS340\r
+DIS340:\r
+>\r
+SUBTTL R. GRUEN/RCC TS 03 JUN 69 V004\r
+XP VDISSR,004\r
+\r
+ ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+; THESE ROUTINES HANDLE INTERRUPTS FROM THE DISPLAY DATA\r
+; CHANNEL. THEY SEARCH THE COMMAND POINTER LIST SUPPLIED\r
+; BY THE USER AND OUTPUT SECTIONS OF DATA AS SPECIFIED THEREIN.\r
+; ALL OUTPUT IS DONE USING THE BLKO COMMAND.\r
+\r
+; THE FORMAT OF THE COMMAND POINTE RLIST IS AS FOLLOWS:\r
+\r
+; RH=0 END OF COMMAND POINTER LIST\r
+;\r
+; RH=ADR LH=0 ADR IS ADDRESS OF THE NEXT SECTION OF THE\r
+; COMMAND POINTER LIST\r
+; RH=L-1 LH=-N OUTPUT TO DISPLAY THE N WORDS OF COMMANDS\r
+; BEGINNING AT LOCATION L.\r
+\r
+; NOTE THAT THE CHECK FOR END OF LIST IS MADE FIRST.\r
+\r
+; ALL ADDRESS ARE CHECKED FOR VALIDITY (I.E.. THEY MUST\r
+; BE WITHIN USER ARE) BEFORE ANY MEM REF IS MAD.\r
+\r
+;IF THE T30 SWITCH = 1 THIS IS THE ROUTINE FOR A DEC\r
+;TYPE 30 DISPLAY WITH A TYPE 348 INTERFACE.\r
+;OTHERWISE IT IS THE ROUTINE FOR A DEC TYPE 340.\r
+\f\r
+INTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL DISDDB,DISIOS,PENLOC,DISNT,DISBKO,DISHI,DISONE,DISAV,OFFDIS\r
+EXTERNAL DISAV1,DISREL,DISCON,DISNXT\r
+INTERNAL DISNX1\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+;DIS DEVICE DATA BLOCK\r
+ INTERN DISDDB\r
+DISDDB: SIXBIT /DIS/\r
+ XWD ^D60*HUNGST,0\r
+DISIOS: 0\r
+ EXP DISDSP\r
+ XWD DVDIS+DVOUT+DVIN+DVLNG,2000\r
+ 0\r
+ 0\r
+ XWD PROG,0\r
+ 0\r
+PENLOC: 0\r
+DISPNT: 0\r
+DISBKO: 0\r
+DISHI: 0\r
+DISONE: 0\r
+DISAV: 0\r
+DISAV1: 0\r
+DISREL: XWD TAC,0\r
+ XP OFFDIS,0\r
+IFE T30,<\r
+DISCON: EXP ONDIS>\r
+IFN T30,<\r
+DISCON: 0>\r
+\r
+XP PENDDR,0 ;TO SATISFY A REQUEST IN COMMON.\r
+ ; THERE IS NOT REALLY A PEN DDB.\r
+>\r
+\f\r
+IFN T30,<\r
+DIS=134 ;TYPE 30 DISPLAY DEVICE NUMBER\r
+>\r
+DISTAR=100 ;CLOCK FINISHED BEFORE PICTURE\r
+DISWAT=200 ;PICTURE FINISHED BEFORE CLOCK\r
+DISCKR=400 ;CLOCK REQUEST IN CLOCK QUEU\r
+DISUUI=1000\r
+\r
+IFE T30,<\r
+DISBSY=77\r
+PENON=7400\r
+>IFN T30,<\r
+DISBSY=2000\r
+PENON=1000\r
+>\r
+\r
+EXTERN JOBPFI\r
+\r
+EXTERN DISSAV,DISBLK,DISJSR,PENSAV\r
+ EXTERN DISCHN,PENCHN\r
+ EXTERN DISCHL,PENCHL\r
+ EXTERN DISSAV,DISRET\r
+ EXTERN DISPON,DISPOF\r
+\r
+ EXTERN ADRERR,SETIOD\r
+ EXTERN PION,PIOFF,CLOCK\r
+ EXTERN CPOPJ1,UERROR,URREL,STOTAC,JOB,JBTSTS,JBTADR,PJOBN\r
+IFE T30,< EXTERN ONDIS,NONDIS>\r
+\r
+INTERN PENINT,DISINT,DISFIN\r
+ENTRY DISDSP\r
+\r
+ DEFINE ADRCHK(A)\r
+< \r
+ CAILE A,JOBPFI\r
+ CAMLE A,DISHI\r
+ JRST EXIT2\r
+>\r
+\f\r
+ JRST DISINI ;INITIALIZATION\r
+ POPJ PDP, ;PRINT ERROR AND STOP JOB\r
+DISDSP: JRST DISSTP ;RELEASE\r
+ JRST DISSTP ;CLOSE\r
+ JSP DAT,UERROR ;OUTPUT\r
+ JSP DAT,UERROR ;INPUT\r
+ JRST CPOPJ1 ;ENTER\r
+ JRST CPOPJ1 ;LOOKUP\r
+ JRST DISOUT ;DUMP OUPUT (THAT'S US)\r
+ JRST DISIN ;DUMP INPUT (AS IN PEN)\r
+ POPJ PDP, ;SETO\r
+ POPJ PDP, ;SETI\r
+ POPJ PDP, ;GETF\r
+ JRST CPOPJ1 ;RENAME\r
+ POPJ PDP, ;CLOSE INPUT\r
+ POPJ PDP, ;DIRECTORY CLEAR\r
+ POPJ PDP, ;MTAPE\r
+\f\r
+;DISINI IS CALLED FOR RELEASE, CLOSE, AND SUNDRY ILLEGAL CONDITIONS\r
+; WHICH WANT TO TURN THE DISPLAY OFF. IT FIRST CONVINCES\r
+; THE INTERRUPT LEVEL ROUTINES TO GO BACK TO SLEEP AND THEN\r
+; TELLS THE MONITOR THAT THE DEVICE IS INACTIVE, LASTLY,\r
+; IT TUERNS OFF THE INTERRUPT ASSIGNMENTS OF THE DISPLAY\r
+; AND THE PI CHANNEL ASSOCIATED WITH THE DIS BLKO. IT RETURNS\r
+; WITH A POPJ , SOMETIMES TO ITS CALLING ROUTINE AND SOMETIMES\r
+; TO THE CHANNLE'S DISMISS ROUTINE, THE ADDRESS OF WHICH\r
+; WAS CLEVERLY PLACED ON THE PUSHDOWN LIST WHEN AC'S \r
+; WERE SAVED. THUS IT CAN BE CALLED WITH EITHER A\r
+; PUSHJ PDP,DISINI OR A JRST DISINI.\r
+\r
+DISINI:\r
+IFE T30,<\r
+ CONO DIS,100 ;PARAMETER MODE>\r
+IFN T30,<\r
+ MOVEI TAC,PENCHN ;SET UP CONO WORD WITH PROPER\r
+ ASH TAC,3 ; CHANNEL ASSIGNMENTS\r
+ ADDI TAC,DISCHN\r
+\r
+ TRO TAC,4000 ;SET DISPLAY READY BIT IN CONO WORD\r
+ MOVEM TAC,DISCON>\r
+ JRST DISIN1\r
+\r
+DISSTP: MOVE ITEM,JOB ;CLEAR NSHF SO JOB CAN BE SHUFFLED\r
+ MOVSI TAC,NSHF+NSWP ;CLEAR NSWP SO JOB CAN BE SWAPPED(IN CASE THIS IS A SWAPPING SYSTEM\r
+ ANDCAM TAC,JBTSTS(ITEM)\r
+\r
+DISIN1: SETOM PENLOC\r
+ MOVSI TAC,DISWAT+DISUUO ;IGNORE FURTHER TRAPS\r
+ HRRI TAC,IOACT ;INDICATED DEVICE INACTIVE\r
+ ANDCAM TAC,DISIOS ;INTO DEVICE DATA BLOCK\r
+DISOFF: CONO DIS,OFFDIS ;REMOVE THE DISPLAY'S CHANNE; ASSIGNMENTS\r
+ HLLZS PENINT ;DON'T EXPECT ANY ON LITE PEN\r
+ CONO PI,DISPOF ;TURN OFF DISPLAY'S BLKO CHANNEL\r
+ POPJ PDP,\r
+ \r
+DISINT: JRST DISFIN\r
+ JRST DISINT ;...\r
+\f\r
+;PENINT RECIEVES CONTROL ON INTERRUPTS ON THE DISPLAY NON-DATA\r
+; CHANNEL (SPECIAL CHANNEL). IT DECIDES IF THE INTERRUPT\r
+; WAS VALID, AND IF SO, TRANSFERS CONTROL TO AN APPROPRIATE ROUTINE\r
+\r
+IFE T30,<\r
+PENINT: CONSO DIS,0 ;CHECK FOR CONI FLAGS\r
+ JRST PENINT ;TO OTHER DEVICES ON SAME CHANNEL\r
+ CONSZ DIS,400 ;STOP FLAG\r
+ JRST STPFLG\r
+ CONSZ DIS,2000 ;PEN FLAG?\r
+PENFLG: DATAI DIS,PENLOC ;STORE CURRENT LITE PEN LOC\r
+ CONO DIS,NONDIS ;CLEAR FLAG\r
+ JEN @PENCHL ;DISMISS INTERRUPT\r
+\r
+;STPFLG SERVICES STOP FLAGS (DISPLAY PROGRAMMED) BY DOING\r
+; A CLOSE ON THE DISPLAY\r
+\r
+STPFLG: JSR PENSAV ;STOP FLAG, SAVE AC'S AND SETUP RETURN\r
+ JRST DISDSP+DCL ;DO A CLOSE AND DISMISS INTERRUPT\r
+>\r
+\r
+IFN T30,<\r
+PENINT: CONSO DIS,0 ;CHECK FOR CONI FLAGS\r
+ JRST PENINT ;TO OTHER DEVICES ON SAME CHANNEL\r
+ DATAI DIS,PENLOC ;CLEAR PEN INTERRUPT\r
+ MOVEM TAC,PENLOC ;SAVE AC TAC\r
+ MOVE TAC,DISBKO ;GET ABSOLUTE ADR OF NEXT DATA ELEMENT\r
+ SUB TAC,DISREL ;MAKE ADDRESS RELATIVE\r
+ HRRZS TAC ;CLEAR OUT GARBAGE IN THE LEFT HALF\r
+ EXCH TAC,PENLOC ;SAVE ADR IN PENLOC AND RESTORE TAC\r
+ JEN @PENCHL ;DISMIS THE INTERRUPT\r
+>\r
+\f\r
+;DISNXT IS CALLED WITH A JSR DISNXT, IT SETS UP THE NEXT\r
+; POINTER FOR THE DISPLAY'S BLKO BY INTERPRETING A\r
+; COMMAND LIST SUPPLIED BY THE USER, THIS COMMAND LIST\r
+; IS DESCRIBED AT THE BEGINNING OF THE PROGRAM. IF THE\r
+; DATA TO BE TRANSMITTED TO THE DISPLAY WOULD VIOLATE THE\r
+; MEMORY PROTECTION, THEN THE ROUTINE RETURNS TO THE\r
+; CALLING LOCATION +1. OTHERWISE, IF THERE\r
+; IS NO FURRTHER DATA TO BE OUTPUT (AS INDICATED BY THE\r
+; USER'S COMMAND LIST) THE ROUTINE RETURNS TO THE CALLING\r
+; LOCATION +2. OTHERWISE, THE NEXT POINTER FOR THE BLKO\r
+; IS PLACED IN DISBLKO AND THE ROUTINE RETURNS TO THE CALLING\r
+; LOCATION +3.\r
+\r
+IFE FTCHECK+FTMONP,<\r
+DISNXT: 0 ;JSR AT INTERRUPT OF UUO LEVELS\r
+>\r
+DISNX1: AOS TAC,DISPNT ;GET NEXT POINTER FROM LIST\r
+ILUP: HRRZM TAC,DISPNT ;UPDATE POINTER POINTER\r
+ ADRCHK TAC\r
+ MOVE TAC,@DISREL ;GET NEXT WORD IN POINTER LIST\r
+ MOVEM TAC,DISBKO ;PLACE IN BLOK POINTER\r
+ HLROM TAC,DISAV1 ;GET NEGATIVE WORD COUNT(MAKE LH NEG. TOO)\r
+IFN T30,<\r
+ JUMPE TAC,EXIT1 ;END OF COMMAND LIST?\r
+ TRNN TAC,-1 ;INTENSITY?\r
+ JRST INTCHK ;YES>\r
+IFE T30,<\r
+ TRNN TAC,-1 ;END OF COMMAND LIST?\r
+ JRST EXIT1 ;YES>\r
+ TLZN TAC,-1 ;NO. POINTER TO NEW LIST?\r
+ JRST ILUP ;YES.\r
+ CAIL TAC,JOBPFI ;NO. ADDRESS IN BOUNDS?\r
+ CAML TAC,DISHI\r
+ JRST EXIT2 ;NO\r
+ SUB TAC,DISAV1 ;YES. ADR. OF LAST WORD IN BLOCK.\r
+ ADRCHK TAC\r
+ HRRZ TAC,DISREL ;FORM ABSOLUTE ADDR\r
+ ADDM TAC,DISBKO ;IN THE BLKO POINTER WORD\r
+ AOS DISNXT ;RETURN 2,4\r
+EXIT1: AOS DISNXT\r
+EXIT2: MOVE TAC,DISAV\r
+ CONO DIS,@DISCON ;SET UP DISPLAY STATUS WORD\r
+ JRST 2,@DISNXT ;...\r
+\r
+IFN T30,<\r
+INTCHK: MOVSS TAC ;PLACE INTENSITY IN CONO WORD\r
+ DPB TAC,INTPNT\r
+ JRST DISNX1 ;GET NEXT POINTER\r
+INTPNT: POINT 3,DISCON,29>\r
+\f\r
+;DISFIN RECEIVES CONTROL WHEN THE DISPLAY'S BLKO POINTER REACHES\r
+; ZERO. IT SAVES THE TWO AC'S WHICH DISNXT USES AND\r
+; DOES A JRST TO DISNXT. ON A NORMAL RETURN IT RESTORES THE\r
+; AC'S AND DISMISSES THE INTERPUT. ON A "NO MORE DATA"\r
+; RETURN IT TRANSFERS CONTROL TO OVT2 FOR FURTHER\r
+; DECISION AS TO WHETHER OR NOT TO CONTINUE DISPLAYING.\r
+\r
+DISFIN: MOVEM TAC,DISAV ;SAVE AC'S\r
+ JSR DISNXT ;SETUP NEXT BLKO POINTER\r
+ JRST ADRER\r
+ JRST DVT2 ;RETURN HERE IF NO NEXT POINTER\r
+ JEN @DISCHL ;LET THE SCOPE DO THE REST\r
+\r
+;DVT2 RECIVES CONTROL AT INTERRUPT LEVEL WHEN THE COMMAND LIST\r
+; (SUPPLIED BY THE USER) RUNS OUT. IT SAVES THE AC'S FOR\r
+; THIS CHANNEL AND IN THE PROCESS ENABLES REUTRNS BY POPJ\r
+; AND SIMILAR GOOD THINGS SINCE IT ALSO STORES THE PC FROM\r
+; THE JSR IN THE GENERAL PC LOCATION FOR THIS CHANNEL\r
+; IF THE DISPLAY IS OFF. IT DOES NOT RESTART IT.\r
+\r
+; IT CHECKS TO SEE IF THE CLOCK HAS RUN OUT BEFORE THE PICTURE;\r
+; IF SO, IT CALLS DISBEG TO RESTART THE DISPLAY WITH A NEW\r
+; COMMAND LIST. IT TURNS OFF THE IO ACTIVE BIT WHICH WAS\r
+; TURNED ON BY THE OUTPUT ROUTINE; THIS INSURES THAT ANY\r
+; OUTPUT COMMAND WILL DISPLAY AT LEAST ONE PICTURE. IF\r
+; THE JOB WAS IN AN IO-WAIT, IT IS RELEASED.\r
+\r
+DVT2: JSR DISSAV ;ASK EXEC TO SAVE AC'S\r
+ MOVEI DEVDAT,DISDDB ;SETUP ACS\r
+ MOVSI TAC,SHF\r
+ MOVSI DAT,NSHF\r
+ LDB ITEM,PJOBN\r
+ PUSHJ PDP,DISOFF\r
+ MOVSI IOS,DISWAT ;INDICATE PICTURES FINISHED\r
+ IORB IOS,DISIOS ;...\r
+ TLON IOS,DISUUI ;RESUME DISPLAY, NEW UUO.\r
+ JRST DVT6 ;YES, STAY IN IO WAIT\r
+ TDNE TAC,JBTSTS(ITEM) ;DOES SYSTEM WANT TO SHUFFLE THIS JOB?>\r
+ JRST DVT4 ;YES\r
+ TLNE IOS,DISTAR ;HAS CLOCK TRIGGERED?\r
+ PUSHJ PDP,DISBEG ;YES, RESTART DISPLAY\r
+ JRST DVT3\r
+DVT4: TLNE IOS,DISTAR ;DID CLOCK FINISH BEFORE PICTURE?\r
+ PUSHJ PDP,CLKREQ ;YES, PUT IN CLOCK REQUEST.\r
+DVT5: ANDCAM DAT,JBTSTS(ITEM) ;TURN OFF NSHF SO JOB CAN BE SHUFFLED\r
+DVT3: MOVE IOS,DISIOS ;BIT FIDDLING TIME\r
+ TRZ IOS,IOACT ;SIGNAL DISPLAY CAN BE CLOSED\r
+ TLZE IOS,IOW ;IS DISPLAY CAUSING AN IO-WAIT?\r
+ PUSHJ PDP,SETIOD ;UNWAIT THE JOB\r
+ MOVEM IOS,DISIOS ;RESTORE IO CONTROL WORD\r
+ JRST DISRET ;RESTORE AC'S AND DISMISS\r
+DVT6: MOVEM IOS,DISIOS\r
+ PUSHJ PDP,DISBEG ;START NEW COMMAND LIST\r
+ JRST DISRET\r
+\f\r
+;DISREG IS CALLED WITH A PUSHJ PDP,DISBEG, IT DISABLES THE\r
+; DISPLAY ITSELF (BY USING DISOFF) AND ALSO DISABLES THE\r
+; CLOK RESTART AND RESETS THE POINTER TO THE USER'S\r
+; COMMAND LIST TO THAT SPECIFIED ON THE LAST OUTPUT\r
+; MINUS ONE. IT ASKES DISNXT TO SET UP THE NEXT BLKO POINTER\r
+; IF DISNXT IS UNSUCCESSFUL (I.E., IF THE USER COMMAND LIST\r
+; IS NULL), THEN THE ROUTINE DOES A CLOSE. OTHERWISE, A\r
+; REQUEST IS ENTERED FOR A CLOCK INTERRUPT AT THE END OF \r
+; AT MOST TWO JIFFIES. THIS CLOCK QUEUE REQUEST IS ENTERED\r
+; ONLY IF THERE IS NONE ALREADY IN THE QUEUE. THE PI\r
+; CHANNELS FOR THE DISPLAY ARE TURNED ON AGAIN AND THE\r
+; DISPLAY IS INITIALIZED BY A CONO. IT SHOULD THEN REQUEST\r
+; DATA AS SOON AS THE PI CHANNEL FOR THE BLKO IS TURNED ON.\r
+; IT TURNS THIS CHANNEL ON AND RETURNS TO ITS CALLER.\r
+\r
+DISBEG: MOVSI IOS,DISTAR+DISWAT ;INDICATE FRESH DISPLAY\r
+ ANDCAM IOS,DISIOS ;...\r
+ HRRZ TAC1,DISONE ;GET POINTER LIST ADDR (-1)\r
+ HRRZM TAC1,DISPNT ;RESET POINTER POINTER WITH IT\r
+ JSR DISNXT ;ASK FOR FIRST WORD FOR BLKO\r
+ JRST ADRER1\r
+ JRST DISSTP ;NULL LIST, CLOSE\r
+ PUSHJ PDP,CLKREQ ;ENTER CLOCK QUEUE REQUEST\r
+ CONO DIS,@DISCON ;INITIALIZE THE DISPLAY\r
+ MOVEI TAC,PENON ;ALLOW SPECIAL PI INTERRUPTS\r
+ HRRM TAC,PENINT ;...\r
+ CONO PI,DISPON ;ALLOW BLKO INTERRUPTS\r
+ POPJ PDP, ;RETURN\r
+\r
+CLKREQ: MOVSI IOS,DISCKR ;IF NO CLOCK INTERRUPT REQUESTED\r
+ MOVE TAC,CLOKRT ;RESET TIMER\r
+ CONO PI,PIOFF ;INHIBIT INTERRUPTS\r
+ TDON IOS,DISIOS ;ENTER ONLY A SINGLE CLOCK REQUEST\r
+ IDPB TAC,CLOCK ;PLACE REUQEST IN QUEUE\r
+ IORM IOS,DISIOS ;PROTECT AGAINST A DUPLICATE REQUEST\r
+ CONO PI,PION ;UNINHIBIT INTERRUPTS\r
+ POPJ PDP, ;RETURN\r
+\r
+CLOKRT: XWD CLOK,2 ;CONTROL FOR CLOCK QUEUE: 2 JIFFIES\r
+ ;TWO JIFFIES\r
+\f\r
+;CLOK IS CALLED AT THE CLOCK LEVEL IN RESPONSE TO A REQUEST\r
+; IN THE CLOCK QUEUE. A BIT IS SET TO INDICATE THAT THE\r
+; CLOCL PERIOD HAS ELAPSED. IF THE DISPLAY IS STILL IN\r
+; PROGRESS, CLOK RETURNS AT THIS POINT. OTHERWISE, CLOK\r
+; GOES TO DISBEG TO START UP THE DISPLAY. DISBEG RETURNS\r
+; WITH A POPJ PDP,\r
+\r
+CLOK: MOVSI IOS,DISCKR ;INDICATE CLOCK REQUEST SERVICED\r
+ ANDCAB IOS,DISIOS ;...\r
+ TLDE IOS,DISUUI\r
+ MOVSI IOS,DISTAR ;ASK DISPLAY TO RESTART\r
+ IORB IOS,DISIOS ;...\r
+ TLNN IOS,DISWAT ;HAS DISPLAY FINISHED?\r
+ POPJ PDP, ;NO. WIAT FOR IT TO DO SO\r
+ MOVEI DEVDAT,DISDDB\r
+ MOVSI TAC,NSHF\r
+ LDB ITEM,PJOBN\r
+ TDNE TAC,JBTSTS(ITEM) ;IS SHUFFLE LOCKED OUT?\r
+ JRST DISBEG ;YES, RESTART DISPLAY AND RETURN\r
+\r
+ IORM TAC,JBTSTS(ITEM) ;NO. LOCK IT OUT.\r
+ MOVE TAC,JBTADR(ITEM) ;RESET DISHI AND DISREL AFTER SHUFFLING\r
+ HLRZM TAC,DISHI\r
+ HRRM TAC,DISREL\r
+ JRST DISBEG ;RESART DISPLAY AND RETURN\r
+\r
+;ADRER SERVICES PROTECTION VIOLATIONS DISCOVERED BY DISNXT.\r
+; IT DOES A CLOSE AND THEN CALLS THE MONITOR'S ERROR PRINTING\r
+; ROUTINES TO INFORM THE USER.\r
+\r
+ADRER: JSR DISSAV ;SAVE AC'S AGAIN\r
+ADRER1: PUSHJ PDP,DISDSP+DCL ;DO A CLOSE\r
+ MOVEI DEVDAT,DISDDB ;TELL ERROR ROUTINE WHO'S UNHAPPY\r
+ JRST ADRERR ;GO GRIPE\r
+;DISIN HANDLES LITE PEN UUO (INPUT) IN A RUDIMENTARY FASHION\r
+; BY RETURNING (TO THE ADDR SPECIFIED BY THE ADDR FIELD\r
+; OF THE INPUT UUO) THE LAST PEN COORIDNATES SEEN,\r
+\r
+DISIN: MOVNI TAC,1\r
+ EXCH TAC,PENLOC ;GET LATEST COORDINATES,\r
+ JRST STOTAC ;STORE AND RETURN\r
+\f\r
+;DISOUT DOES THE WORK OF THE OUTPUT UUO. IT SETS A BIT TO\r
+; INDICATE THAT THE DEVICE IS ACTIVE AND INHIBITS\r
+; INTERUPTS WHICH MAY STILL BE IN PROGRESS. SINCE THE\r
+; MONITOR CALLS WSYNCE BEFORE COMING HERE. THE USER IS\r
+; GUARANTEED AT LEAST ONE PICTURE/OUTPUT. THE USERS MEMORY\r
+; BOUNDS ARE STORED FOR QUICK USE AT INTERRUPT LEVEL W/0\r
+; SAVING AC'S. THE LOCATION OF THE COMMAND LIST (-1) IS\r
+; STORED FOR USE IN SETTING UP BLKO POINTERS. THE PI\r
+; LOCATIONS (40 + 2J) ARE INITIALIZED WITH A BLKO IN\r
+; THE EVEN LOCATIONS AND A JSR TO DISFIN IN THE ODD LOCATION,\r
+; THE NON-DATA CHANNEL CONSO IS SETUP TO BELIEVE IN THE\r
+; A POPJ PDP, IT RETURNS ON BEHALF OF THE OUTPUT UUO.\r
+\r
+DISOUT: TLO IOS,IO+DISWAT ;INDICATE OUTPUT; REQUEST START UP\r
+ TRO IOS,IOACT ;INDICATE DEVICE ACTIVE\r
+ SUBI UUO,1 ;ALLOW FOR INCREMENT AT INTERRUPT\r
+ MOVE TAC,BLKLIT ;FEEDS WORDS TO THE DISPLAY\r
+ MOVEM TAC,DISBLK ;FROM EVEN NUMBERED INTERRUPT LOC\r
+ MOVE TAC,JSRLIT ;SERVICE THE END OF BLKO\r
+ MOVEM TAC,DISJSR ;FROM ODD INTERRUPT LOC\r
+ MOVEI TAC,PENON ;SETUP CONSO BITS ON SPECIAL CHANNEL\r
+ HRRM TAC,PENINT ;...\r
+ IORB IOS,DISIOS ;SET IOACT ON; INDICATE OUTPUT\r
+ HRRZM UUO,DISONE ;SET NEW COMMAND LIST ORIGIN\r
+ MOVSI IOS,DISUUI\r
+ IORM IOS,DISIOS ;ALLOW DISPLAY\r
+ CONSZ DIS,@DISCON ;DISPLAY ALREADY IN USE\r
+ ANDCAM IOS,DISIOS\r
+ JRST CLKREQ ;ENTER CLOCK QUEUE REQUEST AND POPJ\r
+\r
+BLKLIT: BLKO DIS,DISBKO\r
+JSRLIT: JSR DISCHL\r
+ END\r
+ \r
+ \r
--- /dev/null
+;PARAMETER FILE FOR DISSER.MAC\r
+;USED ONLY TO ASSEMBLE DISSER TO MAKE TYPE 30 SERVICE INSTEAD OF TYPE 340\r
+\r
+T30=1 ;FLAG THAT TYPE 30 IS WANTED\r
--- /dev/null
+TITLE DLSINT - INT. SERV. FOR DLS (DATA LINE SCANNER DC10)\r
+SUBTTL M.FREDRIKSEN/RCC TS 01 JUN 69 V005\r
+XP VDLSIT,005\r
+ ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+;MODULAR HARDWARE INTERFACE WITH EITHER SCNSER OR TTYSER\r
+\r
+EXTERN TYPX\r
+\r
+IFE FTTTYSER,<XP FULTWX,200000>\r
+\r
+IFN FTTTYSER,<XP FULTWX,4>\r
+\r
+;ACCUMULATOR ASSIGNMENTS\r
+\r
+ CHREC=TEM ;AC FOR CHARACTER\r
+ DDB=DEVDAT ;ADDRESS OF DEVICE DATA BLOCK\r
+ LINE=TAC1 ;SCANNER LINE NUMBER\r
+ HPOS=DAT ;HORIZONTAL POSITION OF TTY.(0-71)\r
+\r
+;BYTE POINTERS\r
+\r
+EXTERNAL PLASTC\r
+\r
+\r
+DLS=240 ;DC10 DEVICE NUMBER\r
+;BITS IN CHREC TO COMMUNCATE WITH DLS\r
+\r
+USDRLN=100 ;USE DIRECTED LINE NUMBER\r
+TDSABL=400 ;TRANSMIT DISABLE\r
+RCVBIT=400 ;RECEIVE BIT AFER DATAI DLS,CHREC\r
+\f\r
+;DEVICE DEPENDENT PORTION OF INITIALIZATION CODE\r
+;CALL: MOVEI TAC,CHANNEL NUMER\r
+; PUSHJ PDP,SCNINI\r
+\r
+INTERNAL SCNINI\r
+DLSINI:\r
+SCNINI: CONO DLS,40 ;INIT DLS COMPLETELY (I/O/RESET)\r
+ CONO DLS,(TAC) ;ASSIGN PI CHANNEL NUMBER\r
+ POPJ PDP,\r
+\r
+;SCANNER INTERRUPT SERVICE ROUTINE\r
+\r
+ENTRY DLSINT\r
+\r
+INTERNAL SCNINT\r
+EXTERNAL SCNSAV,TCONLN,TTYTAB,XMTINT,TYPE,INUS2,RECINT\r
+\r
+DLSINT:\r
+SCNINT: CONSO DLS,30 ;ANY INTERRUPTS ON DLS\r
+ JRST SCNINT ;NO\r
+ JSR SCNSAV\r
+ DATAI DLS,CHREC ;GET CHARACTER & LINE INFO\r
+ HLRZ LINE,CHREC ;PUT LINE NUMBER IN AC LINE\r
+ CAIL LINE,TCONLN ;ARE WE ENABLED FOR THIS LINE NUMBER?\r
+ JRST SCNIN2 ;NO,TURN OFF TRANSMIT(IF ON) AND DISMISS\r
+ TRNE CHREC,RCVBIT ;WAS IT A RECEIVER INTERRUPT?\r
+ JRST RECINT ;YES, RECEIVER INT. HANDLER\r
+ DATAO DLS,[EXP TDSABL] ;CLEAR HARDWARE FLAG\r
+ JRST XMTINT ;GO PROCESS CHAR IN SCNSRF OR SCNSRH\r
+\f\r
+;COMMON PARTS OF CTY AND SCANNER INTERRUPT SERVICE ROUTINES.\r
+\r
+EXTERNAL INJEST,DDBSRC\r
+INTERNAL TCOMM\r
+\r
+TCOMM:\r
+ SKIPE DDB,TTYTAB(LINE) ;DATA BLOCK ASSIGNED?\r
+ JRST INUSE ;YES\r
+ PUSHJ PDP,DDBSRC ;SEARCH FOR FREE TTY DEV. DATA BLOCK\r
+ JRST TYPX ;NONE FOUND, TYPE X\r
+ MOVEI HPOS,0 ;ASSUME TTY IS AT BEGIN OF FORM\r
+ CAILE LINE,TCONLN ;PSEUDO CONSOLE?\r
+ JRST INJEST ;YES\r
+ CAIN LINE,TCONLN ;IS IT THE CTY ?\r
+ JRST INUS2 ;YES, ACCPT CHAR AND PROCESS\r
+ JRST TYPE ;NO, ECHO CHAR ON FULL DUPLEX\r
+ ;BEFORE PROCESSING IT\r
+\r
+ ;HERE IF LINE NUMBER TOO BIG\r
+SCNIN2: DATAO DLS,[EXP TDSABL] ;SET TRANSMIT DISABLE BIT AND OUTPUT IT\r
+ ;(JUST INCASE, ELSE IT WILL INTERRUPT IMMEDIATLY AGAIN)\r
+ POPJ PDP, ;DISMISS INTERRUPT\r
+\f\r
+\r
+;COMMON TO RECEIVE AND TRANSMIT.\r
+\r
+INUSE: HRRZS DDB ;LINE DISABLED IF RH TTYTAB=-1\r
+ CAIN DDB,-1\r
+ POPJ PDP,\r
+ MOVE IOS,DEVIOS(DDB) ;SETUP IOS\r
+ CAIL LINE,TCONLN ;CTY OR PTY ?\r
+ JRST INUS2 ;YES\r
+ TLNE IOS,FULTWX ;IS THIS SELF ECHOEING FULL DUPLEX?\r
+ JRST INUS2 ;YES,(USER TYPED CONROL B)\r
+ HRL CHREC,LINE ;INSERT LINE NUMBER IN DATAO\r
+ TLO CHREC,USDRLN\r
+ TRZ CHREC,TDSABL\r
+ DATAO DLS,CHREC\r
+ DPB CHREC,PLASTC\r
+ POPJ PDP, ;DISMISS INTERRUPT\r
+\r
+;ROUTINE TO OUTPUT A CHARACTER ON A LINE\r
+;CALLED FROM TYP OR TYPL IN SCNSER\r
+\r
+INTERNAL SCNTYP\r
+\r
+SCNTYP:\r
+DLSTYP: HRL CHREC,LINE ;SET UP LINE NUMBER IN CHREC\r
+ TLO CHREC,USDRLN ;USE THAT AS DIRECTED LINE#\r
+ TRZ CHREC,TDSABL ;INSURE TRANSMISSION NOT DISABLED\r
+ DATAO DLS,CHREC ;OUT IT GOES\r
+ SKIPE DDB\r
+ DPB CHREC,PLASTC ;SAVE CHAR FOR FULL DUPLEX\r
+ POPJ PDP,\r
+\r
+ LIT\r
+\r
+DLSEND: END\r
--- /dev/null
+TITLE DPDINT - DATA PRODUCTS DISK INTERRUPT SERVICE\r
+SUBTTL A. BLACKIGNTON/CMF TS 12 JAN 69 V401\r
+ XP VDPDIT,401\r
+\r
+DCB=204 ;DATA-CONTROL-B\r
+DF=270 ;DISK-FILE\r
+DSK=DF\r
+\r
+;THIS NEXT CONSTANT MUST BE SET TO MATCH CAPACITY OF THE PARTICULAR DISK FILE---\r
+INTERNAL LBHIGH ;HIGHEST LEGAL LOGICAL BLOCK NUMBER\r
+LBHIGH: 130000-1\r
+\r
+;START A WRITE ON DISK FILE\r
+\r
+;AT ENTRY, C(TAC 18-35)= LOGICAL BLOCK NUMBER\r
+; C(TAC1) = IOWD\r
+\r
+INTERNAL DFWRT,DFRED\r
+EXTERNAL DSKX8,DCBBIT,DSKBIT,DSKCHN,DCBCHN.ERRPNT,DSKX9\r
+ENTRY LDDINT\r
+LDDINT:\r
+\r
+DFWRT:\r
+DFWRT1: MOVEM TAC1,IOWRD\r
+ MOVE TAC1,[BLKO DCB,IOWRD]\r
+ JSR DFRW ;SET UP DISK ADDRESS\r
+\r
+ TLO TAC,WLE ;ENABLE WRITE LOCK ERROR\r
+ HRRI TAC,DSKCHN ;TURN ON DISK\r
+ IORI TAC,WRT+CLE+EIS+ENE\r
+ STARTDV DSK\r
+ HRRZI TAC,DCBCHN\r
+ CONO DCB,OUT+DAR+BR+P18+DFNUM(TAC) ;TURN ON DATA-CONTROL-B\r
+ POPJ PDP,\r
+;SIMILAR ROUTINE FOR READ\r
+\r
+DFRED:\r
+DFRED1: MOVEM TAC1,IOWRD\r
+ MOVE TAC1,[BLKI DCB,IOWRD]\r
+ JSR DFRW\r
+\r
+ HRRI TAC,DSKCHN\r
+ IORI TAC,RED+CLE+EIS+ENE ;TURN ON DISK\r
+ STARTDV DSK\r
+ POPJ PDP,\r
+\f\r
+;SERVICE INTERRUPT ON DATA-CONTROL-B\r
+\r
+INTERNAL FTCHECK,FTMONP\r
+IFE FTCHECK+FTMONP,<\r
+INTERNAL DCBINT\r
+\r
+DCBINT: Z\r
+>\r
+DCBIN1: MOVEM TAC,ACSAV\r
+ HRRZI TAC,DCBBIT\r
+ CONO PI,1000(TAC) ;TURN OFF DCB CHANNEL\r
+ CONI DCB,DCBERR ;SAVE STATUS OF DATA CONTROL\r
+ HRRZI TAC,DSKCHN\r
+ CONSO DCB,OUT ;SKIP IF WRITING\r
+ CONO DF,END+EIS(TAC)\r
+ MOVE TAC,ACSAV\r
+ JEN @DCBINT\r
+JSRDBC: JSR DCBINT ;JSR STORED IN INTERRUPT CELL\r
+\r
+;DISK & DCB FLAGS\r
+\r
+ADE=1B29 ;ADDRESS ERROR\r
+ADT=1B20 ;ADDRESS TERMINATED\r
+ALM=1B30 ;ALARM\r
+CME=1B27 ;COMMAND ERROR\r
+DCE=1B26 ;DATA CLOCK ERROR\r
+MISS=1B23 ;DATA MISSED FLAG\r
+DRLATE=1B31 ;DATA REQUEST LATE\r
+RCE=1B32 ;READ COMPARE ERROR\r
+PAR=1B33 ;PARITY ERROR\r
+IDS=1B18 ;IDLE STATE (1 IF IDLE)\r
+NOPR=1B35 ;OPERABLE (1 IF NOT)\r
+WLE=1B28 ;WRITE-LOCK ERROR\r
+OUT=1B27 ;OUTPUT INDICATION\r
+CLE=1B28 ;CLEAR ERROR FLAGS\r
+FER=1B34 ;FILE ERROR\r
+DVERAS=DRLATE+RCE+PAR+ADE+CME+DCE+ALM+NOPR+FER\r
+BR=1B26 ;BUFFER REQUEST FLAG FOR DCB\r
+DAR=1B25 ;DATA ACCUMULATOR REQUEST\r
+DFNUM=5B32 ;DISK NUMBER DOR DATA CONTROL\r
+END=1B23 ;END-SECTOR\r
+EIS=1B32 ;ENABLE IDLE STATE\r
+XMOVE=1B24 ;BUFFER ACCUMULATOR MOVE FLAG\r
+P18=3B29 ;PACK 2 18-BIT BYTES\r
+RED=1B26 ;READ INDICATOR\r
+WRT=2B26 ;WRITE INDICATOR\r
+ENE=1B29 ;ENABLE ERROR INTERRUPT\r
+\f\r
+;INTERRUPT ROUTINE TO HANDLE SECTOR-END FLAG.\r
+;CHECK FOR ERRORS. IF THE JOB IS COMPLETED (SIOWD = 0), GO TO\r
+;DEVICE INDEPENDENT PACKAGE, ELSE CONTINUE THE JOB.\r
+\r
+INTERN DSKINT\r
+EXTERNAL DFINT,DSKSAV\r
+\r
+DSKINT: CONSO DF,@DSKCON\r
+ JRST DSKINT ;ALTERED BY INITIALIZATION\r
+ JSR DSKSAV\r
+ HRRZI TAC,DCBBIT\r
+ CONO PI,1000(TAC) ;MAKE SURE DCB IS OFF\r
+ HLLZS DSKCON\r
+ MOVEI IOS,0\r
+ SKIPE DSKIOS ;ERROR WAIT?\r
+ JRST DSKIN3 ;YES\r
+ MOVEI TAC1,DVERAS\r
+ CONSZ DCB,OUT\r
+ TRO TAC1,WLE\r
+\r
+ CONSZ DF,(TAC1) ;ERROR?\r
+ SETZM SIOWD ;YES, DO NOT DO MORE NOW\r
+ MOVE TAC,DCBERR ;PICK UP DATA-CONTROL STATUS\r
+ TRNN TAC,MISS ;DATA-MISSED FLAG ON?\r
+ CONSZ DF,DVERAS-PAR ;NO, DISK ERRORS?\r
+ ORI IOS,IODERR ;YES, SET DEVICE ERROR FLAG.\r
+ CONSZ DF,PAR ;PARITY ERROR?\r
+ IORI IOS,IODTER ;YES\r
+ TRZ TAC1,DVERAS\r
+ CONSZ DF,(TAC1) ;WRITE-LOCK?\r
+ ORI IOS,IOIMPM ;YES\r
+ CONO DF,CLE ;CLEAR DISC ERRORS\r
+ JUMPN IOS,DSKIN2\r
+ SKIPN SIOWD ;JOB DONE?\r
+ JRST DFINT ;YES, RETURN TO DEV, INDEP, ROUT.\r
+ ;WITH ERROR FLAGS\r
+\r
+ MOVE TAC,SRECN ; AND BLOCK NUMBER\r
+ ADDI TAC,1\r
+ IMULI TAC,^D44\r
+ MOVE TAC1,SIOWD\r
+ CONSO DCB,OUT\r
+ JRST DFRED1\r
+ JRST DFWRT1\r
+\f\r
+DSKIN2:\r
+ HRRZI TAC,DSKCHN\r
+ CONO DF,END+EIS(TAC) ;SEND END AND ENABLE FOR IDLE\r
+ ;FOLLOWING ERROR\r
+ MOVEM IOS,DSKIOS ;SAVE ERROR FLAGS\r
+ MOVEI IOS,IDS+DVERAS\r
+ HRRM IOS,DSKCON\r
+ POPJ PDP,0 ;DISMISS\r
+\r
+DSKIN3: MOVE IOS,DSKIOS ;PICK\r
+ CONO DF,0\r
+ JRST DFINT\r
+\f\r
+;SET UP FOR READ AND WRITE\r
+\r
+IFE FTCHECK+FTMONP,<\r
+DFRW: Z\r
+>\r
+DFRW1: MOVEM TAC1,DSKX8 ;SET UP INTERRUPT LOC\r
+\r
+;CONVERT FROM LOGICAL TO PHYSICAL SECTOR NUMBER.\r
+;ENTER WITH LOGICAL NUMBER IN TAC\r
+\r
+CNVBLK: MOVEM TAC,SLBLK\r
+CNVBK2: HRRZS TAC\r
+IFN FTRCHK,<\r
+ CAMLE TAC,LBHIGH ;LOGICAL BLOCK NUMBER IN RANGE\r
+ ;(COMPARE WITH HIGHEST LEGAL)?\r
+ HALT CNVERR ;NO, HALT - IF CONTINUE PUSHED,\r
+ ;THEN FLAG AS DEVICE ERROR\r
+>\r
+ IDIVI TAC,^D44\r
+\r
+ MOVEM TAC,SRECN ;SAVE THE BLOCK NUMBER\r
+ SETZM SIOWD ;CLEAR SAVED IOWD\r
+ LSH TAC,6\r
+ ADD TAC,TAC1\r
+ CONO DCB,0 ;INSURANCE\r
+ DATAO DF,TAC ;SEND OUT ADDRESS \r
+ HLRZ TAC,IOWRD ;WILL THIS I/O CAUSE A CHANGE\r
+ CAIL TAC,-200 ; IN POSITION ARM DURING READ OR\r
+ JRST CNVBK1 ; WRITE?\r
+ SUBI TAC1,^D44 ;MAYBE.\r
+ LSH TAC1,7\r
+ CAIL TAC,(TAC1)\r
+ JRST CNVBK1 ;NO, GO AHEAD AS IS.\r
+\r
+ MOVE TAC,IOWRD ;PUT SMALLER SIZE IN IOWD.\r
+ HRLM TAC1,IOWRD\r
+ MOVMS TAC1 ;STASH AWAY NEXT.\r
+ HRLS TAC1\r
+ ADD TAC,TAC1\r
+ MOVEM TAC,SIOWD\r
+\r
+CNVBK1: CONSO DF,ADT ;ADDRESS GO OK?\r
+ JRST .-1 ;WAIT FOR IT\r
+ HRRZI TAC,DCBBIT\r
+ CONO PI,2000(TAC) ;TURN ON DCB CHANNEL\r
+ MOVSI TAC,IDS+DVERAS\r
+ SETZM DSKIOS\r
+ JRST @DFRW\r
+IFN FTRCHK,<\r
+CNVERR: MOVEI IOS,IODERR ;HERE ONLY IF OPERATOR PUSHES CONTINUE\r
+ JRST DFINT ;FLAG AS DEVICE ERROR\r
+>\r
+; WAIT FOR DISK TO BE TURNED ON\r
+\r
+INTERNAL DISKUP\r
+\r
+DISKUP: SETZM DSKX8 ;ZERO THE BLKI/BLKO WORD\r
+ MOVE TAC,JSRDCB\r
+ MOVEM TAC,DSKX9 ;STORE JSR EXECUTED ON BLKI/BLKO COMPLETION\r
+ CONSZ DF,NOPR\r
+ JRST .-1\r
+ HRRZI TAC,DSKBIT\r
+ IORI TAC,DCBBIT\r
+ CONO PI,2200(TAC)\r
+ POPJ PDP,\r
+\r
+IFN FTCHECK+FTMONP,<\r
+EXTENRAL SRECN,SIOWD,DSKIOS,SLBLK,DFRW,ACSAV,DCBERR,DCBINT,IOWRD,DSKCON\r
+INTERNAL DCBIN1,DFRW1\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+INTERNAL DSKCON\r
+SRECN: Z ;SAVE OF BLOCK NUMBER\r
+SIOWD: Z ;NEXT IOWD TO USE\r
+DSKIOS: Z ; ERROR FLAGS\r
+SLBLK: Z ;LOGICAL BLOCK NUMBER LAST SELECTED\r
+ ;CLEARED ON EACH CALL TO DFWRT OR DFRED\r
+\r
+DSKCON: 0\r
+IOWRD: 0\r
+DCBERR: 0\r
+ACSAV: 0\r
+<>\r
+DPDEND: END\r
+\r
+\r
--- /dev/null
+TITLE DSKINT - PDP-10 RC-10 DISK INTERRUPT SERVICE V403S\r
+SUBTTL A. FRANTZ/TH TS 5 FEB 69\r
+ XP VDSKIT,403\r
+ ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+ENTRY RCXINT ;THIS SYMBOL IS SOLELY TO PERMIT SYSTEM\r
+RCXINT: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE.\r
+\r
+INTERNAL DSKINT,DFWRT,DFRED,DSKFDG,DISKUP,FTCHECK,FTMONP,FTRCHK\r
+ \r
+EXTERNAL DSKCHN,DSKBIT,DSKSAV,DFINT,RCXIOC,RCXCCW\r
+\r
+DSK=170 ;DEVICE NUMBER ASSIGNED TO THE MODEL RC-10 DISK SYNCHRONIZER.\r
+\r
+\r
+;CONI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --\r
+\r
+;BITS 00 - 17 MAINTENANCE PANEL SWITCH SETTINGS INDICATORS --\r
+ ;BITS 00 - 04 UNUSED\r
+MSS=1B5 ;SET INDICATES "MAINTENANCE SEGMENT SELECTED" (SEGMENT 81),\r
+PLGSW=1B6 ;1 = WRITE-PROTECT EVERYTHING BELOW (LESS THAN) THE BOUNDARY,\r
+ ; 0 = WRITE-PROTECT EVERYTHING ABOVE (GREATER THAN) BOUNDARY,\r
+ ;THE CURRENT IMPLEMENTATION OF THE RC-10 DISK SYNCHRONIZER\r
+ ; DOES NOT PERMIT SENSING THE INCLUSION OF THE BOUNDARY.\r
+ ;BITS 07 - 17 THE WRITE-PROTECTION THE INCLUSION OF THE BOUNDARY.\r
+DTOP=1B18 ;SET INDICATES DATA TRANSFER IN PROGRESS.\r
+;BITS 19 -29 ERROR CONDITIONS INDICATORS (ERROR WHEN SET) --\r
+ SRCHE=1B19 ;SEARCH ERROR (DISK TIMING TRACK PROBLEMS!!)\r
+ DDE=1B20 ;DISK DESIGNATION ERROR\r
+ TSE=1B21 ;TRACK SELECT ERROR (OR EXCEEDS SYSTEM CAPACITY)\r
+ NRDY=1B22 ;DISK NOT READY (OR NON-EXISTENT DISK REFERENCED)\r
+ PSF=1B23 ;POWER SUPPLY FAILURE\r
+ DPAR=1B24 ;DISK PARITY ERROR\r
+ CHDPAR=1B25 ;CHANNEL DATA PARITY ERROR\r
+ CHCPAR=1B26 ;CHANNEL CONTROL PARITY ERROR\r
+ NXMEM=1B27 ;NON-EXISTENT MEMORY REFERENCED\r
+ WRPE=1B28 ;ATTEMPTED TO WRITE IN PROTECTED DISK AREA (SEE BITS 06 - 17)\r
+ OVR=1B29 ;OVERRUN, I.E., MEMORY DIDN'T RESPOND QUICKLY ENOUGH\r
+;BIT 30 CHANNEL CONTROL WORD WRITTEN IN MEMORY (THIS BIT IS\r
+ ;TURNED ON ON ALMOST ALL TERMINATIONS.)\r
+BUSYBT=1B31 ;BUSY (SYNCHRONIZER PERFORMING A COMMAND SEQUENCE)\r
+DONEFLG=1B32 ;DONE -- THIS ACTUALLY CAUSES THE INTERRUPT.\r
+;BITS 33 - 35 PI CHANNEL SELECTION BITS.\r
+\r
+;COMBINATIONS OF ERRO BITS GROUPED BY TYPE --\r
+DATERR=DPAR!CHDPAR ;DATA ERRORS.\r
+DEVERR=SRCHE!PSF!CHCPAR!OVR ;DEVICE ERRORS.\r
+SETERR=DDE!TSE!NRDY!NXMEM ;SOFTWARE-PREVENTABLE ERRORS.\r
+ALLERR=DATERR!DEVERR!SETERR!WRPE ;ALL POSSIBLE ERRORS.\r
+\f\r
+;CONO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER\r
+\r
+;BITS 00 - 17 UNUSED\r
+;BITS 18 - 19 SELECT DISK FOR SECTOR COUNTER READ-OUT A(SEE DATAI BITS 28-35)\r
+;BITS 20 - 29 RESET THE CORRESPONDING CONI ERROR BIT\r
+ ;(BUT PSE MAY REFUSE TO BE RESET)\r
+WRCCWD=1B30 ;WRITE THE CHANNEL CONTROL WORD INTO MEMORY (NOW!)\r
+STPBIT=1B31 ;STOP -- IMMEDIATELY CEASE PRESENT I/O AND CLEAR THE CHANNEL.\r
+RESETB=1B32 ;RESET THE DONE FLAG (CORRESPONDING CONI BIT) TO CLEAR INTERRUPT\r
+;BITS 33 - 35 PI CHANNEL SELECTION BITS\r
+\r
+;DATAI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --\r
+\r
+;BITS 00 - 17 UNUSED\r
+;BITS 18 - 23 PARITY REGISTER\r
+;BITS 24 - 25 UNUSED\r
+;BITS 26 - 27 DISK SELECTED BY BITS 18-19 OF LAST CONO\r
+;BITS 28 - 35 CURRENT SECTOR POSITION OF SELECTED DISK (FOR LATENCY OPTIMIZATION!)\r
+\r
+;DATAO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --\r
+\r
+;BITS 00 - 17 DISK ADDRESS ELECTION\r
+ ;BITS 00 - 01 DISK SELECT\r
+ ;BITS 02 - 10 TRACK SELECT (BCD, BUT FIRST CHAR IS JUST 1 BIT)\r
+ ;BITS 11 - 17 SEGMENT SELECT (BCD, BUT FIRST CHAR HAS ONLY 3 BITS)\r
+;BITS 18 - 23 INITIAL PARITY REGISTER SETTING 9ZERO EXCEPT FOR DIAGNOSTIC PROGRAMS)\r
+DDSKPE=1B24 ;DISABLE DISK PARITY ERROR STOP\r
+DCHNPE=1B25 ;DISABLE CHANNEL DATA PARITY ERROR STOP\r
+WRBIT=1B26 ;SET MEANS WRITE ON DISK, RESET MEANS READ FROM DISK\r
+;BITS 27 - 34 ;CORRESPONDING BITS OF INITIAL CHANNEL CONTROL ADDRESS, HENCE,\r
+ ; THIS ADDRESS MUST BE EVEN AND IN THE FIRST 1K OF CORE MEMORY!\r
+;BIT 35 ;WRITE EVEN PARITY DATA INTO MEMORY (DIAGNOSTICS ONLY!)\r
+\f\r
+;SUBROUTINE "DFWRT" IS CALLED TO START UP A WRITE ON THE DISK.\r
+\r
+;CALLING SEQUENCE --\r
+; PUSHJ PDP,DFWRT\r
+; RETURN WHEN WRITE HAS BEEN STARTED.\r
+;ENTRY CONDITIONS --\r
+; C(TAC 18-35) = LOGICAL BLOCK NUMBER AT WHICH TO START WRITING,\r
+; C(TAC1) = IOWD, I.E.,\r
+; C(TAC1 00-17) = 2'S COMPLEMENT OF WORD COUNT TO BE WRITTEN\r
+; C(TAC1 18-25) = ADDRESS OF FIRST DATA WORD TO BE WRITTEN\r
+;EXIT CONDITIONS --\r
+; THE REQUESTED WRITE HAS BEEN BEGUN\r
+; TAC AND TAC1 HAVE BEEN DESTORYED\r
+\r
+DFWRT: CONSZ DSK,BUSYBT ;FOR SAFETY SAKE BE SURE THE DISK IS\r
+ JRST .-1 ; FREE NOW (THIS MAY BE A REDUNDANT CHECK).\r
+ MOVEM TAC1,WRCHNL ;SET UP CHANNEL COMMAND SEQUENCE.\r
+ SETZM WRCHNL+1 ;MAKE SURE NEXT COMMAND IS 0, SO CHANNEL\r
+ ; WILL NOT WRITE ALL OVER DISK\r
+\r
+IFN FTRCHK,<\r
+ EXTERN SATM2\r
+ MOVEI TAC1,1(TAC1) ;CLEAR LH AND COMPARE WITH\r
+ ; FIRST WORD AFFECTED\r
+ CAIG TAC1,SATM2 ;COMPARE ABS CORE ADDRESS TO BEGINNING\r
+ ;OF SAT TABLE-2\r
+ HALT . ;HALT - DO NOT WRITE OUT MONITOR - CONTINUE\r
+ ;WILL LOOP\r
+>\r
+ MOVEI TAC1,WRCHNL\r
+ MOVEM TAC1,RCXIOC ;RCX10C IS MAGIC EVEN LOCATION IN FIRST 1K OF CORE.\r
+ PUSHJ PDP,CNVBLK ;CONVERT LOGICAL BLOCK NO. INTO PHYSICAL DISK ADDRESS.\r
+ ORI TAC,WRBIT ;REQUEST WRITE (INSTEAD OF READ)\r
+DFWRTC: ORI TAC,RCXIOC\r
+ MOVEM TAC,DFORDR ;SAVE RC-10 DATAO COMMAND\r
+DSKFDG: HRRZI TAC,DSKCHN ;THIS INSTRUCTION TEMPORARILY ALTERED DURING "ONCE".\r
+ IORI TAC,ALLERR!RESETB\r
+ HRLI TAC,DONEFLG ;TO SET INTERRUPT CONDITIONS IN DSKCON.\r
+;READY THE DISK SYNCHRONIZER ---\r
+ STARTDV DSK\r
+ HRRZ TAC,@RCXIOC ;COMPUTE AND SAVE THE VALUE WHICH THE\r
+ HLRE TAC1,@RCXIOC ; CHANNEL CONTROL WORD SHOULD CONTAIN UPON\r
+ SUB TAC,TAC1 ; SUCCESSFUL COMPLETION OF THE DISK OPERATION.\r
+ MOVE TAC1,RCXIOC\r
+ HRLI TAC,1(TAC)\r
+ MOVEM TAC,RCXFIN\r
+ SETZM RCXCCW ;ZERO THE LOCATION WHERE THE DISK SYNCRONIZER WILL\r
+ ; STORE THE CHANNEL CONTROL WORD.\r
+ DATAO DSK,DFORDR ;START UP DISK AND DATA CHANNEL.\r
+ POPJ PDP, ;SUBROUTINE EXIT.,......***\r
+\f\r
+;SUBROUTINE "DFRED" IS CALLED TO START UP A READ FROM THE DISK.\r
+\r
+;THE CALLING SEQUENCE, ENTRY CONDITIONS, AND EXIT CONDITIONS ARE EXACTLY\r
+; SIMILAR TO THOSE FOR SUBROUTINE "DFWRT" ABOVE.\r
+\r
+DFRED: CONSZ DSK,BUSYBT ;POSSIBLY REDUNDANT CHECK TO BE\r
+ JRST .-1 ; SURE THE DISK IS FREE.\r
+ MOVEM TAC1,RDCHNL ;SET UP READ CHANNEL ORDERS IN A SEPARATE\r
+ SETZM RDCHNL+1 ;MAKE SURE NEXT COMMAND IN LIST IS 0\r
+ ; SO CHANNEL WILL NOT WRITE ALL OVER MEMORY\r
+IFN FTRCHK,<\r
+ EXTERN SATM2\r
+ MOVEI TAC1,1(TAC1) ;CLEAR LH AND COMPARE WITH FIRST WORD AFFECTED\r
+ CAIG TAC1,SATM2 ;COMPARE ABS CORE ADDRESS TO BEGINNING\r
+ ;OF SAT TABLE-2\r
+ HALT . ;HALT - DO NOT WRITE OUT MONITOR - CONTINUE\r
+ ;WILL LOOP\r
+>\r
+ MOVEI TAC,RDCHNL ; PLACE FROM WRITE CONTROL WORDS FOR\r
+ MOVEM TAC,RCXIOC ; BETTER FOOTPRINTS IN CASE OF A CRASH.\r
+ PUSHJ PDP,CNVBLK ;CONVERT LOGICAL BLOCK NUMBER TO PHYSICAL DISK ADDRESS.\r
+ JRST DFWRTC ;REMAINDER OF THIS READ ROUTINE IS\r
+ ; IDENTICAL TO WRITING.\r
+\f\r
+;A ROUTINE CALLED DURING SYSTEM INITIALIZATION TO BE SURE DISK IS READY,\r
+; NOTE: THIS ROUTINE DESTROYS ACCUMULATOR TAC.\r
+\r
+DISKUP: CONO DSK,ALLERR!RESETB ;CLEAR THE DISK SYNCHRONIZER.\r
+ CONSZ DSK,NRDY!PSF!BUSYBT!DONEFLG ;ANYTHING AMISS OR STUCK ?\r
+ JRST DISKUP ;IF SO, JUST HANGE HERE IN A LOOP.\r
+ DATAI DSK,TAC ;IS THE SECTOR COUNTER GOING ?\r
+ JUMPE TAC,.-1 ;IF NOT, JUST LOOP HERE.\r
+;*** THIS LOOP ABOVE WILL OCCUR DURING INITIALIZATION IF THE DISK IS OFF-LINE. ***\r
+ HRRZI TAC,DSKBIT ;IF NOT, ENABLE DISK INTERRUPTS ON THE\r
+ CONO PI,2200(TAC) ; APPRORIATE PRIORITY INTERRUPT CHANNEL.\r
+ POPJ PDP, ;SUBROUTINE EXIT.....,***\r
+\f\r
+;DISK INTERRUPTS COME HERE TO BE SERVICED --\r
+\r
+DSKINT: CONSO DSK,@DSKCON ;*DID THE DISK SYNCHRONIZER CAUSE THE INTERRUPT ON\r
+ JRST .-1 ;* THIS CHANNEL? IF NOT, GO TO THE NEXT DEVICE ON\r
+ ;* THE SAME PRIORTY INTERRUPT CHANNEL.\r
+; NOTE: THE "JRST .-1" IS ALTERED BY THE SYSTEM BUILDER PROGRAM.\r
+\r
+ CONI DSK,DSKISV ;*SOLELY TO LEAVE FOOTPRINTS.\r
+ JSR DSKSAV ;*SAVE ACCUMULATORS, ETC.\r
+ SETZB IOS,DSKCON ;*CLEAR THE DSK I/O STATUS ACCUMULATOR, AND\r
+ ;* THE INTERRUPT ENABLED MARKER,\r
+ CONSZ DSK,DATERR ;*SET APPROPRIATE ERROR BITS (IF\r
+ TRO IOS,IODTER ;* ANY) IN ACCUMULATOR IOS FOR\r
+ CONSZ DSK,DEVERR!SETERR ;* DEVICE INDEPENED ROUTINE TO HANDLE.\r
+ TRO IOS,IODERR ;*\r
+ CONSZ DSK,WRPE ;*\r
+ TRO IOS,IOIMPM ;*\r
+;CLEAR OUT THE DISK SYNCHRONIZER AND LEAVE IT DETACHED FROM ITS INTERRUPT CHANNEL.\r
+ CONO DSK,ALLERR!RESETB\r
+ MOVE TAC,RCXCCW ;*PICK UP THE FINAL VALUE FO THE CHANNEL CONTROL WORD.\r
+ CAMN TAC,RCXFIN ;*DOES IT AGREE WITH THE SAVED VALUE WE EXPECTED ?\r
+ JRST DFINT ;*YES, EXIT TO THE DEVICE INDEPENDENT INTERRUPT\r
+ ;* HANDLING ROUTINE IN "DSKSER".........\r
+ MOVE TAC1,DSKISV ;*\r
+ TRNE TAC1,CHCPAR ;*CHANNEL CONTROL WORD PARITY ERROR DETECTED ?\r
+ JRST DSKNT2 ;*YES, SET ERROR BIT, EXIT TO DSKSER TO TRY 2 TIMES,\r
+ HRRZ TAC1,RCXFIN ;*NO, STOP AND DEAD UNLESS THE LAST DATA ADDRES\r
+ CAIGE TAC1,(TAC) ;* REFERENCED WAS WITHIN THE RANGE OF THE REQUESTED\r
+ JRST DSKNT1 ;* TRANSFER, IF IT WAS IN RANGE, SOME ERROR MUST\r
+ HRRZ TAC1,@RCXIOC ;* HAVE ABORTED PART OF THE DATA TRANSFER, THUS THE\r
+ CAILE TAC1,(TAC) ;* "DEVICE ERROR" BIT SHOULD BE TURNED BEFORE\r
+ JRST DSKNT1 ;* EXITING TO THE DEVICE INDEPENDENT ROUTINE.\r
+DSKNT2: TRO IOS,IODERR ;*\r
+ JRST DFINT ;*\r
+\r
+DSKNT1: SKIPE RCXCCW ;*MAYBE CHANNEL WAS TURNED OFF ?\r
+ HALT . ;*NO--SERIOUS CHANNEL MALFUNCTION--CALL REPAIR MAN!\r
+ PUSH PDP,ITEM ;*\r
+ MOVEI ITEM,0 ;*SEND ERROR MESSAGE TO OPERATOR CONSOLE\r
+ JSP TAC,ERRPNT ;*\r
+ ASCIZ /DISK DATA CHANNEL TURNED ON ?\r
+/\r
+ POP PDP,ITEM ;*\r
+ JRST DSKNT2 ;*\r
+\f\r
+;SUBROUTINE TO CONVERT LOGICAL BLOCK NUMBERS TO PHYSICAL DISK ADDRESSES\r
+\r
+;CALLING SEQUENCE --\r
+; PUSHJ PDP,CNVBLK\r
+; NORMAL RETURN (ONE "IMPOSSIBLE" ERROR COULD OCCUR)\r
+;ENTRY CONDITIONS--\r
+; C(TAC) = RH IS THE LOGICAL BLOCK NUMBER TO BE CONVERTED; LH MAY BE NON-ZERO\r
+;EXIT CONDITIONS--\r
+; C(TAC) = C(DFORDR0 = THE CORRESPONDING PHYSICAL DISK ADDRESS CORRECTLY\r
+; POSITIONED FOR A DATAO TO THE RC-10 DISK SYNCHRONIZER.\r
+\r
+EXTERNAL ERRPNT,ERRPTU\r
+\r
+CNVBLK: MOVEM TAC,SVLBLK ;ONLY FOR FOOTPRINTS IN CASE OF CRASH.\r
+ TLZ TAC,-1 ;CLEAR NON-USEFUL LEFT HALF OF LOGICAL BLOCK NUMBER.\r
+INTERNAL FTRCHK\r
+IFN FTRCHK, <\r
+ CAMLE TAC,LBHIGH ;IS LOGICAL BLOCK NUMBER IN RANGE?\r
+ SKIPN LBHIGH ;NO. BUT IF LBHIGH IS STILL 0 WE MUST STILL BE\r
+ JRST CNVBK1 ; DOING THE INTITIALIZATION IN "ONCE", SO IT'S OKAY.\r
+;INTERNAL MONITOR ERROR IF DSKSER OR SCHEDU COMES HERE WITH A LOGICAL\r
+; DISK BLOCK NUMBER THAT IS OUT OF RANGE.....\r
+ HALT .+1 ;HALT ON THIS IMPOSSIBLE ERROR\r
+ POP PDP,DSKISV ;CORRECT PUSH DOWN POINTER AND LEAVE\r
+ ;INDICATOR\r
+ MOVEI IOS,IODERR ;UPON CONTINUING PREDEDN I/O COMPLETED\r
+ ;WITH DEVICE ERROR,\r
+ JRST DFINT\r
+CNVBK1:\r
+>\r
+ PUSH PDP,TAC1 ;THIS RTN SAVES AND RESTORES TAC1.\r
+ IDIVI TAC,^D4000 ;DETERMINE DISK NUMBER\r
+ ROT TAC,-2\r
+ MOVEM TAC,DFORDR ;SAVE DISK NUMBER AWAY.\r
+ MOVE TAC,TAC1\r
+ IDIVI TAC,^D20 ;SELECT TRACK NUMBER.\r
+ PUSH PDP,TAC1\r
+ IDIVI TAC,^D10 ;CONVERT TRACK NUMBER TO BCD.\r
+ CAIL TAC,^D10\r
+ ADDI TAC,6 ;SHORT-CUT BECAUSE FIRST DIGIT IS 0 OR 1.\r
+ LSH TAC,4\r
+ OR TAC,TAC1\r
+ ROT TAC,-^D11\r
+ ORM TAC,DFORDR ;PUT TRACK NUMBER AWAY ALSO.\r
+ POP PDP,TAC ;NOW RETRIEVE SEGMENT NUMBER.\r
+ LSH TAC,2 ;MULTIPLY BY 4 (FOR PHYSICAL\r
+ IDIVI TAC,^D10 ; SEGMENTS PER LOGICAL BLOCK)\r
+ LSH TAC,4\r
+ OR TAC,TAC1 ;SEGMENT NUMBER MUST BE IN BCD ALSO.\r
+ HRLZS TAC\r
+ ORB TAC,DFORDR ;FINALLY, JOIN SEGMENT NUMBER TO\r
+ POP PDP,TAC1 ; EARLIER CALCULATED PARTS OF ADDRESS,\r
+ POPJ PDP, ;SUBROUTINE EXIT.,....***\r
+\f\r
+IFN FTCHECK+FTMONP, <\r
+EXTERNAL RCXDAT ;TO CAUSE THE CORRECT COPY OF "DSKDAT" TO BE\r
+ ; RETRIEVED BY THE SYSTEM BUILDER.\r
+EXTERNAL DSKCON,WRCHNL,RDCHNL,DSKISV,RCXFIN\r
+EXTERNAL SVLBLK,DFORDR\r
+>\r
+IFE FTCHECK+FTMONP, <\r
+INTERNAL DSKCON,LBHIGH,WRCHNL,RDCHNL,DSKISV,RCXFIN,SVLBLK,DFORDR\r
+DSKCON: 0 ;ENABLED INTERRUPT CONDITIONS STORED HERE BY "STARTDV",\r
+LBHIGH: 0 ;HIGHEST LEGAL LOGICAL BLOCK NUMBER.\r
+WRCHNL: 0 ;CHANNEL CONTROL WORD OF LAST DISK WRITE.\r
+ Z ;CHANNEL TERMINATION WORD.\r
+RDCHNL: 0 ;CHANNEL CONTROL WORD OF LAST DISK READ.\r
+ Z ;ZERO WORD TO TERMINATE CHANNEL.\r
+DSKISV: 0 ;RESULT OF LAST CONI ON A DISK INTERRUPT.\r
+RCXFIN: 0 ;EXPECTED VALUE OF CHANNEL CONTROL WORD (RCXCCW) AT\r
+ ; THE END OF THE CURRENT DISK TRANSFER.\r
+SVLBLK: 0 ;LAST LOGICAL BLOCK NUMBER CONVERTED.\r
+DFORDR: 0 ;ITS CORRESPONDING PHYSICAL DISK ADDRESS.\r
+\r
+>\r
+DSKEND: END\r
--- /dev/null
+IFN FTRA10, <\r
+TITLE DSKSER -- DEVICE-INDEPENDENT DISK SERVICE ROUTINES.\r
+>\r
+IFE FTRA10, <\r
+IFN FTRC10,<\r
+TITLE DSKSRB - ALMOST DEVICE INDEPENDENT DISK SERVICE ROUTINES (BURROUGHS)\r
+>>\r
+IFE FTRC10,<\r
+TITLE DSKSRD - ALMOST DEVICE INDEPENDENT DISK SERVICE ROUTINES (DATA PRODUCTS)\r
+>\r
+SUBTTL A, BLACKINGTOM/CMF/TH/CHW/RCC/AF TS 02 JUN 69 V424\r
+XP VDSKSR,424\r
+\r
+;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+INTERNAL FTRA10 ;TO ASSEMBLE DSKSER AS A\r
+ ; DEVICE INDEPENDENT ROUTINE SET\r
+ ; THIS SWITCH TO -1, NOTE THAT MDFINT (THE BRYANT\r
+ ; DSKINT) WAS WRITTEN SO AS TO KEEP DSKSER DEVICE-INDEPENDENT\r
+ ; THIS SWITCH AND CODE ENCLOSED IN ITS IFE'S WILL ULTIMATELY\r
+ ; BE REMOVED FROM DSKSER.\r
+\r
+\r
+INTERNAL FTRC10 ;TO ASSEMBLE DSKSER FOR THE PDP-10 DISK\r
+ ; (MODEL RC-10), SET THIS SWITCH TO -1,\r
+ ; FOR OLD (270) DISK SET IT = 0.\r
+\r
+IFN FTRA10, <\r
+ENTRY DSKSER\r
+DSKSER:\r
+>\r
+IFE FTRA10, <\r
+IFN FTRC10, <\r
+ENTRY DSKSRB ;THIS SYMBOL IS TO PERMIT SYSTEM\r
+DSKSRB: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE,\r
+>\r
+IFE FTRC10, <\r
+ENTRY DSKSRD ;THIS ENTRY FOR SELECTIVE LOAD BY BUILD\r
+DSKSRD:\r
+>>\r
+\r
+EXTERNAL JIFMIN\r
+\r
+INTERNAL WLBIT,DSKFGS,CHKCNT\r
+\r
+TA=BUFPNT ;USED BY RENAME\r
+TB=BUFWRD ;USED BY RENAME\r
+\r
+IFE FTRA10, <\r
+INTERNAL MFDBLK,SATXWD\r
+IFN FTRC10, <\r
+MFDBLK: 66 ;ON PDD-10 DISK, MFD RETRIEVAL INFORMATION AND SAT\r
+SATXWD: XWD -NUMSAT,67 ;BLOCKS GO AT THESE ABSOLUTE ADDRESSES\r
+ ; UNLESS USER SPECIFIES OTHERWISE DURING "ONCE".\r
+>\r
+IFE FTRC10, <\r
+MDFBLK: 13000 ;THIS BLOCK CONTAINS RETRIEVAL INFO, OF MFD\r
+SATXWD: XWD -NUMSAT,13001 ;LH=NUMBER OF SAT BLOCKS.\r
+ ;RH=FIRST SAT BLOCK NUMBER.\r
+>>\r
+\f\r
+CHKCNT=200 ;NUMBER OF WORDS TO CHECK-SUM\r
+W8BIT=400000 ;WAIT INDICATION FOR DDB\r
+\r
+; BITS IN LH OF IOS\r
+\r
+NMP=100 ;NO MORE INPUT POINTERS (LH OF IOS)\r
+UBFS=200 ;USING BUFFER IN FREE STORAGE (LH OF IOS)\r
+NORELB=400 ;DO NOT RELOCATE BUFFER ON I/O (LH IOS)\r
+UBFU=1000 ;USING BUFFER IN USER AREA\r
+NCTRLC=2000 ;DISABLE ^C DURING CRUCIAL SEQUENCES OF NON-\r
+ ; INTERRUPTABLE OPERATIONS\r
+DAFLG=4000\r
+AUFLG=10000\r
+DSKFGS=AUFLG+DAFLG+UBFS+NCTRLC ;USED TO SUPPRESS ACTION OF ^C, SEE STOPCK\r
+PRCHG=20000 ;PROTECTION CHANGED\r
+LIR=IOEND ;LAST INPUT REQUESTED\r
+\r
+;MISCELLANEOUS CONSTANTS\r
+TRIES=3 ;NUMBER OF TIMES TO READ OR WRITE BAD BLOCK\r
+BLKSIZ=200 ;SIZE OF DATA BLOCK. DUMP MODE REQUIRES THIS\r
+NBLKSZ=-BLKSIZ ;TO BE A POWER OF 2.\r
+BLKP2=7 ;BLKSIZ = 2^BLKP2\r
+\r
+;TEST BITS PUT IN LH OF DEVOAD\r
+\r
+PNTDIF=200000 ;POINTERS IN CORE DO NOT MATCH POINTERS ON DISC\r
+VRGPTR=100000 ;FLAG TO SIGNAL THAT POINTERS HAVE NEVER BEEN WRITTEN\r
+RENBIT=20000 ;"RENAMING" INDICATION FOR SETLE ROUTINE\r
+WPRO=40000 ;LOOKUP DONE, FILE IS IN WRITE PROTTECT\r
+CKSUPR=10000 ;FLAG SET IF READING DUMP FILES IN NON-DUMP MODE\r
+\f\r
+;CONSTANTS USED IN CONNECTION WITH ACCESS TABLE ENTRIES\r
+\r
+ATPP=0 ;PROJECT,PROGRAMMER NUMBERS\r
+ATNAME=1 ;OWNER NAME\r
+ATEXT=2 ;EXTENSION\r
+TBITS=2 ;TEST BITS AND RCOUNT\r
+ATBLOK=3 ;BLOCK NUMBER OF RETRIEVL INFO OF UFD IN LH\r
+ATLINK=3 ;LINK TO NEXT ENTRY IN RH\r
+\r
+WTBIT=400000 ;FILE IS BEING CREATED\r
+DTBIT=200000 ;DELETE WHEN THRU READING\r
+RTBIT=100000 ;FILE HAS BEEN RENAMED\r
+ATBITS=500000 ;WTBIT+RTBIT\r
+ATIND=40000 ;NAME IS ALREADY IN DIRECTORY\r
+ATCLO=20000 ;OUTPUT CLOSE TO BE DONE\r
+RWTBIT=10000 ;FILE BEING READ AND WRITTEN, BUT NOT CREATED,\r
+RCOUNT=7777 ;MASK FOR THE COUNT OF READERS\r
+\r
+;CONSTANTS USED IN CONNECTION WITH SAT BLOCKS\r
+\r
+XP NUMBIT,^D36*BLKSIZ ;NUMBER OF BITS IN ONE BLOCK\r
+\r
+IFE FTRA10, <\r
+IFN FTRC10, <\r
+XP NUMSAT,4 ;ONLY FOUR SAT BLOCK ON PDP-10 DISK,\r
+>\r
+IFE FTRC10, <\r
+XP NUMSAT,16 ;NUMBER OF SAT BLOCKS FOR 5.76 MILLION\r
+ ;WORD DATA PRODUCTS MODEL 270 DISK,\r
+>>\r
+XP WLBIT,400000 ;IF BIT IS ON IN FIRST SATENT ENTRY\r
+ ;WORD, THE DISK IS WRITE-LOCKED.\r
+\f\r
+EXTERNAL DSKOFF\r
+\r
+DEFINE NOSCHEDULE <\r
+ CONO PI,DSKOFF\r
+>\r
+\r
+EXTERNAL DSKON\r
+DEFINE SCHEDULE <\r
+ CONO PI,DSKON\r
+>\r
+\f\r
+INTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL DDBPTR,DSKCOR,PTRN,MOPTR,MIPTR,RUNUSR,SAVPRG,USRCNT\r
+EXTERNAL SATPTR,SAT,SATBK2,DIRSIZ\r
+EXTERNAL DSKDDB,DEVACC,DEVCNT,DEVBLK,DEVBKO,DSKBUF\r
+EXTERNAL DSKCNT,SETCNT,PTR1,FPNTR,FPNTR1,FAT,DFBUSY,LOCORE,GTCOR3\r
+EXTERNAL GTCOR2,CORBIT,CKSMCT,DSKSIZ,DSKACC,DSKAPP,CORBSZ,MONBUF\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+\r
+;DISK DEVICE DATA BLOCKS & MISCELLANEOUS CONSTANTS, WORKING STORAGE\r
+DDBPTR: Z ;LOCATION OF NEXT DDB TO LOOK AT\r
+ ;DURING DISK INTERRUPT\r
+\r
+;MORE MISCELLANEOUS FOR DISK\r
+\r
+INTERNAL SATPTR,SAT,SATBK2,REFLAG,DFBUSY,CKSMCT\r
+MOPTR: BLOCK 1 ;POINTER TO NEXT TASK TO DO\r
+MIPTR: BLOCK 1 ;POINTER TO NEXT FREE QUEUE ENTRY\r
+\r
+RUNUSR: BLOCK 1 ;LH=DEVDAT OF USER JOB RUNNING\r
+ ;RH= UNUSED\r
+USRCNT: BLOCK 1 ;COUNT OF WAITING USER JOBS\r
+DFBUSY: 0 ;-1 IF DISK CONTROL IN USE, 0 IF FREE\r
+FAT: 0 ;POINTER TO FIRST ACCESS TABLE ENTRY\r
+DKSMOT: 0 ;COUNT OF VARIOUS CHECKSUM ERRORS\r
+REFLAG: 0 ;CONTAINS A PPN TO ALLOW LOGIN AFTER REFRESH\r
+UXFERS: 0 ;TOTAL USER TRANSFER ATTEMPTED\r
+ECOUNT: 0 ;TOTAL HARDWARE ERRORS ON USER TRANSFERS\r
+;DISK STORAGE ALLOCATION CONTROL\r
+\r
+SATPTR: BLOCK 1 ;POINTER TO CURRENT SATENT ENTRY\r
+SATPIK: BLOCK 1 ;POINTER TO NON-FULL SAT ENTRY\r
+SATCHG: BLOCK 1 ;0 IF SAT BLOCK IN CORE=BLOCK ON DISK, -1 OTHERWISE\r
+SATTEM: BLOCK 1 ;TEMPORARY SAVE LOCATIONS USED DURING SAT READ\r
+SATTMP: BLOCK 1 ; ROUTINE TO AVOID PUSH-DOWN LIST OVERFLOW.\r
+\r
+IFN FTRA10, <\r
+EXTERNAL MFDBLK,SATXWD,NUMBLK,SATENT,SENTSZ,SATTOP\r
+>\r
+IFE FTRA10,<\r
+INTERNAL SATENT\r
+\r
+IFN FTRC10, <\r
+XP NUMBLK,^D4000 ;NUMBER OF DATA BLOCKS PER SAT BLOCK ON THE\r
+ ; PDP-10 MODEL RC-10 DISK FILE.\r
+>\r
+IFE FTRC10, <\r
+ XP NUMBLK,5400 ;NUMBER OF DATA BLOCKS REPRESENTED BY\r
+ ;ONE SAT BLOCK ON THE DATA PRODUCTS 270 DISK.\r
+>\r
+ XP SENTSZ,3 ;SIZE OF EACH SATENT ENTRY\r
+IFN FTREC10, <\r
+DSKXDB=0 ;ON PDP-10 DISK FILE STORAGE BEGINS IN LOGICAL\r
+ ; BLOCK NO. 0,\r
+>\r
+IFE FTRC10, <\r
+DSKXDB=5400 ;FILE STORAGE BEGINS ON SECOND DISK OF OLD (MOD 270)\r
+ ; DISK FILE SINCE FIRST DISK IS ALLOCATED\r
+ ; TO SWAPPING.\r
+>\r
+\f\r
+SATENT: REPEAT NUMSAT,<\r
+ XWD DSKXDB,0 ;RH CONTAINS WLBIT AND COUNT OF BLOCK USED\r
+ BLOCK 1 ;BIT MASK, SINGLE ROTATING BIT\r
+ BLOCK 1 ;XWD LENGTH OF SAT TABLE POINTER WORD\r
+ ; IN SAT BLOCK\r
+ DSKXDB=DSKXDB+NUMBLK>\r
+\r
+ XP SATTOP,SATENT*SENTSZ*NUMSAT-SENTSZ\r
+>;END OF FTRA100 CONDITIONAL\r
+\r
+SAT: BLOCK 200 ;CURRENT SAT BLOCK\r
+\r
+ XP SAATM2,SAT-2 ;LOWEST ABS, ADR-1 ALLOWED IN CHANNEL COMMAND\r
+ ; LIST - USED TO KEEP FROM WIPING OUT MONITOR.\r
+SATBK2: XWD -200,SAT\r
+\f\r
+ XP DIRSIZ,4 ;NO. OF WORDS OF RET. INFO WHICH ARE\r
+ ;NOT POINTERS.\r
+\r
+;THE DUMMY DEVICE DATA BLOCK\r
+DSKCOR=10\r
+DSKSIZ=4*DSKCOR ;NUMBER OF WORDS ALLOCATED FOR DDB\r
+ ;MUST BE A MULTIPLE OF FOR (SEE GETCOR)\r
+\r
+INTERN DSKDDB\r
+DSKDDB: SIXBIT /DSK/\r
+ XWD ^D5*HUNGST,201\r
+ Z\r
+ EXP DSKDSP\r
+ XWD DVOUT+DVIN+DVDIR+DVDSK+DVLNG,154403\r
+ Z\r
+ Z\r
+ XWD PROG,\r
+ XWD PROG,\r
+ XP DEVFIL,.-DSKDDB ;FILE NAME\r
+ Z ;SIXBIT/FILE? - FILE NAME\r
+ XP DEVEXT,.-DSKDDB ;FILE EXTENSION\r
+ Z ;XWD SIXBIT/EXT/,BLOCK# OF THE RIB\r
+ XP DEVPPN,.-DSKDDB ;PROJ,PROGRAMMER FOR CURRENT\r
+ ; (OR MOST RECENT) LOOKUP,ENTER,RENAME\r
+ Z\r
+ XP DEVACC,.-DSKDDB ;C(LH)=LOCATION OF CCESS TABLE ENTRY\r
+ Z ;C(LH)=ADDRESS OF ACCESS TABLE ENTRY\r
+ ;C(RH)=ADDRESS OF CURRENT POINTER IN DDB\r
+ XP DEVCNT,.-DSKDDB ;C(LH)USED DURING LOOKUP,ENTER\r
+ Z ;C(LH)==RELATIVE BLOCK# WITHIN UFD OPTIMIZE UFD SEARCHES)\r
+ ;C(RH)=COUNT OF BLOCKS IN FILE\r
+ XP DEVBLK,.-DSKDDB ;C(LH)=BLOCK NUMBER OF CURRENT POINTER\r
+ Z ;C(LH)=LOGICAL BLOCK# OF RIB\r
+ ;C(RH)=RELATIVE LOC. OF RIB\r
+ ;POINTER IN THAT BLOCK\r
+ XP DEVBKO,.-DSKDDB ;LIKE DEVBLK, BUT FOR BEGINNING\r
+ Z ;SIMILAR TO DEVBLK - SAY WHERE CURRENT\r
+ ; POINTER COME FROM\r
+ XP DSKBUF,.-DSKDDB ;C(LH)=-SIZE OF MONITOR READ/WRITE\r
+ Z ;C(LH)=-SZIE OF READ/WRITE\r
+ ;C(RH)=BUFFER IN USER AREA\r
+ XP DSKCNT,.-DSKDDB ;C(LH)=BLOCK NUMBER TO READ/WRITE\r
+ Z ;C(LH)=LOGICAL BLOCK@ FOR READ OR WRITE\r
+ ;C(RH)=ERROR COUNT OR ERROR BITS\r
+ XP SETCNT,.-DSKDDB ;LH CONTAINS POINTER TO R.I. OF\r
+ ;C(LH)=BLOCK# OF UFD RIB\r
+ Z ;UFD, RH IS SETO, SETI COUNTER.\r
+ XP PTR1,.-DSKDDB ;RETRIEVAL INFO STARTS HERE\r
+ ; DEFINE THE AREA CONTAINING RETRIEVAL; POINTERS\r
+ XP FPNTR,PTR1+DIRSIZ ;LOC. OF FIRST POINTER TO RET. INFO.\r
+ XP FPNTR1,FPNTR-1\r
+ XP PTRN,DSKSIZ-1\r
+\f\r
+;DEFINE 3 WORD ENTRY CONTROLLING BIT SEARCH IN DDBTAB\r
+\r
+INTERNAL LOCORE,CRINIT\r
+EXTERNAL DDBTAB\r
+\r
+LOCORE: EXP 0 ;ADDRESS OF FIRST 4 WORD BLOCK IN FREE CORE AREA\r
+ ; SET BY LINKDB\r
+CORBIT: 0 ;FLOATING 1 BIT USED IN SEARCHES\r
+CORIWD: XWD 0,0 ;AOBJN POINTER TO FIRST WORD IN DDBTAB CONTAINING A 0\r
+CRINIT: XWD 0,DDBTAB ;INITIAL AOBJN POINTER FOR CORIWD\r
+ ; LH SET BY LINKDB\r
+MONBUF: BLOCK 200 ;MONITOR BUFFER, USED TO READ RETRIEVAL POINTERS, ETC.\r
+\f\r
+;ERROR CODES FOR LOOKUP, RENAME AND/OR ENTER\r
+\r
+NOTINU=0 ;NO SUCH FILE\r
+NOTINM=1 ;NO SUCH USER\r
+PHOTF=2 ;PROTECTION FAILURE\r
+NORITE=3 ;MORE THAN 1 WRITE TO A FILE\r
+RENFAL=4 ;TRIED TO RENAME FILE TO EXISTING NAME OR ENTER\r
+ ; A NULL FILE NAMES\r
+NOFILE=5 ;TRIED TO RENAME WITH NO FILE SELECTED\r
+ERRBIT=1 ;BITS GO IN WORD 1 OF THE ENTRY\r
+\r
+;DISK DISPATCH TABLE\r
+\r
+INTERNAL DSKDSP\r
+\r
+ JRST DSKINI ;INITILIZE\r
+ JRST CPOPJ1 ;DSK HUNG TIMEOUT, NO ERROR MESSAGE\r
+DSKDSP: JRST DFREL ;RELEASE\r
+ JRST DFCLSO ;CLOSE OUTPUT\r
+ JRST DFOUT ;OUTPUT\r
+ JRST DFIN ;INPUT\r
+ JRST DFENTR ;ENTER\r
+ JRST DFLOOK ;LOOKUP\r
+ JRST DFDMPO ;DUMP OUTPUT\r
+ JRST DFDMPI ;DUMP INPUT\r
+ JRST DFSET ;USETO\r
+ JRST DFSET ;USETI\r
+ POPJ PDP, ;UGETF\r
+ JRST DFREN ;RENAME\r
+ JRST DFCLSI ;CLOSE INPUT\r
+ POPJ PDP, ;UTPCLR\r
+ POPJ PDP, ;MTAPE\r
+\f\r
+;ACCINI - CALLED AT 140 START, 143 RESTART\r
+; RESTORE DEVICE DATA BLOCK CHAIN\r
+; INITIALIZE DDBTAB BIT SEARCHING ENTRY\r
+\r
+INTERNAL ACCINI\r
+\r
+ACCINI: MOVSI TAC,(SIXBIT /DSK/)\r
+ MOVEI DEVDAT,DSKDDB ;POINT TO PROTOTYPE DDB\r
+ACCIN1: HLRZ DEVDAT,DEVSER(DEVDAT)\r
+ JUMPE DEVDAT,ACCIN2\r
+ CAMN TAC,DEVNAM(DEVDAT)\r
+ JRST ACCIN1\r
+ACCIN2: MOVEI TAC,DSKDDB\r
+ HRLM DEVDAT,DEVSER(TAC) ;LINK PROTOTYPE TO FIRST NON DSK DDB\r
+ MOVSI TAC,400000\r
+ MOVEM TAC,CORBIT ;INITIALIZE FLOATING 1 BIT\r
+ MOVE TAC,CRINIT\r
+ MOVEM TAC,CORIWD ;RESET AOBJN WORD\r
+\r
+ POPJ PDP,\r
+\r
+;DSKINI - CALLED AT START, RESTART, 143 RESTART\r
+; REMOVE ACCESS ENTRIES, REMOVE DDB'S NOT ASSIGNED BY CONSOLE. CLEAR THE MONITOR QUEUE\r
+INTERNAL DSKINI, SETSAT\r
+EXTERNAL DISKUP,DFWUNS\r
+\r
+DSKINI: IFN FTSWAP, <\r
+ SETZM SQREQ ;NO SWAPPING REQUEST\r
+ SETZM SERA\r
+>\r
+ IFE FTRA10, <\r
+EXTERNAL DSKCON\r
+ HLLZS DSKCON ;CLEAR INTERRUPT FLAGS FOR CONSO\r
+>\r
+ SETZM DFBUSY ;DISK CONTROL AVAILABLE\r
+ SETZM RUNUSR ;NO USER I/O IN PROGRESSS\r
+ SETOM USRCNT ;NO USER TRANSFERS WAITING\r
+ SETZB DDBPTR ;NO NEXT DDB\r
+ ; CLEAR IOS (SUPERSTITIOUS, BUT POSSIBLY NECESSARY)\r
+ MOVEI DEVDAT,DSKDDB ;PREPARE TO RELEASE DISK DDB'S\r
+DSKIN0: HLRZ DEVDAT,DEVSER(DEVDAT) ;GET DDB LINK\r
+ JUMPE DEVDAT,DSKIN1 ;JUMP IF END REACHED\r
+ MOVSI TAC, (SIXBIT /DSK/) ;DEVICE NAME\r
+ CAME TAC,DEVNAM(DEVDAT) ;IS THIS A DISK DDB?\r
+ JRST DSKIN1 ;NO. DONE\r
+ HLRZ TAC, DEVACC(DEVDAT) ; GET POINTER TO ACCESS ENTRY\r
+ SKIPE TAC ;ACCESS ENTRY EXIST?\r
+ PUSHJ PDP,CLRAT ;YES. REMOVE IT\r
+ MOVSI TAC,W8BIT ;PREPARE TO CLEAR "TRANSFER WAITING" BIT \r
+ ANDCAM TAC,DEVIAD(DEVDAT) ;CLEAR INPUT WAITING\r
+ ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR OUTPUT WAITING\r
+ MOVE TAC,DEVMOD(DEVDAT)\r
+ TRNN TAC,ASSCON ;DDB ASSIGNED BY ASSIGN COMMAND?\r
+ PUSHJ PDP,CLRDDB ;NO. REMOVE DDB\r
+ JRST DSKIN0 ;CONTINUE\r
+\r
+DSKIN1: SETZM FAT ;NO ACCESS ENTRIES\r
+ MOVEI TAC,MQUEUE+1 ;DESTINATION FOR BLT\r
+ MOVEM TAC,MIPTR\r
+ MOVEM TAC,MOPTR ;RESET IN AND OUT POINTERS\r
+ HRLI TAC,MQUEUE\r
+ SETZM MQUEUE ;SOURCE FOR BLT\r
+ BLT TAC,MQTOP-1 ;CELAR THE MONITOR QUEUE\r
+ PUSHJ PDP,DISKUP ;DETERMINE IF DISK IS FUNCTIONING\r
+SETSAT: AOSE STARTS ;SKIP FIRST TIEM ONLY\r
+ JRST SAT01 ;WRITE SAT BLOCK IN CORE\r
+ JRST DFWUNS ;SCAN ALL SAT BLOCKS\r
+STARTS: -1 ;COUNT STARTS, RESTARTS\r
+\f\r
+;WRITE OUT SAT BLOCK, ENTER AT DSKSTP WITH FIXED START 147,\r
+;AT SAT01 UPON RE-ENTRY OF INITIALIZATION.\r
+\r
+INTERN DSKSTP,SAT05,JSAT06\r
+\r
+EXTERNAL DSKBIT,WSYNC,STOIOS,DCBBIT\r
+\r
+DSKSTP: HRRZI TAC,DSKBIT\r
+ IORI TAC,DCBBIT ;DCBBIT NON-ZERO ONLY FOR DATA-PRODUCTS N$1K\r
+ IORI TAC,2200 ;CLEAR PI SYSTEM\r
+ CONO PI,10000(TAC)\r
+ SKIPL STARTS ;HAS A SAT BLOCK BEEN READ IN?\r
+ PUSHJ PDP,SAT01 ;YES, WRITE IT OUT\r
+ CONO PI,10000\r
+ POPJ PDP, ;YOU ARE SAFELY DONE.\r
+\r
+SAT01: MOVEI DEVDAT,DSKDDB\r
+ SETZB IOS,DEVIOS(DEVDAT)\r
+ MOVEI PROG,0\r
+ PUSH PDP,WSYNC ;CHANGE WSYNC ROUTINE\r
+ MOVE TAC,JSAT06\r
+ MOVEM TAC,WSYNC\r
+SAT05: MOVEI ITEM,TRIES ;SET UP COUNT FOR ERRORS\r
+SAT02: PUSHJ PDP,SATBLK ;SET UP TAC,TAC1\r
+ PUSHJ PDP,MQOUT ;WRITE IT.\r
+ JRST SAT04 ;ERROR\r
+ SETZM SATCHG ;SHOW SAT BLOCK IN CORE = BLOCK ON DISK.\r
+\r
+ POP PDP,WSYNC ;NO ERRORS, SO RETURN.\r
+ SETZM DEVIOS(DEVDAT)\r
+ POPJ PDP,\r
+\r
+SAT04: SOJG ITEM,SAT02 ;ERRORS, SO TRY AGAIN\r
+ POP PDP,WSYNC ;RESTORE WSYNC ROUTINE\r
+ JRST 4,SAT01\r
+\r
+SAT06: MOVEI TAC,IOACT ;THIS IS SUBSTITUE FOR WSYNC\r
+ TDNE TAC,DEVIOS(DEVDAT)\r
+ JRST .-1\r
+ POPJ PDP,\r
+\r
+JSAT06: JRST SAT06\r
+\f\r
+SUBTTL ENTER, LOOKUP, RENAME, CLOSE\r
+;ENTER UUO\r
+\r
+EXTERNAL TIME,PRJPRG,CPOPJ, THSDAT\r
+\r
+DFENTR: SKIPN @UUO ;ZERO FILE NAME ?\r
+ JRST DFER12\r
+ PUSHJ PDP,ALTMFD ;ENTER TO MFD?\r
+ TLNE DEVDAT,LOOKB ;NO, HAS LOOKUP BEEN DONE?\r
+ JRST DFENT5 ;YES\r
+ TLO IOS,IO\r
+ PUSHJ PDP,SETLE ;RETURNS WITH PP ON PDL\r
+ JRST DFERR4 ;NO UFD, CLOCK ON\r
+ JRST DFENT2 ;NO FILE, CLOCK ON.\r
+ JRST DFERR6 ;FILE BEING WRITTEN\r
+ JRST DFENT7 ;FILE BEING READ,CHECK FOR WRITERS\r
+\r
+DFENT1: SCHEDULE\r
+ HRRZ TAC,DEVEXT(DEVDAT) ;BLOCK# OF FIRST RIB\r
+ PUSHJ PDP,SETPTR ;READ FIRST RETRIEVAL POINTERS TO DDB\r
+ MOVSI DAT,100000 ;WRITE PROTECTION BIT\r
+ PUSHJ PDP,PROTEK ;WRITE PROTECTED?\r
+ JRST DFERR3 ;NAME WRONG\r
+ JRST DFERR5 ;PROTECTION FAILURE.\r
+ MOVEI TAC1,WTBIT+ATIND+ATCLO ;BITS FOR ACCESS ENTRY-FILE EXISTS\r
+ TLZA IOS,PRCHG ;PREPARE FOR PROTECTION CHECK\r
+DFENT2: MOVEI TAC1,WTBIT+ATCLO ;BITS FOR ACCESS ENTRRY - FILE CREATION\r
+ HLLZS DEVEXT(DEVDAT) ;SET TO 0 RIB BLOCK#\r
+ NOSCHEDULE\r
+ PUSHJ PDP,SCANAT ;SCAN ACCESS TABLE FROM BEGINNING\r
+ JRST DFENT3 ;NOT THERE\r
+\f\r
+DFEN2A: MOVE DAT,TBITS(TAC) ;WRITE BIT ON?\r
+ TRNE DAT,WTBIT\r
+ JRST DFERR6 ;YES,ERROR\r
+ PUSHJ PDP,SCNAT2\r
+ JRST DFENT3\r
+ JRST DFEN2A\r
+\r
+DFENT3: TLZE IOS,PRCHG ;PROTECTION FAILURE?\r
+ JRST DFERR5 ;YES. GIVE ERROR RETURN.\r
+ SCHEDULE\r
+ PUSH PDP,TAC1 ;SAVE ACCESS BITS\r
+ PUSHJ PDP,DFGETF ;GET A BLOCK FOR RETRIEVAL POINTERS. # IN TAC\r
+ POP PDP,TAC1 ;RESTORE ACCESS BITS\r
+ HRLZM TAC,DEVBLK(DEVDAT) ;SET CURRENT RIB# AND INDEX IN DDB\r
+ HRLZM TAC,DEVBKO(DEVDAT)\r
+ HRRM TAC,DEVEXT(DEVDAT) ;STORE FIRST RIB#\r
+ NOSCHEDULE\r
+\r
+ MOVE DAT,TAC1 ;ACCESS ENTRY BITS\r
+ PUSHJ PDP,SETAT ;CREATE ACCESS ENTRY. RETURN POINTER IN TAC1\r
+ HRLM TAC1,DEVACC(DEVDAT) ;STORE POINTER TO ACCESS ENTRY\r
+ MOVEI DAT,PTR1(DEVDAT) ;SET UP RETRIEVAL INFO\r
+ MOVE TAC,DAT ;DESTINATION (DDB)\r
+ HRLI TAC,@UUO ;SOURCE (UUO PARAMETER BLOCK)\r
+ BLT TAC,2(DAT) ;NAME & EXTENSION\r
+ SCHEDULE\r
+ MOVE TAC1,THSDAT\r
+ ORI TAC1,400000 ;MAKE SURE ACCESS DATE NON-ZERO,\r
+ HRRM TAC1,1(DAT) ;STORE THSDAT AS ACCESS DATE\r
+ MOVE TAC1,2(DAT)\r
+ TLZ TAC1,777740 ;IS THERE A DATE ALREADY?\r
+ JUMPN TAC1,DFENT4 ;YES IF JUMP.\r
+ MOVE TAC,TIME ;NO, GET TIME.\r
+ IDIVI TAC,JIFMIN\r
+ HRRZ TAC1,THSDAT ;AND DATE.\r
+ DPB TAC,[POINT 11,TAC1,23]\r
+DFENT4: TLO TAC1,55000 ;PROTECTION\r
+ DPB IOS,[POINT 4,TAC1,12] ;MODE\r
+ MOVEM TAC1,2(DAT) ;STORE PROTECTION MODE TIME DATE IN DDB\r
+ MOVE ITEM,JOB\r
+ MOVE TAC,PRJPRG(ITEM)\r
+ MOVEM TAC,3(DAT) ;STORE PROGRAMMER# IN DDB\r
+ SETZM 4(DAT) ;CLEAR FIRST POINTER\r
+ MOVSI IOS,NMP ;SET "NO MORE POINTERS"\r
+ ORB IOS,DEVIOS(DEVDAT)\r
+ TLZ DEVDAT,OCLOSB\r
+ HLLZS DEVCNT(DEVDAT) ;CLEAR FILE SIZE\r
+ MOVSI TAC,VRGPTR ;SET "VIRGIN POINTER" FLAG (O DFO4A SUBROUTINE\r
+ IORM TAC,DEVOAD(DEVDAT) ;WILL CREATE A NEW RIB WHEN JUST CALLED\r
+ JRST ALLOK\r
+\f\r
+;AN ENTER AFTER A LOOKUP, SET "RWTBIT" FLAG IN ACCESS ENTRY\r
+\r
+DFENT5: MOVE TAC,DEVOAD(DEVDAT) ;CHECK PROTECTION\r
+ TLNE TAC,WPRO\r
+ PUSHJ PDP,DFERR5 ;FAILURE, THIS WILL NOT RETURN HERE\r
+ HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY\r
+ NOSCHEDULE\r
+ MOVE TAC1,TBITS(TAC) ;GET ACCESS BITS\r
+ TROE TAC1,RWTBIT ;FILE BEING READN AND WRITTEN ALREADY?\r
+ PUSHJ PDP,DFERR6 ;YES, THIS WILL NOT RETURN HERE\r
+ MOVEM TAC1,TBITS(TAC) ;NO, SET IT\r
+ SCHEDULE\r
+ CONO PI,DSKON\r
+\r
+ MOVE TAC,@UUO ;SAVE FILE?\r
+ CAME TAC,DEVFIL(DEVDAT)\r
+ JRST DFERR8 ;NO, NAME WRONG\r
+ ADDI UUO,1\r
+ HLLZ TAC,@UUO ;PICKUP EXTENSION FROM USER ENTER BLOCK\r
+ XOR TAC,DEVEXT(DEVDAT) ;COMPARE WITH LOOKUP EXTENSIONS(AND PICKUP\r
+ ; RETRIEVAL INFORMATION\r
+ TLNE TAC,-1 ;EXTENSION THE SAME?\r
+ JRST DFERR8 ;NO, EXTENSION WRONG\r
+ SOS UUO ;YES, RETRIEVE LATEST RETRIEVAL INFORMATION AND\r
+ PUSHJ PDP,SETPTR ;STORE CURRENT SIZE IN THE 4TH WORD OF THE 4-WORD\r
+ PUSHJ PDP,DFLUK4 ;ENTER BLOCK (IN CASE SOME OTHER USER HAS APPENDED\r
+ ; DATA TO THIS FILE BETWEEN THE TIME THIS USER DID\r
+ ; HIS LOOK-UP AND THIS ENTER.) NOTE: THIS LAST\r
+ ; PUSHJ WILL EXIT TO UUOCON--NOT RETURN HERE!\r
+\r
+;FILE IS BEING READ\r
+\r
+DFENT7: PUSHJ PDP,SCNAT2 ;FIND ANOTHER\r
+ JRST DFENT1 ;NO WRITERS, PERMIT THIS ENTER\r
+ JRST DFERR6 ;MUST BE BEING WRITTEN OR RENAMED\r
+\f\r
+;LOOKUP UUO\r
+\r
+EXTERNAL UDLKC,TPOPJ\r
+\r
+DFLOOK: SKIPN @UUO ;ZERO FILE NAME ?\r
+ JRST DFER12 ;IF SO, ERROR.\r
+ MOVEI TAC,CLSIN ;SUPPRESS INPUT CLOSE IF UDLKC IS CALLED\r
+ TLNE DEVDAT,ENTRB ;ENTER DONE YET?\r
+ PUSHJ PDP,UDLKC ;CLOSE OUTPUT\r
+ TLZ IOS,IO ;INPUT STATE\r
+ PUSHJ PDP,SETLE ;RETURNS WITH PP ON PDL\r
+ JRST DFERR4 ;NO UFD, CLOCK ON\r
+ JRST DFERR7 ;NO FILE, CLOCK ON.\r
+ JRST DFLUK8 ;FILE BEING WRITTEN\r
+ JRST DFLUK3 ;FILE BEING READ\r
+\r
+DFLUK2: MOVEI DAT,0\r
+ PUSHJ PDP,SETAT ;BUILD AN ACCESS ENTRY\r
+ MOVE TAC,TAC1 ;TAC,TAC1 POINT TO ACCESS ENTRY\r
+\r
+DFLUK3: AOS TBITS(TAC) ;INCREMENT RCOUNT\r
+ HRLM TAC,DEVACC(DEVDAT) ;STORE POINTER TO ACCESS ENTRY\r
+ SCHEDULE\r
+ MOVE TAC,DEVEXT(DEVDAT) ;FIRST RIB#\r
+ PUSHJ PDP,SETPTR ;GET IN THE RETRIEVAL INFO\r
+\r
+ TLZE IOS,PRCHG ;PROTECTION CHANGE FAILURE?\r
+ JRST DFLUK7 ;YES. ERROR RETURN\r
+ MOVSI DAT,200000 ;READ PROTECTION BIT\r
+ PUSH J PDP,PROTEK ;READ PROTECTED?\r
+ JRST DFERR3 ;NAME WRONG\r
+ JRST DFLUK7 ;PROTECTION FAILURE\r
+\r
+ MOVE TAC1,DEVOAD(DEVDAT) ;CHECK WRITE PROTECTION FOR\r
+ MOVSI DAT,100000 ;POSSIBLE SUBSEQUENT ENTER\r
+ PUSHJ PDP,PROTKX\r
+ TLOA TAC1,WPRO ;WRITE PROTECTED. SET FLAG\r
+ TLZ TAC1,WPRO ;WRITE OK--RESET FLAG\r
+ IORM TAC1,DEVOAD(DEVDAT)\r
+\f\r
+DFLUK4: MOVSI TAC,PTR1(DEVDAT) ;COPY INFO TO LOOKUP PARAMETER BLOCK\r
+ NOSCHEDULE\r
+ HRRI TAC,@UUO ;DESTINATION IS UUO PARAMETER BLOCK\r
+ MOVE TAC1,TAC\r
+ BLT TAC,2(TAC1) ;BLT NAME. EXT. PROTECTION, ETC FROM DDB TO USER\r
+ SCHEDULE\r
+ HLRE TAC,FPNTR1(DEVDAT) ;FILE LENGTH (USUALLY -WORDS)\r
+ ADD UUO,3\r
+ HRLZM TAC,@UUO ;SET UP 4TH WORD OF DIRECTORY HDR.\r
+ SUBI UUO,3 ;RESET UUO\r
+ MOVMS TAC ;SET FILE SIZE (WORDS) IN DDB\r
+ HRRM TAC,DEVCNT(DEVDAT)\r
+ TLZ DEVDAT,ICLOSB\r
+ MOVSI TAC,VRGPTR ;POINTERS DO EXIST ON THE DISK SO\r
+ ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR THE VIRGIN POINTERS FLAG.\r
+\f\r
+ALLOK: MOVEI DAT,FPNTR(DEVDAT) ;SKIP FILE INFO IN FIRST RIB\r
+ HRRM DAT,DEVACC(DEVDAT) ;SET VERTICAL POINTER POINTER\r
+ MOVEI TAC,1\r
+ HRRM TAC,SETCNT(DEVDAT) ;"POISITONED" AT RELATIVE BLOCK 1 OF FILE\r
+ MOVSI TAC,777760-WPRO-VRGPTR ;CLEAR FLAGS\r
+ ANDCAM TAC,DEVOAD(DEVDAT)\r
+\r
+IFG CHKCNT,<\r
+;TO GET AROUND CHECKSUM FAILURE WHILE READING DUMP FILES IN NON-DUMP MODE\r
+\r
+ LDB TAC1,[POINT 4,-2(DAT),12]\r
+ CAIGE TAC1,15 ;IS FILE IN DUMP MODE?\r
+ JRST ALLXIT ;NO\r
+ LDB TAC1,[POINT 4,DEVIOS(DEVDAT),35]\r
+ MOVSI TAC,CKSUPR\r
+ CAIGE TAC1,15 ;IS CURRENT MODE DUMP?\r
+ IORM TAC,DEVOAD(DEVDAT) ;NO. SUPPRESS CHECKSUM\r
+>\r
+ALLXIT: POP PDP,TAC ;REMEMBER 0(PDP) WASS XWD PROJ,PROG\r
+\r
+ AOS (PDP) ;RETURN TO CALL+2\r
+ JRST CLRBUF ;RELEASE MONITOR BUFFER\r
+\r
+DFLUK7: PUSHJ PDP,DFCL21 ;PROTECTION FAILURE,CLEAR ACCESS\r
+ JRST DFERR5\r
+\r
+;FILE IS BEING WRITTEN\r
+\r
+DFLUK8: PUSHJ PDP,SCNAT2 ;LOOK FOR ANOTHER\r
+ JRST DFLUK2 ;NO MORE\r
+ JRST DFLUK3 ;FOUND WHAT MUST BE READ\r
+\r
+;TEST FOR MFD ALTERAION\r
+\r
+EXTERNAL SYSPP,JOB,PRJPRG\r
+\r
+ALTMFD: MOVEI TAC,3(UUO) ;IS PROJ, PROG. = 1,1?\r
+ TLO TAC,PROG ;RELOCATE\r
+ MOVE TAC,@TAC ;XWD PROJ,PROG\r
+ CAME TAC,SYSPP\r
+ POPJ PDP, ;NO,RETURN\r
+\r
+ MOVE ITEM,JOB\r
+ XOR TAC,PRJPRG(ITEM)\r
+ TLNN TAC,-1 ;PRIVILEGED USER?\r
+ POPJ PDP, ;YES, RETURN\r
+\r
+ JRST DFERR5\r
+\f\r
+;RENAME UUO\r
+\r
+EXTERNAL CPOPJ1\r
+EXTERNAL THSDAT\r
+DFREN: PUSHJ PDP,DFRENX\r
+ POPJ PDP,\r
+ JRST CPOPJ1\r
+\r
+DFRENX: SKIPN DEVFIL(DEVDAT) ;IS THERE AN OLD FILE?\r
+ JRST DFER11 ;NO, UNDEFINED FILE\r
+ TLO IOS,IO ;YES, LOOK FOR THE FILE\r
+ MOVSI TAC,RENBIT ;RESET BIT\r
+ ANDCAM TAC,DEVOAD(DEVDAT)\r
+ ADDI UUO,3 ;POINT TO XWD PROJ,PROG\r
+ PUSHJ PDP,SETLE9 ;RETURNS WITH PP ON PDL\r
+ JRST DFERR4 ;NO UFD, CLOCK ON\r
+ JRST DFERR7 ;NO SUCH FILE, CLOCK ON.\r
+ JRST DFERR6 ;FILE BEING WRITTEN\r
+ JRST DFREN1 ;ALREADY HAS ACCESS ENTRY\r
+\r
+ MOVEI DAT,0 ;BUILD ACCESS ENTRY\r
+ PUSHJ PDP,SETAT\r
+ MOVE TAC,TAC1 ;TAC,TAC1 POINT TO ACCESS ENTRY\r
+\r
+DFREN1: AOS TBITS(TAC) ;INCREMENT RCOUNT\r
+ HRLM TAC,DEVACC(DEVDAT) ;SAVE POINTER TO ACCESS ENTRY\r
+ SCHEDULE\r
+ HRRZ TAC,DEVEXT(DEVDAT) ;CAN THIS FILE BE RENAMED?\r
+ PUSHJ PDP,SETPTR ;READ IN FIRST SET OF RETRIEVAL POINTERS\r
+ MOVEI AC1,@UUO ;IS THE PROTECTION TO BE CHANGED ?\r
+ MOVEI TAC,PTR1(DEVDAT) ;POINT TO RETRIEVAL INFO IN DDB\r
+ MOVE AC1,2(AC1) ;USER SPECIFIED PROTECTION\r
+ XOR AC1,2(TAC) ;COMPARE WITH STORED PROTECTION\r
+ TLZ IOS,PRCHG\r
+ TLNN AC1,777000 ;ANY DIFFERENCES?\r
+ JRST DFRN2A\r
+ MOVSI DAT,400000 ;YES, CAN IT BE?\r
+ PUSHJ PDP,PROTKX\r
+ JRST DFREN8 ;NO, ERROR\r
+ TLO IOS,PRCHG ;YES\r
+DFRN2A: MOVSI DAT,100000 ;CAN THIS BE RE-WRITTEN?\r
+ PUSHJ PDP,PROTEK\r
+ JRST DFERR3 ;BAD RETREIVAL INFO\r
+ JRST DFRN8A ;WRITE PROTECTED\r
+ TLZ IOS,PRCHG ;ARBITRARY CHANGE OK.\r
+\f\r
+DFREN2: NOSCHEDULE\r
+ PUSHJ PDP,SCANAT ;SCAN ACCESS TABLE FROM BEGINNING\r
+ JRST DFRN1B ;NO\r
+\r
+DFRN1A: MOVE DAT,TBITS(TAC) ;YES, BEING ALTERED?\r
+ TRNE DAT,ATBITS ;FILE BEING CREATED OR RENAMED?\r
+ JRST DFREN9 ;YES, YOU LOSE.\r
+ PUSHJ PDP,SCNAT2 ;NO, CONTINUE SCANNING\r
+ JRST DFRN1B\r
+ JRST DFRN1A ;FOUND ANOTHER\r
+\r
+DFRN1B: HLRZ TAC,DEVACC(DEVDAT) ;SET RENAME FLAG IN FIRST ENCOUNTERED ACCESS ENTRY\r
+ MOVEI AC1,RTBIT ;RENAME BIT\r
+ ORM AC1,TBITS(TAC)\r
+ SCHEDULE\r
+\f\r
+ MOVE TAC,@UUO ;GET NEW FILENAME\r
+ CAME TAC,DEVFIL(DEVDAT) ;SAVE AS DDB?\r
+ JRST DFREN3 ;NO\r
+ ADDI UUO,1 ;YES, SAME EXTENSION?\r
+ MOVE TAC,@UUO ;NEW EXTENSION\r
+ XOR TAC,DEVEXT(DEVDAT) ;COMPARE WITH DDB?\r
+ TLNE TAC,-1 ;SAME?\r
+ SOJA UUO,DFREN3 ;NO\r
+\r
+;FILENAME AND EXTENSION ARE IDENTICAL. CHANGE ONLY PROTECTION\r
+\r
+ TLZ IOS,PRCHG ;CLEAR PRTOECTION CHANGE FLAG\r
+ ADDI UUO,1 ;YES, CHANGE PROTECTION\r
+ LDB AC1,[POINT 9,@UUO,8] ;NEW PROTECTION\r
+ HRRZ TAC1,DSKBUF(DEVDAT) ;POINT TO BUFFER,CONTAINING RETRIEVAL INFO\r
+ ADDI TAC1,2 ;POINT TO PROTECTION\r
+ TLNN IOS,UBFS ;BUFFER IN MONITOR CORE?\r
+ TLO TAC1,PROG ;NO, RELOCATION.\r
+ DPB AC1,[POINT 9,@TAC1,8] ;STORE NEW PROTECTION IN RIB\r
+\r
+ PUSHJ PDP,WRI ;RE-WRITE THE BLOCK\r
+\r
+DFREXT: AOS -1(PDP) ;LEAVE\r
+ POP PDP,TAC\r
+ PUSHJ PDP,CLRBUF ;CLEAR NAY DUMP BUFFER\r
+ JRST DFCL21 ;CLEAR ACCESS ENRTY AND EXIT\r
+\r
+DFREN3: TLZE IOS,PRCHG ;IS ONLY PROTECTION CHANGE PERMITTED?\r
+ JRST DFREN8 ;YES. ERROR SINCE TRYING TO CHANGE NAME.EXT\r
+ POP PDP,TAC ;BACK UP PDP\r
+ PUSHJ PDP,ALTMFD ;ALTERING MFD?\r
+ SKIPN @UUO ;RENAMING TO 0 (I.E. DELETING)?\r
+ JRST DFREN7 ;YES\r
+\r
+ MOVE TAC,DEVACC(DEVDAT) ;SAVE INFO ON OLD FILE THAT WILL BE CHANGED BY SETLE\r
+ HLR TAC,SETCNT(DEVDAT) ;BLOCK# OF UFD RIB\r
+ PUSH PDP,TAC ;SAVE XWD ACCESS POINTER, BLOCK#\r
+ MOVE TA,DEVEXT(DEVDAT) ;BLOCK# OF FIRST FILE RIB\r
+ HLL TA,DEVCNT(DEVDAT) ;RELATIVE TO UFD BLOCK#\r
+ MOVE TB,DEVFIL(DEVDAT) ;HOLD FILE NAME\r
+\r
+ MOVSI TAC,RENBIT\r
+ ORM TAC,DEVOAD(DEVDAT) ;FOR "SETLE"\r
+ PUSHJ PDP,SETLE0 ;LOOK FOR THIS NEW FILE NAME\r
+ JRST DFERR4 ;NO UFD (SHOULD NOT HAPPEN)\r
+ JRST DFREN5 ;NEW FILE NOT THERE\r
+ JFCL ;NEW NAME ALREADY THERE, ERROR\r
+ JFCL\r
+ POP PDP,TAC\r
+ SCHEDULE\r
+ PUSHJ PDP,DFCL21\r
+ JRST DFER10\r
+\f\r
+;ALTER RETRIEVAL INFORMATION\r
+\r
+DFREN5: POP PDP,DAT ;BACK UP PDP\r
+\r
+ MOVEM TB,DEVFIL(DEVDAT) ;RESTORE OLD FILE NAME TO DDB\r
+ HRRM TA,DEVEXT(DEVDAT) ;RESTORE BLOCK# OF RIB\r
+ HLLM TA,DEVCNT(DEVDAT) ;RESTORE UFD RELATIVE BLOCK\r
+\r
+ MOVE TAC,(PDP) ;XWD ACCESS POINTER, BLOCK#\r
+ HLLM TAC,DEVACC(DEVDAT) ;RESTORE POINTER TO ACCESS ENTRY\r
+ HRLM TAC,SETCNT(DEVDAT) ;RESTORE BLOCK# OF UFD RIB\r
+ HRRZ TAC,TA\r
+ MOVSM TAC,DEVBLK(DEVDAT) ;RESET BLOCK#, INDEX TO RETRIEVAL POINTERS\r
+ PUSHJ PDP,RRIA ;GET RETRIEVAL INFO BLOCK\r
+ PUSHJ PDP,SET000 ;POINT TAC1 TO WORD 0\r
+\r
+ MOVE TAC,@UUO ;GET NEW NAME\r
+ MOVEM TAC,@TAC1 ;STORE IN RIB\r
+ ADDI TAC1,1 ;CHANGE EXTENSION\r
+ ADDI UUO,1\r
+ MOVE TAC,@TAC1 ;GET OLD EXTENSION\r
+ HLLM TAC,DEVEXT(DEVDAT) ;RESET EXTENSION IN DDB\r
+ MOVE TAC,@UUO ;NEW EXTENSION\r
+ HRR TAC,THSDAT ;AND ACCESS DATE\r
+ ORI TAC,400000 ;INSURE IT IS NON-ZERO\r
+ MOVEM TAC,@TAC1 ;STORE IN RIB\r
+ ADDI TAC1,1 ;CHANGE PROTECTION\r
+ ADDI UUO,1\r
+ LDB TAC,[POINT 9,@UUO,8] ;GET NEW PROTECTION\r
+ DPB TAC,[POINT 9,@TAC1,8] ;STORE IN RIB\r
+\r
+ PUSHJ PDP,WRI ;RE-WRITE RIB\r
+\f\r
+;ALTER UFD BLOCK\r
+\r
+ PUSHJ PDP,FINDE ;BRING IN CORRECT BLOCK\r
+ \r
+ SUBI UUO,1 ;REPLACE EXTENSION IN UFD\r
+ MOVE TAC,@UUO\r
+ HLLM TAC,@TAC1\r
+ SUBI UUO,1 ;AND NAME\r
+ SUBI TAC1,1\r
+ MOVE TAC,@UUO\r
+ MOVEM TAC,@TAC1\r
+\r
+ PUSHJ PDP,WUFD ;RE-WRITE THE BLOCK\r
+ JRST DFREXT ;LEAVE\r
+\r
+;FILE COULD NOT BE RENAMED BECAUSE OF PROTECTION\r
+\r
+DFRN8A: TLNE IOS,PRCHG ;PROTECTION CHANGE?\r
+ JRST DFREN2 ;YES\r
+\r
+DFREN8: PUSHJ PDP,DFCL21 ;TAKE OUT ACCESS ENTRY\r
+ JRST DFERR5 ;AND LEAVE\r
+\r
+;FILE COULD NOT BE RENAMED BECAUSE IT WAS BEING CREATED.\r
+\r
+DFREN9: SCHEDULE\r
+ PUSHJ PDP,DFCL21 ;TEAKE OUT ACCESS ENTRY\r
+ JRST DFERR6\r
+\f\r
+;DELETE A FILE FROM A UFD\r
+\r
+DFREN7: PUSHJ PDP,FINDE ;FIND THE CORRECT BLOCK\r
+\r
+ NOSCHEDULE\r
+ MOVEI TAC1,@TAC1\r
+ SUBI TAC1,1 ;DESTINATION\r
+ HRLI TAC1,2(TAC1) ;SOURCE IS ENTRY BEYOND DESTINATION\r
+\r
+ HRRZ AC2,DSKBUF(DEVDAT)\r
+ ADDI AC2,BLKSIZ-2 ;SET LIMIT OF BLT\r
+ TLNN IOS,UBFS ;BUFFER IN MONITOR ONE?\r
+ ADDI AC2,(PROG) ;NO. RELOCATE\r
+\r
+ BLT TAC1,(AC2) ;MOVE SOME WORDS UP (ONE TOO MANY BECAUSE\r
+ ; COULD BE DELETING 64TH ENTRY IN UFD BLOCK)\r
+\r
+ SETZM @AC2 ;MAKE SURE OF ZERO\r
+ SETZM 1(AC2)\r
+ SCHEDULE\r
+\r
+ PUSHJ PDP,WUFD ;RE-WRITE\r
+ AOS (PDP) ;SKIP RETURN\r
+ HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY\r
+ MOVEI TAC1,DTBIT\r
+ IORM TAC1,TBITS(TAC) ;SET TO DELETE WHEN THROUGH READIN\r
+ JRST DFCL21 ;CLOSE ACCESS ENTRY AND LEAVE\r
+\f\r
+;SET UP ARGUMENT LIST FOR LOOKUP, ENTER, AND RENAME\r
+;SEARCH THRU MFD AND UFD FOR THE FILE-NAME,\r
+;EXIT TO CALL+1 IF A UFD CANNOT BE FOUND.\r
+;EXIT TO CALL+2 IF THE FILE IS NOT FOUND.\r
+;EXIT TO CALL+3 IF FILE IS BEING WRITTEN\r
+;EXIT TO CALL+4 IF FILE IS BEING READ\r
+;EXIT TO CALL+5 IF THE FILE DOES NOT HAVE ACCESS ENTRY.\r
+\r
+;UPON EXIT, (PDP) = OWNER PROJ,-PROG. NUMBER\r
+\r
+EXTERNAL SYSPP,JOB,PRJPRG,CPOPJ2,CPOPJ1\r
+\r
+SETLE: MOVSI TAC,RENBIT ;TURN OFF THE FLAG\r
+ ANDCAM TAC,DEVOAD(DEVDAT)\r
+\r
+SETLE0: MOVEM IOS,DEVIOS(DEVDAT)\r
+ TLO UUO,PROG\r
+ MOVE AC1,@UUO ;PICK UP FILE NAME\r
+ MOVEM AC1,DEVFIL(DEVDAT) ;STORE FILE NAME AND EXT IN DDB\r
+\r
+ ADDI UUO,1\r
+ HLLZ AC1,@UUO\r
+ MOVEM AC1,DEVEXT(DEVDAT)\r
+ ADDI UUO,2 ;UUO POINTS TO PP\r
+SETLE9: MOVE ITEM,JOB ;TRY CURRENT JOB PP.\r
+ SKIPG DAT,@UUO ;IS IT A PP?\r
+ MOVE DAT,PRJPRG(ITEM) ;NO. GET PP FROM TABLE.\r
+ TLNE DEVDAT,SYSDEV ;SYSTEM DEVICE?\r
+ MOVE DAT,SYSPP ;YES, USE SYSTEM (CUSP) PROJ,PROG #\r
+ MOVEM DAT,@UUO\r
+ MOVEM DAT,DEVPPN(DEVDAT) ;SAVE PRJ,PRG FOR USE BY UUOCON\r
+ SUBI UUO,3 ;UUO POINTS TO FILE NAME\r
+ EXCH DAT,(PDP) ;PUT PP-NUMBER IN PD LIST\r
+ PUSH PDP,DAT ;PDP POINTS TO CALL+1\r
+\f\r
+;SEARCH MFD FOR THE OWNER OF THE FILE\r
+\r
+ MOVE DAT,-1(PDP) ;XWD PROJ,PROG\r
+ MOVSI AC1,(SIXBIT /UFD/) ;EXTENSION "UFD"\r
+ MOVE TAC,MFDBLK ;BLOCK# OF MFD RIB\r
+ PUSHJ PDP,DIRSRC\r
+ POPJ PDP, ;UFD NOT THERE\r
+\r
+;SEARCH UFD FOR THE FILE\r
+\r
+ AOS (PDP) ;PDP POITNS TO CALL+2\r
+ ADDI TAC,1 ;POINT TO XWD SIXBIT/EXT/,BLOCK#\r
+ HRRZ TAC,@TAC ;BLOCK# OF UFD RIB\r
+ HRLM TAC,SETCNT(DEVDAT) ;SAVE BLOCK#\r
+ SETZM DEVCNT(DEVDAT) ;LH WILL BE USED TO COUNT UFD BLOCKS\r
+ MOVE AC1,DEVEXT(DEVDAT)\r
+ PUSHJ PDP,DSRC10 ;SEARCH UFD\r
+ POPJ PDP, ;FILE NOT THERE\r
+\r
+ ADDI TAC,1 ;POINT TO XWD SIXBIT/EXT/,BLOCK#\r
+ MOVE AC3,@TAC\r
+ HRRM AC3,DEVEXT(DEVDAT) ;SAVE BLOCK# OF FIRST RIB\r
+ AOS (PDP) ;PDP POINTS TO CALL+3\r
+ MOVE AC2,-1(PDP) ;XWD PROJ,PROG\r
+ NOSCHEDULE\r
+ PUSHJ PDP,SCNAT0 ;LOOK IN ACCESS TABLE\r
+ JRST CPOPJ2 ;NOT THERE. RETURN TO CALL+5\r
+ MOVE DAT,TBITS(TAC) ;RENAMING?\r
+ TRNE DAT,WTBIT ;BEING WRITTEN?\r
+ POPJ PDP, ;YES. RETURN TO CALL+3\r
+ TRNN DAT,RTBIT\r
+ JRST CPOPJ1 ;NO, ALL OK, RETURN TO CALL+4\r
+ MOVE TAC,DEVOAD(DEVDAT) ;ARE WE RENAMING?\r
+ TLNE TAC,RENBIT\r
+ POP PDP,TAC ;YES\r
+ POP PDP,TAC\r
+ JRST DFERR6\r
+\f\r
+;CHECK RETRIEVAL INFO FOR ELIGIBILITY\r
+;ENTER WITH C(DAT) = PROTECTION TO CHECK IN BITS 0-2\r
+;EXIT TO CALL+1 IF NAME OR EXTENSION WRONG\r
+;EXIT TO CALL+2 IF PROTECTION WRONG\r
+;EXIT TO CALL+3 IF ALL OK\r
+\r
+EXTERNAL JOB,PRJPRG,CPOPJ1,DUMPPP\r
+\r
+PROTEK: MOVEI TAC,PTR1(DEVDAT) ;POINT TO RETRIEVAL INFO\r
+ MOVE AC1,@TAC ;NAME OK?\r
+ CAME AC1,DEVFIL(DEVDAT)\r
+ POPJ PDP, ;NO\r
+ HLLZ AC2,DEVEXT(DEVDAT)\r
+ HLLZ AC1,1(TAC) ;EXTENSION FROM RIB\r
+ CAM AC1,AC2\r
+ POPJ PDP, ;EXTENSION NOT RIGHT\r
+\r
+ AOS (PDP)\r
+PROTKX: MOVE AC1,-1(PDP)\r
+\r
+PROTKY: MOVE ITEM,JOB\r
+ XOR AC1,PRJPRG(ITEM)\r
+ TRNN AC1,-1 ;SAVEM PROGRAMMER?\r
+ JRST PROT1 ;YES\r
+\r
+ ROT DAT,-3 ;ROTATE TO PROJECT FIELD\r
+ TLNE AC1,-1 ;NO, SAME PROJECT?\r
+ ROT DAT,-3 ;NO, ROTATE TO UNIVERAL FIELD\r
+\r
+PROT1: TLZ DAT,60000 ;DO NOT TEST OWNER READ OR PROTECT PROTECTION\r
+ TDNN DAT,2(TAC)\r
+ JRST CPOPJ1 ;PROTECTION O.K.\r
+ MOVE AC1,PRJPRG(ITEM)\r
+ CAMN AC1,DUMPPP ;EQUAL TO DUMPPER PROJECT\r
+ ;PROGRAMMER NUMBER?\r
+ AOS(PDP) ;YES, ALL FILES AVAILABLE\r
+ POPJ PDP,\r
+\f\r
+;CLOSE UUO\r
+;CLOSE AN OUTPUT FILE\r
+\r
+EXTERNAL PIOMOD,WAIT1,OUT\r
+\r
+DFCLSO: TLNN DEVDAT,ENTRB ;ENTER DONE YET?\r
+ POPJ PDP, ;NO, FORGET IT\r
+ HLRZ TAC,DEVACC(DEVDAT) ;SHOULD WE CLOSE? (POINT TO ACCESS ENTRY)\r
+ IFN FTRCHK,<\r
+ SKIPN TAC ;ACCESS TABLE POINTER EXISTS?\r
+ HALT . ;IF NOT, HALT, NO RE-START POSSIBLE.\r
+>\r
+ MOVE TAC,TBITS(TAC)\r
+ IFN FTRCHK, <\r
+ TRNN TAC,ATCLO+RWTBIT ;CREATION OR UPDATE OF FILE IN PROGRESS?\r
+ HALT . ;NO, ERROR. CAN'T CONTINUE\r
+>\r
+ LDB TAC,PIOMOD\r
+ CAIGE TAC,DR ;DUMP MODE?\r
+ TLNE DEVDAT,DSKRLB ;RESET UUO IN PROGRESS?\r
+ JRST DFCL2 ;YES TO EITHER QUESTION\r
+ HLRZ TAC,DEVBUF(DEVDAT) ;NO. GET ADDRESS OF OUTPUT\r
+ ; BUFFER HEADER BLOCK.\r
+ TLO TAC,PROG ;RELOCATE\r
+ SKIPG TAC1,@TAC ;VIRGIN BUFFERS (NO RING SET-UP) ?\r
+ JRST DFCL2 ;YES, DON'T OUTPUT\r
+ AOS TAC ;TAC POINTS TO OUTPUT BYTE POINTER\r
+ ADD TAC1,[XWD PROG,1] ;TAC1 POINTS TO WORD COUNT PRECEDING\r
+ ; USER DATA BUFFER\r
+ HRRZ AC1,@TAC ;PICK UP OUTPUT BYTE POINTER\r
+ SKIPE AC1 ;DON'T CALCULATE WORD COUNT IF BYTE POINTER\r
+ ; NOT SET UP\r
+ SUBI AC1,(TAC1) ;CALCULATE NUMBER OF WORDS USER HAS FILLED\r
+ TRNE IOS,IOWC ;USER KEEPING HIS OWN WORD COUNT ?\r
+ HRRZ AC1,@TAC1 ;YES, SUBSTITUTE HIS COUNT FOR\r
+ ; COMPUTED WORD COUNT\r
+ SKIPN AC1 ;WORD COUNT EQUAL TO 0?\r
+ JRST DFCL2 ;YES, DON'T OUTPUT 0-WORD FINAL BLOCK.\r
+ PUSHJ PDP,OUT ;NO, GO WRITE LAST PARTIAL BUFFER\r
+ PUSHJ PDP,WAIT1 ;WAIT FOR IT TO FINISH\r
+ \r
+DFCL2: PUSHJ PDP,SETBUF ;CHOOSE A BUFFER AREA FOR RETRIEVAL POINTERS\r
+ TLO IOS,NMP!NCTRLC ;SET NMP, MUST NOT INTERRUPT POINTER WRITING\r
+ MOVEM IOS,DEVIOS(DEVDAT) ;DO DFO4A WON'T READ NEW POINTERS IN\r
+ PUSHJ PDP,DFO4A ;WRITE OUT LAST BLOCK OF POINTERS\r
+ HLRZ AC1,DEVBLK(DEVDAT)\r
+ XOR AC1,DEVEXT(DEVDAT)\r
+ TRNE AC1,-1 ;ONLY ONE BLOCK OF POINTERS?\r
+ PUSHJ PDP,RRIB ;NO. READ FIRST BLOCK INTO BUFFER\r
+ PUSHJ PDP,SET000\r
+ ADDI TAC1,3 ;SET TAC1 TO POINT TO 4TH WORD OF BUFFER\r
+ MOVN AC1,DEVCNT(DEVDAT) ;PICK UP AND NEGATE SIZE OF FILE\r
+ HRLM AC1,@TAC1 ;NEGATIVE WORD COUNT INTO FOURTH WORD OF FIRST RIB\r
+ PUSHJ PDP,WRIB ;WRITE OUT FIRST BLOCK OF RETRIEVAL INFORMATION\r
+\f\r
+;CLOSE UUO CONTINUED.\r
+;THE FILE AND ALL ITS POINTERS HAVE BEEN PUT ON DISK.\r
+;NOW PUT ENTRY IN DIRECTORY.\r
+ TLZ DEVDAT,ENTRB\r
+ HLRZ TAC,DEVACC(DEVDAT) ;PICK UP ACCESS TABLE POINTER\r
+ MOVE DAT,TBITS(TAC) ;GET STATUS BITS AND READ COUNT\r
+ TRZE DAT,RWTBIT ;CLOSING AND UPDATED FILE?\r
+ JRST DFCLU1 ;YES\r
+ TLNE DEVDAT,DSKRLB ;RESET UUO IN PROGRESS?\r
+ JRST DFC16A ;YES\r
+ TRNN DAT,ATIND ;IUS NAME ALREADY IN DIRECTORY?\r
+ JRST DFCL20 ;NO. INSERT IT\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ PUSHJ PDP,FINDE ;BRING IN BLOCK WITH THIS ENTRY.\r
+ MOVE TAC,DEVEXT(DEVDAT) ;CHANGE BLOCK POINTER\r
+ EXCH TAC,@TAC1 ;TAC1 POINTS TO ENTRY IN UFD BLOCK\r
+ MOVEM TAC,DEVEXT(DEVDAT);SAVE POINTER TO RIB OF OLD VERSION FOR RECLAM \r
+ PUSHJ PDP,WUFD ;WRITE THE BLOCK BACK OUT\r
+ HLRZ TAC,DEVACC(DEVDAT) ;ACCESS TABLE POINTER\r
+ NOSCHEDULE\r
+ PUSH PDP,ATPP(TAC) ;SAVE XWD PROJ,PROG\r
+ PUSHJ PDP,CLRAT ;REMOVE THE ACCESS ENTRY\r
+ POP PDP,AC2 ;XWD PROJ,PROG\r
+ PUSHJ PDP,SCNAT0 ;SCAN FOR ANY OTHERS READING OLD VERSION\r
+ JRST DFCL17 ;NONE\r
+ \r
+DFCL16: MOVEI AC1,DTBIT ;DELETE WHEN THRU READING SINCE IT WAS JUST UPDATED\r
+ IORM AC1,TBITS(TAC)\r
+ PUSHJ PDP,SCNAT2 ;LOOK FOR MORE\r
+ JRST CLRBUF ;NO MORE\r
+ JRST DFCL16\r
+DFC16A: PUSHJ PDP,CLRAT ;UPON RESET UUO WITH PARTIALLY WRITTEN FILE.\r
+ ; CLEAR ACCESS TABLE ENTRY RECLAIM DISK SPACE.\r
+ \r
+DFCL17: SCHEDULE\r
+ HRRZ TAC,DEVEXT(DEVDAT) ;RIB# OF FILE\r
+ JRST RECLAM\r
+ \r
+DFCL20: PUSHJ PDP,INSDIR ;INSERT THE NAME\r
+ HLRZ TAC,DEVACC(DEVDAT) ;ACCESS TABLE POINTER\r
+ NOSCHEDULE\r
+ PUSHJ PDP,CLRAT ;REMOVE THE ACCESS ENTRY\r
+ JRST CLRBUF ;CLEAR ANY BUFFER IN FREE STORAGE\r
+DFCLU1: MOVEM DAT,TBITS(TAC) ;STORE STATUS BITS (WITH UPDATE MARKER CLEARED)\r
+ TLN DEVDAT,LOOKB ;WAS IUNPUT SIDE OF FILE ALSO CLOSED?\r
+ POPJ PDP, ;NO, LET THE USER KEEP READING IT\r
+ TRNE DAT, RCOUNT ;YES, ANYBODY ELSE STILL READING IT?\r
+ JRST DFCLU2 ;YES\r
+ TRNE DAT,DTBIT ;NO, WAS IT MARKED FOR DELETION?\r
+ JRST DFC16A ;YES, GO DELETE IT AND RECLAIM DISK SPACE\r
+ PUSHJ PDP,CLRAT ;NO, CLEAR ACCESS TABLE ENTRY\r
+DFCLU2: HRRZS DEVACC(DEVDAT) ;CLEAR POINTER TO ACCESS TABLE\r
+ JRST CLRBUF ;CLEAR ANY BUFFER AREA AND EXIT.,\r
+\r
+\r
+ ;CLOSE UUO CONTINUED.\r
+;CLOSE AN INPUT FILE.\r
+\r
+DFCLSI: TLZN DEVDAT,LOOKB\r
+ POPJ PDP,\r
+DFCL21: HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY\r
+ JUMPE TAC,CPOPJ ;EXIT IF ACCESS TABLE ALREADY CLOSED\r
+ ; (PROBABLY ^C DURING EARLIER ATTEMPT)\r
+ MOVE TAC1,TBITS(TAC) ;GET STATUS BITS\r
+ IFN FTRCHK,<\r
+ TRNE TAC1,ATCLO ;IS THIS FILE SIMPLY BEING CREATED (NOT UPDATED)?\r
+ HALT CPOPJ ;IF SO, SOMEBODY IS VERY CONFUSED.\r
+>\r
+ NOSCHEDULE\r
+ SOS TAC1,TBITS(TAC) ;DECREMENT RCOUNT\r
+ TRNE TAC1,RCOUNT+RWTBIT ;ANY MORE READS? OR OUTPUT CLOSE TO DO?\r
+ JRST DFCL23 ;YES, LEAVE\r
+\r
+ TRNE TAC1,DTBIT ;TO BE DELETED?\r
+ JRST DFC16A ;YES\r
+ PUSHJ PDP,CLRAT ;CLEAR THE ENTRY AND EXIT\r
+DFCL23: SCHEDULE\r
+ TLZN DEVDAT,INPB ;ANY INPUT UUO'\r
+ JRST CLRBUF ;NO, JUST EXIT, RETURNING MON BUF\r
+ PUSHJ PDP,SETBUF ;YES, UPDATE ACCESS DATE AS FOLLOWS:\r
+ PUSHJ PDP,RRIB ;READ IN JUST BLOCK OF RETRIEVAL INFORMATION.\r
+ SUBI TAC1,BLKSIZ-2 ;SET TAC1 TO 2ND WORD OF BLOCK\r
+ LDB AC1,[POINT 17,@TAC1,35] ;GET PREVIOUS ACCESS DATA.\r
+ CAMN AC1,THSDAT ;ALREADY ACCESSED EARLIER TODAY?\r
+ JRST CLRBUF ;YES, JUST CLEAR BUFFER AND EXIT.\r
+ MOVE AC1,THSDAT ;NO, STORE TODAY(S DATE AS NEW ACCESS DATE.\r
+ DPB AC1,[POINT 17,@TAC1,35] ;\r
+ PUSHJ PDP,WRIB ;REWRITE FIRST BLOCK OF RETRIEVAL INFORMATION.\r
+ JRST CLRBUF ;CLEAR BUFFER AND EXIT.\r
+\r
+SUBTTL DIRECTORY SEARCHING\r
+;SEARCH DIRECTORY FOR A PARTICULAR ENTRY.\r
+;ENTRY BY: MOVE DAT,NAME\r
+; HLLZ AC1,EXTENSION\r
+; HRRZ TAC,BLOCK NUMBER FOR POINTERS\r
+; PUSHJ PDP,DIRSRC\r
+; EXIT1 NAME NOT FOUND\r
+; EXIT2 NAME FOUND, TAC POINTS TO ENTRY\r
+\r
+DIRSRC: PUSH PDP,AC1\r
+ PUSH PDP,DAT ;0(PDP) IS FILENAME,-1(PDP) IS EXTENSION\r
+ PUSHJ PDP,SETPTR ;READ UFD RETRIEVAL POINTERS\r
+DRSRC0: HRRZ TAC,DEVACC(DEVDAT)\r
+ CAILE TAC,PTRN(DEVDAT) ;MORE POINTERS IN CORE?\r
+ JRST DRSRC7 ;NO, GET MORE.\r
+ HRRZ TAC,(TAC)\r
+ JUMPE TAC,DRSRC6 ;0 SIGNALS END OF POINTERS\r
+ AOS DEVACC(DEVDAT) ;NEXT POINTER\r
+\r
+ AOS DEVCNT(DEVDAT) ;COUNT UFD BLOCKS SEARCHED\r
+ PUSHJ PDP,MQIN ;READ IN DATA BLOCK\r
+ JRST RERA ;ERROR, YOU LOSE.\r
+\r
+ MOVE TAC1,DSKBUF(DEVDAT) ;XWD-L,POINTER\r
+ HRRZ TAC,TAC1\r
+ TLNN IOS,UBFS ;DUMP MODE?\r
+ HRLI TAC,PROG ;NO. RELOCATE.\r
+ HLLZ AC1,-1(PDP) ;SIXBIT/EXT/\r
+DRSR3A: SKIPN AC3,@TAC ;BLOCK ENTIRELY SEARCHED?\r
+ JRST DRSRC0 ;YES\r
+ ADDI TAC,1\r
+ CAMN AC3,(PDP) ;NAMES MATCH?\r
+ JRST DRSRC8 ;YES\r
+\r
+DRSRC4: ADDI TAC,1\r
+ HRRZ AC3,TAC\r
+ CAIE AC3,BLKSIZ(TAC1) ;IS BLOCK ENTIRELY SEARCHED?\r
+ JRST DRSR3A ;NO\r
+ JRST DRSRC0\r
+\r
+DRSRC7: TLNE IOS,NMP ;ANY MORE POINTERS ON DISK?\r
+ JRST DRSRC6 ;NO\r
+ PUSHJ PDP,GETPTR ;YES, GET SOME\r
+ JRST DRSRC0\r
+\r
+DRSRC8: HLLZ AC3,@TAC ;DOES EXTENSION MATCH\r
+ CAME AC3,AC1\r
+ JRST DRSRC4 ;NO\r
+ SUBI TAC,1 ;POINT TO FIRST WORD OF ENTRY\r
+\r
+ AOS -2(PDP) ;YES, ENTRY IS FOUND\r
+ MOVSS DEVCNT(DEVDAT) ;SAVE COUNT OF UFD BLOCKS FOR USE AT CLOSE\r
+;EXIT\r
+\r
+DRSRC6: POP PDP,DAT\r
+ POP PDP,AC1\r
+ POPJ PDP, ;"FILE" NOT FOUND\r
+;CHECK PROTECTION ON UFD\r
+\r
+DSRC10: PUSH PDP,AC1 ;PUSH EXTENSION\r
+ PUSHJ PDP,SETPTR\r
+ MOVSI DAT,200000 ;SET UP TO TEST READ BIT\r
+ TLNE IOS,10 ;IS IT LOOKUP>\r
+ ROT DAT,-1 ;NO,TEST WRITE PROTECTION\r
+ MOVEI TAC,PTR1(DEVDAT)\r
+ HRRZ AC1,-3(PDP) ;XWD PROJ,PROG\r
+ TLZ IOS,PRCHG\r
+ PUSHJ PDP,PROTKY\r
+ TLO IOS,PRCHG ;FLAG PROTECTION CHANGE\r
+ PUSH PDP,DEVFIL(DEVDAT) ;PUSH FILENAME TO MAKE PDL LOOK LIKE DIRSRC\r
+ JRST DRSRC0\r
+\r
+ \r
+;FIND A UFD ENTRY, IT MUST BE THERE.\r
+\r
+EXTERNAL AUREQ,AUWAIT\r
+\r
+FINDE: AOSE AUREQ\r
+ PUSHJ PDP,AUWAIT\r
+ TLO IOS,AUFLG\r
+ HLRZ TAC,SETCNT(DEVDAT) ;SET TAC TO UFD POINTERS\r
+ HLRZ DAT,DEVCNT(DEVDAT) ;SET DAT TO COUNT COMPUTED BY DIRSRC\r
+ ADDI DAT,DIRSIZ\r
+\r
+FINDE1: MOVSM TAC,DEVBLK(DEVDAT);READ A POINTER BLOCK\r
+ PUSHJ PDP,RRIA\r
+ CAILE DAT,BLKSIZ-2 ;POINTER IN THIS BLOCK?\r
+ JRST FINDE2 ;NO, GET NEXT ONE\r
+ SUBI DAT,1 ;YES, BRING THEM IN\r
+ HRRM DAT,DEVBLK(DEVDAT) ;SET INDEX INTO RIB\r
+ PUSHJ PDP,DFIN4 ;COPY POINTERS INTO DDB\r
+ HRRZ TAC,PTR1(DEVDAT) ;GET RETRIEVAL POINTER FOR UFD BLOCK\r
+\r
+ PUSHJ PDP,MQIN ;READ THE UFD BLOCK\r
+ JRST RERA ;ERROR\r
+ PUSHJ PDP,SET000 ;FIND THE ENTRY\r
+ HLLZ AC1,DEVEXT(DEVDAT) ;GET EXTENSION FROM DDB\r
+\r
+SRCU1: MOVE TAC,@TAC1 ;GET FILE NAME FROM UFD\r
+ ADDI TAC1,1\r
+ CAME TAC,DEVFIL(DEVDAT) ;SAME?\r
+ AOJA TAC1,SRCU1 ;NAMES DO NOT MATCH\r
+ HLLZ TAC,@TAC1 ;GET EXTENSION FROM UFD\r
+ CAME TAC,AC1 ;SAME?\r
+ AOJA TAC1,SRCU1 ;EXTENSIONS DO NOT MATCH\r
+ POPJ PDP, ;FOUND IT\r
+\r
+FINDE2: PUSHJ PDP,SET176 ;GET THE NEXT POINTER BLOCK\r
+ HLRZ TAC,@TAC1\r
+ SUBI DAT,BLKSIZ-2 ;BACK UP DAT\r
+ JRST FINDE1\r
+\r
+;INSERT AN ENTRY IN A DIRECTORY.\r
+\r
+EXTERNAL AUREQ,AUWAIT,AUAVAL\r
+\r
+INSDIR: AOSE AUREQ \r
+ PUSHJ PDP,AUWAIT\r
+ TLO IOS,AUFLG\r
+ SETZM DEVCNT(DEVDAT) ;CLEAR BEFORE COUNTING BLOCK OF UFD\r
+ HLRZ TAC,SETCNT(DEVDAT) ;BLOCK# OF UFD RIB\r
+ PUSHJ PDP,SETPTR ;SET UP FIRST POINTERS,.\r
+ SOS DEVACC(DEVDAT) ;SYNC\r
+\r
+INSD1: AOS TAC,DEVACC(DEVDAT) ;GET NEXT POINTER,\r
+ HRRZS TAC\r
+ AOS DEVCNT(DEVDAT) ;COUNT EACH UFD BLOCK\r
+ CAILE TAC,PTRN(DEVDAT) ;ANY MORE IN CORE?\r
+ JRST INSD10 ;NO, GET SOME MORE\r
+\r
+INSD2: HRRZ TAC,(TAC) ;GET RETRIEVAL POINTER\r
+ JUMPE TAC,INSD5 ;0 SIGNALS END OF POINTERS\r
+ PUSHJ PDP,MQIN ;READ UFD BLOCK\r
+ JRST RERA ;ERROR.\r
+\r
+ PUSHJ PDP,SET176 ;SET TAC1 TO WORD 127\r
+ SKIPE @TAC1 ;IS IT ZERO?\r
+ JRST INSD1 ;NO, BLOCK FULL.\r
+\r
+ MOVSS DEVCNT(DEVDAT) ;SAVE RELATIVE# OF BLOCK CONTAINING NEW ENTRY\r
+ PUSHJ PDP,INSD3 ;INSERT ENTRY.\r
+\r
+ JRST WUFD ;WRITE BLOCK AND LEAVE\r
+\r
+;INSERT THE ENTRY.\r
+\r
+INSD3: HRRZ AC1,DSKBUF(DEVDAT)\r
+INSD3B: CAIN AC1,(TAC1) ;BEGINNING OF BLOCK?\r
+ JRST INSD3A ;YES\r
+ SUBI TAC1,2\r
+ SKIPN @TAC1 ;SEARCH UFD BLOCK BACKWARDS\r
+ ; FOR LAST NON-ZERO FILENAME.\r
+\r
+ JRST INSD3B\r
+\r
+ ADDI TAC1,2 ;MOVE IN NAME.\r
+INSD3A: MOVE TAC,DEVFIL(DEVDAT)\r
+ MOVEM TAC,@TAC1\r
+ ADDI TAC1,1 ;MOVE IN EXTENSION & POINTER.\r
+ MOVE TAC,DEVEXT(DEVDAT)\r
+ IFN FTRCHK,<\r
+ TRNN TAC,-1 ;POINTER TO BLOCK 0\r
+\r
+ HALT .+1 ;FOR RETRIEVAL INFO\r
+ ; CONTINUE-GET BAD INFO MESSAGE\r
+>\r
+ MOVEM TAC,@TAC1\r
+ POPJ PDP,\r
+\r
+;CREATE NEW UFD BLOCK AND ADD ENTRY. THEN FIND THE LAST OR ONLY\r
+;POINTER BLOCK, ADD POINTER IF POSSIBLE. IF NOT POSSIBLE.\r
+;CREATE NEW POINTER BLOCK AND PUT THE POINTER IN IT.\r
+\r
+INSD5: PUSHJ PDP,SET000 ;@TAC1 POINTS TO WORD 0 OF BUFFER\r
+ NOSCHEDULE\r
+ MOVEI TAC,@TAC1 ;POINT TO WORD 0 OF BUFFER\r
+ SETZM 2(TAC) ;CLEAR FOR BLT\r
+ MOVSI DAT,2(TAC) ;SOURCE\r
+ HRRI DAT,3(TAC) ;DESTINATION\r
+ BLT DAT,BLKSIZ-1(TAC) ;CLEAR WORDS 2.-127.\r
+ SCHEDULE\r
+\r
+ PUSHJ PDP,INSD3A ;INSERT ENTRY IN WORDS 0,1\r
+ MOVSS DEVCNT(DEVDAT) ;SAVE RELATIVE BLOCK# OF THIS UFD BLOCK\r
+ PUSHJ PDP,DFGETF ;GET A FREE BLOCK\r
+ MOVEM TAC,SETCNT(DEVDAT) ;SAVE IT\r
+\r
+ IFG CHKCNT,<\r
+ MOVE TAC,DSKBUF(DEVDAT)\r
+ PUSHJ PDP,CHKSUM\r
+ HRLM TAC1,SETCNT(DEVDAT)\r
+ MOVE TAC,SETCNT(DEVDAT)\r
+ >\r
+\r
+INSD5A: PUSHJ PDP,MQOUT ;WRITE THE UFD BLOCK OUT\r
+ JRST INSD11 ;ERROR\r
+\r
+ PUSHJ PDP,RRI ;READ POINTER BACK IN.\r
+INSD6: PUSHJ PDP,SET176\r
+ HLRZ TAC,@TAC1 ;LAST OR ONLY BLOCK?\r
+ JUMPE TAC,INSD7\r
+\r
+ PUSHJ PDP,RRIA ;NO, READ NEXT ONE.\r
+ JRST INSD6\r
+\r
+INSD7: SUBI TAC1,1 ;YES, ROOM FOR ANOTHER POINTER?\r
+ SKIPN @TAC1\r
+ SOJA TAC1,INSD8\r
+\r
+ PUSHJ PDP,NEWRIB ;CREATE NEW POINTER BLOCK.\r
+ PUSHJ PDP,SET000 ;SET TAC1 TO FIRST WORD\r
+INSD7A: MOVE TAC,SETCNT(DEVDAT) ;GET POINT SAVED ABOVE\r
+ MOVEM TAC,@TAC1 ;STORE POINTER TO NEW UFD BLOCK\r
+ PUSHJ PDP,WRI ;WRITE BLOCK\r
+ SOSL AUREQ ;RELEASE UFD RESOURCE\r
+ SETOM AUAVAL\r
+ TLZ IOS,AUFLG\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ POPJ PDP,\r
+\r
+;ROOM FOR ANOTHER POINTER IN THIS BLOCK. FIND LAST POINTER.\r
+;INSERT NEW ONE, AND WRITE BLOCK OUT.\r
+\r
+INSD8: SKIPN @TAC1\r
+ SOJA TAC1,INSD8 ;SCAN BACKWARDS FOR LAST POINTER\r
+ AOJA TAC1,INSD7A ;FOUND IT. ADD NEW ONE.\r
+\r
+;GET MORE POINTERS INTO CORE.\r
+\r
+INSD10: TLNE IOS,NMP ;ANY MORE ON DISC?\r
+ JRST INSD5 ;NO\r
+ PUSHJ PDP,GETPTR\r
+ MOVE TAC,DEVACC(DEVDAT)\r
+ JRST INSD2\r
+\r
+;WRITE ERROR. IF WRITE-LOCK. FIX IT.\r
+\r
+INSD11: TRNN IOS,IOIMPM\r
+ JRST WERA ;IT WAS NOT, YOU LOSE.\r
+\r
+ PUSHJ PDP,WLERA ;GET ANOTHER BLOCK\r
+ HRRM TAC,SETCNT(DEVDAT)\r
+ JRST INSD5A\r
+\r
+\r
+;OUTPUT A UFD BLOCK, PERFORM CHECKSUM IF NEEDED, WRITE THE BLOCK OUT.\r
+;IF WRITE-LOCK ERROR, TRY ANOTHER BLOCK. FINALLY, IF POINTERS WERE\r
+;ALTERED, WRITE THEM OUT.\r
+\r
+EXTERNAL AUREQ,AUAVAL\r
+\r
+WUFD: IFG CHKCNT,<\r
+ MOVE TAC,DSKBUF(DEVDAT) ;POINTER TO BUFFER\r
+ PUSHJ PDP,CHKSUM ;RETURN CHECKSUM IN TAC1\r
+ >\r
+ MOVE TAC,DEVACC(DEVDAT) ;GET POINTER LOCATION\r
+ IFG CHKCNT,<\r
+ HRLM TAC1,(TAC) ;STORE CHECKSUM IN RETRIEVAL POINTER\r
+ MOVSI TAC1,PNTDIF\r
+ ORM TAC1,DEVOAD(DEVDAT) ;NOTE THAT POINTERS IUN DDB NOT=DISK\r
+ >\r
+ IFLE CHKCNT,<\r
+ MOVE TAC1,DEVOAD(DEVDAT)\r
+ TLO TAC1,PRTOUT\r
+ TLZ TAC1,PNTDIF\r
+ MOVEM TAC1,DEVOAD(DEVDAT)\r
+ >\r
+ HRRZ TAC,(TAC) ;GET BLOCK# FROM RETRIEVAL POINTER\r
+\r
+WUFD1: PUSHJ PDP,MQOUT ;WRITE UFD BLOCK\r
+ JRST WUFD3 ;WRITE ERROR\r
+ MOVE TAC,DEVOAD(DEVDAT)\r
+ TLO IOS,NMP ;SET NMP\r
+ MOVEM IOS,DEVIOS(DEVDAT) ;SO DFO4A WON'T READ POINTERS\r
+ TLN TAC,PNTDIF ;WERE POINTERS CHANGED?\r
+ PUSHJ PDP,DFO4A ;YES, WRITE THEM OUT.\r
+ SOSL AUREQ ;RELEASE UFD RESOURCE\r
+ SETOM AUAVAL\r
+ TLZ IOS,AUFLG ;NOTE THAT UFD RELEASED\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ POPJ PDP,\r
+\r
+WUFD3: MOVE TAC1,DSKCNT(DEVDAT);WAS ERROR WRITE-LOCK?\r
+ TRNN TAC1,IOIMPM\r
+ JRST WERA\r
+ TRZ IOS,IOIMPM ;YES\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ MOVSI TAC1,PNTDIF\r
+ ORM TAC1,DEVOAD(DEVDAT)\r
+ PUSHJ PDP,WLERA ;FREE CURRENT ASSIGNED BLOCK AND GET A NEW ONE\r
+ MOVE TAC1,DEVACC(DEVDAT)\r
+ HRRM TAC,(TAC1)\r
+ JRST WUFD1\r
+\r
+SUBTTL ACCESS TABLE PROCESSING\r
+;SCAN ACCESS TABLE.\r
+;EXIT TO CALL+1 WITH TAC SET TO THE LAST ENTRY IF NOT THERE.\r
+;EXIT TO CALL+2 WITH TAC SET TO CORRECT ENTRY IF THERE.\r
+\r
+EXTERNAL CPOPJ1,CPOPJ\r
+\r
+SCANAT: MOVE AC2,-1(PDP)\r
+SCNAT0: SKIPN TAC,FAT ;ANY AT ALL?\r
+SCNHLT: POPJ PDP, ;NO, LEAVE (HALT PC HERE IF ATTEMPT\r
+ ; TO CLEAR NON-EXISTANT ACCESS TABLE)\r
+\r
+SCNAT1: CAME AC2,ATPP(TAC) ;PROJ,-PROG. THE SAME?\r
+ JRST SCNAT2 ;NO\r
+\r
+ MOVE DAT,DEVFIL(DEVDAT) ;NAMES THE SAME?\r
+ CAME DAT,ATNAME(TAC)\r
+ JRST SCNAT2\r
+\r
+ HLLZ DAT,ATEXT(TAC) ;EXTENSION THE SAME?\r
+ HLLZ AC3,DEVEXT(DEVDAT)\r
+ CAMN DAT,AC3\r
+ JRST CPOPJ1 ;YES\r
+\r
+;CONTINUE SCAN FROM CURRENT ENTRY\r
+\r
+SCNAT2: HRRZ DAT,ATLINK(TAC) ;ANY MORE ENTRIES?\r
+ JUMPE DAT,CPOPJ ;NO\r
+ MOVE TAC,DAT ;YES, GO TO THE NEXT ONE\r
+ JRST SCNAT1\r
+\r
+;CLEAR AN ACCESS ENTRY.\r
+;IT IS ASSUMED THAT NO SCHEDULING WILL TAKE PLACE.\r
+;ENTER WITH TAC POINTING TO THE ENTRY TO WIPE OUT.\r
+\r
+CLRAT: IFN FTRCHK,<\r
+ SKIPN TAC ;ATTEMPT TO CLEAR NON EXISTENT ACCESS TABLE IS AN ERROR\r
+\r
+ HALT SCNHLT ;CONTINUE WILL POPJ AND EXIT.\r
+>\r
+ HRRZS DEVACC(DEVDAT) ;CLEAR ACCESS TABLE POINTER IN DEVICE DATA BLOCK\r
+ MOVEI AC2,FAT ;START AT BEGINNING OF LINKED ACCESS TABLE ENTRIES\r
+ SUBI AC2,ATLINK\r
+\r
+CLRAT1: MOVE AC1,AC2 ;PICKUP THE NEXT ACCESS TABLE\r
+ HRRZ AC2,ATLINK(AC1)\r
+ IFN FTRCHK,<\r
+ SKIPN AC2 ;ZERO LINK INDICATES END OF TABLE WITHOUT\r
+ ;FINDING ENTRY TO BE CLEARED\r
+ HALT SETHLT ;CONTINUING AFTER THIS ERROR WILL CONTINUE\r
+ ; NORMALLY (IE POPJ)\r
+>\r
+ CAME AC2,TAC ;DOES THIS ENTRY LINK TO THE ONE TO BE CLOBBERED?\r
+ JRST CLRAT1 ;NO,CONTINUE SERACH\r
+\r
+ MOVE AC2,ATLINK(TAC) ;YES, FOUND IT\r
+ HRRM AC2,ATLINK(AC1) ;LINK AROUND IT\r
+ JRST CLRCOR ;CLEAR THE CORE\r
+\r
+;FIND A HOLD FOR ACCESS TABLE ENTRY AND SET A LINK.\r
+;BUILD UP THE ENTRY\r
+;UPON ENTRY, DAT SHOULD CONTAIN TEST BITS TO SET\r
+\r
+\r
+SETAT: PUSHJ PDP,GETFCR ;TAC1 POINTS TO 4 WORD BLOCK\r
+ HLL DAT,DEVEXT(DEVDAT)\r
+ MOVEM DAT,ATEXT(TAC1) ;STORE EXTENSION\r
+ MOVE DAT,DEVFIL(DEVDAT)\r
+ MOVEM DAT,ATNAME(TAC1) ;STORE FILE NAME\r
+ MOVE DAT,-1(PDP) ;XWD PROJ,PROG\r
+ MOVEM DAT,ATPP(TAC1) ;STORE XWD PROJ,PROG\r
+ HLL DAT,SETCNT(DEVDAT) ;LOGICAL BLOCK# OF UFD RIB\r
+ HRR DAT,FAT ;POINTER TO NEXT ENTRY\r
+ MOVEM DAT,ATLINK(TAC1) ;STORE LINKE\r
+ HRRZM TAC1,FAT ;POINT FAT TO THIS NEW ENTRY\r
+SETHLT: POPJ PDP, ;HALT PC HERE IF END OF TABLE WITHOUT FINDING\r
+ ; ENTRY TO BE CLEARED\r
+\r
+SUBTTL DUMP INPUT/OUTPUT\r
+;DUMP MODE OUTPUT\r
+\r
+EXTERNAL COMCHK,ADRERR,SAVDDL\r
+\r
+DFDMPO: TLNN DEVDAT,ENTRB ;ENTER YET?\r
+ JRST DFERR2 ;NO, UNDEFINED FILE\r
+\r
+ TLO IOS,10 ;OUTPUT STATUS\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ PUSHJ PDP,COMCHK ;CHECK IOWDS\r
+ JRST ADRERR ;ERROR\r
+\r
+DFDO0: SKIPN TAC,@UUO ;PICK UP NEXT IOWD\r
+ POPJ PDP, ;IT WAS ZERO, LEAVE\r
+ TLNE TAC,-1 ;LH ZERO?\r
+ JRST DFDO0A ;NO\r
+ HRR UUO,TAC ;YES, ANOTHER TABLE\r
+ JRST DFDO0\r
+\r
+DFDO0A: ADDI TAC,1 ;FORM XWD - LENGTH, FIRST-ADDRESS\r
+ PUSH PDP,TAC ;SAVE IT\r
+\r
+DFDO1: PUSHJ PDP,UPDA ;SET DAREQ INTERLOCK (SAT BLOCKS MAY ONLY\r
+ ; BE MANIPULATED BY ONE USER AT A TIME!)\r
+DFDO1A: PUSHJ PDP,SATGET ;AQUIRE A NON-FULL SAT BLOCK\r
+ ; ITEM IS DESTROYED IF SATGET CALLS MQIN,MQOUT\r
+ HLRE ITEM(PDP) ;ITEM < [LH OF IOWD]/200\r
+ MOVMS ITEM\r
+ ADDI ITEM,BLKSIZ-1 ;MAKE E.G. 129 WORDS USE 2 DISK BLOCK\r
+ ASH ITEM,-BLKP2 ;NUMBER OF BLOCK REQUIRED FOR THIS WRITE\r
+DFDO2A: HRRZ AC1,SATPTR\r
+ MOVE AC2,SATBK2\r
+DFDO1B: PUSHJ PDP,GETBIT ;ASK FOR C(ITEM BITS)\r
+ JRST DFDO6 ;NOT AVAILABLE\r
+\r
+ ADDM ITEM,@SATPTR ;INCREMENT COUNT\r
+ SETOM SATCHG ;SAT BLOCK HAS BEEN CHANGED\r
+ HLRZ DAT,@SATPTR ;COMPUTE BLOCK NUMBER LESS 1.\r
+ SCHEDULE\r
+ PUSHJ PDP,DOWNDA ;RESET DAREQ INTERLOCK.\r
+ ADDI DAT,-2(TAC1)\r
+ PUSH PDP,DAT ;AND SAVE BLOCK NUMBER LESS 1\r
+ PUSH PDP,ITEM ;SAVE COUNT OF BLOCKS WRITTEN\r
+ MOVE TAC1,-2(PDP) ;SET UP AN IOWD (SAVED AT DFDO0A)\r
+ MOVEM TAC1,DSKBUF(DEVDAT)\r
+ MOVN TAC,ITEM\r
+ LSH TAC,BLKP2\r
+ HLRES TAC1\r
+\r
+ CAML TAC,TAC1\r
+ HRLM TAC,DSKBUF(DEVDAT) ;ONLY A PARTIAL WRITE\r
+ HLRE TAC1,DSKBUF(DEVDAT)\r
+ MOVMS TAC1\r
+ PUSHJ PDP,UPDEVC ;UPDATE SIZE OF FILE\r
+ ADDM ITEM,SETCNT(DEVDAT) ;NON UPDATE RELATIVE BLOCK# WITHIN THE FILE\r
+\r
+ MOVE TAC1,DSKBUF(DEVDAT) ;PICK UP ADDRESS AND WORD COUNT\r
+ TLZN TAC1,BLKSIZ-1 ;AN EVEN NUMBER OF DISK BLOCKS TO BE WRITTEN?\r
+ JRST DFDO2G ;YES, DON'T WORRY ABOUT PARTIAL BLOCK\r
+ ;HANDLING PROBLEMS\r
+ PUSH PDP,TAC1 ;NO, SAVE ADDRESS WITH COUNT OF FULL BLOCKS-1\r
+ ; TO BE WRITTEN\r
+ PUSH PDP,DSKBUF(DEVDAT) ;SAVE,ORIGINAL ADDRESS ;EXACT WORD COUNT ALSO\r
+ PUSHJ PDP,SETBUF ;GET MONITOR BUFFER\r
+ MOVE TAC1,DSKBUF(DEVDAT) ;TAC1 GETS ADDRESS OF MONITOR BUFFER\r
+ ; (RELOCATION NOT NECESSARY)\r
+ POP PDP,TAC ;USER'S INITIAL ADDR AND WC\r
+ PUSHJ PDP,SAVDDL ;ADJUST IN CASE THIS IS A SAVE OF A \r
+ ; HIGH SEGMENT, WHICH WAS MOVED IN CORE\r
+ ; DURING I/O WAIT.\r
+ MOVE AC1,TAC\r
+ HRRZ TAC,-2(PDP) ;GET INITIAL BLOCK NUMBER-1\r
+DFDO2C: ADD AC1,[XWD BLKSIZ,BLKSIZ] ;SET UP ADDRESS, WORD COUNT, AND LOGICAL\r
+ AOS TAC ;BLOCK NUMBER FOR LAST (PARTIAL) BLOCK\r
+ JUMPL AC1,DFDO2C ;OF THIS DUMP MODE OUTPUT REQUEST.\r
+ SUB AC1,[XWD BLKSIZ,BLKSIZ]\r
+ HLL AC2,AC1 ;SAVE LH\r
+DFDO2D: MOVE AC2,(AC1) ;MOVE DATA FROM END OF USER'S\r
+ MOVEM AC2,(TAC1) ;OUTPUT AREA DT MONITOR BUFFER\r
+ AOBJP TAC1,.\r
+ AOBJP AC1,DFDO2D\r
+DFDO2E: SETZM (TAC1) ;ZERO OUT THE REMAINDER OF THE MONTOR BUFFER\r
+ AOBJN TAC1,DFDO2E\r
+ PUSHJ PDP,MQOUT ;WRITE OUT THE PARTIAL FULL MONITOR BUFFER\r
+ ; WHICH CONTAINS THE LAST BLOCK OF THE DUMP MODE\r
+ ; MODE OUTPUT REQUEST\r
+ JFCL ;IGNORE ERROR RETURN\r
+ PUSHJ PDP,CLRBUF ;RELINQUISH THE MONTOR BUFFER\r
+ POP PDP,DSKBUF(DEVDAT) ;RETRIEVE ORIGINAL ADDRESS\r
+ MOVSI TAC1,BLKSIZ ;WITH WORD COUNT THSAT HAS LOW-ORDER BITS CLEARED\r
+ ADDB TAC1,DSKBUF(DEVDAT) ;ADD IN BLOCK SIZE TO DETERMINE NUMBER\r
+ ; NUMBER OF FULL BLOCKS YET TO BE WRITTEN\r
+ JUMPG TAC1,DFDO2B ;IF NO FULL BLOCKS TO BE WRITTEN SKIP OVER\r
+ ; OUTPUT SEQUENCE\r
+DFDO2G: MOVE TAC,DSKBUF(DEVDAT) ;ORIGINAL ADDRESS AND WORD COUNT\r
+ PUSHJ PDP,SAVDDL ;AJDUST IN CASE OF SAVE OF HIGH SEG\r
+ ; WHICH HAS MOVED DURING IO WAIT\r
+ MOVEM TAC,DSKBUF(DEVDAT) ;STORE BACK IN DDB\r
+ MOVE TAC,-1(PDP) ;WRITE THE BLOCKS\r
+ ADDI TAC,1\r
+ PUSHJ PDP,MQOUT\r
+ JRST DFDO7 ;ERROR\r
+DFDO2B: POP PDP,ITEM ;RESTORE COUNT\r
+\r
+;TOSS OUT A SERIES OF CONSECUTIVE POINTERS\r
+\r
+ HRRZ AC2,DEVACC(DEVDAT) ;GET RETRIEVAL POINTER POINTER\r
+DFDO3A: MOVE AC1,@AC2 ;IS POINTER ALREADY THERE?\r
+ ADDI AC2,1\r
+ TRNE AC1,-1 \r
+ JRST DFDO9 ;YES\r
+\r
+ CAIG AC2,PTRN(DEVDAT) ;NO, IS THERE A NEXT ONE?\r
+ SETZM @AC2 ;CLEAR NEXT POINTER\r
+ TLO IOS,NMP ;FLAG END OF POINTERS\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+DFDO3B: AOS DAT,(PDP) ;PUT A POINTER IN CORE\r
+ HRRZM DAT,-1(AC2) ;STORE NEW POINTER IN DDB\r
+ MOVSI DAT,PNTDIF\r
+ ORM DAT,DEVOAD(DEVDAT) ;SHOW THAT POINTERS IN DDB NOT=DISK\r
+ \r
+ IFG CHKCNT,< ;GET CHECKSUM\r
+ MOVE TAC,-1(PDP)\r
+ PUSHJ PDP,SAVDDL ;ADJUST ADR IN CASE OF HIGH SEG SAVE\r
+ PUSHJ PDP,CHKSUM\r
+\r
+ HRLM TAC1,-1(AC2)\r
+ >\r
+\r
+ CAILE AC2,PTRN(DEVDAT) ;MORE POINTERS?\r
+ JRST DFDO4 ;LAST POINTER IN CORE\r
+\r
+DFDO3C: MOVE TAC1,[XWD BLKSIZ,BLKSIZ];INCREMENT IOWD\r
+ ADDM TAC1,-1(PDP)\r
+ SOJG ITEM,DFDO3A ;ANY MORE?\r
+ POP PDP,DAT\r
+ HRRM AC2,DEVACC(DEVDAT)\r
+ SKIPGE (PDP)\r
+ JRST DFDO1 ;NOT FINISHED, GET NEXT SET\r
+ POP PDP,TAC ;BACK UP PDP\r
+ AOJA UUO,DFDO0 ;GO BAK FOR MORE\r
+\r
+;WRITE POINTERS ONTO DISK\r
+\r
+DFDO4: HRLM ITEM,(PDP) ;SAVE COUNT OF BLOCKS TO WRITE\r
+ PUSHJ PDP,SETBUF ;FIND SOME 200 WORD AREA\r
+ PUSHJ PDP,DFO4A ;WRITE THEM\r
+ PUSHJ PDP,CLRBUF ;CLEAR THE AREA\r
+ MOVEI AC2,PTR1(DEVDAT) ;RESET AC2 TO FIRST POINTER\r
+ HLRZ ITEM,(PDP) ;RESTORE COUNT OF BLOCKS TO WRITE\r
+ JRST DFDO3C\r
+\r
+DFDO6: LSH ITEM,-1 ;TRY FOR 1/2 EARLIER REQUEST\r
+ JUMPN ITEM,DFDO1B ;CONTINUE IF NON-ZERO\r
+ MOVEI TAC,NUMBIT ;BITS/SAT BLOCK\r
+ HRRM TAC, @SATPTR ;MARK SAT ENTRY FULL\r
+ JRST DFDO1A ;TRY ANOTHER SAT BLOCK\r
+\r
+;ERROR WHILE WRITING, IF WRITE-LOCK, FIX IT,\r
+\r
+DFDO7: HRRZ TAC,DSKCNT(DEVDAT) ;WRITE-LOCK?\r
+ TRNN TAC,IOIMPM\r
+ JRST DFDO2B ;NO, TOO BAD.\r
+\r
+ HLRZ TAC,DSKCNT(DEVDAT)\r
+ PUSHJ PDP,SETWL ;SET WRITE-LOCK BIT IN SAT ENTRY.\r
+ \r
+DFDO8: AOS TAC,-1(PDP)\r
+ PUSHJ PDP,SETFRE\r
+ SOSLE (PDP)\r
+ JRST DFDO8\r
+ SUB PDP,[XWD 2,2]\r
+ JRST DFDO1 ;TRY AGAIN.\r
+\r
+;WE ARE WRITING IN MIDDLE OF FILE, FREE THE OLD BLOCK.\r
+\r
+DFDO9: HRLM ITEM,(PDP) ;SAVE BLOCK COUNT WITH BLOCK#\r
+ PUSH PDP,AC2 ;SAVE POINTER TO RETRIEVAL INFO IN DDB\r
+ HRRZ TAC,-1(AC2) ;GET OLD BLOCK# FROM DDB\r
+ PUSHJ PDP,SETFRE\r
+ POP PDP,AC2 ;RESTORE POINTER INTO RETRIEVAL INFO\r
+ HLRZ ITEM,(PDP) ;RESTORE COUNT OF BLOCKS TO WRITE THIS ITERATION\r
+ JRST DFDO3B\r
+\r
+;DUMP MODE INPUT.\r
+\r
+EXTERNAL COMCHK,ADRERR\r
+\r
+DFDMPI: TLNN DEVDAT,LOOKB ;LOOKUP YET?\r
+ JRST DFERR2 ;NO, UNDEFINED FILE\r
+ TLNE IOS,IOEND ;END-FILE?\r
+ JRST DFDI1C ;YES\r
+ TLZ IOS,IO ;INPUT STATUS\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ PUSHJ PDP,COMCHK ;CHECK IOWDS\r
+ JRST ADRERR ;ERROR\r
+DFDI0: SKIPN TAC,@UUO ;PICK UP NEXT IOWD\r
+ POPJ PDP, ;NO MORE, LEAVE.\r
+ TLNE TAC,-1 ;LH ZERO?\r
+ JRST DFDI0A ;NO\r
+ HRR UUO,TAC ;YES, ANOTHER LIST.\r
+ JRST DFDI0\r
+\r
+DFDI0A: ADDI TAC,1 ;FROM XWD -L,FIRST-ADDRESS\r
+ PUSH PDP,TAC\r
+\r
+ HLRZ TAC1,TAC ;GET LENGTH FROM IOWD\r
+ CAIGE TAC1,NBLKSZ ;LESS THAN 1 BLOCK?\r
+ HRLI TAC,NBLKSZ ;YES, MUST WRITE AT LEAST 1 FULL BLOCK\r
+ PUSH PDP,TAC ;IOWD FOR FIRST BLOCK\r
+\r
+ HRRZ AC2,DEVACC(DEVDAT) ;PICK UP FIRST POINTER\r
+ CAILE AC2,PTRN(DEVDAT) ;ANY LEFT IN CORE?\r
+ PUSHJ PDP,DFDI9 ;NO, GET SOME MORE\r
+ SKIPN @AC2 ;IS A POINTER THERE?\r
+ JRST DFDI1B ;NO. EXIT\r
+ PUSH PDP,@AC2 ;SAVE THE POINTER\r
+\r
+ MOVE TAC,[XWD BLKSIZ,BLKSIZ] ;INCREMENT IOWD\r
+ ADDM TAC,-2(PDP)\r
+ AOS DEVACC(DEVDAT) ;NEXT POINTER\r
+ AOS SETCNT(DEVDAT) ;NEXT RELATIVE BLOCK\r
+\r
+\r
+DFDI1: SKIPGE -2(PDP) ;MORE TO GO?\r
+ JRST DFDI2 ;YES\r
+\r
+DFDI1A: MOVE TAC1,-1(PDP) ;NO, PROCESS THE FIRST BLOCK\r
+ MOVEM TAC1,DSKBUF(DEVDAT) ;SAY WHERE TO READ DATA\r
+ MOVE TAC,(PDP) ;GET FIRST LOGICAL BLOCK#\r
+ PUSHJ PDP,MQIN\r
+ JFCL ;ERRORS IGNORED.\r
+\r
+REPEAT 0, < ;TEMPORARILY DELETE THIS CODE DUE TO SAVE-GET PROBLEM.\r
+ IFG CHKCNT,< ;COMPARE CHECKSUM\r
+ MOVE TAC,-1(PDP)\r
+ PUSHJ PDP,CHKSUM\r
+ HLRZ TAC,(PDP)\r
+ MOVEI AC1,IODTER\r
+ CAME TAC,TAC1\r
+ ORM AC1,DEVIOS(DEVDAT)\r
+ MOVE IOS,DEVIOS(DEVDAT)\r
+ >\r
+>\r
+\r
+ SUB PDP,[XWD 3,3] ;REMOVE INTERMEDIATE STORAGE FROM PDL\r
+ AOJA UUO,DFDI0 ;GO BACK FOR MORE.\r
+\r
+DFDI1B: SUB PDP,[XWD 2,2] ;BACK UP PDP, REMOVE XWD AND IOWD\r
+DFDI1C: MOVE IOS,[XWD IOEND,IODEND] ;NO MORE INPUT\r
+ ORB IOS,DEVIOS(DEVDAT)\r
+ POPJ PDP,\r
+\r
+;DUMP INPUT CONTINUED,\r
+;FIND A SERIES OF CONSECUTIVE BLOCKS TO READ AT ONCE\r
+\r
+DFDI2: HRRZ AC2,DEVACC(DEVDAT) ;GET NEXT POINTER\r
+ CAILE AC2,PTRN(DEVDAT) ;ANY MORE POINTERS IN CORE?\r
+ PUSHJ PDP,DFDI9 ;NO GET SOME MORE\r
+ SKIPN @AC2 ;YES\r
+ JRST DFDI8 ;END-FILE\r
+ PUSH PDP,AC2 ;SAVE POINTER TO POINTER\r
+ HLRZ TAC,-3(PDP) ;GET LENGTH OF REMAINING INPUT\r
+ HRRZ TAC1,(AC2) ;GET BLOCK# FROM DDB\r
+\r
+DFDI3: ADDI TAC,BLKSIZ ;ANY MORE TO READ?\r
+ TLNE TAC,1\r
+ JRST DFDI5 ;NO\r
+ ADDI AC2,1 \r
+ CAIG AC2,PTRN(DEVDAT)\r
+ SKIPN AC3,@AC2 ;END-FILE\r
+ JRST DFDI4 ;YES\r
+\r
+ CAIN TAC1,-1(AC3) ;STILL CONSECUTIVE?\r
+ AOJA TAC1,DFDI3 ;YES, LOOP\r
+\r
+DFDI4: MOVE TAC,(PDP) ;COMPUTE COUNT\r
+ SUB TAC,AC2 ;DIFFERENCE BETWEEN POINTERS IS # OF BLOCKS\r
+ LSH TAC,BLKP2 ;COMPUTE WORDS\r
+ JRST DFDI6\r
+DFDI5: HLRE TAC,-3(PDP) ;GET LENGTH OF INPUT\r
+ ADDI AC2,1\r
+DFDI6: HRRZ TAC1,DEVACC(DEVDAT)\r
+ SUBI TAC1,(AC2)\r
+ MOVMS TAC1\r
+ ADDM TAC1,SETCNT(DEVDAT)\r
+ HRRM AC2,DEVACC(DEVDAT) ;STORE NEW POINTER POINTER\r
+ MOVS TAC1,@TAC\r
+ HRLM TAC,(PDP)\r
+ HRR TAC1,-3(PDP)\r
+ MOVE TAC,(PDP) ;GET POINTER TO FIRST RETRIEVAL POINTER FOR THIS INPUT\r
+ MOVE TAC,(TAC) ;GET FIRST LOGICAL BLOCK#\r
+ MOVEM TAC1,DSKBUF(DEVDAT) ;STORE CONTROLLING IOWD\r
+ PUSHJ PDP,MQIN ;REQUEST THE INPUT\r
+ JFCL ;ERRORS IGNORED\r
+\r
+;DUMP INPUT CONTINUED.\r
+;IF THERE IS CHECKSUMMING. CHECK IT, ELSE INCREMENT IOWD\r
+;AND LOOP.\r
+\r
+ POP PDP,AC2\r
+ IFLE CHKCNT,< ;NO CHECKSUMMING\r
+ HLRS AC2\r
+ SETCA AC2,\r
+ AOBJN AC2,.+1\r
+ ADDM AC2,-2(PDP)\r
+ >\r
+\r
+ IFG CHKCNT,< ;CHECK CHECKSUMS\r
+ HLRE TAC1,AC2 ;CHANGE WORD COUNT TO BLOCKS\r
+ MOVMS TAC1\r
+ ADDI TAC1,BLKSIZ-1\r
+ LSH TAC1,-BLKP2\r
+ MOVNS TAC1\r
+ HRL AC2,TAC1\r
+DFDI7: MOVE TAC,-2(PDP)\r
+ PUSHJ PDP,CHKSUM\r
+ HLRZ TAC,(AC2)\r
+ MOVEI AC3,IODTER\r
+ CAME TAC,TAC1\r
+ PUSHJ PDP,CKREC2\r
+ MOVE AC3,[XWD BLKSIZ,BLKSIZ]\r
+ ADDM AC3,-(PDP)\r
+ AOBJN AC2,DFDI7\r
+ >\r
+\r
+ JRST DFDI1 ;SEE IF MORE INPUT REQUIRED\r
+\r
+DFDI8: MOVE IOS,[XWD IOEND,IODEND] ;NO MORE INPUT\r
+ ORB IOS,DEVIOS(DEVDAT)\r
+ JRST DFDI1A\r
+\r
+DFDI9: TLNE IOS,NMP\r
+ JRST DFDI10 ;NO\r
+ PUSHJ PDP,SETBUF ;GET BUFFER\r
+ PUSHJ PDP,GETPTR ;READ AND COPY POINTERS INTO DDB\r
+ PUSHJ PDP,CLRBUF ;CLEAR BUFFER\r
+ HRRZ AC2,DEVACC(DEVDAT)\r
+ POPJ PDP,\r
+\r
+DFDI10: MOVEI AC2,PTR1(DEVDAT) ;NO MORE POINTERS ON DISK\r
+ HRRM AC2,DEVACC(DEVDAT)\r
+ SETZM @AC2\r
+ POPJ PDP,\r
+\r
+SUBTTL USETO/USETI\r
+;SETD AND SETI UUOS\r
+\r
+EXTERNAL WAIT1\r
+\r
+DFSET: PUSHJ PDP,.+2\r
+ POPJ PDP,\r
+ TLNE DEVDAT,ENTRB+LOOKB ;FILE OPEN?\r
+ TRNN UUO,-1 ;NON-ZERO BLOCK NUMBER ARGUMENT?\r
+ JRST DFERR2 ;NO, ERROR IN EITHER CASE\r
+ PUSHJ PDP,WAIT1 ;WAIT FOR I/O TO COMPLETE\r
+ PUSHJ PDP,SETBF6 ;SET UP A BUFFER\r
+ MOVE IOS,[XWD IOEND,IODEND] ;CLEAR EOF\r
+ ANDCAB IOS,DEVIOS(DEVDAT)\r
+\r
+ HRRZ TAC1,DEVACC(DEVDAT)\r
+ HRRZ TAC,SETCNT(DEVDAT) ;C(UUO) RH > C(SETCNT) RH?\r
+ CAIL TAC,(UUO) ;(I.E. SHOULD WE GO FORWARD?)\r
+ JRST DFSET6 ;NO, GO BACKWARD\r
+\r
+ SUBI TAC1,PTRN(DEVDAT) ;YES, DESIRED POINTER IN CORE?\r
+ SUB TAC,TAC1\r
+ CAIL TAC,(UUO)\r
+ JRST DFSET3 ;YES\r
+\r
+ HRRZ TAC1,DEVCNT(DEVDAT)\r
+ ADDI TAC1,BLKSIZ-1\r
+ LSH TAC1,-BLKP2\r
+ CAMGE TAC1,TAC ;ANY MORE POINTERS ON DISK?\r
+ JRST DFSETX ;NO\r
+ HRRM TAC,SETCNT(DEVDAT)\r
+ MOVE TAC,DEVOAD(DEVDAT) ;YES, ARE POINTERS IN CORE THE SAME\r
+ TLNN TAC,PNTDIF ;AS ON DISC?\r
+ JRST DFSET1 ;YES\r
+ TLO IOS,NMP ;SET "DO NOT READ NEXT POINTERS"\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ PUSHJ PDP,DFO4A ;NO, WRITE THEM OUT\r
+ TLZA IOS,NMP ;NO NEED TO READ\r
+\r
+DFSET1: PUSHJ PDP,RRI ;READ THEM IN\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ PUSHJ PDP,SET176 ;IS THIS THE FIRST POINTER BLOCK?\r
+ MOVE TAC,@TAC1\r
+ TRNN TAC,-1\r
+ JRST DFSETB ;YES\r
+ HRRZ TAC,DEVBLK(DEVDAT) ;IN BLOCK WERE CURRENT ONE.\r
+ SUBI TAC,1\r
+ MOVNS TAC\r
+ ADDM TAC,SETCNT(DEVDAT)\r
+ JRST DFSETC\r
+\r
+;THE DESIRED POINTER MAY BE IN CORE. IF THERE ARE MORE POINTERS ON\r
+;DISC, THEN CORE IS FULL, AND THE POINTER IS IN CORE, OTHERWISE\r
+;A CHECK IS MADE TO INSURE THAT THE END FILE IS AFTER THE DESIRED\r
+;POINTER.\r
+\r
+DFSET3:\r
+\r
+DFSETX: HRRZ TAC,DEVCNT(DEVDAT) ;C(UUO)RW > C(DEVCNT) RH?\r
+ ADDI TAC,BLKSIZ-1 ;CONVERT TO BLOCKS\r
+ LSH TAC,-BLKP2\r
+ CAIL TAC,(UUO)\r
+ JRST DFSET5 ;NO, ALL OK.\r
+ MOVSI IOS,IOEND ;YES, END-FILE.\r
+ IORB IOS,DEVIOS(DEVDAT)\r
+ AOSA TAC\r
+DFSET5: HRRZ TAC,UUO ;SET NEXT BLOCK AS ONE BEYOND LAST EXISTING ONE\r
+ HRRZ TAC1,SETCNT(DEVDAT) ;PREPARE TO RESET DEVACC\r
+ SUBM TAC,TAC1\r
+ ADDM TAC1,DEVACC(DEVDAT)\r
+ HRRM TAC,SETCNT(DEVDAT) ;RESET SETCNT\r
+ JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE\r
+\r
+;THE DESIRED POINTER IS BEFORE THE CURRENT ONE. SEE IF IT IS IN CORE.\r
+\r
+DFSET6: SUBI TAC1,PTR1(DEVDAT)\r
+ SUB TAC,TAC1\r
+ CAIG TAC,(UUO)\r
+ JRST DFSET5 ;POINTER IS IN CORE\r
+\r
+;THE DESIRED BLOCK IS BEFORE THE CURRENT ONE. SEARCH FROM THE BEGINNING.\r
+\r
+ MOVE TAC,DEVOAD(DEVDAT) ;ARE POINTERS IN CORE SAME AS ON DISC?\r
+ TLNE TAC,PNTDIF\r
+ PUSHJ PDP,DFO4A ;NO, WRITE THEM OUT\r
+ HRRZ TAC,DEVEXT(DEVDAT) ;GET BLOCK# OF FIRST RIB\r
+ PUSHJ PDP,SETPTR ;READ FIRST RIB\r
+DFSETB: MOVEI TAC,1 ;RESET SETCNT\r
+ HRRM TAC,SETCNT(DEVDAT) ;"POSITIONED" AT RELATIVE BLOCK 1\r
+\r
+DFSETC: HRRZ TAC,DSKBUF(DEVDAT) ;LSET TAC TO FIRST POINTER\r
+ PUSHJ PDP,SET176 ;IS THIS THE FIRST POINTER BLOCK?\r
+ MOVE DAT,@TAC1\r
+ TRNN DAT,-1\r
+ ADDI TAC,DIRSIZ ;YES, SKIP OVER 4 WORDS\r
+ HLRZ DAT,@TAC1 ;BLOCK FULL?\r
+ SUBI TAC1,1\r
+ JUMPN DAT,DFSETD ;YES\r
+ SKIPN @TAC1 ;NO. MOVE TAC1 TO LAST POINTER\r
+ SOJA TAC1,.-1\r
+\r
+DFSETD: HRRZ AC1,SETCNT(DEVDAT)\r
+ SUBI AC1,(TAC) ;IS DESIRED POINTER HERE?\r
+ HRRZ AC2,TAC1\r
+ ADD AC2,AC1\r
+ CAIL AC2,(UUO)\r
+\r
+ JRST DFSET7 ;YES\r
+ ADDI AC2,1 ;NO. GET NEXT BLOCK\r
+ HRRM AC2,SETCNT(DEVDAT)\r
+ JUMPE DAT,DFSET8 ;ANY MORE POINTER BLOCKS?\r
+ MOVSM DAT,DEVBLK(DEVDAT) ;YES, SET UP TO READ NEXT BLOCK.\r
+ PUSHJ PDP,RRI\r
+ JRST DFSETC\r
+\r
+;THE BLOCK CONTAINING THE POINTER IS FOUND.\r
+DFSET7: HRRZ TAC,UUO ;RESET RIGHT HALF OF DEVBLK\r
+ SUB TAC,AC1\r
+ HRRZ TAC1,DSKBUF(DEVDAT)\r
+ SUB TAC,TAC1\r
+ HRRM TAC,DEVBLK(DEVDAT)\r
+\r
+ HRRM UUO,SETCNT(DEVDAT) ;RESET SETCNT\r
+ PUSHJ PDP,DFIN4 ;GET POINTERS\r
+ JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE\r
+\r
+;RAN OUT OF POINTERS\r
+\r
+DFSET8: ADDI TAC1,1\r
+ HRRZ TAC,DSKBUF(DEVDAT)\r
+ SUB TAC1,TAC\r
+ HRRM TAC1,DEVBLK(DEVDAT)\r
+ TLO IOS,NMP!IOEND ;SET END\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ PUSHJ PDP,DFO6A ;CLEAR POINTERS\r
+ JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE\r
+\r
+SUBTTL INPUT/OUPUT UUO'S. RETRIEVAL POINTER PROCESSING\r
+;INPUT UUO\r
+;* INDICATES INTERRUPT LEVEL\r
+\r
+EXTERNAL ADVBFF\r
+\r
+DFIN: TLNN DEVDAT,LOOKB ;FILE OPEN?\r
+ JRST DFERR2 ;NO, UNDEFINED FILE\r
+ TLZ IOS,IO ;SET INPUT INDICATOR\r
+\r
+DFIN1: TLNE IOS,LIR ;*ANY MORE INPUT?\r
+ POPJ PDP, ;*NO, LEAVE\r
+\r
+ HRRZ TAC1,DEVACC(DEVDAT) ;*\r
+ CAILE TAC1,PTRN(DEVDAT) ;*POINTER LIST EMPTY?\r
+ JRST DFIN2 ;*YES\r
+ SKIPN @TAC1 ;*NO--END OF FILE?\r
+ JRST DFIN1E ;*YES\r
+\r
+ CAIN TAC1,PTRN(DEVDAT) ;*NO--IS THIS THE LAST POINTER ?\r
+ JRST DFIN1B ;*YES\r
+\r
+DFIN1D: SKIPN 1(TAC1) ;*NO\r
+ TLO IOS,LIR ;*SET LAST INPUT FLAG\r
+DFIN1A: MOVEM IOS,DEVIOS(DEVDAT) ;*\r
+ JRST QIN ;*\r
+\r
+DFIN1E: TLO IOS,LIR ;*EMPTY FILE\r
+ MOVEM IOS,DEVIOS(DEVDAT) ;*\r
+ POPJ PDP, ;*\r
+\r
+DFIN1B: TLNE IOS,NMP ;*ANY MORE POINTERS ON DISK?\r
+ TLO IOS,LIR ;*NO, THIS IS THE LAST READ\r
+ JRST DFIN1A ;*\r
+\r
+DFIN2: MOVEM IOS,DEVIOS(DEVDAT)\r
+ PUSHJ PDP,SETBFI ;CHOOSE NEXT INPUT BUFFER TO HOLD RETRIEVAL POINTERS\r
+ PUSHJ PDP,GETPTR ;READ RIB COPY POINTERS INTO DDB\r
+ HRRZ TAC1,DEVACC(DEVDAT)\r
+ JRST DFIN1D\r
+\r
+;NEED NEW POINTER FROM DISK\r
+\r
+GETPTR: MOVE AC2,DEVOAD(DEVDAT) ;POINTERS DIFFER?\r
+ TLNE AC2,PNTDIF\r
+ JRST DFO4A ;YES, WRITE THEN READ AND RETURN\r
+ PUSHJ PDP,RRI ;NO, READ BLOCK\r
+\r
+DFIN4: MOVEI AC2,PTR1(DEVDAT) ;RESET DEVACC\r
+ HRRM AC2,DEVACC(DEVDAT)\r
+ MOVE TAC,DEVBLK(DEVDAT) ;RESET DEVBKO\r
+ MOVEM TAC,DEVBKO(DEVDAT) ;BLOCK # WORD INDEX OF A CURRENT RETRIEVAL PACKET\r
+GTPTR1: PUSHJ PDP,SET000 ;SET TAC1 TO FIRST WORD OF RIB\r
+ MOVE IOS,DEVIOS(DEVDAT) \r
+ HRRZ AC3,DEVBLK(DEVDAT) ;WORD INDEX OF RETRIEVAL POINTER PACKET\r
+ ADD AC3,TAC1 ;AC3 POINTS TO NEXT POINTER WITHIN RIB\r
+ ADDI TAC1,BLKSIZ-2 ;TAC1 POINTS TO WORD 127\r
+\r
+ MOVEI AC1,PTRN(DEVDAT) ;DDB END CHECK\r
+DFIN5: CAML AC3,TAC1 ;POINTER BLOCK EMPTY?\r
+\r
+ JRST DFIN7 ;YES, GET SOME MORE\r
+\r
+ MOVE TAC,@AC3 ;GET RETRIEVAL POINTER\r
+ MOVEM TAC,@AC2 ;STASH IN DDB\r
+ ADDI AC3,1\r
+ JUMPE TAC,DFIN8A ;0 MEANS NO MORE RETRIEVAL POINTERS\r
+ CAIE AC1,(AC2) ;DDB FULL?\r
+ AOJA AC2,DFIN5 ;NO, GET ANOTHER\r
+\r
+ CAML AC3,TAC1 ;YES, ANY MORE FOR NEXT TIME?\r
+ HLLZS @AC3 ;END OF RIB REACHED. ACE(LH) IS LINK NEXT RIB\r
+ SKIPN @AC3 ;NEXT POINTER=0 OR LINK=0.\r
+ TLO IOS,NMP ;SET "NO MORE POINTER"\r
+\r
+DFIN6A: MOVEM IOS,DEVIOS(DEVDAT)\r
+ MOVE TAC1,DSKBUF(DEVDAT);POINT TO FIRST WORD OF RIB\r
+ SUBI AC3,(TAC1) ;COMPUTE NEW INDEX\r
+ HRRM AC3,DEVBLK(DEVDAT) ;STORE INDEX TO NEXT RETRIEVAL POINTER PACKET\r
+ MOVSI AC1,PNTDIF ;CLEAR "POINTER DIFFER"\r
+ ANDCAM AC1,DEVOAD(DEVDAT) ;SINCE DDB IS COPY OF RETRIEVAL DATA.\r
+ POPJ PDP,\r
+\r
+DFIN7: HLRZ TAC,@TAC1 ;RIB LINK TO TAC RH\r
+ JUMPE TAC,DFIN8 ;DONE IF LINK=0\r
+ MOVSM TAC,DEVBLK(DEVDAT) ;SET BLOCK#, WORD INDE FOR NEXT PACKET\r
+ PUSH PDP,AC2\r
+ PUSHJ PDP,RRI ;READ THE RIB\r
+ POP PDP,AC2\r
+ JRST GTPTR1\r
+DFIN8: MOVEM TAC,@AC2 ;0 WOTRD IS DOB MARKS END\r
+DFIN8A: TLO IOS,NMP ;NO MORE POINTERS ON DISK\r
+ JRST DFIN6A\r
+\r
+;ENTER HERE AT INTERRUPT LEVEL TO READ ANOTHER BLOCK\r
+\r
+DFINX: PUSHJ PDP,ADVBFF ;*ANY MORE EMPTY BUFFERS?\r
+ POPJ PDP, ;*\r
+\r
+ HRRZ TAC1,DEVACC(DEVDAT) ;*POINTER LIST EMPTY?\r
+ CAILE TAC1,PTRN(DEVDAT) ;*\r
+ POPJ PDP, ;*\r
+\r
+ JRST DFIN1 ;*NO,FILL NEXT ONE\r
+\r
+;OUTPUT UUO\r
+\r
+EXTERNAL WSYNC,ADVBFE\r
+\r
+DFOUT: TLNN DEVDAT,ENTRB ;FILE OPEN?\r
+ JRST DFERR2 ;NO, UNDEFINED FILE\r
+ TLO IOS,IO ;SET OUTPUT INDICATION\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+\r
+DFOUT1: HRRZ DAT,DEVACC(DEVDAT) ;*GET POINTER LOC\r
+\r
+ IFG CHKCNT,<\r
+ HRRZ TAC,DEVOAD(DEVDAT) ;*\r
+ ADD TAC,[XWD NBLKSZ,2] ;*\r
+ PUSHJ PDP,CHKSUM ;*\r
+ HRLM TAC1,@DAT ;*\r
+ MOVSI TAC1,PNTDIF ;*\r
+ ORM TAC1,DEVOAD(DEVDAT) ;*\r
+ >\r
+\r
+ HRRZ TAC,@DAT ;*ALREADY HAVE A POINTER?\r
+ JUMPN TAC,DFOT3A ;*YES IF JUMP\r
+ CAIE DAT,PTRN(DEVDAT) ;*NO, CLEAR NEXT ONE?\r
+ SETZM 1(DAT) ;*YES\r
+ TLO IOS,NMP ;*SET "NO MORE POINTERS"\r
+ MOVEM IOS,DEVIOS(DEVDAT) ;*\r
+ MOVE TAC1,DEVOAD(DEVDAT) ;*POINT TO OUTPUT BUFFER\r
+ ADDI TAC1,1 ;*NOW TO WORD COUNT\r
+ HRRZ TAC1,@TAC1 ;*RETRIEVE WORD COUNT\r
+ PUSHJ PDP,UPDEVC ;*UPDATE DEVCNT\r
+ PUSH PDP,DAT ;*\r
+ PUSHJ PDP,DFGETF ;*GET A FREE BLOCK\r
+ POP PDP,DAT ;*\r
+\r
+ IFG CHKCNT,<\r
+ HRRM TAC,@DAT>\r
+ IFLE CHKCNT,<\r
+ MOVSI TAC1,PNTDIF\r
+ ORM TAC1,DEVOAD(DEVDAT)\r
+ MOVEM TAC,@DAT>\r
+\r
+DFOT3A: CAIE DAT,PRTN(DEVDAT) ;*LIST FULL?\r
+ JRST QOUT ;*NO, WRITE AND LEAVE\r
+\r
+;OUTPUT UUO CONTINUED.\r
+;WRITE OUT POINTER LIST.\r
+\r
+ PUSHJ PDP,SETBFO ;CHOOSE AN OUTPUT BUFFER TO READ RIB INTO\r
+ PUSHJ PDP,QOUT ;PUT REQUEST IN QUEUE\r
+ PUSHJ PDP,WSYNC ;WAIT TIL DATA WRITTEN\r
+\r
+DFO4A: MOVE TAC,DEVBKO(DEVDAT) ;RESET DEVBLK TO REFER TO RETRIEVAL POINTERS\r
+ MOVEM TAC,DEVBLK(DEVDAT) ;NOW IN DDB\r
+\r
+ MOVE TAC,DEVOAD(DEVDAT) ;ANY POINTERS BEEN WRITTEN?\r
+ TLZE TAC,VRGPTR\r
+ PUSHJ PDP,DFO7A ;NO, CREATE NEW BLOCK, SKIP NEXT INSTRUCTION.\r
+ PUSHJ PDP,RRI ;RED RETRIEVAL BLOCK\r
+ MOVEI AC3,PTR1(DEVDAT)\r
+\r
+DFO4B: PUSHJ PDP,SET000 ;TAC1 POINTS TO RIB\r
+ HRRZ AC2,DEVBLK(DEVDAT) ;INDEX INTO RIB\r
+ ADD AC2,TAC1 ;ABSOLUTE POINTER INTO RIB\r
+ ADDI TAC1,BLKSIZ-2 ;END OF RIB DATA\r
+DFOUT5: MOVE AC1,@AC3 ;GET RETRIEVAL POINTER FROM DDB\r
+ JUMPE AC1,DFOUT6 ;0 SIGNALS END\r
+ CAML AC2,TAC1 ;BLOCK FULL?\r
+ JRST DFOUT7 ;YES, WRITE IT OUT\r
+ MOVEM AC1,@AC2 ;STASH POINTER IN RIB\r
+ ADDI AC2,1\r
+ CAIE AC3,PTRN(DEVDAT) ;DONE?\r
+ AOJA AC3,DFOUT5\r
+\r
+DFOUT6: MOVE TAC1,DSKBUF(DEVDAT) ;POINT TO RIB\r
+ SUBI AC2,(TAC1) ;FROM INDEX\r
+ HRRM AC2,DEVBLK(DEVDAT) ;STORE INDEX TO RETRIEVAL POINTERS\r
+ MOVSI AC2,PNTDIF ;CLEAR "POINTERS DIFFER"\r
+ ANDCAM AC2,DEVOAD(DEVDAT)\r
+ PUSHJ PDP,WRI ;WRITE THE BLOCK\r
+DFO6A: MOVEI TAC,PTR1(DEVDAT)\r
+ HRRM TAC,DEVACC(DEVDAT) ;DEVACC NOW POINTS TO FIRST POINTER IN DDB\r
+ SETZM @TAC ;CLEAR FIRST POINTER\r
+ TLNN IOS,NMP ;MORE POINTERS?\r
+ JRST DFIN4 ;YES, BRING THEM IN AND LEAVE\r
+ MOVE TAC,DEVBLK(DEVDAT)\r
+ MOVEM TAC,DEVBKO(DEVDAT) ;SAE BLOCK#,WORD INDEX OF CURRENT POINTER PACKET\r
+ POPJ PDP,\r
+\r
+DFO7A: MOVEM TAC,DEVOAD(DEVDAT) ;SAVE VRGPTR BIT\r
+ PUSHJ PDP,SET177 ;SET TAC1 TO WORD 128\r
+ SETZM @TAC1 ;CLEAR BLOCK# WORD\r
+ AOS (PDP) ;ALWAYS SKIP RETURN\r
+ PUSH PDP,AC3 ;BECAUSE ENTRY FROM NEWRIB PUSHES AC3\r
+ JRST DFOUT8\r
+\r
+DFOUT7: PUSHJ PDP,NEWRIB\r
+ JRST DFO4B\r
+\r
+NEWRIB: PUSH PDP,AC3 ;CREATE A NEW RETRIEVAL BLOCK\r
+ PUSHJ PDP,SET176 ;SET TAC1 TO LINK WORD\r
+ HLLZ TAC,@TAC1 ;LINK TO NEXT POINTER BLOCK ALREADY PRESENT?\r
+ JUMPN TAC,DFOUT9 ;YES, WRITE CURRENT ONE AND READ NEXT ONE\r
+ PUSHJ PDP,DFGETF ;NO, GET A BLOCK FOR POINTER IN TAC\r
+ HLRZ AC3,DEVBLK(DEVDAT) ;BLOCK# OF CURRENT RIB\r
+ MOVSM TAC,DEVBLK(DEVDAT) ;STORE BLOCK#, INDEX FOR NEW BLOCK\r
+ PUSHJ PDP,SET176 ;SET TAC1 TO WORD 127 AGAIN\r
+ HRLM TAC,@TAC1 ;LH LINKS TO NEW BLOCK\r
+ \r
+ MOVE TAC,AC3 ;BLOCK# OF CURRENT BLOCK\r
+ PUSHJ PDP,WRIA ;WRITE THE BLOCK OUT\r
+\r
+DFOUT8: MOVE TAC1,DSKBUF(DEVDAT) ;POINT TO BUFFER CONTAINING RIB\r
+ NOSCHEDULE\r
+ TLNN IOS,UBFS ;DUMP MODE?\r
+ ADD TAC1,PROG ;NO, RELOCATE\r
+ MOVEI TAC,1(TAC1) ;DESTINATION\r
+ HRL TAC,TAC1 ;SOURCE\r
+ SETZM (TAC1)\r
+ BLT TAC,BLKSIZ-3(TAC1) ;ZERO OUT FIRST 126 WORDS\r
+ MOVE TAC,BLKSIZ-1(TAC1) ;BLOCK# OF CURRENT RIB\r
+ HRRZM TAC,BLKSIZ-2(TAC1) ;SET "PREVIOUS" POINTER..CLEAR LINK TO NEXT\r
+ SETZM BLKSIZ-1(TAC1) ;CLEAR WORD 128.\r
+ SCHEDULE\r
+DFO8A: POP PDP,AC3\r
+ POPJ PDP,\r
+\r
+DFOUT9: EXCH TAC,DEVBLK(DEVDAT) ;SAVE NEW BLOCK# INDEX. GET OLD BLOCK# INDEC\r
+ HLRZS TAC ;BLOCK# IN RH\r
+ PUSHJ PDP,WRIA ;WRITE THIS BLOCK OF POINTERS OUT\r
+ PUSHJ PDP,RRI ;READ NEXT BLOCK OF POINTERS IN\r
+ JRST DFO8A\r
+\r
+;ENTER HERE AT INTERRUPT LEVEL TO WRITE ANOTHER\r
+\r
+ EXTERN MJOBN\r
+\r
+DFOUTX: PUSHJ PDP,ADVBFE ;*ANY MORE TO DO?\r
+ POPJ PDP, ;*\r
+ SKIPL DAREQ ;*DO NOT CONTINUE THIS OUTPUT AT INTERRUPT\r
+ POPJ PDP, ;* LEVEL IF THE DAWAIT RTN WOULD BE CALLED.\r
+ HRRZ TAC1,DEVACC(DEVDAT) ;*NEED TO WRITE POINTERS?\r
+ CAIL TAC1,PTRN(DEVDAT) ;*\r
+ POPJ PDP, ;*\r
+ HRRZ TAC,@SATPTR ;*CURRENT SAT BLOCK FULL?\r
+ TRNN TAC,WLBIT ;*OR WRITE-LOCKED?\r
+ CAIL TAC,NUMBIT+MJOBN ;*BE SURE TO LEAVE ATLEAST JOBN FREE BLOCKS\r
+ ; SO THAT EACH JOB CAN HAVE ONE MORE\r
+ POPJ PDP, ;*\r
+ PUSH PDP,AC1 ;*\r
+ PUSH PDP,AC2 ;*\r
+ PUSHJ PDP,DFOUT1 ;*\r
+ POP PDP,AC2 ;*\r
+ POP PDP,AC1 ;*\r
+ POPJ PDP, ;*\r
+\r
+SUBTTL READ/WRITE RETRIEVAL POINTERS\r
+;INPUT RETRIEVAL BLOCK.\r
+\r
+RRIB: SKIPA TAC,DEVEXT(DEVDAT) ;READ FIRST RETRIEVAL BLOCK\r
+RRI: HLRZ TAC,DEVBLK(DEVDAT) ;READ NEXT RETRIEVAL BLOCK\r
+RRIA: PUSHJ PDP,MQIN ;READ RETRIEVAL BLOCK SPECIFIED BY TAC ON ENTRY\r
+ JRST RERA ;ERRORS, YOU LOSE\r
+ PUSHJ PDP,SET177 ;CHECK RH OF WORD 128\r
+ HLRZ TAC,DSKCNT(DEVDAT) ;BLOCK# EXPECTED\r
+ MOVE AC1,@TAC1 ;GET BLOCK# STORED IN RIB\r
+ CAIE TAC,(AC1) ;SAME?\r
+ JRST RERA ;IT WAS WRONG, YOU LOSE.\r
+ POPJ PDP, ;EVERYTHING OK.\r
+\r
+;OUTPUT A RETRIEVAL BLOCK.\r
+\r
+WRIB: SKIPA TAC,DEVEXT(DEVDAT) ;WRITE FIRST RETRIEVAL BLOCK\r
+WRI: HLRZ TAC,DEVBLK(DEVDAT) ;WRITE NEXT RETRIEVAL BLOCK\r
+WRIA: PUSHJ PDP,SET177 ;WRITE RETRIEVAL BLOCK SPECIFIED BY TAC ON ENTRY\r
+ HRRM TAC,@TAC1 ;STORE THIS BLOCK# IN WORD 128\r
+ IFN FTRCHK,<\r
+ SKIPN TAC ;ATTEMPTING TO WRITE RETRIEVAL INFORMATION\r
+ ; IN BLOCK NR 0 IS AN ERROR\r
+ HALT WERA ;CONTINUE WILL POINT ERROR MESSAGE\r
+>\r
+ PUSHJ PDP,MQOUT ;WRITE IT,\r
+ JRST WERA ;ERRORS\r
+ POPJ PDP, ;NO, RETURN.\r
+\r
+SET177: HRRZ TAC,DSKBUF(DEVDAT)\r
+ ADDI TAC1,BLKSIZ-1\r
+S177A: TLNN IOS,UBFS\r
+ TLO TAC1,PROG\r
+ POPJ PDP,\r
+\r
+SET176: HRRZ TAC1,DSKBUF(DEVDAT)\r
+ ADDI TAC1,BLKSIZ-2\r
+ JRST S177A\r
+\r
+SET000: HRRZ TAC1,DSKBUF(DEVDAT)\r
+ JRST S177A\r
+\r
+\r
+;PUT POINTER INFO IN DDB\r
+;ENTER WITH TAC CONTAINING THE BLOCK NUMBER OF THE POINTERS.\r
+\r
+SETPTR: HRLZM TAC,DEVBLK(DEVDAT) ;XWD RIB#, 0...0 INDEX\r
+ ANDCM IOS,[XWD IOEND+NMP,IODEND]\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ PUSHJ PDP,SETBUF ;AQUIRE BUFFERE IN MONITOR STORAGE\r
+ PUSHJ PDP,RRI ;GET RETRIEVAL BLOCK\r
+\r
+ PUSHJ PDP,DFIN4 ;COPY POINTERS TO DDB\r
+ MOVEI AC3,FPNTR(DEVDAT) ;SET DEVACC TO SKIP FIRST 4 WORDS\r
+ HRRM AC3,DEVACC(DEVDAT)\r
+ POPJ PDP,\r
+\r
+;RECLAIM STORAGE ON DISK.\r
+;ENTER WITH TAC POINTING TO FIRST RETRIEVAL BLOCK OF THE FILE\r
+; TO BE DELETED.\r
+\r
+RECLAM: PUSHJ PDP,SETBUF ;FIND SPACE IN USER AREA\r
+ \r
+ PUSHJ PDP,RECLM5 ;GET FIRST POINTER BLOCK\r
+ ADDI DAT,DIRSIZ ;SKIP OVER FIRST WORDS.\r
+RECLM2: CAML DAT,TAC1 ;MORE POINTERS IN BLOCK?\r
+ PUSHJ PDP,RECLM4 ;NO. GET MORE\r
+ HRRZ TAC,@DAT ;FREE A DATA BLOCK\r
+ JUMPE TAC,CLRBUF ;EXIT WHEN A ZERO POINTER IS ENCOUNTERED\r
+ PUSH PDP,TAC1\r
+ PUSHJ PDP,SETFRE ;FREE UP SPECIFIED BLOCK\r
+ POP PDP,TAC1\r
+ AOJA DAT,RECLM2 ;GO BACK FOR MORE\r
+\r
+RECLM4: HLRZ TAC,@TAC1 ;PICK UP POINTER TO NEXT BLOCK\r
+ JUMPE TAC,RECLM6 ;NO MORE, GO HOME.\r
+RECLM5: PUSHJ PDP,RRIA ;READ IN A R.I. BLOCK.\r
+\r
+ HLRZ TAC,DSKCNT(DEVDAT) ;FREE THAT BLOCK\r
+ PUSHJ PDP,SETFRE\r
+\r
+ PUSHJ PDP,SET000 ;SET TAC1 TO FIRST WORD\r
+ MOVE DAT,TAC1\r
+ ADDI TAC,BLKSIZ-2 ;SET TAC1 TO WORD 127\r
+ POPJ PDP,\r
+\r
+RECLM6: POP PDP,TAC\r
+ JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE\r
+\r
+;RELEASE UUO.\r
+\r
+EXTERNAL DAREQ,DAAVAL\r
+\r
+DFREL: TLO DEVDAT,DSKRLB ;MARK RELEASE (VIA RESET UUO) IN PROGRESS.\r
+ PUSHJ PDP,DFCLSI ;CLOSE INPUT FIRST\r
+ PUSHJ PDP,DFCLSO ;THEN CLOSE OUPUT\r
+ ; SAME ORDER AS CLOSE AND RELEAS IN UUOCON\r
+ SKIPN SATCHG ;HAS SAT BLOCK BEEN MODIFIED?\r
+ JRST DFREL1 ;NO, SUPPRESS WRITING\r
+ PUSHJ PDP,UPDA ;SET DAREQ INTERLOCK WHILE WRITING SAT BLOCK\r
+ PUSH PDP,DSKBUF(DEVDAT)\r
+ PUSHJ PDP,SATWRT ;WRITE CURRENT SAT BLOCK\r
+ POP PDP,DSKBUF(DEVDAT)\r
+ PUSHJ PDP,DOWNDA ;RESET DAREQ INTERLOCK\r
+DFREL1: TLZ DEVDAT,DSKRLB ;CLEAR RELEASE MARKER.\r
+ JRST WAIT1\r
+\r
+SUBTTL DISK SPACE ALLOCATION\r
+;DFGETF: GET A FREE DISK BLOCK\r
+;CALL: PUSHJ PDP,DFGETF\r
+; ... RETURNS WITH TAC:=LOGICAL BLOCK#\r
+; MAY NOT RETURN IF DISK IS FULL OR NEARLY FULL\r
+\r
+ EXTERNAL DAWAIT,DAAVAL,DAREQ,JOBN\r
+ INTERNAL DFGETF\r
+\r
+DFGETF: PUSHJ PDP,UPDA ;SET DISK ALLOCATION INTERLOCK\r
+DFGTF1: PUSHJ PDP,SATGET ;FOCUS ON A NON-FULL SAT BLOCK\r
+ HRRZ AC1,SATPTR ;POINT TO 3 WORD SAT ENTRY\r
+ MOVE AC2,SATBK2 ;XWD -L, POINTER TO SAT ENTRY\r
+ MOVEI ITEM,1 ;REQUEST 1 BLOCK\r
+ PUSHJ PDP,GETBIT ;RETURNS BIT# IN TAC1 (IN RANGE 1 TO NUMBLK)\r
+ JRST DFGTF2 ;FULL AFTER ALL\r
+ SETOM SATCHG ;SHOW SAT BLOCK IN CORE NOT = DISK COPY\r
+ AOS TAC,@SATPTR ;COUNT ANOTHER BLOCK USED\r
+ HLRZS TAC ;FIRST LOGICAL BLCOK# REPRESENTED BY SAT BLOCK\r
+ ADDI TAC, -1(TAC1) ;FORM LOGICAL BLOCK#\r
+DOWNDA: SOSL DAREQ ;THIS EXITING ROUTINE TURNS OFF DAREQ INTERLOCK\r
+ ; THUS MAKING NON-SHARABLE SECTIONS OF CODE\r
+ ; AVAILABLE TOTHE NEXT USER IN THE QUEUE\r
+ SETOM DAAVAL\r
+ TLZ IOS,DAFLG\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ POPJ PDP,\r
+\r
+DFGTF2: MOVEI TAC,NUMBIT ;BITS/SAT BLOCK\r
+ HRRM TAC,@SATPTR ;MARK SAT ENTRY FULL\r
+ JRST DFGTF1\r
+\r
+;UPDA - TURN ON THE DISK ALLOCATION INTERLOCK (DAREQ)\r
+; - A CALL TO UPDA MUST PRECEDE SAT BLOCK MANIPULATIONS\r
+UPDA: AOSE DAREQ ;INCREMENT COUNT OF USERS REQUESTING DISK ALLOCATION\r
+ PUSHJ PDP,DAWAIT ;WAIT UNTIL JOB REACHES TOP OF QUEUE\r
+ TLO IOS,DAFLG\r
+ MOVEM IOS,DEVIOS(DEVDAT) ;MAKE THIS JOB AS USING SAT BLOCK\r
+ POPJ PDP,\r
+\r
+;SATGET - FIND A NON-FULL SAT BLOCK FOR DFGTF OR DUMP MODE OUTPUT.\r
+; CONSIDER DISK FULL WHEN FEW BLOCKS REMAIN FREE UNLESS THE USER\r
+; IS LOGGING IN OR USING A NON-SHARABLE RESOURCE.\r
+\r
+EXTERNAL JBTSTS,HNGSTP\r
+\r
+SATGET: SETZ AC1, ;CLEAR COUNT\r
+ HRRZ TAC,@SATPTR ;BLOCKS USED IN CURRENT SAT BLOCK\r
+ TRNN TAC,WLBIT ;WRITE LOCKED?\r
+ PUSHJ PDP,SATCNT ;NO. COUNT # FREE\r
+ CAIL AC1,JOBN ;IS THER ENOUGH SPACE?\r
+ POPJ PDP, ;YES - USE IT.\r
+ SETZ AC1, ;CLEAR COUNT\r
+ MOVEI TAC1,SATENT ;START WITH FIRST SAT ENTRY\r
+SATGT1: HRRZ TAC, 0(TAC1) ;GET WLBIT + BLOCKS USED\r
+ TRNN TAC,WLBIT ;WRITE LOCKED?\r
+ PUSHJ PDP,SATCNT ;NO. COUNT # FREE\r
+ ADDI TAC1,SENTSZ ;NEXT SAT ENTRY\r
+ CAIL AC1,JOBN ;ENOUGH SPACE ACCUMULATED?\r
+\r
+ JRST SATGT2 ;YES - READ A SAT BLOCK\r
+ CAIGE TAC1,SATTOP ;END OF ENTRIES?\r
+ JRST SATGT1 ;NO. CONTINUE\r
+ JUMPE AC1,DSKFUL ;IF NONE FOUND DISK IS REALLY FULL\r
+\r
+;THERE ARE JOBN OR FEWER DISK BLOCKS AVAILABLE.\r
+;GIVE THEM OUT ONLY IN HARDSHIP CASES\r
+ LDB TAC,PJOBN\r
+ MOVE TAC,JBTSTS(TAC)\r
+ TLNN TAC,JACCT ;IS THIS USER LOGGING IN?\r
+ TLNE IOS,UBFS+AUFLG ;DOES USER HAVE MONITOR BUFFER OR IS HE ALTERING UFD?\r
+ JRST SATGT2 ;YES TO EITHER. GIVE HIM A BLOCK ANYWAY.\r
+DSKFUL: TLNE IOS,UBFS+AUFLG\r
+ JRST DFERR1 ;NON-RECOVERABLE ERROR IF USING BUFFER OR ALTERING UFD\r
+\r
+ PUSHJ PDP,DOWNDA ;RESET ALLOCATION INTERLOCK\r
+ PUSHJ PDP,HNGSTP ;PRINT "DSK OK?"\r
+ PUSHJ PDP,UPDA ;IF USER TYPE "CONT" WE TRY AGAIN\r
+ JRST SATGET\r
+\r
+SATGT2: MOVE TAC1,SATPIK ;POINT TO ENTRY OF NON-FULL SAT BLOCK\r
+ JRST SATRD ;READ IN SAT BLOCK\r
+\r
+SATCNT: CAIE TAC,NUMBIT ;IS ENTRY FULL?\r
+ MOVEM TAC1,SATPIK ;NO. SAVE POINTER TO A NON-FULL ENTRY\r
+ ADDI AC1,NUMBIT ;MAXIMUM NUMBER\r
+ SUB AC1,TAC ;LESS NUMBER USED\r
+ POPJ PDP,\r
+\r
+;SETFRE - RETURN A DISK BLOCK TO AVAILABLE STORAGE\r
+;CALL TAC:=LOGICAL BLOCK L\r
+; PUSHJ PDP,SETFRE\r
+; ... RETURN\r
+\r
+ INTERNAL SETFRE,FTRCHK\r
+\r
+SETFRE: PUSHJ PDP,UPDA ;SET DISK ALLOCATION INTERLOCK\r
+IFN FTRCHK,<\r
+ EXTERNAL LBHIGH\r
+\r
+ SKIPE TAC ;BLOCK 0 SHOULD NEVER BE CLEARED\r
+ CAMLE TAC,LBHIGH ;BLOCK # TOO LARGE\r
+ HALT DOWNDA ;YES, HALT. CONTINUE WILL COUNT DOWN DAREQ.\r
+>\r
+ HLRZ AC1,@SATPTR ;GET LOGICAL BLOCK# FOR B0 OF CURRENT SAT BLOCK\r
+ CAML TAC,AC1 ;IS L LESS THAN FIRST BLOCK REPRESENTED?\r
+ CAIL TAC,NUMBLK(AC1) ;IS L LESS THAN LAST BLOCK REPRESENTED\r
+ SKIPA ;OUTSIDE RANGE\r
+ JRST SETFR2 ;IN RANGE\r
+ MOVEI TAC1,SATENT ;INITIALIZE POINTER\r
+ SKIPA\r
+SETFR1: ADDI TAC1,SENTSZ ;INCREMENT POINTER\r
+ HLRZ AC1,@TAC1 ;GET LOGICAL BLOCK FOR B0 OF SAT BLOCK\r
+ CAML TAC,AC1 ;IS L LESS THEN FIRST BLOCK?\r
+ CAIL TAC,NUMBLK(AC1) ;IS L LESS THEN LAST BLOCK?\r
+ JRST SETFR1 ;OUT-OF-RANGE, TRY NEXT\r
+ PUSH PDP,TAC ;SAVE BLOCK#\r
+ PUSHJ PDP,SATRD ;READ SAT BLOCK FOR ENTRY POINTED TO BY TAC1\r
+ POP PDP,TAC ;RESTORE BLOCK#\r
+ HLRZ AC1,@SATPTR\r
+SETFR2: SUB TAC,AC1 ;FROM BIT# (IN RANGE 0 TO NUMBLK-1)\r
+ HRRZ AC1,SATPTR ;POINT TO 3 WORD ENTRY\r
+ MOVE AC2,SATBK2 ;XWD -L, POINTER TO SAT BLOCK\r
+ MOVEI ITEM,1 ;RETURN 1 BIT\r
+ PUSHJ PDP,CLRBIT\r
+ SOS @SATPTR ;DECREMENT BLOCKS USED\r
+ SETOM SATCHG ;SAT BLOCK IN CORE NOT = DISK COPY\r
+ JRST DOWNDA ;REMOVE ALLOCATION INTERLOCK AND EXIT.\r
+\r
+;NOTE: SATRD USES TEMPORARY STORAGE LOCATIONS SATTMP AND SATTEM TO HELP AVOID\r
+; A PDL OVRFLW PROBLEM. IT CAN DO SO BECAUSE IT IS NOT RE-ENTRANT, I.E., ONLY\r
+; ONE USER AT A TIME MAY PASS THROUGH HERE BECAUSE OF THE DAREQ INTERLOCK.\r
+\r
+SATRD: MOVEM TAC1,SATTMP ;SAVE POINTER TO DESIRED SAT ENTRY.\r
+ MOVE TAC1,DSKBUF(DEVDAT) ;ALSO SAVE IOWD FROM THE DDB\r
+ MOVEM TAC1,SATTEM\r
+ SKIPE SATCHG ;HAS COPY IN CORE BEEN MODIFIED?\r
+ PUSHJ PDP,SATWRT ;YES, WRITE IT.\r
+ MOVE TAC,SATTMP ;RETRIEVE SAT POINTER FOR SAT BLOCK TO BE READ IN.\r
+ MOVEM TAC,SATPTR\r
+ PUSHJ PDP,SATBLK ;COMPUTE BLOCK#, IOWD\r
+ TLO IOS,NORELB ;NO RELOCATION\r
+ PUSHJ PDP,MQIN ;READ THE BLOCK\r
+ JRST RERA ;ERROR\r
+ MOVE TAC1,SATTEM ;RESTORE SAVED IOWD TO DDB\r
+ MOVEM TAC1,DSKBUF(DEVDAT)\r
+ JRST SATW1\r
+\r
+SATWRT: TLO IOS,NORELB ;NO RELOCATION\r
+ PUSHJ PDP,SATBLK ;COMPUTE BLOCK# IOWD\r
+ PUSHJ PDP,MQOUT ;WRITE BLOCK\r
+ JRST WERA ;ERROR\r
+ SETZM SATCHG ;SHOW COPY IN CORE = BLOCK ON DISK\r
+SATW1: MOVSI IOS,NORELB ;RESET BIT\r
+ ANDCAB IOS,DEVIOS(DEVDAT)\r
+ POPJ PDP,\r
+\r
+;SET UP TAC AND TAC1 FOR READ OR WRITE OF SAT BLOCK\r
+\r
+SATBLK: MOVE TAC,SATPTR\r
+ SUBI TAC,SATENT\r
+ IDIVI TAC,SENTSZ\r
+ ADD TAC,SATXWD\r
+ MOVE TAC1,SATBK2\r
+ MOVEM TAC1,DSKBUF(DEVDAT)\r
+ POPJ PDP,\r
+\r
+SUBTTL "FREE" CORE ALLOCATION\r
+;CLEAR OUT DDB AT RELEASE TIME\r
+\r
+INTERNAL CLRDDB\r
+\r
+CLRDDB: MOVEI TAC,DSKDDB ;POINT TO PROTOTYPE DDB\r
+CLRDB1: MOVE TAC1,TAC ;COPY LINK TO TAC1\r
+ HLRZ TAC,DEVSER(TAC1) ;GET LINK TO NEXT DDB\r
+ JUMPE TAC,CPOPJ ;0 MEANS END\r
+ CAIE TAC,(DEVDAT) ;OWNED BY CURRENT USER?\r
+ JRST CLDDB1 ;NO\r
+ NOSCHEDULE\r
+ MOVE AC1,DEVSER(TAC) ;GET LINK FROM THIS DDB\r
+ HLLM AC1,DEVSER(TAC1) ;STORE IN PREVIOUS DDB TO REMOVE THIS ONE\r
+ HRRZ ITEM,DDBPTR ;GET INTERRUPT LEVEL POINTER\r
+ CAIN ITEM,0(TAC) ;POINTED TO DISCARDED DDB?\r
+ MOVSM AC1,DDBPTR ;YES. BYPASS DISCARDED DDB\r
+ SCHEDULE\r
+ MOVEI ITEM,DSKCOR\r
+ JRST CLCOR1 ;DELETE FREE STORAGE.\r
+\r
+;BUILD A DISK DEVICE DATA BLOCK AND ASSIGN IF LOGICAL NAME GIVEN.\r
+;THIS IS DONE AT INIT TIME.\r
+\r
+INTERNAL SETDDB\r
+\r
+SETDDB: PUSH PDP,ITEM ;SAVE AC'S USED BY SETDDB\r
+ PUSH PDP,TAC1\r
+ MOVE TAC1,DEVMOD(DEVDAT)\r
+ TRNE TAC1,ASSPRG ;HAS AN INIT BEEN DONE?\r
+ JRST SETDD0 ;YES. MUST COPY PROTOTYPE DDB\r
+ HRRZ TAC1,DEVDAT ;GET ADDRESS OF DDB\r
+ CAIE TAC1,DSKDDB ;IS IT PROTOTYPE?\r
+ JRST SETDD1 ;NO. WE ALREADY HAVE A DDB\r
+SETDD0: MOVEI ITEM,DSKCOR ;GET SOME FREE CORE\r
+ NOSCHEDULE\r
+ PUSHJ PDP,GTCOR1 ;GET SPACE FOR DDB\r
+ HRR DEVDAT,TAC1 ;DEVDAT POINTS TO ASSIGNED CORE\r
+ HRLI TAC1,DSKDDB ;SOURCE, DESTINATION\r
+ BLT TAC1,PTR1(DEVDAT) ;COPY PROTOTYPE DDB INTO MONITOR CORE\r
+ MOVEI TAC1,DSKDDB ;TAC1 POINTS TO PROTOTYPE\r
+ ; LINK PROTOTYPE DDB TO COPY\r
+ ; COPY ALREADY LINKS WHERE PROTOTYPE DID\r
+ HRLM DEVDAT,DEVSER(TAC1)\r
+ SCHEDULE\r
+SETDD1: POP PDP,TAC1\r
+ POP PDP,ITEM\r
+ POPJ PDP,\r
+\r
+;SET TAC1 TO SOME AREA FOR BUFFER.\r
+;GET BUFFER SPACE FROM USER INPUT OR OUTPUT RING IF AVAILABLE\r
+;ASSIGN FROM MONITOR CORE AS A LAST RESORT.\r
+;SET DSKBUF(DEVDAT) TO POINT TO BUFFER.\r
+\r
+EXTERNAL PIOMOD,UADRCK,JOBFF\r
+\r
+SETBUF: TLNE IOS,UBFS ;HAVE ONE IN FREE STORAGE?\r
+ POPJ PDP, ;YES, LEAVE\r
+ LDB TAC1,PIOMOD ;NO. DUMP MODE?\r
+ CAIGE TAC1,SD\r
+ TLNE DEVDAT,DSKRLB ;RESET UUO IN PROGRESS ?\r
+ JRST SETBF6 ;YES TO EITHER QUESTION\r
+\r
+ TLNN DEVDAT,INBFB ;INBUF DONE YET?\r
+ JRST SETBF1 ;NO\r
+SETBFI: HRRZ TAC1,DEVIAD(DEVDAT) ;CALL HERE FROM INPUT - RING KNOWN TO BE AVAILABLE\r
+ JRST SETBF2\r
+\r
+SETBF1: TLNN DEVDAT,OUTBFB ;OUTPUT DONE YET?\r
+ JRST SETBF6 ;NO\r
+SETBFO: HRRZ TAC1,DEVOAD(DEVDAT) ;CALL HERE FROM OUTPUT - RING KNOWN TO BE AVAILABLE\r
+\r
+SETBF2: MOVE TAC1,2(TAC1)\r
+ \r
+ HRRZ AC1,TAC1 ;ADDRESS CHECK LOW END\r
+ PUSHJ PDP,UADRCK\r
+ MOVEI AC1,BLKSIZ-1(TAC1)\r
+ PUSHJ PDP,UADRCK\r
+ TLO IOS,UBFU ;BUFFER IN USER AREA\r
+SETBF5: HRLI TAC1,NBLKSZ\r
+ MOVEM TAC1,DSKBUF(DEVDAT)\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ POPJ PDP,\r
+;DUMP MODE, USE AREA IN FREE STORAGE.\r
+\r
+SETBF6: AOSE MQREQ\r
+ PUSHJ PDP,MQWAIT\r
+ TLO IUOS,UBFU ;BUFFER IN MONITOR CORE\r
+ MOVEI TAC1, MONBUF ;TAC1 POINTS TO MONITOR BUFFER\r
+ JRST SETBF5\r
+\r
+;CLEAR THE BUFFER IN FREE STORAGE IF THERE.\r
+\r
+EXTERNAL BUFCLR,JOBFF,IADRCK\r
+CLRBUF: SCHEDULE\r
+ TLZN IOS,DAFLG ;USING SAT BLOCK?\r
+ JRST .+3\r
+ SOSL DAREQ ;YES. RELEASE\r
+ SETOM DAAVAL\r
+ TLZN IOS,AUFLG ;USING UFD?\r
+ JRST .+3\r
+ SOSL AUREQ ;YES. RELEASE UFD\r
+ SETOM AUAVAL\r
+ TLZN IOS,UBFS ;USING MONITOR BUFFER?\r
+ JRST .+3\r
+ SOSL MQREQ ;YES, RELEASE MONITOR BUFFER\r
+ SETOM MQAVAL\r
+ TLZ IOS,NCTRLC ;RENABLE ^C\r
+ TLZE IOS,UBFU ;USING BUFFER IN USER AREA\r
+ JRST CLRBF1 ;YES. CLEAR BUFFER\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ POPJ PDP,\r
+\r
+;CLEAR USER BUFFER AFTER USING\r
+\r
+CLRBF1: MOVEM IOS,DEVIOS(DEVDAT)\r
+ HRRZ TAC,DSKBUF(DEVDAT) ;GET LOC. OF BUFFER\r
+ CAML TAC,JOBFF(JDAT) ;ABOVE JOBFF>\r
+ POPJ PDP, ;NO. RETURN.\r
+ PUSHJ PDP,IADRCK\r
+ POPJ PDP,\r
+ SUBI TAC,2 ;SET TAC TO 2ND BUFFER WORD\r
+ SOS (PDP) ;BUFCLR WILL SKIP RETURN\r
+ JRST BUFCLR ;CLEAR THE BUFFER\r
+\r
+;FIND THE FIRST ZERO IN A SET OF WORDS\r
+;ENTER WITH LH OF TAC SET TO NEGATIVE OF NUMBER OF WORDS.\r
+; RH OF TAC CONTAINING ADDRESS OF FIRST WORD.\r
+;CALL: PUSHJ PDP,GETZER\r
+; EXIT1 NO ZEROS\r
+; EXIT2 NORMAL\r
+;NORMAL EXIT LEAVES TAG POINTING TO WORD CONTAING THE ZERO.\r
+;AND TAC1 HAVING A 1-BIT IN THE POSITION OF THE ZERO.\r
+;\r
+;ENTER AT GETZR1 IF TAC1 IS ALL SET UP.\r
+;CALLED AT UUO AND INTERRUPT LEVELS\r
+\r
+GETZER: MOVNI DAT,1\r
+ JRST GETZ3\r
+\r
+GETZ1: ROT TAC1,-1\r
+ JUMPGE TAC1,GETZ3\r
+\r
+GETZ2: AOBJP TAC,CPOPJ\r
+ CAMN DAT,(TAC)\r
+ JRST GETZ2\r
+\r
+GETZ3: TONE TAC1,(TAC)\r
+ JRST GETZ1\r
+ JRST CPOPJ\r
+\r
+;TIMING: M=NUMBER OF LEADING WORDS CONTAINING NO ZEROS\r
+; M=NUMBER OF LEADING ONES IN M+1ST WORD\r
+\r
+; 38+12,8M+17.1N MIRCO-SECS\r
+\r
+;WORST CASE WITH 128 WORDS = 2.3 MILS\r
+\r
+\r
+;FIND THE NUMBER OF ZERO BITS TO THE RIGHT OF A WORD\r
+;CONTAINING A SINGLE 1-BIT\r
+;ENTER WITH BIT IN TAC1, EXIT WITH RESIDUE IN TAC1.\r
+;CALLED AT UUO AND INTERRUPT LEVELS\r
+\r
+RESIDU: TLNN TAC1,777000\r
+ JRST RESID1\r
+ LSH TAC1,-11\r
+ TLOA TAC1,43000\r
+RESID1: TLO TAC1,32000\r
+ FAD TAC1,[0]\r
+ LSH TAC1,-33\r
+ POPJ PDP,\r
+\r
+\r
+;FIND FOUR FREE WORDS OF CORE, RETURN AN ADDRESS IN TAC1\r
+;IT IS ASSUMED THAT THE CLOCK IS OFF.\r
+\r
+ INTERN GETFCR\r
+\r
+GETFCR: MOVEI ITEM,1 ;REQUEST ONE 4 WORD BLOCK\r
+GTCOR1: MOVEI AC1,LOCORE ;POINT TO THREE WORD FREE CORE ENTRY\r
+ MOVEI AC2,DDBTAB ;POINT TO BIT TABLE\r
+ PUSH PDP,DAT\r
+ PUSHJ PDP,GETBIT ;FIND A HOLE\r
+ JRST DFERR9 ;THERE ARE NONE\r
+ POP PDP,DAT\r
+ LSH TAC1,2 ;MULTIPLY BIT# BY 4\r
+ SUBI TAC1,4 ;SYNCHRNIZE\r
+ ADD TAC1,LOCORE ;FORM CORE ADDRESS\r
+ POPJ PDP,\r
+\r
+INTERNAL GETBIT\r
+\r
+\r
+;SEARCH THROUGH A TABLE TO FIND A SERIES OF ZERO-BITS.\r
+;ENTER WITH AC1 SET UP AS IN CLRBIT ROUTINE, C(ITEM) SET TO THE\r
+; SIZE HOLD DESIRED,\r
+;CALLED AT UUO AND INTERRUPT LEVELS\r
+;ON UNSUCCESSFUL RETURN DAT CONTAINS THE SIZE\r
+;OF LARGETS HOLE ENCOUNTERED\r
+\r
+GETBIT: PUSH PDP,[-1] ;INITIALIZE LARGEST HOLD FOUND SO FAR\r
+ PUSH PDP,ITEM ;SAVE HOLD SIZE\r
+ MOVE TAC,2(AC1) ;TAC:=IOWD LENGTH OF TABLE,TABLE ADDRESS\r
+ MOVE TAC1,1(AC1)\r
+ PUSHJ PDP,GETZER ;FIND THE FIRST ZERO\r
+ JRST GTBIT5 ;NO ZEROS LEFT\r
+ MOVEM TAC1,1(AC1) ;SAVE THE SPOT\r
+ MOVEM TAC,2(AC1)\r
+ PUSH PDP,TAC\r
+ \r
+ PUSH PDP,TAC1\r
+\r
+GTBIT1: AOS DAT ;INCREMENT SIZE OF HOLD BY 1 (GETZER LEFT DAT=-1)\r
+ SOJLE ITEM,GTBIT2 ;FOUND ENOUGH?\r
+ ROT TAC1,-1 ;NO\r
+ SKIPGE TAC1\r
+ AOBJP TAC,GTBT1A ;JUMP IF TABLE EXHAUSTED\r
+ TDNN TAC1,(TAC) ;IS NEXT BIT ZERO?\r
+ JRST GTBIT1 ;YES, CONTINUE\r
+\r
+GTBT1A: CAMLE DAT,-3(PDP) ;NO. LARGEST HOLE SO FAR?\r
+ MOVEM DAT,-3(PDP) ;YES. SAVE SIZE\r
+ JUMPG TAC,GTBIT6 ;TABLE EXHAUSTED? IF SO, ERROR EXIT.\r
+ PUSHJ PDP,GETZER ;NO, TRY FURTHER ON\r
+ JRST GTBIT6 ;NO MORE, ERROR\r
+ MOVEM TAC1,(PDP)\r
+ MOVEM TAC,-1(PDP)\r
+ MOVE ITEM,-2(PDP)\r
+ JRST GTBIT1\r
+\r
+GTBIT2: MOVE TAC1,(PDP) ;HOLE FOUND, SET BITS TO ONES\r
+ MOVE TAC,-1(PDP)\r
+ MOVE ITEM,-2(PDP)\r
+\r
+GTBIT3: ORM TAC1,(TAC)\r
+ SOJLE ITEM,GTBIT4\r
+ ROT TAC1,1\r
+ JUMPGE TAC1,GTBIT3\r
+ AOBJN TAC,GTBIT3 ;THIS SHOULD ALWAYS JUMP\r
+\r
+GTBIT4: POP PDP,TAC1\r
+ POP PDP,TAC\r
+ AOS -2(PDP)\r
+ HRRZS TAC\r
+ SUBI TAC,-1(AC2)\r
+ PUSHJ PDP,RESIDU\r
+ IMULI TAC,^D36\r
+ SUBM TAC,TAC1\r
+GTBIT5: POP PDP,ITEM\r
+ POP PDP,DAT ;SIZE OF LARGEST HOLD FOUND IF UNSUCCESSFUL\r
+ POPJ PDP,\r
+\r
+GTBIT6: POP PDP,TAC\r
+ POP PDP,TAC1\r
+ AOS -1(PDP) ;SIZE OF LARGEST HOLD MUST BE ADJUSTED\r
+ JRST GTBIT5\r
+\r
+;FREE A FOUR WORD SECTION OF CORE.\r
+;ENTER WITH ADDRESS IN TAC\r
+\r
+ INTERNAL CLCOR1\r
+\r
+CLRCOR: MOVEI ITEM,1\r
+CLCOR1: SUB TAC,LOCORE\r
+ LSH TAC,-2\r
+ MOVEI AC1,LOCORE\r
+ MOVE AC2,CRINIT ;SEARCH FROM BEGINNING\r
+\r
+;CLEAR A SERIES OF BITS IN SOME TABLE\r
+;ENTER WITH: C(TAC) SET TO A BIT NUMBER\r
+; C(AC1) SET TO EITHER A SAT ENTRY OR FREE\r
+; CORE ENTRY\r
+; C(AC2) SET TO BEGINNING OF TABLE (IOWD FORM)\r
+; C(ITEM) SET TO NUMBER OF BITS TO CLEAR\r
+;EXIT WITH CORRECT BITS SET TO ZERO AND SET ENTRY OR FREE CORE\r
+; ENTRY UPDATED IF NECESSARY.\r
+\r
+INTERNAL CLRBIT\r
+\r
+CLRBIT: IDIVI TAC,^D36\r
+ HRLS TAC ;BOTH HALVES OF TAC CONTAIN\r
+ ; WORD INCREMENT\r
+ ADD TAC,AC2\r
+ PUSH PDP,DAT\r
+ MOVN DAT,TAC1\r
+ MOVSI TAC1,400000\r
+ ROT TAC1,(DAT)\r
+ POP PDP,DAT\r
+ PUSH PDP,TAC\r
+ PUSH PDP,TAC1\r
+\r
+CLRB4: ANDCAM TAC1,(TAC) ;CLEAR A BIT\r
+ SOJLE ITEM,CLRB5 ;IS THAT ALL?\r
+ ROT TAC1,-1 ;NO\r
+ JUMPGE TAC1,CLRB4\r
+ AOBJN TAC,CLRB4 ;THIS SHOULD ALWAYS JUMP\r
+\r
+CLRB5: POP PDP,TAC1\r
+ POP PDP,TAC\r
+ CAMLE TAC,2(AC1) ;NEED TO RESET?\r
+ POPJ PDP, ;NO\r
+ CAME TAC,2(AC1)\r
+ JRST CLRB2 ;YES\r
+ JUMPL TAC1,CLRB2\r
+ SKIPGE 1(AC1)\r
+ JRST CLRB3\r
+ CAML TAC1,1(AC1)\r
+CLRB2: MOVEM TAC1,1(AC1)\r
+CLRB3: MOVEM TAC,2(AC1)\r
+ POPJ PDP,\r
+\r
+SUBTTL QUEUEING AND INTERRUPT PROCESSING\r
+;PUT A REQUEST IN THE USER QUEUE.\r
+;ENTER AT QIN FOR INPUT. QOUT FOR OUTPUT.\r
+;CALLED AT BOTH INTERRUPT AND UUO LEVELS\r
+\r
+EXTERNAL SETACT,CPOPJ\r
+\r
+QIN: SKIPA TAC1,DEVDAT ;*\r
+QOUT: MOVEI TAC1,DEVOAD-DEVIAD(DEVDAT) ;*\r
+\r
+ MOVEI TAC,TRIES ;*INITIALIZE ERROR COUNT\r
+ MOVEM TAC,DSKCNT(DEVDAT) ;*\r
+ PUSHJ PDP,SETACT ;*SET IOACT\r
+ MOVSI TAC,W8BIT ;*SET WAIT FLAG\r
+ ORM TAC,DEVIAD(TAC1)\r
+ NOSCHEDULE ;*\r
+ AOS USRCNT ;*INCREMENT COUNTER OF TRANSFER REQUESTS\r
+\r
+ MOVNI DAT,1 ;*\r
+ EXCH DAT,DFBUSY ;*\r
+ JUMPN DAT,QIOEND ;*JUMP IF DISK BUSY\r
+\r
+ ANDCAM TAC,DEVIAD(TAC1) ;*\r
+ CAME TAC1,DEVDAT ;*\r
+ MOVEI TAC,0 ;*\r
+ PUSHJ PDP,USRGO ;*\r
+\r
+QIOEND: SCHEDULE ;*\r
+ POPJ PDP, ;*\r
+\r
+\r
+;PUT A REQUEST IN THE MONITOR QUEUE.\r
+;ENTER AT MQIN FOR INPUT, MQOUT FOR OUTPUT.\r
+;ENTER WITH C(TAC1 0-17) = -SIZE OF BLOCK\r
+; C(TAC1 18-35) = CORE ADDRESS\r
+; C(TAC 18-35) = LOGICAL BLOCK NUMBER\r
+\r
+INTERNAL MQIN,MQOUT\r
+EXTERNAL MQREQ,MQWAIT,SETACT,MQUEUE,WSYNC\r
+\r
+MQIN: HRLZ TAC1,DEVDAT\r
+ TLOA TAC1,400000 ;BIT 0=1 IS READ INDICATOR\r
+MQOUT: HRLZ TAC1,DEVDAT\r
+ IFN FTRCHK,<\r
+ TRNN TAC,-1 ;WRITING OR READING BLOCK NR 0 SHOULD NEVER OCCUR HERE\r
+\r
+ HALT .+1 ;CONTINUING AFTER HALT WILL YIELD INFORMATION\r
+ ; LOSS ON THE DISK\r
+>\r
+ HRLI TAC,TRIES\r
+\r
+ MOVSM TAC,DSKCNT(DEVDAT);STASH AWAY BLOCK #, ERROR COUNT.\r
+ PUSHJ PDP,SETACT ;SET IOACT\r
+ NOSCHEDULE\r
+ TLNN IOS,UBFS+NORELB ;USING BUFFER IN FREE STORAGE?\r
+ HRR TAC1,PROG ;NO, RELOCATE\r
+ MOVEM TAC1,@MIPTR\r
+\r
+ AOS AC1,MIPTR ;RING INDEX MIPTR\r
+ CAIL AC1,MQTOP\r
+ MOVEI AC1,MQUEUE\r
+ MOVEM AC1,MIPTR\r
+\r
+ MOVNI AC1,1\r
+ EXCH AC1,DFBUSY ;FORCE DFBUSY TO-1, EXTRACT PREVIOUS CONTENTS.\r
+ SKIPN AC1 ;ALREADY BUSY?\r
+ PUSHJ PDP,MONGO ;NO, START A MONITOR JOB\r
+\r
+ SCHEDULE\r
+ PUSHJ PDP,WSYNC\r
+ HRRZ AC1,DSKCNT(DEVDAT) ;ANY ERRORS?\r
+ TRNN AC1,IODERR!IODTER!IOIMPM\r
+ AOS (PDP) ;NO, SKIP RETURN\r
+ POPJ PDP,\r
+\r
+;*\r
+;* EVERYTHING FROM HERE THRU SETDUN CALLED AT INTERRUPT LEVEL\r
+;*\r
+;ROUTINE CALLED BY INTERRUPT IN DISK.\r
+;CHECK JOB FOR ERRORS, THEN START UP ANY WAITING JOB.\r
+;UPON ENTRY, THE ACS HAVE BEEN SAVED. IOS CONTAINS ANY ERROR\r
+;FLAGS.\r
+\r
+INTERNAL DFINT,FTSWAP\r
+EXTERNAL ADVBFE,ADVBFF,PJOBN,SETIOD,PIOMOD\r
+EXTERNAL MQREQ,MQAVAL,DFRED,DFWRT\r
+EXTERNAL JBTADR\r
+EXTERNAL MQTOP,MQUEUE\r
+\r
+DFINT:\r
+ IFN FTSWAP,<\r
+ EXTERNAL SQREQ,SERA,SOGO,SWPINT\r
+ MOVE TAC,SERA ;*WAS THAT A SWAPPING JOB?\r
+ TLNE TAC,200000 ;*\r
+ JRST SWPINT ;*YES\r
+ >\r
+ SKIPN RUNUSR ;*WAS THAT A USER JOB?\r
+ JRST DFINT2 ;*NO, MUST HAVE BEEN MONITOR\r
+ \r
+ MOVS DEVDAT,RUNUSR ;*YES\r
+ ANDI DEVDAT,377777 ;*CLEAR READ INDICATOR BIT.\r
+ TRNE IOS,IOIMPM ;*WRITE-LOCK?\r
+ PUSHJ PDP,DINT1A ;*YES\r
+ TRNE IOS,IODTER!IODERR ;*ERRORS?\r
+ JRST DFINT9 ;*ERRORS\r
+DFINTA: AOS DEVACC(DEVDAT) ;INCREMENT POINTER TO RETRIEVAL POINTER\r
+ AOS SETCNT(DEVDAT) ;INCREMENT RELATIVE BLOCK NUMBER\r
+ SOS USRCNT ;*\r
+ PUSHJ PDP,SETDUN ;*TURN OFF I/O WAIT\r
+ LDB TAC,PJOBN\r
+ MOVE PROG,JBTADR(TAC) ;*SET RELOC. AND PROT. FOR THIS JOB\r
+\r
+ SKIPL RUNUSR ;*WAS IT A READ OR A WRITE?\r
+ JRST DFINT1 ;*WRITE\r
+\r
+ MOVEI TAC,@DEVIAD(DEVDAT) ;*SET UP WORD COUNT\r
+ ADDI TAC,1 ;*\r
+ MOVEI TAC1,BLKSIZ\r
+ HRRM TAC1,@TAC\r
+\r
+ IFG CHKCNT,<\r
+ MOVE TAC,DEVOAD(DEVDAT)\r
+ TLNE TAC,CKSUPR\r
+ JRST DINT0B\r
+ HRRZ TAC,DEVIAD(DEVDAT)\r
+ ADD TAC,[XWD NBLKSZ,2]\r
+ PUSHJ PDP,CHKSUM ;CLEAR IOACT\r
+ MOVE TAC,DEVACC(DEVDAT)\r
+ HLRZ TAC,-1(TAC)\r
+ CAMN TAC,TAC1\r
+ JRST .+3\r
+ PUSHJ PDP,CKREC3\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ >\r
+DINT0B:\r
+ PUSHJ PDP,DFINX ;ENTER INPUT ROUTINE\r
+ SKIPA\r
+DFINT1: PUSHJ PDP,DFOUTX ;CHECK FOR MORE OUTPUT\r
+ SETZM RUNUSR\r
+\r
+ JRST DFINT4\r
+\r
+DINT1A: HRRZ TAC,DEVACC(DEVDAT) ;WRITE-LOCK FOUND, SET WLBIT\r
+ HRRZ TAC,-1(TAC)\r
+ JRST SETWL ;AND RETURN\r
+\r
+DFINT2: MOVS DEVDAT,@MOPTR ;IT WAS A MONITOR JOB\r
+ ANDI DEVDAT,377777 ;REMOVE POSSIBLE READ INDICATOR\r
+ TRNN IOS,IODERR!IODTER ;ERRORS?\r
+ JRST DFINT3 ;NO.\r
+ SOS TAC,DSKCNT(DEVDAT) ;YES,TRIED ENOUGH?\r
+ TRNE TAC,-1\r
+ JRST DINT4A ;NO, TRY AGAIN.\r
+\r
+DFINT3: HRRM IOS,DSKCNT(DEVDAT) ;SAVE ANY ERRORS\r
+ HLRZ TAC,DSKCNT(DEVDAT) ;WRITE-LOCK ERROR?\r
+ TRNE IOS,IOIMPM\r
+ PUSHJ PDP,SETWL ;YES, SET WLBIT\r
+ PUSHJ PDP,SETDUN\r
+ SETZM @MOPTR ;REMOVE THIS MONITOR JOB\r
+ AOS TAC,MOPTR ;INCREMENT POINTER.\r
+ CAIL TAC,MQTOP\r
+ MOVEI TAC,MQUEUE\r
+ MOVEM TAC,MOPTR ;FALL THROUGH TO DFINT4\r
+\r
+;DETERMINE NEXT TRANSFER TO MAKE ACCORDING TO PRIOROTY\r
+; 1) SWAPPING 2) MQ I/O 3) BUFFERED MODE I/O\r
+DFINT4: MOVEM IOS,DEVIOS(DEVDAT) ;CLEAR IOACT\r
+DINT4A: IFN FTSWAP,<\r
+ SKIPE SQREQ ;SWAPPING JOB WAITING?\r
+ JRST SOGO ;YES,START IT\r
+ >\r
+INTERNAL DINT4B\r
+\r
+DINT4B: SKIPE @MOPTR ;MONITOR JOB WAITING?\r
+ JRST MONGO ;YES, START IT UP\r
+\r
+ SKIPL USRCNT ;USER WAITING?\r
+ JRST FINDV ;YES.\r
+ SETZM DFBUSY ;NO. TURN OFF BUSY FLAG\r
+ POPJ PDP, ;EXIT INTERRUPT\r
+\r
+;FIND A WAITING USER\r
+\r
+FINDV: HRRZ DEVDAT,DDBPTR\r
+ MOVSI TAC,W8BIT ;PREPARE TO TURN OFF WAIT INDICATOR\r
+\r
+DFINT5: HLRZ TAC1,(DEVDAT) ;END OF DISK DDBS?\r
+ SKIPE DEVDAT\r
+ CAIE TAC1,(SIXBIT /DSK/)\r
+ MOVEI DEVDAT,DSKDDB ;YES, RESET TO TOP\r
+\r
+ SKIPGE DEVIAD(DEVDAT) ;ANY READS WAITING?\r
+ JRST DFINT7 ;YES\r
+ SKIPGE DEVOAD(DEVDAT) ;ANY WRITES WAITING?\r
+ JRST DFINT6 ;YES\r
+ HLRZ DEVDAT,DEVSER(DEVDAT) ;NO, TRY NEXT DDB\r
+ JRST DFINT5\r
+\r
+;START UP A USER WRITE\r
+\r
+DFINT6: ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR OUTPUT WAIT BIT IN DDB\r
+ MOVEI TAC,0 ;PREPARE TO SET BIT 0=0 IN RUNUSR\r
+ JRST USRGO\r
+\r
+;START UP A USER READ\r
+\r
+DFINT7: ANDCAM TAC,DEVIAD(DEVDAT) ;CLEAR INPUT WAIT BIT IN DDB\r
+\r
+USRGO: MOVSM DEVDAT,RUNUSR ;SAVE DEVDAT FOR USE AT DFINT\r
+ ORM TAC,RUNUSR ;SET READ (B0=1) WRITE (B0=0) INDICATION\r
+ AOS UXFERS ;COUNT TOTAL USER TRANSFERS\r
+ LDB PROG,PJOBN ;SETUP RELOCATION FOR JOB\r
+ MOVE PROG,JBTADR(PROG)\r
+ MOVE TAC,DEVSER(DEVDAT) ;GET DDB LINK\r
+ MOVSM TAC,DDBPTR ;START SEARCH WITH NEXT DDB\r
+ MOVE TAC,DEVACC(DEVDAT) ;GET POINTER LOCATION\r
+ HRRZ TAC,(TAC) ;GET RETRIEVAL POINTER (XWD CHECKSUM BLOCK #)\r
+ MOVSI TAC1,NBLKSZ\r
+ SKIPL RUNUSR ;READ?\r
+ JRST USRGO3\r
+\r
+ HRRI TAC1,@DEVIAD(DEVDAT) ;GET ADDRESS OF RING BUFFER\r
+ AOJA TAC1,DFRED ;FROM IOWD AND READ\r
+\r
+USRGO3: HRRI TAC1,@DEVOAD(DEVDAT) ;GET ADDRESS OF OUTPUT BUFFER\r
+ AOJA TAC1,DFWRT ;FORM IOWD AND WRITE\r
+\r
+\r
+;START UP A MONITOR READ OR WRITE\r
+\r
+MONGO: MOVS ITEM,@MOPTR ;XWD CORE ADDRESS, SAVED DEVDAT\r
+ ANDCMI ITEM,400000 ;CLEAR READ INDICATOR\r
+ MOVE TAC1,DSKBUF(ITEM) ;GET CONTROLLING IOWD\r
+ HLRZ TAC,ITEM ;GET CORE ADDRESS\r
+ ADD TAC1,TAC\r
+ HLL TAC1,DSKBUF(ITEM) ;RESTORE LH IN CASE ADDING REL. CAUSES OVRFL IN T LH\r
+ SUBI TAC1,1 ;FORM IOWD LENGTH ADDRESS\r
+ HLRZ TAC,DSKCNT(ITEM) ;GET LOGICAL BLOCK#\r
+ SKIPL @MOPTR\r
+ JRST DFWRT\r
+ JRST DFRED\r
+\r
+;ERROR ON USER JOB.\r
+\r
+DFINT9: AOS ECOUNT ;COUNT USER HARDWARE ERRORS\r
+ SOS TAC,DSKCNT(DEVDAT) ;TRIED ENOUGH?>\r
+ TRNN TAC,-1\r
+ JRST DFINTA ;YES.\r
+ MOVE TAC,DEVDAT ;NO. RESET FLAG SO IT WILL GO AGAIN.\r
+ SKIPL RUNUSR ;READ?\r
+ ADDI TAC,DEVOAD-DEVIAD ;NO.\r
+ MOVSI TAC1,400000\r
+ ORM TAC1,DEVIAD(TAC) ;RESTORE WAIT BIT TO DEVIAD OR DEVOAD\r
+ SETZM RUNUSR ;CLEAR USER INDICATOR\r
+ JRST DINT4A ;DO NEXT TASK.\r
+\r
+;CLEAR I/O DONE FLAG IF IT IS ON.\r
+\r
+SETDUN: ;*\r
+ OR IOS,DEVIOS(DEVDAT) ;*\r
+ ANDCMI IOS,IOACT ;*\r
+ TLZE IOS,IOW ;*\r
+ JRST SETIOD ;*\r
+ POPJ PDP, ;*\r
+\r
+SUBTTL ERRORS, SUBROUTINES.\r
+;ERROR ROUTINES CALLED FROM UUO LEVEL\r
+\r
+EXTERN EXCALP,ERRPTU,TPOPJ\r
+\r
+DEFINE ERRORS (X),<\r
+ PUSHJ PDP,CLRBUF ;CLEAR ANY DUMP BUFFER\r
+ JSP TAC,ERRPTU ;OUTPUT A MESSAG\r
+ ASCIZ ^X^\r
+ JRST EXCALP ;TYPE "UUO FROM" MESSAGE AND QUIT\r
+ >\r
+\r
+DFERR1: ERRORS <DISK FULL-- YOUR JOB HAS LOST. >\r
+\r
+DFERR2: MOVEI IOS,IOIMPM\r
+ ORB IOS,DEVIOS(DEVDAT)\r
+ POPJ PDP,\r
+\r
+DFERR3: ERRORS <INCORRECT RETRIEVAL INFORMATION>\r
+\r
+;THESE ERROR ROUTINES ARE GENERALLY CALLED AFTER SETLE HENCE 0(PDP) IS XWD PROJ,PROG\r
+\r
+DFERR6: MOVEI TAC,NORITE ;FILE ALREADY BEING ALTERED\r
+DFERRY: HRRZ TAC1,UUO\r
+ ADD TAC1,[XWD PROG,ERRBIT] ;FORM POINTER TO UUO PARAMETER BLOCK\r
+ HRRM TAC,@TAC1 ;STORE ERROR CODE\r
+ POP PDP,TAC ;REMOVE XWD PROJ,PROG\r
+ JRST CLRBUF ;RELEASE ANY RESOURCES\r
+\r
+DFERR5: MOVEI TAC,PROTF ;PROTECTION FAILURE\r
+ JRST DFERRY\r
+\r
+DFERR4: MOVEI TAC,NOTINM ;USER NOT IN MFD\r
+ JRST DFERRY\r
+\r
+DFERR7: MOVEI TAC,NOTINU ;FILE NOT IN UFD\r
+ JRST DFERRY\r
+\r
+DFERR8: ERRORS <LOOKUP AND ENTER HAVE DIFFERENT NAMES>\r
+\r
+DFERR9: SCHEDULE\r
+ ERRORS <NOT ENOUGH FREE CORE IN MONITOR>\r
+\r
+DFER10: MOVEI TAC,RENFAL\r
+ JRST DFERRY\r
+\r
+DFER11: MOVEI TAC,NOFILE\r
+ JRST DFERRY\r
+\r
+DFER12: MOVEI TAC,0\r
+ PUSH PDP,TAC ;ADD SOMETHING TO BE REMOVED (SINCE SETLE NOT CALLED)\r
+ JRST DFERRY\r
+\r
+WERA: MOVSI IOS,NORELB\r
+ ANDCAB IOS,DEVIOS(DEVDAT)\r
+ ERRORS <NON-RECOVERABLE DISC WRITE ERROR>\r
+\r
+RERA: MOVSI IOS,NORELB\r
+ ANDCAB IOS,DEVIOS(DEVDAT)\r
+ ERRORS <NON-RECOVERABLE DISC READ ERROR>\r
+\r
+;CALLED AT BOTH INTERUPT AND UUO LEVELS\r
+;COMPUTE CHECK-SUM\r
+;ENTER WITH C(TAC 18-35) SET TO BUFFER ADDRESS\r
+;RETURN WITH C(TAC1)SET TO ONES COMPLEMENT SUM IN RH.\r
+\r
+IFG CHKCNT,<INTERNAL CHKSUM\r
+CHKSUM: HLRZ TAC1,TAC ;IS COUNT GREATER THAN CHKCNT\r
+ CAIGE TAC1,-CHKCNT\r
+ MOVEI TAC1,-CHKCNT ;YES, USE CHKCNT\r
+ MOVE IOS,[XWD UBFS,IOACT]\r
+ ANDCM IOS,DEVIOS(DEVDAT)\r
+ IORM IOS,DEVIOS(DEVDAT)\r
+ TLNE IOS,UBFS\r
+ ADDI TAC,(PROG) ;NO. RELOCATE,\r
+ HRL TAC,TAC1 ;RESET COUNT IN LH AFTER POSSIBLE OVERFLOW\r
+ PUSHJ PDP,CHECK\r
+ ANDCAB IOS,DEVIOS(DEVDAT)\r
+ TRZ IOS,IOACT\r
+ POPJ PDP,\r
+\r
+\r
+CHKSM3: AOJA TAC1,CHKSM2 ;BRING CARRY AROUND\r
+\r
+;CHECKSUM ERROR COUNTING ROUTINE\r
+CKREC2: PUSH PDP,TAC\r
+ IORM AC3,DEVIOS(DEVDAT)\r
+ MOVEI TAC,10000\r
+ ADDM TAC,CKSMCT\r
+ JRST TPOPJ\r
+CKREC3: IORI IOS,IODTER\r
+ AOS CKSMCT\r
+ POPJ PDP,\r
+ >\r
+\r
+;TIMING OF MAIN LOOP IS 13.8 MICRO-SECS AVERGE.\r
+;THIS IS 1.8 MILS OR SO FOR 128 WORDS.\r
+\r
+IFN <IFG CHKCNT, <CHKCNT+>>FTCHECK+FTMONP+FTSWAP, <\r
+\r
+ INTERNAL CHECK\r
+CHECK: MOVEI TAC,0 ;CLEAR SUM\r
+ JFCL 4,.+1 ;CLEAR CARRY0 FLAG\r
+\r
+CHKSM1: ADD TAC1(TAC) ;ADD NEXT WORD\r
+ JFCL 4,CHKSM3 ;JUMP IF CARRY 0\r
+CHKSM2: AOBJN TAC,CHKSM1 ;LOOP UNTIL DONE\r
+ HLRZ TAC,TAC1 ;ADD HALVES\r
+ HRRZS TAC1\r
+ ADD TAC1,TAC\r
+ TLZE TAC1,1 ;CARRY INTO LH?\r
+ ADDI TAC1,1 ;YES BRING IT AROUND\r
+ POPJ PDP,\r
+>\r
+\r
+;UPDATE DEVCNT IF NECESSARY. DEVCNT HAS SIZE OF FILE IN R.H. (IN WORDS IF POSSIBLE,\r
+; OTHERWISE NEGATIVE BLOCK COUNT).\r
+; ENTER WITH SIZE OF CURRENT BLOCK IN TAC1\r
+UPDEVC: HRRZ TAC,SETCNT(DEVDAT) ;*CONVERT CURRENT RELATIVE BLOCK NUMBER TO WORDS\r
+ SUBI TAC,1 ;*\r
+ LSH TAC,BLKP2 ;*\r
+ ADD TAC,TAC1 ;*ADD IN THE ADDITIONAL WORDS IN THIS NEXT\r
+ ; OUTPUT COMMAND.\r
+ HRRZ TAC1,DEVCNT(DEVDAT) ;*PICK UP PREVIOUS MAXIMUM FILE SIZE OF COMPARISON.\r
+ TRNE TAC1,400000 ;*PREVIOUS MAXIMUM SIZE GREATER THAN 2 EXP 17 WORDS?\r
+ JRST UPDVC2 ;*YES, THEN COMPARE AND SAVE NEGATIVE BLOCK COUNTS\r
+ TLNN TAC,-1 ;*NO, DOES THE NEWLY COMPUTED CURRENT FILE SIZE EXCEED\r
+\r
+ ;* 2EXP17 WORDS?\r
+ TRNE TAC,40000 ;*\r
+ JRST UPDVC1 ;*YES, GO SAVE NEGATIVE BLOCK COUNT.\r
+ CAMLE TAC,TAC1 ;*NO, COMPARE POSITIVE WORD COUNTS\r
+ HRRM TAC,DEVCNT(DEVDAT) ;*UPDATE MAXIMUM FILE SIZE ONLY IF PREVIOUS\r
+ ; MAXIMUM EXCEEDED\r
+ POPJ PDP, ;*\r
+UPDVC1: TRO TAC1,-1 ;*SET PREVIOUS MAXIMUM AS ONLY ONE \r
+ ;* (THUS FORCING CURRENT BLOCK COUNT TO BE STORED).\r
+UPDVC2: ADDI TAC,BLKSIZ-1 ;*CONVERT POSITIVE WORD COUNT TO NEGATIVE\r
+ ; BLOCK COUNT.\r
+ LSH TAC,-BLKP2 ;*\r
+ MOVNS TAC ;*\r
+ TRON TAC,400000 ;*MORE THAN 2EXP17 BLOCKS (16,777,216 WORDS)\r
+ ; IN THIS FILE?\r
+ TROA IOS,IOBKTL ;*YES, (PREPOSTEROUS) SET ERROR BIT AND STORE\r
+ ; BLOCK COUNT WODULO 2EXP17\r
+ CAILE TAC1,(TAC) ;*NO, COMPARE PREVIOUS MAXIMUM VERSUS PRESENT\r
+ ; FILE SIZE.\r
+ HRRM TAC,DEVCNT(DEVDAT) ;*STORE NEW MAXIMUM FILES SIZE ONLY IF PREVIOUS\r
+ ;* MAXIMUM EXEEDED.\r
+ POPJ PDP, ;*\r
+\r
+;OUTPUT WRITE-LOCK ERROR. FREE THE BLOCK AND GET NEW ONE.\r
+\r
+WLERA: HLR TAC,DSKCNT(DEVDAT) ;PICK UP BLOCK NUMBER.\r
+ PUSHJ PDP,SETFRE ;FREE THE BLOCK\r
+ JRST DFGETF ;GET ANOTHER.\r
+\r
+;SET WRITE-LOCK INDICATION IN A SAT ENTRY.\r
+;ENTER WITH A BLOCK NUMBER IN TAC.\r
+\r
+SETWL: MOVEI TAC1,SETENT ;*\r
+ JRST .+2 ;*\r
+SETWL1: ADDI TAC1,SENTSZ ;*\r
+ HLRZ ITEM,@TAC1 ;*IS THE BLOCK IN THIS SAT ENTRY?\r
+ CAML TAC,ITEM ;*\r
+ CAIL TAC,NUMBLK(ITEM) ;*\r
+ JRST SETWL1 ;*NO, LOOP.\r
+ MOVEI ITEM,WLBIT ;*\r
+ ORM ITEM,@TAC1 ;*\r
+ POPJ PDP, ;*\r
+\r
+DSKSR: END\r
+\f\r
--- /dev/null
+TITLE DTASRN - NEW FORMAT DECTAPE SERVICE FOR TD-10 (PDP-10)\r
+SUBTTL T. WACHS/RCC TS 04 JUN 69 V406\r
+ XP VDTASX,406\r
+ ;DEFINE GLOBABL VERSION NUMBER FOR LOADER MAP.\r
+ IFNDEF ALMACT, <ALMACT=0>\r
+\r
+ ENTRY DTASRN\r
+DTASRN: ;THIS ENTRY FOR SELECTIVE LOAD BYT BUILD\r
+ INTERNAL DTADSP\r
+EXTERNAL TPOPJ,TPOPJ1,DTALOC,DTALC2,DTBOTH,WSYNC,DTACHL\r
+EXTERNAL STOIOS,STOTAC,SETACT,CLRACT,OUT,DTASAV,PIOMOD\r
+EXTERNAL DTAVAL,DTREQ,DTWAIT,SETIOD,THSDAT,PUNIT\r
+EXTERNAL ADVBFE,ADVBFF,ADRERR,WAIT1,CPOPJ,CPOPJ1,BADDIR\r
+EXTERNAL COMCHK,JOBPD1,DTTURN,PJOBN,RELEA9,UADCK1,STREQ\r
+EXTERNAL CLOCK,JBTADR,DEVPHY,PION,PIOFF,DTTRY\r
+\r
+;DTALOC=PI LOC FOR DATA - CHANGED BY ROUTINE\r
+;DTALC2=PI LOC+1 FOR DAT\r
+;DTBOTH=10*(PI FOR DATA CHAN) + PI FOR FLAGS CHAN\r
+;DTTURN=300200+DTBOTH (CONO FOR TURN-AROUND)\r
+\r
+BLK=4\r
+\r
+\r
+DIRBLK=^D100 ;NUMBER OF BLOCK FOR DIRECTORY\r
+\r
+TOPBLK=1101 ;HIGHEST LEGAL BLOCK NUMBER\r
+NAMSTR=^D83 ;1ST NAME WORD IN DIRECTORY\r
+QUANT=3 ;NUMBER OF BLOCKS CAN READ BEORE GIVING UP DTC\r
+MINDIS=14 ;MINMUM NUMBER OF BLOCKS TO SEARCH BEFORE DISCONNECTING\r
+ ;FROM A TAPE\r
+SPACE=4 ;NUMBER OF BLOCKS SEPERATING CONTIGUOUS BLKS OF A FILE\r
+\r
+;DDB MAGIC CELLS\r
+FSTBLK=13\r
+DLOC=14\r
+IBLK=15\r
+OBLK=16\r
+DISPAD=17\r
+DMPLST=20\r
+SVDWRD=21\r
+\f;FLAGS IN RH OF IOS\r
+UDSD=100\r
+LSTSAV=20000\r
+\r
+;FLAGS IN LH OF IOS\r
+NOLINK=200\r
+CHNGDR=400\r
+RVERSE=1000\r
+SINGL=2000 ;JUST READ OR WRITE 1 BLOCK\r
+DMPMOD=4000\r
+RWDIR=10000\r
+DMPCLS=20000\r
+NOBUF=40000 ;DATA GOING DIRECTLY INTO USER AREA\r
+NOBUFC=737777 ;-NOBUF\r
+REWBIT=100000\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
+\f EXTERN JIFSEC\r
+\r
+ INTERN DTAINT,DTADDB,DTAINI,DTADDS,DTADSP\r
+\r
+DTADDB: SIXBIT /DTA0/\r
+ XWD ^D60*HUNGST,200\r
+ 0\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=.-DTADDR\r
+\r
+ JRST DTAINI\r
+ JRST HUNGTP ;HUNG DEVICE\r
+DTADSP JRST UREL\r
+ JRST UCLS\r
+ JRST UOUT\r
+ JRST UIN\r
+ JRST ENTR\r
+ JRST LOOK\r
+ JRST DMPO\r
+ JRST DMPI\r
+ JRST SETO\r
+ JRST SETI\r
+ JRST GETF\r
+ JRST RENAM\r
+ POPJ PDP, ;CLOSE INPUT\r
+ JRST UTPCLR\r
+;FALL INTO MTAPE\r
+\f HRRZ TAC1,UUO ;MTAPE - GET OPERATION\r
+ CAIE TAC1,1 ;REWIND OR\r
+ CAIN TAC1,11 ;REWIND UNLOAD ARE LEGAL\r
+ SOJA TAC1,MTA0\r
+ POPJ PDP, ;OTHERS ARE NO-OPS\r
+\r
+;INITIALIZE DTC\r
+DTAINI: CONO DTC,0\r
+ SETZM DISCON\r
+ MOVEI TAC,^D1000 ;COMPUTE NO OF MILLISECS/TICK\r
+ IDIVI TAC,JIFSEC ;FOR THIS FREQUENCY CLOCK\r
+ ADDI TAC,1 ;ADD FUDGE FACTORE FOR SAFETY\r
+ HRRM TAC,MSECPT ;SAVE FOR CLOCK CALCULATION\r
+ POPJ PDP,\r
+\f EXTERN JOBSAV\r
+;LOOKUP A DIRECTORY ENTRY\r
+LOOK: TRNE IOS,UDSD ;NON-STANDARD?\r
+ JRST CPOPJ1 ;YES. LOOKUP OK\r
+ PUSHJ PDP,DSERCH ;NO. FIND DIRECTORY ENTRY\r
+ POPJ PDP, ;NOT THERE\r
+ HRRZ TAC1,26(TAC) ;GET DATE, NO. OF 1K BLOCKS NEEDED\r
+ AOS UUO ;POINT UUO TO WORD 3\r
+ MOVEM TAC1,@UUO ;INTO USER'S LOOKUP BLOCK\r
+LOOKA: HLRE TAC,TAC ;GET INDEX\r
+ ADDI TAC,27\r
+ SKIPN FSTBLK(DEVDAT) ;TAPE BEING WRITTEN?\r
+ HRLM TAC,OBLK(DEVDAT) ;NO. SAVE INDEX FOR POSSIUBLE OUTPUT\r
+ HRRM TAC,AC1 ;SAVE INDEX IN CASE LH(IBLK) IS\r
+ ;CHANGED BY DEAD-RECKONING\r
+ MOVEI TAC1,0\r
+ PUSHJ PDP,BLKSRC ;COUNT NUMBER OF BLOCKS IN FILE\r
+ AOJA UUO,STOWD4 ;LAST BLOCK DONE\r
+ AOS TAC1 ;COUNT THE BLOCK\r
+ SOS 1(PDP) ;ADJUST FOR CORRECT RETURN\r
+ AOBJN PDP,BLKSRB ;LOOK FOR NEXT BLOCK\r
+\r
+;TAC1 HAS THE NUMBER OF BLOCKS BELONGING TO THE FILE\r
+STOWD4: IMUL TAC1,[-177] ;-NUMBER OF WORDS IF ALL BLOCKS FULL\r
+ HRLZM TAC1,@UUO ;STORE IN DIRECOTRY WD 4\r
+ SUBI UUO,2 ;POINT UUO TO DIRECORY WD 2\r
+ TLZ IOS,IO ;MAKE SURE IO IS OFF\r
+ TLO IOS,SINGL ;JUST READ 1 RECORD\r
+ MOVEI BLK,DIRBLK ;NO, FIND FIRST MENTION OF BLOCK\r
+ PUSHJ PDP,LSTFRE+1 ;NEAR DIRECTORY\r
+ JUMPN BLK,LOOKE ;FOUND IF BLK NOT =0\r
+LOOKD: PUSHJ PDP,BLKSRC ;FIND FIRST MENTION IN DIRECTORY\r
+ JRST BDDIR ;NOT THERE - ERROR\r
+LOOKE: PUSHJ PDP,RDBLUK ;GO READ IT\r
+ PUSHJ PDP,WAIT1 ;WAIT TILL IT'S IN\r
+ HRLM AC1,IBLK(DEVDAT) ;SAVE INDEX ON INPUT FILE FOR LATER\r
+ ;TEST ON ENTER - WONT ALLOW ENTER\r
+ ;TO BE DONE ON LOOKED-UP FILE\r
+ HRRZ BLK,IBLK(DEVDAT) ;GET FIRST BLOCK OF FILE\r
+LOOKC: SKIPN FSTBLK(DEVDAT) ;IF FILE HAS NOT BEEN ENTERED\r
+ MOVEM BLK,FSTBLK(DEVDAT) ;SAVE IN DDB\r
+ HRRM BLK,@UUO ;SAVE IN USER'S AREA\r
+ HLL TAC,@UUO ;GET USER'S EXTENSION\r
+ HLLM TAC,DEVEXT(DEVDAT) ;SAVE IN DEVCE DATA BLOCK FOR RENAME AND\r
+ ; AND SUPERSEDING SHARED SEGMENTS\r
+ JRST CPOPJ1 ;AND TAKE GOOD EXIT\r
+\fRENAM: PUSH PDP,UUO ;SAVE LOC OF NEW NAME\r
+ MOVEI UUO,DEVFIL(DEVDAT) ;SEARCH FOR OLD NAME\r
+ PUSHJ PDP,DSER1\r
+ JRST RENER1 ;NOT FOUND - ERROR\r
+ POP PDP,UUO ;FOUND, RESTORE UUO\r
+ SKIPE @UUO ;RENAMING TO ZERO?\r
+ JRST RENAM2 ;NO. GO TO REAL RENAME\r
+ SETZM (TAC) ;YES. DELETE NAME IN DIR\r
+ SETZM 26(TAC) ;DELETE EXTENSION\r
+ SETZM DEVFIL(DEVDAT) ;ZERO DEVFIL\r
+ HLRE TAC,TAC ;GET INDEX OF FILE\r
+ ADDI TAC,27\r
+ PUSHJ PDP,DLETE ;DELETE ALL BLOCKS OF FILE\r
+RENAM1: TLO IOS,CHNGDR ;DIRECTORY HAS CHANGED\r
+ AOS (PDP) ;SET FOR GOOD RETURN\r
+ JRST STOIOS ;GO TO USER\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
+ MOVE TAC,@UUO ;GET NEW NAME\r
+ MOVEM TAC,(DAT) ;SAVE IN DIR\r
+ AOS UUO\r
+ MOVE TAC,@UUO ;EXTENSION\r
+ HLLM TAC,26(DAT) ;SAVE IN DIR\r
+ HLLM TAC,DEVEXT(DEVDAT) ;SAVE INN DDB\r
+ JRST RENAM1 ;GIVE GOOD RETURN TO USER\r
+\r
+RENER1: POP PDP,UUO\r
+ TDZA TAC,TAC ;RH E+1 =0\r
+RENER2: MOVEI TAC,4 ;RH E+1 =4\r
+ AOS UUO ;POINT TO 2ND WORD\r
+ HRRM TAC,@UUO ;SET ERRORR CODE\r
+ POPJ PDP, ;AND TAKE ERROR RETURN\r
+\f;SEARCH DIRECTORY FOR A MATCH\r
+DSERCH: MOVEI AC1,3(UUO) ;CHECK VALIDITY OF ADDRESS\r
+ PUSHJ PDP,UADCK1 ;NEVER RETURN IF ADDR. OUT OF BOUNDS\r
+DSER1: PUSHJ PDP,DIRCHK ;ENSURE DIRECTORY IS IN CORE\r
+ HRRZ TAC,DLOC(DEVDAT) ;LOCAION OF DIRECTORY\r
+ ADD TAC,[XWD -26,NAMSTR] ;POINT TO START OF NAMES\r
+NMLOOK: SKIPN TAC1,@UUO ;GET NAME\r
+ JRST TPOPJ ;NULL ARGUMENT - ERROR RETURN \r
+ MOVEM TAC1,DEVFIL(DEVDAT) ;STORE FOR RENAME AND SUPERSEDING\r
+ ; SHARED SEGMENTS\r
+ CAMN TAC1,(TAC) ;TEST FOR MATCH\r
+ AOJA UUOI,NMFOUN ;FOUND NAME, CHECK EXTENSION\r
+ AOBJN TAC,.-2 ;TRY NEXT NAME\r
+ POPJ PDP, ;NOT FOUND\r
+NMFOUN: HLLZ TAC1,@UUO ;PICK UP USER'S EXTENSION\r
+ XOR TAC1,26(TAC) ;TEST AGAINST DIRECTORY EXTENSION\r
+ TLNN TAC1,-1 ;MATCH?\r
+ JRST CPOPJ1 ;YES. RETURN\r
+ AOBJP TAC,.+2\r
+ SOJA UUO,NMLOOK ;NO. TRY NEXT NAME\r
+ SOJA UUO,CPOPJ ;NAME NOT FOUND\r
+\r
+;CHECK IF DIRECTORY IS IN CORE, IF NOT, READ IT\r
+DIRCHK: TRNN IOS,UDSD ;DONT BOTHER IF NON-STANDARD\r
+ SKIPG DEVMOD(DEVDAT) ;IS IT IN?\r
+ POPJ PDP, ;YES. RETURN\r
+ MOVEI BLK,DIRBLK ;BLOCK NUMBER\r
+ TLZ IOS,IO\r
+ PUSHJ PDP,GETDT ;GET CONTROL\r
+ TLO IOS,RWDIR ;JUST READ 1 BLOCK\r
+ PUSHJ PDP,READBC ;GO READ IT\r
+ PUSHJ PDP,WAIT1 ;WAIT TILL IN\r
+ MOVSI TAC1,DVDIRI ;SET DIRECTORY-IN-CORE BIT\r
+ ORM TAC1,DEVMOD(DEVDAT)\r
+ POPJ PDP,\r
+\f;SEARCH DIRECTORY FOR FILE WHOSE INDEX IS IN TAC\r
+BLKSRC: MOVSI DAT,440500 ;DAT IS A BLOCK POINTER\r
+ HRR DAT,DLOC(DEVDAT)\r
+ MOVEI BLK,1 ;START AT BLOCK 1\r
+\r
+BLKSRA: ILDB TEM,DAT ;INDEX OF NEXT BLOCK\r
+ CAMN TAC,TEM ;MATCH?\r
+ JRST CPOPJ1 ;YES. RETURN\r
+\r
+BLKSRB: CAIGE BLK,TOPBLK ;NO. SEARCHED LAST?\r
+ AOJA BLK,BLKSRA ;NO. TRY NEXT BLOCK\r
+ POPJ PDP, ;YES. RETURN\r
+\r
+;SET UP POINTER TO DIRECTORY FOR BLOCK IN BLK\r
+SETPTR: PUSH PDP,BLK ;SAVE BLK\r
+ PUSHJ PDP,DRPTR ;SET BLK AS A BYTE POINTER\r
+ MOVE DAT,BLK ;RETURN IT IN DAT\r
+ POP PDP,BLK ;RESTORE BLK\r
+ POPJ PDP, ;AND RETURN\r
+\r
+;GET NEXT AVAILABLE FREE BLOCK\r
+NXTFRE: PUSH PDP,TEM \r
+ PUSHJ PDP,SETPTR ;SET DAT TO A BYTE POINTER\r
+ MOVEI TAC,0 ;LOOK FOR FREE BLOCKS\r
+ PUSHJ PDP,BLKSRA ;FIND A ZERO BLOCK\r
+ MOVEI BLK,0 ;NOT THERE- RETURN 0\r
+FREXIT: POP PDP,TEM\r
+ POPJ PDP,\r
+\r
+;GET PREVIOUS FREE BLOCK\r
+LSTFRE: MOVEI TAC,0\r
+ PUSH PDP,TEM\r
+ ADDI BLK,2\r
+ PUSHJ PDP,SETPTR ;SET DAT AS A POINTER\r
+ SUBI BLK,2\r
+ PUSHJ PDP,DECPTR ;DECREMENT BYTE POINTER\r
+ LDB TEM,DAT ;INDEX TO BLOCK\r
+ CAMN TEM,TAC ;FOUND?\r
+ JRST FREXIT ;YES. RETURN\r
+ SOJG BLK,.-4 ;TRY AGAIN IF NOT AT START\r
+ JRST FREXIT ;REACHED START - RETURN BLK=0\r
+\r
+;DECREMENT BYTE POINTER\r
+DECPTR: JUMPL DAT,.+5\r
+ ADD DAT,[BYTE (6) 5] ;DECREMENT\r
+ JUMPG DAT,CPOPJ ;IF POSITIVE - SAME WORD\r
+ HRLI DAT,010500 ;RESET TO PREVIOS WORD\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
+ JRST CPOPJ ;ALL THROUGH\r
+ DPB TAC1,DAT ;DELETE IT\r
+ SOS 1(PDP) ;ADJUST PDL FOR RETURN\r
+ AOBJN PDP,BLKSRB ;AND FIND NEXT MATCH\r
+\r
+\r
+;ENTER A FILE NAME IN DIRECTORY\r
+ENTR: TRNE IOS,UDSD ;NON STANDARD?\r
+ JRST CPOPJ1 ;YES. RETURN\r
+ PUSHJ PDP,DSERCH ;NO. LOOK FOR MATCH\r
+ JRST NEWNT ;THIS IS A NEW ENTRY\r
+ENTR2: MOVE TAC1,@UUO ;PICK UP 2ND WORD (EXTENSSION)\r
+ AOS UUO ;POINT TO WORD 3\r
+ HRR TAC1,@UUO ;ADD DATE\r
+ TRNN TAC1,7777 ;IS DATE ALREADY THERE?\r
+ IOR TAC1,THSDAT ;NO, ADD CURRENT DATE\r
+ MOVEM TAC1,26(TAC) ;INTO DIRECTORY\r
+ SKIPGE AC3,OBLK(DEVDAT) ;IS THIS A SAVE FILE (UGETF DONE\r
+ ;BEFORE THE ENTER?)\r
+ AOJA UUO,SETWD4 ;YES. STORE LENGTH IN DIRECTORY\r
+ENTRA: SUBI UUO,2 ;NO. POINT TO NAME\r
+ MOVE TAC1,@UUO ;PICK IT UP\r
+ MOVEM TAC1,(TAC) ;INTO DIRECTORY\r
+ HLRE TAC,TAC ;COMPUTE INDEX OF FILE\r
+ ADDI TAC,27\r
+ HLRZ DAT,IBLK(DEVDAT) ;INDEX OF INPUT FILE\r
+ SUB DAT,TAC ;WRITE SAME FILE AS READING?\r
+ JUMPE DAT,CPOPJ ;TAKE ERROR RETURN IF YES\r
+ HRLM TAC,OBLK(DEVDAT) ;SAVE INDEX IN DDB\r
+\r
+ PUSHJ PDP,DLETE ;DELETE ALL BLOCKS BELONGING TO FILE\r
+ AOJE AC3,FNTRD ;FIND FIRST FREE BLOCK ON TAPE IF THIS\r
+ ;IS A SAVE FILE (UGETF DONE)\r
+ MOVEI BLK,DIRBLK ;NO. GET 1ST BLOCK CLOSE TO\r
+ TLO IOS,RVERSE ;DIRECTORY. GOING IN REVERSE\r
+ POPJ PDP,USLSTA\r
+ CAILE BLK,TOPBLK ;BLOCK LEGAL?\r
+ POPJ PDP, ;NO. ERROR RETURN\r
+ENTRC: MOVEM BLK,FSTBLK(DEVDAT) ;SAVE AS 1ST BLOCK\r
+ HRRM BLK,OBLK(DEVDAT) ;SAVE IN DDB\r
+ AOS UUO ;POINT UUO TO WORD 2\r
+ HRRM BLK,@UUO ;SAVE 1ST BLOCK IN USER'S AREA\r
+ HLL TAC,@UUO ;GET EXTENSION\r
+ HLLM TAC,DEVEXT(DEVDAT) ;SAVE EXTENSION IN DDB ALSO\r
+ TLO IOS,NOLINK\r
+ AOS (PDP)\r
+\f;MARK DIRECTORY ENTRY POINTED TO BY BLK AS TAKEN\r
+MARKDR: PUSHJ PDP,DRPTR ;SET POINTER TO BLOCK IN DIR\r
+ HLRZ TAC,OBLK(DEVDAT) ;PICK UP INDEX\r
+ IDPB TAC,BLK ;MARK DIRECTORY\r
+ TLO IOS,CHNGDR ;DIRECTORY HAS CHANGED\r
+ JRST STOIOS\r
+\r
+;;SET POINTER TO CORRECT DIRECTORY ENTRY\r
+DRPTR: SUBI BLK,1 ;SET FOR ILDB OR IDPB\r
+ IDIVI BLK,7 ;COMPUTE WORD, POSITION\r
+ ADD BLK,OLOC(DEVDAT) ;GET CORRECT ADDRESS\r
+ HRLI BLK,440500 ;MAKE IT A BYTE POINTER\r
+ JUMPE DAT,CPOPJ ;CORRECT FOR POSITION IN WORD\r
+ IBP BLK\r
+ SOJG DAT,.-1\r
+ POPJ PDP,\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
+;SET UP LENGTH OF FILE IN DIRECTORY FOR A SAVE FILE\r
+SETWD4: HLRE TAC1,@UUO ;GET -LENGTH\r
+ MOVNS TAC1 ;+LENGTH\r
+ HRRE TEM,@UUO\r
+ ADD TAC1,TEM ; +START ADDRESS\r
+ TRZ TAC1,1777 ;STORE N-1, WHERE N IS NO OF K\r
+ LSH TAC1,2\r
+ ORM TAC1,26(TAC) ;INTO 2ND WRD OF DIRECTORY\r
+ SOJA UUO,ENTRA ;CONTINUE WITH ENTER\r
+\r
+ENTRD: MOVEI TAC,0 ;GET THE 1ST FREE BLOCK ON TAPE\r
+ PUSHJ PDP,BLKSRC ;AS THE 1ST LOGICAL BLOCK OF THE FILE\r
+ POPJ PDP, ;NONE AVAILABLE\r
+ JRST ENTRC ;CONTINUE WITH ENTER\r
+\f;USETI - SET NEXT INPUT BLOCK TO READ\r
+SETI: TDZ IOS,[XWD IOEND,IODEND]\r
+ SKIPA DAT,DEVDAT\r
+\r
+;USETO - SET NEXT OUTPUT BLOCK TO READ\r
+SETO: MOVEI DAT,1(DEVDAT)\r
+ PUSHJ PDP,WAIT1 ;WAIT FOR BUFFERES TO FILL (OR EMPTY)\r
+ HRRM UUO,IBLK(DAT) ;SET BLOCK NUMBER\r
+ JRST STOIOS ;STOE IOS, POPJ\r
+\r
+;UGETF - GET NEXT FREE BLOCK FOR THIS FILE\r
+GETF: PUSHJ PDP,WAIT1 ;WAIT TILL BUFFERES EMPTY\r
+ PUSHJ PDP,DIRCHK ;ENSURE DIR, IN CORE\r
+ PUSHJ PDP,USRFRE ;GET NEXT AVAILABLE BLOCK\r
+ SKIPN OBLK(DEVDAT) ;HAS AN ENTER OR LOOKUP BEEN DONE?\r
+ SETOB BLK,OBLK(DEVDAT) ;NO, SET SWITCH SO THAT THE NEXT ENTER\r
+ ;WILL FINE FIRST FREE BLOCK ON TAPE\r
+ MOVE TAC,BLK ;TELL USER THE BLOCK NUMBER\r
+ JRST STOTAC\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
+ CAIL BLK,SD ;OR ONE OF DUMP MODES?\r
+ MOVEI TEM,2 ;YES, WHICH ARE CLOSRER\r
+USRFRA: HRRZ BLK,OBLK(DEVDAT) ;CURRENT BLOCK\r
+ TLNE IOS,RVERSE ;FORWARD?\r
+ JRST USRLST ;NO\r
+ ADDI BLK,(TEM) ;YES, FIND NEXT BLOCK AT LEAST N\r
+ CAILE BLK,TOPBLK\r
+ TDZA BLK,BLK\r
+CALNXT: PUSHJ PDP,NXTFRE ;BLOCKS PAST THIS ONE\r
+ JUMPN BLK,STOIOS ;RETURN IF FOUND\r
+ TLOE TEM,1 ;FOUND NONE ON THIS PASS\r
+ JRST NOBLKS ;TAPE IS FULL\r
+ TLC IOS,RVERSE ;REVERSE DIRECTION\r
+ HRRI TEM,1 ;START LOOKING AT NEXT BLOCK IN OTHER DIRECTION\r
+ JRST USRFRA\r
+USRLST: SUBI BLK,(TEM) ;LOOK FOR FREE BLOCK N BEFORE\r
+ SKIPG BLK\r
+ TDZA BLK,BLK ;REVERSE IF AT FRONT OF TAPE\r
+USLSTA: PUSHJ PDP,LSTFRE ;THIS ONE\r
+ JRST CALNXT+1\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
+\f;UTPCLR UUO\r
+UTPCLR: TRNE IOS,UDSD\r
+ POPJ PDP, ;FORGET IT FOR NON-STANDARD\r
+ MOVSI TAC,DVDIRIN ;SET DIRECTORY-IN-CORE BIT\r
+ ORM TAC,DEVMOD(DEVDAT)\r
+ TLO IOS,CHNGDR ;DIRECTORY HAS CHANGED\r
+ HRRZ TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY\r
+ HRL TAC1,TAC\r
+ HRRI TAC1,1(TAC) ;BLT POINTER\r
+ SETZM (TAC)\r
+ BLT TAC1,176(TAC) ;LEAVE LAST WORD IN DIR, ALONE\r
+ MOVSI TAC1,17000 ;MARK DIRECTORY AS UNAVAILABLE\r
+ MOVEM TAC1,16(TAC)\r
+ MOVSI TAC1,757000 ;RESERVE BLOCKS 1 AND 2\r
+ MOVEM TAC1,(TAC) ;FOR READ IN MODE LOADER\r
+ MOVSI TAC1,777770 ;MARK BLOCKS 1102-1105 AS\r
+ ORCAM TAC1,NAMSTR-1(TAC) ;UNAVAILABLE ALSO\r
+ JRST STOIOS\r
+\f;CLOSE UUO\r
+UCLS: TLZE IOS,NOLINK ;IS LAST BLOCK NOT LINKED?\r
+ TRNE IOS,UDSD ;AND NOT NON-STD?\r
+ JRST STOIOS ;YES, RETURN\r
+ LDB TAC,PIOMOD ;NO. WRITE LAST BLOCK\r
+ CAIL TAC,16 ;DUMPO MODE?\r
+ JRST CLSDMP ;YES. CLOSE DUMP MODE\r
+ MOVEI TAC,@DEVOAD(DEVDAT) ;LOC OF BUFFER\r
+ MOVE TAC1,1(TAC) ;LINK WORD\r
+ TLON TAC1,-1 ;LINK=-1 IF NOT SPECIFIED\r
+ MOVEM TAC1,1(TAC) ;LINK = -1... EOF\r
+ MOVEM IOS,DEVIOS(DEVDAT) ;SAVE IOS\r
+ JRST OUT ;GO TO WRITE RECORD\r
+\r
+;HERE TO CLOSE A DUMP MODE FILE\r
+CLSDMP: TLO IOS,DMPOCLS+IO+DMPMOD ;SET SWITCHES\r
+ PUSHJ PDP,GETDT ;GET CONTROL\r
+ SETZM BUF ;ENSURE ZERO LINK,WORDCOUNT\r
+ SETZM BUF+1 ;MAKE SURE 0, SO CAN GET WITH 3 SERIES MON.\r
+ ;FILES SAVED WITH 4 SERIES MONITOR.\r
+ JRST OUFULL ;GO WRITE THE BLOCK\r
+\f;RELEASE UUO\r
+UREL: PUSHJ PDP,WAIT1 ;MAKE SURE THE TAPE IS STOPPED\r
+ PUSHJ PDP,NXTCM2 ;CLEAR OUT DUMP-MODE STUFF\r
+ MOVSI TAC,DVDIRIN ;IF NONSTANDARD, WILL CLEAR\r
+ TRZE IOS,UDSD ;CLEAR NON-STANDARD BIT.\r
+ ANDCAM TAC,DEVMOD(DEVDAT) ;SO DIRECTORY WILL BE READ ANEW\r
+ SKIPG DEVMOD(DEVDAT) ;IF DIRECTORY HAS BEEN\r
+ TLZN IOS,CHNGDR ;MODIFIED IT MUST BE WRITTEN\r
+ JRST UREL2 ;IT HASN'T BEEN CHANGED\r
+ TLO IOS,IO\r
+ PUSHJ PDP,GETDT ;WAIT TILL DTC AVAILABLE\r
+ TLO IOS,RWDIR ;GOING TO WRITE DIRECTORY\r
+ MOVEI BLK,DIRBLK ;BLOCK NUMBER\r
+ PUSHJ PDP,WRTBLK ;WRITE UT\r
+ PUSHJ PDP,WAIT1 ;WAIT TILL IT HAS BEEN WRITTEN\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
+;INTERRUPT LEVEL AFTER THE RELEASE, BUT HNGSTP CAN CAUSE THESE ACTIONS\r
+;NEVER TO OCCUR, SO MAKE SURE THEY REALLY HAPPENED\r
+ TLZ IOS,77600 ;ZERO IOS BITS\r
+ SETZM OBLK(DEVDAT) ;AND OBLK\r
+ SETZM IBLK(DEVDAT) ;ZERO IBLK SO WRITING A FILE AFTER READING\r
+ ;IT WILL WORK (CHECK IS MADE AT ENTER)\r
+ SETZM FSTBLK(DEVDAT)\r
+ JRST STOIOS ;STORE IOS AND RETURN\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
+GETDT: TLNE IOS,REWBIT ;IF TAPE IS REWINDING NOW\r
+ JRST GETDT0 ;WAIT TILL THRU BEFORE CONTINUING\r
+GETDT1: AOSE DTREQ ;CAN I HAVE IT\r
+ PUSHJ PDP,DTWAIT ;NO. COME BACK LATER\r
+ LDB TAC,PUNIT ;HAVE CONTROL NOW\r
+ LSH TAC,11 ;CONNECT TO DTA\r
+ CONO DTC,30000(TAC) ;SEE IF TAPE IS OK\r
+ CONSZ DTS,100 ;SELECT ERROR?\r
+ JRST QUEST ;YES. COMPLAIN\r
+ TLNE IOS,IO ;NO. TRYING TO WRITE TAPE?\r
+ CONSO DTS,4000 ;YES. WRITE PROTECTED?\r
+ SKIPA TAC,QUANTL ;NO. EVERYTHING IS OK\r
+ JRST QUEST ;YES. COMPLAIN\r
+ HRRZM TAC,QUANTM ;SFT UP NUMBER OF BLOCK TO KEEP CONTROL FOR\r
+ CONO DTC,10000 ;DESELECT CONTROL SO FNDBLK TEST\r
+ ;WILL WORK RIGHT (CONCO DTC,20000)\r
+ MOVEM DEVDAT,USEWRD ;SAVE ACS NEEDED ON INTERRUPT LEVEL\r
+ JRST SETACT ;LIGHT IOACT AND RETURN\r
+\r
+;COME HERE TO COMPLAIN ABOUT UNIT NOT RIGHT (SELECT OR PROTECT ERROR)\r
+QUEST: PUSHJ PDP,THRUTD ;GIVE UP CONTROL\r
+ PUSHJ PDP,HNGSTP ;TYPE "DTAN OK?"\r
+ ;NOTE -- AC BLK (=ITEM) USED TO BE\r
+ ; PUSHED HERE, BUT IS NOT ANY LONGER\r
+ ; BECAUSE HNGSTP NOW PRESERVES IT,\r
+ ; AND THE STACK IS VERY FULL.\r
+ JRST GETDT1 ;GET CONTROL AGAIN AND RETRY\r
+\f EXTERN JOBDDT,USRDDT\r
+;DUMP MODE INPUT\r
+DMPI: IFN CPBIT, <\r
+ HRRZ AC2,IBLK(DEVDAT)\r
+>\r
+ TLZ IOS,IO\r
+ PUSHJ PDP,DMPSET ;SET UP DUMP-MODE STUFF\r
+ JRST ZERCOR ;ZER USER'S CORE IF SAVE-MODE\r
+\r
+\r
+;INPUT UUO\r
+UIN: TLZ IOS,IO\r
+ HRRZ BLK,IBLK(DEVDAT) ;BLOCK TO READ\r
+ PUSHJ PDP,STOIOS\r
+ TRNE IOS,UDSD ;NON STANDAR?\r
+ JRST READBF\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
+;READING DIRECTORY - GIVE CORE IMAGE IF IT EXISTS\r
+ PUSHJ PDP,DIRCHK ;READ IT IF IT ISN'T IN ALREADY\r
+ HRL TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY\r
+ MOVEI TAC1,@DEVIAD(DEVDAT) ;WHERE USER WANTS IT\r
+ HRRI TAC,1(TAC1) ;LOC OF DATA\r
+ BLT TAC,200(TAC1) ;GIVE IT TO HIM\r
+ PUSHJ PDP,ADVBFF ;ADVANCE BUFFERS\r
+ JFCL\r
+ POPJ PDP,\r
+\f;CHECK VALIDITY OF BLOCK NUMBER\r
+BLKCHK: CAIG BLK,TOPBLK ;LEGAL?\r
+ POPJ PDP, ;YES. RETURN\r
+ POP PDP,TAC\r
+ TROA IOS,IOBKTL ;NO. LIGHT ERROR BIT\r
+\r
+;INPUT BLOCK = 0 - END OF FILE\r
+EOF: TLO IOS,IOEND ;LIGHT EOF BIT\r
+ TLNN IOS,DMPMOD\r
+ JRST STOIOS\r
+ JRST DMPEOF ;GIVE UP CONTROL IF DUMP-MODE\r
+\r
+;ZERO USER'S CORE ON SAVE-MODE INPUT\r
+ZERCOR: MOVEI TAC,JOBDDT(PROG) ;ZERO CORE\r
+ HRLI TAC,1(TAC)\r
+ MOVSS TAC ;BLT POINTER\r
+ HRRZ TAC1,DMPLST(DEVDAT) ;TOP CELL TO ZERO (-175)\r
+ ADDI TAC1,(PROG) ;RELOCATE TO USER AREA\r
+ SETZM -1(TAC) ;ZERO\r
+ BLT TAC,(TAC1)\r
+ SETZM USRDDT ;DDT IS KEPT IN PROTECTED PART\r
+ JRST UIN\r
+\f;DUMP MODE OUTPUT\r
+DMPO: PUSHJ PDP,DIRCHK ;MAKE SURE DIRECTORY IS IN CORE\r
+ IFN CPBIT, <\r
+ HRRZ AC2,OBLK(DEVDAT)\r
+>\r
+ TLO IOS,IO\r
+ PUSHJ PDP,DMPSET ;SET DUMPO-MODE POINTERS\r
+ JFCL\r
+\r
+;OUTPUT UUO\r
+UOUT: TLO IOS,IO\r
+ TRNE IOS,UDSD ;NON STANDARD?\r
+ JRST UOUT2 ;YES\r
+ PUSHJ PDP,DIRCHK ;NO. MAKE SURE DIRECTORY IS IN CORE\r
+ TLO IOS,IO ;IF DIRCHK READ, IO WENT OFF\r
+ HRRZ BLK,OBLK(DEVDAT)\r
+ CAIN BLK,DIRBLKK ;CHECK IF WRITING DIRECTORY\r
+ JRST COR2HM ;YES, WRITE CORE IMAGE\r
+ JUMPE BLK,FAKAV ;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
+FILBUF:\r
+DTOCHK: TLNE IOS,DMPMOD ;DUMP MODE?\r
+ JRST DMPFIL ;YES, FILL BUFFER FROM LIST\r
+ MOVSI TAC,@DEVOAD(DEVDAT) ;LOCATION OF BUFFER\r
+ ADD TAC,[XWD 1,BUF];SET TO STORE IN MONITOR BUFFER\r
+ BLT TAC,BUF+177 ;GO BLT IT\r
+ TLZ IOS,NOLINK\r
+\fOUFULL: TRNE IOS,UDSD ;NON-STANDARD?\r
+ JRST OUTBL2 ;YES, NO FILE-STRUCTURED OPERATIONS\r
+ HLRE BLK,BUF ;IS IT?\r
+ JUMPL BLK,LSTBLK ;YES, - LAST BLOCK OF FILE\r
+ JUMPN BLK,OUTBLK ;IF NON-0 - YES\r
+ TLNE IOS,DMPCLS ;NO. LAST BLOCK OF A DUMPO FILE?\r
+ ;DMPCLS WILL BE TURNED OFF AT THE INTERRUPT\r
+ JRST OUTBLK ;YES. LINK MUST STAY 0\r
+OUCOMP: PUSHJ PDP,USRFRE ;COMPUTE NEXT BLOCK\r
+ TLO IOS,NOLINK ;THIS BLOCK NOT LINKED\r
+OUTBLK: HRLM BLK,BUF ;SAVE LINK IN 1ST WORD OF BLOCK\r
+ MOVE TEM,FSTBLK(DEVDAT) ;STORE 1ST BLOCK OF FILE IN WORD\r
+ DPB TEM,[POINT 10,BUF,27]\r
+ HRRZ TEM,OBLK(DEVDAT) ;BLOCK TO WRITE NOW\r
+ HRRM BLK,OBLK(DEVDAT) ;BLOCK TO WRITE NEXT\r
+ MOVE BLK,TEM\r
+ PUSHJ PDP,BLKCHK ;CHECK LEGALITY OF BLOCK\r
+ PUSHJ PDP,MARKDR ;MARK BLOCK TAKEN IN DIRECTORY\r
+ SKIPA BLK,TEM\r
+OUTBL2: HRRZ BLK,OBLK(DEVDAT)\r
+ PUSHJ PDP,STOIOS\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
+\f;WRITE LAST BLOCK\r
+LSTBLK: MOVEI BLK,0 ;LINK=0\r
+ JRST OUTBLK ;GO WRITE LAST BLOCK\r
+\r
+;TRYING TO WRITE DIRECTORY - STORE IN CORE\r
+COR2HM: MOVEI TAC,@DEVOAD(DEVDAT) ;WHERE IT IS\r
+ HRLI TAC,1(TAC) \r
+ HRR TAC,DLOC(DEVDAT) ;WHERE TO PUT IT\r
+ MOVEI TAC1,177(TAC)\r
+ BLT TAC,(TAC1)\r
+ TLO IOS,CHNGDR ;REMEMBER TO WRITE IT OUT\r
+ MOVSI TAC1,DVDIRI\r
+ ORM TAC1,DEVMOD(DEVDAT) ;DIR. IS NOW IN CORE\r
+FAKADV: TLZE IOS,DMPMOD ;DUMP MODE?\r
+ JRST THRUTD ;YES. GIVE UP CONTROL\r
+ PUSHJ PDP,ADVBFE ;ADVANCE BUFFERS\r
+ JFCL\r
+ TLZ IOS,NOLINK ;DIRECTORY BLOCK IS NOT LINKED\r
+ SETZM OBLK(DEVDAT)\r
+ JRST STOIOS\r
+\f;SET UP POINTERS AND STUFF FOR DUMP-MODE\r
+DMPSET: PUSHJ PDP,GETDT ;GET CONTROL\r
+ TLO IOS,DMPMOD ;LIGHT BIT\r
+ PUSHJ PDP,COMCHK ;CHECK VALIDITY OF LIST\r
+ JRST SVADER ;NG. GIVE ADRESS ERROR\r
+ SKIPL TAC,@UUO ;OK. NULL LIST?\r
+ JRST DMPTS1 ;YES. RETURN\r
+ IFN CPBIT, <\r
+ TRNE IOS,UDSD ;NO. NON-STD MODE?\r
+ SOJA DAT,TDUSER ;YES. GO ELSEWHERE\r
+>\r
+DMPST2: SOS UUO ;NO. SAVE START OF LIST (-1)\r
+ MOVEM UUO,DMPLST(DEVDAT)\r
+ JRST CPOPJ1\r
+\r
+DMPTS1: POP PDP,TAC\r
+ JRST THRUTD\r
+\r
+ IFN CPBIT, <\r
+;HERE TO START DUMP-MODE INTO USER AREA DIRECTLY\r
+TOUSRF: JUMPE AC2,NOBLK0 ;CANT READ BLK 0 IN NON-STD DUMP MODE\r
+ ASH DAT,-7 ;NUMBER OF WRDS IN LIST /200\r
+ AOS DAT\r
+ MOVEM DAT,BLKCNT ;SAVE TO UPDATE POSITION\r
+ MOVEI UUO,@UUO ;REAL ADDRESS OF LIST\r
+TOUSR1: MOVEM UUO,USPNTR ;SAVE IT\r
+ MOVEM UUO,SVPNTR\r
+ ADDI TAC,(PROG) ;RELOCATE ADDRESS OF 1ST IOWD\r
+ MOVEM TAC,PNTR ;AND SAVE IT\r
+ MOVE TAC,[JSP DMPADV] ;SET UP LOC FOR WHEN\r
+ MOVEM TAC,DTALC2 ;IOWD IS EXHAUSTED\r
+ HRRZM PROG,ADRPRG ;SAVE JUST ADDRESS OF PROG\r
+ TLO IOS,NOBUF ;INDICATE DIRECTLY TO USER\r
+ TLNN IOS,IO\r
+ JRST CPOPJ1 ;READING - CONTINUE\r
+ POP PDP,TAC ;WRITING - THIS WILL SAVE LOTS OF TIME\r
+ JRST OUTBL2\r
+\r
+NOBLK0: TRO IOS,IOIMPM\r
+ POP PDP,TAC ;RETURN TO UUOCON WITH ERROR BIT SET\r
+ JRST THRUTD\r
+>\r
+\f;FILL OUTPUT BUFFER FROM LIST\r
+DMPFIL: MOVSI TAC1,-177\r
+ IFE CPBIT, <\r
+ TRNE IOS,UDSD\r
+ SUB TAC1,ONEONE ;200 DATA WORDS IF NON-STANDARD\r
+>\r
+DMPFLB: PUSHJ PDP,NXTCOM ;GET NEXT COMMAND\r
+ JRST DMPOTH ;END OF LIST\r
+DMPLFA: MOVE TEM,(TAC) ;GET NEXT WORD\r
+ MOVEM TEM,BUF+1(TAC1) ;INTO BUFFER\r
+ AOBJP TAC1,DMPOVR ;BUFFER FULL IF GOES\r
+ AOBJN TAC,.-3 ;GET NEXT WORD FROM COMMAND\r
+ JRST DMPFLB ;GET NEXT COMMAND\r
+\r
+DMPOTH:\r
+ IFE CPBIT, <\r
+ TRNN IOS,UDSD\r
+>\r
+ HRRZM TAC1,BUF ;LIST RAN OUT SAVE WORD COUNT\r
+ SETZM BUF+1(TAC1) ;ZERO REST OF BUFFER\r
+ HRRZI TAC1,BUF+2(TAC1)\r
+ CAILE TAC1,BUF+177 ;JUST ZERO 1 WORD IF AT TOP\r
+ JRST OUFULL\r
+ HRLI TAC1,-1(TAC1)\r
+ BLT TAC1,BUF+177 ;****TEST IF TOP OF BUFFER\r
+ JRST OUFULL ;NOW WRITE BUFFER\r
+\r
+;BUFFER FULL BEFORE END OF COMMAND\r
+DMPOVR: AOBJN TAC,.+3 ;WAS THAT LAST WORD OF COMMAND?\r
+ PUSHJ PDP,NXTCOM ;YES. GET NEXT\r
+ MOVEI TAC,0\r
+ MOVEM TAC,SVDWRD(DEVDAT) ;NO. SAVE REMAINDER OF COMMAND\r
+DMPOVA: MOVEI TAC,177\r
+ IFE CPBIT, <\r
+ TRNN IOS,UDSD\r
+>\r
+ MOVEM TAC,BUF ;WD CNT =177\r
+ JRST OUFULL ;GO WRITE PART OF STUFF\r
+\r
+;GET NEXT COMMAND FROM LIST\r
+NXTCOM: SKIPN DMPLST(DEVDAT) ;END OF COMMANDS?\r
+ JRST NXTCM2 ;YES. RETURN\r
+ AOSA TAC,DMPLST(DEVDAT) ;GET NEXT COMMAND\r
+NXTCM1: HRRM TAC,DMPLST(DEVDAT) ;STORE GO-TO ADDRESS\r
+ MOVE TAC,@TAC ;GET COMMAND\r
+ JUMPE TAC,NXTCM2 ;END OF LIST\r
+ JUMPG TAX,NXTCM1 ;GO-TO WORD\r
+ ADDI TAC,(PROG) ;REAL COMMAND - ADD RELOCATION\r
+ AOJA TAC,CPOPJ1 ;AND RETURN\r
+\f;END OF DUMP-MODE LIST\r
+NXTCM2: SETZM SVDWRD(DEVDAT) ;ZERO POINTERS\r
+ SETZM DMPLST(DEVDAT)\r
+ POPJ PDP,\r
+\r
+DMPFLC: SKIPE TAC,SVDWRD(DEVDAT) ;IS THERE ANOTHER COMMAND\r
+ JRST DMPFLA ;YES. GET IT\r
+ JRST DMPTH2 ;NO. THROUGH\r
+\fDTC=320\r
+DTS=324\r
+\r
+;IO INTERFACE\r
+READBF: TLNN IOS,DMPMOD ;HAVE CONTROL IF DUMP-MODE\r
+ ; UNLESS ON A LOOKUP, IN WHICH\r
+ ; CASE ALWAYS GET DT CONTROL\r
+RDBLUK: PUSHJ PDP,GETDT ;GET DT CONTROL\r
+\r
+READBC: PUSHJ PDP,FNDBLK ;SEARCH FOR RIGHT BLOCK\r
+ MOVE TAC1,[BLKI DTC,300] ;FOUND IT - START READING\r
+\r
+;HERE WITH BLK=BLOCK NUMBER, TAC1=FUNCTION, START SEARCH\r
+RDWRT: HLLM TAC1,IOWD ;BLKI OR BLKO\r
+ HRLI TAC,-200\r
+ TLNN IOS,RWDIR ;WRITING (READING) DIRECT?\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
+IOGO: MOVEM TEM,DTALOC ;SET UP INTERRUPT LOCATION\r
+ IFN CPBIT, <\r
+ TLNE IOS,NOBUF ;IF DIRECTLY TO USER\r
+ JRST IOGO2 ;DTALC2, PNTR ALREADY SET UP\r
+>\r
+ MOVEM TAC,PNTR ;POINTER\r
+ MOVE TAC,[JSR DTATHR] ;SET UP INTERRUPT LOC+1\r
+ MOVEM TAC,DTALC2\r
+IOGO2: CONO DTC,DTBOTH(TAC1) ;START READ OR WRITE\r
+ CONO DTS,770000 ;ENABLE FOR ALL INTERRUPTS\r
+ POPJ PDP, ;DISMISS INTERRUPT\r
+\f;HERE IF TAPE IS GOING IN REVERSE WHEN BLOCK NUMBER FOUND\r
+IORVRS: ADDI TAC,176 ;START AT TOP OF BUFFER\r
+ MOVE TEM,[JSR RVERS]\r
+ JRST TOGO ;COMPILCATED STUFF FOR EACH WORD\r
+\r
+;HERE FOR AY DATA WORD WITH TAPE IN REVERSE\r
+RVERS: 0\r
+IOWD: BLKI DTC,PNTR ;READ (WRITE) A WORD\r
+ ; NOTE -- THIS LOCATION IS IMPURE.\r
+ ; MODIFIED TO A BLKI OR BLKO.\r
+ JRST RVTHRU ;POINTER RAN OUT\r
+ SOS PNTR ;POINTER HAS TO BACK UP\r
+ SOS PNTR\r
+ JEN @RVERS ;DISMISS THE INTERRUPT\r
+\r
+;HERE WHEN POINTER RUNS OUT IN REVERSE\r
+RVTHRU: CONO DTS,770001 ;FUNCTION STOP\r
+ JEN @RVERS ;DISMISS\r
+\r
+;HERE WHEN POINTER RUNS OUT FORWARD\r
+DTATHR: 0\r
+ CONO DTS,770001 ;FUNCTION STOP\r
+ JEN @DTATHR ;DISMISS\r
+\f;HERE TO PERFORM A REWIND MTAPE FOR DTA\r
+MTAP0: PUSHJ PDP,GETDT ;GET THE CONTROL FOR THE TAPE\r
+ LSH TAC1,15 ;TAC1=0 FOR REQ; 10 FOR REW UNLD\r
+ TDZ IOS,[XWD IO,IOACT] ;SET UP IOS\r
+ TLO IOS,REWBIT+RVERSE(TAC1)\r
+ MOVEI BLK,0 ;SEARCH FOR BLOCK 0\r
+ PUSHJ PDP,FNDBLK ;GO FIND BLOCK\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
+ CONO DTS,770001 ;NO, THROUGH WITH TAPE. - FNCTN STOP\r
+ POPJ PDP, ;DISMISS INTERRUPT\r
+ MOVE TAC,RUNWD ;USE THE CLOCK TO DESELECT THE TAPE\r
+ JSR CLKREQ ;FOR A WHILE - IT WILL GO OFF THE END\r
+ CONO DTC,410000 ;DESELECT THE TAPE SO IT CAN GO OFF\r
+ POPJ PDP, ;DISMISS THE INTERRUPT\r
+RUNWD: XWD RUNCLK,200\r
+\r
+;COME HERE ON THE CLOCK LEVEL FOR REWIND AND UNLOAD\r
+RUNCLK: MOVE DEVDAT,USEWRD\r
+ LDB TAC,PUNIT ;GIVE CONO TO READ BLOCK NOS IN FORWARD\r
+ LSH TAC,11 ;DIRECTION - THIS WILL CAUSE FULL REEL\r
+ CONO DTC,230200(TAC);TO STOP FLAPPING WHEN CONO STOP IS DONE\r
+ MOVE IOS,DEVIOS(DEVDAT) ;RESET IOS\r
+ JRST REWDUN ;DECREASE DTREQ. STOP TAP\r
+\r
+;HERE TO PUT C(TAC) IN THE CLOCK QUEUE\r
+CLKREQ: 0\r
+ CONO PI,PIOFF ;TURN OFF PI\r
+ IDPB TAC,CLOCK\r
+ CONO PI,PION\r
+ JRST @CLKREQ\r
+\f EXTERN JOB\r
+ EXTERN HNGSTP\r
+;COME HERE TO START READING BLOCK NUMBERS\r
+FNDBLK: HRRZM BLK,BLOCK ;BLOCK WE'RE LOOKING FOR\r
+ POP PDP,DISPAD(DEVDAT) ;WHERE TO GO WHEN RIGHT BLOCK FOUND\r
+ SETZM ERRCNT\r
+FNDBL2: LDB TAC,PUNIT ;GET UNIT NUMBER\r
+ LSH TAC,11 ;POSITION IT\r
+ CONSZ DTC,20000 ;TAPE SELECTED?\r
+ JRST FNDBL4 ;YES\r
+ TRO TAC,230000 ;NO, SET TO SELECT TAPE FORWARD\r
+ TLNE IOS,RVERSE+NOBUF ;REVERSE OR DIRECT TO USER?\r
+ TRC TAC,300000 ;YES. SET FOR REVERSE\r
+FNDBL3: TRO TAC,DTBOTH ;ADD PI ASSIGNMENT\r
+ MOVE TEM,[JSR SRCH] ;SET UP PI LOCS FOR SEARCH\r
+ MOVEM TEM,DTALOC ;INTO PI INTERRUPTCELL\r
+ CONO DTC,200(TAC) ;START SEARCHING BLOCKS\r
+ CONO DTS,670000 ;ENABLE FOR ALL BUT JOB DONE\r
+ SETOM IOWRIT ;SET SWITCH NON - 0 IF USING\r
+ TLNN IOS,RWDIR ;MONITOR BUFFER FOR OUTPUT\r
+ TLNN IOS,IO ;SO REKON WONT GIVE CONTROL (AND\r
+ SETZM IOWRIT ;BUFFER) AWAY\r
+ TLZ IOS,RECKON+IOFST ;TURN OFF DEAD-RECKON BIT\r
+ MOVEM DEVDAT,USEWRD\r
+ PUSHJ PDP,STOIOS ;SAVE IOS\r
+ IFN CPBIT, <\r
+ TLZ IOS,NOBUFC ;SET WORD NON-ZERO IF NOBUF ON\r
+ HLRZM IOS,DIRCTN\r
+>\r
+ POPJ PDP, ;AND LEAVE\r
+\r
+FNDBL4: CONSZ DTC,200000 ;DIRECTION TEST\r
+ TROA TAC,200000 ;FORWARD\r
+ TRO TAC,100000 ;REVERSE\r
+ JRST FNDBL3 ;START SEARCH\r
+\f;INTERRUPT HERE TO READ A BLOCK NUMBER\r
+SRCH: 0 \r
+ MOVEM TAC,TEMP ;SAVE WORKING AC\r
+ CONI DTS,TAC ;GET STATUS BITS\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
+ JRST SRCHB ;NO. SET ERROR SWITCH\r
+ SUB TAC,BLOCK ;NOW-WANTED\r
+ IFN CPBIT, <\r
+ SKIPE DIRCTN ;MUST BE GOING FORWARD IF DUMP-MODE\r
+ JRST SRCHC ;DIRECTLY TO USER\r
+>\r
+ JUMPE TAC,FOUND ;=0 IF WE'RE THERE\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
+ MOVMS TAC\r
+ CAILE TAC,MINDIS ;WORTH WHILE TO DISCONNECT TAPE?\r
+ JRST BEKON ;YES. GO DISCONNECT\r
+ SKIPLE DISCON ;NO. IS THERE A DISCON. TAPE\r
+ ;WHICH HAS TIMED OUT?\r
+ CAIG TAC,2 ;YES. WILL THIS SEARCH TAKE LONG?\r
+ SKIPA ;NO\r
+ CONO DTS,670002 ;YES. STOP DISCONNECTED TAPE\r
+ SKIPE TAC,ALMSWT ;READING BLOCK NOS OF AN ALMOST ACTIVE DTA?\r
+ JSR CLKREQ ;YES., GET ITS JOB BACK INTO MEMORY\r
+SRCHXT: MOVE TAC,TEMP ;RESTORE TAC\r
+ SETZM ALMSWT\r
+ JEN @SRCH ;AND DISMISS THE INTERRUPT\r
+\f;HERE IF AN ILLEGAL BLOCK WAS READ FROM THE TAPE\r
+SRCHR: AOS TAC,ERRCNT ;BUMP ERROR COUNT\r
+ CAIG TAC,DTTRV ;TRIED ENOUGH?\r
+ JRST SRCHXT ;NO. READ ANOTHER BLOCK NUMBER\r
+ SETOM BLOCK ;YES. BLOCK = -1 AS AN ERROR SWITCH\r
+ CONO DTA,770001 ;FUNCTION STOP\r
+ JRST SRCHXT ;GO AWAY\r
+\r
+ IFN CPBIT, <\r
+SRCHC: CONSZ DTC,100000 ;GOING FORWARD?\r
+ TLCA TAC,400000 ;NO. SWITCH TURN AROUND TEST. ENSURE FORWARD\r
+ JUMPE TAC,FOUND ;GO IF FOUND FORWARD\r
+ SKIPI TAC ;TURN AROUND?>\r
+ CONO DTC,DTTURN ;YES\r
+ JRST SRCHXT ;READ ANOTHER BLOCK NUMBER\r
+>\r
+\r
+;COME HERE IF CONTROL IS STILL ACTIVE AFTER READING A BLOCK NUMBER\r
+;THIS MEANS THAT TAPE IS IN THE "PSEUDO END-ZONE" - EXTRA FILLERS\r
+;INSERTED FOR THE BENEFIT OF THE PDP-9\r
+SRCHD: CONO DTC,DTTURN ;TURN TAPE AROUND\r
+ JRST SRCHXT ;AND EXIT THE INTERRUPT\r
+\f;COME HERE WHEN A TAPE IS IN A LONG SEARCH\r
+;IF THIS TAPE HAS NOT USED THE MONITOR BUFFER (READING), AND\r
+;IF NO OTHER TAPES ARE DISCONNECTD, THIS ONE WILL BE,\r
+;AND A CLOCK REQUEST WILL BE ENTERED FOR AN ESTIMATED TIME TO BLOCK.\r
+\r
+REKON: SKIPN IOWRIT ;MONITOR BUFFER FULL?\r
+ SKIPGE DISCON ;ANOTHER TAPE DISCONNECTED?\r
+ JRST SRCHXT ;YES, FORGET IT\r
+ MOVEM TAC1,FNDTMP ;SAVE AN AC\r
+ MOVE TAC1,DISTNC\r
+ SUB TAC1,TAC ;CHECK SEQUENCE\r
+ SOJN TAC1,TRYLTR ;JUMP IF NOT SEQUENTIAL BLOCKS\r
+ EXCH DEVDAT,USEWRD ;NO. DISCONNECT FROM THIS ONE\r
+ MOVSI TAC1,ALMACT ;SET TAPE AS ALMOST ACTIVE - SWAPPABLE AND \r
+ ;SHUFFLABLE EVEN THOUGH ACTIVE\r
+ ORM TAC1,DEVIOS(DEVDAT)\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
+ IMULI TAC,50 ;AND 40 MSEC/BLOCK IN REVERSE\r
+MSECPT: IDIVI TAC,.-. ;DIVIDE BY NO, MILLISECS/TIC\r
+ CAILE TAC,3300 ;IF THE COMPUTED TIME IS TOO HIGH\r
+ MOVEI TAC,30 ;LOOK AGAIN IN 1 1/2 SECOND\r
+ MOVSI TAC1,RECKON ;LIGHT A BIT TO INDICATE THE TAPE IS\r
+ IORM TAC1,DEVIOS(DEVDAT) ;DEAD RECKONING\r
+ MOVE TAC1,FNDTMP ;RESTORE TAC1\r
+ HRRM TAC,TIMREQ ;SET UP A TIME REQUEST\r
+ LDB TAC,PUNIT ;6 BITS OF INFORMATION\r
+ SKIPN TAC ;UNIT 0 = 8\r
+ MOVEI TAC,10\r
+ LSH TAC,14 ;IS THE UNIT NUMBER\r
+ ADD TAC,TIMREQ ;REQUEST THE MONITOR TO WAKE\r
+ JSR CLKREQ ;IN N TICKS\r
+ MOVE TAC,BLOCK ;SAVE THE BLOCK NO.\r
+ CONSO DTC,200000 ;AND THE DIRECTION\r
+ TRO TAC,200000\r
+ HRLM TAC,IBLK(DEVDAT) ;IN THE DDB\r
+ CONO DTC,410000 ;DESELECT THE CONTROL\r
+ ;BIT 400000 IS TO PREVENT ERROR FLAGS FROM COMING IN LATER -\r
+ ; IT DOES NOT CAUSE THE DESELECTED TAPE TO STOP THOUGH\r
+ MOVEI DEVDAT,0\r
+ EXCH DEVDAT,USEWRD ;RESET DEVDAT\r
+ SKIPLE DISCON ;SWITCHING DISCONNNECTED TAPES?\r
+ JRST NXTICK ;YES. COME BACK LATER\r
+ SOSL DTREQ ;NO. COUNT DOWN DTREQ\r
+ SETOM DTAVAL\r
+ SETOM DISCON ;ONLY 1 RECKON AT A TIME\r
+ JRST SRCHXT ;AND EXIT THE INTERRUPT\r
+\fTRYLTR: MOVEM TAC,DISTNC\r
+ MOVE TAC1,FNDTMP ;RESTORE TAC1\r
+ JRST SRCHXT\r
+\r
+;HERE WHEN SWITCHING DISCONNECTED TAPES\r
+;TOO MUCH TO DO ON THE INTERRUPT LEVEL. SO COME BACK ON\r
+;NEXT CLOCK TICK\r
+NXTICK: MOVE TAC,TIMRQ2 ;COME BACK IN A JIFFY\r
+ JSR CLKREQ\r
+ JRST SRCHXT\r
+\r
+TIMREQ: XWD BACK,0\r
+TIMRQ2: XWD BACKA,1\r
+\r
+IFN ALMACT,<\r
+ EXTERN PRIIN\r
+;COME HERE ON THE CLOCK LEVEL TO BRING THE JOB ASSOCIATED WITH\r
+;AN "ALMOST ACTIVE" TAPE BACK INTO CORE\r
+ALMREQ: XWD .+1,1\r
+ MOVE DEVDAT,USEWRD ;DDB LOC\r
+ LDB ITEM,PJOBN ;JOB NUMBER\r
+ PUSHJ PDP,PRIIN ;TELL SWAPPER TO GET IT\r
+ JFCL\r
+ MOVSI TAC,ALMACT\r
+ ANDCAM TAC,DEVIOS(DEVDAT) ;ZAP BIT SO IT WONT BE SWAPPED OUT AGAIN\r
+ POPJ PDP,\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
+ TLNN IOS,IOFST ;WAS JOB SWAPPED OUT WHEN DATA FINISHED?\r
+ POPJ PDP, ;NO. TRANSFER COMPLETED\r
+ MOVE TAC,JBTSTS(ITEM) ;YES, WAS IO ABORTED?>\r
+ TRNN TAC,ALBORT\r
+ JRST FAKINT ;NO. NOW TRANSFER DATA, ADVANCE BUFFERS\r
+ JRST THRUTP ;YES. FORGET REST OF OPERATION\r
+>\r
+\f EXTERN CIPWTM\r
+;COME HERE FROM THE MONITOR WHEN THE ESTIMATED TIME-TO BLOCK\r
+;HAS EXPIRED\r
+BACK: SKIPE USEWRD ;IS CONTROL AVAILABLE?\r
+ JRST FLAGIT ;NO. SET FLAG\r
+ AOS DTREQ ;YES. DTREQ WILL BE COUNTED DOWN LATER\r
+ SETZM DTAVAL\r
+ SETZM DISCON ;NO TAPE IS NOW DISCONNECYTED\r
+BACK2: TRZ TAC,10\r
+ LSH TAC,11 ;UNIT\r
+ PUSH PDP,TAC ;SAVE IT\r
+ LSH TAC,3\r
+ ADD TAC,DTADDB ;CONVERT TO SIXBIT NAME\r
+ PUSHJ PDP,DEVPHY ;SET UP DEVDAT FOR IT\r
+ HALT . ;******************************\r
+ MOVEM DEVDAT,USEWRD ;RESET USEWRD\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
+ HLRZ TEM,(TAC) ;ADDRESS OF CLOCK REQUEST\r
+ CAIE TEM,BACKC ;THIS THE ONE?\r
+ SOJA TAC,BACK3 ;NO. KEEP LOOKING\r
+ HLLM TAC1,(TAC) ;YES. MAKE A NO-OP OUT OF IT\r
+BACKD: POP PDP,TAC ;UNIT\r
+ TRO TAC,270000 ;SET SELECT, DELAY INHIBIT\r
+ TRNE TAC1,200000 ;SET DIRECTION\r
+ TRC TAC,300000 ;LREVERSE\r
+ MOVE IOS,DEVIOS(DEVDAT) ;RESTORE OS\r
+IFN ALMACT, < ;UNTIL REST OF SCHEDR, SWAPPER IS FIXED - IGNORE\r
+ MOVE TAC1,ALMREQ ;INDICATE CONNECTING TO AN ALMOST\r
+ MOVEM TAC1,ALMSWT ;ACTIVE TAPE, SO JOB WILL BE BROUGHT\r
+ ;BACK IN IF TAPE CLOSE TO TARGET BLOCK\r
+>\r
+ JRST FNDBL3 ;READ NEXT BLOCK NUMBER\r
+\f;HERE WHEN TIME IS UP AND ANOTHER TAPE HAS THE CONTROL\r
+FLAGIT: MOVEM TAC,DISCON ;DISCON POSITIVE IF NEED THE CONTROL\r
+ MOVE TAC,.+3 ;SET A CLOCK REQUEST TO STOP TAPE\r
+ JSR CLKREQ\r
+ POPJ PDP, ;RETURN, WILL COME IN ON INTERRUTP LEVEL\r
+ XWD BACKC,10\r
+\r
+;HERE WHEN DTASER CAN GIVE UP THE CONTROL\r
+BACKB: CONO DTC,400000 ;STOP CURRENT TAPE\r
+ PUSHJ PDP,THRUTA ;GIVE IT UP\r
+ TDZA TAC,TAC ;DISCON WILL GO TO 0\r
+\r
+BACKA: SETOM TAC ;DISCON WILL GO TO -1\r
+ EXCH TAC,DISCON ;UNIT TO CONNECT TO\r
+ JRST BACK2 ;GO RECONNECT\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
+ HLRZS TAC ;FLAGS INTO R.H.\r
+ ANDI TAC,770000 ;ONLY ENABLE FLAGS\r
+ CONO DTS,2(TAC) ;STOP THE DESELECTED TAPE\r
+ CONO PI,PION\r
+ POPJ PDP, ;BEFORE RUNNING OFF END OF THE REEL\r
+\f;HERE WHEN CORRECT BLOCK NUMBER IS FOUND\r
+FOUND: MOVEM TAC1,FNDTMP ;SAVE THOSE ACS THAT WILL BE USED\r
+ MOVEM TEM,RVERS\r
+ EXCH DEVDAT,USEWRD\r
+ EXCH IOS,DEVIOS(DEVDAT)\r
+ ECHO PDP,FNDPDP\r
+ PUSHJ PDP,@DISPAD(DEVDAT) ;GO TO DISPATCH LOCATION\r
+ EXCH PDP,FNDPDP ;RESTORE ACS\r
+ EXCH IOS,DEVIOS(DEVDAT)\r
+ EXCH DEVDAT,USEWRD\r
+ MOVE TAC,TEMP\r
+ MOVE TAC1,FNDTMP\r
+ MOVE TEM,RVERS\r
+ JEN @SRCH ;EXIT THE INTERRUPT\r
+\r
+FNDPDP: XWD -2,.\r
+ 0\r
+\r
+ IFN CPBIT, <\r
+;HERE WHERE DUMP-MODE POINTER RUNS OUT\r
+DMPADV: 0\r
+ MOVEM TAC,TEMP\r
+ AOSA TAC,USPNTR ;ADVANCE LOC OF POINTER\r
+DMPAV1: HRRM TAC,USPNTR\r
+ SKIPN TAC,@TAC ;END OF LIST?\r
+ JRST DMPAV3 ;YES. STOP TAPE\r
+ ADD TAC,ADRPRG ;ADD RELOCATION\r
+ JUMPG TAC,DMPAV1\r
+ MOVEM TAC,PNTR ;NEW POINTER\r
+DMPAV2: MOVE TAC,TEMP ;RESTORE TAC\r
+ JEN @DMPADV\r
+\r
+\r
+DMPAV3: CONO DTS,770001 ;GIVE FUNCTION STOP\r
+ JRST DMPAV2 ;RESTORE TAC AND EXIT THE INTERRUPT\r
+\r
+>\r
+\f;INTERRUPT HERE FOR FLAG CHANNEL\r
+DTAINT: CONSO DTS,770000 ;INTERRUPT FOR DTA?\r
+ JRST . ;NO\r
+ CONSZ DTS,20000 ;END ZONE?\r
+ SKIPGE BLOCK ;YES. BAD BLOCK NUMBER?\r
+ SKIPA ;YES\r
+ JRST TURN ;NO. TURN TAPE AROUND\r
+ JSR DTASAV ;SAVE ACS\r
+FAKINT: MOVE DEVDAT,USEWRD ;RESTORE DEVDAT\r
+ MOVE IOS,DEVIOS(DEVDAT) ;AND IOS\r
+ LDB ITEM,PJOBN ;JOB NUMBER\r
+IFN ALMACT,<\r
+ PUSHJ PDP,PRIIN ;IS JOB SWAPPED OR SHUFFLED?\r
+ JRST SWPDLY ;YES, CANT MOVE BUFFERS NOW\r
+>\r
+ MOVE PROG,JBTADR(ITEM) ;ADDRESS\r
+DTAIN1: TLZE IOS,REWBIT ;NO, FROM A REWIND MTAPE?\r
+ JRST REWDUN ;YES. DONE\r
+ TLZE IOS,IOFST ;COMING FROM SWAP DELAY ROUTINE?\r
+ JRST DTAIN2 ;YES, TD10 HAS BEEN ZAPPED\r
+ CONSZ DTS,100000 ;JOB DONE?\r
+ CONSZ DTS,670000 ;AND NO ERRORS?\r
+ JRST ERRS ;NO. TOUGH LUCK\r
+ SKIPGE BLOCK ;BAD BLOCK NUMBER ON TAPE?\r
+DTAIN2: TLNE IOS,DMPMOD ;DUMP MODE?\r
+ JRST DMPTHR ;YES. GO ELSEWHERE\r
+ TLNN IOS,SINGL\r
+ JRST .+3\r
+ LDB TAC,[POINT 10,BUF,27] ;GET 1ST BLOCK NO. IF READ\r
+ ;CAME FROM LOOKUP\r
+ MOVEM TAC,IBLK(DEVDAT) ;STORE IN DDB\r
+ TLZE IOS,IOW ;NO. IN IO WAIT?\r
+ PUSHJ PDP,SETIOD ;YES. TAKE OUT OF WAIT\r
+ TLZE IOS,SINGL+RWDIR+DMPCLS ;DIRECTORY OPERATION OR\r
+ ;CLOSING DUMP FILE?\r
+ JRST THRUTP ;YES. LEAVE\r
+ TLNE IOS,IO ;WRITING?\r
+ JRST OUTHRU ;YES\r
+\fEXTERN JBTSTS,PJOBN\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
+ ANDM TAC1,BUF\r
+ MOVEI TAC,@DEVIAD(DEVDAT) ;WHERE TO STORE BLOCK\r
+ ADD TAC,[XWD BUF,1];FROM BUF TO THERE\r
+ MOVEI TAC1,177(TAC)\r
+ BLT TAC,(TAC1) ;TRANSFER IT\r
+ HLRZ BLK,BUF ;NEXT BLOCK TO READ\r
+ TRNE IOS,UDSD ;IF NON-STD\r
+ AOSA BLK,IBLK(DEVDAT);READ SEQUENTIAL BLOCKS\r
+ HRRM BLK,IBLK(DEVDAT) ;DAVE IN DDB\r
+ TRNE IOS,IODTER+IODERR+IOIMPM\r
+ JRST THRUIN\r
+ PUSHJ PDP,ADVBUFF ;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
+ CAILE BLK,TOPBLK ;THE ERROR WILL BE CAUGHT ON THE\r
+ JRST THRUIN ;UUO LEVEL NEXT TIME AROUND\r
+ SOSGE QUANTM ;HAS TAPE HAD CHAN LONG ENOUGH?\r
+ SKIPG DTREQ ;YES. ANYONE ELSE WANT IT?\r
+ JRST READBC ;NO. READ NEXT BLOCK\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
+ CONSZ DTC,100000\r
+ TLO IOS,RVERSE\r
+\f;HERE WHEN TAPE IS DONE\r
+THRUTP: SKIPLE TAC,DISCON ;TAPE TIMED OUT?\r
+ JRST BACKB ;YES\r
+ CONO DTC,400000 ;STOP TAPE\r
+THRUTD: SOSL DTREQ ;BUMP COUNT DOWN\r
+ SETOM DTAVAL ;TELL SCHEDULER\r
+THRUTA: CONO DTC,10000 ;DESELECT CONTROL\r
+ TLZ IOS,DMPMOD+NOBUF+DMPCLS+PEWBIT+RUNBIT\r
+ SETZM USEWRD ;INDICATE CONTROL NOW FREE\r
+ JRST CLRACT ;RESET IOACT AND RETURN\r
+\r
+;COME HERE IF A TAPE IS HUNG\r
+HUNGTP: JUMPGE IOS,THRUTP ;GIVE UP CONTROL IF NOT DEAD-RECKONING\r
+ JRST CPOPJ1 ;IGNORE IT IF DEAD RECKONING -\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
+ INTERN FTSWAP\r
+ EXTERN SHFWAT\r
+;HERE ON END OF BLOCK WHEN THE JOB IS STILL SWAPPED OUT\r
+;CONTROL GETS HERE IF SWP OR SHF IS ON IN JBTSTS\r
+;IO THE JOB IS CURRENTLY SWAPPED OR SHUFFLED WE MUST DELAY\r
+;SO TEST JOB NO AGAINST SHFWAT (IF SHUFFLE) OR FORCE (IF SWAP) TO DETERMINE\r
+;IF JOB IS REALLY IN THAT STATE, OR IF MONITOR HAS LIT THE BIT\r
+;IN ANTICIPATION OF PUTTING THE JOB IN THAT STATE\r
+SWPDLY:\r
+\r
+ IFN FTSWAP, <\r
+ EXTERN FORCE\r
+ TLNE TAC1,SWP ;SWAPPED JOB?\r
+ SKIPA TAC,FORCE ;YES.\r
+>\r
+ MOVE TAC,SHFWAT ;NO. SHUFFLED?\r
+ CAMN ITEM,TAC ;JOB REALLY SWAPPED OR SHUFFLED?\r
+ JRST DTAIN1 ;NO, FINISH THIS DATA OPERATION\r
+ CONO DTC,400000 ;YES, STOP TAPE (WE MUST DELAY)\r
+ TLO IOS,IOFST ;INDICATE JOB WAS DELAYED (FOR FAKINT)\r
+ MOVE TAC,[XWD FAKINT,1] ;IF JOB IS CURRENTLY BEING SHUFFLED\r
+ TLNN TAC,SWP ;COME BACK ON NEXT CLOCK INTERRUPT, AT WHICH TIME\r
+ JSR CLKREQ ;THE BLT MUST HAVE FINISHED\r
+ JRST STOIOS ;AND GO AWAY\r
+\f;HERE ON END OF OUTPUT BLOCK\r
+OUTHRU: PUSHJ PDP,ADVBFE ;GET NEXT BUFFER\r
+ JRST THRUTP ;NOT FULL\r
+ SKIPLE DISCON\r
+ JRST BACKB\r
+ HRRZ BLK,OBLK(DEVDAT) ;NEXT BLOCK TO WRITE\r
+ CAILE BLK,TOPBLK ;LEGAL?\r
+ JRST THRUTP ;NO. CATCH ERROR ON UUO LEVEL\r
+ SOSGE QUANTM ;YES. HAD CHAN LONG ENOUGH?\r
+ SKIPG DTREQ ;AND SOMEONE ELSE WANT IT?\r
+ JRST FILBUF ;NO. GO WRITE NEXT BLOCK\r
+ JRST THRUTP ;YES. GIVE UP TAPE\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
+ CONO DTC,DTTURN ;YES. TURN AROUND\r
+ JEN @DTACHL ;DISMISS INTERRUPT\r
+\r
+;COME HERE ON AN END ZONE INTERRUPT WHILE READING DATA\r
+;THIS CAN ONLY HAPPEN IN MODE 116,117\r
+;LIGHT IODEND (IT IS A PREMATURE EOF) AND LEAVE\r
+DIREOF: JSR DTASAV ;SAVE ACS\r
+ MOVE DEVDAT,USEWRD ;RESTORE DEVDAT\r
+ MOVE IOS,DEVIOS(DEVDAT) ;AND IOS\r
+ JRST DMPEOF ;LIGHT IODEND AND RETURN\r
+\f;COME HERE ON END OF DUMP MODE BLOCK\r
+SVDMTH: SKIPLE DISCON ;HAS A TAPE TIMED OUT\r
+ CONO DTS,2 ;YES. STOP IT\r
+ IFN CPBIT, <\r
+ TLNE IOS,NOBUF ;DIRECTLY TO USER?\r
+ JRST USDMTH ;YES. ALMOST THROUGH\r
+>\r
+ MOVSI TAC1,-177\r
+ IFE CPBIT, <\r
+ TRNE IOS,UDSD\r
+ SUB TAC1,ONEONE ;SET UP TAC1 WITH COUNT\r
+>\r
+ TLNN IOS,IO\r
+ JRST SVOMIN ;INPUT FILE\r
+ HRRZ BLK,OBLK(DEVDAT) ;OUTPUT FILE, NEXT BLOCK\r
+ JUMPF BLK,DMPTHA ;LAST BLOCK\r
+ IFE CPBIT, <\r
+ TRNE IOS,UDSD ;IF NON-STD MODE\r
+ AOSA OBLK(DEVDAT) ;WRITE CONSECUTIVE BLOCKS\r
+>\r
+ CAIG BLK,TOPBLK ;NOT LAST. LEGAL BLOCK NUMBER?\r
+ POPJ PDP, ;YES. RETURN\r
+\r
+ TRO IOS,IOBKTL ;BLOCK TOO LARGE\r
+DMPTHA: POP PDP,TAC ;REMOVE THE RETURN ADDRESS FROM\r
+ ;CALL TO SVDMTH. SINCE\r
+ ;NO MORE I/O WILL BE DONE\r
+DMPTH2: SETZM SVDWRD(DEVDAT) ;ZERO DUMP-MODE STUFF\r
+ SETZM DMPLST(DEVDAT)\r
+DMPTH3: TLZE IOS,IOW ;IS IO WAIT?\r
+ PUSHJ PDP,SETIOD ;YES, RESTART JOB\r
+ JRST THRUTP\r
+\r
+;HERE ON END SAVE MODE INPUT BLOCK\r
+SVDMIN: HLRZ BLK,BUF ;NEXT BLOCK NUMBER\r
+ IFE CPBIT, <\r
+ TRNE IOS,UDSD ;NON-STANDARD?\r
+ AOSA BLK,IBLK(DEVDAT) ;YES, READ CONSECUTIVE BLOCKS\r
+>\r
+ HRRM BLK,IBLK(DEVDAT) ;SAVE IN DDB\r
+ JRST CPOPJ1\r
+\r
+ IFN CPBIT, <\r
+;HERE WHEN THROUGH DUMP-MODE DIRECTLY TO USER\r
+USDMTH: MOVEI TAC1,IBLK(DEVDAT)\r
+ TLNE IOS,IO\r
+ MOVEI TAC1,OBLK(DEVDAT) ;SET TAC1 TO RIGHT BLOCK NUMBER\r
+ MOVE TAC,BLKCNT ;UPDATE BLOCK COUNTER\r
+ ADDM TAC,(TAC1)\r
+ JRST DMPTHA ;THROUGH\r
+>\r
+\f;HERE WHEN THROUGH DUMP MODE BLOCK\r
+DMPTHR: PUSHJ PDP,SVDMTH ;END OF BLOCK HOUSEKEEPING\r
+ ; RETURN ONLY IF MORE I/O\r
+ ; WILL BE DONE\r
+ JRST DMPFLC ;FILL BUFFER FOR NEXT OUTPUT\r
+\r
+;HERE WHEN THROUGH READING A DUMP-MODE BLOCK\r
+DMIFIL: SKIPE TAC,SVDWRD(DEVDAT) ;PARTIAL COMMAND?\r
+ JRST DMIFLB ;YES. CONTINUE\r
+DMIFLA: PUSHJ PDP,NXTCOM ;NO. GET NEXT COMMAND\r
+ JRST DMPTH2 ;END OF LIST - THROUGH\r
+DMIFLB: MOVE TEM,BUF+1(TAC1) ;NEXT DATA WORD\r
+ MOVEM TEM,(TAC) ;GIVE TO USER\r
+ AOBJP TAC1,.+3 ;IF BUFFER IS FULL\r
+ AOBJN TAC,DMIFLB ;GET NEXT WORD\r
+ JRST DMIFLA ;GET NEXT COMMAND\r
+\r
+ AOBJN TAC,.+3 ;BUFFER IO FULL. IS COUNT EXACTLY 177?\r
+ PUSHJ PDP,NXTCOM ;THAT COM, IS DONE. GET NEXT\r
+\r
+ JRST DMPTH2 ;END OF LIST - THROUGH\r
+ MOVEM TAC,SVDWRD(DEVDAT) ;SAVE PARTIAL COMMAND FOR NEXT TIME\r
+ JUMPE BLK,DMPEOF ;IF EOF - LIGHT BIT\r
+RDNXT: CAIG BLK,TOPBLK ;BLOCK LEGAL?\r
+ JRST READBC ;GO READ BLOCK NUMBER\r
+ TROA IOS,IOBLKT ;LIGHT ERROR BIT\r
+\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
+ JRST ADRERR ;TYPE ERROR MESSAGE\r
+;COME HERE ON ERROR\r
+ERRS: AOS TAC,ERRCNT ;BUMP COUNT\r
+ IFN CPBIT, <\r
+ TLNN IOS,NOBUF ;I/O DIRECT TO USER?\r
+ JRST ERRS1 ;NO\r
+ MOVE TAC1,SVPNTR ;YES. RESET POINTERS\r
+ MOVEM TAC1,USPNTR\r
+ MOVE TAC1,(TAC1) ;RESET PNTR\r
+ ADD TAC1,ADRPRG\r
+ MOVEM TAC1,PNTR\r
+>\r
+ERRS1: CONSO DTS,40000 ;IF ILLEGAL OP - DONT RETRY\r
+ CAILE TAC,DTTRY ;ENOUGH REREADS?\r
+ JRST PERMET ;YES. PERMANENT ERROR\r
+ JRST FNDBL2 ;NO. TRY AGAIN\r
+\r
+;PERMANENT ERROR\r
+PERMER: SKIPL BLOCK ;IF BAD BLOCK # LIGHT IODTER\r
+ CONSZ DTS,400000 \r
+ TRO IOS,IODTER ;PARITY\r
+ CONSO DTS,10000\r
+ CONSZ DTS,200000\r
+DERR: TRO IOS,IODERR ;MISSED DATA\r
+ CONSZ DTS,40000\r
+ TRO IOS,IOIMPM ;ILLEGAL OP\r
+ TLNE IOS,DMPMOD ;DUMP MODE?\r
+ JRST DMPTHR ;YES. NOT THROUGH YET\r
+ TLNN IOS,IO+RDDIR+SINGL\r
+ JRST DTAIN2\r
+REWDUN: TLZE IOS,IOW\r
+ PUSHJ PDP,SETIOD ;NO. TAKE OUT OF IO WAIT\r
+ TLZN IOS,RWDIR+SINGL ;DIRECTORY OPERATION?\r
+ JRST THRUTP ;NO. RETURN TO USER\r
+ PUSHJ PDP,THRUTP ;YES. STOP TAPE\r
+ MOVSI TAC,DVDIRIN ;CLEAR DIRECTORY IN CORE BIT\r
+ ANDCAM TAC,DEVMOND(DEVDAT)\r
+BDDIR: LDB ITEM,PJOBN ;NUMBER OF OFFENDING JOB\r
+ JRST RADDIR ;GO PRINT ERROR MESSAGE\r
+\f INTERN DTABUF\r
+BFPNTR: IOWD 200,BUF+1\r
+ONEONE: XWD 1,1\r
+USEWRD: 0\r
+USEPRG: 0\r
+ADRPRG: 0\r
+PNTR: 0\r
+TEMP: 0\r
+DISTNC: 0\r
+BLOCK: 0\r
+QUANTM: 0\r
+DISCON: 0\r
+ERRCNT: 0\r
+FNDTMP: 0\r
+IOWRIT: 0\r
+ALMSWT: 0\r
+ IFN CPBIT, <\r
+BLKCNT: 0\r
+SVPNTR: 0\r
+\r
+USPNTR: 0\r
+DIRCNT: 0\r
+>\r
+;THIS IS THE MONITOR BUFFER\r
+DTABUF:\r
+IFN ALMACT,<\r
+ XWD SWPBACK,0 ;RH WILL BE LINK TO NEXT MONITOR BUFFER\r
+>\r
+MONB2: 0\r
+BUF: BLOCK 200\r
+DTAEND: END\r
+\f\r
--- /dev/null
+TITLE DTCSRN - NEW FORMAT DECTAPE SERVICE FOR 551 (PDP-6)\r
+SUBTTL DTA551 A.WACHS/TW/RCC 01 JUN 69 V012\r
+ XP VDTASR,012 ;GLOBAL VERSION NUMBER FOIR LOADER STORAGE MAP.\r
+\r
+ ENTRY DTCSRN ;ENTRY POINT FOR SELECTIVE LOAD BY BUILD\r
+DTCSRN:\r
+EXTERNAL TPOPJ,TPOPJ1,DTCCHL,DCOUT,DCIN,DCON,DCOFF\r
+EXTERNAL STOIOS,STOTAC,SETACT,CLRACT,OUT,DTASAV,PIOMOD\r
+\r
+EXTERNAL DTAVAL,DTREQ,SETIOD,THSDAT,PUNIT,GETDCDT\r
+EXTERNAL ADVBFE,ADVBFF,ADRERR,WAIT1,CPOPJ,CPOPJ1,BADDIR\r
+EXTERNAL COMCHK,PJOBN,RELEA9,UADCK1,DTTRY\r
+EXTERNAL JBTADR,DCLOC,DCLOC1,DTCCHN,DCREQ,DCAVAL\r
+\r
+\r
+BLK=4\r
+\r
+\r
+DIRBLK=^D100 ;NUMBER OF BLOCK FOR DIRECTORY\r
+\r
+TOPBLK=1101 ;HIGHEST LEGAL BLOCK NUMBER\r
+NAMSTR=^D83 ;1ST NAME WORD IN DIRECTORY\r
+QUANT=5 ;NUMBER OF BLOCKS CAN READ BEORE GIVING UP DTC\r
+SPACE=6 ;NUMBER OF BLOCKS SEPERATING CONTIGUOUS BLKS OF A FILE\r
+\r
+;DDB MAGIC CELLS\r
+FSTBLK=13\r
+DLOC=14\r
+IBLK=15\r
+OBLK=16\r
+DISPAD=17\r
+DMPLST=20\r
+SVDWRD=21\r
+\f;FLAGS IN RH OF IOS\r
+UDSD=100\r
+\r
+\r
+;FLAGS IN LH OF IOS\r
+NOLINK=200\r
+CHNGDR=400\r
+RVERSE=1000\r
+SINGL=2000 ;JUST READ OR WRITE 1 BLOCK\r
+DMPMOD=4000\r
+RWDIR=10000\r
+DMPCLS=20000\r
+NOBUF=40000 ;DATA GOING DIRECTLY INTO USER AREA\r
+NOBUFC=737777 ;-NOBUF\r
+\r
+CPBIT=-1 ;CONDITIONAL ASSEMBLY PARAMETER FOR I/O DIRECTLY\r
+ ;TO USER. IF -1 THE I/O IN DUMP MODE WITH\r
+ ;BIT 29 ON IN INIT WILL DO IO DIRECTLY TO USER\r
+ ;WIUTHOUT DIRECT CONSIDERATION OF BLOCK BOUNDRIES\r
+\f EXTERN JIFSEC\r
+\r
+ INTERN DTCINT,DTCDDB,DTCINI,DTCDDS\r
+\r
+DTCDDB: SIXBIT /DTA0/\r
+ XWD ^D60*HUNGST,200\r
+ 0\r
+ EXP DTCDSP\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 DTCDIR\r
+ EXP 0,0,0,0,0\r
+\r
+\r
+DTCDIR: BLOCK 200\r
+DTCDDS=.-DTCDDB\r
+\r
+ JRST DTCINI\r
+ JRST THRUTP ;HUNG DEVICE\r
+DTADSP JRST UREL\r
+ JRST UCLS\r
+ JRST UOUT\r
+ JRST UIN\r
+ JRST ENTR\r
+ JRST LOOK\r
+ JRST DMPO\r
+ JRST DMPI\r
+ JRST SETO\r
+ JRST SETI\r
+ JRST GETF\r
+ JRST RENAM\r
+ POPJ PDP, ;CLOSE INPUT\r
+ JRST UTPCLR\r
+ POPJ PDP, ;MTAPE\r
+\r
+;INITIALIZE DTC\r
+DTCINI: CONO DTC,0\r
+ CONO DC,0\r
+ HLLZS DTCINT ;CLEAR CONSO\r
+ POPJ PDP,\r
+\f EXTERN JOBSAV\r
+;LOOKUP A DIRECTORY ENTRY\r
+LOOK: TRNE IOS,UDSD ;NON-STANDARD?\r
+ JRST CPOPJ1 ;YES. LOOKUP OK\r
+ PUSHJ PDP,DSERCH ;NO. FIND DIRECTORY ENTRY\r
+ POPJ PDP, ;NOT THERE\r
+ HRRZ TAC1,26(TAC) ;GET DATE, NO. OF 1K BLOCKS NEEDED\r
+ AOS UUO ;POINT UUO TO WORD 3\r
+ MOVEM TAC1,@UUO ;INTO USER'S LOOKUP BLOCK\r
+LOOKA: HLRE TAC,TAC ;GET INDEX\r
+ ADDI TAC,27\r
+ SKIPN FSTBLK(DEVDAT) ;TAPE BEING WRITTEN?\r
+ HRLM TAC,OBLK(DEVDAT) ;NO. SAVE INDEX FOR POSSIUBLE OUTPUT\r
+ HRRM TAC,AC1 ;SAVE INDEX IN CASE LH(IBLK) IS\r
+ ;CHANGED BY DEAD-RECKONING\r
+ MOVEI TAC1,0\r
+ PUSHJ PDP,BLKSRC ;COUNT NUMBER OF BLOCKS IN FILE\r
+ AOJA UUO,STOWD4 ;LAST BLOCK DONE\r
+ AOS TAC1 ;COUNT THE BLOCK\r
+ SOS 1(PDP) ;ADJUST FOR CORRECT RETURN\r
+ AOBJN PDP,BLKSRB ;LOOK FOR NEXT BLOCK\r
+\r
+;TAC1 HAS THE NUMBER OF BLOCKS BELONGING TO THE FILE\r
+STOWD4: IMUL TAC1,[-177] ;-NUMBER OF WORDS IF ALL BLOCKS FULL\r
+ HRLZM TAC1,@UUO ;STORE IN DIRECOTRY WD 4\r
+ SUBI UUO,2 ;POINT UUO TO DIRECORY WD 2\r
+ TLZ IOS,IO ;MAKE SURE IO IS OFF\r
+ TLO IOS,SINGL ;JUST READ 1 RECORD\r
+ MOVEI BLK,DIRBLK ;NO, FIND FIRST MENTION OF BLOCK\r
+ PUSHJ PDP,LSTFRE+1 ;NEAR DIRECTORY\r
+ JUMPN BLK,LOOKE ;FOUND IF BLK NOT =0\r
+LOOKD: PUSHJ PDP,BLKSRC ;FIND FIRST MENTION IN DIRECTORY\r
+ JRST BDDIR ;NOT THERE - ERROR\r
+LOOKE: PUSHJ PDP,RDBLUK ;GO READ IT\r
+ PUSHJ PDP,WAIT1 ;WAIT TILL IT'S IN\r
+ HRLM AC1,IBLK(DEVDAT) ;SAVE INDEX ON INPUT FILE FOR LATER\r
+ ;TEST ON ENTER - WONT ALLOW ENTER\r
+ ;TO BE DONE ON LOOKED-UP FILE\r
+ HRRZ BLK,IBLK(DEVDAT) ;GET FIRST BLOCK OF FILE\r
+LOOKC: SKIPN FSTBLK(DEVDAT) ;IF FILE HAS NOT BEEN ENTERED\r
+ MOVEM BLK,FSTBLK(DEVDAT) ;SAVE IN DDB\r
+ HRRM BLK,@UUO ;SAVE IN USER'S AREA\r
+ HLL TAC,@UUO ;GET USER'S EXTENSION\r
+ HLLM TAC,DEVEXT(DEVDAT) ;SAVE IN DEVCE DATA BLOCK FOR RENAME AND\r
+ ; AND SUPERSEDING SHARED SEGMENTS\r
+ JRST CPOPJ1 ;AND TAKE GOOD EXIT\r
+\fRENAM: PUSH PDP,UUO ;SAVE LOC OF NEW NAME\r
+ MOVEI UUO,DEVFIL(DEVDAT) ;SEARCH FOR OLD NAME\r
+ PUSHJ PDP,DSER1\r
+ JRST RENER1 ;NOT FOUND - ERROR\r
+ POP PDP,UUO ;FOUND, RESTORE UUO\r
+ SKIPE @UUO ;RENAMING TO ZERO?\r
+ JRST RENAM2 ;NO. GO TO REAL RENAME\r
+ SETZM (TAC) ;YES. DELETE NAME IN DIR\r
+ SETZM 26(TAC) ;DELETE EXTENSION\r
+ SETZM DEVFIL(DEVDAT) ;ZERO DEVFIL\r
+ HLRE TAC,TAC ;GET INDEX OF FILE\r
+ ADDI TAC,27\r
+ PUSHJ PDP,DLETE ;DELETE ALL BLOCKS OF FILE\r
+RENAM1: TLO IOS,CHNGDR ;DIRECTORY HAS CHANGED\r
+ AOS (PDP) ;SET FOR GOOD RETURN\r
+ JRST STOIOS ;GO TO USER\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
+ MOVE TAC,@UUO ;GET NEW NAME\r
+ MOVEM TAC,(DAT) ;SAVE IN DIR\r
+ AOS UUO\r
+ MOVE TAC,@UUO ;EXTENSION\r
+ HLLM TAC,26(DAT) ;SAVE IN DIR\r
+ HLLM TAC,DEVEXT(DEVDAT) ;SAVE INN DDB\r
+ JRST RENAM1 ;GIVE GOOD RETURN TO USER\r
+\r
+RENER1: POP PDP,UUO\r
+ TDZA TAC,TAC ;RH E+1 =0\r
+RENER2: MOVEI TAC,4 ;RH E+1 =4\r
+ AOS UUO ;POINT TO 2ND WORD\r
+ HRRM TAC,@UUO ;SET ERRORR CODE\r
+ POPJ PDP, ;AND TAKE ERROR RETURN\r
+\f;SEARCH DIRECTORY FOR A MATCH\r
+DSERCH: MOVEI AC1,3(UUO) ;CHECK VALIDITY OF ADDRESS\r
+ PUSHJ PDP,UADCK1 ;NEVER RETURN IF ADDR. OUT OF BOUNDS\r
+DSER1: PUSHJ PDP,DIRCHK ;ENSURE DIRECTORY IS IN CORE\r
+ HRRZ TAC,DLOC(DEVDAT) ;LOCAION OF DIRECTORY\r
+ ADD TAC,[XWD -26,NAMSTR] ;POINT TO START OF NAMES\r
+NMLOOK: SKIPN TAC1,@UUO ;GET NAME\r
+ JRST TPOPJ ;NULL ARGUMENT - ERROR RETURN \r
+ MOVEM TAC1,DEVFIL(DEVDAT) ;STORE FOR RENAME AND SUPERSEDING\r
+ ; SHARED SEGMENTS\r
+ CAMN TAC1,(TAC) ;TEST FOR MATCH\r
+ AOJA UUOI,NMFOUN ;FOUND NAME, CHECK EXTENSION\r
+ AOBJN TAC,.-2 ;TRY NEXT NAME\r
+ POPJ PDP, ;NOT FOUND\r
+NMFOUN: HLLZ TAC1,@UUO ;PICK UP USER'S EXTENSION\r
+ XOR TAC1,26(TAC) ;TEST AGAINST DIRECTORY EXTENSION\r
+ TLNN TAC1,-1 ;MATCH?\r
+ JRST CPOPJ1 ;YES. RETURN\r
+ AOBJP TAC,.+2\r
+ SOJA UUO,NMLOOK ;NO. TRY NEXT NAME\r
+ SOJA UUO,CPOPJ ;NAME NOT FOUND\r
+\r
+;CHECK IF DIRECTORY IS IN CORE, IF NOT, READ IT\r
+DIRCHK: TRNN IOS,UDSD ;DONT BOTHER IF NON-STANDARD\r
+ SKIPG DEVMOD(DEVDAT) ;IS IT IN?\r
+ POPJ PDP, ;YES. RETURN\r
+ MOVEI BLK,DIRBLK ;BLOCK NUMBER\r
+ TLZ IOS,IO\r
+ PUSHJ PDP,GETDT ;GET CONTROL\r
+ TLO IOS,RWDIR ;JUST READ 1 BLOCK\r
+ PUSHJ PDP,READBC ;GO READ IT\r
+ PUSHJ PDP,WAIT1 ;WAIT TILL IN\r
+ MOVSI TAC1,DVDIRI ;SET DIRECTORY-IN-CORE BIT\r
+ ORM TAC1,DEVMOD(DEVDAT)\r
+ POPJ PDP,\r
+\f;SEARCH DIRECTORY FOR FILE WHOSE INDEX IS IN TAC\r
+BLKSRC: MOVSI DAT,440500 ;DAT IS A BLOCK POINTER\r
+ HRR DAT,DLOC(DEVDAT)\r
+ MOVEI BLK,1 ;START AT BLOCK 1\r
+\r
+BLKSRA: ILDB TEM,DAT ;INDEX OF NEXT BLOCK\r
+ CAMN TAC,TEM ;MATCH?\r
+ JRST CPOPJ1 ;YES. RETURN\r
+\r
+BLKSRB: CAIGE BLK,TOPBLK ;NO. SEARCHED LAST?\r
+ AOJA BLK,BLKSRA ;NO. TRY NEXT BLOCK\r
+ POPJ PDP, ;YES. RETURN\r
+\r
+;SET UP POINTER TO DIRECTORY FOR BLOCK IN BLK\r
+SETPTR: PUSH PDP,BLK ;SAVE BLK\r
+ PUSHJ PDP,DRPTR ;SET BLK AS A BYTE POINTER\r
+ MOVE DAT,BLK ;RETURN IT IN DAT\r
+ POP PDP,BLK ;RESTORE BLK\r
+ POPJ PDP, ;AND RETURN\r
+\r
+;GET NEXT AVAILABLE FREE BLOCK\r
+NXTFRE: PUSH PDP,TEM \r
+ PUSHJ PDP,SETPTR ;SET DAT TO A BYTE POINTER\r
+ MOVEI TAC,0 ;LOOK FOR FREE BLOCKS\r
+ PUSHJ PDP,BLKSRA ;FIND A ZERO BLOCK\r
+ MOVEI BLK,0 ;NOT THERE- RETURN 0\r
+FREXIT: POP PDP,TEM\r
+ POPJ PDP,\r
+\r
+;GET PREVIOUS FREE BLOCK\r
+LSTFRE: MOVEI TAC,0\r
+ PUSH PDP,TEM\r
+ ADDI BLK,2\r
+ PUSHJ PDP,SETPTR ;SET DAT AS A POINTER\r
+ SUBI BLK,2\r
+ PUSHJ PDP,DECPTR ;DECREMENT BYTE POINTER\r
+ LDB TEM,DAT ;INDEX TO BLOCK\r
+ CAMN TEM,TAC ;FOUND?\r
+ JRST FREXIT ;YES. RETURN\r
+ SOJG BLK,.-4 ;TRY AGAIN IF NOT AT START\r
+ JRST FREXIT ;REACHED START - RETURN BLK=0\r
+\r
+;DECREMENT BYTE POINTER\r
+DECPTR: JUMPL DAT,.+5\r
+ ADD DAT,[BYTE (6) 5] ;DECREMENT\r
+ JUMPG DAT,CPOPJ ;IF POSITIVE - SAME WORD\r
+ HRLI DAT,010500 ;RESET TO PREVIOS WORD\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
+ JRST CPOPJ ;ALL THROUGH\r
+ DPB TAC1,DAT ;DELETE IT\r
+ SOS 1(PDP) ;ADJUST PDL FOR RETURN\r
+ AOBJN PDP,BLKSRB ;AND FIND NEXT MATCH\r
+\r
+\r
+;ENTER A FILE NAME IN DIRECTORY\r
+ENTR: TRNE IOS,UDSD ;NON STANDARD?\r
+ JRST CPOPJ1 ;YES. RETURN\r
+ PUSHJ PDP,DSERCH ;NO. LOOK FOR MATCH\r
+ JRST NEWNT ;THIS IS A NEW ENTRY\r
+ENTR2: MOVE TAC1,@UUO ;PICK UP 2ND WORD (EXTENSSION)\r
+ AOS UUO ;POINT TO WORD 3\r
+ HRR TAC1,@UUO ;ADD DATE\r
+ TRNN TAC1,7777 ;IS DATE ALREADY THERE?\r
+ IOR TAC1,THSDAT ;NO, ADD CURRENT DATE\r
+ MOVEM TAC1,26(TAC) ;INTO DIRECTORY\r
+ SKIPGE AC3,OBLK(DEVDAT) ;IS THIS A SAVE FILE (UGETF DONE\r
+ ;BEFORE THE ENTER?)\r
+ AOJA UUO,SETWD4 ;YES. STORE LENGTH IN DIRECTORY\r
+ENTRA: SUBI UUO,2 ;NO. POINT TO NAME\r
+ MOVE TAC1,@UUO ;PICK IT UP\r
+ MOVEM TAC1,(TAC) ;INTO DIRECTORY\r
+ HLRE TAC,TAC ;COMPUTE INDEX OF FILE\r
+ ADDI TAC,27\r
+ HLRZ DAT,IBLK(DEVDAT) ;INDEX OF INPUT FILE\r
+ SUB DAT,TAC ;WRITE SAME FILE AS READING?\r
+ JUMPE DAT,CPOPJ ;TAKE ERROR RETURN IF YES\r
+ HRLM TAC,OBLK(DEVDAT) ;SAVE INDEX IN DDB\r
+\r
+ PUSHJ PDP,DLETE ;DELETE ALL BLOCKS BELONGING TO FILE\r
+ AOJE AC3,FNTRD ;FIND FIRST FREE BLOCK ON TAPE IF THIS\r
+ ;IS A SAVE FILE (UGETF DONE)\r
+ MOVEI BLK,DIRBLK ;NO. GET 1ST BLOCK CLOSE TO\r
+ TLO IOS,RVERSE ;DIRECTORY. GOING IN REVERSE\r
+ POPJ PDP,USLSTA\r
+ CAILE BLK,TOPBLK ;BLOCK LEGAL?\r
+ POPJ PDP, ;NO. ERROR RETURN\r
+ENTRC: MOVEM BLK,FSTBLK(DEVDAT) ;SAVE AS 1ST BLOCK\r
+ HRRM BLK,OBLK(DEVDAT) ;SAVE IN DDB\r
+ AOS UUO ;POINT UUO TO WORD 2\r
+ HRRM BLK,@UUO ;SAVE 1ST BLOCK IN USER'S AREA\r
+ HLL TAC,@UUO ;GET EXTENSION\r
+ HLLM TAC,DEVEXT(DEVDAT) ;SAVE EXTENSION IN DDB ALSO\r
+ TLO IOS,NOLINK\r
+ AOS (PDP)\r
+\f;MARK DIRECTORY ENTRY POINTED TO BY BLK AS TAKEN\r
+MARKDR: PUSHJ PDP,DRPTR ;SET POINTER TO BLOCK IN DIR\r
+ HLRZ TAC,OBLK(DEVDAT) ;PICK UP INDEX\r
+ IDPB TAC,BLK ;MARK DIRECTORY\r
+ TLO IOS,CHNGDR ;DIRECTORY HAS CHANGED\r
+ JRST STOIOS\r
+\r
+;;SET POINTER TO CORRECT DIRECTORY ENTRY\r
+DRPTR: SUBI BLK,1 ;SET FOR ILDB OR IDPB\r
+ IDIVI BLK,7 ;COMPUTE WORD, POSITION\r
+ ADD BLK,OLOC(DEVDAT) ;GET CORRECT ADDRESS\r
+ HRLI BLK,440500 ;MAKE IT A BYTE POINTER\r
+ JUMPE DAT,CPOPJ ;CORRECT FOR POSITION IN WORD\r
+ IBP BLK\r
+ SOJG DAT,.-1\r
+ POPJ PDP,\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
+;SET UP LENGTH OF FILE IN DIRECTORY FOR A SAVE FILE\r
+SETWD4: HLRE TAC1,@UUO ;GET -LENGTH\r
+ MOVNS TAC1 ;+LENGTH\r
+ HRRE TEM,@UUO\r
+ ADD TAC1,TEM ; +START ADDRESS\r
+ TRZ TAC1,1777 ;STORE N-1, WHERE N IS NO OF K\r
+ LSH TAC1,2\r
+ ORM TAC1,26(TAC) ;INTO 2ND WRD OF DIRECTORY\r
+ SOJA UUO,ENTRA ;CONTINUE WITH ENTER\r
+\r
+ENTRD: MOVEI TAC,0 ;GET THE 1ST FREE BLOCK ON TAPE\r
+ PUSHJ PDP,BLKSRC ;AS THE 1ST LOGICAL BLOCK OF THE FILE\r
+ POPJ PDP, ;NONE AVAILABLE\r
+ JRST ENTRC ;CONTINUE WITH ENTER\r
+\f;USETI - SET NEXT INPUT BLOCK TO READ\r
+SETI: TDZ IOS,[XWD IOEND,IODEND]\r
+ SKIPA DAT,DEVDAT\r
+\r
+;USETO - SET NEXT OUTPUT BLOCK TO READ\r
+SETO: MOVEI DAT,1(DEVDAT)\r
+ PUSHJ PDP,WAIT1 ;WAIT FOR BUFFERES TO FILL (OR EMPTY)\r
+ HRRM UUO,IBLK(DAT) ;SET BLOCK NUMBER\r
+ JRST STOIOS ;STOE IOS, POPJ\r
+\r
+;UGETF - GET NEXT FREE BLOCK FOR THIS FILE\r
+GETF: PUSHJ PDP,WAIT1 ;WAIT TILL BUFFERES EMPTY\r
+ PUSHJ PDP,DIRCHK ;ENSURE DIR, IN CORE\r
+ PUSHJ PDP,USRFRE ;GET NEXT AVAILABLE BLOCK\r
+ SKIPN OBLK(DEVDAT) ;HAS AN ENTER OR LOOKUP BEEN DONE?\r
+ SETOB BLK,OBLK(DEVDAT) ;NO, SET SWITCH SO THAT THE NEXT ENTER\r
+ ;WILL FINE FIRST FREE BLOCK ON TAPE\r
+ MOVE TAC,BLK ;TELL USER THE BLOCK NUMBER\r
+ JRST STOTAC\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
+ CAIL BLK,SD ;OR ONE OF DUMP MODES?\r
+ MOVEI TEM,2\r
+ MOVEI TEM,2 ;YES, WHICH ARE CLOSRER\r
+USRFRA: HRRZ BLK,OBLK(DEVDAT) ;CURRENT BLOCK\r
+ TLNE IOS,RVERSE ;FORWARD?\r
+ JRST USRLST ;NO\r
+ ADDI BLK,(TEM) ;YES, FIND NEXT BLOCK AT LEAST N\r
+ CAILE BLK,TOPBLK\r
+ TDZA BLK,BLK\r
+CALNXT: PUSHJ PDP,NXTFRE ;BLOCKS PAST THIS ONE\r
+ JUMPN BLK,STOIOS ;RETURN IF FOUND\r
+ TLOE TEM,1 ;FOUND NONE ON THIS PASS\r
+ JRST NOBLKS ;TAPE IS FULL\r
+ TLC IOS,RVERSE ;REVERSE DIRECTION\r
+ HRRI TEM,1 ;START LOOKING AT NEXT BLOCK IN OTHER DIRECTION\r
+ JRST USRFRA\r
+USRLST: SUBI BLK,(TEM) ;LOOK FOR FREE BLOCK N BEFORE\r
+ SKIPG BLK\r
+ TDZA BLK,BLK ;REVERSE IF AT FRONT OF TAPE\r
+USLSTA: PUSHJ PDP,LSTFRE ;THIS ONE\r
+ JRST CALNXT+1\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
+\f;UTPCLR UUO\r
+UTPCLR: TRNE IOS,UDSD\r
+ POPJ PDP, ;FORGET IT FOR NON-STANDARD\r
+ MOVSI TAC,400000 ;SET DIRECTORY-IN-CORE BIT\r
+ ORM TAC,DEVMOD(DEVDAT)\r
+ TLO IOS,CHNGDR ;DIRECTORY HAS CHANGED\r
+ HRRZ TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY\r
+ HRL TAC1,TAC\r
+ HRRI TAC1,1(TAC) ;BLT POINTER\r
+ SETZM (TAC)\r
+ BLT TAC1,176(TAC) ;LEAVE LAST WORD IN DIR, ALONE\r
+ MOVSI TAC1,17000 ;MARK DIRECTORY AS UNAVAILABLE\r
+ MOVEM TAC1,16(TAC)\r
+ MOVSI TAC1,757000 ;RESERVE BLOCKS 1 AND 2\r
+ MOVEM TAC1,(TAC) ;FOR READ IN MODE LOADER\r
+ MOVSI TAC1,777770 ;MARK BLOCKS 1102-1105 AS\r
+ ORCAM TAC1,NAMSTR-1(TAC) ;UNAVAILABLE ALSO\r
+ JRST STOIOS\r
+\f;CLOSE UUO\r
+UCLS: TLZE IOS,NOLINK ;IS LAST BLOCK NOT LINKED?\r
+ TRNE IOS,UDSD ;AND NOT NON-STD?\r
+ JRST STOIOS ;YES, RETURN\r
+ LDB TAC,PIOMOD ;NO. WRITE LAST BLOCK\r
+ CAIL TAC,16 ;DUMPO MODE?\r
+ JRST CLSDMP ;YES. CLOSE DUMP MODE\r
+ MOVEI TAC,@DEVOAD(DEVDAT) ;LOC OF BUFFER\r
+ MOVE TAC1,1(TAC) ;LINK WORD\r
+ TLON TAC1,-1 ;LINK=-1 IF NOT SPECIFIED\r
+ MOVEM TAC1,1(TAC) ;LINK = -1... EOF\r
+ MOVEM IOS,DEVIOS(DEVDAT) ;SAVE IOS\r
+ JRST OUT ;GO TO WRITE RECORD\r
+\r
+\r
+;RELEASE UUO\r
+UREL: SETZM FSTBLK(DEVDAT) ;ZERO FSTBLK\r
+ PUSHJ PDP,NXTCM2 ;CLEAR OUT DUMP-MODE STUFF\r
+ TRZ IOS,UDSD ;CLEAR NON-STD BIT.\r
+ SKIPG DEVMOD(DEVDAT) ;IF DIRECTORY HAS BEEN\r
+ TLZN IOS,CHNGDR ;MODIFIED IT MUST BE WRITTEN\r
+ POPJ PDP, ;NOT TOUCHED\r
+ TLO IOS,RWDIR+IO ;GOING TO WRITE IT\r
+ PUSHJ PDP,GETDT ;WAIT TILL DTC AVAILABLE\r
+ MOVEI BLK,DIRBLK ;BLOCK NUMBER\r
+ PUSHJ PDP,WRTBLK ;WRITE UT\r
+ PUSHJ PDP,WAIT1 ;WAIT TILL IT HAS BEEN WRITTEN\r
+\r
+;GET DEC TAPE CONTROLLER\r
+GETDT: PUSHJ PDP,GETDCDT ;GET DATA CONTROL. DECTAPE CONTROL\r
+ AOSE DTREQ ;ARGUMENT FOR GETDCD\r
+ MOVEI TAC,QUANT ;HAVE IT NOW\r
+ MOVEM TAC,QUANTM ;KEEP IT FOR QUANT BLOCKS\r
+ MOVEM PROG,USEPRG\r
+ MOVEM DEVDAT,USEWRD ;SAVE ACS NEEDED ON INTERRUPT LEVEL\r
+ JRST SETACT ;LIGHT IOACT AND RETURN\r
+\r
+;HERE TO CLOSE A DUMP MODE FILE\r
+CLSDMP: TLO IOS,DMPOCLS+IO+DMPMOD ;SET SWITCHES\r
+ PUSHJ PDP,GETDT ;GET CONTROL\r
+ SETZM BUF ;ENSURE LINK, WORDCOUNT=0\r
+ JRST OUFULL ;GO WRITE THE BLOCK\r
+\f EXTERN JOBDDT,USRDDT\r
+;DUMP MODE INPUT\r
+DMPI: IFN CPBIT, <\r
+ HRRZ AC2,IBLK(DEVDAT)\r
+>\r
+ PUSHJ PDP,DMPSET ;SET UP DUMP-MODE STUFF\r
+ JRST ZERCOR ;ZER USER'S CORE IF SAVE-MODE\r
+\r
+\r
+;INPUT UUO\r
+UIN: TLZ IOS,IO\r
+ HRRZ BLK,IBLK(DEVDAT) ;BLOCK TO READ\r
+ PUSHJ PDP,STOIOS\r
+ TRNE IOS,UDSD ;NON STANDAR?\r
+ JRST READBF\r
+ JUMPE BLK,EOF ;0 MEANS EOF\r
+ PUSHJ PDP,BLKCHK ;CHECK LEGALITY OF BLOCK NUMBER\r
+ TLNN IOS,DMPMOD ;DUMP MODE?\r
+ CAIE BLK,DIRBLK ;TRYING TO READ DIRECTORY?\r
+\r
+ JRST READBF ;NO. GO READ\r
+\r
+;READING DIRECTORY - GIVE CORE IMAGE IF IT EXISTS\r
+ PUSHJ PDP,DIRCHK ;READ IT IF IT ISN'T IN ALREADY\r
+ HRL TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY\r
+ MOVEI TAC1,@DEVIAD(DEVDAT) ;WHERE USER WANTS IT\r
+ HRRI TAC,1(TAC1) ;LOC OF DATA\r
+ BLT TAC,200(TAC1) ;GIVE IT TO HIM\r
+ PUSHJ PDP,ADVBFF ;ADVANCE BUFFERS\r
+ JFCL\r
+ POPJ PDP,\r
+\f;CHECK VALIDITY OF BLOCK NUMBER\r
+BLKCHK: CAIG BLK,TOPBLK ;LEGAL?\r
+ POPJ PDP, ;YES. RETURN\r
+ POP PDP,TAC\r
+ TROA IOS,IOBKTL ;NO. LIGHT ERROR BIT\r
+\r
+;INPUT BLOCK = 0 - END OF FILE\r
+EOF: TLO IOS,IOEND ;LIGHT EOF BIT\r
+ TLNN IOS,DMPMOD\r
+ JRST STOIOS\r
+ JRST DMPEOF ;GIVE UP CONTROL IF DUMP-MODE\r
+\r
+;ZERO USER'S CORE ON SAVE-MODE INPUT\r
+ZERCOR: MOVEI TAC,JOBDDT(PROG) ;ZERO CORE\r
+ HRLI TAC,1(TAC)\r
+ MOVSS TAC ;BLT POINTER\r
+ HRRZ TAC1,DMPLST(DEVDAT) ;TOP CELL TO ZERO (-175)\r
+ ADDI TAC1,(PROG) ;RELOCATE TO USER AREA\r
+ SETZM -1(TAC) ;ZERO\r
+ BLT TAC,(TAC1)\r
+ SETZM USRDDT ;DDT IS KEPT IN PROTECTED PART\r
+ JRST UIN\r
+\f;DUMP MODE OUTPUT\r
+DMPO: PUSHJ PDP,DIRCHK ;MAKE SURE DIRECTORY IS IN CORE\r
+ IFN CPBIT, <\r
+ HRRZ AC2,OBLK(DEVDAT)\r
+>\r
+ PUSHJ PDP,DMPSET ;SET DUMPO-MODE POINTERS\r
+ JFCL\r
+\r
+;OUTPUT UUO\r
+UOUT: TLO IOS,IO\r
+ TRNE IOS,UDSD ;NON STANDARD?\r
+ JRST UOUT2 ;YES\r
+ PUSHJ PDP,DIRCHK ;NO. MAKE SURE DIRECTORY IS IN CORE\r
+ HRRZ BLK,OBLK(DEVDAT)\r
+ CAIN BLK,DIRBLKK ;CHECK IF WRITING DIRECTORY\r
+ JRST COR2HM ;YES, WRITE CORE IMAGE\r
+ JUMPE BLK,FAKAV ;DONT WRITE IF NO BLOCK GIVEN\r
+ PUSHJ PDP,BLKCHK ;CHECK FOR LEGAL BLOCK\r
+UOUT2: TLNN IOS,DMPMOD ;ALREADY HAVE CONTROL IF DUMP-MODE\r
+\r
+ PUSHJ PDP,GETDT ;GET DEC TAPE CONTROLLER\r
+FILBUF:\r
+DTOCHK: TLNE IOS,DMPMOD ;DUMP MODE?\r
+ JRST DMPFIL ;YES, FILL BUFFER FROM LIST\r
+ MOVSI TAC,@DEVOAD(DEVDAT) ;LOCATION OF BUFFER\r
+ ADD TAC,[XWD 1,BUF];SET TO STORE IN MONITOR BUFFER\r
+ BLT TAC,BUF+177 ;GO BLT IT\r
+ TLZ IOS,NOLINK\r
+\fOUFULL: TRNE IOS,UDSD ;NON-STANDARD?\r
+ JRST OUTBL2 ;YES, NO FILE-STRUCTURED OPERATIONS\r
+ HLRE BLK,BUF ;IS IT?\r
+ JUMPL BLK,LSTBLK ;YES, - LAST BLOCK OF FILE\r
+ JUMPN BLK,OUTBLK ;IF NON-0 - YES\r
+ TLNE IOS,DMPCLS ;NO. LAST BLOCK OF A DUMPO FILE?\r
+ JRST OUTBLK ;YES. LINK MUST STAY 0\r
+OUCOMP: PUSHJ PDP,USRFRE ;COMPUTE NEXT BLOCK\r
+ TLO IOS,NOLINK ;THIS BLOCK NOT LINKED\r
+OUTBLK: HRLM BLK,BUF ;SAVE LINK IN 1ST WORD OF BLOCK\r
+ MOVE TEM,FSTBLK(DEVDAT) ;STORE 1ST BLOCK OF FILE IN WORD\r
+ DPB TEM,[POINT 10,BUF,27]\r
+ HRRZ TEM,OBLK(DEVDAT) ;BLOCK TO WRITE NOW\r
+ HRRM BLK,OBLK(DEVDAT) ;BLOCK TO WRITE NEXT\r
+ MOVE BLK,TEM\r
+ PUSHJ PDP,MARKDR ;MARK BLOCK TAKEN IN DIRECTORY\r
+ SKIPA BLK,TEM\r
+OUTBL2: HRRZ BLK,OBLK(DEVDAT)\r
+ PUSHJ PDP,STOIOS\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
+\f;WRITE LAST BLOCK\r
+LSTBLK: MOVEI BLK,0 ;LINK=0\r
+ JRST OUTBLK ;GO WRITE LAST BLOCK\r
+\r
+;TRYING TO WRITE DIRECTORY - STORE IN CORE\r
+COR2HM: MOVEI TAC,@DEVOAD(DEVDAT) ;WHERE IT IS\r
+ HRLI TAC,1(TAC) \r
+ HRR TAC,DLOC(DEVDAT) ;WHERE TO PUT IT\r
+ MOVEI TAC1,177(TAC)\r
+ BLT TAC,(TAC1)\r
+ TLO IOS,CHNGDR ;REMEMBER TO WRITE IT OUT\r
+ MOVSI TAC1,DVDIRI\r
+ ORM TAC1,DEVMOD(DEVDAT) ;DIR. IS NOW IN CORE\r
+FAKADV: TLZE IOS,DMPMOD ;DUMP MODE?\r
+ JRST THRUTD ;YES. GIVE UP CONTROL\r
+ PUSHJ PDP,ADVBFE ;ADVANCE BUFFERS\r
+ JFCL\r
+ TLZ IOS,NOLINK ;DIRECTORY BLOCK IS NOT LINKED\r
+ SETZM OBLK(DEVDAT)\r
+ JRST STOIOS\r
+\f;SET UP POINTERS AND STUFF FOR DUMP-MODE\r
+DMPSET: TLO IOS,DMPMOD ;LIGHT BIT\r
+ PUSHJ PDP,GETDT ;GET CONTROL\r
+ HRLI UUO,PROG\r
+ PUSHJ PDP,COMCHK ;CHECK VALIDITY OF LIST\r
+ JRST SVADER ;NG. GIVE ADRESS ERROR\r
+ SKIPL TAC,@UUO ;OK. NULL LIST?\r
+ JRST DMPTS1 ;YES. RETURN\r
+ IFN CPBIT, <\r
+ TRNE IOS,UDSD ;NO. NON-STD MODE?\r
+ SOJA DAT,TDUSER ;YES. GO ELSEWHERE\r
+>\r
+DMPST2: SOS UUO ;NO. SAVE START OF LIST (-1)\r
+ MOVEM UUO,DMPLST(DEVDAT)\r
+ JRST CPOPJ1\r
+\r
+DMPTS1: POP PDP,TAC\r
+ JRST THRUTD\r
+\r
+ IFN CPBIT, <\r
+;HERE TO START DUMP-MODE INTO USER AREA DIRECTLY\r
+TOUSRF: JUMPE AC2,NOBLK0 ;CANT READ BLK 0 IN NON-STD DUMP MODE\r
+ ASH DAT,-7 ;NUMBER OF WRDS IN LIST /200\r
+ AOS DAT\r
+ MOVEM DAT,BLKCNT ;SAVE TO UPDATE POSITION\r
+ MOVEI UUO,@UUO ;REAL ADDRESS OF LIST\r
+ MOVEM UUO,USPNTR ;SAVE IT\r
+ MOVEM UUO,SVPNTR\r
+ ADDI TAC,(PROG) ;RELOCATE ADDRESS OF 1ST IOWD\r
+ MOVEM TAC,PNTR ;AND SAVE IT\r
+ MOVE TAC,[JSP DMPADV] ;SET UP LOC FOR WHEN\r
+ MOVEM TAC,DCLOC1 ;IOWD IS EXHAUSTED\r
+ HRRZM PROG,ADRPRG ;SAVE JUST ADDRESS OF PROG\r
+ TLO IOS,NOBUF ;INDICATE DIRECTLY TO USER\r
+ TLNN IOS,IO\r
+ JRST CPOPJ1 ;READING - CONTINUE\r
+ POP PDP,TAC ;WRITING - THIS WILL SAVE LOTS OF TIME\r
+ JRST OUTBL2\r
+>\r
+\f;FILL OUTPUT BUFFER FROM LIST\r
+DMPFIL: MOVSI TAC1,-177\r
+ IFE CPBIT, <\r
+ TRNE IOS,UDSD\r
+ SUB TAC1,ONEONE ;200 DATA WORDS IF NON-STANDARD\r
+>\r
+DMPFLB: PUSHJ PDP,NXTCOM ;GET NEXT COMMAND\r
+ JRST DMPOTH ;END OF LIST\r
+DMPLFA: MOVE TEM,(TAC) ;GET NEXT WORD\r
+ MOVEM TEM,BUF+1(TAC1) ;INTO BUFFER\r
+ AOBJP TAC1,DMPOVR ;BUFFER FULL IF GOES\r
+ AOBJN TAC,.-3 ;GET NEXT WORD FROM COMMAND\r
+ JRST DMPFLB ;GET NEXT COMMAND\r
+\r
+DMPOTH:\r
+ IFE CPBIT, <\r
+ TRNN IOS,UDSD\r
+>\r
+ HRRZM TAC1,BUF ;LIST RAN OUT SAVE WORD COUNT\r
+\r
+ SETZM BUF+1(TAC1) ;ZERO REST OF BUFFER\r
+ HRRZI TAC1,BUF+2(TAC1)\r
+ CAILE TAC1,BUF+177 ;JUST ZERO 1 WORD IF AT TOP\r
+ JRST OUFULL\r
+ HRLI TAC1,-1(TAC1)\r
+ BLT TAC1,BUF+177 ;****TEST IF TOP OF BUFFER\r
+ JRST OUFULL ;NOW WRITE BUFFER\r
+\r
+;BUFFER FULL BEFORE END OF COMMAND\r
+DMPOVR: AOBJN TAC,.+3 ;WAS THAT LAST WORD OF COMMAND?\r
+ PUSHJ PDP,NXTCOM ;YES. GET NEXT\r
+ MOVEI TAC,0\r
+ MOVEM TAC,SVDWRD(DEVDAT) ;NO. SAVE REMAINDER OF COMMAND\r
+DMPOVA: MOVEI TAC,177\r
+ IFE CPBIT, <\r
+ TRNN IOS,UDSD\r
+>\r
+ MOVEM TAC,BUF ;WD CNT =177\r
+ JRST OUFULL ;GO WRITE PART OF STUFF\r
+\r
+;GET NEXT COMMAND FROM LIST\r
+NXTCOM: SKIPN DMPLST(DEVDAT) ;END OF COMMANDS?\r
+ JRST NXTCM2 ;YES. RETURN\r
+ AOSA TAC,DMPLST(DEVDAT) ;GET NEXT COMMAND\r
+NXTCM1: HRRM TAC,DMPLST(DEVDAT) ;STORE GO-TO ADDRESS\r
+ MOVE TAC,@TAC ;GET COMMAND\r
+ JUMPE TAC,NXTCM2 ;END OF LIST\r
+ JUMPG TAX,NXTCM1 ;GO-TO WORD\r
+ ADDI TAC,(PROG) ;REAL COMMAND - ADD RELOCATION\r
+ AOJA TAC,CPOPJ1 ;AND RETURN\r
+;END OF DUMP-MODE LIST\r
+NXTCM2: SETZM SVDWRD(DEVDAT) ;ZERO POINTERS\r
+ SETZM DMPLST(DEVDAT)\r
+ POPJ PDP,\r
+\r
+DMPFLC: SKIPE TAC,SVDWRD(DEVDAT) ;IS THERE ANOTHER COMMAND\r
+ JRST DMPFLA ;YES. GET IT\r
+ JRST DMPTH2 ;NO. THROUGH\r
+\fDTC=210\r
+DTS=214\r
+\r
+;IO INTERFACE\r
+READBF: TLNN IOS,DMPMOD ;HAVE CONTROL IF DUMP-MODE\r
+ PUSHJ PDP,GETDT ;GET DT CONTROL\r
+\r
+READBC: PUSHJ PDP,FNDBLK ;SEARCH FOR RIGHT BLOCK\r
+ MOVE TAC1,[BLKI DTC,300] ;FOUND IT - START READING\r
+\r
+;HERE WITH BLK=BLOCK NUMBER, TAC1=FUNCTION, START SEARCH\r
+RDWRT: PUSH PDP,TAC\r
+ HLLM TAC1,IOWD ;BLKI OR BLKO\r
+ HRLI TAC,-200\r
+ TLNN IOS,RWDIR ;WRITING (READING) DIRECT?\r
+ SKIPA TAC,BFPNTR ;NO. INTO BUF\r
+ HRR TAC,DLOC(DEVDAT) ;YES. LOC OF DIRECTORY\r
+ SOS TAC ;NO. SET FOR FORWARD READ\r
+IOGO: IFN CPBIT, <\r
+ TLNN IOS,NOBUF ;POINTER ALREADY SET UP IF DIRECT IO\r
+>\r
+ MOVEM TAC,PNTR ;POINTER\r
+ OR TAC1,UNIT ;UNIT AND PI CHAN\r
+ MOVEM TAC1,COMAND ;SAVE COMMAND FOR READ OR WRITE\r
+ POP PDP,TAC ;RESTORE SEARCH COMMAND\r
+ CONO DC,DCIN ;SET DATA CONTROL TO REAF\r
+ CONO PI,DCON ;TURN ON DC PI CHANNEL\r
+ HLRI TAC,37\r
+ CONO PI,PIOFF\r
+ CONO DTC,(TAC) ;START TAPE MOVING\r
+ HLRM TAC,DTCINT\r
+ CONO PI,PION\r
+ POPJ PDP, ;DISMISS INTERRUPT\r
+\r
+;HERE FOR AY DATA WORD WITH TAPE IN REVERSE\r
+RVERS: 0\r
+IOWD: BLKI DTC,PNTR ;READ (WRITE) A WORD\r
+ JRST RVTHRU ;POINTER RAN OUT\r
+ SOS PNTR ;POINTER HAS TO BACK UP\r
+ SOS PNTR\r
+ JEN @RVERS ;DISMISS THE INTERRUPT\r
+\f;HERE WHEN POINTER RUNS OUT IN REVERSE\r
+RVTHRU: JSR SHUTDN ;SHUT DOWN DATA CONTROL\r
+ JEN @RVERS ;DISMISS\r
+\r
+;HERE WHEN POINTER RUNS OUT FORWARD\r
+DTATHR: 0\r
+ JSR SHUTDN ;SHUT DOWN DATA CONTROL\r
+ JEN @DTATHR ;DISMISS\r
+\r
+SHUTDN: 0\r
+ CONSZ DC,10000 ;DATA MISSED?\r
+ SETOM ERRFLG ;YES. SET SWITCH\r
+ CONSO DTC,400 ;READING?\r
+ CONO DC,0 ;YES. TERN OFF DC\r
+ CONO PI,DCOFF ;TURN OFF DC PI\r
+ JRST @SHUTDN\r
+\f;COME HERE TO START READING BLOCK NUMBERS\r
+ EXTERN PION,PIOFF\r
+\r
+FNDBLK: HRRZM BLK,BLOCK ;BLOCK WE'RE LOOKING FOR\r
+ SETZM ERRCNT\r
+FNDBL2: SETZM ERRFLG ;RESET DATA MISSED FLAG\r
+ LDB TAC,PUNIT ;GET UNIT NUMBER\r
+ LSH TAC,3 ;POSITION IT\r
+ TRO TAC,DTCCHN ;ADD PI CHANNEL\r
+ MOVEM TAC,UNIT ;SAVE\r
+ MOVE TEM,[JSR SRCH] ;SET UP INTERRUPT CELLS\r
+ MOVEM TEM,DCLOC\r
+ MOVE TEM,[JSR DTATHR]\r
+ IFN CPBIT, <\r
+ TLNN IOS,NOBUF ;DCLOC1 ALREADY SET UP IF DIRECT IO\r
+>\r
+ MOVEM TEM,DCLOC1 ;FOR FORWARD DATA OPERATIONS\r
+ CONSZ DTC,20000 ;IS TAPE ALREADY MOVING/\r
+ JRST FNDBL4 ;YES\r
+\r
+ TRO TAC,323200 ;NO, SET READ BLK NOS., START DELAY\r
+ TLNN IOS,RVERSE ;MOVE TAPE BACKWARDS?\r
+ TRO TAC,10000 ;YES\r
+FNDBL3: IFN CPBIT, <\r
+ PUSH PDP,IOS\r
+ TLZ IOS,NOBUFC ;SET UP DIRCTN NON-0 IF DIRECT IO\r
+ HLLZM IOS,DIRCTN\r
+ POP PDP,IOS\r
+>\r
+ MOVEM IOS,DEVIOS(DEVDAT) ;RESTORE IOS IN CORE\r
+ POPJ PDP, ;AND EXIT\r
+\r
+;HERE TO INITIATE READ OF A TAPE THAT IS MOVING ALREADY\r
+FNDBL4: CONSZ DTC,10000 ;GOING BACKWARDS?\r
+ TRO TAC,10000 ;YES\r
+ TRO TAC,320200 ;SET TO READ BLOCKS, NO DELAY\r
+ JRST FNDBL3 ;GO TELL CONTROL\r
+\f;INTERRUPT HERE TO READ A BLOCK NUMBER\r
+SRCH: 0 \r
+ MOVEM TAC,TEMP ;SAVE TAC\r
+ DATAI DTC,TAC ;NO. READ A BLOCK NUMBER\r
+ SUB TAC,BLOCK ;;PRESENT BLOCK - TARGET BLOCK\r
+ IFN CPBIT, <\r
+ SKIPE DIRCTN ;IF DIRECT IO\r
+ CONSO DTC,10000 ;MUST READ DATA FORWARD\r
+>\r
+ JUMPE TAC,FOUND ;THERE IS ZERO\r
+ HRR TAC,UNIT ;NO. SET UP READ OF NEXT BLOCK\r
+ CONSZ DTC,10000 ;GOING IN REVERSE\r
+ TDC TAC,[XWD 400000,10000] ;YES, SWITCH TURN-AROUND TEST\r
+ SKIPL TAC ;TURN AROUND?\r
+ TRC TAC,12000 ;YES, SWITCH DIR., TUERN AROUND DELAY\r
+ CONO DTC,320200(TAC);TELL CONTROL\r
+ CONO DC,DCIN ;TELL DATA CONTROL ALSO\r
+SRCHXT: MOVE TAC,TEMP ;RESET TAAC\r
+ JEN @SRCH ;AND EXIT THE INTERRUPT\r
+\r
+\r
+ IFN CPBIT, <\r
+;HERE WHERE DUMP-MODE POINTER RUNS OUT\r
+DMPADV: 0\r
+ MOVEM TAC,TEMP\r
+ AOSA TAC,USPNTR ;ADVANCE LOC OF POINTER\r
+DMPAV1: HRRM TAC,USPNTR\r
+ SKIPN TAC,@TAC ;END OF LIST?\r
+ JRST DMPAV3 ;YES. STOP TAPE\r
+ ADD TAC,ADRPRG ;ADD RELOCATION\r
+ JUMPG TAC,DMPAV1\r
+ MOVEM TAC,PNTR ;NEW POINTER\r
+DMPAV2: MOVE TAC,TEMP ;RESTORE TAC\r
+ JEN @DMPADV\r
+\r
+\r
+DMPAV3: JSR SHUTDN ;SHUT DOWN TAPE\r
+ JRST DMPAV2 ;RESTORE TAC AND EXIT THE INTERRUPT\r
+\r
+>\r
+\f;HERE WHEN CORRECT BLOCK NUMBER IS FOUND\r
+FOUND: CONSZ DTC,10000 ;GOING FORWARD?\r
+ JRST IORVRS ;NO\r
+ MOVE TAC,IOWD ;YES. SET BLKI/BLKO INOT PI LOC\r
+FND1: MOVEM TAC,DCLOC\r
+ MOVE TAC,COMAND ;PICK UP READ OR WRITE COMMAND\r
+ TRNE TAC,400 ;WRITE?\r
+ CONO DC,DCOUT ;YES. CONDITION DATA CONTROL\r
+ CONO DTC,360000(TAC) ;START DATA FLOW\r
+ JRST SRCHXT ;AND LEAVE\r
+\r
+IORVS: MOVEI TAC,10000 ;SET IO FOR REVERSE\r
+ ORM TAC,COMAND\r
+ MOVEI TAC,177\r
+ ADDM TAC,PNTR ;READ FROM TOP OF BUFFER DOWN\r
+ MOVE TAC,[JSR RVERS] ;HAVE TO DO SOME STUFF AT INTERRUPT\r
+ JRST FND1\r
+\f;INTERRUPT HERE FOR FLAG CHANNEL\r
+DTCINT: CONSO DTS,37 ;INTERRUPT FOR DECTAPE?\r
+ JRST . ;NO, GO AWAY\r
+ CONSZ DTS,40000 ;YES. JOB DONE ENABLED?\r
+ JRST BLKNUM ;NO. READING BLOCK NUMBERS\r
+ CONSZ DTC,4000 ;YES. TIME FLAG ENABLED?\r
+ JRST TIMINT ;YES. CHECK IF THIS IS A TIME INTERRUPT\r
+DTCIN1: CONO DC,0 ;NO. TURN OFF DATA CONTROL\r
+ JSR DTCSAV ;SAVE ACS\r
+ MOVE DEVDAT,USEWRD ;RESTORE DEVDAT\r
+ MOVE IOS,DEVIOS(DEVDAT) ;AND IOS\r
+ MOVE PROG,USEPRG\r
+ CONSZ DTS,1 ;JOB DONE LIT?\r
+ CONSZ DTS,116 ;AND NO ERORS?\r
+ JRST ERRS ;NO. ERROR\r
+ SKIPF ERRFLG ;DATA MISSED?\r
+ JRST ERRS ;YES. TOO BAD\r
+\r
+;DATA WAS READ IN OR WRITTEN OUT FINE\r
+DTCIN2: TLNE IOS,DMPMOD ;DUMP MODE?\r
+ JRST DMPTHR ;YES. GO ELSEWHERE\r
+ TLNN IOS,SINGL\r
+ JRST .+3\r
+ LDB TAC,[POINT 10,BUF,27] ;GET 1ST BLOCK NO. IF READ\r
+ ;CAME FROM LOOKUP\r
+ MOVEM TAC,IBLK(DEVDAT) ;STORE IN DDB\r
+ TLZE IOS,IOW ;NO. IN IO WAIT?\r
+ PUSHJ PDP,SETIOD ;YES. TAKE OUT OF WAIT\r
+ TLZE IOS,SINGL+RWDIR+DMPCLS ;DIRECTORY OPERATION OR\r
+ ;CLOSING DUMP FILE?\r
+ JRST THRUTP ;YES. LEAVE\r
+ TLNE IOS,IO ;WRITING?\r
+ JRST OUTHRU ;YES\r
+\fEXTERN JBTSTS,PJOBN\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
+ ANDM TAC1,BUF\r
+ MOVEI TAC,@DEVIAD(DEVDAT) ;WHERE TO STORE BLOCK\r
+ ADD TAC,[XWD BUF,1];FROM BUF TO THERE\r
+ MOVEI TAC1,177(TAC)\r
+ BLT TAC,(TAC1) ;TRANSFER IT\r
+ HLRZ BLK,BUF ;NEXT BLOCK TO READ\r
+ TRNE IOS,UDSD ;IF NON-STD\r
+ AOSA BLK,IBLK(DEVDAT);READ SEQUENTIAL BLOCKS\r
+ HRRM BLK,IBLK(DEVDAT) ;SAVE IN DDB\r
+ TRNE IOS,IODTER+IODERR+IOIMPM ;WAS THERE AN INPUT ERROR?\r
+ JRST THRUIN ;YES. DONT ADVANCE BUFFERS\r
+ PUSHJ PDP,ADVBUFF ;GET NEXT BUFFER\r
+ JRST THRUIN ;EMPTY BUF NOT AVAILABLE\r
+\r
+ SKIPE BLK ;EXIT IF EOF OR BLOCK TOO LARGE\r
+ CAILE BLK,TOPBLK ;THE ERROR WILL BE CAUGHT ON THE\r
+ JRST THRUIN ;UUO LEVEL NEXT TIME AROUND\r
+ SOSGE QUANTM ;HAS TAPE HAD CHAN LONG ENOUGH?\r
+ SKIPG DTREQ ;YES. ANYONE ELSE WANT IT?\r
+ JRST READBC ;NO. READ NEXT BLOCK\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
+ CONSZ DTC,100000\r
+ TLO IOS,RVERSE\r
+\f;HERE WHEN TAPE IS DONE\r
+THRUTP: CONSO DTC,200000 ;ON INTERRUPT LEVEL?\r
+ JRST THRUTD ;NO. TAPE IS NOT MOVING\r
+ MOVE TAC,UNIT ;SET TO STOP TAPE\r
+ CONSZ DTC,10000 ;GOING REVERSE?\r
+ TRO TAC,10000 ;YES\r
+ CONO DTC,245000(TAC) ;STOP TAPE, WITH TIME FLAG INTERRUPT ON\r
+ ;ENABLE JOB DONE AS A FLAG FOR DTCINT\r
+THRUTA: SOSL DTREQ ;GIVE UP DATA CONTROL (DECTAPE CONTROL\r
+ SETOM DTAVAL ;WILL BE GIVEN UP AT NEXT INTERRUPT\r
+ TLZ IOS,DMPMOD+NOBUF ;RESET DUMP-MODE BIT\r
+ JRST CLRACT ;RESET IOACT AND RETURN\r
+\r
+THRUTD: PUSHJ PDP,THRUTA ;GIVE UP DATA CONTROL\r
+ SOSL DTREQ ;GIVE UP DECTAPE CONTROL\r
+ SETOM DTAVAL \r
+ CONO DC,0 ;SHUT OFF DATA CONTROL\r
+ CONO PI,DOFF ;AN TURN OF ITS PI CHANNEL\r
+ CONO DTC,0 ;SHUT DOWN DATA CONTROL\r
+ HLLZS DTCINT\r
+ POPJ PDP, ;AND LEAVE\r
+\r
+\f EXTERN CLOCK\r
+\r
+;HERE ON END OF OUTPUT BLOCK\r
+OUTHRU: PUSHJ PDP,ADVBFE ;GET NEXT BUFFER\r
+ JRST THRUTP ;NOT FULL\r
+ JUMPE BLK,THRUTP ;DONE IF BLK=0\r
+ HRRZ BLK,OBLK(DEVDAT) ;NEXT BLOCK TO WRITE\r
+ CAILE BLK,TOPBLK ;LEGAL?\r
+ JRST THRUTP ;NO. CATCH ERROR ON UUO LEVEL\r
+ SOSGE QUANTM ;YES. HAD CHAN LONG ENOUGH?\r
+ SKIPG DTREQ ;AND SOMEONE ELSE WANT IT?\r
+ JRST FILBUF ;NO. GO WRITE NEXT BLOCK\r
+ JRST THRUTP ;YES. GIVE UP TAPE\r
+\r
+TIMINT: CONSO DTS,20 ;TIME FLAG INTERRUPT ON?\r
+ JRST SPRIUS ;NO. THIS IS A SPURIOUS INTERRUPT\r
+ EXCH TAC,TIMREQ ;ANOTHER TAPE CAN NOT BE\r
+ CONO PI,PIOFF ;SELECTED FOR 25 MSEC SO\r
+ IDPB TAC,CLOCK ;PUT IN A CLOCK REQUEST\r
+ CONO PI,PION ;TO WAIT FOR 3 TICKS\r
+ EXCH TAC,TIMREQ ;BEFORE ALLOWING NEXT USER ON\r
+ CONO DTC,0 ;SHUT DOWN DTC\r
+ HLLZS DTCINT\r
+ JEN @DTCCHL ;AND LEAVE\r
+\r
+;HERE WITH AN INTERRUPT WHILE SEARCHING FOR BLOCK NUMBERS\r
+BLKNUM: CONSZ DTS,2 ;END ZONE INTERRUPT?\r
+ JRST TURN ;YES. TURN AROUND\r
+ CONSO DTS,14 ;NO. ILLEGAL OP OR PARITY ERROR?\r
+ JRST DTCINT+1 ;NO. NOT REALLY A DECTAPE INTERRUPT\r
+ JRST DTCIN1 ;YES. GO HANDLE ERROR\r
+\r
+;HERE ON A SPURIOUS DECTAPE INTERRUPT\r
+SPRIUS: CONI DTC,TEMPA ;READ DTC STATUS BITS\r
+ CONO DTC,@TEMPA ;GIVE A CONO TO DTC TO CLEAR INTERRUPT\r
+ JEN @DTCCHL ;EXIT THE INTERRUPT\r
+\r
+TIMREQ: XWD .+1,3 ;E CLOCK TICKS\r
+ SOSL DTREQ ;ALLOW OTHER JOBS\r
+ SETOM DTAVAL ;TO GET DT CONTROL NOW\r
+ POPJ PDP,\r
+\f;COME HERE ON END OF DUMP MODE BLOCK\r
+SVDMTH: IFN CPBIT, <\r
+ TLNE IOS,NOBUF ;DIRECTLY TO USER?\r
+ JRST USDMTH ;YES. ALMOST THROUGH\r
+>\r
+ MOVSI TAC1,-177\r
+ IFE CPBIT, <\r
+ TRNE IOS,UDSD\r
+ SUB TAC1,ONEONE ;SET UP TAC1 WITH COUNT\r
+>\r
+ TLNN IOS,IO\r
+ JRST SVOMIN ;INPUT FILE\r
+ HRRZ BLK,OBLK(DEVDAT) ;OUTPUT FILE, NEXT BLOCK\r
+ JUMPF BLK,DMPTHA ;LAST BLOCK\r
+ IFE CPBIT, <\r
+ TRNE IOS,UDSD ;IF NON-STD MODE\r
+ AOSA OBLK(DEVDAT) ;WRITE CONSECUTIVE BLOCKS\r
+>\r
+ CAIG BLK,TOPBLK ;NOT LAST. LEGAL BLOCK NUMBER?\r
+ POPJ PDP, ;YES. RETURN\r
+\r
+ TRO IOS,IOBKTL ;BLOCK TOO LARGE\r
+DMPTHA: POP PDP,TAC\r
+DMPTH2: SETZM SVDWRD(DEVDAT) ;ZERO DUMP-MODE STUFF\r
+ SETZM DMPLST(DEVDAT)\r
+DMPTH3: TLZE IOS,IOW ;IS IO WAIT?\r
+ PUSHJ PDP,SETIOD ;YES, RESTART JOB\r
+ JRST THRUTP\r
+\r
+;HERE ON END SAVE MODE INPUT BLOCK\r
+SVDMIN: HLRZ BLK,BUF ;NEXT BLOCK NUMBER\r
+ IFE CPBIT, <\r
+ TRNE IOS,UDSD ;NON-STANDARD?\r
+ AOSA BLK,IBLK(DEVDAT) ;YES, READ CONSECUTIVE BLOCKS\r
+>\r
+ HRRM BLK,IBLK(DEVDAT) ;SAVE IN DDB\r
+ JRST CPOPJ1\r
+\r
+ IFN CPBIT, <\r
+;HERE WHEN THROUGH DUMP-MODE DIRECTLY TO USER\r
+USDMTH: MOVEI TAC1,IBLK(DEVDAT)\r
+ TLNE IOS,IO\r
+ MOVEI TAC1,OBLK(DEVDAT) ;SET TAC1 TO RIGHT BLOCK NUMBER\r
+ MOVE TAC,BLKCNT ;UPDATE BLOCK COUNTER\r
+ ADDM TAC,(TAC1)\r
+ JRST DMPTHA ;THROUGH\r
+>\r
+\f;HERE WHEN THROUGH DUMP MODE BLOCK\r
+DMPTHR: PUSHJ PDP,SVDMTH ;END OF BLOCK HOUSEKEEPING\r
+ JRST DMPFLC ;FILL BUFFER FOR NEXT OUTPUT\r
+\r
+;HERE WHEN THROUGH READING A DUMP-MODE BLOCK\r
+DMIFIL: SKIPE TAC,SVDWRD(DEVDAT) ;PARTIAL COMMAND?\r
+ JRST DMIFLB ;YES. CONTINUE\r
+DMIFLA: PUSHJ PDP,NXTCOM ;NO. GET NEXT COMMAND\r
+ JRST DMPTH2 ;END OF LIST - THROUGH\r
+DMIFLB: MOVE TEM,BUF+1(TAC1) ;NEXT DATA WORD\r
+ MOVEM TEM,(TAC) ;GIVE TO USER\r
+ AOBJP TAC1,.+3 ;IF BUFFER IS FULL\r
+ AOBJN TAC,DMIFLB ;GET NEXT WORD\r
+ JRST DMIFLA ;GET NEXT COMMAND\r
+\r
+ AOBJN TAC,.+3 ;BUFFER IO FULL. IS COUNT EXACTLY 177?\r
+ PUSHJ PDP,NXTCOM ;THAT COM, IS DONE. GET NEXT\r
+ JRST DMPTH2 ;END OF LIST - THROUGH\r
+ MOVEM TAC,SVDWRD(DEVDAT) ;SAVE PARTIAL COMMAND FOR NEXT TIME\r
+ JUMPE BLK,DMPEOF ;IF EOF - LIGHT BIT\r
+RDNXT: CAIG BLK,TOPBLK ;BLOCK LEGAL?\r
+ JRST READBC ;GO READ BLOCK NUMBER\r
+ TROA IOS,IOBLKT ;LIGHT ERROR BIT\r
+\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
+ JRST ADRERR ;TYPE ERROR MESSAGE\r
+\r
+\r
+;COME HERE ON ERROR\r
+ERRS: AOS TAC,ERRCNT ;BUMP COUNT\r
+ IFN CPBIT, <\r
+ MOVE TAC1,SVPNTR ;YES. RESET POINTERS\r
+ MOVEM TAC1,USPNTR\r
+ MOVE TAC1,(TAC1) ;RESET PNTR\r
+ ADD TAC1,ADRPRG\r
+ MOVEM TAC1,PNTR\r
+>\r
+ERRS1: CONSO DTS,4 ;IF ILLEGAL OP - DONT RETRY\r
+ CAILE TAC,DTTRY ;ENOUGH REREADS?\r
+ SKIPA ;YES. PERMANENT ERROR\r
+ JRST FNDBL2 ;NO. TRY AGAIN\r
+\r
+;PERMANENT ERROR\r
+\r
+PERMER: CONSZ DTS,10 \r
+ TRO IOS,IODTER ;PARITY\r
+ CONSO DTS,100\r
+ SKIPE ERRFLG\r
+ TRO IOS,IODERR ;MISSING DATA\r
+ CONSZ DTS,4\r
+NOBLK0: TRO IOS,IOIMPM ;ILLEGAL OP\r
+ TLNE IOS,DMPMOD ;DUMP MODE?\r
+ JRST DMPTHR ;YES. NOT THROUGH YET\r
+ TLNN IOS,IO+RWDIR+SINGL ;READING DATA?\r
+ JRST DTCIN2 ;YES. GIVE BUFFER TO USER\r
+ TLZE IOS,IOW\r
+ PUSHJ PDP,SETIOD ;OUT OF IO WAIT\r
+ TLZN IOS,RWDIR+SINGL ;DIRECTORY OPERATION?\r
+ JRST THRUTP ;NO. RETURN TO USER\r
+ PUSHJ PDP,THRUTP ;YES. STOP TAPE\r
+ MOVSI TAC,DVDIRIN ;CLEAR DIRECTORY IN CORE BIT\r
+ ANDCAM TAC,DEVMOND(DEVDAT)\r
+BDDIR: LDB ITEM,PJOBN ;NUMBER OF OFFENDING JOB\r
+ JRST RADDIR ;GO PRINT ERROR MESSAGE\r
+\f INTERN DTABUF\r
+BFPNTR: IOWD 200,BUF+1\r
+ONEONE: XWD 1,1\r
+USEWRD: 0\r
+USEPRG: 0\r
+PNTR: 0\r
+TEMP: 0\r
+TEMPA: 0\r
+BLOCK: 0\r
+QUANTM: 0\r
+ERRCNT: 0\r
+FNDTMP: 0\r
+UNIT: 0\r
+COMAND: 0\r
+ERRFLG: 0\r
+ IFN CPBIT, <\r
+BLKCNT: 0\r
+SVPNTR: 0\r
+USPNTR: 0\r
+ADRPRG: 0\r
+DIRCNT: 0\r
+>\r
+BUF: BLOCK 200\r
+DTAEND: END\r
+\f\r
--- /dev/null
+ IFNDEF EDDT,<\r
+ EDDT=1 ;MAKE EXEC DDT\r
+>\r
+;ALL OTHER REFERENCES TO VERSION # ARE TAKEN CARE OF BY THIS DEFINITION\r
+\r
+DDTVER==22\r
+\r
+SUBTTL 2 JUN 69\r
+REPEAT 0,<\r
+\r
+ \r
+DDT ASSEMBLY INSTRUCTIONS\r
+\r
+THE SOURCE OF DDT,13 WILL ASSEMBLE INTO SEVERAL DIFFERENT\r
+VERSIONS; THE ASSEMBY IS CONTROLED BY THE VALUE ASSIGNED\r
+TO THE SYMBOL "EDDT". THE SYMBOL "EDDT" IS DECODED AS FOLLOWSR:\r
+\r
+BIT 35 =0: ASSEMBLE USER MODE DDT\r
+ =1: ASSEMBLE AN EXECUTIVE MODE DDT\r
+\r
+BIT 34 =0: DO NOT ASSEMBLE THE PAPER TAPE FEATURE INTO DDT\r
+ =1: ASSEMBLE THE PAPER TAPE FEATURES BUT ONLY IF\r
+ ASSEMBLING AN EXECUTIVE MODE DDT\r
+BIT 33 =0; FOR USER MODE DDT ONLY- ASSEMBLE USING THE\r
+ "TTCALL" UUO FOR TELETYPE IO\r
+ =1; FOR USER MODE DDT ONLY- ASSEMBLE USING THE\r
+ "DDTIN" AND "DDTOUT" UUO'S FOR TELETYPE IO\r
+\r
+BIT 32 =1; ASSEMBLE A FILE DDT\r
+\r
+BITS (0-17)\r
+ =0; ASSEMBLE A RELOCATABLE VERSION OF DDT (RELOC 0)\r
+ NOT=0; ASSEMBLE AN ABSOLUTE (NON-RELOCATABLE) VERSION\r
+ OF DDT WITH A STARTING ADDRESS BEING THE\r
+ NUMBER IN BITS 0-17\r
+\r
+(IF THE SYMBOL "EDDT" IS NOT DEFINED AT ALL, DDT WILL BE ASSEMBLED\r
+ WITH EDDT=0.)\r
+\r
+EXAMPLES OF "EDDT" DEFINTIONS:\r
+ EDDT=0 ASSEMBLE A RELOCATABLE USER MODE DDT WITH TELETYPE\r
+ I/O DONE BY THE "TTCALL" UUO\r
+\r
+ EDDT=1 ASSEMBLE A RELOCATABLE EXECUTIVE MODE DDT\r
+\r
+ EDDT=<XWD 4000,3>\r
+ ASSEMBLE AN ABSOLUTE EXECUTIVE MODE DDT\r
+ WITH PAPER TAPE FEATURES, AND WHOSE STARTING\r
+ ADDRESS IS LOCATION 4000.\r
+\r
+EXAMPLE OF A MACRO ASSEMBLY COMMAND:\r
+\r
+.^C\r
+\r
+.R MACRO\r
+\r
+*DSK:UDDT,/C_TTY:,DTA2:DDT.12\r
+EDDT=0\r
+^Z\r
+\r
+END OF PASS 1 ;THIS LINE TYPED BY MACRO\r
+\r
+^Z\r
+\r
+NO ERRORS DETECTED ;TYPED BY MACRO\r
+\r
+PROGRAM BREAK IS 003340 ;TYPED BY MACRO\r
+\r
+* ;TYPED BY MACRO\r
+\r
+\r
+OTHER VERSION OF DDT ARE ASSEMBLED IN A SIMILAR MANNER\r
+BY DEFINING "EDDT": A DIFFERENT WAY WHERE THE EXAMPLE\r
+DEFINED "EDDT=0".\r
+\r
+> ;END OF REPEAT 0\r
+\r
+\f\r
+IFNDEF EDDT,<EDDT=0>\r
+\r
+DEFINE XP (X.,Y.),<\r
+ IF2,<X.=Y.\r
+ INTERN X.>>\r
+\r
+\r
+IFN EDDT&1,<DEFINE HEADER (VERSION),<\r
+ TITLE EDDT V0'VERSION -EXEC MODE DDT\r
+ JOBREL=37\r
+ JOBSYM=36\r
+ ZLOW=40\r
+>>\r
+\r
+IFE EDDT&1,<DEFINE HEADER (VERSION),<\r
+IFE EDDT&10,<\r
+ TITLE UDDT V0'VERSION -USER MODE DDT>\r
+IFN EDDT&10,<\r
+ TITLE FILDDT V0'VERSION -FILE DDT>\r
+ EXTERN JOBREL,JOBSYM,JOBSA\r
+ ZLOW=140>>\r
+\r
+;DO NOT SET LOWER CORE IF EXEC DDT(OK USER OR FILDDT)\r
+IFE EDDT&1,<\r
+JOBVER=137\r
+ LOC JOBVER\r
+ DDTVER ;PUT VERSION # IN JOBVER\r
+JOBDDT=74\r
+ LOC JOBDDT\r
+ XWD DDTEND,DDT\r
+RELOC 0\r
+>\r
+\r
+\r
+IFN EDDT&<XWD -1,0>,<LOC <EDDT>B53>\r
+\r
+HEADER \DDTVER^\r
+ ;THE HEADER MACRO CONSTRUCTS THE TITLE AND VERSION #\r
+\r
+IFN EDDT&10,< CM=2 ;DEFINE SOFTWARE CHANS.\r
+ DP=3\r
+>\r
+\f;DEFINE ACCUMULATORS\r
+\r
+F=0 ;FLAGS\r
+P=1 ;PUSH DOWN\r
+R=<A=2> ;POINTERS TO TABLES, CORE, ETC.\r
+S=<B=3>\r
+W=<C=4> ;CONTAINS DISPATCH ADDRESS IN WORD ASSEMBLER\r
+T=5 ;TRANSFER DATA\r
+W1=6\r
+W2=7\r
+SCH=10 ;MODE CONTROL SWITCH FOR OUTPUT\r
+AR=11 ;MODE CONTROL SWITCH FOR OUTPUT\r
+ODF=12 ;MODE CONTROL SWITCH FOR OUTPUT - CURRENT RADIX\r
+TT=13 ;TEMPORARY\r
+TT1=14 ;TEMPORARY\r
+\r
+;DEFINE I/O DEVICE MNEMONICS FOR DDT USE\r
+PRS=4\r
+TTYY=120\r
+PTRR=104\r
+PTPP=100\r
+\r
+;DEFINE PUSH DOWN LENGTH\r
+LPDL=50 ;MAX LENGTH PUSH DOWN LIST\r
+\r
+;DEFINE BITS FOR USE IN LEFT HALF OF ACCUMULATOR F\r
+COMF=200000 ;COMMA TYPED FLAG\r
+TIF=100000 ;TRUNCATE TO 18 BITS - SET BY SPACE OR COMMA\r
+PTF=100 ; +, -, OR * HAS BEEN TYPED\r
+CTF=400\r
+SF=4 ;SYLLABLE FLAG\r
+QF=1 ;QUANTITY TYPED IN TO WORD ASSEMBLER\r
+\r
+CF=40 ; $ TYPED\r
+CCF=10000 ; $$ TYPED\r
+MF=2 ;MINUS SIGN TYPED IN\r
+LTF=20 ;LETTER TYPED IN TO CURRENT SYLLABLE\r
+ROF=10 ;REGISTER OPEN FLAG\r
+STF=4000\r
+FAF=1000 ; < TYPED\r
+SAF=2000 ; > TYPED\r
+\r
+FPF=20000 ; . TYPED IN\r
+FEF=400000 ; E FLAG\r
+\r
+MLF=200 ;*FLAG\r
+DVF=40000 ;DIVIDE FLAG\r
+\r
+;PID IS 20 IF SYM TAB POINTER IS INDIRECT JOBSYM\r
+PID=0 ;=0 IF SYMBOL TABLE POINTER IS IN JOBSYM\r
+\f\r
+;DEFINE BITS FOR USE IN RIGHT HALF OF ACCUMULATOR F\r
+\r
+ITF=2 ;INSTRUCTION TYPED IF ITF=1\r
+OUTF=4 ;OUTPUT IF OUTF=1\r
+CF1=400 ;OUTPUT 1 REGISTER AS CONSTANT\r
+LF1=2000 ;OUTPUT 1 REGISTER AS FORCED SYMBOLIC OR CONSTANT\r
+Q2F=1 ;NUMBER TYPED AFTER ALT MODE \r
+R20F=10 ;TEMP FLAG USED IN SETUP\r
+SBF=20\r
+NAF=200 ;NEGATIVE ADDRESSES PERMISSABLE\r
+POWF=4000 ;ARGUMENT FOR EXPONENT COMING\r
+\r
+;DEFINE SYMBOL TABLE SYMBOL TYPES\r
+GLOBAL=040000 ;GLOBAL SYMBOL\r
+LOCAL=100000\r
+PNAME=740000 ;PROGRAM NAME\r
+DELI=200000 ;DELETE INPUT\r
+DELO=400000 ;DELETE OUTPUT\r
+\r
+DDT: INTERN DDTEND ;DECLARE END OF DDT AS INTERNAL, FOR\r
+ ; USER TO SEE (USER MODE) AND ONCE ONLY CODE\r
+ ; (MONITOR)\r
+ IFE EDDT&1,< ENTRY DDT\r
+ >\r
+ IFN EDDT&1,< INTERNAL DDT\r
+ DDTX=DDT\r
+ ENTRY DDTX ;NEEDED BY MONITOR>\r
+\r
+;DEFINE $ SYMBOLS INTERNAL TO DDT\r
+OPDEF DDTINT [Z 0,] ;ADDRESS FLAG FOR INTERNAL REGISTERS\r
+\r
+RADIX 10\r
+NBP=8 ;NUMBER OF BREAKPOINTS\r
+DEFINE DBPNT (Z.)<XP $'Z.'B,B1ADR+3*Z.-3>\r
+ZZ=0\r
+REPEAT NBP,<DBPNT \<ZZ=ZZ+1>>\r
+RADIX 8\r
+\r
+\r
+XP $M,MSK\r
+XP $I,SAVPI\r
+\r
+SETUWP=36\r
+\r
+\f;DEFINE I/O DEVICE MNEMONICS\r
+\r
+IFN EDDT&1,<\r
+\r
+XP PI,4B11\r
+XP PTP,100B11\r
+XP PTR,104B11\r
+XP CDR,114B11\r
+XP TTY,120B11\r
+XP LPT,124B11\r
+XP DC,200B11\r
+XP DIS,130B11\r
+XP PLT,140B11\r
+XP CR,150B11\r
+XP DSK,170B11\r
+XP UTC,210B11\r
+XP UTS,214B11\r
+XP DCSA,300B11\r
+XP DCSB,304B11\r
+\r
+XP DF,270B11\r
+XP MTC,220B11\r
+XP MTS,224B11\r
+XP MTM,230B11\r
+XP DLS,240B11\r
+XP MDF,260B11\r
+XP DTC,320B11\r
+XP DTS,324B11\r
+XP TMC,340B11\r
+XP TMS,344B11 >\r
+\r
+;DEFINE EXTENDED OPERATIONS\r
+\r
+XP JOV,2554B11\r
+XP JEN,2545B11\r
+XP HALT,2542B11\r
+\r
+\fIFE EDDT&10,<\r
+DDT: JSR SAVE\r
+ PUSHJ P,REMOVB\r
+ HLRZ T,ESTU ;THIS SEQUENCE INITS SYM TABLE LOGIC\r
+ SUB T,ESTU\r
+ MOVE W,@SYMP\r
+ ADD T,W ;IF THE TOP OF THE UNDEFINED SYM TAB DOES\r
+ TRNE T,-1 ; NOT POINT TO BOTTOM OF REGULAR SYM TABLE,THEN\r
+ HRRZM W,ESTU ; RE-INIT UNDEFINED SYM TABLE POINTER. ESTU.\r
+ MOVE T,PRGM\r
+ SUB T,W ;IF THE SYM TABLE PNTR AND THE PROGRAM\r
+ TSC T,T ; NAME (PRGM) PNTR DO NOT END UP IN THE\r
+ MOVE W1,PRGM ; SAME PLACE. OR THEY DO NOT BOTH START ON\r
+ XOR W1,W ; AN EVEN (OR BOTH ON ODD) LOCATION. OR\r
+ TRNE W1,1 ; PRGM .GE.0, THEN RE-INIT PRGM.\r
+ JRST DDT2 ;EVEN-ODD PROBLEM\r
+ SKIPN T ;POINTERS DON'T END TOGETHER\r
+ SKIPL PRGM ;IF PRGM .GE. 0, THEN RE-INIT\r
+DDT0: MOVEM W,PRGM ;PRGM=C(JOBSYM)\r
+>\r
+\fIFN EDDT&10,<\r
+DDT: CALLI\r
+ MOVEI T,SYMSET\r
+ MOVEM T,JOBREN ;SET REENTER ADDRESS\r
+ MOVEI P,PS\r
+ INIT 1,17\r
+ SIXBIT .DSK.\r
+ Z\r
+ HALT .-3\r
+ SETZM CRASH+3 ;CLEAR PPN\r
+ SETZM COMNDS+3 ;CLEARN PPN IN CASE FILDDT SAVED AFTER STARTING\r
+ SETZM SNAP+3 ;ALSO GOOD PRACTICE TO BE SELF INITIALIZING\r
+ SETZM CRASHS ;ASSUME NO CRASH.SAV(IE. PEEK AT CURRENT MONITOR)\r
+ LOOKUP 1,CRASH\r
+ JRST NOCSH ;LET USER PASS. HE MAY WANT TO PEEK AT MON.\r
+ ; OR JUST WANT TO TYPE OUT VALUE OF SOME SYMBOLS\r
+ SETOM CRASHS ;FLAG CRASH.SAV EXISTS ON DSK\r
+ USETI 1,1\r
+ INPUT 1,RSILST\r
+\r
+ STATZ 1,740000\r
+ HALT .-3\r
+ SETOM RSAVE ;FORCE READING OF "CURRENT" BLOCK\r
+ ; ON FIRST EXAMINE\r
+NOCSH: INIT CM,0\r
+ SIXBIT .SYS.\r
+ XWD 0,CBUF\r
+ HALT .-3\r
+ SETOM COMAND ;ASSUME A COMMAND FILE\r
+ LOOKUP CM,COMNDS\r
+NOLPT: SETZM COMAND ;NO FILE IF NOT FOUND\r
+ SKIPM COMAND\r
+ JRST DD1 ;USE TTY I/O\r
+ INIT DP,1\r
+ SIXBIT .,LPT. ;PREPARE FOR LPT OUTPUT IN AL MODE\r
+ XWD LBUF,0 \r
+ JRST NOLPT ;TREAT AS THO NO FILE\r
+ ENTER DP,SNAP\r
+ JRST NOLPT ;TREAT AS NO FILE IF CAN'T ENTER\r
+ JRST DD1\r
+\r
+REPEAT 0,<\r
+HOW TO COPY MONITOR SYMBOL TABLE INTO FILDDT\r
+1) USE FDDD10 TO LOAD AN UNRUN VERSION OF YOUR MONITOR\r
+ AS SAVED AFTER BUILD OR LOADING.\r
+2) RENAME IT AS CRASH.SAV\r
+3) LOAD A PRISTINE VERSION OF FILDDT AND START IT TO SET\r
+ REENTER ADDRESS.\r
+4) TYPE ^C REENTER\r
+5) FILDDT WILL EXPAND AS NECESSARY AND COPY THE SYMBOL\r
+ TABLE FROM CRASH.SAV INTO ITSELF\r
+6) AFTER CARRIAGE RETURN IS TYPED FILDDT IS DONE.\r
+7) SAVE FILDDT WITH A NEW NAME SO AS NOT TO CONFUSE IT WITH THE\r
+ ORIGINAL FILDDT.SAV\r
+\f\r
+THE MONITOR CAN BE LOADED IN ANY OF THREE WAYS(IN ORDER OF PREFERENCE):\r
+ 1. UNDER TIME SHARING WITH REGULAR LOADER AND COMMON\r
+ 2. UNDER REGULAR 10/30 MONITOR WITH REGULAR 10/30 LOADER & COMMON\r
+ 3. UNDER SPECIAL 10/30 MONITOR(SPMON) WITH BUILD\r
+\r
+THE 3 WAYS LEAVE DDTSYM(36),JOBSYM(116) & T30SYM(131) IN DIFFERENT STATES:\r
+\r
+ DDTSYM JOBSYM T30SYM\r
+\r
+ 1. JUNK S.T.PTR JUNK\r
+ 2. JUNK JUNK(NON-NEG) S.T.PTR\r
+ 3. S.T.PTR S.T.PTR JUNK\r
+>\r
+\r
+DDTSYM=36\r
+\r
+T30SYM=131\r
+\r
+EXTERNAL JOBFF,JOBREN\r
+\r
+SYMSET: MOVEI R,JOBSYM\r
+ PUSHJ P,FETCH\r
+ JRST ERR\r
+ MOVEM T,JOBSYM ;POSSIBLE SYMBOL POINTER\r
+ MOVEI R,DDTSYM\r
+ PUSHJ P,FETCH\r
+ JRST ERR\r
+ MOVEM T,DDTSTP ;YET ANOTHER CANIDATE\r
+ MOVEI R,T30SYM ;ASSUME LOADED BY 10/30\r
+ PUSHJ P,FETCH\r
+ JRST ERR\r
+ SKIPL JOBSYM ;OR IS JOBSYM A POINTER (-VE)?\r
+ JRST REGT30 ;LOADED BY 10/30\r
+ SKIPL DDTSTP ;DDTSYM A VALID POINTER (-VE)?\r
+ MOVE T,JOBSYM ;NO TAKE JOBSYM AS THE POINTER\r
+REGT30: MOVEM T,JOBSYM ;SAVE IT OVER OLD JOBSYM\r
+ HLRES T,T\r
+ MOVMS T,T ;LENGTH OF SYMBOL TABLE\r
+ MOVE W,JOBFF\r
+ ADDI W,1300 ;LEAVE SPAVE FOR COMMAND & LPT BUFFERS.\r
+ ; OR DSK BUFFERS AND EXTRA SYMBOL DEFNS.\r
+ HRRZ W1,W ;SAVE LOC FOR COPY\r
+ ADD W,T ;ADD TABLE LENGTH\r
+ IORI W,1777 ;REQUEST INTEGRAL # OF K.\r
+ CALLI W,11 ;GET CORE\r
+ HALT ;UGH!\r
+ MOVE R,JOBSYM ;WHEREABOUTS OF MONITOR SYMBOLS\r
+ HRRM W1,JOBSYM ;NOW POINT TO FILDDT SYMBOLS\r
+TCOPY: PUSHJ P,FETCH ;GET A WORD\r
+ JRST ERR\r
+ MOVEM T,0(W1) ;STASH IT\r
+ AOS W1\r
+ AOBJN R,TCOPY \r
+ JRST NOLPT ;GO TRY IT\r
+DDTSTP: Z ;SAVE POSSIBLE SYMBOL POINTER\r
+>\r
+\f\r
+\r
+DD1: PUSHJ P,CRF\r
+DD1.5: TLZ F,ROF ;CLOSE ANY OPEN REGISTER\r
+ MOVE T,[XWD SCHM,SCH]\r
+ BLT T,ODF ;LOAD ACS\r
+DD2: CLEARM PRNC ;PARENTHESES COUNT\r
+ MOVEI P,PS\r
+LIS: MOVE T,ESTU\r
+ MOVEM T,ESTUT ;INIT UNDEFINED SYM ASSEM\r
+ TDZ F,[XWD 777777-ROF-STF,LF1+CF1+SBF+2+Q2F]\r
+LIS0: TDZ F,[XWD 777777-ROF-STF-FAF-SAF,NAF]\r
+ CLEARM,WRD\r
+LIS1: CLEARM,FRASE\r
+LIS2: MOVEI T,1\r
+ MOVEM T,FRASE1\r
+ TLZ F,MLF+DVF\r
+L1: TLZ F,CF+CCF+SF+FPF ;TURN OFF CONTROL, SYL, PERIOD FLAG\r
+ CLEARM,SYL\r
+L1RPR: CLEARM,SYM\r
+ MOVEI T,6\r
+ MOVEM T,TEM ;INIT SYMBOL COUNTER\r
+ MOVE T,[POINT 7,TXT]\r
+ MOVEM T,CHP ;SETUP FOR OPEVAL SYMBOL\r
+ CLEARM,DEN\r
+ CLEARM,WRD2\r
+\r
+L2: PUSHJ P,TIN ;PICK UP CHARACTER\r
+ CAIL T,"A"+40 ;LOWER CASE A\r
+ CAILE T,"Z"+40 ;LOWER CASE Z\r
+ JRST .+2\r
+ TRC T,40 ;CHANGE LOWER CASE TO UPPER CASE\r
+ TLNE F,CF ;CONTROL FLAG\r
+ JRST L21\r
+ CAIG T,"Z" ;Z\r
+ CAIGE T,"A" ;A\r
+ JRST .+2\r
+ JRST LET\r
+L21: MOVE R,T\r
+ CAILF T,137 ;DISPATCH TABLE HAS ENTRIES ONLY .LE. 137\r
+ JRST ERR\r
+ IDIVI R,3 ;REMAINDER GIVES COLUMN, QUOTIENT GIVES ROW\r
+ LDB W,BDISP(R+1) ;GET 12 BIT ADDRESS FROM DISPATCH TABLE\r
+ CAIGE W,MULT-DDT ;FIRST EVAL ROUTINE\r
+ JRST DDT(W)\r
+\f MOVE T,SYL\r
+ TLZN F,LTF\r
+ JRST POWER\r
+ MOVE T,[XWD OPEVAL,EVAL] ;GET ADDRESSES OF LOOKUP ROUTINES\r
+ SKIPN WRD ;IF C(WRD)=0, CALL OPEVAL FIRST, OTHERWISE EVAL FIRST\r
+ MOVSS T\r
+ MOVEM T,SAVE\r
+ JRST L213\r
+\r
+L212: HLRZS T,SAVE ;GET ADDRESS OF THE OTHER LOOKUP ROUTINE\r
+ JUMPE T,UND1 ;IF ADR=0, THEN SYMBOL UNDEFINED\r
+L213: PUSHJ P,(T) ;CALL OPEVAL OR EVAL\r
+ JRST L212 ;SYMBOL NOT FOUND\r
+L4: TLZE F,MF\r
+ MOVN T,T\r
+ TLNN F,SF\r
+ CAIE W,LPRN-DDT\r
+ JRST .+2\r
+ JRST LPRN\r
+\r
+ EXCH T,FRASE1\r
+ TLNN F,DVF\r
+ IMULB T,FRASE1\r
+ TLZE F,DVF\r
+ IDIVB T,FRASE1\r
+ CAIGE W,ASSEM-DDT\r
+ JRST DDT(W) ;MULTIPLY OR DIVIDE\r
+ ADDB T,FRASE\r
+ CAIGE W,SPACE-DDT\r
+ JRST DDT(W) ; + - @ ,\r
+\r
+ ADD T,WRD\r
+ TLNE F,TIF ;TRUNCATE INDICATOR FLAG\r
+ HLL T,WRD ;TRUNCATE\r
+ MOVEM T,WRD\r
+ TLNN F,QF\r
+ MOVE T,LWT\r
+ CLEARM,R\r
+ MOVE W1,ESTUT\r
+ CAMN W1,ESTU\r
+ JRST L5\r
+ CAILE W,CARR-DDT\r
+ JRST ERR\r
+L5: CAIG W,RPRN-DDT\r
+ JRST DDT(W)\r
+ PUSH P,KILRET\r
+ SKIPN PRNC\r
+ JRST DDT(W)\r
+\f\r
+ERR: MOVEI W1,"?"\r
+ JRST WRONG1\r
+UNDEF: MOVEI W1,"U"\r
+ JRST WRONG1\r
+WRONG: MOVE W1,[ASCII /XXX/]\r
+WRONG1: MOVEI P,PS\r
+ PUSHJ P,TEXT\r
+ PUSHJ P,LCT ;TYPE TAB\r
+ PUSHJ P,LISTEN ;GOBBLE ANY INPUT CHARACTER\r
+ JFCL\r
+ JRST DD2\r
+RET: MOVEI P,PS\r
+ PUSHJ P,LCT ;COMMON RETURN FOR TAB;,JRST LIS\r
+ JRST DD2\r
+\f\r
+UND1: MOVE R,ESTUT ;UNDEFINED SYM ASSEMBLER\r
+ HLRE S,ESTUT\r
+ ASH S,-1 ;SETUP EVAL END TEST\r
+ PUSHJ P,EVAL2\r
+ CAIN W,ASSEM-DDT\r
+ TLNN F,ROF\r
+ JRST UNDEF\r
+ SKIPE PRNC\r
+ JRST UNDEF\r
+ MOVEI T,"#"\r
+ CAIE W,ASSEM-DDT\r
+ PUSHJ P,TOUT\r
+\r
+ MOVN R,[XWD 2,2]\r
+ ADDB R,ESTUT\r
+ MOVE T,SYM\r
+ TLO T,GLOBAL\r
+ MOVEM T,(R)\r
+\r
+ HRRZ T,LLOCO\r
+ TLNE F,MF\r
+ TLO T,400000\r
+ MOVEM T,1(R)\r
+ MOVEI T,0\r
+ JRST L4\r
+\r
+QUESTN: PUSHJ P,CRF ;LIST UNDEFINED SYMBOLS\r
+ MOVE R,ESTU\r
+QUEST1: JUMPGE R,DD1\r
+ MOVE T, (R)\r
+ SKIPA W1,ESTU\r
+\r
+QUEST2: ADD W1,[XWD 2,2]\r
+ CAME T,(W1)\r
+ JRST QUEST2\r
+ CAME R,W1\r
+ JRST QUEST4\r
+ PUSHJ P,SPT\r
+ PUSHJ P,CRF\r
+QUEST4: ADD R,[XWD 2,2]\r
+ JRST QUEST1\r
+\fNUM: ANDI T,17 ;T HOLDS CHARACTER\r
+ TLNE F,CF+FPF\r
+ JRST NM1\r
+ MOVE W,SYL\r
+ LSH W,3\r
+ ADD W,T\r
+ MOVEM W,SYL\r
+ MOVE W,DEN\r
+ IMULI W,12 ;CONVERT TO DECIMAL\r
+ ADD W,T\r
+ MOVEM W,DEN\r
+ AOJA T,LE1A\r
+\r
+DOLLAR: SKIPA T,[46+101-13] ;RADIX 50 $ TO BE\r
+PERC: MOVEI T,47+101-13 ;PERCENT SIGN\r
+LET: TLC F,SF+FPF ;EXPONENT IFF LTF'*FEF'*(T=105)*SF*FPF=1\r
+ TLZN F,LTF+FEF+SF+FPF\r
+ CAIE T,105 ; E\r
+ TLOA F,LTF\r
+ TLOA F,FEF\r
+ JRST LET1\r
+ TLZN F,MF\r
+ SKIPA W1,SYL\r
+ MOVN W1,SYL\r
+ MOVEM W1,FSV\r
+ CLEARM DEN\r
+LET1: SUBI T,101-13 ;FORM RADIX 50 SYMBOL\r
+LE1A: TLO F,SF+QF\r
+LE2: MOVE W,SYM\r
+ MOVEI R,101-13(T)\r
+ IMULI W,50 ;CONVERT TO RADIX 50\r
+ ADD W,T\r
+ SOSGE TEM ;IGNORE CHARACS AFTER 6\r
+ JRST L2\r
+ MOVEM W,SYM\r
+ IDPB R,CHP\r
+ MOVEM W,SYM\r
+ JRST L2\r
+\fNUM1: EXCH T,WRD2 ;FORM NUMBER AFTER $\r
+ IMULI T,12\r
+ ADDM T,WRD2\r
+ TRO F,Q2F\r
+ JRST L2\r
+\r
+NM1: TLNE F,CF\r
+ JRST NUM1\r
+ MOVEI W1,6 ;FORM FLOATING POINT NUMBER\r
+ AOS NM1A\r
+NM1A: MOVEI W2,0\r
+ MOVSI R,201400\r
+NM1A1: TRZE W2,1\r
+ FMPR R,FT(W1)\r
+ JUMPE W2,NM1B\r
+ LSH W2,-1\r
+ SOJG W1,NM1A1\r
+NM1B: MOVSI W1,211000(T)\r
+ FMPR R,W1 ;COMPUTE VALUE OF NEW DIGIT\r
+\r
+ FADRB R,FH ;ADD VALUE INTO FLOATING NO.\r
+ MOVEM R,SYL\r
+ AOJA T,LE1A\r
+\r
+POWER: TLNN F,FEF\r
+ JRST L4 ;NO EXPONENT\r
+ CAIE W,PLUS\r
+ CAIN W,MINUS\r
+ TROE F,POWF\r
+ TRZA F,POWF\r
+ JRST (W) ; E+-\r
+\r
+ MOVE W2,DEN\r
+ CLEARM FRASE\r
+ MOVEI W1,FT-1\r
+ TLZE F,MF\r
+ MOVEI W1,FT01\r
+ SKIPA T,FSV\r
+POW2: LSH W2,-1\r
+ TRZE W2,1\r
+ FMPR T,(W1)\r
+ JUMPE W2,L4\r
+ SOJA W1,POW2\r
+\fPERIOD: MOVE T,LLOC\r
+ TLNE F,SF ;SYLLABLE STARTED\r
+ MOVE T,DEN\r
+ MOVEM T,SYL\r
+ TLNE F,FPF ;HAS A PERIOD BEEN SEEN BEFORE?\r
+ TLO F,LTF ;YES, TWO PERIODS MAKES A SYMBOL\r
+ TLON F,FPF+SF+QF\r
+ MOVEI T,0\r
+ IDIVI T,400\r
+ SKIPE T\r
+ TLC T,243000\r
+ TLC W1,233000\r
+ FAD T,[0] ;NORMALIZE T AND W1\r
+ FAD W1,[0]\r
+ FADR T,W1\r
+ MOVEM T,FH\r
+ HLLZS NM1A\r
+ MOVEI T,45 ;RADIX 50 PERIOD\r
+ JRST LE2\r
+\r
+QUAN: SKIPA T,LWT ;LAST QUANTITY TYPED\r
+PILOC: MOVEI T, SAVPI\r
+QUAN1: MOVEM T,SYL\r
+QUAN2: TLO F,SF+QF ;WRD,SYL STARTED\r
+ TLZ F,CF+CCF\r
+ JRST L2\r
+\r
+CONTRO: ;SOME KIND OF ALTMODE\r
+IFN EDDT&1,< MOVEI T,"$" ;$\r
+ PUSHJ P,TOUT ;TYPE OUT $\r
+>\r
+ TLOE F,CF\r
+ TLO F,CCF\r
+ JRST L2\r
+\fEVAL: MOVE R,PRGM ;LOOK UP SYMBOL\r
+EVAL0: HRLOI W1,37777+DELI\r
+ HLRE S,@SYMP\r
+ ASH S,-1 ;SETUP END TEST\r
+ JRST EVAL3\r
+\r
+EVAL1: ADD R,[XWD 2,2]\r
+EVAL2: SKIPL R\r
+ MOVE R,@SYMP\r
+ AOJG S,CPOPJ ;TRNASFER IF NO SYMBOL FOUND\r
+EVAL3: MOVE T,(R)\r
+ XOR T,SYM\r
+ TLNN T,PNAME\r
+ TLOA W1,LOCAL\r
+ TDNE T,W1\r
+ JRST EVAL1\r
+ TLNN T,340000\r
+ JRST EVAL1\r
+ MOVE T,1(R)\r
+\r
+CPOPJ1: AOS (P) ;FOUND SYMBOL, SKIP\r
+CPOPJ: POPJ P,\r
+\r
+;BIT 40 - DELETE OUTPUT\r
+; 20 - DELETE INPUT\r
+; 10 - LOCAL\r
+; 04 -GLOBAL\r
+; NO BITS - PROGRAM NAME\r
+\r
+TEXI: PUSHJ P,TEXIN ;INPUT TEXT\r
+ MOVEM T,SYL\r
+ MOVEI W1,5\r
+ MOVEI T-1,0\r
+ PUSHJ P,TEXIN\r
+ CAIN T,33 ;NEW ALT MODE, ESCAPE\r
+ JRST QUAN2\r
+ TLNE F,CF\r
+ JRST SIXBIN\r
+ SKIPA\r
+TEXI2: PUSHJ P,TEXIN\r
+ CAMN T,SYL\r
+ SOJA W1,TEXI3\r
+ ROT T,-7\r
+ LSHC T-1,7\r
+ SOJA W1,TEXI2\r
+\r
+TEXI3: LSHC T-1,-43\r
+ JUMPL W1,QUAN1\r
+ LSH T,7\r
+ SOJA W1,.-2\r
+\fSIXBI1: PUSHJ P,TEXIN ; INPUT TEXT (SIXBIT)\r
+SIXBIN: CAMN T,SYL\r
+ JRST SIXBI2\r
+ ANDI T,77\r
+ TRC T,40\r
+ ROT T,-6\r
+ LSHC T-1,6\r
+ SOJA W1,SIXBI1\r
+SIXBI2: MOVE T,T-1\r
+ JUMPL W1,QUAN1\r
+ LSH T,6\r
+ SOJA W1,.-2\r
+\r
+KILL: TLNN F,LTF ;DELETE SYMBOLS\r
+ JRST ERR\r
+ PUSHJ P,EVAL\r
+ JRST KILL1\r
+ MOVEI T,DELO/200000 ;DELETE OUTPUT\r
+ TLNE F,CCF\r
+ MOVEI T,DELI/200000 ;NO INPUT OR OUTPUT\r
+ DPB T,[POINT 2,(R),1] ;LEFT 2 BITS IN SYMBOL\r
+KILRET: JRST RET ;USED AS A CONSTANT\r
+\r
+\r
+KILL1: MOVE R,ESTU ;REMOVE UNDEFINED SYMS\r
+ JUMPGE R,UNDEF\r
+KILL2: PUSHJ P,EVAL0\r
+ JRST RET\r
+ PUSHJ P,REMUN\r
+ JRST KILL2\r
+\r
+REMUN: MOVE S,[XWD 2,2] ;REMOVE ONE UNDEFINED SYMBOL\r
+ ADDB S,ESTU\r
+ MOVE W,-2(S)\r
+ MOVEM W,(R)\r
+ MOVE W,-1(S)\r
+ MOVEM W,1(R)\r
+ POPJ P,\r
+\fTAG: TLNN F,LTF ; NO LETTERS IS ERROR\r
+ JRST ERR ; GO SAY ERROR\r
+ TLNE F,FAF ; DEFINE SYMBOLS\r
+ JRST DEFIN ;A<B:\r
+ TLNE F,CF ;DEFINE SYMBOL AS OPEN REGISTER\r
+ JRST SETNAM\r
+ MOVE W,LLOCO\r
+ HRRZM W,DEFV\r
+\r
+DEFIN: PUSHJ P,EVAL ;DEFINED SYMBOL?\r
+ JRST DEF1 ;NO - DEFINE\r
+ JRST DEF2 ;YES, REDEFINE\r
+DEF1: MOVN R,[XWD 2,2]\r
+ ADDB R,@SYMP ;MOVE UNDEFINED TABLE 2 REGISTERS\r
+ HRRZ T,ESTU\r
+ SUBI T,2\r
+ HRL T,ESTU\r
+ HRRM T,ESTU\r
+ SKIPGE ESTU\r
+\r
+ BLT T,-1(R)\r
+DEF2: MOVE T,DEFV\r
+ MOVEM T,1(R) ;PUT IN NEW VALUE\r
+ MOVSI T,GLOBAL\r
+ IORB T,SYM\r
+ MOVEM T,(R) ;PUT IN NEW SYM AS GLOBAL\r
+ MOVE R,ESTU\r
+\r
+DEF3: JUMPGE R,RET ;PATCH IN VALUE FOR UNDEF SYM ENTRY\r
+ MOVE T,SYM\r
+ CAME T,(R)\r
+ JRST DEF4\r
+ MOVE S,DEFV\r
+ SKIPGE, 1(R)\r
+ MOVN S,S\r
+ PUSH P,R\r
+ MOVE R,1(R)\r
+ PUSHJ P,FETCH\r
+ JRST ERR\r
+ ADD S,T\r
+ HRRM S,T\r
+ PUSHJ P,DEP\r
+ POP P,R\r
+ PUSHJ P,REMUN\r
+DEF4: ADD R,[XWD 2,2] ;REMOVE THE NOW DEFINED SYMBOL\r
+ JRST DEF3\r
+\fSETNAM: MOVE R,@SYMP ;SET PROGRAM NAME - DOLLAR COLON\r
+SET1: MOVE W,R\r
+SET2: JUMPGE R,UNDEF\r
+ MOVE T,(R)\r
+ ADD R,[XWD 2,2]\r
+ TLNE T,PNAME\r
+ JRST SET2\r
+ CAME T,SYM\r
+ JRST SET1\r
+ MOVEM W,PRGM\r
+ JRST RET\r
+\r
+;***ROUTINES BEYOND HERE EVALUATE THEIR ARGUMENT***\r
+MULT: TLOA F,PTF+MLF ;*\r
+DIVD: TLO F,DVF+PTF ;SINGLE QUOTE\r
+ JRST L1\r
+\r
+ASSEM: JRST PLUS ;#\r
+MINUS: TLO F,MF\r
+PLUS: TLO F,PTF\r
+ JRST LIS2\r
+\r
+LPRN: CAML P,[XWD LPDL-4,0] ;LEFT PARENTHESIS\r
+ JRST ERR\r
+ PUSH P,F ;RECURSE FOR OPEN PAREN\r
+ PUSH P,WRD\r
+ PUSH P,FRASE\r
+ PUSH P,FRASE1\r
+ AOS,PRNC\r
+ JRST LIS\r
+\r
+INDIRECT: HRLZI W,20 ;@\r
+ IORB W,WRD\r
+ TLO F,QF\r
+ JRST LIS2\r
+\r
+ACCF: MOVE R,T ;COMMA PROCESSOR\r
+ACCCF: MOVSI T,.-. ;LEFT HALF OF A,,B\r
+ TLOE F,COMF ;COMMA TYPED BEFORE?\r
+ JRST ACCF1 ;YES\r
+ HRRM R,ACCCF ;NO, SAVE LEFT HALF OF A,,B\r
+ HLLZ T,R\r
+ LDB W1,[POINT 3,WRD,2] ;CHECK FOR IO INSTRUCTION\r
+ IDIVI W1,7\r
+ LSH R,27(W1)\r
+ ADD T,R\r
+ ADDB T,WRD\r
+ JRST SPACE+1\r
+\r
+\fACCF1: MOVEM T,WRD ;SET LEFT HALF OF A,,B\r
+ JRST SPACE+1\r
+\r
+SPACE: TLNE F,QF\r
+ TLO F,TIF\r
+ TLZ F,MF+PTF\r
+ JRST LIS1\r
+\r
+RPRN: TLNN F,QF ;)\r
+ MOVEI T,0\r
+ MOVS T,T\r
+ SOSGE,PRNC\r
+ JRST ERR\r
+ POP P,FRASE1\r
+ POP P,FRASE\r
+ POP P,WRD\r
+ POP P,F\r
+ TLNE F,PTF\r
+ TLNE F,SF\r
+\r
+ JRST RPRN1\r
+ MOVEM T,SYL\r
+ TLO F,QF+SF\r
+ JRST L1RPR\r
+RPRN1: ADDB T,WRD\r
+ TLO F,QF\r
+ JRST L1RPR-1\r
+\f;REGISTER EXAMINATION LOGIC\r
+\r
+LINEF: PUSHJ P,DEPRA ;NEXT REGISTER\r
+IFE EDDT&1,<PUSHJ P,CRNRB\r
+ JRST .+2>\r
+LI0: PUSHJ P,CRF\r
+ AOS T,LLOC\r
+LI1: ;PUSHJ P,LINCHK ;TRUNCATE ADRS (UNLESS INSIDE DDT)\r
+ HRRZM T,LLOC\r
+ HRRZM T,LLOCO\r
+ PUSHJ P,PAD\r
+ MOVEI T,"/"\r
+ TLNE F,STF\r
+ MOVEI T,"!"\r
+ PUSHJ P,TOUT\r
+LI2: TLZ F,ROF\r
+ PUSHJ P,LCT\r
+ MOVE R,LLOCO\r
+ PUSHJ P,FETCH\r
+ JRST ERR\r
+ TLO F,ROF\r
+ TLNE F,STF\r
+ JRST DD2\r
+ JRST CONSYM ;RETURN IS A POPJ\r
+\r
+REPEAT 0,<\r
+LINCHK: CAML T,[DDTINT SAVPI] ;TRUNCATE ADDRESSES\r
+ CAMLE T,[DDTINT BNADR+2]\r
+ HRRZS T\r
+ MOVEM T,LLOC\r
+ MOVEM T,LLOC0\r
+ POPJ P,\r
+>\r
+\r
+VARRW: PUSHJ P,DEPRA ;^\r
+ PUSHJ P,CRF\r
+ SOS T,LLOC\r
+ JRST LI1\r
+\r
+CARR: PUSHJ P,DEPRA ;CLOSE REGISTER\r
+ IFN EDDT&1,<JRST DD1>\r
+ IFE EDDT&1,< PUSHJ P,TIN\r
+ CAIN T,15\r
+ JRST .-2\r
+ JRST DD1.5>\r
+\fOCON: TROA F,LF1+CF1 ;OPEN AS CONSTANT\r
+OSYM: TRZ F,CF1 ;OPEN SYMBOLICALLY\r
+ TROA F,LF1\r
+SUPTYO: TLOA F,STF ;SUPPRESS TYPEOUT\r
+SLASH: TLZ F,STF ;TYPE OUT REGISTER\r
+ TLNN F,QF ;WAS ANY QUANTITY TYPED?\r
+ JRST SLAS1 ;NO. DO NOT CHANGE MAIN SEQUENCE\r
+ MOVE R,LLOC ;YES. SAVE OLD SEQUENCE AND\r
+ MOVEM R,SAVLOC\r
+ HRRZM T,LLOC ;PUSHJ P,LINCHK ;TRUNCATE ADRS- SET UP NEW SEQUENCE\r
+SLAS1: HRRZM T,LLOCO\r
+ JRST LI2\r
+\r
+ICON: TLNN F,ROF ;REGISTER OPENED OR ERR\r
+ JRST ERR\r
+ PUSHJ P,DEPRS\r
+ JRST SLAS1\r
+\fTAB: PUSHJ P,DEPRS ;OPEN REGISTER OF Q\r
+ MOVEI T,-1(T)\r
+ EXCH T,LLOC ;SET UP NEW SEQUENCE AND\r
+ MOVEM T,SAVLOC ;SAVE OLD SEQUENCE\r
+ HRROI T,700000 ;3 RUBOUTS\r
+ PUSHJ P,TEXTT\r
+ JRST LI0\r
+\r
+DEPRA: MOVE R,SAVLOC\r
+ TLNE F,CF ;RESTORE OLD SEQUENCE IF $CR,$CF, OR\r
+ EXCH R,LLOC ;IF $^ OR $BS WAS TYPED\r
+ MOVEM R,SAVLOC ;SETUP "NEW" OLD SEQUENCE\r
+ TLNE F,ROF ;IF REGISTER IS BEING CHANGED\r
+ TLNN F,QF ;REMOVE ALL PREVIOUS UNDEFINED\r
+ JRST DEPRS ;SYMBOL REFERENCES TO IT\r
+ MOVE R,ESTU\r
+ MOVEM W1,ESTU\r
+DEPRA2: JUMPGE R,DEPRS\r
+ HRRZ W,1(R)\r
+ CAMN W,LLOCO\r
+ PUSHJ P,REMUN\r
+ ADD R,[XWD 2,2]\r
+ JRST DEPRA2\r
+\r
+EQUAL: TROA F,LF1+CF1 ;=\r
+PSYM: TRZ F,CF1 ;@\r
+ TRO F,LF1\r
+ PUSHJ P,CONSYM\r
+ JRST RET\r
+\r
+R50PNT: LSH T,-36 ;RADIX 50 SYMBOL PRINTER\r
+ TRZ T,3\r
+ PUSHJ P,TOC\r
+ PUSHJ P,TSPC\r
+ MOVEI W1,LWT ;SETUP FOR SPT\r
+ JRST SPT\r
+\r
+SIXBP: MOVNI W2,6 ;SIXBIT PRINTER\r
+ MOVE W1,LWT\r
+SIXBP1: MOVEI T,0\r
+ ROTC T,6\r
+ ADDI T,40\r
+ PUSHJ P,TOUT\r
+ AOJL W2,SIXBP1\r
+ POPJ P,\r
+\f;MODE CONTROL SWITCHES\r
+\r
+TEXO: MOVEI R,TEXTT-HLFW ;$T ASSUME 7 BIT ASCII\r
+ MOVE T,WRD2\r
+ CAIN T,6 ;CHECK FOR $6T\r
+ MOVEI R,SIXBP-HLFW ;SET MODE SWITCH FOR SIXBIT\r
+ CAIN T,5 ;CHECK FOR $5T\r
+ MOVEI R,R50PNT-HLFW ;SET MODE SWITCH FOR RADIX 50\r
+HWRDS: ADDI R,HLFW-TFLOT ;H\r
+SFLOT: ADDI R,TFLOT-PIN ;F\r
+SYMBOL: ADDI R,PIN-FTOC ;S\r
+CON: ADDI R,FTOC ;C\r
+ HRRZM R,SCH\r
+ JRST BASE1\r
+\r
+RELA: TRZE F,Q2F ;CHANGE ADDRESS MODE TO RELATIE\r
+ JRST BASECH\r
+ MOVEI R,PADSO-TOC\r
+ABSA: ADDI R,TOC ;A\r
+ HRRZM R,AR\r
+ JRST BASE1\r
+\r
+BASECH: MOVE T,WRD2 ;$NR CHANGE OUTPUT RADIX TO N, N>1\r
+ CAIGE T,2\r
+ JRST ERR\r
+ HRRZM T,ODF\r
+BASE1: MOVS S,[XWD SCHM,SCH]\r
+ TLNN F,CCF\r
+ JRST LIS1\r
+ BLT S,ODFM ;WITH $$, MAKE MODES PERMANENT\r
+ JRST RET\r
+\r
+SEMIC: MOVEM T,LWT ;SEMICOLON TYPES IN CURRENT MODE\r
+ JRST @SCH\r
+\f;GO AND EXECUTE LOGIC\r
+\r
+GO: HRLI T,(JRST) ;G\r
+IFE EDDT&1,<\r
+ TLON F,QF\r
+ HRR T,JOBSA> ;GET STARTING ADDRESS\r
+\r
+XEC: TLNN F,QF ;X\r
+ JRST ,ERR\r
+XEC0: MOVEM T,TEM\r
+ PUSHJ P,CRF\r
+ PUSHJ P,TTYLEV\r
+ PUSHJ P,INSRTB\r
+ JSP T,RESTORE\r
+ XCT,TEM\r
+XEC1: JRST DDT ;USED AT PROC0\r
+ JSR,SAVE\r
+ PUSHJ P,REMOVB\r
+ PUSHJ P,CRF\r
+ JRST DD1\r
+\f;BREAK POINT LOGIC\r
+BP1: REPEAT NBP,< 0 ;JSR TO HERE FOR BREAKPOINT\r
+ JSA T, BCOM\r
+ 0 ;HOLDS INSTRUCTION WHILE BREAKPOINT IS IN PLACE\r
+>\r
+\r
+B1INS=BP1+2\r
+BPN=.-3\r
+\fBCOM: 0\r
+ POP T,LEAV ;MOVE INSTRUCTION TO LEAV\r
+ MOVEI T,B1SKP-B1INS+1(T)\r
+ HRRM T,BCOM3 ;CONDITIONAL BREAK SETUP\r
+ MOVEI T,B1CNT-B1SKP(T)\r
+ HRRM T,BCOM2 ;PROCEDE COUNTER SETUP\r
+ MOVE T,BP1-B1CNT(T)\r
+IFN EDDT&1,< TLZ T,010000 ;TURN OFF USER MODE BIT>\r
+ HLLM T,LEAV1 ;SAVE FLAGS FOR RESTORING\r
+ EXCH T,BCOM\r
+\r
+BCOM3: SKIPE B1SKP ;ADDR MOD TO LOOK AT COND. INST.\r
+ XCT @.-1\r
+BCOM2: SOSG B1CNT ;ADDR MOD TO LOOK AT PROCEED COUNTER\r
+ JRST BREAK\r
+\r
+ MOVEM T,AC0+T\r
+ LDB T,[POINT 9,LEAV,8] ;GET INSTRUCTION\r
+ CAIL T,264 ;JSR\r
+ CAILE T,266 ;JSA,JSP\r
+ TRNN T,700 ;UUO\r
+ JRST PROC1 ;MUST BE INTERPRETED\r
+ CAIE T,260 ;PUSHJ\r
+ CAIN T,256 ;XCT\r
+ JRST PROC1 ;MUST BE INTERPRETED\r
+ MOVE T,AC0+T\r
+ JRST 2,@LEAV1 ;RESTORE FLAGS, GO TO LEAV\r
+\r
+LEAV1: XWD 0,LEAV\r
+\fBREAK: JSR SAVE ;SAVE THE WORLD\r
+ PUSHJ P,REMOVB ;REMOVE BREAKPOINTS\r
+ SOS T,BCOM3\r
+ HRRZS T ;GET ADDR OF BREAKPOINT JUST HIT\r
+ SUBI T,B1ADR-3 ;CHANGE TO ADDRESS OF $0B\r
+ IDIVI T,3 ;QUOTIENT IS BREAK POINT NUMBER\r
+ HRRM T,BREAK2 ;SAVE BREAK POINT #\r
+ MOVE W1,[ASCII /$0B>/] ;PRELIMINARY TYPEOUT MESSAGE\r
+ SKIPG @BCOM2 ;TEST PROCEED COUNTER\r
+ TRO W1,">"_1 ;CHANGE T TO /$0B>>/\r
+ DPB T,[POINT 4,W1,13] ;INSERT BREAK POINT # IN MESSAGE\r
+ PUSHJ P,TEXT2\r
+ MOVE T,BCOM\r
+ HLLM T, SAVPI ;SAVE PROCESSOR FLAGS\r
+ MOVEI T,-1(T)\r
+ PUSHJ P,PAD ;TYPE PC AT BREAK\r
+ HRRZ T,@BCOM3\r
+ HRRM T,PROC0 ;SETUP ADDRESS OF BREAK\r
+ HLRZ T,@BCOM3\r
+\r
+ JUMPE T,BREAK1 ;TEST FOR REGISTER TO EXAMINE\r
+ PUSHJ P,LCT ;PRINT TAB\r
+ HLRZ T,@BCOM3\r
+ PUSHJ P,LI1 ;EXAMINE REGISTER C($NB)LEFT\r
+BREAK1: MOVSI S,400000\r
+BREAK2: ROT S,.-. ;ROT BY # OF BREAK POINT\r
+ PUSHJ P,LISTEN ;DONT PROCEED IF TTY KEY HIT\r
+ TDNN S,AUTOPI ;DONT PROCEED IF NOT AUTOMATIC\r
+ JRST RET ;DONT PROCEED\r
+ JRST PROCD1\r
+\r
+PROCEDE: TLNN F,QF ;N$P ;PROCEED AT A BREAKPOINT\r
+ MOVEI T,1\r
+ MOVEM T,@BCOM2\r
+ HRRZ R,BCOM3\r
+ PUSHJ P,AUTOP\r
+PROCD1: PUSHJ P,CRF\r
+ PUSHJ P,TTYLEV\r
+PROC0: HRRZI R,XEC1 ;MODIFIED TO ADDR OF BREAKPOINT\r
+ PUSHJ P,FETCH\r
+ JRST BPLUP1 ;ONLY GET HERE IF MEMORY SHRANK\r
+ MOVEM T,LEAV\r
+ PUSHJ P,INSRTB\r
+ JRST PROC2\r
+\r
+PROC1: MOVE T,AC0+T\r
+ JSR SAVE\r
+ JFCL\r
+PROC2: MOVEI W,100\r
+ MOVEM W,TEM1 ;SETUP MAX LOOP COUNT\r
+ JRST IXCT5\r
+\fIXCT4: IFE EDDT&1,< SUBI T,041\r
+ JUMPE T,BPLUP\r
+ AOJGE T,IXCT6> ;DONT PROCEDE FOR INIT\r
+ ;DONT INTERPRET FOR SYSTEM UUOS\r
+ MOVEM R,40 ;INTERPRET FOR NON-SYSTEM UUOS\r
+ MOVEI R,41\r
+IXCT: SOSL TEM1\r
+ PUSHJ P,FETCH\r
+ JRST BPLUP ;BREAKPOINT LOOPING OR FETCH FAILED\r
+ MOVEM T,LEAV\r
+IXCT5: IFN EDDT&1,<\r
+ LDB T,[POINT 9,LEAV,8] ;GET INSTRUCTION\r
+ CAIN T,254 ;DON'T DO ANYTHING TO JRST IN EXEC MODE\r
+ JRST IXCT6>\r
+ HRLZI 17,AC0\r
+ BLT 17,17\r
+ MOVEI T,@LEAV\r
+ DPB T,[POINT 23,LEAV,35] ;STORE EFFECTIVE ADDRESS\r
+ LDB W1,[POINT 4,LEAV,12] ;PICK UP AC FIELD\r
+ LDB T,[POINT 9,LEAV,8] ;PICK UP INSTRUCTION FIELD\r
+ MOVEI P,PS\r
+ CAIN T,260\r
+ JRST IPUSHJ ;INTERPRET PUSHJ\r
+\r
+ CAIN T,264\r
+ JRST IJSR ;INTERPRET JSR\r
+ CAIN T,265\r
+ JRST IJSP ;INTERPRET JSP\r
+ CAIN T,266\r
+ JRST IJSA ;INTERPRET JSA\r
+ MOVE R,LEAV\r
+ TRNN T,700\r
+ JRST IXCT4 ;INTERPRET UUO\r
+ CAIN T,256\r
+ JRST IXCT ;INTERPRET XCT\r
+\r
+IXCT6: JSP T,RESTORE\r
+LEAV: 0 ;INSTRUCTION MODIFIED\r
+ JRST @BCOM\r
+ AOS BCOM\r
+ JRST @BCOM\r
+\r
+BPLUP: PUSHJ P,REMOVB ;BREAKPOINT PROCEED ERROR\r
+BPLUP1: JSR SAVE\r
+ JFCL\r
+ JRST ERR\r
+\fIPUSHJ: DPB W1,[POINT 4,CPUSHP,12] ;STORE AC FIELD INTO A PUSH\r
+ CLEARM,TEM3\r
+ MOVE T,LEAV\r
+ JRST RESTR1\r
+\r
+IJSA: MOVE T,BCOM ;INTERPRET JSA\r
+ HRL T,LEAV\r
+ EXCH T,AC0(W1)\r
+ JRST IJSR2\r
+\r
+IJSR: MOVE T,BCOM ;INTERPRET JSR\r
+ HLL T,SAVPI\r
+IJSR2: MOVE R,LEAV\r
+ PUSHJ P,DEP\r
+ JRST BPLUP ;ERROR, CAN'T STORE\r
+ AOSA T,LEAV\r
+IJSR3: MOVE T,LEAV\r
+ JRST RESTORE\r
+\r
+IJSP: MOVE W,BCOM ;INTERPRET JSP\r
+ HLL T,SAVPI\r
+ MOVEM W,AC0(W1)\r
+ JRST IJSR3\r
+\r
+;INSERT BREAKPOINTS\r
+\r
+INSRTB: MOVE S,[JSR BP1]\r
+INSRT1: SKIPE R,B1ADR-BP1(S)\r
+ PUSHJ P,FETCH\r
+ JRST INSRT3\r
+ MOVEM T,B1INS-BP1(S)\r
+ MOVE T,S\r
+ PUSHJ P,DEP\r
+ JFCL ;HERE ONLY IF CAN'T WRITE IN HIGH SEG\r
+INSRT3: ADDI S,3\r
+ CAMG S,[JSR BPN]\r
+ JRST INSRT1\r
+ POPJ P,\r
+\r
+;REMOVE BREAKPOINTS\r
+\r
+REMOVB: MOVEI S,BNADR\r
+REMOV1: MOVE T,B1INS-B1ADR(S)\r
+ SKIPE R,(S)\r
+ PUSHJ P,DEP\r
+ JFCL ;HERE ONLY IF NO WRITE IN HIGH SEG\r
+ SUBI S,3\r
+ CAIL S,B1ADR\r
+ JRST REMOV1\r
+ IFN EDDT&1,<JRST TTYRET>\r
+ IFE EDDT&1,<POPJ P,>\r
+\r
+;IN EXEC MODE, SAVE UP TTY STATUS ;IN USER MODE, DONE BY SAVE\r
+\f;ALL $B COMMANDS GET HERE IN FORM: <A>$<N>B\r
+\r
+\r
+BPS: TLZE F,QF ;HAS <A> BEEN TYPED?\r
+ JRST BPS1 ;YES\r
+ TRZE F,Q2F ;NO, HAS <N> BEEN TYPED?\r
+ JRST BPS2 ;YES\r
+ MOVE T,[XWD B1ADR,B1ADR+1] ;NO, COMMAND IS $B - CLEAR ALL BREAKPOINTS\r
+ CLEARM B1ADR\r
+ BLT T,AUTOPI ;CLEAR OUT ALL BREAKPOINTS AND AUTO PROCEDE REGESTER\r
+ JRST RET\r
+\r
+BPS1: TRZN F,Q2F ;HAS <N> BEEN TYPED?\r
+ JRST BPS3 ;NO\r
+ MOVE R,T ;YES, PROCESS THE COMMAND A$NB\r
+ TRO F,2\r
+BPS2: MOVE T,WRD2\r
+ CAIL T,1\r
+ CAILE T,NBP\r
+ JRST ERR\r
+ IMULI T,3\r
+ ADDI T,B1ADR-3\r
+ TRZN F,2\r
+ JRST MASK2\r
+ EXCH R,T\r
+ JRST BPS5\r
+\r
+BPS3: MOVEI R,B1ADR ;PROCESS THE COMMAND A$B\r
+BPS4: HRRZ W,(R)\r
+ CAIE W,(T)\r
+ SKIPN (R)\r
+ JRST BPS5\r
+ ADDI R,3\r
+ CAIG R,BNADR\r
+ JRST BPS4\r
+ JRST ERR\r
+BPS5: MOVEM T,(R)\r
+ CLEARM,1(R)\r
+ CLEARM,2(R)\r
+\r
+AUTOP: SUBI R,B1ADR ;AUTO PROCEDE SETUP SUBROUTINE\r
+ IDIVI R,3\r
+ MOVEI S,1\r
+ LSH S,(R)\r
+ ANDCAM S,AUTOPI\r
+ TLNE F,CCF\r
+ IORM S,AUTOPI\r
+ POPJ P,\r
+\f;FETCH AND DEPOSIT INTO MEMORY\r
+\r
+\r
+DEPRS: MOVEM T,LWT ;DEPOSIT REGISTER AND SAVE AS LWT\r
+ MOVE R,LLOCO ;QUAN TYPED IN REGIS EXAM\r
+ TLZE F,ROF\r
+ TLNN F,QF\r
+ POPJ P,0\r
+ ;CAIL R,DDT\r
+ ;CAILE R,DDREND-1\r
+ PUSHJ P,DEP ;STORE AWAY\r
+ JRST ERR ;CAN'T STORE (IN DDT OR OUT OF BOUNDS)\r
+ POPJ P, ;RETURN\r
+\r
+;DEPOSIT INTO MEMORY SUBROUTINE\r
+\r
+IFE EDDT&10,<\r
+DEP: IFE EDDT&1,<\r
+ JSP TT1,CHKADR ;LEGAL ADDRESS?\r
+\r
+ JRST DEP4 ;YES BUT IN HI SEGMENT>\r
+ TRNN R,777760\r
+ JRST DEPAC ;DEPOSIT IN AC\r
+\r
+IFE EDDT&10,< MOVE T,(R) >\r
+ JRST CPOPJ1 ;SKIP RETURN\r
+\r
+DEPAC: MOVEM T,AC0(R) ;DEPOSIT IN AC\r
+ JRST CPOPJ1 ;SKIP RETURN\r
+\r
+IFE EDDT&1,<\r
+DEP4: MOVEI W,0\r
+ CALLI W,SETUWP ;IS HI SEGMENT PROTECTED? TURN OFF\r
+ POPJ P, ;PROTECTED, NO SKIP RETURN\r
+ MOVEM T,(R) ;STORE WORD IN HI SEGMENT\r
+ TRNE W,1 ;WAS WRITE PROTECT ON?\r
+ CALLI W,SETUWP ;YES, TURN IT BACK ON\r
+ JFCL\r
+ JRST CPOPJ1 ;SKIP RETURN\r
+>\r
+> ;END NOT-FILDDT COND.\r
+\r
+IFN EDDT&10,<DEP=CPOPJ> ;ALWAYS OK NO-OP IF FILE DDT\r
+\f;FETCH FROM MEMORY SUBROUTINE\r
+\r
+FETCH: IFE EDDT&10,<IFE EDDT&1,\r
+ <JSP TT1,CHKADR ;LEGAL ADDRESS?\r
+ JFCL> ;HIGH OR LOW OK FOR FETCH\r
+ TRNN R,777760 ;ACCUMULATOR?\r
+ SKIPA T,AC0(R) ;YES\r
+ MOVE T,(R) ;NO\r
+ JRST CPOPJ1 ;SKIP RETURN FOR LEGAL ADDRESS>\r
+\r
+IFN EDDT&10,< SKIPN CRASHS ;CRASH.SAV EXISTS?\r
+ JRST MONPEK ;NO - GO PEEK AT RUNNING MONITOR\r
+ MOVEM R,TEM4 ;SAVE THE AOBJN POINTER\r
+ HRRZ R,R ;STRIP OFF POSSIBLE COUNT\r
+ ADD R,OFFSET\r
+ IDIVI R,4000 ;R HAS LOCATION\r
+ CAIL R,30 ;R=NO. OF INPTS R+1=LOCATION\r
+ POPJ P, ;LARGER THAN 48K\r
+ TRNN S,777000 ;S=R+1\r
+ JUMPE R,RSDNT ;LOC IS IN RESIDENT BLOCKJ\r
+ CAMN R,RSAVE ;IS LOC INCORE ?\r
+ JRST INCORE ;S=LOC\r
+ MOVEM R,RSAVE ;INPT NO.\r
+ IMULI R,20 ;16/INPT\r
+ USETI 1,1(R) ;BLOK 0 DOES NOT EXIST\r
+ INPUT 1,CURLST ;GET 16 BLKS\r
+ STATZ 1,740000 \r
+ HALT .-2 ;YEP\r
+INCORE: SKIPA T,CURENT(S)\r
+RSDNT: MOVE T,RSIDNT(S)\r
+ MOVE R,TEM4 ;RESTORE AOBJN POINTER\r
+ JRST CPOPJ1\r
+TEM4: 0 ;HOLD AOBJN POINTER\r
+MONPEK: HRRZ T,4 ;REMOVE COUNT\r
+ CALLI T,33 ;DO PEEK UUO\r
+ JRST CPOPJ1 ;RETURN VALUE IN AC T\r
+>\r
+IFE EDDT&1,< ;DO ADDRESS CHECKS ONLY IN USER MODE\r
+CHKADR: HRRZ TT,JOBREL ;GET HIGHEST ADDRESS IN LOW SEGMENT\r
+ CAIL TT,(R) ;CHECK FOR WITHIN LOW SEGMENT\r
+ JRST 1(TT1) ;ADDRESS IS OK IN LOW SEGMENT, SKIP RETURN\r
+ HRRZ T,JOBHRL ;GET HIGHEST ADDRESS IN HIGH SEGEMENT\r
+ TRNE R,400000 ;IS THE ADDRESS IN HIGH SEGMENT?\r
+ CAIGE TT,(R) ;IS THE ADR TO BIG FOR HIGH SEGMENT?\r
+ POPJ P, ;NO, YES- ILL. ADR.\r
+ JRST 0(TT1)\r
+> ;END OF IFE EDDT&1\r
+\r
+IFN EDDT&1,<CHKADR==CPOPJ> ;NO ADDRESS CHECKS IN EXEC MODE\r
+\fFIRARG: MOVEM T,DEFV\r
+ TLO F,FAF\r
+ JRST ULIM1\r
+ULIM: TLO F,SAF\r
+ HRRZM T,ULIMIT\r
+ULIM1: TLNN F,QF\r
+ JRST ERR\r
+ JRST LIS0\r
+\r
+\r
+LOOK: SKIPL R,PRGM ;LOOK UP SYMBOL\r
+ MOVE R,@SYMP\r
+ HLRE S,@SYMP\r
+ ASH S,-1 ;SETUP COUNT FOR LENGTH OF SYM TABLE\r
+ TLZ F,400000\r
+ HRLZI W2,DELO+DELI\r
+ MOVEM T,TEM\r
+\r
+LOOK1: TDNE W2,(R)\r
+\r
+ JRST LOOK3\r
+ MOVE T,(R)\r
+ TLNN T,PNAME ;NAME\r
+ TLOA W2,LOCAL\r
+ SKIPA T,TEM\r
+ JRST LOOK3\r
+ MOVE W,1(R)\r
+ XOR W,T\r
+ JUMPL W,LOOK3\r
+ SUB T,1(R)\r
+ JUMPL T,LOOK3\r
+ JUMPGE F,LOOK2\r
+ MOVE W,1(R)\r
+ SUB W,1(W1)\r
+ JUMPLE W,LOOK3\r
+LOOK2: HRR W1,R ;POINTER BEST VALUE SO FAR\r
+ TLO F,400000\r
+ JUMPE T,SPT0\r
+LOOK3: ADD R,[XWD 2,2]\r
+ SKIPL R\r
+ MOVE R, @SYMP\r
+ AOJLE S,LOOK1 ;TERMINATING CONDITION\r
+ MOVE T,TEM\r
+ TLNE F,400000\r
+ SUB T,1(W1)\r
+ JRST CPOPJ1\r
+\fCONSYM: MOVEM T,LWT\r
+ TRNN F,LF1\r
+ JRST @SCH ;PIN OR FTOC\r
+ TRNE F,CF1\r
+ JRST FTOC\r
+\r
+PIN: ;PRINT INSTRUCTION\r
+ TLC T,700000\r
+ TLCN T,700000\r
+ JRST INOUT ;IN-OUT INSTRUCTION OR NEG NUM\r
+ AND T,[XWD 777000,0] ;EXTRACT OPCODE BITS\r
+ JUMPE T,HLFW ;TYPE AS HALF WORDS\r
+ PUSHJ P,OPTYPE\r
+ MOVSI T,777000\r
+ AND T,LWT\r
+ TRNN F,ITF ;HAS INSTRUCTION BEEN TYPED?\r
+ PUSHJ P,LOOK ;NO, LOOK IN SYMBOL TABLE\r
+ TROA F,NAF ;INSTRUCTION TYPED, ALLOW NEG ADDRESSES\r
+ JRST HLFW ;NOT FOUND, OUTPUT AS HALFWORDS\r
+ PUSHJ P,TSPC\r
+ LDB T,[XWD 270400,LWT] ;GET AC FIELD\r
+ JUMPE T,PI4\r
+ PUSHJ P,PAD\r
+PI3A: MOVEI W1,","\r
+ PUSHJ P,TEXT\r
+PI4: MOVE W1,LWT\r
+ MOVEI T,"@"\r
+ TLNE W1,20 ;CHECK FOR INDIRECT BIT\r
+ PUSHJ P,TOUT\r
+ HRRZ T,LWT\r
+ LDB W1,[XWD 331100,LWT] ;INSTRUCTION BITS\r
+ CAIL W1,240\r
+ CAILE W1,247\r
+ JRST PI8 ;ALL (EXECPT ASH,ROT,LSH) HAVE SYMBOLIC ADRS\r
+ TLNN W1,20\r
+ CAIN W,<JFFO>_-33\r
+ JRST PI8 ;JFFO AND @ GET SYMBOLIC ADDRESSES\r
+ PUSHJ P,PADS3A ;ONLY ABSOLUTE ADDRESSING FOR LSH, ASH, AND ROT\r
+PI7: TRZ F,NAF \r
+ LDB R,[XWD 220400,LWT] ;INDEX REGISTER CHECK\r
+ JUMPE R,PADS1 ;EXIT\r
+ MOVEI T,"("\r
+ PUSHJ P,TOUT\r
+ MOVE T,R\r
+ PUSHJ P,PAD\r
+ MOVEI T,")"\r
+ JRST TOUT ;EXIT\r
+\r
+PI8: PUSHJ P,PAD\r
+ JRST PI7\r
+\fHLFW: REPEAT 0,< MOVE T,LWT\r
+ CAML T,[DDTINT SAVPI]\r
+ CAMLE T,[DDTINT BNADR+2]\r
+ SKIPA\r
+ JRST PAD>\r
+ HLRZ T,LWT ;PRINT AS HALF WORDS\r
+ JUMPE T,HLFW1 ;TYPE ONLY RIGHT ADR IF LEFT ADR=0\r
+ TRO F,NAF ;ALLOW NEGATIVE ADDRESSES\r
+ PUSHJ P,PAD\r
+ MOVSI W1,(ASCII /,,/)\r
+ PUSHJ P,TEXT2 ;TYPE ,,\r
+HLFW1: HRRZ T,LWT\r
+\r
+;PRINT ADDRESSES (ARG USUALLY 18 BITS BUT CAN BE 36 BITS:\r
+\r
+PAD: ANDI T,-1\r
+ JRST @AR ;PADSO OR PAD1\r
+PADSO: JUMPE T,FP7B ;PRINT A ZERO\r
+ PUSHJ P,LOOK\r
+\r
+PADS1: POPJ P,0\r
+ MOVE W2,1(W1)\r
+ CAIGE T,100\r
+ CAIGE W2,60\r
+ JRST PADS3\r
+ MOVEM T,TEM\r
+ JUMPGE F,PAD1\r
+ PUSHJ P,SPT0\r
+ MOVEI T,"+"\r
+PADS1A: PUSHJ P,TOUT\r
+ HRRZ T,TEM\r
+PAD1: JRST TOC ;EXIT\r
+\r
+PADS3: MOVE T,TEM\r
+PADS3A: TRNE F,NAF\r
+ CAIGE T,776000\r
+ JRST TOC\r
+PADS3B: MOVNM T,TEM\r
+ MOVEI T,"-"\r
+ JRST PADS1A\r
+\r
+INOUT: TDC T,[XWD -1,400000] ;IO INSTRUCTION OR NEG NUM\r
+ TDCN T,[XWD -1,400000]\r
+ JRST PADS3B ;TYPE AS NEG NUM\r
+ LDB R,[POINT 7,T,9] ;PICK OUT IO DEVICE BITS\r
+ CAIL R,774_-2 ;IF DEVICE <774, THEN TYPE\r
+ JRST HLFW ;TYPE AS HALF WORDS\r
+ LDB R,[POINT 3,T,12]\r
+ DPB R,[POINT 6,T,8] ;MOVE IO BITS OVER FOR OP DECODER\r
+ PUSHJ P,OPTYPE\r
+ PUSHJ P,TSPC\r
+ MOVSI T,077400\r
+ AND T,LWT\r
+ JUMPE T,PI4\r
+ PUSHJ P,LOOK ;LOOK FOR DEVICE NUMBER\r
+ JRST PI3A\r
+ MOVE T,TEM\r
+ LSH T,-30\r
+ PUSHJ P,TOC\r
+ JRST PI3A\r
+MASK: TLNE F,QF\r
+ JRST MASK1\r
+ MOVEI T,MSK\r
+MASK2: MOVEI W,1\r
+ MOVEM W,FRASE1\r
+ JRST QUAN1\r
+MASK1: MOVEM T,MSK\r
+ JRST RET\r
+\fEFFEC: TLO F,LTF\r
+ HRRZ T,T\r
+WORD: MOVEI R,322000-326000 ;JUMPE-JUMPN\r
+NWORD: ADDI R,326000+40*T ;JUMPN T,\r
+ HRLM R,SEAR2\r
+ TLZN F,QF\r
+ JRST ERR\r
+ SETCAM T,WRD\r
+ MOVSI T,FRASE-DEN-1 ;PREVENT TYPE OUT OF DDT PARTS\r
+ SETCMM FRASE(T)\r
+ AOBJN T,.-1\r
+ MOVE T,ULIMIT\r
+ TLNE F,SAF\r
+ TLO F,QF ;SIMULATE A $Q TYPED\r
+ PUSHJ P,SETUP\r
+ PUSHJ P,CRF\r
+SEAR1: PUSHJ P,FETCH\r
+ JRST SEAR2A\r
+ TLNE F,LTF ;CHECK FOR EFFECTIVE ADDRESS SEARCH\r
+\r
+ JRST EFFEC0\r
+ EQV T,WRD\r
+ AND T,MSK\r
+SEAR2: JUMPE T,SEAR3 ;OR JUMPN T\r
+SEAR2A: AOS R,DEFV ;GET NEXT LOCATION\r
+ PUSHJ P,LISTEN ;ANYTHING TYPED?\r
+ CAMLE R,ULIMIT ;OR END OF SEARCH?\r
+ JRST SEARFN ;YES\r
+ JRST SEAR1 ;NO, LOOK SOME MORE\r
+\r
+SEAR2B: MOVEI R,400000-1 ;MOVE UP TO HI SEGMENT\r
+ IORB R,DEFV ;PUT IN MEMORY TOO\r
+ TRNN R,400000 ;ALREAY IN HI SEGMENT?\r
+ JRST SEAR2A ;NO\r
+SEARFN: SETCMM LWT ;COMPLEMENT BITS BACK AND STOP SEARCH\r
+ JRST DD1\r
+\fSEAR3: MOVE R,DEFV\r
+ PUSHJ P,FETCH\r
+ JRST ERR\r
+ TLZ F,STF ;GET RID OF SUPPRESS TYPEOUT MODE\r
+ MOVE T,DEFV\r
+ PUSHJ P,LI1 ;CALL REGISTER EXAMINATION LOGIC TO TYPE OUT\r
+ PUSHJ P,CRF\r
+ SETCMM LWT\r
+ SETCMM TEM\r
+SEAR4: JRST SEAR2A\r
+\r
+EFFEC0: MOVEI W,100\r
+ MOVEM W,TEM\r
+EFFEC1: MOVE W,T\r
+ LDB R,[POINT 4,T,17] ;GET IR FIELD\r
+ JUMPE R,EFFEC2\r
+ PUSHJ P,FETCH\r
+ JRST ERR\r
+ ADD T,W\r
+EFFEC2: HRR R,T\r
+ TLNN W,20 ;INDIRECT BIT CHECK\r
+ JRST EFFEC3\r
+ SOSE,TEM\r
+ PUSHJ P,FETCH\r
+ JRST SEAR4\r
+ JRST EFFEC1\r
+EFFEC3: EQV T,WRD\r
+ ANDI T,777777\r
+ JRST SEAR2\r
+\fSETUP: TLNN F,QF ;QUANTITY TYPED?\r
+\r
+IFN EDDT&10,<MOVEI T,137777 ;DON'T SEARCH BEYOND 48K>\r
+IFE EDDT&10,<\r
+IFE EDDT&1,<MOVEI T,777777 ;NO, GET LAST ADR>\r
+IFN EDDT&1,<HRRZ T,@SYMP ;NO, GET 1ST ADR SYM TABLE>\r
+>\r
+\r
+ HRRZM T,ULIMIT ;SAVE HIGH LIMIT INCREMENTED BY ONE\r
+ HRRZS R,DEFV ;GET 1ST ADDRESS\r
+ TLNN F,FAF ;WAS A 1ST ADR SPECIFIED?\r
+ SETZB R,DEFV ;NO, MAKE IT ZERO\r
+ CAML R,ULIMIT ;LIMITS IN A REASONABLE ORDER?\r
+ JRST ERR\r
+ POPJ P,0\r
+\r
+ZERO: TLNN F,CCF\r
+ JRST ERR\r
+ PUSHJ P,SETUP\r
+\r
+ HRRZ S,@SYMP ;GET 1ST ADR OF SYMBOL TABLE\r
+ HLRE W1,@SYMP ;GET LENGTH OF SYM TABLE\r
+ SUB W1,S ;GET NEG OF LAST ADR\r
+ MOVNS W1 ;GET POS LAST ADR\r
+ MOVEI T,0 ;0 TO STORE IN MEMORY\r
+ZERO1: TRNE R,777760\r
+ JRST ZEROR ;OK TO ZERO AC'S\r
+ CAIGE R,ZLOW\r
+ MOVEI R,ZLOW ;DON'T ZERO 20 THRU ZLOW\r
+ CAIL R,DDT\r
+ CAILE R,DDTEND\r
+ JRST .+2\r
+ MOVEI R,DDTEND ;DON'T ZERO DDT\r
+ CAML R,S\r
+ CAMLE R,W1\r
+ JRST .+2\r
+ HRRZ R,W1 ;DON'T ZERO SYMBOL TABLE\r
+ZEROR: CAMLE R,ULIMIT ;ABOVE LIMITS?\r
+ JRST DD1 ;YES, STOP\r
+ PUSHJ P,DEP ;DEPOSIT T\r
+ TROA R,377777 ;\r
+ AOJA R,ZERO1\r
+ TRNN R,400000 ;HI SEGMENT?\r
+ AOJA R,ZERO1 ;NO, KEEP GOING\r
+ JRST DD1 ;FINISH\r
+\fFTOC: ;NUMERIC OUTPUT SUBROUTINE\r
+TOC: HRRZ W1,ODF\r
+ CAIN W1,10 ;IS OUPUT RADIX NOT OCTAL, OR\r
+ TLNN T,-1 ;ARE THERE NO LEFT HALF BITS?\r
+ JRST TOCA ;YES, DO NOTHING SPECIAL\r
+ HRRM T,TOCS ;NO, TYPE AS HALF WORD CONSTANT\r
+ HLRZS T ;GET LEFT HALF\r
+ PUSHJ P,TOCA ;TYPE LEFT HALF\r
+ MOVSI W1,(ASCII /,,/)\r
+ PUSHJ P,TEXT2 ;TYPE ,,\r
+TOCS: MOVEI T,.-. ;GET RIGHT HALF BACK\r
+TOCA: LSHC T,-43\r
+ LSH W1,-1 ;W1=T+1\r
+TOC1: DIVI T,@ODF\r
+ HRLM W1,0(P)\r
+ JUMPE T,TOC2\r
+ PUSHJ P,TOCA\r
+TOC2: HLRZ T,0(P)\r
+ ADDI T,"0"\r
+ JRST TOUT\r
+\r
+TOC4: MOVM W1,T ;TYPE AS SIGNED DECIMAL INTEGER\r
+ JUMPGE T,TOC5\r
+ MOVEI T,"-"\r
+ PUSHJ P,TOUT\r
+TOC5: PUSHJ P,FP7 ;DECIMAL PRINT ROUTINE\r
+TOC6: MOVEI T,"."\r
+ JRST TOUT\r
+\r
+;SYMBOL OUTPUT SUBROUTINE\r
+\r
+SPT0: HRRZM W1,SPSAV ;SAVE POINTER TO TYPED SYM\r
+SPT: ;RADIX 50 SYMBOL PRINT\r
+ LDB T,[POINT 32,0(W1),35] ;GET SYMBOL\r
+SPT1: IDIVI T,50\r
+ HRLM W1,0(P)\r
+ JUMPE T,SPT2\r
+ PUSHJ P,SPT1\r
+SPT2: HLRZ T,0(P)\r
+ JUMPE T,CPOPJ ;FLUSH NULL CHARACTERS\r
+ ADDI T,260-1\r
+ CAILE T,271\r
+ ADDI T,301-272\r
+ CAILE T,332\r
+ SUBI T,334-244\r
+ CAIN T,243\r
+ MOVEI T,256\r
+ JRST TOUT\r
+\fSYMD: MOVEI T,DELO/200000 ;$D ;DELETE LAST SYM & PRINT NEW\r
+ HRRZ R,SPSAV ;PICK UP POINTER TO LAST SYM\r
+ JUMPE R,ERR\r
+ DPB T,[POINT 2,(R),1] ;STORE SEMI-DELETE BITS IN SYMBOL\r
+ MOVE T,LWT\r
+ JRST CONSYM ;PRINT OUT NEXT BEST SYMBOL\r
+\f;FLOATING POINT OUTPUT\r
+\r
+TFLOT: MOVE A,T\r
+ JUMPG A, TFLOT1\r
+ JUMPE A,FP1A\r
+ MOVNS A\r
+ MOVEI T,"-"\r
+ PUSHJ P,TOUT\r
+ TLZE A,400000\r
+ JRST FP1A\r
+TFLOT1: TLNN A, 400 \r
+ JRST TOC5 ;IF UNNORMALIZED, TYPE AS DECIMAL INTEGER\r
+\r
+FP1: MOVEI B,0\r
+ CAMGE A,FT01\r
+ JRST FP4\r
+ CAML A,FT8\r
+ AOJA B,FP4\r
+FP1A: MOVEI C,0\r
+\r
+FP3: MULI A,400\r
+ ASHC B,-243(A)\r
+ MOVE A,B\r
+ SETZM TEM1 ;INIT 8 DIGIT COUNTER\r
+ SKIPE A,B ;DON'T TYPE A LEADING 0\r
+ PUSHJ P,FP7 ;PRINT INTEGER PART OF 8 DIGITS\r
+ PUSHJ P,TOC6 ;PRINT DECIMAL POINT\r
+ MOVNI A,10\r
+ ADD A,TEM1\r
+ MOVE W1,C\r
+FP3A: MOVE T,W1\r
+ MULI T,12\r
+ PUSHJ P,FP7B\r
+ SKIPE,W1\r
+ AOJL A,FP3A\r
+ POPJ P,\r
+\r
+FP4: MOVNI C,6\r
+ MOVEI W2,0\r
+FP4A: ASH W2,1\r
+ XCT,FCP(B)\r
+ JRST FP4B\r
+ FMPR A,@FCP+1(B)\r
+ IORI W2,1\r
+FP4B: AOJN C,FP4A\r
+ PUSH P,W2 ;SAVE EXPONENT\r
+ PUSH P,FSGN(B) ;SAVE "E+" OR "E-"\r
+ PUSHJ P,FP3 ;PRINT OUT FFF.FFF PART OF NUMBER\r
+ POP P,W1 ;GET "E+" OR "E-" BACK\r
+ PUSHJ P,TEXT\r
+ POP P,A ;GET EXPONENT BACK\r
+\fFP7: IDIVI A,12 ;DECIMAL OUTPUT SUBROUTINE\r
+ AOS,TEM1\r
+ HRLM B,(P)\r
+ JUMPE A,FP7A1\r
+ PUSHJ P,FP7\r
+\r
+FP7A1: HLRZ T,(P)\r
+FP7B: ADDI T,260\r
+ JRST TOUT\r
+\r
+ 353473426555 ;1.0E32\r
+ 266434157116 ;1.0E16\r
+FT8: 233575360400 ;1.0E8\r
+ 216470400000 ;1.0E4\r
+ 207620000000 ;1.0E2\r
+ 204500000000 ;1.0E1\r
+FT: 201400000000 ;1.0E0\r
+ 026637304365 ;1.0E-32\r
+ 113715126246 ;1.0E-16\r
+ 146527461671 ;1.0E-8\r
+ 163643334273 ;1.0E-4\r
+ 172507534122 ;1.0E-2\r
+FT01: 175631463146 ;1.0E-1\r
+FT0=FT01+1\r
+\r
+FCP: CAMLE A, FT0(C)\r
+ CAMGE A, FT(C)\r
+ Z FT0(C)\r
+\r
+FSGN: ASCII .E-.\r
+ ASCII .E+.\r
+\r
+TEXTT: MOVE W1,T\r
+TEXT: TLNN W1,774000 ;LEFT JUSTIFIED UNLESS LEFT CHAR IS NULL\r
+ LSH W1,35\r
+TEXT2: MOVEI T,0 ;7 BIT ASCII TEXT OUTPUT SUBROUTINE\r
+ LSHC T,7\r
+ PUSHJ P,TOUT\r
+ JUMPN W1,TEXT2\r
+ POPJ P,\r
+\fKILC: XWD -NSYMS,LOW\r
+\r
+WRD: 0\r
+WRD2: 0\r
+PRNC: 0\r
+\r
+FRASE: 0 ;DONT CHANGE ORDER, SEE SEARC+3\r
+SYL: 0\r
+LWT: 0\r
+TEM2: 0\r
+FRASE1:\r
+TEM3: 0\r
+DEN: 0\r
+\r
+PRGM: 0\r
+ESTU: 0\r
+ESTUT: 0\r
+FSV: 0\r
+FH: 0\r
+SYM: 0\r
+SPSAV: 0 ;POINTER TO LAST SYMBOL TYPED\r
+DEFV: 0\r
+ULIMIT: 0\r
+LLOC: 0\r
+LLOCO: 0\r
+SAVLOC: 0 ;THE ADR OF OLD REGISTER EXAMINATION SEQUENCE\r
+SYMP: XWD PID,JOBSYM\r
+\fSAVPI: 0\r
+ 1177\r
+SAVTTY: 0\r
+MSK: XWD -1,-1\r
+B1ADR: 0\r
+B1SKP: 0\r
+B1CNT: 0\r
+\r
+REPEAT NBP*3-3, < 0>\r
+\r
+BNADR=.-3\r
+AUTOPI: 0\r
+\r
+IFE EDDT&10,<\r
+AC0: BLOCK 17\r
+\r
+AC17: 0\r
+>\r
+\r
+SCHM: EXP PIN ;DO NOT CHANGE ORDER\r
+ARM: EXP PADSO\r
+ODFM: EXP 10\r
+\r
+SARS: 0\r
+TEM: 0\r
+TEM1: 0\r
+IFN EDDT&10,< OFFSET: 0 >\r
+\fIFN EDDT&1&<EDDT>B36,<\r
+\r
+PUNCH: TLC F,FAF+QF\r
+ TLCE F,FAF+QF\r
+ JRST ERR ;ONE ARGUMENT MISSING\r
+PUN2: ADDI T,1\r
+ HRRZM T,TEM1\r
+ SUB T,DEFV\r
+ JUMPLE T,ERR\r
+\r
+PUN1: MOVEI T,4 ;PUNCH 4 FEED HOLES\r
+ PUSHJ P,FEED\r
+ TLNE F,CF ;PUNCH NON-ZERO BLOCKS?\r
+ JRST PUNZ ;YES\r
+ HRRZ R,DEFV\r
+ IORI R,37\r
+ ADDI R,1\r
+ CAMLE R,TEM1\r
+ MOVE R,TEM1\r
+ EXCH R,DEFV\r
+ MOVE T,R\r
+ SUB T,DEFV\r
+ HRL R,T\r
+ JUMPGE R,RET ;EXIT OR PUNCH\r
+\r
+PBLK: MOVE T,R\r
+ SOS W,T ;INIT CHECKSUM\r
+ PUSHJ P,PWRD\r
+PBLK1: PUSHJ P,FETCH\r
+ JRST ERR\r
+ ADD W,T\r
+ PUSHJ P,PWRD\r
+ AOBJN R,PBLK1\r
+ MOVE T,W\r
+ PUSHJ P,PWRD\r
+ JRST PUN1\r
+\r
+;PUNCH NON-ZERO BLOCKS\r
+\r
+PUNZ0: AOS DEFV ;LOOK AT NEXT WORD\r
+PUNZ: HRRZ W,DEFV ;ENTER HERE - GET STARTING ADDRESS\r
+ MOVE R,W\r
+ SUB W,TEM1 ;CALCULATE NEGATIVE LENGTH\r
+ HRL R,W ;SET UP AOBJN POINTER\r
+ JUMPGE R,RET ;FINISHED?\r
+ CAMG R,[XWD -40,0] ;BLOCK LONGER THAN 40?\r
+ HRLI R,-40 ;YES, FIX IT UP\r
+ MOVSI W1,400000 ;W1 NEGATIVE MEANS FLUSH 0 WORDS\r
+PUNZ2: PUSHJ P,FETCH ;GET WORD FROM MEMORY\r
+ JRST ERR\r
+ JUMPE T,[AOJA W1,PUNZ4] ;IF WORD IS 0, INDEX 0 WORD COUNTER\r
+ MOVEI W1,0 ;CLEAR 0 WORD COUNTER\r
+PUNZ4: JUMPL W1,PUNZ0 ;FLUSH 0 WORD, GET ANOTHER\r
+ CAIL W1,3 ; NOSKIP FOR 3RD 0 WORD AFTER NON 0 WORD\r
+ AOSA R ;ADVANCE R TO LAST ADR+1\r
+ AOBJN R,PUNZ2\r
+ ADD W1,DEFV ;CALCULATE DEFV-R+W1=-WORD COUNT\r
+ SUB W1,R\r
+ HRLM W1,DEFV ;PUT -WC IN LEFT HALF OF FA\r
+ EXCH R,DEFV ;SAVE ADR FOR NEXT BLOCK, GET POINTER\r
+ JRST PBLK\r
+\r
+\r
+\r
+\r
+LOADER: TLNE F,QF\r
+ JRST ERR\r
+ MOVEI T,400\r
+ PUSHJ P,FEED\r
+ MOVE R,LOADE\r
+\r
+LOAD1: MOVE T,0(R)\r
+ PUSHJ P,PWRD\r
+ AOBJN R,LOAD1\r
+ MOVEI T,100\r
+LOAD2: PUSHJ P,FEED\r
+ JRST RET\r
+\r
+BLKEND: TLNN F,QF ;BLOCK END\r
+ MOVE T,[JRST 4,DDT]\r
+ TLNN T,777000 ;INSERT JRST IF NO OPCODE\r
+ TLO T,(JRST)\r
+ PUSH P,T\r
+ MOVEI T,100\r
+ PUSHJ P,FEED\r
+ POP P,T\r
+ PUSHJ P,PWRD\r
+ PUSHJ P,PWRD ;EXTRA WORD FOR READER TO STOP ON\r
+ MOVEI T,500\r
+ JRST LOAD2\r
+\r
+PWRD: MOVEI W1,6\r
+PWRD2: ROT T,6\r
+ CONSZ PTPP,20\r
+ JRST .-1\r
+ CONO PTPP,50\r
+ DATAO PTPP,T\r
+ SOJG W1,PWRD2\r
+ POPJ P,0\r
+\r
+FEED: CONSZ PTPP,20\r
+ JRST .-1\r
+ CONO PTPP,10\r
+ DATAO PTPP,FEED1\r
+ SOJN T,FEED\r
+FEED1: POPJ P,0 ;ADDRESS USED AS A CONSTANT\r
+\r
+\r
+LOADB:\r
+\r
+PHASE 0 ;RIM10B CHECKSUM LOADER\r
+ XWD -16,0\r
+BEG: CONO PTRR,60\r
+ HRRI AA,RD+1\r
+RD: CONSO PTRR,10\r
+ JRST .-1\r
+ DATAI PTRR,@TBL1-RD+1(AA)\r
+ XCT TBL1-RD+1(AA)\r
+ XCT TBL2-RD+1(AA)\r
+AA: SOJA AA,\r
+\r
+TBL1: CAME CKSM,ADR\r
+ ADD CKSM,1(ADR)\r
+ SKIPL CKSM,ADR\r
+\r
+TBL2: JRST 4,BEG\r
+ AOBJN ADR,RD\r
+ADR: JRST BEG+1\r
+CKSM=ADR+1\r
+\r
+DEPHASE\r
+\r
+LOADE: XWD LOADB-.,LOADB\r
+> ;END OF IFN EDDT$1&<EDDT>B36\r
+ ;FOR PAPER TAPE IO\r
+\r
+\fSAVE: 0 ;SAVE THE ACS AND PI SYSTEM\r
+ SKIPN SARS\r
+ JRST SAV1\r
+ AOS SAVE\r
+ JRST SAV5\r
+SAV1: IFN EDDT&1,<\r
+ CONI PRS,SAVPI\r
+ CONO PRS, @SAVPI+1>\r
+ MOVEM 17,AC17\r
+ HRRZI 17,AC0\r
+ BLT 17,AC0+16\r
+ MOVE T, SAVE\r
+ HLLM T, SAVPI\r
+SAV5:\r
+;IFE EDDT&1,<HRRZS SAVUWP ;ASSUME UWP WILL BE ZEROED\r
+; SETZB T,F ;T=F=0\r
+; CALLIU T,SETUWP ;REQUEST TO CLEAR UWP\r
+; HRROS SAVUWP ;FAILED, UWP (BIT 0) STILL 1\r
+; SKIPN SARS ;USER'S SATE SAVED ALREADY?\r
+\r
+; HRRM T,SAVUWP> ;NO, SAVE STATE OF UWP\r
+\r
+ SETOM,SARS ;FLAG PROTECTING SAVED REGISTERS\r
+ MOVEI P,PS\r
+ IFE EDDT&1,<PUSHJ P,TTYRET> ;IN USER MODE, GET INTO DDT MODE\r
+ MOVE T,[XWD SCHM,SCH]\r
+ BLT T,ODF ;LOAD THE ACS WITH MODE SWITCHES\r
+ JRST @SAVE\r
+\r
+RESTORE: SETOM TEM3 ;RESTORE ACS AND PI SYSTEM\r
+RESTR1: HRRM T,SAVE\r
+ MOVE T,SAVPI\r
+ HLLM T, SAVE\r
+IFN EDDT&1,<\r
+ AND T, SAVPI+1\r
+ IORI T, 2000 ;TURN ON CHANNELS\r
+ MOVEM T, SAVPI>\r
+;IFE EDDT&1,<HRRZ T,SAVUWP ;GET OLD UWP\r
+; CALLI T,SETUWP ;CHANGE IT TO OLD\r
+; JFCL> ;EX MACHT NICHTS\r
+ HRLZI 17,AC0\r
+ BLT 17,17\r
+ SETZM SARS\r
+ SKIPL,TEM3\r
+CPUSHP: PUSH BCOM ;PROGRAM MODIFIED AT IPUSHJ\r
+IFN EDDT&1,< CONO PRS,@SAVPI>\r
+ JRST 2,@SAVE\r
+\fCRN: MOVEI T,15 ;CARRIAGE RETURN\r
+ JRST TOUT\r
+\r
+IFE EDDT&1,<\r
+CRNRB: PUSHJ P,CRN\r
+ MOVEI T,177\r
+ JRST TOUT>\r
+\r
+CRF: PUSHJ P,CRN\r
+ MOVEI T,12 ;LINE FEED\r
+ JRST TOUT\r
+\r
+LCT: IFN EDDT&1,<PUSHJ P,TSPC\r
+ PUSHJ P,TSPC>\r
+ IFE EDDT&1,<MOVEI T,11\r
+ JRST TOUT> ;TYPE A TAB\r
+\r
+TSPC: MOVEI T,40 ;SPACE\r
+ JRST TOUT\r
+\fIFN EDDT&1,< ;EXECUTIVE MODE TELETYPE I/O\r
+\r
+TIN: PUSHJ P,LISTEN ;TELETYPE CHARACTER INPUT\r
+ JRST .-1\r
+ CAIE T,175\r
+ CAIN T,176\r
+ MOVEI T,33 ;CHANGE ALL ALT MODES TO NEW\r
+ CAIN T,177 ;RUBOUT?\r
+ JRST WRONG ;YES, TYPE XXX\r
+ TRNE T,140 ;DON'T ECHO CR,LF,ALT,TAB,BACK SPACE,ETC\r
+TOUT: CAIG T,04 ;DON'T TYPE EOT OR LOWER CHARS\r
+ POPJ P,\r
+ HRLM T,(P)\r
+ IMULI T,200401 ;GENERATE PARITY\r
+ AND T,[11111111]\r
+ IMUL T,[11111111]\r
+ HLR T,(P)\r
+ TLNE T,10\r
+ TRC T,200 ;MAKE PARITY EVEN\r
+ CONSZ TTYY,20\r
+ JRST .-1\r
+ DATAO TTYY,T\r
+ ANDI T,177 ;FLUSH PARITY\r
+ POPJ P,0\r
+\r
+LISTEN: CONSO TTYY,40 ;LISTEN FOR TTY\r
+ POPJ P,\r
+ DATAI TTYY,T\r
+ ANDI T,177\r
+ JRST CPOPJ1\r
+\r
+TTYRET: MOVEI T,3410\r
+TTY1: MOVEI W2,40000\r
+ CONSZ TTYY,120\r
+ SOJG W2,.-1\r
+ CONI TTYY,SAVTTY\r
+ DATAI TTYY,W2\r
+ HRLM W2,SAVTTY\r
+ CONO TTYY,(T)\r
+ POPJ P,\r
+TTYLEV: MOVE T,SAVTTY\r
+ TRZ T,160\r
+ TRO T,3600\r
+ TRNE T,10\r
+ TRZ T,200\r
+ JRST TTY1\r
+\r
+\r
+TEXIN: PUSHJ P,TIN ;INPUT SUBROUTINE FOR TEXT MODES\r
+ TRNN T,140\r
+ JRST TOUT ;ECHO CHARACTERS (0-37) NOT ECHOED\r
+ POPJ P,\r
+>\r
+\fIFE EDDT&1,< ;USER MODE TELETYPE I/O\r
+ IFN EDDT&4,< ;ASSEMBLE WITH OLD DDT MODE IO\r
+\r
+\r
+TIN: MOVE T,POUTBF ;GET NEXT CHARACTER ROUTINE\r
+ CAME T,[POINT 7,INBFF]\r
+ PUSHJ P,FINOUT\r
+\r
+IFE EDDT&10,< ILDB T,PINBFF >\r
+IFN EDDT&10,< PUSHJ P,INCHR >\r
+\r
+ CAIE T,176\r
+ CAIN T,175\r
+ MOVEI T,33 ;CHANGE TO NEW ALT MODE\r
+ CAIN T,177 ;RUBOUT?\r
+ JRST WRONG ;YES PRINT XXX\r
+ JUMPN T,CPOPJ\r
+ MOVE T,[POINT 7,INBFF]\r
+ MOVEM T,PINBFF\r
+ CALL T,[SIXBIT /DDTIN/]\r
+ JRST TIN\r
+\r
+TOUT: JUMPE T,CPOPJ ;OUT PUT A CHARACTER FLUSH NULLS\r
+\r
+IFN EDDT&10,< SKIPE COMAND\r
+ JRST PUTCHR >\r
+\r
+ IDPB T,POUTBF\r
+ CAIE T,12\r
+ POPJ P,\r
+TTYLEV:\r
+FINOUT: MOVEI T,0\r
+ IDPB T,POUTBF\r
+ MOVE T,[POINT 7,INBFF]\r
+ MOVEM T,PINBFF\r
+ MOVEM T,POUTBF\r
+ CALL T,[SIXBIT /DDTOUT/]\r
+ CLEARM INBFF\r
+ POPJ P,\r
+\r
+PINBFF: POINT 7,INBFF\r
+POUTBF: POINT 7,INBFF\r
+\r
+LISTEN=CPOPJ\r
+INBFF: BLOCK 21\r
+\r
+TTYRET: MOVE T,[POINT 7,INBFF]\r
+ MOVEM T,POUTBF\r
+ MOVEM T,PINBFF\r
+ CLEARM INBFF\r
+ POPJ P,\r
+\r
+TEXIN=TIN ;USE NORMAL INPUT FOR TEXT WHEN IN USER MODE\r
+>\r
+\f IFE EDDT&4,< ;ASSEMBLE WITH TTCALL TELETYPE IO\r
+\r
+OPDEF TTCALL [51B8]\r
+\r
+TEXIN:\r
+TIN:\r
+\r
+IFE EDDT&10,< TTCALL 0,T ;GET NEXT CHARACTER INTO T >\r
+IFN EDDT&10,< PUSHJ P,INCHR >\r
+\r
+ CAIE T,175\r
+ CAIN T,176\r
+ MOVEI T,33 ;CHANGE OLD ALT MODES TO NEW\r
+ CAIN T,177\r
+ JRST WRONG ;TYPE XXX FOR A RUBOUT \r
+ POPJ P,\r
+\r
+\r
+TOUT:\r
+\r
+IFN EDDT&10,< SKIPE COMAND ;IS THERE A COMMAND FILE?\r
+ JRST PUTCHR ;YES >\r
+\r
+ TTCALL 1,T ;OUTPUT A CHARACTER\r
+ POPJ P,\r
+\r
+LISTEN: TTCALL 2,T ;GET NEXT CHAR, NO IO WAIT\r
+ POPJ P, ;NO CHARACTER EXISTED, RETURN\r
+ JRST CPOPJ1 ;CHARACTER WAS THERE, SKIP RETURN\r
+\r
+TTYRET: TTCALL 6, ;WHEN RETURNING TO DDT, FLUSH ALL\r
+ POPJ P, ;WAITING INPUT CHARACTERS\r
+\r
+TTYLEV==CPOPJ ;NOTHING SPECIAL TO DO WHEN LEAVING DDT\r
+> ;END OF IFN DDT&4\r
+\r
+IFN EDDT&10,<\r
+INCHR: SKIPE COMAND\r
+ JRST GETCHR\r
+\r
+IFN EDDT&4,< ILDB T,PINBFF ;NO COMMAND FILE>\r
+IFE EDDT&4,< TTCALL 0,T ;O/P CHAR, >\r
+\r
+ POPJ P,\r
+\r
+GETCHR: SOSLE CBUF+2 ;ANY REMAINING\r
+ JRST GETOK ;YES.\r
+ INPUT CM,\r
+ STATZ CM,740000\r
+ HALT .+1\r
+ STATZ CM,20000 ;END-OF-FILE?\r
+ JRST GETEND\r
+\r
+GETOK: ILDB T,CBUF+1\r
+ JUMPE T,GETCHR ;BYPASS ZERO CHARACTERS\r
+ PUSHJ P,PUTCHR ;COPY INPUT TO OUTPUT FILE\r
+ POPJ P,\r
+\r
+GETEND: CLOSE DP, ;CLOSE OUTPUT WHEN INPUT EXHAUSTED\r
+ RELEASE DP,\r
+ RELEASE CM,\r
+ JRST NOLPT ;REVERT TO TTY WHEN COMMAND EXHAUSTED\r
+\r
+PUTCHR: SOSLE LBUF+2 ;ANY ROOM?\r
+ JRST PUTOK ;YES\r
+ OUTPUT DP,\r
+ STATZ DP,740000 ;ERRORS?\r
+ HALT .+1\r
+\r
+PUTOK:\r
+ IDPB T,LBUF+1 ;DEPOSIT CHAR.\r
+ POPJ P,\r
+\r
+> ;END OF IFN EDDT&10\r
+> ;END OF IFE EDDT&1\r
+\fBDISP: POINT 12,DISP(R),11\r
+ POINT 12,DISP(R),23\r
+ POINT 12,DISP(R),35\r
+DISP: \r
+DEFINE D (Z1,Z2,Z3)< <Z1-DDT>_30+<Z2-DDT>_14+Z3-DDT>\r
+ ;THIS MACRO PACKS 3 ADDRESSES INTO ONE WORD; EACH ADR IS 12 BITS\r
+\r
+IFE EDDT&1&<EDDT>B36,< PUNCH=ERR\r
+ BLKEND=ERR\r
+ LOADER=ERR>\r
+\r
+D ERR,ERR,ERR\r
+D ERR,ERR,ERR\r
+D ERR,ERR,VARRW\r
+D TAB,LINEF,ERR\r
+D ERR,CARR,ERR\r
+D ERR,ERR,ERR\r
+D PUNCH,ERR,ERR\r
+D ERR,ERR,ERR\r
+\r
+D ERR,ERR,ERR\r
+D CONTROL,ERR,ERR\r
+D ERR,ERR,SPACE\r
+D SUPTYO,TEXI,ASSEM\r
+D DOLLAR,PERC,ERR\r
+D DIVD,LPRN,RPRN\r
+D MULT,PLUS,ACCF\r
+D MINUS,PERIOD,SLASH\r
+D NUM,NUM,NUM\r
+D NUM,NUM,NUM\r
+D NUM,NUM,NUM\r
+D NUM,TAG,SEMIC\r
+D FIRARG,EQUAL,ULIM\r
+D QUESTN,INDIRECT,ABSA\r
+D BPS,CON,SYMD\r
+D EFFEC,SFLOT,GO\r
+D HWRDS,PILOC,BLKEND\r
+D KILL,LOADER,MASK\r
+D NWORD,BITO,PROCEDE\r
+D QUAN,RELA,SYMBOL\r
+D TEXO,ERR,ERR\r
+D WORD,XEC,ERR\r
+D ZERO,OCON,ICON\r
+D OSYM,VARRW,PSYM\r
+\r
+;THIS TABLE DOES NOT HAVE ENTRIES FOR CHARS .GE. 140; THESE\r
+; ARE DETECTED AS ERRORS NEAR L21:\r
+\fBITO: MOVEI R,BITT ;BYTE OUTPUT SUBROUTINE\r
+ HRRZI AR,TOC\r
+ TRZN F,Q2F\r
+ JRST ERR\r
+ MOVE T,WRD2\r
+ MOVEM T,SVBTS\r
+ MOVEI T,^D36\r
+ IDIV T,WRD2\r
+ SKIPE T+1\r
+ ADDI T,1\r
+ MOVEM T,SVBTS2\r
+ HRRZ SCH,R\r
+ JRST BASE1\r
+\r
+BITT: MOVE T,SVBTS2\r
+ MOVEM T,SVBT2\r
+ MOVE T+1,LWT\r
+ MOVEM T+1,SVBT3\r
+ PUSH P,LWT\r
+BITT2: MOVEI T,0\r
+ MOVE T+2,SVBTS\r
+ LSHC T,(T+2)\r
+ MOVEM T,LWT\r
+ MOVEM T+1,SVBT3\r
+ CAIE AR,PADSO\r
+ PUSHJ P,TOCA\r
+ CAIE AR,TOC\r
+ PUSHJ P,PIN\r
+ SOSG SVBT2\r
+ JRST BITT4\r
+ MOVEI T,","\r
+ PUSHJ P,TOUT\r
+ MOVE T+1,SVBT3\r
+ JRST BITT2\r
+\r
+BITT4: POP P,LWT\r
+ POPJ P,\r
+\r
+SVBTS: 0\r
+SVBTS2: 0\r
+SVBT3: 0\r
+SVBT2: 0\r
+\f\r
+;DESCRIPTION OF OP DECODER FOR DDT:\r
+;\r
+; THE ENTIRE INSTRUCTION SET FOR THE PDP-6 CAN BE COMPACTED INTO\r
+;A SPACE MUCH SMALLER THAN ONE REGISTER FOR EVERY SYMBOL. THIS OCCURS\r
+;BECAUSE OF THE MACHINE ORGANIZATION AND INSTRUCTION MNEMONICS CHOSEN\r
+;FOR THE PDP-6. FOR EXAMPLE, IF BITS (0-2) OF AN INSTRUCTION EQUAL\r
+;101(2) THE INSTRUCTION IS A HALF WORD INSTRUCTION AND AN "H" MAY\r
+;BE ASSUMED. "T" MAY BE ASSUMED FOR ALL TEST INSTRUCTIONS (WHICH\r
+;BEGIN WITH 110(2).\r
+;\r
+; THE TABLE TBL IN DDT CONSISTS OF 9 BIT BYTES, 4 TO A WORD.\r
+;THE NUMBERS IN THE BYTES HAVE THE FOLLOWING SIGNIFICANCE:\r
+;0-37(8): THIS IS A DISPATCH COMMAND FOR THE OP-DECODER INTERPRETER.\r
+; LET THE RIGHT MOST TWO BITS EQUAL N; LET THE NEXT 3 BITS\r
+; EQUAL P.\r
+;\r
+; THE CONTENTS OF INST (INSTRUCTION) CONTAIN IN THE RIGHT\r
+; MOST NINE BITS THE BINARY FOR THE MACHINE INSTRUCTION.\r
+; P AND N REFER TO THE CONTENTS OF INST, AND THE OP DECODER\r
+; WILL PRODUCE AN ANSWER D GIVEN P, N, AND THE CONTENTS\r
+; OF INSTX N+1 GIVES THE NUMBER OF BITS IN INST; P GIVES THE\r
+; POSITION (FROM THE RIGHT EDGE) OF THE N+1 BITS.\r
+;\r
+; EXAMPLE: P = 6\r
+; N = 2\r
+;\r
+;; C(INST) = .010 101 100(2)\r
+;\r
+; THE RESULT = D = 010(2) = 2(8)\r
+;\r
+; D IS USED AS A DISPATCH ON THE NEXT BYTES IN THE TABLE.\r
+; IF D = 5, 5 BYTES IN THE TABLE (DON'T COUNT THE BYTES WHICH\r
+; PRINT TEXT, 41-72(8)) ARE SKIPPED OVER AND THE 6TH BYTE RESUMES\r
+; THE INTERPRETATION.\r
+;\r
+;40(8) THIS IS A STOP CODE; WHEN THIS IS REACHED INTERPRETATION\r
+; IS FINISHED.\r
+\f\r
+;41(8)-72(8) THE ALPHABET IS ENCODED INTO THIS RANGE.\r
+; 41- A\r
+; 42- B\r
+; 72- Z\r
+; WHEN A BYTE IN THIS RANGE IS REACHED, ITS CORRESPONDING\r
+; LETTER IS TYPED.\r
+;\r
+;73(8)-777(8) THIS IS A TRANSFER BYTE. IF THE BYTE IN THIS RANGE IS\r
+; CONSIDERED TO BE A, TRANSFER INTERPRETATION TO THE A-73(8)RD\r
+; BYTE IN THE TABLE.\r
+;\r
+;MACROS ASSEMBLE THE TABLE TBL:\r
+; 1. A NUMBER FOLLOWED BY ^ ASSEMBLES A DISPATCH BYTE. THE FIRST\r
+; DIGIT IS THE POSITION; THE SECOND DIGIT IS THE SIZE.\r
+; 2. A POINT (.) ASSEMBLES A STOP CODE.\r
+; 3. A NAME FOLLOWED BY A SLASH ASSEMBLES A TRANSFER TO THE\r
+; SYMBOLICALLY NAMED BYTE.\r
+; 4. A STRING OF LETTERS TERMINATED BY A SPACE, COMMA, OR POINT,\r
+; ASSEMBLE INTO A STRING OF BYTES, EACH BYTE BEING ONE LETTER.\r
+;\r
+;EXAMPLE OF BINARY TO SYMBOLIC DECODING:\r
+; THE MACHINE CODE FOR JRST IS 254\r
+; INST 0 1 0 1 0 1 1 0 0\r
+; THE INTERPRETER STARTS WITH THE FIRST BYTE IN THE TABLE (63^).\r
+; THE RESULT OF APPLYING THIS TO C(INST) GIVES 2. SKIPPING OVER\r
+; 2 BYTES IN THE TABLE AND INTERPRETING THE THIRD RESULTS IN\r
+; HAK/ BEING INTERPRETED. AT HAK:, THERE IS A 33^. APPLYING\r
+; THIS TO C(INST) RESULTS IN 5 NON PRINTING BYTES BEING SKIPPED\r
+; OVER:\r
+; 1. MV/\r
+; MOV PRINTING TEXT\r
+; 2. MO/\r
+; 3. ML/\r
+; 4. DV/\r
+; 5. SH/\r
+;\r
+;H1/ IS THE NEXT BYTE INTERPRETER. AT H1: 03^ IS FOUND SO\r
+;4 BYTES ARE SKIPPED OVER:\r
+; EXC PRINTING TEXT\r
+; 1. S3/\r
+; BL PRINTING TEXT\r
+; T PRINTING TEXT\r
+; 2. .\r
+; 3. AO/\r
+; 4. AOB/\r
+; THE NEXT LETTERS JRS ARE TYPED OUT. THEN T/ IS FOUND. AT\r
+;T; A T IS TYPED OUT; THEN A "." IS FOUND AND EVERYTHING STOPS.\r
+;\r
+; THE TABLE IS ALSO USED GOING FROM SYMBOLIC TO BINARY BUT A\r
+; TREE SEARCH METHOD IS USED.\r
+\f\f\f\f\fREPEAT 0,<\r
+\r
+DEFINE REDEF (XX)<\r
+DEFINE INFO (AA,BB)<\r
+AA XX'BB>>\r
+\r
+\r
+DEFINE BYT9 (L)<\r
+XLIST\r
+REDEF %\r
+ ZZ==0\r
+ ZZZ==0\r
+ ZZM==1\r
+\r
+ IRPC L,<\r
+ Z=="L"\r
+ IFE Z-":",<INFO <>,<==CLOC>\r
+ IFNDEF FIR.,<FIR.==CLOC>\r
+ IFGE CLOC+73-1000-FIR.,<PRINTX OPTABLE TOO LONG>\r
+ Z==0>\r
+ IFE Z-"/",<IF1 <OUTP 1>\r
+ IF2,<INFO OUTP,+73-FIR.>\r
+ Z==0>\r
+ IFE Z-"^",<OUTP <ZZ&70/2+ZZ&7-1>\r
+ Z==0>\r
+ IFE <Z-",">*<Z-".">*<Z-40>,<IFN ZZZ,<\r
+ REPEAT 5,<ZZ==ZZZ&77\r
+ IFN ZZ,<OUTP ZZ>\r
+ ZZZ==ZZZ/100>>\r
+ IFE Z-".",<OUTP 40>\r
+ Z==0>\r
+ IFN Z,<INFO REDEF,L\r
+ ZZ==ZZ*10+Z&7\r
+ ZZZ==ZZZ+<Z-40>*ZZM\r
+ ZZM==ZZM*100>\r
+ IFE Z,<REDEF %\r
+ ZZ==0\r
+ ZZZ==0\r
+ ZZM==1>>\r
+LIST>\r
+\r
+DEFINE OUTP (A)<\r
+ BINRY==BINRY*400+BINRY*400+A\r
+ BINC==BINC-1\r
+ IFE BINC,<EXP BINRY\r
+ BINRY==0\r
+ BINC==4>\r
+ CLOC==CLOC+1>\r
+\r
+\r
+\r
+TBL: ;OPDECODER BYTE TABLE\r
+\r
+BINRY==0\r
+CLOC==0 ;SET BYTE LOCATION COUNTER TO 0\r
+BINC==4 ;INIT BYTES/WORD COUNTER\r
+\r
+BYT9 <63^UUO/FLO/HAK/ACCP/BOOLE/H HWT/T ACBM/>\r
+\r
+;IO INSTRUCTIONS\r
+BYT9 <21^BD/CON,11^OI/S,01^Z/O/>\r
+BYT9 <BD:01^BLK,IO/DATA,IO:11^I/O/OI:01^O/I/>\r
+\r
+;UUOS\r
+BYT9 <UUO:51^.,32^U40/U50/U60/21^U703/11^USET/01^>\r
+BYT9 <LOOKU,P/ENTE,R/USET:USET,01^I/O/>\r
+BYT9 <U40:03^U47/INI T/.....,U47:CALL,01^.,I/>\r
+BYT9 <U60:21^U603/01^IN,BPUT/OUT,BPUT:11^BU,F:F.,PU,T/>\r
+BYT9 <U603:01^U6062/STAT,11^O:O.,Z:Z.,U6062:11^S,U62/G,U62:ETST,S/>\r
+;BYTE AND FLOATING INSTRUCTIONS\r
+\r
+BYT9 <FLO:51^BYTE/F 32^ AD A/SB A/MP A/DV A:>\r
+BYT9 <21^LMB/R,IMB/LMB:02^.,L:L.,M:M.,B:B.,BYTE:32^...,03^UF,PA/DF,N/>\r
+BYT9 <FS C/IB P:P.,I LD/LD:LD B/I DP/DP:DP B/>\r
+\r
+;FWT,FIXED POINT ARITH,MISC.\r
+\r
+BYT9 <HAK:33^MV/MV:MOV MO/ML/DV/SH/H1/JP/>\r
+BYT9 <21^ADD IMB/SU BIMB:B IMB:02^.,I:I.,M/B/MO:22^>\r
+BYT9 <EIMS:E IMS/S IMS/N IMS/M IMS:02^.,I/M/S:S.,>\r
+BYT9 <ML:21^I ML1/ML1:MUL IMB/DV:21^I DV1/DV1:>\r
+BYT9 <DI DV2:V IMB/H1:03^EXC S3/BL T:T.,AO/AO:AOBJ,>\r
+BYT9 <AOB/JRS T/JFC L/XC T/.AOB:01^P/N/>\r
+BYT9 <JP:03^PU/PU:PUSH PUS/PO/PO:POP POP/JS,R:R.,>\r
+BYT9 <JS P/JS PA:A.,JR PA/PUS:01^J:J..,POP:>\r
+BYT9 <01^.,J/SH:02^A S2/ROT S1/L S2:S S3:H S1/JFF O/S1:21^.,C:C.,>\r
+\r
+;ARITH COMP,SKIP,JUMP\r
+\r
+BYT9 <ACCP:42^CA CA1/SJ/A JS/S JS:O 31^>\r
+BYT9 <J COMP/S COMP/CA1:31^I COMP/M COMP/>\r
+BYT9 <SJ:31^JUM PSJ/SKI PSJ:P COMP:>\r
+BYT9 <03^.,L/E:E.,L E/PA/G E/N:N.,G.,>\r
+\r
+\r
+;HALF WORDS\r
+\r
+BYT9 <HWT:51^HW1/21^R HW2/L HW2:R HW3/HW1:>\r
+BYT9 <21^L HW4/R HW4:L HW3:32^IMS/Z IMS/O IMS/EIMS/>\r
+\r
+;TEST INSTRUCTIONS\r
+\r
+BYT9 <ACBM:31^AC1/01^D AC2/S AC2/AC1:01^R AC2/L,>\r
+BYT9 <AC2:42^N EAN/Z EAN/C EAN/O EAN:12^.,E/PA/N/>\r
+\r
+\r
+;BOOLEAN\r
+\r
+BYT9 <BOOLE:24^ST/AN:AND B2/AN/ST/AN/ST/>\r
+BYT9 <X OR:OR B2/I OR/AN/EQ DV2/ST/OR/ST/OR/OR/>\r
+BYT9 <ST:SET B2:24^Z IMB/IMB/CA:C TA/TM:M IMB/>\r
+BYT9 <CM:C TM/TA:A IMB/IMB/IMB/CB:C BIMB/IMB/CA/>\r
+BYT9 <CA/CM/CM/CB/O IMB/>\r
+\r
+;MORE UUO'S\r
+BYT9 <U50:03^OPE,N/....,RENAM,E/I,N/OU,T/>\r
+BYT9 <U703:02^CLOS,E/RELEA,S/MTAP,E/UGET,F/>\r
+\r
+REPEAT BINC,<BINRY=BINRY*400+BINRY*400>\r
+IFN BINRY,<EXP BINRY>\r
+> ;END OF REPEAT 0\r
+\r
+\r
+\fIFN EDDT&10,< ;FILDDT STUFF\r
+CRASH: SIXBIT .CRASH. ;CANONICAL NAME FOR CRASH\r
+ SIXBIT .SAV.\r
+ Z\r
+ Z\r
+COMNDS: SIXBIT .FILDDT. ;CANNONICAL NAME FOR COMMAND LIST\r
+ SIXBTI .TXT.\r
+ Z\r
+ Z\r
+SNAP: SIXBIT .SNAP. ;NAME FOR OUTPUT IF TO RETRIEVABLE DEVCE\r
+ SIXBIT .LST.\r
+ Z\r
+ Z\r
+CBUF: BLOCK 3 ;RING HEADERS\r
+LBUF: BLOCK 3 \r
+COMAND: Z ;-1 IF COMMAND FILE ,0 IF NOT\r
+CRASHS: Z ;-1 IF CRASH.SAV ON DISK ,0 IF PEEK AT MONITOR\r
+AC0=.\r
+AC17=.+17\r
+RSIDNT: BLOCK 1000 ;LOCS 0-777 ALWAYS IN CORE\r
+CURENT: BLOCK 4000 ;WINDOW TO THE FILE ON DISK\r
+RSAVE: IOWD 1000,RSIDT ;INDEX OF THE CUFRRENT BLOCK, 0,1,...\r
+ Z\r
+CURLST: IOWD 4000,CURENT\r
+ Z\r
+>\r
+\r
+\fSUBTTL OP DECODER\r
+\r
+DEFINE BYT9 (A) <IRP A,<\r
+A>>\r
+\r
+IF1,<\r
+\r
+DEFINE .ADR (A) <\r
+%'A== CLOC\r
+FIR.== CLOC\r
+DEFINE .ADR (A) <\r
+%'A== CLOC\r
+IFGE <LASTB==CLOC+73-FIR.>-1000, <PRINTX OPTABLE TO LONG>>>\r
+\r
+DEFINE .TRA <\r
+CLOC== CLOC+1 ;>\r
+\r
+SYN .TRA, .DIS\r
+\r
+DEFINE .TXT (A) <\r
+IFNB <A>, <IRPC A,<CLOC==CLOC+1>>>\r
+\r
+DEFINE .END (A) <\r
+IFNB <A>, <IRPC A,<CLOC==CLOC+1>>\r
+CLOC== CLOC+1>\r
+\r
+> ;END OF IF1\r
+IF2,<\r
+\r
+DEFINE .ADR (A)<IFN %'A-CLOC,<PRINTX PHASE ERR AT: %'A>>\r
+\r
+DEFINE .TRA (A) <\r
+OUTP %'A+73-FIR.>\r
+\r
+DEFINE .DIS (A) <\r
+OUTP A&70/2+A&7-1>\r
+\r
+DEFINE .TXT (A) <\r
+IFNB <A>, <IRPC A,<OUTP "A"-40>>>\r
+\r
+DEFINE .END (A) <\r
+IFNB <A>. <IRPC A,<OUTP "A"-40>>\r
+OUTP 40>\r
+\r
+DEFINE OUTP (A)<\r
+BINRY== BINRY+<A>_<BINC==BINC-9>\r
+IFE BINC, <\r
+ +BINRY\r
+BINRY==0\r
+BINC==^D36 >\r
+CLOC==CLOC+1 >\r
+\r
+>\r
+\fTBL: ;OPDECODER BYTE TABLE\r
+\r
+BINRY= 0\r
+CLOC= 0 ;SET BYTE LOCATION COUNTER TO 0\r
+BINC= ^D36 ;INIT BYTES/WORD COUNTER\r
+\r
+BYT9 <\r
+\r
+.DIS 63,.TRA UUO,.TRA FLO,.TRA HAK,.TRA ACCP,.TRA BOOLF\r
+ .TXT H,.TRA HWT,.TXT T,.TRA ACBM\r
+\r
+;IO INSTRUCTIONS\r
+\r
+.DIS 21,.TRA BD,.TXT CON,.DIS 11,.TRA IO,.TXT S,.DIS 01,.TRA Z,. TRA O\r
+.ADR BD,.DIS 01,.TXT BLK,.TRA IO,.TXT DATA,.ADR IO,.DIS 11,.TRA I,.TRA O\r
+ .ADR OI,.DIS 01,.TRA O,.TRA I\r
+;UUOS\r
+\r
+.ADR UUOI,.DIS 51,.END,.TXT,.DIS 32,.TRA U40,.TRA U50,.TRA U60\r
+ .DIS 21,.TRA U703,.DIS 11.,TRA USET,.DIS 01\r
+.TXT LOOKU,.TRA P,.TXT ENTE,.TRA R,.ADR USET,.TXT USET,.DIS 01,.TRA I,.TRA O\r
+.ADR U40,.DIS 03,.TRA CAL,.TXT INI,.TRA T,.END,.END,.END,.END,.END,.TXT CALL,.TRA I\r
+.ADR U60,.DIS 21,.TRA U603,.DIS 01,.TXT IN,.TRA BPUT,.TXT OUT\r
+ .ADR BPUT,M.,DIS 11,.TXT BU,.ADR F,.END F,.TXT,.TXT U,.TRA T\r
+.ADR U603,.DIS 01,.TRA U6062,.TXT STAT,.DIS 11,.ADR O,.END O,.TXT,.ADR Z,.END Z,.TXT\r
+ .ADR U6062,.DIS 11,.TXT S,.TRA U62,.TXT G,.ADR U62,.TXT ETST,.TRA S\r
+\r
+;BYTE AND FLOATING INSTRUCTIONS\r
+\r
+.ADR FLO,.DIS 51,.TRA BYTE,.TXT F,.DIS 32,.TXT,.TXT AD,.TRA A,.TXT SB\r
+ .TRA A,.TXT MP,.TRA A,.TXT DV,.ADR A\r
+.DIS 21,.TRA LMB,.TXT R,.TRA IMB,.ADR LMB,.DIS 02,.END,.TXT\r
+ .ADR L,.END L,.TXT,.ADR M,.END M,.TXT\r
+.ADR B,.FND B,.TXT,.ADR BYTE,.DIS 32,.END,.END,.END,.TXT\r
+ .DIS 03,.TXT UF,.TRA PA,.TXT DF,.TRA N\r
+.TXT FS,.TRA C,.TXT IB,.ADR P,.END P,.TXT,.TXT I,.TRA LD\r
+ .ADR LD,.TXT LD,.TRA B,.TXT I,.TRA DP,.ADR DP,.TXT DP,.TRA B\r
+\r
+;FWT-FIXED POINT ARITH-MISC\r
+\r
+.ADR HAK,.DIS 33,.TRA MV,.ADR MV,.TXT MOV,.TRA MO,.TRA ML,.TRA DV\r
+ .TRA SH,.TRA H1,.TRA JP\r
+.DIS 21,.TXT ADD,.TRA IMB,.TXT SU,.ADR BIMB,.TXT B,.ADR IMB,.DIS 02,.END,.TXT\r
+ .ADR I,.END I,.TXT,.TRA M,.TRA B,.ADR MO,.DIS 22\r
+,ADR E1MS,.TXT E,.TRA IMS,.TXT S,.TRA IMS,.TXT N,.TRA IMS,.TXT M\r
+ .ADR IMS,.DIS 02,.END,.TXT,.TRA I,.TRA M,.ADR S,.END S,.TXT\r
+.ADR ML,.DIS 21,.TXT I,.TRA ML1,.ADR ML1,.TXT MUL,.TRA IMB\r
+ .ADR DV,.DIS 21,.TXT I,.TRA DV1\r
+.ADR DV1,.TXT DI,.ADR DV2,.TXT V,.TRA IMB,.ADR H1,.DIS 03,.TXT EXC,.TRA S3,.TXT BL\r
+ .ADR T,.END T,.TXT,.TRA AO,.ADR AO,.TT AOBJ\r
+.TRA AOB,.TXT JRS,.TRA T,.TXT JFC,.TRA L,.TXT XC,.TRA T,.END\r
+ .ADR AOB,.DIS 01,.TRA P,.TRA N\r
+.ADR JP,.DIS 03,.TRA PU,.ADR PU,.TXT PUSH,.TRA PUS,.TRA PO\r
+ .ADR PO,.TXT POP,.TRA POP,.TXT JS,.ADR R,.END R,.TXT\r
+.TXT JS,.TRA P,.TXT JS,.ADR PA,.END, A,.TXT,.TXT JR,.TRA PA\r
+ .ADR PUS,.DIS 01,.ADR J,.END J,.END,.TXT,.ADR POP\r
+.DIS 01,.END,.TXT,.TRA J,.ADR SH,.DIS 02,.TXT A,.TRA S2,.TXT ROT,.TRA S1,.TXT L\r
+ .ADR S2,.TXT S,.ADR S3,.TXT H,.TRA S1,.TXT JFF,.TRA O\r
+ .ADR S1,.DIS 21,.END,.TXT,.ADR C,.END C,.TXT\r
+\r
+;ARITH COMP-SKIP-JUMP\r
+\r
+.ADR ACCP,.DIS 42,.TXT CA,.TRA CA1,.TRA SJ,.TXT A,.TRA JS,.TXT S\r
+ .ADR JS,.TXT O,.DIS 31\r
+.TXT J,.TRA COMP,.TXT S,.TRA COMP,.ADR CA1,.DIS 31,.TXT I,.TRA COMP,.TXT M,.TRA COMP\r
+.ADR SJ,.DIS 31,.TXT JUM,.TRA PSJ,.TXT SKI,.ADR PSJ,.TXT P,.ADR COMP\r
+.DIS 03,.END,.TXT,.TRA L,.ADR E,.END E,.TXT,.TXT L,.TRA E,.TRA PA,.TXT G,.TRA E\r
+ .ADR N,.END N,.TXT,.END G,.TXT\r
+\r
+;HALF WORDS\r
+\r
+.ADR HWT,.DIS 51,.TRA HW1,.DIS 21,.TXT 3,.TRA HW2,.TXT L,.ADR HW2,.TXT R,.TRA HW3\r
+.ADR HW1,.DIS 21,.TXT L,.TRA HW4,.TXT R,.ADR HW4,.TXT L\r
+ .ADR HW3,.DIS 32,.TRA IMS,.TXT Z,.TRA IMS,.TXT D,.TRA IMS,.TRA EIMS\r
+\r
+;TEST INSTRUCTIONS\r
+\r
+.ADR ACBM,.DIS 31,.TRA AC1,.DIS 01,.TXT D,.TRA AC2,.TXT S,.TRA AC2\r
+ .ADR AC1,.DIS 01,.TXT R,.TRA AC2,.TXT L\r
+.ADR AC2,.DIS 42,.TXT N,.TRA EAN,.TXT Z,.TRA EAN,TXT C,.TRA EAN,.TXT O\r
+ .ADR EAN,.DIS 12,.END,.TXT,.TRA E,.TRA PA,.TRA N\r
+\r
+;BOOLEAN\r
+\r
+.ADR BOOLE,.DIS 24,.TRA ST,.ADR AN,.TXT ANBD,.TRA B2,.TRA AN,.TRA ST,.TRA AN,.TRA ST\r
+.TXT X,.ADR OR,.TXT OR,.TRA B2,.TXT I,.TRA OR,.TRA AN,.TXT EQ\r
+ .TRA DV2,.TRA ST,.TRA OR,.TRA ST,.TRA OR,.TRA OR\r
+.ADR ST,.TXT SET,.ADR B2,.DIS 24,.TXT Z,.TRA IMB,.TRA IMB\r
+ .ADR CA,.TXT C,.TRA TA,.ADR TM,.TXT M,.TRA IMB\r
+.ADR DM,.TXT C,.TRA TM,.ADR TA,.TXT A,.TRA IMB,.TRA IMBA,.TRA IMB\r
+ .ADR CP,.TXT C,.TRA BIMB,.TRA IMB,.TRA CA\r
+.TRA CA,.TRA CM,.TRA CM,.TRA CB,.TXT 0,.TRA IMB\r
+\r
+;MORE UUO'S\r
+\r
+.ADR U50,.DIS 03,.TXT OPE,.TRA N,.TXT TT,.ADR CAL,.TXT CAL,.TRA L,.END,.END,.END\r
+ .TXT,.TXT RENAM,.TRA E,.TXT I,.TRA N,.TXT OU,.TRA T\r
+.ADR U703,.DIS 02,.TXT CLOS,.TRA E,.TXT RELEA,.TRA S\r
+ .TXT MTAP,.TRA E,.TXT UGET,.TRA F\r
+\r
+;**********THIS TERMINATES THE "BYT9" MACRO ARGUMENT******\r
+>\r
+\r
+IF1,< BLOCK <CLOC+3>/4>\r
+\r
+IF2,< IFN BINC-^D36,< +BINARY>>\r
+\r
+IFNDEF CLOC.,<CLOC.==CLOC>\r
+IFN CLOC.-CLOC,<PRINTX PHASE ERROR IN OPTABLE>\r
+\f\r
+PNTR: EXP INST ;POINTER TO BITS IN INST\r
+INST: 0 ;BINARY FOR INSTRUCTION\r
+CHP: 0 ;CHAR POINTER INTO TXT, TXT+1\r
+TXT: BLOCK 2 ;STORE INPUT TEXT FOR OPEVAL\r
+SAVPDL: 0 ;SAVE PUSH DOWN LIST POINTER\r
+\r
+BTAB: POINT 9,TBL ;TABLE USED TO GET NEXT BYTE POINTER\r
+ POINT 9,TBL,8 ;FOR TRANSFER BYTE\r
+ POINT 9,TBL,17\r
+ POINT 9,TBL,26\r
+\r
+OPEVAL: MOVEI T,0 ;EVALUATE FOR AN OP CODE\r
+ IDPB T,CHP ;INSERT NULL IN TEXT FOR SYMBOL\r
+ MOVEM P,SAVPDL\r
+ TRZA F,OUTF\r
+OPTYPE: TRO F,OUTF ;TYPE AN OPCODE SYMBOLICALLY\r
+ LSH T,-33\r
+ MOVEM T,INST ;GET OPCODE INTO RIGHT 9 BITS\r
+\r
+ MOVE T,[XWD 440700,TXT]\r
+ MOVEM T,CHP ;FOR OPEVAL,SETUP POINTER TO INPUT TEXT\r
+ TRZ F,ITF ;CLEAR INSTRUCTION TYPED FLAG\r
+ CLEARB R,W1\r
+ MOVE W2,BTAB\r
+DC1: ILDB T,W2 ;GET NEXT BYTE IN TBL\r
+ CAILE T,40\r
+ CAIL T,73\r
+ SOJGE R,DC1 ;SKIP OVER # BYTES = C(R)\r
+ JUMPG R,DC1 ;SKIP OVER ALPHA TEXT WITHOUT COUNTING\r
+ SUBI T,40\r
+ JUMPE T,DECX ;TRANSFER ON ASTOP CODE\r
+ JUMPG T,DC2\r
+ DPB T,[XWD 340500,PNTR] ;SETUP R ON A DISPATCH BYTE\r
+ TRZ T,-4\r
+ AOS T\r
+ DPB T,[XWD 300600,PNTR]\r
+ TRNN F,OUTF\r
+ JRST DC6 ;FOR OPEVAL ONLY\r
+ LDB R,PNTR ;GET # BYTES TO SKIP OVER\r
+ JRST DC1\r
+\r
+DC2: HRREI T,-33(T)\r
+ JUMPL T,DECT ;TYPE OUT A LETTER\r
+ MOVEI W1,FIR.(T) ;BYTE IS A TRANSFER\r
+ IDIVI W1,4\r
+ MOVE W2,BTAB(W2) ;CALCULATE POINTER TO NEXT BYTE\r
+ ADDI W2,(W1)\r
+ JRST DC1\r
+\r
+\f\r
+DECT: TRNE F,OUTF\r
+ JRST DC8 ;TYPE OUT A LETTER\r
+ ILDB W1,CHP ;GET NEXT INPUT LETTER\r
+ CAIE W1,133(T) ;COMPARE WITH ASSUMED NEXT LETTER\r
+ JRST NOMAT ;DOESNT MATCH\r
+ JRST DC1 ;MATCHES, TRY NEXT\r
+\r
+DECX: TRNE F,OUTF ;STOP (CODE 40) HAS BEEN SEEN\r
+ POPJ P, ;IF FOR OUTPUT, RETURN\r
+ ILDB W1,CHP ;GET NEXT INPUT CHAR IF ANY\r
+ JUMPE W1,DC7 ;DOES # OF CHARS MATCH\r
+NOMAT: POP P,R ;NO, BACK UP AND TRY SOME MORE\r
+ POP P,W2\r
+ POP P,PNTR\r
+ POP P,CHP\r
+NOMAT1: AOS R ;ASSUME NEXT NUMBER FOR BIN VALUE\r
+ DPB R,PNTR ;STUFF INTO ANSWER\r
+ LDB R,PNTR\r
+ JUMPN R,DC6AA ;IF =0, BYTE WAS TOO BIG\r
+ CAME P,SAVPDL\r
+ JRST NOMAT ;NOT AT TOP LEVEL\r
+ POPJ P, ;UNDEFINED, FINALLY\r
+\r
+DC6: MOVEI R,0 ;ASSUME 0 FOR INITIAL BINARY VALUE\r
+ DPB R,PNTR\r
+DC6AA: CAMN P,SAVPDL\r
+ JRST DC6BB\r
+ LDB T,-2(P) ;OLD VALUE OF PNTR\r
+ CAME T,(P)\r
+ JRST NOMAT1\r
+DC6BB: PUSH P,CHP\r
+ PUSH P,PNTR\r
+ PUSH P,W2\r
+ PUSH P,R\r
+ JRST DC1\r
+\r
+DC7: MOVE P,SAVPDL ;RESTORE PUSH DOWN POINTER\r
+ MOVE T,INST\r
+ LSH T,33 ;PUSH BINARY INTO POSITION FOR OPEVAL\r
+ LDB R,[POINT 3,T,8]\r
+ TLC T,700000\r
+ TLCN T,700000\r
+ DPB R,[POINT 10,T,12] ;ONLY DONE FOR IO INSTRUCTIONS\r
+ JRST CPOPJ1 ;SYMBOL FOUND, SKIP RETURN\r
+\r
+DC8: TRO F,ITF ;SET INSTRUCTION TYPED FLAG\r
+ MOVEI T,133(T)\r
+ PUSHJ P,TOUT ;OUTPUT A LETTER\r
+ CLEARM SPSAV ;SO $D WONT TRY TO DELETE OP CODES\r
+ JRST DC1\r
+\fLIT\r
+\r
+\r
+PS: BLOCK LPDL\r
+\r
+\r
+DDTEND: ;ONLY STARTING ADDRESS FOR FILDDT\r
+ ;NO START EDDRESS FOR EXEC OR USER DDT\r
+ ;BECUASE MONITOR IS LOADED WITH BOTH EXEC AND USER DDTS\r
+ ;BUT STILL WANTS TO BE STARTED AT ITS OWN STARTING ADDRESS\r
+ ;USER DDT IS LOADED LAST. - T.H.\r
+IFN EDDT&10,<END DDT>\r
+ END \r
--- /dev/null
+TITLE ERRCON - MONITOR DETECTED ERROR HANDLING ROUTINES - V404\r
+SUBTTL T.HASTINGS/TH/RCC TS 01 JUN 69\r
+XP VERRCN,404\r
+ ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB\r
+\r
+ ENTRY ERRCON ;ALWAYS LOAD ERRCON(IF LIB SEARCH)\r
+ERRCON:\r
+\r
+;THESE ERROR ROUTINE PRINT "ERROR IN JOB N"\r
+;FOLLOWED BY AN APPROPRIATE ERROR MESSAGE\r
+;THEN THE JOB IS STOPPED AND CONSOLE IS RETURNED TO\r
+;MONITOR COMMAND MODE\r
+\r
+\r
+;APR DETECTED ERRORS\r
+;PUSHDOWN OVERFLOW,ILLEGAL MEMORY, NONEXISTENT MEMORY\r
+;FOR WHICH THE USER IS NOT ENABLED.\r
+;SEE APRSER TO SEE HOW APR INTERRUPTS ARE HANDLED\r
+;CALL: SKIPE TAC,APRERR ;RESULT OF CONI APR,APRERR\r
+; PUSHJ PDP,APRLIM ;FROM CLK SERVICE ROUT,(LOWEST PRIORTY PI)\r
+; RETURN TO RESCHEDULE NEW USER\r
+\r
+INTERNAL APRILM\r
+EXTERNAL USRREL,CONMES,HOLD,INLMES,JOBN,PJOBN,PRQM\r
+EXTERNAL STOP1,TTYFUW,USRXIT,UUO0,WSCHED\r
+\r
+APRILM: SETZM APRERR ;CLEAR FLAG IMMEDIATELY,IN CASE OTHER ERRORS OCCUR\r
+ TRNN TAC,ILM ;ILLEGAL MEMORY?\r
+ JRST APRNXM ;NO\r
+ HRRZ TAC,APRPC ;YES, PC STORED BY APR INTERRUPT\r
+IFE FT2REL,<\r
+ CAMG TAC,USRREL ;IS PC IN BOUNDS/\r
+>\r
+IFN FT2REL,<\r
+ EXTERN SEGILM\r
+ CAMLE TAC,USRREL ;IS PC IN BOUNDS(LOG SEG)?\r
+ PUSHJ PDP,SEGILM ;NO. IS PC IN LEGAL MEMORY IN HIGH SEG?\r
+>\r
+ JRST APRILR ;YES. GO PRINT ILL MEM REF\r
+ JSP TAC,ERRPTU ;NO. PRINT PC EXCEEDS MEM BOUND\r
+ ASCIZ /PC OUT OF BOUNDS/\r
+ JRST APRSCD ;PRINT LOC, THEN STOP JOB\r
+\r
+APRILR: JSP TAC,ERRPTU\r
+ ASCIZ /ILL MEM REF/\r
+ JRST APRSCD ;PRINT LOC, THEN STOP JOB\r
+\r
+\fAPRNXM: TRNN TAC,NXM ;NON-EX MEM?\r
+ JRST APRPDL ;NO\r
+ JSP TAC,ERRPTU ;YES\r
+ ASCIZ /NON EX MEM/\r
+ JRST APRSCD ;PRINT LOC, THEN STOP JOB\r
+\r
+APRPDL: TRNN TAC,POV ;PUSHDOWN OVERFLOW?\r
+ JSP DAT,UERROR ;NO, MUST BE HARDWARE PROBLEM\r
+ JSP TAC,ERRPTU ;YES\r
+ ASCIZ /PDL OV/\r
+ASPSC: MOVE TAC1,APRPO ;PRINT APR PC\r
+ JRST PCPNT ;AS:\r
+ ; 1)"AT USER LOC XXX" OR\r
+ ; 2)"AT EXEC LOC XXX; EXEC CALLED FROM \r
+ ; EXEC/USER LOC YYY\r
+\f;ADDRESS CHECK ERROR AT ANY LEVEL\r
+;DEVDAT MUST BE SET UP TO POINT TO OFFENDING DEVICE\r
+\r
+INTERNAL ADRERR\r
+\r
+ADRERR: JSP TAC,ERRDEV ;GET JOB NO. FROM DEVICE DATA BLOCK\r
+ ASCIZ /ADDRESS CHECK FOR /\r
+ JRST DEVEXC ;PRINT "DEVICE XXX; EXEC CALLED FROM \r
+ ; EXEC/USER LOC YYY"\r
+ ; THEN STOP JOB\r
+\r
+;UNEXPLAINABLE MONITOR ERROR\r
+ ;CALL: JSP DAT,UERROR ;AT UUO LEVEL(PDP SET UP)\r
+ ; JSP DAT,ERROR ;AT INTERRUPT LEVEL(PDP NOT SET UP)\r
+ ; JSP DAT,OERROR ;AT INTERRUPT OR UUO LEVEL (PDP SET UP) -MESSAGE TO \r
+ ; ; OPERATOR'S CONSOLE RATHER THAN SPECIAL JOB\r
+ ; JSP DAT,CERROR ;BLAME JOB=C(ITEM), PDP SETUP\r
+\r
+INTERNAL ERROR,UERROR,CERROR,OERROR\r
+EXTERNAL JOB,ERRPDL,NULADR\r
+NLADDR: EXP NULADR\r
+ERROR: MOVEI PDP,ERRPDL ;USE LOWER CORE FOR PD LIST\r
+OERROR: PUSH PDP,NLADDR ;PUSH ADR, OF NULJOB ON PD LIST IN CASE\r
+ ; THIS ERROR IS AT PI LEVEL 7 OR HIGHER\r
+ ; SO NULL JOB WILL BE STARTED WHEN LAST\r
+ ; POPJ IS DONE(STOP2 IN RUNCSS)\r
+ TDZA ITEM,ITEM ;BLAME JOB 0(PRINT ON OPERATORS TTY)\r
+UERROR: MOVE ITEM,JOB ;PRINT FOR CURRENT JOB\r
+CERROR:\r
+IFN FTHALT,<\r
+ HALT .+1 ;PUT ADR OF JSP DAT, IN PC AND STOP SO A\r
+ ; DUMP CAN BE TAKEN,CONTINUE WILL PRINT ERROR MESSAGE\r
+>\r
+ JSP TAC,ERRPNT ;ITEM ALREADY SETUP\r
+ ASCIZ /ERROR IN MONITOR/\r
+ MOVE TAC1,-1(PDP) ;GET LOC OF JSP DAT,ERROR\r
+ JRST PCPNT ;PRINT "AT EXEC LOC XXX:\r
+ ; EXEC CALLED FROM EXEC/USER YYY"\r
+ ; THEN STOP JOB\r
+\r
+;INPUT UUO FOR OUTPUT DEVICE\r
+;CALLED AT UUO LEVEL ONLY\r
+\r
+INTERNAL ILLINP\r
+\r
+ILLINP: JSP TAC,ERRPTU\r
+ ASCIZ /OUTPUT /\r
+ PUSHJ PDP,ERNAM ;PRINT "DEVICE XXX"\r
+ JSP TAC,UUOMES ;PRINT MESSAGE,UUOPC,STOP JOB\r
+ ASCIZ / CANNOT DO INPUT/\r
+\f;OUTPUT UUO FOR INPUT DEVICE\r
+;CALLED AT UUO LEVEL ONLY\r
+\r
+INTERNAL ILLOUT\r
+\r
+ILLOUT: JSP TAC,ERRPTU\r
+ ASCIZ /INPUT /\r
+ PUSHJ PDP,ERNAM ;PRINT "DEVICE XXX"\r
+ JSP TAC,UUOMES ;PRINT MESSAGE,UUOPC,STOP JOB\r
+ ASCIZ / CANNOT DO OUTPUT/\r
+\r
+;ILLEGAL DEVICE DATA MODE (INIT, OPEN, OR SETSTS UUOS)\r
+;CALLED AT UUO LEVEL ONLY\r
+\r
+INTERNAL ILLMOD\r
+\r
+ILLMOD: JSP TAC,ERRPTU\r
+ ASCIZ /ILLEGAL DATA MODE FOR /\r
+ JRST DEVEXC ;PRINT "DEVICE XXX",UUO PC\r
+\r
+;IO UUO TO USER CHANNEL WITH NO PREVIOUS INIT OR OPEN\r
+;CALLED AT UUO LEVEL ONLY\r
+\r
+INTERNAL IOIERR\r
+\r
+IOIERR: JSP TAC,ERRPTU\r
+ ASCIZ /IO TO UNASSIGNED CHANNEL/\r
+ JRST UUOPCP ;PRINT UUO PC\r
+\f;ILLEGAL UUO\r
+;CALLED AT UUO LEVEL ONLY\r
+\r
+INTERNAL UUOERR\r
+\r
+UUOERR: JSP TAC,ERRPTU\r
+ ASCIZ /ILLEGAL UUO/\r
+ MOVE TAC1,UUO0 ;GET LAST UUO PC\r
+IFN FTHALT,<\r
+ TLNN TAC1,USRMOD ;UUO FROM EXEC?\r
+ HALT .+1 ;YES, HALT SO DUMP CAN BE TAKEN\r
+ ; CONTINUE WILL PRINT MESSAGE\r
+>\r
+ SOSJ TAC1,PCPNT ;AND PRINT, PRINT USER UUO PC IF DIFF.\r
+\r
+;ILLEGAL INSTRUCTION\r
+\r
+;HALT INSTRUCTION IS A SPECIAL CASE WHICH STOPS JOB BUT\r
+;THE USER MAY CONTINUE FROM IT(EFFECTIVE ADR.)\r
+;CALLED AT UUO LEVEL WITH A JRST\r
+\r
+INTERNAL ILLINS\r
+EXTERNAL JOBPD1,TTYSTC\r
+\r
+ILLINS: HLRZ TAC,UUO ;ILLEGAL OPCODE\r
+ CAIN TAC,254200+PROG ;IS IT A HALT?\r
+ JRST HALTI ;YES, PRINT DIFFERENT MESSAGE\r
+ JSP TAC,ERRPTU\r
+ ASCIZ /ILL INST./\r
+ JRST UUOPCP ;PRINT UUO PC AD STOP JOB\r
+\r
+HALTI: JSP TAC,ERRPTU\r
+ ASCIZ /HALT/\r
+ SOS TAC1,JOBPD1(JDAT) ;UUOPC=LOC OF HALT+1\r
+ PUSHJ PDP,PCP ;PRINT "USER LOC XXX"\r
+ PUSHJ PDP,INLMES ;PRINT MONITOR MODE RESPONSE\r
+ ASCIZ /\r
+^C\r
+\r
+./\r
+ HRRM UUO,JOBPD1(JDAT) ;SAVE EFFECTIVE ADDRESS OF HALT\r
+ PUSHJ PDP,TTYSTC ;START TTY TYPING\r
+ PUSHJ PDP,STOP1 ;STOP JOB\r
+ ; RETURN ONLY IF HE TYPES CONT\r
+ PUSH PDP,JOBPD1(JDAT) ;PUT USER RETURN ON END OF PD LIST\r
+ JRST USRXIT ;RETURN TO USER IN CASE HE TYPES CONT COMMAND\r
+\f;ROUTINE FOR HUNG IO DEVICE\r
+;CALL MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK\r
+; PUSHJ PDP,DEVHNG\r
+\r
+INTERNAL DEVHNG\r
+\r
+DEVHNG: MOVEI TAC,IOACT ;TURN OFF IO DEVICE ACTIVE BIT IN\r
+ ANDCAM TAC,DEVIOS(DEVDAT);MEMORY AND IOS\r
+ TRZ IOS,IOACT\r
+ JSP TAC,ERRDEV\r
+ ASCIZ /HUNG /\r
+ JRST DEVEXC\r
+\r
+;BAD DECTAPE DIRECTORY\r
+;CALLED AT INTERRUPT AND UUO LEVELS WITH DEVDAT AND ITEM SETUP\r
+\r
+INTERNAL BADDIR\r
+\r
+BADDIR: JSP TAC,ERRPNT\r
+ ASCIZ /BAD DIRECTORY FOR /\r
+\r
+;ROUTINE TO PRINT "DEVICE XXX; EXEC CALLED FOR EXEC/USER YYY"\r
+;THEN STOP JOB\r
+;TO BE USED BY DEVICE DEPENDENT ERROR MESSAGES AFTER JSP TAC,DEVERR\r
+\r
+INTERNAL DEVEXC\r
+\r
+DEVEXC: PUSHJ PDP,ERNAM ;PRINT "DEVICE XXX"\r
+ JRST EXCALP ;PRINT "EXEC CALLED FROM EXEC/USER LOC YYY"\r
+\f;ROUTINE TO HALT A JOB WHEN A DEVICE IS NOT READY FOR I/O\r
+;CALLED FROM XXSER AT UUO LEVEL\r
+;CALL MOVE DEVDAT,ADDR. OF DEV. DDB\r
+; PUSHJ PDP,HNGSTP\r
+\r
+INTERNAL HNGSTP\r
+\r
+HNGSTP: PUSH PDP,ITEM\r
+ PUSH PDP,IOS\r
+ PUSH PDP,DEVDAT ;SAVE DEV'S IOS WORD & DDB\r
+ PUSHJ PDP,TTYFUN ;FIND JOB'S TTY & WAIT UNTIL I/O IS FINISHED\r
+ PUSHJ PDP,PRQM ;PRINT QUESTION MARK FOR BATCH\r
+ PUSHJ PDP,ERNAM ;PRINT "DEVICE XXX"\r
+ PUSHJ PDP,INLMES ;AND MSG.\r
+ASCIZ /OK?\r
+^C\r
+\r
+./ PUSHJ PDP,TTYSTC ;START UP TTY IN COMMAND MODE\r
+ POP PDP,DEVDAT ;BRING BACK DEV DDB & IOS WORD\r
+ POP PDP,IOS\r
+ PUSHJ PDP,STOP1 ;STOP JOB &\r
+ POP PDP,ITEM\r
+ JRST WSCHED ;RESCHEDULE\r
+\f;COMMON ERROR MESSAGE SETUP ROUTINES\r
+;CALL: JSP TAC,ERRPTU, ERRDEV, OR ERRPNT\r
+; ASCIZ /MESSAGE/\r
+; RETURNS HERE WITH DEVDAT SAVED 0(PDP)\r
+; C(DEVDAT)=TTYDDB, DAT TO TTY OUTPUT BUFFER POINTER\r
+; ITEM=JOB NUMBER\r
+\r
+;USE ERRPTU IF AT UUO LEVEL FOR SURE\r
+;ERRDEV IF ERROR FOR AN ASSIGNED DEVICE AT ANY LEVEL\r
+;ERRPNT WITH ITEM ALREADY SET TO OFFENDING JOB NUMBER\r
+;THE JSP CALL IS USED IN CASE PUSHDOWN SPACE BECOMES CRITICAL\r
+;AGAIN AND ERRPNT HAS TO WIRE EXISTING LIST OUT\r
+\r
+INTERNAL ERRPTU\r
+INTERNAL ERRDEV,ERRPNT\r
+EXTERNAL PJOBN,JOB,JBTADR,JBTDAT,TTYFND,NULERR\r
+IFN FTTTYSER,<EXTERNAL TTYERP>\r
+\r
+ERRPTU: SKIPA ITEM,JOB ;BLAME CURRENT JOB IS NOT 0.\r
+ERRDEV: LDB ITEM,PJOBN ;JOB NO, FROM DEVICE DATA BLOCK\r
+ERRPNT: SKIPM ITEM ;ERROR IN NULL JOB?\r
+ SETOM NULERR ;YES, SET FLAG FOR ERROR IN NULL JOB\r
+ ; SO STATE OF NULL JOB WILL BE REESTABLISHED\r
+ ; WHEN IS IT RUN AGAIN(SEE CLOCK1)\r
+\r
+ PUSH PDP,DAT ;SAVE CALL TO ERROR(JSP DAT,ERROR)\r
+IFN FTRCHK,<\r
+ CAIL ITEM,JOBN ;JOB NUMBER\r
+ HALT . ;OUT OF RANGE?\r
+>\r
+ PUSH PDP,DEVDAT ;SAVE ADR, OF DEV. DATA BLOCK\r
+ PUSH PDP,TAC ;SAVE RETURN FROM ERRPNT\r
+ MOVE JDAT,JBTDAT(ITEM) ;EVEN NULL JOB HAS JOB DATA AREA\r
+IFN JDAT-PROG,<\r
+ MOVE PROG,JBTADR(ITEM) ;JOB RELOCATION\r
+>\r
+IFE FTTTYSER,< PUSHJ PDP,TTYFND ;FIND TTY FOR THIS JOB(ITEM)>\r
+IFN FTTTYSER,< PUSHJ PDP,TTYERP ;FIND THIS TTY AND\r
+ ;SET MERTPO IN DDB\r
+>\r
+ PUSHJ PDP,INLMES\r
+ ASCIZ /?\r
+ERROR IN JOB /\r
+ PUSHJ PDP,PJOB ;PRINT JOB NO.\r
+ JRST INLMES ;PRINT MESSAGE SPECIFIED BY CALLER\r
+ ; AND RETRUN TO LOC. AFTER MESSAGE\r
+\f;ROUTINE TO PRINT UUO PC AND STOP JOB\r
+;IF IN USER MODE PC WILL PRINT AS "AT USER LOC XXX"\r
+;IF IN EXEC MODE "AT EXEC LOC XXX; EXEC CALLED FROM EXEC/USER/ LOC YYY\r
+\r
+INTERNAL UUOPCP,UUOMES\r
+EXTERNAL JOBPD1\r
+\r
+UUOMES: PUSHJ PDP,CONMES ;PRINT MESSAGE POINTED TO BY TAC\r
+UUOPCP: MOVE TAC1,JOBPD1(JDAT) ;UUO PC STORED IN JOB DATA AREA\r
+ ; FIRST LOC ON PD LIST\r
+ SOJA TAC1,PCPNT ;DECREMENT TO POINT TO UUO IN USER AREA\r
+\r
+;ROUTINE TO PRINT ONE OF THREE MESSAGES AND STOP JOB\r
+;1) "AT EXEC LOC XXX; EXEC CALLED FROM EXEC LOC YYY"\r
+;2) "AT EXEC LOC XXX; EXEC CALLED FROM USER LOC YYY"\r
+;3) "AT USER LOC YYY"\r
+\r
+;CALL: MOVE TAC1, XXX ;WITH PC FLAGS IN LH\r
+\r
+; PUSHJ PDP,PCPNT\r
+; NEVER RETURN IF AT UUO LEVEL\r
+\r
+INTERNAL PCPNT\r
+EXTERNAL TPOPJ\r
+\r
+PCPNT: PUSHJ PDP,PCP ;PRINT " AT EXEC XXX" OR "AT USER "\r
+ TLNE TAC1,USRMOD ;WAS PC IN USER MODE?\r
+ JRST PCSTOP ;YES, ENOUGH INFO.\r
+\r
+;ROUTINE TO PRINT EITHER\r
+;1) "; EXEC CALLED FROM EXEC LOC YYY"\r
+;2) "; EXEC CALLED FROM USER LOC YYY"\r
+;AND STOP JOB\r
+;CALL: PUSHJ PDP,EXCALP\r
+; NEVER RETURNS IF AT UUO LEVEL\r
+\r
+INTERNAL EXCALP,PCSTOP\r
+\r
+EXCALP: PUSHJ PDP,INLMES\r
+ ASCIZ /; UUO/\r
+ MOVE TAC1,JOBPD1(JDAT) ;UUO PC IN JOB DATA AREA\r
+ SUBI TAC1,1 ;BACK IT UP TO POINT TO UUO\r
+ PUSHJ PDP,PCP ;PRINT "EXEC LOC " OF USER LOC\r
+PCSTOP: PUSHJ PDP,HOLD ;STOP JOB, START TTY AND SET JOB ERROR BIT\r
+ POP PDP,DEVDAT ;RETURN ONLY IF AT INTERRUPT LEVEL\r
+ JRST TPOPJ ;REMOVE ERROR CALL AND RETURN\r
+\f;ROUTINE TO PRINT PC AS:\r
+;1) "EXEC LOC XXX" OR "USER LOC XXX"\r
+;CALL: MOVE TAC1,PC TO PRINT(LH=PC FLAGS)\r
+; PUSHJ PDP,PCP\r
+\r
+\r
+XMODE: ASCIZ / AT EXEC /\r
+UMODE: ASCIZ / AT USER /\r
+\r
+PCP: MOVEI TAC,XMODE ;ASSUME PC IN EXEC MODE\r
+ TLNE TAC1,USRMOD ;IS IT?\r
+ MOVEI TAC,UMODE ;NO, USER MODE\r
+ PUSHJ PDP,CONMES ;PRINT ONE OR OTHER\r
+ HRRZ TAC,TAC1 ;PRINT RIGHT HALF IN OCTAL\r
+ ; FALL INTO OCTPNT\r
+\r
+INTERN OCTPNT\r
+\r
+;ROUTINE TO PRINT 6 DIGIT OCTAL NUMBER\r
+;CALL: MOVE DAT,TTY OUTPUT BYTE POINTER\r
+; HRR TAC, OCTAL NUMBER\r
+; PUSHJ PDP,OCTPNT\r
+; RETURN TAC1,PRESERVED,TAC DESTROYED\r
+\r
+OCTPNT: HRLZ TAC,TAC ;MOVE TO LH FOR ROTATING\r
+ TRO TAC,700000 ;SETUP AN END FLAG\r
+\r
+OCTP1: ROT TAC,3 ;GET NEXT OCTAL DIGIT\r
+ TLNN TAC,777777 ;WAS THAT FLAG?\r
+ POPJ PDP, ;YES, DO NOT PRINT IT\r
+ PUSHJ PDP,PRTNUM ;NO, PRINT OCTAL DIGIT\r
+ HRRI TAC,0 ;CLEAR RH\r
+ JRST OCTP1 ;GET NEXT OCTAL DIGIT\r
+\r
+;ROUTINE TO ADD 1 TO TAC AND PRINT DECIMAL\r
+;SAME CALL AS OCTPNT\r
+\r
+ INTERN DECP1\r
+\r
+DECP1: AOJA TAC,RADX10 ;ADD 1 AND GO PRINT\r
+\r
+;ROUTINE TO PRINT DECIMAL\r
+;CALL: SAME AS OCTPNT\r
+;TAC1: PRESERVED\r
+\r
+INTERN RADX10\r
+\r
+RADX10: PUSH PDP,TAC1 ;SAVE TAC1\r
+ PUSHJ PDP,PRTDIG ;PRINT DECIMAL DIGITS\r
+ POP PDP,TAC1 ;RESTORE TAC1\r
+ POPJ PDP, ;AND RETURN\r
+\r
+;RECURSIVE DECIMAL PRINT ROUTINE\r
+;CALL: MOVE TAC,DECIMAL NO.\r
+; PUSHJ PDP,PRTDIG\r
+\r
+PRTDIG: IDIVI TAC,12 ;DIVIDE BY 10\r
+ HRLM TAC1,(PDP) ;RT ON PD LIST\r
+ JUMPE TAC,.+2 ;FINISHED?\r
+ PUSHJ PDP,PRTDIG ;NO, CALL S OR F\r
+ HRLZ TAC,(PDP) ;YES, GET LAST NUMBER\r
+PRTNUM: ADDI TAC,"0" ;CONVERT TO ASCIZ\r
+IFN FTTTYSER,<\r
+EXTERN OUTCHS\r
+ MOVE TEM,TAC ;PUT CHAR IN CHAR AC\r
+ 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
+\f;ROUTINE TO PRINT "DEVICE XXX"\r
+;CALL MOVE DAT,ASCII OUTPUT BYTE POINTER\r
+; PUSH PDP,DEVDAT\r
+; PUSHJ PDP,ERNAM\r
+\r
+INTERNAL ERNAM\r
+\r
+ERNAM: PUSHJ PDP,INLMES\r
+ ASCIZ /DEVICE /\r
+ SKIPE TAC1,-1(PDP) ;IS DEVDAT = 0?\r
+ MOVE TAC1,DEVNAM(TAC1) ;NO, GET DEVICE NAME\r
+\r
+;ROUTINE TO PRINT SIXBIT NAME\r
+;CALL MOVE DAT,ASCII OUTPUT BYTE POINTER\r
+; MOVE TAC1,NAME\r
+; PUSHJ PDP,PRNAME\r
+\r
+INTERNAL PRNAME\r
+EXTERNAL CPOPJ\r
+\r
+PRNAME: MOVEI TAC,0\r
+ LSHC TAC,6 ;SHIFT IN NEXT CHAR.\r
+ JUMPE TAC,CPOPJ\r
+ MOVEI TEM,40(TAC) ;ASCII VERSION INTO CHREC FOR OUTCHS\r
+IFN FTTTYSER,<\r
+EXTERN OUTCHS\r
+ PUSHJ PDP,OUTCHS\r
+>\r
+IFE FTTTYSER,<\r
+ IDPB TEM,DAT\r
+>\r
+ JRST PRNAME\r
+\r
+\r
+ERREND: END\r
+\f\r
--- /dev/null
+;THIS SUB-PROGRAM ASSEMBLED WITH CONFIGURATION DEPENDENT FEATURE SWITCHES - FT40N.MAC(V002)\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=0 ;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=0 ;LOGIN-LOGOUT COMMAND AND UUOS\r
+ ;FTDISK=-1 IMPLIES FTLOGIN=-1\r
+\r
+FTCCL=0 ;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=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
--- /dev/null
+;THIS SUB-PROGRAM ASSEMBLED WITH CONFIGURATION DEPENDENT FEATURE SWITCHES - FT50SB.MAC(V002)\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=-1 ;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=-1 ;NEW PDP-10 DISK(MODEL RC-10) INSTEAD OF DATA PRODUCTS DISK\r
+\r
+FTKCT=-1 ;ACCUMULATE CORE*RUNNING TIME FOR CHARGING FOR EACH USER\r
+\r
+FTPRV=-1 ;PRIVILEGE BITS FOR EACH USER\r
+\r
+FTGETTAB=-1 ;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
--- /dev/null
+TITLE JOBDAT - JOB DATA AREA (FIRST 140 LOC OF USER AREA)
+SUBTTL T. HASTINGS/RAP TS3.19 24 SEP 68 V003
+ XP VJOBDT,003 ;DEFINE GLOBAL VERSION NUMBER FOR LOADER MAP.
+
+ENTRY DATJOB
+DATJOB:
+
+;THIS AREA PROVIDES STORAGE OF ITEMS OF INTEREST TO BOTH
+;THE MONITOR AND THE USER
+
+;MACRO TO DEFINE SYMBOLS FOR MONITOR USE ONLY
+;THESE MAY BE CHANGED TO SUIT MONITOR
+
+DEFINE M(SYMBOL,VALUE,LENGTH)
+<SYMBOL=VALUE
+INTERNAL SYMBOL
+LOC=VALUE+LENGTH>
+
+;MACRO TO DEFINE SYMBOLS FOR USER USE
+;THESE CANNOT BE CHANGED WITHOUT INVALIDATING OLD SAVED FILES
+
+DEFINE U(SYMBOL,VALUE,LENGTH)
+<SYMBOL=VALUE
+ENTRY SYMBOL
+LOC=VALUE+LENGTH>
+
+;MACRO TO DEFINE PARAMETERS OF INTEREST TO MONITOR ONLY
+;THESE MAY BE CHANGED TO SUIT MONITOR
+;MUST ASSEMBLE WITH SYSPAR TAPE FIRST
+
+DEFINE XP(SYMBOL,VALUE)
+<INTERNAL SYMBOL
+SYMBOL=VALUE>
+\f
+M JOBAC,0,20
+ ;PLACE WHERE USER ACS ARE STORED ON UUO CALLS
+ ;IE RELATIVE 0-17 IN USER AREA
+M JOBDAC,LOC,17
+ ;PLACE WHERE HARDWARE ACS(0-16) ARE STORED
+ ;WHEN JOB IS INACTIVE. THESE ARE EITHER THE
+ ;USERS AC IF JOB WAS STOPPED IN USER MODE
+ ;OR ARE THE EXEC IF STOPED IN EXEC MODE
+ ;0-16 ALSO STORED HERE ON CLK INTERRUPTS
+XP JOBDPD,JOBDAC+PDP
+ ;AC PDP DUMPED HERE
+XP JOBDPG,JOBDAC+PROG
+ ;AC PROG DUMPED HERE
+XP JOBD14,JOBDAC+14
+ ;AC 14 DUMPED HERE
+XP JOBD15,JOBDAC+15
+ ;AC 15 DUMPED HERE
+XP JOBD16,JOBDAC+16
+ ;AC 16 DUMPED HERE
+XP JOBD17,JOBDAC+17
+ ;AC 17 DUMPED HERE
+U JOBUUO,40,1
+ ;USER UUO TRAP LOC.(UUO STORED HERE)
+U JOB41,41,1
+ ;USER UUO JSR LOCATION
+U JOBERR,42,1
+ ;LH UNUSED-SAVE FOR LATER THINGS, SO USER PROGRAMS
+ ;SHOULD IGNORE LH IN ALL PROGRAMS
+ ;RH=COUNT OF NO. OF ERRORS IN RPG(RAPID PROGRAM
+ ;GENERATION) SEQUENCE OF CUSPS.
+ ;NOT CHANGED FROM GET TO GET.
+M JOBENB,43,1
+ ;LH=UNUSED
+ ;RH=APR CONSO FLAGS FOR USER APR TRAPPING
+ ;SET BY CALL [SIXBIT /APRENB/]
+U JOBREL,44,1
+ ;LH=0,RH=HIGHEST REL. ADR. IN USER AREA(IE LOW SEGMENT)
+ ;SET BY MONITOR EACH TIME JOB RUNS OR CHANGES CORE SIZE
+M JOBPD1,LOC,0
+ ;FIRST LOC. OF SYSTEM UUO PUSHDOWN LIST
+XP JOBPDL,JOBPD1-1
+ ;FIRST LOC.-1
+U JOBBLT,JOBPD1,3
+ ;3 WORDS USED BY LINKING LOADER TO MOVE PROGRAM DOWN
+ ;BEFORE CALLING EXIT.
+ ;OK TO USE EXEC PD LIST BEFORE EXECUTING UUO
+\fLOC=72
+XP MJOBPD,JOBPDL-LOC
+ ;MINUS LENGTH OF PUSHDOWN LIST
+XP MJOBP1,MJOBPD+1
+ ;-LENGTH+1
+XP JOBPRT,LOC
+ ;FIRST LOC PROTECTED BY BEING COPIED INTO MONITOR
+XP JOBPR1,JOBPRT+1
+ ;FIRST LOC+1
+M JOBHCU,LOC,1
+ ;HIGHEST USER IO CHANNEL IN USE
+ ;ONLY JOBJDA...JOBJDA+C(JOBHCU) ARE COPIED INTO
+ ;MONITOR WHEN JOB IS RUN. 0 MEANS NONE OR
+ ;CHAN. 0 IN USE, -1 MEANS SAVEGET HAS ACTIVE IO
+M JOBPC,LOC,1
+ ;JOB PC WHEN JOB INACTIVE
+U JOBDDT,74,1
+ ;LH UNUSED,RH=STARTING ADDRESS OF USER DDT
+XP JOBSAV,JOBDDT-1
+ ;FIRST LOC.-1 WRITTEN BY SAVE COMMAND
+M JOBJDA,LOC,20
+ ;JOB DEVICE ASSIGNMENT TABLE
+ ;LH=UUOS DONE SO FAR,RH=ADR. OF DEVICE DATA BLOCK IN MONITOR
+XP JOBJMH,JOBHCU-JOBJDA
+ ;JOBHCU-JOBJDA
+ ;USED BY ANYACT ROUT. IN CORE1
+XP JOBPFI,JOBJDA+17
+ ;HIGHEST LOC. IN JOB DATA AREA PROTECTED FROM IO
+XP MJOBCK,JOBPFI-JOBDAC
+ ;AREA CHECKSUMMED DURING SWAPPING
+U JOBHRL,115,1 ;LH IS ANALOGOUS TO LH OF JOBSA, IE FIRST
+ ;FREE LOC IN HIGH SEG, SET BY LINKING LOADER
+ ;USED BY SAVE.
+ ;RH ANALOGOUS TO JOBREL, IE HIGHEST LEGAL
+ ;USER ADDRESS IN HIGH SEG. SET BY MONITOR EVERY TIME
+ ;USER RUNS. IF JOBHRL=0, JOB DOES NOT HAVE A HIGH SEG
+ ;USER PROGRAMS SHOULD BE WRITTEN SO THAT
+ ;THEY CAN BE ONE OR TWO SEGMENT PROGRAMS. JOBHRL
+ ;CAN BE TESTED FOR NON-ZERO TO SEE IF HIGH SEG EXISTS
+U JOBSYM,116,1
+ ;POINTER TO LOADER AND DDT SYMBOL TABLE POINTER
+U JOBUSY,117,1
+ ;POINTER TO UNDEFINED SYMBOL TABLE
+ ;SET BY LOADER, NOT YET USED BY DDT
+U JOBSA,120,1
+ ;LH=FIRST LOC NOT LOADED BY RELOCATING LOADER
+ ;RH=STARTING ADDRESS OF USER PROGRAM
+U JOBFF,121,1
+ ;FIRST FREE LOCATION IN USER AREA
+ ;USED BY MONITOR TO ASSIGN I/O BUFFERS IN TOP
+ ;OF USER AREA
+\fU JOBS41,122,1
+ ;C(JOB41) SAVED HERE ON SAVE COMMAND
+ ;RESTORE FROM HERE ON GET
+M JOBEXM,LOC,1
+ ;LAST LOC EXAMINED OR DEPOSITED USING
+ ;D OR E COMMANDS
+ ;LH=-1 IF LAST COM WAS AN E, 0 IF IT WAS A D
+U JOBREN,124,1
+ ;REENTER ADDRESS FOR REENTER COMMAND
+U JOBAPR,125,1
+ ;PLACE TO TRAP TO IN USER AREA ON APR TRAP
+ ;ENABLED BY APRENB UUO
+U JOBCNI,126,1
+ ;APR IS CONIED INTO C(JOBCNI) ON APR TRAP
+U JOBTPC,127,1
+ ;PC IS STORED HERE ON USER APR TRAP
+U JOBOPC,130,1
+ ;OLD PC IS STORED HERE ON START,DDT,REENTER,
+ ;STARTC COMMANDS
+U JOBCHN,131,1
+ ;LH=FIRST LOC AFTER FIRST FORTRAN 4 LOADED PROGRAM
+ ;RH=FIRST LOC AFTER FIRST FORTRAN 4 BLOCK DATA
+ ;TO BE USED FOR JOB CHAINING
+M JOBFDV,LOC,1
+ ;DEV. DATA BLOCK ADR. FOR FINISH COMMAND
+U JOBCOR,133,1
+ ;SIZE OF CORE FOR JOB ON RUN,SAVE,GET COM.
+;134-136 UNUSED
+U JOBVER,137,1
+ ;CONTAINS VERSION NO.(OCTAL) OF CUSP BEING RUN
+ ;GET LOADS FROM SAVE FILE. NEVER CONVERTED
+ ;TO DECIMAL BY MAN OR MACHINE. E 137 WILL PRINT VERSION NO.
+ ;SET BY LOC 137 IN CUSP SOURCE
+XP JOBDA,140
+ ;FIRST LOC NOT USED BY JOB DATA AREA
+
+ END,
--- /dev/null
+TITLE LPTSER - LINE PRINTER SERVICE ROUTINE FOR MULTIPLE LINE PRINTERS - V405\r
+SUBTTL T. W. MCMANUS /TNM TS 20 MAY 69\r
+ XP VLPTSR,405 ;DEFINE GLOBAL VERSION NUMBER FOR LOADER MAP\r
+\r
+;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN COMMON:\r
+\r
+ EXTERNAL CPOPJ1, PION, PIOFF\r
+\r
+;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN CLOCK1:\r
+\r
+ EXTERNAL SETIOD, WAIT1\r
+\r
+;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN ERRCON:\r
+\r
+ EXTERNAL HNGSTP, ILLINP\r
+\r
+;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN UUCON:\r
+\r
+ EXTERNAL ADVBFE, IDSET, OUT, SETACT, STOIOS\r
+\r
+;THE FOLLOWING SYMBOLS ARE REFERENCED OUTSIDE OF LPTSER:\r
+\r
+ INTERN LPTINT, LPTNXT, LPTECM, LPTDON, LPTDSP\r
+ ENTRY LPTSER\r
+\r
+LPTSER:\r
+\f;LINE PRINTER CONTROL REGISTER MNEMONIC DEFINITIONS\r
+\r
+ LPTCLR=1B25 ;CLEAR LINE PRINTER BUFFER\r
+ LPTLOV=1B26 ;LINE OVERFLOW FLAG (PDP-6 ONLY)\r
+ LPTERR=1B27 ;ERROR FLAG\r
+ LPTBSY=1B28 ;BUSY FLAG\r
+ LPTDON=1B29 ;DONE FLAG\r
+ LPTECM=7B32 ;ERROR CHANNEL MASK\r
+ LPTDCM=7B35 ;DONE CHANNEL MASK\r
+ LPTBDM=LPTBSY+LPTDON ;BUSY/DONE FLAG MASK\r
+\r
+;LINE PRINTER DEVICE DEPENDANT I/O STATUS MNEMONIC DEFINITIONS\r
+\r
+ LPTEND=Z(1B10) ;CLOSE UUO HAS BEEN DONE\r
+ LPTSYN=Z(1B11) ;CREF AFTER CLOSE UUO HAS BEEN SENT\r
+\r
+;LINE PRINTER DEVICE DATA BLOCK ADDRESSING MNEMNIC DEFINITIONS\r
+\r
+ LPTCON=-4 ;RH = SKIP CHAIN MASK REGISTER\r
+ LPTPTR= 7 ;BLOCK OUTPUT POINTER\r
+ LPTCH= 11 ;INTERRUPT CHANNEL ASSIGNMENTS\r
+ LPTSVE=12 ;DDB ROUTINE TO SAVE AC'S\r
+ LPTEX1=16 ;DDB EXIT ROUTINE IF AC'S NOT SAVED\r
+ LPTSV2=20 ;TEMP. SAVE LOCN. FOR TAC\r
+ LPTECH=21 ;CONSZ LP?,LPTECM\r
+ LPTDNE=22 ;CONSO LP?,LPTDON\r
+ LPTCSO=23 ;CONSO LP?,(TAC)\r
+ LPTCSZ=24 ;CONSZ LP?,(TAC)\r
+ LPTCNI=25 ;CONI LP?,TAC\r
+ LPTCNO=26 ;CONO LP?,(TAC)\r
+ LPTDTO=27 ;DATAO LP?,(TAC)\r
+ LPTBKO=30 ;BLKO LP?,LP?PTR\r
+\r
+;LINE PRINTER SERVICE DISPATCH TABLE\r
+\r
+ JRST LPTINI ;INITIALIZE\r
+ JRST LPTHNG ;HUNG DEVICE ERROR\r
+LPTDSP: JRST LPTREL ;RELEASE\r
+ JRST LPTCLS ;CLOSE\r
+ JRST LPTOUT ;OUTPUT\r
+ JRST ILLINP ;INPUT\r
+\f;LINE PRINTER INITIALIZATION, HUNG DEVICE AND RELEASE CODE\r
+\r
+ ;LPTINI IS CALLED AT SYSTEM INITIALIZATION TIME FROM\r
+ ;IOGO IN SYSINI WITH THE DDB ADDRESS IN DEVDAT\r
+ \r
+ ;LPTHNG IS CALLED FROM DEVCHK IN UUOCON (IOCSS) WITH\r
+ ;THE DDB ADDRESS IN DEVDAT WHENEVER A LINE PRINTER\r
+ ;HUNG DEVICE COUNT IS DECREMENTED TO ZERO\r
+\r
+ ;LPTREL IS CALLED FROM RELEA1 IN UUOCON WITH THE DDB\r
+ ;ADDRESS IN DEVDAT WHENEVER A RELEASE UUO IS EXECUTED\r
+ ;FOR A LINE PRINTER\r
+\r
+ ;EACH OF THE ABOVE ROUTINE MUST:\r
+ ;\r
+ ; 1. CLEAR THE SPECIFIED LINE PRINTER\r
+ ; 2. DEASSIGN BOTH THE ERROR AND DONE INTERRUPT\r
+ ; CHANNELS FOR THE LINE PRINTER\r
+ ; 3. CLEAR THE SKIP CHAIN INTERRUPT MASK FLAGS\r
+ ; FOR THAT LINE PRINTER\r
+\r
+ ;NOTE: THE LPTINI CODE FORCES IOGO IN SYSINI TO INVOKE\r
+ ; LPTINI FOR EACH LINE PRINTER ON THE SYSTEM RATHER\r
+ ; THAN FOR THE NORMAL CASE WHERE IT INVOKES THE\r
+ ; INITIALIZATION CODE ONCE FOR EACH DISPATCH TABLE.\r
+ ;\r
+ ; THEREFORE, THE CORRECT OPERATION OF THE LPTINI CODE\r
+ ; IS DEPENDANT UPON THE IOGO CODE WHICH SHOULD BE:\r
+ ;\r
+ ; PUSHJ PDP,DINI(AC3)\r
+ ; HRRZM AC3,SAVITM\r
+\r
+LPTHNG:\r
+LPTREL:\r
+ SOS (PDP) ;COUNTERACT SKIP RETURN\r
+LPTINI: MOVEI TAC,LPTCLR ;CLEAR THE LINE PRINTER\r
+ XCT LPTCNO(DEVDAT)\r
+ HLLZS LPTCON(DEVDAT) ;CLEAR SKIP CHAIN MASK FLAGS\r
+ JRST CPOPJ1 ;SKIP RETURN IF ENTERED AT LPTINI\r
+ ; TO FORCE CALL FOR EACH LPT\r
+\r
+;LINE PRINTER CLOSE UUO ROUTINE\r
+\r
+LPTCLS: TLO IOS,LPTEND ;TURN ON THE END FLAG\r
+ TLZ IOS,LPTSYN ;TURN OFF SYNCHRONIZATION FLAG\r
+ MOVEM IOS,DEVIOS(DEVDAT) ;SAVE IOS IN THE DDB\r
+ JRST OUT ; AND RETURN TO UUOCON\r
+\f;LINE PRINTER OUTPUT UUO ROUTINE\r
+\r
+LPTOUT: SETZ TAC, ;CLEAR ALL POSSIBLE\r
+ XCT LPTCNO(DEVDAT) ; LINE PRINTER FLAGS\r
+ MOVEI TAC,LPTERR ;SET MASK FOR ERROR FLAG\r
+ XCT LPTCSO(DEVDAT) ;SKIP IF ERROR FLAG IS ON\r
+ JRST .+3 ; LPT IS NOT OFF, NOT ON LOCAL\r
+ PUSHJ PDP,HNGSTP ;STOP JOB AND PRINT REMINDER\r
+ JRST LPTOUT ;TRY AGAIN WHEN USER TYPES "CONT"\r
+ TLNE IOS,IOBEG ;IS THIS FIRST OUTPUT SINCE INIT?\r
+ JRST LPTNEW ; YES\r
+ PUSHJ PDP,LPTSET ; NO, SET UP BLKO POINTER\r
+LPTGO: PUSHJ PDP,SETACT ;SET I/O ACTIVE BIT, STORE IOS\r
+ ; AND SET HUNG DEVICE COUNT\r
+ MOVE TAC,LPTCH(DEVDAT) ;GET CHANNEL ASSIGNMENTS FROM DDB\r
+ TLNE IOS,IOBEG ;IS THIS FIRST OUTPUT SINCE INIT?\r
+ IORI TAC,LPTCLR+LPTDON ;SET LPTCLR IF IOBEG:=1, ELSE\r
+ XORI TAC,LPTDON ; SET LPTDON\r
+ HRLI TAC,LPTLOV+LPTERR+LPTDON ;GET SKIP CHAIN MASK FLAGS\r
+ CONO PI,PIOFF ;TURN OFF PI TO PREVENT IMM. INT.\r
+ XCT LPTCNO(DEVDAT) ;SEND CONDITIONS OUT TO LPT\r
+ HLRM TAC,LPTCON(DEVDAT) ;SAVE SKIP CHAIN MASK FLAGS\r
+ CONO PI,PION ;REENABLE ALL INTERRUTPS\r
+ POPJ PDP, ; AND RETURN TO UUOCON\r
+\r
+LPTNEW: TLO IOS,IO ;SET I/O DIRECTION TO OUTPUT\r
+ SETZM LPTPTR(DEVDAT) ;CLEAR BLKO POINTER\r
+ JRST LPTGO ;RETURN TO MAINSTREAM\r
+\f;LINE PRINTER INTERRUPT SERVICE ROUTINE\r
+\r
+LPTINT: XCT LPTECH(DEVDAT) ;SKIP IF NO ERROR CHANNEL ASSIGNED\r
+ XCT LPTDNE(DEVDAT) ;SKIP IF DONE FLAG IS UP\r
+ JRST LPTER1 ; BRANCH TO ERROR SERVICE ROUTINE\r
+ SKIPL LPTPTR(DEVDAT) ;BLKO COUNT TO 0 ON PREV. INTERRUPT\r
+ JRST LPTSVE(DEVDAT) ; YES, GO SAVE ORIGINAL AC'S\r
+ XCT LPTBKO(DEVDAT) ; NO, SEND NEXT WORD FOR PRINTING\r
+ JRST LPTEX1(DEVDAT) ;LAST WORD SENT BUT INTERRUPT PENDING\r
+ JRST LPTEX1(DEVDAT) ;GO RESTORE DEVDAT AND RETURN\r
+\r
+LPTNXT: ;ENTER HERE AFTER DDB ROUTINE SAVE\r
+ ; ORIGINAL AC'S IN PROPER CHANNEL\r
+ ; SAVE AREA AND SETS UP DEVDAT\r
+ ; TO POINT TO DDB AGAIN\r
+\r
+ PUSHJ PDP,IOSET ;SET AC PROG:= JOB AREA ADDRESS AND\r
+ ; AC IOS:= DEVIOS IN THE DDB\r
+ TLZE IOS,IOBEG ;FIRST BUFFER SINCE INIT?\r
+ JRST LPTBG1 ; YES, GO OUTPUT A CRFF\r
+ PUSHJ PDP,ADVBFE ; NO, ADVANCE TO NEXT BUFFER\r
+ JRST LPTOFF ;CANNOT ADVANCE, BUFFER UNAVAILABLE\r
+ PUSHJ PDP,LPTSET ;SET UP NEW BLKO POINTER\r
+LPTWCK: TLZE IOS,IOW ;IS JOB WAITING FOR I/O COMPLETION?\r
+ PUSHJ PDP,SETIOD ; YES, ARRANGE FOR JOB TO RUN AGAIN\r
+LPTEX2: JRST STOIOS ;SAVE IOS, RESET HUNG DEVICE COUNT\r
+ ; AND DISMISS INTERRUPT\r
+\r
+LTPOFF: TLNN IOS,LPTEND ;SKIP IF CLOSE HAS BEEN DONE\r
+ JRST LPTOF1 ; GO TURN PRINTER OFF UNTIL NEXT OUTPUT\r
+ TLON IOS,LPTSYN ;HAS FINAL CRFF BEEN OUTPUT?\r
+ JRST LPTBG2 ; NO, SO GO DO IT\r
+ TLZ IOS,LPTEND ; YES, SO CLEAR END FLAG\r
+LPTOF1: TRZ IOS,IOACT ;CLEAR I/O ACTIVE BIT\r
+ SETZ TAC, ;CLEAR TAC AND\r
+ XCT LPTCNO(DEVDAT) ; TURN LPT OFF\r
+ HLLZS LPTCON(DEVDAT) ;CLEAR SKIP CHAIN MASK FLAGS\r
+ JRST LPTWCK ; AND BRANCH\r
+\r
+LPTBG1: PUSHJ PDP,LPTSET ;SET UP INITIAL BLKO POINTER *****\r
+LPTBG2: MOVEI TAC,[EXP 15B6+14B13] ;SEND OUT A CRFF\r
+ XCT LPTDTO(DEVDAT)\r
+ JRST LPTEX2 ;GO DISMISS ITERRUPT\r
+\f;LINE PRINTER ERROR HANDLING ROUTINE\r
+\r
+LPTER1: MOVEM TAC,LPTSV2(DEVDAT) ;SAVE TAC IN DDB\r
+ MOVEI TAC,LPTLOV ;GET LINE OVERFLOW ERROR MASK\r
+ XCT LPTCSO(DEVDAT) ;SKIP IF LINE OVERFLOW FLAG IS ON\r
+ JRST LPTER2 ; GO CHECK IF PREVIOUS ERROR OCCURRED\r
+ MOVN TAC,[EXP 100001] ;DECREMENT BLK0 POINTER\r
+ ADDM TAC,LPTPTR(DEVDAT)\r
+ MOVE TAC,[EXP 15B6+12B13] ;PRINT CRLF\r
+ XCT LPTDTO(DEVDAT)\r
+ JRST LPTER4\r
+\r
+LPTER4: XCT LPTECH(DEVDAT) ;SKIP IF ERROR INTERRUPT NOT ASSIGNED\r
+ JRST LPTER5 ; ERROR CONDITION DETECTED\r
+ MOVE TAC,LPTCH(DEVDAT) ;GET INTERRUPT CHANNEL ASSIGNMENTS\r
+ ANDI TAC,LPTDCM ;MASK OUT ERROR CHANNEL\r
+ IORI TAC,LPTBSY ;SET THE BUSY FLAG\r
+ XCT LPTCNO(DEVDAT) ;SEND IT OUT TO THE LPT\r
+ MOVEI TAC,LPTRLOV+LPTERR+LPTDON ;ENABLE FOR ALL INTERRUPTS\r
+LPTER3: HRRM TAC,LPTCON(DEVDAT) ;SAVE SKIP CHAIN MASK FLAGS\r
+LPTER4: MOVE TAC,LPTSV2(DEVDAT) ;RESTORE SAVED ACCUMULATOR\r
+ JRST LPTEX1(DEVDAT) ; AND GO DISMISS INTERRUPT\r
+\r
+LPTER5: MOVE TAC,LPTCH(DEVDAT) ;GET INTERRUPT CHANNEL ASSIGNMENTS\r
+ ANDI TAC,LPTDCM ;MASK OUT ERROR CHANNEL ASSIGNMENT\r
+ IORI TAC,LPTBSY ;SET BUSY FLAG\r
+ XCT LPTCNO(DEVDAT) ;SEND IT OUT TO THE LPT\r
+ MOVEI TAC,LPTDON ;ENABLE FOR DONE FLAG ONLY\r
+ JRST LPTER3\r
+\f;LINE PRINTER BLKO POINTER SETUP ROUTINE\r
+\r
+LPTSET: MOVEI TAC,@DEVOAD(DEVDAT) ;GET ABS. ADDR. OF CURRENT BUFFER\r
+ MOVN TAC1,1(TAC) ;GET NEGATIVE WORD COUNT\r
+ HRL TAC,TAC1 ;COMBINE NEG. WORD COUNT AND ADDR,\r
+ AOJ TAC, ;INCREMENT BUFFER ADDRESS TO FORM\r
+ MOVEM TAC,LPTPTR(DEVDAT) ; LPTPTR:= -(WORD COUNT),(BUFF, ADDR, +1)\r
+ POPJ PDP, ; AND RETURN\r
+\r
+\r
+ END\r
+\r
+\r
+\r
+\r
+
\ No newline at end of file
--- /dev/null
+TITLE MACRO V.46(52) \r
+SUBTTL RPG/CMF/JF/PMH/DMN 7-SEPT-71\r
+;COPYRIGHT 1968,1969,1970,1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.\r
+\r
+ VMACRO==46 ;VERSION NUMBER\r
+ VUPDATE==0 ;DEC UPDATE LEVEL\r
+ VEDIT==52 ;EDIT NUMBER\r
+ VCUSTOM==0 ;NON-DEC UPDATE LEVEL\r
+\r
+\r
+ LOC <JOBVER==137>\r
+ <VCUSTOM>B2+<VMACRO>B11+<VUPDATE>B17+VEDIT\r
+ RELOC\r
+ MLON\r
+\r
+COMMENT * ASSEMBLY FEATURE SWITCHES (ACTION WHEN NON-ZERO)\r
+\r
+ SWITCHES ON (NON-ZERO) IN DEC VERSION\r
+SEG2SW GIVES TWO SEGMENT MACRO\r
+PURESW GIVES VARIABLES IN LOW SEGMENT\r
+CCLSW GIVES RAPID PROGRAM GENERATION FEATURE\r
+FTDISK GIVES DISK FEATURES\r
+RUNSW USE RUN UUO FOR "DEV:NAME!"\r
+TEMP TMPCOR UUO IS TO BE USED\r
+RENTSW ASSEMBLE REENTRANT PROGRAMS\r
+FORMSW USE MORE READABLE FORMATS FOR LISTING (ICCSW)\r
+DFRMSW DEFAULT CONDITION OF FORMAT PRINTING (MULTI-FORM IF ON)\r
+\r
+ SWITCHES OFF (ZERO) IN DEC VERSION\r
+STANSW GIVES STANFORD FEATURES\r
+LNSSW GIVES LNS VERSION\r
+WFWSW GIVES ARRAY, INTEGER AND LVAR FEATURES\r
+IIISW GIVES III FEATURES\r
+OPHSH GIVES HASH SEARCH OF OPCODES\r
+KI10 GIVES KI10 OP-CODES\r
+*\r
+\fSUBTTL DEFAULT ASSEMBLY SWITCH SETTINGS\r
+\r
+IFDEF TWOSEG,<IFNDEF SEG2SW,<SEG2SW==1>>\r
+IFNDEF SEG2SW,<SEG2SW==0>\r
+IFN SEG2SW,<PURESW==1>\r
+\r
+IFNDEF PURESW,<PURESW==1>\r
+\r
+IFNDEF STANSW,<STANSW==0>\r
+\r
+IFNDEF RENTSW,<RENTSW==1>\r
+\r
+IFNDEF LNSSW,<LNSSW==0>\r
+IFN LNSSW,<FTDISK==0>\r
+\r
+IFNDEF RUNSW,<RUNSW==0>\r
+\r
+IFNDEF CCLSW,<CCLSW==1>\r
+IFN CCLSW,<FTDISK==1>\r
+\r
+IFNDEF TEMP,<TEMP==0>\r
+\r
+IFNDEF WFWSW,<WFWSW==0>\r
+\r
+\r
+IFNDEF FTDISK,<FTDISK==0>\r
+IFNDEF DFRMSW,<DFRMSW==0>\r
+IFN DFRMSW,<FORMSW==0>\r
+IFDEF ICCSW,<FORMSW==ICCSW> ;SAME SWITCH\r
+IFNDEF FORMSW,<FORMSW==0>\r
+\r
+IFNDEF IIISW,<IIISW==0>\r
+\r
+IFNDEF OPHSH,<OPHSH==0>\r
+\r
+IFNDEF KI10,<KI10==0>\r
+\fSUBTTL OTHER PARAMETERS\r
+\r
+.PDP== ^D50 ;BASIC PUSH-DOWN POINTER\r
+IFNDEF LPTWID,<LPTWID==^D132> ;DEFAULT WIDTH OF PRINTER\r
+.LPTWD==8*<LPTWID/8> ;USEFUL WIDTH IN MAIN LISTING\r
+.CPL== .LPTWD-^D32 ;WIDTH AVAIABLE FOR TEXT WHEN\r
+ ;BINARY IS IN HALFWORD FORMAT\r
+IFE STANSW,<.LPP==^D55 ;LINES/PAGE>\r
+IFN STANSW,<.LPP==^D52 ;LINES/PAGE>\r
+.STP== ^D40 ;STOW SIZE\r
+.TBUF== ^D80 ;TITLE BUFFER\r
+.SBUF== ^D80 ;SUB-TITLE BUFFER\r
+.IFBLK==^D20 ;IFIDN COMPARISON BLOCK SIZE\r
+.R1B==^D18\r
+.UNIV==^D10 ;NUMBER OF UNIVERSAL DEFINITIONS\r
+.LEAF==4 ;SIZE OF BLOCKS IN MACRO TREE\r
+\r
+NCOLS==LPTWID/^D32 ;NUMBER OF COLUMNS IN SYMBOL TABLE\r
+IFN CCLSW,<IFNDEF CTLSIZ,<CTLSIZ==^D200>>\r
+IFN OPHSH,<IFNDEF PRIME,<PRIME==^D701>>\r
+IFNDEF NUMBUF,<\r
+IFE STANSW!LNSSW,<NUMBUF==2 ;NUMBER OF INPUT BUFFERS>\r
+IFN STANSW,<NUMBUF==5 ;NUMBER OF INPUT BUFFERS>\r
+IFN LNSSW,<NUMBUF==4 ;DOUBLE BUFFER FOR DOUBLE SIZE DEVICES>\r
+>\r
+\r
+EXTERN JOBREL,JOBSYM,JOBDDT,JOBFF,JOBAPR,JOBSA\r
+IFN CCLSW,< EXTERN JOBERR>\r
+\r
+IFN PURESW,<\r
+IFE SEG2SW,<HISEG>\r
+IFN SEG2SW,<TWOSEGMENTS\r
+LOWL: ;START OF LOW SEGMENT\r
+ RELOC 400000>>\r
+\r
+ SALL ;SUPPRESS ALL MACROS\r
+\r
+;SOME ASCII CHARACTERS\r
+\r
+HT==11\r
+LF==12\r
+VT==13\r
+FF==14\r
+CR==15\r
+EOL==33\r
+\f ;ACCUMULATORS\r
+AC0== 0\r
+AC1= AC0+1\r
+AC2= AC1+1\r
+SDEL= 3 ;SEARCH INCREMENT\r
+SX= SDEL+1 ;SEARCH INDEX\r
+ARG= 5 ;ARGUMENT\r
+V= 6 ;VALUE\r
+C= 7 ;CURRENT CHARACTER\r
+CS= C+1 ;CHARACTER STATUS BITS\r
+RC= 11 ;RELOCATION BITS\r
+MWP= 12 ;MACRO WRITE POINTER\r
+MRP= 13 ;MACRO READ POINTER\r
+IO= 14 ;IO REGISTER (LEFT)\r
+ER== IO ;ERROR REGISTER (RIGHT)\r
+FR= 15 ;FLAG REGISTER (LEFT)\r
+RX== FR ;CURRENT RADIX (RIGHT)\r
+MP= 16 ;MACRO PUSHDOWN POINTER\r
+PP= 17 ;BASIC PUSHDOWN POINTER\r
+\r
+%OP== 3\r
+%MAC== 5\r
+%DSYM== 2\r
+%SYM== 1\r
+%DMAC== %MAC+1\r
+\r
+OPDEF RESET [CALLI 0]\r
+OPDEF SETDDT [CALLI 2]\r
+OPDEF DDTOUT [CALLI 3]\r
+OPDEF DEVCHR [CALLI 4]\r
+OPDEF WAIT [MTAPE 0]\r
+OPDEF CORE [CALLI 11]\r
+OPDEF EXIT [CALLI 12]\r
+OPDEF UTPCLR [CALLI 13]\r
+OPDEF DATE [CALLI 14]\r
+OPDEF APRENB [CALLI 16]\r
+OPDEF MSTIME [CALLI 23]\r
+OPDEF PJOB [CALLI 30]\r
+OPDEF RUN [CALLI 35]\r
+OPDEF TMPCOR [CALLI 44]\r
+\r
+IFN STANSW,< OPDEF SWAP [CALLI 400004] >\r
+\f ;FR FLAG REGISTER (FR/RX)\r
+IOSCR== 000001 ;NO CR AFTER LINE\r
+MTAPSW==000004 ;MAG TAPE\r
+ERRQSW==000010 ;IGNORE Q ERRORS\r
+LOADSW==000020 ;END OF PASS1 & NO EOF YET\r
+DCFSW== 000040 ;DECIMAL FRACTION\r
+RIM1SW==000100 ;RIM10 MODE\r
+NEGSW== 000200 ;NEGATIVE ATOM\r
+RIMSW== 000400 ;RIM OUTPUT\r
+PNCHSW==001000 ;RIM/BIN OUTPUT WANTED\r
+CREFSW==002000\r
+R1BSW== 004000 ;RIM10 BINARY OUTPUT\r
+TMPSW== 010000 ;EVALUATE CURRENT ATOM\r
+INDSW== 020000 ;INDIRECT ADDRESSING WANTED\r
+RADXSW==040000 ;RADIX ERROR SWITCH\r
+FSNSW== 100000 ;NON BLANK FIELD SEEN\r
+MWLFLG==200000 ;ON FOR DON'T ALLOW MULTI-WORD LITERALS\r
+P1== 400000 ;PASS1\r
+\r
+ ;IO FLAG REGISTER (IO/ER)\r
+FLDSW== 400000 ;ADDRESS FIELD\r
+IOMSTR==200000\r
+ARPGSW==100000 ;ALLOW RAPID PROGRAM GENERATION\r
+IOPROG==040000 ;SUPRESS LISTING (LIST/XLIST PSEUDO OP)\r
+NUMSW== 020000\r
+IOMAC== 010000 ;MACRO EXPANSION IN PROGRESS\r
+IOPALL==004000 ;SUPRESS LISTING OF MACRO EXPANSIONS\r
+IONCRF==002000 ;SUPRESS OUTPUT OF CREF INFORMATION\r
+CRPGSW==001000 ;CURRENTLY IN PROGRESS ON RPG\r
+IOCREF==000400 ;WE ARE NOW OUTPUTTING CREF INFO\r
+IOENDL==000200 ;BEEN TO STOUT\r
+IOPAGE==000100\r
+DEFCRS==000040 ;THIS IS A DEFINING OCCURANCE (MACROS)\r
+IOIOPF==000020 ;IOP INSTRUCTION SEEN\r
+MFLSW== 000010 ;MULTI-FILE MODE,PRGEND SEEN\r
+IORPTC==000004 ;REPEAT CURRENT CHARACTER\r
+IOTLSN==000002 ;TITLE SEEN\r
+IOSALL==000001 ;SUPPRESS MACRO LISTING EVEN IF BINARY IS GENERATED\r
+\r
+OPDEF JUMP1 [JUMPL FR, ] ;JUMP IF PASS 1\r
+OPDEF JUMP2 [JUMPGE FR, ] ;JUMP IF PASS 2\r
+\r
+OPDEF JUMPOC [JUMPGE IO, ] ;JUMP IF IN OP-CODE FIELD\r
+OPDEF JUMPAD [JUMPL IO, ] ;JUMP IF IN ADDRESS FIELD\r
+\r
+OPDEF JUMPCM [JUMPL CS, ] ;JUMP IF CURRENT CHAR IS COMMA\r
+OPDEF JUMPNC [JUMPGE CS, ] ;JUMP IF CURRENT CHAR IS NON-COMMA\r
+\r
+\f ;ER ERROR REGISTERS (IO/ER)\r
+ERRM== 000020 ;MULTIPLY DEFINED SYMBOL\r
+ERRE== 000040 ;ILLEGAL USE OF EXTERNAL\r
+ERRP== 000100 ;PHASE DISCREPANCY\r
+ERRO== 000200 ;UNDEFINED OP CODE\r
+ERRN== 000400 ;NUMBER ERROR\r
+ERRV== 001000 ;VALUE PREVIOUSLY UNDEFINED\r
+ERRU== 002000 ;UNDEFINED SYMBOL\r
+ERRR== 004000 ;RELOCATION ERROR\r
+ERRL== 010000 ;LITERAL ERROR\r
+ERRD== 020000 ;REFERENCE TO MULTIPLY DEFINED SYMBOL\r
+ERRA== 040000 ;PECULIAR ARGUMENT\r
+ERRX== 100000 ;MACRO DEFINITION ERROR\r
+ERRQ== 200000 ;QUESTIONABLE, NON-FATAL ERROR\r
+ERRORS==777760\r
+LPTSW== 000002\r
+TTYSW== 000001\r
+\r
+ ;SYMBOL TABLE FLAGS\r
+SYMF== 400000 ;SYMBOL\r
+TAGF== 200000 ;TAG\r
+NOOUTF==100000 ;NO DDT OUTPUT WFW\r
+SYNF== 040000 ;SYNONYM\r
+MACF== SYNF_-1 ;MACRO\r
+OPDF== SYNF_-2 ;OPDEF\r
+PNTF== 004000 ;"VALUE" IN SYMBOL TBL IS PNTR TO 36BIT VALUE\r
+UNDF== 002000 ;UNDEFINED\r
+EXTF== 001000 ;EXTERNAL\r
+INTF== 000400 ;INTERNAL\r
+ENTF== 000200 ;ENTRY\r
+VARF== 000100 ;VARIABLE\r
+MDFF== 000020 ;MULTIPLY DEFINED\r
+SPTR== 000010 ;SPECIAL EXTERNAL POINTER\r
+SUPRBT==000004 ;SUPRESS OUTPUT TO DDT\r
+LELF== 000002 ;LEFT HAND RELOCATABLE\r
+RELF== 000001 ;RIGHT HAND RELOCATABLE\r
+\r
+LITF== 200000 ;FLAG FOR PSEUDO-OPS INVALID IN LIT'S\r
+ADDF== 100000 ;FLAG FOR PSEUDO-OPS INVALID IN ADDRESSES\r
+\r
+TNODE== 200000 ;TERMINAL NODE FOR EVALEX\r
+\fSUBTTL RUN UUO\r
+\r
+IFN CCLSW,<\r
+IFN RUNSW,< XLIST >\r
+IFE RUNSW,<\r
+;THIS CODE MUST BE IN FIRST 1K TO ALLOW MAXIMUM SPACE\r
+; FOR OVERWRITING\r
+; 74 APPEARS BECAUSE ONLY LOCS 74 AND BEYOND ARE SAVED BY "SAVE"\r
+\r
+IFN CCLSW,<NUNCOM: IOWD 0,INHERE ;WHERE TO DO IO\r
+ 0 ;TERMINATE COMMAND LIST\r
+NUNGO2: IN BIN,NUNCOM ;READ FILE\r
+ JRST NUNGO3 ;THERE ARE NO ERRORS\r
+NUNERR: DDTOUT NUNPNT, ;COMPLAIN\r
+ EXIT ;GIVE UP\r
+NUNERM: ASCIZ /?LINKAGE ERROR/\r
+NUNGO3: SKIPE 12,INHERE+133-74 ;LOOK AT JOBCOR\r
+ ;DOES JOB WANT TO RUN IN MORE CORE?\r
+ CAMG 12,JOBREL ;MORE CORE THAN CURRENTLY USED?\r
+ JRST NUNGO4 ;NO, GO BLT PROG\r
+ CORE 12, ;ASK FOR MORE CORE\r
+ JRST NUNERR ;NOT AVAILABLE\r
+ JRST NUNGO4 ;GO BLT PROGRAM\r
+INHERE:\r
+\f;THIS CODE MUST BE IN FIRST 1K\r
+NUNSET: JUMPN ACDEV,.+2 ;DEVICE SPECIFIED?\r
+ MOVSI ACDEV,(SIXBIT /SYS/) ;NO, USE SYSTEM DEVICE\r
+ JUMPN ACEXT,.+2 ;EXT SPECIFIED?\r
+ MOVSI ACEXT,(SIXBIT /SAV/) ;NO, USE "SAV"\r
+ MOVEM ACDEV,NUNDEV ;DEVICE NAME TO USE\r
+ OPEN BIN,NUNINI ;INIT THE DEVICE\r
+ JRST EINIT ;ERROR\r
+ MOVEM ACFILE,NUNDIR ;IS THE FILE AVAILABLE?\r
+ HLLZM ACEXT,NUNDIR+1 ;STASH EXTENSION\r
+ SETZM NUNDIR+3 ;CLEAR PPN\r
+ LOOKUP BIN,NUNDIR ;LOOK FOR FILE\r
+ JRST [HLRZ ACEXT,NUNDIR+1 ;WAS EXTENSION "SAV"?\r
+ CAIE ACEXT,(SIXBIT /SAV/) ;...\r
+ JRST ERRCF ;GO COMPLAIN\r
+ MOVSI ACEXT,(SIXBIT /DMP/) ;TRY "DMP" EXTENSION\r
+ JRST .-3 ] ;TRA -3,4\r
+ PUSHJ PP,DELETE ;COMMAND FILE\r
+ MOVE 15,NUNDIR ;GET THE NAME\r
+ CALLI 15,43 ;TELL SYSTEM "SETNAM"\r
+ HLRO 15,NUNDIR+3 ;GET WORD COUNT\r
+ HRLM 15,NUNCOM ;STASH COUNT\r
+ MOVNS 15 ;NEGATIVE COUNT\r
+ MOVEI 16,73(15) ;WHERE TO STOP BLT\r
+ ADDI 15,INHERE ;HOW BIG TO MAKE CORE\r
+ IORI 15,1777 ;AN EVEN MULTIPLE OF 1K\r
+ CORE 15, ;ASK TS EXEC FOR CORE\r
+ JRST [HRROI RC,[SIXBIT /NOT ENUF CORE FOR LINKAGE@/]\r
+ JRST ERRFIN ];GO COMPLAIN\r
+ MOVSI NUNTOP,NUNAC\r
+ BLT NUNTOP,NUNTOP ;SET ACS\r
+ HRR NUNBLT,16 ;...\r
+ TLNN IO,CRPGSW ;WAS RPG IN PROGRESS?\r
+ TLZ NUNAOS,577000 ;NO, DON'T MAKE NEXT AN RPG\r
+ JRST NUNGO2\r
+\r
+NUNAC: PHASE 0\r
+NUNGO4: MOVE NUNLAC,INHERE+74-74 ;SETUP FOR NEW DDT\r
+ SETDDT NUNLAC, ;...\r
+INTERN JOBS41\r
+JOBS41=122 ;LOADER WILL GIVE MUL. DEF. GLOBAL IF CHANGED\r
+\r
+EXTERN JOB41\r
+ MOVE NUNLAC,JOBS41+INHERE-74 ;RESTORE LOC 41\r
+ MOVEM NUNLAC,JOB41 ;...\r
+NUNBLT: BLT NUNTOP,.-. ;MOVE PRGM TO WHERE IT BELONGS\r
+ RESET ;RESET ALL I/O\r
+NUNAOS: AOS 1,JOBSA ;GET STARTING ADDR FOR RPG\r
+ JRST 0(1) ;GET ON WITH THE GAME\r
+NUNPNT: NUNERM ;ERROR MESSAGE POINTER\r
+NUNTOP: XWD INHERE+1,75\r
+NUNLAC=.\r
+ DEPHASE\r
+> >\r
+ LIST\r
+\r
+\fIFN RUNSW,< ;ASSEMBLE IF RUN UUO IMPLEMENTED\r
+NUNSET: JUMPN ACDEV,.+2\r
+ MOVSI ACDEV,(SIXBIT /SYS/) ;USE SYS IF NONE SPECIFIED\r
+ MOVEM ACDEV,RUNDEV\r
+IFE STANSW,<\r
+ MOVEM ACFILE,RUNFIL ;STORE FILE NAME\r
+ PUSHJ PP,DELETE ;COMMAND FILE\r
+ SETZM RUNPP\r
+ MOVEI 16,RUNDEV ;XWD 0,RUNDEV\r
+ TLNE IO,CRPGSW ;WAS RPG IN PROGRESS?\r
+ HRLI 16,1 ;YES. START NEXT AT C(JOBSA)+1\r
+ RUN 16, ;DO "RUN DEV:NAME"\r
+> ;IFE STANSW,\r
+IFN STANSW,<\r
+ MOVEM ACFILE,RUNDEV+1\r
+ SETZM RUNDEV+2\r
+ SETZM RUNDEV+3\r
+ SETZM RUNDEV+4\r
+ TLNE IO,CRPGSW ;ARE WE DOING RPG?\r
+ AOS RUNDEV+3 ;YES SET STARTING ADDRESS INCREMENT\r
+ MOVEI 16,RUNDEV ;ADDRESS OF SWAPBLOCK\r
+ SWAP 16,\r
+> ;IFN STANSW\r
+ HALT ;SHOULDN'T RETURN. HALT IF IT DOES\r
+>\r
+\r
+DELETE: HRRZ EXTMP ;IF THE EXTENSION\r
+ CAIE (SIXBIT/TMP/) ;IS .TMP\r
+ POPJ PP, ;RETURN.\r
+ CLOSE CTL2, ;DELETE\r
+ SETZB 4,5 ;THE COMMAND FILE.\r
+ SETZB 6,7\r
+ RENAME CTL2,4 ;\r
+ JFCL\r
+ POPJ PP,\r
+>\r
+\fSUBTTL START ASSEMBLING\r
+\r
+ASSEMB: PUSHJ PP,INZ ;INITIALIZE FOR PASS\r
+ MOVE [ASCII /.MAIN/]\r
+ MOVEM TBUF\r
+ MOVEI SBUF\r
+ HRRM SUBTTX\r
+\r
+ASSEM1: PUSHJ PP,CHARAC ;TEST FOR FORM FEED\r
+ SKIPGE LIMBO ;CRLF FLAG?\r
+ JRST ASSEM1 ;YES ,IGNORE LF\r
+ CAIN C,14\r
+ SKIPE SEQNO\r
+ JRST ASSEM2\r
+ PUSHJ PP,OUTFF1\r
+ PUSHJ PP,OUTLI\r
+ JRST ASSEM1\r
+\r
+ASSEM2: AOS TAGINC\r
+ CAIN C,"\" ;BACK-SLASH?\r
+ TLZA IO,IOMAC ;YES, LIST IF IN MACRO\r
+ TLO IO,IORPTC\r
+ PUSHJ PP,STMNT ;OFF WE GO\r
+ TLZN IO,IOENDL ;WAS STOUT PRE-EMPTED?\r
+ PUSHJ PP,STOUT ;NO, POLISH OFF LINE\r
+ JRST ASSEM1\r
+\r
+\fSUBTTL STATEMENT PROCESSOR\r
+\r
+STMNT: TLZ FR,INDSW!FSNSW\r
+ TLZA IO,FLDSW\r
+STMNT1: PUSHJ PP,LABEL\r
+STMNT2: PUSHJ PP,ATOM ;GET THE FIRST ATOM\r
+ CAIN C,35 ;"="?\r
+ JRST ASSIGN ;YES\r
+ CAIN C,32 ;":"?\r
+ JRST STMNT1 ;YES\r
+ JUMPAD STMNT7 ;NUMERIC EXPRESSION\r
+ JUMPN AC0,STMN2A ;JUMP IF NON NULL FIELD\r
+ SKIPN LITLVL ;ALLOW COMMA IN LITERALS\r
+ CAIE C,14 ;NULL, COMMA?\r
+ CAIN C,EOL ;OR END OF LINE?\r
+ POPJ PP, ;YES,EXIT\r
+ CAIN C,"]" ;CLOSING LITERAL?\r
+ POPJ PP, ;YES\r
+ JRST STMNT9 ;NO,AT LEAST SKIP ALL THIS NONSENSE\r
+\r
+STMN2A: JUMPE C,.+2\r
+ TLO IO,IORPTC\r
+ PUSHJ PP,MSRCH ;SEARCH FOR MACRO/OPDEF/SYN\r
+ JRST STMNT3 ;NOT FOUND, TRY OP CODE\r
+ LDB SDEL,[POINT 3,ARG,5]\r
+ JUMPE SDEL,ERRAX ;ERROR IF NO FLAGS\r
+ SOJE SDEL,OPD1 ;OPDEF IF 1\r
+ SOJE SDEL,CALLM ;MACRO IF 2\r
+ JRST STMNT4 ;SYNONYM, PROCESS WITH OP-CODES\r
+\r
+STMNT3: PUSHJ PP,OPTSCH ;SEARCH OP CODE TABLE\r
+ JRST STMNT5 ;NOT FOUND\r
+STMNT4: HLLZ AC0,V ;PUT CODE IN AC0\r
+ TRZ V,ADDF ;CLEAR ADDRESS NON-VALID FLAG\r
+ TRZE V,LITF ;VALID IN LITERAL?\r
+ SKIPN LITLVL ;NO, ARE WE IN A LITERAL?\r
+ JRST 0(V) ;NO, GO TO APPROPRIATE PROCESSOR\r
+ POPJ PP, ;YES,EXIT\r
+\r
+STMNT5: PUSHJ PP,SSRCH ;TRY SYMBOLS\r
+ JRST STMNT8 ;NOT FOUND\r
+ TLNE ARG,EXTF!UNDF ;EXTERNAL OR UNDEFINED?\r
+ JRST STMNT7 ;YES, PROCESS IN EVALEX\r
+ TLNN RC,-2 ;CHECK FOR EXTERNAL\r
+ TRNE RC,-2\r
+ JRST STMNT7\r
+ MOVE AC0,V ;FOUND, PUT VALUE IN AC0\r
+ TLO IO,NUMSW ;FLAG AS NUMERIC\r
+STMNT7: TLZ IO,IORPTC\r
+STMNT9: PUSHJ PP,EVALHA ;EVALUATE EXPRESSION\r
+IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>\r
+ TLNE FR,FSNSW ;FIELD SEEN?\r
+ JRST STOW ;YES,STOW THE CODE AND EXIT\r
+ CAIE C,"]"-40 ;CLOSING LITERAL?\r
+ TRO ER,ERRQ ;NO, GIVE "Q" ERROR\r
+ POPJ PP, ;EXIT\r
+\r
+\fSTMNT8: MOVEI V,0 ;ALWAYS START SCAN WITH 0\r
+ CAIL V,CALNTH ;END OF TABLE?\r
+ JRST STMN8C ;YES, TRY TTCALLS\r
+ CAME AC0,CALTBL(V) ;FOUND IT?\r
+ AOJA V,.-3 ;NO,TRY AGAIN\r
+ SUBI V,NEGCAL ;CALLI'S START AT -1\r
+ HRLI V,(CALLI) ;PUT IN UUO\r
+STMN8D: MOVSI ARG,OPDF ;SET FLAG FOR OPDEF\r
+STMN8B: PUSHJ PP,INSERT ;PUT OPDEF IN TABLE\r
+ JRST OPD ;AND TREAT AS OPDEF\r
+\r
+STMN8C: SETZ V, ;START WITH ZERO\r
+ CAIL V,TTCLTH ;END OF TABLE?\r
+ JRST STMN8A ;YES, ERROR\r
+ CAME AC0,TTCTBL(V) ;MATCH?\r
+ AOJA V,.-3 ;NO, KEEP TRYING\r
+ LSH V,5 ;PUT IN AC FIELD (RIGHT HALF)\r
+ HRLZI V,<(TTCALL)>(V) ;PUT UUO IN LEFT HALF\r
+ JRST STMN8D ;SET OPDEF FLAG\r
+\r
+STMN8A: SETZB V,RC ;CLEAR VALUE AND RELOCATION\r
+ TRO ER,ERRO ;FLAG AS UNDEFINED OP-CODE\r
+ JUMP1 OPD ;TREAT AS STANDARD OP ON PASS1\r
+ MOVSI ARG,OPDF!UNDF!EXTF ;SET A FEW FLAGS\r
+ JRST STMN8B ;TO FORCE OUT A MESSAGE\r
+\r
+ ;STATEMENT OUT PASSES REMAINDER OF LINE (CMNT)\r
+ ;UNTIL A LINE TERMINATOR IS SEEN.\r
+STOUTS: TLOA IO,IOENDL!IORPTC\r
+STOUT: TLO IO,IORPTC\r
+ PUSHJ PP,BYPAS1\r
+ CAIN C,14 ;COMMA?\r
+ SKIPL STPX ;YES, ERROR IF CODE STORED\r
+ CAIN C,EOL\r
+ TLOA IO,IORPTC\r
+ TRO ER,ERRQ\r
+STOUT1: PUSHJ PP,CHARAC\r
+ CAIG C,CR\r
+ CAIG C,HT\r
+ JRST STOUT1\r
+ JRST OUTLIN ;OUTPUT THE LINE (BIN AND LST)\r
+\f SUBTTL LABEL PROCESSOR\r
+ \r
+LABEL: JUMPAD LABEL4 ;COMPARE IF NON-SYMBOLIC\r
+ JUMPE AC0,LABEL5 ;ERROR IF BLANK\r
+ TLO IO,DEFCRS ;THIS IS A DEFINITION\r
+ PUSHJ PP,SSRCH ;SEARCH FOR OPERAND\r
+ MOVSI ARG,SYMF!UNDF!TAGF ;NOT FOUND\r
+ TLNN ARG,EXTF ;OPERAND FOUND (SKIP EXIT)\r
+ JRST LABEL0\r
+ JUMP1 LABEL3 ;ERROR ON PASS1\r
+ TLNN ARG,UNDF ;UNDEFINED ON PASS1\r
+ JRST LABEL3 ;NO, FLAG ERROR\r
+ TLZ ARG,EXTF!PNTF ;TURN OFF EXT FLAG NOW\r
+LABEL0: TLZN ARG,UNDF!VARF ;WAS IT PREVIOUSLY DEFINED?\r
+ JRST LABEL2 ;YES, CHECK EQUALITY\r
+ MOVE V,LOCA ;WFW\r
+ MOVE RC,MODA\r
+ TLO ARG,TAGF\r
+ PUSHJ PP,PEEK ;GET NEXT CHAR.\r
+ CAIE C,":" ;SPECIAL CHECK FOR ::\r
+ JRST LABEL1 ;NO MATCH\r
+ TLO ARG,INTF ;MAKE IT INTERNAL\r
+ PUSHJ PP,GETCHR ;PROCESS NEXT CHAR.\r
+ PUSHJ PP,PEEK ;PREVIEW NEXT CHAR.\r
+LABEL1: CAIE C,"!" ;HALF-KILL SIGN\r
+ JRST LABEL6 ;NO\r
+ TLO ARG,NOOUTF ;YES, SUPPRESS IT\r
+ PUSHJ PP,GETCHR ;AND GET RID OF IT\r
+LABEL6: MOVEM AC0,TAG ;SAVE FOR PASS 1 ERRORS\r
+ HLLZS TAGINC ;ZERO INCREMENT\r
+ JRST INSERT ;INSERT/UPDATE AND EXIT\r
+\r
+LABEL2: HRLOM V,LOCBLK ;SAVE LIST LOCATION\r
+ CAMN V,LOCA ;DOES IT COMPARE WITH PREVIOUS? WFW\r
+ CAME RC,MODA\r
+LABEL3: TLOA ARG,MDFF ;NO, FLAG MULTIPLY DEFINED AND SKIP\r
+ JRST LABEL7 ;YES, GET RID OF EXTRA CHARS.\r
+ TRO ER,ERRM ;FLAG MULTIPLY DEFINED ERROR \r
+ JRST UPDATE ;UPDATE AND EXIT\r
+\r
+LABEL4: CAMN AC0,LOCA ;DO THEY COMPARE?\r
+ CAME RC,MODA\r
+LABEL5: TRO ER,ERRP ;NO, FLAG PHASE ERROR\r
+ POPJ PP,\r
+\r
+LABEL7: SKIPE LITLVL ;LABEL IN A LITERAL?\r
+ MOVEM AC0,LITLBL ;YES, SAVE LABEL NAME FOR LATER\r
+ PUSHJ PP,PEEK ;INSPECT A CHAR.\r
+ CAIN C,":" ;COLON?\r
+ PUSHJ PP,GETCHR ;YES, DISPOSE OF IT\r
+ PUSHJ PP,PEEK ;EXAMINE ONE MORE CHAR.\r
+ CAIN C,"!" ;EXCLAMATION?\r
+ JRST GETCHR ;YES, INDEED\r
+\f POPJ PP,\r
+\fSUBTTL ATOM PROCESSOR\r
+ATOM: PUSHJ PP,CELL ;GET FIRST CELL\r
+ TLNE IO,NUMSW ;IF NON-NUMERIC\r
+ATOM1: CAIE C,42 ;OR NOT A BINARY SHIFT,\r
+ POPJ PP, ;EXIT\r
+\r
+ PUSH PP,AC0 ;STACK REGISTERS, ITS A BINARY SHIFT\r
+ PUSH PP,AC1\r
+ PUSH PP,RC\r
+ PUSH PP,RX\r
+ HRRI RX,^D10 ;COMPUTE SHIFT RADIX 10\r
+ PUSHJ PP,CELLSF ;GET SHIFT\r
+ MOVE ARG,RC ;SAVE RELOCATION\r
+ POP PP,RX ;RESTORE REGISTERS\r
+ POP PP,RC\r
+ POP PP,AC1\r
+ MOVN SX,AC0 ;USE NEGATIVE OF SHIFT\r
+ POP PP,AC0\r
+ JUMPN ARG,NUMER2 ;IF NOT ABSOLUTE\r
+ TLNN IO,NUMSW ;AND NUMERIC,\r
+ JRST NUMER2 ;FLAG ERROR\r
+ LSHC AC0,^D35(SX)\r
+ LSH RC,^D35(SX)\r
+ JRST ATOM1 ;TEST FOR ANOTHER\r
+\fCELLSF: TLO IO,FLDSW\r
+CELL: SETZB AC0,RC ;CLEAR RESULT AND RELOCATION\r
+ SETZB AC1,AC2 ;CLEAR WORK REGISTERS\r
+ MOVEM PP,PPTEMP ;SAVE PUSHDOWN POINTER\r
+ TLZ IO,NUMSW\r
+ TLZA FR,NEGSW!DCFSW!RADXSW\r
+\r
+CELL1: TLO IO,FLDSW\r
+ PUSHJ PP,BYPASS\r
+ LDB V,[POINT 4,CSTAT(C),14] ;GET CODE\r
+ XCT .+1(V) ;EXECUTE, INDEX VIA BITS 11,12,13,14 OF CSTAT TABLE\r
+ JRST CELL1 ;0; BLANK, (TAB OR "+")\r
+ JRST LETTER ;1; LETTER ] $ % ( ) , ; >\r
+ TLC FR,NEGSW ;2; "-"\r
+ TLO FR,INDSW ;3; "@"\r
+ JRST NUM1 ;4; NUMERIC 0 - 9\r
+ JRST ANGLB ;5; "<"\r
+ JRST SQBRK ;6; "["\r
+ JRST QUOTES ;7; ""","'" \r
+ JRST QUAL ;10; "^"\r
+ JRST PERIOD ;11; "."\r
+ TROA ER,ERRQ ;12; ERROR, FLAG AND TREAT AS DELIMITER\r
+ ;12; ! # & * / : = ? \ _\r
+\fLETTER: TLOA AC2,(POINT 6,AC0,) ;SET BYTE POINTER\r
+LETTE1: PUSHJ PP,GETCHR ;GET CHARACTER\r
+ TLNN CS,6 ;ALPHA-NUMERIC?\r
+ JRST LETTE3 ;NO,TEST FOR VARIABLE\r
+ TLNE AC2,770000 ;STORE ONLY SIX BYTES\r
+LETTE2: IDPB C,AC2 ;RETURN FROM PERIOD\r
+ JRST LETTE1\r
+\r
+LETTE3: CAIE C,03 ;"#"?\r
+ POPJ PP,\r
+ JUMPE AC0,POPOUT ;TEST FOR NULL\r
+ PUSHJ PP,PEEK ;PEEK AT NEXT CHAR.\r
+ CAIN C,"#" ;IS IT 2ND #?\r
+ JRST LETTE4 ;YES, THEN IT'S AN EXTERN\r
+ TLO IO,DEFCRS\r
+ PUSHJ PP,SSRCH ;YES, SEARCH FOR SYMBOL (OPERAND)\r
+ MOVSI ARG,SYMF!UNDF ;NOT FOUND, FLAGAS UNDEFINED SYM.\r
+ TLNN ARG,UNDF ;UNDEFINED?\r
+ JRST GETCHR ;NO, GET NEXT CHAR AND RETURN\r
+ TLO ARG,VARF ;YES, FLAG AS A VARIABLE\r
+ TRO ER,ERRU ;SET UNDEFINED ERROR FLAG\r
+ PUSHJ PP,INSERZ ;INSERT IT WITH A ZERO VALUE\r
+ JRST GETDEL\r
+\r
+LETTE4: PUSHJ PP,GETCHR ;AND SCAN PAST IT\r
+ PUSHJ PP,GETCHR ;GET RID OF #\r
+ JRST EXTER1 ;PUT IN SYMBOL TABLE\r
+\r
+NUMER1: SETZB AC0,RC ;RETURN ZERO\r
+NUMER2: TRO ER,ERRN ;FLAG ERROR\r
+\r
+GETDEL: PUSHJ PP,BYPASS\r
+GETDE1: JUMPE C,.-1\r
+ MOVEI AC1,0\r
+GETDE3: TLO IO,NUMSW!FLDSW ;FLAG NUMERIC\r
+ TLNN FR,NEGSW ;IS ATOM NEGATIVE?\r
+ POPJ PP, ;NO, EXIT\r
+ JUMPE AC1,GETDE2\r
+ MOVNS AC1\r
+ TDCA AC0,[-1]\r
+GETDE2: MOVNS AC0 ;YES, NEGATE VALUE\r
+ MOVNS RC ;AND RELOCATION\r
+POPOUT: POPJ PP, ;EXIT\r
+\fQUOTES: CAIE C,"'"-40 ;IS IT "'"\r
+ JRST QUOTE ;NO MUST BE """\r
+ JRST SQUOTE ;YES\r
+\r
+QUOTE0: TLNE AC0,376000 ;5 CHARACTERS STORED ALREADY?\r
+ TRO ER,ERRQ ;YES, GIVE WARNING\r
+ ASH AC0,7\r
+ IOR AC0,C\r
+QUOTE: PUSHJ PP,CHARAC ;GET 7-BIT ASCII\r
+ CAIG C,15 ;TEST FOR LF, VT, FF OR CR\r
+ CAIGE C,12\r
+ JRST .+2 ;NO, SO ALL IS WELL\r
+ JRST QUOTE2 ;ESCAPE WITH Q ERROR\r
+ CAIE C,42\r
+ JRST QUOTE0\r
+ PUSHJ PP,PEEK ;LOOK AT NEXT CHAR.\r
+ CAIE C,42\r
+ JRST QUOTE1 ;RESTORE REPEAT LEVEL AND QUIT\r
+ PUSHJ PP,CHARAC ;GET NEXT CHAR.\r
+ JRST QUOTE0 ;USE IT\r
+\r
+QUOTE2: TRO ER,ERRQ ;SET Q ERROR\r
+QUOTE1: JRST GETDEL\r
+\r
+SQUOT0: TLNE AC0,770000 ;SIX CHARS. STORED ALREADY ?\r
+ TRO ER,ERRQ ;YES\r
+ LSH AC0,6\r
+ IORI AC0,-40(C) ;OR IN SIXBIT CHAR.\r
+\r
+SQUOTE: PUSHJ PP,CHARAC\r
+ CAIG C,CR\r
+ CAIGE C,LF\r
+ JRST .+2\r
+ JRST QUOTE1\r
+ CAIE C,"'"\r
+ JRST SQUOT0\r
+ PUSHJ PP,PEEK\r
+ CAIE C,"'"\r
+ JRST QUOTE1\r
+ PUSHJ PP,CHARAC\r
+ JRST SQUOT0\r
+\r
+\fQUAL: PUSHJ PP,BYPAS1 ;SKIP BLANKS, GET NEXT CHARACTER\r
+ CAIN C,42 ;"B"?\r
+ JRST QUAL2 ;YES, RADIX=D2\r
+ CAIN C,57 ;"O"?\r
+ JRST QUAL8 ;YES, RADIX=D8\r
+ CAIN C,46 ;"F"?\r
+ JRST NUMDF ;YES, PROCESS DECIMAL FRACTION\r
+ CAIN C,54 ;"L"?\r
+ JRST QUALL ;YES\r
+ CAIE C,44 ;"D"?\r
+ JRST NUMER1 ;NO, FLAG NUMERIC ERROR\r
+ ADDI AC2,2\r
+QUAL8: ADDI AC2,6\r
+QUAL2: ADDI AC2,2\r
+ PUSH PP,RX\r
+ HRR RX,AC2\r
+ PUSHJ PP,CELLSF\r
+QUAL2A: POP PP,RX\r
+ TLNN IO,NUMSW\r
+ JRST NUMER1\r
+ JRST GETDE1\r
+\r
+QUALL: PUSH PP,FR\r
+ PUSHJ PP,CELLSF\r
+ MOVE AC2,AC0\r
+ MOVEI AC0,^D36\r
+ JUMPE AC2,QUAL2A\r
+ LSH AC2,-1\r
+ SOJA AC0,.-2\r
+\fSUBTTL LITERAL PROCESSOR\r
+\r
+SQBRK: PUSH PP,FR\r
+ PUSH PP,EXTPNT ;ALLOW EXTERN TO PRECEDE LIT IN XWD\r
+ SETZM EXTPNT\r
+ SKIPE LITLVL ;SAVE SEQNO AND PAGE IF NOT IN LIT ALREADY\r
+ JRST SQB5\r
+ MOVE C,SEQNO2\r
+ MOVEM C,LITSEQ\r
+ MOVE C,PAGENO\r
+ MOVEM C,LITPG\r
+SQB5: JSP AC2,SVSTOW\r
+SQB3: PUSHJ PP,STMNT\r
+ CAIN C,75 ;CHECK FOR ]\r
+ JRST SQB1\r
+ TLO IO,IORPTC\r
+ TLNE FR,MWLFLG ;CALL IT ] IF NOT MULTI-WORD FLAG\r
+ JRST SQB2 ;BUT REPEAT LAST CHARACTER\r
+ PUSHJ PP,BYPAS1\r
+ CAIN C,EOL\r
+ TLOA IO,IORPTC\r
+ TRO ER,ERRQ\r
+SQB4: PUSHJ PP,CHARAC\r
+ CAIN C,";" ;COMMENT?\r
+ JRST SQB6 ;YES, IGNORE SQUARE BRACKETS\r
+ CAIN C,"]" ;LOOK FOR TERMINAL SQB\r
+ TRNN ER,ERRORS ;IN CASE OF ERROR IN LITERAL\r
+ JRST .+2 ;NO ALL IS WELL\r
+ JRST SQB1 ;FINISH THE LITERAL NOW!!\r
+ CAIG C,CR ;LOOK FOR END OF LINE\r
+ CAIN C,HT\r
+ JRST SQB4\r
+SQB4A: PUSHJ PP,OUTIML ;DUMP\r
+ PUSHJ PP,CHARAC ;GET ANOTHER CHAR.\r
+ SKIPL LIMBO ;CRLF FLAG\r
+ TLO IO,IORPTC ;NO REPEAT\r
+ JRST SQB3\r
+\r
+SQB6: PUSHJ PP,CHARAC ;GET A CHARACTER\r
+ CAIG C,CR\r
+ CAIN C,HT ;LOOK FOR END OF LINE CHAR.\r
+ JRST SQB6 ;NOT YET\r
+ JRST SQB4A ;GOT IT\r
+\r
+SQB1: TLZ IO,IORPTC\r
+SQB2: PUSHJ PP,STOLIT\r
+ JSP AC2,GTSTOW\r
+ SKIPE LITLBL ;NEED TO FIXUP A LABEL?\r
+ PUSHJ PP,RELBLE ;YES, USE LOC OF LITERAL\r
+ POP PP,EXTPNT\r
+ POP PP,FR\r
+ SKIPE LITLVL ;WERE WE NESTED?\r
+ JUMP1 NUMER2 ;YES, FORCE ERROR IF PASS 1\r
+ JRST GETDEL\r
+\r
+RELBLE: PUSH PP,AC0 ;SAVE LOCATION COUNTER\r
+ PUSH PP,RC ;AND RELOCATION\r
+ MOVE AC0,LITLBL ;SYMBOL WE NEED\r
+ SETZM LITLBL ;ZERO INDICATOR\r
+ PUSHJ PP,SSRCH ;SEARCH FOR OPERAND\r
+ JRST RELBL1 ;SHOULD NEVER HAPPEN\r
+ TLNN ARG,TAGF ;IT BETTER BE A LABEL\r
+ JRST RELBL1 ;IT WASN'T , GIVE UP BEFORE SOME HARM IS DONE\r
+ TLZ ARG,UNDF!EXTF!PNTF ;CLEAR FLAGS NOW\r
+ POP PP,RC ;GET LITERAL RELOCATION\r
+ MOVE V,(PP) ;GET VALUE (LOC COUNTER)\r
+ PUSHJ PP,UPDATE ;UPDATE VALUE\r
+ POP PP,AC0 ;RESTORE LITERAL COUNT\r
+ POPJ PP, ;RETURN\r
+ \r
+RELBL1: POP PP,RC ;RESTORE RC\r
+ POP PP,AC0 ;AND AC0\r
+ POPJ PP, ;JUST RETURN\r
+\fANGLB: PUSH PP,FR\r
+ TLZ FR,INDSW\r
+ PUSHJ PP,ATOM\r
+ TLNN IO,NUMSW\r
+ CAIE C,35\r
+ JRST ANGLB1\r
+ PUSHJ PP,ASSIG1\r
+ MOVE AC0,V\r
+ JRST ANGLB2\r
+\r
+ANGLB1: PUSHJ PP,EVALHA\r
+ANGLB2: POP PP,FR\r
+ CAIE C,36\r
+ TRO ER,ERRN\r
+ JRST GETDEL\r
+\r
+PERIOD: PUSHJ PP,GETCHR ;LOOK AT NEXT CHARACTER\r
+ TLNN CS,2 ;ALPHABETIC?\r
+ JRST PERNUM ;NO, TEST NUMERIC\r
+ MOVSI AC0,(SIXBIT /./) ;YES, PUT PERIOD IN AC0\r
+ MOVSI AC2,(POINT 6,AC0,5) ;SET BYTE POINTER\r
+ JRST LETTE2 ;AND TREAT AS SYMBOL\r
+\r
+PERNUM: TLNE CS,4 ;IS IT A NUMBER\r
+ JRST NUM32 ;YES\r
+ MOVE AC0,LOCA ;NO. CURRENT LOC SYMBOL (.)\r
+ MOVE RC,MODA ;SET TO CURRENT ASSEMBLY MODE\r
+ JRST GETDE1 ;GET DELIMITER\r
+NUMDF: TLO FR,DCFSW ;SET DECIMAL FRACTION FLAG\r
+NUM: PUSHJ PP,GETCHR ;GET A CHARACTER\r
+ TLNN CS,4 ;NUMERIC?\r
+ JRST NUM10 ;NO\r
+NUM1: SUBI C,20 ;CONVERT TO OCTAL\r
+ PUSH PP,C ;STACK FOR FLOATING POINT\r
+ MOVE AC0,AC1\r
+ MULI AC0,0(RX)\r
+ ADD AC1,C ;ADD IN LAST VALUE\r
+ CAIL C,0(RX) ;IS NUMBER LESS THAN CURRENT RADIX?\r
+ TLO FR,RADXSW ;NO, SET FLAG\r
+ AOJA AC2,NUM ;YES, AC2=NO. OF DECIMAL PLACES\r
+\r
+\fNUM10: CAIE C,16 ;PERIOD?\r
+ TLNE FR,DCFSW ;OR DECIMAL FRACTION?\r
+ JRST NUM30 ;YES, PROCESS FLOATING POINT\r
+ LSH AC1,1 ;NO, CLEAR THE SIGN BIT\r
+ LSHC AC0,^D35 ;AND SHIFT INTO AC0\r
+ MOVE PP,PPTEMP ;RESTORE PP\r
+ SOJE AC2,GETDE1 ;NO RADIX ERROR TEST IF ONE DIGIT\r
+ TLNE FR,RADXSW ;WAS ILLEGAL NUMBER ENCOUNTERED?\r
+ TRO ER,ERRN ;YES, FLAG N ERROR\r
+ JRST GETDE1\r
+\r
+NUM30: CAIE C,"B"-40 ;IF "B" THEN MISSING "."\r
+NUM31: PUSHJ PP,GETCHR\r
+ TLNN CS,4 ;NUMERIC?\r
+ JRST NUM40 ;NO\r
+NUM32: SUBI C,20\r
+ PUSH PP,C\r
+ JRST NUM31\r
+\r
+NUM40: PUSH PP,FR ;STACK VALUES\r
+ HRRI RX,^D10\r
+ PUSH PP,AC2\r
+ PUSH PP,PPTEMP\r
+ CAIN C,45 ;"E"?\r
+ JRST [PUSHJ PP,PEEK ;GET NEXT CHAR\r
+ PUSH PP,C ;SAVE NEXT CHAR\r
+ PUSHJ PP,CELL ;YES, GET EXPONENT\r
+ POP PP,C ;GET FIRST CHAR. AFTER E\r
+ CAIN V,4 ;MUST HAVE NUMERICAL STATUS\r
+ JRST .+2 ;SKIP RETURN\r
+ CAIN C,"<" ;ALLOW <EXP>\r
+ JRST .+2 ;SKIP RETURN\r
+ SKIPN AC0 ;ERROR IF NON-ZERO EXPRESSION\r
+ TROA ER,ERRQ ;ALLOW E+,E-\r
+ SETOM RC ;FORCE NUMERICAL ERROR\r
+ JRST .+2] ;SKIP RETURN\r
+ MOVEI AC0,0 ;NO, ZERO EXPONENT\r
+ POP PP,PPTEMP\r
+ POP PP,SX\r
+ POP PP,FR\r
+ HRRZ V,PP\r
+ MOVE PP,PPTEMP\r
+ JUMPN RC,NUMER1 ;EXPONENT MUST BE ABSOLUTE\r
+ ADD SX,AC0\r
+ HRRZ ARG,PP\r
+ ADD SX,ARG\r
+ SETZB AC0,AC2\r
+ TLNE FR,DCFSW\r
+ JRST NUM60\r
+ JOV NUM50 ;CLEAR OVERFLOW FLAG\r
+\f\r
+NUM50: JSP SDEL,NUMUP ;FLOATING POINT\r
+ JRST NUM52 ;END OF WHOLE NUMBERS\r
+ FMPR AC0,[10.0] ;MULTIPLY BY 10\r
+ TLO AC1,233000 ;CONVERT TO FLOATING POINT\r
+ FADR AC0,AC1 ;ADD IT IN\r
+ JRST NUM50\r
+\r
+NUM52: JSP SDEL,NUMDN ;PROCESS FRACTION\r
+ FADR AC0,AC2\r
+ JOV NUMER1 ;TEST FOR OVERFLOW\r
+ JRST GETDE1\r
+\r
+ TLO AC1,233000\r
+ TRNE AC1,-1\r
+ FADR AC2,AC1 ;ACCUMULATE FRACTION\r
+ FDVR AC2,[10.0]\r
+ JRST NUM52\r
+\r
+NUM60: JSP SDEL,NUMUP\r
+ JRST NUM62\r
+ IMULI AC0,^D10\r
+ ADD AC0,AC1\r
+ JRST NUM60\r
+\r
+NUM62: LSHC AC1,-^D36\r
+ JSP SDEL,NUMDN\r
+ LSHC AC1,^D37\r
+ PUSHJ PP,BYPAS2\r
+ JRST GETDE3\r
+\r
+ DIVI AC1,^D10\r
+ JRST NUM62\r
+\r
+NUMUP: MOVEI AC1,0\r
+ CAML ARG,SX\r
+ JRST 0(SDEL)\r
+ CAMGE ARG,V\r
+ MOVE AC1,1(ARG)\r
+ AOJA ARG,1(SDEL)\r
+\r
+NUMDN: MOVEI AC1,0\r
+ CAMG V,SX\r
+ JRST 0(SDEL)\r
+ CAMLE V,ARG\r
+ MOVE AC1,0(V)\r
+ SOJA V,3(SDEL)\r
+\fSUBTTL GETSYM\r
+GETSYM: MOVEI AC0,0 ;CLEAR AC0\r
+ MOVSI AC1,(POINT 6,AC0) ;PUT POINTER IN AC1\r
+ PUSHJ PP,BYPASS ;SKIP LEADING BLANKS\r
+ TLNN CS,2 ;ALPHABETIC?\r
+ JRST GETSY1 ;NO, ERROR\r
+ CAIE C,16 ;PERIOD?\r
+ JRST GETSY2 ;NO, A VALID SYMBOL\r
+ IDPB C,AC1 ;STORE THE CHARACTER\r
+ PUSHJ PP,GETCHR ;YES, TEST NEXT CHARACTER\r
+ TLNN CS,2 ;ALPHABETIC?\r
+GETSY1: TROA ER,ERRA\r
+GETSY2: AOS 0(PP) ;YES, SET SKIP EXIT\r
+GETSY3: TLNN CS,6 ;ALPHA-NUMERIC?\r
+ JRST BYPAS2 ;NO, GET DELIMITER\r
+ TLNE AC1,770000 ;YES, HAVE WE STORED SIX?\r
+ IDPB C,AC1 ;NO, STORE IT\r
+ PUSHJ PP,GETCHR\r
+ JRST GETSY3\r
+\r
+\fSUBTTL EXPRESSION EVALUATOR\r
+CV== AC0 ;CURRENT VALUE\r
+PV== AC1 ;PREVIOUS VALUE\r
+RC== RC ;CURRENT RELOCATABILITY\r
+PR== AC2 ;PREVIOUS RELOCATABILITY\r
+CS= CS ;CURRENT STATUS\r
+PS== SDEL ;PREVIOUS STATUS\r
+\r
+EVALHA: TLO FR,TMPSW\r
+EVALCM: PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION\r
+ PUSH PP,[0] ;MARK PDL\r
+ JUMPCM EVALC3 ;JUMP IF COMMA\r
+ TLO IO,IORPTC ;IT'S NOT,SO REPEAT\r
+ JRST OP ;PROCESS IN OP\r
+EVALC3:\r
+IFN FORMSW,<PUSH PP,INFORM ;PUT FORM WORD ON STACK>\r
+ PUSH PP,[0] ;STORE ZERO'S ON PDL\r
+ PUSH PP,[0] ;.......\r
+ MOVSI AC2,(POINT 4,(PP),12)\r
+ JRST OP1B ;PROCESS IN OP\r
+\r
+EVALEX: TLO IO,FLDSW\r
+ PUSH PP,[XWD TNODE,0] ;MARK THE LIST 200000,,0\r
+ TLZN FR,TMPSW\r
+EVATOM: PUSHJ PP,ATOM ;GET THE NEXT ATOM\r
+ JUMPE AC0,EVGETD ;TEST FOR NULL/ZERO\r
+ TLOE IO,NUMSW ;SET NUMERIC, WAS IT PREVIOUSLY?\r
+ JRST EVGETD+1 ;YES, TREAT ACCORDINGLY\r
+ PUSHJ PP,SEARCH ;SEARCH FOR MACRO OR SYMBOL\r
+ JRST EVOP ;NOT FOUND, TRY FOR OP-CODE\r
+ JUMPL ARG,.+2 ;SKIP IF OPERAND\r
+ PUSHJ PP,SSRCH1 ;OPERATOR, TRY FOR SYMBOL (OPERAND)\r
+ PUSHJ PP,QSRCH ;PERFORM CROSS-REFERENCE\r
+ JUMPG ARG,EVMAC ;BRANCH IF OPERATOR\r
+ MOVE AC0,V ;SYMBOL, SET VALUE\r
+ JRST EVTSTS ;TEST STATUS\r
+\r
+EVMAC: TLNE FR,NEGSW ;UNARY MINUS?\r
+ JRST EVERRZ ;YES, INVALID BEFORE OPERATOR\r
+ LDB SDEL,[POINT 3,ARG,5] ;GET MACF/OPDF/SYNF\r
+ SOJL SDEL,EVERRZ ;ERROR IF NO FLAGS\r
+\r
+ JUMPE C,.+2 ;NON-BLANK?\r
+ TLO IO,IORPTC ;YES, REPEAT CHARACTER\r
+ SOJE SDEL,CALLM ;MACRO IF 2\r
+ JUMPG SDEL,EVOPS ;SYNONYM IF 4\r
+\r
+ MOVE AC0,V ;OPDEF\r
+ MOVEI V,OP ;SET TRANSFER VECTOR\r
+ JRST EVOPD\r
+\fEVOP: TLNE FR,NEGSW ;OPCODE, UNARY MINUS?\r
+ JRST EVERRZ ;YES, ERROR\r
+\r
+ PUSHJ PP,OPTSCH ;SEARCH SYMBOL TABLE\r
+ JRST EVOPX ;NOT FOUND\r
+EVOPS: TRZ V,LITF ;CLEAR LIT INVALID FLAG\r
+ TRZE V,ADDF ;SYNONYM\r
+ JRST EVOPX ;PSEUDO-OP THAT GENERATES NO DATA JUMPS\r
+ HLLZ AC0,V\r
+EVOPD: JUMPE C,.+2 ;OPDEF, NON-BLANK DELIMITER?\r
+ TLO IO,IORPTC ;YES, REPEAT CHARACTER\r
+ JSP AC2,SVSTOW\r
+ PUSHJ PP,0(V)\r
+ PUSHJ PP,DSTOW\r
+ JSP AC2,GTSTOW\r
+ TRNE RC,-2\r
+ HRRM RC,EXTPNT\r
+ TLNE RC,-2\r
+ HLLM RC,EXTPNT\r
+ JRST EVNUM\r
+\r
+EVOPX: MOVSI ARG,SYMF!UNDF\r
+ PUSHJ PP,INSERZ\r
+EVERRZ: SETZB AC0,RC ;CLEAR CODE AND RELOCATION\r
+EVERRU: TRO ER,ERRU\r
+ JRST EVGETD\r
+\fEVTSTS: TLNE ARG,UNDF\r
+ JRST [TRO ER,ERRU ;SET UNDEF ERROR\r
+ JUMP1 EVGETD ;TREAT AS UNDF ON PASS1\r
+ JRST .+1] ;TREAT AS EXTERNAL ON PASS2\r
+ TLNN ARG,EXTF\r
+ JRST EVTSTR\r
+ HRRZ RC,ARG ;GET ADRES WFW\r
+ HRRZ ARG,EXTPNT ;SAVE IT WFW\r
+ HRRM RC,EXTPNT ;WFW\r
+ TRNE ARG,-1 ;WFW\r
+ TRO ER,ERRE\r
+ SETZB AC0,ARG\r
+\r
+EVTSTR: TLNE ARG,MDFF ;MULTIPLY DEFINED?\r
+ TRO ER,ERRD ;YES, FLAG IT\r
+ TLNE FR,NEGSW ;NEGATIVE ATOM?\r
+ PUSHJ PP,GETDE2 ;YES, NEGATE AC0 AND RC\r
+\r
+EVGETD: TLNE IO,NUMSW ;NON BLANK FIELD\r
+ TLO FR,FSNSW ;YES,SET FLAG\r
+ PUSHJ PP,BYPAS2\r
+ TLNE CS,6 ;ALPHA-NUMERIC?\r
+ TLO IO,IORPTC ;YES, REPEAT IT\r
+EVNUM: POP PP,PS ;POP THE PREVIOUS DELIMITER/TNODE\r
+ TLO PS,4000\r
+ CAMGE PS,CS ;OPERATION REQUIRED?\r
+ JRST EVPUSH ;NO, PUT VALUES BACK ON STACK\r
+ TLNN PS,TNODE ;YES, HAVE WE REACHED TERMINAL NODE?\r
+ JRST EVXCT ;NO, EXECUTION REQUIRED\r
+ TLNN CS,170000 ;YES, ARE WE POINTING AT DEL? (& ! * / + - _)\r
+ POPJ PP, ;YES, EXIT\r
+ ;NO,FALL INTO EVPUSH\r
+\r
+\fEVPUSH: PUSH PP,PS ;STACK VALUES\r
+ PUSH PP,CV\r
+ PUSH PP,RC\r
+ PUSH PP,CS\r
+ JRST EVATOM ;GET NEXT ATOM\r
+\r
+EVXCT: POP PP,PR ;POP PREVIOUS RELOCATABILITY\r
+ POP PP,PV ;AND PREVIOUS VALUE\r
+ LDB PS,[POINT 3,PS,29] ;TYPE OF OPERATION TO PS\r
+ JRST .+1(PS) ;PERFORM PROPER OPERATION\r
+ JRST ASSEM1 ;0; SHOULD NEVER GET HERE ;DMN\r
+ JRST XMUL ;1;\r
+ JRST XDIV ;2;\r
+ JRST XADD ;3;\r
+ JRST XSUB ;4;\r
+ JRST XLRW ;5; "_"\r
+ TDOA CV,PV ;6; MERGE PV INTO CV\r
+ AND CV,PV ;7; AND PV INTO CV\r
+ JUMPN RC,.+2 ;COMMON RELOCATION TEST\r
+EVXCT1: JUMPE PR,EVNUM\r
+ TRO ER,ERRR ;BOTH MUST BE FIXED\r
+ JRST EVNUM ;GO TRY AGAIN\r
+\r
+XSUB: SUBM PV,CV\r
+ SUBM PR,RC\r
+ JRST EVNUM\r
+\r
+XADD: ADDM PV,CV\r
+ ADDM PR,RC\r
+ JRST EVNUM\r
+\r
+XDIV: IDIV PR,CV ;CORRECT RELOCATABILITY\r
+ IDIVM PV,CV\r
+XDIV1: EXCH PR,RC ;TAKE RELOCATION OF NUMERATOR\r
+ JRST EVXCT1\r
+\r
+XMUL: JUMPE PR,XMUL1 ;AT LEAST ONE OPERAND\r
+ JUMPE RC,XMUL1 ;MUST BE FIXED\r
+ TRO ER,ERRR\r
+XMUL1: IORM PR,RC ;GET RELOCATION TO RC\r
+ CAMGE PV,CV ;FIND THE GREATER\r
+ EXCH PV,CV ;FIX IN CASE CV=0,OR 1\r
+ IMULM PV,RC\r
+ IMULM PV,CV\r
+ JRST EVNUM\r
+XLRW: EXCH PV,CV\r
+ LSH CV,0(PV)\r
+ LSH PR,0(PV)\r
+ JRST XDIV1\r
+\f SUBTTL LITERAL STORAGE HANDLER\r
+ \r
+STOLER:\r
+IFE FORMSW,< SETZB AC0,RC ;ERROR, NO CODE STORED\r
+ PUSHJ PP,STOW ;STOW ZERO>\r
+IFN FORMSW,< MOVEI AC0,0\r
+ PUSHJ PP,STOWZ1>\r
+ TRO ER,ERRL ;AND FLAG THE ERROR\r
+\r
+STOLIT: MOVE SDEL,STPX\r
+ SUB SDEL,STPY ;COMPUTE NUMBER OF WORDS\r
+ JUMPE SDEL,STOLER ;ERROR IF NONE STORED\r
+ TRNN ER,ERRORS ;ANY ERRORS?\r
+ JRST STOL06 ;NO\r
+ JUMP2 STOL22 ;YES, NO SEARCH. BRANCH IF PASS2\r
+ ADDM SDEL,LITCNT ;PASS ONE, UPDATE COUNT\r
+ JRST STOWI ;INITIALIZE STOW\r
+\r
+STOL06: MOVEI SX,LITAB ;PREPARE FOR SEARCH\r
+ MOVE ARG,STPX ;SAVE IN THE EVENT OF MULTIPLE-WORD\r
+ HRL ARG,STPY\r
+ MOVE AC2,LITNUM\r
+ MOVEI SDEL,0\r
+STOL08: PUSHJ PP,DSTOW ;GET VALUE WFW\r
+\r
+STOL10: SOJL AC2,STOL24 ;TEST FOR END\r
+ MOVE SX,0(SX) ;NO, GET NEXT STORAGE CELL\r
+ MOVE V,-1(SX) ;GET RELOCATION BITS WFW\r
+ CAMN AC0,-2(SX) ;DO CODES COMPARE? WFW\r
+ CAME RC,V ;YES, HOW ABOUT RELOCATION?\r
+ AOJA SDEL,STOL10 ;NO, TRY AGAIN\r
+ SKIPGE STPX ;YES, MULTI-WORD?\r
+ JRST STOL26 ;NO, JUST RETURN LOCATION\r
+ MOVEM AC2,SAVBLK+AC2 ;YES, SAVE STARTING INFO\r
+ MOVEM SX,SAVBLK+SX\r
+\r
+STOL12: SOJL AC2,STOL23 ;TEST FOR END\r
+ PUSHJ PP,DSTOW ;GET NEXT WORD WFW\r
+ MOVE SX,0(SX) ;UPDATE POINTER\r
+ MOVE V,-1(SX) ;GET RELOCATION WFW\r
+ CAMN AC0,-2(SX) ;COMPARE VALUE WFW\r
+ CAME RC,V ;AND RELOCATION\r
+ JRST STOL14 ;NO MATCH, TRY AGAIN\r
+ SKIPL STPX ;MATCH, HAVE WE FINISHED SEARCH?\r
+ JRST STOL12 ;NO, TRY NEXT WORD\r
+ JRST STOL26 ;YES, RETURN LOCATION\r
+\r
+STOL14: MOVE AC2,SAVBLK+AC2 ;RESTORE STOW POINTERS\r
+ MOVE SX,SAVBLK+SX\r
+ HRREM ARG,STPX\r
+ HLREM ARG,STPY\r
+ AOJA SDEL,STOL08 ;BETTER LUCK NEXT TIME\r
+\f\r
+STOL22: MOVE SDEL,LITNUM\r
+STOL23: PUSHJ PP,DSTOW ;DSTOW AND CONVERT\r
+STOL24: MOVE SX,LITABX ;GET CURRENT STORAGE\r
+ PUSHJ PP,GETTOP ;GET NEXT CELL\r
+ MOVEM AC0,-2(SX) ;STORE CODE WFW\r
+ MOVEM RC,-1(SX) ;WFW\r
+IFN FORMSW,<\r
+ MOVE AC0,FORM\r
+ MOVEM AC0,-3(SX)>\r
+ MOVEM SX,LITABX ;SET POINTER TO CURRENT CELL\r
+ AOS LITNUM ;INCREMENT NUMBER STORED\r
+ AOS LITCNT ;INCREMENT NUMBER RESERVED\r
+ SKIPL STPX ;ANY MORE CODE?\r
+ JRST STOL23 ;YES\r
+STOL26: JUMP1 POPOUT ;EXIT IF PASS ONE\r
+ MOVE SX,LITHDX ;GET HEADER BLOCK\r
+ HLRZ RC,-1(SX) ;GET BLOCK RELOCATION\r
+ HRRZ AC0,-1(SX)\r
+ ADDI AC0,0(SDEL) ;COMPUTE ACTUAL LOCATION\r
+ POPJ PP, ;EXIT\r
+\r
+\fSUBTTL INPUT ROUTINES\r
+GETCHR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER\r
+ CAIL C,"A"+40 ;CHECK FOR LOWER CASE\r
+ CAILE C,"Z"+40\r
+ JRST .+2 ;NOT LOWER CASE\r
+IFN STANSW,<\r
+ SUBI C,40\r
+ CAIN C,32\r
+ MOVEI C,136 ;^\r
+ CAIN C,30\r
+ MOVEI C,137 ;_\r
+ CAIN C,176\r
+ MOVEI C,134 ;}\r
+ CAIN C,140\r
+ MOVEI C,100 ;@>\r
+IFE STANSW,<\r
+ TRZA C,100 ;CONVERT LOWER CASE TO SIXBIT>\r
+ SUBI C,40 ;CONVERT TO SIXBIT\r
+ CAIG C,77 ;CHAR GREATER THAN SIXBIT?\r
+ JUMPGE C,GETCS ;TEST FOR VALID SIXBIT\r
+ ADDI C,40 ;BACK TO ASCII\r
+ CAIN C,HT ;CHECK FOR TAB\r
+ JRST GETCS2 ;MAKE IT LOOK LIKE SPACE\r
+ CAIG C,CR ;GREATER THAN CR\r
+ CAIG C,HT ;GREATER THAN TAB\r
+ JRST GETCS1 ;IS NOT FF,VT,LF OR CR\r
+ MOVEI C,EOL ;LINE OR FORM FEED OR V TAB\r
+ TLOA IO,IORPTC ;REPEAT CHARACTER\r
+GETCS2: MOVEI C,0 ;BUT TREAT AS BLANK\r
+GETCS: MOVE CS,CSTAT(C) ;GET STATUS BITS\r
+ POPJ PP, ;EXIT\r
+\r
+GETCS1: JUMPE C,GETCS ;IGNORE NULS\r
+ TRC C,100 ;MAKE CHAR. VISIBLE\r
+ MOVEI CS,"^"\r
+ DPB CS,LBUFP ;PUT ^ IN OUTPUT\r
+ PUSHJ PP,RSW2 ;ALSO MODIFIED CHAR.\r
+ TRO ER,ERRQ ;FLAG Q ERROR\r
+ JRST GETCHR ;BUT IGNORE CHAR.\r
+\f\r
+CHARAC: TLZE IO,IORPTC ;REPEAT REQUESTED?\r
+ JRST CHARAX ;YES\r
+RSW0: JUMPN MRP,MREAD ;BRANCH IF TREE POINTER SET\r
+ PUSHJ PP,READ\r
+RSW1: SKIPE RPOLVL ;ARE WE IN "REPEAT ONCE"?\r
+ JRST REPO1 ;YES\r
+RSW2: MOVE CS,LIMBO ;GET LAST CHAR.\r
+ MOVEM C,LIMBO ;STORE THIS CHAR. FOR RPTC\r
+ CAIN C,LF ;LF?\r
+ CAIE CS,CR ;YES,LAST CHAR. A CR?\r
+ JRST RSW3 ;NO\r
+ HRROS LIMBO ;YES,FLAG\r
+ POPJ PP, ;AND EXIT\r
+\r
+RSW3: TLNE IO,IOSALL ;MACRO SUPPRESS ALL?\r
+ JUMPN MRP,CPOPJ ;YES,DON'T LIST IN MACRO\r
+ SOSG CPL ;ANY ROOM IN THE IMAGE BUFFER?\r
+ PUSHJ PP,OUTPL ;NO, OUTPUT THE PARTIAL LINE\r
+ IDPB C,LBUFP ;YES, STORE IN PRINT AREA\r
+ CAIE C,HT ;TAB?\r
+ POPJ PP, ;NO, EXIT\r
+ MOVEI C,7\r
+ ANDCAM C,CPL ;MASK\r
+CHARAX: HRRZ C,LIMBO ;GET LAST CHARACTER\r
+ POPJ PP, ;EXIT\r
+\r
+CHARL: PUSHJ PP,CHARAC ;GET AND TEST 7-BIT ASCII\r
+ CAIG C,FF ;LINE OR FORM FEED OR VT?\r
+ CAIGE C,LF\r
+ POPJ PP, ;NO,EXIT\r
+ SKIPE LITLVL ;IN LITERAL?\r
+ JRST OUTIML ;YES\r
+CHARL1: PUSHJ PP,SAVEXS ;SAVE REGISTERS\r
+ PUSHJ PP,OUTLIN ;DUMP THE LINE\r
+ JRST RSTRXS ;RESTORE REGISTERS AND EXIT\r
+\fSUBTTL CHARACTER STATUS TABLE\r
+\r
+ DEFINE GENCS (OPLVL,ATOM,AN,SQUOZ,OPTYPE,SEQNO)\r
+<BYTE (6)OPLVL (9)ATOM (3)AN (6)SQUOZ,OPTYPE,SEQNO>\r
+\r
+ ;OPLVL PRIORITY OF BINARY OPERATORS\r
+ ;ATOM INDEX TO JUMP TABLE AT CELL1\r
+ ;AN TYPE OF CHARACTER\r
+ ; 1=OTHER, 2=ALPHA, 4=NUMERIC\r
+ ;SQUOZ VALUE IN RADIX 50\r
+ ;OPTYPE INDEX TO JUMP TABLE AT EVXCT\r
+ ;SEQNO VALUE IN SIXBIT\r
+CSTAT:\r
+ GENCS 00,00,1,00,00,00 ; ' '\r
+ GENCS 04,12,1,00,06,01 ; '!'\r
+ GENCS 00,07,1,00,00,02 ; '"'\r
+ GENCS 00,12,1,00,00,03 ; '#'\r
+ GENCS 00,01,2,46,00,04 ; '$'\r
+ GENCS 00,01,2,47,00,05 ; '%'\r
+ GENCS 04,12,1,00,07,06 ; '&'\r
+ GENCS 00,07,1,00,00,07 ; '''\r
+\r
+ GENCS 00,01,1,00,00,10 ; '('\r
+ GENCS 00,01,1,00,00,11 ; ')'\r
+ GENCS 02,12,1,00,01,12 ; '*'\r
+ GENCS 01,00,1,00,03,13 ; '+'\r
+ GENCS 40,01,1,00,00,14 ; ','\r
+ GENCS 01,02,1,00,04,15 ; '-'\r
+ GENCS 00,11,2,45,00,16 ; '.'\r
+ GENCS 02,12,1,00,02,17 ; '/'\r
+\r
+ GENCS 00,04,4,01,00,20 ; '0'\r
+ GENCS 00,04,4,02,00,21 ; '1'\r
+ GENCS 00,04,4,03,00,22 ; '2'\r
+ GENCS 00,04,4,04,00,23 ; '3'\r
+ GENCS 00,04,4,05,00,24 ; '4'\r
+ GENCS 00,04,4,06,00,25 ; '5'\r
+ GENCS 00,04,4,07,00,26 ; '6'\r
+ GENCS 00,04,4,10,00,27 ; '7'\r
+\r
+ GENCS 00,04,4,11,00,30 ; '8'\r
+ GENCS 00,04,4,12,00,31 ; '9'\r
+ GENCS 00,12,1,00,00,32 ; ':'\r
+ GENCS 00,01,1,00,00,33 ; ';'\r
+ GENCS 00,05,1,00,00,34 ; '<'\r
+ GENCS 00,12,1,00,00,35 ; '='\r
+ GENCS 00,01,1,00,00,36 ; '>'\r
+ GENCS 00,12,1,00,00,37 ; '?'\r
+\f GENCS 00,03,1,00,00,40 ; '@'\r
+ GENCS 00,01,2,13,00,41 ; 'A'\r
+ GENCS 00,01,2,14,00,42 ; 'B'\r
+ GENCS 00,01,2,15,00,43 ; 'C'\r
+ GENCS 00,01,2,16,00,44 ; 'D'\r
+ GENCS 00,01,2,17,00,45 ; 'E'\r
+ GENCS 00,01,2,20,00,46 ; 'F'\r
+ GENCS 00,01,2,21,00,47 ; 'G'\r
+\r
+ GENCS 00,01,2,22,00,50 ; 'H'\r
+ GENCS 00,01,2,23,00,51 ; 'I'\r
+ GENCS 00,01,2,24,00,52 ; 'J'\r
+ GENCS 00,01,2,25,00,53 ; 'K'\r
+ GENCS 00,01,2,26,00,54 ; 'L'\r
+ GENCS 00,01,2,27,00,55 ; 'M'\r
+ GENCS 00,01,2,30,00,56 ; 'N'\r
+ GENCS 00,01,2,31,00,57 ; 'O'\r
+\r
+ GENCS 00,01,2,32,00,60 ; 'P'\r
+ GENCS 00,01,2,33,00,61 ; 'Q'\r
+ GENCS 00,01,2,34,00,62 ; 'R'\r
+ GENCS 00,01,2,35,00,63 ; 'S'\r
+ GENCS 00,01,2,36,00,64 ; 'T'\r
+ GENCS 00,01,2,37,00,65 ; 'U'\r
+ GENCS 00,01,2,40,00,66 ; 'V'\r
+ GENCS 00,01,2,41,00,67 ; 'W'\r
+\r
+ GENCS 00,01,2,42,00,70 ; 'X'\r
+ GENCS 00,01,2,43,00,71 ; 'Y'\r
+ GENCS 00,01,2,44,00,72 ; 'Z'\r
+ GENCS 00,06,1,00,00,73 ; '['\r
+ GENCS 00,12,1,00,00,74 ; '\'\r
+ GENCS 00,01,1,00,00,75 ; ']'\r
+ GENCS 00,10,1,00,00,76 ; '^'\r
+ GENCS 10,12,1,00,05,77 ; '_'\r
+\fSUBTTL LISTING ROUTINES\r
+\r
+OUTLIN: TRNN ER,ERRORS-ERRQ ;ANY ERRORS?\r
+ TLNE FR,ERRQSW ;NO, IGNORE Q ERRORS?\r
+ TRZ ER,ERRQ ;YES, YES, ZERO THE Q ERROR\r
+ HRLZ AC0,ER ;PUT ERROR FLAGS IN AC0 LEFT\r
+ TDZ ER,TYPERR\r
+ JUMP1 OUTL30 ;BRANCH IF PASS ONE\r
+ JUMPN AC0,OUTL02 ;JUMP IF ANY ERRORS TO FORCE PRINTING\r
+ SKIPL STPX ;SKIP IF NO CODE, OTHERWISE\r
+ JRST OUTL01 ;NO\r
+ TLNN IO,IOSALL ;YES,SUPPRESS ALL?\r
+ JRST OUTL03 ;NO\r
+ JUMPN MRP,CPOPJ ;YES,EXIT IF IN MACRO\r
+ LDB C,[XWD 350700,LBUF]\r
+ CAIE C,15 ;FIRST CHAR CR?\r
+OUTL01: TLZ IO,IOMAC ;FORCE MACRO PRINTING\r
+OUTL03: TLNN IO,IOMSTR!IOPROG!IOMAC\r
+OUTL02: IOR ER,OUTSW ;FORCE IT.\r
+ IDPB AC0,LBUFP ;STORE ZERO TERMINATOR AFTER ASCII SRC LINE\r
+ TLNN FR,CREFSW ;CREF?\r
+ PUSHJ PP,CLSCRF ;YES, WRITE END OF CREF DATA (177,003)\r
+ JUMPE AC0,OUTL20 ;BRANCH IF NO ERRORS\r
+ TLZE AC0,ERRM ;M ERROR?\r
+ TLO AC0,ERRP ;M ERROR SET - SET P ERROR.\r
+ PUSHJ PP,OUTLER ;PROCESS ERRORS\r
+\r
+OUTL20: SKIPN RC,ASGBLK\r
+ SKIPE CS,LOCBLK ;\r
+ SKIPL STPX ;ANY BINARY?\r
+ JRST OUTL23 ;YES, JUMP\r
+ JUMPE RC,OUTL22 ;SEQUENCE BREAK AND NO BINARY JUMPS\r
+ ILDB C,TABP ;ASSIGNMENT FALLS THROUGH\r
+ PUSHJ PP,OUTL ;OUTPUT A TAB.\r
+ ILDB C,TABP ;OUTPUT 2ND TAB, LOCATION FIELD\r
+ PUSHJ PP,OUTC ;NEXT IS BINARY LISTING FIELD\r
+ HLLO CS,LOCBLK ;LEFT HALF OF A 36BIT VALUE\r
+ JUMPL RC,.+2 ;SKIP IF LEFT HALF IS NOT RELOC\r
+ TRZA CS,1 ;IT IS, SET THE FLAG\r
+ TLNE CS,-1 ;SKIP IF ITS A 18BIT VALUE, OTHERWISE\r
+ PUSHJ PP,ONC1 ;PRINT LH OF A 36 BIT VALUE IN CS\r
+ HRLO CS,LOCBLK ;PICK UP THE RIGHT HALF (18BIT VALUE)\r
+ TRZ CS,0(RC) ;\r
+ PUSHJ PP,ONC ;PRINT IT\r
+ JRST OUTL23 ;SKIP SINGLE QUOTE TEST\r
+\fOUTL22: PUSHJ PP,ONC ;TAB TO RH AND PRINT IT\r
+ MOVEI C,"'"\r
+ SKIPE MODA\r
+ PUSHJ PP,OUTC\r
+OUTL23: SKIPL STPX ;ANY BINARY?\r
+ PUSHJ PP,BOUT ;YES, DUMP IT\r
+ MOVE CS,@OUTLI2 ;[POINT 7,LBUF]\r
+OUTL24: ILDB C,CS\r
+ JUMPE C,OUTL25\r
+ CAIG C," "\r
+ JRST OUTL24\r
+ MOVE CS,TABP\r
+ PUSHJ PP,OUTASC ;OUTPUT TABS\r
+OUTL25: MOVEI CS,LBUF\r
+ PUSHJ PP,OUTAS0 ;DUMP THE LINE\r
+ TLNE IO,IOSALL ;SUPPRESSING ALL\r
+ JUMPN MRP,OUTL27 ;YES,EXTRA CR IF IN MACRO\r
+OUTL26: SKIPGE STPX ;ANY BINARY?\r
+ JRST OUTLI ;NO, CLEAN UP AND EXIT\r
+ PUSHJ PP,OUTLI2 ;YES, INITIALIZE FOR NEXT LINE\r
+ PUSHJ PP,BOUT ;YES, DUMP IT\r
+OUTL27: PUSHJ PP,OUTCR ;OUTPUT CARRIAGE RETURN\r
+ JRST OUTL26 ;TEST FOR MORE BINARY\r
+\r
+OUTPL: SKIPN LITLVL ;IF IN LITERAL\r
+ SKIPL STPX ;OR CODE GENERATED\r
+ JRST OUTIM ;JUST OUTPUT THE IMAGE\r
+ SKIPN ASGBLK ;SKIP IF AN ASSIGNMENT\r
+ JRST OUTIM ;OTHERWISE OUTPUT IMAGE\r
+ PUSH PP,C ;SAVE CHAR.\r
+ MOVEI C,CR\r
+ IDPB C,LBUFP\r
+ MOVEI C,LF\r
+ IDPB C,LBUFP ;FINISH WITH CRLF\r
+ PUSHJ PP,OUTLIN ;OUTPUT PARTIAL LINE\r
+ POP PP,C ;RESTORE CHAR.\r
+ JRST OUTLI2 ;INITIALISE REST OF LINE\r
+\fOUTL30: AOS CS,STPX ;PASS ONE\r
+ ADDM CS,LOCO ;INCREMENT OUTPUT LOCATION\r
+ PUSHJ PP,STOWI ;INITIALIZE STOW\r
+ TLZ AC0,ERRORS-ERRM-ERRP-ERRV\r
+ JUMPN AC0,OUTL32 ;JUMP IF ERRORS\r
+ TLNE IO,IOSALL ;SUPPRESSING ALL/\r
+ JUMPN MRP,CPOPJ ;YES,EXIT\r
+ JRST OUTLI1 ;NO,INIT LINE\r
+\r
+OUTL32: IDPB AC0,LBUFP ;ZERO TERNIMATOR\r
+ IOR ER,OUTSW ;LIST ERRORS\r
+ MOVEI CS,TAG\r
+ PUSHJ PP,OUTSIX ;OUTPUT TAG\r
+ HRRZ C,TAGINC\r
+ PUSHJ PP,DNC ;CONVERT INCREMENT TO DECIMAL\r
+ PUSHJ PP,OUTTAB ;OUTPUT TAB\r
+ PUSHJ PP,OUTLER ;OUTPUT ERROR FLAGS\r
+ PUSHJ PP,OUTTAB\r
+ MOVEI CS,SEQNO ;ADDRESS OF SEQUENCE NO.\r
+ SKIPE SEQNO ;FILE NOT SEQUENCED\r
+ PUSHJ PP,OUTAS0 ;OUTPUT IT\r
+ JRST OUTL25 ;OUTPUT BASIC LINE\r
+\r
+OUTLER: PUSH PP,ER ;SAVE LISTING SWITCHES FOR LATER\r
+ TRNE ER,TTYSW ;IF THIS IS ON, LISTING IS ON TTY\r
+ TRZ ER,ERRORS ;SO SUPPRESS ON TTY\r
+ TDZ ER,OUTSW ;BUT THIS SHOULD ONLY GO TO THE TTY\r
+ MOVE CS,INDIR ;GET FILE NAME\r
+ CAME CS,LSTFIL ;AND SEE IF SAME\r
+ JRST [MOVEM CS,LSTFIL ;SAVE AS LAST ONE\r
+ MOVEI CS,LSTFIL\r
+ PUSHJ PP,OUTSIX ;LIST NAME\r
+ MOVEI C," "\r
+ PUSHJ PP,OUTL\r
+ MOVE CS,PAGENO ;PRINT PAGE NUMBER TOO\r
+ JRST OUTLE8]\r
+ MOVE CS,PAGENO ;NOW CHECK PAGE NUMBER\r
+ CAME CS,LSTPGN\r
+OUTLE8: JRST [MOVEM CS,LSTPGN\r
+ MOVEI CS,[ASCIZ /PAGE /]\r
+ PUSHJ PP,OUTAS0\r
+ MOVE C,PAGENO\r
+ PUSHJ PP,DNC\r
+ PUSHJ PP,OUTCR ;AND NOW FOR THE ERROR LINE\r
+ JRST .+1]\r
+ HLLM ER,(PP) ;RESTORE ER BUT NOT IO (LEFT HALF OF AC)\r
+ POP PP,ER\r
+ MOVE CS,[POINT 7,[ASCII / QXADLRUVNOPEM/]]\r
+OUTLE2: ILDB C,CS ;GET ERROR MNEMONIC\r
+ JUMPGE AC0,OUTLE4 ;BRANCH IF NOT FLAGGED\r
+ PUSHJ PP,OUTL ;OUTPUT THE CHARACTER\r
+ AOS ERRCNT ;INCREMENT ERROR COUNT\r
+OUTLE4: LSH AC0,1 ;SHIFT NEXT FLAG INTO SIGN BIT\r
+\f JUMPN AC0,OUTLE2 ;TEST FOR END\r
+ POPJ PP, ;EXIT\r
+\fOUTIM1: TLOA FR,IOSCR ;SUPPRESS CRLF AFTER LINE\r
+OUTIM: TLZ FR,IOSCR ;DON'T FOR PARTIAL LINE\r
+ TLNE IO,IOSALL ;SUPPRESSING ALL?\r
+ JUMPN MRP,CPOPJ ;YES ,EXIT IF IN MACRO\r
+ JUMP1 OUTLI1 ;BYPASS IF PASS ONE\r
+ PUSH PP,ER\r
+ TDZ ER,TYPERR\r
+ TLNN IO,IOMSTR!IOPROG!IOMAC\r
+ IOR ER,OUTSW\r
+ PUSH PP,C ;OUTPUT IMAGE\r
+ TLNN FR,CREFSW\r
+ PUSHJ PP,CLSCRF\r
+OUTIM2: MOVE CS,TABP\r
+ PUSHJ PP,OUTASC ;OUTPUT TABS\r
+ IDPB C,LBUFP ;STORE ZERO TERMINATOR\r
+ MOVEI CS,LBUF\r
+ PUSHJ PP,OUTAS0 ;OUTPUT THE IMAGE\r
+ TLZN FR,IOSCR ;CRLF SUPPRESS?\r
+ PUSHJ PP,OUTCR ;NO,OUTPUT\r
+ POP PP,C\r
+ HLLM ER,0(PP)\r
+ POP PP,ER\r
+ JRST OUTLI2\r
+\r
+OUTLI: TLNE IO,IOSALL ;SUPPRESSING ALL\r
+ JUMPN MRP,OUTLI3 ;YES,SET FLAG IN REPEATS ALSO\r
+ TLNE IO,IOPALL ;MACRO EXPANSION SUPRESS REQUESTED?\r
+ SKIPN MACLVL ;YES, ARE WE IN MACRO?\r
+ TLZA IO,IOMAC ;NO, CLEAR MAC FLAG\r
+OUTLI3: TLO IO,IOMAC ;YES, SET FLAG\r
+\r
+OUTLI1: TRZ ER,ERRORS!LPTSW!TTYSW\r
+OUTLI2: MOVE CS,[POINT 7,LBUF] ;INITIALIZE BUFFERS\r
+ MOVEM CS,LBUFP\r
+IFN FORMSW,<MOVE CS,[POINT 7,TABI]\r
+ MOVSS HWFMT ;PUT FLAG IN LEFT HALF\r
+ SKIPGE HWFMT ;BUT IF ONLY HALF-WORD FORMAT>\r
+ MOVE CS,[POINT 7,TABI,6]\r
+ MOVEM CS,TABP\r
+ MOVEI CS,.CPL\r
+IFN FORMSW,<SKIPL HWFMT ;IF MULTI-FORMAT\r
+ SUBI CS,8 ;LINE IS ONE TAB SHORTER\r
+ MOVSS HWFMT ;BACK AS IT WAS>\r
+ MOVEM CS,CPL\r
+ MOVSI CS,(ASCII / /)\r
+ SKIPE SEQNO ;HAVE WE SEQUENCE NUMBERS?\r
+ MOVEM CS,SEQNO ;YES, STORE TAB IN CASE OF MACRO\r
+ MOVEM CS,SEQNO+1 ;STORE TAB AND TERMINATOR\r
+ SETZM ASGBLK\r
+ SETZM LOCBLK\r
+ POPJ PP,\r
+\fOUTIML: TLNE IO,IOSALL ;SUPPRESSING ALL?\r
+ JUMPN MRP,CPOPJ ;YES,EXIT IF IN MACRO\r
+ TRNN ER,ERRORS-ERRQ ;FOR LITERALS (MULIT-LINE) OUTPUT ERRORS\r
+ TLNE FR,ERRQSW\r
+ TRZ ER,ERRQ\r
+ HRLZ CS,ER\r
+ JUMP1 OUTML1 ;CHECK PASS1 ERRORS\r
+ TDZ ER,TYPERR\r
+ JUMPE CS,OUTIM1\r
+ PUSH PP,[0] ;ERRORS SHOULD BE ZEROED\r
+ PUSH PP,C\r
+ PUSH PP,AC0 ;SAVE AC0 IN CASE CALLED FROM ASCII\r
+ MOVE AC0,CS ;ERROR ROUTINE WANTS FLAGS IN AC0\r
+ IOR ER,OUTSW\r
+ TLNN FR,CREFSW\r
+ PUSHJ PP,CLSCRF ;FIX CREF\r
+ TLZE AC0,ERRM\r
+ TLO AC0,ERRP\r
+ PUSHJ PP,OUTLER ;OUTPUT THEM\r
+ POP PP,AC0\r
+ JRST OUTIM2 ;AND LINE\r
+ \r
+OUTML1: TLZ CS,ERRORS-ERRM-ERRP-ERRV\r
+ JUMPE CS,OUTLI2 ;NONE\r
+ TRZ ER,ERRM!ERRP!ERRV\r
+ TRO ER,ERRL\r
+ PUSH PP,ER ;SAVE\r
+ PUSH PP,C ;SAVE THIS\r
+ PUSH PP,AC0 ;AS ABOVE\r
+ MOVE AC0,CS ;...\r
+ TDZ ER,TYPERR\r
+ IOR ER,OUTSW\r
+ MOVEI CS,TAG\r
+ PUSHJ PP,OUTSIX\r
+ HRRZ C,TAGINC\r
+ PUSHJ PP,DNC\r
+ PUSHJ PP,OUTTAB\r
+ PUSHJ PP,OUTLER ;DO NOT FORGET ERRORS\r
+ PUSHJ PP,OUTTAB\r
+ MOVEI CS,LBUF ;PRINT REST OF LINE\r
+ PUSHJ PP,SOUT20\r
+ POP PP,AC0\r
+ POP PP,C\r
+ POP PP,ER\r
+ JRST OUTLI2\r
+\fSUBTTL OUTPUT ROUTINES\r
+UOUT: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN\r
+ TRNN ARG,PNTF ;WFW\r
+ TRNN ARG,UNDF\r
+ JRST UOUT13 ;TEST FOR UNDF!EXTF!PNTF ON PASS2\r
+ JUMP2 UOUT10\r
+ TLNN IO,IOIOPF ;ANY IOP'S SEEN\r
+ JRST UOUT12 ;NO,MAKE EXTERNAL\r
+ MOVSI CS,PRMTBL-PRMEND;YES LOOKUP IN TABLE\r
+UOUT1: CAME AC0,PRMTBL(CS) ;HAVE WE A MATCH?\r
+ AOBJN CS,UOUT2 ;NO,INCREMENT AND JUMP\r
+ MOVE ARG,PRMTBL+1(CS);YES,GET VALUE\r
+ MOVEM ARG,(SX) ;UPDATE SYMBOL TABLE\r
+ POPJ PP, ;EXIT\r
+UOUT2: AOBJN CS,UOUT1 ;TEST FOR END\r
+\r
+UOUT12: PUSHJ PP,EXTER2 ;MAKE IT EXTERNAL\r
+ MOVSI ARG,UNDF ;BUT PUT UNDF BACK ON\r
+ IORM ARG,(SX) ;SO MESSAGE WILL COME OUT\r
+ POPJ PP, ;GET NEXT SYMBOL\r
+\r
+UOUT13: JUMP1 CPOPJ ;RECYCLE ON PASS1\r
+ TRC ARG,UNDF!EXTF!PNTF ;CHECK FOR ALL THREE ON\r
+ TRCE ARG,UNDF!EXTF!PNTF ;ARE THEY?\r
+ POPJ PP, ;NO, RECYCLE\r
+UOUT10: PUSHJ PP,OUTCR\r
+ PUSHJ PP,OUTSYM ;OUTPUT THE SYMBOL\r
+ MOVEI CS,[SIXBIT /UNASSIGNED, DEFINED AS IF EXTERNAL @/]\r
+ JRST OUTSIX ;POPJ FOR NEXT SYMBOL\r
+\r
+UOUT30: PUSHJ PP,ONC1 ;OUTPUT THE LOCATION\r
+ JRST HIGHQ ;EXIT THROUGH HIGHQ\r
+\f ;OUTPUT THE ENTRIES\r
+\r
+EOUT: MOVEI C,0 ;INITIALIZE THE COUNT\r
+ MOVE SX,SYMBOL\r
+ MOVE SDEL,0(SX)\r
+EOUT1: SOJL SDEL,EOUT2 ;TEST FOR END\r
+ ADDI SX,2\r
+ HLRZ ARG,0(SX)\r
+ ANDCAI ARG,SYMF!INTF!ENTF\r
+ JUMPN ARG,EOUT1 ;IF INVALID, DON'T COUNT\r
+ AOJA C,EOUT1 ;BUMP COUNT\r
+\r
+EOUT2: HRLI C,4 ;BLOCK TYPE 4\r
+ PUSHJ PP,OUTBIN\r
+ SETZB C,ARG\r
+ PUSHJ PP,OUTBIN\r
+ MOVE SX,SYMBOL\r
+ MOVE SDEL,0(SX)\r
+ MOVEI V,^D18\r
+\r
+EOUT3: SOJL SDEL,POPOUT\r
+ ADDI SX,2\r
+ HLRZ C,0(SX)\r
+ ANDCAI C,SYMF!INTF!ENTF\r
+ JUMPN C,EOUT3\r
+ SOJGE V,EOUT4 ;TEST END OF BLOCK\r
+ PUSHJ PP,OUTBIN\r
+ MOVEI V,^D17 ;WFW\r
+EOUT4: MOVE AC0,-1(SX)\r
+ PUSHJ PP,SQOZE\r
+ MOVE C,AC0\r
+ PUSHJ PP,OUTBIN\r
+ JRST EOUT3\r
+\f ;OUTPUT THE SYMBOLS\r
+\r
+SOUT: SKIPN IONSYM ;SKIP IF NOSYM SEEN\r
+ TRNN ER,LPTSW!TTYSW ;A LISTING REQUIRED?\r
+ JRST SOUT1 ;NO\r
+ MOVEI [ASCIZ /SYMBOL TABLE/]\r
+ HRRM SUBTTX ;SET NEW SUB-TITLE\r
+ PUSHJ PP,OUTFF ;FORCE NEW PAGE\r
+ MOVEI ARG,NCOLS ;SET UP FOR NCOLS ACROSS SYMBOL TABLE\r
+ TRNE ER,TTYSW ;IS TTY LISTING DEVICE?\r
+ MOVEI ARG,2 ;YES,ONLY 2 COLLUMNS\r
+ MOVEM ARG,NCOLLS ;STORE ANSWER\r
+ MOVEM ARG,SYMCNT\r
+ PUSHJ PP,LOUT1 ;OUTPUT THEM\r
+ MOVE ARG,SYMCNT ;SEE IF WE ENDED EVEN\r
+ CAME ARG,NCOLLS\r
+ PUSHJ PP,OUTCR ;NO, NEED CR\r
+ JRST SOUT1 ;NOW FOR BLOCK TYPE 2\r
+\r
+LOUT1: PUSHJ PP,LLUKUP ;SET FOR TABLE SCAN\r
+ TRNN ARG,SYMF\r
+ TRNN ARG,MACF!SYNF\r
+ TDZA MRP,MRP ;SKIP AND CLEAR MRP\r
+ POPJ PP, ;NO, TRY AGAIN\r
+ TRNE ARG,INTF\r
+ MOVEI MRP,1\r
+ TRNE ARG,EXTF\r
+ MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL\r
+ TRNE ARG,SYNF ;SYNONYM?\r
+ JUMPL MRP,POPOUT ;YES, DON'T OUTPUT IF EXTERNAL\r
+ TRNE ARG,SUPRBT ;IF SUPRESSED\r
+; JUMPGE MRP,POPOUT ;DO NOT OUTPUT UNLESS EXTERNAL\r
+ POPJ PP, ;DO NOT OUTPUT\r
+ AOS (PP) ;SET FOR SKIP RETURN IF SYMBOL IS PRINTED\r
+ JUMPGE MRP,LOUT10 ;BRANCH IF NOT EXTERNAL\r
+ HLRZ RC,V ;PUT POINTER/FLAGS IN RC\r
+ TRNE RC,-2 ;POINTER?\r
+ MOVS RC,0(RC) ;YES\r
+ HLL V,RC ;STORE LEFT VALUE\r
+\r
+LOUT10: PUSH PP,RC ;SAVE FOR LATER\r
+ PUSHJ PP,OUTSYM ;OUTPUT THE NAME\r
+ MOVE RC,(PP) ;GET COPY\r
+ MOVEI AC1,0\r
+ JUMPLE MRP,LOUT15 ;SET DEFFERRED BITS IF EXTERNAL\r
+ TLNE RC,-2 ;CHECK FOR LEFT FIXUP\r
+ IORI AC1,40 ;AND SET BITS\r
+ TRNE RC,-2 ;CHECK FOR RIGHT FIXUP\r
+ IORI AC1,20 ;AND SET BITS\r
+LOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL\r
+ HRRZS RC\r
+ TRNE RC,-2\r
+ HLLZS RC\r
+ TLZE RC,-1\r
+ TRO RC,2\r
+ HRL MRP,RC\r
+ MOVEI RC,0\r
+ TRNE ARG,ENTF ;ENTRY DMN\r
+ HRRI MRP,-5\r
+ TRNE ARG,NOOUTF ;SUPRESS OUTPUT? WFW\r
+ ADDI MRP,3 ;YES WFW\r
+ TRNE ARG,UNDF ;UNDEFINED IS EXTERNAL\r
+ HRRI MRP,2 ;SO FLAG AS UXT\r
+ IOR AC1,SOUTC(MRP)\r
+ MOVE ARG,AC1\r
+ MOVEM AC0,SVSYM ;SAVE IT\r
+ MOVE AC0,V ;GET THE VALUE\r
+ HLRZ RC,MRP ;AND THE RELOCATION\r
+ HLLO CS,V\r
+ TRNE RC,2 ;LEFT HALF RELOCATABLE?\r
+ TRZA CS,1 ;NO, FLAG AND PRINT\r
+ TLNE CS,-1 ;IS THE LEFT HALF ZERO?\r
+ PUSHJ PP,ONC1 ;NO, OUTPUT IT\r
+LOUT11: PUSHJ PP,OUTTAB\r
+LOUT30: HRLO CS,V\r
+ TDZ CS,RC ;SET RELOCATION\r
+ PUSHJ PP,ONC1\r
+ PUSHJ PP,OUTTAB\r
+ POP PP,RC ;GET BACK RELOC AND CHECK EXTERNAL\r
+LOUT60: MOVEI CS,SOUTC(MRP)\r
+ PUSHJ PP,OUTAS0 ;EXT/INT\r
+ SOSLE SYMCNT ;SEE IF WE HAVE RUN OUT\r
+ JRST OUTTAB ;NOT YET, PRINT ONE TAB\r
+LOUT64: MOVE CS,NCOLLS ;YES, RESET\r
+\f MOVEM CS,SYMCNT\r
+ JRST OUTCR ;CARRIAGE RETURN AND TRY FOR ANOTHER\r
+\r
+\r
+\f SYN IFBLK,SYMBLK ;SOMEWHERE TO STORE THE POINTERS\r
+\r
+LLUKUP: POP PP,LOOKX ;INTERCEPT RETURN POP\r
+ MOVE SX,SYMBOL\r
+ MOVE SDEL,(SX)\r
+ ADDI SX,2 ;SKIP COUNT OF SYMBOLS\r
+LLUKP2: HRLI SX,-<.LPP-1> ;LENGTH OF PAGE\r
+ MOVE V,ARG ;COPY OF ARG\r
+ MOVEM SX,SYMBLK(V) ;STORE SYMBOL POINTER IN TABLE\r
+ ADDI SX,2*<.LPP-2> ;SYMBOLS PER PAGE\r
+ SOJG V,.-2 ;FOR ALL COLUMNS\r
+ MOVE V,SYMCNT\r
+ HRRZ SX,SYMBLK(V)\r
+ CAMGE SX,SYMTOP\r
+ SOJG V,.-2\r
+ ADDI V,1\r
+ MOVEM V,SYMBLK\r
+ JRST LLUKP7 ;ENTER LOOP\r
+\r
+LLUKP1: MOVEM SX,SYMBLK(ARG) ;SAVE IT \r
+ MOVE AC0,-1(SX)\r
+ PUSHJ PP,SRCH7\r
+ HLRZS ARG\r
+ PUSHJ PP,@LOOKX\r
+ JRST [MOVE ARG,SYMCNT\r
+ MOVEM SX,SYMBLK(ARG)\r
+ JRST .+1]\r
+LLUKP7: SOJL SDEL,POPOUT ;TEST FOR END\r
+LLUKP3: MOVE ARG,SYMCNT ;GET PAGE POSITION\r
+ MOVE SX,SYMBLK(ARG) ;GET NEXT POINTER\r
+ AOBJP SX,LLUKP4\r
+ HRRZ V,SX\r
+ CAMG V,SYMTOP\r
+ AOJA SX,LLUKP1\r
+LLUKP6: PUSHJ PP,LOUT64 ;RESET SYMCNT\r
+ JUMPE SDEL,POPOUT ;EXIT IF ALL DONE\r
+ JRST LLUKP3\r
+\r
+LLUKP4: AOJ SX,\r
+ MOVEM SX,SYMBLK(ARG)\r
+ MOVE V,NCOLLS\r
+ SKIPGE SYMBLK(V) ;TEST IF ALL FINISHED\r
+ JRST LLUKP5 ;NO\r
+ SOJG V,.-2 ;KEEP GOING\r
+ MOVE SX,SYMBLK\r
+ MOVE SX,SYMBLK(SX)\r
+ HLRZ V,SX ;GET NUMBER ADVANCED\r
+ LSH V,1 ;2 WORDS PER SYMBOL\r
+ SUBI SX,2(V) ;BACK UP ONE SYMBOL\r
+ SKIPGE LPP ;IF PAGE FULL\r
+ JRST .+3 ;DON'T FINISH WITH EXTRA CR-LF\r
+ SETZM LPP ;ENSURE END OF PAGE\r
+ PUSHJ PP,LOUT64\r
+ MOVE ARG,NCOLLS\r
+ MOVEM ARG,SYMCNT ;JUST IN CASE\r
+ JRST LLUKP2\r
+\r
+LLUKP5: SOSG SYMCNT ;ON LAST COL?\r
+ JRST LLUKP6\r
+ SKIPGE LPP ;IF PAGE FULL\r
+ JRST LLUKP3 ;NO MORE OUTPUT \r
+REPEAT 2,<PUSHJ PP,OUTAB2> ;NO, TAB OUT TO NEXT COLUMN\r
+ JRST LLUKP3\r
+\fSOUT1: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN\r
+ TRNN ARG,SYMF\r
+ TRNN ARG,MACF!SYNF\r
+ TDZA MRP,MRP ;SKIP AND CLEAR MRP\r
+ POPJ PP, ;NO, TRY AGAIN\r
+ TRNE ARG,INTF\r
+ MOVEI MRP,1\r
+IFN WFWSW,<TRNE ARG,VARF ;IF THIS FLAG IS ON SHOULD GO IN LOW SEG\r
+ JRST SOUT1W >\r
+ TRNE ARG,EXTF\r
+ MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL\r
+ TRNE ARG,SYNF ;SYNONYM?\r
+ JUMPL MRP,POPOUT ;YES, DON'T OUTPUT IF EXTERNAL\r
+ TRNE ARG,SUPRBT ;IF SUPRESSED\r
+; JUMPGE MRP,POPOUT ;DO NOT OUTPUT UNLESS EXTERNAL\r
+ POPJ PP, ;DO NOT OUTPUT\r
+ JUMPGE MRP,SOUT10 ;BRANCH IF NOT EXTERNAL\r
+ HLRZ RC,V ;PUT POINTER/FLAGS IN RC\r
+ TRNE RC,-2 ;POINTER?\r
+ MOVS RC,0(RC) ;YES\r
+ HLL V,RC ;STORE LEFT VALUE\r
+\r
+SOUT10: PUSH PP,RC ;SAVE FOR LATER\r
+ MOVEI AC1,0\r
+ JUMPLE MRP,SOUT15 ;SET DEFFERRED BITS IF EXTERNAL\r
+ TLNE RC,-2 ;CHECK FOR LEFT FIXUP\r
+ IORI AC1,40 ;AND SET BITS\r
+ TRNE RC,-2 ;CHECK FOR RIGHT FIXUP\r
+ IORI AC1,20 ;AND SET BITS\r
+IFN WFWSW,<TRNE ARG,VARF ;IF SO THEN DEFERD\r
+ IORI AC1,20>\r
+SOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL\r
+ HRRZS RC\r
+ TRNE RC,-2\r
+ HLLZS RC\r
+ TLZE RC,-1\r
+ TRO RC,2\r
+ HRL MRP,RC\r
+ MOVEI RC,0\r
+ TRNE ARG,ENTF ;ENTRY DMN\r
+ HRRI MRP,-5\r
+ TRNE ARG,NOOUTF ;SUPRESS OUTPUT? WFW\r
+ ADDI MRP,3 ;YES WFW\r
+ IOR AC1,SOUTC(MRP)\r
+ MOVE ARG,AC1\r
+ PUSHJ PP,NOUT2 ;SQUOZE AND DUMP THE SYMBOL\r
+ MOVEM AC0,SVSYM ;SAVE IT\r
+ MOVE AC0,V ;GET THE VALUE\r
+ HLRZ RC,MRP ;AND THE RELOCATION\r
+ PUSHJ PP,COUT\r
+ POP PP,RC ;GET BACK RELOC AND CHECK EXTERNAL\r
+ TRNN RC,-2 ;IS IT?\r
+ JRST SOUT50 ;NO\r
+ MOVE AC0,1(RC) ;GET NAME\r
+IFN WFWSW,<JUMPE AC0,[MOVSI AC0,200000 ;RIGHT DEFERED\r
+ PUSHJ PP,INVRSF ;INSERT IN SYMBOL INFORMATION\r
+ JRST SOUT50]>\r
+ MOVEI ARG,60 ;EXTERNAL REQ\r
+ PUSHJ PP,SQOZE\r
+ HLLZS RC ;NO RELOC\r
+ PUSHJ PP,COUT ;OUTPUT IT\r
+ MOVE AC0,SVSYM ;GET SYMBOL NAME\r
+ TLO AC0,500000 ;SET AS ADDITIVE SYMBOL\r
+ TLZ AC0,200000 ;BUT NOT LEFT HALF ETC\r
+ PUSHJ PP,COUT\r
+SOUT50: MOVSS RC ;CHECK LEFT HALF\r
+ TRNN RC,-2\r
+ JRST SOUT60\r
+ MOVE AC0,1(RC)\r
+IFN WFWSW,<JUMPE AC0,[MOVSI AC0,600000 ;LEFT DEFERED\r
+ PUSHJ PP,INVRSF\r
+ JRST SOUT60]>\r
+ MOVEI ARG,60\r
+ PUSHJ PP,SQOZE\r
+ MOVEI RC,0\r
+ PUSHJ PP,COUT\r
+ MOVE AC0,SVSYM\r
+ TLO AC0,700000\r
+ PUSHJ PP,COUT\r
+SOUT60: POPJ PP,\r
+\r
+SOUT20: PUSHJ PP,OUTAS0\r
+ JRST OUTCR\r
+\r
+ <ASCII /ENT/>!04 ;DMN\r
+ Z\r
+ Z\r
+ <ASCII /SEN/>!44 ;SUPRESSED ENTRY\r
+ <ASCII /EXT/>!60\r
+SOUTC: EXP 10\r
+ <ASCII /INT/>!04\r
+ <ASCII /UXT/>!60 ;UNDEFINED EXTERNAL\r
+ <ASCII /SPD/>!50\r
+ <ASCII /SIN/>!44 ;DMN\r
+\fIFN WFWSW,<\r
+INVRSF: MOVEI ARG,3 ;GET A BLOCK\r
+ ADDB ARG,FREE\r
+ CAML ARG,SYMBOL\r
+ PUSHJ PP,XCEEDS\r
+ MOVEM AC0,(ARG) ;SAVE WHICH HALF INFO\r
+ MOVE AC0,SVSYM ;GET SYMBOL NAME\r
+ TLZ AC0,740000 ;GET RID OF CODE BITS\r
+ MOVEM AC0,-1(ARG) ;SAVE IT\r
+ HLRZ AC0,(RC) ;SYMBOL TABLE FIXUP POINTER\r
+ MOVEM AC0,-2(ARG) ;LINK IN THIS BLOCK\r
+ SUBI ARG,2 ;POINT TO START OF BLOCK\r
+ HRLM ARG,(RC)\r
+ POPJ PP,\r
+\r
+SOUT1W: HLRZS V ;GET THE SYMBOL TABLE POINTER\r
+ MOVEI RC,3 ;SET UP A NEW BLOCK FOR THIS SYMBOL\r
+ ADDB RC,FREE\r
+ CAML RC,SYMBOL\r
+ PUSHJ PP,XCEEDS ;CHECK ON OUT OF ROOM\r
+ PUSH PP,ARG ;SAVE ARG AND ACO\r
+ PUSH PP,AC0\r
+ MOVEI ARG,0 ;NO CODE BITS\r
+ PUSHJ PP,SQOZE ;CONVERT TO RAD50\r
+ MOVEM AC0,-1(RC) ;SYMBOL NAME\r
+ POP PP,AC0\r
+ POP PP,ARG ;RESTORE\r
+ HRRZM V,-2(RC) ;LINK TO NEXT BLOCK\r
+ MOVSI V,200000 ;FLAG AS SYMBOL TABLE FIXUP\r
+ MOVEM V,(RC)\r
+ HRRZ V,(SX) ;GET POINTER TO HEADER BLOCK\r
+ SUBI RC,2 ;POINT TO HEAD OF BLOCK\r
+ HRLM RC,(V) ;PUT IN LINK TO NEW BLOCK\r
+ MOVE RC,FIXLNK ;ADD SYMBOL TO CHAIN OF ONES TO DO\r
+ MOVEM SX,FIXLNK ;CHAIN THROUGH SYMBOL ENTRY\r
+ MOVEM RC,-1(SX) ;WHICH IS NO LONGER NEEDED\r
+ SETZB RC,V ;PUT OUT 0 FOR SYMBOL VALUE\r
+ JRST SOUT10>\r
+\f ;OUTPUT THE BINARY\r
+\r
+BOUT: HRLO CS,LOCO ;PICKUP THE LOCATION\r
+ PUSHJ PP,ONC ;OUTPUT IT TO THE LISTING FILE\r
+ MOVEI C,"'"\r
+ SKIPE MODO ;IF MODE IS NOT ABSOLUTE\r
+ PUSHJ PP,OUTC ;PRINT A SINGLE QUOTE\r
+ PUSHJ PP,DSTOW ;GET THE CODE\r
+ PUSH PP,RC ;SAVE RELOC\r
+ PUSH PP,RC ;AND AGAIN\r
+IFE WFWSW,<TLNE RC,-2 ;CHECK LEFT EXTERNAL\r
+ HRRZS RC ;MAKE LEFT NON-RELOC>\r
+IFN WFWSW,<TLNE FR,RIMSW!RIM1SW!R1BSW ;CHECK FOR SPECIAL BIN OUT\r
+ JRST BOUT30 ;AND LET HIM DISCOVER THE HORROR\r
+ TLNN RC,-2 ;LEFT HALF EXTERNAL??\r
+ JRST BOUT11 ;NO\r
+ HLRZ AC1,RC ;GET POINTER\r
+ SKIPE 1(AC1) ;IS IT SPECIAL LVAR KIND (NAME IS 0)\r
+ JRST [HRRZS RC\r
+ JRST BOUT11] ;IGNORE FOR NOW\r
+ PUSH PP,AC0 ;SAVE WORD\r
+ HLRZS AC0 ;GET OFFSET\r
+ PUSHJ PP,INCSRC ;FIND A MATCH OR INSERT NEW BLOCK\r
+ ADDI AC1,1 ;POINT ONE FURTHER IN BLOCK\r
+ PUSHJ PP,LVLINK ;AND SET INFORMATION\r
+ POP PP,AC0\r
+ HRLM RC,AC0 ;THE LINK\r
+ HLLM RC,-1(PP) ;AND ITS RELOC\r
+ MOVE RC,-1(PP) ;GET RELOC BACK\r
+BOUT11:>\r
+ TRNN RC,-2 ;RIGHT EXT?\r
+ JRST BOUT30 ;NO\r
+IFN WFWSW,<HRRZ AC1,RC ;GET POINTER\r
+ SKIPE 1(AC1)\r
+ JRST [HRRZ AC1,AC0 ;ORDINARY EXTERNAL, HANDLE\r
+ JUMPE AC1,BOUT20\r
+ HLLZS RC ;ADD EXTERNAL\r
+ JRST BOUT30]\r
+ PUSH PP,AC0 ;SAVE WORD\r
+ HRRZS AC0 ;GET OFFSET\r
+ PUSHJ PP,INCSRC\r
+ PUSHJ PP,LVLINK\r
+ POP PP,AC0\r
+ HRRM RC,AC0\r
+ HLRM RC,-1(PP)\r
+ MOVE RC,-1(PP)>\r
+IFE WFWSW,<HRRZ AC1,AC0 ;YES\r
+ JUMPE AC1,BOUT20 ;PROCESS IF ZERO CODE THERE\r
+ HLLZS RC ;MAKE NON-RELOC>\r
+ JRST BOUT30 ;PROCESS\r
+\r
+\fBOUT20:\r
+ HRRM AC1,-1(PP) ;FIX RC IN STACK SO NO CONFUSION WFW (AC1 HAS 0)\r
+ HRR AC0,0(RC) ;NO, SET ADDRESS LINK\r
+ MOVE AC1,LOCO ;GET CURRENT LOCATION\r
+ HRRM AC1,0(RC) ;SET NEW LINK\r
+ HLRZ AC1,0(RC) ;GET FLAGS/POINTER\r
+ TRNN AC1,-2 ;POINTER?\r
+ HRR AC1,RC ;NO, SET TO FLAGS\r
+ HLR RC,0(AC1) ;PUT FLAGS IN RC\r
+ HRL AC1,MODO ;GET CURRENT MODE\r
+ TRZE RC,-2 ;LEFT HALF RELOCATABLE+\r
+ TLO AC1,2 ;YES, SET FLAG\r
+ HLLM AC1,0(AC1) ;STORE NEW FLAGS\r
+BOUT30: HLLO CS,AC0\r
+ TLZE RC,1 ;PACK RELOCATION BITS\r
+ TRO RC,2\r
+ TRNE RC,2 ;LEFT HALF RELOCATABLE?\r
+ TRZ CS,1 ;YES, RESET BIT\r
+ PUSH PP,AC0 ;NEED AN AC\r
+ HLRZ AC0,-1(PP) ;AC0 = LEFT RELOCATION\r
+ CAILE AC0,1 ;EXTERNAL?\r
+ XORI CS,EXTF!1 ;YES, SET SWITCH\r
+\fIFN FORMSW,<\r
+ OR AC0,HWFMT\r
+ JUMPN AC0,BOUT3H ;EDIT IN HALF WORD FORMAT IF NOT 0\r
+ MOVE AC0,FORM ;GET FORM WORD\r
+ MOVEI C,0 ;ZERO FIELD SIZE\r
+BOUT3A: JFFO AC0,BOUT3B ;AC1 = FIELD SIZE -1\r
+ JRST BOUT3C ;NO FIELDS LEFT, JUMP\r
+BOUT3B: LSH AC0,1(AC1) ;SHIFT OFF FORM FIELD\r
+ MOVEI AC1,6(AC1)\r
+ IDIVI AC1,3 ;AC1 = COLUMNS USED + 1\r
+ ADDI C,(AC1) ;INCREMENT FIELD SIZE\r
+ CAIG C,^D23 ;IS FIELD SIZE GTR 23?\r
+ JRST BOUT3A ;NO. CONTINUE\r
+ MOVE AC1,HWFORM ;USE STANDARD FORM\r
+ MOVEM AC1,FORM\r
+ MOVEI C,^D13 ;SET FIELD SIZE TO 13\r
+BOUT3C: MOVEM C,FLDSIZ ;STORE FIELD SIZE\r
+ MOVE AC0,FORM ;AC0 = FORM WORD\r
+ TRNN RC,2 ;IS LEFT HALF RELOCATED?\r
+ CAMN AC0,HWFORM ;NO. IS FORM HALF WORD?\r
+ JRST BOUT3H ;YES. EDIT IN OLD WAY\r
+ CAMN AC0,IOFORM ;IS IT I/O WORD\r
+ SETOM IOSEEN ;YES,NEED MORE WORK\r
+ IBP TABP\r
+ CAIL C,^D16\r
+ IBP TABP\r
+ ILDB C,TABP ;GET A TAB\r
+ PUSHJ PP,OUTL ;OUTPUT IT\r
+ MOVE AC2,(PP) ;AC2 = INFO TO BE EDITED\r
+ PUSH PP,CS ;SAVE CS = C+1\r
+BOUT3D: JFFO AC0,BOUT3E ;AC1 = FIELD LENGTH - 1\r
+BOUT3E: LSH AC0,1(AC1) ;SHIFT OFF FORM FIELD\r
+ MOVEI C,3(AC1)\r
+ MOVEI AC1,0\r
+ LSHC AC1,-2(C) ;AC1 = FIELD INFO\r
+ IDIVI C,3 ;C = # OF OCTAL DIGITS\r
+ MOVE C+1,AC0 ;SAVE AC0\r
+ SKIPE IOSEEN ;IS THIS A I/O INST.\r
+ PUSHJ PP,BOUT3J ;YES,SET FIELDS CORRECTLY\r
+ MOVNS C\r
+ ROT AC1,(C)\r
+ ROT AC1,(C)\r
+ ROT AC1,(C)\r
+ MOVNS C\r
+\fBOUT3F: MOVEI AC0,6 ;EDIT A DIGIT\r
+ LSHC AC0,3\r
+ EXCH AC0,C\r
+ PUSHJ PP,OUTC ;OUTPUT IT\r
+ MOVE C,AC0\r
+ SOJG C,BOUT3F ;IF MORE DIGITS, GO BACK\r
+ JUMPE C+1,BOUT3G ;JUMP IF END OF WORD\r
+ MOVE AC0,C+1 ;RESTORE AC0\r
+ MOVEI C," "\r
+ PUSHJ PP,OUTC ;OUTPUT A SPACE\r
+ JRST BOUT3D ;PROCESS NEXT FIELD\r
+\r
+BOUT3G: POP PP,CS ;RESTORE CS = C+1\r
+ MOVEI C,0\r
+ TRNE RC,1 ;RELOCATABLE?\r
+ MOVEI C,"'" ;YES\r
+ HRRZ AC0,-1(PP) ;AC0 = RIGHT RELOCATION\r
+ CAILE AC0,1 ;EXTERNAL?\r
+ MOVEI C,"*" ;YES\r
+ PUSHJ PP,ONC2 ;STORE POSSIBLE INDICATOR\r
+ POP PP,AC0\r
+ JRST BOUT3I ;CONTINUE\r
+\r
+BOUT3H: MOVEI C,^D15 ;SET SIZE TO 15\r
+ MOVEM C,FLDSIZ\r
+>\r
+ POP PP,AC0 ;RESTORE\r
+ PUSHJ PP,ONC\r
+ HRLO CS,AC0\r
+ TDZ CS,RC ;SET RELOCATION\r
+ HRRZ C,(PP) ;C = RIGHT RELOCATION\r
+ CAILE C,1 ;EXTERNAL\r
+ XORI CS,EXTF!1 ;YES, SET SWITCH\r
+ PUSHJ PP,ONC\r
+BOUT3I: POP PP,CS ;GET RID OF ENTRY ON STACK\r
+ HRRZ CS,LOCO\r
+ TLNE FR,RIMSW!RIM1SW!R1BSW ;RIM OUTPUT?\r
+ JRST ROUT ;YES, GO PROCESS\r
+\r
+ HRL CS,MODO\r
+ CAME CS,MODLOC ;SEQUENCE OR RELOCATION BREAK?\r
+ PUSHJ PP,COUTD ;YES, DUMP THE BUFFER\r
+ SKIPL COUTX ;NEW BUFFER?\r
+ JRST BOUT40 ;NO, STORE CODE AND EXIT\r
+ MOVEM CS,MODLOC ;YES, STORE NEW VALUES\r
+ EXCH AC0,LOCO\r
+ EXCH RC,MODO\r
+ PUSHJ PP,COUT ;STORE BLOCK LOCATION AND MODE\r
+ EXCH RC,MODO ;RESTORE CURRENT VALUES\r
+ EXCH AC0,LOCO\r
+\r
+\fBOUT40: PUSHJ PP,COUT ;EMIT CODE\r
+ POP PP,RC ;RETRIEVE EXTERNAL BITS\r
+ TRNN RC,-2 ;RIGHT EXTERNAL?\r
+ JRST BOUT50 ;TRY FOR LEFT\r
+ PUSHJ PP,COUTD\r
+ PUSH PP,BLKTYP ;TERMINATE TYPE AND SAVE\r
+ MOVEI AC0,2 ;BLOCK TYPE 2\r
+ MOVEM AC0,BLKTYP\r
+ MOVE AC0,1(RC) ;GET SYMBOL\r
+ MOVEI ARG,60 ;CODE BITS\r
+ PUSHJ PP,SQOZE ;CONVERT TO RADIX 50\r
+ HLLZS RC ;SYMBOL HAS NO RELOCATION\r
+ PUSHJ PP,COUT ;EMIT\r
+ MOVE AC0,LOCO ;GET CURRENT LOC\r
+ HRLI AC0,400000 ;ADDITIVE REQ\r
+ HRR RC,MODO ;CURRENT MODE\r
+ PUSHJ PP,COUT ;EMIT\r
+ MOVSS RC ;NOW FOR LEFT\r
+ TRNN RC,-2\r
+ JRST BOUT60\r
+ JRST BOUT70\r
+BOUT50: MOVSS RC ;CHECK OTHER HALF\r
+ TRNN RC,-2 ;LEFT HALF EXTERNAL?\r
+ JRST BOUT80 ;NO, FALSE ALARM\r
+ PUSHJ PP,COUTD ;CHANGE MODE\r
+ PUSH PP,BLKTYP\r
+ MOVEI AC0,2\r
+ MOVEM AC0,BLKTYP\r
+BOUT70: MOVE AC0,1(RC)\r
+ MOVEI ARG,60\r
+ PUSHJ PP,SQOZE\r
+ HLLZS RC\r
+ PUSHJ PP,COUT\r
+ MOVE AC0,LOCO\r
+ HRLI AC0,600000 ;LEFT HALF ADD\r
+ HRR RC,MODO\r
+ PUSHJ PP,COUT ;EMIT\r
+BOUT60: PUSHJ PP,COUTD ;CHANGE MODE\r
+ POP PP,BLKTYP ;TO OLD ONE\r
+BOUT80: AOS LOCO\r
+ AOS MODLOC\r
+ POPJ PP,\r
+\fIFN WFWSW,<\r
+INCSC1: HLRZ RC,(AC1) ;GET OFFSET OF NEXT BLOCK\r
+ CAMN RC,AC0 ;IS IT THE SAME??\r
+ POPJ PP, ;YES, RETURN AC1 POINTS TO BLOCK\r
+INCSRC: MOVE RC,AC1 ;CURRENT POINTER\r
+ HRRZ AC1,(AC1) ;IN CASE THIS COMES UP 0\r
+ JUMPN AC1,INCSC1 ;SINCE 0 IS END OF CHAIN. ANY MORE??\r
+ MOVEI AC1,3 ;NO, GET A NEW BLOCK\r
+ ADDB AC1,FREE\r
+ CAML AC1,SYMBOL\r
+ PUSHJ PP,XCEED\r
+ SUBI AC1,2 ;WE MUST BE POINTING RIGHT WHEN WE GET OUT\r
+ HRRM AC1,(RC) ;INSERT WHERE END OF CHAIN WAS\r
+ HRLZM AC0,(AC1) ;SET OFFSET AND END OF CHAIN\r
+ SETZM 1(AC1)\r
+ SETZM 2(AC1) ;NO LEFT OR RIGHT HALF FIXUPS\r
+ POPJ PP, ;DONE\r
+\r
+LVLINK: MOVE RC,LOCO ;GET CURRENT LOCATION\r
+ HRL RC,MODO ;AND MODE\r
+ EXCH RC,1(AC1) ;PUT IN AND GET PLACE TO LINK TO\r
+ POPJ PP,>\r
+\r
+IFN FORMSW,<\r
+BOUT3J: MOVSS IOSEEN ;SWAP\r
+ SKIPGE IOSEEN ;SKIP IF NOT FIRST FIELD\r
+ JRST [HLLZS IOSEEN ;CLEAR RIGHT HALF\r
+ POPJ PP,] ;AND RETURN\r
+ MOVSS IOSEEN ;SWAP BACK\r
+ LSH AC1,2 ;CORRECT MNEMONIC AND OP CODE\r
+ CAIE C,1 ;IS IT OP CODE?\r
+ POPJ PP, ;NO,JUST RETURN\r
+ MOVEI C,2 ;TWO CHAR. WIDE NOW\r
+ SETZM IOSEEN ;DON'T COME AGAIN\r
+ POPJ PP, ;RETURN\r
+>\r
+\fNOUT: MOVE V,[POINT 7,TBUF] ;POINTER TO ASCII LINE\r
+ MOVSI CS,(POINT 6,AC0) ;POINTER TO SIXBIT AC0\r
+ SETZB ARG,AC0\r
+NOUT1: ILDB C,V ;GET ASCII\r
+ CAIL C,"A"+40\r
+ CAILE C,"Z"+40\r
+ JRST .+2\r
+ TRZA C,100 ;LOWER CASE TO SIXBIT\r
+ SUBI C,40 ;CONVERT TO SIXBIT\r
+ JUMPLE C,NOUT3 ;TEST FORM NON-SIXBIT\r
+ CAILE C,77 ;AND NOT GREATER THAN SIXBIT\r
+ JRST NOUT3 ;...\r
+ IDPB C,CS ;DEPOSIT IN AC0\r
+ TLNE CS,770000 ;TEST FOR SIX CHARACTERS\r
+ JRST NOUT1 ;NO, GET ANOTHER\r
+NOUT3: SKIPGE UNIVSN ;IF A UNIVERSAL PROG\r
+ POPJ PP, ;RETURN TO PUT IT IN THE TABLE\r
+\r
+IFN CCLSW,< TLNN IO,IOTLSN ;AND IF WE HAVE NOT SEEN A TITLE\r
+ PUSHJ PP,PRNAM ;THEN PRINT THE NAME>\r
+NOUT2: PUSHJ PP,SQOZE ;CONVERT TO SIXBIT\r
+ JRST COUT ;DUMP AND EXIT\r
+\r
+HOUT:\r
+ MOVEI RC,1 ;RELOCATABLE\r
+IFN RENTSW,<\r
+ MOVE AC0,HHIGH ;GET HIGH SEG IF TWO SEGMENTS\r
+ JUMPE AC0,.+2 ;NOT TWO SEGMENTS\r
+ PUSHJ PP,COUT ;OUTPUT IT >\r
+ MOVE AC0,HIGH\r
+IFN RENTSW,<\r
+ SKIPE HHIGH ;ANY TWOSEG HIGH STUFF\r
+ JRST COUT ;YES,SO NO ABS.>\r
+ PUSHJ PP,COUT ;OUTPUT THE HIGHEST LOCATION\r
+ MOVE AC0,ABSHI\r
+ ;PUT OUT ABS PORTION OF PROGRAM BREAK\r
+ SOJA RC,COUT ;OUTPUT A WORD OF ZERO AND EXIT\r
+\r
+\fIFN RENTSW,<\r
+HSOUT: SETZM HISNSW ;CLEAR FOR PASS2\r
+ MOVE AC0,SVTYP3 ;GET HISEG ARG\r
+ JUMPGE AC0,.+4 ;JUMP IF ONLY HISEG\r
+ HRL AC0,HIGH1 ;GET BREAK FROM PASS 1\r
+ JUMPL AC0,.+2 ;OK IF GREATER THAN 400000\r
+ HRLS AC0 ;SIGNAL TWO SEGMENT TO LOADER\r
+ MOVEI RC,1 ;ASSUME RELOCATABLE\r
+ JRST COUT ;OUTPUT THE WORD>\r
+\r
+VOUT: SKIPN RC,VECREL ;IS VECTOR ABSOLUTE ZERO?\r
+ SKIPE VECTOR ;ALSO CHECK RELOCATION\r
+ JRST .+2\r
+ POPJ PP, ;YES, EXIT\r
+ MOVE AC0,VECTOR ;AC0 SHOULD BE FLAGS\r
+\r
+COUT: AOS C,COUTX ;INCREMENT INDEX\r
+ MOVEM AC0,COUTDB(C) ;STORE CODE\r
+ IDPB RC,COUTP ;STORE RELOCATION BITS\r
+ CAIE C,^D17 ;IS THE BUFFER FULL?\r
+ POPJ PP, ;NO, EXIT\r
+\r
+COUTD: AOSG C,COUTX ;DUMP THE BUFFER\r
+ JRST COUTI ;BUFFER WAS EMPTY\r
+ HRL C,BLKTYP ;SET BLOCK TYPE\r
+ PUSHJ PP,OUTBIN ;OUTPUT COUNT AND TYPE\r
+ SETOB C,COUTY ;INITIALIZE INDEX\r
+\r
+COUTD2: MOVE C,COUTDB(C) ;GET RELOCATION BITS/CODE\r
+ PUSHJ PP,OUTBIN ;DUMP IT\r
+ AOS C,COUTY ;INCREMENT INDEX\r
+ CAMGE C,COUTX ;TEST FOR END\r
+ JRST COUTD2 ;NO, GET NEXT WORD\r
+\r
+COUTI: SETOM COUTX ;INITIALIZE BUFFER INDEX\r
+ SETZM COUTRB ;ZERO RELOCATION BITS\r
+ MOVE C,[POINT 2,COUTRB]\r
+ MOVEM C,COUTP ;INITIALIZE BIT POINTER\r
+ POPJ PP, ;EXIT\r
+\fSTOWZ1:\r
+IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>\r
+STOWZ: MOVEI RC,0\r
+STOW:\r
+IFN FORMSW,< MOVEM AC1,FORM ;STORE FORM WORD>\r
+ JUMP1 STOW20 ;SKIP TEST IF PASS ONE\r
+ TRNE RC,-2 ;RIGHT HALF ZERO OR 1?\r
+ PUSHJ PP,STOWT ;NO, HANDLE EXTERNAL\r
+ TLNN RC,-2 ;LEFT HALF ZERO OR 1? WFW\r
+ JRST STOW10 ;YES, SKIP TEST\r
+ MOVSS RC ;SWAP HALVES\r
+ PUSHJ PP,STOWT1 ;HANDLE EXTERNAL WFW\r
+ MOVSS RC ;RESTORE VALUES\r
+\r
+STOW10: SKIPE EXTPNT ;ANY EXTERNALS REMAINING?\r
+ TRO ER,ERRE ;YES, SET EXTERNAL ERROR FLAG\r
+\r
+STOW20: AOS AC1,STPX ;INCREMENT POINTER\r
+ MOVEM AC0,STCODE(AC1) ;STOW CODE\r
+ MOVEM RC,STOWRC(AC1) ;STOW RELOCATION BITS\r
+IFN FORMSW,<\r
+ PUSH PP,FORM\r
+ POP PP,STFORM(AC1) ;STORE FORM WORD\r
+>\r
+ SKIPN LITLVL ;ARE WE IN LITERAL?\r
+ AOS LOCA ;NO, INCREMENT ASSEMBLY LOCATION\r
+ CAIGE AC1,.STP-1 ;OVERFLOW?\r
+ POPJ PP, ;NO, EXIT\r
+\r
+ SKIPE LITLVL ;ARE WE IN A LITERAL?\r
+ TROA ER,ERRL ;YES, FLAG ERROR BUT DON'T DUMP\r
+ JRST CHARL1 ;NO, SAVE REGISTERS AND DUMP THE BUFFER\r
+ JRST STOWI ;INITIALIZE BUFFER\r
+\r
+DSTOW: AOS AC1,STPY ;INCREMENT POINTER\r
+ MOVE AC0,STCODE(AC1) ;FETCH CODE\r
+ MOVE RC,STOWRC(AC1) ;FETCH RELOCATION BITS\r
+IFN FORMSW,<\r
+ PUSH PP,STFORM(AC1)\r
+ POP PP,FORM ;GET FORM WORD\r
+>\r
+ CAMGE AC1,STPX ;IS THIS THE END?\r
+ POPJ PP, ;NO, EXIT\r
+\r
+STOWI: SETOM STPX ;INITIALIZE FOR INPUT\r
+ SETOM STPY ;INITIALIZE FOR OUTPUT\r
+ SETZM EXTPNT\r
+ POPJ PP, ;EXIT\r
+\fSVSTOW: AOS LITLVL ;NESTED LITERALS\r
+ PUSH PP,STPX ;MAKE ROOM FOR ANOTHER\r
+ PUSH PP,STPY\r
+ MOVE AC1,STPX\r
+ MOVEM AC1,STPY\r
+ JRST 0(AC2)\r
+\r
+GTSTOW: POP PP,STPY ;BACK UP A LEVEL\r
+ POP PP,STPX\r
+ SOS LITLVL\r
+ JRST 0(AC2)\r
+\r
+ ;EXTERNAL RIGHT\r
+STOWT: HRRZ AC1,EXTPNT ;GET RIGHT POINTER\r
+ CAIE AC1,(RC) ;DOES IT MATCH \r
+ PUSHJ PP,QEXT ;EXTERNAL OR RELOCATION ERROR\r
+ HLLZS EXTPNT\r
+ POPJ PP, ;EXIT\r
+\r
+ ;EXTERNAL LEFT\r
+STOWT1: HLRZ AC1,EXTPNT ;GET LEFT HALF\r
+ CAIE AC1,(RC) ;SEE ABOVE\r
+ PUSHJ PP,QEXT\r
+ HRRZS EXTPNT\r
+ POPJ PP, ;EXIT\r
+\fONC: ILDB C,TABP ;ENTRY TO ADVANCE TAB POINTER\r
+ PUSHJ PP,OUTL ;OUTPUT A TAB\r
+ ;OUTPUT 6 OCT NUMBERS FROM CS LEFT\r
+ONC1: MOVEI C,6 ;CONVERT TO ASCII\r
+ LSHC C,3 ;SHIFT IN OCTAL\r
+ PUSHJ PP,OUTL ;OUTPUT ASCII FROM C\r
+ TRNE CS,-1 ;ARE WE THROUGH?\r
+ JRST ONC1 ;NO, GET ANOTHER\r
+ MOVEI C,0 ;CLEAR C\r
+ TLNN CS,1 ;RELOCATABLE?\r
+ MOVEI C,"'" ;YES\r
+ TLNN CS,EXTF ;OR EXTERNAL\r
+ MOVEI C,"*" ;YES\r
+ONC2: JUMPN C,OUTC ;OUTPUT IF EXTERN OR RELOCATABLE\r
+IFN FORMSW,< SOS FLDSIZ ;DECREMENT FIELD SIZE>\r
+ POPJ PP, ;EXIT\r
+\r
+DNC: IDIVI C,^D10\r
+ HRLM CS,0(PP)\r
+ JUMPE C,.+2\r
+ PUSHJ PP,DNC ;RECURSE IF NON-ZERO\r
+ HLRZ C,0(PP)\r
+ ADDI C,"0" ;FORM ASCII\r
+ JRST PRINT ;DUMP AND TEST FOR END\r
+\r
+OUTAS0: HRLI CS,(POINT 7,,) ;ENTRY TO SET POINTER\r
+OUTASC: ILDB C,CS ;GET NEXT BYTE\r
+ JUMPE C,POPOUT ;EXIT ON ZERO DELIMITER\r
+ PUSHJ PP,PRINT\r
+ JRST OUTASC\r
+\r
+OUTSIX: HRLI CS,(POINT 6,,) ;OUTPUT SIXBIT\r
+ ILDB C,CS ;GET SIXBIT\r
+ CAIN C,40 ;"@" DELIMITER?\r
+ POPJ PP, ;YES, EXIT\r
+ ADDI C,40 ;NO, FORM ASCII\r
+ PUSHJ PP,OUTL ;OUTPUT ASCII CHAR FROM C\r
+ JRST OUTSIX+1\r
+\r
+OUTSYM: MOVE CS,AC0 ;PLACE NAME IN CS\r
+OUTSY1: MOVEI C,0 ;CLEAR C\r
+ LSHC C,6 ;MOVE NEXT SIXBIT CHARACTER IN\r
+ JUMPE C,OUTTAB ;TEST FOR END\r
+ ADDI C,40 ;CONVERT TO ASCII\r
+ PUSHJ PP,OUTL ;OUTPUT\r
+ JRST OUTSY1 ;LOOP\r
+\fOUTSET: AOS SX,0(PP) ;GET RETURN LOCATION\r
+ MOVE SX,-1(SX) ;GET XWD CODE\r
+ HLRM SX,BLKTYP ;SET BLOCK TYPE\r
+ SETZB ARG,RC\r
+ PUSHJ PP,0(SX) ;GO TO PRESCRIBED ROUTINE\r
+ JRST COUTD ;TERMINATE BLOCK AND EXIT\r
+\r
+ ;LOOKUP SCANS ALL THE SYMBOLS IN THE SYMBOL TABLE\r
+\r
+LOOKUP: POP PP,LOOKX ;INTERCEPT RETURN POP\r
+ MOVE SX,SYMBOL\r
+ MOVE SDEL,0(SX) ;SET FOR TABLE SCAN\r
+LOOKL: SOJL SDEL,POPOUT ;TEST FOR END\r
+ ADDI SX,2\r
+ MOVE AC0,-1(SX)\r
+ PUSHJ PP,SRCH7 ;LOAD REGISTERS\r
+ HLRZS ARG\r
+ PUSHJ PP,@LOOKX ;RETURN TO CALLING ROUTINE\r
+ JRST LOOKL ;TRY AGAIN\r
+\fEND0: PUSHJ PP,EVALCM ;GET A WORD\r
+ SKIPE EXTPNT ;ANY EXTERNALS?\r
+ TRO ER,ERRE ;YES, ERROR\r
+ SKIPN V,AC0 ;NON-ZERO?\r
+ JUMPE RC,.+2 ;OR RELOC?\r
+ PUSHJ PP,ASSIG7 ;YES, LIST THE VALUE\r
+ MOVEM AC0,VECTOR\r
+ MOVEM RC,VECREL\r
+ PUSHJ PP,VARA ;FILL OUT SELF-DEFINED VARIABLES\r
+ PUSHJ PP,STOUTS ;DUMP THE LINE\r
+ PUSH PP,IO ;SAVE FLAGS\r
+ TLO IO,IOPROG ;XLIST LITS\r
+ PUSHJ PP,LIT1\r
+ POP PP,IO ;GET FLAG BACK\r
+ JUMP2 ENDP2\r
+\r
+ PUSHJ PP,UOUT\r
+ TLNN IO,MFLSW ;SKIP IF ONLY PSEND\r
+ PUSHJ PP,REC2\r
+ MOVE INDIR ;SET UP FIRST AS LAST\r
+ MOVEM LSTFIL ;PRINTED\r
+ SETZM LSTPGN\r
+ PUSHJ PP,INZ\r
+ TLNE IO,MFLSW ;IF PSEND\r
+ POPJ PP, ;BACK TO PSEND0\r
+ SKIPE PRGPTR ;HAVE ANY PRGEND'S BEEN SEEN\r
+ JRST PSEND3 ;YES,GO SET UP AGAIN\r
+\r
+PASS20: SETZM CTLSAV\r
+ PUSHJ PP,COUTI\r
+ PUSHJ PP,EOUT ;OUTPUT THE ENTRIES\r
+ PUSHJ PP,OUTSET\r
+ XWD 6,NOUT ;OUTPUT THE NAME (BLKTYP-6)\r
+IFN RENTSW,<\r
+ SKIPN HISNSW ;PUT OUT BLOCK TYPE 3?\r
+ JRST PASS21 ;NO\r
+ PUSHJ PP,OUTSET\r
+ XWD 3,HSOUT ;OUTPUT THE HISEG BLOCK\r
+PASS21: >\r
+ MOVEI 1\r
+ HRRM BLKTYP ;SET FOR TYPE 1 BLOCK\r
+ TLZ FR,P1 ;SET FOR PASS 2 AND TURN OFF FLAG\r
+ TLO IO,IOPALL ;PUT THESE BACK\r
+ TLZ IO,IOPROG!IOCREF!DEFCRS ;SO LISTINGS WILL BE THE WAY THEY SHOULD\r
+ TLNN FR,R1BSW\r
+ JRST STOWI\r
+ \r
+ MOVE CS,[XWD $ST-1-$CKSM,R1BLDR]\r
+ MOVE C,0(CS)\r
+ PUSHJ PP,PTPBIN\r
+ AOBJN CS,.-2\r
+ PUSHJ PP,R1BI\r
+ JRST STOWI\r
+\f \r
+R1BLDR:\r
+ PHASE 0\r
+ IOWD $ADR,$ST\r
+$ST: CONO PTR,60\r
+ HRRI $A,$RD+1\r
+$RD: CONSO PTR,10\r
+ JRST .-1\r
+ DATAI PTR,@$TBL1-$RD+1($A)\r
+ XCT $TBL1-$RD+1($A)\r
+ XCT $TBL2-$RD+1($A)\r
+$A: SOJA $A,\r
+$TBL1: CAME $CKSM,$ADR\r
+ ADD $CKSM,1($ADR)\r
+ SKIPL $CKSM,$ADR\r
+$TBL2: JRST 4,$ST\r
+ AOBJN $ADR,$RD\r
+$ADR: JRST $ST+1\r
+$CKSM: \r
+ DEPHASE\r
+\r
+IF2,< PURGE $ST,$RD,$A,$TBL1,$TBL2,$ADR,$CKSM>\r
+\fENDP2: PUSHJ PP,COUTD ;DUMP THE BUFFER\r
+ MOVE AC0,LOCO ;CHECK TO SEE IF LIT DIFFERED\r
+ SKIPN MODO ;AND USE SMALLER SINCE AT END\r
+ JRST [CAMN AC0,ABSHI\r
+ HRRZM AC2,ABSHI\r
+ JRST ENDP2W]\r
+IFN RENTSW,<SKIPE HHIGH ;SKIP IF NOT TWO SEGMENTS\r
+ JRST [CAMN AC0,HHIGH\r
+ HRRZM AC2,HHIGH\r
+ JRST ENDP2W]>\r
+ CAMN AC0,HIGH\r
+ HRRZM AC2,HIGH\r
+ENDP2W:\r
+REPEAT 1,<TLNE IO,IOCREF ;CLOSE CREF IF NECESSARY>\r
+REPEAT 0,<TLNE FR,CREFSW ;IF CREFFING\r
+ JRST ENDP2Q\r
+ MOVEI SDEL,0\r
+ PUSH PP,DBUF+3 ;SO NO PAGE INFO\r
+ DPB SDEL,[POINT 7,DBUF+3,13]\r
+ IOR ER,OUTSW ;MAKE SURE OF OUTPUT\r
+ PUSHJ PP,CREF\r
+ MOVEI C,20 ;CODE FOR TITLE\r
+ PUSHJ PP,OUTLST\r
+ PUSH PP,IO ;SAVE THIS\r
+ TLZ IO,IOPAGE ;AND PREVENT PAGE DURING TITLE\r
+ MOVEI CS,TBUF\r
+ PUSHJ PP,OUTAS0\r
+ MOVEI CS,VBUF\r
+ PUSHJ PP,OUTAS0\r
+ POP PP,IO ;RESTORE THE IO WORD\r
+ POP PP,DBUF+3 > ;NEEDS FIX TO CREF\r
+ PUSHJ PP,CLSCR2 ;CLOSE IT UP\r
+ENDP2Q: HRR ER,OUTSW ;SET OUTPUT SWITCH\r
+ SKIPN TYPERR\r
+ TRO ER,TTYSW\r
+ PUSHJ PP,UOUT ;OUTPUT UNDEFINEDS\r
+ TRO ER,TTYSW\r
+ SKPINC C ;SEE IF WE CAN INPUT A CHAR.\r
+ JFCL ;BUT ONLY TO DEFEAT ^O\r
+ SKIPG C,ERRCNT ;GET ERROR COUNT AND CHECK FOR POSITIVE\r
+ JRST NOERW ;PRINT NO ERROR MESSAGE\r
+IFN CCLSW,<ADDM C,JOBERR ;REMEMBER ERROR COUNT FOR EXECUTION DELETION>\r
+ PUSHJ PP,OUTCR\r
+ MOVE C,ERRCNT\r
+ CAIN C,1 ;1 IS A SPECIAL CASE\r
+ JRST ONERW ;PRINT MESSAGE\r
+ MOVEI C,"?" ;? FOR BATCH\r
+ PUSHJ PP,OUTL ;...\r
+ MOVE C,ERRCNT ;PRINT NUMBER OF ERRORS\r
+ PUSHJ PP,DNC\r
+ SKIPA CS,[EXP ERRMS1] ;LOAD TO PRINT\r
+ONERW: MOVEI CS,ERRMS2 ;ONE ERROR DETECTED\r
+ONERW1: PUSHJ PP,OUTSIX ;PRINT\r
+ JRST ENDP2A\r
+NOERW: MOVEI CS,ERRMS3\r
+IFN CCLSW,<TLNE IO,CRPGSW!MFLSW ;IF RPG, DON'T PRINT MESSAGE>\r
+IFE CCLSW,<TLNE IO,MFLSW ;NOR IF MULTI-FILE MODE>\r
+ TRZ ER,TTYSW ;NO TTY OUTPUT\r
+ IOR ER,OUTSW ;UNLESS NEEDED FOR LISTING\r
+ PUSHJ PP,OUTCR\r
+ JRST ONERW1\r
+\r
+\fENDP2A: PUSHJ PP,OUTCR\r
+ TLNN IO,MFLSW ;IN A MULTI-PROG FILE?\r
+ JRST ENDP2D ;NO\r
+ SKIPE ERRCNT ;ANY ERROR?\r
+ PUSHJ PP,[MOVEI CS,[ASCIZ /PROGRAM /]\r
+ PUSHJ PP,OUTAS0 ;YES,SO PRINT MESSAGE\r
+ MOVEI CS,TBUF ;AND TITLE\r
+ PUSHJ PP,OUTAS0 ;FOR IDENTIFICATION\r
+ JRST OUTCR] ;AND A CR-LF\r
+ TRZA ER,TTYSW ;NO MORE OUTPUT NOW\r
+ENDP2D:\r
+IFN CCLSW,<TLNE IO,CRPGSW ;IF RPG, DON'T PRINT PGM BREAK\r
+ TRZ ER,TTYSW ;...>\r
+IFE CCLSW,< SKIPA ;SO PRGEND CODE CAN WORK>\r
+ IOR ER,OUTSW ;...\r
+ PUSHJ PP,OUTCR\r
+IFN RENTSW,<\r
+ MOVEI CS,[SIXBIT /HI-SEG. BREAK IS @/]\r
+ SKIPN HHIGH ;DON'T PRINT IF ZERO\r
+ JRST ENDP2C ;IT WAS\r
+ PUSHJ PP,OUTSIX\r
+ HRLO CS,HHIGH ;GET THE BREAK\r
+ PUSHJ PP,ONC1\r
+ PUSHJ PP,OUTCR\r
+ENDP2C:>\r
+ MOVEI CS,[SIXBIT /PROGRAM BREAK IS @/]\r
+ PUSHJ PP,OUTSIX ;OUTPUT PROGRAM BREAK\r
+ HRRZ CS,ABSHI ;GET ABS. BREAK\r
+ CAIG CS,140 ;ANY ABS. CODE\r
+ JRST [HRLO CS,HIGH ;NO\r
+ JRST ENDP2B] ;SO DON'T PRINT\r
+ HRLO CS,HIGH ;GET PROGRAM BREAK\r
+ PUSHJ PP,ONC1\r
+ PUSHJ PP,OUTCR\r
+ MOVEI CS,[SIXBIT /ABSLUTE BREAK IS @/]\r
+ PUSHJ PP,OUTSIX\r
+ HRLO CS,ABSHI\r
+ENDP2B: PUSHJ PP,ONC1\r
+ PUSHJ PP,OUTCR\r
+ TLNE FR,RIMSW!R1BSW ;RIM MODE?\r
+ PUSHJ PP,RIMFIN ;YES, FINISH IT\r
+IFN CCLSW,<TLNN IO,CRPGSW!MFLSW ;IF NOT IN CCL MODE>\r
+IFE CCLSW,<TLNN IO,MFLSW ;NOR IF IN MULTI-FILE MODE>\r
+ TRO ER,TTYSW ;PRINT SIZE\r
+ PUSHJ PP,OUTCR\r
+ MOVE C,JOBREL\r
+ LSH C,-^D10\r
+ ADDI C,1\r
+ PUSHJ PP,DNC\r
+ MOVEI CS,[SIXBIT /K CORE USED@/]\r
+ PUSHJ PP,OUTSIX\r
+ PUSHJ PP,OUTCR \r
+ HRR ER,OUTSW\r
+ PUSHJ PP,OUTSET\r
+ XWD 2,SOUT ;OUTPUT THE SYMBOLS (BLKTYP-2)\r
+ PUSHJ PP,OUTSET\r
+ XWD 7,VOUT ;OUTPUT TRANSFER VECTOR (..-7)\r
+IFN WFWSW,<PUSHJ PP,OUTSET ;OUTPUT THE LVAR FIXUPS\r
+ XWD 13,OUTB12>\r
+ PUSHJ PP,OUTSET\r
+ XWD 5,HOUT ;OUTPUT HIGHEST RELOCATABLE (..-5)\r
+ PUSHJ PP,COUTD\r
+ TLNN IO,MFLSW ;IS IT PRGEND?\r
+ JRST FINIS ;ALAS, FINISHED\r
+ MOVEI CS,SBUF ;RESET SBUF POINTER\r
+ HRRM CS,SUBTTX ;TO SUBTTL\r
+ SETZM PASS2I ;CLEAR PASS2 VARIABLES\r
+ MOVE [XWD PASS2I,PASS2I+1]\r
+ BLT PASS2Z-1 ;BUT NOT ALL OF VARIABLES\r
+ JRST INZ ;RE-INITIALIZE FOR NEXT PROG\r
+\fIFN WFWSW,<\r
+OUTB12: SKIPN ARG,FIXLNK ;WERE THERE ANY??\r
+ POPJ PP, ;JUST GO AWAY\r
+OUTB19: HRRZ SX,(ARG) ;POINTER TO HEADER BLOCK NOW IN SX\r
+ HRRZ AC1,(SX) ;NOW AC1 HAS POINTER TO CODE FIXUPS\r
+ JUMPE AC1,OUTB13 ;NONE THERE\r
+OUTB16: HLRZ AC0,(AC1) ;GET LOCATION OFFSET\r
+ ADD AC0,2(SX) ;ADD BASE LOCATION\r
+ SKIPN 1(AC1) ;AND RIGHT HALF??\r
+ JRST OUTB14 ;NO\r
+ PUSH PP,AC0 ;SAVE FIXUP VALUE\r
+ SETZB AC0,RC\r
+ PUSHJ PP,OUTBWD ;OUTPUT A Z (SAYS RIGHT HALF CODE)\r
+ POP PP,AC0 ;GET VALUE BACK\r
+ HLRZ RC,1(AC1) ;GET RELOC OF FIXUP CHAIN\r
+ LSH RC,1 ;GOES IN LEFT HALF\r
+ HRL AC0,1(AC1) ;LOCATION OF CHAIN\r
+ PUSHJ PP,OUTBWD ;LEFT HALF LOCATION, RIGHT HALF VALUE\r
+OUTB14: SKIPN 2(AC1) ;ANY LEFT HALF??\r
+ JRST OUTB15 ;NO, GO LOOK FOR NEXT BLOCK\r
+ PUSH PP,AC0 ;SAVE VALUE\r
+ MOVEI RC,0\r
+ MOVSI AC0,400000 ;INDICATE LEFT HALF\r
+ PUSHJ PP,OUTBWD\r
+ POP PP,AC0\r
+ HLRZ RC,2(AC1) ;GET RELOC FOR LEFT HALF\r
+ LSH RC,1\r
+ HRL AC0,2(AC1)\r
+ PUSHJ PP,OUTBWD\r
+OUTB15: HRRZ AC1,(AC1) ;NEXT LINK IN CHAIN\r
+ JUMPN AC1,OUTB16 ;IF NOT END, PROCESS\r
+OUTB13: HLRZ AC1,(SX) ;POINTER TO SYMBOL TABLE FIXUP CHAIN\r
+ JUMPE AC1,OUTB17 ;CHACK FOR SOME THERE\r
+OUTB18: MOVE AC0,2(AC1) ;FLAGS\r
+ HRR AC0,2(SX) ;VALUE IN RH\r
+ MOVEI RC,0 ;NO RELCO ON IT\r
+ PUSHJ PP,OUTBWD\r
+ MOVE AC0,1(AC1) ;THE SYMBOL NAME\r
+ PUSHJ PP,OUTBWD\r
+ HRRZ AC1,(AC1) ;FOOLOW CHAIN\r
+ JUMPN AC1,OUTB18\r
+OUTB17: HRRZ ARG,-1(ARG) ;DONE WITH THIS SYMBOL GET NEXT\r
+ JUMPN ARG,OUTB19\r
+ POPJ PP, ;ALL DONE\r
+\f\r
+OUTBWD: SKIPL COUTX ;IF WE ARE AT THE START\r
+ JRST COUT ;NO PUT OUT\r
+ PUSH PP,AC0 ;WE NEED TO PUT NEW RELOC AND VAR LENGTH\r
+ PUSH PP,RC ;AS FIRST TWO WORDS\r
+ MOVE AC0,HIGH\r
+ MOVEI RC,1 ;IT IS RELOC\r
+ PUSHJ PP,COUT\r
+ MOVE AC0,LVARLC ;THE LENGTH\r
+ MOVEI RC,0\r
+ PUSHJ PP,COUT\r
+ POP PP,RC\r
+ POP PP,AC0\r
+ JRST COUT ;NOW PUT OUT THE ONE WE WANTED TO\r
+>\r
+\r
+RIMFIN: TLNE FR,R1BSW\r
+ PUSHJ PP,R1BDMP\r
+ SKIPN C,VECTOR\r
+ MOVSI C,(JRST 4,)\r
+ TLNN C,777000\r
+ TLO C,(JRST)\r
+ PUSHJ PP,PTPBIN\r
+ MOVEI C,0\r
+ JRST PTPBIN\r
+\fSUBTTL PASS INITIALIZE\r
+INZ: AOS MODA\r
+ AOS MODO\r
+ SETZM SEQNO\r
+ SETZM TAG\r
+ HRRI RX,^D8\r
+ MOVEI VARHD\r
+ MOVEM VARHDX\r
+ MOVEI LITHD\r
+ MOVEM LITHDX\r
+ PUSHJ PP,LITI\r
+ PUSHJ PP,STOWI\r
+IFN FORMSW,<\r
+ HRRES HWFMT ;SET DEFAULT VALUE BACK>\r
+ JRST OUTLI\r
+\r
+RCPNTR: POINT 1,ARG,^L<RELF>-18 ;POINT 1,ARG,22\r
+\fSUBTTL PSEUDO-OP HANDLERS\r
+\r
+TAPE0: PUSHJ PP,STOUTS ;FINISH THIS LINE\r
+ JRST GOTEND ;AND IGNORE THE REST OF THIS FILE\r
+\r
+RADIX0: PUSHJ PP,EVAL10 ;EVALUATE RADIX D10\r
+ CAIG AC0,^D10 ;IF GREATER THAN 10\r
+ CAIG AC0,1 ;OR LESS THAN 2,\r
+ERRAX: TROA ER,ERRA ;FLAG ERROR AND SKIP\r
+ HRR RX,AC0 ;SET NEW RADIX\r
+ POPJ PP,\r
+\r
+\r
+XALL0: TLZ IO,IOSALL ;TURN OFF MACRO SUPPRESS ALL\r
+IOSET: JUMP1 POPOUT ;NOSYM (IONSYM), XALL (IOPALL), XLIST (IOPROG)\r
+ HLRZ SX,AC0 ;STORE FLAGS\r
+ PUSHJ PP,STOUTS ;POLISH OFF LINE\r
+ TLO IO,0(SX) ;NOW SUPRESS PRINTING\r
+ POPJ PP,\r
+\r
+IORSET: TDZ IO,AC0 ;RESET FLAG IOPALL/IOPROG\r
+ TLNE AC0,IONCRF ;RESTORING CREFFING?\r
+ TLZ IO,DEFCRS ;YES, CLEAR ANY WAITING DEFINING OCCURENCES\r
+ POPJ PP,\r
+\r
+BLOCK0: PUSHJ PP,HIGHQ\r
+ PUSHJ PP,EVALEX ;EVALUATE\r
+ TRZE RC,-1 ;EXTERNAL OR RELOCATABLE?\r
+ PUSHJ PP,QEXT ;YES, DETERMINE TYPE\r
+ ADDM AC0,LOCO ;UPDATE ASSEMBLY LOCATION\r
+BLOCK1: EXCH AC0,LOCA ;SAVE START OF BLOCK\r
+ ADDM AC0,LOCA ;UPDATE OUTPUT LOCATION\r
+BLOCK2: HRLOM AC0,LOCBLK\r
+ JUMP2 POPOUT\r
+ TRNE ER,ERRU\r
+ TRO ER,ERRV\r
+ POPJ PP,\r
+\f\r
+PRNTX0: TRO ER,TTYSW ;SET OUTPUT TO TTY\r
+ JUMP2 PRNTX2 ;PASS1?\r
+ TDOA ER,OUTSW ;YES,OUTPUT TO LSTDEV ALSO\r
+PRNTX2: ANDCM ER,OUTSW ;NO,DON'T OUTPUT TO TTY IF IT IS LSTDEV\r
+ PUSHJ PP,BYPASS ;GET FIRST CHAR.\r
+ TLOA IO,IORPTC ;REPEAT IT AND SKIP\r
+PRNTX4: PUSHJ PP,PRINT ;PRINT THE CHAR.\r
+ PUSHJ PP,CHARAC ;GET ASCII CHAR.\r
+ CAIG C,CR ;IF GREATER THAN CR\r
+ CAIG C,HT ;OR LESS THAN LF\r
+ JRST PRNTX4 ;THEN CONTINUE\r
+ PUSHJ PP,OUTCR ;OUTPUT A CRLF\r
+ TRZA ER,TTYSW!LPTSW ;TURN OF OUTPUT\r
+CPOPJ1: AOS (PP) ;USEFUL TAG HAS TO GO SOMEWHERE\r
+CPOPJ: POPJ PP, ;EXIT\r
+\r
+REMAR0: PUSHJ PP,GETCHR ;GET A CHARACTER\r
+ CAIE C,EOL\r
+ JRST REMAR0\r
+ POPJ PP, ;EXIT\r
+\fLIT0: PUSHJ PP,BLOCK1\r
+ PUSHJ PP,STOUTS\r
+LIT1: JUMP2 LIT20\r
+\r
+;ON PASS ONE, WE JUST STEP THE LOCATION COUNTER AND CLEAR\r
+\r
+ MOVE AC0,LITCNT\r
+ MOVE SX,LITHDX\r
+ HRLM AC0,0(SX)\r
+ MOVE V,LOCA\r
+ HRL V,MODA\r
+ MOVEM V,-1(SX)\r
+ JRST LIT24\r
+\r
+LIT20: PUSH PP,LOCA\r
+ PUSH PP,LOCO\r
+ SKIPN LITNUM\r
+ JRST LIT20A\r
+ MOVE SX,LITHDX\r
+ HRRZ AC0,-1(SX)\r
+ CAME AC0,LOCA\r
+ TRO ER,ERRP\r
+LIT20A: MOVE SX,LITAB\r
+LIT21: SOSGE LITNUM\r
+ JRST LIT22\r
+IFN FORMSW,<\r
+ MOVE AC0,-3(SX)\r
+ MOVEM AC0,FORM\r
+>\r
+ MOVE AC0,-2(SX) ;WFW\r
+ MOVE RC,-1(SX) ;WFW\r
+ MOVE SX,(SX) ;WFW POINTER TO THE NEXT LIT\r
+ PUSHJ PP,STOW20 ;STOW CODE\r
+ MOVEI C,12 ;SET LINE FEED\r
+ IDPB C,LBUFP\r
+ PUSHJ PP,OUTLIN ;OUTPUT THE LINE\r
+ JRST LIT21\r
+\fLIT22: HRRZ AC2,LOCO\r
+ POP PP,LOCO\r
+ POP PP,LOCA\r
+ MOVE SX,LITHDX\r
+ HLRZ AC0,0(SX)\r
+ SUB AC2,LOCO ;COMPUTE LENGTH USED\r
+ CAMGE AC0,AC2 ;USE LARGER\r
+ MOVE AC0,AC2\r
+ ADD AC2,LOCO\r
+LIT24: ADDM AC0,LOCA\r
+ ADDM AC0,LOCO\r
+ PUSHJ PP,GETTOP\r
+ HRRM SX,LITHDX\r
+LITI: SETZM LITCNT\r
+ SETZM LITNUM\r
+ MOVEI LITAB\r
+ MOVEM LITABX\r
+ JRST HIGHQ\r
+\r
+GETTOP: HRRZ AC1,SX ;VARHD\r
+ HRRZ SX,0(SX)\r
+ JUMPN SX,POPOUT\r
+IFE FORMSW,< MOVEI SX,3 ;WFW>\r
+IFN FORMSW,< MOVEI SX,4 ;ICC>\r
+ ADDB SX,FREE\r
+ CAML SX,SYMBOL\r
+ PUSHJ PP,XCEED\r
+ SUBI SX,1 ;MAKE SX POINT TO LINK\r
+ SETZM 0(SX) ;CLEAR FORWARD LINK\r
+ HRRM SX,0(AC1) ;STORE ADDRESS IN LAST LINK\r
+ POPJ PP,\r
+\fVAR0: PUSHJ PP,BLOCK1 ;PRINT LOCATION\r
+ PUSHJ PP,VARA\r
+ JRST STOUTS\r
+\r
+VARA: MOVE SX,VARHDX\r
+ MOVE AC0,LOCA ;GET LOCATION FOR CHECK\r
+ JUMP1 VARB ;DO NOT CHECK START ON PASS 1\r
+ CAME AC0,-1(SX) ;CHECK START OF VAR AREA\r
+ TRO ER,ERRP ;AND GIVE ERROR\r
+VARB: MOVEM AC0,-1(SX) ;SAVE START FOR PASS 2\r
+ HLRZ AC0,0(SX)\r
+ ADDM AC0,LOCA\r
+ ADDM AC0,LOCO\r
+ PUSHJ PP,GETTOP\r
+ HRRM SX,VARHDX\r
+ JUMP2 POPOUT\r
+\r
+ PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN\r
+IFN WFWSW,<TRNN ARG,EXTF ;IN CASE LVAR HAS BEEN THROUGH>\r
+ TRZN ARG,VARF\r
+ POPJ PP, ;NO, EXIT\r
+ TRZ ARG,UNDF ;TURN OFF FLAG NOW\r
+IFN WFWSW,<MOVSI AC0,1(V) ;NUMBER TO ADD TO>\r
+IFE WFWSW,<MOVSI AC0,1 ;ADD 1>\r
+ ADDM AC0,0(AC1) ;UPDATE COUNT\r
+IFN WFWSW,<\r
+VARA1: ADDI V,1 ;GET LENGTH OF DESIRED BLOCK\r
+ ADDM V,LOCO\r
+ EXCH V,LOCA\r
+ ADDM V,LOCA\r
+ HRL ARG,V ;GET STARTING LOCATION AND UPDAT PCS\r
+>\r
+\r
+ IOR ARG,MODA ;SET TO ASSEMBLY MODE\r
+IFE WFWSW,<HRL ARG,LOCA>\r
+ MOVSM ARG,0(SX) ;UPDATE 2ND WRD OF SYM TAB ENTRY\r
+IFE WFWSW,<AOS LOCA\r
+ AOS LOCO>\r
+ JRST HIGHQ1\r
+\fIF: PUSH PP,AC0 ;SAVE AC0\r
+ PUSH PP,IO\r
+ PUSHJ PP,EVALXQ ;EVALUATE AND TEST EXTERNAL\r
+ POP PP,AC1\r
+ JUMPL AC1,IFPOP\r
+ TLZ IO,FLDSW\r
+IFPOP: POP PP,AC1 ;RETRIEVE SKIP INSTRUCTION\r
+IFSET: TLO IO,IORPTC ;REPEAT CHARACTER\r
+IFXCT: XCT AC1 ;EXECUTE INSTRUCTION\r
+ TDZA AC0,AC0 ;FALSE\r
+ MOVEI AC0,1 ;TRUE\r
+IFEXIT: JUMPOC REPEA1 ;BRANCH IF IN OP-CODE FIELD\r
+IFEX1: PUSHJ PP,GETCHR ;SEARCH FOR "<"\r
+ CAIN C,EOL ;ERROR IF END OF LINE\r
+ JRST ERRAX\r
+ CAIE C,34\r
+ JRST IFEX1\r
+ JUMPE AC0,IFEX2 ;TEST FOR 0\r
+ TLO IO,IORPTC ;NO, PROCESS AS CELL\r
+ PUSHJ PP,CELL\r
+IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>\r
+ SETZM INCND ;NOT ANY MORE\r
+ JRST STOW ;STOW CODE AND EXIT\r
+\r
+IFPASS: HRRI AC0,P1 ;MAKE IT TLNX IO,P1\r
+ MOVE AC1,AC0 ;PLACE IT IN AC1\r
+ JRST IFSET ;EXECUTE INSTRUCTION\r
+\r
+IFB0: HLLO AC1,AC0 ;FORM AND STORE TEST INSTRUCTION\r
+IFB1: PUSHJ PP,CHARL ;GET FIRST NON-BLANK\r
+ CAIE C," "\r
+ CAIN C," "\r
+ JRST IFB1 ;SKIP BLANKS AND TABS\r
+ CAIG C,CR ;CHECK FOR CARRET AS DELIM.\r
+ CAIGE C,LF\r
+ SKIPA SX,SEQNO2\r
+ JRST ERRAX\r
+ MOVEM SX,CNDSEQ\r
+ MOVE SX,PAGENO\r
+ MOVEM SX,CNDPG\r
+ SETOM INCND ;SAVE INFO. FOR PASS 1 ERRORS\r
+ CAIN C,"<" ;LEFT BRACKET?\r
+ SETZB C,RC ;YES, PREPARE FOR OLD FORMAT\r
+ SKIPA SX,C ;SAVE FOR COMPARISON\r
+IFB3: TRO AC0,1 ;SET FLAG\r
+IFB2: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST\r
+ CAMN C,SX ;TEST FOR DELIMITER\r
+ JRST IFXCT ;FOUND\r
+ CAIE C," " ;BLANK?\r
+ CAIN C," " ;OR TAB?\r
+ JRST IFB2 ;YES\r
+ JUMPN SX,IFB3 ;JUMP IF NEW FORMAT\r
+ CAIN C,"<" ;<?\r
+ AOJA RC,IFB2 ;YES, INCREMENT COUNT\r
+ CAIN C,">" ;>?\r
+ SOJL RC,IFXCT ;YES, DECREMENT AND EXIT IF DONE\r
+ JRST IFB3 ;GET NEXT CHARACTER\r
+\r
+\fIFDEF0: HRRI AC0,UNDF ;MAKE IT TLNX ARG,UNDF\r
+ PUSH PP,AC0 ;STACK IT\r
+ PUSHJ PP,GETSYM ;TAKES SKIP RETURN IF SYM NAME IS LEGAL\r
+ TROA ER,ERRA ;ILLEGAL!\r
+ PUSHJ PP,SEARCH\r
+ JRST [PUSHJ PP,OPTSCH\r
+ TLO ARG,UNDF\r
+ JRST .+1]\r
+ PUSHJ PP,SSRCH3 ;EMIT TO CREF ANYWAY\r
+ JRST IFPOP ;POP AND EXECUTE INSTRUCTION\r
+\r
+\fIFIDN0: HLRZS AC0\r
+ MOVEI V,2*.IFBLK-1\r
+ SETZM IFBLK(V) ;CLEAR COMPARISON BLOCK\r
+ SOJGE V,.-1\r
+ SETZM .TEMP ;CLEAR STORED DELIMETER\r
+ MOVEI RC,IFBLK ;SET FOR FIRST BLOCK\r
+ PUSHJ PP,IFCL ;GET FIRST STRING\r
+ MOVEI RC,IFBLKA\r
+ PUSHJ PP,IFCL ;GET SECOND STRING\r
+ MOVEI V,.IFBLK-1\r
+ MOVE SX,IFBLK(V) ;GET WORD FROM FIRST STRING\r
+ CAMN SX,IFBLKA(V) ;COMPARE WITH SECOND STRING\r
+ SOJGE V,.-2 ;EQUAL, TRY NEXT WORD\r
+ JUMPL V,IFEXIT ;DID WE FINISH STRING\r
+ XORI AC0,1 ;NO, TOGGLE REQUEST\r
+ JRST IFEXIT ;DO NOT TURN ON IORPTC WFW\r
+\r
+IFCL: PUSHJ PP,CHARAC ;GET AND LIST CHARACTER\r
+ CAIE C," " ;SKIP SPACES\r
+ CAIG C,CR ;ALSO SKIP CR-LF\r
+ CAIGE C,HT ;AND TAB\r
+ JRST .+2 ;NOT ONE OF THEM\r
+ JRST IFCL ;SO LONG COMPARISONS WILL WORK\r
+;*** A CROCK SO THAT IFIDN <X>,<X>,<INST.> WILL WORK ***\r
+ CAIE C,"," ;IS IT A COMMA?\r
+ JRST .+3 ;NO\r
+ SKIPN .TEMP ;YES, WAS PREVIOUS FIELD OLD METHOD?\r
+ JRST IFCL ;YES, IGNORE COMMA AND SPACES\r
+; ***\r
+ CAIN C,"<" ;WAS IT LEFT BRACKET?\r
+ SETO C, ;SIGNAL OLD METHOD, LOOK FOR RIGHT BRACKET\r
+ MOVEM C,.TEMP ;STORE TERMINATOR FOR COMPARISON\r
+ MOVEI SX,5*.IFBLK-1 ;LIMIT SEARCH\r
+ HRLI RC,(POINT 7,,) ;SET UP BYTE IN RC\r
+IFCLR: PUSHJ PP,CHARAC\r
+ SKIPLE .TEMP ;NEW METHOD?\r
+ JRST IFCLR1 ;YES, IGNORE ANGLE BRACKET COUNTING\r
+ CAIN C,"<" ;ANOTHER LEFT ANGLE?\r
+ SOS .TEMP ;YES, KEEP COUNT\r
+ CAIN C,">" ;CLOSING ANGLE\r
+ AOSGE .TEMP ;MATCHING COUNT?\r
+IFCLR1: CAMN C,.TEMP ;TEST FOR DELIMITER\r
+ POPJ PP, ;EXIT ON RIGHT DELIMITER\r
+ SOJG SX,.+2 ;ANY ROOM IN COMPARISON BLOCK?\r
+ TROA ER,ERRA ;NO, FLAG ERROR BUT KEEP ON GOING\r
+ IDPB C,RC ;DEPOSIT BYTE\r
+ JRST IFCLR\r
+\r
+\f\r
+IFEX2: PUSHJ PP,GETCHR\r
+ CAIN C,EOL ;EXIT WITH ERROR IF END OF LINE\r
+ JRST ERRAX\r
+ CAIN C,34 ;"<"?\r
+ AOJA AC0,IFEX2 ;YES, INCREMENT COUNT\r
+ CAIE C,36 ;">"?\r
+ JRST IFEX2 ;NO, TRY AGAIN\r
+ SOJGE AC0,IFEX2 ;YES, TEST FOR MATCH\r
+ PUSHJ PP,BYPASS ;YES, MOVE TO NEXT DELIMITER\r
+ SETZM INCND ;OUT OF CONDITIONAL NOW\r
+ AOJA AC0,STOWZ1 ;STOW ZERO\r
+\r
+\r
+INTER0: HLLZM AC0,INTENT ;AC0 CONTAINS INTF/ENTF FLAGS\r
+\r
+INTER1: PUSHJ PP,GETSYM ;GET A SYMBOL\r
+ JRST INTER3 ;INVALID, SKIP\r
+ PUSHJ PP,SSRCH ;SEARCH THE TABLE\r
+ MOVSI ARG,SYMF!INTF!UNDF\r
+ TLNE ARG,UNDF ;UNDEFINED?\r
+ TRO ER,ERRA ;YES, FLAG ERROR\r
+IFN WFWSW,<TLNN ARG,VARF ;LET HIM MAKE INTERNAL EVEN IF EXTF ON>\r
+ TLNN ARG,SYNF!EXTF\r
+ TDOA ARG,INTENT ;SET APPROPRIATE FLAGS\r
+INTER3: TROA ER,ERRA ;FLAG ARG EROR AND SKIP\r
+ PUSHJ PP,INSERQ ;INSERT/UPDATE\r
+ JUMPCM INTER1\r
+ SETZM EXTPNT ;JUST IN CASE, SO AS NOT TO CONFUSE WORLD\r
+ POPJ PP, ;NO, EXIT\r
+\fEXTER0: PUSHJ PP,GETSYM ;GET A SYMBOL\r
+ JRST EXTER4 ;INVALID, ERROR\r
+EXTER1: TLO IO,DEFCRS ;FLAG THIS AS A DEFINITION\r
+ PUSHJ PP,SSRCH ;OK, SEARCH SYMBOL TABLE\r
+ JRST EXTER2 ;NOT THERE, INSERT IT\r
+ TLNN ARG,EXTF!VARF!UNDF\r
+ TROA ER,ERRE ;FLAG ERROR AND BYPASS\r
+ TLNE ARG,EXTF ;VALID, ALREADY DEFINED?\r
+ JRST [JUMP1 EXTER3 ;YES, BYPASS\r
+ TLZN ARG,UNDF ;SKIP IF UNDEFINED ALSO\r
+ JRST EXTER3 ;CONTINUE\r
+ ANDM ARG,(SX) ;CLEAR UNDF ON PASS 2\r
+ JRST EXTER2] ;SET UP EXTERNAL NOW\r
+EXTER2: MOVEI V,2 ;NO, GET 2 CELLS FROM THE TREE\r
+ ADDB V,FREE\r
+ CAML V,SYMBOL ;HAVE WE RUN OUT OF CORE?\r
+ PUSHJ PP,XCEEDS ;YES, TRY TO BORROW SOME MORE\r
+ SUBI V,2 ;GET RIGHT CELL FOR POINTER\r
+ SETZB RC,0(V) ;ALL SET, ZERO VALUES\r
+ MOVSI ARG,SYMF!EXTF\r
+ PUSHJ PP,INSERT ;INSERT/UPDATE IT\r
+ MOVSI ARG,PNTF\r
+ IORM ARG,0(SX)\r
+ SKIPA ARG,-1(SX) ;GET THE SIXBIT FOR THE NAME\r
+EXTER4: TROA ER,ERRA ;FLAG AS ERROR\r
+ MOVEM ARG,1(V) ;AND STORE THAT IN CASE SYMBOL TABLE MOVES\r
+EXTER3: JUMPCM EXTER0\r
+ POPJ PP, ;NO, EXIT\r
+\fEVAL10: PUSH PP,RX\r
+ HRRI RX,^D10\r
+ PUSHJ PP,EVALEX ;EVALUATE\r
+ POP PP,RX ;RESET RADIX\r
+ JUMPE RC,POPOUT ;EXIT IF ABSOLUTE\r
+\r
+QEXT: SKIPE EXTPNT ;ANY POSSIBILITIES?\r
+ TROA ER,ERRE ;YES, FLAG EXTERNAL ERROR\r
+ TRO ER,ERRR ;NO, FLAG RELOCATION ERROR\r
+ HLLZS RC ;CLEAR RELOCATION/EXTERNAL\r
+ POPJ PP,\r
+\r
+EVALXQ: PUSHJ PP,EVALEX ;EVALUATE EXPRESSION\r
+ TLZN RC,-2 ;LEFT HALF EXTERNAL\r
+ TRZE RC,-2 ;WAS AN EXTERNAL FOUND?\r
+ TRO ER,ERRE ;YES, FLAG ERROR\r
+ POPJ PP, ;RETURN\r
+\fOPDEF0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL\r
+ POPJ PP, ;ERROR IF INVALID SYMBOL\r
+ CAIE C,73 ;"["?\r
+ JRST ERRAX ;NO, ERROR\r
+ PUSH PP,AC0 ;STACK MNEMONIC\r
+ AOS LITLVL ;SHORT OUT LOCATION INCREMENT\r
+ PUSHJ PP,STMNT ;EVALUATE STATEMENT\r
+ SKIPGE STPX ;CODE STORED?\r
+ TROA ER,ERRA ;NO,"A" ERROR\r
+ PUSHJ PP,DSTOW ;GET AND DECODE VALUE\r
+ SOS LITLVL\r
+ EXCH AC0,0(PP) ;EXCHANGE VALUE FOR MNEMONIC\r
+ PUSH PP,RC ;STACK RELOCATION\r
+ TLO IO,DEFCRS ;SAY WE ARE DEFINING IT\r
+ PUSHJ PP,MSRCH ;SEARCH SYMBOL TABLE\r
+ MOVSI ARG,OPDF ;NOT FOUND\r
+ POP PP,RC ;RESTORE VALUES\r
+ POP PP,V\r
+ TLNE ARG,SYNF!MACF\r
+ TRO ER,ERRA ;YES "A" ERROR\r
+ TRNN ER,ERRA ;ERROR?\r
+ PUSHJ PP,INSERT ;NO, INSERT/UPDATE\r
+ TLZ IO,DEFCRS ;JUST IN CASE\r
+ PUSHJ PP,BYPASS\r
+ JRST STOWI ;BE SURE STOW IS RESET\r
+\r
+\r
+DEPHA0: MOVE AC0,LOCO\r
+ SKIPA RC,MODO ;SET TO OUTPUT VALUES AND SKIP\r
+PHASE0: PUSHJ PP,EVALXQ ;EVALUATE AND CHECK FOR EXTERNAL\r
+ MOVEM AC0,LOCA ;SET ASSEMBLY LOCATION COUNTER\r
+ MOVEM RC,MODA\r
+ JRST BLOCK2\r
+\fASSIGN: JUMPAD ERRAX ;NO, ERROR\r
+ PUSHJ PP,ASSIG1\r
+ TLNE IO,IOSALL ;SUPPRESS ALL?\r
+ JUMPN MRP,CPOPJ ;IF IN MACRO\r
+ASSIG7: MOVEM RC,ASGBLK\r
+ TRNE RC,-2 ;EXTERNAL\r
+ HLLZS ASGBLK ;YES,CLEAR RELOCATION\r
+ TLNE RC,1 ;LEFT HALF NOT RELOC?\r
+ TLNE RC,-2 ;...\r
+ HRROS ASGBLK ;YES, SET FLAG\r
+ MOVEM V,LOCBLK\r
+ POPJ PP,\r
+\r
+ASSIG1: PUSH PP,AC0 ;SAVE SYMBOL\r
+ SETZB AC0,EXTPNT ;SPECIAL CHECK FOR == WFW\r
+ PUSHJ PP,PEEK ;IS THE NEXT ON =\r
+ CAIE C,"="\r
+ JRST ASSIG5\r
+ TLO AC0,NOOUTF ;YES, NOT OUT TO DDT WFW\r
+ PUSHJ PP,GETCHR ;PROCESS THE CHAR.\r
+ PUSHJ PP,PEEK ;CHECK FOR ==: DMN\r
+ASSIG5: CAIE C,":" ;IS IT\r
+ JRST ASSIG6 ;NO\r
+ TLO AC0,INTF ;MAKE INTERNAL\r
+ PUSHJ PP,GETCHR ;REPEAT IT\r
+ASSIG6: MOVEM AC0,HDAS ;STORE THESE BITS WFW\r
+ PUSHJ PP,EVALCM ;EVALUATE EXPRESSION\r
+ EXCH AC0,0(PP) ;SWAP VALUE FOR SYMBOL\r
+ PUSH PP,RC\r
+ TRNN RC,-2 ;CHECK EXTERNAL AGREEMENT\r
+ JRST ASSIG2\r
+ HRRZS RC\r
+ HRRZ ARG,EXTPNT\r
+ CAME RC,ARG\r
+ PUSHJ PP,QEXT ;EXTERNAL OR RELOCATION ERROR\r
+ASSIG2: HLRZ RC,(PP)\r
+ TRNN RC,-2\r
+ JRST ASSIG3\r
+ HLRZ ARG,EXTPNT\r
+ CAME RC,ARG\r
+ PUSHJ PP,QEXT\r
+ASSIG3: TLO IO,DEFCRS\r
+ PUSHJ PP,SSRCH\r
+ MOVSI ARG,SYMF\r
+ IOR ARG,HDAS ;WFW\r
+ TLNE ARG,UNDF ;WAS IT UNDEFINED\r
+ TLZ ARG,EXTF!PNTF ;YES,CLEAR EXTF NOW\r
+ TLZ ARG,UNDF!VARF ;CANCEL UNDEFINED AND VARIABLE FLAGS\r
+ SETZM EXTPNT ;FOR REST OF WORLD\r
+ POP PP,RC\r
+ TRNE ER,ERRORS-ERRQ\r
+ SETZ RC, ;CLEAR RELOCATION\r
+ POP PP,V\r
+ TRNE ER,ERRU ;WAS VALUE UNDEFINED?\r
+ TLO ARG,UNDF ;YES,SO TURN UNDF ON\r
+ TLNE ARG,TAGF!EXTF\r
+ JRST ERRAX\r
+ JRST INSERT\r
+\r
+\fLOC0: PUSHJ PP,HIGHQ ;AC0=0,0\r
+ PUSH PP,AC0 ;SAVE MODE REQUESTED\r
+ HLRZS AC0 ;PUT MODE IN RIGHT HALF\r
+ JUMPN AC0,RELOC0 ;RELOC PSEUDO-OP\r
+ CAMN AC0,MODO ;SAME AS PRESENT MODE?\r
+ JRST [HRRZ AC0,LOCO ;YES\r
+ EXCH AC0,ABSLOC ;EXCH VALUES\r
+ JRST LOC01]\r
+ HRRZ AC0,LOCO ;NO, GET CURRENT VALUE\r
+ MOVEM AC0,RELLOC ;SAVE IT\r
+ MOVE AC0,ABSLOC ;GET LAST RELOC VALUE\r
+LOC01: PUSHJ PP,BYPASS ;SKIP BLANKS\r
+ TLO IO,IORPTC\r
+ CAIE C,EOL ;USE PREVIOUS VALUE IF NULL ARGUMENT\r
+ PUSHJ PP,EVALXQ ;GET EXPRESSION AND TEST EXTERNAL\r
+ HRRM AC0,(PP) ;STORE NEW VALUE\r
+ POP PP,AC0 ;RETRIEVE STORED MODE AND VALUE\r
+LOC10: HRRZM AC0,LOCA ;SET ASSEMBLY LOCATION\r
+ HRRZM AC0,LOCO ;AND OUTPUT LOCATION\r
+ HLRZM AC0,MODA ;SET MODE\r
+ HLRZM AC0,MODO\r
+ JRST BLOCK2\r
+\r
+RELOC0: CAMN AC0,MODO\r
+ JRST [HRRZ AC0,LOCO\r
+ EXCH AC0,RELLOC\r
+ JRST LOC01]\r
+ HRRZ AC0,LOCO\r
+ MOVEM AC0,ABSLOC\r
+ MOVE AC0,RELLOC\r
+ JRST LOC01\r
+\r
+\fIFN RENTSW,<\r
+HISEG1: PUSHJ PP,HIGHQ ;SET CURRENT PROGRAM BREAK\r
+ PUSHJ PP,COUTD ;DUMP CURRENT TYPE OF BLOCK\r
+ SKIPN HISNSW ;IF WE HAVE SEEN IT BEFORE\r
+ SKIPE HIGH ;OR ANY RELOC CODE PUT OUT\r
+ TRO ER,ERRQ ;FLAG AS AN ERROR\r
+ PUSHJ PP,BYPASS ;GO GET EXPRESSION\r
+ TLO IO,IORPTC\r
+ PUSHJ PP,EVALXQ ;CHECK FOR EXTERNAL\r
+ ANDCMI AC0,1777 ;ONLY ALLOWED TO START ON NEW K BOUND\r
+ HRRZM AC0,LOCA ;SET LOC COUNTERS\r
+ HRRZM AC0,LOCO\r
+ MOVEI RC,1 ;ASSUME RELOCATABLE\r
+ POPJ PP,\r
+\r
+TWSEG0: PUSHJ PP,HISEG1 ;COMMON CODE\r
+ JUMPN AC0,.+2 ;ARGUMENT SEEN\r
+ MOVEI AC0,400000 ;ASSUME 400000\r
+ HRRZM AC0,HMIN ;SET OFSET OF HIGH SEG.\r
+ HRRZM AC0,HHIGH ;INCASE NO HISEG CODE\r
+ TLOA AC0,(1B0) ;SIGNAL TWO SEGMENTS AND SKIP\r
+\r
+HISEG0: PUSHJ PP,HISEG1 ;COMMON CODE\r
+HISEG2: MOVEM AC0,SVTYP3 ;SAVE THE HISEG ARG\r
+ MOVEM RC,MODA ;SET MODES\r
+ MOVEM RC,MODO\r
+ SETOM HISNSW ;WE HAVE ALREADY PUT ONE OUT\r
+ JRST BLOCK2 ;MAKE LISTING HAPPEN RIGHT>\r
+\r
+IFE RENTSW,<\r
+ SYN CPOPJ,HISEG0\r
+ SYN CPOPJ,TWSEG0>\r
+\r
+IFN FORMSW,<\r
+ONFORM: HRRES HWFMT ;ALLOW MULTI-FORMAT LISTING\r
+ POPJ PP,\r
+OFFORM: HRROS HWFMT ;HALF-WORD FORMAT ONLY\r
+ POPJ PP, >\r
+\r
+IFE FORMSW,<\r
+ SYN CPOPJ,ONFORM\r
+ SYN CPOPJ,OFFORM>\r
+\fHIGHQ:\r
+HIGHQ1: MOVE V,LOCO ;GET ASSEMBLY LOCATION\r
+ SKIPN MODO ;IF ASSEMBLY MODE IS ABSOLUTE\r
+ JRST [CAMLE V,ABSHI ;RECORED ABS HIGHEST ALSO\r
+ MOVEM V,ABSHI\r
+ POPJ PP,]\r
+IFN RENTSW,<SKIPE HMIN ;IS IT A TWO SEGMENT PROGRAM?\r
+ JRST [CAMGE V,HMIN ;YES,IS THIS HIGH SEG.?\r
+ JRST .+1 ;NO,STORE LOW SEGMENT\r
+ CAMLE V,HHIGH ;YES,IS IT GREATER THAN "HHIGH"?\r
+ MOVEM V,HHIGH ;YES,REPLACE WITH LARGER VALUE\r
+ POPJ PP,]>\r
+ CAMLE V,HIGH ;IS IT GREATER THAN "HIGH"?\r
+ MOVEM V,HIGH ;YES, REPLACE WITH LARGER VALUE\r
+ POPJ PP,\r
+ \r
+ONML: TLZA FR,MWLFLG ;MULTI-WORD LITERALS OK\r
+OFFML: TLO FR,MWLFLG ;NO\r
+ POPJ PP,\r
+\r
+OFFSYM: SETOM IONSYM ;SUPRESS SYMBOL TABLE LISTING\r
+ POPJ PP,\r
+\r
+SUPRE0: PUSHJ PP,GETSYM ;GET A SYMBOL TO SUPRES\r
+ JRST SUPRE1 ;ERROR\r
+ PUSHJ PP,SSRCH ;SYMBOL ONLY\r
+ JRST SUPRE1 ;GIVE ERROR MESSAGE\r
+ TLOA ARG,SUPRBT ;SET THE SUPRESS BIT\r
+SUPRE1: TROA ER,ERRA\r
+ IORM ARG,(SX) ;PUT BACK\r
+ JUMPCM SUPRE0 ;ANY MORE?\r
+ JRST SUPRS1\r
+\r
+SUPRSA: PUSHJ PP,LOOKUP ;SUPRESS ALL\r
+ MOVSI ARG,SUPRBT\r
+ IORM ARG,(SX)\r
+SUPRS1: SETZM EXTPNT ;JUST IN CASE WE LOOKED ONE UP\r
+ POPJ PP,\r
+\r
+XPUNG0: JUMP1 POPOUT\r
+ PUSHJ PP,LOOKUP\r
+ MOVE ARG,(SX) ;GET SYMBOL FLAGS\r
+ TLNN ARG,INTF!ENTF!EXTF!SPTR\r
+ TLOA ARG,SUPRBT ;LOCAL SYMBOL,SO SUPPRESS IT\r
+ SETZM EXTPNT\r
+ MOVEM ARG,(SX) ;RESTORE FLAGS\r
+ POPJ PP,\r
+\fTITLE0: JUMP2 REMAR0\r
+ MOVEI SX,.TBUF\r
+ HRRI AC0,TBUF\r
+ PUSHJ PP,SUBTT1 ;GO READ IT\r
+ MOVEM SX,TCNT ;SAVE COUNT OF CHARS. WRITTEN\r
+ SKIPE UNIVSN ;WAS IT A UNIVERSAL?\r
+ PUSHJ PP,ADDUNV ;YES ADD TO TABLE\r
+ TLOE IO,IOTLSN ;HAVE WE SEEN ONE\r
+IFE CCLSW,<TRO ER,ERRM ;YES, COMPLAIN>\r
+IFN CCLSW,<TROA ER,ERRM ;YES, MESSAGE\r
+ JRST PRNAM ;PRINT NAME IF FIRST ONE>\r
+ POPJ PP, ;EXIT OTHERWISE\r
+\r
+SUBTT0: SKIPE SBUF ;STORE FIRST SUBTTL ON PASS1\r
+ JUMP1 REMAR0 ;OTHERWISE EXIT IF PASS ONE\r
+ MOVEI SX,.SBUF\r
+ HRRI AC0,SBUF\r
+\r
+SUBTT1: PUSHJ PP,BYPASS ;BYPASS LEADING BLANKS\r
+ TLO IO,IORPTC\r
+SUBTT3: PUSHJ PP,CHARAC ;GET ASCII CHARACTER\r
+ IDPB C,AC0 ;STORE IN BLOCK\r
+ CAIGE C,40 ;TEST FOR TERMINATOR\r
+ CAIN C,HT\r
+ SOJG SX,SUBTT3 ;TEST FOR BUFFER FULL\r
+ DPB RC,AC0 ;END, STORE TERMINATOR\r
+ SOJA SX,CPOPJ ;COUNT NUL AND EXIT\r
+\r
+IFN CCLSW,<\r
+PRNAM: TLNN IO,CRPGSW ;NOT IF NOT RPG\r
+ POPJ PP,\r
+ PUSH PP,AC0 ;SAVE AC0 DMN\r
+ PUSH PP,RC ;AND RC\r
+ MOVE AC0,[POINT 7,TBUF]\r
+ MOVE SX,[POINT 7,OTBUF]\r
+ MOVEI RC,6 ;MAX OF SIX CHRS\r
+PN1: ILDB C,AC0\r
+ CAILE C," " ;CHECK FOR LEGAL\r
+ CAILE C,"Z"+40 ;CHECK AGAINST LOWER CASE Z\r
+ JRST PN2\r
+ IDPB C,SX ;PUT IN OUTPUT BUFFER\r
+ SOJG RC,PN1 ;GET MORE\r
+PN2: MOVEI C,0\r
+ IDPB C,SX ;TERMINATOR\r
+ TTCALL 3,OTBUF\r
+ TTCALL 3,[ASCIZ /\r
+/]\r
+ POP PP,RC\r
+ POP PP,AC0 ;RESTORE AC0 DMN\r
+ POPJ PP,\r
+>\r
+\fSYN0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL\r
+ JRST ERRAX ;ERROR, EXIT\r
+ PUSHJ PP,MSRCH ;TRY FOR MACRO/OPDEF\r
+ JRST SYN3 ;NO,0THRY FOR OPERAND\r
+SYN1: MOVEI SX,MSRCH ;YES, SET FLAG\r
+SYN2: PUSHJ PP,SAVEXS ;SAVE REGISTERS\r
+ JUMPNC ERRAX ;ERROR IF NO COMMA\r
+ PUSHJ PP,GETSYM ;GET THE SECOND SYMBOL\r
+ POPJ PP,\r
+ PUSHJ PP,@SAVBLK+SX ;SEARCH FOR SECOND SYMBOL\r
+ JFCL\r
+ MOVE ARG,SAVBLK+ARG ;GET VALUES\r
+ MOVE RC,SAVBLK+RC\r
+ MOVE V,SAVBLK+V\r
+ TLNE ARG,MACF ;MACRO?\r
+ PUSHJ PP,REFINC ;YES, INCREMENT REFERENCE\r
+ JRST INSERT ;INSERT AND EXIT\r
+\r
+SYN3: PUSHJ PP,SSRCH ;SEARCH FOR OPERAND\r
+ JRST SYN4 ;NOT FOUND, TRY OP CODE\r
+ TLO ARG,SYNF ;FLAG AS SYNONYM\r
+ TLNE ARG,EXTF ;EXTERNAL?\r
+ HRRZ V,ARG ;YES, RELPACE WITH POINTER\r
+ MOVEI SX,SSRCH ;SET FLAG\r
+ TLNN ARG,VARF ;DO NOT LET HIM SYN A VARIABLE\r
+ JRST SYN2\r
+ JRST ERRAX\r
+\r
+SYN4: PUSHJ PP,OPTSCH ;SEARCH FOR OP-CODE\r
+ JRST ERRAX ;NOT FOUND, EXIT WITH ERROR\r
+ MOVSI ARG,SYNF ;FLAG AS SYNONYM\r
+ JRST SYN1\r
+\fPURGE0: PUSHJ PP,GETSYM ;GET A MNEMONIC\r
+ JRST [TRZ ER,ERRA ;CLEAR ERROR\r
+ POPJ PP,] ;AND RETURN\r
+ PUSHJ PP,MSRCH ;SEARCH MACRO SYMBOL TABLE\r
+ JRST PURGE2 ;NOT FOUND, TRY SYMBOLS\r
+ PUSH PP,CS ;SAVE CS AS IT MAY GET GARBAGED\r
+ TLNE ARG,MACF ;MACRO?\r
+ PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE\r
+ POP PP,CS\r
+ JRST PURGE4 ;REMOVE SYMBOL FROM TABLE\r
+\r
+PURGE2: PUSHJ PP,SSRCH ;TRY OPERAND SYMBOL TABLE\r
+ JRST PURGE5 ;NOT FOUND GET NEXT SYMBOL\r
+ TRNN RC,-2 ;CHECK COMPLEX EXTERNAL\r
+ TLNE RC,-2\r
+ TLNE ARG,SYNF\r
+ JRST .+2\r
+ JRST PURGE3\r
+ TLNE ARG,EXTF!UNDF ;ERROR IF EXTERNAL OR UNDEFINED\r
+ TLNE ARG,SYNF ;BUT NOT A SYNONYM\r
+ JRST PURGE4\r
+PURGE3: TROA ER,ERRA ;NOT FOUND, ERROR\r
+PURGE4: PUSHJ PP,REMOVE ;REMOVE FROM THE SYMBOL TABLE\r
+PURGE5: JUMPCM PURGE0\r
+ POPJ PP, ;EXIT\r
+\fOPD1: TLNE ARG,UNDF ;IF OPDEF IS UNDEFINED\r
+ TRO ER,ERRO ;GIVE "O" ERROR\r
+OPD: MOVE AC0,V ;PUT VALUE IN AC0\r
+ JRST OP\r
+IOP: MOVSI AC2,(POINT 9,0(PP),11)\r
+IFE FORMSW,< TLOA IO,IOIOPF ;SET "IOP SEEN" AND SKIP>\r
+IFN FORMSW,< PUSH PP,IOFORM ;USE I/O FORM\r
+ TLO IO,IOIOPF ;SET "IOP" SEEN\r
+ JRST OP+2>\r
+OP: MOVSI AC2,(POINT 4,0(PP),12)\r
+IFN FORMSW,< PUSH PP,INFORM ;USE INST. FORM>\r
+ PUSH PP,RC\r
+ PUSH PP,AC0 ;STACK CODE \r
+ PUSH PP,AC2\r
+ PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION\r
+ POP PP,AC2\r
+ JUMPNC OP2\r
+OP1B: PUSHJ PP,GETCHR ;GET A CHARACTER\r
+IFE FORMSW,<JUMPCM XWD5 ;PROCESS COMMA COMMA IN XWD>\r
+IFN FORMSW,<JUMPNC .+4 ;JUMP IF NO COMMA\r
+ MOVE AC2,HWFORM ;GET FORM WORD FOR XWD\r
+ MOVEM AC2,-2(PP) ;REPLACE INSTRUCTION FORM\r
+ JRST XWD5 ;PROCESS COMMA COMMA IN XWD>\r
+ TLO IO,IORPTC ;NOT A COMMA,REPEAT IT\r
+ LDB AC1,AC2\r
+ ADD AC1,AC0\r
+ DPB AC1,AC2\r
+ JUMPE RC,OP1A ;EXTERNAL OR RELOCATABLE?\r
+ PUSHJ PP,QEXT ;YES, DETERMINE WHICH AND FLAG AN ERROR\r
+\r
+OP1A: PUSHJ PP,EVALEX ;GET ADDRESS PART\r
+OP2: PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS\r
+OP3: POP PP,AC0 ;PUT IN AC0\r
+ POP PP,RC\r
+IFN FORMSW,< POP PP,AC1 ;GET FORM WORD>\r
+ SKIPE (PP) ;CAME FROM EVALCM?\r
+ JRST STOW ;NO,STOW CODE AND EXIT\r
+ POP PP,AC1 ;YES,EXIT IMMEDIATELY\r
+ POPJ PP,\r
+\r
+\fEVADR: ;EVALUATE STANDARD ADDRESS\r
+IFE IIISW,<TLNN AC0,-1 ;OK IF ALL 0'S\r
+ JRST .+4 ;IT WAS\r
+ TLC AC0,-1 ;CHANGE ALL ONES TO ZEROS\r
+ TLCE AC0,-1 ;OK IF ALL 1'S\r
+ TRO ER,ERRQ ;NO,FLAG Q ERROR>\r
+ ADD AC0,-1(PP) ;ADD ADDRESS PORTIONS\r
+ HLL AC0,-1(PP) ;GET LEFT HALF\r
+ TLZE FR,INDSW ;INDIRECT BIT?\r
+ TLO AC0,(Z @) ;YES, PUT IT IN\r
+ MOVEM AC0,-1(PP) ;RE-STACK CODE\r
+ ADD RC,-2(PP) ;UPDATE RELOCATION\r
+ HRRM RC,-2(PP) ;USE HALF WORD ADD\r
+ CAIE C,10 ;"("?\r
+ POPJ PP, ;NO, EXIT\r
+\r
+ MOVSS EXTPNT ;WFW\r
+ PUSHJ PP,EVALCM ;EVALUATE\r
+ MOVSS EXTPNT ;WFW\r
+ MOVSS V,AC0 ;SWAP HALVES\r
+IFE IIISW,<MOVSS SX,RC\r
+ IOR SX,V ;MERGE RELOCATION\r
+ TRNN SX,-1 ;RIGHT HALF ZERO?\r
+ JRST OP2A ;YES, DO SIMPLE ADD\r
+ MOVE ARG,RC ;NO, SWAP RC INTO ARG>\r
+IFN IIISW,<MOVSS ARG,RC>\r
+ ADD V,-1(PP) ;ADD RIGHT HALVES\r
+ ADD ARG,-2(PP)\r
+ HRRM V,-1(PP) ;UPDATE WITHOUT CARRY\r
+ HRRM ARG,-2(PP)\r
+ HLLZS AC0 ;PREPARE LEFT HALVES\r
+ HLLZS RC\r
+IFE IIISW,<TLNE SX,-1 ;IS LEFT HALF ZERO?\r
+ TRO ER,ERRQ ;NO FLAG FORMAT ERROR\r
+OP2A: TLNE RC,-1 ;RELOCATION FOR LEFT HALF?\r
+ PUSHJ PP,OP2A1 ;YES,IS IT LEGAL?\r
+ TLNE AC0,777000 ;OP CODE FIELD USED?\r
+ JRST [EXCH AC0,-1(PP);YES, GET STORED CODE\r
+ TLNE AC0,777000 ;OP CODE FIELD BEEN SET?\r
+ TRO ER,ERRQ ;YES, MOST LIKELY AN ERROR\r
+ EXCH AC0,-1(PP)\r
+ JRST .+1] ;RETURN TO ADD >\r
+ ADDM AC0,-1(PP) ;MERGE WITH PREVIOUS VALUE\r
+ ADDM RC,-2(PP)\r
+ CAIE C,11 ;")"?\r
+ JRST ERRAX ;NO, FLAG ERROR\r
+ ;YES, BYPASS PARENTHESIS\r
+BYPASS:\r
+BYPAS1: PUSHJ PP,GETCHR\r
+BYPAS2: JUMPE C,.-1 ;SKIP TRAILING BLANKS\r
+ POPJ PP, ;EXIT\r
+\r
+\fIFE IIISW,<\r
+OP2A1: EXCH RC,-2(PP) ;GET STORED CODE\r
+ TLNN RC,-1 ;OK IF ALL ZERO\r
+ JRST OP2A2 ;OK SO RETURN\r
+ TLC RC,-1 ;CHANGE ALL ONES TO ZEROS\r
+ TLCE RC,-1 ;OK IF ALL ONES\r
+ TRO ER,ERRQ ;OTHERWISE A "Q" ERROR\r
+OP2A2: EXCH RC,-2(PP) ;GET RC,BACK\r
+ POPJ PP, ;AND RETURN>\r
+\r
+\r
+EXPRES: HRLZ AC0,RX ;FUDGE FOR OCT0\r
+\r
+OCT0: PUSH PP,RX\r
+ HLR RX,AC0\r
+OCT1: PUSHJ PP,EVALEX ;EVALUATE\r
+IFN FORMSW,< MOVE AC1,HWFORM>\r
+ PUSHJ PP,STOW ;STOW CODE\r
+ JUMPCM OCT1\r
+ POP PP,RX ;YES, RESTORE RADIX\r
+ POPJ PP, ;EXIT\r
+\fSIXB10: MOVSI RC,(POINT 6,AC0) ;SET UP POINTER\r
+ MOVEI AC0,0 ;CLEAR WORD\r
+\r
+SIXB20: PUSHJ PP,CHARL ;GET NEXT CHARACTER\r
+ CAMN C,SX ;IS THIS PRESET DELIMITER?\r
+IFE FORMSW,< JRST ASC60 ;YES>\r
+IFN FORMSW,<\r
+ JRST [PUSHJ PP,BYPAS1\r
+ ANDCM RC,STPX\r
+ MOVE AC1,SXFORM\r
+ JUMPGE RC,STOWZ\r
+ POPJ PP,]>\r
+ CAIL C,"A"+40\r
+ CAILE C,"Z"+40\r
+ JRST .+2\r
+ TRZA C,100 ;CONVERT LOWER CASE TO SIXBIT\r
+ SUBI C,40 ;CONVERT TO SIXBIT\r
+ JUMPL C,ASC55 ;TEST FOR INVALID CHARACTER\r
+ IDPB C,RC ;NO, DEPOSIT THE BYTE\r
+ TLNE RC,770000 ;IS THE WORD FULL?\r
+ JRST SIXB20 ;NO, GET NEXT CHARACTER\r
+IFN FORMSW,< MOVE AC1,SXFORM ;SIXBIT FORM>\r
+ PUSHJ PP,STOWZ ;YES, STORE\r
+ JRST SIXB10 ;GET NEXT WORD\r
+\fASCII0: HLLZ SDEL,AC0 ;STORE ASCII/ASCIZ FLAG\r
+ASC10: PUSHJ PP,CHARL ;GET FIRST NON-BLANK\r
+ CAIE C," "\r
+ CAIN C,HT\r
+ JRST ASC10\r
+ CAIG C,CR ;CHECK FOR CRRET AS DELIM\r
+ CAIGE C,LF\r
+ SKIPA SX,SEQNO2\r
+ JRST ERRAX\r
+ MOVEM SX,TXTSEQ ;SAVE SEQ AND PAGE\r
+ MOVE SX,PAGENO\r
+ MOVEM SX,TXTPG\r
+ SETOM INTXT\r
+ MOVE SX,C ;SAVE FOR COMPARISON\r
+ JUMPG SDEL,SIXB10 ;BRANCH IF SIXBIT\r
+\r
+ASC20: MOVSI RC,(POINT 7,AC0) ;SET UP POINTER\r
+ TLNE SDEL,200000 ;THIS BIT (AND BIT0) IN FOR COMMENT\r
+ MOVSI RC,440000 ;SO NOTHING WILL BE DEPOSITED\r
+IFE IIISW,<MOVEI AC0,0 ;CLEAR WORD>\r
+IFN IIISW,<TLNE SDEL,100000 ;ASCID?\r
+ TLZA SDEL,400000 ;YES, ZERO ASCIZ BIT\r
+ TDZA AC0,AC0 ;NO, ZERO WORD\r
+ MOVE AC0,[BYTE (7) 10,10,10,10,10 (1) 1] ;YES, A WORD FULL OF BACKSPACES>\r
+ASC30: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST\r
+ CAMN C,SX ;TEST FOR DELIMITER\r
+ JRST ASC50 ;FOUND\r
+ IDPB C,RC ;DEPOSIT BYTE\r
+ TLNE RC,760000 ;HAVE WE FINISHED WORD?\r
+ JRST ASC30 ;NO,GET NEXT CHARACTER\r
+IFN FORMSW,< MOVE AC1,ASCIIF ;USE ASCII FORM WORD>\r
+ PUSHJ PP,STOWZ ;YES, STOW IT\r
+ JRST ASC20 ;GET NEXT WORD\r
+\r
+ASC55: TDZA CS,CS ;ZERO CS IN CASE NESTED\r
+ASC50: TDZA RC,SDEL ;TEST FOR ASCIIZ\r
+ TROA ER,ERRA ;SIXBIT ERROR EXIT\r
+ASC60: PUSHJ PP,BYPAS1 ;POLISH OFF TERMINATOR\r
+ SETZM INTXT ;WE ARE OUT OF IT\r
+IFN FORMSW,< MOVE AC1,ASCIIF ;USE ASCII FORM WORD>\r
+IFN IIISW,<TLNN SDEL,100000 ;NO EXTRA WORDS FOR ASCID>\r
+ ANDCM RC,STPX ;STORE AT LEAST ONE WORD\r
+ TLNN SDEL,200000 ;GET OUT WITHOUT STORING\r
+ JUMPGE RC,STOWZ ;STOW\r
+ POPJ PP, ;ASCII, NO BYTES STORED, SO EXIT\r
+\fPOINT0:\r
+IFN FORMSW,< PUSH PP,BPFORM ;USE BYTE POINTER FORM WORD>\r
+ PUSH PP,RC ;STACK REGISTERS\r
+ PUSH PP,AC0\r
+ PUSHJ PP,EVAL10 ;EVALUATE RADIX 10\r
+ DPB AC0,[POINT 6,0(PP),11] ;STORE BYTE SIZE\r
+ JUMPNC POINT2\r
+ PUSHJ PP,EVALEX ;NO, GET ADDRESS\r
+ PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS\r
+ JUMPNC POINT2\r
+ PUSHJ PP,EVAL10 ;EVALUATE RADIX 10\r
+ TLNE IO,NUMSW ;IF NUMERIC\r
+ TDCA AC0,[-1] ;POSITION=D35-RHB\r
+POINT2: MOVEI AC0,0 ;OTHERWISE SET TO D36\r
+ ADDI AC0,^D36\r
+ LSH AC0,^D30\r
+ ADDM AC0,0(PP) ;UPDATE VALUE\r
+ JRST OP3\r
+\fXWD0:\r
+IFN FORMSW,< PUSH PP,HWFORM ;USE HALF WORD FORM>\r
+ PUSH PP,RC\r
+ PUSH PP,AC0 ;STORE ZERO ON STACK\r
+ PUSHJ PP,EVALEX ;EVALUATE EXPRESSION\r
+ JUMPNC OP2\r
+XWD5: SKIPN (PP) ;ANY CODE YET?\r
+ JRST XWD10 ;NO,USE VALUE IN AC0\r
+ JUMPE AC0,.+2 ;ANYTHING IN AC0?\r
+ TRO ER,ERRQ ;YES,FLAG "Q"ERROR\r
+ MOVE AC0,(PP) ;USE PREVIOUS VALUE\r
+ MOVE RC,-1(PP) ;AND RELOCATION\r
+XWD10: HRLZM AC0,0(PP) ;SET LEFT HALF\r
+ HRLZM RC,-1(PP)\r
+ MOVSS EXTPNT ;WFW\r
+ JRST OP1A ;EXIT THROUGH OP\r
+\r
+IOWD0: PUSHJ PP,EVALXQ ;EVALUATE AND TEST FOR EXTERNAL\r
+ CAIE C,14 ;","?\r
+ JRST [SKIPN AC0 ;IF NZERO AND NO "," SEEN\r
+ TRO ER,ERRQ ;TREAT AS Q ERROR\r
+IFN FORMSW,< MOVE AC1,HWFORM ;USE HALF WORD FORM>\r
+ SOJA AC0,STOW] ;NO, TREAT AS RIGHT HALF\r
+ PUSH PP,AC0 ;YES, STACK LEFT HALF\r
+ PUSHJ PP,EVALEX ;WFW\r
+ SUBI AC0,1\r
+ POP PP,AC1 ;RETRIEVE LEFT HALF\r
+ MOVNS AC1\r
+ HRL AC0,AC1\r
+IFN FORMSW,< MOVE AC1,HWFORM ;USE HALF WORD FORM>\r
+ JRST STOW ;STOW CODE AND EXIT\r
+\fBYTE0: PUSHJ PP,BYPASS ;GET FIRST NON-BLANK\r
+ CAIE C,10 ;"("?\r
+ JRST ERRAX ;NO, FLAG ERROR AND EXIT\r
+IFN FORMSW,<\r
+ PUSH PP,[1]\r
+ MOVEI AC0,0\r
+>\r
+ PUSH PP,RC\r
+ PUSH PP,AC0 ;INITIALIZE STACK TO ZERO\r
+ MOVSI ARG,(POINT -1,(PP))\r
+\r
+BYTE1: PUSH PP,ARG\r
+ PUSHJ PP,EVAL10 ;EVALUATE RADIX 10\r
+ POP PP,ARG\r
+ CAIG AC0,^D36 ;TEST SIZE\r
+ JUMPGE AC0,.+2\r
+ TRO ER,ERRA\r
+ DPB AC0,[POINT 6,ARG,11] ;STORE BYTE SIZE\r
+\r
+BYTE2: IBP ARG ;INCREMENT BYTE\r
+ TRZN ARG,-1 ;OVERFLOW?\r
+ JRST BYTE3 ;NO\r
+ SETZB AC0,RC ;YES\r
+ EXCH AC0,0(PP) ;GET CURRENT VALUES\r
+ EXCH RC,-1(PP) ;AND STACK ZEROS\r
+IFN FORMSW,<\r
+ MOVE AC1,HWFORM ;USE STANDARD FORM\r
+ EXCH AC1,-2(PP) ;GET FORM WORD\r
+>\r
+ PUSHJ PP,STOW ;STOW FULL WORD\r
+\r
+BYTE3: PUSH PP,ARG\r
+ PUSHJ PP,EVALEX ;COMPUTE NEXT BYTE\r
+ POP PP,ARG\r
+ DPB AC0,ARG ;STORE BYTE\r
+ HLLO AC0,ARG\r
+ DPB RC,AC0 ;STORE RELOCATION\r
+\r
+IFN FORMSW,<\r
+ MOVEI AC0,1\r
+ HRRI ARG,-2\r
+ DPB AC0,ARG ;STORE FORM BYTE\r
+ HRRI ARG,0\r
+>\r
+ JUMPCM BYTE2\r
+ CAIN C,10 ;"("?\r
+ JRST BYTE1 ;YES, GET NEW BYTE SIZE\r
+ JRST OP3 ;NO, EXIT\r
+\fRADX50: PUSHJ PP,EVALEX ;EVALUATE CODE\r
+ JUMPN RC,ERRAX ;ERROR IF NOT ABSOLUTE\r
+ MOVE ARG,AC0\r
+ JUMPNC ERRAX\r
+ PUSHJ PP,GETSYM ;YES, GET SYMBOL\r
+ TRZ ER,ERRA ;CLEAR ERROR\r
+ PUSHJ PP,SQOZE ;SQUOZE SIXBIT AND ADD CODE\r
+IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>\r
+ JRST STOW ;STOW CODE AND EXIT\r
+\r
+\r
+SQOZE: MOVE AC1+1,AC0 ;PUT SIXBIT IN AC1+1\r
+ MOVEI AC0,0 ;CLEAR RESULT\r
+SQOZ1: MOVEI AC1,0\r
+ LSHC AC1,6 ;PUT 6-BIT CHARACTER IN AC1\r
+ LDB AC1,[POINT 6,CSTAT(AC1),23] ;CONVERT TO RADIX50\r
+ IMULI AC0,50 ;MULTIPLY PREVIOUS RESULT\r
+ ADD AC0,AC1 ;ADD NEW CHARACTER\r
+ JUMPN AC1+1,SQOZ1 ;TEST FOR END\r
+ LSH ARG,^D30 ;LEFT-JUSTIFY CODE\r
+ IOR AC0,ARG ;MERGE WITH RESULT\r
+ POPJ PP,\r
+\fREPEAT 0,< EXPLANATION OF ARRAY AND LVAR FEATURES\r
+\r
+WHEN A VARIABLE IS SEEN EITHER BY #, INTEGER OR ARRAY\r
+THE VALUE PORTION OF THE SYMBOL TABLE ENTRY (RH OF 2ND WORD)\r
+IS USE TO HOLD THE DESIRED SIZE-1. THE CORRECT VALUE IS\r
+ASSIGNED BY THE VAR PSEUDO OP.\r
+\r
+WHEN LVAR IS SEEN, A SEARCH OF THE SYMBOL TABLE IS MADE\r
+FOR ALL VARIABLES. THE VARF (VARIABLE) FLAG IS\r
+LEFT ON AND EXTF AND PNTF ARE TURNED ON SO THAT THE\r
+VARIABLE LOOKS LIKE AN EXTERNAL. THE POINTER\r
+(RH OF 2ND WORD OF THE SYMBOL TABLE ENTRY) POINTS\r
+TO THE HEADER BLOCK. THE HEADER BLOCK IS FORMATTED AS FOLLOWS:\r
+WORD 1: LEFT HALF IS A POINTER TO SYMBOL TABLE FIXUP BLOCKS\r
+ RIGHT HALF IS A POINTER TO CODE FIXUP BLOCKS\r
+WORD 2: 0 THIS IS USED TO DISTINGUISH IT FROM NORMAL EXTERNALS\r
+ WHICH HAVE THE SYMBOL NAME HERE\r
+WORD 3: THE LOCATION RELATIVE TO THE START OF THE LOW CORE\r
+ VARIABLES\r
+\r
+CORE FIXUP BLOCKS ARE SET UP BY BOUT\r
+\r
+WORD1: RH LINK TO NEXT CORE FIXUP BLOCK 0 IF END OF CHAIN\r
+ LH OFFSET. NUMBER TO BE ADDED TO SYMBOL VALUE BEFORE\r
+ FIXUP IS DONE\r
+WORD 2: POINTER TO A FIXUP CHAIN FOR RIGHT HALVES\r
+ LEFT HALF IS RELOCATION RH IS ADDRESS\r
+WORD 3: SAME AS WORD 2 BUT FOR LEFT HALF FIXUPS\r
+\r
+NOTE ALL THESE FIXUPS ARE CHAINED EVEN IF IN LEFT HALF.\r
+SIMILARY ALL REFERENCES TO SAY A+1 ARE CHAINED\r
+\r
+SYMBOL TABLE FIXUP BLOCKS. THESE ARE GENERATED BY SOUT\r
+AS THE SYMBOL TABLE IS PUT OUT. THESE FIXUPS ARE ADDITIVE\r
+NOT CHAINED.\r
+\r
+WORD 1: RH LINK TO NEXT BLOCK\r
+ LH 0\r
+WORD 2: RADIX50 FOR THE SYMBOL\r
+WORD 3: 200000,,0 IF RH FIXUP\r
+ 600000,,0 IF LH FIXUP\r
+\r
+SOUT ALSO SETS UP FIXLNK. FIXLNK POINTS TO THE CHAIN OF\r
+ALL LVAR FIXUPS TO BE DONE. IT POINTS TO THE SECOND WORD\r
+\fOF A 2 WORD BLOCK\r
+\r
+WORD 1: LINK TO 2ND WORD OF NEXT BLOCK 0 IF END\r
+WORD 2: RH POINTER TO A HEADER BLOCK\r
+ LH GARBAGE\r
+\r
+FIXUPS ARE BLOCK TYPE 13 AS FOLLOWS\r
+WORD 1: THE PROGRAM BREAK (AS BLOCK TYPE 5)\r
+WORD 2: THE NUMBER OF LOCATION USED FOR VARIABLES IN THE\r
+ LOW SEGMENT+1\r
+\r
+REMAINING WORDS COME IN PAIRS AS FOLLOWS:\r
+1ST WORD BIT 0=0 RH FIXUP\r
+ BIT 0=1 LH FIXUP\r
+ BIT 1=0 CORE FIXUP\r
+ WORD 2 LH POINTER TO CHAIN\r
+ WORD 2 RH VALUE\r
+ BIT 1=1 SYMBOL FIXUP\r
+ WORD 1 RH VALUE\r
+ WORD 2 SYMBOL\r
+>\r
+\r
+REPEAT 0,< EXPLANATION OF ICC FEATURES\r
+\r
+ IF FORMSW IS SET NON ZERO THE FORM OF THE OCTAL LISTING OUTPUT\r
+ IS CHANGED FROM STANDARD HALF WORD FORM TO THE FOLLOWING:-\r
+\r
+ IF INSTRUCTION BYTE 9,4,1,4,18\r
+ IF I/O INSTRUCTION BYTE 3,7,3,1,4,18\r
+ IF BYTE POINTER BYTE 6,6,2,4,18\r
+ IF ASCII BYTE 7,7,7,7,7\r
+ IF SIXBIT BYTE 6,6,6,6,6,6\r
+\r
+ ALL OTHERS ARE STANDARD HALF WORD\r
+\r
+ THIS FEATURE CAN BE OVER RIDDEN BY USE OF /H SWITCH\r
+ STANDARD HALF WORD FORM IS THEN USED.\r
+ HOWEVER BECAUSE OF EXTRA SPACING THE OUTPUT IS PUSHED MORE\r
+ TO THE RIGHT AND LONG COMMENTS OVERFLOW THE LINE\r
+ >\r
+\fIFN WFWSW,<\r
+%INTEG: PUSHJ PP,GETSYM ;GET A SYMBOL\r
+ JRST INTG2 ;BAD SYMBOL ERROR\r
+ TLO IO,DEFCRS ;THIS IS A DEFINTION\r
+ PUSHJ PP,SSRCH ;SEE IF THERE\r
+ MOVSI ARG,SYMF!UNDF ;SET SYMBOL AND UNDEFINED IF NOT\r
+ TLNN ARG,UNDF ;IF ALREADY DEFINED\r
+ JRST INTG1 ;JUST IGNORE\r
+ TLOA ARG,VARF ;SET VARIABLE FLAG\r
+INTG2: TROA ER,ERRA ;SYMBOL ERROR\r
+ PUSHJ PP,INSERZ ;PUT IN WITH ZERO VALUE (LENGTH OF 1)\r
+INTG1: JUMPCM %INTEG\r
+ POPJ PP,\r
+\r
+%ARAY: MOVEM PP,ARAYP ;SAVE PUSHDOW POINTER\r
+ARAY2: PUSHJ PP,GETSYM\r
+ JRST ARAY1 ;BAD SYMBOL GIVE ERROR AND ABORT\r
+ PUSH PP,AC0 ;SAVE NAME\r
+ JUMPCM ARAY2 ;AND GO ON IF A COMMA\r
+ CAIE C,"["-40 ;MUST BE A [\r
+ JRST ARAY1\r
+ PUSHJ PP,BYPASS ;OH, WELL\r
+ TLO IO,IORPTC\r
+ PUSHJ PP,EVALXQ ;GET A SIZE\r
+ CAIE C,"]"-40 ;MUST END RIGHT\r
+ JRST ARAY1\r
+ PUSHJ PP,BYPASS ;??\r
+ HRRZ V,AC0 ;GET VALUE\r
+ SUBI V,1\r
+NXTVAL: POP PP,AC0\r
+ PUSH PP,V ;SAVE OVER SEARCH\r
+ TLO IO,DEFCRS\r
+ PUSHJ PP,SSRCH ;FIND IT\r
+ MOVSI ARG,SYMF!UNDF\r
+ POP PP,V ;GET VALUE BACK\r
+ TLNN ARG,UNDF\r
+ JRST ARAY3\r
+ TLO ARG,VARF\r
+ MOVEI RC,0 ;NO RELOC\r
+ PUSHJ PP,INSERT\r
+ARAY3: CAME PP,ARAYP\r
+ JRST NXTVAL ;STILL NAMES STACKED\r
+ JUMPCM ARAY2\r
+ POPJ PP,\r
+\r
+ARAY1: TRO ER,ERRA ;ERROR EXIT\r
+ MOVE PP,ARAYP\r
+ POPJ PP, ;RESET PDL AND GO\r
+>\r
+\fIFN WFWSW,<\r
+%LVAR: JUMP2 POPOUT ;IGNORE ON PASS2\r
+ PUSHJ PP,LOOKUP ;SCAN SYMBOL TABLE\r
+ TRNN ARG,EXTF ;THESE ARE LVARS WE HAVE DONE ONCE\r
+ TRNN ARG,VARF ;FOR VARIABLES\r
+ POPJ PP, ;IGNORE ALL OTHERS\r
+ TRZ ARG,UNDF ;SET AS DEFINED\r
+ MOVEI RC,3\r
+ ADDB RC,FREE\r
+ CAML RC,SYMBOL ;GET BLOCK\r
+ PUSHJ PP,XCEEDS\r
+ SUBI RC,2 ;POINT TO START OF BLOCK\r
+ ADDI V,1\r
+ EXCH V,LVARLC ;GET CORRECT VARIABLE LOCATION\r
+ MOVEM V,2(RC) ;SAVE IT\r
+ ADDM V,LVARLC ;AND UPDATE BASE\r
+ SETZM (RC)\r
+ SETZM 1(RC) ;NO NAME TO IDENT AN LVAR AND NO FIXUPS\r
+ HRL ARG,RC ;POINTER\r
+ TRO ARG,EXTF!PNTF ;FLAG AS EXTERNAL AND POINTER\r
+ MOVSM ARG,(SX) ;PUT IT AWAY\r
+ POPJ PP,\r
+>\r
+\f; PSEUDO-END STATEMENT FOR MULTI-FILE CAPABILITY\r
+\r
+; HERE IF PRGEND (PASS 1)\r
+PSEND0: TLO IO,MFLSW ;PSEND SEEN\r
+ PUSHJ PP,END0 ;AS IF END STATEMENT\r
+ HLLZS IO ;CLEAR ER(RH)\r
+ SETZM ERRCNT ;CLEAR ERROR COUNT FOR EACH PROG.\r
+ JUMP2 PSEND2 ;DIFFERENT ON PASS2\r
+ SKIPE UNIVSN ;SEEN A UNIVERSAL\r
+ PUSHJ PP,UNISYM ;YES, STORE SYMBOLS\r
+ PUSHJ PP,PSEND4 ;SAVE SYMBOLS, POINTERS AND TITLE\r
+ TLZ IO,IOTLSN ;CLEAR TITLE SEEN FLAG\r
+PSEND1: TLZ IO,MFLSW ;FOR NEXT FILE\r
+ SETZM UNISCH ;CLEAR UNIVERSAL SEARCH TABLE\r
+ MOVE AC0,[UNISCH,,UNISCH+1]\r
+ BLT AC0,UNISCH+.UNIV-1\r
+ PUSHJ PP,OUTFF ;RESET PAGE COUNT\r
+ MOVSI AC0,1 ;SET SO RELOC 0 WORKS\r
+ JRST LOC10 ;FOR RELOC 0\r
+\r
+; HERE IF PRGEND (PASS 2)\r
+PSEND2: SETZM SBUF ;SO SUBTTL IS NOT WRONG\r
+ PUSHJ PP,PSEND5 ;PUT TITLE BACK\r
+ PUSHJ PP,PSEND1 ;COMMON CODE\r
+ JRST PASS20 ;OUTPUT THE ENTRIES\r
+\r
+; HERE IF END (PASS 1)\r
+PSEND3: PUSHJ PP,PSEND4 ;SAVE LAST PROGRAM \r
+ HLRS PRGPTR ;REINITIALIZE POINTER\r
+ PUSHJ PP,PSEND5 ;READ BACK FIRST PROGRAM\r
+ JRST PASS20\r
+\f;HERE TO SAVE AND RESTORE SYMBOL TABLE, TITLE AND OTHER USEFUL LOCATIONS\r
+ XTRA==4 ;NUMBER OF OTHER LOCATIONS TO SAVE\r
+\r
+PSEND4: MOVE V,FREE ;GET NEXT FREE LOCATION\r
+ ADDI V,LENGTH+.TBUF/5+XTRA\r
+ CAML V,SYMBOL ;WILL WORST CASE FIT?\r
+ PUSHJ PP,XCEED ;NO, EXPAND\r
+ MOVS V,FREE\r
+ HRR V,PRGPTR ;LAST PRGEND BLOCK\r
+ HLRM V,(V) ;LINK THIS BLOCK\r
+ SKIPN PRGPTR ;IF FIRST TIME\r
+ HLLZM V,PRGPTR ;SET LINK TO START OF CHAIN\r
+ HLRM V,PRGPTR ;POINTER TO IT\r
+ SETZM @FREE ;CLEAR LINK WORD\r
+ AOS FREE ;THIS LOCATION USED NOW\r
+ MOVS AC0,SYMBOL ;BOTTOM OF SYMBOL TABLE\r
+ HRR AC0,FREE ;FREE SPACE\r
+ MOVE V,@SYMBOL ;GET NUMBER OF SYMBOLS\r
+ ASH V,1 ;TWO WORDS PER SYMBOL\r
+ ADDI V,1 ;ONE MORE FOR COUNT\r
+ ADDB V,FREE ;END OF TABLE WHEN MOVED\r
+ BLT AC0,(V) ;MOVE TABLE\r
+ HRRZ AC0,JOBREL ;TOP OF CORE\r
+ SUBI AC0,1\r
+ MOVEM AC0,SYMTOP ;FOR NEXT SYMBOL TABLE\r
+ SUBI AC0,LENGTH ;LENGTH OF INITIAL SYMBOLS\r
+ MOVEM AC0,SYMBOL ;SET POINTER TO COUNT OF SYMBOLS\r
+ HRLI AC0,SYMNUM ;BLT POINTER\r
+ BLT AC0,@SYMTOP ;SET UP INITIAL SYMBOL TABLE\r
+ PUSHJ PP,SRCHI ;SET UP SEARCH POINTER\r
+ MOVEI AC0,.TBUF ;MAX NUMBER OF CHARS. IN TITLE\r
+ SUB AC0,TCNT ;ACTUAL NUMBER\r
+ IDIVI AC0,5 ;NUMBER OF WORDS\r
+ SKIPE AC1 ;REMAINDER?\r
+ ADDI AC0,1 ;YES\r
+ MOVEM AC0,@FREE ;STORE COUNT\r
+ AOS FREE ;THIS LOCATION USED NOW\r
+ EXCH AC0,FREE ;SET UP AC0 FOR BLT\r
+ ADDM AC0,FREE ;WILL BE AFTER TITLE MOVES\r
+ HRLI AC0,TBUF ;BLT POINTER\r
+ BLT AC0,@FREE ;MOVE TITLE\r
+ MOVE AC2,LITHDX ;POINTER TO LIT INFO.\r
+ MOVE AC0,-1(AC2) ;SIZE OF PASS1 LOCO\r
+ PUSHJ PP,STORIT ;SAVE IT IN SYMBOL TABLE\r
+ MOVE AC2,VARHDX ;SAME FOR VARS\r
+ MOVE AC0,-1(AC2)\r
+ PUSHJ PP,STORIT\r
+IFN RENTSW,<\r
+ MOVE AC0,HISNSW ;GET TWOSEG/HISEG FLAG\r
+ HRR AC0,HIGH1 ;AND PASS1 BREAK\r
+ PUSHJ PP,STORIT\r
+ JUMPGE AC0,PSEND6 ;NOT TWOSEG\r
+ MOVE AC0,SVTYP3 ;HIGH SEGMENT OFFSET\r
+ PUSHJ PP,STORIT ;SAVE IT ALSO>\r
+PSEND6: MOVE AC0,FREE ;GET NEXT FREE LOCATION\r
+ SUBI AC0,1 ;LAST ONE USED\r
+ HRRZ V,PRGPTR ;POINTER TO START OF DATA BLOCK\r
+ HRLM AC0,(V) ;LINK TO END OF BLOCK\r
+ POPJ PP, ;RETURN\r
+\r
+\fPSENDX: PUSHJ PP,XCEED ;NEED TO EXPAND CORE FIRST\r
+PSEND5: HRRZ AC0,JOBREL ;GET TOP OF CORE\r
+ SUBI AC0,1\r
+ MOVEM AC0,SYMTOP ;TOP OF NEW SYMBOL TABLE\r
+ HRRZ V,PRGPTR ;ADDRESS OF THIS BLOCK\r
+ JUMPE V,PSNDER ;ERROR LINK NOT SET UP\r
+ MOVE AC1,(V) ;NEXT LINK\r
+ MOVE V,1(V) ;GET ITS SYMBOL COUNT\r
+ ASH V,1 ;NUMBER OF WORDS\r
+ ADDI V,1 ;PLUS ONE FOR COUNT\r
+ SUBI AC0,(V) ;START OF NEW SYMBOL TABLE\r
+ CAMG AC0,FREE ;WILL IT FIT\r
+ JRST PSENDX ;NO, NEED TO EXPAND AND RESET AC0\r
+ ADD V,PRGPTR ;POINT TO END OF SYMBOL TABLE\r
+ MOVEI V,1(V) ;THEN TO BEG OF TITLE\r
+ MOVEM AC0,SYMBOL ;BOTTOM OF NEW TABLE\r
+ HRL AC0,PRGPTR ;ADDRESS OF FIRST WORD OF BLOCK\r
+ ADD AC0,[1,,0] ;MAKE BLT POINTER\r
+ HRRM AC1,PRGPTR ;POINT TO NEXT BLOCK\r
+ BLT AC0,@SYMTOP ;MOVE TABLE\r
+ PUSHJ PP,SRCHI ;SET UP POINTER\r
+ MOVE AC1,(V) ;NUMBER OF WORDS OF TITLE\r
+ MOVEI AC0,1(V) ;START OF STORED TITLE\r
+ ADD V,AC1 ;INCREMENT PAST TITLE\r
+ ADDI AC1,TBUF-1 ;END OF TITLE\r
+ HRLI AC0,TBUF ;WHERE TO PUT IT\r
+ MOVSS AC0 ;BLT POINTER\r
+ BLT AC0,(AC1) ;MOVE TITLE\r
+ TLO IO,IOTLSN ;SET AS IF TITLE SEEN\r
+ MOVE AC2,LITHDX ;INVERSE OF ABOVE\r
+ PUSHJ PP,GETIT\r
+ MOVEM AC0,-1(AC2)\r
+ MOVE AC2,VARHDX ;SAME FOR VARS\r
+ PUSHJ PP,GETIT\r
+ MOVEM AC0,-1(AC2)\r
+IFN RENTSW,<\r
+ PUSHJ PP,GETIT ;GET TWO HALF WORDS\r
+ HRRZM AC0,HIGH1 ;PASS1 BREAK\r
+ HLLEM AC0,HISNSW ;TWOSEG/HISEG FLAG\r
+ JUMPGE AC0,CPOPJ ;NOT TWOSEG\r
+ PUSHJ PP,GETIT\r
+ MOVEM AC0,SVTYP3 ;BLOCK 3 WORD>\r
+ POPJ PP,\r
+\r
+STORIT: MOVEM AC0,@FREE ;STORE IT IN DATA BLOCK\r
+ AOS FREE ;ADVANCE POINTER\r
+ POPJ PP,\r
+\r
+GETIT: MOVE AC0,1(V) ;FILL AC0 OUT OF PRGEND BLOCK\r
+ AOJA V,CPOPJ ;INCREMENT AND RETURN\r
+\r
+PSNDER: HRROI RC,[SIXBIT /PRGEND ERROR @/]\r
+ JRST ERRFIN\r
+\f;MULTIPLE SYMBOL TABLE FEATURE PSEUDO-OPS\r
+\r
+UNIV0: JUMP2 TITLE0 ;DO IT ALL ON PASS 1\r
+ HRRZ SX,UNIVNO ;GET NUMBER OF UNIVERSALS SEEN\r
+ CAIL SX,.UNIV ;ALLOW ONE MORE?\r
+ JRST UNVERR ;NO, GIVE FATAL ERROR\r
+ AOS UNIVNO ;ONE MORE NOW\r
+ SETOM UNIVSN ;AND SET SEEN A UNIVERSAL\r
+ JRST TITLE0 ;CONTINUE AS IF TITLE\r
+\r
+\r
+ADDUNV: PUSH PP,RC ;AN AC TO USE\r
+ PUSHJ PP,NOUT ;CONVERT TO SIXBIT\r
+ HRRZ RC,UNIVNO ;GET ENTRY INDEX\r
+ MOVEM AC0,UNITBL(RC) ;STORE SIXBIT NAME IN TABLE\r
+ HRRZS UNIVSN ;ONLY DO IT ONCE\r
+ POP PP,RC ;RESTORE RC\r
+ POPJ PP, ;AND RETURN\r
+\r
+UNVERR: HRROI RC,[SIXBIT /TOO MANY UNIVERSALS@/]\r
+ JRST ERRFIN\r
+\r
+UNISYM: HRRZ AC0,FREE ;GET HIGHEST FREE LOCATION\r
+ MOVEM AC0,JOBFF ;INTO JOBFF\r
+ PUSHJ PP,SUPRSA ;TURN ON SUPPRESS BIT\r
+ PUSH PP,SYMBOL ;NEED TO SAVE INCASE PRGEND\r
+ MOVE AC0,SYMTOP ;TOP OF TABLE\r
+ SUB AC0,SYMBOL ;GET LENGTH OF TABLE\r
+ HRL ARG,SYMBOL ;BOTTOM OF TABLE\r
+ HRR ARG,JOBFF ;WHERE TO GO\r
+ HRRZ RC,UNIVNO ;GET TABLE INDEX\r
+ HRRM ARG,SYMBOL ;WILL BE THERE SOON\r
+ HRRZM ARG,UNIPTR(RC) ;STORE IN CORRESPONDING PLACE\r
+ ADDB AC0,JOBFF ;WHERE TO END\r
+ HRLM AC0,UNIPTR(RC) ;SAVE NEW SYMTOP\r
+ BLT ARG,@JOBFF ;MOVE TABLE\r
+ HRRZM AC0,UNITOP ;SAVE TOP OF TABLES+1\r
+ CAMLE AC0,MACSIZ ;IN CASE OVER A K BOUND\r
+ MOVEM AC0,MACSIZ ;DON'T REDUCE SO FAR NOW\r
+ MOVEM AC0,FREE ;JUST IN CASE IN MACRO\r
+ MOVE AC0,SRCHX ;SAVE OLD SEARCH POINTER\r
+ PUSHJ PP,SRCHI ;GET SEARCH POINTER\r
+ EXCH AC0,SRCHX\r
+ MOVEM AC0,UNISHX(RC) ;SAVE IT\r
+ SETZM UNIVSN ;CLEAR FLAG INCASE PRGEND\r
+ POP PP,SYMBOL ;RESTORE OLD VALUE\r
+ POPJ PP, ;RETURN\r
+\r
+\fSERCH0: PUSHJ PP,GETSYM ;GET A SYMBOL\r
+ JRST ERRAX ;ERROR IF NOT VALID\r
+ MOVEI RC,1 ;START AT ENTRY ONE\r
+ CAIL RC,.UNIV ;CHECK FOR CONSISTENCY ERROR\r
+ JRST SCHERR ;CANNOT FIND THIS ONE\r
+ CAME AC0,UNITBL(RC) ;LOOK FOR MATCH\r
+ AOJA RC,.-3 ;NOT FOUND YET\r
+ MOVE AC0,RC ;STORE TABLE ENTRY NUMBER\r
+ MOVEI RC,1 ;START AT ENTRY ONE\r
+ CAIL RC,.UNIV ;CHECK FOR CONSISTENCY ERROR\r
+ JRST SCHERR ;SHOULD NEVER HAPPEN!!\r
+ SKIPE UNISCH(RC) ;LOOK FOR AN EMPTY SLOT\r
+ AOJA RC,.-3 ;NOT FOUND YET\r
+ MOVEM AC0,UNISCH(RC) ;STORE INDEX IN TABLE\r
+ JUMPCM SERCH0 ;LOOK FOR MORE NAMES\r
+ POPJ PP, ;FINISHED\r
+\r
+SCHERR: MOVSI RC,[SIXBIT /CANNOT FIND UNIVERSAL@/]\r
+ JRST ERRFIN ;NAME IN AC0\r
+\r
+;MESSAGE FOR CASE WHERE FILES AFTER UNIVERSAL USED MORE BUFFER SPACE THAN FIRST UNIVERSAL\r
+UNIERR: HRROI RC,[SIXBIT /UNIVERSAL PROGRAM(S) MUST HAVE SAME OUTPUT SPECIFICATION AS OTHER FILES@/]\r
+ JRST ERRFIN\r
+\fSUBTTL MACRO/REPEAT HANDLERS\r
+\r
+REPEA0: PUSHJ PP,EVALXQ ;EVALUATE REPEAT EXP, EXTERNS ARE ILL.\r
+ JUMPNC ERRAX\r
+\r
+REPEA1: JUMPLE AC0,REPZ ;PASS THE EXP., DONT PROCESS\r
+ SOJE AC0,REPO ;REPEAT ONCE\r
+REPEA2: PUSHJ PP,GCHARQ ;GET STARTING "<"\r
+ CAIE C,"<"\r
+ JRST REPEA2\r
+ PUSHJ PP,SKELI1 ;INITIALIZE SKELETON\r
+ PUSH MP,REPEXP\r
+ MOVEM AC0,REPEXP\r
+ PUSH MP,REPPNT ;STACK PREVIOUS REPEAT POINTER\r
+ MOVEM ARG,REPPNT ;STORE NEW POINTER\r
+ TDZA SDEL,SDEL ;YES, INITIALIZE BRACKET COUNT AND SKIP\r
+\r
+REPEA4: PUSHJ PP,WCHARQ ;WRITE A CHARACTER\r
+ PUSHJ PP,GCHARQ ;GET A CHARACTER\r
+ CAIN C,"<" ;"<"?\r
+ AOJA SDEL,REPEA4 ;YES, INCREMENT AND WRITE\r
+ CAIE C,">" ;">"?\r
+ JRST REPEA4 ;NO, WRITE THE CHARACTER\r
+ SOJGE SDEL,REPEA4 ;YES, WRITE IF NON-NEGATIVE COUNT\r
+ MOVSI CS,(BYTE (7) 177,3) ;SET "REPEAT" END\r
+ PUSHJ PP,WWRXE ;WRITE END\r
+ SKIPN LITLVL ;LITERAL MIGHT END ON LINE\r
+ SKIPE MACLVL ;IF IN MACRO DARE NOT PROCESS\r
+ JRST .+3 ;REST OF LINE SINCE MACRO MIGHT END ON IT\r
+ PUSHJ PP,BYPASS ;BYPASS\r
+ PUSHJ PP,STOUTS ;POLISH OF LINE BEFORE PROCESSING REPEAT\r
+ PUSH MP,MRP ;STACK PREVIOUS READ POINTER\r
+ PUSH MP,RCOUNT ;SAVE WORD COUNT\r
+ HRRZ MRP,REPPNT ;SET UP READ POINTER\r
+ SKIPN MACLVL ;IF IN MACRO GIVE CR-LF FIRST\r
+ SKIPE LITLVL ;SAME FOR LITERAL\r
+ JRST REPEA7\r
+ AOJA MRP,POPOUT ;BYPASS ARG COUNT\r
+\r
+REPEA7: HRRZ MRP,REPPNT ;SET UP READ POINTER\r
+ ADDI MRP,1 ;BYPASS ARG COUNT\r
+REPEA8: MOVEI C,CR\r
+ JRST RSW1\r
+\r
+REPEND: SOSL REPEXP\r
+ JRST REPEA7\r
+ HRRZ V,REPPNT ;GET START OF TREE\r
+ PUSHJ PP,REFDEC ;DECREMENT REFERENCE\r
+ POP MP,RCOUNT\r
+ POP MP,MRP\r
+ POP MP,REPPNT\r
+ POP MP,REPEXP\r
+ SKIPN LITLVL ;IF IN LITERAL OR\r
+ SKIPE MACLVL ;IF IN MACRO\r
+ JRST RSW0 ;FINISH OF LINE NOW\r
+ JRST REPEA8\r
+\r
+\fREPZ: MOVE SDEL,SEQNO2 ;SAVE IN CASE OF END OF FILE\r
+ MOVEM SDEL,REPSEQ\r
+ MOVE SDEL,PAGENO\r
+ MOVEM SDEL,REPPG\r
+ SETOM INREP\r
+ MOVEI SDEL,0 ;SET COUNT\r
+REPZ1: PUSHJ PP,GCHAR ;GET NEXT CHARACTER\r
+ CAIN C,"<" ;"<"?\r
+ AOJA SDEL,REPZ1 ;YES, INCREMENT COUNT\r
+ CAIN C,">" ;">"?\r
+ SOJLE SDEL,REPZ2 ;YES, EXIT IF MATCHING\r
+ JRST REPZ1 ;NO, RECYCLE\r
+REPZ2: SETZM INREP ;FLAG OUT OF IT\r
+ SETZM INCND ;AND CONDITIONAL ALSO\r
+ JRST STMNT ;AND EXIT\r
+\r
+REPO: PUSHJ PP,GCHAR ;GET "<"\r
+ CAIE C,"<"\r
+ JRST REPO\r
+ SKIPE RPOLVL ;ARE WE NESTED?\r
+ AOS RPOLVL ;YES, DECREMENT CURRENT\r
+ PUSH MP,RPOLVL\r
+ SETOM RPOLVL\r
+ JRST STMNT\r
+\r
+REPO1: CAIN C,"<"\r
+ SOS RPOLVL\r
+ CAIN C,">"\r
+ AOSE RPOLVL\r
+ JRST RSW2\r
+ POP MP,RPOLVL\r
+ PUSHJ PP,RSW2\r
+ JRST RSW0\r
+\fDEFIN0: PUSHJ PP,GETSYM ;GET MACRO NAME\r
+ JRST ERRAX ;EXIT ON ERROR\r
+ MOVEM PP,PPTMP1 ;SAVE POINTER\r
+ MOVEM AC0,PPTMP2 ;SAVE NAME\r
+ TLO IO,IORPTC\r
+ MOVE SX,SEQNO2 ;SAVE IN CASE OF EOF\r
+ MOVEM SX,DEFSEQ\r
+ MOVE SX,PAGENO\r
+ MOVEM SX,DEFPG\r
+ SETOM INDEF ;AND FLAG IN DEFINE\r
+ SYN .TEMP,COMSW ;SAVE SPACE\r
+ SETZB SX,COMSW ;SET ARGUMENT AND REFERENCE COUNT AND COMMENT SWITCH\r
+DEF02: PUSHJ PP,GCHAR ;SEARCH FOR "(" OR "<"\r
+ CAIG C,FF ;SEARCH FOR END OF LINE\r
+ CAIGE C,LF ;LF,VT, OR FF\r
+ JRST .+2 ;WASN'T ANY OF THEM\r
+ SETZM COMSW ;RESET COMMENT SWITCH\r
+ CAIN C,";" ;COMMENT?\r
+ SETOM COMSW ;YES, SET COMMENT SWITCH\r
+ SKIPE COMSW ;INSIDE A COMMENT?\r
+ JRST DEF02 ;YES, IGNORE CHARACTER\r
+ CAIN C,"<" ;"<"?\r
+ JRST DEF20 ;YES\r
+ CAIE C,"(" ;"("?\r
+ JRST DEF02 ;NO\r
+DEF10: PUSHJ PP,GETSYM ;YES, GET DUMMY SYMBOL\r
+ TRO ER,ERRA ;FLAG ERROR\r
+ ADDI SX,1 ;INCREMENT ARG COUNT\r
+ PUSH PP,AC0 ;STACK IT\r
+ CAIN C,'<' ;A DEFAULT ARGUMENT COMING UP?\r
+ JRST DEF80 ;YES, STORE IT AWAY\r
+ CAIE C,11 ;")"?\r
+ JRST DEF10 ;NO, GET NEXT DUMMY SYMBOL\r
+DEF12: PUSHJ PP,GCHAR\r
+ CAIE C,"<" ;"<"?\r
+ JRST DEF12 ;NO\r
+DEF20: PUSH PP,[0] ;YES, MARK THE LIST\r
+ LSH SX,9 ;SHIFT ARG COUNT\r
+ AOS ARG,SX\r
+ PUSHJ PP,SKELI ;INITIALIZE MACRO SKELETON\r
+ MOVE AC0,PPTMP2 ;GET NAME\r
+ TLO IO,DEFCRS\r
+ PUSHJ PP,MSRCH ;SEARCH THE TABLE\r
+ JRST DEF24 ;NOT FOUND\r
+ TLNN ARG,MACF ;FOUND, IS IT A MACRO?\r
+ TROA ER,ERRX ;NO, FLAG ERROR AND SKIP\r
+ PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE\r
+DEF24: HRRZ V,WWRXX ;GET START OF TREE\r
+ SKIPN .TEMP ;ANY DEFAULT ARGUMENTS TO TAKE CARE OF?\r
+ JRST DEF25 ;NO\r
+ HRRZ C,1(V) ;GET SHIFTED ARG COUNT\r
+ LSH C,-9 ;GET ARG COUNT BACK\r
+ ADDI C,1 ;ONE MORE FOR TERMINAL ZERO\r
+ ADD C,.TEMP ;NUMBER OF ITEMS IN STACK\r
+ HRLS C ;MAKE XWD\r
+ SUB PP,C ;BACK UP STACK\r
+ MOVE SDEL,.TEMP ;NUMBER OF WORDS NEEDED\r
+ ADDB SDEL,FREE ;FROM FREE CORE\r
+ CAML SDEL,SYMBOL ;MORE CORE NEEDED\r
+ PUSHJ PP,XCEEDS ;YES, TRY TO GET IT\r
+ SUB SDEL,.TEMP ;FORM POINTER\r
+ HRLM SDEL,1(V) ;STORE IT WITH ARG COUNT IN MACRO\r
+ SUBI SDEL,1 ;TO USE FOR PUSHING POINTER INTO STORAGE\r
+ MOVEI C,1(PP) ;POINT TO START OF STACK\r
+DEF26: MOVE ARG,(C) ;GET AN ITEM OFF STACK\r
+ TLNN ARG,-40 ;A POINTER?\r
+ JUMPN ARG,[PUSH SDEL,ARG ;YES, STORE IT\r
+\f AOJA C,DEF26] ;GET NEXT\r
+ PUSH PP,ARG ;RESTACK ARGUMENT\r
+ SKIPE ARG ;FINISHED IF ZERO\r
+ AOJA C,DEF26 ;GET NEXT\r
+ PUSH SDEL,ARG ;STORE ZERO IN DEFAULT LIST ALSO\r
+\fDEF25: MOVSI ARG,MACF\r
+ MOVEM PP,PPTMP2 ;STORE TEMP STORAGE POINTER\r
+ PUSHJ PP,INSERT ;INSERT/UPDATE\r
+ TLZ IO,DEFCRS ;JUST IN CASE\r
+ SETZM ARGF ;NO ARGUMENT SEEN\r
+ SETZM SQFLG ;AND NO ' SEEN\r
+ TDZA SDEL,SDEL ;CLEAR BRACKET COUNT\r
+DEF30: PUSHJ PP,WCHAR ;WRITE CHARACTER\r
+DEF31: PUSHJ PP,GCHAR ;GET A CHARACTER\r
+DEF32: MOVE CS,C ;GET A COPY\r
+ CAIN C,";" ;IS IT A COMMENT\r
+ JRST CPEEK ;YES CHECK FOR ;;\r
+DEF33: CAIG CS,"Z"+40 ;CONVERT LOWER CASE\r
+ CAIGE CS,"A"+40\r
+ JRST .+2\r
+ SUBI CS,40\r
+\f CAIGE CS,40 ;TEST FOR CONTROL CHAR.\r
+ JRST [SKIPN SQFLG ;HAS SINGLE QUOTE BEEN SEEN?\r
+ JRST DEF30 ;NO, OUTPUT THIS CHAR.\r
+ PUSH PP,C ;YES, SAVE CURRENT CHAR\r
+ MOVEI C,47 ;SET UP QUOTE\r
+ PUSHJ PP,WCHAR;WRITE IT\r
+ POP PP,C ;GET BACK CURRENT CHAR.\r
+ SETZM SQFLG ;RESET FLAG\r
+ JRST DEF30] ;AND CONTINUE \r
+ CAILE CS,77+40\r
+ JRST DEF30 ;TEST FOR SPECIAL\r
+ MOVE CS,CSTAT-40(CS) ;GET STATUS BITS\r
+\f TLNE CS,6 ;ALPHA-NUMERIC?\r
+ JRST DEF40 ;YES\r
+ SKIPN SQFLG ;WAS A ' SEEN?\r
+ JRST DEF36 ;NO, PROCESH\r
+ PUSH PP,C ;YES, SAVE CURRENT CHARACTER\r
+ MOVEI C,47 ;AND PUT IN A '\r
+ PUSHJ PP,WCHAR ;...\r
+ POP PP,C ;RESTORE CURRENT CHARACTER\r
+ SETZM SQFLG ;AND RESET FLAG\r
+DEF36: CAIE C,47 ;IS THIS A '?\r
+ JRST DEF35 ;NOPE\r
+ SKIPN ARGF ;YES, WAS LAST THING SEEN AN ARG?\r
+ SETOM SQFLG ;IF NOT, SET SNGL QUOT FLAG\r
+ SETZM ARGF ;BUT NOT ARGUMENT IN ANY CASE\r
+ JRST DEF31 ;GO GET NEXT CHARACTER\r
+\fDEF35: SETZM ARGF ;THIS IS NOT AN ARGUMENT\r
+ CAIN C,"<" ;"<"?\r
+ AOJA SDEL,DEF30 ;YES, INCREMENT COUNT AND WRITE\r
+ CAIN C,">" ;">"?\r
+ SOJL SDEL,DEF70 ;YES, TEST FOR END\r
+ JRST DEF30 ;NO, WRITE IT\r
+\r
+CPEEK: TLNN IO,IOPALL ;IF LALL IS ON\r
+ JRST DEF33 ;JUST RETURN\r
+ PUSHJ PP,PEEK ;LOOK AT NEXT CHAR.\r
+ CAIN C,";" ;IS IT ;;?\r
+ JRST CPEEK1 ;YES\r
+ MOVE C,CS ;RESTORE C\r
+ JRST DEF33 ;AND RETURN\r
+\r
+CPEEK1: PUSHJ PP,GCHAR ;GET THE CHAR.\r
+ CAIE C,">" ;RETURN IF END OF MACRO\r
+ CAIG C,CR ;IS CHAR ONE OF\r
+ CAIGE C,LF ;LF,VT,FF,CR\r
+ JRST CPEEK1 ;NO,SO GET NEXT CHAR.\r
+ JRST DEF32 ;YES,RETURN AND STORE\r
+\fDEF40: MOVEI AC0,0 ;CLEAR ATOM\r
+ MOVSI AC1,(POINT 6,AC0) ;SET POINTER\r
+DEF42: PUSH PP,C ;STACK CHARACTER\r
+ TLNE AC1,770000 ;HAVE WE STORED 6?\r
+ IDPB CS,AC1 ;NO, STORE IN ATOM\r
+ PUSHJ PP,GCHAR ;GET NEXT CHARACTER\r
+ MOVE CS,C\r
+ CAIG CS,"Z"+40\r
+ CAIGE CS,"A"+40\r
+ JRST .+2\r
+ SUBI CS,40 ;CONVERT LOWER TO UPPER\r
+ CAIL CS,40\r
+ CAILE CS,77+40\r
+ JRST DEF44 ;TEST SPECIAL\r
+ MOVE CS,CSTAT-40(CS) ;GET STATUS\r
+ TLNE CS,6 ;ALPHA-NUMERIC?\r
+ JRST DEF42 ;YES, GET ANOTHER\r
+DEF44: PUSH PP,[0] ;NO, MARK THE LIST\r
+ MOVE SX,PPTMP1 ;GET POINTER TO TOP\r
+\r
+DEF46: SKIPN 1(SX) ;END OF LIST?\r
+ JRST DEF50 ;YES\r
+ CAME AC0,1(SX) ;NO, DO THEY COMPARE?\r
+ AOJA SX,DEF46 ;NO, TRY AGAIN\r
+ SUB SX,PPTMP1 ;YES, GET DUMMY SYMBOL NUMBER\r
+ LSH SX,4\r
+ MOVSI CS,<(BYTE (7) 177,101)>(SX) ;SET ESCAPE CODE MACEND\r
+ LSH AC0,-^D30\r
+ CAIN AC0,5 ;"%"?\r
+ TLO CS,1000 ;YES, SET CRESYM FLAG\r
+ PUSHJ PP,WWORD ;WRITE THE WORD\r
+ SETOM ARGF ;SET ARGUMENT SEEN FLAG\r
+ SETZM SQFLG ;AND IGNORE ANY ' WAITING TO GET INTO STRING\r
+DEF48: MOVE PP,PPTMP2 ;RESET PUSHDOWN POINTER\r
+ TLO IO,IORPTC ;ECHO LAST CHARACTER\r
+ JRST DEF31 ;RECYCLE\r
+\r
+DEF50:\r
+ SKIPN SQFLG ;HAVE WE SEEN A '?\r
+ JRST DEF51 ;NOPE\r
+ MOVEI C,47 ;YES, PUT IT IN\r
+ PUSHJ PP,WCHAR ;...\r
+ SETZM SQFLG ;AND CLEAR FLAG\r
+DEF51: MOVE C,2(SX) ;GET CHARACTER\r
+ JUMPE C,DEF48 ;CLEAN UP IF END\r
+ PUSHJ PP,WCHAR ;WRITE THE CHARACTER\r
+ AOJA SX,DEF51 ;GET NEXT\r
+\r
+DEF70: MOVE PP,PPTMP1 ;RESTORE PUSHDOWN POINTER\r
+ MOVSI CS,(BYTE (7) 177,1)\r
+ PUSHJ PP,WWRXE ;WRITE END\r
+ SETZM INDEF ;OUT OF IT\r
+ JRST BYPASS\r
+\f; HERE TO STORE DEFAULT ARGUMENTS\r
+\r
+DEF80: AOS .TEMP ;COUNT ONE MORE\r
+ PUSHJ PP,SKELI1 ;INITIALIZE SKELETON\r
+ HRL V,SX ;SYMBOL NUMBER\r
+ PUSH PP,V ;STORE POINTER\r
+ TDZA SDEL,SDEL ;ZERO BRACKET COUNT\r
+DEF81: PUSHJ PP,WCHARQ ;WRITE A CHARACTER\r
+ PUSHJ PP,GCHARQ ;GET A CHARACTER\r
+ CAIN C,"<" ;ANOTHER "<"?\r
+ AOJA SDEL,DEF81 ;YES, INCREMENT AND WRITE\r
+ CAIE C,">" ;CLOSING ANGLE?\r
+ JRST DEF81 ;NO, JUST WRITE THE CHAR.\r
+ SOJGE SDEL,DEF81 ;YES, WRITE IF NOT END\r
+ MOVSI CS,(BYTE (7) 177,2)\r
+ PUSHJ PP,WWRXE ;WRITE END OF DUMMY ARGUMENT\r
+ PUSHJ PP,GCHAR ;READ AT NEXT CHAR.\r
+ CAIE C,")" ;END OF ARGUMENT LIST?\r
+ JRST DEF10 ;NO, GET NEXT SYMBOL\r
+ JRST DEF12 ;YES, LOOK FOR "<"\r
+\fSUBTTL MACRO CALL PROCESSOR\r
+CALLM: SKIPGE MACENL ;ARE WE TRYING TO RE-ENTER?\r
+ JRST ERRAX ;YES, BOMB OUT WITH ERROR\r
+ HRROS MACENL ;FLAG "CALLM IN PROGRESS"\r
+ EXCH MP,RP\r
+ PUSH MP,V ;STACK FOR REFDEC\r
+ EXCH MP,RP\r
+ MOVEM AC0,CALNAM ;SAVE MACRO NAME INCASE OF ERROR\r
+ MOVE SDEL,SEQNO2 ;SAVE IN CASE OF EOF\r
+ MOVEM SDEL,CALSEQ\r
+ MOVE SDEL,PAGENO\r
+ MOVEM SDEL,CALPG\r
+ ADDI V,1 ;POINT TO DUMMY SYMBOL COUNT\r
+ AOS SDEL,0(V) ;INCREMENT ARG COUNT\r
+ HLLZM SDEL,.TEMP ;DEFAULT ARG POINTER IF NON-ZERO\r
+ LSHC SDEL,-^D<9+36> ;ZERO SDEL, GET ARG COUNT IN SX\r
+ ANDI SX,777 ;MASK\r
+ SKIPE .TEMP ;IF AT LEAST ONE DEFAULT ARG\r
+ HRRM SX,.TEMP ;STORE COUNT OF ARGS\r
+ PUSH PP,V ;STACK FOR MRP\r
+ PUSH PP,RP ;STACK FOR MACPNT\r
+ JUMPE SX,MAC20 ;TEST FOR NO ARGS\r
+ PUSHJ PP,CHARAC\r
+ CAIE C,"(" ;"("\r
+ TROA SDEL,-1 ;NO, FUDGE PAREN COUNT AND SKIP\r
+\r
+MAC10: PUSHJ PP,GCHAR ;GET A CHARACTER, LOOK FOR AN ARG\r
+ CAIG C,CR\r
+ CAIGE C,LF\r
+ CAIN C,";" ;";"?\r
+ JRST MAC21 ;YES, END OF ARGUMENT STRING\r
+\r
+ PUSHJ PP,SKELI1 ;NO, INITIALIZE SKELETON\r
+ CAIN C,"<" ;"<"?\r
+ JRST MAC30 ;YES, PROCESS AS SPECIAL\r
+ CAIE C,176\r
+ CAIN C,134 ;"\"\r
+ JRST MAC40 ;YES, PROCESS SYMBOL\r
+\r
+MAC14: CAIN C,"," ;","?\r
+ JRST MAC16 ;YES; NULL SYMBOL\r
+ CAIN C,"(" ;"("?\r
+ ADDI SDEL,1 ;YES, INCREMENT COUNT\r
+ CAIN C,")" ;")"?\r
+ SOJL SDEL,MAC16 ;YES, TEST FOR END\r
+ PUSHJ PP,WCHAR ;WRITE INTO SKELETON\r
+MAC14A: PUSHJ PP,CHARAC ;GET NEXT CHARACTER\r
+ CAIG C,CR\r
+ CAIGE C,LF\r
+ JRST .+2\r
+ JRST MAC15 ;TEST FOR END OF LINE\r
+ CAIE C,";" ;";"?\r
+ JRST MAC14 ;YES, END OF LINE\r
+\r
+MAC15: TLO IO,IORPTC\r
+MAC16: MOVSI CS,(BYTE (7) 177,2)\r
+ PUSHJ PP,WWRXE ;WRITE END\r
+ EXCH MP,RP\r
+ PUSH MP,WWRXX\r
+ EXCH MP,RP\r
+ SOJLE SX,MAC20 ;BRANCH IF NO MORE ARGS\r
+ JUMPGE SDEL,MAC10 ;HAVEN'T SEEN TERMINAL ")" YET\r
+\fMAC20: TLZN IO,IORPTC\r
+ PUSHJ PP,CHARAC\r
+MAC21: EXCH MP,RP\r
+ JUMPE SX,MAC21B ;NO MISSING ARGS\r
+MAC21A: PUSH MP,[-1] ;FILL IN MISSING ARGS\r
+ SKIPN .TEMP ;ANY DEFAULT ARGS?\r
+ JRST MAC21C ;NO\r
+ HRRZ C,.TEMP ;GET ARG COUNT\r
+ SUBI C,-1(SX) ;ACCOUNT FOR THOSE GIVEN\r
+ HRLZS C ;PUT IN LEFT HALF\r
+ HLRZ SDEL,.TEMP ;ADDRESS OF TABLE\r
+MAC21D: SKIPN (SDEL) ;END OF LIST\r
+ JRST MAC21C ;YES\r
+ XOR C,(SDEL) ;TEST FOR CORRECT ARG\r
+ TLNN C,-1 ;WAS IT?\r
+ JRST MAC21E ;YES\r
+ XOR C,(SDEL) ;BACK THE WAY IT WAS\r
+ AOJA SDEL,MAC21D ;AND TRY AGAIN\r
+\r
+MAC21E: MOVEM C,(MP) ;REPLACE -1 WITH TREE POINTER\r
+ AOS 1(C) ;INCREMENT REFERENCE\r
+MAC21C: SOJG SX,MAC21A\r
+MAC21B: PUSH MP,[0] ;SET TERMINAL\r
+ HRRZ C,LIMBO\r
+ TLNN IO,IOSALL ;SUPPRESSING ALL?\r
+ JRST MAC23 ;NO\r
+ JUMPN MRP,MAC27 ;IN MACRO?\r
+ CAIE C,";" ;NO,IN COMMENT?\r
+ JRST MAC26 ;NO\r
+MAC22: PUSHJ PP,CHARAC ;YES,GET IT INTO THE LBUF\r
+ CAIG C,CR ;LESS THAN CR?\r
+ CAIGE C,LF ;AND GREATER THAN LF?\r
+ JRST MAC22 ;NO GET ANOTHER\r
+MAC26: HRLZI SX,70000 ;DECREMENT BYTE POINTER\r
+ ADDB SX,LBUFP\r
+ JUMPGE SX,MAC27\r
+ HRLOI SX,347777\r
+ ADDM SX,LBUFP\r
+MAC27: HRLI C,-1 ;SET FLAG\r
+ JRST MAC25\r
+\r
+MAC23: MOVEI SX,"^"\r
+ JUMPAD MAC24 ;BRANCH IF ADDRESS FIELD\r
+ CAIN C,";" ;IF SEMI-COLON\r
+ SKIPE LITLVL ;AND NOT IN A LITERAL\r
+ JRST MAC24 ;NOT BOTH TRUE\r
+ JUMPN MRP,MAC24 ;OR IN A MACRO\r
+ PUSHJ PP,STOUT ;LIST COMMENT OR CR-LF\r
+ TLNE IO,IOPALL ;MACRO EXPANSION SUPPRESSION?\r
+ TLO IO,IOMAC ; NO, SET TEMP BIT\r
+ TDOA C,[-1] ;FLAG LAST CHARACTER\r
+MAC24: DPB SX,LBUFP ;SET ^ INTO LINE BUFFER\r
+MAC25: PUSH MP,MACPNT\r
+ POP PP,MACPNT\r
+ PUSH MP,C\r
+ PUSH MP,RCOUNT ;STACK WORD COUNT\r
+ PUSH MP,MRP ;STACK MACRO POINTER\r
+ POP PP,MRP ;SET NEW READ POINTER\r
+ EXCH MP,RP\r
+ AOS MACLVL\r
+ HRRZS MACENL ;RESET "CALLM IN PROGRESS"\r
+ JUMPOC STMNT2 ;OP-CODE FIELD\r
+ JRST EVATOM ;ADDRESS FIELD\r
+\r
+\fMAC30: MOVEI AC0,0 ;INITIALIZE BRACKET COUNTER\r
+MAC31: PUSHJ PP,GCHAR ;GET A CHARACTER\r
+ CAIN C,"<" ;"<"?\r
+ ADDI AC0,1 ;YES, INCREMENT COUNT\r
+ CAIN C,">" ;">"?\r
+ SOJL AC0,MAC14A ;YES, EXIT IF MATCHING\r
+ PUSHJ PP,WCHAR ;WRITE INTO SKELETON\r
+ JRST MAC31 ;GO BACK FOR ANOTHER\r
+\r
+MAC40: PUSH PP,SX ;STACK REGISTERS\r
+ PUSH PP,SDEL\r
+ HLLM IO,TAGINC ;SAVE IO FLAGS\r
+ PUSHJ PP,CELL ;GET AN ATOM\r
+ MOVE V,AC0 ;ASSUME NUMERIC\r
+ TLNE IO,NUMSW ;GOOD GUESS?\r
+ JRST MAC41 ;YES\r
+ PUSHJ PP,SSRCH ;SEARCH THE SYMBOL TABLE\r
+ TROA ER,ERRX ;NOT FOUND, ERROR\r
+MAC41: PUSHJ PP,MAC42 ;FORM ASCII STRING\r
+ HLL IO,TAGINC ;RESTORE IO FLAGS\r
+ POP PP,SDEL\r
+ POP PP,SX\r
+ TLO IO,IORPTC ;REPEAT LAST CHARACTER\r
+ JRST MAC14A ;RETURN TO MAIN SCAN\r
+\r
+MAC42: MOVE C,V\r
+MAC44: LSHC C,-^D35\r
+ LSH CS,-1\r
+ DIVI C,0(RX) ;DIVIDE BY CURRENT RADIX\r
+ HRLM CS,0(PP)\r
+ JUMPE C,.+2 ;TEST FOR END\r
+ PUSHJ PP,MAC44\r
+ HLRZ C,0(PP)\r
+ ADDI C,"0" ;FORM TEXT\r
+ JRST WCHAR ;WRITE INTO SKELETON\r
+\fMACEN0: SOS MACENL\r
+MACEND: SKIPGE C,MACENL ;TEST "CALLM IN PROGRESS"\r
+ AOS MACENL ;INCREMENT END LEVEL AND EXIT\r
+ JUMPL C,REPEA8\r
+ EXCH MP,RP\r
+ POP MP,MRP ;RETRIEVE READ POINTER\r
+ POP MP,RCOUNT ;AND WORD COUNT\r
+ MOVEI C,"^"\r
+ SKIPL 0(MP) ;TEST FLAG\r
+ PUSHJ PP,RSW2 ;MARK END OF SUBSTITUTION\r
+ POP MP,C\r
+ POP MP,ARG\r
+ SKIPA MP,MACPNT ;RESET MP AND SKIP\r
+MACEN1: PUSHJ PP,REFDEC ;DECREMENT REFERENCE\r
+MACEN2: AOS V,MACPNT ;GET POINTER\r
+ MOVE V,0(V)\r
+ JUMPG V,MACEN1 ;IF >0, DECREMENT REFERENCE\r
+ JUMPL V,MACEN2 ;IF <0, BYPASS\r
+ POP MP,V ;IF=0, RETRIEVE POINTER\r
+ PUSHJ PP,REFDEC ;DECREMENT REFERENCE\r
+ MOVEM ARG,MACPNT\r
+ EXCH MP,RP\r
+ SOS MACLVL\r
+ SKIPN MACENL ;CHECK UNPROCESSED END LEVEL\r
+ JRST MACEN3 ;NONE TO PROCESS\r
+ TRNN MRP,-1 ;MRP AT END OF TEXT\r
+ JRST MACEN0 ;THEN POP THE MACRO STACK NOW\r
+MACEN3: TRNN C,77400 ;SALL FLAG?\r
+ HRLI C,0 ;YES,TURN IT OFF\r
+ JUMPL C,REPEA8 ;IF FLAG SET SUBSTITUTE\r
+ JRST RSW1\r
+\fIRP0: SKIPN MACLVL ;ARE WE IN A MACRO?\r
+ JRST ERRAX ;NO, BOMB OUT\r
+IRP10: PUSHJ PP,MREADS ;YES, GET DATA SPEC\r
+ CAIE C,40 ;SKIP LEADING BLANKS\r
+ CAIN C,"(" ;"("?\r
+ JRST IRP10 ;YES, BYPASS\r
+ CAIN C,11\r
+ JRST IRP10\r
+ CAIE C,177 ;NO, IS IT SPECIAL?\r
+ JRST ERRAX ;NO, ERROR\r
+ PUSHJ PP,MREADS ;YES\r
+ TRZN C,100 ;CREATED?\r
+ JRST ERRAX\r
+ CAIL C,40 ;TOO BIG?\r
+ JRST ERRAX\r
+ ADD C,MACPNT ;NO, FORM POINTER TO STACK\r
+ PUSH MP,IRPCF ;STACK PREVIOUS POINTERS\r
+ PUSH MP,IRPSW\r
+ PUSH MP,IRPARP\r
+ PUSH MP,IRPARG\r
+ PUSH MP,IRPCNT\r
+ PUSH MP,0(C)\r
+ PUSH MP,IRPPOI\r
+\r
+ HRRZM C,IRPARP\r
+ MOVEM AC0,IRPCF ;IRPC FLAG FOUND IN AC0\r
+ SETOM IRPSW ;RESET IRP SWITCH\r
+ MOVE CS,0(C)\r
+ MOVEM CS,IRPARG\r
+\r
+ PUSHJ PP,MREADS\r
+ CAIE C,"<" ;"<"?\r
+ JRST .-2 ;NO, SEARCH UNTIL FOUND\r
+ PUSHJ PP,SKELI1 ;INITIALIZE NEW STRING\r
+ MOVEM ARG,IRPPOI ;SET NEW POINTER\r
+\r
+ TDZA SDEL,SDEL ;ZERO BRACKET COUNT AND SKIP\r
+IRP20: PUSHJ PP,WCHAR1\r
+ PUSHJ PP,MREADS\r
+ CAIN C,"<" ;"<"?\r
+ AOJA SDEL,IRP20 ;YES, INCREMENT COUNT AND WRITE\r
+ CAIE C,">" ;">"?\r
+ JRST IRP20 ;NO, JUST WRITE IT\r
+ SOJGE SDEL,IRP20 ;YES, WRITE IF NOT MATCHING\r
+ MOVE CS,[BYTE (7) 15,177,4]\r
+ PUSHJ PP,WWRXE ;WRITE END\r
+ PUSH MP,MRP ;STACK PREVIOUS READ POINTER\r
+ PUSH MP,RCOUNT ;AND WORD COUNT\r
+ SKIPG CS,IRPARG\r
+ JRST IRPPOP ;EXIT IF NOT VALID ARGUMENT\r
+ MOVEI C,1(CS) ;INITIALIZE POINTER\r
+ MOVEM C,IRPARG\r
+\fIRPSET: EXCH MRP,IRPARG ;SWAP READ POINTERS\r
+ MOVE SX,RCOUNT ;SWAP COUNT OF WORDS TO READ\r
+ EXCH SX,IRPCNT\r
+ MOVEM SX,RCOUNT\r
+ PUSHJ PP,SKELI1 ;INITIALIZE SKELETON FOR DATA\r
+ HRRZM ARG,@IRPARP ;STORE NEW DS POINTER\r
+ SETZB SX,SDEL ;ZERO FOUND FLAG AND BRACKET COUNT\r
+ LDB C,MRP ;GET LAST CHAR\r
+ CAIN C,","\r
+ SKIPE IRPCF ;IN IRPC\r
+ JRST IRPSE1 ;NO\r
+ MOVEI SX,1 ;FORCE ARGUMENT\r
+IRPSE1: PUSHJ PP,MREADS\r
+ CAIE C,177 ;SPECIAL?\r
+ AOJA SX,IRPSE2 ;NO, FLAG AS FOUND\r
+ PUSHJ PP,PEEKM ;LOOK AT NEXT CHARACTER\r
+ SETZM IRPSW ;SET IRP SWITCH\r
+ JUMPG SX,IRPSE4 ;IF ARG FOUND, PROCESS IT\r
+ JRST IRPPOP ;NO, CLEAN UP AND EXIT\r
+\r
+IRPSE2: SKIPE IRPCF ;IRPC?\r
+ JRST IRPSE3 ;YES, WRITE IT\r
+ CAIN C,"," ;NO, IS IT A COMMA?\r
+ JUMPE SDEL,IRPSE4 ;YES, EXIT IF NOT NESTED\r
+ CAIN C,"<" ;"<"?\r
+ ADDI SDEL,1 ;YES, INCREMENT COUNT\r
+ CAIN C,">" ;">"?\r
+ SUBI SDEL,1 ;YES, DECREMENT COUNT\r
+\r
+IRPSE3: PUSHJ PP,WCHAR\r
+ SKIPN IRPCF ;IRPC?\r
+ JRST IRPSE1 ;NO, GET NEXT CHARACTER\r
+\r
+IRPSE4: MOVSI CS,(BYTE (7) 177,2)\r
+ PUSHJ PP,WWRXE ;WRITE END\r
+ MOVEM MRP,IRPARG ;SAVE POINTER\r
+ MOVE MRP,RCOUNT ;SAVE COUNT\r
+ MOVEM MRP,IRPCNT\r
+ HRRZ MRP,IRPPOI ;SET FOR NEW SCAN\r
+ AOJA MRP,REPEA8 ;ON ARG COUNT\r
+\fSTOPI0: SKIPN IRPARP ;IRP IN PROGRESS?\r
+ JRST ERRAX ;NO, ERROR\r
+ SETZM IRPSW ;YES, SET SWITCH\r
+ POPJ PP,\r
+\r
+IRPEND: MOVE V,@IRPARP\r
+ PUSHJ PP,REFDEC\r
+ SKIPE IRPSW ;MORE TO COME?\r
+ JRST IRPSET ;YES\r
+\r
+IRPPOP: MOVE V,IRPPOI\r
+ PUSHJ PP,REFDEC ;DECREMENT REFERENCE\r
+ POP MP,RCOUNT\r
+ POP MP,MRP ;RESTORE CELLS\r
+ POP MP,IRPPOI\r
+ POP MP,@IRPARP\r
+ POP MP,IRPCNT\r
+ POP MP,IRPARG\r
+ POP MP,IRPARP\r
+ POP MP,IRPSW\r
+ POP MP,IRPCF\r
+ JRST REPEA8\r
+\fGETDS: ;GET DUMMY SYMBOL NUMBER\r
+ MOVE CS,C ;USE CS FOR WORK REGISTER\r
+ ANDI CS,37 ;MASK\r
+ ADD CS,MACPNT ;ADD BASE ADDRESS\r
+ MOVE V,0(CS) ;GET POINTER FLAG\r
+ JUMPG V,GETDS1 ;BRANCH IF POINTER\r
+ TRNN C,40 ;NOT POINTER, SHOULD WE CREATE?\r
+ JRST RSW0 ;NO, FORGET THIS ARG\r
+ PUSH PP,WWRXX\r
+ PUSH PP,MWP ;STACK MACRO WRITE POINTER\r
+ PUSH PP,WCOUNT ;SAVE WORD COUNT\r
+ PUSHJ PP,SKELI1 ;INITIALIZE SKELETON\r
+ MOVEM ARG,0(CS) ;STORE POINTER\r
+ MOVE CS,[BYTE (7) 0,170,170,170,171] ;CREATE A SYMBOL\r
+ ADD CS,LSTSYM ;LSTSYM= # OF LAST CREATED\r
+ TDZ CS,[BYTE (7) 0,170,170,170,170]\r
+ MOVEM CS,LSTSYM\r
+ IOR CS,[ASCII /.0000/]\r
+ MOVEI C,"."\r
+ PUSHJ PP,WCHAR\r
+ PUSHJ PP,WWORD ;WRITE INTO SKELETON\r
+ MOVSI CS,(BYTE (7) 177,2)\r
+ PUSHJ PP,WWRXE ;WRITE END CODE\r
+ POP PP,WCOUNT ;RESTORE WORD COUNT\r
+ POP PP,MWP ;RESTORE MACRO WRITE POINTER\r
+ POP PP,WWRXX\r
+ MOVE V,ARG ;SET UP FOR REFINC\r
+\r
+GETDS1: PUSHJ PP,REFINC ;INCREMENT REFERENCE\r
+ HRL V,RCOUNT ;SAVE WORD COUNT\r
+ PUSH MP,V ;STACK V FOR DECREMENT\r
+ PUSH MP,MRP ;STACK READ POINTER\r
+ MOVEI MRP,1(V) ;FORM READ POINTER\r
+ JRST RSW0 ;EXIT\r
+\r
+DSEND: POP MP,MRP\r
+ POP MP,V\r
+ HLREM V,RCOUNT ;RESTORE WORD COUNT\r
+ HRRZS V ;CLEAR COUNT\r
+ PUSHJ PP,REFDEC ;DECREMENT REFERENCE\r
+ JRST RSW0 ;EXIT\r
+\fSKELI1: MOVEI ARG,1 ;ENTRY FOR SINGLE ARG\r
+SKELI: SETZ MWP, ;SIGNAL FIRST TIME THROUGH\r
+ PUSHJ PP,SKELWL ;GET POINTER WORD\r
+ HRRZM MWP,WWRXX ;SAVE FIRST ADDRESS\r
+ HRRZM MWP,LADR ;SAVE START OF LINKED LIST\r
+ HRRZM ARG,1(MWP) ;STORE COUNT\r
+ SOS WCOUNT ;ACCOUNT FOR WORD\r
+ HRRZ ARG,WWRXX ;SET FIRST ADDRESS\r
+ ADDI MWP,2 ;BUMP POINTER\r
+ HRLI MWP,(POINT 7) ;SET FOR 5 ASCII BYTES\r
+ ;SKELW RETURNS WITH ADR OF NEXT FREE LOC IN V (RIGHT)\r
+\r
+SKELW: SOSLE WCOUNT ;STILL SOME SPACE IN LEAF?\r
+ POPJ PP, ;YES, RETURN\r
+SKELWL: SKIPE V,NEXT ;GET FIRST FREE ADDRESS\r
+ JRST SKELW1 ;IF NON-ZERO, UPDATE FREE\r
+ MOVE V,FREE ;GET FREE\r
+ ADDI V,.LEAF ;INCREMENT BY LEAF SIZE\r
+ CAML V,SYMBOL ;OVERFLOW?\r
+ PUSHJ PP,XCEED ;YES, BOMB OUT\r
+ EXCH V,FREE ;UPDATE FREE\r
+ SETZM (V) ;CLEAR LINK\r
+\r
+SKELW1: HLL V,0(V) ;GET ADDRESS\r
+ HLRM V,NEXT ;UPDATE NEXT\r
+ SKIPE MWP ;IF FIRST TIME\r
+ HRLM V,1-.LEAF(MWP) ;STORE LINK IN FIRST WORD OF LEAF\r
+ MOVEI MWP,.LEAF ;SIZE OF LEAF\r
+ MOVEM MWP,WCOUNT ;STORE FOR COUNT DOWN\r
+ MOVEI MWP,(V) ;SET UP WRITE POINTER\r
+ TLO MWP,(POINT 7,,21) ;2 ASCII CHARS\r
+ POPJ PP,\r
+\r
+ ;WWRXX POINTS TO END OF TREE\r
+ ;MWP IDPB POINTER TO NEXT HOLE\r
+ ;NEXT FIRST OF A LINKED PORTION THAT IS NOT BEING USED (LEAVES)\r
+ ;FREE POINTS TO FREE CORE BETWEEN TREE AND SYM-TABLE\r
+ ;LADR POINTS TO BEG OF LINKED PORTION.\r
+\fGCHARQ: JUMPN MRP,MREADS ;IF GETTING CHAR. FROM TREE\r
+GCHAR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER\r
+ CAIG C,FF ;TEST FOR LF, VT OR FF\r
+ CAIGE C,LF\r
+ POPJ PP, ;NO\r
+ JRST OUTIM1 ;YES, LIST IT\r
+\r
+WCHARQ:\r
+WCHAR: \r
+WCHAR1: TLNN MWP,760000 ;END OF WORD?\r
+ PUSHJ PP,SKELW ;YES, GET ANOTHER\r
+ IDPB C,MWP ;STORE CHARACTER\r
+ POPJ PP,\r
+\r
+WWORD: LSHC C,7 ;MOVE ASCII INTO C\r
+ PUSHJ PP,WCHAR1 ;STORE IT\r
+ JUMPN CS,WWORD ;TEST FOR END\r
+ POPJ PP, ;YES, EXIT\r
+\r
+WWRXE: PUSHJ PP,WWORD ;WRITE LAST WORD\r
+ ADD MWP,WCOUNT ;GET TO END OF LEAF\r
+ SUBI MWP,.LEAF ;NOW POINT TO START OF IT\r
+ HRRZS (MWP) ;ZERO LEFT HALF OF LAST LEAF\r
+ HRRM MWP,@WWRXX ;SET POINTER TO END\r
+ POPJ PP,\r
+\fMREAD: PUSHJ PP,MREADS ;READ ONE CHARACTER\r
+ CAIE C,177 ;SPECIAL?\r
+ JRST RSW1 ;NO, EXIT\r
+ PUSHJ PP,MREADS ;YES, GET CODE WORD\r
+ TRZE C,100 ;SYMBOL?\r
+ JRST GETDS ;YES\r
+ CAILE C,4 ;POSSIBLY ILLEGAL\r
+ JRST ERRAX ;YUP\r
+ HRRI MRP,0 ;NO, SIGNAL END OF TEXT\r
+ JRST .+1(C)\r
+ PUSHJ PP,XCEED\r
+ JRST MACEND ;1; END OF MACRO\r
+ JRST DSEND ;2; END OF DUMMY SYMBOL\r
+ JRST REPEND ;3; END OF REPEAT\r
+ JRST IRPEND ;4; END OF IRP\r
+\r
+MREADI: HRLI MRP,700 ;SET UP BYTE POINTER\r
+ MOVEI C,.LEAF-1 ;NUMBER OF WORDS\r
+ MOVEM C,RCOUNT\r
+MREADS: TLNN MRP,-1 ;FIRST TIME HERE?\r
+ JRST MREADI ;YES, SET UP MRP AND RCOUNT\r
+ TLNN MRP,760000 ;HAVE WE FINISHED WORD?\r
+ SOSLE RCOUNT ;YES, STILL ROOM IN LEAF?\r
+ JRST MREADC ;STILL CHAR. IN LEAF\r
+ HLRZ MRP,1-.LEAF(MRP);YES, GET LINK\r
+ HRLI MRP,(POINT 7,,21) ;SET POINTER\r
+ MOVEI C,.LEAF ;RESET COUNT\r
+ MOVEM C,RCOUNT\r
+MREADC: ILDB C,MRP ;GET CHARACTER\r
+ POPJ PP,\r
+\r
+PEEK: JUMPN MRP,PEEKM ;THIS IS A MACRO READ\r
+ PUSHJ PP,CHARAC ;READ AN ASCII CHAR.\r
+ TLO IO,IORPTC ;REPEAT FOR NEXT\r
+ POPJ PP, ;AND RETURN\r
+\r
+PEEKM: PUSH PP,MRP ;SAVE MACRO READ POINTER\r
+ PUSH PP,RCOUNT ;SAVE WORD COUNT\r
+ PUSHJ PP,MREADS ;READ IN A CHAR.\r
+ POP PP,RCOUNT ;RESTORE WORD COUNT\r
+ POP PP,MRP ;RESET READ POINTER\r
+ POPJ PP, ;IORPTC IS NOT SET\r
+\fREFINC: MOVEI CS,1(V) ;GET POINTER TO TREE\r
+ AOS 0(CS) ;INCREMENT REFERENCE\r
+ POPJ PP,\r
+\r
+REFDEC: JUMPLE V,DECERR ;CATASTROPHIC ERROR SOMEWHERE\r
+ MOVEI CS,1(V) ;GET POINTER TO TREE\r
+ SOS CS,0(CS) ;DECREMENT REFERENCE\r
+ TRNE CS,000777 ;IS IT ZERO?\r
+ POPJ PP, ;NO, EXIT\r
+ HRRZ CS,0(V) ;YES, GET POINTER TO END\r
+ HRL CS,NEXT ;GET POINTER TO NEXT RE-USABLE\r
+ HLLM CS,0(CS) ;SET LINK\r
+ HRRM V,NEXT ;RESET NEXT\r
+ POPJ PP,\r
+\r
+DECERR: MOVE AC0,CALNAM ;GET MACRO NAME\r
+ MOVSI RC,[SIXBIT /ERROR WHILE EXPANDING@/]\r
+ PUSHJ PP,TYPMSG\r
+ JRST ERRNE2 ;COMMON MESSAGE\r
+\fA== 0 ;ASCII MODE\r
+AL== 1 ;ASCII LINE MODE\r
+IB== 13 ;IMAGE BINARY MODE\r
+B== 14 ;BINARY MODE\r
+IFE RUNSW,<DMP==16 ;DUMP MODE>\r
+\r
+CTL== 0 ;CONTROL DEVICE NUMBER\r
+IFN CCLSW,<CTL2==4 ;INPUT DEV FOR CCL FILE>\r
+BIN== 1 ;BINARY DEVICE NUMBER\r
+CHAR== 2 ;INPUT DEVICE NUMBER\r
+LST== 3 ;LISTING DEVICE NUMBER\r
+\r
+; COMMAND STRING ACCUMULATORS\r
+\r
+ACDEV== 1 ;DEVICE\r
+ACFILE==2 ;FILE\r
+ACEXT== 3 ;EXTENSION\r
+ACPPN== 4 ;PPN\r
+ACDEL== 4 ;DELIMITER\r
+ACPNTR==5 ;BYTE POINTER\r
+\r
+TIO== 6\r
+\r
+TIORW== 1000\r
+TIOLE== 2000\r
+TIOCLD==20000\r
+\r
+DIRBIT==4 ;DIRECTORY DEVICE\r
+TTYBIT==10 ;TTY\r
+MTABIT==20 ;MTA\r
+DTABIT==100 ;DTA\r
+DISBIT==2000 ;DISPLAY\r
+CONBIT==20000 ;CONTROLING TTY\r
+LPTBIT==40000 ;LPT\r
+DSKBIT==200000 ;DSK\r
+\r
+;GETSTS ERROR BITS\r
+\r
+IOIMPM==400000 ;IMPROPER MODE (WRITE LOCK)\r
+IODERR==200000 ;DEVICE DATA ERROR\r
+IODTER==100000 ;CHECKSUM OR PARITY ERROR\r
+IOBKTL== 40000 ;BLOCK TOO LARGE\r
+ERRBIT==IOIMPM!IODERR!IODTER!IOBKTL\r
+\r
+SYN .TEMP,PPN\r
+\fSUBTTL I/O ROUTINES\r
+BEG:\r
+IFN CCLSW,<TLZA IO,ARPGSW ;DON'T ALLOW RAPID PROGRAM GENERATION\r
+ TLO IO,ARPGSW ;ALLOW RAPID PROGRAM GENERATION>\r
+IFN PURESW,<\r
+ MOVE MRP,[XWD LOWL,LOWL+1] ;START OF DATA\r
+ SETZM LOWL ;ZERO FIRST WORD\r
+ BLT MRP,LOWEND ;AND THE REST\r
+ MOVE MRP,[XWD LOWH,LOWL] ;PHASED CODE\r
+ BLT MRP,LOWL+LENLOW ;MOVE IT IN>\r
+ HRRZ MRP,JOBREL ;GET LOWSEG SIZE\r
+ MOVEM MRP,MACSIZ ;SAVE CORE SIZE\r
+ ;DECODE VERSION NUMBER\r
+ MOVEI PP,JOBFFI ;TEMP PUSH DOWN STACK\r
+ PUSH PP,[0] ;MARK BOTTOM OF STACK\r
+ LDB 0,[POINT 3,JOBVER,2] ;GET USER BITS\r
+ JUMPE 0,GETE ;NOT SET IF ZERO\r
+ ADDI 0,"0" ;FORM NUMBER\r
+ PUSH PP,0 ;STACK IT\r
+ MOVEI 0,"-" ;SEPARATE BY HYPHEN\r
+ PUSH PP,0 ;STACK IT ALSO\r
+GETE: HRRZ 0,JOBVER ;GET EDIT NUMBER\r
+ JUMPE 0,GETU ;SKIP ALL THIS IF ZERO\r
+ MOVEI 1,")" ;ENCLOSE IN PARENS.\r
+ PUSH PP,1\r
+GETED: IDIVI 0,8 ;GET OCTAL DIGITS\r
+ ADDI 1,"0" ;MAKE ASCII\r
+ PUSH PP,1 ;STACK IT\r
+ JUMPN 0,GETED ;LOOP TIL DONE\r
+ MOVEI 0,"(" ;OTHER PAREN.\r
+ PUSH PP,0\r
+GETU: LDB 0,[POINT 6,JOBVER,17] ;UPDATE NUMBER\r
+ JUMPE 0,GETV ;SKIP IF ZERO\r
+ IDIVI 0,8 ;MIGHT BE TWO DIGITS\r
+ ADDI 1,"@" ;FORM ALPHA\r
+ PUSH PP,1\r
+ JUMPN 0,GETU+1 ;LOOP IF NOT DONE\r
+GETV: LDB 0,[POINT 9,JOBVER,11] ;GET VERSION NUMBER\r
+ IDIVI 0,8 ;GET DIGIT\r
+ ADDI 1,"0" ;TO ASCII\r
+ PUSH PP,1 ;STACK\r
+ JUMPN 0,GETV+1 ;LOOP\r
+ MOVE 1,[POINT 7,VBUF+1,13] ;POINTER TO DEPOSIT IN VBUF\r
+ POP PP,0 ;GET CHARACTER\r
+ IDPB 0,1 ;DEPOSIT IT\r
+ JUMPN 0,.-2 ;KEEP GOING IF NOT ZERO\r
+IFN FORMSW,<IFE DFRMSW,<\r
+ SETOM PHWFMT ;HALF WORD UNLESS CHANGED BY SWITCH>>\r
+\fIFN CCLSW,<\r
+ TLZA IO,CRPGSW ;SET TO INIT NEW COMMAND FILE\r
+M: TLNN IO,CRPGSW ;CURRENTLY DOING RPG?>\r
+IFE CCLSW,<M:>\r
+ RESET ;INITIALIZE PROGRAM\r
+ SETZM BINDEV ;CLEAR INCASE NOT USED NEXT TIME\r
+ SETZM LSTDEV ;SAME REASON\r
+ SETZM INDEV ;INCASE OF ERROR\r
+ HRRZ MRP,MACSIZ ;GET INITIAL SIZE\r
+ CORE MRP, ;BACK TO ORIGINAL SIZ4\r
+ JFCL ;SHOULD NEVER FAIL\r
+ SETZB MRP,PASS1I\r
+ MOVE [XWD PASS1I,PASS1I+1]\r
+ BLT PASS2X-1 ;ZERO THE PASS1 AND PASS2 VARIABLES\r
+ MOVEI PP,JOBFFI ;SET TEMP PUSH-DOWN POINTER\r
+ MOVE CS,[POINT 7,DBUF,6] ;INITIALIZE FOR DATE\r
+ MSTIME 2, ;GET TIME FROM MONITOR\r
+ PUSHJ PP,TIMOUT ;TIME FORMAT OUTPUT\r
+ DATE 1, ;GET DATE\r
+ IBP CS ;PASS OVER PRESET SPACE\r
+ PUSHJ PP,DATOUT ;DATE FORMAT OUTPUT\r
+ MOVSI FR,P1!CREFSW\r
+IFN CCLSW,<TLNE IO,CRPGSW ;RPG IN PROGRESS?\r
+ JRST GOSET ;YES, GO READ NEXT COMMAND\r
+ TLNE IO,ARPGSW ;NO, RPG ALLOWED?\r
+ JRST RPGSET ;YES, GO TRY\r
+CTLSET: RELEASE CTL2, ;IN CASE OF LOOKUP FAILURE>\r
+IFE CCLSW,<CTLSET:>\r
+ MOVSI IO,IOPALL ;ZERO FLAGS\r
+ INIT CTL,AL ;INITIALIZE USER CONSOLE\r
+ SIXBIT /TTY/\r
+ XWD CTOBUF,CTIBUF\r
+ EXIT ;NO TTY, NO ASSEMBLY\r
+ MOVSI C,(SIXBIT /TTY/)\r
+ DEVCHR C, ;GET CHARACTERISTICS\r
+ TLNN C,10 ;IS IT REALLY A TTY\r
+ EXIT ;NO\r
+ INBUF CTL,1 ;INITIALIZE SINGLE CONTROL\r
+ OUTBUF CTL,1 ;BUFFERS\r
+ PUSHJ PP,CRLF ;OUTPUT CARRIAGE RETURN - LINE FEED\r
+ MOVEI C,"*"\r
+ IDPB C,CTOBUF+1\r
+ OUTPUT CTL,\r
+ INPUT CTL,\r
+\fIFN CCLSW,<JRST BINSET ;BEGIN WITH BINARY FILE\r
+\r
+RPGSET:\r
+IFN TEMP,<HRRZ 3,JOBFF ;GET START OF BUFFER AREA\r
+ HRRZ 0,JOBREL ;GET TOP OF CORE\r
+ CAIGE 0,200(3) ;WILL BUFFER FIT?\r
+ JRST [ADDI 0,200 ;NO, GET ENUF CORE\r
+ CORE 0, ;CORE UUO\r
+ JRST XCEED2 ;FAILED, SO GIVE UP\r
+ JRST .+1] ;CONTINUE\r
+ HRRM 3,TMPFIL+1 ;STORE IN TMPCOR UUO IOWD\r
+ SOS TMPFIL+1 ;MAKE IT THE PROPER IOWD FORMAT\r
+ HRRM 3,CTLBLK+1 ;DUMMY UP BUFFER HEADER\r
+ MOVE 0,[XWD 2,TMPFIL] ;SET UP FOR TEMP CORE READ\r
+ TMPCOR ;READ AND DELETE FILE "MAC"\r
+ JRST RPGTMP ;NO SUCH FILE IN CORE TRY DISK\r
+ ADD 3,0 ;CALCULATE END OF BUFFER\r
+ MOVEM 3,JOBFF ;FIX JOBFF SO FILE WONT BE KILLED\r
+ IMULI 0,5 ;CALCULATE CHARACTER COUNT\r
+ ADDI 0,1 ;SINCE SOSG HAPPENS AFTER NOT BEFORE\r
+ MOVEM 0,CTLBLK+2 ;SET UP CHAR CNT IN BUFFER HEADER\r
+ MOVEI 0,440700 ;SET UP BYTE POINTER IN HEADER\r
+ HRLM 0,CTLBLK+1 ;BUFFER HEADER NOW SET UP\r
+ SETOM TMPFLG ;MARK THAT A TMPCOR UUO WAS DONE\r
+ JRST RPGS2A ;CONTINUE IN MAIN STREAM\r
+RPGTMP: SETZM TMPFLG ;JUST IN CASE>\r
+ INIT CTL2,AL ;LOOK FOR DISK\r
+ SIXBIT /DSK/ ;...\r
+ XWD 0,CTLBLK ;...\r
+ JRST CTLSET ;DSK NOT THERE\r
+\r
+IFE STANSW,<\r
+ HRLZI 3,(SIXBIT /MAC/) ;###MAC\r
+ MOVEI 3 ;COUNT\r
+ PJOB AC1, ;RETURNS JOB NO. TO AC1\r
+RPGLUP: IDIVI AC1,12 ;CONVERT\r
+ ADDI AC2,"0"-40 ;SIXBITIZE IT\r
+ LSHC AC2,-6 ;\r
+ SOJG 0,RPGLUP ;3 TIMES\r
+ MOVEM 3,CTLBUF ;###MAC\r
+ HRLZI (SIXBIT /TMP/) ;\r
+>\r
+IFN STANSW,<\r
+ MOVE 3,['QQMACR']\r
+ MOVEM 3,CTLBUF\r
+ MOVSI 0,'RPG'\r
+>\r
+ MOVEM CTLBUF+1 ;TMP\r
+ SETZM CTLBUF+3 ;PROG-PRO\r
+ LOOKUP CTL2,CTLBUF ;COMMAND FILE\r
+ JRST CTLSET ;NOT THERE\r
+ HLRM EXTMP ;SAVE THE EXTENSION\r
+\r
+RPGS2: INBUF CTL2,1 ;SINGLE BUFFERED\r
+RPGS2A: INIT CTL,AL ;TTY FOR CONSOLE MESSAGES\r
+ SIXBIT /TTY/ ;...\r
+ XWD CTOBUF,0 ;...\r
+ EXIT ;NO TTY, NO ASSEMBLY\r
+ OUTBUF CTL,1 ;SINGLE BUFFERED\r
+ MOVE JOBFF ;REMEMBER WHERE BINARY BUFFERS BEGIN\r
+ MOVEM SAVFF ;...\r
+ HRRZ JOBREL ;TOP OF CORE\r
+ CAMLE MACSIZ ;SEE IF IT HAS GROWN\r
+ MOVEM MACSIZ ;PREVENTS ADDRESS CHECK ON EXIT\r
+ TLNE IO,CRPGSW ;ARE WE ALREADY IN RPG MODE?\r
+ JRST M ;MUST HAVE COME FROM @ COMMAND, RESET\r
+\r
+\fGOSET: MOVSI IO,IOPALL!CRPGSW ;SET INITIAL FLAGS\r
+ MOVEI CS,CTLSIZ ;MAXIMUM CHARS IN A LINE\r
+ MOVE AC1,CTLBLK+2 ;NUMBER OF CHARACTERS\r
+ MOVEM AC1,CTIBUF+2 ;SAVE FOR PASS 2\r
+ MOVE AC1,[POINT 7,CTLBUF] ;WHERE TO STASH CHARS\r
+ MOVEM AC1,CTIBUF+1 ;...\r
+GOSET1: SOSG CTLBLK+2 ;ANY MORE CHARS?\r
+ PUSHJ PP,[IFN TEMP,<SKIPE TMPFLG ;TMPCOR UUO IN PROGRESS?\r
+ EXIT ;YES EXIT>\r
+ IN CTL2, ;READ ANOTHER BUFFERFUL\r
+ POPJ PP, ;EVERYTHING OK, RETURN\r
+ STATO CTL2,20000 ;EOF?\r
+ JRST [HRROI RC,[SIXBIT /ERROR READING COMMAND FILE@/]\r
+ JRST ERRFIN] ;GO COMPLAIN\r
+ PUSHJ PP,DELETE ;CMD FILE\r
+ EXIT] ;EOF AND FINISHED\r
+ ILDB C,CTLBLK+1 ;GET NEXT CHAR\r
+ MOVE RC,@CTLBLK+1 ;CHECK FOR SEQUENCE NUMBERS\r
+ TRNE RC,1 ;...\r
+ JRST [AOS CTLBLK+1 ;SKIP OVER ANOTHER 5 CHARS\r
+ MOVNI RC,5 ;...\r
+ ADDM RC,CTLBLK+2 ;...\r
+ JRST GOSET1 ] ;GO READ ANOTHER CHAR\r
+ JUMPE C,GOSET1 ;IGNORE NULLS\r
+ IDPB C,CTIBUF+1 ;STASH AWAY\r
+ AOS CTIBUF+2 ;INCREMENT CHAR. COUNT\r
+ CAIE C,12 ;LINE FEED OR\r
+ CAIN C,175 ;ALTMODE?\r
+ JRST GOSET2 ;YES, FINISHED WITH COMMAND\r
+ CAIE C,176\r
+ CAIN C,33\r
+ JRST GOSET2 ;ALTMODE.\r
+ SOJG CS,GOSET1 ;GO READ ANOTHER\r
+ HRROI RC,[SIXBIT /COMMAND LINE TOO LONG@/]\r
+ JRST ERRFIN ;GO COMPLAIN\r
+GOSET2: MOVEI C,12 ;MAKE SURE THERE'S A LF\r
+ IDPB C,CTIBUF+1 ;...\r
+ MOVEM AC1,CTIBUF+1 ;SET POINTER TO BEGINNING\r
+ AOS CTIBUF+2 ;ADD I TO COUNT\r
+ MOVE SAVFF ;RESET JOBFF FOR NEW BINARY\r
+ MOVEM JOBFF ;...\r
+ JRST BINSET\r
+\f\r
+RPGS1: PUSHJ PP,DELETE ;DELETE COMMAND FILE\r
+ MOVEM ACDEV,RPGDEV ;GET SET TO INIT\r
+ OPEN CTL2,RPGINI ;DO IT\r
+ JRST EINIT ;ERROR\r
+ MOVEM ACFILE,INDIR ;USE INPUT BLOCK\r
+ MOVEM ACPPN,INDIR+3 ;SET PPN \r
+ MOVEM ACEXT,INDIR+1\r
+ LOOKUP CTL2,INDIR\r
+ JRST [JUMPN ACEXT,RPGLOS ;GIVE UP ,EXPLICIT EXTENSION\r
+IFE STANSW,< MOVSI ACEXT,(SIXBIT /CCL/) ;IF BLANK TRY CCL>\r
+IFN STANSW,< MOVSI ACEXT,(SIXBIT /RPG/) ;IF BLANK TRY RPG>\r
+ JRST .-2 ]\r
+ HLRM ACEXT,EXTMP ;SAVE THE EXTENSION\r
+ HLRZ JOBSA ;RESET JOBFF TO ORIGINAL\r
+ MOVEM JOBFF\r
+ TLO IO,CRPGSW ;TURN ON SWITCH SO WE RESET WORLD\r
+ JRST RPGS2 ;AND GO\r
+RPGLOS: RELEAS CTL2,0\r
+ TLZ IO,CRPGSW ;STOPS IO TO UNASGD CHAN\r
+ JRST ERRCF ;NO FILE FOUND\r
+>\r
+\fBINSET: PUSHJ PP,NAME1 ;GET FIRST NAME\r
+IFN CCLSW,<CAIN C,"!" ;WAS THIS AN IMPERATIVE?\r
+ JRST NUNSET ;GET THEE TO A NUNNERY\r
+ CAIN C,"@" ;CHEK FOR A NEW RPG FILE\r
+ JRST RPGS1>\r
+ TLNN FR,CREFSW ;CROSS REF REQUESTED?\r
+ JRST LSTSE1 ;YES, SKIP BINARY\r
+ CAIN C,"," ;COMMA?\r
+ JUMPE ACDEV,LSTSET ;YES, SKIP BINARY IF NO DEVICE SPECIFIED\r
+ CAIN C,"_" ;LEFT ARROW?\r
+ JUMPE ACDEV,LSTSE1 ;YES, SKIP BINARY IF NO DEVICE SPECIFIED\r
+ JUMPE ACDEV,M ;IGNORE IF JUST <CR-LF>\r
+ TLO FR,PNCHSW ;OK, SET SWITCH\r
+ MOVEM ACDEV,BINDEV ;STORE DEVICE NAME\r
+ MOVEM ACFILE,BINDIR ;STORE FILE NAME IN DIRECTORY\r
+ JUMPN ACEXT,.+2 ;EXTENSION SPECIFIED?\r
+ MOVSI ACEXT,(SIXBIT /REL/) ;NO, ASSUME RELOCATABLE BINARY\r
+ MOVEM ACEXT,BINDIR+1 ;STORE IN DIRECTORY\r
+ MOVEM ACPPN,BINDIR+3 ;SET PPN\r
+ OPEN BIN,BININI ;INITIALIZE BINARY\r
+ JRST EINIT ;ERROR\r
+ TLZE TIO,TIOLE ;SKIP TO EOT\r
+ MTAPE BIN,10\r
+ TLZE TIO,TIORW ;REWIND REQUESTED?\r
+ MTAPE BIN,1 ;YES\r
+ JUMPGE CS,BINSE2 ;BRANCH IF NO BACK-SPACE\r
+ MTAPE BIN,17 ;BACK-SPACE A FILE\r
+ AOJL CS,.-1 ;TEST FOR END\r
+ WAIT BIN,\r
+ STATO BIN,1B24 ;LOAD POINT?\r
+ MTAPE BIN,16 ;NO, GO FORWARD ONE\r
+BINSE2: SOJG CS,.-1 ;TEST FORWARD SPACING\r
+\r
+ TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?\r
+ UTPCLR BIN, ;YES, CLEAR IT\r
+ OUTBUF BIN,2 ;SET UP TWO RING BUFFER\r
+ CAIN C,"_"\r
+ JRST GETSET ;NO LISTING\r
+\fLSTSET: PUSHJ PP,NAME1 ;GET NEXT DEVICE\r
+LSTSE1: CAIE C,"_"\r
+ JRST ERRCM\r
+ TLNE FR,CREFSW ;CROSS-REF REQUESTED?\r
+ JRST LSTSE2 ;NO, BRANCH\r
+ JUMPN ACDEV,.+2 ;YES, WAS DEVICE SPECIFIED?\r
+ MOVSI ACDEV,(SIXBIT /DSK/) ;NO, ASSUME DSK\r
+ JUMPN ACFILE,.+2\r
+ MOVE ACFILE,[SIXBIT /CREF/]\r
+ JUMPN ACEXT,.+2\r
+IFE STANSW,<MOVSI ACEXT,(SIXBIT /CRF/) >\r
+IFN STANSW,<MOVSI ACEXT,'LST'>\r
+LSTSE2: JUMPE ACDEV,GETSET ;FORGET LISTING IF NO DEVICE SPECIFIED\r
+ MOVE AC0,ACDEV\r
+ DEVCHR AC0, ;GET CHARACTERISTICS\r
+ TLNE AC0,LPTBIT!DISBIT!TTYBIT\r
+ TLNE FR,CREFSW ; WAS CROSS-REF REQUESTED?\r
+ AOSA OUTSW+0*TTYSW ;NO, ASSUME TTY\r
+ JRST ERRCM ;YES, ERROR - CREF DEV MUST NOT BE LPT, DIS, OR TTY\r
+ TLNE AC0,CONBIT ;CONTROLING TELETYPE LISTING?\r
+ JRST GETSET ;YES, BUFFER ALREADY SET\r
+ MOVEM ACDEV,LSTDEV ;STORE DEVICE NAME\r
+ AOS OUTSW+0*LPTSW ;SET FOR LPT\r
+ MOVEM ACFILE,LSTDIR ;STORE FILE NAME\r
+ JUMPN ACEXT,.+2\r
+ MOVSI ACEXT,(SIXBIT /LST/)\r
+ MOVEM ACEXT,LSTDIR+1\r
+ MOVEM ACPPN,LSTDIR+3 ;SET PPN\r
+ OPEN LST,LSTINI ;INITIALIZE LISTING OUTPUT\r
+ JRST EINIT ;ERROR\r
+ TLZE TIO,TIOLE\r
+ MTAPE LST,10\r
+ TLZE TIO,TIORW ;REWIND REQUESTED?\r
+ MTAPE LST,1 ;YES\r
+ JUMPGE CS,LSTSE3\r
+ MTAPE LST,17\r
+ AOJL CS,.-1\r
+ WAIT LST,\r
+ STATO LST,1B24\r
+ MTAPE LST,16\r
+LSTSE3: SOJG CS,.-1\r
+ TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?\r
+ UTPCLR LST, ;YES, CLEAR IT\r
+ OUTBUF LST,2 ;SET UP A TWO RING BUFFER\r
+\fGETSET: MOVEI 3,PDPERR\r
+ HRRM 3,JOBAPR ;SET TRAP LOCATION\r
+ MOVEI 3,1B19 ;SET FOR PUSH-DOWN OVERFLOW\r
+ APRENB 3,\r
+ SOS 3,PDP ;GET PDP REQUEST MINUS 1\r
+ IMULI 3,.PDP ;COMPUTE SIZE (50*<NUMBER OF /P'S +1>)\r
+ HRLZ MP,3\r
+ HRR MP,JOBFF ;SET BASIC POINTER\r
+ MOVE PP,MP\r
+ SUB PP,3\r
+ MOVEM PP,RP ;SET RP\r
+ SUB PP,3\r
+ ASH 3,1 ;DOUBLE SIZE OF BASIC POINTER\r
+ HRL PP,3\r
+ SUBM PP,3 ;COMPUTE TOP LOCATION\r
+ SKIPN UNITOP ;IF ANY UNIVERSALS HAVE BEEN SEEN\r
+ JRST GETSE0 ;NO\r
+ HRRZS 3 ;GET TOP OF BUFFERS AND STACKS\r
+ CAMLE 3,UNISIZ ;HOPE ITS NOT BIGGER THAN UNIVERSAL ONE\r
+ JRST UNIERR ;IT WAS, YOU LOSE\r
+ SKIPA 3,UNITOP ;DON'T LOSE THEM\r
+GETSE0: HRRZM 3,UNISIZ ;STORE UNTIL A UNIVERSAL IS SEEN\r
+ HRRZM 3,LADR ;SET START OF MACRO TREE\r
+ HRRZM 3,FREE\r
+\r
+GETSE1: HRRZ JOBREL\r
+ SUBI 1\r
+ MOVEM SYMTOP ;SET TOP OF SYMBOL TABLE\r
+ SUBI LENGTH ;SET POINTER FOR INITIAL SYMBOLS\r
+ CAMLE LADR ;HAVE WE ROOM?\r
+ JRST GETSE2 ;YES\r
+\r
+ HRRZ 2,JOBREL ;NO, TRY FOR MORE CORE\r
+ ADDI 2,2000\r
+ CORE 2,\r
+ JRST XCEED2 ;NO MORE, INFORM USER\r
+ JRST GETSE1 ;TRY AGAIN\r
+\r
+GETSE2: MOVEM SYMBOL ;SET START OF SYMBOL TABLE\r
+ HRLI SYMNUM\r
+ BLT @SYMTOP ;STORE SYMBOLS\r
+ PUSHJ PP,SRCHI ;INITIALIZE TABLE\r
+ MOVE [XWD CTIBUF+1,CTLSAV] ;SAVE CONTROL INPUT BUFFER\r
+ BLT CTLS1 ;FOR RESCAN ON PASS 2\r
+IFN FTDISK,<MOVSI (SIXBIT /DSK/) ;SET INPUT TO TAKE DSK AS DEV\r
+ MOVEM ACDEVX>\r
+ PUSHJ PP,COUTI ;INIT OUTPUT JUST IN CASE\r
+ PUSHJ PP,INSET ;GET FIRST INPUT FILE\r
+\r
+IFN CCLSW,<TLNE IO,CRPGSW ;BUT ONLY IF DOING RPG\r
+ TTCALL 3,[ASCIZ /MACRO: /] ;PUBLISH COMPILER NAME>\r
+ MOVE CS,INDIR ;SET UP NAME OF FIRST FILE\r
+ MOVEM CS,LSTFIL ;AS LAST PRINTED\r
+ SETZM LSTPGN\r
+ JRST ASSEMB ;START ASSEMBLY\r
+\fFINIS: CLOSE BIN, ;DUMP BUFFER\r
+ TLNE FR,PNCHSW ;PUNCH REQUESTED?\r
+ PUSHJ PP,TSTBIN ;YES, TEST FOR ERRORS\r
+ RELEAS BIN,\r
+ CLOSE LST,\r
+ SOSLE OUTSW+0*LPTSW ;LPT TYPE OUTPUT?\r
+ PUSHJ PP,TSTLST ;YES, TEST FOR ERRORS\r
+ RELEAS LST,\r
+ RELEAS CHAR,\r
+ OUTPUT CTL,0 ;FLUSH TTY OUTPUT\r
+ SKIPE UNIVSN ;SKIP IF NOT ASSEMBLING UNIVERSAL\r
+ PUSHJ PP,UNISYM ;STORE SYMBOLS ETC. FIRST\r
+ JRST M ;RETURN FOR NEXT ASSEMBLY\r
+\fINSET: MOVEI JOBFFI ;POINTER TO INPUT BUFFER\r
+ HRRM JOBFF ;INFORM SYSTEM OF BUFFER AREA\r
+ PUSHJ PP,NAME2 ;GET NEXT COMMAND NAME\r
+ JUMPE ACDEV,ERRNE ;ERROR IF NONE LEFT\r
+ MOVEM ACDEV,INDEV ;STORE DEVICE\r
+ MOVEM ACFILE,INDIR ;STORE FILE IN DIRECTORY\r
+ MOVEM ACPPN,INDIR+3 ;STORE PPN BEFORE WE LOSE IT\r
+ OPEN CHAR,INDEVI\r
+ JRST EINIT ;ERROR\r
+ DEVCHR ACDEV, ;TEST CHARACTERISTICS\r
+ TLNN ACDEV,MTABIT ;MAG TAPE?\r
+ JRST INSET3 ;NO\r
+ TLZN FR,MTAPSW ;FIRST MAG TAPE IN PASS 2?\r
+ JRST INSET1 ;NO\r
+ TLNN TIO,TIORW ;YES, REWIND REQUESTED?\r
+ SUB CS,RECCNT ;NO, PREPARE TO BACK-SPACE TAPE\r
+INSET1: AOS RECCNT ;INCREMENT FILE COUNTER\r
+ ADDM CS,RECCNT ;UPDATE COUNT\r
+ TLZE TIO,TIOLE\r
+ MTAPE CHAR,10\r
+ TLZE TIO,TIORW ;REWIND?\r
+ MTAPE CHAR,1 ;YES\r
+ JUMPGE CS,INSET2\r
+ MTAPE CHAR,17\r
+ MTAPE CHAR,17\r
+ AOJL CS,.-1\r
+ WAIT CHAR,\r
+ STATO CHAR,1B24\r
+ MTAPE CHAR,16\r
+INSET2: SOJGE CS,.-1\r
+\r
+INSET3: INBUF CHAR,1\r
+ MOVEI ACPNTR,JOBFFI\r
+ EXCH ACPNTR,JOBFF\r
+ SUBI ACPNTR,JOBFFI\r
+ MOVEI ACDEL,NUMBUF*203+1\r
+ IDIV ACDEL,ACPNTR\r
+ INBUF CHAR,(ACDEL)\r
+ JUMPN ACEXT,INSET4 ;TAKE USER'S EXTENSION IF NON-BLANK\r
+ MOVSI ACEXT,(SIXBIT /MAC/) ;BLANK, TRY .MAC FIRST\r
+ PUSHJ PP,INSETI\r
+INSET4: PUSHJ PP,INSETI\r
+ JUMPE ACEXT,ERRCF ;ERROR IF ZERO\r
+ TLNE ACDEV,TTYBIT ;TELETYPE?\r
+ SETSTS CHAR,AL ;YES, CHANGE TO ASCII LINE\r
+\f ;DO ALL ENTERS HERE FOR LEVEL D\r
+ SKIPE ENTERS ;HAVE ENTERS BEEN DONE ALREADY?\r
+ JRST ENTRDN ;YES, DON'T DO TWICE\r
+ SKIPN ACEXT,LSTDEV ;IS THERE A LIST DEVICE?\r
+ JRST LSTSE5 ;NO SO DON'T DO ENTER\r
+ SKIPN ACFILE,LSTDIR ;GET FILE NAME INCASE OF ERROR\r
+ JRST [DEVCHR ACEXT, \r
+ TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY?\r
+ JRST LSTSE4 ;YES, GIVE UP BEFORE HARM IS DONE\r
+ SKIPE ACFILE,INDIR ;USE INPUT FILE NAME\r
+ MOVEM ACFILE,LSTDIR ;TOO BAD IF ZERO ALSO\r
+ JRST LSTSE4]\r
+ HLLZ ACEXT,LSTDIR+1 ;EXT ALSO\r
+ MOVE ACPPN,LSTDIR+3 ;SAVE PPN\r
+ LOOKUP LST,LSTDIR ;PREVIOUS ONE STILL THERE\r
+ JRST LSTSE4 ;NO\r
+ SETZM LSTDIR ;YES,CLEAR NAME\r
+ MOVEM ACPPN,LSTDIR+3 ;RESET PPN\r
+ RENAME LST,LSTDIR\r
+ CLOSE LST, ;IGNORE FAILURE\r
+ MOVEM ACFILE,LSTDIR ;RESTORE NAME\r
+ HLLZS LSTDIR+1 ;BH 11/19/74 FOR DATE75. CLEAR RH.\r
+ SETZM LSTDIR+2 ;CLEAR PROTECTION AND DATE\r
+ MOVEM ACPPN,LSTDIR+3 ;SET PPN AGAIN\r
+LSTSE4: \r
+IFN STANSW,<\r
+ MOVSI ACEXT,400000\r
+ MOVEM ACEXT,LSTDIR+2 ;SET DUMP NEVER BIT.\r
+>\r
+ ENTER LST,LSTDIR ;SET UP DIRECTORY\r
+ JRST ERRCL ;ERROR\r
+LSTSE5: SKIPN ACEXT,BINDEV ;A BINARY DEVICE THEN ?\r
+ JRST ENTRDN ;NO\r
+ SKIPN ACFILE,BINDIR ;INCASE OF ERROR\r
+ JRST [DEVCHR ACEXT, \r
+ TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY?\r
+ JRST .+1 ;YES, GIVE UP BEFORE HARM IS DONE\r
+ SKIPE ACFILE,INDIR ;USE INPUT FILE NAME\r
+ MOVEM ACFILE,BINDIR ;TOO BAD IF ZERO ALSO\r
+ JRST .+1]\r
+IFN STANSW,<\r
+ MOVSI ACEXT,400000\r
+ MOVEM ACEXT,BINDIR+2\r
+>\r
+ HLLZS ACEXT,BINDIR+1 ;BH 11/19/74 DATE75. WAS HLLZ.\r
+ ENTER BIN,BINDIR ;ENTER FILE NAME\r
+ JRST ERRCB ;ERROR\r
+\r
+ENTRDN: SETOM ENTERS ;MAKE SURE ONLY DONE ONCE\r
+ MOVE CS,[POINT 7,DEVBUF]\r
+ PUSH PP,1 ;SAVE THE ACCS\r
+ PUSH PP,2\r
+ PUSH PP,3\r
+ SKIPN 2,INDIR ;GET INPUT NAME\r
+ JRST FINDEV ;FINISHED WITH DEVICE\r
+ SETZ 1, ;CLEAR FOR RECEIVING\r
+ LSHC 1,6 ;SHIFT ONE CHAR. IN\r
+ ADDI 1,40 ;FORM ASCII\r
+ IDPB 1,CS ;STORE CHAR.\r
+ JUMPN 2,.-4 ;MORE TO DO?\r
+ MOVEI 1," " ;SEPARATE BY TAB\r
+ IDPB 1,CS\r
+ HLLZ 2,INDIR+1 ;GET EXT\r
+ JUMPE 2,FINEXT ;NO EXT\r
+ SETZ 1,\r
+ LSHC 1,6 ;SAME LOOP AS ABOVE\r
+ ADDI 1,40\r
+ IDPB 1,CS\r
+ JUMPN 2,.-4\r
+FINEXT: MOVEI 1," "\r
+ IDPB 1,CS ;SEPARATE BY TAB\r
+ LDB 1,[POINT 12,INDIR+2,35] ;GET DATE\r
+ LDB 2,[POINT 3,INDIR+1,20] ;BH 11/19/74 DATE75.\r
+ DPB 2,[POINT 3,1,23] ;BH 11/19/74 DATE75.\r
+ JUMPE 1,FINDEV ;NO DATE?\r
+ PUSHJ PP,DATOUT ;STORE IT\r
+ LDB 2,[POINT 11,INDIR+2,23] ;GET CREATION TIME\r
+ JUMPE 2,FINDEV ;NO TIME (DECTAPE)\r
+ MOVEI 1," " ;SEPARATE BY SPACE\r
+ IDPB 1,CS\r
+ PUSHJ PP,TIMOU1 ;STORE TIME\r
+FINDEV: SETZ 1,\r
+ MOVEI 2," " ;FINAL TAB\r
+ IDPB 2,CS\r
+ IDPB 1,CS ;TERMINATE FOR NOW\r
+ POP PP,3 ;RESTORE ACCS\r
+ POP PP,2\r
+ POP PP,1\r
+ SKIPN PAGENO ;IF FIRST TIME THRU\r
+ JRST OUTFF ;START NEW PAGE\r
+ SETZM PAGENO ;ON NEW FILE, RESET PAGES\r
+ JRST OUTFF2 ;DON'T START NEW PAGE UNLESS FF\r
+\r
+INSETI: HLLZM ACEXT,INDIR+1 ;STORE EXTENSION\r
+ MOVE ACPPN,INDIR+3 ;SAVE PPN\r
+ LOOKUP CHAR,INDIR\r
+ SKIPA ACEXT,INDIR+1 ;GET ERROR CODE\r
+ JRST CPOPJ1 ;SKIP-RETURN IF FOUND\r
+ TRNE ACEXT,-1 ;ERROR CODE OF 0 IS FILE NOT FOUND\r
+ JRST ERRCF ;FILE THERE BUT NOT READABLE\r
+ SETZ ACEXT, ;CLEAR EXT AND TRY AGAIN\r
+ MOVEM ACPPN,INDIR+3 ;RESTORE PPN\r
+ POPJ PP,\r
+\fREC2: MOVS [XWD CTIBUF+1,CTLSAV] ;RESCAN CONTROL (FROM PASS1 END STMNT)\r
+ BLT CTIBUF+2 ;INPUT BUFFER\r
+ MOVEI "_"\r
+ HRLM ACDELX ;FUDGE PREVIOUS DELIMITER\r
+IFN RENTSW,<MOVE HHIGH ;GET HI-SEG BREAK\r
+ MOVEM HIGH1 ;SAVE THE ONE WE GOT ON PASS1 (FOR HISEG)>\r
+ SETZM PASS2I\r
+ MOVE [XWD PASS2I,PASS2I+1]\r
+ BLT PASS2X-1 ;ZERO PASS2 VARIABLES\r
+ TLO FR,MTAPSW!LOADSW ;SET FLAGS \r
+\r
+GOTEND: MOVE INDEV ;GET LAST DEVICE\r
+ DEVCHR ;GET ITS CHARACTERISTICS\r
+ TLNE 4 ;TEST FOR DIRECTORY (DSK OR DTA)\r
+ JRST EOT ;YES, SO DON'T WASTE TIME\r
+ JRST .+3 ;NO, INPUT BUFFER BY BUFFER\r
+ IN CHAR,\r
+ JRST .-1 ;NO ERRORS\r
+ STATO CHAR,1B22 ;TEST FOR EOF\r
+ JRST .-3 ;IGNORE ERRORS\r
+\r
+EOT: PUSHJ PP,SAVEXS ;SAVE REGISTERS\r
+ PUSHJ PP,INSET ;GET THE NEXT INPUT DEVICE\r
+ HRROI RC,[SIXBIT /END OF PASS 1@/] ;ASSUME END OF PASS\r
+ TLZN FR,LOADSW ;ZERO ONLY ON END OF PASS 1\r
+ HRROI RC,[SIXBIT /LOAD THE NEXT FILE@/] ;NOT END OF PASS\r
+ TLNN ACDEV,(1B13!1B15) ;WAS ALL THAT WORK NECESSARY?\r
+ PUSHJ PP,TYPMSG ;YES\r
+\r
+RSTRXS: MOVSI RC,SAVBLK ;SET POINTER\r
+ BLT RC,RC-1 ;RESTORE REGISTERS\r
+ MOVE RC,SAVERC ;RESTORE RC\r
+ POPJ PP, ;EXIT\r
+\r
+SAVEXS: MOVEM RC,SAVERC ;SAVE RC\r
+ MOVEI RC,SAVBLK ;SET POINTER\r
+ BLT RC,SAVBLK+RC-1 ;BLT ALL REGISTERS BELOW RC\r
+ POPJ PP, ;EXIT\r
+\fNAME1: SETZM ACDEVX ;ENTRY FOR DESTINATION\r
+NAME2: SETZB ACDEV,INDIR+2 ;ENTRY FOR SOURCE\r
+ MOVEI ACFILE,0 ;CLEAR FILE\r
+ HLRZ ACDEL,ACDELX ;GET PREVIOUS DELIMITER\r
+ SETZB TIO,CS\r
+ SETZB ACEXT,INDIR+3 ;RESET EXTENSION AND PROGRAM-NUMBER PAIR\r
+ SETZM PPN ;CLEAR PPN\r
+NAME3: MOVSI ACPNTR,(POINT 6,AC0) ;SET POINTER\r
+ TDZA AC0,AC0 ;CLEAR SYMBOL\r
+\r
+SLASH: PUSHJ PP,SW0\r
+GETIOC: PUSHJ PP,TTYIN ;GET INPUT CHARACTER\r
+ CAIN C,"/"\r
+ JRST SLASH\r
+ CAIN C,"("\r
+ JRST SWITCH\r
+ CAIN C,":"\r
+ JRST DEVICE\r
+ CAIN C,"."\r
+ JRST NAME\r
+IFN CCLSW,<CAIE C,"!" ;IS CHAR AN IMPERATIVE?\r
+ CAIN C,"@"\r
+ JRST TERM ;YES, GO DO IT>\r
+ CAIE C,33 ;CHECK FOR THREE FLAVORS OF ALT-MODE\r
+ CAIN C,176 ;...\r
+ JRST TERM ;...\r
+ CAIG C,CR ;LESS THAN CR?\r
+ CAIGE C,LF ;AND GREATER THAN LF?\r
+ CAIN C,175 ;OR 3RD ALTMOD\r
+ JRST TERM ;YES\r
+IFN FTDISK,<CAIN C,"["\r
+ JRST PROGNP ;GET PROGRAMER NUMBER PAIR>\r
+ CAIN C,"=" ;EQUALS IS SAME AS LEFT ARROW\r
+ TRCA C,142 ;SO MAKE IT A "_" AND SKIP\r
+ CAIE C,","\r
+ CAIN C,"_"\r
+ JRST TERM\r
+ CAIGE C,40 ;VALID AS SIXBIT?\r
+ JRST [CAIN C,"Z"-100 ;NO,IS IT ^Z\r
+ EXIT ;YES,EXIT FOR BATCH\r
+ JRST GETIOC] ;JUST IGNORE\r
+ SUBI C,40 ;CONVERT TO 6-BIT\r
+ TLNE ACPNTR,770000 ;HAVE WE STORED SIX BYTES?\r
+ IDPB C,ACPNTR ;NO, STORE IT\r
+ JRST GETIOC ;GET NEXT CHARACTER\r
+\r
+DEVICE: JUMPN ACDEV,ERRCM ;ERROR IF ALREADY SET\r
+ MOVE ACDEV,AC0 ;DEVICE NAME\r
+ JRST DEVNAM ;COMMON CODE\r
+\r
+NAME: JUMPN ACFILE,ERRCM ;ERROR IF ALREADY SET\r
+ MOVE ACFILE,AC0 ;FILE NAME\r
+DEVNAM: MOVE ACDEL,C ;SET DELIMITER\r
+ JRST NAME3 ;GET NEXT SYMBOL\r
+\r
+TERM: JUMPE ACDEL,TERM1 ;IF NO PREVIOUS TERMINATOR, THEN FILENAME\r
+ CAIN ACDEL,"_" ;...\r
+ JRST TERM1 ;...\r
+ CAIE ACDEL,":" ;IF PREVIOUS DELIMITER\r
+ CAIN ACDEL,"," ;WAS COLON OR COMMA\r
+TERM1: MOVE ACFILE,AC0 ;SET FILE\r
+ CAIN ACDEL,"." ;IF PERIOD,\r
+ HLLZ ACEXT,AC0 ;SET EXTENSION\r
+ HRLM C,ACDELX ;SAVE PREVIOUS DELIMITER\r
+ JUMPN ACDEV,.+2 ;IF DEVICE SET USE IT\r
+ SKIPA ACDEV,ACDEVX ;OTHERWISE USE LAST DEVICE\r
+ MOVEM ACDEV,ACDEVX ;AND DEVICE\r
+ MOVE ACPPN,PPN ;PUT PPN IN RIGHT PLACE\r
+IFN FTDISK,<CAIN C,"!" ;IMPERATIVE?\r
+ POPJ PP, ;YES, DON'T ASSUME DEV\r
+ JUMPE ACFILE,CPOPJ ;IF THERE IS A FILE,\r
+ JUMPN ACDEV,.+2 ;BUT NO DEVICE\r
+ MOVSI ACDEV,(SIXBIT /DSK/) ;THEN ASSUME DISK>\r
+ POPJ PP, ;EXIT\r
+\fERRCM: HRROI RC,[SIXBIT /COMMAND ERROR@/]\r
+ JRST ERRFIN\r
+\r
+IFN FTDISK,<PROGNP:\r
+PROGN1: HRLZM RC,PPN ;COMMA, STORE LEFT HALF\r
+PROGN2: MOVEI RC,0 ;CLEAR AC\r
+PROGN3: PUSHJ PP,TTYIN\r
+ CAIN C,","\r
+ JRST PROGN1 ;STORE LEFT HALF\r
+ HRRM RC,PPN ;ASSUME TERMINAL\r
+ CAIN C,"]"\r
+ JRST GETIOC ;YES, RETURN TO MAIN SCAN\r
+IFE STANSW,<\r
+ CAIL C,"0" ;CHECK FOR VALID NUMBERS\r
+ CAILE C,"7"\r
+ JRST ERRCM ;NOT VALID\r
+ LSH RC,3 ;SHIFT PREVIOUS RESULT\r
+ ADDI RC,-"0"(C) ;ADD IN NEW NUMBER>\r
+IFN STANSW,<LSH RC,6 ;SHIFT PREVIOUS RESULT\r
+ ADDI RC,-40(C) ;PUT IN NEW CHARACTER>\r
+ JRST PROGN3 ;GET NEXT CHARACTER>\r
+\fSWITC0: PUSHJ PP,SW1 ;PROCESS CHARACTER\r
+SWITCH: PUSHJ PP,TTYIN ;GET NEXT CHARACTER\r
+ CAIE C,")" ;END OF STRING?\r
+ JRST SWITC0 ;NO\r
+ JRST GETIOC ;YES\r
+\r
+SW0: PUSHJ PP,TTYIN\r
+SW1: MOVEI C,-"A"(C) ;CONVERT FROM ASCII TO NUMERIC\r
+ CAILE C,"Z"-"A" ;WITHIN BOUNDS? (IS IT ALPHA?)\r
+ JRST ERRCM ;NO, ERROR\r
+ MOVE RC,[POINT 4,BYTAB]\r
+ IBP RC\r
+ SOJGE C,.-1 ;MOVE TO PROPER BYTE\r
+ LDB C,RC ;PICK UP BYTE\r
+ JUMPE C,ERRCM ;TEST FOR VALID SWITCH\r
+ CAIG C,SWTABT-SWTAB ;LEGAL ON SOURCE?\r
+ JUMPL PP,ERRCM ;NO, TEST FOR SOURCE\r
+ LDB RC,[POINT 4,SWTAB-1(C),12]\r
+ CAIN RC,IO\r
+ SKIPN CTLSAV ;IF PASS2 OR IO SWITCH,\r
+ XCT SWTAB-1(C) ;EXECUTE INSTRUCTION\r
+ POPJ PP, ;EXIT\r
+ TLZ IO,IOSALL ;TAKE CARE OF /X\r
+ POPJ PP,\r
+\r
+DEFINE HELP (TEXT)<\r
+ XLIST\r
+ ASCIZ ?TEXT?\r
+ LIST>\r
+\r
+HLPMES: HELP <\r
+Switches are :-\r
+/A advance one file\r
+/B backspace one file\r
+/C produce a cref listing\r
+/E list macro expansions (LALL)\r
+/F list in new format (.MFRMT)\r
+/G list in old format (.HWFRMT)\r
+/H type this text\r
+/L reinstate listing (LIST)\r
+/M suppress ascii in macro and repeat expansion (SALL)\r
+/N suppress error printout on tty\r
+/O set MLOFF pseudo-op\r
+/P increase size of the pushdown stack\r
+/Q suppress Q errors on the listing\r
+/S suppress listing (XLIST)\r
+/T rewind device\r
+/X suppress all macro expansions (XALL)\r
+/Z zero the directory\r
+Switches A,B,C,T,W,X, and Z must immediately follow\r
+the device or file to which they refer.\r
+>\r
+\f DEFINE SETSW (LETTER,INSTRUCTION) < INSTRUCTION\r
+J= <"LETTER"-"A">-^D9*<I=<"LETTER"-"A">/^D9>\r
+ SETCOD \I,J>\r
+\r
+ DEFINE SETCOD (I,J)\r
+ <BYTAB'I=BYTAB'I!<.-SWTAB>B<4*J+3>>\r
+\r
+BYTAB0= 0 ;INITIALIZE TABLE\r
+BYTAB1= 0\r
+BYTAB2= 0\r
+\r
+SWTAB:\r
+ SETSW Z,<TLO TIO,TIOCLD >\r
+ SETSW C,<TLZ FR,CREFSW >\r
+ SETSW P,<SOS PDP >\r
+SWTABT: ;THE ABOVE SW'S ARE LEGAL ON OUTPUT ONLY\r
+ SETSW A,<ADDI CS,1 >\r
+ SETSW B,<SUBI CS,1 >\r
+ SETSW E,<TLZ IO,IOPALL!IOSALL >\r
+IFN FORMSW,< SETSW F,<SETZM HWFMT>\r
+ SETSW G,<SETOM HWFMT>>\r
+ SETSW H,<OUTSTR HLPMES>\r
+ SETSW L,<TLZ IO,IOMSTR >\r
+ SETSW M,<TLO IO,IOPALL!IOSALL >\r
+ SETSW N,<HLLOS TYPERR >\r
+ SETSW O,<XCT OFFML >\r
+ SETSW Q,<TLO FR,ERRQSW >\r
+ SETSW S,<TLO IO,IOMSTR >\r
+ SETSW T,<TLO TIO,TIOLE >\r
+ SETSW W,<TLO TIO,TIORW >\r
+ SETSW X,<TLOA IO,IOPALL >\r
+\r
+BYTAB: ;BYTAB CONTAINS AN INDEX TO SWTAB\r
+ ;IT CONSIST OF 9 4BIT BYTES/WORD\r
+ ;OR ONE BYTE FOR EACH LETTER\r
+\r
+ +BYTAB0 ;A-I BYTE = 1 THROUGH 17 = INDEX\r
+ +BYTAB1 ;J-R BYTE = 0 = COMMAND ERROR\r
+ +BYTAB2 ;S-Z\r
+\r
+IF2,<PURGE I,J,BYTAB0,BYTAB1,BYTAB2>\r
+\fTTYIN: SOSGE CTIBUF+2 ;ENUF CHAR.?\r
+ JRST TTYERR ;NO\r
+ ILDB C,CTIBUF+1 ;GET CHARACTER\r
+ CAIE C," " ;SKIP BLANKS\r
+ CAIN C,HT ;AND TABS\r
+ JRST TTYIN\r
+ CAIN C,15 ;CR?\r
+ SETZM CTIBUF+2 ;YES,IGNORE REST OF LINE\r
+ CAIG C,"Z"+40 ;CHECK FOR LOWER CASE\r
+ CAIGE C,"A"+40\r
+ POPJ PP, ;NO,EXIT\r
+ SUBI C,40\r
+ POPJ PP, ;YES, EXIT\r
+\r
+TTYERR: SKIPN INDEV ;INPUT DEVICE SEEN?\r
+ JRST ERRCM ;NO, SO MISSING "_"\r
+ERRNE: HRROI RC,[SIXBIT /?NO END STATEMENT ENCOUNTERED ON INPUT FILE@/]\r
+ERRNE0: SKPINC V ;SEE IF WE CAN INPUT A CHAR.\r
+ JFCL ;BUT ONLY TO DEFEAT ^O\r
+ PUSHJ PP,TYPMSG ;OUTPUT IT\r
+ SKIPE LITLVL ;SEE IF IN LITERAL\r
+ SKIPN LITPG ;PAGE 0 MEANS NOT IN A LITERAL REALY\r
+ JRST ERRNE1 ;NO, TRY OTHERS\r
+ MOVE V,[XWD [SIXBIT /IN LITERAL@/],LITPG]\r
+ PUSHJ PP,PRNUM ;GO PRINT INFORMATION\r
+ERRNE1: MOVEI V,0 ;CHECK FOR OTHER PLACES\r
+ SKIPE INDEF\r
+ MOVE V,[XWD [SIXBIT /IN DEFINE@/],DEFPG]\r
+ SKIPE INTXT\r
+ MOVE V,[XWD [SIXBIT /IN TEXT@/],TXTPG]\r
+ SKIPE INREP\r
+ MOVE V,[XWD [SIXBIT /IN CONDITIONAL OR REPEAT@/],REPPG]\r
+ SKIPE INCND\r
+ MOVE V,[XWD [SIXBIT /IN CONDITIONAL@/],CNDPG]\r
+ SKIPGE MACENL\r
+ERRNE2: MOVE V,[XWD [SIXBIT /IN MACRO CALL@/],CALPG]\r
+ JUMPN V,ERRNE3\r
+ SKIPN LITLVL ;HAD ONE PAGE NUMBER ALREADY\r
+ SKIPA V,[XWD [SIXBIT /@/],PAGENO] ;BETTER THAN NOTHING\r
+ JRST .+2\r
+ERRNE3: PUSHJ PP,PRNUM\r
+ HRROI RC,[SIXBIT /@/] ;WILL GET A RETURN\r
+ JRST ERRFIN\r
+\r
+ERRMS1: SIXBIT / ERRORS DETECTED@/\r
+ERRMS2: SIXBIT /?1 ERROR DETECTED@/\r
+ERRMS3: SIXBIT /NO ERRORS DETECTED@/\r
+EINIT: MOVE RC,[XWD ACDEV,[SIXBIT /NOT AVAILABLE@/]]\r
+ JRST ERRFIN\r
+\fERRCL: HRRZ RC,LSTDIR+1 ;GET LST DEV ERROR CODE\r
+ JRST .+2 ;GET ERROR MESSAGE\r
+ERRCB: HRRZ RC,BINDIR+1 ;GET BIN DEV ERROR CODE\r
+ JUMPN RC,ERRTYP\r
+ SOJA RC,ERRTYP ;SPECIAL CASE IF ERROR CODE 0\r
+\r
+ERRCF: HRRZ RC,INDIR+1 ;GET INPUT DEV ERROR CODE\r
+ HLLZ ACEXT,INDIR+1 ;SET UP EXT\r
+\r
+ERRTYP: CAIL RC,TABLND-TABLE ;IS ERROR CODE LEGAL?\r
+ SKIPA RC,TABLND ;NO, GIVE CATCH ALL MESSAGE\r
+ MOVE RC,TABLE(RC) ;YES, PICK UP MESSAGE\r
+\r
+ERRFIN: SKPINC C ;SEE IN WE CAN INPUT A CHAR.\r
+ JFCL ;BUT ONLY TO DEFEAT ^O\r
+ PUSHJ PP,CRLF\r
+ MOVEI C,"?"\r
+ PUSHJ PP,TYO\r
+ PUSHJ PP,TYPMS1\r
+ CLOSE LST, ;GIVE USER A PARTIAL LISTING\r
+ CLOSE BIN,40 ;BUT NEVER A BUM REL FILE\r
+IFN CCLSW,<AOS JOBERR ;RECORD ERROR SO EXECUTION DELETED>\r
+ JRST M\r
+\r
+ [SIXBIT /(0) ILLEGAL FILE NAME@/],,ACFILE\r
+TABLE: [SIXBIT /(0) FILE WAS NOT FOUND@/],,ACFILE\r
+ [SIXBIT /(1) NO DIRECTORY FOR PROJECT-PROGRAMMER NUMBER@/],,ACFILE\r
+ [SIXBIT /(2) PROTECTION FAILURE@/],,ACFILE\r
+ [SIXBIT /(3) FILE WAS BEING MODIFIED@/],,ACFILE\r
+ [SIXBIT /(4) RENAME FILE NAME ALREADY EXISTS@/],,ACFILE\r
+ [SIXBIT /(5) ILLEGAL SEQUENCE OF UUOS@/],,ACFILE\r
+ [SIXBIT /(6) BAD UFD OR BAD RIB@/],,ACFILE\r
+ [SIXBIT /(7) NOT A SAV FILE@/],,ACFILE\r
+ [SIXBIT /(10) NOT ENOUGH CORE@/],,ACFILE\r
+ [SIXBIT /(11) DEVICE NOT AVAILABLE@/],,ACFILE\r
+ [SIXBIT /(12) NO SUCH DEVICE@/],,ACFILE\r
+ [SIXBIT /(13) NOT TWO RELOC REG. CAPABILITY@/],,ACFILE\r
+ [SIXBIT /(14) NO ROOM OR QUOTA EXCEEDED@/],,ACFILE\r
+ [SIXBIT /(15) WRITE LOCK ERROR@/],,ACFILE\r
+ [SIXBIT /(16) NOT ENOUGH MONITOR TABLE SPACE@/],,ACFILE\r
+ [SIXBIT /(17) PARTIAL ALLOCATION ONLY@/],,ACFILE\r
+ [SIXBIT /(20) BLOCK NOT FREE ON ALLOCATION@/],,ACFILE\r
+ [SIXBIT /(21) CAN'T SUPERSEDE (ENTER) AN EXISTING DIRECTORY@/],,ACFILE\r
+ [SIXBIT /(22) CAN'T DELETE (RENAME) A NON-EMPTY DIRECTORY@/],,ACFILE\r
+ [SIXBIT /(23) SFD NOT FOUND@/],,ACFILE\r
+ [SIXBIT /(24) SEARCH LIST EMPTY@/],,ACFILE\r
+ [SIXBIT /(25) SFD NESTED TOO DEEPLY@/],,ACFILE\r
+ [SIXBIT /(26) NO-CREATE ON FOR SPECIFIED PATH@/],,ACFILE\r
+\r
+TABLND: [SIXBIT /(?) LOOKUP, ENTER, OR RENAME ERROR@/],,ACFILE\r
+\fTYPMSG: PUSHJ PP,CRLF ;MOVE TO NEXT LINE\r
+TYPMS1: HLRZ CS,RC ;GET FIRST MESSAGE\r
+ CAIE CS,-1 ;SKIP IF MINUS ONE\r
+ PUSHJ PP,TYPM2 ;TYPE MESSAGE\r
+ HRRZ CS,RC ;GET SECOND HALF\r
+ PUSHJ PP,TYPM2\r
+\r
+CRLF: MOVEI C,CR ;OUTPUT CARRIAGE RETURN\r
+ PUSHJ PP,TYO\r
+ MOVEI C,LF ;AND LINE FEED\r
+\r
+TYO: SOSG CTOBUF+2 ;BUFFER FULL?\r
+ OUTPUT CTL,0 ;YES, DUMP IT\r
+ IDPB C,CTOBUF+1 ;STORE BYTE\r
+ CAIG C,FF ;FORM FEED?\r
+ CAIGE C,LF ;V TAB OR LINE FEED?\r
+ POPJ PP, ;NO\r
+ OUTPUT CTL,0 ;YES\r
+ POPJ PP, ;AND EXIT\r
+\r
+TYPM2: MOVSI C,(1B0) ;ANTICIPATE REGISTER WORD\r
+ CAIN CS,ACFILE ;FILE NAME ?\r
+ JRST [JUMPE ACEXT,.+1 ;YES, TEST FOR EXT\r
+ LSH ACEXT,-6 ;MAKE SPACE FOR "."\r
+ IOR ACEXT,[SIXBIT /. @/]\r
+ JRST TYPM2A]\r
+ CAIG CS,17 ;IS IT?\r
+ MOVEM C,1(CS)\r
+TYPM2A: HRLI CS,(POINT 6,,) ;FORM BYTE POINTER\r
+\r
+TYPM3: ILDB C,CS ;GET A SIXBIT BYTE\r
+ CAIN C,40 ;"@"?\r
+ JRST TYO ;YES, TYPE SPACE AND EXIT\r
+ ADDI C,40 ;NO, FORM 7-BIT ASCII\r
+ PUSHJ PP,TYO ;OUTPUT CHARACTER\r
+ JRST TYPM3\r
+\r
+\fXCEEDS: ADDI SX,2000 ;ADJUST SYMBOL POINTER\r
+XCEED: PUSHJ PP,SAVEXS ;SAVE THE REGISTERS\r
+ HRRZ 1,JOBREL ;GET CURRENT TOP\r
+ MOVEI 0,2000(1)\r
+ CORE 0, ;REQUEST MORE CORE\r
+ JRST XCEED2 ;ERROR, BOMB OUT\r
+ HRRZ 2,JOBREL ;GET NEW TOP\r
+\r
+XCEED1: MOVE 0,0(1) ;GET ORIGIONAL\r
+ MOVEM 0,0(2) ;STORE IN NEW LOCATION\r
+ SUBI 2,1 ;DECREMENT UPPER\r
+ CAMLE 1,SYMBOL ;HAVE WE ARRIVED?\r
+ SOJA 1,XCEED1 ;NO, GET ANOTHER\r
+ MOVEI 1,2000\r
+ ADDM 1,SYMBOL\r
+ ADDM 1,SYMTOP\r
+ PUSHJ PP,SRCHI ;RE-INITIALIZE SYMBOL TABLE\r
+ JRST RSTRXS ;RESTORE REGISTERS AND EXIT\r
+\r
+XCEED2: HRROI RC,[SIXBIT /INSUFFICIENT CORE@/]\r
+ JRST ERRNE0\r
+PDPERR: HRROI RC,[SIXBIT .PDP OVERFLOW, TRY /P@.]\r
+ JRST ERRNE0\r
+\r
+PRNUM: HLRZ CS,V ;GET MESSAGE\r
+ PUSHJ PP,TYPM2\r
+ MOVEI CS,[SIXBIT /ON PAGE@/]\r
+ PUSHJ PP,TYPM2\r
+ MOVE AC0,(V) ;GET PAGE\r
+ PUSHJ PP,DP1 ;PRINT NUMBER\r
+ MOVEI C,40\r
+ PUSHJ PP,TYO\r
+ SKIPN AC1,1(V) ;GET SEQ NUM IF THERE\r
+ POPJ PP, ;NO, RETURN\r
+ MOVEM AC1,OUTSQ\r
+ MOVEI CS,[SIXBIT /LINE@/]\r
+ PUSHJ PP,TYPM2\r
+ MOVEI AC0,OUTSQ ;PRINT IT\r
+ OUTPUT CTL,0 ;TO MAKE THINGS PRINT IN RIGHT ORDER\r
+ DDTOUT AC0,\r
+ MOVEI C,40\r
+ JRST TYO ;AND RETURN\r
+\r
+DP1: IDIVI AC0,^D10\r
+ HRLM AC1,(PP)\r
+ JUMPE AC0,.+2\r
+ PUSHJ PP,DP1\r
+ HLRZ C,(PP)\r
+ ADDI C,"0"\r
+ JRST TYO\r
+\fRIM0: TDO FR,AC0 ;SET RIM/RIM10 FLAG\r
+ TLNE FR,PNCHSW ;FORGET IT IF PUNCH RESET\r
+ SETSTS BIN,IB ;SET TO IMAGE BINARY MODE\r
+ POPJ PP,\r
+\r
+ROUT: EXCH CS,RIMLOC\r
+ SUB PP,[XWD 1,1] ;CLEAR OUT STACK WFW\r
+ TLNE FR,R1BSW\r
+ JRST ROUT6\r
+ TLNN FR,RIM1SW\r
+ JRST ROUT1\r
+ JUMPE CS,ROUT1 ;RIM10 OUTPUT\r
+ SUB CS,RIMLOC\r
+ JUMPE CS,ROUT1\r
+ JUMPG CS,ERRAX\r
+ MOVEI C,0\r
+ PUSHJ PP,PTPBIN\r
+ AOJL CS,.-1\r
+ROUT1: MOVSI C,(DATAI PTR,) ;RIM OUTPUT\r
+ HRR C,LOCO ;GET ADDRESS\r
+ TLNE FR,RIM1SW ;NO DATAI IF RIM10\r
+ AOSA RIMLOC\r
+ PUSHJ PP,PTPBIN ;OUTPUT\r
+ MOVE C,AC0 ;CODE\r
+ AOSA LOCO ;INCREMENT CURRENT LOCATION\r
+\r
+OUTBIN: TLNN FR,RIMSW!RIM1SW!R1BSW ;EXIT IF RIM MODE\r
+PTPBIN: TLNN FR,PNCHSW ;EXIT IF PUNCH NOT REQUESTED\r
+ POPJ PP,\r
+ SOSG BINBUF+2 ;TEST FOR BUFFER FULL\r
+ PUSHJ PP,DMPBIN ;YES, DUMP IT\r
+ IDPB C,BINBUF+1 ;DEPOSIT BYTE\r
+ POPJ PP, ;EXIT\r
+\r
+\fDMPBIN: OUT BIN,0 ;DUMP THE BUFFER\r
+ POPJ PP, ;NO ERRORS\r
+TSTBIN: GETSTS BIN,C ;GET STSTUS BITS\r
+ TRNN C,ERRBIT ;ERROR?\r
+ POPJ PP, ;NO, EXIT\r
+ MOVE AC0,BINDEV ;YES, GET TAG\r
+ JRST ERRLST ;TYPE MESSAGE AND ABORT\r
+\r
+DMPLST: OUT LST,0 ;OUTPUT BUFFER\r
+ POPJ PP, ;NO ERRORS\r
+TSTLST: GETSTS LST,C ;ANY ERRORS?\r
+ TRNN C,ERRBIT\r
+ POPJ PP, ;NO, EXIT\r
+ MOVE AC0,LSTDEV\r
+ERRLST: MOVSI RC,[SIXBIT /OUTPUT WRITE-LOCK ERROR DEVICE@/]\r
+ TRNE C,IOIMPM ;IMPROPER MODE?\r
+ JRST ERRFIN ;YES\r
+ MOVSI RC,[SIXBIT /OUTPUT DATA ERROR DEVICE@/]\r
+ TRNE C,IODERR ;DEVICE DATA ERROR?\r
+ JRST ERRFIN ;YES\r
+ MOVSI RC,[SIXBIT /OUTPUT CHECKSUM OR PARITY ERROR DEVICE@/]\r
+ TRNE C,IODTER ;IS IT\r
+ JRST ERRFIN ;YES\r
+ MOVE CS,AC0 ;GET DEVICE\r
+ DEVCHR CS, ;FIND OUT WHAT IT IS\r
+ MOVSI RC,[SIXBIT /OUTPUT QUOTA EXCEEDED ON DEVICE@/]\r
+ TLNN CS,DSKBIT ;SKIP IF DSK OUTPUT\r
+ MOVSI RC,[SIXBIT /OUTPUT BLOCK TOO LARGE DEVICE@/]\r
+ JRST ERRFIN\r
+\f \r
+R1BDMP: SETCM CS,R1BCNT\r
+ JUMPE CS,R1BI\r
+ HRLZS C,CS\r
+ HRR C,R1BLOC\r
+ HRRI C,-1(C)\r
+ MOVEM C,R1BCHK\r
+ PUSHJ PP,PTPBIN\r
+ HRRI CS,R1BBLK\r
+R1BDM1: MOVE C,0(CS)\r
+ ADDM C,R1BCHK\r
+ PUSHJ PP,PTPBIN\r
+ AOBJN CS,R1BDM1\r
+ MOVE C,R1BCHK\r
+ PUSHJ PP,PTPBIN\r
+R1BI: SETOM R1BCNT\r
+ PUSH PP,LOCO\r
+ POP PP,R1BLOC\r
+ POPJ PP,\r
+\r
+ROUT6: CAME CS,RIMLOC\r
+ PUSHJ PP,R1BDMP\r
+ AOS C,R1BCNT\r
+ MOVEM AC0,R1BBLK(C)\r
+ AOS LOCO\r
+ CAIN C,.R1B-1\r
+ PUSHJ PP,R1BDMP\r
+ AOS RIMLOC\r
+ POPJ PP,\r
+ \r
+\r
+\fREAD0: PUSHJ PP,EOT ;END OF TAPE\r
+\r
+READ: SOSGE IBUF+2 ;BUFFER EMPTY?\r
+ JRST READ3 ;YES\r
+READ1: ILDB C,IBUF+1 ;PLACE CHARACTER IN C\r
+ MOVE CS,@IBUF+1 ;CHECK FOR SEQUENCE NUMBER\r
+ TRNN CS,1\r
+ JRST READ1A\r
+ CAIN CS,1 ;CHECK FOR SPECIAL\r
+ MOVE CS,[<ASCII/ />+1]\r
+ MOVEM CS,SEQNO\r
+ MOVEM CS,SEQNO2\r
+ MOVNI CS,4\r
+ ADDM CS,IBUF+2 ;ADJUST WORD COUNT\r
+REPEAT 4,< IBP IBUF+1> ;SKIP SEQ NO\r
+ PUSHJ PP,READ ;AND THE TAB\r
+ JRST READ ;GET NEXT CHARACTER\r
+\r
+READ1A: JUMPE C,READ ;IGNORE NULL\r
+ CAIN C,32 ;IF IT'S A "^Z"\r
+ MOVEI C,LF ;TREAT IT AS A "LF"\r
+ CAIE C,37 ;CONTROL _\r
+ POPJ PP,\r
+ MOVEI C,"^" ;MAKE CONTROL-SHIFT _ VISIBLE\r
+ PUSHJ PP,RSW2\r
+ MOVEI C,"_"\r
+ PUSHJ PP,RSW2\r
+READ2: PUSHJ PP,READ ;YES, TEST FOR LINE FEED\r
+ PUSHJ PP,RSW2 ;LIST IN ANY EVENT\r
+ CAIG C,FF ;IS IT ONE OF\r
+ CAIGE C,LF ;LF, VT, OR FF?\r
+ JRST READ2 ;NO\r
+ PUSHJ PP,OUTIM1 ;YES, DUMP THE LINE\r
+ JRST READ ;RETURN NEXT CHARACTER\r
+\r
+READ3: IN CHAR,0 ;GET NEXT BUFFER\r
+ JRST READ ;NO ERRORS\r
+ GETSTS CHAR,C\r
+ TRNN C,ERRBIT!2000 ;ERRORS?\r
+ JRST READ0 ;EOF\r
+ MOVE AC0,INDEV\r
+ MOVSI RC,[SIXBIT/ INPUT PHYSICAL END OF TAPE DEVICE@/]\r
+ TRNE C,2000\r
+ JRST ERRFIN ;E-O-T\r
+ MOVSI RC,[SIXBIT /MONITOR DETECTED SOFTWARE INPUT ERROR DEVICE@/]\r
+ TRNE C,IOIMPM ;IMPROPER MODE?\r
+ JRST ERRFIN ;YES\r
+ MOVSI RC,[SIXBIT /INPUT DATA ERROR DEVICE@/]\r
+ TRNE C,IODERR ;DEVICE DATA ERROR?\r
+ JRST ERRFIN ;YES\r
+ MOVSI RC,[SIXBIT /INPUT CHECKSUM OR PARITY ERROR DEVICE@/]\r
+ TRNN C,IODTER\r
+ MOVSI RC,[SIXBIT /INPUT BLOCK TOO LARGE DEVICE@/]\r
+ JRST ERRFIN\r
+\r
+\fOUTAB2: PUSHJ PP,OUTTAB ;PRINT TWO TABS\r
+OUTTAB: MOVEI C,HT\r
+PRINT: CAIE C,CR ;IS THIS A CR?\r
+ CAIN C,LF ;OR LF?\r
+ JRST OUTCR ;YES, GO PROCESS\r
+ CAIN C,FF ;FORM FEED?\r
+ JRST OUTFF ;YES, FORCE NEW PAGE\r
+ JRST OUTL\r
+\r
+OUTCR: TRNN ER,ERRORS!LPTSW!TTYSW\r
+ POPJ PP,\r
+ MOVEI C,CR ;CARRIAGE RETURN, LINE FEED\r
+ PUSHJ PP,OUTL\r
+ SOSGE LPP ;END OF PAGE?\r
+ TLO IO,IOPAGE ;YES, SET FLAG\r
+ TRCA C,7 ;FORM LINE FEED AND SKIP\r
+\r
+OUTL: TLZN IO,IOPAGE ;NEW PAGE REQUESTED?\r
+ JRST OUTC ;NO\r
+ JUMP1 OUTC ;YES, BYPASS IF PASS ONE\r
+ PUSH PP,C ;SAVE C AND CS\r
+ PUSH PP,CS\r
+ PUSH PP,ER\r
+ TLNN IO,IOMSTR!IOPROG\r
+ HRR ER,OUTSW\r
+ TLNE IO,IOCREF ;IF DOING CREF OUTPUT NOW\r
+ TLNE FR,CREFSW ;AND CREFFING (JUST IN CASE)\r
+ JRST .+2\r
+ PUSHJ PP,CLSC3 ;CLOSE IT OUT\r
+ HLLM IO,(PP) ;SAVE THIS NEW STATE OF IO\r
+ MOVEI C,.LPP\r
+ MOVEM C,LPP ;SET NEW COUNTER\r
+ MOVEI C,CR\r
+ PUSHJ PP,OUTC\r
+ MOVEI C,FF\r
+ PUSHJ PP,OUTC ;OUTPUT FORM FEED\r
+ MOVEI CS,TBUF\r
+ PUSHJ PP,OUTAS0 ;OUTPUT TITLE\r
+ MOVEI CS,VBUF\r
+ PUSHJ PP,OUTAS0 ;OUTPUT VERSION\r
+ MOVEI CS,DBUF\r
+ PUSHJ PP,OUTAS0 ; AND DATE\r
+ MOVE C,PAGENO\r
+ PUSHJ PP,DNC ;OUTPUT PAGE NUMBER\r
+ AOSG PAGEN. ;FIRST PAGE OF THIS NUMBER?\r
+ JRST OUTL1 ;YES\r
+ MOVEI C,"-" ;NO, PUT OUT MODIFIER\r
+ PUSHJ PP,OUTC\r
+ MOVE C,PAGEN.\r
+ PUSHJ PP,DNC\r
+OUTL1: PUSHJ PP,OUTCR\r
+ MOVEI CS,DEVBUF\r
+ PUSHJ PP,OUTAS0\r
+ HRRZ CS,SUBTTX ;SWITCH FOR SUB-TITLE\r
+ SKIPE 0(CS) ;IS THERE A SUB-TITLE?\r
+ PUSHJ PP,OUTTAB ;YES, OUTPUT A TAB\r
+ PUSHJ PP,SOUT20 ;OUTPUT ASCII WITH CARRIAGE RETURN\r
+ PUSHJ PP,OUTCR\r
+ POP PP,ER\r
+ POP PP,CS ;RESTORE REGISTERS\r
+ POP PP,C\r
+\r
+OUTC: TRNE ER,ERRORS!TTYSW\r
+ PUSHJ PP,TYO\r
+ TRNN ER,LPTSW\r
+ POPJ PP,\r
+OUTLST: SOSG LSTBUF+2 ;BUFFER FULL?\r
+ PUSHJ PP,DMPLST ;YES, DUMP IT\r
+COMMENT $ REG DOESN'T LIKE THIS FEATURE ANY MORE 9-5-72\r
+IFN STANSW,< CAIN C,"@"\r
+ MOVEI C,140\r
+ CAIN C,"_"\r
+ MOVEI C,30\r
+ CAIN C,"^"\r
+ MOVEI C,32\r
+ CAIE C,"\"\r
+ JRST OUTLSS\r
+ MOVEI C,177\r
+ IDPB C,LSTBUF+1\r
+ JRST OUTLST\r
+OUTLSS: >\r
+$\r
+ IDPB C,LSTBUF+1 ;STORE BYTE\r
+ POPJ PP, ;EXIT\r
+\r
+\fPAGE0: PUSHJ PP,STOUTS ;PAGE PSEUDO-OP\r
+OUTFF1: TLNE IO,IOCREF ;CURRENTLY DOING CREF?\r
+ TLNE IO,IOPROG ;AND NOT XLISTED?\r
+ JRST OUTFF ;NO\r
+ HRR ER,OUTSW\r
+ PUSHJ PP,CLSCRF\r
+ PUSHJ PP,OUTCR\r
+ HRRI ER,0\r
+OUTFF: TLO IO,IOPAGE\r
+OUTFF2: SETOM PAGEN.\r
+ AOS PAGENO\r
+ POPJ PP,\r
+\r
+TIMOUT: IDIVI 2,^D60*^D1000\r
+TIMOU1: IDIVI 2,^D60\r
+ PUSH PP,3 ;SAVE MINUTES\r
+ PUSHJ PP,OTOD ;STORE HOURS\r
+ MOVEI 3,":" ;SEPARATE BY COLON\r
+ IDPB 3,CS\r
+ POP PP,2 ;STORE MINUTES\r
+OTOD: IDIVI 2,^D10\r
+ ADDI 2,60 ;FORM ASCII\r
+ IDPB 2,CS\r
+ ADDI 3,60\r
+ IDPB 3,CS\r
+ POPJ PP,\r
+\r
+DATOUT: IDIVI 1,^D31 ;GET DAY\r
+ ADDI 2,1\r
+ CAIG 2,^D9 ;TWO DIGITS?\r
+ ADDI 2,7760*^D10 ;NO, PUT IN SPACE\r
+ PUSHJ PP,OTOD ;STORE DAY\r
+ IDIVI 1,^D12 ;GET MONTH\r
+ MOVE 2,DTAB(2) ;GET MNEMONIC\r
+ IDPB 2,CS ;DEPOSIT RIGHT MOST 7 BITS\r
+ LSH 2,-7 ;SHIFT NEXT IN\r
+ JUMPN 2,.-2 ;DEPOSIT IFIT EXISTS\r
+ MOVEI 2,^D64(1) ;GET YEAR\r
+ JRST OTOD ;STORE IT\r
+\r
+DTAB: "-NAJ-"\r
+ "-BEF-"\r
+ "-RAM-"\r
+ "-RPA-"\r
+ "-YAM-"\r
+ "-NUJ-"\r
+ "-LUJ-"\r
+ "-GUA-"\r
+ "-PES-"\r
+ "-TCO-"\r
+ "-VON-"\r
+ "-CED-"\r
+\fSUBTTL MACHINE INSTRUCTION SEARCH ROUTINES\r
+IFE OPHSH,<\r
+OPTSCH: MOVEI RC,0\r
+ MOVEI ARG,1B^L<OP1END-OP1TOP> ;SET UP INDEX\r
+ MOVEI V,1B^L<OP1END-OP1TOP>/2 ;SET UP INCREMENT\r
+\r
+OPT1A: CAMN AC0,OP1TOP(ARG) ;ARE WE POINTING AT SYMBOL?\r
+ JRST OPT1D ;YES, GET THE CODE\r
+ JUMPE V,POPOUT ;TEST FOR END\r
+ CAML AC0,OP1TOP(ARG) ;NO, SHOULD WE MOVE DOWN?\r
+ TDOA ARG,V ;NO, INCREMENT\r
+OPT1B: SUB ARG,V ;YES, DECREMENT\r
+ ASH V,-1 ;HALVE INCREMENT\r
+ CAIG ARG,OP1END-OP1TOP ;ARE WE OUT OF BOUNDS?\r
+ JRST OPT1A ;NO, TRY AGAIN\r
+ JRST OPT1B ;YES, BRING IT DOWN A PEG\r
+>\r
+\r
+IFN OPHSH,<\r
+OPTSCH: MOVE ARG,AC0 ;GET SIXBIT NAME\r
+ TLZ ARG,400000 ;CLEAR SIGN BIT\r
+ IDIVI ARG,PRIME ;REM. GOES IN V\r
+ CAMN AC0,OP1TOP(V) ;ARE WE POINTING AT SYMBOL?\r
+ JRST OPT1D ;YES\r
+ SKIPN OP1TOP(V) ;TEST FOR END\r
+ POPJ PP, ;SYMBOL NOT FOUND\r
+ HLRZ RC,ARG ;SAVE LHS OF QUOTIENT\r
+ SKIPA ARG,RC ;GET IT BACK\r
+OPT1A: ADDI ARG,(RC) ;INCREMENT ARG\r
+ ADDI V,(ARG) ;QUADRATIC INCREASE TO V\r
+ CAIL V,PRIME ;V IS MODULO PRIME\r
+ JRST [SUBI V,PRIME\r
+ JRST .-1]\r
+ CAMN AC0,OP1TOP(V) ;IS THIS IT?\r
+ JRST OPT1D ;YES\r
+ SKIPE OP1TOP(V) ;END?\r
+ JRST OPT1A ;TRY AGAIN\r
+ POPJ PP, ;FAILED\r
+>\r
+OPT1D:\r
+IFN OPHSH,< SETZ RC, ;CLEAR RELOCATION\r
+ MOVE ARG,V ;GET INDEX IN RIGHT ACC.>\r
+ IDIVI ARG,4 ;ARG HAS INDEX USED IN OPTTAB\r
+ LDB V,OPTTAB(V) ;V HAS INDEX TO OPTTAB\r
+ CAIL V,700 ;PSEUDO-OP OR IO INSTRUCTION?\r
+ JRST OPT1G ;YES\r
+ ROT V,-^D9 ;LEFT JUSTIFY\r
+ HRRI V,OP ;POINT TO BASIC FORMAT\r
+OPT1F: AOS 0(PP) ;SET FOR SKIP EXIT\r
+ MOVEI SDEL,%OP ;SET OP-CODE CROSS-REF FLAG\r
+ JRST CREF ;TEST AND OUTPUT, AC0=SYMBOL, V=VALUE\r
+\r
+OPT1G: JUMPG AC0,.+3 ;IF ".","$",OR "%" USE TABLE 1\r
+ TLNN AC0,200000 ;PSEUDO-OP OR IO INST., TEST FOR PROPER TABLE\r
+ SKIPA V,OP2TAB-700(V) ;2ND TABLE, FIRST LETTER IS "A" TO "O"\r
+ MOVE V,OP1TAB-700(V) ;1ST TABLE, ..."P" TO "Z"\r
+ JRST OPT1F ;EXIT\r
+\r
+OPTTAB:\r
+IFE OPHSH,< POINT 9,OP1COD-1(ARG),35>\r
+ POINT 9,OP1COD (ARG), 8\r
+ POINT 9,OP1COD (ARG),17\r
+ POINT 9,OP1COD (ARG),26\r
+IFN OPHSH,< POINT 9,OP1COD (ARG),35>\r
+\r
+\fIFDEF .XCREF,< .XCREF ;DON'T CREF THIS MESS>\r
+IFE OPHSH,<\r
+ RELOC .-1\r
+OP1TOP:\r
+ RELOC\r
+\r
+ IF1,<N1=0\r
+ DEFINE X <N1=N1+1 ;>>\r
+\r
+ IF2, <\r
+ N2=^D36\r
+ CC=0\r
+ RELOC OP1COD\r
+ RELOC\r
+DEFINE X (SYMBOL,CODE) \r
+<SIXBIT /SYMBOL/\r
+CC=CC+CODE_<N2=N2-9>\r
+IFE N2, <OUTLIT>>\r
+\r
+DEFINE OUTLIT <\r
+ RELOC\r
+ +CC\r
+ RELOC\r
+N2=^D36+<CC=0>>>\r
+ SYN X,XX ;JUST THE SAME MACRO>\r
+\f\r
+IFN OPHSH,<\r
+DEFINE XX (SB,CD)<> ;A NUL MACRO\r
+OP1TOP: IF1,< BLOCK PRIME>\r
+IF1,<DEFINE X (SB,CD)<>>\r
+IF2,<\r
+DEFINE OPSTOR (RM)<.$'RM=.$'RM+<OPCODE_<9*<3-R&3>>>>\r
+\r
+DEFINE X (SB,CD)<\r
+SXB=<SIXBIT /SB/>\r
+Q=SXB&-1_-1/PRIME\r
+R=SXB&-1_-1-Q*PRIME\r
+H=Q_-22&777\r
+TRY=1\r
+OPCODE=CD\r
+ITEM Q,\R\r
+IFL PRIME-TRY,<PRINTX HASH FAILURE>>\r
+\r
+DEFINE ITEM (QT,RM)<\r
+IFN .%'RM,<R=R+H\r
+IFL PRIME-R,<R=R-R/PRIME*PRIME>\r
+H=H+Q_-22&777\r
+IFGE PRIME-<TRY=TRY+1>,<ITEM Q,\R>>\r
+IFE .%'RM,<.%'RM=SXB\r
+OPSTOR \<R/4>>>>\r
+IF1,<\r
+DEFINE GETSYM (N)<.%'N=0>\r
+\r
+N=0\r
+ XLIST\r
+REPEAT PRIME,<GETSYM \N\r
+N=N+1>\r
+DEFINE GETSYM (N)<.$'N=0>\r
+N=0\r
+REPEAT <PRIME/4+1>,<GETSYM \N\r
+N=N+1>\r
+>\r
+ LIST>\r
+\r
+;MACRO TO HANDLE KI10 OP-CODES\r
+IFE KI10,<\r
+DEFINE XK (SB,CD) <> ;NUL MACRO>\r
+IFN KI10,<SYN X,XK ;USUAL X MACRO>\r
+\fIFN OPHSH,< ;PUT THE MOST USED OP CODES FIRST\r
+X JRST , 254\r
+X PUSHJ , 260\r
+X POPJ , 263\r
+X PUSH , 261\r
+X POP , 262\r
+X AOS , 350\r
+X ASCIZ , 701\r
+X CALLI , 047\r
+X EXTERN, 724\r
+X INTERN, 744\r
+X JFCL , 255\r
+X JSP , 265\r
+X MOVE , 200\r
+X MOVEI , 201\r
+X MOVEM , 202\r
+X SETZM , 402\r
+X SIXBIT, 717\r
+X SOS , 370\r
+X TLNE , 603\r
+X TLNN , 607\r
+X TLO , 661\r
+X TLZ , 621\r
+X TLZA , 625\r
+X TLZE , 623\r
+X TLZN , 627\r
+X TRNE , 602\r
+X TRNN , 606\r
+X TRZ , 620\r
+>\r
+\fX ADD , 270\r
+X ADDB , 273\r
+X ADDI , 271\r
+X ADDM , 272\r
+\r
+X AND , 404\r
+X ANDB , 407\r
+X ANDCA , 410\r
+X ANDCAB, 413\r
+X ANDCAI, 411\r
+X ANDCAM, 412\r
+X ANDCB , 440\r
+X ANDCBB, 443\r
+X ANDCBI, 441\r
+X ANDCBM, 442\r
+X ANDCM , 420\r
+X ANDCMB, 423\r
+X ANDCMI, 421\r
+X ANDCMM, 422\r
+X ANDI , 405\r
+X ANDM , 406\r
+\r
+X AOBJN , 253\r
+X AOBJP , 252\r
+\r
+X AOJ , 340\r
+X AOJA , 344\r
+X AOJE , 342\r
+X AOJG , 347\r
+X AOJGE , 345\r
+X AOJL , 341\r
+X AOJLE , 343\r
+X AOJN , 346\r
+\r
+XX AOS , 350\r
+X AOSA , 354\r
+X AOSE , 352\r
+X AOSG , 357\r
+X AOSGE , 355\r
+X AOSL , 351\r
+X AOSLE , 353\r
+X AOSN , 356\r
+X ARG , 320\r
+IFN WFWSW,<X ARRAY , 772>\r
+IFN IIISW,<X ASCID , 771>\r
+X ASCII , 700\r
+XX ASCIZ , 701\r
+\r
+X ASH , 240\r
+X ASHC , 244\r
+\r
+X ASUPPR, 705\r
+X BLKI , 702\r
+X BLKO , 703\r
+X BLOCK , 704\r
+\r
+X BLT , 251\r
+\r
+X BYTE , 707\r
+\r
+XX CAI , 300\r
+X CAIA , 304\r
+X CAIE , 302\r
+X CAIG , 307\r
+X CAIGE , 305\r
+X CAIL , 301\r
+X CAILE , 303\r
+X CAIN , 306\r
+\r
+X CALL , 040\r
+XX CALLI , 047\r
+\r
+XX CAM , 310\r
+X CAMA , 314\r
+X CAME , 312\r
+X CAMG , 317\r
+X CAMGE , 315\r
+X CAML , 311\r
+X CAMLE , 313\r
+X CAMN , 316\r
+\r
+XX CLEAR , 400\r
+XX CLEARB, 403\r
+XX CLEARI, 401\r
+XX CLEARM, 402\r
+\r
+X CLOSE , 070\r
+X COMMEN, 770\r
+\r
+\r
+X CONI , 710\r
+X CONO , 711\r
+IFN STANSW,<X CONS,257>\r
+X CONSO , 712\r
+X CONSZ , 713\r
+\r
+XX DATA. , 020\r
+\r
+X DATAI , 714\r
+X DATAO , 715\r
+X DEC , 716\r
+X DEFINE, 717\r
+X DEPHAS, 720\r
+\r
+XK DFAD , 110\r
+XK DFDV , 113\r
+XK DFMP , 112\r
+X DFN , 131\r
+XK DFSB , 111\r
+\r
+X DIV , 234\r
+X DIVB , 237\r
+X DIVI , 235\r
+X DIVM , 236\r
+\r
+XK DMOVE , 120\r
+XK DMOVEM, 124\r
+XK DMOVN , 121\r
+XK DMOVNM, 125\r
+\r
+X DPB , 137\r
+\r
+X END , 721\r
+\r
+X ENTER , 077\r
+\r
+X ENTRY , 722\r
+\r
+X EQV , 444\r
+X EQVB , 447\r
+X EQVI , 445\r
+X EQVM , 446\r
+\r
+X EXCH , 250\r
+\r
+X EXP , 723\r
+XX EXTERN, 724\r
+\r
+X FAD , 140\r
+X FADB , 143\r
+X FADL , 141\r
+X FADM , 142\r
+\r
+X FADR , 144\r
+X FADRB , 147\r
+X FADRI , 145\r
+X FADRM , 146\r
+\r
+X FDV , 170\r
+X FDVB , 173\r
+X FDVL , 171\r
+X FDVM , 172\r
+\r
+X FDVR , 174\r
+X FDVRB , 177\r
+X FDVRI , 175\r
+X FDVRM , 176\r
+\r
+XX FIN. , 021\r
+\r
+IFN STANSW,<X FIX , 247>\r
+IFE STANSW,<XK FIX , 122>\r
+XK FIXR , 126\r
+XK FLTR , 127\r
+\r
+X FMP , 160\r
+X FMPB , 163\r
+X FMPL , 161\r
+X FMPM , 162\r
+\r
+\fX FMPR , 164\r
+X FMPRB , 167\r
+X FMPRI , 165\r
+X FMPRM , 166\r
+\r
+X FSB , 150\r
+X FSBB , 153\r
+X FSBL , 151\r
+X FSBM , 152\r
+\r
+X FSBR , 154\r
+X FSBRB , 157\r
+X FSBRI , 155\r
+X FSBRM , 156\r
+\r
+X FSC , 132\r
+\r
+X GETSTS, 062\r
+\r
+\fX HALT , 725\r
+X HISEG , 706\r
+\r
+X HLL , 500\r
+X HLLE , 530\r
+X HLLEI , 531\r
+X HLLEM , 532\r
+X HLLES , 533\r
+X HLLI , 501\r
+X HLLM , 502\r
+X HLLO , 520\r
+X HLLOI , 521\r
+X HLLOM , 522\r
+X HLLOS , 523\r
+X HLLS , 503\r
+X HLLZ , 510\r
+X HLLZI , 511\r
+X HLLZM , 512\r
+X HLLZS , 513\r
+\r
+X HLR , 544\r
+X HLRE , 574\r
+X HLREI , 575\r
+X HLREM , 576\r
+X HLRES , 577\r
+X HLRI , 545\r
+X HLRM , 546\r
+X HLRO , 564\r
+X HLROI , 565\r
+X HLROM , 566\r
+X HLROS , 567\r
+X HLRS , 547\r
+X HLRZ , 554\r
+X HLRZI , 555\r
+X HLRZM , 556\r
+X HLRZS , 557\r
+\r
+\fX HRL , 504\r
+X HRLE , 534\r
+X HRLEI , 535\r
+X HRLEM , 536\r
+X HRLES , 537\r
+X HRLI , 505\r
+X HRLM , 506\r
+X HRLO , 524\r
+X HRLOI , 525\r
+X HRLOM , 526\r
+X HRLOS , 527\r
+X HRLS , 507\r
+X HRLZ , 514\r
+X HRLZI , 515\r
+X HRLZM , 516\r
+X HRLZS , 517\r
+\r
+X HRR , 540\r
+X HRRE , 570\r
+X HRREI , 571\r
+X HRREM , 572\r
+X HRRES , 573\r
+X HRRI , 541\r
+X HRRM , 542\r
+X HRRO , 560\r
+X HRROI , 561\r
+X HRROM , 562\r
+X HRROS , 563\r
+X HRRS , 543\r
+X HRRZ , 550\r
+X HRRZI , 551\r
+X HRRZM , 552\r
+X HRRZS , 553\r
+\r
+X IBP , 133\r
+\r
+X IDIV , 230\r
+X IDIVB , 233\r
+X IDIVI , 231\r
+X IDIVM , 232\r
+\r
+X IDPB , 136\r
+\r
+X IF1 , 726\r
+X IF2 , 727\r
+X IFB , 730\r
+X IFDEF , 731\r
+X IFDIF , 732\r
+X IFE , 733\r
+X IFG , 734\r
+X IFGE , 735\r
+X IFIDN , 736\r
+X IFL , 737\r
+X IFLE , 740\r
+X IFN , 741\r
+X IFNB , 742\r
+X IFNDEF, 743\r
+\r
+X ILDB , 134\r
+\r
+X IMUL , 220\r
+X IMULB , 223\r
+X IMULI , 221\r
+X IMULM , 222\r
+\r
+X IN , 056\r
+XX IN. , 016\r
+X INBUF , 064\r
+XX INF. , 026\r
+X INIT , 041\r
+X INPUT , 066\r
+IFN WFWSW,<X INTEGE, 773>\r
+\r
+XX INTERN, 744\r
+\r
+X IOR , 434\r
+X IORB , 437\r
+X IORI , 435\r
+X IORM , 436\r
+\r
+\r
+X IOWD , 745\r
+X IRP , 746\r
+X IRPC , 747\r
+X JCRY , 750\r
+X JCRY0 , 751\r
+X JCRY1 , 752\r
+X JEN , 753\r
+\r
+XX JFCL , 255\r
+\r
+X JFFO , 243\r
+X JFOV , 765\r
+X JOV , 754\r
+\r
+X JRA , 267\r
+XX JRST , 254\r
+\r
+X JRSTF , 755\r
+\r
+X JSA , 266\r
+XX JSP , 265\r
+X JSR , 264\r
+\r
+XX JUMP , 320\r
+XX JUMPA , 324\r
+X JUMPE , 322\r
+X JUMPG , 327\r
+X JUMPGE, 325\r
+X JUMPL , 321\r
+X JUMPLE, 323\r
+X JUMPN , 326\r
+\r
+X LALL , 756\r
+\r
+X LDB , 135\r
+\r
+X LIST , 757\r
+X LIT , 760\r
+X LOC , 761\r
+\r
+X LOOKUP, 076\r
+\r
+X LSH , 242\r
+X LSHC , 246\r
+IFN WFWSW,<X LVAR , 774>\r
+XK MAP , 257\r
+X MLOFF , 767\r
+X MLON , 766\r
+XX MOVE , 200\r
+XX MOVEI , 201\r
+XX MOVEM , 202\r
+X MOVES , 203\r
+X MOVM , 214\r
+X MOVMI , 215\r
+X MOVMM , 216\r
+X MOVMS , 217\r
+X MOVN , 210\r
+X MOVNI , 211\r
+X MOVNM , 212\r
+X MOVNS , 213\r
+X MOVS , 204\r
+X MOVSI , 205\r
+X MOVSM , 206\r
+X MOVSS , 207\r
+\r
+\r
+X MTAPE , 072\r
+XX MTOP. , 024\r
+\r
+X MUL , 224\r
+X MULB , 227\r
+X MULI , 225\r
+X MULM , 226\r
+XX NLI. , 031\r
+XX NLO. , 032\r
+\r
+X NOSYM , 762\r
+\r
+\fX OCT , 763\r
+X OPDEF , 764\r
+\r
+X OPEN , 050\r
+\r
+X OR , 434\r
+X ORB , 437\r
+X ORCA , 454\r
+X ORCAB , 457\r
+X ORCAI , 455\r
+X ORCAM , 456\r
+X ORCB , 470\r
+X ORCBB , 473\r
+\r
+X ORCBI , 471\r
+X ORCBM , 472\r
+X ORCM , 464\r
+X ORCMB , 467\r
+X ORCMI , 465\r
+X ORCMM , 466\r
+X ORI , 435\r
+X ORM , 436\r
+\r
+X OUT , 057\r
+XX OUT. , 017\r
+X OUTBUF, 065\r
+XX OUTF. , 027\r
+X OUTPUT, 067\r
+\r
+\fX PAGE , 700\r
+X PASS2 , 701\r
+X PHASE , 702\r
+X POINT , 703\r
+\r
+XX POP , 262\r
+XX POPJ , 263\r
+\r
+X PRGEND, 714\r
+X PRINTX, 704\r
+X PURGE , 705\r
+\r
+XX PUSH , 261\r
+XX PUSHJ , 260\r
+\r
+X RADIX , 706\r
+X RADIX5, 707\r
+\r
+X RELEAS, 071\r
+\r
+X RELOC , 710\r
+X REMARK, 711\r
+\r
+X RENAME, 055\r
+\r
+X REPEAT, 712\r
+\r
+XX RESET., 015\r
+X RIM , 715\r
+X RIM10 , 735\r
+X RIM10B, 736\r
+\r
+X ROT , 241\r
+X ROTC , 245\r
+\r
+X RSW , 716\r
+XX RTB. , 022\r
+X SALL , 720\r
+X SEARCH, 721\r
+\r
+X SETA , 424\r
+X SETAB , 427\r
+X SETAI , 425\r
+X SETAM , 426\r
+X SETCA , 450\r
+X SETCAB, 453\r
+X SETCAI, 451\r
+X SETCAM, 452\r
+X SETCM , 460\r
+X SETCMB, 463\r
+X SETCMI, 461\r
+X SETCMM, 462\r
+X SETM , 414\r
+X SETMB , 417\r
+X SETMI , 415\r
+X SETMM , 416\r
+X SETO , 474\r
+X SETOB , 477\r
+X SETOI , 475\r
+X SETOM , 476\r
+X SETSTS, 060\r
+X SETZ , 400\r
+X SETZB , 403\r
+X SETZI , 401\r
+XX SETZM , 402\r
+\r
+XX SIXBIT, 717\r
+\r
+XX SKIP , 330\r
+X SKIPA , 334\r
+X SKIPE , 332\r
+X SKIPG , 337\r
+X SKIPGE, 335\r
+X SKIPL , 331\r
+X SKIPLE, 333\r
+X SKIPN , 336\r
+\r
+XX SLIST., 025\r
+\r
+X SOJ , 360\r
+X SOJA , 364\r
+X SOJE , 362\r
+X SOJG , 367\r
+X SOJGE , 365\r
+X SOJL , 361\r
+X SOJLE , 363\r
+X SOJN , 366\r
+\r
+XX SOS , 370\r
+X SOSA , 374\r
+X SOSE , 372\r
+X SOSG , 377\r
+X SOSGE , 375\r
+X SOSL , 371\r
+X SOSLE , 373\r
+X SOSN , 376\r
+\r
+IFN STANSW,<X SPCWAR,43>\r
+X SQUOZE, 707\r
+\r
+X STATO , 061\r
+X STATUS, 062\r
+X STATZ , 063\r
+\r
+X STOPI , 722\r
+\r
+X SUB , 274\r
+X SUBB , 277\r
+X SUBI , 275\r
+X SUBM , 276\r
+\r
+IF2,<IFE OPHSH,<SUBTL:>>\r
+X SUBTTL, 723\r
+X SUPPRE, 713\r
+X SYN , 724\r
+X TAPE , 725\r
+\r
+\fX TDC , 650\r
+X TDCA , 654\r
+X TDCE , 652\r
+X TDCN , 656\r
+X TDN , 610\r
+X TDNA , 614\r
+X TDNE , 612\r
+X TDNN , 616\r
+X TDO , 670\r
+X TDOA , 674\r
+X TDOE , 672\r
+X TDON , 676\r
+X TDZ , 630\r
+X TDZA , 634\r
+X TDZE , 632\r
+X TDZN , 636\r
+\r
+X TITLE , 726\r
+\r
+X TLC , 641\r
+X TLCA , 645\r
+X TLCE , 643\r
+X TLCN , 647\r
+X TLN , 601\r
+X TLNA , 605\r
+XX TLNE , 603\r
+XX TLNN , 607\r
+XX TLO , 661\r
+X TLOA , 665\r
+X TLOE , 663\r
+X TLON , 667\r
+XX TLZ , 621\r
+XX TLZA , 625\r
+XX TLZE , 623\r
+XX TLZN , 627\r
+\r
+\fX TRC , 640\r
+X TRCA , 644\r
+X TRCE , 642\r
+X TRCN , 646\r
+X TRN , 600\r
+X TRNA , 604\r
+XX TRNE , 602\r
+XX TRNN , 606\r
+X TRO , 660\r
+X TROA , 664\r
+X TROE , 662\r
+X TRON , 666\r
+XX TRZ , 620\r
+X TRZA , 624\r
+X TRZE , 622\r
+X TRZN , 626\r
+\r
+X TSC , 651\r
+X TSCA , 655\r
+X TSCE , 653\r
+X TSCN , 657\r
+X TSN , 611\r
+X TSNA , 615\r
+X TSNE , 613\r
+\r
+X TSNN , 617\r
+X TSO , 671\r
+X TSOA , 675\r
+X TSOE , 673\r
+X TSON , 677\r
+X TSZ , 631\r
+X TSZA , 635\r
+X TSZE , 633\r
+X TSZN , 637\r
+X TTCALL, 051\r
+X TWOSEG, 731\r
+X UFA , 130\r
+X UGETF , 073\r
+X UJEN , 100\r
+X UNIVER, 737\r
+X USETI , 074\r
+X USETO , 075\r
+\r
+X VAR , 727\r
+\r
+XX WTB. , 023\r
+\r
+X XALL , 732\r
+\r
+X XCT , 256\r
+\r
+X XLIST , 733\r
+\r
+X XOR , 430\r
+X XORB , 433\r
+X XORI , 431\r
+X XORM , 432\r
+\r
+X XPUNGE, 730\r
+X XWD , 734\r
+\r
+X Z , 000\r
+\r
+X .CREF , 740\r
+X .HWFRM, 742\r
+X .MFRMT, 743\r
+X .XCREF, 741\r
+\r
+\r
+\fIFN OPHSH,< ;NO-OPS, OLD MNEMONICS,F4 UUOS\r
+X CAI , 300\r
+X CAM , 310\r
+X CLEAR , 400\r
+X CLEARB, 403\r
+X CLEARI, 401\r
+X CLEARM, 402\r
+X JUMP , 320\r
+X JUMPA , 324\r
+X SKIP , 330\r
+X RESET., 015\r
+X IN. , 016\r
+X OUT. , 017\r
+X DATA. , 020\r
+X FIN. , 021\r
+X RTB. , 022\r
+X WTB. , 023\r
+X MTOP. , 024\r
+X SLIST., 025\r
+X INF. , 026\r
+X OUTF. , 027\r
+X NLI. , 031\r
+X NLO. , 032\r
+>\r
+\fIFE OPHSH,<\r
+IF1, < BLOCK N1>\r
+OP1END: -1B36\r
+OP1COD: BLOCK N1/4\r
+ CC>\r
+IFN OPHSH,<\r
+IF2,<\r
+DEFINE SETVAL (N)<EXP .%'N\r
+PURGE .%'N>\r
+N=0\r
+XLIST\r
+REPEAT PRIME,<SETVAL \N\r
+N=N+1>\r
+LIST\r
+>\r
+OP1COD: IF1,< BLOCK <PRIME/4+1>>\r
+IF2,<\r
+DEFINE SETVAL (N)<EXP .$'N\r
+PURGE .$'N>\r
+N=0\r
+XLIST\r
+REPEAT <PRIME/4+1>,<SETVAL \N\r
+N=N+1>\r
+>\r
+LIST>\r
+\r
+IFDEF .CREF,< .CREF ;START CREFFING AGAIN>\r
+\fSUBTTL PERMANENT SYMBOLS\r
+SYMNUM: EXP LENGTH/2 ;NUMBER OF PERMANENT SYMBOLS\r
+DEFINE P (A,B)<\r
+ SIXBIT /A/\r
+ XWD SYMF!NOOUTF,B>\r
+\r
+P @, 0(SUPRBT)\r
+P ??????, 0(SUPRBT)\r
+\r
+LENGTH= .-SYMNUM-1 ;LENGTH OF INITIAL SYMBOLS\r
+\r
+PRMTBL: ;PERMANENT SYMBOLS\r
+P ADC, 24\r
+P APR, 0\r
+P CCI, 14\r
+P CDP, 110\r
+P CDR, 114\r
+P CPA, 0\r
+P CR, 150\r
+P DC, 200\r
+P DCSA, 300\r
+P DCSB, 304\r
+P DF, 270\r
+P DIS, 130\r
+P DLS, 240\r
+P DPC, 250\r
+P DSK, 170\r
+P DTC, 320\r
+P DTS, 324\r
+P LPT, 124\r
+P MDF, 260\r
+P MTC, 220\r
+P MTM, 230\r
+P MTS, 224\r
+P PAG, 10\r
+P PI, 4\r
+P PLT, 140\r
+P PTP, 100\r
+P PTR, 104\r
+\r
+P TMC, 340\r
+P TMS, 344\r
+P TTY, 120\r
+P UTC, 210\r
+P UTS, 214\r
+IFE LNSSW,< XLIST >\r
+IFN LNSSW,< ;SPECIAL DEVICES FOR PEPR\r
+P .A,550\r
+P .AB,434\r
+P .ANG,440\r
+P .B,554\r
+P .BITE,470\r
+P .FA,564\r
+P .GAIN,520\r
+P .GATE,444\r
+P .IA,560\r
+P .INC,514\r
+P .LC,474\r
+P .LG,570\r
+P .PEPR,400\r
+P .RG,574\r
+P .SCON,430\r
+P .STAT,410\r
+P .TC,500\r
+P .TED,540\r
+P .THR,544\r
+P .TRK,404\r
+P .VIEW,524>\r
+ LIST\r
+PRMEND: ;END OF PERMANENT SYMBOLS\r
+\r
+\f OPDEF ZL [Z LITF] ;INVALID IN LITERALS\r
+ OPDEF ZA [Z ADDF] ;INVALID IN ADDRESSES\r
+ OPDEF ZAL [Z ADDF!LITF]\r
+\r
+OP1TAB:\r
+\r
+ ZA PAGE0 ;PAGE\r
+ ZAL PASS20 ;PASS2\r
+ ZAL PHASE0 ;PHASE\r
+ Z POINT0 ;POINT\r
+ ZA PRNTX0 ;PRINTX\r
+ ZA PURGE0 ;PURGE\r
+ ZA RADIX0 ;RADIX\r
+ Z RADX50 ;RADIX50,SQUOZE\r
+ ZAL LOC0 (1) ;RELOC\r
+ ZAL REMAR0 ;REMARK\r
+ ZA REPEA0 ;REPEAT\r
+ ZA SUPRE0 ;SUPRESS\r
+ ZAL PSEND0 ;PRGEND\r
+ ZAL RIM0 (RIMSW) ;RIM\r
+ DATAI 0,IOP ;RSW\r
+ Z ASCII0 (1) ;SIXBIT\r
+ ZAL IOSET (IOPALL!IOSALL) ;SALL\r
+ ZAL SERCH0 ;SEARCH\r
+ ZA STOPI0 ;STOPI\r
+ ZA SUBTT0 (Z (POINT 7,,)) ;SUBTTL\r
+ ZA SYN0 ;SYN\r
+ ZAL TAPE0 ;TAPE\r
+ ZA TITLE0 (Z (POINT 7,,)) ;TITLE\r
+ ZAL VAR0 ;VAR\r
+\r
+ Z XPUNG0 ;XPUNGE\r
+ ZAL TWSEG0 ;TWOSEGMENTS\r
+ ZAL XALL0 (IOPALL) ;XALL\r
+ ZAL IOSET (IOPROG) ;XLIST\r
+ Z XWD0 ;XWD\r
+ ZAL RIM0 (RIM1SW) ;RIM10\r
+ ZAL RIM0 (R1BSW) ;RIM10B\r
+ ZA UNIV0 (Z (POINT 7,,)) ;UNIVERSAL\r
+ ZAL IORSET (IONCRF) ;.CREF\r
+ ZAL IOSET (IONCRF) ;.XCREF\r
+ ZA OFFORM ;.HWFRMT\r
+ ZA ONFORM ;.MFRMT\r
+\fOP2TAB:\r
+\r
+ Z ASCII0 (0) ;ASCII\r
+ Z ASCII0 (1B18) ;ASCIZ\r
+ BLKI IOP ;BLKI\r
+ BLKO IOP ;BLKO\r
+ ZAL BLOCK0 ;BLOCK\r
+ ZA SUPRSA ;ASUPPRESS\r
+ ZAL HISEG0 ;HISEG\r
+ Z BYTE0 ;BYTE\r
+ CONI IOP ;CONI\r
+ CONO IOP ;CONO\r
+ CONSO IOP ;CONSO\r
+ CONSZ IOP ;CONSZ\r
+ DATAI IOP ;DATAI\r
+ DATAO IOP ;DATAO\r
+ Z OCT0 (^D10) ;DEC\r
+ ZA DEFIN0 ;DEFINE\r
+\r
+ ZAL DEPHA0 ;DEPHASE\r
+ ZAL END0 ;END\r
+ ZA INTER0 (INTF!ENTF) ;ENTRY\r
+ Z EXPRES ;EXP\r
+ ZA EXTER0 ;EXTERN\r
+ JRST 4,OP ;HALT\r
+ TLNN FR,IFPASS ;IF1\r
+ TLNE FR,IFPASS ;IF2\r
+\r
+ TRNE AC0,IFB0 ;IFB\r
+ TLNE ARG,IFDEF0 ;IFDEF\r
+ Z IFIDN0 (0) ;IFDIF\r
+ SKIPE IF ;IFE\r
+ SKIPG IF ;IFG\r
+ SKIPGE IF ;IFGE\r
+ Z IFIDN0 (1) ;IFIDN\r
+ SKIPL IF ;IFL\r
+\r
+ SKIPLE IF ;IFLE\r
+ SKIPN IF ;IFN\r
+ TRNN AC0,IFB0 ;IFNB\r
+ TLNN ARG,IFDEF0 ;IFNDEF\r
+ ZA INTER0 (INTF) ;INTERN\r
+ Z IOWD0 ;IOWD\r
+ Z IRP0 (0) ;IRP\r
+ Z IRP0 (400000) ;IRPC\r
+\r
+ JFCL 6,OP ;JCRY\r
+ JFCL 4,OP ;JCRY0\r
+ JFCL 2,OP ;JCRY1\r
+ JRST 12,OP ;JEN\r
+ JFCL 10,OP ;JOV\r
+ JRST 2,OP ;JRSTF\r
+ ZAL IORSET (IOPALL!IOSALL) ;LALL\r
+ ZAL IORSET (IOPROG) ;LIST\r
+ ZAL LIT0 ;LIT\r
+ ZAL LOC0 (0) ;LOC\r
+ ZA OFFSYM ;NOSYM\r
+ Z OCT0 (^D8) ;OCT\r
+ ZA OPDEF0 ;OPDEF\r
+ JFCL 1,OP ;JFOV\r
+ ZA ONML ;MLON\r
+ ZA OFFML ;MLOFF\r
+ Z ASCII0 (3B19) ;COMMENT\r
+IFN IIISW!WFWSW,<\r
+ Z ASCII0 (5B20) ;ASCID\r
+IFN WFWSW,<\r
+ ZAL %ARAY ;ARRAY\r
+ ZAL %INTEG ;INTEGER\r
+ ZAL %LVAR ;LVAR>>\r
+\f\r
+CALTBL:\r
+ ;USER DEFINED CALLI'S GO HERE\r
+ SIXBIT /LIGHTS/ ;-1\r
+CALLI0: SIXBIT /RESET/ ; 0\r
+ SIXBIT /DDTIN/ ; 1\r
+ SIXBIT /SETDDT/ ; 2\r
+ SIXBIT /DDTOUT/ ; 3\r
+ SIXBIT /DEVCHR/ ; 4\r
+ SIXBIT /DDTGT/ ; 5\r
+ SIXBIT /GETCHR/ ; 6\r
+ SIXBIT /DDTRL/ ; 7\r
+ SIXBIT /WAIT/ ;10\r
+ SIXBIT /CORE/ ;11\r
+ SIXBIT /EXIT/ ;12\r
+ SIXBIT /UTPCLR/ ;13\r
+ SIXBIT /DATE/ ;14\r
+ SIXBIT /LOGIN/ ;15\r
+ SIXBIT /APRENB/ ;16\r
+ SIXBIT /LOGOUT/ ;17\r
+ SIXBIT /SWITCH/ ;20\r
+ SIXBIT /REASSI/ ;21\r
+ SIXBIT /TIMER/ ;22\r
+ SIXBIT /MSTIME/ ;23\r
+ SIXBIT /GETPPN/ ;24\r
+ SIXBIT /TRPSET/ ;25\r
+ SIXBIT /TRPJEN/ ;26\r
+ SIXBIT /RUNTIM/ ;27\r
+ SIXBIT /PJOB/ ;30\r
+ SIXBIT /SLEEP/ ;31\r
+ SIXBIT /SETPOV/ ;32\r
+ SIXBIT /PEEK/ ;33\r
+ SIXBIT /GETLIN/ ;34\r
+ SIXBIT /RUN/ ;35\r
+ SIXBIT /SETUWP/ ;36\r
+ SIXBIT /REMAP/ ;37\r
+ SIXBIT /GETSEG/ ;40\r
+ SIXBIT /GETTAB/ ;41\r
+ SIXBIT /SPY/ ;42\r
+ SIXBIT /SETNAM/ ;43\r
+ SIXBIT /TMPCOR/ ;44\r
+ SIXBIT /DSKCHR/ ;45\r
+ SIXBIT /SYSSTR/ ;46\r
+ SIXBIT /JOBSTR/ ;47\r
+ SIXBIT /STRUUO/ ;50\r
+ SIXBIT /SYSPHY/ ;51\r
+ SIXBIT /FRECHN/ ;52\r
+ SIXBIT /DEVTYP/ ;53\r
+ SIXBIT /DEVSTS/ ;54\r
+ SIXBIT /DEVPPN/ ;55\r
+ SIXBIT /SEEK/ ;56\r
+ SIXBIT /RTTRP/ ;57\r
+ SIXBIT /LOCK/ ;60\r
+ SIXBIT /JOBSTS/ ;61\r
+ SIXBIT /LOCATE/ ;62\r
+ SIXBIT /WHERE/ ;63\r
+ SIXBIT /DEVNAM/ ;64\r
+ SIXBIT /CTLJOB/ ;65\r
+ SIXBIT /GOBSTR/ ;66\r
+ 0 ;67\r
+ 0 ;70\r
+ SIXBIT /HPQ/ ;71\r
+ SIXBIT /HIBER/ ;72\r
+ SIXBIT /WAKE/ ;73\r
+ SIXBIT /CHGPPN/ ;74\r
+ SIXBIT /SETUUO/ ;75\r
+ SIXBIT /DEVGEN/ ;76\r
+ SIXBIT /OTHUSR/ ;77\r
+ SIXBIT /CHKACC/ ;100\r
+ SIXBIT /DEVSIZ/ ;101\r
+ SIXBIT /DAEMON/ ;102\r
+ SIXBIT /JOBPEK/ ;103\r
+ SIXBIT /ATTACH/ ;104\r
+ SIXBIT /DAEFIN/ ;105\r
+ SIXBIT /FRCUUO/ ;106\r
+ SIXBIT /DEVLNM/ ;107\r
+ SIXBIT /PATH./ ;110\r
+\r
+CALNTH==.-CALTBL\r
+NEGCAL==CALLI0-CALTBL ;NUMBER OF NEGATIVE CALLI'S\r
+\r
+TTCTBL: SIXBIT /INCHRW/ ; 0 INPUT A CHAR. AND WAIT\r
+ SIXBIT /OUTCHR/ ; 1 OUTPUT A CHAR.\r
+ SIXBIT /INCHRS/ ; 2 INPUT A CHAR. AND SKIP\r
+ SIXBIT /OUTSTR/ ; 3 OUTPUT A STRING\r
+ SIXBIT /INCHWL/ ; 4 INPUT CHAR., WAIT, LINE MODE\r
+ SIXBIT /INCHSL/ ; 5 INPUT CHAR., SKIP, LINE MODE\r
+ SIXBIT /GETLCH/ ; 6 GET LINE CHARACTERISTICS\r
+ SIXBIT /SETLCH/ ; 7 SET LINE CHARACTERISTICS\r
+ SIXBIT /RESCAN/ ;10 RESET INPUT STREAM TO COMMAND\r
+ SIXBIT /CLRBFI/ ;11 CLEAR TYPEIN BUFFER\r
+ SIXBIT /CLRBFO/ ;12 CLEAR TYPEOUT BUFFER\r
+ SIXBIT /SKPINC/ ;13 SKIPS IF A CHAR. CAN BE INPUT\r
+ SIXBIT /SKPINL/ ;14 SKIPS IF A LINE CAN BE INPUT\r
+ SIXBIT /IONEOU/ ;15 OUTPUT AS AN IMAGE CHAR.\r
+\r
+TTCLTH==.-TTCTBL\r
+ SUBTTL USER-DEFINED SYMBOL SEARCH ROUTINES\r
+MSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH\r
+ POPJ PP, ;NOT FOUND, EXIT\r
+ JUMPG ARG,MSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND\r
+ CAME AC0,1(SX) ;WE ARE LOOKING AT SYMBOL, TRY ONE ABOVE\r
+ POPJ PP, ;NO, EXIT\r
+ ADDI SX,2 ;YES, POINT TO IT\r
+ PUSHJ PP,SRCH5 ;LOAD REGISTERS\r
+MSRCH2: AOSA 0(PP) ;SET SKIP-EXIT\r
+QSRCH: JUMPL ARG,SSRCH3 ;BRANCH IF OPERAND\r
+ MOVEI SDEL,%MAC ;SET OPERATOR FLAG\r
+ TLZE IO,DEFCRS ;IS IT A DEFINITION?\r
+ MOVEI SDEL,%DMAC ;YES\r
+ JRST CREF ;CROSS-REF AND EXIT\r
+\r
+SSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH\r
+ POPJ PP, ;NOT FOUND, EXIT\r
+ JUMPL ARG,SSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND\r
+SSRCH1: CAME AC0,-3(SX) ;WE ARE LOOKING AT MACRO, LOOK ONE SLOT BELOW\r
+ POPJ PP, ;NO DICE, EXIT\r
+ SUBI SX,2 ;YES, POINT TO IT\r
+ PUSHJ PP,SRCH5 ;LOAD REGISTERS\r
+SSRCH2: AOS 0(PP) ;SET FOR SKIP-EXIT\r
+SSRCH3: MOVEI SDEL,%SYM ;SET OPERAND FLAG\r
+\r
+CREF: TLNN IO,IONCRF ;NO CREFFING FOR THIS SYMBOL?\r
+ TLNE FR,P1!CREFSW ;PASS ONE OR CROSS-REF SUPPRESSION?\r
+ POPJ PP, ;YES, EXIT\r
+ EXCH SDEL,C ;PUT FLAG IN C, SACE C\r
+ PUSH PP,CS\r
+ TLNE IO,IOCREF ;HAVE WE PUT OUT THE 177,102\r
+ JRST CREF3 ;YES\r
+ PUSH PP,C ;START OF CREF DATA\r
+\r
+\fREPEAT 0,< ;NEEDS CHANGE TO CREF\r
+ MOVEI C,177\r
+ PUSHJ PP,OUTLST\r
+ MOVEI C,102\r
+ PUSHJ PP,OUTLST\r
+ TLO IO,IOCREF ;WE NOW ARE IN THAT STATE\r
+ POP PP,C ;WE HAVE NOW\r
+CREF3: JUMPE C,NOFLG ;JUST CLOSE IT\r
+ PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)\r
+ MOVSI CS,770000 ;COUNT CHRS\r
+ TDZA C,C ;STARTING AT 0\r
+ LSH CS,-6 ;TRY NEXT\r
+ TDNE AC0,CS ;IS THAT ONE THERE?\r
+ AOJA C,.-2 ;YES\r
+ PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS\r
+ MOVE CS,AC0\r
+\r
+CREF2: MOVEI C,0\r
+ LSHC C,6\r
+ ADDI C,40\r
+ PUSHJ PP,OUTLST ;THE ASCII SYMBOL\r
+ JUMPN CS,CREF2\r
+ MOVEI C,%DSYM\r
+ TLZE IO,DEFCRS\r
+ PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE\r
+NOFLG: MOVE C,SDEL\r
+ POP PP,CS\r
+ POPJ PP,\r
+\r
+CLSCRF: TRNN ER,LPTSW\r
+ POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING\r
+CLSCR2: MOVEI C,177\r
+ PUSHJ PP,PRINT\r
+ TLZE IO,IOCREF ;WAS IT OPEN?\r
+ JRST CLSCR1 ;YES, JUST CLOSE IT\r
+ MOVEI C,102 ;NO, OPEN IT FIRST\r
+ PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA\r
+ MOVEI C,177\r
+ PUSHJ PP,OUTLST\r
+CLSCR1: MOVEI C,103\r
+ JRST OUTLST ;MARK END OF CREF DATA\r
+\r
+CLSC3: TLZ IO,IOCREF\r
+ MOVEI C,177\r
+ PUSHJ PP,OUTLST\r
+ MOVEI C,104\r
+ JRST OUTLST ;177,104 CLOSES IT FOR NOW\r
+> ;END OF REPEAT 0\r
+\fREPEAT 1,< ;WORKS WITH EXISTING CREF\r
+ TLNE IO,IOPAGE\r
+ PUSHJ PP,CRFHDR ;GET CORRECT SUBTTL\r
+ MOVEI C,177\r
+ PUSHJ PP,OUTLST\r
+ MOVEI C,102\r
+ PUSHJ PP,OUTLST\r
+ TLO IO,IOCREF ;WE NOW ARE IN THAT STATE\r
+ POP PP,C ;WE HAVE NOW\r
+CREF3: PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)\r
+ MOVSI CS,770000 ;COUNT CHRS\r
+ TDZA C,C ;STARTING AT 0\r
+ LSH CS,-6 ;TRY NEXT\r
+ TDNE AC0,CS ;IS THAT ONE THERE?\r
+ AOJA C,.-2 ;YES\r
+ PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS\r
+ MOVE CS,AC0\r
+\r
+CREF2: MOVEI C,0\r
+ LSHC C,6\r
+ ADDI C,40\r
+ PUSHJ PP,OUTLST ;THE ASCII SYMBOL\r
+ JUMPN CS,CREF2\r
+ MOVEI C,%DSYM\r
+ TLZE IO,DEFCRS\r
+ PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE\r
+ MOVE C,SDEL\r
+ POP PP,CS\r
+ POPJ PP,\r
+\r
+IFN OPHSH,<\r
+SUBTL: SIXBIT /SUBTTL/>\r
+CRFHDR: CAME AC0,SUBTL ;IS FIRST SYMBOL "SUBTTL"\r
+ JRST CRFHD1 ;NO\r
+ HLLZ AC0,V\r
+ PUSHJ PP,SUBTT0 ;UPDATE SUBTTL\r
+ MOVE AC0,SUBTL ;RESTORE ARG.\r
+ MOVEI V,CPOPJ\r
+CRFHD1: MOVEI C,0\r
+ JRST OUTL\r
+\r
+CLSC3:\r
+CLSCRF: TRNN ER,LPTSW\r
+ POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING\r
+CLSCR2: TLZE IO,IOCREF ;FINISH UP LINE\r
+ JRST CLSCR1\r
+ MOVEI C,0\r
+ TLNE IO,IOPAGE ;NEW PAGE?\r
+ PUSHJ PP,OUTL ;YES,GIVE IT A ROUSING SENDOFF!\r
+ MOVEI C,177\r
+ PUSHJ PP,OUTLST\r
+ MOVEI C,102\r
+ PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA\r
+CLSCR1: MOVEI C,177\r
+ PUSHJ PP,OUTLST\r
+ MOVEI C,103\r
+ JRST OUTLST ;MARK END OF CREF DATA\r
+> ;END OF REPEAT 1\r
+\fSEARCH: HLRZ SX,SRCHX\r
+ HRRZ SDEL,SRCHX\r
+\r
+SRCH1: CAML AC0,-1(SX)\r
+ JRST SRCH3\r
+SRCH2: SUB SX,SDEL\r
+ LSH SDEL,-1\r
+ CAMG SX,SYMTOP\r
+ JUMPN SDEL,SRCH1\r
+ JUMPN SDEL,SRCH2\r
+ SOJA SX,SRCHNO ;NOT FOUND\r
+\r
+SRCH3: CAMN AC0,-1(SX)\r
+ JRST SRCH4 ;NORMAL / FOUND EXIT\r
+ ADD SX,SDEL\r
+ LSH SDEL,-1\r
+ CAMG SX,SYMTOP\r
+ JUMPN SDEL,SRCH1\r
+ JUMPN SDEL,SRCH2\r
+ SOJA SX,SRCHNO ;NOT FOUND\r
+\r
+SRCH4: AOS 0(PP) ;SET FOR SKIP EXIT\r
+SRCH5: MOVSI ARG,SUPRBT ;HE IS USING IT, TURN OFF BIT\r
+ ANDCAM ARG,(SX) ; IN THE TABLE\r
+SRCH7: MOVE ARG,0(SX) ;FLAG AND VALUE TO ARG\r
+ LDB RC,RCPNTR ;POINT 1,ARG,17\r
+ TLNE ARG,LELF ;CHECK LEFT RELOCATE\r
+ TLO RC,1\r
+ HRRZ V,ARG\r
+ TLNE ARG,SPTR ;CHECK SPECIAL EXTESN POINTER\r
+ JRST SRCH6\r
+ TLNE ARG,PNTF\r
+ MOVE V,0(ARG) ;36BIT VALUE TO V\r
+ JRST SRCHOK\r
+ \r
+SRCH6: MOVE V,0(ARG) ;VALUE\r
+ MOVE RC,1(ARG) ;AND RELOC\r
+ TLNE RC,-2 ;CHECK AND SET EXTPNT\r
+ HLLM RC,EXTPNT\r
+ TRNE RC,-2 \r
+ HRRM RC,EXTPNT\r
+ JRST SRCHOK\r
+SRCHNO: SKIPN UNISCH+1 ;ALLOWED TO SEARCH OTHER TABLES\r
+ POPJ PP, ;NO, JUST RETURN\r
+ AOS V,UNISCH ;GET NEXT INDEX TO TABLE\r
+ CAIE V,1 ;FIRST TIME IN\r
+ JRST SRCHN1 ;YES, SAVE SYMBOL INFO\r
+ HRLM SX,UNISCH ;SAVE SX AND SET FLAG\r
+ MOVE ARG,SRCHX ;SEARCH POINTER\r
+ MOVEM ARG,UNISHX ;TO A SAFE PLACE\r
+ HRR ARG,SYMBOL\r
+ HRL ARG,SYMTOP\r
+ MOVEM ARG,UNIPTR ;STORE ALSO\r
+SRCHN1: MOVE V,UNISCH(V) ;GET TRUE INDEX\r
+ JUMPE V,SRCHKO ;IF ZERO ALL TABLE SCANNED\r
+ MOVE ARG,UNISHX(V) ;NEW SRCHX\r
+ MOVEM ARG,SRCHX ;SET IT UP\r
+ MOVE ARG,UNIPTR(V) ;SYMTOP,,SYMBOL\r
+ HRRZM ARG,SYMBOL\r
+ HLRZM ARG,SYMTOP\r
+ JRST SEARCH ;TRY AGAIN\r
+\r
+SRCHKO: SETZ ARG, ;CLEAR ARG SO ZERO STORED\r
+SRCHOK: SKIPN UNISCH ;HAVE WE SEARCH OTHER TABLES\r
+ POPJ PP, ;NO, JUST RETURN\r
+SYMBCK: HLRZ SX,UNISCH ;RESTORE SX\r
+ SETZM UNISCH ;CLEAR SYMBCK FLAG\r
+ PUSH PP,V ;SAVE AN AC\r
+ MOVE V,UNISHX ;SRCHX\r
+ MOVEM V,SRCHX ;RESTORE ORIGINAL\r
+ MOVE V,UNIPTR ;SYMTOP,,SYMBOL\r
+ HRRZM V,SYMBOL\r
+ HLRZM V,SYMTOP\r
+ JUMPE ARG,SRCHK2 ;TOTALLY UNDEFINED\r
+ PUSH PP,RC ;SAVE SOME ACCS\r
+ PUSH PP,ARG\r
+ PUSH PP,EXTPNT\r
+ SETZB ARG,EXTPNT ;CLEAR ALL SYMBOL DATA\r
+ SETZB RC,V\r
+ PUSHJ PP,INSERT ;INSERT SYMBOL IN TABLE\r
+ POP PP,EXTPNT ;RESTORE ACCS ETC.\r
+ POP PP,ARG\r
+ POP PP,RC\r
+ MOVEM ARG,(SX) ;SET FLAGS AND VALUE AS IT SHOULD BE\r
+SRCHK2: POP PP,V\r
+ POPJ PP, ;RETURN\r
+\r
+\fINSERQ: TLNE ARG,UNDF!VARF\r
+INSERZ: SETZB RC,V\r
+INSERT: CAME AC0,-1(SX) ;ARE WE LOOKING AT MATCHING MNEMONIC?\r
+ JRST INSRT2 ;NO, JUST INSERT\r
+ JUMPL ARG,INSRT1 ;YES, BRANCH IF OPERAND\r
+ SKIPL 0(SX) ;OPERATOR, ARE WE LOOKING AT ONE?\r
+ JRST UPDATE ;YES, UPDATE\r
+ JRST INSRT2 ;NO, INSERT\r
+\r
+INSRT1: SKIPG 0(SX) ;OPERAND, ARE WE LOOKING AT ONE?\r
+ JRST UPDATE ;YES, UPDATE\r
+ SUBI SX,2 ;NO, MOVE UNDER OPERATOR AND INSERT\r
+INSRT2: MOVE SDEL,SYMBOL\r
+ SUBI SDEL,2\r
+ CAMLE SDEL,FREE\r
+ JRST INSRT3\r
+ PUSHJ PP,XCEEDS\r
+ ADDI SDEL,2000\r
+INSRT3: MOVEM SDEL,SYMBOL ;MAKE ROOM FOR A TWO WORD ENTRY\r
+ HRLI SDEL,2(SDEL)\r
+ BLT SDEL,-2(SX) ;PUSH EVERYONE DOWN TWO LOACTIONS\r
+ AOS @SYMBOL ;INCREMENT THE SYMBOL COUNT\r
+ TLNN RC,-2 ;NEED SPECIAL?\r
+ TRNE RC,-2 ;LEFT OR RIGHT EXTERNAL?\r
+ JRST INSRT5 ;YES, JUMP\r
+ TLNN V,-1 ;SKIP IF V IS A 36BIT VALUE\r
+ JRST INSRT4 ;JUMP, ITS A 18BIT VALUE\r
+ AOS SDEL,FREE ;36BIT, SO GET A CELL FROM FREE CORE\r
+ CAML SDEL,SYMBOL ;MORE CORE NEEDED?\r
+ PUSHJ PP,XCEEDS ;YES\r
+ HRRI ARG,-1(SDEL) ;POINTER TO ARG\r
+ MOVEM V,0(ARG) ;36BIT VALUE TO FREE CORE\r
+ TLOA ARG,PNTF ;NOTE THAT ARG IS APOINTER, NOT A 18BIT VALUE\r
+\r
+INSRT4: HRR ARG,V ;18BIT VALUE TO ARG\r
+ DPB RC,RCPNTR ;FIX RIGHT RELOCATION\r
+ TLNE RC,1\r
+ TLO ARG,LELF ;FIX LEFT RELOCATION\r
+INSRT6: MOVEM ARG,0(SX) ;INSERT FLAGS AND VALUE.\r
+ MOVEM AC0,-1(SX) ;INSERT SYMBOL NAME.\r
+ PUSHJ PP,SRCHI ;INITILIAZE SRCHX\r
+ JRST QSRCH ;EXIT THROUGH CREF\r
+ \r
+INSRT5: MOVEI SDEL,2 ;GET TWO CELLS FROM FREE CORE\r
+ ADDB SDEL,FREE\r
+ CAML SDEL,SYMBOL;MORE CORE NEEDED?\r
+ PUSHJ PP,XCEEDS ;YES\r
+ MOVEM RC,-1(SDEL)\r
+ HRRI ARG,-2(SDEL) ;POINTER TO ARG\r
+ MOVEM V,0(ARG)\r
+ TLO ARG,SPTR ;SET SPECIAL POINTER, POINTS TO TWO CELLS\r
+ JRST INSRT6\r
+\fREMOVE: SUBI SX,2 ;MOVE EVERYONE UP TWO LOCATIONS\r
+REMOV1: MOVE 0(SX)\r
+ MOVEM 2(SX) ;OVERWRITE THE DELETED SYMBOL\r
+ CAME SX,SYMBOL ;SKIP WHEN DONE\r
+ SOJA SX,REMOV1\r
+ ADDI SX,2\r
+ MOVEM SX,SYMBOL\r
+ SOS 0(SX) ;DECREMENT THE SYMBOL COUNT\r
+\r
+SRCHI: MOVEI AC2,0 ;THIS CODE SETS UP SRCHX\r
+ FAD AC2,@SYMBOL\r
+ LSH AC2,-^D27\r
+ MOVEI AC1,1000\r
+ LSH AC1,-357(AC2)\r
+ HRRM AC1,SRCHX\r
+ LSH AC1,1\r
+ ADD AC1,SYMBOL\r
+ HRLM AC1,SRCHX\r
+ POPJ PP, ;SRCHX=XWD <SYMTBL+LENGTH/2>,LENGTH/4\r
+\r
+\fUPDATE: DPB RC,RCPNTR ;FIX RIGHT RELOCATION\r
+ TLNE ARG,SPTR ;SKIP IF THERE IS NO SPECIAL POINTER\r
+ JRST UPDAT4 ;YES, USE THE TWO CELLS\r
+ TLNN RC,-2 ;NEED TO CHANGE\r
+ TRNE RC,-2 ;ANY CURRENT EXTERNS?\r
+ JRST UPDAT5 ;YES ,JUMP\r
+ TLZ ARG,LELF ;CLEAR LELF\r
+ TLNE RC,1 ;LEFT RELOCATABLE?\r
+ TLO ARG,LELF ;YES, SET THE FLAG\r
+ TLNE ARG,PNTF ;WAS THERE A 36BIT VALUE?\r
+ JRST UPDAT2 ;YES, USE IT.\r
+ TLNE V,-1 ;NO,IS THERE A 36BIT VALUE?\r
+ JRST UPDAT1 ;YES, GET A CELL\r
+ HRR ARG,V ;NO, USE RH OF ARG\r
+UPDAT3: MOVEM ARG,0(SX) ;OVERWRITE THE ONE IN THE TABLE\r
+ POPJ PP, ;AND EXIT\r
+\r
+UPDAT1: AOS SDEL,FREE ;GET ONE CELL\r
+ CAML SDEL,SYMBOL ;NEED MORE CORE?\r
+ PUSHJ PP,XCEEDS ;YES\r
+ HRRI ARG,-1(SDEL) ;POINTER TO ARG\r
+ TLO ARG,PNTF ;AND NOTE IT.\r
+UPDAT2: TLNE ARG,EXTF ;IS THERE A EXTERNAL?\r
+ JRST UPDAT3 ;YES, - JUST SAVE A LOCATION\r
+ MOVEM ARG,0(SX) ;NO, OVERWRITE THE POINTER IN THE TABLE\r
+ MOVEM V,0(ARG) ;STORE VALUE AS A 36BIT VALUE\r
+ POPJ PP, ;AND EXIT\r
+ \r
+UPDAT4: MOVEM ARG,0(SX) ;WE HAVE TWO CELLS, WE USE THEM\r
+ MOVEM V,0(ARG) ;SAVE AS 36BIT VALUE\r
+ MOVEM RC,1(ARG) ;SAVE RELOCATION BITS\r
+ POPJ PP, ;AND EXIT\r
+\r
+UPDAT5: MOVEI SDEL,2 ;THERE IS A EXTERNAL\r
+ ADDB SDEL,FREE ;SO WE NEED TWO LOACTIONS\r
+ CAML SDEL,SYMBOL ;NEED MORE CORE?\r
+ PUSHJ PP,XCEEDS ;YES\r
+ MOVEM RC,-1(SDEL) ;SAVE RELOCATION BITS\r
+ HRRI ARG,-2(SDEL) ;SAVE THE POINTER IN ARG\r
+ MOVEM V,0(ARG) ;SAVE A 36BIT VALUE\r
+ TLO ARG,SPTR ;SET SPECIAL PNTR FLAG\r
+ TLZ ARG,PNTF ;CLEAR POINTER FLAG\r
+ JRST UPDAT3 ;SAVE THE POINTER AND EXIT\r
+\r
+\f SUBTTL CONSTANTS\r
+\r
+\r
+IFN FORMSW,<\r
+HWFORM: BYTE (18) 1,1\r
+INFORM: BYTE (9) 1 (4) 1 (1) 1 (4) 1 (18) 1\r
+IOFORM: BYTE (3) 1 (7) 1 (3) 1 (1) 1 (4) 1 (18) 1\r
+BPFORM: BYTE (6) 1,1 (2) 1 (4) 1 (18) 1\r
+ASCIIF: BYTE (7) 1,1,1,1,1\r
+SXFORM: BYTE (6) 1,1,1,1,1,1\r
+>\r
+\r
+\f SUBTTL PHASED CODE\r
+\r
+IFN PURESW,<LOWH:\r
+IFE SEG2SW,< PHASE 140>\r
+IFN SEG2SW,< PHASE LOWL>\r
+>\r
+IFN TEMP,<TMPFIL: SIXBIT /MAC/\r
+ XWD -200,0>\r
+LSTFIL: BLOCK 1\r
+ SIXBIT /@/ ;SYMBOL TO STOP PRINTING\r
+TAG: BLOCK 1\r
+ SIXBIT / + @/\r
+TABI:\r
+IFE FORMSW,< BYTE (7) 0, 11, 11, 11, 11>\r
+IFN FORMSW,< BYTE (7) 11,11, 11, 11, 11>\r
+SEQNO: BLOCK 1\r
+ ASCIZ / /\r
+BININI: EXP B\r
+BINDEV: BLOCK 1\r
+ XWD BINBUF,0\r
+LSTINI: EXP AL\r
+LSTDEV: BLOCK 1\r
+ XWD LSTBUF,0\r
+IFN CCLSW,<\r
+IFE RUNSW,<\r
+NUNINI: EXP DMP\r
+NUNDEV: BLOCK 1\r
+ XWD 0,0>\r
+RPGINI: EXP AL\r
+RPGDEV: BLOCK 1\r
+ XWD 0,CTLBLK\r
+>\r
+INDEVI: EXP A\r
+INDEV: BLOCK 1\r
+ XWD 0,IBUF\r
+DBUF: ASCIZ / TI:ME DY-MON-YR PAGE /\r
+VBUF: ASCIZ / MACRO / ;MUST BE LAST LOCATIONS IN BLOCK\r
+IFE PURESW,< BLOCK 3 ;ALLOW FOR LONG TITLE>\r
+IFN PURESW,< DEPHASE\r
+ LENLOW==.-LOWH>\r
+\r
+\fSUBTTL STORAGE CELLS\r
+\r
+IFN PURESW,<\r
+IFE SEG2SW,< LOC 140>\r
+IFN SEG2SW,< RELOC LOWL>\r
+LOWL: BLOCK LENLOW+3 >\r
+PASS1I:\r
+\r
+RP: BLOCK 1\r
+\r
+IFE CCLSW,<CTIBUF: BLOCK 3\r
+CTOBUF: BLOCK 3\r
+>\r
+IFN CCLSW,<CTLBUF: BLOCK <CTLSIZ+5>/5\r
+IFN RUNSW,<RUNDEV: BLOCK 1\r
+RUNFIL: BLOCK 3\r
+RUNPP: BLOCK 2>>\r
+LSTBUF: BLOCK 3\r
+BINBUF: BLOCK 3\r
+IBUF: BLOCK 3\r
+IFN CCLSW,<IFE RUNSW,<NUNDIR:>>\r
+LSTDIR: BLOCK 4\r
+BINDIR: BLOCK 4\r
+INDIR: BLOCK 4\r
+\r
+ACDELX: ;LEFT HALF\r
+BLKTYP: BLOCK 1 ;RIGHT HALF\r
+\r
+COUTX: BLOCK 1\r
+COUTY: BLOCK 1\r
+COUTP: BLOCK 1\r
+COUTRB: BLOCK 1\r
+COUTDB: BLOCK ^D18\r
+\r
+ERRCNT: BLOCK 1\r
+FREE: BLOCK 1\r
+IFN RENTSW,<HIGH1: BLOCK 1\r
+HISNSW: BLOCK 1\r
+SVTYP3: BLOCK 1\r
+HMIN: BLOCK 1 ;START OF HIGH SEG. IN TWO SEG. PROG.>\r
+IFBLK: BLOCK .IFBLK\r
+IFBLKA: BLOCK .IFBLK\r
+LADR: BLOCK 1\r
+NCOLLS: BLOCK 1\r
+LIMBO: BLOCK 1\r
+LBUFP: BLOCK 1\r
+LBUF: BLOCK <.CPL+5>/5\r
+ BLOCK 1\r
+VARHD: BLOCK 1\r
+VARHDX: BLOCK 1\r
+IFN WFWSW,<LVARLC: BLOCK 1>\r
+\r
+LITAB: BLOCK 1\r
+LITABX: BLOCK 1\r
+ BLOCK 1\r
+LITHD: BLOCK 1\r
+LITHDX: BLOCK 1\r
+LITCNT: BLOCK 1\r
+LITNUM: BLOCK 1\r
+\r
+LOOKX: BLOCK 1\r
+NEXT: BLOCK 1\r
+OUTSW: BLOCK 1\r
+PDP: BLOCK 1\r
+RECCNT: BLOCK 1\r
+SAVBLK: BLOCK RC\r
+SAVERC: BLOCK 1\r
+SBUF: BLOCK .SBUF/5\r
+SRCHX: BLOCK 1\r
+SUBTTX: BLOCK 1\r
+SVSYM: BLOCK 1\r
+SYMBOL: BLOCK 1\r
+SYMTOP: BLOCK 1\r
+SYMCNT: BLOCK 1\r
+\r
+STPX: BLOCK 1\r
+STPY: BLOCK 1\r
+STCODE: BLOCK .STP\r
+STOWRC: BLOCK .STP\r
+\r
+IFN FORMSW,<\r
+STFORM: BLOCK .STP\r
+FORM: BLOCK 1\r
+HWFMT: BLOCK 1\r
+FLDSIZ: BLOCK 1\r
+IOSEEN: BLOCK 1\r
+>\r
+TABP: BLOCK 1\r
+TCNT: BLOCK 1 ;COUNT OF CHARS. LEFT IN TBUF\r
+TBUF: BLOCK .TBUF/5\r
+DEVBUF: BLOCK 6 ;STORE NAME.EXT CREATION DATE AND TIME\r
+TYPERR: BLOCK 1\r
+IONSYM: BLOCK 1 ;-1 SUPRESS LISTING OF SYMBOLS\r
+PRGPTR: BLOCK 1 ;POINTER TO CHAIN OF PRGEND BLOCKS\r
+ENTERS: BLOCK 1 ;-1 WHEN ENTERS HAVE BEEN DONE\r
+UNIVSN: BLOCK 1 ;-1 WHEN A UNIVERSAL SEEN\r
+\r
+\fPASS2I:\r
+\r
+ABSHI: BLOCK 1\r
+HIGH: BLOCK 1\r
+IFN RENTSW,<HHIGH: BLOCK 1 ;SAVE BREAK OF HIGH SEG. IN TWO SEG PROG.>\r
+ACDEVX: BLOCK 1\r
+CPL: BLOCK 1\r
+CTLSAV: BLOCK 1\r
+CTLS1: BLOCK 1\r
+EXTPNT: BLOCK 1\r
+INTENT: BLOCK 1\r
+INREP: BLOCK 1\r
+INDEF: BLOCK 1\r
+INTXT: BLOCK 1\r
+INCND: BLOCK 1\r
+CALNAM: BLOCK 1\r
+CALPG: BLOCK 1\r
+CALSEQ: BLOCK 1\r
+DEFPG: BLOCK 1\r
+DEFSEQ: BLOCK 1\r
+LITPG: BLOCK 1\r
+LITSEQ: BLOCK 1\r
+REPPG: BLOCK 1\r
+REPSEQ: BLOCK 1\r
+TXTPG: BLOCK 1\r
+TXTSEQ: BLOCK 1\r
+CNDPG: BLOCK 1\r
+CNDSEQ: BLOCK 1\r
+IRPCNT: BLOCK 1\r
+IRPARG: BLOCK 1\r
+IRPARP: BLOCK 1\r
+IRPCF: BLOCK 1\r
+IRPPOI: BLOCK 1\r
+IRPSW: BLOCK 1\r
+IFN WFWSW,<FIXLNK: BLOCK 1>\r
+LITLVL: BLOCK 1\r
+LITLBL: BLOCK 1 ;NAME OF LABEL DEFINED INSIDE A LITERAL\r
+\r
+ASGBLK: BLOCK 1\r
+LOCBLK: BLOCK 1\r
+\r
+LOCA: BLOCK 1\r
+LOCO: BLOCK 1\r
+RELLOC: BLOCK 1\r
+ABSLOC: BLOCK 1\r
+LPP: BLOCK 1\r
+MODA: BLOCK 1\r
+MODLOC: BLOCK 1\r
+MODO: BLOCK 1\r
+IFN CCLSW,<OTBUF: BLOCK 2>\r
+OUTSQ: BLOCK 2\r
+PAGEN.: BLOCK 1\r
+PPTEMP: BLOCK 1\r
+PPTMP1: BLOCK 1\r
+PPTMP2: BLOCK 1\r
+\r
+REPCNT: BLOCK 1\r
+REPEXP: BLOCK 1\r
+REPPNT: BLOCK 1\r
+RPOLVL: BLOCK 1\r
+R1BCNT: BLOCK 1\r
+R1BCHK: BLOCK 1\r
+R1BBLK: BLOCK .R1B\r
+R1BLOC: BLOCK 1\r
+RIMLOC: BLOCK 1\r
+TAGINC: BLOCK 1\r
+VECREL: BLOCK 1\r
+VECTOR: BLOCK 1\r
+.TEMP: BLOCK 1 ;TEMPORARY STORAGE\r
+UNISCH: BLOCK .UNIV ;SEARCH TABLE FOR UNIVERSALS\r
+SQFLG: BLOCK 1\r
+ARGF: BLOCK 1\r
+MACENL: BLOCK 1\r
+MACLVL: BLOCK 1\r
+MACPNT: BLOCK 1\r
+WWRXX: BLOCK 1\r
+RCOUNT: BLOCK 1 ;COUNT OF WORDS STILL TO READ IN LEAF\r
+WCOUNT: BLOCK 1 ;COUNT OF WORDS STILL FREE IN LEAF\r
+PASS2Z: ;ONLY CLEAR TO HERE ON PRGEND\r
+LSTSYM: BLOCK 1\r
+PAGENO: BLOCK 1\r
+SEQNO2: BLOCK 1\r
+PASS2X:\r
+\r
+\fSUBTTL MULTI-ASSEMBLY STORAGE CELLS\r
+\r
+LSTPGN: BLOCK 1\r
+IFN WFWSW,<ARAYP: BLOCK 1>\r
+HDAS: BLOCK 1\r
+IFN CCLSW,<EXTMP: BLOCK 1 ;HOLDS EXT OF COMMAND FILE (RH)\r
+SAVFF: BLOCK 1\r
+CTLBLK: BLOCK 3\r
+CTIBUF: BLOCK 3\r
+CTOBUF: BLOCK 3>\r
+IFN TEMP,<TMPFLG: BLOCK 1>\r
+IFN FORMSW,<PHWFMT: BLOCK 1>\r
+MACSIZ: BLOCK 1 ;INITIAL SIZE OF LOW SEG\r
+UNISIZ: BLOCK 1 ;TOP OF BUFFERS AND STACKS\r
+UNITOP: BLOCK 1 ;TOP OF UNIVERSAL SYMBOL TABLE\r
+UNIVNO: BLOCK 1 ;NUMBER OF UNIVERSALS SEEN\r
+UNITBL: BLOCK .UNIV ;TABLE OF UNIVERSAL NAMES\r
+UNIPTR: BLOCK .UNIV ;TABLE OF SYMBOL POINTERS\r
+UNISHX: BLOCK .UNIV ;TABLE OF SRCHX POINTERS\r
+ VAR ;CLEAR VARIABLES\r
+\r
+JOBFFI: BLOCK 203*NUMBUF+1 ;INPUT BUFFER PLUS ONE\r
+IFN PURESW,<LOWEND==.-1\r
+ RELOC >\r
+\r
+ END BEG\r
+\f\r
--- /dev/null
+TITLE MONGEN - DIALOG PROGRAM TO DEFINE A 10/40 OR 10/50 T.S. CONFIGURATION - V041\r
+SUBTTL T.HASTINGS/TNM/TW/PFC/GDR/KWB/RCC TS 05 MAR 71\r
+VMONGN==040\r
+\r
+JOBVER=137\r
+ LOC JOBVER\r
+ EXP VMONGN\r
+ ;PUT VERSION NUMBER IN JOB DATA AREA\r
+ ;ALSO OUTPUT-SEE NEXT PAGE\r
+ RELOC\r
+\r
+;HOW MONGEN IS ORGANIZED:\r
+;ALL SYMBOLS FOR CONFIG.MAC ARE DEFINED USING XP MACRO DEFINED IN S.MAC\r
+;XP DEFINES FIRST ARGUMENT TO BE EQUAL TO THE SECOND ARG\r
+;AND DECLARES THE FIRST ARG TO BE INTERVAL\r
+\r
+;RULE: ALL SYMBOLS ARE GENERATED ALL THE TIME, NO MATTER HOW DIALOG IS ANSWERED\r
+;WHY - SO USER READING CONFIG+COMMON NEVER NEEDS TO LOOK AT\r
+; MONGEN PROGRAM TO UNDERSTAND MONITOR\r
+\r
+;THE ONLY LOCAL STORAGE IN MONGEN IS USED TO STORE ANSWERS\r
+;WHICH DETERMINE WHETHER A SECOND QUESTION IS TO BE ASKED\r
+;THESE TEMP STORAGE HAVE SAME NAME AS THE SYMBOL WHICH THEY ARE ASSOCIATED WITH\r
+\r
+;RULE: ALL SYMBOLS WHICH ARE GENERATED BY MONGEN, END IN LETTER N OR NN.\r
+;POLICY: MONGEN IS STUPID AND SIMPLE MINDED. IT KNOWS AS LITTLE ABOUT THE MONITOR\r
+;AS POSSIBLE. IT NEVER ADDS TWO ANSWERS TOGETHER, FOR EXAMPLE. IT ALWAYS GENERATES\r
+;ALL SYMBOLS ALL THE TIME, NO MATTER HOW THE QUESTIONS ARE ANSWERED. THE SYMBOL\r
+;VALUES ARE ALWAYS WHAT THE USER ANSWERED. (AS LONG AS SYNTACTICALLY CORRECT).\r
+;IF DEC OFFERS JUST 2 DIFFERENT FORMS OF A DEVICE\r
+; ONLY ONE QUESTION WILL BE ASKED (EX. DECTAPE - 551 OR TD10).\r
+; HOWEVER TWO SYMBOLS ENDING IN N WILL BE GENERATED.\r
+; THIS IS SO A THIRD DEVICE CAN BE ADDED WITH MINIMAL\r
+; CHANGE TO BOTH MONGEN AND COMMON.\r
+;RULE: ASK RELATED QUESTIONS (EG, 3-WAY BRANCH) SO THAT IF THE FIRST\r
+;ANSWER IS YES, THE SECOND QUESTION IS NOT ASKED.\r
+;RULE: ASK THE QUESTIONS SO THAT YES IS THE CURRENT STANDARD RESPONSE.\r
+;FOR EACH VARIABLE OUTPUT, THERE IS A CORRESPONDING LOCATION IN MONGEN WITH SAME NAME\r
+;ALL SUCH LOCATIONS ARE INITIALLY SET TO 0 WHEN MONGEN IS STARTED\r
+;EACH QUESTION OR SET OF RELATED QUESTIONS HAS THE FOLLOWING FORM:\r
+; ONE OR MORE QUESTIONS FOLLOWED BY OUTPUT OF THE APPROPRIATE MACRO SOURCE.\r
+; THE FIRST QUESTION IN A SEG ARE OF FORM TAG1,TAG2,ECT.\r
+; ALL JUMPS TO OTHER QUESTIONS IN SEG ARE OF FORM TAG1,TAG2, ETC.\r
+; THE OUTPUT SECTION OF A SEG IS LABELED TAGOUT: EVEN THOUGH IT MAY\r
+; NEVER BE JRSTED TO. NOTE: THERE ARE NO OTHER TAGS IN OUTPUT SECTION\r
+; BECAUSE ALL SYMBOLS ARE ALWAYS OUTPUT, SO THERE IS NO BRANCHING IN OUTPUT SECTION.\r
+\r
+\r
+;ANY TTY OUTPUT ENCLOSED IN []'S WILL BE TYPED ONLY IF LONG DIALOG IS IN EFFECT\r
+\f;ACS\r
+P=17 ;PUSHDOWN POINTER\r
+N=1 ;NUMERICAL VALUE OF ASKED QUESTION\r
+ ;0=N,1=Y, HIGHER NO. IS VALUE OF OCTAL OR DECIMAL ANSWER\r
+ ;VALUE RETURNED BY ASKYN, ASKOCT,ASKDEC ROUTINES\r
+T=2 ;TEMPORARY AC\r
+T1=T+1\r
+CH=4 ;CHARACTER AC\r
+WD=CH+1 ;WORD AC\r
+ ;FIRST ARGUMENT PASSED TO OUTXP\r
+B=6 ;BYTE POINTER TO INPUT STRING\r
+R=7 ;RADIX FOR INPUT\r
+CHN=10\r
+CHN1=11\r
+CHN2=12\r
+TTYCHN=0\r
+TOCHN=0 ;TTY OUTPUT CHANNEL\r
+FOCHN=1 ;FILE OUTPUT CHANNEL\r
+OUTCHN=1\r
+\r
+MLON ;MULTI LINE LITERAL\r
+\r
+\r
+MAXCHN=8 ;MAXIMUM NUMBER OF DISK CHANNELS\r
+\r
+MAXFHU=8 ;MAXIMUM NUMBER OF UNITS ON FIXED HEAD CONTROLLERS\r
+MAXDPU=8 ;MAXIMUM NUMBEROF UNITS ON DISK PACK CONTROLLERS\r
+MAXMFU=2 ;MAXIMUM NUMBER OF UNITS ON MASS FILE CONTROLLERS\r
+\r
+;THE FOLLOWING SIMPLE ROUTINES ARE USED TO ASK QUESTIONS:\r
+;ASKYN - ANSWER -(Y,N,) OR (1,0)\r
+;ASKDEC - ANSWER - DECIMAL NUMBER\r
+;ASKOCT - ANSWER - OCTAL NUMBER\r
+;ASKACZ - ANSWER - LOC ASCSTR...VASCSTR+5(ASCIZ)\r
+;ASKSIX - ANSWER - LOC ASCSTR...ASCSTR=1(ASCIZ)(ONLY 6 CHAR ALLOWED)\r
+;OUTFIL - OUTPUT TO CONFIG.MAC ONLY\r
+;OUTBTH - OUTPUT TO TTY AND CONFIG.MAC(;IS REMOVED BEFORE GOING TO TTY)\r
+;OUTXP - SUBSTITUTES VALUE IN N FOR * IN ASCIZ\r
+;OUTSTR - SUBSTITUTE ASCIZ STRING IN ASCSTR FOR * IN ASCIZ ARG\r
+;OUTTTY - OUTPUT TO TTY ONLY (ERROR MESSAGE)\r
+\r
+\r
+XALL ;DO NOT LIST ASCII EXPANSIONS\r
+\r
+DEFINE ASCIIZ (A)\r
+<\r
+ XLIST\r
+ ASCIZ &A\r
+&\r
+ LIST>\r
+\f SUBTTL INITIALIZATION\r
+MONGEN: CALLI 0 ;RESET\r
+ MOVE P,[IOWD 12,PDLIST]\r
+ SETZM VARBEG\r
+ MOVE N,[XWD VARBEG,VARBEG+1]\r
+ BLT N,VAREND ;CLEAR VARIABLE STORAGE\r
+\r
+ INIT TTYCHN,1\r
+ SIXBIT /TTY/\r
+ XWD TOBUF,TIBUF\r
+ HALT .-3\r
+MON1: PUSHJ P,OUTTTY\r
+ ASCIIZ <;TYPE "DEVICE:NAME.EXT<CR>" FOR WHERE TO PUT RESULTS OF THIS DIALOG\r
+;CR ASSUMES "DSK:CONFIG.MAC">\r
+ PUSHJ P,TTYIN\r
+ PUSHJ P,GETWRD\r
+ SETZ N,\r
+ CAIE CH,":"\r
+ EXCH WD,N\r
+ SKIPN WD\r
+ MOVSI WD,(SIXBIT .DSK.)\r
+ MOVEM WD,.+2\r
+ INIT OUTCHN,1\r
+ SIXBIT /DSK/\r
+ XWD FOBUF,0 ;INIT OUTPUT DEVICE 'OUTP'\r
+ JRST .+2\r
+ JRST OUTOK ;LOGICAL DEVICE WAS ASSIGNED\r
+ PUSHJ P,OUTTTY\r
+ ASCIIZ <DEVICE NOT AVAILABLE>\r
+ JRST MON1 ;ASK AGAIN\r
+\r
+OUTDIR: SIXBIT /CONFIG/\r
+OUTDR1: SIXBIT /MAC/\r
+ BLOCK 2\r
+\r
+OUTOK: CAIE CH,":"\r
+ SKIPA WD,N\r
+ PUSHJ P,GETWRD\r
+ SKIPN WD\r
+ MOVE WD,[SIXBIT .CONFIG.]\r
+ MOVEM WD,OUTDIR\r
+ CAIE CH,"."\r
+ PUSHJ P,GETWRD\r
+ CAIN CH,"."\r
+ JRST .+3\r
+ MOVSI WD,(SIXBIT/MAC/)\r
+ JRST .+2\r
+ PUSHJ P,GETWRD\r
+ MOVEM WD,OUTDR1\r
+ ENTER OUTCHN,OUTDIR\r
+ JRST ENTERR\r
+\f SUBTTL DETERMIN GENERAL TYPE OF SYSTEM ,ETC.\r
+ PUSHJ P,OUTFIL ;WRITE ON OUTPUT FILE ONLY\r
+ ASCIIZ <SUBTTL CONFIG - CONFIGURATION DEFINITION FILE OUTPUT BY MONGEN DIALOG\r
+\r
+\r
+>\r
+ PUSHJ P,OUTBTH ;BOTH TTY AND OUTPUT FILE(AS COMMENT)\r
+ ASCIIZ <;ANSWER THE FOLLOWING QUESTIONS WITH Y OR N OR A DECIMAL NUMBER>\r
+ PUSHJ P,ASKYN\r
+ ASCIIZ <;SHORT DIALOG?[N = LONGER QUESTIONS]>\r
+ MOVEM N,SHORT ;REMEMBER FOR QUTTTY ROUT.\r
+ PUSHJ P,ASKYN\r
+ ASCIIZ <;10/30 SYSTEM TO BE BUILT?[N = 10/40 OR 10/50 SYSTEM]>\r
+ JUMPN N,.+2\r
+ JRST SYSASK+1\r
+ PUSHJ P,ASKYN\r
+ ASCIIZ <;10/40 SYSTEM TO BE BUILT?[N = ASSUME 10/50 SYSTEM]>\r
+ JUMPN N,SYS1\r
+ JRST SYSASK\r
+\r
+ENTERR: PUSHJ P,OUTTTY\r
+ ASCIIZ <ENTER FAILURE>\r
+ JRST MON1\r
+\fSYSASK: AOS SYS40N\r
+ PUSHJ P,ASKYN ;FIND OUT IF 10/40 WITH DISK\r
+ ASCIIZ <;DISK?>\r
+ JUMPE N,SYSOUT ;DISK SYSTEM?\r
+SYS1: AOS SYS50N\r
+ AOS DSKN\r
+ AOS LOGINN\r
+SYSOUT: MOVE N,SYS40N ;DEFINE 10/40 SYSTEM SYMBOL\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP SYS40N,*>\r
+ MOVEI N,SYS50N \r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP SYS50N,*>\r
+ MOVE N,DSKN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP DSKN,*>\r
+ MOVE N,LOGINN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP LOGINN,*>\r
+\r
+\f SUBTTL SET-UP DISK CONFIGURATION\r
+DSKASK: SKIPN N,DSKN ;NEED A DISK?\r
+ JRST JOBASK ;NO DISK - NO QUESTION\r
+\r
+ PUSHJ P,ASKYN\r
+ ASCIIZ <;RD10 (BURROUGHS) DISK?[ONE DISK TYPE FOR FILES,\r
+;SAME TYPE FOR SWAPPING OR ONE OTHER TYPE FOR SWAPPING]>\r
+ MOVEM N,RD10N\r
+SYS1A: PUSHJ P,OUTXP\r
+ ASCIIZ <XP RD10N,*>\r
+ SKIPN N,RD10N ;RD10 REQUESTED?\r
+ JRST SYS1B ;NO.\r
+ PUSHJ P,ASKYN\r
+ ASCIIZ <;RD10 FOR SWAPPING?[N = CAN SWAP ON SOME OTHER TYPE]>\r
+ MOVEM N,SWPYES\r
+SYS1B: PUSHJ P,OUTXP\r
+ ASCIIZ <XP RDSWPN,*>\r
+ SKIPN N,DSKN\r
+ JRST SYS2A\r
+ PUSHJ P,ASKDEC\r
+ ASCIIZ <;HOW MANY RP01 OR RP02 (MEMOREX) DISK PACK DRIVES?[0 IF NONE]>\r
+SYS2A: MOVEM N,RP10N\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP RP10N,*>\r
+ SKIPE N,RP10N\r
+ SKIPE SWPYES\r
+ JRST SYS2B ;AVOID QUESTION IF NO RP10 OR ALREADY HAVE SWAP DEV\r
+ PUSHJ P,ASKYN\r
+ ASCIIZ <;RP10 FOR SWAPPING?>\r
+ MOVEM N,SWPYES\r
+SYS2B: PUSHJ P,OUTXP\r
+ ASCIIZ <XP RPSWPN,*>\r
+\f SKIPN N,RP10N\r
+ JRST SYS3\r
+ MOVE N,RP10N\r
+ SOJE N,SYS2D ;AVOID QUESTION IF ONLY 1 PACK\r
+SYS2C: PUSHJ P,ASKDEC\r
+ ASCIIZ <;HOW MANY PRIVATE DRIVES?>\r
+ CAML N,RP10N\r
+ JRST SYS2C\r
+SYS2D: MOVNS N\r
+ ADD N,RP10N\r
+SYS3: PUSHJ P,OUTXP\r
+ ASCIIZ <DPCPNO=*>\r
+\f SKIPN N,DSKN\r
+ JRST SYS3A\r
+ PUSHJ P,ASKYN\r
+ ASCIIZ <;RA10 (BRYANT) DISK?>\r
+ MOVEM N,RA10N\r
+SYS3A: PUSHJ P,OUTXP\r
+ ASCIIZ <XP RA10N,*>\r
+ SETCM N,SWPYES\r
+ AND N,RA10N ;RA10 AND NO SWAP DEVICE?\r
+ JUMPE N,SYS3B ;NO. AVOID QUESTION\r
+ PUSHJ P,ASKYN\r
+ ASCIIZ <;RA10 FOR SWAPPING?>\r
+SYS3B: PUSHJ P,OUTXP\r
+ ASCIIZ <XP RASWPN,*>\r
+ SKIPN N,DSKN\r
+ JRST SYS4A\r
+ PUSHJ P,ASKYN\r
+ ASCIIZ <;DPD (DATA PRODUCTS) DISK?>\r
+ MOVEM N,DPDN\r
+SYS4A: PUSHJ P,OUTXP\r
+ ASCIIZ <XP DPDN,*>\r
+ SETCM N,SWPYES\r
+ AND N,DPDN ;DPDN AND NO SWAP DEVICE?\r
+ JUMPE N,SYS4B ;NO. AVOID QUESTION\r
+ PUSHJ P,ASKYN\r
+ ASCIIZ <;DPD FOR SWAPPING?>\r
+ MOVEM N,SWPYES\r
+SYS4B: PUSHJ P,OUTXP\r
+ ASCIIZ <XP DPSWPN,*>\r
+\f SUBTTL DETERMIN JOB AND APR CONFIGURATION\r
+JOBASK: PUSHJ P,ASKDEC\r
+ ASCIIZ <;HOW MANY JOBS?[ATTACHED AND DETACHED, COUNTING NULL JOB]>\r
+ JUMPE N,JOBASK\r
+ CAILE N,^D128\r
+ JRST JOBASK\r
+JOBOUT: PUSHJ P,OUTXP\r
+ ASCIIZ <XP JOBN,*>\r
+\r
+MXKASK: PUSHJ P,ASKDEC\r
+ ASCIIZ <;MAX SIZE OF CORE (IN K) FOR ANY SINGLE USER?\r
+;0 MEANS ALL OF CORE>\r
+MXKOUT: PUSHJ P,OUTXP\r
+ ASCIIZ <XP COREN,*>\r
+\r
+PDPASK: PUSHJ P,ASKYN\r
+ ASCIIZ <;PDP-10 PROCESSOR?[N = PDP-6]>\r
+PDPOUT: PUSHJ P,OUTXP\r
+ ASCIIZ <XP PDP10N,*>\r
+\r
+RELASK: JUMPE N, REL1 ;PDP-10?\r
+ PUSHJ P,ASKYN ;YES,ASK ABOUT 2 RELOC SOFTWARE\r
+ ASCIIZ <;2 RELOCATION REG. SOFTWARE?[Y = MUST HAVE KT10A,\r
+;N = JUST 1 RELOC. REG.]>\r
+REL1: PUSHJ P,OUTXP\r
+ ASCIIZ <XP KT10AN,*>\r
+\r
+ JUMPE N,REL2 ;SEGN=0 IF PDP-6 OR NOT 2 RELOC. SOFT\r
+ PUSHJ P,ASKDEC\r
+ ASCIIZ <;HOW MANY MORE SEGMENTS THAN JOBS?[0 UNLESS YOU\r
+;ANTICIPATE A LOT OF DORMANT SEGMENTS]>\r
+REL2: PUSHJ P,OUTXP\r
+ ASCIIZ <XP SEGN,*>\r
+\r
+DDTASK: PUSHJ P,ASKYN\r
+ ASCIIZ <;LOAD EXEC DDT?[N = ONLY IF LOADER HAS RUN OUT OF CORE BEFORE]>\r
+DDTOUT: PUSHJ P,OUTXP\r
+ ASCIIZ <XP DDTN,*>\r
+\r
+SYM: PUSHJ P,ASKYN\r
+ ASCIIZ <;LOAD LOCAL SYMBOLS?[N = ONLY IF LOADER HAS RUN OUT OF ROOM BEFORE]>\r
+SYMOUT: MOVEM N,LOCALN ;SAVE ANSWER FOR LATER INSTRUCTION\r
+UDTASK: PUSHJ P,ASKYN\r
+ ASCIIZ <;LOAD USER DDT?[BOTH CAN BE LOADED TOGETHER,\r
+;USE USER DDT FOR PATCHING UNDER TIME SHARING]>\r
+UDTOUT: PUSHJ P,OUTXP\r
+ ASCIIZ <XP UDDTN,*>\r
+NAMASK: PUSHJ P,ASKST2 ;STORE ANSWER IN LOC "ASCSTR"\r
+ ASCIIZ <;NAME OF THIS SYSTEM (24 CHARS OR LESS)?>\r
+NAMOUT: PUSHJ P,OUTSTR ;SUBSTITUTE ANSWER FOR *\r
+ ASCIIZ <DEFINE SYSNAM\r
+< ASCIZ \*\>>\r
+SERASK: PUSHJ P,ASKDEC ;GET SERIAL NUMBER OF KA10\r
+ ASCIIZ <;WHAT IS THE SERIAL NUMBER OF YOUR ARITHMETIC PROCESSOR?>\r
+SEROUT: PUSHJ P,OUTXP\r
+ ASCIIZ <XP APRSN,*>\r
+ SETZM ASCSTR ;INITIALIZE THIS CELL\r
+DEVASK: PUSHJ P,ASKST2 ;STORE ANSWER IN LOC "ASCSTC" (UP TO SIX CHAR)\r
+ ASCIIZ <;NAME OF SYSTEM DEVICE?[DTA0 USUAL FOR 10/40 SYSTEM,\r
+;DSK USUAL FOR 10/50 SYSTEM]>\r
+ SKIPE ASCSTR\r
+ JRST DEVOUT\r
+ MOVE WD,[ASCIZ /DSK/]\r
+ SKIPN DSKN\r
+ MOVE WD,[ASCIZ /DTA0/]\r
+ MOVEM WD,ASCSTR\r
+DEVOUT: PUSHJ P,OUTSTR ;SUBSTUTITE ANSWER FOR *\r
+ ASCIIZ <DEFINE SYSDEV\r
+< SIXBIT "*">>\r
+\f PUSHJ P,OUTFIL\r
+ ASCIZ &DEFINE SYSDAT\r
+< ASCIZ /&\r
+ CALL N,[SIXBIT /DATE/]\r
+ IDIVI N,^D12*^D31\r
+ ADDI N,^D64\r
+ PUSH P,N\r
+ IDIVI T,^D31\r
+ MOVEI N,1(T)\r
+ MOVEI R,12\r
+ PUSHJ P,XPSUB1\r
+ MOVEI CH,"-"\r
+ PUSHJ P,FILPUT\r
+ MOVEI N,1(T1)\r
+ PUSHJ P,XPSUB1\r
+ MOVEI CH,"-"\r
+ PUSHJ P,FILPUT\r
+ POP P,N\r
+ PUSHJ P,XPSUB1\r
+ PUSHJ P,OUTFIL\r
+ ASCIIZ </>>\r
+\r
+\f SUBTTL SET-UP TTY CONFIGURATION\r
+ PUSHJ P,ASKYN\r
+ ASCIIZ <;DATA LINE SCANNER(DC10)?[N = WILL ASK FOR 680 OR 630]>\r
+ MOVEM N,DLSN\r
+ JUMPN N,DLSOUT\r
+ PUSHJ P,ASKYN\r
+ ASCIIZ <;PDP-8 680 COMMUNICATIONS SYSTEM?[Y = 680I TOO, N = WILL ASK FOR 630]>\r
+ MOVEM N,CCIN\r
+ JUMPN N,DLSOUT\r
+ PUSHJ P,ASKYN\r
+ ASCIIZ <;630 COMMUNICATION SYSTEM?>\r
+ MOVEM N,DCSN\r
+ JUMPE N,DLSASK ;LOOP UNTIL HE SAYS Y TO ONE\r
+DLSOUT: MOVE N,DLSN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP DLSN,*>\r
+ MOVE N,CCIN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP CCIN,*>\r
+ MOVE N,DCSN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP DCSN,*>\r
+\fTTNASK: SKIPE CCIN ;JUST 680?\r
+ JRST TTN1 ;YES. NO DC10B,E, OR 632\r
+ PUSHJ P,ASKDEC\r
+ ASCIIZ <;HOW MANY DC10B (OR 632) 8-LINE DATA GROUPS?[\r
+;1=TTY0-7, 2=TTY0-17, ... , 8=TTY0-77]>\r
+ MOVEM N,TTGRPN\r
+ SKIPN BTHN\r
+ SKIPE DLSN\r
+ SKIPA\r
+ JRST TTN1\r
+ PUSHJ P,ASKDEC\r
+ ASCIIZ <;HOW MANY DC10E DATASET CONTROL GROUPS?>\r
+ MOVEM N,DSGRPN\r
+TTN1: SKIPN BTHN\r
+ SKIPE CCIN\r
+ SKIPA\r
+ JRST TTN2\r
+ PUSHJ P,ASKOCT\r
+ ASCIIZ <;HOW MANY (OCTAL) LINES ON YOUR 680(I), INCLUDING\r
+;ITS CONSOLE TELETYPE?>\r
+ MOVEM N,CCILN\r
+TTN2:\r
+TTNOUT: MOVE N,TTGRPN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP TTGRPN,*>\r
+ MOVE N,DSGRPN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP DSGRPN,*>\r
+ MOVE N,CCILN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP CCILN,*>\r
+TTNEND:\r
+\fTTYASK: PUSHJ P,OUTBTH\r
+ ASCIIZ <;ANSWER THE FOLLOWING QUESTIONS ABOUT YOUR TELETYPE LINES:\r
+;[TYPE OCTAL LINE NUMBERS, ONE PER LINE.\r
+;TYPE EXTRA CR WHEN DONE.]\r
+>\r
+TTY0: PUSHJ P,OUTBTH\r
+ ASCIIZ <;DATA SET LINES?[PROJECT 1 CAN'T LOGIN, LOGIN RESETS\r
+;LINE TO COMPUTER ECHOING AND NO HARDWARE TABS]>\r
+TTY0A: PUSHJ P,TTYIN1\r
+ JRST TTY1\r
+ PUSHJ P,OUTSTR\r
+ ASCIIZ <XP DSD*,1>\r
+ JRST TTY0A\r
+\r
+TTY1: PUSHJ P,OUTBTH\r
+ ASCIIZ <;LINES WITH HARDWARE TABS?[MONITOR SIMULATES REST WITH SPACES]>\r
+TTY1A: PUSHJ P,TTYIN1\r
+ JRST TTY2 ;CR\r
+ PUSHJ P,OUTSTR\r
+ ASCIIZ <XP TAB*,1>\r
+ JRST TTY1A\r
+\r
+TTY2: PUSHJ P,OUTBTH\r
+ ASCIIZ <;REMOTE LINES?[PROJECT 1 CAN'T LOGIN,]>\r
+TTY2A: PUSHJ P,TTYIN1\r
+ JRST TTY21 ;CR\r
+ PUSHJ P,OUTSTR\r
+ ASCIIZ <XP RMT*,1>\r
+ JRST TTY2A\r
+\r
+TTY21: PUSHJ P,OUTBTH ;ASK ABOUT LOCAL COPY LINES\r
+ ASCIIZ <;LOCAL COPY LINES? [ECHOING PROVIDED BY TERMINAL RATHER\r
+;THAN BY COMPUTER. OFTEN (INCORRECTLY) CALLED "HALF DUPLEX".]>\r
+TTY21A: PUSHJ P,TTYIN1 ;GET A LINE NUMBER\r
+ JRST TTY3 ;JUST A CARRIAGE RETURN\r
+ PUSHJ P,OUTSTR ;PUT LINE NUMBER IN THE FILE\r
+ ASCIIZ <XP LCP*,1>\r
+ JRST TTY21A ;SEE IF ANY MORE LOCAL COPY LINES\r
+\r
+TTY3: PUSHJ P,OUTBTH\r
+ ASCIIZ <;HALF DUPLEX LINES?[TWX OR HALF DUPLEX WIRED SCANNER(DC10C)]>\r
+TTY3A: PUSHJ P,TTYIN1\r
+ JRST TTY4\r
+ PUSHJ P,OUTSTR\r
+ ASCIIZ <XP HLF*,1>\r
+ JRST TTY3A\r
+\fTTY4: PUSHJ P,OUTBTH\r
+ ASCIIZ <;SLAVES? [NO COMMANDS MAY BE TYPED]>\r
+TTY4A: PUSHJ P,TTYIN1\r
+ JRST TTY5\r
+ PUSHJ P,OUTSTR\r
+ ASCIIZ <XP SLV*,1>\r
+ JRST TTY4A\r
+TTY5: PUSHJ P,OUTBTH\r
+ ASCIIZ <;LINES WITH HARDWARE FORMFEED? [LEAVE OUT IF USERS WOULD RATHER\r
+;NOT GET FORMFEEDS UNTIL THEY DO TTY FORM COMMAND]>\r
+TTY5A: PUSHJ P,TTYIN1\r
+ JRST TTY6\r
+ PUSHJ P,OUTSTR\r
+ ASCIIZ <XP FRM*,1>\r
+ JRST TTY5A\r
+TTY6: PUSHJ P,OUTBTH\r
+ ASCIIZ <;LINES WHICH RUN INITIA AT STARTUP?>\r
+TTY6A: PUSHJ P,TTYIN1\r
+ JRST TTY7\r
+ PUSHJ P,OUTSTR\r
+ ASCIIZ <XP INI*,1>\r
+ JRST TTY6A\r
+TTY7:\r
+\r
+EDTASK: PUSHJ P,ASKYN\r
+ ASCIIZ <;COMMON.MAC ALREADY EDITED FOR YOUR TTY CONFIGURATION?[\r
+;N = WILL ALLOW YOU TO DEFINE NOW]>\r
+EDTOUT: PUSHJ P,OUTXP\r
+ ASCIIZ <XP EDITN,*>\r
+ JUMPN N,TTYEND ;DO NOT ASK QUESTIONS ABOUT TTY IF EDITED\r
+\r
+\fDSCASK: SKIPN DSGRPN ;ANY DC10E'S?\r
+ JRST DSCEND ;NO\r
+ PUSHJ P,OUTBTH\r
+ ASCIIZ <;WHAT IS THE CORRESPONDENCE BETWEEN THE DC10E LINES\r
+;AND THE DC10B LINES? TYPE "#,#" FOR EACH DATASET. FIRST # IS\r
+;DC10E LINE, SECOND # IS DC10B LINE.[# IS AN OCTAL NUMBER.\r
+;TYPE ONE #,# PER LINE, EXTRA CR WHEN DONE.]>\r
+\r
+\r
+ PUSHJ P,OUTFIL\r
+ ASCIZ /DEFINE DSASOC <\r
+/\r
+DSC1: PUSHJ P,TTYIN1\r
+ JRST DSC2 ;CR ONLY\r
+ PUSHJ P,OUTSTR\r
+ ASCIIZ <GENLIN *>\r
+ JRST DSC1 ;LOOP FOR MORE\r
+DSC2: PUSHJ P,OUTFIL\r
+ ASCIZ />\r
+/\r
+DSCEND:\r
+TTYEND:\r
+\f SUBTTL SET-UP GENERAL PERIPHERAL CONFIGURATION\r
+PTRASK: PUSHJ P,ASKYN\r
+ ASCIIZ <;PT READER?>\r
+PTROUT: PUSHJ P,OUTXP\r
+ ASCIIZ <PTRN==* ;NOT GLOBAL BECAUSE OF DSKSER USE>\r
+\r
+PTPASK: PUSHJ P,ASKYN\r
+ ASCIIZ <;PT PUNCH?>\r
+PTPOUT: PUSHJ P,OUTXP\r
+ ASCIIZ <XP PTPN,*>\r
+\r
+PLTASK: PUSHJ P,ASKYN\r
+ ASCIIZ <;PLOTTER?>\r
+PLTOUT: PUSHJ P,OUTXP\r
+ ASCIIZ <XP PLTN,*>\r
+\r
+LPTASK: PUSHJ P,ASKDEC\r
+ ASCIIZ <;HOW MANY LINE PRINTERS?[0,1 OR 2]>\r
+ CAILE N,2\r
+ JRST LPTASK\r
+ MOVEM N,LPTN\r
+LPTOUT: MOVE N,LPTN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP LPTN,*>\r
+\r
+CDRASK: PUSHJ P,ASKYN\r
+ ASCIIZ <;CARD READER?>\r
+ MOVEM N,CDRN\r
+ JUMPE N,CDROUT\r
+CDR1: PUSHJ P,ASKYN\r
+ ASCIIZ <;CR10?[Y = CR10A TOO, N IF PDP-6 CARD READER]>\r
+ MOVEM N,CR10N\r
+CDROUT: MOVE N,CDRN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP CDRN,*>\r
+ MOVE N,CR10N\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP CR10N,*>\r
+CDPASK: PUSHJ P,ASKYN\r
+ ASCIIZ <;CARD PUNCH?>\r
+CDPOUT: PUSHJ P,OUTXP\r
+ ASCIIZ <XP CDPN,*>\r
+\fDISASK: PUSHJ P,ASKYN\r
+ ASCIIZ <;DISPLAY?>\r
+ JUMPE N,DISOUT\r
+ MOVEM N,DISN\r
+DIS1: PUSHJ P,ASKYN\r
+ ASCIIZ <;TYPE 340?>\r
+ MOVEM N,T340N\r
+DISOUT: MOVE N,DISN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP DISN,*>\r
+ MOVE N,DISN\r
+ PUSHJ P,OUTXP ;ASSUME PEN IF DISPLAY\r
+ ASCIIZ <XP PENN,*>\r
+ MOVE N,T340N\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP T340N,*>\r
+\fDTAASK: PUSHJ P,ASKDEC\r
+ ASCIIZ <;HOW MANY DECTAPES?[0 TO 8]>\r
+ JUMPE N,DTAOUT\r
+ CAILE N,^D8\r
+ JRST DTAASK\r
+ MOVEM N, DTANN\r
+DTA1: PUSHJ P,ASKYN\r
+ ASCIIZ <;TD10 DECTAPE CONTROL?[N = PDP-6 DECTAPE]>\r
+ MOVE T,DTANN\r
+ SKIPE N\r
+ MOVEM T,DTAN\r
+ SKIPN N\r
+ MOVEM T,DTCN\r
+DTAOUT: MOVE N,DTAN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP DTAN,*>\r
+ MOVE N,DTCN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP DTCN,*>\r
+\fMTAASK: PUSHJ P,ASKDEC\r
+ ASCIIZ <;HOW MANY MAGTAPES?[0 TO 8]>\r
+ JUMPE N,MTAOUT\r
+ CAILE N,^D8\r
+ JRST MTAASK\r
+ MOVEM N,MTANN\r
+MTA1: PUSHJ P,ASKYN\r
+ ASCIIZ <;TM-10A CONTROL?[N = WILL ASK TM-10B, THEN PDP-6 MAGTAPES]>\r
+ JUMPE N,MTA2\r
+ MOVE N,MTANN\r
+ MOVEM N,MTAN\r
+ JRST MTAOUT\r
+\r
+MTA2: PUSHJ P,ASKYN\r
+ ASCIIZ <;TM-10B CONTROL?>\r
+ JUMPE N,MTA3\r
+ MOVE N,MTANN\r
+ MOVEM N,MTBN\r
+ JRST MTAOUT\r
+\r
+MTA3: PUSHJ P,ASKYN\r
+ ASCIIZ <;PDP-6 MAGTAPE?>\r
+ JUMPE N,MTAASK ;LOOP UNTIL HE PICKS ONE\r
+ MOVE N,MTANN\r
+ MOVEM N,MTCN\r
+MTAOUT: MOVE N,MTAN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP MTAN,*>\r
+ MOVE N,MTBN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP MTBN,*>\r
+ MOVE N,MTCN\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP MTCN,*>\r
+PTYASK: PUSHJ P,ASKDEC\r
+ ASCIIZ <;HOW MANY PSEUDO-TTY'S?[EACH CONCURRENT BATCH NEEDS ONE]>\r
+ CAILE N,^D64\r
+ JRST PTYASK\r
+ PUSHJ P,OUTXP\r
+ ASCIIZ <XP PTYN,*>\r
+\f SUBTTL DETERMIN MISC. PARAMETERS\r
+\fASKSYM: PUSHJ P,OUTBTH\r
+ ASCIIZ <;TYPE "SYMBOL,VALUE" (VALUE IN DECIMAL)[FOR ANY SYMBOLS\r
+;TO BE DEFINED. NEXT QUESTION WILL ASK FOR OCTAL DEFINITION.\r
+;TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]>\r
+ PUSHJ P,OUTFIL ;MAKE MACRO CONVERT IN DECIMAL RADIX WHEN COMMON ASS.\r
+ ASCIIZ <RADIX 10>\r
+GETSYM: PUSHJ P,TTYIN\r
+ ILDB CH,B\r
+ CAIN CH,12\r
+ JRST SYMDON\r
+ PUSHJ P,OUTSTR\r
+ ASCIIZ <XP *>\r
+ JRST GETSYM\r
+SYMDON: PUSHJ P,OUTFIL ;PSEUDO OP BACK TO OCTAL\r
+ ASCIIZ <RADIX 8>\r
+\r
+ASKSY8: PUSHJ P,OUTBTH\r
+ ASCIIZ <;TYPE "SYMBOL,VALUE" (VALUE IN OCTAL)[FOR ANY SYMBOLS\r
+;TO BE DEFINED. TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]>\r
+GETSY8: PUSHJ P,TTYIN\r
+ ILDB CH,B\r
+ CAIN CH,12\r
+ JRST OCTDON\r
+ PUSHJ P,OUTSTR\r
+ ASCIIZ <XP *>\r
+ JRST GETSY8\r
+OCTDON:\r
+\fASKDEV: PUSHJ P,OUTBTH\r
+ ASCIIZ <;TYPE "DEVICE-MNEMONIC,CHANNEL"FOR SPECIAL DEVICES[\r
+;WITH NEITHER CHANNEL SAVE ROUTINE NOR DEVICE DATA BLOCK.\r
+;"DEVICE" MUST BE 3 CHARACTERS OR LESS.\r
+;TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]>\r
+ PUSHJ P,OUTFIL\r
+ ASCIZ /DEFINE SPCINT\r
+<\r
+/\r
+DEV0: PUSHJ P,TTYIN\r
+ ILDB CH,B\r
+ CAIN CH,12 ;LF\r
+ JRST DEV1\r
+ PUSHJ P,OUTSTR\r
+ ASCIIZ < SPASGINT *>\r
+ JRST DEV0\r
+\r
+DEV1: PUSHJ P,OUTFIL\r
+ ASCIZ />/\r
+ PUSHJ P,OUTBTH\r
+ ASCIIZ <;TYPE "DEVICE-MNEMONIC,CHANNEL,NO.-OF-DEVICES"[\r
+;FOR SPECIAL DEVICE WITH DEVICE DATA BLOCKS\r
+;"DEVICE" MUST BE 3 CHARS. OR LESS.\r
+;TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]>\r
+ PUSHJ P,OUTFIL\r
+ ASCIZ /DEFINE SPCDDB\r
+<\r
+/\r
+DEV2: PUSHJ P,TTYIN\r
+ ILDB CH,B\r
+ CAIN CH,12\r
+ JRST DEV3\r
+ PUSHJ P,OUTSTR\r
+ ASCIIZ < SPASGDDB *>\r
+ JRST DEV2\r
+DEV3: PUSHJ P,OUTFIL\r
+ ASCIZ />/\r
+\f PUSHJ P,OUTBTH\r
+ ASCIIZ <;TYPE "DEVICE-MNEMONIC,CHANNEL,HIGHEST-AC-TO-SAVE[\r
+;FOR SPECIAL DEVICE WITH CHANNEL SAVE ROUTINES TO SAVE AC'S UP TO\r
+;"HIGHEST-AC-TO-SAVE". "DEVICE" MUST BE 3 CHARS. OR LESS.\r
+;TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]>\r
+ PUSHJ P,OUTFIL\r
+ ASCIZ /DEFINE SPCSAV\r
+<\r
+/\r
+DEV4: PUSHJ P,TTYIN\r
+ ILDB CH,B\r
+ CAIN CH,12\r
+ JRST DEV5\r
+ PUSHJ P,OUTSTR\r
+ ASCIIZ < SPASGSAV *>\r
+ JRST DEV4\r
+DEV5: PUSHJ P,OUTFIL\r
+ ASCIZ />/\r
+\r
+REMEND:\r
+\f SUBTTL FINISH OFF THE JOB\r
+ PUSHJ P,OUTBTH\r
+ ASCIIZ <;[MONGEN FINISHED\r
+;NEXT YOU MUST ASSEMBLE COMMON WITH MACRO>\r
+ SKIPN LEVDN\r
+ JRST ASSEM1\r
+ PUSHJ P,OUTBTH\r
+ ASCIIZ <;AND COMMOD>\r
+ASSEM1: PUSHJ P,OUTBTH\r
+ ASCIIZ <;THEN LOAD IT AND REST OF MONITOR WITH LOADER\r
+;AND FINALLY SAVE IT WITH MONITOR COMMAND SAVE\r
+\r
+;[TO ASSEMBLE COMMON, TYPE:\r
+;R MACRO\r
+;DSK:COMMON,LPT:_DSK:S,CONFIG,COMMON>\r
+ PUSHJ P,OUTBTH\r
+ ASCIIZ <;TO LOAD NEW MONITOR, TYPE:\r
+;R LOADER>\r
+ SKIPN LOCALN\r
+ JRST NOLCLS\r
+ PUSHJ P,OUTBTH\r
+ ASCIIZ <;/S>\r
+NOLCLS: SKIPN SYS40N ;10/40 SYSTEM?\r
+ JRST SYS40A ;NO\r
+ PUSHJ P,OUTBTH ;YES, TYPE PROPER LIBRARY NAME\r
+ ASCIIZ <;BIN:COMMON,BIN:SYS50/L>\r
+ JRST SYS40B\r
+\r
+SYS40A: PUSHJ P,OUTBTH\r
+ ASCIIZ <;DSK:COMMON,COMMOD,DSK:SYS40/L>\r
+SYS40B: PUSHJ P,OUTBTH\r
+ ASCIIZ <;LPT:_/W/D/A/M/P/G>\r
+DDT1: PUSHJ P,OUTBTH\r
+ ASCIIZ <;TO SAVE MONITOR, TYPE:\r
+;SAVE DSK MONITOR\r
+;]\r
+; END OF CONFIGURATION DEFINITION\r
+ SUBTTL\r
+;]>\r
+ MOVEI CH,14 ;OUTPUT FORMFEED FOR END OF CONFIG.MAC FILE\r
+ PUSHJ P,FILPUT\r
+ RELEASE OUTCHN, ;RELEASE OUTPUT FILE\r
+ CALL [SIXBIT /EXIT/]\r
+\f SUBTTL VARIABLE AND PARAMETER STORAGE\r
+;VARIABLE STORAGE\r
+TOBUF: BLOCK 3 ;TTY OUTPUT BUFFER HEADER\r
+TIBUF: BLOCK 3 ;TTY INPUT BUFFER HEADER\r
+FOBUF: BLOCK 3 ;FILE OUTPUT BUFFER HEADER\r
+\r
+PDLIST: BLOCK 12\r
+\r
+RC10S: BLOCK 1\r
+RP10S: BLOCK 1\r
+RA10S: BLOCK 1\r
+\f;VARIABLES WHICH ARE ALSO OUTPUT IN CONFIG.MAC\r
+;NONE OF THE VALUES OF THESE VARIABLES ARE USED OUTSIDE OF THE QUESTION IN WHICH THEY ARE ASKED.\r
+VARBEG: ;BEGINNING OF AREA TO BE CLEARED\r
+SHORT: 0 ;NON-ZERO IF SHORT DIALOG(OMIT STUFF IN [])\r
+LEFTBK: 0 ;NON-ZERO IF LEFT BRACKET SEEN\r
+SYS40N: 0 ;\r
+DSKN: 0\r
+LEVDN: 0 ;LEVEL D VS LEVEL C\r
+CHNN: 0\r
+LOGINN: 0\r
+RD10N: 0 ;\r
+RP10N: 0 ;\r
+RA10N: 0 ;\r
+DPDN: 0 ;\r
+SWPYES: 0\r
+LOCALN: 0 ;\r
+BTHN: 0 ;BOTH 680 AND DC10\r
+DLSN: 0 ;\r
+CCIN: 0 ;\r
+DCSN: 0 ;\r
+TTGRPN: 0 ;GROUPS OF DC10B OR 632\r
+DSGRPN: 0 ;GROUPS OF DC10E\r
+CCILN: 0 ;LINES OF 680\r
+CDRN: 0 ;\r
+CR10N: 0 ;\r
+DISN: 0 ;\r
+T340N: 0 ;\r
+TVP10N: 0 ;\r
+T30N: 0 ;\r
+DTANN: 0 ;\r
+DTAN: 0 ;\r
+DTCN: 0 ;\r
+MTANN: 0 ;\r
+MTAN: 0 ;\r
+MTBN: 0 ;\r
+MTCN: 0 ;\r
+SPCDEV: 0 ;SET NONZERO IF ANY SPECIAL DEVICES\r
+TEMPN: 0 ;\r
+TMPN: 0 ;\r
+TMPLN: 0 ;\r
+LPTN: 0\r
+MOVIEN: 0 ;\r
+LOKN: 0\r
+VAREND=.-1 ;END OF AREA TO BE CLEARED\r
+\f SUBTTL SUBROUTINES\r
+;ROUTINE TO WRITE IN-LINE STRING ON OUTPUT FILE\r
+;CALL: PUSHJ P,OUTFIL\r
+; ASCIIZ <MESSAGE>\r
+; RETURN\r
+\r
+OUTFIL: MOVE T,(P)\r
+ PUSHJ P,FILO\r
+ POP P,CH\r
+ JRST 1(T)\r
+\r
+\r
+\r
+;ROUTINE TO WRITE OUT-OF-LINE STRING ON OUTPUT FILE\r
+;CALL: MOVEI T,[ASCIZ /MESSAGE/]\r
+; PUSHJ P,FILO\r
+; RETURN\r
+\r
+FILO: HRLI T,440700\r
+FILOLP: ILDB CH,T\r
+ JUMPE CH,CPOPJ\r
+ PUSHJ P,FILPUT\r
+ JRST FILOLP\r
+\r
+;ROUTINE TO OUTPUT AN IN LINE STRING TO BOTH FILE AND TTY\r
+;CALL: PUSHJ P,OUTBTH\r
+; ASCIZ /STRING/\r
+; RETURN\r
+\r
+OUTBTH: MOVE T,(P)\r
+ PUSHJ P,FILO\r
+ ;FALL INTO OUTTTY\r
+;ROUTINE TO OUTPUT AN IN-LINE STRING TO TTY\r
+;CALL: PUSHJ P,OUTBTH\r
+; ASCIZ /STRING/\r
+; RETURN\r
+\r
+OUTTTY: MOVE T,(P)\r
+ PUSHJ P,TTYO\r
+ POP P,CH\r
+ JRST 1(T)\r
+\f;ROUTINE TO OUTPUT AN OUT-OF-LINE STRING ON TTY\r
+;CALL: MOVEI T,[ASCIZ /STRING/]\r
+; PUSHJ P,TTYO\r
+; RETURN\r
+\r
+TTYO: HRLI T,440700\r
+TTYOLP: ILDB CH,T\r
+ JUMPE CH,TTYFIN\r
+ CAIE CH,"[" ;IS THIS A LEFT BRACKET?\r
+ JRST TTYO1 ;NO,\r
+ SKIPE SHORT ;YES, IS SHORT DIALOG WANTED?\r
+ SETOM LEFTBK ;YES, SET LEFT BRACKET SO OUTPUT SUPPRESSED\r
+TTYO1: SKIPE LEFTBK ;OUTPUT SUPPRESSED BECAUSE INSIDE []?\r
+ JRST TTYO2 ;YES\r
+ CAIE CH,";" ;NO, DO NOT TYPE ";" ON TTY\r
+ PUSHJ P,TTYPUT\r
+TTYO2: CAIN CH,"]" ;END OF LONG STUFF?\r
+ SETZM LEFTBK ;YES, TURN OFF TTY SUPPRESS FLAG\r
+ JRST TTYOLP\r
+\r
+TTYFIN: OUTPUT TOCHN,\r
+CPOPJ: POPJ P,\r
+\f;ROUTINE TO ASK A QUESTION AND ACCEPT Y OR N (1 OR 0)\r
+;CALL: PUSHJ P,ASKYN\r
+; ASCIZ /QUESTION?/\r
+; RETURN\r
+\r
+ASKYN: PUSHJ P,FCRLF ;PUT CRLF IN FILE ONLY\r
+ HRRZ T,(P)\r
+ PUSHJ P,FILO\r
+YN1: HRRZ T,(P)\r
+ HRLS (P)\r
+ PUSHJ P,TTYO\r
+ AOS T\r
+ HRRM T,(P)\r
+ PUSHJ P,TTYIN\r
+ PUSHJ P,GETWRD\r
+ MOVEI N,0\r
+ CAME WD,[SIXBIT /0/]\r
+ CAMN WD,[SIXBIT /N/]\r
+ JRST YNOK\r
+ CAMN WD,[SIXBIT /NO/]\r
+ JRST YNOK\r
+ MOVEI N,1\r
+ CAME WD,[SIXBIT /1/]\r
+ CAMN WD,[SIXBIT /Y/]\r
+ JRST YNOK\r
+ CAME WD,[SIXBIT /YES/]\r
+ JRST YN2\r
+YNOK: PUSHJ P,OUTSTR\r
+ ASCIIZ <;*>\r
+ POPJ P,\r
+\r
+YN2: HLRS (P)\r
+ JRST YN1\r
+\f;ROUTINE TO OUTPUT ON FILE ASCIZ STRING IN ASCSTR\r
+; SUBSTITUTED FOR "*"\r
+;CALL: PUSHJ P,OUTSTR\r
+; ASCIIZ <MESSAGE*MESSAGE>\r
+OUTSTR: MOVE T,(P)\r
+ PUSHJ P,STRO\r
+ POP P,CH\r
+ JRST 1(T)\r
+\r
+STRO: HRLI T,440700\r
+STROLP: ILDB CH,T\r
+ JUMPE CH,CPOPJ\r
+ CAIN CH,"*"\r
+ JRST STRSUB\r
+ PUSHJ P,FILPUT\r
+ JRST STROLP\r
+\r
+STRSUB: PUSH P,T\r
+ MOVEI T,ASCSTR\r
+ PUSHJ P,FILO\r
+ POP P,T\r
+ JRST FILOLP\r
+\f;ROUTINE TO SUBSTITUTE OCTAL VALUE OF N FOR * IN STRING\r
+; AND OUTPUT ON FILE\r
+; MOVE N,OCTAL NUMBER\r
+;CALL: PUSHJ P,OUTXP\r
+; ASCIZ /MESSAGE*MESSAGE/\r
+;RETURN WITH N PRESERVED\r
+\r
+OUTXP: MOVE T,(P)\r
+ PUSHJ P,XPO\r
+ POP P,CH\r
+ JRST 1(T)\r
+\r
+XPO: HRLI T,440700\r
+XPOLP: ILDB CH,T\r
+ JUMPE CH,CPOPJ\r
+ CAIN CH,"*"\r
+ JRST XPSUB\r
+ PUSHJ P,FILPUT\r
+ JRST XPOLP\r
+\r
+XPSUB: PUSH P,T\r
+ PUSH P,N\r
+ MOVEI R,10\r
+ PUSHJ P,XPSUB1\r
+ POP P,N\r
+ POP P,T\r
+ JRST FILOLP\r
+XPSUB1: IDIVI N,(R)\r
+ HRLM T,(P)\r
+ JUMPE N,.+2\r
+ PUSHJ P,XPSUB1\r
+ HLRZ T,(P)\r
+ MOVEI CH,"0"(T)\r
+ JRST FILPUT\r
+\f;ROUTINE TO PUT 1 CHAR IN OUTPUT FILE\r
+;CALL: MOVEI CH,CHAR\r
+; PUSHJ P,FILPUT\r
+\r
+FILPUT: CAIN CH,15 ;CARRIAGE RETURN?\r
+ POPJ P,0 ;YES. THROW IT AWAY\r
+ CAIN CH,12 ;LINE FEED?\r
+ JRST FILPU1 ;YES. TURN INTO CR-LF\r
+FILPU2: SOSG FOBUF+2\r
+ OUTPUT FOCHN,\r
+ IDPB CH,FOBUF+1\r
+ POPJ P,\r
+\r
+FILPU1: MOVEI CH,15 ;OUTPUT A CR\r
+ PUSHJ P,FILPU2\r
+ MOVEI CH,12 ;AND A LINEFEED\r
+ JRST FILPU2\r
+\r
+;ROUTINE TO PUT 1 CHAR IN OUTPUT TTY\r
+;CALL: MOVEI CH,CHAR\r
+; PUSHJ P,TTYPUT\r
+\r
+TTYPUT: SOSG TOBUF+2\r
+ OUTPUT TOCHN,\r
+ IDPB CH,TOBUF+1\r
+ POPJ P,\r
+\f;ROUTINE TO ASK FOR A STRING AND DELETE THE CR-LF FROM THE ANSWER\r
+;CALL: PUSHJ P,ASKST2\r
+ ASCIIZ <QUESTION>\r
+\r
+ASKST2: PUSHJ P,ASKSTZ\r
+ PUSHJ P,TTYIN\r
+ ILDB T,B\r
+ASKST4: CAIE T,12\r
+ JUMPN T,.-2\r
+ DPB CH,B\r
+ POPJ P,\r
+\r
+;ROUTINE TO ASK FOR A STRING\r
+;CALL: PUSHJ PDP,ASKSTR\r
+; ASCIIZ <QUESTION>\r
+\r
+ASKSTR: PUSHJ P,ASKSTZ\r
+ JRST TTYIN\r
+\r
+\r
+ASKSTZ: PUSHJ P,FCRLF ;PUT CRLF IN FILE ONLY\r
+ HRRZ T,-1(P)\r
+ PUSHJ P,FILO\r
+ HRRZ T,-1(P)\r
+ PUSHJ P,TTYO\r
+ AOS T\r
+ EXCH T,(P)\r
+ JRST (T)\r
+\f;ROUTINE TO ACCEPT 1 LINE FROM TTY AND MOVE TO ASCSTR AND\r
+; APPEND A NULL CHAR.\r
+;CALL: PUSHJ P,TTYIN\r
+\r
+TTYIN: MOVE T,[XWD 440700,ASCSTR]\r
+ASCLP: PUSHJ P,TTYGET\r
+ JRST ASCEND\r
+ IDPB CH,T\r
+ JRST ASCLP\r
+\r
+ASCEND: IDPB CH,T\r
+ MOVEI CH,0\r
+ IDPB CH,T\r
+ MOVE B,[XWD 440700,ASCSTR]\r
+ POPJ P,\r
+\r
+;ROUTINE TO GET 1 CHAR FROM TTY\r
+;CALL: PUSHJ P,TTYGET\r
+; RETURN1 WITH CR IN AC CH\r
+; RETURN2 WITH ANY OTHER CHAR IN AC CH\r
+\r
+TTYGET: SOSG TIBUF+2\r
+ INPUT TTYCHN,\r
+ ILDB CH,TIBUF+1\r
+ JUMPE CH,TTYGET\r
+ CAIN CH,15\r
+ JRST TTYGET\r
+ CAIE CH,12\r
+ AOS (P)\r
+ POPJ P,\r
+\r
+\r
+;ROUTINE TO ACCEPT 1 LINE FROM TTY AND MOVE TO ASCSTR AND APPEND NULL\r
+;SAME AS TTYIN, SKIP RETURN IF NON-BLANK LINE\r
+;CALL: PUSHJ P,TTYIN1\r
+; BLANK LINE RETURN\r
+; NON-BLANK LINE RETUNR\r
+\r
+TTYIN1: PUSHJ P,TTYIN ;GET LINE\r
+ ILDB T,B ;LF?\r
+ CAIE T,12\r
+ AOS (P) ;NO,\r
+ JRST ASKST4 ;REMOVE CR-LF FROM END OF STRING\r
+\f;ROUTINE TO GET FIRST 6 CHAR TYPED IN A RETURN AS SIXBIT\r
+; LEFT JUSTIFIED IN AC WD\r
+\r
+GETWRD: MOVE T,[XWD 440600,WD]\r
+ MOVEI WD,0\r
+GETWDL: ILDB CH,B\r
+ JUMPE CH,CPOPJ\r
+ CAIG CH,15\r
+ CAIGE CH,12\r
+ SKIPA\r
+ POPJ P,\r
+ CAIE CH,":"\r
+ CAIN CH,"."\r
+ POPJ P,\r
+ CAIGE CH,140\r
+ TRC CH,40\r
+ IDPB CH,T\r
+ TRNN WD,77\r
+ JRST GETWDL\r
+ POPJ P,\r
+ASCSTR: BLOCK 20 ;ASCIZ STRING\r
+\r
+;ROUTINE TO ASK A QUESTION AND ACCEPT A DECIMAL ANSWER\r
+;CALL: PUSHJ P,ASKDEC\r
+; ASCIIZ <QUESTION>\r
+\r
+ASKDEC: MOVEI R,12\r
+ JRST ASKNUM\r
+ASKDC1: MOVEI R,12\r
+ JRST ASKNM1\r
+\f;ROUTINE TO ASK A QUESTION AND ACCEPT AN OCTAL NUMBER\r
+;CALL: PUSHJ P,ASKOCT\r
+; ASCIZ /QUESTION/\r
+\r
+ASKOCT: MOVEI R,10\r
+ASKNUM: PUSHJ P,FCRLF ;PRECEDE WITH CRLF IN FILE ONLY\r
+ASKNM1: HRRZ T,(P)\r
+ PUSHJ P,FILO\r
+ MOVEI CH,";"\r
+ PUSHJ P,FILPUT\r
+ASKNE: HRRZ T,(P)\r
+ PUSHJ P,TTYO\r
+ MOVEI N,0\r
+ASKNL: PUSHJ P,TTYGET\r
+ JRST ASKNXT\r
+ CAIL CH,"0"\r
+ CAIL CH,"0"(R)\r
+ JRST ASKERR\r
+ IMUL N,R\r
+ ADDI N,-"0"(CH)\r
+ PUSHJ P,FILPUT\r
+ JRST ASKNL\r
+ASKNXT: PUSHJ P,FCRLF\r
+ POP P,T1\r
+ JRST 1(T)\r
+ASKERR: PUSHJ P,TTYGET\r
+ JRST ASKNE\r
+ JRST .-2\r
+\r
+\r
+\r
+;ROUTINE TO OUTPUT CRLF IN OUTPUT FILE\r
+;CALL: PUSHJ P,FCRLF\r
+;USED TO SEPARATE QUESTION FROM PREVIOUS MACRO CALL\r
+\r
+FCRLF: MOVEI CH,15\r
+ PUSHJ P,FILPUT\r
+ MOVEI CH,12\r
+ JRST FILPUT\r
+\f END MONGEN\r
+\r
+\f\r
--- /dev/null
+ TITLE MTASRX - MAGTAPE ROUTINES FOR PDP-10(TM-10) V420\r
+SUBTTL T. WACHS/TH TS 20 MAY 69\r
+ XP VMTASR,420 ;DEFINE VERSION NUMBER FOR LOADER STORAGE MAP\r
+\r
+ENTRY MTASRX\r
+MTASRX:\r
+\r
+INTERNAL MTADSP\r
+\r
+;DISPATCH TABLE\r
+ JRST MTAINI\r
+ JRST HUNGTP ;HUNG DEVICE\r
+MTADSP: JRST MTAREL ;RELEASE\r
+ JRST MTCLOS ;CLOSE\r
+ JRST MTOUT\r
+ JRST MTIN\r
+ JRST SAVCHK ;ENTER\r
+ JRST SAVCHK ;LOOKUP\r
+ JRST MTDMPO\r
+ JRST MTDMPI\r
+ POPJ PDP, ;USETO\r
+ POPJ PDP, ;USETI\r
+ JRST CPOPJ1 ;RENAME\r
+ POPJ PDP, ;CLOSE INPUT\r
+ POPJ PDP, ;UTPCLR\r
+ JRST MTAP0T\r
+\r
+MTC=340\r
+MTS=344\r
+\r
+;MTACHN=FLAG CHANNEL\r
+;MTOCHN=DATA CHANNEL\r
+;MTFLAG=10*MTACHN + 400\r
+;MTBOTH=10*MTACHN+MTDCHN\r
+;MTALOC=40 + 2*MTDCHN\r
+;MTLOC1=MTALOC+1\r
+ INTERN MTAINI,MTADDS,MTADDB\r
+ EXTERN ADVBFE,ADVBFF,MTFLAG,MTBOTH,SETACT,CLRACT,WSYNC\r
+ EXTERN STDENS,SETIOD,MTREQ,MTAVAL,CLOCK,MTALOC,MTLOC1,OUT\r
+ EXTERN CPOPJ,CPOPJ1,PIOMOD,PUNIT,MTWAIT,JIFSC2,COMCHK\r
+ EXTERN PIOFF,PION,MTASAV,ADRERR,PDVCNT,MTSIZ,STOIOS,IADRCK\r
+\r
+COMPAT=1000 ;IBM COMPATABLE 9-TRACK\r
+DMPMOD=20000 ;DUMP MODE FLAG\r
+MTREW=40000 ;MAGTAPE IS REWINDING\r
+\r
+MTTRY=3 ;NO. OF TIMES TO RETRY ON AN ERROR\r
+QUANT=3 ;NO. OF RECORDS TO READ UNINTERRUPTED\r
+\fTP=DAT\r
+;DDB\r
+MTADDB: SIXBIT /MTA0/\r
+ XWD ^D30*HUNGST,MTSIZ+1\r
+ 0\r
+ MTADSP\r
+ XWD 1023,154403\r
+ 0\r
+ 0\r
+ XWD PROG,0\r
+ XWD PROG,0\r
+ XP MTADDS,.-MTADB ;SIZE OF DDB (FOR BUILD)\r
+\f;INITIALIZE\r
+MTAINI: SETOM NMTREW ;RESET FLAGS\r
+ SETOM UNIT\r
+ SETZM ERRFLG\r
+ SETZM REMNDR\r
+ CONO MTC,0 ;TURN OFF MTC\r
+ MOVE TAC,[JSR MTDEND] ;SET UP END-CONDITION\r
+ MOVEM TAC,MTLOC1 ;FOR BLKI/BLKO\r
+ POPJ PDP,\r
+\r
+;IF ENTER OR LOOKUP IN SAVE MODE - CHANGE TO MODE 16\r
+SAVCHK: LDB TAC,PIOMOD ;GET MODE\r
+ CAIN TAC,0 ;SAVE MODE?\r
+ TRO IOS,16 ;YES, CHANGE TO DUMP-MODE\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ JRST CPOPJ1 ;GIVE GOOD RETURN FROM LOOKUP/ENTER\r
+;CLOSE\r
+MTCLOS: TLNN DEVDAT,OUTPB ;OUTPUT BEEN DONE?\r
+ POPJ PDP, ;NO. GO AWAY\r
+\r
+ LDB TAC,PIOMOD\r
+ CAIGE TAC,16 ;DUMP MODE?\r
+ PUSHJ PDP,OUT ;NO. EMPTY LAST PARTIAL BUFFER\r
+ PUSHJ PDP,WSYNC ;WAIT FOR IO TO STOP\r
+ MOVEI UUO,3 ;WRITE 2 ENDS-OF FILE\r
+ PUSHJ PDP,MTAP1\r
+ TRNE IOS,IOIMPM ;WRITE LOCK?\r
+ POPJ PDP, ;YES RETURN\r
+ PUSHJ PDP,SETACT\r
+ PUSHJ PDP,WSYNC\r
+ MOVEI UUO,3\r
+ PUSHJ PDP,MTAP1\r
+ PUSHJ PDP,SETACT\r
+ PUSHJ PDP,WSYNC\r
+ MOVEI UUO,7 ;AND BACKSPACE OVER ONE OF THEM\r
+ JRST MTAP1\r
+\r
+HUNGTP: TLZN IOS,MTREW ;TAPE REWINDING?\r
+ JRST THRUTP ;NO. GIVE UP CONTROL\r
+ SOS NMTREW ;YES. DECREASE COUNT OF TAPES IN REW\r
+ AOS MTREQ ;THRUTP WILL SOS THIS BACK\r
+ JRST THRUPT ;TURN OFF TM10\r
+\f;CONNECT CONTROL TO A TRANSPORT\r
+CONECT: MOVEI TAC,440102 ;SET UP INTERRUPT CONDITIONS\r
+ HRRM TAC,MTAINT\r
+ HRRM DEVDAT,USEWRD ;SAVE DEVDAT FOR INTERRUPT\r
+ LDB TP,PUNIT ;GET UNIT\r
+ CAMN TP,UNIT ;ALREADY CONNECTED TO IT?\r
+ JRST ONECT3 ;YES\r
+ LSH TP,17 ;NO. SET FOR CONO\r
+ CONSZ MTS,2 ;CONTROL FREE?\r
+ JRST ONECT2 ;YES. DO A NO-OP CONO\r
+ TRO TP,MTFLAG ;NO. SET CONTROL FREE ENABLE\r
+ TLNN IOS,MTREW ;CONNECTING TO A REWINDING TAPE?\r
+ PUSHJ PDP,ONECT4 ;NO.CHANGE RETURN\r
+ONECT2: HRLM TP,USEWRD ;MIGHT NEED ON INTERRUPT LEVEL\r
+ CONO MTC,(TP) ;CONO TO MTC\r
+ LSH TP,3 ;SAVE UNIT\r
+ HLRZM TP,UNIT\r
+ONECT3: JUMPGE IOS,WSYNC ;WAIT FOR DEV TO FREE IF NOT REWINDING\r
+ TRNN TP,4000 ;REWINDING, CONTROL FREE ENABLE?\r
+ AOS (PDP) ;NO. SKIP RETURN\r
+ POPJ PDP, ;YES. IMMEDIATE RETURN\r
+ONECT4: MOVEI TAC,TPREDY ;SET DEVICE ACTIVE\r
+ HRRM TAC,-1(PDP) ;AGAIN WHEN INACTIVE\r
+ JRST SETACT ;SET DEVICE ACTIVE\r
+\r
+;DELAY TILL TAPE COMES OUT OF IO WAIT, THEN GET CONTROL\r
+DLYRDY: SETOM MTAVAL\r
+ PUSHJ PDP,WSYNC ;WAIT FOR IO TO STOP\r
+\r
+;GET MTC, CONNECT TAPE TO CONTROL\r
+TPREDY: AOSE MTREQ ;GET CONTROL\r
+ PUSHJ PDP,MTWAIT ;WAIT FOR IT\r
+ MOVEI TAC,QUANT ;SET QUANTUM TIME\r
+ MOVEM TAC,QUANTM\r
+TPRDY2: MOVEM PROG,USEPRG\r
+ PUSHJ PDP,CONECT ;CONECT CONTROL TO TAPE\r
+\r
+;SET TP FOR THIS TAPE\r
+TPSET: LDB TP,[POINT 2,IOS,28] ;PARITY\r
+ SKIPN TP ;USE STANDARD IF 0\r
+ MOVEI TP,STDENS ;NOT SPECIFIED, USE STANDARD FOR SYS.\r
+ SOS TP ;SET TO USER'S REQUEST\r
+ LSH TP,6\r
+ TRNN IOS,IOPAR ;PARITY\r
+ TRO TP,40000 ;ODD\r
+ MOVE TAC1,UNIT ;UNIT\r
+ DPB TAC1,[POINT 3,TP,20] ;INTO COMMAND\r
+ TRO TP,MTBOTH ;PI CHANNELS\r
+ MOVEI TAC,MTTRY ;SET ERROR COUNT\r
+ MOVNM TAC,ERCNT\r
+ CONSZ MTS,4 ;7 OR 9 TRACK?\r
+ JRST RDYCHK ;7 TRACK\r
+ TLNN IOS,COMPAT ;9 TRACK. CORE DUMP?\r
+ TROA TP,20030 ;YES\r
+ TRO TP,40300 ;NO. SET 800 BPI, ODD PARITY\r
+\f;MAKE SURE TAPE IS READY\r
+RDYCHK: CONSZ MTS,40 ;READY?\r
+ POPJ PDP, ;YES\r
+ CONSO MTS,20000 ;REWINDING?\r
+ POPJ PDP, ;NO. LET XPORT HUNG INTERRUPT HANDLE IT\r
+ TLO IOS,MTREW ;YES. MUST BE REWINDING\r
+ PUSHJ PDP,SETACT ;DEVICE ACTIVE\r
+ AOS NMTREW ;BUMP COUNT OF REWINDING DRIVES\r
+ SOSL MTREQ ;LET SOMEONE ELSE USE TAPES\r
+ JRST DLYRDY ;NOONE ELSE WANTS CONTROL\r
+ PUSHJ PDP,CLOKRQ ;PUT IN A TIME REQUEST\r
+ JRST DLYRDY+1 ;AND WAIT\r
+\fMTCLOK: XWD .+1,JIFSC2\r
+ SETZM CLKREQ ;INDICATE NO CLOCK REQUEST IN NOW\r
+ SKIPL MTREQ ;CONTROL FREF?\r
+ POPJ PDP, ;NO. COME BACK LATER\r
+MTCLK2: SETOM NMTREW ;COUNT NO. OF TAPES REWINDING\r
+ MOVEM DEVDAT,SAVDEV\r
+ MOVEI DEVDAT,MTADDR ;START AT MTA0\r
+ AOS MTREQ ;MAKE SURE NO OTHER MTA REQUESTS ARE HONORED NOW\r
+REWCHK: MOVE IOS,DEVIOS(DEVDAT)\r
+ JUMPGE IOS,REWCK2 ;TAPE NOT REWINDING\r
+ PUSHJ PDP,CONECT ;REWINDING - CONECT TO IT\r
+ POPJ PDP, ;CONTROL NOT FREE NOW - RETURN ON INTERRUPT LEVEL\r
+REWCKA: CONSO MTS,40 ;STILL REWINDING?\r
+ JRST REWCK1 ;YES\r
+ TLZE IOS,IOW ;NO, TAKE OUT OF IO WAIT\r
+ PUSHJ PDP,SETIOD\r
+ TLZ IOS,MTREQ\r
+ PUSHJ PDP,CLRACT ;NO LONGER ACTIVE\r
+ JRST REWCK2\r
+ \r
+REWCK1: AOS NMTREW ;COUNT REWINDING TAPE\r
+ MOVEI TAC,36 \r
+ CONSZ MTS,20000 ;IF TAPE IS STILL REWINDING\r
+ DPB TAC,PDVCNT ;MAKE SURE IT DOESN'T GET A HUNG DEVICE\r
+REWCK2: HLRZ DEVDAT,DEVSER(DEVDAT) ;NEXT DEVICE\r
+ HLRZ TAC,DEVNAM(DEVDAT) ;A MAG TAPE?\r
+ CAIN TAC,(SIXBIT .MTA.)\r
+ JRST REWCHK ;YES. CHECK IT\r
+ MOVE DEVDAT,SAVDEV ;PICK UP DEVDAT AGAIN\r
+ SOSL MTREQ ;FREE MTASER AGAIN\r
+ SETOM MTAVAL ;SOMEONE WAITING FOR CONTROL\r
+ SKIPGE NMTREW ;ANY TAPE REWINDING?\r
+ JRST THRUT3 ;NO\r
+\r
+CLOKRQ: MOVE TAC,MTCLOK ;PUT A CLOCK REQUEST IN\r
+ CONO PI,PIOFF ;HAVE MONITOR WAKE UP\r
+ SKIPL CLKREQ ;IF NO CLOCK REQUEST IN ASK TO WAKE UP\r
+ IDPB TAC,CLOCK ;IN HALF A SECOND\r
+ SETOM CLKREQ ;NOW WE HAVE ONE\r
+ CONO PI,PION\r
+ JRST THRUT3\r
+SAVDEV: 0 ;TEMPORARY STORAGE FOR DEVDAT\r
+\f;MTAPE\r
+MTAP0: TRNE UUO,100 ;SETTING 7 TRACK MODE?\r
+ JRST SET9TK ;YES\r
+\r
+MTAP: TRZ IOS,776000 ;TURN OFF ERROR BITS\r
+ MOVEM IOS,DEVIOS(DEVDAT) ;SAVE IOS\r
+MTAP1: PUSHJ PDP,TPREDY ;GET CONTROL FOR THIS TAPE\r
+MTAP3: TRZ TP,7 ;NO DATA TRANSFER\r
+ ANDI UUO,17 ;GET FUNCTION\r
+ ROT UUO,-1 ;TRANSLATE FROM TABLE\r
+ SKIPL UUO\r
+ SKIPA TAC,MTPTBL(UUO)\r
+ HLRZ TAC,MTPTBL(UUO)\r
+ TRZE TAC,100 ;MOVE TAPE BACKWORD?\r
+ CONSO MTS,100000 ;YES, TAPE AT LOAD POINT?\r
+ TRNN TAC,-1 ;OR NO-OP?\r
+ JRST THRUTA ;YES, GO CHECK FOR BOT\r
+ TRZE TAC,200 ;SKIP TO LOGICAL EOT?\r
+ JRST LEOT ;YES\r
+ TRZN TAC,400 ;TRY TO WRITE TAPE?\r
+ JRST MTAGO ;NO.\r
+ CONSZ MTS,10 ;YES. WRITE LOCKED?\r
+ JRST ILLOP ;YES. LIGHT ERROR BIT\r
+MTAGO: DPB TAC,[POINT 4,TP,26] ;PUT FUNCTION INTO COMMAND\r
+ HRLM TP,USEWRD ;SAVE COMMAND\r
+ CONO MTC,(TP) ;START TAPE MOVING\r
+ JRST CLRACT ;AND RETURN\r
+\r
+;SET 9-TRACK TAPE\r
+SET9TK: TRNE UUO,1\r
+ TLOA IOS,COMPAT ;SET IBM COMPAT.\r
+MTAREL: TLZ IOS,COMPAT ;NOT IBM COMPAT\r
+ JRST STOIOS\r
+;SKIP TO LOGICAL EOT\r
+LEOT: CONSZ MTS,100000 ;TAPE AT BOT?\r
+ JRST LEOT2 ;YES, DONT BACKSPACE\r
+ PUSHJ PDP,MTAG0 ;BACKSPACE RECORD\r
+ PUSHJ PDP,EOTWT ;WAIT FOR IT\r
+LEOT2: MOVEI UUO,16 ;SKIP A FILE\r
+ PUSHJ PDP,MTAP2\r
+ MOVEI UUO,6 ;SKIP A RECORD\r
+ PUSHJ PDP,MTAP\r
+ PUSHJ PDP,EOTWT ;WAIT FOR IT\r
+ MOVE IOS,DEVIOS(DEVDAT)\r
+ TRNN IOS,IODENT ;END OF FILE SEEN?\r
+ JRST LEOT2 ;NO. SKIP TO NEXT FILE\r
+ MOVEI UUO,7 ;YES. BACKSPACE RECORD\r
+\r
+MTAP2: PUSHJ PDP,TPRDY2\r
+ JRST MTAP3\r
+;WAIT FOR TAPE TO FINISH. MTREQ WILL COUNT DOWN AT END OF OPERATION\r
+EOTWT: AOSE MTREQ\r
+ PUSHJ PDP,MTWAIT ;WAIT TILL MTREQ IS COUNTED DOWN\r
+ POPJ PDP,\r
+\fMTPTBL: XWD 101,0 ;REW,NOP\r
+ XWD 405,0 ;WRITE EOF.\r
+ XWD 0,0\r
+ XWD 107,6 ;BACKSPACE REC,SKIP REC\r
+ XWD 111,207 ;REW,UNLOAD,LOG EOT\r
+ XWD 415,0 ;WRITE BLANK TAPE,\r
+ XWD 0,0\r
+ XWD 117,16 ;BACK FILE,SKIP FILE\r
+\f;OUTPUT UUO\r
+MTOUT: PUSHJ PDP,TPREDY ;GET CONTROL SETUP TP\r
+ CONSZ MTS,10 ;WRITE LOCK?\r
+ JRST ILLOP ;YES, SET IOIMPM AND RETURN\r
+ CONSZ MTS,4000 ;EOT?\r
+ TROA IOS,IOTEND+IOBKTL ;YES. LIGHT BIT\r
+ TLOA IOS,IO ;NO. INDICATE OUTPUT\r
+ JRST ADVOUT ;DONE IF EOT\r
+MTOUT1: MOVEI TAC,@DEVOAD(DEVDAT) ;ADDRESS OF BUFFER\r
+ MOVN TAC1,1(TAC) ;-WORD COUNT\r
+ HRL TAC,TAC1 ;IN LH OF COMMAND\r
+ AOJG TAC,ADVOUT ;SKIP IF 0 WORDS\r
+MTOUT2: TRO TP,4000 ;FUNCTION = WRITE\r
+ MOVSI TAC1,(BLKO MTC,) ;SETUP BLKO\r
+MTDTGO: MOVEM TAC,PNTR ;SAVE BLKI/BLKO POINTER\r
+ MOVEM TAC,SVNPTR \r
+ HRRI TAC1,PNTR ;BLKI/BLKO PNTR\r
+ MOVEM TAC1,MTALOC ;INTO INTERRUPT LOC\r
+ HRLM TP,USEWRD ;SAVE COMMAND\r
+\r
+ CONO MTC,(TP) ;START TAPE MOVING\r
+ TRO IOS,IOACT ;SETACT CLEARS IOW\r
+ JRST STOIOS ;STORE IOS AND RETURN\r
+\r
+;INPUT UUO\r
+MTIN: PUSHJ PDP,TPREDY ;SETUP TP FOR THIS DRIVE\r
+ TLZ IOS,IO ;INPUT\r
+MTIN1: SETCM TAC,@DEVIAD(DEVDAT) ;-LARGEST POSSIBLE WRD CNT\r
+ HRRI TAC,@DEVIAD(DEVDAT) ;STARTING ADDRESS\r
+ ADD TAC,[XWD 2,1] ;MAKE REAL IOWD\r
+MTIN2: TRO TP,2000 ;FUNCTION = READ\r
+ MOVSI TAC1,(BLKI MTC,) ;SETUP BLKI\r
+ JRST MTDTGO ;GO START TAPE\r
+\fMTAINT: CONSO MTS,440102 ;INTERRUPT FOR MAG TAPE?\r
+ JRST . ;NO. GO AWAY\r
+ CONSO MTC,400 ;HAS CONTROL FREE ENABLED?\r
+ CONSZ MTS,440100 ;NO. CONTROL FREE ERRONEOUSLY ON?\r
+ JRST +2 ;REAL MTA INTERRUPT\r
+ JRST MTAINT+1 ;THIS INTERRUPT NOT REALLY FOR MTA\r
+ JSR MTASAV ;YES. SAVE ACS\r
+ HRRZ DEVDAT,USEWRD ;RESET DEVDAT\r
+ MOVE IOS,DEVIOS(DEVDAT) ;AND IOS\r
+ JUMPL IOS,REWCKA ;CNTRL FREE INTERRUPT ON A REW TAPE\r
+ MOVE PROG,USEPRG\r
+ SKIPE TAC,ERRFLG ;BACKSPACE FROM ERROR?\r
+ JRST TRYAGN ;YES. REISSUE COMMAND\r
+ CONSZ MTS,440000 ;ERROR?\r
+ JRST ERROR ;YES. ILLEGAL OP OR HUNG DEVICE\r
+ CONSZ MTC,7 ;DATA OPERATION?\r
+ JRST DATEND ;YES\r
+ LDB TP,[POINT 4,USEWRD,8] ;GET FUNCTION\r
+ CAIN TP,6 ;SKIPPING A RECORD?\r
+ CONSO MTS,10000 ;YES. SEEN AN EOF?\r
+ SKIPA ;NO.\r
+ TRO IOS,IODEND ;YES. TURN ON EOF BIT\r
+THRUTA: CONSZ MTS,300000 ;NO. BOT OR REWINDING?\r
+ TROA IOS,IOBOT ;YES. SET BOT BIT FOR USER TO SEE\r
+ TRZ IOS,IOBOT ;NO. TURN OFF BOT BIT\r
+THRUTP: CONSZ MTS,4000 ;NO. EOT?\r
+ TRO IOS,IOTEND ;YES\r
+ TLZE IOS,IOW ;JOB IN IO WAIT?\r
+ PUSHJ PDP,SETIOD ;YES. TAKE IT OUT\r
+ TLZ IOS,DMPMOD\r
+ PUSHJ PDP,CLRACT\r
+ ;CONTROL FREE INTERRUPT?\r
+ ;YES. DONT COUNT DOWN MTREQ\r
+ SOSGE MTREQ ;COUNT DOWN REQUEST COUNT\r
+ JRST THRUT2 ;NOONE ELSE WAITING\r
+ SKIPL NMTREW ;IF THERE ARE TAPES REWINDING\r
+ SKIPE CLKREQ ;WHICH HAVEN'T BEEN CHECKED IN\r
+ SKIPA ;MORE THAN 1/2 A SECOND\r
+ JRST MTCLK2 ;GO CHECK THEM NOW\r
+ SETOM MTAVAL ;SOMEONE ELSE WANTS IT\r
+ JRST THRUT3 ;DISMISS INTERRUPT AND RETURN\r
+\f;HERE CONTROL IS ALL DONE. CHECK ON REWINDING TAPES IF NEEDED\r
+THRUT2: SKIPL NMTREW ;ANY DRIVES REWINDING?\r
+ JRST MTCLK2 ;YES. CHECK IF ANY THROUGH\r
+THRUT3: HLRZ TP,USEWRD ;GET UNIT\r
+ TRZ TP,17777 ;MASK OUT FUNCTION\r
+ CONO MTC,(TP) ;DISMISS INTERRUPT\r
+ HLLZS MTAINT ;DONT LOOK AT ANY MORE INTERRUPTS\r
+ POPJ PDP, ;AND EXIT\r
+\r
+;HERE WHEN BLKI/BLKO COUNTS DOWN TO ZERO\r
+MTDEND: 0\r
+ CONO MTS,1 ;GIVE A FUNCTION STOP\r
+ JEN @MTDEND ;AND EXIT\r
+\fDATENO: CONSZ MTS,20600 ;RECORD OK?\r
+ JRST RETRY ;PARITY, DATA LATE OR BAD TAPE\r
+DATND2: TLNE IOS,DMPMOD ;DUMP MODE?\r
+ JRST CMPEND ;YES\r
+ TLNN IOS,IO ;READING?\r
+ JRST INPTND ;YES, FINISH INPUT\r
+ADVOUT: PUHSJ PDP,ADVBFE ;WRITING, ADVANCE BUFFERS\r
+ ;END OF TAPE?\r
+ JRST THRUTP ;YES, DONT WRITE ANY MORE\r
+NXTREC: TLZE IOS,IOW ;IN IO WAIT?\r
+ PUSHJ PDP,GETIOD ;RESTART JOB\r
+ SOSG QUANTM ;COUNT DOWN PROTECT TIME\r
+ SKIPG MTREQ ;ANYONE ELSE WANT CONTROL?\r
+ CONSZ MTS,4000 ;NO. KEEP GOING UNLESS EOT\r
+ JRST THRUTP ;YES, GIVE UP CONTROL\r
+ MOVNI TAC,MTTRY ;RESET ERROR COUNT\r
+ MOVEM TAC,ERCNT\r
+ HLRZ TP,USEWRD ;PICK UP COMMAND\r
+ TLNE IOS,IO ;AND DO NEXT RECORD\r
+ JRST MTOUT1\r
+ HLRZ TAC,@DEVIAD(DEVDAT) ;PICK MAX. SIZE OF BUFFER\r
+ ADDI TAC,@DEVIAD(DEVDAT) ;AND IN FIRST ADDRESS\r
+ PUSHJ PDP,IADRCK ;CHECK IT'S O.K.\r
+ JRST THRUTP ;NO - RELEASE CONTROL\r
+ JRST MTIN1 ;O.K. DO NEXT INPUT.\r
+\r
+;HERE WHEN THROUGH AN INPUT RECORD\r
+INPTND: CONSZ MTS,10000 ;EOF?\r
+ JRST DATEOF ;YES\r
+ MOVEI TAC,@DEVIAD(DEVDAT) ;START OF RECORD\r
+ HRRZ TAC1,PNTR ;WHERE WE ARE NOW\r
+ SUBI TAC1,1(TAC) ;LAST LOC-FIRST LOC\r
+ HRRM TAC1,1(TAC) ;=WORD COUNT\r
+ PUSHJ PDP,ADVBFF ;ADVANCE BUFFERS\r
+ JRST THRUTP ;NONE FREE\r
+ JRST NXTREC ;CONTINUE WITH NEXT RECORD\r
+\r
+; HERE AT THE END OF A DUMP MODE RECORD\r
+DMPEND: HLRZ TP,USEWRD ;SET UP COMMAND AGAIN\r
+ CONSO MTS,14000 ;EOF OR EOT?\r
+ JRST DMPBLK ;NO,GET NEXT COMMAND\r
+ CONSO MTS,4000 ;EOF?\r
+ TRO IOS,IODEND ;YES,SET EOF BIT\r
+ JRST THRUTP ;AND RETURN TO USER\r
+\fMTDMPO: TLOA IOS,IO ;DUMP OUTPUT\r
+MTDMPI: TLZ IOS,IO ;DUMP INPUT\r
+ HRLI UUO,PROG\r
+ PUSHJ PDP,COMCHK ;CHECK VALIDIT OF LIST\r
+ JRST ADRERR ;NOT VALID\r
+ PUSH PDP,IOS ;WSYNC WILL CLOBBER IOS\r
+ PUSHJ PDP,TPREDY ;GET CONTROL, SETUP TP\r
+ POP PDP,IOS\r
+ TLNE IOS,IO ;CHECK WRITE LOCK\r
+ CONSO MTS,4010 ;AND EOT IF WRITING\r
+ JRST MTDMP2\r
+ CONSO MTS,4000 ;ERROR\r
+ TROA IOS,IOIMPM ;WRITE LOCK\r
+ TRO IOS,IOTEND+IOBKTL ;EOT\r
+ JRST THRUTP ;GIVE UP TAPE AND RETURN\r
+MTDMP2: TLO IOS,DMPMOD ;INDICATE DUMP-MODE\r
+ SOS UUO ;WILL COUNT IT UP LATER\r
+ MOVEM UUO,LSTLOC ;SAVE LOC OF LIST\r
+DMPBLK: PUSHJ PDP,NXTCOM ;GET NEXT COMMAND\r
+\r
+ ADDI TAC,(PROG) ;ADD RELOCATION FACTOR\r
+ TLNE IOS,IO ;WRITING?\r
+ JRST MTOUT2 ;YES. GO WRITE RECORD\r
+ TRMN IOS,1\r
+ TRO TP,10000 ;OR - READ ACROSS RECORD BOUNDARIES\r
+ JRST MTIN2 ;GO READ RECORD(S)\r
+\r
+NXTCOM: SKIPE TAC,REMNDR ;PARTIAL IOWD LEFT TO DO?\r
+ JRST NXTCM3 ;YES, CONTINUE WITH IT\r
+ AOSA TAC,LSTLOC ;GET NEXT COMMAND LOC\r
+ HRRM TAC,LSTLOC\r
+ MOVE TAC,@TAC ;PICK UP COMMAND\r
+ JUMPL TAC,NXTCM2 ;REAL COMMAND\r
+ JUMPG TAC,NXTCOM+1 ;GO-TO-WORD\r
+ POP PDP,TAC ;0 - THROUGH\r
+ JRST THRUTP\r
+\r
+ EXTERN MMTSIZ ;-MTSIZ\r
+NXTCM2: TLNE IOS,IO ;WRITING?\r
+ TRNE IOS,1 ;YES, MODE 16?\r
+ POPJ PDP, ;NO. USE IOWD AS OBTAINED\r
+NXTCM3: HLRE TAC1,TAC ;YES. GET WORDCOUNT\r
+ SETZM REMNDR\r
+ CAML TAC1,MTSZ ;RECORD TOO LARGE?\r
+ POPJ PDP, ;NO, GO WRITE\r
+ ADD TAC,[XWD MTSIZ,MTSIZ] ;YES.\r
+ MOVEM TAC,REMNDR ;IOWD TO USE FOR NEXT RECORD\r
+ SUBI TAC,MTSIZE ;ADDRESS FOR THIS IOWD\r
+ HRLI TAC,MMTSIZ ;WRITE -MTSIZE WORD RECORDS\r
+ POPJ PDP, ;RETURN THE IOWD\r
+REMNDR: 0\r
+MTSZ: XWD -1,MMTSIZ ;NEG. OF RECORD SIZE IN WORDS\r
+\fMTHUNG: PUSHJ PDP,THRUT3 ;TURN OFF ERROR PI BIT\r
+ PUSHJ PDP,SETACT ;TURN ON IOACT\r
+ MOVEI TAC,1 ;SET HUNG-TIME TO 1 MORE TICK\r
+ DPB TAC,PDVCNT ;SET HUNG TIME\r
+ POPJ PDP, ;AND EXIT\r
+\r
+\r
+ERROR: CONSZ MTS,400000 ;HUNG DEVICE?\r
+ JRST MTHUNG ;YES\r
+\r
+;ILLEGAL OP INTERRUPT\r
+ TRNN IOS,IOACT ;DATA OPERATION?\r
+ JRST ILLOP ;NO. LIGHT ERROR BIT, GIVE UP CONTROL\r
+ TRO IOS,IOIMPM ;YES. LIGHT IOIMPM\r
+ MOVEM IOS,DEVIOS(DEVDAT) ;SINCE DEVICE IS STILL ACTIVE\r
+ JRST THRUT2 ;COUNT DOWN MTRWQ ON HUNG CALL\r
+\r
+ILLOP: TROA IOS,IOIMPM\r
+DATEOF: TLO IOS,IOEND ;EOF - LIGHT BIT\r
+ JRST THRUTP ;AND GIVE UP CONTROL\r
+\r
+;TRY AGAIN ON PARITY ERROR OR BAD TAPE\r
+RETRY: TRNN IOS,ONRCK ;WANT TO STOP ON ERROR?\r
+ AOSL TAC,ERCNT ;OR TRIED ENOUGH?\r
+ JRST PERMER ;YES. PERMANENT ERROR\r
+RETRY1: MOVEI TAC,2 ;SET RETRY SWITCH\r
+ MOVEM TAC,ERRFLG\r
+RETRY2: HLRZ TP,USEWRD ;PICK UP COMMAND\r
+ ANDI TP,760770 ;SET FOR BACKSPACE\r
+ CONO MTC,7000(TP) ;BACKSPACE RECORD\r
+ POPJ PDP, ;AND GO AWAY\r
+\r
+;COME HERE AFTER BACKSPACE IS THROUGH\r
+TRYAGN: SOJLE TAC,TRYSKP ;GO IF NOT 2ND BACKSPACE\r
+ CONSO MTS,100000 ;BOT?\r
+ JRST RETRY2-1 ;NO. BACKSPACE AGAIN\r
+TRYNXT: ;READ RECORD AGAIN\r
+ MOVE TAC,SVPNTR ;RESET POINTER\r
+ MOVEM TAC,PNTR\r
+ HRLZ TP,USEWRD ;GET COMMMAND\r
+ CONO MTC,(TP) ;EXECUTE IT AGAIN\r
+ SETZM ERRFLG\r
+ POPJ PDP, ;AND GO AWAY\r
+\r
+;HERE AFTER 2ND BACKSPACE OR SKIP AFTER ERROR\r
+TRYSKP: JUMPL TAC,TRYNXT ;AFTER FORWARD SKIP IF NEGATIVE\r
+ HLRZ TP,USEWRD ;AFTER 2ND BACKSPACE - SKIPA RECORD\r
+ ANDI TP,760770\r
+ CONO MTC,6000(TP) ;SKIP A RECORD\r
+ SETOM ERRFLG ;INDICATE FORWARD SKIP\r
+ POPJ PDP, ;AND GO AWAY\r
+\fPERMER: TLNE IOS,IO ;READING?\r
+ TRNE IOS,IONRCK ;NO RECOVERY WANTED?\r
+ JRST SETIOS ;REALLY PERMANENT\r
+ CAILE TAC,100 ;TRIED TO REWRITE 100 TIMES\r
+ JRST SETIOS ;YES. REALLY PERMANENT\r
+ JUMPG TAC,RETRY2 ;TRY WRITING WITH 3 INCHES OF\r
+ MOVSI TAC,10000 ;BLANK TAPE TO ERASE BAD SPOT\r
+ ORM TAC,USEWRD ;SET COMMAND TO 14 (FROM 4)\r
+ JRST RETRY1 ;AND TRY AGAIN\r
+\r
+SETIOS: CONSZ MTS,400 ;DATA MISSED OR BAD TAPE?\r
+ TRO IOS,IODERR ;YES\r
+ CONSZ MTS,20200 ;PARITY ERROR?\r
+ TRO IOS,IODTER ;YES\r
+ JRST DATND2 ;SAVE ERROR WORD AND GO AWAY\r
+NMTREW: 0\r
+USEWRD: 0\r
+USEPRG: 0\r
+CLKREQ: 0\r
+ \r
+UNIT: 0\r
+ERCNT: 0\r
+ERRFLG: 0\r
+QUANTM: 0\r
+LSTLOC: 0\r
+PNTR: 0\r
+SVPNTR: 0\r
+MTAEND: END\r
+\f\r
--- /dev/null
+TITLE MTCSR6 - MAGNETIC TAPE ROUTINES FOR 516 CONTROL\r
+SUBTTL C.WHITE 27-APR-69 V406\r
+ XP VMTCSR,406 ;DEFINE GLOBAL VERSION NUMBER FOR LOADER MAP\r
+\r
+ENTRY MTCSR6\r
+MTCSR6:\r
+INTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL MTCDDB,MTCDDS,MTECNT,MTRKCN\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+\r
+INTERNAL MTCDDB,MTCDSP\r
+\r
+;MTC DEVICE DATA BLOCK\r
+;REMAINING MTA DDB'S (IF ANY) ARE\r
+;GENERATED OUT OF LINE AT BUILD TIME\r
+ ZZ=.\r
+MTCDDB: SIXBIT /MTA0/\r
+ XWD 2*HUNGST,MTSIZ+1\r
+ 0\r
+ EXP MTCDSP\r
+ XWD DVMTA+DVIN+DVOUT+DVLNG,154407\r
+ 0\r
+ 0\r
+ XWD PROG,0\r
+ XWD PROG,0\r
+ XP MTECNT,.-ZZ\r
+ 0 ;CUMMULATIVE ERROR COUNT FOR THIS UNIT\r
+ ;BITS 0-8=LONG, PARITY ERROR COUNT\r
+ ;BITS 9-17=LAT, PARITY ERROR COUNT\r
+ ;BITS 18-26=ILL. OP. COUNT\r
+ ;BITS 27-35=DATA MISSED COUNT\r
+ XP MTBKCN,.-ZZ\r
+ 0 ;CUMMULATIVE RECORD COUNTER FOR THIS UNIT\r
+ XP MTCDDS,.-ZZ ;SIUZE OF MTC DDB\r
+\r
+>\r
+\f T=ITEM\r
+;MAKE TAPE SERVICE SUBROUTINES\r
+\r
+ JRST MTCINI ;INITIALIZATION\r
+ JRST MTHUNG ;MTA HUNG TIMEOUT. RELEASE DATA CONTROL.\r
+ ;MAGTAPE CONTROL. PRINT ERROR AND STOP JOB.\r
+MTCDSP: POPJ PDP, ;RELEASE\r
+ JRST MTCLSO ;CLOSE OUTPUT\r
+ JRST MTOUT ;OUTPUT\r
+ JRST MTIN ;INTPUT\r
+ JRST CPOPJ1 ;ENTER IN DIRECTORY\r
+ JRST CPOPJ1 ;LOOKUP IN DIRECTORY\r
+ JRST MTDMPO ;DUMP OUTPUT\r
+ JRST MTDMPI ;DUMP INPUT\r
+ POPJ PDP, ;SETO\r
+ POPJ PDP, ;SETO\r
+ POPJ PDP, ;GETF\r
+ JRST CPOPJ1 ;RENAME\r
+ POPJ PDP, ;CLOSE INPUT\r
+ POPJ PDP, ;UTPCLR\r
+ ;MTAPE UUO (FALL INTO THIS CODE WHICH FOLLOWS)\r
+\r
+DEFINE MTAPE (A) ;MARCO TO DEFINE LEGAL MTAPE UUO EFFECTIVE ADDRESSES.\r
+< CODES=0\r
+ IRP A, <\r
+ CODES=CODES!<1B<^D35-^0'A>>>>\r
+\r
+ MTAPES <0,1,11,7,17,3,6,13,16,10> ;DEFINE WHICH CODES ARE LEGAL\r
+\r
+ MOVEI T,1 ;CHECK FOR LEGAL MTAPE UUO\r
+ LSH T,(UUO) ;SHIFT BIT ACCORDING TO THE USER'S UUO\r
+ TRNN T,CODES ;DID HE SPECIFY A LEGAL CODE ?\r
+ JRST UUOERR ;NO--TYPE MONITOR ERROR MESSAGE.\r
+ SOJE T,MTP0 ;CHECK FOR MTAPE 0 (SPECIAL SYNC WAIT NO-OP)\r
+\r
+ PUSHJ PDP,MTCHK2\r
+ TRZ IOS,776000 ;CLEAR ERROR BITS ,IOF.\r
+ ;IOACT, IOBOT AND IOTEND.\r
+ SKIPA T,UUO ;CALL MTAPE2\r
+\fMTAPE: PUSHJ PDP,MTCHK2 ;CHECK IF MAG TAPE CONTROL AVAIL.\r
+MTAPE2: TDZ IOS,[XWD IODT!IOSEOF,IOACT]\r
+ TRNN T,SLICE ;SET SLICE LEVEL THIS UUO?\r
+ JRST NOSFT ;NO\r
+ TLZ IOS,IOSLIC ;YES, CLEAR LEVEL\r
+ TRNE T,SLEVEL ;SET TO 1?\r
+ TLO IOS,IOSLIC ;YES\r
+NOSET:\r
+ LSH T,^D8 ;MOVE TO FUNCTION\r
+ ANDI T,7400 ;MODE BITS\r
+ CAIN T,4000 ;LOGICAL EOT?\r
+ JRST MTLEOT\r
+ CAIE T,1400 ;WRITE EOF\r
+ CAIN T,5400 ;OR WRITE BLANK TAPE?\r
+ JRST CHKLOC ;YES, CHECK WRITE-LOCK\r
+ CONSO 224,4000 ;AT LOAD POINT?\r
+ JRST MTGO0 ;NO\r
+ CAIE T,3400 ;YES, BACKSPACE RECORD?\r
+\r
+ CAIN T,400 ;NO, REW?\r
+ JRST MTFIN ;YES\r
+ CAIN T,7400 ;NO, BACKSPACE FILE?\r
+ JRST MTFIN ;YES\r
+MTGO0: MOVSI TAC,TCF ;LOOK FOR TAPE CONTROL FREE ONLY\r
+\f;HERE FROM INPUT AND OUTPUT UUOS AND INTERRUPT TO DO NEXT RECORD.\r
+\r
+MTGO1: LDB TAC1,PUNIT ;UNIT\r
+ DPB TAC1,[POINT 3,T,31] ;UNIT\r
+ LDB TAC1, [POINT 3, IOS,28] ;DENSITY PARITY\r
+ TRNN TAC1,7 ;NO DENSITY OR PARITY SPECIFIED?\r
+ IORI TAC1,STDENS ;YES, USE STANDARD\r
+ XORI TAC1, 5 ;ODD, 556\r
+ DPB TAC1,[POINT 3,T,23]\r
+ HRRI TAC,MTCCHN(T) ;CHANNEL\r
+ TRO TAC,200 ;INHIBIT RETURN TO POOL\r
+ TLNE IOS,IOSLIC ;SLICE LEVEL A 1?\r
+ TRO TAC,100000 ;YES, SET COMMAND.\r
+ HRRM DEVDAT,MTDEV ;COMMAND, DVDB\r
+ HRLM TAC,MTDEV\r
+MTGO3: MOVEI TAC1,MTPOUN\r
+ HRRM TAC1,MTIDSP\r
+ SETZM MTEOFF ;CLEAR EOF FLAG\r
+ TLNN IOS,IODT ;IS THIS A DATA TRANSFER OPERATION\r
+ ;REQUIRING DATA CONTROL\r
+ JRST MTGO2 ;NO, MUST BE SPACING OPERATION\r
+ CONO DC,@MDCSAV ;YES, ATTACH DC TO MAGTAPE\r
+ CONO PI,DCON ;TURN DC PI CHANNEL ON\r
+MTGO2: SETZM MISSED ;CLEAR DATA MISSED FLAG\r
+ STARTDV MTC\r
+ HLRZS TAC\r
+ CONO 224,(TAC) ;ENABLE FOR TCF OR ERF\r
+ JRST STOIOS ;STORE HUNG COUNT, EXIT\r
+\r
+;READ\r
+MTIN: PUSHJ PDP,MTCHECK ;IS SYSTEM AVAILABLE?>\r
+ TLZ IOS,IO ;READING.\r
+MTIN1: SETCM TAC,@DEVIAD(DEVDAT) ;-SIZE-1\r
+ HRRI TAC,@DEVIAD(DEVDAT) ;BUFFER ADDRESS,PROG INCLUDED\r
+ ADD TAC,[XWD 2,1] ;-SIZE+1,BUFFER+1\r
+ MOVEI T,2400 ;READ\r
+MTIN2: MOVE TAC1,[BLKI DC,4000+MTDC*10]\r
+ JRST MTINDC\r
+\f;IS SYSTEM AVAILABLE\r
+MTCHEK: PUSHJ PDP,GETDCMT ;GET DATA AND MAG TAPE CONTROLS\r
+ AOSE MTREQ ;ARGUMENT\r
+ MOVE IOS,DEVIOS(DEVDAT)\r
+ TLO IOS,IODT ;FLAG DATA TRANSFER\r
+ XCT @(PDP)\r
+ PUSHJ PDP,MTCHK4 ;WAIT FOR REWIND\r
+ JRST MTCHEK ;GET DC & MT AGAIN\r
+\r
+MTCHK2: AOSE MTREQ\r
+ PUSHJ PDP,MTWAIT\r
+ MOVE IOS,DEVIOS(DEVDAT)\r
+ TLZ IOS,IO ;CLEAR IUO INDICATION SO "REWCK" WILL WORK\r
+ PUSHJ PDP,MTCHK4 ;CHECK STATUS\r
+ JRST MTCHK2 ;GET MT AGAIN\r
+\r
+MTCHK4: TLO IOS,HASMT ;THIS JOB NOW HAS MTC\r
+ TLZE IOS,IOBEG ;FIRST OPERATION AFTER INIT OR SETSTS\r
+\r
+ TLZ IOS,IUOSLIC ;YES, SET SLICE LEVEL TO 0.\r
+ TLZ IOS,IOREW ;CLEAR MAG TAPE REWINDING\r
+ PUSHJ PDP,REWCK ;CHECK IF REWINDING?\r
+ JRST TPOPJ ;NO - STATUS OK\r
+ JRST QSTAT ;QUERY STATUS\r
+ PUSHJ PDP,DETMDC ;REWINDING- DETACH MTC, DC AND TURN OFF\r
+ ;IODT AND HASMT\r
+ TLO IOS,IOREW ;SET DEVICE ACTIVE AND IN REWIND WAIT\r
+ PUSHJ PDP,ORACT\r
+ AOSG MTREWN ;ADD 1 TO REWIND WAIT COUNT\r
+ PUSHJ PDP,MTCLK ;PUT IN CLOCK REQUEST.\r
+ ;(NO OTHER UNITS IN REWIND WAIT)\r
+\r
+ JRST WSYNC\r
+\r
+QSTAT: PUSHJ PDP,DETMDC ;DETACH MTC AND DC\r
+ JRST HNGSTP ;CHECK STATUS (PULL FINGERS OUT, ETC)\r
+\f;MTAPE 0 WAITS UNTIL THE CONTROL IS FREE\r
+;THUS MTAPE 0 PROVIDES THE ONLY WAY FOR A USER TO WAIT UNTIL A SPACING OPERATION\r
+; (I.E., SKIP, BACKSPACE, OR REWIND) IS COMPLETED.\r
+\r
+MTP0: PUSHJ PDP,MTCHK2 ;WAIT FOR CONTROL TO BECOME FREE,\r
+ ; THEN GIVE IT BACK IMMEDIATELY,\r
+ ; AND RETURN TO THE USER.\r
+\r
+\r
+;DETMDC-\r
+; DETACH MTC, AND TURN OFF HASMT.\r
+; THEN (IFF IODT ON)\r
+; TURN OFF IODT AND DETACH DC\r
+\r
+DETMDC:\r
+MTHUNG:\r
+ TLZN IOS,HASMT ;THIS JOB HAS MTC?\r
+ JRST STOIOS ;NO\r
+ PUSHJ PDP,RELCON\r
+ SOSL MTREQ ;YES- ANYONE ELSE WAITING FOR IT?\r
+ SETOM MTAVAL ;YES- FLAG AS JUST BECOME AVAILABLE\r
+DETDC: TLZN IOS,IODT ;DOES JOB HAVE DATA CONTROL?\r
+ JRST STOIOS ;NO- EXIT\r
+ CONO DC,0\r
+ CONO PD,DCOFF\r
+ SOSL DCREQ ;ANYONE ELSE WAITING FOR IT?\r
+ SETOM DCAVAL ;YES- FLAG AS JUST BECOME AVAILABLE\r
+ JRST STOIOS ;AND EXIT\r
+\r
+RELCON: CONO 220,0\r
+ CONO 224,0\r
+ SETZM MTCCON\r
+ POPJ PDP,\r
+\f;ROUTINE TO SEE IF UNIT IS REWINDING\r
+;CALL MOVE DEVDAT,ADDRESS OF DDB\r
+; PUSHJ PDP,REWCK\r
+; UNIT READY\r
+; UNIT OFF OR WRITE LOCKED\r
+; UNIT REWINDING\r
+\r
+REWCK: LDB TAC,PUNIT\r
+ ROT TAC,4\r
+ CONO MTC,200(TAC)\r
+ CONO MTS1,SEL ;JAM UNIT INTO COMMAND BUFFER\r
+ CONSZ MTS1,20000 ;SKIP IF REWIND MOTION OFF\r
+ JRST CPOPJ2 ;RETURN TO CALL+2 IF TAPE REWINDING\r
+ TLNE IOS,IO ;OUTPUT ?\r
+ CONSO MTS1,200 ;YES-WRITE LOCKED ?\r
+ CONSO MTS1,2 ;NO-IS UNIT READY?\r
+ AOS (PDP)\r
+ POPJ PDP, ;YES- RETURN TO CALL+1\r
+\r
+REPEAT 0,<\r
+THIS WORKS WITH THE FOLLOWING MOD TO 545 TRANSPORT:\r
+\r
+DELETE 1023K TO ??\r
+\r
+ADD 1B18H TO 1B08K REW(1)(GND)\r
+ 1B19S TO 1B08L FWD/LP(1)(GND)\r
+ 1B08N TO 1B23K (REW(1).OR.FWD/LP(1))\r
+\r
+THIS MODE SETS IOP22(1) WHILE MAGTAPE IS REWINDING OR SPACING FORWARD\r
+TO LOAD POINT- IF ENABLES THE PROCESSOR TO DISTINGUISH BETWEEN A\r
+TAPE WHICH IS AT THE END OF A REWIND COMMAND, AND A TAPE WHICH IS\r
+SWITCHED TO LOCAL, OR OFF>\r
+\f;WRITE\r
+MTOUT: PUSHJ PDP,MTCHEK\r
+ TLO IOS,IO ;WRITING\r
+MTOUT1: MOVEI TAC,@DEVOAD(DEVDAT) ;BUFFER ADDRESS, PROG INCLUDED\r
+ MOVN TAC1,1(TAC) ;-WD COUNT\r
+ HRL TAC,TAC1 ;-WD CMT,BUFFER\r
+ AOJG TAC,MTNOTI ;BUFFER+1, TEST FOR ZERO WORD COUNT\r
+MTOUT2: MOVE TAC1,[BLKO DC,3400+MTDC*10]\r
+ MOVEI T,1000 ;WRITE\r
+MTINDC: MOVEM TAC,MTDCCN ;BLKO POINTER\r
+ IORI TAC1,DCTCHN ;DC PI CHANNEL NO.\r
+ MOVEM TAC,DCWRD\r
+ HRRZM TAC1, MDCSAV ;SAVE DC COMMAND\r
+ HRRI TAC1,DCWRD\r
+ CONO PI,DCOFF ;TURN DC PI CHANNEL OFF\r
+ MOVEM TAC1,DCLOC ;BLK COMMAND\r
+ MOVE TAC1,JSR MTDCND]\r
+ MOVEM TAC1,DCLOC1\r
+ TRO IOS,IOACT ;SET IOACT\r
+ MOVSI TAC, ERF ;ENABLE FOR EOR IF EOR FLAG NOT ON.\r
+ CONSZ 224,ERF ;END OF RECORD?\r
+ MOVSI TAC,XNC ;NO. COME BACK WHEN COMMAND BUFFER IS EMPTY\r
+ JRST MTGO1\r
+\r
+CHKLOK: CONSO 224,200 ;WRITE LOCKED?\r
+ JRST MTGO0 ;NO, DO MTAPE\r
+ PUSHJ PDP,QSTAT\r
+ JRST CHKLOK\r
+\f;CLOSE OUTPUT\r
+\r
+MTCLSO: TLNN DEVDAT,OUTPB ;HAS ANB OUTPUT BEEN DONE?\r
+ POPJ PDP, ;NO. DON'T WRITE ON TAPE.\r
+ LDB TAC,PIOMOD ;DUMP MODE?\r
+ CAIGE TAC,16\r
+ PUSHJ PDP,OUT ;NO. OUTPUT LAST PARIAL BUFFER\r
+ PUSHJ PDP,WAIT1 ;WAIT FOR OUTPUT TO FINISH\r
+MWLEOT: MOVEI T,3 ;WRITE EOF\r
+ PUSHJ PDP, MTAPE\r
+ MOVEI T,3 ;WRITE EOF\r
+ PUSHJ PDP, MTAPE\r
+ MOVEI T,7 ;BSP\r
+ JRST MTAPE\r
+\r
+MTCINI: PUSHJ PDP,RELCON\r
+ SETOM MRTEWN ;SET CLOCK REQUEST COUNT TO -1\r
+ JRST MTNIO1\r
+\r
+\r
+;BLK COUNTED OUT\r
+IFE FTCHECK+FTMONP,<\r
+MTDCND: 0\r
+>\r
+MTDCN1: CONO PI,DCOFF ;SHUT OFF DC CHANNEL\r
+ CONSZ DC,10000\r
+ SETOM MISSED\r
+ JEN @MTDCND\r
+\f;FLAG FROM TAPE CONTROL. SET UP BY INSERT MACRO\r
+MTCINT: CONSO 224,@MTCCON\r
+ JRST .\r
+ JSR MTCSAV ;SAVE AC'S\r
+ HRRZ DEVDAT,MTDEV ;DVDB\r
+ LDB PROG,PJOBM; JOB NUMBER\r
+ MOVE PROG,JBTADR(PROG)\r
+ MOVE IOS, DEVIOS(DEVDAT)\r
+ CONSO 224,TCF ;TAPE CONTROL FREE\r
+ JRST MTEOR\r
+ XCT MTIDSP\r
+ JRST MTBSP ;AFTER BACKSPACE\r
+ JRST MTERR ;IF ERROR FOUND\r
+MTPDUN: TLNN IOS,IODT\r
+ JRST MTNIO2\r
+ LDB TAC,PIOMOD\r
+ CAIL TAC,16\r
+ JRST DMPDUN ;DUMP\r
+ TLNE IOS,IO\r
+ JRST MTNOTI ;WRITING\r
+ SKIPF MTEOFF ;NOT EOF?\r
+ JRST MTEOF\r
+ MOVEI TAC,@DEVIAD(DEVDAT) ;BUFFER ADDRESS\r
+ MOVN TAC1,MTDCCN ;WD CNT-1\r
+ AOBJ TAC1, .+1 ;WD CNT\r
+ HLLZS TAC1 ;CLR RT HALF\r
+ ADD TAC1,DCWRD ;ADD CURRENT COUNT=NO, OF WDS\r
+ HLRM TAC1,1(TAC) ;STORE AT WORD COUNT\r
+ PUSHJ PDP,ADVBFF\r
+ JRST MTEND1 ;NEXT BUFFER FULL\r
+ JRST MTCON ;CONTINUE MODE\r
+\r
+DMPDUN: TLNN IOS,IO\r
+ SKIPN MTEOFF\r
+ JRST MTEOF+1\r
+ TROA IOS,IODEND\r
+\r
+MTEOF: TLO IOS,IOEND\r
+ SETZM MTEOFF ;CLEAR EOF FLAG\r
+\r
+;AND FALL INTO MTEND1\r
+\fMTEND1: PUSHJ PDP,DETDO ;DETACH DC (IF ASSIGNED)\r
+ PUSHJ PDP,ETCHK ;CHECK FOR END OF TAPE (FOR DUMP MODE OUT)\r
+ PUSHJ PDP,CLRACT\r
+ CONSO 224,TCF ;TAPE CONTROL FREE?\r
+ JRST MTION ;NO. WAIT FOR IT.\r
+MTFIN:\r
+MTNIO: TLZE IOS,IOW ;CLEAR WAIT\r
+ PUSHJ PDP,SETIOD\r
+ PUSHJ PDP,DETMOC ;DETACH MTC (IF HASMT SET) AND DC (IF IODT)\r
+ PUSHJ PDP,ETCHK ;CHECK FOR END OF TAPE\r
+ PUSHJ PDP,CLRACT ;RESTORE BITS,CLEAR IOACT\r
+\r
+;AND FALL INTO MTNIO1\r
+\fMTIO1: MOVN TAC,MTREDO ;REPEAT COUNTER\r
+ HRREM TAC,MTERCN\r
+ SKIPGE MTREWN ;IS ANY OTHER UNIT REWINDING AND\r
+ ;A SECOND COMMAND HELD UP?\r
+ POPJ PDP, ;NO, DISMISS INTERRUPT\r
+\r
+;SOME UNIT IS REWINDING AND HAS HAD ANOTHER COMMAND HELD UP.\r
+;CHECK ALL UNITS\r
+\r
+EXTERNAL SETIOD\r
+\r
+MTREWW: SETOM MTREWN ;SET COUNT TO NO. UNITS IN REW WAIT\r
+ PUSH PDP,DEVDAT\r
+ MOVEI DEVDAT,MTCDDB ;GET BEGINNING OF MT DATA BLOCK CHAIN\r
+\r
+REWLP: MOVE IOS,DEVIOS(DEVDAT)\r
+ JUMPGE IOS,REW2 ;IS UNIT IN A REW WAIT?\r
+ PUSHJ PDP,REWCK ;YES,SEE IF FINISHED REW.\r
+ JRST .+3 ;HAS FINISHED\r
+ JRST REW1 ;OFF- LET HUNG LOGICA TAKE CARE OF IT\r
+ JRST REW2 ;STILL REWINDING\r
+ TDZ IOS,[XWD IOREW,IOACT];GET JOB OUT OF IO WAIT\r
+ TLZE IOS,IOW\r
+ PUSHJ PDP,SETIOD ;START JOB UP AGAIN\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ JRST REW2\r
+\r
+REW0: PUSHJ PDP,STOIOS ;RESET HUNG COUNT IF STILL REWINDING\r
+REW1: AOS MTREWN ;INCREMENT COUNT OF REW WAIT UNITS\r
+REW2: HLRZ DEVDAT,DEVSER(DEVDAT) ;DEVDAT TO NEXT DDB\r
+ JUMPE DEVDAT,REW3 ;LAST ONE?\r
+ HRLZ DAT,DEVNAM(DEVDAT) ;NO,GET LH OF NAME\r
+ CAIN DAT,(SIZBIT /MTA/) ;STILL A MAGTAPE?\r
+ JRST REWLP ;YES, CONTINUE\r
+REW3: POP PDP,DEVDAT\r
+ POPJ PDP, ;YES, DISMISS INTERRUPT OF RETURN TO MTC OK\r
+\r
+ETCHK: CONSZ MTS1,10000 ;EOT SEEN?\r
+ TRO IOS,IOIMPM+IOTEND ;YES-SET FLAGS\r
+ TDZ IOS,[XWD IOREW,IOBOT];NO LONGER REWINDING\r
+ CONSZ MTS1,24002 ;UNLESSS\r
+ TRO IOS,IOBOT ;IS REALLY REWINDING\r
+ POPJ PDP, ;EXIT\r
+\f;ROUTINE CALLED AT CLOCK LEVEL TO SEE IF ANY UNITS WHICH ARE IN A\r
+;REW WAIT HAVE FINISHED REWIND.\r
+\r
+INTERNAL MTCLOK\r
+\r
+MTCLOK: SKIPGE MTREQ ;IS ANY JOB USING ANY UNIT NOW?\r
+ PUSHJ PDP,MTREWW ;NO, CHECK ALL MAG TAPE\r
+ ;UNITS TO SEE IF JUST FINISHED\r
+ ;REWINDING(WHICH WERE IN REW WAIT)\r
+ SKIPGE MTREWN ;YES,ARE ANY UNITS STILL IN REW WAIT?\r
+ POPJ PDP, ;NO, RETURN TO CLOCK ROUTINE WITHOUT\r
+ ;PUTTING IN CLOCK REQUEST\r
+\r
+;ROUTINE TO PUT IN A CLOCK REQUEST\r
+\r
+EXTERNAL JIFSC2\r
+\r
+MTCLK: MOVEI TAC1,JIFSC2 ;CHECK EVERY HALF SECOND\r
+ HRLI TAC1,MTCLOK ;DISPATCH ADDRESS\r
+ \r
+\r
+ CONO PI,400 ;TURN OFF PI\r
+ IDPB TAC1,CLOCK ;STORE CLOCK REQUEST\r
+ CONO PI,200 ;TURN ON PI\r
+ POPJ PDP,\r
+\fMTNOTI: PUSHJ PDP,ADVBFE ;WRITING\r
+ JRST MTEND1\r
+MTCON: CONSZ 224,10000 ;END OF TAPE?\r
+ JRST MTEND1 ;YES - B/SP , EOF & EXIT\r
+ CONO DC,0\r
+ TLZE IOS,IOW\r
+ PUSHJ PDP,SETIOD\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ MOVN TAC,MTREDO\r
+ HRREM TAC,MTERCN\r
+ TLNN IOS,IO ;INPUT OR OUTPUT?\r
+ JRST MTIN1 ;CALL INPUT SUBROUTINE\r
+ JRST MTOUT1 ;CALL OUTPUT SUBROUTINE\r
+MTNIO2: HLRZ TAC,MTDEV ;COMMAND\r
+ ANDI TAC,7400\r
+ CAIE TAC,3000 ;NO. SPACING ONE RECORD?\r
+ JRST MTNIO ;YES, EXIT\r
+ CONSZ 224, 400 ;EOF?\r
+ TDO IOS,[XWD IOSEOF,IODEND]\r
+ JRST MTNIO ;EXIT\r
+\fMTEOR: MOVEI TAC,ERF\r
+ CONSO 224,ERF ;END OF RECORD FLAG ON?\r
+ JRST MTIGN1 ;NO. WAIT FOR IT.\r
+ CONSZ DC,1000 ;DATA MISSED\r
+ SETOM MISSED ;YES\r
+ CONSO DC,1600000 ;ANY CHARS. LEFT?\r
+ JRST MTEOR1 ;NO\r
+ MOVE T,DCWRD ;GET IOWD\r
+ TLNN IOS,IO ;O/P\r
+ SKIPE MISSED ;NO, DATA MISSED\r
+ JRST MTEOR2 ;YES\r
+ CONI DC,TAC1 ;FETCH DC STATUS BITS\r
+ LSH TAC1,-15 ;SHIFT CHARACTER COUNT TO LSBITS\r
+ IMULI TAC1,-6 ;-NO OF BITS TO FAR RIGHT\r
+ CONO DC,@MDCSAV ;?? IF DON SAYS SO, WELL, OK (JUST)\r
+ DATAI DC,TAC ;FETCH LAST PART-WORD OF DATA\r
+ CONO DC,0 ;SHUT DOWN DC\r
+ LSH TAC,44(TAC1) ;SHIFT LAST CHARACTERS TO LEFT END\r
+ JUMPG T,MTEOR1\r
+\r
+ AOBJN T,.+1 ;BUMP DATA POINTER\r
+ MOVEM TAC,(T) ;STORE LAST WORD\r
+ MOVEM T,DCWRD ;AND BUMPED POINTER\r
+\r
+MTEOR1: CONSZ 224,LPE!CPE!400100 ;IF END OF RECORD. CHECK\r
+ ;PARITY,DATA MISSED, AND ILLEGAL FLAG\r
+ JRST MTEOR2 ;IF ERROR CAUSED INTERRUPT TO\r
+ ;ERROR ROUTINE VIA TCF\r
+MTECON: CONSZ 224, 400 ;EOF?\r
+ SETOM MTEOFF ;SET EOF FLAG\r
+ AOS MTBKCN(DEVDAT) ;COUNT NO. OF BLKS READ OR WRITTENE\r
+ ;INCLUDING RETRIES\r
+ JRST @MTIDSP ;YES.\r
+\r
+MTEOR2: SOS MTIDSP ;POINT TO ERROR ROUTINE\r
+ MOVEI T,0\r
+ CONSZ MTS1,20 ;LONGITUDINAL PARITY ERROR?\r
+ TLO T,1000 ;YES, COUNT IN QUARTER 1\r
+ CONSZ MTS1,10 ;LATERAL PARITY ERROR?\r
+ TLO T,1 ;YES, COUNT IN QUARTER 2\r
+ CONSZ MTS1,400000 ;ILLEGAL OP?\r
+ TRO T,1000 ;YES, COUNT IN QUARTER 3\r
+ CONSO MTS1,100\r
+ SKIPF MISSFD ;DATA MISSED?\r
+ TRO T,1 ;YES, COUNT IN QUARTER 4\r
+ ADDM T,MTECNT(DEVDAT);ADD TO ERROR COUNTS FOR THIS DRIVE\r
+ JRST MTECON ;CHECK EOF\r
+\fMTERR: HLRZ TAC,MTDEV ;COMMAND\r
+ ANDI TAC,7400\r
+ TRNE IOS,IONRCK\r
+ JRST MTERR2\r
+ AOSLE TAC1,MTERCN\r
+ CAIL TAC1,3\r
+ JRST MTERR2\r
+ HLRZ TAC,MTDEV ;COMMAND\r
+ ANDI TAC,770377\r
+ CONO 220,3400(TAC) ;BSP\r
+ SOS MTIDSP\r
+MTIGN: MOVEI TAC,TCF\r
+MTIGN1: CONO 224,(TAC)\r
+ HRRZM TAC,MTCCON\r
+ JRST MTCRET\r
+\r
+MTERR2: CONSO 224,400100 ;SET IODERR IF ILLEG OR MISSED CHAR FLAGS\r
+ SKIPE MISSED ;SET IODERR IF DATA MISSED\r
+ TRO IOS,IODERR\r
+ CONSZ 224,30 ;SET IODTER IF LONG OR LAT PARITY\r
+ TRO IOS,IODTER\r
+ JRST MTPDUN\r
+\r
+MTBSP: MOVE TAC,MTDCCN ;POINTER\r
+ MOVEM TAC,DOWRD ;RESET POINTER WORD\r
+ HLRZ TAC,MTDEV ;COMMAND\r
+ CONSO 224,XNC ;WAIT FOR XNC\r
+ JRST .-1 ;SHOULD ADD A COUNT(RUNAWAY TAPE TURNED OFF)\r
+ SKIPLE TAC1,MTERCN\r
+ JRST MTBSP3\r
+MTBSP2: TRO IOS,IOACT\r
+ HRLI TAC,ERF\r
+ JRST MTGO3\r
+MTBSP3: TRNN TAC,1000 ;READING\r
+ TRCA TAC,100000 ;YES-CHANGE SLICE LEVEL\r
+ TRNN TAC1,1 ;NO\r
+ JRST MTBSP2\r
+ CONO 220,4400(TAC) ;WRITE BLANK TAPE\r
+ AOS MTERCN\r
+ JRST MTIGN\r
+\fMTC=220 ;MAG TAPE CONTROL DEVICE NUMBER\r
+\r
+MTS1=224 ;MAG TAPE CONTROL STATUS REG 1\r
+XNC=40000 ;TRANSFER NEW COMMAND\r
+MTDC=2 ;MAG TAPE DATA CONTROL DEVICE NO.\r
+TCF=1 ;TAPE CONTROL FREE\r
+ERF=4 ;END OF RECORD FLAG\r
+LPE=20 ;LONG. PARITY ERROR\r
+CRE=10 ;CHAR. PARITY ERROR\r
+SEL=2 ;UNIT TO COMMAND BUFFER\r
+IOSEOF=4000 ;SPACING ONE RECORD FORWARD FOUND EOF\r
+IOTEND=2000 ;EOT INDICATION\r
+IONRCK=100 ;DO NOT RE-TRY ON ERRORS\r
+IOBOT=4000 ;TAPE AT LOAD POINT\r
+IODT=10000 ;A 1 FOR A DATA TRANSFER TYPE COMMAND\r
+IOSLIC=2000 ;A 1 IF SLICE LEVEL IS 1, OTHERWISE 0.\r
+HASMT=4000 ;IF A 1, THIS JOB HAS THE MAG TAPE CONTROL\r
+IOREW=40000 ;A 1 IF UNIT IS REWINDING AND ANOTHER OPERATIONS\r
+ ;IS ATTEMPTED ON SAME UNIT. MUST BE SIGN BIT.\r
+\r
+EXTERNAL ADVBFF,ADVBFE,DCREQ,MTCSAV,SETACT,CLRACT,ORACT,GETDCMT\r
+EXTERNAL MTCRET, DCAVAL, MTAVAL, MTCCHN, MTREQ\r
+EXTERNAL MTWAIT,OUT,SETIOD,CLOCK,HNGSTP,MTSIZ\r
+EXTERNAL WSYNC,USRREL,WAIT1,ADRERR,PUNIT,PIOMOD,PJOBN\r
+EXTERNAL JOBPD1,JOBSAV\r
+EXTERNAL JBTADR,JOBPFI,STDENS,CPOPJ1,CPOPJ2,UUOERR\r
+EXTERNAL DCTCHN,DCLOC,DCLOC1,DCOFF,DCON,STOIOS,TPOPJ\r
+\r
+INTERNAL MTCINT,DETMDC,DETDC\r
+\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL MTEOFF,MTDEV,MTDCCN,DCWRD,MDCSAV,MISSED,MTERCN\r
+EXTERNAL MTREN,MTCMDP,SVCNTR,MTCCON,MTIOSP,MTOCND\r
+INTERNAL MTDCN1,MTPDUN\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+;CONTROL DATA\r
+\r
+MTEOFF: 0 ;EOF FLAG\r
+MTDEV: 0 ;XWD COMMAND,DEVICE DATA BLOCK\r
+MTDCCN: 0 ;BLKI/O POINTER FOR REDO\r
+DCWRD: 0 ;BLKI/O POINTER FOR DC\r
+MDCSAV: 0 ;DC COMMAND\r
+MISSED: 0 ;-1 IF DC CONTAINS PARTIAL WORD\r
+MTERCN: 0 ;ERROR COUNTER\r
+MTREWN: 0 ;NO. OF MAG TAPE UNITS-1 IN IO WAIT DOING REWINDS\r
+ ;BECAUSE THEY REQUESTED OTHER OPERATIONS BEFORE REW\r
+ ;FINISHED. -1 MEANS NONE, 0 MEANS 1 IN QUEUE\r
+MTCMDP: 0 ;DUMP COMMAND LIST POINTER\r
+SVCNTR: 0 ;DUMP COMMAND IOWD NEGATIVE WORD COUNT\r
+MTCCON: 0 ;INTERRUPT FLAGS\r
+MTIDSP: JRST MTPDUN\r
+\r
+>\r
+\f;LOGICAL EBND OF TAPE LOOP\r
+MTLEOT: MOVEI T,7 ;BACKSPACE\r
+ PUSHJ PDP,MTAPC2\r
+ PUSHJ PDP,MTCHK2 ;CALL INTERLOCK, PICKUP IOS\r
+ ;AFTER PREVIOS TASK FINISHED.\r
+MTEOT2: MOVEI T,16 ;SAVE ONE FILE\r
+ PUSHJ PDP,MTAPE2\r
+ MOVEI T,6 ;SPAVE ONE RECORD\r
+ PUSHJ PDP, MTAPE\r
+ PUSHJ PDP,MTCHK2 ;CALL INTERLOCK, RETURN WHEN\r
+ ;SPACING FINISHED WITH NEW IOS\r
+ TLNN IOS, IOSEOF ;WAS EOF DETECTED?\r
+ JRST MTEOT2 ;NO, RESUME SPACING.\r
+ MOVEI T,7 ;PREPARE FOR BACKSPACE MTAPE\r
+ JRST MTAPE2 ;BACKSPACE, LOGICAL EOT FOUND\r
+ ;RETURN TO MAKE PROGRAM\r
+MTREDO: 12 ;NUMBER OF TIUMES TO RE-EXECUTE\r
+\f;DEVICE DEPENDENT DUMP MODES, MODE 16.\r
+;OUTPUT\r
+MTDMPO: PUSH PDP,UUO\r
+MTDPO1: PUSHJ PDP,MTCHEK ;IS SYSTEM AVAILABLE\r
+ TLO IOS,IO ;WRITING\r
+ PUSHJ PDP,SAVCHK\r
+ MOVE TAC1, @MTOUT2 ;BLKO AND DATA CONTROL COMMAND\r
+ MOVEI T,1000 ;WRITING COMMAND\r
+MTDMP1: HTLI TAC, PROG ;ACTUAL ADDRESS OF COMMAND LIST\r
+ MOVEM TAC, MTDUMP ;COMMAND POINTER\r
+ SKIPN TAC,@TAC ;COMMAND WORD\r
+ JRST MTEND1\r
+ JUMPG TAC, MTDMP1 ;CHANGE COMMAND SEQUENCE\r
+ HLREM TAC, SVCNT ;SAVE COUNTER\r
+ HRRZS TAC ;GET ADDRESS ALONE\r
+ CAMGE TAC,AC1\r
+ JRST MTDMP2\r
+ SUB TAC, SVCNTR ;GET LAST ADDRESS\r
+ CAMLE TAC, USRREL ;LESS THAN END?\r
+ JRST MTDMP2 ;OUT OF BOUNDS\r
+ MOVE TAC, @MTCMDP ;PICK UP POINTER AGAIN\r
+ ADDI TAC,(PROG) ;GET ACTUAL ADDRESS\r
+ AOS MTCMDP\r
+ PUSH PDP,MTCMDP\r
+ PUSHJ PDP,MTINDC ;MOVE TAPE\r
+ PUSHJ PDP,WAIT1\r
+ TLNN IOS, IO ;WRITING?\r
+ JRST MTDPI1 ;READING\r
+ LDB AC2,PIOMOD ;GET MODE\r
+ CAIE AC2,2\r
+ JRST MTDPO1\r
+ PUSHJ PDP,MWLEOT\r
+ PUSHJ PDP,MTCHK2\r
+ JRST MTEND1\r
+\r
+SAVCHK: MOVEI AC1,JOBPFI\r
+ MOVE TAC,JOBPD1(JDAT)\r
+ TLNN TAC,USRMOD\r
+ MOVEI AC1,JOBSAV\r
+ POP PDP,TAC1\r
+ POP PDP,TAC\r
+ JRST (TAC1)\r
+;INPUT\r
+MTDMPI: PUSH PDP,UUO\r
+MTDPI1: TRNE IOS,IODEND\r
+ JRST TPOPJ\r
+ PUSHJ PDP,MTCHECK\r
+ TLZ IOS,IO ;READING\r
+ PUSHJ PDP,SAVCHK\r
+ MOVE TAC1,@MTIN2 ;BLKI AND DATA CONTROL COMMAND\r
+ MOVEI T,2400 ;READ COMMAND\r
+ JRST MTDMP1 ;DUMP\r
+;ADDRESS ERROR\r
+MTDMP2: PUSHJ PDP,MTEND1\r
+ JRST ADRERR\r
+\r
+ END\r
+\f\r
--- /dev/null
+TITLE NULSEG - DUMMY HIGH SEGMENT ROUTINES FOR MACHINE WITH JUST ONE REG - V406\r
+SUBTTL T.HASTINGS/TH TS 2 JUNE 69\r
+XP VNULSG,406\r
+ ;PUT VERSION NUMBER IN LOADER STORAGE MAP AND GLOB LISTING\r
+\r
+ ENTRY NULSEG\r
+NULSEG: ;ENTRY POINT SYMBOL TO CAUSE LOAD OF NULSEG IF REQUIRED\r
+ ;(IE INSTEAD OF SEGCON OR NEITHER)\r
+\r
+;INITIALIZE LOC TWOREG TO 0(FLAG SOFTWARE OR HARDWARE ONLY 1 REG CAPABILITY)\r
+;AND1 AND2RG EXECUTED FROM ONCE AFTER HARDWARE EXAMINED FOR 2 REG CAPABILITY.\r
+\r
+ INTERN AND2RG\r
+\r
+AND2RG=0 ;FLAG SYSTEM DOES NOT HAVE 2 REG. CAPABILITY\r
+ ;SINCE AT LEAST SOFTWARE DOES NOT BECAUSE THIS DUMMY\r
+ ;ROUTINE LOADD\r
+\r
+;CLOCK1\r
+\r
+ INTERN SETHGH\r
+\r
+SETHGH: TLZ PROG,1777 ;CLEAR OUT PROTECTION FOR HIGH SEG IN CASE THIS\r
+ POPJ PDP, ;IS A 2 REG MACHINE\r
+\r
+XP CHGHGH,R0 ;CHARGE CURRENT USER FOR HIGH SEG\r
+\r
+;COMCSS\r
+\r
+XP PRTHGH,R0 ;PRINT HIGH SEG CORE\r
+XP ASGHGH,R0 ;CLEAR HIGH SEG NAMES ON ASSIGN COMMAND\r
+XP CHKMED,R0 ;CHECK FOR MEDDLING\r
+XP ANYSAV,R1 ;NAY JOB DOING A SAVE INVOLVING HIGH SEG?\r
+\f;CORE1\r
+\r
+XP HGHDEP,R0 ;DEPOSIT HIGH SEG(ERROR)\r
+XP KILHGH,R0 ;REMOVE HIGH SEG FROM LOGICAL ADR SPACE\r
+XP UREMAP,R0 ;REMAPO UUO\r
+XP CURHGH,R0 ;CHANGE RELOC HARD IF CURRENT USER AFFECTED\r
+XP FRECOR,R0 ;FREE CORE IN NON-SWAP SYSTEMS\r
+XP FRECR1,R1 ;FREE CORE IN SWAPPING SYSTEMS\r
+\r
+ INTERN UCORHI,SUMSEG\r
+ EXTERN CORMAX,USRREL\r
+\r
+UCORHI: CAMLE TAC,USRREL ;TRYING TO ASSIGN CORE TO HIGH SEG?\r
+ POPJ PDP, ;YES, ERROR RETURN\r
+ ; NO, GIVE OK RETURN\r
+SUMSEG: CAMGE TAC,CORMAX ;ARG GE MAX LENGTH (HIGHEST+1)?\r
+R1: AOS (PDP) ;NO, GIVE OK RETURN\r
+R0: POPJ PDP, ;YES, GIVE ERROR RETURN\r
+\r
+;ERRCON\r
+\r
+XP SEGILM,R1 ;WILD TRANSFER RETURN\r
+\r
+;SAVGET\r
+\r
+XP SETEXT,R0\r
+XP SETEX1,R0\r
+XP SAVDDL,R0 ;DIDDLE RELOC, DURING DUMP MODE O/P FOR HISEG\r
+\r
+ INTERN UGETHI\r
+ EXTERN UGTERR\r
+\r
+UGETHI: JRST UGTERR ;ERROR RETURN TO USER UNLESS HALT IN LH OF UUO+1\r
+\r
+ INTERN SAVHGH,GETHGH\r
+ EXTERN SGERRA,SGAMOD,SG3\r
+\r
+SAVHGH:\r
+GETHGH: OPEN 0,SGAMOD ;TRY TO INIT DEVICE\r
+ JRST SGERRA ;ERROR\r
+ AOS (PDP) ;SKIP RETURN\r
+ JRST SG3 ;AND GO SETUP LOWER CORE\r
+\f;SWAP\r
+\r
+ INTERN FTSWAP\r
+\r
+IFN FTSWAP,<\r
+XP FININ,R1 ;FINFISH SWAPPING IN\r
+XP FINOT,R1 ;FINISH LOW SEG OUTPUT - NOTHING MORE TO DO\r
+XP FORSIZ,R0 ;SIZE OF JOB FREED UP\r
+XP FRESWP,R1 ;FREE DISK SPACE - NO DORMANT SEG FOUTND RETURN\r
+XP FITHGH,R0 ;CHECK IF HISEG BEING SWAPPED IN\r
+\r
+ INTERN FITSIZ\r
+ EXTERN CORTAL\r
+\r
+FITSIZ: CAMG AC1,CORTAL ;WILL LOW SET FIT IN CORE?\r
+ AOS (PDP) ;YES, SWAP HIM IN\r
+ POPJ PDP, ;NO, MUST SWAP SOMEONE ELSE OUT FIRST \r
+\r
+ INTERN FORHGH\r
+ EXTERN JBTSTS\r
+\r
+FORHGH: MOVSI TAC,SHF ;STOP IO AFTER NEXT BUFFERFUL IF ACTIVE\r
+ IORM TAC,JBTSTS(ITEM) ;CHECKED BY ADVBFF,ADVBFE ROUTINES\r
+ POPJ PDP,\r
+>\r
+\r
+;SYSINI\r
+\r
+XP SEGINI,R0 ;INITIALIZE HIGH SEGS\r
+\r
+;UUOCON\r
+XP RELSEG,R0 ;SUPERCEDE HIGH SEGS ON RECREATE\r
+XP RELSG1,R1 ;RENAME UUO\r
+XP HGHWRD,R0 ;GET WORD FROM HIGH SEG - ERROR RETURN\r
+XP HRESET,R0\r
+\r
+ INTERN USTUWP\r
+ EXTERN RTZER\r
+\r
+USTUWP: JRST RTZER\r
+\r
+XP HGHWRD,R0 ;GET WORD FROM HIGH SEG -ERROR\r
+XP USPY,R0 ;SPY UUO - ERROR\r
+ END\r
--- /dev/null
+IFE FTDISK+FTRC10+2,<\r
+TITLE ONCEB - ONCE ONLY OPERATOR DIALOGUE AND IO DEVICE INIT.(BURROUGHS DISK)\r
+>\r
+IFE FTDISK+FTRC10+1,<\r
+TITLE ONCED - ONCE ONLY OPERATOR DIALOGUE AND IO DEVICE INIT.(DATA PRODUCTS DISK)\r
+>\r
+IFE FTDISK+FTRC10+0,<\r
+TITLE ONCEN - ONCE ONLY OPERATOR DIALOGUE AND IO DEVICE INIT.(NO DISK)\r
+>\r
+SUBTTL T. HASTINGS/RCC/CHW TS 04 JUN 69 V414\r
+XP VONCE,414\r
+ ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+INTERNAL FTRC10 ;THIS SINGLE SOURCE FILE MAY BE ASSEMBLED FOR EITHER\r
+ ; THE NEW PDP-10 (BURROUGHS) DISK, OR THE OLD PDP-6 (DATA\r
+ ; PRODUCTS) DISK (FTRC10 = -1 OR 0, RESPECTIVELY, IN S).\r
+\r
+;"ONCE" SHOULD BE THE LAST LOADED PROGRAM BEFORE SYSMAK AND DDT\r
+;THUS IF IT OVERFLOWS INTO THE USER AREA NO HARM IS DONE.\r
+\r
+;ONCE ONLY CODE IS DIVIDED INTO 3 PARTS\r
+; 1. MANDITORY ONCE ONLY(LINKSR) - NO CTY NEEDED\r
+; (GOOD REPEATED STARTUPS DURING DEBUGGING\r
+; 2. USUAL SHROT ONCE ONLY CODE(ONCE) - CTY FOR DATE AND TIME\r
+; 3. OPTIONAL ONCE ONLY CODE - CTY DIALOG TO CHANGE MONITOR\r
+; OR REFRESH DISK(ALT-MODE INSTEAD OF CR AFTER TIME)\r
+\r
+;INITIALIZE PRIORITY CHANNELS AND SETUP INTERRUPT SERVICE ROUTINE CHAIN\r
+\r
+T=TAC ;DEFINE ACCUMULATOR T\r
+\r
+;LINK TO SERVICE ROUTINES\r
+\r
+INTERNAL LINKSR,FT2REL\r
+EXTERNAL JOBSYM,JOBPFI,XJBPFI\r
+\r
+LINKSR: 0 ;CALLED WITH JSR FROM SYSINI\r
+ MOVSI T,JOBPFI ;SET LH OF XJBPFI WITH JOBPFI\r
+ MOVEM T,XJBPFI ;LOADER DORES NOT HANDLE GLOBALS IN LH\r
+IFN FT2REL,<\r
+ JSP TSTREG ;GO TEST IF TWO RELOC REGISTERS EXIST\r
+>\r
+\r
+ ;HIGHEST LOC. IN JOB AREA PROTECTED FROM IO\r
+\r
+;MOVE SYMBOL TABLE UP IN MEMORY\r
+;EXEC MUST BE LOADED IN 15K OR LESS IF GOING INTO 16K MACHINE\r
+;FIRST FIND THE FIRST LOCATION OF NON-EXISTENT MEMORY\r
+\r
+ EXTERN DDTSYM\r
+\r
+ SETZB DAT,IOS ;(ACCUMULATOR IOS MUST ALSO BE CLEARED FOR SCNSER)\r
+ CONO APR,NXM ;CLEAR NON-EX MEM FLAG\r
+ MOVEI TAC,^D256 ;IN CASE MEMORY HAS NO NON EXISTANT BANKS\r
+ ADDI DAT,2000 ;TRY NEXT 1K BLOCK\r
+ MOVE TAC1,(DAT) ;REFERENCE THIS LOCATION\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
+ ; (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
+ ;NOTE THAT THE SYMBOL TABLE POINTER IS MOVED FROM\r
+ ; JOBSYM(JDAT) TO DDTSYM(JDAT) BY SYSMAK WHEN THE SYSTEM\r
+ ; IS FIRST CREATED.\r
+ JUMPE TAC1,JRSTI1 ;0 IF NO S. T. TO MOVE UP\r
+ MOVNS TAC1 ;+LENGTH\r
+ HRRZ TAC,UUO ;FIRST ADDRESS\r
+ ADDI TAC,(TAC1) ;LENGTH+FIRST ADDRESS\r
+ HRL TAC,TAC1 ;XWD LENGTH,LENGTH+FIRST ADDRESS \r
+ SUBI DAT,1(TAC) ;NEW LAST+1-OLD LAST+1\r
+ HRRM DAT,STO1 ;DIST, TO MOVE\r
+ MOVE TAC1,UUO ;L-N,FIRST ADD.\r
+ ADDI TAC1,1(DAT) ;FROM NEW S.T. POINTER\r
+ MOVEM TAC1,DDTSYM ;STORE IN LOWER CORE\r
+ MOVE TAC1,-1(TAC)\r
+STO1: MOVEM TAC1,.(TAC)\r
+ SUB TAC,[XWD 1,1]\r
+ JUMPGE TAC,.-3\r
+\r
+ EXTERN DEVLST,INTNUM,INTTAB\r
+;SETUP LOCATIONS 40 THRU 61\r
+\r
+JRSTI1: MOVE TAC,[XWD LOC40,40] ;SET UP LOWER CORE PI LOCATIONS\r
+ BLT TAC,61\r
+\r
+;LINK DEVICE SERVICE ROUTINES TOGETHER - IF NOT LOADED BY BUILD\r
+\r
+ SKIPE DEVLST ;HAS SERVICE ROUTINES ALREADY BEEN CHAINED TOGETHER?\r
+ JRST ALRCHN ;YES, MUST HAVE BEEN LOADD WITH BUILD\r
+ MOVSI TAC,INTNUM ;NO, NEG. NO. OF SERVICE ROTUINES*2\r
+INTLOP: HLRZ DAT,INTTAB(TAC) ;GET NEXT PI NUMBER\r
+ ANDI DAT,7 ;MASIC OUT NUMBER OF DDB'S\r
+ LSH DAT,1 ;SHIFT LEFT ONE SO MATCH PI LOCATIONS\r
+ JUMPE DAT,NOPICH ;DOES THIS DEVICE HAVE A PI CHANNEL (PTY)?\r
+ MOVE DAT,ITEM ;YES, PICK UP JSR CH'N FROM LOWER CORE\r
+INTLP1: MOVE DAT,ITEM ;SAVE IT IN DAT (EITHER A JRST DEV'NT OR\r
+ ; JEN @CH'N\r
+ MOVE ITEM,1(DAT) ;PICK UP INSTR. FOLLOWING INTERRUPT CONSO\r
+\r
+ TLNN ITEM,00740 ;IS IT A JEN?\r
+ JRST INTLP1 ;NO, KEEP LOOKING\r
+ MOVE TAC1,INTTAB(TAC) ;YES, LAST DEVICE SO FAR, GET DEV'NT\r
+ HRLI TAC1,(JRST) ;MAKE JRST INSTR.\r
+ MOVEM TAC1,1(DAT) ;CHANGE JEN @CH'N TO JRST DEV'NT\r
+ MOVEM ITEM,1(TAC) ;MAKE DEV'NT+1 BE JEN @CH'N\r
+NOPICH: AOBJN TAC,.+1 ;PICKUP EVERY OTHER WORD?\r
+ AOBJN TAC,INTLOP ;ANY MOVE INTERRUPT SERVICE ROUTINES?\r
+ALRCHN:\r
+IFN FTDISK,<\r
+\r
+;INITIALIZE DISK\r
+\r
+ EXTERN NULPDL,DSKINI\r
+\r
+ MOVEI PDP,NULPDL\r
+ PUSHJ PDP,DSKINT ;INITIALIZE THE DISK\r
+ ; AFTER SETTING UP CHANNEL LOC\r
+ ; BUT BEFORE OVERWRITTING ONCE WITH DDB'S\r
+>\r
+ MOVE TAC,JRSTI\r
+ MOVEM TAC,LINKSR+1 ;DO ONCE ONLY\r
+ SKIPN DEVLST ;HAVE DEVICE DATA BLOCKS BEEN LINKED?\r
+ JRST LINKDB ;NO, GO LINK DATA BLOCKS\r
+ ;RETURN @LINKSR\r
+ ;MULTIPLE DEVICE DATA BLOCKS ARE CREATED\r
+ ;AS SPECIFIED BY SYSSIZ AND MAY ERASE PART\r
+ ;OF ONCE ONLY CODE\r
+JRST1: JRST @LINKSR ;YES,RETURN\r
+\r
+EXTERN UUO0,ERROR,UUO2,LINKDR,DEVLST\r
+EXTERN CH1,CH2,CH3,CH4,CH5,CH6,CH7\r
+\r
+LOC40: 0 ;UUO PC\r
+INTERNAL UUOTRP\r
+UUOTRP: JSR UUO0 ;TO UUO HANDLER\r
+ JSR CH1\r
+ JSP DAT,ERROR\r
+ JSR CH2\r
+ JSP DAT,ERROR\r
+ JSR CH3\r
+ JSP DAT,ERROR\r
+ JSR CH4\r
+ JSP DAT,ERROR\r
+ JSR CH5\r
+ JSP DAT,ERROR\r
+ JSR CH6\r
+ JSP DAT,ERROR\r
+ JSR CH7\r
+ JSP DAT,ERROR\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
+IFN 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
+\r
+TSTREG: 0\r
+ MOVE TAC,[JSR TSTAPR] ;REPLACE UUO JSR WIT A JSR HERE IN ONCE\r
+ MOVEM TAC,41\r
+ CONO APR,ILM!1 ;TURN ON PI & ASSIGN ILM FLAG\r
+ ;FOR POSSIBLE ILLEGAL MEMORY REF BELOW\r
+ MOVEM TAC,42 ;PUT A JSR IN CHAN 1 INT. LOC.\r
+ CONO PI,12300 ;CLR PI SYSTEM, ACTIVATE PI SYSTEM. TURN ON CHAN 1\r
+ DATAO APR,[XWD 376776,000400] ;SET LOW AND HIGH SEG TO 128K LONG\r
+ ; EACH STARTING AT ABS LOC 0\r
+ ; RELOC. FOR HIGH SEG IS 400000 TO DO THIS\r
+ JRST 1,.+1 ;ENTER USER MODE .+1\r
+ MOVE TAC,400100 ;TRY TO REFERENCE REL LOC 100 IN HIGH SEG\r
+ ; AVOID SHADOW ACS WHICH LIKELY HAVE BAD\r
+ ;PARITY CAUSED BY POWER TURN ON AND TURN OFF\r
+ MOVEI 17,400000 ;MOVE HARDWARE ACS INTO SHADOW ACS TO CLEAR PARITY\r
+ ;IF HARDWARE ACS TURNED OFF, ACS WILL BE PRESERVED\r
+ BLT 17,400017 ;STOP WITH SHADOW AC 17\r
+ CALL ;COME BACK TO EXEC MODE AT TSTAPR\r
+\r
+TSTAPR: 0 ;PLACE TO SIDE JSR PC\r
+ SETZM TWOREG ;ASSUME NO SECOND REG.\r
+ CONSO APR,ILM ;WAS MEMORY REF OUT OF BOUNDS?\r
+ SETOM TWOREG ;NO, MUST HAVE SECOND REG. HARDWARE, SET -1\r
+ CONO APR,ILM ;CLEAR APR FLAGS AGAIN\r
+ MOVEI TAC,AND2RG ;=0 IF SOFTWARE CANNOT HANDLE 2 SEG(NULSEG LOADED)\r
+ ANDM TAC,TWOREG ;=-1 IF IT CAN(SEGCON LOADED)\r
+ ;TWOSEG SET TO AND OF SOFTWARE AND HARDWARE CAPABILITES\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
+ ; WHICH BUILD FORBITS FROM HAVING EXTERNALS\r
+ MOVSM TAC,SEGPTR ;POINTER USED FOR AOBJN LOOPS\r
+ CONO PI,10000 ;CLEAR PI SYSTEM\r
+ JRST @TSTREG\r
+>\r
+\r
+;ROUTINE TO FIND THE EXEC DDT SYMBOL TABLE POINTER AND MOVE IT TO THE PLACE\r
+;WHERE EXEC DDT EXPECTS IT(DDTSYM=36)\r
+;THE MONITOR CAN BE LOADED IN ANY OF 3 WAYS(IN ORDER OF PERFERNCE):\r
+; 1. UNDER TIME SHARING WITH REGULAR LOADER AND COMMON\r
+; 2. UNDER REGULAR 10/30 MONITOR WITH REGULAR 10/30 LOADER AND COMMON\r
+; 3. UNDER SPECIAL 10/30 MONITOR(SPMON) WITH BUILD\r
+\r
+;THE 3 WAYS LEAVE DDTSYM(36),JOBSYM(116),T30SYM(131) IN DIFFERENT STATES:\r
+; DDTSYM(36) JOBSYM(116) T30SYM(131)\r
+; 1. JUNK S.T.PTR JUNK\r
+; 2. JUNK JUNK(NON-NEG) S.T.PTR\r
+; 3. S.T.PTR S.T.PTR JUNK\r
+\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 MOVTP\r
+ EXTERN T30SYM,JOBSYM,DDTSYM,DDTX,SYSDDT\r
+\r
+MOVSTR: 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
+ SKIPL JOBSYM ;OR IS JOBSYM NEGATIVE(MEANING IT IS S.T.PTR)?\r
+ JRST REGT30 ;WAS LOADED BY REGULAR 10/30\r
+ MOVE UUO,JOBSYM ;ASSUME LOADED BY TIME SHARING MONITOR AND LOADER\r
+ SKIPE DEVLST ;OR HAS BUILD PATCHED THE DDB CHAIN?\r
+ MOVE UUO,DDTSYM ;YES, DDTSYM HAS SYMBOL TABLE POINTER AS STORED\r
+ ; BY SPMON\r
+REGT30: MOVEM UUO,DDTSYM ;STORE THE SYMBOL TABLE POINTER FOR EXEC DDT\r
+ MOVEI TAC,DDTX ;MAKE SYSTEM STARTUP LOC(141) GO DIRECTLY TO EXEC\r
+ ; DDT AND BY PASS THIS FOOLISHNESS\r
+ HRRM TAC,SYSDDT\r
+ MOVEI TAC,SETUUO ;MAKE SURE THIS IS DONE ONLY ONCE\r
+ HRRM TAC,MOVJMP\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
+\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 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
+\r
+IFN FTRC10, <\r
+ENTRY RCXWNZ ;THIS SYMBOL IS SOLELY TO PERMIT THE SYSTEM\r
+RCXWNZ: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE.\r
+INTERNAL ONCE\r
+>\r
+IFE FTRC10, <\r
+ENTRY ONCE\r
+>\r
+\r
+EXTERNAL CONMES,RADX10,CRLF,DECIN1,OCTPNT\r
+EXTERNAL CONFIG,SYSDAT\r
+INTERN FTTTYSER\r
+IFE FTTTYSER,<\r
+ DEFINE SETTYO <MOVE DAT,LINEP>\r
+ DEFINE TYPE <IDBP CHREC,DAT>\r
+\r
+ DEFINE NEXTC <ILDB CHREC,TAC>>\r
+IFN FTTTYSER,<\r
+ DEFINE SETTYO <PUSHJ PDP,OTSET>\r
+ DEFINE TYPE <PUSHJ PDP,OUTCHS>\r
+ DEFINE NEXTC <PUSHJ PDP,GETCHR>\r
+EXTERN TSETBF,SETBFI,SCNDDB,TTIBUF,TTOBUF,OUTCHS,GETCHR,TIBF,TOBF\r
+>\r
+\r
+ INTERN PATSIZ\r
+ EXTERN PATCH\r
+\r
+ONCE: 0 \r
+PATSIZ: MOVEI TAC,PATCH ;SET SIZE OF SYSTEM TO BEGINING OF PATCH\r
+ MOVEM TAC,SYSSIZ ;IN CASE ONCE ONLY DIALOG RESTARTD BEFORE OVERWRITTEN\r
+\r
+ ;PATSIZ SHOULG BE UPDATED EVERY TIME A PATCH\r
+ ; IS MADE. SYSSIZ SHOULD ALSO BE UPDATED IF 146\r
+ ; START IS GOING TO BE USED(DDT DEBUGGIN OR CTY DOWN)\r
+\r
+ MOVE PDP,[XWD -ONCEPN,ONCEPD]\r
+ SETTYO\r
+ PUSHJ PDP,CRLF\r
+ MOVEI TAC,CONFIG\r
+ PUSHJ PDP,CONMES\r
+ MOVEI TAC,[ASCIZ / /]\r
+ PUSHJ PDP,CONMES\r
+ MOVEI TAC,SYSDAT\r
+ PUSHJ PDP,CONMES\r
+ MOVEI TAC,TSEXEC\r
+ PUSHJ PDP,CONMES\r
+ PUSHJ PDP,OPOUT\r
+\r
+\r
+;ASK FOR TODAY'S DATE AND CONVERT \r
+;DATE STORED AS ((Y-64)*12.+M-1)*31.+D-1\r
+\r
+EXTERNAL THSDAT,JUFMIN,SKIPS\r
+\r
+ PUSHJ PDP,DATLOP\r
+ JRST .-1\r
+DATLOP: SETZM THSDAT\r
+ MOVEI TAC,TODATE\r
+ PUSHJ PDP,ICONM\r
+ PUSHJ PDP,OPOUT\r
+ PUSHJ PDP,GETLIN\r
+ JRST DATLOP\r
+ PUSHJ PDP,SKIPS\r
+ PUSHJ PDP,DECIN1 ;MONTH\r
+ JRST DATLOP\r
+ JRST DATLOP ;ERROR\r
+ SKIPE TAC1\r
+ CAILE TAC1,^D12\r
+ JRST DATLOP\r
+ SUBI TAC1,1\r
+ IMULI TAC1,^D31\r
+ ADDM TAC1,THSDAT\r
+ NEXTC\r
+ PUSHJ PDP,DECIN1 ;DAY\r
+ JRST DATLOP\r
+ JRST DATLOP\r
+ SKIPE TAC1\r
+ CAILE TAC1,^D31\r
+ JRST DATLOP\r
+ SUBI TAC1,1\r
+ ADDM TAC1,THSDAT\r
+ NEXTC\r
+ PUSHJ PDP,DECIN1 ;YEAR\r
+ JRST DATLOP\r
+ JRST DATLOP\r
+ CAIL TAC1,^D69\r
+ CAILE TAC1,^D99\r
+ JRST DATLOP\r
+ SUBI TAC1,^D64 ;YEAR ZERO\r
+ IMULI TAC1,^D12*^D31\r
+ ADDM TAC1,THSDAT\r
+\r
+\r
+;GET TIME OF DAY\r
+\r
+EXTERNAL TIME\r
+\r
+ POP PDP,TC\r
+ PUSHJ PDP,TIMLOP\r
+ JRST .-1\r
+TIMLOP: SETZM TIME\r
+ MOVEI TAC,TIMEM\r
+ PUSHJ PDP,IOCONM\r
+ PUSHJ PDP,OPOUT\r
+ PUSHJ PDP,GETLIN\r
+ JRST TIMLOP ;JUST A CR\r
+ PUSHJ PDP,SKIPS\r
+ PUSHJ PDP,DECIN1 ;READ THE TIME (1-4 CHARACTERS)\r
+ JRST TIMLOP ;NO ARGUMENT\r
+ JRST TIMLOP ;ILLEGAL CHARACTER\r
+ MOVE TAC,TAC1\r
+ IDIVI TYAC,^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
+ CAILE TAC1,^D59 ;MINUTES .G. 59\r
+ JRST TIMLOP ;OUT OF BOUNDS\r
+ IMULI TAC,^D60 ;CONVERT TO MINUTES\r
+ ADD TAC,TAC1 ;MINUTES SINCE MIDNIGHT\r
+ IMULI TAC,JIFMIN ;JIFFIES SINCE MIDNIGHT\r
+ MOVEM TAC,TIME ;TIME=JIFFIES SINCE MIDNIGHT\r
+\r
+ JUMPGE ITEM,QUICK ;SKIP NEXT PART OF DIALOGUE UNLESS THE LAST ITEM\r
+ ; TYPED IN (NAMELY TIME OF DAT) WAS TERMINATED BY\r
+ ; AN "ALT MODE". (ACCUMULATOR "ITEM" IS SET UP\r
+ ; IUN THE "GETLIN" SUBROUTINE CALLED ABOVE.)\r
+\r
+\r
+;PRINT IO CONFIGURATION\r
+\r
+EXTERNAL DEVLST,TCONLN,INLMES,PRENAME,INTTB1,INTTAB\r
+EXTERNAL OCTPNT\r
+\r
+IFN FT2REL,<\r
+ JSR TSTREG ;TEST IF 2 RELOC REG SET TWOSEG 0 OK-1\r
+ MOVEI TAC,CRLFMS ;PRINT CRLF\r
+ PUSHJ PDP,ICONM\r
+ MOVEI TAC,1 ;ASSUME 1\r
+ SKIPE TWOREG\r
+ MOVEI TAC,2\r
+ PUSHJ PDP,RADX10 ;NO. SECOND REG EXISTS.\r
+ PUSHJ PDP,INLMES\r
+ ASCIZ /RELOC. REG.\r
+/\r
+ PUSHJ PDP,OPOUT\r
+>\r
+ MOVEI TAC,IOCONF\r
+ PUSHJ PDP,IOCNM\r
+ HLRZ AC1,DEVLST\r
+ JUMPN AC1,ALRLNK ;DEVICE DATA BLOCK ALREADY LINKED?\r
+ MOVESI PROG,INTNUM ;NO, NOT LOADED BY BULD,-NO. OF DEVICES*2\r
+CONFLP: SKIPN AC1,INTTB1(PROG) ;INT LOC HAVE DEV DATA BLOCK?\r
+ JRST NODDB ;NO, GO GET NEXT DEVICE DATA BLOCK\r
+ LDB UUO,[POINT 8,INTTAB(PROG),8] ;YES. NO. OF DEV DATA BLKS\r
+ HRRZ TAC,UUO ;PRINT\r
+ PUSHJ PDP,RADX10 ;IN DECIMAL\r
+ PUSHJ PDP,INLMES ;PRINT 1 SPACE\r
+ ASCIZ / /\r
+ HLLZ TAC1,DEVNAME(AC) ;DEVICE NAME\r
+ PUSHJ PDP,PRNAME ;PRINT IT\r
+ SOJLE UUO,SINGLE ;IS THIS JUST A SIGNLE DEVICE?\r
+ PUSHJ PDP,INLMES ;NO, APPEND 'S TO DEVICE NAME\r
+ ASCIZ /'S/\r
+SINGLE: PUSHJ PDP,CRLF ;PRINT CR LF\r
+NODDB: AOBJN PROG,.+1 ;\r
+ AOBJN PROG,CONFLP ;FINISHED ALL DEVICES?\r
+ JRST ONCE7A ;YES\r
+ALRLNK:\r
+ONCE5: MOVEI TAC,1\r
+ HLLZ ITEM,DEVNAM(AC1)\r
+ONCE4: HLRZ AC1,DEVSER(AC1)\r
+ JUMPE AC1,ONCE6\r
+ HLLZ TAC1,DEVNAM(AC1)\r
+ CAMN TAC1,ITEM\r
+ AOJA TAC,ONCE4\r
+ONCE6: MOVE PROG,TAC ;SAVE NO.\r
+ PUSHJ PDP,RADX10\r
+ MOVEI CHREC," "\r
+ TYPE\r
+ MOVEI UUO,3\r
+ MOVE TAC,[POINT 6,ITEM]\r
+ONCE7: ILDB CHREC,TAC\r
+ ADDI CHREC,40\r
+ TYPE\r
+ SOJG UUO,ONCE7\r
+ MOVEI TAC,[ASCIZ /'S/]\r
+ CAILE PROG,1\r
+ PUSHJ PDP,CONMES\r
+ PUSHJ PDP,CRLF\r
+ JUMPN AC1,ONCE5\r
+ONCE7A: PUSHJ PDP,OPOUT\r
+ MOVEI TAC,CRLFMS\r
+ PUSHJ PDP,ICONM\r
+ MOVEI TAC,TCONLN ;PRINT NO, OF TTY SCANNER LINES\r
+ PUSHJ PDP,OCTPNT\r
+ PUSHJ PDP,INLMES\r
+ ASCIZ / (OCTAL) TTY SCANNER LINES\r
+/\r
+ PUSHJ PDP,OPOUT\r
+\r
+;ASK FOR OPERATORS CONSOLE TO BE SPECIFIED\r
+\r
+EXTERNAL INLMES,DEVOPR,CTEXT,DEVPHY\r
+\r
+ONCEOP: MOVEI TAC,OPRM\r
+ PUSHJ PDP,ICONM\r
+ PUSHJ PDP,OPOUT\r
+ PUSHJ PDP,GETLIN\r
+ JRST ONCE8 ;JUST CR\r
+ PUSHJ PDP,CTEXT\r
+ MOVE TAC,TAC1\r
+ CAMN TAC,[SIXBIT /CTY/] ;CTY?\r
+ JRST .+3 ;YES. JUST STORE IT.\r
+ PUSHJ PDP,DEVPHY\r
+ JRST ONCEP ;PHYSICAL NAME NOT FOUND\r
+ MOVEM TAC,DEVOPR ;SET FOR SYSTEM\r
+ ;DEVICE "OPR" WILL BE SAME AS THIS\r
+\r
+;ASK IF SYSMAK IS WANTED\r
+\r
+ EXTERN MAKEND,SYSSIZ\r
+\r
+ONCE8: MOVEI TAC,SYSM\r
+ PUSHJ PDP,YESNO\r
+ JRST ONCE2 ;NO SYSMAK\r
+ MOVEI TAC,MAKEND ;YES\r
+ MOVEM TAC,SYSSIZ\r
+\r
+;IS EXEC DDT WANTED?\r
+\r
+EXTERNAL DDTEND\r
+\r
+ONCE2: MOVEI TAC,SYSDM\r
+ PUSHJ PDP,YESNO\r
+ JRST ONCE3 ;NO\r
+ MOVEI TAC,DDTEND ;FIRST FREE LOC. ABOVE EXEC DDT\r
+ MOVEM TAC,SYSSIZ ;SET NEW MONITOR SIZE\r
+;FIND CORE TO BE USED FOR MULTIPLE DEVICE DATA BLOCKS\r
+; INCLUDING DISK\r
+\r
+EXTERNAL CNTDB\r
+\r
+ONCE3: PUSHJ PDP,SYSSIZ ;SAVE CURRENT VALUE\r
+ JSP TAC,CNTDB ;UPDATE SYSSIZ BY SPACE USED\r
+ ; FOR DEVICE DATA BLOCKS FOR DSK,DTA,MTA,TTY,PTY)\r
+\r
+;PRINT OCTAL SIZE OF MONITOR\r
+\r
+ MOVEI TAC,EXECIS\r
+ PUSHJ PDP,ICONM\r
+ MOVE TAC,SYSSIZ\r
+ PUSHJ PDP,OCTPNT\r
+ MOVEI TAC,LENGTH\r
+ PUSHJ PDP,CONMES\r
+ PUSHJ PDP,CRLF\r
+ PUSHJ PDP,OPOUT\r
+ POP PDP,SYSSIZ ;RESTORE SYSSIZ PRIOR TO ACTUAL CREATION\r
+ ; OF DEVICE DATA BLOCKS\r
+ EXTERN DECIN,CORLIM,USRLIM,RADX10\r
+\r
+ONCE4A: MOVEI TAC,MXKMES ;PRINT "MAX. K CORE FOR SINGLE USER IS "\r
+ PUSHJ PDP,ICONM\r
+ MOVEI TAC,USRLIM\r
+ PUSHJ PDP,RADX10\r
+ PUSHJ PDP,CRLF\r
+ PUSHJ PDP,OPOUT\r
+\r
+ MOVEI TAC,DESMES ;PRINT "TYPE DESIRED MAX.(DEC). CR IF OK AS IS\r
+ PUSHJ PDP,ICONM ;"\r
+ PUSHJ PDP,OPOUT\r
+ PUSHJ PDP,GETLIN\r
+ JRST ONCE5A ;LEAVE LIMIT AS SET BY BUILDER QUESTION.\r
+IFN FTTTYSER,<PUSHJ PDP,SKIPS>\r
+ PUSHJ PDP,DECIN\r
+ JRST ONCE4A\r
+ JRST ONCE4A\r
+ SKIPE TAC1 ;UNLESS HE SAID 0 LIKE IN MONGEN.\r
+ HRRM TAC1,CORLIM ;PATCH CORLIM FOR USER CORE SIZE LIMIT\r
+ ; IF NOT PATCHED, LEAVE COMMON'S VALUE\r
+ONCE5A:\r
+\r
+INTERNAL FTDISK\r
+IFN FTDISK,<\r
+ PUSHJ PDP,REF ;GO THROUGH THE REFRESH DIALOG.\r
+>\r
+\r
+QUICK: ;THIS IS THE SHORT-CUT EXIT TO BY-PASS MOST OF THE DIALOGUE\r
+\r
+INTERNAL FTCHECK\r
+\r
+IFN FTCHECK,<\r
+ PUSHJ PDP,OK ;CHECKSUM MONITOR AND SAVE THE ANSWER.\r
+>\r
+\r
+ JRST @ONCE ;***EXIT FROM THE "ONCE-ONLY CODE"***\r
+\r
+\r
+IFN FTNDISK,<\r
+EXTERNAL OCTIN,MFDBLK,SATXWD,NUMPLK,SYSPP,REFLAG\r
+\r
+;REFRESH DIALOGUE\r
+\r
+REF: MOVEI TAC,REF1M ;DO YOU WANT TO REFRESH?\r
+ PUSHJ PDP,YESNO\r
+ POPJ PDP, ;NO\r
+ MOVEI TAC,REF2M ;YES, ARE YOU SURE?\r
+ PUSHJ PDP,YESNO\r
+ POPJ PDP, ;NO\r
+REF6: ;YES. DO YOU WANT TO CHANGE THE LOC\r
+ MOVEI TAC,REF3M ;OF THE MFD?\r
+ PUSHJ PDP,YESNO\r
+ JRST REF3 ;NO\r
+REF2: ;YES\r
+ MOVEI TAC,REF4M ;TYPE LOGICAL DISK ADDRESS OF MFD RETR, INFO\r
+ PUSHJ PDP,ICONM\r
+ PUSHJ PDP,OPOUT\r
+\r
+ PUSHJ PDP,GETLIN\r
+ JRST REF2\r
+ IFN FTTTYSER,<PUSHJ PDP,SKIPS>\r
+ PUSHJ PDP,OCTIN\r
+ JRST REF2\r
+ JRET REF2\r
+IFE FTRC10, <\r
+ PUSH PDP,TAC1 ;IS IT A MULTIPLE OF NUMBLK?\r
+ MOVEI TAC,(TAC1)\r
+ IDIVI TAC,NUMBLK\r
+ JUMPN TAC1,REF4 ;NO\r
+ POP PDP,TAC1\r
+>\r
+ HRRZM TAC1,MFDBLK\r
+ AOS TAC1\r
+ HRRM TAC1,SATXWD\r
+REF3:\r
+INTERNAL FTSWAP\r
+IFN FTSWAP,<IFN FTRC10, <\r
+ MOVEI TAC,REF9M ;HOW MANY 1K BLOCKS ON THE ISK FOR SWAPPING ?\r
+ PUSHJ PDP,ICONM\r
+ PUSHJ PDP,OPOUT\r
+ MOVEI TAC,^D200 ;THE DEFAULT ANSWER IS 200 DECIMAL.\r
+ MOVEM TAC,K4SWAP\r
+ PUSHJ PDP,GETLIN\r
+ JRST REF3A ;JUST A CARRIAGE RETURN INVOKES DEFAULT\r
+ IFN FTTTYSER,<PUSHJ PDP,SKIPS>\r
+ PUSHJ PDP,DECIN\r
+ JRST REF3\r
+ JRST REF3\r
+ CAILE TAC1,MXK2SWP ;ANSWER TOO BIG?\r
+ JRST REF3 ;YES, REPEAT QUESTION\r
+ HRRZM TAC1,K4SWAP ;NO. SAVE THIS CRUCIAL PARAMETER.\r
+REF3A:\r
+>>\r
+\r
+ PUSHJ PDP,REFRES ;REFRESH.\r
+ JRST REF5 ;ERROR\r
+\r
+ MOVEI TAC,REF6M ;REFRESHING SUCCESSFULLY COMPLETED !\r
+ PUSHJ PDP,ICONM\r
+ PUSHJ PDP,OPOUT ;TYPE "REFRESHED !"\r
+\r
+ MOVE TAC,SYSPP\r
+ MOVEM TAC,REFLAG ;TO PERMIT AUTOMATIC LOG-IN UNDER\r
+ ; PROJ-PROG NUMBER [1,1] EVEN\r
+ MOVEI TAC,REF8M ; THOUGH THE LOG-IN CUSP IS CLEARLY NOT\r
+ PUSHJ PDP,ICONM ; ON THE NEWLY REFRESHED DISK.\r
+ PUSHJ PDP,OPOUT\r
+ POPJ PDP,\r
+\r
+IFE FTRC10, <\r
+REF4: POP PDP,TAC1\r
+ MOVEI TAC,REF5M\r
+ PUSHJ PDP,ICONM\r
+ PUSHJ PDP,OPOUT\r
+ JRST REF2\r
+>\r
+\r
+REF5: PUSH PDP,TAC ;ERROR. ON COMMING HERE, TAC HAS LOGICAL BLOCK\r
+ ; NUMBER WHICH COULD NOT BE WRITTEN\r
+ MOVEI TAC,REF7M\r
+ PUSHJ PDP,IOCONM\r
+ POP PDP,TAC\r
+ PUSHJ PDP,OCTPNT\r
+ PUSHJ PDP,CRLF\r
+ PUSHJ PDP,OPOUT\r
+ JRST REF6 ;GO BACK TO TRY AGAIN.,\r
+\r
+REF1M: ASCIZ /DO YOU WANT TO REFRESH THE DISK ? (Y OR CR)\r
+/\r
+REF2M: ASCIZ /ARE YOU SURE(Y OR CR)?\r
+/\r
+REF3M: ASCIZ /DO YOU WANT TO CHANGE THE LOCATION OF THE MFD(Y OR CR)?\r
+/\r
+REF4M: ASCIZ /TYPE THE LOGICAL DISK ADDRESS OF THE MFT RETREIVAL INFORMATION\r
+/\r
+IFE FTRC10, <\r
+REF5M: ASCIZ /MUST BE A MULTIPLE OF NUMBLK.\r
+/\r
+>\r
+REF6M: ASCIZ /REFRESHED !\r
+/\r
+REF7M: ASCIZ /ERROR WHILE WRITING BLOCK /\r
+REF8M: ASCIZ /TO AUTOMATICALLY LOG-IN UNDER [1,1], TYPE "LOGIN"\r
+/\r
+IFN FTRC10, <\r
+REF9M: ASCIZ /HOW MANY (DECIMAL) 1K DISK BLOCKS ARE TO BE ALLOCATED FOR SWAPPING ?\r
+/\r
+>\r
+> ;THIS CLOSES AN FTDISK CONDITIONAL SERVAL PAGES BACK.\r
+\r
+;ROUTINE TO READ A LINE FROM OPERATORS CONSOLE\r
+;CALL: PUSHJ PDP,GETLIN\r
+; JUST A CR TYPED IN\r
+; A LINE TYPED IN,TAC SEYT AS BYTE POINTER\r
+\r
+CHREC=TEM ;CHAR TO TYPE OUT (MUST BE SAME AS SCNSER ROUTINE)\r
+LINE=TAC1 ;TTY LINE NO. (ALSO SAME AS SCNSER)\r
+\r
+IFN FTTTYSER,<EXTERN TSETBF,SETBFI,SCNDDB,DCPUTR,PUTCHI>\r
+\r
+EXTNERAL CPOPJ\r
+\r
+GETLIN: IFE FTTTYSER,<MOVE TAC,LINEP>\r
+ IFN FTTTYSER,< PUSHJ PDP,SETBFI>\r
+ SETZB ITEM,CHREC\r
+GET1: PUSHJ PDP,TYI\r
+ DATAI TTY,CHREC\r
+ ANDI CHREC,177\r
+ CAIN CHREC,177 ;RUBOUT?\r
+ JRST DELETE\r
+ CAIN CHREC,33 ;ALTMODE ?\r
+ JRST GETLN1 ;YES\r
+ CAIE CHREC,175 ;VARIATION OF ALT-MODE ?\r
+ CAIN CHREC,176 ;OR YET THIS THIRD VARIATION ?\r
+ JRST GETLN1 ;YES\r
+GET2: PUSHJ PDP,TYO ;ECHO CHARACTER\r
+ CAIL CHREC,140 ;IS THIS LOWER CASE?\r
+ TRZ CHREC,40 ;YES,MAKE IT UPPER CASE\r
+IFE FTTTYSER,<IDPB CHREC,TAC>\r
+IFN FTTTYSER,<PUSHJ PDP,PUTCHI ;STORE CHARACTER\r
+ JFCL ;IGNORE ERROR RETURN\r
+>\r
+ CAIE CHREC,15\r
+ AOJA ITEM,GET1\r
+ MOVEI CHREC,12 ;OUTPUT LF\r
+ PUSHJ PDP,TYO ;TYPE OUT\r
+IFE FTTTYSER,< MOVE TAC,LINEP ;RESET BYTE POINTER>\r
+ JUMPN ITEM,CPOPJ1 ;NULL LINE?\r
+ POPJ PDP, ;YES, DON'T SKIP RETURN\r
+\r
+DELETE: IFN FTTTYSER,< PUSHJ PDP,DCPUTR\r
+ JRST DELET1>\r
+IFE FTTTYSER,<\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
+ MOVEI CHREC,134\r
+ PUSHJ PDP,TYO\r
+ SOJA ITEM,GET1\r
+\r
+DELET1: MOVEI CHREC,15\r
+ PUSHJ PDP,TYO\r
+ MOVEI CHREC,12\r
+ PUSHJ PDP,TYO\r
+ JRST GETLIN\r
+\r
+GETLN1: SETOM ITEM ;MECHANISM USED TO BY-PASS PART OF DIALOGUE\r
+ MOVEI CHREC,15 ;WHEN ALTMODEIS TYPED.\r
+ JRST GET2\r
+\r
+;ROUTINE TO TYPE A LINE ON OPERATOR CONSOLE\r
+;ECHO CHECK STOPS LINE AND RETURNS\r
+;CALL: DAT SET TO END OF MESSAGE\r
+\r
+IFN FTTTYSER,<EXTERNAL CPOPJ>\r
+\r
+OPOUT: IFE FTTTYSER,<MOVE TAC,LINEP>\r
+ IFN FTTTYSER,<MOVEI DAT,TTOBUF(DEVDAT)>\r
+ CONO TTY,1000 ;CLEAR INPUT\r
+OPOUT1: IFE FTTYSER,<\r
+ CAMN TAC,DAT\r
+ POPJ PDP,>\r
+ CONSZ TTY,40\r
+ JRST OPOUT2 ;ECHO CHECK\r
+ MEXTC\r
+IFN FTTTYSER,< JUMPE CHREC,CPOPJ>\r
+ PUSHJ PDP,TYO\r
+ JRST OPOUT1\r
+\r
+OPOUT2: MOVEI CHREC,15\r
+ PUSHJ PDP,TYO\r
+ MOVEI CHREC,12\r
+ PUSHJ PDP,TYO\r
+ CONO TTY,1000 ;CLEAR INPUT\r
+\r
+;WAIT TILL OUTPUT BUSY OFF BEFORE TYPING OUT CHAR.\r
+\r
+EXTERNAL TCONLN,TYPL\r
+\r
+TYO: PUSHJ PDP,APRCHK ;CHECK CLOCK\r
+ CONSZ TTY,20\r
+ JRST TYO\r
+ PUSH PDP,TAC\r
+ PUSH PDP,LINE\r
+ MOVE TAC,CHREC\r
+ IMULI TAC,200401\r
+ AND TAC,[OCT 11111111]\r
+ IMUL TAC,[OCT 11111111]\r
+ TLNE TAC,10\r
+ TRO CHREC,200\r
+ DATAO TTY,CHREC\r
+ TRZ CHREC,200\r
+ POP PDP,LINE\r
+ POP PDP,TAC\r
+ POPJ PDP,\r
+\r
+;WAIT TIL INPUT DONE ONE BEFORE RETURNING WITH NEXT CHAR.\r
+\r
+TYI: PUSHJ PDP,APRCHK\r
+ CONSO TTY,40\r
+ JRST TYI\r
+ POPJ PDP,\r
+\r
+;CHECK APR FOR CLOCK FLAG SO TIME USER TYPES IN WILL BE ACCURATE\r
+\r
+APRCHK: CONSO APR,1000 ;IS CLOCK FLAG ON?\r
+ POPJ PDP, ;NO\r
+ CONO APR,1000 ;YES, CLEAR CLOCK FLAG\r
+ AOS TIME ;INCREMENT TIME\r
+ POPJ PDP,\r
+\r
+ICONM: PUSH PDP,TAC\r
+ SETTTYO ;INITIALIZE LINE BUFFER\r
+ POP PDP,TAC\r
+ JRST CONMES ;OUTPUT MESSAGE\r
+\r
+IFN FTTTYSER,<\r
+OTSET: MOVEI DEVDAT,SCNDDB\r
+ MOVSI TEM,120 ;TTYCHR\r
+ HRRI TEM,TIBF(DEVDAT)\r
+ MOVEM TEM,TTIBUF(DEVDAT) ;INIT INPUT POINTER\r
+ HRRI TEM,TDBF(DEVDAT) ;AND OUTPUT POINTER\r
+ MOVEM TEM,TTOBUF(DEVDAT)\r
+ JRST TSETBF ;NOW CLEAR THE BUFFERS\r
+>\r
+\r
+YESNO: PUSHJ PDP,ICONM ;FIRST OUTPUT THE QUESTION\r
+ PUSHJ PDP,OPOUT\r
+ PUSHJ PDP,GETLIN ;NOW GET RESPONSE\r
+ POPJ PDP,0 ;JUST A C-R\r
+ NEXTC\r
+ TRZ CHREC,40 ;FIRST CHAR OF RESPONSE (U.C.)\r
+ CAIN CHREC,"Y" ;WAS IT A Y?\r
+ AOS 0(PDP) ;YES, SKIP\r
+ POPJ PDP, ;NO. MAYBE IT WAS "N", SO DONT SKIP\r
+\r
+;CONSTANTS AND PUSH DOWN LIST\r
+\r
+ONCEPN=20\r
+ONCEPD: BLOCK ONCEPN ;PUSH DOWN LIST\r
+\r
+LINEP: POINT 7,LINBUF ;INPUT AND OUTPUT LINE BUFFERE\r
+LINBUF: BLOCK 30\r
+\r
+;MESSAGES\r
+\r
+TSEXEC: ASCIZ /MONITOR JUST LOADED\r
+/\r
+TODATE: ASCIZ /\r
+TYPE TODAY'S DATE AS MM-DD-YY\r
+/\r
+\r
+TIMEM: ASCIZ /\r
+TYPE TIME AS HHMM\r
+/\r
+IOCONF: ASCIZ /\r
+IO CONFIGURATION\r
+/\r
+OPRM: ASCIZ /\r
+TYPE NAME OF OPR CONSOLE.\r
+/\r
+SYSM: ASCIZ /\r
+DO YOU WANT SYSMAK (TYPE Y IF YES, CR IF NO)?\r
+/\r
+SYSDM: ASCIZ /\r
+EXEC DDT?\r
+/\r
+EXECIS: ASCIZ /\r
+EXEC IS /\r
+LENGTH: ASCIZ / OCTAL LOCATIONS LONG.\r
+/\r
+MXKMES: ASCIZ /MAX K CORE FOR SINGLE USER IS /\r
+DESMES: ASCIZ /TYPE DESIRED MAX,(DEC), CR IF OK AS IS\r
+/\r
+CRLFMS: ASCIZ /\r
+/\r
+\r
+\r
+;INITIALIZE SAT SEARCH ENTRIES\r
+\r
+;THIS "DFWUNS" ROUTINE IS CALLED BY MANDATORY ONCE ONLY CODE(LINKSR)\r
+; AFTER ALL MULTIPLE DEVICE DATA BLOCKS HAVE BEEN GENERATED IN CORE\r
+; ABOVE C(SYSSIZ)( AND SYSSIZ HAS BEEN INCREMENTED)\r
+; IT IS CALLED WHETHER OR NOT THE DISK WAS REFRESHED. IF REFRESHING WAS\r
+; PERFORMED, DFWUNS IS CALLED AFTER REFRES SINCE SYSINI CALLS LINKSR AFTER ONCE.\r
+\r
+INTERNAL FTDISK\r
+IFN FTDISK,\r
+\r
+INTERNAL DFWUNS\r
+EXTERNAL SAT05,JSAT06,SATENT,SATPTR,SATBK2,SATXWD,SATPTR\r
+EXTERNAL SAT,SENTSZ,DSKDDB,DSKBUF,WSYNC,MQIN,MQOUT,DFGETF,SETFRE\r
+EXTERNAL WLBIT,NUMBIT,DSKCNT\r
+\r
+DFWUNS:\r
+IFN FTRC10, <\r
+ PUSHJ PDP,WRITLK ;FORCE THE WRITE-LOCK SWITCH SETTINGS TO BE ZERO.\r
+\r
+ PUSHJ PDP,RDSTAT ;READ VITAL DISK STATISTICS BLOCK, STORE PARAMETERS\r
+ PUSHJ PDP,CAPCTY ;DETERMINE CURRENT SYSTEM CAPACITY (HOW MANY DISKS).\r
+ CAMN TAC,LBHIGH ;HAS CAPACITY CHANGED SINCE LAST REFRESH ?\r
+ JRST DFWNZ1 ;NO, EVERYTHING APPPEARS TO BE OKAY.\r
+ SETTTYO ;YES, PRINT WARNING MESSAGE...\r
+ PUSHJ PDP,INLMES\r
+ ASCIZ /DISK CAPACITY HAS CHANGED SINCE LAST REFRESHING.\r
+EITHER RESTORE PREVIOUS DISK CONFIGURATION OR REFRESH.\r
+/\r
+ PUSHJ PDP,OPOUT ;START TTY\r
+ PUSHJ PDP,REF ;GO THROUGH THE REFRESH DIALOGUE\r
+ JRST DFWUNS ;NOW TRY AGAIN.\r
+DFWNZ1:\r
+>\r
+ MOVEI TAC,SETENT\r
+ MOVEM TAC,SATPTR\r
+ MOVEI PROG,0\r
+ MOVEI DEVDAT,DSKDDB\r
+ MOVE TAC1,SATBK2\r
+ MOVEM TAC1,DSKBUF(DEVDAT)\r
+ PUSH PDP,WSYNC\r
+ MOVE TAC,JSAT06\r
+ MOVEM TAC,WSYNC\r
+ SKIPA TAC,SATXWD\r
+\r
+;READ EACH SAT BLOCK FROM THE DISK AND SET SATENT TABLE TO MATCH INFO ON DISK.\r
+\r
+SETS1: ADDM TAC1,SATPTR\r
+SETS2: PUSH PDP,TAC\r
+ SETZB IOS,DEVIOS(DEVDAT)\r
+ PUSHJ PDP,MQIN ;READ A SAT BLOCK\r
+ JRST 4,SETS6 ;ERROR HALT\r
+ MOVE DAT,SATPTR ;RESET THE ENTRY\r
+ MOVE TAC,SATBK2\r
+ MOVEM TAC,2(DAT)\r
+ MOVSI TAC1,400000\r
+ MOVEM TAC1,1(DSAT)\r
+ MOVEI DAT,0\r
+SETS3: MOVE AC1,(TAC) ;COUNT ONE-BITS\r
+ AOJN AC1,SETS3A ;IS THE WORD = -1?\r
+ ADDI DAT,44 ;YES\r
+ JRST SETS5\r
+\r
+SETS3A: SOJE AC1,SETS5 ;NO, IS IT = 0?\r
+SETS4: TDNE TAC1,(TAC) ;NO, COUNT THE BITS\r
+ ADDI DAT,1\r
+ ROT TAC1,-1\r
+ JUMPGE TAC1,SETS4\r
+\r
+SETS5: AOBJN TAC,SETS3 ;LOOP THRU ENTIRE BLOCK\r
+ HRRM DAT,@SATPTR\r
+\r
+IFE FTRC10, <\r
+;BITS HAVE BEEN COUNTED, CHECK FOR WRITE-LOCK\r
+ CAIL DAT,NUMBIT ;BLOCK FULL?\r
+ JRST SETS8\r
+ PUSHJ PDP,DEGETF ;NO. GET A FREE BLOCK\r
+\r
+ PUSHJ PDP,SETS7 ;WRITE\r
+ PUSHJ PDP,SETFRE ;FREE THE BLOCK\r
+>\r
+\r
+SETS5B: MOVEI TAC1,SENTSZ ;PREPARE TO BUMP SATPTR\r
+ POP PDP,TAC\r
+ AOBJN TAC,SETS1 ;DO ALL SAT BLOCKS\r
+\r
+IFE FTRC10, <\r
+ JRST SAT05 ;RETURN\r
+>\r
+\r
+IFN FTRC10, <\r
+ HRRZ TAC,SATPTR\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
+ HRRM TAC1,(TAC) ; TABLE TO SHOW ALL NON-EXISTENT DISKS AS\r
+ JRST SETS5X ; BOTH WRITE-LOCKED AND FULL.\r
+>\r
+\r
+IFE FTRC10, <\r
+\r
+;WRITE-LOCK DETERMINATION ON THE OLD PDP-6 (DATA PRODUCTS) DISK --\r
+\r
+SETS7: PUSH PDP,TAC ;SAVE BLOCK ADDRESS\r
+SETS7A: PUSHJ PDP,MQOUT\r
+ JRST SETS7C ;ERROR\r
+SETS7B: POP PDP,TAC\r
+ POPJ PDP,\r
+SETS7C: MOVE TAC,(PDP)\r
+ MOVE TAC1,DSKCNT(DEVDAT)\r
+ TRNN TAC1,IOIMPM ;WRITE LOCK?\r
+ JRST 4,SETS7A ;NO\r
+ MOVEI TAC,WLBIT ;YES. SET BIT\r
+ ORM TAC,@SATPTR\r
+ JRST SETS7B\r
+\r
+SETS8: MOVEI TAC,SETS9 ;BLOCK FULL, READ FIRST ONE\r
+ HRRM TAC,DSKBUF(DEVDAT)\r
+ HLRZ TAC,@SATPTR\r
+ PUSHJ PDP,MQIN\r
+ JRST 4,.-2 ;ERROR\r
+ HLRZ TAC,@SATPTR ;WRITE IT BACK\r
+ PUSHJ PDP,SETS7\r
+ MOVEI TAC,SAT ;RESET\r
+ HRRM TAC,DSKBUF(DEVDAT) \r
+ JRST SETS5B\r
+\r
+SETS9: BLOCK 204\r
+\r
+> ;CLOSE THE IFE FTRC10\r
+> ;CLOSES AN IFN FTDISK A COUPLE PAGES BACK.\r
+\r
+IFN FTDISK,<\r
+\r
+;DISK REFRESHING ROUTINES ---\r
+\r
+IFE FTRC10, <\r
+;DISK REFRESHER FOR THE OLD PDP-6 (DATA PRODUCTS) DISK --\r
+\r
+\r
+EXTERNAL MFDBLK,NUMSAT,CHKCNT,CHKSUM,NUMBLK,DSKINI,SETSAT,DSKCHN,DSKCHL\r
+\r
+REFRESH: MOVEI PROG,0 ;SETUP IO\r
+ MOVEI DEVDAT,DSKDDB\r
+ PUSH PDP,SETSAT\r
+ MOVE TAC,RPOPJ\r
+ MOVEM TAC,SETSET\r
+ PUSHJ PDP,DSKINI\r
+ POP PDP,SETSAT\r
+ MOVEI TAC,DSKCHN\r
+ LSH TAC,1\r
+\r
+ ADDI TAC,40\r
+ MOVE TAC1,[JSR DSKCHL]\r
+ MOVEM TAC1,(TAC)\r
+ PUSH PDP,WSYNC\r
+ MOVE TAC,JSAT06\r
+ MOVEM TAC,WSYNC\r
+\r
+;SETUP NULL SAT BLOCK\r
+\r
+ SETOM DAT\r
+ MOVE TAC1,[XWD NULBLK,NULBLK+1]\r
+ SETZM NULBLK\r
+ BLT TAC1,NULBLK+177\r
+ MOVEI TAC,NUMBLK ;END OF BLOCK BYTE POINTER\r
+ IDIVI TAC,^D36\r
+ SUBI TAC1,^D36\r
+ MOVMS TAC1\r
+ ROT TAC1,-6\r
+ ADDI TAC,NULBLK\r
+ HLL TAC,TAC1\r
+ TLOA TAC,100\r
+ IDPB DAT,TAC\r
+ TLNE TAC,770000\r
+ JRST .-2\r
+ AOS TAC\r
+ MOVEM DAT,(TAC)\r
+ HRLS TAC\r
+ AOS TAC\r
+ BLT TAC,NULBLK+177\r
+\r
+;SET UP SAT BLOCK WITH MFD AND SAT BLOCKS ALLOCATED\r
+\r
+ MOVE TAC,[XWD NULBLK,SATBL1]\r
+ BLT TAC,SATBL1+177\r
+ MOVE TAC,[POINT 1,SATBL1]\r
+ MOVEI TAC1,NUMSAT\r
+ HRLM TAC1,SATRET+3\r
+ ADDI TAC1,3\r
+ IDPB DAT,TAC\r
+ SOJG TAC1,.-1\r
+\r
+;COMPUTE CHECKSUMS IF REQUIRED\r
+\r
+ MOVEI DAT,CHKCNT\r
+ JUMPE DAT,REFR1\r
+ MOVE TAC,[XWD -200,MFD1]\r
+ PUSHJ PDP,CHKSUM\r
+ HRLM TAC1,MFDRET+4\r
+ MOVE TAC,[XWD -200,NULBLK]\r
+ PUSHJ PDP,CHKSUM\r
+ HRLM TAC1,SATRET+4\r
+ MOVE TAC,[XWD -200,SATBL1]\r
+ PUSHJ PDP,CHKSUM\r
+ MOVE DAT,TAC1\r
+\r
+;RELOCATE POINTERS RELATIVE TO MFDBLK\r
+\r
+REFR1: MOVE TAC,MFDBLK\r
+ HRRM TAC,MFDRET+177\r
+ HRRM TAC,MFD1+1\r
+ ADDI TAC,NUMSAT\r
+ AOS TAC\r
+ HRRM TAC,SATRET+177\r
+ HRRM TAC,MFD1+3\r
+ AOS TAC\r
+ HRRM TAC,MFDRET+4\r
+ MOVNI TAC1,NUMSAT\r
+ MOVSS TAC1\r
+ HRRI TAC1,1\r
+ MOVE TAC,MFDBLK\r
+ HLL TAC,SATRET+4\r
+ HRRZM TAC1,SATRET+3(TAC1)\r
+ ADDM TAC,SATRET+3(TAC1)\r
+ AOBJN TAC1,.-2\r
+\r
+;FIX CHECKSUM FOR SATBL1\r
+\r
+ MOVE TAC,MFDBLK\r
+ IDIVI TAC,NUMBLK\r
+ HRLM DAT,SATRET+3(TAC)\r
+ MOVE DAT,TAC\r
+\r
+;WRITE BLOCKS ON DISK\r
+\r
+ MOVE TAC,MFDBLK ;MFD RETREIVAL INFORMATION\r
+ MOVE TAC1,[XWD -200,MFDRET]\r
+ MOVEM TAC1,DSKBUF(DEVDAT)\r
+ SETZB IOS,DEVIOS(DEVDAT)\r
+ PUSHJ PDP,MQOUT\r
+ JRST REFER ;ERROR\r
+ MOVEI TAC,1\r
+REFR2: MOVE TAC1,[XWD -200,NULBLK] ;SAT BLOCKS\r
+ CAMN TAC,DAT\r
+ MOVE TAC1,[XWD -200,SATBL1]\r
+ PUSH PDP,TAC\r
+ ADD TAC,MFDBLK\r
+ SETZB IOS,DEVIOS(DEVDAT)\r
+ MOVEM TAC1,DSKBUF(DEVDAT)\r
+ PUSHJ PDP,MQOUT\r
+ JRST REFER1 ;ERROR\r
+ POP PDP,TAC\r
+ CAIGE TAC,NUMSAT\r
+ AOJA TAC,REFR2\r
+ AOS TAC ;SAT RETREIVAL INFORMATION\r
+ ADD TAC,MFDBLK\r
+ SETZB IOS,DEVIOS(DEVDAT)\r
+\r
+ MOVE TAC1,[XWD -200,SATRET]\r
+ MOVEM TAC1,DSKBUF(DEVDAT)\r
+ PUSHJ PDP,MQOUT\r
+ JRST REFER ;ERROR\r
+ MOVE TAC,MFDBLK ;MFD\r
+ ADDI TAC,NUMSAT\r
+ ADDI TAC,2\r
+ MOVE TAC1,[XWD -200,MFD1]\r
+ MOVEM TAC1,DSKBUF(DEVDAT)\r
+ SETZB IOS,DEVIOS(DEVDAT)\r
+ PUSHJ PDP,MQOUT\r
+ JRST REFER ;ERROR\r
+ POP PDP,WSYNC\r
+ JRST CPOPJ1\r
+\r
+REFER1: POP PDP,TAC1\r
+REFER: POP PDP,WSYNC\r
+RPOPJ: POPJ PDP,\r
+\r
+DEFINE ZEROS (A),<XLIST\r
+ REPEAT A,<0>\r
+ LIST>\r
+\r
+DEFINE ONES (A),<XLIST\r
+ REPEAT A,<-1>\r
+ LIST>\r
+\r
+DEFINE BLOCKR (NAME,EXT,PROT,PROGX,B,F,Z),<\r
+ NAME\r
+ EXT\r
+ EXP PROT*1B8+14812\r
+ XWD 1,PROGX\r
+ EXP Z\r
+ ZEROES 172\r
+ BYTE (4) F (14) 0 (18) B >\r
+\r
+MFDRET: BLOCKR <XWD 1,1>,<SIXBIT /UFD/>,45,1,0,4,20 ;MFD RETREIVAL INFO\r
+\r
+SATBL1: XWD 777776,0 ;THIS SAT BLOCK CONTAINSS\r
+ ZERSO 5400/44-1 ;ALLOCATION FOR MFD AND SAT BLOCKS\r
+ XWD 001777,-1\r
+ ONES 200+SATBL1-.\r
+\r
+SATRET: BLOCKR <SIXBIT /*SAT*/>,<SIXBIT /SYS/>,555,1,0,1,16\r
+\r
+MFD1: XWD 1,1 ;MFD\r
+ XWD 654644,0\r
+ SIXBIT /*SAT*/\r
+ XWD 637163,17 ;RELOCATED\r
+ ZEROS 174\r
+\r
+NULBLK: ZEROS 5400/44-1 ;NULL SAT BLOCK\r
+ XWD 001777,-1\r
+ ONES 200+NULBLK-.\r
+\r
+> ;END OF THE REFRESHER FOR THE OLD PDP-6 DISK.\r
+\r
+\r
+IFN FTRC10, <\r
+\r
+;DISK REFRESHER FOR THE NEW PDP-10 MODEL RC-10 (BURROUGHS) DISK--\r
+\r
+ EXTERNAL CPOPJ1,THSDAT,TIME\r
+ EXTERNAL MFDBLK,SATXWD,NUMSAT,NUMBLK,SATTOP,SENTSZ\r
+ EXTERNAL DISKUP,DFREF,DFWRT,DSKFDG,CHKSUM,RCXCCW,RCXFIN\r
+ EXTERNAL K4SWAP\r
+IFN FTSWAP,<\r
+ EXTNERAL MAXSWP,MXK2SWP,BLKSPK\r
+>\r
+EXTERNAL LBHIGH\r
+ INTERNAL STATBK\r
+\r
+STATBK=1 ;FIXED LOGICAL BLOCK NUMBER FOR THE "VITAL\r
+ ; STATISTICS" BLOCK OF THE DISK.\r
+DSK=170 ;DEFINE DEVICE NUMBER OF THE MODEL RC-10 DISK SYNCHRONIZER.\r
+\r
+\r
+;THESE NEXT TWO PAGES ARE LIFED DIRECTLY FROM "DSKINIT" IN ORDER TO DEFINE THE\r
+; CONO AND CONI BITS USED HERE IN "ONCE".\r
+\r
+;CONI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --\r
+\r
+;BITS 00 - 17 MAINTENANCE PANEL SWITCH SETTINGS INDICATORS --\r
+ ;BITS 00 - 04 UNUSED\r
+MSS=1B5 ;SET INDICATES "MAINTENANCE SEGMENT SELECTED" (SEGMENT 81),\r
+PLGSW=1B6 ;1 = WRITE-PROTECT EVERYTHING BELOW (LESS THAN) THE BOUNDARY,\r
+ ; 0 = WRITE-PROTECT EVERYTHING ABOVE (GREATER THAN) BOUNDARY,\r
+ ;THE CURRENT IMPLEMENTATION OF THE RC-10 DISK SYNCHRONIZER\r
+ ; DOES NOT PERMIT SENSING THE INCLUSION OF THE BOUNDARY.\r
+ ;BITS 07 - 17 THE WRITE-PROTECTION THE INCLUSION OF THE BOUNDARY.\r
+DTOP=1B18 ;SET INDICATES DATA TRANSFER IN PROGRESS.\r
+;BITS 19 -29 ERROR CONDITIONS INDICATORS (ERROR WHEN SET) --\r
+ SRCHE=1B19 ;SEARCH ERROR (DISK TIMING TRACK PROBLEMS!!)\r
+ DDE=1B20 ;DISK DESIGNATION ERROR\r
+ TSE=1B21 ;TRACK SELECT ERROR (OR EXCEEDS SYSTEM CAPACITY)\r
+ MRDY=1B22 ;DISK NOT READY (OR NON-EXISTENT DISK REFERENCED)\r
+ PSF=1B23 ;POWER SUPPLY FAILURE\r
+ DPAR=1B24 ;DISK PARITY ERROR\r
+ CHDPAR=1B25 ;CHANNEL DATA PARITY ERROR\r
+ CHCPAR=1B26 ;CHANNEL CONTROL PARITY ERROR\r
+ NXMEM=1B27 ;NON-EXISTENT MEMORY REFERENCED\r
+ WRPE=1B28 ;ATTEMPTED TO WRITE IN PROTECTED DISK AREA (SEE BITS 06 - 17)\r
+ OVR=1B29 ;OVERRUN, I.E., MEMORY DIDN'T RESPOND QUICKLY ENOUGH\r
+;BIT 30 CHANNEL CONTROL WORD WRITTEN IN MEMORY (THIS BIT IS\r
+ ;TURNED ON ON ALMOST ALL TERMINATIONS.)\r
+BUSYRT=1B31 ;BUSY (SYNCHRONIZER PERFORMING A COMMAND SEQUENCE)\r
+DONEFLG=1B32 ;DONE -- THIS ACTUALLY CAUSES THE INTERRUPT.\r
+;BITS 33 - 35 PI CHANNEL SELECTION BITS.\r
+\r
+;COMBINATIONS OF ERRO BITS GROUPED BY TYPE --\r
+DATERR=DPAR!CHDPAR ;DATA ERRORS.\r
+DEVERR=SRCHE!PSF!CHCPAR!OVR ;DEVICE ERRORS.\r
+SETERR=DDE!TSE!NRDY!NXMEM ;SOFTWARE-PREVENTABLE ERRORS.\r
+\r
+\r
+;CONO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER\r
+\r
+;BITS 00 - 17 UNUSED\r
+;BITS 18 - 19 SELECT DISK FOR SECTOR COUNTER READ-OUT A(SEE DATAI BITS 28-35)\r
+;BITS 20 - 29 RESET THE CORRESPONDING CONI ERROR BIT\r
+ ;(BUT PSE MAY REFUSE TO BE RESET)\r
+WRCCWD=1B30 ;WRITE THE CHANNEL CONTROL WORD INTO MEMORY (NOW!)\r
+STPBIT=1B31 ;STOP -- IMMEDIATELY CEASE PRESENT I/O AND CLEAR THE CHANNEL.\r
+RESETB=1B32 ;RESET THE DONE FLAG (CORRESPONDING CONI BIT) TO CLEAR INTERRUPT\r
+;BITS 33 - 35 PI CHANNEL SELECTION BITS\r
+\r
+;DATAI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --\r
+\r
+;BITS 00 - 17 UNUSED\r
+;BITS 18 - 23 PARITY REGISTER\r
+;BITS 24 - 25 UNUSED\r
+;BITS 26 - 27 DISK SELECTED BY BITS 18-19 OF LAST CONO\r
+;BITS 28 - 35 CURRENT SECTOR POSITION OF SELECTED DISK (FOR LATENCY OPTIMIZATION!)\r
+\r
+;DATAO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --\r
+\r
+;BITS 00 - 17 DISK ADDRESS ELECTION\r
+ ;BITS 00 - 01 DISK SELECT\r
+ ;BITS 02 - 10 TRACK SELECT (BCD, BUT FIRST CHAR IS JUST 1 BIT)\r
+ ;BITS 11 - 17 SEGMENT SELECT (BCD, BUT FIRST CHAR HAS ONLY 3 BITS)\r
+;BITS 18 - 23 INITIAL PARITY REGISTER SETTING 9ZERO EXCEPT FOR DIAGNOSTIC PROGRAMS)\r
+DDSKPE=1B24 ;DISABLE DISK PARITY ERROR STOP\r
+DCHNPE=1B25 ;DISABLE CHANNEL DATA PARITY ERROR STOP\r
+WRBIT=1B16 ;SET MEANS WRITE ON DISK, RESET MEANS READ FROM DISK\r
+;BITS 27 - 34 ;CORRESPONDING BITS OF INITIAL CHANNEL CONTROL ADDRESS, HENCE,\r
+ ; THIS ADDRESS MUST BE EVEN AND IN THE FIRST 1K OF CORE MEMORY!\r
+;BIT 35 ;WRITE EVEN PARITY DATA INTO MEMORY (DIAGNOSTICS ONLY!)\r
+\r
+\r
+REFRESH:\r
+ PUSHJ PDP,DISKUP ;BE SURE THE DISK IS UP AND READY.\r
+ PUSHJ PDP,WRITLK ;BE SURE WRITE-LOCK SWITCHES ARE OFF.\r
+ PUSHJ PDP,CAPCTY ;DETERMINE THE CURRENT DISK CAPACITY OF THE\r
+ ; SYSTEM, I.E. HOW MANY DISKS ARE ATTACHED TODAY ?\r
+ MOVEM TAC,LBHIGH ;STORE HIGHEST LEGAL LOGICAL BLOCK NUMBER\r
+ AOS TAC\r
+IFN FTSWAP,<\r
+ MOVE TAC1,K4SWAP\r
+ LSH TAC1,BLKSPK ;COMPUTE AND SAVE THE LOWEST LOGICAL BLOCK\r
+ SUBM TAC,TAC1 ; NUMBER RESERVED FOR SWAPPING.\r
+ MOVEM TAC1,LOWSWP\r
+ CAIG TAC1,STATBK ;SWAPPING AREA MUST NOT OVERLAY THE\r
+ JRST RFRSHE ; VITAL STATISTICS BLOCK.\r
+>\r
+ IDIVI TAC1,NUMBLK\r
+ MOVN TAC1,TAC ;SET SATXWD TO SHOW ONLY THE NUMBER OF\r
+ HRLM TAC1,SATXWD ; SAT BLOCKS ACTUALLY IN EXISTENCE.\r
+ HRRZ TAC1,MFDBLK\r
+ ADDI TAC,2(TAC1)\r
+IFN FTSWAP,<\r
+ CAML TAC,LOWSWP ;MAKE VARIOUS CONSISTENCY CHECK TO DETERMINE\r
+ JRST RFRSHE ; THAT THE DISK PARAMETERS SPECIFIED DURING THE\r
+>\r
+ CAIG TAC1,STATBK ; ONCE-ONLY DIALOGUE DO NOT CAUS THE DISK\r
+ CAIGE TAC,STATBK ; SWAPPING AREA, VITAL STATISTICS BLOCK, AND/OR\r
+ JRST RFRSH1 ; THE MFD AND SAT BLOCK TO OVERLAP ONE ANOTHER.\r
+RFRSHE: MOVEI TAC,RFSHME\r
+ ;IF THERE IS SOME OVERLAPPING OF\r
+ PUSHJ PDP,IOCON ; THESE DISK STORAGE AREAS, PRING AN\r
+ PUSHJ PDP,OPOUT ; ERROR MESSAGE AND THEN GO BACK TO THE\r
+ POP PDP,TAC ; DIALOGUE TO AK THE PARAMETER SPECIFICATION\r
+ JRST REF6 ; QUESTIONS AGAIN.\r
+\r
+RFSHME: ACSIZ /PARAMETER SPECIFICATION ERROR. TRY AGAIN.\r
+/\r
+\r
+RFRSH1: PUSHJ PDP,WRSTAT ;WRITE OUT THE VITAL STATISTICS BLOCK ON THE DISK.\r
+ JRST REFERR ; AN ERROR ON THIS WRITE IS BAD TROUBLE !!\r
+\r
+;NEXT WRITE THE MFD (MASTER FILE DIRECTORY) ONTO THE DISK\r
+\r
+ PUSHJ PDP,WNZCLR ;CLEAR THE OUTPUT BUFFER\r
+ MOVE TAC,[XWD 1,1] ;THE FIRST ENTRY IN THE MFD IS FOR\r
+ MOVEM TAC,WNZBUF ; THE MFD ITSELF.\r
+ MOVE TAC,[SIXBIT/UFD/]\r
+ HRR TC,MFDBLK ;POINTER TO MFD RETRIEVAL INFORMATION\r
+ MOVEM TAC,WNZBUF+1\r
+ MOVE TAC,[SIXBIT/*SAT*/] ;THE ONLY OTHER ENTRY INITIALLY IN THE\r
+ MOVEM TAC,WNZBUF+2 ; MFD IS FOR THE FILE NAMED *SAT*.SYS WHICH\r
+ HLRZ TAC1,SATXWD ; PERMITS ACCESS TO THE SAT BLOCKS FOR\r
+ HRRZ TAC,MFDBLK ; ANYONE WHO WANTS TO LOOK AT THEM.\r
+ SUBI TAC,-1(TAC1) ;COMPUTE POINTER TO THE RETRIEVAL INFORMATION\r
+ HLL TAC,[SIXBIT/SYS/] ; FOR THE *SAT*.SYS FILE.\r
+ MOVEM TAC,WNZBYUF+3\r
+ HRRZS TAC\r
+ ADDI TAC,1 ;COMPUTE LOGICAL BLOCK NUMBER OF THE MFD.\r
+ PUSHJ PDP,WNZWR ;WRITE THE MFD OUT ONTO THE DISK.\r
+ \r
+ JRST REFERR ;ERROR\r
+\r
+ MOVE TAC,[XWD -200,WNZBUF]\r
+ PUSHJ PDP,CHKSUM\r
+ HRRZM TAC1,CHKSAV ;SAVE CHECKSUM TO GO INTO RETRIEVAL INFORMATION.\r
+\r
+;NEXT WRITE MFD RETRIEVAL INFORMATION BLOCK ONTO THE DISK\r
+\r
+ PUSHJ PDP,WNZCLR ;CLEAR OUTPUT BUFFER\r
+ MOVE TAC,[XWD 1,1]\r
+ MOVEM TAC,WNZBUF ;FILE NAME\r
+ HRRZ TAC,THSDAT\r
+ HLL TAC,[SIXBIT /UFD/]\r
+ MOVEM TAC,WNZBUF+1 ;FILE EXTENSION, DATE\r
+ HRLZI TAC,045000 ;PROTECTION (ANY PROJECT 1 USER MAY WRITE IN MFD)\r
+ PUSHJ PDP,MDTMDT ;FILL IN TIME, DATE, AND MODE\r
+ MOVEM TAC,WNZBUF+2\r
+ MOVE TAC,[XWD -200,1] ;NEGATIVE WORD COUNT AND PROGRAMMER NUMBER\r
+ MOVEM TAC,WNZBUF+3 ;GO INTO WORD 4 OF RETRIEVAL INFO\r
+ HLRZ TAC1,SATXWD\r
+ MOVE TAC,MFDBLK\r
+ SUBI TAC,-2(TAC1) ;COMPUTE POINTER TO THE MFD.\r
+ HRL TAC,CHKSAV ;RETRIEVE SAVED CHECKSUM OF MFD.\r
+ MOVEM TAC,WNZBUF+4\r
+ MOVE TAC,MFDBLK ;THE LAST WORD OF ANY BLOCK OF RETRIEVAL INFORMATION\r
+ MOVEM TAC,WNZBUF+177 ; MUST CONTAIN ITS OWN BLOCK NUMBER.\r
+ PUSHJ PDP,WNZWR ;WRITE MFD RETRIEVAL INFOMRATION ONTO THE DISK\r
+ JRST REFERR ;ERROR\r
+\r
+;NEXT CREATE THE NECESSARY SAT BLOCKS ON THE DISK\r
+\r
+ PUSH PDP,SATXWD ;SATXWD CONTROLS THE OUTER LOOP\r
+ MOVEI TAC,SATENT ;SET UP SATPTR TO SHUFFLE THROUGH THE BLOCKS\r
+\r
+REFST1: MOVEM TAC,SATPTR\r
+ PUSHJ PDP,WNZCLR ;CLEAR THE BUFFER\r
+ MOVEI TAC1,NUMBIT\r
+ SUBI TAC1,NUMBLK\r
+ MOVEI TAC,NUMBLK\r
+ PUSHJ PDP,SETWNZ ;MARK UNAVAILABLE BITS AT END OF THE BLOCK\r
+IFN FTSWAP,<\r
+ HLRZ TAC1,@SATPTR ;GET FIRST LOGICAL BLOCK NUMBER IN THIS SAT BLOCK\r
+ CAMGE TAC1,LOWSWP ;IS ENTIRE BLOCK WITHIN SWAPPING AREA?\r
+ JRST REFST2 ;NO, JUMP AHEAD\r
+ MOVEI TAC1,NUMBIT ;YES, MARK IT ALL OFF LIMITS\r
+ MOVEI TAC,0\r
+ PUSHJ PDP,SETWNZ\r
+ JRST REFST7 ;HAVING SET ALL BITS, NO FURTHER TESTING IS NEEDED,\r
+>\r
+REFST2: MOVN TAC,TAC1\r
+ ADDI TAC1,NUMBLK\r
+ SUB TAC1,LOWSWP ;IS ANY OF SWAPPING AREA WITHIN THIS SAT BLOCK?\r
+ JUMPLE TAC1,REFST3 ;NO, JUMP AHEAD\r
+ ADD TAC,LOWSWP ;YES, MARK SWAPPING AREA AS UNAVAILABLE.\r
+ PUSHJ PDP,SETWNZ\r
+>\r
+REFST3: HLRZ TAC1,@SATPTR ;GET FIRST LOGICAL BLOCK NUMBER IN THIS SAT BLOCK.\r
+ JUMPN TAC1,RFST3A ;ONLY FOR FIRST SAT BLOCK--\r
+ HRLZI TAC,400000 ;MARK LOGICAL BLOCK 0 AS BEING IN USE.\r
+ IORM TAC,WNZBUF\r
+RFST3A: HRRZI TAC,STATBK\r
+ CAIL TAC,(TAC1) ;IS THE VITAL STATISTICS BLOCK WITHIN\r
+ CAIL TAC,NUMBLK(TAC1) ; THE RANGE OF THIS SAT BLOCK ?\r
+ JRST REFST4 ;NO, JUMP AHEAD\r
+ SUB TAC,TAC1\r
+ MOVEI TAC1,1 ;YES, MARK IT UNAVAILABLE,\r
+ PUSHJ PDP,SETWNZ\r
+\r
+REFST4: MOVE TAC,SATXWD ;SET UP TO LOOP THRU LOGICAL BLOCK NUMBERS FOR MFD.\r
+ SUB TAC,[XWD 3,1] ; MFD RETRVL INFO. SAT BLOCKS, AND SAT RETRVL INFO.\r
+\r
+REFST5: PUSH PDP,TAC\r
+ HRRZS TAC\r
+ HLRZ TAC1,@SATPTR\r
+ CAIL TAC,(TAC1) ;IS THE INDICATED LOGICAL BLOCK NUMBER WITHIN\r
+ CAIL TAC,NUMBLK(TAC1) ; THIS PARTICULAR SAT BLOCK ?\r
+ JRST REFST6 ;NO, JUMP AHEAD\r
+ SUB TAC,TAC1\r
+ MOVEI TAC1,1 ;YES, MARK IN-USE BIT.\r
+ PUSHJ PDP,SETWNZ\r
+\r
+REFST6: POP PDP,TAC ;LOOP THROUGH THE WHOLE SET OF SPECIAL BLOCKS\r
+ AOBJN TAC,REFST5 ; WHICH MUST BE MARKED UNAVAILABLE.\r
+\r
+REFST7: MOVE TAC,[XWD -200,WNZBUF]\r
+\r
+ PUSHJ PDP,CHKSUM ;COMPUTE CHECKSUM\r
+ MOVE TAC,SATPTR\r
+ HRRZM TAC1,1(TAC) ;STORE IT TEMPORARILY IN THE SATENT TABLE.\r
+\r
+ HRRZ TAC,(PDP) ;LOGICAL BLOCK NUMBER TO BE WRITTEN\r
+ PUSHJ PDP,WNZWR ;WRITE THIS SAT BLOCK ONTO THE DISK\r
+ JRST REFER1 ;ERROR\r
+\r
+ POP PDP,TAC\r
+ AOBJN TAC,.+2 ;LAST SAT BLOCK WRITTEN ?\r
+\r
+ JRST REFSRF ;YES, GO WRITE SAT RETRIEVAL INFORMATION.\r
+\r
+ PUSH PDP,TAC ;NO, ADVANCE SATPTR AND LOOP\r
+ MOVE TAC,SATPTR ; BACK TO DO NEXT SAT BLOCK.\r
+ ADDI TAC,SENTSZ\r
+ JRST REFST1\r
+\r
+;FINALLY, WRITE OUT THE RETRIEVAL INFORMATION FOR THE FILE *SAT*.SYS\r
+\r
+REFSRF: PUSHJ PDP,WNZCLR ;CLEAR THE BUFFER\r
+ MOVE TAC,[SIXBIT /*SAT*/]\r
+ MOVEM TAC,WNZBUF ;STORE FILE NAME\r
+ HRRZ TAC,THSDAT\r
+ HLL TAC,[SIXBIT /SYS/]\r
+ MOVEM TAC,WNZBUF+1 ;STORE EXTENSION AND DATE\r
+ HRLZI TAC,555000 ;PROTECTION CODE (UNTOUCHABLE FILE ! )\r
+ PUSHJ PDP.MDTMDT ;FILL IN TIME, DATE AND MODE\r
+ MOVEM TAC,WNZBUF+2\r
+ HLLZ TAC,SATXWD ;COMPUTE NEGATIVE WORD COUNT\r
+ LSH TAC,7\r
+ HRRI TAC,1 ;PROGRAMMER NUMBER=1\r
+ MOVEM TAC,WNZBUF+3\r
+\r
+ MOVEI TAC,SATENT ;PREPARE TO STORE POINTERS TO ALL THE SAT BLOCKS.\r
+ MOVE TAC1,SATXWD\r
+ MOVEI AC2,0\r
+\r
+REFSRL: HRRZ AC1,TAC1 ;GET LOGICAL BLOCK NUMBER OF SAT BLOCK.\r
+ HRL AC1,1(TAC) ;RETRIEVE THE CORRESPONDING CHECK-SUM.\r
+ MOVEM AC1,WNZBUF+4(AC2) ;STORE A POINTER WORD IN THE BUFFER.\r
+ MOVSI AC1,400000 ;RESTORE SATENT ENTRY TO CORRECT INITIAL VALUE.\r
+ MOVEM AC1,1(TAC)\r
+ AOS AC2\r
+ ADDI TAC,SENTSZ\r
+ AOBJN TAC1,REFSRL ;IS THAT ALL THE POINTERS ? IF NOT, LOOP BACK.\r
+\r
+ MOVE TAC,MFDBLK ;YES.\r
+ ADDI TAC,1(AC2) ;NOW COMPUTE LOGICAL BLOCK NUMBER OF THIS SAT\r
+ MOVEM TAC,WNZBUF+177 ; RETRIEVAL INFORMATION, AND STORE IT IN\r
+ ; THE LAST WORD OF THE BLOCK (THIS IS\r
+ ; REQUIRED FORMAT OF ALL RETRVL INFO).\r
+\r
+ PUSHJ PDP,WNZWR ;WRITE THE *SAT*.SYS RETRVL INFO ONTO THE DISK.\r
+ JRST REFERR ;ERROR\r
+\r
+ JRST CPOPJ1 ;***EXIT FROM PDP-10 DISK REFRESHER.***.........\r
+\r
+\r
+;ROUTINE TO WRITE THE FIXED BLOCK OF VITAL STATISTICS ONTO THE DISK.\r
+\r
+WRSTAT: PUSHJ PDPWNZCLR ;CLEAR THE OUTPUT BUFFER\r
+ MOVE TAC,[XWD -WRSTSZ,0]\r
+WRSTA1: MOVE TAC1,@WRSTA9(TAC) ;STORE KEY QUANTITIES IN THE OUTPUT BUFFER\r
+ MOVEM TAC1,WNZBUF(TAC)\r
+ AOBJN TAC,WRSTA1\r
+\r
+ MOVE TAC,[SIXBIT/STATBK/] ;STORE AN IDENTIFIER NEAR THE \r
+ MOVEM TAC,WNZBUF+^D126 ; END OF THE VITAL STATISTICS BLOCK.\r
+\r
+ MOVEI TAC,STATBK\r
+ PUSHJ PDP,WNZWR ;WRITE THIS VITAL STATISTICS BLOCK ONTO THE DISK.\r
+ JRST WRSTA2 ;WRITE ERROR\r
+ JRST CPOPJ1 ;GOOD WRITE. ***SUBROUTINE EXIT***...........\r
+\r
+\r
+WRSTA2: MOVEI TAC,WRSTM1\r
+ PUSHJ PDP,ICONM ;PRINT ERROR MESSAGE IF THIS VITAL WRITE FAILS.\r
+ PUSHJ PDP,OPOUT\r
+ POPJ PDP, ;THEN ALSO GIVE AN ERROR RETURN FOR FURTHER ACTION.\r
+\r
+WRSTM1: ASCIZ /CANNOT WRITE VITAL STATISTICS BLOCK ON DISK. HELP!!\r
+/\r
+\r
+;TABLE OF POINTERS TO THE VITAL STATISTICS THAT ARE STORED IN "STATBK" ON THE DISK.\r
+\r
+WRSTA9: XWD ,MFDBLK ;LOGICAL BLOCK NUMBER OF MFD RETRIEVAL INFORMATION\r
+ XWD ,SATXWD ;LH = - NUMBER OF SAT BLOCKS ACTUALLY IN EXISTENCE.\r
+ ;RH = LOGICAL BLOCK NUMBER OF FIRST SAT BLOCK\r
+ XWD ,LBHIGH ;HIGHEST LEGAL LOGICAL BLOCK NUMBER ON DISK(S)\r
+ XWD ,LOWSWP ;LOWEST LOGICAL BLOCK NUMBER ALLOCATED FOR SWAPPING\r
+ XWD ,K4SWAP ;NUMBER OF 1K BLOCKS OF DISK SPACE FOR SWAPPING\r
+IFN FTSWAP,<\r
+ XWD ,MAXSWP ;MAXIMUM NUMBER OF THOSE 1K BLOCKS ACTUALLY\r
+ ; USED SINCE THE DISK WAS LAST REFRESHED.\r
+>\r
+IFE FTSWAP,<\r
+ XWD 0,LOWSWP ;LOWSWP DOES DOUBLE DUMMY DUTY IN\r
+ ; NON-SWAPPING SYSTEM\r
+>\r
+ WRSTSZ=.-WRSTA9\r
+\r
+;ROUTINE TO READ IN THE FIXED BLOCK OF "VITAL STATISTICS" FROM\r
+; THE DISK AND DISTRUBUTE THEM TO THE APPROPRIATE CORE LOCATIONS.\r
+\r
+RDSTAT: MOVEI TAC,STATBK\r
+ PUSHJ PDP,WNZRD ;READ IN THE VITAL STATISTICS BLOCK.\r
+ JRST RDSTA2 ;ERROR\r
+ MOVE TAC,WNZBUF+^D126 ;CHECK THE IDENTIFIER TO VERIFY THAT\r
+ CAME TAC,[SIXBIT /STATBK/] ; THE CORRECT BLOCK WAS READ.\r
+ JRST RDSTA2 ;ERROR, STATISTICS BLOCK APPARENTLY WAS CLOBBERED.\r
+\r
+ MOVE TAC,[XWD -WRSTSZ,0] ;STORE AWAY THESE IMPORTANT PARAMETERS\r
+RDSTA1; MOVE TAC1,WNZBUF(TAC) ; UNDER CONTROL OF A TABLE IN THE "WRSTAT"\r
+ MOVEM TAC1,@WRSTA9(TAC) ; ROUTINE WHICH WRITES OUT THE VITAL\r
+ AOBJN TAC,RDSTA1 ; STATISTICS BLOCK ONTO THE DISK.\r
+\r
+ POPJ PDP, ;***SUBROUTINE EXIT***........\r
+\r
+RDSTA2: MOVEI TAC,RDTM1\r
+ ;PRINT ERROR MESSAGE IF THE VITAL\r
+ PUSHJ PDP,ICONM ; STATISTICS BLOCK CANNOT BE READ\r
+ PUSHJ PDP,OPOUT\r
+ PUSHJ PDP,REF ;GO THRU THE REFRESH DIALOGUE IN "ONCE".\r
+ JRST RDSTAT ;NOW TRY AGAIN.\r
+\r
+RDSTM1: ASCIZ /VITAL DISK STATISTICS LOST, SUGGEST REFRESHING!\r
+/\r
+\r
+;ROUTINE TO DETERMINE THE CURRENT SYSTEM'S DISK CAPACITY. I.E., THE NUMBER OF\r
+; DISKS ATTACHED TO THE RC-10 DISK SYNCHRONIZER TODAY.\r
+\r
+;ON EXIT FROM THIS SUBROUTINE\r
+; C(TAC) = HIGHEST LOGICAL DISK BLOCK NUMBER NOW EXTANT.\r
+\r
+CAPCTY: MOVEI TAC,NUMSAT\r
+ IMULI TAC,NUMBLK ;COMPUTE AND SAVE MAXIMUM POSSIBLE CAPACITY.\r
+ PUSH PDP,LBHIGH ;SAVE EXISTING VALUE OF HIGHEST LEGAL BLOCK NUMBER.\r
+ MOVEM TAC,LBHIGH ;TEMPORARILY CHANGE THIS VALYUE SO THAT THE VALIDITY\r
+ ; CHECK IN "DSKINT" WILL NOT FAIL SPURIOUSLY.\r
+\r
+ MOVEI TAC,3\r
+CPCT1; PUSH PDP,TAC\r
+ PUSHJ PDP,WNZRD ;ATTEMPT TO READ FIRST BLOK OF EACH SUCCESSIVE DISK.,\r
+ JRST CPCT3 ;ERROR\r
+ POP PDP,TAC\r
+ ADDI TAC,NUMBLK\r
+ CAMGE TAC,LBHIGH ;ALREADY TRIED ALL DISKS (MAXIMUM CAPACITY) ?\r
+ JRST CPCT1 ;NO, GO TRY THE NEXT ONE.\r
+\r
+CPCT2: SUBI TAC,1 \r
+ POP PDP,LBHIGH ;RESTORE PREVIOUSLY EXISTING VALUE OF THE HIGHEST\r
+ ; LEGAL LOGICAL DISK BLOCK NUMBER.\r
+ POPJ PDP, ;***SUBROUTINE EXIT***.......\r
+\r
+CPCT3: POP PDP,TAC\r
+ CONSZ DSK,NRDY ;NON-EXISTENT DISK?\r
+ JUMPN TAC,CPCT2 ;YES, THE LIMIT OF DISK STORAGE HAS BEEN FOUND.\r
+ ; HOWEVER, DISK 0 MUST ALWAYS BE PRESENT.\r
+\r
+ MOVEI TAC,CPCTM1 ;NO, SOME OTHER TYPE OF READ ERROR.\r
+ PUSHJ PDP,IOCONM \r
+ PUSHJ PDP,OPOUT ;PRINT ERROR MESSAGE\r
+ POP PDP,LBHIGH\r
+ JRST CAPCTY ;TRY AGAIN\r
+CPCTM1: ACSIZ /DISK READ ERROR DURING CAPACITY SEARCH INITIALIZATION\r
+/\r
+\r
+\r
+;ROUTINE TO ASSURE THAT THE STATUS OF THE WRITE-LOCK SWITCHES ON THE\r
+; DISK MAINTENANCE PANEL IS SUCH THAT THEY ARE PROTECTING "LESS THAN 0000".\r
+\r
+;THIS ROUTINE LOOPS PRINTING AN ERROR MESSAGE UNTIL THE SWITCHES ARE O.K.\r
+\r
+WRITLK: CONI DSK,TAC\r
+ TLNN TAC,13777 ;BOUNDARY ZERO AND MAINTENANCE-SEGMENT OFF ?\r
+ TLNN TAC,<PLGW>B53 ;YES, IS ROTARY SWITCH SET\r
+ ; TO EITHER X UNDER OR OVER(AS OPPOSED\r
+ ; TO UNDER OR X OVER)\r
+ JRST WRLK8 ;NO. GO PRINT ERROR MESSAGE AND LOOP.\r
+\r
+;AN UNFORTUNATE HARDWARE OVERSIGHT MAKES IT IMPOSSIBLE TO SENSE THE DIFFERENCE\r
+; BETWEEN "PROTECT LESS THAN" AND "PROTECT LESS THAN OR EQUAL". THEREFORE\r
+; THIS ROUTINE MUST ACTUALLY TRY WRITING ON TRACK 0000.\r
+ MOVE TAC,[252525252525]\r
+ MOVEM TAC,WNZBUF\r
+ MOVE TAC,[XWD WNZBUF,WNZBUF+1]\r
+\r
+ BLT TAC,WNZBUF+177\r
+ MOVEI TAC,0\r
+ PUSHJ PDP,WNZWR ;WRITE PATTERN IN BLOCK 0.\r
+ JRST WRLK2 ;ERROR\r
+ POPJ PDP, ;***GOOD EXIT FROM WRITLK SUBROUTINE***.........\r
+\r
+WRLK2: MOVEI TAC,WRLKM1\r
+ CONSZ DSK,WRPE ;WRITE-PROTECTION ERROR ?\r
+ ;YES, PROTECT SWITCH ERRONEOUSLY SET ON "LESS THAN\r
+ ; OR EQUAL" INSTEAD OF "LESS THAN".\r
+ ;NO, SOME OTHER FAILURE DURING THE WRITE OF BLOCK 0.\r
+WRLK8: MOVEI TAC,WRLKM2 ;WRITE-LOCK SWITCHES SET INCORRECTLY.\r
+WRLK9: PUSHJ PDP,ICONM ;PRINT ERROR MESSAGE\r
+ PUSHJ PDP,OPOUT\r
+ JRST WRITLK ;GO TRY AGAIN\r
+\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
+FIX THEM ! !\r
+/\r
+\r
+;DISK READING ROUTINE FOR USE ONLY DURING ONCE-ONLY CODE.\r
+; AVOIDS USING THE MONITOR OUFUFS AND INTERRUPT STRUCTURE.\r
+\r
+;ON ENTRY TO THIS SUBROUTINE, TAG CONTAINS THE LOGICAL BLOCK NUMBER OF THE DISK\r
+; BLOCK WHICH IS TO BE READ INTO THE ONCE-ONLY DISK BUFFER AREA.\r
+\r
+WNZRD: CONO DSK,DATERR!DEVERR!SETERR!RESETB ;CLEAR THE DISK SYNCHRONIZER\r
+ CONSZ DSK,BUSYBT!DONEFLG\r
+ JRST WNZRD ;DON'T PROCEED UNLESS THE CLEAR WORKED.\r
+\r
+ PUSH PDP,DSKFDG ;SAVE THIS INSTRUCTION FROM "DSKINT"\r
+ MOVE TAC1,[HRRZI TAC,0] ;NOW TAMPER WITH THAT SAVED LOCATION SO\r
+ MOVEM TAC1,DSKFDG ; THAT DSKINT WILL NOT ENABLE ANY INTERRUPT CHANNEL.\r
+ MOVE TAC1,[XWD -200,WNZBUF-1]\r
+ PUSHJ PDP,DFRED ;CALL DEVICE-DEPENDENT ROUTINE IN "DSKINT" DIRECTLY.\r
+WNZRDC: POP PDP,DSKFDG ;RESTORE THE MOLESTED INSTRUCTION IN DSKINT.\r
+ \r
+ PUSHJ PDP,WNZWAT ;WAIT UNTIL THE READ IS FINISHED.\r
+\r
+ CONSZ DSK,DATERR!DEVERR!SETERR ;ANY ERRORS ?\r
+ JRST WNZRDX ;YES, GIVE ERROR RETURN.\r
+ MOVE TAC1,RCXCCW ;NO, BUT CHECK THAT THE FINAL VALUE OF THE\r
+ CAMN TAC1,RCXFIX ; CHANNEL CONTROL WORD WAS AS EXCPECTED ALSO.\r
+ AOS (PDP) ;***GOOD RETURN***........\r
+WNZRDX: POPJ PDP, ;ERROR RETURN,\r
+\r
+\r
+;DISK WRITING ROUTINE FOR USE ONLY DURING ONCE-ONLY CODE.\r
+; AVOIDS USING THE MONITOR QUEUES AND INTERRUPT STRUCTURE.\r
+\r
+;ON ENTRY TO THIS SUBROUTINE, TAC CONTAINS THE LOGICAL BLOCK NUMBER OF THE DISK\r
+; BLOCK WHICH IS TO BE WRITTEN ONTO THE DISK FROM THE ONCE-ONLY DISK BUFFER AREA.\r
+\r
+WNZWR: CONO DSK,DATERR!DEVERR!SETERR!RESCIG ;CLEAR THE DISK SYNCHRONIZER.\r
+ CONSZ DSK,BUSYBT!DONEFLG\r
+ JRST WNZWR ;DON'T PROCEED UNLESS THAE CLEAR WORKED.\r
+\r
+ MOVEM TAC,LBSAVE ;SAVE LOGICAL BLOCK NUMBER IN CASE AN ERROR RETURN\r
+ ; MUST BE TAKEN FROM THE "REFRESH" SUBROUTINE.\r
+ PUSH POP,DSKFDG ;SAVE THIS ISNTRUCTION FROM "DSKINT".\r
+ MOVE TAC1,[HRRZI TAC,0] ;NOW TAMPER WITH THAT SAVED LOCATION SO\r
+ MOVEM TAC1,DSKFDG ; THAT DSKINT WILL NOT ENABLE ANY INTERRUPT CHANNEL.\r
+ MOVE TAC1,[XWD -200,WNZPUT-1]\r
+ PUSHJ PDP,DFWRT ;CALL DEVICE-DEPENDENT ROUTINE IN "DSKINT" DIRECTLY.\r
+\r
+ JRST WNZRDC ;THE REMAINDER OF THE WRITE ROUTINE IS IDENTICAL\r
+ ; TO THE READ ROUTINE\r
+\r
+;SUBROUTINE TO WATCH FOR THE DONE FLAG TO COME ON AND TIME OUT IF\r
+; IT DOESN'T COME UP SOON ENOUGH (SAY 5 SEC OR SO).\r
+\r
+WNZWAT: MOVE TAC,[^D1000000] ;AT MOST ONE MILLION TIMES THRU THE CONSZ-SOJG LOOP\r
+WNZWTL: CONSZ DSK,DONEFLG ;DONE FLAG ON YET ?\r
+ POPJ PDP, ;YES, GOOD EXIT.......\r
+ SOJG TAC,WNZWTL ;NO, TIMED OUT YET ?\r
+ ;YES, PRINT "DISK HUNG" ERROR MESSAGE.\r
+ MOVEI TAC,WATMSG\r
+ PUSHJ PDP,ICONM\r
+ PUSHJ PDP,OPOUT\r
+ POP PDP,TAC ;SKIP UP A SUBROUTINE LEVEL, AND GIVE AN\r
+ POPJ PDP, ; ERROR RETURN FROM WNZRD OR WNZWR.......\r
+WATMSG: ASCIZ /DISK HUNG.\r
+/\r
+\r
+;SUBROUTINE TO SET SPECIFIED BITS IN A SAT BLOCK WHILE FORMING IT IN WNZBUF\r
+\r
+;ENTRY CONDITIONS -- C(TAC) = FIRST BIT NUMBER TO SET (NUMBERED BEGINNING AT 0)\r
+; C(TAC1) = NUMBER OF BITS TO SET\r
+\r
+SETWNZ: MOVE AC1,TAC1\r
+ IDIVI TAC,^D36\r
+ MOVSI AC2,400000\r
+ MOVNS TAC1\r
+ ROT AC2,(TAC1)\r
+STWNZ1: ORM AC2,WNZBUF(TAC)\r
+ ROT AC2,-1\r
+ JUMPG AC2,STWNZ2\r
+ ADDI TAC,1\r
+STWNZ2: SOJN AC1,STWNZ1\r
+ POPJ PDP, ;SUBROUTINE EXIT...........\r
+\r
+;SUBROUTINE TO CLEAR THE ONCE-ONLY OUTPUT BUFFER, WNZBUF\r
+WNZCLR: SETZM WNZBUF\r
+ MOVE TAC,[XWD WNZBUF,WNZBUF+1]\r
+ BLT TAC,WNZBUF+177\r
+ POPJ PDP, ;SUBROUTINE EXIT...........\r
+\r
+;SUBROUTINE TO MASK THE TIME, DATE, AND DATA MODE (=14 FOR BINARY MODE0 INTO ACCUMU-\r
+; LATOR TAC IN THE FORMAT USED IN WORD 3 OF A DISK RETRIEVAL INFORMATION BLOCK.\r
+\r
+MDTMDT: PUSH PDP,TAC\r
+ MOVE TAC,TIME ;GET TIME IN JIFFIES.\r
+ IDIVI TAC,JIFMIN ;CONVERT TO MINUTES\r
+ LSH TAC,^D12\r
+ IOR TAC,THSDAT ;TODAY'S DATE\r
+ TLO TAC,14B<^D12*^D18> ;BINARY MODE\r
+ IORM TAC,(PDP)\r
+ POP PDP,TAC\r
+ POPJ PDP, ;SUBROUTINE EXIT............\r
+\r
+\r
+;ERROR EXIT FROM "REFRESH" WHEN A BAD WRITE ON THE DISK OCCURS DURING REFREHSING.\r
+\r
+REFER1: POP PDP,TAC ;CORRECT PDP IF EXTRA PUSH HAD OCCURRED.\r
+\r
+REFERR: MOVE TAC,LBSAVE ;GET BLOCK NUMBER FOR THE ERROR MESSAGE AT REF4.\r
+ POPJ PDP, ;THIS NO-SKIP RETURN RE-ENTERS THE REFRESH DIALOGUE.\r
+\r
+\r
+\r
+;MISCELLANEOUS STORAGE SPACE USED BY THE PDP-10 DISK REFRESHING ROUTINE.\r
+\r
+CHKSAV: 0\r
+LBSAVE: 0\r
+\r
+WNZBUF: BLOCK 200 ;BUFFER FOR READING AND WRITING DISK\r
+ ; BLOCKS DURING THE ONCE-ONLY CODE.\r
+\r
+LOWSWP: 0 ;LOWEST LOGICAL BLOCK FOR SWAPPING\r
+\r
+ > ;END OF REFRESH PROCEDURE FOR THE RD10 DISK.\r
+\r
+ > ;CLOSE AN EVEN EARLIER FTDISK CONDITIONAL.\r
+\r
+INTERNAL FTCHECK\r
+IFN FTCHEC,<\r
+\r
+EXTERNAL CHKREG,CHKEND,CHECK,MONPTR,MONSUM\r
+\r
+CK: MOVEI TAC,CHKBEG\r
+ SUBI TAC,CHKEND\r
+ HRLI TAC,CHKBEG\r
+ MOVSS TAC\r
+ PUSHJ PDP,CHECK ;COMPUTE AND STORE CHECKSUM OF THE PURE AREA OF \r
+ MOVEM TAC1,MONSUM ; THE TIME-SHARING MONITOR.\r
+ POPJ PDP,\r
+\r
+>\r
+\r
+ONCEND: END\r
+\f\r
--- /dev/null
+TITLE PATCH - PATCH AREA FOR T.S. MONITOR\r
+SUBTTL A. FRANZ/RAP TS3.19 6 SEP 68 V001\r
+\r
+;THIS PROGRAM SHOULD BE LOADED AFTER LAST NEEDED PROGRAM\r
+;BUT BEFORE SYSMAK,EXEC DDT,USER DDT AND ONCE\r
+\r
+ENTRY PATCH\r
+PATCH: BLOCK 300\r
+\r
+;SET JOBDDT NON-ZERO SO SYMBOLS WILL BE SAVED.\r
+\r
+ZZ=.\r
+LOC 74\r
+ EXP 141\r
+RELOC ZZ\r
+\r
+ END\r
+\f\r
--- /dev/null
+TITLE PLTSER - PLOTTER SERVICE ROUTINE\r
+SUBTTL T. EGGERS/GBH/TNM 20 MAY 1969 V012\r
+XP VPLTSR,012 ;PUT VERSION NUMBER IN STORAGE MAP AND GLOB LISTING\r
+\r
+PLT=140 ;DEFINE DEVICE CODE\r
+PLTUP=200000 ;LIFT PEN WHEN OUTPUT FINISHED\r
+\r
+ENTRY PLTSER\r
+PLTSER:\r
+\r
+;PLOTTER DEVICE DATA BLOCK\r
+PLTDDB: SIXBIT /PLT/\r
+PLTCHR: XWD HUNGST*12,^D36 ;XWD (HUNG TIMEOUT),(BUFFER SIZE)\r
+PLTIOS: 0\r
+ PLTDSP ;DISPATCH TABLE ADDRESS\r
+ XWD DVOUT,14403 ;XWD (OUTPUT DEVICE),(BIN,IMAGE,TEXT LEGAL)\r
+ 0\r
+ 0\r
+PLTPTR: 0 ;OUTPUT BYTE POINTER\r
+PLTADR: XWD PROG,0\r
+PLTCTR: 0 ;OUTPUT BYTE COUNTER\r
+\r
+EXTERNAL OUT,SETACT,PLTCHN,PLTCHL,IOSET,ADVBFE,ADRERR,CPOPJ1\r
+EXTERNAL SETIOD,STOIOS,CLRACT,IULLINP,PLTSAV,IADRCK\r
+\r
+INTERN PLTDDB,PLTINT,PLTDSP\r
+\f;DISPATCH TABLE\r
+\r
+ JRST PLTINT ;INITIALIZE\r
+ JRST PLTHNG ;HUNG DEVICE ERROR\r
+PLTDSP: JRST PLTREL ;RELEASE\r
+ JRST PLTCLS ;CLOSE\r
+ JRST PLTOUT ;OUTPUT\r
+ JRST ILLINP ;INPUT\r
+\r
+PLTCLS: TLO IOS,PLTUP ;PLOTTER END FLAG SET\r
+ MOVEM IOS,PLTIOS\r
+ JRST OUT ;DO AN OUTPUT\r
+\r
+PLTINI:\r
+PLTHNG:\r
+PLTREL: CONO PLT,0 ;DEASSIGN PI CHANNEL, CLEAR DONE\r
+ HLLZS PLTINT ;REMOVE PLOTTER FROM DEVICE CHAIN\r
+ POPJ PDP,\r
+\r
+\f;HERE BEGINS THE "OUTPUT" UUO\r
+\r
+PLTOUT: PUSHJ PDP,PLTSET ;SETUP BYTE POINTER AND COUNTER\r
+ JRST ADRERR ;ADDRESS ERR RETURN FROM PLTSET\r
+ PUSHJ PDP,SETACT ;SET DEVICE ACTIVE BIT\r
+ TLO IOS,IO\r
+ CONO PLT,PLTCHN ;ASSIGN PRIORITY CHANNEL\r
+ MOVSI TAC,10\r
+ HLRM TAC,PLTINT ;PUT PLOTTER INTO DEVICE CHAIN\r
+ TLZN IOS,IOBEG ;FIRST OUTPUT UUO?\r
+ JRST .+3 ;NO\r
+ MOVEI TAC,40 ;YES, START PLOTTER WITH PEN UP\r
+ TLZ IOS,PLTUP ;INIT "CLOSE" BIT\r
+ MOVE IOS,PLTIOS\r
+ DATAO PLT,TAC ;START PLOTTER BY SENDING 0 OR 40\r
+ POPJ PDP,\r
+\f;FROM HERE THROUGH PLTOFF IS INTERRUPT SERVICE\r
+\r
+PLTINT: CONSO PLT,10 ;PLOTTER DONE FLAG SET?\r
+ JRST .-1 ;NO, CHAIN TO NEXT DEVICE\r
+ SOSGE PLTCTR ;OUTPUT CHARACTERS LEFT?\r
+ JRST PLT1 ;NO\r
+ MOVEM TAC,TACSAV# ;YES, SAVE TAC\r
+ ILDB TAC,PLTPTR ;GET NEXT CHARACTER\r
+ DATAO PLT,TAC ;SEND CHARACTER\r
+ MOVE TAC,TACSAV# ;RESTORE TAC\r
+ JEN @PLTCHL ;DISMISS INTERRUPT\r
+\r
+PLT1: JSR PLTSAV ;SAVE AC'S. SET UP PUSH DOWN POINTER\r
+ MOVEI DEVDAT,PLTDDB\r
+ PUSHJ PDP,IOSET ;SETS UP PROG AND IOS\r
+ PUSHJ PDP,ADVBFE ;ADVANCE AND LOOK AT NEXT BUFFERE\r
+ JRST PLTOFF ;NO MORE DATA AVAILABLE\r
+ PUSHJ PDP,PLTSET ;SETUP BYTE POINTER AND COUNTER\r
+ JRST PLTOFF ;ADDRESS ERROR RET FROM PLTSET\r
+PLT2: TLZE IOS,IOW\r
+ PUSHJ PDP,SETIUOD ;LET JOB START AGAIN\r
+ JRST STOIOS ;EVENTUALLY DISMISS INTERRUPT. IF ADVBFE\r
+ ;FOUND MORE DATA (IT SKIPPED), ANOTHER\r
+ ;INTERRUPT WILL IMMEDIATELY OCCUR BUT\r
+ ;IT WILL BE HANDLED WITHOUT GOING TO PLT1\r
+\r
+PLTOFF: CONO PLT,0 ;SHUT DOWN PLOTTER\r
+ HLLSZ PLTINT ;REMOVE PLOTTER FROM CHAIN\r
+ PUSHJ PDP,CLRACT\r
+ TLZE IOS,PLTUP ;HAS THE "CLOSE" BEEN DONE?\r
+ DATAO PLT,[40] ;YES, LIFT PEN\r
+ JRST PLT2\r
+\f;THIS SUBROUTINE CALCULATES A BYTE POINTER AND A BYTE COUNTER FOR\r
+;THE BUFFER TO BE OUPUT, THE LAST WORD OF BUFFER IS ADR CHECKED TO BE IN USER AREA\r
+; PUSHJ PDP,PLTSET\r
+; RETURN 1 ;ADDRESS ERROR RETURN\r
+; RETURN 2 ;GOOD RETURN\r
+\r
+PLTSET: MOVEI TAC,@PLTADR ;GET ADDRESS OF CURRENT BUFFER\r
+ ADD TAC,[POINT 6,1,35] ;CONVERT TO 6 BIT BYTE POINTER WITH\r
+ ;ADDRESS OF BUFFER WORD COUNT\r
+ TRNN IOS,16 ;IS THIS A TEST DATA MODE?\r
+ TLO TAC,[POINT 7,0,35] ;YES, CONVERT TO 7 BIT BYTE POINTER\r
+ MOVEM TAC,PLTPTR ;SAVE BYTE POINTER\r
+ HRRZ TAC,@TAC ;GET BUFFER WORD COUNT\r
+ MOVEM TAC,PLTCTR ;SAVE AS POSITIVE WORD COUNT\r
+ ADD TAC,PLTADR ;CALCULATE (LAST ADR IN BUF)-1 (RELATIVE)\r
+ MOVEI TAC,1(TAC) ;GET LAST ADR IN BUF (RELATIVE)\r
+ PUSHJ PDP,IADRCK ;ADDRESS CHECK. OK?\r
+ POPJ PDP, ;NO, OUTSIDE. RETURN WITH NO SKIP\r
+ MOVEI TAC,6 ;IMAGE OR BIN MODES - 6 BYTES/WORD\r
+ TRNN IOS,16 ;IS OUTPUT A TEXT MODE (0 OR 1)?\r
+ MOVEI TAC,5 ;YES, 5 BYTES/WORD\r
+ IMULM TAC,PLTCTR ;CHANGE WORD COUNT TO BYTE COUNT\r
+ JRST CPOPJ1 ;RETURN WITH A SKIP\r
+\r
+ LIT\r
+ VAR\r
+PLTEND: END\r
--- /dev/null
+TITLE PTPSER - PAPER TAPE PUNCH SERVICE ROUTINE\r
+SUBTTL /RCC TS 15 APR 69 V401 (FROM 002)\r
+XP VPTPSR,401\r
+ ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+EXTERNAL PTPCHN, PTPSAV, ADVBFE, ITMCT1, SETIOD, SETBYT, IOSET, CKS12\r
+EXTERNAL ILLINP, OUT, WAIT1,PTPCHL,PIOMOD\r
+EXTERNAL SETACTSTOIOS\r
+INTERNAL PTPINI,PTPDSP\r
+\r
+;PTP DEVICE DATA BLOCK LINKAGE\r
+\r
+ENTRY PTPSER\r
+\r
+PTPSER:\r
+\f, PARAMETER ASSIGMENTS\r
+\r
+, PTP CONTROL REGISTER\r
+ PTPDON=10\r
+\r
+, FORMAT CONTROL\r
+ PDPFDN=200\r
+\r
+, SPECIAL IO STATUS WORD ASSIGNMENTS\r
+ IODISC=400000\r
+ PTPFED=200000\r
+ PTPEOL=20000\r
+ PTPBIN=4000 ;CHECKSUM BINARY\r
+ PTPIB=2000 ;IMAGE BINARY\r
+\r
+; SPECIAL ASCII CHARACTERS\r
+; DEFINED WITH THE CORRECT PARITY\r
+ RUBOUT=377\r
+ HORTAB=11\r
+ VERTAB=213\r
+ FORMED=14\r
+\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL PTPDDB,PTPIOS,PTPPTR,PTPADR,PTPCTR,PTPCNT,PTPCHA,PTPSIO,PTPCON\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+;PTP DEVICE DATA BLOCK\r
+\r
+ INTERN PTPDDB\r
+PTPDDB:\r
+ SIXBIT /PTP/\r
+ XWD ^D10*HUNGST,41\r
+PTPIOS: 0\r
+ EXP PTPDSP\r
+ XWD DVPTP+DVOUT,14403\r
+ 0\r
+ 0\r
+PTPPTR: 0\r
+PTPADR: XWD PROG,0\r
+PTPCTR: 0\r
+PTPCNT: 0\r
+PTPCHA: 0\r
+PTPSIO: 0\r
+PTPCON: 0\r
+>\r
+\f,PTP SERVICE DISPATCH TABLE\r
+ JRST PTPINI ;INITILIZE\r
+ JRST PTPREL ;HUNG DEVICE TIME-OUT ERROR,\r
+PTPDSP: JRST PTPREL ;RELEASE\r
+ JRST PTPCLS ;CLOSE\r
+ JRST PTPOUT ;OUTPUT\r
+ JRST ILLINP ;INPUT\r
+\fPTPINI:\r
+PTPREL: CONO PTP,0\r
+ HLLZS PTPCON ;CLEAR CONSO FLAGS BITS\r
+ POPJ PDP, ;RETURN\r
+\r
+\r
+PTPCLS: PUSHJ PDP,OUT ;OUTPUT REMAINING BUFFERS\r
+ PUSHJ PDP,WAIT1 ;WAIT FOR IOACT=0.\r
+ MOVE IOS,PTPIOS ;C(IOS):=C(PTPIOS)\r
+ TLO IOS,IODISC+PTPFED+IOW ;IODISC:=IOW:=PTPFED:=1\r
+ PUSHJ PDP,SETACT ;SET ACTIVE FLAG,STORE IOS,AND\r
+ ;RESET HUNG DEVICE TIMEOUT COUNT\r
+ MOVEI TAC,200\r
+ MOVEM TAC,PTRCNT ;PTPCNT:=200\r
+ MOVEI TAC,PTPDON ;SET CONSO FLAG\r
+ HRRM TAC,PTPCON\r
+ MOVEI TAC,PTPCHN ;TAC:=PTPCHN,PI CHANNEL ASSIGNMENT\r
+ CONO PTP,PTPDON(TAC) ;DONE FLAG:=1, ASSIGN PI CHANNEL\r
+ JRST WAIT1 ;WAIT FOR IOACT=0, ALL BUFFERS FINISHED\r
+\fPTPOUT: TLZE IOS,IOBEG ;VIRGIN DEVICE?> (IOBEG:=0)\r
+ JRST PTPIN0 ;YES\r
+\r
+PTPIN1: \r
+ TLZ IOS,IODISC ;CLEAR DISCONNECT BIT\r
+ PUSHJ PDP,SETACT ;SET ACTIVE FLAG,STORE IOS, AND\r
+ ;RESET HUNG DEVICE TIMEOUT COUNT\r
+ HRLI TAC,PTPDON ;CONSO FLAG\r
+ HRRI TAC,PTPCHN ;CONO FLAGS\r
+ TRO TAC,PTPDON\r
+ STARTDV PTP\r
+ POPJ PDP, ;RETURN\r
+\r
+PTPIN2: LDB TAC,PIOMOD\r
+\r
+ TLO IOS, IOFST+PTPFED+IO ;IOFST:=PTPFED:=IO:=1\r
+ TLZ IOS,PTPBIN+PTPIB ;CLEAR BINARY AND IMAGE BINARY BITS\r
+ CAIN TAC,IB ;IMAGE BINARY\r
+ TLO IOS,PTPIB ;YES\r
+ CAIN TAC,B ;MODE=BINARY?\r
+ TLO IOS,PTPBIN ;YES, PTPBIN:=1\r
+ MOVEI TAC,PTPFDN ;PTPCNT:=PTPFDN\r
+ MOVEM TAC,PTPCNT\r
+ PUSHJ PDP,SETBYT ;SETBYT\r
+ HLLM TAC,PTPPTR ;PTPPTR0-5:=PTPPTR12-13:=0,PTPPTR6-11:=BYTE\r
+ ;SIZE; PTPPTR14-17:=PROG\r
+ JRST PTPIN1\r
+\f,PUNCH INTERRUPT SERVICE\r
+\r
+PTPINT: CONSO PTP,@PTPCON\r
+ JRST PTPINT\r
+ MOVEM IOS,PTPSIO ;PTPSIO:=C(IOS) SAVE IOS\r
+ MOVE IOS,PTPIOS ;IOS:=C(PTPIOS)\r
+ TLNE IOS,PTPFED ;FEED REQUEST> (PTPFED=1?)\r
+ JRST PTPS2 ;YES\r
+ MOVE IOS,PTPSIO ;RESTORE IUOS\r
+ JSR PTPSAV ;SAVE ACS AND ESTABLISH PDP\r
+ MOVEI DEVDAT,PTPDDB\r
+ PUSHJ PDP,IOSET ;PROG:=(JBTADR 18-35),ITEM:=C(DEVCTR)\r
+ ;IOS:=C(PTRIOS)\r
+ TLZE IOS,IODISC ;DISCONNECT? (IODISC=1?)\r
+ JRST PTPADV ;YES\r
+ TLZE IOS,IOFST ;IOFST=1? IOFST:=0\r
+ JRST PTP9 ;YES\r
+ TLNN IOS,PTPBIN+PTPIB ;BINARY PUNCH MOD?\r
+ JRST PTP3 ;NO\r
+\r
+ MOVE TAC,PTPCHA ;BINARY OUTPUT BYTE SIZE=36\r
+ ROT TAC,6\r
+ MOVEM TAC,PTPCHA\r
+ ANDI TAC,77 ;TAC:=XX, SIXBIT SUB-BYTE\r
+ ADDI TAC,200\r
+ DATAO PTP,TAC ;PUNCH 2XX\r
+ SOSL PTPCNT ;C(PTPCNT):=C(PTPCNT)-1, WORD DONE?\r
+ JRST PTPXIT ;NO\r
+ SOSL PTPCTR ;C(PTPCTR):=C(PTPCTR)-1, ITEM COUNT < 0?\r
+ JRST PTPB1 ;NO\r
+ TLNE IOS,PTPIB ;IMAGE BINARY?\r
+ TLOA IOS,IODISC ;YES, SUPPRESS TAPE FEED.\r
+ TLO IOS,IODISC+PTPFED ;IODISC:=PTPFED:=1\r
+ MOVEI TAC,10\r
+ MOVEM TAC,PTPCNT ;PTPCNT:=10\r
+ JRST PTPXIT\r
+\r
+PTPB1: MOVEI TAC,5 ;PTPCNT:=5\r
+ MOVEM TAC,PTPCNT\r
+ MOVE DAT,@PTPPTR ;PTPCHA:=OUTPUT DATA WORD\r
+ AOS PTPPTR ;PTRPTR:=C(PTRPTR)+1. ADVANCE ITEM POINTER.\r
+ MOVEM DAT,PTRCHA\r
+ JRST PTPXIT\r
+\fPTP3: DATA PTP,PTPCHA ;PUNCH CHARACTER\r
+ TRNE IOS,14 ;IS MODE AN ALPHA MODE\r
+ JRST PTP1 ;NO\r
+ MOVE DAT,PTPCHA\r
+ CAIE DAT,HORTAB ;HORIZONTAL OR VERTICAL TAB?\r
+ CAIN DAT,VERTAB\r
+ JRST PTPP1 ;YES\r
+ CAIE DAT,FORMFD ;FORM FEED?\r
+ JRST PTP1 ;NO\r
+ TLO IOS,PTPFED+PTPEOL ;PTPFED:=PTPEOL:=1\r
+ MOVEI DAT,20\r
+ MOVEM DAT,PTPCNT ;PTPCNT:=20\r
+ JRST PTPXIT\r
+\f EXTERNAL PEVEN8 ;IN IOCSS, FOR PARITY IN ASCII\r
+\r
+PTP1: SOSGE PTPCTR ;C(PTPCTR):=C(PTPCTR)-1, IS C(PTPCTR)<0?\r
+ JRST PTP5 ;YES\r
+ ILDB TEM,PTPPTR ;TEM:=OUTPUT ITEM\r
+ LDB TAC,PIOMOD\r
+ CAIN TAC,I ;MODE=IMAGE?\r
+ JRST PTP6 ;YES\r
+ IORI TEM,200 ;NO, INSERT EIGHTH HOLD\r
+ TRNN TAC,14 ;AN ASCII MODE?\r
+ PUSHJ PDP,PEVEN8 ;YES, TURN EIGHTH HOLE OFF IF\r
+ ; APPROPRIATE TO GET EVEN PARITY\r
+ JUMPE TEM,PTP1 ;IF AN ASCII NULL, IGNORE IT\r
+ ; THEY ARE PUT IN BY PTPFED STUFF\r
+ ; ELSE FALL INTO PTP6\r
+\r
+PTP6: MOVEM TEM,PTPCHA ;PTPCHA:=OUTPUT ITEM\r
+ JRST PTPXIT\r
+\r
+PTPS2: CLEARM PTPCHA ;PUNCH FEED\r
+ DATAO PTP,PTPCHA\r
+ SOSG PTPCNT ;COUNT FEED LINES\r
+ TLZ IOS,PTPFED ;PTPFED:=0\r
+ MOVEM IOS, PTPIOS ;PTPIOS:=C(IOS)\r
+ MOVE IOS,PTPSIO ;RESTORE IOS\r
+ JEN @PTPCHL ;DISMISS\r
+\r
+\r
+PTP5: TLO IOS,IODISC ;IODISC:=1\r
+ JRST PTPXIT\r
+\r
+PTPBN: HRRZ TAC1,PTPADR ;TAC1:=BUFFER ADDRESS\r
+ PUSHJ PDP,CKS12 ;TAC:=CALCULATE CHECKSUM\r
+ ADD TAC1, PTPADR\r
+ HLLM TAC,@TAC1 ;STORE CHECKSUM IN LEFT HALF OF FIRST BUFFER WORD,\r
+\r
+ JRST PTPB1\r
+\fPTPADV: PUSHJ PDP,ADVBFE ;ADVANCE BUFFER\r
+ JRST PTPDSC ;EXIT1. NEXT BUFFER EMPTY\r
+ TLZE IOS,IOW ;IN A WAIT? IOW:=0\r
+ PUSHJ PDP,SETIOD ;YES. IOWS:=1\r
+PTP9: TLZ IOS,IOFST ;IOFST:=0\r
+ MOVE TAC,PTPADR\r
+ AOS TAC\r
+ HRRM TAC,PTPPTR ;PTPTR18-35:=C(PTPADR18-35)+1\r
+ HRRZ ITEM,@TAC ;ITEM:=WORD COUNT\r
+ LDB TAC1,PTP91 ;PICK UP BYTE SIZE\r
+ PUSHJ PDP,ITMCT1 ;ITEM:=WORD COUNT*[36/BYTE SIZE]\r
+ MOVEM ITEM,PTPCTR ;PTPCTR:=C(ITEM)\r
+ JUMPE ITEM,PTPADV ;IS ITEM COUNT=0?\r
+ TLNE IOS,PTPBIN ;BINARY PUNCH MODE?\r
+ JRST PTPBN ;YES\r
+ TLNN IOS,PTPIB ;IMAGE BINARY?\r
+ JRST PTP1\r
+ AOS PTPPTR ;YES\r
+\r
+ SOS PTPCTR\r
+ JRST PTPB1\r
+\r
+PTP91: POINT 6,PTRPTR,11\r
+\r
+PTRP1: MOVEI DAT,RUBOUT ;PTPCHA:=RUBOUT\r
+ MOVEM DAT,PTPCHA \r
+ TLO IOS,PTPEOL ;PTPEOL:=1\r
+ JRST PTPXIT\r
+\r
+PTPDSC: PUSHJ PDP,PTPREL ;CLEAR PTP CONTROL REG AND CONSO BITS\r
+ TRZ IOS,IOACT ;IOACT:=0\r
+ TLO IOS,IOFST ;IOFST:=1\r
+ TLZE IOS,IOW ;IN A WAIT? IOW:=0\r
+ PUSHJ PDP,SETIOD ;YES. IOWS:=1\r
+\r
+PTPXIT: JRST STOIOS ;STORE IOS, RESET HUNG TIMEOUT COUNT AND\r
+ ;DISMISS INTERRUPT\r
+\r
+END\r
+\f\r
--- /dev/null
+TITLE PTRSER - PAPER TAPE READER SERVICE ROUTINE FOR BOTH PDP-6 AND PDP-10\r
+SUBTTL /GBH/TNM TS 14 APR 69 V004\r
+XP VPTRSR,004\r
+ ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+EXTERNAL STOSQD,ILLOUT\r
+EXTERNAL STODAT, IOSET, SETBYT, ADVBFF\r
+EXTERNAL SETIOD, PTRSAV, PTRCHN,PIOMOD\r
+EXTERNAL SETACT,STOIOS,CPOPJ1,PTRMSK\r
+INTERNAL PTRINT,PRTDSP\r
+\r
+;PTR DEVICE DATA BLOCK LINKAGE\r
+\r
+ENTRY PTRSER\r
+PTRSER:\r
+\f,PARAMETER ASSIGNMENTS\r
+, PTR CONTROL REGISTER\r
+ PTRDON=10 ;DONE FLAG\r
+ PTRBSY=20 ;BUSY FLAG\r
+ PTRBIN=40 ;BINARY READ MODE\r
+ POW=400 ;POWER, ON=1\r
+\r
+, SPECIAL IO STATUS WORD ASSIGNMENTS\r
+ IODISC=400000\r
+ PTRFCI=200000\r
+ PTRPOW=100000\r
+, SPECIAL ASCII CHARACTERS\r
+ RUBOUT=177\r
+\r
+\r
+INTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL PTRDDB,PTRIOS,PTRADR,PTRPTR,PTRCTR,PTRSVC,PTRSV1,PTRCON\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+;PTR DEVICE DATA BLOCK\r
+ INTERN PTRDDB\r
+\r
+PTRDDB:\r
+PTRDAT: SIXBIT /PTR/\r
+ XWD ^D30*HUNGST,41\r
+PTRIOS: 0\r
+ EXP PTRDSP\r
+ XWD DVPTR+DVIN,14403\r
+ 0\r
+ 0\r
+PTRADR: XWD PROG,0\r
+PTRPTR: 0\r
+PTRCTR: 0\r
+PTRSVC: 0\r
+PTRSV1: 0\r
+PTRCON: 0\r
+>\r
+\f,PTR SERVICE DISPATCH TABLE\r
+ JRST PTRINI ;INITILIZE\r
+ JRST PTRREL ;HUNG DEVICE TIME-OUT ERROR.\r
+PTRDSP: JRST PTRREL ;RELEASE\r
+ POPJ PDP, ;CLOSE\r
+ JRST ILLOUT ;OUTPUT\r
+\f TLNN IOS,IOBEG ;INPUT, VIRGIN DEVICE?\r
+ JRST PTRIN1 ;NO\r
+ TLO IOS,IOFST ;IOFST:=1. NEXT ITEM WILL BE FIRST ITEM OF A BUFFER\r
+ TLZ IOS,PTRPOW+PTRFCI+IODISC\r
+ PUSHJ PDP,SETBYT ;TAC0-5:=TAC12-13:=0,TAC6-11:=BYTE SIZE\r
+ ;TAC14-17:=PROG\r
+ MOVEM TAC,PTRPTR ;PTRPTR:=C(TAC)\r
+ CONSZ PTR,POW ;IS POWER ON?>\r
+ TLO IOS,PTRPOW LYES. PTRPOW:=1\r
+PTRIN1:\r
+ MOVEI TAC1,PTRBSY\r
+ TLZN IOS,IOBEG ;VIRGIN?\r
+ MOVEI TAC1,PTRDON ;NO\r
+\r
+ TLNN IOS,PTRPOW\r
+ ANDI TAC1,PTRMSK ;PTRMSK IUS DEFINED IN BUILD AS -1 PDP-6 AND 0 PDP-10\r
+ PUSHJ PDP,SETACT ;IOACT:=1\r
+ MOVEI TAC,PTRCHN(TAC1)\r
+ LDB TAC1,PIOMOD\r
+ CAIE TAC1,1B ;IMAGE BINARY?\r
+ CAIN TAC1,B ;OR BINARY\r
+ IORI TAC,PTRBIN\r
+ HRLI TAC,PTRDON\r
+ STARTDV PTR\r
+ POPJ PDP,\r
+\fPTRINT: CONSO PTR,@PTRCON\r
+ JRST PTRINT\r
+ SKIPL PTRIOS ;DISCONNECT REQUEST? (IODISC=1?)\r
+ DATAI PTR,PTRSV1 ;PTRSV1:=DATA ITEM.\r
+ JSR PTRSAV ;SAVE ACCUMULATORS AND ESTABLISH PDP\r
+ MOVEI DEVDAT,PTRDDB ;SET UP DEVDAT\r
+ PUSHJ PDP,IOSET ;PROG:=C(JBTADR18-35),ITEM:=C(DEVCTR)\r
+ ;IOS=C(PTRIOS)\r
+ MOVE DAT,PTRSV1 ;DAT:=DATA ITEM\r
+ CONSO PTR,POW ;PTR POWER ON?\r
+ JRST PTREND ;NO\r
+ TLON IOS,PTRPOW ;PTRPOW=1? PTRPOW:=1\r
+ JRST PTREX1 ;NO\r
+ TLZE IOS,IODISC ;DISCONNECT REQUEST?\r
+ TLZE IOS,PTRFCI ;IS PTRFCI=1?\r
+ MOVE DAT,PTRSVC ;YES. DAT:=C(PTRSVC)\r
+PTRIN0: TRNE IOS,B ;MODE=BINARY?\r
+ JRST PTRI0 ;YES\r
+ ANDI DAT,177 ;MASK OUT PARITY BIT\r
+ CAIN DAT,RUBOUT ;LAST CHAR A RUBOUT?\r
+ JRST PTREX1 ;YES\r
+ JUMPE DAT,PTREX1 ;DAT=0?\r
+\r
+PTRIO: PUSHJ PDP,STODAT ;NO STORE DATA WORD.\r
+ JFCL ;CHECKSUM ERROR\r
+ JRST PTRI1 ;BLOCK FULL OR BLOCK COMPLETE\r
+ JRST PTREX1 ;DATA STORED CORRECTLY.\r
+\r
+PTRI1: PUSHJ PDP,ADVBFF ;ADVANCE BUFFER\r
+ TLO IOS,IODISC ;NEXT BUFFER IS FULL. IODISC:=1\r
+PTRI2: TLO IOS,IOFST ;IOFST:=1, NEXT ITEM IS FIRST ITEM OF A BUFFER.\r
+ TLZE IOS,IOW ;IN A WAIT? IOW:=0\r
+ PUSHJ PDP,SETIOD ;IOWS:=1\r
+ JRST PTREX1\r
+\f,COME HERE WHEN THE READER IS SHUT OFF\r
+\r
+PTREND: TDZ IOS,[XWD PTRPOW,IOACT] ;PTRPWO:=0,IOACT:=0\r
+ PUSHJ PDP,PTRREL ;CLEAR PTR AND CONSO FLAG\r
+ LDB TAC,IOMOD\r
+ TLO IOS,IOEND+IOREG\r
+ CAIE TAC,B ;CHECKSUM BINARY BLOCK ..OF?\r
+ JRST PTREI ;NO\r
+ TLNN IOS,IOEST ;IOEST=1?\r
+ TRO IOS,IOIMPM ;NO. BINARY BLOCK INCOMPLETE.\r
+ JRST PTRI2\r
+PTREI: PUSHJ PDP,STOSQD ;FINISH THE BUFFERE, STORE WORD COUNT\r
+ JFCL\r
+ PUSHJ PDP,ADVBFF ;ADVANCE BUFFERE\r
+ JFCL\r
+ JRST PTRI2\r
+\f,DISCONNECT PTR\r
+PTREX: SKIPG @PTRADR ;IOUSE=1?\r
+ JRST PTREX0 ;YES.\r
+ DATAI PTR,DAT\r
+ JRST PTRIN0\r
+\r
+PTREX0: DATAI PTR,PTRSVC ;SAVE LAST DATA WORD FROM PTR\r
+ TLZE IOS,IOW ;JOB IN AN IO WAIT FOR PTR?\r
+ PUSHJ PDP,SETIOD ;YES, WAKE UP JOB\r
+ PUSHJ PDP,PTRREL ;CLEAR PTR AND CONSO FLAG\r
+ TLO IOS,PTRFCI ;PTRFCI:=1\r
+ TRZ IOS,IOACT ;IOACT:=0\r
+\r
+PTREX1: MOVEM ITEM,PTRCTR ;PTRCTR:=C(ITEM)\r
+ JRST STOIOS ;STORE IOS,RESET HUNG DEVICE\r
+ ;TIMEOUT COUNT AND DISMISS\r
+\r
+PTRINI:\r
+PTRREL: CONO PTR,0 ;CLEAR PTR CONTROL\r
+ HLLZS PTRCON ;CLEAR CONSO FLAG\r
+ POPJ PDP,\r
+\r
+ END\r
+\f\r
--- /dev/null
+TITLE PTYSRF - FULL DUPLEX PSEUDO TELETYPE SERVICE ROUTINES\r
+SUBTTL M. FREDRIKSEN/RCC TS 06 DEC 68 V006\r
+XP VPTYSF,006\r
+ ;PUT VERSION NUMBER IN GLOB LISTINGS AND LOADER STORAGE MAP\r
+\r
+ENTRY PTYSRF ;DUMMY GLOBAL FOR FULL DUPLEX PTY\r
+PTYSRF:\r
+\r
+\r
+\r
+;ACCUMULATOR ASSIGNMENTS\r
+\r
+ DDB=DEVDAT\r
+ LINE=TAC1\r
+\r
+ CHREC=TEM\r
+ PIOS=13\r
+ PDDB=14\r
+\r
+;FOLLOWING BITS, AND LINE AND CHREC ASSIGMENTS\r
+; MUST AGREE WITH THOSE IN SCNSRF\r
+\r
+ BREAKB=20000\r
+ FCSBRK=4000\r
+ TOIP=400000 ;SIGN OF TTYPTR IN TTY DDB\r
+ SYNC=20000 ;BREAK CHARACTER SEEN---FROM SCNSER\r
+\r
+;PTY DEVICE DEPENDENT IO STATUS BITS (RH DEVIOS)\r
+\r
+IOPTW=4000 ;OUTPUT WAIT (OBJ. JOB HAS DONE INPUT)\r
+IOPTRE=2000 ;PTY RESPONSE IS READY\r
+MONMOD=1000 ;PTY IS IN MONITOR MODE\r
+\r
+INTERNAL FTTTYSER\r
+\r
+FTTTYSER=-1 ;FORCE MULT DEF GLOBAL IF WRONG APRSER\r
+\fINTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL PTYDDB,PIOSAV,PTYSAC,PTYDNB,PTYBM1,PTYDDS,PIOSAV,PDDSAV\r
+EXTERNAL PTYSAV,PTYSA2,PTYRET,PACSAV\r
+INTERNAL PTYSA0,PTYRE0,ACSAV0\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+;PSEUDO CONSOLE DEVICE DATA BLOCK\r
+;REMAINING PTY DDB'S ARE GENERATED\r
+;OUT OF LINE AT BUILD TIME\r
+ INTERN PTYDDB\r
+ ZZ=.\r
+PTYDDB: SIXBIT /PTY0/\r
+ XWD 0,10000+STTYBF+1 ;PTY0 IS UNIT 1,PTY1 IS UNIT 2, ETC.\r
+ Z\r
+ EXP PTYDSP\r
+ Z\r
+ Z\r
+ XWD PROG,0\r
+ XWD PROG,0\r
+ Z\r
+ XP PTYDDS,.-ZZ ;SIZE OF PTY DDB\r
+>\r
+\fINTERNAL PTYDSP\r
+EXTERNAL OUT\r
+ POPJ PDP, ;INITIALIZE\r
+ POPJ PDP, ;PRINT ERROR, STOP JOB\r
+PTYDSP: JRST PTYREL\r
+ JRST OUT\r
+ JRST PTYOUT\r
+ JRST PTYIN\r
+\r
+EXTERNAL PTYTAB,TCONLN,TTYTAB,TTYKIL,PUNIT\r
+\r
+PTYREL: LDB LINE,PUNIT\r
+ ADDI LINE,TCONLN\r
+ SKIPN TTYTAB(LINE)\r
+ POPJ PDP,\r
+ PUSH PDP,DDB\r
+ HRRZ DDB,TTYTAB(LINE)\r
+ PUSHJ PDP,TTYKIL\r
+ POP PDP,DDB\r
+\r
+ LDB LINE,PUNIT\r
+ SETZM PTYTAB(LINE)\r
+ POPJ PDP,\r
+\f;PTY OUTPUT\r
+;IF NO TTYTAB ENTRY EXISTS FOR THIS PTY, ONE IS CREATED\r
+;IF A TTY DATA BLOCK IS AVAILABLE. IF NONE IS AVAILABLE,\r
+;IODERR IS SET IN PTY STATUS AND OUTPUT IS TERMINATED.\r
+\r
+;IF A TTY DEVICE DATA BLOCK IS AVAILABLE, CHARACTERS ARE\r
+;PLACED IN THE TTY INPUT BUFFER, THE PTY OUTPUT BUFFER IS\r
+;ADVANCED, IOPTW IS CLEARED IN PTY STATUS, AND CONTROL RETURNS\r
+;TO THE OUPTUT UUO AND THENCE TO THE USER.\r
+;IF NO RESPONSE IN ENCOUNTERED, OUTPUT PROCEEDS IN THE \r
+;NORMAL FASHION ADVANCING THE PTY OUTPUT BUFFERS\r
+;UNTIL THEY ARE EMPTY.\r
+\r
+;IOPTRF IS SET EVERY TIME THE JOB RUNNING 0N THE PTY (OBJECT JOB)\r
+;DOES AN "OUTPUT" UUO. IOPTW IS SET WHENEVER THE OBJECT JOB DOES\r
+;AN INPUT, THE OBJECT JOB THEN GOES INTO I/O WAIT UNTIL THE JOB WITH\r
+;THE PTY ASSIGNED (CONTROL JOB) HAS COMPLETED ITS OUTPUT UUO.\r
+;MONMUD INDICATES PTY IS IN MONITOR MODE (ITS LINKED TTYDDB HAS TPMON\r
+;SET IN THE OF IOS)\r
+\r
+\r
+EXTERNAL TCONLN,TTYTIBTPYTAB,PTYTAB,SETIOD\r
+EXTERNAL ADVBFF,RUNIT,RECIN3,PUTCHI\r
+EXTERNAL TTIBUF,SPCHEK,DDBSRC,LINTAB,CNCTST,TIFCTR,INBFUL\r
+\r
+PTYOUT: LDB LINE,PUNIT\r
+ HRRZM DDB,PTYTAB(LINE)\r
+ ADDI LINE,TCONLN\r
+ HLL LINE,LINTAB(LINE)\r
+\r
+ SKIPE PDDB,TTYTAB(LINE)\r
+ JRST PTYOU1\r
+ PUSHJ PDP,PTEXCH\r
+ PUSHJ PDP,DDBSRC\r
+ TROA PIOS,IODERR\r
+ JRST PTYOU2\r
+ MOVEM PIOS,DEVIOS(RDDB)\r
+\r
+PTEXCH: EXCH IOS,PIOS\r
+ EXCH DDB,PDDB\r
+ POPJ PDP,\r
+\fPTYOU1: MOVE PIOS,DEVIOS(PDDB)\r
+ PUSHJ PDP,PTEXCH\r
+\r
+PTYOU2: MOVEI AC2,@DEVOAD(PDDB)\r
+ MOVE AC2,1(AC2)\r
+ IMULI AC2,5\r
+ HRRZ AC1,DEVOAD(PDDB)\r
+ ADD AC1,[XWD 700+PROG,1]\r
+ MOVEI DAT,TTIBUF(DDB)\r
+\r
+PTYOU3: ILDB CHREC,AC1\r
+ JUMPE CHREC,PTYOU5\r
+ PUSHJ PDP,SPCHEK\r
+ JRST PTYOU4\r
+ CAIE CHREC,176\r
+ CAIN CHREC,33\r
+ MOVEI CHREC,175\r
+ MOVEI IOS,0\r
+ TLNE TAC,BREAKB+FCSBRK\r
+\r
+ MOVSI IOS,SYNC\r
+ IORB IOS,DEVIOS(DDB)\r
+ CAIN CHREC,3 ;CONTROL C\r
+ PUSHJ PDP,CNCTST ;SEE IF SECOND, STOP JOB IF SO\r
+\r
+PTYOU4: MOVEI DAT,TTIBUF(DDB) ;MAY HAVE SWITCHED TO TIOBUF\r
+ PUSHJ PDP,PUTCHI\r
+ JRST PTYOUW\r
+ MOVE TAC,TIFCTR(DDB) ;SEE IF BUFFER FILLING UP\r
+ CAIL TAC,10 ;WAKE JOB IF SO\r
+ TLNE IOS,SYNC\r
+ PUSHJ PDP,RECIN3 ;CLOBBERS DAT AND TAC\r
+PTYOU5: SOJG AC2,PTYOU3\r
+PTYOU6: PUSHJ PDP,PTEXCH\r
+ PUSHJ PDP,ADVBFE\r
+ JFCL\r
+ TRZ IOS,IOPTW\r
+ TLO IOS,IOFST\r
+ MOVEM IOS,DEVIOS(DDB)\r
+ POPJ PDP,\r
+\r
+PTYOUW: PUSHJ PDP,INBFUL ;TURN OFF SYNC, CHECK FOR\r
+ ; PANIC CONTROL C.\r
+ TRO PIOS,IOBKTL ;CANT PUT BATCH IN IOW\r
+ JRST PTYOU6 ;ABORT BUFFER AND RETURN TO BATCH\r
+\fEXTERNAL TCONLN,TTYTAB,SETIOD,ADVBFF,ADRERR,TTYPTR\r
+EXTERNAL BUFCLR,XMTINT,PTYGET,TTYCHR,TTOBUF\r
+\r
+PTYIN: LDB DAT,PUNIT\r
+ SKIPF PDDB,TPYTAB(DAT) ;TTY DDB ADDRESS\r
+ JRST PTYIN1\r
+ TRO IOS,IOIMPM ;YES, THAT'S ALL.\r
+ JRST PTYIN3\r
+\r
+PTYIN1: MOVE PIOS,DEVIOS(PDDB)\r
+ TRZA IOS,IOPTRE\r
+PTYIN4: TRO IOS,IOPTRE\r
+ HRRZ TAC,DEVIAD(DDB)\r
+ PUSHJ PDP,BUFCLR\r
+ JRST ADRERR\r
+ MOVEI LINE,TCONLN(DAT)\r
+ PUSHJ PDP,PTEXCH\r
+ MOVEI AC2,TTYCHR\r
+ MOVEI AC1,@DEVIAD(PDDB)\r
+ ADD AC1,[XWD 700,1]\r
+ MOVEM IOS,DEVIOS(DDB)\r
+ MOVSI IOS,TOIP ;MARK TYPE-OUT ACTIVE\r
+ IORM IOS,TTYPTR(DDB)\r
+ PUSHJ PDP,XMITINT\r
+ SKIPA\r
+\r
+PTYIN2: PUSHJ PDP,PTYGET ;SHOULD BE XMITIN1+1\r
+ SKIPL TTYPTR(DDB) ;STILL GOING?\r
+ JRST PTYIN5 ;NO. END OF STRING FROM TTY\r
+ IDPB CHREC,AC1\r
+ SOJG AC2,PTYIN2\r
+PTYIN5: PUSHJ PDP,PTEXCH\r
+ MOVEI AC3,@DEVIAD(DDB)\r
+ SUBI AC1,1(AC3)\r
+ HRRM AC1,1(AC3) ;WORD COUNT TO BATCH\r
+ PUSHJ PDP,ADVBFF\r
+ JRST PTYIN3\r
+ SKIPGE TTYPTR(PDDB) ;STILL MORE TO COME?\r
+ JRST PTYIN6 ;YES. SEE IF ROOM\r
+\r
+PTYIN3: MOVEM IOS,DEVIOS(DDB)\r
+ POPJ PDP,\r
+\r
+PTYIN6: MOVSI TAC,TOIP ;CLEAR ACTIVE BIT IN CASE STOPPED\r
+ ANDCAM TAC,TTYPTR(PDDB)\r
+ SOJG AC2,PTYIN4 ;COUNT, GO ON IF ROOM\r
+ JRST PTYIN3 ;NO ROOM, STOP\r
+\f;INTERCEPT TTY OUTPUT AT UUO LEVEL AND SYNCHRONIZE\r
+;TTY OUTPUT WITH PTY INPUT\r
+\r
+\r
+INTERNAL PTYPE\r
+EXTERNAL TCONLN,PTYTAB,CLOCK,CIPWTM1,WAKE\r
+\r
+PTYPE: PUSH PDP,PDDB\r
+ MOVE PDDB,LINE\r
+ SUBI PDDB,TCONLN\r
+ HRRZ PDDB,PTYTAB(PDDB)\r
+ PUSH PDP,PIOS\r
+ MOVEM IOS,DEVIOS(DDB)\r
+ MOVEI PIOS,IOPTRE\r
+ IORB PIOS,DEVIOS(PDDB)\r
+ PUSHJ PDP,PTWAKE\r
+ POP PDP,PIOS\r
+ POP PDP,PDDB\r
+ POPJ PDP,0\r
+\r
+PTWAKE: PUSH PDP,TAC1 ;SAVE LINE\r
+ PUSH PDP,TEM\r
+ LDB TAC,[POINT 6,DEVCHR(PDDB),5] ;PTY JOB NR\r
+ HRRZ TAC1,CLOCK ;LAST JOB IN CLOCK QUEUE\r
+PTWAK2: CAIN TAC1,CIPWTM1 ;LOOKED AT ALL JOBS\r
+ JRST PTWAK1 ;YES, WAS NOT SLEEPING\r
+ HLRZ TEM,(TAC1) ;SLEEPING JOB?\r
+ CAIE TEM,WAKE\r
+ SOJA TAC1,PTWAK2 ;NO, IN QUEUE FOR SOME OTHER REASON\r
+ LDB TEM,[POINT 6,(TAC1),23] ;JOB NR IN QUEUE\r
+ CAME TEM,TAC ;IS IT THIS ONE?\r
+ SOJA TAC1,PTWAK2 ;LNO, LOOP TILL DONE\r
+ MOVE TEM,(TAC1) ;YES, ZERO TIME LEFT TO SLEEP\r
+ TRZ TEM,7777\r
+ AOS TEM ;LADD ONE SO NEXT TICK WILL MAKE 0\r
+ MOVEM TEM,(TAC1)\r
+PTWAK1: POP PDP,TEM\r
+ POP PDP,TAC1 ;RESTORE LINE\r
+ POPJ PDP,\r
+\f;ROUTINES TO SET VARIOUS BITS\r
+;CALLED FROM SCNSER WITH TTY LINE NUMBER IN LINE\r
+\r
+INTERNAL PTYOW,PTMNMD,PTMNMZ\r
+\r
+PTMNMD: PUSH PDP,PIOS\r
+ MOVEI PIOS,MONMOD ;PTY INTO MONITOR MODE\r
+ JRST PTYSET\r
+\r
+PTMNMZ: PUSH PDP,PIOS\r
+ HRROI PIOS,MONMOD ;PTY OUT OF MONITOR MODE\r
+ JRST PTYSET\r
+\r
+PTYOW: PUSH PDP,PIOS\r
+ MOVEI PIOS,IOPTW ;PTY IN OUTPUT WAIT\r
+\r
+PTYSET: PUSH PDP,PDDB\r
+ MOVE PDDB,LINE\r
+ SUBI PDDB,TCONLN ;FIND PTY THAT TTY IS LINKED TO\r
+ HRRZ PDDB,PTYTAB(PDDB)\r
+ JUMPE PDDB,PTYST1 ;PREVENT CATASTROPHE\r
+ TLZE PIOS,-1 ;BIT TO BE SET OR ZEEROED\r
+ ANDCAB PIOS,DEVIOS(PDDB) ;ZEROED\r
+ IORB PIOS,DEVIOS(PDDB)\r
+ TRNE PIOS,IOPTW ;IS LINKED TTY JOB IN INPUT WAIT?\r
+ PUSHJ PDP,PTWAKE ;YES, WAKE UP CONTROL JOB\r
+PTYST1: POP PDP,PDDB\r
+ POP PDP,PIOS\r
+ \r
+ POPJ PDP,0\r
+\fPTYEND: END\r
+\f\r
--- /dev/null
+TITLE PTYSRH - HALF DUPLEX PSEUDO TELETYPE SERVICE ROUTINES\r
+SUBTTL D. WITCRAFT/RAP TS3.19 24 SEP 68 V004\r
+XP VPTYSF,004\r
+ ;PUT VERSION NUMBER IN GLOB LISTINGS AND LOADER STORAGE MAP\r
+\r
+ENTRY PTYSRH ;DUMMY GLOBAL FOR FULL DUPLEX PTY\r
+PTYSRH:\r
+\r
+\r
+\r
+;ACCUMULATOR ASSIGNMENTS\r
+\r
+ DDB=DEVDAT\r
+ LINE=TAC1\r
+\r
+ CHREC=TEM\r
+ SCNHAC=12\r
+ PIOS=13\r
+ PDDB=14\r
+ RPTB=400\r
+\r
+ SP=2000 ;SPECIAL TTY CHARACTER\r
+ T37=10000 ;MODEL 37-FULL CHARACTER SET\r
+SYNC=40000 ;BREAK CHARACTER SEEN---FROM SCNSER\r
+\r
+;PTY DEVICE DEPENDENT IO STATUS BITS (RH DEVIOS)\r
+\r
+IOPTW=4000 ;OUTPUT WAIT (OBJ. JOB HAS DONE INPUT)\r
+IOPTRE=2000 ;PTY RESPONSE IS READY\r
+MONMOD=1000 ;PTY IS IN MONITOR MODE\r
+\r
+INTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL PTYDDB,PTYCSV,PTYSAC,PTYBND,PTYBM1,PTYDDS,PIOSAV,PDDSAV\r
+EXTERNAL PTYSAV,PTYSA2,PTYRET,PACSAV\r
+INTERNAL PTYSA0,PTYRE0,ACSAV0\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+;PSEUDO CONSOLE DEVICE DATA BLOCK\r
+;REMAINING PTY DDB'S ARE GENERATED\r
+;OUT OF LINE AT BUILD TIME\r
+ INTERN PTYDDB\r
+ ZZ=.\r
+PTYDDB: SIXBIT /PTY0/\r
+ XWD 0,10000+STTYBF+1 ;PTY0 IS UNIT 1,PTY1 IS UNIT 2, ETC.\r
+ Z\r
+ EXP PTYDSP\r
+ XWD DVIN+DVOUT,3\r
+ Z\r
+ XWD PROG,0\r
+ XWD PROG,0\r
+ Z\r
+ XP PTYCSV,.-ZZ\r
+ Z\r
+ XP PTYDDS,.-ZZ\r
+ BLOCK 13\r
+ XP PTYBND,PTYSAC+12\r
+ XP PTYDM1,PTYBND-1\r
+ XP PTYDDS,.-ZZ ;SIZE OF PTY DDB\r
+\r
+PTYSA2: BLT SCNHAC,0\r
+PIOSAV: 0\r
+PDDSAV: 0\r
+>\r
+\fINTERNAL PTYDSP\r
+EXTERNAL OUT\r
+ POPJ PDP, ;INITIALIZE\r
+ POPJ PDP, ;PRINT ERROR, STOP JOB\r
+PTYDSP: JRST PTYREL\r
+ JRST OUT\r
+ JRST PTYOUT\r
+ JRST PTYIN\r
+\fEXTERNAL PTYTAB,TCONLN,TTYTAB,TTYKIL\r
+\r
+PTYREL: LDB LINE,[POINT 6,DEVCHR(DDB),23]\r
+ SETZM PTYTAB(LINE)\r
+ ADDI LINE,TCONLN\r
+ SKIPN TTYTAB(LINE)\r
+ POPJ PDP,\r
+ PUSH PDP,DDB\r
+ HRRZ DDB,TTYTAB(LINE)\r
+ PUSHJ PDP,TTYKIL\r
+ POP PDP,DDB\r
+ POPJ PDP,\r
+\f;PTY OUTPUT\r
+;IF NO TTYTAB ENTRY EXISTS FOR THIS PTY, A SPACE IS\r
+;SENT TO SCNSER (TCOMM) CAUSING AN ENTRY TO BE MADE IF\r
+;A TTY DATA BLOCK IS AVAILABLE. IF NONE IS AVAILABLE,\r
+;AN "X" IS RETURNED IN WHICH CASE IODERR IS SET IN PTY STATUS\r
+;AND OUTPUT IS TERMINATED.\r
+\r
+;IF A TTY DEVICE DATA BLOCK IS AVAILABLE, CHARACTERS ARE\r
+;TRANSMITTED TO TCOMM. IF A RESPONSE IS RECIEVED AS INDICATED\r
+;BY THE SP BIT IN TTY STATUS, THE PTY OUTPUT BUFFER IS\r
+;ADVANCED IOPTRE IS SET IN PTY STATUS , AND CONTROL RETURNS\r
+;TO THE OUPTUT UUO AND THENCE TO THE USER.\r
+;IF NO RESPONSE IN ENCOUNTERED, OUTPUT PROCEEDS IN THE \r
+;NORMAL FASHION ADVANCING THE PTY OUTPUT BUFFERS\r
+;UNTIL THEY ARE EMPTY.\r
+\r
+;IOPTRF IS SET EVERY TIME THE JOB RUNNING 0N THE PTY (OBJECT JOB)\r
+;DOES AN "OUTPUT" UUO. IOPTW IS SET WHENEVER THE OBJECT JOB DOES\r
+;AN INPUT, THE OBJECT JOB THEN GOES INTO I/O WAIT UNTIL THE JOB WITH\r
+;THE PTY ASSIGNED (CONTROL JOB) HAS COMPLETED ITS OUTPUT UUO.\r
+;MONMUD INDICATES PTY IS IN MONITOR MODE (ITS LINKED TTYDDB HAS TPMON\r
+;SET IN THE OF IOS)\r
+\r
+\r
+EXTERNAL TCONLN,TTYTIBTPYTAB,PTYTAB,SETIOD\r
+EXTERNAL ADVBFF,RUNIT,RECIN3,PUTCHI\r
+EXTERNAL TTIBUF,SPCHEK,DDBSRC,LINTAB,CNCTST,TIFCTR,INBFUL\r
+\r
+PTYOUT: LDB LINE,PUNIT\r
+ JSR PTYSAV\r
+ SKIPN PTYTAB(LINE)\r
+ HRRZM DDB,PTYTAB(LINE)\r
+ SKIPE TPYTAB(LINE) ;HAS A TTY DDB BEEN ASSIGNED?\r
+ JRST PTYOU0-1 ;YES\r
+ ADDI LINE,TCONLN\r
+ MOVEI CHREC,240 ;NO\r
+ PUSHJ PDP,TCOMM\r
+ CAIE CHREC,"X" ;ANY AVAILABLE?\r
+ JRST PTYOU6 ;YES\r
+ JSR PTYRET\r
+ TRO IOS,DEVIOS(DDB) ;NO\r
+ MOVEM IOS,DEVIOS(DDB)\r
+ POPJ PDP,\r
+\r
+PTYOU6: TLO IOS,T37+IOFST ;FORCE BUFFER RESET\r
+ ;T37 SO TABS, ETC NOT TRNSLATED (TIMING ERRO OTHERWI)\r
+ MOVEM IOS,DEVIOS(DDB)\r
+ JSR PTYRET ;RESTORE ACS\r
+\r
+PTYOU0: TRNE IOS,IOPTRE\r
+ POPJ PDP,\r
+ TLZE IOS,IOBEG ;FIRST IO\r
+ TLO IOS,IOFST ;YES\r
+ TLZN IOS,IOFST ;FIRST ITEM IN BUFFER?\r
+ JRST PTYOU1 ;NO\r
+ TLO IOS,IO ;YES. INITIALIZE POINTER & COUNT\r
+ HRRZ TAC,DEVOAD(DDB)\r
+ ADD TAC,[XWD 700,1]\r
+ ADDI TAC,(PROG)\r
+ MOVEM TAC,DEVOAD(DDB)\r
+ HRRZ ITEM,@TAC\r
+ JUMPE ITEM,PTYOU8 ;BUFFER EMPTY>\r
+\f PUSHJ PDP,ITMCNT\r
+ MOVEM ITEM,DEVCTR(DDB)\r
+\fPTYOU1: TRO IOS,IOACT\r
+ TRZ IOS,IOPTRE\r
+ JSR PTYSAV ;SAVE ACS\r
+ LDB LINE,PUNIT\r
+ ADDI LINE,TCONLN\r
+ EXCH IOS,PIOS\r
+\r
+PTYOU2: SOSGE DEVCTR(PDDB) ;BUFFER EMTY?\r
+ JRST PTYOU3 ;YES\r
+ ILDB CHREC,DEVOAD(PDDB) ;NO\r
+PTYOU7: PUSHJ PDP,TCOMM ;SEND NEXT CHARACTER\r
+ TLNE IOS,IOFST\r
+ JRST PTYOU3\r
+ TLNE IOS,SP ;SPECIAL CHARACTER ECHO?\r
+ JRST PTYOU4 ;YES, SEE IF CONTROL CHAR ECHO\r
+ TLNE IOS,SYNC ;NO. BREAK CHARACTER SEEN IF OBJ. JOB SWAPPED OUT?\r
+ JRST PTYOU3 ;YES, BUFFER NOT MOVED INTO OBJECT\r
+ ;JOB TTY IN BUFFER \r
+ JRST PTYOU2 ;NO\r
+\r
+PTYOU4: CAIE CHREC,"^"\r
+ JRST PTYOU7\r
+ MOVEM CHREC,PTYCSV(PDDB);YES. FLUSH OUTPUT\r
+ MOVEM IOS,DEVIOS(DDB) ;SAVE TTY STATE\r
+ TRO PIOS,IOPTRE ;LET USER KNOW\r
+\r
+PTYOU3: JRS PTYRET ;RESTORE ACS\r
+ EXCH IOS,PIOS\r
+PTYOU8: TLZE IOS,IOW\r
+ PUSHJ PDP,SETIOD ;START PTY JOB\r
+ HRLI TAC,PROG\r
+ HRL TAC,DEVBUF(DDB)\r
+ HRR TAC,@TAC\r
+ MOVEM TAC,DEVOAD(DDB)\r
+ PUSHJ PDP,ADVBFE ;ADVANCE PTY OUTPUT BUFFER\r
+ JRST PTYOU5 ;NEXT BUFFER IS EMPTY.\r
+ TRNN PIOS,IOPTRE ;RESPONSE?\r
+ JRST PTYOU0 ;NO\r
+ TRO IOS,IOPTRE ;YES, SET RESPONSE FLAG AND RETURN TO USER\r
+PTYOU5: TRZ IOS,IOACT+IOPTW ;CONSIDER OUTPUT COMPLETED\r
+ TLO IOS,IOFST\r
+ MOVEM IOS,DEVIOS(DDB)\r
+ POPJ PDP,\r
+\fEXTERNAL TCONLN,TTYTAB,SETIOD,ADVBFF,STOSQD,ADRERR\r
+\r
+PTYIN: LDB LINE,[POINT 6,DEVCHR(DDB),23]\r
+ ADDI LINE,TCONLN\r
+ HRRZ PDDB,TTYTAB(LINE) ;TTY DDB ADDRESS\r
+ JUMPN PDDB,PTYIN1 ;HAS TTY DDB BEEN LOST?\r
+ TRO IOS,IOIMPM ;YES, THAT'S ALL.\r
+ JRST PTYIN8\r
+\r
+PTYIN1: PUSH PDP,LINE\r
+ TLO IOS,IOFST\r
+ TDZ IOS,[XWD IO,IOPTRE]\r
+ MOVEI TAC,440700+PROG\r
+ HLLM TAC,DEVPTR(DDB)\r
+\r
+ TRO IOS,IOACT\r
+ MOVE PIOS,DEVIOS(PDDB)\r
+ TLNN PIOS,IO+SP\r
+ JRST PTYI10\r
+ SETZM CHREC\r
+ EXCH CHREC,PTYCSV(DDB) ;HAS FIRST CHAR BEEN REC?\r
+ JUMPE CHREC,PTYIN5+1 ;NO\r
+ ;YES,SAVE LINE NO.\r
+PTYIN4: TLNN PIOS,IO+SP ;IS TTY DONE?\r
+ JRST PTYI38 ;YES. THATS ALL\r
+ MOVE DAT,CHREC\r
+ PUSHJ PDP,STODAT ;STORE CHARACTER\r
+ JRST ADRERR\r
+ JRST PTYIN6 ;BUFFER FULL\r
+\r
+PTYIN5: JUMPE ITEM,PTYI3A ;IF COUNT RUNS OUT\r
+ EXCH PIOS,IOS ;NO. GET NEXT CHAR.\r
+ EXCH PDDB,DDB ;SET IOS AND DBD FOR TTY\r
+ POP PDP,LINE ;RESTORE LINE NO.\r
+ PUSH PDP,ITEM ;SAVE ITEM COUNT\r
+ PUSH PDP,PROG\r
+ PUSHJ PDP,TCOMM\r
+ POP PDP,PROG\r
+ POP PDP,ITEM ;RESTORE ITEM COUNT\r
+ EXCH PIOS,IOS\r
+ EXCH PDDB,DDB\r
+ PUSH PDP,LINE\r
+ JRST PTYIN4\r
+\fPTYI3A: TRZ IOS,IOBKTL\r
+ TRO IOS,IOPTRE ;INPUT READY\r
+PTYI3B: PUSHJ PDP,STOSQD\r
+ JRST ADRERR\r
+ TLOA IOS,IOFST\r
+\r
+PTYIN6: TRO IOS,IOPTRE+RPTB\r
+ PUSHJ PDP,ADVBFF ;ADVANCE PTY BUFFER\r
+ JRST PTYI10 ;NEXT BUFFER IS FULL.\r
+ TLO IOS,IOFST\r
+ TRZE IOS,RPTB\r
+ JRST PTYIN5+1\r
+PTYI10: TLZE IOS, IOW\r
+ PUSHJ PDP, SETIOD\r
+ TRZ IOS,IOACT+RPTB\r
+ POP PDP, LINE\r
+PTYIN8: MOVEM IOS, DEVIOS(DDB)\r
+ POPJ PDP,\r
+\f;SAVE ACCUMULATORS\r
+;CALL MOVEI DDB,ADDRESS OF PTYDB\r
+; JSR PTYSAV\r
+\r
+\r
+IFE FTCHECK+FTMONP,<\r
+PTYSAV: 0\r
+>\r
+PTYSA0: MOVEM SCHHAC,PTYBDN(DDB) ;SAVE HIGH AC\r
+ HRRZ SCNHAC,DDB\r
+ ADDI SCHNHAC,PTYBM1\r
+ HRRM SCNHAC,PTYSA2\r
+ SUBI SCNHAC,SCNHAC-1\r
+ XCT PTYSA2 ;DO BLT SCNHAC\r
+ MOVE PDDB,DDB\r
+ JRST @PTYSAV\r
+\r
+;RESTORE ACCUMULATORS\r
+;CALL MOVEI PDDB,PTY DATA BLOCK ADDRESS\r
+; JSR PTYRET\r
+\r
+IFE FTCHECK+FTMONP,<\r
+PTYRET: 0\r
+>\r
+PTYRE0: HRRZ SCNHAC,PDDB\r
+ ADDI SCNHAC,PTYSAC\r
+ HRLZS SCNHAC\r
+ BLT SCNHAC,SCNHAC\r
+ JRST @PTYRET\r
+\r
+;SAVE ONLY PIOS AND PDDB\r
+\r
+IFE FTCHECK+FTMONP,<\r
+PACSAV: 0\r
+>\r
+ACSAV0: MOVEM PIOS,PIOSAV\r
+ MOVEM PDDB,PDDSAV\r
+ JRST @PACSAV\r
+\r
+ACRET: MOVE PIOS,PIOSAV\r
+ MOVE PDDB,PDDSAV\r
+ POPJ PDP,\r
+\f;INTERCEPT TTY OUTPUT AT UUO LEVEL AND SYNCHRONIZE\r
+;TTY OUTPUT WITH PTY INPUT\r
+\r
+\r
+INTERNAL PTYPE\r
+EXTERNAL TCONLN,PTYTAB,CLOCK,CIPWTM1,WAKE\r
+\r
+PTYPE: MOVE PDDB,LINE\r
+ SUBI PDDB,TCONLN\r
+ HRRZ PDDB,PTYTAB(PDDB)\r
+ TRO IOS,IOACT ;FORCE RESCHED TO CONTROL JOB\r
+ MOVEM IOS,DEVIOS(DDB)\r
+ MOVEI TAC,IOPTRE\r
+ IORB TAC,DEVIOS(PDDB)\r
+ MOVEM CHREC,PTYCSV(PDDB) ;SAVE CHARACTER\r
+\r
+PTWAKE: PUSH PDP,TEM\r
+ PUSH PDP,TAC1\r
+ LDB TAC,[POINT 6,DEVCHR(PDDB),5] ;PTY JOB NR\r
+\r
+ HRRZ TAC1,CLOCK ;LAST JOB IN CLOCK QUEUE\r
+PTWAK2: CAIN TAC1,CIPWTM1 ;LOOKED AT ALL JOBS\r
+ JRST PTWAK1 ;YES, WAS NOT SLEEPING\r
+ HLRZ TEM,(TAC1) ;SLEEPING JOB?\r
+ CAIE TEM,WAKE\r
+ SOJA TAC1,PTWAK2 ;NO, IN QUEUE FOR SOME OTHER REASON\r
+ LDB TEM,[POINT 6,(TAC1),23] ;JOB NR IN QUEUE\r
+ CAME TEM,TAC ;IS IT THIS ONE?\r
+ SOJA TAC1,PTWAK2 ;LNO, LOOP TILL DONE\r
+ MOVE TEM,(TAC1) ;YES, ZERO TIME LEFT TO SLEEP\r
+ TRZ TEM,7777\r
+ AOS TEM ;LADD ONE SO NEXT TICK WILL MAKE 0\r
+ MOVEM TEM,(TAC1)\r
+PTWAK1: POP PDP,TAC1\r
+ POP PDP,TEM\r
+ POPJ PDP,\r
+\f;ROUTINES TO SET VARIOUS BITS\r
+;CALLED FROM SCNSER WITH TTY LINE NUMBER IN LINE\r
+\r
+INTERNAL PTYOW,PTMNMD,PTMNMZ\r
+\r
+PTMNMD: PUSH PDP,PIOS\r
+ MOVEI PIOS,MONMOD ;PTY INTO MONITOR MODE\r
+ JRST PTYSET\r
+\r
+PTMNMZ: PUSH PDP,PIOS\r
+ HRROI PIOS,MONMOD ;PTY OUT OF MONITOR MODE\r
+ JRST PTYSET\r
+\r
+PTYOW: PUSH PDP,PIOS\r
+ MOVEI PIOS,IOPTW ;PTY IN OUTPUT WAIT\r
+\r
+PTYSET: MOVE PDDB,LINE\r
+ SUBI PDDB,TCONLN ;FIND PTY THAT TTY IS LINKED TO\r
+ HRRZ PDDB,PTYTAB(PDDB)\r
+ TLZE PIOS,-1 ;BIT TO BE SET OR ZEEROED\r
+ ANDCAB PIOS,DEVIOS(PDDB) ;ZEROED\r
+ IORB PIOS,DEVIOS(PDDB)\r
+ TRNE PIOS,IOPTW ;IS LINKED TTY JOB IN INPUT WAIT?\r
+ PUSHJ PDP,PTWAKE ;YES, WAKE UP CONTROL JOB\r
+ JSRT ACRET\r
+\f END\r
+\f\r
--- /dev/null
+;***COPYRIGHT 1969, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.***\r
+\r
+\r
+;THIS SUB-PROGRAM ASSEMBLED WITH SYSTEM PAREMETER FILE - S.MAC(V414)\r
+ XLIST\r
+IFDEF LISTSN, < IFN LISTSN, <LIST ;LIST S.MAC IN COMMON ONLY>>\r
+\r
+; S - SYSTEM PARAMETER DEFINITIONS FOR PDP-6 AND PDP-10 TIME SHARING MONITORS\r
+; TH/TH/TNM/RCC 04 JUN 69\r
+\r
+;THIS IS ASSEMBLED IN FRONT OF EACH SUBPROGRAM IN MONITOR\r
+\r
+\r
+DEFINE XP(A,B) ;SYSTEM PARAMETER\r
+ <A=B\r
+ INTERNAL A\r
+>\r
+\r
+;ACCUMULATOR ASSIGNMENTS\r
+\r
+;* MEANS LOADED BY UUO HANDLER ON ALL UUOS\r
+\r
+XP IOS,0 ;*IO DEVICE STATUS WORD(SEE BELOW FOR BITS)\r
+XP TAC,1 ;TEMPORARY(SOMETIMES PRESERVED ACCROSS SUB.)\r
+XP TAC1,2 ;TEMPORARY(SOMETIMES PRESERVED ACCROSS SUB.)\r
+XP PDP,3 ;*PUSH DOWN POINTER(SEPARATE LIST FOR EACH PI\r
+ ; CHANNEL AND EACH USER JOB\r
+XP ITEM,4 ;BUFFER ITEM COUNT, OR JOB NUMBER\r
+XP DAT,5 ;TTY OUTPUT BUFFER POINTER FOR COMMANDS,ERROR\r
+ ; MESSAG ;OR TEMPORARY\r
+XP JBUF,DAT ;ADDRESS OF 3 WORD BUFFER HEADER IN USER AREA\r
+XP DEVDAT,6 ;*LH=UUOS DONE SO FAR FOR THIS DEVICE(SEE BELOW)\r
+ ; RH=ADDRESS OF DEVICE DATA BLOCK\r
+XP PROG,7 ;*LH=HIGHEST REL. LOC. IN USER AREA\r
+ ; RH=ABSOLUTE ADDRESS OF USER AREA\r
+XP JDAT,PROG ;*RH=ADDRESS OF JOB DATA AREA\r
+ ; LH=HIGHEST REL. LOC. IN USER AREA\r
+XP TEM,10 ;TEMPORARY USED ONLY SCNSER IO ROUTINE\r
+\r
+;ONLY 0 THRU 10 SAVED FOR INTERRUPT SERVICE\r
+\r
+XP DSER,11 ;*ADDRESS OF DEVICE SERVICE ROUT. DISPATCH TABLE\r
+XP BUFPNT,12 ;CONTENTS OF FIRST WORD OF 3 WORD USER BUFFER HEADER\r
+XP UCHN,BUFPNT ;*USER IO CHANNEL NO.\r
+XP BUFWRD,13 ;CONTENTS OF 2ND WORD OF USER BUFFER\r
+XP UUO,14 ;*CURRENT UUO IN PROGRESS\r
+ ; PROG IN INDEX FIELD FOR RELOCATION\r
+XP AC1,15 ;TEMPORARY ACS(MORE TEMPORARY THAN TAC,TAC1)\r
+XP AC2,16\r
+XP AC3,17\r
+;REDEFINE SO THAT ONLY THE ABOVE ACS WILL OCCUR IN DDT PRINTOUTS\r
+\r
+DEFINE XP(A,B)<\r
+A==B\r
+INTERNAL A\r
+>\r
+;DEFINE REST OF SYMBOLS SO THAT THEY WILL NOT BE PRINTED BY EXEC DDT ON OUTPUT\r
+\f; DEVICE DATA BLOCK NAMES\r
+ XP DEVNAM,0 ;NAME IN SIXBIT ASCII\r
+ ; C(LH)=DEVICE MNEMONIC\r
+ ; C(RH)=DEVICE NUMBER, LEFT JUSTIFIED\r
+ XP DEVCHR,1 ;CHARACTERISTIC\r
+ ; BITS 0-5=JOB NUMBER(BYTE POINTER=PJOBN)\r
+ ; ZERO VALUE IMPLIES NOT ASSIGNED\r
+ XP HUNGCT,100 ;BITS 6-11=HUNG DEVICE COUNT. SET WHEN\r
+ ; DEVICE BECOMES ACTIVE. DECREMENTED EVERY SECOND.\r
+ XP HUNGST,1 ;BITS 12-17=HUNG DEVICE COUNT\r
+ ; SETTING. 0 MEANS DEVICE CAN NEVER BE HUNG.\r
+ ; BITS 18-23=DEVICE NUMBER,BINARY(BYTE POINTER=PUNIT)\r
+ ; BITS 24-35=BUFFER SIZE\r
+ XP DEVIOS,2 ;STATUS WORD. SEE BELOW\r
+ XP DEVSER,3 ;C(LH)=NEXT DEVICE DATA BLOCK\r
+ ; C(RH)=DEVICE SERVICE DISPATCH TABLE\r
+; DEVICE SERVICE DISPATCH TABLE ASSIGNMENTS\r
+ XP DINI,-2 ;DEVICE INITILIZATION\r
+ XP DHNG,-1 ;DEVICE IS HUNG\r
+ XP DRL,0 ;RELEASE\r
+ XP DCL,1 ;CLOSE\r
+ XP DCLO,DCL ;CLOSE OUTPUT\r
+ ;IMMEDIATE ADDRESS PART OF CLOSE UUO\r
+ XP CLSOUT,1 ;INHIBIT CLOSING OUTPUT\r
+ XP CLSIN,2 ;INHIBIT CLOSING INPUT\r
+ XP DOU,2 ;OUTPUT\r
+ XP DIN,3 ;INPUT. SHORT DISPATCH TABLE\r
+ XP DEN,4 ;ENTER\r
+ XP DLK,5 ;LOOKUP\r
+ XP DDO,6 ;DUMP MODE OUTPUT\r
+ XP DDI,7 ;DUMP MODE INPUT\r
+ XP DSO,10 ;SETO\r
+ XP DSI,11 ;SETI\r
+ XP DGF,12 ;GETF UUO\r
+ XP DRN,13 ;RENAME\r
+ XP DCLI,14 ;CLOSE INPUT\r
+ XP DCLR,15 ;CALL D,[SIXBIT /UTPCLR/]\r
+ XP DMT,16 ;MTAPE\r
+ ; END OF LONG DISPATCH TABLE\r
+\f\r
+ XP DEVMOD,4 ;BITS 6-11=LEFT HALF OF IMAGE MODE BYTE POINTER\r
+ ; BIT 35-J=1 IF MODE J IS LEGAL FOR THIS DEVICE\r
+ ; BIT 18 DEVICE ASSIGNED BY CONSOLE COMMAND\r
+ ; BIT 19 DEVICE ASSIGNED BY PROGRAM (INIT)\r
+\r
+;RIGHT HALF OF DEVICE CHARACTERISTICS WORD(DEVCHR UUO)\r
+ XP ASSCON,400000 ;ASSIGNED BY CONSOLE COMMAND ASSIGN\r
+ XP ASSPRG,200000 ;ASSIGNED BY PROGRAM(INIT UUO)\r
+;LEFT HALF DEVICE CHARACTERISTICS(DEVCHR UUO)\r
+ XP DVOUT,1 ;OUTPUT DEVICE\r
+ XP DVIN,2 ;INPUT DEVICE\r
+ XP DVDIR,4 ;HAS A DIRECTORY\r
+ XP DVTTY,10 ;IS A TTY\r
+ XP DVMTA,20 ;IS A MAG TAPE(REWIND)\r
+ XP DVAVAL,40 ;1 IF DEVICE IS AVAILABLE TO THIS JOB\r
+ ; SET BY DEVCHR UUO\r
+ XP DVDTA,100 ;IT IS A DECTAPE\r
+ XP DVPTR,200 ;IS A PAPER TAPE READER\r
+ XP DVPTP,400 ;IS A PAPER TAPE PUNCH\r
+ XP DVLNG,1000 ;DEVICE HAS LONG DISPATCH TABLE\r
+ ; (OTHER UUOS BESIDES INPUT,OUTPUT,CLOSE,RELEASE)\r
+ XP DVDIS,2000 ;IS A DISPLAY\r
+ XP TTYBIU,4000 ;TTY DDB IN USE (AS IO DEV. EVEN IF\r
+ ; NOT AS USER CONSOLE)\r
+ XP TTYUSE,10000 ;TTY DDB IN USE FLAG\r
+ XP TTYATC,20000 ;TTY ATTACHED TO JOB IF 1\r
+ XP DVLPT,40000 ;IS A LPT (CARRIAGE CONTROL IN FORTRAN)\r
+ XP DVCDR,100000 ;IS A CARD READER(TRAILING SPACES FOR MACRO)\r
+ XP DVDSK,200000 ;IS A DISK\r
+ XP DVDIRIN,400000 ;DECTAPE DIRECTORY IN CORE IF 1(MUST BE SIGN BIT)\r
+\r
+ XP DEVLOG,5 ;LOGICAL NAME FOR JOB DEVICE\r
+ XP DEVBUF,6 ;C(LH)=REL. ADR. OF 3 WORD OUTPUT BUFFER HEADER\r
+ ; C(RH)=REL. ADR. OF 3 WORD INPUT BUFFER HEADER\r
+ XP DEVIAD,7 ;C(LH)=PROG IN INDEX FIELD\r
+ XP DEVADR,DEVIAD\r
+ ; C(RH)=REL. INPUT BUFFER ADD. SERVICE ROUT. IS FILLING\r
+ XP DEVOAD,10 ;C(LH)=PROG IN INDEX FIELD\r
+ XP DEVPTR,DEVOAD\r
+ ; C(RH)=REL. OUTPUT BUFFER ADR. SERVICE ROU. IS EMPTYING\r
+ XP DEVCTR,11\r
+;FOR LONG DISPATCH TABLE DEVICES ONLY:\r
+ XP DEVFIL,11 ;FILE NAME IN SIXBIT\r
+ XP DEVEXT,12 ;LH=EXTENSION, RH=UNUSED\r
+ XP DEVPPN,13 ;PROJECT PROGRAMMER NO. (DISK ONLY)\r
+ ; OTHER DEVICES NEED NOT HAVE THIS LOCATION IN THEM.\r
+\f; I/0 STATUS WORD ASSIGNMENTS\r
+;DATA MODES: BITS 32-35(BYTE POINTER=PIOMOD)\r
+ XP A,0 ;ASCII\r
+ XP AL,1 ;ASCII LINE\r
+ XP I,10 ;IMAGE\r
+ XP IB,13 ;IMAGE BINARY\r
+ XP B,14 ;BINARY\r
+ XP SD,15 ;SCOPE DUMP MODE\r
+ XP DR,16 ;DUMP BY RECORDS\r
+ XP D,17 ;DUMP ACROSS RECORDS\r
+; STATUS BITS\r
+;RIGHT HALF (USER)\r
+ XP IOWC,20 ;DON'T COMPUTE WORD COUNT\r
+ XP IOCON,40 ;CONTINUOUS (CONT=0)\r
+ XP IONRCK,100 ;READ WITH NO. REREAD CHECK\r
+;BITS 27,28 DENSITY OF MAG TAPE\r
+; 00=INSTALATION STANDARD\r
+; 01=200 BPI\r
+; 10=556 BPI\r
+; 11=800 BPI\r
+ XP IOPAR,1000 ;WRITE EVEN PARITY (BCD) IF 1 ON MAG TAPE\r
+ XP IOTEND,2000 ;END OF MAG TAPE\r
+ XP IOBOT,4000 ;BEGINNING OF MAG TAPE\r
+ XP IOACT,10000 ;DEVICE ACTIVE\r
+ XP IODEND,20000 ;DATA END ENCOUNTERED\r
+ XP IOBKTL,40000 ;BLOCK TOO LARGE\r
+ XP IODTER,100000 ;DATA ERROR\r
+ XP IODERR,200000 ;DEVICE ERROR\r
+ XP IOIMPM,400000 ;IMPROPER MODE DETECTED BY\r
+ ; INPUT SERVICE ROUTINE\r
+; LEFT HALF (SYSTEM)\r
+ XP IOW,1 ;I/O WAIT\r
+ XP IOBEG,2 ;VIRGIN DEVICE\r
+ XP IOFST,4 ;NEXT ITEM WILL BE THE FIRST ITEM OF A BUFFER\r
+ XP IO,20 ;OUT=1, IN=0\r
+ XP IOEND,40 ;SERVICE ROUTINE HAS TRANSMITTED LAST DATA\r
+\r
+;REST OF BITS IN LH ARE DEVICE DEPENDENT EXCEPT BIT 14(XP 10) WHICK IS KEPT AS A SPARE\r
+\r
+\r
+;COMMAND DECODER USE OF AC IOS:\r
+\r
+;RH=DISPATCH ADDRESS - SAVJOB,GETJOB,RUNJOB\r
+;LH:\r
+ XP NSRBIT,400000 ;HIGH SEG TO BE FLAGGED NON-SHARABLE(SAVE VS SSAVE COMMAND)\r
+ ; DO NOT CONFUSE WITH SIGN BIT OF JBTSTS\r
+ ; WHICH SAYS SEG IS SHARABLE\r
+\r
+\r
+;HARDWARE BITS:\r
+\r
+ XP UWP,1 ;POSITION IN LH OF DATAO APR TO TURN USER-MODE WRITE PROTECT ON\r
+ XP USRMOD,10000 ;LH PC WORD, MACHINE WAS IN USER MODE WHEN PC STORED\r
+ XP UIOMOD,4000 ;LY PC WORD, MACHINE WAS IN USER IO MODE WHEN PC STORED\r
+ NXM=10000 ;NON EX MEMORY\r
+ POV=200000 ;PUSH DOWN OVERFLOW\r
+ ILM=20000 ;ILLEGAL MEMORY\r
+ ; IE ALL INSTRUCTIONS WERE LEGAL\r
+\f\r
+;LEFT HALF USRJDA (JOB DEVICE ASSIGNMENTS) UUO'S FOR THIS CHANNEL SINCE LAST INIT\r
+ XP INITB,400000 ;INIT-SAVEGET DEPENDS ON THIS BEING SIGN BIT\r
+ XP IBUFB,200000 ;INIT WITH INPUT BUFFER SPECIFIED\r
+ XP OBUFB,100000 ;INIT WITH OUTPUT BUFFER SPECIFIED\r
+ XP LOOKB,40000 ;LOOKUP\r
+ XP ENTRB,20000 ;ENTER\r
+ XP INPB,10000 ;INPUT\r
+ XP OUTPB,4000 ;OUTPUT\r
+ XP ICLOSB,2000 ;INPUT CLOSE\r
+ XP OCLOSB,1000 ;OUTPUT CLOSE\r
+ XP INBFB,400 ;INBUF\r
+ XP OUTBFB,200 ;OUTBUF\r
+ XP SYSDEV,100 ;THIS DEVICE IS SYSTEM TAPE\r
+ ; PROJ.PROG. NO 1,1 ON DSK\r
+ XP RENMB,40 ;RENAME UUO\r
+ XP DSKRLB,20 ;TO DISTINGUISH RELEASE FROM RESET UUO IN DSKSER.\r
+ ; RELEASE CLEARS THEM ALL\r
+\r
+;MTAPE UUO BITS\r
+ XP SLICE,40 ;SET SLICE LEVEL IF A 1 ACCORDING TO SLEVEL\r
+ XP SLEVEL,20 ;VALUE OF SLICE LEVEL IF SLICE A 1\r
+\r
+\r
+;ERROR CODES RETURNED TO USERS ON LOOKUP AND ENTER AND RENAME FAILURES(DISK ONLY)\r
+;IN 2ND WORD OF 4 WROD ARGUMENT BLOCK(RH)\r
+;THE SAME ERROR CODES ARE RETURNED ON RUN AND GETSEG UUOS FOR ALL DEVICES\r
+\r
+ XP FNFERR,0 ;FILE NOT FOUND OR 0 FILE NAME\r
+ XP IPPERR,1 ;INCORRECT PROJECT,PROGRAMMER NO.\r
+ XP PRTERR,2 ;PROTECTION FAILURE(OR DIRECTORY FULL ON DTA)\r
+ XP FBMERR,3 ;FILE BEING MODIFIED\r
+ XP AEFERR,4 ;ALREADY EXISTING FILE(RENAME ONLY)\r
+ XP NLEERR,5 ;NEITHER LOOKUP NOR ENTER(RENAME ONLY)\r
+ XP TRNERR,6 ;TRANSMISSION ERROR(RUN,GETSEG UUO ONLY)\r
+ XP NSFERR,7 ;NOT A SAVE FILE(RUN,GETSEG UUO ONLY)\r
+ XP NECERR,10 ;NOT ENOUGH CORE(RUN,GETSEG UUO ONLY)\r
+ XP DNAERR,11 ;DEVICE NOT AVAILABLE(RUN,GETSEG UUO ONLY)\r
+ XP NSDERR,12 ;NO SUCH DEVICE(RUN,GETSEG UUO ONLY)\r
+ XP ILUERR,13 ;ILLEGAL UUO (GETSEG ONLY) NOT TWO RELOC REG. CAPABILITY\r
+\f; JOB BUFFER AREA HEADER\r
+ XP JBFADR,0 ;BIT 0=1 IF THIS BUFFER RING HAS NEVER BEEN\r
+ ; REFERENCED FROM THE USER'S PROGRAM BY\r
+ ; AN INPUT OR OUTPUT COMMAND.\r
+ ; BITS 1-17=UNUSED\r
+ ; BITS 18-35=CURRENT BUFFER ADDRESS\r
+ XP JBFPTR,1 ;BYTE POINTER TO NEXT BYTE -1\r
+ XP JBFCTR,2 ;POSITIVE ITEM COUNT\r
+; JOB BUFFER HEADER\r
+ XP IOUSE,400000 ;1 IF BUFFER IS FULL (OR BEING EMPTIED)\r
+ ; 0 IF BUFFER IS EMPTY (OR BEING FILLED)\r
+ ; BITS 1-17=BUFFER SIZE\r
+ ; BITS 18-35=NEXT BUFFER ADDRESS\r
+\f;JOB STATUS WORD(JBTSTS TABLE), ONE WORD FOR EACH JOB(SOME BITS ALSO APPEAR IN HIGH SEG STATUS WORD)\r
+\r
+\r
+ XP RUN,400000 ;USER WANTS JOB TO RUN(MUST BE SIGN BIT)\r
+ XP SNA,400000 ;HIGH SEG NUMBER ASSIGNED (ANALOGOUS TO JNA EXCEPT\r
+ ; MUST BE SIGN BIT)\r
+ XP CMWB,200000 ;JOB TYPED A COMMAND WHICH NEEDS CORE\r
+ ; WHICH IS ON DISK. SET BY COMMAND DECODER\r
+ ; CLEARED WHEN JOB IN CORE AGAIN.\r
+ XP SHRSEG,200000 ;HIGH SEG IS SHARABLE (ALTHOUGH NAME MAY BE 0\r
+ ; IG IT HAS BEEN SUPERSEDED)\r
+ ; THIS BIT ALSO APPEARS IN SAME PLACE IN LH OF\r
+ ; OF JBTSGN FOR EACH USER TO INDICATE USER IS USING A SHARABLE\r
+ ; HIGH SEG (ALSO APPEARS IN LH OF AC ITEM WHEN\r
+ ; RH IS SEG NUMBER FOR A PARTICULAR JOB\r
+ XP JACCT,100000 ;PRIVILEGED SYSTEM CUSP IS BEING RUN WHICH CANNOT\r
+ ; BE STOPPED (E.G., LOGIN\r
+ ; OR LOGOUT). PROTECT IT FROM CURIOUS EYES.\r
+ ; DISABLE CONTROL C, MADE IT ACT LIKE ALT-MODE\r
+ XP JNA,40000 ;THIS JOB NUMBER IS ASSIGNED(JOB INITIALIZED)\r
+ XP JERR,20000 ;A MONITOR DETECTED ERROR HAS OCCURRED\r
+ ; JOB CAN NOT CONTINUE\r
+ XP NSWP,10000 ;JOB OR HIGH SEG IS NOT TO BE SWAPPED(REALTIME OR DISPLAY)\r
+ ; (CAN BE SHUFFLED OR NOT ACCORDING TO NSHF)\r
+ ; HIGH SEG CANNOT BE SWAPPED DURING SAVE\r
+ XP SHF,4000 ;MONITOR IS WAITING FOR DEVICES FOR THIS\r
+ ; JOB TO STOP AFTER CURRENT BUFFERFULL\r
+ ; SO JOB CAN BE SHUFFLED IN CORE OR SWAPPED OUT\r
+ ; IF JOB ONLY HAS LOW SEG\r
+ XP SWP,2000 ;0 IF JOB IN CORE, 1 IF SWAPPED OUT OR ON WAY\r
+ ; IN OR OUT\r
+\r
+ ; SAME FOR LOW AND HIGH SEGMENTS\r
+ XP NSHF,1000 ;JOB IS NOT SHUFFLABLE\r
+ ; OR HIGH SEGMENT HAS ACTIVE SAVE IO\r
+ XP CLKR,400 ;JOB HAS A CLOCK REQUEST IN.\r
+ ; NEEDED SO ONLY ONE REQUEST PER JOB\r
+ XP STOPIO,SWP+CMWB+SHF ;FORCE JOB TO STOP TO EXECUTE\r
+ ; SWAP, COMMAND OR \r
+ ; SHUFFLE\r
+\r
+ ;BITS 10-14 USED TO INDICATE JOB IN WAIT FOR A SHARABLE DEVICE\r
+ ;0 MEANS JOB NOT WAITING FOR SHARABLE DEVICE\r
+ ;SEE SCHEDULER(CLKCSS) FOR DEFINITION OF WAIT CODES\r
+\r
+ XP JWSIZ,5 ;SIZE OF WAIT CODE\r
+ XP JWPOS,^D14 ;RIGHT MOST BIT POS. OF WAIT CODE\r
+ XP WTMASK,370 ;MASK FOR CLEARING WAIT CODES\r
+\r
+;BITS 15-17 ARE NO LONGER SET BY LOGIN, THEY ARE MONITOR STATUS BITS\r
+\r
+ XP JLOG,4 ;JOB SUCCESSFULLY LOGGED IN\r
+ XP JRQ,2 ;JOB HAS CHANGED STATE AND MUST BE REQUEUED AT CLOCK\r
+ ; LEVEL BEFORE RESCHEDULING CAN TAKE PLACE\r
+ XP JXPN,1 ;JOB MUST BE SWAPPED OUT BECAUSE IT IS EXPANDING SIZE\r
+ ; OF CORE AND THERE WASN'T ROOM IN CORE\r
+\r
+;BITS 9-17 ARE USED FOR ACCESS PRIVILEGERS BITS FOR SHARABLE HIGH SEGMENTS\r
+; SAME FORMAT AS ACCESS BITS FOR DISK\r
+\r
+ XP HSASIZ,^D9 ;SIZE OF HIGH SEG ACCESS BITS\r
+ XP HSAPOS,^D17 ;RIGHT MOST POSITION OF HIGH SEG ACCESS BITS\r
+ XP HSAMSK,777 ;MASK TO CLEAR ACCESS PRIVILEGES\r
+;MASKS USED TO TEST STATUS CONDITIONS:\r
+\r
+ XP RUNABLE,RUN+JNA ;STATUS BIT PATTERN FOR JOB TO BE RUNABLE\r
+ XP RUNMSK,JLOG+CLKR+NSHF+JACCT+NSWP ;BITS WHICH DO NOT MATTER FOR RUNABILITY\r
+\f;BITS IN JBTSWP TABLE\r
+\r
+ XP FRGSEG,400000 ;LH - 1 IF LOW OR HIGH SEG IS FRAGMENTED ON SWP DEV\r
+ XP SWPCLR,400000 ;RH - 1 IF JOB DATA AREA SHOULD BE CLEARED AFTER\r
+ ; IN. SET ON 140 RESTART SO NO DEVICES ASSIGNED\r
+\f;VIRTUAL ADDRESSING SPACE DESCRIPTOR WORD (JBTSGN) ONE WORD FOR EACH JOB\r
+;THIS WORD APPEARS IN AC ITEM\r
+;LH BITS\r
+ XP SPYSEG,400000 ;THE HIGH SEB IS PHYSICAL CORE (SEE SPYUUO)\r
+ ; MUST BE SIGN BIT SO TEST FOR JOB HAVING A\r
+ ; REAL HIGH SEG IS SKIPG JBTSGN(ITEM)\r
+ XP SHRSEG,SHRSEG ;THE HIGH SEG THIS JOB IS USING IS SHARABLE\r
+ ; THIS BIT ALSO APPEARS IN JBTSTS FOR HIGH SEGS\r
+ XP UWPOFF,100000 ;IF 1, USER-MODE WRITE PROTECT IS OFF FOR THIS JOB\r
+ XP MEDDLE,40000 ;IF 1, USER HAS MEDDLED WITH SHARABLE PROGRAM SUCH\r
+ ; THAT PROGRAM CANNOT TRUST ITSELF\r
+ ; TO TURN UWP OFF OR CHANGE HIGH SEG CORE ASSIGNMENT \r
+ ; MEDDLING MEANS:\r
+ ; 1. START N, OR D COMMAND\r
+ ; 2. RUN UUO WITH GREATER THAN 1 STARTING\r
+ ; INCREMENT\r
+ ; 3. GETSEG UUO\r
+ ; 4. HIGH SEG IS PHYSICAL CORE (SPY UUO)\r
+XP CORCNT,20000 ;#1, THE HIGH SEG IN CORE COUNT FOR THIS JOB\r
+ ; HAS BEEN INCREMENTED, IF 0 IT HAS NOT\r
+ ; SET AND CLEARED BY INCCNT AND DECCNT ROUTINES\r
+;RH IS HIGH SEG NUMBER (NUMBER GREATER THAN JOB MAX AND LESS THAN OR EQUAL TO JBTMAX)\r
+; OR IF SPYSEG IS SET, RH IS HIGHEST PHYSICAL ADR USER MAY SPY INTO\r
+\r
+;JOB PRIVILEGE BITS - JBTPRV TABLE\r
+;SET BY LOGIN FROM ACCT.SYS FILE AS MODIFIED BY CUSTOMER\r
+;RH RESERVED FOR SPECIAL CUSTOMER DEFINED PRIVILEGES(PLEASE START AT BIT 35)\r
+;LH RESERVED FOR DIGITAL STANDARD PRIVILEGES\r
+\r
+;BITS IN LEFT HALF\r
+ XP PVSPYM,1 ;JOB ALLOWED TO SPY AT MONITOR USING PEEK/SPY UUOS\r
+ XP PVSPYA,2 ;JOB ALLOWED TO SPY AT ALL OF CORE USING PEEK/SPY UUOS\r
+ XP PVTRPS,4 ;JOB ALLOWED TO USE TRPSET UUO\r
+\f; SYSTEM MACROS\r
+\r
+;MACRO TO PREVENT SCHEDULING, USED AT UUO LEVEL WHEN A\r
+;REENTRANT ROUTINE IS CHANGING COMMON DATA NOT YET\r
+;ASSIGNED TO A PARTICULAR JOB\r
+\r
+DEFINE NOSCHED\r
+<>\r
+\r
+;MACRO TO ALLOW SCHEDULING ONCE MORE\r
+\r
+DEFINE SCHEDULE\r
+<>\r
+\r
+;MACRO TO PREVENT CORE SHUFFLING, USED AT UUO LEVEL WHEN\r
+;A ROUTINE SETS UP AN ABSOLUTE USER ADDRESS IN AN AC\r
+;OTHER THAN PDP,PROG, OR JDAT. THE MAIN EXAMPLE IS A BLT\r
+;FROM EXEC TO USER OR USER TO EXEC.\r
+\r
+DEFINE NOSHUFF\r
+<>\r
+\r
+;MACRO TO ALLOW SHUFFLING ONCE MORE\r
+\r
+DEFINE SHUFFLE\r
+<>\r
+\r
+;MACRO TO TURN OFF ALL PI CHANNELS EXCEPT DATA CONTROL ONCE\r
+\r
+DEFINE DISABLE(A)\r
+<EXTERNAL CHNOFF\r
+ CONI PI,A\r
+ CONO PI,CHNOFF>\r
+\r
+;MACRO TO TURN THEN BACK ON\r
+\r
+DEFINE ENABLE(A)\r
+<EXTERNAL CHNON\r
+ ANDCMI A,CHNOFF ;DO NOT TOUCH DC CHANNELS\r
+ TRO A,2000 ;SET TO TRUN SELECTED CHANNEL ON\r
+ CONO PI,(A)\r
+>\r
+\r
+\r
+\r
+;MACRO TO START A DEVICE FROM UUO LEVEL\r
+;TAC:=XWD DEVINT FLAGS,CONO ARGUMENTS\r
+\r
+DEFINE STARTDV(A)\r
+<EXTERNAL PIOFF,PION\r
+ CONO PI,PIOFF\r
+ CONO A,(TAC)\r
+ HLRM TAC,A'CON\r
+ CONO PI,PION\r
+>\r
+\f;LIST OF INDEPENDENT MONITOR COMMAND FEATURES\r
+;THESE FEATURES CAN BE ELIMINATED FROM A SYSTEM BY\r
+;SETTING THE APPROPRIATE FTXXXX SYMBOL BELOW TO 0\r
+;AND REASSEMBLING THOSE ROUTINES IN WHICH CODE FOR THE\r
+;FEATURE APPEARS. THE ROUTINES AFFECTED BY EACH FEATURE\r
+;ARE LISTED BELOW. TO GUARANTEE THAT NO ROUTINES ARE\r
+;MISSED, FTXXXX IS DEFINED TO BE AN INTERNAL IN THOSE ROUTINES\r
+;IN WHICH IT IS USED IN CONDITIONAL ASSEMBLY. THUS THE\r
+;RELOCATING LOADER WILL DETECT MULTIPLY DEFINED GLOBALS\r
+;IF NOT ALL ROUTINES AFFECTED HAVE BEEN REASSEMBLED.\r
+\r
+FTTIME=-1 ;TIME ACC\r
+ ; APPEARS IN APRSER,STUFF\r
+\r
+FTATTACH=-1 ;ATTACH AND DETACH TTY TO JOB COMMANDS\r
+ ; APPEARS IN APRSER,SCNSER\r
+\r
+FTTALK=-1 ;TALK TO TTYS COM.\r
+ ; APPEARS IN APRSER,SCNSER\r
+\r
+FTEXAMINE=-1 ;EXAMINE AND DEPOSIT COMMANDS\r
+ ; APPEARS IN APRSER\r
+\r
+FTREASSIGN=-1 ;REASSIGN COMMAND\r
+ ; APPEARS IN APRSER\r
+\r
+FTTRPSET=-1 ;USER IO - TRPSET,TRPJEN UUOS AND OPCODE 100(PDP-10S ONLY)\r
+ ; APPEARS IN APRSER,STUFF,CLKCSS\r
+ ; THESE UUOS ARE SOON TO BE REPLACED BY SOME KNAVE-PROOF REAL TIME UUOS\r
+\r
+FTSLEEP=-1 ;SLEEP UUO\r
+ ; APPEARS IN APRSER,STUFF\r
+\r
+FTFINISH=-1 ;FINISH COMMAND\r
+ ; APPEARS IN APRSER\r
+\r
+FTCHECK=0 ;MONITOR CHECKSUMMING\r
+ ; APPEARS IN ALL FILES EXCEPT CHAN, NULL\r
+\r
+FTMONP=0 ;MONITOR WRITE PROTECTED BETWEEN 1000 AND 20000\r
+ ; APPEARS IN ALL FILES EXCEPT CHAN, NULL\r
+\fFTRCHK=-1 ;ASSEMBLE WITH REDUNDANT CHECKING FOR INTERNAL MONITOR ERRORS.\r
+ ; HALT IF AN ERROR IS DETECTED\r
+ ; CONTINUE WILL LOOP(IF NON-RECOVERABLE ERROR) OR TRY TO RECOVER\r
+ ; OPERATOR SHOULD MAKE NOTE OF MEMORY ADDRESS REG(LOC+1 OF HALT)\r
+ ; APPEARS IN DSKINT,.....\r
+\r
+\r
+FTHALT=0 ;MONITOR HALTS WHEN IT DETECTS AN ERROR IN ITSELF INSTEAD OF PRINTING A MESSAGE\r
+ ; WHEN IT DETECTS AN ERROR. USED FOR DEBUGGING SO A DUMP CAN BE TAKEN\r
+ ; APPEARS IN ERRCON, CONTINUE SWITCH WILL CAUSE USUAL\r
+ ; ERROR MESSAGE TO BE PRINTED, AC DAT HAS JSP DAT,ERROR IN IT ON HALT\r
+\r
+\r
+FTTRACK=0 ;MONITOR LEAVES USEFUL INFORMATION IN LOCATIONS\r
+ ; IN COMMON, NOT NEEDED EXCEPT FOR LEAVING TRACKS\r
+ ; TO DEBUG CRASHES WITH.\r
+\r
+FTTTYSER=-1 ;SCNSRF INSTEAD OF SCNSRH\r
+ ; APPEARS IN APRSER\r
+\r
+FT2REL=-1 ;SUBROUTINE CALLS TO SEGCON FOR TWO RELOCATION REGISTER CAPABILITY\r
+ ; -1 FOR PDP-6 AND PDP-10. SEGCON IS EITHER A DUMMY SET\r
+ ; OF SUBROUTINE OR THE REAL THING DEPENDING ON THE MACHINE.\r
+ ; THOSE CUSTOMERS WITHOUT 2 REG MACHINES WHO WANT TO ELIMINATE THE 20 OR SO LOCS OF\r
+ ; SUBROUTINE CALLS TO SEGCON, CAN DO SO BY REASSEMBLIN THE MONITOR\r
+ ; WITH FT2REL=0. HOWEVER THE COMPANY WILL DISTRIBUTE MONITORS\r
+ ; WITH FT2REL=-1 ALWAYS(PDP-6 AND PDP-10)\r
+\r
+ ; APPEARS IN FIRST,ONCE,APRSR,SCHED\r
+\r
+FTKCT=-1 ;ACCUMULATE CORE*RUNNING TIME FOR CHARGING FOR EACH USER\r
+\r
+FTPRV=-1 ;PRIVILEGE BITS FOR EACH USER\r
+\r
+FTGETTABL=-1 ;GETTAB UUO - RETURN CONTENTS OF MONITOR JOBTABLES\r
+\r
+FTRA10=0 ;NO RA-10 DISK CONTROLLER (BRYANT DISK)\r
+ ;TEMPORARILY USED IN DSKSER\r
+\f;DEFINE THE QUEUES, QUANTUM RUNNING TIME IN JIFFIES, AND PRIORITY\r
+;PRIORITY GOES BACKWARD FROM LOW TO HIGH\r
+\r
+DEFINE QUEUES\r
+< X RN,7 ;STRAIGHT RUN (LOWEST PRIORITY)(Q=0)\r
+ X WS,6 ;IO WAIT SATISFIED\r
+ X TS,6 ;TTY IO WAIT SATISFIED\r
+ X ST,6 ;SYSTEM TAPE WAIT\r
+ IFN FTDISK,<\r
+ X AU,4 ;ALTER DISK UFD QUEUE\r
+ X MQ,4 ;MONITOR DISK QUEUE\r
+ X DA,4 ;DISK STORAGE ALLOCATION WAIT\r
+>\r
+ X DT,4 ;DECTAPE CONTROL WAIT (UP TO 8 DRIVES)\r
+ X DC,4 ;DATA CONTROL (DC) WAIT - MAGTAPE AND DECTAPE\r
+ X MT,4 ;MAGTAPE CONTROL WAIT (UP TO 8 UNITS)\r
+>\r
+\r
+\r
+;JOB STATUS CODES WHICH HAVE NO CORRESPONDING QUEUES\r
+;JOBS ARE UNRUNABLE WHEN IN THESE STATES\r
+\r
+DEFINE CODES\r
+< X IOW, ;IO WAIT\r
+ X TIOW, ;TTY IO WAIT\r
+ X SLP, ;JOB SLEEPING\r
+ X NUL, ;JOB NUMBER NOT ASSIGNED\r
+ X STOP, ;STOP (CONTROL C)\r
+>\r
+ XP STTYBF,20 ;SIZE OF TTY BUFFER\r
+ XP STTYB1,STTYBF+1 ;LENGTH+1\r
+\r
+ ASUPPRESS ;ELIMINATE ALL SYMBOLS NOT REFERENCED LATER\r
+ ; FROM THE SYMBOL TABLE LISTING\r
+ LIST\r
+\f\r
--- /dev/null
+IFE FTDISK+FTRC10+2,<\r
+TITLE SCHEDB - SCHEDULING ALGORITHM FOR SWAPPING SYSTEM(10/50)(BURROUGHS DISK)\r
+>\r
+IFE FTDISK+FTRC10+1,<\r
+TITLE SCHEDD - SCHEDULING ALGORITHM FOR SWAPPING SYSTEM(10/50)(DATA PRODUCTS DISK)\r
+>\r
+SUBTTL CLKCSW R,KRASIN/AF/TH/RCC TS 02 JUNE 69 V421\r
+XP VSCHED,421\r
+ ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
+\r
+INTERNAL FTRC10 ;THIS SOURCE FILE MAY BE ASSEMBLED TO USE EITHER THE\r
+ ; NEW PDP-10 DISK (MODEL RC-10) OR THE OLD PDP-6 DISK (DATA\r
+ ; PRODUCTS DISK FILE) FOR SWAPPING.\r
+\r
+IFN FTRC10, <\r
+ENTRY RCXSKD ;THIS SYMBOL IS SOLELY TO PERMIT SYSTEM\r
+RCXSKD: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE.\r
+INTERNAL XCKCSW\r
+>\r
+IFE FTRC10, <\r
+ENTRY XCKCSW\r
+>\r
+\r
+EXTERNAL JOB,JBTSTS\r
+EXTERNAL JBTQ,PJBSTS\r
+EXTERNAL PJBSTS,TIMEF,MJOBN\r
+\r
+INTERNAL NXTJOB,FTSWAP\r
+\r
+;ACCUMULATOR DEFINITIONS ---\r
+QJ=DEVDAT ;QJOB WORD\r
+SW=TAC1 ;STATUS WORD\r
+J=ITEM ;JOB NO.\r
+\r
+;INITIALIZE SCHEDULER (CALLED FROM SYSINI BEFORE ALL OTHER\r
+; DEVICES ARE INITIALIZED)\r
+\r
+INTERNAL NXTINI\r
+\r
+XCKCSW:\r
+NXTINI: MOVEI TAC,MAXQ ;MAX. NO. OF QUEUES\r
+ SETZM AVALTB(TAC) ;CLEAR SHARABLE DEVICE AVAIL. FLAGS\r
+ SETOM REQTAB(TAC) ;SET SHARABLE DEVICE REQUEST COUNT\r
+ ; TO -, I.E. NO JOB WAITING OR\r
+ ; USING DEVICE OTHER THAN INITIALIZATION\r
+ SOJGE TAC,.-2 \r
+ SETZM QJOB ;CLEAR NO. OF JOBS NEEDING REQUEING\r
+ SETZM XJOB ;CLEAR NO. OF JOBS NEEDING EXPANDING\r
+ SETZM JOBQUE ;CLEAR JOB NO. TO BE REQUEUED\r
+ POPJ PDP,\r
+\f,NXTJOB DECREMENTS CURRENT JOB'S QUANT. AND PROTECT\r
+,TIMES AND REQUEUES IT IF QUANT. TIME GONE TO 0\r
+,SERVINCES ANY JOB REQUEING REQUESTED AT OTHER PRIORITY\r
+,LEVELS THEN CALLS SHUFFLER,SWAPPER AND SCHEDULAR.\r
+,MAKES NO ASSUMPTIONS RE. ACS\r
+,RETURSN NEXT JOB TO RUN IN J.\r
+\r
+EXTERNAL JBTSWP,POTLST\r
+\r
+NXTJOB: SKIPN TIMEF ;CLOCK TIC?\r
+ JRST NXTJB1 ;NO\r
+ MOVSI J,MJOBN ;YES\r
+ MOVSI SW,-1 ;DECREMENT IN CORE PROTECT TIME\r
+ MOVSI DAT,SWP\r
+ TDNE DAT,JBTSTS(J)\r
+ JRST .+3\r
+ SKIPL JBTSWP(J)\r
+ ADDM SW,JBTSWP(J)\r
+\r
+ AOBJN J,.-4\r
+\r
+NXTJB1: SKIPN J,JOB ;CURRENT JOB NO., IS IT NULL JOB?\r
+ JRST CKJB1 ;YES,GO SEE IF OTHER JOBS NEED RESCHEDULING\r
+ MOVEI QJ,0 ;GET READY IN CASE CURRENT JOB UNRUNNABLE\r
+ HLRZ SW,JBTSTS(J) ;GET JOB STATUS BITS AND CODES\r
+ TRZ SW,RUNMSK+CMWB ;MASK OUT DO NOT CARE BITS\r
+ CAIE SW,RUNABLE ;IS CURRENT JOB RUNABLE?\r
+ JRST CKJR3 ;NO. REQUEU CURRENT JOB\r
+ SKIPN TIMEF ;NO. IS THIS A TIME INTERRUPT?\r
+ JRST CKJB1 ;NO.\r
+\r
+ SOS SW,JBTSTS(J) ;DECREMENT QUANT. TIME\r
+ TRNE SW,-1 ;HAS TIME GONE TO 0?\r
+ JRST CKJB1 ;NO\r
+ MOVEI DAT,QTIME ;YES---REQUEUE AND RESET QUANT. TIME\r
+ MOVE TAC,JOBQUE\r
+ PUSHJ PDP,QXFER\r
+\fCKJB1: SKIPG QJ,QJDB ;SET QJ NON ZERO IF ANY REQUEUING TO DO\r
+ JRST CKJB5 ;NO REQUEUEING NECESSARY\r
+ MOVEI J,JOBMAX ;START WITH HIGHEST JOB NUMBER ASSIGNED\r
+CKJB2: MOVSI SW,JBQ ;JOB NEEDS REQUEUEING BIT\r
+ TDNN SW,JBTSTS(J) ;THIS JOB?\r
+ SOJG J,.-1 ;NO, KEEP LOOKING\r
+ JUMPLE J,CKJB5 ;YES,LOOKED AT ALL JOBS?\r
+ ; (MAY NOT FIND A KJOBED JOB IF HIGHEST\r
+ ; GO DECR, COUNT QJOB ANYWAY)\r
+ ANDCAM SW,JBTSTS(J) ;NO,MARK THIS JOB AS DONE\r
+CKJB3: MOVE SW,JBTSTS(J) ;JOB STATUS WORD\r
+ MOVEI DAT,QCMW ;ASSUME COMMAND WAIT\r
+ TLNN SW,CMWB ;IS JOB IN COMMAND WAIT?\r
+ JRST CKJB9 ;NO.\r
+ TLNE SW,SWP+JXPN ;YES, IS JOB ON DISK, OR TRYING TO EXPAND?\r
+ JRST CK,JB4A ;YES. PUT JOB IN COMMAND WAIT Q\r
+CKJB9: JUMPGE SW,CKJB4 ;NO,WAIT STATUS CODE DETERMINES NEW Q\r
+ LDB SW,PJBSTS ;YES, GET QUEUE CODE.\r
+ CAIN SW,WSQ ;*** EXPERIMENTAL ***\r
+ JRST CKJB10 ;*** EXPERIMENTAL ***\r
+ CAIN SW,TIOWD ;CURRENT JOB GOING INTO TTY IO WAIT?\r
+ HRROS JBTSWP(J) ;YES, SET IN CORE PROTECT TIME TO -1,\r
+ ; SO HE CAN BE SWAPPED IMMEDIATELY IF SOMEONE\r
+ ; ELSE WANTS TO BE SWAPPED IN\r
+CKJB4B: SKIPA DAT,QBITS(SW) ;GET ADDRESS OF TRANSFER TABLE\r
+CKJB4: MOVEI DAT,QSTOP ;IF RUN BIT WAS OFF\r
+CKJB4A: PUSHJ PDP,QXFER ;REQUEUE THE JOB\r
+ JUMPE QJ,SCHED ;IF FROM NXTJOB GO DIRECTLY TO SCHED\r
+ ; I.E, CURRENT JOB NO LONGER RUNNABLE(IOW)\r
+ ; BUT JRQ WASN'T SET SO DON'T DECR QJOB\r
+ SOSLE QJ,QJOB ;ANY MORE JOBS TO REQUEUE?\r
+ SOJG J,CKJB2 ;YES,BUT LOOK AT EACH JOB ONLY ONCE PER CLOCK TICK\r
+\r
+CKJB5: MOVEI QJ,AVLNUM ;CK AVAL FLAGS FOR SHAR. DEVS.\r
+CKJB6: SKIPN AVALTB(QJ) ;FLAG=0?\r
+ SOJG QJ,CKJB6 ;YES - TRY NEXT ONE\r
+ JUMPLE QJ,CKJB7 ;NO - OR FINISHED?\r
+ HLR J,AVLQTB(QJ) ;NO--GET 1ST JOB IN Q\r
+CKJB6A: HRRE J,JBTQ(J)\r
+ JUMPLE J,CKJB8 ;FINISHED Q? WAIT TILL SWAPPER BRINGS IN JOB\r
+ MOVE DAT,JBTSTS(J) ;IS JOB IN CORE?\r
+ TLNE DAT,SWP\r
+ JRST CKJB6A ;NO, LOOK AT NEXT JOB IN THIS QUEUE\r
+ ; TO SEE IF IN CORE.\r
+ HRRZ DAT,AVLQTB(QJ) ;NO--GET TRANS. TABLE ADDRESS\r
+ SETZM AVALTB(QJ) ;CLEAR AVAL FLAG\r
+ CAIL QJ,MINQ ;LESS THAN MIN, SHARABLE DEV. Q?\r
+ PUSHJ PDP,QXFER ;REQUEUE THE JOB AND PUT IT IN\r
+ ; PROCESSOR Q SO SCHEDULER WILL RUN IT\r
+CKJB8: SOJG QJ,CKJB6 ;CONTINUE IF ANY MORE FLAGS TO LOOK AT\r
+\fCKJB7: ;NONE--GO SHUFFLE AND SWAP\r
+IFE FTSWAP,< EXTERNAL CHKSHF\r
+ PUSHJ PDP,CHKSHF\r
+>\r
+IFN FTSWAP,<\r
+ PUSHJ PDP,SWAP\r
+>\r
+\r
+;SCHEDULAR--SEARCH THRU QUEUES ACCORDING TO SSCAN TABLE\r
+;FOR 1ST JOB IN CORE--RETURN ITS NO. IN J\r
+\r
+SCHED: SETZM POTLST ;CLEAR POTENTIALLY LOST TIME FLAG\r
+ MOVEI DAT,SSCAN ;ADDRESS OF SCAN TABLE\r
+ JSP TAC,QSCAN ;BEGIN SCAN\r
+ JRST SCHD1 ;NO MORE JOBS--RETURN NULLJOB\r
+ SETOM POTLST ;SET POTENTIALLY LOST TIME FLAG FOR CLOCK1\r
+ MOVE QJ,JBTSTS(J) ;IS THIS JOB SWAPPED OUT\r
+ TLNE QJ,SWP+SHF+JXPN ;MONITOR WAITING FOR I/O TO STOP,OR JOB EXPANDING CORE?\r
+ JRST (TAC1) ;YES--CONTINUE SCAN,JOB CANNOT BE RUN\r
+\r
+ HLREM TAC1,JOBQUE ;YES--SAVE ITS Q\r
+ MOVSI QJ,WTMASK ;CLEAR WAIT CODE\r
+ ANDCAM QJ,JBTSTS(J)\r
+ SETZM POTLST ;CLEAR POTENTIALLY LOST TIME AS A USER IS TO BE RUN\r
+ POPJ PDP, ;RETURN\r
+SCHD1: SETZ J, ;RETURN NULL JOB\r
+ POPJ PDP,\r
+\r
+\r
+;TEMPORARY EXPERIMENTAL SCHEDULING CHANGE TO PERMIT TTY-I/O-WAIT-SATISFIED JOBS ON\r
+; THE DISK TO DISPLACE I/O BOUND JOBS IN CORE.... R.CLEMENTS/D.PLUMER 9 MAY 68\r
+CKJB10: SKIPE INFLG\r
+ SKIPL JBTSWP(J)\r
+ JRST CKJB4B\r
+ MOVEI DAT,CKJBT\r
+ JRST CKJB4A\r
+CKJBT: EXP EQFIX\r
+ XWD QQTTY,-PQ2 ;MAKE JOB(LPT) COMPLETE WITH CPU BOUND JOBS\r
+INFLG: 0 ;NON-ZERO MEANS AT LEAST ONE JOB ON DISK WAITING TO COME IN.\r
+\fSUBTTL OCSS R. KRASIN/AF TS3.17 22 MAR 68 V000\r
+\r
+,THIS ROUTINE MUST BE ASSEMBLED WITH THE CONFIGURATION\r
+,TYPE TO DEFINE NUMBER OF JOBS\r
+,THIS SECTION CONTAINS 2 ROUTINES FOR Q MANIPULATION\r
+,AND NECESSARY TABLES FOR SPECIFING OPERATIONS PERFORMED\r
+,BY THEM.\r
+\r
+EXTERNAL IMGIN,JBTSTS,JBTADR,PJBSTS\r
+INTERNAL QXFER,QSCAN,FTSWAP,FTDISK\r
+\r
+,STORAGE:\r
+,EACH Q IS A RING STRUCTURED, FORWARD AND BACKWARD\r
+,LINKED SRING LIST. THE "FIRST" LINK IN A Q IS\r
+,A Q-HEADER POINTING TO THE FIRST AND LAST MEMBERS OF THE Q.\r
+,A NULL Q HAS ONE LINK--THE Q-HEADER ITSELF. THE LINKS MAKING\r
+,UP THE OS ARE CONTAINED IN A TABLE (JBTQ) WITH NEGATIVE\r
+,INDICIES (ADDRESSES LESS THAN JBTQ) USED FOR Q-HEADERS AND\r
+,POSITIVE INDICIES USED FOR MEMBERS (JOBS). THUS ONLY ONE WORD\r
+,PER LINK IS NECESSARY--ITS ADDRESS RELATIVE TO JBTQ GIVES THE\r
+,JOB NO. (OR Q NU, IF NEGATIVE) WHICH IT REPRESENTS WHILE\r
+,ITS CONTENTS CONTAINS THE LINKING POINTERS, THESE\r
+,POINTERS ARE ALSO INDICIES RELATIVE TO JBTQ RATHER THAN\r
+,ABSOLUTE ADDRESSES--RH(LINK)=FORWARD POINTER;\r
+,LH(LINK)=BACKWARD POINTER.\r
+,A JOB IS ASSUMED TO BE IN NO MORE THAN ONE Q AT A TIME, AND\r
+,THE NULL JOB (JOB 0) DOES NOT APPEAR IN THE QS (I.E. JBTQ\r
+,ITSELF IS THE Q-HEADER FOR Q 0).\r
+\r
+,ROUTINES:\r
+,BOTH ROUTINES ARE "TABLE DRIVEN" IN THE SENSE THAT THE\r
+,CALLING ROUTINE PROVIDES THE ADDRESS OF A TABLE WHICH\r
+,DEFINES THE SPECIFIC OPERATIONS TO BE PERFORMED.\r
+\f;QUEUE INITIALIZATION\r
+;PUT ALL JOBS IN NULL QUEUE(JOB NO. NOT ASSIGNED)\r
+;CALLED ON RESTART AT LOC 143\r
+\r
+INTERNAL QINT\r
+EXTERNAL CPOPJ,JOBMAX,MXQUE,JBTQ\r
+EXTERNAL JBTQP1 ;EQUALS JBTQ+1\r
+EXTERNAL JBTCM1 ;EQUALS JBTQ-1\r
+EXTERNAL JBTOMN ;EQUALS JBTQ-NULQ\r
+\r
+QINI: MOVNI TAC,MXQUE ;MAKE ALL QUEUE HEADERS POINT TO THEMSELVES\r
+ HRL TAC,TAC ;BACKWARD POINTERS TOO\r
+ MOVEM TAC,JBTQ(TAC)\r
+ AOBJN TAC,.-1\r
+ MOVEI TAC,-NULQ ;PUT JOBS ALL IN NULQ QUEUE\r
+ MOVSM TAC,JBTQP1 ;BACK POINTER FOR JOB 1\r
+ MOVEI ITEM,JOBMAX ;MAX. JOB NO.\r
+ MOVEM TAC,JBTQ(ITEM) ;FOR. POINTER OF JOBMAX JOB NO.\r
+\r
+ HRLM ITEM,JBTQMN ;SET NULQ HEADER TO POINT TO JOB1\r
+ MOVEI TAC,1 ;AND JOBMAX\r
+ HRRM TAC,JBTQMN ;FORWARD POINTER\r
+QINI1: HRRM ITEM,JBTQM1(ITEM) ;JOB I-1 POINT TO JOB I\r
+ SETZM JBTQ\r
+ SOJLE ITEM,CPOPJ ;FINISHED?\r
+ HRLM ITEM,JBTQP1(ITEM) ;BACK POINTER JOB I+1 POINTS TO JOB I\r
+ JRST QINI1\r
+\f,DELETES A JOB FROM ITS "SOURCE-Q", DETERMINES A "DEST-Q"\r
+,ACCORDING TO ONE OF 3 FUNCTIONS, AND INSERTS THE JOB AT\r
+,THE BEGINNING OR END OF THIS DEST-Q. IN ADDITION IT MAY\r
+,RESET THE JOB'S QUANTUM TIME (RH JBTSTS).\r
+,THE DRIVING TABLES ARE "TRANSFER TABLES":\r
+,\r
+,T.TABLE: EXP <CODE>\r
+, XWD <QUANT-TAB>,<Q-TAB>\r
+,\r
+,DEPENDING ON <CODE>, THE SECOND WORD IS EITHER DATA OR THE\r
+,ADDRESSES OF "CORRESPONDANCE TABLES".\r
+,\r
+,THE PREFIX OF <CODE> SPECIFIES WHETHER THE JOB IS TO BE\r
+,INSERTED AT THE BEGINNING OR END OF THE DEST-Q. THE SUFFIX\r
+,DETERMINES THE FUNCTION USED TO SELECT THE DEST-Q.\r
+,THE FOLLOWING ARE THE SIX CODES AND THEIR TABLE FORMATS:\r
+\r
+\r
+,DEST-Q AS A FIXED (PREDETERMINED Q:\r
+,BQFIX: INSERT AT BEG OF DEST-Q\r
+,EQFIX: INSERT AT END\r
+,\r
+, THE JOB IS TRANSFERED TO THE END OF BEG, OF THE Q <Q-TAB>\r
+, IF <QUANT-TAB> = -1, QUANT, TIME IS NOT RESET.\r
+, IF <QUANT-TAB> .G. 0 , QUANT. TIME IS RESET TO <QUANT-TAB>.\r
+, SINCE THIS FUNCTION IS FULLY DEFINED BY THE SECOND WORD\r
+, ALONE, O CORRES, TABLE IS NECESSARY.\r
+\f,DEST-Q AS A FUNCTION OF SOURCE-Q\r
+,BQLINK: INSRT AT BEG OF DEST-Q\r
+,EQLINK: INSERT AT END\r
+,\r
+, <Q-TAB>=ADDRES OF A CORRES. TABLE "LINKING" SOURCE-QS TO\r
+, DEST-QS,\r
+, IF <QUANT-TAB> = -1, QUANT. TIME IS NOT RESET.\r
+, OTHERWISE <QUANT-TAB> IS TAKEN AS THE ADDRESS OF A \r
+, TABLE OF QUANT. TIMES CORRESPONDING TO THE Q-LINKING TABLE.\r
+, FORMAT OF THE TABLES ARE:\r
+,\r
+, <Q-TAB>: XWD <SQ1>,<DQ1> ;1ST SOURCE-Q:DEST-Q PAIR\r
+, ...\r
+, XWD <SQN>,<DQN> ;NTH ...\r
+, Z ;ZERO TERMINATES TABLE\r
+,\r
+, <QUANT-TAB>: EXP <QUANT1> ;CORRES. TO <Q-TAB>+0\r
+, ...\r
+, EXP <QUANTN> ;CORRES. TO <Q-TAB>+N-1\r
+\r
+, Z\r
+,\r
+, UPON A CALL TO QXFER FOR THESE 2 CODES, AC T2 CONTAINES\r
+, THE SOURCE-Q (CURRENT Q) OF THE JOB. THE LH OF THE\r
+, <Q-TAB> ENTRIES ARE SEARCHED FOR A MATCH.,IF FOUND, THE\r
+, RH IS TAKEN AS THE DEST-Q AND THE QUANT. TIME IS RESET\r
+, (IF <QUANT-TAB> NOT -1) TO THE CORRES. ENTRY IN THE \r
+, <QUANT-TAB> TABLE.\r
+, IF NO MATCH FOUND..NO TRANSFER TAKES PLACE.\r
+\r
+,DEST-Q AS A FUNCTION OF JOB SIZE\r
+,BQJSIZ INSERT AT BEG OF DEST-Q\r
+,EQJSIZ INSERT AT END\r
+,\r
+, <Q-TAB>=ADDRESS OF A TABLE ASSOCIATING JOB SIZE\r
+, (IN 1K BLOCKS) TO DEST-QS.\r
+, <QUANT-TAB> HAS SAME MEANING AS FOR B-EQLINK\r
+,\r
+, <Q-TAB>: XWD <JSIZ1>,<DQ1>\r
+, ...\r
+, XWD <JSIZN>,<DQN>\r
+, Z\r
+,\r
+, <QUANT-TAB>: SIMILAR TO THAT FOR B-EQLINK\r
+,\r
+, THE <JSIZ>'S MUST BE IN INCREASING ORDER.\r
+, THE TABLE IS SEARCHED UNTIL <JSIZ> IS LESS THAN OR\r
+, EQUAL TO THE JOB SIZE, THEN THE CORRES. <DQ> IS\r
+, TAKEN AS THE DEST-Q. IF THE TABLE IS EXAUSTED, NO\r
+, TRANSFER TAKES PLACE,\r
+, QUANT, TIME IS HANDLED AS IN B-EQLINK.\r
+\f,CALLING SEQUENCE:\r
+, MOVE J,[JOB NUMBER]\r
+, MOVE T2,[CURRENT Q] ;BQLINK AND EQLINK ONLY\r
+; MOVEI TT,TRANS TABLE ADDRESS\r
+, PUSHJ PDP,QXFER\r
+, ... ;RETURN\r
+, ON RETURN J IS UNALTERED; LH(Q)=-1 IF QUANT, TIME OUT\r
+, RESET; QUANT, TIME IF RESET;RH(Q)=DEST.Q\r
+,\r
+,ACS:\r
+TT=DAT ;POINTER TO TRANSFER TABLE\r
+J=ITEM ;JOB NO.\r
+Q=PROG ;DEST-Q AND QUANT. TIME ON RETURN\r
+T1=TAC1 ;TEMP\r
+T2=TAC ;TEMP AND SOURCE-Q ON CALL TO B,EQLINE\r
+\r
+EXTERNAL ERROR\r
+\r
+QXFER: MOVE Q,1(TT) ;GET TRANSFER TABLE ADDRESS\r
+ JRST @(TT) ;DISPATCH\r
+\r
+,DEST-Q AS FUNCTION OF SOURCE-Q\r
+QLINK: SKIPN T1,(Q) ;END OF TABLE?\r
+ POPJ PDP, ;YES\r
+ HLRE T1,T1\r
+ CAME T1,T2 ;NO--SOURCE-Q=LH(TABLE ENTRY)?\r
+ AOBJP Q,QLINK ;NO- CONTINUE SEARCH\r
+ JRST QX2\r
+\r
+,DEST-Q AS FUNCTION OF JOB SIZE\r
+QJSIZ: HLRZ T2,JBTADR(J) ;HIGHEST REL. LOC. OF JOB\r
+ ASH T2,-^D10 ;CONVERT TO NO. OF 1K BLOCKS - 1.\r
+ MOVSI T2,1(T2) ;NO. OF 1K BLOKS TO LH.\r
+QX1: SKIPN T1,(Q) ;END OF TABLE?\r
+ JSP DAT,ERROR\r
+ CAMLE T2,T1 ;JOBSIZE .LE. LH(TABLE ENTRY)?\r
+ AOBJP Q,QX1 ;NO--CONTINUE SEARCH, JUMP ALWAYS.\r
+\r
+QX2: MOVS T2,Q ;T2 IS ADDR. OF QUANT.TIME(IF REQUESTED)\r
+ HRRO Q,(Q) ;RH(Q)=DEST-Q;LH=-1(NO QUANT.TIME REQ.)\r
+ SKIPL 1(TT) ;WAS QUANT. TIME REQUESTED?\r
+ HRL Q,(T2) ;YES--GET IT\r
+\f,FIXED DEST-Q\r
+QFIX: MOVE T1,JBTQ(J) ;DELETE JOB FROM SOURCE-Q\r
+ MOVS T2,T1 ;T1=FORW. LINK, T2=BACK LINK\r
+ HRRM T1,JBTQ(T2) ;FORW, LINK PAST JOB\r
+ HRLM T2,JBTQ(T1) ;BACK LINK PAST JOB\r
+\r
+ SKIPGE (TT) ;END OR BEG. OF Q?\r
+ HLR Q,JBTQ(Q) ;END--THIS WILL LEAVE Q=IDX OF\r
+ ; CURRENT LAST LINK;T2=IDX OF Q-HEADER\r
+ MOVE T2,JBTQ(Q) ;BEG--T2=IDX OF CURRENT 1ST LINK\r
+ ; Q=IDX OF Q-HEADER\r
+ HRRM J,JBTQ(Q) ;INSERT JOB IN DEST-Q\r
+ HRLM J,JBTQ(T2)\r
+ HRRM T2,JBTQ(J)\r
+ HRLM Q,JBTQ(J)\r
+\r
+ JUMPL Q,QX3 ;RETURN IF QUANT. TIME NOT REQ.\r
+ HLRM Q,JBTSTS(J) ;SET QUANT. TIME\r
+\r
+ MOVEI TT,RNQ ;SET JOB STATUS WAIT\r
+ DPB TT,PJBSTS ;CODE TO RUN QUEUE (0).\r
+QX3: POPJ PDP,\r
+\r
+BQFIX=QFIX\r
+EQFIX=QFIX+1B0\r
+BQLINK=QLINK\r
+EQLINK=QLINE+1B0\r
+BQJSIZ=QJSIZ\r
+EQJSIZ=QJSIZ+1B0\r
+\f,SCANS THE QS RETURNING THE NUMBERS OF THE JOBS IN THE QS.\r
+,THE ORDER AND MANNER IN WHICH THE QS ARE SEARCHED IS\r
+,DETERMINED BY A "SCAN TABLE" ADDRESSED IN THE CALLING SEQ.\r
+,THE SCAN TABLE HAS THE FORM:\r
+,\r
+,SCANTAB: XWD <Q1>,<CODE1> ;SCN Q1 ACCRDING TO CODE1\r
+, ...\r
+, XWD <QN>,<CODEN> ;QN ACCORDING TO CODEN\r
+, Z ;ZERO TERMINATES TABLE\r
+,\r
+,EACH Q MAY BE SCANNED IN ONE OF FOUR WAYS SPECIFIEDBY <CODE>\r
+,THE CODES ARE:\r
+,\r
+,QFOR SCAN WHOLE Q FORWARD\r
+,QFOR1 SCAN FOR ONLY THE 1ST MEMBER (IF ANY)\r
+,QBAK SCAN WHOLE Q BACKWARD\r
+,QBAK1 SCAN BACKWARD FOR ALL MEMBERS EXCEPT THE 1ST\r
+,\r
+,CALLING SEQ.\r
+,\r
+, MOVEI ST,SCAN TABLE ADDRESS\r
+, JSP PC,QSCAN ;SET UP PC FOR REPEATED RETURNS\r
+, ... ;RETURN HERE WHEN NO MORE JOBS\r
+, ... ;RETURN HERE WITH NEXT JOB IN AC J\r
+, ; AND ITS Q IN LH(QR)\r
+,\r
+, PERFORM ANY NECESSARY TESTING OF THIS JOB\r
+, J,ST,PC,QR MUST BE PRESERVED\r
+, \r
+, JRST (QR) ;RETURN TO QSCAN TO GET NEXT JOB\r
+, ; IF THIS ONE NOT ACCEPTABLE\r
+,\r
+,ACS:\r
+J=ITEM ;JOB NO.\r
+ST=DAT ;POINTER TO SCAN TABLE\r
+PC=TAC ;RETURN ADDRESS\r
+QR=TAC1 ;ITERATED RETURN ADDRESS TO QSCAN\r
+\fQSCAN: SKIPN QR,(ST) ;END OF SCAN TABLE?\r
+ JRST (PC) ;YES--RETURN TO CALL+1\r
+ HLRE J,QR ;NO--GET NO. OF Q\r
+ JRST (QR) ;DISPATCH\r
+\r
+QFOR1: MOVEI QR,QFOR2 ;ONLY THE FIRST JOB\r
+\r
+QFOR: HRRE J,JBTQ(J) ;SCAN FORWARD ALL JOBS\r
+ JUMPG J,1(PC) ;RETURN THIS JOB NO. CALL+2 UNLESS--\r
+QFOR2: AOJA ST,QSCAN ;END OF THIS Q--GET NEXT Q\r
+\r
+QBAK1: HLRE J,JBTQ(J) ;SCAN BACKWARD ALL JOBS EXCEPT 1ST\r
+ SKIPLE JBTQ(J) ;IS THIS THE FIRST MEMBER?\r
+ JRST 1(PC) ;NO--RETURN CALL+2\r
+ AOJA ST,QSCAN ;YES--GET NEXT Q\r
+\r
+QBAK: HLRE J,JBTQ(J) ;SCAN BACKWARD ALL JOBS\r
+ JUMPG J,1(PC) ;RETURN CALL+2 WITH JOB NO. UNLESS\r
+ AOJA ST,QSCAN ;BEG OF THIS Q--GET NEXT Q\r
+\fINTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL AVALTB\r
+DEFINE X(A,B),<\r
+EXTERNAL A'AVAL\r
+INTERNAL A'Q\r
+A'Q=ZZ\r
+ZZ=ZZ+1\r
+>\r
+ ZZ=0\r
+ QUEUES\r
+ LOC=ZZ\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+\r
+;SHARABLE DEVICE JUST BECOME AVAILABLE(EXTENDED TO OTHER QUEUEW TOO)\r
+;APPROPRIATE ENTRY IS SET NON-ZERO WHEN SCHEDULER SHOULD LOOK\r
+;AT THAT QUEUE TO FIND A JOB TO RUN\r
+;WSAVAL CONTAINS THE NO. OF JOBS WITH IO WAIT SATISFIED(0=NONE)\r
+\r
+DEFINE X(A,B)\r
+<INTERNAL A'AVAL,A'Q\r
+A'Q=.=AVALTB\r
+A'AVAL: 0\r
+>\r
+\r
+INTERNAL AVALTB\r
+AVALTB: QUEUES ;GENERATE THE AVAL FLAGS\r
+LOC=.-AVALTB\r
+>\r
+NQUEUE=LOC ;NO. OF QUEUES COUNTING RUN QUEUE\r
+XP MAXQ,NQUEUE-1 ;MAX. STATE CODE WHICH HAS AN AVAL FLAG\r
+XP MINQ,STQ ;MINIMUM SHARABLE DEVICE QUEUE\r
+XP AVLNUM,MAXQ ;MAX. STATE CODE WHICH HAS AN AVAL FLAG\r
+\r
+;DEFINE STATE CODES WHICH DO NOT HAVE AVAL AND REQ FLAGS\r
+\r
+\r
+DEFINE X(A)\r
+<INTERNAL A'Q\r
+A'Q=LOC\r
+LOC=LOC+1\r
+>\r
+ CODES\r
+\f;CORRESPONDENCE TABLE BETWEEN JOB STATUS CODES AND QUEUE TRANSFER TABLES\r
+;USED BY SCHEDULER\r
+;RUNCSS SETS JOB STATUS WORD TO NEW STATE CODE.\r
+;SCHEDULER SETS UP QUEUE TRANSFER TABLE ADDRESS FROM\r
+;FOLLOWING TABLE USING NEW STATE CODE AS INDEX\r
+\r
+DEFINE X(A,B)\r
+< EXP Q'A'W\r
+>\r
+\r
+INTERNAL QBITS\r
+\r
+QBITS: QUEUES\r
+\fIFN FTCHECK+FTMONP,<\r
+DEFINE X(A,B),<\r
+EXTERNAL A'RFQ\r
+>\r
+ QUEUES\r
+EXTERNAL REQTAB\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+\r
+;SHARABLE DEVICE REQUEST TABLE(GENERALIZED FOR OTHER QUEUES TOO)\r
+;CONTAINS THE NUMBER OF JOB WAITING TO USE SHARABLE DEVICE\r
+;WSREQ AND RNREQ ARE UNUSED\r
+\r
+DEFINE X(A,B)\r
+<A'REQ: 0\r
+INTERNAL A'REQ\r
+>\r
+\r
+INTERNAL REQTAB\r
+\r
+REQTAB: QUEUES ;GENERATE REQ TABLE\r
+>\r
+\f;CORRESPONDENCE TABLE LH=QUEUE CODE, RH=QUEUE TRANSFER TABLE ADR.\r
+;INDEX INTO TABLE ALSO = QUEUE CODE\r
+;FOR SHARABLE DEVICES ONLY\r
+;SCHEDULER TAKES ONE JOB WAITING FOR A SHARABLE DEVICE AND\r
+;PUTS IT IN THE APPROPRIATE RUN QUEUE ACCORDING TO \r
+;QUEUE TRANSFER TABLE AS SPECIFIED BELOW BY THE JOB WAIT\r
+;STATE CODE.\r
+\r
+DEFINE X(A,B)\r
+< XWD -A'Q,Q'A'S\r
+>\r
+\r
+QRNS=0 ;NO CORRESPONDENCE TABLES FO THESE QUEUE\r
+QWSS=0\r
+QTSS=0\r
+\r
+INTERNAL AVLQTB\r
+\r
+AVLQTB: QUEUES\r
+\fIFN FTCHECK+FTMONP,<\r
+EXTERNAL QJOB,JOBQUE ;JOBQUE WILL CAUSE LOAD OF PROPER SCHDAT\r
+ ; DEPENDING ON FTRC10 IN SCHDAT\r
+IFN FTSWAP,<\r
+EXTERNAL XJOB\r
+>>\r
+IFE FTCHECK+FTMONP,<\r
+\r
+INTERNAL JOBQUE\r
+JOBQUE: 0 ;JOBS TO BE REQUEUED ON CLOCK INTERRUPT\r
+\r
+INTERNAL QJOB\r
+QJOB: Z ;NUMBER OF JOBS NEEDING Q TRANSFERS AT OTHER THAN CLOCK LEVEL\r
+\r
+IFN FTSWAP,<\r
+XJOB: Z ;NUMBER OF JOBS NEEDING CORE EXPANSION BY SWAPOUT-IN\r
+INTERNAL XJOB\r
+>\r
+>\r
+\fINTERNAL QSTOP,QTIME,SSCAN,QCMW\r
+\r
+BQFIX=QFIX ;BEGINNING OF QUEUES FIXED QUEUE DISCIPLINE\r
+EQFIX=QFIX+1B0 ;END OF QUEUES " " "\r
+BQLINK=QLINK\r
+EQLINK=QLINK+1B0\r
+BQJSIZ=QJSIZ\r
+EQJSIZ=QJSIZ+1B0\r
+DEFINE TTAB(FCTN,QUEUE,QUANT)\r
+< EXP FCTN\r
+ XWD QUANT,-QUEUE\r
+>\r
+DEFINE PTTAB(FCTN,QUEUE,QUANT)\r
+< EXP FCTN\r
+ XWD QUANT,QUEUE\r
+>\r
+\r
+QNULW: TTAB EQFIX,NULQ,-1 ;NULL QUEUE JOB NO. NOT ASSIGNED\r
+QSTOP:QSTOPW: TTAB EQFIX,STOPQ,-1 ;UNRUNABLE JOBS TO END OF STOPQ\r
+QCMW: TTAB EQFIX,CMQ,-1 ;COMMAND WAIT TILL JOB IN CORE\r
+QRNW: PTTAB EQJSIZ,QSTAB,QQSTAB ;JUST RUNABLE JOBS\r
+ ;WHICH ARE NOT IN SOME WAIT STATE BELOW,ENTER PROCESSOR\r
+ ;QS AT END AND GET QUANT. TIME ACCORDING TO THEIR SIZE\r
+\r
+QWSW: TTAB BQFIX,PQ1,QQTTY ;IO WAIT SAT.(EXCEPT TTY)\r
+ ;ENTER FRONT OF PROCESSOR QS AND GET QUANT, TIME\r
+ ;ACCORDING TO JOB SIZE\r
+QTSW: TTAB BQFIX,PQ,QQTTY ;TTY IO WAIT SATISFIED(ENTER FRONT OF PQ1)\r
+\r
+QIOWW: TTAB EQFIX,IOWQ,-1 ;IOW(EXDEPT TTY) HELD IN IOWQ\r
+QTIOWW: TTAB EQFIX,TIOWQ,-1 ;TTY IOW HELD IN TIOWQ\r
+QAUW: TTAB EQFIX,AUQ,-1,\r
+QMQW: TTAB EQFIX,MQQ,-1 ;MON. Q(DISK) WAIT\r
+QDAW: TTAB EQFIX,DAQ,-1 ;DEV. ALLOC.(DISK)\r
+QDCW: TTAB EQFIX,DCQ,-1 ;DATA CONTROL WAIT\r
+QSTW: TTAB EQFIX,STQ,-1 ;SYST TAPE\r
+QDTW: TTAB EQFIX,DTQ,-1 ;DEC TAPE\r
+QMTW: TTAB EQFIX,MTQ,-1 ;MAG TAPE\r
+QSLPW: TTAB EQFIX,SLPQ,-1 ;SLEEP UUO\r
+\f;TRANSLATION TABLE FROM WAIT STATE TO SATISFIED STATE\r
+;DO NOT RESET QUANTUM RUN TIME\r
+\r
+QQSD=-1\r
+\r
+QMSQ: TTAB BQFIX,PQ1,QQSD ;START MON. Q(DISK) AT PQ1\r
+QDAS: TTAB BQFIX,PQ1,QQSD ;DEV. ALLOC.(DISK)...\r
+QDCS: TTAB BQFIX,PQ1,QQSD ;DATA CONTROL...\r
+QSTS: TTAB BQFIX,PQ1,QQSD ;SYST TAPE\r
+QDTS: TTAB BQFIX,PQ1,QQSD ;DEC TAPE\r
+QMTS: TTAB BQFIX,PQ1,QQSD ;MAG TAPE\r
+QAUS: TTAB BQFIX,PQ1,QQSD ;ALTER UFD\r
+QTIME PTTAB EQLINK,QTTAB,QQSTAB ;MOVE JOB TO LOWER Q\r
+ ;WHEN QUANT. TIME EXCEEDED AND RESET QUANT. TIME\r
+\f,ENTER PROCESSOR QS ACCORDING TO JOB SIZE\r
+QSTAB: XWD 4,-PQ1 ;PQ1 IF SIZE .LE. 4K\r
+ XWD ^D16,-PQ2 ;PQ2 IF 4K .L. SIZE .LE. 16K\r
+ XWD ^D256,-PQ3 ;PQ3 IF 16 .L. SIZE\r
+\r
+,PUT JOB DOWN A Q IF EXCEEDS QUANT. TIME\r
+QQTAB: XWD -PQ1,-PQ2\r
+ XWD -PQ2,-PQ3\r
+ XWD -PQ3,-PQ2 ;BACK TO PQ2 TO COMPETE WITH IOWS JOBS\r
+ Z\r
+\r
+,QUANTUM TABLES\r
+\r
+QQSD=6 ;TENTH SEC. INITIAL QUANT. FOR SHAR. DEV. WAITERS\r
+QQTTY=6 ;TENTH SEC. INITIAL QUANT. FOR TTY IOWS\r
+\r
+, QUANT. TIMES ACCORDING TO PROCESSOR Q:\r
+\r
+INTERNAL RNQUNT\r
+\r
+RNQUNT:\r
+QQSTAB: EXP ^D30 ;PQ1: ONE HALF SECOND\r
+ EXP 2*^D60 ;PQ2: TWO SECONDS\r
+ EXP 2*^D60 ;PQ3: TWO SECONDS\r
+ Z\r
+\fIFN FTSWAP,<\r
+INTERNAL ISCAN,QSCAN\r
+ISCAN: ;SCAN FOR INPUT\r
+ XWD -CWM,QFOR ;MONITOR COMMAND WHICH NEEDS CORE IMAGE IN CORE\r
+ XWD -MQQ,QFOR1 ;LOOK FOR 1ST JOBS IN SHAR. DEV QUEUES\r
+ XWD -DAQ,QFOR1\r
+ XWD -AUQ,QFOR1\r
+ XWD -DCQ,QFOR1\r
+ XWD -MTQ,QFOR1\r
+ XWD -STQ,QFOR1\r
+ XWD -DTQ,QFOR1\r
+SSCAN: XWD -PQ1,QFOR ;SCAN PROCESSOR AS SCHEDULER DOES\r
+ XWD -PQ2,QFOR\r
+ XWD -PQ3,QFOR\r
+ Z ;PATCH SPACE\r
+ Z\r
+ Z ;FINAL ZERO TO FLAG END\r
+\r
+QSCAN: ;SCAN FOR OUTPUT\r
+ XWD -STOPQ,QFOR ;UNRUNABLE JOBS FIRST\r
+ XWD -SLPQ,QFOR\r
+ XWD -DTQ,QBAK1 ;ANY SHAR. DEV.WAITERS MORE THAN 1 DEEP\r
+ XWD -STQ,QBAK1\r
+ XWD -MTQ,QBAK1\r
+ XWD -DCQ,QBAK1\r
+ XWD -AUQ,QBAK1\r
+ XWD -DAQ,QBAK1\r
+ XWD -MQQ,QBAK1\r
+ XWD -TIOWQ,QFOR ;TTY IOW\r
+ XWD -PQ3,QBAK\r
+ XWD -DTQ,QFOR1\r
+ XWD -STQ,QFOR1\r
+ XWD -MTQ,QFOR1 ;NOW SCAN FIRST JOB IN QUEUES\r
+ XWD -DCQ,QFOR1\r
+ XWD -AUQ,QFOR1\r
+ XWD -DAQ,QFOR1\r
+ XWD -MQQ,QFOR1\r
+ XWD -PQ2,QBAK\r
+ XWD -PQ1,QBAK\r
+ Z ;PATCH SPACE\r
+ Z\r
+ Z ;FINAL ZERO TO FLAG END\r
+>\r
+\fSUBTTL SWAP R. KRASIN/AF TS4.34 03 FEB 69 V406\r
+\r
+,SWAPPER CALLED EVERY CLOCK TIC.\r
+,SINCE MOST OPERATIONS STARTED BY THE SWAPPER REQUIRE SEVERAL\r
+,TICS TO RUN TO COMPLETON, SEVERAL FLAGS(FINISH,FIT,FORCE\r
+;ARE USED TO "REMEMBER" PREVIOUS STATES.\r
+,THE BASIC ALOGRITHM:\r
+;IS CORE SHUFFLER WAITING FOR IO TO FINISH FOR SOME JOB?\r
+; YES--TRY AGAIN TO SHUFFLE(WHEN IO STOPS)\r
+;IS CORE SHUFFLER STILL WAITING FOR IO TO FINISH?\r
+; YES--RETURN AND DO NOTHING\r
+;IS SWAPPER STILL BUSY?\r
+; YES--RETURN AND DO NOTHING\r
+,SCAN QS FOR 1ST JOB OUT OF CORE.\r
+, IF NONE-RETURN\r
+;A:\r
+, IF ONE--WILL LOW(HIGH) SEG FIT IN LARGEST HOLE IN CORE?\r
+, YES--START INPUT AND RETURN\r
+, NO--IS TOTAL FREE CORE(CORTAL) ENOUGH TO ACCOMMODATE LOW(HIGH) SEG?\r
+\r
+; YES--CALL CORE SHUFFLER\r
+; IS SHUFFLER WAITING FOR IO TO STOP?\r
+; YES--RETURN AND DO NOTHING\r
+; NO--GO TO A:\r
+, NO--"REMEMBER" THIS JOB FROM INPUT AND LOOK FOR OUTPUT:\r
+,ANY JOBS WAITING TO XPAND CORE BY SWAP OUT/IN?\r
+, YES--OUTPUT ONE AND RETURN\r
+, NO--SCAN QS BACKWARD FOR JOB IN CORE WHOSE PROTECT TIME\r
+, (SET ON INPUT) HAS GONE TO 0.\r
+, IF NONE--RETURN\r
+, IF ONE--IS IT SWAPPABLE(NO ACTIVE IO AND NOT CURRENT JOB)?\r
+, YES--OUTPUT HIGH SEG(IF ANY AND NOT ON DISK) THEN LOW SEGMENT\r
+, NO--SET SWP BIT(SO SCHEDULER WILL NOT RUN), IO WILL CONTINUE\r
+, IN LOW SEGEMENT AS LONG AS IT CAN\r
+, IO ROUTINES NO LONGER STOP IF SWP SET, JUST SHF)\r
+\r
+EXTERNAL JBTSTS\r
+EXTERNAL BIGHOL,CORTAL,ANYDEV,JBTADR,JBTSWP,KCORE1,TRYSWP\r
+EXTERNAL IMGOUT,IMGIN,FINISH,FIT,FORCE\r
+EXTERNAL OERROR,CORGET,JBTDAT,JOBDPG,JOBDPD,JOBPC\r
+EXTERNAL JBTDAT,SHFWAT,CHKSHF\r
+EXTERNAL FULCNT,ERRPNT,EXCALP,PCSTOP,PCORSZ,VIRTAL\r
+\r
+INTERNAL SWAP\r
+INTERNAL XPAND,FT2REL\r
+\r
+T=DEVDAT\r
+T1=TAC1\r
+T2=TAC\r
+J=ITEM\r
+\r
+,ALL DEVICE DEPENDENT CODE MARKED WITH A "*"\r
+\fSWAP: SKIPE SHWAT ;IS CORE SHUFFLER WAITING FOR IO TO STOP\r
+ ; FOR SOME JOB?\r
+ PUSHJ PDP,CHKSHF ;YES, CALL CORE SHUFFLER TO SEE IF\r
+ ; IO STOPPED YET\r
+ SKIPN SHFWAT ;IS SHUFFLER STILL WAITING?\r
+ SKIPE SQREQ ;*NO--IS SWAP SERV, ROUT. STILL BUSY WITH LAST JOB?\r
+ POPJ PDP, ;*YES--RETURN\r
+ SETZM INFLG ;*** EXPERIMENTAL ***\r
+ SKIPN J,FINISH ;NO--ANY IN/OUTPUT TO FINISH?\r
+ JRST SWP2 ;NO-\r
+ JUMPL J,FINOUT ;YES--INPUT OR OUTPUT?\r
+ SKIPE SERA ;INPUT, ANY INPUT ERRORS?\r
+ JRST INERR ;YES\r
+FININ0: ;HERE IF NOTHING TO SWAP IN(HIGH OR LOW SEG EXPANDING FROM 0)\r
+IFN FT2REL,<\r
+ EXTERN FININ\r
+ PUSHJ PDP,FININ ;IS THERE A HIGH SEG WHICH MUST BE SWAPPED IN?\r
+ JRST FIT1 ;YES, GO SWAP IT IN(J SET TO HIGH SEG NO.JOB # INPJOB)\r
+ ; NO, EITHER HIGH SEG ALREADY IN FOR ANOTHER USER\r
+ ; OR THERE IS NON, J STILL JOB NO,(IE LOW SEG)\r
+ ; OR J IS HIGH SEG WHICH EXPANDED FROM NOTHING(XPANDH)\r
+ ; IN WHICH CASE IT HAS NO DISK SPACE AND DIDLING ACS\r
+ ; AND SETTING PROTECT TIME WON'T MATTER EITHER.\r
+>\r
+ LDB T,IMGIN ;NEW CORE SIZE\r
+ LDB T1,IMGOUT ;OLD SIZE WHEN ON DISK\r
+ SUB T1,T ;OLD-NEW=DECREASE\r
+ ; HAS USER DECREASED VIRTUAL MEMORY FROM M TO N(N OR 0)\r
+ ; WHILE OUT ON DISK(R,RUN,GET,KJOB) TO 140 WORDS?\r
+ ; CORE COMMAND ALWAYS FORCES SWAP IN BEFORE\r
+ ; CORE REASSIGNMENT SO NOT IN THIS CATAGORY\r
+ ; FRAGMENTED USER TOO HARD TO PARTIALLY RECLAIM DISK SPACE\r
+ ; ON REDUCTION WHICH DOES NOT GO TO 0\r
+ SKIPLE T1 ;DECREASED?\r
+ ADDM T1,VIRTAL ;YES, NOW INCREASE VIRTUAL MEMORY AVAILABLE BY\r
+ ; AMOUNT OF DECREASE IN HIGH OR LOW SEG\r
+ PUSHJ PDP,ZERSWP ;RETURN LOW SEG DISK SPACE, SET IMGOUT,IMGIN\r
+ ; AND SWP!SHF(JBTSTS) TO 0\r
+ LDB T,PCORSZ ;COMPUTE AND SET IN CORE IN CORE PROTECT TIME FROM\r
+ ; SIZE OF JOB(1K BLOCKS-1)\r
+ IMUL T,PROT ;ADD VARIABLE AMOUNT DEPENDING ON CORE SIZE\r
+ ADD T,PROT0 ;ADD FIXED AMOUNT INDEPENDENT OF CORE SIZE\r
+ HRLM T,JBTSWP(J)\r
+ MOVE JDAT,JBTDAT(J) ;SETUP LOW SEG PROTECTION,RELOCATION\r
+\fIFN JDAT-PROG,<\r
+ MOVE PROG,JBTADR(J)\r
+>\r
+ MOVE T,JOBPC(JDAT) ;JOB STOPPED IN EXEC MORE?\r
+ TLNE T,USRMOD ;TEST PD FLAG\r
+ JRST SWP1 ;NO\r
+ HRRZ T,JOBDPG(JDAT) ;YES, ADJUST PROG AND PDP IN DUMP AC AREA\r
+ SUBI T,(PROG) ;OLD RELOC-NEW RELOC\r
+ MOVNS T ;NEW RELOC-OLD RELOC\r
+ ADDM T,JOBDPD(JDAT) ;ADJUST DUMP PDP\r
+ MOVEM PROG,JOBDPG(JDAT) ;STORE NEW AC PROG\r
+ JRST SWP1\r
+\r
+INERR: SETZM FINISH ;CLEAR FINISH FLAG SO SWAPPING CAN CONTINUE\r
+ MOVE PROG,JBTADR(J) ;SETUP RELOC,PROTECTION FOR HIGH OR LOW SEG\r
+ IFN PROG-JDAT,<MOVE JDAT,JBTDAT(J)>\r
+ PUSHJ PDP,KCORE1 ;RETURN CORE\r
+ JSP TAC,ERRPNT ;PRINT ON USER CONSOLE\r
+ ASCIZ /SWAP READ ERROR/\r
+ JRST PCSTOP ;STOP JOB AND FORCE RESCHDULING\r
+FINOUT: MOVNS J ;FINISH OUTPUT, -FINISH=JOB NO.\r
+ SKIPE SERA ;ANY ERRORS\r
+ JRST SWPREC ;YES, RECORD ERROR AND TRY AGAIN,\r
+ ; IN A DIFFERENT PLACE ON DISK\r
+ MOVE PROG,JBTADR(J) ;XWD PROTECT,,RELOC. FOR LOW SEG\r
+IFN PROG-JDAT,<\r
+ MOVE JDAT,JBTDAT(J) ;JOB DATA AREA\r
+>\r
+ PUSHJ PDP,KCORE1 ;RETURN CORE FOR LOW OR HIGH SEG JUST SWAPPED OUT\r
+ ; EVEN IF \r
+ ; ANOTHER JOB STARTED TO SHARE HIGH SEG DURING\r
+ ; SWAP OUT (GET) SINCE JOB IS MARKED WITH\r
+ ; SWP BIT ON AND CANNOT RUN UNTIL HGIH SEG IS SWAPPED BACK IN\r
+IFN FT2REL,<\r
+ EXTERN FINOT\r
+ PUSHJ PDP,FINOT ;IS THIS A HIGH SEG WHICH WAS JUST SWAPPED OUT?\r
+ ;YES, J SET TO LOW SEG NO, GO TRY SWAP IT OUT\r
+ ; NO, THIS WAS A LOW SEG, ALL SWAPPING FOR THIS USER\r
+ ; IS FINISHED.\r
+>\r
+SWP1: SETZM FINISH ;CLEAR FINISH FLAG\r
+SWP2: SKIPE J,FORCE ;WAITING FOR JOB TO BECOME SWAPPABLE?\r
+ JRST FORCE1 ;YES\r
+FIT0: SKIPE J,FIT ;NO-- WAITING TO FIT JOB IN CORE?\r
+ JRST FIT1 ;YES\r
+\f,SCAN FOR INPUT\r
+ MOVEI DAT,ISCAN\r
+ JSP TAC,QSCAN\r
+ JRST CHKXPN ;NO INPUT TO DO--CK FOR EXPANDING JOBS\r
+ MOVE T,JBTSTS(J) ;THIS JOB OUT OF CORE?\r
+ TLNN T,SWP ;SWP ON IF HIGH SEG SWAPPED OUT FOR THIS USER\r
+ ; OR BOTH SEGS SWAPPED OUT\r
+\r
+ JRST (TAC1) ;NO--CONTINUE SCAN\r
+\r
+FIT1: MOVEM J,FIT ;REMEMBER JOB(OR HIGH SEG) TRYING TO FIT IN\r
+ LDB AC1,IMGIN ;CORE SIZE NEEDED FOR THIS SEG(0 IF LOW SEG\r
+ ; OR HIGH SEG WITH UWP OFF ALREADY IN CORE)\r
+IFE FT2REL,<\r
+ CAMLE AC1,CORTAL ;WILL LOW SEG FIT IN FREE+DORMANT CORE?\r
+>\r
+IFN FT2REL,<\r
+ EXTERN FITSIZ\r
+ PUSHJ PDP,FITSIZ ;COMPUTE AMOUNT OF CORE NEEDED TO BRING IN\r
+ ; 1. THIS JOBS LOW SEG AND HIGH SEG\r
+ ; 2. THIS JOBS LOW SEG(HIGH ALREADY IN OR NONE)\r
+ ; 3. THIS HIGH SEG BECAUSE LOW SEG ALREADY IN\r
+ ;WILL LOW SEG FIT IN FREE+DORMANT+IDLE CORE?\r
+>\r
+ JRST SCNOUT ;NO,WILL NOT FIT EVEN IF ALL DORMANT SEGS DELETED\r
+ ; AC1=TOTAL CORE NEEDED(IN K)\r
+ CAMG AC1,BIGHOL ;YES, WILL THIS SEG FIT IN BIGGEST HOLE OF FREE CORE\r
+ ; WITHOUT DELETING ANY DORMANT OR IDLE SEGS?\r
+ ; (AC1 RESTORED TO SIZE FOR JUST THIS LOW OR HIGH SEG)\r
+\r
+ JRST SWAPI ;YES, GO SWAP IN THIS LOW OR HIGH SEG\r
+IFN FT2REL,<\r
+ EXTERN FRECR1,HOLEF\r
+ SKIPN HOLEF ;NO, ARE THERE ANY HOLES IN CORE WHICH THE SHUFFLER\r
+ ; COULD ELIMINATE(NOT COUNTING ONE AT TOP)?\r
+ PUSHJ PDP,FRECR1 ;NO, GO DELETE ONE DORMANT SEG IN CORE\r
+ ; AND ALWAYS SKIP RETURN(THERE MUST BE AT LEAST\r
+ ; ONE, OTHERWISE CORTAL=BIGHOL)MONITOR ERROR IF NONE\r
+>\r
+ PUSHJ PDP,CHKSHF ;YES, CALL CORE SHUFFLER TO MOVE ONE SEG DOWN\r
+ SKIPN SHFWAT ;SHUFFLER WAITING FOR IO TO STOP?\r
+ JRST FIT0 ;NO, SEE IF JOB WILL FIT NOW.\r
+ POPJ PDP, ;YES, RETURN AND WAIT TILL IO STOPS\r
+\fEXTERN VIRTAL,SWPERC\r
+\r
+SWPREC: MOVE TAC,SERA ;ERROR FLAGS\r
+ IORM TAC,SWPERC ;SAVE FOR POSTERITY\r
+ LDB TAC,IMGOUT ;DECREASE TOTAL AMOUNT\r
+ MOVNS TAC ;OF VIRTUAL CORE IN THE MACHINE\r
+ ADDM TAC,VIRTAL ;BY THE AMOUNT BEING GIVEN UP\r
+ LDB TAC,IMGOUT\r
+ TLO TAC,1\r
+ ADDM TAC,SWPERC\r
+ JRST SWAPO ;GO TRY AGAIN\r
+\r
+;NO INPUT TO DD, CHECK FOR EXPANDING JOBS\r
+CHKXPN: SKIPG XJOB ;ANY JOBS TO EXPAND\r
+ POPJ PDP, ;NO, RETURN FROM SWAPPER, NOTHING TO INPUT OR OUTPUT\r
+ ; YES, FALL INTO SCNOUT WHICH WILL SWAP OUT EXPANDING\r
+ ; JOB SINCE THERE IS ONE\r
+;INPUT TO DO, CHECK TO SEE IF ANY JOBS JUST HAPPEN TO WANT TO EXPAND\r
+\r
+ EXTERN HIGHJB,JBTSTS,ERROR,MAXSIZ,MAXJBN,SUMCOR\r
+SCNOUT: SKIPG XJOB ;ANY JOBS WAITING TO EXPAND?\r
+ JRST SCNJOB ;NO, SCAN ALL JOBS IN PRIORITY ORDER LOOKING\r
+ ; FOR ONE TO SWAP OUT\r
+ MOVE J,HIGHJB ;YES, START WITH HIGHEST JOB NUMBER ASSIGNED\r
+ MOVSI T,JXPN ;SETUP JOB EXPANDED BIT\r
+ TDDN T,JBTSTS(J) ;IS THIS JOB EXPANDING?\r
+ SOJG J,.-1 ;NO, KEEP LOOKING\r
+ IFN FTRCHK,<\r
+ JUMPG J,SCNOK ;CLEAR XJOB SO MESSAGE WILL PRINT\r
+ JSP DAT,ERROR ;ERROR IF NONE FOUND\r
+>\r
+SCNOK: SOS XJOB ;DECREMENT COUNT OF EXPANDING JOBS\r
+ ANDCAM T,JBTSTS(J) ;CLEAR EXPAND BIT IN JOB STATUS WORD\r
+ JRST FORCE0 ;GO TRY TO SWAP JOB OUT\r
+\f;SCAN FOR JOB TO OUTPUT IN ORDER TO MAKE ROOM FOR JOB TO COME IN\r
+;SIZE(IN K) NEEDED TO GET THIS USER IN CORE IS IN AC1(FITSIZ)\r
+;JUST LOW SEG SIZE IF NO HIGH OR HIGH ALREADY IN, JUST HIGH IF LOW ALREADY IN,\r
+;OR SUM IF BOTH MUST BE SWAPPED IN\r
+\r
+SCNJOB: MOVE T,CORTAL ;INITIALIZE FREE CORE COUNTER\r
+ MOVEM T,SUMCOR\r
+ SETZM MAXSIZ ;CLEAR SIZE OF LARGEST JOB\r
+ MOVEI DAT,OSCAN ;SCAN ALL JOBS RANKED IN PRIORITY TO BE SWAPPED OUT\r
+ JSP TAC,QSCAN\r
+ JRST NOFIT ;NO MORE JOBS LEFT, CANNOT FIT JOB IN CORE\r
+ CAMN J,FIT ;IS THIS JOB WE ARE TRYING TO FIND IN?\r
+ JRST(TAC1) ;YES, GO FIND NEXT JOB TO OUTPUT\r
+ SKIPGE T,JBTSTS(J) ;JOB RUN BIT STILL ON(JOB STILL WANT TO RUN)?>\r
+ SKIPGE JBTSWP(J) ;YES, IS PROTECT TIME STILL LEFT?\r
+ ; PROTECT TIME IS DECREMENTED ONLY WHEN\r
+ ; A JOB IS RUNABLE, SO LOOK AT IT\r
+ ; ONLY IF RUN BIT STILL ON\r
+ TLNE T,NSWP+SWP ;NO, IS THIS JOB NOT TO BE SWAPPED OR ALREADY SWAPPED?\r
+ ; (DISPLAY, REAL TIME)?\r
+ JRST (TAC1) ;YES,CONTINUE SCAN TO FIND ANOTHER\r
+ HLRZ T,JBTADR(J) ;PICK UP SIZE OF JOB\r
+ JUMPE T,(TAC1) ` ;CONTINUE SCAN IF NOT IN CORE (HIGH SEG ALREADY SWAPPED\r
+ ; OUT FOR THIS USER IF NO LOW SEG)\r
+ ASH T,-12 ;CONVERT TO 1K BLOCKS\r
+ ADDI T,1\r
+IFN FT2REL,<\r
+ EXTERN FORSIZ\r
+ PUSHJ PDP,FORSIZ ;INCREASE SIZE(T) BY HIGH SEG IF THIS JOB\r
+ ; IS ONLY ONE IN CORE USING HIGH SEG(J= JOB # STILL)\r
+>\r
+ CAMG T,MAXSIZ ;LARGEST SO FAR?\r
+ JRST FORCE2 ;NO\r
+ MOVEM T,MAXSIZ ;YES, SAVE SIZE\r
+ MOVEM J,MAXJBN ;AND JOB NUMBER\r
+FORCE2: ADDM T,SUMCOR ;ADD TO TOTAL\r
+ CAMLE AC1,SUMCOR ;FOUND ENOUGH CORE FOR JOB TO BE FIT IN?\r
+ JRST (TAC1) ;NO. LOOK FOR MORE\r
+ MOVE J,MAXJBN ;YES, SWAP OUT LARGEST\r
+\fFORCE0: PUSHJ PDP,TRYSWP ;CAN THIS JOB BE STOPPED IN ORDER TO DO SWAP?\r
+ JRST (TAC1) ;NO, NSWP OR NSHF SET(DISPLAY,REAL TIME) OR\r
+ ; SAVE OR GET IN PROGRESS WITH DEVICE STILL ACTIVE\r
+ ; LOOK FOR AN OTHER JOB TO SWAP\r
+\r
+IFN FT2REL,<\r
+ EXTERN FORHGH\r
+ PUSHJ PDP,FORHGH ;IS THERE A HIGH SEG TO BE WRITTEN BEFORE\r
+ ; TRYING TO SWAP OUT LOW SEGMENT?\r
+ ; WRITE HIGH SEG IF ALL OF THE FOLLOWING ARE TRUE:\r
+ ; 1. JOB HAS A HIGH SEG AND\r
+ ; 2. IT HAS NOT BEEN SWAPPED FOR THIS USER\r
+ ; (SWP=0 FOR JOB)\r
+ ; 3. IT IS IN CORE(NOT XPANDH)\r
+ ; 4. IF IN-CORE COUNT IS EXECTLY 1 MEANING\r
+ ; THIS ONLY USER USING IN CORE\r
+ ; 5. HIGH SEG NOT ON DISK YET\r
+ ; 6. THIS HIGH SEG IS NOT THE SAME ONE AS JOB\r
+ ; BEING FITTED IN IS GOING TO WANT\r
+\r
+ ; RETURN HIGH SEG NO. IN J IF YES, OTHERWISE\r
+ ; RETURN LOW SEG NO.\r
+ ; IF JOB JUST HAS LOW SEG. SHF BIT IS SET IN JBTSTS\r
+ ; FOR JOB SO IO WILL STOP NEXT BUFFERE\r
+>\r
+ MOVSI T,SWP!IFE FT2REL,<SHF> ;SET SWAPPED OUT BIT FOR LOW OR HIGH SEG\r
+ IORM T,JBTSTS(J) ;SCHEDULER WILL NO LONGER RUN THIS JOB\r
+ ; SET SHF BIT IF ONE SEG SOFTWARE, SO IO WILL\r
+ ; STOP AFTER NEXT BUFFERFUL.\r
+\r
+FORCEL: MOVEM J,FORCE ;ASSUME NOT SWAPPABLE--IS IT?\r
+\r
+FORCE1:\r
+IFN JDAT-PROG,<\r
+ MOVE JDAT,JBTDAT(J)\r
+>\r
+ SKIPN PROG,JBTADR(J) ;LOC. IN PHYSICAL CORE, IS CORE\r
+ ; ASSIGNED IN MEMORY?\r
+ JRST SWAPO ;NO, CANNOT HAVE ACTIVE DEVICES\r
+ CAME J,JOB ;IF THIS IS CURRENT JOB, WAIT UNTIL\r
+ ; PROTECTED AREA IS MOVED BACK TO JOB DATA AREA\r
+ PUSHJ PDP,ANYDEV ;ANY ACTIVE DEVICES?(2ND HALF OF ANYACT BOUT.)\r
+ POPJ PDP, ;YES--RETURN AND WAIT FOR I/O TO STOP.\r
+\f;SWAP OUT LOW OR HIGH SEGEMENT\r
+\r
+INTERNAL FTTRACK\r
+\r
+SWAPD:\r
+IFN FTTRACK,<EXTERN LASOUT\r
+ MOVEM J,LASOUT ;SAVE LAST SWAP OUT FOR DEBUGGING ONLY\r
+>\r
+ SETZM FORCE ;CLEAR FORCE FLAG\r
+ HLRZ T,JBTADTR(J) ;COMPUTE CORE IMAGE\r
+ JUMPE T,SWP1 ;DONT OUTPUT IF 0 CORE(IMGOUT ALREADY SET TO 0\r
+ ; WHEN CORE WAS RETURNED\r
+\r
+ HRRZ T1,JBTADR(J)\r
+ MOVNM T,T2 ;*SAVE COUNT FOR CALL TO SQOUT\r
+ ASH T,-^D10 ;CONVERT TO 1K BLOCKS\r
+ ADDI T,1\r
+ DPB T,IMGOUT ;RECORD AS OUT IMAGE\r
+ HRLI T1,-1(T2) ;*BUILD AND SAVE IOWD FOR SQOUT\r
+ PUSH PDP,T1 ;*\r
+ LDB DAT,IMGIN ;HAS SIZE OF CORE NEEDED WHEN NEXT SWAPPED IN\r
+ SKIPN DAT ;ALREADY BEEN SET(XPAND)\r
+ DPB T,IMGIN ;NO, SO SET TO # 1K BLOCKS OF CORE NEEDED\r
+ MOVE DAT,T ;*CONVERT CORE IMAGE TO 128 WD BLOCKS\r
+ PUSHJ PDP,GXSAT ;*GET DEVICE STORAGE\r
+ JRST FULL ;*NONE AVAILABLE\r
+ HRLM TAC,JBTSWP(J) ;*SAVE DEVICE ADDRESS\r
+OUTP2: MOVNM J,FINISH ;DISK SWAP SPACE ASSIGNED, NOW SET FINISH FLAG\r
+ ; SO THAT SWAPPER WILL KNOW WHICH SEG FINISHED\r
+ ; WHEN IO COMPLETED(SQREQ BECOMES ZERO)\r
+ POP PDP,TAC1 ;*GET IOWD\r
+ JRST SQOUT ;*START OUTPUT AND RETURN\r
+\r
+NOFIT: SETZM FIT ;FORGET ABOUT FITTING IN A JOB ON DISK\r
+ SETOM INFLG ;*** EXPERIMENTAL *** MARK DESIRE TO INPUT\r
+ POPJ PDP, ;ALL JOBS IN CORE RE HIGHER PRIORITY.\r
+\f;COME HERE WHEN THE AMOUNT OF SPACE NEEDED ON THE DISK\r
+;IS NOT AVAILABLE IN ONE CONTIGUOUS BLOCK\r
+\r
+ EXTERN GETFOR\r
+\r
+FULL: HRLM DAT,AC3 ;SAVE DAT (LARGEST AVAILABLE HOLE)\r
+ PUSHJ PDP,FULCOR ;GET 4 FREE CORE LOCS\r
+ HLRZ DAT,AC3 ;RESTORE DAT\r
+ MOVE AC3,TAC1 ;LOC OF 1ST FREE CELL\r
+ HRLI AC3,-4 ;4 LOCS\r
+ TRO TAC1,FRGSEG ;LIGHT FRAGMENTED BIT\r
+ HRLM TAC1,JBTSWP(ITEM) ;SAVE LOC OF TABLE IN JBTSWP\r
+FULL1: PUSH PDP,DAT ;SAVE AMOUNT OF SPACE BEING REQUESTED\r
+FULL1A: PUSHJ PDP,GXSAT ;GET SOME SWAPPING SPACE\r
+ JRST FULL2 ;CANT HAVE THAT MUCH\r
+ HRRM TAC,(AC3) ;SAVE LOC OF THE DISK SPACE\r
+ POP PDP,DAT ;RESTORE AMT GOTTEN\r
+ HRLM DAT,(AC3) ;SAVE AMOUNT IN TABLE\r
+ SUB T,DAT ;AMOUNT STILL NEEDED\r
+\r
+ JUMPE T,FULSET ;THROUGH IF NEED 0 K NOW\r
+ PUSHJ PDP,BMPAC3 ;STEP TO NEXT TABLE LOCATION\r
+ MOVE DAT,T ;TRY TO GET ALL WE NEED NOW IN 1 CHUNK\r
+FULL1B: MOVE DAT,T ;RESET AMOUNT OF SPACE NEEDED\r
+\r
+;COME HERE WHEN CANT GET THE CHUNK REQUESTED\r
+FULL2: MOVEM DAT,(PDP) ;DAT HAS LARGEST CHUNK AVAILABLE\r
+ JUMPG DAT,FULL1A ;GO GET THAT AMOUNT\r
+IFN FT2REL,<\r
+ EXTERN FRESWP\r
+ PUSHJ PDP,FRESWP ;TRY TO DELETE AN UNUSED HIGH SEG FROM DISK\r
+ JRST FULL1B ;FOUND ONE, TRY AGAIN, J PRESERVED\r
+ ; NONE FOUND, PRINT MONITOR ERROR\r
+>\r
+\f EXTERN CERROR\r
+\r
+ POP PDP,TAC ;WHAT? NONE LEFT?\r
+ POP PDP,TAC ;SET PDP TO RIGHT VALUE\r
+ JSP DAT,CERROR ;ERROR IN MONITOR AT .....\r
+\r
+;HERE WHEN THE TOTAL AMOUNT OF SPACE NEEDED HAS BEEN OBTAINED\r
+FULSET: PUSHJ PDP,BMPAC3 ;STEP TO NEXT (LAST) TABLE LOCATION\r
+ HLRZ TAC,JBTSWP(ITEM) ;LOC OF TABLE OF FRAGMENTS\r
+ JRST OUTP2 ;GO START OUTPUT\r
+\r
+;HERE TO GET 4 LOCS OF FREE CORE\r
+FULCOR: PUSH PDP,ITEM ;GETFOR USES ITEM\r
+ PUSHJ PDP,GETFOR ;GET 4 CELLS\r
+ JRST IPOPJ ;RETORE ITEM AND RETURN\r
+\r
+;STEP AC3 TO NEXT LOC OF TABLE BEING BUILT\r
+BMPAC3: AOBJN AC3,CPOPJ ;OK IF MORE LOCS OF TABLE\r
+ PUSHJ PDP,FULCOR ;GET 4 MORE LOCS\r
+ HRLI AC3,-4\r
+ CAIN TAC1,(AC3) ;ARE THEY CONTIGUOUS?\r
+ POPJ PDP, ;YES. RETURN\r
+ MOVE TAC,-1(AC3) ;NO. CONVERT LAST GOOD LOC\r
+ HRROM TAC1,-1(AC3) ;TO A POINTER TO NEXT PART OF TABLE\r
+ MOVEM TAC,(TAC1) ;STORE GOOD DATA IN 1ST WD OF NEW PART\r
+\r
+ HRR AC3,TAC1 ;NEW TABLE LOC\r
+ AOBJN AC3,CPOPJ ;COUNT WORD AND RETURN\r
+\f;SWAP IN A JOB OR HIGH SEGMENT\r
+\r
+SWAPI:\r
+\r
+IFN FTTRACK,<EXTERN LASIN\r
+ MOVEM J,LASIN ;SAVE LAST SWAP IN FOR DEBUGGING ONLY\r
+>\r
+\r
+ MOVEM J,FINISH ;SET FINISH FLAG TO INPUT\r
+ SETZM FIT ;CLEAR FIT FLAG\r
+ LDB TAC,IMGIN ;SIZE OF CORE TO BE ASSIGNED WHEN SWAPPED IN (INK)\r
+ LSH TAC,^D10 ;CONVERT TO HIGHEST ADR\r
+ SUBI TAC,1 ;-1 FOR CALL TO CORGET\r
+ SKIPE PROG,JBTADR(J) ;IS (LOW)SEG ALREADY IN CORE?\r
+ JRST FININ0 ;YES, POSSIBLE IF THIS IS LOW SET AND ONLY\r
+ ; HIGH SEG WAS SWAPPED OUT.\r
+ PUSHJ PDP,CORGET ;NO, GET CORE FOR LOW OR HIGH SEG\r
+ JSP DAT,OERROR ;NOT AVAILABLE-SHOULD NEVER HAPPEN(TELL OPER)\r
+\r
+IFN FT2REL,<EXTERN FITHGH\r
+ PUSHJ PDP,FITHGH ;INCREASE INCORE COUNT FOR THIS JOB'S HIGH SEG.\r
+>\r
+ LDB T,IMGOUT ;GET OUTPUT IMAGE\r
+ JUMPE T,FININ0 ;DONT INPUT IF OUT IMAGE IS 0\r
+ LDB TAC1,IMGIN ;IS SIZE OF CORE SMALLER THAN DISK SPACE?\r
+ CAMGE TAC1,T ;WELL?\r
+ MOVE T,TAC1 ;YES, ONLY INPUT SMALLER AMOUNT(R,RUN,GET,KJOB)\r
+ LSH T,^D18+^D10 ;*BUILD IOWD FOR SQIN\r
+ MOVN TAC1,T ;*\r
+ HRR TAC1,JBTADR(J) ;*\r
+ HLRZ TAC,JBTSWP(J) ;*GET DEVICE ADDRESS\r
+ JRST SQIN ;*START INPUT\r
+\f;ROUTINE TO CHANGE DISK SWAPPING SPACE ALLOCATION(OR SET TO 0)\r
+;DIFFERS FROM ZERSWP IN THAT VIRTUAL TALLY FOR SYSTEM IS ALSO CHANGED\r
+;CALLED FROM CORE0\r
+;CALL: MOVE ITE,JOB OR HIGH SEG NO.\r
+; MOVE TAC,#1K BLOCKS TO BE NEW ASSIGNMENT\r
+; PUSHJ PDP,CHGSWP\r
+; ALWAYS RETURN\r
+;CALLED ONLY FORM VIRTUAL+PHYSICAL CORE ROUTINE CORE0\r
+\r
+INTERN CHGSWP\r
+EXTERN JBTSTS,IMGIN,IMGOUT,JBTSWP,VIRTAL,IPOPJ\r
+\r
+CHGSWP: LDB TAC1,IMGIN ;SIZE WHEN SEG NEXT SWAPPED IN\r
+ JUMPE TAC,CHG1 ;IS ZERO BEING ASKED FOR?\r
+ LSH TAC,-12 ;NO, COVNERT TO 1K BLOCKS\r
+ ADDI TAC,1 ;BUT DO NOT ATTEMPT TO RETURN DISK SPACE\r
+ ; SINCE IT MIGHT BE FRAGMENTED(SWAPPER WILL\r
+ ; RETURN ALL OF DISK SPACE ON NEXT SWAPIN)\r
+ ; HAPPENS ONLY ON R,RUN,GET,KJOB\r
+ DPB TAC,IMGIN ;STORE NEW SIZE WHEN NEXT SWAPPED IN\r
+ PUSH PDP,ITEM ;SAVE AN AC\r
+ LDB ITEM,IMGOUT ;GET OLD DISK SIZE OF THIS USER(USES ITEM)\r
+ CAMGE TAC1,ITEM ;IS OLD IN-CORE SIZE BIGGER?\r
+ MOVE TAC1,ITEM ;NO, USE DISK SIZE AS USER'S OLD VIRTUAL CORE\r
+ CAMGE TAC,ITEM ;IS NEW IN-CORE SIZE BIGGER?\r
+ MOVE TAC,ITEM ;NO, USE DISK SIZE AS USER NEW\r
+ ; VIRTUAL CORE\r
+ SUB TAC1,TAC ;DECREASE OF USER VIRT, CORE=OLD-NEW\r
+ ADDM TAC1,VIRTAL ;USER'S DECREASE=SYSTEM'S INCREASE OF VIRTUAL\r
+ ;CORE\r
+ JRST IPOPJ ;RESTORE ITEM AND RETURN\r
+\f;ROUTINE TO RETURN ALL OF DISK SPACE FOR A LOW OR HIGH SEG\r
+;THIS IS A PHYSICAL DEALLOCATION ONLY AND HAS NO EFFECT ON A SEGMENTS\r
+;VIRTUAL CORE ASSIGNMENT\r
+;CALL: MOVE ITEM,JOB NO. OR HIGH SEG NO.\r
+; PUSHJ PDP,ZERSWP\r
+;CALLED FROM SEGCON IN MANY PLACES(5)\r
+;AND FININ0 HERE IN SWAP\r
+\r
+ INTERN ZERSWP\r
+\r
+ZERSWPL TDZA TAC,TAC ;REQUEST O SPACE ON DISK AND ALWAYS SKIP\r
+CHG1: ADDM TAC1,VIRTAL ;INCREASE SIZE OF VIRTUAL CORE AVAILABLE IN SYSTEM\r
+ ; AND THEN RETURN ALL OF DISK SPACE(CHGSWP)\r
+ MOVSI TAC1,SWP!SHF ;CLEAR SWAPPED OUT BIT IN JOB OR SEG\r
+ ANDCAM TAC1,JBTSTS(ITEM);STATUS WORD(SHF SET IF IO WAS TO BE STOPPED\r
+ ; FOR SWAP OR CORE SHUFFLE\r
+\r
+ PUSH PDP,DAT ;SAVE TTY OUTPUT BYTE POINTER(COMMAND DECODER)\r
+ LDB DAT,IMGOUT ;*SIZE ON DISK(1K BLOCKS)\r
+\r
+ JUMPE DAT,CHG3 ;DID SEG HAVE ANY DISK SPACE?\r
+ HLRZ TAC,JBTSWP(ITEM) ;*YES, LOGICAL DISK BLOCK+FRGSEG BIT\r
+ PUSHJ PDP,FXSAT ;*FREE THE DISK BLOCKS NO LONGER NEEDED\r
+CHG3: POP PDP,DAT ;RESTORE TTY OUTPUT BYTE POINTER\r
+ MOVEI TAC,0 ;0 IS NEW DISK ASSIGNMENT\r
+ DPB TAC,IMGOUT ;SET DISK ASSIGNEMENT TO 0\r
+ DPB TAC,IMGIN ;SET NEW CORE IMAGE BLOCK SIZE WHEN NEXT SWAPPED IN\r
+ ; HERE FROM CHGSWP IF NOT ASKING FOR 0\r
+ POPJ PDP, ;RETURN\r
+\f EXTERN PROT0,PROT ;PROT AND PROT0 OCCUR IN COMMON\r
+\r
+IFE FTRC10, <\r
+XP ICPRT1,3+1*3 ;PROTECT TIME IN CLOCK TICS=\r
+XP ICPROT,^D10 ;((JOBSIZE/1K)*+PROT0)*PROT\r
+ ; PROT0=3,PROT=4 PRODUCT PROTECT TIMES ROUGHLY\r
+ ; EQUAL TO 270 DISK SWAP(1-WAY) TIMES.\r
+>\r
+IFN FTRC10, <\r
+;SIMILAR IN-CORE PROTECT TIME PARAMETERS FOR FAASTER RD-10 DISK......\r
+XP ICPRT1,3+1*3 ;ZERO CORE PLUS K MULTIPLIER\r
+XP ICPROT,3 ;MULTIPLY BY K-1 OF LOW SEG\r
+>\r
+\f;XPAND SETS CONDITIONS TO GET MORE CORE FRO A JOB BY SWAPPING IN OUT\r
+,THEM BACK IN TO DESIRED AMOUNT.\r
+,JOBS POSITION IN QS NOT AFFECTED.\r
+;CALLED ONLY FROM CORE COMMAND\r
+;ASSUMES CALL FOR CURRENT JOB IF EXPANDING HIGH SEG,IE ASSUME AT UUO LEVEL\r
+;THIS IS TRUE SINCE THERE IS NO CORE COMMAND WHICH CAN EXPAND HIGH SEG\r
+,CALL: MOVE ITEM,[JOB NO.]\r
+; MOVE TAC,[HIGHEST LEGAL ADDRESS DESIRED]\r
+; PUSHJ PDP,XPAND\r
+; RETURN, TAC DESTROYED\r
+\r
+XPAND: LSH TAC,-12 ;CONVERT HIGHEST DESIRED ADDRESS\r
+ ADDI TAC,1 ;TO 1K BLOCKS\r
+ DPB TAC,IMGIN ;STORE, SO SWAPPER WILL KNOW HOW MUCH CORE\r
+ ; TO REQUEST WHEN NEXT SWAPPED IN\r
+\r
+;ROUTINE TO FLAG JOB TO BE STOPPED AND SWAPPED OUT\r
+;BECAUSE IT HAS JUST BEEN CONNECTED TO A HIGH SHARABLE SEG WHICH IS ON DISK\r
+;OR ON ITW WAY IN OR OUT. THE SIZE OF THE HIGH SEG IS UNCHANGED\r
+\r
+;THE JOB MUST BE STOPPED UNTIL HIGH SEG SWAPPED IN JUS AS IF JOB HAS\r
+;EXPANDED HIGH SEG(MUST BE CALLED FROM UUO LEVEL FOR CURRENT JOB IF HIGH SEG)\r
+;CALL: MOVE ITEM,HIGH SEG NUMBER\r
+; PUSHJ PDP,XPANDH\r
+\r
+ INTERN XPANDH\r
+ EXTERN IPOPJ\r
+\r
+XPANDH:\r
+IFN FT2REL,<\r
+ PUSH PDP,ITEM ;SAVE JOB NUMBER\r
+ CAILE ITEM,JOBMAX ;IS THIS A LOW OR HIGH SEG?\r
+ MOVE ITEM,JOB ;HIGH,SO GET JOB NO.(MUST BE CURRENT JOB)\r
+>\r
+ MOVSI TAC1,JXPN ;SET THIS JOB EXPANDING BIT SO IT WILL NOT BE RUN\r
+ TDNN TAC1,JBTSTS(ITEM) ;IS IT ALREADY SET FOR THIS JOB?(UNLIKELY)\r
+ AOS XJOB ;NO, INCREMENT COUNT ONLY ONCE FOR EACH JOB EXPANDING\r
+ IORM TAC1,JBTSTS(ITEM) ;AND SET JOB EXPANDING BIT\r
+IFE FT2REL,<\r
+ POPJ PDP, ;RETURN\r
+>\r
+IFN FT2REL,<\r
+ JRST IPOPJ ;RESTORE JOB OR HIGH SEG NUMBER (ITEM) AND RETURN\r
+>\r
+\fSUBTTL SWPSER R.KRASIN/AF TS4.34 03 FEB 69 V406\r
+\r
+INTERNAL SQIN,SQOUT,SQGO,SQGO1\r
+INTERNAL FTSWAP\r
+EXTERNAL DFBUSY,DFRED,DFWRT,CPOPJ,JOBDAC,MJOBCK,CHECK,JBTCHK\r
+\r
+;PUT A REQUEST IN THE SWAPPER QUEUE. ENTER AT SQIN FOR\r
+; INPUT, SWOUT FOR OUTPUT\r
+;CALL: MOVE TAC1,XWD -NO. OF WORDS,FIRST CORE LOC.(IE IOWD+1)\r
+; HRRZ TAC,DISK BLOCK NO.\r
+; PUSHJ PDP,SQIN/SQOUT\r
+; RETURN HERE ALWAYS\r
+; CONTENTS OF TAC,TAC1 LOST\r
+\r
+SQIN: TLO TAC,400000 ;SET READ INDICATOR\r
+SQOUT: MOVEM TAC,SERA ;STORE THE BLOCK NUMBER\r
+ MOVEM TAC1,SQREQ ;STORE THE IOWD\r
+ MOVEM TAC1,ESQREQ ;SAVE IN CASE OF DISK ERROR ON FRAGMENTED JOB\r
+ MOVNI TAC,1 ;IS THE DEVICE BUSY?\r
+ EXCH TAC,DFBUSY \r
+ JUMPN TAC,CPOPJ ;YES IF JUMP\r
+\r
+ERATRY=3 ;NO. OF TIMES TO READ AND WRITE ON ERRORS\r
+\r
+;START UP DEVICE WITH SWAPPING REQUEST. THIS ROUTINE\r
+;IS CALLED FROM DISK INTERRUPT SERVICE, AS WELL AS FROM ABOVE.\r
+;IF A SWAPPER REQUEST IS WAITING(SQREQ WILL BE NON-ZERO)\r
+\r
+SQGO: MOVEI TAC1,ERATRY\r
+ MOVEM TAC1,SERACT\r
+ MOVSI TAC,400000\r
+ TDNE TAC,SERA ;WRITE?\r
+ JRST SQGO1 ;NO\r
+ HRRZ TAC,SQREQ\r
+ ADDI TAC,JOBDAC\r
+ HRLI TAC,MJOBCK\r
+ PUSHJ PDP,CHECK\r
+ MOVM TAC,FINISH\r
+ MOVEM TAC1,JBTCHK(TAC)\r
+\fSQGO1: SETZM SQLEN ;ZERO AMOUNT TRANSFERRED SO FAR\r
+ MOVE TAC1,SQREQ ;*PUT IOWD INTO TAC1\r
+ MOVSI TAC,200000 ;*SET "SWAPPER I/O GOING" FLAG ON\r
+ ORB TAC,SETA ;*\r
+ TRZN TAC,FRGSEG ;*FRAGMENTED?\r
+ JRST SQGO2 ;*NO, READ IN ENTIRE (OR PART) OF SEG\r
+\r
+ EXTERN CLCOR1\r
+\r
+FRAGIO: PUSH PDP,DAT\r
+ MOVN DAT,SQLEN ;AMOUNT PREVIOUSLY TRANSFERRED\r
+ SUB TAC1,DAT ;INCREASE CORE ADDRESS BY WORDCOUNT PREVIOUS\r
+FRGIO1: HLRE DAT,(TAC) ;NO OF K IN THIS DISK CHUNCK\r
+ HRR TAC,(TAC) ;SWAPPING ADDRESS FOR THIS DISK CHUNK\r
+ JUMPGE DAT,FRGIO2 ;POINTER TO NEW CORE LIST IF NEG.\r
+ MOVEI DAT,77777 ;CLEAR OUT ADR(15 BITS)\r
+ ANDCAM DAT,SERA\r
+ ORM TAC,SERA ;INSERT NEW ADDRESS\r
+ JRST FRGIO1\r
+\r
+\r
+FRGIO2: LSH DAT,12 ;CONVERT FROM K TO WORDS\r
+ ADDM DAT,SQLEN ;ADD TO PREVIOUSLY TRANSFERRED AMOUNT\r
+ MOVNS DAT ;-N WORDS\r
+ HRLM DAT,TAC1 ;IOWD IN TAC1\r
+ HRLO DAT,DAT ;-NO. OF WRDS FOR THIS DISK TRANSFER TO TH\r
+ CAMG DAT,SQREQ ;COMPARE WITH - NO. WORDS FOR REST OF SEG\r
+ HLL TAC1,SQREQ ;SWAPPER ONLY WANTS TO READ A PORTION OF SEG\r
+ ; NOT ALL OF IT(R,RUN,GET,KJOB COMMAND)\r
+ MOVNS DAT ;+NO. OF WORDS FOR THIS NEXT TRANSFER\r
+ ADDI DAT,777777\r
+ ADDM DAT,SQREQ ;UPDATE LH OF IOWD FOR ENTIRE SEG, SO IT HAS\r
+ ; -NO. OF WORDS LEFT AFTER THIS TRANSFER IS DONE\r
+ POP PDP,DAT\r
+SQGO2: TLZ TAC,377777 ;*CLEAR POSSIBLE TRASH IN LH.\r
+ ROT TAC,BLKSPK ;*RE-POSITION DISK LOGICAL BLOCK NUMBER.\r
+ TRZE TAC,4 ;*TEST AND CLEAR READ/WRITE BIT.\r
+ SOJA TAC1,DFRED ;*YES\r
+ SOJA TAC1,DFWRT ;*NO, WRITE.\r
+\f;SERVICE A SWAPPING INTERRUPT\r
+EXTERNAL DINT4B,CKSMCT\r
+INTERNAL SWPINT\r
+\r
+SWPINT: TRNE IOS,IODTER!IODERR!IOIMPM\r
+ JRST SWPERR ;ERRORS\r
+ TRZE TAC,FRGSEG ;*FRAGMENTED?\r
+ SKIPL TAC1,SQREQ ;*YES, MORE IOWD TO GO?\r
+ JRST DINT8B ;NO, ALL DONE SWAP IN OR OUT\r
+ AOS SERA ;YES, FRAGMENTED AND MORE TO GO\r
+ SKIPE 1(TAC) ;IS THIS THE END OF SWAP COMMAND LIST?\r
+ AOJA TAC,FRAGIO ;NO, BO DO NEXT PIECE OF FRAGMENTED SEG\r
+\r
+DINT8B: TLNN TAC,400000 ;*INPUT?\r
+ JRST DINT8A ;*NO\r
+ HRRZ TAC,SQREQ\r
+ ADDI TAC,JOBDAC\r
+ HRLI TAC,MJOBCK\r
+ PUSHJ PDP,CHECK\r
+ MOVM TAC,FINISH\r
+ CAME TAC1,JBTCHK(TAC)\r
+ JRST SWPER1\r
+DINT8A: HRRZM IOS,SERA\r
+ SETZM SQREQ\r
+ JRST DINT4B\r
+\r
+SWPER1; MOVSI TAC,100\r
+ ADDM TAC,CKSMCT\r
+ TRO IOS,IODTER\r
+SWPERR: MOVM TAC, FINISH ;*RESET SERA IN CASE OF FRAGMENTED JOB\r
+ HLRZ TAC, JBTSWP(TAC) ;*SWAP LOC (DISK ADR OR TABLE ADR)\r
+ HRRM TAC, SERA ;*RESTORE SERA\r
+ MOVE TAC,ESQREQ ;RESTORE ESQREQ IN CASE OF FRAGMENTED JOB\r
+ MOVEM TAC,SQREQ\r
+ SOSLE SERACT ;*TRIED ENOUGH?\r
+ JRST SQGO1 ;*NO, TRY AGAIN\r
+ JRST DINT8A ;*YES, TOUGH.\r
+\fIFE FTRC10, <\r
+;SWPSER LOGIC FOR THE OLD PDP-6 (DATA PRODUCTS) DISK FILE ---\r
+\r
+;FIND A SERIES OF BLOCKS ON THE DISK TO SWAP ONTO. CALLED\r
+;AT CLOCK LEVEL.\r
+;CALL: MOVEI DAT,NO. OF 1K BLOCKS DESIRED\r
+; PUSHJ PDP,GXSAT\r
+; ERROR EXIT (DISK IS FULL)\r
+; NORMAL EXIT ;C(TAC) = BLOCK NO.\r
+\r
+;CONTENTS OF ACS TAC,TAC1,DAT WILL BE LOST.\r
+\r
+INTERNAL GXSAT\r
+EXTERNAL GETBIT,IPOPJ1\r
+\r
+GXSAT: MOVE AC1,XSAT1 ;SAVE AC1, SET IT TO TABLE LOC.\r
+ MOVE AC2,XSAT2 ;\r
+ LSH DAT,CONVMD ;CONVERT TO 128 WORD DISK BLOCKS\r
+ PUSH PDP,ITEM ;SAVE C(ITEM)\r
+ \r
+ MOVE ITEM,DAT ;GETBIT EXPECTS PARAMETER IN ITEM\r
+ PUSHJ PDP,GETBIT ;FIND A HOLE BIG ENOUGH\r
+ JRST IPOPJ ;NONE, RESTORE ITEM AND ERROR RETURN\r
+ MOVEI TAC,-1(TAC1)\r
+ CAIL TAC,BLOCKS ;IS IT ON DISK 17?\r
+ ADDI TAC,DIFF ;YES\r
+ LSH TAC,-CONVMD ;CARRY DISK ADDRESS SHIFTED TO FIT IN JBTSWP.\r
+ JRST IPOPJ1 ;SKIP RETURN AND RESTORE JOB NUMBER(ITEM)\r
+\r
+;FREE UP A SERIES OF BLOCKS ON THE SWAPPING DEVICE. CALLED\r
+;AT CLOCK LEVEL\r
+;CALL: MOVEI DAT,NO. OF 1K BLOCKS TO FREE\r
+; MOVE TAC,BLOCK NO. OF FIRST DISK BLCOK TO FREE\r
+; PUSHJ PDP,FXSTAT\r
+; ALWAYS RETURN HERE\r
+\r
+;CONTENTS OF ACS TAC,TAC1 WILL BE LOST.\r
+\r
+INTERNAL FXSAT\r
+EXTERNAL CLRBIT,IPOPJ\r
+\r
+FXSAT: LSH TAC,CONVMD ;RESTORE SHIFTED DISK ADDRESS.\r
+ CAIL TAC,HISWAP ;ON DISK 17?\r
+ SUBI TAC,DIFF ;YES\r
+ LSH DAT,CONVMD ;CONVERT TO 128 WORD DISK BLOCKS\r
+ MOVE AC1,XSAT1 ;SET UP AC1 WITH POINTER TO SAT BLOCK\r
+ MOVE AC2,XSAT2 ;AC2 TOO\r
+ PUSH PDP,ITEM ;SAVE C(ITEM)\r
+ MOVE ITEM,DAT ;CLRBIT EXPECTS PARAMETER IN DAT\r
+ PUSHJ PDP,CLRBIT\r
+ JRST IPOPJ ;RETURN, AND RESTORE ITEM\r
+\r
+;INITIALIZE SWAPPER DISK STORAGE TABLE\r
+\r
+INTERNAL SWPINI\r
+\r
+SWPINI: MOVE TAC,XSAT2\r
+ MOVEM TAC,XSAT31\r
+ MOVSI TAC,1B18\r
+ MOVEM TAC,XSAT3\r
+ SETZM XSAT4\r
+ MOVE TAC,XSAT4P\r
+ BLT TAC,XSAT61\r
+ MOVE TAC,XSAT7\r
+ MOVEM TAC,XSAT5\r
+ MOVE TAC,XSAT8\r
+ MOVEM TAC,XSAT6\r
+ POPJ PDPD,\r
+\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL SQREQ,SERA,SERACT,XSAT1,XSAT2,XSAT3,XSAT4,XSAT5,XSAT6,XSAT7\r
+EXTERNAL XSAT8,SWPSIZ,HISWAP,DIFF,CONVMD,BLOCKS,XSAT31,XSAT4P,XSAT61\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+\r
+;DATA AND STORAGE AREA FOR SWAPPING. ON THE 270 DISK, DISKS\r
+; 0 & 17 ARE USED FOR SWAPPING, ECH DISK CONTAINING\r
+; 5400 (OCTAL) RECORDS\r
+\r
+INTERNAL SQREQ,SERA,SERACT\r
+SQREQ: Z ;C(LH)=NEG. OF SIZE OF READ/WRITE\r
+ ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE\r
+ESQREQ: Z ;COPY OF SQREQ, IN CASE OF\r
+ ; ERROR IN FRAGMENTED JOB\r
+SERA: Z ;SIGN IS 1 IF A READ\r
+ ; C(RH)=BLOCK NUMBER BEFORE READING.\r
+ ; ERROR BITS AFTER READING.\r
+SELACT: 0 ;COUNT FOR ERRORS\r
+SQLEN: 0 ;AMOUNT TRANSFERRED SO FAR - FRAG SEG\r
+\r
+XSAT1: EXP XSAT3-1 ;POINTER USED BY GETBIT,CLRBIT\r
+XSAT2: XWD -SWPSIZ,XSAT4 ;POINTER TO BIT TABLE\r
+XSAT3: XWD 400000, ;2-WORD TABLE ALTERED BY GETBIT,CLRBIT\r
+ XWD -SWPSIZ,XSAT4\r
+\r
+ ; BIT TABLE FOR SWAPPING ALLOCATION\r
+XP BLOCKS,5400 ;NUMBER OF RECORDS/DISK PLATE\r
+ W1=BLOCKS/^D36 ;NUMBER OF ZERO WORDS AT TOP OF TABLE\r
+ E1=BLOCKS-W1*^D36 ;LEADING ZERO IN W1+1ST WORD\r
+ EX=BLOCKS+E1-^D35\r
+ W2=EX/^D36 ;ZERO WORDS AT BOTTOM OF TABLE\r
+ E2=EX-W2*^D36 ;LEADING ZEROES IN W1+W2+2ND WORD\r
+\r
+XP XSAT31,XSAT3+1\r
+XSAT4: BLOCK W1\r
+XSAT5: BLOCK W2+1\r
+XSAT6: BLOCK 1\r
+ REPEAT 1,<\r
+ IFE E1,<X=1B0>\r
+ IFN E1,<X1\r
+ REPEAT ^D35-E1,<X=X*2>>\r
+ IFE E2,<Z=-1>\r
+ IFN E2,<Z=0\r
+ X=1\r
+ REPEAT ^D36-E2,<Z=Z+Y\r
+ Y=Y*2>\r
+ >>\r
+XP XSAT61,XSAT6-1\r
+XSAT7: EXP X\r
+XSAT8: EXP Z\r
+\r
+SWPSIZ=XSAT6-XSAT4+1 ;SIZE OF TABLE\r
+HISWAP=17*BLOCKS ;LOGICAL BLOCK NUMBER OF FIRST\r
+ ; BLOCK ON DISK\r
+DIFF=HISWAP-BLOCKS-1\r
+\r
+XP CONVMD,3 ;CONVERSION FROM 1K CORE BLOCKS TO 128 WORD\r
+ ;DISC BLOCKS(SHIFT COUNT)\r
+\r
+XP BLKSPK,CONVMD ;NO. OF BLOCKS PER K, SAME AS CONVMD\r
+XSAT4P: XWD XSAT4,XSAT4+1\r
+>\r
+> ;END OF SWPSER LOGIC FOR THE OLD PDP-6 DISK.\r
+\fIFN FTRC10, <\r
+;SWPSER LOGIC FOR THE NEW PDP-10 (MODEL RC-10) DISK ---\r
+\r
+INTERNAL GXSAT,FXSAT,SWPINI\r
+EXTERNAL GETBIT,CLRBIT\r
+EXTERNAL LBHIGH,IPOPJ,IPOPJ1\r
+\r
+\r
+;SUBROUTINE "GXSAT" IS CALLED TO FIND A SERIES OF CONSECUTIVE FREE BLOCKS ON\r
+; THE DISK TO SWAP SOME JOB OUT ONTO. IT IS CALLED AT CLOCK LEVEL.\r
+\r
+;CALLING SEQUENCE ---\r
+; PUSHJ PDP,GXSAT\r
+; ERROR EXIT --- THE DISK IS FULL, NO SWAPPING SPACE AVAILABLE.\r
+; NORMAL EXIT\r
+;ENTRY CONDITIONS ---\r
+; C(DAT) = NUMBER OF 1K BLOCKS OF DISK STORAGE NEEDED.\r
+;EXIT CONDITIONS ---\r
+; C(TAC) = LOGICAL BLOCK NUMBER (DIVIDED BY 8) OF THE FIRST DISK BLOCK IN\r
+; THE SERIES OF CONSECUTIVE BLOCKS WHICH SATISFY THIS REQUEST.\r
+;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE.\r
+\r
+GXSAT: PUSH PDP,ITEM ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM".\r
+ MOVE ITEM,DAT\r
+ MOVEI AC1,SWPENT ;SET UP ENTRY CONDITIONS FOR THE "GETBIT" SUBROUTINE.\r
+ MOVE AC2,SWPENT\r
+ PUSHJ PDP,GETBIT\r
+ JRST IPOPJ ;NO ROOM IN THE SWAPPING PART OF THE DISK.\r
+ ADDI TAC1,-1(ITEM) ;ROOM FOUND--COMPUTE LOGICAL BLOCK NUMBER OF THIS\r
+ CAMLE TAC1,MAXSWP ;FIRST BLOCK IN A SERIOES OF CONSECUTIVE FREE DISK\r
+ MOVEM TAC1,MAXSWP ;BLOCKS. THE "SWPTAB" TABLE SEARCHED HAS ONE BIT\r
+ LSH TAC1,BLKSPK ;FOR EACH 1K OF SWAPPING DISK SPACE. BUT IS STORED\r
+ SUB TAC1,LBHIGH ;BACKWARDS (1ST BIT OF SWPTAB = LAST 1K OF DISK).\r
+ MOVM TAC,TAC1 ;ALSO UPDATE "MAXSWP" IF PREVIOUS MAXIMUM EXCEEDED.\r
+ LSH TAC,-BLKSPK ;COMPRESS DISK ADDRESS TO 17 BITS FOR LH OF JBTSWP\r
+ AOJA TAC,IPOPJ1 ;ADD 1 TO TAC AND RESTORE ITEM AND SKIP RETURN\r
+\f;SUBROUTINE "FXSAT" IS CALLED TO RETURN A SERIES OF CONSECUTIVE DISK BLOCKS TO\r
+; THE FREE STORAGE POOL. THUS MAKING THEM AVAILABLE FOR RE-USE IN HANDLING\r
+; FUTURE SWAPPING REQUESTS. IT IS CALLED AT CLOCK LEVEL.\r
+\r
+;CALLING SEQUENCE ---\r
+; PUSHJ PDP,FXSAT\r
+; NORMAL EXIT\r
+;ENTRY CONDITIONS ---\r
+; C(TAC) = LOGICAL BLOCK NUMBER OF THE FIRST DISK BLOCK IN THE\r
+; SERIES WHICH IS TO BE MADE AVAILABLE.\r
+; C(DAT) = NUMBER OF CONSECUTIVE 1K BLOCKS OF DISK SPACE WHICH\r
+; ARETO BE MADE AVAILABLE.\r
+;EXIT CONDITIONS ---\r
+; THE REQUESTED BITS IN THE SWAPPING SPACE AVAILABILITY TABLE\r
+; (NAMELY, SWPTAB) HAVE BEEN CLEARED TO ZERO.\r
+;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE.\r
+\r
+FXSAT: TRZN TAC,FRGSEG ;FRAGMENTED?\r
+ JRST FXSAT1 ;NO. DO IN REGULAR WAY\r
+\r
+FRAGRK: HRRZ AC3,TAC ;YES. LOC OF TABLE IN AC3\r
+FRGBK1: HRRZ TAC,(AC3) ;LOC OF NEXT DISK ADDRESS\r
+ HLRE DAT,(AC3) ;NUMBER OF K\r
+ JUMPLE DAT,FRGBK2 ;GIVE UP FREE CORE IF NOT REAL ADDRESS\r
+ PUSHJ PDP,FXSAT1 ;GIVE UP THE DISK SPACE FOR THIS PART\r
+ AOBJP AC3,FRGBK1 ;COUNT WORD OF TABLE, GET NEXT\r
+FRGBK2: HRRZ TAC,AC3 ;LOC OF TABLE\r
+ PUSH PDP,ITEM\r
+ HLRZ ITEM,AC3 ;NUMBER OF WDS IN TABLE\r
+ SUB TAC,ITEM ;POINT TAC TO 1ST WORD OF BLOCK\r
+ LSH ITEM,-2 ;4 WDS PER BIT\r
+ AOS ITEM\r
+ PUSHJ PDP,CLCOR1 ;GIVE UP FREE CORE\r
+ POP PDP,ITEM\r
+ SKIPE TAC,(AC3) ;END OF TABLE?\r
+ JRST FRAGBK ;NO, GO CHASSE NEXT PART\r
+ POPJ PDP, ;YES, DONE\r
+\r
+FXSAT1: PUSH PDP,ITEM ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM".\r
+ MOVE ITEM,DAT\r
+ LSH TAC,BLKSPK ;REGENERATE THREE LOW ORDER 0 BITS IN DISK ADDRESS.\r
+ SUB TAC,LBHIGH ;PREPARE TO CLEAR BITS IN THE SWAPPING\r
+ MOVMS TAC ; AVAILABLITY TABLE BY TRANSFORMING THE LOGICAL\r
+ ADDI TAC,1 ; BLOCK NUMBER TO AN EQUIVALENT BIT NUMBER IN THIS\r
+ MOVNI AC1,BLKSPK ; TABLE (WHICH IS STORED IN REVERSE ORDER AND HAS\r
+ LSH TAC,(AC1) ; ONE BIT PER 1K OF SWAPPING SPACE ON THE DISK).\r
+ SUB TAC,DAT\r
+ MOVEI AC1,SWPENT\r
+ MOVE AC2,SWPENT ;SET UP ENTRY CONDITIONS FOR THE "CLRBIT" SUBROUTINE.\r
+FXSATC: PUSHJ PDP,CLRBIT ;THE "CLRBIT" SUBROUTINE IN "DSKSER" ACTUALLY DOES\r
+ ; THE WORK OF CLEARING THE BITS.\r
+ JRST IPOPJ ;RESTORE ITEM AND RETURN\r
+;ROUTINE TO RE-INITIALIZE THE SWAPPING AVAILABILITY TABLE. CALLED AT\r
+; SYSTEM INITIALIZATION TIME.\r
+\r
+ EXTERN VIRTAL,SWPHGH\r
+\r
+SWPINI: MOVE TAC,LBHIGH ;SET HIGHEST LOGICAL BLOCK\r
+ MOVEM TAC,SWPHGH ;FOR SWAPPING IN COMMON\r
+ MOVNI TAC,1 ;SET ENTIRE TABLE TO ONES, I.E., MARK EVERYTHING\r
+ MOVE TAC1,SWPENT ; AS BEING UNAVAILABLE FOR SWAPPING.\r
+ MOVEM TAC,(TAC1)\r
+ AOBJN TAC1,.-1\r
+ MOVEI AC1,SWPENT ;THEN USE THE "CLRBIT" ROUTINE TO CLEAR OUT AS MANY\r
+ MOVE AC2,SWPENT ; BITS AT THE FRONT OF THE TABLE AS THERE ARE 1K DISK\r
+ MOVE ITEM,K4SWAP ; AREAS ALLOCATED FOR SWAPPING USE. THE PARAMETER\r
+ MOVEM ITEM,VIRTAL ;TOTAL AMOUNT OF VIRTUAL CORE ALLOWED\r
+ ; IS JUS EQUAL TO AMOUNT OF SWAPPING SPACE\r
+ ; EVEN IF USER CAN NOT HAVE ALL OF PHYSICAL USER CORE\r
+\f MOVEI TAC,0 ; "K4SWAP" IS SET UP DURING DISK REFRESHING, AND\r
+ ; RECALLED FROM THE DISK AT EACH SYSTEM-INITIALIZE.\r
+ JRST CLRBIT ;IN LIEU OF "PUSHJ CLRBIT" FOLLOWED BY "POPJ".\r
+\fIFN FTCHECK+FTMONP,<\r
+EXTERNAL RCXSDT ;DUMMY GLOBAL SYMBOL TO PERMIT THE SYSTEM BUILDER TO\r
+ ; RETRIEVE THE CORRECT BINARY COPY OF "SCHDAT".\r
+EXTERNAL SQREQ,SERA,SERACT\r
+EXTERNAL LBHIGH,BLKSPK,MAX2SWP,SWPENT,SWPTAB,MAXSWP\r
+>\r
+\r
+IFE FTCHECK+FTMONP,<\r
+;DATA ASSOCIATED WITH THE SWPSER LOGIC FOR THE NEW PDP-10 DISK ---\r
+\r
+ INTERN MXK2SWP,CONVMD,BLKSPK,SWAPTAB,MAXSWP\r
+ EXTERN K4SWAP\r
+;THE ABOVE ARE REFERENCED OR INITIALIZED BY THE "ONCE" ROUTINE.\r
+\r
+;C(LOWSWP)=LOWEST LOGICAL BLOCK NUMBER TO BE USED FOR SWAPPING\r
+;DETERMINED BY ONCE ONLY REFRESH DIALOG\r
+;C(K4SWAP)=MAX. NO. OF K DISK WORDS ALLOCATED FRO SWAPPING, ALS\r
+;DETERMINED BY ONCE ONLY REFRESH DIALOG\r
+MAXSWP: 0 ;MAX. NO. OF K FROM TOP TO LOWEST JOB\r
+ ; USED SINCE SYSTEM BEGAN\r
+;C(MAXSWP)=MAX. NO. OF K EVER ASSIGNED COUNTING FROM TOP DOWN TO\r
+;LOWEST EXCURSION, INCLUDING HOLS. WHEN = C(K4SWAP), THEN FREAGMENTATION HAD\r
+;HAPPENED SOMETIME DURING THE PAST\r
+BLKSPK=3 ;SHIFT FACTOR TO CONVERT K OF CORE TO DISK BLOCKS, I.E.,\r
+ ; EIGHT DISK BLOCKS PER K OF CORE.\r
+CONVMD=BLKSPK ;ONLY FOR CONSISTENCY WITH OLDER PDP-6 ROUTINE.\r
+MXK2SWP=^D1000 ;MASIMUM NUMBER OF 1K DISK BLOCKS WHICH MIGHT BE ALLOCATED\r
+ ; FOR SWAPPING (UPPER BOUND ON THE VALUE OF K4SWAP WHICH\r
+ ; MAY BE REQUESTED AT DISK REFRESH TIME). (ONE MILLION WORDS\r
+ ; FOR SWAPPING SEEMS LIKE A NON-RESTRICTIVE ARBITRARY LIMIT.)\r
+SWPSIZ=MXK2SWP/.^D36+1 ;SIZE OF SWPTAB ALLOCATION TABLE.\r
+\r
+SWPENT: XWD -SWPSIZ,SWPTAB ;THREE WORD POINTER TABLE\r
+ XWD 400000,0 ; REQUIRED BY THE "GETBIT" AND\r
+ XWD -SWPSIZ,SWPTAB ; "CLRBIT" SUBROUTINES.\r
+\r
+SWPTAB: BLOCK SWPSIZ ;SWAPPING SPACE AVAILABILITY TABLE.\r
+\r
+;DATA CARRIED OVER FROM THE COMMON PART OF OLD AND NEW SWPSER ROUTINES ---\r
+INTERNAL SQREQ,SERA,SERACT,ESQREQ\r
+SQREQ: Z ;C(LH)=NEG. OF SIZE OF READ/WRITE\r
+ ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE\r
+ESQREQ: Z ;COPY OF SQREQ, IN CASE OF SWAP ERROR IN FRAGMENTED JOB\r
+SERA: Z ;SIGN IS 1 IF A READ\r
+ ; C(RH)=BLOCK NUMBER BEFORE READING.\r
+ ; ERROR BITS AFTER READING.\r
+SELACT: 0 ;COUNT FOR ERRORS\r
+SQLEN: 0 ;AMOUNT TRANSFERRED SO FAR FOR FRAGMENTED JOB\r
+>\r
+> ;END OF SWPSER LOGIC FOR THE NEW PDP-10 DISK.\r
+\fSCHEND: END\r
--- /dev/null
+TITLE SCNSRF - SCANNER AND CONSOLE TELETYPE SERVICE ROUTINE - V415\r
+SUBTTL R CLEMENTS.RCC TS 03 JUN 69\r
+ XP VSCNSF,415\r
+\r
+ENTRY SCNSRF\r
+SCNSRF:\r
+\r
+\r
+;SCANSER IS ORGANIZED INTO THE FOLLOWING SECTIONS\r
+\r
+; I. COMMENTARY ON OPERATION AND DATA STRUCTURES\r
+; II. SYSTEM INITIALIZATION ROUTINE - SCNINI\r
+; III. UUO LEVEL ROUTINES\r
+; A. DDTIN\r
+; B. DDOUT\r
+; C. TTYUUO\r
+; D. TTYIN\r
+; E. TTYOUT\r
+; IV. COMAND LEVEL ROUTINES\r
+; A. TTYATT\r
+; B. TTYCOM\r
+; C. TTYDCM\r
+; D. TTYDET\r
+; E. TTYFND,TTYFNU\r
+; F. TTYKIL\r
+; G. TTYSET\r
+; H. TTYSRC\r
+; I. TTYSTC\r
+; J. TTYTLK\r
+; K. TTYUSR\r
+; V. INTERRUPT SERVICE ROUTINES\r
+; A. CTYINT\r
+; B. SCNINT\r
+; C. RFCINT - ALL LINES RECEIVER INTERRUPT\r
+; 1. TTEDIT - EDITS AND ECHOS\r
+; D. XMTINT - TRANSMIT INTERRUPT\r
+; 1. GETCHR\r
+; 2. TYP\r
+\f;DATA STRUCTURES AND PARAMETERS\r
+\r
+; DEFINED BY BUILD PROCESS FOR THE CONFIGURATION\r
+; SCNLIN=OCTAL NO. OF SCANNER LINES (0 THRU SCNLIN-1)\r
+\r
+; TRANSLATOR TABLE PARAMETERS\r
+; TTYLEN=SCNLIN+1 LENGTH OF TTY TRANSLATOR TABLE (INCLUDING CTY)\r
+; TTYTAB: BLOCK TTYLEN TTY TRANSLATOR TABLE\r
+; SIGN BIT=1 IF COMMAND JUST TYPED\r
+; BIT 1 =1 IF DELAYED COMMAND\r
+; BITS 3-11 = JOB NO TTY IS ATTACHED TO (TPCJOBN)\r
+; BITS 12-17=TALK RING LINE # (PTALK)\r
+; BITS 18-35=ADDR. OF DEVICE DATA BLOCK\r
+; FOR THIS LINE.\r
+; DEVOPR: 0 SIXBIT PHYSICAL NAME OF OPERATORS\r
+; CONSOLE\r
+\r
+; DEFINED IN IOINI2\r
+; LINE NUMBER PARAMETERS\r
+; MLTTYL=-NO. OF TTY DEVICE DATA BLOCKS\r
+; TCONLN=SCNLIN CTY LINE NUMBER\r
+; MTTYLN=-TTYLEN -LENGTH OF TRANSLATOR TABLE\r
+; TTYLST=TTY0D0 FIRST TTY DEVICE DATA BLOCK\r
+\r
+; TTY DEVICE DATA BLOCK FORMAT\r
+; (STANDARD IS AS DEFINED ON SYSTEM PARAMETER TAPE)\r
+; DEVNAM: PHYSICAL DEVICE NAME SET UP DYNAMICALLY\r
+; VIA SCNIN0.\r
+; DEVCHR: LEFT HALF IS STANDARD\r
+; BITS 18-23=LINE NUMBER(BYTE POINTER=PUNIT)\r
+; BITS 24-35=MONITOR BUFFER SIZE + 1\r
+\f; DEVIOS: LEFT HALF\r
+; 1,2,4,20,40 ARE STANDARD\r
+ USRB=100 ;SET TTY TO USER MODE\r
+ ;WHEN OUTPUT FINISHES\r
+ IOSUPR=200 ;SUPPRESS ALL OUTPUT\r
+ ;TILL NEXT INPUT OR INIT (^O).\r
+ TRMON=400 ;TTY IS IN MONITOR\r
+ ;COMMAND MODE.\r
+ DDTM=1000 ;DDT MODE\r
+ TTYDTC=2000 ;TTY DDB IS DETACHED FROM LINE\r
+ SYNC=20000 ;BREAK CHARACTER SEEN\r
+ ;SIGNAL TO INCREMENT SYNC COUNT\r
+ ;FOR BUFFER INVOLVED\r
+ TTYIOW=400000 ;TTY INPUT WAIT BIT\r
+\r
+IFNDEF FTHDPX,<FTHDPX=-1> ;NON-ZERO TO INCLUDE HALF-DUPLEX CODE\r
+IFNDEF FTDDTM,<FTDDTM=-1> ;NON-ZERO TO IUNCLUDE CALLI DDTIN,OUT\r
+\r
+FTTTYSER=-1 ;DEFINE THIS SYSTEM TO HAVE SCNSRF\r
+\r
+INTERN FTTTYSER ;ASSURE MULT DEF GLOBALS IF WRONG APSER\r
+\f; RIGHT HALF BITS (USER MODE0\r
+ FCS=100 ;FULL CHARACTER SET. PASS\r
+ ;ON ALL CHARACTERS EXCEPT ^C\r
+ ;NO SPECIAL CHARACTER PROCESSING\r
+ NOECHO=200 ;ECHO SUPPRESSION REQ BY PROG\r
+ DLRSUP=400 ;400 SUPPPRES "$" FOR ALTMODE\r
+ MERTPO=IOIMPM ;MONITOR ERROR TYPE-OUT\r
+ IGNOR=IODERR ;IGNORE ALL INT, FOR 1/2\r
+ ;OF A SECOND WHEN ECHO\r
+ ;FAILURE OCCURS.\r
+ ECHOF=IODTER ;ECHO FAILURE OCCURED.\r
+; DEVSER: STANDARD\r
+; DEVBUF: STANDARD\r
+; DEVIAD: BITS 6-12=HORIZONTAL POSITION (BYTE\r
+; POINTER = PHPOS).\r
+; BITS 13-35 ARE STANDARD.\r
+; DEVOAD: BITS 0-8=NUMBER OF CHARACTERS TO FIT\r
+; ;INTO OUTPUT BUFFER\r
+; (POINTER= PFITCH)\r
+; BITS 13-35 ARE STANDARD\r
+\r
+;THE FOLLOWING ARE DEFINITIONS OF THE RELATIVE LOCATIONS OF THE\r
+;BUFFER PARAMETER WORDS OF THE DEVICE DATA BLOCK FOR EACH BUFFER. WITH\r
+;TTX'BUF AS THE BASE (DETAILED DESCRIPTIN IN SCNDDB COMMENTS):\r
+\r
+ XP BUF,0 ;BUF(DAT) CONTAINS POINTER TO BEG. OF CURRENT BUFFER\r
+ XP PUTR,1 ;PUTR(DAT)-PUTS CHARACTER INTO BUFFER\r
+ XP PCTR,2 ;NUMBER OF TIMES TO INCR. PUTR BEFORE REINITING\r
+ XP TAKR,3 ;TAKER POINTER TO PICK UP CHARACTERS\r
+ XP TCTR,4 ;COUNT OF NUMBER OF TIMES TAKR CAN BE INCREMENTED\r
+ XP FCTR,5 ;COUNT OF FREE SPACES LEFT IN BUFFER\r
+\f;DEFINITION OF LINE CHARACTERISTICS TABLE BITS\r
+;LINTAB MADE BY SYSTEM BYUILDER\r
+;FOLLOWING IS FORMAT AS SET UP BY SCNINI\r
+; XWD BITS,LOGICAL LINE#\r
+\r
+EXTERNAL LINTAB\r
+\r
+PTYLIN=400000 ;THIS LINE LINKED TO PTY\r
+CTYLIN=200000 ;THIS "LINE" IS CONSOLE DEVICE "TTY"\r
+DISLIN=100000 ;THIS LINE IS TO A DISPLAY KEYBOARD\r
+DSDTLN=40000 ;DATA SET DATA LINE\r
+DSCTLN=20000 ;DATA SET CONTROL LINE\r
+HLFDPX=10000 ;HALF DUPLEX LINE\r
+TTYRMT=4000 ;REMOTE TTY LINE\r
+\r
+;ABOVE ARE "PERMANENT" CHARACTERISTICS\r
+\r
+TLKRNG=1 ;THIS LINE CURRENTLY IN A TALK RING\r
+XON=2 ;^Q TYPED, PAPER TAPE INPUT\r
+\r
+FULTWX=4 ;SELF ECHOING FULL DUPLEX\r
+T35=10 ;MODEL 35\r
+T37=20 ;MODEL 37\r
+ROBTPB=40 ;RUBOUT TYPED LAST (ECHO \ BEFORE NEXT CHAR.)\r
+LINRDY=100 ;LINE TYPED IN BY USER (TISYNC .G.0)\r
+ ; NOT ACTUALLY IN LINTAB. BUT RETURNED BY\r
+ ; GETLIN IN TTCALL\r
+\r
+;ABOVE ARE TEMPORARY BITS, TURNED ON AND OFF BY VARIOUS MEANS\r
+;(BY MONITOR, TYPE-IN COMMANDS, OR PROGRAM)\r
+\r
+LGLSET=T37+T35+FULTWX+XON ;THESE CAN BE SET OR ZEROED BY PROGRAM\r
+KILMSK=ROBTPB+TLKRNG+XON ;CLEARED AT TTYKIL\r
+\r
+;DECLARE THESE AS INTERNS TO GET THEM IN THE MAP\r
+;AND TO CHECK AGAINST S IN COMMON\r
+\r
+INTERNAL PTYLIN,CTYLIN,DISLIN,DSDTLN,DSCTLN,HLFDPX,TTYRMT\r
+INTERNAL T35,T37,FULTWX,LGLSET,KILMSK,XON\r
+\f;ACCUMULATOR ASSIGNMENTS\r
+\r
+ CHREC=TEM ;AC FOR CHARACTER\r
+ DDB=DEVDAT ;ADDRESS OF DEVICE DATA BLOCK\r
+ LINE=TAC1 ;SCANNER LINE NUMBER\r
+ HPOS=ITEM ;HORIZONTAL POSITION OF TTY,(0-71)\r
+\r
+;SPECIAL SYMBOLS\r
+\r
+ PION=200 ;TURN PI ON BIT\r
+ PIOFF=400 ;TURN PI OFF BIT\r
+\r
+ IDLECH=1 ;DELAY CHAR FOR TABS, ETC,\r
+ ; SHOULD BE ^V, BUT FOR 37'S\r
+\r
+;BYTE POINTERS\r
+\r
+INTERNAL TPCJOBN,TYPX,FULTWX,TYPE,TAKR,BREAKB\r
+\r
+PHPOS: POINT 7,DEVIAD(DEVDAT),12 ;HORIZONTAL POSITION\r
+TPCJOBN:POINT 9,TTYTAB(LINE),11 ;JOB NUMBER FOR TTY.\r
+PSAVCH: POINT 7,TTYPTR(DDB),10 ;SAVE CHAR TO ECHO ON UUO LEVEL\r
+\r
+INTERNAL FTTALK\r
+\r
+IFN FTTALK,<\r
+ PTALK: POINT 6,TTYTAB(LINE),17 ;POINTER TO ANOTHER TTY IN TALK RING\r
+>\r
+\r
+INTERN PLASTC,PCOMIC\r
+\r
+PLASTC: POINT 7,TTYPTR(DDB),35 ;FOR EACH CHECKING ON HDX LINES\r
+PCOMIC: POINT 9,TTYPTR(DDB),19 ;FOR RESCANNING COMMAND INPUT LINE\r
+ ;"COMMAND INPUT COUNTER" SAVES TITCTR\r
+PLSTLC: POINT 9,TTYPTR(DDB),28 ;FOR ^U DELETION\r
+\r
+TOIP=400000 ;SIGN OF TTYPTR(DDB) - TYPE-OUT IN PROGRESS\r
+\r
+;TTYPTR CONTAINS THE FOLLOWING BYTES:\r
+;\r
+; 0 ON IF TYPE-OUT IN PROGRESS\r
+; 1-3 SPARE\r
+; 4-10 PSAVCH, FOR INTERRUPTED ECHO\r
+; 11-19 PCOMIC, FOR COMMAND RESCAN\r
+; 20-28 PLSTLC, FOR ^U\r
+; 29-35 PLASTC, FOR EACH CHECKING HALF DUPLEX LINES\r
+\f;SCNINI IS CALLED AT SYSTEM INITIALIZATION TIME FROM\r
+;IOGO IN SYSINI VIA DISPATCH TABLE\r
+;IT 1)CLEARS ALL RECEIVER FLAGS.\r
+; 2)CLEARS THE PHYSICAL NAME (DEVNAM) OF ALL UNUSED\r
+; (TTYUSE=0) TTY DEVICE DATA BLOCKS,\r
+; 3)SETS DEVIOD TO XWD TPMON+IOFST,0 IN ALL TTY DEVICE\r
+; DATA BLOCKS.\r
+; 4)SETS TTYUSE#1 IN ALL TTY DDBS IN THE TRANSLATOR TABLE.\r
+\r
+EXTERNAL SCNSCH,MLTTYL,MTTYLN,TTYTAB,SCNINI\r
+\r
+TTYINI: MOVEI TAC,SCNCHN\r
+ CONO TTY,1200(TAC) ;CLEAR CTY, ASSIGN CHANNEL\r
+ PUSHJ PDP,SCNINI ;DEVICE DEPENDENT SCANNER INIT\r
+ MOVSI TAC1,MLTTYL ;NO. OF TTY DEV. DATA BLOCKS. NOT LINES\r
+ MOVSI IOS,TPMON+IOFST ;VIRGIN STATUS\r
+ MOVEI DDB,TTYLST ;FIRST TTY DDB ADDRESS\r
+\r
+SCN1: MOVSI DAT,TTYUSE ;TTY DDB IN USE BIT\r
+ TDNN DAT,DEVMOD(DDB) ;IS THIS TTY DDB IN USE?\r
+ SETZM DEVNAM(DDB) ;NO, SET PHYSICAL NAME TO 0.\r
+ MOVEM IOS,DEVIOS(DDB) ;SET IOS TO INITIAL STATE\r
+ ANDCAM DAT,DEVMOD(DDB) ;CLEAR TTYUSE BIT.\r
+ SETZM TTYPTR(DDB) ;CLEAR TOIP, ETC\r
+ MOVSI TAC,TTYCHR ;NUMBER OF CHARACTERS IN BUFFER\r
+ HRRI TAC,TIBF(DDB) ;ADDRESS OF TTY INPUT BUFFER\r
+ MOVEM TAC,TTIBUF(DDB) ;SET IT UP\r
+ HRRI TAC,TOBF(DDB) ;ADDRESS OF TTY OUTPUT BUFFER\r
+ MOVEM TAC,TTOBUF(DDB) ;SET UP INFO FOR THAT\r
+ PUSHJ PDP,TSETBF ;CLEAR MONITOR BUFFERS\r
+ HLRZ DDB,DEVSER(DDB) ;GET NEXT TTY DDB\r
+ AOBJN TAC1,SCN1\r
+ MOVSI TAC1,MTTYLN ;SET DDB USE BITS FROM TRANSLATOR TABLE\r
+SCN2: MOVSI TAC,TTYUSE\r
+ SKIPE DDB,TTYTAB(TAC1)\r
+ IORM TAC,DEVMOD(DDB)\r
+ HRRZ TA,TAC1 ;SET UP PERMANENT LINTAB BITS\r
+ CAIGE TAC,TCONLN ;ORDINARY TTY LINE?\r
+ JRST SCN3 ;YES\r
+ CAIE TAC,TCONLN ;CTY LINE?\r
+ TLOA TAC,PTYLIN ;NO. MUST BE PTY LINE NR\r
+ TLO TAC,CTYLIN+T35 ;YES\r
+SCN3: HRRM TAC,LINTAB(TAC1) ;SET LOG. LINE NUMBERS\r
+ IORB TAC,LINTAB(TAC1) ;SET SIGNIFICANT BITS\r
+ TLZ TAC,KILMSK ;ZAP INSIGNIFICANT BITS\r
+ TLNE TAC,DSDTLN ;IF A DATAPHONE,\r
+ TLZ TAC,LGLSET ; CLEAR OTHERS TOO\r
+ HLLM TAC,LINTAB(TAC1) ;LEAVING REST OF BITS AS THEY WERE\r
+ AOBJN TAC1,SCN2\r
+ POPJ PDP,\r
+\f;ROUTINES TO SET UP BUFFERS\r
+\r
+INTERNAL TSETBF,SETBFI,PUTCHI\r
+\r
+SETBFI: MOVEI DAT,1\r
+ DPB DAT,PCOMIC\r
+ DPB DAT,PLSTLC\r
+ MOVEI DAT,TTIBUF(DDB) ;SPECIFY INPUT BUFFER\r
+ SETZM TISYNC(DDB) ;NO LINES IN BUFFER\r
+ JRST SETBF0 ;INIT BUFFER\r
+\r
+TSETBF: PUSHJ PDP,SETBFI ;INIT TTI BUFFER\r
+SETBF2: MOVEI DAT,TTOBUF(DDB) ;SPECIFY OUTPUT BUFFER\r
+SETBF0: MOVE TAC,BUF(DAT)\r
+ HRLI TAC,440700 ;INITIAL TAKR AND PUTR\r
+ MOVEM TAC,TAKR(DAT)\r
+ MOVEM TAC,PUTR(DAT)\r
+ MOVEI TAC,1 ;INITIALIZE COUNTERS TOO\r
+ MOVEM TAC,TCTR(DAT)\r
+ MOVEM TAC,PCTR(DAT)\r
+ HLRZ TAC,BUF(DAT) ;CHARACTER COUNT\r
+ MOVEM TAC,FCTR(DAT) ;UPDATE FREE CHARACTER COUNT\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
+; PUSHJ PDP,PUTCHI\r
+; ERROR RETURN, BUFFER "FULL"\r
+; SUCCESSFUL RETURN\r
+\r
+PUTCHI: SOSGE FCTR(DAT) ;ANY FREE SPACES LEFT?\r
+ JRST PUTCI0 ;NO\r
+PUTCI2: SOSLE PTCR(DAT) ;LAST BYTE IN BUFFER FILLED?\r
+ JRST PUTCI1 ;NO, GO AHEAD\r
+ PUSH PDP,TAC\r
+ MOVE TAC,BUF(DAT) ;GET ADR AND SIZE OF BUFFER\r
+ HLRZM TAC,PCTR(DAT) ;INITIAL COUNTER\r
+ HRLI TAC,440700 ;MAKE A BYTE POINTER\r
+ MOVEM TAC,PUTR(DAT) ;STORE IT\r
+ POP PDP,TAC ;RESTORE TAC\r
+PUTCI1: IDPB CHREC,PUTR(DAT)\r
+ JRST CPOPJ1\r
+\r
+;ROUTINE TO STUFF MONITOR ERROR MESSAGE IN TTI BUFFER\r
+;CALLED IN LINE FROM PUTCH0\r
+\r
+TTIOUT: MOVE IOS,DEVIOS(DDB)\r
+ AOS TOFCTR(DDB) ;RE-ADJUST FREE CHAR COUNT\r
+ TRNN IOS,MERTPO ;MONITOR ERROR MESSAGES?\r
+ JRST GETCH1 ;NO, ZERO CHREC TO INDICATE\r
+ MOVEI DAT,TTIBUF(DDB) ;YES, PUT REST IN TTI BUFFER\r
+ SOSGE FCTR(DAT) ;ANY SPACE?\r
+ JRST PUTCI0 ;NO.\r
+ SOS 0(PDP) ;YES, COMPENSATE SKIP RETURN\r
+ JRST PUTCI2 ;AND GO TO MIDDLE OF PUTCHI\r
+\f;CHARACTER AND BUFFER HANDLING ROUTINES\r
+\r
+;ROUTINE TO PICK UP A CHARACTER FROM ANY BUFFER\r
+;CALL MOVEI DAT,TTXBUF(DDB) ;TO SPECIFY BUFFER\r
+; PUSHJ PDP,GETCHR\r
+; ONLY RETURN ;CHARACTER OR ZERO IN CHREC\r
+; ;ZERO INDICATES BUFFER "EMPTY"(TAKR=PUTR)\r
+\r
+INTERNAL GETCHR\r
+\r
+GETCHR: HLRZ CHREC,BUF(DAT) ;SIZE OF THIS BUFFER\r
+ CAMG CHREC,FCTR(DAT) ;IS FREE COUNTER EQUAL TO SIZE?\r
+ ;I.E., IS THE BUFFER EMPTY?\r
+ JRST GETCH1 ;YES. LOAD CHREC WITH ZERO AND EXIT\r
+ SOSLE TCTR(DAT) ;NO, ARE WE AT END OF BUFFER?\r
+ JRST GETCH2 ;YES. GO ON.\r
+ MOVE CHREC,BUF(DAT) ;YES. START AT TOP AGAIN\r
+ HLRZM CHREC,TCTR(DAT) ;INITIAL COUNTER\r
+ HRLI CHREC,440700 ;MAKE A BYTE POINTER\r
+ MOVEM CHREC,TAKR(DAT) ;INITIAL POINTER\r
+GETCH2: ILDB CHREC,TAKR(DAT) ;GET CHARACTER\r
+ AOS FCTR(DAT) ;INCREMENT FREE CHAR. COUNT\r
+ JUMPE CHREC,GETCHR ;SKIP NULLS\r
+ POPJ PDP,\r
+GETCH1: TDZA CHREC,CHREC ;RETURN 0 INDICATING END OF BUFFER\r
+PUTCI0: AOS FCTR(DAT) ;READJUST FREE COUNTER\r
+ POPJ PDP,\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
+; PUSHJ PDP,PUTCHO\r
+; ONLY RETURN, WHETHER OR NOT CHARACTER WAS PLACED\r
+\r
+PUTCHO: SOSGE TOFCTR(DDB) ;RETURN IMMEDIATELY IF NO ROOM\r
+ JRST TTIOUT ;UNLESS MONITOR ERROR MESSAGE\r
+ CONO PI,PIOFF ;PREVENT PCTR AND PUTR DIFFERENCE\r
+ SOSLE TOPCTR(DDB) ;LAST BYTE IN BUFFER?\r
+ JRST PUTCO1 ;NO. GO ON.\r
+ MOVE TAC,TTOBUF(DDB) ;GET COUNT AND ADDRESS\r
+ HLRZM TAC,TOPCTR(DDB) ;INITIAL COUNTER\r
+ HRLI TAC,440700 ;MAKE A BYTE POINTER\r
+ MOVEM TAC,TOPUTR(DDB) ;INITIAL POINTER\r
+PUTCO1: IDBP CHREC,TOPUTR(DDB) ;PUT CHARACTER INTO BUFFER\r
+ CONO PI,PION ;GET PI BACK ON\r
+ POPJ PDP,\r
+\f;ROUTINE TO CHECK IF A CHARACTER IS SPECIAL(ASCII 0-37, 175-177)\r
+;CALL MOVE CHREC,CHAR. TO BE CHECKED\r
+; PUSHJ PDP,SPCHEK\r
+; RETURN1 IF REGULAR ASCII CHAR (40-174), C(TAC)=0\r
+; RETURN2 IF SPECIAL CHAR., TAC LOADED WITH WORD FROM SPCTAB\r
+\r
+INTERNAL SPCHEK\r
+\r
+SPCHEK: MOVEI TAC,0 ;LOAD TAC WITH 0 OR SPECIAL CHAR. WORD\r
+ CAIGE CHREC,40\r
+ JRST SPCHK1\r
+ CAIG CHREC,174\r
+ POPJ PDP,\r
+ SKIPA TAC,SPCTAB-135(CHREC)\r
+\r
+SPCHK1: MOVE TAC,SPCTAB(CHREC)\r
+ JRST CPOPJ1\r
+\f;SPECIAL CHARACTER TABLE\r
+;FORMAT XWD BITS+CHAR,ADRESS OF ROUTINE\r
+;HIGH ORDER BITS IN LH:\r
+\r
+SPACTN=40000 ;SPECIAL ACTION TO BE TAKEN\r
+SPOUT=100000 ;SPECIAL HANDLING ON UUO OUTPUT\r
+BREAKB=20000 ;BREAK CHARACTER\r
+SPHPOS=10000 ;CHARACTER AFFECTS HORIZONTAL POSITION\r
+ECSBRK=4000 ;BREAK CHARACTER IN FCS(100) MODE\r
+ECHSUP=2000 ;SUPRESS ECHO OF CHAR ITSELF\r
+\r
+SPCTAB: XWD ECHSUP,0 ;NULL\r
+ XWD ECHSUP,0 ;^A SOH\r
+ XWD SPACTN+ECHSUP,CONTB ;^B FULTWX SH\r
+ XWD SPACTN+ECHSUP+BREAKB,CONTC ;^C\r
+ XWD ECHSUP,0 ;^D EOT\r
+ XWD ECHSUP,0 ;^E WRU\r
+ XWD SPACTN+ECHSUP,CONTF ;^F T37 SW\r
+ XWD FCSBRK,0 ;^G (BELL)\r
+ XWD SPACTN+SPHPOS,CONTH ;^H OR BACKSPACE KEY\r
+ XWD SPACTN+SPHPOS+SPOUT,CONTI ;^I OR TAB\r
+ XWD BREAKB,0 ;^J OR LINE FEED\r
+ XWD SPACTN+SPOUT+BREAKB,CONTK ;^K OR VERT TAB\r
+ XWD SPACTN+SPOUT+BREAKB,CONTL ;^L OR FORM FEED\r
+ XWD SPACTN+SPHPOS,CRLF ;^M OR CARRIAGE RETURN\r
+ XWD ECHSUP,0 ;^N\r
+ XWD SPACTN,CONTO ;^O SUPP OUTPUT\r
+ XWD SPACTN+ECHSUP,CONTP ;^P T35 SW\r
+ XWD SPACTN+ECHSUP,CONTQ ;^Q XON (PAPERTAPE)\r
+ XWD ECHSUP,0 ;^R TAPE PUNCH OFF\r
+ XWD SPACN+ECHSUP,CONTS ;^S XOFF\r
+ XWD ECHSUP,0 ;^T TAPE PUNCH OFF\r
+ XWD SPACTN,CONTU ;^U DELETE LINE\r
+ XWD ECHSUP,0 ;^V\r
+ XWD ECHSUP,0 ;^W\r
+ XWD ECHSUP,0 ;^X\r
+ XWD ECHSUP,0 ;^Y\r
+ XWD SPACTN+BREAKB+ECHSUP,CONTZ ;^Z TTY EOF\r
+ XWD SPACTN+BREAKB+ECHSUP,ALTMOD ;ASCII 33 (ALT-MODE)\r
+ XWD ECHSUP,0 ;ASCII 34\r
+ XWD ECHSUP,0 ;ASCII 35\r
+ XWD ECHSUP,0 ;ASCII 36\r
+ XWD ECHSUP,0 ;ASCII 37\r
+\r
+;ABOVE ARE CONTROL CHARACTERS, BELOW ASCII 175-177\r
+\r
+ XWD SPACTN+BREAKB+ECHSUP,ALTMOD ;OLD DEC ALTMOD 175\r
+ XWD SPACTN+BREAKB+ECHSUP,ALTMOD ;ALT-MODE 176\r
+ XWD SPACTN+ECHSUP+FCSBRK,RUBOUT ;177 RUBOUT\r
+\fIFN FTDDTM,<\r
+\r
+;INPUT TO DDT\r
+;CALL AC,[SIXBIT /DDTIN/] AC CONTAINS POINTER TO BUFFER AREA\r
+;BUFFER AREA MUST BE 21 WORDS LONG\r
+\r
+INTERNAL DDTIN\r
+EXTERNAL WSYNC,IADRCK,ADRERR\r
+EXTERNAL PTYOW\r
+\r
+DDTIN: PUSHJ PDP,TTYFNU ;SET UP DEVDAT,LINE\r
+ MOVE IOS,[XWD TTYIOW+DDTM,IOACT]\r
+ IORB IOS,DEVIOS(DDB) ;PUT INTO I/O WAIT\r
+ MOVE TAC,TIPUTR(DDB)\r
+ CAMN TAC,TITAKR(DDB) ;ANYTHING IN BUFFER;\r
+ PUSHJ PDP,TWSYNC ;NO, WAIT FOR SOME\r
+DDTIW: MOVE IOS,[XWD TTYIOW,IOACT]\r
+ ANDCAB IOS,DEVIOS(DDB)\r
+\r
+ MOVSI TAC,IOFST+DDTM\r
+ IORM TAC,DEVIOS(DEVDAT) ;STOP ALL IO\r
+ HRRZ TAC,@UUO ;CONTENTS OF USER (DDT) AC\r
+ ADDI TAC,21\r
+ PUSHJ PDP,IADRCK\r
+ JRST ADRERR\r
+ SUBI TAC,21\r
+ PUSHJ PDP,IADRCK\r
+ JRST ADRERR\r
+ MOVSI AC2,440700+PROG\r
+ HRR AC2,TAC\r
+ MOVE TAC1,TIPUTR(DDB)\r
+ MOVEI DAT,TTIBUF(DDB)\r
+ MOVEI AC1,<21*5>-1 ;NUMBER OF CHARACTERS ALLOWED\r
+\fXFRIN: PUSHJ PDP,GETCHR ;TRANSFER INTO USER'S AREA\r
+ JUMPE CHREC,XFRIN2\r
+ PUSHJ PDP,SPCHEK\r
+ JRST XFIN1\r
+ TLNE TAC,FCSBRK+BREAKB\r
+ SOS TISYNC(DDB)\r
+XFRIN1: CAIN CHREC,3 ;PRESTORED CONTROL C?\r
+ JRST DDONC ;YES, GO INTO MONITOR MODE\r
+ IDPB CHREC,AC2\r
+ SOJG AC1,XFRIN ;LOOP TILL DONE\r
+XFRIN2: MOVEI CHREC,0 ;TERMINATE STRING\r
+ IDPB CHREC,AC2\r
+ MOVSI TAC,IOSUPR ;MAKE SURE IO NO LONGER SUPR.\r
+ ANDCAM TAC,DEVIOS(DEVDAT)\r
+ POPJ PDP,\r
+\r
+DDTCNC: PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS\r
+ JRST MONUS6 ;GO PROCESS ^C\r
+>\r
+\r
+EXTERNAL PTYOW,WSYNC\r
+\r
+;TWSYNC IS CALLED FOR INPUT IO WAIT\r
+\r
+TWSYNC: TLNE LINE,PTYLIN ;PSEUDO TELETYPE TTYDDB?\r
+ PUSHJ PDP,PTYOW ;SET OUTPUT WAIT BIT IN PTY DEVIOS WORD\r
+ TLNE LINE,XON ;DO WE WANT TO START RDR?\r
+ TLNE LINE,PTYLIN+HLFDPX+FULTWX ;CAN WE?\r
+ JRST WSYNC ;NO\r
+ MOVEI CHREC,21 ;READER START CHAR\r
+ PUSHJ PDP,OUTCHS ;TO OUTPUT BUFFER\r
+ PUSHJ PDP,UTYPET ;START TTY, AND\r
+ JRST WSYNC ;WAIT FOR INPUT\r
+\fEXTERNAL WSYNC,IADRCK,ADRERR,CPOPJ\r
+EXTERNAL JOBPFI,GETWD1\r
+\r
+IFN FTDDTM,<\r
+;OUTPUT FROM DDT\r
+;CALL AC,[SIXBIT /DDTOUT/] AC HAS POINTER TO DDT OUTPUT BUFFER\r
+\r
+INTERNAL DDTOUT\r
+\r
+DDTOUT: PUSHJ PDP,TTYFNU\r
+ MOVE UUO,@UUO\r
+>\r
+\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
+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
+ JRST DDT2 ;NO, GET ANOTHER WORD\r
+DDT4: ILDB CHREC,DAT ;BYTE FROM TAC\r
+ JUMPE CHREC,DDTUTT ;NULL IS END OF STRING\r
+ PUSHJ PDP,OUTCHR ;PLACE CHAR IN OUTPUT BUFFER\r
+ JUMPN CHREC,DDT3 ;LOOP IF CHARACTER WAS PLACED\r
+ ADD DAT,[XWD 070000,0] ;BACK UP POINTER\r
+ PUSH PDP,DAT ;SAVE BYTE POINTER TO TAC\r
+ PUSH PDP,TAC ;AND SAVE THE CHARS IN TAC\r
+ PUSHJ PDP,DDTUTT ;START OUTPUT\r
+\r
+DDTWAT: MOVEI IOS,IOACT ;WAIT UNTIL MONITOR BUFFER EMPTY\r
+ IORB IOS,DEVIOS(DDB)\r
+ PUSHJ PDP,WSYNC\r
+ POP PDP,TAC ;RESTORE CHARSIN TAC\r
+ POP PDP,DAT ;RESTORE BYTE POINTER TO TAC\r
+ JRST DDT3 ;TRY AGAIN\r
+\r
+DDTUTT: PUSHJ PDP,TTYFNU ;RESTORE DAT,LINE\r
+ JRST UTYPET ;AND START OUTPUT\r
+\f;MORE CHARACTER AND BUFFER HANDLING ROUTINES\r
+\r
+;OUTCHR CALLED AT UUO LEVEL TO OUTPUT A CHARACTER\r
+;DAT AND DDB MUST BE SET UP\r
+;CHECK IS MADE FOR WHETHER SPECIAL ECHO IS REQUIRED\r
+;RIGHT THINGS ARE DONES WITH PHPOS & HPOS(NEEDNT BE SET)\r
+;CALL MOVE CHREC,CHAR TO BE OUTPUT\r
+; PUSHJ PDP,OUTCHR\r
+; ONLY RETURN, WITH CHAR, OR ITS SPECIAL ECHO PLACED IN OUT BUFFER\r
+\r
+INTERNAL OUTCHS\r
+\r
+OUTCHR: TLNE IOS,IOSUPR ;I/O OFF BY ^O?\r
+ POPJ PDP, ;YES. RETURN\r
+ MOVEI HPOS,20 ;CHECK FREE SPACE\r
+ CAML HPOS,TOFCTR(DDB) ; FOR EXPANDING CHARS\r
+ JRST GETCH1 ;NOT ENOUGH ROOM\r
+OUTCHS: PUSH PDP,TAC\r
+ PUSH PDP,HPOS\r
+ PUSH PDP,TAC1 ;SAVE LINE\r
+ PUSHJ PDP,STLNAC ;GET LINE DATA\r
+ ANDI CHREC,177 ;MASK ANYT JUNK\r
+ LDB HPOS,PHPOS ;GET HORIZONTAL POSITION\r
+ PUSHJ PDP,ADJHP ;NEW HPOS AFTER CHAR OUTPUT\r
+ JFCL\r
+ TLNE LINE,DISLIN+PTYLIN ;IS IT A DISPLAY OR PTY?\r
+ JRST OUTCH2 ;YES, IGNORE HPOS AND FILLERS\r
+ CAIL HPOS,^D72 ;DID IT GO OVER LINE?\r
+ PUSHJ PDP,CRLFEC ;YES, OUTPUT CRLF\r
+ TLNE TAC,SPOUT ;VT,FF,HT?\r
+ JUMPGE LINE,OUTCH1 ;YES, HANDLE THEM UNLESS PTY\r
+OUTCH2: PUSHJ PDP,PUTCHO ;PLACE IN BUFFER\r
+OUTCH3: DPB HPOS,PHPOS ;UPDATE IN CORE\r
+ POP PDP,TAC1 ;RESTORE LINE\r
+ POP PDP,HPOS\r
+ JRST TPOPJ\r
+\f;HERE ON UUO OUTPUT OF HT,FF,VT\r
+\r
+OUTCH1: PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS\r
+ TLNE LINE,T35 ;SMART TTY?\r
+ JRST OUTC1A ;YES\r
+ MOVE TAC,CHREC ;COPY THE CHARACTER\r
+ MOVEI CHREC,40 ;STUPID TTY.\r
+ LDB HPOS,PHPOS ;GET OLD POSITION\r
+ CAIE TAC,11 ;H TAB?\r
+ MOVEI CHREC,12 ;NO. OUTPUT LF'S.\r
+OUTC1C: CAIN TAC,14 ;FF?\r
+ MOVNI HPOS,10 ;YES. 8 LF'S\r
+ CAIN TAC,13 ;VT?\r
+ MOVNI HPOS,4 ;YES. 4 LF'S\r
+OUTC1B: PUSHJ PDP,PUTCH0 ;OUTPUT THE PHONEY CHAR\r
+ ADDI HPOS,1 ;COUNT THE OUTPUTS\r
+ TRNE HPOS,7 ;ENOUGH?\r
+ JRST OUTC1B ;NO. MORE.\r
+ JRST OUTCH3 ;NO MORE.\r
+\r
+OUTC1A: ;HERE ON OUTPUT OF SLOW CHARS TO SMART TTY\r
+ PUSHJ PDP,PUTCH0 ;SENT THE REAL CHAR\r
+ MOVE TAC,CHREC ;COPY THE CHARACTER\r
+ MOVEI CHREC,IOLECH ;A DELAY CHARACTER\r
+ SUBI HPOS,2 ;TWO SHLUFF CHARACTERS\r
+ JRST OUTC1C ;GO OUTPUT THE SLUFFS.\r
+ ;COUNT WILL BE MODIFIED ON VT,FF\r
+\r
+ ;CALLED AT UUO AND INT LEVEL\r
+ ;TO ADJUST HPOS FOR OUTPUT OF CHREC\r
+ ;SKIPS IF SPCHECK SAYS SPECIAL CHAR\r
+\r
+ADJHP: CAIL 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
+ CAIN CHREC,10 ;BACKSP?\r
+ SOJL HPOS,.+2 ;YES\r
+ CAIN CHREC,15 ;CARRIAGE RETURN?\r
+ MOVEI HPOS,0 ;YES.\r
+ CAIE CHREC,11 ;TAB?\r
+ JRST SPCHEK ;NO. NO HP MOD\r
+ TRO HPOS,7 ;TAB. TO NEXT 8\r
+ AOJA HPOS,SPCHEK\r
+\fINTERNAL FTCHECK,FTMONP\r
+IFN FTCHECK+FTMONP,<\r
+EXTERNAL SCNDDB,TTYLST,TTIBUF,TIPUTR,TITAKR,TITCTR,TIFCTR,TISYNC\r
+EXTERNAL TTOBUF,TOPUTR,TOPCTR,TOTAKR,TTYCHR,SCNDDS,CCHAR,LINSAV\r
+EXTERNAL TOTCTR,TOFCTR\r
+>\r
+IFE FTCHECK+FTMONP,<\r
+\f;DESCRIPTION OF DEVICE DATA BLOCK FOR TELETYPES\r
+;THERE IS ONE DEVICE DATA BLOCK FOR EACH JOB THAT CAN BE INITIALIZED\r
+;UNDER TIME-SHARING, WHETHER THIS JOB IS ATTACHED TO A PHYSICAL LINE\r
+;NUMBER OR NOT, THEREFORE THERE SHOULD BE ONE DDB FOR EVERY LINE NUMBER\r
+;PLUS ONE FOR EVERY PSEUDO-TELETYPE PLUS ONE FOR EVERY ADDITIONAL JOB\r
+;THAT AN INSTALATION MAY WISH TO RUN DETACHED FROM A PHYSICAL LINE\r
+;PLUS ONE DDB TO PRINT ERROR MESSAGES WHEN ALL JOBS (DDB'S ARE\r
+;INITIALIZED.\r
+;THE FUNCTIONS OF THE FIRST EIGHT WORDS ARE AS DESCRIBED IN THE\r
+;COMMENTS IN THE SYSTEM PARAMETER TAPE( FILE NAME S). LOCATION 11\r
+;THROUGH 27 (OCTAL) RELATIVE TO SCNDDB PERTAIN DIRECTLY TO THE\r
+;SCANNER SERVICE BUFFERING SCHEME. THE SUBSEQUENT 2*20(OCTAL) LOCATIONS\r
+;ARE CURRENTLY THE TWO TELETYPE BUFFERS. THEY NEED NOT BE IN THE DDB\r
+;AS LONG AS THEIR ADDRESSES ARE PLACED IN THE RIGHT HALF OF TTIBUF.\r
+;AND TTOBUF EITHER AT ASSEMBLY, BUILD OR RUN TIME, IF DYNAMIC\r
+;BUFFER CONSTRUCTION IS TO BE ADDED THESE BUFFERS MAY BE PLACED ANYWHERE IN\r
+;FRE CORE STORAGE, AND THE RIGHT HALF OF THE REQUIRED TTXBUF(WHERE "X"\r
+;MAY BE "I" OR "O")MAY BE LOADED ONLY WHEN THAT BUFFER IS REQUIRED.\r
+\r
+;THERE ARE TWO BUFFERS, EACH OF WHICH IS A "RING" UNTO ITSELF:\r
+;INPUT---POINTED TO BY TTIBUF\r
+; ALL CHARACTERS TYPED GO INTO THIS BUFFER, IN ADDITION, ALL\r
+;OTHER COMMANDS TO BE READ BY THE COMMAND INTERPRETER IN COMCON\r
+;(APRSER) ARE STORED HERE,\r
+;OUTPUT BUFFER---POINTED TO BY TTOBUF\r
+; ALL CHARACTERS THAT ARE OUTPUT ARE PLACED SEQUENTIALLY IN THIS\r
+;BUFFER; THIS INCLUDES ECHOED CHARACTERS AS WELL AS NORMAL OUTPUT OF\r
+;CHARACTER STRINGS.\r
+\r
+;THERE ARE NINE BUFFER PARAMETER WORDS ASSOCIATED WITH EACH BUFFER\r
+;(EXCEPT FOR THE OUTPUT BUFFER, WHICH ONLY NEEDS SIX), THE LAST\r
+;FOUR CHARACTERS IUN THE MNEMONIC DESCRIBES THE FUNCTION OF THE WORD\r
+;WHILE THE FIRST TWO CHARACTERS IDENTIFY WHICH BUFFER THAT THE\r
+;FUNCTION APPLIES TO. THE FORMULA FOR THESE WORDS IS TX'FUNC, WHERE\r
+;THE RELATIVE POSITION OF ALL TX'FNC1 TO TTX'BUF IS THE SAME FOR\r
+;ALL BUFFERES. IN THE MANNER, THE ADDRESS OF TTX'BUF IS LOADED INTO\r
+;ACCUMULATOR DAT, AND THE RELATIVE POSITIONS FUNCT1-FUNCT9 ARE\r
+;DEFINED TO BE 0-10(OCTAL); I.E., FUNCT(DAT) WILL IDENTIFY THE DESIRED\r
+;BUFFER PARAMETER WORD REGARDLESS OF BUFFER.\r
+\f;FOLLOWING ARE DEFINITIONS OF THE RELATIVE BUFFER PARAMETER WORDS:\r
+;TTX'BUF OR BUF(DAT)---THE LEFT HALF CONTAINS NUMBER OF BYTES IN BUFFER AND THE RIGHT\r
+; HALF THE ADDRESS OF THE FIRST WORD OF THE BUFFER, THIS WORD IS\r
+; ONLY READ BY THE CURRENT CODE. UPON THE ADDITION OF DYNAMIC\r
+; BUFFER ALLOCATION. THIS WORD WOULD BE LOADED IN THE SAME FORMAT\r
+; AT THE TIME THAT THE BUFFER WOULD BE BUILT.\r
+;\r
+;SCNINI SETS BUFFERS TO LENGTH TTYCHR AT PRESENT. ALSO\r
+;PRESENT CODE OCCASIONALLY USES TTYCHR RATHER THEN READING LH\r
+;OR TTXBUF\r
+;\r
+;TX'PUTR OR PUTR(DAT)---BYTE POINTER USED TO PLACE CHARACTERS INTO THE\r
+; BUFFER. IT MUST ALWAYS BE AHEAD OF OR EQUAL TO THE TAKER POINTER.\r
+;TX'PCTR OR PCTR(DAT)---COUNT OF NUMBER OF TIMES THAT PUTR MAY BE INCREMENTED\r
+; BEFORE REACHING THE LAST BYTE IN THE LAST WORD OF THE BUFFER\r
+; (NOT THE AMMOUNT OF FREE SPACE LEFT)\r
+;TX'TAKR OR TAKR(DAT)---BYTE POIUNTER USED BY ALL ROUTINES TO PICK UP\r
+; CHARACTERS FRM THE BFFER. WHEN THE TAKR IS EQUAL TO THE PUTR.\r
+; THE BUFFER IS "EMPTY".\r
+;TX'TCTR OR TCTR(DAT)---COUNT OF THE NUMBER OF TIMES THAT THE TAKR CAN\r
+; BE INCREMENTED BEFORE REACHING THE PHYSICAL END OF THE BUFFER.\r
+;TX'FCTR OR FCTR(DAT)---FREE CHARACTER COUNT; I.E., HOW MANY TIMES MAY THE\r
+; PUTR BE INCREMENTED BEFORE IT WOULD COME AROUND AND "STEP ON"\r
+; THE TAKR, WHEN THE FREE CHAR. COUNT IS ZERO, NO MORE CHARACTERS\r
+; MAY BE PLACED IN THE BUFFER (USUAL RESULT IS GOING INTO IO WAIT)\r
+;TISYNC---COUNT OF NUMBER OF "LINES" THAT HAVE BEEN TYPED\r
+; INTO INPUT BUFFER.\r
+\f;SCANNER DEVICE DATA BLOCK\r
+;REMAINING SCN DDB'S ARE GENERATED\r
+;OUT OF LINE AT BUILD TIME.\r
+\r
+INTERNAL SCNDDB,LINSAV\r
+ TTYLST=. ;FIRST TTT DDB\r
+ ZZ=.\r
+SCNDDB: SIXBIT /TTY0/ ;DEVNAME\r
+ XWD 0,STTYBF+1 ;DEVCHR\r
+ Z ;DEVIOS\r
+ EXP SCNDSP ;DEVSER\r
+ XWD DVTTY+DVIN+DVOUT,3 ;DEVMOD\r
+ Z ;DEVLOG\r
+ Z ;DEVBUF\r
+ XWD PROG,0 ;DEVIAD, PHPOS BITS 6-12\r
+ XWD PROG,0 ;DEVOAD, PFITCH BITS 0-8\r
+ XP TTYPTR,.-ZZ ;TTYPTR\r
+ Z ;PLASTC,PLSTLC,PCOMIC,POSAVCH,TOIP\r
+ XP TISYNC,.-ZZ\r
+ Z\r
+ XP TTIBUF,.-ZZ\r
+ XWD STTYBF*5,0 ;RH IS BUFFER ADR\r
+ XP TIPUTR,.-ZZ\r
+ Z\r
+ XP TIPCTR,.-ZZ\r
+ Z\r
+ XP TITAKR,.-ZZ\r
+ Z\r
+ XP TITCTR,.-ZZ\r
+ Z\r
+ XP TIFCTR,.-ZZ\r
+ Z\r
+\f XP SYSPDL,.\r
+;BUFFER USED AS PUSH-DOWN LIST BY SYSTEM DURING\r
+;INITIALIZATION AND RESTARTING\r
+\r
+ XP TIBF,.-ZZ\r
+ REPEAT STTYBF,< 0>\r
+ XP TTOBUF,.-ZZ\r
+ XWD STTYBF*5,0\r
+ XP TOPUTR,.-ZZ\r
+ Z\r
+ XP TOPCTR,.-ZZ\r
+ Z\r
+ XP TOTAKR,.-ZZ\r
+ Z\r
+ XP TOTCTR,.-ZZ\r
+ Z\r
+ XP TOFCTR,.-ZZ\r
+ Z\r
+\f XP TOBF,.-ZZ\r
+ REPEAT STTYBF,<0>\r
+;NO. OF CHAR. IN MON. BUF.\r
+\r
+ XP TTYCHR,<<STTYBF>*5>\r
+ XP SCNDDS,.-ZZ ;SIZE OF SCN DDB\r
+\r
+LINSAV: 0\r
+> ;CLOSE IFE FTMONP WAY BACK\r
+\f;DEVICE DEPENDENT PART OF IO UUOS.\r
+\r
+\r
+;DISPATCH TABLE\r
+\r
+INTERNAL SCNDSP\r
+EXTERNAL OUT,SCNON,SCNOFF\r
+\r
+ JRST TTYINI ;INITIALIZATION\r
+ JRST CPOPJ1 ;TTY HUNG TIME-OUT, IGNORE\r
+SCNDSP: JRST TTYREL ;RELEASE\r
+ JRST OUT ;CLOSE\r
+ JRST TTYOUT ;OUTPUT\r
+\r
+TTYIN: MOVE IOS,[XWD TTYIOW,IOACT] ;INDICATE INPUT WAIT\r
+ IORB IOS,DEVIOS(DDB)\r
+ MOVSI IOS,DDTM+TPMON\r
+ ANDCAB IOS,DEVIOS(DDB)\r
+ PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS\r
+IFN FTHDPX,<\r
+ TLNE LINE,HLFDPX\r
+ TLNN IOS,IO\r
+>\r
+TTYIN1: SKIPG TISYNC(DDB)\r
+ PUSHJ PDP,TWSYNC\r
+ PUSHJ PDP,MONUSR\r
+TENDIN: MOVE IOS,[XWD TTYIOW+DDTM+IOSUPR,ECHOF+MERTP+IGNOR+IOACT]\r
+T0POPJ: ANDCAB IOS,DEVIOS(DDB)\r
+ POPJ PDP,\r
+\f;ROUTINE TO MOVE A LINE OR STRING FROM TTY INPUT BUFFER TO USER'S INPUT BUFFER\r
+;CALLED ONLY FROM UUO LEVEL,FROM INPUT UUO ONLY\r
+\r
+EXTERNAL ADVBFF,STTIOD,BUFCLR\r
+\r
+MONUSR: HRRZ TAC,DEVIAD(DDB) ;ADDRESS OF BUFFER IN USER AREA\r
+ PUSHJ PDP,BUFCLR ;CLEAR WHOLE BUFFER\r
+ JRST ADRERR ;ADDRESS CHECK RETURN\r
+ PUSHJ PDP,STLNAC ;SETUP LINE\r
+ MOVEI AC2,TTYCHR ;MAX NR OF CHARACTERS\r
+ MOVEI AC1,@DEVIAD(DDB) ;ADDRESS OF USR BUFFER-1\r
+ ADD AC1,[XWD 10700,1] ;MAKE BYTE POINTER POINT RIGHT\r
+ MOVEI DAT,TTIBUF(DDB) ;SPECIFY USER MODE INPUT BUFFER\r
+\r
+MONUS1: PUSHJ PDP,GETCHR ;GET A CHAR, FROM IT\r
+ JUMPE CHREC,MONUS3 ;ZERO IMPLIES EMPTY BFR\r
+ IDPB CHREC,AC1 ;PLACE CHAR. IN USER BUFFER\r
+ PUSHJ PDP,SPCHEK ;SPECIAL CHARACTER?\r
+ JRST MONUS2 ;NO\r
+\r
+ TLNE TAC,FCSBRK+BREAKP ;A BREAK CHARACTER?\r
+ SOSA TISYNC(DDB) ;SOME BREAK, COUNT IT DOWN\r
+MONUS2: SOJG AC2,MONUS1 ;NO, USER BUFFER FULL?\r
+ CAIN CHREC,3 ;STORED CONTROL C?\r
+ JRST MONUS7 ;YES, HANDLE IT\r
+ MOVEI IOS,0\r
+ CAIN CHREC,"Z"-100 ;^Z READ?\r
+ MOVSI IOS,IOEND\r
+ IORB IOS,DEVIOS(DDB)\r
+\r
+MONUS3: MOVEI AC2,@DEVIAD(DDB) ;BREAK CHAR OR COUNTED OUT, INPUT UUO DONE\r
+ SUBI AC1,1(AC2) ;CALCULATE NUMBER OF WORDS\r
+ HRRM AC1,1(AC2) ;STORE IN 3RD BUFFER WORD\r
+\r
+MONUS4: PUSHJ PDP,ADVBFF ;INPUT UUO DONE,NEXT BUFFER FULL?\r
+ JRST MONUS5 ;YES, INPUT REALLY IS DONE\r
+ SKIPLE TISYNC(DDB) ;NO, DO WE HAVE MORE LINES FOR IT?\r
+ JRST MONUS8 ;YES, GIVE USER NEXT LINE, TOO\r
+\r
+MONUS5: MOVSI IOS,IOFST\r
+ IORB IOS,DEVIOS(DDB)\r
+ TLZE IOS,IOW ;TTY IN INPUT WAIT?\r
+ PUSHJ PDP,STTIOD ;YES., TAKE IT OUT OF IT\r
+ POPJ PDP,0\r
+\fMONUS6: PUSHJ PDP,CNCMOD ;CONTROL C MODE\r
+ MOVSI TAC,70000 ;DECREMENT TAKR POINTER\r
+ ADDM TAC,TITAKR(DDB) ;SO NEXT ILDB WILL GET ^C\r
+ AOS TITCTR(DDB) ;ADJUST COUNTER\r
+ SOS TIFCTR(DDB) ;ADJUST FREE CHAR. COUNT\r
+ AOS TISYNC(DDB) ;SEE THE ^C AGAIN\r
+ PUSHJ PDP,COMSET ;WAKE UP COMMAND DECODER\r
+ JRST WSYNC ;AND WAIT FOR INTERPRETATION\r
+\r
+MONUS7: MOVE IOS,[XWD TTYIOW,IOACT]\r
+ IORB IOS,DEVIOS(DDB) ;PUT JOB BACK IN IOWAIT\r
+ PUSHJ PDP,MONU6\r
+ JRST TTYIN ;RESTART INPUT UUO\r
+\r
+MONUS8: TLNN IOS,IOEND ;ROOM FOR ANOTHER BUFFER, ^Z SEEN?\r
+ JRST MONUSR ;NO, GO PASS ANOTHER LINE\r
+ POPJ PDP, ;YES, LET UUOCON HANDLE EOF\r
+\f;OUTPUT UUO\r
+\r
+EXTERNAL PTYPE,ADVBFE\r
+\r
+TTYOUT: MOVSI IOS,IOBEG\r
+ TDNE IOS,DEVIOS(DDB)\r
+ TLO IOS,IOSUPR ;KILL ^O ON FIRST OUTPUT\r
+ IOR IOS,[XWD TPMON+DDTM,ECHOF+MERTPO+IGNOR+IOACT]\r
+ ANDCAM IOS,DEVIOS(DDB)\r
+ MOVSI IOS,IO+IOFST\r
+ IORB IOS,DEVIOS(DDB)\r
+\r
+ PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS\r
+ PUSH PDP,LINE ;SAVE INFO\r
+ PUSHJ PDP,USRMON ;MOVE USER'S BUFFER TO TTO BUFFER\r
+ PUSHJ PDP,ADVBFE ;ADVANCE USER'S HEADERS\r
+ SKIPA\r
+ JRST .+3 ;MOVE BUFFERS AVAILABLE\r
+\r
+ MOVEI IOS,IOACT ;NO MORE BUFFERS\r
+ ANDCAB IOS,DEVIOS(DDB) ;CLEAR ACTIVE IN IOS\r
+ POP PDP,LINE ;RESTORE LINE INFO\r
+UTYPET: JUMPL LINE,PTYPE ;START PTY EXCHANGE IF PTY LINE\r
+ MOVSI TAC,TOIP\r
+ CONO PI,PIOFF ;PREVENT TIMING GLITCH\r
+ TDNN TAC,TTYPTR(DDB) ;IS TYPE-OUT ALREADY ON?\r
+ JRST UTYPE1\r
+ CONO PI,PION\r
+ POPJ PDP,0\r
+\r
+UTYP1: IORM TAC,TTYPTR(DDB) ;START TYPEOUT\r
+ JRST XMTIN1\r
+\f;ROUTINE TO MOVE USER OUTPUT BUFFER TO MON. OUTPUT BUFFER\r
+;CALLED ONLY AT UUO LEVEL,BY OUTPUT UUO\r
+\r
+EXTERN UADRCK\r
+\r
+USRMON: MOVEI AC2,@DEVOAD(DDB) ;ADDRESS OF 2ND BUFFER WORD\r
+ MOVE AC2,1(AC2) ;NUMBER OF WORDS TO OUTPUT\r
+ IMULI AC2,5 ;NR OF CHARACTERS\r
+\r
+USRMN1: HRRZ AC1,DEVOAD(DDB) ;ADDRESS OF BUFFER\r
+ PUSHJ PDP,UADRCK ;MAKE SURE IT IS OK\r
+ ADD AC1,[XWD 10700+PROG,1] ;MAKE POINTER RELOCATABLE\r
+\r
+USRMN2: ILDB CHREC,AC1 ;PICK UP CHARACTER\r
+USRMN4: JUMPE CHREC,USRMN5 ;IF NULL, IGNORE\r
+ PUSHJ PDP,OUTCHR ;PLACE IN OUTPUT BUFFER\r
+ JUMPE CHREC,USRMN3 ;IF NO MORE ROOM IN MON. BUFFER\r
+\r
+USRMN5: SOJG AC2,USRMN2 ;LOOP AS LONG AS THERE ARE CHAR'S,\r
+ POPJ PDP, ;DONE\r
+\r
+USRMN3: PUSH PDP,AC2 ;NUMBER OF CHARACTERS TO GO\r
+ PUSH PDP,AC1 ;SAVE RELOCATABLE POINTER\r
+ MOVE LINE,-3(PDP) ;GET SAVED LINE CHAR WORD\r
+ PUSHJ PDP,TTOUWS ;WAIT FOR ID\r
+ POP PDP,AC1 ;RESTORE POINTER\r
+ POP PDP,AC2 ;RESTORE COUNT\r
+ MOVE IOS,DEVIOS(DDB) ;RESTORE IOS\r
+ LDB CHREC,AC1 ;GET LAST CHARACTER\r
+ JRST USRMN4 ;RETURN TO OUT LOOP\r
+\r
+TTOUWS: MOVE IOS,[XWD IO,IOACT] ;SET DEVICE ACTIVE (TTY)\r
+ IORB IOS,DEVIOS(DDB)\r
+ PUSHJ PDP,UTYPET ;START TYPING IF NEEDED\r
+ JRST WSYNC ;WAIT TILL ROOM IN BUFFER\r
+\f;TTCALL - QUANTITY IN AC FIELD DETERMINES ACTION OF UUO (051)\r
+\r
+INTERNAL TTYUUO\r
+EXTERN UADCK1\r
+\r
+TTYUUO: PUSHJ PDP,TTYFNU\r
+ CAIL UCHN,TTUUOL ;TOO HIGH AC FIELD?\r
+ POPJ PDP, ;YES, NO-OP\r
+ CAIE UCHN,1 ;A READ OPERATION?\r
+ CAIN UCHN,3 ;I.E., PURE?\r
+ JRST @TTUUOT(UCHN) ;YES. DONT ADR CHECK\r
+ HRRZ AC1,UUO\r
+ PUSHJ PDP,UADCK1\r
+ JRST @TTUUOT(UCHN) ;DISPATCH TO UUO ROUTINES\r
+\r
+TTUUOT: EXP INCHRW ;(0)INPUT CHAR. WAIT TILL TYPED\r
+ EXP ONEOUT ;(1)OUTPUT A CHARACTER\r
+ EXP INCHRS ;(2)INPUT A CHAR. & SKIP\r
+\r
+ EXP OUTSTR ;(3)OUTPUT A STRING\r
+ EXP INCHWL ;(4)INPUT CHAR, WAIT.LINE MODE\r
+ EXP INCHSL ;(5)INPUT CHAR, SKIP. LINE MODE\r
+ EXP GETLIN ;(6)GET LINE CHARACTERISTICS WORD\r
+ EXP SETLIN ;(7)SET BITS IN LH LINTAB\r
+ EXP TRESOU ;(10)BACK UP POINTER TO COMMAND\r
+ EXP SETBFI ;(11)CLEAR INPUT BUFFER\r
+ EXP SETBF2 ;(12)CLEAR OUTPUT BUFFER\r
+ EXP SKPINC ;(13)SKIP IF CHAR TO INPUT\r
+ EXP SKPINL ;(14)SKIP IF LINE TO INPUT\r
+\r
+TTUUOL=.-TTUUOT\r
+\f;INPUT A CHARACTER AND SKIP---IF NONE TYPED, DON'T SKIP\r
+\r
+INCHSL: SKIPG TISYNC(DDB) ;ANY LINES IN BUFFER?\r
+ POPJ PDP,0 ;NO, RETURN\r
+INCHRS: MOVEI DAT,TTIBUF(DDB) ;GET A CHARACTER\r
+ PUSHJ PDP,GETCHR ;FROM TTI BUFFER\r
+ JUMPE CHREC,CPOPJ ;RETURN IF NULL(EMPTY BUFFER)\r
+ PUSHJ PDP,SPCHEK\r
+ JFCL\r
+ TLNE TAC,FCSBRK+BREAKB\r
+ SOS TISYNC(DDB) ;KEEP BREAK COUNT RIGHT\r
+ PUSHJ PDP,TENDIN ;CLEAR UP IOACT, IOSUPR, ETC\r
+ CAIN CHREC,3\r
+ JRST MONUS6 ;STORED ^C\r
+ MOVEM CHREC,@UUO ;MOVE INTO LOC, SPECIFIED BY UUO\r
+ JRST CPOPJ1 ;AND SKIP RETURN\r
+\r
+;INPUT CHARACTER AND WAIT, LINE MODE\r
+\r
+INCHWL: PUSHJ PDP,INCHSL ;SEE IF ANY CHARS.\r
+ JRST .+2 ;NO\r
+ POPJ PDP,0 ;YES. GIVE IT TO USER\r
+ MOVE IOS,[XWD TTYIOW,IOACT] ;NONE, WAIT FOR IT\r
+ IORM IOS,DEVIOS(DDB) ;TTY TO IOW STATE\r
+ MOVSI IOS,DDTM ;JUST IN CASE\r
+ ANDCAB IOS,DEVIOS(DDB) ;CLEAR DDTMODE BREAK FLAG\r
+ PUSHJ PDP,TWSYNC ;WAIT FOR CHAR\r
+ JRST INCHWL ;AND TRY AGAIN\r
+\r
+;OUTPUT A STRING\r
+\r
+OUTSTR: JRST DDT5 ;JUST USE DDT OUTPUT CODE\r
+\r
+SKPINL: SKIPLE TISYNC(DDB) ;INPUT BUFFER HAVE A LINE?\r
+ AOS 0(PDP) ;YES, SKIP.\r
+ POPJ PDP,0 ;RETURN\r
+\r
+SKPINC: HLRZ TAC,TTIBUF(DDB) ;SIZE OF IN BUFFER\r
+ CAMLE TAC,TIFCTR(DDB) ;SIZE > # FREE CHARS?\r
+ AOS 0(PDP) ;YES. SKIP.\r
+ POPJ PDP,0 ;RETURN.\r
+\f;MORE ROUTINES CALLED BY TTY UUO DISPATCHER\r
+\r
+EXTERNAL TTPLEN,GETWDU\r
+\r
+;INCHRW GOES INTO I/O WAIT IF NO CHARACTER HAS BEEN TYPED--NO SKIPS\r
+\r
+INCHRW: PUSHJ PDP,INCHRS ;GET ACHAR IF ONE IS THERE\r
+ JRST .+2 ;NONE THERE\r
+ POPJ PDP, ;CHAR, PICKED UP AND STORED\r
+ MOVE IOS,[XWD TTYIOW+ODTM,IOACT][ ;SETUP FOR IOWAIT\r
+ IORB IOS,DEVIOS(DDB) ;SPECIFICALLY FOR INPUT WAIT\r
+ PUSHJ PDP,TWSYNC ;WAIT FOR CHAR. TO BE TYPED\r
+ JRST INCHRW ;GO GET IT\r
+\r
+;ONEOUT OUTPUTS ONE CHARACTER\r
+\r
+ONEOUT: PUSHJ PDP,GETWDU ;PICK UP CHAR FROM USER\r
+ MOVE CHREC,TAC ;PUT IT IN PROPER AC\r
+ ANDI CHREC,177 ;MASK ANY JUNK\r
+\r
+ JUMPE CHREC,CPOPJ ;DONT STORE NULLS\r
+ PUSHJ PDP,OUTCHR ;PLACE IT IN TTO BUFFER\r
+ JUMPN CHREC,DDTUTT ;IF IT STORED, RETURN\r
+ PUSHJ PDP,TTOUWS ;BUFFER WAS FULL. TRY AGAIN LATER\r
+ JRST ONEOUT\r
+\r
+;GETLIN PUTS LINE CHARACTERISTICS WORD INTO ADR. IN UUO ADR. FIELD\r
+\r
+GETLIN: SKIPGE TAC,@UUO ;DOES USER WANT ONE LINE CHAR. WD.?\r
+ JRST GETLN1 ;YES\r
+ MOVEI LINE,0 ;NO, CHECK SIZE OF NUMBER\r
+ CAIL TAC,TTPLEN ;TOO HIGH?\r
+ JRST GETLN1 ;YES, GIVE HIM THE 0.\r
+ MOVE LINE,LINTAB(LINE) ;OK, GET THE ENTRY\r
+ HRRZ DEVDAT,TTYTAB(TAC) ;GET DEVDAT ON REQUESTED LINE\r
+ ; NOTE - NO LONGER ON JOB'S TTY\r
+ LDB TAC,PJOBN ;GET JOB NUMBER OF REQUESTED TTY\r
+ JUMPE TAC,GETLN1 ;IF NONE, NO LINES.\r
+ SKIPLE TISYNC(DEVDAT) ;ANY TYPE-IN?\r
+ TLO LINE,LINRDY ;YES. FLAG.\r
+GETLN1: MOVE LINE,@UUO ;GIVE IT TO USER\r
+ POPJ PDP,\r
+\r
+;ROUTINE TO SET LINE CHARACTERISTICS THAT ARE SETABLE\r
+\r
+SETLIN: MOVSI TAC,LGLSET ;MAKE MASK OF ALL OF THEM\r
+ ANDCAM TAC,LINTAB(LINE)\r
+ AND TAC,@UUO ;SET ONLY THOSE BITS USER WANTS SET\r
+ IORM TAC,LINTAB(LINE) ;SET RESULTANT\r
+ POPJ PDP,\r
+\f;ROUTINE TO ATTACH TTY TO A JOB\r
+;CALL: MOVE DEVDAT,ADDRESS OF TTY DEVICE DATA BLOCK\r
+; MOVE ITEM,JOB NUMBER\r
+; PUSHJ PDP,TTYATT\r
+; ERROR ;DEVDAT=DDB ADR OF OTHER TTY\r
+ ;IF ANOTHER ALREADY IS ATTACHED.\r
+; OK RETURN ;DEVDAT, DAT AND TRANSLATOR TABLE SET\r
+\r
+;CALLED FROM COMCON (ATTACH) AND COMCSS (JOBINI)\r
+;ON OK RETURN 1)SETS TTYATC\r
+; 3)PUTS ADDRESS OF ATTACHED DDB INTO DEVDAT.\r
+; 4)SETS PHYSICAL NAME TO SIXBIT /TTY LINE #/\r
+; OR SIXBIT /CTY/,\r
+; 5)SETS DEVOPR IF IT IS NON-ZERO.\r
+\r
+INTERNAL TTYATT,TTYATI\r
+EXTERNAL PUNIT,PJOBN,TTYTAB\r
+\r
+TTYATI:\r
+INTERNAL FTATTACH\r
+IFN FTATTACH,<\r
+TTYATT: PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS\r
+ MOVEI DEVDAT,TTYLST ;SEARCH FOR DDB THAT IS ATTACHED\r
+ SKIPA\r
+TTYAT2: HLRZ DEVDAT,DEVSER(DEVDAT)\r
+ JUMPE DEVDAT,TTYAT4 ;HAVE ALL TTY DDB'S BEEN LOOKED AT?\r
+ LDB TAC,PJOBN ;NO, GET JOB NUMBER.\r
+ HLL TAC,DEVMOD(DEVDAT) ;ATTACH AND USE BITS\r
+ TLNN TAC,DVTTY ;IS THIS STILL A TTY DDB?\r
+ JRST TTYAT4 ;NO. THIS MUST BE IJOB.\r
+ MOVE IOS,DEVIOS(DDB)\r
+ CAIN ITEM,(TAC) ;JOB NUMBER THE ONE TO ATTACH?\r
+ TLNN TAC,TTYATC ;YES, IS DDB ATTACHED TO JOB?\r
+ JRST TTYAT2 ;NO, KEEP LOOKING,\r
+ TLNE IOS,TTYDTC ;IS DDB DETACHED FROM LINE?\r
+ JRST TTYAT5 ;YES, OK TO ATTACH TTY OF REQUESETER TO JOB\r
+ MOVE TAC,-3(PDP) ;NO. GET TTY DEVDAT OF JOB DOING ATTACH COM.\r
+ ; AS PUSHED BY COMMAND DECODER\r
+ SKIPE TAC,DEVNAM(TAC) ;PHYSICAL NAME OF REQUESTOR TTY\r
+ CAME TAC,DEVOPR ; CHECK IF OPR IS REQUESTOR\r
+ POPJ PDP, ;NO, ERROR RETURN, CAN'T ATTACH\r
+ PUSH PDP,LINE ;YES, SAVE LINE CHARACTERISTICS\r
+ LDB LINE,PUNIT ;GET LINE NO. OF TTY BEING GRABBED\r
+ HRRZ TAC,(PDP) ;OPERATOR'S LINE NUMBER?\r
+ CAME LINE,TAC ;IS OPERATOR TRYING TO GRAB HIMSELF?\r
+ ; IF YES, DO NOT DETACH HIM\r
+ PUSHJ PDP,TTYDET ;DETACH TTY OF JOB BEING GRABBED BY OPR\r
+ POP PDP,LINE ;RESTORE LINE CHARACTERISTICS\r
+TTYAT5: PUSH PDP,DEVDAT ;SAVE NEW DDB ADDRESS.\r
+\f MOVE DEVDAT,TTYTAB(LINE)\r
+ PUSHJ PDP,TTYDET ;DETACH DDB FROM TTY\r
+ POP PDP,DEVDAT\r
+TTYAT3: DPB ITEM,TPCJOBN ;STORE ATTACHED JOB NO.\r
+ DPB ITEM,PJOBN ;SET JOB NUMBER\r
+ MOVSI IOS,TTYDTC ;INDICATE DDB NO LONGER DET. FROM LINE\r
+ ANDCAB IOS,DEVIOS(DDB)\r
+ MOVSI TAC,TTYATC ;SET ATTACHED BIT\r
+ JRST SCNIN ;SO INITIALIZE DDB\r
+\r
+TTYAT4: MOVE DEVDAT,TTYTAB(LINE);RESTORE OLD DDB ADDRESS.\r
+ JRST TTYAT3\r
+>\r
+IFE FTATTACH,<\r
+TTYATT: LDB LINE,PUNIT ;LINE NO. OF THIS TTY\r
+ DPB ITEM,TPCJOBN\r
+ DPB ITEM.PJOBN\r
+ MOVSI TAC,TTYATC\r
+ JRST SCNIN>\r
+\f;ROUTINE TO SETUP AC DEVDAT TO ADDRESS OF TTY WHICH HAS TYPED A COMMAND\r
+;AC DAT TO BYTE POINTER TO OUTPUT BUFFER FOR COMMAND MESSAGES\r
+;AC TAC TO BYTE POINTER TO COMMAND STRING\r
+;AC ITEM TO JOB NUMBER TTY IS ATACHED TO\r
+;CALL: PUSHJ PDP,TTYCOM\r
+; NONE FOUND\r
+; AC'S SETUP\r
+;CALLED FROM COMMAND\r
+\r
+INTERNAL TTYCOM,TTYCM\r
+EXTERNAL MTTYLN,TTYTAB,CPOPJ\r
+\r
+TTYCOM: SKIPL LINE,LINSAV\r
+ MOVSI LINE,MTTYLN\r
+ SKIPL TAC,TTYTAB(LINE)\r
+TTYCM1: AOBJN LINE,.-1\r
+ MOVEM LINE,LINSAV\r
+ JUMPG LINE,CPOPJ\r
+ HRRZ DEVDAT,TTYTAB(LINE)\r
+ JUMPE DDB,TTYCM2 ;THIS SHOULDNT HAPPEN, BUT...\r
+ MOVEI DAT,TTIBUF(DDB) ;SO GETCHR CAN BE CALLED FROM COMCON\r
+ MOVE LINE,TITCTR(DDB)\r
+ DPB LINE,PCOMIC ;SAVE COMMAND INPUT COUNTER\r
+ LDB LINE,PUNIT ;LINE NO.\r
+ LDB ITEM,PJOBN ;JOB NO. TTY ATTACHED TO\r
+ TLNN TAC,200000 ;IS THIS A DELAYED COMMAND?\r
+ JRST CPOPJ1 ;NO, RETURN TO SCAN IT\r
+ MOVSI TAC,200000 ;INDICATED NO LONGER DELAYED COMMAND\r
+ ANDCAM TAC,TTYTAB(LINE)\r
+ JRST CPOPJ1 ;RETURN TO COMMAND SCAN\r
+\r
+TTYCM: MOVSI DDB,200000 ;INDICATE DELAYED COMMAND\r
+ IORB DDB,TTYTAB(LINE)\r
+ PUSHJ PDP,TRESCN ;BACK UP TO START OF COMMAND\r
+ MOVE LINE,LINSAV ;TRESCN HAS CALLED STLNAC\r
+ JRST TTYCM1 ;LOOK FOR OTHER COMMAND TP PROCESS\r
+\r
+TTYCM2: MOVSI DDB,600000 ;CLEAR COMMAND BITS IN TTYTAB\r
+ ANDCAM DDB,TTYTAB(LINE)\r
+ JRST TTYCOM ;GO TRY AGAIN\r
+\fINTERNAL FTATTACH\r
+\r
+IFN FTATTACH,<\r
+;ROUTINE TO DETACH TTY FROM JOB\r
+;CALL: MOVE DEVDAT,ADDRESS OF TTY DDB TO BE DETACHED\r
+; PUSHJ PDP,TTYDET\r
+\r
+;CALLED FROM TTYATT AND COMCON (DETACH)\r
+;CLEARS TTYATC AND TRNALSATOR TABLE ENTRY.\r
+;SETS TTYDTC IN DEVIOS(DDB)\r
+\r
+\r
+INTERNAL TTYDET\r
+EXTERNAL PUNIT,TTYTAB\r
+\r
+TTYDET: MOVSI TAC,TTYATC\r
+ TDNN TAC,DEVMOND(DDB) ;IS THIS DDB WORTH KEEPING?\r
+ JRST TTYDT1 ;NO. GO JUNK IT\r
+\r
+ MOVSI IOS,TTYDTC ;YES. MARK IT DETACHED\r
+ IORM IOS,DEVIOS(DDB)\r
+ JRST TTYKL1 ;GO CLEAR TTYTAB AND DEVNAM\r
+\r
+TTYDT1: MOVSI IOS,TTYDTC+IO ;CLEAR SOME BITS TO FORCE KILL\r
+ ANDCAM IOS,DEVIOS(DDB)\r
+ MOVSI IOS,TOIP ;ALSO TYPEOUT IN PROGRESS\r
+ ANDCAM IOS,TTYPTR(DDB)\r
+ JRST TTYKIL ;TTYKIL WILL NOW KILL DDB\r
+>\r
+\r
+INTERN TRESCN\r
+\r
+TRESCN: LDB TAC,PCOMIC ;GET OLD TITCTR\r
+ MOVEM TAC,TITCTR(DDB) ;RESTORE IT\r
+ PUSHJ PDP,TBYTEP\r
+ MOVEM TAC,TITAKR(DDB)\r
+TRESC1: MOVE TAC,TIPCTR(DDB) ;CALLED HERE FROM ^U CODE\r
+ CONO PI,PIOFF\r
+ SUB TAC,TITCTR(DDB)\r
+ SKIPG TAC\r
+ ADDI TAC,TTYCHR\r
+ MOVEM TAC,TIFCTR(DDB)\r
+ CONO PI,PION\r
+ JRST STLNAC\r
+\r
+TRESCU: PUSHJ PDP,TRESCN\r
+ SETZM TISYNC(DDB)\r
+ MOVEI DAT,TTIBUF(DDB)\r
+TRESCL: PUSHJ PDP,GETCHR\r
+ JUMPE CHREC,TRESCN\r
+ PUSHJ PDP,SPCHEK\r
+ JRST TRESCL\r
+ TLNE TAC,FCSBRK+BREAKB\r
+ AOS TISYNC(DDB)\r
+ JRST TRESCL\r
+\fTLHBYT: XWD 350700,0\r
+ XWD 260700,0\r
+ XWD 170700,0\r
+ XWD 100700,0\r
+ XWD 010700,0\r
+\r
+TBYTEP: PUSH PDP,TAC1 ;SAVE LINE\r
+ MOVNS TAC\r
+ SKIPGE TAC\r
+ ADDI TAC,TTYCHR\r
+ IDIVI TAC,5\r
+ ADD TAC,TTIBUF(DDB)\r
+ HLL TAC,TLWBYT(TAC1)\r
+ POP PDP,TAC1 ;RESTORE LINE\r
+ POPJ PDP,0\r
+\f;ROUTINE TO FIND TTY FOR A JOB\r
+;CALL: MOVE ITEM,JOB NUMBER\r
+; PUSHJ PDP, TTYFND\r
+; RETURN WITH DEVDAT SET TO ADR OFF DDB\r
+; AND DAT SET TO BYTE POINTER TO MONITOR OUTPUT BUFFER\r
+\r
+INTERNAL TTYFNU,TTYFND,TTYERP\r
+EXTERNAL JOB\r
+\r
+\r
+TTYFNU: MOVE ITEM,JOB\r
+TTYFND: PUSHJ PDP,TTYSRC\r
+TTYDAT: MOVEI DAT,TTOBUF(DDB)\r
+ POPJ PDP,\r
+\r
+;PUT JOB IN IO WAIT IF TTY BUFFER NOT EMPTY\r
+;CALLED BY NON ERROR MESSAGE ROUTINES AT UUO LEVEL\r
+\r
+INTERNAL TTYFUW\r
+EXTERNAL WSYNC\r
+\r
+TTYFUW: PUSHJ PDP,TTYFNU\r
+ MOVE TAC,TOPUTR(DDB)\r
+ TLNN LINE,PTYLIN\r
+ CAMN TAC,TOTAKR(DDB)\r
+ POPJ PDP,\r
+ MOVEI IOS,IOACT ;YES\r
+ IORB IOS,DEVIOS(DDB)\r
+ JRST WSYNC\r
+\r
+;ROUTINE TO INDICATE MONITOR ERROR MESSAGE TO BE FORCED OUT\r
+;WHEN NO MORE ROOM IN TTO BUFFER, TTI BUFFER WILL BE USED\r
+\r
+TTYERP: PUSHJ PDP,TTYSRC ;FIND TTY DDB\r
+ MOVEI IOS,MERTPO ;SET MONITOR ERROR PRINT OUT BIT\r
+ IORB IOS,DEVIOS(DDB)\r
+ JRST SETBFI ;CLEAR TTI BUFFER\r
+\fTTYREL: MOVEI IOS,777777-IOACT ;CLEAR INITED STUFF IN IOS\r
+ MOVSI TAC,TTYATC\r
+ TDNE TAC,DEVMOD(DDB)\r
+ JRST T0POPJ ;GO CLEAR OUT IOS BITS\r
+\r
+;ROUTINE TO SET SCNSER TO RETURN TTY TO VIRGIN STATE\r
+;CALL: MOVE DDB, ADDRESS OF DEVICE DATA BLOCK\r
+; PUSHJ PDP,TTYKIL\r
+\r
+;CALLED FROM COMCSS (JOBKIL).\r
+;IF NOT OPERATOR CONSOL, THEN\r
+; 1)CLEAR PHYSICAL AND LOGICAL NAMES,\r
+; 2)CLEAR JOB NUMBER ASSIGNMENT\r
+; 3)CLEAR TTYUSE,TTYATC,ASSCON,ASSPRG,\r
+; 4)CLEAR ENTRY IN TRANSLATOR TABLE.\r
+\r
+\r
+\r
+INTERNAL TTYKIL\r
+EXTERNAL PJOBN,PTMNMD\r
+\r
+\r
+TTYKIL: MOVSI IOS,TTYIOW+IOW+TTYDTC+SYNC+DDTM+USRB\r
+ ;CLEAR TTY INPUT AND OUTPUT\r
+ ANDCAM IOS,DEVIOS(DDB) ;WAIT BITS SO TTY WILL BE KILLED\r
+ ;PROPERLY AT INTER, LEVEL IS STILL OUTPUTING\r
+ ; ALSO CLEAR DDT MODE AND SYNC FOR\r
+ ; NEXT USER OF THE DDB\r
+ MOVSI IOS,TPMON ;CLEAR JOB NUMBER\r
+ DPB IOS,PJOBN\r
+ IORB IOS,DEVIOS(DDB) ;TURN TPMON ON IN CASE TTY IS\r
+ ;STILL OUTPUTTING\r
+ PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS\r
+ TLNE LINE,PTYLIN\r
+ PUSHJ PDP,PTMNMD ;YES, PUT PTY INTO MONITOR MODE\r
+ SKIPL TTYPTR(DDB) ;CHECK TOIP\r
+ TLNE IOS,IO ;IS IT OUTPUTTING OR TALKING?\r
+ POPJ PDP, ;YES, DDB WILL BE KILLED AT\r
+ ;INTERRUPT LEVEL\r
+ HLLZS DEVIOS(DDB) ;CLEAR INITTED STUFF IN IOS\r
+ TLZ LINE,KILMSK ;CLEAR BITS IN LINE TABLE\r
+ TLNE LINE,DSDTLN ;DATAPHONE?\r
+ TLZ LINE,LGLSET ;INITIALIZE OTHER MODES\r
+ HLLM LINE,LINTAB(LINE)\r
+ SETZB TAC,DEVLOG(DEVDAT) ;CLEAR LOGICAL NAME\r
+ MOVE TAC,[XWD TTYUSR+TTYATC,ASSCON+ASSPRG]\r
+ ANDCAM TAC,DEVMOD(DEVDAT) ;CLEAR ATTACH,USE, AND ASSIGN BITS\r
+TTYKL1: LDB LINE,PUNIT ;LINE NO.\r
+ SETZM TTYTAB(LINE) ;CLEAR TRANSLATOR TABLE\r
+ SETZM DEVNAM(DDB)\r
+ POPJ PDP,0\r
+\f;ROUTINE TO SET TTY INTO USER MODE NOW.\r
+;CALL: MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK\r
+; PUSHJ PDP,TTYSET\r
+\r
+;CALLED FROM RUNCSS (START1)\r
+;CLEARS DDTM,IOUPR,USRB,TTYIOW AND IOW\r
+\r
+\r
+INTERNAL TTYSET\r
+\r
+TTYSET: MOVSI IOS,DDTM+IOSUPR+USRB+TTYIOW+IOW\r
+ JRST T0POPJ ;GO CLEAR BITS\r
+\fINTERN STLNAC\r
+\r
+EXTERNAL JOB,MTTYLN,TTYTAB,DEVPHY,DEVOPR,ERROR\r
+\r
+;ROUTINE TO SEARCH TRANSLATOR TABLE FOR TTY\r
+;CALL: MOVE ITEM,JOB NUMBER\r
+; PUSHJ PDP,TTYSRC\r
+; RETURN WITH ADDRESS OF DEVICE DATA BLOCK IN DEVDAT.\r
+\r
+\r
+TTYSRC: JUMPE ITEM,TTYF1 ;SEARCH FOR OPER. TTY IF JOB NO. 0\r
+ MOVSI LINE,MTTYLN ;NUMBER OF TTY DDBS\r
+TTYSRA: HRRZ DEVDAT,TTYTAB(LINE)\r
+ JUMPE DEVDAT,TTYF0\r
+ LDB TAC,TPCJOBN\r
+ CAIN TAC,(ITEM)\r
+ JRST TTYF9 ;FOUND\r
+TTYF0: AOBJN LINE,TTYSRA\r
+TTYF1: MOVSI TAC,576062 ;LOOK FOR DEVICE "OPR"\r
+\r
+ PUSHJ PDP,DEVPHY ;SEARCH PHYSICAL DEVICE NAMES FOR OPR\r
+ SKIPA TAC,DEVOPR ;NOT FOUND.\r
+ JRST TTYF9\r
+ JUMPN TAC,TTYF3 ;WAS OPR SPECIFIED IN ONCE ONLY CODE?\r
+ MOVEI DDR,TTYLST ;NO\r
+ SKIPE DEVNAM(DDB) ;HAS A TTY BEEN TYPED ON?\r
+ JRST TTYF9\r
+ MOVEI LINE,TCONLN ;NO USE CTY.\r
+ HRRZ DDB,TTYTAB(LINE) ;DOES IT HAVE A DDB?\r
+ JUMPN DDB,TTYF9 ;YES. USE IT.\r
+ MOVSI TAC,(SIXBIT /CTY/) ;NO\r
+TTYF3: PUSHJ PDP,GETDDB ;GET A DDB FOR DEVOPR\r
+ JSP DAT,ERROR ;SHOULD NEVER HAPPEN\r
+TTYF9: MOVE IOS,DEVIOS(DDB) ;SET UP IOS\r
+STLNAC: LDB LINE,PUNIT ;GET UNIT # FROM DDB\r
+ HLL LINE,LINTAB(LINE) ;AND LINE BITS\r
+ POPJ PDP,0 ;RETURN\r
+\f;ROUTINE TO START TTY OUTPUT AFTER CLEARING USRB\r
+\r
+EXTERNAL PTMNMD,PTMNMZ\r
+\r
+INTERNAL TTYSTC,TTYTCM\r
+\r
+TTYTCM:\r
+TTYSTC: MOVSI TAC,USRB ;CLEAR BIT IN MEMORY\r
+ ANDCAM TAC,DEVIOS(DDB)\r
+ PUSHJ PDP,STLNAC\r
+ TLNE LINE,PTYLIN\r
+ PUSHJ PDP,PTMNMD\r
+\r
+;ROUTINE TO START TTY OUTPUT\r
+;CALL: MOVE DAT,BYTE POINTER TO LAST OUTPUT ITEM\r
+; MOVE DEVDAT,ADDRESS OF TTY DDB\r
+; MOVE ITEM,JOB NUMBER ;(MUST BE PRESERVED)\r
+; PUSHJ PDP,TTYSTR\r
+\r
+;CALLED FROM COMINI\r
+;INITIALIZED TTY FOR MONITOR OUTPUT AND STARTS OUTPUT\r
+\r
+INTERNAL TTYSTR\r
+EXTERNAL CLRBYT\r
+\r
+TTYSTR: MOVE IOS,[XWD DDTM+IOSUPR+IOBEG+IO+TPMON,IODTER+IOBKTL+IGNOR+IOACT]\r
+ ANDCAB IOS,DEVIOS(DDB)\r
+ PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS\r
+ JUMPGE LINE,TTSTR1 ;IF NOT PTY, JUMP\r
+ TLNE IOS,USRB\r
+ PUSHJ PDP,PTMNMZ\r
+TTSTR1: MOVSI TAC,IO+TPMON\r
+ TLNE IOS,USRB ;GOING OUT OF MONITOR MODE?\r
+ TLZ TAC,TPMON ;YES\r
+ IORM TAC,DEVIOS(DDB)\r
+ MOVSI TAC,USRB+TPMON\r
+ TLNE IOS,USRB\r
+ ANDCAM TAC,DEVIOS(DDB)\r
+ MOVE IOS,DEVIOS(DDB) ;GET CORRECT IOS\r
+ SKIPLE TISYNC(DDB) ;HAS USER TYPED AHEAD?\r
+ PUSHJ PDP,COMSET ;YES, WAKE UP COMMAND DECODER(IF IN MON. MODE)\r
+ JRST UTYRET ;GO TYPE FIRST CHAR.\r
+\f;ROUTINE TO ADD TTY TO TALK RING\r
+;CALL: ADR. OF DDB TO BE ADDED TO RING AT -3(PDP)\r
+; MOVE TAC,SIXBIT /TTYN/\r
+; PUSHJ PDP,TTYTLK\r
+; TTY IS BUSY RETURN OR NOT A TTY OR TOO BIT A LINE NO.\r
+; OLK RETURN, TTY ADDED TO TALK RING\r
+\r
+INTERNAL FTTALK\r
+IFN FTTALK,<\r
+INTERNAL TTYTLK\r
+EXTERNAL PUNIT,CPOPJ1\r
+\r
+TTYTLK: PUSHJ PDP,GETDDB ;IN CASE NOT SET UP\r
+ POPJ PDP,0 ;NONE AVAIL. GIVE UP\r
+ MOVE TAC,DEVMOD(DEVDAT)\r
+ TLNN TAC,DVTTY\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
+ CAMN TAC,DEVOPR\r
+ JRST TTYTK1\r
+ TLNE IOS,TPMON\r
+ TLNN IOS,IOFST\r
+ POPJ PDP, ;NO, HE IS BUSY.\r
+TTYTK1: CONO PI,SCNOFF\r
+ LDB LINE,PUNIT ;LINE NUMBER IS RING.\r
+ MOVSI TAC,TLKRNG\r
+ LDB CHREC,PTALK\r
+ TDDN TAC,LINTAB(LINE)\r
+ HRRZ CHREC,LINE\r
+ IORM TAC,LINTAB(LINE)\r
+ EXCH DDB,-3(PDP) ;GET DDB OF TALKER\r
+ LDB LINE,PUNIT ;LINE NO. OF TALKER\r
+ DPB CHREC,PTALK ;SET POINTER INTO RING\r
+ HRLI LINE,TLKRNG\r
+ IORB LINE,LINTAB(LINE)\r
+ MOVEM LINE,TAC ;SAVE LINE NO. OF TALKER\r
+ EXCH DDB,-3(PDP) ;RESTORE\r
+ LDB LINE,PUNIT ;LINE NO. IN RING AGAIN\r
+ DPB TAC,PTALK ;MADE IT POINT TO TALKER\r
+ CONO PI,SCNON\r
+ JRST CPOPJ1 ;OK RETURN\r
+>\r
+\f;ROUTINES TO SET SCANNER TO START UP JOB WHEN OUTPUT FINISHES\r
+;CALL: MOVE DEVDAT,TTYDDB ADR.\r
+; PUSHJ PDP,TTYUSR\r
+; TTY WILL GO TO USER MODE WHEN TYPING OUT STOPS\r
+\r
+EXTERNAL SETRUN\r
+\r
+INTERNAL TTYUSR\r
+\r
+TTYUSR: MOVSI IOS,USRB ;SET BIT TO SWITCH TTY TO USER MODE\r
+ IORM IOS,DEVIOS(DDB) ;WHEN MONITOR OUTPUT FINISHES\r
+ JRST SETRUN ;GO FLAG JOB AS RUNABLE IMMEDIATELY\r
+\f;CTY INTERRUPT SERVICE ROUTINE\r
+\r
+INTERNAL CTYINT\r
+EXTERNAL SCNSAV,SCNCHN,TCONLN\r
+\r
+CTYINI: CONSO TTY,50 ;TTI OR TTO FLAG?\r
+ JRST CTYINT ;NO\r
+ JSR SCNSAV ;YES, SAVE AC'S\r
+ MOVEI LINE,TCONLN ;LOAD LINE WITH PROPER\r
+ CONSO TTY,40 ;YES. TTI FLAG?\r
+ JRST CTYOU1 ;NO.\r
+ DATAI TTY,CHREC\r
+ JRST RECINT ;RECEIVER INTERRUPT HANDLER\r
+\r
+CTYOU1: MOVEI CHREC,SCNCHN\r
+ CONO TTY,200(CHREC) ;CLEAR TTO FLAG.\r
+ JRST XMTINT ;COMMON TRANSMIT INTERRUPT HANDLER\r
+\r
+;SCANNER INTERRUPT SERVICE ROUTINE IS IN SEPARATE DEVICE DEPENDENT SECTION\r
+\r
+EXTERNAL SCNSAV,TCONLN,TTYTAB\r
+\f;COMMON RECEIVER INTERRUPT FOR ALL KEYBOARD DEVICES\r
+\r
+INTERNAL RECINT,INUS2,INJEST\r
+\r
+EXTERNAL COMCNT\r
+\r
+RECINT:\r
+INUS2: ;TAG FOR INTERRUPT SERVICE\r
+INJEXT: ;ANOTHER TAG, NOT USED, BUT WANTED BY LOSING DLSINT\r
+\r
+ TRNN CHREC,177 ;IGNORE NULLS\r
+ POPJ PDP,0 ;DISMISS INTERRUPT\r
+ HLL LINE,LINTAB(LINE) ;GET LINE CHARACTERISTICS\r
+ HRRZ DDB,TTYTAB(LINE) ;IS THERE A DDB FOR THIS LINE?\r
+ JUMPN DDB,RECIN1 ;YES. GO NO\r
+ PUSHJ PDP,DDBSRC ;NO, FIND ONE\r
+ JRST TYPX\r
+\r
+RECIN1: TLNE LINE,HLFDPX ;HALF DUPLEX LINE?\r
+ JRST RECHDX ;GO SEE WHETHER INPUT OR OUTPUT\r
+RECIN8: ;RETURN FROM RECHDX\r
+\r
+IFN FTTALK,< TLNE LINE,TLKRNG ;IN A TALK RING?\r
+ JRST DOTALK ;YES, GO TALK\r
+>\r
+ MOVE IOS,DEVIOS(DDB) ;SET UP IOS\r
+RECIN2: ANDI CHREC,177 ;7-BIT ASCII ONLY\r
+ CAIN CHREC,3 ;CONTROL C?\r
+ PUSHJ PDP,CNCTST ;YES, SEE IF 2ND CONTROL C\r
+ LDB HPOS,PHPOS ;PICK UP HORIZONTAL POSITION OF OUTPUT CHAR.\r
+ MOVEI DAT,TTIBUF(DDB) ;USER MODE INPUT BUFFER\r
+ PUSHJ PDP,TTEDIT ;GO EDIT (AND ECHO) CHARACTER\r
+ DPB HPOS,PHPOS ;STORE HORIZONTAL POSITION\r
+ HLLM LINE,LINTAB(LINE) ;UPDATE LINE TABLE\r
+ MOVE TAC,TIFCTR(DDB) ;FRE SPACES LEFT?\r
+ CAIG TAC,12 ;ONLY 10 LEFT?\r
+ JRST RWARN ;YES, GO OUTPUT XOFF\r
+ TLNN IOS,SYNC+DDTM ;WAS A BREAK CHARACTER TYPED?\r
+ JRST TYPTST ;NO, GO SEE IF ECHO NEED BE TYPED\r
+\f INTERN RECIN3 ;FOR PTYSRF\r
+RECIN3: MOVE TAC,TTYTAB(LINE) ;IS IT IN COMMAND WAIT NOW?\r
+ TLNE TAC,600000 ;..\r
+ JRST RECIN4 ;YES. NOT AGAIN.\r
+ SKIPG TISYNC(DDB) ;HAS USER TYPED AHEAD?\r
+ PUSHJ PDP,COMSET ;NO, WAKE UP COMMAND DECORDER NOW\r
+RECIN4: TLNE IOS,SYNC\r
+ AOS TISYNC(DDB) ;BREAK CHARACTER (BUMP LINE COUNT)\r
+ MOVSI IOS,SYNC ;CLEAR SYNC IN CORE\r
+ ANDCAB IOS,DEVIOS(DDB) ; ..\r
+ MOVE TAC,TIPCTR(DDB) ;UPDATE COUNTER FOR ^U\r
+ DPB TAC,PLSTLC\r
+ TLZN IOS,TTYIOW ;IN TELETYPE INPUT WAIT?\r
+ JRST TTYTST ;NO, GO ECHO\r
+ PUSHJ PDP,STTIOD ;YES, SET IO DONE(OUT OF TTY IOW)\r
+ MOVSI IOS,IOW+TTYIOW\r
+ ANDCAB IOS,DEVIOS(DDB) ;CLEAR WAIT BITS\r
+TYPTST: MOVSI TAC,TOIP ;CHECK TOIP\r
+ CONO PI,PIOFF\r
+ SKIPGE TTYPTR(DDB) ;TYPEOUT HAPPENING?\r
+ JRST TYPT1\r
+ IORM TAC,TTYPTR(DDB) ;NO, BUT THERE IS NOW\r
+ CONO PI,PION\r
+ PUSHJ PDP,STLNAC ;TAC1 CLOBBERED ABOVE BY STTIOD\r
+ JRST XMTIN1 ;START OUTPUT\r
+\r
+TYPT1: CONO PI,PION\r
+ POPJ PDP,\r
+\r
+RWARN: TLNE LINE,HLFDPX+FULTWX ;CAN LINE BE STOPPED?\r
+ JRST RECIN3 ;NO. WAKE JOB AND CROSS FINGERS.\r
+ MOVEI CHREC,23 ;YES. SEND AN XOFF.\r
+ PUSHJ PDP,PUTCHO ; ..\r
+ MOVEI CHREC,IDLECH ;AND AND IDLE FOR TTY TO THINK ON.\r
+ PUSHJ PDP,PUTCHO ;OUTPUT IT.\r
+ JRST RECIN3 ;GO WAKE JOB.\r
+\fIFN FTHDPX,<\r
+\r
+;ROUTINE TO HANDLE HALF DUPLEX RECEIVE INTERRUPTS\r
+;CALLED ONLY AT RCV INTERRUPT LEVEL\r
+\r
+EXTERN CLOCK\r
+\r
+RECHDX: MOVE IOS,DEVIOS(DDB) ;SETUP IOS\r
+ TRNE IOS,IGNOR ;IN AN ECHO CHECK?\r
+ POPJ PDP, ;YES, IGNORE THIS\r
+ TRZE IOS,ECHOF \r
+ JRST RECHD1\r
+ SKIPL TTYPTR(DDB) ;SHOULD THIS BE AN ECHO?\r
+ JRST RECIN8 ;NO. ITS A RECEIVE CHARACTER\r
+ ANDI CHREC,177 ;AN ECHO. CHECK IT\r
+ LDB TAC,PLASTC ;GET WHAT WAS SENT\r
+ CAMN TAC,CHREC ;SAME?\r
+ POPJ PDP,0 ;YES, DISMISS INT.\r
+ECHO: MOVSI TAC,TOIP\r
+ ANDCAM TAC,TTYPTR(DDB) ;TURN OFF TOIP\r
+ TLZ IOS,IO ;BAD CHARACTER, SHUT DOWN XMT.\r
+ TRO IOS,ECHOF+IGNOR ;MARK FOR THE 1/2 SEC IGNORE.\r
+ MOVEI TAC,(LINE) ;SETUP CLOCK REQUEST\r
+ LSH TAC,^D12\r
+ TRO TAC,^D30 ;1/2 SECOND\r
+ HRLI TAC,ENDECH ;WHERE TO RESPOND TO\r
+ CONO PI,PIOFF\r
+ IDPB TAC,CLOCK ;REQUEST FROM CLOCK\r
+ CONO PI,PION\r
+ MOVEM IOS,DEVIOS(DDB) ;ONLY AT INTERRUPT LEVEL\r
+ POPJ PDP, ;DISMISS INTERRUPT\r
+\r
+ENDECH: MOVE DDB,TTYTAB(TAC) ;HERE ON TIMEOUT OF ECHOCHECK\r
+ MOVEI IOS,IGNOR ;KILL IGNORE INT BIT\r
+ JRST T0POPJ ;CLEAR BIT IN IOS, RETURN TO CLK\r
+\r
+RECHD1: ANDI CHREC,177\r
+ CAIN CHREC,3 ;^C DURING ECHO CHECK?\r
+ DPB CHREC,TITAKR(DDB) ;YES, MAKE IT LIKE 2 OF THEM\r
+ JRST RECIN8 ;PROCESS AS INPUT\r
+> ;END OF FTHDPX\r
+\f;ROUTINE TO TYPE X IF LINE CANNOT GET INTO SYSTEM\r
+\r
+TYPX: ANDI CHREC,177\r
+ CAIN CHREC,"X" ;CHAR, RECEIVED AN "X"\r
+ POPJ PDP, ;YES, MAY BE ECHO, DISMISS INT.\r
+ MOVEI CHREC,"X"\r
+ JRST TYPL ;TYPE OUT "X"\r
+\r
+;ROUTINE TO WAKE UP COMMAND DECORDER IF TPMON IS SET\r
+\r
+COMSET: TLNN IOS,TPMON ;MONITOR MODE?\r
+ POPJ PDP, ;NO, NOT MONITOR COMMAND\r
+ MOVSI IOS,IOFST\r
+ IORB IOS,DEVIOS(DDB)\r
+ MOVSI TAC,400000 ;SET SIGN BIT\r
+ IORM TAC,TTYTAB(LINE) ;IN TTY TRANSLATOR TABLE\r
+ AOS COMCNT ;INDICATE ONE MORE COMMAND\r
+ POPJ PDP,\r
+\fINTERNAL XMTINT,PTYGET\r
+\r
+XMTINT: HLL LINE,LINETAB(LINE) ;GET LINE CHAR.\r
+ HRRZ DDB,TTYTAB(LINE) ;GET DDB ADDRESS\r
+ JUMPE DDB,CPOPJ ;IF NONE, X BEING TYPED\r
+ MOVE IOS,DEVIOS(DDB) ;GET IO STATUS\r
+ TLNN LINE,HLFDPX ;HALF DUPLEX LINE?\r
+ JRST XMTIN1 ;NO, REGULAR TRANSMIT INTERRUPT\r
+\r
+PTYGET: ;CALL HERE TO SKIP ABOVE OVERHEAD\r
+ SKIPL TTYPTR(DDB) ;WAS TYPE-OUT IN PROGRESS?\r
+ POPJ PDP, ;IGNORE XMT DURING ECHO CK\r
+XMTIN1: MOVEI DAT,TTOBUF(DDB) ;SPECIFY TTO BUFFER\r
+XMTI1A CONO PI,PIOFF ;KEEP TOIP AND PUTR/TAKR EQUAL\r
+ HLRZ TAC,BUF(DAT) ;IS OUTPUT BUFFER EMPTY?\r
+ CAMLE TAC,FCTR(DAT) ;I.E. FREE COUNT AT MAX?\r
+ JRST XMTIN2 ;NO, TYPING STILL IN PROGRESS\r
+\r
+ TRNE IOS,MERTPO ;MONITOR ERROR MESSAGE?\r
+ CAIE DAT,TIOBUF(DDB) ;OUTPUT BUFFER?\r
+ JRST XMTIN4 ;NO, MUST REALLY BE DONE\r
+ MOVEI DAT,TTIBUF(DDB) ;YES. NOW EMPTY OUT TTI BUFFER\r
+ JRST XMTI1A\r
+\f;HERE WHEN OUTPUT BUFFER(S) EMPTIED\r
+\r
+XMTIN4: MOVEI IOS,MERTPO\r
+ ANDCAB IOS,DEVIOS(DDB)\r
+ MOVSI CHREC,TOIP\r
+ ANDCAM CHREC,TTYPTR(DDB) ;CLEAR MERTPO AND TOIP\r
+ CONO PI,PION\r
+ MOVEI CHREC,0\r
+ LDB HPOS,PJOBN ;JOB NUMBER DDB IS ATTACHED TO\r
+ TLNN IOS,IO\r
+ JRST LINDON\r
+ MOVSI IOS,IO\r
+ ANDCAB IOS,DEVIOS(DDB)\r
+ TLNE LINE,TLKRNG ;OR TALKING?\r
+ JRST LINDON ;YES\r
+ JUMPN HPOS,LINDON ;LINE DONE IF DDB IS A JOB\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
+ JUMPL IOS,TYPE ;KEEP TYPING IF INPUT I/O WAIT\r
+ TRNN IOS,IOACT ;ARE WE IN I/O WAIT?\r
+ JRST TYPE ;NOT IN IO WAIT\r
+ MOVEI HPOS,TTYCHR-10 ;WAKE 8 CHARS BEFORE END\r
+ CAML HPOS,FCTR(DAT) ;IS THERE ROOM ENOUGH NOW?\r
+ JRST TYPE ;NO, KEEP TYPING\r
+\r
+LINDON: TLNE IOS,IOW ;IN IO WAIT?\r
+ TLNE IOS,TTYIOW ;YES. TTY INPUT WAIT?\r
+ JRST TYPE ;NO. GO TYPE CHAR.\r
+ PUSHJ PDP,STTIOD ;YES, SET IO DONE (OUT OF WSYNC)\r
+ PUSHJ PDP,STLNAC ;RESTORE TAC1\r
+ MOVE IOS,[XWD IOW,IOACT] ;INDICATE NO IO ACTIVE OR WAIT\r
+ ANDCAB IOS,DEVIOS(DDB)\r
+\r
+TYPE: JUMPE CHREC,CPOPJ ;IS TYPING STILL TO BE IN PROGRESS?\r
+ JRST TYPL ;YES.\r
+\f;TTY KEYBOARD EDITOR ROUTINE\r
+;UPON RECEIPT OF A CHARACTER, THIS ROUTINE DETERMINES WHAT TO DO\r
+;WITH IT: WHETHER IT'S A SPECIAL CHARACTER NEEDING SPECIAL ECHOING,\r
+;WHETHER SOME OTHER CHARACTER IS TO BE STORED IN ITS PLACE, WHETHER\r
+;IT IS A BREAK CHARACTER (LINE TERMINATOR), OR WHETHER THE CHARACTER\r
+;TYPED IS A SIGNAL TO UNDERTAKE SOME SPECIAL ACTION.\r
+;IN ANY CASE, ALL SPECIAL ACTION, INCLUDING DUPLEXING TAKES PLACE ON\r
+;THE LEVEL OF THIS ROUTINE.\r
+; THIS ROUTINE CALLS SPCHEK, WHICH MAKES USE OF THE SPECIAL\r
+;CHARACTER TABLE, SPCTAB, TO MAKE ANY CHANGES IN THE ACTION GENERATED\r
+;BY SPECIFIC CHARACTERS MAKE THE ALTERATIONS REQUIRED BY THE\r
+;COMMENTS DESCRIBING SPCTAB. NOTE THAT IF A CHARACTER IS TO DISPATCH\r
+;TO A "SPECIAL ACTION ROUTINE" OR SPECIAL ECHO ROUTINE, THE LEFT\r
+;HALF OF THE CORRESPONDING CHARACTER-WORD MUST HAVE SPACTN\r
+;SET AND THE ADDRESS OF THE SPECIAL ROUTINE MUST BE\r
+;ASSEMBLED INTO THE RIGHT HALF OF THE WORD.\r
+;CALL HAVE 7-BIT ASCII CHARACTER IN CHREC\r
+; LDB HPOS,PHPOS\r
+; MOVEI DAT,TTIBUF(DDB)\r
+; PUSHJ PDPD,TTEDIT\r
+; RETURN WITH ACTION DONE, SYNC (LH IOS) SET IF BREAK CHAR. STORED\r
+\r
+TTEDIT: PUSHJ PDP,ADJHP ;ADJUST HP AND CHECK SPECIAL\r
+ JRST TIPACK ;NOT SPECIAL\r
+ MOVSI IOS,0\r
+ TLNE TAC,BBREAK+FCSBRK ;BREAK CHAR?\r
+ TLO IOS,SYNC ;BREAK CHAR, SET SYNC\r
+ IORB IOS,DEVIOS(DDB) ;SET SYNC\r
+ JUMPL TAC,0(TAC) ;DISPATCH IF SPACTN SET\r
+TIPACK: CAIGE CHREC,140 ;LOWER CASE LETTER?\r
+ JRST TTIPUT ;NO\r
+ TLNN LINE,T37 ;YES. IS THIS TTY IN 37 MODE?\r
+ TRZ CHREC,40 ;NO. MAKE CHAR UPPER CASE\r
+TTIPUT: TLZE LINE,ROBTPD ;HAVE WE BEEN DELETING?\r
+ PUSHJ PDP,BSECHO ;YES. OUTPUT A BACKSLASH\r
+TTIPT1: PUSHJ PDP,PUTCHI ;PUT CHAR IN INPUT BUFFER\r
+ JRST INBFUL ;IT DIDNT FIT\r
+ LTNN TAC,ECHSUP ;SHOULD THIS CHAR BE ECHOED?\r
+DUPLEX: TLNE LINE,FULTWX,HLFDPX ;IS THIS LINE ECHOING ITSELF?\r
+ POPJ PDP,0 ;JUST RETURN WITHOUT ECHO\r
+DUPLX1: PUSH PDP,TAC ;SAVE TAC OVER PUTCHO\r
+ TLNN IOS,TPMON ;SHOULD ECHO IF IN MONITOR MODE\r
+ TRNN IOS,NOECHO ;AND UNLESS USER SAYS NO, IN USER MODE\r
+ PUSHJ PDP,PUTCHO ;SO ECHO IT.\r
+ JRST TPOPJ ;RESTORE TAC AND RETURN\r
+\r
+INTERNAL INBFUB ;FOR THE PTY\r
+\r
+INBFUL: MOVSI IOS,SYNC ;DONT COUNT SYNC COUNT\r
+ ANDCAB IOS,DEVIOS(DDB) ; SINCE CHAR NOT STORED\r
+ CAIN CHREC,3 ;CHAR WONT FIT, WAS IT ^C?\r
+ JRST CNCTS1 ;YES. PANIC OUT OF THIS BIND\r
+ MOVEI CHREC,7 ;NO. JUST ECHO BELL TO SHOW LOSS\r
+ JRST PUTCHO ;OUTPUT BELL\r
+\f;CALLED WITH A JUMPL TAC,(TAC), WHERE TAC IS LOADED FROM SPCTAB\r
+;SPECIAL CHARACTER HANDLING ROUTINES\r
+\r
+CONTC: PUSHJ PDP,DELETL ;SINCE PEOPLE WANT FREE ^U\r
+ MOVE TAC,SPCTAB+3 ;SINCE DELETL CLOBBERS TAC\r
+CONTZ: PUSHJ PDP,CNTLEC ;OUTPUT ^C OR ^Z\r
+ PUSHJ PDP,CRLFEC ;OUTPUT A CRLF\r
+ JRST TTIPUT ;AND STORE THE 003 OR 032\r
+\r
+CONTO: PUSHJ PDP,SETBF2 ;CLEAR THE OUTPUT BUFFER\r
+ MOVSI IOS,IOSUPR ;SET TO JUNK FURTHER OUTPUT\r
+ IORB IOS,DEVIOS(DDB)\r
+ JRST CONTU1 ;ECHO, ETC.\r
+CONTU: TLNE IOS,DDTM ;IN DDTMODE,\r
+ JRST TTIPUT ; PASS THIS CHARACTER\r
+ TLZ LINE,ROBTPD ;NO MORE BACKSLASH\r
+ PUSHJ PDP,DELETL ;^U DELETES INPUT LINE\r
+CONTU1: PUSHJ PDP,CNTLEC ;ECHO ^O OR ^U\r
+ JRST CRLFEC ;OUTPUT A CRLF AND RETURN WITHOUT\r
+ ; STORING THE ^O OR ^Z\r
+\r
+ALTMOD: HRRI TAC,(CHREC) ;SAVE WHICH KIND OF ALTMOD\r
+ MOVEI CHREC,44 ;ECHO A $\r
+ TLNN IOS,TPMON\r
+ TRNN IOS,DLRSUP ;400 IN IOS REMOVES ECHO OF $\r
+ PUSHJ PDP,AOJDPX\r
+ MOVEI CHREC,(TAC) ;RESTORE THE CHARACTER\r
+ TRNN IOS,FCS ;UNLESS FCS MODE,\r
+ MOVEI CHREC,175 ;TURN INTO OLD ALTMOD\r
+ JRST TTIPUT ;STORE THE CHARACTER\r
+\r
+CONTF: TLC LINE,T35+T37 ;COMPLEMENT T37 ON ^F\r
+CONTP: TLCA LINE,T35 ;COMPLEMENT T35 ON ^P\r
+CONTB: TLC LINE,FULTWX ;COMPLEMENT FULTWX ON ^B\r
+ POPJ PDP,0 ;AND RETURN WITHOUT STORING THESE\r
+\r
+CONTQ: TLOA LINE,XON ;PAPER TAPE MODE\r
+CONTS: TLZ LINE,XON ;NOT PAPER TAPE\r
+ JRST TTIPUT ;DO STORE THESE FOR CUSP\r
+\fCONTH: TLNE LINE,T37 ;BACKSPACE\r
+ JRST TTIPUT ;JUST PASS TO PROG IF 37 TTY\r
+RUBOUT: TLNN LINE,XON\r
+ JRST RUBOU3\r
+RUBOU4: MOVSI IOS,SYNC ;IF PAPER TAPE, NO BREAK\r
+ JRST T0POPJ ;OR STORE, RETURN.\r
+RUBOU3: TLNE IOS,TPMON ;IN MONITOR MODE, NOT A BREAK CHAR\r
+ JRST RUBOU2\r
+ TDNE IOS,[XWD DDTM,FCS]\r
+ JRST TTIPT1 ;STORE RUBOUT IF DDT OR FCS\r
+RUBOU2: PUSHJ PDP,RUBOU4 ;NOT A BREAK AFTER ALL\r
+ LDB CHREC,PUTR(DAT) ;GET LAST CHAR IN\r
+ PUSHJ PDP,DCPUTR ;BACK UP TIPUTR\r
+ JRST RUBOU1 ;IT'S EMPTY ALREADY\r
+ TLON LINE,ROBTPD ;MARK IN RUBOUT SEQUENCE\r
+ PUSHJ PDP,BSECHO ;AND OUTPUT BACKSLASH IF FIRST\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
+CONTK: HRRI TAC,4 ;HERE ON V TAB\r
+ SKIPA\r
+CONTL: HRRI TAC,10 ;HERE ON FORMFEED\r
+ TLNN LINE,T35 ;THIS TTY HAVE VERT MECHANICS?\r
+ JRST SIMFF ;NO, SIMULATE IT\r
+ PUSHJ PDP,TTIPUT ;PUT CHAR IN BUFFER AND ECHO IT\r
+CONTI1: MOVEI CHREC,IDLECH ;SYNCHRONOUS IDLE CHARACTERS\r
+SIMFF1: PUSHJ PDP,DUPLX1 ;OUTPUT ECHO OF LF OR IDL\r
+ TRNE TAC,17 ;DONE YET?\r
+ SOJA TAC,.-2 ;NO. OUTPUT MORE\r
+ POPJ PDP,0 ;DONE\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
+ JRST SIMFF1\r
+\r
+CONTI: TLNN LINE,T35\r
+ TLO TAC,ECHSUP ;DONT OUTPUT TAB TO 33\r
+ PUSHJ PDP,TTIPUT ;PUT IN BUFFER AND MAYBE ECHO\r
+ TLEN LINE,XON+DISLIN ;IF PAPER TAPE,DISMISS\r
+ POPJ PDP,0 ; SO AS NOT TO OVERFILL OUTBUF\r
+ ;ALSO, DISPLAY DOESNT WANT FILLER\r
+ HRRI TAC,1 ;TWO IDLES\r
+ TLNE LINE,T35\r
+ JRST CONTI1 ;GO SEND SLUFFS\r
+\r
+CONTI2: MOVEI CHREC,40 ;SPACES FOR THE 33'S\r
+ LDB HPOS,PHPOS ;WHERE WAS I BEFORE TAB?\r
+ PUSHJ PDP,AOJDPX ;OUTPUT A SPACE\r
+ TRNE HPOS,7 ;AT A TAB STOP?\r
+ JRST .-2 ;NO. MORE SPACES.\r
+ POPJ PDP,0 ;RETURN FROM TTEDIT\r
+\fCRLFEC: MOVEI HPOS,0 ;ECHO A CR LF, SAVING CHREC\r
+ PUSH PDP,CHREC\r
+ MOVEI CHREC,15 ;CARRIAGE RETURN\r
+ PUSHJ PDP,DUPLX1 ;OUTPUT IT\r
+ MOVEI CHREC,12 ;LINE FEED\r
+ PUSHJ PDP,DUPLX1 ;OUTPUT THAT TOO\r
+CHPOPJ: POP PDP,CHREC ;RESTORE CHREC\r
+ POPJ PDP,0\r
+\r
+CNTLEC: HRRI TAC,100(CHREC) ;SAVE UN-CNTL CHARACTER\r
+ MOVEI CHREC,"^"\r
+ PUSHJ PDP,AOJDPX\r
+ MOVEI CHREC,(TAC) ;TYPE ^ CHAR\r
+ PUSHJ PDP,AOJDPX\r
+ TRZ CHREC,100 ;RESTORE IT TO A CNTL CHAR\r
+ POPJ PDP,0\r
+\r
+CRLF: MOVEI HPOS,0 ;HERE ON INPUT OF A CARRIAGE RETURN\r
+ TLNE LINE,XON ;IF PAPER TAPE, NO FREE LF\r
+\r
+ JRST TTIPUT ;JUST STORE THE CR\r
+ PUSHJ PDP,TTIPUT ;ORDINARILY, STORE AND GO ON HERE\r
+ MOVEI CHREC,12 ;BY ADDING A LF\r
+ MOVSI IOS,SYNC ;WHICH IS A BREAK CHARACTER\r
+ IORB IOS,DEVIOS(DDB)\r
+ TLNN LINE,FULTWX+HLFDPX ;IF NOT SELF ECHOING.\r
+ JRST TTIPUT ;THIS WILL GIVE LF ECHO\r
+ PUSHJ PDP,TTIPUT ;OTHERWISE, THIS WONT\r
+ JRST DUPLX1 ;BUT THIS WILL\r
+\fINTERN FTLOGIN\r
+\r
+INTERN CNCTST\r
+\r
+CNCTST:\r
+IFN FTLOGIN,< EXTERN JBTSTS\r
+\r
+ LDB TAC,PJOBN\r
+ MOVE TAC,JBTSTS(TAC)\r
+ TLNE TAC,JACCT\r
+ MOVEI CHREC,175\r
+>\r
+ LDB TAC,TIPUTR(DDB)\r
+ CAIE TAC,3\r
+ POPJ PDP,\r
+CNCTS1: PUSHJ PDP,TSETBF ;STOP ALL I/O, BY CLEARING BUFFERS\r
+ MOVEI DAT,TTIBUF(DDB) ;GET POINTER BACK TO INPUT BFR\r
+ MOVE TAC,SPCTAB+3 ;AND BITS FOR CONTROL C\r
+\r
+\r
+CNCMOD: MOVE IOS,[XWD DDTM+IO+IOSUPR+USRB,MERTPO+ECHOF+IGNOR]\r
+ ANDCAM IOS,DEVIOS(DDB)\r
+ MOVSI IOS,TPMON+IOFST\r
+ IORB IOS,DEVIOS(DDB)\r
+ TLNE LINE,PTYLIN ;*\r
+ PUSHJ PDP,PTMNMD ;*\r
+ POPJ PDP,\r
+\f;ROUTINE TO ECHO BACK-SLASH\r
+\r
+BSECHO: PUSH PDP,CHREC ;*\r
+ MOVEI CHREC,"\"\r
+ PUSHJ PDP,AOJDPX\r
+ JRST CHPOPJ\r
+\r
+;ROUTINE TO DECREMENT PUTR\r
+\r
+INTERN DCPUTR\r
+\r
+DCPUTR: LDB TAC,PLSTLC ;CHECK FOR NONE TO DELETE\r
+ CAMN TAC,PCTR(DAT)\r
+ POPJ PDP,\r
+\r
+ MOVSI TAC,70000\r
+ ADD TAC,PUTR(DAT) ;*\r
+ TLNE TAC,400000\r
+ ADD TAC,[XWD 347777,-1]\r
+\r
+ MOVEM TAC,PUTR(DAT)\r
+ AOS FCTR(DAT)\r
+ AOS TAC,PCTR(DAT)\r
+ CAIG TAC,TTYCHR ;*\r
+ JRST CPOPJ1 ;*\r
+ SUBI TAC,TTYCHR ;*\r
+ MOVEM TAC,PCTR(DAT)\r
+ MOVEI TAC,STTYBF\r
+ ADDM TAC,PUTR(DAT) ;*\r
+ JRST CPOPJ1\r
+\r
+;ROUTINE TO DELETE CURRENT LINE (^U)\r
+\r
+DELETL: LDB TAC,PLSTLC ;WAS THERE LAST BREAK?\r
+ MOVEM TAC,TIPCTR(DDB) ;STORE COUNT\r
+ PUSHJ PDP,TBYTEP ;CONVERT TO A BYTE POINTER\r
+ MOVEM TAC,TIPUTR(DDB) ;SAVE POINTER\r
+ JRST TRESC1 ;GO COMPUTE TIFCTR\r
+\fIFN FTTALK,<\r
+EXTERNAL TPOPJ\r
+DOTALK: ANDI CHREC,177\r
+ HRRZ DDB,TTYTAB(LINE)\r
+ JUMPE DDB,CPOPJ ;NO SUCH LINE\r
+ CAIN CHREC,3\r
+ JRST NOTALK\r
+ PUSH PDP,LINE\r
+DOTAL1: LDB LINE,PTALK\r
+ HLL LINE,LINTAB(LINE)\r
+ HRRZ DDB,TTYTAB(LINE)\r
+ JUMPE DDB,DOTAL2\r
+ PUSH PDP,CHREC\r
+ CAMN LINE,-1(PDP)\r
+ TLNN LINE,FULTWX+HLFDPX\r
+ PUSHJ PDP,PUTCHO\r
+ MOVE IOS,DEVIOS(DEVDAT)\r
+ PUSHJ PDP,TYPTST\r
+ POP PDP,CHREC\r
+DOTAL2: CAME LINE,0(PDP)\r
+ JRST DOTAL1\r
+ JRST TPOPJ\r
+\r
+;IF I TYPE A ^C IN TALK RING, THEN\r
+;ASSUME NEXT_ME_PREV\r
+;SET NEXT_PREV\r
+;IF NEXT=PREV, CLEAR ITS TLKRNG BIT\r
+;SET ME_ME\r
+;CLEAR TLKRNG BIT IN LINTAB(ME)\r
+\r
+NOTALK: MOVEI HPOS,0(LINE) ;ME\r
+ LDB CHREC,PTALK ;NEXT\r
+NOTAL1: LDB TAC,PTALK\r
+ CAMN TAC,HPOS ;ME_?\r
+ JRST NOTAL2 ;YES. LINE=PREV\r
+ MOVE LINE,TAC ;NO. FIND PREV\r
+ JRST NOTAL1\r
+NOTAL2: DPB CHREC,PTALK ;MAKE NEXT_PREV\r
+ CAIE CHREC,(LINE) ;RING NOW EMPTY?\r
+ JRST NOTAL3 ;NO\r
+ MOVSI CHREC,TLKRNG ;YES, CLR HIS BIT\r
+ ANDCAM CHREC,LINTAB(LINE)\r
+NOTAL3: MOVSI CHREC,TLKRNG\r
+ MOVE LINE,HPOS ;ME\r
+ DPB HPOS,PTALK ;ME_ME\r
+ ANDCAM CHREC,LINTAB(LINE) ;CLR MY BIT\r
+ MOVEI CHREC,3 ;GET A ^C AGAIN\r
+ DPB CHREC,TIPUTR(DDB) ;LOOK LIKE 2 OF THEM\r
+ JRST RECINT ;AND PROCESS IT FROM THE TOP\r
+>\r
+\f;ROUTINE TO TYPE CHAR\r
+;CALL MOVE LINE,LINE NO.\r
+; MOVE CHREC,CHARACTER\r
+; PUSHJ PDP,TYP\r
+\r
+INTERNAL TYPL\r
+EXTERNAL TCONLN,SCNTYP,PEVEN8\r
+\r
+TYP:\r
+TYPL: TLNE LINE,PTYLIN\r
+ POPJ PDP, ;YES\r
+ PUSHJ PDP,PEVEN8 ;GENERATE CORRECT PARITY\r
+ TLNE LINE,CTYLIN ;NO,CONSOLE TTY?\r
+ JRST SCNTYP ;TYPE CHAR.\r
+CTYP: DATAO TTY,CHREC\r
+ DPB CHREC,PLASTC\r
+ POPJ PDP,\r
+\f;ROUTINE TO SETUP DDB FOR OUTPUT\r
+;CALL MOVE TAC,[SIXBIT /TTY#/\r
+; PUSHJ PDP,GETDDB\r
+; NONE AVAILABLE RETURN\r
+; RETURN WITH LINE AND DDB SETUP\r
+\r
+EXTERNAL TCONLN,CPOPJ,CPOPJ1,TPOPJ1\r
+\r
+INTERNAL GETDDB\r
+\r
+GETDDB: MOVEI LINE,TCONLN\r
+ CAMN TAC,[SIXBIT /CTY/] ;CTY?\r
+ JRST GETDB1 ;YES\r
+ HLLZ LINE,TAC ;NO\r
+ CAME LINE,[SIXBIT /TTY/] ;TTY PREFIX?\r
+ POPJ PDP, ;NO\r
+ TLZ TAC,-1 ;YES\r
+ JUMPE TAC,CPOPJ ;TTY?\r
+ ROTC TAC,30 ;NO\r
+ TRZE LINE,20 ;IS FIRST SUFFIX AN OCTA;L DIGIT?\r
+ TRNE LINE,70\r
+ POPJ PDP, ;NO\r
+ ROT TAC,3 ;YES\r
+ TRC TAC,2 ;IS THERE A 2ND SUFFIX THAT IS AN\r
+ TRNN TAC,7 ;OCTAL DIGIT?\r
+ ROTC TAC,3 ;YES\r
+ CAIL LINE,TCONLN ;LEGAL LINE NUMBER?\r
+ POPJ PDP, ;NO\r
+GETDB1: HRRZ DDB,TTYTAB(LINE) ;DOES THIS LINE HAVE A DDB?\r
+ JUMPN DDB,CPOPJ1 ;JUMP IF SO.\r
+ PUSHJ PDP,DDBSRC ;NO. SEARCH FOR FREE DDB\r
+ POPJ PDP, ;NONE AVAILABLE\r
+ HLLZM IOS,DEVIOS(DDB) ;INITIALIZE STATE\r
+ PUSH PDP,DEVNAM(DDB)\r
+ MOVEI TAC,ASSCON+ASSPRG\r
+ ANDCAM TAC,DEVMOD(DDB)\r
+ JRST TPOPJ1\r
+\f;ROUTINE TO SEARCH FOR FREE TTY DEV DATA BLOCK\r
+;CALL: MOVE LINE,TTY LINE NO.\r
+; PUSHJ PDP,DDBSRC\r
+; NONE FOUND OR LINE NO, TOO BIG\r
+; RETURN DEVDAT,LINE AND DEVNAME SET AND BITS TPMON,IOFST,IOACT,\r
+; TTYUSE,ASSCON SET.\r
+\r
+EXTERNAL TTPLEN,MLTTYL,CPOPJ\r
+INTERNAL DDBSRC\r
+\r
+DDBSRC: HRRZ TAC,LINE ;NUMBER OF LINE ONLY\r
+ CAILE TAC,TTPLEN ;IS LINE NO. TOO BIG\r
+ POPJ PDP, ;YES.\r
+ MOVSI IOS,MLTTYL ;NO. OF TTY DDBS\r
+ MOVEI DEVDAT,TTYLST ;ADDRESS OF FIRST TTY DDB\r
+ SKIPA TAC,[XWD TTYUSE+TTYATC,ASSPRG+ASSCON]\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
+ MOVSI TAC,PROG\r
+ MOVEM TAC,DEVIAD(DDB) ;CLEARS PHPOS\r
+ MOVEM TAC,DEVOAD(DDB) ;CLEARS PFITCH\r
+ MOVE IOS,[XWD TPMON+IOFST,IOACT]\r
+ PUSH PDP,DAT\r
+ PUSHJ PDP,TSETBF ;INITIALIZE BUFFERS\r
+ POP PDP,DAT\r
+ MOVE TAC,[XWD TTYUSE,ASSCON];INITIALIZE DATA BLOCK.\r
+\r
+;FALL INTO SCNIN\r
+\f;INITIALIZE TTY DEVICE DATA BLOCK(CALLED FROM TTYATT TOO)\r
+;CALL: MOVE TAC,BITS IN DEVMOD TO BE TURNED ON\r
+; MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK\r
+; PUSHJ PDP,SCNIN\r
+; SKIP RETURN ALWAYS\r
+\r
+; CALLED BY JRST FROM TTYATT\r
+; AND FALLS IN FROM DDBSRC ABOVE\r
+\r
+;SETS PHYSICAL NAME TO SIXBIT /TTY#/ OR SIXBIT /CTY/\r
+; WHERE # IS THE LINE NUMBER.\r
+;STORES LINE NUMBER IN DEVICE DATA BLOCK\r
+\r
+EXTERNAL PUNIT,TTYTAB,TCONLN,CPOPJ1\r
+\r
+SCNIN: IORM TAC,DEVMOD(DEVDAT)\r
+ DPB LINE,PUNIT ;SET LINE NO. IN DDB.\r
+\r
+INTERNAL FTTALK\r
+IFN FTTALK,<\r
+ DPB LINE,PTALK ;SETUP TALK RING TO CONTAIN\r
+ ;ONLY THIS TTY.\r
+>\r
+ MOVSI TAC,646471 ;SIXBIT /TTY/\r
+ MOVEM TAC,DEVNAM(DEVDAT)\r
+ MOVE TAC,[POINT 6,DEVNAM(DEVDAT),17]\r
+ TRNN LINE,70 ;IS THERE A HIGH ORDER OCTAL DIGIT?\r
+ JRST SCNIN0 ;NO\r
+ ROT LINE,-3 ;YES, CONVERT TO SIXBIT.\r
+ ADDI LINE,20\r
+ IDPB LINE,TAC ;STORE HIGH ORDER SIXBIT DIGIT\r
+ TRZ LINE,-1 ;LOW ORDER DIGIT IN LINE\r
+ ROT LINE,3\r
+SCNIN0: ADDI LINE,20\r
+ IDPB LINE,TAC ;STORE LOW ORDER DIGIT\r
+ PUSHJ PDP,STLNAC\r
+ HRRM DEVDAT,TTYTAB(LINE) ;SET DDB ADR. IN TRANSLATOR TABLE.\r
+ MOVSI TAC,436471 ;SIXBIT /CTY/\r
+ TLNE LINE,CTYLIN ;IS THIS CONSOLE TTY?\r
+ MOVEM TAC,DEVNAM(DEVDAT);YES, SET NAME TO CTY.\r
+ TLNE LINE,PTYLIN ;IS THIS A PTY?\r
+ PUSHJ PDP,PTMNND ;YES. SET IT INTO MONITOR MODE\r
+ JRST CPOPJ1 ;SUCCESSFUL RETURN.\r
+\fSCNEND: END\r
+\f\r
--- /dev/null
+\r
+TITLE UUOCON - UUO HANDLER AND UUO+IO ROUTINES - V434\r
+SUBTTL /RCC TS 03 JUN 69\r
+XP VUUOCN,434 ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB\r
+\r
+ ENTRY UUOCON ;ALWAYS LOAD UUOCON(IF LIB SEARCH)\r
+UUOCON:\r
+\r
+;THIS ROUTINE COMBINES THE OLD SYSCON,SYSCSS, AND IOCONT ROUTINES\r
+;IT CONSISTS OF THE UUO TRAP HANDLER\r
+;THE CALL UUO ROUTINES AND THE IO UUO ROUTINES\r
+;SOME UUO DO DISPATCH TO OTHER ROUTINES OUTSIDE OF UUOCON\r
+, ALL UUOS DROP THEMSELVES IN REAL LOCATION 40, AND TRAP\r
+, TO 41. THE UUO HANDLER SHUFFLES THE UUO OFF TO THE USER'S\r
+, 40,41, IF IT IS NOT A SYSTEM UUO.\r
+;SYSTEM UUOS(40-77) FIRST SAVE THE USERS ACS IN RELATIVE LOC 0-17\r
+;THEN THE FOLLOWING ACS ARE LOADED UP BEFORE DISPATCHING:\r
+; PDP ;PUSHDOWN LIST IN CURRENT JOB DATA AREA\r
+; PROG ;CURRENT JOB RELOCATION IN RH,PROTECTION IN LH\r
+; JDAT ;ADDRESS OF CURRENT JOB DATA AREA\r
+; UUO ;THE CONTENTS OF LOC 40 WITH PROG IN INDEX FIELD\r
+; ;SO THAT RELOCATION CAN BE DONE FOR PICKING UP ARGUMENTS\r
+ ; EXCEPT THAT ON A CALL OR CALLI UUO, THE ADDRESS IS\r
+ ; MODIFIED TO BE THE AC OF THE UUO,FOR\r
+ ; PICKING UP ARGUMENTS.\r
+; DEVDAT ;ADR. OF DEVICE DATA BLOCK\r
+; IOS ;DEVICE IO STATUS WORD\r
+; DSER ;ADR. OF DEVICE SERVICE ROUT. DISPATCH TABLE\r
+; UCHN ;THE USER IO CHANNEL(AC FIELD) OF UUO\r
+\r
+;RETURN IS PUSHED ON END OF PD LIST\r
+;THEN IF CALL WAS FROM USER MODE, THE UUO ROUTINE IS CALLED\r
+;WITH A PUSHJ, SO THAT ALL UUO ROUTINE RETURN WITH A POPJ PDP,\r
+;WHICH WILL RETURN CONTROL TO UUOCON WHICH WILL RESTORE USERS\r
+;ACS AND RETURN TO HIM\r
+;IF THE CALL IS FROM EXEC MODE, THE UUO ROUTINE IS CALLED\r
+;BY DOING JUST A JRST, WHEN THE UUO ROUTINE RETURNS WITH\r
+;A POPJ, IT WILL RETURN TO THE EXEC WITHOUT RESTORING\r
+;ANY ACS\r
+, CONTROL MAY ALWAYS BE RETURNED BY EXECUTING A\r
+; POPJ PDP,\r
+, WHICH WILL RESTORE THE ACS, APR BITS, AND RETURN.\r
+, THE UUO HANDLER IS PURE IF THE FOLLOWING RESTRICTIONS ARE OBSERVED.\r
+, RESTRICTIONS: UUOS CANNOT BE CALLED BY INTERRUPT SERVICE ROUTINES.\r
+\f;HERE ON UUO FROM USER\r
+;USER AC 17 ALREADY SAVED IN LOC USRSAV(SEE COMMON)\r
+;AC 17 CONTAINS ADR OF JOB(JOBADR)\r
+;SAVE HIS ACS ON REL. LOC 0-17\r
+\r
+;TO UUOSY1 IF UUO FROM EXEC MODE (AC 17 GUARRANTEED NOT TO BE EQUAL TO AC PROG)\r
+\r
+INTERNAL UUOUSR,UUOSY1,USRXIT\r
+EXTERN FORTY,SIXTY\r
+EXTERN ADRERR,CORUUO,DEVHNG,GETWRD,HOLD,ILLINS\r
+EXTERN ILLMOD,IOIERR,JOBKL,JOBSAV,PHOLD,REASSI,SETAPR\r
+EXTERN STWAIT,UGTSEG,URUN,USCHED,UUOERR\r
+EXTERN WAIT1,WSYNC\r
+EXTERNAL USRSAV,JOBPDL,MJOBPD,PUUOAC,USRJDA\r
+EXTERNAL USRHCU,JOB,JBTSTS,TIMEF\r
+EXTERNAL JOBDAT,JOBAC,UUO0,FORTY\r
+\r
+UUOUSR: MOVEM 16,16(17) ;STORE AC16 IN USER 16\r
+ MOVEI 16,(17) ;SET UP BLT POINTER\r
+ BLT 16,15(17) ;MOVE REAL AC'S TO USER AREA\r
+ MOVE TAC,USRSAV ;MOVE USER 17 TO USER'S AREA\r
+ MOVEM TAC,17(17)\r
+ MOVE PROG,17 ;LOAD UP POINTER TO USER PROGRAM AREA\r
+IFN JDAT-PROG,<\r
+ MOVE JDAT,JOBDAT ;ADDRESS OF JOB DATA AREA\r
+>\r
+ MOVSI PDP,MJOBPD ;LOAD UP PUSH DOWN AC AND\r
+ HRRI PDP,JOBPDL(JDAT) ;MAKE ABSOLUTE RATHER THAN RELATIVE\r
+UUOSY1: PUSH PDP,UUO0 ;SAVE RETURN ON PUSH DOWN LIST\r
+ MOVE UUO,FORTY ;GET THE UUO INTO AC(UUO)\r
+ TLNN UUO,740000 ;SYSTEM UUO?\r
+ILEGAL: JRST UUOERR ;NO, 0-37 ARE ILLEGAL,PRINT ERROR\r
+ TLO UUO,PROG ;SET FOR RELOCATION\r
+ LDB TAC1,[POINT 9,UUO,8];PICK UP UUO OP CODE\r
+ CAIL TAC1,100 ;ILLEGAL INSTRUCTION?\r
+ JRST ILLINS ;YES, STOP JOB AND PRINT ERROR\r
+ LDB UCHN,PUUOAC ;SETUP USER DEVICE CHANNEL NUMBER\r
+ SKIPE DEVDAT,USRJDA(UCHN) ;GET ADRESS OF DEVICE DATA BLOCK\r
+ CAMLE UCHN,USRHCU ;IS IT LESS THAN OR EQUAL TO HIGHEST\r
+ ; USER IO CHANNEL IN USE FOR CURRENT JOB?\r
+ JRST NOCHAN ;CHANNEL NOT ASSIGNED\r
+ MOVE IOS,DEVIOS(DEVDAT) ;GET DATA BLOCK STATUS WORD\r
+ MOVE DSER,DEVSER(DEVDAT);SETUP IO SERVICE DISPATCH\r
+ ; TABLE ADDRESS\r
+ CAIL TAC1,LNGUUO ;LONG DISPATCH TABLE UUO?\r
+ JRST DISP1 ;YES\r
+DISP0: ROT TAC1,-1 ;DIVIDE UUO OPCODE BY 2, SAVE REMAINDER\r
+ MOVE DAT,UUOTAB-20(TAC1);GET DISPATCH TABLE ENTRY\r
+DISP2: TLNN TAC1,400000 ;WAS UUO ODD?\r
+ MOVS DAT,DAT ;NO, USE LH OF DISPATCH ENTRY\r
+ CAME PROG,17 ;UUO FROM SYSTEM?\r
+ JRST (DAT) ;YES, RETURN ADDRESS ALREADY ON PD \r
+ ; LIST. AVOID RESTORING USER\r
+ ; ACS ON RETURN TO SYSTEM.\r
+\f;DISPATCH TO UUO ROUTINE\r
+;THE FOLLOWING CODE IS EXECUTED ON ALL RETURN TO USER PROGRAMS\r
+;BUT IS NEVER EXECUTED ON RETURNS FROM EXEC UUOS(SAVGET)\r
+\r
+ PUSHJ PDP,(DAT) ;NO, FROM USER. ALL\r
+ ; UUO ROUTINES RETURN WITH POPJ\r
+ JRST USRXIT ;NO SKIP RETURN TO USER\r
+USRXT1: AOS (PDP) ;SKIP RETURN TO USER\r
+USRXIT: MOVE ITEM,JOB ;CURRENT JOB NUMBER\r
+ MOVE TAC,JBTSTS(ITEM)\r
+ JUMPG TAC,USRXT2 ;HAS A CONTROL C BEEN EXECUTED?\r
+ TLNN TAC,STOPIO ;TRYING TO STOP IO?\r
+ SKIPE TIMEF ;NO. HAS CLOCK TICKED WHILE IN MONITOR?\r
+USRXT2: PUSHJ PDP,USCHED ;YES, GO CALL SCHEDULER\r
+ POP PDP,UUO0 ;USER RETURN ADDRESS\r
+ MOVSI 17,JOBAC(PROG) ;RESTORE ALL USER ACS\r
+ BLT 17,17\r
+ JEN @UUO0 ;RESTORE FLAGS AND RETURN TO USER\r
+ ; DISMISS INTERRUPT ONLY ON TRPJEN UUO\r
+ ; IN ALL OTHER CASES NO INTERRUPTS\r
+ ; IN PROGRESS\r
+\r
+NOCHAN:NOCHAN: CAMN PROG,17 ;UUO FROM USER?\r
+ ;IF FROM EXEC, PROBABLY SAVEGET WHICH SETS USRCHN NEG. IN LH\r
+ CAIGE TAC1,IOUUO ;YES, IS THIS AN IO UUO?\r
+ JRST DISP0 ;NO, GO DISPATCH\r
+ CAIE TAC1,70 ;YES,IS IT CLOSE OR RELEASE?\r
+ CAIN TAC1,71 ;CLOSE AND RELEASE ALWAYS LEGAL EVEN THOUGH NO DEVICE ASSIGNED\r
+ JRST USRXIT\r
+ JRST IOIERR ;NO, PRINT IO TO UNASSIGNED CHANNEL\r
+ ; AND STOP JOB\r
+\r
+DISP1: MOVE TAC,DEVMOD(DEVDAT) ;LONG DISPATCH TABLE UUO\r
+ TLNE TAC,DVLNG ;DOES THIS DEVICE HAVE A LONG\r
+ ; DISPATCH TABLE?\r
+ JRST DISP0 ;YES, DISPATCH\r
+ CAIGE TAC1,76 ;NO, IS UUO LOOKUP OR ENTER?\r
+ JRST USRXIT ;NO, RETURN TO USER\r
+ JRST USRXT1 ;YES, SKIP RETURN TO USER\r
+\f\r
+;TABLE OF UUO DISPATCH ADDRESSES\r
+;IN FORMAT:\r
+; XWD 40,41\r
+; XWD 42,43\r
+; .\r
+; XWD 76,77\r
+\r
+\r
+\r
+UUOTAB: XWD UCALL,UINIT ;(40,41)CALL,INIT\r
+ XWD UUOERR,UUOERR ;(42,43)FIVE UUOS FOR EACH INSTALLATION\r
+ XWD UUOERR,UUOERR ;(44,45)TO DEFINE AS THEY SEE FIT\r
+ XWD UUOERR,UCALLI ;(46,47),CALLI\r
+IFN FTTTYSER,<\r
+EXTERN TTYUUO\r
+ XWD UOPEN,TTYUUO ;(50,51)OPEN, TTCALL\r
+>\r
+IFE FTTTYSER,<\r
+ XWD UOPEN,CPOPJ ;(50,51)OPEN, NO-OP FOR TTCALL\r
+>\r
+ XWD ILEGAL,ILEGAL ;(52,53)\r
+ XWD ILEGAL,URENAM ;(54,55),RENAME\r
+XP IOUUO,55 ;LOWEST IO UUO(RENAME)\r
+ XWD TIN,TOUT ;(56,57)IN,OUT\r
+ XWD SETIOS,USTATO ;(60,61)SETSTS,STATO\r
+ XWD USTATS,USTATZ ;(62,63)GETSTS,STATZ\r
+ XWD UINBF,UOUTBF ;(64,65)INBUF,OUTBUF\r
+ XWD IN,UOUT ;(66,67)INPUT,OUTPUT\r
+ XWD CLOSE1,RELEA1 ;(70,71)CLOSE,RELEASE\r
+XP LNGUUO,72 ;LOWEST LING DISPATCH TABLE UUO\r
+ XWD UMTAPE,UDGF ;(72,73)MTAPE,GETF\r
+ XWD UDSI,UDSO ;(74,75)SETI,SETO\r
+ XWD UDLK,UDEN ;(76,77)LOOKUP,ENTER\r
+\r
+;UUOS 42, 43, 44, 45, AND 46 ARE FOR CUSTOMERS TO DEFINE AS THEY PLEASE\r
+;UUOS 40, 41 AND 47 THROUGH 77 ARE DEFINED BY DIGITAL\r
+;UUOS 51,52,53 AND 54 ARE RESERVED FOR EXPANSION BY DIGITAL\r
+\f, CALLING SEQUENCE\r
+, CALL D,[SIXBIT/NAME/]\r
+, WHERE NAME IS THE NAME OF A SYSTEM ROUTINE.\r
+, IF NO SYSTEM ROUTINE WITH THE SPECIFIED NAME IF FOUND, THIS ROUTINE\r
+, EXITS TO UUOERR.\r
+;CONTENTS OF USER AC PLACED IN AC TAC,UUO SET TO POINT\r
+;TO USER AC, PROG IN LH.\r
+;ITEM SET TO JOB NUMBER\r
+\r
+EXTERNAL JOB\r
+\r
+UCALL: PUSHJ PDP,GETWDU ;SET TAC FROM CONTENTS OF EFFECTIVE ADDRESS OF\r
+ ; UUO FROM EITHER HIGH OR LOW SEG\r
+ ; DO NOT RETURN IF ERROR\r
+ ; SET ITEM TO CURRENT JOB NO.\r
+ MOVSI TAC1,-UCLLEN-CCLLEN-1 ;-SUM OF LENGTHS OF SIXBIT TABLES,\r
+ ; -1 FOR THE CARRY TO LH IN AOBJN\r
+ HRRI TAC1,-CCLLEN ;- LENGTH OF CUSTOMER TABLE\r
+ CAME TAC,UCLTAB(TAC1) ;SEARCH SYSTEM ROUTINE NAME TABLE\r
+ AOBJN TAC1,.-1\r
+ HRRM TAC1,UUO ;STORE INDEX IN UUO, JUST AS IF USER HAD DONE CALLI UUO\r
+\r
+\r
+;CALLI UUO - CALL IMMEDIATE\r
+;CALLI D,E\r
+;WHERE E IS RELATIVE INDEX IN CALL TABLE\r
+\r
+INTERNAL UCALLI\r
+\r
+UCALLI: HRRE TAC1,UUO ;GET CALLI NUMBER (POS. = DIGITAL, NEG. = CUSTOMER DEFINED)\r
+ CAML TAC1,[-CCLLEN] ;MORE NEGATIVE THAN MOST NEGATIVE CUSTOMER DEFINED UUO?\r
+ CAIL TAC1,UCLLEN ;MORE POSITIVE THAT DIGITAL DEFINED UUO?\r
+ POPJ PDP, ;YES, RETURN TO USER TREAT AS NO-OP SO\r
+ ; PROGRAMS AHEAD OF MONITOR WILL STILL\r
+ ; RUN WITHOUT ERROR MESSAGE\r
+ CAMN PROG,17 ;NO, WAS UUO FROM MONITOR?\r
+ POP PDP,TAC ;REMOVE RETURN\r
+ HRR UUO,UCHN ;UUO AC FIELD\r
+ MOVE TAC,@UUO ;PICK UP CONTENTS OF USER AC\r
+ ROT TAC1,-1 ;DEVIDE BY 2 AND SAVE REMAINDER\r
+ MOVE DAT,UCLJMP(TAC1) ;GET DISPACTH TABLE ENTRY\r
+ MOVE ITEM,JOB ;SETUP CURRENT JOB NUMBER(IN CASE THIS IS CALLI)\r
+ JRST DISP2 ;AND GO DISPATCH\r
+\f\r
+;CALL UUO DISPATCH TABLE\r
+;NEW UUO'S MUST BE ADDED AT END SINCE CALLI DEPENDS ON\r
+;POSITION IN TABLE, CUSTOMERS SHOULD ADD UUO'S IN CNAMES MACRO SO CALLI ADDRESS\r
+;WILL BE NEGATIVE. IN THIS WAY BOTH DIGITAL AND ITS CUSTOMERS CAN ADD UUO'S\r
+;WITHOUT CONFLICT, DIGITAL GOING POSITIVE, CUSTOMERS GOING NEGATIVE.\r
+; (ALSO, TOWARD TOP OF PAGE)\r
+\r
+;ALSO EXTERNALS MUST BE IN RH(IE ODD CALLI INDECIES)\r
+\r
+EXTERNAL DDTIN,DDTOUT,CPOPJ\r
+\r
+DEFINE CNAMES <\r
+ X CPOPJ,CPOPJ ;(-3) PLACE FOR CUSTOMERS TO PATCH UUOS\r
+ X CPOPJ,CPOPJ ;(-2) \r
+ X LIGHTS,LIGHTS ;(-1) SET LIGHTS (EXAMPLE OF CUSTOMER DEFINED UUO)\r
+>\r
+\r
+DEFINE NAMES,<\r
+ X RESET,RESET ;(0)RESET IO\r
+ X DDTIN,DDTIN ;(1)EXT-GET DDT CHAR.\r
+ X SETDDT,SETDDT ;(2)SETDDT LOC IN PROTECTED JOB DATA\r
+ X DDTOUT,DDTOUT ;(3)EXT:SEND DDT CHAR.\r
+ X DEVCHR,DVCHR ;(4)DEVICE CHARACTISTICS\r
+ X DDTGT,CPOPJ ;(5)GET DDT MODE\r
+ X GETCHR,DVCHR ;(6)DEVICE CHAR.(DIFF. NAME)\r
+ X DDTRL,CPOPJ ;(7)RELEASE DDT MODE\r
+ X WAIT,WAIT ;(10)WAIT TILL DEVICE INACTIVE\r
+ X CORE,CORUUO ;(11)CORE UUO\r
+ X EXIT,EXIT ;(12)EXIT\r
+ X UTPCLR,UTPCLR ;(13)CLEAR DEC TAPE DIRECTORY \r
+ X DATE,DATE ;(14)GET DATE\r
+ X LOGIN,LOGIN ;(15)LOGIN\r
+ X APRENB,APRENB ;(16)ENABLE APR FOR TRAPPING\r
+ X LOGOUT,LOGOUT ;(17)LOGOUT\r
+ X SWITCH,SWITCH ;(20)RETURN DATA SWITCHES\r
+ X REASSIGN,REASSIGN ;(21)REASSIGN DEVICE TO ANOTHER JOB\r
+ X TIMER,TIMER ;(22)RETURN JIFFY CLOCK TIME\r
+ X MSTIME,MSTIME ;(23)RETURN TIME OF DAY IN MS\r
+ X GETPPN,GETPPN ;(24)RETURN PROJECT-PROGRAMMER NUMBER\r
+ X TRPSET,TRPSET ;(25)SET PI TRAP LOC, AND USER IO\r
+ X TRPJEN,UUOERR ;(26)DISMISS INTERRUPT TO EXEC MODE(SUPERCEDED BY UJEN)\r
+ X RUNTIM,JOBTIM ;(27)RETURN TOTAL JOB RUNNING TIME\r
+ X PJOB,JOBNO ;(30)RETURN JOB NUMBER\r
+ X SLEEP,SLEEP ;(31)SLEEP FOR N SECONDS, THEN RETURN TO USER\r
+ X SETPOV,SETPOV ;(32)SET PUSH DOWN OVERFLOW TRAP\r
+ ; (FOR COMPATIBILITY ONLY)\r
+ X PEEK,UPEEK ;(33)TO PEEK AT CERTAIN MONITOR PARAMETERS\r
+ X GETLIN,GETLN ;(34) GET TTY UNE NUMBER\r
+ X RUN,URUN ;(35) RUN DEV:FILE\r
+ X SETUWP,SETUWP ;(36) SET OR CLEAR USER MODE WRITE PROTECT\r
+ X REMAP, REMAP ;(37) REMAP TOP OF LOW SEGMENT INTO HIGH SEG\r
+ X GETSEG,UGTSEG ;(40) GET SHARABLE HIGH SEG\r
+ X GETTAB,GETTAB ;(41) GET EXEC ADDRESS OF A JOB TABLE\r
+ X SPY,USPY ;(42) SET HIGH SEG TO BE PHYSICAL CORE\r
+ X SETNAM,SETNAM ;(43) SETNAME OF THIS PROGRAM\r
+ X CPOPJ,CPOPJ ;2 SPARE UUO'S FOR PATCHING - DIGITAL ONLY\r
+ X CPOPJ,CPOPJ ;ALWAYS ADD NEW UUO'S ABOVE THESE\r
+ ;CUSTOMERS SHOULD ADD UUO'S ABOVE\r
+ ;IN CNAMES MACRO RATHER THAN NAMES MACRO\r
+ ; SO THAT THEIR CALLI INDECES WILL\r
+ ; BE NEGATIVE\r
+>\r
+\f;GENERATE SIXBIT TABLE OF UUO NAMES\r
+\r
+DEFINE X (A,B) <\r
+ <SIXBIT /A/>\r
+>\r
+\r
+;GENERATE CUSTOMER CALL/CALLI UUO'S\r
+\r
+CCLTAB: CNAMES\r
+CCLLEN=.-CCLTAB ;LENGTH OF CUSTOMER DEFINED CALL/CALLI UUO'S\r
+ ;(MINIMUM CALLI NUMBER, TOO)\r
+\r
+;GENERATE DIGITAL UUO'S\r
+\r
+UCLTAB: NAMES\r
+UCLLEN=.-UCLTAB ;DEFINE LENGTH OF DIGITAL UUO TABLE(MAX. CALLI NO. TOO)\r
+\fDEFINE X (A,B)\r
+< ZZ=ZZ+1\r
+ DEFINE XX (C) ;DEFINE XX IN CASE JOB NUMBER OF CUSTOMER UUO'S\r
+< XWD UUOERR,C\r
+>>\r
+ZZ=0\r
+;COUNT NUMBER OF CUSTOMER DEFINED UUO'S\r
+ CNAMES\r
+\r
+;GENERATE HALF WORD UUO DISPATCH TABLE\r
+\r
+DEFINE X (A,B)\r
+< IFE ZZ&1,\r
+< DEFINE XX (C)\r
+<\r
+ XWD B,C\r
+>>\r
+ IFN ZZ&1,\r
+<\r
+ XX B\r
+>\r
+ZZ=ZZ+1\r
+>\r
+\r
+;GENERATE CUSTOMER TABLE\r
+\r
+CUSTAB: CNAMES\r
+\r
+\r
+ZZ=0\r
+\r
+;GENERATE DIGITAL TABLE\r
+\r
+UCLJMP: NAMES\r
+\r
+ IFN ZZ&1,<XX 0> ;GEN. LAST WORD IF ODD NUMBER OF UUOS\r
+\r
+;FIX UP SYMBOLS NOT IN UUOCON\r
+\r
+IFN FT2REL,<EXTERN USPY>\r
+IFE FT2REL,<USPY=LCPOPJ>\r
+\f;EXIT UUO ROUTINE\r
+;CALL: CALL FIELD, [SIXBIT/EXIT/]\r
+;IF FIELD - 0, PRINT EXIT ^C. CONT WILL NOT WORK\r
+;IF FIELD NON-ZERO, JUST PRINT. DO NOT RELEASE DEVICES\r
+\r
+EXTERNAL TTYFUW\r
+\r
+EXIT: JUMPN UCHN,MONRET ;AC FIELD NON-ZERO?\r
+ PUSHJ PDP,IORELS ;NO, RELEASE ALL DEVICES\r
+ PUSHJ PDP,TTYFUW ;FIND TTY FOR CURRENT JOB\r
+ ; SET ITEM TO JOB NO.,DAT TO OUTPUT BYTE POINTER\r
+ ; DEVDAT TO TTY DDB\r
+ JSP TAC,PHOLD ;MOVE "EXIT" TO OUTPUT BUFFER\r
+ ; AND STOP JOB, AND START TTY, CONT WILL NOT WORK\r
+ ASCIZ /\r
+EXIT/\r
+\r
+; CALL 1,[SIXBIT/EXIT/] - RETURN TTY TO MONITOR MODE,\r
+; STOP JOB, BUT DO NOT RELEASE DEVICES\r
+;TYPE . WITH NO CRLF, ALLOW CONT COMMAND TO RETURN AFTER UUO\r
+\r
+ EXTERN PRPER,STOP1,CRLF,TTYSTC\r
+\r
+MONRET: PUSHJ PDP,TTYFUW ;FIND TTY FOR CURRENT JOB\r
+ PUSHJ PDP,CRLF ;PRINT CR LF\r
+ PUSHJ PDP,PRPER ;PRINT .\r
+ PUSHJ PDP,TTYSTC ;PUT TTY INTO COMMAND MODE\r
+ JRST STOP1 ;START TTY IN MONITOR MODE AND STOP JOB\r
+ ;BUT ALLOW CONTINUE TO WORK (RETURN CONTROL AFTER EXIT UUO)\r
+\r
+;SETPOV - SET PUSH DOWN OVERFLOW TRAP\r
+;CALL MOVE AC,ADR. OF TRAP ON PD OVF\r
+; CALL AC,[SIXBIT /SETPOV/]\r
+\r
+EXTERNAL JOBAPR\r
+\r
+SETPOV: MOVEM TAC,JOBAPR(JDAT)\r
+ MOVEI TAC,1B19\r
+ JRST APRENB ;SET TRAP LOC.\r
+\r
+\f;RESET UUO ROUTINE\r
+\r
+INTERNAL RESET,FTTRPSET\r
+EXTERNAL JOBPD1\r
+\r
+RESET:\r
+IFN FTTRPSET,<\r
+ EXTERN STOPTS\r
+ CAIN TAC,1 ;IS THIS JOB 1 DOING THE RESET?\r
+ SETZM STOPTS ;YES. MAKE SURE SCHEDULING ALLOWED\r
+ ; IN CASE THIS FOLLOWS A TRPSET UUO\r
+>\r
+IFN FT2REL,<\r
+ EXTERN HRESET\r
+ PUSHJ PDP,HRESET ;FLAG USER AS HAVING UWP ON FOR HIGH SEG\r
+ ; AND DO DATAO TO SET UWP ON\r
+>\r
+ PUSHJ PDP,IOKILL ;RELEASE ALL DEVICES\r
+ MOVSI TAC,777777-USRMOD ;CLEAR ALL UUO PC FLAGS IN LH, EXCEPT USER MODE\r
+ ANDCAM TAC,JOBPD1(JDAT) ;LEAVE USER MODE OFF TOO, IF EXEC DOING CALL RESET\r
+ ; FALL INTO APRENB WITH RH TAC=0\r
+ ; SO THAT ALL APR INTERRUPTS WILL BE DISABLED\r
+\f;ROUTINE TO SET UP APR FOR USER TRAPPING\r
+;CALL: CALL AC,[SIXBIT /APRENB/]\r
+;WITH FOLLOWING APR CONSO FLAG BITS\r
+;TO INDICATE WHICH APR CONDITIONS SHOULD\r
+;TRAP TO USER WHEN TRAP OCCURS FROM USER MODE\r
+\r
+;1B19 ;PUSHDOWN OVERFLOW\r
+;1B22 ;ILLEGAL MEMORY\r
+;1B23 ;NON-EXISTENT MEMORY\r
+;1B26 ;CLOCK\r
+;1B29 ;FLOATING POINT OVERFLOW\r
+;1B32 ;ARITH. OVERFLOW\r
+\r
+INTERNAL APRENB\r
+\r
+APRENB: HRRM TAC,JOBENB(JDAT) ;SET RH TO CONSO BITS IN JOB DATA AREA\r
+ ; USED EVERY TIME IS STARTED UP\r
+\r
+ JRST SETAPR ;GO ENABLE/DISABLE APR FOR FOV AND HR OV\r
+ ; ALSO SET APR CONSO INSTR. FOR PROPER FLAGS\r
+ ; AND RETURN TO USER\r
+\f;RETURN JOB NUMBER FOR THIS JOB\r
+\r
+JOBNO: SKIPA TAC,ITEM ;JOB NUMBER\r
+ ; SKIP AND STORE TAC IS USER AC\r
+\r
+;RETURN THE DATE TO THE USER\r
+\r
+EXTERNAL THSDAT\r
+\r
+DATE: MOVE TAC,THSDAT\r
+ JRST STOTAC\r
+\r
+;RETURN JOB RUNNING TIME IN MILLISECONDS\r
+\r
+INTERNAL FTTIME\r
+\r
+JOBTIM:\r
+IFN FTTIME,<EXTERNAL JOBN\r
+ SKIPL TAC\r
+ CAILE TAC,JOBN\r
+ JRST RTZER\r
+ SKIPN TAC\r
+ MOVE TAC,ITEM\r
+ SKIPA TAC,TTIME(TAC) ;TOTAL JOB RUNNING TIME\r
+ EXTERNAL TTIME\r
+>\r
+IFE FTTIME,<\r
+ TDZA TAC,TAC ;RETURN ZERO IF NO TIMMING COM.\r
+>\r
+\r
+;RETURN TIME OF DAY IN MILLISECONDS\r
+\r
+EXTERNAL TIME,JIFSEC\r
+\r
+MSTIME: MOVE TAC,TIME ;TIME OF DAY IN JIFFIES\r
+ IMULI TAC,^D1000\r
+ IDIVI TAC,JIFSEC ;DIVIDE BY NO. OF JIFFIES PER SECOND\r
+ JRST STOTAC\r
+\f\r
+;PUT JOB TO SLEEP FOR NSECONDS\r
+;CALL CALL AC,[SIXBIT /SLEEP/]\r
+\r
+INTERNAL FTSLEEP,SLEEP\r
+\r
+SLEEP:\r
+IFN FTSLEEP,<\r
+EXTERNAL JIFSEC,JBTSTS,PION,PIOFF,SETSLP,WAKE,CLOCK\r
+ MOVSI TAC1,CLKR\r
+ TDNE TAC1,JBTSTS(ITEM) ;DOES THIS JOB HAVE A CLOCK QUEUE\r
+ ; REQUEST IN CLOCK QUEUE?\r
+ JRST SLEEP1 ;YES, DO NOT PUT ANOTHER ONE IN\r
+ IMULI TAC,JIFSEC ;MULTIPLY BY NO. OF JIFFIES PER SECOND\r
+ TRNN TAC,7777 ;0 TIME?(CHECK ONLY 12 BITS)\r
+ MOVEI TAC,1 ;YES. SLEEP 1 JIFFY\r
+ DPB ITEM,[POINT 6,TAC,23]\r
+ HRLI TAC,WAKE ;ADR. IN RUNCSS WHEN JOB WAKES UP\r
+ CONO PI,PIOFF\r
+ IDPB TAC,CLOCK\r
+ CONO PI,PION\r
+SLEEP1: JRST SETSLP ;SET JOB STATUS WORD SO JOB WILL NOT RUN\r
+>\r
+IFE FTSLEEP,< POPJ PDP, ;RETURN IMMEDIATELY IF NOT A FEATURE>\r
+\r
+;PEEK INTO MONITOR UUO\r
+;CALL MOVEI AC,<MONITOR ADDRESS>\r
+; CALL AC,[SIXBIT .PEEK.]\r
+\r
+ EXTERN SYSSIZ\r
+\r
+UPEEK:\r
+IFN FTLOGIN,<\r
+ HLRZ TAC1,PRJPRG(ITEM) ;GET USER'S PROJECT NR\r
+ CAIE TAC1,1 ;ADMIN NR?\r
+ JFCL ;SHOULD BE PATCHED TO "JRST UUOERR" IF\r
+ ; IF CUSTOMER WANTS PEEK UUO NOT ALLOWED FOR ALL USERS\r
+>\r
+ CAMLE TAC,SYSSIZ ;ONLY UP TO SIZE OF SYSTEM\r
+ JRST RTZER ;RETURN 0 IF USER ASKING TOO BIG\r
+ MOVE TAC,(TAC)\r
+ JRST STOTAC\r
+\f;SET OR CLEAR USER MODE WRITE PROTECT BIT IN HIGH SEG FOR THIS USER ONLY\r
+;CALL: MOVEI AC,0 OR 1\r
+; CALL AC,[SIXBIT /SETUWP/] OR CALLI AC,34\r
+; ERROR - MACHINE OR MONITOR CANNOT HANDLE TWO REG, OR TRYING TO CLEAR\r
+; ;UWP OF A SHARABLE SEG(AC=1 ON RETURN)\r
+; OK RETURN - AC CONTAINS PREVIOUS SETTING( OR JOB HAS NO HIGH SEG)\r
+\r
+IFN FT2REL,<\r
+ EXTERN USTUWP\r
+SETUWP: JRST USTUWP ;GO TO ROUTINE IN SEGCON\r
+ ;IF FT2REL=0, SETUWP DOES RTZER\r
+>\r
+\r
+\r
+;UUO TO REMAP TOP PART OF LOW SEGMENT INTO HIGH SEGMENT\r
+;PREVIOUS HIGH SEG(IF ANY) IS KILLED AND A NEW SEGMENT NUMBER IS ASSIGNED\r
+;TO THIS JOB. REMAP IS USED BY LOADER AND GET\r
+;CALL: MOVEI AC,NEW HIGHEST USER ADR IN LOW SEG(EXEC ORS IN 1777)\r
+; CALL AC,[SIXBIT /REMAP/] OR CALLI AC,35\r
+; ERROR RETURN, MACHINE OR EXEC CANNOT HANDLE 2 REG OR DESIRED ADR\r
+; ;GREATER THAN OLD LOW SEG\r
+; OK RETURN, LOW SEG ABOVE ARG NOW THE HIGH SEG\r
+\r
+IFN FT2REL,<\r
+ EXTERN UREMAP\r
+REMAP: JRST UREMAP ;CORE1 MODULE IN SEGCON\r
+>\r
+IFE FT2REL,<\r
+REMAP=CPOPJ ;ERROR RETURN TO USER(CPOPJ IS AN EXTERN)\r
+>\r
+\r
+;ROUTINE TO GET WORD FROM USER AREA AT UUO LEVEL - EITHER SEGMENT\r
+;CALL: MOVE PROG,XWD PROTECTION,RELOCATION FOR LOW SEG\r
+; HRR UUO,USER ADR.\r
+; HRLI UUO,PROG ;FOR RELOCATION\r
+; PUSHJ PDP,GETWDU\r
+; RETURN ONLY IF ADDRESS OK, WORD IN TAC, ABS. ADR IN TAC1\r
+\r
+; IF OUT OF BOUNDS, PRINT ILL UUO AND STOP JOB\r
+\r
+ INTERN GETWDU,GETWD1\r
+ EXTERN JOB\r
+\r
+GETWD1: HRRI UUO,1(UUO) ;INCREMENT UUO BEFORE PICKING UP WORD\r
+GETWDU: MOVE ITEM,JOB ;SETUP CURRENT JOB NUMBER\r
+ PUSHJ PDP,GETWRD ;GET THE WORD AND CHECK IF LEGAL\r
+ JRST UUOERR ;ADR. NOT IN LOW OR HIGH SEG, PRINT ERROR\r
+LCPOPJ:\r
+RMPERR: POPJ PDP, ;OK RETURN, TAC=WORD, TAC1=ABS. ADR.\r
+\f;SET LIGHTS ON CONSOLE FROM USER PROGRAM\r
+\r
+;CALL AC,[SIXBIT /DATAO/] OR CALLI AC,-1\r
+\r
+;THIS IS AN EXAMPLE OF A USER DEFINED UUO WITH A NEGATIVE CALLI ARG.\r
+\r
+LIGHTS: DATAO PI,TAC ;SENT USER'S AC TO CONSOLE LIGHTS\r
+ POPJ PDP, ;RETURN TO HIM\r
+\r
+;RETURN TIME OF DAY IN JIFFIES (60THS,50THS OR MS)\r
+\r
+EXTERNAL TIME\r
+\r
+TIMER: SKIPA TAC,TIME ;FALL INTO STOTAC\r
+\r
+;RETURN DATA SWITCHES\r
+\r
+\r
+SWITCH: DATAI TAC\r
+\r
+;ROUTINE TO STORE TAC IN USER AREA AS SPECIFIED BY UUO\r
+;MUST BE CALLED FROM UUO LEVEL WITH PROG SETUP\r
+;ALSO PROG IN INDEX FIELD OF UUO\r
+\r
+INTERNAL STOTAC\r
+\r
+STOTAC: HRRZ AC1,UUO\r
+ PUSHJ PDP,UADCK1 ;IS ADDRESS IN BOUNDS(OR IN ACS)?\r
+ MOVEM TAC,@UUO ;YES, STORE\r
+ POPJ PDP,\r
+\r
+;RETURN DEVICE CHARACTERISTICS\r
+\r
+EXTERNAL JOB,PJOBN\r
+\r
+DVCHR: PUSHJ PDP,DEVSRC ;SERACH FOR DEVICE\r
+ TDZA TAC,TAC ;NOT A DEVICE, RETURN ZERO\r
+ SKIPA TAC,DEVMOD(DEVDAT);DEVICE FOUND,RETURN DEVMOD\r
+ JRST STOTAC ;RETURN ZERO, DEVICE NOT FOUND\r
+ LDB TAC1,PJOBN ;GET JOB NO. USING DEVICE\r
+ CAME TAC1,JOB ;DOES CURRENT USER ALREADY HAVE IT?\r
+ TRNN TAC,ASSCON+ASSPRG ;NO, IS IT ASSIGNED?\r
+ TLO TAC,DVAVAL ;NO, BUT HE CAN GET IT.\r
+ JRST STOTAC\r
+\r
+;RETURN PROJECT-PROGRAMMER NUMBER IN AC\r
+\r
+GETPPN:\r
+INTERNAL FTLOGIN\r
+IFN FTLOGIN,<\r
+ EXTERNAL PRJPRG\r
+ MOVSI TAC,JACCT\r
+ TDNE TAC,JBTSTS(ITEM) ;LOGIN OR LOGOUT CUSP RUNNING ?\r
+ JRST GETPPL ;YES, SPECIAL PROJ,PROG NUMBER CHANGE.\r
+ SKIPA TAC,PRJPRG(ITEM) ;NO, RETURN PROJECT-PROGRAMMER NO. OF THIS JOB.\r
+>\r
+\r
+INTERN RTZER\r
+\r
+IFE FT2REL, <\r
+SETUWP: ;SETUWP RETURNS 0\r
+>\r
+\r
+RTZER: MOVEI TAC,0 ;RETURN 0. TO USER AC\r
+ JRST STOTAC ;AS SPECIFIED IN AC FIELD OF HIS UUO\r
+\fEXTERNAL USRDDT\r
+\r
+SETDDT: MOVEM TAC,USRDDT\r
+ POPJ PDP, ;RETURN TO USER\r
+\r
+;WAIT FOR IO TO BECOME INACTIVE ON CHANNEL AC\r
+\r
+\r
+WAIT: JUMPE DEVDAT,CPOPJ ;CHANNEL ASSIGNED?\r
+ JRST WAIT1 ;WAIT TILL INACTIVE BEFORE\r
+ ; RETURNING TO USER.\r
+\r
+\r
+IFN FTLOGIN, <\r
+EXTERNAL DUMPPP,MJOBN\r
+GETPPL: MOVE TAC,DUMPPP ;CHANGE USER'S NUMBERS TO [1,2]\r
+ EXCH TAC,PRJPRG(ITEM) ; AND GET OLD NUMBERS.\r
+ MOVSI TAC1,MJOBN ;CHECK FOR OTHER USERS UNDER SAME PP NUMBER.\r
+ CAMN TAC,PRJPRG(TAC1) ;ANOTHER USER UNDER SAME PROJ,PROG NUMBER ?\r
+ AOSA (PDP) ;YES, SKIP RETURN TO USER (LOGIN OR LOGOUT)\r
+ AOBJN TAC1,.-2 ;NO, KEEP LOOKING\r
+ JRST STOTAC\r
+>\r
+\r
+GETLN: PUSHJ PDP,TTYFND ;FIND USER'S TTY DATA BLOCK.\r
+ MOVE TAC,DEVNAM(DEVDAT) ;GET DEVICE NAME IN SIXBIT\r
+ JRST STOTAC ;RETURN IT TO USER.\r
+\f;LOGIN UUO USED ONLY BY LOGIN CUSP\r
+;CALL: CALL AC,[SIXBIT /LOGIN/]\r
+;WHERE AC CONTAINS XWD -NO. OF ENTRIES,LOCATION\r
+;WHICH IS A LIST OF JOB STATISTICS TO BE STORED IN MONITOR\r
+\r
+INTERNAL FTLOGIN\r
+\r
+IFN FTLOGIN,<\r
+EXTERNAL JOB,JBTSTS,TTYFUW\r
+\r
+LOGIN: MOVSI TAC1,JLOG ;IS USER ALREADY LOGGED IN?\r
+ TDNE TAC1,JBTSTS(ITEM)\r
+ JRST UUOERR ;YES, PRINT ILLEGAL UUO\r
+ HLRE AC1,TAC ;NO, -NO. OF WORDS\r
+ HRR UUO,TAC ;FIRST REL. LOC.\r
+ MOVE AC2,[XWD -LOGTOP,LOGTAB] ;SET FOR LOOP\r
+LOGIN1: AOSG AC1 ;FINISHED HIS COUNT?\r
+ SKIPA AC3,@UUO ;NO, GET NEXT WORD FROM USER AREA\r
+ MOVEI AC3,0 ;YES, STORE 0\r
+ MOVEM AC3,@(AC2) ;NO, STORE ITEM\r
+ ADDI UUO,1 ;GET NEXT ITEM\r
+ AOBJN AC2,LOGIN1 ;FINISHED NO. OF MONITOR TABLES?\r
+ IORM TAC1,JBTSTS(ITEM) ;YES, FINALLY SET LOGIN BIT\r
+ MOVSI TAC1,JACCT ;RESET THIS BIT TO INDICATE LOG-IN IS\r
+ ANDCAM TAC1,JBTSTS(ITEM) ; NOW COMPLETE AND ^C IS AGAIN PERMITTED.\r
+LOGIN2: PUSHJ PDP,IORELS ;RELEASE ALL DEVICES\r
+ PUSHJ PDP,TTYFUW ;FIND TTY AND PRINT ^C\r
+ JRST HOLD\r
+\r
+;TABLE OF POINTERS TO TABLES(STORED WITH JOB NUMBER AS INDEX)\r
+;TO MAKE LOGIN SET MORE TABLES IN MONITOR, JUST ADD TABLE NAMES AT END\r
+\r
+EXTERNAL PRJPRG\r
+\r
+\r
+LOGTAB: XWD ITEM,PRJPRG ;PROJECT-PROGRAMMER NUMBER\r
+IFN FTPRV,<\r
+ EXTERN JBTPRV\r
+ XWD ITEM,JBTPRV ;JOB PRIVILEGE BITS\r
+>\r
+IFE FTPRV,<\r
+ EXP IOS ;STORE IN AC IOS, SINCE PRIVILEGE TABLE DOES NOT EXIST\r
+>\r
+\r
+LOGTOP=.-LOGTAB ;NO. OF TABLES TO BE SET\r
+>\r
+\f\r
+;LOGOUT UUO\r
+\r
+INTERNAL FTLOGIN\r
+EXTERNAL TTYTCM\r
+\r
+IFN FTLOGIN,<\r
+LOGOUT: PUSHJ PDP,TTYFUW\r
+ MOVSI TAC,JLOG\r
+ TDNN TAC,JBTSTS(ITEM) ;IS JOB ALREADY LOGGED OUT ?\r
+ JRST JOBKL ;NO, GO COMPLETE WORK OF LOGOUT CUSP.\r
+ JRST EXIT ;YES, TREAT AS "EXIT"\r
+>\r
+\r
+IFE FTLOGIN,<\r
+\r
+LOGIN=UUOERR ;CANT DO A LOGIN UUO\r
+LOGOUT=EXIT ;TREAT A KJOB UUO AS AN EXIT IN 10/40\r
+>\r
+\f;GETTAB UUO\r
+;UUO TO RETURN CONTENTS OF A MONITOR JOB TABLE ENTRY\r
+;CALL: HRROI AC, MONITOR JOB TABLE NUMBER\r
+; HRLI AC, JOB NUMBER (OPTIONAL) LH .LT. 0 MEANS CURRENT JOB\r
+; CALL AC, [SIXBIT /GETTAB/] OR CALLI AC,41\r
+; ERROR RETURN AC PRESERVED IF LH OR RH TOO BIG OR\r
+ ; AC=-1 IF NOT PRIVILIGED TO GET INFO\r
+; NORMAL RETURN - AC=0 IF TABLE IS UNDEFINED\r
+IFN FTGETTAB,<\r
+ EXTERN JOB,JOBMAX,TTYTAB,TTPMXL,JOBMXL,JBTMXL\r
+\r
+GETTAB: HLRZ ITEM,TAC ;GET USER SUPPLIED JOB NUMBER\r
+ SKIPGE TAC ;DID HE SUPPLY ONE?\r
+ MOVE ITEM, JOB ;NO, USE CURRENT JOB NUMBER\r
+ HRRZS TAC ;GET TABLE NUMBER IN TAC\r
+ CAIL TAC,GTTBLN ;IS TABLE NUMBER LEGAL?\r
+ POPJ PDP, ;YES. ERROR RETURN, AC UNCHANGED\r
+ LDB TAC1,[POINT 9,NUMTAB(TAC),8] ;MAX LEGAL ARG.\r
+ CAMLE ITEM,TAC1 ;DOES HIS ARG EXCEED LEGAL ONE?\r
+ POPJ PDP,0 ;YES. ERROR RETURN\r
+ MOVE TAC,@NUMTAB(TAC) ;GET CONTENTS OF MONITOR TABLE\r
+ AOS (PDP) ;OK (SKIP) RETURN TO USER\r
+ JRST STOTAC ;RETURN TAC IN HIS AC\r
+\r
+;THE MONITOR JOB TABLE NUMBERS:\r
+ EXTERN JBTSTS,JBTADR,JBTPRG,NSWTBL,CNFTBL,NSWMXL,CNFMXL\r
+NUMTAB: XWD ITEM+JBTMXL,JBTSTS ;0 - JOB STATUS BITS\r
+ XWD ITEM+JBTMXL,JBTADR ;1 - JOB SIZE -1 AND ABS.LOC\r
+IFN FTLOGIN,<\r
+ EXTERN PRJPRG\r
+ XWD ITEM+JBTMXL,PRJPRG ;2 - PROJECT,PROGRAMMER NUMBER\r
+>\r
+IFE FTLOGIN,<\r
+ XWD JBTMXL,[0] ;2 - NOT DEFINED\r
+>\r
+ XWD ITEM+JBTMXL,JBTPRG ;3 - PROGRAM BEING RUN\r
+IFN FTTIME,<\r
+\r
+ EXTERN TTIME\r
+\r
+ XWD ITEM+JOBMXL,TTIME ;4 - TOTAL RUN TIME IN JIFFIES\r
+>\r
+IFE FTTIME,<\r
+ XWD JOBMXL,[0] ;4 - NOT DEFINED TABLE - RETURN 0\r
+>\r
+IFN FTKCT,<\r
+ EXTERN JBTKCT\r
+ XWD ITEM+JOBMXL,JBTKCT ;5 - KILO-CORE TICKS(JIFFIES*SIZE IN K)\r
+>\r
+IFE FTKCT,<\r
+ XWD JOBMXL,[0] ;5 NOT DEFINED TABLE - RETURN 0\r
+>\r
+\fIFN FTPRV,<\r
+ EXTERN JBTPRV\r
+ XWD ITEM+JOBMXL,JBTPRV ;6 - PRIVILEGE BITS SET BY LOGIN\r
+>\r
+IFE FTPRV,<\r
+ XWD JOBMXL,[0] ;6 - NOT DEFINED TABLE - RETURN 0\r
+>\r
+IFN FTSWAP,<\r
+ EXTERN JBTSWP,SWPTBL,SWPMXL\r
+ XWD ITEM+JBTMXL,JBTSWP ;7 - LOC ON DISK, SIZE ON DISK, IN CORE PROTECT TIME\r
+>\r
+IFE FTSWAP,<\r
+ XWD JOBMXL,[0] ;7 - NOT DEFINED TABLE - RETURN 0\r
+>\r
+ XWD ITEM+TTPMXL,TTYTAB ;10 - TTY TRANSLATOR TABLE\r
+ XWD ITEM+CNFMXL,CNFTBL ;11 - CONFIGURATION DATA\r
+ XWD ITEM+NSWMXL,NSWTBL ;12 - NON-SWAPPING DATA\r
+IFN FTSWAP,<\r
+ XWD ITEM+SWPMXL,SWPTBL ;13 - SWAPPER DATA\r
+>\r
+IFE FTSWAP,<\r
+ EXP [0] ;13 - UNDEFINED\r
+ ;ALL CALL ARE ERROR RETURNS SINCE TABLE\r
+ ; HAS NO ENTRIES\r
+>\r
+IFN FT2REL,<\r
+\r
+EXTERN JBTSGN,ITMSGN\r
+\r
+ XWD ITMSGN,JBTSGN ;14 - HIGH SEG NO. THIS JOB IS USING\r
+ ;LH=ITEM+JOBMXL IF REENTRANT SOFTWARE\r
+ ;LH=0+JOBMXL, SO ALL ENTRIES RETURN 0\r
+ ; IF NON-REENTRANT SOFTWARE\r
+>\r
+IFE FT2REL,<\r
+ XWD JOBMXL,[0] ;14 - UNDEFINED\r
+>\r
+IFN FTDISK,<\r
+ EXTERN ODPMXL,ODPTBL\r
+ XWD ITEM+ODPMXL,ODPTBL ;15 - ONCE ONLY DISK PARAMETERS\r
+>\r
+IFE FTDISK,<\r
+ EXP [0] ;50 - UNDEFINED\r
+>\r
+GTTBLN=.-NUMTAB ;LENGTH OF TABLE\r
+>\r
+\r
+IFE FTGETTAB,<GETTAB=UUOERR>\r
+\r
+;UUO TO SET CURRENT PROGRAM NAME\r
+; MOVE AC,[SIXBIT /NAME/]\r
+; ALWAYS RETURN\r
+\r
+ EXTERN JBTPRG\r
+\r
+SETNAM: MOVEM TAC,JBTPRG(ITEM) ;STORE PROGRAM NAME FOR SYSTAT AND SYSDPY\r
+ POPJ PDP,\r
+\r
+\f\f\r
+;UUO TO SET JOB TO USE IO IN USER MODE\r
+;AND TO SET PI INTERRUPT LOCATION IN LOWER CORE(WORKS ONLY ON PDP-10'S -SEE NEXT PAGE)\r
+;CALL: CALL AC,[SIXBIT /TRPSET/]\r
+; ERROR RETURN, USER NOT ALLOWED TO DO IO IN USER MODE\r
+; OK RETURN\r
+\r
+;WHERE RH(AC)=REL ADR. OF 1 INSTRUCTION TO BE MOVED INTO\r
+;THE MONITOR PI TRAP LOCATION(40-57) AS SPECIFIED BY LH(AC)\r
+;RELOCATION OF JOB IS ADDED TO RH OF INSTRUCTION AS IT IS MOVED.\r
+;ALSO THE RELOCATION IS ADDED TO THE RH OF WORD IN USER AREA SPECIFIED BY\r
+;RH OF USER INSTRUCTION IN CASE IT IS A BLKO/BLKI POINTER\r
+;THE USER MUST RESET EVERY TRPSET CALL IF BLKI/BLKO POINTER \r
+;AND SHOULD SET RH TO 0 IF JSR PC WORD\r
+;THE APR IS ALSO SET SO USER MAY DO IO IN USER MODE\r
+;TO SET USER MODE IO WITHOUT SETTING LOWER CORE, C(AC)=0\r
+;STOP TIME SHARING ONLY IF AC IS NON-ZERO(IE RUN ONLY JOB 1)\r
+\r
+INTERNAL FTTRPSET\r
+\r
+TRPSET:\r
+IFN FTTRPSET,<\r
+EXTERNAL JOBPD1,STOPTS\r
+\r
+ CAIE ITEM,1 ;IS THIS JOB 1?\r
+ POPJ PDP, ;NO, ERROR RETURN\r
+ SETZM STOPTS ;CLEAR THE STOP TIME SHARING FLAG\r
+ JUMPE TAC,TRPST1 ;IS AC 0?(DO NOT SET PI LOC IF YES)\r
+ HLRZ TAC1,TAC ;NO, SET LOWER CORE\r
+ CAIL TAC1,40 ;IS IT LEGAL LOWER CORE ADR.?\r
+ CAIL TAC1,60\r
+ POPJ PDP, ;NO, ERROR RETURN\r
+ SETOM STOPTS ;SET STOP TIME SHARING FLAG, SO NO OTHER JOBS\r
+ ; JOBS WILL RUN AND NO CORE SHUFFLING\r
+ HRLI TAC,PROG ;YES, SET TO RELOCATE\r
+ MOVE TAC,@TAC ;GET THE INSTR.\r
+ ADDI TAC,(PROG) ;ADD RELOCATION SO WILL POINTER TO USER AREA\r
+ HRRZ DAT,PROG ;USER RELOCATION\r
+ ADDM DAT,(TAC) ;ALSO ADD RELOCATION TO WORD POINTED TO BY INSTR\r
+ ; IN CASE IT IS A BLKI/BLKO POINTER WORD\r
+ ; USER SHOULD RESET RH OF POINTER IF BLKI/BLKO INSTR\r
+ ; OR CLEAR PC LOC IF JSR INSTR\r
+ EXCH TAC,(TAC1) ;AND STORE IN MONITOR TRAP LOC.\r
+TRPST1: AOS (PDP) ;OK RETURN\r
+ MOVSI TAC1,4000 ;SET USER IO PC FLAG\r
+ IORM TAC1,JOBPD1(JDAT) ;IN UUO RETURN PC\r
+>\r
+ JRST STOTAC ;RETURN PREVIOUS CONTENTS OF PI LOC.\r
+\f\r
+;ROUTINE TO DISMISS INTERRUPT FOR JOB DOING USER IO\r
+;WHEN PC IS IN EXEC MODE\r
+;NOTE THE TRPJEN UUO HAS BEEN ELIMINATED\r
+;BECAUSE UUO HANDLER CANNOT BE INTERRUPTED AND REENTERED\r
+;INSTEAD INTERRUPTS IN USER MODE ARE DISMISSED\r
+;BY USING OP CODE 100 (UJEN) WHICH\r
+;TRAPS TO EXEC 61 INSTEAD OF 41 ON PDP-10'S\r
+;UJEN IS A NO-OP ON PDP-6'S AND SO THIS FACILTY IS GOOD ON PDP-10'S ONLY\r
+;CALL: RESTORE ALL EXEC ACS\r
+; UJEN ADR ;UJEN=100\r
+; WHERE ADR CONTAINS PC STORED BY INTERRUPT JSR\r
+; SEE UUO HANDLER (UUO2) FOR CODE\r
+\f;FOR PURPOSES OF COMMENTING THIS SUBROUTINE THE\r
+;TERM 'BUFFER HEADER' SHALL REFER TO THE 3 WORD HEADER\r
+;WHICH IS USED BY THE USER PROGRAM AND THIS EXEC FOR\r
+;REFERING TO THE RING BUFFERS.\r
+\r
+;THE CONTENTS OF THE 3 WORD HEADER (AS SET BY THE MONITOR\r
+; ON EACH INPUT AND OUTPUT UUO).\r
+; BIT 18-35=ADDRESS OF SECOND WORD OF THE\r
+; CURRENT BUFFER IN RING WHICH USER IS REFERENCING\r
+; WORD 2: BYTE POINTER TO CURRENT ITEM.\r
+; WORD 3: POSITIVE ITEM COUNT (NO. OF ITEMS LEFT ON\r
+; INPUT, NO. OF FREE ITEMS TO GO ON OUTPUT).\r
+\r
+;EACH BUFFER IN THE RING HAS FOLLOWING FORMAT (AS THE USER SEES IT)\r
+\r
+; WORD 1: RESERVED FOR BLOCK NUMBER FOR FIXED ADDRESS DEVICES\r
+; WORD 2: BIT 0=USE BIT FOR THIS BUFFER\r
+; BIT 1-17=NO. OF WORDS WHICH FOLLOW (LENGTH OF BUFFER)/\r
+; BIT 18-35=ADDRESS OF SECOND WORD OF NEXT BUFFER IN RING\r
+; WORD 3: LH=LINK TO NEXT BLOCK (SET BY MONITOR FOR DECTAPE)\r
+; RH=NO. OF WORDS OF DATA WHICH FOLLOW (USUALLY\r
+; SET BY EXEC EXCEPT IF THE USER HAS SPECIFIED\r
+; THAT HE WANTS TO COMPUTE WORD COUNT\r
+; HIMSELF INSTEAD OF HAVING THE MONITOR DO IT\r
+; USING THE BYTE POINTER IN THE 3 WORD HEADER).\r
+\r
+\r
+\r
+\r
+\r
+,CALLING SEQUENCE\r
+, CLOSE D,\r
+, EXIT ALWAYS RETURNS HERE\r
+, THIS ROUTINES PROCESSES THE CLOSE UUO AND DETERMINES WHETHER THE\r
+,OUTPUT ROUTINE SHOULD BE CALLED IF OUTPUT WERE ACTIVE, CLEARS\r
+,THE INPUT BUFFER AREA IF INPUT WERE ACTIVE, AND CLEARS THE \r
+,ITEM COUNTS OF BOTH INPUT AND OUTPUT HEADERS SERVING TO BOTH\r
+,TERMINATE THE USE OF THE DEVICE AND SET THE I/O ROUTINES TO\r
+,ACCEPT ANOTHER INPUT OR OUTPUT COMMAND IN A CLEAR STATE.\r
+,IN THE CASE OF OUTPUT DEVICES, THE CLOSE ROUTINE OF THE DEVICE HANDL-\r
+,ING ROUTINE IS CALLED IN CASE ANY SPECIAL HANDLING IS REQUIRED.\r
+\fINTERNAL CLOSE1\r
+EXTERNAL PIOMOD\r
+\r
+CLOSE1: PUSHJ PDP,WAIT1 ;WAIT UNTIL DEVICE IS INACTIVE\r
+ TRNN UUO,CLSIN ;SUPPRESS INPUT CLOSE?\r
+ TLOE DEVDAT,ICLOSB ;NO. INPUT ALREADY BEEN CLOSED?\r
+ JRST UCLS2 ;YES\r
+ LDB TAC,PIOMOD ;NO\r
+ CAIGE TAC,SD ;DUMP MODE?\r
+ JRST UCLSBI ;NO. CLOSE BUFFERED INPUT.\r
+UCLS5: PUSHJ PDP,DCLI(DSER) ;YES. DISPATCH TO DEVICE DEP. ROUTINE\r
+ JRST UCLS2 ;MUST NOT DESTROY UUO,DEVDAT,DSER,UCHN\r
+UCLSBI: MOVE TAC,DEVMOD(DEVDAT)\r
+ TLNE DEVDAT,INBFB+INPB ;WAS AN INPUT BUFFER SETUP?\r
+ JRST UCLS4 ;YES\r
+ TLNE TAC,DVDSK ;CLOSING A DISK FILE ?\r
+ JRST UCLS5 ;YES, DO DEVICE DEPENDENT CLOSE ANYWAY.\r
+ JRST UCLS2 ;NO, CLOSE NOT NECESSARY.\r
+UCLS4: TLNE TAC,DVLNG ;IS THIS A LONG DISPATCH TABLE?\r
+ PUSHJ PDP,DCLI(DSER) ;YES, CLOSE INPUT\r
+ HRRZ TAC1,DEVBUF(DEVDAT)\r
+ HRLI TAC1,PROG\r
+ HRRZ DAT,@TAC1 ;FIRST WORD OF 3 WORD BUFFER HEADER\r
+ HRR TAC1,@TAC1 ;REMEMBER CURRENT BUFFER IN TAC1\r
+ HRLZI TAC,IOUSE ;USED BOTH FOR HEADER AND EACH BUFFER\r
+ JUMPE DAT,UCLS1 ;HAS A RING BEEN SETUP?(NO IF 0)\r
+ HRLI DAT,PROG ;YES\r
+ MOVEI AC1,(DAT) ;IS ADDRESS SPECIFIED BY CONTENTS OF\r
+ PUSHJ PDP,UADRCK ;FIRST WORD OF 3 WORD BUFFER HEADER IN BOUNDS?\r
+ SETZM AC1\r
+UCLS0: HRR DAT,@DAT ;ADVANCE CURRENT INPUT BUFFER ADDRESS\r
+ CAIN AC1,(DAT) ;IS THIS THE SAME BUFFER AS LAST ONE?\r
+ JRST UCLS1 ;YES. BAD RING. LOOPING ON ITSELF.\r
+ MOVEI AC1,(DAT) ;IS ADDRESS OK?\r
+ PUSHJ PDP,UADRCK\r
+ ANDCAM TAC,@DAT ;YES, CLEAR USE BIT.\r
+ CAME TAC1,DAT ;DONE?\r
+ JRST UCLS0\r
+\fEXTERNAL USRJDA\r
+\r
+UCLS1: HRLI DAT,PROG\r
+ HRR DAT,DEVBUF(DEVDAT)\r
+ IORM TAC,@DAT ;FLAG AS VIRGIN BUFFER IN 3 WORD HEADER\r
+ ADDI DAT,2 ;JBFCTR:=0\r
+ SETZM @DAT ;CLEAR INPUT ITEM COUNT.\r
+ MOVE IOS,[XWD IOEND,IODEND]\r
+ ANDCAB IOS,DEVIOS(DEVDAT)\r
+UCLS2: TRNN UUO,CLSOUT ;SUPPRESS OUTPUT CLOSE?\r
+ TLOE DEVDAT,OCLOSB ;NO. OUTPUT ALREADY CLOSED?\r
+ JRST UCLS3 ;YES\r
+ IFN FT2REL,<\r
+ EXTERN RELSEG\r
+ PUSH PDP,UCHN\r
+ PUSHJ PDP,RELSEG ;CLEAR SHARED SEG NAME IF FILE JUST CLOSED HAS\r
+ ; EXTENSION .SHR AND SEG HAS SAME DIRECTORY AND NAME\r
+ POP PDP,UCHN\r
+>\r
+ LDB TAC,PIOMOD ;NO.\r
+ CAIGE TAC,SD ;DUMP MODE?\r
+ JRST UCLSBO ;NO. CLOSE BUFFERED OUTPUT\r
+UCLS7: PUSHJ PDP,DCL(DSER) ;YES. DISPATCH TO DEVICE DEP. ROUTINE\r
+ JRST UCLS3\r
+UCLSBO: TLNN DEVDAT,OUTBFB+OUTPB ;WAS AN OUTPUT BUFFER SET UP?\r
+ JRST UCLS6 ;NO\r
+ HLR DAT, DEVBUF(DEVDAT) ;VIRGIN OUBPUT BUFFER?\r
+ HRLI DAT, PROG\r
+ SKIPG @DAT\r
+ JRST UCLS6 ;YES, DO NOT CLOSE UNLESS IT IS A DISK FILE\r
+UCLS2A: MOVE DSER,DEVSER(DEVDAT)\r
+ SKIPL @DEVOAD(DEVDAT) ;NO, HAS SERVICE ROUTINE WRITTEN\r
+ ; ITS NEXT BUFFER YET?\r
+ JRST UCLS2B ;YES\r
+ TRZ IOS,760000 ;NO,CLEAR ERROR BITS AND START OUTPUT DEVICE\r
+ PUSH PDP,UUO\r
+ PUSHJ PDP,DOU(DSER) ;CALL SERVICE ROUTINE TO DO OUTPUT\r
+ POP PDP,UUO\r
+ PUSHJ PDP,WAIT1 ;WAIT TILL MOST BUFFERS FILLED\r
+ TRNN IOS,760000 ;ERROR?\r
+ JRST UCLS2A ;NO,RETURN WHEN ALL EMPTIED\r
+ ; OR SHUFFLING REQUIRED STOPS DEVICE\r
+\f\r
+UCLS2B: MOVE DSER,DEVSER(DEVDAT)\r
+ PUSHJ PDP,DCL(DSER) ;CLOSE OUTPUT BUFFER\r
+ HLR DAT,DEVBUF(DEVDAT)\r
+ HRLI DAT,PROG\r
+ HRLZI TAC,IOUSE\r
+ IORM TAC,@DAT\r
+ ADDI DAT,2\r
+ SETZM @DAT ;JBFCTR:=0\r
+ PUSHJ PDP,WAIT1\r
+ TLO DEVDAT,OCLOSB ;SET OCLOSB AFTER OUTPUT IS COMPLETE\r
+UCLS3: HLLM DEVDAT,USRJDA(UCHN)\r
+ POPJ PDP, ;EXIT THIS UUO\r
+\r
+UCLS6: MOVSI TAC,DVDSK\r
+ TDNE TAC,DEVMOD(DEVDAT) ;CLOSING A DISK FILE ?\r
+ JRST UCLS7 ;YES, DO DISK CLOSE ROUTINE IN ANY EVENT\r
+ JRST UCLS3\r
+\f,CALLING SEQUENCE\r
+, INBUF D,N\r
+, EXIT RETURNS HERE IF MEMORY NOT EXCEEDED\r
+,CALLING SEQUENCE\r
+, OUTBUF D,N\r
+, EXIT RETURNS HERE IF MEMORY NOT EXCEEDED\r
+, SETS UP AN N BUFFER RING FOLLOWING THE USER'S PROGRAM FOR DEVICE\r
+, D AND INITIALIZES THE JOB BUFFER AREA HEADER:\r
+, JBFADR0:=1, JBFADR 1-17:=0\r
+, JBFADR 18-35:=ADDRESS OF FIRST BUFFER IN RING\r
+,INPUT SETS DEVIAD:=ADDRESS OF FIRST BUFFER IN RING\r
+,OUTPUT SET DEVOAD:=ADDRESS OF FIRST BUFFER IN RING\r
+,BUFPNT IS RESTORED.\r
+\f INTERNAL UINBF, UOUTBF\r
+ EXTERNAL PUUOAC,USRJDA\r
+\r
+\r
+UOUTBF: TLO DEVDAT,OUTBFB ;FLAG OUTBUF UUO DONE\r
+ PUSH PDP,BUFPNT ;SAVE BUFPNT ON STACK\r
+ PUSHJ PDP,BUFCLC ;SET UP BUFFER RING\r
+ HLR TAC,DEVBUF(DEVDAT) ;TAC:=OUTPUT BUFFER AREA HEADER ADDRESS\r
+ HRRM BUFPNT,DEVOAD(DEVDAT) ;DEVOAD:=ADDRESS OF FIRST BUFFER\r
+ ; IN RING\r
+UOBF1: HRLI TAC,PROG ;RELOCATE BUFFER AREA HEADER ADDRESS\r
+ MOVEM BUFPNT,@TAC ;JBFADR:=IOUSE,ADDRESS OF FIRST BUFFER\r
+ ; IN RING\r
+ LDB TAC,PUUOAC\r
+ MOVEM DEVDAT,USRJDA(TAC)\r
+ POP PDP,BUFPNT ;RESTORE BUFPNT FROM STACK\r
+ POPJ PDP, ;EXIT THIS UUO\r
+UINBF: TLO DEVDAT,INBFB ;FLAG INBUF UUO DONE\r
+ PUSH PDP,BUFPNT ;SAVE BUFPNT ON STACK\r
+ PUSHJ PDP,BUFCLC ;SET UP BUFFER RING\r
+ HRRM BUFPNT,DEVIAD(DEVDAT) ;DEVIAD:=ADDRESS OF FIRST BUFFER\r
+ ; IN RING\r
+ HRR TAC,DEVBUF(DEVDAT) ;TAC:=INPUT BUFFER AREA HEADER ADDRESS\r
+ JRST UOBF1\r
+\f;OPEN UUO - PERFORMS SAME OPERATION AS INIT\r
+;MAY BE USED EASILY BY REENTRANT PROGRAMS\r
+;CALLING SEQUENCE FROM USER AREA\r
+; OPEN D,ADR\r
+; ERROR RETURN\r
+; DEVICE INITED\r
+\r
+;LH(ADR)=0,RH(ADR)=DATA MODE THIS INIT\r
+;LH(ADR+1)=OUTPUT BUFFER HEADER ADDRESS\r
+;RH(ADR+1)=INPUT BUFFER HEADER ADDRESS\r
+;C(ADR+2,...,ADR+5)=SAME AS LOOKUP OR ENTER\r
+\r
+INTERNAL UOPEN\r
+\r
+UOPEN: PUSHJ PDP,GETWDU ;SET TAC TO CONTENTS OF FIRST ARG(IO STATUS BITS)\r
+ AOJA UUO,UINIT0 ;MAKE UUO POINT TO ARG+1(WITH PROG STILL\r
+ ; IN INDEX FIELD)\r
+\r
+\r
+,CALLING SEQUENCE\r
+, INIT D,MODUS D=JOB DEVICE CHANNEL\r
+, MODUS=IORDEL,IOCON,IOWC,MODE.\r
+, SIXBIT/NAME/ DEVICE NAME\r
+, XWD OBUF,IBUF BUFFER AREA HEADER ADDRESSES\r
+, EXIT1 DEVICE NOT AVAILABLE\r
+, EXIT2 DEVICE PROPERLY ASSIGNED\r
+,THE LEFT HALF OF NAME CONTAINS THE THREE LETTER DEVICE MNEMONIC,\r
+, THE RIGHT HALF IS EITHER ZERO (SYSTEM WILL ASSIGN AN ARBITRARY\r
+, UNIT) OR NON-ZERO TO REQUEST A SPECIFIC UNIT (LEFT JUSTIFIED).\r
+,IF THE SELECTED DEVICE IS NOT AVAILABLE, CONTROL RETURNS TO EXIT1.\r
+,OTHERWISE, THE DEVICE IS ASSIGNED TO THE USER AND ATTACHED TO HIS\r
+,CHANNEL D. THE DEVICE IS INITIALIZED IN THE FOLLOWING MANNER AFTER\r
+,IOACT IS ZERO:\r
+, IOBEG:=1\r
+, DATA MODE:=BITS 32-35 OF AC UUO\r
+, IOCON:=BIT 31 OF AC UUO\r
+, IOWC:=BIT 30 OF AC UUO\r
+, IORDEL:=BIT 29 OF AC UUO\r
+, IOACT:=IODEND:=IOBKTL:=IODTER:=IODERR:=IOIMPM:=0\r
+, JBFADR:=JBFCTR:=0 FOR THE SPECIFIED BUFFERS.\r
+, DEVBUF:=OBUF,IBUF\r
+\fINTERNAL UINIT\r
+EXTERNAL STREQ,STUSER\r
+EXTERNAL USRJDA,USRHCU,SYSTAP,TPOPJ,TPOPJ1,IADPTR\r
+\r
+UINIT: MOVE TAC,UUO ;SAVE FIRST ARG(IO STATUS BITS) IN TAC\r
+ HRR UUO,-1(PDP) ;SET UUO TO ADR+1 OF USER ARGS\r
+ AOS -1(PDP) ;SET RETURN SKIP THE 2 ARGUMENTS\r
+ AOS -1(PDP)\r
+UINIT0: PUSH PDP,UUO ;HERE ON OPEN UUO, SAVE ADR+1 OF USER ARGS\r
+ PUSH PDP,TAC ;SAVE IO STATUS BITS(FIRST ARG)\r
+ SKIPE DEVDAT,USRJDA(UCHN) ;IS A DEVICE ALREADY ASSIGNED TO THIS CHAN?\r
+ CAMLE UCHN,USRHCU ;YES, IS THIS CHAN. LESS OR EQUAL TO HIGHEST\r
+ ; CHAN. FOR THIS USER?\r
+ JRST UINITA ;NO, NO PREVIOUS DEVICE TO RELEASE\r
+ PUSHJ PDP,RELEA0 ;RELEASE PREVIOUS DEVICE ON THIS CHAN.\r
+UINITA: MOVE UUO,-1(PDP) ;RESTORE UUO (ADR+1 OF 3 ARGS)\r
+ PUSHJ PDP,GETWDU ;C(TAC)=DEVICE NAME IF IN BOUNDS\r
+ ; DO NOT RETURN IF OUT OF BOUNDS(PRINT ERR AND STOP)\r
+ ; SET ITEM TO CURRENT JOB NUMBER\r
+ PUSHJ PDP,DEVSRC ;SEARCH FOR DEVICE NAME\r
+ ; (SET SYSDEV BIT IN LH OF\r
+ ; DEVDAT IF THIS IS SYSTEM TAPE)\r
+ JRST UINITE ;NO SUCH DEVICE\r
+ MOVE UUO,(PDP) ;RESTORE USER'S MODE SETTING\r
+ PUSHJ PDP,CHKMOD ;CHECK FOR LEGAL MODE, IF NOT RIGHT DONT RETURN\r
+ MOVE TAC,DEVNAM(DEVDAT) ;PHYSICAL DEVICE NAME\r
+ CAME TAC,[SIXBIT /DSK/] ;NOT DISK?\r
+ CAME TAC,SYSTAP ;SYSTEM TAPE DEVICE?\r
+ JRST UINIT1 ;NO, DISK OR NOT SYSTEM TAPE\r
+ AOSE STREQ ;SYSTEM TAPE, INCREMENT REQUEST COUNT\r
+ PUSHJ PDP,STWAIT ;SYSTEM TAPE BUSY, PUT JOB IN WAIT\r
+ MOVEM ITEM,STUSER ;SET THIS JOB AS ONLY USER OF SYSTEM TAPE\r
+ ; CONTROL C DOES NOT STOP JOB WHILE USING S. T.\r
+UINIT1: MOVE TEM,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS\r
+ TLNN TEM,DVDTA ;IS THIS DEVICE A DECTAPE?\r
+ JRST UINITB ;NO\r
+ LDB TAC1,IADPTR ;YES, GE NO OF USER CHANS DEV INITED ON\r
+ HRR TEM,TAC1 ;SAVE OLD NUMBER\r
+ AOS TAC1 ;INCREASE CHANNEL COUNT\r
+ CAIL TAC1,3 ;ANY MORE THAN JUST 2 CHANNELS?\r
+ JRST UINITE ;YES, GIVE ERROR RETURN(POP TAC)\r
+ DPB TAC1,IADPTR ;YES, STORE UPDATED CHANNEL COUNT FOR THIS DEVICE(DTA)\r
+UINITB: MOVEI TAC1,ASSPRG ;TRY TO ASSIGN IT BY PROGRAM\r
+ PUSHJ PDP,ASSASG\r
+ JRST UINIT6 ;NOT AVAILABLE, GIVE ERROR RETURN(POP TAC)\r
+ POP PDP,UUO ;RESTORE USER'S MODE SETTING\r
+ PUSHJ PDP,SETIOS ;SET DDB IOS STATUS WORD\r
+ ; FROM RT. HALF OF AC UUO\r
+ ; WAIT FOR DEVICES TO BECOME INACTIVE IN CASE IT IS\r
+ ; INITED ON A DIFFERENT CHANNEL(OR MONITOR COMMAND\r
+ ; RESPONSE ON TTY)\r
+ MOVSI IOS,IOBEG\r
+ IORB IOS,DEVIOS(DEVDAT)\r
+\fUINITL: CAMG UCHN,USRHCU ;IS THIS CHAN. .GT. HIGHEST CHAN. IN USE?\r
+ JRST UINITC ;NO\r
+ AOS TAC,USRHCU ;YES, BUMP HIGHEST SO FAR BY ONE\r
+ SETZM USRJDA(TAC) ;AND CLEAR IT OUT\r
+ JRST UINITL ;AND KEEP LOOKING\r
+\r
+UINITC: TLO DEVDAT,INITB+ICLOSB+OCLOSB;SET INIT UUO BIT\r
+ ;PREVENT SUPERFLUOUS CALLS TO CLOSE (SEE LOOKUP,ENTER)\r
+ AOS UUO,(PDP) ;ADVANCE TO 3RD ARG(BUFFER HEADER)\r
+ PUSHJ PDP,GETWDU ;C(TAC)=BUFFER HEADER ARG\r
+ HLRZ TAC1,TAC ;OUTPUT BUFFER HEADER FROM USER\r
+ JUMPE TAC1,UINIT4 ;WAS ONE SPECIFIED?\r
+ HRLM TAC1,DEVBUF(DEVDAT);YES, SET DEVICE DATA BLOCK\r
+ TLO DEVDAT,OBUFB ;SET OUTPUT BUFFER SPECIFIED BIT\r
+ PUSHJ PDP,UINITZ ;INITIALIZE OUTPUT BUFFER HEADER\r
+UINIT4: PUSHJ PDP,GETWDU ;C(TAC)=BUFFER HEADER ARG FROM USER\r
+ HRRZ TAC1,TAC ;INPUT BUFFER HEADER\r
+ JUMPE TAC1,UINIT5 ;WAS ONE SPECIFIED?\r
+ HRRM TAC1,DEVBUF(DEVDAT) ;YES, SET DEVICE DATA BLOCK\r
+ TLO DEVDAT,IBUFB ;SET INPUT BUFFER SPECIFIED BIT\r
+ MOVSI IOS,IOEND ;CLEAR END OF FILE FLAG\r
+ ANDCAB IOS,DEVIOS(DEVDAT) ;AND RETAIN IOS\r
+ PUSHJ PDP,UINITZ ;INITIALIZE INPUT BUFFER HEADER\r
+UINIT5: MOVEM DEVDAT,USRJDA(UCHN) ;STORE UUO BITS AND DEVICE\r
+ ; DATA BLOCK ADDRESS\r
+ JRST TPOPJ1 ;SUCCESSFUL RETURN(POP TAC)\r
+\r
+UINIT6: TLNE TEM,DVDTA ;WAS DEVICE A DECTAPE?\r
+ DPB TEM,IADPTR ;YES, RESTORE NO. OF USER CHAN INITED ON\r
+UINITE: POP PDP,TAC ;REMOVE IO STATUS ARG\r
+ JRST TPOPJ ;AND GIVE ERROR RETURN AND POP TAC\r
+\f,CALLING SEQUENCE\r
+, PUSHJ PDP,UINITZ\r
+, EXIT RETURNS HERE IF MEMORY NOT EXCEEDED.\r
+,SETS JBFADR:=JBFCTR:=0 FOR THE BUFFER AREA HEADER WHOSE ADDRESS\r
+,IS IN AC TAC1. ALSO,JBFPTR 0-5:=JBFPTR 12-17:=0,JBFPTR 6-11:=BYTE SIZE\r
+\r
+\r
+UINITZ: HRLI TAC1,PROG ;SET FOR RELOCATION\r
+ MOVEI AC1,2(TAC1) ;CHECK 3RD WORD OF BUFFER HEADER\r
+ PUSHJ PDP,UADRCK\r
+ SETZM @TAC1 ;CLEAR FIRST WORD (CURRENT BUFFER) OF 3 WORD HEADER\r
+ AOS TAC1 ;POINT TO SECOND WORD (BYTE POINTER)\r
+ PUSH PDP,TAC1\r
+ AOS TAC1 ;POINT TO THIRD WORD (ITEM COUNT)\r
+ SETZM @TAC1 ;SET ITEM COUNT TO ZERO\r
+ PUSHJ PDP,SETBYT ;SET BYTE SIZE ACCORDING TO MODE AS SET IN AC IOS\r
+ TLZ TAC,770077\r
+ POP PDP,TAC1\r
+ HLLM TAC,@TAC1 ;AND STORE IN SECOND WORD\r
+ POPJ PDP, ;RETURN\r
+\f;LONG DISPATCH TABLE UUOS - GET HERE ONLY IF DEVICE HAS LONG\r
+;DISPACTH TABLE\r
+;DISPACTH TO DEVICE DEPENDENT SERVICE ROUTINE\r
+;ENTER UUO - ENTER FILE NAME IN DIRECTORY\r
+\r
+EXTERNAL USRJDA\r
+\r
+UDEN: MOVEI TAC,CLSIN\r
+ TLNN DEVDAT,OCLOSB ;FILE OPEN?\r
+ PUSHJ PDP,UDLKC ;YES. CLOSE IT[OCLOSB_1]\r
+ TLO IOS,IOBEG\r
+ TRZ IOS,776000\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ HLLM DEVDAT,USRJDA(UCHN) ;STORE UUO BITS\r
+ PUSHJ PDP,DEN(DSER) ;ATTEMPT AN ENTER\r
+ POPJ PDP, ;FAILURE\r
+ TLZ DEVDAT,OCLOSB\r
+ TLO DEVDAT,ENTRB ;NOTE SUCCESSFUL ENTER\r
+ JRST DLKDEN ;STORE THE PROGRESS BITS\r
+\r
+;LOOKUP UUO - LOOKUP FILE NAME IN DIRECTORY\r
+\r
+EXTERNAL USRJDA\r
+\r
+UDLK: MOVEI TAC,CLSOUT ;IN HIBIT OUTPUT CLOSE BIT\r
+ TLNN DEVDAT,ICLOSB ;FILE OPEN?\r
+ PUSHJ PDP,UDLKC ;YES. CLOSE IT[ICLOSB_1]\r
+ TDZ IOS,[XWD IOEND,776000]\r
+ MOVEM IOS,DEVIOS(DEVDAT)\r
+ HLLM DEVDAT,USRJDA(UCHN) ;STORE UUO BITS\r
+ PUSHJ PDP,DLK(DSER) ;ATTEMPT A LOOKUP\r
+ POPJ PDP, ;FAILURE\r
+ TLZ DEVDAT,ICLOSB\r
+ TLO DEVDAT,LOOKB ;NOTE SUCCESSFUL LOOKUP\r
+DLKDEN: LDB TAC,PUUOAC ;GET CHANNEL #\r
+ HLLM DEVDAT,USRJDA(TAC) ;STORE UUO PROGRESS BITS\r
+ JRST CPOPJ1 ;SUCCESS RETURN TO USER (CALL+2)\r
+\r
+INTERNAL UDLKC\r
+\r
+UDLKC: PUSH PDP,UUO\r
+ HRRI UUO,(TAC)\r
+ PUSHJ PDP,CLOSE1\r
+ POP PDP,UUO\r
+ JRST WAIT1\r
+\f;RENAME UUO - HERE ON SHORT DISPATCH TABLE DEVICES TOO\r
+INTERNAL FT2REL\r
+\r
+EXTERNAL CPOPJ1\r
+\r
+URENAM: MOVE TAC,DEVMOD(DEVDAT) ;IS THIS DEVICE A LONG DISPATCH TABLE?\r
+ TLNN TAC,DVLNG\r
+ JRST CPOPJ1 ;NO, GIVE SKIP RETURN TO USER\r
+IFE FT2REL,<\r
+ JRST DRN(DSER) ;YES, DISPATCH TO SERVICE ROUTINE\r
+>\r
+IFN FT2REL,<\r
+ EXTERN RELSG1\r
+ PUSHJ PDP,DRN(DSER) ;TRY TO RENAME (SERVICE ROUTINE)\r
+ POPJ PDP, ;ERROR,ERROR RETURN TO USER\r
+ JRST RELSG1 ;SUCCESSFUL RENAME, GO ZERO SHARABLE SEG NAME\r
+ ; IF NEW FILE EXT IS .SHR AND FILE NAME\r
+ ; FIND DIRECTORY (DEVICE) ARE SAME AS SHARABLE SEG\r
+ ; ALWAYS SKIP RETURN\r
+>\r
+\r
+;SETO UUO - SET NEXT OUTPUT BLOCK NUMBER(DECTAPE)\r
+\r
+UDSO: JRST DSO(DSER)\r
+\r
+;SETI UUO - SET NEXT INPUT BLOCK NUMBER\r
+\r
+UDSI: JRST DSI(DSER)\r
+\r
+;GETF UUO - GET NEXT FREE BLOCK\r
+\r
+UDGF: JRST DGF(DSER)\r
+\r
+;MTAPE UUO - MAGTAPE OPERATIONS\r
+\r
+UMTAPE: JRST DMT(DSER)\r
+\r
+;UTPCLR - CLEAR DECTAPE DIRECT.\r
+\r
+UTPCLR: MOVE TAC,DEVMOD(DEVDAT) ;IS THIS A LONG DISPATCH TABLE?\r
+ TLNN TAC,DVLNG\r
+ POPJ PDP, ;NO,RETURN\r
+ JRST DCLR(DSER) ;YES, DISPATCH\r
+\f;INPUT UUO\r
+\r
+;1) IF OUTPUT ACTIVE ON THIS CHANNEL, WAIT FOR IT TO COMPLETE.\r
+;2) IF DUMP MODE, WAIT FOR DEVICE INACTIVE, CALL SERVICE\r
+; ROUTINE TO START INPUT, WAIT TILL COMPLETE, THEN RETURN TO USER.\r
+;3) IF NO BUFFER RING SETUP, SET UP 2 RING BUFFER.\r
+;4) IF FIRST REFERENCE, START SERVICE ROUTINE, GO TO\r
+;5) FLAG CURRENT BUFFER AS FREE TO RECEIVE MORE INPUT\r
+; (USE BIT SET TO 0).\r
+; START SERVICE ROUTINE FILLING FIRST BUFFER WITH USE BIT 0\r
+; (NEXT BUFFER OR ONE AHEAD OF IT)\r
+; (SERVICE ROUTINE WILL SET USE BIT WHEN IT FINISHES FILLING\r
+; BUFFER).\r
+;7) IF NEXT INPUT BUFFER IS FULL OF DATA, GO TO 10).\r
+;8) PUT JOB IN IO WAIT TILL NEXT BUFFER FILLED.\r
+;9) IF NEXT INPUT BUFFER STILL NOT FILLED, CHECK FOR END\r
+; OF FILE OR ERROR BITS SET BY SERVICE ROUTINE.\r
+;10) CONVERT WORD COUNT AS STORED BY SERVICE ROUTINE IN THIRD\r
+; WORD OF BUFFER TO ITEM COUNT AND STORE IN THIRD WORD\r
+; OF HEADER (ITEM COUNT) ALSO SET BYTE POINTER (SECOND\r
+; WORD OF HEADER) AND RETURN TO USER.\r
+\fINTERNAL IN\r
+EXTERNAL USRJDA,PIOMOD\r
+\r
+IN: TLNE IOS,IO ;IS THIS DEVICE ALREADY DOING OUTPUT?\r
+ PUSHJ PDP,WAIT1 ;YES, WAIT TILL IT IS FINISHED.\r
+ TLO DEVDAT,INPB ;FOR THIS DEVICE.\r
+ TLZ DEVDAT,ICLOSB\r
+ HLLM DEVDAT,USRJDA(UCHN) ;IN LH OF CURRENT JOB DEVICE CHANNEL\r
+ LDB TAC,PIOMOD ;IO MODE\r
+ CAIL TAC,SD ;IT THE IO MODE DUMP(SD,D,DR)?\r
+ JRST INDMP ;YES\r
+IN1: HRR JBUF,DEVBUF(DEVDAT) ;NO, GET ADDRESS OF BUFFER HEADER\r
+ HRLZI TAC,IOUSE ;BUFFER INUSE BIT\r
+ HRLI JBUF,PROG ;SET INDEX FIELD FOR RELOCATION USING AC PROG\r
+ MOVEI AC1,2(JBUF) ;CHECK BUFFER HEADER\r
+ PUSHJ PDP,UADRCK\r
+ MOVE IOS,DEVIOS(DEVDAT) ;SETUP IO STATUS AGAIN FORM FROM MEMORY\r
+ ; AC IOS IS CLOBBERED BY AUTOMATIC CORE EXPANSION\r
+ ; ON AN IMPLICIT INBUF ON FIRST INPUT\r
+ MOVE TAC1,@JBUF ;GET WORD 1 OF 3 WORD BUFFER HEADER.\r
+ HRLI TAC1,PROG ;SET INDEX FIELD COR RELOCATION USING AC PROG\r
+ SKIPG @JBUF ;HAS A BUFFER RING BEEN SET UP (RH NON-ZERO)\r
+ ; WHICH HAS BEEN REFERENCED BY PREVIOUS INPUT (BIT0=0)\r
+ JRST INPUTF ;NO. GO SET UP BUFFER IF NECESSARY AND DO FIRST IO\r
+ HRRZ AC1,TAC1 ;YES, CHECK ADR. TO SEE IF OK\r
+ PUSHJ PDP,UADRCK\r
+ MOVE IOS,DEVIOS(DEVDAT)\r
+ TDNN TAC,@TAC1\r
+ JRST INPT1\r
+ ANDCAB TAC,@TAC1 ;FLAG CURRENT BUFFER AS FREE TO\r
+ ; RECEIVE MORE INPUT, CLEAR USE BIT\r
+ ; AND GET POINTER TO NEXT BUFFER\r
+ HRRM TAC,@JBUF ;SET WORD 1 IN 3 WORD HEADER TO NEXT BUFFER\r
+ HRRZ AC1,TAC ;AND CHECK ITS ADDRESS TO SEE IF IN BOUNDS\r
+ PUSHJ PDP,UADRCK\r
+ TRNE IOS,IOACT ;IS THE DEVICE ALREADY ACTIVE\r
+ JRST INPT0C ;YES\r
+ MOVE AC1,DEVMOD(DEVDAT) ;GET DEVICE CHARACTERISTIC WORD\r
+ HRLI TAC,PROG ;SET FOR RELOCATION\r
+ TLNN AC1,DVTTY ;IS IT A TTY?\r
+ HRR TAC,@TAC ;GET POINTER 1 BUFFER AHEAD OF NEXT BUFFER\r
+ ; IF NOT TTY.\r
+ HRRZ AC1,TAC ;SEE IF USER HAS CLOBBERED POINTER\r
+ PUSHJ PDP,UADRCK\r
+ SKIPL @TAC ;IS THE USE BIT SET?\r
+ PUSHJ PDP,CALIN ;NO, START SERVICE ROUTINE FILLING EMPTY BUFFER\r
+INPT0C: HRR TAC1,@TAC1 ;GET USE BIT FOR NEXT BUFFER\r
+INPT0A: SKIPGE @TAC1 ;IS USE BIT SET YET?(BUFFER FILLED YET?)\r
+ JRST INPUT2 ;YES, RETURN IMMEDIATELY TO USER\r
+\fINPT2: PUSHJ PDP,WSYNC ;NO, PUT JOB IN IO WAIT TILL BUFFER FILLED.\r
+ SKIPL @TAC1 ;RETURN WHEN BUFFER FILLED. CHECK TO MAKE SURE.\r
+ JRST INEOF ;NO, MUST BE EOF OR ERROR\r
+INPUT2: ADDI TAC1,1 ;YES, GET WORD COUNT AS SET BY IO SERVICE\r
+ HRRZ ITEM,@TAC1 ;RH OF 3RD WORD(FIRST SO-CALLED DATA WORD)\r
+ SOJA TAC1,IOSETC ;SET ITEM COUNT AND BYTE POINTER\r
+ ; IN 3 WORD HEADER AND RETURN TO USER\r
+\r
+INPT1: TRNN IOS,IOACT\r
+ PUSHJ PDP,CALIN\r
+ JRST INPT2\r
+\r
+\r
+INEOF: TDNN IOS,[XWD IOEND,IODERR+IOBKTL+IODTER+IOIMPM]\r
+ ; EOF OR ERROR BIT SET BY SERVICE ROUTINE\r
+ JSP DAT,UUOERR ;NO,MONITOR ERROR AT UUO LEVEL\r
+ TLNE IOS,IOEND ;IS THIS EOF?\r
+ TRO IOS,IODEND ;YES, SET USER EOF BIT.\r
+ IORM IOS,DEVIOS(DEVDAT)\r
+ POPJ PDP, ;RETURN TO USER'S PROGRAM\r
+\r
+\r
+\r
+;HERE ON FIRST INPUT AFTER INIT, INIT & LOOKUP, OR INIT & LOOKUP & INPUT\r
+INPUTF: ANDCAB TAC,@JBUF ;MARK THAT BUFFERS HAVE BEEN REFER\r
+ ; BY CLEARING SIGN BIT OF 1ST WORD IN 3 WORD\r
+ ; IN 3 WORD BUFFER HEADER\r
+ JUMPE TAC,INPUT3 ;HAS A RING BEEN SET UP YET?\r
+ HRRZ AC1,TAC1 ;YES ADDRESS CHECK FIRST USER BUFFER\r
+ PUSHJ PDP,UADRCK ;\r
+ SKIPG @TAC1 ;IS USE BIT SET IN FIRST USER INPUT BUFFER?\r
+ ; CAN HAPPEN IF TTY AND USER HAS TYPED\r
+ ; IN LINE AFTER INBUF BUT BEFORE FIRST INPUT UUO\r
+ JRST INPUT2 ;YES, DO NOT CALL SERVICE ROUTINE(SCNSER)\r
+ ; SINCE USER BUFFER ALREADY HAS DATA\r
+ HRRM TAC,DEVIAD(DEVDAT) ;YES, STORE ADR. OF 2ND WORD OF\r
+ ; A BUFFER FOR SERVICE ROUTINE\r
+ PUSHJ PDP,CALIN ;YES. GO START IO SERVICE ROUTINE\r
+ ; FILLING BUFFER\r
+ JRST INPT0A\r
+INPUT3: HRRI UUO,2 ;BUFFERS NOT SETUP YET.\r
+ ; SET UP 2\r
+ PUSHJ PDP, UINBF\r
+ HLLZS UUO ;CLEAR RIGHT HALF\r
+ JRST IN1\r
+\r
+\r
+INDMP: PUSHJ PDP,WSYNC ;INPUT DUMP\r
+ PUSHJ PDP,DDI(DSER) ;CALL SERVICE ROUTINE\r
+ JRST WAIT1 ;THEN WAIT TILL IO FINISHED BEFORE\r
+ ; RETURNING TO USER.\r
+\f\r
+EXTERNAL JOBPFI,USRREL\r
+\r
+CALIN: TLNE IOS,IOEND\r
+ POPJ PDP,\r
+ PUSH PDP,TAC1\r
+ PUSH PDP,JBUF\r
+ HRRZ AC1,DEVIAD(DEVDAT) ;IS FIRST ADR. ABOVE JOB DATA AREA?\r
+ CAIG AC1,JOBPFI\r
+ JRST ADRERR ;NO, PRINT ERROR AND STOP JOB\r
+ HLRZ AC2,@DEVIAD(DEVDAT) ;GET LENGTH OF BUFFER\r
+ TRZ AC2,IOUSE ;CLEAR USE BIT IN CASE IT IS ON(TTY)\r
+ ADD AC1,AC2\r
+ CAMLE AC1,USRREL ;IS LAST ADDRESS IN BOUNDS?\r
+ JRST ADRERR ;NO, STOP JOB AND PRINT ERROR\r
+ PUSHJ PDP,DIN(DSER) ;DISPATCH TO IO SERVICE ROUTINE\r
+ POP PDP,JBUF\r
+ POP PDP,TAC1\r
+ POPJ PDP,\r
+\f,CALLING SEQUENCE\r
+, OUTPUT D,\r
+, EXIT\r
+,OR\r
+, OUTPUT D, ADR\r
+, EXIT\r
+\r
+,IF INPUT IS ACTIVE, WAIT FOR IT TO COMPLETE.\r
+,IF DUMP MODE WAS SELECTED BY THE LAST INIT UUO OR SETSTS UUO\r
+, THE PROGRAM WAITS UNTIL THE DEVICE IN INACTIVE AND THEN\r
+, WRITES THE DUMPFILE AND RETURNS CONTROL TO THE USER'S PROGRAM\r
+, WHEN IO HAS COMPLETED.\r
+,IF THE MODE IS NOT DUMP, THEN\r
+,1) IF ADR IS NOT ZERO, WAIT FOR DEVICE TO BECOME INACTIVE THEN SET THE\r
+, CURRENT BUFFER ADDRESS EQUAL TO ADR AND AN INDICATOR (JBFADR0)\r
+, SPECIFYING THAT THIS BUFFER RING HAS NEVER BEEN REFERENCED FROM THE\r
+, USER'S PROGRAM BY AN INPUT OR AN OUTPUT UUO. OTHERWISE, GO TO\r
+, 2) DIRECTLY.\r
+\r
+,2) IF THE BUFFER RING HAS NEVER BEEN REFERENCED (JBFADR0=1), THE\r
+, BUFFER IS CLEARED, IOUSE SET TO ZERO AND\r
+, IF THE CURRENT BUFFER ADDRESS IS ZERO, A TWO BUFFER RING IS SET UP.\r
+, THEN GO TO 8\r
+,\r
+,3) IF THE BUFFER RING HAS BEEN REFERENCED (JBFADR0=0 ,THEN A CHECK IS\r
+, MADE TO DETERMINE IF THE WORD COUNT IS TO BE COMPUTED.\r
+, IF THE WORD COUNT IS TO BE COMPUTED (IOWC=0), IT IS SET EQUAL\r
+, TO THE ADDRESS FOR THE LAST DATA WORD MINUS THE ADDRESS OF THE\r
+, BUFFER MINUS ONE.\r
+\r
+,4) IOUSE IS SET TO ONE, INDICATING THAT THE BUFFER IS FULL OR BEING\r
+, EMPTIED, AND THE CURRENT BUFFER ADDRESS IS ADVANCED.\r
+\r
+,5) IF THE DEVICE IS NOT ACTIVE (IOACT=0), OUTPUT IS STARTED.\r
+,6) IF THE CURRENT BUFFER IS FULL OR BEING EMPTIED (IOUSE=1),\r
+, THE PROGRAM WAITS UNTIL THE DEVICE FINISHES THE BUFFER\r
+, (THE OUTPUT SERVICE ROUTINE CLEARS THE USE BIT WHEN\r
+, IT FINISHES OUTPUTTING A BUFFER).\r
+,7) THE CURRENT BUFFER IS CLEARED.\r
+,8) THE ITEM POINTER IS INITIATED TO THE CURRENT BUFFER ADDRESS+1\r
+, AND THE ITEM COUNT IS SET TO THE PRODUCT OF THE BUFFER SIZE\r
+, MINUS ONE AND THE INTEGER PART OF 36/BYTE SIZE.\r
+,9) RETURN TO THE USER'S PROGRAM\r
+\f;HERE ON OUTPUT UUO\r
+EXTERNAL USRJDA,PIOMOD\r
+\r
+UOUT: TLO DEVDAT,OUTPB ;SET OUTPUT UUO BIT\r
+ TLZ DEVDAT,OCLOSB ;CLEAR CLOSE OUTPUT BIT\r
+\r
+;HERE FROM DEVICE SERVICE ROUTINES ON CLOSE UUO\r
+\r
+INTERNAL OUT\r
+\r
+OUT: TLNN IOS,IO ;IS THIS DEVICE ALREADY DOING INPUT?\r
+ PUSHJ PDP,WAIT1 ;YES, WAIT TILL IT BECOMES INACTIVE\r
+ HLLM DEVDAT,USRJDA(UCHN);SAVE NEW BIT SETTINGS.\r
+ LDB TAC,PIOMOD ;GET DATA MODE SET BY INIT OR SETSTS.\r
+ CAIL TAC,SD ;IS IT DUMP MODE(SD,DR,D)?\r
+ JRST OUTDMP ;YES.\r
+ PUSHJ PDP,OUTA ;NO, CHECK FOR NON-ZERO ADDRESS(USER\r
+ ; CHANGING RING)\r
+ HLR JBUF,DEVBUF(DEVDAT) ;REL. ADDR. OF OUTPUT BUFFER HEADER\r
+ MOVEI AC1,2(JBUF) ;CHECK END OF 3 WORD HEADER\r
+ PUSHJ PDP,UADRCK\r
+ HRLI JBUF,PROG ;SET INDEX FIELD FOR RELOCATION.\r
+ SKIPG TAC1,@JBUF ; CHECK FIRST WORD OF BUFFER HEADER\r
+ JRST OUTF ;RING NOT SET UP OR FIRST REFERENCE TO RING\r
+ AOS JBUF ;COMPUTE WORD COUNT FROM BYTE POINTER\r
+ HRRZ TAC,@JBUF ;GET RH OF BYTE POINTER.\r
+ ADDI TAC1,1 ;REL. ADDR. OF 3RD WORD IN BUFFER.\r
+ SKIPE TAC\r
+ SUB TAC,TAC1 ;DISTANCE FILLED BY USER.\r
+ HRLI TAC1,PROG\r
+ TRNE IOS,IOWC ;DOES USER WANT SYSTEM TO COMPUTE WORD\r
+ ; COUNT FROM BYTE POINTER?\r
+ JRST OUT2 ;NO.\r
+ HRRZ AC1,TAC1 ;PROCEED ONLY IF ADDR. OF WORD COUNT IN BOUNDS\r
+ ADDI AC1,(TAC) ;FORM REL. ADR OF LAST WORD TO OUTPUT\r
+ PUSHJ PDP,UADRCK\r
+ HRRM TAC,@TAC1 ;YES, STORE WORD COUNT IN 3RD WORD OF BUFFER.\r
+\fOUT2: SUBI JBUF,1 ;REL. ADDR. OF 1ST WORD IN HEADER\r
+ ; (POINTER TO CURRENT BUFFER).\r
+ SUBI TAC1,1 ;REL. ADDR. OF 2ND WORD IN BUFFER\r
+ ; (LINK TO NEXT BUFFER).\r
+ HRLZI TAC,IOUSE ;FLAG CURRENT BUFFER CONTAINS ACTIVE DATA.\r
+ IORB TAC,@TAC1\r
+ HRRM TAC,@JBUF ;ADVANCE CURRENT BUFFER ADDRESS\r
+ MOVE IOS,DEVIOS(DEVDAT) ;IS DEVICE ACTIVE?\r
+ TRNN IOS,IOACT\r
+ PUSHJ PDP,DOU(DSER) ;NO,START OUTPUT.\r
+ HLR JBUF,DEVBUF(DEVDAT) ;JBUF TO REL. ADDR. OF BUFFER HEADER\r
+ HRLI JBUF,PROG ;SET TO RELOCATE\r
+ MOVE TAC1,@JBUF ;TAC1 TO REL. ADDR. OF 2ND WORD OF BUFFER.\r
+ HRRZ AC1,TAC1\r
+ PUSHJ PDP,UADRCK\r
+ HRLI TAC1,PROG\r
+ MOVEI TAC,@JBUF\r
+ HLLZS 1(TAC)\r
+ SKIPG @TAC1 ;HAS SERVICE ROUTINE EMPTIED NEXT BUFFER\r
+ ; YET (USE BIT = 0)?\r
+ PUSHJ PDP,WSYNC ;NO, WAIT.\r
+ JRST OUTS ;RETURN TO USER.\r
+\r
+\r
+OUTF: SKIPE TAC1,@JBUF\r
+ JRST OUTF1\r
+ HRRI UUO,2\r
+ PUSHJ PDP,UOUTBF\r
+ HLR JBUF,DEVBUF(DEVDAT)\r
+ HRLI JBUF,PROG\r
+OUTF1: HRLZI TAC, IOUSE\r
+ ANDCAB TAC, @JBUF ;IOUSE:=0\r
+ HRRM TAC,DEVOAD(DEVDAT)\r
+OUTS: HRRZ TAC,@JBUF ;CLEAR NEXT OUTPUT BUFFER.\r
+ PUSHJ PDP,BUFCLR ;BEING CLEARED.\r
+ JRST ADRERR ;ADDRESS CHECK\r
+ HRR TAC1,@JBUF\r
+ HRLI TAC1,PROG\r
+ LDB ITEM,[POINT 17,@TAC1,17]\r
+ SOJA ITEM,IOSETC\r
+ ; ADDRESS+1\r
+ ; JBFCTR:=(BUFFER SIZE-1)*[36/BYTE\r
+ ; SIZE]\r
+ ; RETURN TO USER'S PROGRAM\r
+\r
+OUTDMP: PUSHJ PDP,WSYNC\r
+ PUSHJ PDP,DDO(DSER)\r
+ JRST WAIT1 ;WAIT BEFORE RETURNING TO USER\r
+\f\r
+,CALLING SEQUENCE:\r
+, PUSHJ PDP,OUTA\r
+, EXIT ALWAYS RETURNS HERE\r
+,IF THE ADDRESS FIELD OF AC UUO IS ZERO,EXIT. OTHERWISE,CHECK IOACT.\r
+,IF IOACT=1, WAIT FOR IOACT=0.\r
+,SET JBFADR18-35:=ADDRESS FIELD OF AC UUO. JBFADR0:=1 AND EXIT.\r
+\r
+ INTERN OUTA\r
+OUTA: TRNN UUO,777774 ;IS BUFFER ADDRESS SPECIFIED?\r
+ POPJ PDP, ;NO\r
+ PUSHJ PDP,WAIT1\r
+ HLR JBUF,DEVBUF(DEVDAT)\r
+ HRLI JBUF,PROG\r
+ HRRM UUO,@JBUF\r
+ HRRM UUO,DEVOAD(DEVDAT)\r
+ HRLZI TAC,IOUSE\r
+ ANDCAM TAC,@JBUF\r
+ POPJ PDP, ;RETURN\r
+\f,RELEASE A DEVICE\r
+\r
+INTERNAL RELEA1,RELEA2,RELEA3,RELEA5,RELEA6,RELEA9\r
+EXTERNAL USRJDA,USRHCU,CPOPJ,SYSTAP,STUSER,STREQ,STAVAL,PJOBN,IADPTR\r
+\r
+RELEA0:\r
+RELEA2:RELEA3:\r
+RELEA1: TRZ UUO,-1 ;CLOSE BOTH INPUT AND OUTPUT\r
+ PUSHJ PDP,CLOSE1\r
+ PUSHJ PDP,WAIT1 ;WAIT FOR DEVICE TO BECOME INACTIVE\r
+RELEA5: PUSHJ PDP,DRL(DSER) ;DISPATCH TO DEVICE SERVICE ROUTINE\r
+ MOVEI IOS,IOACT ;CLEAR IO ACTIVE BIT\r
+ ANDCAB IOS,DEVIOS(DEVDAT) ;AND RETURN WITH IOS SET\r
+ LDB TAC1,IADPTR ;GET COUNT OF NO OF CHANS DEVICE ON(IF DTA)\r
+ SOS TAC1 ;COUNT DOWN BY ONE\r
+ MOVE TAC,DEVMOD(DEVDAT)\r
+ TLNE TAC,DVDTA ;DEVICE A DTA?\r
+ DPB TAC1,IADPTR ;YES, STORE UPDATED COUNT\r
+ SETZB DAT,USRJDA(UCHN) ;CLEAR DEVICE ASSIGNMENT\r
+ MOVE TAC,USRHCU ;HIGHEST IO CHANNEL IN USE\r
+RELEA4: HRRZ TAC1,USRJDA(TAC)\r
+ JUMPN DAT,RELE4A ;NON-ZERO CHAN. ALREADY?\r
+ MOVE DAT,TAC1 ;NO, SET DAT WHEN FIRST(HIGHEST) FOUND\r
+ MOVEM TAC,USRHCU ;STORE HIGHEST IN USE CHANNEL\r
+RELE4A: CAIE TAC1,(DEVDAT) ;IS THIS DEVICE SAME AS ONE BEING RELEASED?\r
+ SOJGE TAC,RELEA4\r
+ JUMPGE TAC,CPOPJ ;EXIT IF ON ANOTHER CHANNEL\r
+ HLLZS DEVIAD(DEVDAT) ;CLEAR INPUT BUFFER ADDRESS\r
+ HLLZS DEVOAD(DEVDAT) ;AND OUTPUT BUFFER ADDRESS.\r
+\f;CALLED FROM ERROR STOP ROUTINE(ESTOP)\r
+RELEA9: MOVE TAC,DEVNAM(DEVDAT) ;IS THIS SYSTEM TAPE?\r
+ CAME TAC,[SIXBIT /DSK/] ;DSK IS NEVER QUEUED\r
+ CAME TAC,SYSTAP\r
+ JRST RELEA7 ;IS DISK OR NOT SYSTEM TAPE\r
+ SKIPN STUSER ;HAS COUNT ALREADY BEEN REDUCED AT ESTOP?\r
+ JRST RELEA7 ;YES\r
+ SETZM STUSER ;YES, CLEAR SYSTEM USER NO.\r
+ SOSL STREQ ;YES, REDUCE COUNT\r
+ SETOM STAVAL ;SOMEONE IS WAITING, SET AVAILABLE FLAG/\r
+RELEA7: MOVEI TAC1,ASSPRG ;CLEAR ASSIGNED BY PROGRAM BIT\r
+RELEA6: ANDCAB TAC1,DEVMOD(DEVDAT) ;CALLED FROM DEASSIGN\r
+ TRZ TAC1,777 ;CLEAR JOB NO. FIELD\r
+INTERNAL FTDISK\r
+IFE FTDISK,<\r
+ TDNN TAC1,[XWD TTYATC,ASSCON+ASSPRG]\r
+ DPB TAC1,PJOBN ;CLEAR JOB NUMBER IF ALL 3 BITS OFF\r
+ POPJ PDP, ;IE ASSIGNED BY CONSOLE,PROGRAM, OR\r
+>\r
+IFN FTDISK,<EXTERNAL CLRDDB,IPOPJ\r
+ TDNE TAC1,[XWD TTYATC,ASSCON+ASSPRG]\r
+ POPJ PDP, ;DEVICE ASSIGNED BY OTHER MEANS TOO\r
+ DPB TAC1,PJOBN ;CLEAR JOB NUMBER\r
+ PUSH PDP,ITEM ;SAVE JOB NO.\r
+ TLNE TAC1,DVDSK ;IS DEVICE A DSK\r
+ PUSHJ PDP,CLRDDB ;YES-RETURN DDB TO STORAGE\r
+ JRST IPOPJ ;RESTORE JOB NO. & RETURN.\r
+>\r
+\f\r
+,CALLING SEQUENCE\r
+, STATO D,MASK\r
+, EXIT1 ALL SELECTED BITS ARE 0\r
+, EXIT2 SOME SELECTED BITS ARE 1\r
+,TESTS BITS OF I/O STATUS WORD OF DEVICE ON USER'S CHANNEL D WHICH\r
+,ARE SELECTED BY MASK.\r
+\r
+\r
+ INTERN USTATO\r
+USTATO: TRNE IOS,(UUO) ;SKIP IF ANY INDICATED BITS ARE ONE\r
+ AOS (PDP)\r
+ POPJ PDP, ;RETURN TO USER\r
+\r
+\r
+,CALLING SEQUENCE\r
+, STATUS D,ADR\r
+, EXIT ALWAYS RETURNS HERE\r
+,STORES I/O STATUS WORD OF DEVICE ON CHANNEL D IN LOCATION ADR.\r
+\r
+\r
+INTERN USTATS\r
+\r
+\r
+USTATS: HRRZ TAC,IOS ;GET USER HALF OF IOS.\r
+ JRST STOTAC ;ADDRESS CHECK AND STORE IN USER AREA\r
+\r
+\r
+,CALLING SEQUENCE\r
+, STATZ D,MASK\r
+, EXIT1 SOME SELECTED BITS ARE 1\r
+, EXIT2 ALL SELECTED BITS ARE 0\r
+\r
+,TESTS BITS OF I/O STATUS WORD OF DEVICE ON USER'S\r
+,CHANNEL D WHICH ARE SELECTED BY MASK.\r
+\r
+ INTERN USTATZ\r
+\r
+USTATZ: TRNN IOS,(UUO) ;SKIP IF ALL INDICATED BITS ARE ZERO\r
+ AOS (PDP)\r
+ POPJ PDP, ;RETURN TO USER\r
+\f;IN UUO - LIKE INPUT SKIPS IF EOF OR ERRORS\r
+\r
+INTERNAL TIN\r
+\r
+TIN: PUSHJ PDP,IN ;DO INPUT UUO\r
+ TRNE IOS,IOBKTL+IODTER+IODERR+IOIMPM+IODEND\r
+ AOS (PDP)\r
+ POPJ PDP,\r
+\r
+\r
+;OUT UUO - LIKE OUTPUT - SKIPS IF ERRORS\r
+\r
+INTERNAL TOUT\r
+\r
+TOUT: PUSHJ PDP,UOUT ;DO OUTPUT UUO\r
+ TRNE IOS,IOBKTL+IODTER+IODERR+IOIMPM\r
+ AOS (PDP)\r
+ POPJ PDP,\r
+\r
+\r
+;5 UUOS FOR EACH INSTALLATION TO DEFINE\r
+;OPCODES 42-46\r
+\r
+\r
+\fSUBTTL IOCSS - COMMON IO SUBROUTINES\r
+\r
+;ROUTINE TO ADVANCE OUTPUT BUFFER AT INTERRUPT LEVEL\r
+\r
+;CALL: PUSHJ PDP,ADVBFE\r
+, EXIT1 RETURN IF NEXT BUFFER IS EMPTY\r
+, EXIT2 RETURN IF NEXT BUFFER IS FULL\r
+,CLEARS THE USE BIT (IOUSE:=0) OF THE BUFFER POINTED TO BY THE\r
+,OUTPUT BUFFER ADDRESS (DEVOAD) OF THE CURRENT DEVICE DATA BLOCK\r
+,AND ADVANCES THE BUFFER ADDRESS TO THE NEXT BUFFER IN THE RING.\r
+,UPON RETURN, SKIPS IF THE NEXT BUFFER IS FULL.\r
+;SECOND WORD OF NEXT BUFFER IS ADDRESS CHECKED TO\r
+;MAKE SURE IT IS NOT IN JOB DATA AREA OR ABOVE USER AREA\r
+;THE SECOND WORD OF CURRENT BUFFER WAS CHECKED AT UUO LEVEL\r
+;OR PREVIOUS CALL TO ADVBFE\r
+\r
+INTERNAL ADVBE1,ADVBFE\r
+EXTERNAL XJBPFI,CPOPJ\r
+\r
+ADVBFE: MOVEI TAC1,@DEVOAD(DEVDAT) ;ABS. ADR. OF 2ND WORD OF LAST BUF.\r
+ JUMPE TAC1,CPOPJ ;HAS DEVOAD BEEN CLEARED BY RELEASE?\r
+ MOVEM IOS,-1(TAC1) ;NO. STORE IO STATUS WORD(ERROR BITS)\r
+ ; IN FIRST WORD OF BUFFER\r
+ MOVSI TAC,IOUSE ;IOUSE:=0\r
+ ANDCAB TAC,(TAC1) ;CLEAR USE BIT IN 2ND WORD\r
+ ; ADRESS CHECKED WHEN STORED IN DEVOAD\r
+ ; DEVICE ACTIVE SINCE THEN\r
+ HRLZ TAC,TAC ;NEXT BUFFER ADR. TO LH\r
+ CAMLE TAC,XJBPFI ;IS IT IN IO PROTECTED PART OF JOB DATA AREA?\r
+ CAML TAC,PROG ;NO, IS IT GREATER OR EQUAL TO LAST WORD IN USER AREA?\r
+ POPJ PDP, ;YES, DO NOT STORE NEXT ADDRESS\r
+ ; CATCH ERROR LATER AT UUO LEVEL\r
+ HLRM TAC,DEVOAD(DEVDAT) ;NOW SAFELY STORE NEXT BUFFER ADRESS\r
+\r
+;ENTER HERE FROM SCNSER TO CHECK IF NEXT BUFFER FULL OF DATA YET\r
+\r
+ADVBE1: SKIPL @DEVOAD(DEVDAT) ;IS IOUSE=0?\r
+ POPJ PDP, ;EXIT1. BUFFER IS EMPTY\r
+ JRST ADVBF1 ;GO SEE IF USER TYPED CONTROL C\r
+ ; OR EXEC IS WAITING TO SHUFFLE JOB\r
+\f\r
+;ROUTINE TO ADVANCE INPUT BUFFER AT INTERRUPT LEVEL\r
+\r
+;CALL: PUSHJ PDP,DEVBFF\r
+, EXIT1 RETURN IF NEXT BUFFER IS FULL\r
+, EXIT2 RETURN IF NEXT BUFFER IS EMPTY\r
+,SETS THE USE BIT (IOUSE:=1) OF THE BUFFER POINTED TO BY THE\r
+,INPUT BUFFER ADDRESS (DEVIAD) OF THE CURRENT DEVICE DATA BLOCK\r
+,AND ADVANCES THE BUFFER ADDRESS TO THE NEXT BUFFER IN THE RING.\r
+,UPON RETURN, SKIPS IF THE NEXT BUFFER IS EMPTY.\r
+;SECOND WORD OF NEXT BUFFER IS ADDRESS CHECKED TO MAKE SURE\r
+;IT IS NOT IN IO PROTECTED PART OF JOB DATA AREA OR ABOVE\r
+;USER AREA\r
+;ALSO END OF BUFFER IS CHECKED TO MAKE SURE NOT ABOVE JOB AREA\r
+\r
+INTERNAL ADVBFF\r
+EXTERNAL XJBPFI,PJOBN,JBTSTS,CPOPJ\r
+\r
+ADVBFF: MOVEI TAC1,@DEVIAD(DEVDAT) ; ABS. ADR. OF LAST INPUT BUFFER\r
+ JUMPE TAC1,CPOPJ ;HAS DEVIAD BEEN CLEARED BY RELEASE?\r
+ MOVEM IOS,-1(TAC1) ;NO. STORE IOS WORD IN FIRST WORD OF BUF.\r
+ MOVSI TAC,IOUSE ;IOUSE:=1\r
+ IORB TAC,(TAC1) ;FLAG THAT DATA HAS BEEN INPUT\r
+ HRLZ TAC,TAC ;NEXT BUFFER TO LEFT HALF\r
+ CAMLE TAC,XJBPFI ;IS ADR. IN PROT. PART OF JOB DATA AREA?\r
+ CAML TAC,PROG ;NO, WILL SECOND AND THIRD WORD FIT?\r
+ POPJ PDP, ;NO, GIVE ERROR RETURN SO DEVICE WILL STOP\r
+ HLRM TAC,DEVIAD(DEVDAT) ;YES, SAFELY STORE ADDRESS OF NEXT BUFFER\r
+ SKIPGE TAC1,@DEVIAD(DEVDAT) ;IS NEXT INPUT BUFFER STILL FULL?\r
+ POPJ PDP, ;YES, GIVE STOP RETURN\r
+ TRZ TAC1,-1 ;XWD LENGTH OF BUFFER,0\r
+ ADD TAC,TAC1 ;ADD LENGTH TO REL. ADR. OF SECOND WORD\r
+ ; LENGTH=NO. WORDS WHICH FOLLOW SECOND\r
+ CAMLE TAC,PROG ;IS LAST WORD IN BOUNDS?\r
+ POPJ PDP, ;NO, GIVE STOP RETURN\r
+ADVBF1: LDB TAC,PJOBN ;GET JOB NO. FROM DEVICE DATA BLOCK\r
+ SKIPGE TAC,JBTSTS(TAC) ;IS RUN BIT ON IN JOB STATUS WORD\r
+ TLNE TAC,SHF+CMWB ;YES, SYSTEM WAITING TO SHUFFLE,\r
+ ; EXECUTE A COMMAND, OR TO SWAP JOB OUT?\r
+ ; SHF SET BY SWAPPER TO STOP IO IF IT WANTS TO SWAP JOB OUT\r
+ ; 2 RELOC REG SOFTWARE DOES NOT SET SHF IN LOW SEG\r
+ ; IF JOB HAS 2 SEG, SINCE HIGH SEG CAN BE\r
+ ; SWAPPED EVEN THOUGH ACTIVE IO IN LOW SEG.\r
+ ; THUS A LIMITED FORM OF MONITOR BUFFERING IS ACHIEVED\r
+ POPJ PDP, ;YES,PRETEND NEXT BUFFER NOT AVAILABLE\r
+ TRNN IOS,IOCON ;NEXT BUFFER AVAILABLE. DISCONTINUOUS MODE?\r
+ AOS (PDP) ;NO\r
+ POPJ PDP, ;YES\r
+\f\r
+;ROUTINE TO ADDRESS CHECK AT UUO LEVEL ONLY\r
+;CALL HRRZ AC1,REL ADR.\r
+; PUSHJ PDP,UADCK1\r
+; NEVER RETURNS IF ERROR,STOPS JOB AND PRINTS ERROR\r
+;BAD ADR. IF IN LOC 20-JOBPFI IN JOB DATA AREA\r
+;OR IF ABOVE PROTECTION(USRREL) FOR CURRENT JOB\r
+\r
+INTERNAL UADCK1\r
+EXTERNAL USRREL,JOBPFI\r
+\r
+UADCK1: TRNN AC1,777760 ;IN USER ACS?\r
+ POPJ PDP, ;YES, ADDRESS IS OK\r
+\r
+;ROUTINE TO ADDRESS CHECK AT UUO LEVEL ONLY\r
+;USER ACS ARE ALSO ILLEGAL(ADR IS FOR IO USE LATER AT\r
+;INTERRUPT LEVEL)\r
+;CALL: HRRZ AC1,REL.ADR.\r
+; PUSHJ PDP,UADRCK\r
+; NEVER RETURN IF ERROR\r
+\r
+INTERNAL UADRCK\r
+EXTERNAL USRREL,JOBPFI\r
+\r
+UADRCK: CAILE AC1,JOBPFI ;IS ADR. IN IO PROT. PART OF JOB DATA AREA?\r
+ CAMLE AC1,USRREL ;NO, IS IT ABOVE PROTECT.?\r
+ JRST ADRERR ;YES, STOP JOB AND PRINT ERROR\r
+ POPJ PDP, ;NO\r
+\r
+;ROUTINE TO ADDRESS CHECK AT ANY LEVEL\r
+;CALL: MOVE PROG,[XWD PROT.,RELOC,]\r
+; HRRZ TAC,REL. ADR.\r
+; PUSHJ PDP,IADRCK\r
+; ERROR RETURN(ERROR MESSAGE NOT PRINTED,JOB NOT STOPPED)\r
+; OK RETURN\r
+\r
+INTERNAL IADRCK\r
+EXTERNAL JOBPFI,CPOPJ1\r
+\r
+IADRCK: MOVS TAC1,PROG ;GET PROTECTION(TO RH)\r
+ CAILE TAC,JOBPFI ;ADR. ABOVE PROT. PART OF JOB DATA AREA?\r
+ CAILE TAC,(TAC1) ;YES, BELOW OR EQUAL TO PROTECT.?\r
+ POPJ PDP, ;NO\r
+ JRST CPOPJ1 ;YES, SKIP RETURN\r
+\f\r
+;ROUTINE TO CHECK VALIDITY OF A DUMP MODE COMMAND LIST\r
+;WHICH IS:\r
+;A LIST OF 0 OR MORE IOWD FORMAT WORDS\r
+; TERMINATED BY A GOTO WORD(LH=0)\r
+; WHICH POINTS TO ANOTHER LIST OF 0 OR MORE IOWD FORMAT WORDS ETC.\r
+; UNTIL A GOTO WORD IS ENTIRELY ZERO\r
+;\r
+;SINCE MONITOR DOES NOT RESCHEDULE WHEN IN EXEC MODE\r
+;A MAXIMUM LIST OF 100 IS IMPOSED\r
+\r
+;CALL: MOVE UUO,[XWD PROG,REL. ADR. OF FIRST COMMAND]\r
+; PUSHJ PDP,COMCHK\r
+; ADDRESS CHECK RETURN(ERROR ROUTINE IS NOT CALLED)\r
+; OK RETURN, SUM OF LH OF IOWDS IN DAT\r
+; USER ADDRESS OF FIRST IOWD LH PROG IN INDEX FIELD IN UUO\r
+;\r
+\r
+INTERNAL COMCHK\r
+EXTERNAL JOBPFI,USRREL,TPOPJ1,USRHCU\r
+\r
+COMCHK: PUSH PDP,UUO ;SAVE POINTER TO LIST\r
+ PUSH PDP,AC2\r
+ MOVEI AC1,JOBPFI ;HIGHEST IO PROTECTED LOC. IN JOB DATA AREA\r
+ SKIPGE USRHCU ;IS A SAVE OR GET IN PROGRESS(MAYBE RUN UUO)\r
+ MOVEI AC1,JOBSAV ;YES, HIGHEST LOC. NOT WRITTEN BY SAVE\r
+ SETZB DAT,AC2 ;CLEAR WORD COUNT AND ADDRESS OF FIRST IOWD\r
+ MOVEI ITEM,100 ;ONLY 100 LISTS\r
+ SKIPA TAC1,UUO ;CHECK THE START OF LIST.\r
+COMCK0: HRR UUO,TAC1 ;CHANGE COMMAND LIST POINTER ON GO TO WORD\r
+ HRRZ TAC,TAC1 ;SET UP TAC FOR IADRCK\r
+ TRNN TAC,777760 ;IS LIST IN THE ACS?\r
+ JRST COMCK1 ;YES. THAT'S OK.\r
+ PUSHJ PDP,IADRCK\r
+ JRST COMCKE ;BAD ADDR.\r
+COMCK1: SOJLE ITEM,COMCKE ;EXCEEDED 100 YET?\r
+ SKIPN TAC1,@UUO ;NO. GET NEXT IOWD. END OF LIST?\r
+ JRST COMCK2 ;YES\r
+ JUMPG TAC1,COMCK0 ;NO. IS IT A GO TO WORD?\r
+ HLRE TAC,TAC1 ;NO. SAVE NEGATIVE WORD COUNT\r
+ HRRZS TAC1 ;GET LOWEST ADDRESS-1\r
+ CAMGE TAC1,AC1 ;IS IT GREATER THAN LOC. PROTECTED\r
+ ; FROM IO IN JOB DATA AREA?\r
+ JRST COMCKE ;NO. ERROR RETURN\r
+ SUB TAC1,TAC ;YES. COMPUTE LAST LOC.\r
+ CAMLE TAC1,USRREL ;IS LAST LOC. IN BOUNDS?\r
+ JRST COMCKE ;NO. ERROR RETURN\r
+ SUB DAT,TAC ;YES. ACCUMULATE NEG. WORD COUNT\r
+ SKIPN AC2 ;IS THIS THE FIRST IOWD?\r
+ MOVE AC2,UUO ;YES. SAVE ADDRESS IN AC2\r
+ AOJA UUO,COMCK1 ;GO GET NEXT IOWD\r
+\fCOMCK2: SKIPE AC2 ;ARE THERE ANY IOWDS WITH LH NOT 0?\r
+ MOVE UUO,AC2 ;YES, POINT UUO TO FIRST SUCH IOWD.\r
+ POP PDP,AC2\r
+ JRST TPOPJ1 ;REMOVE SAVED UUO AND SKIP RETURN\r
+\r
+\r
+COMCKE: POP PDP,AC2\r
+ POP PDP,UUO ;RESTORE ORIGINAL UUO\r
+ POPJ PDP, ;ERROR RETURN\r
+\fINTERNAL ASSASG,FTDISK\r
+EXTERNAL SCNON,SCNOFF,PJOBN\r
+\r
+;ASSIGN DEVICE IF UNASSIGNED\r
+;CALL: MOVE ITEM, JOB NUMBER\r
+; MOVE DEVDAT, ADDR. OF DDB\r
+; MOVEI TAC1, EITHER ASSPRG OR ASSCON\r
+; PUSHJ PDP, ASSASG\r
+; CAN'T ASSIGN RETURN\r
+; ASSIGNED RETURN\r
+\r
+\r
+ASSASG: IFN FTDISK,<EXTERNAL SETDDB\r
+ MOVE TAC,DEVMOD(DEVDAT) ;IS IT A DISK?\r
+ TLNE TAC,DVDSK\r
+ PUSHJ PDP,SETDDB ;YES, BUILD DEVICE DATA BLOCK\r
+>\r
+ NOSCHEDULE ;DISABLE SCHEDULING\r
+ LDB TAC,PJOBN ;GET JOB NUMBER IN DEV DATA BLOCK\r
+ CAMN TAC,ITEM ;IS IT ALREADY ASSIGNED TO THIS JOB\r
+ JRST ASSAS1 ;YES\r
+ MOVEI TAC, ASSPRG+ASSCON ;NO, IS IT ASSIGNED TO ANOTHER JOB?\r
+ CONO PI,SCNOFF ;TURN SCANNER OFF\r
+ TDNE TAC, DEVMOD(DEVDAT) ;ARE EITHER ASSIGNED BITS SET?\r
+ JRST ASSAS2 ;YES\r
+ DPB ITEM,PJOBN ;NO, STORE JOB NUMBER\r
+ASSAS1: IORM TAC1,DEVMOD(DEVDAT) ;SET ONE OF ASSIGN BITS\r
+ AOS (PDP)\r
+ASSAS2: CONO PI,SCNON ;TURN SCANNER CHAN. BACK ON\r
+ SCHEDULE ;SCHEDULING\r
+ POPJ PDP,\r
+\f;ROUTINE TO SEARCH FOR A DEVICE\r
+;CALL: HRR ITEM,JOB NUMBER\r
+; MOVE TAC,[SIXBIT .DEVICE NAME.]\r
+; PUSHJ PDP, DEVSRC\r
+; NOT FOUND\r
+; FOUND\r
+\r
+ INTERNAL DEVLG,DEVSRC,DEVPHY\r
+ EXTERNAL SYSTAP,DEVOPR,TTYFND,CPOPJ1,DEVLST,PJOBN,GETDDB\r
+\r
+DEVSRC:\r
+IFN FTLOGIN,<\r
+ MOVSI DEVDAT,JLOG ;DO NOT ALLOW LOGICAL NAMES IF THE JOB IS NOT\r
+ ; NOT LOGGED IN OR IS IN THE PROCESS OF BEING LOGGED OUT\r
+ TDNE DEVDAT,JBTSTS(ITEM) ;OTHERWISE USER CAN RUN OWN LOGOUT PROGRAM\r
+ ; JLOG SET TO 0 IN COMMAND DECODER ON KJOB\r
+>\r
+ PUSHJ PDP, DEVLG ;SEARCH LOGICAL NAMES FIRST\r
+ JRST DEVPHY ;NOT FOUND, SEARCH PHYSICAL NAMES\r
+ JRST CPOPJ1 ;FOUND\r
+\r
+;SEARCH LOGICAL NAMES\r
+\r
+DEVLG: HLRZ DEVDAT,DEVLST ;BEGINNING OF DDB CHAIN\r
+DEVLP0: CAME TAC,DEVLOG(DEVDAT) ;COMAPRE WITH LOGICAL NAME\r
+ JRST DEV0 ;NO MATCH\r
+ LDB TAC1,PJOBN ;DOES THE LOGICAL NAME BELONG TO THIS JOB?\r
+ CAMN TAC1,ITEM\r
+ JUMPN TAC,CPOPJ1 ;YES, GIVE SUCCESSFUL RET. IF NAME NOT 0\r
+DEV0: HLRZ DEVDAT,DEVSER(DEVDAT) ;NO, KEEP LOOKING\r
+ JUMPN DEVDAT,DEVLP0\r
+ POPJ PDP, ;FINISHED AND NOT FOUND\r
+\f\r
+;SEARCH PHYSICAL NAMES\r
+\r
+DEVPHY: CAMN TAC,[SIXBIT /OPR/] ;IS IT "OPR"?\r
+ MOVE TAC,DEVOPR ;YES, CHANGE TO OPERATOR'S TTY\r
+ CAMN TAC,[SIXBIT /SYS/] ;IS IT "SYS"?\r
+ SKIPA TAC,SYSTAP ;YES, CHANGE TO SYSTEM TAPE DEVICE NAME\r
+ TDZA TAC1,TAC1 ;NO, CLEAR SYSTEM TAPE FLAG\r
+ MOVEI TAC1,SYSDEV ;YES, SET SYSTEM TAPE FLAG\r
+ HLRZ DEVDAT,DEVLST ;SEARCH DEVICE DATA BLOCKS\r
+DEVLP1:\r
+ TLO DEVDAT,(TAC1) ;SET SYSTEM TAPE BIT IF SEARCHING FOR SYS\r
+ CAMN TAC,DEVNAM(DEVDAT) ;MATCH OF PHYSICAL NAME?\r
+ JUMPN TAC,CPOPJ1 ;YES, GIVE OK RET. IF NAME IS NOT 0\r
+ HLRZ DEVDAT,DEVSER(DEVDAT)\r
+ JUMPN DEVDAT,DEVLP1\r
+ CAME TAC,[SIXBIT /TTY/] ;IS THIS PUBLIC LOGICAL NAME TTY?\r
+ JRST GETDDB ;SEE IF IT'S A TTY.\r
+ PUSH PDP,DAT ;SAVE OUTPUT BYTE POINTER(TTY) OR INIT. ARG. ADR.\r
+ PUSHJ PDP,TTYFND ;YES, FIND TTY JOB IS ATTACHED TO\r
+ POP PDP,DAT ;RESTORE\r
+ JRST CPOPJ1 ;AND GIVE SUCCESSFUL RETURN\r
+\f;ROUTINE TO SETUP N-RING IO BUFFER IN USER AREA\r
+\r
+;CALL: PUSHJ PDP,BUFCLC\r
+, EXIT RETURNS HERE IF MEMORY NOT EXCEEDED\r
+, SETS UP AN N BUFFER RING FOLLOWING THE USER'S PROGRAM, WHERE N\r
+, IS IN THE ADDRESS FIELD OF AC UUO.\r
+, THE BUFFER RING FORMAT IS AS FOLLOWS:\r
+, LOCATION LH CONTENTS RH\r
+, C(JOBFF) + 1 BUFFER C(JOBFF) +1\r
+, + 0(BUFFER SIZE+2) SIZE + 1(BUFFER SIZE+2)\r
+, C(JOBFF) +1 BUFFER C(JOBFF) +1\r
+, +1(BUFFER SIZE+2) SIZE + 2(BUFFER SIZE+2)\r
+, . . .\r
+, . . .\r
+, . . .\r
+, C(JOBFF) + 1 BUFFER C(JOBFF) + 1\r
+, + (N-2)(BUFFER SIZE+2) SIZE +(N-1)(BUFFER SIZE+2)\r
+, C(JOBFF) + 1 BUFFER C(JOBFF) + 1\r
+, + (N-1)(BUFFER SIZE+2) SIZE \r
+,THEN SET BUFPNT:=IOUSE,C(JOBFF) + 1\r
+, AND JOBFF:=C(JOBFF) + N(BUFFER SIZE + 2)\r
+, BUFWRD IS RESTORED.\r
+ INTERNAL BUFCLC\r
+ EXTERNAL JOBFF\r
+\r
+BUFCLC: PUSH PDP,BUFWRD ;SAVE BUFWRD ON STACK\r
+ LDB TAC,[POINT 12,DEVCHR(DEVDAT),35];TAC:=BUFFER SIZE\r
+ HRRZ BUFPNT,JOBFF(PROG) ;BUFPNT:=FIRST FREE LOCATION + 1\r
+ ADDI BUFPNT,1\r
+ HRRZ BUFWRD,BUFPNT\r
+ HRLI BUFPNT,PROG\r
+ HRL BUFWRD,TAC ;BUFWRD:=BUFFER SIZE,FIRST FREE LOC + 1\r
+ ADDI TAC,2 ;TAC:=BUFFER SIZE + 2\r
+ HRRZ TAC1,UUO ;TAC1:=N=ADDRESS FIELD OF AC UUO\r
+ HRRZ AC1,TAC ;BUFFER SIZE+2\r
+ IMUL AC1,TAC1 ;TIME NO. OF BUFFERS\r
+ ADD AC1,BUFWRD ;LOC. OF FIRST BUFFER\r
+ HRRZ AC1,AC1 ;MAKE SURE POSITIVE\r
+ CAMG AC1,USRREL ;WILL THIS SPACE FIR IN USER CORE?\r
+ JRST BUFC1 ;YES, FO DO INBUF CODE\r
+ ; NO, AUTOMATICALLY EXPAND SIZE OF USER CORE\r
+\f PUSH PDP,TAC ;SAVE A BUNCH OF ACS USED IN CORE AND IO WAIT\r
+ PUSH PDP,UUO\r
+ PUSH PDP,TAC1\r
+ PUSH PDP,BUFPNT\r
+ PUSH PDP,BUFWRD\r
+ PUSH PDP,DEVDAT\r
+ PUSH PDP,DSER\r
+ MOVE ITEM,JOB ;CURRENT JOB NUMBER\r
+ MOVE TAC,AC1 ;HIGHEST USER ADR. TO TRY FOR\r
+ MOVEI UUO,UUO ;SET INDEX FIELD TO 0, SO STOTAC WILL STORE\r
+ ; NO. OF K CORE AVAILABLE IN EXEC AC UUO INSTEAD\r
+ ; OF USER'S AC UUO\r
+ PUSHJ PDP,CORUUO ;TRY TO ASSIGN CORE\r
+ JFCL ;ERROR RETURN-LET ADR CHECK HAPPEN AND STOP JOB\r
+ POP PDP,DSER\r
+ POP PDP,DEVDAT\r
+ POP PDP,BUFWRD\r
+ POP PDP,BUFPNT\r
+ POP PDP,TAC1\r
+ POP PDP,UUO\r
+ POP PDP,TAC\r
+BUFC1: ADD BUFWRD,TAC ;BUFWRD:=C(BUFWRD) + C(TAC)\r
+ HRRZ AC1,BUFPNT ;IS LAST ADDR IN BOUNDS?\r
+ PUSHJ PDP,UADRCK\r
+ MOVEM BUFWRD,@BUFPNT ;BUFFER HEADER+1:=C(BUFWRD)\r
+ HRR BUFPNT,BUFWRD ;BUFPNT 18-35:=C(BUFWRD 18-35)\r
+ SOJG TAC1,BUFC1 ;N:=N-1. IS N GR 0?\r
+ HRR BUFWRD,JOBFF(PROG)\r
+ ADDI BUFWRD,1\r
+ MOVEI AC1,-2(BUFPNT) ;CHECK LAST ADR. OF HEADER\r
+ PUSHJ PDP,UADRCK\r
+ SUB BUFPNT,TAC\r
+ MOVEM BUFWRD,@BUFPNT ;LINK LAST BUFFER TO FIRST BUFFER\r
+ ADDI BUFPNT,-1(TAC)\r
+ HRRM BUFPNT,JOBFF(PROG) ;JOBFF:=C(JOBFF)+1+N(BUFFER SIZE+2)\r
+ HRR BUFPNT,BUFWRD ;BUFPNT:=IOUSE,ADDRESS OF FIRST BUFFER\r
+ ; IN RING.\r
+ HRLI BUFPNT,IOUSE\r
+ POP PDP,BUFWRD ;RESTORE BUFWRD FROM STACK.\r
+ POPJ PDP, ;RETURN\r
+\f;ROUTINE TO CLEAR IO BUFFER IN USER AREA\r
+;CALLED AT INTERRUPT AND UUO LEVEL\r
+\r
+;CALL: HRRZ TAC,REL. ADR. OF 2ND WORD OF USER BUFFER\r
+; PUSHJ PDP,BUFCLR\r
+; ERROR RETURN MEMORY EXCEEDED\r
+, EXIT RETURNS HERE IF MEMORY NOT EXCEEDED\r
+, CLEARS THE WORD COUNT AND DATA AREA OF THE BUFFER WHOSE ADDRESS\r
+, IS IN TAC 18-35.\r
+\r
+ INTERNAL BUFCLR\r
+ EXTERNAL TPOPJ,CPOPJ1\r
+\r
+BUFCLR: PUSHJ PDP,IADRCK ;IN BOUNDS?\r
+ POPJ PDP, ;NO. ERROR RETURN\r
+ HRLI TAC,PROG\r
+ PUSH PDP,TAC ;SAVE FIRST BUFFER ADR.\r
+ HLRZ TAC1,@TAC ;TAC1 18-35=SIZE\r
+ TRZ TAC1,400000\r
+ ADD TAC,TAC1 ;LAST ADR=2ND ADR+SIZE\r
+ TLZ TAC,-1 ;CLEAR LEFT HALF\r
+ PUSHJ PDP,IADRCK ;LAST ADDRESS IN BOUNDS?\r
+ JRST TPOPJ ;NO. ERROR RETURN\r
+ HRLI TAC,PROG ;SET LAST ADR. FOR RELOC.\r
+ POP PDP,TAC1 ;RESTORE FIRST ADR.\r
+ NOSHUFF ;NO SHUFFLING\r
+ MOVEI TAC1,@TAC1 ;ABS. ADR. OF 2ND WORD OF BUFFER\r
+ HRL TAC1,TAC1\r
+ AOBJN TAC1,.+1 ;THIRD WORD IN BUFFER\r
+ SETZM (TAC1) ;CLEAR THIRD WORD\r
+ AOS TAC1 ;SET DEST. ADR. TO 4TH WORD\r
+ BLT TAC1,@TAC ;CLEAR BUFFER\r
+ SHUFFLE ;SHUFFLING\r
+ JRST CPOPJ1 ;SUCESSFUL RETURN\r
+\f\r
+;ROUTINE TO COMPUTE 12 BIT FOLDED CHECKSUM\r
+\r
+;CALL: PUSHJ PDP,CKS12\r
+, EXIT ALWAYS RETURNS HERE\r
+,CALCULATES FOLDED 12 BIT CHECKSUMS OF THE DATA WORDS IN THE\r
+,BUFFER WHOSE ADDRESS IS IN AC TAC1. TWO ALGORITHMS ARE USED.\r
+,ON RETURN, THE LEFT HALF OF AC TAC CONTAINS A CHECKSUM OBTAINED\r
+,BY ACCUMULATING, IN ONE'S COMPLEMENT, THE DATA WORDS AND FOLDING IT.\r
+,THE LEFT HALF OF AC DAT CONTAINS A CHECKSUM OBTAINED BY ACCUMULATING,\r
+,IN TWO'S COMPLEMENT, THE DATA WORDS AND FOLDING IT. AC TAC1\r
+,CONTAINS A 1.\r
+\r
+ INTERN CKS12\r
+\r
+CKS12: ADD TAC1,PROG ;TAC1:=-WORD COUNT,ADDRESS OF FIRST DATA WORD\r
+ AOS TAC1\r
+ HRRZ TAC,0(TAC1)\r
+ MOVNS TAC\r
+ AOS TAC1\r
+ HRL TAC1,TAC\r
+ CLEARM TAC ;INITIALIZE TWO'S COMPLEMENT SUM\r
+CKS12A: ADD TAC,0(TAC1) ;TWO'S COMPLEMENT ADD\r
+ AOBJN TAC1,CKS12A ;DONE?\r
+ LSHC TAC,-30\r
+ LSH TAC1,-14\r
+ ADD TAC,TAC1\r
+ LSHC TAC,-14\r
+ LSH TAC1,-30\r
+ ADD TAC,TAC1\r
+ TRZE TAC,770000\r
+ AOS TAC\r
+ HRLZS TAC\r
+ MOVEI TAC1,1 ;TAC1:=1\r
+ POPJ PDP,\r
+\f;ROUTINE TO CLEAR RESIDUE OF WORD POINTED TO BY A BYTE POINTER\r
+\r
+;CALL: PUSHJ PDP,CLRBYT\r
+, EXIT ALWAYS RETURNS HERE\r
+,CALLED WITH A BYTE POINTER IN AC TAC, IT CLEARS THE REST OF THE\r
+,WORD POINTED TO BY THE BYTE POINTER.\r
+\r
+ INTERNAL CLRBYT\r
+\r
+CLRBYT: LDB TAC1,[POINT 6,TAC,5] ;TAC1:=P\r
+ DPB TAC1,[POINT 12,TAC,11] ;TAC 0-5:=0,TAC 6-12:=P\r
+ SETZM TAC1\r
+ DPB TAC1,TAC ;CLEAR BITS 36-P THROUGH 35\r
+ POPJ PDP, ;RETURN\r
+\r
+;ROUTINE TO PUT EVEN PARITY IN ( OR TAKE IT OUT OF ) BIT 28 OF\r
+;AC TEM. ASSUMING CHARACTER IS IN BITS 28-35 OF TEM, REST CLEAR.\r
+;TAC IS DESTROYED. CALLED FROM PTP AND TTY SERVICE ROUTINES\r
+\r
+;CALL: PUSHJ PDP,PEVEN8\r
+; EXIT HERE WITH TEM SET TO EVEN PARITY\r
+\r
+ INTERNAL PEVEN8\r
+\r
+PEVEN8: MOVE TAC,TEM ;COPY ORIGINAL CHARACTER\r
+ IMULI TAC,200401 ;MAKE THREE COPIES OF THE CHAR\r
+ AND TAC,[OCT 11111111] ;GET THE BITS INDIVIDUALLY\r
+ IMUL TAC,[OCT 11111111] ;ADD UP THE BITS\r
+ TLNE TAC,10 ;TEST THE PARITY OF THE SUM\r
+ TRC TEM,200 ;IT WAS ODD. MAKE IT EVEN.\r
+ POPJ PDP,0 ;RETURN\r
+\f;ROUTINE TO RELEASE ALL DEVICES ASSIGNED TO JOB\r
+\r
+INTERNAL IORELS\r
+EXTERNAL PUUOAC\r
+\r
+\r
+IORELS: MOVEI TAC,RELEA3 ;RELEASE ALL IO DEVICES(DON'T CLOSE)\r
+\r
+;ROUTINE TO DO IO FOR ALL DEVICES ASSIGNED TO JOB\r
+;CALL MOVEI TAC,ADR. OF IO SUB.\r
+; PUSHJ PDP,IOALL\r
+; RETURNS WITH ITEM=CURRENT JOB # ,UUO PRESERVED\r
+\r
+INTERNAL IOALL\r
+EXTERNAL TPOPJ,USRHCU,USRJDA\r
+\r
+IOALL: PUSH PDP,TAC ;SAVE ADR. OF SUB.\r
+ PUSH PDP,UUO ;SAVE UUO\r
+ SETZB UCHN,UUO ;START WITH USER CHANNEL 0\r
+IOALL1: CAMLE UCHN,USRHCU ;IS IT GREATER THAN HIGHEST CHAN. USED?\r
+ JUMPN UCHN,IOALL2 ;YES - RETURN\r
+ ; IF USRCHU IS NEG - ASSUME SAVGET\r
+ ; WHICH USES CHANNEL 0\r
+ SKIPN DEVDAT,USRJDA(UCHN) ;GET NEXT DDB ADR., IS IT IN USE?\r
+ AOJA UCHN,IOALL1 ;NO, KEEP GOING\r
+ MOVE IOS,DEVIOS(DEVDAT)\r
+ DPB UCHN,PUUOAC\r
+ MOVE DSER,DEVSER(DEVDAT) ;SETUP ADR. OF DEV. DISP. TABLE\r
+ LDB TAC,PJOBN ;GET JOB NUMBER WHICH JOB IS ASSIGNED TO\r
+ CAMN TAC,JOB ;IS IT SAME AS CURRENT JOB(SHOULD BE EXCEPT FOR 140\r
+ ; RESTART WHILE THIS JOB WAS SWAPPED OUT)\r
+ ; DEVICE DATA BLOCKS JOB NUMBERS ARE SET TO 0 ON\r
+ ; 140 RESTART,BUT THE JOB DATA AREA DEVICE ASSIGNMENTS\r
+ ; FOR SWAPPED OUT JOBS HAVE NOT\r
+ PUSHJ PDP,@-1(PDP) ;YES,CALL THE SUB.\r
+ AOJA UCHN,IOALL1 ;INCREMENT USER CHAN. NO.\r
+IOALL2: POP PDP,UUO ;RESTORE UUO & RETURN RESTORING TAC TOO\r
+ MOVE ITEM,JOB ;GET JOB NO.\r
+ JRST TPOPJ\r
+\r
+\r
+;WAIT TILL ALL DEVICES ARE INACTIVE\r
+\r
+INTERNAL IOWAIT\r
+\r
+IOWAIT: MOVEI TAC,WAIT1\r
+ JRST IOALL\r
+\f\r
+;KILL ALL DEVICES(RELEASE WITHOUT WAITING FOR DEVICE INACTIVE)\r
+\r
+INTERNAL IOKILL\r
+\r
+IOKILL: MOVEI TAC,RELEA5\r
+ PUSHJ PDP,IOALL ;RELEASE ALL DEVICES WITHOUT WAITING\r
+\r
+;ROUTINE TO CLEAR PROTECTED JOB DATA AREA IN MONITOR\r
+;AND RECLAIM FREE AREA ABOVE USER PROGRAM FOR IO BUFFERS\r
+;CALL: MOVE JDAT,ADR. OF CURRENT JOB DATA AREA\r
+; PUSHJ PDP,SETUSR\r
+\r
+INTERNAL SETUSR,CLRUSR\r
+EXTERNAL USRLO1,USRLO,USRHI,JOBSA,JOBFF\r
+EXTERNAL JOBENB,USRHCU\r
+\r
+SETUSR: HLRZ TAC,JOBSA(JDAT) ;RESET FIRST FREE LOC. FOR THIS JOB\r
+ MOVEM TAC,JOBFF(JDAT)\r
+CLRUSR: SETZM JOBENB(JDAT) ;INITIALIZE APR TRAPPING (I.E., NONE)\r
+ MOVEI TAC,USRLO1 ;FIRST LOC+1 TO CLEAR\r
+ HRLI TAC,USRLO ;FIRST LOC.\r
+ SETZM USRLO\r
+ BLT TAC,USRHI\r
+ SETZM USRHCU ;CLEAR HIGHEST USER IO CHAN. IN USE\r
+ POPJ PDP,\r
+\f\r
+;ROUTINE TO FLAG DEVICE ACTIVE\r
+;CALL MOVE IOS,IO STATUS BITS\r
+; MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK\r
+; PUSHJ PDP,SETACT\r
+;CALLED BY ALL IO SERVICE ROUTINES AT UUO AND INTERRUPT LEVELS\r
+\r
+INTERNAL SETACT,CLRACT,STOIOS,ORACT\r
+EXTERNAL PDVTIM,PDVCNT\r
+\r
+ORACT: TRO IOS,IOACT\r
+ IORB IOS,DEVIOS(DEVDAT)\r
+ JRST ORACT1\r
+SETACT: TRO IOS,IOACT\r
+ TLZA IOS,IOW\r
+CLRACT: TRZ IOS,IOACT\r
+STOIOS: MOVEM IOS,DEVIOS(DEVDAT)\r
+ORACT1: LDB TAC,PDVTIM ;GET NO. OF SECONDS\r
+ DPB TAC,PDVCNT ;TO WAIT BEFORE\r
+ POPJ PDP, ;DEVICE IS CONSIDERED HUNG\r
+\r
+INTERNAL DEVCHK\r
+EXTERNAL HNGTIM,HNGSEC,DEVLST\r
+\r
+DEVCHK: MOVEI TAC,HNGSEC ;RESET HUNG DEVICE CHECK TIME\r
+ MOVEM TAC,HNGTIM ;TO CHECK ONCE A SECOND\r
+ HLRZ DEVDAT,DEVLST\r
+DEVCK0: MOVE IOS,DEVIOS(DEVDAT) ;IS DEVICE ACTIVE?\r
+ TRNN IOS,IOACT\r
+ JRST DEVCK1 ;NO\r
+ LDB TAC,PDVCNT ;YES,DECREMENT\r
+ SOJL TAC,DEVCK1 ;0 MEANS IGNORE DEVICE\r
+ DPB TAC,PDVCNT\r
+ JUMPN TAC,DEVCK1 ;HAS COUNT GONE TO 0?\r
+ MOVE DSER,DEVSER(DEVDAT);YES, GET DISPATCH TABLE ENTRY\r
+ PUSH PDP,DEVDAT\r
+ PUSHJ PDP,DHNG(DSER) ;DISPATCH TO SERVICE ROUTINES TO \r
+ ; UNHANG DEVICE\r
+ PUSHJ PDP,DEVHNG ;PRINT ERROR MESSAGE AND STOP JOB\r
+ POP PDP,DEVDAT ;DO NOT PRINT MESS. AND STOP JOB RETURN\r
+DEVCK1: HLRZ DEVDAT,DEVSER(DEVDAT)\r
+ JUMPN DEVDAT,DEVCK0\r
+ POPJ PDP,\r
+\f;ROUTINE TO SETUP PROG AND ITEM FOR INTERRUPT SERVICE ROUTINE\r
+\r
+;CALL PUSHJ PDP,IOSET\r
+, EXIT ALWAYS RETURNS HERE\r
+,THIS PROGRAM IS CALLED FROM AN INTERRUPT SERVICE ROUTINE.\r
+,IT PUTS THE ADDRESS OF THE DATA AREA OF THE JOB (C(JBTADR18-35))\r
+,CONNECTED TO THE DEVICE SPECIFIED BY AC DEVDAT IN AC PROG AND\r
+,PUTS THE ITEM POINTER (C(DEVCTR)) IN AC ITEM.\r
+\r
+ INTERNAL IOSET\r
+ EXTERNAL PJOBN,JBTADR\r
+\r
+IOSET: LDB PROG,PJOBN\r
+ MOVE ITEM,DEVCTR(DEVDAT) ;ITEM:=ITEM POINTER=C(DEVCTR)\r
+ MOVE PROG,JBTADR(PROG) ;PROG:=C(JBTADR 18-35)\r
+ MOVE IOS,DEVIOS(DEVDAT) ;GET IO STATUS FROM THE DDB\r
+ POPJ PDP, ;RETURN\r
+\r
+,CALLING SEQUENCE\r
+, PUSHJ PDP,IOSETC\r
+, EXIT ALWAYS RETURNS HERE\r
+\r
+,SETS JBFPTR18-35:=C(TAC1 18-35)\r
+, JBFCTR:=C(ITEM)*[WORD LENGTH/BYTE SIZE]\r
+,WHERE WORD LENGTH:=36 DECIMAL\r
+, BYTE SIZE:=C(JBFPTR6-11)\r
+, [X]:= INTEGER PART OF X\r
+\r
+\r
+ INTERN IOSETC\r
+\r
+\r
+IOSETC: ADDI JBUF,1 ;JBFPTR12-18:=0\r
+ HRLZI TAC,7777 ;JBFPTR18-35:=C(TAC1 18-35)+1\r
+ ANDM TAC,@JBUF\r
+ HRRM TAC1,@JBUF\r
+ AOS @JBUF\r
+ LDB TAC1,[POINT 6,@JBUF,11] ;TAC1:=BYTE SIZE\r
+ PUSHJ PDP,ITMCT1 ;JBFCTR:=C(ITEM)*[36/BYTE SIZE]\r
+ ADDI JBUF,1\r
+ MOVEM ITEM,@JBUF\r
+ POPJ PDP, ;EXIT\r
+\f;ROUTINE TO RETURN NO. OF ITEMS IN BUFFER\r
+\r
+;CALL: PUSHJ PDP,ITMSET\r
+, EXIT ALWAYS RETURNS HERE\r
+,SETS AC ITEM:=(BUFFER SIZE-1)*[WORD LENGTH/BYTE SIZE]\r
+,WHERE BUFFER SIZE:=BITS 1-17 OF THE BUFFER HEADER WORD POINTED TO\r
+, BY C(DEVADR)\r
+, WORD LENGTH:=36 DECIMAL\r
+, BYTE SIZE:=INTEGER PART OF X.\r
+\r
+,CALLING SEQUENCE\r
+, PUSHJ PDP,ITMCNT\r
+, EXIT ALWAYS RETURNS HERE\r
+,SETS AC ITEM:=C(ITEM)*[WORD LENGHT/BYTE SIZE]\r
+\r
+,CALLING SEQUENCE\r
+, PUSHJ PDP,ITMCT1\r
+, EXIT ALWAYS RETURNS HERE\r
+,SETS AC ITEM:=C(ITEM)*[WORD LENGHT/C(TAC1)]\r
+\r
+ INTERN ITMSET,ITMCNT,ITMCT1\r
+ITMSET: LDB ITEM,[POINT 17,@DEVADR(DEVDAT),17];ITEM:=BUFFER SIZE-1\r
+ SUBI ITEM,1\r
+ITMCNT: LDB TAC1,[POINT 6,DEVPTR(DEVDAT),11];TAC1:=BYTE SIZE\r
+ITMCT1: MOVEI TAC,44 ;ITEM:=C(ITEM)*[WORD LENGTH/C(TAC1)]\r
+ IDIV TAC,TAC1\r
+ IMUL ITEM,TAC\r
+ POPJ PDP,\r
+\f;ROUTINE TO SET DEVICE STATUS WORD FROM UUO\r
+;AND SETUP IOS\r
+\r
+INTERNAL SETIOS\r
+\r
+SETIOS: PUSHJ PDP,WAIT1 ;WAIT FOR DEVICE (INCLUDING TTY\r
+ ; MONITOR COMMAND RESPONSE WHEN\r
+ ; USER INITS TTY)\r
+\r
+ PUSHJ PDP,CHKMOD ;CHECK FOR LEGAL MODE, IF NOT RIGHT DONT RETURN\r
+ TRZ UUO,IOACT ;LET USER SET ALL BITS EXCEPT IOACT\r
+ HRRM UUO,DEVIOS(DEVDAT)\r
+ POPJ PDP,\r
+\r
+\r
+\r
+;CHECK FOR A LEGAL MODE FOR DEVICE\r
+CHKMOD: LDB TAC1,[POINT 4,UUO,35] ;GET DEVICE DATA MODE\r
+ MOVEI TAC,1 ;AND CHECK FOR LEGALITY\r
+ LSH TAC,(TAC1)\r
+ TDNN TAC,DEVMOD(DEVDAT)\r
+ JRST ILLMOD ;ILLEGAL MODE\r
+ POPJ PDP, ;OK\r
+\r
+\r
+;SETUP BYTE POINTER AND ITEM COUNT\r
+;CALL PUSHJ PDP,NEWBUF\r
+; ADDRESS CHECK WHEN SETTING UP BUFFER\r
+; OK RETURN\r
+\r
+\r
+\r
+EXTERNAL CPOPJ1\r
+INTERNAL NEWBUF,NEWBF1\r
+\r
+NEWBF1:\r
+NEWBUF: HRRZ TAC,DEVADR(DEVDAT) ;TAC:=INPUT BUFFER HEADER ADDRESS\r
+ PUSHJ PDP,BUFCLR ;CLEAR INPUT BUFFER.\r
+ POPJ PDP, ;ADDRESS CHECK\r
+ HRLZI TAC,7737\r
+ AND TAC,DEVPTR(DEVDAT) ;DEVPTR 0-5:=0, DEVPTR 12:=0\r
+ HRR TAC,DEVADR(DEVDAT) ;DEVPTR 18-35:=C(DEVADR 18-35) + 1\r
+ AOS TAC\r
+ MOVEM TAC,DEVPTR(DEVDAT)\r
+ PUSHJ PDP,ITMSET ;ITEM:=(BUFFER SIZE-1)*[36/BYTE SIZE]\r
+ MOVEM ITEM,DEVCTR(DEVDAT) ;DEVCTR:=ITEM COUNT\r
+ JRST CPOPJ1 ;RETURN\r
+\f;ROUTINE TO SETUP BYTE POINTER ACCORDING TO DATA MODE\r
+\r
+;CALL: PUSHJ PDP,SETBYT\r
+, EXIT ALWAYS RETURNS HERE\r
+,SETS TAC 0-5:=0\r
+, TAC 6-11:=S\r
+, TAC 12-13:=0\r
+, TAC 14-17:=PROG\r
+,WHERE S=36 IF DATA MODE (IOS 32-25) IS BINARY (B)\r
+, IMAGE (I), IMAGE BINARY (IB), OR DUMP (SD,D,DR)\r
+, S=7 IF DATA MODE IS ASCII PACKED (A)\r
+, ASCII LINE (AL)\r
+, ASCII SEQUENCED (AS)\r
+, ASCII SEQUENCED LINE (ASL)\r
+, OR ALTERNATE MODE BREAK (AM)\r
+\r
+ INTERN SETBYT\r
+\r
+SETBYT: TRNN IOS,14 ;IS MODE LESS THAN 10?\r
+ HRLI TAC,700+PROG ;YES,ASCII OR ASCII LINE\r
+ TRNE IOS,14 ;10 OR GREATER?\r
+ HRLI TAC,4400+PROG ;YES, IMAGE,IMAGE BIN. OR BIN.\r
+ POPJ PDP,\r
+\f;ROUTINE TO STORE DATA IN IOBUFFER FOR INPUT CHAR. AT A TIME DEVICES\r
+\r
+;CALL: PUSHJ PDP,STODAT\r
+, EXIT1 CHECKSUM ERROR\r
+, EXIT2 BLOCK FULL OR BLOCK COMPLETE\r
+, EXIT3 DATA STORED CORRECTLY\r
+,CALLED FROM AN INPUT SERVICE ROUTINE WITH A DATA ITEM IN AC DAT.\r
+,STORES THE DATA ITEM IN THE BUFFER, CHECKING TO SEE IF IT WERE\r
+,THE FIRST ITEM ON THE BUFFER AND SETTING UP THE POINTER AND\r
+,WORD COUNT APPROPRIATELY CHECKING THE MODE TO SEE IF ANY SPECIAL\r
+,PROCESSING NEED BE DONE. FOR EXAMPLE, THE TERMINATION\r
+,OF A BUFFER ON CERTAIN CHARACTERS IN OTHER MODES, OR IF THE BUFFER\r
+,IS FULL. THERE ARE THREE RETURNS FROM THIS ROUTINE: THE FIRST\r
+,RETURN OCCURS ON AN ERROR CONDITION, THE SECOND RETURN OCCURS\r
+,ON A BLOCK FULL CONDITION OR BLOCK COMPLETE CONDITION, THE THIRD\r
+,RETURN OCCURS ON THE DATA STORED CORRECTLY CONDITION. THIS\r
+,ROUTINE ALSO DOES SOME CHECKING ON INPUT OF BINARY RECORD,\r
+,PAPER TAPE OR CARDS.\r
+,CALLING SEQUENCE\r
+, PUSHJ PDP,STOSQD\r
+, XXXX ALWAYS SKIPS \r
+, EXIT ALWAYS RETURNS HERE\r
+,STORES THE WORD COUNT:=C(DEVPTR 18-35) -C(DEVIAD 18-35) - 1\r
+,IN THE BUFFER.\r
+\f INTERN STODAT, STOSQD\r
+ EXTERNAL PIOMOD,CPOPJ,CPOPJ1,CPOPJ2\r
+\r
+STODAT: TLNN IOS,IOFST ;IS THIS FIRST ITEM OF BUFFER?\r
+ JRST STO0 ;NO\r
+ PUSHJ PDP,NEWBUF ;SET UP A NEW BUFFER. ITEM:=(BUFFER \r
+ ; SIZE - 1)*[36/BYTE SIZE]\r
+ POPJ PDP,\r
+STO0: LDB TAC1,PIOMOD ;DATA MODE\r
+ CAIN TAC1,B ;MODE=BINARY?\r
+ JRST STOBIN\r
+ TLZ IOS,IOFST\r
+STO1: IDPB DAT,DEVPTR(DEVDAT) ;STORE DATA IN BUFFER.\r
+ CAIE TAC1,A ;MODE=ASCII, IMAGE, OR BINARY?\r
+ CAIN TAC1,I\r
+ JRST STOAIB\r
+ CAIE TAC1,IB ;IMAGE BINARY?\r
+ CAIN TAC1,B ;CHECKSUM BINARY?\r
+ JRST STOAIB ;YES\r
+ ANDI DAT,177 ;NO, MUST BE ASCII LINE MODE.\r
+ CAIG DAT,14 ;LINE FEED,FORM FEED, OR VERTICAL TAB?\r
+ CAIGE DAT,12\r
+ JRST .+2 ;NO\r
+ JRST STOSQF ;YES\r
+ SOJGE ITEM,CPOPJ2 ;ITEM:=C(ITEM)-1. IS C(ITEM) GR OR=0?\r
+STOE1: TRO IOS,IOBKTL ;IOBKTL:=1\r
+ POPJ PDP,\r
+STOAIB: SOJG ITEM,CPOPJ2; ITEM:=C(ITEM)-1. IS C(ITEM) GR 0?\r
+ CAIN TAC1,A ;MODE=ASCII?\r
+ JRST STOSQF ;YES\r
+ CAIN TAC1,B ;MODE=BINARY?\r
+ JRST STOBND ;YES, COMPUTE CHECKSUM AND CHECK.\r
+ PUSHJ PDP,ITMSET ;ITEM:=(BUFFER SIZE-1)*[36/BYTE SIZE]\r
+ ; - C(DEVCTR)\r
+ SUB ITEM,DEVCTR(DEVDAT)\r
+ MOVE TAC1,DEVIAD(DEVDAT) ;STORE ITEM COUNT\r
+ ADDI ITEM,1 ;IN FIRST WORD OF BUFFER\r
+ AOJA TAC1,STOSQE\r
+\fSTOSQD: TLZN IOS,IOFST ;FIRST CALL?\r
+ JRST STOSQF ;NO\r
+ PUSHJ PDP,NEWBUF ;YES, CLEAR BUFFER,SET ITEM COUNT\r
+ POPJ PDP, ;ADDRESS CHECK\r
+STOSQF: MOVE TAC1,DEVIAD(DEVDAT) ;REL. ADR. OF BUFFER\r
+ AOS TAC1\r
+ HRRZ ITEM,DEVPTR(DEVDAT) ;ITEM:=C(DEVPTR 18-35) -\r
+ ; C(DEVIAD 18-35) -1\r
+ SUBI ITEM,(TAC1)\r
+STOSQE: HRRM ITEM,@TAC1 ;WORD COUNT TO FIRST WORD IN BUFFER\r
+ JRST CPOPJ1 ;EXIT2. BLOCK COMPLETE\r
+\r
+\r
+STOBIN: TLZN IOS,IOFST ;WILL THE NEXT ITEM BE THE FIRST ITEM\r
+ JRST STO1 ;OF A BUFFER? IOFST:=0\r
+ HRRZ TAC,DAT ;YES.\r
+ CAMLE TAC,ITEM ;IS WORD COUNT LE (BUFFER SIZE-1)*\r
+ JRST STOE1 ; [36/BYTE SIZE]?\r
+ MOVE ITEM,TAC ;ITEM:=WORD COUNT\r
+ MOVEM DAT,@DEVPTR(DEVDAT) ;STORE WORD COUNT IN BUFFER\r
+ JRST CPOPJ2 ;EXIT3. DATA STORED CORRECTLY.\r
+\r
+STOBND: HRRZ TAC1,DEVIAD(DEVDAT)\r
+ PUSHJ PDP,CKS12 ;COMPUTE CHECKSUM\r
+ ADD TAC1, DEVIAD(DEVDAT)\r
+ HLLZ TAC1,@TAC1 ;DATA CHECKSUM=COMPUTED CHECKSUM?\r
+ CAMN TAC,TAC1\r
+ JRST CPOPJ1 ;EXIT2. BLOCK COMPLETE\r
+ TRO IOS,IODTER ;IODTER:=1\r
+ POPJ PDP, ;EXIT1. CHECKSUM ERROR\r
+\r
+\r
+ LIT\r
+IFN FTCHECK,<INTERNAL CHKEND\r
+ CHKEND=.\r
+>\r
+\r
+UUOEND: END\r