From: Richard Cornwell Date: Fri, 25 Nov 2016 19:48:50 +0000 (-0500) Subject: Added base source X-Git-Url: http://git.sky-visions.com/cgi-bin/gitweb.cgi/retro-software/dec/tops10/v4.5.git/commitdiff_plain/cda2ba6d27526e5ef6f27f7b3391cfb55055bf2e Added base source --- cda2ba6d27526e5ef6f27f7b3391cfb55055bf2e diff --git a/src/clkcss.mac b/src/clkcss.mac new file mode 100644 index 0000000..1412f7f --- /dev/null +++ b/src/clkcss.mac @@ -0,0 +1,183 @@ +TITLE CLKCSS - SCHEDULING ALOGRITHM FOR NON-SWAPPING SYSTEMS +SUBTTL T. HASTINGS/TH TS3.17 6 SEP 67 V001 +XP VOLKCS,001 + ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP + +;SCHEDULING ALGORITHM IS: +;CALLED EVERY 60TH OF A SECOND WHEN CURRENT JOB IS USER MODE +;CALLED WHEN CURRENT JOB IS IN EXEC MODE AND: +; 1. JUST STARTED TO WAIT FOR IO + +; 2. JUST STARTED TO WAIT FOR A BUSY SHARABLE DEVICE +; 3. RETURNING TO USER AFTER TYPING CONTROL C +; 4. RETURNING TO USER AFTER CLOCK TRIED TO INTERRUPT +; CURRENT JOB WHILE IT WAS IN EXEC MODE +; 5. AND ERROR OCCURRED IN CURRENT JOB + +;CALL: SETOM TIMEF ;IF CLOCK HAS GONE OFF SINCE LAST CALL +; PUSHJ PDP,NXTJOB +; RETURN WITH NEXT JOB TO RUN IN AC ITEM + +;INTIALIZE SCHEDULER(CALLED FROM IOINI1 BEFORE ALL OTHER +; DEVICES ARE INITIALIZED) + +INTERNAL NXTINI + +NXTINI: MOVSI TAC,-NQUEUE ;NO. OF QUEUES + SETZM AVALTB(TAC) ;CLEAR SHARABLE DEVICE AVAILABLE FLAGS + SETOM REQTAB(TAC) ;SET SHARABLE DEVICE REQUEST COUNT TO -1 + ;IE NO JOB WAITING OR USING DEVICE + AOBJN TAC,.-2 ;OTHER DEVICE INITIALIZATION + POPJ PDP, ;MAY CHOOSE TO SET REQUEST TO MORE + ;NEG. VALUE IF MORE THEN ON JOB CAN + ;USE DEVICE AT ONCE + +INTERNAL NXTJOB +INTERNAL FTTRPSET,FTDISK +EXTERNAL JOB,TIMEF,JBTSTS,JOBMAX,JOBN,PJBSTS,CPOPJ,CHKSHF +ENTRY XCKCSS + +T=TAC ;TEMPORARY +Q=TAC1 ;QUEUE NO. +Q1=DEVDAT ;QUEUE NO. SHIFTED TO MATCHING POS. OF JBTSTS WORD +C=DAT ;COUNT OF JOB LEFT TO SCAN + +XCKCSS: +NXTJOB: PUSHJ PDP,CHKSHF ;SHUFFLE CORE IF NEEDED + SETZM T + SKIPN ITEM,JOB ;CURRENT JOB NO.. IS IT NULL JOB? + JRST NXT0 ;YES, DO NOT DECREMENT QUANTUM RUN TIME + SKIPE TIMEF ;NO, IS THIS A CLOCK INTERRUPT CALL? + SOSA T,JBTSTS(ITEM) ;YES, DECREMENT QUANTUM RUN TIME + ;IN JOB STATUS WORD + SKIPA T,JBTSTS(ITEM) ;NO, JUST PICKUP STATUS WORD + TRNE T,-1 ;REDUCE TIME TO ZERO YET? + JRST NXT1 ;NO + HRR T,RNQUNT ;YES, RESET FOR RUN QUEUE QUANTUM +NXT0: SETOM RNAVAL ;FLAG TO SCAN RUN QUEUE FOR DIFFERENT JOB +NXT1: HRRM T,JBTSTS(ITEM) ;STORE MODIFIED QUANTUM RUN TIME + MOVEI Q,MAXQ ;HIGHEST PRIORITY QUEUE SCANNED FIRST +NXT2: SKIPN AVALTB(Q) ;SHOULD THIS QUEUE BE SCANNED FOR A RUNABLE JOB? +NXT3: SOJGE Q,NXT2 ;NO, LOOK AT NEXT LOWEST PRIORITY QUEUE + JUMPL Q,NXT7 ;YES, LOOKED AT QUEUES NQUEUE-1..,0? + MOVE Q1,Q ;MOVE QUEUE INDEX TO PROPER POS. + ROT Q1,^D17-JWPOS ;TO MATCH JOB STATUS WORD + MOVEI C,JOBMAX ;NO, SACN ALL JOBS(EXECEPT NULL JOB) + AOSA ITEM,JOBP(Q) ;SCAN ALL OTHER JOBS IN THIS QUEUE FIRST + +NXT4: SETOM RNAVAL ;FLAG RUN QUEUE BEING SCANNED + +NXT5: CAIL ITEM,JOBN ;GREATER THEN HIGHEST JOB NO.? + MOVEI ITEM,1 ;YES, RESET TO 1(SKIP NULL JOB) + HLRZ T,JBTSTS(ITEM) ;IS JOB RUNABLE? + TRZ T,RUNMSK+CMWB ;MASK OUT JOB STATUS BITS WHICH DO NOT MATTER + CAIN T,RUNABLE(Q1) ;ADD IN QUEUE NO. IN PROPER POSITION + JRST NXT8 ;YES, IT IS RUNABLE AND IS IN THIS QUEUE +NXT6: SOJLE C,NXT3 ;NO IT IS NOT, SCANNED ALL JOBS YET? + AOJA ITEM,NXT5 ;NO, LOOK AT NEXT JOB + +;HERE IF NO JOBS FOUND TO RUN(Q=-1) + +NXT7: MOVEI C,JOBN ;SCAN ALL JOBS INCLUDING POSSIBLY NULL JOB + MOVE ITEM,JOB ;STARTING WITH LAST JOB TO RUN + SKIPN Q1,RNAVAL ;HAS RUN QUEUE(Q,Q1=7) BEEN SCANNED? + AOJA Q,NXT4 ;NO, FLAG THAT IS HAS AND SCAN RUN QUEUE(Q,Q1=2) + SETZB ITEM,RNAVAL ;YES, CLEAR FLAG, SET NULL JOB TO RUN + POPJ PDP, ;RETURN + +NXT8: +IFN FTTRPSET,< + EXTERNAL STOPTS + MOVE T,STOPTS ;HAS A TRPSET UUO BEEN DONE FOR JOB1 + ;WITH NON ZERO AC? + CAIE ITEM,1 ;IS THIS JOB 1? + JUMPN T,NXT6 ;KEEP LOOKING IF NOT JOB1 AND + ;STOPTS FLAG SET +> + + CAIE Q,TSQ ;IS THIS TTY WAIT SATISFIED Q? + CAIN Q,WSQ ;IS THIS IO WAIT SATISFIED QUEUE? + SOSGE AVALTB(Q) ;YES, DECREMENT COUNT OF JOBS WITH SATISFIED IO + SETZM AVALTB(Q) ;NO, CLEAR AVAILABLE FLAG FOR THIS QUEUE + MOVEM ITEM,JOBP(Q) ;SAVE JOB NUMBER FOR THIS QUEUE FOR NEXT TIME + JUMPE Q,CPOPJ ;IS THIS RUN QUEUE? + MOVEI T,RNQ ;NO, SET STATE CODE TO RUN + DPB T,PJBSTS ;CLEAR WAIT CODE(SO HE WILL BE IN RUN QUEUE) + MOVE T,QUANTS(Q) ;SET QUANTUM RUNNING TIME FOR QUEUE + HRRM T,JBTSTS(ITEM) ;WHICH JOB HAS JUST LEFT + POPJ PDP, ;RETURN + +INTERNAL FTCHECK,FTMONP + +IFN FTCHECK+FTMONP,< +EXTERNAL JOBP,AVALTB,REQTAB,QUANTS + +DEFINE X(A,B) +< EXTERNAL A'AVAL,A'REQ,A'QUNT + INTERNAL A'Q + A'Q=ZZ + ZZ=ZZ+1 +> + ZZ=0 + QUEUES + LOC=ZZ +> +IFE FTCHECK+FTMONP,< +;APPROPRIATE ENTRY IS NON-ZERO WHEN SCHEDULER SHOULD LOOK +;AT THAT QUEUE TO FIND A JOB TO RUN +;WSAVAL CONTAINS THE NO. OF JOBS WITH IO WAIT SATISFIED(0=NONE) +;SIMILARLY FOR TSAVAL + +DEFINE X(A,B) +< INTERNAL A'AVAL,A'Q + A'Q=.-AVALTB + A'AVAL: 0 +> + +INTERNAL AVALTB + +AVALTB: QUEUES ;GENERATE THE AVAL FLAGS +LOC=.-AVALTB +> + +NQUEUE=LOC ;NO. OF QUEUES COUNTING RUN QUEUE +XP MAXQ,NQUEUE-1 ;MAX STATE CODE WHICH HAS A QUEUE + +;DEFINE STATE CODES WHICH DO NOT HAVE QUEUES ASSOCIATED WITH THEM + + +DEFINE X(A) +< INTERNAL A'Q + A'Q=LOC + LOC=LOC+1 +> + + CODES + +IFE FTCHECK+FTMONP,< +;LAST JOB SCHEDULED FOR EACH QUEUE + +JOBP: REPEAT NQUEUE,< EXP 1> + +;SHARABLE DEVICE REQUEST TABLE(GENERAL;IZED FOR OTHER QUEUES TOO) +;CONTAINS THE NUMBER OF JOBS WAITING TO USE SHARABLE DEVICE +;WSREG AND RNREG ARE UNUSED + +DEFINE X(A,B) +< A'REQ: 0 + INTERNAL A'REQ +> + +INTERNAL REQTAB + +REQTAB: QUEUES + +;QUANTUM RUNNING TIME FOR EACH QUEUE IN JIFFIES(CLOCK TICKS) + +DEFINE X(A,B) +< A'QUNT: EXP 2 + INTERNAL A'QUNT +> +QUANTS: QUEUES +> + END, diff --git a/src/clock1.mac b/src/clock1.mac new file mode 100644 index 0000000..eff0f89 --- /dev/null +++ b/src/clock1.mac @@ -0,0 +1,989 @@ +TITLE CLOCK1 - CLOCK, CONTEXT SWITCHING, AND JOB STARTING AND STOP ROUTINES - V412 +SUBTTL APRINT TH/TH/CHW TS 20 MAY 69 +XP VCLOCK1,412 + ; PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP + + ENTRY CLOCK1 ;ALWAYS LOAD CLOCK1 IF LIBRARY SEARCH +CLOCK1: + +;THIS SERVICE ROUTINE RUNS ON A HIGH PRIORITY CHANNEL +;AND REQUESTS INTERRUPTS ON LOWER CLK CHANNEL +;FOR SCHEDULING JOBS AND ERROR HANDLING THAT THE USER +;IS NOT ENABLED TO HANDLE HIMSELF + +EXTERNAL TIME,TIMEF,CLKFLG,REQCLK,APRCHL,APRPC,UPTIME +EXTERNAL JOBDAT,JOBTPC,JOBCNI,JOBAPR,APRERR,SCHEDF + +EXTERNAL APRILM,COMMAN,CONMES,DEVCHK,DEVSRC,ERROR,INLMES +EXTERNAL RELEA9,CRSHWD,CRASHX + +INTERNAL FTTTYSER ;THIS ROUTINE MAY BE ASSEMBLED TO WORD EITHER + ; THE OLD SCNSER OR THE NEW TTYSER. + +INTERNAL FTCHECK,FTMONP + +IFN FTCHECK+FTMONP,< +EXTERNAL DATA,APRCON,APRIN1,CLKS17,DAMESS,UUO0,CLOCK +INTERNAL UUO1 +> +IFE FTCHECK+FTMONP,< + INTERN CLOCK,DAMESS + EXTERN CIPWTM +APRCON: 231000 ;MONITOR ENABLED CPU FLAGS +APRIN1: 0 ;USER ENABLED CPU FLAGS +CLKS17: 0 ;PLACE TO SAVE AC17 ON CLOCK INTERRUPT +DAMESS: ASCIZ /-JAN-/ + +CLOCK: POINT 36,CIPWTM,35 ;BYTE POINTER TO CLOCK REQ QUEUE +> + + INTERN APRINT + +APRINT: JRST APRPAR ;ALWAYS CHECK APR AND PI DEVICES + JRST . ;CHECK OTHER DEVICES + +APRPCL: CONO PI,240000 ;TURN OFF MEM PAR, ERR, AND + ; ENABLE FOR MEM PAR AND TRY AGAIN + ; (DO NOT TURN OFF POWR FAIL AS THAT PERMANENTLY + ; DISABLES POWR FAIL INTERRUPT) +APRPAR: CONSZ PI,600000 ;MEM PARITY ERROR OR POWER FAILURE? + HALT APRPCL ;YES, HALT MACHINE, CLEAR FLAGS AND TRY AGAIN + ; ON CONTINUE + CONSO APR,@APRCON ;INTERRUPT FOR APR? + ; ALWAYS AT LEAST FOR CLOCK,ILM,NXM,PD OVF + ; RH MODIFIED EACH TIME USER RUNS IN CASE HE IS + ; ENABLED FOR PC CHANGE OR AR OVF + JRST APRINT+1 ;NO,CHECK OTHER DEVICES ON THIS PI CHANNEL + SKIPE CRSHWD ;IS LOC, 30 CLOBBERED? + JRST CRASHX ;YES ~ GO SAVE AC'S & STATE OF ALL DEVS, + CONSO APR,001000 ;YES, IS IT CLOCK? + JRST APRER ;NO, GO CHECK ERROR FLAGS + AOS TIME ;YES, INCREMENT TIME OF DAY + AOS UPTIME ;UPTIME IS LOADED AS ZERO,AND IS NEVER CLEARED + SETOM TIMEF ;FLAG THAT APR CLOCK HAS TICKED + SETOM CLKFLG ;SET FLAG FOR CLK FORCED INTERRUPT + CONO PI,REQCLK ;REQUEST INTERRUPT ON CLK CHANNEL + CONSZ APR,@APRIN1 ;IS USER ENABLE FOR ANY FLAGS(INCLUDING CLOCK) + ; RH ALSO MODIFIED EACH TIME A USER RUNS + JRST APRER ;YES, GO PROCESS TRAP + CONO APR,1000+APRCHN ;NO, CLEAR ONLY THE CLOCK FLAG + JEN @APRCHL ;DISMISS INTERRUPT + +;HERE ON CLOCK FLAG AND IT OR SOME OTHER FLAG IS ON WHICH USERS WANTS + +APRER1: CONO APR,1000+APRCHN ;NOW CLEAR CLOCK FLAG + EXCH TAC,APRCHL ;SAVE TAC, GET PC + TLNE TAC,USRMOD ;IS PC FROM USER MODE? + JRST APRER4 ;YES, GO TRAP TO HIM + JRST APRER2 ;NO. GO CHECK IN CASE ALSO A SERIOUS ERROR + +;OTHER APR INTERRUPTS BESIDES CLOCK + +APRER: EXCH TAC,APRCHL ;SAVE TAC, GET PC + TLNE TAC,USRMOD ;IS PC IN USER MODE? + CONSO APR,@APRIN1 ;YES, IS USER ENABLED FOR THIS ERROR + JRST APRER2 ;NO, PRINT ERROR MESSAGE AND STOP JOB +APRER4: EXCH JDAT,JOBDAT ;YES, SAVE JDAT, GET CURRENT JOB DATA AREA ADR. + MOVEM TAC,JOBTPC(JDAT) ;STORE PC IN JOB DATA AREA + + CONI APR,JOBCNI(JDAT) ;STORE APR IN JOB DATA AREA + HLLZS JOBENB(JDAT) ;CLEAR SOFTWARE FLAGS SO THAT USER MUST DO + ; ANOTHER APRENB UUO IN ORDER TO ENABLE TRAPS + SETZM APRIN1 ;ALSO CLEAR USER APR CONSO FLAGS + HRRI TAC,231000 ;AND SET MONITOR TO LOOK ONLY FOR + HRRM TAC,APRCON ;PD OVF,ILM,NXM, AND CLOCK + HRR TAC,JOBAPR(JDAT) ;GET USER LOC TO TRAP TO + EXCH JDAT,JOBDAT ;RESTORE JDAT,JOBDAT + CONO APR,440+APRCHN ;DISBALE FOV, AROVF IN CASE ON + ;SO USER MUST REENABLE WITH SETAPR UUO + +APRER3: TLZ TAC,440000 ;CLEAR FOV (PC CHANGE ON PDP-6) AND AR OVF FLAGS + ; SO INTERRUPT MAY BE DISMISSED + EXCH TAC,APRCHL ;RESTORE TAC & APRCHL + CONO APR,430110+APRCHN ;CLEAR ALL ERROR FLAGS WHICH CAN CAUSE INTERRUPTS + ; EXCEPT CLOCK FLAG(ELSE LOSE TIME OF DAY) + JEN @APRCHL ;DISMISS INTERRUPT + +APRER2: CONSO APR,NXM!ILM!POV! ;DOES EXEC CARE? + JRST APRER3 ;NO. IGNORE EXEC OVERFLOW (MUST BE FOV OR AROVF + MOVEM TAC,APRPC ;STORE ERROR PC FOR CLK CHANNEL + CONI APR,APRERR ;STORE ERROR FLAGS + ; (ALSO USED AS ERROR FLAG) + SETOM CLKFLG ;SET FLAG FOR CLK INTERRUPT + SETOM SCHEDF ;FLAG THAT RESCHEDULING IS NEEDED + ; (EVEN THROUGH PC MAY BE IN EXEC MODE) + CONO PI,REQCLK ;REQUEST INTERRUPT IN CLK CHANNEL + CONSZ APR,ILM ;WAS ERROR ILLEGAL MEMORY(FROM USER)? + HRRI TAC,0 ;YES,CLEAR RH OF PC,SO A SECOND ILM INTERRUPT + ; WILL NOT OCCUR IF THIS IS A WILD(AND A PDP-10) +IFN FTHALT,< + CONSZ PI,003400 ;ARE ANY PI'S IN PROGRESS OF LOWER PRIORITY THAN APR? + ; (PDP-10 BITS ONLY) + HALT .+1 ;YES, HALT SO CONTINUE WILL TRY TO RECOVER +> + JRST APRER3 ;NO,MUST BE UUO LEVEL(OR USER MODE AND + ; MEMORY DROPPED OUT) + +SUBTTL CLOCK - LOW PRIORITY CLOCK SERVICE(CLK) + +;THIS ROUTINE RUNS ON THE LOWEST PRIORITY PI CHANNEL AND AT UUO LEVEL +;TO CAUSE AN INTERRUPT ON CLK CHANNEL: +; SETOM CLKFLG ;FLAG THAT INTERRUPT HAS BEEN REQUESTED +; CONO PI,CLKREQ ;REQUEST PI INTERRUPT ON LOWEST PI CHANNEL +;THE FOLLOWING OTHER FLAGS MUST ALSO BE SET +;APRERR-APR DETECTED ERROR IN CURRENT JOB +;SCHEDF-RESCHEDULING MUST TAKE PLACE(EVEN THROUGH PC IN EXEC MODE) +;TIMEF-APR CLOCK HAS TICKED ON HIGH PRIORITY CHANNEL +;SEE APRSER AND RUNCSS TO SEE HOW THIS ROUTINE IS CALLED + +;CLK SERVICE PERFORMS THE FOLLOWING ON A REGULAR BASIS: +;PROCESSES CLOCK QUEUE REQUESTS +;CALLS CONSOLE MONITOR COMMAND DECODER +;CALLS CORE SHUFFLER +;THEN CALLS SCHEDULER +;IF THE CURRENT JOB IS IN EXEC MODE THE ABOVE 4 TASKS ARE +;DELAYED UNTIL THE CURRENT JOB ENTERS A STOPPABLE STATE: I.E., UNTIL + +; 1. JOB STARTS TO WAIT FOR A BUSY SHARABLE DEVICE +; 2. JOB STARTS TO WAIT FOR A IO TO COMPLETE +; 3. CONTROL ABOUT TO RETURN TO USER MODE +;THEN CLK SERVICE IS ENTERED AT THE UU0 LEVEL + +STOR=DAT +T=TAC +T1=TAC1 +JA=JDAT + +;THE CLOCK REQUEST QUEUE PROVIDES THE REST OF THE MONITOR +;WITH THE ABILITY TO BE TRAPPED TO AFTER A NUMBER OF CLOCK TICKS +;HAVE OCCURRED + +;TO MAKE A REQUEST: +; CONO PI,PIOFF +; IDPB AC,CLOCK ;STORE CLOCK REQUEST IN QUEUE +; CONO PI,PION ;TURN PI BACK ON +;C(AC)=XWD ADDRESS,NO. OF CLOCK TICKS*DATA*10000 +;WHERE DATA IS 6 BITS OF INFO NEEDED WHEN TIME RUNS OUT +;CLK SERVICE WILL PUSHJ PDP,ADR +;WHEN TIME RUNS OUT WITH DATA RIGHT JUSTIFIED IN AC TAC +;ALL ACS ARE FREE TO USE WHEN CALL IS MADE + +INTERNAL CLKINI +EXTERNAL CIPWTM1,PION,PIOFF + +CLKINI: MOVEI TAC,CIPWTM1 ;SETUP CLOCK QUEUE BYTE POINTER + HRRM TAC,CLOCK ;LH NEVER CHANGES(36 BIT BYTE) + POPJ PDP, + +;HERE AT UUO LEVEL WHEN JOB GOES INTO IO WAIT OR SHARABLE DEVICE WAIT +;CALL: PUSHJ PDP,WSCHED +; RETURN HERE WHEN RUNABLE AGAIN + +INTERNAL WSCHED +EXTERNAL JOBD14,JOBDAC,USRPC,JOBD16,NULPDL + +WSCHED: POP PDP,USRPC ;SAVE PC IN PROTECTED PART OF SYSTEM DATA + MOVEI AC3,JOBDAC(JDAT) ;SAVE ACS 0-16 IN DUMP ACS + BLT AC3,JOBD16(JDAT) ;IN CURRENT JOB DATA AREA + MOVEI PDP,NULPDL ;NULL JOB PD LIST + HRLI PDP,MJOBP1 ; OTHERWISE GET PD OUF + + JRST RSCHED ;GO RESCHEDULE + +;HERE AT UUO LEVEL WHEN CURRENT JOB RETURNS TO USER MODE +;FROM A UUO CALL AND EITHER: +; 1. CURRENT JOB TYPED CONTROL C WHILE IN EXEC MODE +; 2. CLOCK FLAG WENT OFF WHILE CURRENT JOB WAS +; IN EXEC MODE + +;CALL: PUSHJ PDP,USCHED ;FROM UUOCON(UUO HANDLER RETURN TO USER) +; RETURN HERE WHEN RUNABLE + +INTERNAL USCHED +EXTERNAL JOBDPG,JOBDPD,USRPC + +USCHED: POP PDP,USRPC ;SAVE PC IN PROTECTED PART OF SYSTEM DATA + MOVEM PROG,JOBDPG(PROG) ;SAVE PROG IN DUMP AC AREA + MOVEM PDP,JOBDPD(PROG) ;SAVE PDP + JRST RSCHED ;GO RESCHEDULE + +;HERE AT CLK INTERRUPT LEVEL + +INTERNAL CLKINT +INTERNAL FTTIME +EXTERNAL CLKFLG,JOBD17,CLKCHL,SCHEDF,JOBADR,JOBD16,JOBDAC +EXTERNAL JOBD15,JOBPD1,MJOBP1,APRERR,NULDAT,NULPDL + +CLKINT: SKIPN CLKFLG ;CLK INTERRUPT REQUEST? + JRST CLKINT ;NO, CHECK OTHER DEVICES + MOVEM 17,CLKS17 ;SAVE AC 17 + MOVE 17,CLKCHL ;IS CURRENT JOB IN USER MODE? + TLNN 17,USRMOD + SKIPE SCHEDF ;NO, IS THIS A FORSCED RESCHEDULING INTERRUPT? + JRST SAVPC ;YES, IT IS OK TO RESCHEDULE NOW + MOVE 17,CLKS17 ;NO, LEAVE TIMEF SET AND DISMISS INT. + JEN @CLKCHL + +SAVPC: MOVEM 17,USRPC ;SAVE PC IN PROTECTED PART OF SYSTEM DATA + + ; STORAGE FOR CURRENT JOB +CLKERR: SKIPN 17,JOBDAT ;CURRENT JOB DATA AREA, IS THERE ONE? + MOVEI 17,NULDAT ;NO, MUST BE NULL JOB OR CORE 0 + ; RUNS AT UUO LEVEL,REQUESTS CLK INT. TO STOP + MOVEM 16,JOBD16(17) ;SAVE AC 16 IN DUMP AC PART OF JOB DATA AREA + MOVEI 16,JOBDAC(17) ;SOURCE=0,DESTINATION=DUMP AC 0 + BLT 16,JOBD15(17) ;SAVE ACS 0-15 JUST BELOW AC 16 + MOVE TAC,CLKS17 ;NOW SAVE 17 IN JOB DATA AREA + MOVEM TAC,JOBD17(17) ;ALONE WITH OTHER ACS + MOVEI PDP,NULPDL ;SET UP PUSH DOWN LIST IN NULL JOB DATA + ; AREA IN LOWER CORE + HRLI PDP,MJOBP1 ;-LENGTH+1(LEAVE ROOM FOR UUO PC) + SKIPE TAC,APRERR ;IT THIS AN ERROR INTERRUPT? + PUSHJ PDP,APRILM ;YES, GO PROCESS ERROR, APRILM WILL CLEAR APRERR + ; FLAG IMMEDIATELY + +EXTERNAL COMCNT,NXTJOB,HNGTIM,POTLST,LSTWRD +EXTERNAL TIMEF,APRERR,CLKFLG,SCHEDF,JDB,PMONTB + +RSCHED: SKIPN TIMEF ;HAS CLOCK GONE OFF SINCE LAST CALL? + JRST CIP6 ;NO, JUST RESCHEDULE + +;TIME ACCOUNTING + +EXTERNAL TIME,MIDNIT,THSDAT,MONTAB + +IFN FTTIME,< + EXTERNAL RTIME,TTIME,JOB + SKIPN ITEM,JOB ;WAS LAST JOB NULL JOB? + SKIPN POTLST ;YES-WAS IT A LOST TICK? + JRST INCTIM ;NO-PROCEED NORMALLY + AOS LSTWRD ;YES-INCREMENT LOST TIME COUNT + SETZM POTLST ;AND CLEAR LOST TICK INDICATION +INCTIM: AOS RTIME(ITEM) ;INCR, CURRENT JOB INCREMENTAL RUN TIME + AOS TTIME(ITEM) ;INCR, CURRENT JOB TOTAL RUN TIME +> +IFN FTKCT,< + EXTERN USRREL,JBTKCT + LDB TAC,[POINT 8,USRREL,25] ;GET NO. OF 1K BLOCKS-1FOR CURRENT USER + ADDI TAC,1 ;MAKE IT NO. OF 1K BLOCKS + ADDM TAC,JBTKCT(ITEM) ;ADD IN ACCUMULATED CORE RUNNING TIME PRODUCT + ; (KILO-CORE TICKS) + +IFN FT2REL,< + EXTERN CHGHGH + PUSHJ PDP,CHGHGH ;CHARGE USER FOR HIGH SEGMENT IF HE HAS ONE +> +> +;MIDNITE CHECK + + MOVE TAC1,TIME + CAMGE TAC1,MIDNIT ;GONE PAST MIDNITE? + JRST CIP2 ;NO +CIP3: SETZB IOS,TIME ;YES, RESET TIME OF DAY + AOS TAC,THSDAT ;UPDATE DAY + IDIVI TAC,^D31 + DIVI IOS,^D12 ;NO. + LDB TAC,PMONTB + CAMGE TAC,TAC1 ;END OF MONTH? + JRST CIP3 ;YES. + +;PROCESS TIMING REQUESTS STORED IN QUEUE + +CIP2: HRRZ STOR,CLOCK ;GET END OF LIST +CIP4: CAIN STOR,CIPWTM1 ;END YET? + JRST CIP5 ;YES + SOS TAC1, (STOR) ;DECREMENT TIMING REQUEST + TRNE TAC1, 7777 ;TIME EXPIRED YET + SOJA STOR, CIP4 ;NO, CONTINUE SCAN + CONO PI, PIOFF ;YES, MOVE LAST ITEM IN LIST TO THIS + MOVE TAC, @CLOCK + SOS CLOCK + MOVEM TAC, (STOR) + CONI PI,PION + LDB TAC, [POINT 6, TAC1, 23] ;GET 6 BIT DATA ITEM + MOVSS TAC1 ;SETUP DISPATCH ADDRESS + PUSH PDP, STOR ;SAVE ONLY VALUABLE AC + PUSHJ PDP, (TAC1) ;AND DISPATCH TO TIMING REQUEST ROUTINE + POP PDP, STOR + SOJA STOR, CIP4 ;GO BACK FOR MORE REQUESTS + +CIP5: SOSG HNGTIM ;DECREMENT HUNG ID DEVICE + PUSHJ PDP,DEVCHK ;GO CHECK FOR HUNG ID DEVICES + SKIPE COMCNT ;ANY COMMANDS TO PROCESS? + PUSHJ PDP,COMMAND ;YES, CALL COMMAND DECODER +CIP6: PUSHJ PDP,NXTJOB ;CALL SCHEDULER + SETZM CLKFLG ;CLEAR CLK INTERRUPT FLAG + ; SET ON ALL FORCED CLK INTERRUPTS + SETZM TIMEF ;CLEAR TIME0 (1 JIFFY) INTERRUPT FLAG, + SETZM SCHEDF ;CLEAR FORCED SCHEDULING FLAG + CAMN ITEM,JOB ;IS NEXT JOB SAME AS LAST ONE? + JRST CIP8 ;YES, JUST RESTORE ACS AND DISMISS + +;DIFFERENT JOB. SAVE SOFTWARE STATE(HARDWARE ALREADY SAVED) + +EXTERNAL JOB,JOBDAT,JOBPRT,USRPRT,USRHCU,JOBJDA + + SKIPN JA,JOBDAT ;NULL JOB OR CORE 0 ON OLD JOB? + JRST CIP7 ;YES, DO NOT SAVE SOFTWARE STATE + MOVEI T,JOBPRT(JA) ;DEST,#FIRST LOC PROTECTED FROM USER + HRLI T,USRPRT ;SOUR,#SYSTEM DATA STORAGE FOR CURRETN JOB + SKIPL T1,USRHCU ;MOVE NO. OF OLD USER IO CHAN. IN USE + CAILE T1,17 ;MUST BE 17 OR LESS(IO MIGHT + ; CLOBBER IF ADDRESS CHECKING MISSES) + MOVEI T1,0 ;MOVE ONLY CHN 0 IF NEG, OR GR 17 + ; SAVGET SETS LH NEGATIVE DURING IO AS A FLAG + ; SINCE IT DOES IO INTO AND OUT OF + ; CHANNEL LOCATIONS (JOBJDA+1..,JOBJDA+17), + ADD JA,T1 ;RELOCATE TO USER AREA + BLT T,JOBJDA(JA) ; STOP WITH USER CHANNEL 0-1+C(USRHCU) + +;RESTORE SOFTWARE STATE OF NEW JOB,THEN HARDWARE STATE + +INTERNAL NULJOB,NULADR +EXTERNAL JOB,JBTDAT,JOBDAT,USRPRT,JOBPRT +EXTERNAL JOBHCU,USRJDA,JOBENB,APRCHN,APRNUL,NULDAT,NULERR + +NULJOB: ;TRANSFER HERE FROM SYSINI WITH ITEM=0 +CIP7: MOVEM ITEM,JOB ;STORE NEW CURRENT JOB NUMBER +NULADR: PUSHJ PDP,SETRL1 ;GO SETUP HARDWARE AND SOFTWARE RELOCATION + ; INFORMATION FOR NEW CURRENT USER + JUMPE ITEM,NULJB ;IS NEW JOB THE NULL JOB? + +IFN FTHALT,< + SKIPN JA ;DOES JOB HAVE CORE ASSIGNED? + HALT . ;NO -ELSE CLOBBER MONITOR +> + MOVEI T,USRPRT ;NO, DEST,#PROTECTED AREA IN MONITOR + HRLI T,JOBPRT(JA) ;SOURCE#FIRST PROTECT LOC. IN JB DATA AREA + SKIPL T1,JOBHCU(JA) ;MOVE NO. OF USER IO CHAN. IN USE + + CAILE T1,17 ;MUST BE 17 OR LESS(IO MIGHT CLOBBER + ; IF ADRRESS CHECKING MISSES + MOVEI T1,0 ;MOVEJUST CHAN 0 IF NEG. OR GREATER THAN 17 + ; SAVEGET SETS NUG,DURING IO + BLT T,USRJDA(T1) ;AND MOVE INTO MONITOR + +;RESTORE HARDWARE STATE OF CURRENT JOB + +CIP8: SKIPN JA,JBTDAT(ITEM) ;JOB DATA AREA(IS THERE ONE?) + MOVEI JA,NULDAT ;NO, MUST BE NULL JOB + MOVSI 17,JOBDAC(JA) ;RESTORE DUMP ACS + BLT 17,17 + SKIPE APRERR ;DID AN ERROR OCCUR WHILE CLKPI IN PROGRESS + ; (ON CLK PI OR HIGHER) + JRST CLKERR ;YES, GO PROCESS ERROR + SKIPN JOB ;IS THIS JOB THE NULL JOB? + SKIPN NULERR ;YES, HAS AN ERROR OCCURED WHILE NULL JOB + ; WAS RUNNING? IF YES, RESTORE ACS + ; ILL UUO LOSED ACS + JEN @USRPC ;DISMISS CHANNEL(IF INTERRUPT IN PROGRESS) + +;THE NULL JOB +;RUNS IN USER MODE WITH PC=1 AND COUNTS AND AC 0 + +EXTERNAL APRNUL,TIME,THSDAT,MIDNIT,NULERR + +NULJB: +IFN FTCHECK, + SETZB 0,NULERR ;CLEAR AC 0 USED FOR USUAL MONITORING + + ; CLEAR FLAG SAYING ERROR IN NULL JOB + ; OF NULL TIME INTERVAL + ; LOC JOBDAT (LOCATION OF NULL JOB DATA AREA) TO 0 + ; AS A FLAG (ONLY DUMP ACS USED IN NULL JOB DATA AREA) + + ; IF ANY ERRORS (APRERR NON-ZERO) OCCURRED + ; WHILE CLK IN PROGRESS + ; CATCH THEM NEXT CLK INTERRUPT + MOVE 1,[AOJA 0,1] ;INSTR. TO AC1 + JRST 11,1 ;DISMISS IF INTERUPT IN PROGRESS. + +;ROUTINE TO SET HARDWARE AND SOFTWARE RELOCATION INFORMATION FOR CURRENT USER +;CALLED FROM: +; CLOCK ROUTINE WHEN NEW USER IS DIRRERENT FROM OLD USER +; CORE ROUTINE WHEN CORE REASSIGNED FOR CURRENT USER +; CORE UUO +; REMAP UUO +; CALL RESET UUO +; CALL SETUWP UUO + +;CALL: STORE RELOCATION AND PROTECTION FOR LOW SEQ IN JOBADR(JOB NUMBER) +; STORE LENGTH-1 AND ABS ORIGIN FOR HIGH SEG IN JBTADR(HIGH SEG NO) +; (MOVE ITEM,JOB NUMBER - IF CALLING SETRL1) +; PUSHJ PDP,SETREL OR SETRL1 +; ALWAYS RETURN, C(ITEM)=JOB NUMBER, C(PROG)=XWD PROT,RELOC, FOR LOW SEG + + INTERN SETREL + EXTERN JOB,JBTADR,JOBADR,USRREL,JBTDAT,JOBDAT,JOBREL,KT10A + +SETREL: MOVE ITEM,JOB ;CURRENT JOB NUMBER + +SETRL1: MOVE PROG,JBTADR(ITEM) ;XWD PROTECTION,RELOCATION FOR LOW SEG + MOVEM PROG,JOBADR ;SAVE TO MAKE UUO HANDLER FASTER + HLRZM PROG,USRREL ;SAVE PROTECTION FOR ADDRESS CHECKING + ; (HIGHEST LEGAL REL ADDRES FOR CURRENT USER IN LOW SET) +IFN JDAT-PROG,< + MOVE JA,JBTDAT(ITEM) ;LOC OF JOB DATA AREA + MOVEM JA,JOBDAT ;SAVE IT TOO FOR UUO HANDLER +> + JUMPE PROG,SETHRD ;IF 0 (NULL JOB OR JOB DOING CORE 0 OR KJOB) + ; DO NOT STORE IN JOB DATA AREA (SINCE IT WILL BE + ; IN EXEC LOWER CORE. ALSO DO NOT STORE + ; IN LOC 33, SO CAN SEE LAST REAL USER TO RUN + + HLRZM PROG,JOBREL(JA) ;SET PROTECTION IN USER JOB DATA AREA + ; FOR HIM TO LOOK AT +IFN FT2REL,< + EXTERN SETHGH + PUSHJ PDP,SETHGH ;SET UP FOR HIGH SEG, IF USER HAS ONE + ; PROG SETUP FOR DATAO +> +IFE FT2REL,< + TLZ PROG,1777 ;CLEAR OUT PROTECTION FOR HIGH SEG + ; JUST IN CASE THIS IS A 2 REG. MACHINE(EVEN THOGH + ; SOFTWARE CANNOT HANDLE 2 SEGS) +> + MOVEM PROG,KT10A ;STORE IN LOWER CORE SO IT CAN BE FOUND OUT + ; USING SWITCHES WHAT IS IN SECOND REGISTER + ; OPTION DOES NOT COME WITH PANEL LIGHTS + ; SO NOT STORE 0 FOR NULL JOB SO CAN SEE + ; LAST JOB TO RUN IN LOC 33 + +SETHRD: DATAO APR,PROG ;SET APR HARDWARE FOR RELOCATION AND PROTECTION + ; FOR LOW(AND HIGH SEGS) + SKIPN PROG,JOBADR ;RESTORE PROG TO XWD PROT,RELOC FOR JUST LOW SEG + ; (IS THERE ONE)? + TDZA TAC,TAC ;NO, MUST BE NULL JOB OR CORE0 OR KJOB + ; SET FOR NO SPECIAL INTERRUTPS TO USER + MOVE TAC,JOBENB(JA) ;USER APR CONSO FLAGS (THE ONES HE WANTS TO HANDLE + ; FALL INTO SETAPR ROUTINE + +;ROUTINE TO ENABLE/DISABLE APR FOR TRAPPING TO USER AND EXEC +;CALL: MOVE TAC, APR, CONSO FLAGS FOR USER TRAPPING +; PUSHJ PDP,SETAPR +; RETUNRN WITH APR RESET AND INTERRUPT LOCATION CONS'S SET + + INTERN SETAPR + EXTERN APRFOV + +SETAPR: ANDI TAC,231010+APRFOV ;MASK OUT ALL BUT PD OVF, ILL MEM, NXM, + ; CLOCK, FOV(ONLY PDP-10), AND AROVF CONSO FLAGS + ; FOV=PC CHANGE ON PDP-6 WHICH IS NEVER ALLOWED + ; UNDER TIME SHARING BECAUSE IT TRAPS MONITOR TOO + HRLS TAC ;PRESERVE USER BITS IN LH + TRO TAC,231000 ;MAKE SURE MONITOR ALWAYS LOOKING FOR + ; PD OVF, IL;M, NXM, CLOCK FLAGS + MOVE TAC1,TAC ;DUPLICATE BITS IN TAC1 FOR CONO TO APR + XORI TAC1,110 ;COMPLEMENT FOV(PDP-10 ONLY) AND AROV FLAGS + ADDI TAC1, 330 ;SET DISABLE OR ENABLE FOR EACH + ANDI TAC1,660 ;MASK OUT ALL BUT DISABLE/ENABLE + ; BITS FOR FOV(PDP-10 ONLY) AND AROVF + CONO PI,PIOFF ;DISABLE PI'S SO NO INTS. MAY OCCUR WHILE + ;CHANGING HARDWARE & SOFTWARE STATE FOR + ;APR TRAPPING + HLRM TAC,APRIN1 ;STORE USER BITS + HRRM TAC,APRCON ;STORE EXEC BITS + CONO APR,APRCHN(TAC1) ;ENABLE OR DISABLE APR FOR + ; FOV(PDP-10 ONLY) AND AR OVF SEPARATELY + CONO PI,PION ;ENABLE PI'S AGAIN + POPJ PDP, + +SUBTTL RUNCSS - RUN CONTROL(STATRING AND STOPPING OF JOBS) + +;RUN CONTROL IS A COLLECTION OF ROUTINES WHICH +;SET AND CLEAR BITS IN THE JOB STATUS WORDS OF +;ALL JOBS SO THAT THE SCHEDULER WILL START AND STOP +;THEM ACCORDINGLY + +;COMMON ERROR STOPPING ROUTINES +;CALLED AT ANY LEVEL(UUO,CLK, OR INTERRUPT) +;CALL: MOVE ITEM,JOB CAUSING ERROR OR BEING STOPPED +; MOVE DEVDAT,ADDRESS OF THAT JOB TTYP DEVICE DATA BLOCK +; MOVE DAT,BYTE POINTER TO LAST CHAR, ALEADY MOVED +; :TO TTY OUTPUT BUFFER +; PUSHJ PDP,KSTOP,PHOLD,HOLD,OR ESTOP +; NEVER RETURN IF CALLED AT UUO LEVEL + +;ROUTINE TO STOP JONB AFTER KJOB COMMAND +;CALLED AT UUO LEVEL IF JOB HAD CORE,CLK LEVEL IF NOT + +INTERNAL KSTOP +EXTERNAL HIGHJB + +KSTOP: MOVSI TAC,JNA+JLOG+JACCT ;CLEAR JOB NUMBER ASSIGNED AND LOGGED IN BITS + ANDCAM TAC,JBTSTS(ITEM) +IFN FTLOGIN,< +EXTERN PRJPRG + SETZM PRJPRG(ITEM) ;CLEAR PROJECT-PROGRAMMER NUMBER WHEN JOB LOGS OUT +> + ; IF THIS IS THE LARGEST JOB IN USE,FIND NEXT + ; HIGHEST AND SET HIGHJB + CAMGE ITEM,HIGHJB ;IS THIS THE BIGGEST JOB NUMBER ASSIGNED? + JRST ESTOP ;NO, LEAVE HOLD + MOVSI TAC1,JNA ;YES,JOB NUMBER ASSGINED BIT + HRRZ TAC,ITEM ;SCAN DOWNWARD + TDNN TAC1,JBTSTS(TAC) ;IS JNA BIT SET FOR THIS JOB? + SOJG TAC,-1 ;NO,KEEP LOOKING,FINISHED(TRUE IF THIS THE ONLY JOB + MOVEM TAC,HIGHJB ;YES,STORE NEW HIGHEST JOB NUMBER ASSIGNED + JRST ESTOP ;GO SET ERROR BIT + +;ROUTINE TO STOP JOB, SET ERROR BIT AND PRINT MESSAGE +;THEM ADD ^TC +;CALL: MOVEI TAC,ADR. OF MESSAGE +; PUSHJ PDP,PHOLD + + INTERN PHOLD + +PHOLD: PUSHJ PDP,CONMES ;MOVE MESSAGE TO TTY OUTPUT BUFFER + ; FALL INTO HOLD +;ROUTINE TO STOP JOB, SET ERROR BIT. +;AND ADD "^C + +INTERNAL HOLD,HOLD1 +EXTERNAL TTYSTC + +HOLD: PUSHJ PDP,INLMES + ASCIZ / +^C + +./ + +HOLD1: PUSHJ PDP,TTYSTC ;MAKE SURE TTY STAYS IN MONITOR MODE + ; AND START TTYP TYPING OUTMESSAGE + ; FALL INTO ESTOP + +;ROUTINE TO STOP USER AND FLAG AS ERROR STOP + +INTERNAL ESTOP,ESTOP1 +EXTERNAL JBTSTS,STUSER,STREQ,STAVAL +EXTERNAL SCHEDF,JOB,CPOPJ + +ESTOP: JUMPE ITEM,CPOPJ ;IS THIS ERROR IN JOB 0? + MOVSI TAC,JACCT ;NO, CLEAR ACCOUNTING BIT(IN CASE LOGGING + ANDCAM TAC,JBTSTS(ITEM) ;IN OR OUT0 SO USER CAN USE CONTROL C + ; TO RECOVER +ESTOP1: MOVSI TAC,JERR ;SSET ERROR BIT IN JOB STATUS WORD + IORM TAC,JBTSTS(ITEM) ;SO JOB CAN NOT CONTINUE(CONT COM.) + CAME ITEM,STUSER ;SYSTEM TAPE USER? + JRST STOP1 ;NO + MOVSI TAC,637163 ;FIND SYS DDB + PUSHJ PDP,DEVSRC ;SYSTEM ERROR IF NOT FOUND + JSP DAT,ERROR + + PUSHJ PDP,RELEA9 ;YES, RELEASE SYSTEM TAPE WITHOUT WAITING + +;ROUTINE TO STOP NY JOB FROM BEING SCHEDULED +;CALL: +; MOVE ITEM, JOB NUMBER +; PUSHJ PDP, STOP1 +; EXIT ;RETURN HERE IMMEDIATELY, IF CALLED FROM HIGHER +;PRIORITY PI CHANNEL THAN CLK(LOWEST), OTHERWISE WHEN JOB IS RUNABLE +;CALLED FROM COMMAND DECODER WHEN C TYPED IN BY USER +;OR ON ANY ERROR MESSAGE(SFE PREVIOUS PAGE) + +INTERNAL STOP1 +EXTERNAL JBTSTS,PJBSTS,REQTAB,JOB,STUSER,MAXQ,AVALTB + +STOP1: MOVSI TAC,RUN + CONO PI,PIOFF ;DONE AT INTERRUPT LEVEL HIGHER THEN DT LEVEL + CAME ITEM,STUSER ;IS THIS JOB CURRENTLY USING THE SYTEM TAPE? + TDNN TAC,JBTSTS(ITEM) ;NO, IS RUN BIT OFF IN JOB STATUS WORD + JRST STOP1A ;YES + ANDCAM TAC,JBTSTS(ITEM) ;NO, SO CLEAR IT + CONO PI,PION + LDB TAC,PJBSTS ;GET JOB WAIT QUEUE CODE(IF ANY) + CAIG TAC,MAXQ ;DOES STATE HAVE Q ? + SOSL REQTAB(TAC) ;YES. REDUCE IT. + JRST STOP1A ;NO + SOSGE AVALTB(TAC) ;YES REDUCE COUNT + SETZM AVALTB(TAC) ;CLEAR AVAL FLAG IF NO ONE WAITING +STOP1A: CONO PI,PION ;MAKE SURE PI ON + CAME ITEM, JOB ;NO. IS THIS JONB CURRENT USER + +INTERNAL FTSWAP + +IFE FTSWAP,< + POPJ PDP, ;NO +> +IFN FTSWAP,< + JRST REQUE ;SET REQUE JOB FLAG +> + SKIPL TAC,JBTSTS(ITEM) ;RUN FLAG OFF? + TLNN TAC,JERR ;YES, ERROR FLAG ON? + JRST STOP2 ;NO + SETOM SCHEDF ;YES, FORCE RESCHEDULING EVEN IF JOB IN EXEC MODE + JRST STOP2 ;YES, MAKE CLK RESCHEDULE ANOTHER JOB + +;ROUTINE TO REQUE JOB WHICH HAS HAD A COMMAND TYPED +;WHICH NEEDS CORE AND THE CORE IMAGE IS ON THE DISK. +;OR IS IN CORE AND HAS ACTIVE DEVICES. +;CALLED FROM COMMAND DECODER +;CALL: MOVE ITEM,JOB NO. + PUSHJ PDP,DLYCOM + +INTERNAL DLYCOM + +DLYCOM: MOVSI TAC,CMWB ;SET COMMAND WAIT BIT +IFN FTSWAP,< + EXCH TAC,JBTSTS(ITEM) +> + IORM TAC,JBTSTS(ITEM) ;IN JOB STATUS WORD + +INTERNAL FTSWAP +IFN FTSWAP,< + TLNN TAC,CMWB + PUSHJ PDP,REQUE + +> + POPJ PDP, + +;ROUTINE TO PUT JONB IN NO CORE QUEUE + +INTERNAL FTSWAP +IFN FTSWAP, + +;ROUTINE TO SETUP MONITOR JOB TO RUN LATER AT UUO LEVEL +;CALLED BY COMMANDS WHICH MAY OR MAY NOT NEED TO +;RUN MONITOR JOB DEPENDING ON WHETHER JOB HAS CORE(KJOB,IJOB) +;TTY WILL REMAIN IN MONITOR MODE +;JOB MUST HAVE CORE ASSIGNED +;CALL: MOVE ITEM, JOB NUMBER +; MOVEI TAC1,ADDR. OF MONITOR JOB TO BE RUN +; PUSHJ PDP,MONJOB +;WHEN SCHEDULED TO RUN, MONITOR JOB MUST SET UP ITS OWN ACS + +INTERNAL MONJOB + +MONJOB: PUSHJ PDP,MSTART ;START WITH PC IN MONITOR + JRST SETRUN ;SET TTY TO START JOB WHEN COMMAND RESPONSE + ; IS FINISHED AND KEEP TTY IN MONITOR MODE + +;ROUTINE TO SETUP ACS FOR MONITOR JOB STARTING AT UUO LEVEL +;SETS UP ITEM, WITH JOB NO.; PROG WITH RELOCATION, AND PDP +;WITH PUSH DOWN LIST ADR. IN JOB DATA AREA +;USED BY KJOB,CORE 0,SAVE,GET,RUN,R,REASSIGN AND FINISH COMMANDS +;CALL: MOVEI TAC1,MONITOR JOB START ADDRESS +; JSP TAC,MONSTR +; RETURN WITH ACS PDP,PROG,JDAT, AND ITEM SETUP + +INTERNAL MONSTR +EXTERNAL JOB,JBTADR,MJOBPD,JOBPDL,TTYFNU,JBTDAT + +MONSTR: MOVE ITEM,JOB ;CURRENT JOB NUMBER + MOVE JDAT,JBTDAT(ITEM) ;ADR. OF JOB DATA AREA +IFN JDAT-PROG,< + MOVE PROG,JBTADDR(ITEM) ;JOB RELOCATION +> + MOVSI PDP,MJOBPD ;MINUS LENGTH OF SYSTEM PD LIST + HRRI PDP,JOBPDL(JDAT) ;FIRST LOC.-1 OF PD LIST + PUSH PDP,TAC1 ;SAVE STOP ADDRESS + JRST (TAC) ;RETURN AND DO MONITOR JOB + ; WITH TT DDB,OUTPUT BYTE POINTER, AND JOB NO. + +;ROUTINE TO SET JOB STATE TO BE SCHEDULED TO RUN +;WITH SPECIFIED STARTING ADDRESS INCLUDING PC FLAGS +;CALLED ONLY WHEN JOB IN CORE AND AFTER JOB HAS BEEN +;SAFELY STOPPED IN ONE OF 3 STATES: +;1) PC IN USER MODE +;2) JOB IN A WAIT FOR SHARABLE DEVICE, OR IO WAIT +;3) JOB JUST ABOUT TO RETURN TO USER MODE FROM A UUO CALL +;CALL: MOVE TAC1,STARTING PC +; MOVE ITEM, JOB NUMBER +; MOVE JDAT,ADR. OF JOB DATA AREA WHICH MUST BE IN CORE +; PUSHJ PDP,USTART(PC TO USER MODE),MSTART(PC TO MONITOR MODE) +; RETURN HERE IMMEDIATELY + +INTERNAL MSTART,USTART +EXTERNAL JOBPC,JOBDAC,JOBD17,TTYSET,JOBOPC,JOBPD1 + +USTART: MOVE TAC,JOBPC(JDAT) ;GET OLD PC + TLNE TAC,USRMOD ;IS IT IN USER MODE TOO? + JRST USTRT1 ;YES, DUMP ACS AND PC FLAGS ARE ALREADY HIS + + MOVEI TAC,JOBDAC(JDAT) ;NO. MOVE USERS(UUO) ACS TO DUMP ACS + HRL TAC,JDAT ;SOURCE=REL, 0,DEST,=JOBDAC IN JOB DATA AREA + BLT TAC,JOBD17(JDAT) ;MOVE ALL ACS + MOVE TAC,JOBPD1(JDAT) ;UUO PC HAS LAST PC + HRRI TAC,-1(TAC) ;SUBTRACT 1 FROM RIGHT HALF AND + ; PRESERVE LH PC FLAGS + ; (RH=0 ON HALT 0 OR FIRST START) +USTRT1: MOVEM TAC,JOBOPC(JDAT) ;STORE OLD PC FOR USER TO LOOK AT + HLL TAC1,TAC ;PRESERVE USER APR FLAGS + TLO TAC1,USRMOD ;MAKE SURE NEW PC IN USER MODE + TLZ TAC1,37 ;MAKE SURE NO INDIRECT BITS OR INDEX FIELD + +MSTART: MOVEM TAC1,JOBPC(JDAT) ;STORE NEW PC + MOVSI TAC,JERR+WTMASK + ANDCAM TAC,JBTSTS(ITEM) ;CLEAR ERROR AND WAIT STATUS BITS + ;SET TTY STATE TO INITAL COND. + ; TTYUSR OR TTYURC SHOULD BE CALLED + ; TO INDICATE WHETHER TTY TO USER OR EXEC MODE + ; AND THAT JOB IS TO RUN(RUN BIT =1) WHEN + ; MONITOR COMMAND RESPONSE FINISHES. + ; SEE SETRUN BELOW + +;ROUTINE TO SET JOB STATUS RUN BIT(RUN) +;CALLED BY SCANNER SERVICE WHEN TTY MONITOR COMMAND +;RESPONSE FINISHES, THIS ACTION IS ENABLED BY CALLING +;TTYUSR. OR TTYURC IN SCNSER +;CALL: MOVE ITEM,JOB NUMBER +; PUSHJ PDP,SETRUN + +INTERNAL SETRUN +EXTERNAL JBTSTS,PJBSTS,REQTAB,AVALTB,RNQUNT +EXTERNAL MAXQ + +SETRUN: LDB TAC,PJBSTS ;GET JOB STATUS WAIT QUEUE CODE + CAILE TAC,MAXQ ;DOES JOB STATUS CODE HAVE A QUEUE? + JRST SETR1 ;NO + AOSLE REQTAB(TAC) ;ADD TO REQUEST COUNT + JRST SETR1 ;OTHERS WAITING? + AOSG AVALTB(TAC) ;MAKE AVAILABLE + SETOM AVALTB(TAC) ;FLAG AS JUST AVAILABLE, BECAUSE + ; NO JONB WAS USING DEVICE. SCHEDULER + ; WILL SCAN THIS QUEUE +SETR1: MOVSI TAC,RUN ;SET RUN BIT IN JOB STATUS WORD + IORM TAC,JBTSTS(ITEM) +SETR2: MOVE TAC,RNQUNT ;SET QUANTUM TIME TO RUN QUEUE QUANTUM + HRRM TAC,JBTSTS(ITEM) ;RUN QUEUE QUANTUM + +INTERNAL FTSWAP +IFE FTSWAP,< + JRST NULTST ;GO SEE IF NULL JOB IS RUNNING +> +IFN FTSWAP,< + INTERNAL REQUE + EXTERNAL QJOB,JBTSTS + +REQUE: MOVSI TAC,JRQ ;MARK JOB TO BE REQUEUED WITH JRQ BIT + TDNN TAC,JBTSTS(ITEM) ;INCREMENT COUNT ONLY ONCE FOR EACH JOB + AOS QJOB ;INCREMENT COUNT OF NO. OF JOBS WAITING TO BE REUEUED + + IORM TAC,JBTSTS(ITEM) ;SET REQUE BIT FOR SCHEDULER + POPJ PDP, + +> + +;ROUTINE TO PUT A JOB TO SLEEP AND WAKE UP AGAIN LATER +;CALLED AFTER CLOCK QUEUE REQUEST PUT IN BY UUO ROUTINE + +INTERNAL FTSLEEP + +IFN FTSLEEP,< +INTERNAL SETSLP +EXTERNAL JBTSTS,SLPQ + +SETSLP: MOVSI TAC,CLKR ;FLAG THAT A CLOCK REQUEST HAS BEEN PUT IN + IORM TAC,JBTSTS(ITEM) ;SO ONLY ONE PER JOB + MOVEI AC1,SLPQ ;SLEEP STATE CODE + JRST SETSTT ;SET STATUS AND RESCHEDULE + +;HERE AT CLOCK LEVEL WHEN CLOCK REQUEST TIMES OUT FOR SLEEP +;JOB NO. IN AC TAC + +INTERNAL WAKE + +EXTERNAL PJSTS,RNQ,SLPQ + +WAKE: MOVEI TAC1,RNQ ;RUN QUEUE CODE + MOVE ITEM,TAC ;JOB NO. + MOVSI TAC,CLKR ;CLEAR CLOCK REQUEST BIT FOR THIS JOB + ANDCAM TAC,JBTSTS(ITEM) ;SO IT CAN PUT ANOTHER ONE IN + LDB TAC,PJBSTS ;GET QUEUE CODE + CAIE TAC,SLPQ ;IS JOB STILL SLEEPING? + POPJ PDP, ;NO, RETURN TO CLOCK ROUTINE + DPB TAC1,PJBSTS ;YES, STORE RUN QUEUE CODE + ; (CONTROL C, START CAN GET JOB OUT SLEEP) + JRST SETR2 +> + +;ROUTINE TO GET DATA CONTROL AND ANOTHER SHARABLE DEVICE +;JOB NEVER GETS ONE DEVICE AND WAITS FOR SECOND, SINCE TYPING +;CONTROL C WOULD NEVER FINISH WITH FIRST DEVICE +;CALL PUSHJ PDP,GETDCXX +; AOSE XXREQ ;REQUEST COUNT FOR OTHER DEVICE +; RETURN WHEN BOTH AVAILABLE + +INTERNAL GETDCDT,GETDCMT +EXTERNAL DCREQ,REQTAB,AVALTB,DCAVAL,CPOPJ1 + +GETDCDT:GETDCMT: + XCT @(PDP) ;INCREASE SHARABLE DEVICE REQ. COUNT +GETWT: PUSHJ PDP,DVWAT1 ;NOT AVAIL., GO WAIT FOR IT + AOSN DCREQ ;IS DATA CONTROL AVAILABLE? + JRST CPOPJ1 ;YES, RETURN BOTH AVAILABLE + MOVE AC1,@(PDP) ;DATA CONTROL NOT AVAILABLE + SUBI AC1,REQTAB + SOSL REQTAB(AC1) ;REDUCE REQ. COUNT FOR OTHER + ; SHARABLE DEVICE. + SETOM AVALTB(AC1) ;SET AVAILABLE IF OTHER JOBS WAITING + JFCL DCREQ ;ARGUMENT FOR DCQAIT + PUSHJ PDP,DCWAIT ;WAIT FOR DATA CONTROL FREE + MOVE AC1,@(PDP) ;INCREMENT REQ. COUNT + AOSN @AC1 ;NOW IS SHARABLE DEVICE FREE? + JRST CPOPJ1 ;YES + SOSL DCREQ ;NO, REDUCE DATA CONTROL REQUEST + SETOM DCAVAL ;SET AVAIL., SOME OTHER JOB WAITING FOR IT + JRST GETWT ;TRY AGAIN + +;ROUTINE TO WAIT FOR A SHARABLE DEVICE +;CALLED AT UUO LEVEL ONLY BY DEVICE SERVICE ROUTINES +;CALL: AOSLE XXREQ ;ADD 1 TO SHARABLE DEVICE REQUEST COUNT +; ;IS DEVICE AVAILABLE? +; PUSHJ PDP,XXWAIT ;NO, PUT JOB IN WAIT QUEUE +; RETURN WHEN DEVICE AVAILABLE + +;INITIALLY THE REQUEST COUNT IS -N, WHERE N IS THE +;NUMBER OF JOBS WHICH CAN USE THE SHARABLE DEVICE AT THE SAME TIME +;A REQUEST COUNT OF 0 MEANS THE MAXIMUM NO. OF JOBS ARE +;USING THE DEVICE, A POSITIVE NUMBER IS THE +;NUMBER OF JOBS WAITING IN THE SHARABLE DEVICE WAIT QUEUE + +INTERNAL DVWAIT +INTERNAL MTWAIT,STWAIT,DTWAIT,DCWAIT,DAWAIT,MQWAIT,AUWAIT +EXTERNAL JOB,REQTAB + +MTWAIT:DTWAIT:DCWAIT:STWAIT:DAWAIT:MQWAIT:AUWAIT: + +DVWAIT: MOVE AC1,(PDP) ;GET ADR. OF CALLER + MOVE AC1,-2(AC1) ;GEET AOSLE XXREQ INSTRUCTION + JRST .+2 +DVWAT1: MOVE AC1,@-1(PDP) ;GET ADR. OF CALLER OF THIS ROUTINE + SUBI AC1,REQTAB ;COMPUTE WAIT-STATE QUEUE CODE +SETSTT: MOVE AC3,JOB ;CURRENT JOB NO. + DPB AC1,PJBS1 ;STORE IN JOB STATUS WORD + JRST WSCHED ;GO SCHEDULE ANOTHER AND RETURN TO CALLER + ; WHEN SHARABLE DEVICE BECOMES AVAILABLE + ; SEE CLOCK AND CLKCSS + +PJBS1: POINT JWSIZ,JBTSTS(AC3),JWPOS ;BYTE POINTER TO JOB STATUS + ; WORD WAIT QUEUE CODE + +;ROUTINE TO SET JOB TO RUN AFTER IT HAS BEEN STOPPED +;BECAUSE IT HAD TO WAIT FOR IO TO COMPLETE FOR SOME DEVICE +;EACH SERVICE ROUTINE WILL AT INTERRUPT LEVEL +;CHECK EACH TIME IT FINISHED A TASK(RUNFFERFUL) +;TO SEE IF THE JOB USING THE DEVICE HAS +;PREVIOUSLY CAUGHT UP WITH DEVICE AND HAS BEEN STOPPED +;CALL: MOVE DEVDAT,ADR, OF DEVICE DATA BLOCK +; MOVE IOS,DEVIOS(DEVDAT) ;GET DEVICE IO STATUS WORD FROM DDB +; TLZE IOS,IOW ;IS JOB AN IO WAIT FOR THIS DEVICE? +; PUSHJ PDP,SETIOD ;YES, GO FLAG JOB TO START UP AGAIN +; RETURN +;SETS THE JOB QUEUE WAIT CODE TO WSQ IN JOB STATUS WORD, +;THE SCHEDULER THEN SEES THAT THIS JOB HAS ITS +;IO WAIT SATISFIED AND IS WAITING TO BE RUN AGAIN + +INTERNAL SETIOD,STTIOD +EXTERNAL WSQ,WSAVAL,TSQ,TSAVAL,JOB,PJOBN + +PJBS2: POINT JWSIZ,JBTSTS(TAC),JWPOS ;BYTE POINTER TO JOB STATUS + ; WORD QUEUE CODE +STTIOD: MOVEI TAC1,TSQ ;SET TTY IO WAIT SATISFIED QUEUE CODE + AOS TSAVAL + JRST SETIO1 +SETIOD: MOVEI TAC1,WSQ ;REQUE TO WAIT SATISFIED Q + AOS WSAVAL ;INCR, NO, OF JOBS WITH IO WAIT + ; SATISFIED, NON-ZERO WSAVAL WILL + ; CAUSE SCHED, TO SCAN FOR IO +SETIO1: LDB TAC,PJOBN + DPB TAC1,PJBS2 ;IN JOB STATUS WORD + +INTERNAL FTSWAP +IFN FTSWAP,< + EXTERN QJOB,JBTSTS + MOVSI QJOB,JBTSTS + MOVSI TAC1,JRQ ;SET JOB TO BE REQUEUED AT NEXT CLOCK TICK + TDNN TAC1,JBTSTS(TAC) ;IS REQUE BIT ALREADY ON? + AOS QJOB ;NO, INCREMENT COUNT ONCE FOR EACH JOB + IORM TAC1,JBTSTS(TAC) ;SET REQUEUEING BIT FOR SCHEDULER +> +NULTST: SKIPE JOB ;IS NULL JOB RUNNING? + POPJ PDP, ;NO LET OTHER JOB RUN TILL SCHEDULER IS TRAPPED TO + +;ROUTINE TO CAUSE CLK TO ROUTINE TO RESCHEDULE +;CALLED AT ANY LEVEL +;CALL: PUSHJ PDP,STOP2 +; RETURN IMMEDIATELY EXCEPT IF AT UUO LEVEL +; IF AT UUO LEVEL, RETURN WHEN JOB IS RUNABLE AGAIN + +INTERNAL STOP2 +EXTERNAL PICLK,CLKFLG + +STOP2: CONO PI,PIOFF ;PREVENT CLOCK INTERRUPT DURING STOP2 CODE + SETOM CLKFLG ;SET FLAG TO INDICATE CLK INTERRUPT + ; EVEN THOUGH CLK INTERRUTP IS NOT A ATIME INTERRUPT + CONO PI,PICLK ;TURN PI BACK ON AND REQUESST INTERRUPT TO + ; CLK PI CHANNEL(LOWEST PRIORITY CHANNEL) + POPJ PDP, ;INTERRUPT IMMEDIATELY IF AT UUO LEVEL + +;ROUTINE TO WAIT TILL DEVICE CATCHES UP WITH USER AND BECOMES INCTIVE +,CALLING SEQUENCE +, PUSHJ PDP, WAIT1 +, EXIT ALWAYS RETURN HERE + +,IF DEVICE IS INACTIVBE (IOACT=0), RETURNS TO EXIT, OTHERWISE, SETS +,IOW:=1 AND ENTERS WAIT UNLESS IOCT BECOMES ZERO BEFORE THE +,JUMP IS MADE, IN WHICH CASE IT SETS IOW:=0 AND RETURNS TO EXIT, +,ON LEAVING THE WIAT STATE, RETURNS TO EXIT. +,THIS ROUTINE PREVENTS THE STATE IOACT=0 AND IOW=1 FROM OCCURING +,CALLING SEQUENCE +, PUSHJ PDP, WSYNC +, EXIT ALWAYS RETURNS HERE +,SETS IOW:=1 AND ENTERS WAIT ROUTINE. RETURNS TO EXIT WHEN IOACT=0 + +INTERNAL WAIT1 + +WAIT1: MOVE IOS,DEVIOS(DEVDAT) + TRNN IOS, IOACT ;IS DEVICE ACTIVE? (IOACT=1?) + POPJ PDP, ;RETURN + PUSHJ PDP,WSYNC ;WAIT + JRST WAIT1 + +;WSYNC IS CALLED TO WAIT UNTIL SETIOD IS CALLED BY INTERRUPT SERVICE ROUTINE +;IE UNTIL CURRENT BUFFER ACTIVITY IS COMPLETE +;CALLED ONLY FROM UUO LEVEL +;CALL: MOVE DEVDAT,ADR. OF DEVICE DATA BLOCK +; PUSHJ PDP,WSYNC +; RETURN IMMEDIATELY IF DEVICE IS INACTIVE +; RETURN WHEN DEVICE FINISHES NEXT BUFFER IF IT IS ACTIVE + +INTERNAL WSYNC +EXTERNAL IOWQ,TIOWQ,PION,PIOFF + +WSYNC: MOVSI IOS,IOW ;SETUP DEVICE IO WAIT BIT + MOVEI AC1,IOWQ ;IO WAIT STATE CODE + MOVE AC3,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS + TLNE AC3,DVTTY ;IS THIS DEVICE A TTY? + MOVEI AC1,TIOWQ ;YES, SET TTY WAIT STATE CODE + MOVE AC3,JOB ;CURRENT JOB NO. + + MOVEI AC2,IOACT ;DEVICE ACTIVE BIT + CONO PI, PIOFF ;TURN PI OFF + TDNN AC2,DEVIOS(DEVDAT) ;IS THE DEVICE ACTIVE? + JRST WSYNC1 ;NO + IORM IOS,DEVIOS(DEVDAT) ;YES, SET DEVICE IO-WAIT BIT + ; AND SETUP IOS FOR RETURN WHEN WAIT SATISFIED + DPB AC1,PJBS1 ;SET JOB WAIT STATE CODE + ; IN JOB STATUS WORD + CONO PI, PION ;TURN PI ON + PUSHJ PDP,WSCHED ;CALL SCHEDULER TO FIN ANOTHER JOB TO RUN + ; RETURN WHEN NEXT BUFFERFUL IS FINISHED + ; WITH ACS 0-14 OCTAL RESTORED + ; RETURN WHEN IO-WAIT FINISHED +WSYNC1: CONO PI, PION + ANDCAB IOS, DEVIOS(DEVDAT) ;CLEAR DEVIVCE IO-WAIT BIT + POPJ PDP, + +CLKEND: END diff --git a/src/comcon.mac b/src/comcon.mac new file mode 100644 index 0000000..050b588 --- /dev/null +++ b/src/comcon.mac @@ -0,0 +1,2994 @@ +TITLE COMCON - COMMAND DECODER AND SAVEGET ROUTINES - V433 +SUBTTL /RCC 03 JUN 69 +XP VCOMCN,433 + ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB + + ENTRY COMCON ;ALWAYS LOAD COMCON IF LIBRARY SEARCH +COMCON: + +;CALLED FROM CLOCK ROUTINE WHEN 'COMCNT' IS GREATER THAN 0 + +;AS SET BY TTY SERVICE ROUTINE +;ALL AC'S HAVE BEEN SAVED BY CLOCK CHANNEL +;THE COMMAND DECODER CALLS TTYCOM WHICH SCANS FOR TTY WHICH TYPED +;THE COMMAND AND THEN DISPATCHES(PUSHJ) TO APPROPRIATE +;COMMAND SETUP ROUTINE OF THE SAME NAME WITH AC'S SET AS: +;ITEM = JOB NUMBER +;TAC = BYTE POINTER TO COMMAND STRING(SPACE OR CR AFTER COMMAND NAME) +;DAT = BYTE POINTER TO LAST OUTPUT CHARACTER +;DEVDAT = ADDRESS OF DEVICE DATA BLOCK TYPING COMMAND +;JDAT = ADDRESS OF JOB AREA, = 0 IF NO JOB AREA +;PROG = ADDRESS OF PROGRAM AREA, 0 MEANS NOT IN CORE OR NO CORE +;IOS IS SET TO 0, USED FOR ADDRESS OF SUBSEQUENT CALLS +;DEVDAT IS ALSO PUSHED ON END OF PO LIST SO IT MAY BE DESTROYED +;UPON RETURN FROM COMMAND SETUP ROUTINE, A CR-LF IS ADDED TO +;MESSAGE AND TTY IS STARTED ON TTYP SPECIFIED BY -1(PDP) +;SEVERAL COMMAND FLAGS ARE CHECKED BEFORE DISPATCHING TO +;COMMAND SETUP ROUTINES TO SEE IF COMMAND IS LEGAL AT THIS TIME +;SEVERAL MORE FLAGS ARE CHECKED UPON RETURN FROM COMMAND SETUP +;ROUTINES(UNLESS AN ERROR HAS OCCURRED) FOR STANDARD +;COMMAND RESPONSE +;IF AN ERROR OCCURS, THE JOB NO.(ITEM) SHOULD BE 0 ON RETURN +;SO THAT JOB WILL NOT BE INITIALIZED IF FIRST COMMAND. +;ERRMES ROUTINE WILL SET ITEM TO 0 + +;SINCE THE COMMAND DECODER IS CALLED FROM THE CLOCK ROUTINE +;COMMAND SETUP ROUTINE MUST RUN TO COMPLETION QUICKLY +;IF A COMMAND FUNCTION CANNOT DO THIS, IT MUST JUST SET +;THE JOB TO RUNABLE STATUS AND RETURN IMMEDIATELY +;OR DELAY THE COMMAND FOR LATER EXECUTION + +INTERNAL COMMAND +INTERNAL FTLOGIN,FTSWAP,FTTIME +EXTERNAL COMCNT,TTYCOM,JBTSTS,JOBMAX,JBTDAT,JBTADR,JOBHCU +EXTERNAL CONFIG,HIGHJB +EXTERNAL TTYSTR,TTYUSR,TTYATT +EXTERNAL TTYTAB,PUNIT,TTYATI +EXTERNAL ADRERR,ANYACT,ASSASG,CORE0,DAMESS,DEVLG,DEVPHY,DEVSRC +EXTERNAL DLYCOM,ERNAM,ESTOP,GETWD1,GETWDU,KSTOP,CORE1,MONJOB,DECP1 +EXTERNAL MONSTR,MSTART,OCTPNT,PHOLD,PRNAME,RADX10,RELEA5 +EXTERNAL RELEA6,RESET,SETRUN,STOP1 +EXTERNAL STOTAC,UPTIME,USRXIT,USTART,UUOERR + +T=BUFPNT ;TEMPORARY AC'S +T1=BUFWRD +T2=UUO +T3=AC1 +T4=AC2 +COMMAND:PUSHJ PDP,TTYCOM ;SETUP DEVDAT,DAT,TAC,AND ITEM + ; FOR ANY TTY WHICH HAS TYPED A COMMAND +COM0: POPJ PDP, ;NONE FOUND + PUSH PDP,DEVDAT ;SAVE TTY DEVICE DATA BLOCK ADDRESS + PUSHJ PDP,CTEXT ;SCAN COMMAND NAME, RETURN IT IN TAC1 + MOVE T,TAC1 ;COPY COMMAND. + MOVNI T1,1 ;SET MASK ALL ONES + LSH T1,-6 ;CLEAR OUT ONE MORE CHAR. + LSH T,6 ;SHIFT 1 COMMAND CHAR OFF + JUMPN T,.-2 ;IF NOT END OF COMMAND. GO AROUND + MOVEI T4,0 ;CLEAR FLAG REGISTER + MOVSI T,-DISPL ;SEARCH COMMAND TABLE FOR MATCH +COMLP: MOVE T2,COMTAB(T) ;GET NEXT ENTRY FROM COMMAND TABLE + TDZ T2,T1 ;MASK OUT CHAR 5 + CAMN TAC1,COMTAB(T) ;EXACT MATCH? + JRST COMFND ;YES, THIS IS IT. + CAME TAC1,T2 ;MATCH? + JRST COMNEQ ;NOT EVEN GOOD MASK + TROE T4,1 ;MATCHES MASKED, IS THIS FIRST ONE + TROA T4,2 ;NO, SET 2ND OCCUR FLAG + MOVE T3,T ;YES, COPY CURRENT INDEX +COMNEQ: AOBJN T,COMLP ;NO, KEEP LOOKING + CAIN T4,1 ;DID ONE AND ONLY ONE COMMAND MATCH? + MOVE T,T3 ;YES, GET ITS INDEX + +COMFND: MOVE TAC1,DISP(T) ;GET DISPATCH TABLE ENTRY, + PUSH PDP,TAC1 ;SAVE RH(DISPATCH ADR,+BITS) + MOVE T,JBTSTS(ITEM) ;JOB STATUS WORD FOR THIS JOB +IFN FTLOGIN,< + TLNN T,JLOG ;IS JOB LOGGED IN? + TLNE TAC1,NOLOGIN ;NO, CAN COMMAND PROCEED WITH NO LOGIN? + JRST CHKNO ;YES + JSP TAC,COMER ;NO, TYPE "LOGIN PLEASE" + ASCIZ /LOGIN PLEASE +/> +CHKNO: JUMPN ITEM,CHKRUN ;JOB NUMBER ALREADY ASSIGNED? + TLNE TAC1,NOJOBN ;NO, DOES THIS COMMAND NEED A JOB NUMBER? + JRST COMGO ;NO + MOVEI ITEM,1 ;YES, SCAN FOR ONE STARTING WITH 1 +NUMLOP: MOVE T,JBTSTS(ITEM) ;SCAN FOR FREE JOB NO. + TLNN T,JNA+CMWB ;THIS NUMBER ASSIGNED? + JRST NEWJOB ;NO, SO USE THIS NUMBER + + CAIGE ITEM,JOBMAX ;YES, IS THE MAX. JOB NO.? + AOJA ITEM,NUMLOP ;NO, KEEP LOOKING + JSP TAC,COMER ;YES, NONE LEFT, PRINT "JOB CAPACITY EXCEEDED" + ASCIZ /JOB CAPACITY EXCEEDED +/ + ; EVEN THROUGH THIS IS A NEW JOB NUMBER + ; IT MAY HAVE CORE ASSIGNED NOW BECAUSE IT WAS DELAYED + ; UNTIL IT COULD BE SWAPPED IN(LOGIN WITH CORE FULL) +NEWJOB: MOVEI T1,ASSCON ;SET ASSIGNED BY CONSOLE BIT FOR TTY + IORM T1,DEVMOD(DEVDAT) ;SO OTHER JOBS CAN NOT USE + SETZM DEVLOG(DEVDAT) ;SET LOGICAL NAME TO ZERO + ; "TTY" IS PUBLIC LOGICAL NAME +IFN FTTIME,< + SETZM RTIME(ITEM) ;CLEAR INCREMENTAL JOB RUNNING TIME + SETZM TTIME(ITEM) ;CLEAR TOTAL JOB RUNNING TIME +> +IFN FTKCT,< + EXTERN JBTKCT + SETZM JBTKCT(ITEM) ;CLEAR CORE-RUNNING TIME CORE +> + CAMLE ITEM,HIGHJB ;HIGHEST JOB NUMBER ASSIGNED? + MOVEM ITEM,HIGHJB ;YES,SAVE IT FOR SCHEDULER SCAN OF JOBS + +CHKRUN: TLNE T,RUN ;RUN BIT ON IN JOB STATUS? + TLNN TAC1,NORUN ;YES, DOES THIS COMMAND REQUIRE A JOB? + JRST CHKACT ;NO + JSP TAC,COMER ;YES. + ASCIZ /PLEASE TYPE ^C FIRST +/ + +CHKACT: + +IFN PROG-JDAT,< + MOVE JDAT,JBTDAT(ITEM) ;ADDRESS OF JOB DATA AREA +> + MOVE PROG,JBTADR(ITEM) ;XWD PROTECTION,RELOCATION +IFN FTSWAP,< + TLNE TAC1,INCOR!NOTRAN ;MUST JUST NOT BE SWAPPING OR + ; IF JOB HAS CORE ASSIGNED, MUST IT BE + ; IN PHYSICAL CORE (RATHER THAN DISK OR ON ITS WAY) + TLNN T,SWP ;YES, IS JOB ON DISK OR ON ITS WAY? + JRST CHKCO2 ;NO + TLNN TAC1,INCOR ;YES, MUST JOB BE IN CORE? + JUMPE PROG,CHKCO2 ;NO, IS A SWAP FOR THIS JOB IN PROGRESS? + ; NO, SO COMMAND MUST BE DELAYED + ; (EITHER BECAUSE SWAP IN PROGRESS OR + ; JOB ON DISK AND MUST BE IN PHY CORE) + HRRI TAC1,DLYCM ;ASSUME JOB MUST BE IN PHY CORE + ; SO SET TO SWAP JOB IN + TLNN TAC1,INCOR ;IS THIS TRUE? +CHKDLY: HRRI TAC1,DLYCM1 ;NO, JUST DELAY COMMAND UNTIL SWAP OUT OR IN IS FINISHED + JRST COMDIS ;AND DISPATCH TO DELAY COMMAND +CHKCO2: TLNE TAC1,NOACT ;CAN COMMAND BE PERFORMED WITH ACTIVE DEVICES? + PUSHJ PDP,RUNCHK ;NO, RETURN IF JOB STOPPED AND NO ACTIVE DEVICES +CHKCO1: TLNE TAC1,NOCORE ;DOES THIS COMMAND NEED CORE? + JRST COMGO ;NO, GO DISPATCH + JUMPN PROG,CHKXPN ;YES, IS CORE IN MEMORY? + JSP TAC,COMER ;NO, PRINT "NO CORE ASSIGNED" + ASCIZ /NO CORE ASSIGNED +/ + +CHKXPN: TLNN TAC1,PLSXPN ;DOES THIS COMMAND NEED CORE TO BE EXPANDED? + JRST COMGO ;NO + HLRE IOS,JOBHCU(JDAT) ;YES, IS CORE STILL COMPRESSED(SAVE DID NOT GO + ; TO COMPLETION) + AOJGE IOS,COMGO ;LH=-2 DURING SAVE, WHEN CORE COMPRESSED + ;LH=-1 DURING SAVE OF HIGH SEG, OR GET OF LOW + ; OR HIGH SEG + PUSHJ PDP,EXPAND ;YES, EXPAND CORE FIRST + JFCL ;IGNORE ADDRESS CHECK ERROR, WE TRIED +IFN FTSWAP,< + JRST CHKDLY ;DELAY COMMAND BECAUSE COMMAND DECODER ACS ARE + ; ALL GONE, NEXT TIME JOBHCU WILL BE 0 +> + +IFE FTSWAP,< + HRRI TAC1,DLYCM1 ;DELAY COMMAND TILL NEXT CLOCK TICK + JRST COMDIS +> + +COMER: MOVSI TAC1,NOINCK + MOVEM TAC1,(PDP) + MOVEI TAC1,CERR ;CALL ERROR MESSAGE ROUTINE + +COMGO: MOVSI IOS,CMWRQ + TLZN T,CMWB ;CLEAR CMWB; WAS JONB IN COMM WAIT + ANDCAM IOS,(PDP) ;NO, CLEAR REQUEU BIT IN DISP. FLAGS + MOVEM T,JBTSTS(ITEM) + +COMDIS: MOVEI IOS,0 ;CLEAR IOS FOR SETTING DISPATCH ADDRESSES + PUSHJ PDP,(TAC1) ;DISPATCH TO COMMAND SETUP ROUTINE. + +;RETURN FROM COMMAND SETUP ROUTINE + +COMRET: POP PDP,T1 ;RESTORE COMMAND FLAGS + POP PDP,DEVDAT ;RESTORE TTY DDB ADDRESS. +IFN FTTTYSER,< + EXTERN TITAKR,TISYNC + LDB TEM,TITAKR(DEVDAT) ;GET BREAK CHARACTER + PUSHJ PDP,SKPBRK ;SKIP TO BREAK CHAR + SOS TISYNC(DEVDAT) ;REDUCE LINE COUNT +> + MOVSI T,400000 + LDB TAC,PUNIT + ANDCAM T,TTYTAB(TAC) ;YES. TURN OFF SIGN BIT + SOS COMCNT + JUMPN ITEM,COMRT1 ;DID AN ERROR OCCUR? + TLNN T1,NOJOBN ;I.E., ITEM=0 AND NOJOBN=0? + MOVSI T1,NOINCK+ERRFLG+CMWRQ ;YES, PRINT ERROR MESSAGE ONLY, AND + ;REQUEUE JOB IF NECESSARY. + +COMRT1: MOVE T,JBTSTS(ITEM) ;JOB STATUS WORD + TLNN T1,NOINCK ;SUPPRESS JOB INIT. CHECK? + TLOE T,JNA ;NO, IS JOB INIT BIT ALREADY SET? + JRST PCRLF ;YES. + MOVEM T,JBTSTS(ITEM) ;NO, SO SET IT THIS COMMAND + PUSHJ PDP,TTYATI ;ATTACH TTY TO JOB + JFCL ;INGORE IF CAN NOT(SHOULD NEVER HAPPEN) + PUSHJ PDP,INLMES ;AND PRINT "JOB " + ASCIZ /JOB / + MOVE TAC,ITEM ;PRINT JOB NUMBER + PUSHJ PDP,RADX10 + PUSHJ PDP,PRSPC + MOVEI TAC,CONFIG ;PRINT SYSTEM CONFIGURATION NAME + PUSHJ PDP,CONMES +IFN FTLOGIN, < + PUSHJ PDP,CRLF +> +IFE FTLOGIN, < + PUSHJ PDP,PRSPC + PUSHJ PDP,DAYTM1 +> + +PCRLF: TLNE T1,ERRFLG ;DID AN ERROR OCCUR? + PUSHJ PDP,PRQM ;YES. APPEND ? + TLNN T1,NOCRLF ;SUPRESS CRLF? + PUSHJ PDP,CRLF ;NO + TLNN T1,NOPER ;SUPRESS PRINTING PERIOD? + PUSHJ PDP,PRPER ;NO + JUMPE ITEM,PCRLF1 ;JOB DOES NOT RUN IF ERROR OR NO JOB NO. ASSIGNED + TLNE T1,TTYRNU ;JOB TO RUN WHEN TTY FINISHED TYPING? + ; COMMAND RESPONSE (TTY TO USER MODE)? + PUSHJ PDP,TTYUSR ;YES, CALL SCANNER ROUTINE + TLNE T1,TTYRNC ;NO. JOB TO RUN AND REMAIN IN MONITOR MODE? + PUSHJ PDP,SETRUN ;YES, CALL SCANNER ROUTINE +PCRLF1: TLNN T1,NOMESS ;IS THERE A MESSAGE? + PUSHJ PDP,TTYSTR ;YES. START TTY TYPING IT OUT +IFN FTSWAP, < + EXTERN PJOBN,REQUE + LDB ITEM,PJOBN ;GET JOB NUMBER FROM TTY DEVICE DATA BLOCK + JUMPE ITEM,CPOPJ + TLNE T1,CMWRQ ;REQUEUE JOB AFTER COMMAND WAIT OR ERROR? + + JRST REQUE ;YES +> + POPJ PDP, + +IFN FTTTYSER, + +;TABLE OF CONSOLE COMMANDS + +INTERNAL FTATTACH,FTTIME,FTTALK,FTEXAMINE,FTLOGIN,FTREASSIGN +INTERNAL FTFINISH,FTCCL + +;BITS CHECKED BEFORE DISPATCHING TO COMMAND SETUP ROUTINE + +NOCORE=400000 ;NO CORE NEEDED FOR COMMAND +NOJOBN=200000 ;NO JOB NUMBER NEEDED FOR COMMAND +NOLOGIN=100000 ;JOB DOES NOT NEED TO BE ALREADY LOGGED IN. +NOACT=40000 ;COMMAND MUST BE DELAYED IF JOB HAS ACTIVE DEVICES. +NOTRAN=20000 ;COMMAND MUST BE DELAYED IF SWAPPED TRANSFER IN PROGRESS +NORUN=10000 ;AN EXPLICIT ^C MUST BE TYPED BY USER BEFORE COMMAND + ; IS EXECUTED IF JOB IS RUNNING + ; JOB MUST BE SWAPPED IN IF IT HAS LOGICAL CORE +INCOR=4000 ;USED ONLY BY COMMAND DISPATCH + ; DOES NOT APPEAR IN COMMAND TABLE +INCORE=4000!NOTRAN ;COMMAND MUST BE DELAYED IF JOB HAS LOGICAL CORE + ; WHICH IS ON DISK OR ON ITS WAY IN OR OUT. + ; JOB WILL BE SWAPPED IN (SEE DLYCOM) + ; AND IS NOT SITTING QUIETLY IN CORE(IE NO SWAPPING TRANSFER) +PLSXPN=4 ;CORE MUST BE EXPANED IF STILL COMPRESSED BY SAVE NOT GOING + ; TO COMPLETION(CONTROL C OR DEVICE OK?) + ; MUST BE USED IN CONJUNCTION WITH COMMANDS WHICH + ; NEED CORE AND NEED IT IN CORE + +;BITS CHECKED AFTER RETURN FROM COMMAND SETUP ROUTINE + +CMWRQ=2000 ;REQUEUE JOB AFTER COMMAND WAIT +NODATE=1000 ;DON'T PRINT DATE DURING JOB INTERROGATION +NOINCK=400 ;NO CHECK FOR JOB INITIALIZATION (JNA=0) +NOCRLF=200 ;NO PRINTING OF CRLF +NOPER=100 ;NO PRINTING OF PERIOD +TTYRNU=40 ;SET TTY TO USER MODE AND START JOB + ; WHEN COMMAND RESPONSE STOPS TYPING +TTYRNC=20 ;KEEP TTY IN COMMAND MODE AND START JOB + ; WHEN COMMAND RESPONSE STOPS TYPING +NOMESS=10 ;NO COMMAND RESPONSE EVER, DO NOT CALL TTYSTR + + ;T TAKEN ABOVE BY 'PLSXPN' BIT + +ERRFLG=1 ;COMMAND ERROR + +DEFINE NAMES< + C START,START,NOPER!TTYRNU!INCORE!NOACT!NORUN + C HALT,STOP,NOCORE!NOJOBN!NOLOGIN!NOINCK!CMWRQ + C KJOB,KJOB,NOCORE!NOJOBN!NOINCK!NOLOGIN!NOACT!NORUN!NOPER!NOCRLF!NOMESS!NOTRAN + C <>,CBLANK,NOCORE!NOJOBN!NOLOGIN!NOINCK!NOCRLF + C R,RCOM,NOCORE!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN + C RUN,RUNCOM,NOCORE!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN + C CORE,CORE,NOCORE!NORUN!CMWRQ!INCORE!NOACT!NOTRAN + C GET,GET,NOCRLF!NOPER!TTYRNC!NOCORE!NOACT!NORUN!NOTRAN + C SAVE,SAVE,NOCRLF!NOPER!TTYRNC!INCORE!NOACT!NORUN!PLSXPN +IFN FT2REL,< + C SSAVE,SSAVE,NOCRLF!NOPER!TTYRNC!INCORE!NOACT!NORUN!PLSXPN +> + C CONTINUE,CONT,NOPER!TTYRNU!INCORE!NORUN +IFN FTEXAMINE,< + C D,DCOM,CMWRQ!INCORE + C E,ECOM,NOCRLF!CMWRQ!INCORE +> + C PJOB,PJOB,NOCORE + C ASSIGN,ASSIGN,NOCORE + C DEASSI,DEASSIGN,NOCORE!NOJOBN!NOINCK + C DDT,DDTGO,NOPER!TTYRNU!INCORE!NORUN!PLSXPN +IFN FTFINISH,< + C FINISH,CFINI,TTYRNC!NOACT!INCORE!NORUN +> + C REENTER,REENTER,TTYRNU!NOPER!INCORE!NORUN!PLSXPN + C CSTART,STARTC,TTYRNC!INCORE!NOACT!NORUN!PLSXPN + C CCONTINUE,CONTC,TTYRNC!INCORE!NORUN +IFN FTATTACH,< + C DETACH,DETACH,NOPER+NOCRLF+NOCORE!NOJOBN!NOINCK + C ATTACH,ATTACH,NOCORE!NOJOBN!NOLOGIN!NOINCK +> + C DAYTIME,DAYTIM,NOCORE!NOJOBN!NOLOGIN!NOINCK +IFN FTTIME,< + C TIME,RUNTIM,NOCORE!NOLOGIN!NOINCK +> + C RESOURCES,FREDEV,NOCORE!NOJOBN!NOLOGIN!NOINCK +IFN FTLOGIN,< + C SCHEDULE,SKEDUL,NOCORE!NOJOBN!NOLOGIN!NOINCK +> +IFN FTTALK,< + C TALK,TALK,NOCRLF+NOPER+NOCORE!NOJOBN!NOLOGIN!NOMESS!NOINCK +> +IFN FTLOGIN,< + C LOGIN,CLOGIN,NOCORE!NOLOGIN!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN +> +IFE FTLOGIN,< + C LOGIN,CPOPJ,NOCORE!NOACT!NORUN!NOTRAN +> +IFN FTREASSIGN,< + C REASSI,REASS,NOCORE!NOACT!INCORE!CMWRQ!NORUN +> + C HELP,HELP,NOCORE!NOLOGIN!NOPER!TTYRNU!NOCRLF!NOACT!NORUN!NOTRAN + C SYSTAT,SYSTAT,NOCORE!NOLOGIN!NOACT!NORUN!NOCRLF!NOPER!TTYRNU!NOTRAN +IFN FTCCL,< + C COMPILE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN + C CREATE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN + C CREF,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN + C DEBUG,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN + C DELETE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN + C DIRECT,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN + C EDIT,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN + C EXECUTE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN + C LIST,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN + C LOAD,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN + C MAKE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN + C RENAME,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN + C TECO,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN + C TYPE,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN + C CTEST,CCLRUN,NOCORE!NOPER!TTYRNU!NOCRLF!INCORE!NOACT!NORUN +> +> + +;GENERATE TABLE OF SIXBIT COMMAND NAMES + +DEFINE C(A,B,D) < + +> +COMTAB: NAMES +DISPL=.-COMTAB ;LENGTH OF TABLE + +;GENERATE THE DISPATCH TABLE PLUS SPECIAL BITS + +DEFINE C(A,B,D) < +Z B (D) +> +DISP: NAMES + +;CALLED FROM COMMAND DECODER WHICH IS CALLED FROM CLOCK ROUTINE +;WITH FOLLOWING AC'S SET: +;TAC= BYTE POINTER TO COMMAND STRING(SPACE OR CR AFTER COMMAND NAME) +;ITEM = JOB NUMBER +;DAT = BYTE POINTER TO LAST OUTPUT CHARACTER +;DEVDAT = ADDRESS OF DEVICE DATA BLOCK INITIATING COMMAND +;JDAT = ADDRESS OF JOB DATA AREA, = 0 IF NO JOB AREA +;PROG=XWD PROTECTION,RELOCATION; 0 IF NO CORE +;IOS=0 + +;UPON RETURN FROM COMMAND SETUP ROUTINE, A CR-LF IS ADDED IF +;NEEDED AND TTY IS STARTED + +;SINCE THE COMMAND DECODER IS CALLED FROM THE CLOCK ROUTINE +;COMMAND SETUP ROUTINES MUST RUN TO COMPLETION QUICKLY +;IF A COMMAND FUNCTION CANNOT DO THIS, IT MUST JUST SET +;THE JOB TO A RUNABLE STATUS AND RETURN IMMEDIATELY + + EXTERN TTYFNU + +COR0: JUMPE PROG,CPOPJ ;RETURN IF JOB DOES NOT HAVE CORE + + JSP TAC1,MONJOB ;SET TO RUN MONITOR JOB(PC IN EXEC MODE) + ; RETURN HERE AT UUO LEVEL(NO ACS SET UP) + MOVEI TAC1,ESTOP ;PUT ERROR STOP ON END OF PDL + JSP TAC,MONSTR ;START MONITOR JOB BY SETTING UP ACS AND +JOB1: PUSHJ PDP,RESET ;RELEASE ALL IO DEVICES ASSIGNED TO THIS JOB + PUSHJ PDP,TTYFNU ;FIND TTY FOR THIS JOB(SETUP ITEM WITH JOB NO.) +IFN FTSWAP,< + EXTERN ZERSWP,NOCORQ + PUSHJ PDP,NOCORQ ;PUT JOB IN NO CORE Q + PUSHJ PDP,ZERSWP ;CLEAR SWAP SPACE (IF ANY) FOR LOW SEG + ; AND CLEAR SWP,SHF,IMGIN,IMGOUT FOR LOW SEG +> +IFN FT2REL,< + EXTERN KILHGH + PUSHJ PDP,KILHGH ;HIGH SEG FOR THIS USER. RETURN CORE + ; REMOVE HIGH SEG FROM THIS USER LOGICAL ADDRESSING SPACE + ; IF NO OTHER USERS IN CORE ARE USING IT + ; RETURN DISKL SPACE IF NO LONGER SHARABLE HIGH SEG +> + MOVEI TAC,0 ;RETURN BOTH PHYSICAL AND LOGICAL CORE + SOS (PDP) ;NEGATE SKIP RETURN WHICH CORE1 WILL DO + JRST CORE1 ;GO DO IT AND RETURN TO CALLER + +; "PJOB" PRINT JOB NUMBER OF JOB TTY IS ATTACHED TO + +INTERNAL PJOB,DECLF + +PJOB: MOVE TAC,ITEM ;JOB NO. +DECLF: PUSHJ PDP,RADX10 ;PRINT TAC AS DEC. THEN CRLF + JRST CRLF + +; "KJOB" KILL ATTACHED JOB + +EXTERNAL JBTSTS,TTYKILM,CPOPJ +INTERNAL FTTIME,JOBKL + +KJOB: JUMPE ITEM,JOBKB ;WAS JOB INITIALIZED? +IFN FTLOGIN,< + TLZN T,JLOG+JACCT ;TEST JACCT ALSO IN CASE COMMAND WAS DELAYED + JRST KJOB2 ;IF JOB NOT LOGGED IN + TLO T,JACCT ;DISABLE ^C + MOVEM T,JBTSTS(ITEM) +IFN FTSWAP, < + PUSHJ PDP,ALOGN1 ;ATTACH TTY +> + MOVSI TAC,TTYRNU+NOMESS + XORM TAC,-1(PDP) ;SET TTYRNU AND CLEAR NOMESS FOR COMRET + MOVE TAC,[SIXBIT /LOGOUT/] ;NAME OF CUSP + JRST ARCOM +> +KJOB2: +IFE FTSWAP+FTLOGIN,< + JUMPE PROG,JOBKA ;YES. DOES JOB HAVE CORE IN MEMORY? +> + PUSHJ PDP,GETMIN ;GET MINIMAL JOB AREA ON DISK OR CORE + JUMPE PROG,DLYCM1 ;DELAY COMMAND IF CORE ASSIGNED ON DISK + JSP TAC1,MONJOB ;YES, SCHEDULE MONITOR JOB(PC IN EXEC MODE) + ;RETURN HERE AT UUO LEVEL WHEN SCHEDULED +JOBKL: MOVEI TAC1,ESTOP ;PUT ESTOP ON END OF PDL + JSP TAC,MONSTR ;GO SETUP ACS AND PD LIST + PUSHJ PDP,JOB1 ;FLUSH CORE AFTER RELEASING DEVICES +JOBKA: +IFN FTTIME,< +IFE FTLOGIN, < + PUSHJ PDP,PRTTIM ;PRINT JUST TOTAL RUN TIME + PUSHJ PDP,TTYSTR ;START TTY +>> + PUSHJ PDP,DEASTY ;DEASSIGN ALL BY TTY + PUSHJ PDP,TTYKIL ;RETURN TTY TO VIRGIN STATE + JRST KSTOP ;CLEAR JOB STATUS WORD AND STOP JOB + +;ERROR IN COMMAND + +CERR: JRST ERRMES + +JOBKB: SETZM -1(PDP) ;CLEAR NOJOBN SO COMRET WILL PRINT ERROR MSG. + JRST ATT4 ;"NOT A JOB" + +; "START L" OR "START" - START AT LOC, L OR STARTING ADDRESS +INTERNAL FT2REL +EXTERNAL JOBSA + +START: ;SAME AS CSTART, DIFF BY COMTAB BITS + ; WHICH PUT TTY IN MONITOR OR USER MODE + +; "CSTART L" OR "CSTART" - START AT LOC. L(TTY IN COMMAND MODE) + +STARTC: PUSHJ PDP,OCTIN ;CONVERT POSSIBLE OCTAL NO ARG. +IFE FT2REL,< + SKIPA TAC1,JOBSA(JDAT) ;NO START ADR. SPECIFIED RETURN +> +IFN FT2REL,< + JRST SNOARG ;NO ARG SPECIFIED RETURN +> + JRST COMERA ;ILLEGAL CHARACTER +IFN FT2REL,< + EXTERN CHKMED + PUSHJ PDP,CHKMED ;CHECK TO SEE IF HIGH SEG WHICH IS SHARABLE + ; IF YES, TURN ON USER MODE WRITE PROTECT + ; FOR THIS USER, AND SET MEDDLE BIT SO HE CANNOT + ; TURN UWP OFF.> + JRST CHKSTR ;START JOB WITH PC IN USER MODE, + ; IF START ADR IS NON-ZERO +IFN FT2REL,< +SNOARG: SKIPA TAC1,JOBSA(JDAT) ;NO. ARG SPECIFIED, USE START ADR SUPPLIED + ; BY PROGRAM END STATEMENT AND STORED BY LINKING LOADER + ; SKIP INTO REENTER, START WITH PC IN USER MODE +> + +;"REENTER" - REENTER USER PROGRAM + +EXTERNAL JOBREN + +REENTER:MOVE TAC1,JOBREN(JDAT) ;GET REENTER ADDRESS FORM JOB DATA AREA + JRST CHKSTR ;START JOB WITH PC IN USER MODE + ; IF START ADR IS NON-ZERO + +; "DDT" - START EXECUTION AT DDT IN USER AREA + + EXTERN JOBDDT + +DDTGO: MOVE TAC1,JOBDDT(JDAT) ;DDT STARTING ADR. IN JOB DATA AREA + ; FALL INTO CHSTR + +;ROUTINE TO CHECK TO SEE IF STARTING ADDRESS IS NON-ZERO, AND START USER IF OK + +CHKSTR: JUMPN TAC1,USTART ;IS IT NON-ZERO?, IS YES + ; STORE OLD PC IN JOBOPC IN JOB DATA AREA + ; THEN START WITH PC IN USER MODE + JSP TAC,ERRMES ;NO, PRINT "NO START ADR" + ASCII /NO START ADR +/ + +; "STOP" OR "C" +;SCANNER ROUTINES DUMMY UP STOP WHEN CONTROL C TYPED IN +;STOP MUST BE DELAYED IF THIS JOB IS SYSTEM TAPE USER +;AND SYSTEM TAPE IS ACTIVE, OTHERWISE, THE JOB WILL NOT BE +;STOPPED WHEN DONE USING THE SYSTEM TAPE. + +INTERNAL FTDISK +EXTERNAL STUSER,JOB,PJBSTS,IOWQ,JOBDAC + +STOP: JUMPE ITEM,STOP8 + CAMN ITEM,STUSER ;IS THIS SYSTEM TAPE USER? + JRST CFINS ;YES, DO FINISH SYS COMMAND +IFN FTDISK,< + + PUSHJ PDP,STOPCK ;CAN THE JOB STOP? + JRST DLYCM1 ;NO. DELAY IT. +> + PUSHJ PDP,STOP1 ;STOP JOB +STOP8: IFE FTTTYSER,< + JSP TAC,CONMES ;PRINT "^C CRLF CRFL PERIOS" + ASCIZ /^C +/ +> +IFN FTTTYSER,< POPJ PDP,0> + +; "CONTC" - CONTINUE EXECUTION(TTY REMAINS IN COMMAND MODE) + +CONTC: ;SAME AS CONT + +; "CONT" - CONTINUE EXECUTION FROM WHERE LEFT OFF +EXTERNAL JBTSTS + +CONT: MOVSI TAC1,JERR + TDNN TAC1, JBTSTS(ITEM) ;IS JOB ERROR BIT SET? + POPJ PDP, ;COMMAND DECODER WILL DO REST + JSP TAC,ERRMES ;YES, PRINT CANT CONTINUE + + ASCIZ /CAN'T CONTINUE +/ + +; "CORE #" - ASSIGNS #*1024 WORDS OF CORE TO JOB +; "CORE" WITH NO ARG. WILL PRINT NO OF FREE BLOCKS LEFT +; WITHOUT AFFECTING CURRENT ASSIGNMENT OF CORE +; JOB NOT IN MIDDLE OF SWAPPING +; EITHER ON DISK OR CORE OR NEITHER PLACE + +EXTERNAL PCORSZ + +CORE: PUSHJ PDP, DECIN ;GET NO. OF 1K BLOCKS + JRST COR3 ;NO ARG. SPECIFIED, JUST TYPE FREE BLOCK LEFT + JRST COMERA ;ILLEGAL DECIMAL CHARACTER RETURN +IFE FTSWAP,< + JUMPE TAC1,COR0 ;RELEASE DEVICES IF USER ASKING FOR 0 CORE +> +IFN FTSWAP,< + JUMPE TAC1,COR1 ;ASSIGN JUST MINIMAL CORE AND RELEASE DEVICES + ; IF ASKING FOR 0 CORE +> + LSH TAC1,12 ;CONVERT 1K BLOCKS TO WORDS + + MOVEI TAC,-1(TAC1) ;HIGHEST RELATIVE ADDRESS=LENGTH-1 OF LOW SEG + PUSHJ PDP,CORE0 ;TRY TO ASSIGN CORE + JRST COR2 ;CORE NOT AVAILABLE. GO PRINT MESSAGE + POPJ PDP, ;OK RETURN, CORE ASSIGNED ON DISK OF MEMORY +IFN FTSWAP,< +;USER ASKING FOR 0K +COR1: JUMPN PROG,COR0 ;GO RELEASE ALL DEVICES IF HE HAS CORE IN MEMORY YET + PUSHJ PDP,GETMIN ;NO, CORE ON DISK OR HAS NONE, ASSIGN MINIMAL + ; AREA(FLUSH HIGH SEG TOO) IN CORE OR DISK + JRST DLYCM ;AND DELAY COMMAND TILL CORE IS IN MEMORY + ; DLYCM WILL SWAP IT IN. +> + +COR2: IFN FTTTYSERM,< + MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB ADR +> + PUSHJ PDP,INLMES ;PRINT ? FOR PATCH + ASCIZ /? +/ +COR3: PUSHJ PDP,PRTSEG ;PRINT SIZE OF LOW SEG +IFN FT2REL,< + EXTERN PRTHGH + PUSHJ PDP,PRTHGH ;PRINT SIZE OF HIGH SEG (+0 IF NONE) + ; NOTHING IF NOT 2 REG. MACHINE OR SOFTWARE +> + PUSHJ PDP,INLMES + ASCIZ "/" + +IFE FTSWAP,< + EXTERN CORTAL + MOVE TAC,CORTAL ;NO. OF FREE 1K BLOCKS +> +IFN FTSWAP,< + EXTERNAL CORMAX + MOVE TAC,CORMAX ;PRINT MAX. NO. OF BLOCKS IN PHYSICAL CORE + LSH TAC,-12 ;AVAILABLE TO A SINGLE USER(AS SET + ; BY BUILD AND/OR ONCE) +> + PUSHJ PDP,RADX10 ;PRINT NO. OF 1K BLOCKS AVAILABLE +IFE FTSWAP,< + JSP TAC,CONMAS + ASCIZ /K CORE +/ +> +IFN FTSWAP,< + EXTERN VIRTAL + PUSHJ PDP,INLMES + ASCIZ /K CORE +VIR. CORE LEFT =/ + MOVE TAC,VIRTAL ;PRINT AMOUNT OF FREE SWAP SAPCE LEFT + JRST RADX10 ;IN DECIMAL +> + +; "SSAVE FILENAM.EXT [PROJ,PROG] CORE" +;WORKS LIKE SAVE, EXCEPT THAT HIGH SEG IS SAVED AS SHARABLE(EXT=SHR) +;INSTEAD OF NON-SHARABLE(EXT=HGH) + +; "SAVE FILE-NAME[PROJ.,PROG.] CORE" - SAVES JOB AREA ON RETRIEVABLE DEVICE +;ONLY A SAVE OR A GET IN PROGRESS FOR EACH JOB +;NO ATTEMPT IS MADE TO SAVE DEVICE ASSGINMENTS, AC'S OR PC + +SAVE:IFN FT2REL,< + TLO IOS,NSRBIT ;SET FLAGE FOR NON-SHARABLE EXT(HGH) +> +SSAVE: HRRI IOS,SAVJOB ;SETUP TO RUN SAVEJOB (IOS CLEARED BEFORE + PUSHJ PDP,CTEXT1 ;DISPATCH + SETZM JBTPRG(ITEM) ;CLEAR JOB'S PROGRAM NAME FOR ROOM + JRST SGSET + +; "GET DEVICE:FILE-NAME[PROJ.,PROG.] CORE" - SETS UP JOB AREA FROM RETREIVABLE + +;DEVICE AND ASSIGNS CORE. + +GET: MOVEI IOS,GETJOB ;SETUP TO RUN GETJOB + PUSHJ PDP,CTEXT1 ;GET DEVICE NAME + SETZM JBTPRG(ITEM) ;CLEAR NAME FOR RCOM + JRST RUNCM + ; JOB DATA AREA FOR MONITOR JOB + +IFN FTLOGIN,< ;AUTOMATIC LOGIN AFTER DSK REFESH OR WHEN REFLAG SET + +EXTERNAL REFLAG + +LOGREF: MOVEM TAC,PRJPRG(ITEM) ;PRJ,PRG NRS. IN REFLAG + MOVSI TAC,JLOG + IORM TAC,JBTSTS(ITEM) + SETZM -1(PDP) ;CLEAR ALL FLAGS FOR COMRET + SETZM REFLAG ;ONLY ONCE + POPJ PDP, +> + +;"HELP" -HELP COMMAND + +INTERNAL FTLOGIN + +IFN FTLOGIN,< EXTERNAL HELPPP +HELP1: + MOVE TAC,HELPPP + TLN T,JLOG + JRST ALOGIN + POPJ PDP, +> + +HELP: IFN FTLOGIN,< + PUSHJ PDP,HELP1 +> + MOVE TAC,[SIXBIT /HELP/] ;CUSP NAME + JRST ARCOM ;RUN IT + +SYSTAT: IFN FTLOGIN,< + PUSHJ PDP,HELP1 +> + MOVE TAC,[SIXBIT /SYSTAT/] ;CUSP NAME + JRST ARCOM ;RUN IT + +EXTERNAL JBTSTS,TTYATT + +ALOGIN: +INTERNAL FTLOGIN +IFN FTLOGIN,< EXTERNAL PRJPRG + MOVEM TAC,PRJPRG(ITEM) + MOVSI TAC,JLOG + ANDCAM TAC,JBTSTS(ITEM) +> +IFN FTSWAP, + POPJ PDP, + +INTERN FTCCL + +IFN FTCCL,< + +CCLRUN: MOVE TAC,[SIXBIT /COMPIL/] ;CUSP NAME + JRST ARCOM ;RUN IT +> +;"LOGIN" - LOGIN COMMAND + +INTERNAL FTLOGIN +IFN FTLOGIN,< + +EXTERNAL SYSPP + +LOGDET: JSP TAC,ERRMES + ASCIZ /PLEASE KJOB OR DETACH +/ +CLOGIN: TLNE T,JLOG ;FORCE USER TO LOGOUT BEFORE + JRST LOGDET ; LOGGING IN ANEW. +IFN FTSWAP,< + EXTERN VIRTAL,LOGSIZ + MOVE TAC,VIRTAL ;AMOUNT OF FREE VIRTUAL CORE LEFT + CAIL TAC,LOGSIZ ;IS THERE AT LEAST 2K FOR LOGIN? + ; CUSTOMER CAN REDEFINE TO BE BIGGER THAN 2 + ; WITH MONGEN DIALOG + JRST CLOG2 ;YES, + MOVEI ITEM,0 ;NO, SET JOB NUMBER TO 0 FOR COMMAND DECODER + JRST COR2 ;AND GO TELL USER AMOUNT OF CORE LEFT +> +CLOG2: SKIPE TAC,REFLAG ;REFLAG SET NON-ZERO FOR AUTOMATIC LOGIN? + JRST LOGREF ;YES, LOG USER IN WITHOUT RUNNING CUSP + ; SO HE CAN RELOAD THE DISK AFTER REFRESH + MOVE TAC,SYSPP ;SET PRJPRG TO SYSPP + PUSHJ PDP,ALOGIN ;AUTOMATIC LOGIN + MOVSI TAC,JACCT ;FLAG LOGIN OR LOGOUT RUNNING AND + IORM TAC,JBTSTS(ITEM);DISABLE ^C, + MOVE TAC,[SIXBIT /LOGIN/] ;CUSP NAME + JRST ARCOM ;RUN IT +> + +; "R CUSTNAME CORE" - DOES "RUN SYS:CUSPNAME" + +RCOM: MOVEI TAC,0 ;NO FILE NAME, TTY WILL SUPPLY IT + JRST ARCOM1 + +ARCOM: IFN FTTTYSER,< PUSHJ PDP,SKPBRK> +ARCOM1: MOVEM TAC,JBTPRG(ITEM) ;STORE FILE NAME + MOVSI TAC1,(SIXBIT /SYS/) ;READ FROM SYS DEVICE + JRST RUNCO2 +; "RUN DEVICE:FILE[PROJ.PROG.] (CORE)" +;DOES A CORE,GET,START ALL IN ONE +;IF CORE ARG IS MISSING. SIZEIN DIRECTORY IS USED +;JOB ON DISK OR IN CORE OR NO CORE, BUT NOT IN MIDDLE OF SWAP + +EXTERNAL JOBDA + +RUNCOM: PUSHJ PDP,CTEXT1 ;GET DEVICE NAME FROM COMMAND STRING + SETZM JBTPRG(ITEM) ;CLEAR FILE NAME +RUNCO2:RUNC1: MOVEI IOS,RUNJOB +RUNCM: PUSHJ PDP,GETMIN ;GET MININAL JOB AREA IN CORE OR DISK + JUMPN PROG,SGSET ;WAS CORE ASSIGNED IN MEMORY? IF YES, GO SCANARGS +IFE FTSWAP,< + JRST COR2 ;NO. PRINT "0K CORE LEFT" +> +IFN FTSWAP,< + JRST DLYCM ;NO. DELAY COMMAND UNTIL IN CORE +> + +; "ASSIGN DEV:NAME" - ASSIGN DEVICE TO JOB AND GIVE IT LOGICAL NAME + +EXTERNAL DEVLST,PJOBN,SYSTAP + +ASSIGN: PUSHJ PDP, CTEXT1 ;GET FIRST ARGUMENT + JUMPE TAC1, NOTENF ;NO ARGUEMNT TYPED IF 0 +IFN FTLOGIN, + MOVE T1, TAC1 ;SAVE DEVICE NAME +IFN FTTTYSER,< + PUSH PDP,DEVDAT ;SAVE TTY +> +IFE FTTTYSER,< + + PUSH PDP, TAC ;SAVE INPUT BYTE POINT +> + MOVE TAC,TAC1 + PUSHJ PDP,DEVPHY + JRST ASSG3 + MOVEI TAC1,ASSCON + JRST ASSG4 +ASSG3: MOVEI TAC1,ASSCON ;SETUP ASSIGNED BY CONSOLE BIT + HLRZ DEVDAT, DEVLST +ASSG0: MOVE TAC,DEVNAM(DEVDAT) + CAME T1,DEVNAM(DEVDAT) ;DOES PHYSICAL NAME MATCH? + JRST ASSG1 ;NO +ASSG4: CAMN T1,[SIXBIT /DSK/] ;IS THIS A DISC?(IF YES, + JRST ASSG5 ;BYPASS CHECK FOR SYSTEM TAPE AND ASSIGN BELOW + CAMN TAC,SYSTAP ;IS NEXT DEVICE IN LIST THE SYSTEM TAPE? + JRST ASSFIN ;YES, DO NOT ASSIGN. CLEAR DIRECTORY IN CORE BIT +ASSG5: PUSHJ PDP,ASSASG ;NO, TRY TO ASSGIN DEVICE + JRST ASSER1 ;ALREADY ASSIGNED TO ANOTHER JOB + JRST ASSFIN ;ASSIGNED + +;SYSTEM TAPE OR NOT MATCH OF ARG AND PHYSICAL NAME. + +ASSG1: CAMN TAC,SYSTAP ;IS THIS SYSTEM TAPE? + JRST ASSG2 ;YES + LDB T, PJOBN ;SAVE OLD JOB NUMBER FOR THIS DEVICE + TRZ TAC,-1 ;COMAPRE LEFT HALF ONLY + CAMN TAC, T1 + PUSHJ PDP, ASSASG ;MATCH. TRY TO ASSIGN IT + JRST ASSG2 ;KEEP LOOKING + JUMPE T,ASSFIN ;IF OLD JOB NUMBER 0, DEVICE PREVIOSLY UNASSIGNED + +ASSG2: HLRZ DEVDAT, DEVSER(DEVDAT) + JUMPN DEVDAT, ASSG0 +IFN FTTTYSER,< + POP PDP,DEVDAT ;RESTORE TTY DDB +> +IFE FTTTYSER,< + POP PDP, TAC +> + JRST NOTDEV ;PRINT NO SUCH DEVICE + +IFN FTLOGIN, + +;ALREADY ASSIGNED TO ANOTHER JOB +ASSER1: +IFE FTTTYSER,< + PDP PDP, TAC + MOVEI TAC, ASSMS2 + PUSHJ PDP,ERRMES + LDB TAC, PJOBN + JRST DECLF ;PRINT JOB NUMBER CRLF +> +IFN FTTTYSER,< + LDB TAC,PJOBN ;GET JOB NUMBER FOR DEVICE + POP PDP,DEVDAT ;GET DDB FOR TTY + PUSH PDP,TAC ;SAVE JOB NO. + MOVEI TAC,ASSMS2 ;TYPE ERROR MESSAGE + PUSHJ PDP,ERRMES + POP PDP,TAC ;GET JOB NO. BACK + JRST DECLF ;AND TYPE IT +> + +ASSMS2: ASCIZ /ALREADY ASSIGNED TO JOB / + +;DEVICE ASSIGNED, GIVE IT A LOGICAL NAME +ASSFIN: SETZM DEVLOG(DEVDAT) ;CLEAR LOGICAL NAME +IFE FTTTYSER,< + POP PDP,TAC ;RESTORE INPUT BYTE POINTER + PUSH PDP,DEVDAT ;SAVE DDB ADDRESS +> +IFN FTTTYSER,< + EXCH DEVDAT,0(PDP) ;GET TTYDDB, SAVE DEVICE DDB +> + PUSHJ PDP,CTEXT1 ;GET SECOND ARG, LOGICAL DEVICE NAME + SKIPE TAC,TAC1 ;IS THERE A LOGICAL NAME SPECIFIED? + PUSHJ PDP, DEVLG ;YES, SEE IF IT IS ALREADY IN USE + ; BY THIS USER + JRST ASSG1 ;NO + MOVEI TAC,LOGERR ;YES, PRINT ERROR + MOVE DEVDAT,-3(PDP) ;RESTORE TTY DDB + PUSHJ PDP,ERRMES + MOVEI TAC,0 ;CLEAR LOGICAL NAME FOR THIS DEVICE +ASSF1: POP PDP,DEVDAT + MOVEM TAC,DEVLOG(DEVDAT);STORE IN DEVICE DATA BLOCK + MOVSI TAC1,DVDIRIN ;CLEAR DIRECTORY IN CORE BIT + ANDCAB TAC1,DEVMOD(DEVDAT) ;SETUP TAC1 WITH DEVICE CHARACTERISTICS FOR ASGHGH +IFN FT2REL,< + EXTERN ASGHGH + PUSHJ PDP,ASGHGH ;GO CHECK IF THIS DEVICE HAS INITIALIZED ANY SHARED SEGMENTS + ; IF YES, CLEAR SEG NAMES SO NO NEW SHARING (DTA,MTA ONLY) +> + MOVE TAC1,DEVNAM(DEVDAT) ;PHYSICAL NAME + MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB + PUSHJ PDP,PRNAME ;PRINT IT + JSP TAC,CONMES + + ASCIZ / ASSIGNED +/ + +LOGERR: ASCIZ /LOGICAL NAME ALREADY IN USE. / + +;"DEASSIGN DEV" - DEASSIGNS DEVICE FROM CONSOLE + +INTERNAL NOTDEV + +DEASSI: JUMPE ITEM,CPOPJ ;NO-OP IF NO JOB NUMBER + PUSHJ PDP,CTEXT1 ;GET DEVICE NAME + JUMPE TAC1,DEASTY ;NO ARG. IF 0, DEASSIGN ALL BY TTY + MOVE TAC, TAC1 ;DEVICE NAME + PUSHJ PDP, DEVSRC ;SEARCH FOR DEVICE + JRST DEAER1 ;NOT FOUND + PUSHJ PDP, DEASG ;FOUND, DEASSIGN IT + JRST DEAER2 ;NOT PREVIOUSLY ASSIGNED + POPJ PDP, ;DEVICE DEASSIGNED + +NOTDEV: +DEAER1: MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB + JSP TAC,ERRMES ;PRINT NO SUCH DEVICE + + ASCIZ /NO SUCH DEVICE +/ + +DEAER2: MOVE TAC1,DEVNAM(DEVDAT) ;PRINT PHYSICAL DEVICE NAME + MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB + PUSHJ PDP,PRNAME + JSP TAC,ERRMES + + ASCIZ / WASN'T ASSIGNED +/ + +INTERNAL FTREASSIGN +IFE FTREASSIGN,< +REASSI=UUOERR +> + +IFN FTREASSIGN,< + +;REASSIGN UUO +;CALL MOVE AC,JOB NUMBER +; MOVE AC+1,SIXBIT /DEVICE/ +; CALL AC,[SIXBIT /REASSIGN/] +;IF C(AC)=0, JOB HAS NOT BEEN INITIALIZED +;IF C(AC+1)=0, DEVICE NOT ASSIGNED TO THIS JOB OR DEVICE IS A TTY + +INTERNAL REASSIGN +EXTERNAL PUUOAC,JOB + +REASSI: LDB UUO,PUUOAC + HRLI UUO,PROG + PUSH PDP,@UUO ;STACK JOB NUMBER TO BE REASSIGNED TO + AOS UUO + MOVE TAC1,@UUO ;DEVICE NAME + MOVE ITEM,JOB ;THIS JOB NUMBER + SOJA UUO,REASS1 + +;"REASSIGN DEV:JOB" - REASSIGN DEVICE "DEV" TO JOB "JOB" + +REASS: + PUSHJ PDP,CTEXT ;GET DEVICE NAME + JUMPE TAC,NOTENF ;NULL NAME? + MOVE UUO,TAC1 ;SAVE IT IN UUO + PUSHJ PDP,DECIN1 ;GET NEW JOB NUMBER + JRST NOTENF ;NONE SPECIFIED, DOESN'T RETURN IF ERROR + JRST COMERA ;ILLEGAL CHARACTER + PUSH PDP,TAC1 ;PUT JOB NUMBER ON STACK, DEVICE + MOVE TAC1,UUO ;NAME IN TAC1 + SETZM UUO ;SET COMMAND SWITCH + +;ROUTINE COMMON TO REASSIGN UUO AND COMMAND + +EXTERNAL JBTSTS,PJOBN,JOBFDV + +REASS1: EXCH ITEM,(PDP) ;NEW JOB NO. IN ITEM + CAILE ITEM,JOBN ;IS JOB NUMBER OUT OF RANGE + JRST REASE2 ;YES, DO NOT REASSIGN + MOVE TAC,JBTSTS(ITEM) ;NEW JOB STATUS + EXCH ITEM,(PDP) ;RESTORE ITEM AND STACK + TLNN TAC,JNA ;DOES NEW JOB EXIST? + JRST REASE1 ;NO. + MOVE TAC,TAC1 + PUSHJ PDP,DEVSRC ;SEARCH FOR DEV + JRST REASE2 ;NOT FOUND + LDB TAC,PJOBN + CAME TAC,ITEM ;ASSIGNED TO THIS JOB + JRST REASE3 ;NO + MOVE TAC,DEVMOD(DEVDAT) + + TLNE TAC,DVTTY ;IS IT A TTY? + JRST REASE6 ;YES. CAN'T BE REASSIGNED + TRNN TAC,ASSPRG ;IS DEVICE INITED? + JRST REASS3 ;NO. + JUMPN UUO,REASS4 ;YES. COMMAND LEVEL? + HRL DEVDAT,(PDP) ;YES. SCHEDULE RELEASE + MOVEM DEVDAT,JOBFDV(JDAT) + POP PDP,TAC1 + MOVE DEVDAT,-2(PDP) + MOVSI TAC1,TTYRNC ;SET TTYRNC SO JOB WILL RUN + IORM TAC1,-1(PDP) + JSP TAC1,MSTART + JSP TAC,MONSTR + HLRZ TAC,JOBFDV(JDAT) + PUSH PDP,TAC + HRRZ DEVDAT,JOBFDV(JDAT) + MOVE ITEM,JOB + SETOM UUO ;SET FLAG TO STOP JOB +REASS4: HRRZ DSER,DEVSER(DEVDAT) + HRRZM DEVDAT,JOBFDV(JDAT) + MOVE UCHN,USRHCU + +REASS2: MOVE DEVDAT,USRJDA(UCHN) ;GET XWD UUO BITS,DDB ADDRESS + HRRZ TAC,JOBFDV(JDAT) ;GET ADDR. OF DDB SAVED BY COMMAND + PUSH PDP,UCHN ;SAVE USER CHANNEL + CAIN TAC,(DEVDAT) ;IS CHOSEN DEVICE ON THHS CHANNEL? + PUSHJ PDP,RELEA5 ;YES, RELEASE DEVICE + POP PDP,UCHN + SOJGE UCHN,REASS2 + MOVE DEVDAT,JOBFDV(JDAT) + MOVE ITEM,JOB ;CURRENT JOB NUMBER +REASS3: MOVEI TAC,ASSCON ;ASSIGN IT BY CONSOLE + IORM TAC,DEVMOD(DEVDAT) + EXCH ITEM,(PDP) + DPB ITEM,PJOBN ;PUT IN NEW JOB NUMBER + POP PDP,ITEM + JUMPL UUO,ESTOP + POPJ PDP, + +REASE1: POP PDP,TAC + JUMPE UUO,ATT4 ;JOB NEVER WAS INITIATED +REASE4: SETZM @UUO ;CLEAR C(AC) + POPJ PDP, + +REASE2: MOVEI TAC,NOTDEV ;NO SUCH DEVICE +REASE5: POP PDP,TAC1 + JUMPE UUO,(TAC) + AOJA UUO,REASE4 + +REASE3: MOVEI TAC,DEAER2 ;WASN'T ASSIGNED + JRST REASE5 + +REASE6: MOVEI TAC,REASE7 + JRST REASE5 +REASE7: MOVE TAC1,DEVNAM(DEVDAT) + MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB + PUSHJ PDP,PRNAME + JSP TAC,ERRMES + ASCIZ / CAN'T BE REASSIGNED +/ +> + +INTERNAL FTATTACH +IFN FTATTACH,< + +;"ATTACH DEVNAME" -ATTACHES A PREVIOUSLY PARTITIONED DEVICE +; NOTE-MUST BE LOGGED IN UNDER [1,1] TO DO THIS +; "ATTACH N [PROJ.,PROG.]" - ATTACH CONSOLE TO JOB N +;CHANGES ADDRESS OF TTY DEVICE DATA BLOCK STORED IN -2(PDP) +;BY THE COMMAND DECODER + +INTERNAL ATTACH +EXTERNAL TTYATT,JOBN,TTYFND + +ATTACH: IFE FTTTYSER,< + MOVE AC2,TAC ;SAVE BYTE POINTER> + PUSHJ PDP,DECIN ;GET JOB NO. + JRST NOTENF ;NOT A NUMBER OR NONE SPECIFIEED +IFN FTLOGIN, < + JRST DEVATT ;WANTS TO ATTACH A DEVICE +> + +IFE FTLOGIN, < + JRST ATT1 +> + SKIPE TAC1 ;0 IS ILLEGAL + CAIL TAC1, JOBN ;IS JOB NUMBER TOO BIG? + JRST ATT1 ;ILLEGAL JOB NUMBER + MOVSI T1,JNA ;HAS THIS JOB NO BEEN ASSIGNED? + TDNN T1,JBTSTS(TAC1) + JRST ATT4 ;NO, PRINT ERROR +INTERNAL FTLOGIN +IFN FTLOGIN,< + MOVE IOS,TAC1 ;SAVE JOB NO. + PUSHJ PDP,PJPGNO ;GET PROJ,-PROG. NOS. ARG(IF ERROR, PDP SUP LEVEL + ; OFF 1, PRINT ERROR, AND DO NOT RETRY HERE + + MOVEM IOS,TAC1 ;RESTORE + SKIPN AC2 ;DID USER TYPE IN A PROG,PROG # IN []'S? + MOVE AC2,PRJPRG(ITEM) ;NO. ASSUME PROJ,PROG NUMBER FOR CURRENT JOB + ; SO USER CAN AVOID TYPEING PROGPROG NO. IF DOING + ; FROM 1 JOB TO ANOTHER UNDER SAME PROJ,PROG + CAME AC2,PRJPRG(TAC1) ;IS THIS THE SAME PERSON WHO DETACHED FROM THIS JOB NUMBER? + JRST ATT3 ;NO-ERROR + ; YES +> + MOVE ITEM,TAC1 ;JOB NUMBER TO ITEM + PUSHJ PDP,TTYATT ;NO, ATTACH TTY + JRST ATT2 ;ERROR CAN'T ATTACH + MOVEM DEVDAT,-2(PDP) ;CHANGE DEV DATA BLOCK ADDRESS +IFN FTTTYSER,< + EXTERN TSETBF + PUSHJ PDP,TSETBF ;INITIALIZE TTY INPUT BUFFER +> + JRST TTYFND ;ATTACHED, GO SET UP OUTP. BYTE PTR. + +INTERNAL FTLOGIN +IFN FTLOGIN,< +DEVATT: IFE FTTTYSER,< + MOVE TAC,AC2 ;RESTORE BYTE POINTER> + PUSHJ PDP,CTEXT1 ;GET DEVICE ARGUMENT + JFCL ;SHOULD NEVER RETURN + MOVE T,PRJPRG(ITEM) ;GET PROJ.-PROG. NOS. + CAME T,SYSPP ;PRJPRG = [1,1]? + JRST ATT5 ;NO - ERROR + MOVE TAC,TAC1 ;YES-SET UP DEVICE NAME + PUSH PDP,DEVDAT ;SAVE DDB FOR THIS TTY + PUSHJ PDP,DEVSRC ;SEARCH FOR DEVICE + JRST TEMP1 ;NOT FOUND + LDB T,PJOBN ;GET JOB NUMBER + JUMPN T,ATT6 ;IS IT = 0? + DPB ITEM,PJOBN ;SET JOB NUMBER + MOVE TAC,DEVMOD(DEVDAT); CHECK TO SEE IF THIS IS A TTY + LDB TAC1,PUNIT ; + TLNE TAC,DVTTY ;IS IT A TTY? + HRRM DEVDAT,TTYTAB(TAC1) ;SET TRANS TABLE TO POINT TO DDB + POP PDP,DEVDAT ; + POPJ PDP, ;RETURN +> + +ATT1: JSP TAC,ERRMES + ASCIZ /ILLEGAL JOB NUMBER +/ +ATT2: MOVE TAC1,DEVNAM(DEVDAT) ;[PRINT PHYSICAL NAME + MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB + PUSHJ PDP,PRNAME + JSP TAC,ERRMES + ASCIZ / ALREADY ATTACHED +/ +ATT3: JSP TAC,ERRMES + ASCIZ /CAN'T ATT TO JOB +/ +ATT4: JSP TAC,ERRMES + ASCIZ /NOT A JOB +/ +ATT5: JSP TAC,ERRMES + ASCIZ /CAN'T ATT DEV +/ +ATT6: POP PDP,DEVDAT + JSP TAC,ERRMES + ASCIZ /WASN'T DET +/ +> + +INTERNAL FTATTACH +IFN FTATTACH,< + +;"DETACH" - DETACH CONSOLE FROM JOB +;"DETACH DEVNAM" - DETACHES DEVICE FROM THE SYSTEM SOFTWAREWISE +; NOTE - MUST BE LOGGED IN UNDER [1,1] TO DO THIS + +EXTERNAL TTYDET +INTERNAL FTLOGIN + +IFE FTLOGIN,< +DETACH: JRST TTYDET ;GO DETACH TTY +> + +IFN FTLOGIN,< +EXTERNAL PRJPRG,SYSPP,PUNIT,TTYTAB,PJOBN +DETACH: PUSHJ PDP,CTEXT1 ;GET ARGUMENT + JUMPE TAC1,TTYDET ;ONLY "DET" TYPED + MOVE T,PRJPRG(ITEM) ;GET PROJ.-PROG. NUMBER + CAME T,SYSPP ;PRJPRG = [1,1]? + JRST LOGER1 ;NO-PRINT ERROR MSG. + MOVE TAC,TAC1 ;YES-SET UP DEVICE NAME + PUSH PDP,DEVDAT ;SAVE TTY DDB + PUSHJ PDP,DEVSRC ;SEARCH FOR DEVICE + JRST TEMP1 ;DEVICE NOT FOUND + MOVE TAC,DEVMOD(DEVDAT) ;CHECK TO SEE IF THIS IS DSK + TLNE TAC,DVDSK ;IS IT THE DSK? + JRST TEMP1 ;YES-PRINT ERROR MSG. + MOVEI TAC1,ASSCON ;FOUND-SET UP ASSIGNED BY CONSOLE + PUSHJ PDP,ASSASG ;TRY TO ASSIGN + JRST TEMP2 ;CAN'T ASSIGN + TLNE DEVDAT,SYSDEV ;IS THIS SYSTEM DEVICE? + JRST TEMP1 ;YES-PRINT ERROR MSG. + XOR T,T ;NO-SET TO ZERO + DPB T,PJOBN ;SET JOB NO. TO NULL JOB + MOVE TAC,DEVMOD(DEVDAT) ;CHECK TO SEE IF THIS IS A TTY + TLNN TAC,DVTTY ;IS IT A TTY? + JRST .+4 ;NO-GO AHEAD + LDB TAC,PUNIT ;YES-SET UPO FOR SCNSER + MOVEI TAC1,-1 ;SET LEFT HALVE TO TTYTAB TO -1 + HRRM TAC1,TTYTAB(TAC) ;SO THAT SCNSER CHECKS FOR THIS + POP PDP,DEVDAT ;RESTORE TTY DDB + POPJ PDP, ;SUCCESSFUL RETURN + +TEMP1: POP PDP,DEVDAT ;RESTORE TTY DDB + JRST DEAER1 ;PRINT ERROR MSG. AND RETURN +TEMP2: +IFE FTTTYSER,< POP PDP,DEVDAT ;RESTORE TTY DDB + JRST ASSER1+1 ;PRINT ERROR MSG. AND RETURN +> +IFN FTTTYSER,< + JRST ASSER1 +> +LOGER1: JSP TAC,ERRMES + ASCIZ /CAN'T DET DEV +/ + +>> ;CLOSE BOTH FTLOGIN AND FTATTACH CONDITIONALS. + +;"DAYTIME" - PRINT TIME OF DAY + +EXTERNAL TIME,THSDAT,MONTAB,JIFMIN + +DAYTIM: +IFN FTLOGIN, < + JUMPE ITEM,DAYTM1 + PUSHJ PDP,DECIN ;WAS AN ARGUMENT TYPED? + JRST DAYTM1 ;NO, PRINT TIME + JRST COMERA ;ERROR + HLRZ TAC,PRJPRG(ITEM) ;YES + CAIE TAC,1 ;IS THIS PROJECT 1? + JRST DAYTM1 ;NO, PRINT TIME OF DAY ANYWAY(IGNORE ARG) + MOVE TAC,TAC1 ;YES, RESET TIME ACCORDING TO ARGUMENT + IDIVI TAC,^D100 + IDIVI TAC,^D60 ; + ADD TAC,TAC1 ;COMPUTE MINUTES + IMULI TAC,JIFMIN ;COMPUTE JIFFIES + MOVEM TAC,TIME ;AND STORE + POPJ PDP, +> +DAYTM1: MOVE TAC,THSDAT ;PRINT TODAY'S DATE + IDIVI TAC,^D31 + EXCH TAC,TAC1 ;YEAR AND MONTH IN TAC1 + PUSHJ PDP,DECP1 ;ADD 1 TO DAY(IN TAC) AND PRINT DECIMAL + MOVEI TAC,0 + DIVI TAC,^D12 + EXCH TAC,TAC1 + MOVE TAC,MONTAB(TAC) ;MONTH + DPB TAC,[POINT 21,DAMESS,27] + MOVEI TAC,DAMESS + PUSHJ PDP,CONMES ;PRINT DAY + MOVEI TAC,^D64(TAC1) + PUSHJ PDP,RADX10 ;PRINT YEAR + PUSHJ PDP,PRSPC + MOVE TAC,TIME ;PRINT TIME OF DAY + JRST PRTIM1 + +INTERNAL FTTIME +IFN FTTIME,< +;"TIME (JOB NO.)" - PRINT TOTAL AND INCREMENTAL RUNNING TIME FOR A JOB +;FOLLOWED BY KILO-CORE TICKS +;"TIME 0" IMPLIES RUNTIME FOR NULL JOB AND THE TOTAL TIME SPENT SHUFFLING USERS +; IF NO JOB NO. GIVEN-TIME WILL BE FOR CURRENTLY LOGGGED IN JOB NO. + +EXTERNAL RTIME,TTIME,SHFWRD,WDPJIF,JOBN,JBTSTS,CLRWRD,LSTWRD + +RUNTIM: PUSHJ PDP,DECIN ;GETJOB NO. ARG. + JRST RUN1 ;NO ARG. GIVEN - LOGGED IN? + JRST COMERA ;ILLEGAL DECIMAL CHARACTER RETURN + JUMPE TAC1,RUN2 ;RUNTIME 0 GIVEN + CAIL TAC1,JOBN ;JOB NO. TO BIG? + JRST ATT1 ;YES,ILLEGAL JOB. NO. + MOVE TAC,TTIME(TAC1) ;TIME SINCE LAST LOGGIN + JRST PRTIME ;PRINT AND RETURN + +RUN2: PUSHJ PDP,INLMES ;PRINT + + ASCIZ /SHFL / ;"SHUFFLING " + MOVE TAC,SHFWRD ;NO. WORDS SHUFFLED + IDIVI TAC,WDPJIF ;NO.WORDS/JIFFY USING BLT + PUSHJ PDP,PRTIME ;PRINT SHUFFLE TIME + PUSHJ PDP,INLMES + ASCIZ /ZCOR / + MOVE TAC,CLRWRD + IDIVI TAC,WDPJIF + PUSHJ PDP,PRTIME ;PRINT TIME SPENT CLEARING CORE + PUSHJ PDP,INLMES + ASCIZ /LOST / + MOVE TAC,LSTWRD + PUSHJ PDP,PRTIME ;PRINT TME SPENT "LOST" RUNNING NULL JOB + PUSHJ PDP,INLMES ;PRINT + ASCIZ /NULL / ;"NULL TIME " + MOVE TAC,TTIME ;PRINT NULL JOB RUNNING TIME + PUSHJ PDP,PRTIME ; + PUSHJ PDP,INLMES ;PRINT TOTAL SYSTEM UP TIME + ASCIZ /UP / + MOVE TAC,UPTIME + JRST PRTIME ;AND RETURN + +RUN1: +IFE FTLOGIN,< + MOVEI TAC,0 ;GET SET TO CLEAR INCREMENTAL RUN TIME +> +IFN FTLOGIN,< + MOVSI TAC,JLOG ;IS JOB LOGGED IN? + TDZN TAC,JBTSTS(ITEM) ;TEST JOB STATUS BITS AND CLEAR TAC ALWAYS + JRST NOTENF ;NO, NEED MORE ARGUMENTS +> + EXCH TAC,RTIME(ITEM) ;GET CURRENT INCR. TIME AND CLEAR + PUSHJ PDP,PRTIME ;PRINT TIME SINCE LAST TIME COMM. +PRTTIM: MOVE TAC,TTIME(ITEM) ;GET TOTAL ACCUMULATED TIME +IFN FTKCT,< + PUSHJ PDP,PRTIME + EXTERN JBTKCT + PUSHJ PDP,INLMES ;PRINT "K*CPUSEG= + ASCIZ /KILO-CORE-SEC=/ + MOVE TAC,JBTKCT(ITEM) ;PRODUCT OF NO. OF K CORE* NO. OF JIFFIES RUN + IDIVI TAC,JIFSEC ;AT THAT SIZE, CONVERT TO KILO CORE SECONDS + PUSHJ PDP,RADX10 ;AND PRINT IN DECIMAL + JRST CRLF ;PRINT IRLF +> +IFE FTKCT,< + JRST PRTIME ;PRINT IT AND RETURN +> +> + +;ROUTINE TO LET TTY TALK TO ANY OTHER RING OF TTYS +; "TALK TTYN" +; TTYN NEED NEVER HAVE BEEN TYPED ON BEFORE + +INTERNAL FTTALK + +IFN FTTALK,< +EXTERNAL TTYTLK + +TALK: PUSHJ PDP,CTEXT1 ;GET ARGUMENT + JUMPE TAC1,TALK2 ;NONE SPECIFIED + MOVE TAC,TAC1 + PUSHJ PDP,DEVSRC ;SEARCH FOR DEVICE + JRST TALK1 ;DEVSRC SHOULD FIND A FREE TTY DDB + ; EVEN IF TTY NEVER TYPED ON YET + PUSHJ PDP,TTYTLK + JRST TALK1 + POPJ PDP, + +TALK2: MOVSI ITEM,NOINCK ;SET FLAGS SO RESPONSE WILL PRINT + MOVEM ITEM,-1(PDP) + JRST NOTENF + +TALK1: MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB + MOVSI ITEM,NOINCK ;SET FLAGS TO PRINT RESPONSE + MOVEM ITEM,-1(PDP) + JSP TAC,ERRMES + ASCIZ /BUSY +/ +> + +INTERNAL FTEXAMINE + +IFN FTEXAMINE,< + +;"EXAMINE LOC" - LOOKS A CONTENTS OF LOC AND PRINTS IN OCTAL +;IF LOC IS MISSING, NEXT LOC IS PRINTED +;IF PREVIOUS WAS E COMMAND, SAME LOC IF PREVIOUS WAS D COMMAND +;TAB. IS PRINTED INSTEAD OF CRLF(LIKE DDT) + +EXTERNAL TPOPJ,JOBPC + +ECOM: SKIPGE JOBEXM(JDAT) ;WAS PREVIOUS D OR E COMMAND. A D COMMAND? + AOS JOBEXM(JDAT) ;NO, IT WAS AN E. INCREMENT IN CASE HE TYPES NO ARG + HRROS JOBEXM(JDAT) ;YES, FLAG THAT E HAPPENED LAST(LH=-1) + PUSHJ PDP,OCTIN ;GET OCTAL LOCATION + SKIPA TAC,JOBEXM(JDAT) ;NONE SPECIFIED, USE LAST LOC OF D OR NEXT OF E + JRST COMERA ;ILLEGAL CHARACTER + PUSHJ PDP,DEAT ;CHECK FOR AC REFERENCE AND STORE JOBEXM + HRRZ UUO,TAC1 ;IGNORE LH + HRLI UUO,PROG ;SET TO RELOCATE + PUSHJ PDP,GETWRD ;GET WORD FROM LOW OR HIGH SEG + JRST ECOMA ;ERROR, OUT OF BOUNDS + PUSH PDP,TAC ;SAVE CONTENTS OF LOC TO BE PRINTED + HRRZ TAC,JOBEXM(JDAT) ;PRINT LOC BEING EXAMINED + PUSHJ PDP,OCTPNT + PUSHJ PDP,INLMES ;PRINT SLASH TAB + ASCIZ */ * + HLRZ TAC,(PDP) ;PRINT LEFT HALF + PUSHJ PDP,OCTPNT + PUSHJ PDP,INLMES ;PRINT SPACE + ASCIZ / / + HRRZ TAC,(PDP) ;PRINT RIGHT HALF + PUSHJ PDP,OCTPNT + PUSHJ PDP,INLMES ;PRINT FINAL TAB + ASCIZ / / + JRST TPOPJ ;POP PDP,TAC,POPJ PDP, + +;"DEPOSIT LH RH LOC" - DEPOSITS XWD LH,RH IN LOCATION LOC +;IF LOC IS MISSING. ASSUME NEXT LOC IF PREVIOUS D, SAME LOC IF PREVIOUS E + +EXTERNAL JOBEXM,JOBPFI + +DCOM: PUSHJ PDP,OCTIN ;GET LH + JRST NOTENF ;NOT ENOUGH ARGUMENTS + JRST COMERA ;ILLEGAL CHARACTER + HRLM TAC1,IOS ;SAVE LH + PUSHJ PDP,OCTIN ;GET RH + JRST NOTENF ;NOT ENOUGH ARGUMENTS + JRST COMERA ;ILLEGAL CHARACTER + HRRM TAC1,IOS ;SVE RH + SKIPL JOBEXM(JDAT) ;WAS PREVIOUS D OR E AN E COMMAND? + ; LH=-1 IF E, LH=0 IF D + AOS JOBEXM(JDAT) ;NO, INCREMENT IN CASE USER TYPED NOT THIRD ARG + ; FOR SUCCESSIVE D'S + HRRZS JOBEXM(JDAT) ;FLAG THAT A D WASDONE LAST(LH=0) + PUSHJ PDP,OCTIN ;GET LOC + SKIPA TAC1,JOBEXM(JDAT) ;NOT SPECIFIED, USE LAST OF E OR NEXT OF D + JRST COMERA ;ILLEGAL CHARACTER +IFN FT2REL,< + EXTERN CHKMED + PUSHJ PDP,CHKMED ;CHECK TO SEE IF HIGH SEG IS SHARABLE + ; IF YES, SET USER-MODE WRITE PROTECT (UWP) ON + ; FOR THIS USER, AND SET MEDDLE FOR THIS USER + ; SO HE CANNOT TURN UWP OFF +> + TRNN TAC1,777760 ;IN USER ACS + JRST DCOM1 ;YES + HLRZ TAC,PROG ;GET PROTECTION + CAILE TAC1,JOBPFI ;NO, GREATER THAN HIGHEST LOC, PROTECTED + ; FROM IO IN JOB DATA AREA? + CAMLE TAC1,TAC ;IN BOUNDS? + JRST DCOMA ;NO +DCOM1: PUSHJ PDP,DEAT ;CHECK FOR AC REFERENCE + HRLI TAC1,PROG ;SET FOR RELOCATION + MOVEM IOS,@TAC1 + POPJ PDP, + +DEAT: TLZ TAC1,-1 ;CLEAR LH IN CASE THIS IS A SUCCESSIVE E WITH NO ARG + HRRM TAC1,JOBEXM(JDAT) ;STORE FOR NEXT TIME, DO NOT TOUCH LH(D OR E LAST) + ; YES, WAS JOB STOPPED IN USER MODE? + CAIL TAC1,20 ;IS IT AN AC? + POPJ PDP, ;NO + MOVE TAC,JOBPC(JDAT) + TLNE TAC,USRMOD ;USER MODE? + ADDI TAC1,20 ;YES USER ACS ARE AT 20 INSTEAD OF 0 + +DCOMA: +IFN FT2REL,< + EXTERN HGHDEP + PUSHJ PDP,HGHDEP ;IS IT IN BOUNDS AND ALLOWED IN HIGH SEG? + JRST ECOMA ;NO, PRINT "OUT OF BOUNDS" + POPJ PDP, ;YES, IOS DEPOSITED, AND JOBEXM UPDATED +> +ECOMA: JSP TAC,ERRMES ;OUT OF BOUNDS + ASCIZ /OUT OF BOUNDS +/ + +> + +IFN FTLOGIN,< +;"SCHEDULE OCTN" - SETS RH OF STATES TO OCTN, IF TYPED FROM +; THE OPERATOR CONSOLE (C(DEVOPR)), OTHERWISE ILLEGAL +;"SCHEDULE" WITH NO ARGUMENTS TYPES OUT RH OF STATES, LEGAL FOR ALL. + + EXTERN DEVOPR,STATES,OCTPNT + +SKEDUL: PUSHJ PDP,OCTIN ;GET THE ARGUMENT IF ANY + JRST SKED1 ;NO ARGUMENT + JRST COMERA ;BAD SYNTAX IN OCTAL NUMBER + MOVE TAC,DEVNAM(DEVDAT) ;AN ARGUMENT. IS THIS THE OPR? + CAME TAC,DEVOPR + JRST COMERR ;NO, THIS IS ILLEGAL, THEN. + HRRM TAC1,STATES ;YES. STORE ARGUMENT IN RH OF STATES + POPJ PDP,0 ;RETURN + +SKED1: HRRZ TAC,STATES ;SCHEDULE WITH NO ARGUMENTS. + PUSHJ PDP,OCTPNT ;PRINT RH OF STATES. + JRST CRLF ;AND RETURN WITH A CRLF +> +;"BLANK" OR NO ALPHA NUMERIC BEFORE BREAK CHAR COMMAND +;DISPATCHED TO LIKE ANY OTHER COMMAND(0 IN COMMAND TABLE) + +CBLANK: +IFE FTTTYSER,< + LDB TEM,TAC ;GET BREAK CHARACTER + CAIE TEM,15 ;IS IT A CR +> +IFN FTTTYSER,< + CAIE TEM,12 ;WAS BREAK A LF +> + CAIN TEM,";" ;NO, IS IT SEMI COLON(MONITOR COMMENT) + POPJ PDP, ;YES, IGNORE + ; FALL IN UNKNOWN COMMAND + +;COMMAND NOT IN COMMAND DICECTORY + +NOCOM: JRST COMERR ;NO, APPEND ? TO WHAT HE TYPED IN + +IFN FTFINISH,< +; "FINISH DEVICE" - CLOSES,RELEASE AND DESASSIGNS DEVICE +;JOB MUST HAVE CORE + + EXTERNAL USRJDA,PUUOAC,JOB,USRHCU,JOBFDV,SYSTAP +CFINI: PUSHJ PDP,CTEXT1 ;GET DEVICE NAME + JUMPE TAC1,NOTENF ;NOT ENOUGH ARG. IF NONE + SKIPA TAC,TAC1 ;SEARCH FOR SIXBIT DEVICE NAME +CFINS: MOVE TAC,SYSTAP ;HERE ON CONTROL C ON SYSTEM TAPE USER + ; DO A FINISH SYS COMMAND FOR HIM + PUSHJ PDP,DEVSRC + JRST NOTDEV ;PRINT NOT A DEVICE + HRRZM DEVDAT,JOBFDV(JDAT) ;STORE DDB ADR. IN JOB DATA AREA + MOVE DEVDAT,-2(PDP) + JSP TAC1, MSTART ;SETUP MONITOR JOB AND RETURN + ; RETURN HERE AT UUO LEVEL WHEN SCHEDULED + JSP TAC,MONSTR ;SETUP ACS,PROG,JDAT,PDP + MOVE UCHN,USRHCU ;HIGHEST USER IO CHANNEL IN USE +FDV1: HRRZ DEVDAT,USRJDA(UCHN) ;GET NEXT DEVICE + MOVSI UUO,071000 ;SETUP RELEASE UUO + DPB UCHN,PUUOAC ;WITH CHANNEL NO. + PUSH PDP,UCHN + CAMN DEVDAT,JOBFDV(JDAT) ;IS THIS DEV. THE ONE TO RELEASE? + XCT UUO ;YES, RELEASE IT(AND CLOSE) + POP PDP,UCHN + SOJGE UCHN,FDV1 ;FINISHED? + MOVE ITEM,JOB ;GET JOB NUMBER + MOVE DEVDAT,JOBFDV(JDAT) ;RESET DEVDAT + PUSHJ PDP,DEASG ;DEASSIGN DEVICE + JFCL ;IGNORE IF NOT ASSIGNED BY CONSOLE + JRST ESTOP ;STOP JOB SO HE CANNOT CONTINUE +> + +IFN FTTIME,< +;"RESOURCES" - PRINT OUT AVAILABLE DEVICES AND FREE BLOCKS ON THE DISK + +EXTERNAL DEVLST + +FREDEV: +IFN FTDISK, < +EXTERNAL SATENT,SATXWD,WLBIT,SENTSZ,NUMBIT + + XOR TAC,TAC ;INITIALIZE COUNTER + HLRE T2,SATXWD ;SET INDEX WITH NUMBER OF SAT BLOCKS IN EXISTENCE, + MOVNS T2 + HRRI T1,SATENT ;GET SATENT ENTRY POINTER +LOP05: HRRZ TAC1,0(T1) ;GET VALUE + TRNE TAC1,WLBIT ;IS THIS SPACE WRITE PROTECTED? + JRST LOP06 ;YES, NO FREE BLOCKS IN THE SAT BLOCK. + ADDI TAC,NUMBIT ;NO, ADD THE FOLLOWING QUANTITY IN THIS SAT + SUB TAC,TAC1 ; RUNNING TOTAL: (TOTAL BLOCKS IN THIS SAT + ; BLOCK) - (BLOCKS ALREADY IN USE). +LOP06: ADDI T1,SENTSZ ;BUMP POINTER + SOJN T2,LOP05 ;DECREMENT INDEX + PUSHJ PDP,RADX10 ;CONVERT TO DECIMAL + PUSHJ PDP,INLMES ;PRINT + ASCIZ /. BLKS/ +> + + HRLZ T,DEVLST ;GET DDB POINTER + MOVEI AC2,0 ;SET DEVICE NAME 0 FOR FIRST COMPARE +LOP01: MOVE T1,DEVMOD(T) ;DEVICE CHARACTERISTICS + TRNN T1,ASSCON!ASSPRG ;DEVICE ASSIGNED BY CONSOLE OR PROGRAM? + TLNE T1,DVTTY!DVDSK ;NO, IS IT A TTY OR DSK? + JRST LOP02 ;YES DO NOT PRINT +IFE FTDISK,< + JUMPE AC2,LOP018 ;SUPPRESS LEADING COMMA IF NO DISK +> + PUSHJ PDP,INLMES ;PRINT ,(INSTEAD OF CRLF SO WILL FIT IN 1 BUFFER) + ASCIZ /,/ +LOP018: MOVS AC1,DEVNAM(T) ;GET DEVICE NAME + HLLZ TAC1,AC1 ;ASSUME SAME TYPE AS LAST ONE, PRINT + ; ONLY RH OF NAME (UNIT NUMBER) + CAIN AC2,0(AC1) ;IS IT REALLY THE SAME? + JRST LOP01A ;YES. PRINT THE UNIT NUMBER, + MOVS TAC1,AC1 ;NO. MUST PRINT WHOLE NAME, + HRRZ AC2,AC1 ; AND GET THE NEW DEVICE IN FLAG AC. +LOP01A: PUSHJ PDP,PRNAME ;AS BEING FREE +LOP02: HLRZ T,DEVSER(T) ;GET NEXT DEVICE IN CHAIN + JUMPN T,LOP01 ;IS THERE ONE? + JRST CRLF ;NO. DONE, PRINT CR. LF AND THEN POPJ +> + +EXTERNAL CPOPJ,STUSER +;ROUTINE TO CHECK FOR ACTIVE DEVICES +;NEVER GET HERE DURING SWAP IN OU OUT +;SINCE COMMAND TABLE SHOULD AHVE NOTRAN BIT ON + +RUNCHK: CAMN ITEM,STUSER ;SYSTEM TAPE USER? + JRST DLYCM1 ;YES. DELY,BUT DO NOT STOP JOB +ACTCHK: JUMPE PROG,ACTCH1 ;DOES JOB HAVE CORE IN MEMORY + PUSHJ PDP,ANYACT ;YES. ARE DEVICES ACTIVE? + JRST DLYCM ;YES. DELAY COMMAND. +ACTCH1: MOVE TAC1,-1(PDP) ;RESTORE COMMAND DISPATCH ADDRESS + MOVE DEVDAT,-2(PDP) ;RESTORE TTY DDB ADDRESS + MOVE T,JBTSTS(ITEM) ;RESTORE JOB STATUS +CONTC1: POPJ PDP,COM0 + +;ROUTINE TO DELAY A COMMAND + +;DELAYS COMMAND TO BE EXECUTED WHEN JOB IN CORE MEMORY +;AND CAUSE JOB TO BE SWAPPED IN(COMMAND WAIT BIT IS SET IN JBSTS) +;AND POPD LEVEL UP ONE. + +EXTERNAL TTYCM,LINSAV + +DLYCM: PUSHJ PDP,DLYCOM ;SET COMMAND WAIT BIT IN JOB STATUS AND PUT + ; JOB IN COMMAND WAIT QUEUE + ; SO JOB IS NOT RUNNABLE ANY MORE +;ROUTINE TO DELAY A COMMAND IF A SWAP OUT OR IN IS IN PROGRESS +;DIFFERS FROM DLYCM IN THAT JOB IS NOT MADE TO BE SWAPPED IN +;REQUIRES OR DELYAING COMMAND IF SYSTEM +;TAPE USER TYPOES ^C (HALT COMMAND) + +DLYCM1: POP PDP,TAC + POP PDP,TAC1 + POP PDP,TAC1 + PUSH PDP,CONTC1 + MOVE TAC1,LINSAV + JRST TTYCM + +IFN FTDISK,< +;SEARCH DEVICE CHAIN FOR DSK WITH COUNTS ON +;CALL MOVE ITEM,JOB NO +; PUSHJ PDP,STOPCK +; CAN'T STOP RETURN +; OK TO STOP RETURN + +EXTERNAL DSKDDB,DSKFGS,CPOPJ1 + +STOPCK: MOVEI DEVDAT,DSKDDB + MOVSI TAC1,DSKFGS +STOPD: LDB TAC,PJOBN + CAIE ITEM,(TAC) ;ASSIGNED TO THIS JOB? + JRST STOPC ;NO + TDNE TAC1,DEVIOS(DEVDAT) ;YES. FLAG ON? + JRST CPOPJ ;YES. DELAY +STOPC: HLRZ DEVDAT,DEVSER(DEVDAT) + MOVSI TAC,446353 + + CAMN TAC,DEVNAM(DEVDAT) + JRST STOPD + JRST CPOPJ1 ;OK TO STOP +> + +SUBTTL COMCSS - COMMON COMMAND SUBROUTINES + +;ROUTINE TO RETURN NEXT ALPHANUMERIC STRING +; IN COMMAND LINE (SIXBIT) +;CALL: MOVE TAC,BYTE POINTER TO PREVIOUS CHAR. +; PUSHJ PDP, CTEXT +; SIXBIT STRING RETURN LEFT JUSTIFIED IN AC TAC1 + +INTERNAL CTEXT +INTERNAL CTEXT1 + +T=BUFPNT ;TEMPORARY AC'S +T1=BUFWRD +T2=UUO + +CTEXT: PUSHJ PDP,SKIPS ;CALL HERE IF AT START OF LINE + SKIPA + +CTEXT1: PUSHJ PDP,SKIPS1 ;SKIP LEAD SPACES,TABS,NULLS AND CLEAR TAC1 + ; DO NOT RETURN IF CR WAS PERVIOUS BREAK + MOVE T,[POINT 6,TAC1] +IFE FTTTYSER,< + LDB TEM,TAC + JRST CTEX1 +CTEX0: ILDB TEM,TAC +> +IFN FTTTYSER,< +EXTERN TAKR,GETCHAR + LDB TEM,TAKR(DAT) ;GET LAST CHAR. + JRST CTEX1 +CTEX0: PUSHJ PDP,GETCHR ;ROUTINE IN SCNSER TO PICK UP CHAR. +> + +CTEX1: PUSHJ PDP, CTEX ;IS IT ALPHANUMERIC + TRC TEM,40 ;CONVERT TO SIXBIT + TLNE T,770000 ;SIX CHARS YET? + IDPB TEM,T ;NO. BUILD WORD + JRST CTEX0 ;LOOP FOR MORE + +;SCAN FOR ALPHANUMERIC CHAR IN TEM +CTEX: CAILE TEM,"Z"+40 ;GREATER THAN LC Z? + JRST CTEXA ;YES. NOT SIXBIT. + CAIL TEM,"A"+40 ;LOWER CASE LETTER? + TRZ TEM,40 ;YES. MAKE UPPER CASE. + CAIL TEM, "0" + CAILE TEM, "Z" ;LETTERS ARE LARGER THEN NOS. + JRST CTEXA ;NEITHER + CAILE TEM,"9" + CAIL TEM,"A" + POPJ PDP, ;LETTER OR NUMBER RETURN +CTEXA: IFE FTTTYSER,< + POP PDP,T1 ;REDUCE PDP BY 1 LEVEL + POPJ PDP, ;AND RETURN +> +IFN FTTTYSER,< + CAIN TEM,":" ;DEVICE NAME? + PUSHJ PDP,GETCHR ;YES. SKIP COLON + CAIE TEM,3 ;CONTROL C? + + JRST TPOPJ ;NO. RETURN ONE LEVEL UP +CTXCNC: MOVSI TAC1,(SIXBIT /HAL/) ;MAKE PHONY HALT COMMAND + MOVSI TEM,12 ;WITH LF FOR TERMINATION + JRST TPOPJ ;AND RETURN UP A LEVEL +> + +;ROUTINE TO IGNORE LEADING SPACES, TABS, AND NULLS +;ALSO CLEARS TAC1 +;DOES NOT RETURN IF PREVIOUS CHAR. OR NEXT NON-SPACING +;CHAR, IS CR(IE POPS SUBROUTINE LEVEL UP 1 ON RETURN) +;CALL: MOVE TAC,BYTE POINTER TO PREVIOUS BREAK CHAR. +; PUSHJ PDP, SKIPS1 + +INTERNAL SKIPS1,SKIPS + +IFE FTTTYSER,< +SKIPS1: +SKIPS: MOVEI TAC1,0 ;CLEAR TAC1 + LDB TEM,TAC ;WAS PRECEDING BREAK A CR? + CAIN TEM,15 + JRST SKIPS2 ;YES. POP SUB. LEVEL UP 1 +SKIPSA: + ILDB TEM,TAC + JUMPE TEM,SKIPSA ;NULL? + CAIE TEM," " ;SPACE? + CAIN TEM, 11 + JRST SKIPSA + CAIN TEM,15 ;CR? +SKIPS2: POP PDP,T ;YES. POP SUB. LEVEL UP ONE +> +IFN FTTTYSER,< EXTERNAL GETCHR,SPCHEK,BREAKB,TAKR + +SKIPS: PUSHJ PDP,GETCHR ;GET FIRST CHAR ON LINE +SKIPS1: MOVEI TAC1,0 ;FOR CTEXT, DECIN + LDB TEM,TAKR(DAT) ;IN CASE TEM CLOBBERED + CAIN TEM,15 ;SKIP TO LF IF CR +SKIPSA: PUSHJ PDP,GETCHR ;NEXT CHARACTER + JUMPE TEM,SKIPS3 ;POP UP A LEVEL IF NO CHARS + PUSHJ PDP,SPCHEK ;SPECIAL? + JRST SKIPS2 ;NO + TLNE TAC,BREAKB ;BREAK?(END OF LINE) + JRST SKIPS3 ;YES. POP UP RETURN +SKIPS2: CAIG TEM,40 ;SPACE OR CONTROL CHAR? + JRST SKIPSA ;YES. + POPJ PDP,Z ;NO. RETURN +SKIPS3: CAIN TEM,3 ;^C? + JRST CTXCNC ;HANDLE IT + MOVEI TEM,12 ;FOR BREAK CONSISTENCY + JRST TPOPJ ;RETURN ONE LEVEL UP +> + +;ROUTINE TO APPEND A "?" TO INPUT STRING AND SET AS OUTPUT +;CALLED FROM OCTIN, RETURNS TO SECOND LEVEL ON PDL +;CALL: MOVE TAC, BYTE POINTER TO LAST CHAR. IN INPUT STRING +; PUSHJ PDP, COMERA + +INTERNAL COMERA,COMERP + +COMERP: POP PDP,T ;REMOVE SUB. RETURN BEFORE CALLING COMERA +COMERA: IFE FTTTYSER,< IBP TAC> + IFN FTTTYSER,< PUSHJ PDP,GETCHR> ;MOVE UP, A CH + +;ROUTINE TO REPLACE LAST CHARACTER IN INPUT STRING BY "?" +;AND SET AS OUTPUT +;CALL: MOVE TAC, BYTE POINTER TO LAST CHAR. IN INPUT STRING +; PUSHJ PDP, COMERR + +INTERNAL COMERR + + +COMERR: +IFN FTTTYSER,< +EXTERN OUTCHS,TRESCN,TITAKR,SETBFI,TISYNC + + MOVE T,TITAKR(DEVDAT) ;SAVE POSISITION IN SCAN + PUSHJ PDP,TRESCN ;BACK UP TO START OF COMMAND +COMERL: PUSHJ PDP,GETCHR ;GET A CHAR FROM COMMAND + CAMN T,TITAKR(DEVDAT) ;PASS BAD CHAR YET? + JRST COMER1 ;YES + PUSHJ PDP,OUTCHS ;NO. TYPE CHAR. + JUMPN TEM,COMERL ;LOOP IF NOT OUT OF CHARACTERS + +COMER1: PUSHJ PDP,SETBFI ;CLEAR ANY MORE TYPEIN + AOS TISYNC(DEVDAT) ;THIS WILL BE SOS-ED AT COMRET + MOVEI TEM,"?" ;APPEND ? TO ERRONEOUS WORD + PUSHJ PDP,OUTCHS +> +IFE FTTTYSER,< + MOVE DAT,TAC + MOVEI T,"?" ;STORE ? ON TOP OF BREAK CHAR. + DPB T,DAT +> + TDZA ITEM,ITEM ;CLEAR JOB NO. AND SKIP INTO CRLF ROUT. + +;ROUTINE TO PRINT A COMMAND ERROR MESSAGE +;SAME CALL AS CONMES + +INTERNAL ERRMES + + ; COMERR SKIPS THIS ROUT,(SEE ABOVE) +ERRMES: TDZA ITEM,ITEM ;CLEAR JOB NUMBER TO INDICATE ERROR + ; SKIP INTO CONMES ROUTINE + +;ROUTINE TO PRINT CARRIAGE RETURN-LINE-FEED +;CALL: MOVE DAT,BYTE POINTER TO OUTPUT +; PUSHJ PDP,CRLF + +INTERNAL CRLF + + ; COMERR SKIPS TO HERE(SEE ABOVE) +CRLF: MOVEI TAC,[ASCII / +/] + +;ROUTINE TO MOVE ASCII CHAR. STRING TO CONSOLE OUTPUT BUFFER +; CALL: MOVE DAT, BYTE POINTER TO LAST OUTPUT CHARACTER +; MOVEI TAC, ADDRESS OF ASCII MESSAGE +; PUSHJ PDP, CONMES +; STRING TERMINATED BY NULL +; CONMES DOES NOT START TTY +;CONMS1 - SAME CALLING SEQUENCE A CONMES,EXCEPT LH IS BYTE POINTER + +INTERNAL CONMES +EXTERNAL TPOPJ + + ; ERRMES SKIPS TO HERE +CONMES: HRLI TAC,440700 ;FORM ASCIZ BYTE POINTER +CONMS1: PUSH PDP,TAC ;SAVE BYTE POINTER +CON0: ILDB TEM,(PDP) ;GET NEXT CHAR. + JUMPE TEM,TPOPJ ;IS IT NULL?(IF YES, DO POP TAC, POPJ) +TYOINS: ;TAG FOR THE TYPE OUT INSTRUCTION +CONOUT: ;EXECUTED FROM REST OF COMCSS TO OUTPUT CHAR +IFN FTTTYSER,< +EXTERN OUTCHS + PUSHJ PDP,OUTCHS ;NO. STORE TTY OUTPUT BUFFER +> +IFE FTTTYSER,< + IDPB TEM,DAT +> + JRST CON0 ;KEEP GOING + +;ROUTINE TO PRINT INLINE ASCIZ MESSAGE +;CALL: PUSHJ PDP,INLMES +; ASCIZ /THE MESSAGE/ +;RETURN TO NEXT LOC AFTER MESSAGE + +INTERNAL INLMES + +INLMES: POP PDP,TAC ;SETUP PRINT ADRESS FOR CONMES + PUSHJ PDP,CONMES + JRST 1(TAC) ;RETURN TO NEXT LOC AFTER MESSAGE + +;ROUTINE TO APPEND ? TO ERROR MESSAGE +;CALL PUSHJ PDP,PRQM +; RETURN + +INTERNAL PRQM + +PRQM: MOVEI TEM,"?" +IFN FTTTYSER,< + +EXTERN OUTCHS + JRST OUTCHS +> +IFE FTTTYSER,< + IDPB TEM,DAT + POPJ PDP, +> +PRSPC: MOVEI TAC,[ASCIZ / /] + JRST CONMES + +;ROUTINE TO PRINT "TOO FEW ARGUMENTS" +;CALL: MOVE DAT,BYTE POINTER +; PUSHJ PDP,NOTENF + +INTERNAL NOTENF + +NOTENF: JSP TAC,ERRMES + +ASCIZ /TOO FEW ARGUMENTS +/ + +;ROUTINE TO PRINT A PERIOD +;CALL: PUSHJ PDP,PRPER + +INTERNAL PRPER + +PRPER: JSP TAC,CONMES + ASCIZ /./ + +;ROUTINE TO DEASSIGN A DEVICE +;CALL: MOVE DEVDAT, DEVICE DATA BLOCK +; MOVE ITEM, JOB NUMBER +; PUSHJ PDP, DEASG +; ERROR NOT PREVIOUSLY ASSIGNED +; OK RETURN WITH DEVICE DEASSIGNED + +INTERNAL DEASG +EXTERNAL PJOBN,CPOPJ1,IPOPJ + +DEASG: LDB T, PJOBN ;WAS DEVICE ASSIGNED TO THIS JOB? + CAME T, ITEM + POPJ PDP, ;NO, RETURN + PUSH PDP,ITEM ;SAVE JOB NUMBER + MOVSI TAC1,DVDIRI ;CLEAR DIRECTORY IN CORE BIT + ANDCAB TAC1,DEVMOD(DEVDAT) ;SET DEVICE CHARACTERISTICS FOR TEST + ; AND ASGHGH + SETZM DEVLOG(DEVDAT) ;CLEAR LOGICAL NAME + + TRNE TAC1,ASSCON ;IS DEVICE ASSIGNED BY CONSOLE? + AOS -1(PDP) ;YES, DO OK RETURN +IFN FT2REL,< + EXTERN ASGHGH + PUSHJ PDP,ASGHGH ;IF DTA OR MTA, CLEAR ANY HIGH SEGMENT NAMES + ; FROM THIS DEVICE SO NO NEW SHARING + ; DEVMOD SETUP IN TAC1 ON CALL +> + MOVEI TAC1,ASSCON ;SETUP ASSIGNED BE CONSOLE BIT FOR RELEASE + PUSHJ PDP,RELEA6 ;CLEAR JOB NO. IN DDB IF DDB NOT NEEDED + JRST IPOPJ ;RESTORE JOB NUMBER AND RETURN + +;ROUTINE TO DEASSIGN ALL DEVICES EXCEPT LOGICAL TTY +;CALL: MOVE ITEM, JOB NUMBER +; MOVE DEVDAT,ADR. OF DEVICE NOT TO BE DEASSIGNED +; PUSHJ PDP, DEASTY + +INTERNAL DEASAL,DEASTY +EXTERNAL DEVLST + +DEASTY: +DEASAL: PUSH PDP,DEVDAT ;SAVE TTY DDB ADDRESS + HLRZ DEVDAT,DEVLST ;SEARCH ALL DDB'S +DEA1: CAIE DEVDAT,@(PDP) ;IS THIS DEVICE NOT TO BE DEASSIGNED? + PUSHJ PDP, DEASG ;NO, TRY TO DEASSIGN IT + JFCL ;IGNORE IF CAN'T + HLRZ DEVDAT, DEVSER(DEVDAT) + JUMPN DEVDAT, DEA1 + POP PDP,DEVDAT ;RESTORE TTY DDB ADDRESS + POPJ PDP, + +;ROUTINE TO REA CONSOLE AND CONVERT ANY RADIX NUMBER +; CALL: MOVE TAC1, DESIRED RADIX +; MOVE TAC, BYTE POINTER TO FIRST CHARACTER +; PUSHJ PDP, ANYRIN +; NO ARG. TYPED RETURN, TAC1=0 +; ILLEGAL CHARACTER RETURN +; NORMAL EXIT TAC TAC1 CONTAINS NUMBER +;SCAN STOPS ON FIRST OR,DASH,SPACE,OR TAB OR ILLEGAL CHAR. +;SKIPS LEADING SPACES AND TABS + +INTERNAL OCTIN,OCTIN1,DECIN,DECIN1 +EXTERNAL CPOPJ1,CPOPJ2 + +C=BUFPNT ;CHARACTER AC +R=BUFWRD ;RADIX AC + +DECIN1: +DECIN: MOVEI R,12 ;DECIMAL INPUT + JRST ANYRIN + +OCTIN1: +OCTIN: MOVEI R,10 ;OCTAL INPUT +ANYRIN: PUSHJ PDP,SKIPS1 ;SKIP LEADING SPACES, TABS, NULLS + ; DO NOT RETURN IF CR WAS PREVIOUS BREAK + ; OR THIS BREAK +IFE FTTTYSER,< LDB TEM,TAC> +OCT0: CAIGE TEM,175 ;ALTMODES(175 OR 176)? + CAIN TEM,"[" ;NO. LEFT BRACKET(SO SPACE NOT REQ + ; BEFORE [P,P] IN ATT AND GET COMMANDS. + JRST CPOPJ2 ;YES. SKIP RETURN + CAIE TEM,"-" ;DASH? + CAIG TEM,400 ;SPACE OR CONTROL CHAR? + JRST CPOPJ2 ;YES, ONLY LEGAL TERMINATORS + CAIE TEM,"," ;COMMA? + CAIN TEM,"]" ;RIGHT BRACKET? + JRST CPOPJ2 ;YES. + SUBI TEM,60 + JUMPL TEM,CPOPJ1 ;ERROR IF NEG.,REMOVE SUB. RETURN AND PRINT + CAML TEM, R ;OR .GE. RADIX + JRST CPOPJ1 ;ERROR, GREATER OR EQUAL TO RADIX + IMUL TAC1, R + ADD TAC1,TEM +IFE FTTTYSER,< ILDB TEM,TAC ;NEXT CHAR> +IFN FTTTYSER,< PUSHJ PDP,GETCHR> ;NEXT CHAR + JRST OCT0 + +INTERNAL FTLOGIN +IFN FTLOGIN,< +;GET PROJECT-PROGRAMMER NUMBERS +;CALL: MOVE TAC,INPUT BYTE POINTER +; PUSHJ PDP,PJPGNO +; +;(AC2)LH _ PROJECT NUMBER +;(AC2)RH _ PROGRAMMER NUMBER +;(AC2) = 0 IF NO [ ]'S TYPED +;THE TERMINAL ] IS OPTIONAL + +IFE FTTTYSER,< +PJPGNO: SKIPA TAC1,TAC ;SAVE INPUT BYTE POINTER IN CASE NO + ; [ ]'S WERE TYPED IN. +PP0: IBP TAC ;GET NEXT CHARACTER (2ND TIME THRU LOOP) + LDB TEM,TAC ;GET CHAR WHICH STOPED PREVIOUS FIELD SCAN + ; (OR NEXT CHAR ON 2ND TIME THRU LOOP) +> + +IFN FTTTYSER,< +PP0: PUSHJ PDP,SKIPS1 +PJPGNO: +> + CAIN TEM,"[" ;IS IT A "[" ? + JRST PP1 ;YES, GET PROJECT-PROGRAMMER NUMBERS FROM INSIDE. + CAIE TEM," " ;NO, IS IT A SPACE ? + CAIN TEM,11 ; OR A TAB? + JRST PP0 ;YES, KEEP LOOKING FOR "[". + MOVEI AC2,0 ;NEITHER SPACE NOT TAB, THUS RETURN A 0 MEANING + ; NO PROJECT-PROGRAMMER NUMBER ENCOUNTERED. +IFE FTTTYSER,< MOVEM TAC1,TAC ;RESTORE ORIGINAL BYTE POINTER.> + POPJ PDP, ;EXIT....... + +PP1: +IFN FTTTYSER,< PUSHJ PDP,SKIPS> + PUSHJ PDP,OCTIN ;GET FIRST ARG.-PROJ. NO. + JRST COMERP ;NO ARG. GIVEN + JRST COMERP ;ILLEGAL DECIMAL CHARACTER GIVEN + HRL AC2,TAC1 ;ENTER +IFN FTTTYSER,< CAIE TEM,"," + JRST COMERP + PUSHJ PDP,SKIPS> + PUSHJ PDP,OCTIN ;GET SECOND ARG.-PROG. NO. + JRST COMERP ; + JRST COMERP ; + HRR AC2,TAC1 ;ENTER + PUSHJ PDP,SKIPS1 ;SKIP BLANKS + CAIN TEM,"]" ;IS USUAL ENDING A "]"? +IFE FTTTYSER, ;YES, SKIP IT +IFN FTTTYSER, ;YES, SKIP IT SO FINAL ] IS OPTIONAL + POPJ PDP, ;RETURN RO CALL +> + +;ROUTINE TO PRINT TIME AS HOURS,MINUTES,SECONDS, AND HUNDRETHS +;FORMAT IS HHMM:SS.HH +;CALL: MOVE TAC,TIME IN JIFFIES(60THS,50THS OR MILLISECONDS) +; MOVE DAT,OUTPUT TEXT BYTE POINTER +; PUSHJ PDP,PRTIME + +;SCALEING IS DONE USING THE FOLLOWING GLOBAL SYMBOLS DEFINED +;ON THE CONFIGURATION TAPE (IOINI1) +;THUS ANY INSTALLATION MAY HAVE ANY RATE CLOCK + +EXTERNAL JIFMIN,JIFSEC,JIFSC2 + +;JIFMIN=NO. OF JIFFIES(CLOCK TICKS) PER MINUTE +;JIFSEC=NO. OF JIRFIES PER SECOND +;JIFSC2=1/2*JIFSEC(USED FOR ROUNDING) + +INTERNAL PRTIME + +PRTIME: IDIVI TAC,JIFMIN ;FORM MINUTES + PUSH PDP,TAC1 ;SAVE REMAINDER IN JIFFIES + JUMPE TAC,PR1 ;SUPRESS 0 HOURS IN MINUTES + IDIVI TAC,^D60 ;HOURS, MINUTES IN TAC,TAC1 + JUMPE TAC,PR0 ;SUPPRES 0 HOURS + PUSHJ PDP,RADX10 + PUSHJ PDP,INLMES ;PRINT "HH:" OR "H:" + ASCIZ /:/ +PR0: MOVE TAC,TAC1 ;GET MINUTES + PUSHJ PDP,PRT2 ;PRINT "MM:" + PUSHJ PDP,INLMES + ASCIZ /:/ +PR1: POP PDP,TAC ;RESTORE SECONDS(IN JIFFIES) + IDIVI TAC,JIFSEC ;JIFFIES PER SECOND + PUSHJ PDP,RADX10 ;PRINT SECONDS + PUSHJ PDP,PRPER ;PRINT PERIOD + MOVE TAC,TAC1 ;NO OF JIFFIES(HUNDRETHS) + IMULI TAC,^D100 ;CONVERT TO HUNDRETHS + IDIVI TAC,JIFSEC + CAIL TAC1,JIFSC2 ;ROUND IF GREATER THEN HALF + AOS TAC + JRST PRT2LF ;PRINT + +PRTIM1: IDIVI TAC,JIFMIN ; + IDIVI TAC,^D60 ;HOURS,MINUTES IN TAC,TAC1 + PUSHJ PDP,PRT2 + PUSHJ PDP,INLMES ;PRINT "HH:" + ASCIZ /:/ + MOVE TAC,TAC1 +PRT2LF: PUSHJ PDP,PRT2 ;PRINT "MM + JRST CRLF + +PRT2: MOVEI TEM,"0" + CAIGE TAC,^D10 + XCT CONOUT ;PUT LEADING 0 IF LESS THEN 10 + JRST RADX10 ;PRINT REST OF NUMBER + +;ROUTINE TO PRINT SIZE OF LOGICAL SEGMENT (LOW OR HIGH) +;CALL: MOVE ITEM, HIGH OR LOW SEG NUMBER +; PUSHJ PDP,PRT SEG +; RETURN +;CALLED AT CLOCK LEVEL FROM CORE (UUO ARG) COMMAND AND SEGCON + + INTERN PRTSEG + EXTERN PCORSZ + +PRTSEG: PUSHJ PDP,SEGSIZ ;TAC1=SIZE OF HIGH OR LOW SEG + MOVE TAC,TAC1 ;RADX10 WANT DEC. NO. IN TAC + JRST RADX10 ;PRINT DECIMAL + +;ROUTINE TO RETURN SIZE OF HIGH OR LOW SEG +;CALL: MOVE ITEM,LOW OR HIGH SEG NUMBER +; PUSHJ PDP,SEGSIZ +; RETURN WITH SIZE IN K IN TAC1 + + INTERN SEGSIZ + EXTERN CPOPJ + +SEGSIZ: +IFN FTSWAP,< + EXTERN IMGIN + LDB TAC1,IMGIN ;SIZE WHEN NEXT SWAPPED IN(IN K) + JUMPN TAC1,CPOPJ ;0 MEANS NOT SWAPPED OUT +> + HLRZ TAC1,JBTADR(ITEM) ;SIZE-1 LOW LOW OR HIGH SEG IN WORDS IN CORE + JUMPE TAC1,CPOPJ ;IS IT IN CORE? + LSH TAC1,-12 ;YES, CONVERT TO #K-1 + AOJA TAC1,CPOPJ ;ADD 1 AND RETURN NUMBER OF K + +;ROUTINE TO ASSIGN A MINIMAL CORE AREA(140 WORDS) +;CALLED FROM CORE,KJOB, AND RUN COMMANDS +;THIS ROUTINE PRESERVES INPUT BYTE POINTER IN TAC +;CALL: PUSHJ PDP,GETMIN +; RETURN PROG=0 IF UNSUCCESSFUL OR CORE ASSIGNED ON DISK + + EXTERN JOBDA,TPOPJ + +GETMIN: +IFE FTTTYSER,< + PUSH PDP,TAC ;SAVE INPUT BYTE POINTER TO COMMAND +> +IFN FTTTYSER,< + PUSH PDP,DEVDAT ;SAVE TTY DDB ADR +> + PUSH PDP,TAC1 ;SAVE DEVICE NAME(GET) + PUSH PDP,IOS ;SAVE DISPATCH ADDRESS(ANYACT USES IOS) +IFN FT2REL,< + EXTERN KILHGH + + PUSHJ PDP,KILHGH ;KILL HIGH SEG +> + MOVEI TAC,JOBDA ;LENGTH OF JOBDATA AREA + PUSHJ PDP,CORE0 ;ASSIGN 140 WORDS ON DISK OR MEMORY + JFCL ;IGNORE IF CANT(PROG=0) + POP PDP,IOS + POP PDP,TAC1 ;RESTORE PUSHED ACS +IFN FTTTYSER,< + POP PDP,DEVDAT ;RESTORE TTY DDB ADR + POPJ PDP, ;TAC NOT USER BY FULL DUPLEX SCNSER +> +IFE FTTTYSER,< + JRST TPOPJ ;RESTORE TAC AND RETURN +> + +;ROUTINE TO GET 1 WORD FORM USER ARE WHICH CAN BE IN LOW OR HIGH SEG +;CALL: MOVE PROG,[XWD PROT,RELOC FOR LOW SEG] +; MOVE ITEM,JOB NUMBER +; HRLI UUO,PROG ;FOR RELOCATION +; HRR UUO,USER ADDRESS(IE BEFORE RELOCATION) +; PUSHJ PDP,GETWRD +; ERROR RETURN ADDRESS OUT OF BOUNDS +; OK RETURN, CONTENTS IN AC TAC +;CAN BE CALLED AT CLOCK OR UUO LEVEL +;CALLED FROM E COMMAND,INIT,OPEN AND CALL UUOS + + INTERN GETWRD + EXTERN CPOPJ1 + +GETWRD: HLRZ TAC,PROG ;LARGEST REL LOC IN LOW SEG + CAIGE TAC,(UUO) ;IS ADR. IN LOW SEG? +IFN FT2REL,< + EXTERN HGHWRD + JRST HGHWRD ;NO, CHECK IF IN HIGH SEG(ERROR RET IF NO) +> +IFE FT2REL,< + POPJ PDP, ;NO, ERROR RETURN +> + MOVE TAC,@UUO ;YES, GET IT FROM LOW SEG + JRST CPOPJ1 ;AND SKIP RETURN + +SUBTTL SAVGET - SAVE,GET,R,RUN COMMANDS AND RUN,GETSEG UUOS + +;SAVGET LOWER CORE LOCATIONS USED FOR UUOS TO MONITOR +;USED IN SAVGET IN APRSER AND SAVGET IN SEGCON +;THESE LOCATIONS ARE DEFINED TO BE IN THE USERS UUO ACS + +;FOR LOOKUP,ENTER UUOS: + XP SGANAM,0 ;FILE NAME + XP SGAEXT,SGANAM+1 ;FILE EXTENSION + XP SGADAT,SGANAM+2 ;FILE CREATION DATE+TIME + XP SGALEN,SGANAM+3 ;LN=-LENGTH,RH=FIRST LOC-1 DUMPED + ; OR PROJECT-PROGRAMMER NUMBER(DISK) + XP SGAEND,SGALEN+1 ;LAST WORD OF DUMP COMMAND LIST=0(SAVE AND GET) + XP SGAREN,SGAEND ; ALSO FIRST WORD FOR RENAME USED AS DELETE + XP SGAPPN,SGAREN+3 ;FOURTH WORD-PLACE TO SAVE PROJECT-PROGRAMEMR + ; NUMBER USER TYPED + +;FOR OPEN UUOS: + XP SGAMOD,10 ;IOS MODE WORD FOR OPEN UUO + XP SGADEV,SGAMOD+1 ;DEVICE NAME + XP SGAHED,SGAMOD+2 ;INPUT-OUTPUT BUFFER HEADER ADDRESSES=0 + +;MISC. DATA LOCATIONS: + + XP SGADMP,13 ;DUMP COMMAND IOWD + XP SGACOR,14 ;AC FOR CORE UUO'S(HIGHEST USER LOC DESIRED) + XP SGANEW,15 ;NEW CORE ASSIGNMENT AS SPECIFIED BY THIRD ARG + XP SGAHGH,16 ;LH=EXT TO USE FOR SAVING HIGH SEG + ; RH=EXT TO DELETE(IE SHRHGH OR HGHSHR) + XP SGALOW,17 ;LH=EXT WHICH USER TYPED FOR SAVE OR GET COMMAND + ; OR .SAV IF HE DIDN'T TYPE AN ARG WITH LEADING PERIOD + ; RH=0 + +;ROUTINE TO SCAN COMMAND STRING ARGUMENTS FOR SAVE,GET,RUN AND R +;COMAMNDS AND STORE THEM IN JOB DATA AREA WHICH MUST BE IN CORE +;WHEN SGSET IS CALLED FROM COMMAND DECODER +;CALL: MOVE TAC,INPUT BYTE POINTER +; MOVE TAC1,SIXBIT DEVICE NAME +; MOVE DAT,OUTPUT BYTE POINTER +; MOVE IOS,ADR. OF MONITOR JOB(SAVJOB,GETJOB,RUNJOB) +; MOVE PROG, ADR. OF JOB AREA +; PUSHJ PDP,SGSET + +C=BUFPNT + +INTERNAL FTLOGIN,FT2REL,FTDISK +EXTERNAL JOBCOR,JBTPRG + +SGSET: JUMPE TAC1,NOTENF ;NOT ENOUGH ARE IF NO DEVICE NAME + MOVEM TAC1,SGADEV(PROG) ;STORE DEVICE NAME + SKIPN TAC1,JBTPRG(ITEM) ;GET AUTOMATIC FILENAME, OR + PUSHJ PDP, CTEXT1 ;GET FILE NAME FROM COMMAND STRING + JUMPE TAC1,NOTENF ;THERE MUST BE A FILE NAME + MOVEM TAC1,SGANAM(PROG) ;STORE FILE NAME + MOVEM TAC1,JBTPRG(ITEM) ;SAVE FILE NAME FOR SYSTAT COMMAND + MOVEI TAC1,0 ;ASSUME USER DID NOT SPECIFY AN EXTENSION + ; 0 WILL BE TURNED INTO SAV OR DMP +IFE FTTTYSER,< LDB TEM,TAC> + CAIN TEM,"." ;IS AN EXTENSION SPECIFIED? + PUSHJ PDP,CTEXT ;YES. GET EXTENSION + HLLZM TAC1,SGAEXT(PROG) ;STORE IT FOR LOOKUP +IFN FT2REL,< + EXTERN SETEXT ;ALSO SAVE IT AGAIN IN SGALOW FOR LOW SEG + ; LOOKUP OR ENTER + PUSHJ PDP,SETEXT ;SET HIGH EXTENSION(SGAHIGH) TO .SHR IF SSAVE OR GET + ; .HGH IF SAVE(LH IOS=NSRBIT). +> + SETZM SGADAT(PROG) ;SET DATE(E+2) TO 0, SO MONITOR WILL USE TODAYS +IFN FTLOGIN,< + PUSHJ PDP,PJPGNO ;GET PROJ, PROG. NO. + MOVEM AC2,SGAPPN(PROG) ;STORE 0 IF NO []'S TYPED BY USER +> + PUSHJ PDP,DECIN1 ;AMOUNT OF CORE (OPTIONAL THIRD ARG.) + JRST SGSET1 ;DOES NOT RETURN IF ERROR. RETURN HERE IF NO ARG. + JRST COMERA ;ILLEGAL CHARACTER + LSH TAC,12 ;CONVERT TO HIGHEST REL. LOC. + SUBI TAC,1 +SGSET1: MOVEM TAC1,SGANEW(PROG) ;STORE FOR RUN AND SAVE + HRRZ TAC1,IOS ;SCHEDULE MONITOR JOB + ; GUARRANTEE LH OF PC WORD IS 0, SINCE IT WILL + ; BE ADDED TO STARTING ADDRESS(IF RUN COM) + JRST MSTART ;START JOB WITH PC IN MONITOR MODE + +;ROUTINE TO PICKUP ARGUMENTS FOR RUN AND GETSET UUOS +;THIS ROUTINE DOES SAME THING AS SGSET, EXCEPT THAT ARGUMENTS ARE +;OBTAINED FROM USER UUO ARGUMENTS INSTEAD OF FROM CONSOLE COMMAND +;THE USERS ARG ARE MOVED TO USER ACS(SGA...), THEREBY CLOBBERING HIS AC$S +;USER AC FIELD AND START PC OFFSET(RUN UUO) ARE SAVED ON PD LIST AT JOBPD3 +;THEN LOWER CORE IS SET UP(SG2 CALLED) RESET IS NOT DONE (FOR GETSEGUUO) +;JBTPRG NOT SET FOR LOW SET, SINCE GETSEGUUO SHOULD NOT +;CALL: MOVE TAC,CONTENTS OF USER AC(ADR. OF 3 WORD ARG LIST) +; MOVE PROG,JOB RELOCATION +; PUSHJ PDP,GETARG +; RETURN + + INTERN GETARG + EXTERN JBTPROG,JOBCORE,PUUOAC + +GETARG: HRR UUO,TAC ;MOVE ADR. OF ARG LIST TO UUO + EXCH TAC,(PDP) ;AND PUT ON PD LIST + PUSH PDP,TAC ;MOVE RETURN PC UP ONE IN PD LIST + LDB TAC,PUUOAC ;USER AC FIELD IN RUN OF GETSEG UUO + + HRRM TAC,-1(PDP) ;SAVE IN CASE OF ERROR RETURN + PUSHJ PDP,GETWDU ;GET FIRST ARG FROM USER AREA + MOVEM TAC,SGADEV(PROG) ;STORE DEVICE NAME + PUSHJ PDP,GETWD1 ;GET NEXT ARG FROM USER ARREA + MOVEM TAC,SGANAM(PROG) ;STORE FILE NAME FOR LOOKUP (DO NOT STORE FOR LOWSEG) + PUSHJ PDP,GETWD1 ;GET THIRD ARG(EXTENSION WORD E+1) + MOVE TAC1,TAC ;PUT ARG IN TAC1, SO SMAE AS SGSET RETURN FROM CTEXT + MOVEM TAC1,SGAEXT(PROG) ;STORE EXTENSION AND RH FROM USER +IFN FT2REL,< + EXTERN SETEX1 + PUSHJ PDP,SETEX1 ;SAVE EXT AGAIN IN SGALOW + ; SETUP EXT FOR HIGH SEG(SGAHGH="SHR") + ; SETUP EXTENSION FOR LOW SEG(SGALOW="SAV") +> + PUSHJ PDP,GETWD1 ;GET FOURTH ARG(DATE WORD) + MOVEM TAC,SGADAT(PROG) + PUSHJ PDP,GETWD1 ;GET FIFTH USER ARG FROM USER AREA + MOVEM TAC,SGAPPN(PROG) ;STORE PROJECT,PROGRAMMER NO. OR 0 + PUSHJ PDP,GETWD1 ;SIX ARG FROM USER + HRRZM TAC,SGANEW(PROG) ;STORE CORE ARG OR 0(HIGHEST LOC DESIRED) + ; IGNORE LH + JRST SG2A ;GO SET UP LOWER CORE AND RETURN + ; DO NOT DO A RESET + +;THIS JOB SAVES A JOB AREA ON RETRIEVABLE STORAGE +;THIS JOB RUNS IN EXEC MODE AND CALLS IO ROUTINES USING REGULAR UUOS +;NO ATTEMPT IS MADE TO SAVE STATUS OF IO DEVICES, JOBDP, OR AC'S +;IN FACT THE ONLY USEFUL THING WHICH MAY BE DONE WITH A JOB AREA +;AFTER IT HAS BEEN SAVED IS TO START EXECUTIUON OVER AT THE STARTING +;ADDRESS + +INTERNAL SAVJOB,SAVERR +EXTERNAL JOB41,JOBS41,JOBDDT,JOBSDD,JOBSV + +SAVJOB: JSP TAC1,SG1 ;SET UP ACS PROG,PDP,JDAT,ITEM. + ; RESET DEVICES + HLRE TAC1,SGADMP(PROG) ;-NO. OF WORDS TO WRITE + PUSHJ PDP,CKIOWD ;CHECK USER'S CORE ARG(IF ANY) WITH AMOUNT + ; RETURN ONLY IF 0 OR NOT SMALLER + HRRM TAC,JOBCOR(PROG) ;STORE MAX OF SIZE OF FILE OR CORE ARG + ; FOR ASSIGNING INITIAL CORE WHEN FILE GOTTEN +IFN FT2REL,< + EXTERN SAVHGH + PUSHJ PDP,SAVHGH ;INIT DEV,SAVE HIGH SEG, IF ANY, RETURN IF OK + JRST SAVFIN ;HIGH SAVED, BUT NO DATA IN LOW SEG, SO DO + ; NOT WRITE LOW FILE + ; SKIP RETURN IF LOW SEG TO BE WRITTEN +> + ; SGALEN, AND SGAEXT RESTORED +SAVJB1: OPEN 0,SGAMOD ;RE INIT DEVICE, SO UGETF WILL SET FIRST FREE + ; BLOCK BECAUSE NO LOOKUP OR ENTER DONE + JRST SGERRA ;DEVICE NOT AVAILABLE + UGETF 0,SGAHED ;GET FIRST FREE BLOCK(MEANINGFUL ONLY IF DTA) + ; CAUSE ENTER TO ASSIGN FIRST LOBCK OF FILE + ; AS LOWEST FREE BLOCK SO TENDMP CAN READ + ENTER 0,SGANAM ;ENTER FILE NAME IN DIRECTORY + JRST SAVERR ;DIRECTORY FULL OR PROTECTION FAILURE + MOVE TAC,JOB41(JDAT) ;SAVE USER UUO HANDLING JSR + MOVEM TAC,JOBS41(JDAT) ;IN UPPER PART OF JOB DATA AREA + + MOVE TAC,JOBDDT(JDAT) ;SAVE DDT STARTING ADDRESS HIGHER UP IN JOB DATA AREA + MOVEM TAC,JOBSDD(JDAT) ;SO COMPRESS ALWAYS MOVES CODE DOWN + HRROS USRHCU ;FLAG THAT SAVE GET IS UNDER WAY + ; SO THAT JOBHRL WILL NOT BE MODIFIED BY SETHGH RUOTINE + ; TO USER'S HIGH SEG RELOCATION INFO. SINCE + ; IT WILL CONTAIN COMPRESSION IOWD. + ; COMPRESSION WILL ALWAYS MOVE DOWN + HRRZ TEM,JOBSA(JDAT) ;SAV START ADDRESS FOR 10DMP + MOVEI TAC,JOBSV(PROG) ;POINT TO 1ST DATA WORD + MOVE TAC1,[XWD PROG,JOBSDD] ;IT STARTS AT JOBSDD + HLRE ITEM,SGADMP(PROG) ;IOWD FOR THIS SIZE CORE(-LENGTH TO WRITE) + MOVNS ITEM ;POSITIVE LENGTH + ADDI ITEM,JOBSVM ;ADD IN FIRST LOC-1 TO WRITE=HIGHEST LOC TO WRITE + ; TO MAKE END TEST + HRLI ITEM,PROG ;USE PROG FOR RELOCATION +CMPLP1: MOVEM TAC,DAT ;SAVE 1ST LOC FOR IOWD + CAMLE TAC1,ITEM ;SEARCH FOR 1ST NON-0 WORD + AOJA TAC,CMPTHR ;THROUGH + + SKIPN @TAC1 ;THIS A DATA WORD? + AOJA TAC1,.-3 ;NO, KEEP LOOKING + MOVNI AC1,1 ;YES, AC1 WILL BE AN IOWD + HRLI AC1,-1(TAC1) ;1ST LOCATION - 1 +CMPLP2: PUSH TAC,@TAC1 ;SAVE A DATA WORD + AOS TAC1 + CAMGE TAC1,ITEM ;AT TOP? + SKIPN @TAC1 ;NO. NEXT WORD NON-0? + JRST .+2 ;NO. THROUGH THIS BLOCK + SOJA AC1,CMPLP2 ;COUNT THE WORD AND CHECK NEXT + MOVSM AC1,(DAT) ;SAVE IOWD IN FRONT OF BLOCK + AOJA TAC,CMPLP1 ;LOOK FOR NEXT NON-0 BLOCK +CMPTHR: HRLI TEM,254000 ;SET A JRST C(JOBSA) + MOVEM TEM,-1(TAC) ;AT END OF FILE + SUBI TAC,JOBSV(JDAT) ;COMPUTE WORD COUNT + MOVNS TAC ;MAKE AN IOWD + HRL TAC,SGADMP(PROG) ;START ADDRESS + MOVSM TAC,SGALEN(PROG) ;IOWD FOR THE OUTPUT UUO + MOVEI TAC,-2 ;FLAG THAT CORE HAS BEEN COMPRESSED + HRLM TAC,USRHCU ;KEEP LH NEG. COMMAND DECODER WILL EXPAND + ; CORE ON START ,ODT,SAVE, REENTER,SSAVE IN CASE + ; THIS SAE IO DOES NOT GO TO COMPLETION. (CONTROL C + ; OR DEVICE FULL, SO THAT CORE DOES NOT GET EXPANDED + + PUSHJ PDP,SGDOA ;DO OUTPUT,RELEASE,FIND TTY + OUTPUT 0,SGALEN ;OUTPUT UUO EXECUTED BY SGDO + ; RETURN HERE ONLY IF NO ERRORS +SAVFIN: PUSHJ PDP,SGREL ;RELEASE DEVICE AND FIND TTY + JSP TAC,PHOLD ;PRINT MESSAGE AND STOP JOB + ASCIZ /JOB SAVED/ +SAVERR: MOVEI TAC,PRTERR ;ERROR CORE IN CASE RUN UUO(PROTECTION ERROR) + ; CHANGE TO DISK ERROR CODE IF DEV IS DSK + PUSHJ PDP,SGRELL ;CHANGE TO DISK ENTER ERROR CODE IF DSK + ; RELEASE DEVICE AND RETURN TO USER(IF RUN UUO) + ; OR FIND TTY=PRINT ?CRLF + JSP TAC,PHOLD ;PRINT MESSAGE AND STOP JOB + ASCIZ /DIRECTORY FULL/ + +;THIS JOB GETS A JOB AREA FROM A RETRIEVABLE DEVICE +;THIS JOB RUNS IN EXEC. MODE AND CALLS IO ROUTINES DIRECTLY +;NO ATTEMPT IS MADE TO RESTORE STATUS OF IO DEVICES, PC, OR AC'S +;JOBPC IS SET TO STARTING ADDRESS OF JOB +;CORE MUST ALREADY HAVE BEEN ASSIGNED AND THE FOLLOWING LOC. SETUP IN +;JOB DATA AREA: +;JOBPDP, JOBREL + +INTERNAL GETJOB + +GETJOB: JSP TAC1,SG1 ;SETUP ACS, SETUP LOWER CORE(SGALEN,SGADMP) + PUSHJ PDP,GETJB ;GET THE JOB + JSP TAC,PHOLD ;RETURN ONLY IF EVERYTHING OK + ASCIZ /JOB SETUP/ + +;THIS JOB GETS A JOB AREA FROM A RETRIEVAL DEVICE AND STARTS IT UP + +;JOB HAS JUST A JOB DATA AREA ASSIGNED WHEN CONTROL GETS HERE +;THIS MONITOR JOB GETS A JOB AREA FROM A RETRIEVABLE DEVICE +;ASSIGNS CORE AND START + +INTERNAL RUNJOB + +RUNJOB: JSP TAC1,SG1 ;SETUP ACS, SETUP LOWER CORE(SGALEN,SGADMP) + JRST URUN1 ;LH PF PC WORD=0(MSTART) SO LH OF TAC1=0 AFTER JSP + ; PUT TAC1 AS FIRST ITEM ON PD LIST(JOBPN1) + ; LH USED BY SGRELE ON ERROR TO SEE IF FROM USER + ; AND LH ADDED TO START PC(JOBSA) BY URUN + +;RUN UUO +;CALL: MOVE AC,[XWD N,D] +; CALL AC,[SIXBIT /RUN/] +; ERROR RETURN ;UNLESS LH=HALT(PRINT CONSOLE MESS, IF YES) +; 1K OK, TRANSFER TO C(JOBSA)+N FOR NEW PROGRAM +; USERS ACS CLOBBERED SO CANNOT PASS DATA TO NEW PROGRAM + +;WHERE: D/ DEVICE NAME +; D+1/ FILE NAME +; D+2/ FILE EXT OR 0 (LH SIXBIT) +; D+3/ DATE ETC +; D+4/ PROJECT,PROGRAMMER NO OR 0(CURRENT UFD OR DTA,MTA) +; D+5/ HIGHEST LOC DESIRED(OR 0) ANALOGOUS TO RUN COMMAND +; LH IS IGNORED(RATHER THAN ASSIGNING CORE TO HIGH SEG) + + INTERN URUN + EXTERN JOBSA + +URUN: PUSHJ PDP,RESET ;RELEASE DEVICES + ; WARNING! THIS GOES VERY DEEP IN + ; PUSHDOWN, SEE MOD 518 + ; (AC UUO PRESERVED IN RESET) + MOVE TAC,@UUO ;RESTORE CONTENTS OF USERS'S CALLING AC + PUSHJ PDP,GETARG ;GET 6 ARGS FROM USER AND STORE + ; SAVE STARTING ADDRESS INCREMENT(LH OF TAC) + ; AND USER AC NUMBER(IN CASE OF ERROR RETURN) + ; SETUP ACS,DEVDAT TO DDB + MOVE TAC,SGANAM(PROG) ;STORE FILE NAME FOR LOW SEG + MOVEM TAC,JBTPRG(ITEM) ;FOR SYSTAT +URUN1: PUSHJ PDP,GETJB ;GET BOTH LOW AND HIGH SEGMENTS + HLRZ TAC1,(PDP) ;GET STARTING ADDRESS INCREMENT(0 IF RUN COM) + +IFN FT2REL,< + EXTERN CHKMED + CAILE TAC1,1 ;IS START INCREMENT 0 OR 1? + PUSHJ PDP,CHKMED ;NO, CHECK TO SEE IF THIS IS SHARABLE SEG + ; AND IF YES, SET MEDDLE BIT FOR THIS USER + ; SO UWP CANNOT BE TURNED OFF AND CORE FOR HIGH SEG + ; CANNOT BE INCREASED OR DECREASED (TAC1 PRESERVED) +> + ADDB TAC1,JOBSA(JDAT) ;ADD STARTING ADDRESS TO BOTH + ; SO THAT C START WILL START + ; PROGRAM AT SAME STARTING ADDRESS + HRLI TAC1,USRMOD ;SET USER MODE BIT IN PC + PUSH PDP,TAC1 ;PUT ON PD LIST + JRST USRXIT ;AND GO TO RETURN TO USER AS IF FROM UUO + +;UUO TO GET JUST HIGH SEG AND RETURN TO USER +;CALL IS THE SAME AS FOR RUN UUO EXCEPT THAT OK RETURN IS SKIP RETURN +;IF ERROR RETURN HAS HALT IN LH, STANDARD CONSOLE MESSAGE IS PRINTED AND JOB STOPPED + + INTERN UGTSEG,UGTERR +UGTSEG: + +IFN FT2REL,< + EXTERN UGETHI + JRST UGETHI ;IN SEGCON +> +UGTERR: MOVEI TAC,ILUERR ;ILLEGAL UUO ERROR CORE + PUSHJ PDP,SGRELE ;SEE IF USER WANTS ERROR + JRST UUOERR ;NO, PRINT ILLEGAL UUO + +;ROUTINE TO SETUP ACS, RESET IO, AND SETUP LOWER CORE LOCATIONS +;FOR SAVE AND GET(SGALEN SET IO IOWD OR PP IF DTA OR DSK) +;SGADMP SET TO IOWD FOR THIS SIZE CORE +;CALL: JSP TAC1,SG1 +; ALWAYS RETURN HERE, UNLESS DEVICE NOT FOUND +; DEVDAT SETUP TO DEVICE DATA BLOCK(BUT NOT INITED, UNLESS FT2REL=0) +; SO THAT INIT NOT NECESSARTY IF SEG ALREADY KNOWN(NO DTA QUEUING) +; DEVICE CHARACTERISTICS WORD(DEVMOD) RETURNED IN AC TAC1 +; IF DISK SYSTEM + + INTERN SG1,SG3,SG4 ;CALLED FROM SEGCON + EXTERN USRDDT,USRREL,JOBSAV,JOBFF,CPOPJ1 + EXTERN TTYFNU,JOBSVM,IADRCK,SAVDMP + +SG1: JSP TAC,MONSTR ;SETUP PROG.PDP,JDAT,ITEM=JOB NUMBER + ; PUT TAC1 ON END OF PD LIST(EXEC MODE PC, + ; SO ERROR MESSAGES WILL ALWAYS PRINT(SEE SGRELE) + +SG2: PUSHJ PDP,RESET ;RELEASE ALL DEVICES +SG2A: MOVEI TAC,DR ;DUMP MODE 16(DUMP BY RECORDS + ; IN CASE THIS IS MAGTAPE) + + MOVEM TAC,SGAMOD(PROG) ;STORE FOR OPEN UUO + SETZM SGAEND(PROG) ;0 END OF DUMPE MODE COMMAND LIST + SETZM SGAREN+1(PROG) ;FOR DELETE + SETZM SGAREN+2(PROG) ;FOR DELETE + HLLZS JOBCOR(JDAT) ;0 THIRD ARG IN JOBDATA AREA(SO CHKARG WILL + ; WORD ON FIRST CALL(SAVE AND GET) + SETZM SGAHED(PROG) ;CLEAR BUFFER HEADER ARG, FOR OPEN UUO +IFE FT2REL,< + OPEN 0,SGAMOD ;TRY TO ASSIGN DEVICE, SINCE IT MUST BE DONE +> +IFN FT2REL,< + MOVE TAC,SGADEV(PROG) ;PHYSICAL OR LOGICAL DEVICE NAME + PUSHJ PDP,DEVSRC ;FIND DEVICE AND SETUP DEVDAT TO DDB + ; DO NOT INIT DEV SINCE IO MAY NOT BE NECESSARY + ; DO NOT WANT TO WAIT IN DTA SYSTEM + ; TAPE QUEUE IN 10/40 SYS +> + JRST SGERRA ;NOT AVAILABLE + ;DEVICE INITED(OR FOUND) + +;COMMON EXIT FROM SAVHGH AND GETHGH ROUTINES(HIGH SEG SAVE AND GET) +;SO THAT SGA... LOCATIONS ARE RESTOREED TO ORIGINAL VALUES FOR LOW SEG + +SG3: MOVE TAC,JOBFF(JDAT) ;FIRST FREE LOC IN JOB(SET FROM LH OF + ; JOBSA WHICH IS SET BY LOADER + MOVEI TAC,-1(TAC) ;MAKE LAST LOC TO SAVE OR GET(MAKE 0=777777) + SKIPN USRDDT ;USER DDT IN USE(IF YES, SAVE ALL OF CORE + ; SO HIS SYMBOLS WILL BE INCLUDED + PUSHJ PDP,IADRCK ;NO, ADDRESS TO SMALL OR TO LARGE? + MOVE TAC,USRREL ;YES, DUMP ALL OF CORE RATHER THEN GIVE + ; ADDRESS CHECK MESSAGE-HIGHEST REL.ADR. + MOVNS TAC ;-HIGHEST ADR TO SAVE TO GET + ADDI TAC,JOBSVM ;LOWER CORE NOT DUMPED + HRLI TAC,JOBSVM ;IE FIRST LOC-1 TO BE DUMPED + MOVSM TAC,SGADMP(PROG) ;STORE IOWD WORD OF THIS SIZE CORE +SG4: +IFN FTDISK,< + MOVE TAC1,DEVMOD(DEVDAT) ;RETURN DEVICE CHARACTERISTICS(IF DISK SYS) + TLNE TAC1,DVDSK ;IS THIS DEVICE A DISK? + + MOVS TAC1,SGAPPN(PROG) ;YES. MAKE SURE FORTH WORD IS PROJ,PROG NO. +> + MOVSM TAC,SGALEN(PROG) ;NO. MAKE SURE FORTH WORD IS IOWD FOR DECTAPE + ; SINCE DECTAPE USES RH TO COMPUTE LENGTH IN K + ; FOR BOTH SAVE AND GET + SKIPN TAC,SGAEXT(PROG) ;DID USER SPECIFY AN EXTENSION ? + MOVSI TAC,SAVDMP ;NO, USE .SAV OR .DMP + MOVEM TAC,SGAEXT(PROG) ;AND STORE FOR LOOK UP ORENTER + POPJ PDP, + +;ERROR ON INIT OR DEVICE SEARCH + + INTERN SGERRA ;CALLED FROM SEGCON + +SGERRA: JUMPE DEVDAT,SGERR1 ;WAS DEVICE FOUND, BUT JUST UNAVAILABLE? + MOVEM DEVDAT,(PDP) ;YES, SAVE DDB ADDRESS FOR MESSAGE(ERNAM) + MOVEI TAC,DNAERR ;ERROR CODE IN CASE RUN UUO(DEVICE NOT AVAILABLE) + PUSHJ PDP,SGRELE ;RETURN TO USER IF RUN UUO + ; OR FIND TTY AND PRINT ?CRLF + PUSHJ PDP,ERNAM ;PRINT DEVICE NAME USING (PDP) + JSP TAC,PHOLD ;START TTY AND STOP JOB + ASCIZ / NOT AVAILABLE/ + +SGERR1: MOVEI TAC,NSDERR ;ERROR CODE IN CASE RUN UUO(NO SUCH DEVICE) + PUSHJ PDP,SGRELE ;RETURN TO USER IF RUN UUO + ; OR FIND TTY AND PRINT ?CRLF + JSP TAC,PHOLD ;START TTY AND STOP JOB + ASCIZ /NO SUCH DEVICE/ + +;ROUTINE TO GET FILE FROM DEVICE(LOW AND/OR HIGH) +;CALL: ACS JDAT,PROG,PDP,DEVDAT SETUP +; MOVE ITEM,JOB NUMBER +; IFN FTDISK, +; PUSHJ PDP,GETJB +; RETURN ONLY IF EVERYTHING OK + +EXTERNAL JOBCOR,JOB,CPOPJ,JOBS41,JOB41 + +GETJB: +IFN FT2REL,< + EXTERN GETHGH + PUSHJ PDP,GETHGH ;SEE IF HIGH SEG ALREADY EXISTS AND BEING SHARED + ; IF NOT, TRY TO LOOKUP AND READ IN HIGH FILE + ; IF .SHR DOESN'T EXIST, TRY .HGH, IF NEITHER-SKIP RETURN + ; TAC1=DEVMOD(DEVDAT) IF DISK(DEV CHAR.) + JRST LOWFIN ;HIGH SEG NOW IN CORE AND NO LOW FILE NEEDED + ; LOW FILE NEEDED + ; EITHER BECUASE NOHIGH SEG + ; ORHIGH SEG ALSO NEEDS LOW FILE +> + LOOKUP 0,SGANAM ;LOOKUP LOW SEG FILE(EXT=SAV,DMP OR LOW(IF HIGH SEG + ; REQUIRES LOW SEG AND USER DID NOT TYPE EXT) + ; MODE=SAVMOD SO DECTAPE SERVICE WILL RETURN + ; IOWD IN E+3(TEMPORARY) + JRST NOFILE ;GO PRINT FILE.EXT NOT FOUND + HLRE TAC1,SGALEN(PROG) ;-NO. OF WORDS IN FILE + PUSHJ PDP,CKIOWD ;CHECK USER'S SUPPLIED CORE ARG TO MAKE SURE NOT + ;TOO SMALL, RETURN LARGER OF FILE SIZE OR CORE ARG + PUSHJ PDP,GETCOR ;OK, TRY TO GET CORE + MOVE TAC1,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS + MOVNS TAC + ADDI TAC,JOBSVM ;-WORD COUNT FOR ALL USERS CORE + TLNE TAC1,DVMTA ;MAG TAPE? + HRLM TAC,SGALEN(PROG) ;YES, USE USER-SPECIFIED CORE ARGUMENT + HRRZS JOBPD1(JDAT) ;TURN OFF USER MODE PC FLAG IN CASE THIS + ;IS A RUN UUO,SO ERRORS WILL NOT TRY TO RETURN + + PUSHJ PDP,SGDO ;READ IN FILE INTO LOW SEGMENT + INPUT 0,SGALEN ;EXECUTED FROM SGDO + MOVE TAC,JOBS41(JDAT) ;RESTORE USER UUO JSR LOC + MOVEM TAC,JOB41(JDAT) ;SAVED BY SAVE +LOWFIN: HRRZ TAC,JOBCOR(JDAT) ;CORE ARG FROM PREVIOUS SAVE(THIS MONITOR + ; ALWAYS STORES SOMETHING) + SKIP TAC ;IS THIS AN OLD FORMAT FILE WITH NO CORE ARG TO SAVE? + MOVE TAC,USRREL ;YES, USE ASSIGNMENT MADE WEN LOW FILE READ IN + PUSHJ PDP,CKSARG ;RETURN ONLY IF USER'S SUPLLIED ARG IS 0 OR NOT + ; SMALLER THAN SAVE CORE ARG. RETURN LARGER + PUSHJ PDP,GETCOR ;TRY TO GET THIS AMOUNT OF CORE + MOVE TAC,USRREL ;HIGHEST LOC ASSIGNED TO LOW SEG + HRRM TAC,JOBCOR(JDAT) ;SET INITIAL CORE ASSIGNMENT IN JOB DATA AREA FOR + ; USER TO USE TO RESET CORE TO INITIAL SETTING WHEN + ; PROGRAM IS RESTARTED + ; FALL INTO SGREL +;ROUTINE TO RELEASE DEVICE AND FIND TTY +INTERN SGREL + +SGREL: SKIPN DEVDAT,USRJDA ;HAS CHANNEL BEEN RELEASED ALREADY? + JRST SGREL2 ;YES, FIND TTY AND WAIT FOR OUTPUT TO FINISH + PUSH PDP,T4 ;NO, + MOVE TAC1,DEVMOD(DEVDAT) + TLNE TAC1,DVMTA ;MAGTAPE? + TLNN DEVDAT,INPB ;YES, WAS AN INPUT DONE? + JRST SGREL1 ;NO + CLOSE 0,CLSOUT ;YES, CLOSE MTA INPUT + STATO 0,IOTEND+IODEND ;AT END OF APTE? + MTAPE 0,16 ;NO SKIP TO EOF +SGREL1: RELEASE 0, ;NO RELEASE DEVICE + POP PDP,T4 +SGREL2: + JRST TTYFNU ;FIND TTY FOR CURRENT USER + +;ROUTINE TO EXECUTE DUMP MODE COMMAND LIST SETUP IN SGALEN(R) +;AND CHECK FOR ERRORS. USED ONLY TO READ LOW FILE. +;CALL: PUSHJ P,SGDO +; INPUT 0,SGALEN OR OUTPUT 0,SGALEN +; OK RETURN(NO ERRORS) +;SGDOA CALLED FROM SAVE, IT HAS ALREADY SET LH OF USRHCU=-2 +;TO INDICATE CORE IS COMPRESSED + + EXTERN USRHCU,USRJDA,JOBSA,JOBDDT,JOBSDD,JOBSD1,JOBSAV,JOBCOR + EXTERN JOBSV,JOBSV3,JOBSVD,JOBSDP + +SGDO: HRROS USRHCU ;SET LH OF USRCHU-1 AS A FLAG TO INDICATE SAVE GET + ; LOW FILE IO IN PROGRESS, SO MONITOR WILL + ; NOT STORE HIGH SEG PROTECTION IN JOBHRL WHICH + ; HAS IOWD FOR ZERO COMPRESSION +SGDOA: XCT @(PDP) ;EXECUTE INPUT OR OUTPUT UUO + MOVE ITEM,JOB ;READ INTO PROTECTED PART OF JOB DATA AREA + PUSHJ PDP,EXPAND ;EXPAND CORE IMAGE + JRST ADRERR ;ADDRESS CHECK, PRINT MESSAGE AND STOP JOB + MOVE TAC1,JOBDDT(PROG) ;COPY DDT STARTING ADR + MOVEM TAC1,USRDDT ;INTO MONITOR PROTECTED AREA(IN CASE THIS IS GET) + SETZM USRHCU ;FLAG THAT SAVE-GET IO FINISHED AND CORE EXPANDED + AOS (PDP) ;SKIP OVER UUO IN CALLING SEQUENCE + +;ROUTINE TO CHECK FOR IO ERRORS(CALLED FROM SEGCON) +;CALL: MOVE F,DEVICE DATA BLOCK ADDRESS +; PUSHJ P,SGIOCK +; RETURN ONLY IF NO ERRORS + + INTERN SGIOCK + +SGIOCK: MOVE T4,DEVIOS(DEVDAT) ;IO STATUS WORD FOR THIS DEVICE + TRNN T4,IOBKTL!IODTER!IODERR!IOIMPM ;ANY ERRORS ON SAVE-GET DEVICE? + POPJ PDP, ;NO, GIVE OK RETURN + MOVEI TAC,TRNERR ;YES, ERROR CODE IN CASE THIS IS RUN UUO + ; (TRANSMISSION ERROR) + PUSHJ PDP,SGRELE ;RELEASE DEVICE AND ERROR RETURN TO USER IF RUN UUO + ; OF FIND TTY AND PRINT ?CRLF + JSP TAC,PHOLD ;START TTY AND STOP JOB + ASCIZ /TRANSMISSION ERROR/ + +;ROUTINE TO EXPAND CORE AFTER A SAVE(LOW SEG ONLY) +;CALL: MOVE DEVDAT,DEVICE ADR. +; MOVE PROG,JOBADR. +; MOVE ITEM,JOB NUMBER +; PUSHJ PDP,EXPAND +; ERROR RETURN, ADR, CHECK, OR NEED CORE BUT NOT CURRENT USER(COMMAND +; DECODER EXPANDING AFTER USER HAS REDUCED CORE) +; OK RETURN, CORE EXPANDED +;CALLED FROM SAVE AND COMMAND DECODER +;START,CSTART,DDT,REENTER,SAVE,SSAVE COMMANDS IF CORE STILL COMPRESSED + +EXPAND: HLRE AC3,SGALEN(PROG) ;-LENGTH OF FILE + MOVNS AC3 ;-LENGTH OF FILE + ADDI AC3,JOBSVM ;ADD FIRST LOC-1 TO FORM HIGHEST LEGAL ADR. + HRLI AC3,PROG ;PUT PROG IN LH FOR COMPARE + ; AC3 SET FOR ADDRESS CHECKING BELOW + SKIPL TAC,JOBSV(PROG) ;IF FIRST LOC IS POSITIVE + JRST SGDO1 ;OLD FORMAT, SO DONT EXPAND + HRRZS TAC ;LOOK AT 1ST WORD OF FILE + CAILE TAC,JOBDDT ;IS IT BELOW JOBJDA? + JRST EXPND1 ;NO. NEW COMPRESSED FORMAT + CAIE TAC,JOBSAV ;IS JOBDDT THE DATA WORD? + JRST EXPND1 ;NO. EXPAND + SKIPN JOBSV3(JDAT) ;IS THE SAVE FILE FROM CONVERT? + ; CONVERT DOES NOT ZERO COMPRESS + ; IT JUST WRITES ENTIRE FILE WITHH 1 IOWD IN FRONT + SOJA AC3,SGDO1 ;YES, GO BLT DATA DOWN AS IF OLD DISK SAVE FILE + ; (NON-COMPRESSED) + HRROI TAC,JOBSD1 ;YES. CHANGE TO IOWD 1,JOBSDD + EXCH TAC,JOBSV(PROG) ;ZEP, THE IOWD IS FIXED + HLRES TAC ;WORD COUNT OF IOWD + AOJE TAC,EXPND1 ;JUST 1 DATA WORD - THROUGH + MOVSI TAC,1(TAC) ;MAKE IOWD N-2,JOBSAV + JUMPE TAC,EXPZ + HRRI TAC,JOBSAV ;SO NEXT DATA WDS WILL BE SKIPPED + MOVEI TAC1,JOBSV(PROG) + MOVEM TAC,2(TAC1) ;STORE IN COMPRESSED DATA + JRST EXPND1 +EXPZ: MOVSI TAC,-2 + HLLM TAC,JOBSV(PROG) + +;COME HERE TO DO THE ACTUAL EXPANSION OF A FILE +EXPND1: MOVE TAC,[XWD PROG,JOBSV] ;IT WAS READ INTO JOBSV + MOVE TAC,@TAC ;FIRST IOWD +EXPLP1: HRRZ AC1,TAC1 ;ADDRESS OF IOWD + CAIGE AC1,JOBSAV ;LEGAL? + AOJA AC1,TOOLOW ;NO. DELETE DATA WHICH IS TO LOW + HLRE AC1,TAC1 ;YES. GET WORDCOUNT + MOVNS AC1 ;+N + HRLM AC1,TAC1 ;CONVERT IOWD TO +N IN LH + ADDI TAC,1(AC1) ;ADDRESS OF NEXT IOWD. + CAMLE TAC,AC3 ;IN BOUNDS? + JRST SGDOER ;NO. COMPLAIN + ADDI TAC1,(AC1) ;YES. CHANGE RH OF IOWD + EXCH TAC1,@TAC ;MAKE IT XWD +N,A+N-1 AFTER DATA BLOCK + JUMPL TAC1,EXPLP1 ;CONTINUE IF NEXT THING IS AN IOWD + PUSH PDP,TAC ;SAVE DATA LOCATION + HRRZ TAC,@TAC ;TOP REAL LOCATION NEEDED + + TRO TAC,1777 ;MAKE IT NK-1 + + HLRZ TAC1,PROG ;PRESENT SIZ OF LOW SEG + CAMG TAC,TAC1 ;IS THERE ENOUGH? + JRST EXPCOR ;YES. + CAME ITEM,JOB ;NO, IS TIS THE CURENT JOB? + JRST SGDOER ;NO, GIVE ERRROR RETURN, MUST BE COMMAND DECODER + ; DOING EXPAND AFTER USER HAS REDUECED CORE + PUSHJ PDP,GETCOR ;YES. GET IT +EXPCOR: POP PDP,TAC1 + MOVEI AC1,@TAC1 ;TOP DATA LOC + HRLI AC1,1(AC1) ;SET TO ZERO TO TOP OF CORE + HRRI AC1,2(AC1) + SETZM -1(AC1) + HRLI TAC,PROG ;RELOCATE TOP LOC OF JOB + BLT AC1,@TAC ;ZAP, CORE IS 0 FROM HERE ... + HRROI TAC,@TAC1 ;FORM DATA POINTER +EXPLP2: HRRZ AC1,(TAC) ;TO DATA POINTER + ADDI AC1,(PROG) ;RELOCATE + HLRZ AC2,(TAC) ;WORD COUNT + SUBI TAC1,1(AC2) ;POINT TAC1 TO PREVIOUS IOWD + SETZM (TAC) ;ZERO THIS IOWD + SOSA TAC ;POINT TO DATA +EXPLP3: SOS AC1 + CAIGE AC1,JOBSDD(PROG) ;DON'T STORE DATA BELOW JOBSDD + SOSA TAC + POP TAC,(AC1) ;MOVE A DATA WORD + SETZM 1(TAC) ;ZERO WHERE IT CAME FROM + SOJG AC2,EXPLP3 ;LOOP IF MORE DATA + CAMLE TAC1,[XWD PROG,JOBSV] ;THROUGH? + JRST EXPLP2 ;NO, DO NEXT BLOCK + EXCH AC2,JOBSDD(PROG) ;YES, ZERO JOBSDD + MOVEM AC2,JOBDDT(JDAT) ;SET USER DDT STR ADR + JRST SGDO2 ;AND SETUP USRDDT IN MONITOR PROTECTED + ; FROM THIS USER + +;THIS ROUTINE WILL DELETE ALL DATA FROM A COMPRESSED FILE +;WHICH IS BELOW JOBSOD (PROBABLY WRITTEN BY TENDUMP) + +TOOLOW: HLRE AC2,@TAC ;WORDCOUNT OF OFFENDING IOWD + SUB AC1,AC2 ;ADDRESS+N + CAIG AC1,JOBSDD ;IS ANY DATA IN IT LEGAL? + AOJA TAC,NXIOWD ;NO, TEST NEXT IOWD + SUBI AC1,JOBSDD ;YES, NUMBER OF WORDS TO KEEP + MOVNS AC2 ;TOTAL NUMBER OF WORDS + SUB AC2,AC1 ;NUMBER OF WORDS TO DROP + HRLS AC2 ;INTO BOTH HALVES + ADD AC2,@TAC ;NEW IOWD FOR ONLY GOOD DATA + ADDI TAC,(AC2) ;POINT TAC TO LAST BAD DATA LOC + MOVEM AC2,@TAC ;STORE UPDATED IOWD OVER IT + JRST IOWBLT ;GO BLT OVER BAD DATA +NXIOWD: SUB TAC,AC2 ;POINT TAC TO NEXT IOWD + HRRZ AC1,@TAC ;GET ADDRESS + CAIGE AC1,JOBSD1 ;LEGAL? + AOJA AC1,TOOLOW ;NO, AT LEAST PART OF THE DATA IS LOW +IOWBLT: MOVSI TAC,@TAC ;YES, KEEP THE ENTIRE IOWD DATA + HRRI TAC1,JOBSV(PROG) ;TAC1 IS A BLT POINTER + SUBI TAC,JOBSV ;RH OF TAC IS AMOUNT BEING DELETED + SUBI AC3,(TAC) ;AC3 POINTS TO TOP OF DATA READ IN-(N) + BLT TAC1,@AC3 ;MOVE ONLY GOOD DATA DOWN + JRST EXPND1 ;GO EXPAND THE GOOD DATA + +SGDO1: MOVEI TAC,JOBDDT(PROG) ;MOVE EVERYTHING DOWN )MUST BE NON-COMPRESSED DSK FILE + HRLI TAC,JOBSVD(TAC) ;OR CONVERT SAVE FILE + SKIPGE JOBSV(JDAT) ;IS THIS CONVERT FILE(FIRST WORD IS IOWD)? + HRLI TAC,JOBSDP(TAC) ;YES, ALSO SKIP OVER IOWD + SUBI AC3,JOBSVD + BLT TAC,@AC3 +SGDO2: AOSA (PDP) ;SET FOR OK RETURN +SGDOER: POP PDP,TAC + SETZM JOBHCU(JDAT) ;CLEAR LH AND SET HIGHEST USER CHAN, IN + ; USE TO 0(WHERE IT SHOULD BE ANYWAY) + POPJ PDP, ;ERROR RETURN OR OK RETURN + +;ROUTINE TO CHECK USER SUPPLIED CORE ARG AND CHECK TO SEE IF 0 +;OR GREATER THAN OR EQUAL TO IOWD USED TO SAVE OR GET FILE +;CALL: HLRE TAC1,-NO. OF WORDS IN FILE +; PUSHJ PDP,CKIOWD +; RETURN WITH LARGER OF 2 POSITIVE NOS. IN TAC(1777 ORED IN) +; DO NOT RETURN IF CORE ARG SUPLLIED BY USER IS TOO SMALL +;CALLED FROM SAVE AND GET + + EXTERN JOBSVM + +CKIOWD: MOVEI TAC,JOBSVM ;FIRST LOC-1 READ OR WRITTEN IN USER AREA + HRRM TAC,SGALEN(PROG) ;RESTORE RH TO JOBSAV AFTER LOOKUP + SUB TAC,TAC1 ;HIGHEST LOC=FIRST LOC-1+LENGTH OF FILE + ; FALL INOT CHSARG + +;ROUTINE TO CHECK USER SUPPLIED CORE ARG AND CHECK IF 0 +;OR GREATER THAN OR EQUAL TO CORE ARG FOR PREVIOUS SAVE +;CALL: HRRZ TAC,JOBCOR(JDAT) ;WRITTEN WHEN FILE SAVED +; PUSHJ PDP,CKSARG +; RETURN WITH LARGER OF 2 IN AC TAC, ONLY IF USER ARG NOT TOO SMALL +;CALLED ONLY FROM GET AFTER JOB DATA AREA LOADED FROM FILE(JOBCOR) OR HIGH SEG + + INTERN NROOM1 ;CALLED FROM SEGCON + +CKSARG: IORI TAC,1777 ;MAKE SURE 1K-1 + CAMG TAC,SGANEW(PROG) ;IS USER SUPPLIED CORE ARG BIGGER? + SKIPA TAC,SGANEW(PROG) ;YES, RETURN IT + SKIPN SGANEW(PROG) ;NO, DID USER SUPPLY ONE + POPJ PDP, ;NO, RETURN LARGER OF TWO +;ROUTINE TO PRINTE #K OF CORE NEEDED +;CALL: MOVE TAC,HIGHEST REL. USER ADR. +; PUSHJ PDP, NROOM1 +; NEVER RETURN + +NROOM1: PUSH PDP,TAC ;YES, ERROR, USER'S SUPPLIED CORE ARG TOO SMALL +NOROOM: MOVEI TAC,NECERR ;ERROR CODE IN CASE THIS IS RUN UUO(NOT ENOUGH CORE) + PUSHJ PDP,SGRELE ;RELEASE DEVICE AND ERROR RETURN TO USER IF RUN UUO + ; OR FIND TTY AND PRINT ?CRLF + HRRZ TAC,(PDP) ;GET AMOUNT OF CORE REQUESTED + LSH TAC,-12 ;CONVERT TO NO. OF 1K BLOCKS-1 + PUSHJ PDP,DECP1 ;ADD 1 TO TAC AND PRINT DECIMAL + JSP TAC,PHOLD ;START TTY ADN STOP JOB + ASCIZ /K OF CORE NEEDED/ + +;ROUTINE TO ASSIGN CORE FOR LOW AND HIGH SEG +;CALL: MOVE PROG,LOW SEG RELOCATION +; HRR TAC,HIGHEST LOC DESIRED +; PUSHJ PDP,GETCORE +; RETURN ONLY IF ASSIGNED + + INTERN GETCOR + +GETCOR: HRRZM TAC,SGACOR(PROG) ;SOTRE CORE ARG FOR CORE UUO IN USER AC + PUSH PDP,TAC ;SAVE IN CASE OF ERROR + CALLI SGACOR,11 ;DO CORE UUO + JRST NOROOM ;NOT AVAILABLE, PRINT ERROR AND AMOUNT TRYING FOR + JRST TPOPJ ;OK, REMOVE TAC FROM PD LIST AND RETURN + +;ROUTINE TO PRINT NOT A SAVE FILE IF WRONG FORMAT FILE DETECTED + +INTERN GETERR + +GETERR: MOVEI TAC,NSFERR ;ERROR CODE IN CASE THIS IS RUN UUO(NOT SAVE FILE) + PUSHJ PDP,SGRELE ;RELEASE DEVICE AND ERROR RETURN TO USER IF RUN UUO + ; OR FIND TTY AND PRINT ?CRLF + JSP TAC,PHOLD ;START TTY AND STOP JOB + ASCIZ /NOT A SAVE FILE/ + +;ROUTINE TO PRINT FILE NOT FOUND ORNEEDS 2 RELOC REG + +INTERN NOFILE ;CALLED FROM SEGCON + +NOFILE: MOVEI TAC,FNFERR ;ERROR CODE IN CASE THIS IS RUN UUO(FILE NOT FOUND + ; CHANGE ERROR CODE TO DISK ERROR CODE IF DEV IS DSK + PUSHJ PDP,SGRELL ;RETURN DISK LOOKUP OR ENTER ERROR CODE IF DSK + ; RELEASE DEVICE AND ERROR RETURN TO USER IF HE WANTED + ; OR FIND TTY AND PRINT ?CRLF + MOVE TAC1,SGANAM(PROG) ;PRINT FILE NAME + PUSHJ PDP,PRNAME + PUSHJ PDP,PRPER ;PRINT PERIOD + HLLZ TAC1,SGAEXT(PROG) ;PRINT EXTENSION + PUSHJ PDP,PRNAME + JSP TAC,PHOLD ;START TTY AND STOP JOB + ASCIZ / NOT FOUND/ + +;ROUTINE TO RELEASE DEVICE ON AN ERROR AND CHECK TO SEE +;IF THIS IS A MONITOR COMMAND OR USER UUO +;IF USER UUO, GIVE ERROR RETURN TO USER UNLESS THERE IS A HALT +;IN LH OF EROR RETURN WORD, IN WHICH CASE FIND TTY, PRINT ?CRLF +;AND RETURN TO CALLER SO CAN ADD MORE INFO TO ERROR MESSAGE AND STOP JOB +;CALL: MOVEI TAC,ERROR CODE(DEFINED IN S.MAC) +; PUSHJ PDP,SGRELE +;DO NOT RETURN TO CALLER IF USER WANTS ERROR RETURN ON RUN AND GETSEG UUOS + + EXTERN JOBPD1,JOBPD3,USRJDA + +SGRELL: ;LOOKUP OR ENTER FAILURE +IFN FTDISK,< + MOVE TAC1,DEVMOD(DEVDAT) ;IS THIS DEVICE A DISK? + TLNE TAC1,DVDSK + HRRZ TAC,SGAEXT(PROG) ;YES, RETURN DISK SERVICE ERROR CODE +> +SGRELE: MOVE TAC1,JOBPD1(JDAT) ;GET FIRST PC ON PD LIST + TLNN TAC1,USRMOD ;IS IT IN USER MODE(IE USER UUO)? + + JRST SGRLE1 ;NO. MUST BE MONITOR COMMAND OR CALLED OVERLAYED + ; RELEASE DEVICE, FIND TTY, AND RETURN TO CALLED + PUSH PDP,TAC ;SAVE ERROR CORE + HRR UUO,TAC1 ;ADDRESS OF RETURN AFTER RUN OF GETSEG UUO + PUSHJ PDP,GETWDU ;GET ERROR RETURN WORD FROM RUN OR GETSEG UUO + HLRZ TAC1,TAC ;GET OP CODE + POP PDP,TAC ;RESTORE ERROR CODE + CAIN TAC1,(HALT) ;IS LH HALT? + JRST SGRLE1 ;YES, RELEASE DEVICE,FIND TTY, AND RETURN TO CALLER + HRR UUO,JOBPD3(JDAT) ;NO, AC NUMBER OF RUN OR GETSEG UUO + PUSHJ PDP,STOTAC ;STORE ERROR NUMBER IN USER AC + SKIPE USRJDA+0 ;DO NOT RELEASE CHANNEL 0 IF NOT INITED YET + ; UUO HANDLER DOES NOT ALLOW THIS FROM EXEC MODE + RELEAS 0, ;RELEASE DEVICE(IF INITED) + JRST USRXIT ;AND RETURN TO USER TO HANDLE ERROR + +SGRLE1: PUSHJ PDP,SGREL ;RELEASE DEVICE AND FIND TTY + JSP TAC,CONMES ;PRINT ?CRLF AND RETURN TO CALLER + ; WHO WILL PRINT REST OF ERROR MESSAGE AND STOP JOB + ASCIZ /? +/ +COMEND: END ;END OF COMCON + diff --git a/src/common.mac b/src/common.mac new file mode 100644 index 0000000..a458ba8 --- /dev/null +++ b/src/common.mac @@ -0,0 +1,1601 @@ + +TITLE COMMON - MONITOR COMMON DATA AREA AND CONFIGURATION DEFINITION - V437 +SUBTTL PART 3 COMMON.MAC - T. HASTINGS/RCC TS 03 JUN 69 +XP VCOMMN,437 + ;PUT VERSION NUMBER IN GLOB AND LOADER STORAGE MAP + +REPEAT 0, < + +;THE COMMON SUBPROGRAM CONSISTS OF 3 FILES ASSEMBLED TOGETHER AS ONE SUBPROGRAM: + 1. S.MAC - THE USUAL SYSTEM SYMBOL DEFINITIONS ASSEMBLED WITH + EVERY MONITOR SUBPROGRAM + 2. CONFIG.MAC - THE CONFIGURATION DEFINITION FILE GENERATED BY THE + CONFIGURATION PROGRAM (MONGEN) OR BY AN EDITOR (SEE ABOVE) + 3. COMMON.MAC - THE REST OF THIS PROGRAM WHICH IS THE SAME SOURCE FOR + ALL CONFIGURATIONS. HOWEVER, THE ASSEMBLIES ARE CONDITIONED BY + SYMBOLS AND MACROS DEFINED IN 2. + THE FOLLOWING SYMBOLS AND TABLES ARE GENERATED BELOW: + + A. MONITOR STARTUP LOCATIONS (140-147), HENCE LOAD THIS FIRST. + B. JOB TABLES - LENGTH DEPENDENT ON MAXIMUM NUMBER OF JOBS ALLOWED + C. ALL VARIABLE STORAGE NOT ASSOCIATED WITH A PARTICULAR DEVICE + D. COMMON SUBROUTINE RETURNS + E. COMMON BYTE POINTERS + F. TABLE OF SERVICE ROUTINE INTERRUPT LOCS TO BE LINKED BY ONCE ONLY CODE + G. TABLE OF DEVICE DATA BLOCK ADDRESSES AND NUMBER TO BE USED BY ONCE TO LINK + THEM TOGETHER AND GENERATE MULTIPLE COPIES. + H. ASSIGNMENT OF PI CHANNELS + I. PI CHANNEL SAVE AND RESTORE ROUTINES + J. UUO TRAP LOCATIONS 40/41, 60/61 + K. SYSTEM CRASH STOP CONI'S. +> + ;THE FOLLOWING STANDARD SYMBOLS CAN BE SUPERCEDED BY A CUSTOMER +;HAVING PREVIOUSLY DEFINED THEM ON THE CONFIG.MAC FILE USING +;MONGEN PROGRAM + + +IFNDEF LISTSN, ;FORCE S.MAC TO BE LISTED WITH COMMON FILE ONLY + ;UNLESS 'LISTSN' DEFINED TO BE 0 WITH MONGEN +IFNDEF APRSN, ;SERIAL NUMBER OF APR + +;STANDARD MAG TAPE DENSITY(556 BPI),PARITY(ODD-BINARY) + INTERN STDENS ;STANDARD MAG TAPE DENSITY(556 BPI),PARITY(ODD-BINARY) + IFNDEF STDENS, ;STAND. == BINARY AT 556 BPI + ;STDENS==D+P WHERE D AND P ARE: + ;D==1(200 BPI);D== (556 BPI);D==3(800 BPI) + ;P==0(ODD-BINARY PARITY);P=4(EVEN-BCD PARITY) + INTERN JIFSEC ;NO. OF CLOCK TICKS(JIFFIES) PER SECOND + IFNDEF JIFSEC, ;STAND.==60 JIFFIES PER SEC. + XP HNGSEC,2*JIFSEC + + INTERN DTTRY ;NO. OF TIMES TO TRY ON DECTAPE ERRORS + IFNDEF DTTRY, ;STAND.==4 TRIES + + INTERN MTSIZ ;SIZE OF MAGTAPE RECORDS(DATA WORDS IN BUFFER+1) + IFNDEF MTSIZ, ;STAND.==128 WORDS PER BUFFER + + INTERN LPTSIZ ;SIZE OF LPT BUFFER(NO. OF DATA WORDS+2) + IFNDEF LPTSIZ, ;STAND.==24 WORDS PER LPT BUFFER + + INTERN BLKQNT ;MAX. NO OF CONSECUTIVE DECTAPE BLOCKS SEARCHED BEFORE + ; RESCHEDULING IF ANOTHER JOB IS WAITING TO USE CONTROL. + IFNDEF BLKQNT, ;STAND.==50 DT BLOCKS SEARCHED(3 SECS.) + + INTERN NSPMEM ;NO OF NANO-SECONDS PER MEMORY CYCLE + IFNDEF NSPMEM, ;STAND.==1760 NANO-SECONDS PER MEMORY CYCLE +INTERNAL JIFSC2,JIFMIN,WDPJIF + JIFSC2==JIFSEC/2 ;HALF NO. OF JIFFIES IN A SEC (FOR ROUNDING) + JIFMIN==JIFSEC*^D60 ;NO., OF JIFFIES PER MINUTE + WDPJIF==^D100000/NSPMEM*^D5000/JIFSEC ;NO. OF WORDS MOVED + IFNDEF MINCOR, ;DISK DDB AND ACCESS ENTRY + ; ALLOCATION REQUIRMENTS IN FREE CORE + ;USED TO EXPAND SIZE OF MONITOR AT ONCE ONLY TIME + ;32 WORDS/DDB AND 4 WORDS/ACCESS ENTRY = 36 WORDS + ;ASSUME 1.5 OPEN FILE/JOB + +INTERN LOGSIZ +IFNDEF LOGSIZ, ;MINSIZ OF VIRTUAL CORE LEFT + ;AND STILL ALLOW LOGIN. MUST BE + ;AT LEAST AS BIG AS LOGIN CUSP IN K. + ;(STANDARD = 2K) + ;SYSTEM INITIALIZATION DISPATCH TABLE, STARTING AT LOCATION 140 +;THIS SUBROUTINE MUST BE LOADED FIRST +;ROUTINE "ONCE" IS ONCE ONLY CODE. IT CONVERTS THE DATE +;AND SETS UP I/O SERVICE CHAIN, + + EXTERN SYSINI,SYSMAK,NULJOB,ONCE,JSR2 + INTERN SYSDSP,SYSDDT + + COMORG=140 ;ORIGIN OF COMMON IS 140 + LOC COMORG ;MAKE LISTING BE SAME AS LOADING SO IT WILL BE EASY + ;TO EXAMINE SYSTEM LOCATIONS WITH CONSOLE SWITCHES + ;WITHOUT NEEDING A STORAGE MAP + +SYSDSP: JRST SYSINI ;INITIALIZE SYSTEM VARIABLES ONCE ONLY +SYSDDT: +IFG DDTN, < ;IF EXEC DDT IS LOADED..... + EXTERN PATSYM + JRST PATSYM ;YES, EXEC DDT(PATCH SYMBOL TABLE POINTER FIRST) + +> + IFE DDTN, < + HALT . ;NO. EXEC DDT +> + JRST SYSMAK ;MAKE NEW SYSTEM + JRST SYSINI ;INITIALIZE SYSTEM VARIABLES ALWAYS + JEN NULJB1 ;ERROR RECOVERY + JSR ONCE ;DO ONCE ONLY CODE OVER AGAIN + JRST JSR2 ;BYPASS ONCE ONLY OPERATOR DIALOGUE + ;(IN CASE CONSOLE TTY DOWN) +SYSCRS: JRST SYSTOP ;STOP MONITOR IN CASE OF DISASTER + ;SYSTEM DATA STORAGE + +;SPECIAL ABSOLUTE LOCATIONS IN LOWER MEMORY + + INTERN SYSSNP,FORTY,NULDAT,SIXTY,NULPDL,ERRPDL,KT10A,RCXIOC,RCXCCW,DDTSYM + INTERN T30SYM,RAXIOC,RAXCCW,CRSHWD + + RAXIOC=26 ;XWD 0,ADDRESS FOR RA-10'S DATA CHANNEL + ; MUST BE EVEN AND .LT. 777 + RAXCCW=RAXIOC+1 ;XWD CONTROL WORD ADDRESS,DATA ADDRESS + ; STORED ON CHANNEL TERMINATION + CRSHWD=30 ;NORMALLY THIS WORD WILL BE 0. IF IT IS + ;ACCIDENTALLY OR PURPOSEFULLY OVERWRITTEN + ;THE MONITOR WILL ATTEMPT TO SAVE THE + ;AC'S AND THE STATE OF ALL DEVICES, + ;[A LA 147 RESTART] + KT10A=33 ;COPY OF CONTENTS OF RELOCATION AND PROTECTION + ; DONE BY DATAO APR + ; NEEDED BECAUSE KT10A MOD DOES NOT COME WITH + ; LIGHTS FOR 2ND REG. + RCXIOC=34 ;INITIAL CONTROL WORD FOR DATA CHANNEL + ; (TRANSFERS CHANNEL TO SEQUENCE OF IOWD'S IN DSKINT) + ; MUST BE IN EVEN LOC IN FIRST 1K OF MEMORY + RCXCCW=RCXIOC+1 ;CHANNEL STORES FINAL CONTROL WORD + ; HERE ON TERMINATION + SYSSNP=37 ;WHEN DEPOSITED NON-ZERO,PRINTS SNAP SHOT OF SYSTEM + ; ON LPT SEE LPSNAP SUBPROGRAM + DDTSYM=36 ;CONTAINS ADDRESS OF POINTER TO EXEC DDT SYMBOL TABLE + FORTY=40 ;PLACE WHERE UUOS ARE STORED ON TRAP + NULDAT=42 ;JOB DATA AREA FOR NULL JOB (USES EXEC + ; 62 THRU 101 20-36 FOR DUMP AC) + ; AND ABOVE FOR PUSHDOWN LIST + SIXTY=60 ;PLACE WHERE UNIMPLEMENTED INSTR. ARE STORED ON + ; TRAP (PDP-10 ONLY) + NULPDL=101 ;PUSH DOWN LIST FOR NULL JOB + ; USES EXEC LOCS 102 THRU 137 + ; USED FOR RE-SCHEDULING WHEN CURRENT JOB + ; GOES INTO IO WAIT + ERRPDL=120 ;PUSH DOWN LIST FOR ERROR IN NULL JOB + T30SYM=131 ;PLACE IN 10/30 JOB DATA AREA WHERE SYMBOL TABLE + ; POINTER IS STORED BY REGULAR 10/30 LOADER + ; (MOVED TO DDTSYM BY ONCE) + ;PROTECTED JOB DATA STORAGE AND OTHER LOCATIONS SET EACH TIME +;A NEW JOB IS RUN (SEE APRSER-CLKINT) + + INTERN SYSBEG,SYSBG1,SYSEND + +SYSBEG: ;FIRST LOCATION CLEARED ON 143 RESTART (SEE SYSINI) +XP SYSBG1,SYSBEG+1 + + INTERN JOB,JOBADR,JOBDAT,USRREL,USRSAV + +JOB: 0 ;CURRENT JOB RUNNING AT UUO LEVEL +JOBDAT: ;LOC OF CURRENT JOBS JOB DATA AREA + ; SAME AS JBTDAT AND AC JDAT +JOBADR: 0 ;XWD PROTECTION,RELOCATION FOR CURRENT JOB + ;SAME AS JBTADR(JOB) AND AC PROG +USRREL: 0 ;LH==0, RH CONTAINS CONTENTS OF PROTECTION REGISTER + ;LOW ORDER BITS==1777, IE THIS IS HIGHEST REL. LOC + ;IN CURRENT USER AREA (USED FOR ADDRESS CHECKING) +USRSAV: 0 ;TEMPORARY FOR UUO HANDLER (IMPURE ROUTINE!) + +;LOCATIONS COPIED FROM JOB DATA AREA INTO MONITOR WHEN A JOB RUNS +;THIS PREVENTS THE USER FROM CLOBBERING THEM AND MAKES IT +;EASIER FOR THE MONITOR TO LOCATE THESE QUANTITIES WHEN IT +;NEEDS TO FOR THE CURRENT JOB +;CONTENTS ARE COPIED BACK WHEN JOB BECOMES INACTIVE (SEE CLOCK) +;COMPARE WITH JOB DATA AREA (SEE JOBDAT) +;THE FOLLOWING LOCATION MUST BE IN SAME ORDER AS JOBDAT + + INTERN USRPRT,USRPR1,USRPC,USRDDT,USRHCU,USRSAV,USRJDA,USRLO,USRLO1,USRHI + +USRPRT: ;FIRST LOCATION OF PROTECTED JOB DATA + USRPR1==USRPRT+1 ;FIRST LOCATION+1 + +USRHCU: 0 ;HIGHEST USER I/O CHANNEL IN USE + ;0 MEANS EITHER NONE OR CHANNEL 0 IN USE + ;LH=-1 DURING GET OF LOW OR HIGH SEG OR SAVE OF HIGH SEG + ;SETREL ROUTINE DOESN'T STORE IN JOBHRL(11$) WHEN NEG, + ;LH=-2 DURING SAVE OF LOW SEG AS FLAG THAT CORE + ; IS COMPRESSED. + ;ONLY CHANNEL ASSIGNMENTS IN USE ARE COPIED INTO + ; MONITOR WHEN JOB RUNS +USRPC: 0 ;JOB PC WHEN SCHEDULER IS CALLED +USRDDT: 0 ;RH==STARTING ADDRESS OF USER DDT, LH UNUSED +USRJDA: BLOCK 20 ;RH==JOB DEVICE ASSIGNMENTS (DEVICE DATA + ; BLOCK ADDRESSES) + ;LH==UUO'S DONE SO FAR FOR THIS CHANNEL (SEE SYSPAR) + ;0 MEANS NO DEVICE INITIALIZED ON THIS CHANNEL + USRLO==USRJDA ;FIRST LOC CLEARED BY SETUSR ROUTINE + ;ON A CALL [SIXBIT /RESET/] + ;ALSO CLEARS USRHCU + USRLO1==USRLO+1 ;FIRST LOC+1 + USRHI==.-1 ;LAST LOC CLEARED BY SETUSR ROUTINE + +;OTHER SYSTEM DATA STORAGE + + INTERN COMCNT,CLKFLG,TIMEF,APRERR,APRPC,SCHEDF + INTERN CORLST,CORTAL,HOLEF,SHFWAT + INTERN FTTRPSET,FTSLEEP,FTTIME,FTSWAP,FT2REL,FTDISK + INTERN HNGTIM,CIPWT,CIPWTM,NULERR,POTLST + +COMCNT: 0 ;NUMBER OF COMMANDS TYPED-IN BUT NOT DECODED + ;SET BY SCNSER, DECREMENTED BY COMCON +HNGTIM: 0 ;HUNG DEVICE TIME COUNT CHECK FOR HUNG I/O + ;DEVICES WHEN THIS GOES TO ZERO (ONCE PER HNGSEC) +CLKFLG: 0 ;NON-ZERO WHEN CLK INTERRUPT FORCED FOR ANY REASON +TIMEF: 0 ;NON-ZERO FOR CLOCK INTERRUPT ON APR + ;SET BY APRSER, TESTED AND CLEARED BY CLK ROUTINE +APRERR: 0 ;APR ERROR BITS ON NON-EX MEM, ETC. + ;SET BY APRSER, CLEARED BY CLK ROUTINE (CLOCK) +APRPC: 0 ;PC WHEN APR ERROR DETECTED +SCHEDF: 0 ;FORCED RESCHEDULING FLAG FOR CLK ROUTINE + ;USED TO FORCE RESCHEDULING WHEN JOB IS IN EXEC MODE +NULERR: 0 ;SET NON-ZERO IF MONITOR DETECTS ERROR WHILE + ; NULL JOB IS RUNNING +POTLST: 0 ;-1 WHEN SCHEDULER SEES THAT THERE ARE + ;JOBS WHICH ARE POTENTIALLY RUNABLE BUT + ;HAS TO RUN NULL JOB. + ;0 WHEN IT FINDS A REAL JOB TO + ;RUN OR NULL JOB IS ONLY JOB WHICH WANTS TO + ;RUN. 'LSTWRD' IS INCREMENTED EVERY JIFFY + ;IF THIS FLAG IS -1 AND PREVIOUS JOB WAS NULL JOB. + IFN FTTRPSET,< + INTERN STOPTS +STOPTS: 0 ;STOP TIME SHARING OTHER USERS BECAUSE JOB 1 DID + ;A TRPSET UUO WITH NON-ZERO AC(IE SET LOWER CORE + ; PI TRAP LOCATION,ALSO STOP CORE SHUFFLING +> + SLJOBN=0 ;NUMBER OF JOBS IF NO SLEEP FEATURE + IFN FTSLEEP, ;LEAVE ONE ENTRY PER JOB +CIPWT: BLOCK SLJOBN+3 ;CLOCK REQUEST QUEUE + ; LH-MONITOR ADDRESS TO PUSHJ TO AT CLOCK LEVEL + ; WHEN BITS 24-35 COUNT DOWN TO ZERO + ; BITS 18-23 ARE DATA SET IN AC TAC WHEN PUSHJ DONE + ; BITS 24-35 ARE NUMBER OF CLK TICKS LEFT TO GO + CIPWTM=CIPWT-1 ;FIRST LOC-1 OF CLOCK QUEUE + ;STORAGE FOR VARIOUS CORE ALLOCATION FUNCTIONS + + INTERN NSWTBL,NSWMXL,CORTAB,CORMAX,CORLST,CORTAL,SHFWAT + INTERN UPTIME,SHFWRD,STUSER,HIGHJB,CLRWRD,LSTWRD,FTTRACK + + +NSWTBL: ;FIRST LOCATION OF MONITOR DATA STORAGE + ; RETURNED BY GETTAB UUO (THESE LOCATIONS + ; PRESENT IN NON-SWAPPING SYSTEMS TOO) + ; OCTAL NUMBERS IN () CORRESPOND TO GETTAB ARG +CORTAB: BLOCK 10 ;(0-7) BIT=1 IF CORRESPONDING K OF CORE IN USE BY + ; ACTIVE,IDLE, OR DORMANT HIGH OR LOW SEGS OR NON-EX + XP CORBLK,^D256 + ;NUMBER OF BITS IN CORE TABLE +CORMAX: 0 ;(10)MAX. CORE REQUEST+1(IE LARGEST REL. ADR.+1) + ; CAN BE RESTRICTED TO LESS THEN ALL OF USER CORE + ; BY BUILD AND/OR ONCE + + +CORLST: 0 ;(11) 1 BIT BYTE POINTER TO LAST FREE BLOCK POSSIBLE + ; SET BY SYSINI ON 143 STARTUP +CORTAL: 0 ;(12) TOTAL NUMBER OF FREE+DORMANT+IDLE CORE BLKS LEFT +SHFWAT: 0 ;(13) JOB NUMBER SHUFFLER HAS TEMPORARILY STOPPED + ;UNTIL ITS IO DEVICES TO BECOME INACTIVE BEFORE SHUFFLING +HOLEF: 0 ;(14) ABSOLUTE ADDRESS OF LOWEST HOLE IN CORE, 0=NONE +UPTIME: 0 ;(15) NUMBER OF CLOCK TICKS SINCE SYSTEM LOADED OR + ; RESTARTED AT 143 +SHFWRD: 0 ;(16) TOT NO. OF WORDS SHUFFLED BY SYSTEM +STUSER: 0 ;(17) JOB CURRENTLY USING THE SYSTEM TAPE + ; NEEDED SO CONTROL C WILL NOT TIE UP SYSTEM TAPE +HIGHJB: 0 ;(20) HIGHEST JOB NUMBER CURRENTLY ASSIGNED +CLRWRD: 0 ;(21) TOTAL NO. OF WORDS CLEARED BY 'CLRCOR' RTN. +LSTWRD: 0 ;(22) TOTAL NO. OF CLOCK TICKS WHEN NULL JOB RAN + ; BUT OTHER JOBS WANTED TO RUN AND COULD NOT + ; DO SO BECAUSE: --- + ; 1. SWAPPED OUT OR ON WAY IN OR OUT + ; 2. MONITOR WAITING FOR I/O TO STOP SO + ; IT CAN SHUFFLE OR SWAP + ; 3. JOB BEING SWAPPED OUT BECAUSE IT IS + ; EXPANDING CORE + + ;INSERT NEW LOCATIONS HERE WHICH ARE OF INTEREST + ; TO USERS IN NON-SWAP AND SWAP SYSTEMS +NSWMXL=<.-NSWTBL-1>B26 ;MAXIMUM ENTRY FOR GETTAB SHIFTED LEFT 9 + +;CORE ALLOCATION DATA NOT AVAILABLE VIA GETTAB +IFN FTTRACK, + ;DATA LOCATIONS PRESENT ONLY IN SWAPPING SYSTEMS + + IFG SYS50N, < ;SWAPPING SYSTEM ? + INTERN SWPTBL,SWPMXL,BIGHOL,FINISH,FORCE,FIT,SWPERC,VIRTAL + INTERN FULCNT,MAXSIZ,MAXJBN,SUMCOR +SWPTBL: ;FIRST LOCATION OF MONITOR DATA STORAGE + ; RETURNED BY GETTAB UUO (THESE LOCATIONS + ; PRESENT ONLY IN SWAP SYSTEMS) + ; OCTAL NUMBERS IN () CORRESPOND TO GETTAB ARG +BIGHOL: 0 ;(0) CURRENT BIGGEST HOLE IN CORE (1K BLOCKS) +FINISH: 0 ;(1) IF +, THEN JOB NUMBER OF JOB BEING SWAPPED IN, + ;IF -, THEN JOB NUMBER OF JOB BEING SWAPPED OUT +FORCE: 0 ;(2) JOB NUMBER BEING FORCED TO SWAP OUT +FIT: 0 ;(3) JOB NUMBER WAITING TO BE FITTED INTO CORE +VIRTAL: 0 ;(4) NUMBER OF FREE 1K BLOCKS OF SWAPPING SPACE LEFT + ; (COUNTING DORMANT SEGMENTS AS IF FREE). + ; PRINTED WITH CORE COMMAND (NO ARG) OR ERROR + ; USUALLY THE SAME AS THE AMOUNT OF VIRTUAL CORE + ; LEFT IN SYSTEM, EXCEPT WHILE R,RUN,KJOB,GET + ; COMMAND ARE WAITING TO BE SWAPPED IN, BECAUSE + ; THE OLD DISK SPACE HAS NOT BEEN RETURNED YET, + ; BUT VIRTUAL CORE IS ONLY 140 WORDS FOR SWAPIN +SWPERC: 0 ;(5) LH= NUMBER OF SWAPPER READ OR WRITE FAILURES + ; RH= ERROR BITS (BITS 18-21) + NUMBER OF K OF + ; DISCARDED SWAPPING SPACE + + + + ;INSERT NEW LOCATIONS HERE WHICH ARE OF INTEREST + ; TO USER PROGS IN SWAPPING SYSTEMS +SWPMXL=<.-SWPTBL-1>B26 ;MAXIMUM ENTRY FOR GETTAB SHIFTED LEFT 9 + ;MORE SWAPPING SYSTEM LOCATIONS (NOT RETURNED BY GETTAB) + +FULCNT: 0 ;PRINT DISK IS FULL EVERY 30 SECONDS +MAXSIZ: 0 ;SIZE OF LARGEST JOB WHICH MIGHT BE SWAPPED OUT +MAXJBN: 0 ;NUMBER OF THAT JOB +SUMCOR: 0 ;TEMPORARY STORAGE CELL USED BY SWAPPER FOR SUM OF + ; CORE NEEDED FOR SWAP IN + IFN FT2REL,< + INTERN SWPIN,SWPOUT +SWPIN: 0 ;JOB NUMBER BEING SWAPPED IN IF IT HAS A HIGH SEG + ; USED TO REMEMBER THE JOB NUMBER DURING HIGH SEG +SWPOUT: 0 ;JOB NUMBER BEING SWAPPED OUT IF IT HAS A HIGH SEG + ; USED TO REMEMBER THE JOB NUMBER DURING HIGH SEG +> + INTERN FTTRACK +IFN FTTRACK, < + INTERN LASIN,LASOUT + +LASIN: 0 ;LAST JOB OR HIGH SEG SWAPPED IN +LASOUT: 0 ;LAST JOB OR HIGH SEG SWAPPED OUT + ; ABOVE TWO FOR DEBUGGING ONLY +> +> + +;DEFINE BLOCK FOR BIT TABLE DENOTING 4 WORD BLOCKS AVAILABLE (=0), IN USE (=1) +; USE MULTIPLES OF 4*^D36 WORDS SO THE TABLE WILL HAVE A MULTIPLE OF ^D36 BITS +; ADD 7 WORDS TO ACCOMODATE A POSSIBLE 1K BEYOND MINCOR AMOUNT + +IFG DSKN, < +INTERNAL DDBTAB,MINCOR + +DDBTAB: BLOCK +1+7 +> + + ;MONITOR TABLES WITH ONE ENTRY PER JOB + + INTERN JBTSTS,JBTADR,JBTDAT,JBTNAM,JBTPRG + INTERN JOBMAX,JBTMAX,MJOBN,JBTAD1,JOBMXL,JBTMXL + INTERN FTTIME,FTKCT,FTPRV + + JOBMAX==JOBN-1 ;MAXIMUM LEGAL JOB NUMBER + JOBMXL==B26 ;HIGHEST JOB NUMBERSHIFTED LEFT 9 (FOR GETTAB UUO) + MJOBN==-JOBN ;NEGATIVE NUMBERS OF JOBS (COUNTING NULL JOB) + IFG KT10AN, ;IF ANY HIGH SEGMENTS, + ; MUST HAVE AT LEAST AS MANY AS JOBS + JBTMAX==JOBN+SEGN-1 ;HIGHEST INDEX IN JBT TABLES + JBTMXL=B26 ;HIGHEST JBT ENTRY SHIFTED LEFT 9 (FOR GETTAB UUO) +JBTSTS: BLOCK JOBN+SEGN ;JOB AND HIGH SEG STATUS WORD + ;LH==STATUS BITS (SEE S.MAC FOR DESCRIPTION) + ;RH==QUANTUM RUN TIME LEFT (SEE CLKCSS) FOR LOW SEGS + ;RH=IN CORE COUNT FOR HIGH SEGS +JBTADR: BLOCK JOBN+SEGN ;JOB AND HIGH SEG CORE ASSIGNMENT + ; LH==PROTECTION (LENGTH-1) + ; RH==RELOCATION (ABSOLUTE LOCATION IN CORE) + JBTAD1==JBTADR+1 ;ADDRESS OF JOB 1 (USED BY SYSMAK) + JBTDAT==JBTADR ;RH==ADDRESS OF JOB DATA AREA + ;SAME AS JBTADR (JDAT==PROG) +JBTSGN: IFG SEGN, < + BLOCK JOBN ;RH=SEGMENT NUMBER OF HIGH SEGMENT THIS JOB + ; IS USING IN CORE OR ON DISK + ; 0 MEANS JOB DOES NOT HAVE HIGH SEG + ;LH=USER DEPENDENT HIGH SEG STATUS BITS (SEE S.MAC) + XP ITMSGN,ITEM+JOBMXL ;LH SYMBOL FOR GETTAB UUO +> + IFE SEGN, < + 0 ;SINGLE-ENTRY NULL JBTSGN TABLE.... + XP ITMSGN,JOBMXL ;LH SYMBOL FOR GETTAB UUO SO THAT JBTSGN IS + ; UNDEFINED, I.E., MAKE INDEXING BY ITEM BE 0, BUT + ; ALLOW REFERENCES UP TO JOBMXL. +> + IFG DSKN, < ;DISK SYSTEM ? + INTERN PRJPRG,JBTDIR +JBTDIR: ;HIGH SEGMENT DIRECTORY NAME (DSK) OR PHYSICAL + ; DEVICE NAME (DTA,MTA) +PRJPRG: BLOCK JOBN+SEGN ;XWD PROJECT NUMBER,PROGRAMMER NUMBER +> + IFE DSKN, > + IFN FTTIME, < + INTERN RTIME,TTIME +RTIME: BLOCK JOBN ;TOTAL RUN TIME SINCE LAST IJOB OR RUNTIME +TTIME: BLOCK JOBN ;TOTAL RUN TIME SINCE LAST IJOB +> + + IFG SYS50N,< ;SWAPPING SYSTEM ? + INTERNAL JBTSWP,JBTCHK +JBTSWP: BLOCK JOBN+SEGN ;LH:==PROTECT TIME WHILE JOB IS IN CORE. + ; DISK ADDRESS WHILE SWAPPED OUT + ;BIT 0=1 IF SEGMENT IS FRAGMENTED + ; BITS18-26:==OUTCORE IMAGE SIZE + ; BITS27-35:==INCORE IMAGE SIZE + ; FOR HIGH SEG, LH ALWAYS DISK ADDRESS + JBTCHK: BLOCK JOBN+SEGN ;CHECK SUM FOR SWAPPED OUT JOB DATA AREA OR + ; SAME AREA FOR HIGH SEG + +> +JBTNAM: ;NAME OF HIGH SEGMENT (FILE IT WAS INITIALIZED FROM) +JBTPRG: BLOCK JOBN+SEGN ;NAME OF FILE USED IN LAST R,RUN,GET, ETC + ; USED BY SYSTAT PROGRAM + IFN FTKCT, < + INTERN JBTKCT +JBTKCT: BLOCK JOBN ;PRODUCT OF CORE LENGTH (IN K) TIMES NUMBER OF JIFFIES + ; PROGRAM USED CPU. USED FOR TIME ACCOUNTING. +> + IFN FTPRV, < + INTERN JBTPRV +JBTPRV: BLOCK JOBN ;PRIVILEGE BITS FOR JOB SET BY LOGIN +> + IFG DSKN, < + INTERN MQUEUE,MQTOP + +MQUEUE: BLOCK JOBN ;DISK MONITOR I/O QUEUE + MQTOP=. ;LAST LOC+1 OF MONITOR QUEUE +> + IFG SYS50N, < +;THE FOLLOWING ARE USED TO CREATE MXQUE +;THE MAXIMUM QUEUE SIZE, USED BY SWAPPING SCHEDULER (SCHED) + FTDISK=-DSKN ;DEFINE FEATURE SWITCH FTDISK,SINCE IT APPEARS + ; IN MACRO QUEUES + ; WHICH IS DEFINED IN S.MAC + XP MXQUE,0 + + LALL ;LIST QUEUE DEFINITIONS FOR ALL TO SEE + + DEFINE X + QUEUES +DEFINE X (A) + + + CODES + MXQUE==MXQUE+3 + + XALL ;BACK TO NORMAL MACRO EXPANSION + + INTERN JBTQ,JBTQM1,JBTQP1,JBTQMN + + BLOCK MXQUE ;NUMBER OF QUEUES FOR SWAPPING SCHEDULER +JBTQ: BLOCK JOBN ;ONE ENTRY PER JOB, + ; LH=PREVIOUS JOB, RH=NEXT JOB IN QUEUE + ; NEGATIVE MEANS THIS IS FIRST (LH) OR LAST (RH) + ; JOB IN QUEUE + JBTQM1==JBTQ-1 ;JBTQ-1 + JBTQP1==JBTQ+1 ;JBTQ+1 + JBTQMN==JBTQ-NULZ ;J1 +> + ;TTY TRANSLATOR TABLE +;INDEXED BY TTY LINE NUMBER, CONTAINS TTY DDB ADDRESS IN RH +;(ASSIGNED WHEN FIRST CHARACTER TYPED ON TTY BY SCNSER + ;BIT 0==1 IF COMMAND TYPED BUT NOT PROCESSED + ;BITS 6-11==JOB NUMBER TTYP IS ATTACHED TO + ;BITS 12-17==NEXT LINE NUMBER IN TALK RING OR ITS SELF IF NOT TALKING + + INTERN TTYTAB,PTYTAB,TPYTAB,TCONLN,MLTTYL,MTTYLN,TTPLEN,TTMODL,TTPMXL + +TTYTAB: BLOCK HGHLIN+1+1 ;NO OF TTYS PLUS CTY + TPYTAB==.-1 ;ADDRESS OF LAST ENTRY + TCONLN==.-1-TTYTAB ;LINE NUMBER OF CTY + BLOCK PTYN ;PSEUDO TTY TRANSLATOR TABLE + ; THIS IS FOR LINKED TTY LINES, + ; NOT THE DEVICE "PTYN"'S DDB + TTPLEN==.-TTYTAB ;LENGTH OF ENTIRE TABLE + TTPMXL=B26 ;HIGHET ENTRY IN TTYTAB SHIFTED LEFT 9(FOR GETTAB UUO) + + MLTTYL==-JOBN ;NEG, NO OF TTY DDBS (ONE FOR EACH JOB, PLUS 1 ETRA + ; SO JOB CAPACITY EXCEEDED MESSAGE CAN BE TYPED + MTTYLN==-TTPLEN ;NEG, LENGTH OF ENTIRE TRANSLATOR TABLE + +PTYTAB: BLOCK PTYN+1 ;ADDRESS OF THE DDBS FOR DEVICE PTYN + ; NOT THE LINKED TTY LINES. SEE TPYTAB. +;LAST LOCATION CLEARED BY SYSINI ON 143 RESTART + SYSEND==.-1 + ;ONCE ONLY CODE TO CREATE DEVICE DATA BLOCKS + + LOC SYSBEG ;PUT IN SYSTEM DATA AREA SO NOT TO TAKE + ; VALUABLE SPACE. THIS AREA IS CLEARED + ; BY SYSINI AFTER IT HAS BEEN EXECUTED + +;CNTDB- ROUTINE TO INCREASE SIZE OF MONITOR FOR MULTIPLE DEVICE DATA BLOCKS +; BOTH DISK AND OTHER DEVICES (DTA,MTA,SCN,PTY) +; CALL: JSP TAC,CNTDB (FROM LONG ONCE DIALOG) +; +;LINKDB- ROUTINE TO CREATE MULTIPLE DEVICE DATA BLOCKS (EXCEPT DISK) +; AND LINK THEM. THESE ARE STORED ON TOP OF ONCE ONLY CODE +;CALL: JRST LINKDB (FROM LINKSR) +;BOTH ROUTINES UPDATE SYSSIZ AS MORE DDB SPACE IS CONSUMED + + INTERN LINKDB,CNTDB + EXTERN LINKSR + +LINKDB: SETOM DESONC ;PERMIT DESTRUCTION OF ONCE ONLY CODE + SKIPA TAC,LINKSR ;GET JSRPC OF CALLER OF LINKSR IN ONCE +CNTDB: SETZM DESONC ;PREVENT DESTRUCTION OF ONCE ONLY CODE + ;SO THAT E.G. SAT TABLES MAY BE SCANNED + HRRM TAC, LINKED ;STORE EXIT FROM THIS ROUTINE (ONCE ONLY CODE WILL + ; BE OVERLAYED BY MULTIPLE DEVICE DATA + ; BLOCK GENERATION) + MOVSI TAC,INTNUM ;NEG NUMBER OF ENTRIES IN TABLE + MOVEI DEVDAT,DEVLST-DEVSER ;MAKE DEVLST LOOK LIKE DEVSER IN A DOB +LOOP: MOVE TAC1,INTTB1(TAC) ;GET NEXT DEVICE DATA BLOCK ADDRESS + JUMPE TAC1,NEXT ;0 MEANS NO DOB FOR DEVICE + SKIPE DESONC ;OK TO DESTROY ONCE ONLY CODE ? + HRLM TAC1,DEVSER(DEVDAT) ;YES, STORE IN PREVIOUS DEVICE DATA BLOCK + HRRZ DEVDAT,TAC1 ;MAKE DEVDAT POINT TO CURRENT DOB + LDB UUO,DDBNUM ;GET NUMBER OF DDB'S + SOJLE UUO,NEXT ;ONE OR LESS ? + HRRZ JBUF,DEVDAT ;NO, CREATE MULTIPLE COPIES OF DOB + ; SAVE ORIGINAL IN JBUF + MOVEI AC3,1 ;STARTING WITH DEV1,DEV2,DEV77 + LDB AC1,PUNIT ;START UNIT NUMBER FROM + ; ASSEMBLE DEVICE DATA BLOCK + ; PTY STARTS UNIT NUMBER AT 1 INSTEAD OF 0 + ; ALTHOUGH DEVICE NAMES ARE PTY0,PTY1,ETC. + MULDDB: HRRZ TAC1,SYSSIZ ;ADR. OF NEXT DDB IS AT END OF MONITOR + SKIPE DESONC ;OK TO DESTROY ONCE ONLY CODE ? + HRLM TAC1,DEVSER(DEVDAT) ;YES, MAKE PREVIOUS DDB POINT TO THE ONE ABOUT TO BE CREATED + HRL DEVDAT,JBUF ;SOURCE ADDRESS TO LH + HRR DEVDAT,TAC1 ;DESTINATION ADDRESS TO RH + HLRZ AC2,INTTB1(TAC) ;LENGTH OF DEVICE DATA BLOCK + ADDB AC2,SYSSIZ ;LAST LOCATION+1 AFTER MOVE + SKIPN DESONC ;OK TO DESTROY ONCE ? + JRST JUSTCT ;NO, JUST COUNT DDB SPACE + BLT DEVDAT,-1(AC2) ;MOVE ORIGINAL TO FREE STORAGE + SKIPL INTTAB(TAC) ;IS THIS DECTAPE (ANY OF 3 SERVICES)? + JRST NOTDTA ;NO + HRRZ AC2,DEVDAT ;YES,DESTINATION + SUBI AC2,(JBUF) ;-SOURCE=DISTANCE MOVED + ADDM AC2,14(DEVDAT) ;INCREMENT POINTER TO DIRECTORY BLOCK + ; (SORRY ABOUT NO SYMBOL) +NOTDTA: MOVE PROG,PHYNAM ;BYTE POINTER TO NEWLY CREATED + ; DDB PHYSICAL NAME + + MOVE ITEM,AC3 ;MAKE COPY OF UNIT NUMBER + TRNN ITEM,70 ;IS IT 10 OR MORE ? + JRST SMALL ;NO + ROT ITEM,-3 ;YES, CONVERT HIGH ORDER OCTAL DIGIT TO + ADDI ITEM,20 ;SIXBIT + IDPB ITEM,PROG ;AND STORE + TRZ ITEM,-1 ;CLEAR OUT HIGH ORDER DIGIT + ROT ITEM,3 ;MOVE LOW ORDER DIGIT BACK +SMALL: ADDI ITEM,20 ;CONVERT LOW ORDER DIGIT IN SIXBIT + IDPB ITEM,PROG ;AND STORE IN PHYSICAL NAME + ADDI AC1,1 ;INCREMENT BINARY UNIT NUMBER + DPB AC1,PUNIT ;STORE UNIT NUMBER +JUSTCT: CAIGE AC3,(UUO) ;COMPARE WITH HIGHEST DEVICE NUMBER + AOJA AC3,MULDDB ;DO ANOTHER COPY +NEXT: AOBJN TAC,.+1 ;MOVE BY TWOS + AOBJN TAC,LOOP ;ANY MORE DEVICES + MOVEI TAC,0 ;NO, FLAG END OF DEVICE DATA BLOCK CHAIN WITH 0 LINK + SKIPE DESONC ;OK TO DESTROY ONCE ? + HRLM TAC,DEVSER(DEVDAT) ;YES, STORE 0 IN CASE LAST DDB IS MULTIPLE +IFG DSKN, < + EXTERNAL LOCORE,CRINIT + MOVE TAC,SYSSIZ ;SIZE OF MONITOR SO FAR (SYSMAK, EXEC DDT OR NOT) + MOVEM TAC,LOCORE ;SAVE POINTER TO FIRST 4 WORD BLOCK + ADDI TAC,MINCOR ;MINIMUM REQUIRED FOR DISK DDBS + IORI TAC,1777 ;FORCE TO 1K BOUNDARY + ADDI TAC,1 + MOVEM TAC,SYSSIZ ;STORE SIZE OF MONITOR (FIRST FREE LOC) + SUB TAC,LOCORE ;FORM LENGTH OF EXCESS CORE + IDIVI TAC,^D144 ;MUST BE MULTIPLE OF 144. WORDS (SEE DDBTAB) + MOVN TAC,TAC ; -N + HRLM TAC,CRINIT ;STORE USEABLE LENGTH OF DDBTAB +> +LINKED: JRST . ;RETURN TO SYSINI + +DESONC: 0 ;FLAG =0 IF CALLED BY JSP TAC,CNTDB + ; (DO NOT DESTROY ONCE) + ; FLAG NON-ZERO IF CALLED BY JRST LINKDB + ; (OK TO DESTROY ONCE CODE) +DDBNUM: POINT 8,INTTAB(TAC),8 ;POINTER TO DDB NUMBER +PHYNAM: POINT 6,DEVNAM(DEVDAT),17 ;BYTE POINTER TO DB PHYSICAL NAME + + ;MACROS TO DEFINE PI CHANNEL NUMBER AND GENERATE INTERRUPT CHAINING +;INFORMATION FOR ONCE +;SO IT CAN LINK THE DEVICE INTERRUPT SERVICE ROUTINES AND THE DEVICE DATA BLOCKS +;TABLE INTTAB IS GENERATED WITH PAIRS OF ENTRIES FOR EACH DEVICE +;WHICH HAS A DEVICE DATA BLOCK(0-7) +;FIRST WORD: BIT 0==1 IF DECTAPE,BITS 1-9==NO. OF DDBS, BITS 9-17==PI CHANNEL(0-7) +;0 MEANS NO PI CHANNEL (EG PTY) +;SECOND WORD:LH==0 IF SINGLE DEVICE,==LENGTH OF DDB IF MULTIPLE, RH==DDB ADDRESS + +;MACRO FOR DEVICES WHICH ARE ALWAYS PRESENT(AND WHICH DO NOT USE A CHANNEL SAVE ROUTINE +;AND HAVE NO DDB (EX-APR,CTY,PEN,CLK) + +DEFINE SPASGINT (DEV,PI) < + DEV'N==1 + ASGINT DEV,PI +> + +DEFINE ASGINT (DEV,PI) < + IFG DEV'N, , <.CHAS==1 ;CHANNEL PI IN USE.> + INTERNAL DEV'CHN + DEV'CHN==PI + EXTERNAL DEV'INT ;INTERRUPT SERVICE CONSO INSTRUCTION + XWD PI,DEV'INT ;GENERATE INTERRUPT ENTRY POINT FOR ONCE + XWD 0,0 ;NO DDB TO CHAIN TOGETHER + ASGIN1 DEV,\PI +> +>> + +DEFINE ASGIN1 (DEV,PI) < + IFDEF CH'PI, < ;WAIT TILL PASS 2 TO DEFINE + DEV'CHL==CH'PI + INTERNAL DEV'CHL +>> + +;MACRO FOR OPTIONAL DEVICES WHICH ALWAYS USE A CHANNEL SAVE ROUTINE +; (EXAMPLES: CDR, DSK, PTR, ETC. ALSO PTY WITH 0 PI) + +DEFINE SPASGSAV (DEV,PI,NUM) < + DEV'N==NUM + ASGSAV DEV,PI +> + +DEFINE ASGSAV (DEV,PI) < + IFG DEV'N, + EXTERN DEV'DDB + ASGSV1 (DEV,\PI) + >> + ;MACRO FOR: 1. COMPLETION OF THE DEFINITION REQUIRED FOR THOSE +; DEVICES INVOKING THE ASGSAV MACRO +; +; 2. COMPLETE DEFINITION FOR THOSE DEVICES WITH THEIR +; INTERRUPT ENTRY POINT AND DDB'S HERE IN COMMON +; (EXAMPLE: LPT'S) + +DEFINE ASGSV1 (DEV,PI) < + IFG PI, < + IFE , <.CHAS==1 ;CHANNEL PI IN USE.> + DEV'CHN==PI ;DEFINE DEVICE CHANNEL NUMBER + INTERN DEV'CHN ;DECLARE INTERNAL - ONLY IF DEVICE WANTED + USED'PI==1 ;SET FLAG SO THAT A CHANNEL SAVE + ; ROUTINE WILL BE GENERATED FOR + ; THIS PI CHANNEL + IFDEF SAV'PI, < ;WAIT TILL CHANNEL SAVE ROUTINES + ; ARE DEFINED BELOW (IN PASS 2) + + DEV'SAV==SAV'PI ;CHANNEL AC SAVE ROUTINE LOCATION + DEV'RET==RET'PI ;CHANNEL AC RESTORE ROUTINE LOCATION + ; (USUALLY POPJ USED) + DEV'CHL==CH'PI ;LOCATION WHERE INTERRUPT PC IS STORED + DEV'SAC==SAVAC'PI ;STARTING CHANNEL SAVE LOCATION FOR AC'S + INTERN DEV'SAV, DEV'RET, DEV'CHL, DEV'SAC + >> + + DTBIT==0 ;ASSUME THIS IS NOT A DECTAPE + + IFIDN , , ;IS IT PDP-10 DECTAPES ? + IFIDN , , ; OR PDP-6 DECTAPES ? + + IFE PI, < + XWD DEV'N*1000+0,0 ;NO PI CHANNEL FOR THIS DEVICE + > + + IFG PI, < + XWD DTBIT*400000+DEV'N*1000+PI,DEV'INT ;FIRST WORD OF INTTAB ENTRY + > + + IFG DEV'N-1, < + XWD DEV'DDS,DEV'DDB ;MULTIPLE DEVICE SECOND WORD OF INTTAB ENTRY + EXTERN DEV'DDS + > + IFE DEV'N-1, < + XWD 0,DEV'DDB ;SINGLE DEVICE SECOND WORD OF INTTAB ENTRY + >> + +;MACRO'S TO ALLOW GENERATION OF MULTIPLE INTTAB ENTRIES FOR MULTIPLE +; DEVICES SUCH AS LINE-PRINTERS + +DEFINE MULASG (DEV,DE,PI) < + IFG DEV'N, < + ZZ==0 + REPEAT DEV'N, < + DEVASG DE,\ZZ,PI + ZZ==ZZ+1 + > + > +> + +DEFINE DEVASG (DE,X,PI) < + DE'X'N==1 + ASGSV1 DE'X,\PI +> + + +;MACROS TO CONTROL ASSIGNMENT OF PI CHANNELS TO DEVICES + +DEFINE NEXTCH < .CH==.CH+1 +.CHAS==0 +NEXTCU \.CH +> +DEFINE NEXTCQ < IFN .CHAS,> +DEFINE NEXTCU (N) < IFDEF UNIQ'N,>> + + + + + + +;ASSUME NO PI CHANNEL SAVE ROUTINES NEEDED + + USED1==0 + USED2==0 + USED3==0 + USED4==0 + USED5==0 + USED6==0 + USED7==0 + +;NOW GENERATE THE TABLE FOR ONCE AND DEFINE PI CHANNEL ASSIGNMENTS + + INTERN INTTAB,INTTB1,INTNUM,SCNN,CTYN + + CTYN==1 ;ALWAYS ONE CTY + SCNN==JOBN ;NUMBER OF SCN DDB + ; ONE FOR EACH JOB + NULL JOB (EXTRA ONE) + APRN==1 ;ALWAYS AN APR + CLKN==1 ;ALWAYS LOWEST PRIORITY CLOCK + + +INTTAB: ;TABLE OF DATA FOR DEFINING PI CHAN AND NUMBER OF DOB + INTTB1==INTTAB+1 + + ASGSAV PTY,0 + +.CHAS==0 +.CH==0 +NEXTCH + +;THE FOLLOWING DEVICES MUST HAVE A UNIQUE, HIGH PRIORITY +; CHANNEL FOR BLOCK I/O TRANSFERS. + +;NOTE THAT THE PDP-6 DECTAPE AND MAGTAPE SHARE A +; 136 DATA CONTROL IF BOTH ARE PRESENT. + + ;DATA PRODUCTS DISK BLKI/BLKO PI CHANNEL: + IFNDEF DCBCHN, > + ;PDP-6 OR PDP-10 MAGTAPE BLKI/BLKO PI CHANNEL: + IFNDEF MTDCHN, > + IFNDEF DCTCHN, > + ;PDP-6 OR PDP-10 DECTAPE BLKI/BLKO PI CHANNEL: + IFNDEF DTDCHN, > + IFNDEF DCTCHN, > + +IFNDEF BLKMXC, ;REMEMBER THIS CHANNEL ON PASS 1 +.CH==BLKMXC ;ON PASS 2, SKIP OVER BLKI CHANNELS + + ;THE FOLLOWING ARE GROUPED ON A CHANNEL FOR HIGH-PRIORITY DEVICES + ASGSAV CDR,.CH + ASGINT APR,.CH + +NEXTCQ + +;THE FOLLOWING ARE MEDIUM-PRIORITY DEVICES, AS A GROUP + ASGSAV SCN,.CH + ASGSAV PTR,.CH + MULASG LPT,LP,.CH + ASGSAV DTA,.CH + ASGSAV DTC,.CH + ASGSAV MTA,.CH + ASGSAV MTC,.CH + ASGINT CTY,.CH + +NEXTCQ + +;THE FOLLOWING ARE LOWER-PRIORITY DEVICES, AS A GROUP + ASGSAV DSK,.CH + ASGSAV PEN,.CH + ASGSAV PTP,.CH + ASGSAV CDP,.CH + ASGSAV PLT,.CH +NEXTCQ + + +;THESE DEVICES GET LOW PRIORITY CHANNEL + ASGSAV DIS,.CH + +NEXTCQ + +;LAST IS THE SCHEDULER, ON CHANNEL 7 BY ITSELF + +IFG <.CH-7>, < PRINTX ;NOT ENOUGH PI'S TO SERVICE THIS CONFIGURATION. + PRINTX ;SUGGEST EDITING COMMON TO PUT MORE DEVICES ON + PRINTX ; A SINGLE CHANNEL +> + +.CH==7 + ASGINT CLK,.CH + + SPCINT + ;GENERATE ANY SPECIAL DEVICES CUSTOMER IS SUPPLYING + ; WHICH DO NOT USE A CHANNEL SAVE ROUTINE AND HAVE + ; NO DEVICE DATA BLOCK + SPCSAV + ;GENERATE ANY SPECIAL DEVICES CUSTOMER IS SUPPLYING + ; WHICH DO NEED A CHANNEL SAVE ROUTINE + +;END OF THE ASSIGNMENT TABLE + + INTNUM==INTTAB-. ;-LENGTH OF INTERRUPT CHANNEL ASSIGNMENT TABLE + + IFLE .-SYSEND, + ; SET LOC UP TO SYSEND+1, UNLESS ONCE ONLY CODE + ; IS BIGGER + + + +;SYSTEM CONSTANTS AND PARAMETERS + + INTERN CNFTBL,CNFMXL,CONFIG,SYSTAP,SYSDAT + + +CNFTBL: ;FIRST LOCATION OF MONITOR DATA STORAGE + ; RETURNED BE GETTAB UUO (THESE LOCATIONS + ; NOT CLEARED BY SYSINI) + ; CNFTBL IS GETTAB TABLE 11 (RH OF AC) + ; OCTAL NO. IN () CORRESPOND TO GETTAB UUO +CONFIG: SYSNAM + + LOC CONFIG+5 ;ALWAYS LEAVE 5 WORDS (24 CHARS) + ; SO GETTAB UUO WILL BE CONSTANT +SYSDAT: SYSDAT + ;(5,6) GENERATE SYSTEM DATE + LOC SYSDAT+2 ;ALWAYS LEAVE 2 WORDS SO GETTAB CONSTANT +SYSTAP: SYSDEV + ;(7) NAME OF SYSTEM DEVICE, IN SIXBIT + +;LOCATIONS SETUP BY ONCE ONLY OPERATOR DIALOGUE AND NEVER RESET ON RESTARTS + + INTERN TIME,THSDAT,SYSSIZ,DEVOPR,DEVLST,SEGPTR,TWOREG,STATES + INTERN SERIAL + EXTERN PATCH + +TIME: 0 ;(10) TIME OF DAY IN JIFFIES (60TH OR 50THS OF A SEC) +THSDAT: 0 ;(11) TODAY'S DATE ((Y-1964)*12+(M-1))*31+(D-1) +SYSSIZ: EXP PATCH ;(12) SIZE OF MONITOR (FIRST LOC NOT USED) +DEVOPR: SIXBIT /CTY/ ;(13) SIXBIT PHYSICAL NAME OF OPERATORS CONSOLE + ; (IF THIS LOCATION CONTAINS 0, NONE HAS + ; BEEN DESIGNATED) + ;PUBLIC LOGICAL NAME "OPR" WILL BE THIS DEVICE. + ; ALSO UNEXPLAINED MONITOR ERROR MESSAGES + ; WILL BE TYPED ON TTY OPR +DEVLST: XWD 0,0 ;(14) LH CONTAINS ADDRESS OF FIRST DEVICE DATA BLOCK + ; ONCE ONLY CODE LINKS DEVICE DATA BLOCKS + SEGPTR: XWD -SEGN,JOBN ;(15) AOBJN POINTER TO 1ST HIGH SEG IN JBTXXX TABLES + ; LH=-NO. OF HIGH SEGS, RH= ST HIGH SEG NO. +TWOREG: 0 ;(16) FLAG TO INDICATE WHETHER BOTH HARDWARE AND SOFTWARE + ; HAVE 2 RELOC REG CAPACITY + ; NON-ZERO IF BOTH DO, 0 IF EITHER OR BOTH DO NOT + ; SET BY ONCE ONLY CODE + + ZZ==0 + IFG DSKN, ;1 IF DISK SYSTEM (ANALOGOUS TO FTDISK) + IFG SYS50N, ;1 IF SWAPPING SYSTEM (ANALOGOUS TO FTSWAP) + IFG LOGINN, ;1 IF LOGIN (ANALOGOUS TO FTLOGIN) + IFN FTTTYSER, ;1 IF FULL DUPLEX SOFTWARE + IFN FTPRV, ;1 IF PRIVILEGE FEATURE INCLUDED + IFN FT2REL, ;1 IF REENTRANT SOFTWARE + IFE JIFSEC-^D50, ;1 IF 50 CYCLE MACHINE, 0 IF 60 CYCLE +STATES: EXP ZZ ;(17) BITS WHICH DEFINE TYPE OF SYSTEM IN LH + ; RH PATCHED BY MONITOR COMMAND TO + ; INDICATE OPERATIONAL STATE OF SYSTEM +SERIAL: EXP APRSN ;(20) SERIAL NUMBER OF APR +CNFMXL==<.-CNFTBL-1>B26 ;MAXIMUM ENTRY IN CNFTBL FOR GETTAB UUO + IFG DSKN, < + INTERN ODPTBL,ODPMXL,SWPHGH,K4SWAP,PROT,PROT0 + +IFG SYS50N,< EXTERN ICPROT,ICPRT1 ;THESE ARE DEFINED ONLY IN + ; A SWAPPING SYSTEM> +IFLE SYS50N,< XP ICPROT,0 ;IF NON-SWAPPING, DECLARE + XP ICPRT1,0 ; INTERNAL IN COMMON> + +ODPTBL: ;FIRST LOC IN MONITOR DATA AREA FOR DISK + ; LOCATIONS WHICH ARE NOT SET TO 0 WHEN SYSTEM + ; STARTED, ODPTBL IS GETTAB UUO TABLE 15 + +SWPHGH: 0 ;(0) HIGHEST LOGICAL BLOCK # IN THE SWAPPING + ; SPACE ON THE DISK (SET BY SWPINI) +K4SWAP: 0 ;(1)K OF DISK WORDS SET ASIDE FOR SWAPPING + ; ASSIGNED AT ONCE ONLY REFRESH TIME + +PROT: EXP ICPROT ;(2) IN-CORE PROTECT TIME PARAMETER TO BE + ; MULTIPLIED BY OF CORE IN JOB. +PROT0: EXP ICPRT1 ;(3) IN-CORE PROTECT TIME PARAMETER TO + ; BE ADDED TO ABOVE RESULT. + + ;INSERT NEW LOCATIONS OF INTEREST SETUP + ; BY ONCE ONLY CODE HERE FOR DISK SYSTEMS +ODPMXL==<.-ODPTBL-1>B26 ;MAXIMUM ENTRY IN ODPTBL FOR GETTAB UUO +> + + ;MORE DATA LOCATIONS SETUP AT ASSEMBLY TIME OR ONCE ONLY TIME +; BUT NOT OF INTEREST TO USER PROGRAMS + + INTERN XJBPFI,PMONTB,MONTAB,MIDNIT + +XJBPFI: XWD .,0 ;LH FILLED IN WITH EXTERNAL JOBPFI (SEE JOBDAT) + ; JOBPFI==HIGHEST LOC, IN USER JOB DATA AREA + ; PROTECTED FROM I/O +;MONTH TABLE FOR DAYTIME COMMAND PRINTING + +PMONTB: POINT 6,MONTAB(TAC),5 ;POINTER TO NUMBER OF DAYS INMONTH +MONTAB: EXP ^D30B5+"JAN" + EXP ^D27B5+"FEB" + EXP ^D30B5+"MAR" + EXP ^D29B5+"APR" + EXP ^D30B5+"MAY" + EXP ^D29B5+"JUN" + EXP ^D30B5+"JUL" + EXP ^D30B5+"AUG" + EXP ^D29B5+"SEP" + EXP ^D30B5+"OCT" + EXP ^D29B5+"NOV" + EXP ^D30B5+"DEC" +MIDNIT: EXP ^D60*^D60*^D24*JIFSEC ;NO OF JIFFIES TILL MIDNIGHT + ;STOP PROCEDURE WHEN SHUTTING DOWN SYSTEM +;BECAUSE OF CATOSTROPHIC FAILURE OR ANY OTHER REASON +;WRITE OUT DIRECTORIES STILL IN CORE (DISK) +;TRANSFER HERE FROM LOC 147 + +;PROCEDURE TO SAVE CRASHED MONITOR ON DECTAPE FOR LATER DEBUGGING UNDER TIME SHARING +;OPERATOR SHOULD: +; 1. PUSH STOP AND HOLD IT DOWN +; 2. PUSH CONTINUE (APR PI IN PROGRESS SHOULD COME ON) +; THIS PUTS MACHINE INTO EXEC MODE AND STORES PC OC CRASH +; 3. LETUP ON STOP +; 4. SET ADDRESS SWITCHES TO 147 +; 5. PUSH START (DO NOT PUSH I/O RESET AS IT WILL CLEAR DEVICES) + +INTERN APRSTS,PISTS,SYSTOP,CRASHX,SWTSTS,TTYSTS,PTRSTS,TMCSTS +INTERN PTPSTS,DLSSTS,DTSSTS,CRSTS,LPTSTS,PLTSTS,TMSSTS,DSKSTS,DSKDTI +EXTERN SYSPDL + +EXTERN CRSHAC ;DEFINED IN SYSINI TO BE 143 RESTART CODE + ;SO MONITOR CANNOT BE RESTARTED AT 143 AFTER + ;BEING STARTED AT 147. + +CRASHX: MOVEM 17,CRSHAC+17 ;SAVE AC17 + MOVE 17,TSTLOC + CAME 17,SYSCRS ;IS LOC 147 WIPED OUT? + HALT SYSTOP+1 ;YES - LET OPERATOR DECIDE WHAT TO DO + JRST SYSTOP+1 ;NO - GO SAVE AC'S & DEVICE STATES +TSTLOC: JRST SYSTOP + +SYSTOP: MOVEM 17,CRSHAC+17 ;SAVE ALL ACS + MOVEI 17,CRSHAC ;SOURCE==0, DESTINATION==CRSHAC + BLT 17,CRSHAC+16 ;SO DDT CAN LOOK AT SAVED CRASH LATER + +APRSTS: CONI APR,. ;STORE APR STATUS HERE +PISTS: CONI PI,. ;STORE PI STATUS HERE +SWTSTS: DATAI APR,. +TTYSTS: CONI TTY,. +PTRSTS: CONI PTR,. +PTPSTS: CONI PTP,. +DLSSTS: CONI DLS,. +DTSSTS: CONI DTS,. +CRSTS: CONI CR,. +LPTSTS: CONI LPT,. +PLTSTS: CONI PLT,. +TMSSTS: CONI TMS,. +TMCSTS: CONI TMC,. +DSKSTS: CONI DSK,. +DSKDTI: DATAI DSK,. + CONO APR,APRRST ;RESET SYSTEM + MOVEI PDP,SYSPDL ;SETUP PDP TO SPARE AREA + IFG DSKN, < + EXTERN DSKSTP + PUSHJ PDP,DSKSTP> + HALT 137400 ;STOP AT TENDMP(READY TO READ IN ANYTHING) +;ERROR RECOVERY - TRY TO START NULL JOB + +NULJB1: MOVEI ITEM,0 ;SET JOB NUMBER TO 0 + JRST NULJOB ;GO RESTORE NULL JOB + + + +;COMMON SUBROUTINE RETURNS + + INTERN CPOPJ,CPOPJ1,DPOPJ,TPOPJ,TPOPJ1,CPOPJ2,IPOPJ1,IPOPJ + INTERN CUXIT1,CUXIT,UXIT + INTERN FTTIME,FTSWAP,FTSLEEP,FTKCT,FT2REL,FTPRV +CPOPJ2: AOS (PDP) ;DOUBLE SKIP SUBROUTINE RETURN +CUXIT1: ;OLD SKIP RETURN FOR UUOS +CPOPJ1: AOSA (PDP) ;SKIP SUBROUTINE RETURN +DPOPJ: MOVEM IOS,DEVIOS(DEVDAT) ;DEPOSIT I/O STATUS WORD IN DDB +UXIT: +CUXIT: ;OLD RETURN FOR UUOS +CPOPJ: POPJ PDP, + +TPOPJ1: AOS -1(PDP) ;RESTORE TAC THEN SKIP RETURN +TPOPJ: POP PDP,TAC ;RESTORE TAC + POPJ PDP, ;AND RETURN +IPOPJ1: AOS -1(PDP) ;SET FOR SKIP RETURN +IPOPJ: POP PDP,ITEM ;RESTORE ITEM (USUALLY JOB OR HIGH SEG NUMBER) + POPJ PDP, + + ; SYSTEM BYTE POINTERS + + INTERN PUUOAC,PIOMOD,PJOBN,PUNIT,PJBSTS,PDVTIM,PDVCNT,PCORSZ,COREP + INTERN IADPTR + +PUUOAC: POINT 4,UUO,12 ;UUO AC FIELD +PIOMOD: POINT 4,IOS,35 ;MODE BITS +PJOBN: POINT 6,DEVCHR(DEVDAT),5 ;DEVICE JOB ASSIGNMENT +PUNIT: POINT 6,DEVCHR(DEVDAT),23 ;DEVICE UNIT NUMBER +PJBSTS: POINT JWSIZ,JBTSTS(ITEM),JWPOS ;JOB WAIT STATE (QUEUE) CODE + ;IN JOB STATUS WORD +PDVTIM: POINT 6,DEVCHR(DEVDAT),17 ;TIME IN SECONDS BEFORE DEVICE + ;IS SAID TO BE HUNG +PDVCNT: POINT 6,DEVCHR(DEVDAT),11 ;COUNTED DOWN EACH SECOND, + ;1 TO 0 TRANSITION MEANS HUNG DEVICE +IADPTR: POINT 2,DEVIAD(DEVDAT),2 ;COUNT OF NUMBER OF USER CHANNELS INITED + ; ON THIS DEVICE (DECTAPE ONLY) +PCORSZ: POINT 8,JBTADR(ITEM),7 ;BYTE POINTER TO LOW OR HIGH SEG CORE SIZE-1 + +COREP: POINT 1,CORTAB ;1 BIT POINTER TO CORE ALLOCATION TABLE + + IFG SYS50N, < ;SWAPPING SYSTEM ? + INTERN IMGIN,IMGOUT,IMGINT,OUTMSK,INMSK,INLEFT + INMSK=000377 ;RH MASK TO IMGIN + INLEFT=12 ;NUMBER OF BITS TO SHIFT TO LEFT JUSTIFY IN RH + +IMGIN: POINT 8,JBTSWP(ITEM),35 ;BYTE POINTER FOR # 1K BLOCKS OF CORE + ;WHEN JOB OR HIGH SEG NEXT SWAPPED IN + ;NON-ZERO ONLY WHEN SWAPPED OUT +IMGOUT: POINT 8,JBTSWP(ITEM),26 ;BYTE POINTER FOR # 1K BLOCK OF DISK + ;WHEN JOB OR HIGH SEG HAS IMAGE ON DISK + ;ZERO MEANS NO DISK SPACE ALLOCATED + OUTMSK=377000 ;RH MASK TO IMGOUT. USED TO TEST FOR 0 + ; (IE NO DISK SPACE) +IMGINT: POINT 8,JBTSWP(DEVDAT),35 ;POINTER TO INCORE IMAGE +> + + ;SPECIAL PROJECT-PROGRAMMER NUMBERS + IFG DSKN, < ;DISK SYSTEM? + INTERN CUSPPP,SYSPP,DUMPPP,HELPPP + +CUSPPP: ;CUSP FILE DIRECTORY, MAKE SEPARATE TAG FROM + ; MFD(SYSPP) +SYSPP: XWD 1,1 ;THE MASTER FILE DIRECTORY PROJECT PROGRAMMER NO. +DUMPPP: XWD 1,2 ;THE FAILSAFE PROJ,PROG NO (CAN READ OF WRITE ANYTHING) +HELPPP: XWD 2,4 ;SYSTAT AND HELP PROJECT,PROGRAMMER NOS IF JOB NOT LOGGED IN ALREADY +> + ;DEFINE PI CHANNEL SAVE AND RESTORE ROUTINES IF A DEVICE IS ON THE CHANNEL + + HIGHAC==10 ;HIGHEST AC SAVE ON A PI INTERRUPT + PDL==25 ;LENGTH OF INTERRUPT PI PUSH DOWN LIST + +DEFINE CHAN (PI)< + XLIST + INTERN SAV'PI,RET'PI,CH'PI +CH'PI: 0 ;PC STORED HERE BY JSR ON INTERRUPT TO CHANNEL PI + JEN @CH'PI ;LAST INSTRUCTION ON CONSO DEV, CHAIN + +;HERE FROM AN INTERRUPT ROUTINE WHICH HAS FOUND ITS DEVICE NEEDS SERVICE +;SAVE ACS 0 THRU HIGHAC, CALLED BY JSR, SETS UP PDP TO PUSH DOWN LIST FOR THIS PI + +SAV'PI: 0 ;CALLED BY JSR + MOVEM HIGHAC,SAVAC'PI+HIGHAC ;SAVE AC HIGHAC + MOVEI HIGHAC,SAVAC'PI ;SETUP TO SAVE 0 THRU HIGHAC-1 + BLT HIGHAC,SAVAC'PI+HIGHAC-1 ;SAVE ACS + MOVE PDP,SAVAC'PI+HIGHAC+1 ;SETUP PUSH DOWN POINTER + JRST @SAV'PI ;RETURN TO CALLER AND PROCESS INTERRUPT + +;HERE FROM INTERRUPT ROUTINE WHEN IT HAS FINISHED SERVICING INTERRUPT +;RESTORE ACS AND DISMISS INTERRUPT +;USUALLY TRANSFERRED TO BY POPJ PDP, + +RET'PI: MOVSI HIGHAC,SAVAC'PI ;RESTORE ACS 0 THRU HIGHAC + BLT HIGHAC,HIGHAC + JEN @CH'PI ;DISMISS INTERRUPT ON THIS PI CHANNEL + +SAVAC'PI: BLOCK HIGHAC+1 ;PLACE TO SAVE ACS 0 THRU HIGHAC + XWD -PDL+1,.+1 ;INITIAL PUSH DOWN POINTER +CH'PI'PD1: EXP RET'PI ;FIRST WORD ON LIST, + ; POPJ WILL RETURN TO DISMISS INTERRUPT + BLOCK PDL-1 ;PUSHDOWN LIST SPACE + LIST +> + + ;GENERATE THE CHANNEL SAVE ROUTINE ONLY FOR PI WHICH NEED THEM (ASGSAV MACRO USED) + + IFN USED1, + IFN USED2, + IFN USED3, + IFN USED4, + IFN USED5, + IFN USED6, + IFN USED7, + + + +;GENERATE NULL CHANNEL SAVE ROUTINES FOR THOSE CHANNELS NOT USED + +DEFINE NULL (PI)< + XLIST + INTERN CH'PI +CH'PI: 0 + JEN @CH'PI + LIST +> + + IFE USED1, + IFE USED2, + IFE USED3, + IFE USED4, + IFE USED5, + IFE USED6, + IFE USED7, + ;HERE ON TRAPS TO LOC 60/61 - UNIMPLEMENTED INSTRUCTIONS (PDP-10 ONLY) +;OPCODE AND EFFECTIVE ADDRESS STORED IN SIXTY AND 61 EXECUTED (JSR UUO2) +;OP CODE 100 (UJEN) IS USED TO DISMISS USER MODE INTERRUPTS FOR REAL TIME OPERATION +;USED IN CONJUNCTION WITH TRPSET UUOWHICH IS SOON TO BE REPLACED +;WITH SOME KNAVE-PROOF REAL TIME UUOS. THIS CODE IS HERE ONLY +;BECAUSE MANUAL DESCRIBES TRPSET AND TRPJEN UUOS. +;TRPJEN HAS BEEN REPLACED WITH OPCODE 100 (UJEN). +;CALL: UGEN U ;WHERE U CONTAINS PC STORED BY INTERRUPT JSR + + INTERN UUO2 + +UUO2: 0 ;USER PC STORE HERE BY JSR + EXCH TAC,UUO2 ;GET USER PC, SAVE TAC +IFN FTTRPSET, < + TLNN TAC,UIOMOD ;USER I/O MODE ON ? + JRST UUOER2 ;NO, TREAT AS AN ILLEGAL INSTRUCTION AND PRINT MESS. + HLL TAC,SIXTY ;YES, GET UNIMPLEMENTED OPCODE WHICH TRAPPED + TLNE TAC,677777 ;IS IT OPCODE 100 (UJEN)? + JRST UUOER1 ;NO, TREAT AS ILLEGAL INSTRUCTION + MOVE TAC,SIXTY ;YES, GET EFFECTIVE ADDRESS + ADD TAC,JOBADR ;ADD RELOCATION FOR CURRENT JOB + MOVE TAC,(TAC) ;GET PC STORED BY INTERRUPT JSR + EXCH TAC,UUO2 ;RESTORE TAC, AND STORE PC + JEN @UUO2 ;DISMISS INTERRUPT + +UUOER1: HRLI TAC,USRMOD!UIOMOD ;SET USER MODE AND USER I/O MODE BACK ON +> +UUOER2: MOVEM TAC,UUO0 ;STORE PC AS IF AN ILLEGAL INSTR. HAD OCCURRED + SETOM FORTY ;MAKE IT LOOK LIKE AN ILLEGAL INSTRUCTION + ; TRAPPED TO 40 + SKIPA TAC,UUO2 ;RETORE TAC AND FALL INTO REGULAR UUO HANDLER + ;HERE ON TRAPS TO EXEC LOC 40/41 - OPCODES 0,40-77 (0-77 ON PDP-6) + + INTERN UUO0 + EXTERN UUOUSR,UUOSY1,ERROR + +UUO0: 0 ;JSR HERE FROM LOC 41 + MOVEM 17,USRSAV ;SAVE 17 + MOVE 17,UUO0 ;GET PROCESSOR FLAGS + TLNN 17,USRMOD ;IS UUO FROM MONITOR ? + JRST UUOSY1 ;YES, DO NOT SAVE ACS + SKIPN 17,JOBADR ;IS THERE A JOB DATA AREA ? + JSP DAT,ERROR ;NO, MUST BE UUO DURING NULL JOB + ; PRINT ERROR IN MONITOR +IFE PDP10N, < ;FOR PDP-6 OPCODES 1-37 + EXCH TAC,FORTY ;SAVE TAC, PICK UP UUO + TLNN TAC,740000 ;IS THIS SYSTEM UUO ? + TLNN TAC,077000 ;NO, IS IT 0 UUO ? + JRST UUOSYS ;YES + MOVEM TAC,40(17) ;STORE UUO IN USER'S 40 + HRRZ TAC,41(17) ;PICK UP ADR OF USER'S JSR + JUMPE TAC,UUOSY2 ;IF ADDRESS=0,ILLEGAL USER UUO****UWA PATCH + HLL TAC,UUO0 ;USER PD FLAGS (RESTORED ON RETURN) + MOVEI 17,(TAC) ;17 NOW HAS REL.ADR+1 OF USER JSR + CAML 17,USRREL ;IS EFFECTIVE ADDRESS IN BOUNDS ? + JRST UUOSY0 ;ERROR, JSR EFF. ADDR. OUTSIDE USER AREA + HRRI TAC,1(TAC) ;YES, INCREMENT PC. + EXCH TAC,UUO0 ;SET UP RETURN TO USER IN UUO0 + ; PICKUP USERS FLAGS,PC + ADD 17,JOBADR ;MAKE REL. ADDRESS INTO ABSOLUTE ADDRESS + MOVEM TAC,(17) ;STORE FLAGS AND PC LIKE JSR + MOVE TAC,FORTY ;RESTORE TAC + MOVE 17,USRSAV ;RESTORE 17 + JRST 2,@UUO0 ;RETURN TO USER (RESTORING FLAGS) + +UUOSY0: MOVE 17,JOBADR ;SETUP 17 FOR LOW SEGMENT RELOCATION +UUOSY2: EXCH TAC,FORTY ;RESTORE USERS AC(TAC) AND USER'S UUO (FORTY) +> + JRST UUOUSR ;GO SAVE USER'S ACS IN REL. LOCATION 0-17 + ; AND DISPATCH ON UUO + ;GENERATE EXTERNAL GLOBALS TO CAUSE LOADING OF PROPER ROUTINES FROM MONITOR LIBRARY TAPE +;IF THERE IS ONE + + +;ALWAYS LOAD CLOCK1,COMCON,CORE1,ERRCON,JOBDAT,ONCE,PATCH,SYSMAK,UUOCON + +EXTERNAL CLOCK1,COMCON,CORE1,ERRCON,DATJOB,ONCE,PATCH,SYSMAK,UUOCON + +;LOAD DDT + IFG DDTN, + IFE DDTN, + +;LOAD SCHEDULER FOR NON-SWAPPING OR SWAPPING SYSTEM + IFG SYS40N, ;CLKCSS + IFG SYS50N, ;SCHED + +;LOAD EITHER SEGCON (2REG SOFTWARE) OR NULSEG (1 REG SOFTWARE) +; UNLESS USER HAS EDITTED S WITH FT2REL=0 SO ALL PUSHJ'S +; TO SEGCON (NULSEG) ARE REMOVED + +IFN FT2REL, < + IFG KT10AN, + + IFE KT10AN, +> + + +;APR AND PI BITS + INTERN PION,PIOFF,REQCLK,PICLK,APRCLR,APRCLE,APRNUL,APRRST,NXM,APRFOV + + CLKBIT==1 + REPEAT 7-CLKCHN, + PION==200 ;CONO PI,PION TURNS PI SYSTEM ON + PIOFF==400 ;TURN IT OFF + REQCLK==1B24+CLKBIT ;REQUEST INTERRUPT ON LOW PRIORITY CLK CHANNEL + PICLK=PION+REQCLK ;TURN ON PI,REQUEST INTERRUPT ON CLK CHANNEL + APRCLR==1000+APRCHN ;TURN APR CLOCK FLAG OFF + APRCLE==431550+APRCHN ;CLEAR ALL APR ERROR BITS + ; AND DISABLE FOV AND AR OVF + APRNUL==433550+APRCHN ;RESET APR FOR NULL JOB + ; CLEAR EVERYTHING BUT DON'T I/O RESET + APRRST==APRNUL+200000 ;RESET APR FOR SYSINI (I/O RESET TOO) + NXM==10000 ;NON-EX MEM (APR STATUS WORD) + IFG PDP10N, + IFE PDP10N, + +;MAKE SURE THAT PROPER VERSION OF FEATURE SWITCH FILES WERE USED TO ASSEMBLE +;THE REST OF THE MONITOR +;THE LOADER WILL PRINT NUL. DEF. GLOBAL IF A MISTAKE HAS BEEN MADE + XP FTDISK,-DSKN + XP FTSWAP,-SYS50N + XP FTRC10,-RD10N + + IFG KT10AN, ;IF Z RELOC SOFTWARE, THEN FTZREI MUST BE -1 + IFE COREN, + XP USRLIM,COREN ;DEFINE GLOBAL RESTRICTING SIZE OF CRE FOR ANY SINGLE USER + ; ONCE ONLY CODE CAN ALTER THIS VALUE + ; (PATCH RH CORLIM IN SYSIM) + ;SCANNER ENTRY POINTS AND BIT DEFINITIONS + + IFG DLSN, ;DATA LINE SCANNER + IFG CCIN, ;DA-10 PDP-8 680 + IFG DCSN, ;630 DATA COMMUNICATIONS SYS + + IFG FULLN, ;FULL DUPLEX SOFTWARE ENTRY POINT + IFE FULLN, ;HALF DUPLEX SOFTWARE ENTRY POINT + + IFG FULLN, < + INTERN LINTAB + +LINTAB: ;LINE CHARACTERISTICS BITS (NOT CLEARED ON SYSTEM STARTUP) + +;TELETYPE LINE CHARACTERISTICS (LH OF LINTAB) +;USED IN SCNSRF ALSO + + XP PTYLIN,400000 ;PSEUDO TTY LINE + XP CTYLIN,200000 ;CONSOLE TTY + XP DISLIN,100000 ;KEYBOARD DISPLAY + XP DSDTLN, 40000 ;DATASET DATA LINE + XP DSCTLN, 20000 ;DATASET CONTROL LINE(DC10E) + XP HLFDPX, 10000 ;HALF DUPLEX LINE + XP TTYRMT, 4000 ;REMOTE TTY + XP T35, 10 ;TTY HAS HARDWARE TABS + XP FULTWX, 4 ;SELF-ECHOING LINE + ;USED IN CCIINT,DCSINT,DLSINT & SCNSRF + +IFG EDITN,< ;HAS COMMON.MAC BEEN EDITED TO DEFINE TTY LINE CHAR. + ; SO MONGEN TYPE-IN REDUCED? +;IF NO APR NUMBER, AND THIS IS NOT EDITED FOR THE CUSTOMER, +; MAKE ALL LIENS JUST BE MODEL 33 TELETYPES + +IFE APRN,> + +IFE APRSN-2,< +;FOLLOWING LINE DEFINITIONS FOR DEC PDP12 #2 + + XWD T35,0 ;TTY0 + XWD T35,0 ;TTY1 + XWD T35,0 ;TTY2 + XWD 0,0 ;TTY3 +REPEAT 3,< XWD T35,0>;TTY4-6 + XWD T35+TTYRMT,0 ;TTY7 - REMOTE 35 + XWD DSDTLN,0 ;TTY10 + XWD DSDTLN+HLFDPX,0 ;TTY11 + XWD DSDTLN,0 ;TTY12 +REPEAT 4,< XWD T35,0>;TTY13-16 +REPEAT 8, +> + +IFE APRSN-^D40,< +;THIS CONFIGURATION FOR DEC SYSTEM NUMBER 40 + +REPEAT ^D8,<0 ;MODEL 33'S LOCALLY> + +REPEAT ^D8,< XWD DSDTLN,0 ;DATASET> +> + +; CTY AND PTY SET BY SCNSER +> ;END PRE-EDITED LINE CHARACTERISTICS + + +IFE EDITN,< ;MONGEN DIALOG DEFINE TTY CONFIG? + +DEFINE GENLIN(LIN)< + IFNDEF DSD'LIN, ;DATA SET? + IFNDEF TAB'LIN, ;HARDWARE TABS? + IFNDEF RMT'LIN, ;REMOTE? + IFNDEF HLF'LIN, ;HALF DUPLEX SCANNER? + XWD DSD'LIN*TAB'LIN*T35+RMT'LIN*TTYRMT+HLF'LIN*HLFDPX,0 +> + +REPEAT HGHLIN+1, +> + LOC LINTAB+TTPLEN ;MAKE SURE ENOUGH SPACE FOR CTY+PTY;S + +> ;END OF FULL DUPLEX CONDITIONAL + + INTERN FSNCHN,SCNON,SCNOFF + + FSNCHN==SCNCHN*101 ;CHANNEL ASSIGNMENT FOR FULL DUPLEX SCN. + SCNBIT==<1_<7-SCNCHN>> + SCNON==2000+SCNBIT ;CONO PI, TURNS SCANNER PI CHANNEL ON + SCNOFF==1000+SCNBIT ;CONO PI, TURNS SCANNER PI CHANNEL OFF + IFG TABSN, ;HARDWARD TABS + IFE TABSN, +XP SCNNUM,HGHLIN+1 ;# OF SCANNER LINES (USED BY ONCE FOR PRINTING CONFIG) + ;MAGTAPE ENTRY POINT AND BIT DEFINITIONS + + IFG MTAN, ;TM10 ENTRY POINT + IFG MTCN, ;PDP-6 MAGTAPES ENTRY POINT + + IFG MTAN, < + + INTERN MMTSIZ,MTALOC,MTLOC1,MTBOTH,MTFLAG + + MMTSIZ==-MTSIZ + MTALOC==40+2*MTDCHN ;BLKI/BLKO LOCATION + MTLOC1==MTALOC+1 ;NEXT LOCATION + MTBOTH==MTACHN*10+MTDCHN ;BOTH PI CHANNELS + MTFLAG==400+MTACHN*10 +> + + IFG MTCN, < + + INTERN DCLOC,DCLOC1,DCON,DCOFF,DCIN,DCOUT + + DCLOC==40+2*DCTCHN ;EVEN DC PI CHANNEL LOCATION + DCLOC1==DCLOC+1 ;NEXT LOCATION + DCBIT==1 + REPEAT 7-DCTCHN, + DCON==2000+DCBIT ;TURN DC PI CHANNEL ON + DCOFF==1000+DCBIT ;TURN DC PI CHANNEL OFF + DCIN=4010+DCTCHN ;SET DATA CHANNEL FOR INPUT + DCOUT==3410+DCTCHN ;SET DATA CHANNEL FOR OUTPUT +> + +;DECTAPE ENTRY POINT AND BIT DEFINITIONS + + SAVN==1 ;WE ONLY SUPPORT NEW FORMAT NOW + ;MONGEN NO LONGER ASKS QUESTION, + + IFG DTAN, ;TD10 WITH NEW FORMAT + IFG DTCN, < + IFG SAVN, ;556 WITH NEW FORMAT + IFE SAVN, ;556 WITH OLD FORMAT +> + IFG DTAN, < ;DEFINE SYMBOLS IF PDP-10 DECTAPES (TD10) + INTERNAL DTALOC,DTALC2,DTBOTH,DTTURN + DTALOC==40+2*DTDCHN ;BLKI/BLKO LOCATION + DTALC2==DTALOC+1 ;NEXT LOCATION + DTBOTH==DTDCHN*10+DTACHN + DTTURN==300200+DTBOTH +> + IFG DTCN, < ;DEFINE SYMBOLS IF PDP-6 DECTAPES (556) + INTERNAL DCLOC,DCLOC1,DCON,DCOFF,DCIN,DCOUT + DCLOC==40+2*DCTCHN ;EVEN DC PI CHANNEL LOC + DCLOC1==DCLOC+1 ;NEXT LOCATION + DCBIT==1 + REPEAT 7-DCTCHN, + DCON==2000+DCBIT ;TURN DC PI CHANNEL ON + DCOFF==1000+DCBIT ;TURN DC PI CHANNEL OFF + DCIN==4010+DCTCHN ;SET DATA CHANNEL FOR INPUT + DCOUT==3410+DCTCHN ;SET DATA CHANNEL FOR OUTPUT +> + +;DEFINE SAVE MODE AND EXTENSION FOR OLD OR NEW FORMAT + + INTERNAL SAVDMP + IFE SAVN, ;EXTENSION FOR SAVED FILES == "DMP" +> + IFN SAVN, < + SAVDMP== ;EXTENSION FOR SAVED FILES == "SAV" +> + ;DISPLAY AND LITE PEN + + IFG DISN,< + IFG T340N, ;TYPE 340 ENTRY POINT + IFE T340N, ;TYPE 30 ENTRY POINT + INTERN DISBLK,DISJSR,OFFDIS,DISPON,DISPOF + DISBLK==40+2*DISCHN ;BLKI/BLKO LOCATION + DISJSR==DISBLK+1 + ONDIS==100+10*PENCHN+DISCHN + NONDIS==10*PENCHN+DISCHN + OFFDIS==0 + DISBIT==1 + REPEAT 7-DISCHN, + DISPON==2000+DISBIT ;CONO PI, TURNS DIS PI CHANNEL ON + DISPOF==1000+DISBIT ;CONO PI, TURNS DIS PI CHANNEL OFF +> + ;LINE PRINTER ENTRY POINT AND DDB DEFINITIONS + + IFG LPTN, < + +;PROTOTYPE DEFINITION FOR LINE PRINTER DEVICE DATA BLOCKS + +DEFINE LPTDDB (N) < + + XLIST ;TURN OFF LISTING DURING EXPANSION + +LP'N'SV1=LP'N'SAC+DEVDAT ;DEFINE DEVDAT SAVE LOCATION + +LP'N'INT: CONSO LP'N,0 ;(-4) SKIP IF INTERRUPT FOR THIS LPT + JRST .-1 ;(-3) GO TO NEXT SKIP CHAIN ELEMENT + MOVEM DEVDAT,LP'N'SV1 ;(-2) SAVE DEVDAT IN CHANNEL SAVE AREA + JSP DEVDAT,LPTINT ;(-1) SET UP DDB ADDRESS AND BRANCH +LP'N'DDB: +LP'N'NAM: + + IFE LPTN-1, < SIXBIT /LPT/ ;( 0) PHYSICAL DEVICE NAME> + IFN LPTN-1, < SIXBIT /LPT'N/ ;( 0) PHYSICAL DEVICE NAME> + XWD ^D60*HUNGST,B23+LPTSIZ ;( 1) DEVICE CHARACTERISTICS + 0 ;( 2) DEVICE I/O STATUS + XWD 0,LPTDSP ;( 3) LH=DDB LINK, RH=DSP TABLE ADDR. +LPTMOD==1_A+1_AL+1_I ;LPT LEGAL MODES + XWD DVOUT+DVLPT,LPTMOD ;( 4) DEVICE CHARACTERISTICS + 0 ;( 5) LOGICAL DEVICE NAME + 0 ;( 6) BUFFER HEADER ADDRESSES +LP'N'PTR: 0 ;( 7) BLOCK OUTPUT POINTER + XWD PROG,0 ;(10) CURRENT OUTPUT BUFFER ADDRESS + EXP 11*LP'N'CHN ;(11) INTERRUPT CHANNEL ASSIGNMENTS + + MOVE DEVDAT,LP'N'SV1 ;(12) RESTORE DEVDAT, SAVE AC'S + JSR LP'N'SAV ;(13) AND ESTABLISH PDP + MOVEI DEVDAT,LP'N'NAM ;(14) SET UP DDB ADDRESS AND RETURN + JRST LPTNXT ;(15) TO COMMON INTERRUPT HANDLER + + MOVE DEVDAT,LP'N'SV1 ;(16) RESTORE DEVDAT AND + JEN @LP'N'CHL ;(17) DISMISS INTERRUPT + 0 ;(20) SAVE LOCATION FOR DAT + CONSZ LP'N,LPTECM ;(21) THE REST OF THE DDB CONTAINS + CONSO LP'N,LPTDON ;(22) THE ACTUAL I/O INSTRUCTIONS + CONSO LP'N,(DAT) ;(23) USED BY THE COMMON SERVICE + CONSZ LP'N,(DAT) ;(24) ROUTINE TO CONTROL A LINE + CONI LP'N,DAT ;(25) PRINTER. THEY ARE EXECUTED + CONO LP'N,(DAT) ;(26) BY MEANS OF AN XCT INSTRUCTION + DATAO LP'N,(DAT) ;(27) INDEXED TO THE PROPER DDB + BLKO LP'N,LP'N'PTR ;(30) + + LIST ;TURN LISTING BACK ON AFTER EXPANSION + +> + EXTERN LPTSER, LPTNXT, LPTECM, LPTDON, LPTINT, LPTDSP + + LPT2=234 ;DEVICE SELECT CODE FOR SECOND LPT + + IFNDEF LP0, ;DEFINE STANDARD MNEMONIC DEFINITIONS + IFNDEF LP1, ; BUT ALLOW FOR OVERRIDE + + $LPNUM=0 ;TEMPORARY SYMBOL USED TO FACILITATE + ; MACRO GENERATION + + + REPEAT LPTN, < + + LPTDDB \$LPNUM + $LPNUM=$LPNUM+1 + > + +> + + ;CARD READER ENTRY POINT AND BITS + + IFG CDRN, < + IFG CR10N, ;CR10 ENTRY POINT + IFE CR10N, ;PDP-6 CARD READER + INTERNAL CDRBTS + CDRBTS==1670+CDRCHN +> + + +;CARD PUNCH ENTRY POINT + + IFG CDPN, < + EXTERN CDPSER ;ENTRY POINT + > + ;PLOTTER ENTRY POINT + + IFG PLTN, + +;PAPER TAPE READER ENTRY POINT AND MASK + + IFG PTRN, ;MASK==0 IF PDP-10 READER + IFE PDP10N, ;MASK==777777 FOR PDP-6 READER +> + + +;PAPER TAPE PUNCH ENTRY POINT + + IFG PTPN, + ;DISK ENTRY POINTS AND BITS + + + IFG DSKN,< + INTERN DSKBIT,DCBBIT,DSKON,DSKOFF + DCBBIT==0 ;0 UNLESS DATA PRODUCTS DISK(SEE BELOW) + DSKBIT==1 ;LOW PRIORITY DISK PI CHANNEL + REPEAT 7-DSKCHN, + DSKON==2000+DSKBIT ;CONO PI, TURN DISK CHANNEL ON + DSKOFF=1000+DSKBIT ;CONO PI, TURN DISKCHANNEL OFF + IFG RD10N,< ;BURROUGHS DISK + EXTERN RCXINT,DSKSRB,RCXWNZ ;LOAD EARLIER VERSION + ; DSKINT,DSKSRB,ONCEB + IFG SYS50N, ;LOAD EARLIER VERSION OF SCHEDB + > + IFG DPDN,< ;IF DATA PRODUCTS DISK + EXTERNAL LODINT ;LOAD DPDINT + EXTERNAL DSKSRD ;LOAD ONCE=DSKSR FOR DATA PROD DISK + + INTERN DCBBIT,DSKX8,DSKX9 + DCBBIT==1 + REPEAT 7-DCBCHN, + DSKX8==40+2*DCBCHN ;DATA-CONTROL BLKI/BLKO OCS + DSKX9==DSKX8+1 + > + IFG RA10N,< ;IF BRYANT DISK + EXTERN MDFINT,DSKSER,MDFWNZ + IFG SYS50N, + > +> + +;PSEUDO TTY ENTRY POINT + + IFE PTYN, + IFG PTYN, < + IFE FULLN, ;HALF DUPLEX SCANNER SOFTWARE + IFG FULLN, ;FULL DUPLEX SCANNER SOFTWARE +> + LIT + RELOC .-COMORG ;NOW MAKE RELOCATABLE SO NEXT PROGRAM WILL BE LOADED + ; IMMEDIATELY AFTER THIS ONE + +COMEND: END + diff --git a/src/conall.ccl b/src/conall.ccl new file mode 100644 index 0000000..af2c7d9 --- /dev/null +++ b/src/conall.ccl @@ -0,0 +1,31 @@ +CLOCK1,CLOCK1/C_S,FT40N,CLOCK1/N +CLKCSS,CLKCSS/C_S,FT50SB,CLKCSS/N +COMCON,COMCON/C_S,FT50SB,COMCON/N +COMMON,COMMON/C_S,CONFIG,COMMON/N +CORE1,CORE1/C_S,FT50SB,CORE1/N +DIS340,DIS340/C_S,DISSER/N +DIS34,DIS30/C_S,DIST30,DISSER/N +DCSINT,DCSINT/C_S,DCSINT/N +DLSINT,DLSINT/C_S,DLSINT/N +DPDINT,DPDINT/C_S,DPDINT/N +DSKINT,DSKINT/C_S,DSKINT/N +DSKSER,DSKSER/C_S,FT50SB,DSKSER/N +DTCSRN,DTCSRN/C_S,FT50SB,DTCSRN/N +DTASRN,DTASRN/C_S,FT50SB,DTASRN/N +EDDT,EDDT/C_EDDT/N +ERRCON,ERRCON/C_S,ERRCON/N +JOBDAT,JOBDAT/C_JOBDAT/N +LPTSER,LPTSER/C_S,LPTSER/N +MTCSR6,MTCSR6/C_S,MTCSR6/N +MTASRX,MTASRX/C_S,MTASRX/N +NULSEG,NULSEG/C_S,FT50SB,NULSEG/N +PLTSER,PLTSER/C_S,PLTSER/N +PTRSER,PTRSER/C_S,PTRSER/N +PTPSER,PTPSER/C_S,PTPSER/N +PTYSRF,PTYSRF/C_S,PTYSRF/N +PTYSRH,PTYSRH/C_S,PTYSRH/N +PATCH,PATCH/C_PATCH/N +ONCEB,ONCEB/C_S,FT50SB,ONCEB/N +SCNSRF,SCNSRF/C_S,FT50SB,SCNSRF/N +SCHEDB,SCHEDB/C_S,FT50SB,SCHEDB/N +UUOCON,UUOCON/C_S,FT50SB,UUOCON/N diff --git a/src/config.mac b/src/config.mac new file mode 100644 index 0000000..f742e73 --- /dev/null +++ b/src/config.mac @@ -0,0 +1,227 @@ +SUBTTL CONFIG - CONFIGURATION DEFINITION FILE OUTPUT BY MONGEN DIALOG + + +;ANSWER THE FOLLOWING QUESTIONS WITH Y OR N OR A DECIMAL NUMBER + +;SHORT DIALOG?[N = LONGER QUESTIONS] +;Y + + +;10/30 SYSTEM TO BE BUILT?[N = 10/40 OR 10/50 SYSTEM] +;N + + +;10/40 SYSTEM TO BE BUILT?[N = ASSUME 10/50 SYSTEM] +;N + +XP SYS40N,0 +XP SYS50N,1 +XP DSKN,1 +XP LOGINN,1 + +;RD10 (BURROUGHS) DISK?[ONE DISK TYPE FOR FILES, +;SAME TYPE FOR SWAPPING OR ONE OTHER TYPE FOR SWAPPING] +;Y + +XP RD10N,1 + +;RD10 FOR SWAPPING?[N = CAN SWAP ON SOME OTHER TYPE] +;Y + +XP RDSWPN,1 + +;RP10 (MEMOREX) DISK PACKS? +;N + +XP RP10N,0 +XP RPSWPN,0 + +;RA10 (BRYANT) DISK? +;N + +XP RA10N,0 +XP RASWPN,0 + +;DPD (DATA PRODUCTS) DISK? +;N + +XP DPDN,0 +XP DPSWPN,0 + +;HOMW MANY JOBS?[ATTACHED AND DETACHED, COUNTING NULL JOB] +;28 +XP JOBN,34 + +;MAX SIZE OF CORE (IN K) FOR ANY SINGLE USER? +;0 MEANS ALL OF CORE +;0 +XP COREN,0 + +;PDP-10 PROCESSORE?[N = PDP-6] +;Y + +XP PDP10N,1 + +;2 RELOCATION REG, SOFTWARE?[Y = MUST HAVE KT10A, +;N = JUST 1 RELOC. REG.] +;Y + +XP KT10AN,1 + + +;HOW MANY MORE SEGMENTS THAN JOBS?[0 UNLESS YOU +;ANTICIPATE A LOT OF DORMANT SEGMENTS] +;0 +XP SEGN,0 + +;LOAD EXEC DDT?[N = ONLY IF LOADER HAS RUN OUT OF CORE BEFORE] +;Y + +XP DDTN,1 + +;LOAD LOCAL SYMBOLS?[N = ONLY IF LOADER HAS RUN OUT OF ROOM BEFORE] +;Y + + +;LOAD USER DDT?[BOTH CAN BE LOADED TOGETHER, +;USE USER DDT FOR PATCHING UNDER TIME SHARING] +;Y + +XP UDDTN,1 + +;NAME OF THIS SYSTEM (24 CHARS OR LESS)? +DEFINE SYSNAM +< ASCIZ \4S47 DEC PDP-10 #2\> + +;WHAT IS THE SERIAL NUMBER OF YOUR ARITHMETIC PROCESSOR? +;2 +XP APRSN,2 + + +;NAME OF SYSTEM DEVICE?[DTA0 USUAL FOR 10/40 SYSTEM, +;DSK USUAL FOR 10/50 SYSTEM] +DEFINE SYSDEV +< SIXBIT "DSK"> +DEFINE SYSDAT +< ASCIZ /6-3-69/> + +;DATA LINE SCANNER(DC10)?[N = WILL ASK FOR 680 OR 630] +;Y + +XP DLSN,1 +XP CCIN,0 +XP DCSN,0 + +;HIGHEST (OCTAL) LINE NUMBER?[USUALLY 7,17,27, ETC. FOR DC-10 OR 630 +;10, 20, 30 ETC. FOR 680 (TO ALLOW FOR PDP-8 CTY)] +;27 +XP HGHLIN,27 + +;FULL DUPLEX TTY SOFTWARE?[N = OLD HALF DUPLEX SOFTWARE] +;Y + +XP FULLN,1 +XP TABSN,0 + +;COMMON.MAC ALREADY EDITED FOR YOUR TTY CONFIGURATION? +;[N = WILL ALLOW YOU TO DEFINE NOW] +;Y + +XP EDITN,1 + +;PT READER? +;Y + +PTRN=1 ;NOT GLOBAL BECAUSE OF DSKSER USE + +;PT PUNCH? +;Y + +XP PTPN,1 + +;PLOTTER? +;Y + +XP PLTN,1 + +;HOW MANY LINE PRINTERS? +;1 +XP LPTN,1 + +;CARD READER? +;Y + + +;CR10?[Y = CR10A TOO, N IF PDP-6 CARD READER] +;Y + +XP CDRN,1 +XP CR10N,1 + +;CARD PUNCH +;N + +XP CDPN,0 + +;DISPLAY? +;N + +XP DISN,0 +XP PENN,0 +XP T340N,0 + +;HOW MANY DECTAPES? +;8 + +;TD10 DECTAPE CONTROL?[N = PDP-6 DECTAPE] +;Y +XP DTAN,10 +XP DTCN,0 + +;HOW MANY MAGTAPES? +;3 + +;TM-10A CONTROL?[N = WILL ASK TM-10B, THEN PDP-6 MAGTAPES] +;Y + +XP MTAN,3 +XP MTBN,0 +XP MTCN,0 + +;HOW MANY PSEUDO-TTY'S?[EACH CONCURRENT BATCH NEEDS ONE] +;2 +XP PTYN,2 +;TYPE "SYMBOL,VALUE" (VALUE IN DECIMAL)[FOR ANY SYMBOLS +;TO BE DEFINED. TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.] +RADIX 10 + +RADIX 8 +;TYPE "DEVICE-MNEMONIC,CHANNEL"FOR SPECIAL DEVICES +;[WITH NEITHER CHANNEL SAVE ROUTINE NOR DEVICE DATA BLOCK. +;"DEVICE" MUST BE 5 CHARCATERS OR LESS, +;TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.] +DEFINE SPCINT +< +>;TYPE "DEVICE-MNEMNIC,CHANNEL,NO.-OF-DEVICES" +;[FOR SPECIAL DEVICE WITH CHANNEL SAVE ROUTINES AND DEVICE DATA BLOCKS +;"DEVICE" MUST BE 5 CHARS. OR LESS. +;TYPE EXTRA CARRIAGE RETUERN WHEN THROUGH.] +DEFINE SPCSAV +< +>;MONGEN FINISHED +;NEXT YOU MUST ASSEMBLE COMMON WITH MACRO +;THEN LOAD IT AND REST OF MONITOR WITH LOADER +;AND FINALLY SAVE IT WITH MONITOR COMMAND SAVE + +;[TO ASSEMBLE COMMON, TYPE +;R MACRO +;DSK:COMMON,LPT:_DSK:S,CONFIG,COMMON +;TO LOAD NEW MONITOR, TYPE +;R LOADER +;/S +;DSK:COMMON,DSK:SYS50/L +;LPT:_/W/D/A/M/P/G +;TO SAVE MONITOR, TYPE +;SAVE DSK MONITOR +;] +; ;END OF CONFIGURATION DEFINITION diff --git a/src/core1.mac b/src/core1.mac new file mode 100644 index 0000000..1b96cdb --- /dev/null +++ b/src/core1.mac @@ -0,0 +1,631 @@ +TITLE CORE1 - LOGICAL AND PHYSICAL CORE ALLOCATION ROUTINES - V414 +SUBTTL T. HASTINGS/TH/RCC TS 04 JUN 69 +XP VCORE1,414 + ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB + + ENTRY CORE1 ;ALWAYS LOAD CORE1(FOR LIB SEARCH) + +;CORE ALLOCATION IS DONE ON A 1K BLOCK BASIS + +;USING A USE BIT TABLE(CORTAB) WHICH HAS A 1 +;FOR EVERY BLOCK WHICH IS NOT AVAILABLE BECAUSE: +; 1.IN USE BY MONITOR +; 2.IN USE BY USER +; 3.NON-EXISTANT MEMORY +;0 MEANS BLOCK IS NOT IN USE + +;WHEN THE SYSTEM IS STARTED, SYSINI SETS THE CORTAB TABLE +;IT ALSO SETS A BYTE POINTER(CORLST) WHICH POINTS TO THE +;LOWEST NON-EXISTANT BLOCK IMMEDIATELY ABOVE THE HIGHEST +;EXISTANT BLOCK. IT ALSO SETS CORTAL TO THE NO. OF +;FREE BLOCKS AVAILABLE. +;THE CORE1 ROUTINE ASSIGNS CORE IF POSSIBLE. SETS THE USE BITS. +;AND MOVES THE JOB IF NEW ASSIGNEMENT IS A DIFFERENT PLACE THEN OLD +;THE JBTADR TABLE IS ALSO UPDATED BY THE CORE ROUTINES +;LH-PROTECTION,RH=RELOCATION +;JOBADR IS MODIFIED IF CORE FOR CURRENT JOB +;HARDWARE RELOC. AND PROTEC. ARE RESET IF CURRENT JOB +;FINALLY JOBREL(PROTECTION) IN JOB DATA AREA IS ALWAYS UPDATED + +;LIST OF GLOBALS AFFECTED: +;JBTADR,CORTAL,CORTAB,HOLEF,SWFWAT,JOBADR + +;ACS USED(BESIDES TAC,TAC1,JDAT,IOS,DEVDAT,AND POP) +BLK=BUFPNT ;HIGHEST REL. ADR. IN USER AREA +LOC=BUFWRD ;ABS. LOC. OF FIRST BLOCK IN USER AREA +T=AC1 ;TEMPORARY +T1=AC2 ;" + ;CORE UUO +;CALL MOVEI AC,HIGHEST REL. ADR. DESIRED IN LOW SEG +; HRLI AC,HIGHEST REL. ADR. DESIRED IN HIGH SEG +; CALL AC,[SIXBIT /CORE/] +; ERROR RETURN +; OK RETURN TO USER. JOB MOVED IF NECESSARY +;RETURN NO. OF FREE 1K BLOCKS IN AC(OR MAX. NO. BLOCKS ALLOWED IF SWAPPING SYS) +;BOTH HALVES 0 MEANS ERROR RETURN NO. OF FREE 1K BLOCKS(OR MAX. NO. OF BLOCKS +; ALLOWED IF SWAPPING SYSTEM) IMMEDIATELY WIOTHOUT AFFECTING CORE +; OR WAITING FOR IO DEVICES +;LH=0 MEANS DO NOT CHANGE HIGH SEG ASSIGNMENT +;RH=0 MEANS DO NOT CHANGE LOW SEG ASSIGNMENT + +INTERNAL CORUUO +EXTERNAL USRREL,JOB,CORTAL +EXTERNAL ESTOP1,IOWAIT,OERROR,SETREL,STOTAC,WSCHED + +CORUUO: JUMPE TAC,ZERCOR ;IS HE ASKING FOR ZERO CORE? + PUSH PDP,TAC ;NO, SAVE HIGHEST DESIRED ADDRESS IN BOTH SEGS + PUSHJ PDP,IOWAIT ;WAIT FOR ALL DEVICE INACTIVE + HRRZ TAC,(PDP) ;HIGHEST REL. LOC. DESIRED FOR LOW SEG(RH) + JUMPE TAC,CORU1 ;IS RH 0(IF YES DO NOT CHANGE LOW SEG)? + IORI TAC,1777 ;NO, MAKE EVEN MULTIPLE OF 1K-1 + PUSHJ PDP,CORE1 ;TRY TO ASSIGN CORE + JRST CORERR ;NOT AVIALABLE, ERROR RETURN + ; SUM OF NEW LOW AND OLD HIGH SEG TO BIG +CORU1: HLRZ TAC,(PDP) ;CHECK TO SEE IF USER REQUESTING HIGH CORE +IFE FT2REL,< + CAMG TAC,USRREL ;0 MEANS NO CHANGE, 1 THRU TOP OF LOW SEG MEANS + ; RETURN HIGH CORE (IF ANY), ALWAYS LEGAL + ; EVEN IF NO HIGH SEB SHARP WARE OR SOFTWARE +> +IFN FT2REL,< + EXTERN UCORHI + PUSHJ PDP,UCORHI ;TRY TO ASSIGN CORE TO HIGH SEG. + ; UCORHI EXPECTS ARG ON PD LIST + JRST CORERR ;ERROR-ACTIVE IO(SAVE IN PROGRESS FOR SOME USER) + ; OR SUM OF NEW LOW SEG AND NEW HIGH SEG TOO BIG +> + AOS -1(PDP) ;SET FOR DK(SKIP) RETURN +CORERR: POP PDP,TAC ;REMOVE ARG FROM LIST +IFN FTSWAP,< + PUSHJ PDP,WSCHED ;CALL SCHEDULER TO STOP JOB + ; IN CASE LOW SEG MUST BE SWAPPED OUT TO EXPAND + ; OR HIGH SEG LOGICAL CORE ASSIGNED ON DISK + ; SAVE ALL ACS EXECPT AC1,AC2,AC3, +> +ZERCOR: +IFE FTSWAP,< + MOVE TAC,CORTAL ;RETURN NO. OF FREE 1K BLOCKS (COUNTING + ; DORMANT AND IDLE SEGMENTS AS FREE) +> +IFN FTSWAP,< + MOVE TAC,CORMAX ;RETURN MAX. NO. 1K BLOCKS ALLOWED FOR 1 USER TO HAVE + LSH TAC,-12 +> + JRST STOTAC ;STORE IN USER AC AND RETURN TO USER + ;ROUTINE TO CHECK JOBS TO SEE IF ANY JOB CAN BE SHUFFLED +;IT IS CALLED EVERY 60TH OF A SECOND BY CLOCK ROUTINE +;PROVIDING CURRENT JOB IS IN USER MODE OR JUST ENTERING +;IO WAIT OR SHARABLE DEVICE WIAT OR RETURNING ON UUO CALLS +;IE CURRENT JOB AND ALL OTHER JOB ARE SHUFFABLE WITH RESPECT +;TO RELOCATION INFO IN MONITOR +;SINCE RESCHEDULING IS NEVER DONE WHEN CURRENT JOB +;IS NOT SHUFFABLE. ALL JOBS ARE SHUFFABLE WHEN +;CHKSHF IS CALLED. +;THE NOSHUFFLE MACRO SHOULD STILL BE USED WHEN EVER +;THE MONITOR MOVES RELOCATION OUT OF ACS PDP,PROG. OR JDAT +;IN CASE IT SHOULD PROVE DESIRABLE IN THE FUTURE TO SHUFFLE +;MORE FREQUENTLY THEN AT THE ABOVE TIMES +;FINALLY A JOB MUST HAVE ALL DEVICES INACTIVE(SINCE SOME +;OF THEM USE ABSOLUTE ADDRESSES)BEFORE IT CAN BE MOVED +;SO CORE CANNOT BE REASSIGNED WHILE DEVICES ARE ACTIVE +;IF DEVICES ARE ACTIVE, JOB WILL BE STOPPED SO THAT IO WILL +;CEASE SOON SO JOB CAN BE SHUFFLED +;ALL DEVICES LOOK AT SHF BIT IN JBTSTS(ADVBEF OR ADVDFE) +;TO SEE IF MONITOR IS WAITING TO SHUFFLE JOB +;THE NSHF BIT IN JOBSTS WHOULD BE SET FOR JOBS USING DISPLAYS +;SINCE DISSER CONTINUALLY REFERENCES USER AREA EVEN THOUGH +;IOAC1 IS OFF. + +;THIS VERSION OF THE CORE SHUFFLER WORKS AS FOLLOWS: +;EVERY CLOCK TICK FOR WHICH ALL JOBS ARE SHUFFABLE(NOT COUNTING ACTIVE +;IO DEVICES). THE JOB IMMEDIATELY ABOVE THE LOWEST HOLE +;(IF ANY) WILL BE MOVED DOWN INTO HOLE. THE HOLEF IS SET NON-ZERO +;TO THE ADDRESS OF JOB IMMEDIATELY ABOVE THE LOWEST +;HOLE(0 IF NONE), EVERY TIME CORE IS REASSIGNED. +;CANNOT BE CALLED WHILE SWAPPING IN PROGRESS FOR THIS JOB(BECAUSE IT CALLS CORE0) + +INTERNAL CHKSHF,FTSWAP +EXTERNAL SHFWAT,HOLEF,CLKCHL,JBTADR,JBTSTS,JBTMAX + +CHKSHF: SKIPE ITEM,SHFWAT ;HAS CHKSHF STOPPED A JOB AND IS WAITING FOR + ; DEVICES TO BECOME INACTIVE? + JRST SHFLOP ;YES, SEE IF IO HAS STOPPED YET + SKIPN TAC,HOLEF ;NO, DOES CORE HAVE A HOLE IN IT? + POPJ PDP, ;NO + MOVEI ITEM,JBTMAX ;SEARCH FOR JOB OR HIGH SEG JUST ABOVE HOLE +HOLLOP: HRRZ TAC1,JBTADR(ITEM) ;ADR. OF JOB + + CAME TAC1,TAC + SOJG ITEM,HOLLOP ;NOT JOB ABOVE HOLE KEEP LOOKG + JUMPG ITEM,SHFLOP ;FOUND ONE? + SETZM HOLEF ;NO, CLEAR HOLEF OR ELSE ERROR WILL BE PRINTED EVERY + ; CLOCK TICK AND ERROR MESSAGE WILL NEVER PRINT + JSP DAT,OERROR ;SYSTEM ERROR(TELL OPERATOR) + +SHFLOP: SKIPE PROG,JBTADR(ITEM) ;JOB ABOVE HOLE STILL IN CORE ? + PUSHJ PDP,ANYACT ;NO ALL DEVICES FINISHED ? + JRST NOTSHF ;YES, GO SEE IF HOLD STILL THERE +IFN JDAT-PROG,< + MOVE JDAT,JBTDAT(ITEM) ;JOB DATA AREA +> + HLRZ TAC,PROG ;YEST, REASSIGN SAME AMOUNT OF CORE. + PUSHJ PDP,SCORE1 ;IN A LOWER POSITION IN CORE + +NOTSH1: SETZM SHFWAT ;JOB SHUFFLED, CLEAR FLAG + MOVSI TAC,SHF ;CLEAR SHUFFLE WAIT BIT IN CASE IT WAS ON + ANDCAM TAC,JBTSTS(ITEM) + POPJ PDP, + +;JOB CANNOT BE MOVED BECAUSE IT HAS ACTIVE DEVICES OR NSHF BIT SET(DISPLAY,REALTIME) +; SO JOB CANNOT BY SHUFFLED AT THIS TIME + +NOTSHF: SKIPN HOLEF ;IS HOLE STILL THERE? + JRST NOTSH1 ;NO +IFN FTSWAP,< + EXTERNAL FIT,FORCE + MOVE TAC,FORCE + CAME ITEM,FIT + CAMN ITEM,TAC + JRST NOTSH1 +> + MOVEM ITEM,SHFWAT ;SET SHUFFLE WAIT FLAG WITH JOB NO. + MOVSI TAC,SHF ;SET SHF WAIT BIT IN JOB STATUS WORD + IORM TAC,JBTSTS(ITEM) ;SO JOB WILL NOT BE RUN + POPJ PDP, ;AND IO WILL STOP SOON + +;ROUTINE TO TEST FOR ANY ACTIVE DEVICES + +;CALL: MOVE ITEM,JOB NUMBER OR HIGH SEG NUMBER +; MOVE JDAT,ADDRESS OF JOB DATA AREA +; PUSHJ PDP,ANYACT +; DEVICES ACTIVE +; DEVICES NOT ACTIVE EXCEPT POSSIBLY TTY +;IN SWAPPIN SYSTEMS ANYACT IS BROKEN INTO 2 CALLS, TRYSWP AND ANYDEV +;TRYSWP TEST WHTETHER SWAPPER SHOULD EVEN CONSIDER SWAPING JOB + + INTERN ANYACT,ANYDEV + EXTERN JOBMAX +ANYACT: +IFN FTSWAP,< + INTERN ANYDEV + PUSHJ PDP,TRYSWP ;SHOULD SWAPPER MAKE JOB UNRUNNABLE + ; IN ORDER TO SWAP OUT? + POPJ PDP, ;NO, ACTIVE SAVE IN PROGRSS OR NSH,NSWP + ; (REAL TIME OR DISPLAY) +> +ANYDEV: MOVE T,JBTSTS(ITEM) ;IS JOB(OR HIGH SEG) NOT SHUFFABLE? + TLNE T,NSHF ;DISPLAY AND REAL TIME SET NSHF + POPJ PDP, ;CANNOT BE SHUFFLED +IFN FT2REL,< + CAILE ITEM,JOBMAX ;YES IT THIS A HIGH SEG? + JRST CPOPJ1 ;YES, OK TO SHUFFLE OR SWAP SINCE NSHF,NSWP + ; AND NO SAVE IN PROGRESS +> + MOVEI T,JOBJDA(JDAT) ;ASSUME JOB IS NOT CURRENT JOB + CAMN ITEM,JOB ;IS IT? + MOVEI T,USRJDA ;IT IS CURRENT JOB + ; DEVICE ASSIGNMENT TABLE IN MONITOR + MOVEI IOS,IOACT ;IO DEVICE ACTIVE BIT + HRRZ T1,JOBJMH(T) ;GET NO. OF USER IO CHANNELS IN USE + ; FOR JOB(EITHER FROM JOB DATA AREA + ; OR FROM MONITOR (IGNORE LH WHICH MY BE-1 + ; IF SAVEGET IN PROGRESS) + TLO T,T1 ;SET TO ADD T TO T1 + MOVSI AC3,DVTTY ;DEVICE IS A TTY BIT +ANY: SKIPE DEVDAT,@T ;IS A DEVICE ASSIGNED TO THIS CHANNEL? + TDNN IOS,DEVIOS(DEVDAT) ;YES, IS IT ACTIVE? +ANY2: SOJGE T1,ANY ;NO, KEEP LOOKING + JUMPL T1,CPOPJ1 ;YES, FINISHED YET? + TDNN AC3,DEVMOD(DEVDAT) ;NOT FINISHED, IS DEVICE TTY? + POPJ PDP, ;NO, ERROR RETURN, CANNOT ASSIGN CORE + JRST ANY2 ;YES, KEEP LOOKING FOR AN ACTIVE DEVICE + +;ROUTINE TO TEST TO SEE IF JOB OR HIGH SEG CAN BE SWAPPED +; OR WHETHER IT SHOULD BE ALLOWED TO CONITNUE RUNNING +; UNTIL A MORE FAVORABLE ITME +;CALL: MOVE ITEM,HIGH RO LOW SEG NUMBER +; PUSHJ PDP,TRYSWP +; RETURN1 - JOB MUST REMAIN RUNABLE(NSHF,NSWP SET OR SAVE,GET IN PROGRESS); RETURN2 - OK TO SWAP HIGH OR LOW SEG + +IFN FTSWAP,< + INTERN TRYSWP + EXTERN JBTSTS,CPOPJ1 + +TRYSWP: MOVE T,JBTSTS(ITEM) ;IS JONB OR HIGH SEG NOT SWAPPABLE? + TLNE T,NSHF!NSWP ;OR SHUFFABLE(DISPLAY,REAL TIME)? + POPJ PDP, ;YES, ERROR RETURN +IFN FT2REL,< + EXTERN ANYSAV + JRST ANYSAV ;NO, SEE IF THIS JOB IS INVLOVED IN A SAVE,GET + ; WHICH IS STILL ACTIVE +> +IFE FT2REL,< + JRST CPOPJ1 ;NO, GIVE OK RETURN +> +> + +;ROUTINE TO FLUSH PHYSICAL CORE ASSIGNED IN MEMORY +;NOTE: THIS ROUTINE DIFERS SIGNIFICANTLY FROM CORE0 AND CORE1 IN THAT +;IT IS ONLY A PHYSICAL REMOVAL OF CORE(VIRTAL IS NOT AFFECTED) +;SEE COMMENTS FOR CORE1 +;CALL: MOVE ITEM,HIGH OR LOW SEGMENT NUMBER +; PUSHJ PDP,KCORE1 +; ALWAYS RETURN HERE +;SCORE1 IS CALLED FROM SHUFFLER WITH TAC SET TO SEG SIZE + + INTERN KCORE1 + +KCORE1: MOVEI TAC,0 ;SETUP DESIRED HIGHEST ADR +SCORE1: SOS(PDP) ;CORE1 WILL ALWAYS SKIP RETURN + JRST CORE1A ;BYPASS LOGICAL CORE ASSIGNMENT PART + ; AND FLUSH PHYSICAL CORE(LOGICAL CORE UNEFFECTED) + + +;CORE0 IS CALLED BY THE CORE MONITOR COMMAND AND THE CORE SHUFFLER + +;AND RUN COMMAND +;BOTH LOGICAL AND PHYSICAL CORE ASSIGNMENT ARE AFFECTED + +;CALL: MOVE TAC,HIGHEST LEGAL ASSRESSABLE LOC. DESIRED +; MOVE ITEM,JOB NUMBER +; MOVE PROG,[XWD PROT,,RELOC.]=JBTADR(ITEM) +; PUSHJ PDP,CORE0 +; ERROR ;EITHER JOB HAS ACTIVE IO + ; OR NOT ENOUGH CORE +; OK RETURN +;JOB IS MOVED IF NECESSARY TO SATISFY REQUEST +;PROG AND JDAT ARE SET TO NEW CORE ASSIGNMENT ON EITHER RETURN +;0 MEANS NONE ASSIGNED IN MEMORY, ASSIGNED ON DISK +INTERNAL CORE0 +INTERNAL CORE1,FTTIME,FTTRPSET,CORGET,FTSWAP +EXTERNAL JOBJDA,JOB,USRJDA,JOBADR,JBTADR +EXTERNAL JOBREL,JOBADR,JOBDAC,JOBPC,JOBDAT,JBTDAT +EXTERNAL CORTAL,CORLST,CORTAB,HOLEF,CLRWRD +EXTERNAL USRREL,CPOPJ1,JOBJMH,JOBENB,JOBDPD,JOBDPG +EXTERNAL JOBPR1,CPOPJ1,JOBPRT,USRPC,CORMAX +;ENTER HERE FROM CORE CONSOLE COMMAND OR INITIAL CORE +;ASSIGNMENT OF JUST A JOB DATA AREA FOR RUN COMMAND +;IE ENTER WHEN DEVICES MAY BE ACTIVE OR JOB MAY HAVE NO PREVIOUS CORE +;JOB CAN HAVE CORE IN MEMORY, CORE ON DISK., OR NONE EITHER PLACE +;JOB CANNOT BE IN PROCESS OF SWAP OUT OR SWAP IN(CALLER'S RESPONSIBILITY) +;CORE0 NO LONGER REASSIGN CORE ON DISK IF OLD CORE ON DISK +;BECAUSE OF FRAGMENTED SWAPPING(TOO HARD) UNLESS 0 BEING ASKED FOR +;THEREFORE THE CORE COMMAND CAUSES JOB TO BE SWAPPED INTO CORE FIRST(INCORE=1) +;HOWEVER, THE R,RUN,GET,KJOB COMMANDS DO NOT REQUIRE HE PREVIOUS CORE IMAGE TO +;BE SWAPPED IN(AS THIS IS SLOW). THEY ASK FOR 140 WORDS, AND LARGER DISK SPACE IS RELINQUISHED +;UPON SWAPIN BY THE SWAPPER, VIRTAL IS INCREASED THEN RATHER THAN +;ON THE CALL TO CORE0. +;IT WILL TRY TO REASSIGN CORE IN MEMORY IF OLD CORE IN MEMORY +;IF THIS FAILS, IT WILL REASSIGN NEW CORE ON DISK AND ASK SWAPPER TO EXPAND +;IF JOB DID NOT HAVE OLD CORE, AN ATTEMPT WILL BE MADE TO ASSIGN CORE IN MEMORY +;IF THIS FAILS, TI WILL BE ASSIGNED ON THE DISK AND ASK SWAPPER TO EXPAND +;THE OTHER PLACES IN THE MONITOR WHERE THE IN-CORE COUNT IS TOUCHED IS +;IN GET WHERE IT INCREMENTS TO SHARE COPY ALREADY IN CORE. +;AND END OF SWPIN OF LOW SEG AND HIGH SEG IS ALREADY IN CORE FOR OTHER USER +;THE CORE ROUTINES DO NOT ALTER THE HIGH SEG IN CORE COUT. IT IS UP TO THE CALLER +;(IN SEGCOR) TO CALL THE CORE ROUTINES ONLY IF IN CORE COUNT IS 0 +;AND END OF SWAPIN OF LOW SEG AND HIGH SEG IS ALREADY IN CORE FOR OTHER USER + +CORE0: +IFE FTSWAP,< + JUMPE PROG,CORGET ;IS JOB WITHOUT CORE IN MEMORY? +> +IFN FTSWAP,< + EXTERN IMGOUT,CPOPJ1,CHGSWP + JUMPN PROG,CORE0A ;DOES JOB HAVE CORE IN MEMORY? + ; (ALWAYS TRUE BOTH SEGS IF CORE UUO) + IFE FT2REL,< + EXTERN CORMAX + CAML TAC,CORMAX ;NO, WILL REQUEST FIT IN PHYSICAL CORE? + ; COMPARE WITH LARGEST PERMITTED ADR+1(BUILD AND + ; ONCE CAN RESTART CORMAX) + + > + IFN FT2REL,< + EXTERN SUMSEG + PUSHJ PDP,SUMSEG ;NO, WILL SUM OF BOTHER SEGMENTS FIR IN PHYSICAL CORE? + ; LARGEST PERMITTED CORE, COMPARE SUM WITH CORMAX + > + POPJ PDP, ;NO, GIVE ERROR RETURN + MOVSI TAC1,SWP ;IS JOB SWAPPED OUT? + TDNN TAC1,JBTSTS(ITEM) ;(MAY HAVE 0 DISK SPACE ALTHOUGH SWAPPED OUT) + JRST CORE1 ;NO, TRY TO ASSIGN CORE IN MEMORY + PUSHJ PDP,CHGSWP ;YES, CHANGE ASSIGNMENT OF SWAPPING SPACE ON DISK + ; INCREASE VIRTAL(COUNT OF FREE 1K BLOCKS OF SWAPPING + ; (SHOULD NEVER NEED TO DECREASE VIRTAL SINCE + ; CORE COMMAND ALWAYSSWAPS JOB IN FIRST). + ; (FRAGMENTATION POSTPONES RETURNING SPACE AND + ; INCREASING VIRTAL UNTIL SWAP IN IF NOTASKING + ; FOR 0 VIRTUAL CORE) + JRST CPOPJ1 ;GIVE OK RETURN TO CALLER + +CORE0A: +EXTERNAL JBTSWP +> +IFN FTTRPSET,< + EXTERNAL STOPTS + SKIPN STOPTS ;NO,IS TIME SHARING STOPPED BY + ; TRPSET UUO DONE FOR JOB 1? +> + + PUSHJ PDP,ANYACT ;NO,ANY ACTIVE DEVICE? + POPJ PDP, ;YES, CANNOT ASSIGN CORE + ; NO, FALL INTO CORE1 +;ROUTINE TO TRY TO ASSIGN CORE IN CORE +;LOW OR HIGH SEG MUST NOT BE SWAPPED OUT(CALLER'S RESPONSIBILITY) +;AND MUST NOT HAVE ANY ACTIVE DEVICES(IT MAY HAVE 0 CORE IN CORE THOUGH) +;IN OTHER WORDS HIGH OR LOW SEG MAY OR MAY NOT HAVE VIRTUAL CORE +;BUT IF IT HAS VIRTUAL CORE IT MUST BE IN PHYSICAL CORE +;THIS IS BOTH A LOGICAL AND A PHYSICAL CORE ASSIGNMENT +;FIRST OLD CORE IS RETURNED TO SYSTEM +;THEN NEW REQUEST IS ATTEMPTED TO BE SATISFIED IN LOWEST +;POSITION POSSIBLE. THUS CORE TENDS TO BE PACKED +;IF NEW REQUEST CANNOT BE GRANTED, OLD AMOUNT OIS RETAINED, IF NON-SWAPPING SYS +;OTHERWISE SWAPPER IS CALLED(XPAND) TO EXPAND CORE BY SWAPPING OUT + + + EXTERN SEGSIZ + +CORE1: NOSCHEDULE ;PREVENT SCHEDULING + +IFN FTSWAP,< + EXTERN VIRTAL + PUSHJ PDP,SEGSIZ ;TAC1=OLD SEG SIZE + SKIPN LOC,TAC ;IS 0 BEING REQUESTED? + MOVNI LOC,1 ;YES, PRETEND -1(DEPEND ON ASH BUG WHICH KEEPS -1 + ; ON RT. SHIFT) + ASH LOC,-12 ;CONVERT TO NO. OF K-1(01,0,1,2,...) + SUB LOC,TAC1 ;NO. OF K-1 INCREASE=NEW-OLD-1 + CAMGE LOC,VIRTAL ;IS THERE ENOUGH FREE VIRTUAL CORE IN SYSTEM? +> +IFE FT2REL,< + CAML TAC,CORMAX ; YES, IS REQUEST LESS THAN MAX, ALLOWED COR+1? +> +IFN FT2REL,< + EXTERN SUMSEG + PUSHJ PDP,SUMSEG ;YES, IS SUM OF SEGS LESS THEN MAX. ALLOWED CORE+1? +> + POPJ PDP, ;NO, ERROR RETURN +IFN FTSWAP,< + ADDI LOC,1 ;YES, GET NO. OF K OF INCREASE + MOVNS LOC ;MAKE MINUS FOR UPDATE + ADDM LOC,VIRTAL ;AND UPDATE TOTAL VIRTUAL CORE IN SYSTEM + ; SINCE THIS REQUEST CAN BE SATISFIIED +> +CORE1A: NOSCHEDULE ;PREVENT JOB SCHEDULING + JUMPE PROG,CORGET ;OLD ASSIGNMENT 0? + ; IF YES, DO NOT ATTEMPT TO RETURN OLD CORE + HRRZ LOC,PROG ;NO. ABS, LOC. OF OLD CORE + HLRZ BLK,PROG ;HIGHEST LEGAL REL. ADR. + MOVEI T,0 ;CLEAR FOR CORSTG CALL + PUSHJ PDP,CORSTG ;RETURN OLD CORE TO FREE STORAGE +;CORGET IS CALLED BY SWAPPER WHEN JOB IS ON DISC AND IS +;WANTED IN CORE. + +CORGET: SETZB LOC,PROG ;SET NEW ASSIGNMENT TO 0 AND DIST. MOVED + JUMPE TAC,DIDLE1 ;IS ZERO CORE BEING REQUESTED? + PUSHJ PDP,HOLSRC ;NO, SEARCH FOR HOLE BIG ENOUGH + JRST BAKOLD ;NONE, GIVE BACK OLD AMOUNT +INTERN FTTRACK +IFN FTTRACK,< + EXTERN LASCOR + MOVEM ITEM,LASCOR ;LEAVE TRACKS FOR LAST JOB USING + ; PHYSICAL CORE ALLOCATION + ; (FOR DEBUGGING ONLY) +> + MOVEM LOC,PROG ;SETUP NEW RELOC + HRLM TAC,PROG ;AND NEW PROTECT. + MOVEI BLK,(TAC) ;HIGHEST REL ADR. BEING REQUESTED + MOVEI T,1 ;SET USE BITS IN CORE TBALE + PUSHJ PDP,CORSTG + MOVE BLK,JBTADR(ITEM) ;OLD CORE ASSIGNMENT + JUMPN BLK,MOVCOR ;WAS THERE OLD MEMORY ASSIGNED? + ; NO, +IFN FTSWAP,< + LDB TAC1,IMGOUT ;SIZE(IN K) OF SEG ON DISK TO BE SWAAPED IN + LSH TAC1,12 ;CONVERT TO WORDS +> +IFE FTSWAP,< + MOVEI TAC1,0 ;JOB HAS NO PREVIOUS VIRT. CORE(NON-SWAP SYS) +> + MOVE BLK,PROG ;MAKE OLD ASSIGNMENT(BL) APPEAR TO START + ; AT SAME PLACE AS NEW ASSIGNMENT(FOR CLEARING) + SOJA TAC1,CLRCR1 ;IF NEW CORE SIZE IS BIGGER THAN + ;OLD, CLEAR OUT INCREASED SO SECURITY WILL + ; BE MAINTAINED. TAC1 IS SIZE-1 OF OLD + ; ASSIGNMENT. -1 OF NO OLD ASSIGNMENT +;HERE WHEN FREE CORE TABLE DOES NOT HAVE ENOUGH ROOM FOR REQUEST + +BAKOLD: +IFN FTSWAP,< + EXTERN XPAND + PUSHJ PDP,XPAND ;TELL SWAPPER TO SWAP OUT +> +IFE FTSWAP,< + IFE FT2REL,< + SOSO (PDP) ;SET FOR ERROR RETURN AND GET BACK LO CORE + > + IFN FT2REL,< + EXTERN FRECOR + PUSHJ PDP,FRECOR ;TRY TO DELETE 1 DORMANT HIGH SEGMENT, + ; IF REQUEST DOES NOT EXCEED FREE CORE+DORMANT SEGS + SOSA (PDP) ;ERROR RETURN-NOT ENOUGH CORE, GET OLD AMOUNT BACK + JRST CORGET ;1 DORMANT SEG DELETED, TRY REQUEST AGAIN + > +> +BKOLD1: HLRZ TAC,JBTADR(ITEM) ;GIVE BACK OLD CORE. + JRST CORGET + +;MOVE OLD CORE TO NEW AREA + +MOVCOR: CAIN LOC,(BLK) ;IS NEW CORE IN SAME PLACE AS OLD? + JRST CLRCOR ;YES, DO NOT MOVE IT,CLEAR IF INCREASE + HLRZ TAC1,BLK ;LENGTH OF OLD CORE + CAILE TAC1,(TAC) ;IS OLD CORE LESS THEN NEW? + HRRZ TAC1,TAC ;NO, MOVE THE SHORTENED NEW CORE +IFN FTTIME,< + EXTERNAL SHRWRD + ADDM TAC1,SHRWRD ;INCREMENT TOTAL NO. WORDS SHUFFLED +> + ADD TAC1,LOC ;ADD IN NEW RELOC. + MOVE AC1,LOC ;DEST.=NEW RELOC. + HRL AC1,BLK ;SOURCE=OLD RELOC. + SETZM JBTADR(ITEM) ;FLAG THAT CORE IS IN TRANSIT(TTY ROUTINES) + BLT AC1,(TAC1) ;MOVE CORE TO NEW ASSIGNMENT + +;CLEAR INCREASE IF NEW CORE IS BIGGER THAN OLD + +CLRCOR: HLRZ TAC1,BLK ;OLD CORE SIZE-1 +CLRCR1: CAMG TAC,TAC1 ;IS NEW CORE SIZE-1 VREATER THAN OLD CORE SIZE-1 + JRST DIDLE ;NO, DO NOT CLEAR ANY CORE +IFN FTTIME,< + MOVE AC1,TAC ;NEW CORE SIZE + SUB AC1,TAC1 ;LESS OLD CORE SIZE + ADDM AC1,CLRWRD ;ACCUMULATE NO. OF WORDS CLEARED +> + ADDI TAC1,2(PROG) ;YES, OLD SIZE-1+NEW RELOC+2=2ND LOC TO CLEAR + ADDI TAC,(PROG) ;NEW SIZE-1+NEW RELOC=LAST LOC TO CLEAR + SETZM -1(TAC1) ;CLEAR FIRST WORD + HRLI TAC1,-1(TAC1) ;SET LH TO FIRST ADR. TO CLEAR + BLT TAC1,(TAC) ;CLEAR THE INCREASE PORTION +;IF THE SHUFFLED JOB IS IN EXEC MODE, ITS DUMP ACS +;(PDP,PROG,JDAT SAVED IN JOB DATA AREA) MUST BE +;ALTERED BY DISTANCE CODE WAS MOVED + +;IF THE SHUFFLED JOB IS CURRENT JOB, THE SOFTWARE STATE OF +;THE MONITOR(IE SOFTWARE INFO OF JOB) MUST BE ALTERED BY AMOUNT +;CORE WAS MOVED + +EXTERNAL SYSSIZ + +DIDLE: SUBI LOC,(BLK) ;DISTANCE JOB WAS MOVED(DIST.-SOURCE) + CAME ITEM,JOB ;IS THIS CURRENT JOB? + SKIPA TAC,JOBPC(JDAT) ;NO. GET PC IN JOB DATA AREA + MOVE TAC,USRPC ;YES, PC IN PROTECTED SYSTEM AREA +IFN FT2REL,< + EXTERN JOBMAX + CAIG ITEM,JOBMAX ;IS THIS A HIGH SEGMENT? +> + TLNE TAC,USRMOD ;NO. IS JOB IN USER MODE? + JRST DIDLE1 ;YES, DO NOT ALTER DUMP ACS + ; BECAUSE THEY ARE IN USERS(OR HIGH SEG) + ADDM LOC,JOBDPD(JDAT) ;NO. ALTER DUMP PDP BY DIST. OF MOVE + ADDM LOC,JOBDPG(JDAT) ;AND ALTER PROG BY DIST. MOVED +DIDLE1: MOVEM PROG,JBTADR(ITEM) ;STORE NEW CORE ASSIGNMENT(LOW OR HIGH SEG) + CAME ITEM,JOB ;IS THIS CURRENT JOB? + JRST DIDLE3 ;NO, DO NOT ALTER STATE OF MONITOR + MOVE TAC,SYSSIZ ;DONT CHANGE PDP IF LIST + CAIG TAC,(PDP) ;IS IN SYSTEM + ADD PDP,LOC ;YES, ALTER PUSH DOWN POINTER BY AMOUNT OF MOVE + PUSHJ PDP,SETREL ;GO SETUP NEW HARDWARE AND SOFTWARE RELOCATION + ; INFORMATION FOR HIGH AND LOW SEGS FOR CURRENT JOB +DIDLE3: +IFN FT2REL,< + EXTERN CURHGH + PUSHJ PDP,CURHGH ;CHECK TO SEE IF THIS CORE ASSIGNMENT IS FOR + ; HIGH SEG WHICH CURRENT USER MAY ALSO BE USING + ; IF YES, RESET HARDWARE AND SOFTWARE RELOC INFO. + ; OF SEG WHICH HAS JUST HAD CORE REASSIGNED + +> + SETZB TAC,HOLEF ;CLEAR HOLD FLAG + PUSHJ PDP,HOLSRC ;IS THERE A NON-ZERO HOLE? + JRST COROK ;NO + ADDI LOC,1(BLK) ;YES, FORM ADR. OF JOB JUST ABOVE HOLD + CAME T,CORLST ;IS HOLE AT TOP OF MEMORY + MOVEM LOC,HOLEF ;NO, FLAG WITH ADDRESS OF JOB ABOVE HOLE +COROK: +IFN FTSWAP,< + EXTERNAL BIGHOLE + MOVEI TAC,-1 ;FIND BIGGEST HOLE + PUSHJ PDP,HOLSRC ;ALWAYS GET ERROR RETURN + ASH T1,-^D10 ;CONVERT TPO 1K BLOCKS + MOVEM T1,BIGHOLE +> + SCHEDULE + JRST CPOPJ1 ;SKIP RETURN(UNLES ERROR) + +;ROUTINE TO FIND HOLD BIG ENOUGH FOR REQUEST +;CALL: MOVE TAC,HIGHEST REL. ADR. ASKING FOR +; PUSHJ PDP,HOLSRC +; RETURN1 ;NO HOLES BIG ENOUGH +; RETURN2 ;T BYTE SET TO LAST BLOCK+1 IN HOLE +; ;BLK SET TO HIGHEST REL. LOC. IN THAT HOLE +; ;LOC SET TO ADDRESS OF FIRST BLOCK IN HOLE +; ;T1=LARGEST HOLE SEEN +;USES TAC1 + +HOLSRC: MOVE T,CORE2P ;BYTE POINTER TO FIRST BIT-1 + SETZB LOC,T1 ;START AT BOTTOM OF MEMORY + ; LARGEST HOLE SO FAR=0 +CORHOL: TDZA BLK,BLK ;START BLK AT 0 AND SKIP + +CORHO0: ADDI BLK,2000 ;INCREMENT HIGHEST REL LOC. +CORHO1: CAMN T,CORLST ;BYTE POINTER TO 1ST NON-EXISTANT BLOCK + POPJ PDP, ;NO MORE CORE TO SEARCH + ILDB TAC1,T ;GET NEXT CORE USE BIT + ADDI LOC,2000 ;INCREMENT ADDRESS OF BLOCK + JUMPE TAC1,CORHO0 ;IS THIS BLOCK IN USE? + JUMPE BLK,CORHO1 ;YES, HAVE ANY FREE BLOCKS BEEN SEEN YET? +IFN FTSWAP,< + CAMLE BLK,T1 ;YES, BIGGEST SO FAR? + MOVEM BLK,T1 ;YES, SAVE IN T1. +> + CAMG BLK,TAC ;YES, IS THIS HOLD EQUAL OR GREATER THEN REQUEST? + JRST CORHOL ;NO, KEEP LOOKING FOR HOLES + SUBI LOC,2000(BLK) ;YES, SET LOC TO FIRST BLOCK IN HOLD + SOJA BLK,CPOPJ1 ;SET BLK TO HIGHEST REL. LOC. + ; AND RETURN + +;ROUTINE TO SET AND CLEAR CORE USE TABLE +;CALL: MOVEI T,1 ;TO SET TABLE + MOVEI T,0 ;TO CLEAR TABLE +; MOVE BLK,HIGHEST REL. LOC. IN USER AREA +; MOVE LOC,ADDRESS OF FIRST BLOCK TO SET CLEAR + + INTERN CORE2P + EXTERN TPOPJ + +CORSTG: PUSH PDP,TAC ;SAVE HIGHEST LOC. BEING REQUESTED + ASH BLK,-12 ;CONVERT TO NO. OF BLOCKS-1 + ADDI BLK,1 ;NO. OF BLOCKS + SKIPE T ;UPDATE NO OF FREE BLOCKS + MOVNS BLK ;DECREASE IF SETTING BITS + ADDM BLK,CORTAL ;INCREASE IF CLEARING,DECREASE IF SSETING BITS + MOVE TAC,LOC ;ADDRESS OF FIRST BLOCK + ASH TAC,-12 ;FORM BYTE POINTER TO BIT-1 + IDIVI TAC,^D36 ;TAC=WORD,TAC1=BIT + ADD TAC,CORE2P ;FORM BYTE POINTER + + MOVNS TAC1 + ADDI TAC1,^D36 + DPB TAC1,[POINT 6,TAC,5] + MOVMS BLK ;GET MAG. OF NO. OF BLOCKS INVOLVED + IDPB T,TAC ;SET OR CLEAR EACH USE BIT + SOJG BLK,.-1 + JRST TPOPJ ;RESTORE TAC. AND POPJ + +CORE2P: POINT 1,CORTAB ;BYTE POINTER TO FIRST BIT-1 + +;ROUTINE TO CLEAR PART OF JOB DAT AREA(PART PROTECTED FROM USER IO) +;CALLED WHEN NEW CORE ASSIGNED AND AT SYSTEM RESTART(140) +; MOVE ITEM,JOB NO. +;CALL: MOVE JDAT,ADR. OF JOB DATA AREA +; PUSHJ PDP,CLRJOB + +INTERNAL CLRJOB +EXTERNAL JOBPRT,JOBPR1,JOBPFI,JOBENB +EXTERNAL JOBPD1,JOBDDT + +CLRJOB: SETZM JOBPRT(JDAT) ;FIRST LOC. PROTECED FROM USER + MOVSI TAC,JOBPRT(JDAT) + HRRI TAC,JOBPR1(JDAT) + MOVE TAC1,JOBDDT(JDAT) ;SAVE DDT STARTING ADDRESS + BLT TAC,JOBPFI(JDAT) + MOVEM TAC1,JOBDDT(JDAT) + SETZM JOBENB(JDAT) ;ALSO CLEAR APR ENABLE WORD + SETZM JOBPD1(JDAT) ;AND UUO PC FLAGS(USED WHEN JOB STARTS) + JRST ESTOP1 ;GO SET JOB STATUS, SO CONT WILL + ; NOT WORK,(DO NOT CLEAR JACCT BIT) + +COREND: END diff --git a/src/crfall.ccl b/src/crfall.ccl new file mode 100644 index 0000000..ffb9188 --- /dev/null +++ b/src/crfall.ccl @@ -0,0 +1,31 @@ +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 diff --git a/src/dcsint.mac b/src/dcsint.mac new file mode 100644 index 0000000..00cd555 --- /dev/null +++ b/src/dcsint.mac @@ -0,0 +1,115 @@ + TITLE DCSINT - INT. SERV. FOR DATA COMMUNICATION SYSTEM 630 - V402 +SUBTTL M. FREDRIKSEN/TH/CHW TS 7 MAY 69 +XP VDCSIT,402 + ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP + +;MODULAR HARDWARE INTERFACE WITH EITHER SCNSER OR TTYSER + +EXTERNAL SCNON,SCNOFF,TYPX + +IFE FTTTYSER, + +IFN FTTTYSER, + ;ACCUMULATOR ASSIGNMENTS + + CHREC=TEM ;AC FOR CHARACTER + DDB=DEVDAT ;ADDRESS OF DEVICE DATA BLOCK + LINE=TAC1 ;SCANNER LINE NUMBER + HPOS=DAT ;HORIZONTAL POSITION OF TTY.(0-71) + +;BYTE POINTERS + + +EXTERNAL PLASTC + + ;DEVICE DEPENDENT PORTION OF INITIALIZATION CODE +;CALL: MOVEI TAC,CHANNEL NUMBER +; PUSHJ PDP,SCNINI + +INTERNAL SCNINI + +DCSINI: +SCNINI: MOVEI TAC,100000 + CONO DCSA,4010 ;RELEASE XMITTER, RECEIVER + CONSZ DCSA, 1000 + CONO DCSA, 4000 + CONSZ DCSA, 10 + DATAI DCSB, TAC1 + SOJG TAC,.-4 + CONO DCSA,FSNCHN ;ASSIGN INTERRUPT CHANNELS + POPJ PDP, + +;SCANNER INTERRUPT SERVICE ROUTINE. + +ENTRY DCSINT + +INTERNAL SCNINT +EXTERNAL SCNSAV,TCONLN,TTYTAB,XMTINT,TYPE,INUS2,RECINT,FSNCHN + +DCSINT: +SCNINT: CONSO DCSA,1010 + JRST SCNINT + JSR SCNSAV + CONSO DCSA,10 ;RECEIVER FLAG? + JRST SCNIN1 ;NO,XMITTER FLAG + CONI DCSB,LINE ;SCANNER INPUT. + DATAI DCSB, CHREC + CAIL LINE,TCONLN ;ARE WE ENABLED FOR THIS LINE NUMBER? + POPJ PDP, ;NO, DISMISS INTERRUPT + JRST RECINT ;RECEIVER INT. HANDLER + ;COMMON PARTS OF CTY AND SCANNER INTERRUPT SERVICE ROUTINES. + +EXTERNAL INJEST,DDBSRC +INTERNAL TCOMM + +TCOMM: + SKIPE DDB,TTYTAB(LINE) ;DATA BLOCK ASSIGNED? + JRST INUSE ;YES + PUSHJ PDP,DDBSRC ;SEARCH FOR FREE TTY DEV. DATA BLOCK + JRST TYPX ;NONE FOUND, TYPE X + MOVEI HPOS,0 ;ASSUME TTY IS AT BEGIN OF FORM + CAILE LINE,TCONLN ;PSEUDO CONSOLE? + JRST INJEST ;YES + CAIE LINE,TCONLN ;IS IT CTY? + CONSO DCSA,700 ;NO, IS IT HALF DUPLEX? + JRST INUS2 ;YES, ACCEPT CHAR AND PROCESS + JRST TYPE ;NO, ECHO CHAR ON FULL DUPLEX + ;BEFORE PROCESSING IT + +SCNIN1: + DATAI DCSA,LINE ;GET LINE NO. FROM FULL DUPLEX. + MOVEI TAC,FSNCHN + CONO DCSA,4000(TAC) ;RELEASE XMITTER SCANNER + JRST XMTINT ;IN SCNSER OR TTYSER + ;COMMON TO RECEIVE AND TRANSMIT. + +INUSE: HRRZS DDB ;LINE DISABLED IF RH TTYTAB=-1 + CAIN DDB,-1 + POPJ PDP, + MOVE IOS,DEVIOS(DDB) ;SETUP IOS + CAIGE LINE,TCONLN ;CTY OR PTY? + CONSO DCSA,700 ;NO, HALF DUPLEX? + JRST INUS2 ;YES + TLNE IOS,FULTWX ;IS THIS SELF ECHOEING FULL DUPLEX? + JRST INUS2 ;YES,(USER TYPED CONROL B) + CONO DCSB,(LINE) ;FULL DUPLEX SCANNER. ECHO CHAR. + DATAO DCSA,CHREC + DPB CHREC,PLASTC + POPJ PDP, ;DISMISS INTERRUPT + ;ROUTINE TO OUTPUT A CHARACTER ON A LINE +;CALLED FROM TYP OR TYPL IN SCNSER + +INTERNAL SCNTYP + +SCNTYP: +DCSTYP: CONO PI,SCNOFF ;TURN SCANNER PI OFF IN CASE AT USER LEVEL + ;SO NO INTERRUPTS BETWEEN CONO, AND DATAO + CONO DCSB,(LINE) ;NO + DATAO DCSA,CHREC + CONO PI,SCNON ;TURN SCANNER PI BACK ON + SKIPE DDB + DPB CHREC,PLASTC ;SAVE CHAR FOR FULL DUPLEX + POPJ PDP, + + + END diff --git a/src/disser.mac b/src/disser.mac new file mode 100644 index 0000000..b2237ad --- /dev/null +++ b/src/disser.mac @@ -0,0 +1,427 @@ +IFNDEF T30,;ASSUME TYPE 30 DISPLAY IF T30 IS UNDEFINED +IFN T30,< +TITLE DIST30 - TYPE 30 DISPLAY SERVICE ROUTINES +ENTRY DIST30 +DIST30: +> +IFE T30,< +TITLE DIS340 - TYPE 340 DISPLAY SERVICE ROUTINES +ENTRY DIS340 +DIS340: +> +SUBTTL R. GRUEN/RCC TS 03 JUN 69 V004 +XP VDISSR,004 + + ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP +; THESE ROUTINES HANDLE INTERRUPTS FROM THE DISPLAY DATA +; CHANNEL. THEY SEARCH THE COMMAND POINTER LIST SUPPLIED +; BY THE USER AND OUTPUT SECTIONS OF DATA AS SPECIFIED THEREIN. +; ALL OUTPUT IS DONE USING THE BLKO COMMAND. + +; THE FORMAT OF THE COMMAND POINTE RLIST IS AS FOLLOWS: + +; RH=0 END OF COMMAND POINTER LIST +; +; RH=ADR LH=0 ADR IS ADDRESS OF THE NEXT SECTION OF THE +; COMMAND POINTER LIST +; RH=L-1 LH=-N OUTPUT TO DISPLAY THE N WORDS OF COMMANDS +; BEGINNING AT LOCATION L. + +; NOTE THAT THE CHECK FOR END OF LIST IS MADE FIRST. + +; ALL ADDRESS ARE CHECKED FOR VALIDITY (I.E.. THEY MUST +; BE WITHIN USER ARE) BEFORE ANY MEM REF IS MAD. + +;IF THE T30 SWITCH = 1 THIS IS THE ROUTINE FOR A DEC +;TYPE 30 DISPLAY WITH A TYPE 348 INTERFACE. +;OTHERWISE IT IS THE ROUTINE FOR A DEC TYPE 340. + +INTERNAL FTCHECK,FTMONP +IFN FTCHECK+FTMONP,< +EXTERNAL DISDDB,DISIOS,PENLOC,DISNT,DISBKO,DISHI,DISONE,DISAV,OFFDIS +EXTERNAL DISAV1,DISREL,DISCON,DISNXT +INTERNAL DISNX1 +> +IFE FTCHECK+FTMONP,< +;DIS DEVICE DATA BLOCK + INTERN DISDDB +DISDDB: SIXBIT /DIS/ + XWD ^D60*HUNGST,0 +DISIOS: 0 + EXP DISDSP + XWD DVDIS+DVOUT+DVIN+DVLNG,2000 + 0 + 0 + XWD PROG,0 + 0 +PENLOC: 0 +DISPNT: 0 +DISBKO: 0 +DISHI: 0 +DISONE: 0 +DISAV: 0 +DISAV1: 0 +DISREL: XWD TAC,0 + XP OFFDIS,0 +IFE T30,< +DISCON: EXP ONDIS> +IFN T30,< +DISCON: 0> + +XP PENDDR,0 ;TO SATISFY A REQUEST IN COMMON. + ; THERE IS NOT REALLY A PEN DDB. +> + +IFN T30,< +DIS=134 ;TYPE 30 DISPLAY DEVICE NUMBER +> +DISTAR=100 ;CLOCK FINISHED BEFORE PICTURE +DISWAT=200 ;PICTURE FINISHED BEFORE CLOCK +DISCKR=400 ;CLOCK REQUEST IN CLOCK QUEU +DISUUI=1000 + +IFE T30,< +DISBSY=77 +PENON=7400 +>IFN T30,< +DISBSY=2000 +PENON=1000 +> + +EXTERN JOBPFI + +EXTERN DISSAV,DISBLK,DISJSR,PENSAV + EXTERN DISCHN,PENCHN + EXTERN DISCHL,PENCHL + EXTERN DISSAV,DISRET + EXTERN DISPON,DISPOF + + EXTERN ADRERR,SETIOD + EXTERN PION,PIOFF,CLOCK + EXTERN CPOPJ1,UERROR,URREL,STOTAC,JOB,JBTSTS,JBTADR,PJOBN +IFE T30,< EXTERN ONDIS,NONDIS> + +INTERN PENINT,DISINT,DISFIN +ENTRY DISDSP + + DEFINE ADRCHK(A) +< + CAILE A,JOBPFI + CAMLE A,DISHI + JRST EXIT2 +> + + JRST DISINI ;INITIALIZATION + POPJ PDP, ;PRINT ERROR AND STOP JOB +DISDSP: JRST DISSTP ;RELEASE + JRST DISSTP ;CLOSE + JSP DAT,UERROR ;OUTPUT + JSP DAT,UERROR ;INPUT + JRST CPOPJ1 ;ENTER + JRST CPOPJ1 ;LOOKUP + JRST DISOUT ;DUMP OUPUT (THAT'S US) + JRST DISIN ;DUMP INPUT (AS IN PEN) + POPJ PDP, ;SETO + POPJ PDP, ;SETI + POPJ PDP, ;GETF + JRST CPOPJ1 ;RENAME + POPJ PDP, ;CLOSE INPUT + POPJ PDP, ;DIRECTORY CLEAR + POPJ PDP, ;MTAPE + +;DISINI IS CALLED FOR RELEASE, CLOSE, AND SUNDRY ILLEGAL CONDITIONS +; WHICH WANT TO TURN THE DISPLAY OFF. IT FIRST CONVINCES +; THE INTERRUPT LEVEL ROUTINES TO GO BACK TO SLEEP AND THEN +; TELLS THE MONITOR THAT THE DEVICE IS INACTIVE, LASTLY, +; IT TUERNS OFF THE INTERRUPT ASSIGNMENTS OF THE DISPLAY +; AND THE PI CHANNEL ASSOCIATED WITH THE DIS BLKO. IT RETURNS +; WITH A POPJ , SOMETIMES TO ITS CALLING ROUTINE AND SOMETIMES +; TO THE CHANNLE'S DISMISS ROUTINE, THE ADDRESS OF WHICH +; WAS CLEVERLY PLACED ON THE PUSHDOWN LIST WHEN AC'S +; WERE SAVED. THUS IT CAN BE CALLED WITH EITHER A +; PUSHJ PDP,DISINI OR A JRST DISINI. + +DISINI: +IFE T30,< + CONO DIS,100 ;PARAMETER MODE> +IFN T30,< + MOVEI TAC,PENCHN ;SET UP CONO WORD WITH PROPER + ASH TAC,3 ; CHANNEL ASSIGNMENTS + ADDI TAC,DISCHN + + TRO TAC,4000 ;SET DISPLAY READY BIT IN CONO WORD + MOVEM TAC,DISCON> + JRST DISIN1 + +DISSTP: MOVE ITEM,JOB ;CLEAR NSHF SO JOB CAN BE SHUFFLED + MOVSI TAC,NSHF+NSWP ;CLEAR NSWP SO JOB CAN BE SWAPPED(IN CASE THIS IS A SWAPPING SYSTEM + ANDCAM TAC,JBTSTS(ITEM) + +DISIN1: SETOM PENLOC + MOVSI TAC,DISWAT+DISUUO ;IGNORE FURTHER TRAPS + HRRI TAC,IOACT ;INDICATED DEVICE INACTIVE + ANDCAM TAC,DISIOS ;INTO DEVICE DATA BLOCK +DISOFF: CONO DIS,OFFDIS ;REMOVE THE DISPLAY'S CHANNE; ASSIGNMENTS + HLLZS PENINT ;DON'T EXPECT ANY ON LITE PEN + CONO PI,DISPOF ;TURN OFF DISPLAY'S BLKO CHANNEL + POPJ PDP, + +DISINT: JRST DISFIN + JRST DISINT ;... + +;PENINT RECIEVES CONTROL ON INTERRUPTS ON THE DISPLAY NON-DATA +; CHANNEL (SPECIAL CHANNEL). IT DECIDES IF THE INTERRUPT +; WAS VALID, AND IF SO, TRANSFERS CONTROL TO AN APPROPRIATE ROUTINE + +IFE T30,< +PENINT: CONSO DIS,0 ;CHECK FOR CONI FLAGS + JRST PENINT ;TO OTHER DEVICES ON SAME CHANNEL + CONSZ DIS,400 ;STOP FLAG + JRST STPFLG + CONSZ DIS,2000 ;PEN FLAG? +PENFLG: DATAI DIS,PENLOC ;STORE CURRENT LITE PEN LOC + CONO DIS,NONDIS ;CLEAR FLAG + JEN @PENCHL ;DISMISS INTERRUPT + +;STPFLG SERVICES STOP FLAGS (DISPLAY PROGRAMMED) BY DOING +; A CLOSE ON THE DISPLAY + +STPFLG: JSR PENSAV ;STOP FLAG, SAVE AC'S AND SETUP RETURN + JRST DISDSP+DCL ;DO A CLOSE AND DISMISS INTERRUPT +> + +IFN T30,< +PENINT: CONSO DIS,0 ;CHECK FOR CONI FLAGS + JRST PENINT ;TO OTHER DEVICES ON SAME CHANNEL + DATAI DIS,PENLOC ;CLEAR PEN INTERRUPT + MOVEM TAC,PENLOC ;SAVE AC TAC + MOVE TAC,DISBKO ;GET ABSOLUTE ADR OF NEXT DATA ELEMENT + SUB TAC,DISREL ;MAKE ADDRESS RELATIVE + HRRZS TAC ;CLEAR OUT GARBAGE IN THE LEFT HALF + EXCH TAC,PENLOC ;SAVE ADR IN PENLOC AND RESTORE TAC + JEN @PENCHL ;DISMIS THE INTERRUPT +> + +;DISNXT IS CALLED WITH A JSR DISNXT, IT SETS UP THE NEXT +; POINTER FOR THE DISPLAY'S BLKO BY INTERPRETING A +; COMMAND LIST SUPPLIED BY THE USER, THIS COMMAND LIST +; IS DESCRIBED AT THE BEGINNING OF THE PROGRAM. IF THE +; DATA TO BE TRANSMITTED TO THE DISPLAY WOULD VIOLATE THE +; MEMORY PROTECTION, THEN THE ROUTINE RETURNS TO THE +; CALLING LOCATION +1. OTHERWISE, IF THERE +; IS NO FURRTHER DATA TO BE OUTPUT (AS INDICATED BY THE +; USER'S COMMAND LIST) THE ROUTINE RETURNS TO THE CALLING +; LOCATION +2. OTHERWISE, THE NEXT POINTER FOR THE BLKO +; IS PLACED IN DISBLKO AND THE ROUTINE RETURNS TO THE CALLING +; LOCATION +3. + +IFE FTCHECK+FTMONP,< +DISNXT: 0 ;JSR AT INTERRUPT OF UUO LEVELS +> +DISNX1: AOS TAC,DISPNT ;GET NEXT POINTER FROM LIST +ILUP: HRRZM TAC,DISPNT ;UPDATE POINTER POINTER + ADRCHK TAC + MOVE TAC,@DISREL ;GET NEXT WORD IN POINTER LIST + MOVEM TAC,DISBKO ;PLACE IN BLOK POINTER + HLROM TAC,DISAV1 ;GET NEGATIVE WORD COUNT(MAKE LH NEG. TOO) +IFN T30,< + JUMPE TAC,EXIT1 ;END OF COMMAND LIST? + TRNN TAC,-1 ;INTENSITY? + JRST INTCHK ;YES> +IFE T30,< + TRNN TAC,-1 ;END OF COMMAND LIST? + JRST EXIT1 ;YES> + TLZN TAC,-1 ;NO. POINTER TO NEW LIST? + JRST ILUP ;YES. + CAIL TAC,JOBPFI ;NO. ADDRESS IN BOUNDS? + CAML TAC,DISHI + JRST EXIT2 ;NO + SUB TAC,DISAV1 ;YES. ADR. OF LAST WORD IN BLOCK. + ADRCHK TAC + HRRZ TAC,DISREL ;FORM ABSOLUTE ADDR + ADDM TAC,DISBKO ;IN THE BLKO POINTER WORD + AOS DISNXT ;RETURN 2,4 +EXIT1: AOS DISNXT +EXIT2: MOVE TAC,DISAV + CONO DIS,@DISCON ;SET UP DISPLAY STATUS WORD + JRST 2,@DISNXT ;... + +IFN T30,< +INTCHK: MOVSS TAC ;PLACE INTENSITY IN CONO WORD + DPB TAC,INTPNT + JRST DISNX1 ;GET NEXT POINTER +INTPNT: POINT 3,DISCON,29> + +;DISFIN RECEIVES CONTROL WHEN THE DISPLAY'S BLKO POINTER REACHES +; ZERO. IT SAVES THE TWO AC'S WHICH DISNXT USES AND +; DOES A JRST TO DISNXT. ON A NORMAL RETURN IT RESTORES THE +; AC'S AND DISMISSES THE INTERPUT. ON A "NO MORE DATA" +; RETURN IT TRANSFERS CONTROL TO OVT2 FOR FURTHER +; DECISION AS TO WHETHER OR NOT TO CONTINUE DISPLAYING. + +DISFIN: MOVEM TAC,DISAV ;SAVE AC'S + JSR DISNXT ;SETUP NEXT BLKO POINTER + JRST ADRER + JRST DVT2 ;RETURN HERE IF NO NEXT POINTER + JEN @DISCHL ;LET THE SCOPE DO THE REST + +;DVT2 RECIVES CONTROL AT INTERRUPT LEVEL WHEN THE COMMAND LIST +; (SUPPLIED BY THE USER) RUNS OUT. IT SAVES THE AC'S FOR +; THIS CHANNEL AND IN THE PROCESS ENABLES REUTRNS BY POPJ +; AND SIMILAR GOOD THINGS SINCE IT ALSO STORES THE PC FROM +; THE JSR IN THE GENERAL PC LOCATION FOR THIS CHANNEL +; IF THE DISPLAY IS OFF. IT DOES NOT RESTART IT. + +; IT CHECKS TO SEE IF THE CLOCK HAS RUN OUT BEFORE THE PICTURE; +; IF SO, IT CALLS DISBEG TO RESTART THE DISPLAY WITH A NEW +; COMMAND LIST. IT TURNS OFF THE IO ACTIVE BIT WHICH WAS +; TURNED ON BY THE OUTPUT ROUTINE; THIS INSURES THAT ANY +; OUTPUT COMMAND WILL DISPLAY AT LEAST ONE PICTURE. IF +; THE JOB WAS IN AN IO-WAIT, IT IS RELEASED. + +DVT2: JSR DISSAV ;ASK EXEC TO SAVE AC'S + MOVEI DEVDAT,DISDDB ;SETUP ACS + MOVSI TAC,SHF + MOVSI DAT,NSHF + LDB ITEM,PJOBN + PUSHJ PDP,DISOFF + MOVSI IOS,DISWAT ;INDICATE PICTURES FINISHED + IORB IOS,DISIOS ;... + TLON IOS,DISUUI ;RESUME DISPLAY, NEW UUO. + JRST DVT6 ;YES, STAY IN IO WAIT + TDNE TAC,JBTSTS(ITEM) ;DOES SYSTEM WANT TO SHUFFLE THIS JOB?> + JRST DVT4 ;YES + TLNE IOS,DISTAR ;HAS CLOCK TRIGGERED? + PUSHJ PDP,DISBEG ;YES, RESTART DISPLAY + JRST DVT3 +DVT4: TLNE IOS,DISTAR ;DID CLOCK FINISH BEFORE PICTURE? + PUSHJ PDP,CLKREQ ;YES, PUT IN CLOCK REQUEST. +DVT5: ANDCAM DAT,JBTSTS(ITEM) ;TURN OFF NSHF SO JOB CAN BE SHUFFLED +DVT3: MOVE IOS,DISIOS ;BIT FIDDLING TIME + TRZ IOS,IOACT ;SIGNAL DISPLAY CAN BE CLOSED + TLZE IOS,IOW ;IS DISPLAY CAUSING AN IO-WAIT? + PUSHJ PDP,SETIOD ;UNWAIT THE JOB + MOVEM IOS,DISIOS ;RESTORE IO CONTROL WORD + JRST DISRET ;RESTORE AC'S AND DISMISS +DVT6: MOVEM IOS,DISIOS + PUSHJ PDP,DISBEG ;START NEW COMMAND LIST + JRST DISRET + +;DISREG IS CALLED WITH A PUSHJ PDP,DISBEG, IT DISABLES THE +; DISPLAY ITSELF (BY USING DISOFF) AND ALSO DISABLES THE +; CLOK RESTART AND RESETS THE POINTER TO THE USER'S +; COMMAND LIST TO THAT SPECIFIED ON THE LAST OUTPUT +; MINUS ONE. IT ASKES DISNXT TO SET UP THE NEXT BLKO POINTER +; IF DISNXT IS UNSUCCESSFUL (I.E., IF THE USER COMMAND LIST +; IS NULL), THEN THE ROUTINE DOES A CLOSE. OTHERWISE, A +; REQUEST IS ENTERED FOR A CLOCK INTERRUPT AT THE END OF +; AT MOST TWO JIFFIES. THIS CLOCK QUEUE REQUEST IS ENTERED +; ONLY IF THERE IS NONE ALREADY IN THE QUEUE. THE PI +; CHANNELS FOR THE DISPLAY ARE TURNED ON AGAIN AND THE +; DISPLAY IS INITIALIZED BY A CONO. IT SHOULD THEN REQUEST +; DATA AS SOON AS THE PI CHANNEL FOR THE BLKO IS TURNED ON. +; IT TURNS THIS CHANNEL ON AND RETURNS TO ITS CALLER. + +DISBEG: MOVSI IOS,DISTAR+DISWAT ;INDICATE FRESH DISPLAY + ANDCAM IOS,DISIOS ;... + HRRZ TAC1,DISONE ;GET POINTER LIST ADDR (-1) + HRRZM TAC1,DISPNT ;RESET POINTER POINTER WITH IT + JSR DISNXT ;ASK FOR FIRST WORD FOR BLKO + JRST ADRER1 + JRST DISSTP ;NULL LIST, CLOSE + PUSHJ PDP,CLKREQ ;ENTER CLOCK QUEUE REQUEST + CONO DIS,@DISCON ;INITIALIZE THE DISPLAY + MOVEI TAC,PENON ;ALLOW SPECIAL PI INTERRUPTS + HRRM TAC,PENINT ;... + CONO PI,DISPON ;ALLOW BLKO INTERRUPTS + POPJ PDP, ;RETURN + +CLKREQ: MOVSI IOS,DISCKR ;IF NO CLOCK INTERRUPT REQUESTED + MOVE TAC,CLOKRT ;RESET TIMER + CONO PI,PIOFF ;INHIBIT INTERRUPTS + TDON IOS,DISIOS ;ENTER ONLY A SINGLE CLOCK REQUEST + IDPB TAC,CLOCK ;PLACE REUQEST IN QUEUE + IORM IOS,DISIOS ;PROTECT AGAINST A DUPLICATE REQUEST + CONO PI,PION ;UNINHIBIT INTERRUPTS + POPJ PDP, ;RETURN + +CLOKRT: XWD CLOK,2 ;CONTROL FOR CLOCK QUEUE: 2 JIFFIES + ;TWO JIFFIES + +;CLOK IS CALLED AT THE CLOCK LEVEL IN RESPONSE TO A REQUEST +; IN THE CLOCK QUEUE. A BIT IS SET TO INDICATE THAT THE +; CLOCL PERIOD HAS ELAPSED. IF THE DISPLAY IS STILL IN +; PROGRESS, CLOK RETURNS AT THIS POINT. OTHERWISE, CLOK +; GOES TO DISBEG TO START UP THE DISPLAY. DISBEG RETURNS +; WITH A POPJ PDP, + +CLOK: MOVSI IOS,DISCKR ;INDICATE CLOCK REQUEST SERVICED + ANDCAB IOS,DISIOS ;... + TLDE IOS,DISUUI + MOVSI IOS,DISTAR ;ASK DISPLAY TO RESTART + IORB IOS,DISIOS ;... + TLNN IOS,DISWAT ;HAS DISPLAY FINISHED? + POPJ PDP, ;NO. WIAT FOR IT TO DO SO + MOVEI DEVDAT,DISDDB + MOVSI TAC,NSHF + LDB ITEM,PJOBN + TDNE TAC,JBTSTS(ITEM) ;IS SHUFFLE LOCKED OUT? + JRST DISBEG ;YES, RESTART DISPLAY AND RETURN + + IORM TAC,JBTSTS(ITEM) ;NO. LOCK IT OUT. + MOVE TAC,JBTADR(ITEM) ;RESET DISHI AND DISREL AFTER SHUFFLING + HLRZM TAC,DISHI + HRRM TAC,DISREL + JRST DISBEG ;RESART DISPLAY AND RETURN + +;ADRER SERVICES PROTECTION VIOLATIONS DISCOVERED BY DISNXT. +; IT DOES A CLOSE AND THEN CALLS THE MONITOR'S ERROR PRINTING +; ROUTINES TO INFORM THE USER. + +ADRER: JSR DISSAV ;SAVE AC'S AGAIN +ADRER1: PUSHJ PDP,DISDSP+DCL ;DO A CLOSE + MOVEI DEVDAT,DISDDB ;TELL ERROR ROUTINE WHO'S UNHAPPY + JRST ADRERR ;GO GRIPE +;DISIN HANDLES LITE PEN UUO (INPUT) IN A RUDIMENTARY FASHION +; BY RETURNING (TO THE ADDR SPECIFIED BY THE ADDR FIELD +; OF THE INPUT UUO) THE LAST PEN COORIDNATES SEEN, + +DISIN: MOVNI TAC,1 + EXCH TAC,PENLOC ;GET LATEST COORDINATES, + JRST STOTAC ;STORE AND RETURN + +;DISOUT DOES THE WORK OF THE OUTPUT UUO. IT SETS A BIT TO +; INDICATE THAT THE DEVICE IS ACTIVE AND INHIBITS +; INTERUPTS WHICH MAY STILL BE IN PROGRESS. SINCE THE +; MONITOR CALLS WSYNCE BEFORE COMING HERE. THE USER IS +; GUARANTEED AT LEAST ONE PICTURE/OUTPUT. THE USERS MEMORY +; BOUNDS ARE STORED FOR QUICK USE AT INTERRUPT LEVEL W/0 +; SAVING AC'S. THE LOCATION OF THE COMMAND LIST (-1) IS +; STORED FOR USE IN SETTING UP BLKO POINTERS. THE PI +; LOCATIONS (40 + 2J) ARE INITIALIZED WITH A BLKO IN +; THE EVEN LOCATIONS AND A JSR TO DISFIN IN THE ODD LOCATION, +; THE NON-DATA CHANNEL CONSO IS SETUP TO BELIEVE IN THE +; A POPJ PDP, IT RETURNS ON BEHALF OF THE OUTPUT UUO. + +DISOUT: TLO IOS,IO+DISWAT ;INDICATE OUTPUT; REQUEST START UP + TRO IOS,IOACT ;INDICATE DEVICE ACTIVE + SUBI UUO,1 ;ALLOW FOR INCREMENT AT INTERRUPT + MOVE TAC,BLKLIT ;FEEDS WORDS TO THE DISPLAY + MOVEM TAC,DISBLK ;FROM EVEN NUMBERED INTERRUPT LOC + MOVE TAC,JSRLIT ;SERVICE THE END OF BLKO + MOVEM TAC,DISJSR ;FROM ODD INTERRUPT LOC + MOVEI TAC,PENON ;SETUP CONSO BITS ON SPECIAL CHANNEL + HRRM TAC,PENINT ;... + IORB IOS,DISIOS ;SET IOACT ON; INDICATE OUTPUT + HRRZM UUO,DISONE ;SET NEW COMMAND LIST ORIGIN + MOVSI IOS,DISUUI + IORM IOS,DISIOS ;ALLOW DISPLAY + CONSZ DIS,@DISCON ;DISPLAY ALREADY IN USE + ANDCAM IOS,DISIOS + JRST CLKREQ ;ENTER CLOCK QUEUE REQUEST AND POPJ + +BLKLIT: BLKO DIS,DISBKO +JSRLIT: JSR DISCHL + END + + diff --git a/src/dist30.mac b/src/dist30.mac new file mode 100644 index 0000000..ef7237d --- /dev/null +++ b/src/dist30.mac @@ -0,0 +1,4 @@ +;PARAMETER FILE FOR DISSER.MAC +;USED ONLY TO ASSEMBLE DISSER TO MAKE TYPE 30 SERVICE INSTEAD OF TYPE 340 + +T30=1 ;FLAG THAT TYPE 30 IS WANTED diff --git a/src/dlsint.mac b/src/dlsint.mac new file mode 100644 index 0000000..9699578 --- /dev/null +++ b/src/dlsint.mac @@ -0,0 +1,120 @@ +TITLE DLSINT - INT. SERV. FOR DLS (DATA LINE SCANNER DC10) +SUBTTL M.FREDRIKSEN/RCC TS 01 JUN 69 V005 +XP VDLSIT,005 + ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP + +;MODULAR HARDWARE INTERFACE WITH EITHER SCNSER OR TTYSER + +EXTERN TYPX + +IFE FTTTYSER, + +IFN FTTTYSER, + +;ACCUMULATOR ASSIGNMENTS + + CHREC=TEM ;AC FOR CHARACTER + DDB=DEVDAT ;ADDRESS OF DEVICE DATA BLOCK + LINE=TAC1 ;SCANNER LINE NUMBER + HPOS=DAT ;HORIZONTAL POSITION OF TTY.(0-71) + +;BYTE POINTERS + +EXTERNAL PLASTC + + +DLS=240 ;DC10 DEVICE NUMBER +;BITS IN CHREC TO COMMUNCATE WITH DLS + +USDRLN=100 ;USE DIRECTED LINE NUMBER +TDSABL=400 ;TRANSMIT DISABLE +RCVBIT=400 ;RECEIVE BIT AFER DATAI DLS,CHREC + +;DEVICE DEPENDENT PORTION OF INITIALIZATION CODE +;CALL: MOVEI TAC,CHANNEL NUMER +; PUSHJ PDP,SCNINI + +INTERNAL SCNINI +DLSINI: +SCNINI: CONO DLS,40 ;INIT DLS COMPLETELY (I/O/RESET) + CONO DLS,(TAC) ;ASSIGN PI CHANNEL NUMBER + POPJ PDP, + +;SCANNER INTERRUPT SERVICE ROUTINE + +ENTRY DLSINT + +INTERNAL SCNINT +EXTERNAL SCNSAV,TCONLN,TTYTAB,XMTINT,TYPE,INUS2,RECINT + +DLSINT: +SCNINT: CONSO DLS,30 ;ANY INTERRUPTS ON DLS + JRST SCNINT ;NO + JSR SCNSAV + DATAI DLS,CHREC ;GET CHARACTER & LINE INFO + HLRZ LINE,CHREC ;PUT LINE NUMBER IN AC LINE + CAIL LINE,TCONLN ;ARE WE ENABLED FOR THIS LINE NUMBER? + JRST SCNIN2 ;NO,TURN OFF TRANSMIT(IF ON) AND DISMISS + TRNE CHREC,RCVBIT ;WAS IT A RECEIVER INTERRUPT? + JRST RECINT ;YES, RECEIVER INT. HANDLER + DATAO DLS,[EXP TDSABL] ;CLEAR HARDWARE FLAG + JRST XMTINT ;GO PROCESS CHAR IN SCNSRF OR SCNSRH + +;COMMON PARTS OF CTY AND SCANNER INTERRUPT SERVICE ROUTINES. + +EXTERNAL INJEST,DDBSRC +INTERNAL TCOMM + +TCOMM: + SKIPE DDB,TTYTAB(LINE) ;DATA BLOCK ASSIGNED? + JRST INUSE ;YES + PUSHJ PDP,DDBSRC ;SEARCH FOR FREE TTY DEV. DATA BLOCK + JRST TYPX ;NONE FOUND, TYPE X + MOVEI HPOS,0 ;ASSUME TTY IS AT BEGIN OF FORM + CAILE LINE,TCONLN ;PSEUDO CONSOLE? + JRST INJEST ;YES + CAIN LINE,TCONLN ;IS IT THE CTY ? + JRST INUS2 ;YES, ACCPT CHAR AND PROCESS + JRST TYPE ;NO, ECHO CHAR ON FULL DUPLEX + ;BEFORE PROCESSING IT + + ;HERE IF LINE NUMBER TOO BIG +SCNIN2: DATAO DLS,[EXP TDSABL] ;SET TRANSMIT DISABLE BIT AND OUTPUT IT + ;(JUST INCASE, ELSE IT WILL INTERRUPT IMMEDIATLY AGAIN) + POPJ PDP, ;DISMISS INTERRUPT + + +;COMMON TO RECEIVE AND TRANSMIT. + +INUSE: HRRZS DDB ;LINE DISABLED IF RH TTYTAB=-1 + CAIN DDB,-1 + POPJ PDP, + MOVE IOS,DEVIOS(DDB) ;SETUP IOS + CAIL LINE,TCONLN ;CTY OR PTY ? + JRST INUS2 ;YES + TLNE IOS,FULTWX ;IS THIS SELF ECHOEING FULL DUPLEX? + JRST INUS2 ;YES,(USER TYPED CONROL B) + HRL CHREC,LINE ;INSERT LINE NUMBER IN DATAO + TLO CHREC,USDRLN + TRZ CHREC,TDSABL + DATAO DLS,CHREC + DPB CHREC,PLASTC + POPJ PDP, ;DISMISS INTERRUPT + +;ROUTINE TO OUTPUT A CHARACTER ON A LINE +;CALLED FROM TYP OR TYPL IN SCNSER + +INTERNAL SCNTYP + +SCNTYP: +DLSTYP: HRL CHREC,LINE ;SET UP LINE NUMBER IN CHREC + TLO CHREC,USDRLN ;USE THAT AS DIRECTED LINE# + TRZ CHREC,TDSABL ;INSURE TRANSMISSION NOT DISABLED + DATAO DLS,CHREC ;OUT IT GOES + SKIPE DDB + DPB CHREC,PLASTC ;SAVE CHAR FOR FULL DUPLEX + POPJ PDP, + + LIT + +DLSEND: END diff --git a/src/dpdint.mac b/src/dpdint.mac new file mode 100644 index 0000000..d20703c --- /dev/null +++ b/src/dpdint.mac @@ -0,0 +1,238 @@ +TITLE DPDINT - DATA PRODUCTS DISK INTERRUPT SERVICE +SUBTTL A. BLACKIGNTON/CMF TS 12 JAN 69 V401 + XP VDPDIT,401 + +DCB=204 ;DATA-CONTROL-B +DF=270 ;DISK-FILE +DSK=DF + +;THIS NEXT CONSTANT MUST BE SET TO MATCH CAPACITY OF THE PARTICULAR DISK FILE--- +INTERNAL LBHIGH ;HIGHEST LEGAL LOGICAL BLOCK NUMBER +LBHIGH: 130000-1 + +;START A WRITE ON DISK FILE + +;AT ENTRY, C(TAC 18-35)= LOGICAL BLOCK NUMBER +; C(TAC1) = IOWD + +INTERNAL DFWRT,DFRED +EXTERNAL DSKX8,DCBBIT,DSKBIT,DSKCHN,DCBCHN.ERRPNT,DSKX9 +ENTRY LDDINT +LDDINT: + +DFWRT: +DFWRT1: MOVEM TAC1,IOWRD + MOVE TAC1,[BLKO DCB,IOWRD] + JSR DFRW ;SET UP DISK ADDRESS + + TLO TAC,WLE ;ENABLE WRITE LOCK ERROR + HRRI TAC,DSKCHN ;TURN ON DISK + IORI TAC,WRT+CLE+EIS+ENE + STARTDV DSK + HRRZI TAC,DCBCHN + CONO DCB,OUT+DAR+BR+P18+DFNUM(TAC) ;TURN ON DATA-CONTROL-B + POPJ PDP, +;SIMILAR ROUTINE FOR READ + +DFRED: +DFRED1: MOVEM TAC1,IOWRD + MOVE TAC1,[BLKI DCB,IOWRD] + JSR DFRW + + HRRI TAC,DSKCHN + IORI TAC,RED+CLE+EIS+ENE ;TURN ON DISK + STARTDV DSK + POPJ PDP, + +;SERVICE INTERRUPT ON DATA-CONTROL-B + +INTERNAL FTCHECK,FTMONP +IFE FTCHECK+FTMONP,< +INTERNAL DCBINT + +DCBINT: Z +> +DCBIN1: MOVEM TAC,ACSAV + HRRZI TAC,DCBBIT + CONO PI,1000(TAC) ;TURN OFF DCB CHANNEL + CONI DCB,DCBERR ;SAVE STATUS OF DATA CONTROL + HRRZI TAC,DSKCHN + CONSO DCB,OUT ;SKIP IF WRITING + CONO DF,END+EIS(TAC) + MOVE TAC,ACSAV + JEN @DCBINT +JSRDBC: JSR DCBINT ;JSR STORED IN INTERRUPT CELL + +;DISK & DCB FLAGS + +ADE=1B29 ;ADDRESS ERROR +ADT=1B20 ;ADDRESS TERMINATED +ALM=1B30 ;ALARM +CME=1B27 ;COMMAND ERROR +DCE=1B26 ;DATA CLOCK ERROR +MISS=1B23 ;DATA MISSED FLAG +DRLATE=1B31 ;DATA REQUEST LATE +RCE=1B32 ;READ COMPARE ERROR +PAR=1B33 ;PARITY ERROR +IDS=1B18 ;IDLE STATE (1 IF IDLE) +NOPR=1B35 ;OPERABLE (1 IF NOT) +WLE=1B28 ;WRITE-LOCK ERROR +OUT=1B27 ;OUTPUT INDICATION +CLE=1B28 ;CLEAR ERROR FLAGS +FER=1B34 ;FILE ERROR +DVERAS=DRLATE+RCE+PAR+ADE+CME+DCE+ALM+NOPR+FER +BR=1B26 ;BUFFER REQUEST FLAG FOR DCB +DAR=1B25 ;DATA ACCUMULATOR REQUEST +DFNUM=5B32 ;DISK NUMBER DOR DATA CONTROL +END=1B23 ;END-SECTOR +EIS=1B32 ;ENABLE IDLE STATE +XMOVE=1B24 ;BUFFER ACCUMULATOR MOVE FLAG +P18=3B29 ;PACK 2 18-BIT BYTES +RED=1B26 ;READ INDICATOR +WRT=2B26 ;WRITE INDICATOR +ENE=1B29 ;ENABLE ERROR INTERRUPT + +;INTERRUPT ROUTINE TO HANDLE SECTOR-END FLAG. +;CHECK FOR ERRORS. IF THE JOB IS COMPLETED (SIOWD = 0), GO TO +;DEVICE INDEPENDENT PACKAGE, ELSE CONTINUE THE JOB. + +INTERN DSKINT +EXTERNAL DFINT,DSKSAV + +DSKINT: CONSO DF,@DSKCON + JRST DSKINT ;ALTERED BY INITIALIZATION + JSR DSKSAV + HRRZI TAC,DCBBIT + CONO PI,1000(TAC) ;MAKE SURE DCB IS OFF + HLLZS DSKCON + MOVEI IOS,0 + SKIPE DSKIOS ;ERROR WAIT? + JRST DSKIN3 ;YES + MOVEI TAC1,DVERAS + CONSZ DCB,OUT + TRO TAC1,WLE + + CONSZ DF,(TAC1) ;ERROR? + SETZM SIOWD ;YES, DO NOT DO MORE NOW + MOVE TAC,DCBERR ;PICK UP DATA-CONTROL STATUS + TRNN TAC,MISS ;DATA-MISSED FLAG ON? + CONSZ DF,DVERAS-PAR ;NO, DISK ERRORS? + ORI IOS,IODERR ;YES, SET DEVICE ERROR FLAG. + CONSZ DF,PAR ;PARITY ERROR? + IORI IOS,IODTER ;YES + TRZ TAC1,DVERAS + CONSZ DF,(TAC1) ;WRITE-LOCK? + ORI IOS,IOIMPM ;YES + CONO DF,CLE ;CLEAR DISC ERRORS + JUMPN IOS,DSKIN2 + SKIPN SIOWD ;JOB DONE? + JRST DFINT ;YES, RETURN TO DEV, INDEP, ROUT. + ;WITH ERROR FLAGS + + MOVE TAC,SRECN ; AND BLOCK NUMBER + ADDI TAC,1 + IMULI TAC,^D44 + MOVE TAC1,SIOWD + CONSO DCB,OUT + JRST DFRED1 + JRST DFWRT1 + +DSKIN2: + HRRZI TAC,DSKCHN + CONO DF,END+EIS(TAC) ;SEND END AND ENABLE FOR IDLE + ;FOLLOWING ERROR + MOVEM IOS,DSKIOS ;SAVE ERROR FLAGS + MOVEI IOS,IDS+DVERAS + HRRM IOS,DSKCON + POPJ PDP,0 ;DISMISS + +DSKIN3: MOVE IOS,DSKIOS ;PICK + CONO DF,0 + JRST DFINT + +;SET UP FOR READ AND WRITE + +IFE FTCHECK+FTMONP,< +DFRW: Z +> +DFRW1: MOVEM TAC1,DSKX8 ;SET UP INTERRUPT LOC + +;CONVERT FROM LOGICAL TO PHYSICAL SECTOR NUMBER. +;ENTER WITH LOGICAL NUMBER IN TAC + +CNVBLK: MOVEM TAC,SLBLK +CNVBK2: HRRZS TAC +IFN FTRCHK,< + CAMLE TAC,LBHIGH ;LOGICAL BLOCK NUMBER IN RANGE + ;(COMPARE WITH HIGHEST LEGAL)? + HALT CNVERR ;NO, HALT - IF CONTINUE PUSHED, + ;THEN FLAG AS DEVICE ERROR +> + IDIVI TAC,^D44 + + MOVEM TAC,SRECN ;SAVE THE BLOCK NUMBER + SETZM SIOWD ;CLEAR SAVED IOWD + LSH TAC,6 + ADD TAC,TAC1 + CONO DCB,0 ;INSURANCE + DATAO DF,TAC ;SEND OUT ADDRESS + HLRZ TAC,IOWRD ;WILL THIS I/O CAUSE A CHANGE + CAIL TAC,-200 ; IN POSITION ARM DURING READ OR + JRST CNVBK1 ; WRITE? + SUBI TAC1,^D44 ;MAYBE. + LSH TAC1,7 + CAIL TAC,(TAC1) + JRST CNVBK1 ;NO, GO AHEAD AS IS. + + MOVE TAC,IOWRD ;PUT SMALLER SIZE IN IOWD. + HRLM TAC1,IOWRD + MOVMS TAC1 ;STASH AWAY NEXT. + HRLS TAC1 + ADD TAC,TAC1 + MOVEM TAC,SIOWD + +CNVBK1: CONSO DF,ADT ;ADDRESS GO OK? + JRST .-1 ;WAIT FOR IT + HRRZI TAC,DCBBIT + CONO PI,2000(TAC) ;TURN ON DCB CHANNEL + MOVSI TAC,IDS+DVERAS + SETZM DSKIOS + JRST @DFRW +IFN FTRCHK,< +CNVERR: MOVEI IOS,IODERR ;HERE ONLY IF OPERATOR PUSHES CONTINUE + JRST DFINT ;FLAG AS DEVICE ERROR +> +; WAIT FOR DISK TO BE TURNED ON + +INTERNAL DISKUP + +DISKUP: SETZM DSKX8 ;ZERO THE BLKI/BLKO WORD + MOVE TAC,JSRDCB + MOVEM TAC,DSKX9 ;STORE JSR EXECUTED ON BLKI/BLKO COMPLETION + CONSZ DF,NOPR + JRST .-1 + HRRZI TAC,DSKBIT + IORI TAC,DCBBIT + CONO PI,2200(TAC) + POPJ PDP, + +IFN FTCHECK+FTMONP,< +EXTENRAL SRECN,SIOWD,DSKIOS,SLBLK,DFRW,ACSAV,DCBERR,DCBINT,IOWRD,DSKCON +INTERNAL DCBIN1,DFRW1 +> +IFE FTCHECK+FTMONP,< +INTERNAL DSKCON +SRECN: Z ;SAVE OF BLOCK NUMBER +SIOWD: Z ;NEXT IOWD TO USE +DSKIOS: Z ; ERROR FLAGS +SLBLK: Z ;LOGICAL BLOCK NUMBER LAST SELECTED + ;CLEARED ON EACH CALL TO DFWRT OR DFRED + +DSKCON: 0 +IOWRD: 0 +DCBERR: 0 +ACSAV: 0 +<> +DPDEND: END + + diff --git a/src/dskint.mac b/src/dskint.mac new file mode 100644 index 0000000..6a55479 --- /dev/null +++ b/src/dskint.mac @@ -0,0 +1,292 @@ +TITLE DSKINT - PDP-10 RC-10 DISK INTERRUPT SERVICE V403S +SUBTTL A. FRANTZ/TH TS 5 FEB 69 + XP VDSKIT,403 + ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP + +ENTRY RCXINT ;THIS SYMBOL IS SOLELY TO PERMIT SYSTEM +RCXINT: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE. + +INTERNAL DSKINT,DFWRT,DFRED,DSKFDG,DISKUP,FTCHECK,FTMONP,FTRCHK + +EXTERNAL DSKCHN,DSKBIT,DSKSAV,DFINT,RCXIOC,RCXCCW + +DSK=170 ;DEVICE NUMBER ASSIGNED TO THE MODEL RC-10 DISK SYNCHRONIZER. + + +;CONI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER -- + +;BITS 00 - 17 MAINTENANCE PANEL SWITCH SETTINGS INDICATORS -- + ;BITS 00 - 04 UNUSED +MSS=1B5 ;SET INDICATES "MAINTENANCE SEGMENT SELECTED" (SEGMENT 81), +PLGSW=1B6 ;1 = WRITE-PROTECT EVERYTHING BELOW (LESS THAN) THE BOUNDARY, + ; 0 = WRITE-PROTECT EVERYTHING ABOVE (GREATER THAN) BOUNDARY, + ;THE CURRENT IMPLEMENTATION OF THE RC-10 DISK SYNCHRONIZER + ; DOES NOT PERMIT SENSING THE INCLUSION OF THE BOUNDARY. + ;BITS 07 - 17 THE WRITE-PROTECTION THE INCLUSION OF THE BOUNDARY. +DTOP=1B18 ;SET INDICATES DATA TRANSFER IN PROGRESS. +;BITS 19 -29 ERROR CONDITIONS INDICATORS (ERROR WHEN SET) -- + SRCHE=1B19 ;SEARCH ERROR (DISK TIMING TRACK PROBLEMS!!) + DDE=1B20 ;DISK DESIGNATION ERROR + TSE=1B21 ;TRACK SELECT ERROR (OR EXCEEDS SYSTEM CAPACITY) + NRDY=1B22 ;DISK NOT READY (OR NON-EXISTENT DISK REFERENCED) + PSF=1B23 ;POWER SUPPLY FAILURE + DPAR=1B24 ;DISK PARITY ERROR + CHDPAR=1B25 ;CHANNEL DATA PARITY ERROR + CHCPAR=1B26 ;CHANNEL CONTROL PARITY ERROR + NXMEM=1B27 ;NON-EXISTENT MEMORY REFERENCED + WRPE=1B28 ;ATTEMPTED TO WRITE IN PROTECTED DISK AREA (SEE BITS 06 - 17) + OVR=1B29 ;OVERRUN, I.E., MEMORY DIDN'T RESPOND QUICKLY ENOUGH +;BIT 30 CHANNEL CONTROL WORD WRITTEN IN MEMORY (THIS BIT IS + ;TURNED ON ON ALMOST ALL TERMINATIONS.) +BUSYBT=1B31 ;BUSY (SYNCHRONIZER PERFORMING A COMMAND SEQUENCE) +DONEFLG=1B32 ;DONE -- THIS ACTUALLY CAUSES THE INTERRUPT. +;BITS 33 - 35 PI CHANNEL SELECTION BITS. + +;COMBINATIONS OF ERRO BITS GROUPED BY TYPE -- +DATERR=DPAR!CHDPAR ;DATA ERRORS. +DEVERR=SRCHE!PSF!CHCPAR!OVR ;DEVICE ERRORS. +SETERR=DDE!TSE!NRDY!NXMEM ;SOFTWARE-PREVENTABLE ERRORS. +ALLERR=DATERR!DEVERR!SETERR!WRPE ;ALL POSSIBLE ERRORS. + +;CONO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER + +;BITS 00 - 17 UNUSED +;BITS 18 - 19 SELECT DISK FOR SECTOR COUNTER READ-OUT A(SEE DATAI BITS 28-35) +;BITS 20 - 29 RESET THE CORRESPONDING CONI ERROR BIT + ;(BUT PSE MAY REFUSE TO BE RESET) +WRCCWD=1B30 ;WRITE THE CHANNEL CONTROL WORD INTO MEMORY (NOW!) +STPBIT=1B31 ;STOP -- IMMEDIATELY CEASE PRESENT I/O AND CLEAR THE CHANNEL. +RESETB=1B32 ;RESET THE DONE FLAG (CORRESPONDING CONI BIT) TO CLEAR INTERRUPT +;BITS 33 - 35 PI CHANNEL SELECTION BITS + +;DATAI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER -- + +;BITS 00 - 17 UNUSED +;BITS 18 - 23 PARITY REGISTER +;BITS 24 - 25 UNUSED +;BITS 26 - 27 DISK SELECTED BY BITS 18-19 OF LAST CONO +;BITS 28 - 35 CURRENT SECTOR POSITION OF SELECTED DISK (FOR LATENCY OPTIMIZATION!) + +;DATAO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER -- + +;BITS 00 - 17 DISK ADDRESS ELECTION + ;BITS 00 - 01 DISK SELECT + ;BITS 02 - 10 TRACK SELECT (BCD, BUT FIRST CHAR IS JUST 1 BIT) + ;BITS 11 - 17 SEGMENT SELECT (BCD, BUT FIRST CHAR HAS ONLY 3 BITS) +;BITS 18 - 23 INITIAL PARITY REGISTER SETTING 9ZERO EXCEPT FOR DIAGNOSTIC PROGRAMS) +DDSKPE=1B24 ;DISABLE DISK PARITY ERROR STOP +DCHNPE=1B25 ;DISABLE CHANNEL DATA PARITY ERROR STOP +WRBIT=1B26 ;SET MEANS WRITE ON DISK, RESET MEANS READ FROM DISK +;BITS 27 - 34 ;CORRESPONDING BITS OF INITIAL CHANNEL CONTROL ADDRESS, HENCE, + ; THIS ADDRESS MUST BE EVEN AND IN THE FIRST 1K OF CORE MEMORY! +;BIT 35 ;WRITE EVEN PARITY DATA INTO MEMORY (DIAGNOSTICS ONLY!) + +;SUBROUTINE "DFWRT" IS CALLED TO START UP A WRITE ON THE DISK. + +;CALLING SEQUENCE -- +; PUSHJ PDP,DFWRT +; RETURN WHEN WRITE HAS BEEN STARTED. +;ENTRY CONDITIONS -- +; C(TAC 18-35) = LOGICAL BLOCK NUMBER AT WHICH TO START WRITING, +; C(TAC1) = IOWD, I.E., +; C(TAC1 00-17) = 2'S COMPLEMENT OF WORD COUNT TO BE WRITTEN +; C(TAC1 18-25) = ADDRESS OF FIRST DATA WORD TO BE WRITTEN +;EXIT CONDITIONS -- +; THE REQUESTED WRITE HAS BEEN BEGUN +; TAC AND TAC1 HAVE BEEN DESTORYED + +DFWRT: CONSZ DSK,BUSYBT ;FOR SAFETY SAKE BE SURE THE DISK IS + JRST .-1 ; FREE NOW (THIS MAY BE A REDUNDANT CHECK). + MOVEM TAC1,WRCHNL ;SET UP CHANNEL COMMAND SEQUENCE. + SETZM WRCHNL+1 ;MAKE SURE NEXT COMMAND IS 0, SO CHANNEL + ; WILL NOT WRITE ALL OVER DISK + +IFN FTRCHK,< + EXTERN SATM2 + MOVEI TAC1,1(TAC1) ;CLEAR LH AND COMPARE WITH + ; FIRST WORD AFFECTED + CAIG TAC1,SATM2 ;COMPARE ABS CORE ADDRESS TO BEGINNING + ;OF SAT TABLE-2 + HALT . ;HALT - DO NOT WRITE OUT MONITOR - CONTINUE + ;WILL LOOP +> + MOVEI TAC1,WRCHNL + MOVEM TAC1,RCXIOC ;RCX10C IS MAGIC EVEN LOCATION IN FIRST 1K OF CORE. + PUSHJ PDP,CNVBLK ;CONVERT LOGICAL BLOCK NO. INTO PHYSICAL DISK ADDRESS. + ORI TAC,WRBIT ;REQUEST WRITE (INSTEAD OF READ) +DFWRTC: ORI TAC,RCXIOC + MOVEM TAC,DFORDR ;SAVE RC-10 DATAO COMMAND +DSKFDG: HRRZI TAC,DSKCHN ;THIS INSTRUCTION TEMPORARILY ALTERED DURING "ONCE". + IORI TAC,ALLERR!RESETB + HRLI TAC,DONEFLG ;TO SET INTERRUPT CONDITIONS IN DSKCON. +;READY THE DISK SYNCHRONIZER --- + STARTDV DSK + HRRZ TAC,@RCXIOC ;COMPUTE AND SAVE THE VALUE WHICH THE + HLRE TAC1,@RCXIOC ; CHANNEL CONTROL WORD SHOULD CONTAIN UPON + SUB TAC,TAC1 ; SUCCESSFUL COMPLETION OF THE DISK OPERATION. + MOVE TAC1,RCXIOC + HRLI TAC,1(TAC) + MOVEM TAC,RCXFIN + SETZM RCXCCW ;ZERO THE LOCATION WHERE THE DISK SYNCRONIZER WILL + ; STORE THE CHANNEL CONTROL WORD. + DATAO DSK,DFORDR ;START UP DISK AND DATA CHANNEL. + POPJ PDP, ;SUBROUTINE EXIT.,......*** + +;SUBROUTINE "DFRED" IS CALLED TO START UP A READ FROM THE DISK. + +;THE CALLING SEQUENCE, ENTRY CONDITIONS, AND EXIT CONDITIONS ARE EXACTLY +; SIMILAR TO THOSE FOR SUBROUTINE "DFWRT" ABOVE. + +DFRED: CONSZ DSK,BUSYBT ;POSSIBLY REDUNDANT CHECK TO BE + JRST .-1 ; SURE THE DISK IS FREE. + MOVEM TAC1,RDCHNL ;SET UP READ CHANNEL ORDERS IN A SEPARATE + SETZM RDCHNL+1 ;MAKE SURE NEXT COMMAND IN LIST IS 0 + ; SO CHANNEL WILL NOT WRITE ALL OVER MEMORY +IFN FTRCHK,< + EXTERN SATM2 + MOVEI TAC1,1(TAC1) ;CLEAR LH AND COMPARE WITH FIRST WORD AFFECTED + CAIG TAC1,SATM2 ;COMPARE ABS CORE ADDRESS TO BEGINNING + ;OF SAT TABLE-2 + HALT . ;HALT - DO NOT WRITE OUT MONITOR - CONTINUE + ;WILL LOOP +> + MOVEI TAC,RDCHNL ; PLACE FROM WRITE CONTROL WORDS FOR + MOVEM TAC,RCXIOC ; BETTER FOOTPRINTS IN CASE OF A CRASH. + PUSHJ PDP,CNVBLK ;CONVERT LOGICAL BLOCK NUMBER TO PHYSICAL DISK ADDRESS. + JRST DFWRTC ;REMAINDER OF THIS READ ROUTINE IS + ; IDENTICAL TO WRITING. + +;A ROUTINE CALLED DURING SYSTEM INITIALIZATION TO BE SURE DISK IS READY, +; NOTE: THIS ROUTINE DESTROYS ACCUMULATOR TAC. + +DISKUP: CONO DSK,ALLERR!RESETB ;CLEAR THE DISK SYNCHRONIZER. + CONSZ DSK,NRDY!PSF!BUSYBT!DONEFLG ;ANYTHING AMISS OR STUCK ? + JRST DISKUP ;IF SO, JUST HANGE HERE IN A LOOP. + DATAI DSK,TAC ;IS THE SECTOR COUNTER GOING ? + JUMPE TAC,.-1 ;IF NOT, JUST LOOP HERE. +;*** THIS LOOP ABOVE WILL OCCUR DURING INITIALIZATION IF THE DISK IS OFF-LINE. *** + HRRZI TAC,DSKBIT ;IF NOT, ENABLE DISK INTERRUPTS ON THE + CONO PI,2200(TAC) ; APPRORIATE PRIORITY INTERRUPT CHANNEL. + POPJ PDP, ;SUBROUTINE EXIT.....,*** + +;DISK INTERRUPTS COME HERE TO BE SERVICED -- + +DSKINT: CONSO DSK,@DSKCON ;*DID THE DISK SYNCHRONIZER CAUSE THE INTERRUPT ON + JRST .-1 ;* THIS CHANNEL? IF NOT, GO TO THE NEXT DEVICE ON + ;* THE SAME PRIORTY INTERRUPT CHANNEL. +; NOTE: THE "JRST .-1" IS ALTERED BY THE SYSTEM BUILDER PROGRAM. + + CONI DSK,DSKISV ;*SOLELY TO LEAVE FOOTPRINTS. + JSR DSKSAV ;*SAVE ACCUMULATORS, ETC. + SETZB IOS,DSKCON ;*CLEAR THE DSK I/O STATUS ACCUMULATOR, AND + ;* THE INTERRUPT ENABLED MARKER, + CONSZ DSK,DATERR ;*SET APPROPRIATE ERROR BITS (IF + TRO IOS,IODTER ;* ANY) IN ACCUMULATOR IOS FOR + CONSZ DSK,DEVERR!SETERR ;* DEVICE INDEPENED ROUTINE TO HANDLE. + TRO IOS,IODERR ;* + CONSZ DSK,WRPE ;* + TRO IOS,IOIMPM ;* +;CLEAR OUT THE DISK SYNCHRONIZER AND LEAVE IT DETACHED FROM ITS INTERRUPT CHANNEL. + CONO DSK,ALLERR!RESETB + MOVE TAC,RCXCCW ;*PICK UP THE FINAL VALUE FO THE CHANNEL CONTROL WORD. + CAMN TAC,RCXFIN ;*DOES IT AGREE WITH THE SAVED VALUE WE EXPECTED ? + JRST DFINT ;*YES, EXIT TO THE DEVICE INDEPENDENT INTERRUPT + ;* HANDLING ROUTINE IN "DSKSER"......... + MOVE TAC1,DSKISV ;* + TRNE TAC1,CHCPAR ;*CHANNEL CONTROL WORD PARITY ERROR DETECTED ? + JRST DSKNT2 ;*YES, SET ERROR BIT, EXIT TO DSKSER TO TRY 2 TIMES, + HRRZ TAC1,RCXFIN ;*NO, STOP AND DEAD UNLESS THE LAST DATA ADDRES + CAIGE TAC1,(TAC) ;* REFERENCED WAS WITHIN THE RANGE OF THE REQUESTED + JRST DSKNT1 ;* TRANSFER, IF IT WAS IN RANGE, SOME ERROR MUST + HRRZ TAC1,@RCXIOC ;* HAVE ABORTED PART OF THE DATA TRANSFER, THUS THE + CAILE TAC1,(TAC) ;* "DEVICE ERROR" BIT SHOULD BE TURNED BEFORE + JRST DSKNT1 ;* EXITING TO THE DEVICE INDEPENDENT ROUTINE. +DSKNT2: TRO IOS,IODERR ;* + JRST DFINT ;* + +DSKNT1: SKIPE RCXCCW ;*MAYBE CHANNEL WAS TURNED OFF ? + HALT . ;*NO--SERIOUS CHANNEL MALFUNCTION--CALL REPAIR MAN! + PUSH PDP,ITEM ;* + MOVEI ITEM,0 ;*SEND ERROR MESSAGE TO OPERATOR CONSOLE + JSP TAC,ERRPNT ;* + ASCIZ /DISK DATA CHANNEL TURNED ON ? +/ + POP PDP,ITEM ;* + JRST DSKNT2 ;* + +;SUBROUTINE TO CONVERT LOGICAL BLOCK NUMBERS TO PHYSICAL DISK ADDRESSES + +;CALLING SEQUENCE -- +; PUSHJ PDP,CNVBLK +; NORMAL RETURN (ONE "IMPOSSIBLE" ERROR COULD OCCUR) +;ENTRY CONDITIONS-- +; C(TAC) = RH IS THE LOGICAL BLOCK NUMBER TO BE CONVERTED; LH MAY BE NON-ZERO +;EXIT CONDITIONS-- +; C(TAC) = C(DFORDR0 = THE CORRESPONDING PHYSICAL DISK ADDRESS CORRECTLY +; POSITIONED FOR A DATAO TO THE RC-10 DISK SYNCHRONIZER. + +EXTERNAL ERRPNT,ERRPTU + +CNVBLK: MOVEM TAC,SVLBLK ;ONLY FOR FOOTPRINTS IN CASE OF CRASH. + TLZ TAC,-1 ;CLEAR NON-USEFUL LEFT HALF OF LOGICAL BLOCK NUMBER. +INTERNAL FTRCHK +IFN FTRCHK, < + CAMLE TAC,LBHIGH ;IS LOGICAL BLOCK NUMBER IN RANGE? + SKIPN LBHIGH ;NO. BUT IF LBHIGH IS STILL 0 WE MUST STILL BE + JRST CNVBK1 ; DOING THE INTITIALIZATION IN "ONCE", SO IT'S OKAY. +;INTERNAL MONITOR ERROR IF DSKSER OR SCHEDU COMES HERE WITH A LOGICAL +; DISK BLOCK NUMBER THAT IS OUT OF RANGE..... + HALT .+1 ;HALT ON THIS IMPOSSIBLE ERROR + POP PDP,DSKISV ;CORRECT PUSH DOWN POINTER AND LEAVE + ;INDICATOR + MOVEI IOS,IODERR ;UPON CONTINUING PREDEDN I/O COMPLETED + ;WITH DEVICE ERROR, + JRST DFINT +CNVBK1: +> + PUSH PDP,TAC1 ;THIS RTN SAVES AND RESTORES TAC1. + IDIVI TAC,^D4000 ;DETERMINE DISK NUMBER + ROT TAC,-2 + MOVEM TAC,DFORDR ;SAVE DISK NUMBER AWAY. + MOVE TAC,TAC1 + IDIVI TAC,^D20 ;SELECT TRACK NUMBER. + PUSH PDP,TAC1 + IDIVI TAC,^D10 ;CONVERT TRACK NUMBER TO BCD. + CAIL TAC,^D10 + ADDI TAC,6 ;SHORT-CUT BECAUSE FIRST DIGIT IS 0 OR 1. + LSH TAC,4 + OR TAC,TAC1 + ROT TAC,-^D11 + ORM TAC,DFORDR ;PUT TRACK NUMBER AWAY ALSO. + POP PDP,TAC ;NOW RETRIEVE SEGMENT NUMBER. + LSH TAC,2 ;MULTIPLY BY 4 (FOR PHYSICAL + IDIVI TAC,^D10 ; SEGMENTS PER LOGICAL BLOCK) + LSH TAC,4 + OR TAC,TAC1 ;SEGMENT NUMBER MUST BE IN BCD ALSO. + HRLZS TAC + ORB TAC,DFORDR ;FINALLY, JOIN SEGMENT NUMBER TO + POP PDP,TAC1 ; EARLIER CALCULATED PARTS OF ADDRESS, + POPJ PDP, ;SUBROUTINE EXIT.,....*** + +IFN FTCHECK+FTMONP, < +EXTERNAL RCXDAT ;TO CAUSE THE CORRECT COPY OF "DSKDAT" TO BE + ; RETRIEVED BY THE SYSTEM BUILDER. +EXTERNAL DSKCON,WRCHNL,RDCHNL,DSKISV,RCXFIN +EXTERNAL SVLBLK,DFORDR +> +IFE FTCHECK+FTMONP, < +INTERNAL DSKCON,LBHIGH,WRCHNL,RDCHNL,DSKISV,RCXFIN,SVLBLK,DFORDR +DSKCON: 0 ;ENABLED INTERRUPT CONDITIONS STORED HERE BY "STARTDV", +LBHIGH: 0 ;HIGHEST LEGAL LOGICAL BLOCK NUMBER. +WRCHNL: 0 ;CHANNEL CONTROL WORD OF LAST DISK WRITE. + Z ;CHANNEL TERMINATION WORD. +RDCHNL: 0 ;CHANNEL CONTROL WORD OF LAST DISK READ. + Z ;ZERO WORD TO TERMINATE CHANNEL. +DSKISV: 0 ;RESULT OF LAST CONI ON A DISK INTERRUPT. +RCXFIN: 0 ;EXPECTED VALUE OF CHANNEL CONTROL WORD (RCXCCW) AT + ; THE END OF THE CURRENT DISK TRANSFER. +SVLBLK: 0 ;LAST LOGICAL BLOCK NUMBER CONVERTED. +DFORDR: 0 ;ITS CORRESPONDING PHYSICAL DISK ADDRESS. + +> +DSKEND: END diff --git a/src/dskser.mac b/src/dskser.mac new file mode 100644 index 0000000..6b6d9d2 --- /dev/null +++ b/src/dskser.mac @@ -0,0 +1,3250 @@ +IFN FTRA10, < +TITLE DSKSER -- DEVICE-INDEPENDENT DISK SERVICE ROUTINES. +> +IFE FTRA10, < +IFN FTRC10,< +TITLE DSKSRB - ALMOST DEVICE INDEPENDENT DISK SERVICE ROUTINES (BURROUGHS) +>> +IFE FTRC10,< +TITLE DSKSRD - ALMOST DEVICE INDEPENDENT DISK SERVICE ROUTINES (DATA PRODUCTS) +> +SUBTTL A, BLACKINGTOM/CMF/TH/CHW/RCC/AF TS 02 JUN 69 V424 +XP VDSKSR,424 + +;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP + +INTERNAL FTRA10 ;TO ASSEMBLE DSKSER AS A + ; DEVICE INDEPENDENT ROUTINE SET + ; THIS SWITCH TO -1, NOTE THAT MDFINT (THE BRYANT + ; DSKINT) WAS WRITTEN SO AS TO KEEP DSKSER DEVICE-INDEPENDENT + ; THIS SWITCH AND CODE ENCLOSED IN ITS IFE'S WILL ULTIMATELY + ; BE REMOVED FROM DSKSER. + + +INTERNAL FTRC10 ;TO ASSEMBLE DSKSER FOR THE PDP-10 DISK + ; (MODEL RC-10), SET THIS SWITCH TO -1, + ; FOR OLD (270) DISK SET IT = 0. + +IFN FTRA10, < +ENTRY DSKSER +DSKSER: +> +IFE FTRA10, < +IFN FTRC10, < +ENTRY DSKSRB ;THIS SYMBOL IS TO PERMIT SYSTEM +DSKSRB: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE, +> +IFE FTRC10, < +ENTRY DSKSRD ;THIS ENTRY FOR SELECTIVE LOAD BY BUILD +DSKSRD: +>> + +EXTERNAL JIFMIN + +INTERNAL WLBIT,DSKFGS,CHKCNT + +TA=BUFPNT ;USED BY RENAME +TB=BUFWRD ;USED BY RENAME + +IFE FTRA10, < +INTERNAL MFDBLK,SATXWD +IFN FTRC10, < +MFDBLK: 66 ;ON PDD-10 DISK, MFD RETRIEVAL INFORMATION AND SAT +SATXWD: XWD -NUMSAT,67 ;BLOCKS GO AT THESE ABSOLUTE ADDRESSES + ; UNLESS USER SPECIFIES OTHERWISE DURING "ONCE". +> +IFE FTRC10, < +MDFBLK: 13000 ;THIS BLOCK CONTAINS RETRIEVAL INFO, OF MFD +SATXWD: XWD -NUMSAT,13001 ;LH=NUMBER OF SAT BLOCKS. + ;RH=FIRST SAT BLOCK NUMBER. +>> + +CHKCNT=200 ;NUMBER OF WORDS TO CHECK-SUM +W8BIT=400000 ;WAIT INDICATION FOR DDB + +; BITS IN LH OF IOS + +NMP=100 ;NO MORE INPUT POINTERS (LH OF IOS) +UBFS=200 ;USING BUFFER IN FREE STORAGE (LH OF IOS) +NORELB=400 ;DO NOT RELOCATE BUFFER ON I/O (LH IOS) +UBFU=1000 ;USING BUFFER IN USER AREA +NCTRLC=2000 ;DISABLE ^C DURING CRUCIAL SEQUENCES OF NON- + ; INTERRUPTABLE OPERATIONS +DAFLG=4000 +AUFLG=10000 +DSKFGS=AUFLG+DAFLG+UBFS+NCTRLC ;USED TO SUPPRESS ACTION OF ^C, SEE STOPCK +PRCHG=20000 ;PROTECTION CHANGED +LIR=IOEND ;LAST INPUT REQUESTED + +;MISCELLANEOUS CONSTANTS +TRIES=3 ;NUMBER OF TIMES TO READ OR WRITE BAD BLOCK +BLKSIZ=200 ;SIZE OF DATA BLOCK. DUMP MODE REQUIRES THIS +NBLKSZ=-BLKSIZ ;TO BE A POWER OF 2. +BLKP2=7 ;BLKSIZ = 2^BLKP2 + +;TEST BITS PUT IN LH OF DEVOAD + +PNTDIF=200000 ;POINTERS IN CORE DO NOT MATCH POINTERS ON DISC +VRGPTR=100000 ;FLAG TO SIGNAL THAT POINTERS HAVE NEVER BEEN WRITTEN +RENBIT=20000 ;"RENAMING" INDICATION FOR SETLE ROUTINE +WPRO=40000 ;LOOKUP DONE, FILE IS IN WRITE PROTTECT +CKSUPR=10000 ;FLAG SET IF READING DUMP FILES IN NON-DUMP MODE + +;CONSTANTS USED IN CONNECTION WITH ACCESS TABLE ENTRIES + +ATPP=0 ;PROJECT,PROGRAMMER NUMBERS +ATNAME=1 ;OWNER NAME +ATEXT=2 ;EXTENSION +TBITS=2 ;TEST BITS AND RCOUNT +ATBLOK=3 ;BLOCK NUMBER OF RETRIEVL INFO OF UFD IN LH +ATLINK=3 ;LINK TO NEXT ENTRY IN RH + +WTBIT=400000 ;FILE IS BEING CREATED +DTBIT=200000 ;DELETE WHEN THRU READING +RTBIT=100000 ;FILE HAS BEEN RENAMED +ATBITS=500000 ;WTBIT+RTBIT +ATIND=40000 ;NAME IS ALREADY IN DIRECTORY +ATCLO=20000 ;OUTPUT CLOSE TO BE DONE +RWTBIT=10000 ;FILE BEING READ AND WRITTEN, BUT NOT CREATED, +RCOUNT=7777 ;MASK FOR THE COUNT OF READERS + +;CONSTANTS USED IN CONNECTION WITH SAT BLOCKS + +XP NUMBIT,^D36*BLKSIZ ;NUMBER OF BITS IN ONE BLOCK + +IFE FTRA10, < +IFN FTRC10, < +XP NUMSAT,4 ;ONLY FOUR SAT BLOCK ON PDP-10 DISK, +> +IFE FTRC10, < +XP NUMSAT,16 ;NUMBER OF SAT BLOCKS FOR 5.76 MILLION + ;WORD DATA PRODUCTS MODEL 270 DISK, +>> +XP WLBIT,400000 ;IF BIT IS ON IN FIRST SATENT ENTRY + ;WORD, THE DISK IS WRITE-LOCKED. + +EXTERNAL DSKOFF + +DEFINE NOSCHEDULE < + CONO PI,DSKOFF +> + +EXTERNAL DSKON +DEFINE SCHEDULE < + CONO PI,DSKON +> + +INTERNAL FTCHECK,FTMONP +IFN FTCHECK+FTMONP,< +EXTERNAL DDBPTR,DSKCOR,PTRN,MOPTR,MIPTR,RUNUSR,SAVPRG,USRCNT +EXTERNAL SATPTR,SAT,SATBK2,DIRSIZ +EXTERNAL DSKDDB,DEVACC,DEVCNT,DEVBLK,DEVBKO,DSKBUF +EXTERNAL DSKCNT,SETCNT,PTR1,FPNTR,FPNTR1,FAT,DFBUSY,LOCORE,GTCOR3 +EXTERNAL GTCOR2,CORBIT,CKSMCT,DSKSIZ,DSKACC,DSKAPP,CORBSZ,MONBUF +> +IFE FTCHECK+FTMONP,< + +;DISK DEVICE DATA BLOCKS & MISCELLANEOUS CONSTANTS, WORKING STORAGE +DDBPTR: Z ;LOCATION OF NEXT DDB TO LOOK AT + ;DURING DISK INTERRUPT + +;MORE MISCELLANEOUS FOR DISK + +INTERNAL SATPTR,SAT,SATBK2,REFLAG,DFBUSY,CKSMCT +MOPTR: BLOCK 1 ;POINTER TO NEXT TASK TO DO +MIPTR: BLOCK 1 ;POINTER TO NEXT FREE QUEUE ENTRY + +RUNUSR: BLOCK 1 ;LH=DEVDAT OF USER JOB RUNNING + ;RH= UNUSED +USRCNT: BLOCK 1 ;COUNT OF WAITING USER JOBS +DFBUSY: 0 ;-1 IF DISK CONTROL IN USE, 0 IF FREE +FAT: 0 ;POINTER TO FIRST ACCESS TABLE ENTRY +DKSMOT: 0 ;COUNT OF VARIOUS CHECKSUM ERRORS +REFLAG: 0 ;CONTAINS A PPN TO ALLOW LOGIN AFTER REFRESH +UXFERS: 0 ;TOTAL USER TRANSFER ATTEMPTED +ECOUNT: 0 ;TOTAL HARDWARE ERRORS ON USER TRANSFERS +;DISK STORAGE ALLOCATION CONTROL + +SATPTR: BLOCK 1 ;POINTER TO CURRENT SATENT ENTRY +SATPIK: BLOCK 1 ;POINTER TO NON-FULL SAT ENTRY +SATCHG: BLOCK 1 ;0 IF SAT BLOCK IN CORE=BLOCK ON DISK, -1 OTHERWISE +SATTEM: BLOCK 1 ;TEMPORARY SAVE LOCATIONS USED DURING SAT READ +SATTMP: BLOCK 1 ; ROUTINE TO AVOID PUSH-DOWN LIST OVERFLOW. + +IFN FTRA10, < +EXTERNAL MFDBLK,SATXWD,NUMBLK,SATENT,SENTSZ,SATTOP +> +IFE FTRA10,< +INTERNAL SATENT + +IFN FTRC10, < +XP NUMBLK,^D4000 ;NUMBER OF DATA BLOCKS PER SAT BLOCK ON THE + ; PDP-10 MODEL RC-10 DISK FILE. +> +IFE FTRC10, < + XP NUMBLK,5400 ;NUMBER OF DATA BLOCKS REPRESENTED BY + ;ONE SAT BLOCK ON THE DATA PRODUCTS 270 DISK. +> + XP SENTSZ,3 ;SIZE OF EACH SATENT ENTRY +IFN FTREC10, < +DSKXDB=0 ;ON PDP-10 DISK FILE STORAGE BEGINS IN LOGICAL + ; BLOCK NO. 0, +> +IFE FTRC10, < +DSKXDB=5400 ;FILE STORAGE BEGINS ON SECOND DISK OF OLD (MOD 270) + ; DISK FILE SINCE FIRST DISK IS ALLOCATED + ; TO SWAPPING. +> + +SATENT: REPEAT NUMSAT,< + XWD DSKXDB,0 ;RH CONTAINS WLBIT AND COUNT OF BLOCK USED + BLOCK 1 ;BIT MASK, SINGLE ROTATING BIT + BLOCK 1 ;XWD LENGTH OF SAT TABLE POINTER WORD + ; IN SAT BLOCK + DSKXDB=DSKXDB+NUMBLK> + + XP SATTOP,SATENT*SENTSZ*NUMSAT-SENTSZ +>;END OF FTRA100 CONDITIONAL + +SAT: BLOCK 200 ;CURRENT SAT BLOCK + + XP SAATM2,SAT-2 ;LOWEST ABS, ADR-1 ALLOWED IN CHANNEL COMMAND + ; LIST - USED TO KEEP FROM WIPING OUT MONITOR. +SATBK2: XWD -200,SAT + + XP DIRSIZ,4 ;NO. OF WORDS OF RET. INFO WHICH ARE + ;NOT POINTERS. + +;THE DUMMY DEVICE DATA BLOCK +DSKCOR=10 +DSKSIZ=4*DSKCOR ;NUMBER OF WORDS ALLOCATED FOR DDB + ;MUST BE A MULTIPLE OF FOR (SEE GETCOR) + +INTERN DSKDDB +DSKDDB: SIXBIT /DSK/ + XWD ^D5*HUNGST,201 + Z + EXP DSKDSP + XWD DVOUT+DVIN+DVDIR+DVDSK+DVLNG,154403 + Z + Z + XWD PROG, + XWD PROG, + XP DEVFIL,.-DSKDDB ;FILE NAME + Z ;SIXBIT/FILE? - FILE NAME + XP DEVEXT,.-DSKDDB ;FILE EXTENSION + Z ;XWD SIXBIT/EXT/,BLOCK# OF THE RIB + XP DEVPPN,.-DSKDDB ;PROJ,PROGRAMMER FOR CURRENT + ; (OR MOST RECENT) LOOKUP,ENTER,RENAME + Z + XP DEVACC,.-DSKDDB ;C(LH)=LOCATION OF CCESS TABLE ENTRY + Z ;C(LH)=ADDRESS OF ACCESS TABLE ENTRY + ;C(RH)=ADDRESS OF CURRENT POINTER IN DDB + XP DEVCNT,.-DSKDDB ;C(LH)USED DURING LOOKUP,ENTER + Z ;C(LH)==RELATIVE BLOCK# WITHIN UFD OPTIMIZE UFD SEARCHES) + ;C(RH)=COUNT OF BLOCKS IN FILE + XP DEVBLK,.-DSKDDB ;C(LH)=BLOCK NUMBER OF CURRENT POINTER + Z ;C(LH)=LOGICAL BLOCK# OF RIB + ;C(RH)=RELATIVE LOC. OF RIB + ;POINTER IN THAT BLOCK + XP DEVBKO,.-DSKDDB ;LIKE DEVBLK, BUT FOR BEGINNING + Z ;SIMILAR TO DEVBLK - SAY WHERE CURRENT + ; POINTER COME FROM + XP DSKBUF,.-DSKDDB ;C(LH)=-SIZE OF MONITOR READ/WRITE + Z ;C(LH)=-SZIE OF READ/WRITE + ;C(RH)=BUFFER IN USER AREA + XP DSKCNT,.-DSKDDB ;C(LH)=BLOCK NUMBER TO READ/WRITE + Z ;C(LH)=LOGICAL BLOCK@ FOR READ OR WRITE + ;C(RH)=ERROR COUNT OR ERROR BITS + XP SETCNT,.-DSKDDB ;LH CONTAINS POINTER TO R.I. OF + ;C(LH)=BLOCK# OF UFD RIB + Z ;UFD, RH IS SETO, SETI COUNTER. + XP PTR1,.-DSKDDB ;RETRIEVAL INFO STARTS HERE + ; DEFINE THE AREA CONTAINING RETRIEVAL; POINTERS + XP FPNTR,PTR1+DIRSIZ ;LOC. OF FIRST POINTER TO RET. INFO. + XP FPNTR1,FPNTR-1 + XP PTRN,DSKSIZ-1 + +;DEFINE 3 WORD ENTRY CONTROLLING BIT SEARCH IN DDBTAB + +INTERNAL LOCORE,CRINIT +EXTERNAL DDBTAB + +LOCORE: EXP 0 ;ADDRESS OF FIRST 4 WORD BLOCK IN FREE CORE AREA + ; SET BY LINKDB +CORBIT: 0 ;FLOATING 1 BIT USED IN SEARCHES +CORIWD: XWD 0,0 ;AOBJN POINTER TO FIRST WORD IN DDBTAB CONTAINING A 0 +CRINIT: XWD 0,DDBTAB ;INITIAL AOBJN POINTER FOR CORIWD + ; LH SET BY LINKDB +MONBUF: BLOCK 200 ;MONITOR BUFFER, USED TO READ RETRIEVAL POINTERS, ETC. + +;ERROR CODES FOR LOOKUP, RENAME AND/OR ENTER + +NOTINU=0 ;NO SUCH FILE +NOTINM=1 ;NO SUCH USER +PHOTF=2 ;PROTECTION FAILURE +NORITE=3 ;MORE THAN 1 WRITE TO A FILE +RENFAL=4 ;TRIED TO RENAME FILE TO EXISTING NAME OR ENTER + ; A NULL FILE NAMES +NOFILE=5 ;TRIED TO RENAME WITH NO FILE SELECTED +ERRBIT=1 ;BITS GO IN WORD 1 OF THE ENTRY + +;DISK DISPATCH TABLE + +INTERNAL DSKDSP + + JRST DSKINI ;INITILIZE + JRST CPOPJ1 ;DSK HUNG TIMEOUT, NO ERROR MESSAGE +DSKDSP: JRST DFREL ;RELEASE + JRST DFCLSO ;CLOSE OUTPUT + JRST DFOUT ;OUTPUT + JRST DFIN ;INPUT + JRST DFENTR ;ENTER + JRST DFLOOK ;LOOKUP + JRST DFDMPO ;DUMP OUTPUT + JRST DFDMPI ;DUMP INPUT + JRST DFSET ;USETO + JRST DFSET ;USETI + POPJ PDP, ;UGETF + JRST DFREN ;RENAME + JRST DFCLSI ;CLOSE INPUT + POPJ PDP, ;UTPCLR + POPJ PDP, ;MTAPE + +;ACCINI - CALLED AT 140 START, 143 RESTART +; RESTORE DEVICE DATA BLOCK CHAIN +; INITIALIZE DDBTAB BIT SEARCHING ENTRY + +INTERNAL ACCINI + +ACCINI: MOVSI TAC,(SIXBIT /DSK/) + MOVEI DEVDAT,DSKDDB ;POINT TO PROTOTYPE DDB +ACCIN1: HLRZ DEVDAT,DEVSER(DEVDAT) + JUMPE DEVDAT,ACCIN2 + CAMN TAC,DEVNAM(DEVDAT) + JRST ACCIN1 +ACCIN2: MOVEI TAC,DSKDDB + HRLM DEVDAT,DEVSER(TAC) ;LINK PROTOTYPE TO FIRST NON DSK DDB + MOVSI TAC,400000 + MOVEM TAC,CORBIT ;INITIALIZE FLOATING 1 BIT + MOVE TAC,CRINIT + MOVEM TAC,CORIWD ;RESET AOBJN WORD + + POPJ PDP, + +;DSKINI - CALLED AT START, RESTART, 143 RESTART +; REMOVE ACCESS ENTRIES, REMOVE DDB'S NOT ASSIGNED BY CONSOLE. CLEAR THE MONITOR QUEUE +INTERNAL DSKINI, SETSAT +EXTERNAL DISKUP,DFWUNS + +DSKINI: IFN FTSWAP, < + SETZM SQREQ ;NO SWAPPING REQUEST + SETZM SERA +> + IFE FTRA10, < +EXTERNAL DSKCON + HLLZS DSKCON ;CLEAR INTERRUPT FLAGS FOR CONSO +> + SETZM DFBUSY ;DISK CONTROL AVAILABLE + SETZM RUNUSR ;NO USER I/O IN PROGRESSS + SETOM USRCNT ;NO USER TRANSFERS WAITING + SETZB DDBPTR ;NO NEXT DDB + ; CLEAR IOS (SUPERSTITIOUS, BUT POSSIBLY NECESSARY) + MOVEI DEVDAT,DSKDDB ;PREPARE TO RELEASE DISK DDB'S +DSKIN0: HLRZ DEVDAT,DEVSER(DEVDAT) ;GET DDB LINK + JUMPE DEVDAT,DSKIN1 ;JUMP IF END REACHED + MOVSI TAC, (SIXBIT /DSK/) ;DEVICE NAME + CAME TAC,DEVNAM(DEVDAT) ;IS THIS A DISK DDB? + JRST DSKIN1 ;NO. DONE + HLRZ TAC, DEVACC(DEVDAT) ; GET POINTER TO ACCESS ENTRY + SKIPE TAC ;ACCESS ENTRY EXIST? + PUSHJ PDP,CLRAT ;YES. REMOVE IT + MOVSI TAC,W8BIT ;PREPARE TO CLEAR "TRANSFER WAITING" BIT + ANDCAM TAC,DEVIAD(DEVDAT) ;CLEAR INPUT WAITING + ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR OUTPUT WAITING + MOVE TAC,DEVMOD(DEVDAT) + TRNN TAC,ASSCON ;DDB ASSIGNED BY ASSIGN COMMAND? + PUSHJ PDP,CLRDDB ;NO. REMOVE DDB + JRST DSKIN0 ;CONTINUE + +DSKIN1: SETZM FAT ;NO ACCESS ENTRIES + MOVEI TAC,MQUEUE+1 ;DESTINATION FOR BLT + MOVEM TAC,MIPTR + MOVEM TAC,MOPTR ;RESET IN AND OUT POINTERS + HRLI TAC,MQUEUE + SETZM MQUEUE ;SOURCE FOR BLT + BLT TAC,MQTOP-1 ;CELAR THE MONITOR QUEUE + PUSHJ PDP,DISKUP ;DETERMINE IF DISK IS FUNCTIONING +SETSAT: AOSE STARTS ;SKIP FIRST TIEM ONLY + JRST SAT01 ;WRITE SAT BLOCK IN CORE + JRST DFWUNS ;SCAN ALL SAT BLOCKS +STARTS: -1 ;COUNT STARTS, RESTARTS + +;WRITE OUT SAT BLOCK, ENTER AT DSKSTP WITH FIXED START 147, +;AT SAT01 UPON RE-ENTRY OF INITIALIZATION. + +INTERN DSKSTP,SAT05,JSAT06 + +EXTERNAL DSKBIT,WSYNC,STOIOS,DCBBIT + +DSKSTP: HRRZI TAC,DSKBIT + IORI TAC,DCBBIT ;DCBBIT NON-ZERO ONLY FOR DATA-PRODUCTS N$1K + IORI TAC,2200 ;CLEAR PI SYSTEM + CONO PI,10000(TAC) + SKIPL STARTS ;HAS A SAT BLOCK BEEN READ IN? + PUSHJ PDP,SAT01 ;YES, WRITE IT OUT + CONO PI,10000 + POPJ PDP, ;YOU ARE SAFELY DONE. + +SAT01: MOVEI DEVDAT,DSKDDB + SETZB IOS,DEVIOS(DEVDAT) + MOVEI PROG,0 + PUSH PDP,WSYNC ;CHANGE WSYNC ROUTINE + MOVE TAC,JSAT06 + MOVEM TAC,WSYNC +SAT05: MOVEI ITEM,TRIES ;SET UP COUNT FOR ERRORS +SAT02: PUSHJ PDP,SATBLK ;SET UP TAC,TAC1 + PUSHJ PDP,MQOUT ;WRITE IT. + JRST SAT04 ;ERROR + SETZM SATCHG ;SHOW SAT BLOCK IN CORE = BLOCK ON DISK. + + POP PDP,WSYNC ;NO ERRORS, SO RETURN. + SETZM DEVIOS(DEVDAT) + POPJ PDP, + +SAT04: SOJG ITEM,SAT02 ;ERRORS, SO TRY AGAIN + POP PDP,WSYNC ;RESTORE WSYNC ROUTINE + JRST 4,SAT01 + +SAT06: MOVEI TAC,IOACT ;THIS IS SUBSTITUE FOR WSYNC + TDNE TAC,DEVIOS(DEVDAT) + JRST .-1 + POPJ PDP, + +JSAT06: JRST SAT06 + +SUBTTL ENTER, LOOKUP, RENAME, CLOSE +;ENTER UUO + +EXTERNAL TIME,PRJPRG,CPOPJ, THSDAT + +DFENTR: SKIPN @UUO ;ZERO FILE NAME ? + JRST DFER12 + PUSHJ PDP,ALTMFD ;ENTER TO MFD? + TLNE DEVDAT,LOOKB ;NO, HAS LOOKUP BEEN DONE? + JRST DFENT5 ;YES + TLO IOS,IO + PUSHJ PDP,SETLE ;RETURNS WITH PP ON PDL + JRST DFERR4 ;NO UFD, CLOCK ON + JRST DFENT2 ;NO FILE, CLOCK ON. + JRST DFERR6 ;FILE BEING WRITTEN + JRST DFENT7 ;FILE BEING READ,CHECK FOR WRITERS + +DFENT1: SCHEDULE + HRRZ TAC,DEVEXT(DEVDAT) ;BLOCK# OF FIRST RIB + PUSHJ PDP,SETPTR ;READ FIRST RETRIEVAL POINTERS TO DDB + MOVSI DAT,100000 ;WRITE PROTECTION BIT + PUSHJ PDP,PROTEK ;WRITE PROTECTED? + JRST DFERR3 ;NAME WRONG + JRST DFERR5 ;PROTECTION FAILURE. + MOVEI TAC1,WTBIT+ATIND+ATCLO ;BITS FOR ACCESS ENTRY-FILE EXISTS + TLZA IOS,PRCHG ;PREPARE FOR PROTECTION CHECK +DFENT2: MOVEI TAC1,WTBIT+ATCLO ;BITS FOR ACCESS ENTRRY - FILE CREATION + HLLZS DEVEXT(DEVDAT) ;SET TO 0 RIB BLOCK# + NOSCHEDULE + PUSHJ PDP,SCANAT ;SCAN ACCESS TABLE FROM BEGINNING + JRST DFENT3 ;NOT THERE + +DFEN2A: MOVE DAT,TBITS(TAC) ;WRITE BIT ON? + TRNE DAT,WTBIT + JRST DFERR6 ;YES,ERROR + PUSHJ PDP,SCNAT2 + JRST DFENT3 + JRST DFEN2A + +DFENT3: TLZE IOS,PRCHG ;PROTECTION FAILURE? + JRST DFERR5 ;YES. GIVE ERROR RETURN. + SCHEDULE + PUSH PDP,TAC1 ;SAVE ACCESS BITS + PUSHJ PDP,DFGETF ;GET A BLOCK FOR RETRIEVAL POINTERS. # IN TAC + POP PDP,TAC1 ;RESTORE ACCESS BITS + HRLZM TAC,DEVBLK(DEVDAT) ;SET CURRENT RIB# AND INDEX IN DDB + HRLZM TAC,DEVBKO(DEVDAT) + HRRM TAC,DEVEXT(DEVDAT) ;STORE FIRST RIB# + NOSCHEDULE + + MOVE DAT,TAC1 ;ACCESS ENTRY BITS + PUSHJ PDP,SETAT ;CREATE ACCESS ENTRY. RETURN POINTER IN TAC1 + HRLM TAC1,DEVACC(DEVDAT) ;STORE POINTER TO ACCESS ENTRY + MOVEI DAT,PTR1(DEVDAT) ;SET UP RETRIEVAL INFO + MOVE TAC,DAT ;DESTINATION (DDB) + HRLI TAC,@UUO ;SOURCE (UUO PARAMETER BLOCK) + BLT TAC,2(DAT) ;NAME & EXTENSION + SCHEDULE + MOVE TAC1,THSDAT + ORI TAC1,400000 ;MAKE SURE ACCESS DATE NON-ZERO, + HRRM TAC1,1(DAT) ;STORE THSDAT AS ACCESS DATE + MOVE TAC1,2(DAT) + TLZ TAC1,777740 ;IS THERE A DATE ALREADY? + JUMPN TAC1,DFENT4 ;YES IF JUMP. + MOVE TAC,TIME ;NO, GET TIME. + IDIVI TAC,JIFMIN + HRRZ TAC1,THSDAT ;AND DATE. + DPB TAC,[POINT 11,TAC1,23] +DFENT4: TLO TAC1,55000 ;PROTECTION + DPB IOS,[POINT 4,TAC1,12] ;MODE + MOVEM TAC1,2(DAT) ;STORE PROTECTION MODE TIME DATE IN DDB + MOVE ITEM,JOB + MOVE TAC,PRJPRG(ITEM) + MOVEM TAC,3(DAT) ;STORE PROGRAMMER# IN DDB + SETZM 4(DAT) ;CLEAR FIRST POINTER + MOVSI IOS,NMP ;SET "NO MORE POINTERS" + ORB IOS,DEVIOS(DEVDAT) + TLZ DEVDAT,OCLOSB + HLLZS DEVCNT(DEVDAT) ;CLEAR FILE SIZE + MOVSI TAC,VRGPTR ;SET "VIRGIN POINTER" FLAG (O DFO4A SUBROUTINE + IORM TAC,DEVOAD(DEVDAT) ;WILL CREATE A NEW RIB WHEN JUST CALLED + JRST ALLOK + +;AN ENTER AFTER A LOOKUP, SET "RWTBIT" FLAG IN ACCESS ENTRY + +DFENT5: MOVE TAC,DEVOAD(DEVDAT) ;CHECK PROTECTION + TLNE TAC,WPRO + PUSHJ PDP,DFERR5 ;FAILURE, THIS WILL NOT RETURN HERE + HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY + NOSCHEDULE + MOVE TAC1,TBITS(TAC) ;GET ACCESS BITS + TROE TAC1,RWTBIT ;FILE BEING READN AND WRITTEN ALREADY? + PUSHJ PDP,DFERR6 ;YES, THIS WILL NOT RETURN HERE + MOVEM TAC1,TBITS(TAC) ;NO, SET IT + SCHEDULE + CONO PI,DSKON + + MOVE TAC,@UUO ;SAVE FILE? + CAME TAC,DEVFIL(DEVDAT) + JRST DFERR8 ;NO, NAME WRONG + ADDI UUO,1 + HLLZ TAC,@UUO ;PICKUP EXTENSION FROM USER ENTER BLOCK + XOR TAC,DEVEXT(DEVDAT) ;COMPARE WITH LOOKUP EXTENSIONS(AND PICKUP + ; RETRIEVAL INFORMATION + TLNE TAC,-1 ;EXTENSION THE SAME? + JRST DFERR8 ;NO, EXTENSION WRONG + SOS UUO ;YES, RETRIEVE LATEST RETRIEVAL INFORMATION AND + PUSHJ PDP,SETPTR ;STORE CURRENT SIZE IN THE 4TH WORD OF THE 4-WORD + PUSHJ PDP,DFLUK4 ;ENTER BLOCK (IN CASE SOME OTHER USER HAS APPENDED + ; DATA TO THIS FILE BETWEEN THE TIME THIS USER DID + ; HIS LOOK-UP AND THIS ENTER.) NOTE: THIS LAST + ; PUSHJ WILL EXIT TO UUOCON--NOT RETURN HERE! + +;FILE IS BEING READ + +DFENT7: PUSHJ PDP,SCNAT2 ;FIND ANOTHER + JRST DFENT1 ;NO WRITERS, PERMIT THIS ENTER + JRST DFERR6 ;MUST BE BEING WRITTEN OR RENAMED + +;LOOKUP UUO + +EXTERNAL UDLKC,TPOPJ + +DFLOOK: SKIPN @UUO ;ZERO FILE NAME ? + JRST DFER12 ;IF SO, ERROR. + MOVEI TAC,CLSIN ;SUPPRESS INPUT CLOSE IF UDLKC IS CALLED + TLNE DEVDAT,ENTRB ;ENTER DONE YET? + PUSHJ PDP,UDLKC ;CLOSE OUTPUT + TLZ IOS,IO ;INPUT STATE + PUSHJ PDP,SETLE ;RETURNS WITH PP ON PDL + JRST DFERR4 ;NO UFD, CLOCK ON + JRST DFERR7 ;NO FILE, CLOCK ON. + JRST DFLUK8 ;FILE BEING WRITTEN + JRST DFLUK3 ;FILE BEING READ + +DFLUK2: MOVEI DAT,0 + PUSHJ PDP,SETAT ;BUILD AN ACCESS ENTRY + MOVE TAC,TAC1 ;TAC,TAC1 POINT TO ACCESS ENTRY + +DFLUK3: AOS TBITS(TAC) ;INCREMENT RCOUNT + HRLM TAC,DEVACC(DEVDAT) ;STORE POINTER TO ACCESS ENTRY + SCHEDULE + MOVE TAC,DEVEXT(DEVDAT) ;FIRST RIB# + PUSHJ PDP,SETPTR ;GET IN THE RETRIEVAL INFO + + TLZE IOS,PRCHG ;PROTECTION CHANGE FAILURE? + JRST DFLUK7 ;YES. ERROR RETURN + MOVSI DAT,200000 ;READ PROTECTION BIT + PUSH J PDP,PROTEK ;READ PROTECTED? + JRST DFERR3 ;NAME WRONG + JRST DFLUK7 ;PROTECTION FAILURE + + MOVE TAC1,DEVOAD(DEVDAT) ;CHECK WRITE PROTECTION FOR + MOVSI DAT,100000 ;POSSIBLE SUBSEQUENT ENTER + PUSHJ PDP,PROTKX + TLOA TAC1,WPRO ;WRITE PROTECTED. SET FLAG + TLZ TAC1,WPRO ;WRITE OK--RESET FLAG + IORM TAC1,DEVOAD(DEVDAT) + +DFLUK4: MOVSI TAC,PTR1(DEVDAT) ;COPY INFO TO LOOKUP PARAMETER BLOCK + NOSCHEDULE + HRRI TAC,@UUO ;DESTINATION IS UUO PARAMETER BLOCK + MOVE TAC1,TAC + BLT TAC,2(TAC1) ;BLT NAME. EXT. PROTECTION, ETC FROM DDB TO USER + SCHEDULE + HLRE TAC,FPNTR1(DEVDAT) ;FILE LENGTH (USUALLY -WORDS) + ADD UUO,3 + HRLZM TAC,@UUO ;SET UP 4TH WORD OF DIRECTORY HDR. + SUBI UUO,3 ;RESET UUO + MOVMS TAC ;SET FILE SIZE (WORDS) IN DDB + HRRM TAC,DEVCNT(DEVDAT) + TLZ DEVDAT,ICLOSB + MOVSI TAC,VRGPTR ;POINTERS DO EXIST ON THE DISK SO + ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR THE VIRGIN POINTERS FLAG. + +ALLOK: MOVEI DAT,FPNTR(DEVDAT) ;SKIP FILE INFO IN FIRST RIB + HRRM DAT,DEVACC(DEVDAT) ;SET VERTICAL POINTER POINTER + MOVEI TAC,1 + HRRM TAC,SETCNT(DEVDAT) ;"POISITONED" AT RELATIVE BLOCK 1 OF FILE + MOVSI TAC,777760-WPRO-VRGPTR ;CLEAR FLAGS + ANDCAM TAC,DEVOAD(DEVDAT) + +IFG CHKCNT,< +;TO GET AROUND CHECKSUM FAILURE WHILE READING DUMP FILES IN NON-DUMP MODE + + LDB TAC1,[POINT 4,-2(DAT),12] + CAIGE TAC1,15 ;IS FILE IN DUMP MODE? + JRST ALLXIT ;NO + LDB TAC1,[POINT 4,DEVIOS(DEVDAT),35] + MOVSI TAC,CKSUPR + CAIGE TAC1,15 ;IS CURRENT MODE DUMP? + IORM TAC,DEVOAD(DEVDAT) ;NO. SUPPRESS CHECKSUM +> +ALLXIT: POP PDP,TAC ;REMEMBER 0(PDP) WASS XWD PROJ,PROG + + AOS (PDP) ;RETURN TO CALL+2 + JRST CLRBUF ;RELEASE MONITOR BUFFER + +DFLUK7: PUSHJ PDP,DFCL21 ;PROTECTION FAILURE,CLEAR ACCESS + JRST DFERR5 + +;FILE IS BEING WRITTEN + +DFLUK8: PUSHJ PDP,SCNAT2 ;LOOK FOR ANOTHER + JRST DFLUK2 ;NO MORE + JRST DFLUK3 ;FOUND WHAT MUST BE READ + +;TEST FOR MFD ALTERAION + +EXTERNAL SYSPP,JOB,PRJPRG + +ALTMFD: MOVEI TAC,3(UUO) ;IS PROJ, PROG. = 1,1? + TLO TAC,PROG ;RELOCATE + MOVE TAC,@TAC ;XWD PROJ,PROG + CAME TAC,SYSPP + POPJ PDP, ;NO,RETURN + + MOVE ITEM,JOB + XOR TAC,PRJPRG(ITEM) + TLNN TAC,-1 ;PRIVILEGED USER? + POPJ PDP, ;YES, RETURN + + JRST DFERR5 + +;RENAME UUO + +EXTERNAL CPOPJ1 +EXTERNAL THSDAT +DFREN: PUSHJ PDP,DFRENX + POPJ PDP, + JRST CPOPJ1 + +DFRENX: SKIPN DEVFIL(DEVDAT) ;IS THERE AN OLD FILE? + JRST DFER11 ;NO, UNDEFINED FILE + TLO IOS,IO ;YES, LOOK FOR THE FILE + MOVSI TAC,RENBIT ;RESET BIT + ANDCAM TAC,DEVOAD(DEVDAT) + ADDI UUO,3 ;POINT TO XWD PROJ,PROG + PUSHJ PDP,SETLE9 ;RETURNS WITH PP ON PDL + JRST DFERR4 ;NO UFD, CLOCK ON + JRST DFERR7 ;NO SUCH FILE, CLOCK ON. + JRST DFERR6 ;FILE BEING WRITTEN + JRST DFREN1 ;ALREADY HAS ACCESS ENTRY + + MOVEI DAT,0 ;BUILD ACCESS ENTRY + PUSHJ PDP,SETAT + MOVE TAC,TAC1 ;TAC,TAC1 POINT TO ACCESS ENTRY + +DFREN1: AOS TBITS(TAC) ;INCREMENT RCOUNT + HRLM TAC,DEVACC(DEVDAT) ;SAVE POINTER TO ACCESS ENTRY + SCHEDULE + HRRZ TAC,DEVEXT(DEVDAT) ;CAN THIS FILE BE RENAMED? + PUSHJ PDP,SETPTR ;READ IN FIRST SET OF RETRIEVAL POINTERS + MOVEI AC1,@UUO ;IS THE PROTECTION TO BE CHANGED ? + MOVEI TAC,PTR1(DEVDAT) ;POINT TO RETRIEVAL INFO IN DDB + MOVE AC1,2(AC1) ;USER SPECIFIED PROTECTION + XOR AC1,2(TAC) ;COMPARE WITH STORED PROTECTION + TLZ IOS,PRCHG + TLNN AC1,777000 ;ANY DIFFERENCES? + JRST DFRN2A + MOVSI DAT,400000 ;YES, CAN IT BE? + PUSHJ PDP,PROTKX + JRST DFREN8 ;NO, ERROR + TLO IOS,PRCHG ;YES +DFRN2A: MOVSI DAT,100000 ;CAN THIS BE RE-WRITTEN? + PUSHJ PDP,PROTEK + JRST DFERR3 ;BAD RETREIVAL INFO + JRST DFRN8A ;WRITE PROTECTED + TLZ IOS,PRCHG ;ARBITRARY CHANGE OK. + +DFREN2: NOSCHEDULE + PUSHJ PDP,SCANAT ;SCAN ACCESS TABLE FROM BEGINNING + JRST DFRN1B ;NO + +DFRN1A: MOVE DAT,TBITS(TAC) ;YES, BEING ALTERED? + TRNE DAT,ATBITS ;FILE BEING CREATED OR RENAMED? + JRST DFREN9 ;YES, YOU LOSE. + PUSHJ PDP,SCNAT2 ;NO, CONTINUE SCANNING + JRST DFRN1B + JRST DFRN1A ;FOUND ANOTHER + +DFRN1B: HLRZ TAC,DEVACC(DEVDAT) ;SET RENAME FLAG IN FIRST ENCOUNTERED ACCESS ENTRY + MOVEI AC1,RTBIT ;RENAME BIT + ORM AC1,TBITS(TAC) + SCHEDULE + + MOVE TAC,@UUO ;GET NEW FILENAME + CAME TAC,DEVFIL(DEVDAT) ;SAVE AS DDB? + JRST DFREN3 ;NO + ADDI UUO,1 ;YES, SAME EXTENSION? + MOVE TAC,@UUO ;NEW EXTENSION + XOR TAC,DEVEXT(DEVDAT) ;COMPARE WITH DDB? + TLNE TAC,-1 ;SAME? + SOJA UUO,DFREN3 ;NO + +;FILENAME AND EXTENSION ARE IDENTICAL. CHANGE ONLY PROTECTION + + TLZ IOS,PRCHG ;CLEAR PRTOECTION CHANGE FLAG + ADDI UUO,1 ;YES, CHANGE PROTECTION + LDB AC1,[POINT 9,@UUO,8] ;NEW PROTECTION + HRRZ TAC1,DSKBUF(DEVDAT) ;POINT TO BUFFER,CONTAINING RETRIEVAL INFO + ADDI TAC1,2 ;POINT TO PROTECTION + TLNN IOS,UBFS ;BUFFER IN MONITOR CORE? + TLO TAC1,PROG ;NO, RELOCATION. + DPB AC1,[POINT 9,@TAC1,8] ;STORE NEW PROTECTION IN RIB + + PUSHJ PDP,WRI ;RE-WRITE THE BLOCK + +DFREXT: AOS -1(PDP) ;LEAVE + POP PDP,TAC + PUSHJ PDP,CLRBUF ;CLEAR NAY DUMP BUFFER + JRST DFCL21 ;CLEAR ACCESS ENRTY AND EXIT + +DFREN3: TLZE IOS,PRCHG ;IS ONLY PROTECTION CHANGE PERMITTED? + JRST DFREN8 ;YES. ERROR SINCE TRYING TO CHANGE NAME.EXT + POP PDP,TAC ;BACK UP PDP + PUSHJ PDP,ALTMFD ;ALTERING MFD? + SKIPN @UUO ;RENAMING TO 0 (I.E. DELETING)? + JRST DFREN7 ;YES + + MOVE TAC,DEVACC(DEVDAT) ;SAVE INFO ON OLD FILE THAT WILL BE CHANGED BY SETLE + HLR TAC,SETCNT(DEVDAT) ;BLOCK# OF UFD RIB + PUSH PDP,TAC ;SAVE XWD ACCESS POINTER, BLOCK# + MOVE TA,DEVEXT(DEVDAT) ;BLOCK# OF FIRST FILE RIB + HLL TA,DEVCNT(DEVDAT) ;RELATIVE TO UFD BLOCK# + MOVE TB,DEVFIL(DEVDAT) ;HOLD FILE NAME + + MOVSI TAC,RENBIT + ORM TAC,DEVOAD(DEVDAT) ;FOR "SETLE" + PUSHJ PDP,SETLE0 ;LOOK FOR THIS NEW FILE NAME + JRST DFERR4 ;NO UFD (SHOULD NOT HAPPEN) + JRST DFREN5 ;NEW FILE NOT THERE + JFCL ;NEW NAME ALREADY THERE, ERROR + JFCL + POP PDP,TAC + SCHEDULE + PUSHJ PDP,DFCL21 + JRST DFER10 + +;ALTER RETRIEVAL INFORMATION + +DFREN5: POP PDP,DAT ;BACK UP PDP + + MOVEM TB,DEVFIL(DEVDAT) ;RESTORE OLD FILE NAME TO DDB + HRRM TA,DEVEXT(DEVDAT) ;RESTORE BLOCK# OF RIB + HLLM TA,DEVCNT(DEVDAT) ;RESTORE UFD RELATIVE BLOCK + + MOVE TAC,(PDP) ;XWD ACCESS POINTER, BLOCK# + HLLM TAC,DEVACC(DEVDAT) ;RESTORE POINTER TO ACCESS ENTRY + HRLM TAC,SETCNT(DEVDAT) ;RESTORE BLOCK# OF UFD RIB + HRRZ TAC,TA + MOVSM TAC,DEVBLK(DEVDAT) ;RESET BLOCK#, INDEX TO RETRIEVAL POINTERS + PUSHJ PDP,RRIA ;GET RETRIEVAL INFO BLOCK + PUSHJ PDP,SET000 ;POINT TAC1 TO WORD 0 + + MOVE TAC,@UUO ;GET NEW NAME + MOVEM TAC,@TAC1 ;STORE IN RIB + ADDI TAC1,1 ;CHANGE EXTENSION + ADDI UUO,1 + MOVE TAC,@TAC1 ;GET OLD EXTENSION + HLLM TAC,DEVEXT(DEVDAT) ;RESET EXTENSION IN DDB + MOVE TAC,@UUO ;NEW EXTENSION + HRR TAC,THSDAT ;AND ACCESS DATE + ORI TAC,400000 ;INSURE IT IS NON-ZERO + MOVEM TAC,@TAC1 ;STORE IN RIB + ADDI TAC1,1 ;CHANGE PROTECTION + ADDI UUO,1 + LDB TAC,[POINT 9,@UUO,8] ;GET NEW PROTECTION + DPB TAC,[POINT 9,@TAC1,8] ;STORE IN RIB + + PUSHJ PDP,WRI ;RE-WRITE RIB + +;ALTER UFD BLOCK + + PUSHJ PDP,FINDE ;BRING IN CORRECT BLOCK + + SUBI UUO,1 ;REPLACE EXTENSION IN UFD + MOVE TAC,@UUO + HLLM TAC,@TAC1 + SUBI UUO,1 ;AND NAME + SUBI TAC1,1 + MOVE TAC,@UUO + MOVEM TAC,@TAC1 + + PUSHJ PDP,WUFD ;RE-WRITE THE BLOCK + JRST DFREXT ;LEAVE + +;FILE COULD NOT BE RENAMED BECAUSE OF PROTECTION + +DFRN8A: TLNE IOS,PRCHG ;PROTECTION CHANGE? + JRST DFREN2 ;YES + +DFREN8: PUSHJ PDP,DFCL21 ;TAKE OUT ACCESS ENTRY + JRST DFERR5 ;AND LEAVE + +;FILE COULD NOT BE RENAMED BECAUSE IT WAS BEING CREATED. + +DFREN9: SCHEDULE + PUSHJ PDP,DFCL21 ;TEAKE OUT ACCESS ENTRY + JRST DFERR6 + +;DELETE A FILE FROM A UFD + +DFREN7: PUSHJ PDP,FINDE ;FIND THE CORRECT BLOCK + + NOSCHEDULE + MOVEI TAC1,@TAC1 + SUBI TAC1,1 ;DESTINATION + HRLI TAC1,2(TAC1) ;SOURCE IS ENTRY BEYOND DESTINATION + + HRRZ AC2,DSKBUF(DEVDAT) + ADDI AC2,BLKSIZ-2 ;SET LIMIT OF BLT + TLNN IOS,UBFS ;BUFFER IN MONITOR ONE? + ADDI AC2,(PROG) ;NO. RELOCATE + + BLT TAC1,(AC2) ;MOVE SOME WORDS UP (ONE TOO MANY BECAUSE + ; COULD BE DELETING 64TH ENTRY IN UFD BLOCK) + + SETZM @AC2 ;MAKE SURE OF ZERO + SETZM 1(AC2) + SCHEDULE + + PUSHJ PDP,WUFD ;RE-WRITE + AOS (PDP) ;SKIP RETURN + HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY + MOVEI TAC1,DTBIT + IORM TAC1,TBITS(TAC) ;SET TO DELETE WHEN THROUGH READIN + JRST DFCL21 ;CLOSE ACCESS ENTRY AND LEAVE + +;SET UP ARGUMENT LIST FOR LOOKUP, ENTER, AND RENAME +;SEARCH THRU MFD AND UFD FOR THE FILE-NAME, +;EXIT TO CALL+1 IF A UFD CANNOT BE FOUND. +;EXIT TO CALL+2 IF THE FILE IS NOT FOUND. +;EXIT TO CALL+3 IF FILE IS BEING WRITTEN +;EXIT TO CALL+4 IF FILE IS BEING READ +;EXIT TO CALL+5 IF THE FILE DOES NOT HAVE ACCESS ENTRY. + +;UPON EXIT, (PDP) = OWNER PROJ,-PROG. NUMBER + +EXTERNAL SYSPP,JOB,PRJPRG,CPOPJ2,CPOPJ1 + +SETLE: MOVSI TAC,RENBIT ;TURN OFF THE FLAG + ANDCAM TAC,DEVOAD(DEVDAT) + +SETLE0: MOVEM IOS,DEVIOS(DEVDAT) + TLO UUO,PROG + MOVE AC1,@UUO ;PICK UP FILE NAME + MOVEM AC1,DEVFIL(DEVDAT) ;STORE FILE NAME AND EXT IN DDB + + ADDI UUO,1 + HLLZ AC1,@UUO + MOVEM AC1,DEVEXT(DEVDAT) + ADDI UUO,2 ;UUO POINTS TO PP +SETLE9: MOVE ITEM,JOB ;TRY CURRENT JOB PP. + SKIPG DAT,@UUO ;IS IT A PP? + MOVE DAT,PRJPRG(ITEM) ;NO. GET PP FROM TABLE. + TLNE DEVDAT,SYSDEV ;SYSTEM DEVICE? + MOVE DAT,SYSPP ;YES, USE SYSTEM (CUSP) PROJ,PROG # + MOVEM DAT,@UUO + MOVEM DAT,DEVPPN(DEVDAT) ;SAVE PRJ,PRG FOR USE BY UUOCON + SUBI UUO,3 ;UUO POINTS TO FILE NAME + EXCH DAT,(PDP) ;PUT PP-NUMBER IN PD LIST + PUSH PDP,DAT ;PDP POINTS TO CALL+1 + +;SEARCH MFD FOR THE OWNER OF THE FILE + + MOVE DAT,-1(PDP) ;XWD PROJ,PROG + MOVSI AC1,(SIXBIT /UFD/) ;EXTENSION "UFD" + MOVE TAC,MFDBLK ;BLOCK# OF MFD RIB + PUSHJ PDP,DIRSRC + POPJ PDP, ;UFD NOT THERE + +;SEARCH UFD FOR THE FILE + + AOS (PDP) ;PDP POITNS TO CALL+2 + ADDI TAC,1 ;POINT TO XWD SIXBIT/EXT/,BLOCK# + HRRZ TAC,@TAC ;BLOCK# OF UFD RIB + HRLM TAC,SETCNT(DEVDAT) ;SAVE BLOCK# + SETZM DEVCNT(DEVDAT) ;LH WILL BE USED TO COUNT UFD BLOCKS + MOVE AC1,DEVEXT(DEVDAT) + PUSHJ PDP,DSRC10 ;SEARCH UFD + POPJ PDP, ;FILE NOT THERE + + ADDI TAC,1 ;POINT TO XWD SIXBIT/EXT/,BLOCK# + MOVE AC3,@TAC + HRRM AC3,DEVEXT(DEVDAT) ;SAVE BLOCK# OF FIRST RIB + AOS (PDP) ;PDP POINTS TO CALL+3 + MOVE AC2,-1(PDP) ;XWD PROJ,PROG + NOSCHEDULE + PUSHJ PDP,SCNAT0 ;LOOK IN ACCESS TABLE + JRST CPOPJ2 ;NOT THERE. RETURN TO CALL+5 + MOVE DAT,TBITS(TAC) ;RENAMING? + TRNE DAT,WTBIT ;BEING WRITTEN? + POPJ PDP, ;YES. RETURN TO CALL+3 + TRNN DAT,RTBIT + JRST CPOPJ1 ;NO, ALL OK, RETURN TO CALL+4 + MOVE TAC,DEVOAD(DEVDAT) ;ARE WE RENAMING? + TLNE TAC,RENBIT + POP PDP,TAC ;YES + POP PDP,TAC + JRST DFERR6 + +;CHECK RETRIEVAL INFO FOR ELIGIBILITY +;ENTER WITH C(DAT) = PROTECTION TO CHECK IN BITS 0-2 +;EXIT TO CALL+1 IF NAME OR EXTENSION WRONG +;EXIT TO CALL+2 IF PROTECTION WRONG +;EXIT TO CALL+3 IF ALL OK + +EXTERNAL JOB,PRJPRG,CPOPJ1,DUMPPP + +PROTEK: MOVEI TAC,PTR1(DEVDAT) ;POINT TO RETRIEVAL INFO + MOVE AC1,@TAC ;NAME OK? + CAME AC1,DEVFIL(DEVDAT) + POPJ PDP, ;NO + HLLZ AC2,DEVEXT(DEVDAT) + HLLZ AC1,1(TAC) ;EXTENSION FROM RIB + CAM AC1,AC2 + POPJ PDP, ;EXTENSION NOT RIGHT + + AOS (PDP) +PROTKX: MOVE AC1,-1(PDP) + +PROTKY: MOVE ITEM,JOB + XOR AC1,PRJPRG(ITEM) + TRNN AC1,-1 ;SAVEM PROGRAMMER? + JRST PROT1 ;YES + + ROT DAT,-3 ;ROTATE TO PROJECT FIELD + TLNE AC1,-1 ;NO, SAME PROJECT? + ROT DAT,-3 ;NO, ROTATE TO UNIVERAL FIELD + +PROT1: TLZ DAT,60000 ;DO NOT TEST OWNER READ OR PROTECT PROTECTION + TDNN DAT,2(TAC) + JRST CPOPJ1 ;PROTECTION O.K. + MOVE AC1,PRJPRG(ITEM) + CAMN AC1,DUMPPP ;EQUAL TO DUMPPER PROJECT + ;PROGRAMMER NUMBER? + AOS(PDP) ;YES, ALL FILES AVAILABLE + POPJ PDP, + +;CLOSE UUO +;CLOSE AN OUTPUT FILE + +EXTERNAL PIOMOD,WAIT1,OUT + +DFCLSO: TLNN DEVDAT,ENTRB ;ENTER DONE YET? + POPJ PDP, ;NO, FORGET IT + HLRZ TAC,DEVACC(DEVDAT) ;SHOULD WE CLOSE? (POINT TO ACCESS ENTRY) + IFN FTRCHK,< + SKIPN TAC ;ACCESS TABLE POINTER EXISTS? + HALT . ;IF NOT, HALT, NO RE-START POSSIBLE. +> + MOVE TAC,TBITS(TAC) + IFN FTRCHK, < + TRNN TAC,ATCLO+RWTBIT ;CREATION OR UPDATE OF FILE IN PROGRESS? + HALT . ;NO, ERROR. CAN'T CONTINUE +> + LDB TAC,PIOMOD + CAIGE TAC,DR ;DUMP MODE? + TLNE DEVDAT,DSKRLB ;RESET UUO IN PROGRESS? + JRST DFCL2 ;YES TO EITHER QUESTION + HLRZ TAC,DEVBUF(DEVDAT) ;NO. GET ADDRESS OF OUTPUT + ; BUFFER HEADER BLOCK. + TLO TAC,PROG ;RELOCATE + SKIPG TAC1,@TAC ;VIRGIN BUFFERS (NO RING SET-UP) ? + JRST DFCL2 ;YES, DON'T OUTPUT + AOS TAC ;TAC POINTS TO OUTPUT BYTE POINTER + ADD TAC1,[XWD PROG,1] ;TAC1 POINTS TO WORD COUNT PRECEDING + ; USER DATA BUFFER + HRRZ AC1,@TAC ;PICK UP OUTPUT BYTE POINTER + SKIPE AC1 ;DON'T CALCULATE WORD COUNT IF BYTE POINTER + ; NOT SET UP + SUBI AC1,(TAC1) ;CALCULATE NUMBER OF WORDS USER HAS FILLED + TRNE IOS,IOWC ;USER KEEPING HIS OWN WORD COUNT ? + HRRZ AC1,@TAC1 ;YES, SUBSTITUTE HIS COUNT FOR + ; COMPUTED WORD COUNT + SKIPN AC1 ;WORD COUNT EQUAL TO 0? + JRST DFCL2 ;YES, DON'T OUTPUT 0-WORD FINAL BLOCK. + PUSHJ PDP,OUT ;NO, GO WRITE LAST PARTIAL BUFFER + PUSHJ PDP,WAIT1 ;WAIT FOR IT TO FINISH + +DFCL2: PUSHJ PDP,SETBUF ;CHOOSE A BUFFER AREA FOR RETRIEVAL POINTERS + TLO IOS,NMP!NCTRLC ;SET NMP, MUST NOT INTERRUPT POINTER WRITING + MOVEM IOS,DEVIOS(DEVDAT) ;DO DFO4A WON'T READ NEW POINTERS IN + PUSHJ PDP,DFO4A ;WRITE OUT LAST BLOCK OF POINTERS + HLRZ AC1,DEVBLK(DEVDAT) + XOR AC1,DEVEXT(DEVDAT) + TRNE AC1,-1 ;ONLY ONE BLOCK OF POINTERS? + PUSHJ PDP,RRIB ;NO. READ FIRST BLOCK INTO BUFFER + PUSHJ PDP,SET000 + ADDI TAC1,3 ;SET TAC1 TO POINT TO 4TH WORD OF BUFFER + MOVN AC1,DEVCNT(DEVDAT) ;PICK UP AND NEGATE SIZE OF FILE + HRLM AC1,@TAC1 ;NEGATIVE WORD COUNT INTO FOURTH WORD OF FIRST RIB + PUSHJ PDP,WRIB ;WRITE OUT FIRST BLOCK OF RETRIEVAL INFORMATION + +;CLOSE UUO CONTINUED. +;THE FILE AND ALL ITS POINTERS HAVE BEEN PUT ON DISK. +;NOW PUT ENTRY IN DIRECTORY. + TLZ DEVDAT,ENTRB + HLRZ TAC,DEVACC(DEVDAT) ;PICK UP ACCESS TABLE POINTER + MOVE DAT,TBITS(TAC) ;GET STATUS BITS AND READ COUNT + TRZE DAT,RWTBIT ;CLOSING AND UPDATED FILE? + JRST DFCLU1 ;YES + TLNE DEVDAT,DSKRLB ;RESET UUO IN PROGRESS? + JRST DFC16A ;YES + TRNN DAT,ATIND ;IUS NAME ALREADY IN DIRECTORY? + JRST DFCL20 ;NO. INSERT IT + MOVEM IOS,DEVIOS(DEVDAT) + PUSHJ PDP,FINDE ;BRING IN BLOCK WITH THIS ENTRY. + MOVE TAC,DEVEXT(DEVDAT) ;CHANGE BLOCK POINTER + EXCH TAC,@TAC1 ;TAC1 POINTS TO ENTRY IN UFD BLOCK + MOVEM TAC,DEVEXT(DEVDAT);SAVE POINTER TO RIB OF OLD VERSION FOR RECLAM + PUSHJ PDP,WUFD ;WRITE THE BLOCK BACK OUT + HLRZ TAC,DEVACC(DEVDAT) ;ACCESS TABLE POINTER + NOSCHEDULE + PUSH PDP,ATPP(TAC) ;SAVE XWD PROJ,PROG + PUSHJ PDP,CLRAT ;REMOVE THE ACCESS ENTRY + POP PDP,AC2 ;XWD PROJ,PROG + PUSHJ PDP,SCNAT0 ;SCAN FOR ANY OTHERS READING OLD VERSION + JRST DFCL17 ;NONE + +DFCL16: MOVEI AC1,DTBIT ;DELETE WHEN THRU READING SINCE IT WAS JUST UPDATED + IORM AC1,TBITS(TAC) + PUSHJ PDP,SCNAT2 ;LOOK FOR MORE + JRST CLRBUF ;NO MORE + JRST DFCL16 +DFC16A: PUSHJ PDP,CLRAT ;UPON RESET UUO WITH PARTIALLY WRITTEN FILE. + ; CLEAR ACCESS TABLE ENTRY RECLAIM DISK SPACE. + +DFCL17: SCHEDULE + HRRZ TAC,DEVEXT(DEVDAT) ;RIB# OF FILE + JRST RECLAM + +DFCL20: PUSHJ PDP,INSDIR ;INSERT THE NAME + HLRZ TAC,DEVACC(DEVDAT) ;ACCESS TABLE POINTER + NOSCHEDULE + PUSHJ PDP,CLRAT ;REMOVE THE ACCESS ENTRY + JRST CLRBUF ;CLEAR ANY BUFFER IN FREE STORAGE +DFCLU1: MOVEM DAT,TBITS(TAC) ;STORE STATUS BITS (WITH UPDATE MARKER CLEARED) + TLN DEVDAT,LOOKB ;WAS IUNPUT SIDE OF FILE ALSO CLOSED? + POPJ PDP, ;NO, LET THE USER KEEP READING IT + TRNE DAT, RCOUNT ;YES, ANYBODY ELSE STILL READING IT? + JRST DFCLU2 ;YES + TRNE DAT,DTBIT ;NO, WAS IT MARKED FOR DELETION? + JRST DFC16A ;YES, GO DELETE IT AND RECLAIM DISK SPACE + PUSHJ PDP,CLRAT ;NO, CLEAR ACCESS TABLE ENTRY +DFCLU2: HRRZS DEVACC(DEVDAT) ;CLEAR POINTER TO ACCESS TABLE + JRST CLRBUF ;CLEAR ANY BUFFER AREA AND EXIT., + + + ;CLOSE UUO CONTINUED. +;CLOSE AN INPUT FILE. + +DFCLSI: TLZN DEVDAT,LOOKB + POPJ PDP, +DFCL21: HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY + JUMPE TAC,CPOPJ ;EXIT IF ACCESS TABLE ALREADY CLOSED + ; (PROBABLY ^C DURING EARLIER ATTEMPT) + MOVE TAC1,TBITS(TAC) ;GET STATUS BITS + IFN FTRCHK,< + TRNE TAC1,ATCLO ;IS THIS FILE SIMPLY BEING CREATED (NOT UPDATED)? + HALT CPOPJ ;IF SO, SOMEBODY IS VERY CONFUSED. +> + NOSCHEDULE + SOS TAC1,TBITS(TAC) ;DECREMENT RCOUNT + TRNE TAC1,RCOUNT+RWTBIT ;ANY MORE READS? OR OUTPUT CLOSE TO DO? + JRST DFCL23 ;YES, LEAVE + + TRNE TAC1,DTBIT ;TO BE DELETED? + JRST DFC16A ;YES + PUSHJ PDP,CLRAT ;CLEAR THE ENTRY AND EXIT +DFCL23: SCHEDULE + TLZN DEVDAT,INPB ;ANY INPUT UUO' + JRST CLRBUF ;NO, JUST EXIT, RETURNING MON BUF + PUSHJ PDP,SETBUF ;YES, UPDATE ACCESS DATE AS FOLLOWS: + PUSHJ PDP,RRIB ;READ IN JUST BLOCK OF RETRIEVAL INFORMATION. + SUBI TAC1,BLKSIZ-2 ;SET TAC1 TO 2ND WORD OF BLOCK + LDB AC1,[POINT 17,@TAC1,35] ;GET PREVIOUS ACCESS DATA. + CAMN AC1,THSDAT ;ALREADY ACCESSED EARLIER TODAY? + JRST CLRBUF ;YES, JUST CLEAR BUFFER AND EXIT. + MOVE AC1,THSDAT ;NO, STORE TODAY(S DATE AS NEW ACCESS DATE. + DPB AC1,[POINT 17,@TAC1,35] ; + PUSHJ PDP,WRIB ;REWRITE FIRST BLOCK OF RETRIEVAL INFORMATION. + JRST CLRBUF ;CLEAR BUFFER AND EXIT. + +SUBTTL DIRECTORY SEARCHING +;SEARCH DIRECTORY FOR A PARTICULAR ENTRY. +;ENTRY BY: MOVE DAT,NAME +; HLLZ AC1,EXTENSION +; HRRZ TAC,BLOCK NUMBER FOR POINTERS +; PUSHJ PDP,DIRSRC +; EXIT1 NAME NOT FOUND +; EXIT2 NAME FOUND, TAC POINTS TO ENTRY + +DIRSRC: PUSH PDP,AC1 + PUSH PDP,DAT ;0(PDP) IS FILENAME,-1(PDP) IS EXTENSION + PUSHJ PDP,SETPTR ;READ UFD RETRIEVAL POINTERS +DRSRC0: HRRZ TAC,DEVACC(DEVDAT) + CAILE TAC,PTRN(DEVDAT) ;MORE POINTERS IN CORE? + JRST DRSRC7 ;NO, GET MORE. + HRRZ TAC,(TAC) + JUMPE TAC,DRSRC6 ;0 SIGNALS END OF POINTERS + AOS DEVACC(DEVDAT) ;NEXT POINTER + + AOS DEVCNT(DEVDAT) ;COUNT UFD BLOCKS SEARCHED + PUSHJ PDP,MQIN ;READ IN DATA BLOCK + JRST RERA ;ERROR, YOU LOSE. + + MOVE TAC1,DSKBUF(DEVDAT) ;XWD-L,POINTER + HRRZ TAC,TAC1 + TLNN IOS,UBFS ;DUMP MODE? + HRLI TAC,PROG ;NO. RELOCATE. + HLLZ AC1,-1(PDP) ;SIXBIT/EXT/ +DRSR3A: SKIPN AC3,@TAC ;BLOCK ENTIRELY SEARCHED? + JRST DRSRC0 ;YES + ADDI TAC,1 + CAMN AC3,(PDP) ;NAMES MATCH? + JRST DRSRC8 ;YES + +DRSRC4: ADDI TAC,1 + HRRZ AC3,TAC + CAIE AC3,BLKSIZ(TAC1) ;IS BLOCK ENTIRELY SEARCHED? + JRST DRSR3A ;NO + JRST DRSRC0 + +DRSRC7: TLNE IOS,NMP ;ANY MORE POINTERS ON DISK? + JRST DRSRC6 ;NO + PUSHJ PDP,GETPTR ;YES, GET SOME + JRST DRSRC0 + +DRSRC8: HLLZ AC3,@TAC ;DOES EXTENSION MATCH + CAME AC3,AC1 + JRST DRSRC4 ;NO + SUBI TAC,1 ;POINT TO FIRST WORD OF ENTRY + + AOS -2(PDP) ;YES, ENTRY IS FOUND + MOVSS DEVCNT(DEVDAT) ;SAVE COUNT OF UFD BLOCKS FOR USE AT CLOSE +;EXIT + +DRSRC6: POP PDP,DAT + POP PDP,AC1 + POPJ PDP, ;"FILE" NOT FOUND +;CHECK PROTECTION ON UFD + +DSRC10: PUSH PDP,AC1 ;PUSH EXTENSION + PUSHJ PDP,SETPTR + MOVSI DAT,200000 ;SET UP TO TEST READ BIT + TLNE IOS,10 ;IS IT LOOKUP> + ROT DAT,-1 ;NO,TEST WRITE PROTECTION + MOVEI TAC,PTR1(DEVDAT) + HRRZ AC1,-3(PDP) ;XWD PROJ,PROG + TLZ IOS,PRCHG + PUSHJ PDP,PROTKY + TLO IOS,PRCHG ;FLAG PROTECTION CHANGE + PUSH PDP,DEVFIL(DEVDAT) ;PUSH FILENAME TO MAKE PDL LOOK LIKE DIRSRC + JRST DRSRC0 + + +;FIND A UFD ENTRY, IT MUST BE THERE. + +EXTERNAL AUREQ,AUWAIT + +FINDE: AOSE AUREQ + PUSHJ PDP,AUWAIT + TLO IOS,AUFLG + HLRZ TAC,SETCNT(DEVDAT) ;SET TAC TO UFD POINTERS + HLRZ DAT,DEVCNT(DEVDAT) ;SET DAT TO COUNT COMPUTED BY DIRSRC + ADDI DAT,DIRSIZ + +FINDE1: MOVSM TAC,DEVBLK(DEVDAT);READ A POINTER BLOCK + PUSHJ PDP,RRIA + CAILE DAT,BLKSIZ-2 ;POINTER IN THIS BLOCK? + JRST FINDE2 ;NO, GET NEXT ONE + SUBI DAT,1 ;YES, BRING THEM IN + HRRM DAT,DEVBLK(DEVDAT) ;SET INDEX INTO RIB + PUSHJ PDP,DFIN4 ;COPY POINTERS INTO DDB + HRRZ TAC,PTR1(DEVDAT) ;GET RETRIEVAL POINTER FOR UFD BLOCK + + PUSHJ PDP,MQIN ;READ THE UFD BLOCK + JRST RERA ;ERROR + PUSHJ PDP,SET000 ;FIND THE ENTRY + HLLZ AC1,DEVEXT(DEVDAT) ;GET EXTENSION FROM DDB + +SRCU1: MOVE TAC,@TAC1 ;GET FILE NAME FROM UFD + ADDI TAC1,1 + CAME TAC,DEVFIL(DEVDAT) ;SAME? + AOJA TAC1,SRCU1 ;NAMES DO NOT MATCH + HLLZ TAC,@TAC1 ;GET EXTENSION FROM UFD + CAME TAC,AC1 ;SAME? + AOJA TAC1,SRCU1 ;EXTENSIONS DO NOT MATCH + POPJ PDP, ;FOUND IT + +FINDE2: PUSHJ PDP,SET176 ;GET THE NEXT POINTER BLOCK + HLRZ TAC,@TAC1 + SUBI DAT,BLKSIZ-2 ;BACK UP DAT + JRST FINDE1 + +;INSERT AN ENTRY IN A DIRECTORY. + +EXTERNAL AUREQ,AUWAIT,AUAVAL + +INSDIR: AOSE AUREQ + PUSHJ PDP,AUWAIT + TLO IOS,AUFLG + SETZM DEVCNT(DEVDAT) ;CLEAR BEFORE COUNTING BLOCK OF UFD + HLRZ TAC,SETCNT(DEVDAT) ;BLOCK# OF UFD RIB + PUSHJ PDP,SETPTR ;SET UP FIRST POINTERS,. + SOS DEVACC(DEVDAT) ;SYNC + +INSD1: AOS TAC,DEVACC(DEVDAT) ;GET NEXT POINTER, + HRRZS TAC + AOS DEVCNT(DEVDAT) ;COUNT EACH UFD BLOCK + CAILE TAC,PTRN(DEVDAT) ;ANY MORE IN CORE? + JRST INSD10 ;NO, GET SOME MORE + +INSD2: HRRZ TAC,(TAC) ;GET RETRIEVAL POINTER + JUMPE TAC,INSD5 ;0 SIGNALS END OF POINTERS + PUSHJ PDP,MQIN ;READ UFD BLOCK + JRST RERA ;ERROR. + + PUSHJ PDP,SET176 ;SET TAC1 TO WORD 127 + SKIPE @TAC1 ;IS IT ZERO? + JRST INSD1 ;NO, BLOCK FULL. + + MOVSS DEVCNT(DEVDAT) ;SAVE RELATIVE# OF BLOCK CONTAINING NEW ENTRY + PUSHJ PDP,INSD3 ;INSERT ENTRY. + + JRST WUFD ;WRITE BLOCK AND LEAVE + +;INSERT THE ENTRY. + +INSD3: HRRZ AC1,DSKBUF(DEVDAT) +INSD3B: CAIN AC1,(TAC1) ;BEGINNING OF BLOCK? + JRST INSD3A ;YES + SUBI TAC1,2 + SKIPN @TAC1 ;SEARCH UFD BLOCK BACKWARDS + ; FOR LAST NON-ZERO FILENAME. + + JRST INSD3B + + ADDI TAC1,2 ;MOVE IN NAME. +INSD3A: MOVE TAC,DEVFIL(DEVDAT) + MOVEM TAC,@TAC1 + ADDI TAC1,1 ;MOVE IN EXTENSION & POINTER. + MOVE TAC,DEVEXT(DEVDAT) + IFN FTRCHK,< + TRNN TAC,-1 ;POINTER TO BLOCK 0 + + HALT .+1 ;FOR RETRIEVAL INFO + ; CONTINUE-GET BAD INFO MESSAGE +> + MOVEM TAC,@TAC1 + POPJ PDP, + +;CREATE NEW UFD BLOCK AND ADD ENTRY. THEN FIND THE LAST OR ONLY +;POINTER BLOCK, ADD POINTER IF POSSIBLE. IF NOT POSSIBLE. +;CREATE NEW POINTER BLOCK AND PUT THE POINTER IN IT. + +INSD5: PUSHJ PDP,SET000 ;@TAC1 POINTS TO WORD 0 OF BUFFER + NOSCHEDULE + MOVEI TAC,@TAC1 ;POINT TO WORD 0 OF BUFFER + SETZM 2(TAC) ;CLEAR FOR BLT + MOVSI DAT,2(TAC) ;SOURCE + HRRI DAT,3(TAC) ;DESTINATION + BLT DAT,BLKSIZ-1(TAC) ;CLEAR WORDS 2.-127. + SCHEDULE + + PUSHJ PDP,INSD3A ;INSERT ENTRY IN WORDS 0,1 + MOVSS DEVCNT(DEVDAT) ;SAVE RELATIVE BLOCK# OF THIS UFD BLOCK + PUSHJ PDP,DFGETF ;GET A FREE BLOCK + MOVEM TAC,SETCNT(DEVDAT) ;SAVE IT + + IFG CHKCNT,< + MOVE TAC,DSKBUF(DEVDAT) + PUSHJ PDP,CHKSUM + HRLM TAC1,SETCNT(DEVDAT) + MOVE TAC,SETCNT(DEVDAT) + > + +INSD5A: PUSHJ PDP,MQOUT ;WRITE THE UFD BLOCK OUT + JRST INSD11 ;ERROR + + PUSHJ PDP,RRI ;READ POINTER BACK IN. +INSD6: PUSHJ PDP,SET176 + HLRZ TAC,@TAC1 ;LAST OR ONLY BLOCK? + JUMPE TAC,INSD7 + + PUSHJ PDP,RRIA ;NO, READ NEXT ONE. + JRST INSD6 + +INSD7: SUBI TAC1,1 ;YES, ROOM FOR ANOTHER POINTER? + SKIPN @TAC1 + SOJA TAC1,INSD8 + + PUSHJ PDP,NEWRIB ;CREATE NEW POINTER BLOCK. + PUSHJ PDP,SET000 ;SET TAC1 TO FIRST WORD +INSD7A: MOVE TAC,SETCNT(DEVDAT) ;GET POINT SAVED ABOVE + MOVEM TAC,@TAC1 ;STORE POINTER TO NEW UFD BLOCK + PUSHJ PDP,WRI ;WRITE BLOCK + SOSL AUREQ ;RELEASE UFD RESOURCE + SETOM AUAVAL + TLZ IOS,AUFLG + MOVEM IOS,DEVIOS(DEVDAT) + POPJ PDP, + +;ROOM FOR ANOTHER POINTER IN THIS BLOCK. FIND LAST POINTER. +;INSERT NEW ONE, AND WRITE BLOCK OUT. + +INSD8: SKIPN @TAC1 + SOJA TAC1,INSD8 ;SCAN BACKWARDS FOR LAST POINTER + AOJA TAC1,INSD7A ;FOUND IT. ADD NEW ONE. + +;GET MORE POINTERS INTO CORE. + +INSD10: TLNE IOS,NMP ;ANY MORE ON DISC? + JRST INSD5 ;NO + PUSHJ PDP,GETPTR + MOVE TAC,DEVACC(DEVDAT) + JRST INSD2 + +;WRITE ERROR. IF WRITE-LOCK. FIX IT. + +INSD11: TRNN IOS,IOIMPM + JRST WERA ;IT WAS NOT, YOU LOSE. + + PUSHJ PDP,WLERA ;GET ANOTHER BLOCK + HRRM TAC,SETCNT(DEVDAT) + JRST INSD5A + + +;OUTPUT A UFD BLOCK, PERFORM CHECKSUM IF NEEDED, WRITE THE BLOCK OUT. +;IF WRITE-LOCK ERROR, TRY ANOTHER BLOCK. FINALLY, IF POINTERS WERE +;ALTERED, WRITE THEM OUT. + +EXTERNAL AUREQ,AUAVAL + +WUFD: IFG CHKCNT,< + MOVE TAC,DSKBUF(DEVDAT) ;POINTER TO BUFFER + PUSHJ PDP,CHKSUM ;RETURN CHECKSUM IN TAC1 + > + MOVE TAC,DEVACC(DEVDAT) ;GET POINTER LOCATION + IFG CHKCNT,< + HRLM TAC1,(TAC) ;STORE CHECKSUM IN RETRIEVAL POINTER + MOVSI TAC1,PNTDIF + ORM TAC1,DEVOAD(DEVDAT) ;NOTE THAT POINTERS IUN DDB NOT=DISK + > + IFLE CHKCNT,< + MOVE TAC1,DEVOAD(DEVDAT) + TLO TAC1,PRTOUT + TLZ TAC1,PNTDIF + MOVEM TAC1,DEVOAD(DEVDAT) + > + HRRZ TAC,(TAC) ;GET BLOCK# FROM RETRIEVAL POINTER + +WUFD1: PUSHJ PDP,MQOUT ;WRITE UFD BLOCK + JRST WUFD3 ;WRITE ERROR + MOVE TAC,DEVOAD(DEVDAT) + TLO IOS,NMP ;SET NMP + MOVEM IOS,DEVIOS(DEVDAT) ;SO DFO4A WON'T READ POINTERS + TLN TAC,PNTDIF ;WERE POINTERS CHANGED? + PUSHJ PDP,DFO4A ;YES, WRITE THEM OUT. + SOSL AUREQ ;RELEASE UFD RESOURCE + SETOM AUAVAL + TLZ IOS,AUFLG ;NOTE THAT UFD RELEASED + MOVEM IOS,DEVIOS(DEVDAT) + POPJ PDP, + +WUFD3: MOVE TAC1,DSKCNT(DEVDAT);WAS ERROR WRITE-LOCK? + TRNN TAC1,IOIMPM + JRST WERA + TRZ IOS,IOIMPM ;YES + MOVEM IOS,DEVIOS(DEVDAT) + MOVSI TAC1,PNTDIF + ORM TAC1,DEVOAD(DEVDAT) + PUSHJ PDP,WLERA ;FREE CURRENT ASSIGNED BLOCK AND GET A NEW ONE + MOVE TAC1,DEVACC(DEVDAT) + HRRM TAC,(TAC1) + JRST WUFD1 + +SUBTTL ACCESS TABLE PROCESSING +;SCAN ACCESS TABLE. +;EXIT TO CALL+1 WITH TAC SET TO THE LAST ENTRY IF NOT THERE. +;EXIT TO CALL+2 WITH TAC SET TO CORRECT ENTRY IF THERE. + +EXTERNAL CPOPJ1,CPOPJ + +SCANAT: MOVE AC2,-1(PDP) +SCNAT0: SKIPN TAC,FAT ;ANY AT ALL? +SCNHLT: POPJ PDP, ;NO, LEAVE (HALT PC HERE IF ATTEMPT + ; TO CLEAR NON-EXISTANT ACCESS TABLE) + +SCNAT1: CAME AC2,ATPP(TAC) ;PROJ,-PROG. THE SAME? + JRST SCNAT2 ;NO + + MOVE DAT,DEVFIL(DEVDAT) ;NAMES THE SAME? + CAME DAT,ATNAME(TAC) + JRST SCNAT2 + + HLLZ DAT,ATEXT(TAC) ;EXTENSION THE SAME? + HLLZ AC3,DEVEXT(DEVDAT) + CAMN DAT,AC3 + JRST CPOPJ1 ;YES + +;CONTINUE SCAN FROM CURRENT ENTRY + +SCNAT2: HRRZ DAT,ATLINK(TAC) ;ANY MORE ENTRIES? + JUMPE DAT,CPOPJ ;NO + MOVE TAC,DAT ;YES, GO TO THE NEXT ONE + JRST SCNAT1 + +;CLEAR AN ACCESS ENTRY. +;IT IS ASSUMED THAT NO SCHEDULING WILL TAKE PLACE. +;ENTER WITH TAC POINTING TO THE ENTRY TO WIPE OUT. + +CLRAT: IFN FTRCHK,< + SKIPN TAC ;ATTEMPT TO CLEAR NON EXISTENT ACCESS TABLE IS AN ERROR + + HALT SCNHLT ;CONTINUE WILL POPJ AND EXIT. +> + HRRZS DEVACC(DEVDAT) ;CLEAR ACCESS TABLE POINTER IN DEVICE DATA BLOCK + MOVEI AC2,FAT ;START AT BEGINNING OF LINKED ACCESS TABLE ENTRIES + SUBI AC2,ATLINK + +CLRAT1: MOVE AC1,AC2 ;PICKUP THE NEXT ACCESS TABLE + HRRZ AC2,ATLINK(AC1) + IFN FTRCHK,< + SKIPN AC2 ;ZERO LINK INDICATES END OF TABLE WITHOUT + ;FINDING ENTRY TO BE CLEARED + HALT SETHLT ;CONTINUING AFTER THIS ERROR WILL CONTINUE + ; NORMALLY (IE POPJ) +> + CAME AC2,TAC ;DOES THIS ENTRY LINK TO THE ONE TO BE CLOBBERED? + JRST CLRAT1 ;NO,CONTINUE SERACH + + MOVE AC2,ATLINK(TAC) ;YES, FOUND IT + HRRM AC2,ATLINK(AC1) ;LINK AROUND IT + JRST CLRCOR ;CLEAR THE CORE + +;FIND A HOLD FOR ACCESS TABLE ENTRY AND SET A LINK. +;BUILD UP THE ENTRY +;UPON ENTRY, DAT SHOULD CONTAIN TEST BITS TO SET + + +SETAT: PUSHJ PDP,GETFCR ;TAC1 POINTS TO 4 WORD BLOCK + HLL DAT,DEVEXT(DEVDAT) + MOVEM DAT,ATEXT(TAC1) ;STORE EXTENSION + MOVE DAT,DEVFIL(DEVDAT) + MOVEM DAT,ATNAME(TAC1) ;STORE FILE NAME + MOVE DAT,-1(PDP) ;XWD PROJ,PROG + MOVEM DAT,ATPP(TAC1) ;STORE XWD PROJ,PROG + HLL DAT,SETCNT(DEVDAT) ;LOGICAL BLOCK# OF UFD RIB + HRR DAT,FAT ;POINTER TO NEXT ENTRY + MOVEM DAT,ATLINK(TAC1) ;STORE LINKE + HRRZM TAC1,FAT ;POINT FAT TO THIS NEW ENTRY +SETHLT: POPJ PDP, ;HALT PC HERE IF END OF TABLE WITHOUT FINDING + ; ENTRY TO BE CLEARED + +SUBTTL DUMP INPUT/OUTPUT +;DUMP MODE OUTPUT + +EXTERNAL COMCHK,ADRERR,SAVDDL + +DFDMPO: TLNN DEVDAT,ENTRB ;ENTER YET? + JRST DFERR2 ;NO, UNDEFINED FILE + + TLO IOS,10 ;OUTPUT STATUS + MOVEM IOS,DEVIOS(DEVDAT) + PUSHJ PDP,COMCHK ;CHECK IOWDS + JRST ADRERR ;ERROR + +DFDO0: SKIPN TAC,@UUO ;PICK UP NEXT IOWD + POPJ PDP, ;IT WAS ZERO, LEAVE + TLNE TAC,-1 ;LH ZERO? + JRST DFDO0A ;NO + HRR UUO,TAC ;YES, ANOTHER TABLE + JRST DFDO0 + +DFDO0A: ADDI TAC,1 ;FORM XWD - LENGTH, FIRST-ADDRESS + PUSH PDP,TAC ;SAVE IT + +DFDO1: PUSHJ PDP,UPDA ;SET DAREQ INTERLOCK (SAT BLOCKS MAY ONLY + ; BE MANIPULATED BY ONE USER AT A TIME!) +DFDO1A: PUSHJ PDP,SATGET ;AQUIRE A NON-FULL SAT BLOCK + ; ITEM IS DESTROYED IF SATGET CALLS MQIN,MQOUT + HLRE ITEM(PDP) ;ITEM < [LH OF IOWD]/200 + MOVMS ITEM + ADDI ITEM,BLKSIZ-1 ;MAKE E.G. 129 WORDS USE 2 DISK BLOCK + ASH ITEM,-BLKP2 ;NUMBER OF BLOCK REQUIRED FOR THIS WRITE +DFDO2A: HRRZ AC1,SATPTR + MOVE AC2,SATBK2 +DFDO1B: PUSHJ PDP,GETBIT ;ASK FOR C(ITEM BITS) + JRST DFDO6 ;NOT AVAILABLE + + ADDM ITEM,@SATPTR ;INCREMENT COUNT + SETOM SATCHG ;SAT BLOCK HAS BEEN CHANGED + HLRZ DAT,@SATPTR ;COMPUTE BLOCK NUMBER LESS 1. + SCHEDULE + PUSHJ PDP,DOWNDA ;RESET DAREQ INTERLOCK. + ADDI DAT,-2(TAC1) + PUSH PDP,DAT ;AND SAVE BLOCK NUMBER LESS 1 + PUSH PDP,ITEM ;SAVE COUNT OF BLOCKS WRITTEN + MOVE TAC1,-2(PDP) ;SET UP AN IOWD (SAVED AT DFDO0A) + MOVEM TAC1,DSKBUF(DEVDAT) + MOVN TAC,ITEM + LSH TAC,BLKP2 + HLRES TAC1 + + CAML TAC,TAC1 + HRLM TAC,DSKBUF(DEVDAT) ;ONLY A PARTIAL WRITE + HLRE TAC1,DSKBUF(DEVDAT) + MOVMS TAC1 + PUSHJ PDP,UPDEVC ;UPDATE SIZE OF FILE + ADDM ITEM,SETCNT(DEVDAT) ;NON UPDATE RELATIVE BLOCK# WITHIN THE FILE + + MOVE TAC1,DSKBUF(DEVDAT) ;PICK UP ADDRESS AND WORD COUNT + TLZN TAC1,BLKSIZ-1 ;AN EVEN NUMBER OF DISK BLOCKS TO BE WRITTEN? + JRST DFDO2G ;YES, DON'T WORRY ABOUT PARTIAL BLOCK + ;HANDLING PROBLEMS + PUSH PDP,TAC1 ;NO, SAVE ADDRESS WITH COUNT OF FULL BLOCKS-1 + ; TO BE WRITTEN + PUSH PDP,DSKBUF(DEVDAT) ;SAVE,ORIGINAL ADDRESS ;EXACT WORD COUNT ALSO + PUSHJ PDP,SETBUF ;GET MONITOR BUFFER + MOVE TAC1,DSKBUF(DEVDAT) ;TAC1 GETS ADDRESS OF MONITOR BUFFER + ; (RELOCATION NOT NECESSARY) + POP PDP,TAC ;USER'S INITIAL ADDR AND WC + PUSHJ PDP,SAVDDL ;ADJUST IN CASE THIS IS A SAVE OF A + ; HIGH SEGMENT, WHICH WAS MOVED IN CORE + ; DURING I/O WAIT. + MOVE AC1,TAC + HRRZ TAC,-2(PDP) ;GET INITIAL BLOCK NUMBER-1 +DFDO2C: ADD AC1,[XWD BLKSIZ,BLKSIZ] ;SET UP ADDRESS, WORD COUNT, AND LOGICAL + AOS TAC ;BLOCK NUMBER FOR LAST (PARTIAL) BLOCK + JUMPL AC1,DFDO2C ;OF THIS DUMP MODE OUTPUT REQUEST. + SUB AC1,[XWD BLKSIZ,BLKSIZ] + HLL AC2,AC1 ;SAVE LH +DFDO2D: MOVE AC2,(AC1) ;MOVE DATA FROM END OF USER'S + MOVEM AC2,(TAC1) ;OUTPUT AREA DT MONITOR BUFFER + AOBJP TAC1,. + AOBJP AC1,DFDO2D +DFDO2E: SETZM (TAC1) ;ZERO OUT THE REMAINDER OF THE MONTOR BUFFER + AOBJN TAC1,DFDO2E + PUSHJ PDP,MQOUT ;WRITE OUT THE PARTIAL FULL MONITOR BUFFER + ; WHICH CONTAINS THE LAST BLOCK OF THE DUMP MODE + ; MODE OUTPUT REQUEST + JFCL ;IGNORE ERROR RETURN + PUSHJ PDP,CLRBUF ;RELINQUISH THE MONTOR BUFFER + POP PDP,DSKBUF(DEVDAT) ;RETRIEVE ORIGINAL ADDRESS + MOVSI TAC1,BLKSIZ ;WITH WORD COUNT THSAT HAS LOW-ORDER BITS CLEARED + ADDB TAC1,DSKBUF(DEVDAT) ;ADD IN BLOCK SIZE TO DETERMINE NUMBER + ; NUMBER OF FULL BLOCKS YET TO BE WRITTEN + JUMPG TAC1,DFDO2B ;IF NO FULL BLOCKS TO BE WRITTEN SKIP OVER + ; OUTPUT SEQUENCE +DFDO2G: MOVE TAC,DSKBUF(DEVDAT) ;ORIGINAL ADDRESS AND WORD COUNT + PUSHJ PDP,SAVDDL ;AJDUST IN CASE OF SAVE OF HIGH SEG + ; WHICH HAS MOVED DURING IO WAIT + MOVEM TAC,DSKBUF(DEVDAT) ;STORE BACK IN DDB + MOVE TAC,-1(PDP) ;WRITE THE BLOCKS + ADDI TAC,1 + PUSHJ PDP,MQOUT + JRST DFDO7 ;ERROR +DFDO2B: POP PDP,ITEM ;RESTORE COUNT + +;TOSS OUT A SERIES OF CONSECUTIVE POINTERS + + HRRZ AC2,DEVACC(DEVDAT) ;GET RETRIEVAL POINTER POINTER +DFDO3A: MOVE AC1,@AC2 ;IS POINTER ALREADY THERE? + ADDI AC2,1 + TRNE AC1,-1 + JRST DFDO9 ;YES + + CAIG AC2,PTRN(DEVDAT) ;NO, IS THERE A NEXT ONE? + SETZM @AC2 ;CLEAR NEXT POINTER + TLO IOS,NMP ;FLAG END OF POINTERS + MOVEM IOS,DEVIOS(DEVDAT) +DFDO3B: AOS DAT,(PDP) ;PUT A POINTER IN CORE + HRRZM DAT,-1(AC2) ;STORE NEW POINTER IN DDB + MOVSI DAT,PNTDIF + ORM DAT,DEVOAD(DEVDAT) ;SHOW THAT POINTERS IN DDB NOT=DISK + + IFG CHKCNT,< ;GET CHECKSUM + MOVE TAC,-1(PDP) + PUSHJ PDP,SAVDDL ;ADJUST ADR IN CASE OF HIGH SEG SAVE + PUSHJ PDP,CHKSUM + + HRLM TAC1,-1(AC2) + > + + CAILE AC2,PTRN(DEVDAT) ;MORE POINTERS? + JRST DFDO4 ;LAST POINTER IN CORE + +DFDO3C: MOVE TAC1,[XWD BLKSIZ,BLKSIZ];INCREMENT IOWD + ADDM TAC1,-1(PDP) + SOJG ITEM,DFDO3A ;ANY MORE? + POP PDP,DAT + HRRM AC2,DEVACC(DEVDAT) + SKIPGE (PDP) + JRST DFDO1 ;NOT FINISHED, GET NEXT SET + POP PDP,TAC ;BACK UP PDP + AOJA UUO,DFDO0 ;GO BAK FOR MORE + +;WRITE POINTERS ONTO DISK + +DFDO4: HRLM ITEM,(PDP) ;SAVE COUNT OF BLOCKS TO WRITE + PUSHJ PDP,SETBUF ;FIND SOME 200 WORD AREA + PUSHJ PDP,DFO4A ;WRITE THEM + PUSHJ PDP,CLRBUF ;CLEAR THE AREA + MOVEI AC2,PTR1(DEVDAT) ;RESET AC2 TO FIRST POINTER + HLRZ ITEM,(PDP) ;RESTORE COUNT OF BLOCKS TO WRITE + JRST DFDO3C + +DFDO6: LSH ITEM,-1 ;TRY FOR 1/2 EARLIER REQUEST + JUMPN ITEM,DFDO1B ;CONTINUE IF NON-ZERO + MOVEI TAC,NUMBIT ;BITS/SAT BLOCK + HRRM TAC, @SATPTR ;MARK SAT ENTRY FULL + JRST DFDO1A ;TRY ANOTHER SAT BLOCK + +;ERROR WHILE WRITING, IF WRITE-LOCK, FIX IT, + +DFDO7: HRRZ TAC,DSKCNT(DEVDAT) ;WRITE-LOCK? + TRNN TAC,IOIMPM + JRST DFDO2B ;NO, TOO BAD. + + HLRZ TAC,DSKCNT(DEVDAT) + PUSHJ PDP,SETWL ;SET WRITE-LOCK BIT IN SAT ENTRY. + +DFDO8: AOS TAC,-1(PDP) + PUSHJ PDP,SETFRE + SOSLE (PDP) + JRST DFDO8 + SUB PDP,[XWD 2,2] + JRST DFDO1 ;TRY AGAIN. + +;WE ARE WRITING IN MIDDLE OF FILE, FREE THE OLD BLOCK. + +DFDO9: HRLM ITEM,(PDP) ;SAVE BLOCK COUNT WITH BLOCK# + PUSH PDP,AC2 ;SAVE POINTER TO RETRIEVAL INFO IN DDB + HRRZ TAC,-1(AC2) ;GET OLD BLOCK# FROM DDB + PUSHJ PDP,SETFRE + POP PDP,AC2 ;RESTORE POINTER INTO RETRIEVAL INFO + HLRZ ITEM,(PDP) ;RESTORE COUNT OF BLOCKS TO WRITE THIS ITERATION + JRST DFDO3B + +;DUMP MODE INPUT. + +EXTERNAL COMCHK,ADRERR + +DFDMPI: TLNN DEVDAT,LOOKB ;LOOKUP YET? + JRST DFERR2 ;NO, UNDEFINED FILE + TLNE IOS,IOEND ;END-FILE? + JRST DFDI1C ;YES + TLZ IOS,IO ;INPUT STATUS + MOVEM IOS,DEVIOS(DEVDAT) + PUSHJ PDP,COMCHK ;CHECK IOWDS + JRST ADRERR ;ERROR +DFDI0: SKIPN TAC,@UUO ;PICK UP NEXT IOWD + POPJ PDP, ;NO MORE, LEAVE. + TLNE TAC,-1 ;LH ZERO? + JRST DFDI0A ;NO + HRR UUO,TAC ;YES, ANOTHER LIST. + JRST DFDI0 + +DFDI0A: ADDI TAC,1 ;FROM XWD -L,FIRST-ADDRESS + PUSH PDP,TAC + + HLRZ TAC1,TAC ;GET LENGTH FROM IOWD + CAIGE TAC1,NBLKSZ ;LESS THAN 1 BLOCK? + HRLI TAC,NBLKSZ ;YES, MUST WRITE AT LEAST 1 FULL BLOCK + PUSH PDP,TAC ;IOWD FOR FIRST BLOCK + + HRRZ AC2,DEVACC(DEVDAT) ;PICK UP FIRST POINTER + CAILE AC2,PTRN(DEVDAT) ;ANY LEFT IN CORE? + PUSHJ PDP,DFDI9 ;NO, GET SOME MORE + SKIPN @AC2 ;IS A POINTER THERE? + JRST DFDI1B ;NO. EXIT + PUSH PDP,@AC2 ;SAVE THE POINTER + + MOVE TAC,[XWD BLKSIZ,BLKSIZ] ;INCREMENT IOWD + ADDM TAC,-2(PDP) + AOS DEVACC(DEVDAT) ;NEXT POINTER + AOS SETCNT(DEVDAT) ;NEXT RELATIVE BLOCK + + +DFDI1: SKIPGE -2(PDP) ;MORE TO GO? + JRST DFDI2 ;YES + +DFDI1A: MOVE TAC1,-1(PDP) ;NO, PROCESS THE FIRST BLOCK + MOVEM TAC1,DSKBUF(DEVDAT) ;SAY WHERE TO READ DATA + MOVE TAC,(PDP) ;GET FIRST LOGICAL BLOCK# + PUSHJ PDP,MQIN + JFCL ;ERRORS IGNORED. + +REPEAT 0, < ;TEMPORARILY DELETE THIS CODE DUE TO SAVE-GET PROBLEM. + IFG CHKCNT,< ;COMPARE CHECKSUM + MOVE TAC,-1(PDP) + PUSHJ PDP,CHKSUM + HLRZ TAC,(PDP) + MOVEI AC1,IODTER + CAME TAC,TAC1 + ORM AC1,DEVIOS(DEVDAT) + MOVE IOS,DEVIOS(DEVDAT) + > +> + + SUB PDP,[XWD 3,3] ;REMOVE INTERMEDIATE STORAGE FROM PDL + AOJA UUO,DFDI0 ;GO BACK FOR MORE. + +DFDI1B: SUB PDP,[XWD 2,2] ;BACK UP PDP, REMOVE XWD AND IOWD +DFDI1C: MOVE IOS,[XWD IOEND,IODEND] ;NO MORE INPUT + ORB IOS,DEVIOS(DEVDAT) + POPJ PDP, + +;DUMP INPUT CONTINUED, +;FIND A SERIES OF CONSECUTIVE BLOCKS TO READ AT ONCE + +DFDI2: HRRZ AC2,DEVACC(DEVDAT) ;GET NEXT POINTER + CAILE AC2,PTRN(DEVDAT) ;ANY MORE POINTERS IN CORE? + PUSHJ PDP,DFDI9 ;NO GET SOME MORE + SKIPN @AC2 ;YES + JRST DFDI8 ;END-FILE + PUSH PDP,AC2 ;SAVE POINTER TO POINTER + HLRZ TAC,-3(PDP) ;GET LENGTH OF REMAINING INPUT + HRRZ TAC1,(AC2) ;GET BLOCK# FROM DDB + +DFDI3: ADDI TAC,BLKSIZ ;ANY MORE TO READ? + TLNE TAC,1 + JRST DFDI5 ;NO + ADDI AC2,1 + CAIG AC2,PTRN(DEVDAT) + SKIPN AC3,@AC2 ;END-FILE + JRST DFDI4 ;YES + + CAIN TAC1,-1(AC3) ;STILL CONSECUTIVE? + AOJA TAC1,DFDI3 ;YES, LOOP + +DFDI4: MOVE TAC,(PDP) ;COMPUTE COUNT + SUB TAC,AC2 ;DIFFERENCE BETWEEN POINTERS IS # OF BLOCKS + LSH TAC,BLKP2 ;COMPUTE WORDS + JRST DFDI6 +DFDI5: HLRE TAC,-3(PDP) ;GET LENGTH OF INPUT + ADDI AC2,1 +DFDI6: HRRZ TAC1,DEVACC(DEVDAT) + SUBI TAC1,(AC2) + MOVMS TAC1 + ADDM TAC1,SETCNT(DEVDAT) + HRRM AC2,DEVACC(DEVDAT) ;STORE NEW POINTER POINTER + MOVS TAC1,@TAC + HRLM TAC,(PDP) + HRR TAC1,-3(PDP) + MOVE TAC,(PDP) ;GET POINTER TO FIRST RETRIEVAL POINTER FOR THIS INPUT + MOVE TAC,(TAC) ;GET FIRST LOGICAL BLOCK# + MOVEM TAC1,DSKBUF(DEVDAT) ;STORE CONTROLLING IOWD + PUSHJ PDP,MQIN ;REQUEST THE INPUT + JFCL ;ERRORS IGNORED + +;DUMP INPUT CONTINUED. +;IF THERE IS CHECKSUMMING. CHECK IT, ELSE INCREMENT IOWD +;AND LOOP. + + POP PDP,AC2 + IFLE CHKCNT,< ;NO CHECKSUMMING + HLRS AC2 + SETCA AC2, + AOBJN AC2,.+1 + ADDM AC2,-2(PDP) + > + + IFG CHKCNT,< ;CHECK CHECKSUMS + HLRE TAC1,AC2 ;CHANGE WORD COUNT TO BLOCKS + MOVMS TAC1 + ADDI TAC1,BLKSIZ-1 + LSH TAC1,-BLKP2 + MOVNS TAC1 + HRL AC2,TAC1 +DFDI7: MOVE TAC,-2(PDP) + PUSHJ PDP,CHKSUM + HLRZ TAC,(AC2) + MOVEI AC3,IODTER + CAME TAC,TAC1 + PUSHJ PDP,CKREC2 + MOVE AC3,[XWD BLKSIZ,BLKSIZ] + ADDM AC3,-(PDP) + AOBJN AC2,DFDI7 + > + + JRST DFDI1 ;SEE IF MORE INPUT REQUIRED + +DFDI8: MOVE IOS,[XWD IOEND,IODEND] ;NO MORE INPUT + ORB IOS,DEVIOS(DEVDAT) + JRST DFDI1A + +DFDI9: TLNE IOS,NMP + JRST DFDI10 ;NO + PUSHJ PDP,SETBUF ;GET BUFFER + PUSHJ PDP,GETPTR ;READ AND COPY POINTERS INTO DDB + PUSHJ PDP,CLRBUF ;CLEAR BUFFER + HRRZ AC2,DEVACC(DEVDAT) + POPJ PDP, + +DFDI10: MOVEI AC2,PTR1(DEVDAT) ;NO MORE POINTERS ON DISK + HRRM AC2,DEVACC(DEVDAT) + SETZM @AC2 + POPJ PDP, + +SUBTTL USETO/USETI +;SETD AND SETI UUOS + +EXTERNAL WAIT1 + +DFSET: PUSHJ PDP,.+2 + POPJ PDP, + TLNE DEVDAT,ENTRB+LOOKB ;FILE OPEN? + TRNN UUO,-1 ;NON-ZERO BLOCK NUMBER ARGUMENT? + JRST DFERR2 ;NO, ERROR IN EITHER CASE + PUSHJ PDP,WAIT1 ;WAIT FOR I/O TO COMPLETE + PUSHJ PDP,SETBF6 ;SET UP A BUFFER + MOVE IOS,[XWD IOEND,IODEND] ;CLEAR EOF + ANDCAB IOS,DEVIOS(DEVDAT) + + HRRZ TAC1,DEVACC(DEVDAT) + HRRZ TAC,SETCNT(DEVDAT) ;C(UUO) RH > C(SETCNT) RH? + CAIL TAC,(UUO) ;(I.E. SHOULD WE GO FORWARD?) + JRST DFSET6 ;NO, GO BACKWARD + + SUBI TAC1,PTRN(DEVDAT) ;YES, DESIRED POINTER IN CORE? + SUB TAC,TAC1 + CAIL TAC,(UUO) + JRST DFSET3 ;YES + + HRRZ TAC1,DEVCNT(DEVDAT) + ADDI TAC1,BLKSIZ-1 + LSH TAC1,-BLKP2 + CAMGE TAC1,TAC ;ANY MORE POINTERS ON DISK? + JRST DFSETX ;NO + HRRM TAC,SETCNT(DEVDAT) + MOVE TAC,DEVOAD(DEVDAT) ;YES, ARE POINTERS IN CORE THE SAME + TLNN TAC,PNTDIF ;AS ON DISC? + JRST DFSET1 ;YES + TLO IOS,NMP ;SET "DO NOT READ NEXT POINTERS" + MOVEM IOS,DEVIOS(DEVDAT) + PUSHJ PDP,DFO4A ;NO, WRITE THEM OUT + TLZA IOS,NMP ;NO NEED TO READ + +DFSET1: PUSHJ PDP,RRI ;READ THEM IN + MOVEM IOS,DEVIOS(DEVDAT) + PUSHJ PDP,SET176 ;IS THIS THE FIRST POINTER BLOCK? + MOVE TAC,@TAC1 + TRNN TAC,-1 + JRST DFSETB ;YES + HRRZ TAC,DEVBLK(DEVDAT) ;IN BLOCK WERE CURRENT ONE. + SUBI TAC,1 + MOVNS TAC + ADDM TAC,SETCNT(DEVDAT) + JRST DFSETC + +;THE DESIRED POINTER MAY BE IN CORE. IF THERE ARE MORE POINTERS ON +;DISC, THEN CORE IS FULL, AND THE POINTER IS IN CORE, OTHERWISE +;A CHECK IS MADE TO INSURE THAT THE END FILE IS AFTER THE DESIRED +;POINTER. + +DFSET3: + +DFSETX: HRRZ TAC,DEVCNT(DEVDAT) ;C(UUO)RW > C(DEVCNT) RH? + ADDI TAC,BLKSIZ-1 ;CONVERT TO BLOCKS + LSH TAC,-BLKP2 + CAIL TAC,(UUO) + JRST DFSET5 ;NO, ALL OK. + MOVSI IOS,IOEND ;YES, END-FILE. + IORB IOS,DEVIOS(DEVDAT) + AOSA TAC +DFSET5: HRRZ TAC,UUO ;SET NEXT BLOCK AS ONE BEYOND LAST EXISTING ONE + HRRZ TAC1,SETCNT(DEVDAT) ;PREPARE TO RESET DEVACC + SUBM TAC,TAC1 + ADDM TAC1,DEVACC(DEVDAT) + HRRM TAC,SETCNT(DEVDAT) ;RESET SETCNT + JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE + +;THE DESIRED POINTER IS BEFORE THE CURRENT ONE. SEE IF IT IS IN CORE. + +DFSET6: SUBI TAC1,PTR1(DEVDAT) + SUB TAC,TAC1 + CAIG TAC,(UUO) + JRST DFSET5 ;POINTER IS IN CORE + +;THE DESIRED BLOCK IS BEFORE THE CURRENT ONE. SEARCH FROM THE BEGINNING. + + MOVE TAC,DEVOAD(DEVDAT) ;ARE POINTERS IN CORE SAME AS ON DISC? + TLNE TAC,PNTDIF + PUSHJ PDP,DFO4A ;NO, WRITE THEM OUT + HRRZ TAC,DEVEXT(DEVDAT) ;GET BLOCK# OF FIRST RIB + PUSHJ PDP,SETPTR ;READ FIRST RIB +DFSETB: MOVEI TAC,1 ;RESET SETCNT + HRRM TAC,SETCNT(DEVDAT) ;"POSITIONED" AT RELATIVE BLOCK 1 + +DFSETC: HRRZ TAC,DSKBUF(DEVDAT) ;LSET TAC TO FIRST POINTER + PUSHJ PDP,SET176 ;IS THIS THE FIRST POINTER BLOCK? + MOVE DAT,@TAC1 + TRNN DAT,-1 + ADDI TAC,DIRSIZ ;YES, SKIP OVER 4 WORDS + HLRZ DAT,@TAC1 ;BLOCK FULL? + SUBI TAC1,1 + JUMPN DAT,DFSETD ;YES + SKIPN @TAC1 ;NO. MOVE TAC1 TO LAST POINTER + SOJA TAC1,.-1 + +DFSETD: HRRZ AC1,SETCNT(DEVDAT) + SUBI AC1,(TAC) ;IS DESIRED POINTER HERE? + HRRZ AC2,TAC1 + ADD AC2,AC1 + CAIL AC2,(UUO) + + JRST DFSET7 ;YES + ADDI AC2,1 ;NO. GET NEXT BLOCK + HRRM AC2,SETCNT(DEVDAT) + JUMPE DAT,DFSET8 ;ANY MORE POINTER BLOCKS? + MOVSM DAT,DEVBLK(DEVDAT) ;YES, SET UP TO READ NEXT BLOCK. + PUSHJ PDP,RRI + JRST DFSETC + +;THE BLOCK CONTAINING THE POINTER IS FOUND. +DFSET7: HRRZ TAC,UUO ;RESET RIGHT HALF OF DEVBLK + SUB TAC,AC1 + HRRZ TAC1,DSKBUF(DEVDAT) + SUB TAC,TAC1 + HRRM TAC,DEVBLK(DEVDAT) + + HRRM UUO,SETCNT(DEVDAT) ;RESET SETCNT + PUSHJ PDP,DFIN4 ;GET POINTERS + JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE + +;RAN OUT OF POINTERS + +DFSET8: ADDI TAC1,1 + HRRZ TAC,DSKBUF(DEVDAT) + SUB TAC1,TAC + HRRM TAC1,DEVBLK(DEVDAT) + TLO IOS,NMP!IOEND ;SET END + MOVEM IOS,DEVIOS(DEVDAT) + PUSHJ PDP,DFO6A ;CLEAR POINTERS + JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE + +SUBTTL INPUT/OUPUT UUO'S. RETRIEVAL POINTER PROCESSING +;INPUT UUO +;* INDICATES INTERRUPT LEVEL + +EXTERNAL ADVBFF + +DFIN: TLNN DEVDAT,LOOKB ;FILE OPEN? + JRST DFERR2 ;NO, UNDEFINED FILE + TLZ IOS,IO ;SET INPUT INDICATOR + +DFIN1: TLNE IOS,LIR ;*ANY MORE INPUT? + POPJ PDP, ;*NO, LEAVE + + HRRZ TAC1,DEVACC(DEVDAT) ;* + CAILE TAC1,PTRN(DEVDAT) ;*POINTER LIST EMPTY? + JRST DFIN2 ;*YES + SKIPN @TAC1 ;*NO--END OF FILE? + JRST DFIN1E ;*YES + + CAIN TAC1,PTRN(DEVDAT) ;*NO--IS THIS THE LAST POINTER ? + JRST DFIN1B ;*YES + +DFIN1D: SKIPN 1(TAC1) ;*NO + TLO IOS,LIR ;*SET LAST INPUT FLAG +DFIN1A: MOVEM IOS,DEVIOS(DEVDAT) ;* + JRST QIN ;* + +DFIN1E: TLO IOS,LIR ;*EMPTY FILE + MOVEM IOS,DEVIOS(DEVDAT) ;* + POPJ PDP, ;* + +DFIN1B: TLNE IOS,NMP ;*ANY MORE POINTERS ON DISK? + TLO IOS,LIR ;*NO, THIS IS THE LAST READ + JRST DFIN1A ;* + +DFIN2: MOVEM IOS,DEVIOS(DEVDAT) + PUSHJ PDP,SETBFI ;CHOOSE NEXT INPUT BUFFER TO HOLD RETRIEVAL POINTERS + PUSHJ PDP,GETPTR ;READ RIB COPY POINTERS INTO DDB + HRRZ TAC1,DEVACC(DEVDAT) + JRST DFIN1D + +;NEED NEW POINTER FROM DISK + +GETPTR: MOVE AC2,DEVOAD(DEVDAT) ;POINTERS DIFFER? + TLNE AC2,PNTDIF + JRST DFO4A ;YES, WRITE THEN READ AND RETURN + PUSHJ PDP,RRI ;NO, READ BLOCK + +DFIN4: MOVEI AC2,PTR1(DEVDAT) ;RESET DEVACC + HRRM AC2,DEVACC(DEVDAT) + MOVE TAC,DEVBLK(DEVDAT) ;RESET DEVBKO + MOVEM TAC,DEVBKO(DEVDAT) ;BLOCK # WORD INDEX OF A CURRENT RETRIEVAL PACKET +GTPTR1: PUSHJ PDP,SET000 ;SET TAC1 TO FIRST WORD OF RIB + MOVE IOS,DEVIOS(DEVDAT) + HRRZ AC3,DEVBLK(DEVDAT) ;WORD INDEX OF RETRIEVAL POINTER PACKET + ADD AC3,TAC1 ;AC3 POINTS TO NEXT POINTER WITHIN RIB + ADDI TAC1,BLKSIZ-2 ;TAC1 POINTS TO WORD 127 + + MOVEI AC1,PTRN(DEVDAT) ;DDB END CHECK +DFIN5: CAML AC3,TAC1 ;POINTER BLOCK EMPTY? + + JRST DFIN7 ;YES, GET SOME MORE + + MOVE TAC,@AC3 ;GET RETRIEVAL POINTER + MOVEM TAC,@AC2 ;STASH IN DDB + ADDI AC3,1 + JUMPE TAC,DFIN8A ;0 MEANS NO MORE RETRIEVAL POINTERS + CAIE AC1,(AC2) ;DDB FULL? + AOJA AC2,DFIN5 ;NO, GET ANOTHER + + CAML AC3,TAC1 ;YES, ANY MORE FOR NEXT TIME? + HLLZS @AC3 ;END OF RIB REACHED. ACE(LH) IS LINK NEXT RIB + SKIPN @AC3 ;NEXT POINTER=0 OR LINK=0. + TLO IOS,NMP ;SET "NO MORE POINTER" + +DFIN6A: MOVEM IOS,DEVIOS(DEVDAT) + MOVE TAC1,DSKBUF(DEVDAT);POINT TO FIRST WORD OF RIB + SUBI AC3,(TAC1) ;COMPUTE NEW INDEX + HRRM AC3,DEVBLK(DEVDAT) ;STORE INDEX TO NEXT RETRIEVAL POINTER PACKET + MOVSI AC1,PNTDIF ;CLEAR "POINTER DIFFER" + ANDCAM AC1,DEVOAD(DEVDAT) ;SINCE DDB IS COPY OF RETRIEVAL DATA. + POPJ PDP, + +DFIN7: HLRZ TAC,@TAC1 ;RIB LINK TO TAC RH + JUMPE TAC,DFIN8 ;DONE IF LINK=0 + MOVSM TAC,DEVBLK(DEVDAT) ;SET BLOCK#, WORD INDE FOR NEXT PACKET + PUSH PDP,AC2 + PUSHJ PDP,RRI ;READ THE RIB + POP PDP,AC2 + JRST GTPTR1 +DFIN8: MOVEM TAC,@AC2 ;0 WOTRD IS DOB MARKS END +DFIN8A: TLO IOS,NMP ;NO MORE POINTERS ON DISK + JRST DFIN6A + +;ENTER HERE AT INTERRUPT LEVEL TO READ ANOTHER BLOCK + +DFINX: PUSHJ PDP,ADVBFF ;*ANY MORE EMPTY BUFFERS? + POPJ PDP, ;* + + HRRZ TAC1,DEVACC(DEVDAT) ;*POINTER LIST EMPTY? + CAILE TAC1,PTRN(DEVDAT) ;* + POPJ PDP, ;* + + JRST DFIN1 ;*NO,FILL NEXT ONE + +;OUTPUT UUO + +EXTERNAL WSYNC,ADVBFE + +DFOUT: TLNN DEVDAT,ENTRB ;FILE OPEN? + JRST DFERR2 ;NO, UNDEFINED FILE + TLO IOS,IO ;SET OUTPUT INDICATION + MOVEM IOS,DEVIOS(DEVDAT) + +DFOUT1: HRRZ DAT,DEVACC(DEVDAT) ;*GET POINTER LOC + + IFG CHKCNT,< + HRRZ TAC,DEVOAD(DEVDAT) ;* + ADD TAC,[XWD NBLKSZ,2] ;* + PUSHJ PDP,CHKSUM ;* + HRLM TAC1,@DAT ;* + MOVSI TAC1,PNTDIF ;* + ORM TAC1,DEVOAD(DEVDAT) ;* + > + + HRRZ TAC,@DAT ;*ALREADY HAVE A POINTER? + JUMPN TAC,DFOT3A ;*YES IF JUMP + CAIE DAT,PTRN(DEVDAT) ;*NO, CLEAR NEXT ONE? + SETZM 1(DAT) ;*YES + TLO IOS,NMP ;*SET "NO MORE POINTERS" + MOVEM IOS,DEVIOS(DEVDAT) ;* + MOVE TAC1,DEVOAD(DEVDAT) ;*POINT TO OUTPUT BUFFER + ADDI TAC1,1 ;*NOW TO WORD COUNT + HRRZ TAC1,@TAC1 ;*RETRIEVE WORD COUNT + PUSHJ PDP,UPDEVC ;*UPDATE DEVCNT + PUSH PDP,DAT ;* + PUSHJ PDP,DFGETF ;*GET A FREE BLOCK + POP PDP,DAT ;* + + IFG CHKCNT,< + HRRM TAC,@DAT> + IFLE CHKCNT,< + MOVSI TAC1,PNTDIF + ORM TAC1,DEVOAD(DEVDAT) + MOVEM TAC,@DAT> + +DFOT3A: CAIE DAT,PRTN(DEVDAT) ;*LIST FULL? + JRST QOUT ;*NO, WRITE AND LEAVE + +;OUTPUT UUO CONTINUED. +;WRITE OUT POINTER LIST. + + PUSHJ PDP,SETBFO ;CHOOSE AN OUTPUT BUFFER TO READ RIB INTO + PUSHJ PDP,QOUT ;PUT REQUEST IN QUEUE + PUSHJ PDP,WSYNC ;WAIT TIL DATA WRITTEN + +DFO4A: MOVE TAC,DEVBKO(DEVDAT) ;RESET DEVBLK TO REFER TO RETRIEVAL POINTERS + MOVEM TAC,DEVBLK(DEVDAT) ;NOW IN DDB + + MOVE TAC,DEVOAD(DEVDAT) ;ANY POINTERS BEEN WRITTEN? + TLZE TAC,VRGPTR + PUSHJ PDP,DFO7A ;NO, CREATE NEW BLOCK, SKIP NEXT INSTRUCTION. + PUSHJ PDP,RRI ;RED RETRIEVAL BLOCK + MOVEI AC3,PTR1(DEVDAT) + +DFO4B: PUSHJ PDP,SET000 ;TAC1 POINTS TO RIB + HRRZ AC2,DEVBLK(DEVDAT) ;INDEX INTO RIB + ADD AC2,TAC1 ;ABSOLUTE POINTER INTO RIB + ADDI TAC1,BLKSIZ-2 ;END OF RIB DATA +DFOUT5: MOVE AC1,@AC3 ;GET RETRIEVAL POINTER FROM DDB + JUMPE AC1,DFOUT6 ;0 SIGNALS END + CAML AC2,TAC1 ;BLOCK FULL? + JRST DFOUT7 ;YES, WRITE IT OUT + MOVEM AC1,@AC2 ;STASH POINTER IN RIB + ADDI AC2,1 + CAIE AC3,PTRN(DEVDAT) ;DONE? + AOJA AC3,DFOUT5 + +DFOUT6: MOVE TAC1,DSKBUF(DEVDAT) ;POINT TO RIB + SUBI AC2,(TAC1) ;FROM INDEX + HRRM AC2,DEVBLK(DEVDAT) ;STORE INDEX TO RETRIEVAL POINTERS + MOVSI AC2,PNTDIF ;CLEAR "POINTERS DIFFER" + ANDCAM AC2,DEVOAD(DEVDAT) + PUSHJ PDP,WRI ;WRITE THE BLOCK +DFO6A: MOVEI TAC,PTR1(DEVDAT) + HRRM TAC,DEVACC(DEVDAT) ;DEVACC NOW POINTS TO FIRST POINTER IN DDB + SETZM @TAC ;CLEAR FIRST POINTER + TLNN IOS,NMP ;MORE POINTERS? + JRST DFIN4 ;YES, BRING THEM IN AND LEAVE + MOVE TAC,DEVBLK(DEVDAT) + MOVEM TAC,DEVBKO(DEVDAT) ;SAE BLOCK#,WORD INDEX OF CURRENT POINTER PACKET + POPJ PDP, + +DFO7A: MOVEM TAC,DEVOAD(DEVDAT) ;SAVE VRGPTR BIT + PUSHJ PDP,SET177 ;SET TAC1 TO WORD 128 + SETZM @TAC1 ;CLEAR BLOCK# WORD + AOS (PDP) ;ALWAYS SKIP RETURN + PUSH PDP,AC3 ;BECAUSE ENTRY FROM NEWRIB PUSHES AC3 + JRST DFOUT8 + +DFOUT7: PUSHJ PDP,NEWRIB + JRST DFO4B + +NEWRIB: PUSH PDP,AC3 ;CREATE A NEW RETRIEVAL BLOCK + PUSHJ PDP,SET176 ;SET TAC1 TO LINK WORD + HLLZ TAC,@TAC1 ;LINK TO NEXT POINTER BLOCK ALREADY PRESENT? + JUMPN TAC,DFOUT9 ;YES, WRITE CURRENT ONE AND READ NEXT ONE + PUSHJ PDP,DFGETF ;NO, GET A BLOCK FOR POINTER IN TAC + HLRZ AC3,DEVBLK(DEVDAT) ;BLOCK# OF CURRENT RIB + MOVSM TAC,DEVBLK(DEVDAT) ;STORE BLOCK#, INDEX FOR NEW BLOCK + PUSHJ PDP,SET176 ;SET TAC1 TO WORD 127 AGAIN + HRLM TAC,@TAC1 ;LH LINKS TO NEW BLOCK + + MOVE TAC,AC3 ;BLOCK# OF CURRENT BLOCK + PUSHJ PDP,WRIA ;WRITE THE BLOCK OUT + +DFOUT8: MOVE TAC1,DSKBUF(DEVDAT) ;POINT TO BUFFER CONTAINING RIB + NOSCHEDULE + TLNN IOS,UBFS ;DUMP MODE? + ADD TAC1,PROG ;NO, RELOCATE + MOVEI TAC,1(TAC1) ;DESTINATION + HRL TAC,TAC1 ;SOURCE + SETZM (TAC1) + BLT TAC,BLKSIZ-3(TAC1) ;ZERO OUT FIRST 126 WORDS + MOVE TAC,BLKSIZ-1(TAC1) ;BLOCK# OF CURRENT RIB + HRRZM TAC,BLKSIZ-2(TAC1) ;SET "PREVIOUS" POINTER..CLEAR LINK TO NEXT + SETZM BLKSIZ-1(TAC1) ;CLEAR WORD 128. + SCHEDULE +DFO8A: POP PDP,AC3 + POPJ PDP, + +DFOUT9: EXCH TAC,DEVBLK(DEVDAT) ;SAVE NEW BLOCK# INDEX. GET OLD BLOCK# INDEC + HLRZS TAC ;BLOCK# IN RH + PUSHJ PDP,WRIA ;WRITE THIS BLOCK OF POINTERS OUT + PUSHJ PDP,RRI ;READ NEXT BLOCK OF POINTERS IN + JRST DFO8A + +;ENTER HERE AT INTERRUPT LEVEL TO WRITE ANOTHER + + EXTERN MJOBN + +DFOUTX: PUSHJ PDP,ADVBFE ;*ANY MORE TO DO? + POPJ PDP, ;* + SKIPL DAREQ ;*DO NOT CONTINUE THIS OUTPUT AT INTERRUPT + POPJ PDP, ;* LEVEL IF THE DAWAIT RTN WOULD BE CALLED. + HRRZ TAC1,DEVACC(DEVDAT) ;*NEED TO WRITE POINTERS? + CAIL TAC1,PTRN(DEVDAT) ;* + POPJ PDP, ;* + HRRZ TAC,@SATPTR ;*CURRENT SAT BLOCK FULL? + TRNN TAC,WLBIT ;*OR WRITE-LOCKED? + CAIL TAC,NUMBIT+MJOBN ;*BE SURE TO LEAVE ATLEAST JOBN FREE BLOCKS + ; SO THAT EACH JOB CAN HAVE ONE MORE + POPJ PDP, ;* + PUSH PDP,AC1 ;* + PUSH PDP,AC2 ;* + PUSHJ PDP,DFOUT1 ;* + POP PDP,AC2 ;* + POP PDP,AC1 ;* + POPJ PDP, ;* + +SUBTTL READ/WRITE RETRIEVAL POINTERS +;INPUT RETRIEVAL BLOCK. + +RRIB: SKIPA TAC,DEVEXT(DEVDAT) ;READ FIRST RETRIEVAL BLOCK +RRI: HLRZ TAC,DEVBLK(DEVDAT) ;READ NEXT RETRIEVAL BLOCK +RRIA: PUSHJ PDP,MQIN ;READ RETRIEVAL BLOCK SPECIFIED BY TAC ON ENTRY + JRST RERA ;ERRORS, YOU LOSE + PUSHJ PDP,SET177 ;CHECK RH OF WORD 128 + HLRZ TAC,DSKCNT(DEVDAT) ;BLOCK# EXPECTED + MOVE AC1,@TAC1 ;GET BLOCK# STORED IN RIB + CAIE TAC,(AC1) ;SAME? + JRST RERA ;IT WAS WRONG, YOU LOSE. + POPJ PDP, ;EVERYTHING OK. + +;OUTPUT A RETRIEVAL BLOCK. + +WRIB: SKIPA TAC,DEVEXT(DEVDAT) ;WRITE FIRST RETRIEVAL BLOCK +WRI: HLRZ TAC,DEVBLK(DEVDAT) ;WRITE NEXT RETRIEVAL BLOCK +WRIA: PUSHJ PDP,SET177 ;WRITE RETRIEVAL BLOCK SPECIFIED BY TAC ON ENTRY + HRRM TAC,@TAC1 ;STORE THIS BLOCK# IN WORD 128 + IFN FTRCHK,< + SKIPN TAC ;ATTEMPTING TO WRITE RETRIEVAL INFORMATION + ; IN BLOCK NR 0 IS AN ERROR + HALT WERA ;CONTINUE WILL POINT ERROR MESSAGE +> + PUSHJ PDP,MQOUT ;WRITE IT, + JRST WERA ;ERRORS + POPJ PDP, ;NO, RETURN. + +SET177: HRRZ TAC,DSKBUF(DEVDAT) + ADDI TAC1,BLKSIZ-1 +S177A: TLNN IOS,UBFS + TLO TAC1,PROG + POPJ PDP, + +SET176: HRRZ TAC1,DSKBUF(DEVDAT) + ADDI TAC1,BLKSIZ-2 + JRST S177A + +SET000: HRRZ TAC1,DSKBUF(DEVDAT) + JRST S177A + + +;PUT POINTER INFO IN DDB +;ENTER WITH TAC CONTAINING THE BLOCK NUMBER OF THE POINTERS. + +SETPTR: HRLZM TAC,DEVBLK(DEVDAT) ;XWD RIB#, 0...0 INDEX + ANDCM IOS,[XWD IOEND+NMP,IODEND] + MOVEM IOS,DEVIOS(DEVDAT) + PUSHJ PDP,SETBUF ;AQUIRE BUFFERE IN MONITOR STORAGE + PUSHJ PDP,RRI ;GET RETRIEVAL BLOCK + + PUSHJ PDP,DFIN4 ;COPY POINTERS TO DDB + MOVEI AC3,FPNTR(DEVDAT) ;SET DEVACC TO SKIP FIRST 4 WORDS + HRRM AC3,DEVACC(DEVDAT) + POPJ PDP, + +;RECLAIM STORAGE ON DISK. +;ENTER WITH TAC POINTING TO FIRST RETRIEVAL BLOCK OF THE FILE +; TO BE DELETED. + +RECLAM: PUSHJ PDP,SETBUF ;FIND SPACE IN USER AREA + + PUSHJ PDP,RECLM5 ;GET FIRST POINTER BLOCK + ADDI DAT,DIRSIZ ;SKIP OVER FIRST WORDS. +RECLM2: CAML DAT,TAC1 ;MORE POINTERS IN BLOCK? + PUSHJ PDP,RECLM4 ;NO. GET MORE + HRRZ TAC,@DAT ;FREE A DATA BLOCK + JUMPE TAC,CLRBUF ;EXIT WHEN A ZERO POINTER IS ENCOUNTERED + PUSH PDP,TAC1 + PUSHJ PDP,SETFRE ;FREE UP SPECIFIED BLOCK + POP PDP,TAC1 + AOJA DAT,RECLM2 ;GO BACK FOR MORE + +RECLM4: HLRZ TAC,@TAC1 ;PICK UP POINTER TO NEXT BLOCK + JUMPE TAC,RECLM6 ;NO MORE, GO HOME. +RECLM5: PUSHJ PDP,RRIA ;READ IN A R.I. BLOCK. + + HLRZ TAC,DSKCNT(DEVDAT) ;FREE THAT BLOCK + PUSHJ PDP,SETFRE + + PUSHJ PDP,SET000 ;SET TAC1 TO FIRST WORD + MOVE DAT,TAC1 + ADDI TAC,BLKSIZ-2 ;SET TAC1 TO WORD 127 + POPJ PDP, + +RECLM6: POP PDP,TAC + JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE + +;RELEASE UUO. + +EXTERNAL DAREQ,DAAVAL + +DFREL: TLO DEVDAT,DSKRLB ;MARK RELEASE (VIA RESET UUO) IN PROGRESS. + PUSHJ PDP,DFCLSI ;CLOSE INPUT FIRST + PUSHJ PDP,DFCLSO ;THEN CLOSE OUPUT + ; SAME ORDER AS CLOSE AND RELEAS IN UUOCON + SKIPN SATCHG ;HAS SAT BLOCK BEEN MODIFIED? + JRST DFREL1 ;NO, SUPPRESS WRITING + PUSHJ PDP,UPDA ;SET DAREQ INTERLOCK WHILE WRITING SAT BLOCK + PUSH PDP,DSKBUF(DEVDAT) + PUSHJ PDP,SATWRT ;WRITE CURRENT SAT BLOCK + POP PDP,DSKBUF(DEVDAT) + PUSHJ PDP,DOWNDA ;RESET DAREQ INTERLOCK +DFREL1: TLZ DEVDAT,DSKRLB ;CLEAR RELEASE MARKER. + JRST WAIT1 + +SUBTTL DISK SPACE ALLOCATION +;DFGETF: GET A FREE DISK BLOCK +;CALL: PUSHJ PDP,DFGETF +; ... RETURNS WITH TAC:=LOGICAL BLOCK# +; MAY NOT RETURN IF DISK IS FULL OR NEARLY FULL + + EXTERNAL DAWAIT,DAAVAL,DAREQ,JOBN + INTERNAL DFGETF + +DFGETF: PUSHJ PDP,UPDA ;SET DISK ALLOCATION INTERLOCK +DFGTF1: PUSHJ PDP,SATGET ;FOCUS ON A NON-FULL SAT BLOCK + HRRZ AC1,SATPTR ;POINT TO 3 WORD SAT ENTRY + MOVE AC2,SATBK2 ;XWD -L, POINTER TO SAT ENTRY + MOVEI ITEM,1 ;REQUEST 1 BLOCK + PUSHJ PDP,GETBIT ;RETURNS BIT# IN TAC1 (IN RANGE 1 TO NUMBLK) + JRST DFGTF2 ;FULL AFTER ALL + SETOM SATCHG ;SHOW SAT BLOCK IN CORE NOT = DISK COPY + AOS TAC,@SATPTR ;COUNT ANOTHER BLOCK USED + HLRZS TAC ;FIRST LOGICAL BLCOK# REPRESENTED BY SAT BLOCK + ADDI TAC, -1(TAC1) ;FORM LOGICAL BLOCK# +DOWNDA: SOSL DAREQ ;THIS EXITING ROUTINE TURNS OFF DAREQ INTERLOCK + ; THUS MAKING NON-SHARABLE SECTIONS OF CODE + ; AVAILABLE TOTHE NEXT USER IN THE QUEUE + SETOM DAAVAL + TLZ IOS,DAFLG + MOVEM IOS,DEVIOS(DEVDAT) + POPJ PDP, + +DFGTF2: MOVEI TAC,NUMBIT ;BITS/SAT BLOCK + HRRM TAC,@SATPTR ;MARK SAT ENTRY FULL + JRST DFGTF1 + +;UPDA - TURN ON THE DISK ALLOCATION INTERLOCK (DAREQ) +; - A CALL TO UPDA MUST PRECEDE SAT BLOCK MANIPULATIONS +UPDA: AOSE DAREQ ;INCREMENT COUNT OF USERS REQUESTING DISK ALLOCATION + PUSHJ PDP,DAWAIT ;WAIT UNTIL JOB REACHES TOP OF QUEUE + TLO IOS,DAFLG + MOVEM IOS,DEVIOS(DEVDAT) ;MAKE THIS JOB AS USING SAT BLOCK + POPJ PDP, + +;SATGET - FIND A NON-FULL SAT BLOCK FOR DFGTF OR DUMP MODE OUTPUT. +; CONSIDER DISK FULL WHEN FEW BLOCKS REMAIN FREE UNLESS THE USER +; IS LOGGING IN OR USING A NON-SHARABLE RESOURCE. + +EXTERNAL JBTSTS,HNGSTP + +SATGET: SETZ AC1, ;CLEAR COUNT + HRRZ TAC,@SATPTR ;BLOCKS USED IN CURRENT SAT BLOCK + TRNN TAC,WLBIT ;WRITE LOCKED? + PUSHJ PDP,SATCNT ;NO. COUNT # FREE + CAIL AC1,JOBN ;IS THER ENOUGH SPACE? + POPJ PDP, ;YES - USE IT. + SETZ AC1, ;CLEAR COUNT + MOVEI TAC1,SATENT ;START WITH FIRST SAT ENTRY +SATGT1: HRRZ TAC, 0(TAC1) ;GET WLBIT + BLOCKS USED + TRNN TAC,WLBIT ;WRITE LOCKED? + PUSHJ PDP,SATCNT ;NO. COUNT # FREE + ADDI TAC1,SENTSZ ;NEXT SAT ENTRY + CAIL AC1,JOBN ;ENOUGH SPACE ACCUMULATED? + + JRST SATGT2 ;YES - READ A SAT BLOCK + CAIGE TAC1,SATTOP ;END OF ENTRIES? + JRST SATGT1 ;NO. CONTINUE + JUMPE AC1,DSKFUL ;IF NONE FOUND DISK IS REALLY FULL + +;THERE ARE JOBN OR FEWER DISK BLOCKS AVAILABLE. +;GIVE THEM OUT ONLY IN HARDSHIP CASES + LDB TAC,PJOBN + MOVE TAC,JBTSTS(TAC) + TLNN TAC,JACCT ;IS THIS USER LOGGING IN? + TLNE IOS,UBFS+AUFLG ;DOES USER HAVE MONITOR BUFFER OR IS HE ALTERING UFD? + JRST SATGT2 ;YES TO EITHER. GIVE HIM A BLOCK ANYWAY. +DSKFUL: TLNE IOS,UBFS+AUFLG + JRST DFERR1 ;NON-RECOVERABLE ERROR IF USING BUFFER OR ALTERING UFD + + PUSHJ PDP,DOWNDA ;RESET ALLOCATION INTERLOCK + PUSHJ PDP,HNGSTP ;PRINT "DSK OK?" + PUSHJ PDP,UPDA ;IF USER TYPE "CONT" WE TRY AGAIN + JRST SATGET + +SATGT2: MOVE TAC1,SATPIK ;POINT TO ENTRY OF NON-FULL SAT BLOCK + JRST SATRD ;READ IN SAT BLOCK + +SATCNT: CAIE TAC,NUMBIT ;IS ENTRY FULL? + MOVEM TAC1,SATPIK ;NO. SAVE POINTER TO A NON-FULL ENTRY + ADDI AC1,NUMBIT ;MAXIMUM NUMBER + SUB AC1,TAC ;LESS NUMBER USED + POPJ PDP, + +;SETFRE - RETURN A DISK BLOCK TO AVAILABLE STORAGE +;CALL TAC:=LOGICAL BLOCK L +; PUSHJ PDP,SETFRE +; ... RETURN + + INTERNAL SETFRE,FTRCHK + +SETFRE: PUSHJ PDP,UPDA ;SET DISK ALLOCATION INTERLOCK +IFN FTRCHK,< + EXTERNAL LBHIGH + + SKIPE TAC ;BLOCK 0 SHOULD NEVER BE CLEARED + CAMLE TAC,LBHIGH ;BLOCK # TOO LARGE + HALT DOWNDA ;YES, HALT. CONTINUE WILL COUNT DOWN DAREQ. +> + HLRZ AC1,@SATPTR ;GET LOGICAL BLOCK# FOR B0 OF CURRENT SAT BLOCK + CAML TAC,AC1 ;IS L LESS THAN FIRST BLOCK REPRESENTED? + CAIL TAC,NUMBLK(AC1) ;IS L LESS THAN LAST BLOCK REPRESENTED + SKIPA ;OUTSIDE RANGE + JRST SETFR2 ;IN RANGE + MOVEI TAC1,SATENT ;INITIALIZE POINTER + SKIPA +SETFR1: ADDI TAC1,SENTSZ ;INCREMENT POINTER + HLRZ AC1,@TAC1 ;GET LOGICAL BLOCK FOR B0 OF SAT BLOCK + CAML TAC,AC1 ;IS L LESS THEN FIRST BLOCK? + CAIL TAC,NUMBLK(AC1) ;IS L LESS THEN LAST BLOCK? + JRST SETFR1 ;OUT-OF-RANGE, TRY NEXT + PUSH PDP,TAC ;SAVE BLOCK# + PUSHJ PDP,SATRD ;READ SAT BLOCK FOR ENTRY POINTED TO BY TAC1 + POP PDP,TAC ;RESTORE BLOCK# + HLRZ AC1,@SATPTR +SETFR2: SUB TAC,AC1 ;FROM BIT# (IN RANGE 0 TO NUMBLK-1) + HRRZ AC1,SATPTR ;POINT TO 3 WORD ENTRY + MOVE AC2,SATBK2 ;XWD -L, POINTER TO SAT BLOCK + MOVEI ITEM,1 ;RETURN 1 BIT + PUSHJ PDP,CLRBIT + SOS @SATPTR ;DECREMENT BLOCKS USED + SETOM SATCHG ;SAT BLOCK IN CORE NOT = DISK COPY + JRST DOWNDA ;REMOVE ALLOCATION INTERLOCK AND EXIT. + +;NOTE: SATRD USES TEMPORARY STORAGE LOCATIONS SATTMP AND SATTEM TO HELP AVOID +; A PDL OVRFLW PROBLEM. IT CAN DO SO BECAUSE IT IS NOT RE-ENTRANT, I.E., ONLY +; ONE USER AT A TIME MAY PASS THROUGH HERE BECAUSE OF THE DAREQ INTERLOCK. + +SATRD: MOVEM TAC1,SATTMP ;SAVE POINTER TO DESIRED SAT ENTRY. + MOVE TAC1,DSKBUF(DEVDAT) ;ALSO SAVE IOWD FROM THE DDB + MOVEM TAC1,SATTEM + SKIPE SATCHG ;HAS COPY IN CORE BEEN MODIFIED? + PUSHJ PDP,SATWRT ;YES, WRITE IT. + MOVE TAC,SATTMP ;RETRIEVE SAT POINTER FOR SAT BLOCK TO BE READ IN. + MOVEM TAC,SATPTR + PUSHJ PDP,SATBLK ;COMPUTE BLOCK#, IOWD + TLO IOS,NORELB ;NO RELOCATION + PUSHJ PDP,MQIN ;READ THE BLOCK + JRST RERA ;ERROR + MOVE TAC1,SATTEM ;RESTORE SAVED IOWD TO DDB + MOVEM TAC1,DSKBUF(DEVDAT) + JRST SATW1 + +SATWRT: TLO IOS,NORELB ;NO RELOCATION + PUSHJ PDP,SATBLK ;COMPUTE BLOCK# IOWD + PUSHJ PDP,MQOUT ;WRITE BLOCK + JRST WERA ;ERROR + SETZM SATCHG ;SHOW COPY IN CORE = BLOCK ON DISK +SATW1: MOVSI IOS,NORELB ;RESET BIT + ANDCAB IOS,DEVIOS(DEVDAT) + POPJ PDP, + +;SET UP TAC AND TAC1 FOR READ OR WRITE OF SAT BLOCK + +SATBLK: MOVE TAC,SATPTR + SUBI TAC,SATENT + IDIVI TAC,SENTSZ + ADD TAC,SATXWD + MOVE TAC1,SATBK2 + MOVEM TAC1,DSKBUF(DEVDAT) + POPJ PDP, + +SUBTTL "FREE" CORE ALLOCATION +;CLEAR OUT DDB AT RELEASE TIME + +INTERNAL CLRDDB + +CLRDDB: MOVEI TAC,DSKDDB ;POINT TO PROTOTYPE DDB +CLRDB1: MOVE TAC1,TAC ;COPY LINK TO TAC1 + HLRZ TAC,DEVSER(TAC1) ;GET LINK TO NEXT DDB + JUMPE TAC,CPOPJ ;0 MEANS END + CAIE TAC,(DEVDAT) ;OWNED BY CURRENT USER? + JRST CLDDB1 ;NO + NOSCHEDULE + MOVE AC1,DEVSER(TAC) ;GET LINK FROM THIS DDB + HLLM AC1,DEVSER(TAC1) ;STORE IN PREVIOUS DDB TO REMOVE THIS ONE + HRRZ ITEM,DDBPTR ;GET INTERRUPT LEVEL POINTER + CAIN ITEM,0(TAC) ;POINTED TO DISCARDED DDB? + MOVSM AC1,DDBPTR ;YES. BYPASS DISCARDED DDB + SCHEDULE + MOVEI ITEM,DSKCOR + JRST CLCOR1 ;DELETE FREE STORAGE. + +;BUILD A DISK DEVICE DATA BLOCK AND ASSIGN IF LOGICAL NAME GIVEN. +;THIS IS DONE AT INIT TIME. + +INTERNAL SETDDB + +SETDDB: PUSH PDP,ITEM ;SAVE AC'S USED BY SETDDB + PUSH PDP,TAC1 + MOVE TAC1,DEVMOD(DEVDAT) + TRNE TAC1,ASSPRG ;HAS AN INIT BEEN DONE? + JRST SETDD0 ;YES. MUST COPY PROTOTYPE DDB + HRRZ TAC1,DEVDAT ;GET ADDRESS OF DDB + CAIE TAC1,DSKDDB ;IS IT PROTOTYPE? + JRST SETDD1 ;NO. WE ALREADY HAVE A DDB +SETDD0: MOVEI ITEM,DSKCOR ;GET SOME FREE CORE + NOSCHEDULE + PUSHJ PDP,GTCOR1 ;GET SPACE FOR DDB + HRR DEVDAT,TAC1 ;DEVDAT POINTS TO ASSIGNED CORE + HRLI TAC1,DSKDDB ;SOURCE, DESTINATION + BLT TAC1,PTR1(DEVDAT) ;COPY PROTOTYPE DDB INTO MONITOR CORE + MOVEI TAC1,DSKDDB ;TAC1 POINTS TO PROTOTYPE + ; LINK PROTOTYPE DDB TO COPY + ; COPY ALREADY LINKS WHERE PROTOTYPE DID + HRLM DEVDAT,DEVSER(TAC1) + SCHEDULE +SETDD1: POP PDP,TAC1 + POP PDP,ITEM + POPJ PDP, + +;SET TAC1 TO SOME AREA FOR BUFFER. +;GET BUFFER SPACE FROM USER INPUT OR OUTPUT RING IF AVAILABLE +;ASSIGN FROM MONITOR CORE AS A LAST RESORT. +;SET DSKBUF(DEVDAT) TO POINT TO BUFFER. + +EXTERNAL PIOMOD,UADRCK,JOBFF + +SETBUF: TLNE IOS,UBFS ;HAVE ONE IN FREE STORAGE? + POPJ PDP, ;YES, LEAVE + LDB TAC1,PIOMOD ;NO. DUMP MODE? + CAIGE TAC1,SD + TLNE DEVDAT,DSKRLB ;RESET UUO IN PROGRESS ? + JRST SETBF6 ;YES TO EITHER QUESTION + + TLNN DEVDAT,INBFB ;INBUF DONE YET? + JRST SETBF1 ;NO +SETBFI: HRRZ TAC1,DEVIAD(DEVDAT) ;CALL HERE FROM INPUT - RING KNOWN TO BE AVAILABLE + JRST SETBF2 + +SETBF1: TLNN DEVDAT,OUTBFB ;OUTPUT DONE YET? + JRST SETBF6 ;NO +SETBFO: HRRZ TAC1,DEVOAD(DEVDAT) ;CALL HERE FROM OUTPUT - RING KNOWN TO BE AVAILABLE + +SETBF2: MOVE TAC1,2(TAC1) + + HRRZ AC1,TAC1 ;ADDRESS CHECK LOW END + PUSHJ PDP,UADRCK + MOVEI AC1,BLKSIZ-1(TAC1) + PUSHJ PDP,UADRCK + TLO IOS,UBFU ;BUFFER IN USER AREA +SETBF5: HRLI TAC1,NBLKSZ + MOVEM TAC1,DSKBUF(DEVDAT) + MOVEM IOS,DEVIOS(DEVDAT) + POPJ PDP, +;DUMP MODE, USE AREA IN FREE STORAGE. + +SETBF6: AOSE MQREQ + PUSHJ PDP,MQWAIT + TLO IUOS,UBFU ;BUFFER IN MONITOR CORE + MOVEI TAC1, MONBUF ;TAC1 POINTS TO MONITOR BUFFER + JRST SETBF5 + +;CLEAR THE BUFFER IN FREE STORAGE IF THERE. + +EXTERNAL BUFCLR,JOBFF,IADRCK +CLRBUF: SCHEDULE + TLZN IOS,DAFLG ;USING SAT BLOCK? + JRST .+3 + SOSL DAREQ ;YES. RELEASE + SETOM DAAVAL + TLZN IOS,AUFLG ;USING UFD? + JRST .+3 + SOSL AUREQ ;YES. RELEASE UFD + SETOM AUAVAL + TLZN IOS,UBFS ;USING MONITOR BUFFER? + JRST .+3 + SOSL MQREQ ;YES, RELEASE MONITOR BUFFER + SETOM MQAVAL + TLZ IOS,NCTRLC ;RENABLE ^C + TLZE IOS,UBFU ;USING BUFFER IN USER AREA + JRST CLRBF1 ;YES. CLEAR BUFFER + MOVEM IOS,DEVIOS(DEVDAT) + POPJ PDP, + +;CLEAR USER BUFFER AFTER USING + +CLRBF1: MOVEM IOS,DEVIOS(DEVDAT) + HRRZ TAC,DSKBUF(DEVDAT) ;GET LOC. OF BUFFER + CAML TAC,JOBFF(JDAT) ;ABOVE JOBFF> + POPJ PDP, ;NO. RETURN. + PUSHJ PDP,IADRCK + POPJ PDP, + SUBI TAC,2 ;SET TAC TO 2ND BUFFER WORD + SOS (PDP) ;BUFCLR WILL SKIP RETURN + JRST BUFCLR ;CLEAR THE BUFFER + +;FIND THE FIRST ZERO IN A SET OF WORDS +;ENTER WITH LH OF TAC SET TO NEGATIVE OF NUMBER OF WORDS. +; RH OF TAC CONTAINING ADDRESS OF FIRST WORD. +;CALL: PUSHJ PDP,GETZER +; EXIT1 NO ZEROS +; EXIT2 NORMAL +;NORMAL EXIT LEAVES TAG POINTING TO WORD CONTAING THE ZERO. +;AND TAC1 HAVING A 1-BIT IN THE POSITION OF THE ZERO. +; +;ENTER AT GETZR1 IF TAC1 IS ALL SET UP. +;CALLED AT UUO AND INTERRUPT LEVELS + +GETZER: MOVNI DAT,1 + JRST GETZ3 + +GETZ1: ROT TAC1,-1 + JUMPGE TAC1,GETZ3 + +GETZ2: AOBJP TAC,CPOPJ + CAMN DAT,(TAC) + JRST GETZ2 + +GETZ3: TONE TAC1,(TAC) + JRST GETZ1 + JRST CPOPJ + +;TIMING: M=NUMBER OF LEADING WORDS CONTAINING NO ZEROS +; M=NUMBER OF LEADING ONES IN M+1ST WORD + +; 38+12,8M+17.1N MIRCO-SECS + +;WORST CASE WITH 128 WORDS = 2.3 MILS + + +;FIND THE NUMBER OF ZERO BITS TO THE RIGHT OF A WORD +;CONTAINING A SINGLE 1-BIT +;ENTER WITH BIT IN TAC1, EXIT WITH RESIDUE IN TAC1. +;CALLED AT UUO AND INTERRUPT LEVELS + +RESIDU: TLNN TAC1,777000 + JRST RESID1 + LSH TAC1,-11 + TLOA TAC1,43000 +RESID1: TLO TAC1,32000 + FAD TAC1,[0] + LSH TAC1,-33 + POPJ PDP, + + +;FIND FOUR FREE WORDS OF CORE, RETURN AN ADDRESS IN TAC1 +;IT IS ASSUMED THAT THE CLOCK IS OFF. + + INTERN GETFCR + +GETFCR: MOVEI ITEM,1 ;REQUEST ONE 4 WORD BLOCK +GTCOR1: MOVEI AC1,LOCORE ;POINT TO THREE WORD FREE CORE ENTRY + MOVEI AC2,DDBTAB ;POINT TO BIT TABLE + PUSH PDP,DAT + PUSHJ PDP,GETBIT ;FIND A HOLE + JRST DFERR9 ;THERE ARE NONE + POP PDP,DAT + LSH TAC1,2 ;MULTIPLY BIT# BY 4 + SUBI TAC1,4 ;SYNCHRNIZE + ADD TAC1,LOCORE ;FORM CORE ADDRESS + POPJ PDP, + +INTERNAL GETBIT + + +;SEARCH THROUGH A TABLE TO FIND A SERIES OF ZERO-BITS. +;ENTER WITH AC1 SET UP AS IN CLRBIT ROUTINE, C(ITEM) SET TO THE +; SIZE HOLD DESIRED, +;CALLED AT UUO AND INTERRUPT LEVELS +;ON UNSUCCESSFUL RETURN DAT CONTAINS THE SIZE +;OF LARGETS HOLE ENCOUNTERED + +GETBIT: PUSH PDP,[-1] ;INITIALIZE LARGEST HOLD FOUND SO FAR + PUSH PDP,ITEM ;SAVE HOLD SIZE + MOVE TAC,2(AC1) ;TAC:=IOWD LENGTH OF TABLE,TABLE ADDRESS + MOVE TAC1,1(AC1) + PUSHJ PDP,GETZER ;FIND THE FIRST ZERO + JRST GTBIT5 ;NO ZEROS LEFT + MOVEM TAC1,1(AC1) ;SAVE THE SPOT + MOVEM TAC,2(AC1) + PUSH PDP,TAC + + PUSH PDP,TAC1 + +GTBIT1: AOS DAT ;INCREMENT SIZE OF HOLD BY 1 (GETZER LEFT DAT=-1) + SOJLE ITEM,GTBIT2 ;FOUND ENOUGH? + ROT TAC1,-1 ;NO + SKIPGE TAC1 + AOBJP TAC,GTBT1A ;JUMP IF TABLE EXHAUSTED + TDNN TAC1,(TAC) ;IS NEXT BIT ZERO? + JRST GTBIT1 ;YES, CONTINUE + +GTBT1A: CAMLE DAT,-3(PDP) ;NO. LARGEST HOLE SO FAR? + MOVEM DAT,-3(PDP) ;YES. SAVE SIZE + JUMPG TAC,GTBIT6 ;TABLE EXHAUSTED? IF SO, ERROR EXIT. + PUSHJ PDP,GETZER ;NO, TRY FURTHER ON + JRST GTBIT6 ;NO MORE, ERROR + MOVEM TAC1,(PDP) + MOVEM TAC,-1(PDP) + MOVE ITEM,-2(PDP) + JRST GTBIT1 + +GTBIT2: MOVE TAC1,(PDP) ;HOLE FOUND, SET BITS TO ONES + MOVE TAC,-1(PDP) + MOVE ITEM,-2(PDP) + +GTBIT3: ORM TAC1,(TAC) + SOJLE ITEM,GTBIT4 + ROT TAC1,1 + JUMPGE TAC1,GTBIT3 + AOBJN TAC,GTBIT3 ;THIS SHOULD ALWAYS JUMP + +GTBIT4: POP PDP,TAC1 + POP PDP,TAC + AOS -2(PDP) + HRRZS TAC + SUBI TAC,-1(AC2) + PUSHJ PDP,RESIDU + IMULI TAC,^D36 + SUBM TAC,TAC1 +GTBIT5: POP PDP,ITEM + POP PDP,DAT ;SIZE OF LARGEST HOLD FOUND IF UNSUCCESSFUL + POPJ PDP, + +GTBIT6: POP PDP,TAC + POP PDP,TAC1 + AOS -1(PDP) ;SIZE OF LARGEST HOLD MUST BE ADJUSTED + JRST GTBIT5 + +;FREE A FOUR WORD SECTION OF CORE. +;ENTER WITH ADDRESS IN TAC + + INTERNAL CLCOR1 + +CLRCOR: MOVEI ITEM,1 +CLCOR1: SUB TAC,LOCORE + LSH TAC,-2 + MOVEI AC1,LOCORE + MOVE AC2,CRINIT ;SEARCH FROM BEGINNING + +;CLEAR A SERIES OF BITS IN SOME TABLE +;ENTER WITH: C(TAC) SET TO A BIT NUMBER +; C(AC1) SET TO EITHER A SAT ENTRY OR FREE +; CORE ENTRY +; C(AC2) SET TO BEGINNING OF TABLE (IOWD FORM) +; C(ITEM) SET TO NUMBER OF BITS TO CLEAR +;EXIT WITH CORRECT BITS SET TO ZERO AND SET ENTRY OR FREE CORE +; ENTRY UPDATED IF NECESSARY. + +INTERNAL CLRBIT + +CLRBIT: IDIVI TAC,^D36 + HRLS TAC ;BOTH HALVES OF TAC CONTAIN + ; WORD INCREMENT + ADD TAC,AC2 + PUSH PDP,DAT + MOVN DAT,TAC1 + MOVSI TAC1,400000 + ROT TAC1,(DAT) + POP PDP,DAT + PUSH PDP,TAC + PUSH PDP,TAC1 + +CLRB4: ANDCAM TAC1,(TAC) ;CLEAR A BIT + SOJLE ITEM,CLRB5 ;IS THAT ALL? + ROT TAC1,-1 ;NO + JUMPGE TAC1,CLRB4 + AOBJN TAC,CLRB4 ;THIS SHOULD ALWAYS JUMP + +CLRB5: POP PDP,TAC1 + POP PDP,TAC + CAMLE TAC,2(AC1) ;NEED TO RESET? + POPJ PDP, ;NO + CAME TAC,2(AC1) + JRST CLRB2 ;YES + JUMPL TAC1,CLRB2 + SKIPGE 1(AC1) + JRST CLRB3 + CAML TAC1,1(AC1) +CLRB2: MOVEM TAC1,1(AC1) +CLRB3: MOVEM TAC,2(AC1) + POPJ PDP, + +SUBTTL QUEUEING AND INTERRUPT PROCESSING +;PUT A REQUEST IN THE USER QUEUE. +;ENTER AT QIN FOR INPUT. QOUT FOR OUTPUT. +;CALLED AT BOTH INTERRUPT AND UUO LEVELS + +EXTERNAL SETACT,CPOPJ + +QIN: SKIPA TAC1,DEVDAT ;* +QOUT: MOVEI TAC1,DEVOAD-DEVIAD(DEVDAT) ;* + + MOVEI TAC,TRIES ;*INITIALIZE ERROR COUNT + MOVEM TAC,DSKCNT(DEVDAT) ;* + PUSHJ PDP,SETACT ;*SET IOACT + MOVSI TAC,W8BIT ;*SET WAIT FLAG + ORM TAC,DEVIAD(TAC1) + NOSCHEDULE ;* + AOS USRCNT ;*INCREMENT COUNTER OF TRANSFER REQUESTS + + MOVNI DAT,1 ;* + EXCH DAT,DFBUSY ;* + JUMPN DAT,QIOEND ;*JUMP IF DISK BUSY + + ANDCAM TAC,DEVIAD(TAC1) ;* + CAME TAC1,DEVDAT ;* + MOVEI TAC,0 ;* + PUSHJ PDP,USRGO ;* + +QIOEND: SCHEDULE ;* + POPJ PDP, ;* + + +;PUT A REQUEST IN THE MONITOR QUEUE. +;ENTER AT MQIN FOR INPUT, MQOUT FOR OUTPUT. +;ENTER WITH C(TAC1 0-17) = -SIZE OF BLOCK +; C(TAC1 18-35) = CORE ADDRESS +; C(TAC 18-35) = LOGICAL BLOCK NUMBER + +INTERNAL MQIN,MQOUT +EXTERNAL MQREQ,MQWAIT,SETACT,MQUEUE,WSYNC + +MQIN: HRLZ TAC1,DEVDAT + TLOA TAC1,400000 ;BIT 0=1 IS READ INDICATOR +MQOUT: HRLZ TAC1,DEVDAT + IFN FTRCHK,< + TRNN TAC,-1 ;WRITING OR READING BLOCK NR 0 SHOULD NEVER OCCUR HERE + + HALT .+1 ;CONTINUING AFTER HALT WILL YIELD INFORMATION + ; LOSS ON THE DISK +> + HRLI TAC,TRIES + + MOVSM TAC,DSKCNT(DEVDAT);STASH AWAY BLOCK #, ERROR COUNT. + PUSHJ PDP,SETACT ;SET IOACT + NOSCHEDULE + TLNN IOS,UBFS+NORELB ;USING BUFFER IN FREE STORAGE? + HRR TAC1,PROG ;NO, RELOCATE + MOVEM TAC1,@MIPTR + + AOS AC1,MIPTR ;RING INDEX MIPTR + CAIL AC1,MQTOP + MOVEI AC1,MQUEUE + MOVEM AC1,MIPTR + + MOVNI AC1,1 + EXCH AC1,DFBUSY ;FORCE DFBUSY TO-1, EXTRACT PREVIOUS CONTENTS. + SKIPN AC1 ;ALREADY BUSY? + PUSHJ PDP,MONGO ;NO, START A MONITOR JOB + + SCHEDULE + PUSHJ PDP,WSYNC + HRRZ AC1,DSKCNT(DEVDAT) ;ANY ERRORS? + TRNN AC1,IODERR!IODTER!IOIMPM + AOS (PDP) ;NO, SKIP RETURN + POPJ PDP, + +;* +;* EVERYTHING FROM HERE THRU SETDUN CALLED AT INTERRUPT LEVEL +;* +;ROUTINE CALLED BY INTERRUPT IN DISK. +;CHECK JOB FOR ERRORS, THEN START UP ANY WAITING JOB. +;UPON ENTRY, THE ACS HAVE BEEN SAVED. IOS CONTAINS ANY ERROR +;FLAGS. + +INTERNAL DFINT,FTSWAP +EXTERNAL ADVBFE,ADVBFF,PJOBN,SETIOD,PIOMOD +EXTERNAL MQREQ,MQAVAL,DFRED,DFWRT +EXTERNAL JBTADR +EXTERNAL MQTOP,MQUEUE + +DFINT: + IFN FTSWAP,< + EXTERNAL SQREQ,SERA,SOGO,SWPINT + MOVE TAC,SERA ;*WAS THAT A SWAPPING JOB? + TLNE TAC,200000 ;* + JRST SWPINT ;*YES + > + SKIPN RUNUSR ;*WAS THAT A USER JOB? + JRST DFINT2 ;*NO, MUST HAVE BEEN MONITOR + + MOVS DEVDAT,RUNUSR ;*YES + ANDI DEVDAT,377777 ;*CLEAR READ INDICATOR BIT. + TRNE IOS,IOIMPM ;*WRITE-LOCK? + PUSHJ PDP,DINT1A ;*YES + TRNE IOS,IODTER!IODERR ;*ERRORS? + JRST DFINT9 ;*ERRORS +DFINTA: AOS DEVACC(DEVDAT) ;INCREMENT POINTER TO RETRIEVAL POINTER + AOS SETCNT(DEVDAT) ;INCREMENT RELATIVE BLOCK NUMBER + SOS USRCNT ;* + PUSHJ PDP,SETDUN ;*TURN OFF I/O WAIT + LDB TAC,PJOBN + MOVE PROG,JBTADR(TAC) ;*SET RELOC. AND PROT. FOR THIS JOB + + SKIPL RUNUSR ;*WAS IT A READ OR A WRITE? + JRST DFINT1 ;*WRITE + + MOVEI TAC,@DEVIAD(DEVDAT) ;*SET UP WORD COUNT + ADDI TAC,1 ;* + MOVEI TAC1,BLKSIZ + HRRM TAC1,@TAC + + IFG CHKCNT,< + MOVE TAC,DEVOAD(DEVDAT) + TLNE TAC,CKSUPR + JRST DINT0B + HRRZ TAC,DEVIAD(DEVDAT) + ADD TAC,[XWD NBLKSZ,2] + PUSHJ PDP,CHKSUM ;CLEAR IOACT + MOVE TAC,DEVACC(DEVDAT) + HLRZ TAC,-1(TAC) + CAMN TAC,TAC1 + JRST .+3 + PUSHJ PDP,CKREC3 + MOVEM IOS,DEVIOS(DEVDAT) + > +DINT0B: + PUSHJ PDP,DFINX ;ENTER INPUT ROUTINE + SKIPA +DFINT1: PUSHJ PDP,DFOUTX ;CHECK FOR MORE OUTPUT + SETZM RUNUSR + + JRST DFINT4 + +DINT1A: HRRZ TAC,DEVACC(DEVDAT) ;WRITE-LOCK FOUND, SET WLBIT + HRRZ TAC,-1(TAC) + JRST SETWL ;AND RETURN + +DFINT2: MOVS DEVDAT,@MOPTR ;IT WAS A MONITOR JOB + ANDI DEVDAT,377777 ;REMOVE POSSIBLE READ INDICATOR + TRNN IOS,IODERR!IODTER ;ERRORS? + JRST DFINT3 ;NO. + SOS TAC,DSKCNT(DEVDAT) ;YES,TRIED ENOUGH? + TRNE TAC,-1 + JRST DINT4A ;NO, TRY AGAIN. + +DFINT3: HRRM IOS,DSKCNT(DEVDAT) ;SAVE ANY ERRORS + HLRZ TAC,DSKCNT(DEVDAT) ;WRITE-LOCK ERROR? + TRNE IOS,IOIMPM + PUSHJ PDP,SETWL ;YES, SET WLBIT + PUSHJ PDP,SETDUN + SETZM @MOPTR ;REMOVE THIS MONITOR JOB + AOS TAC,MOPTR ;INCREMENT POINTER. + CAIL TAC,MQTOP + MOVEI TAC,MQUEUE + MOVEM TAC,MOPTR ;FALL THROUGH TO DFINT4 + +;DETERMINE NEXT TRANSFER TO MAKE ACCORDING TO PRIOROTY +; 1) SWAPPING 2) MQ I/O 3) BUFFERED MODE I/O +DFINT4: MOVEM IOS,DEVIOS(DEVDAT) ;CLEAR IOACT +DINT4A: IFN FTSWAP,< + SKIPE SQREQ ;SWAPPING JOB WAITING? + JRST SOGO ;YES,START IT + > +INTERNAL DINT4B + +DINT4B: SKIPE @MOPTR ;MONITOR JOB WAITING? + JRST MONGO ;YES, START IT UP + + SKIPL USRCNT ;USER WAITING? + JRST FINDV ;YES. + SETZM DFBUSY ;NO. TURN OFF BUSY FLAG + POPJ PDP, ;EXIT INTERRUPT + +;FIND A WAITING USER + +FINDV: HRRZ DEVDAT,DDBPTR + MOVSI TAC,W8BIT ;PREPARE TO TURN OFF WAIT INDICATOR + +DFINT5: HLRZ TAC1,(DEVDAT) ;END OF DISK DDBS? + SKIPE DEVDAT + CAIE TAC1,(SIXBIT /DSK/) + MOVEI DEVDAT,DSKDDB ;YES, RESET TO TOP + + SKIPGE DEVIAD(DEVDAT) ;ANY READS WAITING? + JRST DFINT7 ;YES + SKIPGE DEVOAD(DEVDAT) ;ANY WRITES WAITING? + JRST DFINT6 ;YES + HLRZ DEVDAT,DEVSER(DEVDAT) ;NO, TRY NEXT DDB + JRST DFINT5 + +;START UP A USER WRITE + +DFINT6: ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR OUTPUT WAIT BIT IN DDB + MOVEI TAC,0 ;PREPARE TO SET BIT 0=0 IN RUNUSR + JRST USRGO + +;START UP A USER READ + +DFINT7: ANDCAM TAC,DEVIAD(DEVDAT) ;CLEAR INPUT WAIT BIT IN DDB + +USRGO: MOVSM DEVDAT,RUNUSR ;SAVE DEVDAT FOR USE AT DFINT + ORM TAC,RUNUSR ;SET READ (B0=1) WRITE (B0=0) INDICATION + AOS UXFERS ;COUNT TOTAL USER TRANSFERS + LDB PROG,PJOBN ;SETUP RELOCATION FOR JOB + MOVE PROG,JBTADR(PROG) + MOVE TAC,DEVSER(DEVDAT) ;GET DDB LINK + MOVSM TAC,DDBPTR ;START SEARCH WITH NEXT DDB + MOVE TAC,DEVACC(DEVDAT) ;GET POINTER LOCATION + HRRZ TAC,(TAC) ;GET RETRIEVAL POINTER (XWD CHECKSUM BLOCK #) + MOVSI TAC1,NBLKSZ + SKIPL RUNUSR ;READ? + JRST USRGO3 + + HRRI TAC1,@DEVIAD(DEVDAT) ;GET ADDRESS OF RING BUFFER + AOJA TAC1,DFRED ;FROM IOWD AND READ + +USRGO3: HRRI TAC1,@DEVOAD(DEVDAT) ;GET ADDRESS OF OUTPUT BUFFER + AOJA TAC1,DFWRT ;FORM IOWD AND WRITE + + +;START UP A MONITOR READ OR WRITE + +MONGO: MOVS ITEM,@MOPTR ;XWD CORE ADDRESS, SAVED DEVDAT + ANDCMI ITEM,400000 ;CLEAR READ INDICATOR + MOVE TAC1,DSKBUF(ITEM) ;GET CONTROLLING IOWD + HLRZ TAC,ITEM ;GET CORE ADDRESS + ADD TAC1,TAC + HLL TAC1,DSKBUF(ITEM) ;RESTORE LH IN CASE ADDING REL. CAUSES OVRFL IN T LH + SUBI TAC1,1 ;FORM IOWD LENGTH ADDRESS + HLRZ TAC,DSKCNT(ITEM) ;GET LOGICAL BLOCK# + SKIPL @MOPTR + JRST DFWRT + JRST DFRED + +;ERROR ON USER JOB. + +DFINT9: AOS ECOUNT ;COUNT USER HARDWARE ERRORS + SOS TAC,DSKCNT(DEVDAT) ;TRIED ENOUGH?> + TRNN TAC,-1 + JRST DFINTA ;YES. + MOVE TAC,DEVDAT ;NO. RESET FLAG SO IT WILL GO AGAIN. + SKIPL RUNUSR ;READ? + ADDI TAC,DEVOAD-DEVIAD ;NO. + MOVSI TAC1,400000 + ORM TAC1,DEVIAD(TAC) ;RESTORE WAIT BIT TO DEVIAD OR DEVOAD + SETZM RUNUSR ;CLEAR USER INDICATOR + JRST DINT4A ;DO NEXT TASK. + +;CLEAR I/O DONE FLAG IF IT IS ON. + +SETDUN: ;* + OR IOS,DEVIOS(DEVDAT) ;* + ANDCMI IOS,IOACT ;* + TLZE IOS,IOW ;* + JRST SETIOD ;* + POPJ PDP, ;* + +SUBTTL ERRORS, SUBROUTINES. +;ERROR ROUTINES CALLED FROM UUO LEVEL + +EXTERN EXCALP,ERRPTU,TPOPJ + +DEFINE ERRORS (X),< + PUSHJ PDP,CLRBUF ;CLEAR ANY DUMP BUFFER + JSP TAC,ERRPTU ;OUTPUT A MESSAG + ASCIZ ^X^ + JRST EXCALP ;TYPE "UUO FROM" MESSAGE AND QUIT + > + +DFERR1: ERRORS + +DFERR2: MOVEI IOS,IOIMPM + ORB IOS,DEVIOS(DEVDAT) + POPJ PDP, + +DFERR3: ERRORS + +;THESE ERROR ROUTINES ARE GENERALLY CALLED AFTER SETLE HENCE 0(PDP) IS XWD PROJ,PROG + +DFERR6: MOVEI TAC,NORITE ;FILE ALREADY BEING ALTERED +DFERRY: HRRZ TAC1,UUO + ADD TAC1,[XWD PROG,ERRBIT] ;FORM POINTER TO UUO PARAMETER BLOCK + HRRM TAC,@TAC1 ;STORE ERROR CODE + POP PDP,TAC ;REMOVE XWD PROJ,PROG + JRST CLRBUF ;RELEASE ANY RESOURCES + +DFERR5: MOVEI TAC,PROTF ;PROTECTION FAILURE + JRST DFERRY + +DFERR4: MOVEI TAC,NOTINM ;USER NOT IN MFD + JRST DFERRY + +DFERR7: MOVEI TAC,NOTINU ;FILE NOT IN UFD + JRST DFERRY + +DFERR8: ERRORS + +DFERR9: SCHEDULE + ERRORS + +DFER10: MOVEI TAC,RENFAL + JRST DFERRY + +DFER11: MOVEI TAC,NOFILE + JRST DFERRY + +DFER12: MOVEI TAC,0 + PUSH PDP,TAC ;ADD SOMETHING TO BE REMOVED (SINCE SETLE NOT CALLED) + JRST DFERRY + +WERA: MOVSI IOS,NORELB + ANDCAB IOS,DEVIOS(DEVDAT) + ERRORS + +RERA: MOVSI IOS,NORELB + ANDCAB IOS,DEVIOS(DEVDAT) + ERRORS + +;CALLED AT BOTH INTERUPT AND UUO LEVELS +;COMPUTE CHECK-SUM +;ENTER WITH C(TAC 18-35) SET TO BUFFER ADDRESS +;RETURN WITH C(TAC1)SET TO ONES COMPLEMENT SUM IN RH. + +IFG CHKCNT, + +;TIMING OF MAIN LOOP IS 13.8 MICRO-SECS AVERGE. +;THIS IS 1.8 MILS OR SO FOR 128 WORDS. + +IFN >FTCHECK+FTMONP+FTSWAP, < + + INTERNAL CHECK +CHECK: MOVEI TAC,0 ;CLEAR SUM + JFCL 4,.+1 ;CLEAR CARRY0 FLAG + +CHKSM1: ADD TAC1(TAC) ;ADD NEXT WORD + JFCL 4,CHKSM3 ;JUMP IF CARRY 0 +CHKSM2: AOBJN TAC,CHKSM1 ;LOOP UNTIL DONE + HLRZ TAC,TAC1 ;ADD HALVES + HRRZS TAC1 + ADD TAC1,TAC + TLZE TAC1,1 ;CARRY INTO LH? + ADDI TAC1,1 ;YES BRING IT AROUND + POPJ PDP, +> + +;UPDATE DEVCNT IF NECESSARY. DEVCNT HAS SIZE OF FILE IN R.H. (IN WORDS IF POSSIBLE, +; OTHERWISE NEGATIVE BLOCK COUNT). +; ENTER WITH SIZE OF CURRENT BLOCK IN TAC1 +UPDEVC: HRRZ TAC,SETCNT(DEVDAT) ;*CONVERT CURRENT RELATIVE BLOCK NUMBER TO WORDS + SUBI TAC,1 ;* + LSH TAC,BLKP2 ;* + ADD TAC,TAC1 ;*ADD IN THE ADDITIONAL WORDS IN THIS NEXT + ; OUTPUT COMMAND. + HRRZ TAC1,DEVCNT(DEVDAT) ;*PICK UP PREVIOUS MAXIMUM FILE SIZE OF COMPARISON. + TRNE TAC1,400000 ;*PREVIOUS MAXIMUM SIZE GREATER THAN 2 EXP 17 WORDS? + JRST UPDVC2 ;*YES, THEN COMPARE AND SAVE NEGATIVE BLOCK COUNTS + TLNN TAC,-1 ;*NO, DOES THE NEWLY COMPUTED CURRENT FILE SIZE EXCEED + + ;* 2EXP17 WORDS? + TRNE TAC,40000 ;* + JRST UPDVC1 ;*YES, GO SAVE NEGATIVE BLOCK COUNT. + CAMLE TAC,TAC1 ;*NO, COMPARE POSITIVE WORD COUNTS + HRRM TAC,DEVCNT(DEVDAT) ;*UPDATE MAXIMUM FILE SIZE ONLY IF PREVIOUS + ; MAXIMUM EXCEEDED + POPJ PDP, ;* +UPDVC1: TRO TAC1,-1 ;*SET PREVIOUS MAXIMUM AS ONLY ONE + ;* (THUS FORCING CURRENT BLOCK COUNT TO BE STORED). +UPDVC2: ADDI TAC,BLKSIZ-1 ;*CONVERT POSITIVE WORD COUNT TO NEGATIVE + ; BLOCK COUNT. + LSH TAC,-BLKP2 ;* + MOVNS TAC ;* + TRON TAC,400000 ;*MORE THAN 2EXP17 BLOCKS (16,777,216 WORDS) + ; IN THIS FILE? + TROA IOS,IOBKTL ;*YES, (PREPOSTEROUS) SET ERROR BIT AND STORE + ; BLOCK COUNT WODULO 2EXP17 + CAILE TAC1,(TAC) ;*NO, COMPARE PREVIOUS MAXIMUM VERSUS PRESENT + ; FILE SIZE. + HRRM TAC,DEVCNT(DEVDAT) ;*STORE NEW MAXIMUM FILES SIZE ONLY IF PREVIOUS + ;* MAXIMUM EXEEDED. + POPJ PDP, ;* + +;OUTPUT WRITE-LOCK ERROR. FREE THE BLOCK AND GET NEW ONE. + +WLERA: HLR TAC,DSKCNT(DEVDAT) ;PICK UP BLOCK NUMBER. + PUSHJ PDP,SETFRE ;FREE THE BLOCK + JRST DFGETF ;GET ANOTHER. + +;SET WRITE-LOCK INDICATION IN A SAT ENTRY. +;ENTER WITH A BLOCK NUMBER IN TAC. + +SETWL: MOVEI TAC1,SETENT ;* + JRST .+2 ;* +SETWL1: ADDI TAC1,SENTSZ ;* + HLRZ ITEM,@TAC1 ;*IS THE BLOCK IN THIS SAT ENTRY? + CAML TAC,ITEM ;* + CAIL TAC,NUMBLK(ITEM) ;* + JRST SETWL1 ;*NO, LOOP. + MOVEI ITEM,WLBIT ;* + ORM ITEM,@TAC1 ;* + POPJ PDP, ;* + +DSKSR: END + diff --git a/src/dtasrn.mac b/src/dtasrn.mac new file mode 100644 index 0000000..2f8d0bd --- /dev/null +++ b/src/dtasrn.mac @@ -0,0 +1,1408 @@ +TITLE DTASRN - NEW FORMAT DECTAPE SERVICE FOR TD-10 (PDP-10) +SUBTTL T. WACHS/RCC TS 04 JUN 69 V406 + XP VDTASX,406 + ;DEFINE GLOBABL VERSION NUMBER FOR LOADER MAP. + IFNDEF ALMACT, + + ENTRY DTASRN +DTASRN: ;THIS ENTRY FOR SELECTIVE LOAD BYT BUILD + INTERNAL DTADSP +EXTERNAL TPOPJ,TPOPJ1,DTALOC,DTALC2,DTBOTH,WSYNC,DTACHL +EXTERNAL STOIOS,STOTAC,SETACT,CLRACT,OUT,DTASAV,PIOMOD +EXTERNAL DTAVAL,DTREQ,DTWAIT,SETIOD,THSDAT,PUNIT +EXTERNAL ADVBFE,ADVBFF,ADRERR,WAIT1,CPOPJ,CPOPJ1,BADDIR +EXTERNAL COMCHK,JOBPD1,DTTURN,PJOBN,RELEA9,UADCK1,STREQ +EXTERNAL CLOCK,JBTADR,DEVPHY,PION,PIOFF,DTTRY + +;DTALOC=PI LOC FOR DATA - CHANGED BY ROUTINE +;DTALC2=PI LOC+1 FOR DAT +;DTBOTH=10*(PI FOR DATA CHAN) + PI FOR FLAGS CHAN +;DTTURN=300200+DTBOTH (CONO FOR TURN-AROUND) + +BLK=4 + + +DIRBLK=^D100 ;NUMBER OF BLOCK FOR DIRECTORY + +TOPBLK=1101 ;HIGHEST LEGAL BLOCK NUMBER +NAMSTR=^D83 ;1ST NAME WORD IN DIRECTORY +QUANT=3 ;NUMBER OF BLOCKS CAN READ BEORE GIVING UP DTC +MINDIS=14 ;MINMUM NUMBER OF BLOCKS TO SEARCH BEFORE DISCONNECTING + ;FROM A TAPE +SPACE=4 ;NUMBER OF BLOCKS SEPERATING CONTIGUOUS BLKS OF A FILE + +;DDB MAGIC CELLS +FSTBLK=13 +DLOC=14 +IBLK=15 +OBLK=16 +DISPAD=17 +DMPLST=20 +SVDWRD=21 + ;FLAGS IN RH OF IOS +UDSD=100 +LSTSAV=20000 + +;FLAGS IN LH OF IOS +NOLINK=200 +CHNGDR=400 +RVERSE=1000 +SINGL=2000 ;JUST READ OR WRITE 1 BLOCK +DMPMOD=4000 +RWDIR=10000 +DMPCLS=20000 +NOBUF=40000 ;DATA GOING DIRECTLY INTO USER AREA +NOBUFC=737777 ;-NOBUF +REWBIT=100000 +RUNBIT=200000 +RECKON=400000 ;THIS TAPE IS DEAD-RECKONING. + ; (MUST BE SIGN BIT) + +CPBIT=-1 ;FEATURE TEST TO ALLOW IO INTO USER AREA DIRECTLY + ;IT WILL ONLY HAPPEN ON DUMP MODE WITH NON-STANDARD BIT + ;(UDSD) ON + EXTERN JIFSEC + + INTERN DTAINT,DTADDB,DTAINI,DTADDS,DTADSP + +DTADDB: SIXBIT /DTA0/ + XWD ^D60*HUNGST,200 + 0 + EXP DTADSP + XWD 1107,154403 + EXP 0,0 + + XWD PROG,0 + XWD PROG,0 + EXP 0,0,0 + + EXP DTADIR + EXP 0,0,0,0,0 + + +DTADIR: BLOCK 200 +DTADDS=.-DTADDR + + JRST DTAINI + JRST HUNGTP ;HUNG DEVICE +DTADSP JRST UREL + JRST UCLS + JRST UOUT + JRST UIN + JRST ENTR + JRST LOOK + JRST DMPO + JRST DMPI + JRST SETO + JRST SETI + JRST GETF + JRST RENAM + POPJ PDP, ;CLOSE INPUT + JRST UTPCLR +;FALL INTO MTAPE + HRRZ TAC1,UUO ;MTAPE - GET OPERATION + CAIE TAC1,1 ;REWIND OR + CAIN TAC1,11 ;REWIND UNLOAD ARE LEGAL + SOJA TAC1,MTA0 + POPJ PDP, ;OTHERS ARE NO-OPS + +;INITIALIZE DTC +DTAINI: CONO DTC,0 + SETZM DISCON + MOVEI TAC,^D1000 ;COMPUTE NO OF MILLISECS/TICK + IDIVI TAC,JIFSEC ;FOR THIS FREQUENCY CLOCK + ADDI TAC,1 ;ADD FUDGE FACTORE FOR SAFETY + HRRM TAC,MSECPT ;SAVE FOR CLOCK CALCULATION + POPJ PDP, + EXTERN JOBSAV +;LOOKUP A DIRECTORY ENTRY +LOOK: TRNE IOS,UDSD ;NON-STANDARD? + JRST CPOPJ1 ;YES. LOOKUP OK + PUSHJ PDP,DSERCH ;NO. FIND DIRECTORY ENTRY + POPJ PDP, ;NOT THERE + HRRZ TAC1,26(TAC) ;GET DATE, NO. OF 1K BLOCKS NEEDED + AOS UUO ;POINT UUO TO WORD 3 + MOVEM TAC1,@UUO ;INTO USER'S LOOKUP BLOCK +LOOKA: HLRE TAC,TAC ;GET INDEX + ADDI TAC,27 + SKIPN FSTBLK(DEVDAT) ;TAPE BEING WRITTEN? + HRLM TAC,OBLK(DEVDAT) ;NO. SAVE INDEX FOR POSSIUBLE OUTPUT + HRRM TAC,AC1 ;SAVE INDEX IN CASE LH(IBLK) IS + ;CHANGED BY DEAD-RECKONING + MOVEI TAC1,0 + PUSHJ PDP,BLKSRC ;COUNT NUMBER OF BLOCKS IN FILE + AOJA UUO,STOWD4 ;LAST BLOCK DONE + AOS TAC1 ;COUNT THE BLOCK + SOS 1(PDP) ;ADJUST FOR CORRECT RETURN + AOBJN PDP,BLKSRB ;LOOK FOR NEXT BLOCK + +;TAC1 HAS THE NUMBER OF BLOCKS BELONGING TO THE FILE +STOWD4: IMUL TAC1,[-177] ;-NUMBER OF WORDS IF ALL BLOCKS FULL + HRLZM TAC1,@UUO ;STORE IN DIRECOTRY WD 4 + SUBI UUO,2 ;POINT UUO TO DIRECORY WD 2 + TLZ IOS,IO ;MAKE SURE IO IS OFF + TLO IOS,SINGL ;JUST READ 1 RECORD + MOVEI BLK,DIRBLK ;NO, FIND FIRST MENTION OF BLOCK + PUSHJ PDP,LSTFRE+1 ;NEAR DIRECTORY + JUMPN BLK,LOOKE ;FOUND IF BLK NOT =0 +LOOKD: PUSHJ PDP,BLKSRC ;FIND FIRST MENTION IN DIRECTORY + JRST BDDIR ;NOT THERE - ERROR +LOOKE: PUSHJ PDP,RDBLUK ;GO READ IT + PUSHJ PDP,WAIT1 ;WAIT TILL IT'S IN + HRLM AC1,IBLK(DEVDAT) ;SAVE INDEX ON INPUT FILE FOR LATER + ;TEST ON ENTER - WONT ALLOW ENTER + ;TO BE DONE ON LOOKED-UP FILE + HRRZ BLK,IBLK(DEVDAT) ;GET FIRST BLOCK OF FILE +LOOKC: SKIPN FSTBLK(DEVDAT) ;IF FILE HAS NOT BEEN ENTERED + MOVEM BLK,FSTBLK(DEVDAT) ;SAVE IN DDB + HRRM BLK,@UUO ;SAVE IN USER'S AREA + HLL TAC,@UUO ;GET USER'S EXTENSION + HLLM TAC,DEVEXT(DEVDAT) ;SAVE IN DEVCE DATA BLOCK FOR RENAME AND + ; AND SUPERSEDING SHARED SEGMENTS + JRST CPOPJ1 ;AND TAKE GOOD EXIT + RENAM: PUSH PDP,UUO ;SAVE LOC OF NEW NAME + MOVEI UUO,DEVFIL(DEVDAT) ;SEARCH FOR OLD NAME + PUSHJ PDP,DSER1 + JRST RENER1 ;NOT FOUND - ERROR + POP PDP,UUO ;FOUND, RESTORE UUO + SKIPE @UUO ;RENAMING TO ZERO? + JRST RENAM2 ;NO. GO TO REAL RENAME + SETZM (TAC) ;YES. DELETE NAME IN DIR + SETZM 26(TAC) ;DELETE EXTENSION + SETZM DEVFIL(DEVDAT) ;ZERO DEVFIL + HLRE TAC,TAC ;GET INDEX OF FILE + ADDI TAC,27 + PUSHJ PDP,DLETE ;DELETE ALL BLOCKS OF FILE +RENAM1: TLO IOS,CHNGDR ;DIRECTORY HAS CHANGED + AOS (PDP) ;SET FOR GOOD RETURN + JRST STOIOS ;GO TO USER + +;COME HERE TO RENAME TO A REAL NEW NAME +RENAM2: MOVE DAT,TAC ;SAVE LOC OF NAME IN DIRECTORY + + PUSHJ PDP,DSERCH ;SEARCH FOR NEW NAME + SKIPA ;NOT FOUND - GOOD + JRST RENER2 ;NAME ALREADY EXISTS - ERROR + MOVE TAC,@UUO ;GET NEW NAME + MOVEM TAC,(DAT) ;SAVE IN DIR + AOS UUO + MOVE TAC,@UUO ;EXTENSION + HLLM TAC,26(DAT) ;SAVE IN DIR + HLLM TAC,DEVEXT(DEVDAT) ;SAVE INN DDB + JRST RENAM1 ;GIVE GOOD RETURN TO USER + +RENER1: POP PDP,UUO + TDZA TAC,TAC ;RH E+1 =0 +RENER2: MOVEI TAC,4 ;RH E+1 =4 + AOS UUO ;POINT TO 2ND WORD + HRRM TAC,@UUO ;SET ERRORR CODE + POPJ PDP, ;AND TAKE ERROR RETURN + ;SEARCH DIRECTORY FOR A MATCH +DSERCH: MOVEI AC1,3(UUO) ;CHECK VALIDITY OF ADDRESS + PUSHJ PDP,UADCK1 ;NEVER RETURN IF ADDR. OUT OF BOUNDS +DSER1: PUSHJ PDP,DIRCHK ;ENSURE DIRECTORY IS IN CORE + HRRZ TAC,DLOC(DEVDAT) ;LOCAION OF DIRECTORY + ADD TAC,[XWD -26,NAMSTR] ;POINT TO START OF NAMES +NMLOOK: SKIPN TAC1,@UUO ;GET NAME + JRST TPOPJ ;NULL ARGUMENT - ERROR RETURN + MOVEM TAC1,DEVFIL(DEVDAT) ;STORE FOR RENAME AND SUPERSEDING + ; SHARED SEGMENTS + CAMN TAC1,(TAC) ;TEST FOR MATCH + AOJA UUOI,NMFOUN ;FOUND NAME, CHECK EXTENSION + AOBJN TAC,.-2 ;TRY NEXT NAME + POPJ PDP, ;NOT FOUND +NMFOUN: HLLZ TAC1,@UUO ;PICK UP USER'S EXTENSION + XOR TAC1,26(TAC) ;TEST AGAINST DIRECTORY EXTENSION + TLNN TAC1,-1 ;MATCH? + JRST CPOPJ1 ;YES. RETURN + AOBJP TAC,.+2 + SOJA UUO,NMLOOK ;NO. TRY NEXT NAME + SOJA UUO,CPOPJ ;NAME NOT FOUND + +;CHECK IF DIRECTORY IS IN CORE, IF NOT, READ IT +DIRCHK: TRNN IOS,UDSD ;DONT BOTHER IF NON-STANDARD + SKIPG DEVMOD(DEVDAT) ;IS IT IN? + POPJ PDP, ;YES. RETURN + MOVEI BLK,DIRBLK ;BLOCK NUMBER + TLZ IOS,IO + PUSHJ PDP,GETDT ;GET CONTROL + TLO IOS,RWDIR ;JUST READ 1 BLOCK + PUSHJ PDP,READBC ;GO READ IT + PUSHJ PDP,WAIT1 ;WAIT TILL IN + MOVSI TAC1,DVDIRI ;SET DIRECTORY-IN-CORE BIT + ORM TAC1,DEVMOD(DEVDAT) + POPJ PDP, + ;SEARCH DIRECTORY FOR FILE WHOSE INDEX IS IN TAC +BLKSRC: MOVSI DAT,440500 ;DAT IS A BLOCK POINTER + HRR DAT,DLOC(DEVDAT) + MOVEI BLK,1 ;START AT BLOCK 1 + +BLKSRA: ILDB TEM,DAT ;INDEX OF NEXT BLOCK + CAMN TAC,TEM ;MATCH? + JRST CPOPJ1 ;YES. RETURN + +BLKSRB: CAIGE BLK,TOPBLK ;NO. SEARCHED LAST? + AOJA BLK,BLKSRA ;NO. TRY NEXT BLOCK + POPJ PDP, ;YES. RETURN + +;SET UP POINTER TO DIRECTORY FOR BLOCK IN BLK +SETPTR: PUSH PDP,BLK ;SAVE BLK + PUSHJ PDP,DRPTR ;SET BLK AS A BYTE POINTER + MOVE DAT,BLK ;RETURN IT IN DAT + POP PDP,BLK ;RESTORE BLK + POPJ PDP, ;AND RETURN + +;GET NEXT AVAILABLE FREE BLOCK +NXTFRE: PUSH PDP,TEM + PUSHJ PDP,SETPTR ;SET DAT TO A BYTE POINTER + MOVEI TAC,0 ;LOOK FOR FREE BLOCKS + PUSHJ PDP,BLKSRA ;FIND A ZERO BLOCK + MOVEI BLK,0 ;NOT THERE- RETURN 0 +FREXIT: POP PDP,TEM + POPJ PDP, + +;GET PREVIOUS FREE BLOCK +LSTFRE: MOVEI TAC,0 + PUSH PDP,TEM + ADDI BLK,2 + PUSHJ PDP,SETPTR ;SET DAT AS A POINTER + SUBI BLK,2 + PUSHJ PDP,DECPTR ;DECREMENT BYTE POINTER + LDB TEM,DAT ;INDEX TO BLOCK + CAMN TEM,TAC ;FOUND? + JRST FREXIT ;YES. RETURN + SOJG BLK,.-4 ;TRY AGAIN IF NOT AT START + JRST FREXIT ;REACHED START - RETURN BLK=0 + +;DECREMENT BYTE POINTER +DECPTR: JUMPL DAT,.+5 + ADD DAT,[BYTE (6) 5] ;DECREMENT + JUMPG DAT,CPOPJ ;IF POSITIVE - SAME WORD + HRLI DAT,010500 ;RESET TO PREVIOS WORD + SOJA DAT,CPOPJ + HRLI DAT,060500 + SOJA DAT,CPOPJ + + ;COME HERE TO DELETE THE FILE WHOSE INDEX IS INN TAC +DLETE: MOVEI TAC1,0 ;SET TO DELETE BLOCKS + PUSHJ PDP,BLKSRC ;FIND A BLOCK BELONGING TO FILE + JRST CPOPJ ;ALL THROUGH + DPB TAC1,DAT ;DELETE IT + SOS 1(PDP) ;ADJUST PDL FOR RETURN + AOBJN PDP,BLKSRB ;AND FIND NEXT MATCH + + +;ENTER A FILE NAME IN DIRECTORY +ENTR: TRNE IOS,UDSD ;NON STANDARD? + JRST CPOPJ1 ;YES. RETURN + PUSHJ PDP,DSERCH ;NO. LOOK FOR MATCH + JRST NEWNT ;THIS IS A NEW ENTRY +ENTR2: MOVE TAC1,@UUO ;PICK UP 2ND WORD (EXTENSSION) + AOS UUO ;POINT TO WORD 3 + HRR TAC1,@UUO ;ADD DATE + TRNN TAC1,7777 ;IS DATE ALREADY THERE? + IOR TAC1,THSDAT ;NO, ADD CURRENT DATE + MOVEM TAC1,26(TAC) ;INTO DIRECTORY + SKIPGE AC3,OBLK(DEVDAT) ;IS THIS A SAVE FILE (UGETF DONE + ;BEFORE THE ENTER?) + AOJA UUO,SETWD4 ;YES. STORE LENGTH IN DIRECTORY +ENTRA: SUBI UUO,2 ;NO. POINT TO NAME + MOVE TAC1,@UUO ;PICK IT UP + MOVEM TAC1,(TAC) ;INTO DIRECTORY + HLRE TAC,TAC ;COMPUTE INDEX OF FILE + ADDI TAC,27 + HLRZ DAT,IBLK(DEVDAT) ;INDEX OF INPUT FILE + SUB DAT,TAC ;WRITE SAME FILE AS READING? + JUMPE DAT,CPOPJ ;TAKE ERROR RETURN IF YES + HRLM TAC,OBLK(DEVDAT) ;SAVE INDEX IN DDB + + PUSHJ PDP,DLETE ;DELETE ALL BLOCKS BELONGING TO FILE + AOJE AC3,FNTRD ;FIND FIRST FREE BLOCK ON TAPE IF THIS + ;IS A SAVE FILE (UGETF DONE) + MOVEI BLK,DIRBLK ;NO. GET 1ST BLOCK CLOSE TO + TLO IOS,RVERSE ;DIRECTORY. GOING IN REVERSE + POPJ PDP,USLSTA + CAILE BLK,TOPBLK ;BLOCK LEGAL? + POPJ PDP, ;NO. ERROR RETURN +ENTRC: MOVEM BLK,FSTBLK(DEVDAT) ;SAVE AS 1ST BLOCK + HRRM BLK,OBLK(DEVDAT) ;SAVE IN DDB + AOS UUO ;POINT UUO TO WORD 2 + HRRM BLK,@UUO ;SAVE 1ST BLOCK IN USER'S AREA + HLL TAC,@UUO ;GET EXTENSION + HLLM TAC,DEVEXT(DEVDAT) ;SAVE EXTENSION IN DDB ALSO + TLO IOS,NOLINK + AOS (PDP) + ;MARK DIRECTORY ENTRY POINTED TO BY BLK AS TAKEN +MARKDR: PUSHJ PDP,DRPTR ;SET POINTER TO BLOCK IN DIR + HLRZ TAC,OBLK(DEVDAT) ;PICK UP INDEX + IDPB TAC,BLK ;MARK DIRECTORY + TLO IOS,CHNGDR ;DIRECTORY HAS CHANGED + JRST STOIOS + +;;SET POINTER TO CORRECT DIRECTORY ENTRY +DRPTR: SUBI BLK,1 ;SET FOR ILDB OR IDPB + IDIVI BLK,7 ;COMPUTE WORD, POSITION + ADD BLK,OLOC(DEVDAT) ;GET CORRECT ADDRESS + HRLI BLK,440500 ;MAKE IT A BYTE POINTER + JUMPE DAT,CPOPJ ;CORRECT FOR POSITION IN WORD + IBP BLK + SOJG DAT,.-1 + POPJ PDP, + +;HERE FOR NEW FILE NAME ON ENTER +NEWENT: SUB TAC,[XWD 26,26];START AT BEGINNING OF DIRECT. + + SKIPN (TAC) ;FIND A FREE SLOT + AOJA UUO,ENTR2 ;RETURN WITH UUO POINTING TO WRD 2 + AOBJN TAC,.-2 + POPJ PDP, ;NONE AVAILABLE. + +;SET UP LENGTH OF FILE IN DIRECTORY FOR A SAVE FILE +SETWD4: HLRE TAC1,@UUO ;GET -LENGTH + MOVNS TAC1 ;+LENGTH + HRRE TEM,@UUO + ADD TAC1,TEM ; +START ADDRESS + TRZ TAC1,1777 ;STORE N-1, WHERE N IS NO OF K + LSH TAC1,2 + ORM TAC1,26(TAC) ;INTO 2ND WRD OF DIRECTORY + SOJA UUO,ENTRA ;CONTINUE WITH ENTER + +ENTRD: MOVEI TAC,0 ;GET THE 1ST FREE BLOCK ON TAPE + PUSHJ PDP,BLKSRC ;AS THE 1ST LOGICAL BLOCK OF THE FILE + POPJ PDP, ;NONE AVAILABLE + JRST ENTRC ;CONTINUE WITH ENTER + ;USETI - SET NEXT INPUT BLOCK TO READ +SETI: TDZ IOS,[XWD IOEND,IODEND] + SKIPA DAT,DEVDAT + +;USETO - SET NEXT OUTPUT BLOCK TO READ +SETO: MOVEI DAT,1(DEVDAT) + PUSHJ PDP,WAIT1 ;WAIT FOR BUFFERES TO FILL (OR EMPTY) + HRRM UUO,IBLK(DAT) ;SET BLOCK NUMBER + JRST STOIOS ;STOE IOS, POPJ + +;UGETF - GET NEXT FREE BLOCK FOR THIS FILE +GETF: PUSHJ PDP,WAIT1 ;WAIT TILL BUFFERES EMPTY + PUSHJ PDP,DIRCHK ;ENSURE DIR, IN CORE + PUSHJ PDP,USRFRE ;GET NEXT AVAILABLE BLOCK + SKIPN OBLK(DEVDAT) ;HAS AN ENTER OR LOOKUP BEEN DONE? + SETOB BLK,OBLK(DEVDAT) ;NO, SET SWITCH SO THAT THE NEXT ENTER + ;WILL FINE FIRST FREE BLOCK ON TAPE + MOVE TAC,BLK ;TELL USER THE BLOCK NUMBER + JRST STOTAC + +;GET NEXT (OR PREVIOUS) FREE BLOCK +USRFRE: MOVEI TEM,SPACE ;BLOCKS "SPACE" APART + LDB BLK,PIOMOD ;EXCEPT DUMP AND SAVMOD FILES + CAIL BLK,SD ;OR ONE OF DUMP MODES? + MOVEI TEM,2 ;YES, WHICH ARE CLOSRER +USRFRA: HRRZ BLK,OBLK(DEVDAT) ;CURRENT BLOCK + TLNE IOS,RVERSE ;FORWARD? + JRST USRLST ;NO + ADDI BLK,(TEM) ;YES, FIND NEXT BLOCK AT LEAST N + CAILE BLK,TOPBLK + TDZA BLK,BLK +CALNXT: PUSHJ PDP,NXTFRE ;BLOCKS PAST THIS ONE + JUMPN BLK,STOIOS ;RETURN IF FOUND + TLOE TEM,1 ;FOUND NONE ON THIS PASS + JRST NOBLKS ;TAPE IS FULL + TLC IOS,RVERSE ;REVERSE DIRECTION + HRRI TEM,1 ;START LOOKING AT NEXT BLOCK IN OTHER DIRECTION + JRST USRFRA +USRLST: SUBI BLK,(TEM) ;LOOK FOR FREE BLOCK N BEFORE + SKIPG BLK + TDZA BLK,BLK ;REVERSE IF AT FRONT OF TAPE +USLSTA: PUSHJ PDP,LSTFRE ;THIS ONE + JRST CALNXT+1 + +;NO FREE BLOCKS AVAILABLE. GIVE HIGH BLOCK,SET IOBKTL LATER +NOBLKS: MOVEI BLK,TOPBLK+1 ;SET HIGH BLOCK + POPJ PDP, + ;UTPCLR UUO +UTPCLR: TRNE IOS,UDSD + POPJ PDP, ;FORGET IT FOR NON-STANDARD + MOVSI TAC,DVDIRIN ;SET DIRECTORY-IN-CORE BIT + ORM TAC,DEVMOD(DEVDAT) + TLO IOS,CHNGDR ;DIRECTORY HAS CHANGED + HRRZ TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY + HRL TAC1,TAC + HRRI TAC1,1(TAC) ;BLT POINTER + SETZM (TAC) + BLT TAC1,176(TAC) ;LEAVE LAST WORD IN DIR, ALONE + MOVSI TAC1,17000 ;MARK DIRECTORY AS UNAVAILABLE + MOVEM TAC1,16(TAC) + MOVSI TAC1,757000 ;RESERVE BLOCKS 1 AND 2 + MOVEM TAC1,(TAC) ;FOR READ IN MODE LOADER + MOVSI TAC1,777770 ;MARK BLOCKS 1102-1105 AS + ORCAM TAC1,NAMSTR-1(TAC) ;UNAVAILABLE ALSO + JRST STOIOS + ;CLOSE UUO +UCLS: TLZE IOS,NOLINK ;IS LAST BLOCK NOT LINKED? + TRNE IOS,UDSD ;AND NOT NON-STD? + JRST STOIOS ;YES, RETURN + LDB TAC,PIOMOD ;NO. WRITE LAST BLOCK + CAIL TAC,16 ;DUMPO MODE? + JRST CLSDMP ;YES. CLOSE DUMP MODE + MOVEI TAC,@DEVOAD(DEVDAT) ;LOC OF BUFFER + MOVE TAC1,1(TAC) ;LINK WORD + TLON TAC1,-1 ;LINK=-1 IF NOT SPECIFIED + MOVEM TAC1,1(TAC) ;LINK = -1... EOF + MOVEM IOS,DEVIOS(DEVDAT) ;SAVE IOS + JRST OUT ;GO TO WRITE RECORD + +;HERE TO CLOSE A DUMP MODE FILE +CLSDMP: TLO IOS,DMPOCLS+IO+DMPMOD ;SET SWITCHES + PUSHJ PDP,GETDT ;GET CONTROL + SETZM BUF ;ENSURE ZERO LINK,WORDCOUNT + SETZM BUF+1 ;MAKE SURE 0, SO CAN GET WITH 3 SERIES MON. + ;FILES SAVED WITH 4 SERIES MONITOR. + JRST OUFULL ;GO WRITE THE BLOCK + ;RELEASE UUO +UREL: PUSHJ PDP,WAIT1 ;MAKE SURE THE TAPE IS STOPPED + PUSHJ PDP,NXTCM2 ;CLEAR OUT DUMP-MODE STUFF + MOVSI TAC,DVDIRIN ;IF NONSTANDARD, WILL CLEAR + TRZE IOS,UDSD ;CLEAR NON-STANDARD BIT. + ANDCAM TAC,DEVMOD(DEVDAT) ;SO DIRECTORY WILL BE READ ANEW + SKIPG DEVMOD(DEVDAT) ;IF DIRECTORY HAS BEEN + TLZN IOS,CHNGDR ;MODIFIED IT MUST BE WRITTEN + JRST UREL2 ;IT HASN'T BEEN CHANGED + TLO IOS,IO + PUSHJ PDP,GETDT ;WAIT TILL DTC AVAILABLE + TLO IOS,RWDIR ;GOING TO WRITE DIRECTORY + MOVEI BLK,DIRBLK ;BLOCK NUMBER + PUSHJ PDP,WRTBLK ;WRITE UT + PUSHJ PDP,WAIT1 ;WAIT TILL IT HAS BEEN WRITTEN + +UREL2: MOVE TAC,DEVIAD(DEVDAT) ;BITS 1,2 ARE COUNT OF CHANS + TLNE TAC,200000 ;DEV INITED ON ANOTHER CHANNEL TOO? + +QUANTL: POPJ PDP,QUANT ;YES, DON'T ZAP IOS OR DDB + +;SOME BITS IN THE IOS WORD AND THE DDB WILL NORMALLY BE CHANGED ON THE +;INTERRUPT LEVEL AFTER THE RELEASE, BUT HNGSTP CAN CAUSE THESE ACTIONS +;NEVER TO OCCUR, SO MAKE SURE THEY REALLY HAPPENED + TLZ IOS,77600 ;ZERO IOS BITS + SETZM OBLK(DEVDAT) ;AND OBLK + SETZM IBLK(DEVDAT) ;ZERO IBLK SO WRITING A FILE AFTER READING + ;IT WILL WORK (CHECK IS MADE AT ENTER) + SETZM FSTBLK(DEVDAT) + JRST STOIOS ;STORE IOS AND RETURN + GETDT0: PUSHJ PDP,SETACT ;WAIT TILL TAPE COMES OUT OF REWIND + PUSHJ PDP,WSYNC ;BEFORE DOING ANYTHING ELSE TO IT +;GET DEC TAPE CONTROLLER +GETDT: TLNE IOS,REWBIT ;IF TAPE IS REWINDING NOW + JRST GETDT0 ;WAIT TILL THRU BEFORE CONTINUING +GETDT1: AOSE DTREQ ;CAN I HAVE IT + PUSHJ PDP,DTWAIT ;NO. COME BACK LATER + LDB TAC,PUNIT ;HAVE CONTROL NOW + LSH TAC,11 ;CONNECT TO DTA + CONO DTC,30000(TAC) ;SEE IF TAPE IS OK + CONSZ DTS,100 ;SELECT ERROR? + JRST QUEST ;YES. COMPLAIN + TLNE IOS,IO ;NO. TRYING TO WRITE TAPE? + CONSO DTS,4000 ;YES. WRITE PROTECTED? + SKIPA TAC,QUANTL ;NO. EVERYTHING IS OK + JRST QUEST ;YES. COMPLAIN + HRRZM TAC,QUANTM ;SFT UP NUMBER OF BLOCK TO KEEP CONTROL FOR + CONO DTC,10000 ;DESELECT CONTROL SO FNDBLK TEST + ;WILL WORK RIGHT (CONCO DTC,20000) + MOVEM DEVDAT,USEWRD ;SAVE ACS NEEDED ON INTERRUPT LEVEL + JRST SETACT ;LIGHT IOACT AND RETURN + +;COME HERE TO COMPLAIN ABOUT UNIT NOT RIGHT (SELECT OR PROTECT ERROR) +QUEST: PUSHJ PDP,THRUTD ;GIVE UP CONTROL + PUSHJ PDP,HNGSTP ;TYPE "DTAN OK?" + ;NOTE -- AC BLK (=ITEM) USED TO BE + ; PUSHED HERE, BUT IS NOT ANY LONGER + ; BECAUSE HNGSTP NOW PRESERVES IT, + ; AND THE STACK IS VERY FULL. + JRST GETDT1 ;GET CONTROL AGAIN AND RETRY + EXTERN JOBDDT,USRDDT +;DUMP MODE INPUT +DMPI: IFN CPBIT, < + HRRZ AC2,IBLK(DEVDAT) +> + TLZ IOS,IO + PUSHJ PDP,DMPSET ;SET UP DUMP-MODE STUFF + JRST ZERCOR ;ZER USER'S CORE IF SAVE-MODE + + +;INPUT UUO +UIN: TLZ IOS,IO + HRRZ BLK,IBLK(DEVDAT) ;BLOCK TO READ + PUSHJ PDP,STOIOS + TRNE IOS,UDSD ;NON STANDAR? + JRST READBF + JUMPE BLK,EOF ;0 MEANS EOF + PUSHJ PDP,BLKCHK ;CHECK LEGALITY OF BLOCK NUMBER + TLNN IOS,DMPMOD ;DUMP MODE? + + CAIE BLK,DIRBLK ;TRYING TO READ DIRECTORY? + JRST READBF ;NO. GO READ + +;READING DIRECTORY - GIVE CORE IMAGE IF IT EXISTS + PUSHJ PDP,DIRCHK ;READ IT IF IT ISN'T IN ALREADY + HRL TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY + MOVEI TAC1,@DEVIAD(DEVDAT) ;WHERE USER WANTS IT + HRRI TAC,1(TAC1) ;LOC OF DATA + BLT TAC,200(TAC1) ;GIVE IT TO HIM + PUSHJ PDP,ADVBFF ;ADVANCE BUFFERS + JFCL + POPJ PDP, + ;CHECK VALIDITY OF BLOCK NUMBER +BLKCHK: CAIG BLK,TOPBLK ;LEGAL? + POPJ PDP, ;YES. RETURN + POP PDP,TAC + TROA IOS,IOBKTL ;NO. LIGHT ERROR BIT + +;INPUT BLOCK = 0 - END OF FILE +EOF: TLO IOS,IOEND ;LIGHT EOF BIT + TLNN IOS,DMPMOD + JRST STOIOS + JRST DMPEOF ;GIVE UP CONTROL IF DUMP-MODE + +;ZERO USER'S CORE ON SAVE-MODE INPUT +ZERCOR: MOVEI TAC,JOBDDT(PROG) ;ZERO CORE + HRLI TAC,1(TAC) + MOVSS TAC ;BLT POINTER + HRRZ TAC1,DMPLST(DEVDAT) ;TOP CELL TO ZERO (-175) + ADDI TAC1,(PROG) ;RELOCATE TO USER AREA + SETZM -1(TAC) ;ZERO + BLT TAC,(TAC1) + SETZM USRDDT ;DDT IS KEPT IN PROTECTED PART + JRST UIN + ;DUMP MODE OUTPUT +DMPO: PUSHJ PDP,DIRCHK ;MAKE SURE DIRECTORY IS IN CORE + IFN CPBIT, < + HRRZ AC2,OBLK(DEVDAT) +> + TLO IOS,IO + PUSHJ PDP,DMPSET ;SET DUMPO-MODE POINTERS + JFCL + +;OUTPUT UUO +UOUT: TLO IOS,IO + TRNE IOS,UDSD ;NON STANDARD? + JRST UOUT2 ;YES + PUSHJ PDP,DIRCHK ;NO. MAKE SURE DIRECTORY IS IN CORE + TLO IOS,IO ;IF DIRCHK READ, IO WENT OFF + HRRZ BLK,OBLK(DEVDAT) + CAIN BLK,DIRBLKK ;CHECK IF WRITING DIRECTORY + JRST COR2HM ;YES, WRITE CORE IMAGE + JUMPE BLK,FAKAV ;DONT WRITE IF NO BLOCK GIVEN + + PUSHJ PDP,BLKCHK ;CHECK FOR LEGAL BLOCK +UOUT2: TLNN IOS,DMPMOD ;ALREADY HAVE CONTROL IF DUMP-MODE + PUSHJ PDP,GETDT ;GET DEC TAPE CONTROLLER +FILBUF: +DTOCHK: TLNE IOS,DMPMOD ;DUMP MODE? + JRST DMPFIL ;YES, FILL BUFFER FROM LIST + MOVSI TAC,@DEVOAD(DEVDAT) ;LOCATION OF BUFFER + ADD TAC,[XWD 1,BUF];SET TO STORE IN MONITOR BUFFER + BLT TAC,BUF+177 ;GO BLT IT + TLZ IOS,NOLINK + OUFULL: TRNE IOS,UDSD ;NON-STANDARD? + JRST OUTBL2 ;YES, NO FILE-STRUCTURED OPERATIONS + HLRE BLK,BUF ;IS IT? + JUMPL BLK,LSTBLK ;YES, - LAST BLOCK OF FILE + JUMPN BLK,OUTBLK ;IF NON-0 - YES + TLNE IOS,DMPCLS ;NO. LAST BLOCK OF A DUMPO FILE? + ;DMPCLS WILL BE TURNED OFF AT THE INTERRUPT + JRST OUTBLK ;YES. LINK MUST STAY 0 +OUCOMP: PUSHJ PDP,USRFRE ;COMPUTE NEXT BLOCK + TLO IOS,NOLINK ;THIS BLOCK NOT LINKED +OUTBLK: HRLM BLK,BUF ;SAVE LINK IN 1ST WORD OF BLOCK + MOVE TEM,FSTBLK(DEVDAT) ;STORE 1ST BLOCK OF FILE IN WORD + DPB TEM,[POINT 10,BUF,27] + HRRZ TEM,OBLK(DEVDAT) ;BLOCK TO WRITE NOW + HRRM BLK,OBLK(DEVDAT) ;BLOCK TO WRITE NEXT + MOVE BLK,TEM + PUSHJ PDP,BLKCHK ;CHECK LEGALITY OF BLOCK + PUSHJ PDP,MARKDR ;MARK BLOCK TAKEN IN DIRECTORY + SKIPA BLK,TEM +OUTBL2: HRRZ BLK,OBLK(DEVDAT) + PUSHJ PDP,STOIOS + +WRTBLK: PUSHJ PDP,FNDBLK ;GO SEARCH FOR BLOCK + MOVE TAC1,[BLKO DTC,700] ;HERE WE ARE - GO WRITE + JRST RDWRT + ;WRITE LAST BLOCK +LSTBLK: MOVEI BLK,0 ;LINK=0 + JRST OUTBLK ;GO WRITE LAST BLOCK + +;TRYING TO WRITE DIRECTORY - STORE IN CORE +COR2HM: MOVEI TAC,@DEVOAD(DEVDAT) ;WHERE IT IS + HRLI TAC,1(TAC) + HRR TAC,DLOC(DEVDAT) ;WHERE TO PUT IT + MOVEI TAC1,177(TAC) + BLT TAC,(TAC1) + TLO IOS,CHNGDR ;REMEMBER TO WRITE IT OUT + MOVSI TAC1,DVDIRI + ORM TAC1,DEVMOD(DEVDAT) ;DIR. IS NOW IN CORE +FAKADV: TLZE IOS,DMPMOD ;DUMP MODE? + JRST THRUTD ;YES. GIVE UP CONTROL + PUSHJ PDP,ADVBFE ;ADVANCE BUFFERS + JFCL + TLZ IOS,NOLINK ;DIRECTORY BLOCK IS NOT LINKED + SETZM OBLK(DEVDAT) + JRST STOIOS + ;SET UP POINTERS AND STUFF FOR DUMP-MODE +DMPSET: PUSHJ PDP,GETDT ;GET CONTROL + TLO IOS,DMPMOD ;LIGHT BIT + PUSHJ PDP,COMCHK ;CHECK VALIDITY OF LIST + JRST SVADER ;NG. GIVE ADRESS ERROR + SKIPL TAC,@UUO ;OK. NULL LIST? + JRST DMPTS1 ;YES. RETURN + IFN CPBIT, < + TRNE IOS,UDSD ;NO. NON-STD MODE? + SOJA DAT,TDUSER ;YES. GO ELSEWHERE +> +DMPST2: SOS UUO ;NO. SAVE START OF LIST (-1) + MOVEM UUO,DMPLST(DEVDAT) + JRST CPOPJ1 + +DMPTS1: POP PDP,TAC + JRST THRUTD + + IFN CPBIT, < +;HERE TO START DUMP-MODE INTO USER AREA DIRECTLY +TOUSRF: JUMPE AC2,NOBLK0 ;CANT READ BLK 0 IN NON-STD DUMP MODE + ASH DAT,-7 ;NUMBER OF WRDS IN LIST /200 + AOS DAT + MOVEM DAT,BLKCNT ;SAVE TO UPDATE POSITION + MOVEI UUO,@UUO ;REAL ADDRESS OF LIST +TOUSR1: MOVEM UUO,USPNTR ;SAVE IT + MOVEM UUO,SVPNTR + ADDI TAC,(PROG) ;RELOCATE ADDRESS OF 1ST IOWD + MOVEM TAC,PNTR ;AND SAVE IT + MOVE TAC,[JSP DMPADV] ;SET UP LOC FOR WHEN + MOVEM TAC,DTALC2 ;IOWD IS EXHAUSTED + HRRZM PROG,ADRPRG ;SAVE JUST ADDRESS OF PROG + TLO IOS,NOBUF ;INDICATE DIRECTLY TO USER + TLNN IOS,IO + JRST CPOPJ1 ;READING - CONTINUE + POP PDP,TAC ;WRITING - THIS WILL SAVE LOTS OF TIME + JRST OUTBL2 + +NOBLK0: TRO IOS,IOIMPM + POP PDP,TAC ;RETURN TO UUOCON WITH ERROR BIT SET + JRST THRUTD +> + ;FILL OUTPUT BUFFER FROM LIST +DMPFIL: MOVSI TAC1,-177 + IFE CPBIT, < + TRNE IOS,UDSD + SUB TAC1,ONEONE ;200 DATA WORDS IF NON-STANDARD +> +DMPFLB: PUSHJ PDP,NXTCOM ;GET NEXT COMMAND + JRST DMPOTH ;END OF LIST +DMPLFA: MOVE TEM,(TAC) ;GET NEXT WORD + MOVEM TEM,BUF+1(TAC1) ;INTO BUFFER + AOBJP TAC1,DMPOVR ;BUFFER FULL IF GOES + AOBJN TAC,.-3 ;GET NEXT WORD FROM COMMAND + JRST DMPFLB ;GET NEXT COMMAND + +DMPOTH: + IFE CPBIT, < + TRNN IOS,UDSD +> + HRRZM TAC1,BUF ;LIST RAN OUT SAVE WORD COUNT + SETZM BUF+1(TAC1) ;ZERO REST OF BUFFER + HRRZI TAC1,BUF+2(TAC1) + CAILE TAC1,BUF+177 ;JUST ZERO 1 WORD IF AT TOP + JRST OUFULL + HRLI TAC1,-1(TAC1) + BLT TAC1,BUF+177 ;****TEST IF TOP OF BUFFER + JRST OUFULL ;NOW WRITE BUFFER + +;BUFFER FULL BEFORE END OF COMMAND +DMPOVR: AOBJN TAC,.+3 ;WAS THAT LAST WORD OF COMMAND? + PUSHJ PDP,NXTCOM ;YES. GET NEXT + MOVEI TAC,0 + MOVEM TAC,SVDWRD(DEVDAT) ;NO. SAVE REMAINDER OF COMMAND +DMPOVA: MOVEI TAC,177 + IFE CPBIT, < + TRNN IOS,UDSD +> + MOVEM TAC,BUF ;WD CNT =177 + JRST OUFULL ;GO WRITE PART OF STUFF + +;GET NEXT COMMAND FROM LIST +NXTCOM: SKIPN DMPLST(DEVDAT) ;END OF COMMANDS? + JRST NXTCM2 ;YES. RETURN + AOSA TAC,DMPLST(DEVDAT) ;GET NEXT COMMAND +NXTCM1: HRRM TAC,DMPLST(DEVDAT) ;STORE GO-TO ADDRESS + MOVE TAC,@TAC ;GET COMMAND + JUMPE TAC,NXTCM2 ;END OF LIST + JUMPG TAX,NXTCM1 ;GO-TO WORD + ADDI TAC,(PROG) ;REAL COMMAND - ADD RELOCATION + AOJA TAC,CPOPJ1 ;AND RETURN + ;END OF DUMP-MODE LIST +NXTCM2: SETZM SVDWRD(DEVDAT) ;ZERO POINTERS + SETZM DMPLST(DEVDAT) + POPJ PDP, + +DMPFLC: SKIPE TAC,SVDWRD(DEVDAT) ;IS THERE ANOTHER COMMAND + JRST DMPFLA ;YES. GET IT + JRST DMPTH2 ;NO. THROUGH + DTC=320 +DTS=324 + +;IO INTERFACE +READBF: TLNN IOS,DMPMOD ;HAVE CONTROL IF DUMP-MODE + ; UNLESS ON A LOOKUP, IN WHICH + ; CASE ALWAYS GET DT CONTROL +RDBLUK: PUSHJ PDP,GETDT ;GET DT CONTROL + +READBC: PUSHJ PDP,FNDBLK ;SEARCH FOR RIGHT BLOCK + MOVE TAC1,[BLKI DTC,300] ;FOUND IT - START READING + +;HERE WITH BLK=BLOCK NUMBER, TAC1=FUNCTION, START SEARCH +RDWRT: HLLM TAC1,IOWD ;BLKI OR BLKO + HRLI TAC,-200 + TLNN IOS,RWDIR ;WRITING (READING) DIRECT? + SKIPA TAC,BFPNTR ;NO. INTO BUF + HRR TAC,DLOC(DEVDAT) ;YES. LOC OF DIRECTORY + CONSZ DTC,100000 ;IN REVERSE? + + JRST IORVRS ;YES + SOS TAC ;ADDRESS -1 + MOVE TEM,IOWD ;GET IOWD +IOGO: MOVEM TEM,DTALOC ;SET UP INTERRUPT LOCATION + IFN CPBIT, < + TLNE IOS,NOBUF ;IF DIRECTLY TO USER + JRST IOGO2 ;DTALC2, PNTR ALREADY SET UP +> + MOVEM TAC,PNTR ;POINTER + MOVE TAC,[JSR DTATHR] ;SET UP INTERRUPT LOC+1 + MOVEM TAC,DTALC2 +IOGO2: CONO DTC,DTBOTH(TAC1) ;START READ OR WRITE + CONO DTS,770000 ;ENABLE FOR ALL INTERRUPTS + POPJ PDP, ;DISMISS INTERRUPT + ;HERE IF TAPE IS GOING IN REVERSE WHEN BLOCK NUMBER FOUND +IORVRS: ADDI TAC,176 ;START AT TOP OF BUFFER + MOVE TEM,[JSR RVERS] + JRST TOGO ;COMPILCATED STUFF FOR EACH WORD + +;HERE FOR AY DATA WORD WITH TAPE IN REVERSE +RVERS: 0 +IOWD: BLKI DTC,PNTR ;READ (WRITE) A WORD + ; NOTE -- THIS LOCATION IS IMPURE. + ; MODIFIED TO A BLKI OR BLKO. + JRST RVTHRU ;POINTER RAN OUT + SOS PNTR ;POINTER HAS TO BACK UP + SOS PNTR + JEN @RVERS ;DISMISS THE INTERRUPT + +;HERE WHEN POINTER RUNS OUT IN REVERSE +RVTHRU: CONO DTS,770001 ;FUNCTION STOP + JEN @RVERS ;DISMISS + +;HERE WHEN POINTER RUNS OUT FORWARD +DTATHR: 0 + CONO DTS,770001 ;FUNCTION STOP + JEN @DTATHR ;DISMISS + ;HERE TO PERFORM A REWIND MTAPE FOR DTA +MTAP0: PUSHJ PDP,GETDT ;GET THE CONTROL FOR THE TAPE + LSH TAC1,15 ;TAC1=0 FOR REQ; 10 FOR REW UNLD + TDZ IOS,[XWD IO,IOACT] ;SET UP IOS + TLO IOS,REWBIT+RVERSE(TAC1) + MOVEI BLK,0 ;SEARCH FOR BLOCK 0 + PUSHJ PDP,FNDBLK ;GO FIND BLOCK + +;CONTROL COMES HERE ON INTERRUPT CHANNEL WHEN THE BLOCK IS FOUND + TLNE IOS,RUNBIT ;REWIND UNLOAD? + JRST .+3 ;YES, CONTINUE + CONO DTS,770001 ;NO, THROUGH WITH TAPE. - FNCTN STOP + POPJ PDP, ;DISMISS INTERRUPT + MOVE TAC,RUNWD ;USE THE CLOCK TO DESELECT THE TAPE + JSR CLKREQ ;FOR A WHILE - IT WILL GO OFF THE END + CONO DTC,410000 ;DESELECT THE TAPE SO IT CAN GO OFF + POPJ PDP, ;DISMISS THE INTERRUPT +RUNWD: XWD RUNCLK,200 + +;COME HERE ON THE CLOCK LEVEL FOR REWIND AND UNLOAD +RUNCLK: MOVE DEVDAT,USEWRD + LDB TAC,PUNIT ;GIVE CONO TO READ BLOCK NOS IN FORWARD + LSH TAC,11 ;DIRECTION - THIS WILL CAUSE FULL REEL + CONO DTC,230200(TAC);TO STOP FLAPPING WHEN CONO STOP IS DONE + MOVE IOS,DEVIOS(DEVDAT) ;RESET IOS + JRST REWDUN ;DECREASE DTREQ. STOP TAP + +;HERE TO PUT C(TAC) IN THE CLOCK QUEUE +CLKREQ: 0 + CONO PI,PIOFF ;TURN OFF PI + IDPB TAC,CLOCK + CONO PI,PION + JRST @CLKREQ + EXTERN JOB + EXTERN HNGSTP +;COME HERE TO START READING BLOCK NUMBERS +FNDBLK: HRRZM BLK,BLOCK ;BLOCK WE'RE LOOKING FOR + POP PDP,DISPAD(DEVDAT) ;WHERE TO GO WHEN RIGHT BLOCK FOUND + SETZM ERRCNT +FNDBL2: LDB TAC,PUNIT ;GET UNIT NUMBER + LSH TAC,11 ;POSITION IT + CONSZ DTC,20000 ;TAPE SELECTED? + JRST FNDBL4 ;YES + TRO TAC,230000 ;NO, SET TO SELECT TAPE FORWARD + TLNE IOS,RVERSE+NOBUF ;REVERSE OR DIRECT TO USER? + TRC TAC,300000 ;YES. SET FOR REVERSE +FNDBL3: TRO TAC,DTBOTH ;ADD PI ASSIGNMENT + MOVE TEM,[JSR SRCH] ;SET UP PI LOCS FOR SEARCH + MOVEM TEM,DTALOC ;INTO PI INTERRUPTCELL + CONO DTC,200(TAC) ;START SEARCHING BLOCKS + CONO DTS,670000 ;ENABLE FOR ALL BUT JOB DONE + SETOM IOWRIT ;SET SWITCH NON - 0 IF USING + TLNN IOS,RWDIR ;MONITOR BUFFER FOR OUTPUT + TLNN IOS,IO ;SO REKON WONT GIVE CONTROL (AND + SETZM IOWRIT ;BUFFER) AWAY + TLZ IOS,RECKON+IOFST ;TURN OFF DEAD-RECKON BIT + MOVEM DEVDAT,USEWRD + PUSHJ PDP,STOIOS ;SAVE IOS + IFN CPBIT, < + TLZ IOS,NOBUFC ;SET WORD NON-ZERO IF NOBUF ON + HLRZM IOS,DIRCTN +> + POPJ PDP, ;AND LEAVE + +FNDBL4: CONSZ DTC,200000 ;DIRECTION TEST + TROA TAC,200000 ;FORWARD + TRO TAC,100000 ;REVERSE + JRST FNDBL3 ;START SEARCH + ;INTERRUPT HERE TO READ A BLOCK NUMBER +SRCH: 0 + MOVEM TAC,TEMP ;SAVE WORKING AC + CONI DTS,TAC ;GET STATUS BITS + TLNE TAC,2000 ;IS CONTROL STILL ACTIVE? + JRST SRCHD ;YES. MUST BE IN "PSEUDO END-ZONE" + DATAI DTC,TAC ;NO. READ A BLOCK NUMBER + TLZ TAC,-1 ;LEGAL BLOCK NUMBER> + JRST SRCHB ;NO. SET ERROR SWITCH + SUB TAC,BLOCK ;NOW-WANTED + IFN CPBIT, < + SKIPE DIRCTN ;MUST BE GOING FORWARD IF DUMP-MODE + JRST SRCHC ;DIRECTLY TO USER +> + JUMPE TAC,FOUND ;=0 IF WE'RE THERE +SRCHA: CONSZ DTC,100000 ;IF TAPE IS IN REVERSE + MOVNS TAC ;SWITCH TURN-AROUND TEST + JUMPLE TAC,.+3 ;TEST FOR DISCONNECT IF DIRECTION IS CORRECT + + ;*** + CONO DTC,DTTURN ;TURN AROUND + JRST SRCHXT ;AND GO AWAY + MOVMS TAC + CAILE TAC,MINDIS ;WORTH WHILE TO DISCONNECT TAPE? + JRST BEKON ;YES. GO DISCONNECT + SKIPLE DISCON ;NO. IS THERE A DISCON. TAPE + ;WHICH HAS TIMED OUT? + CAIG TAC,2 ;YES. WILL THIS SEARCH TAKE LONG? + SKIPA ;NO + CONO DTS,670002 ;YES. STOP DISCONNECTED TAPE + SKIPE TAC,ALMSWT ;READING BLOCK NOS OF AN ALMOST ACTIVE DTA? + JSR CLKREQ ;YES., GET ITS JOB BACK INTO MEMORY +SRCHXT: MOVE TAC,TEMP ;RESTORE TAC + SETZM ALMSWT + JEN @SRCH ;AND DISMISS THE INTERRUPT + ;HERE IF AN ILLEGAL BLOCK WAS READ FROM THE TAPE +SRCHR: AOS TAC,ERRCNT ;BUMP ERROR COUNT + CAIG TAC,DTTRV ;TRIED ENOUGH? + JRST SRCHXT ;NO. READ ANOTHER BLOCK NUMBER + SETOM BLOCK ;YES. BLOCK = -1 AS AN ERROR SWITCH + CONO DTA,770001 ;FUNCTION STOP + JRST SRCHXT ;GO AWAY + + IFN CPBIT, < +SRCHC: CONSZ DTC,100000 ;GOING FORWARD? + TLCA TAC,400000 ;NO. SWITCH TURN AROUND TEST. ENSURE FORWARD + JUMPE TAC,FOUND ;GO IF FOUND FORWARD + SKIPI TAC ;TURN AROUND?> + CONO DTC,DTTURN ;YES + JRST SRCHXT ;READ ANOTHER BLOCK NUMBER +> + +;COME HERE IF CONTROL IS STILL ACTIVE AFTER READING A BLOCK NUMBER +;THIS MEANS THAT TAPE IS IN THE "PSEUDO END-ZONE" - EXTRA FILLERS +;INSERTED FOR THE BENEFIT OF THE PDP-9 +SRCHD: CONO DTC,DTTURN ;TURN TAPE AROUND + JRST SRCHXT ;AND EXIT THE INTERRUPT + ;COME HERE WHEN A TAPE IS IN A LONG SEARCH +;IF THIS TAPE HAS NOT USED THE MONITOR BUFFER (READING), AND +;IF NO OTHER TAPES ARE DISCONNECTD, THIS ONE WILL BE, +;AND A CLOCK REQUEST WILL BE ENTERED FOR AN ESTIMATED TIME TO BLOCK. + +REKON: SKIPN IOWRIT ;MONITOR BUFFER FULL? + SKIPGE DISCON ;ANOTHER TAPE DISCONNECTED? + JRST SRCHXT ;YES, FORGET IT + MOVEM TAC1,FNDTMP ;SAVE AN AC + MOVE TAC1,DISTNC + SUB TAC1,TAC ;CHECK SEQUENCE + SOJN TAC1,TRYLTR ;JUMP IF NOT SEQUENTIAL BLOCKS + EXCH DEVDAT,USEWRD ;NO. DISCONNECT FROM THIS ONE + MOVSI TAC1,ALMACT ;SET TAPE AS ALMOST ACTIVE - SWAPPABLE AND + ;SHUFFLABLE EVEN THOUGH ACTIVE + ORM TAC1,DEVIOS(DEVDAT) + LDB TAC1,PJOBN ;ASSOCIATED JOB NUMBER + HRRM TAC1,MONB2 ;SAVE IN WD 2 OF MONITOR BUFFER + HRLM DEVDAT,MONB2 ;SAVE ADDRESS OF DTA + + CONSZ DTC,200000 + IMULI TAC,62 ;COMPUTE A TIME TO BLOCK + CONSZ DTC,100000 ;BASED ON 50 MSEC/BLOCK FORWARD + IMULI TAC,50 ;AND 40 MSEC/BLOCK IN REVERSE +MSECPT: IDIVI TAC,.-. ;DIVIDE BY NO, MILLISECS/TIC + CAILE TAC,3300 ;IF THE COMPUTED TIME IS TOO HIGH + MOVEI TAC,30 ;LOOK AGAIN IN 1 1/2 SECOND + MOVSI TAC1,RECKON ;LIGHT A BIT TO INDICATE THE TAPE IS + IORM TAC1,DEVIOS(DEVDAT) ;DEAD RECKONING + MOVE TAC1,FNDTMP ;RESTORE TAC1 + HRRM TAC,TIMREQ ;SET UP A TIME REQUEST + LDB TAC,PUNIT ;6 BITS OF INFORMATION + SKIPN TAC ;UNIT 0 = 8 + MOVEI TAC,10 + LSH TAC,14 ;IS THE UNIT NUMBER + ADD TAC,TIMREQ ;REQUEST THE MONITOR TO WAKE + JSR CLKREQ ;IN N TICKS + MOVE TAC,BLOCK ;SAVE THE BLOCK NO. + CONSO DTC,200000 ;AND THE DIRECTION + TRO TAC,200000 + HRLM TAC,IBLK(DEVDAT) ;IN THE DDB + CONO DTC,410000 ;DESELECT THE CONTROL + ;BIT 400000 IS TO PREVENT ERROR FLAGS FROM COMING IN LATER - + ; IT DOES NOT CAUSE THE DESELECTED TAPE TO STOP THOUGH + MOVEI DEVDAT,0 + EXCH DEVDAT,USEWRD ;RESET DEVDAT + SKIPLE DISCON ;SWITCHING DISCONNNECTED TAPES? + JRST NXTICK ;YES. COME BACK LATER + SOSL DTREQ ;NO. COUNT DOWN DTREQ + SETOM DTAVAL + SETOM DISCON ;ONLY 1 RECKON AT A TIME + JRST SRCHXT ;AND EXIT THE INTERRUPT + TRYLTR: MOVEM TAC,DISTNC + MOVE TAC1,FNDTMP ;RESTORE TAC1 + JRST SRCHXT + +;HERE WHEN SWITCHING DISCONNECTED TAPES +;TOO MUCH TO DO ON THE INTERRUPT LEVEL. SO COME BACK ON +;NEXT CLOCK TICK +NXTICK: MOVE TAC,TIMRQ2 ;COME BACK IN A JIFFY + JSR CLKREQ + JRST SRCHXT + +TIMREQ: XWD BACK,0 +TIMRQ2: XWD BACKA,1 + +IFN ALMACT,< + EXTERN PRIIN +;COME HERE ON THE CLOCK LEVEL TO BRING THE JOB ASSOCIATED WITH +;AN "ALMOST ACTIVE" TAPE BACK INTO CORE +ALMREQ: XWD .+1,1 + MOVE DEVDAT,USEWRD ;DDB LOC + LDB ITEM,PJOBN ;JOB NUMBER + PUSHJ PDP,PRIIN ;TELL SWAPPER TO GET IT + JFCL + MOVSI TAC,ALMACT + ANDCAM TAC,DEVIOS(DEVDAT) ;ZAP BIT SO IT WONT BE SWAPPED OUT AGAIN + POPJ PDP, + +;HERE WHEN SWAPPER DOES GET THE JOB BACK INTO CORE +SWPBAK: MOVE IOS,DEVIOS(DEVDAT) + SETM MONB2 ;CLEAR JOB NO, FROM MON BUFFER + TLNN IOS,IOFST ;WAS JOB SWAPPED OUT WHEN DATA FINISHED? + POPJ PDP, ;NO. TRANSFER COMPLETED + MOVE TAC,JBTSTS(ITEM) ;YES, WAS IO ABORTED?> + TRNN TAC,ALBORT + JRST FAKINT ;NO. NOW TRANSFER DATA, ADVANCE BUFFERS + JRST THRUTP ;YES. FORGET REST OF OPERATION +> + EXTERN CIPWTM +;COME HERE FROM THE MONITOR WHEN THE ESTIMATED TIME-TO BLOCK +;HAS EXPIRED +BACK: SKIPE USEWRD ;IS CONTROL AVAILABLE? + JRST FLAGIT ;NO. SET FLAG + AOS DTREQ ;YES. DTREQ WILL BE COUNTED DOWN LATER + SETZM DTAVAL + SETZM DISCON ;NO TAPE IS NOW DISCONNECYTED +BACK2: TRZ TAC,10 + LSH TAC,11 ;UNIT + PUSH PDP,TAC ;SAVE IT + LSH TAC,3 + ADD TAC,DTADDB ;CONVERT TO SIXBIT NAME + PUSHJ PDP,DEVPHY ;SET UP DEVDAT FOR IT + HALT . ;****************************** + MOVEM DEVDAT,USEWRD ;RESET USEWRD + HLRZ TAC1,IBLK(DEVDAT) ;BLOCK NEEDED + DPB TAC1,[POINT 10,BLOCK,35] + HRRZ TAC,CLOCK + + HRLI TAC1,CPOPJ ;FIND CLOCK-QUEUE REFERENVCE TO BACKC +BACK3: CAIN TAC,CIPWTM + JRST BACKD ;NOT THERE, TAPE MUST HAVE BEEN STOPPED + HLRZ TEM,(TAC) ;ADDRESS OF CLOCK REQUEST + CAIE TEM,BACKC ;THIS THE ONE? + SOJA TAC,BACK3 ;NO. KEEP LOOKING + HLLM TAC1,(TAC) ;YES. MAKE A NO-OP OUT OF IT +BACKD: POP PDP,TAC ;UNIT + TRO TAC,270000 ;SET SELECT, DELAY INHIBIT + TRNE TAC1,200000 ;SET DIRECTION + TRC TAC,300000 ;LREVERSE + MOVE IOS,DEVIOS(DEVDAT) ;RESTORE OS +IFN ALMACT, < ;UNTIL REST OF SCHEDR, SWAPPER IS FIXED - IGNORE + MOVE TAC1,ALMREQ ;INDICATE CONNECTING TO AN ALMOST + MOVEM TAC1,ALMSWT ;ACTIVE TAPE, SO JOB WILL BE BROUGHT + ;BACK IN IF TAPE CLOSE TO TARGET BLOCK +> + JRST FNDBL3 ;READ NEXT BLOCK NUMBER + ;HERE WHEN TIME IS UP AND ANOTHER TAPE HAS THE CONTROL +FLAGIT: MOVEM TAC,DISCON ;DISCON POSITIVE IF NEED THE CONTROL + MOVE TAC,.+3 ;SET A CLOCK REQUEST TO STOP TAPE + JSR CLKREQ + POPJ PDP, ;RETURN, WILL COME IN ON INTERRUTP LEVEL + XWD BACKC,10 + +;HERE WHEN DTASER CAN GIVE UP THE CONTROL +BACKB: CONO DTC,400000 ;STOP CURRENT TAPE + PUSHJ PDP,THRUTA ;GIVE IT UP + TDZA TAC,TAC ;DISCON WILL GO TO 0 + +BACKA: SETOM TAC ;DISCON WILL GO TO -1 + EXCH TAC,DISCON ;UNIT TO CONNECT TO + JRST BACK2 ;GO RECONNECT + +;IF WE GET HERE THERE IS A SLOW TAPE ON THE SELECTED DRIVE +BACKC: CONO PI,PIOFF ;CANT RISK CHANGING THE INTERRUPT ENABLES HRE + CONI DTS,TAC ;READ IN ENABLE FLAGS + HLRZS TAC ;FLAGS INTO R.H. + ANDI TAC,770000 ;ONLY ENABLE FLAGS + CONO DTS,2(TAC) ;STOP THE DESELECTED TAPE + CONO PI,PION + POPJ PDP, ;BEFORE RUNNING OFF END OF THE REEL + ;HERE WHEN CORRECT BLOCK NUMBER IS FOUND +FOUND: MOVEM TAC1,FNDTMP ;SAVE THOSE ACS THAT WILL BE USED + MOVEM TEM,RVERS + EXCH DEVDAT,USEWRD + EXCH IOS,DEVIOS(DEVDAT) + ECHO PDP,FNDPDP + PUSHJ PDP,@DISPAD(DEVDAT) ;GO TO DISPATCH LOCATION + EXCH PDP,FNDPDP ;RESTORE ACS + EXCH IOS,DEVIOS(DEVDAT) + EXCH DEVDAT,USEWRD + MOVE TAC,TEMP + MOVE TAC1,FNDTMP + MOVE TEM,RVERS + JEN @SRCH ;EXIT THE INTERRUPT + +FNDPDP: XWD -2,. + 0 + + IFN CPBIT, < +;HERE WHERE DUMP-MODE POINTER RUNS OUT +DMPADV: 0 + MOVEM TAC,TEMP + AOSA TAC,USPNTR ;ADVANCE LOC OF POINTER +DMPAV1: HRRM TAC,USPNTR + SKIPN TAC,@TAC ;END OF LIST? + JRST DMPAV3 ;YES. STOP TAPE + ADD TAC,ADRPRG ;ADD RELOCATION + JUMPG TAC,DMPAV1 + MOVEM TAC,PNTR ;NEW POINTER +DMPAV2: MOVE TAC,TEMP ;RESTORE TAC + JEN @DMPADV + + +DMPAV3: CONO DTS,770001 ;GIVE FUNCTION STOP + JRST DMPAV2 ;RESTORE TAC AND EXIT THE INTERRUPT + +> + ;INTERRUPT HERE FOR FLAG CHANNEL +DTAINT: CONSO DTS,770000 ;INTERRUPT FOR DTA? + JRST . ;NO + CONSZ DTS,20000 ;END ZONE? + SKIPGE BLOCK ;YES. BAD BLOCK NUMBER? + SKIPA ;YES + JRST TURN ;NO. TURN TAPE AROUND + JSR DTASAV ;SAVE ACS +FAKINT: MOVE DEVDAT,USEWRD ;RESTORE DEVDAT + MOVE IOS,DEVIOS(DEVDAT) ;AND IOS + LDB ITEM,PJOBN ;JOB NUMBER +IFN ALMACT,< + PUSHJ PDP,PRIIN ;IS JOB SWAPPED OR SHUFFLED? + JRST SWPDLY ;YES, CANT MOVE BUFFERS NOW +> + MOVE PROG,JBTADR(ITEM) ;ADDRESS +DTAIN1: TLZE IOS,REWBIT ;NO, FROM A REWIND MTAPE? + JRST REWDUN ;YES. DONE + TLZE IOS,IOFST ;COMING FROM SWAP DELAY ROUTINE? + JRST DTAIN2 ;YES, TD10 HAS BEEN ZAPPED + CONSZ DTS,100000 ;JOB DONE? + CONSZ DTS,670000 ;AND NO ERRORS? + JRST ERRS ;NO. TOUGH LUCK + SKIPGE BLOCK ;BAD BLOCK NUMBER ON TAPE? +DTAIN2: TLNE IOS,DMPMOD ;DUMP MODE? + JRST DMPTHR ;YES. GO ELSEWHERE + TLNN IOS,SINGL + JRST .+3 + LDB TAC,[POINT 10,BUF,27] ;GET 1ST BLOCK NO. IF READ + ;CAME FROM LOOKUP + MOVEM TAC,IBLK(DEVDAT) ;STORE IN DDB + TLZE IOS,IOW ;NO. IN IO WAIT? + PUSHJ PDP,SETIOD ;YES. TAKE OUT OF WAIT + TLZE IOS,SINGL+RWDIR+DMPCLS ;DIRECTORY OPERATION OR + ;CLOSING DUMP FILE? + JRST THRUTP ;YES. LEAVE + TLNE IOS,IO ;WRITING? + JRST OUTHRU ;YES + EXTERN JBTSTS,PJOBN + +;HERE ON END OF AN INPUT BLOCK + HRROI TAC1,177 ;MASK OUT 1ST-BLK DATA + TRNN IOS,UDSD ;UNLESS IN NON-STD + ANDM TAC1,BUF + MOVEI TAC,@DEVIAD(DEVDAT) ;WHERE TO STORE BLOCK + ADD TAC,[XWD BUF,1];FROM BUF TO THERE + MOVEI TAC1,177(TAC) + BLT TAC,(TAC1) ;TRANSFER IT + HLRZ BLK,BUF ;NEXT BLOCK TO READ + TRNE IOS,UDSD ;IF NON-STD + AOSA BLK,IBLK(DEVDAT);READ SEQUENTIAL BLOCKS + HRRM BLK,IBLK(DEVDAT) ;DAVE IN DDB + TRNE IOS,IODTER+IODERR+IOIMPM + JRST THRUIN + PUSHJ PDP,ADVBUFF ;GET NEXT BUFFER + JRST THRUIN ;EMPTY BUF NOT AVAILABLE + + SKIPLE DISCON ;TAPE TIMED OUT? + JRST BACKB ;YES. GO RECONNECT + SKIPE BLK ;EXIT IF EOF OR BLOCK TOO LARGE + CAILE BLK,TOPBLK ;THE ERROR WILL BE CAUGHT ON THE + JRST THRUIN ;UUO LEVEL NEXT TIME AROUND + SOSGE QUANTM ;HAS TAPE HAD CHAN LONG ENOUGH? + SKIPG DTREQ ;YES. ANYONE ELSE WANT IT? + JRST READBC ;NO. READ NEXT BLOCK + +THRUIN: HRRZ TAC,OBLK(DEVDAT) ;TAPE ALSO BEING WRITTEN? + JUMPN TAC,THRUTP ;YES. DONT CHANGE REVERSE BIT + TLZ IOS,RVERSE ;NO. SET IOS BIT TO CORRECT DIRECTION + CONSZ DTC,100000 + TLO IOS,RVERSE + ;HERE WHEN TAPE IS DONE +THRUTP: SKIPLE TAC,DISCON ;TAPE TIMED OUT? + JRST BACKB ;YES + CONO DTC,400000 ;STOP TAPE +THRUTD: SOSL DTREQ ;BUMP COUNT DOWN + SETOM DTAVAL ;TELL SCHEDULER +THRUTA: CONO DTC,10000 ;DESELECT CONTROL + TLZ IOS,DMPMOD+NOBUF+DMPCLS+PEWBIT+RUNBIT + SETZM USEWRD ;INDICATE CONTROL NOW FREE + JRST CLRACT ;RESET IOACT AND RETURN + +;COME HERE IF A TAPE IS HUNG +HUNGTP: JUMPGE IOS,THRUTP ;GIVE UP CONTROL IF NOT DEAD-RECKONING + JRST CPOPJ1 ;IGNORE IT IF DEAD RECKONING - +;WHEN THE TAPE TIMES OUT FNDBLK WILL RESET THE HUNG TIME, AND +;IF IT IS STILL HUNG AT ITS END THE ERROR MESSAGE WILL OCCUR + + INTERN FTSWAP + EXTERN SHFWAT +;HERE ON END OF BLOCK WHEN THE JOB IS STILL SWAPPED OUT +;CONTROL GETS HERE IF SWP OR SHF IS ON IN JBTSTS +;IO THE JOB IS CURRENTLY SWAPPED OR SHUFFLED WE MUST DELAY +;SO TEST JOB NO AGAINST SHFWAT (IF SHUFFLE) OR FORCE (IF SWAP) TO DETERMINE +;IF JOB IS REALLY IN THAT STATE, OR IF MONITOR HAS LIT THE BIT +;IN ANTICIPATION OF PUTTING THE JOB IN THAT STATE +SWPDLY: + + IFN FTSWAP, < + EXTERN FORCE + TLNE TAC1,SWP ;SWAPPED JOB? + SKIPA TAC,FORCE ;YES. +> + MOVE TAC,SHFWAT ;NO. SHUFFLED? + CAMN ITEM,TAC ;JOB REALLY SWAPPED OR SHUFFLED? + JRST DTAIN1 ;NO, FINISH THIS DATA OPERATION + CONO DTC,400000 ;YES, STOP TAPE (WE MUST DELAY) + TLO IOS,IOFST ;INDICATE JOB WAS DELAYED (FOR FAKINT) + MOVE TAC,[XWD FAKINT,1] ;IF JOB IS CURRENTLY BEING SHUFFLED + TLNN TAC,SWP ;COME BACK ON NEXT CLOCK INTERRUPT, AT WHICH TIME + JSR CLKREQ ;THE BLT MUST HAVE FINISHED + JRST STOIOS ;AND GO AWAY + ;HERE ON END OF OUTPUT BLOCK +OUTHRU: PUSHJ PDP,ADVBFE ;GET NEXT BUFFER + JRST THRUTP ;NOT FULL + SKIPLE DISCON + JRST BACKB + HRRZ BLK,OBLK(DEVDAT) ;NEXT BLOCK TO WRITE + CAILE BLK,TOPBLK ;LEGAL? + JRST THRUTP ;NO. CATCH ERROR ON UUO LEVEL + SOSGE QUANTM ;YES. HAD CHAN LONG ENOUGH? + SKIPG DTREQ ;AND SOMEONE ELSE WANT IT? + JRST FILBUF ;NO. GO WRITE NEXT BLOCK + JRST THRUTP ;YES. GIVE UP TAPE + +;TURN TAPE AROUND AFTER END-ZONE INTERRUPT +TURN: CONSZ DTC,500 ;READ BLOCK NUMBERS? + JRST DIREOF ;NO. END ZONE WHILE READING DATA + CONO DTC,DTTURN ;YES. TURN AROUND + JEN @DTACHL ;DISMISS INTERRUPT + +;COME HERE ON AN END ZONE INTERRUPT WHILE READING DATA +;THIS CAN ONLY HAPPEN IN MODE 116,117 +;LIGHT IODEND (IT IS A PREMATURE EOF) AND LEAVE +DIREOF: JSR DTASAV ;SAVE ACS + MOVE DEVDAT,USEWRD ;RESTORE DEVDAT + MOVE IOS,DEVIOS(DEVDAT) ;AND IOS + JRST DMPEOF ;LIGHT IODEND AND RETURN + ;COME HERE ON END OF DUMP MODE BLOCK +SVDMTH: SKIPLE DISCON ;HAS A TAPE TIMED OUT + CONO DTS,2 ;YES. STOP IT + IFN CPBIT, < + TLNE IOS,NOBUF ;DIRECTLY TO USER? + JRST USDMTH ;YES. ALMOST THROUGH +> + MOVSI TAC1,-177 + IFE CPBIT, < + TRNE IOS,UDSD + SUB TAC1,ONEONE ;SET UP TAC1 WITH COUNT +> + TLNN IOS,IO + JRST SVOMIN ;INPUT FILE + HRRZ BLK,OBLK(DEVDAT) ;OUTPUT FILE, NEXT BLOCK + JUMPF BLK,DMPTHA ;LAST BLOCK + IFE CPBIT, < + TRNE IOS,UDSD ;IF NON-STD MODE + AOSA OBLK(DEVDAT) ;WRITE CONSECUTIVE BLOCKS +> + CAIG BLK,TOPBLK ;NOT LAST. LEGAL BLOCK NUMBER? + POPJ PDP, ;YES. RETURN + + TRO IOS,IOBKTL ;BLOCK TOO LARGE +DMPTHA: POP PDP,TAC ;REMOVE THE RETURN ADDRESS FROM + ;CALL TO SVDMTH. SINCE + ;NO MORE I/O WILL BE DONE +DMPTH2: SETZM SVDWRD(DEVDAT) ;ZERO DUMP-MODE STUFF + SETZM DMPLST(DEVDAT) +DMPTH3: TLZE IOS,IOW ;IS IO WAIT? + PUSHJ PDP,SETIOD ;YES, RESTART JOB + JRST THRUTP + +;HERE ON END SAVE MODE INPUT BLOCK +SVDMIN: HLRZ BLK,BUF ;NEXT BLOCK NUMBER + IFE CPBIT, < + TRNE IOS,UDSD ;NON-STANDARD? + AOSA BLK,IBLK(DEVDAT) ;YES, READ CONSECUTIVE BLOCKS +> + HRRM BLK,IBLK(DEVDAT) ;SAVE IN DDB + JRST CPOPJ1 + + IFN CPBIT, < +;HERE WHEN THROUGH DUMP-MODE DIRECTLY TO USER +USDMTH: MOVEI TAC1,IBLK(DEVDAT) + TLNE IOS,IO + MOVEI TAC1,OBLK(DEVDAT) ;SET TAC1 TO RIGHT BLOCK NUMBER + MOVE TAC,BLKCNT ;UPDATE BLOCK COUNTER + ADDM TAC,(TAC1) + JRST DMPTHA ;THROUGH +> + ;HERE WHEN THROUGH DUMP MODE BLOCK +DMPTHR: PUSHJ PDP,SVDMTH ;END OF BLOCK HOUSEKEEPING + ; RETURN ONLY IF MORE I/O + ; WILL BE DONE + JRST DMPFLC ;FILL BUFFER FOR NEXT OUTPUT + +;HERE WHEN THROUGH READING A DUMP-MODE BLOCK +DMIFIL: SKIPE TAC,SVDWRD(DEVDAT) ;PARTIAL COMMAND? + JRST DMIFLB ;YES. CONTINUE +DMIFLA: PUSHJ PDP,NXTCOM ;NO. GET NEXT COMMAND + JRST DMPTH2 ;END OF LIST - THROUGH +DMIFLB: MOVE TEM,BUF+1(TAC1) ;NEXT DATA WORD + MOVEM TEM,(TAC) ;GIVE TO USER + AOBJP TAC1,.+3 ;IF BUFFER IS FULL + AOBJN TAC,DMIFLB ;GET NEXT WORD + JRST DMIFLA ;GET NEXT COMMAND + + AOBJN TAC,.+3 ;BUFFER IO FULL. IS COUNT EXACTLY 177? + PUSHJ PDP,NXTCOM ;THAT COM, IS DONE. GET NEXT + + JRST DMPTH2 ;END OF LIST - THROUGH + MOVEM TAC,SVDWRD(DEVDAT) ;SAVE PARTIAL COMMAND FOR NEXT TIME + JUMPE BLK,DMPEOF ;IF EOF - LIGHT BIT +RDNXT: CAIG BLK,TOPBLK ;BLOCK LEGAL? + JRST READBC ;GO READ BLOCK NUMBER + TROA IOS,IOBLKT ;LIGHT ERROR BIT + +;EOF BEFORE ALL DATA IS IN - DUMP MODE +DMPEOF: TRO IOS,IODEND ;LIGHT EOF BIT + JRST DMPTH2 ;GIVE UP TAPE + SVADER: PUSHJ PDP,DMPTH2 ;GIVE UP CONTROL + JRST ADRERR ;TYPE ERROR MESSAGE +;COME HERE ON ERROR +ERRS: AOS TAC,ERRCNT ;BUMP COUNT + IFN CPBIT, < + TLNN IOS,NOBUF ;I/O DIRECT TO USER? + JRST ERRS1 ;NO + MOVE TAC1,SVPNTR ;YES. RESET POINTERS + MOVEM TAC1,USPNTR + MOVE TAC1,(TAC1) ;RESET PNTR + ADD TAC1,ADRPRG + MOVEM TAC1,PNTR +> +ERRS1: CONSO DTS,40000 ;IF ILLEGAL OP - DONT RETRY + CAILE TAC,DTTRY ;ENOUGH REREADS? + JRST PERMET ;YES. PERMANENT ERROR + JRST FNDBL2 ;NO. TRY AGAIN + +;PERMANENT ERROR +PERMER: SKIPL BLOCK ;IF BAD BLOCK # LIGHT IODTER + CONSZ DTS,400000 + TRO IOS,IODTER ;PARITY + CONSO DTS,10000 + CONSZ DTS,200000 +DERR: TRO IOS,IODERR ;MISSED DATA + CONSZ DTS,40000 + TRO IOS,IOIMPM ;ILLEGAL OP + TLNE IOS,DMPMOD ;DUMP MODE? + JRST DMPTHR ;YES. NOT THROUGH YET + TLNN IOS,IO+RDDIR+SINGL + JRST DTAIN2 +REWDUN: TLZE IOS,IOW + PUSHJ PDP,SETIOD ;NO. TAKE OUT OF IO WAIT + TLZN IOS,RWDIR+SINGL ;DIRECTORY OPERATION? + JRST THRUTP ;NO. RETURN TO USER + PUSHJ PDP,THRUTP ;YES. STOP TAPE + MOVSI TAC,DVDIRIN ;CLEAR DIRECTORY IN CORE BIT + ANDCAM TAC,DEVMOND(DEVDAT) +BDDIR: LDB ITEM,PJOBN ;NUMBER OF OFFENDING JOB + JRST RADDIR ;GO PRINT ERROR MESSAGE + INTERN DTABUF +BFPNTR: IOWD 200,BUF+1 +ONEONE: XWD 1,1 +USEWRD: 0 +USEPRG: 0 +ADRPRG: 0 +PNTR: 0 +TEMP: 0 +DISTNC: 0 +BLOCK: 0 +QUANTM: 0 +DISCON: 0 +ERRCNT: 0 +FNDTMP: 0 +IOWRIT: 0 +ALMSWT: 0 + IFN CPBIT, < +BLKCNT: 0 +SVPNTR: 0 + +USPNTR: 0 +DIRCNT: 0 +> +;THIS IS THE MONITOR BUFFER +DTABUF: +IFN ALMACT,< + XWD SWPBACK,0 ;RH WILL BE LINK TO NEXT MONITOR BUFFER +> +MONB2: 0 +BUF: BLOCK 200 +DTAEND: END + diff --git a/src/dtcsrn.mac b/src/dtcsrn.mac new file mode 100644 index 0000000..d8286ce --- /dev/null +++ b/src/dtcsrn.mac @@ -0,0 +1,1100 @@ +TITLE DTCSRN - NEW FORMAT DECTAPE SERVICE FOR 551 (PDP-6) +SUBTTL DTA551 A.WACHS/TW/RCC 01 JUN 69 V012 + XP VDTASR,012 ;GLOBAL VERSION NUMBER FOIR LOADER STORAGE MAP. + + ENTRY DTCSRN ;ENTRY POINT FOR SELECTIVE LOAD BY BUILD +DTCSRN: +EXTERNAL TPOPJ,TPOPJ1,DTCCHL,DCOUT,DCIN,DCON,DCOFF +EXTERNAL STOIOS,STOTAC,SETACT,CLRACT,OUT,DTASAV,PIOMOD + +EXTERNAL DTAVAL,DTREQ,SETIOD,THSDAT,PUNIT,GETDCDT +EXTERNAL ADVBFE,ADVBFF,ADRERR,WAIT1,CPOPJ,CPOPJ1,BADDIR +EXTERNAL COMCHK,PJOBN,RELEA9,UADCK1,DTTRY +EXTERNAL JBTADR,DCLOC,DCLOC1,DTCCHN,DCREQ,DCAVAL + + +BLK=4 + + +DIRBLK=^D100 ;NUMBER OF BLOCK FOR DIRECTORY + +TOPBLK=1101 ;HIGHEST LEGAL BLOCK NUMBER +NAMSTR=^D83 ;1ST NAME WORD IN DIRECTORY +QUANT=5 ;NUMBER OF BLOCKS CAN READ BEORE GIVING UP DTC +SPACE=6 ;NUMBER OF BLOCKS SEPERATING CONTIGUOUS BLKS OF A FILE + +;DDB MAGIC CELLS +FSTBLK=13 +DLOC=14 +IBLK=15 +OBLK=16 +DISPAD=17 +DMPLST=20 +SVDWRD=21 + ;FLAGS IN RH OF IOS +UDSD=100 + + +;FLAGS IN LH OF IOS +NOLINK=200 +CHNGDR=400 +RVERSE=1000 +SINGL=2000 ;JUST READ OR WRITE 1 BLOCK +DMPMOD=4000 +RWDIR=10000 +DMPCLS=20000 +NOBUF=40000 ;DATA GOING DIRECTLY INTO USER AREA +NOBUFC=737777 ;-NOBUF + +CPBIT=-1 ;CONDITIONAL ASSEMBLY PARAMETER FOR I/O DIRECTLY + ;TO USER. IF -1 THE I/O IN DUMP MODE WITH + ;BIT 29 ON IN INIT WILL DO IO DIRECTLY TO USER + ;WIUTHOUT DIRECT CONSIDERATION OF BLOCK BOUNDRIES + EXTERN JIFSEC + + INTERN DTCINT,DTCDDB,DTCINI,DTCDDS + +DTCDDB: SIXBIT /DTA0/ + XWD ^D60*HUNGST,200 + 0 + EXP DTCDSP + XWD 1107,154403 + EXP 0,0 + + XWD PROG,0 + XWD PROG,0 + EXP 0,0,0 + + EXP DTCDIR + EXP 0,0,0,0,0 + + +DTCDIR: BLOCK 200 +DTCDDS=.-DTCDDB + + JRST DTCINI + JRST THRUTP ;HUNG DEVICE +DTADSP JRST UREL + JRST UCLS + JRST UOUT + JRST UIN + JRST ENTR + JRST LOOK + JRST DMPO + JRST DMPI + JRST SETO + JRST SETI + JRST GETF + JRST RENAM + POPJ PDP, ;CLOSE INPUT + JRST UTPCLR + POPJ PDP, ;MTAPE + +;INITIALIZE DTC +DTCINI: CONO DTC,0 + CONO DC,0 + HLLZS DTCINT ;CLEAR CONSO + POPJ PDP, + EXTERN JOBSAV +;LOOKUP A DIRECTORY ENTRY +LOOK: TRNE IOS,UDSD ;NON-STANDARD? + JRST CPOPJ1 ;YES. LOOKUP OK + PUSHJ PDP,DSERCH ;NO. FIND DIRECTORY ENTRY + POPJ PDP, ;NOT THERE + HRRZ TAC1,26(TAC) ;GET DATE, NO. OF 1K BLOCKS NEEDED + AOS UUO ;POINT UUO TO WORD 3 + MOVEM TAC1,@UUO ;INTO USER'S LOOKUP BLOCK +LOOKA: HLRE TAC,TAC ;GET INDEX + ADDI TAC,27 + SKIPN FSTBLK(DEVDAT) ;TAPE BEING WRITTEN? + HRLM TAC,OBLK(DEVDAT) ;NO. SAVE INDEX FOR POSSIUBLE OUTPUT + HRRM TAC,AC1 ;SAVE INDEX IN CASE LH(IBLK) IS + ;CHANGED BY DEAD-RECKONING + MOVEI TAC1,0 + PUSHJ PDP,BLKSRC ;COUNT NUMBER OF BLOCKS IN FILE + AOJA UUO,STOWD4 ;LAST BLOCK DONE + AOS TAC1 ;COUNT THE BLOCK + SOS 1(PDP) ;ADJUST FOR CORRECT RETURN + AOBJN PDP,BLKSRB ;LOOK FOR NEXT BLOCK + +;TAC1 HAS THE NUMBER OF BLOCKS BELONGING TO THE FILE +STOWD4: IMUL TAC1,[-177] ;-NUMBER OF WORDS IF ALL BLOCKS FULL + HRLZM TAC1,@UUO ;STORE IN DIRECOTRY WD 4 + SUBI UUO,2 ;POINT UUO TO DIRECORY WD 2 + TLZ IOS,IO ;MAKE SURE IO IS OFF + TLO IOS,SINGL ;JUST READ 1 RECORD + MOVEI BLK,DIRBLK ;NO, FIND FIRST MENTION OF BLOCK + PUSHJ PDP,LSTFRE+1 ;NEAR DIRECTORY + JUMPN BLK,LOOKE ;FOUND IF BLK NOT =0 +LOOKD: PUSHJ PDP,BLKSRC ;FIND FIRST MENTION IN DIRECTORY + JRST BDDIR ;NOT THERE - ERROR +LOOKE: PUSHJ PDP,RDBLUK ;GO READ IT + PUSHJ PDP,WAIT1 ;WAIT TILL IT'S IN + HRLM AC1,IBLK(DEVDAT) ;SAVE INDEX ON INPUT FILE FOR LATER + ;TEST ON ENTER - WONT ALLOW ENTER + ;TO BE DONE ON LOOKED-UP FILE + HRRZ BLK,IBLK(DEVDAT) ;GET FIRST BLOCK OF FILE +LOOKC: SKIPN FSTBLK(DEVDAT) ;IF FILE HAS NOT BEEN ENTERED + MOVEM BLK,FSTBLK(DEVDAT) ;SAVE IN DDB + HRRM BLK,@UUO ;SAVE IN USER'S AREA + HLL TAC,@UUO ;GET USER'S EXTENSION + HLLM TAC,DEVEXT(DEVDAT) ;SAVE IN DEVCE DATA BLOCK FOR RENAME AND + ; AND SUPERSEDING SHARED SEGMENTS + JRST CPOPJ1 ;AND TAKE GOOD EXIT + RENAM: PUSH PDP,UUO ;SAVE LOC OF NEW NAME + MOVEI UUO,DEVFIL(DEVDAT) ;SEARCH FOR OLD NAME + PUSHJ PDP,DSER1 + JRST RENER1 ;NOT FOUND - ERROR + POP PDP,UUO ;FOUND, RESTORE UUO + SKIPE @UUO ;RENAMING TO ZERO? + JRST RENAM2 ;NO. GO TO REAL RENAME + SETZM (TAC) ;YES. DELETE NAME IN DIR + SETZM 26(TAC) ;DELETE EXTENSION + SETZM DEVFIL(DEVDAT) ;ZERO DEVFIL + HLRE TAC,TAC ;GET INDEX OF FILE + ADDI TAC,27 + PUSHJ PDP,DLETE ;DELETE ALL BLOCKS OF FILE +RENAM1: TLO IOS,CHNGDR ;DIRECTORY HAS CHANGED + AOS (PDP) ;SET FOR GOOD RETURN + JRST STOIOS ;GO TO USER + +;COME HERE TO RENAME TO A REAL NEW NAME +RENAM2: MOVE DAT,TAC ;SAVE LOC OF NAME IN DIRECTORY + + PUSHJ PDP,DSERCH ;SEARCH FOR NEW NAME + SKIPA ;NOT FOUND - GOOD + JRST RENER2 ;NAME ALREADY EXISTS - ERROR + MOVE TAC,@UUO ;GET NEW NAME + MOVEM TAC,(DAT) ;SAVE IN DIR + AOS UUO + MOVE TAC,@UUO ;EXTENSION + HLLM TAC,26(DAT) ;SAVE IN DIR + HLLM TAC,DEVEXT(DEVDAT) ;SAVE INN DDB + JRST RENAM1 ;GIVE GOOD RETURN TO USER + +RENER1: POP PDP,UUO + TDZA TAC,TAC ;RH E+1 =0 +RENER2: MOVEI TAC,4 ;RH E+1 =4 + AOS UUO ;POINT TO 2ND WORD + HRRM TAC,@UUO ;SET ERRORR CODE + POPJ PDP, ;AND TAKE ERROR RETURN + ;SEARCH DIRECTORY FOR A MATCH +DSERCH: MOVEI AC1,3(UUO) ;CHECK VALIDITY OF ADDRESS + PUSHJ PDP,UADCK1 ;NEVER RETURN IF ADDR. OUT OF BOUNDS +DSER1: PUSHJ PDP,DIRCHK ;ENSURE DIRECTORY IS IN CORE + HRRZ TAC,DLOC(DEVDAT) ;LOCAION OF DIRECTORY + ADD TAC,[XWD -26,NAMSTR] ;POINT TO START OF NAMES +NMLOOK: SKIPN TAC1,@UUO ;GET NAME + JRST TPOPJ ;NULL ARGUMENT - ERROR RETURN + MOVEM TAC1,DEVFIL(DEVDAT) ;STORE FOR RENAME AND SUPERSEDING + ; SHARED SEGMENTS + CAMN TAC1,(TAC) ;TEST FOR MATCH + AOJA UUOI,NMFOUN ;FOUND NAME, CHECK EXTENSION + AOBJN TAC,.-2 ;TRY NEXT NAME + POPJ PDP, ;NOT FOUND +NMFOUN: HLLZ TAC1,@UUO ;PICK UP USER'S EXTENSION + XOR TAC1,26(TAC) ;TEST AGAINST DIRECTORY EXTENSION + TLNN TAC1,-1 ;MATCH? + JRST CPOPJ1 ;YES. RETURN + AOBJP TAC,.+2 + SOJA UUO,NMLOOK ;NO. TRY NEXT NAME + SOJA UUO,CPOPJ ;NAME NOT FOUND + +;CHECK IF DIRECTORY IS IN CORE, IF NOT, READ IT +DIRCHK: TRNN IOS,UDSD ;DONT BOTHER IF NON-STANDARD + SKIPG DEVMOD(DEVDAT) ;IS IT IN? + POPJ PDP, ;YES. RETURN + MOVEI BLK,DIRBLK ;BLOCK NUMBER + TLZ IOS,IO + PUSHJ PDP,GETDT ;GET CONTROL + TLO IOS,RWDIR ;JUST READ 1 BLOCK + PUSHJ PDP,READBC ;GO READ IT + PUSHJ PDP,WAIT1 ;WAIT TILL IN + MOVSI TAC1,DVDIRI ;SET DIRECTORY-IN-CORE BIT + ORM TAC1,DEVMOD(DEVDAT) + POPJ PDP, + ;SEARCH DIRECTORY FOR FILE WHOSE INDEX IS IN TAC +BLKSRC: MOVSI DAT,440500 ;DAT IS A BLOCK POINTER + HRR DAT,DLOC(DEVDAT) + MOVEI BLK,1 ;START AT BLOCK 1 + +BLKSRA: ILDB TEM,DAT ;INDEX OF NEXT BLOCK + CAMN TAC,TEM ;MATCH? + JRST CPOPJ1 ;YES. RETURN + +BLKSRB: CAIGE BLK,TOPBLK ;NO. SEARCHED LAST? + AOJA BLK,BLKSRA ;NO. TRY NEXT BLOCK + POPJ PDP, ;YES. RETURN + +;SET UP POINTER TO DIRECTORY FOR BLOCK IN BLK +SETPTR: PUSH PDP,BLK ;SAVE BLK + PUSHJ PDP,DRPTR ;SET BLK AS A BYTE POINTER + MOVE DAT,BLK ;RETURN IT IN DAT + POP PDP,BLK ;RESTORE BLK + POPJ PDP, ;AND RETURN + +;GET NEXT AVAILABLE FREE BLOCK +NXTFRE: PUSH PDP,TEM + PUSHJ PDP,SETPTR ;SET DAT TO A BYTE POINTER + MOVEI TAC,0 ;LOOK FOR FREE BLOCKS + PUSHJ PDP,BLKSRA ;FIND A ZERO BLOCK + MOVEI BLK,0 ;NOT THERE- RETURN 0 +FREXIT: POP PDP,TEM + POPJ PDP, + +;GET PREVIOUS FREE BLOCK +LSTFRE: MOVEI TAC,0 + PUSH PDP,TEM + ADDI BLK,2 + PUSHJ PDP,SETPTR ;SET DAT AS A POINTER + SUBI BLK,2 + PUSHJ PDP,DECPTR ;DECREMENT BYTE POINTER + LDB TEM,DAT ;INDEX TO BLOCK + CAMN TEM,TAC ;FOUND? + JRST FREXIT ;YES. RETURN + SOJG BLK,.-4 ;TRY AGAIN IF NOT AT START + JRST FREXIT ;REACHED START - RETURN BLK=0 + +;DECREMENT BYTE POINTER +DECPTR: JUMPL DAT,.+5 + ADD DAT,[BYTE (6) 5] ;DECREMENT + JUMPG DAT,CPOPJ ;IF POSITIVE - SAME WORD + HRLI DAT,010500 ;RESET TO PREVIOS WORD + SOJA DAT,CPOPJ + HRLI DAT,060500 + SOJA DAT,CPOPJ + + ;COME HERE TO DELETE THE FILE WHOSE INDEX IS INN TAC +DLETE: MOVEI TAC1,0 ;SET TO DELETE BLOCKS + PUSHJ PDP,BLKSRC ;FIND A BLOCK BELONGING TO FILE + JRST CPOPJ ;ALL THROUGH + DPB TAC1,DAT ;DELETE IT + SOS 1(PDP) ;ADJUST PDL FOR RETURN + AOBJN PDP,BLKSRB ;AND FIND NEXT MATCH + + +;ENTER A FILE NAME IN DIRECTORY +ENTR: TRNE IOS,UDSD ;NON STANDARD? + JRST CPOPJ1 ;YES. RETURN + PUSHJ PDP,DSERCH ;NO. LOOK FOR MATCH + JRST NEWNT ;THIS IS A NEW ENTRY +ENTR2: MOVE TAC1,@UUO ;PICK UP 2ND WORD (EXTENSSION) + AOS UUO ;POINT TO WORD 3 + HRR TAC1,@UUO ;ADD DATE + TRNN TAC1,7777 ;IS DATE ALREADY THERE? + IOR TAC1,THSDAT ;NO, ADD CURRENT DATE + MOVEM TAC1,26(TAC) ;INTO DIRECTORY + SKIPGE AC3,OBLK(DEVDAT) ;IS THIS A SAVE FILE (UGETF DONE + ;BEFORE THE ENTER?) + AOJA UUO,SETWD4 ;YES. STORE LENGTH IN DIRECTORY +ENTRA: SUBI UUO,2 ;NO. POINT TO NAME + MOVE TAC1,@UUO ;PICK IT UP + MOVEM TAC1,(TAC) ;INTO DIRECTORY + HLRE TAC,TAC ;COMPUTE INDEX OF FILE + ADDI TAC,27 + HLRZ DAT,IBLK(DEVDAT) ;INDEX OF INPUT FILE + SUB DAT,TAC ;WRITE SAME FILE AS READING? + JUMPE DAT,CPOPJ ;TAKE ERROR RETURN IF YES + HRLM TAC,OBLK(DEVDAT) ;SAVE INDEX IN DDB + + PUSHJ PDP,DLETE ;DELETE ALL BLOCKS BELONGING TO FILE + AOJE AC3,FNTRD ;FIND FIRST FREE BLOCK ON TAPE IF THIS + ;IS A SAVE FILE (UGETF DONE) + MOVEI BLK,DIRBLK ;NO. GET 1ST BLOCK CLOSE TO + TLO IOS,RVERSE ;DIRECTORY. GOING IN REVERSE + POPJ PDP,USLSTA + CAILE BLK,TOPBLK ;BLOCK LEGAL? + POPJ PDP, ;NO. ERROR RETURN +ENTRC: MOVEM BLK,FSTBLK(DEVDAT) ;SAVE AS 1ST BLOCK + HRRM BLK,OBLK(DEVDAT) ;SAVE IN DDB + AOS UUO ;POINT UUO TO WORD 2 + HRRM BLK,@UUO ;SAVE 1ST BLOCK IN USER'S AREA + HLL TAC,@UUO ;GET EXTENSION + HLLM TAC,DEVEXT(DEVDAT) ;SAVE EXTENSION IN DDB ALSO + TLO IOS,NOLINK + AOS (PDP) + ;MARK DIRECTORY ENTRY POINTED TO BY BLK AS TAKEN +MARKDR: PUSHJ PDP,DRPTR ;SET POINTER TO BLOCK IN DIR + HLRZ TAC,OBLK(DEVDAT) ;PICK UP INDEX + IDPB TAC,BLK ;MARK DIRECTORY + TLO IOS,CHNGDR ;DIRECTORY HAS CHANGED + JRST STOIOS + +;;SET POINTER TO CORRECT DIRECTORY ENTRY +DRPTR: SUBI BLK,1 ;SET FOR ILDB OR IDPB + IDIVI BLK,7 ;COMPUTE WORD, POSITION + ADD BLK,OLOC(DEVDAT) ;GET CORRECT ADDRESS + HRLI BLK,440500 ;MAKE IT A BYTE POINTER + JUMPE DAT,CPOPJ ;CORRECT FOR POSITION IN WORD + IBP BLK + SOJG DAT,.-1 + POPJ PDP, + +;HERE FOR NEW FILE NAME ON ENTER +NEWENT: SUB TAC,[XWD 26,26];START AT BEGINNING OF DIRECT. + + SKIPN (TAC) ;FIND A FREE SLOT + AOJA UUO,ENTR2 ;RETURN WITH UUO POINTING TO WRD 2 + AOBJN TAC,.-2 + POPJ PDP, ;NONE AVAILABLE. + +;SET UP LENGTH OF FILE IN DIRECTORY FOR A SAVE FILE +SETWD4: HLRE TAC1,@UUO ;GET -LENGTH + MOVNS TAC1 ;+LENGTH + HRRE TEM,@UUO + ADD TAC1,TEM ; +START ADDRESS + TRZ TAC1,1777 ;STORE N-1, WHERE N IS NO OF K + LSH TAC1,2 + ORM TAC1,26(TAC) ;INTO 2ND WRD OF DIRECTORY + SOJA UUO,ENTRA ;CONTINUE WITH ENTER + +ENTRD: MOVEI TAC,0 ;GET THE 1ST FREE BLOCK ON TAPE + PUSHJ PDP,BLKSRC ;AS THE 1ST LOGICAL BLOCK OF THE FILE + POPJ PDP, ;NONE AVAILABLE + JRST ENTRC ;CONTINUE WITH ENTER + ;USETI - SET NEXT INPUT BLOCK TO READ +SETI: TDZ IOS,[XWD IOEND,IODEND] + SKIPA DAT,DEVDAT + +;USETO - SET NEXT OUTPUT BLOCK TO READ +SETO: MOVEI DAT,1(DEVDAT) + PUSHJ PDP,WAIT1 ;WAIT FOR BUFFERES TO FILL (OR EMPTY) + HRRM UUO,IBLK(DAT) ;SET BLOCK NUMBER + JRST STOIOS ;STOE IOS, POPJ + +;UGETF - GET NEXT FREE BLOCK FOR THIS FILE +GETF: PUSHJ PDP,WAIT1 ;WAIT TILL BUFFERES EMPTY + PUSHJ PDP,DIRCHK ;ENSURE DIR, IN CORE + PUSHJ PDP,USRFRE ;GET NEXT AVAILABLE BLOCK + SKIPN OBLK(DEVDAT) ;HAS AN ENTER OR LOOKUP BEEN DONE? + SETOB BLK,OBLK(DEVDAT) ;NO, SET SWITCH SO THAT THE NEXT ENTER + ;WILL FINE FIRST FREE BLOCK ON TAPE + MOVE TAC,BLK ;TELL USER THE BLOCK NUMBER + JRST STOTAC + +;GET NEXT (OR PREVIOUS) FREE BLOCK +USRFRE: MOVEI TEM,SPACE ;BLOCKS "SPACE" APART + LDB BLK,PIOMOD ;EXCEPT DUMP AND SAVMOD FILES + CAIL BLK,SD ;OR ONE OF DUMP MODES? + MOVEI TEM,2 + MOVEI TEM,2 ;YES, WHICH ARE CLOSRER +USRFRA: HRRZ BLK,OBLK(DEVDAT) ;CURRENT BLOCK + TLNE IOS,RVERSE ;FORWARD? + JRST USRLST ;NO + ADDI BLK,(TEM) ;YES, FIND NEXT BLOCK AT LEAST N + CAILE BLK,TOPBLK + TDZA BLK,BLK +CALNXT: PUSHJ PDP,NXTFRE ;BLOCKS PAST THIS ONE + JUMPN BLK,STOIOS ;RETURN IF FOUND + TLOE TEM,1 ;FOUND NONE ON THIS PASS + JRST NOBLKS ;TAPE IS FULL + TLC IOS,RVERSE ;REVERSE DIRECTION + HRRI TEM,1 ;START LOOKING AT NEXT BLOCK IN OTHER DIRECTION + JRST USRFRA +USRLST: SUBI BLK,(TEM) ;LOOK FOR FREE BLOCK N BEFORE + SKIPG BLK + TDZA BLK,BLK ;REVERSE IF AT FRONT OF TAPE +USLSTA: PUSHJ PDP,LSTFRE ;THIS ONE + JRST CALNXT+1 + +;NO FREE BLOCKS AVAILABLE. GIVE HIGH BLOCK,SET IOBKTL LATER +NOBLKS: MOVEI BLK,TOPBLK+1 ;SET HIGH BLOCK + POPJ PDP, + ;UTPCLR UUO +UTPCLR: TRNE IOS,UDSD + POPJ PDP, ;FORGET IT FOR NON-STANDARD + MOVSI TAC,400000 ;SET DIRECTORY-IN-CORE BIT + ORM TAC,DEVMOD(DEVDAT) + TLO IOS,CHNGDR ;DIRECTORY HAS CHANGED + HRRZ TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY + HRL TAC1,TAC + HRRI TAC1,1(TAC) ;BLT POINTER + SETZM (TAC) + BLT TAC1,176(TAC) ;LEAVE LAST WORD IN DIR, ALONE + MOVSI TAC1,17000 ;MARK DIRECTORY AS UNAVAILABLE + MOVEM TAC1,16(TAC) + MOVSI TAC1,757000 ;RESERVE BLOCKS 1 AND 2 + MOVEM TAC1,(TAC) ;FOR READ IN MODE LOADER + MOVSI TAC1,777770 ;MARK BLOCKS 1102-1105 AS + ORCAM TAC1,NAMSTR-1(TAC) ;UNAVAILABLE ALSO + JRST STOIOS + ;CLOSE UUO +UCLS: TLZE IOS,NOLINK ;IS LAST BLOCK NOT LINKED? + TRNE IOS,UDSD ;AND NOT NON-STD? + JRST STOIOS ;YES, RETURN + LDB TAC,PIOMOD ;NO. WRITE LAST BLOCK + CAIL TAC,16 ;DUMPO MODE? + JRST CLSDMP ;YES. CLOSE DUMP MODE + MOVEI TAC,@DEVOAD(DEVDAT) ;LOC OF BUFFER + MOVE TAC1,1(TAC) ;LINK WORD + TLON TAC1,-1 ;LINK=-1 IF NOT SPECIFIED + MOVEM TAC1,1(TAC) ;LINK = -1... EOF + MOVEM IOS,DEVIOS(DEVDAT) ;SAVE IOS + JRST OUT ;GO TO WRITE RECORD + + +;RELEASE UUO +UREL: SETZM FSTBLK(DEVDAT) ;ZERO FSTBLK + PUSHJ PDP,NXTCM2 ;CLEAR OUT DUMP-MODE STUFF + TRZ IOS,UDSD ;CLEAR NON-STD BIT. + SKIPG DEVMOD(DEVDAT) ;IF DIRECTORY HAS BEEN + TLZN IOS,CHNGDR ;MODIFIED IT MUST BE WRITTEN + POPJ PDP, ;NOT TOUCHED + TLO IOS,RWDIR+IO ;GOING TO WRITE IT + PUSHJ PDP,GETDT ;WAIT TILL DTC AVAILABLE + MOVEI BLK,DIRBLK ;BLOCK NUMBER + PUSHJ PDP,WRTBLK ;WRITE UT + PUSHJ PDP,WAIT1 ;WAIT TILL IT HAS BEEN WRITTEN + +;GET DEC TAPE CONTROLLER +GETDT: PUSHJ PDP,GETDCDT ;GET DATA CONTROL. DECTAPE CONTROL + AOSE DTREQ ;ARGUMENT FOR GETDCD + MOVEI TAC,QUANT ;HAVE IT NOW + MOVEM TAC,QUANTM ;KEEP IT FOR QUANT BLOCKS + MOVEM PROG,USEPRG + MOVEM DEVDAT,USEWRD ;SAVE ACS NEEDED ON INTERRUPT LEVEL + JRST SETACT ;LIGHT IOACT AND RETURN + +;HERE TO CLOSE A DUMP MODE FILE +CLSDMP: TLO IOS,DMPOCLS+IO+DMPMOD ;SET SWITCHES + PUSHJ PDP,GETDT ;GET CONTROL + SETZM BUF ;ENSURE LINK, WORDCOUNT=0 + JRST OUFULL ;GO WRITE THE BLOCK + EXTERN JOBDDT,USRDDT +;DUMP MODE INPUT +DMPI: IFN CPBIT, < + HRRZ AC2,IBLK(DEVDAT) +> + PUSHJ PDP,DMPSET ;SET UP DUMP-MODE STUFF + JRST ZERCOR ;ZER USER'S CORE IF SAVE-MODE + + +;INPUT UUO +UIN: TLZ IOS,IO + HRRZ BLK,IBLK(DEVDAT) ;BLOCK TO READ + PUSHJ PDP,STOIOS + TRNE IOS,UDSD ;NON STANDAR? + JRST READBF + JUMPE BLK,EOF ;0 MEANS EOF + PUSHJ PDP,BLKCHK ;CHECK LEGALITY OF BLOCK NUMBER + TLNN IOS,DMPMOD ;DUMP MODE? + CAIE BLK,DIRBLK ;TRYING TO READ DIRECTORY? + + JRST READBF ;NO. GO READ + +;READING DIRECTORY - GIVE CORE IMAGE IF IT EXISTS + PUSHJ PDP,DIRCHK ;READ IT IF IT ISN'T IN ALREADY + HRL TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY + MOVEI TAC1,@DEVIAD(DEVDAT) ;WHERE USER WANTS IT + HRRI TAC,1(TAC1) ;LOC OF DATA + BLT TAC,200(TAC1) ;GIVE IT TO HIM + PUSHJ PDP,ADVBFF ;ADVANCE BUFFERS + JFCL + POPJ PDP, + ;CHECK VALIDITY OF BLOCK NUMBER +BLKCHK: CAIG BLK,TOPBLK ;LEGAL? + POPJ PDP, ;YES. RETURN + POP PDP,TAC + TROA IOS,IOBKTL ;NO. LIGHT ERROR BIT + +;INPUT BLOCK = 0 - END OF FILE +EOF: TLO IOS,IOEND ;LIGHT EOF BIT + TLNN IOS,DMPMOD + JRST STOIOS + JRST DMPEOF ;GIVE UP CONTROL IF DUMP-MODE + +;ZERO USER'S CORE ON SAVE-MODE INPUT +ZERCOR: MOVEI TAC,JOBDDT(PROG) ;ZERO CORE + HRLI TAC,1(TAC) + MOVSS TAC ;BLT POINTER + HRRZ TAC1,DMPLST(DEVDAT) ;TOP CELL TO ZERO (-175) + ADDI TAC1,(PROG) ;RELOCATE TO USER AREA + SETZM -1(TAC) ;ZERO + BLT TAC,(TAC1) + SETZM USRDDT ;DDT IS KEPT IN PROTECTED PART + JRST UIN + ;DUMP MODE OUTPUT +DMPO: PUSHJ PDP,DIRCHK ;MAKE SURE DIRECTORY IS IN CORE + IFN CPBIT, < + HRRZ AC2,OBLK(DEVDAT) +> + PUSHJ PDP,DMPSET ;SET DUMPO-MODE POINTERS + JFCL + +;OUTPUT UUO +UOUT: TLO IOS,IO + TRNE IOS,UDSD ;NON STANDARD? + JRST UOUT2 ;YES + PUSHJ PDP,DIRCHK ;NO. MAKE SURE DIRECTORY IS IN CORE + HRRZ BLK,OBLK(DEVDAT) + CAIN BLK,DIRBLKK ;CHECK IF WRITING DIRECTORY + JRST COR2HM ;YES, WRITE CORE IMAGE + JUMPE BLK,FAKAV ;DONT WRITE IF NO BLOCK GIVEN + PUSHJ PDP,BLKCHK ;CHECK FOR LEGAL BLOCK +UOUT2: TLNN IOS,DMPMOD ;ALREADY HAVE CONTROL IF DUMP-MODE + + PUSHJ PDP,GETDT ;GET DEC TAPE CONTROLLER +FILBUF: +DTOCHK: TLNE IOS,DMPMOD ;DUMP MODE? + JRST DMPFIL ;YES, FILL BUFFER FROM LIST + MOVSI TAC,@DEVOAD(DEVDAT) ;LOCATION OF BUFFER + ADD TAC,[XWD 1,BUF];SET TO STORE IN MONITOR BUFFER + BLT TAC,BUF+177 ;GO BLT IT + TLZ IOS,NOLINK + OUFULL: TRNE IOS,UDSD ;NON-STANDARD? + JRST OUTBL2 ;YES, NO FILE-STRUCTURED OPERATIONS + HLRE BLK,BUF ;IS IT? + JUMPL BLK,LSTBLK ;YES, - LAST BLOCK OF FILE + JUMPN BLK,OUTBLK ;IF NON-0 - YES + TLNE IOS,DMPCLS ;NO. LAST BLOCK OF A DUMPO FILE? + JRST OUTBLK ;YES. LINK MUST STAY 0 +OUCOMP: PUSHJ PDP,USRFRE ;COMPUTE NEXT BLOCK + TLO IOS,NOLINK ;THIS BLOCK NOT LINKED +OUTBLK: HRLM BLK,BUF ;SAVE LINK IN 1ST WORD OF BLOCK + MOVE TEM,FSTBLK(DEVDAT) ;STORE 1ST BLOCK OF FILE IN WORD + DPB TEM,[POINT 10,BUF,27] + HRRZ TEM,OBLK(DEVDAT) ;BLOCK TO WRITE NOW + HRRM BLK,OBLK(DEVDAT) ;BLOCK TO WRITE NEXT + MOVE BLK,TEM + PUSHJ PDP,MARKDR ;MARK BLOCK TAKEN IN DIRECTORY + SKIPA BLK,TEM +OUTBL2: HRRZ BLK,OBLK(DEVDAT) + PUSHJ PDP,STOIOS + +WRTBLK: PUSHJ PDP,FNDBLK ;GO SEARCH FOR BLOCK + MOVE TAC1,[BLKO DTC,700] ;HERE WE ARE - GO WRITE + JRST RDWRT + ;WRITE LAST BLOCK +LSTBLK: MOVEI BLK,0 ;LINK=0 + JRST OUTBLK ;GO WRITE LAST BLOCK + +;TRYING TO WRITE DIRECTORY - STORE IN CORE +COR2HM: MOVEI TAC,@DEVOAD(DEVDAT) ;WHERE IT IS + HRLI TAC,1(TAC) + HRR TAC,DLOC(DEVDAT) ;WHERE TO PUT IT + MOVEI TAC1,177(TAC) + BLT TAC,(TAC1) + TLO IOS,CHNGDR ;REMEMBER TO WRITE IT OUT + MOVSI TAC1,DVDIRI + ORM TAC1,DEVMOD(DEVDAT) ;DIR. IS NOW IN CORE +FAKADV: TLZE IOS,DMPMOD ;DUMP MODE? + JRST THRUTD ;YES. GIVE UP CONTROL + PUSHJ PDP,ADVBFE ;ADVANCE BUFFERS + JFCL + TLZ IOS,NOLINK ;DIRECTORY BLOCK IS NOT LINKED + SETZM OBLK(DEVDAT) + JRST STOIOS + ;SET UP POINTERS AND STUFF FOR DUMP-MODE +DMPSET: TLO IOS,DMPMOD ;LIGHT BIT + PUSHJ PDP,GETDT ;GET CONTROL + HRLI UUO,PROG + PUSHJ PDP,COMCHK ;CHECK VALIDITY OF LIST + JRST SVADER ;NG. GIVE ADRESS ERROR + SKIPL TAC,@UUO ;OK. NULL LIST? + JRST DMPTS1 ;YES. RETURN + IFN CPBIT, < + TRNE IOS,UDSD ;NO. NON-STD MODE? + SOJA DAT,TDUSER ;YES. GO ELSEWHERE +> +DMPST2: SOS UUO ;NO. SAVE START OF LIST (-1) + MOVEM UUO,DMPLST(DEVDAT) + JRST CPOPJ1 + +DMPTS1: POP PDP,TAC + JRST THRUTD + + IFN CPBIT, < +;HERE TO START DUMP-MODE INTO USER AREA DIRECTLY +TOUSRF: JUMPE AC2,NOBLK0 ;CANT READ BLK 0 IN NON-STD DUMP MODE + ASH DAT,-7 ;NUMBER OF WRDS IN LIST /200 + AOS DAT + MOVEM DAT,BLKCNT ;SAVE TO UPDATE POSITION + MOVEI UUO,@UUO ;REAL ADDRESS OF LIST + MOVEM UUO,USPNTR ;SAVE IT + MOVEM UUO,SVPNTR + ADDI TAC,(PROG) ;RELOCATE ADDRESS OF 1ST IOWD + MOVEM TAC,PNTR ;AND SAVE IT + MOVE TAC,[JSP DMPADV] ;SET UP LOC FOR WHEN + MOVEM TAC,DCLOC1 ;IOWD IS EXHAUSTED + HRRZM PROG,ADRPRG ;SAVE JUST ADDRESS OF PROG + TLO IOS,NOBUF ;INDICATE DIRECTLY TO USER + TLNN IOS,IO + JRST CPOPJ1 ;READING - CONTINUE + POP PDP,TAC ;WRITING - THIS WILL SAVE LOTS OF TIME + JRST OUTBL2 +> + ;FILL OUTPUT BUFFER FROM LIST +DMPFIL: MOVSI TAC1,-177 + IFE CPBIT, < + TRNE IOS,UDSD + SUB TAC1,ONEONE ;200 DATA WORDS IF NON-STANDARD +> +DMPFLB: PUSHJ PDP,NXTCOM ;GET NEXT COMMAND + JRST DMPOTH ;END OF LIST +DMPLFA: MOVE TEM,(TAC) ;GET NEXT WORD + MOVEM TEM,BUF+1(TAC1) ;INTO BUFFER + AOBJP TAC1,DMPOVR ;BUFFER FULL IF GOES + AOBJN TAC,.-3 ;GET NEXT WORD FROM COMMAND + JRST DMPFLB ;GET NEXT COMMAND + +DMPOTH: + IFE CPBIT, < + TRNN IOS,UDSD +> + HRRZM TAC1,BUF ;LIST RAN OUT SAVE WORD COUNT + + SETZM BUF+1(TAC1) ;ZERO REST OF BUFFER + HRRZI TAC1,BUF+2(TAC1) + CAILE TAC1,BUF+177 ;JUST ZERO 1 WORD IF AT TOP + JRST OUFULL + HRLI TAC1,-1(TAC1) + BLT TAC1,BUF+177 ;****TEST IF TOP OF BUFFER + JRST OUFULL ;NOW WRITE BUFFER + +;BUFFER FULL BEFORE END OF COMMAND +DMPOVR: AOBJN TAC,.+3 ;WAS THAT LAST WORD OF COMMAND? + PUSHJ PDP,NXTCOM ;YES. GET NEXT + MOVEI TAC,0 + MOVEM TAC,SVDWRD(DEVDAT) ;NO. SAVE REMAINDER OF COMMAND +DMPOVA: MOVEI TAC,177 + IFE CPBIT, < + TRNN IOS,UDSD +> + MOVEM TAC,BUF ;WD CNT =177 + JRST OUFULL ;GO WRITE PART OF STUFF + +;GET NEXT COMMAND FROM LIST +NXTCOM: SKIPN DMPLST(DEVDAT) ;END OF COMMANDS? + JRST NXTCM2 ;YES. RETURN + AOSA TAC,DMPLST(DEVDAT) ;GET NEXT COMMAND +NXTCM1: HRRM TAC,DMPLST(DEVDAT) ;STORE GO-TO ADDRESS + MOVE TAC,@TAC ;GET COMMAND + JUMPE TAC,NXTCM2 ;END OF LIST + JUMPG TAX,NXTCM1 ;GO-TO WORD + ADDI TAC,(PROG) ;REAL COMMAND - ADD RELOCATION + AOJA TAC,CPOPJ1 ;AND RETURN +;END OF DUMP-MODE LIST +NXTCM2: SETZM SVDWRD(DEVDAT) ;ZERO POINTERS + SETZM DMPLST(DEVDAT) + POPJ PDP, + +DMPFLC: SKIPE TAC,SVDWRD(DEVDAT) ;IS THERE ANOTHER COMMAND + JRST DMPFLA ;YES. GET IT + JRST DMPTH2 ;NO. THROUGH + DTC=210 +DTS=214 + +;IO INTERFACE +READBF: TLNN IOS,DMPMOD ;HAVE CONTROL IF DUMP-MODE + PUSHJ PDP,GETDT ;GET DT CONTROL + +READBC: PUSHJ PDP,FNDBLK ;SEARCH FOR RIGHT BLOCK + MOVE TAC1,[BLKI DTC,300] ;FOUND IT - START READING + +;HERE WITH BLK=BLOCK NUMBER, TAC1=FUNCTION, START SEARCH +RDWRT: PUSH PDP,TAC + HLLM TAC1,IOWD ;BLKI OR BLKO + HRLI TAC,-200 + TLNN IOS,RWDIR ;WRITING (READING) DIRECT? + SKIPA TAC,BFPNTR ;NO. INTO BUF + HRR TAC,DLOC(DEVDAT) ;YES. LOC OF DIRECTORY + SOS TAC ;NO. SET FOR FORWARD READ +IOGO: IFN CPBIT, < + TLNN IOS,NOBUF ;POINTER ALREADY SET UP IF DIRECT IO +> + MOVEM TAC,PNTR ;POINTER + OR TAC1,UNIT ;UNIT AND PI CHAN + MOVEM TAC1,COMAND ;SAVE COMMAND FOR READ OR WRITE + POP PDP,TAC ;RESTORE SEARCH COMMAND + CONO DC,DCIN ;SET DATA CONTROL TO REAF + CONO PI,DCON ;TURN ON DC PI CHANNEL + HLRI TAC,37 + CONO PI,PIOFF + CONO DTC,(TAC) ;START TAPE MOVING + HLRM TAC,DTCINT + CONO PI,PION + POPJ PDP, ;DISMISS INTERRUPT + +;HERE FOR AY DATA WORD WITH TAPE IN REVERSE +RVERS: 0 +IOWD: BLKI DTC,PNTR ;READ (WRITE) A WORD + JRST RVTHRU ;POINTER RAN OUT + SOS PNTR ;POINTER HAS TO BACK UP + SOS PNTR + JEN @RVERS ;DISMISS THE INTERRUPT + ;HERE WHEN POINTER RUNS OUT IN REVERSE +RVTHRU: JSR SHUTDN ;SHUT DOWN DATA CONTROL + JEN @RVERS ;DISMISS + +;HERE WHEN POINTER RUNS OUT FORWARD +DTATHR: 0 + JSR SHUTDN ;SHUT DOWN DATA CONTROL + JEN @DTATHR ;DISMISS + +SHUTDN: 0 + CONSZ DC,10000 ;DATA MISSED? + SETOM ERRFLG ;YES. SET SWITCH + CONSO DTC,400 ;READING? + CONO DC,0 ;YES. TERN OFF DC + CONO PI,DCOFF ;TURN OFF DC PI + JRST @SHUTDN + ;COME HERE TO START READING BLOCK NUMBERS + EXTERN PION,PIOFF + +FNDBLK: HRRZM BLK,BLOCK ;BLOCK WE'RE LOOKING FOR + SETZM ERRCNT +FNDBL2: SETZM ERRFLG ;RESET DATA MISSED FLAG + LDB TAC,PUNIT ;GET UNIT NUMBER + LSH TAC,3 ;POSITION IT + TRO TAC,DTCCHN ;ADD PI CHANNEL + MOVEM TAC,UNIT ;SAVE + MOVE TEM,[JSR SRCH] ;SET UP INTERRUPT CELLS + MOVEM TEM,DCLOC + MOVE TEM,[JSR DTATHR] + IFN CPBIT, < + TLNN IOS,NOBUF ;DCLOC1 ALREADY SET UP IF DIRECT IO +> + MOVEM TEM,DCLOC1 ;FOR FORWARD DATA OPERATIONS + CONSZ DTC,20000 ;IS TAPE ALREADY MOVING/ + JRST FNDBL4 ;YES + + TRO TAC,323200 ;NO, SET READ BLK NOS., START DELAY + TLNN IOS,RVERSE ;MOVE TAPE BACKWARDS? + TRO TAC,10000 ;YES +FNDBL3: IFN CPBIT, < + PUSH PDP,IOS + TLZ IOS,NOBUFC ;SET UP DIRCTN NON-0 IF DIRECT IO + HLLZM IOS,DIRCTN + POP PDP,IOS +> + MOVEM IOS,DEVIOS(DEVDAT) ;RESTORE IOS IN CORE + POPJ PDP, ;AND EXIT + +;HERE TO INITIATE READ OF A TAPE THAT IS MOVING ALREADY +FNDBL4: CONSZ DTC,10000 ;GOING BACKWARDS? + TRO TAC,10000 ;YES + TRO TAC,320200 ;SET TO READ BLOCKS, NO DELAY + JRST FNDBL3 ;GO TELL CONTROL + ;INTERRUPT HERE TO READ A BLOCK NUMBER +SRCH: 0 + MOVEM TAC,TEMP ;SAVE TAC + DATAI DTC,TAC ;NO. READ A BLOCK NUMBER + SUB TAC,BLOCK ;;PRESENT BLOCK - TARGET BLOCK + IFN CPBIT, < + SKIPE DIRCTN ;IF DIRECT IO + CONSO DTC,10000 ;MUST READ DATA FORWARD +> + JUMPE TAC,FOUND ;THERE IS ZERO + HRR TAC,UNIT ;NO. SET UP READ OF NEXT BLOCK + CONSZ DTC,10000 ;GOING IN REVERSE + TDC TAC,[XWD 400000,10000] ;YES, SWITCH TURN-AROUND TEST + SKIPL TAC ;TURN AROUND? + TRC TAC,12000 ;YES, SWITCH DIR., TUERN AROUND DELAY + CONO DTC,320200(TAC);TELL CONTROL + CONO DC,DCIN ;TELL DATA CONTROL ALSO +SRCHXT: MOVE TAC,TEMP ;RESET TAAC + JEN @SRCH ;AND EXIT THE INTERRUPT + + + IFN CPBIT, < +;HERE WHERE DUMP-MODE POINTER RUNS OUT +DMPADV: 0 + MOVEM TAC,TEMP + AOSA TAC,USPNTR ;ADVANCE LOC OF POINTER +DMPAV1: HRRM TAC,USPNTR + SKIPN TAC,@TAC ;END OF LIST? + JRST DMPAV3 ;YES. STOP TAPE + ADD TAC,ADRPRG ;ADD RELOCATION + JUMPG TAC,DMPAV1 + MOVEM TAC,PNTR ;NEW POINTER +DMPAV2: MOVE TAC,TEMP ;RESTORE TAC + JEN @DMPADV + + +DMPAV3: JSR SHUTDN ;SHUT DOWN TAPE + JRST DMPAV2 ;RESTORE TAC AND EXIT THE INTERRUPT + +> + ;HERE WHEN CORRECT BLOCK NUMBER IS FOUND +FOUND: CONSZ DTC,10000 ;GOING FORWARD? + JRST IORVRS ;NO + MOVE TAC,IOWD ;YES. SET BLKI/BLKO INOT PI LOC +FND1: MOVEM TAC,DCLOC + MOVE TAC,COMAND ;PICK UP READ OR WRITE COMMAND + TRNE TAC,400 ;WRITE? + CONO DC,DCOUT ;YES. CONDITION DATA CONTROL + CONO DTC,360000(TAC) ;START DATA FLOW + JRST SRCHXT ;AND LEAVE + +IORVS: MOVEI TAC,10000 ;SET IO FOR REVERSE + ORM TAC,COMAND + MOVEI TAC,177 + ADDM TAC,PNTR ;READ FROM TOP OF BUFFER DOWN + MOVE TAC,[JSR RVERS] ;HAVE TO DO SOME STUFF AT INTERRUPT + JRST FND1 + ;INTERRUPT HERE FOR FLAG CHANNEL +DTCINT: CONSO DTS,37 ;INTERRUPT FOR DECTAPE? + JRST . ;NO, GO AWAY + CONSZ DTS,40000 ;YES. JOB DONE ENABLED? + JRST BLKNUM ;NO. READING BLOCK NUMBERS + CONSZ DTC,4000 ;YES. TIME FLAG ENABLED? + JRST TIMINT ;YES. CHECK IF THIS IS A TIME INTERRUPT +DTCIN1: CONO DC,0 ;NO. TURN OFF DATA CONTROL + JSR DTCSAV ;SAVE ACS + MOVE DEVDAT,USEWRD ;RESTORE DEVDAT + MOVE IOS,DEVIOS(DEVDAT) ;AND IOS + MOVE PROG,USEPRG + CONSZ DTS,1 ;JOB DONE LIT? + CONSZ DTS,116 ;AND NO ERORS? + JRST ERRS ;NO. ERROR + SKIPF ERRFLG ;DATA MISSED? + JRST ERRS ;YES. TOO BAD + +;DATA WAS READ IN OR WRITTEN OUT FINE +DTCIN2: TLNE IOS,DMPMOD ;DUMP MODE? + JRST DMPTHR ;YES. GO ELSEWHERE + TLNN IOS,SINGL + JRST .+3 + LDB TAC,[POINT 10,BUF,27] ;GET 1ST BLOCK NO. IF READ + ;CAME FROM LOOKUP + MOVEM TAC,IBLK(DEVDAT) ;STORE IN DDB + TLZE IOS,IOW ;NO. IN IO WAIT? + PUSHJ PDP,SETIOD ;YES. TAKE OUT OF WAIT + TLZE IOS,SINGL+RWDIR+DMPCLS ;DIRECTORY OPERATION OR + ;CLOSING DUMP FILE? + JRST THRUTP ;YES. LEAVE + TLNE IOS,IO ;WRITING? + JRST OUTHRU ;YES + EXTERN JBTSTS,PJOBN + +;HERE ON END OF AN INPUT BLOCK + HRROI TAC1,177 ;MASK OUT 1ST-BLK DATA + TRNN IOS,UDSD ;UNLESS IN NON-STD + ANDM TAC1,BUF + MOVEI TAC,@DEVIAD(DEVDAT) ;WHERE TO STORE BLOCK + ADD TAC,[XWD BUF,1];FROM BUF TO THERE + MOVEI TAC1,177(TAC) + BLT TAC,(TAC1) ;TRANSFER IT + HLRZ BLK,BUF ;NEXT BLOCK TO READ + TRNE IOS,UDSD ;IF NON-STD + AOSA BLK,IBLK(DEVDAT);READ SEQUENTIAL BLOCKS + HRRM BLK,IBLK(DEVDAT) ;SAVE IN DDB + TRNE IOS,IODTER+IODERR+IOIMPM ;WAS THERE AN INPUT ERROR? + JRST THRUIN ;YES. DONT ADVANCE BUFFERS + PUSHJ PDP,ADVBUFF ;GET NEXT BUFFER + JRST THRUIN ;EMPTY BUF NOT AVAILABLE + + SKIPE BLK ;EXIT IF EOF OR BLOCK TOO LARGE + CAILE BLK,TOPBLK ;THE ERROR WILL BE CAUGHT ON THE + JRST THRUIN ;UUO LEVEL NEXT TIME AROUND + SOSGE QUANTM ;HAS TAPE HAD CHAN LONG ENOUGH? + SKIPG DTREQ ;YES. ANYONE ELSE WANT IT? + JRST READBC ;NO. READ NEXT BLOCK + +THRUIN: HRRZ TAC,OBLK(DEVDAT) ;TAPE ALSO BEING WRITTEN? + JUMPN TAC,THRUTP ;YES. DONT CHANGE REVERSE BIT + TLZ IOS,RVERSE ;NO. SET IOS BIT TO CORRECT DIRECTION + CONSZ DTC,100000 + TLO IOS,RVERSE + ;HERE WHEN TAPE IS DONE +THRUTP: CONSO DTC,200000 ;ON INTERRUPT LEVEL? + JRST THRUTD ;NO. TAPE IS NOT MOVING + MOVE TAC,UNIT ;SET TO STOP TAPE + CONSZ DTC,10000 ;GOING REVERSE? + TRO TAC,10000 ;YES + CONO DTC,245000(TAC) ;STOP TAPE, WITH TIME FLAG INTERRUPT ON + ;ENABLE JOB DONE AS A FLAG FOR DTCINT +THRUTA: SOSL DTREQ ;GIVE UP DATA CONTROL (DECTAPE CONTROL + SETOM DTAVAL ;WILL BE GIVEN UP AT NEXT INTERRUPT + TLZ IOS,DMPMOD+NOBUF ;RESET DUMP-MODE BIT + JRST CLRACT ;RESET IOACT AND RETURN + +THRUTD: PUSHJ PDP,THRUTA ;GIVE UP DATA CONTROL + SOSL DTREQ ;GIVE UP DECTAPE CONTROL + SETOM DTAVAL + CONO DC,0 ;SHUT OFF DATA CONTROL + CONO PI,DOFF ;AN TURN OF ITS PI CHANNEL + CONO DTC,0 ;SHUT DOWN DATA CONTROL + HLLZS DTCINT + POPJ PDP, ;AND LEAVE + + EXTERN CLOCK + +;HERE ON END OF OUTPUT BLOCK +OUTHRU: PUSHJ PDP,ADVBFE ;GET NEXT BUFFER + JRST THRUTP ;NOT FULL + JUMPE BLK,THRUTP ;DONE IF BLK=0 + HRRZ BLK,OBLK(DEVDAT) ;NEXT BLOCK TO WRITE + CAILE BLK,TOPBLK ;LEGAL? + JRST THRUTP ;NO. CATCH ERROR ON UUO LEVEL + SOSGE QUANTM ;YES. HAD CHAN LONG ENOUGH? + SKIPG DTREQ ;AND SOMEONE ELSE WANT IT? + JRST FILBUF ;NO. GO WRITE NEXT BLOCK + JRST THRUTP ;YES. GIVE UP TAPE + +TIMINT: CONSO DTS,20 ;TIME FLAG INTERRUPT ON? + JRST SPRIUS ;NO. THIS IS A SPURIOUS INTERRUPT + EXCH TAC,TIMREQ ;ANOTHER TAPE CAN NOT BE + CONO PI,PIOFF ;SELECTED FOR 25 MSEC SO + IDPB TAC,CLOCK ;PUT IN A CLOCK REQUEST + CONO PI,PION ;TO WAIT FOR 3 TICKS + EXCH TAC,TIMREQ ;BEFORE ALLOWING NEXT USER ON + CONO DTC,0 ;SHUT DOWN DTC + HLLZS DTCINT + JEN @DTCCHL ;AND LEAVE + +;HERE WITH AN INTERRUPT WHILE SEARCHING FOR BLOCK NUMBERS +BLKNUM: CONSZ DTS,2 ;END ZONE INTERRUPT? + JRST TURN ;YES. TURN AROUND + CONSO DTS,14 ;NO. ILLEGAL OP OR PARITY ERROR? + JRST DTCINT+1 ;NO. NOT REALLY A DECTAPE INTERRUPT + JRST DTCIN1 ;YES. GO HANDLE ERROR + +;HERE ON A SPURIOUS DECTAPE INTERRUPT +SPRIUS: CONI DTC,TEMPA ;READ DTC STATUS BITS + CONO DTC,@TEMPA ;GIVE A CONO TO DTC TO CLEAR INTERRUPT + JEN @DTCCHL ;EXIT THE INTERRUPT + +TIMREQ: XWD .+1,3 ;E CLOCK TICKS + SOSL DTREQ ;ALLOW OTHER JOBS + SETOM DTAVAL ;TO GET DT CONTROL NOW + POPJ PDP, + ;COME HERE ON END OF DUMP MODE BLOCK +SVDMTH: IFN CPBIT, < + TLNE IOS,NOBUF ;DIRECTLY TO USER? + JRST USDMTH ;YES. ALMOST THROUGH +> + MOVSI TAC1,-177 + IFE CPBIT, < + TRNE IOS,UDSD + SUB TAC1,ONEONE ;SET UP TAC1 WITH COUNT +> + TLNN IOS,IO + JRST SVOMIN ;INPUT FILE + HRRZ BLK,OBLK(DEVDAT) ;OUTPUT FILE, NEXT BLOCK + JUMPF BLK,DMPTHA ;LAST BLOCK + IFE CPBIT, < + TRNE IOS,UDSD ;IF NON-STD MODE + AOSA OBLK(DEVDAT) ;WRITE CONSECUTIVE BLOCKS +> + CAIG BLK,TOPBLK ;NOT LAST. LEGAL BLOCK NUMBER? + POPJ PDP, ;YES. RETURN + + TRO IOS,IOBKTL ;BLOCK TOO LARGE +DMPTHA: POP PDP,TAC +DMPTH2: SETZM SVDWRD(DEVDAT) ;ZERO DUMP-MODE STUFF + SETZM DMPLST(DEVDAT) +DMPTH3: TLZE IOS,IOW ;IS IO WAIT? + PUSHJ PDP,SETIOD ;YES, RESTART JOB + JRST THRUTP + +;HERE ON END SAVE MODE INPUT BLOCK +SVDMIN: HLRZ BLK,BUF ;NEXT BLOCK NUMBER + IFE CPBIT, < + TRNE IOS,UDSD ;NON-STANDARD? + AOSA BLK,IBLK(DEVDAT) ;YES, READ CONSECUTIVE BLOCKS +> + HRRM BLK,IBLK(DEVDAT) ;SAVE IN DDB + JRST CPOPJ1 + + IFN CPBIT, < +;HERE WHEN THROUGH DUMP-MODE DIRECTLY TO USER +USDMTH: MOVEI TAC1,IBLK(DEVDAT) + TLNE IOS,IO + MOVEI TAC1,OBLK(DEVDAT) ;SET TAC1 TO RIGHT BLOCK NUMBER + MOVE TAC,BLKCNT ;UPDATE BLOCK COUNTER + ADDM TAC,(TAC1) + JRST DMPTHA ;THROUGH +> + ;HERE WHEN THROUGH DUMP MODE BLOCK +DMPTHR: PUSHJ PDP,SVDMTH ;END OF BLOCK HOUSEKEEPING + JRST DMPFLC ;FILL BUFFER FOR NEXT OUTPUT + +;HERE WHEN THROUGH READING A DUMP-MODE BLOCK +DMIFIL: SKIPE TAC,SVDWRD(DEVDAT) ;PARTIAL COMMAND? + JRST DMIFLB ;YES. CONTINUE +DMIFLA: PUSHJ PDP,NXTCOM ;NO. GET NEXT COMMAND + JRST DMPTH2 ;END OF LIST - THROUGH +DMIFLB: MOVE TEM,BUF+1(TAC1) ;NEXT DATA WORD + MOVEM TEM,(TAC) ;GIVE TO USER + AOBJP TAC1,.+3 ;IF BUFFER IS FULL + AOBJN TAC,DMIFLB ;GET NEXT WORD + JRST DMIFLA ;GET NEXT COMMAND + + AOBJN TAC,.+3 ;BUFFER IO FULL. IS COUNT EXACTLY 177? + PUSHJ PDP,NXTCOM ;THAT COM, IS DONE. GET NEXT + JRST DMPTH2 ;END OF LIST - THROUGH + MOVEM TAC,SVDWRD(DEVDAT) ;SAVE PARTIAL COMMAND FOR NEXT TIME + JUMPE BLK,DMPEOF ;IF EOF - LIGHT BIT +RDNXT: CAIG BLK,TOPBLK ;BLOCK LEGAL? + JRST READBC ;GO READ BLOCK NUMBER + TROA IOS,IOBLKT ;LIGHT ERROR BIT + +;EOF BEFORE ALL DATA IS IN - DUMP MODE +DMPEOF: TRO IOS,IODEND ;LIGHT EOF BIT + JRST DMPTH2 ;GIVE UP TAPE + SVADER: PUSHJ PDP,DMPTH2 ;GIVE UP CONTROL + JRST ADRERR ;TYPE ERROR MESSAGE + + +;COME HERE ON ERROR +ERRS: AOS TAC,ERRCNT ;BUMP COUNT + IFN CPBIT, < + MOVE TAC1,SVPNTR ;YES. RESET POINTERS + MOVEM TAC1,USPNTR + MOVE TAC1,(TAC1) ;RESET PNTR + ADD TAC1,ADRPRG + MOVEM TAC1,PNTR +> +ERRS1: CONSO DTS,4 ;IF ILLEGAL OP - DONT RETRY + CAILE TAC,DTTRY ;ENOUGH REREADS? + SKIPA ;YES. PERMANENT ERROR + JRST FNDBL2 ;NO. TRY AGAIN + +;PERMANENT ERROR + +PERMER: CONSZ DTS,10 + TRO IOS,IODTER ;PARITY + CONSO DTS,100 + SKIPE ERRFLG + TRO IOS,IODERR ;MISSING DATA + CONSZ DTS,4 +NOBLK0: TRO IOS,IOIMPM ;ILLEGAL OP + TLNE IOS,DMPMOD ;DUMP MODE? + JRST DMPTHR ;YES. NOT THROUGH YET + TLNN IOS,IO+RWDIR+SINGL ;READING DATA? + JRST DTCIN2 ;YES. GIVE BUFFER TO USER + TLZE IOS,IOW + PUSHJ PDP,SETIOD ;OUT OF IO WAIT + TLZN IOS,RWDIR+SINGL ;DIRECTORY OPERATION? + JRST THRUTP ;NO. RETURN TO USER + PUSHJ PDP,THRUTP ;YES. STOP TAPE + MOVSI TAC,DVDIRIN ;CLEAR DIRECTORY IN CORE BIT + ANDCAM TAC,DEVMOND(DEVDAT) +BDDIR: LDB ITEM,PJOBN ;NUMBER OF OFFENDING JOB + JRST RADDIR ;GO PRINT ERROR MESSAGE + INTERN DTABUF +BFPNTR: IOWD 200,BUF+1 +ONEONE: XWD 1,1 +USEWRD: 0 +USEPRG: 0 +PNTR: 0 +TEMP: 0 +TEMPA: 0 +BLOCK: 0 +QUANTM: 0 +ERRCNT: 0 +FNDTMP: 0 +UNIT: 0 +COMAND: 0 +ERRFLG: 0 + IFN CPBIT, < +BLKCNT: 0 +SVPNTR: 0 +USPNTR: 0 +ADRPRG: 0 +DIRCNT: 0 +> +BUF: BLOCK 200 +DTAEND: END + diff --git a/src/eddt.mac b/src/eddt.mac new file mode 100644 index 0000000..068ab5b --- /dev/null +++ b/src/eddt.mac @@ -0,0 +1,2807 @@ + IFNDEF EDDT,< + EDDT=1 ;MAKE EXEC DDT +> +;ALL OTHER REFERENCES TO VERSION # ARE TAKEN CARE OF BY THIS DEFINITION + +DDTVER==22 + +SUBTTL 2 JUN 69 +REPEAT 0,< + + +DDT ASSEMBLY INSTRUCTIONS + +THE SOURCE OF DDT,13 WILL ASSEMBLE INTO SEVERAL DIFFERENT +VERSIONS; THE ASSEMBY IS CONTROLED BY THE VALUE ASSIGNED +TO THE SYMBOL "EDDT". THE SYMBOL "EDDT" IS DECODED AS FOLLOWSR: + +BIT 35 =0: ASSEMBLE USER MODE DDT + =1: ASSEMBLE AN EXECUTIVE MODE DDT + +BIT 34 =0: DO NOT ASSEMBLE THE PAPER TAPE FEATURE INTO DDT + =1: ASSEMBLE THE PAPER TAPE FEATURES BUT ONLY IF + ASSEMBLING AN EXECUTIVE MODE DDT +BIT 33 =0; FOR USER MODE DDT ONLY- ASSEMBLE USING THE + "TTCALL" UUO FOR TELETYPE IO + =1; FOR USER MODE DDT ONLY- ASSEMBLE USING THE + "DDTIN" AND "DDTOUT" UUO'S FOR TELETYPE IO + +BIT 32 =1; ASSEMBLE A FILE DDT + +BITS (0-17) + =0; ASSEMBLE A RELOCATABLE VERSION OF DDT (RELOC 0) + NOT=0; ASSEMBLE AN ABSOLUTE (NON-RELOCATABLE) VERSION + OF DDT WITH A STARTING ADDRESS BEING THE + NUMBER IN BITS 0-17 + +(IF THE SYMBOL "EDDT" IS NOT DEFINED AT ALL, DDT WILL BE ASSEMBLED + WITH EDDT=0.) + +EXAMPLES OF "EDDT" DEFINTIONS: + EDDT=0 ASSEMBLE A RELOCATABLE USER MODE DDT WITH TELETYPE + I/O DONE BY THE "TTCALL" UUO + + EDDT=1 ASSEMBLE A RELOCATABLE EXECUTIVE MODE DDT + + EDDT= + ASSEMBLE AN ABSOLUTE EXECUTIVE MODE DDT + WITH PAPER TAPE FEATURES, AND WHOSE STARTING + ADDRESS IS LOCATION 4000. + +EXAMPLE OF A MACRO ASSEMBLY COMMAND: + +.^C + +.R MACRO + +*DSK:UDDT,/C_TTY:,DTA2:DDT.12 +EDDT=0 +^Z + +END OF PASS 1 ;THIS LINE TYPED BY MACRO + +^Z + +NO ERRORS DETECTED ;TYPED BY MACRO + +PROGRAM BREAK IS 003340 ;TYPED BY MACRO + +* ;TYPED BY MACRO + + +OTHER VERSION OF DDT ARE ASSEMBLED IN A SIMILAR MANNER +BY DEFINING "EDDT": A DIFFERENT WAY WHERE THE EXAMPLE +DEFINED "EDDT=0". + +> ;END OF REPEAT 0 + + +IFNDEF EDDT, + +DEFINE XP (X.,Y.),< + IF2,> + + +IFN EDDT&1,> + +IFE EDDT&1, +IFN EDDT&10,< + TITLE FILDDT V0'VERSION -FILE DDT> + EXTERN JOBREL,JOBSYM,JOBSA + ZLOW=140>> + +;DO NOT SET LOWER CORE IF EXEC DDT(OK USER OR FILDDT) +IFE EDDT&1,< +JOBVER=137 + LOC JOBVER + DDTVER ;PUT VERSION # IN JOBVER +JOBDDT=74 + LOC JOBDDT + XWD DDTEND,DDT +RELOC 0 +> + + +IFN EDDT&,B53> + +HEADER \DDTVER^ + ;THE HEADER MACRO CONSTRUCTS THE TITLE AND VERSION # + +IFN EDDT&10,< CM=2 ;DEFINE SOFTWARE CHANS. + DP=3 +> + ;DEFINE ACCUMULATORS + +F=0 ;FLAGS +P=1 ;PUSH DOWN +R= ;POINTERS TO TABLES, CORE, ETC. +S= +W= ;CONTAINS DISPATCH ADDRESS IN WORD ASSEMBLER +T=5 ;TRANSFER DATA +W1=6 +W2=7 +SCH=10 ;MODE CONTROL SWITCH FOR OUTPUT +AR=11 ;MODE CONTROL SWITCH FOR OUTPUT +ODF=12 ;MODE CONTROL SWITCH FOR OUTPUT - CURRENT RADIX +TT=13 ;TEMPORARY +TT1=14 ;TEMPORARY + +;DEFINE I/O DEVICE MNEMONICS FOR DDT USE +PRS=4 +TTYY=120 +PTRR=104 +PTPP=100 + +;DEFINE PUSH DOWN LENGTH +LPDL=50 ;MAX LENGTH PUSH DOWN LIST + +;DEFINE BITS FOR USE IN LEFT HALF OF ACCUMULATOR F +COMF=200000 ;COMMA TYPED FLAG +TIF=100000 ;TRUNCATE TO 18 BITS - SET BY SPACE OR COMMA +PTF=100 ; +, -, OR * HAS BEEN TYPED +CTF=400 +SF=4 ;SYLLABLE FLAG +QF=1 ;QUANTITY TYPED IN TO WORD ASSEMBLER + +CF=40 ; $ TYPED +CCF=10000 ; $$ TYPED +MF=2 ;MINUS SIGN TYPED IN +LTF=20 ;LETTER TYPED IN TO CURRENT SYLLABLE +ROF=10 ;REGISTER OPEN FLAG +STF=4000 +FAF=1000 ; < TYPED +SAF=2000 ; > TYPED + +FPF=20000 ; . TYPED IN +FEF=400000 ; E FLAG + +MLF=200 ;*FLAG +DVF=40000 ;DIVIDE FLAG + +;PID IS 20 IF SYM TAB POINTER IS INDIRECT JOBSYM +PID=0 ;=0 IF SYMBOL TABLE POINTER IS IN JOBSYM + +;DEFINE BITS FOR USE IN RIGHT HALF OF ACCUMULATOR F + +ITF=2 ;INSTRUCTION TYPED IF ITF=1 +OUTF=4 ;OUTPUT IF OUTF=1 +CF1=400 ;OUTPUT 1 REGISTER AS CONSTANT +LF1=2000 ;OUTPUT 1 REGISTER AS FORCED SYMBOLIC OR CONSTANT +Q2F=1 ;NUMBER TYPED AFTER ALT MODE +R20F=10 ;TEMP FLAG USED IN SETUP +SBF=20 +NAF=200 ;NEGATIVE ADDRESSES PERMISSABLE +POWF=4000 ;ARGUMENT FOR EXPONENT COMING + +;DEFINE SYMBOL TABLE SYMBOL TYPES +GLOBAL=040000 ;GLOBAL SYMBOL +LOCAL=100000 +PNAME=740000 ;PROGRAM NAME +DELI=200000 ;DELETE INPUT +DELO=400000 ;DELETE OUTPUT + +DDT: INTERN DDTEND ;DECLARE END OF DDT AS INTERNAL, FOR + ; USER TO SEE (USER MODE) AND ONCE ONLY CODE + ; (MONITOR) + IFE EDDT&1,< ENTRY DDT + > + IFN EDDT&1,< INTERNAL DDT + DDTX=DDT + ENTRY DDTX ;NEEDED BY MONITOR> + +;DEFINE $ SYMBOLS INTERNAL TO DDT +OPDEF DDTINT [Z 0,] ;ADDRESS FLAG FOR INTERNAL REGISTERS + +RADIX 10 +NBP=8 ;NUMBER OF BREAKPOINTS +DEFINE DBPNT (Z.) +ZZ=0 +REPEAT NBP,> +RADIX 8 + + +XP $M,MSK +XP $I,SAVPI + +SETUWP=36 + + ;DEFINE I/O DEVICE MNEMONICS + +IFN EDDT&1,< + +XP PI,4B11 +XP PTP,100B11 +XP PTR,104B11 +XP CDR,114B11 +XP TTY,120B11 +XP LPT,124B11 +XP DC,200B11 +XP DIS,130B11 +XP PLT,140B11 +XP CR,150B11 +XP DSK,170B11 +XP UTC,210B11 +XP UTS,214B11 +XP DCSA,300B11 +XP DCSB,304B11 + +XP DF,270B11 +XP MTC,220B11 +XP MTS,224B11 +XP MTM,230B11 +XP DLS,240B11 +XP MDF,260B11 +XP DTC,320B11 +XP DTS,324B11 +XP TMC,340B11 +XP TMS,344B11 > + +;DEFINE EXTENDED OPERATIONS + +XP JOV,2554B11 +XP JEN,2545B11 +XP HALT,2542B11 + + IFE EDDT&10,< +DDT: JSR SAVE + PUSHJ P,REMOVB + HLRZ T,ESTU ;THIS SEQUENCE INITS SYM TABLE LOGIC + SUB T,ESTU + MOVE W,@SYMP + ADD T,W ;IF THE TOP OF THE UNDEFINED SYM TAB DOES + TRNE T,-1 ; NOT POINT TO BOTTOM OF REGULAR SYM TABLE,THEN + HRRZM W,ESTU ; RE-INIT UNDEFINED SYM TABLE POINTER. ESTU. + MOVE T,PRGM + SUB T,W ;IF THE SYM TABLE PNTR AND THE PROGRAM + TSC T,T ; NAME (PRGM) PNTR DO NOT END UP IN THE + MOVE W1,PRGM ; SAME PLACE. OR THEY DO NOT BOTH START ON + XOR W1,W ; AN EVEN (OR BOTH ON ODD) LOCATION. OR + TRNE W1,1 ; PRGM .GE.0, THEN RE-INIT PRGM. + JRST DDT2 ;EVEN-ODD PROBLEM + SKIPN T ;POINTERS DON'T END TOGETHER + SKIPL PRGM ;IF PRGM .GE. 0, THEN RE-INIT +DDT0: MOVEM W,PRGM ;PRGM=C(JOBSYM) +> + IFN EDDT&10,< +DDT: CALLI + MOVEI T,SYMSET + MOVEM T,JOBREN ;SET REENTER ADDRESS + MOVEI P,PS + INIT 1,17 + SIXBIT .DSK. + Z + HALT .-3 + SETZM CRASH+3 ;CLEAR PPN + SETZM COMNDS+3 ;CLEARN PPN IN CASE FILDDT SAVED AFTER STARTING + SETZM SNAP+3 ;ALSO GOOD PRACTICE TO BE SELF INITIALIZING + SETZM CRASHS ;ASSUME NO CRASH.SAV(IE. PEEK AT CURRENT MONITOR) + LOOKUP 1,CRASH + JRST NOCSH ;LET USER PASS. HE MAY WANT TO PEEK AT MON. + ; OR JUST WANT TO TYPE OUT VALUE OF SOME SYMBOLS + SETOM CRASHS ;FLAG CRASH.SAV EXISTS ON DSK + USETI 1,1 + INPUT 1,RSILST + + STATZ 1,740000 + HALT .-3 + SETOM RSAVE ;FORCE READING OF "CURRENT" BLOCK + ; ON FIRST EXAMINE +NOCSH: INIT CM,0 + SIXBIT .SYS. + XWD 0,CBUF + HALT .-3 + SETOM COMAND ;ASSUME A COMMAND FILE + LOOKUP CM,COMNDS +NOLPT: SETZM COMAND ;NO FILE IF NOT FOUND + SKIPM COMAND + JRST DD1 ;USE TTY I/O + INIT DP,1 + SIXBIT .,LPT. ;PREPARE FOR LPT OUTPUT IN AL MODE + XWD LBUF,0 + JRST NOLPT ;TREAT AS THO NO FILE + ENTER DP,SNAP + JRST NOLPT ;TREAT AS NO FILE IF CAN'T ENTER + JRST DD1 + +REPEAT 0,< +HOW TO COPY MONITOR SYMBOL TABLE INTO FILDDT +1) USE FDDD10 TO LOAD AN UNRUN VERSION OF YOUR MONITOR + AS SAVED AFTER BUILD OR LOADING. +2) RENAME IT AS CRASH.SAV +3) LOAD A PRISTINE VERSION OF FILDDT AND START IT TO SET + REENTER ADDRESS. +4) TYPE ^C REENTER +5) FILDDT WILL EXPAND AS NECESSARY AND COPY THE SYMBOL + TABLE FROM CRASH.SAV INTO ITSELF +6) AFTER CARRIAGE RETURN IS TYPED FILDDT IS DONE. +7) SAVE FILDDT WITH A NEW NAME SO AS NOT TO CONFUSE IT WITH THE + ORIGINAL FILDDT.SAV + +THE MONITOR CAN BE LOADED IN ANY OF THREE WAYS(IN ORDER OF PREFERENCE): + 1. UNDER TIME SHARING WITH REGULAR LOADER AND COMMON + 2. UNDER REGULAR 10/30 MONITOR WITH REGULAR 10/30 LOADER & COMMON + 3. UNDER SPECIAL 10/30 MONITOR(SPMON) WITH BUILD + +THE 3 WAYS LEAVE DDTSYM(36),JOBSYM(116) & T30SYM(131) IN DIFFERENT STATES: + + DDTSYM JOBSYM T30SYM + + 1. JUNK S.T.PTR JUNK + 2. JUNK JUNK(NON-NEG) S.T.PTR + 3. S.T.PTR S.T.PTR JUNK +> + +DDTSYM=36 + +T30SYM=131 + +EXTERNAL JOBFF,JOBREN + +SYMSET: MOVEI R,JOBSYM + PUSHJ P,FETCH + JRST ERR + MOVEM T,JOBSYM ;POSSIBLE SYMBOL POINTER + MOVEI R,DDTSYM + PUSHJ P,FETCH + JRST ERR + MOVEM T,DDTSTP ;YET ANOTHER CANIDATE + MOVEI R,T30SYM ;ASSUME LOADED BY 10/30 + PUSHJ P,FETCH + JRST ERR + SKIPL JOBSYM ;OR IS JOBSYM A POINTER (-VE)? + JRST REGT30 ;LOADED BY 10/30 + SKIPL DDTSTP ;DDTSYM A VALID POINTER (-VE)? + MOVE T,JOBSYM ;NO TAKE JOBSYM AS THE POINTER +REGT30: MOVEM T,JOBSYM ;SAVE IT OVER OLD JOBSYM + HLRES T,T + MOVMS T,T ;LENGTH OF SYMBOL TABLE + MOVE W,JOBFF + ADDI W,1300 ;LEAVE SPAVE FOR COMMAND & LPT BUFFERS. + ; OR DSK BUFFERS AND EXTRA SYMBOL DEFNS. + HRRZ W1,W ;SAVE LOC FOR COPY + ADD W,T ;ADD TABLE LENGTH + IORI W,1777 ;REQUEST INTEGRAL # OF K. + CALLI W,11 ;GET CORE + HALT ;UGH! + MOVE R,JOBSYM ;WHEREABOUTS OF MONITOR SYMBOLS + HRRM W1,JOBSYM ;NOW POINT TO FILDDT SYMBOLS +TCOPY: PUSHJ P,FETCH ;GET A WORD + JRST ERR + MOVEM T,0(W1) ;STASH IT + AOS W1 + AOBJN R,TCOPY + JRST NOLPT ;GO TRY IT +DDTSTP: Z ;SAVE POSSIBLE SYMBOL POINTER +> + + +DD1: PUSHJ P,CRF +DD1.5: TLZ F,ROF ;CLOSE ANY OPEN REGISTER + MOVE T,[XWD SCHM,SCH] + BLT T,ODF ;LOAD ACS +DD2: CLEARM PRNC ;PARENTHESES COUNT + MOVEI P,PS +LIS: MOVE T,ESTU + MOVEM T,ESTUT ;INIT UNDEFINED SYM ASSEM + TDZ F,[XWD 777777-ROF-STF,LF1+CF1+SBF+2+Q2F] +LIS0: TDZ F,[XWD 777777-ROF-STF-FAF-SAF,NAF] + CLEARM,WRD +LIS1: CLEARM,FRASE +LIS2: MOVEI T,1 + MOVEM T,FRASE1 + TLZ F,MLF+DVF +L1: TLZ F,CF+CCF+SF+FPF ;TURN OFF CONTROL, SYL, PERIOD FLAG + CLEARM,SYL +L1RPR: CLEARM,SYM + MOVEI T,6 + MOVEM T,TEM ;INIT SYMBOL COUNTER + MOVE T,[POINT 7,TXT] + MOVEM T,CHP ;SETUP FOR OPEVAL SYMBOL + CLEARM,DEN + CLEARM,WRD2 + +L2: PUSHJ P,TIN ;PICK UP CHARACTER + CAIL T,"A"+40 ;LOWER CASE A + CAILE T,"Z"+40 ;LOWER CASE Z + JRST .+2 + TRC T,40 ;CHANGE LOWER CASE TO UPPER CASE + TLNE F,CF ;CONTROL FLAG + JRST L21 + CAIG T,"Z" ;Z + CAIGE T,"A" ;A + JRST .+2 + JRST LET +L21: MOVE R,T + CAILF T,137 ;DISPATCH TABLE HAS ENTRIES ONLY .LE. 137 + JRST ERR + IDIVI R,3 ;REMAINDER GIVES COLUMN, QUOTIENT GIVES ROW + LDB W,BDISP(R+1) ;GET 12 BIT ADDRESS FROM DISPATCH TABLE + CAIGE W,MULT-DDT ;FIRST EVAL ROUTINE + JRST DDT(W) + MOVE T,SYL + TLZN F,LTF + JRST POWER + MOVE T,[XWD OPEVAL,EVAL] ;GET ADDRESSES OF LOOKUP ROUTINES + SKIPN WRD ;IF C(WRD)=0, CALL OPEVAL FIRST, OTHERWISE EVAL FIRST + MOVSS T + MOVEM T,SAVE + JRST L213 + +L212: HLRZS T,SAVE ;GET ADDRESS OF THE OTHER LOOKUP ROUTINE + JUMPE T,UND1 ;IF ADR=0, THEN SYMBOL UNDEFINED +L213: PUSHJ P,(T) ;CALL OPEVAL OR EVAL + JRST L212 ;SYMBOL NOT FOUND +L4: TLZE F,MF + MOVN T,T + TLNN F,SF + CAIE W,LPRN-DDT + JRST .+2 + JRST LPRN + + EXCH T,FRASE1 + TLNN F,DVF + IMULB T,FRASE1 + TLZE F,DVF + IDIVB T,FRASE1 + CAIGE W,ASSEM-DDT + JRST DDT(W) ;MULTIPLY OR DIVIDE + ADDB T,FRASE + CAIGE W,SPACE-DDT + JRST DDT(W) ; + - @ , + + ADD T,WRD + TLNE F,TIF ;TRUNCATE INDICATOR FLAG + HLL T,WRD ;TRUNCATE + MOVEM T,WRD + TLNN F,QF + MOVE T,LWT + CLEARM,R + MOVE W1,ESTUT + CAMN W1,ESTU + JRST L5 + CAILE W,CARR-DDT + JRST ERR +L5: CAIG W,RPRN-DDT + JRST DDT(W) + PUSH P,KILRET + SKIPN PRNC + JRST DDT(W) + +ERR: MOVEI W1,"?" + JRST WRONG1 +UNDEF: MOVEI W1,"U" + JRST WRONG1 +WRONG: MOVE W1,[ASCII /XXX/] +WRONG1: MOVEI P,PS + PUSHJ P,TEXT + PUSHJ P,LCT ;TYPE TAB + PUSHJ P,LISTEN ;GOBBLE ANY INPUT CHARACTER + JFCL + JRST DD2 +RET: MOVEI P,PS + PUSHJ P,LCT ;COMMON RETURN FOR TAB;,JRST LIS + JRST DD2 + +UND1: MOVE R,ESTUT ;UNDEFINED SYM ASSEMBLER + HLRE S,ESTUT + ASH S,-1 ;SETUP EVAL END TEST + PUSHJ P,EVAL2 + CAIN W,ASSEM-DDT + TLNN F,ROF + JRST UNDEF + SKIPE PRNC + JRST UNDEF + MOVEI T,"#" + CAIE W,ASSEM-DDT + PUSHJ P,TOUT + + MOVN R,[XWD 2,2] + ADDB R,ESTUT + MOVE T,SYM + TLO T,GLOBAL + MOVEM T,(R) + + HRRZ T,LLOCO + TLNE F,MF + TLO T,400000 + MOVEM T,1(R) + MOVEI T,0 + JRST L4 + +QUESTN: PUSHJ P,CRF ;LIST UNDEFINED SYMBOLS + MOVE R,ESTU +QUEST1: JUMPGE R,DD1 + MOVE T, (R) + SKIPA W1,ESTU + +QUEST2: ADD W1,[XWD 2,2] + CAME T,(W1) + JRST QUEST2 + CAME R,W1 + JRST QUEST4 + PUSHJ P,SPT + PUSHJ P,CRF +QUEST4: ADD R,[XWD 2,2] + JRST QUEST1 + NUM: ANDI T,17 ;T HOLDS CHARACTER + TLNE F,CF+FPF + JRST NM1 + MOVE W,SYL + LSH W,3 + ADD W,T + MOVEM W,SYL + MOVE W,DEN + IMULI W,12 ;CONVERT TO DECIMAL + ADD W,T + MOVEM W,DEN + AOJA T,LE1A + +DOLLAR: SKIPA T,[46+101-13] ;RADIX 50 $ TO BE +PERC: MOVEI T,47+101-13 ;PERCENT SIGN +LET: TLC F,SF+FPF ;EXPONENT IFF LTF'*FEF'*(T=105)*SF*FPF=1 + TLZN F,LTF+FEF+SF+FPF + CAIE T,105 ; E + TLOA F,LTF + TLOA F,FEF + JRST LET1 + TLZN F,MF + SKIPA W1,SYL + MOVN W1,SYL + MOVEM W1,FSV + CLEARM DEN +LET1: SUBI T,101-13 ;FORM RADIX 50 SYMBOL +LE1A: TLO F,SF+QF +LE2: MOVE W,SYM + MOVEI R,101-13(T) + IMULI W,50 ;CONVERT TO RADIX 50 + ADD W,T + SOSGE TEM ;IGNORE CHARACS AFTER 6 + JRST L2 + MOVEM W,SYM + IDPB R,CHP + MOVEM W,SYM + JRST L2 + NUM1: EXCH T,WRD2 ;FORM NUMBER AFTER $ + IMULI T,12 + ADDM T,WRD2 + TRO F,Q2F + JRST L2 + +NM1: TLNE F,CF + JRST NUM1 + MOVEI W1,6 ;FORM FLOATING POINT NUMBER + AOS NM1A +NM1A: MOVEI W2,0 + MOVSI R,201400 +NM1A1: TRZE W2,1 + FMPR R,FT(W1) + JUMPE W2,NM1B + LSH W2,-1 + SOJG W1,NM1A1 +NM1B: MOVSI W1,211000(T) + FMPR R,W1 ;COMPUTE VALUE OF NEW DIGIT + + FADRB R,FH ;ADD VALUE INTO FLOATING NO. + MOVEM R,SYL + AOJA T,LE1A + +POWER: TLNN F,FEF + JRST L4 ;NO EXPONENT + CAIE W,PLUS + CAIN W,MINUS + TROE F,POWF + TRZA F,POWF + JRST (W) ; E+- + + MOVE W2,DEN + CLEARM FRASE + MOVEI W1,FT-1 + TLZE F,MF + MOVEI W1,FT01 + SKIPA T,FSV +POW2: LSH W2,-1 + TRZE W2,1 + FMPR T,(W1) + JUMPE W2,L4 + SOJA W1,POW2 + PERIOD: MOVE T,LLOC + TLNE F,SF ;SYLLABLE STARTED + MOVE T,DEN + MOVEM T,SYL + TLNE F,FPF ;HAS A PERIOD BEEN SEEN BEFORE? + TLO F,LTF ;YES, TWO PERIODS MAKES A SYMBOL + TLON F,FPF+SF+QF + MOVEI T,0 + IDIVI T,400 + SKIPE T + TLC T,243000 + TLC W1,233000 + FAD T,[0] ;NORMALIZE T AND W1 + FAD W1,[0] + FADR T,W1 + MOVEM T,FH + HLLZS NM1A + MOVEI T,45 ;RADIX 50 PERIOD + JRST LE2 + +QUAN: SKIPA T,LWT ;LAST QUANTITY TYPED +PILOC: MOVEI T, SAVPI +QUAN1: MOVEM T,SYL +QUAN2: TLO F,SF+QF ;WRD,SYL STARTED + TLZ F,CF+CCF + JRST L2 + +CONTRO: ;SOME KIND OF ALTMODE +IFN EDDT&1,< MOVEI T,"$" ;$ + PUSHJ P,TOUT ;TYPE OUT $ +> + TLOE F,CF + TLO F,CCF + JRST L2 + EVAL: MOVE R,PRGM ;LOOK UP SYMBOL +EVAL0: HRLOI W1,37777+DELI + HLRE S,@SYMP + ASH S,-1 ;SETUP END TEST + JRST EVAL3 + +EVAL1: ADD R,[XWD 2,2] +EVAL2: SKIPL R + MOVE R,@SYMP + AOJG S,CPOPJ ;TRNASFER IF NO SYMBOL FOUND +EVAL3: MOVE T,(R) + XOR T,SYM + TLNN T,PNAME + TLOA W1,LOCAL + TDNE T,W1 + JRST EVAL1 + TLNN T,340000 + JRST EVAL1 + MOVE T,1(R) + +CPOPJ1: AOS (P) ;FOUND SYMBOL, SKIP +CPOPJ: POPJ P, + +;BIT 40 - DELETE OUTPUT +; 20 - DELETE INPUT +; 10 - LOCAL +; 04 -GLOBAL +; NO BITS - PROGRAM NAME + +TEXI: PUSHJ P,TEXIN ;INPUT TEXT + MOVEM T,SYL + MOVEI W1,5 + MOVEI T-1,0 + PUSHJ P,TEXIN + CAIN T,33 ;NEW ALT MODE, ESCAPE + JRST QUAN2 + TLNE F,CF + JRST SIXBIN + SKIPA +TEXI2: PUSHJ P,TEXIN + CAMN T,SYL + SOJA W1,TEXI3 + ROT T,-7 + LSHC T-1,7 + SOJA W1,TEXI2 + +TEXI3: LSHC T-1,-43 + JUMPL W1,QUAN1 + LSH T,7 + SOJA W1,.-2 + SIXBI1: PUSHJ P,TEXIN ; INPUT TEXT (SIXBIT) +SIXBIN: CAMN T,SYL + JRST SIXBI2 + ANDI T,77 + TRC T,40 + ROT T,-6 + LSHC T-1,6 + SOJA W1,SIXBI1 +SIXBI2: MOVE T,T-1 + JUMPL W1,QUAN1 + LSH T,6 + SOJA W1,.-2 + +KILL: TLNN F,LTF ;DELETE SYMBOLS + JRST ERR + PUSHJ P,EVAL + JRST KILL1 + MOVEI T,DELO/200000 ;DELETE OUTPUT + TLNE F,CCF + MOVEI T,DELI/200000 ;NO INPUT OR OUTPUT + DPB T,[POINT 2,(R),1] ;LEFT 2 BITS IN SYMBOL +KILRET: JRST RET ;USED AS A CONSTANT + + +KILL1: MOVE R,ESTU ;REMOVE UNDEFINED SYMS + JUMPGE R,UNDEF +KILL2: PUSHJ P,EVAL0 + JRST RET + PUSHJ P,REMUN + JRST KILL2 + +REMUN: MOVE S,[XWD 2,2] ;REMOVE ONE UNDEFINED SYMBOL + ADDB S,ESTU + MOVE W,-2(S) + MOVEM W,(R) + MOVE W,-1(S) + MOVEM W,1(R) + POPJ P, + TAG: TLNN F,LTF ; NO LETTERS IS ERROR + JRST ERR ; GO SAY ERROR + TLNE F,FAF ; DEFINE SYMBOLS + JRST DEFIN ;A +LI0: PUSHJ P,CRF + AOS T,LLOC +LI1: ;PUSHJ P,LINCHK ;TRUNCATE ADRS (UNLESS INSIDE DDT) + HRRZM T,LLOC + HRRZM T,LLOCO + PUSHJ P,PAD + MOVEI T,"/" + TLNE F,STF + MOVEI T,"!" + PUSHJ P,TOUT +LI2: TLZ F,ROF + PUSHJ P,LCT + MOVE R,LLOCO + PUSHJ P,FETCH + JRST ERR + TLO F,ROF + TLNE F,STF + JRST DD2 + JRST CONSYM ;RETURN IS A POPJ + +REPEAT 0,< +LINCHK: CAML T,[DDTINT SAVPI] ;TRUNCATE ADDRESSES + CAMLE T,[DDTINT BNADR+2] + HRRZS T + MOVEM T,LLOC + MOVEM T,LLOC0 + POPJ P, +> + +VARRW: PUSHJ P,DEPRA ;^ + PUSHJ P,CRF + SOS T,LLOC + JRST LI1 + +CARR: PUSHJ P,DEPRA ;CLOSE REGISTER + IFN EDDT&1, + IFE EDDT&1,< PUSHJ P,TIN + CAIN T,15 + JRST .-2 + JRST DD1.5> + OCON: TROA F,LF1+CF1 ;OPEN AS CONSTANT +OSYM: TRZ F,CF1 ;OPEN SYMBOLICALLY + TROA F,LF1 +SUPTYO: TLOA F,STF ;SUPPRESS TYPEOUT +SLASH: TLZ F,STF ;TYPE OUT REGISTER + TLNN F,QF ;WAS ANY QUANTITY TYPED? + JRST SLAS1 ;NO. DO NOT CHANGE MAIN SEQUENCE + MOVE R,LLOC ;YES. SAVE OLD SEQUENCE AND + MOVEM R,SAVLOC + HRRZM T,LLOC ;PUSHJ P,LINCHK ;TRUNCATE ADRS- SET UP NEW SEQUENCE +SLAS1: HRRZM T,LLOCO + JRST LI2 + +ICON: TLNN F,ROF ;REGISTER OPENED OR ERR + JRST ERR + PUSHJ P,DEPRS + JRST SLAS1 + TAB: PUSHJ P,DEPRS ;OPEN REGISTER OF Q + MOVEI T,-1(T) + EXCH T,LLOC ;SET UP NEW SEQUENCE AND + MOVEM T,SAVLOC ;SAVE OLD SEQUENCE + HRROI T,700000 ;3 RUBOUTS + PUSHJ P,TEXTT + JRST LI0 + +DEPRA: MOVE R,SAVLOC + TLNE F,CF ;RESTORE OLD SEQUENCE IF $CR,$CF, OR + EXCH R,LLOC ;IF $^ OR $BS WAS TYPED + MOVEM R,SAVLOC ;SETUP "NEW" OLD SEQUENCE + TLNE F,ROF ;IF REGISTER IS BEING CHANGED + TLNN F,QF ;REMOVE ALL PREVIOUS UNDEFINED + JRST DEPRS ;SYMBOL REFERENCES TO IT + MOVE R,ESTU + MOVEM W1,ESTU +DEPRA2: JUMPGE R,DEPRS + HRRZ W,1(R) + CAMN W,LLOCO + PUSHJ P,REMUN + ADD R,[XWD 2,2] + JRST DEPRA2 + +EQUAL: TROA F,LF1+CF1 ;= +PSYM: TRZ F,CF1 ;@ + TRO F,LF1 + PUSHJ P,CONSYM + JRST RET + +R50PNT: LSH T,-36 ;RADIX 50 SYMBOL PRINTER + TRZ T,3 + PUSHJ P,TOC + PUSHJ P,TSPC + MOVEI W1,LWT ;SETUP FOR SPT + JRST SPT + +SIXBP: MOVNI W2,6 ;SIXBIT PRINTER + MOVE W1,LWT +SIXBP1: MOVEI T,0 + ROTC T,6 + ADDI T,40 + PUSHJ P,TOUT + AOJL W2,SIXBP1 + POPJ P, + ;MODE CONTROL SWITCHES + +TEXO: MOVEI R,TEXTT-HLFW ;$T ASSUME 7 BIT ASCII + MOVE T,WRD2 + CAIN T,6 ;CHECK FOR $6T + MOVEI R,SIXBP-HLFW ;SET MODE SWITCH FOR SIXBIT + CAIN T,5 ;CHECK FOR $5T + MOVEI R,R50PNT-HLFW ;SET MODE SWITCH FOR RADIX 50 +HWRDS: ADDI R,HLFW-TFLOT ;H +SFLOT: ADDI R,TFLOT-PIN ;F +SYMBOL: ADDI R,PIN-FTOC ;S +CON: ADDI R,FTOC ;C + HRRZM R,SCH + JRST BASE1 + +RELA: TRZE F,Q2F ;CHANGE ADDRESS MODE TO RELATIE + JRST BASECH + MOVEI R,PADSO-TOC +ABSA: ADDI R,TOC ;A + HRRZM R,AR + JRST BASE1 + +BASECH: MOVE T,WRD2 ;$NR CHANGE OUTPUT RADIX TO N, N>1 + CAIGE T,2 + JRST ERR + HRRZM T,ODF +BASE1: MOVS S,[XWD SCHM,SCH] + TLNN F,CCF + JRST LIS1 + BLT S,ODFM ;WITH $$, MAKE MODES PERMANENT + JRST RET + +SEMIC: MOVEM T,LWT ;SEMICOLON TYPES IN CURRENT MODE + JRST @SCH + ;GO AND EXECUTE LOGIC + +GO: HRLI T,(JRST) ;G +IFE EDDT&1,< + TLON F,QF + HRR T,JOBSA> ;GET STARTING ADDRESS + +XEC: TLNN F,QF ;X + JRST ,ERR +XEC0: MOVEM T,TEM + PUSHJ P,CRF + PUSHJ P,TTYLEV + PUSHJ P,INSRTB + JSP T,RESTORE + XCT,TEM +XEC1: JRST DDT ;USED AT PROC0 + JSR,SAVE + PUSHJ P,REMOVB + PUSHJ P,CRF + JRST DD1 + ;BREAK POINT LOGIC +BP1: REPEAT NBP,< 0 ;JSR TO HERE FOR BREAKPOINT + JSA T, BCOM + 0 ;HOLDS INSTRUCTION WHILE BREAKPOINT IS IN PLACE +> + +B1INS=BP1+2 +BPN=.-3 + BCOM: 0 + POP T,LEAV ;MOVE INSTRUCTION TO LEAV + MOVEI T,B1SKP-B1INS+1(T) + HRRM T,BCOM3 ;CONDITIONAL BREAK SETUP + MOVEI T,B1CNT-B1SKP(T) + HRRM T,BCOM2 ;PROCEDE COUNTER SETUP + MOVE T,BP1-B1CNT(T) +IFN EDDT&1,< TLZ T,010000 ;TURN OFF USER MODE BIT> + HLLM T,LEAV1 ;SAVE FLAGS FOR RESTORING + EXCH T,BCOM + +BCOM3: SKIPE B1SKP ;ADDR MOD TO LOOK AT COND. INST. + XCT @.-1 +BCOM2: SOSG B1CNT ;ADDR MOD TO LOOK AT PROCEED COUNTER + JRST BREAK + + MOVEM T,AC0+T + LDB T,[POINT 9,LEAV,8] ;GET INSTRUCTION + CAIL T,264 ;JSR + CAILE T,266 ;JSA,JSP + TRNN T,700 ;UUO + JRST PROC1 ;MUST BE INTERPRETED + CAIE T,260 ;PUSHJ + CAIN T,256 ;XCT + JRST PROC1 ;MUST BE INTERPRETED + MOVE T,AC0+T + JRST 2,@LEAV1 ;RESTORE FLAGS, GO TO LEAV + +LEAV1: XWD 0,LEAV + BREAK: JSR SAVE ;SAVE THE WORLD + PUSHJ P,REMOVB ;REMOVE BREAKPOINTS + SOS T,BCOM3 + HRRZS T ;GET ADDR OF BREAKPOINT JUST HIT + SUBI T,B1ADR-3 ;CHANGE TO ADDRESS OF $0B + IDIVI T,3 ;QUOTIENT IS BREAK POINT NUMBER + HRRM T,BREAK2 ;SAVE BREAK POINT # + MOVE W1,[ASCII /$0B>/] ;PRELIMINARY TYPEOUT MESSAGE + SKIPG @BCOM2 ;TEST PROCEED COUNTER + TRO W1,">"_1 ;CHANGE T TO /$0B>>/ + DPB T,[POINT 4,W1,13] ;INSERT BREAK POINT # IN MESSAGE + PUSHJ P,TEXT2 + MOVE T,BCOM + HLLM T, SAVPI ;SAVE PROCESSOR FLAGS + MOVEI T,-1(T) + PUSHJ P,PAD ;TYPE PC AT BREAK + HRRZ T,@BCOM3 + HRRM T,PROC0 ;SETUP ADDRESS OF BREAK + HLRZ T,@BCOM3 + + JUMPE T,BREAK1 ;TEST FOR REGISTER TO EXAMINE + PUSHJ P,LCT ;PRINT TAB + HLRZ T,@BCOM3 + PUSHJ P,LI1 ;EXAMINE REGISTER C($NB)LEFT +BREAK1: MOVSI S,400000 +BREAK2: ROT S,.-. ;ROT BY # OF BREAK POINT + PUSHJ P,LISTEN ;DONT PROCEED IF TTY KEY HIT + TDNN S,AUTOPI ;DONT PROCEED IF NOT AUTOMATIC + JRST RET ;DONT PROCEED + JRST PROCD1 + +PROCEDE: TLNN F,QF ;N$P ;PROCEED AT A BREAKPOINT + MOVEI T,1 + MOVEM T,@BCOM2 + HRRZ R,BCOM3 + PUSHJ P,AUTOP +PROCD1: PUSHJ P,CRF + PUSHJ P,TTYLEV +PROC0: HRRZI R,XEC1 ;MODIFIED TO ADDR OF BREAKPOINT + PUSHJ P,FETCH + JRST BPLUP1 ;ONLY GET HERE IF MEMORY SHRANK + MOVEM T,LEAV + PUSHJ P,INSRTB + JRST PROC2 + +PROC1: MOVE T,AC0+T + JSR SAVE + JFCL +PROC2: MOVEI W,100 + MOVEM W,TEM1 ;SETUP MAX LOOP COUNT + JRST IXCT5 + IXCT4: IFE EDDT&1,< SUBI T,041 + JUMPE T,BPLUP + AOJGE T,IXCT6> ;DONT PROCEDE FOR INIT + ;DONT INTERPRET FOR SYSTEM UUOS + MOVEM R,40 ;INTERPRET FOR NON-SYSTEM UUOS + MOVEI R,41 +IXCT: SOSL TEM1 + PUSHJ P,FETCH + JRST BPLUP ;BREAKPOINT LOOPING OR FETCH FAILED + MOVEM T,LEAV +IXCT5: IFN EDDT&1,< + LDB T,[POINT 9,LEAV,8] ;GET INSTRUCTION + CAIN T,254 ;DON'T DO ANYTHING TO JRST IN EXEC MODE + JRST IXCT6> + HRLZI 17,AC0 + BLT 17,17 + MOVEI T,@LEAV + DPB T,[POINT 23,LEAV,35] ;STORE EFFECTIVE ADDRESS + LDB W1,[POINT 4,LEAV,12] ;PICK UP AC FIELD + LDB T,[POINT 9,LEAV,8] ;PICK UP INSTRUCTION FIELD + MOVEI P,PS + CAIN T,260 + JRST IPUSHJ ;INTERPRET PUSHJ + + CAIN T,264 + JRST IJSR ;INTERPRET JSR + CAIN T,265 + JRST IJSP ;INTERPRET JSP + CAIN T,266 + JRST IJSA ;INTERPRET JSA + MOVE R,LEAV + TRNN T,700 + JRST IXCT4 ;INTERPRET UUO + CAIN T,256 + JRST IXCT ;INTERPRET XCT + +IXCT6: JSP T,RESTORE +LEAV: 0 ;INSTRUCTION MODIFIED + JRST @BCOM + AOS BCOM + JRST @BCOM + +BPLUP: PUSHJ P,REMOVB ;BREAKPOINT PROCEED ERROR +BPLUP1: JSR SAVE + JFCL + JRST ERR + IPUSHJ: DPB W1,[POINT 4,CPUSHP,12] ;STORE AC FIELD INTO A PUSH + CLEARM,TEM3 + MOVE T,LEAV + JRST RESTR1 + +IJSA: MOVE T,BCOM ;INTERPRET JSA + HRL T,LEAV + EXCH T,AC0(W1) + JRST IJSR2 + +IJSR: MOVE T,BCOM ;INTERPRET JSR + HLL T,SAVPI +IJSR2: MOVE R,LEAV + PUSHJ P,DEP + JRST BPLUP ;ERROR, CAN'T STORE + AOSA T,LEAV +IJSR3: MOVE T,LEAV + JRST RESTORE + +IJSP: MOVE W,BCOM ;INTERPRET JSP + HLL T,SAVPI + MOVEM W,AC0(W1) + JRST IJSR3 + +;INSERT BREAKPOINTS + +INSRTB: MOVE S,[JSR BP1] +INSRT1: SKIPE R,B1ADR-BP1(S) + PUSHJ P,FETCH + JRST INSRT3 + MOVEM T,B1INS-BP1(S) + MOVE T,S + PUSHJ P,DEP + JFCL ;HERE ONLY IF CAN'T WRITE IN HIGH SEG +INSRT3: ADDI S,3 + CAMG S,[JSR BPN] + JRST INSRT1 + POPJ P, + +;REMOVE BREAKPOINTS + +REMOVB: MOVEI S,BNADR +REMOV1: MOVE T,B1INS-B1ADR(S) + SKIPE R,(S) + PUSHJ P,DEP + JFCL ;HERE ONLY IF NO WRITE IN HIGH SEG + SUBI S,3 + CAIL S,B1ADR + JRST REMOV1 + IFN EDDT&1, + IFE EDDT&1, + +;IN EXEC MODE, SAVE UP TTY STATUS ;IN USER MODE, DONE BY SAVE + ;ALL $B COMMANDS GET HERE IN FORM: $B + + +BPS: TLZE F,QF ;HAS BEEN TYPED? + JRST BPS1 ;YES + TRZE F,Q2F ;NO, HAS BEEN TYPED? + JRST BPS2 ;YES + MOVE T,[XWD B1ADR,B1ADR+1] ;NO, COMMAND IS $B - CLEAR ALL BREAKPOINTS + CLEARM B1ADR + BLT T,AUTOPI ;CLEAR OUT ALL BREAKPOINTS AND AUTO PROCEDE REGESTER + JRST RET + +BPS1: TRZN F,Q2F ;HAS BEEN TYPED? + JRST BPS3 ;NO + MOVE R,T ;YES, PROCESS THE COMMAND A$NB + TRO F,2 +BPS2: MOVE T,WRD2 + CAIL T,1 + CAILE T,NBP + JRST ERR + IMULI T,3 + ADDI T,B1ADR-3 + TRZN F,2 + JRST MASK2 + EXCH R,T + JRST BPS5 + +BPS3: MOVEI R,B1ADR ;PROCESS THE COMMAND A$B +BPS4: HRRZ W,(R) + CAIE W,(T) + SKIPN (R) + JRST BPS5 + ADDI R,3 + CAIG R,BNADR + JRST BPS4 + JRST ERR +BPS5: MOVEM T,(R) + CLEARM,1(R) + CLEARM,2(R) + +AUTOP: SUBI R,B1ADR ;AUTO PROCEDE SETUP SUBROUTINE + IDIVI R,3 + MOVEI S,1 + LSH S,(R) + ANDCAM S,AUTOPI + TLNE F,CCF + IORM S,AUTOPI + POPJ P, + ;FETCH AND DEPOSIT INTO MEMORY + + +DEPRS: MOVEM T,LWT ;DEPOSIT REGISTER AND SAVE AS LWT + MOVE R,LLOCO ;QUAN TYPED IN REGIS EXAM + TLZE F,ROF + TLNN F,QF + POPJ P,0 + ;CAIL R,DDT + ;CAILE R,DDREND-1 + PUSHJ P,DEP ;STORE AWAY + JRST ERR ;CAN'T STORE (IN DDT OR OUT OF BOUNDS) + POPJ P, ;RETURN + +;DEPOSIT INTO MEMORY SUBROUTINE + +IFE EDDT&10,< +DEP: IFE EDDT&1,< + JSP TT1,CHKADR ;LEGAL ADDRESS? + + JRST DEP4 ;YES BUT IN HI SEGMENT> + TRNN R,777760 + JRST DEPAC ;DEPOSIT IN AC + +IFE EDDT&10,< MOVE T,(R) > + JRST CPOPJ1 ;SKIP RETURN + +DEPAC: MOVEM T,AC0(R) ;DEPOSIT IN AC + JRST CPOPJ1 ;SKIP RETURN + +IFE EDDT&1,< +DEP4: MOVEI W,0 + CALLI W,SETUWP ;IS HI SEGMENT PROTECTED? TURN OFF + POPJ P, ;PROTECTED, NO SKIP RETURN + MOVEM T,(R) ;STORE WORD IN HI SEGMENT + TRNE W,1 ;WAS WRITE PROTECT ON? + CALLI W,SETUWP ;YES, TURN IT BACK ON + JFCL + JRST CPOPJ1 ;SKIP RETURN +> +> ;END NOT-FILDDT COND. + +IFN EDDT&10, ;ALWAYS OK NO-OP IF FILE DDT + ;FETCH FROM MEMORY SUBROUTINE + +FETCH: IFE EDDT&10, ;HIGH OR LOW OK FOR FETCH + TRNN R,777760 ;ACCUMULATOR? + SKIPA T,AC0(R) ;YES + MOVE T,(R) ;NO + JRST CPOPJ1 ;SKIP RETURN FOR LEGAL ADDRESS> + +IFN EDDT&10,< SKIPN CRASHS ;CRASH.SAV EXISTS? + JRST MONPEK ;NO - GO PEEK AT RUNNING MONITOR + MOVEM R,TEM4 ;SAVE THE AOBJN POINTER + HRRZ R,R ;STRIP OFF POSSIBLE COUNT + ADD R,OFFSET + IDIVI R,4000 ;R HAS LOCATION + CAIL R,30 ;R=NO. OF INPTS R+1=LOCATION + POPJ P, ;LARGER THAN 48K + TRNN S,777000 ;S=R+1 + JUMPE R,RSDNT ;LOC IS IN RESIDENT BLOCKJ + CAMN R,RSAVE ;IS LOC INCORE ? + JRST INCORE ;S=LOC + MOVEM R,RSAVE ;INPT NO. + IMULI R,20 ;16/INPT + USETI 1,1(R) ;BLOK 0 DOES NOT EXIST + INPUT 1,CURLST ;GET 16 BLKS + STATZ 1,740000 + HALT .-2 ;YEP +INCORE: SKIPA T,CURENT(S) +RSDNT: MOVE T,RSIDNT(S) + MOVE R,TEM4 ;RESTORE AOBJN POINTER + JRST CPOPJ1 +TEM4: 0 ;HOLD AOBJN POINTER +MONPEK: HRRZ T,4 ;REMOVE COUNT + CALLI T,33 ;DO PEEK UUO + JRST CPOPJ1 ;RETURN VALUE IN AC T +> +IFE EDDT&1,< ;DO ADDRESS CHECKS ONLY IN USER MODE +CHKADR: HRRZ TT,JOBREL ;GET HIGHEST ADDRESS IN LOW SEGMENT + CAIL TT,(R) ;CHECK FOR WITHIN LOW SEGMENT + JRST 1(TT1) ;ADDRESS IS OK IN LOW SEGMENT, SKIP RETURN + HRRZ T,JOBHRL ;GET HIGHEST ADDRESS IN HIGH SEGEMENT + TRNE R,400000 ;IS THE ADDRESS IN HIGH SEGMENT? + CAIGE TT,(R) ;IS THE ADR TO BIG FOR HIGH SEGMENT? + POPJ P, ;NO, YES- ILL. ADR. + JRST 0(TT1) +> ;END OF IFE EDDT&1 + +IFN EDDT&1, ;NO ADDRESS CHECKS IN EXEC MODE + FIRARG: MOVEM T,DEFV + TLO F,FAF + JRST ULIM1 +ULIM: TLO F,SAF + HRRZM T,ULIMIT +ULIM1: TLNN F,QF + JRST ERR + JRST LIS0 + + +LOOK: SKIPL R,PRGM ;LOOK UP SYMBOL + MOVE R,@SYMP + HLRE S,@SYMP + ASH S,-1 ;SETUP COUNT FOR LENGTH OF SYM TABLE + TLZ F,400000 + HRLZI W2,DELO+DELI + MOVEM T,TEM + +LOOK1: TDNE W2,(R) + + JRST LOOK3 + MOVE T,(R) + TLNN T,PNAME ;NAME + TLOA W2,LOCAL + SKIPA T,TEM + JRST LOOK3 + MOVE W,1(R) + XOR W,T + JUMPL W,LOOK3 + SUB T,1(R) + JUMPL T,LOOK3 + JUMPGE F,LOOK2 + MOVE W,1(R) + SUB W,1(W1) + JUMPLE W,LOOK3 +LOOK2: HRR W1,R ;POINTER BEST VALUE SO FAR + TLO F,400000 + JUMPE T,SPT0 +LOOK3: ADD R,[XWD 2,2] + SKIPL R + MOVE R, @SYMP + AOJLE S,LOOK1 ;TERMINATING CONDITION + MOVE T,TEM + TLNE F,400000 + SUB T,1(W1) + JRST CPOPJ1 + CONSYM: MOVEM T,LWT + TRNN F,LF1 + JRST @SCH ;PIN OR FTOC + TRNE F,CF1 + JRST FTOC + +PIN: ;PRINT INSTRUCTION + TLC T,700000 + TLCN T,700000 + JRST INOUT ;IN-OUT INSTRUCTION OR NEG NUM + AND T,[XWD 777000,0] ;EXTRACT OPCODE BITS + JUMPE T,HLFW ;TYPE AS HALF WORDS + PUSHJ P,OPTYPE + MOVSI T,777000 + AND T,LWT + TRNN F,ITF ;HAS INSTRUCTION BEEN TYPED? + PUSHJ P,LOOK ;NO, LOOK IN SYMBOL TABLE + TROA F,NAF ;INSTRUCTION TYPED, ALLOW NEG ADDRESSES + JRST HLFW ;NOT FOUND, OUTPUT AS HALFWORDS + PUSHJ P,TSPC + LDB T,[XWD 270400,LWT] ;GET AC FIELD + JUMPE T,PI4 + PUSHJ P,PAD +PI3A: MOVEI W1,"," + PUSHJ P,TEXT +PI4: MOVE W1,LWT + MOVEI T,"@" + TLNE W1,20 ;CHECK FOR INDIRECT BIT + PUSHJ P,TOUT + HRRZ T,LWT + LDB W1,[XWD 331100,LWT] ;INSTRUCTION BITS + CAIL W1,240 + CAILE W1,247 + JRST PI8 ;ALL (EXECPT ASH,ROT,LSH) HAVE SYMBOLIC ADRS + TLNN W1,20 + CAIN W,_-33 + JRST PI8 ;JFFO AND @ GET SYMBOLIC ADDRESSES + PUSHJ P,PADS3A ;ONLY ABSOLUTE ADDRESSING FOR LSH, ASH, AND ROT +PI7: TRZ F,NAF + LDB R,[XWD 220400,LWT] ;INDEX REGISTER CHECK + JUMPE R,PADS1 ;EXIT + MOVEI T,"(" + PUSHJ P,TOUT + MOVE T,R + PUSHJ P,PAD + MOVEI T,")" + JRST TOUT ;EXIT + +PI8: PUSHJ P,PAD + JRST PI7 + HLFW: REPEAT 0,< MOVE T,LWT + CAML T,[DDTINT SAVPI] + CAMLE T,[DDTINT BNADR+2] + SKIPA + JRST PAD> + HLRZ T,LWT ;PRINT AS HALF WORDS + JUMPE T,HLFW1 ;TYPE ONLY RIGHT ADR IF LEFT ADR=0 + TRO F,NAF ;ALLOW NEGATIVE ADDRESSES + PUSHJ P,PAD + MOVSI W1,(ASCII /,,/) + PUSHJ P,TEXT2 ;TYPE ,, +HLFW1: HRRZ T,LWT + +;PRINT ADDRESSES (ARG USUALLY 18 BITS BUT CAN BE 36 BITS: + +PAD: ANDI T,-1 + JRST @AR ;PADSO OR PAD1 +PADSO: JUMPE T,FP7B ;PRINT A ZERO + PUSHJ P,LOOK + +PADS1: POPJ P,0 + MOVE W2,1(W1) + CAIGE T,100 + CAIGE W2,60 + JRST PADS3 + MOVEM T,TEM + JUMPGE F,PAD1 + PUSHJ P,SPT0 + MOVEI T,"+" +PADS1A: PUSHJ P,TOUT + HRRZ T,TEM +PAD1: JRST TOC ;EXIT + +PADS3: MOVE T,TEM +PADS3A: TRNE F,NAF + CAIGE T,776000 + JRST TOC +PADS3B: MOVNM T,TEM + MOVEI T,"-" + JRST PADS1A + +INOUT: TDC T,[XWD -1,400000] ;IO INSTRUCTION OR NEG NUM + TDCN T,[XWD -1,400000] + JRST PADS3B ;TYPE AS NEG NUM + LDB R,[POINT 7,T,9] ;PICK OUT IO DEVICE BITS + CAIL R,774_-2 ;IF DEVICE <774, THEN TYPE + JRST HLFW ;TYPE AS HALF WORDS + LDB R,[POINT 3,T,12] + DPB R,[POINT 6,T,8] ;MOVE IO BITS OVER FOR OP DECODER + PUSHJ P,OPTYPE + PUSHJ P,TSPC + MOVSI T,077400 + AND T,LWT + JUMPE T,PI4 + PUSHJ P,LOOK ;LOOK FOR DEVICE NUMBER + JRST PI3A + MOVE T,TEM + LSH T,-30 + PUSHJ P,TOC + JRST PI3A +MASK: TLNE F,QF + JRST MASK1 + MOVEI T,MSK +MASK2: MOVEI W,1 + MOVEM W,FRASE1 + JRST QUAN1 +MASK1: MOVEM T,MSK + JRST RET + EFFEC: TLO F,LTF + HRRZ T,T +WORD: MOVEI R,322000-326000 ;JUMPE-JUMPN +NWORD: ADDI R,326000+40*T ;JUMPN T, + HRLM R,SEAR2 + TLZN F,QF + JRST ERR + SETCAM T,WRD + MOVSI T,FRASE-DEN-1 ;PREVENT TYPE OUT OF DDT PARTS + SETCMM FRASE(T) + AOBJN T,.-1 + MOVE T,ULIMIT + TLNE F,SAF + TLO F,QF ;SIMULATE A $Q TYPED + PUSHJ P,SETUP + PUSHJ P,CRF +SEAR1: PUSHJ P,FETCH + JRST SEAR2A + TLNE F,LTF ;CHECK FOR EFFECTIVE ADDRESS SEARCH + + JRST EFFEC0 + EQV T,WRD + AND T,MSK +SEAR2: JUMPE T,SEAR3 ;OR JUMPN T +SEAR2A: AOS R,DEFV ;GET NEXT LOCATION + PUSHJ P,LISTEN ;ANYTHING TYPED? + CAMLE R,ULIMIT ;OR END OF SEARCH? + JRST SEARFN ;YES + JRST SEAR1 ;NO, LOOK SOME MORE + +SEAR2B: MOVEI R,400000-1 ;MOVE UP TO HI SEGMENT + IORB R,DEFV ;PUT IN MEMORY TOO + TRNN R,400000 ;ALREAY IN HI SEGMENT? + JRST SEAR2A ;NO +SEARFN: SETCMM LWT ;COMPLEMENT BITS BACK AND STOP SEARCH + JRST DD1 + SEAR3: MOVE R,DEFV + PUSHJ P,FETCH + JRST ERR + TLZ F,STF ;GET RID OF SUPPRESS TYPEOUT MODE + MOVE T,DEFV + PUSHJ P,LI1 ;CALL REGISTER EXAMINATION LOGIC TO TYPE OUT + PUSHJ P,CRF + SETCMM LWT + SETCMM TEM +SEAR4: JRST SEAR2A + +EFFEC0: MOVEI W,100 + MOVEM W,TEM +EFFEC1: MOVE W,T + LDB R,[POINT 4,T,17] ;GET IR FIELD + JUMPE R,EFFEC2 + PUSHJ P,FETCH + JRST ERR + ADD T,W +EFFEC2: HRR R,T + TLNN W,20 ;INDIRECT BIT CHECK + JRST EFFEC3 + SOSE,TEM + PUSHJ P,FETCH + JRST SEAR4 + JRST EFFEC1 +EFFEC3: EQV T,WRD + ANDI T,777777 + JRST SEAR2 + SETUP: TLNN F,QF ;QUANTITY TYPED? + +IFN EDDT&10, +IFE EDDT&10,< +IFE EDDT&1, +IFN EDDT&1, +> + + HRRZM T,ULIMIT ;SAVE HIGH LIMIT INCREMENTED BY ONE + HRRZS R,DEFV ;GET 1ST ADDRESS + TLNN F,FAF ;WAS A 1ST ADR SPECIFIED? + SETZB R,DEFV ;NO, MAKE IT ZERO + CAML R,ULIMIT ;LIMITS IN A REASONABLE ORDER? + JRST ERR + POPJ P,0 + +ZERO: TLNN F,CCF + JRST ERR + PUSHJ P,SETUP + + HRRZ S,@SYMP ;GET 1ST ADR OF SYMBOL TABLE + HLRE W1,@SYMP ;GET LENGTH OF SYM TABLE + SUB W1,S ;GET NEG OF LAST ADR + MOVNS W1 ;GET POS LAST ADR + MOVEI T,0 ;0 TO STORE IN MEMORY +ZERO1: TRNE R,777760 + JRST ZEROR ;OK TO ZERO AC'S + CAIGE R,ZLOW + MOVEI R,ZLOW ;DON'T ZERO 20 THRU ZLOW + CAIL R,DDT + CAILE R,DDTEND + JRST .+2 + MOVEI R,DDTEND ;DON'T ZERO DDT + CAML R,S + CAMLE R,W1 + JRST .+2 + HRRZ R,W1 ;DON'T ZERO SYMBOL TABLE +ZEROR: CAMLE R,ULIMIT ;ABOVE LIMITS? + JRST DD1 ;YES, STOP + PUSHJ P,DEP ;DEPOSIT T + TROA R,377777 ; + AOJA R,ZERO1 + TRNN R,400000 ;HI SEGMENT? + AOJA R,ZERO1 ;NO, KEEP GOING + JRST DD1 ;FINISH + FTOC: ;NUMERIC OUTPUT SUBROUTINE +TOC: HRRZ W1,ODF + CAIN W1,10 ;IS OUPUT RADIX NOT OCTAL, OR + TLNN T,-1 ;ARE THERE NO LEFT HALF BITS? + JRST TOCA ;YES, DO NOTHING SPECIAL + HRRM T,TOCS ;NO, TYPE AS HALF WORD CONSTANT + HLRZS T ;GET LEFT HALF + PUSHJ P,TOCA ;TYPE LEFT HALF + MOVSI W1,(ASCII /,,/) + PUSHJ P,TEXT2 ;TYPE ,, +TOCS: MOVEI T,.-. ;GET RIGHT HALF BACK +TOCA: LSHC T,-43 + LSH W1,-1 ;W1=T+1 +TOC1: DIVI T,@ODF + HRLM W1,0(P) + JUMPE T,TOC2 + PUSHJ P,TOCA +TOC2: HLRZ T,0(P) + ADDI T,"0" + JRST TOUT + +TOC4: MOVM W1,T ;TYPE AS SIGNED DECIMAL INTEGER + JUMPGE T,TOC5 + MOVEI T,"-" + PUSHJ P,TOUT +TOC5: PUSHJ P,FP7 ;DECIMAL PRINT ROUTINE +TOC6: MOVEI T,"." + JRST TOUT + +;SYMBOL OUTPUT SUBROUTINE + +SPT0: HRRZM W1,SPSAV ;SAVE POINTER TO TYPED SYM +SPT: ;RADIX 50 SYMBOL PRINT + LDB T,[POINT 32,0(W1),35] ;GET SYMBOL +SPT1: IDIVI T,50 + HRLM W1,0(P) + JUMPE T,SPT2 + PUSHJ P,SPT1 +SPT2: HLRZ T,0(P) + JUMPE T,CPOPJ ;FLUSH NULL CHARACTERS + ADDI T,260-1 + CAILE T,271 + ADDI T,301-272 + CAILE T,332 + SUBI T,334-244 + CAIN T,243 + MOVEI T,256 + JRST TOUT + SYMD: MOVEI T,DELO/200000 ;$D ;DELETE LAST SYM & PRINT NEW + HRRZ R,SPSAV ;PICK UP POINTER TO LAST SYM + JUMPE R,ERR + DPB T,[POINT 2,(R),1] ;STORE SEMI-DELETE BITS IN SYMBOL + MOVE T,LWT + JRST CONSYM ;PRINT OUT NEXT BEST SYMBOL + ;FLOATING POINT OUTPUT + +TFLOT: MOVE A,T + JUMPG A, TFLOT1 + JUMPE A,FP1A + MOVNS A + MOVEI T,"-" + PUSHJ P,TOUT + TLZE A,400000 + JRST FP1A +TFLOT1: TLNN A, 400 + JRST TOC5 ;IF UNNORMALIZED, TYPE AS DECIMAL INTEGER + +FP1: MOVEI B,0 + CAMGE A,FT01 + JRST FP4 + CAML A,FT8 + AOJA B,FP4 +FP1A: MOVEI C,0 + +FP3: MULI A,400 + ASHC B,-243(A) + MOVE A,B + SETZM TEM1 ;INIT 8 DIGIT COUNTER + SKIPE A,B ;DON'T TYPE A LEADING 0 + PUSHJ P,FP7 ;PRINT INTEGER PART OF 8 DIGITS + PUSHJ P,TOC6 ;PRINT DECIMAL POINT + MOVNI A,10 + ADD A,TEM1 + MOVE W1,C +FP3A: MOVE T,W1 + MULI T,12 + PUSHJ P,FP7B + SKIPE,W1 + AOJL A,FP3A + POPJ P, + +FP4: MOVNI C,6 + MOVEI W2,0 +FP4A: ASH W2,1 + XCT,FCP(B) + JRST FP4B + FMPR A,@FCP+1(B) + IORI W2,1 +FP4B: AOJN C,FP4A + PUSH P,W2 ;SAVE EXPONENT + PUSH P,FSGN(B) ;SAVE "E+" OR "E-" + PUSHJ P,FP3 ;PRINT OUT FFF.FFF PART OF NUMBER + POP P,W1 ;GET "E+" OR "E-" BACK + PUSHJ P,TEXT + POP P,A ;GET EXPONENT BACK + FP7: IDIVI A,12 ;DECIMAL OUTPUT SUBROUTINE + AOS,TEM1 + HRLM B,(P) + JUMPE A,FP7A1 + PUSHJ P,FP7 + +FP7A1: HLRZ T,(P) +FP7B: ADDI T,260 + JRST TOUT + + 353473426555 ;1.0E32 + 266434157116 ;1.0E16 +FT8: 233575360400 ;1.0E8 + 216470400000 ;1.0E4 + 207620000000 ;1.0E2 + 204500000000 ;1.0E1 +FT: 201400000000 ;1.0E0 + 026637304365 ;1.0E-32 + 113715126246 ;1.0E-16 + 146527461671 ;1.0E-8 + 163643334273 ;1.0E-4 + 172507534122 ;1.0E-2 +FT01: 175631463146 ;1.0E-1 +FT0=FT01+1 + +FCP: CAMLE A, FT0(C) + CAMGE A, FT(C) + Z FT0(C) + +FSGN: ASCII .E-. + ASCII .E+. + +TEXTT: MOVE W1,T +TEXT: TLNN W1,774000 ;LEFT JUSTIFIED UNLESS LEFT CHAR IS NULL + LSH W1,35 +TEXT2: MOVEI T,0 ;7 BIT ASCII TEXT OUTPUT SUBROUTINE + LSHC T,7 + PUSHJ P,TOUT + JUMPN W1,TEXT2 + POPJ P, + KILC: XWD -NSYMS,LOW + +WRD: 0 +WRD2: 0 +PRNC: 0 + +FRASE: 0 ;DONT CHANGE ORDER, SEE SEARC+3 +SYL: 0 +LWT: 0 +TEM2: 0 +FRASE1: +TEM3: 0 +DEN: 0 + +PRGM: 0 +ESTU: 0 +ESTUT: 0 +FSV: 0 +FH: 0 +SYM: 0 +SPSAV: 0 ;POINTER TO LAST SYMBOL TYPED +DEFV: 0 +ULIMIT: 0 +LLOC: 0 +LLOCO: 0 +SAVLOC: 0 ;THE ADR OF OLD REGISTER EXAMINATION SEQUENCE +SYMP: XWD PID,JOBSYM + SAVPI: 0 + 1177 +SAVTTY: 0 +MSK: XWD -1,-1 +B1ADR: 0 +B1SKP: 0 +B1CNT: 0 + +REPEAT NBP*3-3, < 0> + +BNADR=.-3 +AUTOPI: 0 + +IFE EDDT&10,< +AC0: BLOCK 17 + +AC17: 0 +> + +SCHM: EXP PIN ;DO NOT CHANGE ORDER +ARM: EXP PADSO +ODFM: EXP 10 + +SARS: 0 +TEM: 0 +TEM1: 0 +IFN EDDT&10,< OFFSET: 0 > + IFN EDDT&1&B36,< + +PUNCH: TLC F,FAF+QF + TLCE F,FAF+QF + JRST ERR ;ONE ARGUMENT MISSING +PUN2: ADDI T,1 + HRRZM T,TEM1 + SUB T,DEFV + JUMPLE T,ERR + +PUN1: MOVEI T,4 ;PUNCH 4 FEED HOLES + PUSHJ P,FEED + TLNE F,CF ;PUNCH NON-ZERO BLOCKS? + JRST PUNZ ;YES + HRRZ R,DEFV + IORI R,37 + ADDI R,1 + CAMLE R,TEM1 + MOVE R,TEM1 + EXCH R,DEFV + MOVE T,R + SUB T,DEFV + HRL R,T + JUMPGE R,RET ;EXIT OR PUNCH + +PBLK: MOVE T,R + SOS W,T ;INIT CHECKSUM + PUSHJ P,PWRD +PBLK1: PUSHJ P,FETCH + JRST ERR + ADD W,T + PUSHJ P,PWRD + AOBJN R,PBLK1 + MOVE T,W + PUSHJ P,PWRD + JRST PUN1 + +;PUNCH NON-ZERO BLOCKS + +PUNZ0: AOS DEFV ;LOOK AT NEXT WORD +PUNZ: HRRZ W,DEFV ;ENTER HERE - GET STARTING ADDRESS + MOVE R,W + SUB W,TEM1 ;CALCULATE NEGATIVE LENGTH + HRL R,W ;SET UP AOBJN POINTER + JUMPGE R,RET ;FINISHED? + CAMG R,[XWD -40,0] ;BLOCK LONGER THAN 40? + HRLI R,-40 ;YES, FIX IT UP + MOVSI W1,400000 ;W1 NEGATIVE MEANS FLUSH 0 WORDS +PUNZ2: PUSHJ P,FETCH ;GET WORD FROM MEMORY + JRST ERR + JUMPE T,[AOJA W1,PUNZ4] ;IF WORD IS 0, INDEX 0 WORD COUNTER + MOVEI W1,0 ;CLEAR 0 WORD COUNTER +PUNZ4: JUMPL W1,PUNZ0 ;FLUSH 0 WORD, GET ANOTHER + CAIL W1,3 ; NOSKIP FOR 3RD 0 WORD AFTER NON 0 WORD + AOSA R ;ADVANCE R TO LAST ADR+1 + AOBJN R,PUNZ2 + ADD W1,DEFV ;CALCULATE DEFV-R+W1=-WORD COUNT + SUB W1,R + HRLM W1,DEFV ;PUT -WC IN LEFT HALF OF FA + EXCH R,DEFV ;SAVE ADR FOR NEXT BLOCK, GET POINTER + JRST PBLK + + + + +LOADER: TLNE F,QF + JRST ERR + MOVEI T,400 + PUSHJ P,FEED + MOVE R,LOADE + +LOAD1: MOVE T,0(R) + PUSHJ P,PWRD + AOBJN R,LOAD1 + MOVEI T,100 +LOAD2: PUSHJ P,FEED + JRST RET + +BLKEND: TLNN F,QF ;BLOCK END + MOVE T,[JRST 4,DDT] + TLNN T,777000 ;INSERT JRST IF NO OPCODE + TLO T,(JRST) + PUSH P,T + MOVEI T,100 + PUSHJ P,FEED + POP P,T + PUSHJ P,PWRD + PUSHJ P,PWRD ;EXTRA WORD FOR READER TO STOP ON + MOVEI T,500 + JRST LOAD2 + +PWRD: MOVEI W1,6 +PWRD2: ROT T,6 + CONSZ PTPP,20 + JRST .-1 + CONO PTPP,50 + DATAO PTPP,T + SOJG W1,PWRD2 + POPJ P,0 + +FEED: CONSZ PTPP,20 + JRST .-1 + CONO PTPP,10 + DATAO PTPP,FEED1 + SOJN T,FEED +FEED1: POPJ P,0 ;ADDRESS USED AS A CONSTANT + + +LOADB: + +PHASE 0 ;RIM10B CHECKSUM LOADER + XWD -16,0 +BEG: CONO PTRR,60 + HRRI AA,RD+1 +RD: CONSO PTRR,10 + JRST .-1 + DATAI PTRR,@TBL1-RD+1(AA) + XCT TBL1-RD+1(AA) + XCT TBL2-RD+1(AA) +AA: SOJA AA, + +TBL1: CAME CKSM,ADR + ADD CKSM,1(ADR) + SKIPL CKSM,ADR + +TBL2: JRST 4,BEG + AOBJN ADR,RD +ADR: JRST BEG+1 +CKSM=ADR+1 + +DEPHASE + +LOADE: XWD LOADB-.,LOADB +> ;END OF IFN EDDT$1&B36 + ;FOR PAPER TAPE IO + + SAVE: 0 ;SAVE THE ACS AND PI SYSTEM + SKIPN SARS + JRST SAV1 + AOS SAVE + JRST SAV5 +SAV1: IFN EDDT&1,< + CONI PRS,SAVPI + CONO PRS, @SAVPI+1> + MOVEM 17,AC17 + HRRZI 17,AC0 + BLT 17,AC0+16 + MOVE T, SAVE + HLLM T, SAVPI +SAV5: +;IFE EDDT&1, ;NO, SAVE STATE OF UWP + + SETOM,SARS ;FLAG PROTECTING SAVED REGISTERS + MOVEI P,PS + IFE EDDT&1, ;IN USER MODE, GET INTO DDT MODE + MOVE T,[XWD SCHM,SCH] + BLT T,ODF ;LOAD THE ACS WITH MODE SWITCHES + JRST @SAVE + +RESTORE: SETOM TEM3 ;RESTORE ACS AND PI SYSTEM +RESTR1: HRRM T,SAVE + MOVE T,SAVPI + HLLM T, SAVE +IFN EDDT&1,< + AND T, SAVPI+1 + IORI T, 2000 ;TURN ON CHANNELS + MOVEM T, SAVPI> +;IFE EDDT&1, ;EX MACHT NICHTS + HRLZI 17,AC0 + BLT 17,17 + SETZM SARS + SKIPL,TEM3 +CPUSHP: PUSH BCOM ;PROGRAM MODIFIED AT IPUSHJ +IFN EDDT&1,< CONO PRS,@SAVPI> + JRST 2,@SAVE + CRN: MOVEI T,15 ;CARRIAGE RETURN + JRST TOUT + +IFE EDDT&1,< +CRNRB: PUSHJ P,CRN + MOVEI T,177 + JRST TOUT> + +CRF: PUSHJ P,CRN + MOVEI T,12 ;LINE FEED + JRST TOUT + +LCT: IFN EDDT&1, + IFE EDDT&1, ;TYPE A TAB + +TSPC: MOVEI T,40 ;SPACE + JRST TOUT + IFN EDDT&1,< ;EXECUTIVE MODE TELETYPE I/O + +TIN: PUSHJ P,LISTEN ;TELETYPE CHARACTER INPUT + JRST .-1 + CAIE T,175 + CAIN T,176 + MOVEI T,33 ;CHANGE ALL ALT MODES TO NEW + CAIN T,177 ;RUBOUT? + JRST WRONG ;YES, TYPE XXX + TRNE T,140 ;DON'T ECHO CR,LF,ALT,TAB,BACK SPACE,ETC +TOUT: CAIG T,04 ;DON'T TYPE EOT OR LOWER CHARS + POPJ P, + HRLM T,(P) + IMULI T,200401 ;GENERATE PARITY + AND T,[11111111] + IMUL T,[11111111] + HLR T,(P) + TLNE T,10 + TRC T,200 ;MAKE PARITY EVEN + CONSZ TTYY,20 + JRST .-1 + DATAO TTYY,T + ANDI T,177 ;FLUSH PARITY + POPJ P,0 + +LISTEN: CONSO TTYY,40 ;LISTEN FOR TTY + POPJ P, + DATAI TTYY,T + ANDI T,177 + JRST CPOPJ1 + +TTYRET: MOVEI T,3410 +TTY1: MOVEI W2,40000 + CONSZ TTYY,120 + SOJG W2,.-1 + CONI TTYY,SAVTTY + DATAI TTYY,W2 + HRLM W2,SAVTTY + CONO TTYY,(T) + POPJ P, +TTYLEV: MOVE T,SAVTTY + TRZ T,160 + TRO T,3600 + TRNE T,10 + TRZ T,200 + JRST TTY1 + + +TEXIN: PUSHJ P,TIN ;INPUT SUBROUTINE FOR TEXT MODES + TRNN T,140 + JRST TOUT ;ECHO CHARACTERS (0-37) NOT ECHOED + POPJ P, +> + IFE EDDT&1,< ;USER MODE TELETYPE I/O + IFN EDDT&4,< ;ASSEMBLE WITH OLD DDT MODE IO + + +TIN: MOVE T,POUTBF ;GET NEXT CHARACTER ROUTINE + CAME T,[POINT 7,INBFF] + PUSHJ P,FINOUT + +IFE EDDT&10,< ILDB T,PINBFF > +IFN EDDT&10,< PUSHJ P,INCHR > + + CAIE T,176 + CAIN T,175 + MOVEI T,33 ;CHANGE TO NEW ALT MODE + CAIN T,177 ;RUBOUT? + JRST WRONG ;YES PRINT XXX + JUMPN T,CPOPJ + MOVE T,[POINT 7,INBFF] + MOVEM T,PINBFF + CALL T,[SIXBIT /DDTIN/] + JRST TIN + +TOUT: JUMPE T,CPOPJ ;OUT PUT A CHARACTER FLUSH NULLS + +IFN EDDT&10,< SKIPE COMAND + JRST PUTCHR > + + IDPB T,POUTBF + CAIE T,12 + POPJ P, +TTYLEV: +FINOUT: MOVEI T,0 + IDPB T,POUTBF + MOVE T,[POINT 7,INBFF] + MOVEM T,PINBFF + MOVEM T,POUTBF + CALL T,[SIXBIT /DDTOUT/] + CLEARM INBFF + POPJ P, + +PINBFF: POINT 7,INBFF +POUTBF: POINT 7,INBFF + +LISTEN=CPOPJ +INBFF: BLOCK 21 + +TTYRET: MOVE T,[POINT 7,INBFF] + MOVEM T,POUTBF + MOVEM T,PINBFF + CLEARM INBFF + POPJ P, + +TEXIN=TIN ;USE NORMAL INPUT FOR TEXT WHEN IN USER MODE +> + IFE EDDT&4,< ;ASSEMBLE WITH TTCALL TELETYPE IO + +OPDEF TTCALL [51B8] + +TEXIN: +TIN: + +IFE EDDT&10,< TTCALL 0,T ;GET NEXT CHARACTER INTO T > +IFN EDDT&10,< PUSHJ P,INCHR > + + CAIE T,175 + CAIN T,176 + MOVEI T,33 ;CHANGE OLD ALT MODES TO NEW + CAIN T,177 + JRST WRONG ;TYPE XXX FOR A RUBOUT + POPJ P, + + +TOUT: + +IFN EDDT&10,< SKIPE COMAND ;IS THERE A COMMAND FILE? + JRST PUTCHR ;YES > + + TTCALL 1,T ;OUTPUT A CHARACTER + POPJ P, + +LISTEN: TTCALL 2,T ;GET NEXT CHAR, NO IO WAIT + POPJ P, ;NO CHARACTER EXISTED, RETURN + JRST CPOPJ1 ;CHARACTER WAS THERE, SKIP RETURN + +TTYRET: TTCALL 6, ;WHEN RETURNING TO DDT, FLUSH ALL + POPJ P, ;WAITING INPUT CHARACTERS + +TTYLEV==CPOPJ ;NOTHING SPECIAL TO DO WHEN LEAVING DDT +> ;END OF IFN DDT&4 + +IFN EDDT&10,< +INCHR: SKIPE COMAND + JRST GETCHR + +IFN EDDT&4,< ILDB T,PINBFF ;NO COMMAND FILE> +IFE EDDT&4,< TTCALL 0,T ;O/P CHAR, > + + POPJ P, + +GETCHR: SOSLE CBUF+2 ;ANY REMAINING + JRST GETOK ;YES. + INPUT CM, + STATZ CM,740000 + HALT .+1 + STATZ CM,20000 ;END-OF-FILE? + JRST GETEND + +GETOK: ILDB T,CBUF+1 + JUMPE T,GETCHR ;BYPASS ZERO CHARACTERS + PUSHJ P,PUTCHR ;COPY INPUT TO OUTPUT FILE + POPJ P, + +GETEND: CLOSE DP, ;CLOSE OUTPUT WHEN INPUT EXHAUSTED + RELEASE DP, + RELEASE CM, + JRST NOLPT ;REVERT TO TTY WHEN COMMAND EXHAUSTED + +PUTCHR: SOSLE LBUF+2 ;ANY ROOM? + JRST PUTOK ;YES + OUTPUT DP, + STATZ DP,740000 ;ERRORS? + HALT .+1 + +PUTOK: + IDPB T,LBUF+1 ;DEPOSIT CHAR. + POPJ P, + +> ;END OF IFN EDDT&10 +> ;END OF IFE EDDT&1 + BDISP: POINT 12,DISP(R),11 + POINT 12,DISP(R),23 + POINT 12,DISP(R),35 +DISP: +DEFINE D (Z1,Z2,Z3)< _30+_14+Z3-DDT> + ;THIS MACRO PACKS 3 ADDRESSES INTO ONE WORD; EACH ADR IS 12 BITS + +IFE EDDT&1&B36,< PUNCH=ERR + BLKEND=ERR + LOADER=ERR> + +D ERR,ERR,ERR +D ERR,ERR,ERR +D ERR,ERR,VARRW +D TAB,LINEF,ERR +D ERR,CARR,ERR +D ERR,ERR,ERR +D PUNCH,ERR,ERR +D ERR,ERR,ERR + +D ERR,ERR,ERR +D CONTROL,ERR,ERR +D ERR,ERR,SPACE +D SUPTYO,TEXI,ASSEM +D DOLLAR,PERC,ERR +D DIVD,LPRN,RPRN +D MULT,PLUS,ACCF +D MINUS,PERIOD,SLASH +D NUM,NUM,NUM +D NUM,NUM,NUM +D NUM,NUM,NUM +D NUM,TAG,SEMIC +D FIRARG,EQUAL,ULIM +D QUESTN,INDIRECT,ABSA +D BPS,CON,SYMD +D EFFEC,SFLOT,GO +D HWRDS,PILOC,BLKEND +D KILL,LOADER,MASK +D NWORD,BITO,PROCEDE +D QUAN,RELA,SYMBOL +D TEXO,ERR,ERR +D WORD,XEC,ERR +D ZERO,OCON,ICON +D OSYM,VARRW,PSYM + +;THIS TABLE DOES NOT HAVE ENTRIES FOR CHARS .GE. 140; THESE +; ARE DETECTED AS ERRORS NEAR L21: + BITO: MOVEI R,BITT ;BYTE OUTPUT SUBROUTINE + HRRZI AR,TOC + TRZN F,Q2F + JRST ERR + MOVE T,WRD2 + MOVEM T,SVBTS + MOVEI T,^D36 + IDIV T,WRD2 + SKIPE T+1 + ADDI T,1 + MOVEM T,SVBTS2 + HRRZ SCH,R + JRST BASE1 + +BITT: MOVE T,SVBTS2 + MOVEM T,SVBT2 + MOVE T+1,LWT + MOVEM T+1,SVBT3 + PUSH P,LWT +BITT2: MOVEI T,0 + MOVE T+2,SVBTS + LSHC T,(T+2) + MOVEM T,LWT + MOVEM T+1,SVBT3 + CAIE AR,PADSO + PUSHJ P,TOCA + CAIE AR,TOC + PUSHJ P,PIN + SOSG SVBT2 + JRST BITT4 + MOVEI T,"," + PUSHJ P,TOUT + MOVE T+1,SVBT3 + JRST BITT2 + +BITT4: POP P,LWT + POPJ P, + +SVBTS: 0 +SVBTS2: 0 +SVBT3: 0 +SVBT2: 0 + +;DESCRIPTION OF OP DECODER FOR DDT: +; +; THE ENTIRE INSTRUCTION SET FOR THE PDP-6 CAN BE COMPACTED INTO +;A SPACE MUCH SMALLER THAN ONE REGISTER FOR EVERY SYMBOL. THIS OCCURS +;BECAUSE OF THE MACHINE ORGANIZATION AND INSTRUCTION MNEMONICS CHOSEN +;FOR THE PDP-6. FOR EXAMPLE, IF BITS (0-2) OF AN INSTRUCTION EQUAL +;101(2) THE INSTRUCTION IS A HALF WORD INSTRUCTION AND AN "H" MAY +;BE ASSUMED. "T" MAY BE ASSUMED FOR ALL TEST INSTRUCTIONS (WHICH +;BEGIN WITH 110(2). +; +; THE TABLE TBL IN DDT CONSISTS OF 9 BIT BYTES, 4 TO A WORD. +;THE NUMBERS IN THE BYTES HAVE THE FOLLOWING SIGNIFICANCE: +;0-37(8): THIS IS A DISPATCH COMMAND FOR THE OP-DECODER INTERPRETER. +; LET THE RIGHT MOST TWO BITS EQUAL N; LET THE NEXT 3 BITS +; EQUAL P. +; +; THE CONTENTS OF INST (INSTRUCTION) CONTAIN IN THE RIGHT +; MOST NINE BITS THE BINARY FOR THE MACHINE INSTRUCTION. +; P AND N REFER TO THE CONTENTS OF INST, AND THE OP DECODER +; WILL PRODUCE AN ANSWER D GIVEN P, N, AND THE CONTENTS +; OF INSTX N+1 GIVES THE NUMBER OF BITS IN INST; P GIVES THE +; POSITION (FROM THE RIGHT EDGE) OF THE N+1 BITS. +; +; EXAMPLE: P = 6 +; N = 2 +; +;; C(INST) = .010 101 100(2) +; +; THE RESULT = D = 010(2) = 2(8) +; +; D IS USED AS A DISPATCH ON THE NEXT BYTES IN THE TABLE. +; IF D = 5, 5 BYTES IN THE TABLE (DON'T COUNT THE BYTES WHICH +; PRINT TEXT, 41-72(8)) ARE SKIPPED OVER AND THE 6TH BYTE RESUMES +; THE INTERPRETATION. +; +;40(8) THIS IS A STOP CODE; WHEN THIS IS REACHED INTERPRETATION +; IS FINISHED. + +;41(8)-72(8) THE ALPHABET IS ENCODED INTO THIS RANGE. +; 41- A +; 42- B +; 72- Z +; WHEN A BYTE IN THIS RANGE IS REACHED, ITS CORRESPONDING +; LETTER IS TYPED. +; +;73(8)-777(8) THIS IS A TRANSFER BYTE. IF THE BYTE IN THIS RANGE IS +; CONSIDERED TO BE A, TRANSFER INTERPRETATION TO THE A-73(8)RD +; BYTE IN THE TABLE. +; +;MACROS ASSEMBLE THE TABLE TBL: +; 1. A NUMBER FOLLOWED BY ^ ASSEMBLES A DISPATCH BYTE. THE FIRST +; DIGIT IS THE POSITION; THE SECOND DIGIT IS THE SIZE. +; 2. A POINT (.) ASSEMBLES A STOP CODE. +; 3. A NAME FOLLOWED BY A SLASH ASSEMBLES A TRANSFER TO THE +; SYMBOLICALLY NAMED BYTE. +; 4. A STRING OF LETTERS TERMINATED BY A SPACE, COMMA, OR POINT, +; ASSEMBLE INTO A STRING OF BYTES, EACH BYTE BEING ONE LETTER. +; +;EXAMPLE OF BINARY TO SYMBOLIC DECODING: +; THE MACHINE CODE FOR JRST IS 254 +; INST 0 1 0 1 0 1 1 0 0 +; THE INTERPRETER STARTS WITH THE FIRST BYTE IN THE TABLE (63^). +; THE RESULT OF APPLYING THIS TO C(INST) GIVES 2. SKIPPING OVER +; 2 BYTES IN THE TABLE AND INTERPRETING THE THIRD RESULTS IN +; HAK/ BEING INTERPRETED. AT HAK:, THERE IS A 33^. APPLYING +; THIS TO C(INST) RESULTS IN 5 NON PRINTING BYTES BEING SKIPPED +; OVER: +; 1. MV/ +; MOV PRINTING TEXT +; 2. MO/ +; 3. ML/ +; 4. DV/ +; 5. SH/ +; +;H1/ IS THE NEXT BYTE INTERPRETER. AT H1: 03^ IS FOUND SO +;4 BYTES ARE SKIPPED OVER: +; EXC PRINTING TEXT +; 1. S3/ +; BL PRINTING TEXT +; T PRINTING TEXT +; 2. . +; 3. AO/ +; 4. AOB/ +; THE NEXT LETTERS JRS ARE TYPED OUT. THEN T/ IS FOUND. AT +;T; A T IS TYPED OUT; THEN A "." IS FOUND AND EVERYTHING STOPS. +; +; THE TABLE IS ALSO USED GOING FROM SYMBOLIC TO BINARY BUT A +; TREE SEARCH METHOD IS USED. + REPEAT 0,< + +DEFINE REDEF (XX)< +DEFINE INFO (AA,BB)< +AA XX'BB>> + + +DEFINE BYT9 (L)< +XLIST +REDEF % + ZZ==0 + ZZZ==0 + ZZM==1 + + IRPC L,< + Z=="L" + IFE Z-":",,<==CLOC> + IFNDEF FIR., + IFGE CLOC+73-1000-FIR., + Z==0> + IFE Z-"/", + IF2, + Z==0> + IFE Z-"^", + Z==0> + IFE **, + ZZZ==ZZZ/100>> + IFE Z-".", + Z==0> + IFN Z,*ZZM + ZZM==ZZM*100> + IFE Z,> +LIST> + +DEFINE OUTP (A)< + BINRY==BINRY*400+BINRY*400+A + BINC==BINC-1 + IFE BINC, + CLOC==CLOC+1> + + + +TBL: ;OPDECODER BYTE TABLE + +BINRY==0 +CLOC==0 ;SET BYTE LOCATION COUNTER TO 0 +BINC==4 ;INIT BYTES/WORD COUNTER + +BYT9 <63^UUO/FLO/HAK/ACCP/BOOLE/H HWT/T ACBM/> + +;IO INSTRUCTIONS +BYT9 <21^BD/CON,11^OI/S,01^Z/O/> +BYT9 + +;UUOS +BYT9 +BYT9 +BYT9 +BYT9 +BYT9 +;BYTE AND FLOATING INSTRUCTIONS + +BYT9 +BYT9 <21^LMB/R,IMB/LMB:02^.,L:L.,M:M.,B:B.,BYTE:32^...,03^UF,PA/DF,N/> +BYT9 + +;FWT,FIXED POINT ARITH,MISC. + +BYT9 +BYT9 <21^ADD IMB/SU BIMB:B IMB:02^.,I:I.,M/B/MO:22^> +BYT9 +BYT9 +BYT9 +BYT9 +BYT9 +BYT9 +BYT9 <01^.,J/SH:02^A S2/ROT S1/L S2:S S3:H S1/JFF O/S1:21^.,C:C.,> + +;ARITH COMP,SKIP,JUMP + +BYT9 +BYT9 +BYT9 +BYT9 <03^.,L/E:E.,L E/PA/G E/N:N.,G.,> + + +;HALF WORDS + +BYT9 +BYT9 <21^L HW4/R HW4:L HW3:32^IMS/Z IMS/O IMS/EIMS/> + +;TEST INSTRUCTIONS + +BYT9 +BYT9 + + +;BOOLEAN + +BYT9 +BYT9 +BYT9 +BYT9 +BYT9 + +;MORE UUO'S +BYT9 +BYT9 + +REPEAT BINC, +IFN BINRY, +> ;END OF REPEAT 0 + + + IFN EDDT&10,< ;FILDDT STUFF +CRASH: SIXBIT .CRASH. ;CANONICAL NAME FOR CRASH + SIXBIT .SAV. + Z + Z +COMNDS: SIXBIT .FILDDT. ;CANNONICAL NAME FOR COMMAND LIST + SIXBTI .TXT. + Z + Z +SNAP: SIXBIT .SNAP. ;NAME FOR OUTPUT IF TO RETRIEVABLE DEVCE + SIXBIT .LST. + Z + Z +CBUF: BLOCK 3 ;RING HEADERS +LBUF: BLOCK 3 +COMAND: Z ;-1 IF COMMAND FILE ,0 IF NOT +CRASHS: Z ;-1 IF CRASH.SAV ON DISK ,0 IF PEEK AT MONITOR +AC0=. +AC17=.+17 +RSIDNT: BLOCK 1000 ;LOCS 0-777 ALWAYS IN CORE +CURENT: BLOCK 4000 ;WINDOW TO THE FILE ON DISK +RSAVE: IOWD 1000,RSIDT ;INDEX OF THE CUFRRENT BLOCK, 0,1,... + Z +CURLST: IOWD 4000,CURENT + Z +> + + SUBTTL OP DECODER + +DEFINE BYT9 (A) > + +IF1,< + +DEFINE .ADR (A) < +%'A== CLOC +FIR.== CLOC +DEFINE .ADR (A) < +%'A== CLOC +IFGE -1000, >> + +DEFINE .TRA < +CLOC== CLOC+1 ;> + +SYN .TRA, .DIS + +DEFINE .TXT (A) < +IFNB , >> + +DEFINE .END (A) < +IFNB , > +CLOC== CLOC+1> + +> ;END OF IF1 +IF2,< + +DEFINE .ADR (A)> + +DEFINE .TRA (A) < +OUTP %'A+73-FIR.> + +DEFINE .DIS (A) < +OUTP A&70/2+A&7-1> + +DEFINE .TXT (A) < +IFNB , >> + +DEFINE .END (A) < +IFNB . > +OUTP 40> + +DEFINE OUTP (A)< +BINRY== BINRY+_ +IFE BINC, < + +BINRY +BINRY==0 +BINC==^D36 > +CLOC==CLOC+1 > + +> + TBL: ;OPDECODER BYTE TABLE + +BINRY= 0 +CLOC= 0 ;SET BYTE LOCATION COUNTER TO 0 +BINC= ^D36 ;INIT BYTES/WORD COUNTER + +BYT9 < + +.DIS 63,.TRA UUO,.TRA FLO,.TRA HAK,.TRA ACCP,.TRA BOOLF + .TXT H,.TRA HWT,.TXT T,.TRA ACBM + +;IO INSTRUCTIONS + +.DIS 21,.TRA BD,.TXT CON,.DIS 11,.TRA IO,.TXT S,.DIS 01,.TRA Z,. TRA O +.ADR BD,.DIS 01,.TXT BLK,.TRA IO,.TXT DATA,.ADR IO,.DIS 11,.TRA I,.TRA O + .ADR OI,.DIS 01,.TRA O,.TRA I +;UUOS + +.ADR UUOI,.DIS 51,.END,.TXT,.DIS 32,.TRA U40,.TRA U50,.TRA U60 + .DIS 21,.TRA U703,.DIS 11.,TRA USET,.DIS 01 +.TXT LOOKU,.TRA P,.TXT ENTE,.TRA R,.ADR USET,.TXT USET,.DIS 01,.TRA I,.TRA O +.ADR U40,.DIS 03,.TRA CAL,.TXT INI,.TRA T,.END,.END,.END,.END,.END,.TXT CALL,.TRA I +.ADR U60,.DIS 21,.TRA U603,.DIS 01,.TXT IN,.TRA BPUT,.TXT OUT + .ADR BPUT,M.,DIS 11,.TXT BU,.ADR F,.END F,.TXT,.TXT U,.TRA T +.ADR U603,.DIS 01,.TRA U6062,.TXT STAT,.DIS 11,.ADR O,.END O,.TXT,.ADR Z,.END Z,.TXT + .ADR U6062,.DIS 11,.TXT S,.TRA U62,.TXT G,.ADR U62,.TXT ETST,.TRA S + +;BYTE AND FLOATING INSTRUCTIONS + +.ADR FLO,.DIS 51,.TRA BYTE,.TXT F,.DIS 32,.TXT,.TXT AD,.TRA A,.TXT SB + .TRA A,.TXT MP,.TRA A,.TXT DV,.ADR A +.DIS 21,.TRA LMB,.TXT R,.TRA IMB,.ADR LMB,.DIS 02,.END,.TXT + .ADR L,.END L,.TXT,.ADR M,.END M,.TXT +.ADR B,.FND B,.TXT,.ADR BYTE,.DIS 32,.END,.END,.END,.TXT + .DIS 03,.TXT UF,.TRA PA,.TXT DF,.TRA N +.TXT FS,.TRA C,.TXT IB,.ADR P,.END P,.TXT,.TXT I,.TRA LD + .ADR LD,.TXT LD,.TRA B,.TXT I,.TRA DP,.ADR DP,.TXT DP,.TRA B + +;FWT-FIXED POINT ARITH-MISC + +.ADR HAK,.DIS 33,.TRA MV,.ADR MV,.TXT MOV,.TRA MO,.TRA ML,.TRA DV + .TRA SH,.TRA H1,.TRA JP +.DIS 21,.TXT ADD,.TRA IMB,.TXT SU,.ADR BIMB,.TXT B,.ADR IMB,.DIS 02,.END,.TXT + .ADR I,.END I,.TXT,.TRA M,.TRA B,.ADR MO,.DIS 22 +,ADR E1MS,.TXT E,.TRA IMS,.TXT S,.TRA IMS,.TXT N,.TRA IMS,.TXT M + .ADR IMS,.DIS 02,.END,.TXT,.TRA I,.TRA M,.ADR S,.END S,.TXT +.ADR ML,.DIS 21,.TXT I,.TRA ML1,.ADR ML1,.TXT MUL,.TRA IMB + .ADR DV,.DIS 21,.TXT I,.TRA DV1 +.ADR DV1,.TXT DI,.ADR DV2,.TXT V,.TRA IMB,.ADR H1,.DIS 03,.TXT EXC,.TRA S3,.TXT BL + .ADR T,.END T,.TXT,.TRA AO,.ADR AO,.TT AOBJ +.TRA AOB,.TXT JRS,.TRA T,.TXT JFC,.TRA L,.TXT XC,.TRA T,.END + .ADR AOB,.DIS 01,.TRA P,.TRA N +.ADR JP,.DIS 03,.TRA PU,.ADR PU,.TXT PUSH,.TRA PUS,.TRA PO + .ADR PO,.TXT POP,.TRA POP,.TXT JS,.ADR R,.END R,.TXT +.TXT JS,.TRA P,.TXT JS,.ADR PA,.END, A,.TXT,.TXT JR,.TRA PA + .ADR PUS,.DIS 01,.ADR J,.END J,.END,.TXT,.ADR POP +.DIS 01,.END,.TXT,.TRA J,.ADR SH,.DIS 02,.TXT A,.TRA S2,.TXT ROT,.TRA S1,.TXT L + .ADR S2,.TXT S,.ADR S3,.TXT H,.TRA S1,.TXT JFF,.TRA O + .ADR S1,.DIS 21,.END,.TXT,.ADR C,.END C,.TXT + +;ARITH COMP-SKIP-JUMP + +.ADR ACCP,.DIS 42,.TXT CA,.TRA CA1,.TRA SJ,.TXT A,.TRA JS,.TXT S + .ADR JS,.TXT O,.DIS 31 +.TXT J,.TRA COMP,.TXT S,.TRA COMP,.ADR CA1,.DIS 31,.TXT I,.TRA COMP,.TXT M,.TRA COMP +.ADR SJ,.DIS 31,.TXT JUM,.TRA PSJ,.TXT SKI,.ADR PSJ,.TXT P,.ADR COMP +.DIS 03,.END,.TXT,.TRA L,.ADR E,.END E,.TXT,.TXT L,.TRA E,.TRA PA,.TXT G,.TRA E + .ADR N,.END N,.TXT,.END G,.TXT + +;HALF WORDS + +.ADR HWT,.DIS 51,.TRA HW1,.DIS 21,.TXT 3,.TRA HW2,.TXT L,.ADR HW2,.TXT R,.TRA HW3 +.ADR HW1,.DIS 21,.TXT L,.TRA HW4,.TXT R,.ADR HW4,.TXT L + .ADR HW3,.DIS 32,.TRA IMS,.TXT Z,.TRA IMS,.TXT D,.TRA IMS,.TRA EIMS + +;TEST INSTRUCTIONS + +.ADR ACBM,.DIS 31,.TRA AC1,.DIS 01,.TXT D,.TRA AC2,.TXT S,.TRA AC2 + .ADR AC1,.DIS 01,.TXT R,.TRA AC2,.TXT L +.ADR AC2,.DIS 42,.TXT N,.TRA EAN,.TXT Z,.TRA EAN,TXT C,.TRA EAN,.TXT O + .ADR EAN,.DIS 12,.END,.TXT,.TRA E,.TRA PA,.TRA N + +;BOOLEAN + +.ADR BOOLE,.DIS 24,.TRA ST,.ADR AN,.TXT ANBD,.TRA B2,.TRA AN,.TRA ST,.TRA AN,.TRA ST +.TXT X,.ADR OR,.TXT OR,.TRA B2,.TXT I,.TRA OR,.TRA AN,.TXT EQ + .TRA DV2,.TRA ST,.TRA OR,.TRA ST,.TRA OR,.TRA OR +.ADR ST,.TXT SET,.ADR B2,.DIS 24,.TXT Z,.TRA IMB,.TRA IMB + .ADR CA,.TXT C,.TRA TA,.ADR TM,.TXT M,.TRA IMB +.ADR DM,.TXT C,.TRA TM,.ADR TA,.TXT A,.TRA IMB,.TRA IMBA,.TRA IMB + .ADR CP,.TXT C,.TRA BIMB,.TRA IMB,.TRA CA +.TRA CA,.TRA CM,.TRA CM,.TRA CB,.TXT 0,.TRA IMB + +;MORE UUO'S + +.ADR U50,.DIS 03,.TXT OPE,.TRA N,.TXT TT,.ADR CAL,.TXT CAL,.TRA L,.END,.END,.END + .TXT,.TXT RENAM,.TRA E,.TXT I,.TRA N,.TXT OU,.TRA T +.ADR U703,.DIS 02,.TXT CLOS,.TRA E,.TXT RELEA,.TRA S + .TXT MTAP,.TRA E,.TXT UGET,.TRA F + +;**********THIS TERMINATES THE "BYT9" MACRO ARGUMENT****** +> + +IF1,< BLOCK /4> + +IF2,< IFN BINC-^D36,< +BINARY>> + +IFNDEF CLOC., +IFN CLOC.-CLOC, + +PNTR: EXP INST ;POINTER TO BITS IN INST +INST: 0 ;BINARY FOR INSTRUCTION +CHP: 0 ;CHAR POINTER INTO TXT, TXT+1 +TXT: BLOCK 2 ;STORE INPUT TEXT FOR OPEVAL +SAVPDL: 0 ;SAVE PUSH DOWN LIST POINTER + +BTAB: POINT 9,TBL ;TABLE USED TO GET NEXT BYTE POINTER + POINT 9,TBL,8 ;FOR TRANSFER BYTE + POINT 9,TBL,17 + POINT 9,TBL,26 + +OPEVAL: MOVEI T,0 ;EVALUATE FOR AN OP CODE + IDPB T,CHP ;INSERT NULL IN TEXT FOR SYMBOL + MOVEM P,SAVPDL + TRZA F,OUTF +OPTYPE: TRO F,OUTF ;TYPE AN OPCODE SYMBOLICALLY + LSH T,-33 + MOVEM T,INST ;GET OPCODE INTO RIGHT 9 BITS + + MOVE T,[XWD 440700,TXT] + MOVEM T,CHP ;FOR OPEVAL,SETUP POINTER TO INPUT TEXT + TRZ F,ITF ;CLEAR INSTRUCTION TYPED FLAG + CLEARB R,W1 + MOVE W2,BTAB +DC1: ILDB T,W2 ;GET NEXT BYTE IN TBL + CAILE T,40 + CAIL T,73 + SOJGE R,DC1 ;SKIP OVER # BYTES = C(R) + JUMPG R,DC1 ;SKIP OVER ALPHA TEXT WITHOUT COUNTING + SUBI T,40 + JUMPE T,DECX ;TRANSFER ON ASTOP CODE + JUMPG T,DC2 + DPB T,[XWD 340500,PNTR] ;SETUP R ON A DISPATCH BYTE + TRZ T,-4 + AOS T + DPB T,[XWD 300600,PNTR] + TRNN F,OUTF + JRST DC6 ;FOR OPEVAL ONLY + LDB R,PNTR ;GET # BYTES TO SKIP OVER + JRST DC1 + +DC2: HRREI T,-33(T) + JUMPL T,DECT ;TYPE OUT A LETTER + MOVEI W1,FIR.(T) ;BYTE IS A TRANSFER + IDIVI W1,4 + MOVE W2,BTAB(W2) ;CALCULATE POINTER TO NEXT BYTE + ADDI W2,(W1) + JRST DC1 + + +DECT: TRNE F,OUTF + JRST DC8 ;TYPE OUT A LETTER + ILDB W1,CHP ;GET NEXT INPUT LETTER + CAIE W1,133(T) ;COMPARE WITH ASSUMED NEXT LETTER + JRST NOMAT ;DOESNT MATCH + JRST DC1 ;MATCHES, TRY NEXT + +DECX: TRNE F,OUTF ;STOP (CODE 40) HAS BEEN SEEN + POPJ P, ;IF FOR OUTPUT, RETURN + ILDB W1,CHP ;GET NEXT INPUT CHAR IF ANY + JUMPE W1,DC7 ;DOES # OF CHARS MATCH +NOMAT: POP P,R ;NO, BACK UP AND TRY SOME MORE + POP P,W2 + POP P,PNTR + POP P,CHP +NOMAT1: AOS R ;ASSUME NEXT NUMBER FOR BIN VALUE + DPB R,PNTR ;STUFF INTO ANSWER + LDB R,PNTR + JUMPN R,DC6AA ;IF =0, BYTE WAS TOO BIG + CAME P,SAVPDL + JRST NOMAT ;NOT AT TOP LEVEL + POPJ P, ;UNDEFINED, FINALLY + +DC6: MOVEI R,0 ;ASSUME 0 FOR INITIAL BINARY VALUE + DPB R,PNTR +DC6AA: CAMN P,SAVPDL + JRST DC6BB + LDB T,-2(P) ;OLD VALUE OF PNTR + CAME T,(P) + JRST NOMAT1 +DC6BB: PUSH P,CHP + PUSH P,PNTR + PUSH P,W2 + PUSH P,R + JRST DC1 + +DC7: MOVE P,SAVPDL ;RESTORE PUSH DOWN POINTER + MOVE T,INST + LSH T,33 ;PUSH BINARY INTO POSITION FOR OPEVAL + LDB R,[POINT 3,T,8] + TLC T,700000 + TLCN T,700000 + DPB R,[POINT 10,T,12] ;ONLY DONE FOR IO INSTRUCTIONS + JRST CPOPJ1 ;SYMBOL FOUND, SKIP RETURN + +DC8: TRO F,ITF ;SET INSTRUCTION TYPED FLAG + MOVEI T,133(T) + PUSHJ P,TOUT ;OUTPUT A LETTER + CLEARM SPSAV ;SO $D WONT TRY TO DELETE OP CODES + JRST DC1 + LIT + + +PS: BLOCK LPDL + + +DDTEND: ;ONLY STARTING ADDRESS FOR FILDDT + ;NO START EDDRESS FOR EXEC OR USER DDT + ;BECUASE MONITOR IS LOADED WITH BOTH EXEC AND USER DDTS + ;BUT STILL WANTS TO BE STARTED AT ITS OWN STARTING ADDRESS + ;USER DDT IS LOADED LAST. - T.H. +IFN EDDT&10, + END diff --git a/src/errcon.mac b/src/errcon.mac new file mode 100644 index 0000000..057ec28 --- /dev/null +++ b/src/errcon.mac @@ -0,0 +1,438 @@ +TITLE ERRCON - MONITOR DETECTED ERROR HANDLING ROUTINES - V404 +SUBTTL T.HASTINGS/TH/RCC TS 01 JUN 69 +XP VERRCN,404 + ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB + + ENTRY ERRCON ;ALWAYS LOAD ERRCON(IF LIB SEARCH) +ERRCON: + +;THESE ERROR ROUTINE PRINT "ERROR IN JOB N" +;FOLLOWED BY AN APPROPRIATE ERROR MESSAGE +;THEN THE JOB IS STOPPED AND CONSOLE IS RETURNED TO +;MONITOR COMMAND MODE + + +;APR DETECTED ERRORS +;PUSHDOWN OVERFLOW,ILLEGAL MEMORY, NONEXISTENT MEMORY +;FOR WHICH THE USER IS NOT ENABLED. +;SEE APRSER TO SEE HOW APR INTERRUPTS ARE HANDLED +;CALL: SKIPE TAC,APRERR ;RESULT OF CONI APR,APRERR +; PUSHJ PDP,APRLIM ;FROM CLK SERVICE ROUT,(LOWEST PRIORTY PI) +; RETURN TO RESCHEDULE NEW USER + +INTERNAL APRILM +EXTERNAL USRREL,CONMES,HOLD,INLMES,JOBN,PJOBN,PRQM +EXTERNAL STOP1,TTYFUW,USRXIT,UUO0,WSCHED + +APRILM: SETZM APRERR ;CLEAR FLAG IMMEDIATELY,IN CASE OTHER ERRORS OCCUR + TRNN TAC,ILM ;ILLEGAL MEMORY? + JRST APRNXM ;NO + HRRZ TAC,APRPC ;YES, PC STORED BY APR INTERRUPT +IFE FT2REL,< + CAMG TAC,USRREL ;IS PC IN BOUNDS/ +> +IFN FT2REL,< + EXTERN SEGILM + CAMLE TAC,USRREL ;IS PC IN BOUNDS(LOG SEG)? + PUSHJ PDP,SEGILM ;NO. IS PC IN LEGAL MEMORY IN HIGH SEG? +> + JRST APRILR ;YES. GO PRINT ILL MEM REF + JSP TAC,ERRPTU ;NO. PRINT PC EXCEEDS MEM BOUND + ASCIZ /PC OUT OF BOUNDS/ + JRST APRSCD ;PRINT LOC, THEN STOP JOB + +APRILR: JSP TAC,ERRPTU + ASCIZ /ILL MEM REF/ + JRST APRSCD ;PRINT LOC, THEN STOP JOB + + APRNXM: TRNN TAC,NXM ;NON-EX MEM? + JRST APRPDL ;NO + JSP TAC,ERRPTU ;YES + ASCIZ /NON EX MEM/ + JRST APRSCD ;PRINT LOC, THEN STOP JOB + +APRPDL: TRNN TAC,POV ;PUSHDOWN OVERFLOW? + JSP DAT,UERROR ;NO, MUST BE HARDWARE PROBLEM + JSP TAC,ERRPTU ;YES + ASCIZ /PDL OV/ +ASPSC: MOVE TAC1,APRPO ;PRINT APR PC + JRST PCPNT ;AS: + ; 1)"AT USER LOC XXX" OR + ; 2)"AT EXEC LOC XXX; EXEC CALLED FROM + ; EXEC/USER LOC YYY + ;ADDRESS CHECK ERROR AT ANY LEVEL +;DEVDAT MUST BE SET UP TO POINT TO OFFENDING DEVICE + +INTERNAL ADRERR + +ADRERR: JSP TAC,ERRDEV ;GET JOB NO. FROM DEVICE DATA BLOCK + ASCIZ /ADDRESS CHECK FOR / + JRST DEVEXC ;PRINT "DEVICE XXX; EXEC CALLED FROM + ; EXEC/USER LOC YYY" + ; THEN STOP JOB + +;UNEXPLAINABLE MONITOR ERROR + ;CALL: JSP DAT,UERROR ;AT UUO LEVEL(PDP SET UP) + ; JSP DAT,ERROR ;AT INTERRUPT LEVEL(PDP NOT SET UP) + ; JSP DAT,OERROR ;AT INTERRUPT OR UUO LEVEL (PDP SET UP) -MESSAGE TO + ; ; OPERATOR'S CONSOLE RATHER THAN SPECIAL JOB + ; JSP DAT,CERROR ;BLAME JOB=C(ITEM), PDP SETUP + +INTERNAL ERROR,UERROR,CERROR,OERROR +EXTERNAL JOB,ERRPDL,NULADR +NLADDR: EXP NULADR +ERROR: MOVEI PDP,ERRPDL ;USE LOWER CORE FOR PD LIST +OERROR: PUSH PDP,NLADDR ;PUSH ADR, OF NULJOB ON PD LIST IN CASE + ; THIS ERROR IS AT PI LEVEL 7 OR HIGHER + ; SO NULL JOB WILL BE STARTED WHEN LAST + ; POPJ IS DONE(STOP2 IN RUNCSS) + TDZA ITEM,ITEM ;BLAME JOB 0(PRINT ON OPERATORS TTY) +UERROR: MOVE ITEM,JOB ;PRINT FOR CURRENT JOB +CERROR: +IFN FTHALT,< + HALT .+1 ;PUT ADR OF JSP DAT, IN PC AND STOP SO A + ; DUMP CAN BE TAKEN,CONTINUE WILL PRINT ERROR MESSAGE +> + JSP TAC,ERRPNT ;ITEM ALREADY SETUP + ASCIZ /ERROR IN MONITOR/ + MOVE TAC1,-1(PDP) ;GET LOC OF JSP DAT,ERROR + JRST PCPNT ;PRINT "AT EXEC LOC XXX: + ; EXEC CALLED FROM EXEC/USER YYY" + ; THEN STOP JOB + +;INPUT UUO FOR OUTPUT DEVICE +;CALLED AT UUO LEVEL ONLY + +INTERNAL ILLINP + +ILLINP: JSP TAC,ERRPTU + ASCIZ /OUTPUT / + PUSHJ PDP,ERNAM ;PRINT "DEVICE XXX" + JSP TAC,UUOMES ;PRINT MESSAGE,UUOPC,STOP JOB + ASCIZ / CANNOT DO INPUT/ + ;OUTPUT UUO FOR INPUT DEVICE +;CALLED AT UUO LEVEL ONLY + +INTERNAL ILLOUT + +ILLOUT: JSP TAC,ERRPTU + ASCIZ /INPUT / + PUSHJ PDP,ERNAM ;PRINT "DEVICE XXX" + JSP TAC,UUOMES ;PRINT MESSAGE,UUOPC,STOP JOB + ASCIZ / CANNOT DO OUTPUT/ + +;ILLEGAL DEVICE DATA MODE (INIT, OPEN, OR SETSTS UUOS) +;CALLED AT UUO LEVEL ONLY + +INTERNAL ILLMOD + +ILLMOD: JSP TAC,ERRPTU + ASCIZ /ILLEGAL DATA MODE FOR / + JRST DEVEXC ;PRINT "DEVICE XXX",UUO PC + +;IO UUO TO USER CHANNEL WITH NO PREVIOUS INIT OR OPEN +;CALLED AT UUO LEVEL ONLY + +INTERNAL IOIERR + +IOIERR: JSP TAC,ERRPTU + ASCIZ /IO TO UNASSIGNED CHANNEL/ + JRST UUOPCP ;PRINT UUO PC + ;ILLEGAL UUO +;CALLED AT UUO LEVEL ONLY + +INTERNAL UUOERR + +UUOERR: JSP TAC,ERRPTU + ASCIZ /ILLEGAL UUO/ + MOVE TAC1,UUO0 ;GET LAST UUO PC +IFN FTHALT,< + TLNN TAC1,USRMOD ;UUO FROM EXEC? + HALT .+1 ;YES, HALT SO DUMP CAN BE TAKEN + ; CONTINUE WILL PRINT MESSAGE +> + SOSJ TAC1,PCPNT ;AND PRINT, PRINT USER UUO PC IF DIFF. + +;ILLEGAL INSTRUCTION + +;HALT INSTRUCTION IS A SPECIAL CASE WHICH STOPS JOB BUT +;THE USER MAY CONTINUE FROM IT(EFFECTIVE ADR.) +;CALLED AT UUO LEVEL WITH A JRST + +INTERNAL ILLINS +EXTERNAL JOBPD1,TTYSTC + +ILLINS: HLRZ TAC,UUO ;ILLEGAL OPCODE + CAIN TAC,254200+PROG ;IS IT A HALT? + JRST HALTI ;YES, PRINT DIFFERENT MESSAGE + JSP TAC,ERRPTU + ASCIZ /ILL INST./ + JRST UUOPCP ;PRINT UUO PC AD STOP JOB + +HALTI: JSP TAC,ERRPTU + ASCIZ /HALT/ + SOS TAC1,JOBPD1(JDAT) ;UUOPC=LOC OF HALT+1 + PUSHJ PDP,PCP ;PRINT "USER LOC XXX" + PUSHJ PDP,INLMES ;PRINT MONITOR MODE RESPONSE + ASCIZ / +^C + +./ + HRRM UUO,JOBPD1(JDAT) ;SAVE EFFECTIVE ADDRESS OF HALT + PUSHJ PDP,TTYSTC ;START TTY TYPING + PUSHJ PDP,STOP1 ;STOP JOB + ; RETURN ONLY IF HE TYPES CONT + PUSH PDP,JOBPD1(JDAT) ;PUT USER RETURN ON END OF PD LIST + JRST USRXIT ;RETURN TO USER IN CASE HE TYPES CONT COMMAND + ;ROUTINE FOR HUNG IO DEVICE +;CALL MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK +; PUSHJ PDP,DEVHNG + +INTERNAL DEVHNG + +DEVHNG: MOVEI TAC,IOACT ;TURN OFF IO DEVICE ACTIVE BIT IN + ANDCAM TAC,DEVIOS(DEVDAT);MEMORY AND IOS + TRZ IOS,IOACT + JSP TAC,ERRDEV + ASCIZ /HUNG / + JRST DEVEXC + +;BAD DECTAPE DIRECTORY +;CALLED AT INTERRUPT AND UUO LEVELS WITH DEVDAT AND ITEM SETUP + +INTERNAL BADDIR + +BADDIR: JSP TAC,ERRPNT + ASCIZ /BAD DIRECTORY FOR / + +;ROUTINE TO PRINT "DEVICE XXX; EXEC CALLED FOR EXEC/USER YYY" +;THEN STOP JOB +;TO BE USED BY DEVICE DEPENDENT ERROR MESSAGES AFTER JSP TAC,DEVERR + +INTERNAL DEVEXC + +DEVEXC: PUSHJ PDP,ERNAM ;PRINT "DEVICE XXX" + JRST EXCALP ;PRINT "EXEC CALLED FROM EXEC/USER LOC YYY" + ;ROUTINE TO HALT A JOB WHEN A DEVICE IS NOT READY FOR I/O +;CALLED FROM XXSER AT UUO LEVEL +;CALL MOVE DEVDAT,ADDR. OF DEV. DDB +; PUSHJ PDP,HNGSTP + +INTERNAL HNGSTP + +HNGSTP: PUSH PDP,ITEM + PUSH PDP,IOS + PUSH PDP,DEVDAT ;SAVE DEV'S IOS WORD & DDB + PUSHJ PDP,TTYFUN ;FIND JOB'S TTY & WAIT UNTIL I/O IS FINISHED + PUSHJ PDP,PRQM ;PRINT QUESTION MARK FOR BATCH + PUSHJ PDP,ERNAM ;PRINT "DEVICE XXX" + PUSHJ PDP,INLMES ;AND MSG. +ASCIZ /OK? +^C + +./ PUSHJ PDP,TTYSTC ;START UP TTY IN COMMAND MODE + POP PDP,DEVDAT ;BRING BACK DEV DDB & IOS WORD + POP PDP,IOS + PUSHJ PDP,STOP1 ;STOP JOB & + POP PDP,ITEM + JRST WSCHED ;RESCHEDULE + ;COMMON ERROR MESSAGE SETUP ROUTINES +;CALL: JSP TAC,ERRPTU, ERRDEV, OR ERRPNT +; ASCIZ /MESSAGE/ +; RETURNS HERE WITH DEVDAT SAVED 0(PDP) +; C(DEVDAT)=TTYDDB, DAT TO TTY OUTPUT BUFFER POINTER +; ITEM=JOB NUMBER + +;USE ERRPTU IF AT UUO LEVEL FOR SURE +;ERRDEV IF ERROR FOR AN ASSIGNED DEVICE AT ANY LEVEL +;ERRPNT WITH ITEM ALREADY SET TO OFFENDING JOB NUMBER +;THE JSP CALL IS USED IN CASE PUSHDOWN SPACE BECOMES CRITICAL +;AGAIN AND ERRPNT HAS TO WIRE EXISTING LIST OUT + +INTERNAL ERRPTU +INTERNAL ERRDEV,ERRPNT +EXTERNAL PJOBN,JOB,JBTADR,JBTDAT,TTYFND,NULERR +IFN FTTTYSER, + +ERRPTU: SKIPA ITEM,JOB ;BLAME CURRENT JOB IS NOT 0. +ERRDEV: LDB ITEM,PJOBN ;JOB NO, FROM DEVICE DATA BLOCK +ERRPNT: SKIPM ITEM ;ERROR IN NULL JOB? + SETOM NULERR ;YES, SET FLAG FOR ERROR IN NULL JOB + ; SO STATE OF NULL JOB WILL BE REESTABLISHED + ; WHEN IS IT RUN AGAIN(SEE CLOCK1) + + PUSH PDP,DAT ;SAVE CALL TO ERROR(JSP DAT,ERROR) +IFN FTRCHK,< + CAIL ITEM,JOBN ;JOB NUMBER + HALT . ;OUT OF RANGE? +> + PUSH PDP,DEVDAT ;SAVE ADR, OF DEV. DATA BLOCK + PUSH PDP,TAC ;SAVE RETURN FROM ERRPNT + MOVE JDAT,JBTDAT(ITEM) ;EVEN NULL JOB HAS JOB DATA AREA +IFN JDAT-PROG,< + MOVE PROG,JBTADR(ITEM) ;JOB RELOCATION +> +IFE FTTTYSER,< PUSHJ PDP,TTYFND ;FIND TTY FOR THIS JOB(ITEM)> +IFN FTTTYSER,< PUSHJ PDP,TTYERP ;FIND THIS TTY AND + ;SET MERTPO IN DDB +> + PUSHJ PDP,INLMES + ASCIZ /? +ERROR IN JOB / + PUSHJ PDP,PJOB ;PRINT JOB NO. + JRST INLMES ;PRINT MESSAGE SPECIFIED BY CALLER + ; AND RETRUN TO LOC. AFTER MESSAGE + ;ROUTINE TO PRINT UUO PC AND STOP JOB +;IF IN USER MODE PC WILL PRINT AS "AT USER LOC XXX" +;IF IN EXEC MODE "AT EXEC LOC XXX; EXEC CALLED FROM EXEC/USER/ LOC YYY + +INTERNAL UUOPCP,UUOMES +EXTERNAL JOBPD1 + +UUOMES: PUSHJ PDP,CONMES ;PRINT MESSAGE POINTED TO BY TAC +UUOPCP: MOVE TAC1,JOBPD1(JDAT) ;UUO PC STORED IN JOB DATA AREA + ; FIRST LOC ON PD LIST + SOJA TAC1,PCPNT ;DECREMENT TO POINT TO UUO IN USER AREA + +;ROUTINE TO PRINT ONE OF THREE MESSAGES AND STOP JOB +;1) "AT EXEC LOC XXX; EXEC CALLED FROM EXEC LOC YYY" +;2) "AT EXEC LOC XXX; EXEC CALLED FROM USER LOC YYY" +;3) "AT USER LOC YYY" + +;CALL: MOVE TAC1, XXX ;WITH PC FLAGS IN LH + +; PUSHJ PDP,PCPNT +; NEVER RETURN IF AT UUO LEVEL + +INTERNAL PCPNT +EXTERNAL TPOPJ + +PCPNT: PUSHJ PDP,PCP ;PRINT " AT EXEC XXX" OR "AT USER " + TLNE TAC1,USRMOD ;WAS PC IN USER MODE? + JRST PCSTOP ;YES, ENOUGH INFO. + +;ROUTINE TO PRINT EITHER +;1) "; EXEC CALLED FROM EXEC LOC YYY" +;2) "; EXEC CALLED FROM USER LOC YYY" +;AND STOP JOB +;CALL: PUSHJ PDP,EXCALP +; NEVER RETURNS IF AT UUO LEVEL + +INTERNAL EXCALP,PCSTOP + +EXCALP: PUSHJ PDP,INLMES + ASCIZ /; UUO/ + MOVE TAC1,JOBPD1(JDAT) ;UUO PC IN JOB DATA AREA + SUBI TAC1,1 ;BACK IT UP TO POINT TO UUO + PUSHJ PDP,PCP ;PRINT "EXEC LOC " OF USER LOC +PCSTOP: PUSHJ PDP,HOLD ;STOP JOB, START TTY AND SET JOB ERROR BIT + POP PDP,DEVDAT ;RETURN ONLY IF AT INTERRUPT LEVEL + JRST TPOPJ ;REMOVE ERROR CALL AND RETURN + ;ROUTINE TO PRINT PC AS: +;1) "EXEC LOC XXX" OR "USER LOC XXX" +;CALL: MOVE TAC1,PC TO PRINT(LH=PC FLAGS) +; PUSHJ PDP,PCP + + +XMODE: ASCIZ / AT EXEC / +UMODE: ASCIZ / AT USER / + +PCP: MOVEI TAC,XMODE ;ASSUME PC IN EXEC MODE + TLNE TAC1,USRMOD ;IS IT? + MOVEI TAC,UMODE ;NO, USER MODE + PUSHJ PDP,CONMES ;PRINT ONE OR OTHER + HRRZ TAC,TAC1 ;PRINT RIGHT HALF IN OCTAL + ; FALL INTO OCTPNT + +INTERN OCTPNT + +;ROUTINE TO PRINT 6 DIGIT OCTAL NUMBER +;CALL: MOVE DAT,TTY OUTPUT BYTE POINTER +; HRR TAC, OCTAL NUMBER +; PUSHJ PDP,OCTPNT +; RETURN TAC1,PRESERVED,TAC DESTROYED + +OCTPNT: HRLZ TAC,TAC ;MOVE TO LH FOR ROTATING + TRO TAC,700000 ;SETUP AN END FLAG + +OCTP1: ROT TAC,3 ;GET NEXT OCTAL DIGIT + TLNN TAC,777777 ;WAS THAT FLAG? + POPJ PDP, ;YES, DO NOT PRINT IT + PUSHJ PDP,PRTNUM ;NO, PRINT OCTAL DIGIT + HRRI TAC,0 ;CLEAR RH + JRST OCTP1 ;GET NEXT OCTAL DIGIT + +;ROUTINE TO ADD 1 TO TAC AND PRINT DECIMAL +;SAME CALL AS OCTPNT + + INTERN DECP1 + +DECP1: AOJA TAC,RADX10 ;ADD 1 AND GO PRINT + +;ROUTINE TO PRINT DECIMAL +;CALL: SAME AS OCTPNT +;TAC1: PRESERVED + +INTERN RADX10 + +RADX10: PUSH PDP,TAC1 ;SAVE TAC1 + PUSHJ PDP,PRTDIG ;PRINT DECIMAL DIGITS + POP PDP,TAC1 ;RESTORE TAC1 + POPJ PDP, ;AND RETURN + +;RECURSIVE DECIMAL PRINT ROUTINE +;CALL: MOVE TAC,DECIMAL NO. +; PUSHJ PDP,PRTDIG + +PRTDIG: IDIVI TAC,12 ;DIVIDE BY 10 + HRLM TAC1,(PDP) ;RT ON PD LIST + JUMPE TAC,.+2 ;FINISHED? + PUSHJ PDP,PRTDIG ;NO, CALL S OR F + HRLZ TAC,(PDP) ;YES, GET LAST NUMBER +PRTNUM: ADDI TAC,"0" ;CONVERT TO ASCIZ +IFN FTTTYSER,< +EXTERN OUTCHS + MOVE TEM,TAC ;PUT CHAR IN CHAR AC + JRST OUTCHS ;AND OUTPUT IN SCNSRF +> +IFE FTTTYSER,< + + IDPB TAC,DAT ;ADD CHAR TO HALGF DUPLEX OUTPUT STREAM + POPJ PDP, +> + ;ROUTINE TO PRINT "DEVICE XXX" +;CALL MOVE DAT,ASCII OUTPUT BYTE POINTER +; PUSH PDP,DEVDAT +; PUSHJ PDP,ERNAM + +INTERNAL ERNAM + +ERNAM: PUSHJ PDP,INLMES + ASCIZ /DEVICE / + SKIPE TAC1,-1(PDP) ;IS DEVDAT = 0? + MOVE TAC1,DEVNAM(TAC1) ;NO, GET DEVICE NAME + +;ROUTINE TO PRINT SIXBIT NAME +;CALL MOVE DAT,ASCII OUTPUT BYTE POINTER +; MOVE TAC1,NAME +; PUSHJ PDP,PRNAME + +INTERNAL PRNAME +EXTERNAL CPOPJ + +PRNAME: MOVEI TAC,0 + LSHC TAC,6 ;SHIFT IN NEXT CHAR. + JUMPE TAC,CPOPJ + MOVEI TEM,40(TAC) ;ASCII VERSION INTO CHREC FOR OUTCHS +IFN FTTTYSER,< +EXTERN OUTCHS + PUSHJ PDP,OUTCHS +> +IFE FTTTYSER,< + IDPB TEM,DAT +> + JRST PRNAME + + +ERREND: END + diff --git a/src/ft40n.mac b/src/ft40n.mac new file mode 100644 index 0000000..bb6982b --- /dev/null +++ b/src/ft40n.mac @@ -0,0 +1,34 @@ +;THIS SUB-PROGRAM ASSEMBLED WITH CONFIGURATION DEPENDENT FEATURE SWITCHES - FT40N.MAC(V002) + XLIST +; TH/RC TS3.19 27 SEP 68 V002 +;CONFIGURATION DEPENDENT FEATURE SWITCHES FOR CONDITIONAL ASSEMBLY +;-1 MEANS INCLUDE THE ASSOCIATED FEATURE, 0 MEANS ELIMINATE IT + +FTSWAP=0 ;SWAPPING SYSTEM + ;IF FTSWAP=-1, THEN FTDISK MUST BE -1 + +FTDISK=0 ;DISK SYSTEM(MAY OR MAY NOT HAVE SWAPPING) + ;IF FTDISK=-1, THEN FTLOGIN MUST BE -1 + ;IF FTSWAP=-1, THEN FTDISK MUST BE -1 + +FTLOGIN=0 ;LOGIN-LOGOUT COMMAND AND UUOS + ;FTDISK=-1 IMPLIES FTLOGIN=-1 + +FTCCL=0 ;CONCISE COMMAND LANGUAGE COMMANDS + ;USED IN APRSER + ;SHOULD BE 0 IN NON-DISK SYSTEMS + ;SHOULD BE -1 IN DISK SYSTEMS, WHEN IMPLEMENTED + + +FTRC10=0 ;NEW PDP-10 DISK(MODEL RC-10) INSTEAD OF DATA PRODUCTS DISK + +FTKCT=0 ;ACCUMULATE CORE*RUNNING TIME FOR CHARGING FOR EACH USER + +FTPRV=0 ;PRIVILEGE BITS FOR EACH USER + +FTGETTAB=0 ;GETTAB UUO - RETURN CONTENTS OF MONITOR JOBTABLES + +;LAST PAGE SHOULD BE WRITTEN WITH 'HP' TECO COMMAND SO FORM-FEED IS +;NOT APPENDED AFTER LIST CAUSING EXTRA BLANK PAGE IN MONITOR LISTING + + LIST diff --git a/src/ft50sb.mac b/src/ft50sb.mac new file mode 100644 index 0000000..8e6aca4 --- /dev/null +++ b/src/ft50sb.mac @@ -0,0 +1,33 @@ +;THIS SUB-PROGRAM ASSEMBLED WITH CONFIGURATION DEPENDENT FEATURE SWITCHES - FT50SB.MAC(V002) + XLIST +; TH/RC TS3.19 27 SEP 68 V002 +;CONFIGURATION DEPENDENT FEATURE SWITCHES FOR CONDITIONAL ASSEMBLY +;-1 MEANS INCLUDE THE ASSOCIATED FEATURE, 0 MEANS ELIMINATE IT + +FTSWAP=-1 ;SWAPPING SYSTEM + ;IF FTSWAP=-1, THEN FTDISK MUST BE -1 + +FTDISK=-1 ;DISK SYSTEM(MAY OR MAY NOT HAVE SWAPPING) + ;IF FTDISK=-1, THEN FTLOGIN MUST BE -1 + ;IF FTSWAP=-1, THEN FTDISK MUST BE -1 + +FTLOGIN=-1 ;LOGIN-LOGOUT COMMAND AND UUOS + ;FTDISK=-1 IMPLIES FTLOGIN=-1 + +FTCCL=-1 ;CONCISE COMMAND LANGUAGE COMMANDS + ;USED IN APRSER + ;SHOULD BE 0 IN NON-DISK SYSTEMS + ;SHOULD BE -1 IN DISK SYSTEMS, WHEN IMPLEMENTED + +FTRC10=-1 ;NEW PDP-10 DISK(MODEL RC-10) INSTEAD OF DATA PRODUCTS DISK + +FTKCT=-1 ;ACCUMULATE CORE*RUNNING TIME FOR CHARGING FOR EACH USER + +FTPRV=-1 ;PRIVILEGE BITS FOR EACH USER + +FTGETTAB=-1 ;GETTAB UUO - RETURN CONTENTS OF MONITOR JOBTABLES + +;LAST PAGE SHOULD BE WRITTEN WITH 'HP' TECO COMMAND SO FORM-FEED IS +;NOT APPENDED AFTER LIST CAUSING EXTRA BLANK PAGE IN MONITOR LISTING + + LIST diff --git a/src/jobdat.mac b/src/jobdat.mac new file mode 100644 index 0000000..2d8dc0e --- /dev/null +++ b/src/jobdat.mac @@ -0,0 +1,168 @@ +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) + + +;MACRO TO DEFINE SYMBOLS FOR USER USE +;THESE CANNOT BE CHANGED WITHOUT INVALIDATING OLD SAVED FILES + +DEFINE U(SYMBOL,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) + + +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 + LOC=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 + U 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, diff --git a/src/k.mac b/src/k.mac new file mode 100644 index 0000000..e64cbbf --- /dev/null +++ b/src/k.mac @@ -0,0 +1 @@ +K==1 diff --git a/src/lptser.mac b/src/lptser.mac new file mode 100644 index 0000000..05dade0 --- /dev/null +++ b/src/lptser.mac @@ -0,0 +1,230 @@ +TITLE LPTSER - LINE PRINTER SERVICE ROUTINE FOR MULTIPLE LINE PRINTERS - V405 +SUBTTL T. W. MCMANUS /TNM TS 20 MAY 69 + XP VLPTSR,405 ;DEFINE GLOBAL VERSION NUMBER FOR LOADER MAP + +;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN COMMON: + + EXTERNAL CPOPJ1, PION, PIOFF + +;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN CLOCK1: + + EXTERNAL SETIOD, WAIT1 + +;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN ERRCON: + + EXTERNAL HNGSTP, ILLINP + +;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN UUCON: + + EXTERNAL ADVBFE, IDSET, OUT, SETACT, STOIOS + +;THE FOLLOWING SYMBOLS ARE REFERENCED OUTSIDE OF LPTSER: + + INTERN LPTINT, LPTNXT, LPTECM, LPTDON, LPTDSP + ENTRY LPTSER + +LPTSER: + ;LINE PRINTER CONTROL REGISTER MNEMONIC DEFINITIONS + + LPTCLR=1B25 ;CLEAR LINE PRINTER BUFFER + LPTLOV=1B26 ;LINE OVERFLOW FLAG (PDP-6 ONLY) + LPTERR=1B27 ;ERROR FLAG + LPTBSY=1B28 ;BUSY FLAG + LPTDON=1B29 ;DONE FLAG + LPTECM=7B32 ;ERROR CHANNEL MASK + LPTDCM=7B35 ;DONE CHANNEL MASK + LPTBDM=LPTBSY+LPTDON ;BUSY/DONE FLAG MASK + +;LINE PRINTER DEVICE DEPENDANT I/O STATUS MNEMONIC DEFINITIONS + + LPTEND=Z(1B10) ;CLOSE UUO HAS BEEN DONE + LPTSYN=Z(1B11) ;CREF AFTER CLOSE UUO HAS BEEN SENT + +;LINE PRINTER DEVICE DATA BLOCK ADDRESSING MNEMNIC DEFINITIONS + + LPTCON=-4 ;RH = SKIP CHAIN MASK REGISTER + LPTPTR= 7 ;BLOCK OUTPUT POINTER + LPTCH= 11 ;INTERRUPT CHANNEL ASSIGNMENTS + LPTSVE=12 ;DDB ROUTINE TO SAVE AC'S + LPTEX1=16 ;DDB EXIT ROUTINE IF AC'S NOT SAVED + LPTSV2=20 ;TEMP. SAVE LOCN. FOR TAC + LPTECH=21 ;CONSZ LP?,LPTECM + LPTDNE=22 ;CONSO LP?,LPTDON + LPTCSO=23 ;CONSO LP?,(TAC) + LPTCSZ=24 ;CONSZ LP?,(TAC) + LPTCNI=25 ;CONI LP?,TAC + LPTCNO=26 ;CONO LP?,(TAC) + LPTDTO=27 ;DATAO LP?,(TAC) + LPTBKO=30 ;BLKO LP?,LP?PTR + +;LINE PRINTER SERVICE DISPATCH TABLE + + JRST LPTINI ;INITIALIZE + JRST LPTHNG ;HUNG DEVICE ERROR +LPTDSP: JRST LPTREL ;RELEASE + JRST LPTCLS ;CLOSE + JRST LPTOUT ;OUTPUT + JRST ILLINP ;INPUT + ;LINE PRINTER INITIALIZATION, HUNG DEVICE AND RELEASE CODE + + ;LPTINI IS CALLED AT SYSTEM INITIALIZATION TIME FROM + ;IOGO IN SYSINI WITH THE DDB ADDRESS IN DEVDAT + + ;LPTHNG IS CALLED FROM DEVCHK IN UUOCON (IOCSS) WITH + ;THE DDB ADDRESS IN DEVDAT WHENEVER A LINE PRINTER + ;HUNG DEVICE COUNT IS DECREMENTED TO ZERO + + ;LPTREL IS CALLED FROM RELEA1 IN UUOCON WITH THE DDB + ;ADDRESS IN DEVDAT WHENEVER A RELEASE UUO IS EXECUTED + ;FOR A LINE PRINTER + + ;EACH OF THE ABOVE ROUTINE MUST: + ; + ; 1. CLEAR THE SPECIFIED LINE PRINTER + ; 2. DEASSIGN BOTH THE ERROR AND DONE INTERRUPT + ; CHANNELS FOR THE LINE PRINTER + ; 3. CLEAR THE SKIP CHAIN INTERRUPT MASK FLAGS + ; FOR THAT LINE PRINTER + + ;NOTE: THE LPTINI CODE FORCES IOGO IN SYSINI TO INVOKE + ; LPTINI FOR EACH LINE PRINTER ON THE SYSTEM RATHER + ; THAN FOR THE NORMAL CASE WHERE IT INVOKES THE + ; INITIALIZATION CODE ONCE FOR EACH DISPATCH TABLE. + ; + ; THEREFORE, THE CORRECT OPERATION OF THE LPTINI CODE + ; IS DEPENDANT UPON THE IOGO CODE WHICH SHOULD BE: + ; + ; PUSHJ PDP,DINI(AC3) + ; HRRZM AC3,SAVITM + +LPTHNG: +LPTREL: + SOS (PDP) ;COUNTERACT SKIP RETURN +LPTINI: MOVEI TAC,LPTCLR ;CLEAR THE LINE PRINTER + XCT LPTCNO(DEVDAT) + HLLZS LPTCON(DEVDAT) ;CLEAR SKIP CHAIN MASK FLAGS + JRST CPOPJ1 ;SKIP RETURN IF ENTERED AT LPTINI + ; TO FORCE CALL FOR EACH LPT + +;LINE PRINTER CLOSE UUO ROUTINE + +LPTCLS: TLO IOS,LPTEND ;TURN ON THE END FLAG + TLZ IOS,LPTSYN ;TURN OFF SYNCHRONIZATION FLAG + MOVEM IOS,DEVIOS(DEVDAT) ;SAVE IOS IN THE DDB + JRST OUT ; AND RETURN TO UUOCON + ;LINE PRINTER OUTPUT UUO ROUTINE + +LPTOUT: SETZ TAC, ;CLEAR ALL POSSIBLE + XCT LPTCNO(DEVDAT) ; LINE PRINTER FLAGS + MOVEI TAC,LPTERR ;SET MASK FOR ERROR FLAG + XCT LPTCSO(DEVDAT) ;SKIP IF ERROR FLAG IS ON + JRST .+3 ; LPT IS NOT OFF, NOT ON LOCAL + PUSHJ PDP,HNGSTP ;STOP JOB AND PRINT REMINDER + JRST LPTOUT ;TRY AGAIN WHEN USER TYPES "CONT" + TLNE IOS,IOBEG ;IS THIS FIRST OUTPUT SINCE INIT? + JRST LPTNEW ; YES + PUSHJ PDP,LPTSET ; NO, SET UP BLKO POINTER +LPTGO: PUSHJ PDP,SETACT ;SET I/O ACTIVE BIT, STORE IOS + ; AND SET HUNG DEVICE COUNT + MOVE TAC,LPTCH(DEVDAT) ;GET CHANNEL ASSIGNMENTS FROM DDB + TLNE IOS,IOBEG ;IS THIS FIRST OUTPUT SINCE INIT? + IORI TAC,LPTCLR+LPTDON ;SET LPTCLR IF IOBEG:=1, ELSE + XORI TAC,LPTDON ; SET LPTDON + HRLI TAC,LPTLOV+LPTERR+LPTDON ;GET SKIP CHAIN MASK FLAGS + CONO PI,PIOFF ;TURN OFF PI TO PREVENT IMM. INT. + XCT LPTCNO(DEVDAT) ;SEND CONDITIONS OUT TO LPT + HLRM TAC,LPTCON(DEVDAT) ;SAVE SKIP CHAIN MASK FLAGS + CONO PI,PION ;REENABLE ALL INTERRUTPS + POPJ PDP, ; AND RETURN TO UUOCON + +LPTNEW: TLO IOS,IO ;SET I/O DIRECTION TO OUTPUT + SETZM LPTPTR(DEVDAT) ;CLEAR BLKO POINTER + JRST LPTGO ;RETURN TO MAINSTREAM + ;LINE PRINTER INTERRUPT SERVICE ROUTINE + +LPTINT: XCT LPTECH(DEVDAT) ;SKIP IF NO ERROR CHANNEL ASSIGNED + XCT LPTDNE(DEVDAT) ;SKIP IF DONE FLAG IS UP + JRST LPTER1 ; BRANCH TO ERROR SERVICE ROUTINE + SKIPL LPTPTR(DEVDAT) ;BLKO COUNT TO 0 ON PREV. INTERRUPT + JRST LPTSVE(DEVDAT) ; YES, GO SAVE ORIGINAL AC'S + XCT LPTBKO(DEVDAT) ; NO, SEND NEXT WORD FOR PRINTING + JRST LPTEX1(DEVDAT) ;LAST WORD SENT BUT INTERRUPT PENDING + JRST LPTEX1(DEVDAT) ;GO RESTORE DEVDAT AND RETURN + +LPTNXT: ;ENTER HERE AFTER DDB ROUTINE SAVE + ; ORIGINAL AC'S IN PROPER CHANNEL + ; SAVE AREA AND SETS UP DEVDAT + ; TO POINT TO DDB AGAIN + + PUSHJ PDP,IOSET ;SET AC PROG:= JOB AREA ADDRESS AND + ; AC IOS:= DEVIOS IN THE DDB + TLZE IOS,IOBEG ;FIRST BUFFER SINCE INIT? + JRST LPTBG1 ; YES, GO OUTPUT A CRFF + PUSHJ PDP,ADVBFE ; NO, ADVANCE TO NEXT BUFFER + JRST LPTOFF ;CANNOT ADVANCE, BUFFER UNAVAILABLE + PUSHJ PDP,LPTSET ;SET UP NEW BLKO POINTER +LPTWCK: TLZE IOS,IOW ;IS JOB WAITING FOR I/O COMPLETION? + PUSHJ PDP,SETIOD ; YES, ARRANGE FOR JOB TO RUN AGAIN +LPTEX2: JRST STOIOS ;SAVE IOS, RESET HUNG DEVICE COUNT + ; AND DISMISS INTERRUPT + +LTPOFF: TLNN IOS,LPTEND ;SKIP IF CLOSE HAS BEEN DONE + JRST LPTOF1 ; GO TURN PRINTER OFF UNTIL NEXT OUTPUT + TLON IOS,LPTSYN ;HAS FINAL CRFF BEEN OUTPUT? + JRST LPTBG2 ; NO, SO GO DO IT + TLZ IOS,LPTEND ; YES, SO CLEAR END FLAG +LPTOF1: TRZ IOS,IOACT ;CLEAR I/O ACTIVE BIT + SETZ TAC, ;CLEAR TAC AND + XCT LPTCNO(DEVDAT) ; TURN LPT OFF + HLLZS LPTCON(DEVDAT) ;CLEAR SKIP CHAIN MASK FLAGS + JRST LPTWCK ; AND BRANCH + +LPTBG1: PUSHJ PDP,LPTSET ;SET UP INITIAL BLKO POINTER ***** +LPTBG2: MOVEI TAC,[EXP 15B6+14B13] ;SEND OUT A CRFF + XCT LPTDTO(DEVDAT) + JRST LPTEX2 ;GO DISMISS ITERRUPT + ;LINE PRINTER ERROR HANDLING ROUTINE + +LPTER1: MOVEM TAC,LPTSV2(DEVDAT) ;SAVE TAC IN DDB + MOVEI TAC,LPTLOV ;GET LINE OVERFLOW ERROR MASK + XCT LPTCSO(DEVDAT) ;SKIP IF LINE OVERFLOW FLAG IS ON + JRST LPTER2 ; GO CHECK IF PREVIOUS ERROR OCCURRED + MOVN TAC,[EXP 100001] ;DECREMENT BLK0 POINTER + ADDM TAC,LPTPTR(DEVDAT) + MOVE TAC,[EXP 15B6+12B13] ;PRINT CRLF + XCT LPTDTO(DEVDAT) + JRST LPTER4 + +LPTER4: XCT LPTECH(DEVDAT) ;SKIP IF ERROR INTERRUPT NOT ASSIGNED + JRST LPTER5 ; ERROR CONDITION DETECTED + MOVE TAC,LPTCH(DEVDAT) ;GET INTERRUPT CHANNEL ASSIGNMENTS + ANDI TAC,LPTDCM ;MASK OUT ERROR CHANNEL + IORI TAC,LPTBSY ;SET THE BUSY FLAG + XCT LPTCNO(DEVDAT) ;SEND IT OUT TO THE LPT + MOVEI TAC,LPTRLOV+LPTERR+LPTDON ;ENABLE FOR ALL INTERRUPTS +LPTER3: HRRM TAC,LPTCON(DEVDAT) ;SAVE SKIP CHAIN MASK FLAGS +LPTER4: MOVE TAC,LPTSV2(DEVDAT) ;RESTORE SAVED ACCUMULATOR + JRST LPTEX1(DEVDAT) ; AND GO DISMISS INTERRUPT + +LPTER5: MOVE TAC,LPTCH(DEVDAT) ;GET INTERRUPT CHANNEL ASSIGNMENTS + ANDI TAC,LPTDCM ;MASK OUT ERROR CHANNEL ASSIGNMENT + IORI TAC,LPTBSY ;SET BUSY FLAG + XCT LPTCNO(DEVDAT) ;SEND IT OUT TO THE LPT + MOVEI TAC,LPTDON ;ENABLE FOR DONE FLAG ONLY + JRST LPTER3 + ;LINE PRINTER BLKO POINTER SETUP ROUTINE + +LPTSET: MOVEI TAC,@DEVOAD(DEVDAT) ;GET ABS. ADDR. OF CURRENT BUFFER + MOVN TAC1,1(TAC) ;GET NEGATIVE WORD COUNT + HRL TAC,TAC1 ;COMBINE NEG. WORD COUNT AND ADDR, + AOJ TAC, ;INCREMENT BUFFER ADDRESS TO FORM + MOVEM TAC,LPTPTR(DEVDAT) ; LPTPTR:= -(WORD COUNT),(BUFF, ADDR, +1) + POPJ PDP, ; AND RETURN + + + END + + + + + \ No newline at end of file diff --git a/src/macro.v46 b/src/macro.v46 new file mode 100644 index 0000000..0ade69b --- /dev/null +++ b/src/macro.v46 @@ -0,0 +1,7778 @@ +TITLE MACRO V.46(52) +SUBTTL RPG/CMF/JF/PMH/DMN 7-SEPT-71 +;COPYRIGHT 1968,1969,1970,1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. + + VMACRO==46 ;VERSION NUMBER + VUPDATE==0 ;DEC UPDATE LEVEL + VEDIT==52 ;EDIT NUMBER + VCUSTOM==0 ;NON-DEC UPDATE LEVEL + + + LOC + B2+B11+B17+VEDIT + RELOC + MLON + +COMMENT * ASSEMBLY FEATURE SWITCHES (ACTION WHEN NON-ZERO) + + SWITCHES ON (NON-ZERO) IN DEC VERSION +SEG2SW GIVES TWO SEGMENT MACRO +PURESW GIVES VARIABLES IN LOW SEGMENT +CCLSW GIVES RAPID PROGRAM GENERATION FEATURE +FTDISK GIVES DISK FEATURES +RUNSW USE RUN UUO FOR "DEV:NAME!" +TEMP TMPCOR UUO IS TO BE USED +RENTSW ASSEMBLE REENTRANT PROGRAMS +FORMSW USE MORE READABLE FORMATS FOR LISTING (ICCSW) +DFRMSW DEFAULT CONDITION OF FORMAT PRINTING (MULTI-FORM IF ON) + + SWITCHES OFF (ZERO) IN DEC VERSION +STANSW GIVES STANFORD FEATURES +LNSSW GIVES LNS VERSION +WFWSW GIVES ARRAY, INTEGER AND LVAR FEATURES +IIISW GIVES III FEATURES +OPHSH GIVES HASH SEARCH OF OPCODES +KI10 GIVES KI10 OP-CODES +* + SUBTTL DEFAULT ASSEMBLY SWITCH SETTINGS + +IFDEF TWOSEG,> +IFNDEF SEG2SW, +IFN SEG2SW, + +IFNDEF PURESW, + +IFNDEF STANSW, + +IFNDEF RENTSW, + +IFNDEF LNSSW, +IFN LNSSW, + +IFNDEF RUNSW, + +IFNDEF CCLSW, +IFN CCLSW, + +IFNDEF TEMP, + +IFNDEF WFWSW, + + +IFNDEF FTDISK, +IFNDEF DFRMSW, +IFN DFRMSW, +IFDEF ICCSW, ;SAME SWITCH +IFNDEF FORMSW, + +IFNDEF IIISW, + +IFNDEF OPHSH, + +IFNDEF KI10, + SUBTTL OTHER PARAMETERS + +.PDP== ^D50 ;BASIC PUSH-DOWN POINTER +IFNDEF LPTWID, ;DEFAULT WIDTH OF PRINTER +.LPTWD==8* ;USEFUL WIDTH IN MAIN LISTING +.CPL== .LPTWD-^D32 ;WIDTH AVAIABLE FOR TEXT WHEN + ;BINARY IS IN HALFWORD FORMAT +IFE STANSW,<.LPP==^D55 ;LINES/PAGE> +IFN STANSW,<.LPP==^D52 ;LINES/PAGE> +.STP== ^D40 ;STOW SIZE +.TBUF== ^D80 ;TITLE BUFFER +.SBUF== ^D80 ;SUB-TITLE BUFFER +.IFBLK==^D20 ;IFIDN COMPARISON BLOCK SIZE +.R1B==^D18 +.UNIV==^D10 ;NUMBER OF UNIVERSAL DEFINITIONS +.LEAF==4 ;SIZE OF BLOCKS IN MACRO TREE + +NCOLS==LPTWID/^D32 ;NUMBER OF COLUMNS IN SYMBOL TABLE +IFN CCLSW,> +IFN OPHSH,> +IFNDEF NUMBUF,< +IFE STANSW!LNSSW, +IFN STANSW, +IFN LNSSW, +> + +EXTERN JOBREL,JOBSYM,JOBDDT,JOBFF,JOBAPR,JOBSA +IFN CCLSW,< EXTERN JOBERR> + +IFN PURESW,< +IFE SEG2SW, +IFN SEG2SW,> + + SALL ;SUPPRESS ALL MACROS + +;SOME ASCII CHARACTERS + +HT==11 +LF==12 +VT==13 +FF==14 +CR==15 +EOL==33 + ;ACCUMULATORS +AC0== 0 +AC1= AC0+1 +AC2= AC1+1 +SDEL= 3 ;SEARCH INCREMENT +SX= SDEL+1 ;SEARCH INDEX +ARG= 5 ;ARGUMENT +V= 6 ;VALUE +C= 7 ;CURRENT CHARACTER +CS= C+1 ;CHARACTER STATUS BITS +RC= 11 ;RELOCATION BITS +MWP= 12 ;MACRO WRITE POINTER +MRP= 13 ;MACRO READ POINTER +IO= 14 ;IO REGISTER (LEFT) +ER== IO ;ERROR REGISTER (RIGHT) +FR= 15 ;FLAG REGISTER (LEFT) +RX== FR ;CURRENT RADIX (RIGHT) +MP= 16 ;MACRO PUSHDOWN POINTER +PP= 17 ;BASIC PUSHDOWN POINTER + +%OP== 3 +%MAC== 5 +%DSYM== 2 +%SYM== 1 +%DMAC== %MAC+1 + +OPDEF RESET [CALLI 0] +OPDEF SETDDT [CALLI 2] +OPDEF DDTOUT [CALLI 3] +OPDEF DEVCHR [CALLI 4] +OPDEF WAIT [MTAPE 0] +OPDEF CORE [CALLI 11] +OPDEF EXIT [CALLI 12] +OPDEF UTPCLR [CALLI 13] +OPDEF DATE [CALLI 14] +OPDEF APRENB [CALLI 16] +OPDEF MSTIME [CALLI 23] +OPDEF PJOB [CALLI 30] +OPDEF RUN [CALLI 35] +OPDEF TMPCOR [CALLI 44] + +IFN STANSW,< OPDEF SWAP [CALLI 400004] > + ;FR FLAG REGISTER (FR/RX) +IOSCR== 000001 ;NO CR AFTER LINE +MTAPSW==000004 ;MAG TAPE +ERRQSW==000010 ;IGNORE Q ERRORS +LOADSW==000020 ;END OF PASS1 & NO EOF YET +DCFSW== 000040 ;DECIMAL FRACTION +RIM1SW==000100 ;RIM10 MODE +NEGSW== 000200 ;NEGATIVE ATOM +RIMSW== 000400 ;RIM OUTPUT +PNCHSW==001000 ;RIM/BIN OUTPUT WANTED +CREFSW==002000 +R1BSW== 004000 ;RIM10 BINARY OUTPUT +TMPSW== 010000 ;EVALUATE CURRENT ATOM +INDSW== 020000 ;INDIRECT ADDRESSING WANTED +RADXSW==040000 ;RADIX ERROR SWITCH +FSNSW== 100000 ;NON BLANK FIELD SEEN +MWLFLG==200000 ;ON FOR DON'T ALLOW MULTI-WORD LITERALS +P1== 400000 ;PASS1 + + ;IO FLAG REGISTER (IO/ER) +FLDSW== 400000 ;ADDRESS FIELD +IOMSTR==200000 +ARPGSW==100000 ;ALLOW RAPID PROGRAM GENERATION +IOPROG==040000 ;SUPRESS LISTING (LIST/XLIST PSEUDO OP) +NUMSW== 020000 +IOMAC== 010000 ;MACRO EXPANSION IN PROGRESS +IOPALL==004000 ;SUPRESS LISTING OF MACRO EXPANSIONS +IONCRF==002000 ;SUPRESS OUTPUT OF CREF INFORMATION +CRPGSW==001000 ;CURRENTLY IN PROGRESS ON RPG +IOCREF==000400 ;WE ARE NOW OUTPUTTING CREF INFO +IOENDL==000200 ;BEEN TO STOUT +IOPAGE==000100 +DEFCRS==000040 ;THIS IS A DEFINING OCCURANCE (MACROS) +IOIOPF==000020 ;IOP INSTRUCTION SEEN +MFLSW== 000010 ;MULTI-FILE MODE,PRGEND SEEN +IORPTC==000004 ;REPEAT CURRENT CHARACTER +IOTLSN==000002 ;TITLE SEEN +IOSALL==000001 ;SUPPRESS MACRO LISTING EVEN IF BINARY IS GENERATED + +OPDEF JUMP1 [JUMPL FR, ] ;JUMP IF PASS 1 +OPDEF JUMP2 [JUMPGE FR, ] ;JUMP IF PASS 2 + +OPDEF JUMPOC [JUMPGE IO, ] ;JUMP IF IN OP-CODE FIELD +OPDEF JUMPAD [JUMPL IO, ] ;JUMP IF IN ADDRESS FIELD + +OPDEF JUMPCM [JUMPL CS, ] ;JUMP IF CURRENT CHAR IS COMMA +OPDEF JUMPNC [JUMPGE CS, ] ;JUMP IF CURRENT CHAR IS NON-COMMA + + ;ER ERROR REGISTERS (IO/ER) +ERRM== 000020 ;MULTIPLY DEFINED SYMBOL +ERRE== 000040 ;ILLEGAL USE OF EXTERNAL +ERRP== 000100 ;PHASE DISCREPANCY +ERRO== 000200 ;UNDEFINED OP CODE +ERRN== 000400 ;NUMBER ERROR +ERRV== 001000 ;VALUE PREVIOUSLY UNDEFINED +ERRU== 002000 ;UNDEFINED SYMBOL +ERRR== 004000 ;RELOCATION ERROR +ERRL== 010000 ;LITERAL ERROR +ERRD== 020000 ;REFERENCE TO MULTIPLY DEFINED SYMBOL +ERRA== 040000 ;PECULIAR ARGUMENT +ERRX== 100000 ;MACRO DEFINITION ERROR +ERRQ== 200000 ;QUESTIONABLE, NON-FATAL ERROR +ERRORS==777760 +LPTSW== 000002 +TTYSW== 000001 + + ;SYMBOL TABLE FLAGS +SYMF== 400000 ;SYMBOL +TAGF== 200000 ;TAG +NOOUTF==100000 ;NO DDT OUTPUT WFW +SYNF== 040000 ;SYNONYM +MACF== SYNF_-1 ;MACRO +OPDF== SYNF_-2 ;OPDEF +PNTF== 004000 ;"VALUE" IN SYMBOL TBL IS PNTR TO 36BIT VALUE +UNDF== 002000 ;UNDEFINED +EXTF== 001000 ;EXTERNAL +INTF== 000400 ;INTERNAL +ENTF== 000200 ;ENTRY +VARF== 000100 ;VARIABLE +MDFF== 000020 ;MULTIPLY DEFINED +SPTR== 000010 ;SPECIAL EXTERNAL POINTER +SUPRBT==000004 ;SUPRESS OUTPUT TO DDT +LELF== 000002 ;LEFT HAND RELOCATABLE +RELF== 000001 ;RIGHT HAND RELOCATABLE + +LITF== 200000 ;FLAG FOR PSEUDO-OPS INVALID IN LIT'S +ADDF== 100000 ;FLAG FOR PSEUDO-OPS INVALID IN ADDRESSES + +TNODE== 200000 ;TERMINAL NODE FOR EVALEX + SUBTTL RUN UUO + +IFN CCLSW,< +IFN RUNSW,< XLIST > +IFE RUNSW,< +;THIS CODE MUST BE IN FIRST 1K TO ALLOW MAXIMUM SPACE +; FOR OVERWRITING +; 74 APPEARS BECAUSE ONLY LOCS 74 AND BEYOND ARE SAVED BY "SAVE" + +IFN CCLSW, > + LIST + + IFN RUNSW,< ;ASSEMBLE IF RUN UUO IMPLEMENTED +NUNSET: JUMPN ACDEV,.+2 + MOVSI ACDEV,(SIXBIT /SYS/) ;USE SYS IF NONE SPECIFIED + MOVEM ACDEV,RUNDEV +IFE STANSW,< + MOVEM ACFILE,RUNFIL ;STORE FILE NAME + PUSHJ PP,DELETE ;COMMAND FILE + SETZM RUNPP + MOVEI 16,RUNDEV ;XWD 0,RUNDEV + TLNE IO,CRPGSW ;WAS RPG IN PROGRESS? + HRLI 16,1 ;YES. START NEXT AT C(JOBSA)+1 + RUN 16, ;DO "RUN DEV:NAME" +> ;IFE STANSW, +IFN STANSW,< + MOVEM ACFILE,RUNDEV+1 + SETZM RUNDEV+2 + SETZM RUNDEV+3 + SETZM RUNDEV+4 + TLNE IO,CRPGSW ;ARE WE DOING RPG? + AOS RUNDEV+3 ;YES SET STARTING ADDRESS INCREMENT + MOVEI 16,RUNDEV ;ADDRESS OF SWAPBLOCK + SWAP 16, +> ;IFN STANSW + HALT ;SHOULDN'T RETURN. HALT IF IT DOES +> + +DELETE: HRRZ EXTMP ;IF THE EXTENSION + CAIE (SIXBIT/TMP/) ;IS .TMP + POPJ PP, ;RETURN. + CLOSE CTL2, ;DELETE + SETZB 4,5 ;THE COMMAND FILE. + SETZB 6,7 + RENAME CTL2,4 ; + JFCL + POPJ PP, +> + SUBTTL START ASSEMBLING + +ASSEMB: PUSHJ PP,INZ ;INITIALIZE FOR PASS + MOVE [ASCII /.MAIN/] + MOVEM TBUF + MOVEI SBUF + HRRM SUBTTX + +ASSEM1: PUSHJ PP,CHARAC ;TEST FOR FORM FEED + SKIPGE LIMBO ;CRLF FLAG? + JRST ASSEM1 ;YES ,IGNORE LF + CAIN C,14 + SKIPE SEQNO + JRST ASSEM2 + PUSHJ PP,OUTFF1 + PUSHJ PP,OUTLI + JRST ASSEM1 + +ASSEM2: AOS TAGINC + CAIN C,"\" ;BACK-SLASH? + TLZA IO,IOMAC ;YES, LIST IF IN MACRO + TLO IO,IORPTC + PUSHJ PP,STMNT ;OFF WE GO + TLZN IO,IOENDL ;WAS STOUT PRE-EMPTED? + PUSHJ PP,STOUT ;NO, POLISH OFF LINE + JRST ASSEM1 + + SUBTTL STATEMENT PROCESSOR + +STMNT: TLZ FR,INDSW!FSNSW + TLZA IO,FLDSW +STMNT1: PUSHJ PP,LABEL +STMNT2: PUSHJ PP,ATOM ;GET THE FIRST ATOM + CAIN C,35 ;"="? + JRST ASSIGN ;YES + CAIN C,32 ;":"? + JRST STMNT1 ;YES + JUMPAD STMNT7 ;NUMERIC EXPRESSION + JUMPN AC0,STMN2A ;JUMP IF NON NULL FIELD + SKIPN LITLVL ;ALLOW COMMA IN LITERALS + CAIE C,14 ;NULL, COMMA? + CAIN C,EOL ;OR END OF LINE? + POPJ PP, ;YES,EXIT + CAIN C,"]" ;CLOSING LITERAL? + POPJ PP, ;YES + JRST STMNT9 ;NO,AT LEAST SKIP ALL THIS NONSENSE + +STMN2A: JUMPE C,.+2 + TLO IO,IORPTC + PUSHJ PP,MSRCH ;SEARCH FOR MACRO/OPDEF/SYN + JRST STMNT3 ;NOT FOUND, TRY OP CODE + LDB SDEL,[POINT 3,ARG,5] + JUMPE SDEL,ERRAX ;ERROR IF NO FLAGS + SOJE SDEL,OPD1 ;OPDEF IF 1 + SOJE SDEL,CALLM ;MACRO IF 2 + JRST STMNT4 ;SYNONYM, PROCESS WITH OP-CODES + +STMNT3: PUSHJ PP,OPTSCH ;SEARCH OP CODE TABLE + JRST STMNT5 ;NOT FOUND +STMNT4: HLLZ AC0,V ;PUT CODE IN AC0 + TRZ V,ADDF ;CLEAR ADDRESS NON-VALID FLAG + TRZE V,LITF ;VALID IN LITERAL? + SKIPN LITLVL ;NO, ARE WE IN A LITERAL? + JRST 0(V) ;NO, GO TO APPROPRIATE PROCESSOR + POPJ PP, ;YES,EXIT + +STMNT5: PUSHJ PP,SSRCH ;TRY SYMBOLS + JRST STMNT8 ;NOT FOUND + TLNE ARG,EXTF!UNDF ;EXTERNAL OR UNDEFINED? + JRST STMNT7 ;YES, PROCESS IN EVALEX + TLNN RC,-2 ;CHECK FOR EXTERNAL + TRNE RC,-2 + JRST STMNT7 + MOVE AC0,V ;FOUND, PUT VALUE IN AC0 + TLO IO,NUMSW ;FLAG AS NUMERIC +STMNT7: TLZ IO,IORPTC +STMNT9: PUSHJ PP,EVALHA ;EVALUATE EXPRESSION +IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM> + TLNE FR,FSNSW ;FIELD SEEN? + JRST STOW ;YES,STOW THE CODE AND EXIT + CAIE C,"]"-40 ;CLOSING LITERAL? + TRO ER,ERRQ ;NO, GIVE "Q" ERROR + POPJ PP, ;EXIT + + STMNT8: MOVEI V,0 ;ALWAYS START SCAN WITH 0 + CAIL V,CALNTH ;END OF TABLE? + JRST STMN8C ;YES, TRY TTCALLS + CAME AC0,CALTBL(V) ;FOUND IT? + AOJA V,.-3 ;NO,TRY AGAIN + SUBI V,NEGCAL ;CALLI'S START AT -1 + HRLI V,(CALLI) ;PUT IN UUO +STMN8D: MOVSI ARG,OPDF ;SET FLAG FOR OPDEF +STMN8B: PUSHJ PP,INSERT ;PUT OPDEF IN TABLE + JRST OPD ;AND TREAT AS OPDEF + +STMN8C: SETZ V, ;START WITH ZERO + CAIL V,TTCLTH ;END OF TABLE? + JRST STMN8A ;YES, ERROR + CAME AC0,TTCTBL(V) ;MATCH? + AOJA V,.-3 ;NO, KEEP TRYING + LSH V,5 ;PUT IN AC FIELD (RIGHT HALF) + HRLZI V,<(TTCALL)>(V) ;PUT UUO IN LEFT HALF + JRST STMN8D ;SET OPDEF FLAG + +STMN8A: SETZB V,RC ;CLEAR VALUE AND RELOCATION + TRO ER,ERRO ;FLAG AS UNDEFINED OP-CODE + JUMP1 OPD ;TREAT AS STANDARD OP ON PASS1 + MOVSI ARG,OPDF!UNDF!EXTF ;SET A FEW FLAGS + JRST STMN8B ;TO FORCE OUT A MESSAGE + + ;STATEMENT OUT PASSES REMAINDER OF LINE (CMNT) + ;UNTIL A LINE TERMINATOR IS SEEN. +STOUTS: TLOA IO,IOENDL!IORPTC +STOUT: TLO IO,IORPTC + PUSHJ PP,BYPAS1 + CAIN C,14 ;COMMA? + SKIPL STPX ;YES, ERROR IF CODE STORED + CAIN C,EOL + TLOA IO,IORPTC + TRO ER,ERRQ +STOUT1: PUSHJ PP,CHARAC + CAIG C,CR + CAIG C,HT + JRST STOUT1 + JRST OUTLIN ;OUTPUT THE LINE (BIN AND LST) + SUBTTL LABEL PROCESSOR + +LABEL: JUMPAD LABEL4 ;COMPARE IF NON-SYMBOLIC + JUMPE AC0,LABEL5 ;ERROR IF BLANK + TLO IO,DEFCRS ;THIS IS A DEFINITION + PUSHJ PP,SSRCH ;SEARCH FOR OPERAND + MOVSI ARG,SYMF!UNDF!TAGF ;NOT FOUND + TLNN ARG,EXTF ;OPERAND FOUND (SKIP EXIT) + JRST LABEL0 + JUMP1 LABEL3 ;ERROR ON PASS1 + TLNN ARG,UNDF ;UNDEFINED ON PASS1 + JRST LABEL3 ;NO, FLAG ERROR + TLZ ARG,EXTF!PNTF ;TURN OFF EXT FLAG NOW +LABEL0: TLZN ARG,UNDF!VARF ;WAS IT PREVIOUSLY DEFINED? + JRST LABEL2 ;YES, CHECK EQUALITY + MOVE V,LOCA ;WFW + MOVE RC,MODA + TLO ARG,TAGF + PUSHJ PP,PEEK ;GET NEXT CHAR. + CAIE C,":" ;SPECIAL CHECK FOR :: + JRST LABEL1 ;NO MATCH + TLO ARG,INTF ;MAKE IT INTERNAL + PUSHJ PP,GETCHR ;PROCESS NEXT CHAR. + PUSHJ PP,PEEK ;PREVIEW NEXT CHAR. +LABEL1: CAIE C,"!" ;HALF-KILL SIGN + JRST LABEL6 ;NO + TLO ARG,NOOUTF ;YES, SUPPRESS IT + PUSHJ PP,GETCHR ;AND GET RID OF IT +LABEL6: MOVEM AC0,TAG ;SAVE FOR PASS 1 ERRORS + HLLZS TAGINC ;ZERO INCREMENT + JRST INSERT ;INSERT/UPDATE AND EXIT + +LABEL2: HRLOM V,LOCBLK ;SAVE LIST LOCATION + CAMN V,LOCA ;DOES IT COMPARE WITH PREVIOUS? WFW + CAME RC,MODA +LABEL3: TLOA ARG,MDFF ;NO, FLAG MULTIPLY DEFINED AND SKIP + JRST LABEL7 ;YES, GET RID OF EXTRA CHARS. + TRO ER,ERRM ;FLAG MULTIPLY DEFINED ERROR + JRST UPDATE ;UPDATE AND EXIT + +LABEL4: CAMN AC0,LOCA ;DO THEY COMPARE? + CAME RC,MODA +LABEL5: TRO ER,ERRP ;NO, FLAG PHASE ERROR + POPJ PP, + +LABEL7: SKIPE LITLVL ;LABEL IN A LITERAL? + MOVEM AC0,LITLBL ;YES, SAVE LABEL NAME FOR LATER + PUSHJ PP,PEEK ;INSPECT A CHAR. + CAIN C,":" ;COLON? + PUSHJ PP,GETCHR ;YES, DISPOSE OF IT + PUSHJ PP,PEEK ;EXAMINE ONE MORE CHAR. + CAIN C,"!" ;EXCLAMATION? + JRST GETCHR ;YES, INDEED + POPJ PP, + SUBTTL ATOM PROCESSOR +ATOM: PUSHJ PP,CELL ;GET FIRST CELL + TLNE IO,NUMSW ;IF NON-NUMERIC +ATOM1: CAIE C,42 ;OR NOT A BINARY SHIFT, + POPJ PP, ;EXIT + + PUSH PP,AC0 ;STACK REGISTERS, ITS A BINARY SHIFT + PUSH PP,AC1 + PUSH PP,RC + PUSH PP,RX + HRRI RX,^D10 ;COMPUTE SHIFT RADIX 10 + PUSHJ PP,CELLSF ;GET SHIFT + MOVE ARG,RC ;SAVE RELOCATION + POP PP,RX ;RESTORE REGISTERS + POP PP,RC + POP PP,AC1 + MOVN SX,AC0 ;USE NEGATIVE OF SHIFT + POP PP,AC0 + JUMPN ARG,NUMER2 ;IF NOT ABSOLUTE + TLNN IO,NUMSW ;AND NUMERIC, + JRST NUMER2 ;FLAG ERROR + LSHC AC0,^D35(SX) + LSH RC,^D35(SX) + JRST ATOM1 ;TEST FOR ANOTHER + CELLSF: TLO IO,FLDSW +CELL: SETZB AC0,RC ;CLEAR RESULT AND RELOCATION + SETZB AC1,AC2 ;CLEAR WORK REGISTERS + MOVEM PP,PPTEMP ;SAVE PUSHDOWN POINTER + TLZ IO,NUMSW + TLZA FR,NEGSW!DCFSW!RADXSW + +CELL1: TLO IO,FLDSW + PUSHJ PP,BYPASS + LDB V,[POINT 4,CSTAT(C),14] ;GET CODE + XCT .+1(V) ;EXECUTE, INDEX VIA BITS 11,12,13,14 OF CSTAT TABLE + JRST CELL1 ;0; BLANK, (TAB OR "+") + JRST LETTER ;1; LETTER ] $ % ( ) , ; > + TLC FR,NEGSW ;2; "-" + TLO FR,INDSW ;3; "@" + JRST NUM1 ;4; NUMERIC 0 - 9 + JRST ANGLB ;5; "<" + JRST SQBRK ;6; "[" + JRST QUOTES ;7; ""","'" + JRST QUAL ;10; "^" + JRST PERIOD ;11; "." + TROA ER,ERRQ ;12; ERROR, FLAG AND TREAT AS DELIMITER + ;12; ! # & * / : = ? \ _ + LETTER: TLOA AC2,(POINT 6,AC0,) ;SET BYTE POINTER +LETTE1: PUSHJ PP,GETCHR ;GET CHARACTER + TLNN CS,6 ;ALPHA-NUMERIC? + JRST LETTE3 ;NO,TEST FOR VARIABLE + TLNE AC2,770000 ;STORE ONLY SIX BYTES +LETTE2: IDPB C,AC2 ;RETURN FROM PERIOD + JRST LETTE1 + +LETTE3: CAIE C,03 ;"#"? + POPJ PP, + JUMPE AC0,POPOUT ;TEST FOR NULL + PUSHJ PP,PEEK ;PEEK AT NEXT CHAR. + CAIN C,"#" ;IS IT 2ND #? + JRST LETTE4 ;YES, THEN IT'S AN EXTERN + TLO IO,DEFCRS + PUSHJ PP,SSRCH ;YES, SEARCH FOR SYMBOL (OPERAND) + MOVSI ARG,SYMF!UNDF ;NOT FOUND, FLAGAS UNDEFINED SYM. + TLNN ARG,UNDF ;UNDEFINED? + JRST GETCHR ;NO, GET NEXT CHAR AND RETURN + TLO ARG,VARF ;YES, FLAG AS A VARIABLE + TRO ER,ERRU ;SET UNDEFINED ERROR FLAG + PUSHJ PP,INSERZ ;INSERT IT WITH A ZERO VALUE + JRST GETDEL + +LETTE4: PUSHJ PP,GETCHR ;AND SCAN PAST IT + PUSHJ PP,GETCHR ;GET RID OF # + JRST EXTER1 ;PUT IN SYMBOL TABLE + +NUMER1: SETZB AC0,RC ;RETURN ZERO +NUMER2: TRO ER,ERRN ;FLAG ERROR + +GETDEL: PUSHJ PP,BYPASS +GETDE1: JUMPE C,.-1 + MOVEI AC1,0 +GETDE3: TLO IO,NUMSW!FLDSW ;FLAG NUMERIC + TLNN FR,NEGSW ;IS ATOM NEGATIVE? + POPJ PP, ;NO, EXIT + JUMPE AC1,GETDE2 + MOVNS AC1 + TDCA AC0,[-1] +GETDE2: MOVNS AC0 ;YES, NEGATE VALUE + MOVNS RC ;AND RELOCATION +POPOUT: POPJ PP, ;EXIT + QUOTES: CAIE C,"'"-40 ;IS IT "'" + JRST QUOTE ;NO MUST BE """ + JRST SQUOTE ;YES + +QUOTE0: TLNE AC0,376000 ;5 CHARACTERS STORED ALREADY? + TRO ER,ERRQ ;YES, GIVE WARNING + ASH AC0,7 + IOR AC0,C +QUOTE: PUSHJ PP,CHARAC ;GET 7-BIT ASCII + CAIG C,15 ;TEST FOR LF, VT, FF OR CR + CAIGE C,12 + JRST .+2 ;NO, SO ALL IS WELL + JRST QUOTE2 ;ESCAPE WITH Q ERROR + CAIE C,42 + JRST QUOTE0 + PUSHJ PP,PEEK ;LOOK AT NEXT CHAR. + CAIE C,42 + JRST QUOTE1 ;RESTORE REPEAT LEVEL AND QUIT + PUSHJ PP,CHARAC ;GET NEXT CHAR. + JRST QUOTE0 ;USE IT + +QUOTE2: TRO ER,ERRQ ;SET Q ERROR +QUOTE1: JRST GETDEL + +SQUOT0: TLNE AC0,770000 ;SIX CHARS. STORED ALREADY ? + TRO ER,ERRQ ;YES + LSH AC0,6 + IORI AC0,-40(C) ;OR IN SIXBIT CHAR. + +SQUOTE: PUSHJ PP,CHARAC + CAIG C,CR + CAIGE C,LF + JRST .+2 + JRST QUOTE1 + CAIE C,"'" + JRST SQUOT0 + PUSHJ PP,PEEK + CAIE C,"'" + JRST QUOTE1 + PUSHJ PP,CHARAC + JRST SQUOT0 + + QUAL: PUSHJ PP,BYPAS1 ;SKIP BLANKS, GET NEXT CHARACTER + CAIN C,42 ;"B"? + JRST QUAL2 ;YES, RADIX=D2 + CAIN C,57 ;"O"? + JRST QUAL8 ;YES, RADIX=D8 + CAIN C,46 ;"F"? + JRST NUMDF ;YES, PROCESS DECIMAL FRACTION + CAIN C,54 ;"L"? + JRST QUALL ;YES + CAIE C,44 ;"D"? + JRST NUMER1 ;NO, FLAG NUMERIC ERROR + ADDI AC2,2 +QUAL8: ADDI AC2,6 +QUAL2: ADDI AC2,2 + PUSH PP,RX + HRR RX,AC2 + PUSHJ PP,CELLSF +QUAL2A: POP PP,RX + TLNN IO,NUMSW + JRST NUMER1 + JRST GETDE1 + +QUALL: PUSH PP,FR + PUSHJ PP,CELLSF + MOVE AC2,AC0 + MOVEI AC0,^D36 + JUMPE AC2,QUAL2A + LSH AC2,-1 + SOJA AC0,.-2 + SUBTTL LITERAL PROCESSOR + +SQBRK: PUSH PP,FR + PUSH PP,EXTPNT ;ALLOW EXTERN TO PRECEDE LIT IN XWD + SETZM EXTPNT + SKIPE LITLVL ;SAVE SEQNO AND PAGE IF NOT IN LIT ALREADY + JRST SQB5 + MOVE C,SEQNO2 + MOVEM C,LITSEQ + MOVE C,PAGENO + MOVEM C,LITPG +SQB5: JSP AC2,SVSTOW +SQB3: PUSHJ PP,STMNT + CAIN C,75 ;CHECK FOR ] + JRST SQB1 + TLO IO,IORPTC + TLNE FR,MWLFLG ;CALL IT ] IF NOT MULTI-WORD FLAG + JRST SQB2 ;BUT REPEAT LAST CHARACTER + PUSHJ PP,BYPAS1 + CAIN C,EOL + TLOA IO,IORPTC + TRO ER,ERRQ +SQB4: PUSHJ PP,CHARAC + CAIN C,";" ;COMMENT? + JRST SQB6 ;YES, IGNORE SQUARE BRACKETS + CAIN C,"]" ;LOOK FOR TERMINAL SQB + TRNN ER,ERRORS ;IN CASE OF ERROR IN LITERAL + JRST .+2 ;NO ALL IS WELL + JRST SQB1 ;FINISH THE LITERAL NOW!! + CAIG C,CR ;LOOK FOR END OF LINE + CAIN C,HT + JRST SQB4 +SQB4A: PUSHJ PP,OUTIML ;DUMP + PUSHJ PP,CHARAC ;GET ANOTHER CHAR. + SKIPL LIMBO ;CRLF FLAG + TLO IO,IORPTC ;NO REPEAT + JRST SQB3 + +SQB6: PUSHJ PP,CHARAC ;GET A CHARACTER + CAIG C,CR + CAIN C,HT ;LOOK FOR END OF LINE CHAR. + JRST SQB6 ;NOT YET + JRST SQB4A ;GOT IT + +SQB1: TLZ IO,IORPTC +SQB2: PUSHJ PP,STOLIT + JSP AC2,GTSTOW + SKIPE LITLBL ;NEED TO FIXUP A LABEL? + PUSHJ PP,RELBLE ;YES, USE LOC OF LITERAL + POP PP,EXTPNT + POP PP,FR + SKIPE LITLVL ;WERE WE NESTED? + JUMP1 NUMER2 ;YES, FORCE ERROR IF PASS 1 + JRST GETDEL + +RELBLE: PUSH PP,AC0 ;SAVE LOCATION COUNTER + PUSH PP,RC ;AND RELOCATION + MOVE AC0,LITLBL ;SYMBOL WE NEED + SETZM LITLBL ;ZERO INDICATOR + PUSHJ PP,SSRCH ;SEARCH FOR OPERAND + JRST RELBL1 ;SHOULD NEVER HAPPEN + TLNN ARG,TAGF ;IT BETTER BE A LABEL + JRST RELBL1 ;IT WASN'T , GIVE UP BEFORE SOME HARM IS DONE + TLZ ARG,UNDF!EXTF!PNTF ;CLEAR FLAGS NOW + POP PP,RC ;GET LITERAL RELOCATION + MOVE V,(PP) ;GET VALUE (LOC COUNTER) + PUSHJ PP,UPDATE ;UPDATE VALUE + POP PP,AC0 ;RESTORE LITERAL COUNT + POPJ PP, ;RETURN + +RELBL1: POP PP,RC ;RESTORE RC + POP PP,AC0 ;AND AC0 + POPJ PP, ;JUST RETURN + ANGLB: PUSH PP,FR + TLZ FR,INDSW + PUSHJ PP,ATOM + TLNN IO,NUMSW + CAIE C,35 + JRST ANGLB1 + PUSHJ PP,ASSIG1 + MOVE AC0,V + JRST ANGLB2 + +ANGLB1: PUSHJ PP,EVALHA +ANGLB2: POP PP,FR + CAIE C,36 + TRO ER,ERRN + JRST GETDEL + +PERIOD: PUSHJ PP,GETCHR ;LOOK AT NEXT CHARACTER + TLNN CS,2 ;ALPHABETIC? + JRST PERNUM ;NO, TEST NUMERIC + MOVSI AC0,(SIXBIT /./) ;YES, PUT PERIOD IN AC0 + MOVSI AC2,(POINT 6,AC0,5) ;SET BYTE POINTER + JRST LETTE2 ;AND TREAT AS SYMBOL + +PERNUM: TLNE CS,4 ;IS IT A NUMBER + JRST NUM32 ;YES + MOVE AC0,LOCA ;NO. CURRENT LOC SYMBOL (.) + MOVE RC,MODA ;SET TO CURRENT ASSEMBLY MODE + JRST GETDE1 ;GET DELIMITER +NUMDF: TLO FR,DCFSW ;SET DECIMAL FRACTION FLAG +NUM: PUSHJ PP,GETCHR ;GET A CHARACTER + TLNN CS,4 ;NUMERIC? + JRST NUM10 ;NO +NUM1: SUBI C,20 ;CONVERT TO OCTAL + PUSH PP,C ;STACK FOR FLOATING POINT + MOVE AC0,AC1 + MULI AC0,0(RX) + ADD AC1,C ;ADD IN LAST VALUE + CAIL C,0(RX) ;IS NUMBER LESS THAN CURRENT RADIX? + TLO FR,RADXSW ;NO, SET FLAG + AOJA AC2,NUM ;YES, AC2=NO. OF DECIMAL PLACES + + NUM10: CAIE C,16 ;PERIOD? + TLNE FR,DCFSW ;OR DECIMAL FRACTION? + JRST NUM30 ;YES, PROCESS FLOATING POINT + LSH AC1,1 ;NO, CLEAR THE SIGN BIT + LSHC AC0,^D35 ;AND SHIFT INTO AC0 + MOVE PP,PPTEMP ;RESTORE PP + SOJE AC2,GETDE1 ;NO RADIX ERROR TEST IF ONE DIGIT + TLNE FR,RADXSW ;WAS ILLEGAL NUMBER ENCOUNTERED? + TRO ER,ERRN ;YES, FLAG N ERROR + JRST GETDE1 + +NUM30: CAIE C,"B"-40 ;IF "B" THEN MISSING "." +NUM31: PUSHJ PP,GETCHR + TLNN CS,4 ;NUMERIC? + JRST NUM40 ;NO +NUM32: SUBI C,20 + PUSH PP,C + JRST NUM31 + +NUM40: PUSH PP,FR ;STACK VALUES + HRRI RX,^D10 + PUSH PP,AC2 + PUSH PP,PPTEMP + CAIN C,45 ;"E"? + JRST [PUSHJ PP,PEEK ;GET NEXT CHAR + PUSH PP,C ;SAVE NEXT CHAR + PUSHJ PP,CELL ;YES, GET EXPONENT + POP PP,C ;GET FIRST CHAR. AFTER E + CAIN V,4 ;MUST HAVE NUMERICAL STATUS + JRST .+2 ;SKIP RETURN + CAIN C,"<" ;ALLOW + JRST .+2 ;SKIP RETURN + SKIPN AC0 ;ERROR IF NON-ZERO EXPRESSION + TROA ER,ERRQ ;ALLOW E+,E- + SETOM RC ;FORCE NUMERICAL ERROR + JRST .+2] ;SKIP RETURN + MOVEI AC0,0 ;NO, ZERO EXPONENT + POP PP,PPTEMP + POP PP,SX + POP PP,FR + HRRZ V,PP + MOVE PP,PPTEMP + JUMPN RC,NUMER1 ;EXPONENT MUST BE ABSOLUTE + ADD SX,AC0 + HRRZ ARG,PP + ADD SX,ARG + SETZB AC0,AC2 + TLNE FR,DCFSW + JRST NUM60 + JOV NUM50 ;CLEAR OVERFLOW FLAG + +NUM50: JSP SDEL,NUMUP ;FLOATING POINT + JRST NUM52 ;END OF WHOLE NUMBERS + FMPR AC0,[10.0] ;MULTIPLY BY 10 + TLO AC1,233000 ;CONVERT TO FLOATING POINT + FADR AC0,AC1 ;ADD IT IN + JRST NUM50 + +NUM52: JSP SDEL,NUMDN ;PROCESS FRACTION + FADR AC0,AC2 + JOV NUMER1 ;TEST FOR OVERFLOW + JRST GETDE1 + + TLO AC1,233000 + TRNE AC1,-1 + FADR AC2,AC1 ;ACCUMULATE FRACTION + FDVR AC2,[10.0] + JRST NUM52 + +NUM60: JSP SDEL,NUMUP + JRST NUM62 + IMULI AC0,^D10 + ADD AC0,AC1 + JRST NUM60 + +NUM62: LSHC AC1,-^D36 + JSP SDEL,NUMDN + LSHC AC1,^D37 + PUSHJ PP,BYPAS2 + JRST GETDE3 + + DIVI AC1,^D10 + JRST NUM62 + +NUMUP: MOVEI AC1,0 + CAML ARG,SX + JRST 0(SDEL) + CAMGE ARG,V + MOVE AC1,1(ARG) + AOJA ARG,1(SDEL) + +NUMDN: MOVEI AC1,0 + CAMG V,SX + JRST 0(SDEL) + CAMLE V,ARG + MOVE AC1,0(V) + SOJA V,3(SDEL) + SUBTTL GETSYM +GETSYM: MOVEI AC0,0 ;CLEAR AC0 + MOVSI AC1,(POINT 6,AC0) ;PUT POINTER IN AC1 + PUSHJ PP,BYPASS ;SKIP LEADING BLANKS + TLNN CS,2 ;ALPHABETIC? + JRST GETSY1 ;NO, ERROR + CAIE C,16 ;PERIOD? + JRST GETSY2 ;NO, A VALID SYMBOL + IDPB C,AC1 ;STORE THE CHARACTER + PUSHJ PP,GETCHR ;YES, TEST NEXT CHARACTER + TLNN CS,2 ;ALPHABETIC? +GETSY1: TROA ER,ERRA +GETSY2: AOS 0(PP) ;YES, SET SKIP EXIT +GETSY3: TLNN CS,6 ;ALPHA-NUMERIC? + JRST BYPAS2 ;NO, GET DELIMITER + TLNE AC1,770000 ;YES, HAVE WE STORED SIX? + IDPB C,AC1 ;NO, STORE IT + PUSHJ PP,GETCHR + JRST GETSY3 + + SUBTTL EXPRESSION EVALUATOR +CV== AC0 ;CURRENT VALUE +PV== AC1 ;PREVIOUS VALUE +RC== RC ;CURRENT RELOCATABILITY +PR== AC2 ;PREVIOUS RELOCATABILITY +CS= CS ;CURRENT STATUS +PS== SDEL ;PREVIOUS STATUS + +EVALHA: TLO FR,TMPSW +EVALCM: PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION + PUSH PP,[0] ;MARK PDL + JUMPCM EVALC3 ;JUMP IF COMMA + TLO IO,IORPTC ;IT'S NOT,SO REPEAT + JRST OP ;PROCESS IN OP +EVALC3: +IFN FORMSW, + PUSH PP,[0] ;STORE ZERO'S ON PDL + PUSH PP,[0] ;....... + MOVSI AC2,(POINT 4,(PP),12) + JRST OP1B ;PROCESS IN OP + +EVALEX: TLO IO,FLDSW + PUSH PP,[XWD TNODE,0] ;MARK THE LIST 200000,,0 + TLZN FR,TMPSW +EVATOM: PUSHJ PP,ATOM ;GET THE NEXT ATOM + JUMPE AC0,EVGETD ;TEST FOR NULL/ZERO + TLOE IO,NUMSW ;SET NUMERIC, WAS IT PREVIOUSLY? + JRST EVGETD+1 ;YES, TREAT ACCORDINGLY + PUSHJ PP,SEARCH ;SEARCH FOR MACRO OR SYMBOL + JRST EVOP ;NOT FOUND, TRY FOR OP-CODE + JUMPL ARG,.+2 ;SKIP IF OPERAND + PUSHJ PP,SSRCH1 ;OPERATOR, TRY FOR SYMBOL (OPERAND) + PUSHJ PP,QSRCH ;PERFORM CROSS-REFERENCE + JUMPG ARG,EVMAC ;BRANCH IF OPERATOR + MOVE AC0,V ;SYMBOL, SET VALUE + JRST EVTSTS ;TEST STATUS + +EVMAC: TLNE FR,NEGSW ;UNARY MINUS? + JRST EVERRZ ;YES, INVALID BEFORE OPERATOR + LDB SDEL,[POINT 3,ARG,5] ;GET MACF/OPDF/SYNF + SOJL SDEL,EVERRZ ;ERROR IF NO FLAGS + + JUMPE C,.+2 ;NON-BLANK? + TLO IO,IORPTC ;YES, REPEAT CHARACTER + SOJE SDEL,CALLM ;MACRO IF 2 + JUMPG SDEL,EVOPS ;SYNONYM IF 4 + + MOVE AC0,V ;OPDEF + MOVEI V,OP ;SET TRANSFER VECTOR + JRST EVOPD + EVOP: TLNE FR,NEGSW ;OPCODE, UNARY MINUS? + JRST EVERRZ ;YES, ERROR + + PUSHJ PP,OPTSCH ;SEARCH SYMBOL TABLE + JRST EVOPX ;NOT FOUND +EVOPS: TRZ V,LITF ;CLEAR LIT INVALID FLAG + TRZE V,ADDF ;SYNONYM + JRST EVOPX ;PSEUDO-OP THAT GENERATES NO DATA JUMPS + HLLZ AC0,V +EVOPD: JUMPE C,.+2 ;OPDEF, NON-BLANK DELIMITER? + TLO IO,IORPTC ;YES, REPEAT CHARACTER + JSP AC2,SVSTOW + PUSHJ PP,0(V) + PUSHJ PP,DSTOW + JSP AC2,GTSTOW + TRNE RC,-2 + HRRM RC,EXTPNT + TLNE RC,-2 + HLLM RC,EXTPNT + JRST EVNUM + +EVOPX: MOVSI ARG,SYMF!UNDF + PUSHJ PP,INSERZ +EVERRZ: SETZB AC0,RC ;CLEAR CODE AND RELOCATION +EVERRU: TRO ER,ERRU + JRST EVGETD + EVTSTS: TLNE ARG,UNDF + JRST [TRO ER,ERRU ;SET UNDEF ERROR + JUMP1 EVGETD ;TREAT AS UNDF ON PASS1 + JRST .+1] ;TREAT AS EXTERNAL ON PASS2 + TLNN ARG,EXTF + JRST EVTSTR + HRRZ RC,ARG ;GET ADRES WFW + HRRZ ARG,EXTPNT ;SAVE IT WFW + HRRM RC,EXTPNT ;WFW + TRNE ARG,-1 ;WFW + TRO ER,ERRE + SETZB AC0,ARG + +EVTSTR: TLNE ARG,MDFF ;MULTIPLY DEFINED? + TRO ER,ERRD ;YES, FLAG IT + TLNE FR,NEGSW ;NEGATIVE ATOM? + PUSHJ PP,GETDE2 ;YES, NEGATE AC0 AND RC + +EVGETD: TLNE IO,NUMSW ;NON BLANK FIELD + TLO FR,FSNSW ;YES,SET FLAG + PUSHJ PP,BYPAS2 + TLNE CS,6 ;ALPHA-NUMERIC? + TLO IO,IORPTC ;YES, REPEAT IT +EVNUM: POP PP,PS ;POP THE PREVIOUS DELIMITER/TNODE + TLO PS,4000 + CAMGE PS,CS ;OPERATION REQUIRED? + JRST EVPUSH ;NO, PUT VALUES BACK ON STACK + TLNN PS,TNODE ;YES, HAVE WE REACHED TERMINAL NODE? + JRST EVXCT ;NO, EXECUTION REQUIRED + TLNN CS,170000 ;YES, ARE WE POINTING AT DEL? (& ! * / + - _) + POPJ PP, ;YES, EXIT + ;NO,FALL INTO EVPUSH + + EVPUSH: PUSH PP,PS ;STACK VALUES + PUSH PP,CV + PUSH PP,RC + PUSH PP,CS + JRST EVATOM ;GET NEXT ATOM + +EVXCT: POP PP,PR ;POP PREVIOUS RELOCATABILITY + POP PP,PV ;AND PREVIOUS VALUE + LDB PS,[POINT 3,PS,29] ;TYPE OF OPERATION TO PS + JRST .+1(PS) ;PERFORM PROPER OPERATION + JRST ASSEM1 ;0; SHOULD NEVER GET HERE ;DMN + JRST XMUL ;1; + JRST XDIV ;2; + JRST XADD ;3; + JRST XSUB ;4; + JRST XLRW ;5; "_" + TDOA CV,PV ;6; MERGE PV INTO CV + AND CV,PV ;7; AND PV INTO CV + JUMPN RC,.+2 ;COMMON RELOCATION TEST +EVXCT1: JUMPE PR,EVNUM + TRO ER,ERRR ;BOTH MUST BE FIXED + JRST EVNUM ;GO TRY AGAIN + +XSUB: SUBM PV,CV + SUBM PR,RC + JRST EVNUM + +XADD: ADDM PV,CV + ADDM PR,RC + JRST EVNUM + +XDIV: IDIV PR,CV ;CORRECT RELOCATABILITY + IDIVM PV,CV +XDIV1: EXCH PR,RC ;TAKE RELOCATION OF NUMERATOR + JRST EVXCT1 + +XMUL: JUMPE PR,XMUL1 ;AT LEAST ONE OPERAND + JUMPE RC,XMUL1 ;MUST BE FIXED + TRO ER,ERRR +XMUL1: IORM PR,RC ;GET RELOCATION TO RC + CAMGE PV,CV ;FIND THE GREATER + EXCH PV,CV ;FIX IN CASE CV=0,OR 1 + IMULM PV,RC + IMULM PV,CV + JRST EVNUM +XLRW: EXCH PV,CV + LSH CV,0(PV) + LSH PR,0(PV) + JRST XDIV1 + SUBTTL LITERAL STORAGE HANDLER + +STOLER: +IFE FORMSW,< SETZB AC0,RC ;ERROR, NO CODE STORED + PUSHJ PP,STOW ;STOW ZERO> +IFN FORMSW,< MOVEI AC0,0 + PUSHJ PP,STOWZ1> + TRO ER,ERRL ;AND FLAG THE ERROR + +STOLIT: MOVE SDEL,STPX + SUB SDEL,STPY ;COMPUTE NUMBER OF WORDS + JUMPE SDEL,STOLER ;ERROR IF NONE STORED + TRNN ER,ERRORS ;ANY ERRORS? + JRST STOL06 ;NO + JUMP2 STOL22 ;YES, NO SEARCH. BRANCH IF PASS2 + ADDM SDEL,LITCNT ;PASS ONE, UPDATE COUNT + JRST STOWI ;INITIALIZE STOW + +STOL06: MOVEI SX,LITAB ;PREPARE FOR SEARCH + MOVE ARG,STPX ;SAVE IN THE EVENT OF MULTIPLE-WORD + HRL ARG,STPY + MOVE AC2,LITNUM + MOVEI SDEL,0 +STOL08: PUSHJ PP,DSTOW ;GET VALUE WFW + +STOL10: SOJL AC2,STOL24 ;TEST FOR END + MOVE SX,0(SX) ;NO, GET NEXT STORAGE CELL + MOVE V,-1(SX) ;GET RELOCATION BITS WFW + CAMN AC0,-2(SX) ;DO CODES COMPARE? WFW + CAME RC,V ;YES, HOW ABOUT RELOCATION? + AOJA SDEL,STOL10 ;NO, TRY AGAIN + SKIPGE STPX ;YES, MULTI-WORD? + JRST STOL26 ;NO, JUST RETURN LOCATION + MOVEM AC2,SAVBLK+AC2 ;YES, SAVE STARTING INFO + MOVEM SX,SAVBLK+SX + +STOL12: SOJL AC2,STOL23 ;TEST FOR END + PUSHJ PP,DSTOW ;GET NEXT WORD WFW + MOVE SX,0(SX) ;UPDATE POINTER + MOVE V,-1(SX) ;GET RELOCATION WFW + CAMN AC0,-2(SX) ;COMPARE VALUE WFW + CAME RC,V ;AND RELOCATION + JRST STOL14 ;NO MATCH, TRY AGAIN + SKIPL STPX ;MATCH, HAVE WE FINISHED SEARCH? + JRST STOL12 ;NO, TRY NEXT WORD + JRST STOL26 ;YES, RETURN LOCATION + +STOL14: MOVE AC2,SAVBLK+AC2 ;RESTORE STOW POINTERS + MOVE SX,SAVBLK+SX + HRREM ARG,STPX + HLREM ARG,STPY + AOJA SDEL,STOL08 ;BETTER LUCK NEXT TIME + +STOL22: MOVE SDEL,LITNUM +STOL23: PUSHJ PP,DSTOW ;DSTOW AND CONVERT +STOL24: MOVE SX,LITABX ;GET CURRENT STORAGE + PUSHJ PP,GETTOP ;GET NEXT CELL + MOVEM AC0,-2(SX) ;STORE CODE WFW + MOVEM RC,-1(SX) ;WFW +IFN FORMSW,< + MOVE AC0,FORM + MOVEM AC0,-3(SX)> + MOVEM SX,LITABX ;SET POINTER TO CURRENT CELL + AOS LITNUM ;INCREMENT NUMBER STORED + AOS LITCNT ;INCREMENT NUMBER RESERVED + SKIPL STPX ;ANY MORE CODE? + JRST STOL23 ;YES +STOL26: JUMP1 POPOUT ;EXIT IF PASS ONE + MOVE SX,LITHDX ;GET HEADER BLOCK + HLRZ RC,-1(SX) ;GET BLOCK RELOCATION + HRRZ AC0,-1(SX) + ADDI AC0,0(SDEL) ;COMPUTE ACTUAL LOCATION + POPJ PP, ;EXIT + + SUBTTL INPUT ROUTINES +GETCHR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER + CAIL C,"A"+40 ;CHECK FOR LOWER CASE + CAILE C,"Z"+40 + JRST .+2 ;NOT LOWER CASE +IFN STANSW,< + SUBI C,40 + CAIN C,32 + MOVEI C,136 ;^ + CAIN C,30 + MOVEI C,137 ;_ + CAIN C,176 + MOVEI C,134 ;} + CAIN C,140 + MOVEI C,100 ;@> +IFE STANSW,< + TRZA C,100 ;CONVERT LOWER CASE TO SIXBIT> + SUBI C,40 ;CONVERT TO SIXBIT + CAIG C,77 ;CHAR GREATER THAN SIXBIT? + JUMPGE C,GETCS ;TEST FOR VALID SIXBIT + ADDI C,40 ;BACK TO ASCII + CAIN C,HT ;CHECK FOR TAB + JRST GETCS2 ;MAKE IT LOOK LIKE SPACE + CAIG C,CR ;GREATER THAN CR + CAIG C,HT ;GREATER THAN TAB + JRST GETCS1 ;IS NOT FF,VT,LF OR CR + MOVEI C,EOL ;LINE OR FORM FEED OR V TAB + TLOA IO,IORPTC ;REPEAT CHARACTER +GETCS2: MOVEI C,0 ;BUT TREAT AS BLANK +GETCS: MOVE CS,CSTAT(C) ;GET STATUS BITS + POPJ PP, ;EXIT + +GETCS1: JUMPE C,GETCS ;IGNORE NULS + TRC C,100 ;MAKE CHAR. VISIBLE + MOVEI CS,"^" + DPB CS,LBUFP ;PUT ^ IN OUTPUT + PUSHJ PP,RSW2 ;ALSO MODIFIED CHAR. + TRO ER,ERRQ ;FLAG Q ERROR + JRST GETCHR ;BUT IGNORE CHAR. + +CHARAC: TLZE IO,IORPTC ;REPEAT REQUESTED? + JRST CHARAX ;YES +RSW0: JUMPN MRP,MREAD ;BRANCH IF TREE POINTER SET + PUSHJ PP,READ +RSW1: SKIPE RPOLVL ;ARE WE IN "REPEAT ONCE"? + JRST REPO1 ;YES +RSW2: MOVE CS,LIMBO ;GET LAST CHAR. + MOVEM C,LIMBO ;STORE THIS CHAR. FOR RPTC + CAIN C,LF ;LF? + CAIE CS,CR ;YES,LAST CHAR. A CR? + JRST RSW3 ;NO + HRROS LIMBO ;YES,FLAG + POPJ PP, ;AND EXIT + +RSW3: TLNE IO,IOSALL ;MACRO SUPPRESS ALL? + JUMPN MRP,CPOPJ ;YES,DON'T LIST IN MACRO + SOSG CPL ;ANY ROOM IN THE IMAGE BUFFER? + PUSHJ PP,OUTPL ;NO, OUTPUT THE PARTIAL LINE + IDPB C,LBUFP ;YES, STORE IN PRINT AREA + CAIE C,HT ;TAB? + POPJ PP, ;NO, EXIT + MOVEI C,7 + ANDCAM C,CPL ;MASK +CHARAX: HRRZ C,LIMBO ;GET LAST CHARACTER + POPJ PP, ;EXIT + +CHARL: PUSHJ PP,CHARAC ;GET AND TEST 7-BIT ASCII + CAIG C,FF ;LINE OR FORM FEED OR VT? + CAIGE C,LF + POPJ PP, ;NO,EXIT + SKIPE LITLVL ;IN LITERAL? + JRST OUTIML ;YES +CHARL1: PUSHJ PP,SAVEXS ;SAVE REGISTERS + PUSHJ PP,OUTLIN ;DUMP THE LINE + JRST RSTRXS ;RESTORE REGISTERS AND EXIT + SUBTTL CHARACTER STATUS TABLE + + DEFINE GENCS (OPLVL,ATOM,AN,SQUOZ,OPTYPE,SEQNO) + + + ;OPLVL PRIORITY OF BINARY OPERATORS + ;ATOM INDEX TO JUMP TABLE AT CELL1 + ;AN TYPE OF CHARACTER + ; 1=OTHER, 2=ALPHA, 4=NUMERIC + ;SQUOZ VALUE IN RADIX 50 + ;OPTYPE INDEX TO JUMP TABLE AT EVXCT + ;SEQNO VALUE IN SIXBIT +CSTAT: + GENCS 00,00,1,00,00,00 ; ' ' + GENCS 04,12,1,00,06,01 ; '!' + GENCS 00,07,1,00,00,02 ; '"' + GENCS 00,12,1,00,00,03 ; '#' + GENCS 00,01,2,46,00,04 ; '$' + GENCS 00,01,2,47,00,05 ; '%' + GENCS 04,12,1,00,07,06 ; '&' + GENCS 00,07,1,00,00,07 ; ''' + + GENCS 00,01,1,00,00,10 ; '(' + GENCS 00,01,1,00,00,11 ; ')' + GENCS 02,12,1,00,01,12 ; '*' + GENCS 01,00,1,00,03,13 ; '+' + GENCS 40,01,1,00,00,14 ; ',' + GENCS 01,02,1,00,04,15 ; '-' + GENCS 00,11,2,45,00,16 ; '.' + GENCS 02,12,1,00,02,17 ; '/' + + GENCS 00,04,4,01,00,20 ; '0' + GENCS 00,04,4,02,00,21 ; '1' + GENCS 00,04,4,03,00,22 ; '2' + GENCS 00,04,4,04,00,23 ; '3' + GENCS 00,04,4,05,00,24 ; '4' + GENCS 00,04,4,06,00,25 ; '5' + GENCS 00,04,4,07,00,26 ; '6' + GENCS 00,04,4,10,00,27 ; '7' + + GENCS 00,04,4,11,00,30 ; '8' + GENCS 00,04,4,12,00,31 ; '9' + GENCS 00,12,1,00,00,32 ; ':' + GENCS 00,01,1,00,00,33 ; ';' + GENCS 00,05,1,00,00,34 ; '<' + GENCS 00,12,1,00,00,35 ; '=' + GENCS 00,01,1,00,00,36 ; '>' + GENCS 00,12,1,00,00,37 ; '?' + GENCS 00,03,1,00,00,40 ; '@' + GENCS 00,01,2,13,00,41 ; 'A' + GENCS 00,01,2,14,00,42 ; 'B' + GENCS 00,01,2,15,00,43 ; 'C' + GENCS 00,01,2,16,00,44 ; 'D' + GENCS 00,01,2,17,00,45 ; 'E' + GENCS 00,01,2,20,00,46 ; 'F' + GENCS 00,01,2,21,00,47 ; 'G' + + GENCS 00,01,2,22,00,50 ; 'H' + GENCS 00,01,2,23,00,51 ; 'I' + GENCS 00,01,2,24,00,52 ; 'J' + GENCS 00,01,2,25,00,53 ; 'K' + GENCS 00,01,2,26,00,54 ; 'L' + GENCS 00,01,2,27,00,55 ; 'M' + GENCS 00,01,2,30,00,56 ; 'N' + GENCS 00,01,2,31,00,57 ; 'O' + + GENCS 00,01,2,32,00,60 ; 'P' + GENCS 00,01,2,33,00,61 ; 'Q' + GENCS 00,01,2,34,00,62 ; 'R' + GENCS 00,01,2,35,00,63 ; 'S' + GENCS 00,01,2,36,00,64 ; 'T' + GENCS 00,01,2,37,00,65 ; 'U' + GENCS 00,01,2,40,00,66 ; 'V' + GENCS 00,01,2,41,00,67 ; 'W' + + GENCS 00,01,2,42,00,70 ; 'X' + GENCS 00,01,2,43,00,71 ; 'Y' + GENCS 00,01,2,44,00,72 ; 'Z' + GENCS 00,06,1,00,00,73 ; '[' + GENCS 00,12,1,00,00,74 ; '\' + GENCS 00,01,1,00,00,75 ; ']' + GENCS 00,10,1,00,00,76 ; '^' + GENCS 10,12,1,00,05,77 ; '_' + SUBTTL LISTING ROUTINES + +OUTLIN: TRNN ER,ERRORS-ERRQ ;ANY ERRORS? + TLNE FR,ERRQSW ;NO, IGNORE Q ERRORS? + TRZ ER,ERRQ ;YES, YES, ZERO THE Q ERROR + HRLZ AC0,ER ;PUT ERROR FLAGS IN AC0 LEFT + TDZ ER,TYPERR + JUMP1 OUTL30 ;BRANCH IF PASS ONE + JUMPN AC0,OUTL02 ;JUMP IF ANY ERRORS TO FORCE PRINTING + SKIPL STPX ;SKIP IF NO CODE, OTHERWISE + JRST OUTL01 ;NO + TLNN IO,IOSALL ;YES,SUPPRESS ALL? + JRST OUTL03 ;NO + JUMPN MRP,CPOPJ ;YES,EXIT IF IN MACRO + LDB C,[XWD 350700,LBUF] + CAIE C,15 ;FIRST CHAR CR? +OUTL01: TLZ IO,IOMAC ;FORCE MACRO PRINTING +OUTL03: TLNN IO,IOMSTR!IOPROG!IOMAC +OUTL02: IOR ER,OUTSW ;FORCE IT. + IDPB AC0,LBUFP ;STORE ZERO TERMINATOR AFTER ASCII SRC LINE + TLNN FR,CREFSW ;CREF? + PUSHJ PP,CLSCRF ;YES, WRITE END OF CREF DATA (177,003) + JUMPE AC0,OUTL20 ;BRANCH IF NO ERRORS + TLZE AC0,ERRM ;M ERROR? + TLO AC0,ERRP ;M ERROR SET - SET P ERROR. + PUSHJ PP,OUTLER ;PROCESS ERRORS + +OUTL20: SKIPN RC,ASGBLK + SKIPE CS,LOCBLK ; + SKIPL STPX ;ANY BINARY? + JRST OUTL23 ;YES, JUMP + JUMPE RC,OUTL22 ;SEQUENCE BREAK AND NO BINARY JUMPS + ILDB C,TABP ;ASSIGNMENT FALLS THROUGH + PUSHJ PP,OUTL ;OUTPUT A TAB. + ILDB C,TABP ;OUTPUT 2ND TAB, LOCATION FIELD + PUSHJ PP,OUTC ;NEXT IS BINARY LISTING FIELD + HLLO CS,LOCBLK ;LEFT HALF OF A 36BIT VALUE + JUMPL RC,.+2 ;SKIP IF LEFT HALF IS NOT RELOC + TRZA CS,1 ;IT IS, SET THE FLAG + TLNE CS,-1 ;SKIP IF ITS A 18BIT VALUE, OTHERWISE + PUSHJ PP,ONC1 ;PRINT LH OF A 36 BIT VALUE IN CS + HRLO CS,LOCBLK ;PICK UP THE RIGHT HALF (18BIT VALUE) + TRZ CS,0(RC) ; + PUSHJ PP,ONC ;PRINT IT + JRST OUTL23 ;SKIP SINGLE QUOTE TEST + OUTL22: PUSHJ PP,ONC ;TAB TO RH AND PRINT IT + MOVEI C,"'" + SKIPE MODA + PUSHJ PP,OUTC +OUTL23: SKIPL STPX ;ANY BINARY? + PUSHJ PP,BOUT ;YES, DUMP IT + MOVE CS,@OUTLI2 ;[POINT 7,LBUF] +OUTL24: ILDB C,CS + JUMPE C,OUTL25 + CAIG C," " + JRST OUTL24 + MOVE CS,TABP + PUSHJ PP,OUTASC ;OUTPUT TABS +OUTL25: MOVEI CS,LBUF + PUSHJ PP,OUTAS0 ;DUMP THE LINE + TLNE IO,IOSALL ;SUPPRESSING ALL + JUMPN MRP,OUTL27 ;YES,EXTRA CR IF IN MACRO +OUTL26: SKIPGE STPX ;ANY BINARY? + JRST OUTLI ;NO, CLEAN UP AND EXIT + PUSHJ PP,OUTLI2 ;YES, INITIALIZE FOR NEXT LINE + PUSHJ PP,BOUT ;YES, DUMP IT +OUTL27: PUSHJ PP,OUTCR ;OUTPUT CARRIAGE RETURN + JRST OUTL26 ;TEST FOR MORE BINARY + +OUTPL: SKIPN LITLVL ;IF IN LITERAL + SKIPL STPX ;OR CODE GENERATED + JRST OUTIM ;JUST OUTPUT THE IMAGE + SKIPN ASGBLK ;SKIP IF AN ASSIGNMENT + JRST OUTIM ;OTHERWISE OUTPUT IMAGE + PUSH PP,C ;SAVE CHAR. + MOVEI C,CR + IDPB C,LBUFP + MOVEI C,LF + IDPB C,LBUFP ;FINISH WITH CRLF + PUSHJ PP,OUTLIN ;OUTPUT PARTIAL LINE + POP PP,C ;RESTORE CHAR. + JRST OUTLI2 ;INITIALISE REST OF LINE + OUTL30: AOS CS,STPX ;PASS ONE + ADDM CS,LOCO ;INCREMENT OUTPUT LOCATION + PUSHJ PP,STOWI ;INITIALIZE STOW + TLZ AC0,ERRORS-ERRM-ERRP-ERRV + JUMPN AC0,OUTL32 ;JUMP IF ERRORS + TLNE IO,IOSALL ;SUPPRESSING ALL/ + JUMPN MRP,CPOPJ ;YES,EXIT + JRST OUTLI1 ;NO,INIT LINE + +OUTL32: IDPB AC0,LBUFP ;ZERO TERNIMATOR + IOR ER,OUTSW ;LIST ERRORS + MOVEI CS,TAG + PUSHJ PP,OUTSIX ;OUTPUT TAG + HRRZ C,TAGINC + PUSHJ PP,DNC ;CONVERT INCREMENT TO DECIMAL + PUSHJ PP,OUTTAB ;OUTPUT TAB + PUSHJ PP,OUTLER ;OUTPUT ERROR FLAGS + PUSHJ PP,OUTTAB + MOVEI CS,SEQNO ;ADDRESS OF SEQUENCE NO. + SKIPE SEQNO ;FILE NOT SEQUENCED + PUSHJ PP,OUTAS0 ;OUTPUT IT + JRST OUTL25 ;OUTPUT BASIC LINE + +OUTLER: PUSH PP,ER ;SAVE LISTING SWITCHES FOR LATER + TRNE ER,TTYSW ;IF THIS IS ON, LISTING IS ON TTY + TRZ ER,ERRORS ;SO SUPPRESS ON TTY + TDZ ER,OUTSW ;BUT THIS SHOULD ONLY GO TO THE TTY + MOVE CS,INDIR ;GET FILE NAME + CAME CS,LSTFIL ;AND SEE IF SAME + JRST [MOVEM CS,LSTFIL ;SAVE AS LAST ONE + MOVEI CS,LSTFIL + PUSHJ PP,OUTSIX ;LIST NAME + MOVEI C," " + PUSHJ PP,OUTL + MOVE CS,PAGENO ;PRINT PAGE NUMBER TOO + JRST OUTLE8] + MOVE CS,PAGENO ;NOW CHECK PAGE NUMBER + CAME CS,LSTPGN +OUTLE8: JRST [MOVEM CS,LSTPGN + MOVEI CS,[ASCIZ /PAGE /] + PUSHJ PP,OUTAS0 + MOVE C,PAGENO + PUSHJ PP,DNC + PUSHJ PP,OUTCR ;AND NOW FOR THE ERROR LINE + JRST .+1] + HLLM ER,(PP) ;RESTORE ER BUT NOT IO (LEFT HALF OF AC) + POP PP,ER + MOVE CS,[POINT 7,[ASCII / QXADLRUVNOPEM/]] +OUTLE2: ILDB C,CS ;GET ERROR MNEMONIC + JUMPGE AC0,OUTLE4 ;BRANCH IF NOT FLAGGED + PUSHJ PP,OUTL ;OUTPUT THE CHARACTER + AOS ERRCNT ;INCREMENT ERROR COUNT +OUTLE4: LSH AC0,1 ;SHIFT NEXT FLAG INTO SIGN BIT + JUMPN AC0,OUTLE2 ;TEST FOR END + POPJ PP, ;EXIT + OUTIM1: TLOA FR,IOSCR ;SUPPRESS CRLF AFTER LINE +OUTIM: TLZ FR,IOSCR ;DON'T FOR PARTIAL LINE + TLNE IO,IOSALL ;SUPPRESSING ALL? + JUMPN MRP,CPOPJ ;YES ,EXIT IF IN MACRO + JUMP1 OUTLI1 ;BYPASS IF PASS ONE + PUSH PP,ER + TDZ ER,TYPERR + TLNN IO,IOMSTR!IOPROG!IOMAC + IOR ER,OUTSW + PUSH PP,C ;OUTPUT IMAGE + TLNN FR,CREFSW + PUSHJ PP,CLSCRF +OUTIM2: MOVE CS,TABP + PUSHJ PP,OUTASC ;OUTPUT TABS + IDPB C,LBUFP ;STORE ZERO TERMINATOR + MOVEI CS,LBUF + PUSHJ PP,OUTAS0 ;OUTPUT THE IMAGE + TLZN FR,IOSCR ;CRLF SUPPRESS? + PUSHJ PP,OUTCR ;NO,OUTPUT + POP PP,C + HLLM ER,0(PP) + POP PP,ER + JRST OUTLI2 + +OUTLI: TLNE IO,IOSALL ;SUPPRESSING ALL + JUMPN MRP,OUTLI3 ;YES,SET FLAG IN REPEATS ALSO + TLNE IO,IOPALL ;MACRO EXPANSION SUPRESS REQUESTED? + SKIPN MACLVL ;YES, ARE WE IN MACRO? + TLZA IO,IOMAC ;NO, CLEAR MAC FLAG +OUTLI3: TLO IO,IOMAC ;YES, SET FLAG + +OUTLI1: TRZ ER,ERRORS!LPTSW!TTYSW +OUTLI2: MOVE CS,[POINT 7,LBUF] ;INITIALIZE BUFFERS + MOVEM CS,LBUFP +IFN FORMSW, + MOVE CS,[POINT 7,TABI,6] + MOVEM CS,TABP + MOVEI CS,.CPL +IFN FORMSW, + MOVEM CS,CPL + MOVSI CS,(ASCII / /) + SKIPE SEQNO ;HAVE WE SEQUENCE NUMBERS? + MOVEM CS,SEQNO ;YES, STORE TAB IN CASE OF MACRO + MOVEM CS,SEQNO+1 ;STORE TAB AND TERMINATOR + SETZM ASGBLK + SETZM LOCBLK + POPJ PP, + OUTIML: TLNE IO,IOSALL ;SUPPRESSING ALL? + JUMPN MRP,CPOPJ ;YES,EXIT IF IN MACRO + TRNN ER,ERRORS-ERRQ ;FOR LITERALS (MULIT-LINE) OUTPUT ERRORS + TLNE FR,ERRQSW + TRZ ER,ERRQ + HRLZ CS,ER + JUMP1 OUTML1 ;CHECK PASS1 ERRORS + TDZ ER,TYPERR + JUMPE CS,OUTIM1 + PUSH PP,[0] ;ERRORS SHOULD BE ZEROED + PUSH PP,C + PUSH PP,AC0 ;SAVE AC0 IN CASE CALLED FROM ASCII + MOVE AC0,CS ;ERROR ROUTINE WANTS FLAGS IN AC0 + IOR ER,OUTSW + TLNN FR,CREFSW + PUSHJ PP,CLSCRF ;FIX CREF + TLZE AC0,ERRM + TLO AC0,ERRP + PUSHJ PP,OUTLER ;OUTPUT THEM + POP PP,AC0 + JRST OUTIM2 ;AND LINE + +OUTML1: TLZ CS,ERRORS-ERRM-ERRP-ERRV + JUMPE CS,OUTLI2 ;NONE + TRZ ER,ERRM!ERRP!ERRV + TRO ER,ERRL + PUSH PP,ER ;SAVE + PUSH PP,C ;SAVE THIS + PUSH PP,AC0 ;AS ABOVE + MOVE AC0,CS ;... + TDZ ER,TYPERR + IOR ER,OUTSW + MOVEI CS,TAG + PUSHJ PP,OUTSIX + HRRZ C,TAGINC + PUSHJ PP,DNC + PUSHJ PP,OUTTAB + PUSHJ PP,OUTLER ;DO NOT FORGET ERRORS + PUSHJ PP,OUTTAB + MOVEI CS,LBUF ;PRINT REST OF LINE + PUSHJ PP,SOUT20 + POP PP,AC0 + POP PP,C + POP PP,ER + JRST OUTLI2 + SUBTTL OUTPUT ROUTINES +UOUT: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN + TRNN ARG,PNTF ;WFW + TRNN ARG,UNDF + JRST UOUT13 ;TEST FOR UNDF!EXTF!PNTF ON PASS2 + JUMP2 UOUT10 + TLNN IO,IOIOPF ;ANY IOP'S SEEN + JRST UOUT12 ;NO,MAKE EXTERNAL + MOVSI CS,PRMTBL-PRMEND;YES LOOKUP IN TABLE +UOUT1: CAME AC0,PRMTBL(CS) ;HAVE WE A MATCH? + AOBJN CS,UOUT2 ;NO,INCREMENT AND JUMP + MOVE ARG,PRMTBL+1(CS);YES,GET VALUE + MOVEM ARG,(SX) ;UPDATE SYMBOL TABLE + POPJ PP, ;EXIT +UOUT2: AOBJN CS,UOUT1 ;TEST FOR END + +UOUT12: PUSHJ PP,EXTER2 ;MAKE IT EXTERNAL + MOVSI ARG,UNDF ;BUT PUT UNDF BACK ON + IORM ARG,(SX) ;SO MESSAGE WILL COME OUT + POPJ PP, ;GET NEXT SYMBOL + +UOUT13: JUMP1 CPOPJ ;RECYCLE ON PASS1 + TRC ARG,UNDF!EXTF!PNTF ;CHECK FOR ALL THREE ON + TRCE ARG,UNDF!EXTF!PNTF ;ARE THEY? + POPJ PP, ;NO, RECYCLE +UOUT10: PUSHJ PP,OUTCR + PUSHJ PP,OUTSYM ;OUTPUT THE SYMBOL + MOVEI CS,[SIXBIT /UNASSIGNED, DEFINED AS IF EXTERNAL @/] + JRST OUTSIX ;POPJ FOR NEXT SYMBOL + +UOUT30: PUSHJ PP,ONC1 ;OUTPUT THE LOCATION + JRST HIGHQ ;EXIT THROUGH HIGHQ + ;OUTPUT THE ENTRIES + +EOUT: MOVEI C,0 ;INITIALIZE THE COUNT + MOVE SX,SYMBOL + MOVE SDEL,0(SX) +EOUT1: SOJL SDEL,EOUT2 ;TEST FOR END + ADDI SX,2 + HLRZ ARG,0(SX) + ANDCAI ARG,SYMF!INTF!ENTF + JUMPN ARG,EOUT1 ;IF INVALID, DON'T COUNT + AOJA C,EOUT1 ;BUMP COUNT + +EOUT2: HRLI C,4 ;BLOCK TYPE 4 + PUSHJ PP,OUTBIN + SETZB C,ARG + PUSHJ PP,OUTBIN + MOVE SX,SYMBOL + MOVE SDEL,0(SX) + MOVEI V,^D18 + +EOUT3: SOJL SDEL,POPOUT + ADDI SX,2 + HLRZ C,0(SX) + ANDCAI C,SYMF!INTF!ENTF + JUMPN C,EOUT3 + SOJGE V,EOUT4 ;TEST END OF BLOCK + PUSHJ PP,OUTBIN + MOVEI V,^D17 ;WFW +EOUT4: MOVE AC0,-1(SX) + PUSHJ PP,SQOZE + MOVE C,AC0 + PUSHJ PP,OUTBIN + JRST EOUT3 + ;OUTPUT THE SYMBOLS + +SOUT: SKIPN IONSYM ;SKIP IF NOSYM SEEN + TRNN ER,LPTSW!TTYSW ;A LISTING REQUIRED? + JRST SOUT1 ;NO + MOVEI [ASCIZ /SYMBOL TABLE/] + HRRM SUBTTX ;SET NEW SUB-TITLE + PUSHJ PP,OUTFF ;FORCE NEW PAGE + MOVEI ARG,NCOLS ;SET UP FOR NCOLS ACROSS SYMBOL TABLE + TRNE ER,TTYSW ;IS TTY LISTING DEVICE? + MOVEI ARG,2 ;YES,ONLY 2 COLLUMNS + MOVEM ARG,NCOLLS ;STORE ANSWER + MOVEM ARG,SYMCNT + PUSHJ PP,LOUT1 ;OUTPUT THEM + MOVE ARG,SYMCNT ;SEE IF WE ENDED EVEN + CAME ARG,NCOLLS + PUSHJ PP,OUTCR ;NO, NEED CR + JRST SOUT1 ;NOW FOR BLOCK TYPE 2 + +LOUT1: PUSHJ PP,LLUKUP ;SET FOR TABLE SCAN + TRNN ARG,SYMF + TRNN ARG,MACF!SYNF + TDZA MRP,MRP ;SKIP AND CLEAR MRP + POPJ PP, ;NO, TRY AGAIN + TRNE ARG,INTF + MOVEI MRP,1 + TRNE ARG,EXTF + MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL + TRNE ARG,SYNF ;SYNONYM? + JUMPL MRP,POPOUT ;YES, DON'T OUTPUT IF EXTERNAL + TRNE ARG,SUPRBT ;IF SUPRESSED +; JUMPGE MRP,POPOUT ;DO NOT OUTPUT UNLESS EXTERNAL + POPJ PP, ;DO NOT OUTPUT + AOS (PP) ;SET FOR SKIP RETURN IF SYMBOL IS PRINTED + JUMPGE MRP,LOUT10 ;BRANCH IF NOT EXTERNAL + HLRZ RC,V ;PUT POINTER/FLAGS IN RC + TRNE RC,-2 ;POINTER? + MOVS RC,0(RC) ;YES + HLL V,RC ;STORE LEFT VALUE + +LOUT10: PUSH PP,RC ;SAVE FOR LATER + PUSHJ PP,OUTSYM ;OUTPUT THE NAME + MOVE RC,(PP) ;GET COPY + MOVEI AC1,0 + JUMPLE MRP,LOUT15 ;SET DEFFERRED BITS IF EXTERNAL + TLNE RC,-2 ;CHECK FOR LEFT FIXUP + IORI AC1,40 ;AND SET BITS + TRNE RC,-2 ;CHECK FOR RIGHT FIXUP + IORI AC1,20 ;AND SET BITS +LOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL + HRRZS RC + TRNE RC,-2 + HLLZS RC + TLZE RC,-1 + TRO RC,2 + HRL MRP,RC + MOVEI RC,0 + TRNE ARG,ENTF ;ENTRY DMN + HRRI MRP,-5 + TRNE ARG,NOOUTF ;SUPRESS OUTPUT? WFW + ADDI MRP,3 ;YES WFW + TRNE ARG,UNDF ;UNDEFINED IS EXTERNAL + HRRI MRP,2 ;SO FLAG AS UXT + IOR AC1,SOUTC(MRP) + MOVE ARG,AC1 + MOVEM AC0,SVSYM ;SAVE IT + MOVE AC0,V ;GET THE VALUE + HLRZ RC,MRP ;AND THE RELOCATION + HLLO CS,V + TRNE RC,2 ;LEFT HALF RELOCATABLE? + TRZA CS,1 ;NO, FLAG AND PRINT + TLNE CS,-1 ;IS THE LEFT HALF ZERO? + PUSHJ PP,ONC1 ;NO, OUTPUT IT +LOUT11: PUSHJ PP,OUTTAB +LOUT30: HRLO CS,V + TDZ CS,RC ;SET RELOCATION + PUSHJ PP,ONC1 + PUSHJ PP,OUTTAB + POP PP,RC ;GET BACK RELOC AND CHECK EXTERNAL +LOUT60: MOVEI CS,SOUTC(MRP) + PUSHJ PP,OUTAS0 ;EXT/INT + SOSLE SYMCNT ;SEE IF WE HAVE RUN OUT + JRST OUTTAB ;NOT YET, PRINT ONE TAB +LOUT64: MOVE CS,NCOLLS ;YES, RESET + MOVEM CS,SYMCNT + JRST OUTCR ;CARRIAGE RETURN AND TRY FOR ANOTHER + + + SYN IFBLK,SYMBLK ;SOMEWHERE TO STORE THE POINTERS + +LLUKUP: POP PP,LOOKX ;INTERCEPT RETURN POP + MOVE SX,SYMBOL + MOVE SDEL,(SX) + ADDI SX,2 ;SKIP COUNT OF SYMBOLS +LLUKP2: HRLI SX,-<.LPP-1> ;LENGTH OF PAGE + MOVE V,ARG ;COPY OF ARG + MOVEM SX,SYMBLK(V) ;STORE SYMBOL POINTER IN TABLE + ADDI SX,2*<.LPP-2> ;SYMBOLS PER PAGE + SOJG V,.-2 ;FOR ALL COLUMNS + MOVE V,SYMCNT + HRRZ SX,SYMBLK(V) + CAMGE SX,SYMTOP + SOJG V,.-2 + ADDI V,1 + MOVEM V,SYMBLK + JRST LLUKP7 ;ENTER LOOP + +LLUKP1: MOVEM SX,SYMBLK(ARG) ;SAVE IT + MOVE AC0,-1(SX) + PUSHJ PP,SRCH7 + HLRZS ARG + PUSHJ PP,@LOOKX + JRST [MOVE ARG,SYMCNT + MOVEM SX,SYMBLK(ARG) + JRST .+1] +LLUKP7: SOJL SDEL,POPOUT ;TEST FOR END +LLUKP3: MOVE ARG,SYMCNT ;GET PAGE POSITION + MOVE SX,SYMBLK(ARG) ;GET NEXT POINTER + AOBJP SX,LLUKP4 + HRRZ V,SX + CAMG V,SYMTOP + AOJA SX,LLUKP1 +LLUKP6: PUSHJ PP,LOUT64 ;RESET SYMCNT + JUMPE SDEL,POPOUT ;EXIT IF ALL DONE + JRST LLUKP3 + +LLUKP4: AOJ SX, + MOVEM SX,SYMBLK(ARG) + MOVE V,NCOLLS + SKIPGE SYMBLK(V) ;TEST IF ALL FINISHED + JRST LLUKP5 ;NO + SOJG V,.-2 ;KEEP GOING + MOVE SX,SYMBLK + MOVE SX,SYMBLK(SX) + HLRZ V,SX ;GET NUMBER ADVANCED + LSH V,1 ;2 WORDS PER SYMBOL + SUBI SX,2(V) ;BACK UP ONE SYMBOL + SKIPGE LPP ;IF PAGE FULL + JRST .+3 ;DON'T FINISH WITH EXTRA CR-LF + SETZM LPP ;ENSURE END OF PAGE + PUSHJ PP,LOUT64 + MOVE ARG,NCOLLS + MOVEM ARG,SYMCNT ;JUST IN CASE + JRST LLUKP2 + +LLUKP5: SOSG SYMCNT ;ON LAST COL? + JRST LLUKP6 + SKIPGE LPP ;IF PAGE FULL + JRST LLUKP3 ;NO MORE OUTPUT +REPEAT 2, ;NO, TAB OUT TO NEXT COLUMN + JRST LLUKP3 + SOUT1: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN + TRNN ARG,SYMF + TRNN ARG,MACF!SYNF + TDZA MRP,MRP ;SKIP AND CLEAR MRP + POPJ PP, ;NO, TRY AGAIN + TRNE ARG,INTF + MOVEI MRP,1 +IFN WFWSW, + TRNE ARG,EXTF + MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL + TRNE ARG,SYNF ;SYNONYM? + JUMPL MRP,POPOUT ;YES, DON'T OUTPUT IF EXTERNAL + TRNE ARG,SUPRBT ;IF SUPRESSED +; JUMPGE MRP,POPOUT ;DO NOT OUTPUT UNLESS EXTERNAL + POPJ PP, ;DO NOT OUTPUT + JUMPGE MRP,SOUT10 ;BRANCH IF NOT EXTERNAL + HLRZ RC,V ;PUT POINTER/FLAGS IN RC + TRNE RC,-2 ;POINTER? + MOVS RC,0(RC) ;YES + HLL V,RC ;STORE LEFT VALUE + +SOUT10: PUSH PP,RC ;SAVE FOR LATER + MOVEI AC1,0 + JUMPLE MRP,SOUT15 ;SET DEFFERRED BITS IF EXTERNAL + TLNE RC,-2 ;CHECK FOR LEFT FIXUP + IORI AC1,40 ;AND SET BITS + TRNE RC,-2 ;CHECK FOR RIGHT FIXUP + IORI AC1,20 ;AND SET BITS +IFN WFWSW, +SOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL + HRRZS RC + TRNE RC,-2 + HLLZS RC + TLZE RC,-1 + TRO RC,2 + HRL MRP,RC + MOVEI RC,0 + TRNE ARG,ENTF ;ENTRY DMN + HRRI MRP,-5 + TRNE ARG,NOOUTF ;SUPRESS OUTPUT? WFW + ADDI MRP,3 ;YES WFW + IOR AC1,SOUTC(MRP) + MOVE ARG,AC1 + PUSHJ PP,NOUT2 ;SQUOZE AND DUMP THE SYMBOL + MOVEM AC0,SVSYM ;SAVE IT + MOVE AC0,V ;GET THE VALUE + HLRZ RC,MRP ;AND THE RELOCATION + PUSHJ PP,COUT + POP PP,RC ;GET BACK RELOC AND CHECK EXTERNAL + TRNN RC,-2 ;IS IT? + JRST SOUT50 ;NO + MOVE AC0,1(RC) ;GET NAME +IFN WFWSW, + MOVEI ARG,60 ;EXTERNAL REQ + PUSHJ PP,SQOZE + HLLZS RC ;NO RELOC + PUSHJ PP,COUT ;OUTPUT IT + MOVE AC0,SVSYM ;GET SYMBOL NAME + TLO AC0,500000 ;SET AS ADDITIVE SYMBOL + TLZ AC0,200000 ;BUT NOT LEFT HALF ETC + PUSHJ PP,COUT +SOUT50: MOVSS RC ;CHECK LEFT HALF + TRNN RC,-2 + JRST SOUT60 + MOVE AC0,1(RC) +IFN WFWSW, + MOVEI ARG,60 + PUSHJ PP,SQOZE + MOVEI RC,0 + PUSHJ PP,COUT + MOVE AC0,SVSYM + TLO AC0,700000 + PUSHJ PP,COUT +SOUT60: POPJ PP, + +SOUT20: PUSHJ PP,OUTAS0 + JRST OUTCR + + !04 ;DMN + Z + Z + !44 ;SUPRESSED ENTRY + !60 +SOUTC: EXP 10 + !04 + !60 ;UNDEFINED EXTERNAL + !50 + !44 ;DMN + IFN WFWSW,< +INVRSF: MOVEI ARG,3 ;GET A BLOCK + ADDB ARG,FREE + CAML ARG,SYMBOL + PUSHJ PP,XCEEDS + MOVEM AC0,(ARG) ;SAVE WHICH HALF INFO + MOVE AC0,SVSYM ;GET SYMBOL NAME + TLZ AC0,740000 ;GET RID OF CODE BITS + MOVEM AC0,-1(ARG) ;SAVE IT + HLRZ AC0,(RC) ;SYMBOL TABLE FIXUP POINTER + MOVEM AC0,-2(ARG) ;LINK IN THIS BLOCK + SUBI ARG,2 ;POINT TO START OF BLOCK + HRLM ARG,(RC) + POPJ PP, + +SOUT1W: HLRZS V ;GET THE SYMBOL TABLE POINTER + MOVEI RC,3 ;SET UP A NEW BLOCK FOR THIS SYMBOL + ADDB RC,FREE + CAML RC,SYMBOL + PUSHJ PP,XCEEDS ;CHECK ON OUT OF ROOM + PUSH PP,ARG ;SAVE ARG AND ACO + PUSH PP,AC0 + MOVEI ARG,0 ;NO CODE BITS + PUSHJ PP,SQOZE ;CONVERT TO RAD50 + MOVEM AC0,-1(RC) ;SYMBOL NAME + POP PP,AC0 + POP PP,ARG ;RESTORE + HRRZM V,-2(RC) ;LINK TO NEXT BLOCK + MOVSI V,200000 ;FLAG AS SYMBOL TABLE FIXUP + MOVEM V,(RC) + HRRZ V,(SX) ;GET POINTER TO HEADER BLOCK + SUBI RC,2 ;POINT TO HEAD OF BLOCK + HRLM RC,(V) ;PUT IN LINK TO NEW BLOCK + MOVE RC,FIXLNK ;ADD SYMBOL TO CHAIN OF ONES TO DO + MOVEM SX,FIXLNK ;CHAIN THROUGH SYMBOL ENTRY + MOVEM RC,-1(SX) ;WHICH IS NO LONGER NEEDED + SETZB RC,V ;PUT OUT 0 FOR SYMBOL VALUE + JRST SOUT10> + ;OUTPUT THE BINARY + +BOUT: HRLO CS,LOCO ;PICKUP THE LOCATION + PUSHJ PP,ONC ;OUTPUT IT TO THE LISTING FILE + MOVEI C,"'" + SKIPE MODO ;IF MODE IS NOT ABSOLUTE + PUSHJ PP,OUTC ;PRINT A SINGLE QUOTE + PUSHJ PP,DSTOW ;GET THE CODE + PUSH PP,RC ;SAVE RELOC + PUSH PP,RC ;AND AGAIN +IFE WFWSW, +IFN WFWSW, + TRNN RC,-2 ;RIGHT EXT? + JRST BOUT30 ;NO +IFN WFWSW, +IFE WFWSW, + JRST BOUT30 ;PROCESS + + BOUT20: + HRRM AC1,-1(PP) ;FIX RC IN STACK SO NO CONFUSION WFW (AC1 HAS 0) + HRR AC0,0(RC) ;NO, SET ADDRESS LINK + MOVE AC1,LOCO ;GET CURRENT LOCATION + HRRM AC1,0(RC) ;SET NEW LINK + HLRZ AC1,0(RC) ;GET FLAGS/POINTER + TRNN AC1,-2 ;POINTER? + HRR AC1,RC ;NO, SET TO FLAGS + HLR RC,0(AC1) ;PUT FLAGS IN RC + HRL AC1,MODO ;GET CURRENT MODE + TRZE RC,-2 ;LEFT HALF RELOCATABLE+ + TLO AC1,2 ;YES, SET FLAG + HLLM AC1,0(AC1) ;STORE NEW FLAGS +BOUT30: HLLO CS,AC0 + TLZE RC,1 ;PACK RELOCATION BITS + TRO RC,2 + TRNE RC,2 ;LEFT HALF RELOCATABLE? + TRZ CS,1 ;YES, RESET BIT + PUSH PP,AC0 ;NEED AN AC + HLRZ AC0,-1(PP) ;AC0 = LEFT RELOCATION + CAILE AC0,1 ;EXTERNAL? + XORI CS,EXTF!1 ;YES, SET SWITCH + IFN FORMSW,< + OR AC0,HWFMT + JUMPN AC0,BOUT3H ;EDIT IN HALF WORD FORMAT IF NOT 0 + MOVE AC0,FORM ;GET FORM WORD + MOVEI C,0 ;ZERO FIELD SIZE +BOUT3A: JFFO AC0,BOUT3B ;AC1 = FIELD SIZE -1 + JRST BOUT3C ;NO FIELDS LEFT, JUMP +BOUT3B: LSH AC0,1(AC1) ;SHIFT OFF FORM FIELD + MOVEI AC1,6(AC1) + IDIVI AC1,3 ;AC1 = COLUMNS USED + 1 + ADDI C,(AC1) ;INCREMENT FIELD SIZE + CAIG C,^D23 ;IS FIELD SIZE GTR 23? + JRST BOUT3A ;NO. CONTINUE + MOVE AC1,HWFORM ;USE STANDARD FORM + MOVEM AC1,FORM + MOVEI C,^D13 ;SET FIELD SIZE TO 13 +BOUT3C: MOVEM C,FLDSIZ ;STORE FIELD SIZE + MOVE AC0,FORM ;AC0 = FORM WORD + TRNN RC,2 ;IS LEFT HALF RELOCATED? + CAMN AC0,HWFORM ;NO. IS FORM HALF WORD? + JRST BOUT3H ;YES. EDIT IN OLD WAY + CAMN AC0,IOFORM ;IS IT I/O WORD + SETOM IOSEEN ;YES,NEED MORE WORK + IBP TABP + CAIL C,^D16 + IBP TABP + ILDB C,TABP ;GET A TAB + PUSHJ PP,OUTL ;OUTPUT IT + MOVE AC2,(PP) ;AC2 = INFO TO BE EDITED + PUSH PP,CS ;SAVE CS = C+1 +BOUT3D: JFFO AC0,BOUT3E ;AC1 = FIELD LENGTH - 1 +BOUT3E: LSH AC0,1(AC1) ;SHIFT OFF FORM FIELD + MOVEI C,3(AC1) + MOVEI AC1,0 + LSHC AC1,-2(C) ;AC1 = FIELD INFO + IDIVI C,3 ;C = # OF OCTAL DIGITS + MOVE C+1,AC0 ;SAVE AC0 + SKIPE IOSEEN ;IS THIS A I/O INST. + PUSHJ PP,BOUT3J ;YES,SET FIELDS CORRECTLY + MOVNS C + ROT AC1,(C) + ROT AC1,(C) + ROT AC1,(C) + MOVNS C + BOUT3F: MOVEI AC0,6 ;EDIT A DIGIT + LSHC AC0,3 + EXCH AC0,C + PUSHJ PP,OUTC ;OUTPUT IT + MOVE C,AC0 + SOJG C,BOUT3F ;IF MORE DIGITS, GO BACK + JUMPE C+1,BOUT3G ;JUMP IF END OF WORD + MOVE AC0,C+1 ;RESTORE AC0 + MOVEI C," " + PUSHJ PP,OUTC ;OUTPUT A SPACE + JRST BOUT3D ;PROCESS NEXT FIELD + +BOUT3G: POP PP,CS ;RESTORE CS = C+1 + MOVEI C,0 + TRNE RC,1 ;RELOCATABLE? + MOVEI C,"'" ;YES + HRRZ AC0,-1(PP) ;AC0 = RIGHT RELOCATION + CAILE AC0,1 ;EXTERNAL? + MOVEI C,"*" ;YES + PUSHJ PP,ONC2 ;STORE POSSIBLE INDICATOR + POP PP,AC0 + JRST BOUT3I ;CONTINUE + +BOUT3H: MOVEI C,^D15 ;SET SIZE TO 15 + MOVEM C,FLDSIZ +> + POP PP,AC0 ;RESTORE + PUSHJ PP,ONC + HRLO CS,AC0 + TDZ CS,RC ;SET RELOCATION + HRRZ C,(PP) ;C = RIGHT RELOCATION + CAILE C,1 ;EXTERNAL + XORI CS,EXTF!1 ;YES, SET SWITCH + PUSHJ PP,ONC +BOUT3I: POP PP,CS ;GET RID OF ENTRY ON STACK + HRRZ CS,LOCO + TLNE FR,RIMSW!RIM1SW!R1BSW ;RIM OUTPUT? + JRST ROUT ;YES, GO PROCESS + + HRL CS,MODO + CAME CS,MODLOC ;SEQUENCE OR RELOCATION BREAK? + PUSHJ PP,COUTD ;YES, DUMP THE BUFFER + SKIPL COUTX ;NEW BUFFER? + JRST BOUT40 ;NO, STORE CODE AND EXIT + MOVEM CS,MODLOC ;YES, STORE NEW VALUES + EXCH AC0,LOCO + EXCH RC,MODO + PUSHJ PP,COUT ;STORE BLOCK LOCATION AND MODE + EXCH RC,MODO ;RESTORE CURRENT VALUES + EXCH AC0,LOCO + + BOUT40: PUSHJ PP,COUT ;EMIT CODE + POP PP,RC ;RETRIEVE EXTERNAL BITS + TRNN RC,-2 ;RIGHT EXTERNAL? + JRST BOUT50 ;TRY FOR LEFT + PUSHJ PP,COUTD + PUSH PP,BLKTYP ;TERMINATE TYPE AND SAVE + MOVEI AC0,2 ;BLOCK TYPE 2 + MOVEM AC0,BLKTYP + MOVE AC0,1(RC) ;GET SYMBOL + MOVEI ARG,60 ;CODE BITS + PUSHJ PP,SQOZE ;CONVERT TO RADIX 50 + HLLZS RC ;SYMBOL HAS NO RELOCATION + PUSHJ PP,COUT ;EMIT + MOVE AC0,LOCO ;GET CURRENT LOC + HRLI AC0,400000 ;ADDITIVE REQ + HRR RC,MODO ;CURRENT MODE + PUSHJ PP,COUT ;EMIT + MOVSS RC ;NOW FOR LEFT + TRNN RC,-2 + JRST BOUT60 + JRST BOUT70 +BOUT50: MOVSS RC ;CHECK OTHER HALF + TRNN RC,-2 ;LEFT HALF EXTERNAL? + JRST BOUT80 ;NO, FALSE ALARM + PUSHJ PP,COUTD ;CHANGE MODE + PUSH PP,BLKTYP + MOVEI AC0,2 + MOVEM AC0,BLKTYP +BOUT70: MOVE AC0,1(RC) + MOVEI ARG,60 + PUSHJ PP,SQOZE + HLLZS RC + PUSHJ PP,COUT + MOVE AC0,LOCO + HRLI AC0,600000 ;LEFT HALF ADD + HRR RC,MODO + PUSHJ PP,COUT ;EMIT +BOUT60: PUSHJ PP,COUTD ;CHANGE MODE + POP PP,BLKTYP ;TO OLD ONE +BOUT80: AOS LOCO + AOS MODLOC + POPJ PP, + IFN WFWSW,< +INCSC1: HLRZ RC,(AC1) ;GET OFFSET OF NEXT BLOCK + CAMN RC,AC0 ;IS IT THE SAME?? + POPJ PP, ;YES, RETURN AC1 POINTS TO BLOCK +INCSRC: MOVE RC,AC1 ;CURRENT POINTER + HRRZ AC1,(AC1) ;IN CASE THIS COMES UP 0 + JUMPN AC1,INCSC1 ;SINCE 0 IS END OF CHAIN. ANY MORE?? + MOVEI AC1,3 ;NO, GET A NEW BLOCK + ADDB AC1,FREE + CAML AC1,SYMBOL + PUSHJ PP,XCEED + SUBI AC1,2 ;WE MUST BE POINTING RIGHT WHEN WE GET OUT + HRRM AC1,(RC) ;INSERT WHERE END OF CHAIN WAS + HRLZM AC0,(AC1) ;SET OFFSET AND END OF CHAIN + SETZM 1(AC1) + SETZM 2(AC1) ;NO LEFT OR RIGHT HALF FIXUPS + POPJ PP, ;DONE + +LVLINK: MOVE RC,LOCO ;GET CURRENT LOCATION + HRL RC,MODO ;AND MODE + EXCH RC,1(AC1) ;PUT IN AND GET PLACE TO LINK TO + POPJ PP,> + +IFN FORMSW,< +BOUT3J: MOVSS IOSEEN ;SWAP + SKIPGE IOSEEN ;SKIP IF NOT FIRST FIELD + JRST [HLLZS IOSEEN ;CLEAR RIGHT HALF + POPJ PP,] ;AND RETURN + MOVSS IOSEEN ;SWAP BACK + LSH AC1,2 ;CORRECT MNEMONIC AND OP CODE + CAIE C,1 ;IS IT OP CODE? + POPJ PP, ;NO,JUST RETURN + MOVEI C,2 ;TWO CHAR. WIDE NOW + SETZM IOSEEN ;DON'T COME AGAIN + POPJ PP, ;RETURN +> + NOUT: MOVE V,[POINT 7,TBUF] ;POINTER TO ASCII LINE + MOVSI CS,(POINT 6,AC0) ;POINTER TO SIXBIT AC0 + SETZB ARG,AC0 +NOUT1: ILDB C,V ;GET ASCII + CAIL C,"A"+40 + CAILE C,"Z"+40 + JRST .+2 + TRZA C,100 ;LOWER CASE TO SIXBIT + SUBI C,40 ;CONVERT TO SIXBIT + JUMPLE C,NOUT3 ;TEST FORM NON-SIXBIT + CAILE C,77 ;AND NOT GREATER THAN SIXBIT + JRST NOUT3 ;... + IDPB C,CS ;DEPOSIT IN AC0 + TLNE CS,770000 ;TEST FOR SIX CHARACTERS + JRST NOUT1 ;NO, GET ANOTHER +NOUT3: SKIPGE UNIVSN ;IF A UNIVERSAL PROG + POPJ PP, ;RETURN TO PUT IT IN THE TABLE + +IFN CCLSW,< TLNN IO,IOTLSN ;AND IF WE HAVE NOT SEEN A TITLE + PUSHJ PP,PRNAM ;THEN PRINT THE NAME> +NOUT2: PUSHJ PP,SQOZE ;CONVERT TO SIXBIT + JRST COUT ;DUMP AND EXIT + +HOUT: + MOVEI RC,1 ;RELOCATABLE +IFN RENTSW,< + MOVE AC0,HHIGH ;GET HIGH SEG IF TWO SEGMENTS + JUMPE AC0,.+2 ;NOT TWO SEGMENTS + PUSHJ PP,COUT ;OUTPUT IT > + MOVE AC0,HIGH +IFN RENTSW,< + SKIPE HHIGH ;ANY TWOSEG HIGH STUFF + JRST COUT ;YES,SO NO ABS.> + PUSHJ PP,COUT ;OUTPUT THE HIGHEST LOCATION + MOVE AC0,ABSHI + ;PUT OUT ABS PORTION OF PROGRAM BREAK + SOJA RC,COUT ;OUTPUT A WORD OF ZERO AND EXIT + + IFN RENTSW,< +HSOUT: SETZM HISNSW ;CLEAR FOR PASS2 + MOVE AC0,SVTYP3 ;GET HISEG ARG + JUMPGE AC0,.+4 ;JUMP IF ONLY HISEG + HRL AC0,HIGH1 ;GET BREAK FROM PASS 1 + JUMPL AC0,.+2 ;OK IF GREATER THAN 400000 + HRLS AC0 ;SIGNAL TWO SEGMENT TO LOADER + MOVEI RC,1 ;ASSUME RELOCATABLE + JRST COUT ;OUTPUT THE WORD> + +VOUT: SKIPN RC,VECREL ;IS VECTOR ABSOLUTE ZERO? + SKIPE VECTOR ;ALSO CHECK RELOCATION + JRST .+2 + POPJ PP, ;YES, EXIT + MOVE AC0,VECTOR ;AC0 SHOULD BE FLAGS + +COUT: AOS C,COUTX ;INCREMENT INDEX + MOVEM AC0,COUTDB(C) ;STORE CODE + IDPB RC,COUTP ;STORE RELOCATION BITS + CAIE C,^D17 ;IS THE BUFFER FULL? + POPJ PP, ;NO, EXIT + +COUTD: AOSG C,COUTX ;DUMP THE BUFFER + JRST COUTI ;BUFFER WAS EMPTY + HRL C,BLKTYP ;SET BLOCK TYPE + PUSHJ PP,OUTBIN ;OUTPUT COUNT AND TYPE + SETOB C,COUTY ;INITIALIZE INDEX + +COUTD2: MOVE C,COUTDB(C) ;GET RELOCATION BITS/CODE + PUSHJ PP,OUTBIN ;DUMP IT + AOS C,COUTY ;INCREMENT INDEX + CAMGE C,COUTX ;TEST FOR END + JRST COUTD2 ;NO, GET NEXT WORD + +COUTI: SETOM COUTX ;INITIALIZE BUFFER INDEX + SETZM COUTRB ;ZERO RELOCATION BITS + MOVE C,[POINT 2,COUTRB] + MOVEM C,COUTP ;INITIALIZE BIT POINTER + POPJ PP, ;EXIT + STOWZ1: +IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM> +STOWZ: MOVEI RC,0 +STOW: +IFN FORMSW,< MOVEM AC1,FORM ;STORE FORM WORD> + JUMP1 STOW20 ;SKIP TEST IF PASS ONE + TRNE RC,-2 ;RIGHT HALF ZERO OR 1? + PUSHJ PP,STOWT ;NO, HANDLE EXTERNAL + TLNN RC,-2 ;LEFT HALF ZERO OR 1? WFW + JRST STOW10 ;YES, SKIP TEST + MOVSS RC ;SWAP HALVES + PUSHJ PP,STOWT1 ;HANDLE EXTERNAL WFW + MOVSS RC ;RESTORE VALUES + +STOW10: SKIPE EXTPNT ;ANY EXTERNALS REMAINING? + TRO ER,ERRE ;YES, SET EXTERNAL ERROR FLAG + +STOW20: AOS AC1,STPX ;INCREMENT POINTER + MOVEM AC0,STCODE(AC1) ;STOW CODE + MOVEM RC,STOWRC(AC1) ;STOW RELOCATION BITS +IFN FORMSW,< + PUSH PP,FORM + POP PP,STFORM(AC1) ;STORE FORM WORD +> + SKIPN LITLVL ;ARE WE IN LITERAL? + AOS LOCA ;NO, INCREMENT ASSEMBLY LOCATION + CAIGE AC1,.STP-1 ;OVERFLOW? + POPJ PP, ;NO, EXIT + + SKIPE LITLVL ;ARE WE IN A LITERAL? + TROA ER,ERRL ;YES, FLAG ERROR BUT DON'T DUMP + JRST CHARL1 ;NO, SAVE REGISTERS AND DUMP THE BUFFER + JRST STOWI ;INITIALIZE BUFFER + +DSTOW: AOS AC1,STPY ;INCREMENT POINTER + MOVE AC0,STCODE(AC1) ;FETCH CODE + MOVE RC,STOWRC(AC1) ;FETCH RELOCATION BITS +IFN FORMSW,< + PUSH PP,STFORM(AC1) + POP PP,FORM ;GET FORM WORD +> + CAMGE AC1,STPX ;IS THIS THE END? + POPJ PP, ;NO, EXIT + +STOWI: SETOM STPX ;INITIALIZE FOR INPUT + SETOM STPY ;INITIALIZE FOR OUTPUT + SETZM EXTPNT + POPJ PP, ;EXIT + SVSTOW: AOS LITLVL ;NESTED LITERALS + PUSH PP,STPX ;MAKE ROOM FOR ANOTHER + PUSH PP,STPY + MOVE AC1,STPX + MOVEM AC1,STPY + JRST 0(AC2) + +GTSTOW: POP PP,STPY ;BACK UP A LEVEL + POP PP,STPX + SOS LITLVL + JRST 0(AC2) + + ;EXTERNAL RIGHT +STOWT: HRRZ AC1,EXTPNT ;GET RIGHT POINTER + CAIE AC1,(RC) ;DOES IT MATCH + PUSHJ PP,QEXT ;EXTERNAL OR RELOCATION ERROR + HLLZS EXTPNT + POPJ PP, ;EXIT + + ;EXTERNAL LEFT +STOWT1: HLRZ AC1,EXTPNT ;GET LEFT HALF + CAIE AC1,(RC) ;SEE ABOVE + PUSHJ PP,QEXT + HRRZS EXTPNT + POPJ PP, ;EXIT + ONC: ILDB C,TABP ;ENTRY TO ADVANCE TAB POINTER + PUSHJ PP,OUTL ;OUTPUT A TAB + ;OUTPUT 6 OCT NUMBERS FROM CS LEFT +ONC1: MOVEI C,6 ;CONVERT TO ASCII + LSHC C,3 ;SHIFT IN OCTAL + PUSHJ PP,OUTL ;OUTPUT ASCII FROM C + TRNE CS,-1 ;ARE WE THROUGH? + JRST ONC1 ;NO, GET ANOTHER + MOVEI C,0 ;CLEAR C + TLNN CS,1 ;RELOCATABLE? + MOVEI C,"'" ;YES + TLNN CS,EXTF ;OR EXTERNAL + MOVEI C,"*" ;YES +ONC2: JUMPN C,OUTC ;OUTPUT IF EXTERN OR RELOCATABLE +IFN FORMSW,< SOS FLDSIZ ;DECREMENT FIELD SIZE> + POPJ PP, ;EXIT + +DNC: IDIVI C,^D10 + HRLM CS,0(PP) + JUMPE C,.+2 + PUSHJ PP,DNC ;RECURSE IF NON-ZERO + HLRZ C,0(PP) + ADDI C,"0" ;FORM ASCII + JRST PRINT ;DUMP AND TEST FOR END + +OUTAS0: HRLI CS,(POINT 7,,) ;ENTRY TO SET POINTER +OUTASC: ILDB C,CS ;GET NEXT BYTE + JUMPE C,POPOUT ;EXIT ON ZERO DELIMITER + PUSHJ PP,PRINT + JRST OUTASC + +OUTSIX: HRLI CS,(POINT 6,,) ;OUTPUT SIXBIT + ILDB C,CS ;GET SIXBIT + CAIN C,40 ;"@" DELIMITER? + POPJ PP, ;YES, EXIT + ADDI C,40 ;NO, FORM ASCII + PUSHJ PP,OUTL ;OUTPUT ASCII CHAR FROM C + JRST OUTSIX+1 + +OUTSYM: MOVE CS,AC0 ;PLACE NAME IN CS +OUTSY1: MOVEI C,0 ;CLEAR C + LSHC C,6 ;MOVE NEXT SIXBIT CHARACTER IN + JUMPE C,OUTTAB ;TEST FOR END + ADDI C,40 ;CONVERT TO ASCII + PUSHJ PP,OUTL ;OUTPUT + JRST OUTSY1 ;LOOP + OUTSET: AOS SX,0(PP) ;GET RETURN LOCATION + MOVE SX,-1(SX) ;GET XWD CODE + HLRM SX,BLKTYP ;SET BLOCK TYPE + SETZB ARG,RC + PUSHJ PP,0(SX) ;GO TO PRESCRIBED ROUTINE + JRST COUTD ;TERMINATE BLOCK AND EXIT + + ;LOOKUP SCANS ALL THE SYMBOLS IN THE SYMBOL TABLE + +LOOKUP: POP PP,LOOKX ;INTERCEPT RETURN POP + MOVE SX,SYMBOL + MOVE SDEL,0(SX) ;SET FOR TABLE SCAN +LOOKL: SOJL SDEL,POPOUT ;TEST FOR END + ADDI SX,2 + MOVE AC0,-1(SX) + PUSHJ PP,SRCH7 ;LOAD REGISTERS + HLRZS ARG + PUSHJ PP,@LOOKX ;RETURN TO CALLING ROUTINE + JRST LOOKL ;TRY AGAIN + END0: PUSHJ PP,EVALCM ;GET A WORD + SKIPE EXTPNT ;ANY EXTERNALS? + TRO ER,ERRE ;YES, ERROR + SKIPN V,AC0 ;NON-ZERO? + JUMPE RC,.+2 ;OR RELOC? + PUSHJ PP,ASSIG7 ;YES, LIST THE VALUE + MOVEM AC0,VECTOR + MOVEM RC,VECREL + PUSHJ PP,VARA ;FILL OUT SELF-DEFINED VARIABLES + PUSHJ PP,STOUTS ;DUMP THE LINE + PUSH PP,IO ;SAVE FLAGS + TLO IO,IOPROG ;XLIST LITS + PUSHJ PP,LIT1 + POP PP,IO ;GET FLAG BACK + JUMP2 ENDP2 + + PUSHJ PP,UOUT + TLNN IO,MFLSW ;SKIP IF ONLY PSEND + PUSHJ PP,REC2 + MOVE INDIR ;SET UP FIRST AS LAST + MOVEM LSTFIL ;PRINTED + SETZM LSTPGN + PUSHJ PP,INZ + TLNE IO,MFLSW ;IF PSEND + POPJ PP, ;BACK TO PSEND0 + SKIPE PRGPTR ;HAVE ANY PRGEND'S BEEN SEEN + JRST PSEND3 ;YES,GO SET UP AGAIN + +PASS20: SETZM CTLSAV + PUSHJ PP,COUTI + PUSHJ PP,EOUT ;OUTPUT THE ENTRIES + PUSHJ PP,OUTSET + XWD 6,NOUT ;OUTPUT THE NAME (BLKTYP-6) +IFN RENTSW,< + SKIPN HISNSW ;PUT OUT BLOCK TYPE 3? + JRST PASS21 ;NO + PUSHJ PP,OUTSET + XWD 3,HSOUT ;OUTPUT THE HISEG BLOCK +PASS21: > + MOVEI 1 + HRRM BLKTYP ;SET FOR TYPE 1 BLOCK + TLZ FR,P1 ;SET FOR PASS 2 AND TURN OFF FLAG + TLO IO,IOPALL ;PUT THESE BACK + TLZ IO,IOPROG!IOCREF!DEFCRS ;SO LISTINGS WILL BE THE WAY THEY SHOULD + TLNN FR,R1BSW + JRST STOWI + + MOVE CS,[XWD $ST-1-$CKSM,R1BLDR] + MOVE C,0(CS) + PUSHJ PP,PTPBIN + AOBJN CS,.-2 + PUSHJ PP,R1BI + JRST STOWI + +R1BLDR: + PHASE 0 + IOWD $ADR,$ST +$ST: CONO PTR,60 + HRRI $A,$RD+1 +$RD: CONSO PTR,10 + JRST .-1 + DATAI PTR,@$TBL1-$RD+1($A) + XCT $TBL1-$RD+1($A) + XCT $TBL2-$RD+1($A) +$A: SOJA $A, +$TBL1: CAME $CKSM,$ADR + ADD $CKSM,1($ADR) + SKIPL $CKSM,$ADR +$TBL2: JRST 4,$ST + AOBJN $ADR,$RD +$ADR: JRST $ST+1 +$CKSM: + DEPHASE + +IF2,< PURGE $ST,$RD,$A,$TBL1,$TBL2,$ADR,$CKSM> + ENDP2: PUSHJ PP,COUTD ;DUMP THE BUFFER + MOVE AC0,LOCO ;CHECK TO SEE IF LIT DIFFERED + SKIPN MODO ;AND USE SMALLER SINCE AT END + JRST [CAMN AC0,ABSHI + HRRZM AC2,ABSHI + JRST ENDP2W] +IFN RENTSW, + CAMN AC0,HIGH + HRRZM AC2,HIGH +ENDP2W: +REPEAT 1, +REPEAT 0, ;NEEDS FIX TO CREF + PUSHJ PP,CLSCR2 ;CLOSE IT UP +ENDP2Q: HRR ER,OUTSW ;SET OUTPUT SWITCH + SKIPN TYPERR + TRO ER,TTYSW + PUSHJ PP,UOUT ;OUTPUT UNDEFINEDS + TRO ER,TTYSW + SKPINC C ;SEE IF WE CAN INPUT A CHAR. + JFCL ;BUT ONLY TO DEFEAT ^O + SKIPG C,ERRCNT ;GET ERROR COUNT AND CHECK FOR POSITIVE + JRST NOERW ;PRINT NO ERROR MESSAGE +IFN CCLSW, + PUSHJ PP,OUTCR + MOVE C,ERRCNT + CAIN C,1 ;1 IS A SPECIAL CASE + JRST ONERW ;PRINT MESSAGE + MOVEI C,"?" ;? FOR BATCH + PUSHJ PP,OUTL ;... + MOVE C,ERRCNT ;PRINT NUMBER OF ERRORS + PUSHJ PP,DNC + SKIPA CS,[EXP ERRMS1] ;LOAD TO PRINT +ONERW: MOVEI CS,ERRMS2 ;ONE ERROR DETECTED +ONERW1: PUSHJ PP,OUTSIX ;PRINT + JRST ENDP2A +NOERW: MOVEI CS,ERRMS3 +IFN CCLSW, +IFE CCLSW, + TRZ ER,TTYSW ;NO TTY OUTPUT + IOR ER,OUTSW ;UNLESS NEEDED FOR LISTING + PUSHJ PP,OUTCR + JRST ONERW1 + + ENDP2A: PUSHJ PP,OUTCR + TLNN IO,MFLSW ;IN A MULTI-PROG FILE? + JRST ENDP2D ;NO + SKIPE ERRCNT ;ANY ERROR? + PUSHJ PP,[MOVEI CS,[ASCIZ /PROGRAM /] + PUSHJ PP,OUTAS0 ;YES,SO PRINT MESSAGE + MOVEI CS,TBUF ;AND TITLE + PUSHJ PP,OUTAS0 ;FOR IDENTIFICATION + JRST OUTCR] ;AND A CR-LF + TRZA ER,TTYSW ;NO MORE OUTPUT NOW +ENDP2D: +IFN CCLSW, +IFE CCLSW,< SKIPA ;SO PRGEND CODE CAN WORK> + IOR ER,OUTSW ;... + PUSHJ PP,OUTCR +IFN RENTSW,< + MOVEI CS,[SIXBIT /HI-SEG. BREAK IS @/] + SKIPN HHIGH ;DON'T PRINT IF ZERO + JRST ENDP2C ;IT WAS + PUSHJ PP,OUTSIX + HRLO CS,HHIGH ;GET THE BREAK + PUSHJ PP,ONC1 + PUSHJ PP,OUTCR +ENDP2C:> + MOVEI CS,[SIXBIT /PROGRAM BREAK IS @/] + PUSHJ PP,OUTSIX ;OUTPUT PROGRAM BREAK + HRRZ CS,ABSHI ;GET ABS. BREAK + CAIG CS,140 ;ANY ABS. CODE + JRST [HRLO CS,HIGH ;NO + JRST ENDP2B] ;SO DON'T PRINT + HRLO CS,HIGH ;GET PROGRAM BREAK + PUSHJ PP,ONC1 + PUSHJ PP,OUTCR + MOVEI CS,[SIXBIT /ABSLUTE BREAK IS @/] + PUSHJ PP,OUTSIX + HRLO CS,ABSHI +ENDP2B: PUSHJ PP,ONC1 + PUSHJ PP,OUTCR + TLNE FR,RIMSW!R1BSW ;RIM MODE? + PUSHJ PP,RIMFIN ;YES, FINISH IT +IFN CCLSW, +IFE CCLSW, + TRO ER,TTYSW ;PRINT SIZE + PUSHJ PP,OUTCR + MOVE C,JOBREL + LSH C,-^D10 + ADDI C,1 + PUSHJ PP,DNC + MOVEI CS,[SIXBIT /K CORE USED@/] + PUSHJ PP,OUTSIX + PUSHJ PP,OUTCR + HRR ER,OUTSW + PUSHJ PP,OUTSET + XWD 2,SOUT ;OUTPUT THE SYMBOLS (BLKTYP-2) + PUSHJ PP,OUTSET + XWD 7,VOUT ;OUTPUT TRANSFER VECTOR (..-7) +IFN WFWSW, + PUSHJ PP,OUTSET + XWD 5,HOUT ;OUTPUT HIGHEST RELOCATABLE (..-5) + PUSHJ PP,COUTD + TLNN IO,MFLSW ;IS IT PRGEND? + JRST FINIS ;ALAS, FINISHED + MOVEI CS,SBUF ;RESET SBUF POINTER + HRRM CS,SUBTTX ;TO SUBTTL + SETZM PASS2I ;CLEAR PASS2 VARIABLES + MOVE [XWD PASS2I,PASS2I+1] + BLT PASS2Z-1 ;BUT NOT ALL OF VARIABLES + JRST INZ ;RE-INITIALIZE FOR NEXT PROG + IFN WFWSW,< +OUTB12: SKIPN ARG,FIXLNK ;WERE THERE ANY?? + POPJ PP, ;JUST GO AWAY +OUTB19: HRRZ SX,(ARG) ;POINTER TO HEADER BLOCK NOW IN SX + HRRZ AC1,(SX) ;NOW AC1 HAS POINTER TO CODE FIXUPS + JUMPE AC1,OUTB13 ;NONE THERE +OUTB16: HLRZ AC0,(AC1) ;GET LOCATION OFFSET + ADD AC0,2(SX) ;ADD BASE LOCATION + SKIPN 1(AC1) ;AND RIGHT HALF?? + JRST OUTB14 ;NO + PUSH PP,AC0 ;SAVE FIXUP VALUE + SETZB AC0,RC + PUSHJ PP,OUTBWD ;OUTPUT A Z (SAYS RIGHT HALF CODE) + POP PP,AC0 ;GET VALUE BACK + HLRZ RC,1(AC1) ;GET RELOC OF FIXUP CHAIN + LSH RC,1 ;GOES IN LEFT HALF + HRL AC0,1(AC1) ;LOCATION OF CHAIN + PUSHJ PP,OUTBWD ;LEFT HALF LOCATION, RIGHT HALF VALUE +OUTB14: SKIPN 2(AC1) ;ANY LEFT HALF?? + JRST OUTB15 ;NO, GO LOOK FOR NEXT BLOCK + PUSH PP,AC0 ;SAVE VALUE + MOVEI RC,0 + MOVSI AC0,400000 ;INDICATE LEFT HALF + PUSHJ PP,OUTBWD + POP PP,AC0 + HLRZ RC,2(AC1) ;GET RELOC FOR LEFT HALF + LSH RC,1 + HRL AC0,2(AC1) + PUSHJ PP,OUTBWD +OUTB15: HRRZ AC1,(AC1) ;NEXT LINK IN CHAIN + JUMPN AC1,OUTB16 ;IF NOT END, PROCESS +OUTB13: HLRZ AC1,(SX) ;POINTER TO SYMBOL TABLE FIXUP CHAIN + JUMPE AC1,OUTB17 ;CHACK FOR SOME THERE +OUTB18: MOVE AC0,2(AC1) ;FLAGS + HRR AC0,2(SX) ;VALUE IN RH + MOVEI RC,0 ;NO RELCO ON IT + PUSHJ PP,OUTBWD + MOVE AC0,1(AC1) ;THE SYMBOL NAME + PUSHJ PP,OUTBWD + HRRZ AC1,(AC1) ;FOOLOW CHAIN + JUMPN AC1,OUTB18 +OUTB17: HRRZ ARG,-1(ARG) ;DONE WITH THIS SYMBOL GET NEXT + JUMPN ARG,OUTB19 + POPJ PP, ;ALL DONE + +OUTBWD: SKIPL COUTX ;IF WE ARE AT THE START + JRST COUT ;NO PUT OUT + PUSH PP,AC0 ;WE NEED TO PUT NEW RELOC AND VAR LENGTH + PUSH PP,RC ;AS FIRST TWO WORDS + MOVE AC0,HIGH + MOVEI RC,1 ;IT IS RELOC + PUSHJ PP,COUT + MOVE AC0,LVARLC ;THE LENGTH + MOVEI RC,0 + PUSHJ PP,COUT + POP PP,RC + POP PP,AC0 + JRST COUT ;NOW PUT OUT THE ONE WE WANTED TO +> + +RIMFIN: TLNE FR,R1BSW + PUSHJ PP,R1BDMP + SKIPN C,VECTOR + MOVSI C,(JRST 4,) + TLNN C,777000 + TLO C,(JRST) + PUSHJ PP,PTPBIN + MOVEI C,0 + JRST PTPBIN + SUBTTL PASS INITIALIZE +INZ: AOS MODA + AOS MODO + SETZM SEQNO + SETZM TAG + HRRI RX,^D8 + MOVEI VARHD + MOVEM VARHDX + MOVEI LITHD + MOVEM LITHDX + PUSHJ PP,LITI + PUSHJ PP,STOWI +IFN FORMSW,< + HRRES HWFMT ;SET DEFAULT VALUE BACK> + JRST OUTLI + +RCPNTR: POINT 1,ARG,^L-18 ;POINT 1,ARG,22 + SUBTTL PSEUDO-OP HANDLERS + +TAPE0: PUSHJ PP,STOUTS ;FINISH THIS LINE + JRST GOTEND ;AND IGNORE THE REST OF THIS FILE + +RADIX0: PUSHJ PP,EVAL10 ;EVALUATE RADIX D10 + CAIG AC0,^D10 ;IF GREATER THAN 10 + CAIG AC0,1 ;OR LESS THAN 2, +ERRAX: TROA ER,ERRA ;FLAG ERROR AND SKIP + HRR RX,AC0 ;SET NEW RADIX + POPJ PP, + + +XALL0: TLZ IO,IOSALL ;TURN OFF MACRO SUPPRESS ALL +IOSET: JUMP1 POPOUT ;NOSYM (IONSYM), XALL (IOPALL), XLIST (IOPROG) + HLRZ SX,AC0 ;STORE FLAGS + PUSHJ PP,STOUTS ;POLISH OFF LINE + TLO IO,0(SX) ;NOW SUPRESS PRINTING + POPJ PP, + +IORSET: TDZ IO,AC0 ;RESET FLAG IOPALL/IOPROG + TLNE AC0,IONCRF ;RESTORING CREFFING? + TLZ IO,DEFCRS ;YES, CLEAR ANY WAITING DEFINING OCCURENCES + POPJ PP, + +BLOCK0: PUSHJ PP,HIGHQ + PUSHJ PP,EVALEX ;EVALUATE + TRZE RC,-1 ;EXTERNAL OR RELOCATABLE? + PUSHJ PP,QEXT ;YES, DETERMINE TYPE + ADDM AC0,LOCO ;UPDATE ASSEMBLY LOCATION +BLOCK1: EXCH AC0,LOCA ;SAVE START OF BLOCK + ADDM AC0,LOCA ;UPDATE OUTPUT LOCATION +BLOCK2: HRLOM AC0,LOCBLK + JUMP2 POPOUT + TRNE ER,ERRU + TRO ER,ERRV + POPJ PP, + +PRNTX0: TRO ER,TTYSW ;SET OUTPUT TO TTY + JUMP2 PRNTX2 ;PASS1? + TDOA ER,OUTSW ;YES,OUTPUT TO LSTDEV ALSO +PRNTX2: ANDCM ER,OUTSW ;NO,DON'T OUTPUT TO TTY IF IT IS LSTDEV + PUSHJ PP,BYPASS ;GET FIRST CHAR. + TLOA IO,IORPTC ;REPEAT IT AND SKIP +PRNTX4: PUSHJ PP,PRINT ;PRINT THE CHAR. + PUSHJ PP,CHARAC ;GET ASCII CHAR. + CAIG C,CR ;IF GREATER THAN CR + CAIG C,HT ;OR LESS THAN LF + JRST PRNTX4 ;THEN CONTINUE + PUSHJ PP,OUTCR ;OUTPUT A CRLF + TRZA ER,TTYSW!LPTSW ;TURN OF OUTPUT +CPOPJ1: AOS (PP) ;USEFUL TAG HAS TO GO SOMEWHERE +CPOPJ: POPJ PP, ;EXIT + +REMAR0: PUSHJ PP,GETCHR ;GET A CHARACTER + CAIE C,EOL + JRST REMAR0 + POPJ PP, ;EXIT + LIT0: PUSHJ PP,BLOCK1 + PUSHJ PP,STOUTS +LIT1: JUMP2 LIT20 + +;ON PASS ONE, WE JUST STEP THE LOCATION COUNTER AND CLEAR + + MOVE AC0,LITCNT + MOVE SX,LITHDX + HRLM AC0,0(SX) + MOVE V,LOCA + HRL V,MODA + MOVEM V,-1(SX) + JRST LIT24 + +LIT20: PUSH PP,LOCA + PUSH PP,LOCO + SKIPN LITNUM + JRST LIT20A + MOVE SX,LITHDX + HRRZ AC0,-1(SX) + CAME AC0,LOCA + TRO ER,ERRP +LIT20A: MOVE SX,LITAB +LIT21: SOSGE LITNUM + JRST LIT22 +IFN FORMSW,< + MOVE AC0,-3(SX) + MOVEM AC0,FORM +> + MOVE AC0,-2(SX) ;WFW + MOVE RC,-1(SX) ;WFW + MOVE SX,(SX) ;WFW POINTER TO THE NEXT LIT + PUSHJ PP,STOW20 ;STOW CODE + MOVEI C,12 ;SET LINE FEED + IDPB C,LBUFP + PUSHJ PP,OUTLIN ;OUTPUT THE LINE + JRST LIT21 + LIT22: HRRZ AC2,LOCO + POP PP,LOCO + POP PP,LOCA + MOVE SX,LITHDX + HLRZ AC0,0(SX) + SUB AC2,LOCO ;COMPUTE LENGTH USED + CAMGE AC0,AC2 ;USE LARGER + MOVE AC0,AC2 + ADD AC2,LOCO +LIT24: ADDM AC0,LOCA + ADDM AC0,LOCO + PUSHJ PP,GETTOP + HRRM SX,LITHDX +LITI: SETZM LITCNT + SETZM LITNUM + MOVEI LITAB + MOVEM LITABX + JRST HIGHQ + +GETTOP: HRRZ AC1,SX ;VARHD + HRRZ SX,0(SX) + JUMPN SX,POPOUT +IFE FORMSW,< MOVEI SX,3 ;WFW> +IFN FORMSW,< MOVEI SX,4 ;ICC> + ADDB SX,FREE + CAML SX,SYMBOL + PUSHJ PP,XCEED + SUBI SX,1 ;MAKE SX POINT TO LINK + SETZM 0(SX) ;CLEAR FORWARD LINK + HRRM SX,0(AC1) ;STORE ADDRESS IN LAST LINK + POPJ PP, + VAR0: PUSHJ PP,BLOCK1 ;PRINT LOCATION + PUSHJ PP,VARA + JRST STOUTS + +VARA: MOVE SX,VARHDX + MOVE AC0,LOCA ;GET LOCATION FOR CHECK + JUMP1 VARB ;DO NOT CHECK START ON PASS 1 + CAME AC0,-1(SX) ;CHECK START OF VAR AREA + TRO ER,ERRP ;AND GIVE ERROR +VARB: MOVEM AC0,-1(SX) ;SAVE START FOR PASS 2 + HLRZ AC0,0(SX) + ADDM AC0,LOCA + ADDM AC0,LOCO + PUSHJ PP,GETTOP + HRRM SX,VARHDX + JUMP2 POPOUT + + PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN +IFN WFWSW, + TRZN ARG,VARF + POPJ PP, ;NO, EXIT + TRZ ARG,UNDF ;TURN OFF FLAG NOW +IFN WFWSW, +IFE WFWSW, + ADDM AC0,0(AC1) ;UPDATE COUNT +IFN WFWSW,< +VARA1: ADDI V,1 ;GET LENGTH OF DESIRED BLOCK + ADDM V,LOCO + EXCH V,LOCA + ADDM V,LOCA + HRL ARG,V ;GET STARTING LOCATION AND UPDAT PCS +> + + IOR ARG,MODA ;SET TO ASSEMBLY MODE +IFE WFWSW, + MOVSM ARG,0(SX) ;UPDATE 2ND WRD OF SYM TAB ENTRY +IFE WFWSW, + JRST HIGHQ1 + IF: PUSH PP,AC0 ;SAVE AC0 + PUSH PP,IO + PUSHJ PP,EVALXQ ;EVALUATE AND TEST EXTERNAL + POP PP,AC1 + JUMPL AC1,IFPOP + TLZ IO,FLDSW +IFPOP: POP PP,AC1 ;RETRIEVE SKIP INSTRUCTION +IFSET: TLO IO,IORPTC ;REPEAT CHARACTER +IFXCT: XCT AC1 ;EXECUTE INSTRUCTION + TDZA AC0,AC0 ;FALSE + MOVEI AC0,1 ;TRUE +IFEXIT: JUMPOC REPEA1 ;BRANCH IF IN OP-CODE FIELD +IFEX1: PUSHJ PP,GETCHR ;SEARCH FOR "<" + CAIN C,EOL ;ERROR IF END OF LINE + JRST ERRAX + CAIE C,34 + JRST IFEX1 + JUMPE AC0,IFEX2 ;TEST FOR 0 + TLO IO,IORPTC ;NO, PROCESS AS CELL + PUSHJ PP,CELL +IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM> + SETZM INCND ;NOT ANY MORE + JRST STOW ;STOW CODE AND EXIT + +IFPASS: HRRI AC0,P1 ;MAKE IT TLNX IO,P1 + MOVE AC1,AC0 ;PLACE IT IN AC1 + JRST IFSET ;EXECUTE INSTRUCTION + +IFB0: HLLO AC1,AC0 ;FORM AND STORE TEST INSTRUCTION +IFB1: PUSHJ PP,CHARL ;GET FIRST NON-BLANK + CAIE C," " + CAIN C," " + JRST IFB1 ;SKIP BLANKS AND TABS + CAIG C,CR ;CHECK FOR CARRET AS DELIM. + CAIGE C,LF + SKIPA SX,SEQNO2 + JRST ERRAX + MOVEM SX,CNDSEQ + MOVE SX,PAGENO + MOVEM SX,CNDPG + SETOM INCND ;SAVE INFO. FOR PASS 1 ERRORS + CAIN C,"<" ;LEFT BRACKET? + SETZB C,RC ;YES, PREPARE FOR OLD FORMAT + SKIPA SX,C ;SAVE FOR COMPARISON +IFB3: TRO AC0,1 ;SET FLAG +IFB2: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST + CAMN C,SX ;TEST FOR DELIMITER + JRST IFXCT ;FOUND + CAIE C," " ;BLANK? + CAIN C," " ;OR TAB? + JRST IFB2 ;YES + JUMPN SX,IFB3 ;JUMP IF NEW FORMAT + CAIN C,"<" ;" ;>? + SOJL RC,IFXCT ;YES, DECREMENT AND EXIT IF DONE + JRST IFB3 ;GET NEXT CHARACTER + + IFDEF0: HRRI AC0,UNDF ;MAKE IT TLNX ARG,UNDF + PUSH PP,AC0 ;STACK IT + PUSHJ PP,GETSYM ;TAKES SKIP RETURN IF SYM NAME IS LEGAL + TROA ER,ERRA ;ILLEGAL! + PUSHJ PP,SEARCH + JRST [PUSHJ PP,OPTSCH + TLO ARG,UNDF + JRST .+1] + PUSHJ PP,SSRCH3 ;EMIT TO CREF ANYWAY + JRST IFPOP ;POP AND EXECUTE INSTRUCTION + + IFIDN0: HLRZS AC0 + MOVEI V,2*.IFBLK-1 + SETZM IFBLK(V) ;CLEAR COMPARISON BLOCK + SOJGE V,.-1 + SETZM .TEMP ;CLEAR STORED DELIMETER + MOVEI RC,IFBLK ;SET FOR FIRST BLOCK + PUSHJ PP,IFCL ;GET FIRST STRING + MOVEI RC,IFBLKA + PUSHJ PP,IFCL ;GET SECOND STRING + MOVEI V,.IFBLK-1 + MOVE SX,IFBLK(V) ;GET WORD FROM FIRST STRING + CAMN SX,IFBLKA(V) ;COMPARE WITH SECOND STRING + SOJGE V,.-2 ;EQUAL, TRY NEXT WORD + JUMPL V,IFEXIT ;DID WE FINISH STRING + XORI AC0,1 ;NO, TOGGLE REQUEST + JRST IFEXIT ;DO NOT TURN ON IORPTC WFW + +IFCL: PUSHJ PP,CHARAC ;GET AND LIST CHARACTER + CAIE C," " ;SKIP SPACES + CAIG C,CR ;ALSO SKIP CR-LF + CAIGE C,HT ;AND TAB + JRST .+2 ;NOT ONE OF THEM + JRST IFCL ;SO LONG COMPARISONS WILL WORK +;*** A CROCK SO THAT IFIDN ,, WILL WORK *** + CAIE C,"," ;IS IT A COMMA? + JRST .+3 ;NO + SKIPN .TEMP ;YES, WAS PREVIOUS FIELD OLD METHOD? + JRST IFCL ;YES, IGNORE COMMA AND SPACES +; *** + CAIN C,"<" ;WAS IT LEFT BRACKET? + SETO C, ;SIGNAL OLD METHOD, LOOK FOR RIGHT BRACKET + MOVEM C,.TEMP ;STORE TERMINATOR FOR COMPARISON + MOVEI SX,5*.IFBLK-1 ;LIMIT SEARCH + HRLI RC,(POINT 7,,) ;SET UP BYTE IN RC +IFCLR: PUSHJ PP,CHARAC + SKIPLE .TEMP ;NEW METHOD? + JRST IFCLR1 ;YES, IGNORE ANGLE BRACKET COUNTING + CAIN C,"<" ;ANOTHER LEFT ANGLE? + SOS .TEMP ;YES, KEEP COUNT + CAIN C,">" ;CLOSING ANGLE + AOSGE .TEMP ;MATCHING COUNT? +IFCLR1: CAMN C,.TEMP ;TEST FOR DELIMITER + POPJ PP, ;EXIT ON RIGHT DELIMITER + SOJG SX,.+2 ;ANY ROOM IN COMPARISON BLOCK? + TROA ER,ERRA ;NO, FLAG ERROR BUT KEEP ON GOING + IDPB C,RC ;DEPOSIT BYTE + JRST IFCLR + + +IFEX2: PUSHJ PP,GETCHR + CAIN C,EOL ;EXIT WITH ERROR IF END OF LINE + JRST ERRAX + CAIN C,34 ;"<"? + AOJA AC0,IFEX2 ;YES, INCREMENT COUNT + CAIE C,36 ;">"? + JRST IFEX2 ;NO, TRY AGAIN + SOJGE AC0,IFEX2 ;YES, TEST FOR MATCH + PUSHJ PP,BYPASS ;YES, MOVE TO NEXT DELIMITER + SETZM INCND ;OUT OF CONDITIONAL NOW + AOJA AC0,STOWZ1 ;STOW ZERO + + +INTER0: HLLZM AC0,INTENT ;AC0 CONTAINS INTF/ENTF FLAGS + +INTER1: PUSHJ PP,GETSYM ;GET A SYMBOL + JRST INTER3 ;INVALID, SKIP + PUSHJ PP,SSRCH ;SEARCH THE TABLE + MOVSI ARG,SYMF!INTF!UNDF + TLNE ARG,UNDF ;UNDEFINED? + TRO ER,ERRA ;YES, FLAG ERROR +IFN WFWSW, + TLNN ARG,SYNF!EXTF + TDOA ARG,INTENT ;SET APPROPRIATE FLAGS +INTER3: TROA ER,ERRA ;FLAG ARG EROR AND SKIP + PUSHJ PP,INSERQ ;INSERT/UPDATE + JUMPCM INTER1 + SETZM EXTPNT ;JUST IN CASE, SO AS NOT TO CONFUSE WORLD + POPJ PP, ;NO, EXIT + EXTER0: PUSHJ PP,GETSYM ;GET A SYMBOL + JRST EXTER4 ;INVALID, ERROR +EXTER1: TLO IO,DEFCRS ;FLAG THIS AS A DEFINITION + PUSHJ PP,SSRCH ;OK, SEARCH SYMBOL TABLE + JRST EXTER2 ;NOT THERE, INSERT IT + TLNN ARG,EXTF!VARF!UNDF + TROA ER,ERRE ;FLAG ERROR AND BYPASS + TLNE ARG,EXTF ;VALID, ALREADY DEFINED? + JRST [JUMP1 EXTER3 ;YES, BYPASS + TLZN ARG,UNDF ;SKIP IF UNDEFINED ALSO + JRST EXTER3 ;CONTINUE + ANDM ARG,(SX) ;CLEAR UNDF ON PASS 2 + JRST EXTER2] ;SET UP EXTERNAL NOW +EXTER2: MOVEI V,2 ;NO, GET 2 CELLS FROM THE TREE + ADDB V,FREE + CAML V,SYMBOL ;HAVE WE RUN OUT OF CORE? + PUSHJ PP,XCEEDS ;YES, TRY TO BORROW SOME MORE + SUBI V,2 ;GET RIGHT CELL FOR POINTER + SETZB RC,0(V) ;ALL SET, ZERO VALUES + MOVSI ARG,SYMF!EXTF + PUSHJ PP,INSERT ;INSERT/UPDATE IT + MOVSI ARG,PNTF + IORM ARG,0(SX) + SKIPA ARG,-1(SX) ;GET THE SIXBIT FOR THE NAME +EXTER4: TROA ER,ERRA ;FLAG AS ERROR + MOVEM ARG,1(V) ;AND STORE THAT IN CASE SYMBOL TABLE MOVES +EXTER3: JUMPCM EXTER0 + POPJ PP, ;NO, EXIT + EVAL10: PUSH PP,RX + HRRI RX,^D10 + PUSHJ PP,EVALEX ;EVALUATE + POP PP,RX ;RESET RADIX + JUMPE RC,POPOUT ;EXIT IF ABSOLUTE + +QEXT: SKIPE EXTPNT ;ANY POSSIBILITIES? + TROA ER,ERRE ;YES, FLAG EXTERNAL ERROR + TRO ER,ERRR ;NO, FLAG RELOCATION ERROR + HLLZS RC ;CLEAR RELOCATION/EXTERNAL + POPJ PP, + +EVALXQ: PUSHJ PP,EVALEX ;EVALUATE EXPRESSION + TLZN RC,-2 ;LEFT HALF EXTERNAL + TRZE RC,-2 ;WAS AN EXTERNAL FOUND? + TRO ER,ERRE ;YES, FLAG ERROR + POPJ PP, ;RETURN + OPDEF0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL + POPJ PP, ;ERROR IF INVALID SYMBOL + CAIE C,73 ;"["? + JRST ERRAX ;NO, ERROR + PUSH PP,AC0 ;STACK MNEMONIC + AOS LITLVL ;SHORT OUT LOCATION INCREMENT + PUSHJ PP,STMNT ;EVALUATE STATEMENT + SKIPGE STPX ;CODE STORED? + TROA ER,ERRA ;NO,"A" ERROR + PUSHJ PP,DSTOW ;GET AND DECODE VALUE + SOS LITLVL + EXCH AC0,0(PP) ;EXCHANGE VALUE FOR MNEMONIC + PUSH PP,RC ;STACK RELOCATION + TLO IO,DEFCRS ;SAY WE ARE DEFINING IT + PUSHJ PP,MSRCH ;SEARCH SYMBOL TABLE + MOVSI ARG,OPDF ;NOT FOUND + POP PP,RC ;RESTORE VALUES + POP PP,V + TLNE ARG,SYNF!MACF + TRO ER,ERRA ;YES "A" ERROR + TRNN ER,ERRA ;ERROR? + PUSHJ PP,INSERT ;NO, INSERT/UPDATE + TLZ IO,DEFCRS ;JUST IN CASE + PUSHJ PP,BYPASS + JRST STOWI ;BE SURE STOW IS RESET + + +DEPHA0: MOVE AC0,LOCO + SKIPA RC,MODO ;SET TO OUTPUT VALUES AND SKIP +PHASE0: PUSHJ PP,EVALXQ ;EVALUATE AND CHECK FOR EXTERNAL + MOVEM AC0,LOCA ;SET ASSEMBLY LOCATION COUNTER + MOVEM RC,MODA + JRST BLOCK2 + ASSIGN: JUMPAD ERRAX ;NO, ERROR + PUSHJ PP,ASSIG1 + TLNE IO,IOSALL ;SUPPRESS ALL? + JUMPN MRP,CPOPJ ;IF IN MACRO +ASSIG7: MOVEM RC,ASGBLK + TRNE RC,-2 ;EXTERNAL + HLLZS ASGBLK ;YES,CLEAR RELOCATION + TLNE RC,1 ;LEFT HALF NOT RELOC? + TLNE RC,-2 ;... + HRROS ASGBLK ;YES, SET FLAG + MOVEM V,LOCBLK + POPJ PP, + +ASSIG1: PUSH PP,AC0 ;SAVE SYMBOL + SETZB AC0,EXTPNT ;SPECIAL CHECK FOR == WFW + PUSHJ PP,PEEK ;IS THE NEXT ON = + CAIE C,"=" + JRST ASSIG5 + TLO AC0,NOOUTF ;YES, NOT OUT TO DDT WFW + PUSHJ PP,GETCHR ;PROCESS THE CHAR. + PUSHJ PP,PEEK ;CHECK FOR ==: DMN +ASSIG5: CAIE C,":" ;IS IT + JRST ASSIG6 ;NO + TLO AC0,INTF ;MAKE INTERNAL + PUSHJ PP,GETCHR ;REPEAT IT +ASSIG6: MOVEM AC0,HDAS ;STORE THESE BITS WFW + PUSHJ PP,EVALCM ;EVALUATE EXPRESSION + EXCH AC0,0(PP) ;SWAP VALUE FOR SYMBOL + PUSH PP,RC + TRNN RC,-2 ;CHECK EXTERNAL AGREEMENT + JRST ASSIG2 + HRRZS RC + HRRZ ARG,EXTPNT + CAME RC,ARG + PUSHJ PP,QEXT ;EXTERNAL OR RELOCATION ERROR +ASSIG2: HLRZ RC,(PP) + TRNN RC,-2 + JRST ASSIG3 + HLRZ ARG,EXTPNT + CAME RC,ARG + PUSHJ PP,QEXT +ASSIG3: TLO IO,DEFCRS + PUSHJ PP,SSRCH + MOVSI ARG,SYMF + IOR ARG,HDAS ;WFW + TLNE ARG,UNDF ;WAS IT UNDEFINED + TLZ ARG,EXTF!PNTF ;YES,CLEAR EXTF NOW + TLZ ARG,UNDF!VARF ;CANCEL UNDEFINED AND VARIABLE FLAGS + SETZM EXTPNT ;FOR REST OF WORLD + POP PP,RC + TRNE ER,ERRORS-ERRQ + SETZ RC, ;CLEAR RELOCATION + POP PP,V + TRNE ER,ERRU ;WAS VALUE UNDEFINED? + TLO ARG,UNDF ;YES,SO TURN UNDF ON + TLNE ARG,TAGF!EXTF + JRST ERRAX + JRST INSERT + + LOC0: PUSHJ PP,HIGHQ ;AC0=0,0 + PUSH PP,AC0 ;SAVE MODE REQUESTED + HLRZS AC0 ;PUT MODE IN RIGHT HALF + JUMPN AC0,RELOC0 ;RELOC PSEUDO-OP + CAMN AC0,MODO ;SAME AS PRESENT MODE? + JRST [HRRZ AC0,LOCO ;YES + EXCH AC0,ABSLOC ;EXCH VALUES + JRST LOC01] + HRRZ AC0,LOCO ;NO, GET CURRENT VALUE + MOVEM AC0,RELLOC ;SAVE IT + MOVE AC0,ABSLOC ;GET LAST RELOC VALUE +LOC01: PUSHJ PP,BYPASS ;SKIP BLANKS + TLO IO,IORPTC + CAIE C,EOL ;USE PREVIOUS VALUE IF NULL ARGUMENT + PUSHJ PP,EVALXQ ;GET EXPRESSION AND TEST EXTERNAL + HRRM AC0,(PP) ;STORE NEW VALUE + POP PP,AC0 ;RETRIEVE STORED MODE AND VALUE +LOC10: HRRZM AC0,LOCA ;SET ASSEMBLY LOCATION + HRRZM AC0,LOCO ;AND OUTPUT LOCATION + HLRZM AC0,MODA ;SET MODE + HLRZM AC0,MODO + JRST BLOCK2 + +RELOC0: CAMN AC0,MODO + JRST [HRRZ AC0,LOCO + EXCH AC0,RELLOC + JRST LOC01] + HRRZ AC0,LOCO + MOVEM AC0,ABSLOC + MOVE AC0,RELLOC + JRST LOC01 + + IFN RENTSW,< +HISEG1: PUSHJ PP,HIGHQ ;SET CURRENT PROGRAM BREAK + PUSHJ PP,COUTD ;DUMP CURRENT TYPE OF BLOCK + SKIPN HISNSW ;IF WE HAVE SEEN IT BEFORE + SKIPE HIGH ;OR ANY RELOC CODE PUT OUT + TRO ER,ERRQ ;FLAG AS AN ERROR + PUSHJ PP,BYPASS ;GO GET EXPRESSION + TLO IO,IORPTC + PUSHJ PP,EVALXQ ;CHECK FOR EXTERNAL + ANDCMI AC0,1777 ;ONLY ALLOWED TO START ON NEW K BOUND + HRRZM AC0,LOCA ;SET LOC COUNTERS + HRRZM AC0,LOCO + MOVEI RC,1 ;ASSUME RELOCATABLE + POPJ PP, + +TWSEG0: PUSHJ PP,HISEG1 ;COMMON CODE + JUMPN AC0,.+2 ;ARGUMENT SEEN + MOVEI AC0,400000 ;ASSUME 400000 + HRRZM AC0,HMIN ;SET OFSET OF HIGH SEG. + HRRZM AC0,HHIGH ;INCASE NO HISEG CODE + TLOA AC0,(1B0) ;SIGNAL TWO SEGMENTS AND SKIP + +HISEG0: PUSHJ PP,HISEG1 ;COMMON CODE +HISEG2: MOVEM AC0,SVTYP3 ;SAVE THE HISEG ARG + MOVEM RC,MODA ;SET MODES + MOVEM RC,MODO + SETOM HISNSW ;WE HAVE ALREADY PUT ONE OUT + JRST BLOCK2 ;MAKE LISTING HAPPEN RIGHT> + +IFE RENTSW,< + SYN CPOPJ,HISEG0 + SYN CPOPJ,TWSEG0> + +IFN FORMSW,< +ONFORM: HRRES HWFMT ;ALLOW MULTI-FORMAT LISTING + POPJ PP, +OFFORM: HRROS HWFMT ;HALF-WORD FORMAT ONLY + POPJ PP, > + +IFE FORMSW,< + SYN CPOPJ,ONFORM + SYN CPOPJ,OFFORM> + HIGHQ: +HIGHQ1: MOVE V,LOCO ;GET ASSEMBLY LOCATION + SKIPN MODO ;IF ASSEMBLY MODE IS ABSOLUTE + JRST [CAMLE V,ABSHI ;RECORED ABS HIGHEST ALSO + MOVEM V,ABSHI + POPJ PP,] +IFN RENTSW, + CAMLE V,HIGH ;IS IT GREATER THAN "HIGH"? + MOVEM V,HIGH ;YES, REPLACE WITH LARGER VALUE + POPJ PP, + +ONML: TLZA FR,MWLFLG ;MULTI-WORD LITERALS OK +OFFML: TLO FR,MWLFLG ;NO + POPJ PP, + +OFFSYM: SETOM IONSYM ;SUPRESS SYMBOL TABLE LISTING + POPJ PP, + +SUPRE0: PUSHJ PP,GETSYM ;GET A SYMBOL TO SUPRES + JRST SUPRE1 ;ERROR + PUSHJ PP,SSRCH ;SYMBOL ONLY + JRST SUPRE1 ;GIVE ERROR MESSAGE + TLOA ARG,SUPRBT ;SET THE SUPRESS BIT +SUPRE1: TROA ER,ERRA + IORM ARG,(SX) ;PUT BACK + JUMPCM SUPRE0 ;ANY MORE? + JRST SUPRS1 + +SUPRSA: PUSHJ PP,LOOKUP ;SUPRESS ALL + MOVSI ARG,SUPRBT + IORM ARG,(SX) +SUPRS1: SETZM EXTPNT ;JUST IN CASE WE LOOKED ONE UP + POPJ PP, + +XPUNG0: JUMP1 POPOUT + PUSHJ PP,LOOKUP + MOVE ARG,(SX) ;GET SYMBOL FLAGS + TLNN ARG,INTF!ENTF!EXTF!SPTR + TLOA ARG,SUPRBT ;LOCAL SYMBOL,SO SUPPRESS IT + SETZM EXTPNT + MOVEM ARG,(SX) ;RESTORE FLAGS + POPJ PP, + TITLE0: JUMP2 REMAR0 + MOVEI SX,.TBUF + HRRI AC0,TBUF + PUSHJ PP,SUBTT1 ;GO READ IT + MOVEM SX,TCNT ;SAVE COUNT OF CHARS. WRITTEN + SKIPE UNIVSN ;WAS IT A UNIVERSAL? + PUSHJ PP,ADDUNV ;YES ADD TO TABLE + TLOE IO,IOTLSN ;HAVE WE SEEN ONE +IFE CCLSW, +IFN CCLSW, + POPJ PP, ;EXIT OTHERWISE + +SUBTT0: SKIPE SBUF ;STORE FIRST SUBTTL ON PASS1 + JUMP1 REMAR0 ;OTHERWISE EXIT IF PASS ONE + MOVEI SX,.SBUF + HRRI AC0,SBUF + +SUBTT1: PUSHJ PP,BYPASS ;BYPASS LEADING BLANKS + TLO IO,IORPTC +SUBTT3: PUSHJ PP,CHARAC ;GET ASCII CHARACTER + IDPB C,AC0 ;STORE IN BLOCK + CAIGE C,40 ;TEST FOR TERMINATOR + CAIN C,HT + SOJG SX,SUBTT3 ;TEST FOR BUFFER FULL + DPB RC,AC0 ;END, STORE TERMINATOR + SOJA SX,CPOPJ ;COUNT NUL AND EXIT + +IFN CCLSW,< +PRNAM: TLNN IO,CRPGSW ;NOT IF NOT RPG + POPJ PP, + PUSH PP,AC0 ;SAVE AC0 DMN + PUSH PP,RC ;AND RC + MOVE AC0,[POINT 7,TBUF] + MOVE SX,[POINT 7,OTBUF] + MOVEI RC,6 ;MAX OF SIX CHRS +PN1: ILDB C,AC0 + CAILE C," " ;CHECK FOR LEGAL + CAILE C,"Z"+40 ;CHECK AGAINST LOWER CASE Z + JRST PN2 + IDPB C,SX ;PUT IN OUTPUT BUFFER + SOJG RC,PN1 ;GET MORE +PN2: MOVEI C,0 + IDPB C,SX ;TERMINATOR + TTCALL 3,OTBUF + TTCALL 3,[ASCIZ / +/] + POP PP,RC + POP PP,AC0 ;RESTORE AC0 DMN + POPJ PP, +> + SYN0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL + JRST ERRAX ;ERROR, EXIT + PUSHJ PP,MSRCH ;TRY FOR MACRO/OPDEF + JRST SYN3 ;NO,0THRY FOR OPERAND +SYN1: MOVEI SX,MSRCH ;YES, SET FLAG +SYN2: PUSHJ PP,SAVEXS ;SAVE REGISTERS + JUMPNC ERRAX ;ERROR IF NO COMMA + PUSHJ PP,GETSYM ;GET THE SECOND SYMBOL + POPJ PP, + PUSHJ PP,@SAVBLK+SX ;SEARCH FOR SECOND SYMBOL + JFCL + MOVE ARG,SAVBLK+ARG ;GET VALUES + MOVE RC,SAVBLK+RC + MOVE V,SAVBLK+V + TLNE ARG,MACF ;MACRO? + PUSHJ PP,REFINC ;YES, INCREMENT REFERENCE + JRST INSERT ;INSERT AND EXIT + +SYN3: PUSHJ PP,SSRCH ;SEARCH FOR OPERAND + JRST SYN4 ;NOT FOUND, TRY OP CODE + TLO ARG,SYNF ;FLAG AS SYNONYM + TLNE ARG,EXTF ;EXTERNAL? + HRRZ V,ARG ;YES, RELPACE WITH POINTER + MOVEI SX,SSRCH ;SET FLAG + TLNN ARG,VARF ;DO NOT LET HIM SYN A VARIABLE + JRST SYN2 + JRST ERRAX + +SYN4: PUSHJ PP,OPTSCH ;SEARCH FOR OP-CODE + JRST ERRAX ;NOT FOUND, EXIT WITH ERROR + MOVSI ARG,SYNF ;FLAG AS SYNONYM + JRST SYN1 + PURGE0: PUSHJ PP,GETSYM ;GET A MNEMONIC + JRST [TRZ ER,ERRA ;CLEAR ERROR + POPJ PP,] ;AND RETURN + PUSHJ PP,MSRCH ;SEARCH MACRO SYMBOL TABLE + JRST PURGE2 ;NOT FOUND, TRY SYMBOLS + PUSH PP,CS ;SAVE CS AS IT MAY GET GARBAGED + TLNE ARG,MACF ;MACRO? + PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE + POP PP,CS + JRST PURGE4 ;REMOVE SYMBOL FROM TABLE + +PURGE2: PUSHJ PP,SSRCH ;TRY OPERAND SYMBOL TABLE + JRST PURGE5 ;NOT FOUND GET NEXT SYMBOL + TRNN RC,-2 ;CHECK COMPLEX EXTERNAL + TLNE RC,-2 + TLNE ARG,SYNF + JRST .+2 + JRST PURGE3 + TLNE ARG,EXTF!UNDF ;ERROR IF EXTERNAL OR UNDEFINED + TLNE ARG,SYNF ;BUT NOT A SYNONYM + JRST PURGE4 +PURGE3: TROA ER,ERRA ;NOT FOUND, ERROR +PURGE4: PUSHJ PP,REMOVE ;REMOVE FROM THE SYMBOL TABLE +PURGE5: JUMPCM PURGE0 + POPJ PP, ;EXIT + OPD1: TLNE ARG,UNDF ;IF OPDEF IS UNDEFINED + TRO ER,ERRO ;GIVE "O" ERROR +OPD: MOVE AC0,V ;PUT VALUE IN AC0 + JRST OP +IOP: MOVSI AC2,(POINT 9,0(PP),11) +IFE FORMSW,< TLOA IO,IOIOPF ;SET "IOP SEEN" AND SKIP> +IFN FORMSW,< PUSH PP,IOFORM ;USE I/O FORM + TLO IO,IOIOPF ;SET "IOP" SEEN + JRST OP+2> +OP: MOVSI AC2,(POINT 4,0(PP),12) +IFN FORMSW,< PUSH PP,INFORM ;USE INST. FORM> + PUSH PP,RC + PUSH PP,AC0 ;STACK CODE + PUSH PP,AC2 + PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION + POP PP,AC2 + JUMPNC OP2 +OP1B: PUSHJ PP,GETCHR ;GET A CHARACTER +IFE FORMSW, +IFN FORMSW, + TLO IO,IORPTC ;NOT A COMMA,REPEAT IT + LDB AC1,AC2 + ADD AC1,AC0 + DPB AC1,AC2 + JUMPE RC,OP1A ;EXTERNAL OR RELOCATABLE? + PUSHJ PP,QEXT ;YES, DETERMINE WHICH AND FLAG AN ERROR + +OP1A: PUSHJ PP,EVALEX ;GET ADDRESS PART +OP2: PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS +OP3: POP PP,AC0 ;PUT IN AC0 + POP PP,RC +IFN FORMSW,< POP PP,AC1 ;GET FORM WORD> + SKIPE (PP) ;CAME FROM EVALCM? + JRST STOW ;NO,STOW CODE AND EXIT + POP PP,AC1 ;YES,EXIT IMMEDIATELY + POPJ PP, + + EVADR: ;EVALUATE STANDARD ADDRESS +IFE IIISW, + ADD AC0,-1(PP) ;ADD ADDRESS PORTIONS + HLL AC0,-1(PP) ;GET LEFT HALF + TLZE FR,INDSW ;INDIRECT BIT? + TLO AC0,(Z @) ;YES, PUT IT IN + MOVEM AC0,-1(PP) ;RE-STACK CODE + ADD RC,-2(PP) ;UPDATE RELOCATION + HRRM RC,-2(PP) ;USE HALF WORD ADD + CAIE C,10 ;"("? + POPJ PP, ;NO, EXIT + + MOVSS EXTPNT ;WFW + PUSHJ PP,EVALCM ;EVALUATE + MOVSS EXTPNT ;WFW + MOVSS V,AC0 ;SWAP HALVES +IFE IIISW, +IFN IIISW, + ADD V,-1(PP) ;ADD RIGHT HALVES + ADD ARG,-2(PP) + HRRM V,-1(PP) ;UPDATE WITHOUT CARRY + HRRM ARG,-2(PP) + HLLZS AC0 ;PREPARE LEFT HALVES + HLLZS RC +IFE IIISW, + ADDM AC0,-1(PP) ;MERGE WITH PREVIOUS VALUE + ADDM RC,-2(PP) + CAIE C,11 ;")"? + JRST ERRAX ;NO, FLAG ERROR + ;YES, BYPASS PARENTHESIS +BYPASS: +BYPAS1: PUSHJ PP,GETCHR +BYPAS2: JUMPE C,.-1 ;SKIP TRAILING BLANKS + POPJ PP, ;EXIT + + IFE IIISW,< +OP2A1: EXCH RC,-2(PP) ;GET STORED CODE + TLNN RC,-1 ;OK IF ALL ZERO + JRST OP2A2 ;OK SO RETURN + TLC RC,-1 ;CHANGE ALL ONES TO ZEROS + TLCE RC,-1 ;OK IF ALL ONES + TRO ER,ERRQ ;OTHERWISE A "Q" ERROR +OP2A2: EXCH RC,-2(PP) ;GET RC,BACK + POPJ PP, ;AND RETURN> + + +EXPRES: HRLZ AC0,RX ;FUDGE FOR OCT0 + +OCT0: PUSH PP,RX + HLR RX,AC0 +OCT1: PUSHJ PP,EVALEX ;EVALUATE +IFN FORMSW,< MOVE AC1,HWFORM> + PUSHJ PP,STOW ;STOW CODE + JUMPCM OCT1 + POP PP,RX ;YES, RESTORE RADIX + POPJ PP, ;EXIT + SIXB10: MOVSI RC,(POINT 6,AC0) ;SET UP POINTER + MOVEI AC0,0 ;CLEAR WORD + +SIXB20: PUSHJ PP,CHARL ;GET NEXT CHARACTER + CAMN C,SX ;IS THIS PRESET DELIMITER? +IFE FORMSW,< JRST ASC60 ;YES> +IFN FORMSW,< + JRST [PUSHJ PP,BYPAS1 + ANDCM RC,STPX + MOVE AC1,SXFORM + JUMPGE RC,STOWZ + POPJ PP,]> + CAIL C,"A"+40 + CAILE C,"Z"+40 + JRST .+2 + TRZA C,100 ;CONVERT LOWER CASE TO SIXBIT + SUBI C,40 ;CONVERT TO SIXBIT + JUMPL C,ASC55 ;TEST FOR INVALID CHARACTER + IDPB C,RC ;NO, DEPOSIT THE BYTE + TLNE RC,770000 ;IS THE WORD FULL? + JRST SIXB20 ;NO, GET NEXT CHARACTER +IFN FORMSW,< MOVE AC1,SXFORM ;SIXBIT FORM> + PUSHJ PP,STOWZ ;YES, STORE + JRST SIXB10 ;GET NEXT WORD + ASCII0: HLLZ SDEL,AC0 ;STORE ASCII/ASCIZ FLAG +ASC10: PUSHJ PP,CHARL ;GET FIRST NON-BLANK + CAIE C," " + CAIN C,HT + JRST ASC10 + CAIG C,CR ;CHECK FOR CRRET AS DELIM + CAIGE C,LF + SKIPA SX,SEQNO2 + JRST ERRAX + MOVEM SX,TXTSEQ ;SAVE SEQ AND PAGE + MOVE SX,PAGENO + MOVEM SX,TXTPG + SETOM INTXT + MOVE SX,C ;SAVE FOR COMPARISON + JUMPG SDEL,SIXB10 ;BRANCH IF SIXBIT + +ASC20: MOVSI RC,(POINT 7,AC0) ;SET UP POINTER + TLNE SDEL,200000 ;THIS BIT (AND BIT0) IN FOR COMMENT + MOVSI RC,440000 ;SO NOTHING WILL BE DEPOSITED +IFE IIISW, +IFN IIISW, +ASC30: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST + CAMN C,SX ;TEST FOR DELIMITER + JRST ASC50 ;FOUND + IDPB C,RC ;DEPOSIT BYTE + TLNE RC,760000 ;HAVE WE FINISHED WORD? + JRST ASC30 ;NO,GET NEXT CHARACTER +IFN FORMSW,< MOVE AC1,ASCIIF ;USE ASCII FORM WORD> + PUSHJ PP,STOWZ ;YES, STOW IT + JRST ASC20 ;GET NEXT WORD + +ASC55: TDZA CS,CS ;ZERO CS IN CASE NESTED +ASC50: TDZA RC,SDEL ;TEST FOR ASCIIZ + TROA ER,ERRA ;SIXBIT ERROR EXIT +ASC60: PUSHJ PP,BYPAS1 ;POLISH OFF TERMINATOR + SETZM INTXT ;WE ARE OUT OF IT +IFN FORMSW,< MOVE AC1,ASCIIF ;USE ASCII FORM WORD> +IFN IIISW, + ANDCM RC,STPX ;STORE AT LEAST ONE WORD + TLNN SDEL,200000 ;GET OUT WITHOUT STORING + JUMPGE RC,STOWZ ;STOW + POPJ PP, ;ASCII, NO BYTES STORED, SO EXIT + POINT0: +IFN FORMSW,< PUSH PP,BPFORM ;USE BYTE POINTER FORM WORD> + PUSH PP,RC ;STACK REGISTERS + PUSH PP,AC0 + PUSHJ PP,EVAL10 ;EVALUATE RADIX 10 + DPB AC0,[POINT 6,0(PP),11] ;STORE BYTE SIZE + JUMPNC POINT2 + PUSHJ PP,EVALEX ;NO, GET ADDRESS + PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS + JUMPNC POINT2 + PUSHJ PP,EVAL10 ;EVALUATE RADIX 10 + TLNE IO,NUMSW ;IF NUMERIC + TDCA AC0,[-1] ;POSITION=D35-RHB +POINT2: MOVEI AC0,0 ;OTHERWISE SET TO D36 + ADDI AC0,^D36 + LSH AC0,^D30 + ADDM AC0,0(PP) ;UPDATE VALUE + JRST OP3 + XWD0: +IFN FORMSW,< PUSH PP,HWFORM ;USE HALF WORD FORM> + PUSH PP,RC + PUSH PP,AC0 ;STORE ZERO ON STACK + PUSHJ PP,EVALEX ;EVALUATE EXPRESSION + JUMPNC OP2 +XWD5: SKIPN (PP) ;ANY CODE YET? + JRST XWD10 ;NO,USE VALUE IN AC0 + JUMPE AC0,.+2 ;ANYTHING IN AC0? + TRO ER,ERRQ ;YES,FLAG "Q"ERROR + MOVE AC0,(PP) ;USE PREVIOUS VALUE + MOVE RC,-1(PP) ;AND RELOCATION +XWD10: HRLZM AC0,0(PP) ;SET LEFT HALF + HRLZM RC,-1(PP) + MOVSS EXTPNT ;WFW + JRST OP1A ;EXIT THROUGH OP + +IOWD0: PUSHJ PP,EVALXQ ;EVALUATE AND TEST FOR EXTERNAL + CAIE C,14 ;","? + JRST [SKIPN AC0 ;IF NZERO AND NO "," SEEN + TRO ER,ERRQ ;TREAT AS Q ERROR +IFN FORMSW,< MOVE AC1,HWFORM ;USE HALF WORD FORM> + SOJA AC0,STOW] ;NO, TREAT AS RIGHT HALF + PUSH PP,AC0 ;YES, STACK LEFT HALF + PUSHJ PP,EVALEX ;WFW + SUBI AC0,1 + POP PP,AC1 ;RETRIEVE LEFT HALF + MOVNS AC1 + HRL AC0,AC1 +IFN FORMSW,< MOVE AC1,HWFORM ;USE HALF WORD FORM> + JRST STOW ;STOW CODE AND EXIT + BYTE0: PUSHJ PP,BYPASS ;GET FIRST NON-BLANK + CAIE C,10 ;"("? + JRST ERRAX ;NO, FLAG ERROR AND EXIT +IFN FORMSW,< + PUSH PP,[1] + MOVEI AC0,0 +> + PUSH PP,RC + PUSH PP,AC0 ;INITIALIZE STACK TO ZERO + MOVSI ARG,(POINT -1,(PP)) + +BYTE1: PUSH PP,ARG + PUSHJ PP,EVAL10 ;EVALUATE RADIX 10 + POP PP,ARG + CAIG AC0,^D36 ;TEST SIZE + JUMPGE AC0,.+2 + TRO ER,ERRA + DPB AC0,[POINT 6,ARG,11] ;STORE BYTE SIZE + +BYTE2: IBP ARG ;INCREMENT BYTE + TRZN ARG,-1 ;OVERFLOW? + JRST BYTE3 ;NO + SETZB AC0,RC ;YES + EXCH AC0,0(PP) ;GET CURRENT VALUES + EXCH RC,-1(PP) ;AND STACK ZEROS +IFN FORMSW,< + MOVE AC1,HWFORM ;USE STANDARD FORM + EXCH AC1,-2(PP) ;GET FORM WORD +> + PUSHJ PP,STOW ;STOW FULL WORD + +BYTE3: PUSH PP,ARG + PUSHJ PP,EVALEX ;COMPUTE NEXT BYTE + POP PP,ARG + DPB AC0,ARG ;STORE BYTE + HLLO AC0,ARG + DPB RC,AC0 ;STORE RELOCATION + +IFN FORMSW,< + MOVEI AC0,1 + HRRI ARG,-2 + DPB AC0,ARG ;STORE FORM BYTE + HRRI ARG,0 +> + JUMPCM BYTE2 + CAIN C,10 ;"("? + JRST BYTE1 ;YES, GET NEW BYTE SIZE + JRST OP3 ;NO, EXIT + RADX50: PUSHJ PP,EVALEX ;EVALUATE CODE + JUMPN RC,ERRAX ;ERROR IF NOT ABSOLUTE + MOVE ARG,AC0 + JUMPNC ERRAX + PUSHJ PP,GETSYM ;YES, GET SYMBOL + TRZ ER,ERRA ;CLEAR ERROR + PUSHJ PP,SQOZE ;SQUOZE SIXBIT AND ADD CODE +IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM> + JRST STOW ;STOW CODE AND EXIT + + +SQOZE: MOVE AC1+1,AC0 ;PUT SIXBIT IN AC1+1 + MOVEI AC0,0 ;CLEAR RESULT +SQOZ1: MOVEI AC1,0 + LSHC AC1,6 ;PUT 6-BIT CHARACTER IN AC1 + LDB AC1,[POINT 6,CSTAT(AC1),23] ;CONVERT TO RADIX50 + IMULI AC0,50 ;MULTIPLY PREVIOUS RESULT + ADD AC0,AC1 ;ADD NEW CHARACTER + JUMPN AC1+1,SQOZ1 ;TEST FOR END + LSH ARG,^D30 ;LEFT-JUSTIFY CODE + IOR AC0,ARG ;MERGE WITH RESULT + POPJ PP, + REPEAT 0,< EXPLANATION OF ARRAY AND LVAR FEATURES + +WHEN A VARIABLE IS SEEN EITHER BY #, INTEGER OR ARRAY +THE VALUE PORTION OF THE SYMBOL TABLE ENTRY (RH OF 2ND WORD) +IS USE TO HOLD THE DESIRED SIZE-1. THE CORRECT VALUE IS +ASSIGNED BY THE VAR PSEUDO OP. + +WHEN LVAR IS SEEN, A SEARCH OF THE SYMBOL TABLE IS MADE +FOR ALL VARIABLES. THE VARF (VARIABLE) FLAG IS +LEFT ON AND EXTF AND PNTF ARE TURNED ON SO THAT THE +VARIABLE LOOKS LIKE AN EXTERNAL. THE POINTER +(RH OF 2ND WORD OF THE SYMBOL TABLE ENTRY) POINTS +TO THE HEADER BLOCK. THE HEADER BLOCK IS FORMATTED AS FOLLOWS: +WORD 1: LEFT HALF IS A POINTER TO SYMBOL TABLE FIXUP BLOCKS + RIGHT HALF IS A POINTER TO CODE FIXUP BLOCKS +WORD 2: 0 THIS IS USED TO DISTINGUISH IT FROM NORMAL EXTERNALS + WHICH HAVE THE SYMBOL NAME HERE +WORD 3: THE LOCATION RELATIVE TO THE START OF THE LOW CORE + VARIABLES + +CORE FIXUP BLOCKS ARE SET UP BY BOUT + +WORD1: RH LINK TO NEXT CORE FIXUP BLOCK 0 IF END OF CHAIN + LH OFFSET. NUMBER TO BE ADDED TO SYMBOL VALUE BEFORE + FIXUP IS DONE +WORD 2: POINTER TO A FIXUP CHAIN FOR RIGHT HALVES + LEFT HALF IS RELOCATION RH IS ADDRESS +WORD 3: SAME AS WORD 2 BUT FOR LEFT HALF FIXUPS + +NOTE ALL THESE FIXUPS ARE CHAINED EVEN IF IN LEFT HALF. +SIMILARY ALL REFERENCES TO SAY A+1 ARE CHAINED + +SYMBOL TABLE FIXUP BLOCKS. THESE ARE GENERATED BY SOUT +AS THE SYMBOL TABLE IS PUT OUT. THESE FIXUPS ARE ADDITIVE +NOT CHAINED. + +WORD 1: RH LINK TO NEXT BLOCK + LH 0 +WORD 2: RADIX50 FOR THE SYMBOL +WORD 3: 200000,,0 IF RH FIXUP + 600000,,0 IF LH FIXUP + +SOUT ALSO SETS UP FIXLNK. FIXLNK POINTS TO THE CHAIN OF +ALL LVAR FIXUPS TO BE DONE. IT POINTS TO THE SECOND WORD + OF A 2 WORD BLOCK + +WORD 1: LINK TO 2ND WORD OF NEXT BLOCK 0 IF END +WORD 2: RH POINTER TO A HEADER BLOCK + LH GARBAGE + +FIXUPS ARE BLOCK TYPE 13 AS FOLLOWS +WORD 1: THE PROGRAM BREAK (AS BLOCK TYPE 5) +WORD 2: THE NUMBER OF LOCATION USED FOR VARIABLES IN THE + LOW SEGMENT+1 + +REMAINING WORDS COME IN PAIRS AS FOLLOWS: +1ST WORD BIT 0=0 RH FIXUP + BIT 0=1 LH FIXUP + BIT 1=0 CORE FIXUP + WORD 2 LH POINTER TO CHAIN + WORD 2 RH VALUE + BIT 1=1 SYMBOL FIXUP + WORD 1 RH VALUE + WORD 2 SYMBOL +> + +REPEAT 0,< EXPLANATION OF ICC FEATURES + + IF FORMSW IS SET NON ZERO THE FORM OF THE OCTAL LISTING OUTPUT + IS CHANGED FROM STANDARD HALF WORD FORM TO THE FOLLOWING:- + + IF INSTRUCTION BYTE 9,4,1,4,18 + IF I/O INSTRUCTION BYTE 3,7,3,1,4,18 + IF BYTE POINTER BYTE 6,6,2,4,18 + IF ASCII BYTE 7,7,7,7,7 + IF SIXBIT BYTE 6,6,6,6,6,6 + + ALL OTHERS ARE STANDARD HALF WORD + + THIS FEATURE CAN BE OVER RIDDEN BY USE OF /H SWITCH + STANDARD HALF WORD FORM IS THEN USED. + HOWEVER BECAUSE OF EXTRA SPACING THE OUTPUT IS PUSHED MORE + TO THE RIGHT AND LONG COMMENTS OVERFLOW THE LINE + > + IFN WFWSW,< +%INTEG: PUSHJ PP,GETSYM ;GET A SYMBOL + JRST INTG2 ;BAD SYMBOL ERROR + TLO IO,DEFCRS ;THIS IS A DEFINTION + PUSHJ PP,SSRCH ;SEE IF THERE + MOVSI ARG,SYMF!UNDF ;SET SYMBOL AND UNDEFINED IF NOT + TLNN ARG,UNDF ;IF ALREADY DEFINED + JRST INTG1 ;JUST IGNORE + TLOA ARG,VARF ;SET VARIABLE FLAG +INTG2: TROA ER,ERRA ;SYMBOL ERROR + PUSHJ PP,INSERZ ;PUT IN WITH ZERO VALUE (LENGTH OF 1) +INTG1: JUMPCM %INTEG + POPJ PP, + +%ARAY: MOVEM PP,ARAYP ;SAVE PUSHDOW POINTER +ARAY2: PUSHJ PP,GETSYM + JRST ARAY1 ;BAD SYMBOL GIVE ERROR AND ABORT + PUSH PP,AC0 ;SAVE NAME + JUMPCM ARAY2 ;AND GO ON IF A COMMA + CAIE C,"["-40 ;MUST BE A [ + JRST ARAY1 + PUSHJ PP,BYPASS ;OH, WELL + TLO IO,IORPTC + PUSHJ PP,EVALXQ ;GET A SIZE + CAIE C,"]"-40 ;MUST END RIGHT + JRST ARAY1 + PUSHJ PP,BYPASS ;?? + HRRZ V,AC0 ;GET VALUE + SUBI V,1 +NXTVAL: POP PP,AC0 + PUSH PP,V ;SAVE OVER SEARCH + TLO IO,DEFCRS + PUSHJ PP,SSRCH ;FIND IT + MOVSI ARG,SYMF!UNDF + POP PP,V ;GET VALUE BACK + TLNN ARG,UNDF + JRST ARAY3 + TLO ARG,VARF + MOVEI RC,0 ;NO RELOC + PUSHJ PP,INSERT +ARAY3: CAME PP,ARAYP + JRST NXTVAL ;STILL NAMES STACKED + JUMPCM ARAY2 + POPJ PP, + +ARAY1: TRO ER,ERRA ;ERROR EXIT + MOVE PP,ARAYP + POPJ PP, ;RESET PDL AND GO +> + IFN WFWSW,< +%LVAR: JUMP2 POPOUT ;IGNORE ON PASS2 + PUSHJ PP,LOOKUP ;SCAN SYMBOL TABLE + TRNN ARG,EXTF ;THESE ARE LVARS WE HAVE DONE ONCE + TRNN ARG,VARF ;FOR VARIABLES + POPJ PP, ;IGNORE ALL OTHERS + TRZ ARG,UNDF ;SET AS DEFINED + MOVEI RC,3 + ADDB RC,FREE + CAML RC,SYMBOL ;GET BLOCK + PUSHJ PP,XCEEDS + SUBI RC,2 ;POINT TO START OF BLOCK + ADDI V,1 + EXCH V,LVARLC ;GET CORRECT VARIABLE LOCATION + MOVEM V,2(RC) ;SAVE IT + ADDM V,LVARLC ;AND UPDATE BASE + SETZM (RC) + SETZM 1(RC) ;NO NAME TO IDENT AN LVAR AND NO FIXUPS + HRL ARG,RC ;POINTER + TRO ARG,EXTF!PNTF ;FLAG AS EXTERNAL AND POINTER + MOVSM ARG,(SX) ;PUT IT AWAY + POPJ PP, +> + ; PSEUDO-END STATEMENT FOR MULTI-FILE CAPABILITY + +; HERE IF PRGEND (PASS 1) +PSEND0: TLO IO,MFLSW ;PSEND SEEN + PUSHJ PP,END0 ;AS IF END STATEMENT + HLLZS IO ;CLEAR ER(RH) + SETZM ERRCNT ;CLEAR ERROR COUNT FOR EACH PROG. + JUMP2 PSEND2 ;DIFFERENT ON PASS2 + SKIPE UNIVSN ;SEEN A UNIVERSAL + PUSHJ PP,UNISYM ;YES, STORE SYMBOLS + PUSHJ PP,PSEND4 ;SAVE SYMBOLS, POINTERS AND TITLE + TLZ IO,IOTLSN ;CLEAR TITLE SEEN FLAG +PSEND1: TLZ IO,MFLSW ;FOR NEXT FILE + SETZM UNISCH ;CLEAR UNIVERSAL SEARCH TABLE + MOVE AC0,[UNISCH,,UNISCH+1] + BLT AC0,UNISCH+.UNIV-1 + PUSHJ PP,OUTFF ;RESET PAGE COUNT + MOVSI AC0,1 ;SET SO RELOC 0 WORKS + JRST LOC10 ;FOR RELOC 0 + +; HERE IF PRGEND (PASS 2) +PSEND2: SETZM SBUF ;SO SUBTTL IS NOT WRONG + PUSHJ PP,PSEND5 ;PUT TITLE BACK + PUSHJ PP,PSEND1 ;COMMON CODE + JRST PASS20 ;OUTPUT THE ENTRIES + +; HERE IF END (PASS 1) +PSEND3: PUSHJ PP,PSEND4 ;SAVE LAST PROGRAM + HLRS PRGPTR ;REINITIALIZE POINTER + PUSHJ PP,PSEND5 ;READ BACK FIRST PROGRAM + JRST PASS20 + ;HERE TO SAVE AND RESTORE SYMBOL TABLE, TITLE AND OTHER USEFUL LOCATIONS + XTRA==4 ;NUMBER OF OTHER LOCATIONS TO SAVE + +PSEND4: MOVE V,FREE ;GET NEXT FREE LOCATION + ADDI V,LENGTH+.TBUF/5+XTRA + CAML V,SYMBOL ;WILL WORST CASE FIT? + PUSHJ PP,XCEED ;NO, EXPAND + MOVS V,FREE + HRR V,PRGPTR ;LAST PRGEND BLOCK + HLRM V,(V) ;LINK THIS BLOCK + SKIPN PRGPTR ;IF FIRST TIME + HLLZM V,PRGPTR ;SET LINK TO START OF CHAIN + HLRM V,PRGPTR ;POINTER TO IT + SETZM @FREE ;CLEAR LINK WORD + AOS FREE ;THIS LOCATION USED NOW + MOVS AC0,SYMBOL ;BOTTOM OF SYMBOL TABLE + HRR AC0,FREE ;FREE SPACE + MOVE V,@SYMBOL ;GET NUMBER OF SYMBOLS + ASH V,1 ;TWO WORDS PER SYMBOL + ADDI V,1 ;ONE MORE FOR COUNT + ADDB V,FREE ;END OF TABLE WHEN MOVED + BLT AC0,(V) ;MOVE TABLE + HRRZ AC0,JOBREL ;TOP OF CORE + SUBI AC0,1 + MOVEM AC0,SYMTOP ;FOR NEXT SYMBOL TABLE + SUBI AC0,LENGTH ;LENGTH OF INITIAL SYMBOLS + MOVEM AC0,SYMBOL ;SET POINTER TO COUNT OF SYMBOLS + HRLI AC0,SYMNUM ;BLT POINTER + BLT AC0,@SYMTOP ;SET UP INITIAL SYMBOL TABLE + PUSHJ PP,SRCHI ;SET UP SEARCH POINTER + MOVEI AC0,.TBUF ;MAX NUMBER OF CHARS. IN TITLE + SUB AC0,TCNT ;ACTUAL NUMBER + IDIVI AC0,5 ;NUMBER OF WORDS + SKIPE AC1 ;REMAINDER? + ADDI AC0,1 ;YES + MOVEM AC0,@FREE ;STORE COUNT + AOS FREE ;THIS LOCATION USED NOW + EXCH AC0,FREE ;SET UP AC0 FOR BLT + ADDM AC0,FREE ;WILL BE AFTER TITLE MOVES + HRLI AC0,TBUF ;BLT POINTER + BLT AC0,@FREE ;MOVE TITLE + MOVE AC2,LITHDX ;POINTER TO LIT INFO. + MOVE AC0,-1(AC2) ;SIZE OF PASS1 LOCO + PUSHJ PP,STORIT ;SAVE IT IN SYMBOL TABLE + MOVE AC2,VARHDX ;SAME FOR VARS + MOVE AC0,-1(AC2) + PUSHJ PP,STORIT +IFN RENTSW,< + MOVE AC0,HISNSW ;GET TWOSEG/HISEG FLAG + HRR AC0,HIGH1 ;AND PASS1 BREAK + PUSHJ PP,STORIT + JUMPGE AC0,PSEND6 ;NOT TWOSEG + MOVE AC0,SVTYP3 ;HIGH SEGMENT OFFSET + PUSHJ PP,STORIT ;SAVE IT ALSO> +PSEND6: MOVE AC0,FREE ;GET NEXT FREE LOCATION + SUBI AC0,1 ;LAST ONE USED + HRRZ V,PRGPTR ;POINTER TO START OF DATA BLOCK + HRLM AC0,(V) ;LINK TO END OF BLOCK + POPJ PP, ;RETURN + + PSENDX: PUSHJ PP,XCEED ;NEED TO EXPAND CORE FIRST +PSEND5: HRRZ AC0,JOBREL ;GET TOP OF CORE + SUBI AC0,1 + MOVEM AC0,SYMTOP ;TOP OF NEW SYMBOL TABLE + HRRZ V,PRGPTR ;ADDRESS OF THIS BLOCK + JUMPE V,PSNDER ;ERROR LINK NOT SET UP + MOVE AC1,(V) ;NEXT LINK + MOVE V,1(V) ;GET ITS SYMBOL COUNT + ASH V,1 ;NUMBER OF WORDS + ADDI V,1 ;PLUS ONE FOR COUNT + SUBI AC0,(V) ;START OF NEW SYMBOL TABLE + CAMG AC0,FREE ;WILL IT FIT + JRST PSENDX ;NO, NEED TO EXPAND AND RESET AC0 + ADD V,PRGPTR ;POINT TO END OF SYMBOL TABLE + MOVEI V,1(V) ;THEN TO BEG OF TITLE + MOVEM AC0,SYMBOL ;BOTTOM OF NEW TABLE + HRL AC0,PRGPTR ;ADDRESS OF FIRST WORD OF BLOCK + ADD AC0,[1,,0] ;MAKE BLT POINTER + HRRM AC1,PRGPTR ;POINT TO NEXT BLOCK + BLT AC0,@SYMTOP ;MOVE TABLE + PUSHJ PP,SRCHI ;SET UP POINTER + MOVE AC1,(V) ;NUMBER OF WORDS OF TITLE + MOVEI AC0,1(V) ;START OF STORED TITLE + ADD V,AC1 ;INCREMENT PAST TITLE + ADDI AC1,TBUF-1 ;END OF TITLE + HRLI AC0,TBUF ;WHERE TO PUT IT + MOVSS AC0 ;BLT POINTER + BLT AC0,(AC1) ;MOVE TITLE + TLO IO,IOTLSN ;SET AS IF TITLE SEEN + MOVE AC2,LITHDX ;INVERSE OF ABOVE + PUSHJ PP,GETIT + MOVEM AC0,-1(AC2) + MOVE AC2,VARHDX ;SAME FOR VARS + PUSHJ PP,GETIT + MOVEM AC0,-1(AC2) +IFN RENTSW,< + PUSHJ PP,GETIT ;GET TWO HALF WORDS + HRRZM AC0,HIGH1 ;PASS1 BREAK + HLLEM AC0,HISNSW ;TWOSEG/HISEG FLAG + JUMPGE AC0,CPOPJ ;NOT TWOSEG + PUSHJ PP,GETIT + MOVEM AC0,SVTYP3 ;BLOCK 3 WORD> + POPJ PP, + +STORIT: MOVEM AC0,@FREE ;STORE IT IN DATA BLOCK + AOS FREE ;ADVANCE POINTER + POPJ PP, + +GETIT: MOVE AC0,1(V) ;FILL AC0 OUT OF PRGEND BLOCK + AOJA V,CPOPJ ;INCREMENT AND RETURN + +PSNDER: HRROI RC,[SIXBIT /PRGEND ERROR @/] + JRST ERRFIN + ;MULTIPLE SYMBOL TABLE FEATURE PSEUDO-OPS + +UNIV0: JUMP2 TITLE0 ;DO IT ALL ON PASS 1 + HRRZ SX,UNIVNO ;GET NUMBER OF UNIVERSALS SEEN + CAIL SX,.UNIV ;ALLOW ONE MORE? + JRST UNVERR ;NO, GIVE FATAL ERROR + AOS UNIVNO ;ONE MORE NOW + SETOM UNIVSN ;AND SET SEEN A UNIVERSAL + JRST TITLE0 ;CONTINUE AS IF TITLE + + +ADDUNV: PUSH PP,RC ;AN AC TO USE + PUSHJ PP,NOUT ;CONVERT TO SIXBIT + HRRZ RC,UNIVNO ;GET ENTRY INDEX + MOVEM AC0,UNITBL(RC) ;STORE SIXBIT NAME IN TABLE + HRRZS UNIVSN ;ONLY DO IT ONCE + POP PP,RC ;RESTORE RC + POPJ PP, ;AND RETURN + +UNVERR: HRROI RC,[SIXBIT /TOO MANY UNIVERSALS@/] + JRST ERRFIN + +UNISYM: HRRZ AC0,FREE ;GET HIGHEST FREE LOCATION + MOVEM AC0,JOBFF ;INTO JOBFF + PUSHJ PP,SUPRSA ;TURN ON SUPPRESS BIT + PUSH PP,SYMBOL ;NEED TO SAVE INCASE PRGEND + MOVE AC0,SYMTOP ;TOP OF TABLE + SUB AC0,SYMBOL ;GET LENGTH OF TABLE + HRL ARG,SYMBOL ;BOTTOM OF TABLE + HRR ARG,JOBFF ;WHERE TO GO + HRRZ RC,UNIVNO ;GET TABLE INDEX + HRRM ARG,SYMBOL ;WILL BE THERE SOON + HRRZM ARG,UNIPTR(RC) ;STORE IN CORRESPONDING PLACE + ADDB AC0,JOBFF ;WHERE TO END + HRLM AC0,UNIPTR(RC) ;SAVE NEW SYMTOP + BLT ARG,@JOBFF ;MOVE TABLE + HRRZM AC0,UNITOP ;SAVE TOP OF TABLES+1 + CAMLE AC0,MACSIZ ;IN CASE OVER A K BOUND + MOVEM AC0,MACSIZ ;DON'T REDUCE SO FAR NOW + MOVEM AC0,FREE ;JUST IN CASE IN MACRO + MOVE AC0,SRCHX ;SAVE OLD SEARCH POINTER + PUSHJ PP,SRCHI ;GET SEARCH POINTER + EXCH AC0,SRCHX + MOVEM AC0,UNISHX(RC) ;SAVE IT + SETZM UNIVSN ;CLEAR FLAG INCASE PRGEND + POP PP,SYMBOL ;RESTORE OLD VALUE + POPJ PP, ;RETURN + + SERCH0: PUSHJ PP,GETSYM ;GET A SYMBOL + JRST ERRAX ;ERROR IF NOT VALID + MOVEI RC,1 ;START AT ENTRY ONE + CAIL RC,.UNIV ;CHECK FOR CONSISTENCY ERROR + JRST SCHERR ;CANNOT FIND THIS ONE + CAME AC0,UNITBL(RC) ;LOOK FOR MATCH + AOJA RC,.-3 ;NOT FOUND YET + MOVE AC0,RC ;STORE TABLE ENTRY NUMBER + MOVEI RC,1 ;START AT ENTRY ONE + CAIL RC,.UNIV ;CHECK FOR CONSISTENCY ERROR + JRST SCHERR ;SHOULD NEVER HAPPEN!! + SKIPE UNISCH(RC) ;LOOK FOR AN EMPTY SLOT + AOJA RC,.-3 ;NOT FOUND YET + MOVEM AC0,UNISCH(RC) ;STORE INDEX IN TABLE + JUMPCM SERCH0 ;LOOK FOR MORE NAMES + POPJ PP, ;FINISHED + +SCHERR: MOVSI RC,[SIXBIT /CANNOT FIND UNIVERSAL@/] + JRST ERRFIN ;NAME IN AC0 + +;MESSAGE FOR CASE WHERE FILES AFTER UNIVERSAL USED MORE BUFFER SPACE THAN FIRST UNIVERSAL +UNIERR: HRROI RC,[SIXBIT /UNIVERSAL PROGRAM(S) MUST HAVE SAME OUTPUT SPECIFICATION AS OTHER FILES@/] + JRST ERRFIN + SUBTTL MACRO/REPEAT HANDLERS + +REPEA0: PUSHJ PP,EVALXQ ;EVALUATE REPEAT EXP, EXTERNS ARE ILL. + JUMPNC ERRAX + +REPEA1: JUMPLE AC0,REPZ ;PASS THE EXP., DONT PROCESS + SOJE AC0,REPO ;REPEAT ONCE +REPEA2: PUSHJ PP,GCHARQ ;GET STARTING "<" + CAIE C,"<" + JRST REPEA2 + PUSHJ PP,SKELI1 ;INITIALIZE SKELETON + PUSH MP,REPEXP + MOVEM AC0,REPEXP + PUSH MP,REPPNT ;STACK PREVIOUS REPEAT POINTER + MOVEM ARG,REPPNT ;STORE NEW POINTER + TDZA SDEL,SDEL ;YES, INITIALIZE BRACKET COUNT AND SKIP + +REPEA4: PUSHJ PP,WCHARQ ;WRITE A CHARACTER + PUSHJ PP,GCHARQ ;GET A CHARACTER + CAIN C,"<" ;"<"? + AOJA SDEL,REPEA4 ;YES, INCREMENT AND WRITE + CAIE C,">" ;">"? + JRST REPEA4 ;NO, WRITE THE CHARACTER + SOJGE SDEL,REPEA4 ;YES, WRITE IF NON-NEGATIVE COUNT + MOVSI CS,(BYTE (7) 177,3) ;SET "REPEAT" END + PUSHJ PP,WWRXE ;WRITE END + SKIPN LITLVL ;LITERAL MIGHT END ON LINE + SKIPE MACLVL ;IF IN MACRO DARE NOT PROCESS + JRST .+3 ;REST OF LINE SINCE MACRO MIGHT END ON IT + PUSHJ PP,BYPASS ;BYPASS + PUSHJ PP,STOUTS ;POLISH OF LINE BEFORE PROCESSING REPEAT + PUSH MP,MRP ;STACK PREVIOUS READ POINTER + PUSH MP,RCOUNT ;SAVE WORD COUNT + HRRZ MRP,REPPNT ;SET UP READ POINTER + SKIPN MACLVL ;IF IN MACRO GIVE CR-LF FIRST + SKIPE LITLVL ;SAME FOR LITERAL + JRST REPEA7 + AOJA MRP,POPOUT ;BYPASS ARG COUNT + +REPEA7: HRRZ MRP,REPPNT ;SET UP READ POINTER + ADDI MRP,1 ;BYPASS ARG COUNT +REPEA8: MOVEI C,CR + JRST RSW1 + +REPEND: SOSL REPEXP + JRST REPEA7 + HRRZ V,REPPNT ;GET START OF TREE + PUSHJ PP,REFDEC ;DECREMENT REFERENCE + POP MP,RCOUNT + POP MP,MRP + POP MP,REPPNT + POP MP,REPEXP + SKIPN LITLVL ;IF IN LITERAL OR + SKIPE MACLVL ;IF IN MACRO + JRST RSW0 ;FINISH OF LINE NOW + JRST REPEA8 + + REPZ: MOVE SDEL,SEQNO2 ;SAVE IN CASE OF END OF FILE + MOVEM SDEL,REPSEQ + MOVE SDEL,PAGENO + MOVEM SDEL,REPPG + SETOM INREP + MOVEI SDEL,0 ;SET COUNT +REPZ1: PUSHJ PP,GCHAR ;GET NEXT CHARACTER + CAIN C,"<" ;"<"? + AOJA SDEL,REPZ1 ;YES, INCREMENT COUNT + CAIN C,">" ;">"? + SOJLE SDEL,REPZ2 ;YES, EXIT IF MATCHING + JRST REPZ1 ;NO, RECYCLE +REPZ2: SETZM INREP ;FLAG OUT OF IT + SETZM INCND ;AND CONDITIONAL ALSO + JRST STMNT ;AND EXIT + +REPO: PUSHJ PP,GCHAR ;GET "<" + CAIE C,"<" + JRST REPO + SKIPE RPOLVL ;ARE WE NESTED? + AOS RPOLVL ;YES, DECREMENT CURRENT + PUSH MP,RPOLVL + SETOM RPOLVL + JRST STMNT + +REPO1: CAIN C,"<" + SOS RPOLVL + CAIN C,">" + AOSE RPOLVL + JRST RSW2 + POP MP,RPOLVL + PUSHJ PP,RSW2 + JRST RSW0 + DEFIN0: PUSHJ PP,GETSYM ;GET MACRO NAME + JRST ERRAX ;EXIT ON ERROR + MOVEM PP,PPTMP1 ;SAVE POINTER + MOVEM AC0,PPTMP2 ;SAVE NAME + TLO IO,IORPTC + MOVE SX,SEQNO2 ;SAVE IN CASE OF EOF + MOVEM SX,DEFSEQ + MOVE SX,PAGENO + MOVEM SX,DEFPG + SETOM INDEF ;AND FLAG IN DEFINE + SYN .TEMP,COMSW ;SAVE SPACE + SETZB SX,COMSW ;SET ARGUMENT AND REFERENCE COUNT AND COMMENT SWITCH +DEF02: PUSHJ PP,GCHAR ;SEARCH FOR "(" OR "<" + CAIG C,FF ;SEARCH FOR END OF LINE + CAIGE C,LF ;LF,VT, OR FF + JRST .+2 ;WASN'T ANY OF THEM + SETZM COMSW ;RESET COMMENT SWITCH + CAIN C,";" ;COMMENT? + SETOM COMSW ;YES, SET COMMENT SWITCH + SKIPE COMSW ;INSIDE A COMMENT? + JRST DEF02 ;YES, IGNORE CHARACTER + CAIN C,"<" ;"<"? + JRST DEF20 ;YES + CAIE C,"(" ;"("? + JRST DEF02 ;NO +DEF10: PUSHJ PP,GETSYM ;YES, GET DUMMY SYMBOL + TRO ER,ERRA ;FLAG ERROR + ADDI SX,1 ;INCREMENT ARG COUNT + PUSH PP,AC0 ;STACK IT + CAIN C,'<' ;A DEFAULT ARGUMENT COMING UP? + JRST DEF80 ;YES, STORE IT AWAY + CAIE C,11 ;")"? + JRST DEF10 ;NO, GET NEXT DUMMY SYMBOL +DEF12: PUSHJ PP,GCHAR + CAIE C,"<" ;"<"? + JRST DEF12 ;NO +DEF20: PUSH PP,[0] ;YES, MARK THE LIST + LSH SX,9 ;SHIFT ARG COUNT + AOS ARG,SX + PUSHJ PP,SKELI ;INITIALIZE MACRO SKELETON + MOVE AC0,PPTMP2 ;GET NAME + TLO IO,DEFCRS + PUSHJ PP,MSRCH ;SEARCH THE TABLE + JRST DEF24 ;NOT FOUND + TLNN ARG,MACF ;FOUND, IS IT A MACRO? + TROA ER,ERRX ;NO, FLAG ERROR AND SKIP + PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE +DEF24: HRRZ V,WWRXX ;GET START OF TREE + SKIPN .TEMP ;ANY DEFAULT ARGUMENTS TO TAKE CARE OF? + JRST DEF25 ;NO + HRRZ C,1(V) ;GET SHIFTED ARG COUNT + LSH C,-9 ;GET ARG COUNT BACK + ADDI C,1 ;ONE MORE FOR TERMINAL ZERO + ADD C,.TEMP ;NUMBER OF ITEMS IN STACK + HRLS C ;MAKE XWD + SUB PP,C ;BACK UP STACK + MOVE SDEL,.TEMP ;NUMBER OF WORDS NEEDED + ADDB SDEL,FREE ;FROM FREE CORE + CAML SDEL,SYMBOL ;MORE CORE NEEDED + PUSHJ PP,XCEEDS ;YES, TRY TO GET IT + SUB SDEL,.TEMP ;FORM POINTER + HRLM SDEL,1(V) ;STORE IT WITH ARG COUNT IN MACRO + SUBI SDEL,1 ;TO USE FOR PUSHING POINTER INTO STORAGE + MOVEI C,1(PP) ;POINT TO START OF STACK +DEF26: MOVE ARG,(C) ;GET AN ITEM OFF STACK + TLNN ARG,-40 ;A POINTER? + JUMPN ARG,[PUSH SDEL,ARG ;YES, STORE IT + AOJA C,DEF26] ;GET NEXT + PUSH PP,ARG ;RESTACK ARGUMENT + SKIPE ARG ;FINISHED IF ZERO + AOJA C,DEF26 ;GET NEXT + PUSH SDEL,ARG ;STORE ZERO IN DEFAULT LIST ALSO + DEF25: MOVSI ARG,MACF + MOVEM PP,PPTMP2 ;STORE TEMP STORAGE POINTER + PUSHJ PP,INSERT ;INSERT/UPDATE + TLZ IO,DEFCRS ;JUST IN CASE + SETZM ARGF ;NO ARGUMENT SEEN + SETZM SQFLG ;AND NO ' SEEN + TDZA SDEL,SDEL ;CLEAR BRACKET COUNT +DEF30: PUSHJ PP,WCHAR ;WRITE CHARACTER +DEF31: PUSHJ PP,GCHAR ;GET A CHARACTER +DEF32: MOVE CS,C ;GET A COPY + CAIN C,";" ;IS IT A COMMENT + JRST CPEEK ;YES CHECK FOR ;; +DEF33: CAIG CS,"Z"+40 ;CONVERT LOWER CASE + CAIGE CS,"A"+40 + JRST .+2 + SUBI CS,40 + CAIGE CS,40 ;TEST FOR CONTROL CHAR. + JRST [SKIPN SQFLG ;HAS SINGLE QUOTE BEEN SEEN? + JRST DEF30 ;NO, OUTPUT THIS CHAR. + PUSH PP,C ;YES, SAVE CURRENT CHAR + MOVEI C,47 ;SET UP QUOTE + PUSHJ PP,WCHAR;WRITE IT + POP PP,C ;GET BACK CURRENT CHAR. + SETZM SQFLG ;RESET FLAG + JRST DEF30] ;AND CONTINUE + CAILE CS,77+40 + JRST DEF30 ;TEST FOR SPECIAL + MOVE CS,CSTAT-40(CS) ;GET STATUS BITS + TLNE CS,6 ;ALPHA-NUMERIC? + JRST DEF40 ;YES + SKIPN SQFLG ;WAS A ' SEEN? + JRST DEF36 ;NO, PROCESH + PUSH PP,C ;YES, SAVE CURRENT CHARACTER + MOVEI C,47 ;AND PUT IN A ' + PUSHJ PP,WCHAR ;... + POP PP,C ;RESTORE CURRENT CHARACTER + SETZM SQFLG ;AND RESET FLAG +DEF36: CAIE C,47 ;IS THIS A '? + JRST DEF35 ;NOPE + SKIPN ARGF ;YES, WAS LAST THING SEEN AN ARG? + SETOM SQFLG ;IF NOT, SET SNGL QUOT FLAG + SETZM ARGF ;BUT NOT ARGUMENT IN ANY CASE + JRST DEF31 ;GO GET NEXT CHARACTER + DEF35: SETZM ARGF ;THIS IS NOT AN ARGUMENT + CAIN C,"<" ;"<"? + AOJA SDEL,DEF30 ;YES, INCREMENT COUNT AND WRITE + CAIN C,">" ;">"? + SOJL SDEL,DEF70 ;YES, TEST FOR END + JRST DEF30 ;NO, WRITE IT + +CPEEK: TLNN IO,IOPALL ;IF LALL IS ON + JRST DEF33 ;JUST RETURN + PUSHJ PP,PEEK ;LOOK AT NEXT CHAR. + CAIN C,";" ;IS IT ;;? + JRST CPEEK1 ;YES + MOVE C,CS ;RESTORE C + JRST DEF33 ;AND RETURN + +CPEEK1: PUSHJ PP,GCHAR ;GET THE CHAR. + CAIE C,">" ;RETURN IF END OF MACRO + CAIG C,CR ;IS CHAR ONE OF + CAIGE C,LF ;LF,VT,FF,CR + JRST CPEEK1 ;NO,SO GET NEXT CHAR. + JRST DEF32 ;YES,RETURN AND STORE + DEF40: MOVEI AC0,0 ;CLEAR ATOM + MOVSI AC1,(POINT 6,AC0) ;SET POINTER +DEF42: PUSH PP,C ;STACK CHARACTER + TLNE AC1,770000 ;HAVE WE STORED 6? + IDPB CS,AC1 ;NO, STORE IN ATOM + PUSHJ PP,GCHAR ;GET NEXT CHARACTER + MOVE CS,C + CAIG CS,"Z"+40 + CAIGE CS,"A"+40 + JRST .+2 + SUBI CS,40 ;CONVERT LOWER TO UPPER + CAIL CS,40 + CAILE CS,77+40 + JRST DEF44 ;TEST SPECIAL + MOVE CS,CSTAT-40(CS) ;GET STATUS + TLNE CS,6 ;ALPHA-NUMERIC? + JRST DEF42 ;YES, GET ANOTHER +DEF44: PUSH PP,[0] ;NO, MARK THE LIST + MOVE SX,PPTMP1 ;GET POINTER TO TOP + +DEF46: SKIPN 1(SX) ;END OF LIST? + JRST DEF50 ;YES + CAME AC0,1(SX) ;NO, DO THEY COMPARE? + AOJA SX,DEF46 ;NO, TRY AGAIN + SUB SX,PPTMP1 ;YES, GET DUMMY SYMBOL NUMBER + LSH SX,4 + MOVSI CS,<(BYTE (7) 177,101)>(SX) ;SET ESCAPE CODE MACEND + LSH AC0,-^D30 + CAIN AC0,5 ;"%"? + TLO CS,1000 ;YES, SET CRESYM FLAG + PUSHJ PP,WWORD ;WRITE THE WORD + SETOM ARGF ;SET ARGUMENT SEEN FLAG + SETZM SQFLG ;AND IGNORE ANY ' WAITING TO GET INTO STRING +DEF48: MOVE PP,PPTMP2 ;RESET PUSHDOWN POINTER + TLO IO,IORPTC ;ECHO LAST CHARACTER + JRST DEF31 ;RECYCLE + +DEF50: + SKIPN SQFLG ;HAVE WE SEEN A '? + JRST DEF51 ;NOPE + MOVEI C,47 ;YES, PUT IT IN + PUSHJ PP,WCHAR ;... + SETZM SQFLG ;AND CLEAR FLAG +DEF51: MOVE C,2(SX) ;GET CHARACTER + JUMPE C,DEF48 ;CLEAN UP IF END + PUSHJ PP,WCHAR ;WRITE THE CHARACTER + AOJA SX,DEF51 ;GET NEXT + +DEF70: MOVE PP,PPTMP1 ;RESTORE PUSHDOWN POINTER + MOVSI CS,(BYTE (7) 177,1) + PUSHJ PP,WWRXE ;WRITE END + SETZM INDEF ;OUT OF IT + JRST BYPASS + ; HERE TO STORE DEFAULT ARGUMENTS + +DEF80: AOS .TEMP ;COUNT ONE MORE + PUSHJ PP,SKELI1 ;INITIALIZE SKELETON + HRL V,SX ;SYMBOL NUMBER + PUSH PP,V ;STORE POINTER + TDZA SDEL,SDEL ;ZERO BRACKET COUNT +DEF81: PUSHJ PP,WCHARQ ;WRITE A CHARACTER + PUSHJ PP,GCHARQ ;GET A CHARACTER + CAIN C,"<" ;ANOTHER "<"? + AOJA SDEL,DEF81 ;YES, INCREMENT AND WRITE + CAIE C,">" ;CLOSING ANGLE? + JRST DEF81 ;NO, JUST WRITE THE CHAR. + SOJGE SDEL,DEF81 ;YES, WRITE IF NOT END + MOVSI CS,(BYTE (7) 177,2) + PUSHJ PP,WWRXE ;WRITE END OF DUMMY ARGUMENT + PUSHJ PP,GCHAR ;READ AT NEXT CHAR. + CAIE C,")" ;END OF ARGUMENT LIST? + JRST DEF10 ;NO, GET NEXT SYMBOL + JRST DEF12 ;YES, LOOK FOR "<" + SUBTTL MACRO CALL PROCESSOR +CALLM: SKIPGE MACENL ;ARE WE TRYING TO RE-ENTER? + JRST ERRAX ;YES, BOMB OUT WITH ERROR + HRROS MACENL ;FLAG "CALLM IN PROGRESS" + EXCH MP,RP + PUSH MP,V ;STACK FOR REFDEC + EXCH MP,RP + MOVEM AC0,CALNAM ;SAVE MACRO NAME INCASE OF ERROR + MOVE SDEL,SEQNO2 ;SAVE IN CASE OF EOF + MOVEM SDEL,CALSEQ + MOVE SDEL,PAGENO + MOVEM SDEL,CALPG + ADDI V,1 ;POINT TO DUMMY SYMBOL COUNT + AOS SDEL,0(V) ;INCREMENT ARG COUNT + HLLZM SDEL,.TEMP ;DEFAULT ARG POINTER IF NON-ZERO + LSHC SDEL,-^D<9+36> ;ZERO SDEL, GET ARG COUNT IN SX + ANDI SX,777 ;MASK + SKIPE .TEMP ;IF AT LEAST ONE DEFAULT ARG + HRRM SX,.TEMP ;STORE COUNT OF ARGS + PUSH PP,V ;STACK FOR MRP + PUSH PP,RP ;STACK FOR MACPNT + JUMPE SX,MAC20 ;TEST FOR NO ARGS + PUSHJ PP,CHARAC + CAIE C,"(" ;"(" + TROA SDEL,-1 ;NO, FUDGE PAREN COUNT AND SKIP + +MAC10: PUSHJ PP,GCHAR ;GET A CHARACTER, LOOK FOR AN ARG + CAIG C,CR + CAIGE C,LF + CAIN C,";" ;";"? + JRST MAC21 ;YES, END OF ARGUMENT STRING + + PUSHJ PP,SKELI1 ;NO, INITIALIZE SKELETON + CAIN C,"<" ;"<"? + JRST MAC30 ;YES, PROCESS AS SPECIAL + CAIE C,176 + CAIN C,134 ;"\" + JRST MAC40 ;YES, PROCESS SYMBOL + +MAC14: CAIN C,"," ;","? + JRST MAC16 ;YES; NULL SYMBOL + CAIN C,"(" ;"("? + ADDI SDEL,1 ;YES, INCREMENT COUNT + CAIN C,")" ;")"? + SOJL SDEL,MAC16 ;YES, TEST FOR END + PUSHJ PP,WCHAR ;WRITE INTO SKELETON +MAC14A: PUSHJ PP,CHARAC ;GET NEXT CHARACTER + CAIG C,CR + CAIGE C,LF + JRST .+2 + JRST MAC15 ;TEST FOR END OF LINE + CAIE C,";" ;";"? + JRST MAC14 ;YES, END OF LINE + +MAC15: TLO IO,IORPTC +MAC16: MOVSI CS,(BYTE (7) 177,2) + PUSHJ PP,WWRXE ;WRITE END + EXCH MP,RP + PUSH MP,WWRXX + EXCH MP,RP + SOJLE SX,MAC20 ;BRANCH IF NO MORE ARGS + JUMPGE SDEL,MAC10 ;HAVEN'T SEEN TERMINAL ")" YET + MAC20: TLZN IO,IORPTC + PUSHJ PP,CHARAC +MAC21: EXCH MP,RP + JUMPE SX,MAC21B ;NO MISSING ARGS +MAC21A: PUSH MP,[-1] ;FILL IN MISSING ARGS + SKIPN .TEMP ;ANY DEFAULT ARGS? + JRST MAC21C ;NO + HRRZ C,.TEMP ;GET ARG COUNT + SUBI C,-1(SX) ;ACCOUNT FOR THOSE GIVEN + HRLZS C ;PUT IN LEFT HALF + HLRZ SDEL,.TEMP ;ADDRESS OF TABLE +MAC21D: SKIPN (SDEL) ;END OF LIST + JRST MAC21C ;YES + XOR C,(SDEL) ;TEST FOR CORRECT ARG + TLNN C,-1 ;WAS IT? + JRST MAC21E ;YES + XOR C,(SDEL) ;BACK THE WAY IT WAS + AOJA SDEL,MAC21D ;AND TRY AGAIN + +MAC21E: MOVEM C,(MP) ;REPLACE -1 WITH TREE POINTER + AOS 1(C) ;INCREMENT REFERENCE +MAC21C: SOJG SX,MAC21A +MAC21B: PUSH MP,[0] ;SET TERMINAL + HRRZ C,LIMBO + TLNN IO,IOSALL ;SUPPRESSING ALL? + JRST MAC23 ;NO + JUMPN MRP,MAC27 ;IN MACRO? + CAIE C,";" ;NO,IN COMMENT? + JRST MAC26 ;NO +MAC22: PUSHJ PP,CHARAC ;YES,GET IT INTO THE LBUF + CAIG C,CR ;LESS THAN CR? + CAIGE C,LF ;AND GREATER THAN LF? + JRST MAC22 ;NO GET ANOTHER +MAC26: HRLZI SX,70000 ;DECREMENT BYTE POINTER + ADDB SX,LBUFP + JUMPGE SX,MAC27 + HRLOI SX,347777 + ADDM SX,LBUFP +MAC27: HRLI C,-1 ;SET FLAG + JRST MAC25 + +MAC23: MOVEI SX,"^" + JUMPAD MAC24 ;BRANCH IF ADDRESS FIELD + CAIN C,";" ;IF SEMI-COLON + SKIPE LITLVL ;AND NOT IN A LITERAL + JRST MAC24 ;NOT BOTH TRUE + JUMPN MRP,MAC24 ;OR IN A MACRO + PUSHJ PP,STOUT ;LIST COMMENT OR CR-LF + TLNE IO,IOPALL ;MACRO EXPANSION SUPPRESSION? + TLO IO,IOMAC ; NO, SET TEMP BIT + TDOA C,[-1] ;FLAG LAST CHARACTER +MAC24: DPB SX,LBUFP ;SET ^ INTO LINE BUFFER +MAC25: PUSH MP,MACPNT + POP PP,MACPNT + PUSH MP,C + PUSH MP,RCOUNT ;STACK WORD COUNT + PUSH MP,MRP ;STACK MACRO POINTER + POP PP,MRP ;SET NEW READ POINTER + EXCH MP,RP + AOS MACLVL + HRRZS MACENL ;RESET "CALLM IN PROGRESS" + JUMPOC STMNT2 ;OP-CODE FIELD + JRST EVATOM ;ADDRESS FIELD + + MAC30: MOVEI AC0,0 ;INITIALIZE BRACKET COUNTER +MAC31: PUSHJ PP,GCHAR ;GET A CHARACTER + CAIN C,"<" ;"<"? + ADDI AC0,1 ;YES, INCREMENT COUNT + CAIN C,">" ;">"? + SOJL AC0,MAC14A ;YES, EXIT IF MATCHING + PUSHJ PP,WCHAR ;WRITE INTO SKELETON + JRST MAC31 ;GO BACK FOR ANOTHER + +MAC40: PUSH PP,SX ;STACK REGISTERS + PUSH PP,SDEL + HLLM IO,TAGINC ;SAVE IO FLAGS + PUSHJ PP,CELL ;GET AN ATOM + MOVE V,AC0 ;ASSUME NUMERIC + TLNE IO,NUMSW ;GOOD GUESS? + JRST MAC41 ;YES + PUSHJ PP,SSRCH ;SEARCH THE SYMBOL TABLE + TROA ER,ERRX ;NOT FOUND, ERROR +MAC41: PUSHJ PP,MAC42 ;FORM ASCII STRING + HLL IO,TAGINC ;RESTORE IO FLAGS + POP PP,SDEL + POP PP,SX + TLO IO,IORPTC ;REPEAT LAST CHARACTER + JRST MAC14A ;RETURN TO MAIN SCAN + +MAC42: MOVE C,V +MAC44: LSHC C,-^D35 + LSH CS,-1 + DIVI C,0(RX) ;DIVIDE BY CURRENT RADIX + HRLM CS,0(PP) + JUMPE C,.+2 ;TEST FOR END + PUSHJ PP,MAC44 + HLRZ C,0(PP) + ADDI C,"0" ;FORM TEXT + JRST WCHAR ;WRITE INTO SKELETON + MACEN0: SOS MACENL +MACEND: SKIPGE C,MACENL ;TEST "CALLM IN PROGRESS" + AOS MACENL ;INCREMENT END LEVEL AND EXIT + JUMPL C,REPEA8 + EXCH MP,RP + POP MP,MRP ;RETRIEVE READ POINTER + POP MP,RCOUNT ;AND WORD COUNT + MOVEI C,"^" + SKIPL 0(MP) ;TEST FLAG + PUSHJ PP,RSW2 ;MARK END OF SUBSTITUTION + POP MP,C + POP MP,ARG + SKIPA MP,MACPNT ;RESET MP AND SKIP +MACEN1: PUSHJ PP,REFDEC ;DECREMENT REFERENCE +MACEN2: AOS V,MACPNT ;GET POINTER + MOVE V,0(V) + JUMPG V,MACEN1 ;IF >0, DECREMENT REFERENCE + JUMPL V,MACEN2 ;IF <0, BYPASS + POP MP,V ;IF=0, RETRIEVE POINTER + PUSHJ PP,REFDEC ;DECREMENT REFERENCE + MOVEM ARG,MACPNT + EXCH MP,RP + SOS MACLVL + SKIPN MACENL ;CHECK UNPROCESSED END LEVEL + JRST MACEN3 ;NONE TO PROCESS + TRNN MRP,-1 ;MRP AT END OF TEXT + JRST MACEN0 ;THEN POP THE MACRO STACK NOW +MACEN3: TRNN C,77400 ;SALL FLAG? + HRLI C,0 ;YES,TURN IT OFF + JUMPL C,REPEA8 ;IF FLAG SET SUBSTITUTE + JRST RSW1 + IRP0: SKIPN MACLVL ;ARE WE IN A MACRO? + JRST ERRAX ;NO, BOMB OUT +IRP10: PUSHJ PP,MREADS ;YES, GET DATA SPEC + CAIE C,40 ;SKIP LEADING BLANKS + CAIN C,"(" ;"("? + JRST IRP10 ;YES, BYPASS + CAIN C,11 + JRST IRP10 + CAIE C,177 ;NO, IS IT SPECIAL? + JRST ERRAX ;NO, ERROR + PUSHJ PP,MREADS ;YES + TRZN C,100 ;CREATED? + JRST ERRAX + CAIL C,40 ;TOO BIG? + JRST ERRAX + ADD C,MACPNT ;NO, FORM POINTER TO STACK + PUSH MP,IRPCF ;STACK PREVIOUS POINTERS + PUSH MP,IRPSW + PUSH MP,IRPARP + PUSH MP,IRPARG + PUSH MP,IRPCNT + PUSH MP,0(C) + PUSH MP,IRPPOI + + HRRZM C,IRPARP + MOVEM AC0,IRPCF ;IRPC FLAG FOUND IN AC0 + SETOM IRPSW ;RESET IRP SWITCH + MOVE CS,0(C) + MOVEM CS,IRPARG + + PUSHJ PP,MREADS + CAIE C,"<" ;"<"? + JRST .-2 ;NO, SEARCH UNTIL FOUND + PUSHJ PP,SKELI1 ;INITIALIZE NEW STRING + MOVEM ARG,IRPPOI ;SET NEW POINTER + + TDZA SDEL,SDEL ;ZERO BRACKET COUNT AND SKIP +IRP20: PUSHJ PP,WCHAR1 + PUSHJ PP,MREADS + CAIN C,"<" ;"<"? + AOJA SDEL,IRP20 ;YES, INCREMENT COUNT AND WRITE + CAIE C,">" ;">"? + JRST IRP20 ;NO, JUST WRITE IT + SOJGE SDEL,IRP20 ;YES, WRITE IF NOT MATCHING + MOVE CS,[BYTE (7) 15,177,4] + PUSHJ PP,WWRXE ;WRITE END + PUSH MP,MRP ;STACK PREVIOUS READ POINTER + PUSH MP,RCOUNT ;AND WORD COUNT + SKIPG CS,IRPARG + JRST IRPPOP ;EXIT IF NOT VALID ARGUMENT + MOVEI C,1(CS) ;INITIALIZE POINTER + MOVEM C,IRPARG + IRPSET: EXCH MRP,IRPARG ;SWAP READ POINTERS + MOVE SX,RCOUNT ;SWAP COUNT OF WORDS TO READ + EXCH SX,IRPCNT + MOVEM SX,RCOUNT + PUSHJ PP,SKELI1 ;INITIALIZE SKELETON FOR DATA + HRRZM ARG,@IRPARP ;STORE NEW DS POINTER + SETZB SX,SDEL ;ZERO FOUND FLAG AND BRACKET COUNT + LDB C,MRP ;GET LAST CHAR + CAIN C,"," + SKIPE IRPCF ;IN IRPC + JRST IRPSE1 ;NO + MOVEI SX,1 ;FORCE ARGUMENT +IRPSE1: PUSHJ PP,MREADS + CAIE C,177 ;SPECIAL? + AOJA SX,IRPSE2 ;NO, FLAG AS FOUND + PUSHJ PP,PEEKM ;LOOK AT NEXT CHARACTER + SETZM IRPSW ;SET IRP SWITCH + JUMPG SX,IRPSE4 ;IF ARG FOUND, PROCESS IT + JRST IRPPOP ;NO, CLEAN UP AND EXIT + +IRPSE2: SKIPE IRPCF ;IRPC? + JRST IRPSE3 ;YES, WRITE IT + CAIN C,"," ;NO, IS IT A COMMA? + JUMPE SDEL,IRPSE4 ;YES, EXIT IF NOT NESTED + CAIN C,"<" ;"<"? + ADDI SDEL,1 ;YES, INCREMENT COUNT + CAIN C,">" ;">"? + SUBI SDEL,1 ;YES, DECREMENT COUNT + +IRPSE3: PUSHJ PP,WCHAR + SKIPN IRPCF ;IRPC? + JRST IRPSE1 ;NO, GET NEXT CHARACTER + +IRPSE4: MOVSI CS,(BYTE (7) 177,2) + PUSHJ PP,WWRXE ;WRITE END + MOVEM MRP,IRPARG ;SAVE POINTER + MOVE MRP,RCOUNT ;SAVE COUNT + MOVEM MRP,IRPCNT + HRRZ MRP,IRPPOI ;SET FOR NEW SCAN + AOJA MRP,REPEA8 ;ON ARG COUNT + STOPI0: SKIPN IRPARP ;IRP IN PROGRESS? + JRST ERRAX ;NO, ERROR + SETZM IRPSW ;YES, SET SWITCH + POPJ PP, + +IRPEND: MOVE V,@IRPARP + PUSHJ PP,REFDEC + SKIPE IRPSW ;MORE TO COME? + JRST IRPSET ;YES + +IRPPOP: MOVE V,IRPPOI + PUSHJ PP,REFDEC ;DECREMENT REFERENCE + POP MP,RCOUNT + POP MP,MRP ;RESTORE CELLS + POP MP,IRPPOI + POP MP,@IRPARP + POP MP,IRPCNT + POP MP,IRPARG + POP MP,IRPARP + POP MP,IRPSW + POP MP,IRPCF + JRST REPEA8 + GETDS: ;GET DUMMY SYMBOL NUMBER + MOVE CS,C ;USE CS FOR WORK REGISTER + ANDI CS,37 ;MASK + ADD CS,MACPNT ;ADD BASE ADDRESS + MOVE V,0(CS) ;GET POINTER FLAG + JUMPG V,GETDS1 ;BRANCH IF POINTER + TRNN C,40 ;NOT POINTER, SHOULD WE CREATE? + JRST RSW0 ;NO, FORGET THIS ARG + PUSH PP,WWRXX + PUSH PP,MWP ;STACK MACRO WRITE POINTER + PUSH PP,WCOUNT ;SAVE WORD COUNT + PUSHJ PP,SKELI1 ;INITIALIZE SKELETON + MOVEM ARG,0(CS) ;STORE POINTER + MOVE CS,[BYTE (7) 0,170,170,170,171] ;CREATE A SYMBOL + ADD CS,LSTSYM ;LSTSYM= # OF LAST CREATED + TDZ CS,[BYTE (7) 0,170,170,170,170] + MOVEM CS,LSTSYM + IOR CS,[ASCII /.0000/] + MOVEI C,"." + PUSHJ PP,WCHAR + PUSHJ PP,WWORD ;WRITE INTO SKELETON + MOVSI CS,(BYTE (7) 177,2) + PUSHJ PP,WWRXE ;WRITE END CODE + POP PP,WCOUNT ;RESTORE WORD COUNT + POP PP,MWP ;RESTORE MACRO WRITE POINTER + POP PP,WWRXX + MOVE V,ARG ;SET UP FOR REFINC + +GETDS1: PUSHJ PP,REFINC ;INCREMENT REFERENCE + HRL V,RCOUNT ;SAVE WORD COUNT + PUSH MP,V ;STACK V FOR DECREMENT + PUSH MP,MRP ;STACK READ POINTER + MOVEI MRP,1(V) ;FORM READ POINTER + JRST RSW0 ;EXIT + +DSEND: POP MP,MRP + POP MP,V + HLREM V,RCOUNT ;RESTORE WORD COUNT + HRRZS V ;CLEAR COUNT + PUSHJ PP,REFDEC ;DECREMENT REFERENCE + JRST RSW0 ;EXIT + SKELI1: MOVEI ARG,1 ;ENTRY FOR SINGLE ARG +SKELI: SETZ MWP, ;SIGNAL FIRST TIME THROUGH + PUSHJ PP,SKELWL ;GET POINTER WORD + HRRZM MWP,WWRXX ;SAVE FIRST ADDRESS + HRRZM MWP,LADR ;SAVE START OF LINKED LIST + HRRZM ARG,1(MWP) ;STORE COUNT + SOS WCOUNT ;ACCOUNT FOR WORD + HRRZ ARG,WWRXX ;SET FIRST ADDRESS + ADDI MWP,2 ;BUMP POINTER + HRLI MWP,(POINT 7) ;SET FOR 5 ASCII BYTES + ;SKELW RETURNS WITH ADR OF NEXT FREE LOC IN V (RIGHT) + +SKELW: SOSLE WCOUNT ;STILL SOME SPACE IN LEAF? + POPJ PP, ;YES, RETURN +SKELWL: SKIPE V,NEXT ;GET FIRST FREE ADDRESS + JRST SKELW1 ;IF NON-ZERO, UPDATE FREE + MOVE V,FREE ;GET FREE + ADDI V,.LEAF ;INCREMENT BY LEAF SIZE + CAML V,SYMBOL ;OVERFLOW? + PUSHJ PP,XCEED ;YES, BOMB OUT + EXCH V,FREE ;UPDATE FREE + SETZM (V) ;CLEAR LINK + +SKELW1: HLL V,0(V) ;GET ADDRESS + HLRM V,NEXT ;UPDATE NEXT + SKIPE MWP ;IF FIRST TIME + HRLM V,1-.LEAF(MWP) ;STORE LINK IN FIRST WORD OF LEAF + MOVEI MWP,.LEAF ;SIZE OF LEAF + MOVEM MWP,WCOUNT ;STORE FOR COUNT DOWN + MOVEI MWP,(V) ;SET UP WRITE POINTER + TLO MWP,(POINT 7,,21) ;2 ASCII CHARS + POPJ PP, + + ;WWRXX POINTS TO END OF TREE + ;MWP IDPB POINTER TO NEXT HOLE + ;NEXT FIRST OF A LINKED PORTION THAT IS NOT BEING USED (LEAVES) + ;FREE POINTS TO FREE CORE BETWEEN TREE AND SYM-TABLE + ;LADR POINTS TO BEG OF LINKED PORTION. + GCHARQ: JUMPN MRP,MREADS ;IF GETTING CHAR. FROM TREE +GCHAR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER + CAIG C,FF ;TEST FOR LF, VT OR FF + CAIGE C,LF + POPJ PP, ;NO + JRST OUTIM1 ;YES, LIST IT + +WCHARQ: +WCHAR: +WCHAR1: TLNN MWP,760000 ;END OF WORD? + PUSHJ PP,SKELW ;YES, GET ANOTHER + IDPB C,MWP ;STORE CHARACTER + POPJ PP, + +WWORD: LSHC C,7 ;MOVE ASCII INTO C + PUSHJ PP,WCHAR1 ;STORE IT + JUMPN CS,WWORD ;TEST FOR END + POPJ PP, ;YES, EXIT + +WWRXE: PUSHJ PP,WWORD ;WRITE LAST WORD + ADD MWP,WCOUNT ;GET TO END OF LEAF + SUBI MWP,.LEAF ;NOW POINT TO START OF IT + HRRZS (MWP) ;ZERO LEFT HALF OF LAST LEAF + HRRM MWP,@WWRXX ;SET POINTER TO END + POPJ PP, + MREAD: PUSHJ PP,MREADS ;READ ONE CHARACTER + CAIE C,177 ;SPECIAL? + JRST RSW1 ;NO, EXIT + PUSHJ PP,MREADS ;YES, GET CODE WORD + TRZE C,100 ;SYMBOL? + JRST GETDS ;YES + CAILE C,4 ;POSSIBLY ILLEGAL + JRST ERRAX ;YUP + HRRI MRP,0 ;NO, SIGNAL END OF TEXT + JRST .+1(C) + PUSHJ PP,XCEED + JRST MACEND ;1; END OF MACRO + JRST DSEND ;2; END OF DUMMY SYMBOL + JRST REPEND ;3; END OF REPEAT + JRST IRPEND ;4; END OF IRP + +MREADI: HRLI MRP,700 ;SET UP BYTE POINTER + MOVEI C,.LEAF-1 ;NUMBER OF WORDS + MOVEM C,RCOUNT +MREADS: TLNN MRP,-1 ;FIRST TIME HERE? + JRST MREADI ;YES, SET UP MRP AND RCOUNT + TLNN MRP,760000 ;HAVE WE FINISHED WORD? + SOSLE RCOUNT ;YES, STILL ROOM IN LEAF? + JRST MREADC ;STILL CHAR. IN LEAF + HLRZ MRP,1-.LEAF(MRP);YES, GET LINK + HRLI MRP,(POINT 7,,21) ;SET POINTER + MOVEI C,.LEAF ;RESET COUNT + MOVEM C,RCOUNT +MREADC: ILDB C,MRP ;GET CHARACTER + POPJ PP, + +PEEK: JUMPN MRP,PEEKM ;THIS IS A MACRO READ + PUSHJ PP,CHARAC ;READ AN ASCII CHAR. + TLO IO,IORPTC ;REPEAT FOR NEXT + POPJ PP, ;AND RETURN + +PEEKM: PUSH PP,MRP ;SAVE MACRO READ POINTER + PUSH PP,RCOUNT ;SAVE WORD COUNT + PUSHJ PP,MREADS ;READ IN A CHAR. + POP PP,RCOUNT ;RESTORE WORD COUNT + POP PP,MRP ;RESET READ POINTER + POPJ PP, ;IORPTC IS NOT SET + REFINC: MOVEI CS,1(V) ;GET POINTER TO TREE + AOS 0(CS) ;INCREMENT REFERENCE + POPJ PP, + +REFDEC: JUMPLE V,DECERR ;CATASTROPHIC ERROR SOMEWHERE + MOVEI CS,1(V) ;GET POINTER TO TREE + SOS CS,0(CS) ;DECREMENT REFERENCE + TRNE CS,000777 ;IS IT ZERO? + POPJ PP, ;NO, EXIT + HRRZ CS,0(V) ;YES, GET POINTER TO END + HRL CS,NEXT ;GET POINTER TO NEXT RE-USABLE + HLLM CS,0(CS) ;SET LINK + HRRM V,NEXT ;RESET NEXT + POPJ PP, + +DECERR: MOVE AC0,CALNAM ;GET MACRO NAME + MOVSI RC,[SIXBIT /ERROR WHILE EXPANDING@/] + PUSHJ PP,TYPMSG + JRST ERRNE2 ;COMMON MESSAGE + A== 0 ;ASCII MODE +AL== 1 ;ASCII LINE MODE +IB== 13 ;IMAGE BINARY MODE +B== 14 ;BINARY MODE +IFE RUNSW, + +CTL== 0 ;CONTROL DEVICE NUMBER +IFN CCLSW, +BIN== 1 ;BINARY DEVICE NUMBER +CHAR== 2 ;INPUT DEVICE NUMBER +LST== 3 ;LISTING DEVICE NUMBER + +; COMMAND STRING ACCUMULATORS + +ACDEV== 1 ;DEVICE +ACFILE==2 ;FILE +ACEXT== 3 ;EXTENSION +ACPPN== 4 ;PPN +ACDEL== 4 ;DELIMITER +ACPNTR==5 ;BYTE POINTER + +TIO== 6 + +TIORW== 1000 +TIOLE== 2000 +TIOCLD==20000 + +DIRBIT==4 ;DIRECTORY DEVICE +TTYBIT==10 ;TTY +MTABIT==20 ;MTA +DTABIT==100 ;DTA +DISBIT==2000 ;DISPLAY +CONBIT==20000 ;CONTROLING TTY +LPTBIT==40000 ;LPT +DSKBIT==200000 ;DSK + +;GETSTS ERROR BITS + +IOIMPM==400000 ;IMPROPER MODE (WRITE LOCK) +IODERR==200000 ;DEVICE DATA ERROR +IODTER==100000 ;CHECKSUM OR PARITY ERROR +IOBKTL== 40000 ;BLOCK TOO LARGE +ERRBIT==IOIMPM!IODERR!IODTER!IOBKTL + +SYN .TEMP,PPN + SUBTTL I/O ROUTINES +BEG: +IFN CCLSW, +IFN PURESW,< + MOVE MRP,[XWD LOWL,LOWL+1] ;START OF DATA + SETZM LOWL ;ZERO FIRST WORD + BLT MRP,LOWEND ;AND THE REST + MOVE MRP,[XWD LOWH,LOWL] ;PHASED CODE + BLT MRP,LOWL+LENLOW ;MOVE IT IN> + HRRZ MRP,JOBREL ;GET LOWSEG SIZE + MOVEM MRP,MACSIZ ;SAVE CORE SIZE + ;DECODE VERSION NUMBER + MOVEI PP,JOBFFI ;TEMP PUSH DOWN STACK + PUSH PP,[0] ;MARK BOTTOM OF STACK + LDB 0,[POINT 3,JOBVER,2] ;GET USER BITS + JUMPE 0,GETE ;NOT SET IF ZERO + ADDI 0,"0" ;FORM NUMBER + PUSH PP,0 ;STACK IT + MOVEI 0,"-" ;SEPARATE BY HYPHEN + PUSH PP,0 ;STACK IT ALSO +GETE: HRRZ 0,JOBVER ;GET EDIT NUMBER + JUMPE 0,GETU ;SKIP ALL THIS IF ZERO + MOVEI 1,")" ;ENCLOSE IN PARENS. + PUSH PP,1 +GETED: IDIVI 0,8 ;GET OCTAL DIGITS + ADDI 1,"0" ;MAKE ASCII + PUSH PP,1 ;STACK IT + JUMPN 0,GETED ;LOOP TIL DONE + MOVEI 0,"(" ;OTHER PAREN. + PUSH PP,0 +GETU: LDB 0,[POINT 6,JOBVER,17] ;UPDATE NUMBER + JUMPE 0,GETV ;SKIP IF ZERO + IDIVI 0,8 ;MIGHT BE TWO DIGITS + ADDI 1,"@" ;FORM ALPHA + PUSH PP,1 + JUMPN 0,GETU+1 ;LOOP IF NOT DONE +GETV: LDB 0,[POINT 9,JOBVER,11] ;GET VERSION NUMBER + IDIVI 0,8 ;GET DIGIT + ADDI 1,"0" ;TO ASCII + PUSH PP,1 ;STACK + JUMPN 0,GETV+1 ;LOOP + MOVE 1,[POINT 7,VBUF+1,13] ;POINTER TO DEPOSIT IN VBUF + POP PP,0 ;GET CHARACTER + IDPB 0,1 ;DEPOSIT IT + JUMPN 0,.-2 ;KEEP GOING IF NOT ZERO +IFN FORMSW,> + IFN CCLSW,< + TLZA IO,CRPGSW ;SET TO INIT NEW COMMAND FILE +M: TLNN IO,CRPGSW ;CURRENTLY DOING RPG?> +IFE CCLSW, + RESET ;INITIALIZE PROGRAM + SETZM BINDEV ;CLEAR INCASE NOT USED NEXT TIME + SETZM LSTDEV ;SAME REASON + SETZM INDEV ;INCASE OF ERROR + HRRZ MRP,MACSIZ ;GET INITIAL SIZE + CORE MRP, ;BACK TO ORIGINAL SIZ4 + JFCL ;SHOULD NEVER FAIL + SETZB MRP,PASS1I + MOVE [XWD PASS1I,PASS1I+1] + BLT PASS2X-1 ;ZERO THE PASS1 AND PASS2 VARIABLES + MOVEI PP,JOBFFI ;SET TEMP PUSH-DOWN POINTER + MOVE CS,[POINT 7,DBUF,6] ;INITIALIZE FOR DATE + MSTIME 2, ;GET TIME FROM MONITOR + PUSHJ PP,TIMOUT ;TIME FORMAT OUTPUT + DATE 1, ;GET DATE + IBP CS ;PASS OVER PRESET SPACE + PUSHJ PP,DATOUT ;DATE FORMAT OUTPUT + MOVSI FR,P1!CREFSW +IFN CCLSW, +IFE CCLSW, + MOVSI IO,IOPALL ;ZERO FLAGS + INIT CTL,AL ;INITIALIZE USER CONSOLE + SIXBIT /TTY/ + XWD CTOBUF,CTIBUF + EXIT ;NO TTY, NO ASSEMBLY + MOVSI C,(SIXBIT /TTY/) + DEVCHR C, ;GET CHARACTERISTICS + TLNN C,10 ;IS IT REALLY A TTY + EXIT ;NO + INBUF CTL,1 ;INITIALIZE SINGLE CONTROL + OUTBUF CTL,1 ;BUFFERS + PUSHJ PP,CRLF ;OUTPUT CARRIAGE RETURN - LINE FEED + MOVEI C,"*" + IDPB C,CTOBUF+1 + OUTPUT CTL, + INPUT CTL, + IFN CCLSW, + INIT CTL2,AL ;LOOK FOR DISK + SIXBIT /DSK/ ;... + XWD 0,CTLBLK ;... + JRST CTLSET ;DSK NOT THERE + +IFE STANSW,< + HRLZI 3,(SIXBIT /MAC/) ;###MAC + MOVEI 3 ;COUNT + PJOB AC1, ;RETURNS JOB NO. TO AC1 +RPGLUP: IDIVI AC1,12 ;CONVERT + ADDI AC2,"0"-40 ;SIXBITIZE IT + LSHC AC2,-6 ; + SOJG 0,RPGLUP ;3 TIMES + MOVEM 3,CTLBUF ;###MAC + HRLZI (SIXBIT /TMP/) ; +> +IFN STANSW,< + MOVE 3,['QQMACR'] + MOVEM 3,CTLBUF + MOVSI 0,'RPG' +> + MOVEM CTLBUF+1 ;TMP + SETZM CTLBUF+3 ;PROG-PRO + LOOKUP CTL2,CTLBUF ;COMMAND FILE + JRST CTLSET ;NOT THERE + HLRM EXTMP ;SAVE THE EXTENSION + +RPGS2: INBUF CTL2,1 ;SINGLE BUFFERED +RPGS2A: INIT CTL,AL ;TTY FOR CONSOLE MESSAGES + SIXBIT /TTY/ ;... + XWD CTOBUF,0 ;... + EXIT ;NO TTY, NO ASSEMBLY + OUTBUF CTL,1 ;SINGLE BUFFERED + MOVE JOBFF ;REMEMBER WHERE BINARY BUFFERS BEGIN + MOVEM SAVFF ;... + HRRZ JOBREL ;TOP OF CORE + CAMLE MACSIZ ;SEE IF IT HAS GROWN + MOVEM MACSIZ ;PREVENTS ADDRESS CHECK ON EXIT + TLNE IO,CRPGSW ;ARE WE ALREADY IN RPG MODE? + JRST M ;MUST HAVE COME FROM @ COMMAND, RESET + + GOSET: MOVSI IO,IOPALL!CRPGSW ;SET INITIAL FLAGS + MOVEI CS,CTLSIZ ;MAXIMUM CHARS IN A LINE + MOVE AC1,CTLBLK+2 ;NUMBER OF CHARACTERS + MOVEM AC1,CTIBUF+2 ;SAVE FOR PASS 2 + MOVE AC1,[POINT 7,CTLBUF] ;WHERE TO STASH CHARS + MOVEM AC1,CTIBUF+1 ;... +GOSET1: SOSG CTLBLK+2 ;ANY MORE CHARS? + PUSHJ PP,[IFN TEMP, + IN CTL2, ;READ ANOTHER BUFFERFUL + POPJ PP, ;EVERYTHING OK, RETURN + STATO CTL2,20000 ;EOF? + JRST [HRROI RC,[SIXBIT /ERROR READING COMMAND FILE@/] + JRST ERRFIN] ;GO COMPLAIN + PUSHJ PP,DELETE ;CMD FILE + EXIT] ;EOF AND FINISHED + ILDB C,CTLBLK+1 ;GET NEXT CHAR + MOVE RC,@CTLBLK+1 ;CHECK FOR SEQUENCE NUMBERS + TRNE RC,1 ;... + JRST [AOS CTLBLK+1 ;SKIP OVER ANOTHER 5 CHARS + MOVNI RC,5 ;... + ADDM RC,CTLBLK+2 ;... + JRST GOSET1 ] ;GO READ ANOTHER CHAR + JUMPE C,GOSET1 ;IGNORE NULLS + IDPB C,CTIBUF+1 ;STASH AWAY + AOS CTIBUF+2 ;INCREMENT CHAR. COUNT + CAIE C,12 ;LINE FEED OR + CAIN C,175 ;ALTMODE? + JRST GOSET2 ;YES, FINISHED WITH COMMAND + CAIE C,176 + CAIN C,33 + JRST GOSET2 ;ALTMODE. + SOJG CS,GOSET1 ;GO READ ANOTHER + HRROI RC,[SIXBIT /COMMAND LINE TOO LONG@/] + JRST ERRFIN ;GO COMPLAIN +GOSET2: MOVEI C,12 ;MAKE SURE THERE'S A LF + IDPB C,CTIBUF+1 ;... + MOVEM AC1,CTIBUF+1 ;SET POINTER TO BEGINNING + AOS CTIBUF+2 ;ADD I TO COUNT + MOVE SAVFF ;RESET JOBFF FOR NEW BINARY + MOVEM JOBFF ;... + JRST BINSET + +RPGS1: PUSHJ PP,DELETE ;DELETE COMMAND FILE + MOVEM ACDEV,RPGDEV ;GET SET TO INIT + OPEN CTL2,RPGINI ;DO IT + JRST EINIT ;ERROR + MOVEM ACFILE,INDIR ;USE INPUT BLOCK + MOVEM ACPPN,INDIR+3 ;SET PPN + MOVEM ACEXT,INDIR+1 + LOOKUP CTL2,INDIR + JRST [JUMPN ACEXT,RPGLOS ;GIVE UP ,EXPLICIT EXTENSION +IFE STANSW,< MOVSI ACEXT,(SIXBIT /CCL/) ;IF BLANK TRY CCL> +IFN STANSW,< MOVSI ACEXT,(SIXBIT /RPG/) ;IF BLANK TRY RPG> + JRST .-2 ] + HLRM ACEXT,EXTMP ;SAVE THE EXTENSION + HLRZ JOBSA ;RESET JOBFF TO ORIGINAL + MOVEM JOBFF + TLO IO,CRPGSW ;TURN ON SWITCH SO WE RESET WORLD + JRST RPGS2 ;AND GO +RPGLOS: RELEAS CTL2,0 + TLZ IO,CRPGSW ;STOPS IO TO UNASGD CHAN + JRST ERRCF ;NO FILE FOUND +> + BINSET: PUSHJ PP,NAME1 ;GET FIRST NAME +IFN CCLSW, + TLNN FR,CREFSW ;CROSS REF REQUESTED? + JRST LSTSE1 ;YES, SKIP BINARY + CAIN C,"," ;COMMA? + JUMPE ACDEV,LSTSET ;YES, SKIP BINARY IF NO DEVICE SPECIFIED + CAIN C,"_" ;LEFT ARROW? + JUMPE ACDEV,LSTSE1 ;YES, SKIP BINARY IF NO DEVICE SPECIFIED + JUMPE ACDEV,M ;IGNORE IF JUST + TLO FR,PNCHSW ;OK, SET SWITCH + MOVEM ACDEV,BINDEV ;STORE DEVICE NAME + MOVEM ACFILE,BINDIR ;STORE FILE NAME IN DIRECTORY + JUMPN ACEXT,.+2 ;EXTENSION SPECIFIED? + MOVSI ACEXT,(SIXBIT /REL/) ;NO, ASSUME RELOCATABLE BINARY + MOVEM ACEXT,BINDIR+1 ;STORE IN DIRECTORY + MOVEM ACPPN,BINDIR+3 ;SET PPN + OPEN BIN,BININI ;INITIALIZE BINARY + JRST EINIT ;ERROR + TLZE TIO,TIOLE ;SKIP TO EOT + MTAPE BIN,10 + TLZE TIO,TIORW ;REWIND REQUESTED? + MTAPE BIN,1 ;YES + JUMPGE CS,BINSE2 ;BRANCH IF NO BACK-SPACE + MTAPE BIN,17 ;BACK-SPACE A FILE + AOJL CS,.-1 ;TEST FOR END + WAIT BIN, + STATO BIN,1B24 ;LOAD POINT? + MTAPE BIN,16 ;NO, GO FORWARD ONE +BINSE2: SOJG CS,.-1 ;TEST FORWARD SPACING + + TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED? + UTPCLR BIN, ;YES, CLEAR IT + OUTBUF BIN,2 ;SET UP TWO RING BUFFER + CAIN C,"_" + JRST GETSET ;NO LISTING + LSTSET: PUSHJ PP,NAME1 ;GET NEXT DEVICE +LSTSE1: CAIE C,"_" + JRST ERRCM + TLNE FR,CREFSW ;CROSS-REF REQUESTED? + JRST LSTSE2 ;NO, BRANCH + JUMPN ACDEV,.+2 ;YES, WAS DEVICE SPECIFIED? + MOVSI ACDEV,(SIXBIT /DSK/) ;NO, ASSUME DSK + JUMPN ACFILE,.+2 + MOVE ACFILE,[SIXBIT /CREF/] + JUMPN ACEXT,.+2 +IFE STANSW, +IFN STANSW, +LSTSE2: JUMPE ACDEV,GETSET ;FORGET LISTING IF NO DEVICE SPECIFIED + MOVE AC0,ACDEV + DEVCHR AC0, ;GET CHARACTERISTICS + TLNE AC0,LPTBIT!DISBIT!TTYBIT + TLNE FR,CREFSW ; WAS CROSS-REF REQUESTED? + AOSA OUTSW+0*TTYSW ;NO, ASSUME TTY + JRST ERRCM ;YES, ERROR - CREF DEV MUST NOT BE LPT, DIS, OR TTY + TLNE AC0,CONBIT ;CONTROLING TELETYPE LISTING? + JRST GETSET ;YES, BUFFER ALREADY SET + MOVEM ACDEV,LSTDEV ;STORE DEVICE NAME + AOS OUTSW+0*LPTSW ;SET FOR LPT + MOVEM ACFILE,LSTDIR ;STORE FILE NAME + JUMPN ACEXT,.+2 + MOVSI ACEXT,(SIXBIT /LST/) + MOVEM ACEXT,LSTDIR+1 + MOVEM ACPPN,LSTDIR+3 ;SET PPN + OPEN LST,LSTINI ;INITIALIZE LISTING OUTPUT + JRST EINIT ;ERROR + TLZE TIO,TIOLE + MTAPE LST,10 + TLZE TIO,TIORW ;REWIND REQUESTED? + MTAPE LST,1 ;YES + JUMPGE CS,LSTSE3 + MTAPE LST,17 + AOJL CS,.-1 + WAIT LST, + STATO LST,1B24 + MTAPE LST,16 +LSTSE3: SOJG CS,.-1 + TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED? + UTPCLR LST, ;YES, CLEAR IT + OUTBUF LST,2 ;SET UP A TWO RING BUFFER + GETSET: MOVEI 3,PDPERR + HRRM 3,JOBAPR ;SET TRAP LOCATION + MOVEI 3,1B19 ;SET FOR PUSH-DOWN OVERFLOW + APRENB 3, + SOS 3,PDP ;GET PDP REQUEST MINUS 1 + IMULI 3,.PDP ;COMPUTE SIZE (50*) + HRLZ MP,3 + HRR MP,JOBFF ;SET BASIC POINTER + MOVE PP,MP + SUB PP,3 + MOVEM PP,RP ;SET RP + SUB PP,3 + ASH 3,1 ;DOUBLE SIZE OF BASIC POINTER + HRL PP,3 + SUBM PP,3 ;COMPUTE TOP LOCATION + SKIPN UNITOP ;IF ANY UNIVERSALS HAVE BEEN SEEN + JRST GETSE0 ;NO + HRRZS 3 ;GET TOP OF BUFFERS AND STACKS + CAMLE 3,UNISIZ ;HOPE ITS NOT BIGGER THAN UNIVERSAL ONE + JRST UNIERR ;IT WAS, YOU LOSE + SKIPA 3,UNITOP ;DON'T LOSE THEM +GETSE0: HRRZM 3,UNISIZ ;STORE UNTIL A UNIVERSAL IS SEEN + HRRZM 3,LADR ;SET START OF MACRO TREE + HRRZM 3,FREE + +GETSE1: HRRZ JOBREL + SUBI 1 + MOVEM SYMTOP ;SET TOP OF SYMBOL TABLE + SUBI LENGTH ;SET POINTER FOR INITIAL SYMBOLS + CAMLE LADR ;HAVE WE ROOM? + JRST GETSE2 ;YES + + HRRZ 2,JOBREL ;NO, TRY FOR MORE CORE + ADDI 2,2000 + CORE 2, + JRST XCEED2 ;NO MORE, INFORM USER + JRST GETSE1 ;TRY AGAIN + +GETSE2: MOVEM SYMBOL ;SET START OF SYMBOL TABLE + HRLI SYMNUM + BLT @SYMTOP ;STORE SYMBOLS + PUSHJ PP,SRCHI ;INITIALIZE TABLE + MOVE [XWD CTIBUF+1,CTLSAV] ;SAVE CONTROL INPUT BUFFER + BLT CTLS1 ;FOR RESCAN ON PASS 2 +IFN FTDISK, + PUSHJ PP,COUTI ;INIT OUTPUT JUST IN CASE + PUSHJ PP,INSET ;GET FIRST INPUT FILE + +IFN CCLSW, + MOVE CS,INDIR ;SET UP NAME OF FIRST FILE + MOVEM CS,LSTFIL ;AS LAST PRINTED + SETZM LSTPGN + JRST ASSEMB ;START ASSEMBLY + FINIS: CLOSE BIN, ;DUMP BUFFER + TLNE FR,PNCHSW ;PUNCH REQUESTED? + PUSHJ PP,TSTBIN ;YES, TEST FOR ERRORS + RELEAS BIN, + CLOSE LST, + SOSLE OUTSW+0*LPTSW ;LPT TYPE OUTPUT? + PUSHJ PP,TSTLST ;YES, TEST FOR ERRORS + RELEAS LST, + RELEAS CHAR, + OUTPUT CTL,0 ;FLUSH TTY OUTPUT + SKIPE UNIVSN ;SKIP IF NOT ASSEMBLING UNIVERSAL + PUSHJ PP,UNISYM ;STORE SYMBOLS ETC. FIRST + JRST M ;RETURN FOR NEXT ASSEMBLY + INSET: MOVEI JOBFFI ;POINTER TO INPUT BUFFER + HRRM JOBFF ;INFORM SYSTEM OF BUFFER AREA + PUSHJ PP,NAME2 ;GET NEXT COMMAND NAME + JUMPE ACDEV,ERRNE ;ERROR IF NONE LEFT + MOVEM ACDEV,INDEV ;STORE DEVICE + MOVEM ACFILE,INDIR ;STORE FILE IN DIRECTORY + MOVEM ACPPN,INDIR+3 ;STORE PPN BEFORE WE LOSE IT + OPEN CHAR,INDEVI + JRST EINIT ;ERROR + DEVCHR ACDEV, ;TEST CHARACTERISTICS + TLNN ACDEV,MTABIT ;MAG TAPE? + JRST INSET3 ;NO + TLZN FR,MTAPSW ;FIRST MAG TAPE IN PASS 2? + JRST INSET1 ;NO + TLNN TIO,TIORW ;YES, REWIND REQUESTED? + SUB CS,RECCNT ;NO, PREPARE TO BACK-SPACE TAPE +INSET1: AOS RECCNT ;INCREMENT FILE COUNTER + ADDM CS,RECCNT ;UPDATE COUNT + TLZE TIO,TIOLE + MTAPE CHAR,10 + TLZE TIO,TIORW ;REWIND? + MTAPE CHAR,1 ;YES + JUMPGE CS,INSET2 + MTAPE CHAR,17 + MTAPE CHAR,17 + AOJL CS,.-1 + WAIT CHAR, + STATO CHAR,1B24 + MTAPE CHAR,16 +INSET2: SOJGE CS,.-1 + +INSET3: INBUF CHAR,1 + MOVEI ACPNTR,JOBFFI + EXCH ACPNTR,JOBFF + SUBI ACPNTR,JOBFFI + MOVEI ACDEL,NUMBUF*203+1 + IDIV ACDEL,ACPNTR + INBUF CHAR,(ACDEL) + JUMPN ACEXT,INSET4 ;TAKE USER'S EXTENSION IF NON-BLANK + MOVSI ACEXT,(SIXBIT /MAC/) ;BLANK, TRY .MAC FIRST + PUSHJ PP,INSETI +INSET4: PUSHJ PP,INSETI + JUMPE ACEXT,ERRCF ;ERROR IF ZERO + TLNE ACDEV,TTYBIT ;TELETYPE? + SETSTS CHAR,AL ;YES, CHANGE TO ASCII LINE + ;DO ALL ENTERS HERE FOR LEVEL D + SKIPE ENTERS ;HAVE ENTERS BEEN DONE ALREADY? + JRST ENTRDN ;YES, DON'T DO TWICE + SKIPN ACEXT,LSTDEV ;IS THERE A LIST DEVICE? + JRST LSTSE5 ;NO SO DON'T DO ENTER + SKIPN ACFILE,LSTDIR ;GET FILE NAME INCASE OF ERROR + JRST [DEVCHR ACEXT, + TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY? + JRST LSTSE4 ;YES, GIVE UP BEFORE HARM IS DONE + SKIPE ACFILE,INDIR ;USE INPUT FILE NAME + MOVEM ACFILE,LSTDIR ;TOO BAD IF ZERO ALSO + JRST LSTSE4] + HLLZ ACEXT,LSTDIR+1 ;EXT ALSO + MOVE ACPPN,LSTDIR+3 ;SAVE PPN + LOOKUP LST,LSTDIR ;PREVIOUS ONE STILL THERE + JRST LSTSE4 ;NO + SETZM LSTDIR ;YES,CLEAR NAME + MOVEM ACPPN,LSTDIR+3 ;RESET PPN + RENAME LST,LSTDIR + CLOSE LST, ;IGNORE FAILURE + MOVEM ACFILE,LSTDIR ;RESTORE NAME + HLLZS LSTDIR+1 ;BH 11/19/74 FOR DATE75. CLEAR RH. + SETZM LSTDIR+2 ;CLEAR PROTECTION AND DATE + MOVEM ACPPN,LSTDIR+3 ;SET PPN AGAIN +LSTSE4: +IFN STANSW,< + MOVSI ACEXT,400000 + MOVEM ACEXT,LSTDIR+2 ;SET DUMP NEVER BIT. +> + ENTER LST,LSTDIR ;SET UP DIRECTORY + JRST ERRCL ;ERROR +LSTSE5: SKIPN ACEXT,BINDEV ;A BINARY DEVICE THEN ? + JRST ENTRDN ;NO + SKIPN ACFILE,BINDIR ;INCASE OF ERROR + JRST [DEVCHR ACEXT, + TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY? + JRST .+1 ;YES, GIVE UP BEFORE HARM IS DONE + SKIPE ACFILE,INDIR ;USE INPUT FILE NAME + MOVEM ACFILE,BINDIR ;TOO BAD IF ZERO ALSO + JRST .+1] +IFN STANSW,< + MOVSI ACEXT,400000 + MOVEM ACEXT,BINDIR+2 +> + HLLZS ACEXT,BINDIR+1 ;BH 11/19/74 DATE75. WAS HLLZ. + ENTER BIN,BINDIR ;ENTER FILE NAME + JRST ERRCB ;ERROR + +ENTRDN: SETOM ENTERS ;MAKE SURE ONLY DONE ONCE + MOVE CS,[POINT 7,DEVBUF] + PUSH PP,1 ;SAVE THE ACCS + PUSH PP,2 + PUSH PP,3 + SKIPN 2,INDIR ;GET INPUT NAME + JRST FINDEV ;FINISHED WITH DEVICE + SETZ 1, ;CLEAR FOR RECEIVING + LSHC 1,6 ;SHIFT ONE CHAR. IN + ADDI 1,40 ;FORM ASCII + IDPB 1,CS ;STORE CHAR. + JUMPN 2,.-4 ;MORE TO DO? + MOVEI 1," " ;SEPARATE BY TAB + IDPB 1,CS + HLLZ 2,INDIR+1 ;GET EXT + JUMPE 2,FINEXT ;NO EXT + SETZ 1, + LSHC 1,6 ;SAME LOOP AS ABOVE + ADDI 1,40 + IDPB 1,CS + JUMPN 2,.-4 +FINEXT: MOVEI 1," " + IDPB 1,CS ;SEPARATE BY TAB + LDB 1,[POINT 12,INDIR+2,35] ;GET DATE + LDB 2,[POINT 3,INDIR+1,20] ;BH 11/19/74 DATE75. + DPB 2,[POINT 3,1,23] ;BH 11/19/74 DATE75. + JUMPE 1,FINDEV ;NO DATE? + PUSHJ PP,DATOUT ;STORE IT + LDB 2,[POINT 11,INDIR+2,23] ;GET CREATION TIME + JUMPE 2,FINDEV ;NO TIME (DECTAPE) + MOVEI 1," " ;SEPARATE BY SPACE + IDPB 1,CS + PUSHJ PP,TIMOU1 ;STORE TIME +FINDEV: SETZ 1, + MOVEI 2," " ;FINAL TAB + IDPB 2,CS + IDPB 1,CS ;TERMINATE FOR NOW + POP PP,3 ;RESTORE ACCS + POP PP,2 + POP PP,1 + SKIPN PAGENO ;IF FIRST TIME THRU + JRST OUTFF ;START NEW PAGE + SETZM PAGENO ;ON NEW FILE, RESET PAGES + JRST OUTFF2 ;DON'T START NEW PAGE UNLESS FF + +INSETI: HLLZM ACEXT,INDIR+1 ;STORE EXTENSION + MOVE ACPPN,INDIR+3 ;SAVE PPN + LOOKUP CHAR,INDIR + SKIPA ACEXT,INDIR+1 ;GET ERROR CODE + JRST CPOPJ1 ;SKIP-RETURN IF FOUND + TRNE ACEXT,-1 ;ERROR CODE OF 0 IS FILE NOT FOUND + JRST ERRCF ;FILE THERE BUT NOT READABLE + SETZ ACEXT, ;CLEAR EXT AND TRY AGAIN + MOVEM ACPPN,INDIR+3 ;RESTORE PPN + POPJ PP, + REC2: MOVS [XWD CTIBUF+1,CTLSAV] ;RESCAN CONTROL (FROM PASS1 END STMNT) + BLT CTIBUF+2 ;INPUT BUFFER + MOVEI "_" + HRLM ACDELX ;FUDGE PREVIOUS DELIMITER +IFN RENTSW, + SETZM PASS2I + MOVE [XWD PASS2I,PASS2I+1] + BLT PASS2X-1 ;ZERO PASS2 VARIABLES + TLO FR,MTAPSW!LOADSW ;SET FLAGS + +GOTEND: MOVE INDEV ;GET LAST DEVICE + DEVCHR ;GET ITS CHARACTERISTICS + TLNE 4 ;TEST FOR DIRECTORY (DSK OR DTA) + JRST EOT ;YES, SO DON'T WASTE TIME + JRST .+3 ;NO, INPUT BUFFER BY BUFFER + IN CHAR, + JRST .-1 ;NO ERRORS + STATO CHAR,1B22 ;TEST FOR EOF + JRST .-3 ;IGNORE ERRORS + +EOT: PUSHJ PP,SAVEXS ;SAVE REGISTERS + PUSHJ PP,INSET ;GET THE NEXT INPUT DEVICE + HRROI RC,[SIXBIT /END OF PASS 1@/] ;ASSUME END OF PASS + TLZN FR,LOADSW ;ZERO ONLY ON END OF PASS 1 + HRROI RC,[SIXBIT /LOAD THE NEXT FILE@/] ;NOT END OF PASS + TLNN ACDEV,(1B13!1B15) ;WAS ALL THAT WORK NECESSARY? + PUSHJ PP,TYPMSG ;YES + +RSTRXS: MOVSI RC,SAVBLK ;SET POINTER + BLT RC,RC-1 ;RESTORE REGISTERS + MOVE RC,SAVERC ;RESTORE RC + POPJ PP, ;EXIT + +SAVEXS: MOVEM RC,SAVERC ;SAVE RC + MOVEI RC,SAVBLK ;SET POINTER + BLT RC,SAVBLK+RC-1 ;BLT ALL REGISTERS BELOW RC + POPJ PP, ;EXIT + NAME1: SETZM ACDEVX ;ENTRY FOR DESTINATION +NAME2: SETZB ACDEV,INDIR+2 ;ENTRY FOR SOURCE + MOVEI ACFILE,0 ;CLEAR FILE + HLRZ ACDEL,ACDELX ;GET PREVIOUS DELIMITER + SETZB TIO,CS + SETZB ACEXT,INDIR+3 ;RESET EXTENSION AND PROGRAM-NUMBER PAIR + SETZM PPN ;CLEAR PPN +NAME3: MOVSI ACPNTR,(POINT 6,AC0) ;SET POINTER + TDZA AC0,AC0 ;CLEAR SYMBOL + +SLASH: PUSHJ PP,SW0 +GETIOC: PUSHJ PP,TTYIN ;GET INPUT CHARACTER + CAIN C,"/" + JRST SLASH + CAIN C,"(" + JRST SWITCH + CAIN C,":" + JRST DEVICE + CAIN C,"." + JRST NAME +IFN CCLSW, + CAIE C,33 ;CHECK FOR THREE FLAVORS OF ALT-MODE + CAIN C,176 ;... + JRST TERM ;... + CAIG C,CR ;LESS THAN CR? + CAIGE C,LF ;AND GREATER THAN LF? + CAIN C,175 ;OR 3RD ALTMOD + JRST TERM ;YES +IFN FTDISK, + CAIN C,"=" ;EQUALS IS SAME AS LEFT ARROW + TRCA C,142 ;SO MAKE IT A "_" AND SKIP + CAIE C,"," + CAIN C,"_" + JRST TERM + CAIGE C,40 ;VALID AS SIXBIT? + JRST [CAIN C,"Z"-100 ;NO,IS IT ^Z + EXIT ;YES,EXIT FOR BATCH + JRST GETIOC] ;JUST IGNORE + SUBI C,40 ;CONVERT TO 6-BIT + TLNE ACPNTR,770000 ;HAVE WE STORED SIX BYTES? + IDPB C,ACPNTR ;NO, STORE IT + JRST GETIOC ;GET NEXT CHARACTER + +DEVICE: JUMPN ACDEV,ERRCM ;ERROR IF ALREADY SET + MOVE ACDEV,AC0 ;DEVICE NAME + JRST DEVNAM ;COMMON CODE + +NAME: JUMPN ACFILE,ERRCM ;ERROR IF ALREADY SET + MOVE ACFILE,AC0 ;FILE NAME +DEVNAM: MOVE ACDEL,C ;SET DELIMITER + JRST NAME3 ;GET NEXT SYMBOL + +TERM: JUMPE ACDEL,TERM1 ;IF NO PREVIOUS TERMINATOR, THEN FILENAME + CAIN ACDEL,"_" ;... + JRST TERM1 ;... + CAIE ACDEL,":" ;IF PREVIOUS DELIMITER + CAIN ACDEL,"," ;WAS COLON OR COMMA +TERM1: MOVE ACFILE,AC0 ;SET FILE + CAIN ACDEL,"." ;IF PERIOD, + HLLZ ACEXT,AC0 ;SET EXTENSION + HRLM C,ACDELX ;SAVE PREVIOUS DELIMITER + JUMPN ACDEV,.+2 ;IF DEVICE SET USE IT + SKIPA ACDEV,ACDEVX ;OTHERWISE USE LAST DEVICE + MOVEM ACDEV,ACDEVX ;AND DEVICE + MOVE ACPPN,PPN ;PUT PPN IN RIGHT PLACE +IFN FTDISK, + POPJ PP, ;EXIT + ERRCM: HRROI RC,[SIXBIT /COMMAND ERROR@/] + JRST ERRFIN + +IFN FTDISK, +IFN STANSW, + JRST PROGN3 ;GET NEXT CHARACTER> + SWITC0: PUSHJ PP,SW1 ;PROCESS CHARACTER +SWITCH: PUSHJ PP,TTYIN ;GET NEXT CHARACTER + CAIE C,")" ;END OF STRING? + JRST SWITC0 ;NO + JRST GETIOC ;YES + +SW0: PUSHJ PP,TTYIN +SW1: MOVEI C,-"A"(C) ;CONVERT FROM ASCII TO NUMERIC + CAILE C,"Z"-"A" ;WITHIN BOUNDS? (IS IT ALPHA?) + JRST ERRCM ;NO, ERROR + MOVE RC,[POINT 4,BYTAB] + IBP RC + SOJGE C,.-1 ;MOVE TO PROPER BYTE + LDB C,RC ;PICK UP BYTE + JUMPE C,ERRCM ;TEST FOR VALID SWITCH + CAIG C,SWTABT-SWTAB ;LEGAL ON SOURCE? + JUMPL PP,ERRCM ;NO, TEST FOR SOURCE + LDB RC,[POINT 4,SWTAB-1(C),12] + CAIN RC,IO + SKIPN CTLSAV ;IF PASS2 OR IO SWITCH, + XCT SWTAB-1(C) ;EXECUTE INSTRUCTION + POPJ PP, ;EXIT + TLZ IO,IOSALL ;TAKE CARE OF /X + POPJ PP, + +DEFINE HELP (TEXT)< + XLIST + ASCIZ ?TEXT? + LIST> + +HLPMES: HELP < +Switches are :- +/A advance one file +/B backspace one file +/C produce a cref listing +/E list macro expansions (LALL) +/F list in new format (.MFRMT) +/G list in old format (.HWFRMT) +/H type this text +/L reinstate listing (LIST) +/M suppress ascii in macro and repeat expansion (SALL) +/N suppress error printout on tty +/O set MLOFF pseudo-op +/P increase size of the pushdown stack +/Q suppress Q errors on the listing +/S suppress listing (XLIST) +/T rewind device +/X suppress all macro expansions (XALL) +/Z zero the directory +Switches A,B,C,T,W,X, and Z must immediately follow +the device or file to which they refer. +> + DEFINE SETSW (LETTER,INSTRUCTION) < INSTRUCTION +J= <"LETTER"-"A">-^D9*/^D9> + SETCOD \I,J> + + DEFINE SETCOD (I,J) + B<4*J+3>> + +BYTAB0= 0 ;INITIALIZE TABLE +BYTAB1= 0 +BYTAB2= 0 + +SWTAB: + SETSW Z, + SETSW C, + SETSW P, +SWTABT: ;THE ABOVE SW'S ARE LEGAL ON OUTPUT ONLY + SETSW A, + SETSW B, + SETSW E, +IFN FORMSW,< SETSW F, + SETSW G,> + SETSW H, + SETSW L, + SETSW M, + SETSW N, + SETSW O, + SETSW Q, + SETSW S, + SETSW T, + SETSW W, + SETSW X, + +BYTAB: ;BYTAB CONTAINS AN INDEX TO SWTAB + ;IT CONSIST OF 9 4BIT BYTES/WORD + ;OR ONE BYTE FOR EACH LETTER + + +BYTAB0 ;A-I BYTE = 1 THROUGH 17 = INDEX + +BYTAB1 ;J-R BYTE = 0 = COMMAND ERROR + +BYTAB2 ;S-Z + +IF2, + TTYIN: SOSGE CTIBUF+2 ;ENUF CHAR.? + JRST TTYERR ;NO + ILDB C,CTIBUF+1 ;GET CHARACTER + CAIE C," " ;SKIP BLANKS + CAIN C,HT ;AND TABS + JRST TTYIN + CAIN C,15 ;CR? + SETZM CTIBUF+2 ;YES,IGNORE REST OF LINE + CAIG C,"Z"+40 ;CHECK FOR LOWER CASE + CAIGE C,"A"+40 + POPJ PP, ;NO,EXIT + SUBI C,40 + POPJ PP, ;YES, EXIT + +TTYERR: SKIPN INDEV ;INPUT DEVICE SEEN? + JRST ERRCM ;NO, SO MISSING "_" +ERRNE: HRROI RC,[SIXBIT /?NO END STATEMENT ENCOUNTERED ON INPUT FILE@/] +ERRNE0: SKPINC V ;SEE IF WE CAN INPUT A CHAR. + JFCL ;BUT ONLY TO DEFEAT ^O + PUSHJ PP,TYPMSG ;OUTPUT IT + SKIPE LITLVL ;SEE IF IN LITERAL + SKIPN LITPG ;PAGE 0 MEANS NOT IN A LITERAL REALY + JRST ERRNE1 ;NO, TRY OTHERS + MOVE V,[XWD [SIXBIT /IN LITERAL@/],LITPG] + PUSHJ PP,PRNUM ;GO PRINT INFORMATION +ERRNE1: MOVEI V,0 ;CHECK FOR OTHER PLACES + SKIPE INDEF + MOVE V,[XWD [SIXBIT /IN DEFINE@/],DEFPG] + SKIPE INTXT + MOVE V,[XWD [SIXBIT /IN TEXT@/],TXTPG] + SKIPE INREP + MOVE V,[XWD [SIXBIT /IN CONDITIONAL OR REPEAT@/],REPPG] + SKIPE INCND + MOVE V,[XWD [SIXBIT /IN CONDITIONAL@/],CNDPG] + SKIPGE MACENL +ERRNE2: MOVE V,[XWD [SIXBIT /IN MACRO CALL@/],CALPG] + JUMPN V,ERRNE3 + SKIPN LITLVL ;HAD ONE PAGE NUMBER ALREADY + SKIPA V,[XWD [SIXBIT /@/],PAGENO] ;BETTER THAN NOTHING + JRST .+2 +ERRNE3: PUSHJ PP,PRNUM + HRROI RC,[SIXBIT /@/] ;WILL GET A RETURN + JRST ERRFIN + +ERRMS1: SIXBIT / ERRORS DETECTED@/ +ERRMS2: SIXBIT /?1 ERROR DETECTED@/ +ERRMS3: SIXBIT /NO ERRORS DETECTED@/ +EINIT: MOVE RC,[XWD ACDEV,[SIXBIT /NOT AVAILABLE@/]] + JRST ERRFIN + ERRCL: HRRZ RC,LSTDIR+1 ;GET LST DEV ERROR CODE + JRST .+2 ;GET ERROR MESSAGE +ERRCB: HRRZ RC,BINDIR+1 ;GET BIN DEV ERROR CODE + JUMPN RC,ERRTYP + SOJA RC,ERRTYP ;SPECIAL CASE IF ERROR CODE 0 + +ERRCF: HRRZ RC,INDIR+1 ;GET INPUT DEV ERROR CODE + HLLZ ACEXT,INDIR+1 ;SET UP EXT + +ERRTYP: CAIL RC,TABLND-TABLE ;IS ERROR CODE LEGAL? + SKIPA RC,TABLND ;NO, GIVE CATCH ALL MESSAGE + MOVE RC,TABLE(RC) ;YES, PICK UP MESSAGE + +ERRFIN: SKPINC C ;SEE IN WE CAN INPUT A CHAR. + JFCL ;BUT ONLY TO DEFEAT ^O + PUSHJ PP,CRLF + MOVEI C,"?" + PUSHJ PP,TYO + PUSHJ PP,TYPMS1 + CLOSE LST, ;GIVE USER A PARTIAL LISTING + CLOSE BIN,40 ;BUT NEVER A BUM REL FILE +IFN CCLSW, + JRST M + + [SIXBIT /(0) ILLEGAL FILE NAME@/],,ACFILE +TABLE: [SIXBIT /(0) FILE WAS NOT FOUND@/],,ACFILE + [SIXBIT /(1) NO DIRECTORY FOR PROJECT-PROGRAMMER NUMBER@/],,ACFILE + [SIXBIT /(2) PROTECTION FAILURE@/],,ACFILE + [SIXBIT /(3) FILE WAS BEING MODIFIED@/],,ACFILE + [SIXBIT /(4) RENAME FILE NAME ALREADY EXISTS@/],,ACFILE + [SIXBIT /(5) ILLEGAL SEQUENCE OF UUOS@/],,ACFILE + [SIXBIT /(6) BAD UFD OR BAD RIB@/],,ACFILE + [SIXBIT /(7) NOT A SAV FILE@/],,ACFILE + [SIXBIT /(10) NOT ENOUGH CORE@/],,ACFILE + [SIXBIT /(11) DEVICE NOT AVAILABLE@/],,ACFILE + [SIXBIT /(12) NO SUCH DEVICE@/],,ACFILE + [SIXBIT /(13) NOT TWO RELOC REG. CAPABILITY@/],,ACFILE + [SIXBIT /(14) NO ROOM OR QUOTA EXCEEDED@/],,ACFILE + [SIXBIT /(15) WRITE LOCK ERROR@/],,ACFILE + [SIXBIT /(16) NOT ENOUGH MONITOR TABLE SPACE@/],,ACFILE + [SIXBIT /(17) PARTIAL ALLOCATION ONLY@/],,ACFILE + [SIXBIT /(20) BLOCK NOT FREE ON ALLOCATION@/],,ACFILE + [SIXBIT /(21) CAN'T SUPERSEDE (ENTER) AN EXISTING DIRECTORY@/],,ACFILE + [SIXBIT /(22) CAN'T DELETE (RENAME) A NON-EMPTY DIRECTORY@/],,ACFILE + [SIXBIT /(23) SFD NOT FOUND@/],,ACFILE + [SIXBIT /(24) SEARCH LIST EMPTY@/],,ACFILE + [SIXBIT /(25) SFD NESTED TOO DEEPLY@/],,ACFILE + [SIXBIT /(26) NO-CREATE ON FOR SPECIFIED PATH@/],,ACFILE + +TABLND: [SIXBIT /(?) LOOKUP, ENTER, OR RENAME ERROR@/],,ACFILE + TYPMSG: PUSHJ PP,CRLF ;MOVE TO NEXT LINE +TYPMS1: HLRZ CS,RC ;GET FIRST MESSAGE + CAIE CS,-1 ;SKIP IF MINUS ONE + PUSHJ PP,TYPM2 ;TYPE MESSAGE + HRRZ CS,RC ;GET SECOND HALF + PUSHJ PP,TYPM2 + +CRLF: MOVEI C,CR ;OUTPUT CARRIAGE RETURN + PUSHJ PP,TYO + MOVEI C,LF ;AND LINE FEED + +TYO: SOSG CTOBUF+2 ;BUFFER FULL? + OUTPUT CTL,0 ;YES, DUMP IT + IDPB C,CTOBUF+1 ;STORE BYTE + CAIG C,FF ;FORM FEED? + CAIGE C,LF ;V TAB OR LINE FEED? + POPJ PP, ;NO + OUTPUT CTL,0 ;YES + POPJ PP, ;AND EXIT + +TYPM2: MOVSI C,(1B0) ;ANTICIPATE REGISTER WORD + CAIN CS,ACFILE ;FILE NAME ? + JRST [JUMPE ACEXT,.+1 ;YES, TEST FOR EXT + LSH ACEXT,-6 ;MAKE SPACE FOR "." + IOR ACEXT,[SIXBIT /. @/] + JRST TYPM2A] + CAIG CS,17 ;IS IT? + MOVEM C,1(CS) +TYPM2A: HRLI CS,(POINT 6,,) ;FORM BYTE POINTER + +TYPM3: ILDB C,CS ;GET A SIXBIT BYTE + CAIN C,40 ;"@"? + JRST TYO ;YES, TYPE SPACE AND EXIT + ADDI C,40 ;NO, FORM 7-BIT ASCII + PUSHJ PP,TYO ;OUTPUT CHARACTER + JRST TYPM3 + + XCEEDS: ADDI SX,2000 ;ADJUST SYMBOL POINTER +XCEED: PUSHJ PP,SAVEXS ;SAVE THE REGISTERS + HRRZ 1,JOBREL ;GET CURRENT TOP + MOVEI 0,2000(1) + CORE 0, ;REQUEST MORE CORE + JRST XCEED2 ;ERROR, BOMB OUT + HRRZ 2,JOBREL ;GET NEW TOP + +XCEED1: MOVE 0,0(1) ;GET ORIGIONAL + MOVEM 0,0(2) ;STORE IN NEW LOCATION + SUBI 2,1 ;DECREMENT UPPER + CAMLE 1,SYMBOL ;HAVE WE ARRIVED? + SOJA 1,XCEED1 ;NO, GET ANOTHER + MOVEI 1,2000 + ADDM 1,SYMBOL + ADDM 1,SYMTOP + PUSHJ PP,SRCHI ;RE-INITIALIZE SYMBOL TABLE + JRST RSTRXS ;RESTORE REGISTERS AND EXIT + +XCEED2: HRROI RC,[SIXBIT /INSUFFICIENT CORE@/] + JRST ERRNE0 +PDPERR: HRROI RC,[SIXBIT .PDP OVERFLOW, TRY /P@.] + JRST ERRNE0 + +PRNUM: HLRZ CS,V ;GET MESSAGE + PUSHJ PP,TYPM2 + MOVEI CS,[SIXBIT /ON PAGE@/] + PUSHJ PP,TYPM2 + MOVE AC0,(V) ;GET PAGE + PUSHJ PP,DP1 ;PRINT NUMBER + MOVEI C,40 + PUSHJ PP,TYO + SKIPN AC1,1(V) ;GET SEQ NUM IF THERE + POPJ PP, ;NO, RETURN + MOVEM AC1,OUTSQ + MOVEI CS,[SIXBIT /LINE@/] + PUSHJ PP,TYPM2 + MOVEI AC0,OUTSQ ;PRINT IT + OUTPUT CTL,0 ;TO MAKE THINGS PRINT IN RIGHT ORDER + DDTOUT AC0, + MOVEI C,40 + JRST TYO ;AND RETURN + +DP1: IDIVI AC0,^D10 + HRLM AC1,(PP) + JUMPE AC0,.+2 + PUSHJ PP,DP1 + HLRZ C,(PP) + ADDI C,"0" + JRST TYO + RIM0: TDO FR,AC0 ;SET RIM/RIM10 FLAG + TLNE FR,PNCHSW ;FORGET IT IF PUNCH RESET + SETSTS BIN,IB ;SET TO IMAGE BINARY MODE + POPJ PP, + +ROUT: EXCH CS,RIMLOC + SUB PP,[XWD 1,1] ;CLEAR OUT STACK WFW + TLNE FR,R1BSW + JRST ROUT6 + TLNN FR,RIM1SW + JRST ROUT1 + JUMPE CS,ROUT1 ;RIM10 OUTPUT + SUB CS,RIMLOC + JUMPE CS,ROUT1 + JUMPG CS,ERRAX + MOVEI C,0 + PUSHJ PP,PTPBIN + AOJL CS,.-1 +ROUT1: MOVSI C,(DATAI PTR,) ;RIM OUTPUT + HRR C,LOCO ;GET ADDRESS + TLNE FR,RIM1SW ;NO DATAI IF RIM10 + AOSA RIMLOC + PUSHJ PP,PTPBIN ;OUTPUT + MOVE C,AC0 ;CODE + AOSA LOCO ;INCREMENT CURRENT LOCATION + +OUTBIN: TLNN FR,RIMSW!RIM1SW!R1BSW ;EXIT IF RIM MODE +PTPBIN: TLNN FR,PNCHSW ;EXIT IF PUNCH NOT REQUESTED + POPJ PP, + SOSG BINBUF+2 ;TEST FOR BUFFER FULL + PUSHJ PP,DMPBIN ;YES, DUMP IT + IDPB C,BINBUF+1 ;DEPOSIT BYTE + POPJ PP, ;EXIT + + DMPBIN: OUT BIN,0 ;DUMP THE BUFFER + POPJ PP, ;NO ERRORS +TSTBIN: GETSTS BIN,C ;GET STSTUS BITS + TRNN C,ERRBIT ;ERROR? + POPJ PP, ;NO, EXIT + MOVE AC0,BINDEV ;YES, GET TAG + JRST ERRLST ;TYPE MESSAGE AND ABORT + +DMPLST: OUT LST,0 ;OUTPUT BUFFER + POPJ PP, ;NO ERRORS +TSTLST: GETSTS LST,C ;ANY ERRORS? + TRNN C,ERRBIT + POPJ PP, ;NO, EXIT + MOVE AC0,LSTDEV +ERRLST: MOVSI RC,[SIXBIT /OUTPUT WRITE-LOCK ERROR DEVICE@/] + TRNE C,IOIMPM ;IMPROPER MODE? + JRST ERRFIN ;YES + MOVSI RC,[SIXBIT /OUTPUT DATA ERROR DEVICE@/] + TRNE C,IODERR ;DEVICE DATA ERROR? + JRST ERRFIN ;YES + MOVSI RC,[SIXBIT /OUTPUT CHECKSUM OR PARITY ERROR DEVICE@/] + TRNE C,IODTER ;IS IT + JRST ERRFIN ;YES + MOVE CS,AC0 ;GET DEVICE + DEVCHR CS, ;FIND OUT WHAT IT IS + MOVSI RC,[SIXBIT /OUTPUT QUOTA EXCEEDED ON DEVICE@/] + TLNN CS,DSKBIT ;SKIP IF DSK OUTPUT + MOVSI RC,[SIXBIT /OUTPUT BLOCK TOO LARGE DEVICE@/] + JRST ERRFIN + +R1BDMP: SETCM CS,R1BCNT + JUMPE CS,R1BI + HRLZS C,CS + HRR C,R1BLOC + HRRI C,-1(C) + MOVEM C,R1BCHK + PUSHJ PP,PTPBIN + HRRI CS,R1BBLK +R1BDM1: MOVE C,0(CS) + ADDM C,R1BCHK + PUSHJ PP,PTPBIN + AOBJN CS,R1BDM1 + MOVE C,R1BCHK + PUSHJ PP,PTPBIN +R1BI: SETOM R1BCNT + PUSH PP,LOCO + POP PP,R1BLOC + POPJ PP, + +ROUT6: CAME CS,RIMLOC + PUSHJ PP,R1BDMP + AOS C,R1BCNT + MOVEM AC0,R1BBLK(C) + AOS LOCO + CAIN C,.R1B-1 + PUSHJ PP,R1BDMP + AOS RIMLOC + POPJ PP, + + + READ0: PUSHJ PP,EOT ;END OF TAPE + +READ: SOSGE IBUF+2 ;BUFFER EMPTY? + JRST READ3 ;YES +READ1: ILDB C,IBUF+1 ;PLACE CHARACTER IN C + MOVE CS,@IBUF+1 ;CHECK FOR SEQUENCE NUMBER + TRNN CS,1 + JRST READ1A + CAIN CS,1 ;CHECK FOR SPECIAL + MOVE CS,[+1] + MOVEM CS,SEQNO + MOVEM CS,SEQNO2 + MOVNI CS,4 + ADDM CS,IBUF+2 ;ADJUST WORD COUNT +REPEAT 4,< IBP IBUF+1> ;SKIP SEQ NO + PUSHJ PP,READ ;AND THE TAB + JRST READ ;GET NEXT CHARACTER + +READ1A: JUMPE C,READ ;IGNORE NULL + CAIN C,32 ;IF IT'S A "^Z" + MOVEI C,LF ;TREAT IT AS A "LF" + CAIE C,37 ;CONTROL _ + POPJ PP, + MOVEI C,"^" ;MAKE CONTROL-SHIFT _ VISIBLE + PUSHJ PP,RSW2 + MOVEI C,"_" + PUSHJ PP,RSW2 +READ2: PUSHJ PP,READ ;YES, TEST FOR LINE FEED + PUSHJ PP,RSW2 ;LIST IN ANY EVENT + CAIG C,FF ;IS IT ONE OF + CAIGE C,LF ;LF, VT, OR FF? + JRST READ2 ;NO + PUSHJ PP,OUTIM1 ;YES, DUMP THE LINE + JRST READ ;RETURN NEXT CHARACTER + +READ3: IN CHAR,0 ;GET NEXT BUFFER + JRST READ ;NO ERRORS + GETSTS CHAR,C + TRNN C,ERRBIT!2000 ;ERRORS? + JRST READ0 ;EOF + MOVE AC0,INDEV + MOVSI RC,[SIXBIT/ INPUT PHYSICAL END OF TAPE DEVICE@/] + TRNE C,2000 + JRST ERRFIN ;E-O-T + MOVSI RC,[SIXBIT /MONITOR DETECTED SOFTWARE INPUT ERROR DEVICE@/] + TRNE C,IOIMPM ;IMPROPER MODE? + JRST ERRFIN ;YES + MOVSI RC,[SIXBIT /INPUT DATA ERROR DEVICE@/] + TRNE C,IODERR ;DEVICE DATA ERROR? + JRST ERRFIN ;YES + MOVSI RC,[SIXBIT /INPUT CHECKSUM OR PARITY ERROR DEVICE@/] + TRNN C,IODTER + MOVSI RC,[SIXBIT /INPUT BLOCK TOO LARGE DEVICE@/] + JRST ERRFIN + + OUTAB2: PUSHJ PP,OUTTAB ;PRINT TWO TABS +OUTTAB: MOVEI C,HT +PRINT: CAIE C,CR ;IS THIS A CR? + CAIN C,LF ;OR LF? + JRST OUTCR ;YES, GO PROCESS + CAIN C,FF ;FORM FEED? + JRST OUTFF ;YES, FORCE NEW PAGE + JRST OUTL + +OUTCR: TRNN ER,ERRORS!LPTSW!TTYSW + POPJ PP, + MOVEI C,CR ;CARRIAGE RETURN, LINE FEED + PUSHJ PP,OUTL + SOSGE LPP ;END OF PAGE? + TLO IO,IOPAGE ;YES, SET FLAG + TRCA C,7 ;FORM LINE FEED AND SKIP + +OUTL: TLZN IO,IOPAGE ;NEW PAGE REQUESTED? + JRST OUTC ;NO + JUMP1 OUTC ;YES, BYPASS IF PASS ONE + PUSH PP,C ;SAVE C AND CS + PUSH PP,CS + PUSH PP,ER + TLNN IO,IOMSTR!IOPROG + HRR ER,OUTSW + TLNE IO,IOCREF ;IF DOING CREF OUTPUT NOW + TLNE FR,CREFSW ;AND CREFFING (JUST IN CASE) + JRST .+2 + PUSHJ PP,CLSC3 ;CLOSE IT OUT + HLLM IO,(PP) ;SAVE THIS NEW STATE OF IO + MOVEI C,.LPP + MOVEM C,LPP ;SET NEW COUNTER + MOVEI C,CR + PUSHJ PP,OUTC + MOVEI C,FF + PUSHJ PP,OUTC ;OUTPUT FORM FEED + MOVEI CS,TBUF + PUSHJ PP,OUTAS0 ;OUTPUT TITLE + MOVEI CS,VBUF + PUSHJ PP,OUTAS0 ;OUTPUT VERSION + MOVEI CS,DBUF + PUSHJ PP,OUTAS0 ; AND DATE + MOVE C,PAGENO + PUSHJ PP,DNC ;OUTPUT PAGE NUMBER + AOSG PAGEN. ;FIRST PAGE OF THIS NUMBER? + JRST OUTL1 ;YES + MOVEI C,"-" ;NO, PUT OUT MODIFIER + PUSHJ PP,OUTC + MOVE C,PAGEN. + PUSHJ PP,DNC +OUTL1: PUSHJ PP,OUTCR + MOVEI CS,DEVBUF + PUSHJ PP,OUTAS0 + HRRZ CS,SUBTTX ;SWITCH FOR SUB-TITLE + SKIPE 0(CS) ;IS THERE A SUB-TITLE? + PUSHJ PP,OUTTAB ;YES, OUTPUT A TAB + PUSHJ PP,SOUT20 ;OUTPUT ASCII WITH CARRIAGE RETURN + PUSHJ PP,OUTCR + POP PP,ER + POP PP,CS ;RESTORE REGISTERS + POP PP,C + +OUTC: TRNE ER,ERRORS!TTYSW + PUSHJ PP,TYO + TRNN ER,LPTSW + POPJ PP, +OUTLST: SOSG LSTBUF+2 ;BUFFER FULL? + PUSHJ PP,DMPLST ;YES, DUMP IT +COMMENT $ REG DOESN'T LIKE THIS FEATURE ANY MORE 9-5-72 +IFN STANSW,< CAIN C,"@" + MOVEI C,140 + CAIN C,"_" + MOVEI C,30 + CAIN C,"^" + MOVEI C,32 + CAIE C,"\" + JRST OUTLSS + MOVEI C,177 + IDPB C,LSTBUF+1 + JRST OUTLST +OUTLSS: > +$ + IDPB C,LSTBUF+1 ;STORE BYTE + POPJ PP, ;EXIT + + PAGE0: PUSHJ PP,STOUTS ;PAGE PSEUDO-OP +OUTFF1: TLNE IO,IOCREF ;CURRENTLY DOING CREF? + TLNE IO,IOPROG ;AND NOT XLISTED? + JRST OUTFF ;NO + HRR ER,OUTSW + PUSHJ PP,CLSCRF + PUSHJ PP,OUTCR + HRRI ER,0 +OUTFF: TLO IO,IOPAGE +OUTFF2: SETOM PAGEN. + AOS PAGENO + POPJ PP, + +TIMOUT: IDIVI 2,^D60*^D1000 +TIMOU1: IDIVI 2,^D60 + PUSH PP,3 ;SAVE MINUTES + PUSHJ PP,OTOD ;STORE HOURS + MOVEI 3,":" ;SEPARATE BY COLON + IDPB 3,CS + POP PP,2 ;STORE MINUTES +OTOD: IDIVI 2,^D10 + ADDI 2,60 ;FORM ASCII + IDPB 2,CS + ADDI 3,60 + IDPB 3,CS + POPJ PP, + +DATOUT: IDIVI 1,^D31 ;GET DAY + ADDI 2,1 + CAIG 2,^D9 ;TWO DIGITS? + ADDI 2,7760*^D10 ;NO, PUT IN SPACE + PUSHJ PP,OTOD ;STORE DAY + IDIVI 1,^D12 ;GET MONTH + MOVE 2,DTAB(2) ;GET MNEMONIC + IDPB 2,CS ;DEPOSIT RIGHT MOST 7 BITS + LSH 2,-7 ;SHIFT NEXT IN + JUMPN 2,.-2 ;DEPOSIT IFIT EXISTS + MOVEI 2,^D64(1) ;GET YEAR + JRST OTOD ;STORE IT + +DTAB: "-NAJ-" + "-BEF-" + "-RAM-" + "-RPA-" + "-YAM-" + "-NUJ-" + "-LUJ-" + "-GUA-" + "-PES-" + "-TCO-" + "-VON-" + "-CED-" + SUBTTL MACHINE INSTRUCTION SEARCH ROUTINES +IFE OPHSH,< +OPTSCH: MOVEI RC,0 + MOVEI ARG,1B^L ;SET UP INDEX + MOVEI V,1B^L/2 ;SET UP INCREMENT + +OPT1A: CAMN AC0,OP1TOP(ARG) ;ARE WE POINTING AT SYMBOL? + JRST OPT1D ;YES, GET THE CODE + JUMPE V,POPOUT ;TEST FOR END + CAML AC0,OP1TOP(ARG) ;NO, SHOULD WE MOVE DOWN? + TDOA ARG,V ;NO, INCREMENT +OPT1B: SUB ARG,V ;YES, DECREMENT + ASH V,-1 ;HALVE INCREMENT + CAIG ARG,OP1END-OP1TOP ;ARE WE OUT OF BOUNDS? + JRST OPT1A ;NO, TRY AGAIN + JRST OPT1B ;YES, BRING IT DOWN A PEG +> + +IFN OPHSH,< +OPTSCH: MOVE ARG,AC0 ;GET SIXBIT NAME + TLZ ARG,400000 ;CLEAR SIGN BIT + IDIVI ARG,PRIME ;REM. GOES IN V + CAMN AC0,OP1TOP(V) ;ARE WE POINTING AT SYMBOL? + JRST OPT1D ;YES + SKIPN OP1TOP(V) ;TEST FOR END + POPJ PP, ;SYMBOL NOT FOUND + HLRZ RC,ARG ;SAVE LHS OF QUOTIENT + SKIPA ARG,RC ;GET IT BACK +OPT1A: ADDI ARG,(RC) ;INCREMENT ARG + ADDI V,(ARG) ;QUADRATIC INCREASE TO V + CAIL V,PRIME ;V IS MODULO PRIME + JRST [SUBI V,PRIME + JRST .-1] + CAMN AC0,OP1TOP(V) ;IS THIS IT? + JRST OPT1D ;YES + SKIPE OP1TOP(V) ;END? + JRST OPT1A ;TRY AGAIN + POPJ PP, ;FAILED +> +OPT1D: +IFN OPHSH,< SETZ RC, ;CLEAR RELOCATION + MOVE ARG,V ;GET INDEX IN RIGHT ACC.> + IDIVI ARG,4 ;ARG HAS INDEX USED IN OPTTAB + LDB V,OPTTAB(V) ;V HAS INDEX TO OPTTAB + CAIL V,700 ;PSEUDO-OP OR IO INSTRUCTION? + JRST OPT1G ;YES + ROT V,-^D9 ;LEFT JUSTIFY + HRRI V,OP ;POINT TO BASIC FORMAT +OPT1F: AOS 0(PP) ;SET FOR SKIP EXIT + MOVEI SDEL,%OP ;SET OP-CODE CROSS-REF FLAG + JRST CREF ;TEST AND OUTPUT, AC0=SYMBOL, V=VALUE + +OPT1G: JUMPG AC0,.+3 ;IF ".","$",OR "%" USE TABLE 1 + TLNN AC0,200000 ;PSEUDO-OP OR IO INST., TEST FOR PROPER TABLE + SKIPA V,OP2TAB-700(V) ;2ND TABLE, FIRST LETTER IS "A" TO "O" + MOVE V,OP1TAB-700(V) ;1ST TABLE, ..."P" TO "Z" + JRST OPT1F ;EXIT + +OPTTAB: +IFE OPHSH,< POINT 9,OP1COD-1(ARG),35> + POINT 9,OP1COD (ARG), 8 + POINT 9,OP1COD (ARG),17 + POINT 9,OP1COD (ARG),26 +IFN OPHSH,< POINT 9,OP1COD (ARG),35> + + IFDEF .XCREF,< .XCREF ;DON'T CREF THIS MESS> +IFE OPHSH,< + RELOC .-1 +OP1TOP: + RELOC + + IF1,> + + IF2, < + N2=^D36 + CC=0 + RELOC OP1COD + RELOC +DEFINE X (SYMBOL,CODE) + +IFE N2, > + +DEFINE OUTLIT < + RELOC + +CC + RELOC +N2=^D36+>> + SYN X,XX ;JUST THE SAME MACRO> + +IFN OPHSH,< +DEFINE XX (SB,CD)<> ;A NUL MACRO +OP1TOP: IF1,< BLOCK PRIME> +IF1,> +IF2,< +DEFINE OPSTOR (RM)<.$'RM=.$'RM+>>> + +DEFINE X (SB,CD)< +SXB= +Q=SXB&-1_-1/PRIME +R=SXB&-1_-1-Q*PRIME +H=Q_-22&777 +TRY=1 +OPCODE=CD +ITEM Q,\R +IFL PRIME-TRY,> + +DEFINE ITEM (QT,RM)< +IFN .%'RM, +H=H+Q_-22&777 +IFGE PRIME-,> +IFE .%'RM,<.%'RM=SXB +OPSTOR \>>> +IF1,< +DEFINE GETSYM (N)<.%'N=0> + +N=0 + XLIST +REPEAT PRIME, +DEFINE GETSYM (N)<.$'N=0> +N=0 +REPEAT , +> + LIST> + +;MACRO TO HANDLE KI10 OP-CODES +IFE KI10,< +DEFINE XK (SB,CD) <> ;NUL MACRO> +IFN KI10, + IFN OPHSH,< ;PUT THE MOST USED OP CODES FIRST +X JRST , 254 +X PUSHJ , 260 +X POPJ , 263 +X PUSH , 261 +X POP , 262 +X AOS , 350 +X ASCIZ , 701 +X CALLI , 047 +X EXTERN, 724 +X INTERN, 744 +X JFCL , 255 +X JSP , 265 +X MOVE , 200 +X MOVEI , 201 +X MOVEM , 202 +X SETZM , 402 +X SIXBIT, 717 +X SOS , 370 +X TLNE , 603 +X TLNN , 607 +X TLO , 661 +X TLZ , 621 +X TLZA , 625 +X TLZE , 623 +X TLZN , 627 +X TRNE , 602 +X TRNN , 606 +X TRZ , 620 +> + X ADD , 270 +X ADDB , 273 +X ADDI , 271 +X ADDM , 272 + +X AND , 404 +X ANDB , 407 +X ANDCA , 410 +X ANDCAB, 413 +X ANDCAI, 411 +X ANDCAM, 412 +X ANDCB , 440 +X ANDCBB, 443 +X ANDCBI, 441 +X ANDCBM, 442 +X ANDCM , 420 +X ANDCMB, 423 +X ANDCMI, 421 +X ANDCMM, 422 +X ANDI , 405 +X ANDM , 406 + +X AOBJN , 253 +X AOBJP , 252 + +X AOJ , 340 +X AOJA , 344 +X AOJE , 342 +X AOJG , 347 +X AOJGE , 345 +X AOJL , 341 +X AOJLE , 343 +X AOJN , 346 + +XX AOS , 350 +X AOSA , 354 +X AOSE , 352 +X AOSG , 357 +X AOSGE , 355 +X AOSL , 351 +X AOSLE , 353 +X AOSN , 356 +X ARG , 320 +IFN WFWSW, +IFN IIISW, +X ASCII , 700 +XX ASCIZ , 701 + +X ASH , 240 +X ASHC , 244 + +X ASUPPR, 705 +X BLKI , 702 +X BLKO , 703 +X BLOCK , 704 + +X BLT , 251 + +X BYTE , 707 + +XX CAI , 300 +X CAIA , 304 +X CAIE , 302 +X CAIG , 307 +X CAIGE , 305 +X CAIL , 301 +X CAILE , 303 +X CAIN , 306 + +X CALL , 040 +XX CALLI , 047 + +XX CAM , 310 +X CAMA , 314 +X CAME , 312 +X CAMG , 317 +X CAMGE , 315 +X CAML , 311 +X CAMLE , 313 +X CAMN , 316 + +XX CLEAR , 400 +XX CLEARB, 403 +XX CLEARI, 401 +XX CLEARM, 402 + +X CLOSE , 070 +X COMMEN, 770 + + +X CONI , 710 +X CONO , 711 +IFN STANSW, +X CONSO , 712 +X CONSZ , 713 + +XX DATA. , 020 + +X DATAI , 714 +X DATAO , 715 +X DEC , 716 +X DEFINE, 717 +X DEPHAS, 720 + +XK DFAD , 110 +XK DFDV , 113 +XK DFMP , 112 +X DFN , 131 +XK DFSB , 111 + +X DIV , 234 +X DIVB , 237 +X DIVI , 235 +X DIVM , 236 + +XK DMOVE , 120 +XK DMOVEM, 124 +XK DMOVN , 121 +XK DMOVNM, 125 + +X DPB , 137 + +X END , 721 + +X ENTER , 077 + +X ENTRY , 722 + +X EQV , 444 +X EQVB , 447 +X EQVI , 445 +X EQVM , 446 + +X EXCH , 250 + +X EXP , 723 +XX EXTERN, 724 + +X FAD , 140 +X FADB , 143 +X FADL , 141 +X FADM , 142 + +X FADR , 144 +X FADRB , 147 +X FADRI , 145 +X FADRM , 146 + +X FDV , 170 +X FDVB , 173 +X FDVL , 171 +X FDVM , 172 + +X FDVR , 174 +X FDVRB , 177 +X FDVRI , 175 +X FDVRM , 176 + +XX FIN. , 021 + +IFN STANSW, +IFE STANSW, +XK FIXR , 126 +XK FLTR , 127 + +X FMP , 160 +X FMPB , 163 +X FMPL , 161 +X FMPM , 162 + + X FMPR , 164 +X FMPRB , 167 +X FMPRI , 165 +X FMPRM , 166 + +X FSB , 150 +X FSBB , 153 +X FSBL , 151 +X FSBM , 152 + +X FSBR , 154 +X FSBRB , 157 +X FSBRI , 155 +X FSBRM , 156 + +X FSC , 132 + +X GETSTS, 062 + + X HALT , 725 +X HISEG , 706 + +X HLL , 500 +X HLLE , 530 +X HLLEI , 531 +X HLLEM , 532 +X HLLES , 533 +X HLLI , 501 +X HLLM , 502 +X HLLO , 520 +X HLLOI , 521 +X HLLOM , 522 +X HLLOS , 523 +X HLLS , 503 +X HLLZ , 510 +X HLLZI , 511 +X HLLZM , 512 +X HLLZS , 513 + +X HLR , 544 +X HLRE , 574 +X HLREI , 575 +X HLREM , 576 +X HLRES , 577 +X HLRI , 545 +X HLRM , 546 +X HLRO , 564 +X HLROI , 565 +X HLROM , 566 +X HLROS , 567 +X HLRS , 547 +X HLRZ , 554 +X HLRZI , 555 +X HLRZM , 556 +X HLRZS , 557 + + X HRL , 504 +X HRLE , 534 +X HRLEI , 535 +X HRLEM , 536 +X HRLES , 537 +X HRLI , 505 +X HRLM , 506 +X HRLO , 524 +X HRLOI , 525 +X HRLOM , 526 +X HRLOS , 527 +X HRLS , 507 +X HRLZ , 514 +X HRLZI , 515 +X HRLZM , 516 +X HRLZS , 517 + +X HRR , 540 +X HRRE , 570 +X HRREI , 571 +X HRREM , 572 +X HRRES , 573 +X HRRI , 541 +X HRRM , 542 +X HRRO , 560 +X HRROI , 561 +X HRROM , 562 +X HRROS , 563 +X HRRS , 543 +X HRRZ , 550 +X HRRZI , 551 +X HRRZM , 552 +X HRRZS , 553 + +X IBP , 133 + +X IDIV , 230 +X IDIVB , 233 +X IDIVI , 231 +X IDIVM , 232 + +X IDPB , 136 + +X IF1 , 726 +X IF2 , 727 +X IFB , 730 +X IFDEF , 731 +X IFDIF , 732 +X IFE , 733 +X IFG , 734 +X IFGE , 735 +X IFIDN , 736 +X IFL , 737 +X IFLE , 740 +X IFN , 741 +X IFNB , 742 +X IFNDEF, 743 + +X ILDB , 134 + +X IMUL , 220 +X IMULB , 223 +X IMULI , 221 +X IMULM , 222 + +X IN , 056 +XX IN. , 016 +X INBUF , 064 +XX INF. , 026 +X INIT , 041 +X INPUT , 066 +IFN WFWSW, + +XX INTERN, 744 + +X IOR , 434 +X IORB , 437 +X IORI , 435 +X IORM , 436 + + +X IOWD , 745 +X IRP , 746 +X IRPC , 747 +X JCRY , 750 +X JCRY0 , 751 +X JCRY1 , 752 +X JEN , 753 + +XX JFCL , 255 + +X JFFO , 243 +X JFOV , 765 +X JOV , 754 + +X JRA , 267 +XX JRST , 254 + +X JRSTF , 755 + +X JSA , 266 +XX JSP , 265 +X JSR , 264 + +XX JUMP , 320 +XX JUMPA , 324 +X JUMPE , 322 +X JUMPG , 327 +X JUMPGE, 325 +X JUMPL , 321 +X JUMPLE, 323 +X JUMPN , 326 + +X LALL , 756 + +X LDB , 135 + +X LIST , 757 +X LIT , 760 +X LOC , 761 + +X LOOKUP, 076 + +X LSH , 242 +X LSHC , 246 +IFN WFWSW, +XK MAP , 257 +X MLOFF , 767 +X MLON , 766 +XX MOVE , 200 +XX MOVEI , 201 +XX MOVEM , 202 +X MOVES , 203 +X MOVM , 214 +X MOVMI , 215 +X MOVMM , 216 +X MOVMS , 217 +X MOVN , 210 +X MOVNI , 211 +X MOVNM , 212 +X MOVNS , 213 +X MOVS , 204 +X MOVSI , 205 +X MOVSM , 206 +X MOVSS , 207 + + +X MTAPE , 072 +XX MTOP. , 024 + +X MUL , 224 +X MULB , 227 +X MULI , 225 +X MULM , 226 +XX NLI. , 031 +XX NLO. , 032 + +X NOSYM , 762 + + X OCT , 763 +X OPDEF , 764 + +X OPEN , 050 + +X OR , 434 +X ORB , 437 +X ORCA , 454 +X ORCAB , 457 +X ORCAI , 455 +X ORCAM , 456 +X ORCB , 470 +X ORCBB , 473 + +X ORCBI , 471 +X ORCBM , 472 +X ORCM , 464 +X ORCMB , 467 +X ORCMI , 465 +X ORCMM , 466 +X ORI , 435 +X ORM , 436 + +X OUT , 057 +XX OUT. , 017 +X OUTBUF, 065 +XX OUTF. , 027 +X OUTPUT, 067 + + X PAGE , 700 +X PASS2 , 701 +X PHASE , 702 +X POINT , 703 + +XX POP , 262 +XX POPJ , 263 + +X PRGEND, 714 +X PRINTX, 704 +X PURGE , 705 + +XX PUSH , 261 +XX PUSHJ , 260 + +X RADIX , 706 +X RADIX5, 707 + +X RELEAS, 071 + +X RELOC , 710 +X REMARK, 711 + +X RENAME, 055 + +X REPEAT, 712 + +XX RESET., 015 +X RIM , 715 +X RIM10 , 735 +X RIM10B, 736 + +X ROT , 241 +X ROTC , 245 + +X RSW , 716 +XX RTB. , 022 +X SALL , 720 +X SEARCH, 721 + +X SETA , 424 +X SETAB , 427 +X SETAI , 425 +X SETAM , 426 +X SETCA , 450 +X SETCAB, 453 +X SETCAI, 451 +X SETCAM, 452 +X SETCM , 460 +X SETCMB, 463 +X SETCMI, 461 +X SETCMM, 462 +X SETM , 414 +X SETMB , 417 +X SETMI , 415 +X SETMM , 416 +X SETO , 474 +X SETOB , 477 +X SETOI , 475 +X SETOM , 476 +X SETSTS, 060 +X SETZ , 400 +X SETZB , 403 +X SETZI , 401 +XX SETZM , 402 + +XX SIXBIT, 717 + +XX SKIP , 330 +X SKIPA , 334 +X SKIPE , 332 +X SKIPG , 337 +X SKIPGE, 335 +X SKIPL , 331 +X SKIPLE, 333 +X SKIPN , 336 + +XX SLIST., 025 + +X SOJ , 360 +X SOJA , 364 +X SOJE , 362 +X SOJG , 367 +X SOJGE , 365 +X SOJL , 361 +X SOJLE , 363 +X SOJN , 366 + +XX SOS , 370 +X SOSA , 374 +X SOSE , 372 +X SOSG , 377 +X SOSGE , 375 +X SOSL , 371 +X SOSLE , 373 +X SOSN , 376 + +IFN STANSW, +X SQUOZE, 707 + +X STATO , 061 +X STATUS, 062 +X STATZ , 063 + +X STOPI , 722 + +X SUB , 274 +X SUBB , 277 +X SUBI , 275 +X SUBM , 276 + +IF2,> +X SUBTTL, 723 +X SUPPRE, 713 +X SYN , 724 +X TAPE , 725 + + X TDC , 650 +X TDCA , 654 +X TDCE , 652 +X TDCN , 656 +X TDN , 610 +X TDNA , 614 +X TDNE , 612 +X TDNN , 616 +X TDO , 670 +X TDOA , 674 +X TDOE , 672 +X TDON , 676 +X TDZ , 630 +X TDZA , 634 +X TDZE , 632 +X TDZN , 636 + +X TITLE , 726 + +X TLC , 641 +X TLCA , 645 +X TLCE , 643 +X TLCN , 647 +X TLN , 601 +X TLNA , 605 +XX TLNE , 603 +XX TLNN , 607 +XX TLO , 661 +X TLOA , 665 +X TLOE , 663 +X TLON , 667 +XX TLZ , 621 +XX TLZA , 625 +XX TLZE , 623 +XX TLZN , 627 + + X TRC , 640 +X TRCA , 644 +X TRCE , 642 +X TRCN , 646 +X TRN , 600 +X TRNA , 604 +XX TRNE , 602 +XX TRNN , 606 +X TRO , 660 +X TROA , 664 +X TROE , 662 +X TRON , 666 +XX TRZ , 620 +X TRZA , 624 +X TRZE , 622 +X TRZN , 626 + +X TSC , 651 +X TSCA , 655 +X TSCE , 653 +X TSCN , 657 +X TSN , 611 +X TSNA , 615 +X TSNE , 613 + +X TSNN , 617 +X TSO , 671 +X TSOA , 675 +X TSOE , 673 +X TSON , 677 +X TSZ , 631 +X TSZA , 635 +X TSZE , 633 +X TSZN , 637 +X TTCALL, 051 +X TWOSEG, 731 +X UFA , 130 +X UGETF , 073 +X UJEN , 100 +X UNIVER, 737 +X USETI , 074 +X USETO , 075 + +X VAR , 727 + +XX WTB. , 023 + +X XALL , 732 + +X XCT , 256 + +X XLIST , 733 + +X XOR , 430 +X XORB , 433 +X XORI , 431 +X XORM , 432 + +X XPUNGE, 730 +X XWD , 734 + +X Z , 000 + +X .CREF , 740 +X .HWFRM, 742 +X .MFRMT, 743 +X .XCREF, 741 + + + IFN OPHSH,< ;NO-OPS, OLD MNEMONICS,F4 UUOS +X CAI , 300 +X CAM , 310 +X CLEAR , 400 +X CLEARB, 403 +X CLEARI, 401 +X CLEARM, 402 +X JUMP , 320 +X JUMPA , 324 +X SKIP , 330 +X RESET., 015 +X IN. , 016 +X OUT. , 017 +X DATA. , 020 +X FIN. , 021 +X RTB. , 022 +X WTB. , 023 +X MTOP. , 024 +X SLIST., 025 +X INF. , 026 +X OUTF. , 027 +X NLI. , 031 +X NLO. , 032 +> + IFE OPHSH,< +IF1, < BLOCK N1> +OP1END: -1B36 +OP1COD: BLOCK N1/4 + CC> +IFN OPHSH,< +IF2,< +DEFINE SETVAL (N) +N=0 +XLIST +REPEAT PRIME, +LIST +> +OP1COD: IF1,< BLOCK > +IF2,< +DEFINE SETVAL (N) +N=0 +XLIST +REPEAT , +> +LIST> + +IFDEF .CREF,< .CREF ;START CREFFING AGAIN> + SUBTTL PERMANENT SYMBOLS +SYMNUM: EXP LENGTH/2 ;NUMBER OF PERMANENT SYMBOLS +DEFINE P (A,B)< + SIXBIT /A/ + XWD SYMF!NOOUTF,B> + +P @, 0(SUPRBT) +P ??????, 0(SUPRBT) + +LENGTH= .-SYMNUM-1 ;LENGTH OF INITIAL SYMBOLS + +PRMTBL: ;PERMANENT SYMBOLS +P ADC, 24 +P APR, 0 +P CCI, 14 +P CDP, 110 +P CDR, 114 +P CPA, 0 +P CR, 150 +P DC, 200 +P DCSA, 300 +P DCSB, 304 +P DF, 270 +P DIS, 130 +P DLS, 240 +P DPC, 250 +P DSK, 170 +P DTC, 320 +P DTS, 324 +P LPT, 124 +P MDF, 260 +P MTC, 220 +P MTM, 230 +P MTS, 224 +P PAG, 10 +P PI, 4 +P PLT, 140 +P PTP, 100 +P PTR, 104 + +P TMC, 340 +P TMS, 344 +P TTY, 120 +P UTC, 210 +P UTS, 214 +IFE LNSSW,< XLIST > +IFN LNSSW,< ;SPECIAL DEVICES FOR PEPR +P .A,550 +P .AB,434 +P .ANG,440 +P .B,554 +P .BITE,470 +P .FA,564 +P .GAIN,520 +P .GATE,444 +P .IA,560 +P .INC,514 +P .LC,474 +P .LG,570 +P .PEPR,400 +P .RG,574 +P .SCON,430 +P .STAT,410 +P .TC,500 +P .TED,540 +P .THR,544 +P .TRK,404 +P .VIEW,524> + LIST +PRMEND: ;END OF PERMANENT SYMBOLS + + OPDEF ZL [Z LITF] ;INVALID IN LITERALS + OPDEF ZA [Z ADDF] ;INVALID IN ADDRESSES + OPDEF ZAL [Z ADDF!LITF] + +OP1TAB: + + ZA PAGE0 ;PAGE + ZAL PASS20 ;PASS2 + ZAL PHASE0 ;PHASE + Z POINT0 ;POINT + ZA PRNTX0 ;PRINTX + ZA PURGE0 ;PURGE + ZA RADIX0 ;RADIX + Z RADX50 ;RADIX50,SQUOZE + ZAL LOC0 (1) ;RELOC + ZAL REMAR0 ;REMARK + ZA REPEA0 ;REPEAT + ZA SUPRE0 ;SUPRESS + ZAL PSEND0 ;PRGEND + ZAL RIM0 (RIMSW) ;RIM + DATAI 0,IOP ;RSW + Z ASCII0 (1) ;SIXBIT + ZAL IOSET (IOPALL!IOSALL) ;SALL + ZAL SERCH0 ;SEARCH + ZA STOPI0 ;STOPI + ZA SUBTT0 (Z (POINT 7,,)) ;SUBTTL + ZA SYN0 ;SYN + ZAL TAPE0 ;TAPE + ZA TITLE0 (Z (POINT 7,,)) ;TITLE + ZAL VAR0 ;VAR + + Z XPUNG0 ;XPUNGE + ZAL TWSEG0 ;TWOSEGMENTS + ZAL XALL0 (IOPALL) ;XALL + ZAL IOSET (IOPROG) ;XLIST + Z XWD0 ;XWD + ZAL RIM0 (RIM1SW) ;RIM10 + ZAL RIM0 (R1BSW) ;RIM10B + ZA UNIV0 (Z (POINT 7,,)) ;UNIVERSAL + ZAL IORSET (IONCRF) ;.CREF + ZAL IOSET (IONCRF) ;.XCREF + ZA OFFORM ;.HWFRMT + ZA ONFORM ;.MFRMT + OP2TAB: + + Z ASCII0 (0) ;ASCII + Z ASCII0 (1B18) ;ASCIZ + BLKI IOP ;BLKI + BLKO IOP ;BLKO + ZAL BLOCK0 ;BLOCK + ZA SUPRSA ;ASUPPRESS + ZAL HISEG0 ;HISEG + Z BYTE0 ;BYTE + CONI IOP ;CONI + CONO IOP ;CONO + CONSO IOP ;CONSO + CONSZ IOP ;CONSZ + DATAI IOP ;DATAI + DATAO IOP ;DATAO + Z OCT0 (^D10) ;DEC + ZA DEFIN0 ;DEFINE + + ZAL DEPHA0 ;DEPHASE + ZAL END0 ;END + ZA INTER0 (INTF!ENTF) ;ENTRY + Z EXPRES ;EXP + ZA EXTER0 ;EXTERN + JRST 4,OP ;HALT + TLNN FR,IFPASS ;IF1 + TLNE FR,IFPASS ;IF2 + + TRNE AC0,IFB0 ;IFB + TLNE ARG,IFDEF0 ;IFDEF + Z IFIDN0 (0) ;IFDIF + SKIPE IF ;IFE + SKIPG IF ;IFG + SKIPGE IF ;IFGE + Z IFIDN0 (1) ;IFIDN + SKIPL IF ;IFL + + SKIPLE IF ;IFLE + SKIPN IF ;IFN + TRNN AC0,IFB0 ;IFNB + TLNN ARG,IFDEF0 ;IFNDEF + ZA INTER0 (INTF) ;INTERN + Z IOWD0 ;IOWD + Z IRP0 (0) ;IRP + Z IRP0 (400000) ;IRPC + + JFCL 6,OP ;JCRY + JFCL 4,OP ;JCRY0 + JFCL 2,OP ;JCRY1 + JRST 12,OP ;JEN + JFCL 10,OP ;JOV + JRST 2,OP ;JRSTF + ZAL IORSET (IOPALL!IOSALL) ;LALL + ZAL IORSET (IOPROG) ;LIST + ZAL LIT0 ;LIT + ZAL LOC0 (0) ;LOC + ZA OFFSYM ;NOSYM + Z OCT0 (^D8) ;OCT + ZA OPDEF0 ;OPDEF + JFCL 1,OP ;JFOV + ZA ONML ;MLON + ZA OFFML ;MLOFF + Z ASCII0 (3B19) ;COMMENT +IFN IIISW!WFWSW,< + Z ASCII0 (5B20) ;ASCID +IFN WFWSW,< + ZAL %ARAY ;ARRAY + ZAL %INTEG ;INTEGER + ZAL %LVAR ;LVAR>> + +CALTBL: + ;USER DEFINED CALLI'S GO HERE + SIXBIT /LIGHTS/ ;-1 +CALLI0: SIXBIT /RESET/ ; 0 + SIXBIT /DDTIN/ ; 1 + SIXBIT /SETDDT/ ; 2 + SIXBIT /DDTOUT/ ; 3 + SIXBIT /DEVCHR/ ; 4 + SIXBIT /DDTGT/ ; 5 + SIXBIT /GETCHR/ ; 6 + SIXBIT /DDTRL/ ; 7 + SIXBIT /WAIT/ ;10 + SIXBIT /CORE/ ;11 + SIXBIT /EXIT/ ;12 + SIXBIT /UTPCLR/ ;13 + SIXBIT /DATE/ ;14 + SIXBIT /LOGIN/ ;15 + SIXBIT /APRENB/ ;16 + SIXBIT /LOGOUT/ ;17 + SIXBIT /SWITCH/ ;20 + SIXBIT /REASSI/ ;21 + SIXBIT /TIMER/ ;22 + SIXBIT /MSTIME/ ;23 + SIXBIT /GETPPN/ ;24 + SIXBIT /TRPSET/ ;25 + SIXBIT /TRPJEN/ ;26 + SIXBIT /RUNTIM/ ;27 + SIXBIT /PJOB/ ;30 + SIXBIT /SLEEP/ ;31 + SIXBIT /SETPOV/ ;32 + SIXBIT /PEEK/ ;33 + SIXBIT /GETLIN/ ;34 + SIXBIT /RUN/ ;35 + SIXBIT /SETUWP/ ;36 + SIXBIT /REMAP/ ;37 + SIXBIT /GETSEG/ ;40 + SIXBIT /GETTAB/ ;41 + SIXBIT /SPY/ ;42 + SIXBIT /SETNAM/ ;43 + SIXBIT /TMPCOR/ ;44 + SIXBIT /DSKCHR/ ;45 + SIXBIT /SYSSTR/ ;46 + SIXBIT /JOBSTR/ ;47 + SIXBIT /STRUUO/ ;50 + SIXBIT /SYSPHY/ ;51 + SIXBIT /FRECHN/ ;52 + SIXBIT /DEVTYP/ ;53 + SIXBIT /DEVSTS/ ;54 + SIXBIT /DEVPPN/ ;55 + SIXBIT /SEEK/ ;56 + SIXBIT /RTTRP/ ;57 + SIXBIT /LOCK/ ;60 + SIXBIT /JOBSTS/ ;61 + SIXBIT /LOCATE/ ;62 + SIXBIT /WHERE/ ;63 + SIXBIT /DEVNAM/ ;64 + SIXBIT /CTLJOB/ ;65 + SIXBIT /GOBSTR/ ;66 + 0 ;67 + 0 ;70 + SIXBIT /HPQ/ ;71 + SIXBIT /HIBER/ ;72 + SIXBIT /WAKE/ ;73 + SIXBIT /CHGPPN/ ;74 + SIXBIT /SETUUO/ ;75 + SIXBIT /DEVGEN/ ;76 + SIXBIT /OTHUSR/ ;77 + SIXBIT /CHKACC/ ;100 + SIXBIT /DEVSIZ/ ;101 + SIXBIT /DAEMON/ ;102 + SIXBIT /JOBPEK/ ;103 + SIXBIT /ATTACH/ ;104 + SIXBIT /DAEFIN/ ;105 + SIXBIT /FRCUUO/ ;106 + SIXBIT /DEVLNM/ ;107 + SIXBIT /PATH./ ;110 + +CALNTH==.-CALTBL +NEGCAL==CALLI0-CALTBL ;NUMBER OF NEGATIVE CALLI'S + +TTCTBL: SIXBIT /INCHRW/ ; 0 INPUT A CHAR. AND WAIT + SIXBIT /OUTCHR/ ; 1 OUTPUT A CHAR. + SIXBIT /INCHRS/ ; 2 INPUT A CHAR. AND SKIP + SIXBIT /OUTSTR/ ; 3 OUTPUT A STRING + SIXBIT /INCHWL/ ; 4 INPUT CHAR., WAIT, LINE MODE + SIXBIT /INCHSL/ ; 5 INPUT CHAR., SKIP, LINE MODE + SIXBIT /GETLCH/ ; 6 GET LINE CHARACTERISTICS + SIXBIT /SETLCH/ ; 7 SET LINE CHARACTERISTICS + SIXBIT /RESCAN/ ;10 RESET INPUT STREAM TO COMMAND + SIXBIT /CLRBFI/ ;11 CLEAR TYPEIN BUFFER + SIXBIT /CLRBFO/ ;12 CLEAR TYPEOUT BUFFER + SIXBIT /SKPINC/ ;13 SKIPS IF A CHAR. CAN BE INPUT + SIXBIT /SKPINL/ ;14 SKIPS IF A LINE CAN BE INPUT + SIXBIT /IONEOU/ ;15 OUTPUT AS AN IMAGE CHAR. + +TTCLTH==.-TTCTBL + SUBTTL USER-DEFINED SYMBOL SEARCH ROUTINES +MSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH + POPJ PP, ;NOT FOUND, EXIT + JUMPG ARG,MSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND + CAME AC0,1(SX) ;WE ARE LOOKING AT SYMBOL, TRY ONE ABOVE + POPJ PP, ;NO, EXIT + ADDI SX,2 ;YES, POINT TO IT + PUSHJ PP,SRCH5 ;LOAD REGISTERS +MSRCH2: AOSA 0(PP) ;SET SKIP-EXIT +QSRCH: JUMPL ARG,SSRCH3 ;BRANCH IF OPERAND + MOVEI SDEL,%MAC ;SET OPERATOR FLAG + TLZE IO,DEFCRS ;IS IT A DEFINITION? + MOVEI SDEL,%DMAC ;YES + JRST CREF ;CROSS-REF AND EXIT + +SSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH + POPJ PP, ;NOT FOUND, EXIT + JUMPL ARG,SSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND +SSRCH1: CAME AC0,-3(SX) ;WE ARE LOOKING AT MACRO, LOOK ONE SLOT BELOW + POPJ PP, ;NO DICE, EXIT + SUBI SX,2 ;YES, POINT TO IT + PUSHJ PP,SRCH5 ;LOAD REGISTERS +SSRCH2: AOS 0(PP) ;SET FOR SKIP-EXIT +SSRCH3: MOVEI SDEL,%SYM ;SET OPERAND FLAG + +CREF: TLNN IO,IONCRF ;NO CREFFING FOR THIS SYMBOL? + TLNE FR,P1!CREFSW ;PASS ONE OR CROSS-REF SUPPRESSION? + POPJ PP, ;YES, EXIT + EXCH SDEL,C ;PUT FLAG IN C, SACE C + PUSH PP,CS + TLNE IO,IOCREF ;HAVE WE PUT OUT THE 177,102 + JRST CREF3 ;YES + PUSH PP,C ;START OF CREF DATA + + REPEAT 0,< ;NEEDS CHANGE TO CREF + MOVEI C,177 + PUSHJ PP,OUTLST + MOVEI C,102 + PUSHJ PP,OUTLST + TLO IO,IOCREF ;WE NOW ARE IN THAT STATE + POP PP,C ;WE HAVE NOW +CREF3: JUMPE C,NOFLG ;JUST CLOSE IT + PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM) + MOVSI CS,770000 ;COUNT CHRS + TDZA C,C ;STARTING AT 0 + LSH CS,-6 ;TRY NEXT + TDNE AC0,CS ;IS THAT ONE THERE? + AOJA C,.-2 ;YES + PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS + MOVE CS,AC0 + +CREF2: MOVEI C,0 + LSHC C,6 + ADDI C,40 + PUSHJ PP,OUTLST ;THE ASCII SYMBOL + JUMPN CS,CREF2 + MOVEI C,%DSYM + TLZE IO,DEFCRS + PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE +NOFLG: MOVE C,SDEL + POP PP,CS + POPJ PP, + +CLSCRF: TRNN ER,LPTSW + POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING +CLSCR2: MOVEI C,177 + PUSHJ PP,PRINT + TLZE IO,IOCREF ;WAS IT OPEN? + JRST CLSCR1 ;YES, JUST CLOSE IT + MOVEI C,102 ;NO, OPEN IT FIRST + PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA + MOVEI C,177 + PUSHJ PP,OUTLST +CLSCR1: MOVEI C,103 + JRST OUTLST ;MARK END OF CREF DATA + +CLSC3: TLZ IO,IOCREF + MOVEI C,177 + PUSHJ PP,OUTLST + MOVEI C,104 + JRST OUTLST ;177,104 CLOSES IT FOR NOW +> ;END OF REPEAT 0 + REPEAT 1,< ;WORKS WITH EXISTING CREF + TLNE IO,IOPAGE + PUSHJ PP,CRFHDR ;GET CORRECT SUBTTL + MOVEI C,177 + PUSHJ PP,OUTLST + MOVEI C,102 + PUSHJ PP,OUTLST + TLO IO,IOCREF ;WE NOW ARE IN THAT STATE + POP PP,C ;WE HAVE NOW +CREF3: PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM) + MOVSI CS,770000 ;COUNT CHRS + TDZA C,C ;STARTING AT 0 + LSH CS,-6 ;TRY NEXT + TDNE AC0,CS ;IS THAT ONE THERE? + AOJA C,.-2 ;YES + PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS + MOVE CS,AC0 + +CREF2: MOVEI C,0 + LSHC C,6 + ADDI C,40 + PUSHJ PP,OUTLST ;THE ASCII SYMBOL + JUMPN CS,CREF2 + MOVEI C,%DSYM + TLZE IO,DEFCRS + PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE + MOVE C,SDEL + POP PP,CS + POPJ PP, + +IFN OPHSH,< +SUBTL: SIXBIT /SUBTTL/> +CRFHDR: CAME AC0,SUBTL ;IS FIRST SYMBOL "SUBTTL" + JRST CRFHD1 ;NO + HLLZ AC0,V + PUSHJ PP,SUBTT0 ;UPDATE SUBTTL + MOVE AC0,SUBTL ;RESTORE ARG. + MOVEI V,CPOPJ +CRFHD1: MOVEI C,0 + JRST OUTL + +CLSC3: +CLSCRF: TRNN ER,LPTSW + POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING +CLSCR2: TLZE IO,IOCREF ;FINISH UP LINE + JRST CLSCR1 + MOVEI C,0 + TLNE IO,IOPAGE ;NEW PAGE? + PUSHJ PP,OUTL ;YES,GIVE IT A ROUSING SENDOFF! + MOVEI C,177 + PUSHJ PP,OUTLST + MOVEI C,102 + PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA +CLSCR1: MOVEI C,177 + PUSHJ PP,OUTLST + MOVEI C,103 + JRST OUTLST ;MARK END OF CREF DATA +> ;END OF REPEAT 1 + SEARCH: HLRZ SX,SRCHX + HRRZ SDEL,SRCHX + +SRCH1: CAML AC0,-1(SX) + JRST SRCH3 +SRCH2: SUB SX,SDEL + LSH SDEL,-1 + CAMG SX,SYMTOP + JUMPN SDEL,SRCH1 + JUMPN SDEL,SRCH2 + SOJA SX,SRCHNO ;NOT FOUND + +SRCH3: CAMN AC0,-1(SX) + JRST SRCH4 ;NORMAL / FOUND EXIT + ADD SX,SDEL + LSH SDEL,-1 + CAMG SX,SYMTOP + JUMPN SDEL,SRCH1 + JUMPN SDEL,SRCH2 + SOJA SX,SRCHNO ;NOT FOUND + +SRCH4: AOS 0(PP) ;SET FOR SKIP EXIT +SRCH5: MOVSI ARG,SUPRBT ;HE IS USING IT, TURN OFF BIT + ANDCAM ARG,(SX) ; IN THE TABLE +SRCH7: MOVE ARG,0(SX) ;FLAG AND VALUE TO ARG + LDB RC,RCPNTR ;POINT 1,ARG,17 + TLNE ARG,LELF ;CHECK LEFT RELOCATE + TLO RC,1 + HRRZ V,ARG + TLNE ARG,SPTR ;CHECK SPECIAL EXTESN POINTER + JRST SRCH6 + TLNE ARG,PNTF + MOVE V,0(ARG) ;36BIT VALUE TO V + JRST SRCHOK + +SRCH6: MOVE V,0(ARG) ;VALUE + MOVE RC,1(ARG) ;AND RELOC + TLNE RC,-2 ;CHECK AND SET EXTPNT + HLLM RC,EXTPNT + TRNE RC,-2 + HRRM RC,EXTPNT + JRST SRCHOK +SRCHNO: SKIPN UNISCH+1 ;ALLOWED TO SEARCH OTHER TABLES + POPJ PP, ;NO, JUST RETURN + AOS V,UNISCH ;GET NEXT INDEX TO TABLE + CAIE V,1 ;FIRST TIME IN + JRST SRCHN1 ;YES, SAVE SYMBOL INFO + HRLM SX,UNISCH ;SAVE SX AND SET FLAG + MOVE ARG,SRCHX ;SEARCH POINTER + MOVEM ARG,UNISHX ;TO A SAFE PLACE + HRR ARG,SYMBOL + HRL ARG,SYMTOP + MOVEM ARG,UNIPTR ;STORE ALSO +SRCHN1: MOVE V,UNISCH(V) ;GET TRUE INDEX + JUMPE V,SRCHKO ;IF ZERO ALL TABLE SCANNED + MOVE ARG,UNISHX(V) ;NEW SRCHX + MOVEM ARG,SRCHX ;SET IT UP + MOVE ARG,UNIPTR(V) ;SYMTOP,,SYMBOL + HRRZM ARG,SYMBOL + HLRZM ARG,SYMTOP + JRST SEARCH ;TRY AGAIN + +SRCHKO: SETZ ARG, ;CLEAR ARG SO ZERO STORED +SRCHOK: SKIPN UNISCH ;HAVE WE SEARCH OTHER TABLES + POPJ PP, ;NO, JUST RETURN +SYMBCK: HLRZ SX,UNISCH ;RESTORE SX + SETZM UNISCH ;CLEAR SYMBCK FLAG + PUSH PP,V ;SAVE AN AC + MOVE V,UNISHX ;SRCHX + MOVEM V,SRCHX ;RESTORE ORIGINAL + MOVE V,UNIPTR ;SYMTOP,,SYMBOL + HRRZM V,SYMBOL + HLRZM V,SYMTOP + JUMPE ARG,SRCHK2 ;TOTALLY UNDEFINED + PUSH PP,RC ;SAVE SOME ACCS + PUSH PP,ARG + PUSH PP,EXTPNT + SETZB ARG,EXTPNT ;CLEAR ALL SYMBOL DATA + SETZB RC,V + PUSHJ PP,INSERT ;INSERT SYMBOL IN TABLE + POP PP,EXTPNT ;RESTORE ACCS ETC. + POP PP,ARG + POP PP,RC + MOVEM ARG,(SX) ;SET FLAGS AND VALUE AS IT SHOULD BE +SRCHK2: POP PP,V + POPJ PP, ;RETURN + + INSERQ: TLNE ARG,UNDF!VARF +INSERZ: SETZB RC,V +INSERT: CAME AC0,-1(SX) ;ARE WE LOOKING AT MATCHING MNEMONIC? + JRST INSRT2 ;NO, JUST INSERT + JUMPL ARG,INSRT1 ;YES, BRANCH IF OPERAND + SKIPL 0(SX) ;OPERATOR, ARE WE LOOKING AT ONE? + JRST UPDATE ;YES, UPDATE + JRST INSRT2 ;NO, INSERT + +INSRT1: SKIPG 0(SX) ;OPERAND, ARE WE LOOKING AT ONE? + JRST UPDATE ;YES, UPDATE + SUBI SX,2 ;NO, MOVE UNDER OPERATOR AND INSERT +INSRT2: MOVE SDEL,SYMBOL + SUBI SDEL,2 + CAMLE SDEL,FREE + JRST INSRT3 + PUSHJ PP,XCEEDS + ADDI SDEL,2000 +INSRT3: MOVEM SDEL,SYMBOL ;MAKE ROOM FOR A TWO WORD ENTRY + HRLI SDEL,2(SDEL) + BLT SDEL,-2(SX) ;PUSH EVERYONE DOWN TWO LOACTIONS + AOS @SYMBOL ;INCREMENT THE SYMBOL COUNT + TLNN RC,-2 ;NEED SPECIAL? + TRNE RC,-2 ;LEFT OR RIGHT EXTERNAL? + JRST INSRT5 ;YES, JUMP + TLNN V,-1 ;SKIP IF V IS A 36BIT VALUE + JRST INSRT4 ;JUMP, ITS A 18BIT VALUE + AOS SDEL,FREE ;36BIT, SO GET A CELL FROM FREE CORE + CAML SDEL,SYMBOL ;MORE CORE NEEDED? + PUSHJ PP,XCEEDS ;YES + HRRI ARG,-1(SDEL) ;POINTER TO ARG + MOVEM V,0(ARG) ;36BIT VALUE TO FREE CORE + TLOA ARG,PNTF ;NOTE THAT ARG IS APOINTER, NOT A 18BIT VALUE + +INSRT4: HRR ARG,V ;18BIT VALUE TO ARG + DPB RC,RCPNTR ;FIX RIGHT RELOCATION + TLNE RC,1 + TLO ARG,LELF ;FIX LEFT RELOCATION +INSRT6: MOVEM ARG,0(SX) ;INSERT FLAGS AND VALUE. + MOVEM AC0,-1(SX) ;INSERT SYMBOL NAME. + PUSHJ PP,SRCHI ;INITILIAZE SRCHX + JRST QSRCH ;EXIT THROUGH CREF + +INSRT5: MOVEI SDEL,2 ;GET TWO CELLS FROM FREE CORE + ADDB SDEL,FREE + CAML SDEL,SYMBOL;MORE CORE NEEDED? + PUSHJ PP,XCEEDS ;YES + MOVEM RC,-1(SDEL) + HRRI ARG,-2(SDEL) ;POINTER TO ARG + MOVEM V,0(ARG) + TLO ARG,SPTR ;SET SPECIAL POINTER, POINTS TO TWO CELLS + JRST INSRT6 + REMOVE: SUBI SX,2 ;MOVE EVERYONE UP TWO LOCATIONS +REMOV1: MOVE 0(SX) + MOVEM 2(SX) ;OVERWRITE THE DELETED SYMBOL + CAME SX,SYMBOL ;SKIP WHEN DONE + SOJA SX,REMOV1 + ADDI SX,2 + MOVEM SX,SYMBOL + SOS 0(SX) ;DECREMENT THE SYMBOL COUNT + +SRCHI: MOVEI AC2,0 ;THIS CODE SETS UP SRCHX + FAD AC2,@SYMBOL + LSH AC2,-^D27 + MOVEI AC1,1000 + LSH AC1,-357(AC2) + HRRM AC1,SRCHX + LSH AC1,1 + ADD AC1,SYMBOL + HRLM AC1,SRCHX + POPJ PP, ;SRCHX=XWD ,LENGTH/4 + + UPDATE: DPB RC,RCPNTR ;FIX RIGHT RELOCATION + TLNE ARG,SPTR ;SKIP IF THERE IS NO SPECIAL POINTER + JRST UPDAT4 ;YES, USE THE TWO CELLS + TLNN RC,-2 ;NEED TO CHANGE + TRNE RC,-2 ;ANY CURRENT EXTERNS? + JRST UPDAT5 ;YES ,JUMP + TLZ ARG,LELF ;CLEAR LELF + TLNE RC,1 ;LEFT RELOCATABLE? + TLO ARG,LELF ;YES, SET THE FLAG + TLNE ARG,PNTF ;WAS THERE A 36BIT VALUE? + JRST UPDAT2 ;YES, USE IT. + TLNE V,-1 ;NO,IS THERE A 36BIT VALUE? + JRST UPDAT1 ;YES, GET A CELL + HRR ARG,V ;NO, USE RH OF ARG +UPDAT3: MOVEM ARG,0(SX) ;OVERWRITE THE ONE IN THE TABLE + POPJ PP, ;AND EXIT + +UPDAT1: AOS SDEL,FREE ;GET ONE CELL + CAML SDEL,SYMBOL ;NEED MORE CORE? + PUSHJ PP,XCEEDS ;YES + HRRI ARG,-1(SDEL) ;POINTER TO ARG + TLO ARG,PNTF ;AND NOTE IT. +UPDAT2: TLNE ARG,EXTF ;IS THERE A EXTERNAL? + JRST UPDAT3 ;YES, - JUST SAVE A LOCATION + MOVEM ARG,0(SX) ;NO, OVERWRITE THE POINTER IN THE TABLE + MOVEM V,0(ARG) ;STORE VALUE AS A 36BIT VALUE + POPJ PP, ;AND EXIT + +UPDAT4: MOVEM ARG,0(SX) ;WE HAVE TWO CELLS, WE USE THEM + MOVEM V,0(ARG) ;SAVE AS 36BIT VALUE + MOVEM RC,1(ARG) ;SAVE RELOCATION BITS + POPJ PP, ;AND EXIT + +UPDAT5: MOVEI SDEL,2 ;THERE IS A EXTERNAL + ADDB SDEL,FREE ;SO WE NEED TWO LOACTIONS + CAML SDEL,SYMBOL ;NEED MORE CORE? + PUSHJ PP,XCEEDS ;YES + MOVEM RC,-1(SDEL) ;SAVE RELOCATION BITS + HRRI ARG,-2(SDEL) ;SAVE THE POINTER IN ARG + MOVEM V,0(ARG) ;SAVE A 36BIT VALUE + TLO ARG,SPTR ;SET SPECIAL PNTR FLAG + TLZ ARG,PNTF ;CLEAR POINTER FLAG + JRST UPDAT3 ;SAVE THE POINTER AND EXIT + + SUBTTL CONSTANTS + + +IFN FORMSW,< +HWFORM: BYTE (18) 1,1 +INFORM: BYTE (9) 1 (4) 1 (1) 1 (4) 1 (18) 1 +IOFORM: BYTE (3) 1 (7) 1 (3) 1 (1) 1 (4) 1 (18) 1 +BPFORM: BYTE (6) 1,1 (2) 1 (4) 1 (18) 1 +ASCIIF: BYTE (7) 1,1,1,1,1 +SXFORM: BYTE (6) 1,1,1,1,1,1 +> + + SUBTTL PHASED CODE + +IFN PURESW, +IFN SEG2SW,< PHASE LOWL> +> +IFN TEMP, +LSTFIL: BLOCK 1 + SIXBIT /@/ ;SYMBOL TO STOP PRINTING +TAG: BLOCK 1 + SIXBIT / + @/ +TABI: +IFE FORMSW,< BYTE (7) 0, 11, 11, 11, 11> +IFN FORMSW,< BYTE (7) 11,11, 11, 11, 11> +SEQNO: BLOCK 1 + ASCIZ / / +BININI: EXP B +BINDEV: BLOCK 1 + XWD BINBUF,0 +LSTINI: EXP AL +LSTDEV: BLOCK 1 + XWD LSTBUF,0 +IFN CCLSW,< +IFE RUNSW,< +NUNINI: EXP DMP +NUNDEV: BLOCK 1 + XWD 0,0> +RPGINI: EXP AL +RPGDEV: BLOCK 1 + XWD 0,CTLBLK +> +INDEVI: EXP A +INDEV: BLOCK 1 + XWD 0,IBUF +DBUF: ASCIZ / TI:ME DY-MON-YR PAGE / +VBUF: ASCIZ / MACRO / ;MUST BE LAST LOCATIONS IN BLOCK +IFE PURESW,< BLOCK 3 ;ALLOW FOR LONG TITLE> +IFN PURESW,< DEPHASE + LENLOW==.-LOWH> + + SUBTTL STORAGE CELLS + +IFN PURESW,< +IFE SEG2SW,< LOC 140> +IFN SEG2SW,< RELOC LOWL> +LOWL: BLOCK LENLOW+3 > +PASS1I: + +RP: BLOCK 1 + +IFE CCLSW, +IFN CCLSW,/5 +IFN RUNSW,> +LSTBUF: BLOCK 3 +BINBUF: BLOCK 3 +IBUF: BLOCK 3 +IFN CCLSW,> +LSTDIR: BLOCK 4 +BINDIR: BLOCK 4 +INDIR: BLOCK 4 + +ACDELX: ;LEFT HALF +BLKTYP: BLOCK 1 ;RIGHT HALF + +COUTX: BLOCK 1 +COUTY: BLOCK 1 +COUTP: BLOCK 1 +COUTRB: BLOCK 1 +COUTDB: BLOCK ^D18 + +ERRCNT: BLOCK 1 +FREE: BLOCK 1 +IFN RENTSW, +IFBLK: BLOCK .IFBLK +IFBLKA: BLOCK .IFBLK +LADR: BLOCK 1 +NCOLLS: BLOCK 1 +LIMBO: BLOCK 1 +LBUFP: BLOCK 1 +LBUF: BLOCK <.CPL+5>/5 + BLOCK 1 +VARHD: BLOCK 1 +VARHDX: BLOCK 1 +IFN WFWSW, + +LITAB: BLOCK 1 +LITABX: BLOCK 1 + BLOCK 1 +LITHD: BLOCK 1 +LITHDX: BLOCK 1 +LITCNT: BLOCK 1 +LITNUM: BLOCK 1 + +LOOKX: BLOCK 1 +NEXT: BLOCK 1 +OUTSW: BLOCK 1 +PDP: BLOCK 1 +RECCNT: BLOCK 1 +SAVBLK: BLOCK RC +SAVERC: BLOCK 1 +SBUF: BLOCK .SBUF/5 +SRCHX: BLOCK 1 +SUBTTX: BLOCK 1 +SVSYM: BLOCK 1 +SYMBOL: BLOCK 1 +SYMTOP: BLOCK 1 +SYMCNT: BLOCK 1 + +STPX: BLOCK 1 +STPY: BLOCK 1 +STCODE: BLOCK .STP +STOWRC: BLOCK .STP + +IFN FORMSW,< +STFORM: BLOCK .STP +FORM: BLOCK 1 +HWFMT: BLOCK 1 +FLDSIZ: BLOCK 1 +IOSEEN: BLOCK 1 +> +TABP: BLOCK 1 +TCNT: BLOCK 1 ;COUNT OF CHARS. LEFT IN TBUF +TBUF: BLOCK .TBUF/5 +DEVBUF: BLOCK 6 ;STORE NAME.EXT CREATION DATE AND TIME +TYPERR: BLOCK 1 +IONSYM: BLOCK 1 ;-1 SUPRESS LISTING OF SYMBOLS +PRGPTR: BLOCK 1 ;POINTER TO CHAIN OF PRGEND BLOCKS +ENTERS: BLOCK 1 ;-1 WHEN ENTERS HAVE BEEN DONE +UNIVSN: BLOCK 1 ;-1 WHEN A UNIVERSAL SEEN + + PASS2I: + +ABSHI: BLOCK 1 +HIGH: BLOCK 1 +IFN RENTSW, +ACDEVX: BLOCK 1 +CPL: BLOCK 1 +CTLSAV: BLOCK 1 +CTLS1: BLOCK 1 +EXTPNT: BLOCK 1 +INTENT: BLOCK 1 +INREP: BLOCK 1 +INDEF: BLOCK 1 +INTXT: BLOCK 1 +INCND: BLOCK 1 +CALNAM: BLOCK 1 +CALPG: BLOCK 1 +CALSEQ: BLOCK 1 +DEFPG: BLOCK 1 +DEFSEQ: BLOCK 1 +LITPG: BLOCK 1 +LITSEQ: BLOCK 1 +REPPG: BLOCK 1 +REPSEQ: BLOCK 1 +TXTPG: BLOCK 1 +TXTSEQ: BLOCK 1 +CNDPG: BLOCK 1 +CNDSEQ: BLOCK 1 +IRPCNT: BLOCK 1 +IRPARG: BLOCK 1 +IRPARP: BLOCK 1 +IRPCF: BLOCK 1 +IRPPOI: BLOCK 1 +IRPSW: BLOCK 1 +IFN WFWSW, +LITLVL: BLOCK 1 +LITLBL: BLOCK 1 ;NAME OF LABEL DEFINED INSIDE A LITERAL + +ASGBLK: BLOCK 1 +LOCBLK: BLOCK 1 + +LOCA: BLOCK 1 +LOCO: BLOCK 1 +RELLOC: BLOCK 1 +ABSLOC: BLOCK 1 +LPP: BLOCK 1 +MODA: BLOCK 1 +MODLOC: BLOCK 1 +MODO: BLOCK 1 +IFN CCLSW, +OUTSQ: BLOCK 2 +PAGEN.: BLOCK 1 +PPTEMP: BLOCK 1 +PPTMP1: BLOCK 1 +PPTMP2: BLOCK 1 + +REPCNT: BLOCK 1 +REPEXP: BLOCK 1 +REPPNT: BLOCK 1 +RPOLVL: BLOCK 1 +R1BCNT: BLOCK 1 +R1BCHK: BLOCK 1 +R1BBLK: BLOCK .R1B +R1BLOC: BLOCK 1 +RIMLOC: BLOCK 1 +TAGINC: BLOCK 1 +VECREL: BLOCK 1 +VECTOR: BLOCK 1 +.TEMP: BLOCK 1 ;TEMPORARY STORAGE +UNISCH: BLOCK .UNIV ;SEARCH TABLE FOR UNIVERSALS +SQFLG: BLOCK 1 +ARGF: BLOCK 1 +MACENL: BLOCK 1 +MACLVL: BLOCK 1 +MACPNT: BLOCK 1 +WWRXX: BLOCK 1 +RCOUNT: BLOCK 1 ;COUNT OF WORDS STILL TO READ IN LEAF +WCOUNT: BLOCK 1 ;COUNT OF WORDS STILL FREE IN LEAF +PASS2Z: ;ONLY CLEAR TO HERE ON PRGEND +LSTSYM: BLOCK 1 +PAGENO: BLOCK 1 +SEQNO2: BLOCK 1 +PASS2X: + + SUBTTL MULTI-ASSEMBLY STORAGE CELLS + +LSTPGN: BLOCK 1 +IFN WFWSW, +HDAS: BLOCK 1 +IFN CCLSW, +IFN TEMP, +IFN FORMSW, +MACSIZ: BLOCK 1 ;INITIAL SIZE OF LOW SEG +UNISIZ: BLOCK 1 ;TOP OF BUFFERS AND STACKS +UNITOP: BLOCK 1 ;TOP OF UNIVERSAL SYMBOL TABLE +UNIVNO: BLOCK 1 ;NUMBER OF UNIVERSALS SEEN +UNITBL: BLOCK .UNIV ;TABLE OF UNIVERSAL NAMES +UNIPTR: BLOCK .UNIV ;TABLE OF SYMBOL POINTERS +UNISHX: BLOCK .UNIV ;TABLE OF SRCHX POINTERS + VAR ;CLEAR VARIABLES + +JOBFFI: BLOCK 203*NUMBUF+1 ;INPUT BUFFER PLUS ONE +IFN PURESW, + + END BEG + diff --git a/src/mongen.mac b/src/mongen.mac new file mode 100644 index 0000000..db2d765 --- /dev/null +++ b/src/mongen.mac @@ -0,0 +1,1131 @@ +TITLE MONGEN - DIALOG PROGRAM TO DEFINE A 10/40 OR 10/50 T.S. CONFIGURATION - V041 +SUBTTL T.HASTINGS/TNM/TW/PFC/GDR/KWB/RCC TS 05 MAR 71 +VMONGN==040 + +JOBVER=137 + LOC JOBVER + EXP VMONGN + ;PUT VERSION NUMBER IN JOB DATA AREA + ;ALSO OUTPUT-SEE NEXT PAGE + RELOC + +;HOW MONGEN IS ORGANIZED: +;ALL SYMBOLS FOR CONFIG.MAC ARE DEFINED USING XP MACRO DEFINED IN S.MAC +;XP DEFINES FIRST ARGUMENT TO BE EQUAL TO THE SECOND ARG +;AND DECLARES THE FIRST ARG TO BE INTERVAL + +;RULE: ALL SYMBOLS ARE GENERATED ALL THE TIME, NO MATTER HOW DIALOG IS ANSWERED +;WHY - SO USER READING CONFIG+COMMON NEVER NEEDS TO LOOK AT +; MONGEN PROGRAM TO UNDERSTAND MONITOR + +;THE ONLY LOCAL STORAGE IN MONGEN IS USED TO STORE ANSWERS +;WHICH DETERMINE WHETHER A SECOND QUESTION IS TO BE ASKED +;THESE TEMP STORAGE HAVE SAME NAME AS THE SYMBOL WHICH THEY ARE ASSOCIATED WITH + +;RULE: ALL SYMBOLS WHICH ARE GENERATED BY MONGEN, END IN LETTER N OR NN. +;POLICY: MONGEN IS STUPID AND SIMPLE MINDED. IT KNOWS AS LITTLE ABOUT THE MONITOR +;AS POSSIBLE. IT NEVER ADDS TWO ANSWERS TOGETHER, FOR EXAMPLE. IT ALWAYS GENERATES +;ALL SYMBOLS ALL THE TIME, NO MATTER HOW THE QUESTIONS ARE ANSWERED. THE SYMBOL +;VALUES ARE ALWAYS WHAT THE USER ANSWERED. (AS LONG AS SYNTACTICALLY CORRECT). +;IF DEC OFFERS JUST 2 DIFFERENT FORMS OF A DEVICE +; ONLY ONE QUESTION WILL BE ASKED (EX. DECTAPE - 551 OR TD10). +; HOWEVER TWO SYMBOLS ENDING IN N WILL BE GENERATED. +; THIS IS SO A THIRD DEVICE CAN BE ADDED WITH MINIMAL +; CHANGE TO BOTH MONGEN AND COMMON. +;RULE: ASK RELATED QUESTIONS (EG, 3-WAY BRANCH) SO THAT IF THE FIRST +;ANSWER IS YES, THE SECOND QUESTION IS NOT ASKED. +;RULE: ASK THE QUESTIONS SO THAT YES IS THE CURRENT STANDARD RESPONSE. +;FOR EACH VARIABLE OUTPUT, THERE IS A CORRESPONDING LOCATION IN MONGEN WITH SAME NAME +;ALL SUCH LOCATIONS ARE INITIALLY SET TO 0 WHEN MONGEN IS STARTED +;EACH QUESTION OR SET OF RELATED QUESTIONS HAS THE FOLLOWING FORM: +; ONE OR MORE QUESTIONS FOLLOWED BY OUTPUT OF THE APPROPRIATE MACRO SOURCE. +; THE FIRST QUESTION IN A SEG ARE OF FORM TAG1,TAG2,ECT. +; ALL JUMPS TO OTHER QUESTIONS IN SEG ARE OF FORM TAG1,TAG2, ETC. +; THE OUTPUT SECTION OF A SEG IS LABELED TAGOUT: EVEN THOUGH IT MAY +; NEVER BE JRSTED TO. NOTE: THERE ARE NO OTHER TAGS IN OUTPUT SECTION +; BECAUSE ALL SYMBOLS ARE ALWAYS OUTPUT, SO THERE IS NO BRANCHING IN OUTPUT SECTION. + + +;ANY TTY OUTPUT ENCLOSED IN []'S WILL BE TYPED ONLY IF LONG DIALOG IS IN EFFECT + ;ACS +P=17 ;PUSHDOWN POINTER +N=1 ;NUMERICAL VALUE OF ASKED QUESTION + ;0=N,1=Y, HIGHER NO. IS VALUE OF OCTAL OR DECIMAL ANSWER + ;VALUE RETURNED BY ASKYN, ASKOCT,ASKDEC ROUTINES +T=2 ;TEMPORARY AC +T1=T+1 +CH=4 ;CHARACTER AC +WD=CH+1 ;WORD AC + ;FIRST ARGUMENT PASSED TO OUTXP +B=6 ;BYTE POINTER TO INPUT STRING +R=7 ;RADIX FOR INPUT +CHN=10 +CHN1=11 +CHN2=12 +TTYCHN=0 +TOCHN=0 ;TTY OUTPUT CHANNEL +FOCHN=1 ;FILE OUTPUT CHANNEL +OUTCHN=1 + +MLON ;MULTI LINE LITERAL + + +MAXCHN=8 ;MAXIMUM NUMBER OF DISK CHANNELS + +MAXFHU=8 ;MAXIMUM NUMBER OF UNITS ON FIXED HEAD CONTROLLERS +MAXDPU=8 ;MAXIMUM NUMBEROF UNITS ON DISK PACK CONTROLLERS +MAXMFU=2 ;MAXIMUM NUMBER OF UNITS ON MASS FILE CONTROLLERS + +;THE FOLLOWING SIMPLE ROUTINES ARE USED TO ASK QUESTIONS: +;ASKYN - ANSWER -(Y,N,) OR (1,0) +;ASKDEC - ANSWER - DECIMAL NUMBER +;ASKOCT - ANSWER - OCTAL NUMBER +;ASKACZ - ANSWER - LOC ASCSTR...VASCSTR+5(ASCIZ) +;ASKSIX - ANSWER - LOC ASCSTR...ASCSTR=1(ASCIZ)(ONLY 6 CHAR ALLOWED) +;OUTFIL - OUTPUT TO CONFIG.MAC ONLY +;OUTBTH - OUTPUT TO TTY AND CONFIG.MAC(;IS REMOVED BEFORE GOING TO TTY) +;OUTXP - SUBSTITUTES VALUE IN N FOR * IN ASCIZ +;OUTSTR - SUBSTITUTE ASCIZ STRING IN ASCSTR FOR * IN ASCIZ ARG +;OUTTTY - OUTPUT TO TTY ONLY (ERROR MESSAGE) + + +XALL ;DO NOT LIST ASCII EXPANSIONS + +DEFINE ASCIIZ (A) +< + XLIST + ASCIZ &A +& + LIST> + SUBTTL INITIALIZATION +MONGEN: CALLI 0 ;RESET + MOVE P,[IOWD 12,PDLIST] + SETZM VARBEG + MOVE N,[XWD VARBEG,VARBEG+1] + BLT N,VAREND ;CLEAR VARIABLE STORAGE + + INIT TTYCHN,1 + SIXBIT /TTY/ + XWD TOBUF,TIBUF + HALT .-3 +MON1: PUSHJ P,OUTTTY + ASCIIZ <;TYPE "DEVICE:NAME.EXT" FOR WHERE TO PUT RESULTS OF THIS DIALOG +;CR ASSUMES "DSK:CONFIG.MAC"> + PUSHJ P,TTYIN + PUSHJ P,GETWRD + SETZ N, + CAIE CH,":" + EXCH WD,N + SKIPN WD + MOVSI WD,(SIXBIT .DSK.) + MOVEM WD,.+2 + INIT OUTCHN,1 + SIXBIT /DSK/ + XWD FOBUF,0 ;INIT OUTPUT DEVICE 'OUTP' + JRST .+2 + JRST OUTOK ;LOGICAL DEVICE WAS ASSIGNED + PUSHJ P,OUTTTY + ASCIIZ + JRST MON1 ;ASK AGAIN + +OUTDIR: SIXBIT /CONFIG/ +OUTDR1: SIXBIT /MAC/ + BLOCK 2 + +OUTOK: CAIE CH,":" + SKIPA WD,N + PUSHJ P,GETWRD + SKIPN WD + MOVE WD,[SIXBIT .CONFIG.] + MOVEM WD,OUTDIR + CAIE CH,"." + PUSHJ P,GETWRD + CAIN CH,"." + JRST .+3 + MOVSI WD,(SIXBIT/MAC/) + JRST .+2 + PUSHJ P,GETWRD + MOVEM WD,OUTDR1 + ENTER OUTCHN,OUTDIR + JRST ENTERR + SUBTTL DETERMIN GENERAL TYPE OF SYSTEM ,ETC. + PUSHJ P,OUTFIL ;WRITE ON OUTPUT FILE ONLY + ASCIIZ + PUSHJ P,OUTBTH ;BOTH TTY AND OUTPUT FILE(AS COMMENT) + ASCIIZ <;ANSWER THE FOLLOWING QUESTIONS WITH Y OR N OR A DECIMAL NUMBER> + PUSHJ P,ASKYN + ASCIIZ <;SHORT DIALOG?[N = LONGER QUESTIONS]> + MOVEM N,SHORT ;REMEMBER FOR QUTTTY ROUT. + PUSHJ P,ASKYN + ASCIIZ <;10/30 SYSTEM TO BE BUILT?[N = 10/40 OR 10/50 SYSTEM]> + JUMPN N,.+2 + JRST SYSASK+1 + PUSHJ P,ASKYN + ASCIIZ <;10/40 SYSTEM TO BE BUILT?[N = ASSUME 10/50 SYSTEM]> + JUMPN N,SYS1 + JRST SYSASK + +ENTERR: PUSHJ P,OUTTTY + ASCIIZ + JRST MON1 + SYSASK: AOS SYS40N + PUSHJ P,ASKYN ;FIND OUT IF 10/40 WITH DISK + ASCIIZ <;DISK?> + JUMPE N,SYSOUT ;DISK SYSTEM? +SYS1: AOS SYS50N + AOS DSKN + AOS LOGINN +SYSOUT: MOVE N,SYS40N ;DEFINE 10/40 SYSTEM SYMBOL + PUSHJ P,OUTXP + ASCIIZ + MOVEI N,SYS50N + PUSHJ P,OUTXP + ASCIIZ + MOVE N,DSKN + PUSHJ P,OUTXP + ASCIIZ + MOVE N,LOGINN + PUSHJ P,OUTXP + ASCIIZ + + SUBTTL SET-UP DISK CONFIGURATION +DSKASK: SKIPN N,DSKN ;NEED A DISK? + JRST JOBASK ;NO DISK - NO QUESTION + + PUSHJ P,ASKYN + ASCIIZ <;RD10 (BURROUGHS) DISK?[ONE DISK TYPE FOR FILES, +;SAME TYPE FOR SWAPPING OR ONE OTHER TYPE FOR SWAPPING]> + MOVEM N,RD10N +SYS1A: PUSHJ P,OUTXP + ASCIIZ + SKIPN N,RD10N ;RD10 REQUESTED? + JRST SYS1B ;NO. + PUSHJ P,ASKYN + ASCIIZ <;RD10 FOR SWAPPING?[N = CAN SWAP ON SOME OTHER TYPE]> + MOVEM N,SWPYES +SYS1B: PUSHJ P,OUTXP + ASCIIZ + SKIPN N,DSKN + JRST SYS2A + PUSHJ P,ASKDEC + ASCIIZ <;HOW MANY RP01 OR RP02 (MEMOREX) DISK PACK DRIVES?[0 IF NONE]> +SYS2A: MOVEM N,RP10N + PUSHJ P,OUTXP + ASCIIZ + SKIPE N,RP10N + SKIPE SWPYES + JRST SYS2B ;AVOID QUESTION IF NO RP10 OR ALREADY HAVE SWAP DEV + PUSHJ P,ASKYN + ASCIIZ <;RP10 FOR SWAPPING?> + MOVEM N,SWPYES +SYS2B: PUSHJ P,OUTXP + ASCIIZ + SKIPN N,RP10N + JRST SYS3 + MOVE N,RP10N + SOJE N,SYS2D ;AVOID QUESTION IF ONLY 1 PACK +SYS2C: PUSHJ P,ASKDEC + ASCIIZ <;HOW MANY PRIVATE DRIVES?> + CAML N,RP10N + JRST SYS2C +SYS2D: MOVNS N + ADD N,RP10N +SYS3: PUSHJ P,OUTXP + ASCIIZ + SKIPN N,DSKN + JRST SYS3A + PUSHJ P,ASKYN + ASCIIZ <;RA10 (BRYANT) DISK?> + MOVEM N,RA10N +SYS3A: PUSHJ P,OUTXP + ASCIIZ + SETCM N,SWPYES + AND N,RA10N ;RA10 AND NO SWAP DEVICE? + JUMPE N,SYS3B ;NO. AVOID QUESTION + PUSHJ P,ASKYN + ASCIIZ <;RA10 FOR SWAPPING?> +SYS3B: PUSHJ P,OUTXP + ASCIIZ + SKIPN N,DSKN + JRST SYS4A + PUSHJ P,ASKYN + ASCIIZ <;DPD (DATA PRODUCTS) DISK?> + MOVEM N,DPDN +SYS4A: PUSHJ P,OUTXP + ASCIIZ + SETCM N,SWPYES + AND N,DPDN ;DPDN AND NO SWAP DEVICE? + JUMPE N,SYS4B ;NO. AVOID QUESTION + PUSHJ P,ASKYN + ASCIIZ <;DPD FOR SWAPPING?> + MOVEM N,SWPYES +SYS4B: PUSHJ P,OUTXP + ASCIIZ + SUBTTL DETERMIN JOB AND APR CONFIGURATION +JOBASK: PUSHJ P,ASKDEC + ASCIIZ <;HOW MANY JOBS?[ATTACHED AND DETACHED, COUNTING NULL JOB]> + JUMPE N,JOBASK + CAILE N,^D128 + JRST JOBASK +JOBOUT: PUSHJ P,OUTXP + ASCIIZ + +MXKASK: PUSHJ P,ASKDEC + ASCIIZ <;MAX SIZE OF CORE (IN K) FOR ANY SINGLE USER? +;0 MEANS ALL OF CORE> +MXKOUT: PUSHJ P,OUTXP + ASCIIZ + +PDPASK: PUSHJ P,ASKYN + ASCIIZ <;PDP-10 PROCESSOR?[N = PDP-6]> +PDPOUT: PUSHJ P,OUTXP + ASCIIZ + +RELASK: JUMPE N, REL1 ;PDP-10? + PUSHJ P,ASKYN ;YES,ASK ABOUT 2 RELOC SOFTWARE + ASCIIZ <;2 RELOCATION REG. SOFTWARE?[Y = MUST HAVE KT10A, +;N = JUST 1 RELOC. REG.]> +REL1: PUSHJ P,OUTXP + ASCIIZ + + JUMPE N,REL2 ;SEGN=0 IF PDP-6 OR NOT 2 RELOC. SOFT + PUSHJ P,ASKDEC + ASCIIZ <;HOW MANY MORE SEGMENTS THAN JOBS?[0 UNLESS YOU +;ANTICIPATE A LOT OF DORMANT SEGMENTS]> +REL2: PUSHJ P,OUTXP + ASCIIZ + +DDTASK: PUSHJ P,ASKYN + ASCIIZ <;LOAD EXEC DDT?[N = ONLY IF LOADER HAS RUN OUT OF CORE BEFORE]> +DDTOUT: PUSHJ P,OUTXP + ASCIIZ + +SYM: PUSHJ P,ASKYN + ASCIIZ <;LOAD LOCAL SYMBOLS?[N = ONLY IF LOADER HAS RUN OUT OF ROOM BEFORE]> +SYMOUT: MOVEM N,LOCALN ;SAVE ANSWER FOR LATER INSTRUCTION +UDTASK: PUSHJ P,ASKYN + ASCIIZ <;LOAD USER DDT?[BOTH CAN BE LOADED TOGETHER, +;USE USER DDT FOR PATCHING UNDER TIME SHARING]> +UDTOUT: PUSHJ P,OUTXP + ASCIIZ +NAMASK: PUSHJ P,ASKST2 ;STORE ANSWER IN LOC "ASCSTR" + ASCIIZ <;NAME OF THIS SYSTEM (24 CHARS OR LESS)?> +NAMOUT: PUSHJ P,OUTSTR ;SUBSTITUTE ANSWER FOR * + ASCIIZ > +SERASK: PUSHJ P,ASKDEC ;GET SERIAL NUMBER OF KA10 + ASCIIZ <;WHAT IS THE SERIAL NUMBER OF YOUR ARITHMETIC PROCESSOR?> +SEROUT: PUSHJ P,OUTXP + ASCIIZ + SETZM ASCSTR ;INITIALIZE THIS CELL +DEVASK: PUSHJ P,ASKST2 ;STORE ANSWER IN LOC "ASCSTC" (UP TO SIX CHAR) + ASCIIZ <;NAME OF SYSTEM DEVICE?[DTA0 USUAL FOR 10/40 SYSTEM, +;DSK USUAL FOR 10/50 SYSTEM]> + SKIPE ASCSTR + JRST DEVOUT + MOVE WD,[ASCIZ /DSK/] + SKIPN DSKN + MOVE WD,[ASCIZ /DTA0/] + MOVEM WD,ASCSTR +DEVOUT: PUSHJ P,OUTSTR ;SUBSTUTITE ANSWER FOR * + ASCIIZ > + PUSHJ P,OUTFIL + ASCIZ &DEFINE SYSDAT +< ASCIZ /& + CALL N,[SIXBIT /DATE/] + IDIVI N,^D12*^D31 + ADDI N,^D64 + PUSH P,N + IDIVI T,^D31 + MOVEI N,1(T) + MOVEI R,12 + PUSHJ P,XPSUB1 + MOVEI CH,"-" + PUSHJ P,FILPUT + MOVEI N,1(T1) + PUSHJ P,XPSUB1 + MOVEI CH,"-" + PUSHJ P,FILPUT + POP P,N + PUSHJ P,XPSUB1 + PUSHJ P,OUTFIL + ASCIIZ > + + SUBTTL SET-UP TTY CONFIGURATION + PUSHJ P,ASKYN + ASCIIZ <;DATA LINE SCANNER(DC10)?[N = WILL ASK FOR 680 OR 630]> + MOVEM N,DLSN + JUMPN N,DLSOUT + PUSHJ P,ASKYN + ASCIIZ <;PDP-8 680 COMMUNICATIONS SYSTEM?[Y = 680I TOO, N = WILL ASK FOR 630]> + MOVEM N,CCIN + JUMPN N,DLSOUT + PUSHJ P,ASKYN + ASCIIZ <;630 COMMUNICATION SYSTEM?> + MOVEM N,DCSN + JUMPE N,DLSASK ;LOOP UNTIL HE SAYS Y TO ONE +DLSOUT: MOVE N,DLSN + PUSHJ P,OUTXP + ASCIIZ + MOVE N,CCIN + PUSHJ P,OUTXP + ASCIIZ + MOVE N,DCSN + PUSHJ P,OUTXP + ASCIIZ + TTNASK: SKIPE CCIN ;JUST 680? + JRST TTN1 ;YES. NO DC10B,E, OR 632 + PUSHJ P,ASKDEC + ASCIIZ <;HOW MANY DC10B (OR 632) 8-LINE DATA GROUPS?[ +;1=TTY0-7, 2=TTY0-17, ... , 8=TTY0-77]> + MOVEM N,TTGRPN + SKIPN BTHN + SKIPE DLSN + SKIPA + JRST TTN1 + PUSHJ P,ASKDEC + ASCIIZ <;HOW MANY DC10E DATASET CONTROL GROUPS?> + MOVEM N,DSGRPN +TTN1: SKIPN BTHN + SKIPE CCIN + SKIPA + JRST TTN2 + PUSHJ P,ASKOCT + ASCIIZ <;HOW MANY (OCTAL) LINES ON YOUR 680(I), INCLUDING +;ITS CONSOLE TELETYPE?> + MOVEM N,CCILN +TTN2: +TTNOUT: MOVE N,TTGRPN + PUSHJ P,OUTXP + ASCIIZ + MOVE N,DSGRPN + PUSHJ P,OUTXP + ASCIIZ + MOVE N,CCILN + PUSHJ P,OUTXP + ASCIIZ +TTNEND: + TTYASK: PUSHJ P,OUTBTH + ASCIIZ <;ANSWER THE FOLLOWING QUESTIONS ABOUT YOUR TELETYPE LINES: +;[TYPE OCTAL LINE NUMBERS, ONE PER LINE. +;TYPE EXTRA CR WHEN DONE.] +> +TTY0: PUSHJ P,OUTBTH + ASCIIZ <;DATA SET LINES?[PROJECT 1 CAN'T LOGIN, LOGIN RESETS +;LINE TO COMPUTER ECHOING AND NO HARDWARE TABS]> +TTY0A: PUSHJ P,TTYIN1 + JRST TTY1 + PUSHJ P,OUTSTR + ASCIIZ + JRST TTY0A + +TTY1: PUSHJ P,OUTBTH + ASCIIZ <;LINES WITH HARDWARE TABS?[MONITOR SIMULATES REST WITH SPACES]> +TTY1A: PUSHJ P,TTYIN1 + JRST TTY2 ;CR + PUSHJ P,OUTSTR + ASCIIZ + JRST TTY1A + +TTY2: PUSHJ P,OUTBTH + ASCIIZ <;REMOTE LINES?[PROJECT 1 CAN'T LOGIN,]> +TTY2A: PUSHJ P,TTYIN1 + JRST TTY21 ;CR + PUSHJ P,OUTSTR + ASCIIZ + JRST TTY2A + +TTY21: PUSHJ P,OUTBTH ;ASK ABOUT LOCAL COPY LINES + ASCIIZ <;LOCAL COPY LINES? [ECHOING PROVIDED BY TERMINAL RATHER +;THAN BY COMPUTER. OFTEN (INCORRECTLY) CALLED "HALF DUPLEX".]> +TTY21A: PUSHJ P,TTYIN1 ;GET A LINE NUMBER + JRST TTY3 ;JUST A CARRIAGE RETURN + PUSHJ P,OUTSTR ;PUT LINE NUMBER IN THE FILE + ASCIIZ + JRST TTY21A ;SEE IF ANY MORE LOCAL COPY LINES + +TTY3: PUSHJ P,OUTBTH + ASCIIZ <;HALF DUPLEX LINES?[TWX OR HALF DUPLEX WIRED SCANNER(DC10C)]> +TTY3A: PUSHJ P,TTYIN1 + JRST TTY4 + PUSHJ P,OUTSTR + ASCIIZ + JRST TTY3A + TTY4: PUSHJ P,OUTBTH + ASCIIZ <;SLAVES? [NO COMMANDS MAY BE TYPED]> +TTY4A: PUSHJ P,TTYIN1 + JRST TTY5 + PUSHJ P,OUTSTR + ASCIIZ + JRST TTY4A +TTY5: PUSHJ P,OUTBTH + ASCIIZ <;LINES WITH HARDWARE FORMFEED? [LEAVE OUT IF USERS WOULD RATHER +;NOT GET FORMFEEDS UNTIL THEY DO TTY FORM COMMAND]> +TTY5A: PUSHJ P,TTYIN1 + JRST TTY6 + PUSHJ P,OUTSTR + ASCIIZ + JRST TTY5A +TTY6: PUSHJ P,OUTBTH + ASCIIZ <;LINES WHICH RUN INITIA AT STARTUP?> +TTY6A: PUSHJ P,TTYIN1 + JRST TTY7 + PUSHJ P,OUTSTR + ASCIIZ + JRST TTY6A +TTY7: + +EDTASK: PUSHJ P,ASKYN + ASCIIZ <;COMMON.MAC ALREADY EDITED FOR YOUR TTY CONFIGURATION?[ +;N = WILL ALLOW YOU TO DEFINE NOW]> +EDTOUT: PUSHJ P,OUTXP + ASCIIZ + JUMPN N,TTYEND ;DO NOT ASK QUESTIONS ABOUT TTY IF EDITED + + DSCASK: SKIPN DSGRPN ;ANY DC10E'S? + JRST DSCEND ;NO + PUSHJ P,OUTBTH + ASCIIZ <;WHAT IS THE CORRESPONDENCE BETWEEN THE DC10E LINES +;AND THE DC10B LINES? TYPE "#,#" FOR EACH DATASET. FIRST # IS +;DC10E LINE, SECOND # IS DC10B LINE.[# IS AN OCTAL NUMBER. +;TYPE ONE #,# PER LINE, EXTRA CR WHEN DONE.]> + + + PUSHJ P,OUTFIL + ASCIZ /DEFINE DSASOC < +/ +DSC1: PUSHJ P,TTYIN1 + JRST DSC2 ;CR ONLY + PUSHJ P,OUTSTR + ASCIIZ + JRST DSC1 ;LOOP FOR MORE +DSC2: PUSHJ P,OUTFIL + ASCIZ /> +/ +DSCEND: +TTYEND: + SUBTTL SET-UP GENERAL PERIPHERAL CONFIGURATION +PTRASK: PUSHJ P,ASKYN + ASCIIZ <;PT READER?> +PTROUT: PUSHJ P,OUTXP + ASCIIZ + +PTPASK: PUSHJ P,ASKYN + ASCIIZ <;PT PUNCH?> +PTPOUT: PUSHJ P,OUTXP + ASCIIZ + +PLTASK: PUSHJ P,ASKYN + ASCIIZ <;PLOTTER?> +PLTOUT: PUSHJ P,OUTXP + ASCIIZ + +LPTASK: PUSHJ P,ASKDEC + ASCIIZ <;HOW MANY LINE PRINTERS?[0,1 OR 2]> + CAILE N,2 + JRST LPTASK + MOVEM N,LPTN +LPTOUT: MOVE N,LPTN + PUSHJ P,OUTXP + ASCIIZ + +CDRASK: PUSHJ P,ASKYN + ASCIIZ <;CARD READER?> + MOVEM N,CDRN + JUMPE N,CDROUT +CDR1: PUSHJ P,ASKYN + ASCIIZ <;CR10?[Y = CR10A TOO, N IF PDP-6 CARD READER]> + MOVEM N,CR10N +CDROUT: MOVE N,CDRN + PUSHJ P,OUTXP + ASCIIZ + MOVE N,CR10N + PUSHJ P,OUTXP + ASCIIZ +CDPASK: PUSHJ P,ASKYN + ASCIIZ <;CARD PUNCH?> +CDPOUT: PUSHJ P,OUTXP + ASCIIZ + DISASK: PUSHJ P,ASKYN + ASCIIZ <;DISPLAY?> + JUMPE N,DISOUT + MOVEM N,DISN +DIS1: PUSHJ P,ASKYN + ASCIIZ <;TYPE 340?> + MOVEM N,T340N +DISOUT: MOVE N,DISN + PUSHJ P,OUTXP + ASCIIZ + MOVE N,DISN + PUSHJ P,OUTXP ;ASSUME PEN IF DISPLAY + ASCIIZ + MOVE N,T340N + PUSHJ P,OUTXP + ASCIIZ + DTAASK: PUSHJ P,ASKDEC + ASCIIZ <;HOW MANY DECTAPES?[0 TO 8]> + JUMPE N,DTAOUT + CAILE N,^D8 + JRST DTAASK + MOVEM N, DTANN +DTA1: PUSHJ P,ASKYN + ASCIIZ <;TD10 DECTAPE CONTROL?[N = PDP-6 DECTAPE]> + MOVE T,DTANN + SKIPE N + MOVEM T,DTAN + SKIPN N + MOVEM T,DTCN +DTAOUT: MOVE N,DTAN + PUSHJ P,OUTXP + ASCIIZ + MOVE N,DTCN + PUSHJ P,OUTXP + ASCIIZ + MTAASK: PUSHJ P,ASKDEC + ASCIIZ <;HOW MANY MAGTAPES?[0 TO 8]> + JUMPE N,MTAOUT + CAILE N,^D8 + JRST MTAASK + MOVEM N,MTANN +MTA1: PUSHJ P,ASKYN + ASCIIZ <;TM-10A CONTROL?[N = WILL ASK TM-10B, THEN PDP-6 MAGTAPES]> + JUMPE N,MTA2 + MOVE N,MTANN + MOVEM N,MTAN + JRST MTAOUT + +MTA2: PUSHJ P,ASKYN + ASCIIZ <;TM-10B CONTROL?> + JUMPE N,MTA3 + MOVE N,MTANN + MOVEM N,MTBN + JRST MTAOUT + +MTA3: PUSHJ P,ASKYN + ASCIIZ <;PDP-6 MAGTAPE?> + JUMPE N,MTAASK ;LOOP UNTIL HE PICKS ONE + MOVE N,MTANN + MOVEM N,MTCN +MTAOUT: MOVE N,MTAN + PUSHJ P,OUTXP + ASCIIZ + MOVE N,MTBN + PUSHJ P,OUTXP + ASCIIZ + MOVE N,MTCN + PUSHJ P,OUTXP + ASCIIZ +PTYASK: PUSHJ P,ASKDEC + ASCIIZ <;HOW MANY PSEUDO-TTY'S?[EACH CONCURRENT BATCH NEEDS ONE]> + CAILE N,^D64 + JRST PTYASK + PUSHJ P,OUTXP + ASCIIZ + SUBTTL DETERMIN MISC. PARAMETERS + ASKSYM: PUSHJ P,OUTBTH + ASCIIZ <;TYPE "SYMBOL,VALUE" (VALUE IN DECIMAL)[FOR ANY SYMBOLS +;TO BE DEFINED. NEXT QUESTION WILL ASK FOR OCTAL DEFINITION. +;TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]> + PUSHJ P,OUTFIL ;MAKE MACRO CONVERT IN DECIMAL RADIX WHEN COMMON ASS. + ASCIIZ +GETSYM: PUSHJ P,TTYIN + ILDB CH,B + CAIN CH,12 + JRST SYMDON + PUSHJ P,OUTSTR + ASCIIZ + JRST GETSYM +SYMDON: PUSHJ P,OUTFIL ;PSEUDO OP BACK TO OCTAL + ASCIIZ + +ASKSY8: PUSHJ P,OUTBTH + ASCIIZ <;TYPE "SYMBOL,VALUE" (VALUE IN OCTAL)[FOR ANY SYMBOLS +;TO BE DEFINED. TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]> +GETSY8: PUSHJ P,TTYIN + ILDB CH,B + CAIN CH,12 + JRST OCTDON + PUSHJ P,OUTSTR + ASCIIZ + JRST GETSY8 +OCTDON: + ASKDEV: PUSHJ P,OUTBTH + ASCIIZ <;TYPE "DEVICE-MNEMONIC,CHANNEL"FOR SPECIAL DEVICES[ +;WITH NEITHER CHANNEL SAVE ROUTINE NOR DEVICE DATA BLOCK. +;"DEVICE" MUST BE 3 CHARACTERS OR LESS. +;TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]> + PUSHJ P,OUTFIL + ASCIZ /DEFINE SPCINT +< +/ +DEV0: PUSHJ P,TTYIN + ILDB CH,B + CAIN CH,12 ;LF + JRST DEV1 + PUSHJ P,OUTSTR + ASCIIZ < SPASGINT *> + JRST DEV0 + +DEV1: PUSHJ P,OUTFIL + ASCIZ />/ + PUSHJ P,OUTBTH + ASCIIZ <;TYPE "DEVICE-MNEMONIC,CHANNEL,NO.-OF-DEVICES"[ +;FOR SPECIAL DEVICE WITH DEVICE DATA BLOCKS +;"DEVICE" MUST BE 3 CHARS. OR LESS. +;TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]> + PUSHJ P,OUTFIL + ASCIZ /DEFINE SPCDDB +< +/ +DEV2: PUSHJ P,TTYIN + ILDB CH,B + CAIN CH,12 + JRST DEV3 + PUSHJ P,OUTSTR + ASCIIZ < SPASGDDB *> + JRST DEV2 +DEV3: PUSHJ P,OUTFIL + ASCIZ />/ + PUSHJ P,OUTBTH + ASCIIZ <;TYPE "DEVICE-MNEMONIC,CHANNEL,HIGHEST-AC-TO-SAVE[ +;FOR SPECIAL DEVICE WITH CHANNEL SAVE ROUTINES TO SAVE AC'S UP TO +;"HIGHEST-AC-TO-SAVE". "DEVICE" MUST BE 3 CHARS. OR LESS. +;TYPE EXTRA CARRIAGE RETURN WHEN THROUGH.]> + PUSHJ P,OUTFIL + ASCIZ /DEFINE SPCSAV +< +/ +DEV4: PUSHJ P,TTYIN + ILDB CH,B + CAIN CH,12 + JRST DEV5 + PUSHJ P,OUTSTR + ASCIIZ < SPASGSAV *> + JRST DEV4 +DEV5: PUSHJ P,OUTFIL + ASCIZ />/ + +REMEND: + SUBTTL FINISH OFF THE JOB + PUSHJ P,OUTBTH + ASCIIZ <;[MONGEN FINISHED +;NEXT YOU MUST ASSEMBLE COMMON WITH MACRO> + SKIPN LEVDN + JRST ASSEM1 + PUSHJ P,OUTBTH + ASCIIZ <;AND COMMOD> +ASSEM1: PUSHJ P,OUTBTH + ASCIIZ <;THEN LOAD IT AND REST OF MONITOR WITH LOADER +;AND FINALLY SAVE IT WITH MONITOR COMMAND SAVE + +;[TO ASSEMBLE COMMON, TYPE: +;R MACRO +;DSK:COMMON,LPT:_DSK:S,CONFIG,COMMON> + PUSHJ P,OUTBTH + ASCIIZ <;TO LOAD NEW MONITOR, TYPE: +;R LOADER> + SKIPN LOCALN + JRST NOLCLS + PUSHJ P,OUTBTH + ASCIIZ <;/S> +NOLCLS: SKIPN SYS40N ;10/40 SYSTEM? + JRST SYS40A ;NO + PUSHJ P,OUTBTH ;YES, TYPE PROPER LIBRARY NAME + ASCIIZ <;BIN:COMMON,BIN:SYS50/L> + JRST SYS40B + +SYS40A: PUSHJ P,OUTBTH + ASCIIZ <;DSK:COMMON,COMMOD,DSK:SYS40/L> +SYS40B: PUSHJ P,OUTBTH + ASCIIZ <;LPT:_/W/D/A/M/P/G> +DDT1: PUSHJ P,OUTBTH + ASCIIZ <;TO SAVE MONITOR, TYPE: +;SAVE DSK MONITOR +;] +; END OF CONFIGURATION DEFINITION + SUBTTL +;]> + MOVEI CH,14 ;OUTPUT FORMFEED FOR END OF CONFIG.MAC FILE + PUSHJ P,FILPUT + RELEASE OUTCHN, ;RELEASE OUTPUT FILE + CALL [SIXBIT /EXIT/] + SUBTTL VARIABLE AND PARAMETER STORAGE +;VARIABLE STORAGE +TOBUF: BLOCK 3 ;TTY OUTPUT BUFFER HEADER +TIBUF: BLOCK 3 ;TTY INPUT BUFFER HEADER +FOBUF: BLOCK 3 ;FILE OUTPUT BUFFER HEADER + +PDLIST: BLOCK 12 + +RC10S: BLOCK 1 +RP10S: BLOCK 1 +RA10S: BLOCK 1 + ;VARIABLES WHICH ARE ALSO OUTPUT IN CONFIG.MAC +;NONE OF THE VALUES OF THESE VARIABLES ARE USED OUTSIDE OF THE QUESTION IN WHICH THEY ARE ASKED. +VARBEG: ;BEGINNING OF AREA TO BE CLEARED +SHORT: 0 ;NON-ZERO IF SHORT DIALOG(OMIT STUFF IN []) +LEFTBK: 0 ;NON-ZERO IF LEFT BRACKET SEEN +SYS40N: 0 ; +DSKN: 0 +LEVDN: 0 ;LEVEL D VS LEVEL C +CHNN: 0 +LOGINN: 0 +RD10N: 0 ; +RP10N: 0 ; +RA10N: 0 ; +DPDN: 0 ; +SWPYES: 0 +LOCALN: 0 ; +BTHN: 0 ;BOTH 680 AND DC10 +DLSN: 0 ; +CCIN: 0 ; +DCSN: 0 ; +TTGRPN: 0 ;GROUPS OF DC10B OR 632 +DSGRPN: 0 ;GROUPS OF DC10E +CCILN: 0 ;LINES OF 680 +CDRN: 0 ; +CR10N: 0 ; +DISN: 0 ; +T340N: 0 ; +TVP10N: 0 ; +T30N: 0 ; +DTANN: 0 ; +DTAN: 0 ; +DTCN: 0 ; +MTANN: 0 ; +MTAN: 0 ; +MTBN: 0 ; +MTCN: 0 ; +SPCDEV: 0 ;SET NONZERO IF ANY SPECIAL DEVICES +TEMPN: 0 ; +TMPN: 0 ; +TMPLN: 0 ; +LPTN: 0 +MOVIEN: 0 ; +LOKN: 0 +VAREND=.-1 ;END OF AREA TO BE CLEARED + SUBTTL SUBROUTINES +;ROUTINE TO WRITE IN-LINE STRING ON OUTPUT FILE +;CALL: PUSHJ P,OUTFIL +; ASCIIZ +; RETURN + +OUTFIL: MOVE T,(P) + PUSHJ P,FILO + POP P,CH + JRST 1(T) + + + +;ROUTINE TO WRITE OUT-OF-LINE STRING ON OUTPUT FILE +;CALL: MOVEI T,[ASCIZ /MESSAGE/] +; PUSHJ P,FILO +; RETURN + +FILO: HRLI T,440700 +FILOLP: ILDB CH,T + JUMPE CH,CPOPJ + PUSHJ P,FILPUT + JRST FILOLP + +;ROUTINE TO OUTPUT AN IN LINE STRING TO BOTH FILE AND TTY +;CALL: PUSHJ P,OUTBTH +; ASCIZ /STRING/ +; RETURN + +OUTBTH: MOVE T,(P) + PUSHJ P,FILO + ;FALL INTO OUTTTY +;ROUTINE TO OUTPUT AN IN-LINE STRING TO TTY +;CALL: PUSHJ P,OUTBTH +; ASCIZ /STRING/ +; RETURN + +OUTTTY: MOVE T,(P) + PUSHJ P,TTYO + POP P,CH + JRST 1(T) + ;ROUTINE TO OUTPUT AN OUT-OF-LINE STRING ON TTY +;CALL: MOVEI T,[ASCIZ /STRING/] +; PUSHJ P,TTYO +; RETURN + +TTYO: HRLI T,440700 +TTYOLP: ILDB CH,T + JUMPE CH,TTYFIN + CAIE CH,"[" ;IS THIS A LEFT BRACKET? + JRST TTYO1 ;NO, + SKIPE SHORT ;YES, IS SHORT DIALOG WANTED? + SETOM LEFTBK ;YES, SET LEFT BRACKET SO OUTPUT SUPPRESSED +TTYO1: SKIPE LEFTBK ;OUTPUT SUPPRESSED BECAUSE INSIDE []? + JRST TTYO2 ;YES + CAIE CH,";" ;NO, DO NOT TYPE ";" ON TTY + PUSHJ P,TTYPUT +TTYO2: CAIN CH,"]" ;END OF LONG STUFF? + SETZM LEFTBK ;YES, TURN OFF TTY SUPPRESS FLAG + JRST TTYOLP + +TTYFIN: OUTPUT TOCHN, +CPOPJ: POPJ P, + ;ROUTINE TO ASK A QUESTION AND ACCEPT Y OR N (1 OR 0) +;CALL: PUSHJ P,ASKYN +; ASCIZ /QUESTION?/ +; RETURN + +ASKYN: PUSHJ P,FCRLF ;PUT CRLF IN FILE ONLY + HRRZ T,(P) + PUSHJ P,FILO +YN1: HRRZ T,(P) + HRLS (P) + PUSHJ P,TTYO + AOS T + HRRM T,(P) + PUSHJ P,TTYIN + PUSHJ P,GETWRD + MOVEI N,0 + CAME WD,[SIXBIT /0/] + CAMN WD,[SIXBIT /N/] + JRST YNOK + CAMN WD,[SIXBIT /NO/] + JRST YNOK + MOVEI N,1 + CAME WD,[SIXBIT /1/] + CAMN WD,[SIXBIT /Y/] + JRST YNOK + CAME WD,[SIXBIT /YES/] + JRST YN2 +YNOK: PUSHJ P,OUTSTR + ASCIIZ <;*> + POPJ P, + +YN2: HLRS (P) + JRST YN1 + ;ROUTINE TO OUTPUT ON FILE ASCIZ STRING IN ASCSTR +; SUBSTITUTED FOR "*" +;CALL: PUSHJ P,OUTSTR +; ASCIIZ +OUTSTR: MOVE T,(P) + PUSHJ P,STRO + POP P,CH + JRST 1(T) + +STRO: HRLI T,440700 +STROLP: ILDB CH,T + JUMPE CH,CPOPJ + CAIN CH,"*" + JRST STRSUB + PUSHJ P,FILPUT + JRST STROLP + +STRSUB: PUSH P,T + MOVEI T,ASCSTR + PUSHJ P,FILO + POP P,T + JRST FILOLP + ;ROUTINE TO SUBSTITUTE OCTAL VALUE OF N FOR * IN STRING +; AND OUTPUT ON FILE +; MOVE N,OCTAL NUMBER +;CALL: PUSHJ P,OUTXP +; ASCIZ /MESSAGE*MESSAGE/ +;RETURN WITH N PRESERVED + +OUTXP: MOVE T,(P) + PUSHJ P,XPO + POP P,CH + JRST 1(T) + +XPO: HRLI T,440700 +XPOLP: ILDB CH,T + JUMPE CH,CPOPJ + CAIN CH,"*" + JRST XPSUB + PUSHJ P,FILPUT + JRST XPOLP + +XPSUB: PUSH P,T + PUSH P,N + MOVEI R,10 + PUSHJ P,XPSUB1 + POP P,N + POP P,T + JRST FILOLP +XPSUB1: IDIVI N,(R) + HRLM T,(P) + JUMPE N,.+2 + PUSHJ P,XPSUB1 + HLRZ T,(P) + MOVEI CH,"0"(T) + JRST FILPUT + ;ROUTINE TO PUT 1 CHAR IN OUTPUT FILE +;CALL: MOVEI CH,CHAR +; PUSHJ P,FILPUT + +FILPUT: CAIN CH,15 ;CARRIAGE RETURN? + POPJ P,0 ;YES. THROW IT AWAY + CAIN CH,12 ;LINE FEED? + JRST FILPU1 ;YES. TURN INTO CR-LF +FILPU2: SOSG FOBUF+2 + OUTPUT FOCHN, + IDPB CH,FOBUF+1 + POPJ P, + +FILPU1: MOVEI CH,15 ;OUTPUT A CR + PUSHJ P,FILPU2 + MOVEI CH,12 ;AND A LINEFEED + JRST FILPU2 + +;ROUTINE TO PUT 1 CHAR IN OUTPUT TTY +;CALL: MOVEI CH,CHAR +; PUSHJ P,TTYPUT + +TTYPUT: SOSG TOBUF+2 + OUTPUT TOCHN, + IDPB CH,TOBUF+1 + POPJ P, + ;ROUTINE TO ASK FOR A STRING AND DELETE THE CR-LF FROM THE ANSWER +;CALL: PUSHJ P,ASKST2 + ASCIIZ + +ASKST2: PUSHJ P,ASKSTZ + PUSHJ P,TTYIN + ILDB T,B +ASKST4: CAIE T,12 + JUMPN T,.-2 + DPB CH,B + POPJ P, + +;ROUTINE TO ASK FOR A STRING +;CALL: PUSHJ PDP,ASKSTR +; ASCIIZ + +ASKSTR: PUSHJ P,ASKSTZ + JRST TTYIN + + +ASKSTZ: PUSHJ P,FCRLF ;PUT CRLF IN FILE ONLY + HRRZ T,-1(P) + PUSHJ P,FILO + HRRZ T,-1(P) + PUSHJ P,TTYO + AOS T + EXCH T,(P) + JRST (T) + ;ROUTINE TO ACCEPT 1 LINE FROM TTY AND MOVE TO ASCSTR AND +; APPEND A NULL CHAR. +;CALL: PUSHJ P,TTYIN + +TTYIN: MOVE T,[XWD 440700,ASCSTR] +ASCLP: PUSHJ P,TTYGET + JRST ASCEND + IDPB CH,T + JRST ASCLP + +ASCEND: IDPB CH,T + MOVEI CH,0 + IDPB CH,T + MOVE B,[XWD 440700,ASCSTR] + POPJ P, + +;ROUTINE TO GET 1 CHAR FROM TTY +;CALL: PUSHJ P,TTYGET +; RETURN1 WITH CR IN AC CH +; RETURN2 WITH ANY OTHER CHAR IN AC CH + +TTYGET: SOSG TIBUF+2 + INPUT TTYCHN, + ILDB CH,TIBUF+1 + JUMPE CH,TTYGET + CAIN CH,15 + JRST TTYGET + CAIE CH,12 + AOS (P) + POPJ P, + + +;ROUTINE TO ACCEPT 1 LINE FROM TTY AND MOVE TO ASCSTR AND APPEND NULL +;SAME AS TTYIN, SKIP RETURN IF NON-BLANK LINE +;CALL: PUSHJ P,TTYIN1 +; BLANK LINE RETURN +; NON-BLANK LINE RETUNR + +TTYIN1: PUSHJ P,TTYIN ;GET LINE + ILDB T,B ;LF? + CAIE T,12 + AOS (P) ;NO, + JRST ASKST4 ;REMOVE CR-LF FROM END OF STRING + ;ROUTINE TO GET FIRST 6 CHAR TYPED IN A RETURN AS SIXBIT +; LEFT JUSTIFIED IN AC WD + +GETWRD: MOVE T,[XWD 440600,WD] + MOVEI WD,0 +GETWDL: ILDB CH,B + JUMPE CH,CPOPJ + CAIG CH,15 + CAIGE CH,12 + SKIPA + POPJ P, + CAIE CH,":" + CAIN CH,"." + POPJ P, + CAIGE CH,140 + TRC CH,40 + IDPB CH,T + TRNN WD,77 + JRST GETWDL + POPJ P, +ASCSTR: BLOCK 20 ;ASCIZ STRING + +;ROUTINE TO ASK A QUESTION AND ACCEPT A DECIMAL ANSWER +;CALL: PUSHJ P,ASKDEC +; ASCIIZ + +ASKDEC: MOVEI R,12 + JRST ASKNUM +ASKDC1: MOVEI R,12 + JRST ASKNM1 + ;ROUTINE TO ASK A QUESTION AND ACCEPT AN OCTAL NUMBER +;CALL: PUSHJ P,ASKOCT +; ASCIZ /QUESTION/ + +ASKOCT: MOVEI R,10 +ASKNUM: PUSHJ P,FCRLF ;PRECEDE WITH CRLF IN FILE ONLY +ASKNM1: HRRZ T,(P) + PUSHJ P,FILO + MOVEI CH,";" + PUSHJ P,FILPUT +ASKNE: HRRZ T,(P) + PUSHJ P,TTYO + MOVEI N,0 +ASKNL: PUSHJ P,TTYGET + JRST ASKNXT + CAIL CH,"0" + CAIL CH,"0"(R) + JRST ASKERR + IMUL N,R + ADDI N,-"0"(CH) + PUSHJ P,FILPUT + JRST ASKNL +ASKNXT: PUSHJ P,FCRLF + POP P,T1 + JRST 1(T) +ASKERR: PUSHJ P,TTYGET + JRST ASKNE + JRST .-2 + + + +;ROUTINE TO OUTPUT CRLF IN OUTPUT FILE +;CALL: PUSHJ P,FCRLF +;USED TO SEPARATE QUESTION FROM PREVIOUS MACRO CALL + +FCRLF: MOVEI CH,15 + PUSHJ P,FILPUT + MOVEI CH,12 + JRST FILPUT + END MONGEN + + diff --git a/src/mongen.rno b/src/mongen.rno new file mode 100644 index 0000000..fb68223 Binary files /dev/null and b/src/mongen.rno differ diff --git a/src/mtasrx.mac b/src/mtasrx.mac new file mode 100644 index 0000000..87e7435 --- /dev/null +++ b/src/mtasrx.mac @@ -0,0 +1,536 @@ + TITLE MTASRX - MAGTAPE ROUTINES FOR PDP-10(TM-10) V420 +SUBTTL T. WACHS/TH TS 20 MAY 69 + XP VMTASR,420 ;DEFINE VERSION NUMBER FOR LOADER STORAGE MAP + +ENTRY MTASRX +MTASRX: + +INTERNAL MTADSP + +;DISPATCH TABLE + JRST MTAINI + JRST HUNGTP ;HUNG DEVICE +MTADSP: JRST MTAREL ;RELEASE + JRST MTCLOS ;CLOSE + JRST MTOUT + JRST MTIN + JRST SAVCHK ;ENTER + JRST SAVCHK ;LOOKUP + JRST MTDMPO + JRST MTDMPI + POPJ PDP, ;USETO + POPJ PDP, ;USETI + JRST CPOPJ1 ;RENAME + POPJ PDP, ;CLOSE INPUT + POPJ PDP, ;UTPCLR + JRST MTAP0T + +MTC=340 +MTS=344 + +;MTACHN=FLAG CHANNEL +;MTOCHN=DATA CHANNEL +;MTFLAG=10*MTACHN + 400 +;MTBOTH=10*MTACHN+MTDCHN +;MTALOC=40 + 2*MTDCHN +;MTLOC1=MTALOC+1 + INTERN MTAINI,MTADDS,MTADDB + EXTERN ADVBFE,ADVBFF,MTFLAG,MTBOTH,SETACT,CLRACT,WSYNC + EXTERN STDENS,SETIOD,MTREQ,MTAVAL,CLOCK,MTALOC,MTLOC1,OUT + EXTERN CPOPJ,CPOPJ1,PIOMOD,PUNIT,MTWAIT,JIFSC2,COMCHK + EXTERN PIOFF,PION,MTASAV,ADRERR,PDVCNT,MTSIZ,STOIOS,IADRCK + +COMPAT=1000 ;IBM COMPATABLE 9-TRACK +DMPMOD=20000 ;DUMP MODE FLAG +MTREW=40000 ;MAGTAPE IS REWINDING + +MTTRY=3 ;NO. OF TIMES TO RETRY ON AN ERROR +QUANT=3 ;NO. OF RECORDS TO READ UNINTERRUPTED + TP=DAT +;DDB +MTADDB: SIXBIT /MTA0/ + XWD ^D30*HUNGST,MTSIZ+1 + 0 + MTADSP + XWD 1023,154403 + 0 + 0 + XWD PROG,0 + XWD PROG,0 + XP MTADDS,.-MTADB ;SIZE OF DDB (FOR BUILD) + ;INITIALIZE +MTAINI: SETOM NMTREW ;RESET FLAGS + SETOM UNIT + SETZM ERRFLG + SETZM REMNDR + CONO MTC,0 ;TURN OFF MTC + MOVE TAC,[JSR MTDEND] ;SET UP END-CONDITION + MOVEM TAC,MTLOC1 ;FOR BLKI/BLKO + POPJ PDP, + +;IF ENTER OR LOOKUP IN SAVE MODE - CHANGE TO MODE 16 +SAVCHK: LDB TAC,PIOMOD ;GET MODE + CAIN TAC,0 ;SAVE MODE? + TRO IOS,16 ;YES, CHANGE TO DUMP-MODE + MOVEM IOS,DEVIOS(DEVDAT) + JRST CPOPJ1 ;GIVE GOOD RETURN FROM LOOKUP/ENTER +;CLOSE +MTCLOS: TLNN DEVDAT,OUTPB ;OUTPUT BEEN DONE? + POPJ PDP, ;NO. GO AWAY + + LDB TAC,PIOMOD + CAIGE TAC,16 ;DUMP MODE? + PUSHJ PDP,OUT ;NO. EMPTY LAST PARTIAL BUFFER + PUSHJ PDP,WSYNC ;WAIT FOR IO TO STOP + MOVEI UUO,3 ;WRITE 2 ENDS-OF FILE + PUSHJ PDP,MTAP1 + TRNE IOS,IOIMPM ;WRITE LOCK? + POPJ PDP, ;YES RETURN + PUSHJ PDP,SETACT + PUSHJ PDP,WSYNC + MOVEI UUO,3 + PUSHJ PDP,MTAP1 + PUSHJ PDP,SETACT + PUSHJ PDP,WSYNC + MOVEI UUO,7 ;AND BACKSPACE OVER ONE OF THEM + JRST MTAP1 + +HUNGTP: TLZN IOS,MTREW ;TAPE REWINDING? + JRST THRUTP ;NO. GIVE UP CONTROL + SOS NMTREW ;YES. DECREASE COUNT OF TAPES IN REW + AOS MTREQ ;THRUTP WILL SOS THIS BACK + JRST THRUPT ;TURN OFF TM10 + ;CONNECT CONTROL TO A TRANSPORT +CONECT: MOVEI TAC,440102 ;SET UP INTERRUPT CONDITIONS + HRRM TAC,MTAINT + HRRM DEVDAT,USEWRD ;SAVE DEVDAT FOR INTERRUPT + LDB TP,PUNIT ;GET UNIT + CAMN TP,UNIT ;ALREADY CONNECTED TO IT? + JRST ONECT3 ;YES + LSH TP,17 ;NO. SET FOR CONO + CONSZ MTS,2 ;CONTROL FREE? + JRST ONECT2 ;YES. DO A NO-OP CONO + TRO TP,MTFLAG ;NO. SET CONTROL FREE ENABLE + TLNN IOS,MTREW ;CONNECTING TO A REWINDING TAPE? + PUSHJ PDP,ONECT4 ;NO.CHANGE RETURN +ONECT2: HRLM TP,USEWRD ;MIGHT NEED ON INTERRUPT LEVEL + CONO MTC,(TP) ;CONO TO MTC + LSH TP,3 ;SAVE UNIT + HLRZM TP,UNIT +ONECT3: JUMPGE IOS,WSYNC ;WAIT FOR DEV TO FREE IF NOT REWINDING + TRNN TP,4000 ;REWINDING, CONTROL FREE ENABLE? + AOS (PDP) ;NO. SKIP RETURN + POPJ PDP, ;YES. IMMEDIATE RETURN +ONECT4: MOVEI TAC,TPREDY ;SET DEVICE ACTIVE + HRRM TAC,-1(PDP) ;AGAIN WHEN INACTIVE + JRST SETACT ;SET DEVICE ACTIVE + +;DELAY TILL TAPE COMES OUT OF IO WAIT, THEN GET CONTROL +DLYRDY: SETOM MTAVAL + PUSHJ PDP,WSYNC ;WAIT FOR IO TO STOP + +;GET MTC, CONNECT TAPE TO CONTROL +TPREDY: AOSE MTREQ ;GET CONTROL + PUSHJ PDP,MTWAIT ;WAIT FOR IT + MOVEI TAC,QUANT ;SET QUANTUM TIME + MOVEM TAC,QUANTM +TPRDY2: MOVEM PROG,USEPRG + PUSHJ PDP,CONECT ;CONECT CONTROL TO TAPE + +;SET TP FOR THIS TAPE +TPSET: LDB TP,[POINT 2,IOS,28] ;PARITY + SKIPN TP ;USE STANDARD IF 0 + MOVEI TP,STDENS ;NOT SPECIFIED, USE STANDARD FOR SYS. + SOS TP ;SET TO USER'S REQUEST + LSH TP,6 + TRNN IOS,IOPAR ;PARITY + TRO TP,40000 ;ODD + MOVE TAC1,UNIT ;UNIT + DPB TAC1,[POINT 3,TP,20] ;INTO COMMAND + TRO TP,MTBOTH ;PI CHANNELS + MOVEI TAC,MTTRY ;SET ERROR COUNT + MOVNM TAC,ERCNT + CONSZ MTS,4 ;7 OR 9 TRACK? + JRST RDYCHK ;7 TRACK + TLNN IOS,COMPAT ;9 TRACK. CORE DUMP? + TROA TP,20030 ;YES + TRO TP,40300 ;NO. SET 800 BPI, ODD PARITY + ;MAKE SURE TAPE IS READY +RDYCHK: CONSZ MTS,40 ;READY? + POPJ PDP, ;YES + CONSO MTS,20000 ;REWINDING? + POPJ PDP, ;NO. LET XPORT HUNG INTERRUPT HANDLE IT + TLO IOS,MTREW ;YES. MUST BE REWINDING + PUSHJ PDP,SETACT ;DEVICE ACTIVE + AOS NMTREW ;BUMP COUNT OF REWINDING DRIVES + SOSL MTREQ ;LET SOMEONE ELSE USE TAPES + JRST DLYRDY ;NOONE ELSE WANTS CONTROL + PUSHJ PDP,CLOKRQ ;PUT IN A TIME REQUEST + JRST DLYRDY+1 ;AND WAIT + MTCLOK: XWD .+1,JIFSC2 + SETZM CLKREQ ;INDICATE NO CLOCK REQUEST IN NOW + SKIPL MTREQ ;CONTROL FREF? + POPJ PDP, ;NO. COME BACK LATER +MTCLK2: SETOM NMTREW ;COUNT NO. OF TAPES REWINDING + MOVEM DEVDAT,SAVDEV + MOVEI DEVDAT,MTADDR ;START AT MTA0 + AOS MTREQ ;MAKE SURE NO OTHER MTA REQUESTS ARE HONORED NOW +REWCHK: MOVE IOS,DEVIOS(DEVDAT) + JUMPGE IOS,REWCK2 ;TAPE NOT REWINDING + PUSHJ PDP,CONECT ;REWINDING - CONECT TO IT + POPJ PDP, ;CONTROL NOT FREE NOW - RETURN ON INTERRUPT LEVEL +REWCKA: CONSO MTS,40 ;STILL REWINDING? + JRST REWCK1 ;YES + TLZE IOS,IOW ;NO, TAKE OUT OF IO WAIT + PUSHJ PDP,SETIOD + TLZ IOS,MTREQ + PUSHJ PDP,CLRACT ;NO LONGER ACTIVE + JRST REWCK2 + +REWCK1: AOS NMTREW ;COUNT REWINDING TAPE + MOVEI TAC,36 + CONSZ MTS,20000 ;IF TAPE IS STILL REWINDING + DPB TAC,PDVCNT ;MAKE SURE IT DOESN'T GET A HUNG DEVICE +REWCK2: HLRZ DEVDAT,DEVSER(DEVDAT) ;NEXT DEVICE + HLRZ TAC,DEVNAM(DEVDAT) ;A MAG TAPE? + CAIN TAC,(SIXBIT .MTA.) + JRST REWCHK ;YES. CHECK IT + MOVE DEVDAT,SAVDEV ;PICK UP DEVDAT AGAIN + SOSL MTREQ ;FREE MTASER AGAIN + SETOM MTAVAL ;SOMEONE WAITING FOR CONTROL + SKIPGE NMTREW ;ANY TAPE REWINDING? + JRST THRUT3 ;NO + +CLOKRQ: MOVE TAC,MTCLOK ;PUT A CLOCK REQUEST IN + CONO PI,PIOFF ;HAVE MONITOR WAKE UP + SKIPL CLKREQ ;IF NO CLOCK REQUEST IN ASK TO WAKE UP + IDPB TAC,CLOCK ;IN HALF A SECOND + SETOM CLKREQ ;NOW WE HAVE ONE + CONO PI,PION + JRST THRUT3 +SAVDEV: 0 ;TEMPORARY STORAGE FOR DEVDAT + ;MTAPE +MTAP0: TRNE UUO,100 ;SETTING 7 TRACK MODE? + JRST SET9TK ;YES + +MTAP: TRZ IOS,776000 ;TURN OFF ERROR BITS + MOVEM IOS,DEVIOS(DEVDAT) ;SAVE IOS +MTAP1: PUSHJ PDP,TPREDY ;GET CONTROL FOR THIS TAPE +MTAP3: TRZ TP,7 ;NO DATA TRANSFER + ANDI UUO,17 ;GET FUNCTION + ROT UUO,-1 ;TRANSLATE FROM TABLE + SKIPL UUO + SKIPA TAC,MTPTBL(UUO) + HLRZ TAC,MTPTBL(UUO) + TRZE TAC,100 ;MOVE TAPE BACKWORD? + CONSO MTS,100000 ;YES, TAPE AT LOAD POINT? + TRNN TAC,-1 ;OR NO-OP? + JRST THRUTA ;YES, GO CHECK FOR BOT + TRZE TAC,200 ;SKIP TO LOGICAL EOT? + JRST LEOT ;YES + TRZN TAC,400 ;TRY TO WRITE TAPE? + JRST MTAGO ;NO. + CONSZ MTS,10 ;YES. WRITE LOCKED? + JRST ILLOP ;YES. LIGHT ERROR BIT +MTAGO: DPB TAC,[POINT 4,TP,26] ;PUT FUNCTION INTO COMMAND + HRLM TP,USEWRD ;SAVE COMMAND + CONO MTC,(TP) ;START TAPE MOVING + JRST CLRACT ;AND RETURN + +;SET 9-TRACK TAPE +SET9TK: TRNE UUO,1 + TLOA IOS,COMPAT ;SET IBM COMPAT. +MTAREL: TLZ IOS,COMPAT ;NOT IBM COMPAT + JRST STOIOS +;SKIP TO LOGICAL EOT +LEOT: CONSZ MTS,100000 ;TAPE AT BOT? + JRST LEOT2 ;YES, DONT BACKSPACE + PUSHJ PDP,MTAG0 ;BACKSPACE RECORD + PUSHJ PDP,EOTWT ;WAIT FOR IT +LEOT2: MOVEI UUO,16 ;SKIP A FILE + PUSHJ PDP,MTAP2 + MOVEI UUO,6 ;SKIP A RECORD + PUSHJ PDP,MTAP + PUSHJ PDP,EOTWT ;WAIT FOR IT + MOVE IOS,DEVIOS(DEVDAT) + TRNN IOS,IODENT ;END OF FILE SEEN? + JRST LEOT2 ;NO. SKIP TO NEXT FILE + MOVEI UUO,7 ;YES. BACKSPACE RECORD + +MTAP2: PUSHJ PDP,TPRDY2 + JRST MTAP3 +;WAIT FOR TAPE TO FINISH. MTREQ WILL COUNT DOWN AT END OF OPERATION +EOTWT: AOSE MTREQ + PUSHJ PDP,MTWAIT ;WAIT TILL MTREQ IS COUNTED DOWN + POPJ PDP, + MTPTBL: XWD 101,0 ;REW,NOP + XWD 405,0 ;WRITE EOF. + XWD 0,0 + XWD 107,6 ;BACKSPACE REC,SKIP REC + XWD 111,207 ;REW,UNLOAD,LOG EOT + XWD 415,0 ;WRITE BLANK TAPE, + XWD 0,0 + XWD 117,16 ;BACK FILE,SKIP FILE + ;OUTPUT UUO +MTOUT: PUSHJ PDP,TPREDY ;GET CONTROL SETUP TP + CONSZ MTS,10 ;WRITE LOCK? + JRST ILLOP ;YES, SET IOIMPM AND RETURN + CONSZ MTS,4000 ;EOT? + TROA IOS,IOTEND+IOBKTL ;YES. LIGHT BIT + TLOA IOS,IO ;NO. INDICATE OUTPUT + JRST ADVOUT ;DONE IF EOT +MTOUT1: MOVEI TAC,@DEVOAD(DEVDAT) ;ADDRESS OF BUFFER + MOVN TAC1,1(TAC) ;-WORD COUNT + HRL TAC,TAC1 ;IN LH OF COMMAND + AOJG TAC,ADVOUT ;SKIP IF 0 WORDS +MTOUT2: TRO TP,4000 ;FUNCTION = WRITE + MOVSI TAC1,(BLKO MTC,) ;SETUP BLKO +MTDTGO: MOVEM TAC,PNTR ;SAVE BLKI/BLKO POINTER + MOVEM TAC,SVNPTR + HRRI TAC1,PNTR ;BLKI/BLKO PNTR + MOVEM TAC1,MTALOC ;INTO INTERRUPT LOC + HRLM TP,USEWRD ;SAVE COMMAND + + CONO MTC,(TP) ;START TAPE MOVING + TRO IOS,IOACT ;SETACT CLEARS IOW + JRST STOIOS ;STORE IOS AND RETURN + +;INPUT UUO +MTIN: PUSHJ PDP,TPREDY ;SETUP TP FOR THIS DRIVE + TLZ IOS,IO ;INPUT +MTIN1: SETCM TAC,@DEVIAD(DEVDAT) ;-LARGEST POSSIBLE WRD CNT + HRRI TAC,@DEVIAD(DEVDAT) ;STARTING ADDRESS + ADD TAC,[XWD 2,1] ;MAKE REAL IOWD +MTIN2: TRO TP,2000 ;FUNCTION = READ + MOVSI TAC1,(BLKI MTC,) ;SETUP BLKI + JRST MTDTGO ;GO START TAPE + MTAINT: CONSO MTS,440102 ;INTERRUPT FOR MAG TAPE? + JRST . ;NO. GO AWAY + CONSO MTC,400 ;HAS CONTROL FREE ENABLED? + CONSZ MTS,440100 ;NO. CONTROL FREE ERRONEOUSLY ON? + JRST +2 ;REAL MTA INTERRUPT + JRST MTAINT+1 ;THIS INTERRUPT NOT REALLY FOR MTA + JSR MTASAV ;YES. SAVE ACS + HRRZ DEVDAT,USEWRD ;RESET DEVDAT + MOVE IOS,DEVIOS(DEVDAT) ;AND IOS + JUMPL IOS,REWCKA ;CNTRL FREE INTERRUPT ON A REW TAPE + MOVE PROG,USEPRG + SKIPE TAC,ERRFLG ;BACKSPACE FROM ERROR? + JRST TRYAGN ;YES. REISSUE COMMAND + CONSZ MTS,440000 ;ERROR? + JRST ERROR ;YES. ILLEGAL OP OR HUNG DEVICE + CONSZ MTC,7 ;DATA OPERATION? + JRST DATEND ;YES + LDB TP,[POINT 4,USEWRD,8] ;GET FUNCTION + CAIN TP,6 ;SKIPPING A RECORD? + CONSO MTS,10000 ;YES. SEEN AN EOF? + SKIPA ;NO. + TRO IOS,IODEND ;YES. TURN ON EOF BIT +THRUTA: CONSZ MTS,300000 ;NO. BOT OR REWINDING? + TROA IOS,IOBOT ;YES. SET BOT BIT FOR USER TO SEE + TRZ IOS,IOBOT ;NO. TURN OFF BOT BIT +THRUTP: CONSZ MTS,4000 ;NO. EOT? + TRO IOS,IOTEND ;YES + TLZE IOS,IOW ;JOB IN IO WAIT? + PUSHJ PDP,SETIOD ;YES. TAKE IT OUT + TLZ IOS,DMPMOD + PUSHJ PDP,CLRACT + ;CONTROL FREE INTERRUPT? + ;YES. DONT COUNT DOWN MTREQ + SOSGE MTREQ ;COUNT DOWN REQUEST COUNT + JRST THRUT2 ;NOONE ELSE WAITING + SKIPL NMTREW ;IF THERE ARE TAPES REWINDING + SKIPE CLKREQ ;WHICH HAVEN'T BEEN CHECKED IN + SKIPA ;MORE THAN 1/2 A SECOND + JRST MTCLK2 ;GO CHECK THEM NOW + SETOM MTAVAL ;SOMEONE ELSE WANTS IT + JRST THRUT3 ;DISMISS INTERRUPT AND RETURN + ;HERE CONTROL IS ALL DONE. CHECK ON REWINDING TAPES IF NEEDED +THRUT2: SKIPL NMTREW ;ANY DRIVES REWINDING? + JRST MTCLK2 ;YES. CHECK IF ANY THROUGH +THRUT3: HLRZ TP,USEWRD ;GET UNIT + TRZ TP,17777 ;MASK OUT FUNCTION + CONO MTC,(TP) ;DISMISS INTERRUPT + HLLZS MTAINT ;DONT LOOK AT ANY MORE INTERRUPTS + POPJ PDP, ;AND EXIT + +;HERE WHEN BLKI/BLKO COUNTS DOWN TO ZERO +MTDEND: 0 + CONO MTS,1 ;GIVE A FUNCTION STOP + JEN @MTDEND ;AND EXIT + DATENO: CONSZ MTS,20600 ;RECORD OK? + JRST RETRY ;PARITY, DATA LATE OR BAD TAPE +DATND2: TLNE IOS,DMPMOD ;DUMP MODE? + JRST CMPEND ;YES + TLNN IOS,IO ;READING? + JRST INPTND ;YES, FINISH INPUT +ADVOUT: PUHSJ PDP,ADVBFE ;WRITING, ADVANCE BUFFERS + ;END OF TAPE? + JRST THRUTP ;YES, DONT WRITE ANY MORE +NXTREC: TLZE IOS,IOW ;IN IO WAIT? + PUSHJ PDP,GETIOD ;RESTART JOB + SOSG QUANTM ;COUNT DOWN PROTECT TIME + SKIPG MTREQ ;ANYONE ELSE WANT CONTROL? + CONSZ MTS,4000 ;NO. KEEP GOING UNLESS EOT + JRST THRUTP ;YES, GIVE UP CONTROL + MOVNI TAC,MTTRY ;RESET ERROR COUNT + MOVEM TAC,ERCNT + HLRZ TP,USEWRD ;PICK UP COMMAND + TLNE IOS,IO ;AND DO NEXT RECORD + JRST MTOUT1 + HLRZ TAC,@DEVIAD(DEVDAT) ;PICK MAX. SIZE OF BUFFER + ADDI TAC,@DEVIAD(DEVDAT) ;AND IN FIRST ADDRESS + PUSHJ PDP,IADRCK ;CHECK IT'S O.K. + JRST THRUTP ;NO - RELEASE CONTROL + JRST MTIN1 ;O.K. DO NEXT INPUT. + +;HERE WHEN THROUGH AN INPUT RECORD +INPTND: CONSZ MTS,10000 ;EOF? + JRST DATEOF ;YES + MOVEI TAC,@DEVIAD(DEVDAT) ;START OF RECORD + HRRZ TAC1,PNTR ;WHERE WE ARE NOW + SUBI TAC1,1(TAC) ;LAST LOC-FIRST LOC + HRRM TAC1,1(TAC) ;=WORD COUNT + PUSHJ PDP,ADVBFF ;ADVANCE BUFFERS + JRST THRUTP ;NONE FREE + JRST NXTREC ;CONTINUE WITH NEXT RECORD + +; HERE AT THE END OF A DUMP MODE RECORD +DMPEND: HLRZ TP,USEWRD ;SET UP COMMAND AGAIN + CONSO MTS,14000 ;EOF OR EOT? + JRST DMPBLK ;NO,GET NEXT COMMAND + CONSO MTS,4000 ;EOF? + TRO IOS,IODEND ;YES,SET EOF BIT + JRST THRUTP ;AND RETURN TO USER + MTDMPO: TLOA IOS,IO ;DUMP OUTPUT +MTDMPI: TLZ IOS,IO ;DUMP INPUT + HRLI UUO,PROG + PUSHJ PDP,COMCHK ;CHECK VALIDIT OF LIST + JRST ADRERR ;NOT VALID + PUSH PDP,IOS ;WSYNC WILL CLOBBER IOS + PUSHJ PDP,TPREDY ;GET CONTROL, SETUP TP + POP PDP,IOS + TLNE IOS,IO ;CHECK WRITE LOCK + CONSO MTS,4010 ;AND EOT IF WRITING + JRST MTDMP2 + CONSO MTS,4000 ;ERROR + TROA IOS,IOIMPM ;WRITE LOCK + TRO IOS,IOTEND+IOBKTL ;EOT + JRST THRUTP ;GIVE UP TAPE AND RETURN +MTDMP2: TLO IOS,DMPMOD ;INDICATE DUMP-MODE + SOS UUO ;WILL COUNT IT UP LATER + MOVEM UUO,LSTLOC ;SAVE LOC OF LIST +DMPBLK: PUSHJ PDP,NXTCOM ;GET NEXT COMMAND + + ADDI TAC,(PROG) ;ADD RELOCATION FACTOR + TLNE IOS,IO ;WRITING? + JRST MTOUT2 ;YES. GO WRITE RECORD + TRMN IOS,1 + TRO TP,10000 ;OR - READ ACROSS RECORD BOUNDARIES + JRST MTIN2 ;GO READ RECORD(S) + +NXTCOM: SKIPE TAC,REMNDR ;PARTIAL IOWD LEFT TO DO? + JRST NXTCM3 ;YES, CONTINUE WITH IT + AOSA TAC,LSTLOC ;GET NEXT COMMAND LOC + HRRM TAC,LSTLOC + MOVE TAC,@TAC ;PICK UP COMMAND + JUMPL TAC,NXTCM2 ;REAL COMMAND + JUMPG TAC,NXTCOM+1 ;GO-TO-WORD + POP PDP,TAC ;0 - THROUGH + JRST THRUTP + + EXTERN MMTSIZ ;-MTSIZ +NXTCM2: TLNE IOS,IO ;WRITING? + TRNE IOS,1 ;YES, MODE 16? + POPJ PDP, ;NO. USE IOWD AS OBTAINED +NXTCM3: HLRE TAC1,TAC ;YES. GET WORDCOUNT + SETZM REMNDR + CAML TAC1,MTSZ ;RECORD TOO LARGE? + POPJ PDP, ;NO, GO WRITE + ADD TAC,[XWD MTSIZ,MTSIZ] ;YES. + MOVEM TAC,REMNDR ;IOWD TO USE FOR NEXT RECORD + SUBI TAC,MTSIZE ;ADDRESS FOR THIS IOWD + HRLI TAC,MMTSIZ ;WRITE -MTSIZE WORD RECORDS + POPJ PDP, ;RETURN THE IOWD +REMNDR: 0 +MTSZ: XWD -1,MMTSIZ ;NEG. OF RECORD SIZE IN WORDS + MTHUNG: PUSHJ PDP,THRUT3 ;TURN OFF ERROR PI BIT + PUSHJ PDP,SETACT ;TURN ON IOACT + MOVEI TAC,1 ;SET HUNG-TIME TO 1 MORE TICK + DPB TAC,PDVCNT ;SET HUNG TIME + POPJ PDP, ;AND EXIT + + +ERROR: CONSZ MTS,400000 ;HUNG DEVICE? + JRST MTHUNG ;YES + +;ILLEGAL OP INTERRUPT + TRNN IOS,IOACT ;DATA OPERATION? + JRST ILLOP ;NO. LIGHT ERROR BIT, GIVE UP CONTROL + TRO IOS,IOIMPM ;YES. LIGHT IOIMPM + MOVEM IOS,DEVIOS(DEVDAT) ;SINCE DEVICE IS STILL ACTIVE + JRST THRUT2 ;COUNT DOWN MTRWQ ON HUNG CALL + +ILLOP: TROA IOS,IOIMPM +DATEOF: TLO IOS,IOEND ;EOF - LIGHT BIT + JRST THRUTP ;AND GIVE UP CONTROL + +;TRY AGAIN ON PARITY ERROR OR BAD TAPE +RETRY: TRNN IOS,ONRCK ;WANT TO STOP ON ERROR? + AOSL TAC,ERCNT ;OR TRIED ENOUGH? + JRST PERMER ;YES. PERMANENT ERROR +RETRY1: MOVEI TAC,2 ;SET RETRY SWITCH + MOVEM TAC,ERRFLG +RETRY2: HLRZ TP,USEWRD ;PICK UP COMMAND + ANDI TP,760770 ;SET FOR BACKSPACE + CONO MTC,7000(TP) ;BACKSPACE RECORD + POPJ PDP, ;AND GO AWAY + +;COME HERE AFTER BACKSPACE IS THROUGH +TRYAGN: SOJLE TAC,TRYSKP ;GO IF NOT 2ND BACKSPACE + CONSO MTS,100000 ;BOT? + JRST RETRY2-1 ;NO. BACKSPACE AGAIN +TRYNXT: ;READ RECORD AGAIN + MOVE TAC,SVPNTR ;RESET POINTER + MOVEM TAC,PNTR + HRLZ TP,USEWRD ;GET COMMMAND + CONO MTC,(TP) ;EXECUTE IT AGAIN + SETZM ERRFLG + POPJ PDP, ;AND GO AWAY + +;HERE AFTER 2ND BACKSPACE OR SKIP AFTER ERROR +TRYSKP: JUMPL TAC,TRYNXT ;AFTER FORWARD SKIP IF NEGATIVE + HLRZ TP,USEWRD ;AFTER 2ND BACKSPACE - SKIPA RECORD + ANDI TP,760770 + CONO MTC,6000(TP) ;SKIP A RECORD + SETOM ERRFLG ;INDICATE FORWARD SKIP + POPJ PDP, ;AND GO AWAY + PERMER: TLNE IOS,IO ;READING? + TRNE IOS,IONRCK ;NO RECOVERY WANTED? + JRST SETIOS ;REALLY PERMANENT + CAILE TAC,100 ;TRIED TO REWRITE 100 TIMES + JRST SETIOS ;YES. REALLY PERMANENT + JUMPG TAC,RETRY2 ;TRY WRITING WITH 3 INCHES OF + MOVSI TAC,10000 ;BLANK TAPE TO ERASE BAD SPOT + ORM TAC,USEWRD ;SET COMMAND TO 14 (FROM 4) + JRST RETRY1 ;AND TRY AGAIN + +SETIOS: CONSZ MTS,400 ;DATA MISSED OR BAD TAPE? + TRO IOS,IODERR ;YES + CONSZ MTS,20200 ;PARITY ERROR? + TRO IOS,IODTER ;YES + JRST DATND2 ;SAVE ERROR WORD AND GO AWAY +NMTREW: 0 +USEWRD: 0 +USEPRG: 0 +CLKREQ: 0 + +UNIT: 0 +ERCNT: 0 +ERRFLG: 0 +QUANTM: 0 +LSTLOC: 0 +PNTR: 0 +SVPNTR: 0 +MTAEND: END + diff --git a/src/mtcsr6.mac b/src/mtcsr6.mac new file mode 100644 index 0000000..215a429 --- /dev/null +++ b/src/mtcsr6.mac @@ -0,0 +1,654 @@ +TITLE MTCSR6 - MAGNETIC TAPE ROUTINES FOR 516 CONTROL +SUBTTL C.WHITE 27-APR-69 V406 + XP VMTCSR,406 ;DEFINE GLOBAL VERSION NUMBER FOR LOADER MAP + +ENTRY MTCSR6 +MTCSR6: +INTERNAL FTCHECK,FTMONP +IFN FTCHECK+FTMONP,< +EXTERNAL MTCDDB,MTCDDS,MTECNT,MTRKCN +> +IFE FTCHECK+FTMONP,< + +INTERNAL MTCDDB,MTCDSP + +;MTC DEVICE DATA BLOCK +;REMAINING MTA DDB'S (IF ANY) ARE +;GENERATED OUT OF LINE AT BUILD TIME + ZZ=. +MTCDDB: SIXBIT /MTA0/ + XWD 2*HUNGST,MTSIZ+1 + 0 + EXP MTCDSP + XWD DVMTA+DVIN+DVOUT+DVLNG,154407 + 0 + 0 + XWD PROG,0 + XWD PROG,0 + XP MTECNT,.-ZZ + 0 ;CUMMULATIVE ERROR COUNT FOR THIS UNIT + ;BITS 0-8=LONG, PARITY ERROR COUNT + ;BITS 9-17=LAT, PARITY ERROR COUNT + ;BITS 18-26=ILL. OP. COUNT + ;BITS 27-35=DATA MISSED COUNT + XP MTBKCN,.-ZZ + 0 ;CUMMULATIVE RECORD COUNTER FOR THIS UNIT + XP MTCDDS,.-ZZ ;SIUZE OF MTC DDB + +> + T=ITEM +;MAKE TAPE SERVICE SUBROUTINES + + JRST MTCINI ;INITIALIZATION + JRST MTHUNG ;MTA HUNG TIMEOUT. RELEASE DATA CONTROL. + ;MAGTAPE CONTROL. PRINT ERROR AND STOP JOB. +MTCDSP: POPJ PDP, ;RELEASE + JRST MTCLSO ;CLOSE OUTPUT + JRST MTOUT ;OUTPUT + JRST MTIN ;INTPUT + JRST CPOPJ1 ;ENTER IN DIRECTORY + JRST CPOPJ1 ;LOOKUP IN DIRECTORY + JRST MTDMPO ;DUMP OUTPUT + JRST MTDMPI ;DUMP INPUT + POPJ PDP, ;SETO + POPJ PDP, ;SETO + POPJ PDP, ;GETF + JRST CPOPJ1 ;RENAME + POPJ PDP, ;CLOSE INPUT + POPJ PDP, ;UTPCLR + ;MTAPE UUO (FALL INTO THIS CODE WHICH FOLLOWS) + +DEFINE MTAPE (A) ;MARCO TO DEFINE LEGAL MTAPE UUO EFFECTIVE ADDRESSES. +< CODES=0 + IRP A, < + CODES=CODES!<1B<^D35-^0'A>>>> + + MTAPES <0,1,11,7,17,3,6,13,16,10> ;DEFINE WHICH CODES ARE LEGAL + + MOVEI T,1 ;CHECK FOR LEGAL MTAPE UUO + LSH T,(UUO) ;SHIFT BIT ACCORDING TO THE USER'S UUO + TRNN T,CODES ;DID HE SPECIFY A LEGAL CODE ? + JRST UUOERR ;NO--TYPE MONITOR ERROR MESSAGE. + SOJE T,MTP0 ;CHECK FOR MTAPE 0 (SPECIAL SYNC WAIT NO-OP) + + PUSHJ PDP,MTCHK2 + TRZ IOS,776000 ;CLEAR ERROR BITS ,IOF. + ;IOACT, IOBOT AND IOTEND. + SKIPA T,UUO ;CALL MTAPE2 + MTAPE: PUSHJ PDP,MTCHK2 ;CHECK IF MAG TAPE CONTROL AVAIL. +MTAPE2: TDZ IOS,[XWD IODT!IOSEOF,IOACT] + TRNN T,SLICE ;SET SLICE LEVEL THIS UUO? + JRST NOSFT ;NO + TLZ IOS,IOSLIC ;YES, CLEAR LEVEL + TRNE T,SLEVEL ;SET TO 1? + TLO IOS,IOSLIC ;YES +NOSET: + LSH T,^D8 ;MOVE TO FUNCTION + ANDI T,7400 ;MODE BITS + CAIN T,4000 ;LOGICAL EOT? + JRST MTLEOT + CAIE T,1400 ;WRITE EOF + CAIN T,5400 ;OR WRITE BLANK TAPE? + JRST CHKLOC ;YES, CHECK WRITE-LOCK + CONSO 224,4000 ;AT LOAD POINT? + JRST MTGO0 ;NO + CAIE T,3400 ;YES, BACKSPACE RECORD? + + CAIN T,400 ;NO, REW? + JRST MTFIN ;YES + CAIN T,7400 ;NO, BACKSPACE FILE? + JRST MTFIN ;YES +MTGO0: MOVSI TAC,TCF ;LOOK FOR TAPE CONTROL FREE ONLY + ;HERE FROM INPUT AND OUTPUT UUOS AND INTERRUPT TO DO NEXT RECORD. + +MTGO1: LDB TAC1,PUNIT ;UNIT + DPB TAC1,[POINT 3,T,31] ;UNIT + LDB TAC1, [POINT 3, IOS,28] ;DENSITY PARITY + TRNN TAC1,7 ;NO DENSITY OR PARITY SPECIFIED? + IORI TAC1,STDENS ;YES, USE STANDARD + XORI TAC1, 5 ;ODD, 556 + DPB TAC1,[POINT 3,T,23] + HRRI TAC,MTCCHN(T) ;CHANNEL + TRO TAC,200 ;INHIBIT RETURN TO POOL + TLNE IOS,IOSLIC ;SLICE LEVEL A 1? + TRO TAC,100000 ;YES, SET COMMAND. + HRRM DEVDAT,MTDEV ;COMMAND, DVDB + HRLM TAC,MTDEV +MTGO3: MOVEI TAC1,MTPOUN + HRRM TAC1,MTIDSP + SETZM MTEOFF ;CLEAR EOF FLAG + TLNN IOS,IODT ;IS THIS A DATA TRANSFER OPERATION + ;REQUIRING DATA CONTROL + JRST MTGO2 ;NO, MUST BE SPACING OPERATION + CONO DC,@MDCSAV ;YES, ATTACH DC TO MAGTAPE + CONO PI,DCON ;TURN DC PI CHANNEL ON +MTGO2: SETZM MISSED ;CLEAR DATA MISSED FLAG + STARTDV MTC + HLRZS TAC + CONO 224,(TAC) ;ENABLE FOR TCF OR ERF + JRST STOIOS ;STORE HUNG COUNT, EXIT + +;READ +MTIN: PUSHJ PDP,MTCHECK ;IS SYSTEM AVAILABLE?> + TLZ IOS,IO ;READING. +MTIN1: SETCM TAC,@DEVIAD(DEVDAT) ;-SIZE-1 + HRRI TAC,@DEVIAD(DEVDAT) ;BUFFER ADDRESS,PROG INCLUDED + ADD TAC,[XWD 2,1] ;-SIZE+1,BUFFER+1 + MOVEI T,2400 ;READ +MTIN2: MOVE TAC1,[BLKI DC,4000+MTDC*10] + JRST MTINDC + ;IS SYSTEM AVAILABLE +MTCHEK: PUSHJ PDP,GETDCMT ;GET DATA AND MAG TAPE CONTROLS + AOSE MTREQ ;ARGUMENT + MOVE IOS,DEVIOS(DEVDAT) + TLO IOS,IODT ;FLAG DATA TRANSFER + XCT @(PDP) + PUSHJ PDP,MTCHK4 ;WAIT FOR REWIND + JRST MTCHEK ;GET DC & MT AGAIN + +MTCHK2: AOSE MTREQ + PUSHJ PDP,MTWAIT + MOVE IOS,DEVIOS(DEVDAT) + TLZ IOS,IO ;CLEAR IUO INDICATION SO "REWCK" WILL WORK + PUSHJ PDP,MTCHK4 ;CHECK STATUS + JRST MTCHK2 ;GET MT AGAIN + +MTCHK4: TLO IOS,HASMT ;THIS JOB NOW HAS MTC + TLZE IOS,IOBEG ;FIRST OPERATION AFTER INIT OR SETSTS + + TLZ IOS,IUOSLIC ;YES, SET SLICE LEVEL TO 0. + TLZ IOS,IOREW ;CLEAR MAG TAPE REWINDING + PUSHJ PDP,REWCK ;CHECK IF REWINDING? + JRST TPOPJ ;NO - STATUS OK + JRST QSTAT ;QUERY STATUS + PUSHJ PDP,DETMDC ;REWINDING- DETACH MTC, DC AND TURN OFF + ;IODT AND HASMT + TLO IOS,IOREW ;SET DEVICE ACTIVE AND IN REWIND WAIT + PUSHJ PDP,ORACT + AOSG MTREWN ;ADD 1 TO REWIND WAIT COUNT + PUSHJ PDP,MTCLK ;PUT IN CLOCK REQUEST. + ;(NO OTHER UNITS IN REWIND WAIT) + + JRST WSYNC + +QSTAT: PUSHJ PDP,DETMDC ;DETACH MTC AND DC + JRST HNGSTP ;CHECK STATUS (PULL FINGERS OUT, ETC) + ;MTAPE 0 WAITS UNTIL THE CONTROL IS FREE +;THUS MTAPE 0 PROVIDES THE ONLY WAY FOR A USER TO WAIT UNTIL A SPACING OPERATION +; (I.E., SKIP, BACKSPACE, OR REWIND) IS COMPLETED. + +MTP0: PUSHJ PDP,MTCHK2 ;WAIT FOR CONTROL TO BECOME FREE, + ; THEN GIVE IT BACK IMMEDIATELY, + ; AND RETURN TO THE USER. + + +;DETMDC- +; DETACH MTC, AND TURN OFF HASMT. +; THEN (IFF IODT ON) +; TURN OFF IODT AND DETACH DC + +DETMDC: +MTHUNG: + TLZN IOS,HASMT ;THIS JOB HAS MTC? + JRST STOIOS ;NO + PUSHJ PDP,RELCON + SOSL MTREQ ;YES- ANYONE ELSE WAITING FOR IT? + SETOM MTAVAL ;YES- FLAG AS JUST BECOME AVAILABLE +DETDC: TLZN IOS,IODT ;DOES JOB HAVE DATA CONTROL? + JRST STOIOS ;NO- EXIT + CONO DC,0 + CONO PD,DCOFF + SOSL DCREQ ;ANYONE ELSE WAITING FOR IT? + SETOM DCAVAL ;YES- FLAG AS JUST BECOME AVAILABLE + JRST STOIOS ;AND EXIT + +RELCON: CONO 220,0 + CONO 224,0 + SETZM MTCCON + POPJ PDP, + ;ROUTINE TO SEE IF UNIT IS REWINDING +;CALL MOVE DEVDAT,ADDRESS OF DDB +; PUSHJ PDP,REWCK +; UNIT READY +; UNIT OFF OR WRITE LOCKED +; UNIT REWINDING + +REWCK: LDB TAC,PUNIT + ROT TAC,4 + CONO MTC,200(TAC) + CONO MTS1,SEL ;JAM UNIT INTO COMMAND BUFFER + CONSZ MTS1,20000 ;SKIP IF REWIND MOTION OFF + JRST CPOPJ2 ;RETURN TO CALL+2 IF TAPE REWINDING + TLNE IOS,IO ;OUTPUT ? + CONSO MTS1,200 ;YES-WRITE LOCKED ? + CONSO MTS1,2 ;NO-IS UNIT READY? + AOS (PDP) + POPJ PDP, ;YES- RETURN TO CALL+1 + +REPEAT 0,< +THIS WORKS WITH THE FOLLOWING MOD TO 545 TRANSPORT: + +DELETE 1023K TO ?? + +ADD 1B18H TO 1B08K REW(1)(GND) + 1B19S TO 1B08L FWD/LP(1)(GND) + 1B08N TO 1B23K (REW(1).OR.FWD/LP(1)) + +THIS MODE SETS IOP22(1) WHILE MAGTAPE IS REWINDING OR SPACING FORWARD +TO LOAD POINT- IF ENABLES THE PROCESSOR TO DISTINGUISH BETWEEN A +TAPE WHICH IS AT THE END OF A REWIND COMMAND, AND A TAPE WHICH IS +SWITCHED TO LOCAL, OR OFF> + ;WRITE +MTOUT: PUSHJ PDP,MTCHEK + TLO IOS,IO ;WRITING +MTOUT1: MOVEI TAC,@DEVOAD(DEVDAT) ;BUFFER ADDRESS, PROG INCLUDED + MOVN TAC1,1(TAC) ;-WD COUNT + HRL TAC,TAC1 ;-WD CMT,BUFFER + AOJG TAC,MTNOTI ;BUFFER+1, TEST FOR ZERO WORD COUNT +MTOUT2: MOVE TAC1,[BLKO DC,3400+MTDC*10] + MOVEI T,1000 ;WRITE +MTINDC: MOVEM TAC,MTDCCN ;BLKO POINTER + IORI TAC1,DCTCHN ;DC PI CHANNEL NO. + MOVEM TAC,DCWRD + HRRZM TAC1, MDCSAV ;SAVE DC COMMAND + HRRI TAC1,DCWRD + CONO PI,DCOFF ;TURN DC PI CHANNEL OFF + MOVEM TAC1,DCLOC ;BLK COMMAND + MOVE TAC1,JSR MTDCND] + MOVEM TAC1,DCLOC1 + TRO IOS,IOACT ;SET IOACT + MOVSI TAC, ERF ;ENABLE FOR EOR IF EOR FLAG NOT ON. + CONSZ 224,ERF ;END OF RECORD? + MOVSI TAC,XNC ;NO. COME BACK WHEN COMMAND BUFFER IS EMPTY + JRST MTGO1 + +CHKLOK: CONSO 224,200 ;WRITE LOCKED? + JRST MTGO0 ;NO, DO MTAPE + PUSHJ PDP,QSTAT + JRST CHKLOK + ;CLOSE OUTPUT + +MTCLSO: TLNN DEVDAT,OUTPB ;HAS ANB OUTPUT BEEN DONE? + POPJ PDP, ;NO. DON'T WRITE ON TAPE. + LDB TAC,PIOMOD ;DUMP MODE? + CAIGE TAC,16 + PUSHJ PDP,OUT ;NO. OUTPUT LAST PARIAL BUFFER + PUSHJ PDP,WAIT1 ;WAIT FOR OUTPUT TO FINISH +MWLEOT: MOVEI T,3 ;WRITE EOF + PUSHJ PDP, MTAPE + MOVEI T,3 ;WRITE EOF + PUSHJ PDP, MTAPE + MOVEI T,7 ;BSP + JRST MTAPE + +MTCINI: PUSHJ PDP,RELCON + SETOM MRTEWN ;SET CLOCK REQUEST COUNT TO -1 + JRST MTNIO1 + + +;BLK COUNTED OUT +IFE FTCHECK+FTMONP,< +MTDCND: 0 +> +MTDCN1: CONO PI,DCOFF ;SHUT OFF DC CHANNEL + CONSZ DC,10000 + SETOM MISSED + JEN @MTDCND + ;FLAG FROM TAPE CONTROL. SET UP BY INSERT MACRO +MTCINT: CONSO 224,@MTCCON + JRST . + JSR MTCSAV ;SAVE AC'S + HRRZ DEVDAT,MTDEV ;DVDB + LDB PROG,PJOBM; JOB NUMBER + MOVE PROG,JBTADR(PROG) + MOVE IOS, DEVIOS(DEVDAT) + CONSO 224,TCF ;TAPE CONTROL FREE + JRST MTEOR + XCT MTIDSP + JRST MTBSP ;AFTER BACKSPACE + JRST MTERR ;IF ERROR FOUND +MTPDUN: TLNN IOS,IODT + JRST MTNIO2 + LDB TAC,PIOMOD + CAIL TAC,16 + JRST DMPDUN ;DUMP + TLNE IOS,IO + JRST MTNOTI ;WRITING + SKIPF MTEOFF ;NOT EOF? + JRST MTEOF + MOVEI TAC,@DEVIAD(DEVDAT) ;BUFFER ADDRESS + MOVN TAC1,MTDCCN ;WD CNT-1 + AOBJ TAC1, .+1 ;WD CNT + HLLZS TAC1 ;CLR RT HALF + ADD TAC1,DCWRD ;ADD CURRENT COUNT=NO, OF WDS + HLRM TAC1,1(TAC) ;STORE AT WORD COUNT + PUSHJ PDP,ADVBFF + JRST MTEND1 ;NEXT BUFFER FULL + JRST MTCON ;CONTINUE MODE + +DMPDUN: TLNN IOS,IO + SKIPN MTEOFF + JRST MTEOF+1 + TROA IOS,IODEND + +MTEOF: TLO IOS,IOEND + SETZM MTEOFF ;CLEAR EOF FLAG + +;AND FALL INTO MTEND1 + MTEND1: PUSHJ PDP,DETDO ;DETACH DC (IF ASSIGNED) + PUSHJ PDP,ETCHK ;CHECK FOR END OF TAPE (FOR DUMP MODE OUT) + PUSHJ PDP,CLRACT + CONSO 224,TCF ;TAPE CONTROL FREE? + JRST MTION ;NO. WAIT FOR IT. +MTFIN: +MTNIO: TLZE IOS,IOW ;CLEAR WAIT + PUSHJ PDP,SETIOD + PUSHJ PDP,DETMOC ;DETACH MTC (IF HASMT SET) AND DC (IF IODT) + PUSHJ PDP,ETCHK ;CHECK FOR END OF TAPE + PUSHJ PDP,CLRACT ;RESTORE BITS,CLEAR IOACT + +;AND FALL INTO MTNIO1 + MTIO1: MOVN TAC,MTREDO ;REPEAT COUNTER + HRREM TAC,MTERCN + SKIPGE MTREWN ;IS ANY OTHER UNIT REWINDING AND + ;A SECOND COMMAND HELD UP? + POPJ PDP, ;NO, DISMISS INTERRUPT + +;SOME UNIT IS REWINDING AND HAS HAD ANOTHER COMMAND HELD UP. +;CHECK ALL UNITS + +EXTERNAL SETIOD + +MTREWW: SETOM MTREWN ;SET COUNT TO NO. UNITS IN REW WAIT + PUSH PDP,DEVDAT + MOVEI DEVDAT,MTCDDB ;GET BEGINNING OF MT DATA BLOCK CHAIN + +REWLP: MOVE IOS,DEVIOS(DEVDAT) + JUMPGE IOS,REW2 ;IS UNIT IN A REW WAIT? + PUSHJ PDP,REWCK ;YES,SEE IF FINISHED REW. + JRST .+3 ;HAS FINISHED + JRST REW1 ;OFF- LET HUNG LOGICA TAKE CARE OF IT + JRST REW2 ;STILL REWINDING + TDZ IOS,[XWD IOREW,IOACT];GET JOB OUT OF IO WAIT + TLZE IOS,IOW + PUSHJ PDP,SETIOD ;START JOB UP AGAIN + MOVEM IOS,DEVIOS(DEVDAT) + JRST REW2 + +REW0: PUSHJ PDP,STOIOS ;RESET HUNG COUNT IF STILL REWINDING +REW1: AOS MTREWN ;INCREMENT COUNT OF REW WAIT UNITS +REW2: HLRZ DEVDAT,DEVSER(DEVDAT) ;DEVDAT TO NEXT DDB + JUMPE DEVDAT,REW3 ;LAST ONE? + HRLZ DAT,DEVNAM(DEVDAT) ;NO,GET LH OF NAME + CAIN DAT,(SIZBIT /MTA/) ;STILL A MAGTAPE? + JRST REWLP ;YES, CONTINUE +REW3: POP PDP,DEVDAT + POPJ PDP, ;YES, DISMISS INTERRUPT OF RETURN TO MTC OK + +ETCHK: CONSZ MTS1,10000 ;EOT SEEN? + TRO IOS,IOIMPM+IOTEND ;YES-SET FLAGS + TDZ IOS,[XWD IOREW,IOBOT];NO LONGER REWINDING + CONSZ MTS1,24002 ;UNLESSS + TRO IOS,IOBOT ;IS REALLY REWINDING + POPJ PDP, ;EXIT + ;ROUTINE CALLED AT CLOCK LEVEL TO SEE IF ANY UNITS WHICH ARE IN A +;REW WAIT HAVE FINISHED REWIND. + +INTERNAL MTCLOK + +MTCLOK: SKIPGE MTREQ ;IS ANY JOB USING ANY UNIT NOW? + PUSHJ PDP,MTREWW ;NO, CHECK ALL MAG TAPE + ;UNITS TO SEE IF JUST FINISHED + ;REWINDING(WHICH WERE IN REW WAIT) + SKIPGE MTREWN ;YES,ARE ANY UNITS STILL IN REW WAIT? + POPJ PDP, ;NO, RETURN TO CLOCK ROUTINE WITHOUT + ;PUTTING IN CLOCK REQUEST + +;ROUTINE TO PUT IN A CLOCK REQUEST + +EXTERNAL JIFSC2 + +MTCLK: MOVEI TAC1,JIFSC2 ;CHECK EVERY HALF SECOND + HRLI TAC1,MTCLOK ;DISPATCH ADDRESS + + + CONO PI,400 ;TURN OFF PI + IDPB TAC1,CLOCK ;STORE CLOCK REQUEST + CONO PI,200 ;TURN ON PI + POPJ PDP, + MTNOTI: PUSHJ PDP,ADVBFE ;WRITING + JRST MTEND1 +MTCON: CONSZ 224,10000 ;END OF TAPE? + JRST MTEND1 ;YES - B/SP , EOF & EXIT + CONO DC,0 + TLZE IOS,IOW + PUSHJ PDP,SETIOD + MOVEM IOS,DEVIOS(DEVDAT) + MOVN TAC,MTREDO + HRREM TAC,MTERCN + TLNN IOS,IO ;INPUT OR OUTPUT? + JRST MTIN1 ;CALL INPUT SUBROUTINE + JRST MTOUT1 ;CALL OUTPUT SUBROUTINE +MTNIO2: HLRZ TAC,MTDEV ;COMMAND + ANDI TAC,7400 + CAIE TAC,3000 ;NO. SPACING ONE RECORD? + JRST MTNIO ;YES, EXIT + CONSZ 224, 400 ;EOF? + TDO IOS,[XWD IOSEOF,IODEND] + JRST MTNIO ;EXIT + MTEOR: MOVEI TAC,ERF + CONSO 224,ERF ;END OF RECORD FLAG ON? + JRST MTIGN1 ;NO. WAIT FOR IT. + CONSZ DC,1000 ;DATA MISSED + SETOM MISSED ;YES + CONSO DC,1600000 ;ANY CHARS. LEFT? + JRST MTEOR1 ;NO + MOVE T,DCWRD ;GET IOWD + TLNN IOS,IO ;O/P + SKIPE MISSED ;NO, DATA MISSED + JRST MTEOR2 ;YES + CONI DC,TAC1 ;FETCH DC STATUS BITS + LSH TAC1,-15 ;SHIFT CHARACTER COUNT TO LSBITS + IMULI TAC1,-6 ;-NO OF BITS TO FAR RIGHT + CONO DC,@MDCSAV ;?? IF DON SAYS SO, WELL, OK (JUST) + DATAI DC,TAC ;FETCH LAST PART-WORD OF DATA + CONO DC,0 ;SHUT DOWN DC + LSH TAC,44(TAC1) ;SHIFT LAST CHARACTERS TO LEFT END + JUMPG T,MTEOR1 + + AOBJN T,.+1 ;BUMP DATA POINTER + MOVEM TAC,(T) ;STORE LAST WORD + MOVEM T,DCWRD ;AND BUMPED POINTER + +MTEOR1: CONSZ 224,LPE!CPE!400100 ;IF END OF RECORD. CHECK + ;PARITY,DATA MISSED, AND ILLEGAL FLAG + JRST MTEOR2 ;IF ERROR CAUSED INTERRUPT TO + ;ERROR ROUTINE VIA TCF +MTECON: CONSZ 224, 400 ;EOF? + SETOM MTEOFF ;SET EOF FLAG + AOS MTBKCN(DEVDAT) ;COUNT NO. OF BLKS READ OR WRITTENE + ;INCLUDING RETRIES + JRST @MTIDSP ;YES. + +MTEOR2: SOS MTIDSP ;POINT TO ERROR ROUTINE + MOVEI T,0 + CONSZ MTS1,20 ;LONGITUDINAL PARITY ERROR? + TLO T,1000 ;YES, COUNT IN QUARTER 1 + CONSZ MTS1,10 ;LATERAL PARITY ERROR? + TLO T,1 ;YES, COUNT IN QUARTER 2 + CONSZ MTS1,400000 ;ILLEGAL OP? + TRO T,1000 ;YES, COUNT IN QUARTER 3 + CONSO MTS1,100 + SKIPF MISSFD ;DATA MISSED? + TRO T,1 ;YES, COUNT IN QUARTER 4 + ADDM T,MTECNT(DEVDAT);ADD TO ERROR COUNTS FOR THIS DRIVE + JRST MTECON ;CHECK EOF + MTERR: HLRZ TAC,MTDEV ;COMMAND + ANDI TAC,7400 + TRNE IOS,IONRCK + JRST MTERR2 + AOSLE TAC1,MTERCN + CAIL TAC1,3 + JRST MTERR2 + HLRZ TAC,MTDEV ;COMMAND + ANDI TAC,770377 + CONO 220,3400(TAC) ;BSP + SOS MTIDSP +MTIGN: MOVEI TAC,TCF +MTIGN1: CONO 224,(TAC) + HRRZM TAC,MTCCON + JRST MTCRET + +MTERR2: CONSO 224,400100 ;SET IODERR IF ILLEG OR MISSED CHAR FLAGS + SKIPE MISSED ;SET IODERR IF DATA MISSED + TRO IOS,IODERR + CONSZ 224,30 ;SET IODTER IF LONG OR LAT PARITY + TRO IOS,IODTER + JRST MTPDUN + +MTBSP: MOVE TAC,MTDCCN ;POINTER + MOVEM TAC,DOWRD ;RESET POINTER WORD + HLRZ TAC,MTDEV ;COMMAND + CONSO 224,XNC ;WAIT FOR XNC + JRST .-1 ;SHOULD ADD A COUNT(RUNAWAY TAPE TURNED OFF) + SKIPLE TAC1,MTERCN + JRST MTBSP3 +MTBSP2: TRO IOS,IOACT + HRLI TAC,ERF + JRST MTGO3 +MTBSP3: TRNN TAC,1000 ;READING + TRCA TAC,100000 ;YES-CHANGE SLICE LEVEL + TRNN TAC1,1 ;NO + JRST MTBSP2 + CONO 220,4400(TAC) ;WRITE BLANK TAPE + AOS MTERCN + JRST MTIGN + MTC=220 ;MAG TAPE CONTROL DEVICE NUMBER + +MTS1=224 ;MAG TAPE CONTROL STATUS REG 1 +XNC=40000 ;TRANSFER NEW COMMAND +MTDC=2 ;MAG TAPE DATA CONTROL DEVICE NO. +TCF=1 ;TAPE CONTROL FREE +ERF=4 ;END OF RECORD FLAG +LPE=20 ;LONG. PARITY ERROR +CRE=10 ;CHAR. PARITY ERROR +SEL=2 ;UNIT TO COMMAND BUFFER +IOSEOF=4000 ;SPACING ONE RECORD FORWARD FOUND EOF +IOTEND=2000 ;EOT INDICATION +IONRCK=100 ;DO NOT RE-TRY ON ERRORS +IOBOT=4000 ;TAPE AT LOAD POINT +IODT=10000 ;A 1 FOR A DATA TRANSFER TYPE COMMAND +IOSLIC=2000 ;A 1 IF SLICE LEVEL IS 1, OTHERWISE 0. +HASMT=4000 ;IF A 1, THIS JOB HAS THE MAG TAPE CONTROL +IOREW=40000 ;A 1 IF UNIT IS REWINDING AND ANOTHER OPERATIONS + ;IS ATTEMPTED ON SAME UNIT. MUST BE SIGN BIT. + +EXTERNAL ADVBFF,ADVBFE,DCREQ,MTCSAV,SETACT,CLRACT,ORACT,GETDCMT +EXTERNAL MTCRET, DCAVAL, MTAVAL, MTCCHN, MTREQ +EXTERNAL MTWAIT,OUT,SETIOD,CLOCK,HNGSTP,MTSIZ +EXTERNAL WSYNC,USRREL,WAIT1,ADRERR,PUNIT,PIOMOD,PJOBN +EXTERNAL JOBPD1,JOBSAV +EXTERNAL JBTADR,JOBPFI,STDENS,CPOPJ1,CPOPJ2,UUOERR +EXTERNAL DCTCHN,DCLOC,DCLOC1,DCOFF,DCON,STOIOS,TPOPJ + +INTERNAL MTCINT,DETMDC,DETDC + +IFN FTCHECK+FTMONP,< +EXTERNAL MTEOFF,MTDEV,MTDCCN,DCWRD,MDCSAV,MISSED,MTERCN +EXTERNAL MTREN,MTCMDP,SVCNTR,MTCCON,MTIOSP,MTOCND +INTERNAL MTDCN1,MTPDUN +> +IFE FTCHECK+FTMONP,< +;CONTROL DATA + +MTEOFF: 0 ;EOF FLAG +MTDEV: 0 ;XWD COMMAND,DEVICE DATA BLOCK +MTDCCN: 0 ;BLKI/O POINTER FOR REDO +DCWRD: 0 ;BLKI/O POINTER FOR DC +MDCSAV: 0 ;DC COMMAND +MISSED: 0 ;-1 IF DC CONTAINS PARTIAL WORD +MTERCN: 0 ;ERROR COUNTER +MTREWN: 0 ;NO. OF MAG TAPE UNITS-1 IN IO WAIT DOING REWINDS + ;BECAUSE THEY REQUESTED OTHER OPERATIONS BEFORE REW + ;FINISHED. -1 MEANS NONE, 0 MEANS 1 IN QUEUE +MTCMDP: 0 ;DUMP COMMAND LIST POINTER +SVCNTR: 0 ;DUMP COMMAND IOWD NEGATIVE WORD COUNT +MTCCON: 0 ;INTERRUPT FLAGS +MTIDSP: JRST MTPDUN + +> + ;LOGICAL EBND OF TAPE LOOP +MTLEOT: MOVEI T,7 ;BACKSPACE + PUSHJ PDP,MTAPC2 + PUSHJ PDP,MTCHK2 ;CALL INTERLOCK, PICKUP IOS + ;AFTER PREVIOS TASK FINISHED. +MTEOT2: MOVEI T,16 ;SAVE ONE FILE + PUSHJ PDP,MTAPE2 + MOVEI T,6 ;SPAVE ONE RECORD + PUSHJ PDP, MTAPE + PUSHJ PDP,MTCHK2 ;CALL INTERLOCK, RETURN WHEN + ;SPACING FINISHED WITH NEW IOS + TLNN IOS, IOSEOF ;WAS EOF DETECTED? + JRST MTEOT2 ;NO, RESUME SPACING. + MOVEI T,7 ;PREPARE FOR BACKSPACE MTAPE + JRST MTAPE2 ;BACKSPACE, LOGICAL EOT FOUND + ;RETURN TO MAKE PROGRAM +MTREDO: 12 ;NUMBER OF TIUMES TO RE-EXECUTE + ;DEVICE DEPENDENT DUMP MODES, MODE 16. +;OUTPUT +MTDMPO: PUSH PDP,UUO +MTDPO1: PUSHJ PDP,MTCHEK ;IS SYSTEM AVAILABLE + TLO IOS,IO ;WRITING + PUSHJ PDP,SAVCHK + MOVE TAC1, @MTOUT2 ;BLKO AND DATA CONTROL COMMAND + MOVEI T,1000 ;WRITING COMMAND +MTDMP1: HTLI TAC, PROG ;ACTUAL ADDRESS OF COMMAND LIST + MOVEM TAC, MTDUMP ;COMMAND POINTER + SKIPN TAC,@TAC ;COMMAND WORD + JRST MTEND1 + JUMPG TAC, MTDMP1 ;CHANGE COMMAND SEQUENCE + HLREM TAC, SVCNT ;SAVE COUNTER + HRRZS TAC ;GET ADDRESS ALONE + CAMGE TAC,AC1 + JRST MTDMP2 + SUB TAC, SVCNTR ;GET LAST ADDRESS + CAMLE TAC, USRREL ;LESS THAN END? + JRST MTDMP2 ;OUT OF BOUNDS + MOVE TAC, @MTCMDP ;PICK UP POINTER AGAIN + ADDI TAC,(PROG) ;GET ACTUAL ADDRESS + AOS MTCMDP + PUSH PDP,MTCMDP + PUSHJ PDP,MTINDC ;MOVE TAPE + PUSHJ PDP,WAIT1 + TLNN IOS, IO ;WRITING? + JRST MTDPI1 ;READING + LDB AC2,PIOMOD ;GET MODE + CAIE AC2,2 + JRST MTDPO1 + PUSHJ PDP,MWLEOT + PUSHJ PDP,MTCHK2 + JRST MTEND1 + +SAVCHK: MOVEI AC1,JOBPFI + MOVE TAC,JOBPD1(JDAT) + TLNN TAC,USRMOD + MOVEI AC1,JOBSAV + POP PDP,TAC1 + POP PDP,TAC + JRST (TAC1) +;INPUT +MTDMPI: PUSH PDP,UUO +MTDPI1: TRNE IOS,IODEND + JRST TPOPJ + PUSHJ PDP,MTCHECK + TLZ IOS,IO ;READING + PUSHJ PDP,SAVCHK + MOVE TAC1,@MTIN2 ;BLKI AND DATA CONTROL COMMAND + MOVEI T,2400 ;READ COMMAND + JRST MTDMP1 ;DUMP +;ADDRESS ERROR +MTDMP2: PUSHJ PDP,MTEND1 + JRST ADRERR + + END + diff --git a/src/nulseg.mac b/src/nulseg.mac new file mode 100644 index 0000000..adbdfa3 --- /dev/null +++ b/src/nulseg.mac @@ -0,0 +1,119 @@ +TITLE NULSEG - DUMMY HIGH SEGMENT ROUTINES FOR MACHINE WITH JUST ONE REG - V406 +SUBTTL T.HASTINGS/TH TS 2 JUNE 69 +XP VNULSG,406 + ;PUT VERSION NUMBER IN LOADER STORAGE MAP AND GLOB LISTING + + ENTRY NULSEG +NULSEG: ;ENTRY POINT SYMBOL TO CAUSE LOAD OF NULSEG IF REQUIRED + ;(IE INSTEAD OF SEGCON OR NEITHER) + +;INITIALIZE LOC TWOREG TO 0(FLAG SOFTWARE OR HARDWARE ONLY 1 REG CAPABILITY) +;AND1 AND2RG EXECUTED FROM ONCE AFTER HARDWARE EXAMINED FOR 2 REG CAPABILITY. + + INTERN AND2RG + +AND2RG=0 ;FLAG SYSTEM DOES NOT HAVE 2 REG. CAPABILITY + ;SINCE AT LEAST SOFTWARE DOES NOT BECAUSE THIS DUMMY + ;ROUTINE LOADD + +;CLOCK1 + + INTERN SETHGH + +SETHGH: TLZ PROG,1777 ;CLEAR OUT PROTECTION FOR HIGH SEG IN CASE THIS + POPJ PDP, ;IS A 2 REG MACHINE + +XP CHGHGH,R0 ;CHARGE CURRENT USER FOR HIGH SEG + +;COMCSS + +XP PRTHGH,R0 ;PRINT HIGH SEG CORE +XP ASGHGH,R0 ;CLEAR HIGH SEG NAMES ON ASSIGN COMMAND +XP CHKMED,R0 ;CHECK FOR MEDDLING +XP ANYSAV,R1 ;NAY JOB DOING A SAVE INVOLVING HIGH SEG? + ;CORE1 + +XP HGHDEP,R0 ;DEPOSIT HIGH SEG(ERROR) +XP KILHGH,R0 ;REMOVE HIGH SEG FROM LOGICAL ADR SPACE +XP UREMAP,R0 ;REMAPO UUO +XP CURHGH,R0 ;CHANGE RELOC HARD IF CURRENT USER AFFECTED +XP FRECOR,R0 ;FREE CORE IN NON-SWAP SYSTEMS +XP FRECR1,R1 ;FREE CORE IN SWAPPING SYSTEMS + + INTERN UCORHI,SUMSEG + EXTERN CORMAX,USRREL + +UCORHI: CAMLE TAC,USRREL ;TRYING TO ASSIGN CORE TO HIGH SEG? + POPJ PDP, ;YES, ERROR RETURN + ; NO, GIVE OK RETURN +SUMSEG: CAMGE TAC,CORMAX ;ARG GE MAX LENGTH (HIGHEST+1)? +R1: AOS (PDP) ;NO, GIVE OK RETURN +R0: POPJ PDP, ;YES, GIVE ERROR RETURN + +;ERRCON + +XP SEGILM,R1 ;WILD TRANSFER RETURN + +;SAVGET + +XP SETEXT,R0 +XP SETEX1,R0 +XP SAVDDL,R0 ;DIDDLE RELOC, DURING DUMP MODE O/P FOR HISEG + + INTERN UGETHI + EXTERN UGTERR + +UGETHI: JRST UGTERR ;ERROR RETURN TO USER UNLESS HALT IN LH OF UUO+1 + + INTERN SAVHGH,GETHGH + EXTERN SGERRA,SGAMOD,SG3 + +SAVHGH: +GETHGH: OPEN 0,SGAMOD ;TRY TO INIT DEVICE + JRST SGERRA ;ERROR + AOS (PDP) ;SKIP RETURN + JRST SG3 ;AND GO SETUP LOWER CORE + ;SWAP + + INTERN FTSWAP + +IFN FTSWAP,< +XP FININ,R1 ;FINFISH SWAPPING IN +XP FINOT,R1 ;FINISH LOW SEG OUTPUT - NOTHING MORE TO DO +XP FORSIZ,R0 ;SIZE OF JOB FREED UP +XP FRESWP,R1 ;FREE DISK SPACE - NO DORMANT SEG FOUTND RETURN +XP FITHGH,R0 ;CHECK IF HISEG BEING SWAPPED IN + + INTERN FITSIZ + EXTERN CORTAL + +FITSIZ: CAMG AC1,CORTAL ;WILL LOW SET FIT IN CORE? + AOS (PDP) ;YES, SWAP HIM IN + POPJ PDP, ;NO, MUST SWAP SOMEONE ELSE OUT FIRST + + INTERN FORHGH + EXTERN JBTSTS + +FORHGH: MOVSI TAC,SHF ;STOP IO AFTER NEXT BUFFERFUL IF ACTIVE + IORM TAC,JBTSTS(ITEM) ;CHECKED BY ADVBFF,ADVBFE ROUTINES + POPJ PDP, +> + +;SYSINI + +XP SEGINI,R0 ;INITIALIZE HIGH SEGS + +;UUOCON +XP RELSEG,R0 ;SUPERCEDE HIGH SEGS ON RECREATE +XP RELSG1,R1 ;RENAME UUO +XP HGHWRD,R0 ;GET WORD FROM HIGH SEG - ERROR RETURN +XP HRESET,R0 + + INTERN USTUWP + EXTERN RTZER + +USTUWP: JRST RTZER + +XP HGHWRD,R0 ;GET WORD FROM HIGH SEG -ERROR +XP USPY,R0 ;SPY UUO - ERROR + END diff --git a/src/onceb.mac b/src/onceb.mac new file mode 100644 index 0000000..9fa9d75 --- /dev/null +++ b/src/onceb.mac @@ -0,0 +1,1749 @@ +IFE FTDISK+FTRC10+2,< +TITLE ONCEB - ONCE ONLY OPERATOR DIALOGUE AND IO DEVICE INIT.(BURROUGHS DISK) +> +IFE FTDISK+FTRC10+1,< +TITLE ONCED - ONCE ONLY OPERATOR DIALOGUE AND IO DEVICE INIT.(DATA PRODUCTS DISK) +> +IFE FTDISK+FTRC10+0,< +TITLE ONCEN - ONCE ONLY OPERATOR DIALOGUE AND IO DEVICE INIT.(NO DISK) +> +SUBTTL T. HASTINGS/RCC/CHW TS 04 JUN 69 V414 +XP VONCE,414 + ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP + +INTERNAL FTRC10 ;THIS SINGLE SOURCE FILE MAY BE ASSEMBLED FOR EITHER + ; THE NEW PDP-10 (BURROUGHS) DISK, OR THE OLD PDP-6 (DATA + ; PRODUCTS) DISK (FTRC10 = -1 OR 0, RESPECTIVELY, IN S). + +;"ONCE" SHOULD BE THE LAST LOADED PROGRAM BEFORE SYSMAK AND DDT +;THUS IF IT OVERFLOWS INTO THE USER AREA NO HARM IS DONE. + +;ONCE ONLY CODE IS DIVIDED INTO 3 PARTS +; 1. MANDITORY ONCE ONLY(LINKSR) - NO CTY NEEDED +; (GOOD REPEATED STARTUPS DURING DEBUGGING +; 2. USUAL SHROT ONCE ONLY CODE(ONCE) - CTY FOR DATE AND TIME +; 3. OPTIONAL ONCE ONLY CODE - CTY DIALOG TO CHANGE MONITOR +; OR REFRESH DISK(ALT-MODE INSTEAD OF CR AFTER TIME) + +;INITIALIZE PRIORITY CHANNELS AND SETUP INTERRUPT SERVICE ROUTINE CHAIN + +T=TAC ;DEFINE ACCUMULATOR T + +;LINK TO SERVICE ROUTINES + +INTERNAL LINKSR,FT2REL +EXTERNAL JOBSYM,JOBPFI,XJBPFI + +LINKSR: 0 ;CALLED WITH JSR FROM SYSINI + MOVSI T,JOBPFI ;SET LH OF XJBPFI WITH JOBPFI + MOVEM T,XJBPFI ;LOADER DORES NOT HANDLE GLOBALS IN LH +IFN FT2REL,< + JSP TSTREG ;GO TEST IF TWO RELOC REGISTERS EXIST +> + + ;HIGHEST LOC. IN JOB AREA PROTECTED FROM IO + +;MOVE SYMBOL TABLE UP IN MEMORY +;EXEC MUST BE LOADED IN 15K OR LESS IF GOING INTO 16K MACHINE +;FIRST FIND THE FIRST LOCATION OF NON-EXISTENT MEMORY + + EXTERN DDTSYM + + SETZB DAT,IOS ;(ACCUMULATOR IOS MUST ALSO BE CLEARED FOR SCNSER) + CONO APR,NXM ;CLEAR NON-EX MEM FLAG + MOVEI TAC,^D256 ;IN CASE MEMORY HAS NO NON EXISTANT BANKS + ADDI DAT,2000 ;TRY NEXT 1K BLOCK + MOVE TAC1,(DAT) ;REFERENCE THIS LOCATION + CONSO APR,NXM ;NON-EXISTENT? + SOJG TAC, .-3 ;NO,KEEP LOOKING AS LONG AS NOT TOP OF MEMORY + SUBI DAT,700 ;MAKE ROOM FOR TENDUMP AT TOP OF CORE + ; (DDTSYM=36) WHERE EXEC DDT EXPECTS IT. + ; IF NOT ALREADY MOVED THERE. RETURN POINTER IN UUO + HLRE TAC1,UUO ;-LENGTH OF S. T. + ;NOTE THAT THE SYMBOL TABLE POINTER IS MOVED FROM + ; JOBSYM(JDAT) TO DDTSYM(JDAT) BY SYSMAK WHEN THE SYSTEM + ; IS FIRST CREATED. + JUMPE TAC1,JRSTI1 ;0 IF NO S. T. TO MOVE UP + MOVNS TAC1 ;+LENGTH + HRRZ TAC,UUO ;FIRST ADDRESS + ADDI TAC,(TAC1) ;LENGTH+FIRST ADDRESS + HRL TAC,TAC1 ;XWD LENGTH,LENGTH+FIRST ADDRESS + SUBI DAT,1(TAC) ;NEW LAST+1-OLD LAST+1 + HRRM DAT,STO1 ;DIST, TO MOVE + MOVE TAC1,UUO ;L-N,FIRST ADD. + ADDI TAC1,1(DAT) ;FROM NEW S.T. POINTER + MOVEM TAC1,DDTSYM ;STORE IN LOWER CORE + MOVE TAC1,-1(TAC) +STO1: MOVEM TAC1,.(TAC) + SUB TAC,[XWD 1,1] + JUMPGE TAC,.-3 + + EXTERN DEVLST,INTNUM,INTTAB +;SETUP LOCATIONS 40 THRU 61 + +JRSTI1: MOVE TAC,[XWD LOC40,40] ;SET UP LOWER CORE PI LOCATIONS + BLT TAC,61 + +;LINK DEVICE SERVICE ROUTINES TOGETHER - IF NOT LOADED BY BUILD + + SKIPE DEVLST ;HAS SERVICE ROUTINES ALREADY BEEN CHAINED TOGETHER? + JRST ALRCHN ;YES, MUST HAVE BEEN LOADD WITH BUILD + MOVSI TAC,INTNUM ;NO, NEG. NO. OF SERVICE ROTUINES*2 +INTLOP: HLRZ DAT,INTTAB(TAC) ;GET NEXT PI NUMBER + ANDI DAT,7 ;MASIC OUT NUMBER OF DDB'S + LSH DAT,1 ;SHIFT LEFT ONE SO MATCH PI LOCATIONS + JUMPE DAT,NOPICH ;DOES THIS DEVICE HAVE A PI CHANNEL (PTY)? + MOVE DAT,ITEM ;YES, PICK UP JSR CH'N FROM LOWER CORE +INTLP1: MOVE DAT,ITEM ;SAVE IT IN DAT (EITHER A JRST DEV'NT OR + ; JEN @CH'N + MOVE ITEM,1(DAT) ;PICK UP INSTR. FOLLOWING INTERRUPT CONSO + + TLNN ITEM,00740 ;IS IT A JEN? + JRST INTLP1 ;NO, KEEP LOOKING + MOVE TAC1,INTTAB(TAC) ;YES, LAST DEVICE SO FAR, GET DEV'NT + HRLI TAC1,(JRST) ;MAKE JRST INSTR. + MOVEM TAC1,1(DAT) ;CHANGE JEN @CH'N TO JRST DEV'NT + MOVEM ITEM,1(TAC) ;MAKE DEV'NT+1 BE JEN @CH'N +NOPICH: AOBJN TAC,.+1 ;PICKUP EVERY OTHER WORD? + AOBJN TAC,INTLOP ;ANY MOVE INTERRUPT SERVICE ROUTINES? +ALRCHN: +IFN FTDISK,< + +;INITIALIZE DISK + + EXTERN NULPDL,DSKINI + + MOVEI PDP,NULPDL + PUSHJ PDP,DSKINT ;INITIALIZE THE DISK + ; AFTER SETTING UP CHANNEL LOC + ; BUT BEFORE OVERWRITTING ONCE WITH DDB'S +> + MOVE TAC,JRSTI + MOVEM TAC,LINKSR+1 ;DO ONCE ONLY + SKIPN DEVLST ;HAVE DEVICE DATA BLOCKS BEEN LINKED? + JRST LINKDB ;NO, GO LINK DATA BLOCKS + ;RETURN @LINKSR + ;MULTIPLE DEVICE DATA BLOCKS ARE CREATED + ;AS SPECIFIED BY SYSSIZ AND MAY ERASE PART + ;OF ONCE ONLY CODE +JRST1: JRST @LINKSR ;YES,RETURN + +EXTERN UUO0,ERROR,UUO2,LINKDR,DEVLST +EXTERN CH1,CH2,CH3,CH4,CH5,CH6,CH7 + +LOC40: 0 ;UUO PC +INTERNAL UUOTRP +UUOTRP: JSR UUO0 ;TO UUO HANDLER + JSR CH1 + JSP DAT,ERROR + JSR CH2 + JSP DAT,ERROR + JSR CH3 + JSP DAT,ERROR + JSR CH4 + JSP DAT,ERROR + JSR CH5 + JSP DAT,ERROR + JSR CH6 + JSP DAT,ERROR + JSR CH7 + JSP DAT,ERROR + 0 ;LOC 60/61 TRAPPED TO FOR UNIMPLEMENTED OP CODES ON PDP-10 + ;OP CODE 100 IS USED TO DISMISS USER MODE INTERRUPTS(SEE TRPSET UUO) + JSR UUO2 ;GO SEE IF OP CODE 100 OR SOME OTHER ONE + +IFN FT2REL,< +;SET LOC TWOREG TO -1 IF MACHINE HAS TWO RELOC REG,0 IF ONLY ONE RELOC REG + EXTERN TWOREG,SEGN,SEGPTR,AND2RG,JOBN + +TSTREG: 0 + MOVE TAC,[JSR TSTAPR] ;REPLACE UUO JSR WIT A JSR HERE IN ONCE + MOVEM TAC,41 + CONO APR,ILM!1 ;TURN ON PI & ASSIGN ILM FLAG + ;FOR POSSIBLE ILLEGAL MEMORY REF BELOW + MOVEM TAC,42 ;PUT A JSR IN CHAN 1 INT. LOC. + CONO PI,12300 ;CLR PI SYSTEM, ACTIVATE PI SYSTEM. TURN ON CHAN 1 + DATAO APR,[XWD 376776,000400] ;SET LOW AND HIGH SEG TO 128K LONG + ; EACH STARTING AT ABS LOC 0 + ; RELOC. FOR HIGH SEG IS 400000 TO DO THIS + JRST 1,.+1 ;ENTER USER MODE .+1 + MOVE TAC,400100 ;TRY TO REFERENCE REL LOC 100 IN HIGH SEG + ; AVOID SHADOW ACS WHICH LIKELY HAVE BAD + ;PARITY CAUSED BY POWER TURN ON AND TURN OFF + MOVEI 17,400000 ;MOVE HARDWARE ACS INTO SHADOW ACS TO CLEAR PARITY + ;IF HARDWARE ACS TURNED OFF, ACS WILL BE PRESERVED + BLT 17,400017 ;STOP WITH SHADOW AC 17 + CALL ;COME BACK TO EXEC MODE AT TSTAPR + +TSTAPR: 0 ;PLACE TO SIDE JSR PC + SETZM TWOREG ;ASSUME NO SECOND REG. + CONSO APR,ILM ;WAS MEMORY REF OUT OF BOUNDS? + SETOM TWOREG ;NO, MUST HAVE SECOND REG. HARDWARE, SET -1 + CONO APR,ILM ;CLEAR APR FLAGS AGAIN + MOVEI TAC,AND2RG ;=0 IF SOFTWARE CANNOT HANDLE 2 SEG(NULSEG LOADED) + ANDM TAC,TWOREG ;=-1 IF IT CAN(SEGCON LOADED) + ;TWOSEG SET TO AND OF SOFTWARE AND HARDWARE CAPABILITES + MOVNI TAC,SEGN ;SET LH OF POINTER TO FIRST SEG IN JBTXX TABLES + HRLI TAC,JOBN ;SET RH OF POINTER TO FIRST HIGH SEG + ;THIS MUST BE DONE HERE BECAUSE SEGPTR APPEARS IN FIRST + ; WHICH BUILD FORBITS FROM HAVING EXTERNALS + MOVSM TAC,SEGPTR ;POINTER USED FOR AOBJN LOOPS + CONO PI,10000 ;CLEAR PI SYSTEM + JRST @TSTREG +> + +;ROUTINE TO FIND THE EXEC DDT SYMBOL TABLE POINTER AND MOVE IT TO THE PLACE +;WHERE EXEC DDT EXPECTS IT(DDTSYM=36) +;THE MONITOR CAN BE LOADED IN ANY OF 3 WAYS(IN ORDER OF PERFERNCE): +; 1. UNDER TIME SHARING WITH REGULAR LOADER AND COMMON +; 2. UNDER REGULAR 10/30 MONITOR WITH REGULAR 10/30 LOADER AND COMMON +; 3. UNDER SPECIAL 10/30 MONITOR(SPMON) WITH BUILD + +;THE 3 WAYS LEAVE DDTSYM(36),JOBSYM(116),T30SYM(131) IN DIFFERENT STATES: +; DDTSYM(36) JOBSYM(116) T30SYM(131) +; 1. JUNK S.T.PTR JUNK +; 2. JUNK JUNK(NON-NEG) S.T.PTR +; 3. S.T.PTR S.T.PTR JUNK + +;CALL: JSP MOVSTP +; RETURN WITH AC UUO SET TO SYMBOL TABLE POINTER +;CALLED FROM MANDATORY ONCE ONLY CODE AND 141 START CODE(WHICHEVER OCCURS FIRST) + + INTERN MOVTP + EXTERN T30SYM,JOBSYM,DDTSYM,DDTX,SYSDDT + +MOVSTR: 0 ;JSR HERE FROM MANDATORY ONCE ONLY CODE AND + ; FIRST JUMP TO EXEC DDT IF BEFORE MONITOR STARTED +MOVJMP: JRST .+1 ;PATCHED TO SETUUO AFTER FIRST EXECUTION + MOVE UUO,T30SYM ;ASSUME LOADED BY REGULAR 10/30 + SKIPL JOBSYM ;OR IS JOBSYM NEGATIVE(MEANING IT IS S.T.PTR)? + JRST REGT30 ;WAS LOADED BY REGULAR 10/30 + MOVE UUO,JOBSYM ;ASSUME LOADED BY TIME SHARING MONITOR AND LOADER + SKIPE DEVLST ;OR HAS BUILD PATCHED THE DDB CHAIN? + MOVE UUO,DDTSYM ;YES, DDTSYM HAS SYMBOL TABLE POINTER AS STORED + ; BY SPMON +REGT30: MOVEM UUO,DDTSYM ;STORE THE SYMBOL TABLE POINTER FOR EXEC DDT + MOVEI TAC,DDTX ;MAKE SYSTEM STARTUP LOC(141) GO DIRECTLY TO EXEC + ; DDT AND BY PASS THIS FOOLISHNESS + HRRM TAC,SYSDDT + MOVEI TAC,SETUUO ;MAKE SURE THIS IS DONE ONLY ONCE + HRRM TAC,MOVJMP +SETUUO: MOVE UUO,DDTSYM ;RETURN THE CORRECT(MAYBEUPDATED IF + ; EXEC DDT PATCHES MADE BEFORE MONITOR SAVED OR + ; STARTED) SYMBOL TABLE POINTER + JRST @MOVSTR ;RETURN + +;HERE IF EXEC DDT IS STARTED UP BEFORE MONITOR(TO MAKE A PATCH FOR EXAMPLE) + + INTERN PATSYM + EXTERN DDTX + +PATSYM: JSR MOVSTP ;MOVE DDT SYMBOL TABLE POINTER SO EXEC DDT WILL + ; FIND IT AND PATCH 141 TO GO DIRECTLY TO EXEC DDT + JRST DDTX ;AND GO DIRECTLY TO EXEC DDT + +IFN FTRC10, < +ENTRY RCXWNZ ;THIS SYMBOL IS SOLELY TO PERMIT THE SYSTEM +RCXWNZ: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE. +INTERNAL ONCE +> +IFE FTRC10, < +ENTRY ONCE +> + +EXTERNAL CONMES,RADX10,CRLF,DECIN1,OCTPNT +EXTERNAL CONFIG,SYSDAT +INTERN FTTTYSER +IFE FTTTYSER,< + DEFINE SETTYO + DEFINE TYPE + + DEFINE NEXTC > +IFN FTTTYSER,< + DEFINE SETTYO + DEFINE TYPE + DEFINE NEXTC +EXTERN TSETBF,SETBFI,SCNDDB,TTIBUF,TTOBUF,OUTCHS,GETCHR,TIBF,TOBF +> + + INTERN PATSIZ + EXTERN PATCH + +ONCE: 0 +PATSIZ: MOVEI TAC,PATCH ;SET SIZE OF SYSTEM TO BEGINING OF PATCH + MOVEM TAC,SYSSIZ ;IN CASE ONCE ONLY DIALOG RESTARTD BEFORE OVERWRITTEN + + ;PATSIZ SHOULG BE UPDATED EVERY TIME A PATCH + ; IS MADE. SYSSIZ SHOULD ALSO BE UPDATED IF 146 + ; START IS GOING TO BE USED(DDT DEBUGGIN OR CTY DOWN) + + MOVE PDP,[XWD -ONCEPN,ONCEPD] + SETTYO + PUSHJ PDP,CRLF + MOVEI TAC,CONFIG + PUSHJ PDP,CONMES + MOVEI TAC,[ASCIZ / /] + PUSHJ PDP,CONMES + MOVEI TAC,SYSDAT + PUSHJ PDP,CONMES + MOVEI TAC,TSEXEC + PUSHJ PDP,CONMES + PUSHJ PDP,OPOUT + + +;ASK FOR TODAY'S DATE AND CONVERT +;DATE STORED AS ((Y-64)*12.+M-1)*31.+D-1 + +EXTERNAL THSDAT,JUFMIN,SKIPS + + PUSHJ PDP,DATLOP + JRST .-1 +DATLOP: SETZM THSDAT + MOVEI TAC,TODATE + PUSHJ PDP,ICONM + PUSHJ PDP,OPOUT + PUSHJ PDP,GETLIN + JRST DATLOP + PUSHJ PDP,SKIPS + PUSHJ PDP,DECIN1 ;MONTH + JRST DATLOP + JRST DATLOP ;ERROR + SKIPE TAC1 + CAILE TAC1,^D12 + JRST DATLOP + SUBI TAC1,1 + IMULI TAC1,^D31 + ADDM TAC1,THSDAT + NEXTC + PUSHJ PDP,DECIN1 ;DAY + JRST DATLOP + JRST DATLOP + SKIPE TAC1 + CAILE TAC1,^D31 + JRST DATLOP + SUBI TAC1,1 + ADDM TAC1,THSDAT + NEXTC + PUSHJ PDP,DECIN1 ;YEAR + JRST DATLOP + JRST DATLOP + CAIL TAC1,^D69 + CAILE TAC1,^D99 + JRST DATLOP + SUBI TAC1,^D64 ;YEAR ZERO + IMULI TAC1,^D12*^D31 + ADDM TAC1,THSDAT + + +;GET TIME OF DAY + +EXTERNAL TIME + + POP PDP,TC + PUSHJ PDP,TIMLOP + JRST .-1 +TIMLOP: SETZM TIME + MOVEI TAC,TIMEM + PUSHJ PDP,IOCONM + PUSHJ PDP,OPOUT + PUSHJ PDP,GETLIN + JRST TIMLOP ;JUST A CR + PUSHJ PDP,SKIPS + PUSHJ PDP,DECIN1 ;READ THE TIME (1-4 CHARACTERS) + JRST TIMLOP ;NO ARGUMENT + JRST TIMLOP ;ILLEGAL CHARACTER + MOVE TAC,TAC1 + IDIVI TYAC,^D100 ;TAC=HRS.TAC1=MINS + + SKIPL TAC ;HRS NEGATIVE? + CAILE TAC,^D23 ;OR .G. 23? + JRST TIMLOP ;OUT OF BOUNDS + CAILE TAC1,^D59 ;MINUTES .G. 59 + JRST TIMLOP ;OUT OF BOUNDS + IMULI TAC,^D60 ;CONVERT TO MINUTES + ADD TAC,TAC1 ;MINUTES SINCE MIDNIGHT + IMULI TAC,JIFMIN ;JIFFIES SINCE MIDNIGHT + MOVEM TAC,TIME ;TIME=JIFFIES SINCE MIDNIGHT + + JUMPGE ITEM,QUICK ;SKIP NEXT PART OF DIALOGUE UNLESS THE LAST ITEM + ; TYPED IN (NAMELY TIME OF DAT) WAS TERMINATED BY + ; AN "ALT MODE". (ACCUMULATOR "ITEM" IS SET UP + ; IUN THE "GETLIN" SUBROUTINE CALLED ABOVE.) + + +;PRINT IO CONFIGURATION + +EXTERNAL DEVLST,TCONLN,INLMES,PRENAME,INTTB1,INTTAB +EXTERNAL OCTPNT + +IFN FT2REL,< + JSR TSTREG ;TEST IF 2 RELOC REG SET TWOSEG 0 OK-1 + MOVEI TAC,CRLFMS ;PRINT CRLF + PUSHJ PDP,ICONM + MOVEI TAC,1 ;ASSUME 1 + SKIPE TWOREG + MOVEI TAC,2 + PUSHJ PDP,RADX10 ;NO. SECOND REG EXISTS. + PUSHJ PDP,INLMES + ASCIZ /RELOC. REG. +/ + PUSHJ PDP,OPOUT +> + MOVEI TAC,IOCONF + PUSHJ PDP,IOCNM + HLRZ AC1,DEVLST + JUMPN AC1,ALRLNK ;DEVICE DATA BLOCK ALREADY LINKED? + MOVESI PROG,INTNUM ;NO, NOT LOADED BY BULD,-NO. OF DEVICES*2 +CONFLP: SKIPN AC1,INTTB1(PROG) ;INT LOC HAVE DEV DATA BLOCK? + JRST NODDB ;NO, GO GET NEXT DEVICE DATA BLOCK + LDB UUO,[POINT 8,INTTAB(PROG),8] ;YES. NO. OF DEV DATA BLKS + HRRZ TAC,UUO ;PRINT + PUSHJ PDP,RADX10 ;IN DECIMAL + PUSHJ PDP,INLMES ;PRINT 1 SPACE + ASCIZ / / + HLLZ TAC1,DEVNAME(AC) ;DEVICE NAME + PUSHJ PDP,PRNAME ;PRINT IT + SOJLE UUO,SINGLE ;IS THIS JUST A SIGNLE DEVICE? + PUSHJ PDP,INLMES ;NO, APPEND 'S TO DEVICE NAME + ASCIZ /'S/ +SINGLE: PUSHJ PDP,CRLF ;PRINT CR LF +NODDB: AOBJN PROG,.+1 ; + AOBJN PROG,CONFLP ;FINISHED ALL DEVICES? + JRST ONCE7A ;YES +ALRLNK: +ONCE5: MOVEI TAC,1 + HLLZ ITEM,DEVNAM(AC1) +ONCE4: HLRZ AC1,DEVSER(AC1) + JUMPE AC1,ONCE6 + HLLZ TAC1,DEVNAM(AC1) + CAMN TAC1,ITEM + AOJA TAC,ONCE4 +ONCE6: MOVE PROG,TAC ;SAVE NO. + PUSHJ PDP,RADX10 + MOVEI CHREC," " + TYPE + MOVEI UUO,3 + MOVE TAC,[POINT 6,ITEM] +ONCE7: ILDB CHREC,TAC + ADDI CHREC,40 + TYPE + SOJG UUO,ONCE7 + MOVEI TAC,[ASCIZ /'S/] + CAILE PROG,1 + PUSHJ PDP,CONMES + PUSHJ PDP,CRLF + JUMPN AC1,ONCE5 +ONCE7A: PUSHJ PDP,OPOUT + MOVEI TAC,CRLFMS + PUSHJ PDP,ICONM + MOVEI TAC,TCONLN ;PRINT NO, OF TTY SCANNER LINES + PUSHJ PDP,OCTPNT + PUSHJ PDP,INLMES + ASCIZ / (OCTAL) TTY SCANNER LINES +/ + PUSHJ PDP,OPOUT + +;ASK FOR OPERATORS CONSOLE TO BE SPECIFIED + +EXTERNAL INLMES,DEVOPR,CTEXT,DEVPHY + +ONCEOP: MOVEI TAC,OPRM + PUSHJ PDP,ICONM + PUSHJ PDP,OPOUT + PUSHJ PDP,GETLIN + JRST ONCE8 ;JUST CR + PUSHJ PDP,CTEXT + MOVE TAC,TAC1 + CAMN TAC,[SIXBIT /CTY/] ;CTY? + JRST .+3 ;YES. JUST STORE IT. + PUSHJ PDP,DEVPHY + JRST ONCEP ;PHYSICAL NAME NOT FOUND + MOVEM TAC,DEVOPR ;SET FOR SYSTEM + ;DEVICE "OPR" WILL BE SAME AS THIS + +;ASK IF SYSMAK IS WANTED + + EXTERN MAKEND,SYSSIZ + +ONCE8: MOVEI TAC,SYSM + PUSHJ PDP,YESNO + JRST ONCE2 ;NO SYSMAK + MOVEI TAC,MAKEND ;YES + MOVEM TAC,SYSSIZ + +;IS EXEC DDT WANTED? + +EXTERNAL DDTEND + +ONCE2: MOVEI TAC,SYSDM + PUSHJ PDP,YESNO + JRST ONCE3 ;NO + MOVEI TAC,DDTEND ;FIRST FREE LOC. ABOVE EXEC DDT + MOVEM TAC,SYSSIZ ;SET NEW MONITOR SIZE +;FIND CORE TO BE USED FOR MULTIPLE DEVICE DATA BLOCKS +; INCLUDING DISK + +EXTERNAL CNTDB + +ONCE3: PUSHJ PDP,SYSSIZ ;SAVE CURRENT VALUE + JSP TAC,CNTDB ;UPDATE SYSSIZ BY SPACE USED + ; FOR DEVICE DATA BLOCKS FOR DSK,DTA,MTA,TTY,PTY) + +;PRINT OCTAL SIZE OF MONITOR + + MOVEI TAC,EXECIS + PUSHJ PDP,ICONM + MOVE TAC,SYSSIZ + PUSHJ PDP,OCTPNT + MOVEI TAC,LENGTH + PUSHJ PDP,CONMES + PUSHJ PDP,CRLF + PUSHJ PDP,OPOUT + POP PDP,SYSSIZ ;RESTORE SYSSIZ PRIOR TO ACTUAL CREATION + ; OF DEVICE DATA BLOCKS + EXTERN DECIN,CORLIM,USRLIM,RADX10 + +ONCE4A: MOVEI TAC,MXKMES ;PRINT "MAX. K CORE FOR SINGLE USER IS " + PUSHJ PDP,ICONM + MOVEI TAC,USRLIM + PUSHJ PDP,RADX10 + PUSHJ PDP,CRLF + PUSHJ PDP,OPOUT + + MOVEI TAC,DESMES ;PRINT "TYPE DESIRED MAX.(DEC). CR IF OK AS IS + PUSHJ PDP,ICONM ;" + PUSHJ PDP,OPOUT + PUSHJ PDP,GETLIN + JRST ONCE5A ;LEAVE LIMIT AS SET BY BUILDER QUESTION. +IFN FTTTYSER, + PUSHJ PDP,DECIN + JRST ONCE4A + JRST ONCE4A + SKIPE TAC1 ;UNLESS HE SAID 0 LIKE IN MONGEN. + HRRM TAC1,CORLIM ;PATCH CORLIM FOR USER CORE SIZE LIMIT + ; IF NOT PATCHED, LEAVE COMMON'S VALUE +ONCE5A: + +INTERNAL FTDISK +IFN FTDISK,< + PUSHJ PDP,REF ;GO THROUGH THE REFRESH DIALOG. +> + +QUICK: ;THIS IS THE SHORT-CUT EXIT TO BY-PASS MOST OF THE DIALOGUE + +INTERNAL FTCHECK + +IFN FTCHECK,< + PUSHJ PDP,OK ;CHECKSUM MONITOR AND SAVE THE ANSWER. +> + + JRST @ONCE ;***EXIT FROM THE "ONCE-ONLY CODE"*** + + +IFN FTNDISK,< +EXTERNAL OCTIN,MFDBLK,SATXWD,NUMPLK,SYSPP,REFLAG + +;REFRESH DIALOGUE + +REF: MOVEI TAC,REF1M ;DO YOU WANT TO REFRESH? + PUSHJ PDP,YESNO + POPJ PDP, ;NO + MOVEI TAC,REF2M ;YES, ARE YOU SURE? + PUSHJ PDP,YESNO + POPJ PDP, ;NO +REF6: ;YES. DO YOU WANT TO CHANGE THE LOC + MOVEI TAC,REF3M ;OF THE MFD? + PUSHJ PDP,YESNO + JRST REF3 ;NO +REF2: ;YES + MOVEI TAC,REF4M ;TYPE LOGICAL DISK ADDRESS OF MFD RETR, INFO + PUSHJ PDP,ICONM + PUSHJ PDP,OPOUT + + PUSHJ PDP,GETLIN + JRST REF2 + IFN FTTTYSER, + PUSHJ PDP,OCTIN + JRST REF2 + JRET REF2 +IFE FTRC10, < + PUSH PDP,TAC1 ;IS IT A MULTIPLE OF NUMBLK? + MOVEI TAC,(TAC1) + IDIVI TAC,NUMBLK + JUMPN TAC1,REF4 ;NO + POP PDP,TAC1 +> + HRRZM TAC1,MFDBLK + AOS TAC1 + HRRM TAC1,SATXWD +REF3: +INTERNAL FTSWAP +IFN FTSWAP, + PUSHJ PDP,DECIN + JRST REF3 + JRST REF3 + CAILE TAC1,MXK2SWP ;ANSWER TOO BIG? + JRST REF3 ;YES, REPEAT QUESTION + HRRZM TAC1,K4SWAP ;NO. SAVE THIS CRUCIAL PARAMETER. +REF3A: +>> + + PUSHJ PDP,REFRES ;REFRESH. + JRST REF5 ;ERROR + + MOVEI TAC,REF6M ;REFRESHING SUCCESSFULLY COMPLETED ! + PUSHJ PDP,ICONM + PUSHJ PDP,OPOUT ;TYPE "REFRESHED !" + + MOVE TAC,SYSPP + MOVEM TAC,REFLAG ;TO PERMIT AUTOMATIC LOG-IN UNDER + ; PROJ-PROG NUMBER [1,1] EVEN + MOVEI TAC,REF8M ; THOUGH THE LOG-IN CUSP IS CLEARLY NOT + PUSHJ PDP,ICONM ; ON THE NEWLY REFRESHED DISK. + PUSHJ PDP,OPOUT + POPJ PDP, + +IFE FTRC10, < +REF4: POP PDP,TAC1 + MOVEI TAC,REF5M + PUSHJ PDP,ICONM + PUSHJ PDP,OPOUT + JRST REF2 +> + +REF5: PUSH PDP,TAC ;ERROR. ON COMMING HERE, TAC HAS LOGICAL BLOCK + ; NUMBER WHICH COULD NOT BE WRITTEN + MOVEI TAC,REF7M + PUSHJ PDP,IOCONM + POP PDP,TAC + PUSHJ PDP,OCTPNT + PUSHJ PDP,CRLF + PUSHJ PDP,OPOUT + JRST REF6 ;GO BACK TO TRY AGAIN., + +REF1M: ASCIZ /DO YOU WANT TO REFRESH THE DISK ? (Y OR CR) +/ +REF2M: ASCIZ /ARE YOU SURE(Y OR CR)? +/ +REF3M: ASCIZ /DO YOU WANT TO CHANGE THE LOCATION OF THE MFD(Y OR CR)? +/ +REF4M: ASCIZ /TYPE THE LOGICAL DISK ADDRESS OF THE MFT RETREIVAL INFORMATION +/ +IFE FTRC10, < +REF5M: ASCIZ /MUST BE A MULTIPLE OF NUMBLK. +/ +> +REF6M: ASCIZ /REFRESHED ! +/ +REF7M: ASCIZ /ERROR WHILE WRITING BLOCK / +REF8M: ASCIZ /TO AUTOMATICALLY LOG-IN UNDER [1,1], TYPE "LOGIN" +/ +IFN FTRC10, < +REF9M: ASCIZ /HOW MANY (DECIMAL) 1K DISK BLOCKS ARE TO BE ALLOCATED FOR SWAPPING ? +/ +> +> ;THIS CLOSES AN FTDISK CONDITIONAL SERVAL PAGES BACK. + +;ROUTINE TO READ A LINE FROM OPERATORS CONSOLE +;CALL: PUSHJ PDP,GETLIN +; JUST A CR TYPED IN +; A LINE TYPED IN,TAC SEYT AS BYTE POINTER + +CHREC=TEM ;CHAR TO TYPE OUT (MUST BE SAME AS SCNSER ROUTINE) +LINE=TAC1 ;TTY LINE NO. (ALSO SAME AS SCNSER) + +IFN FTTTYSER, + +EXTNERAL CPOPJ + +GETLIN: IFE FTTTYSER, + IFN FTTTYSER,< PUSHJ PDP,SETBFI> + SETZB ITEM,CHREC +GET1: PUSHJ PDP,TYI + DATAI TTY,CHREC + ANDI CHREC,177 + CAIN CHREC,177 ;RUBOUT? + JRST DELETE + CAIN CHREC,33 ;ALTMODE ? + JRST GETLN1 ;YES + CAIE CHREC,175 ;VARIATION OF ALT-MODE ? + CAIN CHREC,176 ;OR YET THIS THIRD VARIATION ? + JRST GETLN1 ;YES +GET2: PUSHJ PDP,TYO ;ECHO CHARACTER + CAIL CHREC,140 ;IS THIS LOWER CASE? + TRZ CHREC,40 ;YES,MAKE IT UPPER CASE +IFE FTTTYSER, +IFN FTTTYSER, + CAIE CHREC,15 + AOJA ITEM,GET1 + MOVEI CHREC,12 ;OUTPUT LF + PUSHJ PDP,TYO ;TYPE OUT +IFE FTTTYSER,< MOVE TAC,LINEP ;RESET BYTE POINTER> + JUMPN ITEM,CPOPJ1 ;NULL LINE? + POPJ PDP, ;YES, DON'T SKIP RETURN + +DELETE: IFN FTTTYSER,< PUSHJ PDP,DCPUTR + JRST DELET1> +IFE FTTTYSER,< + JUMPE ITEM,DELET1 ;AT BEGINNING OF LINE?> + ADD TAC,[XWD 070000,0] ;NO, BACK UP BYTE POINTER + TLNE TAC,400000 ;FINISHED THIS WORD YET? + ADD TAC,[XWD 347777,-1] ;YES, BACK UP ADDRESS> + MOVEI CHREC,134 + PUSHJ PDP,TYO + SOJA ITEM,GET1 + +DELET1: MOVEI CHREC,15 + PUSHJ PDP,TYO + MOVEI CHREC,12 + PUSHJ PDP,TYO + JRST GETLIN + +GETLN1: SETOM ITEM ;MECHANISM USED TO BY-PASS PART OF DIALOGUE + MOVEI CHREC,15 ;WHEN ALTMODEIS TYPED. + JRST GET2 + +;ROUTINE TO TYPE A LINE ON OPERATOR CONSOLE +;ECHO CHECK STOPS LINE AND RETURNS +;CALL: DAT SET TO END OF MESSAGE + +IFN FTTTYSER, + +OPOUT: IFE FTTTYSER, + IFN FTTTYSER, + CONO TTY,1000 ;CLEAR INPUT +OPOUT1: IFE FTTYSER,< + CAMN TAC,DAT + POPJ PDP,> + CONSZ TTY,40 + JRST OPOUT2 ;ECHO CHECK + MEXTC +IFN FTTTYSER,< JUMPE CHREC,CPOPJ> + PUSHJ PDP,TYO + JRST OPOUT1 + +OPOUT2: MOVEI CHREC,15 + PUSHJ PDP,TYO + MOVEI CHREC,12 + PUSHJ PDP,TYO + CONO TTY,1000 ;CLEAR INPUT + +;WAIT TILL OUTPUT BUSY OFF BEFORE TYPING OUT CHAR. + +EXTERNAL TCONLN,TYPL + +TYO: PUSHJ PDP,APRCHK ;CHECK CLOCK + CONSZ TTY,20 + JRST TYO + PUSH PDP,TAC + PUSH PDP,LINE + MOVE TAC,CHREC + IMULI TAC,200401 + AND TAC,[OCT 11111111] + IMUL TAC,[OCT 11111111] + TLNE TAC,10 + TRO CHREC,200 + DATAO TTY,CHREC + TRZ CHREC,200 + POP PDP,LINE + POP PDP,TAC + POPJ PDP, + +;WAIT TIL INPUT DONE ONE BEFORE RETURNING WITH NEXT CHAR. + +TYI: PUSHJ PDP,APRCHK + CONSO TTY,40 + JRST TYI + POPJ PDP, + +;CHECK APR FOR CLOCK FLAG SO TIME USER TYPES IN WILL BE ACCURATE + +APRCHK: CONSO APR,1000 ;IS CLOCK FLAG ON? + POPJ PDP, ;NO + CONO APR,1000 ;YES, CLEAR CLOCK FLAG + AOS TIME ;INCREMENT TIME + POPJ PDP, + +ICONM: PUSH PDP,TAC + SETTTYO ;INITIALIZE LINE BUFFER + POP PDP,TAC + JRST CONMES ;OUTPUT MESSAGE + +IFN FTTTYSER,< +OTSET: MOVEI DEVDAT,SCNDDB + MOVSI TEM,120 ;TTYCHR + HRRI TEM,TIBF(DEVDAT) + MOVEM TEM,TTIBUF(DEVDAT) ;INIT INPUT POINTER + HRRI TEM,TDBF(DEVDAT) ;AND OUTPUT POINTER + MOVEM TEM,TTOBUF(DEVDAT) + JRST TSETBF ;NOW CLEAR THE BUFFERS +> + +YESNO: PUSHJ PDP,ICONM ;FIRST OUTPUT THE QUESTION + PUSHJ PDP,OPOUT + PUSHJ PDP,GETLIN ;NOW GET RESPONSE + POPJ PDP,0 ;JUST A C-R + NEXTC + TRZ CHREC,40 ;FIRST CHAR OF RESPONSE (U.C.) + CAIN CHREC,"Y" ;WAS IT A Y? + AOS 0(PDP) ;YES, SKIP + POPJ PDP, ;NO. MAYBE IT WAS "N", SO DONT SKIP + +;CONSTANTS AND PUSH DOWN LIST + +ONCEPN=20 +ONCEPD: BLOCK ONCEPN ;PUSH DOWN LIST + +LINEP: POINT 7,LINBUF ;INPUT AND OUTPUT LINE BUFFERE +LINBUF: BLOCK 30 + +;MESSAGES + +TSEXEC: ASCIZ /MONITOR JUST LOADED +/ +TODATE: ASCIZ / +TYPE TODAY'S DATE AS MM-DD-YY +/ + +TIMEM: ASCIZ / +TYPE TIME AS HHMM +/ +IOCONF: ASCIZ / +IO CONFIGURATION +/ +OPRM: ASCIZ / +TYPE NAME OF OPR CONSOLE. +/ +SYSM: ASCIZ / +DO YOU WANT SYSMAK (TYPE Y IF YES, CR IF NO)? +/ +SYSDM: ASCIZ / +EXEC DDT? +/ +EXECIS: ASCIZ / +EXEC IS / +LENGTH: ASCIZ / OCTAL LOCATIONS LONG. +/ +MXKMES: ASCIZ /MAX K CORE FOR SINGLE USER IS / +DESMES: ASCIZ /TYPE DESIRED MAX,(DEC), CR IF OK AS IS +/ +CRLFMS: ASCIZ / +/ + + +;INITIALIZE SAT SEARCH ENTRIES + +;THIS "DFWUNS" ROUTINE IS CALLED BY MANDATORY ONCE ONLY CODE(LINKSR) +; AFTER ALL MULTIPLE DEVICE DATA BLOCKS HAVE BEEN GENERATED IN CORE +; ABOVE C(SYSSIZ)( AND SYSSIZ HAS BEEN INCREMENTED) +; IT IS CALLED WHETHER OR NOT THE DISK WAS REFRESHED. IF REFRESHING WAS +; PERFORMED, DFWUNS IS CALLED AFTER REFRES SINCE SYSINI CALLS LINKSR AFTER ONCE. + +INTERNAL FTDISK +IFN FTDISK, + +INTERNAL DFWUNS +EXTERNAL SAT05,JSAT06,SATENT,SATPTR,SATBK2,SATXWD,SATPTR +EXTERNAL SAT,SENTSZ,DSKDDB,DSKBUF,WSYNC,MQIN,MQOUT,DFGETF,SETFRE +EXTERNAL WLBIT,NUMBIT,DSKCNT + +DFWUNS: +IFN FTRC10, < + PUSHJ PDP,WRITLK ;FORCE THE WRITE-LOCK SWITCH SETTINGS TO BE ZERO. + + PUSHJ PDP,RDSTAT ;READ VITAL DISK STATISTICS BLOCK, STORE PARAMETERS + PUSHJ PDP,CAPCTY ;DETERMINE CURRENT SYSTEM CAPACITY (HOW MANY DISKS). + CAMN TAC,LBHIGH ;HAS CAPACITY CHANGED SINCE LAST REFRESH ? + JRST DFWNZ1 ;NO, EVERYTHING APPPEARS TO BE OKAY. + SETTTYO ;YES, PRINT WARNING MESSAGE... + PUSHJ PDP,INLMES + ASCIZ /DISK CAPACITY HAS CHANGED SINCE LAST REFRESHING. +EITHER RESTORE PREVIOUS DISK CONFIGURATION OR REFRESH. +/ + PUSHJ PDP,OPOUT ;START TTY + PUSHJ PDP,REF ;GO THROUGH THE REFRESH DIALOGUE + JRST DFWUNS ;NOW TRY AGAIN. +DFWNZ1: +> + MOVEI TAC,SETENT + MOVEM TAC,SATPTR + MOVEI PROG,0 + MOVEI DEVDAT,DSKDDB + MOVE TAC1,SATBK2 + MOVEM TAC1,DSKBUF(DEVDAT) + PUSH PDP,WSYNC + MOVE TAC,JSAT06 + MOVEM TAC,WSYNC + SKIPA TAC,SATXWD + +;READ EACH SAT BLOCK FROM THE DISK AND SET SATENT TABLE TO MATCH INFO ON DISK. + +SETS1: ADDM TAC1,SATPTR +SETS2: PUSH PDP,TAC + SETZB IOS,DEVIOS(DEVDAT) + PUSHJ PDP,MQIN ;READ A SAT BLOCK + JRST 4,SETS6 ;ERROR HALT + MOVE DAT,SATPTR ;RESET THE ENTRY + MOVE TAC,SATBK2 + MOVEM TAC,2(DAT) + MOVSI TAC1,400000 + MOVEM TAC1,1(DSAT) + MOVEI DAT,0 +SETS3: MOVE AC1,(TAC) ;COUNT ONE-BITS + AOJN AC1,SETS3A ;IS THE WORD = -1? + ADDI DAT,44 ;YES + JRST SETS5 + +SETS3A: SOJE AC1,SETS5 ;NO, IS IT = 0? +SETS4: TDNE TAC1,(TAC) ;NO, COUNT THE BITS + ADDI DAT,1 + ROT TAC1,-1 + JUMPGE TAC1,SETS4 + +SETS5: AOBJN TAC,SETS3 ;LOOP THRU ENTIRE BLOCK + HRRM DAT,@SATPTR + +IFE FTRC10, < +;BITS HAVE BEEN COUNTED, CHECK FOR WRITE-LOCK + CAIL DAT,NUMBIT ;BLOCK FULL? + JRST SETS8 + PUSHJ PDP,DEGETF ;NO. GET A FREE BLOCK + + PUSHJ PDP,SETS7 ;WRITE + PUSHJ PDP,SETFRE ;FREE THE BLOCK +> + +SETS5B: MOVEI TAC1,SENTSZ ;PREPARE TO BUMP SATPTR + POP PDP,TAC + AOBJN TAC,SETS1 ;DO ALL SAT BLOCKS + +IFE FTRC10, < + JRST SAT05 ;RETURN +> + +IFN FTRC10, < + HRRZ TAC,SATPTR +SETS5X: CAIL TAC,SATTOP + JRST SAT05 ;EXIT FROM DFWUNS BACK TO DSKINI IN DSKSER........ + ADDI TAC,SENTSZ + MOVEI TAC1,411000 ;ON THE NEW PDP-10 DISK SYSTEM SET THE SAT ENTRY + HRRM TAC1,(TAC) ; TABLE TO SHOW ALL NON-EXISTENT DISKS AS + JRST SETS5X ; BOTH WRITE-LOCKED AND FULL. +> + +IFE FTRC10, < + +;WRITE-LOCK DETERMINATION ON THE OLD PDP-6 (DATA PRODUCTS) DISK -- + +SETS7: PUSH PDP,TAC ;SAVE BLOCK ADDRESS +SETS7A: PUSHJ PDP,MQOUT + JRST SETS7C ;ERROR +SETS7B: POP PDP,TAC + POPJ PDP, +SETS7C: MOVE TAC,(PDP) + MOVE TAC1,DSKCNT(DEVDAT) + TRNN TAC1,IOIMPM ;WRITE LOCK? + JRST 4,SETS7A ;NO + MOVEI TAC,WLBIT ;YES. SET BIT + ORM TAC,@SATPTR + JRST SETS7B + +SETS8: MOVEI TAC,SETS9 ;BLOCK FULL, READ FIRST ONE + HRRM TAC,DSKBUF(DEVDAT) + HLRZ TAC,@SATPTR + PUSHJ PDP,MQIN + JRST 4,.-2 ;ERROR + HLRZ TAC,@SATPTR ;WRITE IT BACK + PUSHJ PDP,SETS7 + MOVEI TAC,SAT ;RESET + HRRM TAC,DSKBUF(DEVDAT) + JRST SETS5B + +SETS9: BLOCK 204 + +> ;CLOSE THE IFE FTRC10 +> ;CLOSES AN IFN FTDISK A COUPLE PAGES BACK. + +IFN FTDISK,< + +;DISK REFRESHING ROUTINES --- + +IFE FTRC10, < +;DISK REFRESHER FOR THE OLD PDP-6 (DATA PRODUCTS) DISK -- + + +EXTERNAL MFDBLK,NUMSAT,CHKCNT,CHKSUM,NUMBLK,DSKINI,SETSAT,DSKCHN,DSKCHL + +REFRESH: MOVEI PROG,0 ;SETUP IO + MOVEI DEVDAT,DSKDDB + PUSH PDP,SETSAT + MOVE TAC,RPOPJ + MOVEM TAC,SETSET + PUSHJ PDP,DSKINI + POP PDP,SETSAT + MOVEI TAC,DSKCHN + LSH TAC,1 + + ADDI TAC,40 + MOVE TAC1,[JSR DSKCHL] + MOVEM TAC1,(TAC) + PUSH PDP,WSYNC + MOVE TAC,JSAT06 + MOVEM TAC,WSYNC + +;SETUP NULL SAT BLOCK + + SETOM DAT + MOVE TAC1,[XWD NULBLK,NULBLK+1] + SETZM NULBLK + BLT TAC1,NULBLK+177 + MOVEI TAC,NUMBLK ;END OF BLOCK BYTE POINTER + IDIVI TAC,^D36 + SUBI TAC1,^D36 + MOVMS TAC1 + ROT TAC1,-6 + ADDI TAC,NULBLK + HLL TAC,TAC1 + TLOA TAC,100 + IDPB DAT,TAC + TLNE TAC,770000 + JRST .-2 + AOS TAC + MOVEM DAT,(TAC) + HRLS TAC + AOS TAC + BLT TAC,NULBLK+177 + +;SET UP SAT BLOCK WITH MFD AND SAT BLOCKS ALLOCATED + + MOVE TAC,[XWD NULBLK,SATBL1] + BLT TAC,SATBL1+177 + MOVE TAC,[POINT 1,SATBL1] + MOVEI TAC1,NUMSAT + HRLM TAC1,SATRET+3 + ADDI TAC1,3 + IDPB DAT,TAC + SOJG TAC1,.-1 + +;COMPUTE CHECKSUMS IF REQUIRED + + MOVEI DAT,CHKCNT + JUMPE DAT,REFR1 + MOVE TAC,[XWD -200,MFD1] + PUSHJ PDP,CHKSUM + HRLM TAC1,MFDRET+4 + MOVE TAC,[XWD -200,NULBLK] + PUSHJ PDP,CHKSUM + HRLM TAC1,SATRET+4 + MOVE TAC,[XWD -200,SATBL1] + PUSHJ PDP,CHKSUM + MOVE DAT,TAC1 + +;RELOCATE POINTERS RELATIVE TO MFDBLK + +REFR1: MOVE TAC,MFDBLK + HRRM TAC,MFDRET+177 + HRRM TAC,MFD1+1 + ADDI TAC,NUMSAT + AOS TAC + HRRM TAC,SATRET+177 + HRRM TAC,MFD1+3 + AOS TAC + HRRM TAC,MFDRET+4 + MOVNI TAC1,NUMSAT + MOVSS TAC1 + HRRI TAC1,1 + MOVE TAC,MFDBLK + HLL TAC,SATRET+4 + HRRZM TAC1,SATRET+3(TAC1) + ADDM TAC,SATRET+3(TAC1) + AOBJN TAC1,.-2 + +;FIX CHECKSUM FOR SATBL1 + + MOVE TAC,MFDBLK + IDIVI TAC,NUMBLK + HRLM DAT,SATRET+3(TAC) + MOVE DAT,TAC + +;WRITE BLOCKS ON DISK + + MOVE TAC,MFDBLK ;MFD RETREIVAL INFORMATION + MOVE TAC1,[XWD -200,MFDRET] + MOVEM TAC1,DSKBUF(DEVDAT) + SETZB IOS,DEVIOS(DEVDAT) + PUSHJ PDP,MQOUT + JRST REFER ;ERROR + MOVEI TAC,1 +REFR2: MOVE TAC1,[XWD -200,NULBLK] ;SAT BLOCKS + CAMN TAC,DAT + MOVE TAC1,[XWD -200,SATBL1] + PUSH PDP,TAC + ADD TAC,MFDBLK + SETZB IOS,DEVIOS(DEVDAT) + MOVEM TAC1,DSKBUF(DEVDAT) + PUSHJ PDP,MQOUT + JRST REFER1 ;ERROR + POP PDP,TAC + CAIGE TAC,NUMSAT + AOJA TAC,REFR2 + AOS TAC ;SAT RETREIVAL INFORMATION + ADD TAC,MFDBLK + SETZB IOS,DEVIOS(DEVDAT) + + MOVE TAC1,[XWD -200,SATRET] + MOVEM TAC1,DSKBUF(DEVDAT) + PUSHJ PDP,MQOUT + JRST REFER ;ERROR + MOVE TAC,MFDBLK ;MFD + ADDI TAC,NUMSAT + ADDI TAC,2 + MOVE TAC1,[XWD -200,MFD1] + MOVEM TAC1,DSKBUF(DEVDAT) + SETZB IOS,DEVIOS(DEVDAT) + PUSHJ PDP,MQOUT + JRST REFER ;ERROR + POP PDP,WSYNC + JRST CPOPJ1 + +REFER1: POP PDP,TAC1 +REFER: POP PDP,WSYNC +RPOPJ: POPJ PDP, + +DEFINE ZEROS (A), + LIST> + +DEFINE ONES (A), + LIST> + +DEFINE BLOCKR (NAME,EXT,PROT,PROGX,B,F,Z),< + NAME + EXT + EXP PROT*1B8+14812 + XWD 1,PROGX + EXP Z + ZEROES 172 + BYTE (4) F (14) 0 (18) B > + +MFDRET: BLOCKR ,,45,1,0,4,20 ;MFD RETREIVAL INFO + +SATBL1: XWD 777776,0 ;THIS SAT BLOCK CONTAINSS + ZERSO 5400/44-1 ;ALLOCATION FOR MFD AND SAT BLOCKS + XWD 001777,-1 + ONES 200+SATBL1-. + +SATRET: BLOCKR ,,555,1,0,1,16 + +MFD1: XWD 1,1 ;MFD + XWD 654644,0 + SIXBIT /*SAT*/ + XWD 637163,17 ;RELOCATED + ZEROS 174 + +NULBLK: ZEROS 5400/44-1 ;NULL SAT BLOCK + XWD 001777,-1 + ONES 200+NULBLK-. + +> ;END OF THE REFRESHER FOR THE OLD PDP-6 DISK. + + +IFN FTRC10, < + +;DISK REFRESHER FOR THE NEW PDP-10 MODEL RC-10 (BURROUGHS) DISK-- + + EXTERNAL CPOPJ1,THSDAT,TIME + EXTERNAL MFDBLK,SATXWD,NUMSAT,NUMBLK,SATTOP,SENTSZ + EXTERNAL DISKUP,DFREF,DFWRT,DSKFDG,CHKSUM,RCXCCW,RCXFIN + EXTERNAL K4SWAP +IFN FTSWAP,< + EXTNERAL MAXSWP,MXK2SWP,BLKSPK +> +EXTERNAL LBHIGH + INTERNAL STATBK + +STATBK=1 ;FIXED LOGICAL BLOCK NUMBER FOR THE "VITAL + ; STATISTICS" BLOCK OF THE DISK. +DSK=170 ;DEFINE DEVICE NUMBER OF THE MODEL RC-10 DISK SYNCHRONIZER. + + +;THESE NEXT TWO PAGES ARE LIFED DIRECTLY FROM "DSKINIT" IN ORDER TO DEFINE THE +; CONO AND CONI BITS USED HERE IN "ONCE". + +;CONI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER -- + +;BITS 00 - 17 MAINTENANCE PANEL SWITCH SETTINGS INDICATORS -- + ;BITS 00 - 04 UNUSED +MSS=1B5 ;SET INDICATES "MAINTENANCE SEGMENT SELECTED" (SEGMENT 81), +PLGSW=1B6 ;1 = WRITE-PROTECT EVERYTHING BELOW (LESS THAN) THE BOUNDARY, + ; 0 = WRITE-PROTECT EVERYTHING ABOVE (GREATER THAN) BOUNDARY, + ;THE CURRENT IMPLEMENTATION OF THE RC-10 DISK SYNCHRONIZER + ; DOES NOT PERMIT SENSING THE INCLUSION OF THE BOUNDARY. + ;BITS 07 - 17 THE WRITE-PROTECTION THE INCLUSION OF THE BOUNDARY. +DTOP=1B18 ;SET INDICATES DATA TRANSFER IN PROGRESS. +;BITS 19 -29 ERROR CONDITIONS INDICATORS (ERROR WHEN SET) -- + SRCHE=1B19 ;SEARCH ERROR (DISK TIMING TRACK PROBLEMS!!) + DDE=1B20 ;DISK DESIGNATION ERROR + TSE=1B21 ;TRACK SELECT ERROR (OR EXCEEDS SYSTEM CAPACITY) + MRDY=1B22 ;DISK NOT READY (OR NON-EXISTENT DISK REFERENCED) + PSF=1B23 ;POWER SUPPLY FAILURE + DPAR=1B24 ;DISK PARITY ERROR + CHDPAR=1B25 ;CHANNEL DATA PARITY ERROR + CHCPAR=1B26 ;CHANNEL CONTROL PARITY ERROR + NXMEM=1B27 ;NON-EXISTENT MEMORY REFERENCED + WRPE=1B28 ;ATTEMPTED TO WRITE IN PROTECTED DISK AREA (SEE BITS 06 - 17) + OVR=1B29 ;OVERRUN, I.E., MEMORY DIDN'T RESPOND QUICKLY ENOUGH +;BIT 30 CHANNEL CONTROL WORD WRITTEN IN MEMORY (THIS BIT IS + ;TURNED ON ON ALMOST ALL TERMINATIONS.) +BUSYRT=1B31 ;BUSY (SYNCHRONIZER PERFORMING A COMMAND SEQUENCE) +DONEFLG=1B32 ;DONE -- THIS ACTUALLY CAUSES THE INTERRUPT. +;BITS 33 - 35 PI CHANNEL SELECTION BITS. + +;COMBINATIONS OF ERRO BITS GROUPED BY TYPE -- +DATERR=DPAR!CHDPAR ;DATA ERRORS. +DEVERR=SRCHE!PSF!CHCPAR!OVR ;DEVICE ERRORS. +SETERR=DDE!TSE!NRDY!NXMEM ;SOFTWARE-PREVENTABLE ERRORS. + + +;CONO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER + +;BITS 00 - 17 UNUSED +;BITS 18 - 19 SELECT DISK FOR SECTOR COUNTER READ-OUT A(SEE DATAI BITS 28-35) +;BITS 20 - 29 RESET THE CORRESPONDING CONI ERROR BIT + ;(BUT PSE MAY REFUSE TO BE RESET) +WRCCWD=1B30 ;WRITE THE CHANNEL CONTROL WORD INTO MEMORY (NOW!) +STPBIT=1B31 ;STOP -- IMMEDIATELY CEASE PRESENT I/O AND CLEAR THE CHANNEL. +RESETB=1B32 ;RESET THE DONE FLAG (CORRESPONDING CONI BIT) TO CLEAR INTERRUPT +;BITS 33 - 35 PI CHANNEL SELECTION BITS + +;DATAI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER -- + +;BITS 00 - 17 UNUSED +;BITS 18 - 23 PARITY REGISTER +;BITS 24 - 25 UNUSED +;BITS 26 - 27 DISK SELECTED BY BITS 18-19 OF LAST CONO +;BITS 28 - 35 CURRENT SECTOR POSITION OF SELECTED DISK (FOR LATENCY OPTIMIZATION!) + +;DATAO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER -- + +;BITS 00 - 17 DISK ADDRESS ELECTION + ;BITS 00 - 01 DISK SELECT + ;BITS 02 - 10 TRACK SELECT (BCD, BUT FIRST CHAR IS JUST 1 BIT) + ;BITS 11 - 17 SEGMENT SELECT (BCD, BUT FIRST CHAR HAS ONLY 3 BITS) +;BITS 18 - 23 INITIAL PARITY REGISTER SETTING 9ZERO EXCEPT FOR DIAGNOSTIC PROGRAMS) +DDSKPE=1B24 ;DISABLE DISK PARITY ERROR STOP +DCHNPE=1B25 ;DISABLE CHANNEL DATA PARITY ERROR STOP +WRBIT=1B16 ;SET MEANS WRITE ON DISK, RESET MEANS READ FROM DISK +;BITS 27 - 34 ;CORRESPONDING BITS OF INITIAL CHANNEL CONTROL ADDRESS, HENCE, + ; THIS ADDRESS MUST BE EVEN AND IN THE FIRST 1K OF CORE MEMORY! +;BIT 35 ;WRITE EVEN PARITY DATA INTO MEMORY (DIAGNOSTICS ONLY!) + + +REFRESH: + PUSHJ PDP,DISKUP ;BE SURE THE DISK IS UP AND READY. + PUSHJ PDP,WRITLK ;BE SURE WRITE-LOCK SWITCHES ARE OFF. + PUSHJ PDP,CAPCTY ;DETERMINE THE CURRENT DISK CAPACITY OF THE + ; SYSTEM, I.E. HOW MANY DISKS ARE ATTACHED TODAY ? + MOVEM TAC,LBHIGH ;STORE HIGHEST LEGAL LOGICAL BLOCK NUMBER + AOS TAC +IFN FTSWAP,< + MOVE TAC1,K4SWAP + LSH TAC1,BLKSPK ;COMPUTE AND SAVE THE LOWEST LOGICAL BLOCK + SUBM TAC,TAC1 ; NUMBER RESERVED FOR SWAPPING. + MOVEM TAC1,LOWSWP + CAIG TAC1,STATBK ;SWAPPING AREA MUST NOT OVERLAY THE + JRST RFRSHE ; VITAL STATISTICS BLOCK. +> + IDIVI TAC1,NUMBLK + MOVN TAC1,TAC ;SET SATXWD TO SHOW ONLY THE NUMBER OF + HRLM TAC1,SATXWD ; SAT BLOCKS ACTUALLY IN EXISTENCE. + HRRZ TAC1,MFDBLK + ADDI TAC,2(TAC1) +IFN FTSWAP,< + CAML TAC,LOWSWP ;MAKE VARIOUS CONSISTENCY CHECK TO DETERMINE + JRST RFRSHE ; THAT THE DISK PARAMETERS SPECIFIED DURING THE +> + CAIG TAC1,STATBK ; ONCE-ONLY DIALOGUE DO NOT CAUS THE DISK + CAIGE TAC,STATBK ; SWAPPING AREA, VITAL STATISTICS BLOCK, AND/OR + JRST RFRSH1 ; THE MFD AND SAT BLOCK TO OVERLAP ONE ANOTHER. +RFRSHE: MOVEI TAC,RFSHME + ;IF THERE IS SOME OVERLAPPING OF + PUSHJ PDP,IOCON ; THESE DISK STORAGE AREAS, PRING AN + PUSHJ PDP,OPOUT ; ERROR MESSAGE AND THEN GO BACK TO THE + POP PDP,TAC ; DIALOGUE TO AK THE PARAMETER SPECIFICATION + JRST REF6 ; QUESTIONS AGAIN. + +RFSHME: ACSIZ /PARAMETER SPECIFICATION ERROR. TRY AGAIN. +/ + +RFRSH1: PUSHJ PDP,WRSTAT ;WRITE OUT THE VITAL STATISTICS BLOCK ON THE DISK. + JRST REFERR ; AN ERROR ON THIS WRITE IS BAD TROUBLE !! + +;NEXT WRITE THE MFD (MASTER FILE DIRECTORY) ONTO THE DISK + + PUSHJ PDP,WNZCLR ;CLEAR THE OUTPUT BUFFER + MOVE TAC,[XWD 1,1] ;THE FIRST ENTRY IN THE MFD IS FOR + MOVEM TAC,WNZBUF ; THE MFD ITSELF. + MOVE TAC,[SIXBIT/UFD/] + HRR TC,MFDBLK ;POINTER TO MFD RETRIEVAL INFORMATION + MOVEM TAC,WNZBUF+1 + MOVE TAC,[SIXBIT/*SAT*/] ;THE ONLY OTHER ENTRY INITIALLY IN THE + MOVEM TAC,WNZBUF+2 ; MFD IS FOR THE FILE NAMED *SAT*.SYS WHICH + HLRZ TAC1,SATXWD ; PERMITS ACCESS TO THE SAT BLOCKS FOR + HRRZ TAC,MFDBLK ; ANYONE WHO WANTS TO LOOK AT THEM. + SUBI TAC,-1(TAC1) ;COMPUTE POINTER TO THE RETRIEVAL INFORMATION + HLL TAC,[SIXBIT/SYS/] ; FOR THE *SAT*.SYS FILE. + MOVEM TAC,WNZBYUF+3 + HRRZS TAC + ADDI TAC,1 ;COMPUTE LOGICAL BLOCK NUMBER OF THE MFD. + PUSHJ PDP,WNZWR ;WRITE THE MFD OUT ONTO THE DISK. + + JRST REFERR ;ERROR + + MOVE TAC,[XWD -200,WNZBUF] + PUSHJ PDP,CHKSUM + HRRZM TAC1,CHKSAV ;SAVE CHECKSUM TO GO INTO RETRIEVAL INFORMATION. + +;NEXT WRITE MFD RETRIEVAL INFORMATION BLOCK ONTO THE DISK + + PUSHJ PDP,WNZCLR ;CLEAR OUTPUT BUFFER + MOVE TAC,[XWD 1,1] + MOVEM TAC,WNZBUF ;FILE NAME + HRRZ TAC,THSDAT + HLL TAC,[SIXBIT /UFD/] + MOVEM TAC,WNZBUF+1 ;FILE EXTENSION, DATE + HRLZI TAC,045000 ;PROTECTION (ANY PROJECT 1 USER MAY WRITE IN MFD) + PUSHJ PDP,MDTMDT ;FILL IN TIME, DATE, AND MODE + MOVEM TAC,WNZBUF+2 + MOVE TAC,[XWD -200,1] ;NEGATIVE WORD COUNT AND PROGRAMMER NUMBER + MOVEM TAC,WNZBUF+3 ;GO INTO WORD 4 OF RETRIEVAL INFO + HLRZ TAC1,SATXWD + MOVE TAC,MFDBLK + SUBI TAC,-2(TAC1) ;COMPUTE POINTER TO THE MFD. + HRL TAC,CHKSAV ;RETRIEVE SAVED CHECKSUM OF MFD. + MOVEM TAC,WNZBUF+4 + MOVE TAC,MFDBLK ;THE LAST WORD OF ANY BLOCK OF RETRIEVAL INFORMATION + MOVEM TAC,WNZBUF+177 ; MUST CONTAIN ITS OWN BLOCK NUMBER. + PUSHJ PDP,WNZWR ;WRITE MFD RETRIEVAL INFOMRATION ONTO THE DISK + JRST REFERR ;ERROR + +;NEXT CREATE THE NECESSARY SAT BLOCKS ON THE DISK + + PUSH PDP,SATXWD ;SATXWD CONTROLS THE OUTER LOOP + MOVEI TAC,SATENT ;SET UP SATPTR TO SHUFFLE THROUGH THE BLOCKS + +REFST1: MOVEM TAC,SATPTR + PUSHJ PDP,WNZCLR ;CLEAR THE BUFFER + MOVEI TAC1,NUMBIT + SUBI TAC1,NUMBLK + MOVEI TAC,NUMBLK + PUSHJ PDP,SETWNZ ;MARK UNAVAILABLE BITS AT END OF THE BLOCK +IFN FTSWAP,< + HLRZ TAC1,@SATPTR ;GET FIRST LOGICAL BLOCK NUMBER IN THIS SAT BLOCK + CAMGE TAC1,LOWSWP ;IS ENTIRE BLOCK WITHIN SWAPPING AREA? + JRST REFST2 ;NO, JUMP AHEAD + MOVEI TAC1,NUMBIT ;YES, MARK IT ALL OFF LIMITS + MOVEI TAC,0 + PUSHJ PDP,SETWNZ + JRST REFST7 ;HAVING SET ALL BITS, NO FURTHER TESTING IS NEEDED, +> +REFST2: MOVN TAC,TAC1 + ADDI TAC1,NUMBLK + SUB TAC1,LOWSWP ;IS ANY OF SWAPPING AREA WITHIN THIS SAT BLOCK? + JUMPLE TAC1,REFST3 ;NO, JUMP AHEAD + ADD TAC,LOWSWP ;YES, MARK SWAPPING AREA AS UNAVAILABLE. + PUSHJ PDP,SETWNZ +> +REFST3: HLRZ TAC1,@SATPTR ;GET FIRST LOGICAL BLOCK NUMBER IN THIS SAT BLOCK. + JUMPN TAC1,RFST3A ;ONLY FOR FIRST SAT BLOCK-- + HRLZI TAC,400000 ;MARK LOGICAL BLOCK 0 AS BEING IN USE. + IORM TAC,WNZBUF +RFST3A: HRRZI TAC,STATBK + CAIL TAC,(TAC1) ;IS THE VITAL STATISTICS BLOCK WITHIN + CAIL TAC,NUMBLK(TAC1) ; THE RANGE OF THIS SAT BLOCK ? + JRST REFST4 ;NO, JUMP AHEAD + SUB TAC,TAC1 + MOVEI TAC1,1 ;YES, MARK IT UNAVAILABLE, + PUSHJ PDP,SETWNZ + +REFST4: MOVE TAC,SATXWD ;SET UP TO LOOP THRU LOGICAL BLOCK NUMBERS FOR MFD. + SUB TAC,[XWD 3,1] ; MFD RETRVL INFO. SAT BLOCKS, AND SAT RETRVL INFO. + +REFST5: PUSH PDP,TAC + HRRZS TAC + HLRZ TAC1,@SATPTR + CAIL TAC,(TAC1) ;IS THE INDICATED LOGICAL BLOCK NUMBER WITHIN + CAIL TAC,NUMBLK(TAC1) ; THIS PARTICULAR SAT BLOCK ? + JRST REFST6 ;NO, JUMP AHEAD + SUB TAC,TAC1 + MOVEI TAC1,1 ;YES, MARK IN-USE BIT. + PUSHJ PDP,SETWNZ + +REFST6: POP PDP,TAC ;LOOP THROUGH THE WHOLE SET OF SPECIAL BLOCKS + AOBJN TAC,REFST5 ; WHICH MUST BE MARKED UNAVAILABLE. + +REFST7: MOVE TAC,[XWD -200,WNZBUF] + + PUSHJ PDP,CHKSUM ;COMPUTE CHECKSUM + MOVE TAC,SATPTR + HRRZM TAC1,1(TAC) ;STORE IT TEMPORARILY IN THE SATENT TABLE. + + HRRZ TAC,(PDP) ;LOGICAL BLOCK NUMBER TO BE WRITTEN + PUSHJ PDP,WNZWR ;WRITE THIS SAT BLOCK ONTO THE DISK + JRST REFER1 ;ERROR + + POP PDP,TAC + AOBJN TAC,.+2 ;LAST SAT BLOCK WRITTEN ? + + JRST REFSRF ;YES, GO WRITE SAT RETRIEVAL INFORMATION. + + PUSH PDP,TAC ;NO, ADVANCE SATPTR AND LOOP + MOVE TAC,SATPTR ; BACK TO DO NEXT SAT BLOCK. + ADDI TAC,SENTSZ + JRST REFST1 + +;FINALLY, WRITE OUT THE RETRIEVAL INFORMATION FOR THE FILE *SAT*.SYS + +REFSRF: PUSHJ PDP,WNZCLR ;CLEAR THE BUFFER + MOVE TAC,[SIXBIT /*SAT*/] + MOVEM TAC,WNZBUF ;STORE FILE NAME + HRRZ TAC,THSDAT + HLL TAC,[SIXBIT /SYS/] + MOVEM TAC,WNZBUF+1 ;STORE EXTENSION AND DATE + HRLZI TAC,555000 ;PROTECTION CODE (UNTOUCHABLE FILE ! ) + PUSHJ PDP.MDTMDT ;FILL IN TIME, DATE AND MODE + MOVEM TAC,WNZBUF+2 + HLLZ TAC,SATXWD ;COMPUTE NEGATIVE WORD COUNT + LSH TAC,7 + HRRI TAC,1 ;PROGRAMMER NUMBER=1 + MOVEM TAC,WNZBUF+3 + + MOVEI TAC,SATENT ;PREPARE TO STORE POINTERS TO ALL THE SAT BLOCKS. + MOVE TAC1,SATXWD + MOVEI AC2,0 + +REFSRL: HRRZ AC1,TAC1 ;GET LOGICAL BLOCK NUMBER OF SAT BLOCK. + HRL AC1,1(TAC) ;RETRIEVE THE CORRESPONDING CHECK-SUM. + MOVEM AC1,WNZBUF+4(AC2) ;STORE A POINTER WORD IN THE BUFFER. + MOVSI AC1,400000 ;RESTORE SATENT ENTRY TO CORRECT INITIAL VALUE. + MOVEM AC1,1(TAC) + AOS AC2 + ADDI TAC,SENTSZ + AOBJN TAC1,REFSRL ;IS THAT ALL THE POINTERS ? IF NOT, LOOP BACK. + + MOVE TAC,MFDBLK ;YES. + ADDI TAC,1(AC2) ;NOW COMPUTE LOGICAL BLOCK NUMBER OF THIS SAT + MOVEM TAC,WNZBUF+177 ; RETRIEVAL INFORMATION, AND STORE IT IN + ; THE LAST WORD OF THE BLOCK (THIS IS + ; REQUIRED FORMAT OF ALL RETRVL INFO). + + PUSHJ PDP,WNZWR ;WRITE THE *SAT*.SYS RETRVL INFO ONTO THE DISK. + JRST REFERR ;ERROR + + JRST CPOPJ1 ;***EXIT FROM PDP-10 DISK REFRESHER.***......... + + +;ROUTINE TO WRITE THE FIXED BLOCK OF VITAL STATISTICS ONTO THE DISK. + +WRSTAT: PUSHJ PDPWNZCLR ;CLEAR THE OUTPUT BUFFER + MOVE TAC,[XWD -WRSTSZ,0] +WRSTA1: MOVE TAC1,@WRSTA9(TAC) ;STORE KEY QUANTITIES IN THE OUTPUT BUFFER + MOVEM TAC1,WNZBUF(TAC) + AOBJN TAC,WRSTA1 + + MOVE TAC,[SIXBIT/STATBK/] ;STORE AN IDENTIFIER NEAR THE + MOVEM TAC,WNZBUF+^D126 ; END OF THE VITAL STATISTICS BLOCK. + + MOVEI TAC,STATBK + PUSHJ PDP,WNZWR ;WRITE THIS VITAL STATISTICS BLOCK ONTO THE DISK. + JRST WRSTA2 ;WRITE ERROR + JRST CPOPJ1 ;GOOD WRITE. ***SUBROUTINE EXIT***........... + + +WRSTA2: MOVEI TAC,WRSTM1 + PUSHJ PDP,ICONM ;PRINT ERROR MESSAGE IF THIS VITAL WRITE FAILS. + PUSHJ PDP,OPOUT + POPJ PDP, ;THEN ALSO GIVE AN ERROR RETURN FOR FURTHER ACTION. + +WRSTM1: ASCIZ /CANNOT WRITE VITAL STATISTICS BLOCK ON DISK. HELP!! +/ + +;TABLE OF POINTERS TO THE VITAL STATISTICS THAT ARE STORED IN "STATBK" ON THE DISK. + +WRSTA9: XWD ,MFDBLK ;LOGICAL BLOCK NUMBER OF MFD RETRIEVAL INFORMATION + XWD ,SATXWD ;LH = - NUMBER OF SAT BLOCKS ACTUALLY IN EXISTENCE. + ;RH = LOGICAL BLOCK NUMBER OF FIRST SAT BLOCK + XWD ,LBHIGH ;HIGHEST LEGAL LOGICAL BLOCK NUMBER ON DISK(S) + XWD ,LOWSWP ;LOWEST LOGICAL BLOCK NUMBER ALLOCATED FOR SWAPPING + XWD ,K4SWAP ;NUMBER OF 1K BLOCKS OF DISK SPACE FOR SWAPPING +IFN FTSWAP,< + XWD ,MAXSWP ;MAXIMUM NUMBER OF THOSE 1K BLOCKS ACTUALLY + ; USED SINCE THE DISK WAS LAST REFRESHED. +> +IFE FTSWAP,< + XWD 0,LOWSWP ;LOWSWP DOES DOUBLE DUMMY DUTY IN + ; NON-SWAPPING SYSTEM +> + WRSTSZ=.-WRSTA9 + +;ROUTINE TO READ IN THE FIXED BLOCK OF "VITAL STATISTICS" FROM +; THE DISK AND DISTRUBUTE THEM TO THE APPROPRIATE CORE LOCATIONS. + +RDSTAT: MOVEI TAC,STATBK + PUSHJ PDP,WNZRD ;READ IN THE VITAL STATISTICS BLOCK. + JRST RDSTA2 ;ERROR + MOVE TAC,WNZBUF+^D126 ;CHECK THE IDENTIFIER TO VERIFY THAT + CAME TAC,[SIXBIT /STATBK/] ; THE CORRECT BLOCK WAS READ. + JRST RDSTA2 ;ERROR, STATISTICS BLOCK APPARENTLY WAS CLOBBERED. + + MOVE TAC,[XWD -WRSTSZ,0] ;STORE AWAY THESE IMPORTANT PARAMETERS +RDSTA1; MOVE TAC1,WNZBUF(TAC) ; UNDER CONTROL OF A TABLE IN THE "WRSTAT" + MOVEM TAC1,@WRSTA9(TAC) ; ROUTINE WHICH WRITES OUT THE VITAL + AOBJN TAC,RDSTA1 ; STATISTICS BLOCK ONTO THE DISK. + + POPJ PDP, ;***SUBROUTINE EXIT***........ + +RDSTA2: MOVEI TAC,RDTM1 + ;PRINT ERROR MESSAGE IF THE VITAL + PUSHJ PDP,ICONM ; STATISTICS BLOCK CANNOT BE READ + PUSHJ PDP,OPOUT + PUSHJ PDP,REF ;GO THRU THE REFRESH DIALOGUE IN "ONCE". + JRST RDSTAT ;NOW TRY AGAIN. + +RDSTM1: ASCIZ /VITAL DISK STATISTICS LOST, SUGGEST REFRESHING! +/ + +;ROUTINE TO DETERMINE THE CURRENT SYSTEM'S DISK CAPACITY. I.E., THE NUMBER OF +; DISKS ATTACHED TO THE RC-10 DISK SYNCHRONIZER TODAY. + +;ON EXIT FROM THIS SUBROUTINE +; C(TAC) = HIGHEST LOGICAL DISK BLOCK NUMBER NOW EXTANT. + +CAPCTY: MOVEI TAC,NUMSAT + IMULI TAC,NUMBLK ;COMPUTE AND SAVE MAXIMUM POSSIBLE CAPACITY. + PUSH PDP,LBHIGH ;SAVE EXISTING VALUE OF HIGHEST LEGAL BLOCK NUMBER. + MOVEM TAC,LBHIGH ;TEMPORARILY CHANGE THIS VALYUE SO THAT THE VALIDITY + ; CHECK IN "DSKINT" WILL NOT FAIL SPURIOUSLY. + + MOVEI TAC,3 +CPCT1; PUSH PDP,TAC + PUSHJ PDP,WNZRD ;ATTEMPT TO READ FIRST BLOK OF EACH SUCCESSIVE DISK., + JRST CPCT3 ;ERROR + POP PDP,TAC + ADDI TAC,NUMBLK + CAMGE TAC,LBHIGH ;ALREADY TRIED ALL DISKS (MAXIMUM CAPACITY) ? + JRST CPCT1 ;NO, GO TRY THE NEXT ONE. + +CPCT2: SUBI TAC,1 + POP PDP,LBHIGH ;RESTORE PREVIOUSLY EXISTING VALUE OF THE HIGHEST + ; LEGAL LOGICAL DISK BLOCK NUMBER. + POPJ PDP, ;***SUBROUTINE EXIT***....... + +CPCT3: POP PDP,TAC + CONSZ DSK,NRDY ;NON-EXISTENT DISK? + JUMPN TAC,CPCT2 ;YES, THE LIMIT OF DISK STORAGE HAS BEEN FOUND. + ; HOWEVER, DISK 0 MUST ALWAYS BE PRESENT. + + MOVEI TAC,CPCTM1 ;NO, SOME OTHER TYPE OF READ ERROR. + PUSHJ PDP,IOCONM + PUSHJ PDP,OPOUT ;PRINT ERROR MESSAGE + POP PDP,LBHIGH + JRST CAPCTY ;TRY AGAIN +CPCTM1: ACSIZ /DISK READ ERROR DURING CAPACITY SEARCH INITIALIZATION +/ + + +;ROUTINE TO ASSURE THAT THE STATUS OF THE WRITE-LOCK SWITCHES ON THE +; DISK MAINTENANCE PANEL IS SUCH THAT THEY ARE PROTECTING "LESS THAN 0000". + +;THIS ROUTINE LOOPS PRINTING AN ERROR MESSAGE UNTIL THE SWITCHES ARE O.K. + +WRITLK: CONI DSK,TAC + TLNN TAC,13777 ;BOUNDARY ZERO AND MAINTENANCE-SEGMENT OFF ? + TLNN TAC,B53 ;YES, IS ROTARY SWITCH SET + ; TO EITHER X UNDER OR OVER(AS OPPOSED + ; TO UNDER OR X OVER) + JRST WRLK8 ;NO. GO PRINT ERROR MESSAGE AND LOOP. + +;AN UNFORTUNATE HARDWARE OVERSIGHT MAKES IT IMPOSSIBLE TO SENSE THE DIFFERENCE +; BETWEEN "PROTECT LESS THAN" AND "PROTECT LESS THAN OR EQUAL". THEREFORE +; THIS ROUTINE MUST ACTUALLY TRY WRITING ON TRACK 0000. + MOVE TAC,[252525252525] + MOVEM TAC,WNZBUF + MOVE TAC,[XWD WNZBUF,WNZBUF+1] + + BLT TAC,WNZBUF+177 + MOVEI TAC,0 + PUSHJ PDP,WNZWR ;WRITE PATTERN IN BLOCK 0. + JRST WRLK2 ;ERROR + POPJ PDP, ;***GOOD EXIT FROM WRITLK SUBROUTINE***......... + +WRLK2: MOVEI TAC,WRLKM1 + CONSZ DSK,WRPE ;WRITE-PROTECTION ERROR ? + ;YES, PROTECT SWITCH ERRONEOUSLY SET ON "LESS THAN + ; OR EQUAL" INSTEAD OF "LESS THAN". + ;NO, SOME OTHER FAILURE DURING THE WRITE OF BLOCK 0. +WRLK8: MOVEI TAC,WRLKM2 ;WRITE-LOCK SWITCHES SET INCORRECTLY. +WRLK9: PUSHJ PDP,ICONM ;PRINT ERROR MESSAGE + PUSHJ PDP,OPOUT + JRST WRITLK ;GO TRY AGAIN + +WRLKM1: ASCIZ /DISK BLOCK 0 WRITE ERROR DURING WRITE-LOCK CHECK. +/ +WRLKM2: ASCIZ /"MAINTENANCE SEGMENT" SWITCH MUST BE OFF. AND +DIS WRITE PROTECTION SWITCHES MUST BE SET TO 0000 AND "LESS THAN", +FIX THEM ! ! +/ + +;DISK READING ROUTINE FOR USE ONLY DURING ONCE-ONLY CODE. +; AVOIDS USING THE MONITOR OUFUFS AND INTERRUPT STRUCTURE. + +;ON ENTRY TO THIS SUBROUTINE, TAG CONTAINS THE LOGICAL BLOCK NUMBER OF THE DISK +; BLOCK WHICH IS TO BE READ INTO THE ONCE-ONLY DISK BUFFER AREA. + +WNZRD: CONO DSK,DATERR!DEVERR!SETERR!RESETB ;CLEAR THE DISK SYNCHRONIZER + CONSZ DSK,BUSYBT!DONEFLG + JRST WNZRD ;DON'T PROCEED UNLESS THE CLEAR WORKED. + + PUSH PDP,DSKFDG ;SAVE THIS INSTRUCTION FROM "DSKINT" + MOVE TAC1,[HRRZI TAC,0] ;NOW TAMPER WITH THAT SAVED LOCATION SO + MOVEM TAC1,DSKFDG ; THAT DSKINT WILL NOT ENABLE ANY INTERRUPT CHANNEL. + MOVE TAC1,[XWD -200,WNZBUF-1] + PUSHJ PDP,DFRED ;CALL DEVICE-DEPENDENT ROUTINE IN "DSKINT" DIRECTLY. +WNZRDC: POP PDP,DSKFDG ;RESTORE THE MOLESTED INSTRUCTION IN DSKINT. + + PUSHJ PDP,WNZWAT ;WAIT UNTIL THE READ IS FINISHED. + + CONSZ DSK,DATERR!DEVERR!SETERR ;ANY ERRORS ? + JRST WNZRDX ;YES, GIVE ERROR RETURN. + MOVE TAC1,RCXCCW ;NO, BUT CHECK THAT THE FINAL VALUE OF THE + CAMN TAC1,RCXFIX ; CHANNEL CONTROL WORD WAS AS EXCPECTED ALSO. + AOS (PDP) ;***GOOD RETURN***........ +WNZRDX: POPJ PDP, ;ERROR RETURN, + + +;DISK WRITING ROUTINE FOR USE ONLY DURING ONCE-ONLY CODE. +; AVOIDS USING THE MONITOR QUEUES AND INTERRUPT STRUCTURE. + +;ON ENTRY TO THIS SUBROUTINE, TAC CONTAINS THE LOGICAL BLOCK NUMBER OF THE DISK +; BLOCK WHICH IS TO BE WRITTEN ONTO THE DISK FROM THE ONCE-ONLY DISK BUFFER AREA. + +WNZWR: CONO DSK,DATERR!DEVERR!SETERR!RESCIG ;CLEAR THE DISK SYNCHRONIZER. + CONSZ DSK,BUSYBT!DONEFLG + JRST WNZWR ;DON'T PROCEED UNLESS THAE CLEAR WORKED. + + MOVEM TAC,LBSAVE ;SAVE LOGICAL BLOCK NUMBER IN CASE AN ERROR RETURN + ; MUST BE TAKEN FROM THE "REFRESH" SUBROUTINE. + PUSH POP,DSKFDG ;SAVE THIS ISNTRUCTION FROM "DSKINT". + MOVE TAC1,[HRRZI TAC,0] ;NOW TAMPER WITH THAT SAVED LOCATION SO + MOVEM TAC1,DSKFDG ; THAT DSKINT WILL NOT ENABLE ANY INTERRUPT CHANNEL. + MOVE TAC1,[XWD -200,WNZPUT-1] + PUSHJ PDP,DFWRT ;CALL DEVICE-DEPENDENT ROUTINE IN "DSKINT" DIRECTLY. + + JRST WNZRDC ;THE REMAINDER OF THE WRITE ROUTINE IS IDENTICAL + ; TO THE READ ROUTINE + +;SUBROUTINE TO WATCH FOR THE DONE FLAG TO COME ON AND TIME OUT IF +; IT DOESN'T COME UP SOON ENOUGH (SAY 5 SEC OR SO). + +WNZWAT: MOVE TAC,[^D1000000] ;AT MOST ONE MILLION TIMES THRU THE CONSZ-SOJG LOOP +WNZWTL: CONSZ DSK,DONEFLG ;DONE FLAG ON YET ? + POPJ PDP, ;YES, GOOD EXIT....... + SOJG TAC,WNZWTL ;NO, TIMED OUT YET ? + ;YES, PRINT "DISK HUNG" ERROR MESSAGE. + MOVEI TAC,WATMSG + PUSHJ PDP,ICONM + PUSHJ PDP,OPOUT + POP PDP,TAC ;SKIP UP A SUBROUTINE LEVEL, AND GIVE AN + POPJ PDP, ; ERROR RETURN FROM WNZRD OR WNZWR....... +WATMSG: ASCIZ /DISK HUNG. +/ + +;SUBROUTINE TO SET SPECIFIED BITS IN A SAT BLOCK WHILE FORMING IT IN WNZBUF + +;ENTRY CONDITIONS -- C(TAC) = FIRST BIT NUMBER TO SET (NUMBERED BEGINNING AT 0) +; C(TAC1) = NUMBER OF BITS TO SET + +SETWNZ: MOVE AC1,TAC1 + IDIVI TAC,^D36 + MOVSI AC2,400000 + MOVNS TAC1 + ROT AC2,(TAC1) +STWNZ1: ORM AC2,WNZBUF(TAC) + ROT AC2,-1 + JUMPG AC2,STWNZ2 + ADDI TAC,1 +STWNZ2: SOJN AC1,STWNZ1 + POPJ PDP, ;SUBROUTINE EXIT........... + +;SUBROUTINE TO CLEAR THE ONCE-ONLY OUTPUT BUFFER, WNZBUF +WNZCLR: SETZM WNZBUF + MOVE TAC,[XWD WNZBUF,WNZBUF+1] + BLT TAC,WNZBUF+177 + POPJ PDP, ;SUBROUTINE EXIT........... + +;SUBROUTINE TO MASK THE TIME, DATE, AND DATA MODE (=14 FOR BINARY MODE0 INTO ACCUMU- +; LATOR TAC IN THE FORMAT USED IN WORD 3 OF A DISK RETRIEVAL INFORMATION BLOCK. + +MDTMDT: PUSH PDP,TAC + MOVE TAC,TIME ;GET TIME IN JIFFIES. + IDIVI TAC,JIFMIN ;CONVERT TO MINUTES + LSH TAC,^D12 + IOR TAC,THSDAT ;TODAY'S DATE + TLO TAC,14B<^D12*^D18> ;BINARY MODE + IORM TAC,(PDP) + POP PDP,TAC + POPJ PDP, ;SUBROUTINE EXIT............ + + +;ERROR EXIT FROM "REFRESH" WHEN A BAD WRITE ON THE DISK OCCURS DURING REFREHSING. + +REFER1: POP PDP,TAC ;CORRECT PDP IF EXTRA PUSH HAD OCCURRED. + +REFERR: MOVE TAC,LBSAVE ;GET BLOCK NUMBER FOR THE ERROR MESSAGE AT REF4. + POPJ PDP, ;THIS NO-SKIP RETURN RE-ENTERS THE REFRESH DIALOGUE. + + + +;MISCELLANEOUS STORAGE SPACE USED BY THE PDP-10 DISK REFRESHING ROUTINE. + +CHKSAV: 0 +LBSAVE: 0 + +WNZBUF: BLOCK 200 ;BUFFER FOR READING AND WRITING DISK + ; BLOCKS DURING THE ONCE-ONLY CODE. + +LOWSWP: 0 ;LOWEST LOGICAL BLOCK FOR SWAPPING + + > ;END OF REFRESH PROCEDURE FOR THE RD10 DISK. + + > ;CLOSE AN EVEN EARLIER FTDISK CONDITIONAL. + +INTERNAL FTCHECK +IFN FTCHEC,< + +EXTERNAL CHKREG,CHKEND,CHECK,MONPTR,MONSUM + +CK: MOVEI TAC,CHKBEG + SUBI TAC,CHKEND + HRLI TAC,CHKBEG + MOVSS TAC + PUSHJ PDP,CHECK ;COMPUTE AND STORE CHECKSUM OF THE PURE AREA OF + MOVEM TAC1,MONSUM ; THE TIME-SHARING MONITOR. + POPJ PDP, + +> + +ONCEND: END + diff --git a/src/patch.mac b/src/patch.mac new file mode 100644 index 0000000..5b30e08 --- /dev/null +++ b/src/patch.mac @@ -0,0 +1,18 @@ +TITLE PATCH - PATCH AREA FOR T.S. MONITOR +SUBTTL A. FRANZ/RAP TS3.19 6 SEP 68 V001 + +;THIS PROGRAM SHOULD BE LOADED AFTER LAST NEEDED PROGRAM +;BUT BEFORE SYSMAK,EXEC DDT,USER DDT AND ONCE + +ENTRY PATCH +PATCH: BLOCK 300 + +;SET JOBDDT NON-ZERO SO SYMBOLS WILL BE SAVED. + +ZZ=. +LOC 74 + EXP 141 +RELOC ZZ + + END + diff --git a/src/pltser.mac b/src/pltser.mac new file mode 100644 index 0000000..8af014f --- /dev/null +++ b/src/pltser.mac @@ -0,0 +1,120 @@ +TITLE PLTSER - PLOTTER SERVICE ROUTINE +SUBTTL T. EGGERS/GBH/TNM 20 MAY 1969 V012 +XP VPLTSR,012 ;PUT VERSION NUMBER IN STORAGE MAP AND GLOB LISTING + +PLT=140 ;DEFINE DEVICE CODE +PLTUP=200000 ;LIFT PEN WHEN OUTPUT FINISHED + +ENTRY PLTSER +PLTSER: + +;PLOTTER DEVICE DATA BLOCK +PLTDDB: SIXBIT /PLT/ +PLTCHR: XWD HUNGST*12,^D36 ;XWD (HUNG TIMEOUT),(BUFFER SIZE) +PLTIOS: 0 + PLTDSP ;DISPATCH TABLE ADDRESS + XWD DVOUT,14403 ;XWD (OUTPUT DEVICE),(BIN,IMAGE,TEXT LEGAL) + 0 + 0 +PLTPTR: 0 ;OUTPUT BYTE POINTER +PLTADR: XWD PROG,0 +PLTCTR: 0 ;OUTPUT BYTE COUNTER + +EXTERNAL OUT,SETACT,PLTCHN,PLTCHL,IOSET,ADVBFE,ADRERR,CPOPJ1 +EXTERNAL SETIOD,STOIOS,CLRACT,IULLINP,PLTSAV,IADRCK + +INTERN PLTDDB,PLTINT,PLTDSP + ;DISPATCH TABLE + + JRST PLTINT ;INITIALIZE + JRST PLTHNG ;HUNG DEVICE ERROR +PLTDSP: JRST PLTREL ;RELEASE + JRST PLTCLS ;CLOSE + JRST PLTOUT ;OUTPUT + JRST ILLINP ;INPUT + +PLTCLS: TLO IOS,PLTUP ;PLOTTER END FLAG SET + MOVEM IOS,PLTIOS + JRST OUT ;DO AN OUTPUT + +PLTINI: +PLTHNG: +PLTREL: CONO PLT,0 ;DEASSIGN PI CHANNEL, CLEAR DONE + HLLZS PLTINT ;REMOVE PLOTTER FROM DEVICE CHAIN + POPJ PDP, + + ;HERE BEGINS THE "OUTPUT" UUO + +PLTOUT: PUSHJ PDP,PLTSET ;SETUP BYTE POINTER AND COUNTER + JRST ADRERR ;ADDRESS ERR RETURN FROM PLTSET + PUSHJ PDP,SETACT ;SET DEVICE ACTIVE BIT + TLO IOS,IO + CONO PLT,PLTCHN ;ASSIGN PRIORITY CHANNEL + MOVSI TAC,10 + HLRM TAC,PLTINT ;PUT PLOTTER INTO DEVICE CHAIN + TLZN IOS,IOBEG ;FIRST OUTPUT UUO? + JRST .+3 ;NO + MOVEI TAC,40 ;YES, START PLOTTER WITH PEN UP + TLZ IOS,PLTUP ;INIT "CLOSE" BIT + MOVE IOS,PLTIOS + DATAO PLT,TAC ;START PLOTTER BY SENDING 0 OR 40 + POPJ PDP, + ;FROM HERE THROUGH PLTOFF IS INTERRUPT SERVICE + +PLTINT: CONSO PLT,10 ;PLOTTER DONE FLAG SET? + JRST .-1 ;NO, CHAIN TO NEXT DEVICE + SOSGE PLTCTR ;OUTPUT CHARACTERS LEFT? + JRST PLT1 ;NO + MOVEM TAC,TACSAV# ;YES, SAVE TAC + ILDB TAC,PLTPTR ;GET NEXT CHARACTER + DATAO PLT,TAC ;SEND CHARACTER + MOVE TAC,TACSAV# ;RESTORE TAC + JEN @PLTCHL ;DISMISS INTERRUPT + +PLT1: JSR PLTSAV ;SAVE AC'S. SET UP PUSH DOWN POINTER + MOVEI DEVDAT,PLTDDB + PUSHJ PDP,IOSET ;SETS UP PROG AND IOS + PUSHJ PDP,ADVBFE ;ADVANCE AND LOOK AT NEXT BUFFERE + JRST PLTOFF ;NO MORE DATA AVAILABLE + PUSHJ PDP,PLTSET ;SETUP BYTE POINTER AND COUNTER + JRST PLTOFF ;ADDRESS ERROR RET FROM PLTSET +PLT2: TLZE IOS,IOW + PUSHJ PDP,SETIUOD ;LET JOB START AGAIN + JRST STOIOS ;EVENTUALLY DISMISS INTERRUPT. IF ADVBFE + ;FOUND MORE DATA (IT SKIPPED), ANOTHER + ;INTERRUPT WILL IMMEDIATELY OCCUR BUT + ;IT WILL BE HANDLED WITHOUT GOING TO PLT1 + +PLTOFF: CONO PLT,0 ;SHUT DOWN PLOTTER + HLLSZ PLTINT ;REMOVE PLOTTER FROM CHAIN + PUSHJ PDP,CLRACT + TLZE IOS,PLTUP ;HAS THE "CLOSE" BEEN DONE? + DATAO PLT,[40] ;YES, LIFT PEN + JRST PLT2 + ;THIS SUBROUTINE CALCULATES A BYTE POINTER AND A BYTE COUNTER FOR +;THE BUFFER TO BE OUPUT, THE LAST WORD OF BUFFER IS ADR CHECKED TO BE IN USER AREA +; PUSHJ PDP,PLTSET +; RETURN 1 ;ADDRESS ERROR RETURN +; RETURN 2 ;GOOD RETURN + +PLTSET: MOVEI TAC,@PLTADR ;GET ADDRESS OF CURRENT BUFFER + ADD TAC,[POINT 6,1,35] ;CONVERT TO 6 BIT BYTE POINTER WITH + ;ADDRESS OF BUFFER WORD COUNT + TRNN IOS,16 ;IS THIS A TEST DATA MODE? + TLO TAC,[POINT 7,0,35] ;YES, CONVERT TO 7 BIT BYTE POINTER + MOVEM TAC,PLTPTR ;SAVE BYTE POINTER + HRRZ TAC,@TAC ;GET BUFFER WORD COUNT + MOVEM TAC,PLTCTR ;SAVE AS POSITIVE WORD COUNT + ADD TAC,PLTADR ;CALCULATE (LAST ADR IN BUF)-1 (RELATIVE) + MOVEI TAC,1(TAC) ;GET LAST ADR IN BUF (RELATIVE) + PUSHJ PDP,IADRCK ;ADDRESS CHECK. OK? + POPJ PDP, ;NO, OUTSIDE. RETURN WITH NO SKIP + MOVEI TAC,6 ;IMAGE OR BIN MODES - 6 BYTES/WORD + TRNN IOS,16 ;IS OUTPUT A TEXT MODE (0 OR 1)? + MOVEI TAC,5 ;YES, 5 BYTES/WORD + IMULM TAC,PLTCTR ;CHANGE WORD COUNT TO BYTE COUNT + JRST CPOPJ1 ;RETURN WITH A SKIP + + LIT + VAR +PLTEND: END diff --git a/src/ptpser.mac b/src/ptpser.mac new file mode 100644 index 0000000..9eca6b3 --- /dev/null +++ b/src/ptpser.mac @@ -0,0 +1,246 @@ +TITLE PTPSER - PAPER TAPE PUNCH SERVICE ROUTINE +SUBTTL /RCC TS 15 APR 69 V401 (FROM 002) +XP VPTPSR,401 + ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP + +EXTERNAL PTPCHN, PTPSAV, ADVBFE, ITMCT1, SETIOD, SETBYT, IOSET, CKS12 +EXTERNAL ILLINP, OUT, WAIT1,PTPCHL,PIOMOD +EXTERNAL SETACTSTOIOS +INTERNAL PTPINI,PTPDSP + +;PTP DEVICE DATA BLOCK LINKAGE + +ENTRY PTPSER + +PTPSER: + , PARAMETER ASSIGMENTS + +, PTP CONTROL REGISTER + PTPDON=10 + +, FORMAT CONTROL + PDPFDN=200 + +, SPECIAL IO STATUS WORD ASSIGNMENTS + IODISC=400000 + PTPFED=200000 + PTPEOL=20000 + PTPBIN=4000 ;CHECKSUM BINARY + PTPIB=2000 ;IMAGE BINARY + +; SPECIAL ASCII CHARACTERS +; DEFINED WITH THE CORRECT PARITY + RUBOUT=377 + HORTAB=11 + VERTAB=213 + FORMED=14 + +IFN FTCHECK+FTMONP,< +EXTERNAL PTPDDB,PTPIOS,PTPPTR,PTPADR,PTPCTR,PTPCNT,PTPCHA,PTPSIO,PTPCON +> +IFE FTCHECK+FTMONP,< +;PTP DEVICE DATA BLOCK + + INTERN PTPDDB +PTPDDB: + SIXBIT /PTP/ + XWD ^D10*HUNGST,41 +PTPIOS: 0 + EXP PTPDSP + XWD DVPTP+DVOUT,14403 + 0 + 0 +PTPPTR: 0 +PTPADR: XWD PROG,0 +PTPCTR: 0 +PTPCNT: 0 +PTPCHA: 0 +PTPSIO: 0 +PTPCON: 0 +> + ,PTP SERVICE DISPATCH TABLE + JRST PTPINI ;INITILIZE + JRST PTPREL ;HUNG DEVICE TIME-OUT ERROR, +PTPDSP: JRST PTPREL ;RELEASE + JRST PTPCLS ;CLOSE + JRST PTPOUT ;OUTPUT + JRST ILLINP ;INPUT + PTPINI: +PTPREL: CONO PTP,0 + HLLZS PTPCON ;CLEAR CONSO FLAGS BITS + POPJ PDP, ;RETURN + + +PTPCLS: PUSHJ PDP,OUT ;OUTPUT REMAINING BUFFERS + PUSHJ PDP,WAIT1 ;WAIT FOR IOACT=0. + MOVE IOS,PTPIOS ;C(IOS):=C(PTPIOS) + TLO IOS,IODISC+PTPFED+IOW ;IODISC:=IOW:=PTPFED:=1 + PUSHJ PDP,SETACT ;SET ACTIVE FLAG,STORE IOS,AND + ;RESET HUNG DEVICE TIMEOUT COUNT + MOVEI TAC,200 + MOVEM TAC,PTRCNT ;PTPCNT:=200 + MOVEI TAC,PTPDON ;SET CONSO FLAG + HRRM TAC,PTPCON + MOVEI TAC,PTPCHN ;TAC:=PTPCHN,PI CHANNEL ASSIGNMENT + CONO PTP,PTPDON(TAC) ;DONE FLAG:=1, ASSIGN PI CHANNEL + JRST WAIT1 ;WAIT FOR IOACT=0, ALL BUFFERS FINISHED + PTPOUT: TLZE IOS,IOBEG ;VIRGIN DEVICE?> (IOBEG:=0) + JRST PTPIN0 ;YES + +PTPIN1: + TLZ IOS,IODISC ;CLEAR DISCONNECT BIT + PUSHJ PDP,SETACT ;SET ACTIVE FLAG,STORE IOS, AND + ;RESET HUNG DEVICE TIMEOUT COUNT + HRLI TAC,PTPDON ;CONSO FLAG + HRRI TAC,PTPCHN ;CONO FLAGS + TRO TAC,PTPDON + STARTDV PTP + POPJ PDP, ;RETURN + +PTPIN2: LDB TAC,PIOMOD + + TLO IOS, IOFST+PTPFED+IO ;IOFST:=PTPFED:=IO:=1 + TLZ IOS,PTPBIN+PTPIB ;CLEAR BINARY AND IMAGE BINARY BITS + CAIN TAC,IB ;IMAGE BINARY + TLO IOS,PTPIB ;YES + CAIN TAC,B ;MODE=BINARY? + TLO IOS,PTPBIN ;YES, PTPBIN:=1 + MOVEI TAC,PTPFDN ;PTPCNT:=PTPFDN + MOVEM TAC,PTPCNT + PUSHJ PDP,SETBYT ;SETBYT + HLLM TAC,PTPPTR ;PTPPTR0-5:=PTPPTR12-13:=0,PTPPTR6-11:=BYTE + ;SIZE; PTPPTR14-17:=PROG + JRST PTPIN1 + ,PUNCH INTERRUPT SERVICE + +PTPINT: CONSO PTP,@PTPCON + JRST PTPINT + MOVEM IOS,PTPSIO ;PTPSIO:=C(IOS) SAVE IOS + MOVE IOS,PTPIOS ;IOS:=C(PTPIOS) + TLNE IOS,PTPFED ;FEED REQUEST> (PTPFED=1?) + JRST PTPS2 ;YES + MOVE IOS,PTPSIO ;RESTORE IUOS + JSR PTPSAV ;SAVE ACS AND ESTABLISH PDP + MOVEI DEVDAT,PTPDDB + PUSHJ PDP,IOSET ;PROG:=(JBTADR 18-35),ITEM:=C(DEVCTR) + ;IOS:=C(PTRIOS) + TLZE IOS,IODISC ;DISCONNECT? (IODISC=1?) + JRST PTPADV ;YES + TLZE IOS,IOFST ;IOFST=1? IOFST:=0 + JRST PTP9 ;YES + TLNN IOS,PTPBIN+PTPIB ;BINARY PUNCH MOD? + JRST PTP3 ;NO + + MOVE TAC,PTPCHA ;BINARY OUTPUT BYTE SIZE=36 + ROT TAC,6 + MOVEM TAC,PTPCHA + ANDI TAC,77 ;TAC:=XX, SIXBIT SUB-BYTE + ADDI TAC,200 + DATAO PTP,TAC ;PUNCH 2XX + SOSL PTPCNT ;C(PTPCNT):=C(PTPCNT)-1, WORD DONE? + JRST PTPXIT ;NO + SOSL PTPCTR ;C(PTPCTR):=C(PTPCTR)-1, ITEM COUNT < 0? + JRST PTPB1 ;NO + TLNE IOS,PTPIB ;IMAGE BINARY? + TLOA IOS,IODISC ;YES, SUPPRESS TAPE FEED. + TLO IOS,IODISC+PTPFED ;IODISC:=PTPFED:=1 + MOVEI TAC,10 + MOVEM TAC,PTPCNT ;PTPCNT:=10 + JRST PTPXIT + +PTPB1: MOVEI TAC,5 ;PTPCNT:=5 + MOVEM TAC,PTPCNT + MOVE DAT,@PTPPTR ;PTPCHA:=OUTPUT DATA WORD + AOS PTPPTR ;PTRPTR:=C(PTRPTR)+1. ADVANCE ITEM POINTER. + MOVEM DAT,PTRCHA + JRST PTPXIT + PTP3: DATA PTP,PTPCHA ;PUNCH CHARACTER + TRNE IOS,14 ;IS MODE AN ALPHA MODE + JRST PTP1 ;NO + MOVE DAT,PTPCHA + CAIE DAT,HORTAB ;HORIZONTAL OR VERTICAL TAB? + CAIN DAT,VERTAB + JRST PTPP1 ;YES + CAIE DAT,FORMFD ;FORM FEED? + JRST PTP1 ;NO + TLO IOS,PTPFED+PTPEOL ;PTPFED:=PTPEOL:=1 + MOVEI DAT,20 + MOVEM DAT,PTPCNT ;PTPCNT:=20 + JRST PTPXIT + EXTERNAL PEVEN8 ;IN IOCSS, FOR PARITY IN ASCII + +PTP1: SOSGE PTPCTR ;C(PTPCTR):=C(PTPCTR)-1, IS C(PTPCTR)<0? + JRST PTP5 ;YES + ILDB TEM,PTPPTR ;TEM:=OUTPUT ITEM + LDB TAC,PIOMOD + CAIN TAC,I ;MODE=IMAGE? + JRST PTP6 ;YES + IORI TEM,200 ;NO, INSERT EIGHTH HOLD + TRNN TAC,14 ;AN ASCII MODE? + PUSHJ PDP,PEVEN8 ;YES, TURN EIGHTH HOLE OFF IF + ; APPROPRIATE TO GET EVEN PARITY + JUMPE TEM,PTP1 ;IF AN ASCII NULL, IGNORE IT + ; THEY ARE PUT IN BY PTPFED STUFF + ; ELSE FALL INTO PTP6 + +PTP6: MOVEM TEM,PTPCHA ;PTPCHA:=OUTPUT ITEM + JRST PTPXIT + +PTPS2: CLEARM PTPCHA ;PUNCH FEED + DATAO PTP,PTPCHA + SOSG PTPCNT ;COUNT FEED LINES + TLZ IOS,PTPFED ;PTPFED:=0 + MOVEM IOS, PTPIOS ;PTPIOS:=C(IOS) + MOVE IOS,PTPSIO ;RESTORE IOS + JEN @PTPCHL ;DISMISS + + +PTP5: TLO IOS,IODISC ;IODISC:=1 + JRST PTPXIT + +PTPBN: HRRZ TAC1,PTPADR ;TAC1:=BUFFER ADDRESS + PUSHJ PDP,CKS12 ;TAC:=CALCULATE CHECKSUM + ADD TAC1, PTPADR + HLLM TAC,@TAC1 ;STORE CHECKSUM IN LEFT HALF OF FIRST BUFFER WORD, + + JRST PTPB1 + PTPADV: PUSHJ PDP,ADVBFE ;ADVANCE BUFFER + JRST PTPDSC ;EXIT1. NEXT BUFFER EMPTY + TLZE IOS,IOW ;IN A WAIT? IOW:=0 + PUSHJ PDP,SETIOD ;YES. IOWS:=1 +PTP9: TLZ IOS,IOFST ;IOFST:=0 + MOVE TAC,PTPADR + AOS TAC + HRRM TAC,PTPPTR ;PTPTR18-35:=C(PTPADR18-35)+1 + HRRZ ITEM,@TAC ;ITEM:=WORD COUNT + LDB TAC1,PTP91 ;PICK UP BYTE SIZE + PUSHJ PDP,ITMCT1 ;ITEM:=WORD COUNT*[36/BYTE SIZE] + MOVEM ITEM,PTPCTR ;PTPCTR:=C(ITEM) + JUMPE ITEM,PTPADV ;IS ITEM COUNT=0? + TLNE IOS,PTPBIN ;BINARY PUNCH MODE? + JRST PTPBN ;YES + TLNN IOS,PTPIB ;IMAGE BINARY? + JRST PTP1 + AOS PTPPTR ;YES + + SOS PTPCTR + JRST PTPB1 + +PTP91: POINT 6,PTRPTR,11 + +PTRP1: MOVEI DAT,RUBOUT ;PTPCHA:=RUBOUT + MOVEM DAT,PTPCHA + TLO IOS,PTPEOL ;PTPEOL:=1 + JRST PTPXIT + +PTPDSC: PUSHJ PDP,PTPREL ;CLEAR PTP CONTROL REG AND CONSO BITS + TRZ IOS,IOACT ;IOACT:=0 + TLO IOS,IOFST ;IOFST:=1 + TLZE IOS,IOW ;IN A WAIT? IOW:=0 + PUSHJ PDP,SETIOD ;YES. IOWS:=1 + +PTPXIT: JRST STOIOS ;STORE IOS, RESET HUNG TIMEOUT COUNT AND + ;DISMISS INTERRUPT + +END + diff --git a/src/ptrser.mac b/src/ptrser.mac new file mode 100644 index 0000000..fd8b81e --- /dev/null +++ b/src/ptrser.mac @@ -0,0 +1,157 @@ +TITLE PTRSER - PAPER TAPE READER SERVICE ROUTINE FOR BOTH PDP-6 AND PDP-10 +SUBTTL /GBH/TNM TS 14 APR 69 V004 +XP VPTRSR,004 + ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP +EXTERNAL STOSQD,ILLOUT +EXTERNAL STODAT, IOSET, SETBYT, ADVBFF +EXTERNAL SETIOD, PTRSAV, PTRCHN,PIOMOD +EXTERNAL SETACT,STOIOS,CPOPJ1,PTRMSK +INTERNAL PTRINT,PRTDSP + +;PTR DEVICE DATA BLOCK LINKAGE + +ENTRY PTRSER +PTRSER: + ,PARAMETER ASSIGNMENTS +, PTR CONTROL REGISTER + PTRDON=10 ;DONE FLAG + PTRBSY=20 ;BUSY FLAG + PTRBIN=40 ;BINARY READ MODE + POW=400 ;POWER, ON=1 + +, SPECIAL IO STATUS WORD ASSIGNMENTS + IODISC=400000 + PTRFCI=200000 + PTRPOW=100000 +, SPECIAL ASCII CHARACTERS + RUBOUT=177 + + +INTERNAL FTCHECK,FTMONP +IFN FTCHECK+FTMONP,< +EXTERNAL PTRDDB,PTRIOS,PTRADR,PTRPTR,PTRCTR,PTRSVC,PTRSV1,PTRCON +> +IFE FTCHECK+FTMONP,< +;PTR DEVICE DATA BLOCK + INTERN PTRDDB + +PTRDDB: +PTRDAT: SIXBIT /PTR/ + XWD ^D30*HUNGST,41 +PTRIOS: 0 + EXP PTRDSP + XWD DVPTR+DVIN,14403 + 0 + 0 +PTRADR: XWD PROG,0 +PTRPTR: 0 +PTRCTR: 0 +PTRSVC: 0 +PTRSV1: 0 +PTRCON: 0 +> + ,PTR SERVICE DISPATCH TABLE + JRST PTRINI ;INITILIZE + JRST PTRREL ;HUNG DEVICE TIME-OUT ERROR. +PTRDSP: JRST PTRREL ;RELEASE + POPJ PDP, ;CLOSE + JRST ILLOUT ;OUTPUT + TLNN IOS,IOBEG ;INPUT, VIRGIN DEVICE? + JRST PTRIN1 ;NO + TLO IOS,IOFST ;IOFST:=1. NEXT ITEM WILL BE FIRST ITEM OF A BUFFER + TLZ IOS,PTRPOW+PTRFCI+IODISC + PUSHJ PDP,SETBYT ;TAC0-5:=TAC12-13:=0,TAC6-11:=BYTE SIZE + ;TAC14-17:=PROG + MOVEM TAC,PTRPTR ;PTRPTR:=C(TAC) + CONSZ PTR,POW ;IS POWER ON?> + TLO IOS,PTRPOW LYES. PTRPOW:=1 +PTRIN1: + MOVEI TAC1,PTRBSY + TLZN IOS,IOBEG ;VIRGIN? + MOVEI TAC1,PTRDON ;NO + + TLNN IOS,PTRPOW + ANDI TAC1,PTRMSK ;PTRMSK IUS DEFINED IN BUILD AS -1 PDP-6 AND 0 PDP-10 + PUSHJ PDP,SETACT ;IOACT:=1 + MOVEI TAC,PTRCHN(TAC1) + LDB TAC1,PIOMOD + CAIE TAC1,1B ;IMAGE BINARY? + CAIN TAC1,B ;OR BINARY + IORI TAC,PTRBIN + HRLI TAC,PTRDON + STARTDV PTR + POPJ PDP, + PTRINT: CONSO PTR,@PTRCON + JRST PTRINT + SKIPL PTRIOS ;DISCONNECT REQUEST? (IODISC=1?) + DATAI PTR,PTRSV1 ;PTRSV1:=DATA ITEM. + JSR PTRSAV ;SAVE ACCUMULATORS AND ESTABLISH PDP + MOVEI DEVDAT,PTRDDB ;SET UP DEVDAT + PUSHJ PDP,IOSET ;PROG:=C(JBTADR18-35),ITEM:=C(DEVCTR) + ;IOS=C(PTRIOS) + MOVE DAT,PTRSV1 ;DAT:=DATA ITEM + CONSO PTR,POW ;PTR POWER ON? + JRST PTREND ;NO + TLON IOS,PTRPOW ;PTRPOW=1? PTRPOW:=1 + JRST PTREX1 ;NO + TLZE IOS,IODISC ;DISCONNECT REQUEST? + TLZE IOS,PTRFCI ;IS PTRFCI=1? + MOVE DAT,PTRSVC ;YES. DAT:=C(PTRSVC) +PTRIN0: TRNE IOS,B ;MODE=BINARY? + JRST PTRI0 ;YES + ANDI DAT,177 ;MASK OUT PARITY BIT + CAIN DAT,RUBOUT ;LAST CHAR A RUBOUT? + JRST PTREX1 ;YES + JUMPE DAT,PTREX1 ;DAT=0? + +PTRIO: PUSHJ PDP,STODAT ;NO STORE DATA WORD. + JFCL ;CHECKSUM ERROR + JRST PTRI1 ;BLOCK FULL OR BLOCK COMPLETE + JRST PTREX1 ;DATA STORED CORRECTLY. + +PTRI1: PUSHJ PDP,ADVBFF ;ADVANCE BUFFER + TLO IOS,IODISC ;NEXT BUFFER IS FULL. IODISC:=1 +PTRI2: TLO IOS,IOFST ;IOFST:=1, NEXT ITEM IS FIRST ITEM OF A BUFFER. + TLZE IOS,IOW ;IN A WAIT? IOW:=0 + PUSHJ PDP,SETIOD ;IOWS:=1 + JRST PTREX1 + ,COME HERE WHEN THE READER IS SHUT OFF + +PTREND: TDZ IOS,[XWD PTRPOW,IOACT] ;PTRPWO:=0,IOACT:=0 + PUSHJ PDP,PTRREL ;CLEAR PTR AND CONSO FLAG + LDB TAC,IOMOD + TLO IOS,IOEND+IOREG + CAIE TAC,B ;CHECKSUM BINARY BLOCK ..OF? + JRST PTREI ;NO + TLNN IOS,IOEST ;IOEST=1? + TRO IOS,IOIMPM ;NO. BINARY BLOCK INCOMPLETE. + JRST PTRI2 +PTREI: PUSHJ PDP,STOSQD ;FINISH THE BUFFERE, STORE WORD COUNT + JFCL + PUSHJ PDP,ADVBFF ;ADVANCE BUFFERE + JFCL + JRST PTRI2 + ,DISCONNECT PTR +PTREX: SKIPG @PTRADR ;IOUSE=1? + JRST PTREX0 ;YES. + DATAI PTR,DAT + JRST PTRIN0 + +PTREX0: DATAI PTR,PTRSVC ;SAVE LAST DATA WORD FROM PTR + TLZE IOS,IOW ;JOB IN AN IO WAIT FOR PTR? + PUSHJ PDP,SETIOD ;YES, WAKE UP JOB + PUSHJ PDP,PTRREL ;CLEAR PTR AND CONSO FLAG + TLO IOS,PTRFCI ;PTRFCI:=1 + TRZ IOS,IOACT ;IOACT:=0 + +PTREX1: MOVEM ITEM,PTRCTR ;PTRCTR:=C(ITEM) + JRST STOIOS ;STORE IOS,RESET HUNG DEVICE + ;TIMEOUT COUNT AND DISMISS + +PTRINI: +PTRREL: CONO PTR,0 ;CLEAR PTR CONTROL + HLLZS PTRCON ;CLEAR CONSO FLAG + POPJ PDP, + + END + diff --git a/src/ptysrf.mac b/src/ptysrf.mac new file mode 100644 index 0000000..176ef20 --- /dev/null +++ b/src/ptysrf.mac @@ -0,0 +1,286 @@ +TITLE PTYSRF - FULL DUPLEX PSEUDO TELETYPE SERVICE ROUTINES +SUBTTL M. FREDRIKSEN/RCC TS 06 DEC 68 V006 +XP VPTYSF,006 + ;PUT VERSION NUMBER IN GLOB LISTINGS AND LOADER STORAGE MAP + +ENTRY PTYSRF ;DUMMY GLOBAL FOR FULL DUPLEX PTY +PTYSRF: + + + +;ACCUMULATOR ASSIGNMENTS + + DDB=DEVDAT + LINE=TAC1 + + CHREC=TEM + PIOS=13 + PDDB=14 + +;FOLLOWING BITS, AND LINE AND CHREC ASSIGMENTS +; MUST AGREE WITH THOSE IN SCNSRF + + BREAKB=20000 + FCSBRK=4000 + TOIP=400000 ;SIGN OF TTYPTR IN TTY DDB + SYNC=20000 ;BREAK CHARACTER SEEN---FROM SCNSER + +;PTY DEVICE DEPENDENT IO STATUS BITS (RH DEVIOS) + +IOPTW=4000 ;OUTPUT WAIT (OBJ. JOB HAS DONE INPUT) +IOPTRE=2000 ;PTY RESPONSE IS READY +MONMOD=1000 ;PTY IS IN MONITOR MODE + +INTERNAL FTTTYSER + +FTTTYSER=-1 ;FORCE MULT DEF GLOBAL IF WRONG APRSER + INTERNAL FTCHECK,FTMONP +IFN FTCHECK+FTMONP,< +EXTERNAL PTYDDB,PIOSAV,PTYSAC,PTYDNB,PTYBM1,PTYDDS,PIOSAV,PDDSAV +EXTERNAL PTYSAV,PTYSA2,PTYRET,PACSAV +INTERNAL PTYSA0,PTYRE0,ACSAV0 +> +IFE FTCHECK+FTMONP,< +;PSEUDO CONSOLE DEVICE DATA BLOCK +;REMAINING PTY DDB'S ARE GENERATED +;OUT OF LINE AT BUILD TIME + INTERN PTYDDB + ZZ=. +PTYDDB: SIXBIT /PTY0/ + XWD 0,10000+STTYBF+1 ;PTY0 IS UNIT 1,PTY1 IS UNIT 2, ETC. + Z + EXP PTYDSP + Z + Z + XWD PROG,0 + XWD PROG,0 + Z + XP PTYDDS,.-ZZ ;SIZE OF PTY DDB +> + INTERNAL PTYDSP +EXTERNAL OUT + POPJ PDP, ;INITIALIZE + POPJ PDP, ;PRINT ERROR, STOP JOB +PTYDSP: JRST PTYREL + JRST OUT + JRST PTYOUT + JRST PTYIN + +EXTERNAL PTYTAB,TCONLN,TTYTAB,TTYKIL,PUNIT + +PTYREL: LDB LINE,PUNIT + ADDI LINE,TCONLN + SKIPN TTYTAB(LINE) + POPJ PDP, + PUSH PDP,DDB + HRRZ DDB,TTYTAB(LINE) + PUSHJ PDP,TTYKIL + POP PDP,DDB + + LDB LINE,PUNIT + SETZM PTYTAB(LINE) + POPJ PDP, + ;PTY OUTPUT +;IF NO TTYTAB ENTRY EXISTS FOR THIS PTY, ONE IS CREATED +;IF A TTY DATA BLOCK IS AVAILABLE. IF NONE IS AVAILABLE, +;IODERR IS SET IN PTY STATUS AND OUTPUT IS TERMINATED. + +;IF A TTY DEVICE DATA BLOCK IS AVAILABLE, CHARACTERS ARE +;PLACED IN THE TTY INPUT BUFFER, THE PTY OUTPUT BUFFER IS +;ADVANCED, IOPTW IS CLEARED IN PTY STATUS, AND CONTROL RETURNS +;TO THE OUPTUT UUO AND THENCE TO THE USER. +;IF NO RESPONSE IN ENCOUNTERED, OUTPUT PROCEEDS IN THE +;NORMAL FASHION ADVANCING THE PTY OUTPUT BUFFERS +;UNTIL THEY ARE EMPTY. + +;IOPTRF IS SET EVERY TIME THE JOB RUNNING 0N THE PTY (OBJECT JOB) +;DOES AN "OUTPUT" UUO. IOPTW IS SET WHENEVER THE OBJECT JOB DOES +;AN INPUT, THE OBJECT JOB THEN GOES INTO I/O WAIT UNTIL THE JOB WITH +;THE PTY ASSIGNED (CONTROL JOB) HAS COMPLETED ITS OUTPUT UUO. +;MONMUD INDICATES PTY IS IN MONITOR MODE (ITS LINKED TTYDDB HAS TPMON +;SET IN THE OF IOS) + + +EXTERNAL TCONLN,TTYTIBTPYTAB,PTYTAB,SETIOD +EXTERNAL ADVBFF,RUNIT,RECIN3,PUTCHI +EXTERNAL TTIBUF,SPCHEK,DDBSRC,LINTAB,CNCTST,TIFCTR,INBFUL + +PTYOUT: LDB LINE,PUNIT + HRRZM DDB,PTYTAB(LINE) + ADDI LINE,TCONLN + HLL LINE,LINTAB(LINE) + + SKIPE PDDB,TTYTAB(LINE) + JRST PTYOU1 + PUSHJ PDP,PTEXCH + PUSHJ PDP,DDBSRC + TROA PIOS,IODERR + JRST PTYOU2 + MOVEM PIOS,DEVIOS(RDDB) + +PTEXCH: EXCH IOS,PIOS + EXCH DDB,PDDB + POPJ PDP, + PTYOU1: MOVE PIOS,DEVIOS(PDDB) + PUSHJ PDP,PTEXCH + +PTYOU2: MOVEI AC2,@DEVOAD(PDDB) + MOVE AC2,1(AC2) + IMULI AC2,5 + HRRZ AC1,DEVOAD(PDDB) + ADD AC1,[XWD 700+PROG,1] + MOVEI DAT,TTIBUF(DDB) + +PTYOU3: ILDB CHREC,AC1 + JUMPE CHREC,PTYOU5 + PUSHJ PDP,SPCHEK + JRST PTYOU4 + CAIE CHREC,176 + CAIN CHREC,33 + MOVEI CHREC,175 + MOVEI IOS,0 + TLNE TAC,BREAKB+FCSBRK + + MOVSI IOS,SYNC + IORB IOS,DEVIOS(DDB) + CAIN CHREC,3 ;CONTROL C + PUSHJ PDP,CNCTST ;SEE IF SECOND, STOP JOB IF SO + +PTYOU4: MOVEI DAT,TTIBUF(DDB) ;MAY HAVE SWITCHED TO TIOBUF + PUSHJ PDP,PUTCHI + JRST PTYOUW + MOVE TAC,TIFCTR(DDB) ;SEE IF BUFFER FILLING UP + CAIL TAC,10 ;WAKE JOB IF SO + TLNE IOS,SYNC + PUSHJ PDP,RECIN3 ;CLOBBERS DAT AND TAC +PTYOU5: SOJG AC2,PTYOU3 +PTYOU6: PUSHJ PDP,PTEXCH + PUSHJ PDP,ADVBFE + JFCL + TRZ IOS,IOPTW + TLO IOS,IOFST + MOVEM IOS,DEVIOS(DDB) + POPJ PDP, + +PTYOUW: PUSHJ PDP,INBFUL ;TURN OFF SYNC, CHECK FOR + ; PANIC CONTROL C. + TRO PIOS,IOBKTL ;CANT PUT BATCH IN IOW + JRST PTYOU6 ;ABORT BUFFER AND RETURN TO BATCH + EXTERNAL TCONLN,TTYTAB,SETIOD,ADVBFF,ADRERR,TTYPTR +EXTERNAL BUFCLR,XMTINT,PTYGET,TTYCHR,TTOBUF + +PTYIN: LDB DAT,PUNIT + SKIPF PDDB,TPYTAB(DAT) ;TTY DDB ADDRESS + JRST PTYIN1 + TRO IOS,IOIMPM ;YES, THAT'S ALL. + JRST PTYIN3 + +PTYIN1: MOVE PIOS,DEVIOS(PDDB) + TRZA IOS,IOPTRE +PTYIN4: TRO IOS,IOPTRE + HRRZ TAC,DEVIAD(DDB) + PUSHJ PDP,BUFCLR + JRST ADRERR + MOVEI LINE,TCONLN(DAT) + PUSHJ PDP,PTEXCH + MOVEI AC2,TTYCHR + MOVEI AC1,@DEVIAD(PDDB) + ADD AC1,[XWD 700,1] + MOVEM IOS,DEVIOS(DDB) + MOVSI IOS,TOIP ;MARK TYPE-OUT ACTIVE + IORM IOS,TTYPTR(DDB) + PUSHJ PDP,XMITINT + SKIPA + +PTYIN2: PUSHJ PDP,PTYGET ;SHOULD BE XMITIN1+1 + SKIPL TTYPTR(DDB) ;STILL GOING? + JRST PTYIN5 ;NO. END OF STRING FROM TTY + IDPB CHREC,AC1 + SOJG AC2,PTYIN2 +PTYIN5: PUSHJ PDP,PTEXCH + MOVEI AC3,@DEVIAD(DDB) + SUBI AC1,1(AC3) + HRRM AC1,1(AC3) ;WORD COUNT TO BATCH + PUSHJ PDP,ADVBFF + JRST PTYIN3 + SKIPGE TTYPTR(PDDB) ;STILL MORE TO COME? + JRST PTYIN6 ;YES. SEE IF ROOM + +PTYIN3: MOVEM IOS,DEVIOS(DDB) + POPJ PDP, + +PTYIN6: MOVSI TAC,TOIP ;CLEAR ACTIVE BIT IN CASE STOPPED + ANDCAM TAC,TTYPTR(PDDB) + SOJG AC2,PTYIN4 ;COUNT, GO ON IF ROOM + JRST PTYIN3 ;NO ROOM, STOP + ;INTERCEPT TTY OUTPUT AT UUO LEVEL AND SYNCHRONIZE +;TTY OUTPUT WITH PTY INPUT + + +INTERNAL PTYPE +EXTERNAL TCONLN,PTYTAB,CLOCK,CIPWTM1,WAKE + +PTYPE: PUSH PDP,PDDB + MOVE PDDB,LINE + SUBI PDDB,TCONLN + HRRZ PDDB,PTYTAB(PDDB) + PUSH PDP,PIOS + MOVEM IOS,DEVIOS(DDB) + MOVEI PIOS,IOPTRE + IORB PIOS,DEVIOS(PDDB) + PUSHJ PDP,PTWAKE + POP PDP,PIOS + POP PDP,PDDB + POPJ PDP,0 + +PTWAKE: PUSH PDP,TAC1 ;SAVE LINE + PUSH PDP,TEM + LDB TAC,[POINT 6,DEVCHR(PDDB),5] ;PTY JOB NR + HRRZ TAC1,CLOCK ;LAST JOB IN CLOCK QUEUE +PTWAK2: CAIN TAC1,CIPWTM1 ;LOOKED AT ALL JOBS + JRST PTWAK1 ;YES, WAS NOT SLEEPING + HLRZ TEM,(TAC1) ;SLEEPING JOB? + CAIE TEM,WAKE + SOJA TAC1,PTWAK2 ;NO, IN QUEUE FOR SOME OTHER REASON + LDB TEM,[POINT 6,(TAC1),23] ;JOB NR IN QUEUE + CAME TEM,TAC ;IS IT THIS ONE? + SOJA TAC1,PTWAK2 ;LNO, LOOP TILL DONE + MOVE TEM,(TAC1) ;YES, ZERO TIME LEFT TO SLEEP + TRZ TEM,7777 + AOS TEM ;LADD ONE SO NEXT TICK WILL MAKE 0 + MOVEM TEM,(TAC1) +PTWAK1: POP PDP,TEM + POP PDP,TAC1 ;RESTORE LINE + POPJ PDP, + ;ROUTINES TO SET VARIOUS BITS +;CALLED FROM SCNSER WITH TTY LINE NUMBER IN LINE + +INTERNAL PTYOW,PTMNMD,PTMNMZ + +PTMNMD: PUSH PDP,PIOS + MOVEI PIOS,MONMOD ;PTY INTO MONITOR MODE + JRST PTYSET + +PTMNMZ: PUSH PDP,PIOS + HRROI PIOS,MONMOD ;PTY OUT OF MONITOR MODE + JRST PTYSET + +PTYOW: PUSH PDP,PIOS + MOVEI PIOS,IOPTW ;PTY IN OUTPUT WAIT + +PTYSET: PUSH PDP,PDDB + MOVE PDDB,LINE + SUBI PDDB,TCONLN ;FIND PTY THAT TTY IS LINKED TO + HRRZ PDDB,PTYTAB(PDDB) + JUMPE PDDB,PTYST1 ;PREVENT CATASTROPHE + TLZE PIOS,-1 ;BIT TO BE SET OR ZEEROED + ANDCAB PIOS,DEVIOS(PDDB) ;ZEROED + IORB PIOS,DEVIOS(PDDB) + TRNE PIOS,IOPTW ;IS LINKED TTY JOB IN INPUT WAIT? + PUSHJ PDP,PTWAKE ;YES, WAKE UP CONTROL JOB +PTYST1: POP PDP,PDDB + POP PDP,PIOS + + POPJ PDP,0 + PTYEND: END + diff --git a/src/ptysrh.mac b/src/ptysrh.mac new file mode 100644 index 0000000..1e2b1e5 --- /dev/null +++ b/src/ptysrh.mac @@ -0,0 +1,357 @@ +TITLE PTYSRH - HALF DUPLEX PSEUDO TELETYPE SERVICE ROUTINES +SUBTTL D. WITCRAFT/RAP TS3.19 24 SEP 68 V004 +XP VPTYSF,004 + ;PUT VERSION NUMBER IN GLOB LISTINGS AND LOADER STORAGE MAP + +ENTRY PTYSRH ;DUMMY GLOBAL FOR FULL DUPLEX PTY +PTYSRH: + + + +;ACCUMULATOR ASSIGNMENTS + + DDB=DEVDAT + LINE=TAC1 + + CHREC=TEM + SCNHAC=12 + PIOS=13 + PDDB=14 + RPTB=400 + + SP=2000 ;SPECIAL TTY CHARACTER + T37=10000 ;MODEL 37-FULL CHARACTER SET +SYNC=40000 ;BREAK CHARACTER SEEN---FROM SCNSER + +;PTY DEVICE DEPENDENT IO STATUS BITS (RH DEVIOS) + +IOPTW=4000 ;OUTPUT WAIT (OBJ. JOB HAS DONE INPUT) +IOPTRE=2000 ;PTY RESPONSE IS READY +MONMOD=1000 ;PTY IS IN MONITOR MODE + +INTERNAL FTCHECK,FTMONP +IFN FTCHECK+FTMONP,< +EXTERNAL PTYDDB,PTYCSV,PTYSAC,PTYBND,PTYBM1,PTYDDS,PIOSAV,PDDSAV +EXTERNAL PTYSAV,PTYSA2,PTYRET,PACSAV +INTERNAL PTYSA0,PTYRE0,ACSAV0 +> +IFE FTCHECK+FTMONP,< +;PSEUDO CONSOLE DEVICE DATA BLOCK +;REMAINING PTY DDB'S ARE GENERATED +;OUT OF LINE AT BUILD TIME + INTERN PTYDDB + ZZ=. +PTYDDB: SIXBIT /PTY0/ + XWD 0,10000+STTYBF+1 ;PTY0 IS UNIT 1,PTY1 IS UNIT 2, ETC. + Z + EXP PTYDSP + XWD DVIN+DVOUT,3 + Z + XWD PROG,0 + XWD PROG,0 + Z + XP PTYCSV,.-ZZ + Z + XP PTYDDS,.-ZZ + BLOCK 13 + XP PTYBND,PTYSAC+12 + XP PTYDM1,PTYBND-1 + XP PTYDDS,.-ZZ ;SIZE OF PTY DDB + +PTYSA2: BLT SCNHAC,0 +PIOSAV: 0 +PDDSAV: 0 +> + INTERNAL PTYDSP +EXTERNAL OUT + POPJ PDP, ;INITIALIZE + POPJ PDP, ;PRINT ERROR, STOP JOB +PTYDSP: JRST PTYREL + JRST OUT + JRST PTYOUT + JRST PTYIN + EXTERNAL PTYTAB,TCONLN,TTYTAB,TTYKIL + +PTYREL: LDB LINE,[POINT 6,DEVCHR(DDB),23] + SETZM PTYTAB(LINE) + ADDI LINE,TCONLN + SKIPN TTYTAB(LINE) + POPJ PDP, + PUSH PDP,DDB + HRRZ DDB,TTYTAB(LINE) + PUSHJ PDP,TTYKIL + POP PDP,DDB + POPJ PDP, + ;PTY OUTPUT +;IF NO TTYTAB ENTRY EXISTS FOR THIS PTY, A SPACE IS +;SENT TO SCNSER (TCOMM) CAUSING AN ENTRY TO BE MADE IF +;A TTY DATA BLOCK IS AVAILABLE. IF NONE IS AVAILABLE, +;AN "X" IS RETURNED IN WHICH CASE IODERR IS SET IN PTY STATUS +;AND OUTPUT IS TERMINATED. + +;IF A TTY DEVICE DATA BLOCK IS AVAILABLE, CHARACTERS ARE +;TRANSMITTED TO TCOMM. IF A RESPONSE IS RECIEVED AS INDICATED +;BY THE SP BIT IN TTY STATUS, THE PTY OUTPUT BUFFER IS +;ADVANCED IOPTRE IS SET IN PTY STATUS , AND CONTROL RETURNS +;TO THE OUPTUT UUO AND THENCE TO THE USER. +;IF NO RESPONSE IN ENCOUNTERED, OUTPUT PROCEEDS IN THE +;NORMAL FASHION ADVANCING THE PTY OUTPUT BUFFERS +;UNTIL THEY ARE EMPTY. + +;IOPTRF IS SET EVERY TIME THE JOB RUNNING 0N THE PTY (OBJECT JOB) +;DOES AN "OUTPUT" UUO. IOPTW IS SET WHENEVER THE OBJECT JOB DOES +;AN INPUT, THE OBJECT JOB THEN GOES INTO I/O WAIT UNTIL THE JOB WITH +;THE PTY ASSIGNED (CONTROL JOB) HAS COMPLETED ITS OUTPUT UUO. +;MONMUD INDICATES PTY IS IN MONITOR MODE (ITS LINKED TTYDDB HAS TPMON +;SET IN THE OF IOS) + + +EXTERNAL TCONLN,TTYTIBTPYTAB,PTYTAB,SETIOD +EXTERNAL ADVBFF,RUNIT,RECIN3,PUTCHI +EXTERNAL TTIBUF,SPCHEK,DDBSRC,LINTAB,CNCTST,TIFCTR,INBFUL + +PTYOUT: LDB LINE,PUNIT + JSR PTYSAV + SKIPN PTYTAB(LINE) + HRRZM DDB,PTYTAB(LINE) + SKIPE TPYTAB(LINE) ;HAS A TTY DDB BEEN ASSIGNED? + JRST PTYOU0-1 ;YES + ADDI LINE,TCONLN + MOVEI CHREC,240 ;NO + PUSHJ PDP,TCOMM + CAIE CHREC,"X" ;ANY AVAILABLE? + JRST PTYOU6 ;YES + JSR PTYRET + TRO IOS,DEVIOS(DDB) ;NO + MOVEM IOS,DEVIOS(DDB) + POPJ PDP, + +PTYOU6: TLO IOS,T37+IOFST ;FORCE BUFFER RESET + ;T37 SO TABS, ETC NOT TRNSLATED (TIMING ERRO OTHERWI) + MOVEM IOS,DEVIOS(DDB) + JSR PTYRET ;RESTORE ACS + +PTYOU0: TRNE IOS,IOPTRE + POPJ PDP, + TLZE IOS,IOBEG ;FIRST IO + TLO IOS,IOFST ;YES + TLZN IOS,IOFST ;FIRST ITEM IN BUFFER? + JRST PTYOU1 ;NO + TLO IOS,IO ;YES. INITIALIZE POINTER & COUNT + HRRZ TAC,DEVOAD(DDB) + ADD TAC,[XWD 700,1] + ADDI TAC,(PROG) + MOVEM TAC,DEVOAD(DDB) + HRRZ ITEM,@TAC + JUMPE ITEM,PTYOU8 ;BUFFER EMPTY> + PUSHJ PDP,ITMCNT + MOVEM ITEM,DEVCTR(DDB) + PTYOU1: TRO IOS,IOACT + TRZ IOS,IOPTRE + JSR PTYSAV ;SAVE ACS + LDB LINE,PUNIT + ADDI LINE,TCONLN + EXCH IOS,PIOS + +PTYOU2: SOSGE DEVCTR(PDDB) ;BUFFER EMTY? + JRST PTYOU3 ;YES + ILDB CHREC,DEVOAD(PDDB) ;NO +PTYOU7: PUSHJ PDP,TCOMM ;SEND NEXT CHARACTER + TLNE IOS,IOFST + JRST PTYOU3 + TLNE IOS,SP ;SPECIAL CHARACTER ECHO? + JRST PTYOU4 ;YES, SEE IF CONTROL CHAR ECHO + TLNE IOS,SYNC ;NO. BREAK CHARACTER SEEN IF OBJ. JOB SWAPPED OUT? + JRST PTYOU3 ;YES, BUFFER NOT MOVED INTO OBJECT + ;JOB TTY IN BUFFER + JRST PTYOU2 ;NO + +PTYOU4: CAIE CHREC,"^" + JRST PTYOU7 + MOVEM CHREC,PTYCSV(PDDB);YES. FLUSH OUTPUT + MOVEM IOS,DEVIOS(DDB) ;SAVE TTY STATE + TRO PIOS,IOPTRE ;LET USER KNOW + +PTYOU3: JRS PTYRET ;RESTORE ACS + EXCH IOS,PIOS +PTYOU8: TLZE IOS,IOW + PUSHJ PDP,SETIOD ;START PTY JOB + HRLI TAC,PROG + HRL TAC,DEVBUF(DDB) + HRR TAC,@TAC + MOVEM TAC,DEVOAD(DDB) + PUSHJ PDP,ADVBFE ;ADVANCE PTY OUTPUT BUFFER + JRST PTYOU5 ;NEXT BUFFER IS EMPTY. + TRNN PIOS,IOPTRE ;RESPONSE? + JRST PTYOU0 ;NO + TRO IOS,IOPTRE ;YES, SET RESPONSE FLAG AND RETURN TO USER +PTYOU5: TRZ IOS,IOACT+IOPTW ;CONSIDER OUTPUT COMPLETED + TLO IOS,IOFST + MOVEM IOS,DEVIOS(DDB) + POPJ PDP, + EXTERNAL TCONLN,TTYTAB,SETIOD,ADVBFF,STOSQD,ADRERR + +PTYIN: LDB LINE,[POINT 6,DEVCHR(DDB),23] + ADDI LINE,TCONLN + HRRZ PDDB,TTYTAB(LINE) ;TTY DDB ADDRESS + JUMPN PDDB,PTYIN1 ;HAS TTY DDB BEEN LOST? + TRO IOS,IOIMPM ;YES, THAT'S ALL. + JRST PTYIN8 + +PTYIN1: PUSH PDP,LINE + TLO IOS,IOFST + TDZ IOS,[XWD IO,IOPTRE] + MOVEI TAC,440700+PROG + HLLM TAC,DEVPTR(DDB) + + TRO IOS,IOACT + MOVE PIOS,DEVIOS(PDDB) + TLNN PIOS,IO+SP + JRST PTYI10 + SETZM CHREC + EXCH CHREC,PTYCSV(DDB) ;HAS FIRST CHAR BEEN REC? + JUMPE CHREC,PTYIN5+1 ;NO + ;YES,SAVE LINE NO. +PTYIN4: TLNN PIOS,IO+SP ;IS TTY DONE? + JRST PTYI38 ;YES. THATS ALL + MOVE DAT,CHREC + PUSHJ PDP,STODAT ;STORE CHARACTER + JRST ADRERR + JRST PTYIN6 ;BUFFER FULL + +PTYIN5: JUMPE ITEM,PTYI3A ;IF COUNT RUNS OUT + EXCH PIOS,IOS ;NO. GET NEXT CHAR. + EXCH PDDB,DDB ;SET IOS AND DBD FOR TTY + POP PDP,LINE ;RESTORE LINE NO. + PUSH PDP,ITEM ;SAVE ITEM COUNT + PUSH PDP,PROG + PUSHJ PDP,TCOMM + POP PDP,PROG + POP PDP,ITEM ;RESTORE ITEM COUNT + EXCH PIOS,IOS + EXCH PDDB,DDB + PUSH PDP,LINE + JRST PTYIN4 + PTYI3A: TRZ IOS,IOBKTL + TRO IOS,IOPTRE ;INPUT READY +PTYI3B: PUSHJ PDP,STOSQD + JRST ADRERR + TLOA IOS,IOFST + +PTYIN6: TRO IOS,IOPTRE+RPTB + PUSHJ PDP,ADVBFF ;ADVANCE PTY BUFFER + JRST PTYI10 ;NEXT BUFFER IS FULL. + TLO IOS,IOFST + TRZE IOS,RPTB + JRST PTYIN5+1 +PTYI10: TLZE IOS, IOW + PUSHJ PDP, SETIOD + TRZ IOS,IOACT+RPTB + POP PDP, LINE +PTYIN8: MOVEM IOS, DEVIOS(DDB) + POPJ PDP, + ;SAVE ACCUMULATORS +;CALL MOVEI DDB,ADDRESS OF PTYDB +; JSR PTYSAV + + +IFE FTCHECK+FTMONP,< +PTYSAV: 0 +> +PTYSA0: MOVEM SCHHAC,PTYBDN(DDB) ;SAVE HIGH AC + HRRZ SCNHAC,DDB + ADDI SCHNHAC,PTYBM1 + HRRM SCNHAC,PTYSA2 + SUBI SCNHAC,SCNHAC-1 + XCT PTYSA2 ;DO BLT SCNHAC + MOVE PDDB,DDB + JRST @PTYSAV + +;RESTORE ACCUMULATORS +;CALL MOVEI PDDB,PTY DATA BLOCK ADDRESS +; JSR PTYRET + +IFE FTCHECK+FTMONP,< +PTYRET: 0 +> +PTYRE0: HRRZ SCNHAC,PDDB + ADDI SCNHAC,PTYSAC + HRLZS SCNHAC + BLT SCNHAC,SCNHAC + JRST @PTYRET + +;SAVE ONLY PIOS AND PDDB + +IFE FTCHECK+FTMONP,< +PACSAV: 0 +> +ACSAV0: MOVEM PIOS,PIOSAV + MOVEM PDDB,PDDSAV + JRST @PACSAV + +ACRET: MOVE PIOS,PIOSAV + MOVE PDDB,PDDSAV + POPJ PDP, + ;INTERCEPT TTY OUTPUT AT UUO LEVEL AND SYNCHRONIZE +;TTY OUTPUT WITH PTY INPUT + + +INTERNAL PTYPE +EXTERNAL TCONLN,PTYTAB,CLOCK,CIPWTM1,WAKE + +PTYPE: MOVE PDDB,LINE + SUBI PDDB,TCONLN + HRRZ PDDB,PTYTAB(PDDB) + TRO IOS,IOACT ;FORCE RESCHED TO CONTROL JOB + MOVEM IOS,DEVIOS(DDB) + MOVEI TAC,IOPTRE + IORB TAC,DEVIOS(PDDB) + MOVEM CHREC,PTYCSV(PDDB) ;SAVE CHARACTER + +PTWAKE: PUSH PDP,TEM + PUSH PDP,TAC1 + LDB TAC,[POINT 6,DEVCHR(PDDB),5] ;PTY JOB NR + + HRRZ TAC1,CLOCK ;LAST JOB IN CLOCK QUEUE +PTWAK2: CAIN TAC1,CIPWTM1 ;LOOKED AT ALL JOBS + JRST PTWAK1 ;YES, WAS NOT SLEEPING + HLRZ TEM,(TAC1) ;SLEEPING JOB? + CAIE TEM,WAKE + SOJA TAC1,PTWAK2 ;NO, IN QUEUE FOR SOME OTHER REASON + LDB TEM,[POINT 6,(TAC1),23] ;JOB NR IN QUEUE + CAME TEM,TAC ;IS IT THIS ONE? + SOJA TAC1,PTWAK2 ;LNO, LOOP TILL DONE + MOVE TEM,(TAC1) ;YES, ZERO TIME LEFT TO SLEEP + TRZ TEM,7777 + AOS TEM ;LADD ONE SO NEXT TICK WILL MAKE 0 + MOVEM TEM,(TAC1) +PTWAK1: POP PDP,TAC1 + POP PDP,TEM + POPJ PDP, + ;ROUTINES TO SET VARIOUS BITS +;CALLED FROM SCNSER WITH TTY LINE NUMBER IN LINE + +INTERNAL PTYOW,PTMNMD,PTMNMZ + +PTMNMD: PUSH PDP,PIOS + MOVEI PIOS,MONMOD ;PTY INTO MONITOR MODE + JRST PTYSET + +PTMNMZ: PUSH PDP,PIOS + HRROI PIOS,MONMOD ;PTY OUT OF MONITOR MODE + JRST PTYSET + +PTYOW: PUSH PDP,PIOS + MOVEI PIOS,IOPTW ;PTY IN OUTPUT WAIT + +PTYSET: MOVE PDDB,LINE + SUBI PDDB,TCONLN ;FIND PTY THAT TTY IS LINKED TO + HRRZ PDDB,PTYTAB(PDDB) + TLZE PIOS,-1 ;BIT TO BE SET OR ZEEROED + ANDCAB PIOS,DEVIOS(PDDB) ;ZEROED + IORB PIOS,DEVIOS(PDDB) + TRNE PIOS,IOPTW ;IS LINKED TTY JOB IN INPUT WAIT? + PUSHJ PDP,PTWAKE ;YES, WAKE UP CONTROL JOB + JSRT ACRET + END + diff --git a/src/s.mac b/src/s.mac new file mode 100644 index 0000000..617380c --- /dev/null +++ b/src/s.mac @@ -0,0 +1,529 @@ +;***COPYRIGHT 1969, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.*** + + +;THIS SUB-PROGRAM ASSEMBLED WITH SYSTEM PAREMETER FILE - S.MAC(V414) + XLIST +IFDEF LISTSN, < IFN LISTSN, > + +; S - SYSTEM PARAMETER DEFINITIONS FOR PDP-6 AND PDP-10 TIME SHARING MONITORS +; TH/TH/TNM/RCC 04 JUN 69 + +;THIS IS ASSEMBLED IN FRONT OF EACH SUBPROGRAM IN MONITOR + + +DEFINE XP(A,B) ;SYSTEM PARAMETER + + +;ACCUMULATOR ASSIGNMENTS + +;* MEANS LOADED BY UUO HANDLER ON ALL UUOS + +XP IOS,0 ;*IO DEVICE STATUS WORD(SEE BELOW FOR BITS) +XP TAC,1 ;TEMPORARY(SOMETIMES PRESERVED ACCROSS SUB.) +XP TAC1,2 ;TEMPORARY(SOMETIMES PRESERVED ACCROSS SUB.) +XP PDP,3 ;*PUSH DOWN POINTER(SEPARATE LIST FOR EACH PI + ; CHANNEL AND EACH USER JOB +XP ITEM,4 ;BUFFER ITEM COUNT, OR JOB NUMBER +XP DAT,5 ;TTY OUTPUT BUFFER POINTER FOR COMMANDS,ERROR + ; MESSAG ;OR TEMPORARY +XP JBUF,DAT ;ADDRESS OF 3 WORD BUFFER HEADER IN USER AREA +XP DEVDAT,6 ;*LH=UUOS DONE SO FAR FOR THIS DEVICE(SEE BELOW) + ; RH=ADDRESS OF DEVICE DATA BLOCK +XP PROG,7 ;*LH=HIGHEST REL. LOC. IN USER AREA + ; RH=ABSOLUTE ADDRESS OF USER AREA +XP JDAT,PROG ;*RH=ADDRESS OF JOB DATA AREA + ; LH=HIGHEST REL. LOC. IN USER AREA +XP TEM,10 ;TEMPORARY USED ONLY SCNSER IO ROUTINE + +;ONLY 0 THRU 10 SAVED FOR INTERRUPT SERVICE + +XP DSER,11 ;*ADDRESS OF DEVICE SERVICE ROUT. DISPATCH TABLE +XP BUFPNT,12 ;CONTENTS OF FIRST WORD OF 3 WORD USER BUFFER HEADER +XP UCHN,BUFPNT ;*USER IO CHANNEL NO. +XP BUFWRD,13 ;CONTENTS OF 2ND WORD OF USER BUFFER +XP UUO,14 ;*CURRENT UUO IN PROGRESS + ; PROG IN INDEX FIELD FOR RELOCATION +XP AC1,15 ;TEMPORARY ACS(MORE TEMPORARY THAN TAC,TAC1) +XP AC2,16 +XP AC3,17 +;REDEFINE SO THAT ONLY THE ABOVE ACS WILL OCCUR IN DDT PRINTOUTS + +DEFINE XP(A,B)< +A==B +INTERNAL A +> +;DEFINE REST OF SYMBOLS SO THAT THEY WILL NOT BE PRINTED BY EXEC DDT ON OUTPUT + ; DEVICE DATA BLOCK NAMES + XP DEVNAM,0 ;NAME IN SIXBIT ASCII + ; C(LH)=DEVICE MNEMONIC + ; C(RH)=DEVICE NUMBER, LEFT JUSTIFIED + XP DEVCHR,1 ;CHARACTERISTIC + ; BITS 0-5=JOB NUMBER(BYTE POINTER=PJOBN) + ; ZERO VALUE IMPLIES NOT ASSIGNED + XP HUNGCT,100 ;BITS 6-11=HUNG DEVICE COUNT. SET WHEN + ; DEVICE BECOMES ACTIVE. DECREMENTED EVERY SECOND. + XP HUNGST,1 ;BITS 12-17=HUNG DEVICE COUNT + ; SETTING. 0 MEANS DEVICE CAN NEVER BE HUNG. + ; BITS 18-23=DEVICE NUMBER,BINARY(BYTE POINTER=PUNIT) + ; BITS 24-35=BUFFER SIZE + XP DEVIOS,2 ;STATUS WORD. SEE BELOW + XP DEVSER,3 ;C(LH)=NEXT DEVICE DATA BLOCK + ; C(RH)=DEVICE SERVICE DISPATCH TABLE +; DEVICE SERVICE DISPATCH TABLE ASSIGNMENTS + XP DINI,-2 ;DEVICE INITILIZATION + XP DHNG,-1 ;DEVICE IS HUNG + XP DRL,0 ;RELEASE + XP DCL,1 ;CLOSE + XP DCLO,DCL ;CLOSE OUTPUT + ;IMMEDIATE ADDRESS PART OF CLOSE UUO + XP CLSOUT,1 ;INHIBIT CLOSING OUTPUT + XP CLSIN,2 ;INHIBIT CLOSING INPUT + XP DOU,2 ;OUTPUT + XP DIN,3 ;INPUT. SHORT DISPATCH TABLE + XP DEN,4 ;ENTER + XP DLK,5 ;LOOKUP + XP DDO,6 ;DUMP MODE OUTPUT + XP DDI,7 ;DUMP MODE INPUT + XP DSO,10 ;SETO + XP DSI,11 ;SETI + XP DGF,12 ;GETF UUO + XP DRN,13 ;RENAME + XP DCLI,14 ;CLOSE INPUT + XP DCLR,15 ;CALL D,[SIXBIT /UTPCLR/] + XP DMT,16 ;MTAPE + ; END OF LONG DISPATCH TABLE + + XP DEVMOD,4 ;BITS 6-11=LEFT HALF OF IMAGE MODE BYTE POINTER + ; BIT 35-J=1 IF MODE J IS LEGAL FOR THIS DEVICE + ; BIT 18 DEVICE ASSIGNED BY CONSOLE COMMAND + ; BIT 19 DEVICE ASSIGNED BY PROGRAM (INIT) + +;RIGHT HALF OF DEVICE CHARACTERISTICS WORD(DEVCHR UUO) + XP ASSCON,400000 ;ASSIGNED BY CONSOLE COMMAND ASSIGN + XP ASSPRG,200000 ;ASSIGNED BY PROGRAM(INIT UUO) +;LEFT HALF DEVICE CHARACTERISTICS(DEVCHR UUO) + XP DVOUT,1 ;OUTPUT DEVICE + XP DVIN,2 ;INPUT DEVICE + XP DVDIR,4 ;HAS A DIRECTORY + XP DVTTY,10 ;IS A TTY + XP DVMTA,20 ;IS A MAG TAPE(REWIND) + XP DVAVAL,40 ;1 IF DEVICE IS AVAILABLE TO THIS JOB + ; SET BY DEVCHR UUO + XP DVDTA,100 ;IT IS A DECTAPE + XP DVPTR,200 ;IS A PAPER TAPE READER + XP DVPTP,400 ;IS A PAPER TAPE PUNCH + XP DVLNG,1000 ;DEVICE HAS LONG DISPATCH TABLE + ; (OTHER UUOS BESIDES INPUT,OUTPUT,CLOSE,RELEASE) + XP DVDIS,2000 ;IS A DISPLAY + XP TTYBIU,4000 ;TTY DDB IN USE (AS IO DEV. EVEN IF + ; NOT AS USER CONSOLE) + XP TTYUSE,10000 ;TTY DDB IN USE FLAG + XP TTYATC,20000 ;TTY ATTACHED TO JOB IF 1 + XP DVLPT,40000 ;IS A LPT (CARRIAGE CONTROL IN FORTRAN) + XP DVCDR,100000 ;IS A CARD READER(TRAILING SPACES FOR MACRO) + XP DVDSK,200000 ;IS A DISK + XP DVDIRIN,400000 ;DECTAPE DIRECTORY IN CORE IF 1(MUST BE SIGN BIT) + + XP DEVLOG,5 ;LOGICAL NAME FOR JOB DEVICE + XP DEVBUF,6 ;C(LH)=REL. ADR. OF 3 WORD OUTPUT BUFFER HEADER + ; C(RH)=REL. ADR. OF 3 WORD INPUT BUFFER HEADER + XP DEVIAD,7 ;C(LH)=PROG IN INDEX FIELD + XP DEVADR,DEVIAD + ; C(RH)=REL. INPUT BUFFER ADD. SERVICE ROUT. IS FILLING + XP DEVOAD,10 ;C(LH)=PROG IN INDEX FIELD + XP DEVPTR,DEVOAD + ; C(RH)=REL. OUTPUT BUFFER ADR. SERVICE ROU. IS EMPTYING + XP DEVCTR,11 +;FOR LONG DISPATCH TABLE DEVICES ONLY: + XP DEVFIL,11 ;FILE NAME IN SIXBIT + XP DEVEXT,12 ;LH=EXTENSION, RH=UNUSED + XP DEVPPN,13 ;PROJECT PROGRAMMER NO. (DISK ONLY) + ; OTHER DEVICES NEED NOT HAVE THIS LOCATION IN THEM. + ; I/0 STATUS WORD ASSIGNMENTS +;DATA MODES: BITS 32-35(BYTE POINTER=PIOMOD) + XP A,0 ;ASCII + XP AL,1 ;ASCII LINE + XP I,10 ;IMAGE + XP IB,13 ;IMAGE BINARY + XP B,14 ;BINARY + XP SD,15 ;SCOPE DUMP MODE + XP DR,16 ;DUMP BY RECORDS + XP D,17 ;DUMP ACROSS RECORDS +; STATUS BITS +;RIGHT HALF (USER) + XP IOWC,20 ;DON'T COMPUTE WORD COUNT + XP IOCON,40 ;CONTINUOUS (CONT=0) + XP IONRCK,100 ;READ WITH NO. REREAD CHECK +;BITS 27,28 DENSITY OF MAG TAPE +; 00=INSTALATION STANDARD +; 01=200 BPI +; 10=556 BPI +; 11=800 BPI + XP IOPAR,1000 ;WRITE EVEN PARITY (BCD) IF 1 ON MAG TAPE + XP IOTEND,2000 ;END OF MAG TAPE + XP IOBOT,4000 ;BEGINNING OF MAG TAPE + XP IOACT,10000 ;DEVICE ACTIVE + XP IODEND,20000 ;DATA END ENCOUNTERED + XP IOBKTL,40000 ;BLOCK TOO LARGE + XP IODTER,100000 ;DATA ERROR + XP IODERR,200000 ;DEVICE ERROR + XP IOIMPM,400000 ;IMPROPER MODE DETECTED BY + ; INPUT SERVICE ROUTINE +; LEFT HALF (SYSTEM) + XP IOW,1 ;I/O WAIT + XP IOBEG,2 ;VIRGIN DEVICE + XP IOFST,4 ;NEXT ITEM WILL BE THE FIRST ITEM OF A BUFFER + XP IO,20 ;OUT=1, IN=0 + XP IOEND,40 ;SERVICE ROUTINE HAS TRANSMITTED LAST DATA + +;REST OF BITS IN LH ARE DEVICE DEPENDENT EXCEPT BIT 14(XP 10) WHICK IS KEPT AS A SPARE + + +;COMMAND DECODER USE OF AC IOS: + +;RH=DISPATCH ADDRESS - SAVJOB,GETJOB,RUNJOB +;LH: + XP NSRBIT,400000 ;HIGH SEG TO BE FLAGGED NON-SHARABLE(SAVE VS SSAVE COMMAND) + ; DO NOT CONFUSE WITH SIGN BIT OF JBTSTS + ; WHICH SAYS SEG IS SHARABLE + + +;HARDWARE BITS: + + XP UWP,1 ;POSITION IN LH OF DATAO APR TO TURN USER-MODE WRITE PROTECT ON + XP USRMOD,10000 ;LH PC WORD, MACHINE WAS IN USER MODE WHEN PC STORED + XP UIOMOD,4000 ;LY PC WORD, MACHINE WAS IN USER IO MODE WHEN PC STORED + NXM=10000 ;NON EX MEMORY + POV=200000 ;PUSH DOWN OVERFLOW + ILM=20000 ;ILLEGAL MEMORY + ; IE ALL INSTRUCTIONS WERE LEGAL + +;LEFT HALF USRJDA (JOB DEVICE ASSIGNMENTS) UUO'S FOR THIS CHANNEL SINCE LAST INIT + XP INITB,400000 ;INIT-SAVEGET DEPENDS ON THIS BEING SIGN BIT + XP IBUFB,200000 ;INIT WITH INPUT BUFFER SPECIFIED + XP OBUFB,100000 ;INIT WITH OUTPUT BUFFER SPECIFIED + XP LOOKB,40000 ;LOOKUP + XP ENTRB,20000 ;ENTER + XP INPB,10000 ;INPUT + XP OUTPB,4000 ;OUTPUT + XP ICLOSB,2000 ;INPUT CLOSE + XP OCLOSB,1000 ;OUTPUT CLOSE + XP INBFB,400 ;INBUF + XP OUTBFB,200 ;OUTBUF + XP SYSDEV,100 ;THIS DEVICE IS SYSTEM TAPE + ; PROJ.PROG. NO 1,1 ON DSK + XP RENMB,40 ;RENAME UUO + XP DSKRLB,20 ;TO DISTINGUISH RELEASE FROM RESET UUO IN DSKSER. + ; RELEASE CLEARS THEM ALL + +;MTAPE UUO BITS + XP SLICE,40 ;SET SLICE LEVEL IF A 1 ACCORDING TO SLEVEL + XP SLEVEL,20 ;VALUE OF SLICE LEVEL IF SLICE A 1 + + +;ERROR CODES RETURNED TO USERS ON LOOKUP AND ENTER AND RENAME FAILURES(DISK ONLY) +;IN 2ND WORD OF 4 WROD ARGUMENT BLOCK(RH) +;THE SAME ERROR CODES ARE RETURNED ON RUN AND GETSEG UUOS FOR ALL DEVICES + + XP FNFERR,0 ;FILE NOT FOUND OR 0 FILE NAME + XP IPPERR,1 ;INCORRECT PROJECT,PROGRAMMER NO. + XP PRTERR,2 ;PROTECTION FAILURE(OR DIRECTORY FULL ON DTA) + XP FBMERR,3 ;FILE BEING MODIFIED + XP AEFERR,4 ;ALREADY EXISTING FILE(RENAME ONLY) + XP NLEERR,5 ;NEITHER LOOKUP NOR ENTER(RENAME ONLY) + XP TRNERR,6 ;TRANSMISSION ERROR(RUN,GETSEG UUO ONLY) + XP NSFERR,7 ;NOT A SAVE FILE(RUN,GETSEG UUO ONLY) + XP NECERR,10 ;NOT ENOUGH CORE(RUN,GETSEG UUO ONLY) + XP DNAERR,11 ;DEVICE NOT AVAILABLE(RUN,GETSEG UUO ONLY) + XP NSDERR,12 ;NO SUCH DEVICE(RUN,GETSEG UUO ONLY) + XP ILUERR,13 ;ILLEGAL UUO (GETSEG ONLY) NOT TWO RELOC REG. CAPABILITY + ; JOB BUFFER AREA HEADER + XP JBFADR,0 ;BIT 0=1 IF THIS BUFFER RING HAS NEVER BEEN + ; REFERENCED FROM THE USER'S PROGRAM BY + ; AN INPUT OR OUTPUT COMMAND. + ; BITS 1-17=UNUSED + ; BITS 18-35=CURRENT BUFFER ADDRESS + XP JBFPTR,1 ;BYTE POINTER TO NEXT BYTE -1 + XP JBFCTR,2 ;POSITIVE ITEM COUNT +; JOB BUFFER HEADER + XP IOUSE,400000 ;1 IF BUFFER IS FULL (OR BEING EMPTIED) + ; 0 IF BUFFER IS EMPTY (OR BEING FILLED) + ; BITS 1-17=BUFFER SIZE + ; BITS 18-35=NEXT BUFFER ADDRESS + ;JOB STATUS WORD(JBTSTS TABLE), ONE WORD FOR EACH JOB(SOME BITS ALSO APPEAR IN HIGH SEG STATUS WORD) + + + XP RUN,400000 ;USER WANTS JOB TO RUN(MUST BE SIGN BIT) + XP SNA,400000 ;HIGH SEG NUMBER ASSIGNED (ANALOGOUS TO JNA EXCEPT + ; MUST BE SIGN BIT) + XP CMWB,200000 ;JOB TYPED A COMMAND WHICH NEEDS CORE + ; WHICH IS ON DISK. SET BY COMMAND DECODER + ; CLEARED WHEN JOB IN CORE AGAIN. + XP SHRSEG,200000 ;HIGH SEG IS SHARABLE (ALTHOUGH NAME MAY BE 0 + ; IG IT HAS BEEN SUPERSEDED) + ; THIS BIT ALSO APPEARS IN SAME PLACE IN LH OF + ; OF JBTSGN FOR EACH USER TO INDICATE USER IS USING A SHARABLE + ; HIGH SEG (ALSO APPEARS IN LH OF AC ITEM WHEN + ; RH IS SEG NUMBER FOR A PARTICULAR JOB + XP JACCT,100000 ;PRIVILEGED SYSTEM CUSP IS BEING RUN WHICH CANNOT + ; BE STOPPED (E.G., LOGIN + ; OR LOGOUT). PROTECT IT FROM CURIOUS EYES. + ; DISABLE CONTROL C, MADE IT ACT LIKE ALT-MODE + XP JNA,40000 ;THIS JOB NUMBER IS ASSIGNED(JOB INITIALIZED) + XP JERR,20000 ;A MONITOR DETECTED ERROR HAS OCCURRED + ; JOB CAN NOT CONTINUE + XP NSWP,10000 ;JOB OR HIGH SEG IS NOT TO BE SWAPPED(REALTIME OR DISPLAY) + ; (CAN BE SHUFFLED OR NOT ACCORDING TO NSHF) + ; HIGH SEG CANNOT BE SWAPPED DURING SAVE + XP SHF,4000 ;MONITOR IS WAITING FOR DEVICES FOR THIS + ; JOB TO STOP AFTER CURRENT BUFFERFULL + ; SO JOB CAN BE SHUFFLED IN CORE OR SWAPPED OUT + ; IF JOB ONLY HAS LOW SEG + XP SWP,2000 ;0 IF JOB IN CORE, 1 IF SWAPPED OUT OR ON WAY + ; IN OR OUT + + ; SAME FOR LOW AND HIGH SEGMENTS + XP NSHF,1000 ;JOB IS NOT SHUFFLABLE + ; OR HIGH SEGMENT HAS ACTIVE SAVE IO + XP CLKR,400 ;JOB HAS A CLOCK REQUEST IN. + ; NEEDED SO ONLY ONE REQUEST PER JOB + XP STOPIO,SWP+CMWB+SHF ;FORCE JOB TO STOP TO EXECUTE + ; SWAP, COMMAND OR + ; SHUFFLE + + ;BITS 10-14 USED TO INDICATE JOB IN WAIT FOR A SHARABLE DEVICE + ;0 MEANS JOB NOT WAITING FOR SHARABLE DEVICE + ;SEE SCHEDULER(CLKCSS) FOR DEFINITION OF WAIT CODES + + XP JWSIZ,5 ;SIZE OF WAIT CODE + XP JWPOS,^D14 ;RIGHT MOST BIT POS. OF WAIT CODE + XP WTMASK,370 ;MASK FOR CLEARING WAIT CODES + +;BITS 15-17 ARE NO LONGER SET BY LOGIN, THEY ARE MONITOR STATUS BITS + + XP JLOG,4 ;JOB SUCCESSFULLY LOGGED IN + XP JRQ,2 ;JOB HAS CHANGED STATE AND MUST BE REQUEUED AT CLOCK + ; LEVEL BEFORE RESCHEDULING CAN TAKE PLACE + XP JXPN,1 ;JOB MUST BE SWAPPED OUT BECAUSE IT IS EXPANDING SIZE + ; OF CORE AND THERE WASN'T ROOM IN CORE + +;BITS 9-17 ARE USED FOR ACCESS PRIVILEGERS BITS FOR SHARABLE HIGH SEGMENTS +; SAME FORMAT AS ACCESS BITS FOR DISK + + XP HSASIZ,^D9 ;SIZE OF HIGH SEG ACCESS BITS + XP HSAPOS,^D17 ;RIGHT MOST POSITION OF HIGH SEG ACCESS BITS + XP HSAMSK,777 ;MASK TO CLEAR ACCESS PRIVILEGES +;MASKS USED TO TEST STATUS CONDITIONS: + + XP RUNABLE,RUN+JNA ;STATUS BIT PATTERN FOR JOB TO BE RUNABLE + XP RUNMSK,JLOG+CLKR+NSHF+JACCT+NSWP ;BITS WHICH DO NOT MATTER FOR RUNABILITY + ;BITS IN JBTSWP TABLE + + XP FRGSEG,400000 ;LH - 1 IF LOW OR HIGH SEG IS FRAGMENTED ON SWP DEV + XP SWPCLR,400000 ;RH - 1 IF JOB DATA AREA SHOULD BE CLEARED AFTER + ; IN. SET ON 140 RESTART SO NO DEVICES ASSIGNED + ;VIRTUAL ADDRESSING SPACE DESCRIPTOR WORD (JBTSGN) ONE WORD FOR EACH JOB +;THIS WORD APPEARS IN AC ITEM +;LH BITS + XP SPYSEG,400000 ;THE HIGH SEB IS PHYSICAL CORE (SEE SPYUUO) + ; MUST BE SIGN BIT SO TEST FOR JOB HAVING A + ; REAL HIGH SEG IS SKIPG JBTSGN(ITEM) + XP SHRSEG,SHRSEG ;THE HIGH SEG THIS JOB IS USING IS SHARABLE + ; THIS BIT ALSO APPEARS IN JBTSTS FOR HIGH SEGS + XP UWPOFF,100000 ;IF 1, USER-MODE WRITE PROTECT IS OFF FOR THIS JOB + XP MEDDLE,40000 ;IF 1, USER HAS MEDDLED WITH SHARABLE PROGRAM SUCH + ; THAT PROGRAM CANNOT TRUST ITSELF + ; TO TURN UWP OFF OR CHANGE HIGH SEG CORE ASSIGNMENT + ; MEDDLING MEANS: + ; 1. START N, OR D COMMAND + ; 2. RUN UUO WITH GREATER THAN 1 STARTING + ; INCREMENT + ; 3. GETSEG UUO + ; 4. HIGH SEG IS PHYSICAL CORE (SPY UUO) +XP CORCNT,20000 ;#1, THE HIGH SEG IN CORE COUNT FOR THIS JOB + ; HAS BEEN INCREMENTED, IF 0 IT HAS NOT + ; SET AND CLEARED BY INCCNT AND DECCNT ROUTINES +;RH IS HIGH SEG NUMBER (NUMBER GREATER THAN JOB MAX AND LESS THAN OR EQUAL TO JBTMAX) +; OR IF SPYSEG IS SET, RH IS HIGHEST PHYSICAL ADR USER MAY SPY INTO + +;JOB PRIVILEGE BITS - JBTPRV TABLE +;SET BY LOGIN FROM ACCT.SYS FILE AS MODIFIED BY CUSTOMER +;RH RESERVED FOR SPECIAL CUSTOMER DEFINED PRIVILEGES(PLEASE START AT BIT 35) +;LH RESERVED FOR DIGITAL STANDARD PRIVILEGES + +;BITS IN LEFT HALF + XP PVSPYM,1 ;JOB ALLOWED TO SPY AT MONITOR USING PEEK/SPY UUOS + XP PVSPYA,2 ;JOB ALLOWED TO SPY AT ALL OF CORE USING PEEK/SPY UUOS + XP PVTRPS,4 ;JOB ALLOWED TO USE TRPSET UUO + ; SYSTEM MACROS + +;MACRO TO PREVENT SCHEDULING, USED AT UUO LEVEL WHEN A +;REENTRANT ROUTINE IS CHANGING COMMON DATA NOT YET +;ASSIGNED TO A PARTICULAR JOB + +DEFINE NOSCHED +<> + +;MACRO TO ALLOW SCHEDULING ONCE MORE + +DEFINE SCHEDULE +<> + +;MACRO TO PREVENT CORE SHUFFLING, USED AT UUO LEVEL WHEN +;A ROUTINE SETS UP AN ABSOLUTE USER ADDRESS IN AN AC +;OTHER THAN PDP,PROG, OR JDAT. THE MAIN EXAMPLE IS A BLT +;FROM EXEC TO USER OR USER TO EXEC. + +DEFINE NOSHUFF +<> + +;MACRO TO ALLOW SHUFFLING ONCE MORE + +DEFINE SHUFFLE +<> + +;MACRO TO TURN OFF ALL PI CHANNELS EXCEPT DATA CONTROL ONCE + +DEFINE DISABLE(A) + + +;MACRO TO TURN THEN BACK ON + +DEFINE ENABLE(A) + + + + +;MACRO TO START A DEVICE FROM UUO LEVEL +;TAC:=XWD DEVINT FLAGS,CONO ARGUMENTS + +DEFINE STARTDV(A) + + ;LIST OF INDEPENDENT MONITOR COMMAND FEATURES +;THESE FEATURES CAN BE ELIMINATED FROM A SYSTEM BY +;SETTING THE APPROPRIATE FTXXXX SYMBOL BELOW TO 0 +;AND REASSEMBLING THOSE ROUTINES IN WHICH CODE FOR THE +;FEATURE APPEARS. THE ROUTINES AFFECTED BY EACH FEATURE +;ARE LISTED BELOW. TO GUARANTEE THAT NO ROUTINES ARE +;MISSED, FTXXXX IS DEFINED TO BE AN INTERNAL IN THOSE ROUTINES +;IN WHICH IT IS USED IN CONDITIONAL ASSEMBLY. THUS THE +;RELOCATING LOADER WILL DETECT MULTIPLY DEFINED GLOBALS +;IF NOT ALL ROUTINES AFFECTED HAVE BEEN REASSEMBLED. + +FTTIME=-1 ;TIME ACC + ; APPEARS IN APRSER,STUFF + +FTATTACH=-1 ;ATTACH AND DETACH TTY TO JOB COMMANDS + ; APPEARS IN APRSER,SCNSER + +FTTALK=-1 ;TALK TO TTYS COM. + ; APPEARS IN APRSER,SCNSER + +FTEXAMINE=-1 ;EXAMINE AND DEPOSIT COMMANDS + ; APPEARS IN APRSER + +FTREASSIGN=-1 ;REASSIGN COMMAND + ; APPEARS IN APRSER + +FTTRPSET=-1 ;USER IO - TRPSET,TRPJEN UUOS AND OPCODE 100(PDP-10S ONLY) + ; APPEARS IN APRSER,STUFF,CLKCSS + ; THESE UUOS ARE SOON TO BE REPLACED BY SOME KNAVE-PROOF REAL TIME UUOS + +FTSLEEP=-1 ;SLEEP UUO + ; APPEARS IN APRSER,STUFF + +FTFINISH=-1 ;FINISH COMMAND + ; APPEARS IN APRSER + +FTCHECK=0 ;MONITOR CHECKSUMMING + ; APPEARS IN ALL FILES EXCEPT CHAN, NULL + +FTMONP=0 ;MONITOR WRITE PROTECTED BETWEEN 1000 AND 20000 + ; APPEARS IN ALL FILES EXCEPT CHAN, NULL + FTRCHK=-1 ;ASSEMBLE WITH REDUNDANT CHECKING FOR INTERNAL MONITOR ERRORS. + ; HALT IF AN ERROR IS DETECTED + ; CONTINUE WILL LOOP(IF NON-RECOVERABLE ERROR) OR TRY TO RECOVER + ; OPERATOR SHOULD MAKE NOTE OF MEMORY ADDRESS REG(LOC+1 OF HALT) + ; APPEARS IN DSKINT,..... + + +FTHALT=0 ;MONITOR HALTS WHEN IT DETECTS AN ERROR IN ITSELF INSTEAD OF PRINTING A MESSAGE + ; WHEN IT DETECTS AN ERROR. USED FOR DEBUGGING SO A DUMP CAN BE TAKEN + ; APPEARS IN ERRCON, CONTINUE SWITCH WILL CAUSE USUAL + ; ERROR MESSAGE TO BE PRINTED, AC DAT HAS JSP DAT,ERROR IN IT ON HALT + + +FTTRACK=0 ;MONITOR LEAVES USEFUL INFORMATION IN LOCATIONS + ; IN COMMON, NOT NEEDED EXCEPT FOR LEAVING TRACKS + ; TO DEBUG CRASHES WITH. + +FTTTYSER=-1 ;SCNSRF INSTEAD OF SCNSRH + ; APPEARS IN APRSER + +FT2REL=-1 ;SUBROUTINE CALLS TO SEGCON FOR TWO RELOCATION REGISTER CAPABILITY + ; -1 FOR PDP-6 AND PDP-10. SEGCON IS EITHER A DUMMY SET + ; OF SUBROUTINE OR THE REAL THING DEPENDING ON THE MACHINE. + ; THOSE CUSTOMERS WITHOUT 2 REG MACHINES WHO WANT TO ELIMINATE THE 20 OR SO LOCS OF + ; SUBROUTINE CALLS TO SEGCON, CAN DO SO BY REASSEMBLIN THE MONITOR + ; WITH FT2REL=0. HOWEVER THE COMPANY WILL DISTRIBUTE MONITORS + ; WITH FT2REL=-1 ALWAYS(PDP-6 AND PDP-10) + + ; APPEARS IN FIRST,ONCE,APRSR,SCHED + +FTKCT=-1 ;ACCUMULATE CORE*RUNNING TIME FOR CHARGING FOR EACH USER + +FTPRV=-1 ;PRIVILEGE BITS FOR EACH USER + +FTGETTABL=-1 ;GETTAB UUO - RETURN CONTENTS OF MONITOR JOBTABLES + +FTRA10=0 ;NO RA-10 DISK CONTROLLER (BRYANT DISK) + ;TEMPORARILY USED IN DSKSER + ;DEFINE THE QUEUES, QUANTUM RUNNING TIME IN JIFFIES, AND PRIORITY +;PRIORITY GOES BACKWARD FROM LOW TO HIGH + +DEFINE QUEUES +< X RN,7 ;STRAIGHT RUN (LOWEST PRIORITY)(Q=0) + X WS,6 ;IO WAIT SATISFIED + X TS,6 ;TTY IO WAIT SATISFIED + X ST,6 ;SYSTEM TAPE WAIT + IFN FTDISK,< + X AU,4 ;ALTER DISK UFD QUEUE + X MQ,4 ;MONITOR DISK QUEUE + X DA,4 ;DISK STORAGE ALLOCATION WAIT +> + X DT,4 ;DECTAPE CONTROL WAIT (UP TO 8 DRIVES) + X DC,4 ;DATA CONTROL (DC) WAIT - MAGTAPE AND DECTAPE + X MT,4 ;MAGTAPE CONTROL WAIT (UP TO 8 UNITS) +> + + +;JOB STATUS CODES WHICH HAVE NO CORRESPONDING QUEUES +;JOBS ARE UNRUNABLE WHEN IN THESE STATES + +DEFINE CODES +< X IOW, ;IO WAIT + X TIOW, ;TTY IO WAIT + X SLP, ;JOB SLEEPING + X NUL, ;JOB NUMBER NOT ASSIGNED + X STOP, ;STOP (CONTROL C) +> + XP STTYBF,20 ;SIZE OF TTY BUFFER + XP STTYB1,STTYBF+1 ;LENGTH+1 + + ASUPPRESS ;ELIMINATE ALL SYMBOLS NOT REFERENCED LATER + ; FROM THE SYMBOL TABLE LISTING + LIST + diff --git a/src/schedb.mac b/src/schedb.mac new file mode 100644 index 0000000..b33d156 --- /dev/null +++ b/src/schedb.mac @@ -0,0 +1,1633 @@ +IFE FTDISK+FTRC10+2,< +TITLE SCHEDB - SCHEDULING ALGORITHM FOR SWAPPING SYSTEM(10/50)(BURROUGHS DISK) +> +IFE FTDISK+FTRC10+1,< +TITLE SCHEDD - SCHEDULING ALGORITHM FOR SWAPPING SYSTEM(10/50)(DATA PRODUCTS DISK) +> +SUBTTL CLKCSW R,KRASIN/AF/TH/RCC TS 02 JUNE 69 V421 +XP VSCHED,421 + ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP + +INTERNAL FTRC10 ;THIS SOURCE FILE MAY BE ASSEMBLED TO USE EITHER THE + ; NEW PDP-10 DISK (MODEL RC-10) OR THE OLD PDP-6 DISK (DATA + ; PRODUCTS DISK FILE) FOR SWAPPING. + +IFN FTRC10, < +ENTRY RCXSKD ;THIS SYMBOL IS SOLELY TO PERMIT SYSTEM +RCXSKD: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE. +INTERNAL XCKCSW +> +IFE FTRC10, < +ENTRY XCKCSW +> + +EXTERNAL JOB,JBTSTS +EXTERNAL JBTQ,PJBSTS +EXTERNAL PJBSTS,TIMEF,MJOBN + +INTERNAL NXTJOB,FTSWAP + +;ACCUMULATOR DEFINITIONS --- +QJ=DEVDAT ;QJOB WORD +SW=TAC1 ;STATUS WORD +J=ITEM ;JOB NO. + +;INITIALIZE SCHEDULER (CALLED FROM SYSINI BEFORE ALL OTHER +; DEVICES ARE INITIALIZED) + +INTERNAL NXTINI + +XCKCSW: +NXTINI: MOVEI TAC,MAXQ ;MAX. NO. OF QUEUES + SETZM AVALTB(TAC) ;CLEAR SHARABLE DEVICE AVAIL. FLAGS + SETOM REQTAB(TAC) ;SET SHARABLE DEVICE REQUEST COUNT + ; TO -, I.E. NO JOB WAITING OR + ; USING DEVICE OTHER THAN INITIALIZATION + SOJGE TAC,.-2 + SETZM QJOB ;CLEAR NO. OF JOBS NEEDING REQUEING + SETZM XJOB ;CLEAR NO. OF JOBS NEEDING EXPANDING + SETZM JOBQUE ;CLEAR JOB NO. TO BE REQUEUED + POPJ PDP, + ,NXTJOB DECREMENTS CURRENT JOB'S QUANT. AND PROTECT +,TIMES AND REQUEUES IT IF QUANT. TIME GONE TO 0 +,SERVINCES ANY JOB REQUEING REQUESTED AT OTHER PRIORITY +,LEVELS THEN CALLS SHUFFLER,SWAPPER AND SCHEDULAR. +,MAKES NO ASSUMPTIONS RE. ACS +,RETURSN NEXT JOB TO RUN IN J. + +EXTERNAL JBTSWP,POTLST + +NXTJOB: SKIPN TIMEF ;CLOCK TIC? + JRST NXTJB1 ;NO + MOVSI J,MJOBN ;YES + MOVSI SW,-1 ;DECREMENT IN CORE PROTECT TIME + MOVSI DAT,SWP + TDNE DAT,JBTSTS(J) + JRST .+3 + SKIPL JBTSWP(J) + ADDM SW,JBTSWP(J) + + AOBJN J,.-4 + +NXTJB1: SKIPN J,JOB ;CURRENT JOB NO., IS IT NULL JOB? + JRST CKJB1 ;YES,GO SEE IF OTHER JOBS NEED RESCHEDULING + MOVEI QJ,0 ;GET READY IN CASE CURRENT JOB UNRUNNABLE + HLRZ SW,JBTSTS(J) ;GET JOB STATUS BITS AND CODES + TRZ SW,RUNMSK+CMWB ;MASK OUT DO NOT CARE BITS + CAIE SW,RUNABLE ;IS CURRENT JOB RUNABLE? + JRST CKJR3 ;NO. REQUEU CURRENT JOB + SKIPN TIMEF ;NO. IS THIS A TIME INTERRUPT? + JRST CKJB1 ;NO. + + SOS SW,JBTSTS(J) ;DECREMENT QUANT. TIME + TRNE SW,-1 ;HAS TIME GONE TO 0? + JRST CKJB1 ;NO + MOVEI DAT,QTIME ;YES---REQUEUE AND RESET QUANT. TIME + MOVE TAC,JOBQUE + PUSHJ PDP,QXFER + CKJB1: SKIPG QJ,QJDB ;SET QJ NON ZERO IF ANY REQUEUING TO DO + JRST CKJB5 ;NO REQUEUEING NECESSARY + MOVEI J,JOBMAX ;START WITH HIGHEST JOB NUMBER ASSIGNED +CKJB2: MOVSI SW,JBQ ;JOB NEEDS REQUEUEING BIT + TDNN SW,JBTSTS(J) ;THIS JOB? + SOJG J,.-1 ;NO, KEEP LOOKING + JUMPLE J,CKJB5 ;YES,LOOKED AT ALL JOBS? + ; (MAY NOT FIND A KJOBED JOB IF HIGHEST + ; GO DECR, COUNT QJOB ANYWAY) + ANDCAM SW,JBTSTS(J) ;NO,MARK THIS JOB AS DONE +CKJB3: MOVE SW,JBTSTS(J) ;JOB STATUS WORD + MOVEI DAT,QCMW ;ASSUME COMMAND WAIT + TLNN SW,CMWB ;IS JOB IN COMMAND WAIT? + JRST CKJB9 ;NO. + TLNE SW,SWP+JXPN ;YES, IS JOB ON DISK, OR TRYING TO EXPAND? + JRST CK,JB4A ;YES. PUT JOB IN COMMAND WAIT Q +CKJB9: JUMPGE SW,CKJB4 ;NO,WAIT STATUS CODE DETERMINES NEW Q + LDB SW,PJBSTS ;YES, GET QUEUE CODE. + CAIN SW,WSQ ;*** EXPERIMENTAL *** + JRST CKJB10 ;*** EXPERIMENTAL *** + CAIN SW,TIOWD ;CURRENT JOB GOING INTO TTY IO WAIT? + HRROS JBTSWP(J) ;YES, SET IN CORE PROTECT TIME TO -1, + ; SO HE CAN BE SWAPPED IMMEDIATELY IF SOMEONE + ; ELSE WANTS TO BE SWAPPED IN +CKJB4B: SKIPA DAT,QBITS(SW) ;GET ADDRESS OF TRANSFER TABLE +CKJB4: MOVEI DAT,QSTOP ;IF RUN BIT WAS OFF +CKJB4A: PUSHJ PDP,QXFER ;REQUEUE THE JOB + JUMPE QJ,SCHED ;IF FROM NXTJOB GO DIRECTLY TO SCHED + ; I.E, CURRENT JOB NO LONGER RUNNABLE(IOW) + ; BUT JRQ WASN'T SET SO DON'T DECR QJOB + SOSLE QJ,QJOB ;ANY MORE JOBS TO REQUEUE? + SOJG J,CKJB2 ;YES,BUT LOOK AT EACH JOB ONLY ONCE PER CLOCK TICK + +CKJB5: MOVEI QJ,AVLNUM ;CK AVAL FLAGS FOR SHAR. DEVS. +CKJB6: SKIPN AVALTB(QJ) ;FLAG=0? + SOJG QJ,CKJB6 ;YES - TRY NEXT ONE + JUMPLE QJ,CKJB7 ;NO - OR FINISHED? + HLR J,AVLQTB(QJ) ;NO--GET 1ST JOB IN Q +CKJB6A: HRRE J,JBTQ(J) + JUMPLE J,CKJB8 ;FINISHED Q? WAIT TILL SWAPPER BRINGS IN JOB + MOVE DAT,JBTSTS(J) ;IS JOB IN CORE? + TLNE DAT,SWP + JRST CKJB6A ;NO, LOOK AT NEXT JOB IN THIS QUEUE + ; TO SEE IF IN CORE. + HRRZ DAT,AVLQTB(QJ) ;NO--GET TRANS. TABLE ADDRESS + SETZM AVALTB(QJ) ;CLEAR AVAL FLAG + CAIL QJ,MINQ ;LESS THAN MIN, SHARABLE DEV. Q? + PUSHJ PDP,QXFER ;REQUEUE THE JOB AND PUT IT IN + ; PROCESSOR Q SO SCHEDULER WILL RUN IT +CKJB8: SOJG QJ,CKJB6 ;CONTINUE IF ANY MORE FLAGS TO LOOK AT + CKJB7: ;NONE--GO SHUFFLE AND SWAP +IFE FTSWAP,< EXTERNAL CHKSHF + PUSHJ PDP,CHKSHF +> +IFN FTSWAP,< + PUSHJ PDP,SWAP +> + +;SCHEDULAR--SEARCH THRU QUEUES ACCORDING TO SSCAN TABLE +;FOR 1ST JOB IN CORE--RETURN ITS NO. IN J + +SCHED: SETZM POTLST ;CLEAR POTENTIALLY LOST TIME FLAG + MOVEI DAT,SSCAN ;ADDRESS OF SCAN TABLE + JSP TAC,QSCAN ;BEGIN SCAN + JRST SCHD1 ;NO MORE JOBS--RETURN NULLJOB + SETOM POTLST ;SET POTENTIALLY LOST TIME FLAG FOR CLOCK1 + MOVE QJ,JBTSTS(J) ;IS THIS JOB SWAPPED OUT + TLNE QJ,SWP+SHF+JXPN ;MONITOR WAITING FOR I/O TO STOP,OR JOB EXPANDING CORE? + JRST (TAC1) ;YES--CONTINUE SCAN,JOB CANNOT BE RUN + + HLREM TAC1,JOBQUE ;YES--SAVE ITS Q + MOVSI QJ,WTMASK ;CLEAR WAIT CODE + ANDCAM QJ,JBTSTS(J) + SETZM POTLST ;CLEAR POTENTIALLY LOST TIME AS A USER IS TO BE RUN + POPJ PDP, ;RETURN +SCHD1: SETZ J, ;RETURN NULL JOB + POPJ PDP, + + +;TEMPORARY EXPERIMENTAL SCHEDULING CHANGE TO PERMIT TTY-I/O-WAIT-SATISFIED JOBS ON +; THE DISK TO DISPLACE I/O BOUND JOBS IN CORE.... R.CLEMENTS/D.PLUMER 9 MAY 68 +CKJB10: SKIPE INFLG + SKIPL JBTSWP(J) + JRST CKJB4B + MOVEI DAT,CKJBT + JRST CKJB4A +CKJBT: EXP EQFIX + XWD QQTTY,-PQ2 ;MAKE JOB(LPT) COMPLETE WITH CPU BOUND JOBS +INFLG: 0 ;NON-ZERO MEANS AT LEAST ONE JOB ON DISK WAITING TO COME IN. + SUBTTL OCSS R. KRASIN/AF TS3.17 22 MAR 68 V000 + +,THIS ROUTINE MUST BE ASSEMBLED WITH THE CONFIGURATION +,TYPE TO DEFINE NUMBER OF JOBS +,THIS SECTION CONTAINS 2 ROUTINES FOR Q MANIPULATION +,AND NECESSARY TABLES FOR SPECIFING OPERATIONS PERFORMED +,BY THEM. + +EXTERNAL IMGIN,JBTSTS,JBTADR,PJBSTS +INTERNAL QXFER,QSCAN,FTSWAP,FTDISK + +,STORAGE: +,EACH Q IS A RING STRUCTURED, FORWARD AND BACKWARD +,LINKED SRING LIST. THE "FIRST" LINK IN A Q IS +,A Q-HEADER POINTING TO THE FIRST AND LAST MEMBERS OF THE Q. +,A NULL Q HAS ONE LINK--THE Q-HEADER ITSELF. THE LINKS MAKING +,UP THE OS ARE CONTAINED IN A TABLE (JBTQ) WITH NEGATIVE +,INDICIES (ADDRESSES LESS THAN JBTQ) USED FOR Q-HEADERS AND +,POSITIVE INDICIES USED FOR MEMBERS (JOBS). THUS ONLY ONE WORD +,PER LINK IS NECESSARY--ITS ADDRESS RELATIVE TO JBTQ GIVES THE +,JOB NO. (OR Q NU, IF NEGATIVE) WHICH IT REPRESENTS WHILE +,ITS CONTENTS CONTAINS THE LINKING POINTERS, THESE +,POINTERS ARE ALSO INDICIES RELATIVE TO JBTQ RATHER THAN +,ABSOLUTE ADDRESSES--RH(LINK)=FORWARD POINTER; +,LH(LINK)=BACKWARD POINTER. +,A JOB IS ASSUMED TO BE IN NO MORE THAN ONE Q AT A TIME, AND +,THE NULL JOB (JOB 0) DOES NOT APPEAR IN THE QS (I.E. JBTQ +,ITSELF IS THE Q-HEADER FOR Q 0). + +,ROUTINES: +,BOTH ROUTINES ARE "TABLE DRIVEN" IN THE SENSE THAT THE +,CALLING ROUTINE PROVIDES THE ADDRESS OF A TABLE WHICH +,DEFINES THE SPECIFIC OPERATIONS TO BE PERFORMED. + ;QUEUE INITIALIZATION +;PUT ALL JOBS IN NULL QUEUE(JOB NO. NOT ASSIGNED) +;CALLED ON RESTART AT LOC 143 + +INTERNAL QINT +EXTERNAL CPOPJ,JOBMAX,MXQUE,JBTQ +EXTERNAL JBTQP1 ;EQUALS JBTQ+1 +EXTERNAL JBTCM1 ;EQUALS JBTQ-1 +EXTERNAL JBTOMN ;EQUALS JBTQ-NULQ + +QINI: MOVNI TAC,MXQUE ;MAKE ALL QUEUE HEADERS POINT TO THEMSELVES + HRL TAC,TAC ;BACKWARD POINTERS TOO + MOVEM TAC,JBTQ(TAC) + AOBJN TAC,.-1 + MOVEI TAC,-NULQ ;PUT JOBS ALL IN NULQ QUEUE + MOVSM TAC,JBTQP1 ;BACK POINTER FOR JOB 1 + MOVEI ITEM,JOBMAX ;MAX. JOB NO. + MOVEM TAC,JBTQ(ITEM) ;FOR. POINTER OF JOBMAX JOB NO. + + HRLM ITEM,JBTQMN ;SET NULQ HEADER TO POINT TO JOB1 + MOVEI TAC,1 ;AND JOBMAX + HRRM TAC,JBTQMN ;FORWARD POINTER +QINI1: HRRM ITEM,JBTQM1(ITEM) ;JOB I-1 POINT TO JOB I + SETZM JBTQ + SOJLE ITEM,CPOPJ ;FINISHED? + HRLM ITEM,JBTQP1(ITEM) ;BACK POINTER JOB I+1 POINTS TO JOB I + JRST QINI1 + ,DELETES A JOB FROM ITS "SOURCE-Q", DETERMINES A "DEST-Q" +,ACCORDING TO ONE OF 3 FUNCTIONS, AND INSERTS THE JOB AT +,THE BEGINNING OR END OF THIS DEST-Q. IN ADDITION IT MAY +,RESET THE JOB'S QUANTUM TIME (RH JBTSTS). +,THE DRIVING TABLES ARE "TRANSFER TABLES": +, +,T.TABLE: EXP +, XWD , +, +,DEPENDING ON , THE SECOND WORD IS EITHER DATA OR THE +,ADDRESSES OF "CORRESPONDANCE TABLES". +, +,THE PREFIX OF SPECIFIES WHETHER THE JOB IS TO BE +,INSERTED AT THE BEGINNING OR END OF THE DEST-Q. THE SUFFIX +,DETERMINES THE FUNCTION USED TO SELECT THE DEST-Q. +,THE FOLLOWING ARE THE SIX CODES AND THEIR TABLE FORMATS: + + +,DEST-Q AS A FIXED (PREDETERMINED Q: +,BQFIX: INSERT AT BEG OF DEST-Q +,EQFIX: INSERT AT END +, +, THE JOB IS TRANSFERED TO THE END OF BEG, OF THE Q +, IF = -1, QUANT, TIME IS NOT RESET. +, IF .G. 0 , QUANT. TIME IS RESET TO . +, SINCE THIS FUNCTION IS FULLY DEFINED BY THE SECOND WORD +, ALONE, O CORRES, TABLE IS NECESSARY. + ,DEST-Q AS A FUNCTION OF SOURCE-Q +,BQLINK: INSRT AT BEG OF DEST-Q +,EQLINK: INSERT AT END +, +, =ADDRES OF A CORRES. TABLE "LINKING" SOURCE-QS TO +, DEST-QS, +, IF = -1, QUANT. TIME IS NOT RESET. +, OTHERWISE IS TAKEN AS THE ADDRESS OF A +, TABLE OF QUANT. TIMES CORRESPONDING TO THE Q-LINKING TABLE. +, FORMAT OF THE TABLES ARE: +, +, : XWD , ;1ST SOURCE-Q:DEST-Q PAIR +, ... +, XWD , ;NTH ... +, Z ;ZERO TERMINATES TABLE +, +, : EXP ;CORRES. TO +0 +, ... +, EXP ;CORRES. TO +N-1 + +, Z +, +, UPON A CALL TO QXFER FOR THESE 2 CODES, AC T2 CONTAINES +, THE SOURCE-Q (CURRENT Q) OF THE JOB. THE LH OF THE +, ENTRIES ARE SEARCHED FOR A MATCH.,IF FOUND, THE +, RH IS TAKEN AS THE DEST-Q AND THE QUANT. TIME IS RESET +, (IF NOT -1) TO THE CORRES. ENTRY IN THE +, TABLE. +, IF NO MATCH FOUND..NO TRANSFER TAKES PLACE. + +,DEST-Q AS A FUNCTION OF JOB SIZE +,BQJSIZ INSERT AT BEG OF DEST-Q +,EQJSIZ INSERT AT END +, +, =ADDRESS OF A TABLE ASSOCIATING JOB SIZE +, (IN 1K BLOCKS) TO DEST-QS. +, HAS SAME MEANING AS FOR B-EQLINK +, +, : XWD , +, ... +, XWD , +, Z +, +, : SIMILAR TO THAT FOR B-EQLINK +, +, THE 'S MUST BE IN INCREASING ORDER. +, THE TABLE IS SEARCHED UNTIL IS LESS THAN OR +, EQUAL TO THE JOB SIZE, THEN THE CORRES. IS +, TAKEN AS THE DEST-Q. IF THE TABLE IS EXAUSTED, NO +, TRANSFER TAKES PLACE, +, QUANT, TIME IS HANDLED AS IN B-EQLINK. + ,CALLING SEQUENCE: +, MOVE J,[JOB NUMBER] +, MOVE T2,[CURRENT Q] ;BQLINK AND EQLINK ONLY +; MOVEI TT,TRANS TABLE ADDRESS +, PUSHJ PDP,QXFER +, ... ;RETURN +, ON RETURN J IS UNALTERED; LH(Q)=-1 IF QUANT, TIME OUT +, RESET; QUANT, TIME IF RESET;RH(Q)=DEST.Q +, +,ACS: +TT=DAT ;POINTER TO TRANSFER TABLE +J=ITEM ;JOB NO. +Q=PROG ;DEST-Q AND QUANT. TIME ON RETURN +T1=TAC1 ;TEMP +T2=TAC ;TEMP AND SOURCE-Q ON CALL TO B,EQLINE + +EXTERNAL ERROR + +QXFER: MOVE Q,1(TT) ;GET TRANSFER TABLE ADDRESS + JRST @(TT) ;DISPATCH + +,DEST-Q AS FUNCTION OF SOURCE-Q +QLINK: SKIPN T1,(Q) ;END OF TABLE? + POPJ PDP, ;YES + HLRE T1,T1 + CAME T1,T2 ;NO--SOURCE-Q=LH(TABLE ENTRY)? + AOBJP Q,QLINK ;NO- CONTINUE SEARCH + JRST QX2 + +,DEST-Q AS FUNCTION OF JOB SIZE +QJSIZ: HLRZ T2,JBTADR(J) ;HIGHEST REL. LOC. OF JOB + ASH T2,-^D10 ;CONVERT TO NO. OF 1K BLOCKS - 1. + MOVSI T2,1(T2) ;NO. OF 1K BLOKS TO LH. +QX1: SKIPN T1,(Q) ;END OF TABLE? + JSP DAT,ERROR + CAMLE T2,T1 ;JOBSIZE .LE. LH(TABLE ENTRY)? + AOBJP Q,QX1 ;NO--CONTINUE SEARCH, JUMP ALWAYS. + +QX2: MOVS T2,Q ;T2 IS ADDR. OF QUANT.TIME(IF REQUESTED) + HRRO Q,(Q) ;RH(Q)=DEST-Q;LH=-1(NO QUANT.TIME REQ.) + SKIPL 1(TT) ;WAS QUANT. TIME REQUESTED? + HRL Q,(T2) ;YES--GET IT + ,FIXED DEST-Q +QFIX: MOVE T1,JBTQ(J) ;DELETE JOB FROM SOURCE-Q + MOVS T2,T1 ;T1=FORW. LINK, T2=BACK LINK + HRRM T1,JBTQ(T2) ;FORW, LINK PAST JOB + HRLM T2,JBTQ(T1) ;BACK LINK PAST JOB + + SKIPGE (TT) ;END OR BEG. OF Q? + HLR Q,JBTQ(Q) ;END--THIS WILL LEAVE Q=IDX OF + ; CURRENT LAST LINK;T2=IDX OF Q-HEADER + MOVE T2,JBTQ(Q) ;BEG--T2=IDX OF CURRENT 1ST LINK + ; Q=IDX OF Q-HEADER + HRRM J,JBTQ(Q) ;INSERT JOB IN DEST-Q + HRLM J,JBTQ(T2) + HRRM T2,JBTQ(J) + HRLM Q,JBTQ(J) + + JUMPL Q,QX3 ;RETURN IF QUANT. TIME NOT REQ. + HLRM Q,JBTSTS(J) ;SET QUANT. TIME + + MOVEI TT,RNQ ;SET JOB STATUS WAIT + DPB TT,PJBSTS ;CODE TO RUN QUEUE (0). +QX3: POPJ PDP, + +BQFIX=QFIX +EQFIX=QFIX+1B0 +BQLINK=QLINK +EQLINK=QLINE+1B0 +BQJSIZ=QJSIZ +EQJSIZ=QJSIZ+1B0 + ,SCANS THE QS RETURNING THE NUMBERS OF THE JOBS IN THE QS. +,THE ORDER AND MANNER IN WHICH THE QS ARE SEARCHED IS +,DETERMINED BY A "SCAN TABLE" ADDRESSED IN THE CALLING SEQ. +,THE SCAN TABLE HAS THE FORM: +, +,SCANTAB: XWD , ;SCN Q1 ACCRDING TO CODE1 +, ... +, XWD , ;QN ACCORDING TO CODEN +, Z ;ZERO TERMINATES TABLE +, +,EACH Q MAY BE SCANNED IN ONE OF FOUR WAYS SPECIFIEDBY +,THE CODES ARE: +, +,QFOR SCAN WHOLE Q FORWARD +,QFOR1 SCAN FOR ONLY THE 1ST MEMBER (IF ANY) +,QBAK SCAN WHOLE Q BACKWARD +,QBAK1 SCAN BACKWARD FOR ALL MEMBERS EXCEPT THE 1ST +, +,CALLING SEQ. +, +, MOVEI ST,SCAN TABLE ADDRESS +, JSP PC,QSCAN ;SET UP PC FOR REPEATED RETURNS +, ... ;RETURN HERE WHEN NO MORE JOBS +, ... ;RETURN HERE WITH NEXT JOB IN AC J +, ; AND ITS Q IN LH(QR) +, +, PERFORM ANY NECESSARY TESTING OF THIS JOB +, J,ST,PC,QR MUST BE PRESERVED +, +, JRST (QR) ;RETURN TO QSCAN TO GET NEXT JOB +, ; IF THIS ONE NOT ACCEPTABLE +, +,ACS: +J=ITEM ;JOB NO. +ST=DAT ;POINTER TO SCAN TABLE +PC=TAC ;RETURN ADDRESS +QR=TAC1 ;ITERATED RETURN ADDRESS TO QSCAN + QSCAN: SKIPN QR,(ST) ;END OF SCAN TABLE? + JRST (PC) ;YES--RETURN TO CALL+1 + HLRE J,QR ;NO--GET NO. OF Q + JRST (QR) ;DISPATCH + +QFOR1: MOVEI QR,QFOR2 ;ONLY THE FIRST JOB + +QFOR: HRRE J,JBTQ(J) ;SCAN FORWARD ALL JOBS + JUMPG J,1(PC) ;RETURN THIS JOB NO. CALL+2 UNLESS-- +QFOR2: AOJA ST,QSCAN ;END OF THIS Q--GET NEXT Q + +QBAK1: HLRE J,JBTQ(J) ;SCAN BACKWARD ALL JOBS EXCEPT 1ST + SKIPLE JBTQ(J) ;IS THIS THE FIRST MEMBER? + JRST 1(PC) ;NO--RETURN CALL+2 + AOJA ST,QSCAN ;YES--GET NEXT Q + +QBAK: HLRE J,JBTQ(J) ;SCAN BACKWARD ALL JOBS + JUMPG J,1(PC) ;RETURN CALL+2 WITH JOB NO. UNLESS + AOJA ST,QSCAN ;BEG OF THIS Q--GET NEXT Q + INTERNAL FTCHECK,FTMONP +IFN FTCHECK+FTMONP,< +EXTERNAL AVALTB +DEFINE X(A,B),< +EXTERNAL A'AVAL +INTERNAL A'Q +A'Q=ZZ +ZZ=ZZ+1 +> + ZZ=0 + QUEUES + LOC=ZZ +> +IFE FTCHECK+FTMONP,< + +;SHARABLE DEVICE JUST BECOME AVAILABLE(EXTENDED TO OTHER QUEUEW TOO) +;APPROPRIATE ENTRY IS SET NON-ZERO WHEN SCHEDULER SHOULD LOOK +;AT THAT QUEUE TO FIND A JOB TO RUN +;WSAVAL CONTAINS THE NO. OF JOBS WITH IO WAIT SATISFIED(0=NONE) + +DEFINE X(A,B) + + +INTERNAL AVALTB +AVALTB: QUEUES ;GENERATE THE AVAL FLAGS +LOC=.-AVALTB +> +NQUEUE=LOC ;NO. OF QUEUES COUNTING RUN QUEUE +XP MAXQ,NQUEUE-1 ;MAX. STATE CODE WHICH HAS AN AVAL FLAG +XP MINQ,STQ ;MINIMUM SHARABLE DEVICE QUEUE +XP AVLNUM,MAXQ ;MAX. STATE CODE WHICH HAS AN AVAL FLAG + +;DEFINE STATE CODES WHICH DO NOT HAVE AVAL AND REQ FLAGS + + +DEFINE X(A) + + CODES + ;CORRESPONDENCE TABLE BETWEEN JOB STATUS CODES AND QUEUE TRANSFER TABLES +;USED BY SCHEDULER +;RUNCSS SETS JOB STATUS WORD TO NEW STATE CODE. +;SCHEDULER SETS UP QUEUE TRANSFER TABLE ADDRESS FROM +;FOLLOWING TABLE USING NEW STATE CODE AS INDEX + +DEFINE X(A,B) +< EXP Q'A'W +> + +INTERNAL QBITS + +QBITS: QUEUES + IFN FTCHECK+FTMONP,< +DEFINE X(A,B),< +EXTERNAL A'RFQ +> + QUEUES +EXTERNAL REQTAB +> +IFE FTCHECK+FTMONP,< + +;SHARABLE DEVICE REQUEST TABLE(GENERALIZED FOR OTHER QUEUES TOO) +;CONTAINS THE NUMBER OF JOB WAITING TO USE SHARABLE DEVICE +;WSREQ AND RNREQ ARE UNUSED + +DEFINE X(A,B) + + +INTERNAL REQTAB + +REQTAB: QUEUES ;GENERATE REQ TABLE +> + ;CORRESPONDENCE TABLE LH=QUEUE CODE, RH=QUEUE TRANSFER TABLE ADR. +;INDEX INTO TABLE ALSO = QUEUE CODE +;FOR SHARABLE DEVICES ONLY +;SCHEDULER TAKES ONE JOB WAITING FOR A SHARABLE DEVICE AND +;PUTS IT IN THE APPROPRIATE RUN QUEUE ACCORDING TO +;QUEUE TRANSFER TABLE AS SPECIFIED BELOW BY THE JOB WAIT +;STATE CODE. + +DEFINE X(A,B) +< XWD -A'Q,Q'A'S +> + +QRNS=0 ;NO CORRESPONDENCE TABLES FO THESE QUEUE +QWSS=0 +QTSS=0 + +INTERNAL AVLQTB + +AVLQTB: QUEUES + IFN FTCHECK+FTMONP,< +EXTERNAL QJOB,JOBQUE ;JOBQUE WILL CAUSE LOAD OF PROPER SCHDAT + ; DEPENDING ON FTRC10 IN SCHDAT +IFN FTSWAP,< +EXTERNAL XJOB +>> +IFE FTCHECK+FTMONP,< + +INTERNAL JOBQUE +JOBQUE: 0 ;JOBS TO BE REQUEUED ON CLOCK INTERRUPT + +INTERNAL QJOB +QJOB: Z ;NUMBER OF JOBS NEEDING Q TRANSFERS AT OTHER THAN CLOCK LEVEL + +IFN FTSWAP,< +XJOB: Z ;NUMBER OF JOBS NEEDING CORE EXPANSION BY SWAPOUT-IN +INTERNAL XJOB +> +> + INTERNAL QSTOP,QTIME,SSCAN,QCMW + +BQFIX=QFIX ;BEGINNING OF QUEUES FIXED QUEUE DISCIPLINE +EQFIX=QFIX+1B0 ;END OF QUEUES " " " +BQLINK=QLINK +EQLINK=QLINK+1B0 +BQJSIZ=QJSIZ +EQJSIZ=QJSIZ+1B0 +DEFINE TTAB(FCTN,QUEUE,QUANT) +< EXP FCTN + XWD QUANT,-QUEUE +> +DEFINE PTTAB(FCTN,QUEUE,QUANT) +< EXP FCTN + XWD QUANT,QUEUE +> + +QNULW: TTAB EQFIX,NULQ,-1 ;NULL QUEUE JOB NO. NOT ASSIGNED +QSTOP:QSTOPW: TTAB EQFIX,STOPQ,-1 ;UNRUNABLE JOBS TO END OF STOPQ +QCMW: TTAB EQFIX,CMQ,-1 ;COMMAND WAIT TILL JOB IN CORE +QRNW: PTTAB EQJSIZ,QSTAB,QQSTAB ;JUST RUNABLE JOBS + ;WHICH ARE NOT IN SOME WAIT STATE BELOW,ENTER PROCESSOR + ;QS AT END AND GET QUANT. TIME ACCORDING TO THEIR SIZE + +QWSW: TTAB BQFIX,PQ1,QQTTY ;IO WAIT SAT.(EXCEPT TTY) + ;ENTER FRONT OF PROCESSOR QS AND GET QUANT, TIME + ;ACCORDING TO JOB SIZE +QTSW: TTAB BQFIX,PQ,QQTTY ;TTY IO WAIT SATISFIED(ENTER FRONT OF PQ1) + +QIOWW: TTAB EQFIX,IOWQ,-1 ;IOW(EXDEPT TTY) HELD IN IOWQ +QTIOWW: TTAB EQFIX,TIOWQ,-1 ;TTY IOW HELD IN TIOWQ +QAUW: TTAB EQFIX,AUQ,-1, +QMQW: TTAB EQFIX,MQQ,-1 ;MON. Q(DISK) WAIT +QDAW: TTAB EQFIX,DAQ,-1 ;DEV. ALLOC.(DISK) +QDCW: TTAB EQFIX,DCQ,-1 ;DATA CONTROL WAIT +QSTW: TTAB EQFIX,STQ,-1 ;SYST TAPE +QDTW: TTAB EQFIX,DTQ,-1 ;DEC TAPE +QMTW: TTAB EQFIX,MTQ,-1 ;MAG TAPE +QSLPW: TTAB EQFIX,SLPQ,-1 ;SLEEP UUO + ;TRANSLATION TABLE FROM WAIT STATE TO SATISFIED STATE +;DO NOT RESET QUANTUM RUN TIME + +QQSD=-1 + +QMSQ: TTAB BQFIX,PQ1,QQSD ;START MON. Q(DISK) AT PQ1 +QDAS: TTAB BQFIX,PQ1,QQSD ;DEV. ALLOC.(DISK)... +QDCS: TTAB BQFIX,PQ1,QQSD ;DATA CONTROL... +QSTS: TTAB BQFIX,PQ1,QQSD ;SYST TAPE +QDTS: TTAB BQFIX,PQ1,QQSD ;DEC TAPE +QMTS: TTAB BQFIX,PQ1,QQSD ;MAG TAPE +QAUS: TTAB BQFIX,PQ1,QQSD ;ALTER UFD +QTIME PTTAB EQLINK,QTTAB,QQSTAB ;MOVE JOB TO LOWER Q + ;WHEN QUANT. TIME EXCEEDED AND RESET QUANT. TIME + ,ENTER PROCESSOR QS ACCORDING TO JOB SIZE +QSTAB: XWD 4,-PQ1 ;PQ1 IF SIZE .LE. 4K + XWD ^D16,-PQ2 ;PQ2 IF 4K .L. SIZE .LE. 16K + XWD ^D256,-PQ3 ;PQ3 IF 16 .L. SIZE + +,PUT JOB DOWN A Q IF EXCEEDS QUANT. TIME +QQTAB: XWD -PQ1,-PQ2 + XWD -PQ2,-PQ3 + XWD -PQ3,-PQ2 ;BACK TO PQ2 TO COMPETE WITH IOWS JOBS + Z + +,QUANTUM TABLES + +QQSD=6 ;TENTH SEC. INITIAL QUANT. FOR SHAR. DEV. WAITERS +QQTTY=6 ;TENTH SEC. INITIAL QUANT. FOR TTY IOWS + +, QUANT. TIMES ACCORDING TO PROCESSOR Q: + +INTERNAL RNQUNT + +RNQUNT: +QQSTAB: EXP ^D30 ;PQ1: ONE HALF SECOND + EXP 2*^D60 ;PQ2: TWO SECONDS + EXP 2*^D60 ;PQ3: TWO SECONDS + Z + IFN FTSWAP,< +INTERNAL ISCAN,QSCAN +ISCAN: ;SCAN FOR INPUT + XWD -CWM,QFOR ;MONITOR COMMAND WHICH NEEDS CORE IMAGE IN CORE + XWD -MQQ,QFOR1 ;LOOK FOR 1ST JOBS IN SHAR. DEV QUEUES + XWD -DAQ,QFOR1 + XWD -AUQ,QFOR1 + XWD -DCQ,QFOR1 + XWD -MTQ,QFOR1 + XWD -STQ,QFOR1 + XWD -DTQ,QFOR1 +SSCAN: XWD -PQ1,QFOR ;SCAN PROCESSOR AS SCHEDULER DOES + XWD -PQ2,QFOR + XWD -PQ3,QFOR + Z ;PATCH SPACE + Z + Z ;FINAL ZERO TO FLAG END + +QSCAN: ;SCAN FOR OUTPUT + XWD -STOPQ,QFOR ;UNRUNABLE JOBS FIRST + XWD -SLPQ,QFOR + XWD -DTQ,QBAK1 ;ANY SHAR. DEV.WAITERS MORE THAN 1 DEEP + XWD -STQ,QBAK1 + XWD -MTQ,QBAK1 + XWD -DCQ,QBAK1 + XWD -AUQ,QBAK1 + XWD -DAQ,QBAK1 + XWD -MQQ,QBAK1 + XWD -TIOWQ,QFOR ;TTY IOW + XWD -PQ3,QBAK + XWD -DTQ,QFOR1 + XWD -STQ,QFOR1 + XWD -MTQ,QFOR1 ;NOW SCAN FIRST JOB IN QUEUES + XWD -DCQ,QFOR1 + XWD -AUQ,QFOR1 + XWD -DAQ,QFOR1 + XWD -MQQ,QFOR1 + XWD -PQ2,QBAK + XWD -PQ1,QBAK + Z ;PATCH SPACE + Z + Z ;FINAL ZERO TO FLAG END +> + SUBTTL SWAP R. KRASIN/AF TS4.34 03 FEB 69 V406 + +,SWAPPER CALLED EVERY CLOCK TIC. +,SINCE MOST OPERATIONS STARTED BY THE SWAPPER REQUIRE SEVERAL +,TICS TO RUN TO COMPLETON, SEVERAL FLAGS(FINISH,FIT,FORCE +;ARE USED TO "REMEMBER" PREVIOUS STATES. +,THE BASIC ALOGRITHM: +;IS CORE SHUFFLER WAITING FOR IO TO FINISH FOR SOME JOB? +; YES--TRY AGAIN TO SHUFFLE(WHEN IO STOPS) +;IS CORE SHUFFLER STILL WAITING FOR IO TO FINISH? +; YES--RETURN AND DO NOTHING +;IS SWAPPER STILL BUSY? +; YES--RETURN AND DO NOTHING +,SCAN QS FOR 1ST JOB OUT OF CORE. +, IF NONE-RETURN +;A: +, IF ONE--WILL LOW(HIGH) SEG FIT IN LARGEST HOLE IN CORE? +, YES--START INPUT AND RETURN +, NO--IS TOTAL FREE CORE(CORTAL) ENOUGH TO ACCOMMODATE LOW(HIGH) SEG? + +; YES--CALL CORE SHUFFLER +; IS SHUFFLER WAITING FOR IO TO STOP? +; YES--RETURN AND DO NOTHING +; NO--GO TO A: +, NO--"REMEMBER" THIS JOB FROM INPUT AND LOOK FOR OUTPUT: +,ANY JOBS WAITING TO XPAND CORE BY SWAP OUT/IN? +, YES--OUTPUT ONE AND RETURN +, NO--SCAN QS BACKWARD FOR JOB IN CORE WHOSE PROTECT TIME +, (SET ON INPUT) HAS GONE TO 0. +, IF NONE--RETURN +, IF ONE--IS IT SWAPPABLE(NO ACTIVE IO AND NOT CURRENT JOB)? +, YES--OUTPUT HIGH SEG(IF ANY AND NOT ON DISK) THEN LOW SEGMENT +, NO--SET SWP BIT(SO SCHEDULER WILL NOT RUN), IO WILL CONTINUE +, IN LOW SEGEMENT AS LONG AS IT CAN +, IO ROUTINES NO LONGER STOP IF SWP SET, JUST SHF) + +EXTERNAL JBTSTS +EXTERNAL BIGHOL,CORTAL,ANYDEV,JBTADR,JBTSWP,KCORE1,TRYSWP +EXTERNAL IMGOUT,IMGIN,FINISH,FIT,FORCE +EXTERNAL OERROR,CORGET,JBTDAT,JOBDPG,JOBDPD,JOBPC +EXTERNAL JBTDAT,SHFWAT,CHKSHF +EXTERNAL FULCNT,ERRPNT,EXCALP,PCSTOP,PCORSZ,VIRTAL + +INTERNAL SWAP +INTERNAL XPAND,FT2REL + +T=DEVDAT +T1=TAC1 +T2=TAC +J=ITEM + +,ALL DEVICE DEPENDENT CODE MARKED WITH A "*" + SWAP: SKIPE SHWAT ;IS CORE SHUFFLER WAITING FOR IO TO STOP + ; FOR SOME JOB? + PUSHJ PDP,CHKSHF ;YES, CALL CORE SHUFFLER TO SEE IF + ; IO STOPPED YET + SKIPN SHFWAT ;IS SHUFFLER STILL WAITING? + SKIPE SQREQ ;*NO--IS SWAP SERV, ROUT. STILL BUSY WITH LAST JOB? + POPJ PDP, ;*YES--RETURN + SETZM INFLG ;*** EXPERIMENTAL *** + SKIPN J,FINISH ;NO--ANY IN/OUTPUT TO FINISH? + JRST SWP2 ;NO- + JUMPL J,FINOUT ;YES--INPUT OR OUTPUT? + SKIPE SERA ;INPUT, ANY INPUT ERRORS? + JRST INERR ;YES +FININ0: ;HERE IF NOTHING TO SWAP IN(HIGH OR LOW SEG EXPANDING FROM 0) +IFN FT2REL,< + EXTERN FININ + PUSHJ PDP,FININ ;IS THERE A HIGH SEG WHICH MUST BE SWAPPED IN? + JRST FIT1 ;YES, GO SWAP IT IN(J SET TO HIGH SEG NO.JOB # INPJOB) + ; NO, EITHER HIGH SEG ALREADY IN FOR ANOTHER USER + ; OR THERE IS NON, J STILL JOB NO,(IE LOW SEG) + ; OR J IS HIGH SEG WHICH EXPANDED FROM NOTHING(XPANDH) + ; IN WHICH CASE IT HAS NO DISK SPACE AND DIDLING ACS + ; AND SETTING PROTECT TIME WON'T MATTER EITHER. +> + LDB T,IMGIN ;NEW CORE SIZE + LDB T1,IMGOUT ;OLD SIZE WHEN ON DISK + SUB T1,T ;OLD-NEW=DECREASE + ; HAS USER DECREASED VIRTUAL MEMORY FROM M TO N(N OR 0) + ; WHILE OUT ON DISK(R,RUN,GET,KJOB) TO 140 WORDS? + ; CORE COMMAND ALWAYS FORCES SWAP IN BEFORE + ; CORE REASSIGNMENT SO NOT IN THIS CATAGORY + ; FRAGMENTED USER TOO HARD TO PARTIALLY RECLAIM DISK SPACE + ; ON REDUCTION WHICH DOES NOT GO TO 0 + SKIPLE T1 ;DECREASED? + ADDM T1,VIRTAL ;YES, NOW INCREASE VIRTUAL MEMORY AVAILABLE BY + ; AMOUNT OF DECREASE IN HIGH OR LOW SEG + PUSHJ PDP,ZERSWP ;RETURN LOW SEG DISK SPACE, SET IMGOUT,IMGIN + ; AND SWP!SHF(JBTSTS) TO 0 + LDB T,PCORSZ ;COMPUTE AND SET IN CORE IN CORE PROTECT TIME FROM + ; SIZE OF JOB(1K BLOCKS-1) + IMUL T,PROT ;ADD VARIABLE AMOUNT DEPENDING ON CORE SIZE + ADD T,PROT0 ;ADD FIXED AMOUNT INDEPENDENT OF CORE SIZE + HRLM T,JBTSWP(J) + MOVE JDAT,JBTDAT(J) ;SETUP LOW SEG PROTECTION,RELOCATION + IFN JDAT-PROG,< + MOVE PROG,JBTADR(J) +> + MOVE T,JOBPC(JDAT) ;JOB STOPPED IN EXEC MORE? + TLNE T,USRMOD ;TEST PD FLAG + JRST SWP1 ;NO + HRRZ T,JOBDPG(JDAT) ;YES, ADJUST PROG AND PDP IN DUMP AC AREA + SUBI T,(PROG) ;OLD RELOC-NEW RELOC + MOVNS T ;NEW RELOC-OLD RELOC + ADDM T,JOBDPD(JDAT) ;ADJUST DUMP PDP + MOVEM PROG,JOBDPG(JDAT) ;STORE NEW AC PROG + JRST SWP1 + +INERR: SETZM FINISH ;CLEAR FINISH FLAG SO SWAPPING CAN CONTINUE + MOVE PROG,JBTADR(J) ;SETUP RELOC,PROTECTION FOR HIGH OR LOW SEG + IFN PROG-JDAT, + PUSHJ PDP,KCORE1 ;RETURN CORE + JSP TAC,ERRPNT ;PRINT ON USER CONSOLE + ASCIZ /SWAP READ ERROR/ + JRST PCSTOP ;STOP JOB AND FORCE RESCHDULING +FINOUT: MOVNS J ;FINISH OUTPUT, -FINISH=JOB NO. + SKIPE SERA ;ANY ERRORS + JRST SWPREC ;YES, RECORD ERROR AND TRY AGAIN, + ; IN A DIFFERENT PLACE ON DISK + MOVE PROG,JBTADR(J) ;XWD PROTECT,,RELOC. FOR LOW SEG +IFN PROG-JDAT,< + MOVE JDAT,JBTDAT(J) ;JOB DATA AREA +> + PUSHJ PDP,KCORE1 ;RETURN CORE FOR LOW OR HIGH SEG JUST SWAPPED OUT + ; EVEN IF + ; ANOTHER JOB STARTED TO SHARE HIGH SEG DURING + ; SWAP OUT (GET) SINCE JOB IS MARKED WITH + ; SWP BIT ON AND CANNOT RUN UNTIL HGIH SEG IS SWAPPED BACK IN +IFN FT2REL,< + EXTERN FINOT + PUSHJ PDP,FINOT ;IS THIS A HIGH SEG WHICH WAS JUST SWAPPED OUT? + ;YES, J SET TO LOW SEG NO, GO TRY SWAP IT OUT + ; NO, THIS WAS A LOW SEG, ALL SWAPPING FOR THIS USER + ; IS FINISHED. +> +SWP1: SETZM FINISH ;CLEAR FINISH FLAG +SWP2: SKIPE J,FORCE ;WAITING FOR JOB TO BECOME SWAPPABLE? + JRST FORCE1 ;YES +FIT0: SKIPE J,FIT ;NO-- WAITING TO FIT JOB IN CORE? + JRST FIT1 ;YES + ,SCAN FOR INPUT + MOVEI DAT,ISCAN + JSP TAC,QSCAN + JRST CHKXPN ;NO INPUT TO DO--CK FOR EXPANDING JOBS + MOVE T,JBTSTS(J) ;THIS JOB OUT OF CORE? + TLNN T,SWP ;SWP ON IF HIGH SEG SWAPPED OUT FOR THIS USER + ; OR BOTH SEGS SWAPPED OUT + + JRST (TAC1) ;NO--CONTINUE SCAN + +FIT1: MOVEM J,FIT ;REMEMBER JOB(OR HIGH SEG) TRYING TO FIT IN + LDB AC1,IMGIN ;CORE SIZE NEEDED FOR THIS SEG(0 IF LOW SEG + ; OR HIGH SEG WITH UWP OFF ALREADY IN CORE) +IFE FT2REL,< + CAMLE AC1,CORTAL ;WILL LOW SEG FIT IN FREE+DORMANT CORE? +> +IFN FT2REL,< + EXTERN FITSIZ + PUSHJ PDP,FITSIZ ;COMPUTE AMOUNT OF CORE NEEDED TO BRING IN + ; 1. THIS JOBS LOW SEG AND HIGH SEG + ; 2. THIS JOBS LOW SEG(HIGH ALREADY IN OR NONE) + ; 3. THIS HIGH SEG BECAUSE LOW SEG ALREADY IN + ;WILL LOW SEG FIT IN FREE+DORMANT+IDLE CORE? +> + JRST SCNOUT ;NO,WILL NOT FIT EVEN IF ALL DORMANT SEGS DELETED + ; AC1=TOTAL CORE NEEDED(IN K) + CAMG AC1,BIGHOL ;YES, WILL THIS SEG FIT IN BIGGEST HOLE OF FREE CORE + ; WITHOUT DELETING ANY DORMANT OR IDLE SEGS? + ; (AC1 RESTORED TO SIZE FOR JUST THIS LOW OR HIGH SEG) + + JRST SWAPI ;YES, GO SWAP IN THIS LOW OR HIGH SEG +IFN FT2REL,< + EXTERN FRECR1,HOLEF + SKIPN HOLEF ;NO, ARE THERE ANY HOLES IN CORE WHICH THE SHUFFLER + ; COULD ELIMINATE(NOT COUNTING ONE AT TOP)? + PUSHJ PDP,FRECR1 ;NO, GO DELETE ONE DORMANT SEG IN CORE + ; AND ALWAYS SKIP RETURN(THERE MUST BE AT LEAST + ; ONE, OTHERWISE CORTAL=BIGHOL)MONITOR ERROR IF NONE +> + PUSHJ PDP,CHKSHF ;YES, CALL CORE SHUFFLER TO MOVE ONE SEG DOWN + SKIPN SHFWAT ;SHUFFLER WAITING FOR IO TO STOP? + JRST FIT0 ;NO, SEE IF JOB WILL FIT NOW. + POPJ PDP, ;YES, RETURN AND WAIT TILL IO STOPS + EXTERN VIRTAL,SWPERC + +SWPREC: MOVE TAC,SERA ;ERROR FLAGS + IORM TAC,SWPERC ;SAVE FOR POSTERITY + LDB TAC,IMGOUT ;DECREASE TOTAL AMOUNT + MOVNS TAC ;OF VIRTUAL CORE IN THE MACHINE + ADDM TAC,VIRTAL ;BY THE AMOUNT BEING GIVEN UP + LDB TAC,IMGOUT + TLO TAC,1 + ADDM TAC,SWPERC + JRST SWAPO ;GO TRY AGAIN + +;NO INPUT TO DD, CHECK FOR EXPANDING JOBS +CHKXPN: SKIPG XJOB ;ANY JOBS TO EXPAND + POPJ PDP, ;NO, RETURN FROM SWAPPER, NOTHING TO INPUT OR OUTPUT + ; YES, FALL INTO SCNOUT WHICH WILL SWAP OUT EXPANDING + ; JOB SINCE THERE IS ONE +;INPUT TO DO, CHECK TO SEE IF ANY JOBS JUST HAPPEN TO WANT TO EXPAND + + EXTERN HIGHJB,JBTSTS,ERROR,MAXSIZ,MAXJBN,SUMCOR +SCNOUT: SKIPG XJOB ;ANY JOBS WAITING TO EXPAND? + JRST SCNJOB ;NO, SCAN ALL JOBS IN PRIORITY ORDER LOOKING + ; FOR ONE TO SWAP OUT + MOVE J,HIGHJB ;YES, START WITH HIGHEST JOB NUMBER ASSIGNED + MOVSI T,JXPN ;SETUP JOB EXPANDED BIT + TDDN T,JBTSTS(J) ;IS THIS JOB EXPANDING? + SOJG J,.-1 ;NO, KEEP LOOKING + IFN FTRCHK,< + JUMPG J,SCNOK ;CLEAR XJOB SO MESSAGE WILL PRINT + JSP DAT,ERROR ;ERROR IF NONE FOUND +> +SCNOK: SOS XJOB ;DECREMENT COUNT OF EXPANDING JOBS + ANDCAM T,JBTSTS(J) ;CLEAR EXPAND BIT IN JOB STATUS WORD + JRST FORCE0 ;GO TRY TO SWAP JOB OUT + ;SCAN FOR JOB TO OUTPUT IN ORDER TO MAKE ROOM FOR JOB TO COME IN +;SIZE(IN K) NEEDED TO GET THIS USER IN CORE IS IN AC1(FITSIZ) +;JUST LOW SEG SIZE IF NO HIGH OR HIGH ALREADY IN, JUST HIGH IF LOW ALREADY IN, +;OR SUM IF BOTH MUST BE SWAPPED IN + +SCNJOB: MOVE T,CORTAL ;INITIALIZE FREE CORE COUNTER + MOVEM T,SUMCOR + SETZM MAXSIZ ;CLEAR SIZE OF LARGEST JOB + MOVEI DAT,OSCAN ;SCAN ALL JOBS RANKED IN PRIORITY TO BE SWAPPED OUT + JSP TAC,QSCAN + JRST NOFIT ;NO MORE JOBS LEFT, CANNOT FIT JOB IN CORE + CAMN J,FIT ;IS THIS JOB WE ARE TRYING TO FIND IN? + JRST(TAC1) ;YES, GO FIND NEXT JOB TO OUTPUT + SKIPGE T,JBTSTS(J) ;JOB RUN BIT STILL ON(JOB STILL WANT TO RUN)?> + SKIPGE JBTSWP(J) ;YES, IS PROTECT TIME STILL LEFT? + ; PROTECT TIME IS DECREMENTED ONLY WHEN + ; A JOB IS RUNABLE, SO LOOK AT IT + ; ONLY IF RUN BIT STILL ON + TLNE T,NSWP+SWP ;NO, IS THIS JOB NOT TO BE SWAPPED OR ALREADY SWAPPED? + ; (DISPLAY, REAL TIME)? + JRST (TAC1) ;YES,CONTINUE SCAN TO FIND ANOTHER + HLRZ T,JBTADR(J) ;PICK UP SIZE OF JOB + JUMPE T,(TAC1) ` ;CONTINUE SCAN IF NOT IN CORE (HIGH SEG ALREADY SWAPPED + ; OUT FOR THIS USER IF NO LOW SEG) + ASH T,-12 ;CONVERT TO 1K BLOCKS + ADDI T,1 +IFN FT2REL,< + EXTERN FORSIZ + PUSHJ PDP,FORSIZ ;INCREASE SIZE(T) BY HIGH SEG IF THIS JOB + ; IS ONLY ONE IN CORE USING HIGH SEG(J= JOB # STILL) +> + CAMG T,MAXSIZ ;LARGEST SO FAR? + JRST FORCE2 ;NO + MOVEM T,MAXSIZ ;YES, SAVE SIZE + MOVEM J,MAXJBN ;AND JOB NUMBER +FORCE2: ADDM T,SUMCOR ;ADD TO TOTAL + CAMLE AC1,SUMCOR ;FOUND ENOUGH CORE FOR JOB TO BE FIT IN? + JRST (TAC1) ;NO. LOOK FOR MORE + MOVE J,MAXJBN ;YES, SWAP OUT LARGEST + FORCE0: PUSHJ PDP,TRYSWP ;CAN THIS JOB BE STOPPED IN ORDER TO DO SWAP? + JRST (TAC1) ;NO, NSWP OR NSHF SET(DISPLAY,REAL TIME) OR + ; SAVE OR GET IN PROGRESS WITH DEVICE STILL ACTIVE + ; LOOK FOR AN OTHER JOB TO SWAP + +IFN FT2REL,< + EXTERN FORHGH + PUSHJ PDP,FORHGH ;IS THERE A HIGH SEG TO BE WRITTEN BEFORE + ; TRYING TO SWAP OUT LOW SEGMENT? + ; WRITE HIGH SEG IF ALL OF THE FOLLOWING ARE TRUE: + ; 1. JOB HAS A HIGH SEG AND + ; 2. IT HAS NOT BEEN SWAPPED FOR THIS USER + ; (SWP=0 FOR JOB) + ; 3. IT IS IN CORE(NOT XPANDH) + ; 4. IF IN-CORE COUNT IS EXECTLY 1 MEANING + ; THIS ONLY USER USING IN CORE + ; 5. HIGH SEG NOT ON DISK YET + ; 6. THIS HIGH SEG IS NOT THE SAME ONE AS JOB + ; BEING FITTED IN IS GOING TO WANT + + ; RETURN HIGH SEG NO. IN J IF YES, OTHERWISE + ; RETURN LOW SEG NO. + ; IF JOB JUST HAS LOW SEG. SHF BIT IS SET IN JBTSTS + ; FOR JOB SO IO WILL STOP NEXT BUFFERE +> + MOVSI T,SWP!IFE FT2REL, ;SET SWAPPED OUT BIT FOR LOW OR HIGH SEG + IORM T,JBTSTS(J) ;SCHEDULER WILL NO LONGER RUN THIS JOB + ; SET SHF BIT IF ONE SEG SOFTWARE, SO IO WILL + ; STOP AFTER NEXT BUFFERFUL. + +FORCEL: MOVEM J,FORCE ;ASSUME NOT SWAPPABLE--IS IT? + +FORCE1: +IFN JDAT-PROG,< + MOVE JDAT,JBTDAT(J) +> + SKIPN PROG,JBTADR(J) ;LOC. IN PHYSICAL CORE, IS CORE + ; ASSIGNED IN MEMORY? + JRST SWAPO ;NO, CANNOT HAVE ACTIVE DEVICES + CAME J,JOB ;IF THIS IS CURRENT JOB, WAIT UNTIL + ; PROTECTED AREA IS MOVED BACK TO JOB DATA AREA + PUSHJ PDP,ANYDEV ;ANY ACTIVE DEVICES?(2ND HALF OF ANYACT BOUT.) + POPJ PDP, ;YES--RETURN AND WAIT FOR I/O TO STOP. + ;SWAP OUT LOW OR HIGH SEGEMENT + +INTERNAL FTTRACK + +SWAPD: +IFN FTTRACK, + SETZM FORCE ;CLEAR FORCE FLAG + HLRZ T,JBTADTR(J) ;COMPUTE CORE IMAGE + JUMPE T,SWP1 ;DONT OUTPUT IF 0 CORE(IMGOUT ALREADY SET TO 0 + ; WHEN CORE WAS RETURNED + + HRRZ T1,JBTADR(J) + MOVNM T,T2 ;*SAVE COUNT FOR CALL TO SQOUT + ASH T,-^D10 ;CONVERT TO 1K BLOCKS + ADDI T,1 + DPB T,IMGOUT ;RECORD AS OUT IMAGE + HRLI T1,-1(T2) ;*BUILD AND SAVE IOWD FOR SQOUT + PUSH PDP,T1 ;* + LDB DAT,IMGIN ;HAS SIZE OF CORE NEEDED WHEN NEXT SWAPPED IN + SKIPN DAT ;ALREADY BEEN SET(XPAND) + DPB T,IMGIN ;NO, SO SET TO # 1K BLOCKS OF CORE NEEDED + MOVE DAT,T ;*CONVERT CORE IMAGE TO 128 WD BLOCKS + PUSHJ PDP,GXSAT ;*GET DEVICE STORAGE + JRST FULL ;*NONE AVAILABLE + HRLM TAC,JBTSWP(J) ;*SAVE DEVICE ADDRESS +OUTP2: MOVNM J,FINISH ;DISK SWAP SPACE ASSIGNED, NOW SET FINISH FLAG + ; SO THAT SWAPPER WILL KNOW WHICH SEG FINISHED + ; WHEN IO COMPLETED(SQREQ BECOMES ZERO) + POP PDP,TAC1 ;*GET IOWD + JRST SQOUT ;*START OUTPUT AND RETURN + +NOFIT: SETZM FIT ;FORGET ABOUT FITTING IN A JOB ON DISK + SETOM INFLG ;*** EXPERIMENTAL *** MARK DESIRE TO INPUT + POPJ PDP, ;ALL JOBS IN CORE RE HIGHER PRIORITY. + ;COME HERE WHEN THE AMOUNT OF SPACE NEEDED ON THE DISK +;IS NOT AVAILABLE IN ONE CONTIGUOUS BLOCK + + EXTERN GETFOR + +FULL: HRLM DAT,AC3 ;SAVE DAT (LARGEST AVAILABLE HOLE) + PUSHJ PDP,FULCOR ;GET 4 FREE CORE LOCS + HLRZ DAT,AC3 ;RESTORE DAT + MOVE AC3,TAC1 ;LOC OF 1ST FREE CELL + HRLI AC3,-4 ;4 LOCS + TRO TAC1,FRGSEG ;LIGHT FRAGMENTED BIT + HRLM TAC1,JBTSWP(ITEM) ;SAVE LOC OF TABLE IN JBTSWP +FULL1: PUSH PDP,DAT ;SAVE AMOUNT OF SPACE BEING REQUESTED +FULL1A: PUSHJ PDP,GXSAT ;GET SOME SWAPPING SPACE + JRST FULL2 ;CANT HAVE THAT MUCH + HRRM TAC,(AC3) ;SAVE LOC OF THE DISK SPACE + POP PDP,DAT ;RESTORE AMT GOTTEN + HRLM DAT,(AC3) ;SAVE AMOUNT IN TABLE + SUB T,DAT ;AMOUNT STILL NEEDED + + JUMPE T,FULSET ;THROUGH IF NEED 0 K NOW + PUSHJ PDP,BMPAC3 ;STEP TO NEXT TABLE LOCATION + MOVE DAT,T ;TRY TO GET ALL WE NEED NOW IN 1 CHUNK +FULL1B: MOVE DAT,T ;RESET AMOUNT OF SPACE NEEDED + +;COME HERE WHEN CANT GET THE CHUNK REQUESTED +FULL2: MOVEM DAT,(PDP) ;DAT HAS LARGEST CHUNK AVAILABLE + JUMPG DAT,FULL1A ;GO GET THAT AMOUNT +IFN FT2REL,< + EXTERN FRESWP + PUSHJ PDP,FRESWP ;TRY TO DELETE AN UNUSED HIGH SEG FROM DISK + JRST FULL1B ;FOUND ONE, TRY AGAIN, J PRESERVED + ; NONE FOUND, PRINT MONITOR ERROR +> + EXTERN CERROR + + POP PDP,TAC ;WHAT? NONE LEFT? + POP PDP,TAC ;SET PDP TO RIGHT VALUE + JSP DAT,CERROR ;ERROR IN MONITOR AT ..... + +;HERE WHEN THE TOTAL AMOUNT OF SPACE NEEDED HAS BEEN OBTAINED +FULSET: PUSHJ PDP,BMPAC3 ;STEP TO NEXT (LAST) TABLE LOCATION + HLRZ TAC,JBTSWP(ITEM) ;LOC OF TABLE OF FRAGMENTS + JRST OUTP2 ;GO START OUTPUT + +;HERE TO GET 4 LOCS OF FREE CORE +FULCOR: PUSH PDP,ITEM ;GETFOR USES ITEM + PUSHJ PDP,GETFOR ;GET 4 CELLS + JRST IPOPJ ;RETORE ITEM AND RETURN + +;STEP AC3 TO NEXT LOC OF TABLE BEING BUILT +BMPAC3: AOBJN AC3,CPOPJ ;OK IF MORE LOCS OF TABLE + PUSHJ PDP,FULCOR ;GET 4 MORE LOCS + HRLI AC3,-4 + CAIN TAC1,(AC3) ;ARE THEY CONTIGUOUS? + POPJ PDP, ;YES. RETURN + MOVE TAC,-1(AC3) ;NO. CONVERT LAST GOOD LOC + HRROM TAC1,-1(AC3) ;TO A POINTER TO NEXT PART OF TABLE + MOVEM TAC,(TAC1) ;STORE GOOD DATA IN 1ST WD OF NEW PART + + HRR AC3,TAC1 ;NEW TABLE LOC + AOBJN AC3,CPOPJ ;COUNT WORD AND RETURN + ;SWAP IN A JOB OR HIGH SEGMENT + +SWAPI: + +IFN FTTRACK, + + MOVEM J,FINISH ;SET FINISH FLAG TO INPUT + SETZM FIT ;CLEAR FIT FLAG + LDB TAC,IMGIN ;SIZE OF CORE TO BE ASSIGNED WHEN SWAPPED IN (INK) + LSH TAC,^D10 ;CONVERT TO HIGHEST ADR + SUBI TAC,1 ;-1 FOR CALL TO CORGET + SKIPE PROG,JBTADR(J) ;IS (LOW)SEG ALREADY IN CORE? + JRST FININ0 ;YES, POSSIBLE IF THIS IS LOW SET AND ONLY + ; HIGH SEG WAS SWAPPED OUT. + PUSHJ PDP,CORGET ;NO, GET CORE FOR LOW OR HIGH SEG + JSP DAT,OERROR ;NOT AVAILABLE-SHOULD NEVER HAPPEN(TELL OPER) + +IFN FT2REL, + LDB T,IMGOUT ;GET OUTPUT IMAGE + JUMPE T,FININ0 ;DONT INPUT IF OUT IMAGE IS 0 + LDB TAC1,IMGIN ;IS SIZE OF CORE SMALLER THAN DISK SPACE? + CAMGE TAC1,T ;WELL? + MOVE T,TAC1 ;YES, ONLY INPUT SMALLER AMOUNT(R,RUN,GET,KJOB) + LSH T,^D18+^D10 ;*BUILD IOWD FOR SQIN + MOVN TAC1,T ;* + HRR TAC1,JBTADR(J) ;* + HLRZ TAC,JBTSWP(J) ;*GET DEVICE ADDRESS + JRST SQIN ;*START INPUT + ;ROUTINE TO CHANGE DISK SWAPPING SPACE ALLOCATION(OR SET TO 0) +;DIFFERS FROM ZERSWP IN THAT VIRTUAL TALLY FOR SYSTEM IS ALSO CHANGED +;CALLED FROM CORE0 +;CALL: MOVE ITE,JOB OR HIGH SEG NO. +; MOVE TAC,#1K BLOCKS TO BE NEW ASSIGNMENT +; PUSHJ PDP,CHGSWP +; ALWAYS RETURN +;CALLED ONLY FORM VIRTUAL+PHYSICAL CORE ROUTINE CORE0 + +INTERN CHGSWP +EXTERN JBTSTS,IMGIN,IMGOUT,JBTSWP,VIRTAL,IPOPJ + +CHGSWP: LDB TAC1,IMGIN ;SIZE WHEN SEG NEXT SWAPPED IN + JUMPE TAC,CHG1 ;IS ZERO BEING ASKED FOR? + LSH TAC,-12 ;NO, COVNERT TO 1K BLOCKS + ADDI TAC,1 ;BUT DO NOT ATTEMPT TO RETURN DISK SPACE + ; SINCE IT MIGHT BE FRAGMENTED(SWAPPER WILL + ; RETURN ALL OF DISK SPACE ON NEXT SWAPIN) + ; HAPPENS ONLY ON R,RUN,GET,KJOB + DPB TAC,IMGIN ;STORE NEW SIZE WHEN NEXT SWAPPED IN + PUSH PDP,ITEM ;SAVE AN AC + LDB ITEM,IMGOUT ;GET OLD DISK SIZE OF THIS USER(USES ITEM) + CAMGE TAC1,ITEM ;IS OLD IN-CORE SIZE BIGGER? + MOVE TAC1,ITEM ;NO, USE DISK SIZE AS USER'S OLD VIRTUAL CORE + CAMGE TAC,ITEM ;IS NEW IN-CORE SIZE BIGGER? + MOVE TAC,ITEM ;NO, USE DISK SIZE AS USER NEW + ; VIRTUAL CORE + SUB TAC1,TAC ;DECREASE OF USER VIRT, CORE=OLD-NEW + ADDM TAC1,VIRTAL ;USER'S DECREASE=SYSTEM'S INCREASE OF VIRTUAL + ;CORE + JRST IPOPJ ;RESTORE ITEM AND RETURN + ;ROUTINE TO RETURN ALL OF DISK SPACE FOR A LOW OR HIGH SEG +;THIS IS A PHYSICAL DEALLOCATION ONLY AND HAS NO EFFECT ON A SEGMENTS +;VIRTUAL CORE ASSIGNMENT +;CALL: MOVE ITEM,JOB NO. OR HIGH SEG NO. +; PUSHJ PDP,ZERSWP +;CALLED FROM SEGCON IN MANY PLACES(5) +;AND FININ0 HERE IN SWAP + + INTERN ZERSWP + +ZERSWPL TDZA TAC,TAC ;REQUEST O SPACE ON DISK AND ALWAYS SKIP +CHG1: ADDM TAC1,VIRTAL ;INCREASE SIZE OF VIRTUAL CORE AVAILABLE IN SYSTEM + ; AND THEN RETURN ALL OF DISK SPACE(CHGSWP) + MOVSI TAC1,SWP!SHF ;CLEAR SWAPPED OUT BIT IN JOB OR SEG + ANDCAM TAC1,JBTSTS(ITEM);STATUS WORD(SHF SET IF IO WAS TO BE STOPPED + ; FOR SWAP OR CORE SHUFFLE + + PUSH PDP,DAT ;SAVE TTY OUTPUT BYTE POINTER(COMMAND DECODER) + LDB DAT,IMGOUT ;*SIZE ON DISK(1K BLOCKS) + + JUMPE DAT,CHG3 ;DID SEG HAVE ANY DISK SPACE? + HLRZ TAC,JBTSWP(ITEM) ;*YES, LOGICAL DISK BLOCK+FRGSEG BIT + PUSHJ PDP,FXSAT ;*FREE THE DISK BLOCKS NO LONGER NEEDED +CHG3: POP PDP,DAT ;RESTORE TTY OUTPUT BYTE POINTER + MOVEI TAC,0 ;0 IS NEW DISK ASSIGNMENT + DPB TAC,IMGOUT ;SET DISK ASSIGNEMENT TO 0 + DPB TAC,IMGIN ;SET NEW CORE IMAGE BLOCK SIZE WHEN NEXT SWAPPED IN + ; HERE FROM CHGSWP IF NOT ASKING FOR 0 + POPJ PDP, ;RETURN + EXTERN PROT0,PROT ;PROT AND PROT0 OCCUR IN COMMON + +IFE FTRC10, < +XP ICPRT1,3+1*3 ;PROTECT TIME IN CLOCK TICS= +XP ICPROT,^D10 ;((JOBSIZE/1K)*+PROT0)*PROT + ; PROT0=3,PROT=4 PRODUCT PROTECT TIMES ROUGHLY + ; EQUAL TO 270 DISK SWAP(1-WAY) TIMES. +> +IFN FTRC10, < +;SIMILAR IN-CORE PROTECT TIME PARAMETERS FOR FAASTER RD-10 DISK...... +XP ICPRT1,3+1*3 ;ZERO CORE PLUS K MULTIPLIER +XP ICPROT,3 ;MULTIPLY BY K-1 OF LOW SEG +> + ;XPAND SETS CONDITIONS TO GET MORE CORE FRO A JOB BY SWAPPING IN OUT +,THEM BACK IN TO DESIRED AMOUNT. +,JOBS POSITION IN QS NOT AFFECTED. +;CALLED ONLY FROM CORE COMMAND +;ASSUMES CALL FOR CURRENT JOB IF EXPANDING HIGH SEG,IE ASSUME AT UUO LEVEL +;THIS IS TRUE SINCE THERE IS NO CORE COMMAND WHICH CAN EXPAND HIGH SEG +,CALL: MOVE ITEM,[JOB NO.] +; MOVE TAC,[HIGHEST LEGAL ADDRESS DESIRED] +; PUSHJ PDP,XPAND +; RETURN, TAC DESTROYED + +XPAND: LSH TAC,-12 ;CONVERT HIGHEST DESIRED ADDRESS + ADDI TAC,1 ;TO 1K BLOCKS + DPB TAC,IMGIN ;STORE, SO SWAPPER WILL KNOW HOW MUCH CORE + ; TO REQUEST WHEN NEXT SWAPPED IN + +;ROUTINE TO FLAG JOB TO BE STOPPED AND SWAPPED OUT +;BECAUSE IT HAS JUST BEEN CONNECTED TO A HIGH SHARABLE SEG WHICH IS ON DISK +;OR ON ITW WAY IN OR OUT. THE SIZE OF THE HIGH SEG IS UNCHANGED + +;THE JOB MUST BE STOPPED UNTIL HIGH SEG SWAPPED IN JUS AS IF JOB HAS +;EXPANDED HIGH SEG(MUST BE CALLED FROM UUO LEVEL FOR CURRENT JOB IF HIGH SEG) +;CALL: MOVE ITEM,HIGH SEG NUMBER +; PUSHJ PDP,XPANDH + + INTERN XPANDH + EXTERN IPOPJ + +XPANDH: +IFN FT2REL,< + PUSH PDP,ITEM ;SAVE JOB NUMBER + CAILE ITEM,JOBMAX ;IS THIS A LOW OR HIGH SEG? + MOVE ITEM,JOB ;HIGH,SO GET JOB NO.(MUST BE CURRENT JOB) +> + MOVSI TAC1,JXPN ;SET THIS JOB EXPANDING BIT SO IT WILL NOT BE RUN + TDNN TAC1,JBTSTS(ITEM) ;IS IT ALREADY SET FOR THIS JOB?(UNLIKELY) + AOS XJOB ;NO, INCREMENT COUNT ONLY ONCE FOR EACH JOB EXPANDING + IORM TAC1,JBTSTS(ITEM) ;AND SET JOB EXPANDING BIT +IFE FT2REL,< + POPJ PDP, ;RETURN +> +IFN FT2REL,< + JRST IPOPJ ;RESTORE JOB OR HIGH SEG NUMBER (ITEM) AND RETURN +> + SUBTTL SWPSER R.KRASIN/AF TS4.34 03 FEB 69 V406 + +INTERNAL SQIN,SQOUT,SQGO,SQGO1 +INTERNAL FTSWAP +EXTERNAL DFBUSY,DFRED,DFWRT,CPOPJ,JOBDAC,MJOBCK,CHECK,JBTCHK + +;PUT A REQUEST IN THE SWAPPER QUEUE. ENTER AT SQIN FOR +; INPUT, SWOUT FOR OUTPUT +;CALL: MOVE TAC1,XWD -NO. OF WORDS,FIRST CORE LOC.(IE IOWD+1) +; HRRZ TAC,DISK BLOCK NO. +; PUSHJ PDP,SQIN/SQOUT +; RETURN HERE ALWAYS +; CONTENTS OF TAC,TAC1 LOST + +SQIN: TLO TAC,400000 ;SET READ INDICATOR +SQOUT: MOVEM TAC,SERA ;STORE THE BLOCK NUMBER + MOVEM TAC1,SQREQ ;STORE THE IOWD + MOVEM TAC1,ESQREQ ;SAVE IN CASE OF DISK ERROR ON FRAGMENTED JOB + MOVNI TAC,1 ;IS THE DEVICE BUSY? + EXCH TAC,DFBUSY + JUMPN TAC,CPOPJ ;YES IF JUMP + +ERATRY=3 ;NO. OF TIMES TO READ AND WRITE ON ERRORS + +;START UP DEVICE WITH SWAPPING REQUEST. THIS ROUTINE +;IS CALLED FROM DISK INTERRUPT SERVICE, AS WELL AS FROM ABOVE. +;IF A SWAPPER REQUEST IS WAITING(SQREQ WILL BE NON-ZERO) + +SQGO: MOVEI TAC1,ERATRY + MOVEM TAC1,SERACT + MOVSI TAC,400000 + TDNE TAC,SERA ;WRITE? + JRST SQGO1 ;NO + HRRZ TAC,SQREQ + ADDI TAC,JOBDAC + HRLI TAC,MJOBCK + PUSHJ PDP,CHECK + MOVM TAC,FINISH + MOVEM TAC1,JBTCHK(TAC) + SQGO1: SETZM SQLEN ;ZERO AMOUNT TRANSFERRED SO FAR + MOVE TAC1,SQREQ ;*PUT IOWD INTO TAC1 + MOVSI TAC,200000 ;*SET "SWAPPER I/O GOING" FLAG ON + ORB TAC,SETA ;* + TRZN TAC,FRGSEG ;*FRAGMENTED? + JRST SQGO2 ;*NO, READ IN ENTIRE (OR PART) OF SEG + + EXTERN CLCOR1 + +FRAGIO: PUSH PDP,DAT + MOVN DAT,SQLEN ;AMOUNT PREVIOUSLY TRANSFERRED + SUB TAC1,DAT ;INCREASE CORE ADDRESS BY WORDCOUNT PREVIOUS +FRGIO1: HLRE DAT,(TAC) ;NO OF K IN THIS DISK CHUNCK + HRR TAC,(TAC) ;SWAPPING ADDRESS FOR THIS DISK CHUNK + JUMPGE DAT,FRGIO2 ;POINTER TO NEW CORE LIST IF NEG. + MOVEI DAT,77777 ;CLEAR OUT ADR(15 BITS) + ANDCAM DAT,SERA + ORM TAC,SERA ;INSERT NEW ADDRESS + JRST FRGIO1 + + +FRGIO2: LSH DAT,12 ;CONVERT FROM K TO WORDS + ADDM DAT,SQLEN ;ADD TO PREVIOUSLY TRANSFERRED AMOUNT + MOVNS DAT ;-N WORDS + HRLM DAT,TAC1 ;IOWD IN TAC1 + HRLO DAT,DAT ;-NO. OF WRDS FOR THIS DISK TRANSFER TO TH + CAMG DAT,SQREQ ;COMPARE WITH - NO. WORDS FOR REST OF SEG + HLL TAC1,SQREQ ;SWAPPER ONLY WANTS TO READ A PORTION OF SEG + ; NOT ALL OF IT(R,RUN,GET,KJOB COMMAND) + MOVNS DAT ;+NO. OF WORDS FOR THIS NEXT TRANSFER + ADDI DAT,777777 + ADDM DAT,SQREQ ;UPDATE LH OF IOWD FOR ENTIRE SEG, SO IT HAS + ; -NO. OF WORDS LEFT AFTER THIS TRANSFER IS DONE + POP PDP,DAT +SQGO2: TLZ TAC,377777 ;*CLEAR POSSIBLE TRASH IN LH. + ROT TAC,BLKSPK ;*RE-POSITION DISK LOGICAL BLOCK NUMBER. + TRZE TAC,4 ;*TEST AND CLEAR READ/WRITE BIT. + SOJA TAC1,DFRED ;*YES + SOJA TAC1,DFWRT ;*NO, WRITE. + ;SERVICE A SWAPPING INTERRUPT +EXTERNAL DINT4B,CKSMCT +INTERNAL SWPINT + +SWPINT: TRNE IOS,IODTER!IODERR!IOIMPM + JRST SWPERR ;ERRORS + TRZE TAC,FRGSEG ;*FRAGMENTED? + SKIPL TAC1,SQREQ ;*YES, MORE IOWD TO GO? + JRST DINT8B ;NO, ALL DONE SWAP IN OR OUT + AOS SERA ;YES, FRAGMENTED AND MORE TO GO + SKIPE 1(TAC) ;IS THIS THE END OF SWAP COMMAND LIST? + AOJA TAC,FRAGIO ;NO, BO DO NEXT PIECE OF FRAGMENTED SEG + +DINT8B: TLNN TAC,400000 ;*INPUT? + JRST DINT8A ;*NO + HRRZ TAC,SQREQ + ADDI TAC,JOBDAC + HRLI TAC,MJOBCK + PUSHJ PDP,CHECK + MOVM TAC,FINISH + CAME TAC1,JBTCHK(TAC) + JRST SWPER1 +DINT8A: HRRZM IOS,SERA + SETZM SQREQ + JRST DINT4B + +SWPER1; MOVSI TAC,100 + ADDM TAC,CKSMCT + TRO IOS,IODTER +SWPERR: MOVM TAC, FINISH ;*RESET SERA IN CASE OF FRAGMENTED JOB + HLRZ TAC, JBTSWP(TAC) ;*SWAP LOC (DISK ADR OR TABLE ADR) + HRRM TAC, SERA ;*RESTORE SERA + MOVE TAC,ESQREQ ;RESTORE ESQREQ IN CASE OF FRAGMENTED JOB + MOVEM TAC,SQREQ + SOSLE SERACT ;*TRIED ENOUGH? + JRST SQGO1 ;*NO, TRY AGAIN + JRST DINT8A ;*YES, TOUGH. + IFE FTRC10, < +;SWPSER LOGIC FOR THE OLD PDP-6 (DATA PRODUCTS) DISK FILE --- + +;FIND A SERIES OF BLOCKS ON THE DISK TO SWAP ONTO. CALLED +;AT CLOCK LEVEL. +;CALL: MOVEI DAT,NO. OF 1K BLOCKS DESIRED +; PUSHJ PDP,GXSAT +; ERROR EXIT (DISK IS FULL) +; NORMAL EXIT ;C(TAC) = BLOCK NO. + +;CONTENTS OF ACS TAC,TAC1,DAT WILL BE LOST. + +INTERNAL GXSAT +EXTERNAL GETBIT,IPOPJ1 + +GXSAT: MOVE AC1,XSAT1 ;SAVE AC1, SET IT TO TABLE LOC. + MOVE AC2,XSAT2 ; + LSH DAT,CONVMD ;CONVERT TO 128 WORD DISK BLOCKS + PUSH PDP,ITEM ;SAVE C(ITEM) + + MOVE ITEM,DAT ;GETBIT EXPECTS PARAMETER IN ITEM + PUSHJ PDP,GETBIT ;FIND A HOLE BIG ENOUGH + JRST IPOPJ ;NONE, RESTORE ITEM AND ERROR RETURN + MOVEI TAC,-1(TAC1) + CAIL TAC,BLOCKS ;IS IT ON DISK 17? + ADDI TAC,DIFF ;YES + LSH TAC,-CONVMD ;CARRY DISK ADDRESS SHIFTED TO FIT IN JBTSWP. + JRST IPOPJ1 ;SKIP RETURN AND RESTORE JOB NUMBER(ITEM) + +;FREE UP A SERIES OF BLOCKS ON THE SWAPPING DEVICE. CALLED +;AT CLOCK LEVEL +;CALL: MOVEI DAT,NO. OF 1K BLOCKS TO FREE +; MOVE TAC,BLOCK NO. OF FIRST DISK BLCOK TO FREE +; PUSHJ PDP,FXSTAT +; ALWAYS RETURN HERE + +;CONTENTS OF ACS TAC,TAC1 WILL BE LOST. + +INTERNAL FXSAT +EXTERNAL CLRBIT,IPOPJ + +FXSAT: LSH TAC,CONVMD ;RESTORE SHIFTED DISK ADDRESS. + CAIL TAC,HISWAP ;ON DISK 17? + SUBI TAC,DIFF ;YES + LSH DAT,CONVMD ;CONVERT TO 128 WORD DISK BLOCKS + MOVE AC1,XSAT1 ;SET UP AC1 WITH POINTER TO SAT BLOCK + MOVE AC2,XSAT2 ;AC2 TOO + PUSH PDP,ITEM ;SAVE C(ITEM) + MOVE ITEM,DAT ;CLRBIT EXPECTS PARAMETER IN DAT + PUSHJ PDP,CLRBIT + JRST IPOPJ ;RETURN, AND RESTORE ITEM + +;INITIALIZE SWAPPER DISK STORAGE TABLE + +INTERNAL SWPINI + +SWPINI: MOVE TAC,XSAT2 + MOVEM TAC,XSAT31 + MOVSI TAC,1B18 + MOVEM TAC,XSAT3 + SETZM XSAT4 + MOVE TAC,XSAT4P + BLT TAC,XSAT61 + MOVE TAC,XSAT7 + MOVEM TAC,XSAT5 + MOVE TAC,XSAT8 + MOVEM TAC,XSAT6 + POPJ PDPD, + +IFN FTCHECK+FTMONP,< +EXTERNAL SQREQ,SERA,SERACT,XSAT1,XSAT2,XSAT3,XSAT4,XSAT5,XSAT6,XSAT7 +EXTERNAL XSAT8,SWPSIZ,HISWAP,DIFF,CONVMD,BLOCKS,XSAT31,XSAT4P,XSAT61 +> +IFE FTCHECK+FTMONP,< + +;DATA AND STORAGE AREA FOR SWAPPING. ON THE 270 DISK, DISKS +; 0 & 17 ARE USED FOR SWAPPING, ECH DISK CONTAINING +; 5400 (OCTAL) RECORDS + +INTERNAL SQREQ,SERA,SERACT +SQREQ: Z ;C(LH)=NEG. OF SIZE OF READ/WRITE + ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE +ESQREQ: Z ;COPY OF SQREQ, IN CASE OF + ; ERROR IN FRAGMENTED JOB +SERA: Z ;SIGN IS 1 IF A READ + ; C(RH)=BLOCK NUMBER BEFORE READING. + ; ERROR BITS AFTER READING. +SELACT: 0 ;COUNT FOR ERRORS +SQLEN: 0 ;AMOUNT TRANSFERRED SO FAR - FRAG SEG + +XSAT1: EXP XSAT3-1 ;POINTER USED BY GETBIT,CLRBIT +XSAT2: XWD -SWPSIZ,XSAT4 ;POINTER TO BIT TABLE +XSAT3: XWD 400000, ;2-WORD TABLE ALTERED BY GETBIT,CLRBIT + XWD -SWPSIZ,XSAT4 + + ; BIT TABLE FOR SWAPPING ALLOCATION +XP BLOCKS,5400 ;NUMBER OF RECORDS/DISK PLATE + W1=BLOCKS/^D36 ;NUMBER OF ZERO WORDS AT TOP OF TABLE + E1=BLOCKS-W1*^D36 ;LEADING ZERO IN W1+1ST WORD + EX=BLOCKS+E1-^D35 + W2=EX/^D36 ;ZERO WORDS AT BOTTOM OF TABLE + E2=EX-W2*^D36 ;LEADING ZEROES IN W1+W2+2ND WORD + +XP XSAT31,XSAT3+1 +XSAT4: BLOCK W1 +XSAT5: BLOCK W2+1 +XSAT6: BLOCK 1 + REPEAT 1,< + IFE E1, + IFN E1,> + IFE E2, + IFN E2, + >> +XP XSAT61,XSAT6-1 +XSAT7: EXP X +XSAT8: EXP Z + +SWPSIZ=XSAT6-XSAT4+1 ;SIZE OF TABLE +HISWAP=17*BLOCKS ;LOGICAL BLOCK NUMBER OF FIRST + ; BLOCK ON DISK +DIFF=HISWAP-BLOCKS-1 + +XP CONVMD,3 ;CONVERSION FROM 1K CORE BLOCKS TO 128 WORD + ;DISC BLOCKS(SHIFT COUNT) + +XP BLKSPK,CONVMD ;NO. OF BLOCKS PER K, SAME AS CONVMD +XSAT4P: XWD XSAT4,XSAT4+1 +> +> ;END OF SWPSER LOGIC FOR THE OLD PDP-6 DISK. + IFN FTRC10, < +;SWPSER LOGIC FOR THE NEW PDP-10 (MODEL RC-10) DISK --- + +INTERNAL GXSAT,FXSAT,SWPINI +EXTERNAL GETBIT,CLRBIT +EXTERNAL LBHIGH,IPOPJ,IPOPJ1 + + +;SUBROUTINE "GXSAT" IS CALLED TO FIND A SERIES OF CONSECUTIVE FREE BLOCKS ON +; THE DISK TO SWAP SOME JOB OUT ONTO. IT IS CALLED AT CLOCK LEVEL. + +;CALLING SEQUENCE --- +; PUSHJ PDP,GXSAT +; ERROR EXIT --- THE DISK IS FULL, NO SWAPPING SPACE AVAILABLE. +; NORMAL EXIT +;ENTRY CONDITIONS --- +; C(DAT) = NUMBER OF 1K BLOCKS OF DISK STORAGE NEEDED. +;EXIT CONDITIONS --- +; C(TAC) = LOGICAL BLOCK NUMBER (DIVIDED BY 8) OF THE FIRST DISK BLOCK IN +; THE SERIES OF CONSECUTIVE BLOCKS WHICH SATISFY THIS REQUEST. +;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE. + +GXSAT: PUSH PDP,ITEM ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM". + MOVE ITEM,DAT + MOVEI AC1,SWPENT ;SET UP ENTRY CONDITIONS FOR THE "GETBIT" SUBROUTINE. + MOVE AC2,SWPENT + PUSHJ PDP,GETBIT + JRST IPOPJ ;NO ROOM IN THE SWAPPING PART OF THE DISK. + ADDI TAC1,-1(ITEM) ;ROOM FOUND--COMPUTE LOGICAL BLOCK NUMBER OF THIS + CAMLE TAC1,MAXSWP ;FIRST BLOCK IN A SERIOES OF CONSECUTIVE FREE DISK + MOVEM TAC1,MAXSWP ;BLOCKS. THE "SWPTAB" TABLE SEARCHED HAS ONE BIT + LSH TAC1,BLKSPK ;FOR EACH 1K OF SWAPPING DISK SPACE. BUT IS STORED + SUB TAC1,LBHIGH ;BACKWARDS (1ST BIT OF SWPTAB = LAST 1K OF DISK). + MOVM TAC,TAC1 ;ALSO UPDATE "MAXSWP" IF PREVIOUS MAXIMUM EXCEEDED. + LSH TAC,-BLKSPK ;COMPRESS DISK ADDRESS TO 17 BITS FOR LH OF JBTSWP + AOJA TAC,IPOPJ1 ;ADD 1 TO TAC AND RESTORE ITEM AND SKIP RETURN + ;SUBROUTINE "FXSAT" IS CALLED TO RETURN A SERIES OF CONSECUTIVE DISK BLOCKS TO +; THE FREE STORAGE POOL. THUS MAKING THEM AVAILABLE FOR RE-USE IN HANDLING +; FUTURE SWAPPING REQUESTS. IT IS CALLED AT CLOCK LEVEL. + +;CALLING SEQUENCE --- +; PUSHJ PDP,FXSAT +; NORMAL EXIT +;ENTRY CONDITIONS --- +; C(TAC) = LOGICAL BLOCK NUMBER OF THE FIRST DISK BLOCK IN THE +; SERIES WHICH IS TO BE MADE AVAILABLE. +; C(DAT) = NUMBER OF CONSECUTIVE 1K BLOCKS OF DISK SPACE WHICH +; ARETO BE MADE AVAILABLE. +;EXIT CONDITIONS --- +; THE REQUESTED BITS IN THE SWAPPING SPACE AVAILABILITY TABLE +; (NAMELY, SWPTAB) HAVE BEEN CLEARED TO ZERO. +;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE. + +FXSAT: TRZN TAC,FRGSEG ;FRAGMENTED? + JRST FXSAT1 ;NO. DO IN REGULAR WAY + +FRAGRK: HRRZ AC3,TAC ;YES. LOC OF TABLE IN AC3 +FRGBK1: HRRZ TAC,(AC3) ;LOC OF NEXT DISK ADDRESS + HLRE DAT,(AC3) ;NUMBER OF K + JUMPLE DAT,FRGBK2 ;GIVE UP FREE CORE IF NOT REAL ADDRESS + PUSHJ PDP,FXSAT1 ;GIVE UP THE DISK SPACE FOR THIS PART + AOBJP AC3,FRGBK1 ;COUNT WORD OF TABLE, GET NEXT +FRGBK2: HRRZ TAC,AC3 ;LOC OF TABLE + PUSH PDP,ITEM + HLRZ ITEM,AC3 ;NUMBER OF WDS IN TABLE + SUB TAC,ITEM ;POINT TAC TO 1ST WORD OF BLOCK + LSH ITEM,-2 ;4 WDS PER BIT + AOS ITEM + PUSHJ PDP,CLCOR1 ;GIVE UP FREE CORE + POP PDP,ITEM + SKIPE TAC,(AC3) ;END OF TABLE? + JRST FRAGBK ;NO, GO CHASSE NEXT PART + POPJ PDP, ;YES, DONE + +FXSAT1: PUSH PDP,ITEM ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM". + MOVE ITEM,DAT + LSH TAC,BLKSPK ;REGENERATE THREE LOW ORDER 0 BITS IN DISK ADDRESS. + SUB TAC,LBHIGH ;PREPARE TO CLEAR BITS IN THE SWAPPING + MOVMS TAC ; AVAILABLITY TABLE BY TRANSFORMING THE LOGICAL + ADDI TAC,1 ; BLOCK NUMBER TO AN EQUIVALENT BIT NUMBER IN THIS + MOVNI AC1,BLKSPK ; TABLE (WHICH IS STORED IN REVERSE ORDER AND HAS + LSH TAC,(AC1) ; ONE BIT PER 1K OF SWAPPING SPACE ON THE DISK). + SUB TAC,DAT + MOVEI AC1,SWPENT + MOVE AC2,SWPENT ;SET UP ENTRY CONDITIONS FOR THE "CLRBIT" SUBROUTINE. +FXSATC: PUSHJ PDP,CLRBIT ;THE "CLRBIT" SUBROUTINE IN "DSKSER" ACTUALLY DOES + ; THE WORK OF CLEARING THE BITS. + JRST IPOPJ ;RESTORE ITEM AND RETURN +;ROUTINE TO RE-INITIALIZE THE SWAPPING AVAILABILITY TABLE. CALLED AT +; SYSTEM INITIALIZATION TIME. + + EXTERN VIRTAL,SWPHGH + +SWPINI: MOVE TAC,LBHIGH ;SET HIGHEST LOGICAL BLOCK + MOVEM TAC,SWPHGH ;FOR SWAPPING IN COMMON + MOVNI TAC,1 ;SET ENTIRE TABLE TO ONES, I.E., MARK EVERYTHING + MOVE TAC1,SWPENT ; AS BEING UNAVAILABLE FOR SWAPPING. + MOVEM TAC,(TAC1) + AOBJN TAC1,.-1 + MOVEI AC1,SWPENT ;THEN USE THE "CLRBIT" ROUTINE TO CLEAR OUT AS MANY + MOVE AC2,SWPENT ; BITS AT THE FRONT OF THE TABLE AS THERE ARE 1K DISK + MOVE ITEM,K4SWAP ; AREAS ALLOCATED FOR SWAPPING USE. THE PARAMETER + MOVEM ITEM,VIRTAL ;TOTAL AMOUNT OF VIRTUAL CORE ALLOWED + ; IS JUS EQUAL TO AMOUNT OF SWAPPING SPACE + ; EVEN IF USER CAN NOT HAVE ALL OF PHYSICAL USER CORE + MOVEI TAC,0 ; "K4SWAP" IS SET UP DURING DISK REFRESHING, AND + ; RECALLED FROM THE DISK AT EACH SYSTEM-INITIALIZE. + JRST CLRBIT ;IN LIEU OF "PUSHJ CLRBIT" FOLLOWED BY "POPJ". + IFN FTCHECK+FTMONP,< +EXTERNAL RCXSDT ;DUMMY GLOBAL SYMBOL TO PERMIT THE SYSTEM BUILDER TO + ; RETRIEVE THE CORRECT BINARY COPY OF "SCHDAT". +EXTERNAL SQREQ,SERA,SERACT +EXTERNAL LBHIGH,BLKSPK,MAX2SWP,SWPENT,SWPTAB,MAXSWP +> + +IFE FTCHECK+FTMONP,< +;DATA ASSOCIATED WITH THE SWPSER LOGIC FOR THE NEW PDP-10 DISK --- + + INTERN MXK2SWP,CONVMD,BLKSPK,SWAPTAB,MAXSWP + EXTERN K4SWAP +;THE ABOVE ARE REFERENCED OR INITIALIZED BY THE "ONCE" ROUTINE. + +;C(LOWSWP)=LOWEST LOGICAL BLOCK NUMBER TO BE USED FOR SWAPPING +;DETERMINED BY ONCE ONLY REFRESH DIALOG +;C(K4SWAP)=MAX. NO. OF K DISK WORDS ALLOCATED FRO SWAPPING, ALS +;DETERMINED BY ONCE ONLY REFRESH DIALOG +MAXSWP: 0 ;MAX. NO. OF K FROM TOP TO LOWEST JOB + ; USED SINCE SYSTEM BEGAN +;C(MAXSWP)=MAX. NO. OF K EVER ASSIGNED COUNTING FROM TOP DOWN TO +;LOWEST EXCURSION, INCLUDING HOLS. WHEN = C(K4SWAP), THEN FREAGMENTATION HAD +;HAPPENED SOMETIME DURING THE PAST +BLKSPK=3 ;SHIFT FACTOR TO CONVERT K OF CORE TO DISK BLOCKS, I.E., + ; EIGHT DISK BLOCKS PER K OF CORE. +CONVMD=BLKSPK ;ONLY FOR CONSISTENCY WITH OLDER PDP-6 ROUTINE. +MXK2SWP=^D1000 ;MASIMUM NUMBER OF 1K DISK BLOCKS WHICH MIGHT BE ALLOCATED + ; FOR SWAPPING (UPPER BOUND ON THE VALUE OF K4SWAP WHICH + ; MAY BE REQUESTED AT DISK REFRESH TIME). (ONE MILLION WORDS + ; FOR SWAPPING SEEMS LIKE A NON-RESTRICTIVE ARBITRARY LIMIT.) +SWPSIZ=MXK2SWP/.^D36+1 ;SIZE OF SWPTAB ALLOCATION TABLE. + +SWPENT: XWD -SWPSIZ,SWPTAB ;THREE WORD POINTER TABLE + XWD 400000,0 ; REQUIRED BY THE "GETBIT" AND + XWD -SWPSIZ,SWPTAB ; "CLRBIT" SUBROUTINES. + +SWPTAB: BLOCK SWPSIZ ;SWAPPING SPACE AVAILABILITY TABLE. + +;DATA CARRIED OVER FROM THE COMMON PART OF OLD AND NEW SWPSER ROUTINES --- +INTERNAL SQREQ,SERA,SERACT,ESQREQ +SQREQ: Z ;C(LH)=NEG. OF SIZE OF READ/WRITE + ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE +ESQREQ: Z ;COPY OF SQREQ, IN CASE OF SWAP ERROR IN FRAGMENTED JOB +SERA: Z ;SIGN IS 1 IF A READ + ; C(RH)=BLOCK NUMBER BEFORE READING. + ; ERROR BITS AFTER READING. +SELACT: 0 ;COUNT FOR ERRORS +SQLEN: 0 ;AMOUNT TRANSFERRED SO FAR FOR FRAGMENTED JOB +> +> ;END OF SWPSER LOGIC FOR THE NEW PDP-10 DISK. + SCHEND: END diff --git a/src/scnsrf.mac b/src/scnsrf.mac new file mode 100644 index 0000000..14d7517 --- /dev/null +++ b/src/scnsrf.mac @@ -0,0 +1,2076 @@ +TITLE SCNSRF - SCANNER AND CONSOLE TELETYPE SERVICE ROUTINE - V415 +SUBTTL R CLEMENTS.RCC TS 03 JUN 69 + XP VSCNSF,415 + +ENTRY SCNSRF +SCNSRF: + + +;SCANSER IS ORGANIZED INTO THE FOLLOWING SECTIONS + +; I. COMMENTARY ON OPERATION AND DATA STRUCTURES +; II. SYSTEM INITIALIZATION ROUTINE - SCNINI +; III. UUO LEVEL ROUTINES +; A. DDTIN +; B. DDOUT +; C. TTYUUO +; D. TTYIN +; E. TTYOUT +; IV. COMAND LEVEL ROUTINES +; A. TTYATT +; B. TTYCOM +; C. TTYDCM +; D. TTYDET +; E. TTYFND,TTYFNU +; F. TTYKIL +; G. TTYSET +; H. TTYSRC +; I. TTYSTC +; J. TTYTLK +; K. TTYUSR +; V. INTERRUPT SERVICE ROUTINES +; A. CTYINT +; B. SCNINT +; C. RFCINT - ALL LINES RECEIVER INTERRUPT +; 1. TTEDIT - EDITS AND ECHOS +; D. XMTINT - TRANSMIT INTERRUPT +; 1. GETCHR +; 2. TYP + ;DATA STRUCTURES AND PARAMETERS + +; DEFINED BY BUILD PROCESS FOR THE CONFIGURATION +; SCNLIN=OCTAL NO. OF SCANNER LINES (0 THRU SCNLIN-1) + +; TRANSLATOR TABLE PARAMETERS +; TTYLEN=SCNLIN+1 LENGTH OF TTY TRANSLATOR TABLE (INCLUDING CTY) +; TTYTAB: BLOCK TTYLEN TTY TRANSLATOR TABLE +; SIGN BIT=1 IF COMMAND JUST TYPED +; BIT 1 =1 IF DELAYED COMMAND +; BITS 3-11 = JOB NO TTY IS ATTACHED TO (TPCJOBN) +; BITS 12-17=TALK RING LINE # (PTALK) +; BITS 18-35=ADDR. OF DEVICE DATA BLOCK +; FOR THIS LINE. +; DEVOPR: 0 SIXBIT PHYSICAL NAME OF OPERATORS +; CONSOLE + +; DEFINED IN IOINI2 +; LINE NUMBER PARAMETERS +; MLTTYL=-NO. OF TTY DEVICE DATA BLOCKS +; TCONLN=SCNLIN CTY LINE NUMBER +; MTTYLN=-TTYLEN -LENGTH OF TRANSLATOR TABLE +; TTYLST=TTY0D0 FIRST TTY DEVICE DATA BLOCK + +; TTY DEVICE DATA BLOCK FORMAT +; (STANDARD IS AS DEFINED ON SYSTEM PARAMETER TAPE) +; DEVNAM: PHYSICAL DEVICE NAME SET UP DYNAMICALLY +; VIA SCNIN0. +; DEVCHR: LEFT HALF IS STANDARD +; BITS 18-23=LINE NUMBER(BYTE POINTER=PUNIT) +; BITS 24-35=MONITOR BUFFER SIZE + 1 + ; DEVIOS: LEFT HALF +; 1,2,4,20,40 ARE STANDARD + USRB=100 ;SET TTY TO USER MODE + ;WHEN OUTPUT FINISHES + IOSUPR=200 ;SUPPRESS ALL OUTPUT + ;TILL NEXT INPUT OR INIT (^O). + TRMON=400 ;TTY IS IN MONITOR + ;COMMAND MODE. + DDTM=1000 ;DDT MODE + TTYDTC=2000 ;TTY DDB IS DETACHED FROM LINE + SYNC=20000 ;BREAK CHARACTER SEEN + ;SIGNAL TO INCREMENT SYNC COUNT + ;FOR BUFFER INVOLVED + TTYIOW=400000 ;TTY INPUT WAIT BIT + +IFNDEF FTHDPX, ;NON-ZERO TO INCLUDE HALF-DUPLEX CODE +IFNDEF FTDDTM, ;NON-ZERO TO IUNCLUDE CALLI DDTIN,OUT + +FTTTYSER=-1 ;DEFINE THIS SYSTEM TO HAVE SCNSRF + +INTERN FTTTYSER ;ASSURE MULT DEF GLOBALS IF WRONG APSER + ; RIGHT HALF BITS (USER MODE0 + FCS=100 ;FULL CHARACTER SET. PASS + ;ON ALL CHARACTERS EXCEPT ^C + ;NO SPECIAL CHARACTER PROCESSING + NOECHO=200 ;ECHO SUPPRESSION REQ BY PROG + DLRSUP=400 ;400 SUPPPRES "$" FOR ALTMODE + MERTPO=IOIMPM ;MONITOR ERROR TYPE-OUT + IGNOR=IODERR ;IGNORE ALL INT, FOR 1/2 + ;OF A SECOND WHEN ECHO + ;FAILURE OCCURS. + ECHOF=IODTER ;ECHO FAILURE OCCURED. +; DEVSER: STANDARD +; DEVBUF: STANDARD +; DEVIAD: BITS 6-12=HORIZONTAL POSITION (BYTE +; POINTER = PHPOS). +; BITS 13-35 ARE STANDARD. +; DEVOAD: BITS 0-8=NUMBER OF CHARACTERS TO FIT +; ;INTO OUTPUT BUFFER +; (POINTER= PFITCH) +; BITS 13-35 ARE STANDARD + +;THE FOLLOWING ARE DEFINITIONS OF THE RELATIVE LOCATIONS OF THE +;BUFFER PARAMETER WORDS OF THE DEVICE DATA BLOCK FOR EACH BUFFER. WITH +;TTX'BUF AS THE BASE (DETAILED DESCRIPTIN IN SCNDDB COMMENTS): + + XP BUF,0 ;BUF(DAT) CONTAINS POINTER TO BEG. OF CURRENT BUFFER + XP PUTR,1 ;PUTR(DAT)-PUTS CHARACTER INTO BUFFER + XP PCTR,2 ;NUMBER OF TIMES TO INCR. PUTR BEFORE REINITING + XP TAKR,3 ;TAKER POINTER TO PICK UP CHARACTERS + XP TCTR,4 ;COUNT OF NUMBER OF TIMES TAKR CAN BE INCREMENTED + XP FCTR,5 ;COUNT OF FREE SPACES LEFT IN BUFFER + ;DEFINITION OF LINE CHARACTERISTICS TABLE BITS +;LINTAB MADE BY SYSTEM BYUILDER +;FOLLOWING IS FORMAT AS SET UP BY SCNINI +; XWD BITS,LOGICAL LINE# + +EXTERNAL LINTAB + +PTYLIN=400000 ;THIS LINE LINKED TO PTY +CTYLIN=200000 ;THIS "LINE" IS CONSOLE DEVICE "TTY" +DISLIN=100000 ;THIS LINE IS TO A DISPLAY KEYBOARD +DSDTLN=40000 ;DATA SET DATA LINE +DSCTLN=20000 ;DATA SET CONTROL LINE +HLFDPX=10000 ;HALF DUPLEX LINE +TTYRMT=4000 ;REMOTE TTY LINE + +;ABOVE ARE "PERMANENT" CHARACTERISTICS + +TLKRNG=1 ;THIS LINE CURRENTLY IN A TALK RING +XON=2 ;^Q TYPED, PAPER TAPE INPUT + +FULTWX=4 ;SELF ECHOING FULL DUPLEX +T35=10 ;MODEL 35 +T37=20 ;MODEL 37 +ROBTPB=40 ;RUBOUT TYPED LAST (ECHO \ BEFORE NEXT CHAR.) +LINRDY=100 ;LINE TYPED IN BY USER (TISYNC .G.0) + ; NOT ACTUALLY IN LINTAB. BUT RETURNED BY + ; GETLIN IN TTCALL + +;ABOVE ARE TEMPORARY BITS, TURNED ON AND OFF BY VARIOUS MEANS +;(BY MONITOR, TYPE-IN COMMANDS, OR PROGRAM) + +LGLSET=T37+T35+FULTWX+XON ;THESE CAN BE SET OR ZEROED BY PROGRAM +KILMSK=ROBTPB+TLKRNG+XON ;CLEARED AT TTYKIL + +;DECLARE THESE AS INTERNS TO GET THEM IN THE MAP +;AND TO CHECK AGAINST S IN COMMON + +INTERNAL PTYLIN,CTYLIN,DISLIN,DSDTLN,DSCTLN,HLFDPX,TTYRMT +INTERNAL T35,T37,FULTWX,LGLSET,KILMSK,XON + ;ACCUMULATOR ASSIGNMENTS + + CHREC=TEM ;AC FOR CHARACTER + DDB=DEVDAT ;ADDRESS OF DEVICE DATA BLOCK + LINE=TAC1 ;SCANNER LINE NUMBER + HPOS=ITEM ;HORIZONTAL POSITION OF TTY,(0-71) + +;SPECIAL SYMBOLS + + PION=200 ;TURN PI ON BIT + PIOFF=400 ;TURN PI OFF BIT + + IDLECH=1 ;DELAY CHAR FOR TABS, ETC, + ; SHOULD BE ^V, BUT FOR 37'S + +;BYTE POINTERS + +INTERNAL TPCJOBN,TYPX,FULTWX,TYPE,TAKR,BREAKB + +PHPOS: POINT 7,DEVIAD(DEVDAT),12 ;HORIZONTAL POSITION +TPCJOBN:POINT 9,TTYTAB(LINE),11 ;JOB NUMBER FOR TTY. +PSAVCH: POINT 7,TTYPTR(DDB),10 ;SAVE CHAR TO ECHO ON UUO LEVEL + +INTERNAL FTTALK + +IFN FTTALK,< + PTALK: POINT 6,TTYTAB(LINE),17 ;POINTER TO ANOTHER TTY IN TALK RING +> + +INTERN PLASTC,PCOMIC + +PLASTC: POINT 7,TTYPTR(DDB),35 ;FOR EACH CHECKING ON HDX LINES +PCOMIC: POINT 9,TTYPTR(DDB),19 ;FOR RESCANNING COMMAND INPUT LINE + ;"COMMAND INPUT COUNTER" SAVES TITCTR +PLSTLC: POINT 9,TTYPTR(DDB),28 ;FOR ^U DELETION + +TOIP=400000 ;SIGN OF TTYPTR(DDB) - TYPE-OUT IN PROGRESS + +;TTYPTR CONTAINS THE FOLLOWING BYTES: +; +; 0 ON IF TYPE-OUT IN PROGRESS +; 1-3 SPARE +; 4-10 PSAVCH, FOR INTERRUPTED ECHO +; 11-19 PCOMIC, FOR COMMAND RESCAN +; 20-28 PLSTLC, FOR ^U +; 29-35 PLASTC, FOR EACH CHECKING HALF DUPLEX LINES + ;SCNINI IS CALLED AT SYSTEM INITIALIZATION TIME FROM +;IOGO IN SYSINI VIA DISPATCH TABLE +;IT 1)CLEARS ALL RECEIVER FLAGS. +; 2)CLEARS THE PHYSICAL NAME (DEVNAM) OF ALL UNUSED +; (TTYUSE=0) TTY DEVICE DATA BLOCKS, +; 3)SETS DEVIOD TO XWD TPMON+IOFST,0 IN ALL TTY DEVICE +; DATA BLOCKS. +; 4)SETS TTYUSE#1 IN ALL TTY DDBS IN THE TRANSLATOR TABLE. + +EXTERNAL SCNSCH,MLTTYL,MTTYLN,TTYTAB,SCNINI + +TTYINI: MOVEI TAC,SCNCHN + CONO TTY,1200(TAC) ;CLEAR CTY, ASSIGN CHANNEL + PUSHJ PDP,SCNINI ;DEVICE DEPENDENT SCANNER INIT + MOVSI TAC1,MLTTYL ;NO. OF TTY DEV. DATA BLOCKS. NOT LINES + MOVSI IOS,TPMON+IOFST ;VIRGIN STATUS + MOVEI DDB,TTYLST ;FIRST TTY DDB ADDRESS + +SCN1: MOVSI DAT,TTYUSE ;TTY DDB IN USE BIT + TDNN DAT,DEVMOD(DDB) ;IS THIS TTY DDB IN USE? + SETZM DEVNAM(DDB) ;NO, SET PHYSICAL NAME TO 0. + MOVEM IOS,DEVIOS(DDB) ;SET IOS TO INITIAL STATE + ANDCAM DAT,DEVMOD(DDB) ;CLEAR TTYUSE BIT. + SETZM TTYPTR(DDB) ;CLEAR TOIP, ETC + MOVSI TAC,TTYCHR ;NUMBER OF CHARACTERS IN BUFFER + HRRI TAC,TIBF(DDB) ;ADDRESS OF TTY INPUT BUFFER + MOVEM TAC,TTIBUF(DDB) ;SET IT UP + HRRI TAC,TOBF(DDB) ;ADDRESS OF TTY OUTPUT BUFFER + MOVEM TAC,TTOBUF(DDB) ;SET UP INFO FOR THAT + PUSHJ PDP,TSETBF ;CLEAR MONITOR BUFFERS + HLRZ DDB,DEVSER(DDB) ;GET NEXT TTY DDB + AOBJN TAC1,SCN1 + MOVSI TAC1,MTTYLN ;SET DDB USE BITS FROM TRANSLATOR TABLE +SCN2: MOVSI TAC,TTYUSE + SKIPE DDB,TTYTAB(TAC1) + IORM TAC,DEVMOD(DDB) + HRRZ TA,TAC1 ;SET UP PERMANENT LINTAB BITS + CAIGE TAC,TCONLN ;ORDINARY TTY LINE? + JRST SCN3 ;YES + CAIE TAC,TCONLN ;CTY LINE? + TLOA TAC,PTYLIN ;NO. MUST BE PTY LINE NR + TLO TAC,CTYLIN+T35 ;YES +SCN3: HRRM TAC,LINTAB(TAC1) ;SET LOG. LINE NUMBERS + IORB TAC,LINTAB(TAC1) ;SET SIGNIFICANT BITS + TLZ TAC,KILMSK ;ZAP INSIGNIFICANT BITS + TLNE TAC,DSDTLN ;IF A DATAPHONE, + TLZ TAC,LGLSET ; CLEAR OTHERS TOO + HLLM TAC,LINTAB(TAC1) ;LEAVING REST OF BITS AS THEY WERE + AOBJN TAC1,SCN2 + POPJ PDP, + ;ROUTINES TO SET UP BUFFERS + +INTERNAL TSETBF,SETBFI,PUTCHI + +SETBFI: MOVEI DAT,1 + DPB DAT,PCOMIC + DPB DAT,PLSTLC + MOVEI DAT,TTIBUF(DDB) ;SPECIFY INPUT BUFFER + SETZM TISYNC(DDB) ;NO LINES IN BUFFER + JRST SETBF0 ;INIT BUFFER + +TSETBF: PUSHJ PDP,SETBFI ;INIT TTI BUFFER +SETBF2: MOVEI DAT,TTOBUF(DDB) ;SPECIFY OUTPUT BUFFER +SETBF0: MOVE TAC,BUF(DAT) + HRLI TAC,440700 ;INITIAL TAKR AND PUTR + MOVEM TAC,TAKR(DAT) + MOVEM TAC,PUTR(DAT) + MOVEI TAC,1 ;INITIALIZE COUNTERS TOO + MOVEM TAC,TCTR(DAT) + MOVEM TAC,PCTR(DAT) + HLRZ TAC,BUF(DAT) ;CHARACTER COUNT + MOVEM TAC,FCTR(DAT) ;UPDATE FREE CHARACTER COUNT + +;ROUTINE TO PUT A CHARACTER INTO A BUFFER (FOR INPUT,MERTPO, AND ONCE) +;CALL MOVEI DAT,TTYBUF(DDB) ;TO SPECIFY BUFFER +; PUSHJ PDP,PUTCHI +; ERROR RETURN, BUFFER "FULL" +; SUCCESSFUL RETURN + +PUTCHI: SOSGE FCTR(DAT) ;ANY FREE SPACES LEFT? + JRST PUTCI0 ;NO +PUTCI2: SOSLE PTCR(DAT) ;LAST BYTE IN BUFFER FILLED? + JRST PUTCI1 ;NO, GO AHEAD + PUSH PDP,TAC + MOVE TAC,BUF(DAT) ;GET ADR AND SIZE OF BUFFER + HLRZM TAC,PCTR(DAT) ;INITIAL COUNTER + HRLI TAC,440700 ;MAKE A BYTE POINTER + MOVEM TAC,PUTR(DAT) ;STORE IT + POP PDP,TAC ;RESTORE TAC +PUTCI1: IDPB CHREC,PUTR(DAT) + JRST CPOPJ1 + +;ROUTINE TO STUFF MONITOR ERROR MESSAGE IN TTI BUFFER +;CALLED IN LINE FROM PUTCH0 + +TTIOUT: MOVE IOS,DEVIOS(DDB) + AOS TOFCTR(DDB) ;RE-ADJUST FREE CHAR COUNT + TRNN IOS,MERTPO ;MONITOR ERROR MESSAGES? + JRST GETCH1 ;NO, ZERO CHREC TO INDICATE + MOVEI DAT,TTIBUF(DDB) ;YES, PUT REST IN TTI BUFFER + SOSGE FCTR(DAT) ;ANY SPACE? + JRST PUTCI0 ;NO. + SOS 0(PDP) ;YES, COMPENSATE SKIP RETURN + JRST PUTCI2 ;AND GO TO MIDDLE OF PUTCHI + ;CHARACTER AND BUFFER HANDLING ROUTINES + +;ROUTINE TO PICK UP A CHARACTER FROM ANY BUFFER +;CALL MOVEI DAT,TTXBUF(DDB) ;TO SPECIFY BUFFER +; PUSHJ PDP,GETCHR +; ONLY RETURN ;CHARACTER OR ZERO IN CHREC +; ;ZERO INDICATES BUFFER "EMPTY"(TAKR=PUTR) + +INTERNAL GETCHR + +GETCHR: HLRZ CHREC,BUF(DAT) ;SIZE OF THIS BUFFER + CAMG CHREC,FCTR(DAT) ;IS FREE COUNTER EQUAL TO SIZE? + ;I.E., IS THE BUFFER EMPTY? + JRST GETCH1 ;YES. LOAD CHREC WITH ZERO AND EXIT + SOSLE TCTR(DAT) ;NO, ARE WE AT END OF BUFFER? + JRST GETCH2 ;YES. GO ON. + MOVE CHREC,BUF(DAT) ;YES. START AT TOP AGAIN + HLRZM CHREC,TCTR(DAT) ;INITIAL COUNTER + HRLI CHREC,440700 ;MAKE A BYTE POINTER + MOVEM CHREC,TAKR(DAT) ;INITIAL POINTER +GETCH2: ILDB CHREC,TAKR(DAT) ;GET CHARACTER + AOS FCTR(DAT) ;INCREMENT FREE CHAR. COUNT + JUMPE CHREC,GETCHR ;SKIP NULLS + POPJ PDP, +GETCH1: TDZA CHREC,CHREC ;RETURN 0 INDICATING END OF BUFFER +PUTCI0: AOS FCTR(DAT) ;READJUST FREE COUNTER + POPJ PDP, + +;ROUTINE TO PLACE A CHARACTER INTO THE OUTPUT BUFFER +;CALLED AT INTERRUPT LEVEL +;CALL MOVE CHREC,CHARACTER TO PLACE INTO BUFFER +; PUSHJ PDP,PUTCHO +; ONLY RETURN, WHETHER OR NOT CHARACTER WAS PLACED + +PUTCHO: SOSGE TOFCTR(DDB) ;RETURN IMMEDIATELY IF NO ROOM + JRST TTIOUT ;UNLESS MONITOR ERROR MESSAGE + CONO PI,PIOFF ;PREVENT PCTR AND PUTR DIFFERENCE + SOSLE TOPCTR(DDB) ;LAST BYTE IN BUFFER? + JRST PUTCO1 ;NO. GO ON. + MOVE TAC,TTOBUF(DDB) ;GET COUNT AND ADDRESS + HLRZM TAC,TOPCTR(DDB) ;INITIAL COUNTER + HRLI TAC,440700 ;MAKE A BYTE POINTER + MOVEM TAC,TOPUTR(DDB) ;INITIAL POINTER +PUTCO1: IDBP CHREC,TOPUTR(DDB) ;PUT CHARACTER INTO BUFFER + CONO PI,PION ;GET PI BACK ON + POPJ PDP, + ;ROUTINE TO CHECK IF A CHARACTER IS SPECIAL(ASCII 0-37, 175-177) +;CALL MOVE CHREC,CHAR. TO BE CHECKED +; PUSHJ PDP,SPCHEK +; RETURN1 IF REGULAR ASCII CHAR (40-174), C(TAC)=0 +; RETURN2 IF SPECIAL CHAR., TAC LOADED WITH WORD FROM SPCTAB + +INTERNAL SPCHEK + +SPCHEK: MOVEI TAC,0 ;LOAD TAC WITH 0 OR SPECIAL CHAR. WORD + CAIGE CHREC,40 + JRST SPCHK1 + CAIG CHREC,174 + POPJ PDP, + SKIPA TAC,SPCTAB-135(CHREC) + +SPCHK1: MOVE TAC,SPCTAB(CHREC) + JRST CPOPJ1 + ;SPECIAL CHARACTER TABLE +;FORMAT XWD BITS+CHAR,ADRESS OF ROUTINE +;HIGH ORDER BITS IN LH: + +SPACTN=40000 ;SPECIAL ACTION TO BE TAKEN +SPOUT=100000 ;SPECIAL HANDLING ON UUO OUTPUT +BREAKB=20000 ;BREAK CHARACTER +SPHPOS=10000 ;CHARACTER AFFECTS HORIZONTAL POSITION +ECSBRK=4000 ;BREAK CHARACTER IN FCS(100) MODE +ECHSUP=2000 ;SUPRESS ECHO OF CHAR ITSELF + +SPCTAB: XWD ECHSUP,0 ;NULL + XWD ECHSUP,0 ;^A SOH + XWD SPACTN+ECHSUP,CONTB ;^B FULTWX SH + XWD SPACTN+ECHSUP+BREAKB,CONTC ;^C + XWD ECHSUP,0 ;^D EOT + XWD ECHSUP,0 ;^E WRU + XWD SPACTN+ECHSUP,CONTF ;^F T37 SW + XWD FCSBRK,0 ;^G (BELL) + XWD SPACTN+SPHPOS,CONTH ;^H OR BACKSPACE KEY + XWD SPACTN+SPHPOS+SPOUT,CONTI ;^I OR TAB + XWD BREAKB,0 ;^J OR LINE FEED + XWD SPACTN+SPOUT+BREAKB,CONTK ;^K OR VERT TAB + XWD SPACTN+SPOUT+BREAKB,CONTL ;^L OR FORM FEED + XWD SPACTN+SPHPOS,CRLF ;^M OR CARRIAGE RETURN + XWD ECHSUP,0 ;^N + XWD SPACTN,CONTO ;^O SUPP OUTPUT + XWD SPACTN+ECHSUP,CONTP ;^P T35 SW + XWD SPACTN+ECHSUP,CONTQ ;^Q XON (PAPERTAPE) + XWD ECHSUP,0 ;^R TAPE PUNCH OFF + XWD SPACN+ECHSUP,CONTS ;^S XOFF + XWD ECHSUP,0 ;^T TAPE PUNCH OFF + XWD SPACTN,CONTU ;^U DELETE LINE + XWD ECHSUP,0 ;^V + XWD ECHSUP,0 ;^W + XWD ECHSUP,0 ;^X + XWD ECHSUP,0 ;^Y + XWD SPACTN+BREAKB+ECHSUP,CONTZ ;^Z TTY EOF + XWD SPACTN+BREAKB+ECHSUP,ALTMOD ;ASCII 33 (ALT-MODE) + XWD ECHSUP,0 ;ASCII 34 + XWD ECHSUP,0 ;ASCII 35 + XWD ECHSUP,0 ;ASCII 36 + XWD ECHSUP,0 ;ASCII 37 + +;ABOVE ARE CONTROL CHARACTERS, BELOW ASCII 175-177 + + XWD SPACTN+BREAKB+ECHSUP,ALTMOD ;OLD DEC ALTMOD 175 + XWD SPACTN+BREAKB+ECHSUP,ALTMOD ;ALT-MODE 176 + XWD SPACTN+ECHSUP+FCSBRK,RUBOUT ;177 RUBOUT + IFN FTDDTM,< + +;INPUT TO DDT +;CALL AC,[SIXBIT /DDTIN/] AC CONTAINS POINTER TO BUFFER AREA +;BUFFER AREA MUST BE 21 WORDS LONG + +INTERNAL DDTIN +EXTERNAL WSYNC,IADRCK,ADRERR +EXTERNAL PTYOW + +DDTIN: PUSHJ PDP,TTYFNU ;SET UP DEVDAT,LINE + MOVE IOS,[XWD TTYIOW+DDTM,IOACT] + IORB IOS,DEVIOS(DDB) ;PUT INTO I/O WAIT + MOVE TAC,TIPUTR(DDB) + CAMN TAC,TITAKR(DDB) ;ANYTHING IN BUFFER; + PUSHJ PDP,TWSYNC ;NO, WAIT FOR SOME +DDTIW: MOVE IOS,[XWD TTYIOW,IOACT] + ANDCAB IOS,DEVIOS(DDB) + + MOVSI TAC,IOFST+DDTM + IORM TAC,DEVIOS(DEVDAT) ;STOP ALL IO + HRRZ TAC,@UUO ;CONTENTS OF USER (DDT) AC + ADDI TAC,21 + PUSHJ PDP,IADRCK + JRST ADRERR + SUBI TAC,21 + PUSHJ PDP,IADRCK + JRST ADRERR + MOVSI AC2,440700+PROG + HRR AC2,TAC + MOVE TAC1,TIPUTR(DDB) + MOVEI DAT,TTIBUF(DDB) + MOVEI AC1,<21*5>-1 ;NUMBER OF CHARACTERS ALLOWED + XFRIN: PUSHJ PDP,GETCHR ;TRANSFER INTO USER'S AREA + JUMPE CHREC,XFRIN2 + PUSHJ PDP,SPCHEK + JRST XFIN1 + TLNE TAC,FCSBRK+BREAKB + SOS TISYNC(DDB) +XFRIN1: CAIN CHREC,3 ;PRESTORED CONTROL C? + JRST DDONC ;YES, GO INTO MONITOR MODE + IDPB CHREC,AC2 + SOJG AC1,XFRIN ;LOOP TILL DONE +XFRIN2: MOVEI CHREC,0 ;TERMINATE STRING + IDPB CHREC,AC2 + MOVSI TAC,IOSUPR ;MAKE SURE IO NO LONGER SUPR. + ANDCAM TAC,DEVIOS(DEVDAT) + POPJ PDP, + +DDTCNC: PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS + JRST MONUS6 ;GO PROCESS ^C +> + +EXTERNAL PTYOW,WSYNC + +;TWSYNC IS CALLED FOR INPUT IO WAIT + +TWSYNC: TLNE LINE,PTYLIN ;PSEUDO TELETYPE TTYDDB? + PUSHJ PDP,PTYOW ;SET OUTPUT WAIT BIT IN PTY DEVIOS WORD + TLNE LINE,XON ;DO WE WANT TO START RDR? + TLNE LINE,PTYLIN+HLFDPX+FULTWX ;CAN WE? + JRST WSYNC ;NO + MOVEI CHREC,21 ;READER START CHAR + PUSHJ PDP,OUTCHS ;TO OUTPUT BUFFER + PUSHJ PDP,UTYPET ;START TTY, AND + JRST WSYNC ;WAIT FOR INPUT + EXTERNAL WSYNC,IADRCK,ADRERR,CPOPJ +EXTERNAL JOBPFI,GETWD1 + +IFN FTDDTM,< +;OUTPUT FROM DDT +;CALL AC,[SIXBIT /DDTOUT/] AC HAS POINTER TO DDT OUTPUT BUFFER + +INTERNAL DDTOUT + +DDTOUT: PUSHJ PDP,TTYFNU + MOVE UUO,@UUO +> + +DDT5: MOVSI IOS,IO+DDTM + IORB IOS,DEVIOS(DDB) + HRLI UUO,PROG ;POINT TO USER AC + HRRI UUO,-1(PROG) ;COMPENSATE FOR GETWD1 +DDT2: MOVE DAT,[XWD 440700,TAC] ;BYTE POINTER TO TAC + PUSHJ PDP,GETWD1 ;GET THE USER'S WORD +DDT3: TLNN DAT,760000 ;ANY CHARS LEFT? + JRST DDT2 ;NO, GET ANOTHER WORD +DDT4: ILDB CHREC,DAT ;BYTE FROM TAC + JUMPE CHREC,DDTUTT ;NULL IS END OF STRING + PUSHJ PDP,OUTCHR ;PLACE CHAR IN OUTPUT BUFFER + JUMPN CHREC,DDT3 ;LOOP IF CHARACTER WAS PLACED + ADD DAT,[XWD 070000,0] ;BACK UP POINTER + PUSH PDP,DAT ;SAVE BYTE POINTER TO TAC + PUSH PDP,TAC ;AND SAVE THE CHARS IN TAC + PUSHJ PDP,DDTUTT ;START OUTPUT + +DDTWAT: MOVEI IOS,IOACT ;WAIT UNTIL MONITOR BUFFER EMPTY + IORB IOS,DEVIOS(DDB) + PUSHJ PDP,WSYNC + POP PDP,TAC ;RESTORE CHARSIN TAC + POP PDP,DAT ;RESTORE BYTE POINTER TO TAC + JRST DDT3 ;TRY AGAIN + +DDTUTT: PUSHJ PDP,TTYFNU ;RESTORE DAT,LINE + JRST UTYPET ;AND START OUTPUT + ;MORE CHARACTER AND BUFFER HANDLING ROUTINES + +;OUTCHR CALLED AT UUO LEVEL TO OUTPUT A CHARACTER +;DAT AND DDB MUST BE SET UP +;CHECK IS MADE FOR WHETHER SPECIAL ECHO IS REQUIRED +;RIGHT THINGS ARE DONES WITH PHPOS & HPOS(NEEDNT BE SET) +;CALL MOVE CHREC,CHAR TO BE OUTPUT +; PUSHJ PDP,OUTCHR +; ONLY RETURN, WITH CHAR, OR ITS SPECIAL ECHO PLACED IN OUT BUFFER + +INTERNAL OUTCHS + +OUTCHR: TLNE IOS,IOSUPR ;I/O OFF BY ^O? + POPJ PDP, ;YES. RETURN + MOVEI HPOS,20 ;CHECK FREE SPACE + CAML HPOS,TOFCTR(DDB) ; FOR EXPANDING CHARS + JRST GETCH1 ;NOT ENOUGH ROOM +OUTCHS: PUSH PDP,TAC + PUSH PDP,HPOS + PUSH PDP,TAC1 ;SAVE LINE + PUSHJ PDP,STLNAC ;GET LINE DATA + ANDI CHREC,177 ;MASK ANYT JUNK + LDB HPOS,PHPOS ;GET HORIZONTAL POSITION + PUSHJ PDP,ADJHP ;NEW HPOS AFTER CHAR OUTPUT + JFCL + TLNE LINE,DISLIN+PTYLIN ;IS IT A DISPLAY OR PTY? + JRST OUTCH2 ;YES, IGNORE HPOS AND FILLERS + CAIL HPOS,^D72 ;DID IT GO OVER LINE? + PUSHJ PDP,CRLFEC ;YES, OUTPUT CRLF + TLNE TAC,SPOUT ;VT,FF,HT? + JUMPGE LINE,OUTCH1 ;YES, HANDLE THEM UNLESS PTY +OUTCH2: PUSHJ PDP,PUTCHO ;PLACE IN BUFFER +OUTCH3: DPB HPOS,PHPOS ;UPDATE IN CORE + POP PDP,TAC1 ;RESTORE LINE + POP PDP,HPOS + JRST TPOPJ + ;HERE ON UUO OUTPUT OF HT,FF,VT + +OUTCH1: PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS + TLNE LINE,T35 ;SMART TTY? + JRST OUTC1A ;YES + MOVE TAC,CHREC ;COPY THE CHARACTER + MOVEI CHREC,40 ;STUPID TTY. + LDB HPOS,PHPOS ;GET OLD POSITION + CAIE TAC,11 ;H TAB? + MOVEI CHREC,12 ;NO. OUTPUT LF'S. +OUTC1C: CAIN TAC,14 ;FF? + MOVNI HPOS,10 ;YES. 8 LF'S + CAIN TAC,13 ;VT? + MOVNI HPOS,4 ;YES. 4 LF'S +OUTC1B: PUSHJ PDP,PUTCH0 ;OUTPUT THE PHONEY CHAR + ADDI HPOS,1 ;COUNT THE OUTPUTS + TRNE HPOS,7 ;ENOUGH? + JRST OUTC1B ;NO. MORE. + JRST OUTCH3 ;NO MORE. + +OUTC1A: ;HERE ON OUTPUT OF SLOW CHARS TO SMART TTY + PUSHJ PDP,PUTCH0 ;SENT THE REAL CHAR + MOVE TAC,CHREC ;COPY THE CHARACTER + MOVEI CHREC,IOLECH ;A DELAY CHARACTER + SUBI HPOS,2 ;TWO SHLUFF CHARACTERS + JRST OUTC1C ;GO OUTPUT THE SLUFFS. + ;COUNT WILL BE MODIFIED ON VT,FF + + ;CALLED AT UUO AND INT LEVEL + ;TO ADJUST HPOS FOR OUTPUT OF CHREC + ;SKIPS IF SPCHECK SAYS SPECIAL CHAR + +ADJHP: CAIL CHREC,174 ;HIGH SPECIALS? + JRST SPCHEK ;YES, NO HPOS MOTION + CAIL CHREC,40 ;CONTROL CHARACTERS? + AOJA HPOS,SPCHEK ;NO. COUNT HPOS FOR PRINT CHAR + CAIN CHREC,10 ;BACKSP? + SOJL HPOS,.+2 ;YES + CAIN CHREC,15 ;CARRIAGE RETURN? + MOVEI HPOS,0 ;YES. + CAIE CHREC,11 ;TAB? + JRST SPCHEK ;NO. NO HP MOD + TRO HPOS,7 ;TAB. TO NEXT 8 + AOJA HPOS,SPCHEK + INTERNAL FTCHECK,FTMONP +IFN FTCHECK+FTMONP,< +EXTERNAL SCNDDB,TTYLST,TTIBUF,TIPUTR,TITAKR,TITCTR,TIFCTR,TISYNC +EXTERNAL TTOBUF,TOPUTR,TOPCTR,TOTAKR,TTYCHR,SCNDDS,CCHAR,LINSAV +EXTERNAL TOTCTR,TOFCTR +> +IFE FTCHECK+FTMONP,< + ;DESCRIPTION OF DEVICE DATA BLOCK FOR TELETYPES +;THERE IS ONE DEVICE DATA BLOCK FOR EACH JOB THAT CAN BE INITIALIZED +;UNDER TIME-SHARING, WHETHER THIS JOB IS ATTACHED TO A PHYSICAL LINE +;NUMBER OR NOT, THEREFORE THERE SHOULD BE ONE DDB FOR EVERY LINE NUMBER +;PLUS ONE FOR EVERY PSEUDO-TELETYPE PLUS ONE FOR EVERY ADDITIONAL JOB +;THAT AN INSTALATION MAY WISH TO RUN DETACHED FROM A PHYSICAL LINE +;PLUS ONE DDB TO PRINT ERROR MESSAGES WHEN ALL JOBS (DDB'S ARE +;INITIALIZED. +;THE FUNCTIONS OF THE FIRST EIGHT WORDS ARE AS DESCRIBED IN THE +;COMMENTS IN THE SYSTEM PARAMETER TAPE( FILE NAME S). LOCATION 11 +;THROUGH 27 (OCTAL) RELATIVE TO SCNDDB PERTAIN DIRECTLY TO THE +;SCANNER SERVICE BUFFERING SCHEME. THE SUBSEQUENT 2*20(OCTAL) LOCATIONS +;ARE CURRENTLY THE TWO TELETYPE BUFFERS. THEY NEED NOT BE IN THE DDB +;AS LONG AS THEIR ADDRESSES ARE PLACED IN THE RIGHT HALF OF TTIBUF. +;AND TTOBUF EITHER AT ASSEMBLY, BUILD OR RUN TIME, IF DYNAMIC +;BUFFER CONSTRUCTION IS TO BE ADDED THESE BUFFERS MAY BE PLACED ANYWHERE IN +;FRE CORE STORAGE, AND THE RIGHT HALF OF THE REQUIRED TTXBUF(WHERE "X" +;MAY BE "I" OR "O")MAY BE LOADED ONLY WHEN THAT BUFFER IS REQUIRED. + +;THERE ARE TWO BUFFERS, EACH OF WHICH IS A "RING" UNTO ITSELF: +;INPUT---POINTED TO BY TTIBUF +; ALL CHARACTERS TYPED GO INTO THIS BUFFER, IN ADDITION, ALL +;OTHER COMMANDS TO BE READ BY THE COMMAND INTERPRETER IN COMCON +;(APRSER) ARE STORED HERE, +;OUTPUT BUFFER---POINTED TO BY TTOBUF +; ALL CHARACTERS THAT ARE OUTPUT ARE PLACED SEQUENTIALLY IN THIS +;BUFFER; THIS INCLUDES ECHOED CHARACTERS AS WELL AS NORMAL OUTPUT OF +;CHARACTER STRINGS. + +;THERE ARE NINE BUFFER PARAMETER WORDS ASSOCIATED WITH EACH BUFFER +;(EXCEPT FOR THE OUTPUT BUFFER, WHICH ONLY NEEDS SIX), THE LAST +;FOUR CHARACTERS IUN THE MNEMONIC DESCRIBES THE FUNCTION OF THE WORD +;WHILE THE FIRST TWO CHARACTERS IDENTIFY WHICH BUFFER THAT THE +;FUNCTION APPLIES TO. THE FORMULA FOR THESE WORDS IS TX'FUNC, WHERE +;THE RELATIVE POSITION OF ALL TX'FNC1 TO TTX'BUF IS THE SAME FOR +;ALL BUFFERES. IN THE MANNER, THE ADDRESS OF TTX'BUF IS LOADED INTO +;ACCUMULATOR DAT, AND THE RELATIVE POSITIONS FUNCT1-FUNCT9 ARE +;DEFINED TO BE 0-10(OCTAL); I.E., FUNCT(DAT) WILL IDENTIFY THE DESIRED +;BUFFER PARAMETER WORD REGARDLESS OF BUFFER. + ;FOLLOWING ARE DEFINITIONS OF THE RELATIVE BUFFER PARAMETER WORDS: +;TTX'BUF OR BUF(DAT)---THE LEFT HALF CONTAINS NUMBER OF BYTES IN BUFFER AND THE RIGHT +; HALF THE ADDRESS OF THE FIRST WORD OF THE BUFFER, THIS WORD IS +; ONLY READ BY THE CURRENT CODE. UPON THE ADDITION OF DYNAMIC +; BUFFER ALLOCATION. THIS WORD WOULD BE LOADED IN THE SAME FORMAT +; AT THE TIME THAT THE BUFFER WOULD BE BUILT. +; +;SCNINI SETS BUFFERS TO LENGTH TTYCHR AT PRESENT. ALSO +;PRESENT CODE OCCASIONALLY USES TTYCHR RATHER THEN READING LH +;OR TTXBUF +; +;TX'PUTR OR PUTR(DAT)---BYTE POINTER USED TO PLACE CHARACTERS INTO THE +; BUFFER. IT MUST ALWAYS BE AHEAD OF OR EQUAL TO THE TAKER POINTER. +;TX'PCTR OR PCTR(DAT)---COUNT OF NUMBER OF TIMES THAT PUTR MAY BE INCREMENTED +; BEFORE REACHING THE LAST BYTE IN THE LAST WORD OF THE BUFFER +; (NOT THE AMMOUNT OF FREE SPACE LEFT) +;TX'TAKR OR TAKR(DAT)---BYTE POIUNTER USED BY ALL ROUTINES TO PICK UP +; CHARACTERS FRM THE BFFER. WHEN THE TAKR IS EQUAL TO THE PUTR. +; THE BUFFER IS "EMPTY". +;TX'TCTR OR TCTR(DAT)---COUNT OF THE NUMBER OF TIMES THAT THE TAKR CAN +; BE INCREMENTED BEFORE REACHING THE PHYSICAL END OF THE BUFFER. +;TX'FCTR OR FCTR(DAT)---FREE CHARACTER COUNT; I.E., HOW MANY TIMES MAY THE +; PUTR BE INCREMENTED BEFORE IT WOULD COME AROUND AND "STEP ON" +; THE TAKR, WHEN THE FREE CHAR. COUNT IS ZERO, NO MORE CHARACTERS +; MAY BE PLACED IN THE BUFFER (USUAL RESULT IS GOING INTO IO WAIT) +;TISYNC---COUNT OF NUMBER OF "LINES" THAT HAVE BEEN TYPED +; INTO INPUT BUFFER. + ;SCANNER DEVICE DATA BLOCK +;REMAINING SCN DDB'S ARE GENERATED +;OUT OF LINE AT BUILD TIME. + +INTERNAL SCNDDB,LINSAV + TTYLST=. ;FIRST TTT DDB + ZZ=. +SCNDDB: SIXBIT /TTY0/ ;DEVNAME + XWD 0,STTYBF+1 ;DEVCHR + Z ;DEVIOS + EXP SCNDSP ;DEVSER + XWD DVTTY+DVIN+DVOUT,3 ;DEVMOD + Z ;DEVLOG + Z ;DEVBUF + XWD PROG,0 ;DEVIAD, PHPOS BITS 6-12 + XWD PROG,0 ;DEVOAD, PFITCH BITS 0-8 + XP TTYPTR,.-ZZ ;TTYPTR + Z ;PLASTC,PLSTLC,PCOMIC,POSAVCH,TOIP + XP TISYNC,.-ZZ + Z + XP TTIBUF,.-ZZ + XWD STTYBF*5,0 ;RH IS BUFFER ADR + XP TIPUTR,.-ZZ + Z + XP TIPCTR,.-ZZ + Z + XP TITAKR,.-ZZ + Z + XP TITCTR,.-ZZ + Z + XP TIFCTR,.-ZZ + Z + XP SYSPDL,. +;BUFFER USED AS PUSH-DOWN LIST BY SYSTEM DURING +;INITIALIZATION AND RESTARTING + + XP TIBF,.-ZZ + REPEAT STTYBF,< 0> + XP TTOBUF,.-ZZ + XWD STTYBF*5,0 + XP TOPUTR,.-ZZ + Z + XP TOPCTR,.-ZZ + Z + XP TOTAKR,.-ZZ + Z + XP TOTCTR,.-ZZ + Z + XP TOFCTR,.-ZZ + Z + XP TOBF,.-ZZ + REPEAT STTYBF,<0> +;NO. OF CHAR. IN MON. BUF. + + XP TTYCHR,<*5> + XP SCNDDS,.-ZZ ;SIZE OF SCN DDB + +LINSAV: 0 +> ;CLOSE IFE FTMONP WAY BACK + ;DEVICE DEPENDENT PART OF IO UUOS. + + +;DISPATCH TABLE + +INTERNAL SCNDSP +EXTERNAL OUT,SCNON,SCNOFF + + JRST TTYINI ;INITIALIZATION + JRST CPOPJ1 ;TTY HUNG TIME-OUT, IGNORE +SCNDSP: JRST TTYREL ;RELEASE + JRST OUT ;CLOSE + JRST TTYOUT ;OUTPUT + +TTYIN: MOVE IOS,[XWD TTYIOW,IOACT] ;INDICATE INPUT WAIT + IORB IOS,DEVIOS(DDB) + MOVSI IOS,DDTM+TPMON + ANDCAB IOS,DEVIOS(DDB) + PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS +IFN FTHDPX,< + TLNE LINE,HLFDPX + TLNN IOS,IO +> +TTYIN1: SKIPG TISYNC(DDB) + PUSHJ PDP,TWSYNC + PUSHJ PDP,MONUSR +TENDIN: MOVE IOS,[XWD TTYIOW+DDTM+IOSUPR,ECHOF+MERTP+IGNOR+IOACT] +T0POPJ: ANDCAB IOS,DEVIOS(DDB) + POPJ PDP, + ;ROUTINE TO MOVE A LINE OR STRING FROM TTY INPUT BUFFER TO USER'S INPUT BUFFER +;CALLED ONLY FROM UUO LEVEL,FROM INPUT UUO ONLY + +EXTERNAL ADVBFF,STTIOD,BUFCLR + +MONUSR: HRRZ TAC,DEVIAD(DDB) ;ADDRESS OF BUFFER IN USER AREA + PUSHJ PDP,BUFCLR ;CLEAR WHOLE BUFFER + JRST ADRERR ;ADDRESS CHECK RETURN + PUSHJ PDP,STLNAC ;SETUP LINE + MOVEI AC2,TTYCHR ;MAX NR OF CHARACTERS + MOVEI AC1,@DEVIAD(DDB) ;ADDRESS OF USR BUFFER-1 + ADD AC1,[XWD 10700,1] ;MAKE BYTE POINTER POINT RIGHT + MOVEI DAT,TTIBUF(DDB) ;SPECIFY USER MODE INPUT BUFFER + +MONUS1: PUSHJ PDP,GETCHR ;GET A CHAR, FROM IT + JUMPE CHREC,MONUS3 ;ZERO IMPLIES EMPTY BFR + IDPB CHREC,AC1 ;PLACE CHAR. IN USER BUFFER + PUSHJ PDP,SPCHEK ;SPECIAL CHARACTER? + JRST MONUS2 ;NO + + TLNE TAC,FCSBRK+BREAKP ;A BREAK CHARACTER? + SOSA TISYNC(DDB) ;SOME BREAK, COUNT IT DOWN +MONUS2: SOJG AC2,MONUS1 ;NO, USER BUFFER FULL? + CAIN CHREC,3 ;STORED CONTROL C? + JRST MONUS7 ;YES, HANDLE IT + MOVEI IOS,0 + CAIN CHREC,"Z"-100 ;^Z READ? + MOVSI IOS,IOEND + IORB IOS,DEVIOS(DDB) + +MONUS3: MOVEI AC2,@DEVIAD(DDB) ;BREAK CHAR OR COUNTED OUT, INPUT UUO DONE + SUBI AC1,1(AC2) ;CALCULATE NUMBER OF WORDS + HRRM AC1,1(AC2) ;STORE IN 3RD BUFFER WORD + +MONUS4: PUSHJ PDP,ADVBFF ;INPUT UUO DONE,NEXT BUFFER FULL? + JRST MONUS5 ;YES, INPUT REALLY IS DONE + SKIPLE TISYNC(DDB) ;NO, DO WE HAVE MORE LINES FOR IT? + JRST MONUS8 ;YES, GIVE USER NEXT LINE, TOO + +MONUS5: MOVSI IOS,IOFST + IORB IOS,DEVIOS(DDB) + TLZE IOS,IOW ;TTY IN INPUT WAIT? + PUSHJ PDP,STTIOD ;YES., TAKE IT OUT OF IT + POPJ PDP,0 + MONUS6: PUSHJ PDP,CNCMOD ;CONTROL C MODE + MOVSI TAC,70000 ;DECREMENT TAKR POINTER + ADDM TAC,TITAKR(DDB) ;SO NEXT ILDB WILL GET ^C + AOS TITCTR(DDB) ;ADJUST COUNTER + SOS TIFCTR(DDB) ;ADJUST FREE CHAR. COUNT + AOS TISYNC(DDB) ;SEE THE ^C AGAIN + PUSHJ PDP,COMSET ;WAKE UP COMMAND DECODER + JRST WSYNC ;AND WAIT FOR INTERPRETATION + +MONUS7: MOVE IOS,[XWD TTYIOW,IOACT] + IORB IOS,DEVIOS(DDB) ;PUT JOB BACK IN IOWAIT + PUSHJ PDP,MONU6 + JRST TTYIN ;RESTART INPUT UUO + +MONUS8: TLNN IOS,IOEND ;ROOM FOR ANOTHER BUFFER, ^Z SEEN? + JRST MONUSR ;NO, GO PASS ANOTHER LINE + POPJ PDP, ;YES, LET UUOCON HANDLE EOF + ;OUTPUT UUO + +EXTERNAL PTYPE,ADVBFE + +TTYOUT: MOVSI IOS,IOBEG + TDNE IOS,DEVIOS(DDB) + TLO IOS,IOSUPR ;KILL ^O ON FIRST OUTPUT + IOR IOS,[XWD TPMON+DDTM,ECHOF+MERTPO+IGNOR+IOACT] + ANDCAM IOS,DEVIOS(DDB) + MOVSI IOS,IO+IOFST + IORB IOS,DEVIOS(DDB) + + PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS + PUSH PDP,LINE ;SAVE INFO + PUSHJ PDP,USRMON ;MOVE USER'S BUFFER TO TTO BUFFER + PUSHJ PDP,ADVBFE ;ADVANCE USER'S HEADERS + SKIPA + JRST .+3 ;MOVE BUFFERS AVAILABLE + + MOVEI IOS,IOACT ;NO MORE BUFFERS + ANDCAB IOS,DEVIOS(DDB) ;CLEAR ACTIVE IN IOS + POP PDP,LINE ;RESTORE LINE INFO +UTYPET: JUMPL LINE,PTYPE ;START PTY EXCHANGE IF PTY LINE + MOVSI TAC,TOIP + CONO PI,PIOFF ;PREVENT TIMING GLITCH + TDNN TAC,TTYPTR(DDB) ;IS TYPE-OUT ALREADY ON? + JRST UTYPE1 + CONO PI,PION + POPJ PDP,0 + +UTYP1: IORM TAC,TTYPTR(DDB) ;START TYPEOUT + JRST XMTIN1 + ;ROUTINE TO MOVE USER OUTPUT BUFFER TO MON. OUTPUT BUFFER +;CALLED ONLY AT UUO LEVEL,BY OUTPUT UUO + +EXTERN UADRCK + +USRMON: MOVEI AC2,@DEVOAD(DDB) ;ADDRESS OF 2ND BUFFER WORD + MOVE AC2,1(AC2) ;NUMBER OF WORDS TO OUTPUT + IMULI AC2,5 ;NR OF CHARACTERS + +USRMN1: HRRZ AC1,DEVOAD(DDB) ;ADDRESS OF BUFFER + PUSHJ PDP,UADRCK ;MAKE SURE IT IS OK + ADD AC1,[XWD 10700+PROG,1] ;MAKE POINTER RELOCATABLE + +USRMN2: ILDB CHREC,AC1 ;PICK UP CHARACTER +USRMN4: JUMPE CHREC,USRMN5 ;IF NULL, IGNORE + PUSHJ PDP,OUTCHR ;PLACE IN OUTPUT BUFFER + JUMPE CHREC,USRMN3 ;IF NO MORE ROOM IN MON. BUFFER + +USRMN5: SOJG AC2,USRMN2 ;LOOP AS LONG AS THERE ARE CHAR'S, + POPJ PDP, ;DONE + +USRMN3: PUSH PDP,AC2 ;NUMBER OF CHARACTERS TO GO + PUSH PDP,AC1 ;SAVE RELOCATABLE POINTER + MOVE LINE,-3(PDP) ;GET SAVED LINE CHAR WORD + PUSHJ PDP,TTOUWS ;WAIT FOR ID + POP PDP,AC1 ;RESTORE POINTER + POP PDP,AC2 ;RESTORE COUNT + MOVE IOS,DEVIOS(DDB) ;RESTORE IOS + LDB CHREC,AC1 ;GET LAST CHARACTER + JRST USRMN4 ;RETURN TO OUT LOOP + +TTOUWS: MOVE IOS,[XWD IO,IOACT] ;SET DEVICE ACTIVE (TTY) + IORB IOS,DEVIOS(DDB) + PUSHJ PDP,UTYPET ;START TYPING IF NEEDED + JRST WSYNC ;WAIT TILL ROOM IN BUFFER + ;TTCALL - QUANTITY IN AC FIELD DETERMINES ACTION OF UUO (051) + +INTERNAL TTYUUO +EXTERN UADCK1 + +TTYUUO: PUSHJ PDP,TTYFNU + CAIL UCHN,TTUUOL ;TOO HIGH AC FIELD? + POPJ PDP, ;YES, NO-OP + CAIE UCHN,1 ;A READ OPERATION? + CAIN UCHN,3 ;I.E., PURE? + JRST @TTUUOT(UCHN) ;YES. DONT ADR CHECK + HRRZ AC1,UUO + PUSHJ PDP,UADCK1 + JRST @TTUUOT(UCHN) ;DISPATCH TO UUO ROUTINES + +TTUUOT: EXP INCHRW ;(0)INPUT CHAR. WAIT TILL TYPED + EXP ONEOUT ;(1)OUTPUT A CHARACTER + EXP INCHRS ;(2)INPUT A CHAR. & SKIP + + EXP OUTSTR ;(3)OUTPUT A STRING + EXP INCHWL ;(4)INPUT CHAR, WAIT.LINE MODE + EXP INCHSL ;(5)INPUT CHAR, SKIP. LINE MODE + EXP GETLIN ;(6)GET LINE CHARACTERISTICS WORD + EXP SETLIN ;(7)SET BITS IN LH LINTAB + EXP TRESOU ;(10)BACK UP POINTER TO COMMAND + EXP SETBFI ;(11)CLEAR INPUT BUFFER + EXP SETBF2 ;(12)CLEAR OUTPUT BUFFER + EXP SKPINC ;(13)SKIP IF CHAR TO INPUT + EXP SKPINL ;(14)SKIP IF LINE TO INPUT + +TTUUOL=.-TTUUOT + ;INPUT A CHARACTER AND SKIP---IF NONE TYPED, DON'T SKIP + +INCHSL: SKIPG TISYNC(DDB) ;ANY LINES IN BUFFER? + POPJ PDP,0 ;NO, RETURN +INCHRS: MOVEI DAT,TTIBUF(DDB) ;GET A CHARACTER + PUSHJ PDP,GETCHR ;FROM TTI BUFFER + JUMPE CHREC,CPOPJ ;RETURN IF NULL(EMPTY BUFFER) + PUSHJ PDP,SPCHEK + JFCL + TLNE TAC,FCSBRK+BREAKB + SOS TISYNC(DDB) ;KEEP BREAK COUNT RIGHT + PUSHJ PDP,TENDIN ;CLEAR UP IOACT, IOSUPR, ETC + CAIN CHREC,3 + JRST MONUS6 ;STORED ^C + MOVEM CHREC,@UUO ;MOVE INTO LOC, SPECIFIED BY UUO + JRST CPOPJ1 ;AND SKIP RETURN + +;INPUT CHARACTER AND WAIT, LINE MODE + +INCHWL: PUSHJ PDP,INCHSL ;SEE IF ANY CHARS. + JRST .+2 ;NO + POPJ PDP,0 ;YES. GIVE IT TO USER + MOVE IOS,[XWD TTYIOW,IOACT] ;NONE, WAIT FOR IT + IORM IOS,DEVIOS(DDB) ;TTY TO IOW STATE + MOVSI IOS,DDTM ;JUST IN CASE + ANDCAB IOS,DEVIOS(DDB) ;CLEAR DDTMODE BREAK FLAG + PUSHJ PDP,TWSYNC ;WAIT FOR CHAR + JRST INCHWL ;AND TRY AGAIN + +;OUTPUT A STRING + +OUTSTR: JRST DDT5 ;JUST USE DDT OUTPUT CODE + +SKPINL: SKIPLE TISYNC(DDB) ;INPUT BUFFER HAVE A LINE? + AOS 0(PDP) ;YES, SKIP. + POPJ PDP,0 ;RETURN + +SKPINC: HLRZ TAC,TTIBUF(DDB) ;SIZE OF IN BUFFER + CAMLE TAC,TIFCTR(DDB) ;SIZE > # FREE CHARS? + AOS 0(PDP) ;YES. SKIP. + POPJ PDP,0 ;RETURN. + ;MORE ROUTINES CALLED BY TTY UUO DISPATCHER + +EXTERNAL TTPLEN,GETWDU + +;INCHRW GOES INTO I/O WAIT IF NO CHARACTER HAS BEEN TYPED--NO SKIPS + +INCHRW: PUSHJ PDP,INCHRS ;GET ACHAR IF ONE IS THERE + JRST .+2 ;NONE THERE + POPJ PDP, ;CHAR, PICKED UP AND STORED + MOVE IOS,[XWD TTYIOW+ODTM,IOACT][ ;SETUP FOR IOWAIT + IORB IOS,DEVIOS(DDB) ;SPECIFICALLY FOR INPUT WAIT + PUSHJ PDP,TWSYNC ;WAIT FOR CHAR. TO BE TYPED + JRST INCHRW ;GO GET IT + +;ONEOUT OUTPUTS ONE CHARACTER + +ONEOUT: PUSHJ PDP,GETWDU ;PICK UP CHAR FROM USER + MOVE CHREC,TAC ;PUT IT IN PROPER AC + ANDI CHREC,177 ;MASK ANY JUNK + + JUMPE CHREC,CPOPJ ;DONT STORE NULLS + PUSHJ PDP,OUTCHR ;PLACE IT IN TTO BUFFER + JUMPN CHREC,DDTUTT ;IF IT STORED, RETURN + PUSHJ PDP,TTOUWS ;BUFFER WAS FULL. TRY AGAIN LATER + JRST ONEOUT + +;GETLIN PUTS LINE CHARACTERISTICS WORD INTO ADR. IN UUO ADR. FIELD + +GETLIN: SKIPGE TAC,@UUO ;DOES USER WANT ONE LINE CHAR. WD.? + JRST GETLN1 ;YES + MOVEI LINE,0 ;NO, CHECK SIZE OF NUMBER + CAIL TAC,TTPLEN ;TOO HIGH? + JRST GETLN1 ;YES, GIVE HIM THE 0. + MOVE LINE,LINTAB(LINE) ;OK, GET THE ENTRY + HRRZ DEVDAT,TTYTAB(TAC) ;GET DEVDAT ON REQUESTED LINE + ; NOTE - NO LONGER ON JOB'S TTY + LDB TAC,PJOBN ;GET JOB NUMBER OF REQUESTED TTY + JUMPE TAC,GETLN1 ;IF NONE, NO LINES. + SKIPLE TISYNC(DEVDAT) ;ANY TYPE-IN? + TLO LINE,LINRDY ;YES. FLAG. +GETLN1: MOVE LINE,@UUO ;GIVE IT TO USER + POPJ PDP, + +;ROUTINE TO SET LINE CHARACTERISTICS THAT ARE SETABLE + +SETLIN: MOVSI TAC,LGLSET ;MAKE MASK OF ALL OF THEM + ANDCAM TAC,LINTAB(LINE) + AND TAC,@UUO ;SET ONLY THOSE BITS USER WANTS SET + IORM TAC,LINTAB(LINE) ;SET RESULTANT + POPJ PDP, + ;ROUTINE TO ATTACH TTY TO A JOB +;CALL: MOVE DEVDAT,ADDRESS OF TTY DEVICE DATA BLOCK +; MOVE ITEM,JOB NUMBER +; PUSHJ PDP,TTYATT +; ERROR ;DEVDAT=DDB ADR OF OTHER TTY + ;IF ANOTHER ALREADY IS ATTACHED. +; OK RETURN ;DEVDAT, DAT AND TRANSLATOR TABLE SET + +;CALLED FROM COMCON (ATTACH) AND COMCSS (JOBINI) +;ON OK RETURN 1)SETS TTYATC +; 3)PUTS ADDRESS OF ATTACHED DDB INTO DEVDAT. +; 4)SETS PHYSICAL NAME TO SIXBIT /TTY LINE #/ +; OR SIXBIT /CTY/, +; 5)SETS DEVOPR IF IT IS NON-ZERO. + +INTERNAL TTYATT,TTYATI +EXTERNAL PUNIT,PJOBN,TTYTAB + +TTYATI: +INTERNAL FTATTACH +IFN FTATTACH,< +TTYATT: PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS + MOVEI DEVDAT,TTYLST ;SEARCH FOR DDB THAT IS ATTACHED + SKIPA +TTYAT2: HLRZ DEVDAT,DEVSER(DEVDAT) + JUMPE DEVDAT,TTYAT4 ;HAVE ALL TTY DDB'S BEEN LOOKED AT? + LDB TAC,PJOBN ;NO, GET JOB NUMBER. + HLL TAC,DEVMOD(DEVDAT) ;ATTACH AND USE BITS + TLNN TAC,DVTTY ;IS THIS STILL A TTY DDB? + JRST TTYAT4 ;NO. THIS MUST BE IJOB. + MOVE IOS,DEVIOS(DDB) + CAIN ITEM,(TAC) ;JOB NUMBER THE ONE TO ATTACH? + TLNN TAC,TTYATC ;YES, IS DDB ATTACHED TO JOB? + JRST TTYAT2 ;NO, KEEP LOOKING, + TLNE IOS,TTYDTC ;IS DDB DETACHED FROM LINE? + JRST TTYAT5 ;YES, OK TO ATTACH TTY OF REQUESETER TO JOB + MOVE TAC,-3(PDP) ;NO. GET TTY DEVDAT OF JOB DOING ATTACH COM. + ; AS PUSHED BY COMMAND DECODER + SKIPE TAC,DEVNAM(TAC) ;PHYSICAL NAME OF REQUESTOR TTY + CAME TAC,DEVOPR ; CHECK IF OPR IS REQUESTOR + POPJ PDP, ;NO, ERROR RETURN, CAN'T ATTACH + PUSH PDP,LINE ;YES, SAVE LINE CHARACTERISTICS + LDB LINE,PUNIT ;GET LINE NO. OF TTY BEING GRABBED + HRRZ TAC,(PDP) ;OPERATOR'S LINE NUMBER? + CAME LINE,TAC ;IS OPERATOR TRYING TO GRAB HIMSELF? + ; IF YES, DO NOT DETACH HIM + PUSHJ PDP,TTYDET ;DETACH TTY OF JOB BEING GRABBED BY OPR + POP PDP,LINE ;RESTORE LINE CHARACTERISTICS +TTYAT5: PUSH PDP,DEVDAT ;SAVE NEW DDB ADDRESS. + MOVE DEVDAT,TTYTAB(LINE) + PUSHJ PDP,TTYDET ;DETACH DDB FROM TTY + POP PDP,DEVDAT +TTYAT3: DPB ITEM,TPCJOBN ;STORE ATTACHED JOB NO. + DPB ITEM,PJOBN ;SET JOB NUMBER + MOVSI IOS,TTYDTC ;INDICATE DDB NO LONGER DET. FROM LINE + ANDCAB IOS,DEVIOS(DDB) + MOVSI TAC,TTYATC ;SET ATTACHED BIT + JRST SCNIN ;SO INITIALIZE DDB + +TTYAT4: MOVE DEVDAT,TTYTAB(LINE);RESTORE OLD DDB ADDRESS. + JRST TTYAT3 +> +IFE FTATTACH,< +TTYATT: LDB LINE,PUNIT ;LINE NO. OF THIS TTY + DPB ITEM,TPCJOBN + DPB ITEM.PJOBN + MOVSI TAC,TTYATC + JRST SCNIN> + ;ROUTINE TO SETUP AC DEVDAT TO ADDRESS OF TTY WHICH HAS TYPED A COMMAND +;AC DAT TO BYTE POINTER TO OUTPUT BUFFER FOR COMMAND MESSAGES +;AC TAC TO BYTE POINTER TO COMMAND STRING +;AC ITEM TO JOB NUMBER TTY IS ATACHED TO +;CALL: PUSHJ PDP,TTYCOM +; NONE FOUND +; AC'S SETUP +;CALLED FROM COMMAND + +INTERNAL TTYCOM,TTYCM +EXTERNAL MTTYLN,TTYTAB,CPOPJ + +TTYCOM: SKIPL LINE,LINSAV + MOVSI LINE,MTTYLN + SKIPL TAC,TTYTAB(LINE) +TTYCM1: AOBJN LINE,.-1 + MOVEM LINE,LINSAV + JUMPG LINE,CPOPJ + HRRZ DEVDAT,TTYTAB(LINE) + JUMPE DDB,TTYCM2 ;THIS SHOULDNT HAPPEN, BUT... + MOVEI DAT,TTIBUF(DDB) ;SO GETCHR CAN BE CALLED FROM COMCON + MOVE LINE,TITCTR(DDB) + DPB LINE,PCOMIC ;SAVE COMMAND INPUT COUNTER + LDB LINE,PUNIT ;LINE NO. + LDB ITEM,PJOBN ;JOB NO. TTY ATTACHED TO + TLNN TAC,200000 ;IS THIS A DELAYED COMMAND? + JRST CPOPJ1 ;NO, RETURN TO SCAN IT + MOVSI TAC,200000 ;INDICATED NO LONGER DELAYED COMMAND + ANDCAM TAC,TTYTAB(LINE) + JRST CPOPJ1 ;RETURN TO COMMAND SCAN + +TTYCM: MOVSI DDB,200000 ;INDICATE DELAYED COMMAND + IORB DDB,TTYTAB(LINE) + PUSHJ PDP,TRESCN ;BACK UP TO START OF COMMAND + MOVE LINE,LINSAV ;TRESCN HAS CALLED STLNAC + JRST TTYCM1 ;LOOK FOR OTHER COMMAND TP PROCESS + +TTYCM2: MOVSI DDB,600000 ;CLEAR COMMAND BITS IN TTYTAB + ANDCAM DDB,TTYTAB(LINE) + JRST TTYCOM ;GO TRY AGAIN + INTERNAL FTATTACH + +IFN FTATTACH,< +;ROUTINE TO DETACH TTY FROM JOB +;CALL: MOVE DEVDAT,ADDRESS OF TTY DDB TO BE DETACHED +; PUSHJ PDP,TTYDET + +;CALLED FROM TTYATT AND COMCON (DETACH) +;CLEARS TTYATC AND TRNALSATOR TABLE ENTRY. +;SETS TTYDTC IN DEVIOS(DDB) + + +INTERNAL TTYDET +EXTERNAL PUNIT,TTYTAB + +TTYDET: MOVSI TAC,TTYATC + TDNN TAC,DEVMOND(DDB) ;IS THIS DDB WORTH KEEPING? + JRST TTYDT1 ;NO. GO JUNK IT + + MOVSI IOS,TTYDTC ;YES. MARK IT DETACHED + IORM IOS,DEVIOS(DDB) + JRST TTYKL1 ;GO CLEAR TTYTAB AND DEVNAM + +TTYDT1: MOVSI IOS,TTYDTC+IO ;CLEAR SOME BITS TO FORCE KILL + ANDCAM IOS,DEVIOS(DDB) + MOVSI IOS,TOIP ;ALSO TYPEOUT IN PROGRESS + ANDCAM IOS,TTYPTR(DDB) + JRST TTYKIL ;TTYKIL WILL NOW KILL DDB +> + +INTERN TRESCN + +TRESCN: LDB TAC,PCOMIC ;GET OLD TITCTR + MOVEM TAC,TITCTR(DDB) ;RESTORE IT + PUSHJ PDP,TBYTEP + MOVEM TAC,TITAKR(DDB) +TRESC1: MOVE TAC,TIPCTR(DDB) ;CALLED HERE FROM ^U CODE + CONO PI,PIOFF + SUB TAC,TITCTR(DDB) + SKIPG TAC + ADDI TAC,TTYCHR + MOVEM TAC,TIFCTR(DDB) + CONO PI,PION + JRST STLNAC + +TRESCU: PUSHJ PDP,TRESCN + SETZM TISYNC(DDB) + MOVEI DAT,TTIBUF(DDB) +TRESCL: PUSHJ PDP,GETCHR + JUMPE CHREC,TRESCN + PUSHJ PDP,SPCHEK + JRST TRESCL + TLNE TAC,FCSBRK+BREAKB + AOS TISYNC(DDB) + JRST TRESCL + TLHBYT: XWD 350700,0 + XWD 260700,0 + XWD 170700,0 + XWD 100700,0 + XWD 010700,0 + +TBYTEP: PUSH PDP,TAC1 ;SAVE LINE + MOVNS TAC + SKIPGE TAC + ADDI TAC,TTYCHR + IDIVI TAC,5 + ADD TAC,TTIBUF(DDB) + HLL TAC,TLWBYT(TAC1) + POP PDP,TAC1 ;RESTORE LINE + POPJ PDP,0 + ;ROUTINE TO FIND TTY FOR A JOB +;CALL: MOVE ITEM,JOB NUMBER +; PUSHJ PDP, TTYFND +; RETURN WITH DEVDAT SET TO ADR OFF DDB +; AND DAT SET TO BYTE POINTER TO MONITOR OUTPUT BUFFER + +INTERNAL TTYFNU,TTYFND,TTYERP +EXTERNAL JOB + + +TTYFNU: MOVE ITEM,JOB +TTYFND: PUSHJ PDP,TTYSRC +TTYDAT: MOVEI DAT,TTOBUF(DDB) + POPJ PDP, + +;PUT JOB IN IO WAIT IF TTY BUFFER NOT EMPTY +;CALLED BY NON ERROR MESSAGE ROUTINES AT UUO LEVEL + +INTERNAL TTYFUW +EXTERNAL WSYNC + +TTYFUW: PUSHJ PDP,TTYFNU + MOVE TAC,TOPUTR(DDB) + TLNN LINE,PTYLIN + CAMN TAC,TOTAKR(DDB) + POPJ PDP, + MOVEI IOS,IOACT ;YES + IORB IOS,DEVIOS(DDB) + JRST WSYNC + +;ROUTINE TO INDICATE MONITOR ERROR MESSAGE TO BE FORCED OUT +;WHEN NO MORE ROOM IN TTO BUFFER, TTI BUFFER WILL BE USED + +TTYERP: PUSHJ PDP,TTYSRC ;FIND TTY DDB + MOVEI IOS,MERTPO ;SET MONITOR ERROR PRINT OUT BIT + IORB IOS,DEVIOS(DDB) + JRST SETBFI ;CLEAR TTI BUFFER + TTYREL: MOVEI IOS,777777-IOACT ;CLEAR INITED STUFF IN IOS + MOVSI TAC,TTYATC + TDNE TAC,DEVMOD(DDB) + JRST T0POPJ ;GO CLEAR OUT IOS BITS + +;ROUTINE TO SET SCNSER TO RETURN TTY TO VIRGIN STATE +;CALL: MOVE DDB, ADDRESS OF DEVICE DATA BLOCK +; PUSHJ PDP,TTYKIL + +;CALLED FROM COMCSS (JOBKIL). +;IF NOT OPERATOR CONSOL, THEN +; 1)CLEAR PHYSICAL AND LOGICAL NAMES, +; 2)CLEAR JOB NUMBER ASSIGNMENT +; 3)CLEAR TTYUSE,TTYATC,ASSCON,ASSPRG, +; 4)CLEAR ENTRY IN TRANSLATOR TABLE. + + + +INTERNAL TTYKIL +EXTERNAL PJOBN,PTMNMD + + +TTYKIL: MOVSI IOS,TTYIOW+IOW+TTYDTC+SYNC+DDTM+USRB + ;CLEAR TTY INPUT AND OUTPUT + ANDCAM IOS,DEVIOS(DDB) ;WAIT BITS SO TTY WILL BE KILLED + ;PROPERLY AT INTER, LEVEL IS STILL OUTPUTING + ; ALSO CLEAR DDT MODE AND SYNC FOR + ; NEXT USER OF THE DDB + MOVSI IOS,TPMON ;CLEAR JOB NUMBER + DPB IOS,PJOBN + IORB IOS,DEVIOS(DDB) ;TURN TPMON ON IN CASE TTY IS + ;STILL OUTPUTTING + PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS + TLNE LINE,PTYLIN + PUSHJ PDP,PTMNMD ;YES, PUT PTY INTO MONITOR MODE + SKIPL TTYPTR(DDB) ;CHECK TOIP + TLNE IOS,IO ;IS IT OUTPUTTING OR TALKING? + POPJ PDP, ;YES, DDB WILL BE KILLED AT + ;INTERRUPT LEVEL + HLLZS DEVIOS(DDB) ;CLEAR INITTED STUFF IN IOS + TLZ LINE,KILMSK ;CLEAR BITS IN LINE TABLE + TLNE LINE,DSDTLN ;DATAPHONE? + TLZ LINE,LGLSET ;INITIALIZE OTHER MODES + HLLM LINE,LINTAB(LINE) + SETZB TAC,DEVLOG(DEVDAT) ;CLEAR LOGICAL NAME + MOVE TAC,[XWD TTYUSR+TTYATC,ASSCON+ASSPRG] + ANDCAM TAC,DEVMOD(DEVDAT) ;CLEAR ATTACH,USE, AND ASSIGN BITS +TTYKL1: LDB LINE,PUNIT ;LINE NO. + SETZM TTYTAB(LINE) ;CLEAR TRANSLATOR TABLE + SETZM DEVNAM(DDB) + POPJ PDP,0 + ;ROUTINE TO SET TTY INTO USER MODE NOW. +;CALL: MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK +; PUSHJ PDP,TTYSET + +;CALLED FROM RUNCSS (START1) +;CLEARS DDTM,IOUPR,USRB,TTYIOW AND IOW + + +INTERNAL TTYSET + +TTYSET: MOVSI IOS,DDTM+IOSUPR+USRB+TTYIOW+IOW + JRST T0POPJ ;GO CLEAR BITS + INTERN STLNAC + +EXTERNAL JOB,MTTYLN,TTYTAB,DEVPHY,DEVOPR,ERROR + +;ROUTINE TO SEARCH TRANSLATOR TABLE FOR TTY +;CALL: MOVE ITEM,JOB NUMBER +; PUSHJ PDP,TTYSRC +; RETURN WITH ADDRESS OF DEVICE DATA BLOCK IN DEVDAT. + + +TTYSRC: JUMPE ITEM,TTYF1 ;SEARCH FOR OPER. TTY IF JOB NO. 0 + MOVSI LINE,MTTYLN ;NUMBER OF TTY DDBS +TTYSRA: HRRZ DEVDAT,TTYTAB(LINE) + JUMPE DEVDAT,TTYF0 + LDB TAC,TPCJOBN + CAIN TAC,(ITEM) + JRST TTYF9 ;FOUND +TTYF0: AOBJN LINE,TTYSRA +TTYF1: MOVSI TAC,576062 ;LOOK FOR DEVICE "OPR" + + PUSHJ PDP,DEVPHY ;SEARCH PHYSICAL DEVICE NAMES FOR OPR + SKIPA TAC,DEVOPR ;NOT FOUND. + JRST TTYF9 + JUMPN TAC,TTYF3 ;WAS OPR SPECIFIED IN ONCE ONLY CODE? + MOVEI DDR,TTYLST ;NO + SKIPE DEVNAM(DDB) ;HAS A TTY BEEN TYPED ON? + JRST TTYF9 + MOVEI LINE,TCONLN ;NO USE CTY. + HRRZ DDB,TTYTAB(LINE) ;DOES IT HAVE A DDB? + JUMPN DDB,TTYF9 ;YES. USE IT. + MOVSI TAC,(SIXBIT /CTY/) ;NO +TTYF3: PUSHJ PDP,GETDDB ;GET A DDB FOR DEVOPR + JSP DAT,ERROR ;SHOULD NEVER HAPPEN +TTYF9: MOVE IOS,DEVIOS(DDB) ;SET UP IOS +STLNAC: LDB LINE,PUNIT ;GET UNIT # FROM DDB + HLL LINE,LINTAB(LINE) ;AND LINE BITS + POPJ PDP,0 ;RETURN + ;ROUTINE TO START TTY OUTPUT AFTER CLEARING USRB + +EXTERNAL PTMNMD,PTMNMZ + +INTERNAL TTYSTC,TTYTCM + +TTYTCM: +TTYSTC: MOVSI TAC,USRB ;CLEAR BIT IN MEMORY + ANDCAM TAC,DEVIOS(DDB) + PUSHJ PDP,STLNAC + TLNE LINE,PTYLIN + PUSHJ PDP,PTMNMD + +;ROUTINE TO START TTY OUTPUT +;CALL: MOVE DAT,BYTE POINTER TO LAST OUTPUT ITEM +; MOVE DEVDAT,ADDRESS OF TTY DDB +; MOVE ITEM,JOB NUMBER ;(MUST BE PRESERVED) +; PUSHJ PDP,TTYSTR + +;CALLED FROM COMINI +;INITIALIZED TTY FOR MONITOR OUTPUT AND STARTS OUTPUT + +INTERNAL TTYSTR +EXTERNAL CLRBYT + +TTYSTR: MOVE IOS,[XWD DDTM+IOSUPR+IOBEG+IO+TPMON,IODTER+IOBKTL+IGNOR+IOACT] + ANDCAB IOS,DEVIOS(DDB) + PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS + JUMPGE LINE,TTSTR1 ;IF NOT PTY, JUMP + TLNE IOS,USRB + PUSHJ PDP,PTMNMZ +TTSTR1: MOVSI TAC,IO+TPMON + TLNE IOS,USRB ;GOING OUT OF MONITOR MODE? + TLZ TAC,TPMON ;YES + IORM TAC,DEVIOS(DDB) + MOVSI TAC,USRB+TPMON + TLNE IOS,USRB + ANDCAM TAC,DEVIOS(DDB) + MOVE IOS,DEVIOS(DDB) ;GET CORRECT IOS + SKIPLE TISYNC(DDB) ;HAS USER TYPED AHEAD? + PUSHJ PDP,COMSET ;YES, WAKE UP COMMAND DECODER(IF IN MON. MODE) + JRST UTYRET ;GO TYPE FIRST CHAR. + ;ROUTINE TO ADD TTY TO TALK RING +;CALL: ADR. OF DDB TO BE ADDED TO RING AT -3(PDP) +; MOVE TAC,SIXBIT /TTYN/ +; PUSHJ PDP,TTYTLK +; TTY IS BUSY RETURN OR NOT A TTY OR TOO BIT A LINE NO. +; OLK RETURN, TTY ADDED TO TALK RING + +INTERNAL FTTALK +IFN FTTALK,< +INTERNAL TTYTLK +EXTERNAL PUNIT,CPOPJ1 + +TTYTLK: PUSHJ PDP,GETDDB ;IN CASE NOT SET UP + POPJ PDP,0 ;NONE AVAIL. GIVE UP + MOVE TAC,DEVMOD(DEVDAT) + TLNN TAC,DVTTY + POPJ PDP, + MOVE IOS,DEVIOS(DEVDAT) ;IS TTY IN MONITOR MODE AND LEFT HAND MARGIN? + MOVE TAC1,-3(PDP) ;TTY GIVING TALK COMMAND + + MOVE TAC1,DEVNAM(TAC1) ;ITS NAME + MOVE TAC,DEVNAM(DEVDAT) ;OPR IS NEVER TOO BUSY... + CAME TAC1,DEVOPR ;EITHER ONE OPR? + CAMN TAC,DEVOPR + JRST TTYTK1 + TLNE IOS,TPMON + TLNN IOS,IOFST + POPJ PDP, ;NO, HE IS BUSY. +TTYTK1: CONO PI,SCNOFF + LDB LINE,PUNIT ;LINE NUMBER IS RING. + MOVSI TAC,TLKRNG + LDB CHREC,PTALK + TDDN TAC,LINTAB(LINE) + HRRZ CHREC,LINE + IORM TAC,LINTAB(LINE) + EXCH DDB,-3(PDP) ;GET DDB OF TALKER + LDB LINE,PUNIT ;LINE NO. OF TALKER + DPB CHREC,PTALK ;SET POINTER INTO RING + HRLI LINE,TLKRNG + IORB LINE,LINTAB(LINE) + MOVEM LINE,TAC ;SAVE LINE NO. OF TALKER + EXCH DDB,-3(PDP) ;RESTORE + LDB LINE,PUNIT ;LINE NO. IN RING AGAIN + DPB TAC,PTALK ;MADE IT POINT TO TALKER + CONO PI,SCNON + JRST CPOPJ1 ;OK RETURN +> + ;ROUTINES TO SET SCANNER TO START UP JOB WHEN OUTPUT FINISHES +;CALL: MOVE DEVDAT,TTYDDB ADR. +; PUSHJ PDP,TTYUSR +; TTY WILL GO TO USER MODE WHEN TYPING OUT STOPS + +EXTERNAL SETRUN + +INTERNAL TTYUSR + +TTYUSR: MOVSI IOS,USRB ;SET BIT TO SWITCH TTY TO USER MODE + IORM IOS,DEVIOS(DDB) ;WHEN MONITOR OUTPUT FINISHES + JRST SETRUN ;GO FLAG JOB AS RUNABLE IMMEDIATELY + ;CTY INTERRUPT SERVICE ROUTINE + +INTERNAL CTYINT +EXTERNAL SCNSAV,SCNCHN,TCONLN + +CTYINI: CONSO TTY,50 ;TTI OR TTO FLAG? + JRST CTYINT ;NO + JSR SCNSAV ;YES, SAVE AC'S + MOVEI LINE,TCONLN ;LOAD LINE WITH PROPER + CONSO TTY,40 ;YES. TTI FLAG? + JRST CTYOU1 ;NO. + DATAI TTY,CHREC + JRST RECINT ;RECEIVER INTERRUPT HANDLER + +CTYOU1: MOVEI CHREC,SCNCHN + CONO TTY,200(CHREC) ;CLEAR TTO FLAG. + JRST XMTINT ;COMMON TRANSMIT INTERRUPT HANDLER + +;SCANNER INTERRUPT SERVICE ROUTINE IS IN SEPARATE DEVICE DEPENDENT SECTION + +EXTERNAL SCNSAV,TCONLN,TTYTAB + ;COMMON RECEIVER INTERRUPT FOR ALL KEYBOARD DEVICES + +INTERNAL RECINT,INUS2,INJEST + +EXTERNAL COMCNT + +RECINT: +INUS2: ;TAG FOR INTERRUPT SERVICE +INJEXT: ;ANOTHER TAG, NOT USED, BUT WANTED BY LOSING DLSINT + + TRNN CHREC,177 ;IGNORE NULLS + POPJ PDP,0 ;DISMISS INTERRUPT + HLL LINE,LINTAB(LINE) ;GET LINE CHARACTERISTICS + HRRZ DDB,TTYTAB(LINE) ;IS THERE A DDB FOR THIS LINE? + JUMPN DDB,RECIN1 ;YES. GO NO + PUSHJ PDP,DDBSRC ;NO, FIND ONE + JRST TYPX + +RECIN1: TLNE LINE,HLFDPX ;HALF DUPLEX LINE? + JRST RECHDX ;GO SEE WHETHER INPUT OR OUTPUT +RECIN8: ;RETURN FROM RECHDX + +IFN FTTALK,< TLNE LINE,TLKRNG ;IN A TALK RING? + JRST DOTALK ;YES, GO TALK +> + MOVE IOS,DEVIOS(DDB) ;SET UP IOS +RECIN2: ANDI CHREC,177 ;7-BIT ASCII ONLY + CAIN CHREC,3 ;CONTROL C? + PUSHJ PDP,CNCTST ;YES, SEE IF 2ND CONTROL C + LDB HPOS,PHPOS ;PICK UP HORIZONTAL POSITION OF OUTPUT CHAR. + MOVEI DAT,TTIBUF(DDB) ;USER MODE INPUT BUFFER + PUSHJ PDP,TTEDIT ;GO EDIT (AND ECHO) CHARACTER + DPB HPOS,PHPOS ;STORE HORIZONTAL POSITION + HLLM LINE,LINTAB(LINE) ;UPDATE LINE TABLE + MOVE TAC,TIFCTR(DDB) ;FRE SPACES LEFT? + CAIG TAC,12 ;ONLY 10 LEFT? + JRST RWARN ;YES, GO OUTPUT XOFF + TLNN IOS,SYNC+DDTM ;WAS A BREAK CHARACTER TYPED? + JRST TYPTST ;NO, GO SEE IF ECHO NEED BE TYPED + INTERN RECIN3 ;FOR PTYSRF +RECIN3: MOVE TAC,TTYTAB(LINE) ;IS IT IN COMMAND WAIT NOW? + TLNE TAC,600000 ;.. + JRST RECIN4 ;YES. NOT AGAIN. + SKIPG TISYNC(DDB) ;HAS USER TYPED AHEAD? + PUSHJ PDP,COMSET ;NO, WAKE UP COMMAND DECORDER NOW +RECIN4: TLNE IOS,SYNC + AOS TISYNC(DDB) ;BREAK CHARACTER (BUMP LINE COUNT) + MOVSI IOS,SYNC ;CLEAR SYNC IN CORE + ANDCAB IOS,DEVIOS(DDB) ; .. + MOVE TAC,TIPCTR(DDB) ;UPDATE COUNTER FOR ^U + DPB TAC,PLSTLC + TLZN IOS,TTYIOW ;IN TELETYPE INPUT WAIT? + JRST TTYTST ;NO, GO ECHO + PUSHJ PDP,STTIOD ;YES, SET IO DONE(OUT OF TTY IOW) + MOVSI IOS,IOW+TTYIOW + ANDCAB IOS,DEVIOS(DDB) ;CLEAR WAIT BITS +TYPTST: MOVSI TAC,TOIP ;CHECK TOIP + CONO PI,PIOFF + SKIPGE TTYPTR(DDB) ;TYPEOUT HAPPENING? + JRST TYPT1 + IORM TAC,TTYPTR(DDB) ;NO, BUT THERE IS NOW + CONO PI,PION + PUSHJ PDP,STLNAC ;TAC1 CLOBBERED ABOVE BY STTIOD + JRST XMTIN1 ;START OUTPUT + +TYPT1: CONO PI,PION + POPJ PDP, + +RWARN: TLNE LINE,HLFDPX+FULTWX ;CAN LINE BE STOPPED? + JRST RECIN3 ;NO. WAKE JOB AND CROSS FINGERS. + MOVEI CHREC,23 ;YES. SEND AN XOFF. + PUSHJ PDP,PUTCHO ; .. + MOVEI CHREC,IDLECH ;AND AND IDLE FOR TTY TO THINK ON. + PUSHJ PDP,PUTCHO ;OUTPUT IT. + JRST RECIN3 ;GO WAKE JOB. + IFN FTHDPX,< + +;ROUTINE TO HANDLE HALF DUPLEX RECEIVE INTERRUPTS +;CALLED ONLY AT RCV INTERRUPT LEVEL + +EXTERN CLOCK + +RECHDX: MOVE IOS,DEVIOS(DDB) ;SETUP IOS + TRNE IOS,IGNOR ;IN AN ECHO CHECK? + POPJ PDP, ;YES, IGNORE THIS + TRZE IOS,ECHOF + JRST RECHD1 + SKIPL TTYPTR(DDB) ;SHOULD THIS BE AN ECHO? + JRST RECIN8 ;NO. ITS A RECEIVE CHARACTER + ANDI CHREC,177 ;AN ECHO. CHECK IT + LDB TAC,PLASTC ;GET WHAT WAS SENT + CAMN TAC,CHREC ;SAME? + POPJ PDP,0 ;YES, DISMISS INT. +ECHO: MOVSI TAC,TOIP + ANDCAM TAC,TTYPTR(DDB) ;TURN OFF TOIP + TLZ IOS,IO ;BAD CHARACTER, SHUT DOWN XMT. + TRO IOS,ECHOF+IGNOR ;MARK FOR THE 1/2 SEC IGNORE. + MOVEI TAC,(LINE) ;SETUP CLOCK REQUEST + LSH TAC,^D12 + TRO TAC,^D30 ;1/2 SECOND + HRLI TAC,ENDECH ;WHERE TO RESPOND TO + CONO PI,PIOFF + IDPB TAC,CLOCK ;REQUEST FROM CLOCK + CONO PI,PION + MOVEM IOS,DEVIOS(DDB) ;ONLY AT INTERRUPT LEVEL + POPJ PDP, ;DISMISS INTERRUPT + +ENDECH: MOVE DDB,TTYTAB(TAC) ;HERE ON TIMEOUT OF ECHOCHECK + MOVEI IOS,IGNOR ;KILL IGNORE INT BIT + JRST T0POPJ ;CLEAR BIT IN IOS, RETURN TO CLK + +RECHD1: ANDI CHREC,177 + CAIN CHREC,3 ;^C DURING ECHO CHECK? + DPB CHREC,TITAKR(DDB) ;YES, MAKE IT LIKE 2 OF THEM + JRST RECIN8 ;PROCESS AS INPUT +> ;END OF FTHDPX + ;ROUTINE TO TYPE X IF LINE CANNOT GET INTO SYSTEM + +TYPX: ANDI CHREC,177 + CAIN CHREC,"X" ;CHAR, RECEIVED AN "X" + POPJ PDP, ;YES, MAY BE ECHO, DISMISS INT. + MOVEI CHREC,"X" + JRST TYPL ;TYPE OUT "X" + +;ROUTINE TO WAKE UP COMMAND DECORDER IF TPMON IS SET + +COMSET: TLNN IOS,TPMON ;MONITOR MODE? + POPJ PDP, ;NO, NOT MONITOR COMMAND + MOVSI IOS,IOFST + IORB IOS,DEVIOS(DDB) + MOVSI TAC,400000 ;SET SIGN BIT + IORM TAC,TTYTAB(LINE) ;IN TTY TRANSLATOR TABLE + AOS COMCNT ;INDICATE ONE MORE COMMAND + POPJ PDP, + INTERNAL XMTINT,PTYGET + +XMTINT: HLL LINE,LINETAB(LINE) ;GET LINE CHAR. + HRRZ DDB,TTYTAB(LINE) ;GET DDB ADDRESS + JUMPE DDB,CPOPJ ;IF NONE, X BEING TYPED + MOVE IOS,DEVIOS(DDB) ;GET IO STATUS + TLNN LINE,HLFDPX ;HALF DUPLEX LINE? + JRST XMTIN1 ;NO, REGULAR TRANSMIT INTERRUPT + +PTYGET: ;CALL HERE TO SKIP ABOVE OVERHEAD + SKIPL TTYPTR(DDB) ;WAS TYPE-OUT IN PROGRESS? + POPJ PDP, ;IGNORE XMT DURING ECHO CK +XMTIN1: MOVEI DAT,TTOBUF(DDB) ;SPECIFY TTO BUFFER +XMTI1A CONO PI,PIOFF ;KEEP TOIP AND PUTR/TAKR EQUAL + HLRZ TAC,BUF(DAT) ;IS OUTPUT BUFFER EMPTY? + CAMLE TAC,FCTR(DAT) ;I.E. FREE COUNT AT MAX? + JRST XMTIN2 ;NO, TYPING STILL IN PROGRESS + + TRNE IOS,MERTPO ;MONITOR ERROR MESSAGE? + CAIE DAT,TIOBUF(DDB) ;OUTPUT BUFFER? + JRST XMTIN4 ;NO, MUST REALLY BE DONE + MOVEI DAT,TTIBUF(DDB) ;YES. NOW EMPTY OUT TTI BUFFER + JRST XMTI1A + ;HERE WHEN OUTPUT BUFFER(S) EMPTIED + +XMTIN4: MOVEI IOS,MERTPO + ANDCAB IOS,DEVIOS(DDB) + MOVSI CHREC,TOIP + ANDCAM CHREC,TTYPTR(DDB) ;CLEAR MERTPO AND TOIP + CONO PI,PION + MOVEI CHREC,0 + LDB HPOS,PJOBN ;JOB NUMBER DDB IS ATTACHED TO + TLNN IOS,IO + JRST LINDON + MOVSI IOS,IO + ANDCAB IOS,DEVIOS(DDB) + TLNE LINE,TLKRNG ;OR TALKING? + JRST LINDON ;YES + JUMPN HPOS,LINDON ;LINE DONE IF DDB IS A JOB + ;OTHERWISE, DDB ONLY USED TO TYPE A + JRST TTYKIL ;MESSAGE; KILL TTY DDB + + +XMTIN2: CONO PI,PION + PUSHJ PDP,GETCHR ;NO, GET NEXT CHAR. IN BUFFER + JUMPE CHREC,XMTIN1 ;IGNORE NULLS + JUMPL IOS,TYPE ;KEEP TYPING IF INPUT I/O WAIT + TRNN IOS,IOACT ;ARE WE IN I/O WAIT? + JRST TYPE ;NOT IN IO WAIT + MOVEI HPOS,TTYCHR-10 ;WAKE 8 CHARS BEFORE END + CAML HPOS,FCTR(DAT) ;IS THERE ROOM ENOUGH NOW? + JRST TYPE ;NO, KEEP TYPING + +LINDON: TLNE IOS,IOW ;IN IO WAIT? + TLNE IOS,TTYIOW ;YES. TTY INPUT WAIT? + JRST TYPE ;NO. GO TYPE CHAR. + PUSHJ PDP,STTIOD ;YES, SET IO DONE (OUT OF WSYNC) + PUSHJ PDP,STLNAC ;RESTORE TAC1 + MOVE IOS,[XWD IOW,IOACT] ;INDICATE NO IO ACTIVE OR WAIT + ANDCAB IOS,DEVIOS(DDB) + +TYPE: JUMPE CHREC,CPOPJ ;IS TYPING STILL TO BE IN PROGRESS? + JRST TYPL ;YES. + ;TTY KEYBOARD EDITOR ROUTINE +;UPON RECEIPT OF A CHARACTER, THIS ROUTINE DETERMINES WHAT TO DO +;WITH IT: WHETHER IT'S A SPECIAL CHARACTER NEEDING SPECIAL ECHOING, +;WHETHER SOME OTHER CHARACTER IS TO BE STORED IN ITS PLACE, WHETHER +;IT IS A BREAK CHARACTER (LINE TERMINATOR), OR WHETHER THE CHARACTER +;TYPED IS A SIGNAL TO UNDERTAKE SOME SPECIAL ACTION. +;IN ANY CASE, ALL SPECIAL ACTION, INCLUDING DUPLEXING TAKES PLACE ON +;THE LEVEL OF THIS ROUTINE. +; THIS ROUTINE CALLS SPCHEK, WHICH MAKES USE OF THE SPECIAL +;CHARACTER TABLE, SPCTAB, TO MAKE ANY CHANGES IN THE ACTION GENERATED +;BY SPECIFIC CHARACTERS MAKE THE ALTERATIONS REQUIRED BY THE +;COMMENTS DESCRIBING SPCTAB. NOTE THAT IF A CHARACTER IS TO DISPATCH +;TO A "SPECIAL ACTION ROUTINE" OR SPECIAL ECHO ROUTINE, THE LEFT +;HALF OF THE CORRESPONDING CHARACTER-WORD MUST HAVE SPACTN +;SET AND THE ADDRESS OF THE SPECIAL ROUTINE MUST BE +;ASSEMBLED INTO THE RIGHT HALF OF THE WORD. +;CALL HAVE 7-BIT ASCII CHARACTER IN CHREC +; LDB HPOS,PHPOS +; MOVEI DAT,TTIBUF(DDB) +; PUSHJ PDPD,TTEDIT +; RETURN WITH ACTION DONE, SYNC (LH IOS) SET IF BREAK CHAR. STORED + +TTEDIT: PUSHJ PDP,ADJHP ;ADJUST HP AND CHECK SPECIAL + JRST TIPACK ;NOT SPECIAL + MOVSI IOS,0 + TLNE TAC,BBREAK+FCSBRK ;BREAK CHAR? + TLO IOS,SYNC ;BREAK CHAR, SET SYNC + IORB IOS,DEVIOS(DDB) ;SET SYNC + JUMPL TAC,0(TAC) ;DISPATCH IF SPACTN SET +TIPACK: CAIGE CHREC,140 ;LOWER CASE LETTER? + JRST TTIPUT ;NO + TLNN LINE,T37 ;YES. IS THIS TTY IN 37 MODE? + TRZ CHREC,40 ;NO. MAKE CHAR UPPER CASE +TTIPUT: TLZE LINE,ROBTPD ;HAVE WE BEEN DELETING? + PUSHJ PDP,BSECHO ;YES. OUTPUT A BACKSLASH +TTIPT1: PUSHJ PDP,PUTCHI ;PUT CHAR IN INPUT BUFFER + JRST INBFUL ;IT DIDNT FIT + LTNN TAC,ECHSUP ;SHOULD THIS CHAR BE ECHOED? +DUPLEX: TLNE LINE,FULTWX,HLFDPX ;IS THIS LINE ECHOING ITSELF? + POPJ PDP,0 ;JUST RETURN WITHOUT ECHO +DUPLX1: PUSH PDP,TAC ;SAVE TAC OVER PUTCHO + TLNN IOS,TPMON ;SHOULD ECHO IF IN MONITOR MODE + TRNN IOS,NOECHO ;AND UNLESS USER SAYS NO, IN USER MODE + PUSHJ PDP,PUTCHO ;SO ECHO IT. + JRST TPOPJ ;RESTORE TAC AND RETURN + +INTERNAL INBFUB ;FOR THE PTY + +INBFUL: MOVSI IOS,SYNC ;DONT COUNT SYNC COUNT + ANDCAB IOS,DEVIOS(DDB) ; SINCE CHAR NOT STORED + CAIN CHREC,3 ;CHAR WONT FIT, WAS IT ^C? + JRST CNCTS1 ;YES. PANIC OUT OF THIS BIND + MOVEI CHREC,7 ;NO. JUST ECHO BELL TO SHOW LOSS + JRST PUTCHO ;OUTPUT BELL + ;CALLED WITH A JUMPL TAC,(TAC), WHERE TAC IS LOADED FROM SPCTAB +;SPECIAL CHARACTER HANDLING ROUTINES + +CONTC: PUSHJ PDP,DELETL ;SINCE PEOPLE WANT FREE ^U + MOVE TAC,SPCTAB+3 ;SINCE DELETL CLOBBERS TAC +CONTZ: PUSHJ PDP,CNTLEC ;OUTPUT ^C OR ^Z + PUSHJ PDP,CRLFEC ;OUTPUT A CRLF + JRST TTIPUT ;AND STORE THE 003 OR 032 + +CONTO: PUSHJ PDP,SETBF2 ;CLEAR THE OUTPUT BUFFER + MOVSI IOS,IOSUPR ;SET TO JUNK FURTHER OUTPUT + IORB IOS,DEVIOS(DDB) + JRST CONTU1 ;ECHO, ETC. +CONTU: TLNE IOS,DDTM ;IN DDTMODE, + JRST TTIPUT ; PASS THIS CHARACTER + TLZ LINE,ROBTPD ;NO MORE BACKSLASH + PUSHJ PDP,DELETL ;^U DELETES INPUT LINE +CONTU1: PUSHJ PDP,CNTLEC ;ECHO ^O OR ^U + JRST CRLFEC ;OUTPUT A CRLF AND RETURN WITHOUT + ; STORING THE ^O OR ^Z + +ALTMOD: HRRI TAC,(CHREC) ;SAVE WHICH KIND OF ALTMOD + MOVEI CHREC,44 ;ECHO A $ + TLNN IOS,TPMON + TRNN IOS,DLRSUP ;400 IN IOS REMOVES ECHO OF $ + PUSHJ PDP,AOJDPX + MOVEI CHREC,(TAC) ;RESTORE THE CHARACTER + TRNN IOS,FCS ;UNLESS FCS MODE, + MOVEI CHREC,175 ;TURN INTO OLD ALTMOD + JRST TTIPUT ;STORE THE CHARACTER + +CONTF: TLC LINE,T35+T37 ;COMPLEMENT T37 ON ^F +CONTP: TLCA LINE,T35 ;COMPLEMENT T35 ON ^P +CONTB: TLC LINE,FULTWX ;COMPLEMENT FULTWX ON ^B + POPJ PDP,0 ;AND RETURN WITHOUT STORING THESE + +CONTQ: TLOA LINE,XON ;PAPER TAPE MODE +CONTS: TLZ LINE,XON ;NOT PAPER TAPE + JRST TTIPUT ;DO STORE THESE FOR CUSP + CONTH: TLNE LINE,T37 ;BACKSPACE + JRST TTIPUT ;JUST PASS TO PROG IF 37 TTY +RUBOUT: TLNN LINE,XON + JRST RUBOU3 +RUBOU4: MOVSI IOS,SYNC ;IF PAPER TAPE, NO BREAK + JRST T0POPJ ;OR STORE, RETURN. +RUBOU3: TLNE IOS,TPMON ;IN MONITOR MODE, NOT A BREAK CHAR + JRST RUBOU2 + TDNE IOS,[XWD DDTM,FCS] + JRST TTIPT1 ;STORE RUBOUT IF DDT OR FCS +RUBOU2: PUSHJ PDP,RUBOU4 ;NOT A BREAK AFTER ALL + LDB CHREC,PUTR(DAT) ;GET LAST CHAR IN + PUSHJ PDP,DCPUTR ;BACK UP TIPUTR + JRST RUBOU1 ;IT'S EMPTY ALREADY + TLON LINE,ROBTPD ;MARK IN RUBOUT SEQUENCE + PUSHJ PDP,BSECHO ;AND OUTPUT BACKSLASH IF FIRST +AOJDPX: AOJA HPOS,DUPLX1 ;OUTPUT AND COUNT HPOS + +RUBOU1: TLZE LINE,ROBTPD ;END OF INPUT STREAM REACHED + + PUSHJ PDP,BSECHO ;OUTPUT A BACKSLASH + JRST CRLFEC ;AND A CR LF + +CONTK: HRRI TAC,4 ;HERE ON V TAB + SKIPA +CONTL: HRRI TAC,10 ;HERE ON FORMFEED + TLNN LINE,T35 ;THIS TTY HAVE VERT MECHANICS? + JRST SIMFF ;NO, SIMULATE IT + PUSHJ PDP,TTIPUT ;PUT CHAR IN BUFFER AND ECHO IT +CONTI1: MOVEI CHREC,IDLECH ;SYNCHRONOUS IDLE CHARACTERS +SIMFF1: PUSHJ PDP,DUPLX1 ;OUTPUT ECHO OF LF OR IDL + TRNE TAC,17 ;DONE YET? + SOJA TAC,.-2 ;NO. OUTPUT MORE + POPJ PDP,0 ;DONE + SIMFF: TLO TAC,ECHSUP ;DON'T OUTPUT FF OR VT TO A 33 + PUSHJ PDP,TTIPUT ;PUT IT IN BUFFER + MOVEI CHREC,12 ;SIMULATE WITH LF'S + JRST SIMFF1 + +CONTI: TLNN LINE,T35 + TLO TAC,ECHSUP ;DONT OUTPUT TAB TO 33 + PUSHJ PDP,TTIPUT ;PUT IN BUFFER AND MAYBE ECHO + TLEN LINE,XON+DISLIN ;IF PAPER TAPE,DISMISS + POPJ PDP,0 ; SO AS NOT TO OVERFILL OUTBUF + ;ALSO, DISPLAY DOESNT WANT FILLER + HRRI TAC,1 ;TWO IDLES + TLNE LINE,T35 + JRST CONTI1 ;GO SEND SLUFFS + +CONTI2: MOVEI CHREC,40 ;SPACES FOR THE 33'S + LDB HPOS,PHPOS ;WHERE WAS I BEFORE TAB? + PUSHJ PDP,AOJDPX ;OUTPUT A SPACE + TRNE HPOS,7 ;AT A TAB STOP? + JRST .-2 ;NO. MORE SPACES. + POPJ PDP,0 ;RETURN FROM TTEDIT + CRLFEC: MOVEI HPOS,0 ;ECHO A CR LF, SAVING CHREC + PUSH PDP,CHREC + MOVEI CHREC,15 ;CARRIAGE RETURN + PUSHJ PDP,DUPLX1 ;OUTPUT IT + MOVEI CHREC,12 ;LINE FEED + PUSHJ PDP,DUPLX1 ;OUTPUT THAT TOO +CHPOPJ: POP PDP,CHREC ;RESTORE CHREC + POPJ PDP,0 + +CNTLEC: HRRI TAC,100(CHREC) ;SAVE UN-CNTL CHARACTER + MOVEI CHREC,"^" + PUSHJ PDP,AOJDPX + MOVEI CHREC,(TAC) ;TYPE ^ CHAR + PUSHJ PDP,AOJDPX + TRZ CHREC,100 ;RESTORE IT TO A CNTL CHAR + POPJ PDP,0 + +CRLF: MOVEI HPOS,0 ;HERE ON INPUT OF A CARRIAGE RETURN + TLNE LINE,XON ;IF PAPER TAPE, NO FREE LF + + JRST TTIPUT ;JUST STORE THE CR + PUSHJ PDP,TTIPUT ;ORDINARILY, STORE AND GO ON HERE + MOVEI CHREC,12 ;BY ADDING A LF + MOVSI IOS,SYNC ;WHICH IS A BREAK CHARACTER + IORB IOS,DEVIOS(DDB) + TLNN LINE,FULTWX+HLFDPX ;IF NOT SELF ECHOING. + JRST TTIPUT ;THIS WILL GIVE LF ECHO + PUSHJ PDP,TTIPUT ;OTHERWISE, THIS WONT + JRST DUPLX1 ;BUT THIS WILL + INTERN FTLOGIN + +INTERN CNCTST + +CNCTST: +IFN FTLOGIN,< EXTERN JBTSTS + + LDB TAC,PJOBN + MOVE TAC,JBTSTS(TAC) + TLNE TAC,JACCT + MOVEI CHREC,175 +> + LDB TAC,TIPUTR(DDB) + CAIE TAC,3 + POPJ PDP, +CNCTS1: PUSHJ PDP,TSETBF ;STOP ALL I/O, BY CLEARING BUFFERS + MOVEI DAT,TTIBUF(DDB) ;GET POINTER BACK TO INPUT BFR + MOVE TAC,SPCTAB+3 ;AND BITS FOR CONTROL C + + +CNCMOD: MOVE IOS,[XWD DDTM+IO+IOSUPR+USRB,MERTPO+ECHOF+IGNOR] + ANDCAM IOS,DEVIOS(DDB) + MOVSI IOS,TPMON+IOFST + IORB IOS,DEVIOS(DDB) + TLNE LINE,PTYLIN ;* + PUSHJ PDP,PTMNMD ;* + POPJ PDP, + ;ROUTINE TO ECHO BACK-SLASH + +BSECHO: PUSH PDP,CHREC ;* + MOVEI CHREC,"\" + PUSHJ PDP,AOJDPX + JRST CHPOPJ + +;ROUTINE TO DECREMENT PUTR + +INTERN DCPUTR + +DCPUTR: LDB TAC,PLSTLC ;CHECK FOR NONE TO DELETE + CAMN TAC,PCTR(DAT) + POPJ PDP, + + MOVSI TAC,70000 + ADD TAC,PUTR(DAT) ;* + TLNE TAC,400000 + ADD TAC,[XWD 347777,-1] + + MOVEM TAC,PUTR(DAT) + AOS FCTR(DAT) + AOS TAC,PCTR(DAT) + CAIG TAC,TTYCHR ;* + JRST CPOPJ1 ;* + SUBI TAC,TTYCHR ;* + MOVEM TAC,PCTR(DAT) + MOVEI TAC,STTYBF + ADDM TAC,PUTR(DAT) ;* + JRST CPOPJ1 + +;ROUTINE TO DELETE CURRENT LINE (^U) + +DELETL: LDB TAC,PLSTLC ;WAS THERE LAST BREAK? + MOVEM TAC,TIPCTR(DDB) ;STORE COUNT + PUSHJ PDP,TBYTEP ;CONVERT TO A BYTE POINTER + MOVEM TAC,TIPUTR(DDB) ;SAVE POINTER + JRST TRESC1 ;GO COMPUTE TIFCTR + IFN FTTALK,< +EXTERNAL TPOPJ +DOTALK: ANDI CHREC,177 + HRRZ DDB,TTYTAB(LINE) + JUMPE DDB,CPOPJ ;NO SUCH LINE + CAIN CHREC,3 + JRST NOTALK + PUSH PDP,LINE +DOTAL1: LDB LINE,PTALK + HLL LINE,LINTAB(LINE) + HRRZ DDB,TTYTAB(LINE) + JUMPE DDB,DOTAL2 + PUSH PDP,CHREC + CAMN LINE,-1(PDP) + TLNN LINE,FULTWX+HLFDPX + PUSHJ PDP,PUTCHO + MOVE IOS,DEVIOS(DEVDAT) + PUSHJ PDP,TYPTST + POP PDP,CHREC +DOTAL2: CAME LINE,0(PDP) + JRST DOTAL1 + JRST TPOPJ + +;IF I TYPE A ^C IN TALK RING, THEN +;ASSUME NEXT_ME_PREV +;SET NEXT_PREV +;IF NEXT=PREV, CLEAR ITS TLKRNG BIT +;SET ME_ME +;CLEAR TLKRNG BIT IN LINTAB(ME) + +NOTALK: MOVEI HPOS,0(LINE) ;ME + LDB CHREC,PTALK ;NEXT +NOTAL1: LDB TAC,PTALK + CAMN TAC,HPOS ;ME_? + JRST NOTAL2 ;YES. LINE=PREV + MOVE LINE,TAC ;NO. FIND PREV + JRST NOTAL1 +NOTAL2: DPB CHREC,PTALK ;MAKE NEXT_PREV + CAIE CHREC,(LINE) ;RING NOW EMPTY? + JRST NOTAL3 ;NO + MOVSI CHREC,TLKRNG ;YES, CLR HIS BIT + ANDCAM CHREC,LINTAB(LINE) +NOTAL3: MOVSI CHREC,TLKRNG + MOVE LINE,HPOS ;ME + DPB HPOS,PTALK ;ME_ME + ANDCAM CHREC,LINTAB(LINE) ;CLR MY BIT + MOVEI CHREC,3 ;GET A ^C AGAIN + DPB CHREC,TIPUTR(DDB) ;LOOK LIKE 2 OF THEM + JRST RECINT ;AND PROCESS IT FROM THE TOP +> + ;ROUTINE TO TYPE CHAR +;CALL MOVE LINE,LINE NO. +; MOVE CHREC,CHARACTER +; PUSHJ PDP,TYP + +INTERNAL TYPL +EXTERNAL TCONLN,SCNTYP,PEVEN8 + +TYP: +TYPL: TLNE LINE,PTYLIN + POPJ PDP, ;YES + PUSHJ PDP,PEVEN8 ;GENERATE CORRECT PARITY + TLNE LINE,CTYLIN ;NO,CONSOLE TTY? + JRST SCNTYP ;TYPE CHAR. +CTYP: DATAO TTY,CHREC + DPB CHREC,PLASTC + POPJ PDP, + ;ROUTINE TO SETUP DDB FOR OUTPUT +;CALL MOVE TAC,[SIXBIT /TTY#/ +; PUSHJ PDP,GETDDB +; NONE AVAILABLE RETURN +; RETURN WITH LINE AND DDB SETUP + +EXTERNAL TCONLN,CPOPJ,CPOPJ1,TPOPJ1 + +INTERNAL GETDDB + +GETDDB: MOVEI LINE,TCONLN + CAMN TAC,[SIXBIT /CTY/] ;CTY? + JRST GETDB1 ;YES + HLLZ LINE,TAC ;NO + CAME LINE,[SIXBIT /TTY/] ;TTY PREFIX? + POPJ PDP, ;NO + TLZ TAC,-1 ;YES + JUMPE TAC,CPOPJ ;TTY? + ROTC TAC,30 ;NO + TRZE LINE,20 ;IS FIRST SUFFIX AN OCTA;L DIGIT? + TRNE LINE,70 + POPJ PDP, ;NO + ROT TAC,3 ;YES + TRC TAC,2 ;IS THERE A 2ND SUFFIX THAT IS AN + TRNN TAC,7 ;OCTAL DIGIT? + ROTC TAC,3 ;YES + CAIL LINE,TCONLN ;LEGAL LINE NUMBER? + POPJ PDP, ;NO +GETDB1: HRRZ DDB,TTYTAB(LINE) ;DOES THIS LINE HAVE A DDB? + JUMPN DDB,CPOPJ1 ;JUMP IF SO. + PUSHJ PDP,DDBSRC ;NO. SEARCH FOR FREE DDB + POPJ PDP, ;NONE AVAILABLE + HLLZM IOS,DEVIOS(DDB) ;INITIALIZE STATE + PUSH PDP,DEVNAM(DDB) + MOVEI TAC,ASSCON+ASSPRG + ANDCAM TAC,DEVMOD(DDB) + JRST TPOPJ1 + ;ROUTINE TO SEARCH FOR FREE TTY DEV DATA BLOCK +;CALL: MOVE LINE,TTY LINE NO. +; PUSHJ PDP,DDBSRC +; NONE FOUND OR LINE NO, TOO BIG +; RETURN DEVDAT,LINE AND DEVNAME SET AND BITS TPMON,IOFST,IOACT, +; TTYUSE,ASSCON SET. + +EXTERNAL TTPLEN,MLTTYL,CPOPJ +INTERNAL DDBSRC + +DDBSRC: HRRZ TAC,LINE ;NUMBER OF LINE ONLY + CAILE TAC,TTPLEN ;IS LINE NO. TOO BIG + POPJ PDP, ;YES. + MOVSI IOS,MLTTYL ;NO. OF TTY DDBS + MOVEI DEVDAT,TTYLST ;ADDRESS OF FIRST TTY DDB + SKIPA TAC,[XWD TTYUSE+TTYATC,ASSPRG+ASSCON] + HLRZ DEVDAT,DEVSER(DEVDAT) ;CHAIN THRU DDBS + TDNE TAC,DEVMOD(DEVDAT) ;USE,ATTACH OR ASSIGN BITS ON? + AOBJN IOS,.-2 ;YES. DONE? + + JUMPGE IOS,CPOPJ ;YES. DEVICE DATA BLOCK FOUND? + MOVSI TAC,TOIP ;CLEAR TOIP IN DDB + ANDCAM TAC,TTYPTR(DDB) ;IN CASE OF PREVIOUS DETACH + MOVSI TAC,PROG + MOVEM TAC,DEVIAD(DDB) ;CLEARS PHPOS + MOVEM TAC,DEVOAD(DDB) ;CLEARS PFITCH + MOVE IOS,[XWD TPMON+IOFST,IOACT] + PUSH PDP,DAT + PUSHJ PDP,TSETBF ;INITIALIZE BUFFERS + POP PDP,DAT + MOVE TAC,[XWD TTYUSE,ASSCON];INITIALIZE DATA BLOCK. + +;FALL INTO SCNIN + ;INITIALIZE TTY DEVICE DATA BLOCK(CALLED FROM TTYATT TOO) +;CALL: MOVE TAC,BITS IN DEVMOD TO BE TURNED ON +; MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK +; PUSHJ PDP,SCNIN +; SKIP RETURN ALWAYS + +; CALLED BY JRST FROM TTYATT +; AND FALLS IN FROM DDBSRC ABOVE + +;SETS PHYSICAL NAME TO SIXBIT /TTY#/ OR SIXBIT /CTY/ +; WHERE # IS THE LINE NUMBER. +;STORES LINE NUMBER IN DEVICE DATA BLOCK + +EXTERNAL PUNIT,TTYTAB,TCONLN,CPOPJ1 + +SCNIN: IORM TAC,DEVMOD(DEVDAT) + DPB LINE,PUNIT ;SET LINE NO. IN DDB. + +INTERNAL FTTALK +IFN FTTALK,< + DPB LINE,PTALK ;SETUP TALK RING TO CONTAIN + ;ONLY THIS TTY. +> + MOVSI TAC,646471 ;SIXBIT /TTY/ + MOVEM TAC,DEVNAM(DEVDAT) + MOVE TAC,[POINT 6,DEVNAM(DEVDAT),17] + TRNN LINE,70 ;IS THERE A HIGH ORDER OCTAL DIGIT? + JRST SCNIN0 ;NO + ROT LINE,-3 ;YES, CONVERT TO SIXBIT. + ADDI LINE,20 + IDPB LINE,TAC ;STORE HIGH ORDER SIXBIT DIGIT + TRZ LINE,-1 ;LOW ORDER DIGIT IN LINE + ROT LINE,3 +SCNIN0: ADDI LINE,20 + IDPB LINE,TAC ;STORE LOW ORDER DIGIT + PUSHJ PDP,STLNAC + HRRM DEVDAT,TTYTAB(LINE) ;SET DDB ADR. IN TRANSLATOR TABLE. + MOVSI TAC,436471 ;SIXBIT /CTY/ + TLNE LINE,CTYLIN ;IS THIS CONSOLE TTY? + MOVEM TAC,DEVNAM(DEVDAT);YES, SET NAME TO CTY. + TLNE LINE,PTYLIN ;IS THIS A PTY? + PUSHJ PDP,PTMNND ;YES. SET IT INTO MONITOR MODE + JRST CPOPJ1 ;SUCCESSFUL RETURN. + SCNEND: END + diff --git a/src/uuocon.mac b/src/uuocon.mac new file mode 100644 index 0000000..64be9e1 --- /dev/null +++ b/src/uuocon.mac @@ -0,0 +1,2510 @@ + +TITLE UUOCON - UUO HANDLER AND UUO+IO ROUTINES - V434 +SUBTTL /RCC TS 03 JUN 69 +XP VUUOCN,434 ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB + + ENTRY UUOCON ;ALWAYS LOAD UUOCON(IF LIB SEARCH) +UUOCON: + +;THIS ROUTINE COMBINES THE OLD SYSCON,SYSCSS, AND IOCONT ROUTINES +;IT CONSISTS OF THE UUO TRAP HANDLER +;THE CALL UUO ROUTINES AND THE IO UUO ROUTINES +;SOME UUO DO DISPATCH TO OTHER ROUTINES OUTSIDE OF UUOCON +, ALL UUOS DROP THEMSELVES IN REAL LOCATION 40, AND TRAP +, TO 41. THE UUO HANDLER SHUFFLES THE UUO OFF TO THE USER'S +, 40,41, IF IT IS NOT A SYSTEM UUO. +;SYSTEM UUOS(40-77) FIRST SAVE THE USERS ACS IN RELATIVE LOC 0-17 +;THEN THE FOLLOWING ACS ARE LOADED UP BEFORE DISPATCHING: +; PDP ;PUSHDOWN LIST IN CURRENT JOB DATA AREA +; PROG ;CURRENT JOB RELOCATION IN RH,PROTECTION IN LH +; JDAT ;ADDRESS OF CURRENT JOB DATA AREA +; UUO ;THE CONTENTS OF LOC 40 WITH PROG IN INDEX FIELD +; ;SO THAT RELOCATION CAN BE DONE FOR PICKING UP ARGUMENTS + ; EXCEPT THAT ON A CALL OR CALLI UUO, THE ADDRESS IS + ; MODIFIED TO BE THE AC OF THE UUO,FOR + ; PICKING UP ARGUMENTS. +; DEVDAT ;ADR. OF DEVICE DATA BLOCK +; IOS ;DEVICE IO STATUS WORD +; DSER ;ADR. OF DEVICE SERVICE ROUT. DISPATCH TABLE +; UCHN ;THE USER IO CHANNEL(AC FIELD) OF UUO + +;RETURN IS PUSHED ON END OF PD LIST +;THEN IF CALL WAS FROM USER MODE, THE UUO ROUTINE IS CALLED +;WITH A PUSHJ, SO THAT ALL UUO ROUTINE RETURN WITH A POPJ PDP, +;WHICH WILL RETURN CONTROL TO UUOCON WHICH WILL RESTORE USERS +;ACS AND RETURN TO HIM +;IF THE CALL IS FROM EXEC MODE, THE UUO ROUTINE IS CALLED +;BY DOING JUST A JRST, WHEN THE UUO ROUTINE RETURNS WITH +;A POPJ, IT WILL RETURN TO THE EXEC WITHOUT RESTORING +;ANY ACS +, CONTROL MAY ALWAYS BE RETURNED BY EXECUTING A +; POPJ PDP, +, WHICH WILL RESTORE THE ACS, APR BITS, AND RETURN. +, THE UUO HANDLER IS PURE IF THE FOLLOWING RESTRICTIONS ARE OBSERVED. +, RESTRICTIONS: UUOS CANNOT BE CALLED BY INTERRUPT SERVICE ROUTINES. + ;HERE ON UUO FROM USER +;USER AC 17 ALREADY SAVED IN LOC USRSAV(SEE COMMON) +;AC 17 CONTAINS ADR OF JOB(JOBADR) +;SAVE HIS ACS ON REL. LOC 0-17 + +;TO UUOSY1 IF UUO FROM EXEC MODE (AC 17 GUARRANTEED NOT TO BE EQUAL TO AC PROG) + +INTERNAL UUOUSR,UUOSY1,USRXIT +EXTERN FORTY,SIXTY +EXTERN ADRERR,CORUUO,DEVHNG,GETWRD,HOLD,ILLINS +EXTERN ILLMOD,IOIERR,JOBKL,JOBSAV,PHOLD,REASSI,SETAPR +EXTERN STWAIT,UGTSEG,URUN,USCHED,UUOERR +EXTERN WAIT1,WSYNC +EXTERNAL USRSAV,JOBPDL,MJOBPD,PUUOAC,USRJDA +EXTERNAL USRHCU,JOB,JBTSTS,TIMEF +EXTERNAL JOBDAT,JOBAC,UUO0,FORTY + +UUOUSR: MOVEM 16,16(17) ;STORE AC16 IN USER 16 + MOVEI 16,(17) ;SET UP BLT POINTER + BLT 16,15(17) ;MOVE REAL AC'S TO USER AREA + MOVE TAC,USRSAV ;MOVE USER 17 TO USER'S AREA + MOVEM TAC,17(17) + MOVE PROG,17 ;LOAD UP POINTER TO USER PROGRAM AREA +IFN JDAT-PROG,< + MOVE JDAT,JOBDAT ;ADDRESS OF JOB DATA AREA +> + MOVSI PDP,MJOBPD ;LOAD UP PUSH DOWN AC AND + HRRI PDP,JOBPDL(JDAT) ;MAKE ABSOLUTE RATHER THAN RELATIVE +UUOSY1: PUSH PDP,UUO0 ;SAVE RETURN ON PUSH DOWN LIST + MOVE UUO,FORTY ;GET THE UUO INTO AC(UUO) + TLNN UUO,740000 ;SYSTEM UUO? +ILEGAL: JRST UUOERR ;NO, 0-37 ARE ILLEGAL,PRINT ERROR + TLO UUO,PROG ;SET FOR RELOCATION + LDB TAC1,[POINT 9,UUO,8];PICK UP UUO OP CODE + CAIL TAC1,100 ;ILLEGAL INSTRUCTION? + JRST ILLINS ;YES, STOP JOB AND PRINT ERROR + LDB UCHN,PUUOAC ;SETUP USER DEVICE CHANNEL NUMBER + SKIPE DEVDAT,USRJDA(UCHN) ;GET ADRESS OF DEVICE DATA BLOCK + CAMLE UCHN,USRHCU ;IS IT LESS THAN OR EQUAL TO HIGHEST + ; USER IO CHANNEL IN USE FOR CURRENT JOB? + JRST NOCHAN ;CHANNEL NOT ASSIGNED + MOVE IOS,DEVIOS(DEVDAT) ;GET DATA BLOCK STATUS WORD + MOVE DSER,DEVSER(DEVDAT);SETUP IO SERVICE DISPATCH + ; TABLE ADDRESS + CAIL TAC1,LNGUUO ;LONG DISPATCH TABLE UUO? + JRST DISP1 ;YES +DISP0: ROT TAC1,-1 ;DIVIDE UUO OPCODE BY 2, SAVE REMAINDER + MOVE DAT,UUOTAB-20(TAC1);GET DISPATCH TABLE ENTRY +DISP2: TLNN TAC1,400000 ;WAS UUO ODD? + MOVS DAT,DAT ;NO, USE LH OF DISPATCH ENTRY + CAME PROG,17 ;UUO FROM SYSTEM? + JRST (DAT) ;YES, RETURN ADDRESS ALREADY ON PD + ; LIST. AVOID RESTORING USER + ; ACS ON RETURN TO SYSTEM. + ;DISPATCH TO UUO ROUTINE +;THE FOLLOWING CODE IS EXECUTED ON ALL RETURN TO USER PROGRAMS +;BUT IS NEVER EXECUTED ON RETURNS FROM EXEC UUOS(SAVGET) + + PUSHJ PDP,(DAT) ;NO, FROM USER. ALL + ; UUO ROUTINES RETURN WITH POPJ + JRST USRXIT ;NO SKIP RETURN TO USER +USRXT1: AOS (PDP) ;SKIP RETURN TO USER +USRXIT: MOVE ITEM,JOB ;CURRENT JOB NUMBER + MOVE TAC,JBTSTS(ITEM) + JUMPG TAC,USRXT2 ;HAS A CONTROL C BEEN EXECUTED? + TLNN TAC,STOPIO ;TRYING TO STOP IO? + SKIPE TIMEF ;NO. HAS CLOCK TICKED WHILE IN MONITOR? +USRXT2: PUSHJ PDP,USCHED ;YES, GO CALL SCHEDULER + POP PDP,UUO0 ;USER RETURN ADDRESS + MOVSI 17,JOBAC(PROG) ;RESTORE ALL USER ACS + BLT 17,17 + JEN @UUO0 ;RESTORE FLAGS AND RETURN TO USER + ; DISMISS INTERRUPT ONLY ON TRPJEN UUO + ; IN ALL OTHER CASES NO INTERRUPTS + ; IN PROGRESS + +NOCHAN:NOCHAN: CAMN PROG,17 ;UUO FROM USER? + ;IF FROM EXEC, PROBABLY SAVEGET WHICH SETS USRCHN NEG. IN LH + CAIGE TAC1,IOUUO ;YES, IS THIS AN IO UUO? + JRST DISP0 ;NO, GO DISPATCH + CAIE TAC1,70 ;YES,IS IT CLOSE OR RELEASE? + CAIN TAC1,71 ;CLOSE AND RELEASE ALWAYS LEGAL EVEN THOUGH NO DEVICE ASSIGNED + JRST USRXIT + JRST IOIERR ;NO, PRINT IO TO UNASSIGNED CHANNEL + ; AND STOP JOB + +DISP1: MOVE TAC,DEVMOD(DEVDAT) ;LONG DISPATCH TABLE UUO + TLNE TAC,DVLNG ;DOES THIS DEVICE HAVE A LONG + ; DISPATCH TABLE? + JRST DISP0 ;YES, DISPATCH + CAIGE TAC1,76 ;NO, IS UUO LOOKUP OR ENTER? + JRST USRXIT ;NO, RETURN TO USER + JRST USRXT1 ;YES, SKIP RETURN TO USER + +;TABLE OF UUO DISPATCH ADDRESSES +;IN FORMAT: +; XWD 40,41 +; XWD 42,43 +; . +; XWD 76,77 + + + +UUOTAB: XWD UCALL,UINIT ;(40,41)CALL,INIT + XWD UUOERR,UUOERR ;(42,43)FIVE UUOS FOR EACH INSTALLATION + XWD UUOERR,UUOERR ;(44,45)TO DEFINE AS THEY SEE FIT + XWD UUOERR,UCALLI ;(46,47),CALLI +IFN FTTTYSER,< +EXTERN TTYUUO + XWD UOPEN,TTYUUO ;(50,51)OPEN, TTCALL +> +IFE FTTTYSER,< + XWD UOPEN,CPOPJ ;(50,51)OPEN, NO-OP FOR TTCALL +> + XWD ILEGAL,ILEGAL ;(52,53) + XWD ILEGAL,URENAM ;(54,55),RENAME +XP IOUUO,55 ;LOWEST IO UUO(RENAME) + XWD TIN,TOUT ;(56,57)IN,OUT + XWD SETIOS,USTATO ;(60,61)SETSTS,STATO + XWD USTATS,USTATZ ;(62,63)GETSTS,STATZ + XWD UINBF,UOUTBF ;(64,65)INBUF,OUTBUF + XWD IN,UOUT ;(66,67)INPUT,OUTPUT + XWD CLOSE1,RELEA1 ;(70,71)CLOSE,RELEASE +XP LNGUUO,72 ;LOWEST LING DISPATCH TABLE UUO + XWD UMTAPE,UDGF ;(72,73)MTAPE,GETF + XWD UDSI,UDSO ;(74,75)SETI,SETO + XWD UDLK,UDEN ;(76,77)LOOKUP,ENTER + +;UUOS 42, 43, 44, 45, AND 46 ARE FOR CUSTOMERS TO DEFINE AS THEY PLEASE +;UUOS 40, 41 AND 47 THROUGH 77 ARE DEFINED BY DIGITAL +;UUOS 51,52,53 AND 54 ARE RESERVED FOR EXPANSION BY DIGITAL + , CALLING SEQUENCE +, CALL D,[SIXBIT/NAME/] +, WHERE NAME IS THE NAME OF A SYSTEM ROUTINE. +, IF NO SYSTEM ROUTINE WITH THE SPECIFIED NAME IF FOUND, THIS ROUTINE +, EXITS TO UUOERR. +;CONTENTS OF USER AC PLACED IN AC TAC,UUO SET TO POINT +;TO USER AC, PROG IN LH. +;ITEM SET TO JOB NUMBER + +EXTERNAL JOB + +UCALL: PUSHJ PDP,GETWDU ;SET TAC FROM CONTENTS OF EFFECTIVE ADDRESS OF + ; UUO FROM EITHER HIGH OR LOW SEG + ; DO NOT RETURN IF ERROR + ; SET ITEM TO CURRENT JOB NO. + MOVSI TAC1,-UCLLEN-CCLLEN-1 ;-SUM OF LENGTHS OF SIXBIT TABLES, + ; -1 FOR THE CARRY TO LH IN AOBJN + HRRI TAC1,-CCLLEN ;- LENGTH OF CUSTOMER TABLE + CAME TAC,UCLTAB(TAC1) ;SEARCH SYSTEM ROUTINE NAME TABLE + AOBJN TAC1,.-1 + HRRM TAC1,UUO ;STORE INDEX IN UUO, JUST AS IF USER HAD DONE CALLI UUO + + +;CALLI UUO - CALL IMMEDIATE +;CALLI D,E +;WHERE E IS RELATIVE INDEX IN CALL TABLE + +INTERNAL UCALLI + +UCALLI: HRRE TAC1,UUO ;GET CALLI NUMBER (POS. = DIGITAL, NEG. = CUSTOMER DEFINED) + CAML TAC1,[-CCLLEN] ;MORE NEGATIVE THAN MOST NEGATIVE CUSTOMER DEFINED UUO? + CAIL TAC1,UCLLEN ;MORE POSITIVE THAT DIGITAL DEFINED UUO? + POPJ PDP, ;YES, RETURN TO USER TREAT AS NO-OP SO + ; PROGRAMS AHEAD OF MONITOR WILL STILL + ; RUN WITHOUT ERROR MESSAGE + CAMN PROG,17 ;NO, WAS UUO FROM MONITOR? + POP PDP,TAC ;REMOVE RETURN + HRR UUO,UCHN ;UUO AC FIELD + MOVE TAC,@UUO ;PICK UP CONTENTS OF USER AC + ROT TAC1,-1 ;DEVIDE BY 2 AND SAVE REMAINDER + MOVE DAT,UCLJMP(TAC1) ;GET DISPACTH TABLE ENTRY + MOVE ITEM,JOB ;SETUP CURRENT JOB NUMBER(IN CASE THIS IS CALLI) + JRST DISP2 ;AND GO DISPATCH + +;CALL UUO DISPATCH TABLE +;NEW UUO'S MUST BE ADDED AT END SINCE CALLI DEPENDS ON +;POSITION IN TABLE, CUSTOMERS SHOULD ADD UUO'S IN CNAMES MACRO SO CALLI ADDRESS +;WILL BE NEGATIVE. IN THIS WAY BOTH DIGITAL AND ITS CUSTOMERS CAN ADD UUO'S +;WITHOUT CONFLICT, DIGITAL GOING POSITIVE, CUSTOMERS GOING NEGATIVE. +; (ALSO, TOWARD TOP OF PAGE) + +;ALSO EXTERNALS MUST BE IN RH(IE ODD CALLI INDECIES) + +EXTERNAL DDTIN,DDTOUT,CPOPJ + +DEFINE CNAMES < + X CPOPJ,CPOPJ ;(-3) PLACE FOR CUSTOMERS TO PATCH UUOS + X CPOPJ,CPOPJ ;(-2) + X LIGHTS,LIGHTS ;(-1) SET LIGHTS (EXAMPLE OF CUSTOMER DEFINED UUO) +> + +DEFINE NAMES,< + X RESET,RESET ;(0)RESET IO + X DDTIN,DDTIN ;(1)EXT-GET DDT CHAR. + X SETDDT,SETDDT ;(2)SETDDT LOC IN PROTECTED JOB DATA + X DDTOUT,DDTOUT ;(3)EXT:SEND DDT CHAR. + X DEVCHR,DVCHR ;(4)DEVICE CHARACTISTICS + X DDTGT,CPOPJ ;(5)GET DDT MODE + X GETCHR,DVCHR ;(6)DEVICE CHAR.(DIFF. NAME) + X DDTRL,CPOPJ ;(7)RELEASE DDT MODE + X WAIT,WAIT ;(10)WAIT TILL DEVICE INACTIVE + X CORE,CORUUO ;(11)CORE UUO + X EXIT,EXIT ;(12)EXIT + X UTPCLR,UTPCLR ;(13)CLEAR DEC TAPE DIRECTORY + X DATE,DATE ;(14)GET DATE + X LOGIN,LOGIN ;(15)LOGIN + X APRENB,APRENB ;(16)ENABLE APR FOR TRAPPING + X LOGOUT,LOGOUT ;(17)LOGOUT + X SWITCH,SWITCH ;(20)RETURN DATA SWITCHES + X REASSIGN,REASSIGN ;(21)REASSIGN DEVICE TO ANOTHER JOB + X TIMER,TIMER ;(22)RETURN JIFFY CLOCK TIME + X MSTIME,MSTIME ;(23)RETURN TIME OF DAY IN MS + X GETPPN,GETPPN ;(24)RETURN PROJECT-PROGRAMMER NUMBER + X TRPSET,TRPSET ;(25)SET PI TRAP LOC, AND USER IO + X TRPJEN,UUOERR ;(26)DISMISS INTERRUPT TO EXEC MODE(SUPERCEDED BY UJEN) + X RUNTIM,JOBTIM ;(27)RETURN TOTAL JOB RUNNING TIME + X PJOB,JOBNO ;(30)RETURN JOB NUMBER + X SLEEP,SLEEP ;(31)SLEEP FOR N SECONDS, THEN RETURN TO USER + X SETPOV,SETPOV ;(32)SET PUSH DOWN OVERFLOW TRAP + ; (FOR COMPATIBILITY ONLY) + X PEEK,UPEEK ;(33)TO PEEK AT CERTAIN MONITOR PARAMETERS + X GETLIN,GETLN ;(34) GET TTY UNE NUMBER + X RUN,URUN ;(35) RUN DEV:FILE + X SETUWP,SETUWP ;(36) SET OR CLEAR USER MODE WRITE PROTECT + X REMAP, REMAP ;(37) REMAP TOP OF LOW SEGMENT INTO HIGH SEG + X GETSEG,UGTSEG ;(40) GET SHARABLE HIGH SEG + X GETTAB,GETTAB ;(41) GET EXEC ADDRESS OF A JOB TABLE + X SPY,USPY ;(42) SET HIGH SEG TO BE PHYSICAL CORE + X SETNAM,SETNAM ;(43) SETNAME OF THIS PROGRAM + X CPOPJ,CPOPJ ;2 SPARE UUO'S FOR PATCHING - DIGITAL ONLY + X CPOPJ,CPOPJ ;ALWAYS ADD NEW UUO'S ABOVE THESE + ;CUSTOMERS SHOULD ADD UUO'S ABOVE + ;IN CNAMES MACRO RATHER THAN NAMES MACRO + ; SO THAT THEIR CALLI INDECES WILL + ; BE NEGATIVE +> + ;GENERATE SIXBIT TABLE OF UUO NAMES + +DEFINE X (A,B) < + +> + +;GENERATE CUSTOMER CALL/CALLI UUO'S + +CCLTAB: CNAMES +CCLLEN=.-CCLTAB ;LENGTH OF CUSTOMER DEFINED CALL/CALLI UUO'S + ;(MINIMUM CALLI NUMBER, TOO) + +;GENERATE DIGITAL UUO'S + +UCLTAB: NAMES +UCLLEN=.-UCLTAB ;DEFINE LENGTH OF DIGITAL UUO TABLE(MAX. CALLI NO. TOO) + DEFINE X (A,B) +< ZZ=ZZ+1 + DEFINE XX (C) ;DEFINE XX IN CASE JOB NUMBER OF CUSTOMER UUO'S +< XWD UUOERR,C +>> +ZZ=0 +;COUNT NUMBER OF CUSTOMER DEFINED UUO'S + CNAMES + +;GENERATE HALF WORD UUO DISPATCH TABLE + +DEFINE X (A,B) +< IFE ZZ&1, +< DEFINE XX (C) +< + XWD B,C +>> + IFN ZZ&1, +< + XX B +> +ZZ=ZZ+1 +> + +;GENERATE CUSTOMER TABLE + +CUSTAB: CNAMES + + +ZZ=0 + +;GENERATE DIGITAL TABLE + +UCLJMP: NAMES + + IFN ZZ&1, ;GEN. LAST WORD IF ODD NUMBER OF UUOS + +;FIX UP SYMBOLS NOT IN UUOCON + +IFN FT2REL, +IFE FT2REL, + ;EXIT UUO ROUTINE +;CALL: CALL FIELD, [SIXBIT/EXIT/] +;IF FIELD - 0, PRINT EXIT ^C. CONT WILL NOT WORK +;IF FIELD NON-ZERO, JUST PRINT. DO NOT RELEASE DEVICES + +EXTERNAL TTYFUW + +EXIT: JUMPN UCHN,MONRET ;AC FIELD NON-ZERO? + PUSHJ PDP,IORELS ;NO, RELEASE ALL DEVICES + PUSHJ PDP,TTYFUW ;FIND TTY FOR CURRENT JOB + ; SET ITEM TO JOB NO.,DAT TO OUTPUT BYTE POINTER + ; DEVDAT TO TTY DDB + JSP TAC,PHOLD ;MOVE "EXIT" TO OUTPUT BUFFER + ; AND STOP JOB, AND START TTY, CONT WILL NOT WORK + ASCIZ / +EXIT/ + +; CALL 1,[SIXBIT/EXIT/] - RETURN TTY TO MONITOR MODE, +; STOP JOB, BUT DO NOT RELEASE DEVICES +;TYPE . WITH NO CRLF, ALLOW CONT COMMAND TO RETURN AFTER UUO + + EXTERN PRPER,STOP1,CRLF,TTYSTC + +MONRET: PUSHJ PDP,TTYFUW ;FIND TTY FOR CURRENT JOB + PUSHJ PDP,CRLF ;PRINT CR LF + PUSHJ PDP,PRPER ;PRINT . + PUSHJ PDP,TTYSTC ;PUT TTY INTO COMMAND MODE + JRST STOP1 ;START TTY IN MONITOR MODE AND STOP JOB + ;BUT ALLOW CONTINUE TO WORK (RETURN CONTROL AFTER EXIT UUO) + +;SETPOV - SET PUSH DOWN OVERFLOW TRAP +;CALL MOVE AC,ADR. OF TRAP ON PD OVF +; CALL AC,[SIXBIT /SETPOV/] + +EXTERNAL JOBAPR + +SETPOV: MOVEM TAC,JOBAPR(JDAT) + MOVEI TAC,1B19 + JRST APRENB ;SET TRAP LOC. + + ;RESET UUO ROUTINE + +INTERNAL RESET,FTTRPSET +EXTERNAL JOBPD1 + +RESET: +IFN FTTRPSET,< + EXTERN STOPTS + CAIN TAC,1 ;IS THIS JOB 1 DOING THE RESET? + SETZM STOPTS ;YES. MAKE SURE SCHEDULING ALLOWED + ; IN CASE THIS FOLLOWS A TRPSET UUO +> +IFN FT2REL,< + EXTERN HRESET + PUSHJ PDP,HRESET ;FLAG USER AS HAVING UWP ON FOR HIGH SEG + ; AND DO DATAO TO SET UWP ON +> + PUSHJ PDP,IOKILL ;RELEASE ALL DEVICES + MOVSI TAC,777777-USRMOD ;CLEAR ALL UUO PC FLAGS IN LH, EXCEPT USER MODE + ANDCAM TAC,JOBPD1(JDAT) ;LEAVE USER MODE OFF TOO, IF EXEC DOING CALL RESET + ; FALL INTO APRENB WITH RH TAC=0 + ; SO THAT ALL APR INTERRUPTS WILL BE DISABLED + ;ROUTINE TO SET UP APR FOR USER TRAPPING +;CALL: CALL AC,[SIXBIT /APRENB/] +;WITH FOLLOWING APR CONSO FLAG BITS +;TO INDICATE WHICH APR CONDITIONS SHOULD +;TRAP TO USER WHEN TRAP OCCURS FROM USER MODE + +;1B19 ;PUSHDOWN OVERFLOW +;1B22 ;ILLEGAL MEMORY +;1B23 ;NON-EXISTENT MEMORY +;1B26 ;CLOCK +;1B29 ;FLOATING POINT OVERFLOW +;1B32 ;ARITH. OVERFLOW + +INTERNAL APRENB + +APRENB: HRRM TAC,JOBENB(JDAT) ;SET RH TO CONSO BITS IN JOB DATA AREA + ; USED EVERY TIME IS STARTED UP + + JRST SETAPR ;GO ENABLE/DISABLE APR FOR FOV AND HR OV + ; ALSO SET APR CONSO INSTR. FOR PROPER FLAGS + ; AND RETURN TO USER + ;RETURN JOB NUMBER FOR THIS JOB + +JOBNO: SKIPA TAC,ITEM ;JOB NUMBER + ; SKIP AND STORE TAC IS USER AC + +;RETURN THE DATE TO THE USER + +EXTERNAL THSDAT + +DATE: MOVE TAC,THSDAT + JRST STOTAC + +;RETURN JOB RUNNING TIME IN MILLISECONDS + +INTERNAL FTTIME + +JOBTIM: +IFN FTTIME, +IFE FTTIME,< + TDZA TAC,TAC ;RETURN ZERO IF NO TIMMING COM. +> + +;RETURN TIME OF DAY IN MILLISECONDS + +EXTERNAL TIME,JIFSEC + +MSTIME: MOVE TAC,TIME ;TIME OF DAY IN JIFFIES + IMULI TAC,^D1000 + IDIVI TAC,JIFSEC ;DIVIDE BY NO. OF JIFFIES PER SECOND + JRST STOTAC + +;PUT JOB TO SLEEP FOR NSECONDS +;CALL CALL AC,[SIXBIT /SLEEP/] + +INTERNAL FTSLEEP,SLEEP + +SLEEP: +IFN FTSLEEP,< +EXTERNAL JIFSEC,JBTSTS,PION,PIOFF,SETSLP,WAKE,CLOCK + MOVSI TAC1,CLKR + TDNE TAC1,JBTSTS(ITEM) ;DOES THIS JOB HAVE A CLOCK QUEUE + ; REQUEST IN CLOCK QUEUE? + JRST SLEEP1 ;YES, DO NOT PUT ANOTHER ONE IN + IMULI TAC,JIFSEC ;MULTIPLY BY NO. OF JIFFIES PER SECOND + TRNN TAC,7777 ;0 TIME?(CHECK ONLY 12 BITS) + MOVEI TAC,1 ;YES. SLEEP 1 JIFFY + DPB ITEM,[POINT 6,TAC,23] + HRLI TAC,WAKE ;ADR. IN RUNCSS WHEN JOB WAKES UP + CONO PI,PIOFF + IDPB TAC,CLOCK + CONO PI,PION +SLEEP1: JRST SETSLP ;SET JOB STATUS WORD SO JOB WILL NOT RUN +> +IFE FTSLEEP,< POPJ PDP, ;RETURN IMMEDIATELY IF NOT A FEATURE> + +;PEEK INTO MONITOR UUO +;CALL MOVEI AC, +; CALL AC,[SIXBIT .PEEK.] + + EXTERN SYSSIZ + +UPEEK: +IFN FTLOGIN,< + HLRZ TAC1,PRJPRG(ITEM) ;GET USER'S PROJECT NR + CAIE TAC1,1 ;ADMIN NR? + JFCL ;SHOULD BE PATCHED TO "JRST UUOERR" IF + ; IF CUSTOMER WANTS PEEK UUO NOT ALLOWED FOR ALL USERS +> + CAMLE TAC,SYSSIZ ;ONLY UP TO SIZE OF SYSTEM + JRST RTZER ;RETURN 0 IF USER ASKING TOO BIG + MOVE TAC,(TAC) + JRST STOTAC + ;SET OR CLEAR USER MODE WRITE PROTECT BIT IN HIGH SEG FOR THIS USER ONLY +;CALL: MOVEI AC,0 OR 1 +; CALL AC,[SIXBIT /SETUWP/] OR CALLI AC,34 +; ERROR - MACHINE OR MONITOR CANNOT HANDLE TWO REG, OR TRYING TO CLEAR +; ;UWP OF A SHARABLE SEG(AC=1 ON RETURN) +; OK RETURN - AC CONTAINS PREVIOUS SETTING( OR JOB HAS NO HIGH SEG) + +IFN FT2REL,< + EXTERN USTUWP +SETUWP: JRST USTUWP ;GO TO ROUTINE IN SEGCON + ;IF FT2REL=0, SETUWP DOES RTZER +> + + +;UUO TO REMAP TOP PART OF LOW SEGMENT INTO HIGH SEGMENT +;PREVIOUS HIGH SEG(IF ANY) IS KILLED AND A NEW SEGMENT NUMBER IS ASSIGNED +;TO THIS JOB. REMAP IS USED BY LOADER AND GET +;CALL: MOVEI AC,NEW HIGHEST USER ADR IN LOW SEG(EXEC ORS IN 1777) +; CALL AC,[SIXBIT /REMAP/] OR CALLI AC,35 +; ERROR RETURN, MACHINE OR EXEC CANNOT HANDLE 2 REG OR DESIRED ADR +; ;GREATER THAN OLD LOW SEG +; OK RETURN, LOW SEG ABOVE ARG NOW THE HIGH SEG + +IFN FT2REL,< + EXTERN UREMAP +REMAP: JRST UREMAP ;CORE1 MODULE IN SEGCON +> +IFE FT2REL,< +REMAP=CPOPJ ;ERROR RETURN TO USER(CPOPJ IS AN EXTERN) +> + +;ROUTINE TO GET WORD FROM USER AREA AT UUO LEVEL - EITHER SEGMENT +;CALL: MOVE PROG,XWD PROTECTION,RELOCATION FOR LOW SEG +; HRR UUO,USER ADR. +; HRLI UUO,PROG ;FOR RELOCATION +; PUSHJ PDP,GETWDU +; RETURN ONLY IF ADDRESS OK, WORD IN TAC, ABS. ADR IN TAC1 + +; IF OUT OF BOUNDS, PRINT ILL UUO AND STOP JOB + + INTERN GETWDU,GETWD1 + EXTERN JOB + +GETWD1: HRRI UUO,1(UUO) ;INCREMENT UUO BEFORE PICKING UP WORD +GETWDU: MOVE ITEM,JOB ;SETUP CURRENT JOB NUMBER + PUSHJ PDP,GETWRD ;GET THE WORD AND CHECK IF LEGAL + JRST UUOERR ;ADR. NOT IN LOW OR HIGH SEG, PRINT ERROR +LCPOPJ: +RMPERR: POPJ PDP, ;OK RETURN, TAC=WORD, TAC1=ABS. ADR. + ;SET LIGHTS ON CONSOLE FROM USER PROGRAM + +;CALL AC,[SIXBIT /DATAO/] OR CALLI AC,-1 + +;THIS IS AN EXAMPLE OF A USER DEFINED UUO WITH A NEGATIVE CALLI ARG. + +LIGHTS: DATAO PI,TAC ;SENT USER'S AC TO CONSOLE LIGHTS + POPJ PDP, ;RETURN TO HIM + +;RETURN TIME OF DAY IN JIFFIES (60THS,50THS OR MS) + +EXTERNAL TIME + +TIMER: SKIPA TAC,TIME ;FALL INTO STOTAC + +;RETURN DATA SWITCHES + + +SWITCH: DATAI TAC + +;ROUTINE TO STORE TAC IN USER AREA AS SPECIFIED BY UUO +;MUST BE CALLED FROM UUO LEVEL WITH PROG SETUP +;ALSO PROG IN INDEX FIELD OF UUO + +INTERNAL STOTAC + +STOTAC: HRRZ AC1,UUO + PUSHJ PDP,UADCK1 ;IS ADDRESS IN BOUNDS(OR IN ACS)? + MOVEM TAC,@UUO ;YES, STORE + POPJ PDP, + +;RETURN DEVICE CHARACTERISTICS + +EXTERNAL JOB,PJOBN + +DVCHR: PUSHJ PDP,DEVSRC ;SERACH FOR DEVICE + TDZA TAC,TAC ;NOT A DEVICE, RETURN ZERO + SKIPA TAC,DEVMOD(DEVDAT);DEVICE FOUND,RETURN DEVMOD + JRST STOTAC ;RETURN ZERO, DEVICE NOT FOUND + LDB TAC1,PJOBN ;GET JOB NO. USING DEVICE + CAME TAC1,JOB ;DOES CURRENT USER ALREADY HAVE IT? + TRNN TAC,ASSCON+ASSPRG ;NO, IS IT ASSIGNED? + TLO TAC,DVAVAL ;NO, BUT HE CAN GET IT. + JRST STOTAC + +;RETURN PROJECT-PROGRAMMER NUMBER IN AC + +GETPPN: +INTERNAL FTLOGIN +IFN FTLOGIN,< + EXTERNAL PRJPRG + MOVSI TAC,JACCT + TDNE TAC,JBTSTS(ITEM) ;LOGIN OR LOGOUT CUSP RUNNING ? + JRST GETPPL ;YES, SPECIAL PROJ,PROG NUMBER CHANGE. + SKIPA TAC,PRJPRG(ITEM) ;NO, RETURN PROJECT-PROGRAMMER NO. OF THIS JOB. +> + +INTERN RTZER + +IFE FT2REL, < +SETUWP: ;SETUWP RETURNS 0 +> + +RTZER: MOVEI TAC,0 ;RETURN 0. TO USER AC + JRST STOTAC ;AS SPECIFIED IN AC FIELD OF HIS UUO + EXTERNAL USRDDT + +SETDDT: MOVEM TAC,USRDDT + POPJ PDP, ;RETURN TO USER + +;WAIT FOR IO TO BECOME INACTIVE ON CHANNEL AC + + +WAIT: JUMPE DEVDAT,CPOPJ ;CHANNEL ASSIGNED? + JRST WAIT1 ;WAIT TILL INACTIVE BEFORE + ; RETURNING TO USER. + + +IFN FTLOGIN, < +EXTERNAL DUMPPP,MJOBN +GETPPL: MOVE TAC,DUMPPP ;CHANGE USER'S NUMBERS TO [1,2] + EXCH TAC,PRJPRG(ITEM) ; AND GET OLD NUMBERS. + MOVSI TAC1,MJOBN ;CHECK FOR OTHER USERS UNDER SAME PP NUMBER. + CAMN TAC,PRJPRG(TAC1) ;ANOTHER USER UNDER SAME PROJ,PROG NUMBER ? + AOSA (PDP) ;YES, SKIP RETURN TO USER (LOGIN OR LOGOUT) + AOBJN TAC1,.-2 ;NO, KEEP LOOKING + JRST STOTAC +> + +GETLN: PUSHJ PDP,TTYFND ;FIND USER'S TTY DATA BLOCK. + MOVE TAC,DEVNAM(DEVDAT) ;GET DEVICE NAME IN SIXBIT + JRST STOTAC ;RETURN IT TO USER. + ;LOGIN UUO USED ONLY BY LOGIN CUSP +;CALL: CALL AC,[SIXBIT /LOGIN/] +;WHERE AC CONTAINS XWD -NO. OF ENTRIES,LOCATION +;WHICH IS A LIST OF JOB STATISTICS TO BE STORED IN MONITOR + +INTERNAL FTLOGIN + +IFN FTLOGIN,< +EXTERNAL JOB,JBTSTS,TTYFUW + +LOGIN: MOVSI TAC1,JLOG ;IS USER ALREADY LOGGED IN? + TDNE TAC1,JBTSTS(ITEM) + JRST UUOERR ;YES, PRINT ILLEGAL UUO + HLRE AC1,TAC ;NO, -NO. OF WORDS + HRR UUO,TAC ;FIRST REL. LOC. + MOVE AC2,[XWD -LOGTOP,LOGTAB] ;SET FOR LOOP +LOGIN1: AOSG AC1 ;FINISHED HIS COUNT? + SKIPA AC3,@UUO ;NO, GET NEXT WORD FROM USER AREA + MOVEI AC3,0 ;YES, STORE 0 + MOVEM AC3,@(AC2) ;NO, STORE ITEM + ADDI UUO,1 ;GET NEXT ITEM + AOBJN AC2,LOGIN1 ;FINISHED NO. OF MONITOR TABLES? + IORM TAC1,JBTSTS(ITEM) ;YES, FINALLY SET LOGIN BIT + MOVSI TAC1,JACCT ;RESET THIS BIT TO INDICATE LOG-IN IS + ANDCAM TAC1,JBTSTS(ITEM) ; NOW COMPLETE AND ^C IS AGAIN PERMITTED. +LOGIN2: PUSHJ PDP,IORELS ;RELEASE ALL DEVICES + PUSHJ PDP,TTYFUW ;FIND TTY AND PRINT ^C + JRST HOLD + +;TABLE OF POINTERS TO TABLES(STORED WITH JOB NUMBER AS INDEX) +;TO MAKE LOGIN SET MORE TABLES IN MONITOR, JUST ADD TABLE NAMES AT END + +EXTERNAL PRJPRG + + +LOGTAB: XWD ITEM,PRJPRG ;PROJECT-PROGRAMMER NUMBER +IFN FTPRV,< + EXTERN JBTPRV + XWD ITEM,JBTPRV ;JOB PRIVILEGE BITS +> +IFE FTPRV,< + EXP IOS ;STORE IN AC IOS, SINCE PRIVILEGE TABLE DOES NOT EXIST +> + +LOGTOP=.-LOGTAB ;NO. OF TABLES TO BE SET +> + +;LOGOUT UUO + +INTERNAL FTLOGIN +EXTERNAL TTYTCM + +IFN FTLOGIN,< +LOGOUT: PUSHJ PDP,TTYFUW + MOVSI TAC,JLOG + TDNN TAC,JBTSTS(ITEM) ;IS JOB ALREADY LOGGED OUT ? + JRST JOBKL ;NO, GO COMPLETE WORK OF LOGOUT CUSP. + JRST EXIT ;YES, TREAT AS "EXIT" +> + +IFE FTLOGIN,< + +LOGIN=UUOERR ;CANT DO A LOGIN UUO +LOGOUT=EXIT ;TREAT A KJOB UUO AS AN EXIT IN 10/40 +> + ;GETTAB UUO +;UUO TO RETURN CONTENTS OF A MONITOR JOB TABLE ENTRY +;CALL: HRROI AC, MONITOR JOB TABLE NUMBER +; HRLI AC, JOB NUMBER (OPTIONAL) LH .LT. 0 MEANS CURRENT JOB +; CALL AC, [SIXBIT /GETTAB/] OR CALLI AC,41 +; ERROR RETURN AC PRESERVED IF LH OR RH TOO BIG OR + ; AC=-1 IF NOT PRIVILIGED TO GET INFO +; NORMAL RETURN - AC=0 IF TABLE IS UNDEFINED +IFN FTGETTAB,< + EXTERN JOB,JOBMAX,TTYTAB,TTPMXL,JOBMXL,JBTMXL + +GETTAB: HLRZ ITEM,TAC ;GET USER SUPPLIED JOB NUMBER + SKIPGE TAC ;DID HE SUPPLY ONE? + MOVE ITEM, JOB ;NO, USE CURRENT JOB NUMBER + HRRZS TAC ;GET TABLE NUMBER IN TAC + CAIL TAC,GTTBLN ;IS TABLE NUMBER LEGAL? + POPJ PDP, ;YES. ERROR RETURN, AC UNCHANGED + LDB TAC1,[POINT 9,NUMTAB(TAC),8] ;MAX LEGAL ARG. + CAMLE ITEM,TAC1 ;DOES HIS ARG EXCEED LEGAL ONE? + POPJ PDP,0 ;YES. ERROR RETURN + MOVE TAC,@NUMTAB(TAC) ;GET CONTENTS OF MONITOR TABLE + AOS (PDP) ;OK (SKIP) RETURN TO USER + JRST STOTAC ;RETURN TAC IN HIS AC + +;THE MONITOR JOB TABLE NUMBERS: + EXTERN JBTSTS,JBTADR,JBTPRG,NSWTBL,CNFTBL,NSWMXL,CNFMXL +NUMTAB: XWD ITEM+JBTMXL,JBTSTS ;0 - JOB STATUS BITS + XWD ITEM+JBTMXL,JBTADR ;1 - JOB SIZE -1 AND ABS.LOC +IFN FTLOGIN,< + EXTERN PRJPRG + XWD ITEM+JBTMXL,PRJPRG ;2 - PROJECT,PROGRAMMER NUMBER +> +IFE FTLOGIN,< + XWD JBTMXL,[0] ;2 - NOT DEFINED +> + XWD ITEM+JBTMXL,JBTPRG ;3 - PROGRAM BEING RUN +IFN FTTIME,< + + EXTERN TTIME + + XWD ITEM+JOBMXL,TTIME ;4 - TOTAL RUN TIME IN JIFFIES +> +IFE FTTIME,< + XWD JOBMXL,[0] ;4 - NOT DEFINED TABLE - RETURN 0 +> +IFN FTKCT,< + EXTERN JBTKCT + XWD ITEM+JOBMXL,JBTKCT ;5 - KILO-CORE TICKS(JIFFIES*SIZE IN K) +> +IFE FTKCT,< + XWD JOBMXL,[0] ;5 NOT DEFINED TABLE - RETURN 0 +> + IFN FTPRV,< + EXTERN JBTPRV + XWD ITEM+JOBMXL,JBTPRV ;6 - PRIVILEGE BITS SET BY LOGIN +> +IFE FTPRV,< + XWD JOBMXL,[0] ;6 - NOT DEFINED TABLE - RETURN 0 +> +IFN FTSWAP,< + EXTERN JBTSWP,SWPTBL,SWPMXL + XWD ITEM+JBTMXL,JBTSWP ;7 - LOC ON DISK, SIZE ON DISK, IN CORE PROTECT TIME +> +IFE FTSWAP,< + XWD JOBMXL,[0] ;7 - NOT DEFINED TABLE - RETURN 0 +> + XWD ITEM+TTPMXL,TTYTAB ;10 - TTY TRANSLATOR TABLE + XWD ITEM+CNFMXL,CNFTBL ;11 - CONFIGURATION DATA + XWD ITEM+NSWMXL,NSWTBL ;12 - NON-SWAPPING DATA +IFN FTSWAP,< + XWD ITEM+SWPMXL,SWPTBL ;13 - SWAPPER DATA +> +IFE FTSWAP,< + EXP [0] ;13 - UNDEFINED + ;ALL CALL ARE ERROR RETURNS SINCE TABLE + ; HAS NO ENTRIES +> +IFN FT2REL,< + +EXTERN JBTSGN,ITMSGN + + XWD ITMSGN,JBTSGN ;14 - HIGH SEG NO. THIS JOB IS USING + ;LH=ITEM+JOBMXL IF REENTRANT SOFTWARE + ;LH=0+JOBMXL, SO ALL ENTRIES RETURN 0 + ; IF NON-REENTRANT SOFTWARE +> +IFE FT2REL,< + XWD JOBMXL,[0] ;14 - UNDEFINED +> +IFN FTDISK,< + EXTERN ODPMXL,ODPTBL + XWD ITEM+ODPMXL,ODPTBL ;15 - ONCE ONLY DISK PARAMETERS +> +IFE FTDISK,< + EXP [0] ;50 - UNDEFINED +> +GTTBLN=.-NUMTAB ;LENGTH OF TABLE +> + +IFE FTGETTAB, + +;UUO TO SET CURRENT PROGRAM NAME +; MOVE AC,[SIXBIT /NAME/] +; ALWAYS RETURN + + EXTERN JBTPRG + +SETNAM: MOVEM TAC,JBTPRG(ITEM) ;STORE PROGRAM NAME FOR SYSTAT AND SYSDPY + POPJ PDP, + + +;UUO TO SET JOB TO USE IO IN USER MODE +;AND TO SET PI INTERRUPT LOCATION IN LOWER CORE(WORKS ONLY ON PDP-10'S -SEE NEXT PAGE) +;CALL: CALL AC,[SIXBIT /TRPSET/] +; ERROR RETURN, USER NOT ALLOWED TO DO IO IN USER MODE +; OK RETURN + +;WHERE RH(AC)=REL ADR. OF 1 INSTRUCTION TO BE MOVED INTO +;THE MONITOR PI TRAP LOCATION(40-57) AS SPECIFIED BY LH(AC) +;RELOCATION OF JOB IS ADDED TO RH OF INSTRUCTION AS IT IS MOVED. +;ALSO THE RELOCATION IS ADDED TO THE RH OF WORD IN USER AREA SPECIFIED BY +;RH OF USER INSTRUCTION IN CASE IT IS A BLKO/BLKI POINTER +;THE USER MUST RESET EVERY TRPSET CALL IF BLKI/BLKO POINTER +;AND SHOULD SET RH TO 0 IF JSR PC WORD +;THE APR IS ALSO SET SO USER MAY DO IO IN USER MODE +;TO SET USER MODE IO WITHOUT SETTING LOWER CORE, C(AC)=0 +;STOP TIME SHARING ONLY IF AC IS NON-ZERO(IE RUN ONLY JOB 1) + +INTERNAL FTTRPSET + +TRPSET: +IFN FTTRPSET,< +EXTERNAL JOBPD1,STOPTS + + CAIE ITEM,1 ;IS THIS JOB 1? + POPJ PDP, ;NO, ERROR RETURN + SETZM STOPTS ;CLEAR THE STOP TIME SHARING FLAG + JUMPE TAC,TRPST1 ;IS AC 0?(DO NOT SET PI LOC IF YES) + HLRZ TAC1,TAC ;NO, SET LOWER CORE + CAIL TAC1,40 ;IS IT LEGAL LOWER CORE ADR.? + CAIL TAC1,60 + POPJ PDP, ;NO, ERROR RETURN + SETOM STOPTS ;SET STOP TIME SHARING FLAG, SO NO OTHER JOBS + ; JOBS WILL RUN AND NO CORE SHUFFLING + HRLI TAC,PROG ;YES, SET TO RELOCATE + MOVE TAC,@TAC ;GET THE INSTR. + ADDI TAC,(PROG) ;ADD RELOCATION SO WILL POINTER TO USER AREA + HRRZ DAT,PROG ;USER RELOCATION + ADDM DAT,(TAC) ;ALSO ADD RELOCATION TO WORD POINTED TO BY INSTR + ; IN CASE IT IS A BLKI/BLKO POINTER WORD + ; USER SHOULD RESET RH OF POINTER IF BLKI/BLKO INSTR + ; OR CLEAR PC LOC IF JSR INSTR + EXCH TAC,(TAC1) ;AND STORE IN MONITOR TRAP LOC. +TRPST1: AOS (PDP) ;OK RETURN + MOVSI TAC1,4000 ;SET USER IO PC FLAG + IORM TAC1,JOBPD1(JDAT) ;IN UUO RETURN PC +> + JRST STOTAC ;RETURN PREVIOUS CONTENTS OF PI LOC. + +;ROUTINE TO DISMISS INTERRUPT FOR JOB DOING USER IO +;WHEN PC IS IN EXEC MODE +;NOTE THE TRPJEN UUO HAS BEEN ELIMINATED +;BECAUSE UUO HANDLER CANNOT BE INTERRUPTED AND REENTERED +;INSTEAD INTERRUPTS IN USER MODE ARE DISMISSED +;BY USING OP CODE 100 (UJEN) WHICH +;TRAPS TO EXEC 61 INSTEAD OF 41 ON PDP-10'S +;UJEN IS A NO-OP ON PDP-6'S AND SO THIS FACILTY IS GOOD ON PDP-10'S ONLY +;CALL: RESTORE ALL EXEC ACS +; UJEN ADR ;UJEN=100 +; WHERE ADR CONTAINS PC STORED BY INTERRUPT JSR +; SEE UUO HANDLER (UUO2) FOR CODE + ;FOR PURPOSES OF COMMENTING THIS SUBROUTINE THE +;TERM 'BUFFER HEADER' SHALL REFER TO THE 3 WORD HEADER +;WHICH IS USED BY THE USER PROGRAM AND THIS EXEC FOR +;REFERING TO THE RING BUFFERS. + +;THE CONTENTS OF THE 3 WORD HEADER (AS SET BY THE MONITOR +; ON EACH INPUT AND OUTPUT UUO). +; BIT 18-35=ADDRESS OF SECOND WORD OF THE +; CURRENT BUFFER IN RING WHICH USER IS REFERENCING +; WORD 2: BYTE POINTER TO CURRENT ITEM. +; WORD 3: POSITIVE ITEM COUNT (NO. OF ITEMS LEFT ON +; INPUT, NO. OF FREE ITEMS TO GO ON OUTPUT). + +;EACH BUFFER IN THE RING HAS FOLLOWING FORMAT (AS THE USER SEES IT) + +; WORD 1: RESERVED FOR BLOCK NUMBER FOR FIXED ADDRESS DEVICES +; WORD 2: BIT 0=USE BIT FOR THIS BUFFER +; BIT 1-17=NO. OF WORDS WHICH FOLLOW (LENGTH OF BUFFER)/ +; BIT 18-35=ADDRESS OF SECOND WORD OF NEXT BUFFER IN RING +; WORD 3: LH=LINK TO NEXT BLOCK (SET BY MONITOR FOR DECTAPE) +; RH=NO. OF WORDS OF DATA WHICH FOLLOW (USUALLY +; SET BY EXEC EXCEPT IF THE USER HAS SPECIFIED +; THAT HE WANTS TO COMPUTE WORD COUNT +; HIMSELF INSTEAD OF HAVING THE MONITOR DO IT +; USING THE BYTE POINTER IN THE 3 WORD HEADER). + + + + + +,CALLING SEQUENCE +, CLOSE D, +, EXIT ALWAYS RETURNS HERE +, THIS ROUTINES PROCESSES THE CLOSE UUO AND DETERMINES WHETHER THE +,OUTPUT ROUTINE SHOULD BE CALLED IF OUTPUT WERE ACTIVE, CLEARS +,THE INPUT BUFFER AREA IF INPUT WERE ACTIVE, AND CLEARS THE +,ITEM COUNTS OF BOTH INPUT AND OUTPUT HEADERS SERVING TO BOTH +,TERMINATE THE USE OF THE DEVICE AND SET THE I/O ROUTINES TO +,ACCEPT ANOTHER INPUT OR OUTPUT COMMAND IN A CLEAR STATE. +,IN THE CASE OF OUTPUT DEVICES, THE CLOSE ROUTINE OF THE DEVICE HANDL- +,ING ROUTINE IS CALLED IN CASE ANY SPECIAL HANDLING IS REQUIRED. + INTERNAL CLOSE1 +EXTERNAL PIOMOD + +CLOSE1: PUSHJ PDP,WAIT1 ;WAIT UNTIL DEVICE IS INACTIVE + TRNN UUO,CLSIN ;SUPPRESS INPUT CLOSE? + TLOE DEVDAT,ICLOSB ;NO. INPUT ALREADY BEEN CLOSED? + JRST UCLS2 ;YES + LDB TAC,PIOMOD ;NO + CAIGE TAC,SD ;DUMP MODE? + JRST UCLSBI ;NO. CLOSE BUFFERED INPUT. +UCLS5: PUSHJ PDP,DCLI(DSER) ;YES. DISPATCH TO DEVICE DEP. ROUTINE + JRST UCLS2 ;MUST NOT DESTROY UUO,DEVDAT,DSER,UCHN +UCLSBI: MOVE TAC,DEVMOD(DEVDAT) + TLNE DEVDAT,INBFB+INPB ;WAS AN INPUT BUFFER SETUP? + JRST UCLS4 ;YES + TLNE TAC,DVDSK ;CLOSING A DISK FILE ? + JRST UCLS5 ;YES, DO DEVICE DEPENDENT CLOSE ANYWAY. + JRST UCLS2 ;NO, CLOSE NOT NECESSARY. +UCLS4: TLNE TAC,DVLNG ;IS THIS A LONG DISPATCH TABLE? + PUSHJ PDP,DCLI(DSER) ;YES, CLOSE INPUT + HRRZ TAC1,DEVBUF(DEVDAT) + HRLI TAC1,PROG + HRRZ DAT,@TAC1 ;FIRST WORD OF 3 WORD BUFFER HEADER + HRR TAC1,@TAC1 ;REMEMBER CURRENT BUFFER IN TAC1 + HRLZI TAC,IOUSE ;USED BOTH FOR HEADER AND EACH BUFFER + JUMPE DAT,UCLS1 ;HAS A RING BEEN SETUP?(NO IF 0) + HRLI DAT,PROG ;YES + MOVEI AC1,(DAT) ;IS ADDRESS SPECIFIED BY CONTENTS OF + PUSHJ PDP,UADRCK ;FIRST WORD OF 3 WORD BUFFER HEADER IN BOUNDS? + SETZM AC1 +UCLS0: HRR DAT,@DAT ;ADVANCE CURRENT INPUT BUFFER ADDRESS + CAIN AC1,(DAT) ;IS THIS THE SAME BUFFER AS LAST ONE? + JRST UCLS1 ;YES. BAD RING. LOOPING ON ITSELF. + MOVEI AC1,(DAT) ;IS ADDRESS OK? + PUSHJ PDP,UADRCK + ANDCAM TAC,@DAT ;YES, CLEAR USE BIT. + CAME TAC1,DAT ;DONE? + JRST UCLS0 + EXTERNAL USRJDA + +UCLS1: HRLI DAT,PROG + HRR DAT,DEVBUF(DEVDAT) + IORM TAC,@DAT ;FLAG AS VIRGIN BUFFER IN 3 WORD HEADER + ADDI DAT,2 ;JBFCTR:=0 + SETZM @DAT ;CLEAR INPUT ITEM COUNT. + MOVE IOS,[XWD IOEND,IODEND] + ANDCAB IOS,DEVIOS(DEVDAT) +UCLS2: TRNN UUO,CLSOUT ;SUPPRESS OUTPUT CLOSE? + TLOE DEVDAT,OCLOSB ;NO. OUTPUT ALREADY CLOSED? + JRST UCLS3 ;YES + IFN FT2REL,< + EXTERN RELSEG + PUSH PDP,UCHN + PUSHJ PDP,RELSEG ;CLEAR SHARED SEG NAME IF FILE JUST CLOSED HAS + ; EXTENSION .SHR AND SEG HAS SAME DIRECTORY AND NAME + POP PDP,UCHN +> + LDB TAC,PIOMOD ;NO. + CAIGE TAC,SD ;DUMP MODE? + JRST UCLSBO ;NO. CLOSE BUFFERED OUTPUT +UCLS7: PUSHJ PDP,DCL(DSER) ;YES. DISPATCH TO DEVICE DEP. ROUTINE + JRST UCLS3 +UCLSBO: TLNN DEVDAT,OUTBFB+OUTPB ;WAS AN OUTPUT BUFFER SET UP? + JRST UCLS6 ;NO + HLR DAT, DEVBUF(DEVDAT) ;VIRGIN OUBPUT BUFFER? + HRLI DAT, PROG + SKIPG @DAT + JRST UCLS6 ;YES, DO NOT CLOSE UNLESS IT IS A DISK FILE +UCLS2A: MOVE DSER,DEVSER(DEVDAT) + SKIPL @DEVOAD(DEVDAT) ;NO, HAS SERVICE ROUTINE WRITTEN + ; ITS NEXT BUFFER YET? + JRST UCLS2B ;YES + TRZ IOS,760000 ;NO,CLEAR ERROR BITS AND START OUTPUT DEVICE + PUSH PDP,UUO + PUSHJ PDP,DOU(DSER) ;CALL SERVICE ROUTINE TO DO OUTPUT + POP PDP,UUO + PUSHJ PDP,WAIT1 ;WAIT TILL MOST BUFFERS FILLED + TRNN IOS,760000 ;ERROR? + JRST UCLS2A ;NO,RETURN WHEN ALL EMPTIED + ; OR SHUFFLING REQUIRED STOPS DEVICE + +UCLS2B: MOVE DSER,DEVSER(DEVDAT) + PUSHJ PDP,DCL(DSER) ;CLOSE OUTPUT BUFFER + HLR DAT,DEVBUF(DEVDAT) + HRLI DAT,PROG + HRLZI TAC,IOUSE + IORM TAC,@DAT + ADDI DAT,2 + SETZM @DAT ;JBFCTR:=0 + PUSHJ PDP,WAIT1 + TLO DEVDAT,OCLOSB ;SET OCLOSB AFTER OUTPUT IS COMPLETE +UCLS3: HLLM DEVDAT,USRJDA(UCHN) + POPJ PDP, ;EXIT THIS UUO + +UCLS6: MOVSI TAC,DVDSK + TDNE TAC,DEVMOD(DEVDAT) ;CLOSING A DISK FILE ? + JRST UCLS7 ;YES, DO DISK CLOSE ROUTINE IN ANY EVENT + JRST UCLS3 + ,CALLING SEQUENCE +, INBUF D,N +, EXIT RETURNS HERE IF MEMORY NOT EXCEEDED +,CALLING SEQUENCE +, OUTBUF D,N +, EXIT RETURNS HERE IF MEMORY NOT EXCEEDED +, SETS UP AN N BUFFER RING FOLLOWING THE USER'S PROGRAM FOR DEVICE +, D AND INITIALIZES THE JOB BUFFER AREA HEADER: +, JBFADR0:=1, JBFADR 1-17:=0 +, JBFADR 18-35:=ADDRESS OF FIRST BUFFER IN RING +,INPUT SETS DEVIAD:=ADDRESS OF FIRST BUFFER IN RING +,OUTPUT SET DEVOAD:=ADDRESS OF FIRST BUFFER IN RING +,BUFPNT IS RESTORED. + INTERNAL UINBF, UOUTBF + EXTERNAL PUUOAC,USRJDA + + +UOUTBF: TLO DEVDAT,OUTBFB ;FLAG OUTBUF UUO DONE + PUSH PDP,BUFPNT ;SAVE BUFPNT ON STACK + PUSHJ PDP,BUFCLC ;SET UP BUFFER RING + HLR TAC,DEVBUF(DEVDAT) ;TAC:=OUTPUT BUFFER AREA HEADER ADDRESS + HRRM BUFPNT,DEVOAD(DEVDAT) ;DEVOAD:=ADDRESS OF FIRST BUFFER + ; IN RING +UOBF1: HRLI TAC,PROG ;RELOCATE BUFFER AREA HEADER ADDRESS + MOVEM BUFPNT,@TAC ;JBFADR:=IOUSE,ADDRESS OF FIRST BUFFER + ; IN RING + LDB TAC,PUUOAC + MOVEM DEVDAT,USRJDA(TAC) + POP PDP,BUFPNT ;RESTORE BUFPNT FROM STACK + POPJ PDP, ;EXIT THIS UUO +UINBF: TLO DEVDAT,INBFB ;FLAG INBUF UUO DONE + PUSH PDP,BUFPNT ;SAVE BUFPNT ON STACK + PUSHJ PDP,BUFCLC ;SET UP BUFFER RING + HRRM BUFPNT,DEVIAD(DEVDAT) ;DEVIAD:=ADDRESS OF FIRST BUFFER + ; IN RING + HRR TAC,DEVBUF(DEVDAT) ;TAC:=INPUT BUFFER AREA HEADER ADDRESS + JRST UOBF1 + ;OPEN UUO - PERFORMS SAME OPERATION AS INIT +;MAY BE USED EASILY BY REENTRANT PROGRAMS +;CALLING SEQUENCE FROM USER AREA +; OPEN D,ADR +; ERROR RETURN +; DEVICE INITED + +;LH(ADR)=0,RH(ADR)=DATA MODE THIS INIT +;LH(ADR+1)=OUTPUT BUFFER HEADER ADDRESS +;RH(ADR+1)=INPUT BUFFER HEADER ADDRESS +;C(ADR+2,...,ADR+5)=SAME AS LOOKUP OR ENTER + +INTERNAL UOPEN + +UOPEN: PUSHJ PDP,GETWDU ;SET TAC TO CONTENTS OF FIRST ARG(IO STATUS BITS) + AOJA UUO,UINIT0 ;MAKE UUO POINT TO ARG+1(WITH PROG STILL + ; IN INDEX FIELD) + + +,CALLING SEQUENCE +, INIT D,MODUS D=JOB DEVICE CHANNEL +, MODUS=IORDEL,IOCON,IOWC,MODE. +, SIXBIT/NAME/ DEVICE NAME +, XWD OBUF,IBUF BUFFER AREA HEADER ADDRESSES +, EXIT1 DEVICE NOT AVAILABLE +, EXIT2 DEVICE PROPERLY ASSIGNED +,THE LEFT HALF OF NAME CONTAINS THE THREE LETTER DEVICE MNEMONIC, +, THE RIGHT HALF IS EITHER ZERO (SYSTEM WILL ASSIGN AN ARBITRARY +, UNIT) OR NON-ZERO TO REQUEST A SPECIFIC UNIT (LEFT JUSTIFIED). +,IF THE SELECTED DEVICE IS NOT AVAILABLE, CONTROL RETURNS TO EXIT1. +,OTHERWISE, THE DEVICE IS ASSIGNED TO THE USER AND ATTACHED TO HIS +,CHANNEL D. THE DEVICE IS INITIALIZED IN THE FOLLOWING MANNER AFTER +,IOACT IS ZERO: +, IOBEG:=1 +, DATA MODE:=BITS 32-35 OF AC UUO +, IOCON:=BIT 31 OF AC UUO +, IOWC:=BIT 30 OF AC UUO +, IORDEL:=BIT 29 OF AC UUO +, IOACT:=IODEND:=IOBKTL:=IODTER:=IODERR:=IOIMPM:=0 +, JBFADR:=JBFCTR:=0 FOR THE SPECIFIED BUFFERS. +, DEVBUF:=OBUF,IBUF + INTERNAL UINIT +EXTERNAL STREQ,STUSER +EXTERNAL USRJDA,USRHCU,SYSTAP,TPOPJ,TPOPJ1,IADPTR + +UINIT: MOVE TAC,UUO ;SAVE FIRST ARG(IO STATUS BITS) IN TAC + HRR UUO,-1(PDP) ;SET UUO TO ADR+1 OF USER ARGS + AOS -1(PDP) ;SET RETURN SKIP THE 2 ARGUMENTS + AOS -1(PDP) +UINIT0: PUSH PDP,UUO ;HERE ON OPEN UUO, SAVE ADR+1 OF USER ARGS + PUSH PDP,TAC ;SAVE IO STATUS BITS(FIRST ARG) + SKIPE DEVDAT,USRJDA(UCHN) ;IS A DEVICE ALREADY ASSIGNED TO THIS CHAN? + CAMLE UCHN,USRHCU ;YES, IS THIS CHAN. LESS OR EQUAL TO HIGHEST + ; CHAN. FOR THIS USER? + JRST UINITA ;NO, NO PREVIOUS DEVICE TO RELEASE + PUSHJ PDP,RELEA0 ;RELEASE PREVIOUS DEVICE ON THIS CHAN. +UINITA: MOVE UUO,-1(PDP) ;RESTORE UUO (ADR+1 OF 3 ARGS) + PUSHJ PDP,GETWDU ;C(TAC)=DEVICE NAME IF IN BOUNDS + ; DO NOT RETURN IF OUT OF BOUNDS(PRINT ERR AND STOP) + ; SET ITEM TO CURRENT JOB NUMBER + PUSHJ PDP,DEVSRC ;SEARCH FOR DEVICE NAME + ; (SET SYSDEV BIT IN LH OF + ; DEVDAT IF THIS IS SYSTEM TAPE) + JRST UINITE ;NO SUCH DEVICE + MOVE UUO,(PDP) ;RESTORE USER'S MODE SETTING + PUSHJ PDP,CHKMOD ;CHECK FOR LEGAL MODE, IF NOT RIGHT DONT RETURN + MOVE TAC,DEVNAM(DEVDAT) ;PHYSICAL DEVICE NAME + CAME TAC,[SIXBIT /DSK/] ;NOT DISK? + CAME TAC,SYSTAP ;SYSTEM TAPE DEVICE? + JRST UINIT1 ;NO, DISK OR NOT SYSTEM TAPE + AOSE STREQ ;SYSTEM TAPE, INCREMENT REQUEST COUNT + PUSHJ PDP,STWAIT ;SYSTEM TAPE BUSY, PUT JOB IN WAIT + MOVEM ITEM,STUSER ;SET THIS JOB AS ONLY USER OF SYSTEM TAPE + ; CONTROL C DOES NOT STOP JOB WHILE USING S. T. +UINIT1: MOVE TEM,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS + TLNN TEM,DVDTA ;IS THIS DEVICE A DECTAPE? + JRST UINITB ;NO + LDB TAC1,IADPTR ;YES, GE NO OF USER CHANS DEV INITED ON + HRR TEM,TAC1 ;SAVE OLD NUMBER + AOS TAC1 ;INCREASE CHANNEL COUNT + CAIL TAC1,3 ;ANY MORE THAN JUST 2 CHANNELS? + JRST UINITE ;YES, GIVE ERROR RETURN(POP TAC) + DPB TAC1,IADPTR ;YES, STORE UPDATED CHANNEL COUNT FOR THIS DEVICE(DTA) +UINITB: MOVEI TAC1,ASSPRG ;TRY TO ASSIGN IT BY PROGRAM + PUSHJ PDP,ASSASG + JRST UINIT6 ;NOT AVAILABLE, GIVE ERROR RETURN(POP TAC) + POP PDP,UUO ;RESTORE USER'S MODE SETTING + PUSHJ PDP,SETIOS ;SET DDB IOS STATUS WORD + ; FROM RT. HALF OF AC UUO + ; WAIT FOR DEVICES TO BECOME INACTIVE IN CASE IT IS + ; INITED ON A DIFFERENT CHANNEL(OR MONITOR COMMAND + ; RESPONSE ON TTY) + MOVSI IOS,IOBEG + IORB IOS,DEVIOS(DEVDAT) + UINITL: CAMG UCHN,USRHCU ;IS THIS CHAN. .GT. HIGHEST CHAN. IN USE? + JRST UINITC ;NO + AOS TAC,USRHCU ;YES, BUMP HIGHEST SO FAR BY ONE + SETZM USRJDA(TAC) ;AND CLEAR IT OUT + JRST UINITL ;AND KEEP LOOKING + +UINITC: TLO DEVDAT,INITB+ICLOSB+OCLOSB;SET INIT UUO BIT + ;PREVENT SUPERFLUOUS CALLS TO CLOSE (SEE LOOKUP,ENTER) + AOS UUO,(PDP) ;ADVANCE TO 3RD ARG(BUFFER HEADER) + PUSHJ PDP,GETWDU ;C(TAC)=BUFFER HEADER ARG + HLRZ TAC1,TAC ;OUTPUT BUFFER HEADER FROM USER + JUMPE TAC1,UINIT4 ;WAS ONE SPECIFIED? + HRLM TAC1,DEVBUF(DEVDAT);YES, SET DEVICE DATA BLOCK + TLO DEVDAT,OBUFB ;SET OUTPUT BUFFER SPECIFIED BIT + PUSHJ PDP,UINITZ ;INITIALIZE OUTPUT BUFFER HEADER +UINIT4: PUSHJ PDP,GETWDU ;C(TAC)=BUFFER HEADER ARG FROM USER + HRRZ TAC1,TAC ;INPUT BUFFER HEADER + JUMPE TAC1,UINIT5 ;WAS ONE SPECIFIED? + HRRM TAC1,DEVBUF(DEVDAT) ;YES, SET DEVICE DATA BLOCK + TLO DEVDAT,IBUFB ;SET INPUT BUFFER SPECIFIED BIT + MOVSI IOS,IOEND ;CLEAR END OF FILE FLAG + ANDCAB IOS,DEVIOS(DEVDAT) ;AND RETAIN IOS + PUSHJ PDP,UINITZ ;INITIALIZE INPUT BUFFER HEADER +UINIT5: MOVEM DEVDAT,USRJDA(UCHN) ;STORE UUO BITS AND DEVICE + ; DATA BLOCK ADDRESS + JRST TPOPJ1 ;SUCCESSFUL RETURN(POP TAC) + +UINIT6: TLNE TEM,DVDTA ;WAS DEVICE A DECTAPE? + DPB TEM,IADPTR ;YES, RESTORE NO. OF USER CHAN INITED ON +UINITE: POP PDP,TAC ;REMOVE IO STATUS ARG + JRST TPOPJ ;AND GIVE ERROR RETURN AND POP TAC + ,CALLING SEQUENCE +, PUSHJ PDP,UINITZ +, EXIT RETURNS HERE IF MEMORY NOT EXCEEDED. +,SETS JBFADR:=JBFCTR:=0 FOR THE BUFFER AREA HEADER WHOSE ADDRESS +,IS IN AC TAC1. ALSO,JBFPTR 0-5:=JBFPTR 12-17:=0,JBFPTR 6-11:=BYTE SIZE + + +UINITZ: HRLI TAC1,PROG ;SET FOR RELOCATION + MOVEI AC1,2(TAC1) ;CHECK 3RD WORD OF BUFFER HEADER + PUSHJ PDP,UADRCK + SETZM @TAC1 ;CLEAR FIRST WORD (CURRENT BUFFER) OF 3 WORD HEADER + AOS TAC1 ;POINT TO SECOND WORD (BYTE POINTER) + PUSH PDP,TAC1 + AOS TAC1 ;POINT TO THIRD WORD (ITEM COUNT) + SETZM @TAC1 ;SET ITEM COUNT TO ZERO + PUSHJ PDP,SETBYT ;SET BYTE SIZE ACCORDING TO MODE AS SET IN AC IOS + TLZ TAC,770077 + POP PDP,TAC1 + HLLM TAC,@TAC1 ;AND STORE IN SECOND WORD + POPJ PDP, ;RETURN + ;LONG DISPATCH TABLE UUOS - GET HERE ONLY IF DEVICE HAS LONG +;DISPACTH TABLE +;DISPACTH TO DEVICE DEPENDENT SERVICE ROUTINE +;ENTER UUO - ENTER FILE NAME IN DIRECTORY + +EXTERNAL USRJDA + +UDEN: MOVEI TAC,CLSIN + TLNN DEVDAT,OCLOSB ;FILE OPEN? + PUSHJ PDP,UDLKC ;YES. CLOSE IT[OCLOSB_1] + TLO IOS,IOBEG + TRZ IOS,776000 + MOVEM IOS,DEVIOS(DEVDAT) + HLLM DEVDAT,USRJDA(UCHN) ;STORE UUO BITS + PUSHJ PDP,DEN(DSER) ;ATTEMPT AN ENTER + POPJ PDP, ;FAILURE + TLZ DEVDAT,OCLOSB + TLO DEVDAT,ENTRB ;NOTE SUCCESSFUL ENTER + JRST DLKDEN ;STORE THE PROGRESS BITS + +;LOOKUP UUO - LOOKUP FILE NAME IN DIRECTORY + +EXTERNAL USRJDA + +UDLK: MOVEI TAC,CLSOUT ;IN HIBIT OUTPUT CLOSE BIT + TLNN DEVDAT,ICLOSB ;FILE OPEN? + PUSHJ PDP,UDLKC ;YES. CLOSE IT[ICLOSB_1] + TDZ IOS,[XWD IOEND,776000] + MOVEM IOS,DEVIOS(DEVDAT) + HLLM DEVDAT,USRJDA(UCHN) ;STORE UUO BITS + PUSHJ PDP,DLK(DSER) ;ATTEMPT A LOOKUP + POPJ PDP, ;FAILURE + TLZ DEVDAT,ICLOSB + TLO DEVDAT,LOOKB ;NOTE SUCCESSFUL LOOKUP +DLKDEN: LDB TAC,PUUOAC ;GET CHANNEL # + HLLM DEVDAT,USRJDA(TAC) ;STORE UUO PROGRESS BITS + JRST CPOPJ1 ;SUCCESS RETURN TO USER (CALL+2) + +INTERNAL UDLKC + +UDLKC: PUSH PDP,UUO + HRRI UUO,(TAC) + PUSHJ PDP,CLOSE1 + POP PDP,UUO + JRST WAIT1 + ;RENAME UUO - HERE ON SHORT DISPATCH TABLE DEVICES TOO +INTERNAL FT2REL + +EXTERNAL CPOPJ1 + +URENAM: MOVE TAC,DEVMOD(DEVDAT) ;IS THIS DEVICE A LONG DISPATCH TABLE? + TLNN TAC,DVLNG + JRST CPOPJ1 ;NO, GIVE SKIP RETURN TO USER +IFE FT2REL,< + JRST DRN(DSER) ;YES, DISPATCH TO SERVICE ROUTINE +> +IFN FT2REL,< + EXTERN RELSG1 + PUSHJ PDP,DRN(DSER) ;TRY TO RENAME (SERVICE ROUTINE) + POPJ PDP, ;ERROR,ERROR RETURN TO USER + JRST RELSG1 ;SUCCESSFUL RENAME, GO ZERO SHARABLE SEG NAME + ; IF NEW FILE EXT IS .SHR AND FILE NAME + ; FIND DIRECTORY (DEVICE) ARE SAME AS SHARABLE SEG + ; ALWAYS SKIP RETURN +> + +;SETO UUO - SET NEXT OUTPUT BLOCK NUMBER(DECTAPE) + +UDSO: JRST DSO(DSER) + +;SETI UUO - SET NEXT INPUT BLOCK NUMBER + +UDSI: JRST DSI(DSER) + +;GETF UUO - GET NEXT FREE BLOCK + +UDGF: JRST DGF(DSER) + +;MTAPE UUO - MAGTAPE OPERATIONS + +UMTAPE: JRST DMT(DSER) + +;UTPCLR - CLEAR DECTAPE DIRECT. + +UTPCLR: MOVE TAC,DEVMOD(DEVDAT) ;IS THIS A LONG DISPATCH TABLE? + TLNN TAC,DVLNG + POPJ PDP, ;NO,RETURN + JRST DCLR(DSER) ;YES, DISPATCH + ;INPUT UUO + +;1) IF OUTPUT ACTIVE ON THIS CHANNEL, WAIT FOR IT TO COMPLETE. +;2) IF DUMP MODE, WAIT FOR DEVICE INACTIVE, CALL SERVICE +; ROUTINE TO START INPUT, WAIT TILL COMPLETE, THEN RETURN TO USER. +;3) IF NO BUFFER RING SETUP, SET UP 2 RING BUFFER. +;4) IF FIRST REFERENCE, START SERVICE ROUTINE, GO TO +;5) FLAG CURRENT BUFFER AS FREE TO RECEIVE MORE INPUT +; (USE BIT SET TO 0). +; START SERVICE ROUTINE FILLING FIRST BUFFER WITH USE BIT 0 +; (NEXT BUFFER OR ONE AHEAD OF IT) +; (SERVICE ROUTINE WILL SET USE BIT WHEN IT FINISHES FILLING +; BUFFER). +;7) IF NEXT INPUT BUFFER IS FULL OF DATA, GO TO 10). +;8) PUT JOB IN IO WAIT TILL NEXT BUFFER FILLED. +;9) IF NEXT INPUT BUFFER STILL NOT FILLED, CHECK FOR END +; OF FILE OR ERROR BITS SET BY SERVICE ROUTINE. +;10) CONVERT WORD COUNT AS STORED BY SERVICE ROUTINE IN THIRD +; WORD OF BUFFER TO ITEM COUNT AND STORE IN THIRD WORD +; OF HEADER (ITEM COUNT) ALSO SET BYTE POINTER (SECOND +; WORD OF HEADER) AND RETURN TO USER. + INTERNAL IN +EXTERNAL USRJDA,PIOMOD + +IN: TLNE IOS,IO ;IS THIS DEVICE ALREADY DOING OUTPUT? + PUSHJ PDP,WAIT1 ;YES, WAIT TILL IT IS FINISHED. + TLO DEVDAT,INPB ;FOR THIS DEVICE. + TLZ DEVDAT,ICLOSB + HLLM DEVDAT,USRJDA(UCHN) ;IN LH OF CURRENT JOB DEVICE CHANNEL + LDB TAC,PIOMOD ;IO MODE + CAIL TAC,SD ;IT THE IO MODE DUMP(SD,D,DR)? + JRST INDMP ;YES +IN1: HRR JBUF,DEVBUF(DEVDAT) ;NO, GET ADDRESS OF BUFFER HEADER + HRLZI TAC,IOUSE ;BUFFER INUSE BIT + HRLI JBUF,PROG ;SET INDEX FIELD FOR RELOCATION USING AC PROG + MOVEI AC1,2(JBUF) ;CHECK BUFFER HEADER + PUSHJ PDP,UADRCK + MOVE IOS,DEVIOS(DEVDAT) ;SETUP IO STATUS AGAIN FORM FROM MEMORY + ; AC IOS IS CLOBBERED BY AUTOMATIC CORE EXPANSION + ; ON AN IMPLICIT INBUF ON FIRST INPUT + MOVE TAC1,@JBUF ;GET WORD 1 OF 3 WORD BUFFER HEADER. + HRLI TAC1,PROG ;SET INDEX FIELD COR RELOCATION USING AC PROG + SKIPG @JBUF ;HAS A BUFFER RING BEEN SET UP (RH NON-ZERO) + ; WHICH HAS BEEN REFERENCED BY PREVIOUS INPUT (BIT0=0) + JRST INPUTF ;NO. GO SET UP BUFFER IF NECESSARY AND DO FIRST IO + HRRZ AC1,TAC1 ;YES, CHECK ADR. TO SEE IF OK + PUSHJ PDP,UADRCK + MOVE IOS,DEVIOS(DEVDAT) + TDNN TAC,@TAC1 + JRST INPT1 + ANDCAB TAC,@TAC1 ;FLAG CURRENT BUFFER AS FREE TO + ; RECEIVE MORE INPUT, CLEAR USE BIT + ; AND GET POINTER TO NEXT BUFFER + HRRM TAC,@JBUF ;SET WORD 1 IN 3 WORD HEADER TO NEXT BUFFER + HRRZ AC1,TAC ;AND CHECK ITS ADDRESS TO SEE IF IN BOUNDS + PUSHJ PDP,UADRCK + TRNE IOS,IOACT ;IS THE DEVICE ALREADY ACTIVE + JRST INPT0C ;YES + MOVE AC1,DEVMOD(DEVDAT) ;GET DEVICE CHARACTERISTIC WORD + HRLI TAC,PROG ;SET FOR RELOCATION + TLNN AC1,DVTTY ;IS IT A TTY? + HRR TAC,@TAC ;GET POINTER 1 BUFFER AHEAD OF NEXT BUFFER + ; IF NOT TTY. + HRRZ AC1,TAC ;SEE IF USER HAS CLOBBERED POINTER + PUSHJ PDP,UADRCK + SKIPL @TAC ;IS THE USE BIT SET? + PUSHJ PDP,CALIN ;NO, START SERVICE ROUTINE FILLING EMPTY BUFFER +INPT0C: HRR TAC1,@TAC1 ;GET USE BIT FOR NEXT BUFFER +INPT0A: SKIPGE @TAC1 ;IS USE BIT SET YET?(BUFFER FILLED YET?) + JRST INPUT2 ;YES, RETURN IMMEDIATELY TO USER + INPT2: PUSHJ PDP,WSYNC ;NO, PUT JOB IN IO WAIT TILL BUFFER FILLED. + SKIPL @TAC1 ;RETURN WHEN BUFFER FILLED. CHECK TO MAKE SURE. + JRST INEOF ;NO, MUST BE EOF OR ERROR +INPUT2: ADDI TAC1,1 ;YES, GET WORD COUNT AS SET BY IO SERVICE + HRRZ ITEM,@TAC1 ;RH OF 3RD WORD(FIRST SO-CALLED DATA WORD) + SOJA TAC1,IOSETC ;SET ITEM COUNT AND BYTE POINTER + ; IN 3 WORD HEADER AND RETURN TO USER + +INPT1: TRNN IOS,IOACT + PUSHJ PDP,CALIN + JRST INPT2 + + +INEOF: TDNN IOS,[XWD IOEND,IODERR+IOBKTL+IODTER+IOIMPM] + ; EOF OR ERROR BIT SET BY SERVICE ROUTINE + JSP DAT,UUOERR ;NO,MONITOR ERROR AT UUO LEVEL + TLNE IOS,IOEND ;IS THIS EOF? + TRO IOS,IODEND ;YES, SET USER EOF BIT. + IORM IOS,DEVIOS(DEVDAT) + POPJ PDP, ;RETURN TO USER'S PROGRAM + + + +;HERE ON FIRST INPUT AFTER INIT, INIT & LOOKUP, OR INIT & LOOKUP & INPUT +INPUTF: ANDCAB TAC,@JBUF ;MARK THAT BUFFERS HAVE BEEN REFER + ; BY CLEARING SIGN BIT OF 1ST WORD IN 3 WORD + ; IN 3 WORD BUFFER HEADER + JUMPE TAC,INPUT3 ;HAS A RING BEEN SET UP YET? + HRRZ AC1,TAC1 ;YES ADDRESS CHECK FIRST USER BUFFER + PUSHJ PDP,UADRCK ; + SKIPG @TAC1 ;IS USE BIT SET IN FIRST USER INPUT BUFFER? + ; CAN HAPPEN IF TTY AND USER HAS TYPED + ; IN LINE AFTER INBUF BUT BEFORE FIRST INPUT UUO + JRST INPUT2 ;YES, DO NOT CALL SERVICE ROUTINE(SCNSER) + ; SINCE USER BUFFER ALREADY HAS DATA + HRRM TAC,DEVIAD(DEVDAT) ;YES, STORE ADR. OF 2ND WORD OF + ; A BUFFER FOR SERVICE ROUTINE + PUSHJ PDP,CALIN ;YES. GO START IO SERVICE ROUTINE + ; FILLING BUFFER + JRST INPT0A +INPUT3: HRRI UUO,2 ;BUFFERS NOT SETUP YET. + ; SET UP 2 + PUSHJ PDP, UINBF + HLLZS UUO ;CLEAR RIGHT HALF + JRST IN1 + + +INDMP: PUSHJ PDP,WSYNC ;INPUT DUMP + PUSHJ PDP,DDI(DSER) ;CALL SERVICE ROUTINE + JRST WAIT1 ;THEN WAIT TILL IO FINISHED BEFORE + ; RETURNING TO USER. + +EXTERNAL JOBPFI,USRREL + +CALIN: TLNE IOS,IOEND + POPJ PDP, + PUSH PDP,TAC1 + PUSH PDP,JBUF + HRRZ AC1,DEVIAD(DEVDAT) ;IS FIRST ADR. ABOVE JOB DATA AREA? + CAIG AC1,JOBPFI + JRST ADRERR ;NO, PRINT ERROR AND STOP JOB + HLRZ AC2,@DEVIAD(DEVDAT) ;GET LENGTH OF BUFFER + TRZ AC2,IOUSE ;CLEAR USE BIT IN CASE IT IS ON(TTY) + ADD AC1,AC2 + CAMLE AC1,USRREL ;IS LAST ADDRESS IN BOUNDS? + JRST ADRERR ;NO, STOP JOB AND PRINT ERROR + PUSHJ PDP,DIN(DSER) ;DISPATCH TO IO SERVICE ROUTINE + POP PDP,JBUF + POP PDP,TAC1 + POPJ PDP, + ,CALLING SEQUENCE +, OUTPUT D, +, EXIT +,OR +, OUTPUT D, ADR +, EXIT + +,IF INPUT IS ACTIVE, WAIT FOR IT TO COMPLETE. +,IF DUMP MODE WAS SELECTED BY THE LAST INIT UUO OR SETSTS UUO +, THE PROGRAM WAITS UNTIL THE DEVICE IN INACTIVE AND THEN +, WRITES THE DUMPFILE AND RETURNS CONTROL TO THE USER'S PROGRAM +, WHEN IO HAS COMPLETED. +,IF THE MODE IS NOT DUMP, THEN +,1) IF ADR IS NOT ZERO, WAIT FOR DEVICE TO BECOME INACTIVE THEN SET THE +, CURRENT BUFFER ADDRESS EQUAL TO ADR AND AN INDICATOR (JBFADR0) +, SPECIFYING THAT THIS BUFFER RING HAS NEVER BEEN REFERENCED FROM THE +, USER'S PROGRAM BY AN INPUT OR AN OUTPUT UUO. OTHERWISE, GO TO +, 2) DIRECTLY. + +,2) IF THE BUFFER RING HAS NEVER BEEN REFERENCED (JBFADR0=1), THE +, BUFFER IS CLEARED, IOUSE SET TO ZERO AND +, IF THE CURRENT BUFFER ADDRESS IS ZERO, A TWO BUFFER RING IS SET UP. +, THEN GO TO 8 +, +,3) IF THE BUFFER RING HAS BEEN REFERENCED (JBFADR0=0 ,THEN A CHECK IS +, MADE TO DETERMINE IF THE WORD COUNT IS TO BE COMPUTED. +, IF THE WORD COUNT IS TO BE COMPUTED (IOWC=0), IT IS SET EQUAL +, TO THE ADDRESS FOR THE LAST DATA WORD MINUS THE ADDRESS OF THE +, BUFFER MINUS ONE. + +,4) IOUSE IS SET TO ONE, INDICATING THAT THE BUFFER IS FULL OR BEING +, EMPTIED, AND THE CURRENT BUFFER ADDRESS IS ADVANCED. + +,5) IF THE DEVICE IS NOT ACTIVE (IOACT=0), OUTPUT IS STARTED. +,6) IF THE CURRENT BUFFER IS FULL OR BEING EMPTIED (IOUSE=1), +, THE PROGRAM WAITS UNTIL THE DEVICE FINISHES THE BUFFER +, (THE OUTPUT SERVICE ROUTINE CLEARS THE USE BIT WHEN +, IT FINISHES OUTPUTTING A BUFFER). +,7) THE CURRENT BUFFER IS CLEARED. +,8) THE ITEM POINTER IS INITIATED TO THE CURRENT BUFFER ADDRESS+1 +, AND THE ITEM COUNT IS SET TO THE PRODUCT OF THE BUFFER SIZE +, MINUS ONE AND THE INTEGER PART OF 36/BYTE SIZE. +,9) RETURN TO THE USER'S PROGRAM + ;HERE ON OUTPUT UUO +EXTERNAL USRJDA,PIOMOD + +UOUT: TLO DEVDAT,OUTPB ;SET OUTPUT UUO BIT + TLZ DEVDAT,OCLOSB ;CLEAR CLOSE OUTPUT BIT + +;HERE FROM DEVICE SERVICE ROUTINES ON CLOSE UUO + +INTERNAL OUT + +OUT: TLNN IOS,IO ;IS THIS DEVICE ALREADY DOING INPUT? + PUSHJ PDP,WAIT1 ;YES, WAIT TILL IT BECOMES INACTIVE + HLLM DEVDAT,USRJDA(UCHN);SAVE NEW BIT SETTINGS. + LDB TAC,PIOMOD ;GET DATA MODE SET BY INIT OR SETSTS. + CAIL TAC,SD ;IS IT DUMP MODE(SD,DR,D)? + JRST OUTDMP ;YES. + PUSHJ PDP,OUTA ;NO, CHECK FOR NON-ZERO ADDRESS(USER + ; CHANGING RING) + HLR JBUF,DEVBUF(DEVDAT) ;REL. ADDR. OF OUTPUT BUFFER HEADER + MOVEI AC1,2(JBUF) ;CHECK END OF 3 WORD HEADER + PUSHJ PDP,UADRCK + HRLI JBUF,PROG ;SET INDEX FIELD FOR RELOCATION. + SKIPG TAC1,@JBUF ; CHECK FIRST WORD OF BUFFER HEADER + JRST OUTF ;RING NOT SET UP OR FIRST REFERENCE TO RING + AOS JBUF ;COMPUTE WORD COUNT FROM BYTE POINTER + HRRZ TAC,@JBUF ;GET RH OF BYTE POINTER. + ADDI TAC1,1 ;REL. ADDR. OF 3RD WORD IN BUFFER. + SKIPE TAC + SUB TAC,TAC1 ;DISTANCE FILLED BY USER. + HRLI TAC1,PROG + TRNE IOS,IOWC ;DOES USER WANT SYSTEM TO COMPUTE WORD + ; COUNT FROM BYTE POINTER? + JRST OUT2 ;NO. + HRRZ AC1,TAC1 ;PROCEED ONLY IF ADDR. OF WORD COUNT IN BOUNDS + ADDI AC1,(TAC) ;FORM REL. ADR OF LAST WORD TO OUTPUT + PUSHJ PDP,UADRCK + HRRM TAC,@TAC1 ;YES, STORE WORD COUNT IN 3RD WORD OF BUFFER. + OUT2: SUBI JBUF,1 ;REL. ADDR. OF 1ST WORD IN HEADER + ; (POINTER TO CURRENT BUFFER). + SUBI TAC1,1 ;REL. ADDR. OF 2ND WORD IN BUFFER + ; (LINK TO NEXT BUFFER). + HRLZI TAC,IOUSE ;FLAG CURRENT BUFFER CONTAINS ACTIVE DATA. + IORB TAC,@TAC1 + HRRM TAC,@JBUF ;ADVANCE CURRENT BUFFER ADDRESS + MOVE IOS,DEVIOS(DEVDAT) ;IS DEVICE ACTIVE? + TRNN IOS,IOACT + PUSHJ PDP,DOU(DSER) ;NO,START OUTPUT. + HLR JBUF,DEVBUF(DEVDAT) ;JBUF TO REL. ADDR. OF BUFFER HEADER + HRLI JBUF,PROG ;SET TO RELOCATE + MOVE TAC1,@JBUF ;TAC1 TO REL. ADDR. OF 2ND WORD OF BUFFER. + HRRZ AC1,TAC1 + PUSHJ PDP,UADRCK + HRLI TAC1,PROG + MOVEI TAC,@JBUF + HLLZS 1(TAC) + SKIPG @TAC1 ;HAS SERVICE ROUTINE EMPTIED NEXT BUFFER + ; YET (USE BIT = 0)? + PUSHJ PDP,WSYNC ;NO, WAIT. + JRST OUTS ;RETURN TO USER. + + +OUTF: SKIPE TAC1,@JBUF + JRST OUTF1 + HRRI UUO,2 + PUSHJ PDP,UOUTBF + HLR JBUF,DEVBUF(DEVDAT) + HRLI JBUF,PROG +OUTF1: HRLZI TAC, IOUSE + ANDCAB TAC, @JBUF ;IOUSE:=0 + HRRM TAC,DEVOAD(DEVDAT) +OUTS: HRRZ TAC,@JBUF ;CLEAR NEXT OUTPUT BUFFER. + PUSHJ PDP,BUFCLR ;BEING CLEARED. + JRST ADRERR ;ADDRESS CHECK + HRR TAC1,@JBUF + HRLI TAC1,PROG + LDB ITEM,[POINT 17,@TAC1,17] + SOJA ITEM,IOSETC + ; ADDRESS+1 + ; JBFCTR:=(BUFFER SIZE-1)*[36/BYTE + ; SIZE] + ; RETURN TO USER'S PROGRAM + +OUTDMP: PUSHJ PDP,WSYNC + PUSHJ PDP,DDO(DSER) + JRST WAIT1 ;WAIT BEFORE RETURNING TO USER + +,CALLING SEQUENCE: +, PUSHJ PDP,OUTA +, EXIT ALWAYS RETURNS HERE +,IF THE ADDRESS FIELD OF AC UUO IS ZERO,EXIT. OTHERWISE,CHECK IOACT. +,IF IOACT=1, WAIT FOR IOACT=0. +,SET JBFADR18-35:=ADDRESS FIELD OF AC UUO. JBFADR0:=1 AND EXIT. + + INTERN OUTA +OUTA: TRNN UUO,777774 ;IS BUFFER ADDRESS SPECIFIED? + POPJ PDP, ;NO + PUSHJ PDP,WAIT1 + HLR JBUF,DEVBUF(DEVDAT) + HRLI JBUF,PROG + HRRM UUO,@JBUF + HRRM UUO,DEVOAD(DEVDAT) + HRLZI TAC,IOUSE + ANDCAM TAC,@JBUF + POPJ PDP, ;RETURN + ,RELEASE A DEVICE + +INTERNAL RELEA1,RELEA2,RELEA3,RELEA5,RELEA6,RELEA9 +EXTERNAL USRJDA,USRHCU,CPOPJ,SYSTAP,STUSER,STREQ,STAVAL,PJOBN,IADPTR + +RELEA0: +RELEA2:RELEA3: +RELEA1: TRZ UUO,-1 ;CLOSE BOTH INPUT AND OUTPUT + PUSHJ PDP,CLOSE1 + PUSHJ PDP,WAIT1 ;WAIT FOR DEVICE TO BECOME INACTIVE +RELEA5: PUSHJ PDP,DRL(DSER) ;DISPATCH TO DEVICE SERVICE ROUTINE + MOVEI IOS,IOACT ;CLEAR IO ACTIVE BIT + ANDCAB IOS,DEVIOS(DEVDAT) ;AND RETURN WITH IOS SET + LDB TAC1,IADPTR ;GET COUNT OF NO OF CHANS DEVICE ON(IF DTA) + SOS TAC1 ;COUNT DOWN BY ONE + MOVE TAC,DEVMOD(DEVDAT) + TLNE TAC,DVDTA ;DEVICE A DTA? + DPB TAC1,IADPTR ;YES, STORE UPDATED COUNT + SETZB DAT,USRJDA(UCHN) ;CLEAR DEVICE ASSIGNMENT + MOVE TAC,USRHCU ;HIGHEST IO CHANNEL IN USE +RELEA4: HRRZ TAC1,USRJDA(TAC) + JUMPN DAT,RELE4A ;NON-ZERO CHAN. ALREADY? + MOVE DAT,TAC1 ;NO, SET DAT WHEN FIRST(HIGHEST) FOUND + MOVEM TAC,USRHCU ;STORE HIGHEST IN USE CHANNEL +RELE4A: CAIE TAC1,(DEVDAT) ;IS THIS DEVICE SAME AS ONE BEING RELEASED? + SOJGE TAC,RELEA4 + JUMPGE TAC,CPOPJ ;EXIT IF ON ANOTHER CHANNEL + HLLZS DEVIAD(DEVDAT) ;CLEAR INPUT BUFFER ADDRESS + HLLZS DEVOAD(DEVDAT) ;AND OUTPUT BUFFER ADDRESS. + ;CALLED FROM ERROR STOP ROUTINE(ESTOP) +RELEA9: MOVE TAC,DEVNAM(DEVDAT) ;IS THIS SYSTEM TAPE? + CAME TAC,[SIXBIT /DSK/] ;DSK IS NEVER QUEUED + CAME TAC,SYSTAP + JRST RELEA7 ;IS DISK OR NOT SYSTEM TAPE + SKIPN STUSER ;HAS COUNT ALREADY BEEN REDUCED AT ESTOP? + JRST RELEA7 ;YES + SETZM STUSER ;YES, CLEAR SYSTEM USER NO. + SOSL STREQ ;YES, REDUCE COUNT + SETOM STAVAL ;SOMEONE IS WAITING, SET AVAILABLE FLAG/ +RELEA7: MOVEI TAC1,ASSPRG ;CLEAR ASSIGNED BY PROGRAM BIT +RELEA6: ANDCAB TAC1,DEVMOD(DEVDAT) ;CALLED FROM DEASSIGN + TRZ TAC1,777 ;CLEAR JOB NO. FIELD +INTERNAL FTDISK +IFE FTDISK,< + TDNN TAC1,[XWD TTYATC,ASSCON+ASSPRG] + DPB TAC1,PJOBN ;CLEAR JOB NUMBER IF ALL 3 BITS OFF + POPJ PDP, ;IE ASSIGNED BY CONSOLE,PROGRAM, OR +> +IFN FTDISK, + +,CALLING SEQUENCE +, STATO D,MASK +, EXIT1 ALL SELECTED BITS ARE 0 +, EXIT2 SOME SELECTED BITS ARE 1 +,TESTS BITS OF I/O STATUS WORD OF DEVICE ON USER'S CHANNEL D WHICH +,ARE SELECTED BY MASK. + + + INTERN USTATO +USTATO: TRNE IOS,(UUO) ;SKIP IF ANY INDICATED BITS ARE ONE + AOS (PDP) + POPJ PDP, ;RETURN TO USER + + +,CALLING SEQUENCE +, STATUS D,ADR +, EXIT ALWAYS RETURNS HERE +,STORES I/O STATUS WORD OF DEVICE ON CHANNEL D IN LOCATION ADR. + + +INTERN USTATS + + +USTATS: HRRZ TAC,IOS ;GET USER HALF OF IOS. + JRST STOTAC ;ADDRESS CHECK AND STORE IN USER AREA + + +,CALLING SEQUENCE +, STATZ D,MASK +, EXIT1 SOME SELECTED BITS ARE 1 +, EXIT2 ALL SELECTED BITS ARE 0 + +,TESTS BITS OF I/O STATUS WORD OF DEVICE ON USER'S +,CHANNEL D WHICH ARE SELECTED BY MASK. + + INTERN USTATZ + +USTATZ: TRNN IOS,(UUO) ;SKIP IF ALL INDICATED BITS ARE ZERO + AOS (PDP) + POPJ PDP, ;RETURN TO USER + ;IN UUO - LIKE INPUT SKIPS IF EOF OR ERRORS + +INTERNAL TIN + +TIN: PUSHJ PDP,IN ;DO INPUT UUO + TRNE IOS,IOBKTL+IODTER+IODERR+IOIMPM+IODEND + AOS (PDP) + POPJ PDP, + + +;OUT UUO - LIKE OUTPUT - SKIPS IF ERRORS + +INTERNAL TOUT + +TOUT: PUSHJ PDP,UOUT ;DO OUTPUT UUO + TRNE IOS,IOBKTL+IODTER+IODERR+IOIMPM + AOS (PDP) + POPJ PDP, + + +;5 UUOS FOR EACH INSTALLATION TO DEFINE +;OPCODES 42-46 + + + SUBTTL IOCSS - COMMON IO SUBROUTINES + +;ROUTINE TO ADVANCE OUTPUT BUFFER AT INTERRUPT LEVEL + +;CALL: PUSHJ PDP,ADVBFE +, EXIT1 RETURN IF NEXT BUFFER IS EMPTY +, EXIT2 RETURN IF NEXT BUFFER IS FULL +,CLEARS THE USE BIT (IOUSE:=0) OF THE BUFFER POINTED TO BY THE +,OUTPUT BUFFER ADDRESS (DEVOAD) OF THE CURRENT DEVICE DATA BLOCK +,AND ADVANCES THE BUFFER ADDRESS TO THE NEXT BUFFER IN THE RING. +,UPON RETURN, SKIPS IF THE NEXT BUFFER IS FULL. +;SECOND WORD OF NEXT BUFFER IS ADDRESS CHECKED TO +;MAKE SURE IT IS NOT IN JOB DATA AREA OR ABOVE USER AREA +;THE SECOND WORD OF CURRENT BUFFER WAS CHECKED AT UUO LEVEL +;OR PREVIOUS CALL TO ADVBFE + +INTERNAL ADVBE1,ADVBFE +EXTERNAL XJBPFI,CPOPJ + +ADVBFE: MOVEI TAC1,@DEVOAD(DEVDAT) ;ABS. ADR. OF 2ND WORD OF LAST BUF. + JUMPE TAC1,CPOPJ ;HAS DEVOAD BEEN CLEARED BY RELEASE? + MOVEM IOS,-1(TAC1) ;NO. STORE IO STATUS WORD(ERROR BITS) + ; IN FIRST WORD OF BUFFER + MOVSI TAC,IOUSE ;IOUSE:=0 + ANDCAB TAC,(TAC1) ;CLEAR USE BIT IN 2ND WORD + ; ADRESS CHECKED WHEN STORED IN DEVOAD + ; DEVICE ACTIVE SINCE THEN + HRLZ TAC,TAC ;NEXT BUFFER ADR. TO LH + CAMLE TAC,XJBPFI ;IS IT IN IO PROTECTED PART OF JOB DATA AREA? + CAML TAC,PROG ;NO, IS IT GREATER OR EQUAL TO LAST WORD IN USER AREA? + POPJ PDP, ;YES, DO NOT STORE NEXT ADDRESS + ; CATCH ERROR LATER AT UUO LEVEL + HLRM TAC,DEVOAD(DEVDAT) ;NOW SAFELY STORE NEXT BUFFER ADRESS + +;ENTER HERE FROM SCNSER TO CHECK IF NEXT BUFFER FULL OF DATA YET + +ADVBE1: SKIPL @DEVOAD(DEVDAT) ;IS IOUSE=0? + POPJ PDP, ;EXIT1. BUFFER IS EMPTY + JRST ADVBF1 ;GO SEE IF USER TYPED CONTROL C + ; OR EXEC IS WAITING TO SHUFFLE JOB + +;ROUTINE TO ADVANCE INPUT BUFFER AT INTERRUPT LEVEL + +;CALL: PUSHJ PDP,DEVBFF +, EXIT1 RETURN IF NEXT BUFFER IS FULL +, EXIT2 RETURN IF NEXT BUFFER IS EMPTY +,SETS THE USE BIT (IOUSE:=1) OF THE BUFFER POINTED TO BY THE +,INPUT BUFFER ADDRESS (DEVIAD) OF THE CURRENT DEVICE DATA BLOCK +,AND ADVANCES THE BUFFER ADDRESS TO THE NEXT BUFFER IN THE RING. +,UPON RETURN, SKIPS IF THE NEXT BUFFER IS EMPTY. +;SECOND WORD OF NEXT BUFFER IS ADDRESS CHECKED TO MAKE SURE +;IT IS NOT IN IO PROTECTED PART OF JOB DATA AREA OR ABOVE +;USER AREA +;ALSO END OF BUFFER IS CHECKED TO MAKE SURE NOT ABOVE JOB AREA + +INTERNAL ADVBFF +EXTERNAL XJBPFI,PJOBN,JBTSTS,CPOPJ + +ADVBFF: MOVEI TAC1,@DEVIAD(DEVDAT) ; ABS. ADR. OF LAST INPUT BUFFER + JUMPE TAC1,CPOPJ ;HAS DEVIAD BEEN CLEARED BY RELEASE? + MOVEM IOS,-1(TAC1) ;NO. STORE IOS WORD IN FIRST WORD OF BUF. + MOVSI TAC,IOUSE ;IOUSE:=1 + IORB TAC,(TAC1) ;FLAG THAT DATA HAS BEEN INPUT + HRLZ TAC,TAC ;NEXT BUFFER TO LEFT HALF + CAMLE TAC,XJBPFI ;IS ADR. IN PROT. PART OF JOB DATA AREA? + CAML TAC,PROG ;NO, WILL SECOND AND THIRD WORD FIT? + POPJ PDP, ;NO, GIVE ERROR RETURN SO DEVICE WILL STOP + HLRM TAC,DEVIAD(DEVDAT) ;YES, SAFELY STORE ADDRESS OF NEXT BUFFER + SKIPGE TAC1,@DEVIAD(DEVDAT) ;IS NEXT INPUT BUFFER STILL FULL? + POPJ PDP, ;YES, GIVE STOP RETURN + TRZ TAC1,-1 ;XWD LENGTH OF BUFFER,0 + ADD TAC,TAC1 ;ADD LENGTH TO REL. ADR. OF SECOND WORD + ; LENGTH=NO. WORDS WHICH FOLLOW SECOND + CAMLE TAC,PROG ;IS LAST WORD IN BOUNDS? + POPJ PDP, ;NO, GIVE STOP RETURN +ADVBF1: LDB TAC,PJOBN ;GET JOB NO. FROM DEVICE DATA BLOCK + SKIPGE TAC,JBTSTS(TAC) ;IS RUN BIT ON IN JOB STATUS WORD + TLNE TAC,SHF+CMWB ;YES, SYSTEM WAITING TO SHUFFLE, + ; EXECUTE A COMMAND, OR TO SWAP JOB OUT? + ; SHF SET BY SWAPPER TO STOP IO IF IT WANTS TO SWAP JOB OUT + ; 2 RELOC REG SOFTWARE DOES NOT SET SHF IN LOW SEG + ; IF JOB HAS 2 SEG, SINCE HIGH SEG CAN BE + ; SWAPPED EVEN THOUGH ACTIVE IO IN LOW SEG. + ; THUS A LIMITED FORM OF MONITOR BUFFERING IS ACHIEVED + POPJ PDP, ;YES,PRETEND NEXT BUFFER NOT AVAILABLE + TRNN IOS,IOCON ;NEXT BUFFER AVAILABLE. DISCONTINUOUS MODE? + AOS (PDP) ;NO + POPJ PDP, ;YES + +;ROUTINE TO ADDRESS CHECK AT UUO LEVEL ONLY +;CALL HRRZ AC1,REL ADR. +; PUSHJ PDP,UADCK1 +; NEVER RETURNS IF ERROR,STOPS JOB AND PRINTS ERROR +;BAD ADR. IF IN LOC 20-JOBPFI IN JOB DATA AREA +;OR IF ABOVE PROTECTION(USRREL) FOR CURRENT JOB + +INTERNAL UADCK1 +EXTERNAL USRREL,JOBPFI + +UADCK1: TRNN AC1,777760 ;IN USER ACS? + POPJ PDP, ;YES, ADDRESS IS OK + +;ROUTINE TO ADDRESS CHECK AT UUO LEVEL ONLY +;USER ACS ARE ALSO ILLEGAL(ADR IS FOR IO USE LATER AT +;INTERRUPT LEVEL) +;CALL: HRRZ AC1,REL.ADR. +; PUSHJ PDP,UADRCK +; NEVER RETURN IF ERROR + +INTERNAL UADRCK +EXTERNAL USRREL,JOBPFI + +UADRCK: CAILE AC1,JOBPFI ;IS ADR. IN IO PROT. PART OF JOB DATA AREA? + CAMLE AC1,USRREL ;NO, IS IT ABOVE PROTECT.? + JRST ADRERR ;YES, STOP JOB AND PRINT ERROR + POPJ PDP, ;NO + +;ROUTINE TO ADDRESS CHECK AT ANY LEVEL +;CALL: MOVE PROG,[XWD PROT.,RELOC,] +; HRRZ TAC,REL. ADR. +; PUSHJ PDP,IADRCK +; ERROR RETURN(ERROR MESSAGE NOT PRINTED,JOB NOT STOPPED) +; OK RETURN + +INTERNAL IADRCK +EXTERNAL JOBPFI,CPOPJ1 + +IADRCK: MOVS TAC1,PROG ;GET PROTECTION(TO RH) + CAILE TAC,JOBPFI ;ADR. ABOVE PROT. PART OF JOB DATA AREA? + CAILE TAC,(TAC1) ;YES, BELOW OR EQUAL TO PROTECT.? + POPJ PDP, ;NO + JRST CPOPJ1 ;YES, SKIP RETURN + +;ROUTINE TO CHECK VALIDITY OF A DUMP MODE COMMAND LIST +;WHICH IS: +;A LIST OF 0 OR MORE IOWD FORMAT WORDS +; TERMINATED BY A GOTO WORD(LH=0) +; WHICH POINTS TO ANOTHER LIST OF 0 OR MORE IOWD FORMAT WORDS ETC. +; UNTIL A GOTO WORD IS ENTIRELY ZERO +; +;SINCE MONITOR DOES NOT RESCHEDULE WHEN IN EXEC MODE +;A MAXIMUM LIST OF 100 IS IMPOSED + +;CALL: MOVE UUO,[XWD PROG,REL. ADR. OF FIRST COMMAND] +; PUSHJ PDP,COMCHK +; ADDRESS CHECK RETURN(ERROR ROUTINE IS NOT CALLED) +; OK RETURN, SUM OF LH OF IOWDS IN DAT +; USER ADDRESS OF FIRST IOWD LH PROG IN INDEX FIELD IN UUO +; + +INTERNAL COMCHK +EXTERNAL JOBPFI,USRREL,TPOPJ1,USRHCU + +COMCHK: PUSH PDP,UUO ;SAVE POINTER TO LIST + PUSH PDP,AC2 + MOVEI AC1,JOBPFI ;HIGHEST IO PROTECTED LOC. IN JOB DATA AREA + SKIPGE USRHCU ;IS A SAVE OR GET IN PROGRESS(MAYBE RUN UUO) + MOVEI AC1,JOBSAV ;YES, HIGHEST LOC. NOT WRITTEN BY SAVE + SETZB DAT,AC2 ;CLEAR WORD COUNT AND ADDRESS OF FIRST IOWD + MOVEI ITEM,100 ;ONLY 100 LISTS + SKIPA TAC1,UUO ;CHECK THE START OF LIST. +COMCK0: HRR UUO,TAC1 ;CHANGE COMMAND LIST POINTER ON GO TO WORD + HRRZ TAC,TAC1 ;SET UP TAC FOR IADRCK + TRNN TAC,777760 ;IS LIST IN THE ACS? + JRST COMCK1 ;YES. THAT'S OK. + PUSHJ PDP,IADRCK + JRST COMCKE ;BAD ADDR. +COMCK1: SOJLE ITEM,COMCKE ;EXCEEDED 100 YET? + SKIPN TAC1,@UUO ;NO. GET NEXT IOWD. END OF LIST? + JRST COMCK2 ;YES + JUMPG TAC1,COMCK0 ;NO. IS IT A GO TO WORD? + HLRE TAC,TAC1 ;NO. SAVE NEGATIVE WORD COUNT + HRRZS TAC1 ;GET LOWEST ADDRESS-1 + CAMGE TAC1,AC1 ;IS IT GREATER THAN LOC. PROTECTED + ; FROM IO IN JOB DATA AREA? + JRST COMCKE ;NO. ERROR RETURN + SUB TAC1,TAC ;YES. COMPUTE LAST LOC. + CAMLE TAC1,USRREL ;IS LAST LOC. IN BOUNDS? + JRST COMCKE ;NO. ERROR RETURN + SUB DAT,TAC ;YES. ACCUMULATE NEG. WORD COUNT + SKIPN AC2 ;IS THIS THE FIRST IOWD? + MOVE AC2,UUO ;YES. SAVE ADDRESS IN AC2 + AOJA UUO,COMCK1 ;GO GET NEXT IOWD + COMCK2: SKIPE AC2 ;ARE THERE ANY IOWDS WITH LH NOT 0? + MOVE UUO,AC2 ;YES, POINT UUO TO FIRST SUCH IOWD. + POP PDP,AC2 + JRST TPOPJ1 ;REMOVE SAVED UUO AND SKIP RETURN + + +COMCKE: POP PDP,AC2 + POP PDP,UUO ;RESTORE ORIGINAL UUO + POPJ PDP, ;ERROR RETURN + INTERNAL ASSASG,FTDISK +EXTERNAL SCNON,SCNOFF,PJOBN + +;ASSIGN DEVICE IF UNASSIGNED +;CALL: MOVE ITEM, JOB NUMBER +; MOVE DEVDAT, ADDR. OF DDB +; MOVEI TAC1, EITHER ASSPRG OR ASSCON +; PUSHJ PDP, ASSASG +; CAN'T ASSIGN RETURN +; ASSIGNED RETURN + + +ASSASG: IFN FTDISK, + NOSCHEDULE ;DISABLE SCHEDULING + LDB TAC,PJOBN ;GET JOB NUMBER IN DEV DATA BLOCK + CAMN TAC,ITEM ;IS IT ALREADY ASSIGNED TO THIS JOB + JRST ASSAS1 ;YES + MOVEI TAC, ASSPRG+ASSCON ;NO, IS IT ASSIGNED TO ANOTHER JOB? + CONO PI,SCNOFF ;TURN SCANNER OFF + TDNE TAC, DEVMOD(DEVDAT) ;ARE EITHER ASSIGNED BITS SET? + JRST ASSAS2 ;YES + DPB ITEM,PJOBN ;NO, STORE JOB NUMBER +ASSAS1: IORM TAC1,DEVMOD(DEVDAT) ;SET ONE OF ASSIGN BITS + AOS (PDP) +ASSAS2: CONO PI,SCNON ;TURN SCANNER CHAN. BACK ON + SCHEDULE ;SCHEDULING + POPJ PDP, + ;ROUTINE TO SEARCH FOR A DEVICE +;CALL: HRR ITEM,JOB NUMBER +; MOVE TAC,[SIXBIT .DEVICE NAME.] +; PUSHJ PDP, DEVSRC +; NOT FOUND +; FOUND + + INTERNAL DEVLG,DEVSRC,DEVPHY + EXTERNAL SYSTAP,DEVOPR,TTYFND,CPOPJ1,DEVLST,PJOBN,GETDDB + +DEVSRC: +IFN FTLOGIN,< + MOVSI DEVDAT,JLOG ;DO NOT ALLOW LOGICAL NAMES IF THE JOB IS NOT + ; NOT LOGGED IN OR IS IN THE PROCESS OF BEING LOGGED OUT + TDNE DEVDAT,JBTSTS(ITEM) ;OTHERWISE USER CAN RUN OWN LOGOUT PROGRAM + ; JLOG SET TO 0 IN COMMAND DECODER ON KJOB +> + PUSHJ PDP, DEVLG ;SEARCH LOGICAL NAMES FIRST + JRST DEVPHY ;NOT FOUND, SEARCH PHYSICAL NAMES + JRST CPOPJ1 ;FOUND + +;SEARCH LOGICAL NAMES + +DEVLG: HLRZ DEVDAT,DEVLST ;BEGINNING OF DDB CHAIN +DEVLP0: CAME TAC,DEVLOG(DEVDAT) ;COMAPRE WITH LOGICAL NAME + JRST DEV0 ;NO MATCH + LDB TAC1,PJOBN ;DOES THE LOGICAL NAME BELONG TO THIS JOB? + CAMN TAC1,ITEM + JUMPN TAC,CPOPJ1 ;YES, GIVE SUCCESSFUL RET. IF NAME NOT 0 +DEV0: HLRZ DEVDAT,DEVSER(DEVDAT) ;NO, KEEP LOOKING + JUMPN DEVDAT,DEVLP0 + POPJ PDP, ;FINISHED AND NOT FOUND + +;SEARCH PHYSICAL NAMES + +DEVPHY: CAMN TAC,[SIXBIT /OPR/] ;IS IT "OPR"? + MOVE TAC,DEVOPR ;YES, CHANGE TO OPERATOR'S TTY + CAMN TAC,[SIXBIT /SYS/] ;IS IT "SYS"? + SKIPA TAC,SYSTAP ;YES, CHANGE TO SYSTEM TAPE DEVICE NAME + TDZA TAC1,TAC1 ;NO, CLEAR SYSTEM TAPE FLAG + MOVEI TAC1,SYSDEV ;YES, SET SYSTEM TAPE FLAG + HLRZ DEVDAT,DEVLST ;SEARCH DEVICE DATA BLOCKS +DEVLP1: + TLO DEVDAT,(TAC1) ;SET SYSTEM TAPE BIT IF SEARCHING FOR SYS + CAMN TAC,DEVNAM(DEVDAT) ;MATCH OF PHYSICAL NAME? + JUMPN TAC,CPOPJ1 ;YES, GIVE OK RET. IF NAME IS NOT 0 + HLRZ DEVDAT,DEVSER(DEVDAT) + JUMPN DEVDAT,DEVLP1 + CAME TAC,[SIXBIT /TTY/] ;IS THIS PUBLIC LOGICAL NAME TTY? + JRST GETDDB ;SEE IF IT'S A TTY. + PUSH PDP,DAT ;SAVE OUTPUT BYTE POINTER(TTY) OR INIT. ARG. ADR. + PUSHJ PDP,TTYFND ;YES, FIND TTY JOB IS ATTACHED TO + POP PDP,DAT ;RESTORE + JRST CPOPJ1 ;AND GIVE SUCCESSFUL RETURN + ;ROUTINE TO SETUP N-RING IO BUFFER IN USER AREA + +;CALL: PUSHJ PDP,BUFCLC +, EXIT RETURNS HERE IF MEMORY NOT EXCEEDED +, SETS UP AN N BUFFER RING FOLLOWING THE USER'S PROGRAM, WHERE N +, IS IN THE ADDRESS FIELD OF AC UUO. +, THE BUFFER RING FORMAT IS AS FOLLOWS: +, LOCATION LH CONTENTS RH +, C(JOBFF) + 1 BUFFER C(JOBFF) +1 +, + 0(BUFFER SIZE+2) SIZE + 1(BUFFER SIZE+2) +, C(JOBFF) +1 BUFFER C(JOBFF) +1 +, +1(BUFFER SIZE+2) SIZE + 2(BUFFER SIZE+2) +, . . . +, . . . +, . . . +, C(JOBFF) + 1 BUFFER C(JOBFF) + 1 +, + (N-2)(BUFFER SIZE+2) SIZE +(N-1)(BUFFER SIZE+2) +, C(JOBFF) + 1 BUFFER C(JOBFF) + 1 +, + (N-1)(BUFFER SIZE+2) SIZE +,THEN SET BUFPNT:=IOUSE,C(JOBFF) + 1 +, AND JOBFF:=C(JOBFF) + N(BUFFER SIZE + 2) +, BUFWRD IS RESTORED. + INTERNAL BUFCLC + EXTERNAL JOBFF + +BUFCLC: PUSH PDP,BUFWRD ;SAVE BUFWRD ON STACK + LDB TAC,[POINT 12,DEVCHR(DEVDAT),35];TAC:=BUFFER SIZE + HRRZ BUFPNT,JOBFF(PROG) ;BUFPNT:=FIRST FREE LOCATION + 1 + ADDI BUFPNT,1 + HRRZ BUFWRD,BUFPNT + HRLI BUFPNT,PROG + HRL BUFWRD,TAC ;BUFWRD:=BUFFER SIZE,FIRST FREE LOC + 1 + ADDI TAC,2 ;TAC:=BUFFER SIZE + 2 + HRRZ TAC1,UUO ;TAC1:=N=ADDRESS FIELD OF AC UUO + HRRZ AC1,TAC ;BUFFER SIZE+2 + IMUL AC1,TAC1 ;TIME NO. OF BUFFERS + ADD AC1,BUFWRD ;LOC. OF FIRST BUFFER + HRRZ AC1,AC1 ;MAKE SURE POSITIVE + CAMG AC1,USRREL ;WILL THIS SPACE FIR IN USER CORE? + JRST BUFC1 ;YES, FO DO INBUF CODE + ; NO, AUTOMATICALLY EXPAND SIZE OF USER CORE + PUSH PDP,TAC ;SAVE A BUNCH OF ACS USED IN CORE AND IO WAIT + PUSH PDP,UUO + PUSH PDP,TAC1 + PUSH PDP,BUFPNT + PUSH PDP,BUFWRD + PUSH PDP,DEVDAT + PUSH PDP,DSER + MOVE ITEM,JOB ;CURRENT JOB NUMBER + MOVE TAC,AC1 ;HIGHEST USER ADR. TO TRY FOR + MOVEI UUO,UUO ;SET INDEX FIELD TO 0, SO STOTAC WILL STORE + ; NO. OF K CORE AVAILABLE IN EXEC AC UUO INSTEAD + ; OF USER'S AC UUO + PUSHJ PDP,CORUUO ;TRY TO ASSIGN CORE + JFCL ;ERROR RETURN-LET ADR CHECK HAPPEN AND STOP JOB + POP PDP,DSER + POP PDP,DEVDAT + POP PDP,BUFWRD + POP PDP,BUFPNT + POP PDP,TAC1 + POP PDP,UUO + POP PDP,TAC +BUFC1: ADD BUFWRD,TAC ;BUFWRD:=C(BUFWRD) + C(TAC) + HRRZ AC1,BUFPNT ;IS LAST ADDR IN BOUNDS? + PUSHJ PDP,UADRCK + MOVEM BUFWRD,@BUFPNT ;BUFFER HEADER+1:=C(BUFWRD) + HRR BUFPNT,BUFWRD ;BUFPNT 18-35:=C(BUFWRD 18-35) + SOJG TAC1,BUFC1 ;N:=N-1. IS N GR 0? + HRR BUFWRD,JOBFF(PROG) + ADDI BUFWRD,1 + MOVEI AC1,-2(BUFPNT) ;CHECK LAST ADR. OF HEADER + PUSHJ PDP,UADRCK + SUB BUFPNT,TAC + MOVEM BUFWRD,@BUFPNT ;LINK LAST BUFFER TO FIRST BUFFER + ADDI BUFPNT,-1(TAC) + HRRM BUFPNT,JOBFF(PROG) ;JOBFF:=C(JOBFF)+1+N(BUFFER SIZE+2) + HRR BUFPNT,BUFWRD ;BUFPNT:=IOUSE,ADDRESS OF FIRST BUFFER + ; IN RING. + HRLI BUFPNT,IOUSE + POP PDP,BUFWRD ;RESTORE BUFWRD FROM STACK. + POPJ PDP, ;RETURN + ;ROUTINE TO CLEAR IO BUFFER IN USER AREA +;CALLED AT INTERRUPT AND UUO LEVEL + +;CALL: HRRZ TAC,REL. ADR. OF 2ND WORD OF USER BUFFER +; PUSHJ PDP,BUFCLR +; ERROR RETURN MEMORY EXCEEDED +, EXIT RETURNS HERE IF MEMORY NOT EXCEEDED +, CLEARS THE WORD COUNT AND DATA AREA OF THE BUFFER WHOSE ADDRESS +, IS IN TAC 18-35. + + INTERNAL BUFCLR + EXTERNAL TPOPJ,CPOPJ1 + +BUFCLR: PUSHJ PDP,IADRCK ;IN BOUNDS? + POPJ PDP, ;NO. ERROR RETURN + HRLI TAC,PROG + PUSH PDP,TAC ;SAVE FIRST BUFFER ADR. + HLRZ TAC1,@TAC ;TAC1 18-35=SIZE + TRZ TAC1,400000 + ADD TAC,TAC1 ;LAST ADR=2ND ADR+SIZE + TLZ TAC,-1 ;CLEAR LEFT HALF + PUSHJ PDP,IADRCK ;LAST ADDRESS IN BOUNDS? + JRST TPOPJ ;NO. ERROR RETURN + HRLI TAC,PROG ;SET LAST ADR. FOR RELOC. + POP PDP,TAC1 ;RESTORE FIRST ADR. + NOSHUFF ;NO SHUFFLING + MOVEI TAC1,@TAC1 ;ABS. ADR. OF 2ND WORD OF BUFFER + HRL TAC1,TAC1 + AOBJN TAC1,.+1 ;THIRD WORD IN BUFFER + SETZM (TAC1) ;CLEAR THIRD WORD + AOS TAC1 ;SET DEST. ADR. TO 4TH WORD + BLT TAC1,@TAC ;CLEAR BUFFER + SHUFFLE ;SHUFFLING + JRST CPOPJ1 ;SUCESSFUL RETURN + +;ROUTINE TO COMPUTE 12 BIT FOLDED CHECKSUM + +;CALL: PUSHJ PDP,CKS12 +, EXIT ALWAYS RETURNS HERE +,CALCULATES FOLDED 12 BIT CHECKSUMS OF THE DATA WORDS IN THE +,BUFFER WHOSE ADDRESS IS IN AC TAC1. TWO ALGORITHMS ARE USED. +,ON RETURN, THE LEFT HALF OF AC TAC CONTAINS A CHECKSUM OBTAINED +,BY ACCUMULATING, IN ONE'S COMPLEMENT, THE DATA WORDS AND FOLDING IT. +,THE LEFT HALF OF AC DAT CONTAINS A CHECKSUM OBTAINED BY ACCUMULATING, +,IN TWO'S COMPLEMENT, THE DATA WORDS AND FOLDING IT. AC TAC1 +,CONTAINS A 1. + + INTERN CKS12 + +CKS12: ADD TAC1,PROG ;TAC1:=-WORD COUNT,ADDRESS OF FIRST DATA WORD + AOS TAC1 + HRRZ TAC,0(TAC1) + MOVNS TAC + AOS TAC1 + HRL TAC1,TAC + CLEARM TAC ;INITIALIZE TWO'S COMPLEMENT SUM +CKS12A: ADD TAC,0(TAC1) ;TWO'S COMPLEMENT ADD + AOBJN TAC1,CKS12A ;DONE? + LSHC TAC,-30 + LSH TAC1,-14 + ADD TAC,TAC1 + LSHC TAC,-14 + LSH TAC1,-30 + ADD TAC,TAC1 + TRZE TAC,770000 + AOS TAC + HRLZS TAC + MOVEI TAC1,1 ;TAC1:=1 + POPJ PDP, + ;ROUTINE TO CLEAR RESIDUE OF WORD POINTED TO BY A BYTE POINTER + +;CALL: PUSHJ PDP,CLRBYT +, EXIT ALWAYS RETURNS HERE +,CALLED WITH A BYTE POINTER IN AC TAC, IT CLEARS THE REST OF THE +,WORD POINTED TO BY THE BYTE POINTER. + + INTERNAL CLRBYT + +CLRBYT: LDB TAC1,[POINT 6,TAC,5] ;TAC1:=P + DPB TAC1,[POINT 12,TAC,11] ;TAC 0-5:=0,TAC 6-12:=P + SETZM TAC1 + DPB TAC1,TAC ;CLEAR BITS 36-P THROUGH 35 + POPJ PDP, ;RETURN + +;ROUTINE TO PUT EVEN PARITY IN ( OR TAKE IT OUT OF ) BIT 28 OF +;AC TEM. ASSUMING CHARACTER IS IN BITS 28-35 OF TEM, REST CLEAR. +;TAC IS DESTROYED. CALLED FROM PTP AND TTY SERVICE ROUTINES + +;CALL: PUSHJ PDP,PEVEN8 +; EXIT HERE WITH TEM SET TO EVEN PARITY + + INTERNAL PEVEN8 + +PEVEN8: MOVE TAC,TEM ;COPY ORIGINAL CHARACTER + IMULI TAC,200401 ;MAKE THREE COPIES OF THE CHAR + AND TAC,[OCT 11111111] ;GET THE BITS INDIVIDUALLY + IMUL TAC,[OCT 11111111] ;ADD UP THE BITS + TLNE TAC,10 ;TEST THE PARITY OF THE SUM + TRC TEM,200 ;IT WAS ODD. MAKE IT EVEN. + POPJ PDP,0 ;RETURN + ;ROUTINE TO RELEASE ALL DEVICES ASSIGNED TO JOB + +INTERNAL IORELS +EXTERNAL PUUOAC + + +IORELS: MOVEI TAC,RELEA3 ;RELEASE ALL IO DEVICES(DON'T CLOSE) + +;ROUTINE TO DO IO FOR ALL DEVICES ASSIGNED TO JOB +;CALL MOVEI TAC,ADR. OF IO SUB. +; PUSHJ PDP,IOALL +; RETURNS WITH ITEM=CURRENT JOB # ,UUO PRESERVED + +INTERNAL IOALL +EXTERNAL TPOPJ,USRHCU,USRJDA + +IOALL: PUSH PDP,TAC ;SAVE ADR. OF SUB. + PUSH PDP,UUO ;SAVE UUO + SETZB UCHN,UUO ;START WITH USER CHANNEL 0 +IOALL1: CAMLE UCHN,USRHCU ;IS IT GREATER THAN HIGHEST CHAN. USED? + JUMPN UCHN,IOALL2 ;YES - RETURN + ; IF USRCHU IS NEG - ASSUME SAVGET + ; WHICH USES CHANNEL 0 + SKIPN DEVDAT,USRJDA(UCHN) ;GET NEXT DDB ADR., IS IT IN USE? + AOJA UCHN,IOALL1 ;NO, KEEP GOING + MOVE IOS,DEVIOS(DEVDAT) + DPB UCHN,PUUOAC + MOVE DSER,DEVSER(DEVDAT) ;SETUP ADR. OF DEV. DISP. TABLE + LDB TAC,PJOBN ;GET JOB NUMBER WHICH JOB IS ASSIGNED TO + CAMN TAC,JOB ;IS IT SAME AS CURRENT JOB(SHOULD BE EXCEPT FOR 140 + ; RESTART WHILE THIS JOB WAS SWAPPED OUT) + ; DEVICE DATA BLOCKS JOB NUMBERS ARE SET TO 0 ON + ; 140 RESTART,BUT THE JOB DATA AREA DEVICE ASSIGNMENTS + ; FOR SWAPPED OUT JOBS HAVE NOT + PUSHJ PDP,@-1(PDP) ;YES,CALL THE SUB. + AOJA UCHN,IOALL1 ;INCREMENT USER CHAN. NO. +IOALL2: POP PDP,UUO ;RESTORE UUO & RETURN RESTORING TAC TOO + MOVE ITEM,JOB ;GET JOB NO. + JRST TPOPJ + + +;WAIT TILL ALL DEVICES ARE INACTIVE + +INTERNAL IOWAIT + +IOWAIT: MOVEI TAC,WAIT1 + JRST IOALL + +;KILL ALL DEVICES(RELEASE WITHOUT WAITING FOR DEVICE INACTIVE) + +INTERNAL IOKILL + +IOKILL: MOVEI TAC,RELEA5 + PUSHJ PDP,IOALL ;RELEASE ALL DEVICES WITHOUT WAITING + +;ROUTINE TO CLEAR PROTECTED JOB DATA AREA IN MONITOR +;AND RECLAIM FREE AREA ABOVE USER PROGRAM FOR IO BUFFERS +;CALL: MOVE JDAT,ADR. OF CURRENT JOB DATA AREA +; PUSHJ PDP,SETUSR + +INTERNAL SETUSR,CLRUSR +EXTERNAL USRLO1,USRLO,USRHI,JOBSA,JOBFF +EXTERNAL JOBENB,USRHCU + +SETUSR: HLRZ TAC,JOBSA(JDAT) ;RESET FIRST FREE LOC. FOR THIS JOB + MOVEM TAC,JOBFF(JDAT) +CLRUSR: SETZM JOBENB(JDAT) ;INITIALIZE APR TRAPPING (I.E., NONE) + MOVEI TAC,USRLO1 ;FIRST LOC+1 TO CLEAR + HRLI TAC,USRLO ;FIRST LOC. + SETZM USRLO + BLT TAC,USRHI + SETZM USRHCU ;CLEAR HIGHEST USER IO CHAN. IN USE + POPJ PDP, + +;ROUTINE TO FLAG DEVICE ACTIVE +;CALL MOVE IOS,IO STATUS BITS +; MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK +; PUSHJ PDP,SETACT +;CALLED BY ALL IO SERVICE ROUTINES AT UUO AND INTERRUPT LEVELS + +INTERNAL SETACT,CLRACT,STOIOS,ORACT +EXTERNAL PDVTIM,PDVCNT + +ORACT: TRO IOS,IOACT + IORB IOS,DEVIOS(DEVDAT) + JRST ORACT1 +SETACT: TRO IOS,IOACT + TLZA IOS,IOW +CLRACT: TRZ IOS,IOACT +STOIOS: MOVEM IOS,DEVIOS(DEVDAT) +ORACT1: LDB TAC,PDVTIM ;GET NO. OF SECONDS + DPB TAC,PDVCNT ;TO WAIT BEFORE + POPJ PDP, ;DEVICE IS CONSIDERED HUNG + +INTERNAL DEVCHK +EXTERNAL HNGTIM,HNGSEC,DEVLST + +DEVCHK: MOVEI TAC,HNGSEC ;RESET HUNG DEVICE CHECK TIME + MOVEM TAC,HNGTIM ;TO CHECK ONCE A SECOND + HLRZ DEVDAT,DEVLST +DEVCK0: MOVE IOS,DEVIOS(DEVDAT) ;IS DEVICE ACTIVE? + TRNN IOS,IOACT + JRST DEVCK1 ;NO + LDB TAC,PDVCNT ;YES,DECREMENT + SOJL TAC,DEVCK1 ;0 MEANS IGNORE DEVICE + DPB TAC,PDVCNT + JUMPN TAC,DEVCK1 ;HAS COUNT GONE TO 0? + MOVE DSER,DEVSER(DEVDAT);YES, GET DISPATCH TABLE ENTRY + PUSH PDP,DEVDAT + PUSHJ PDP,DHNG(DSER) ;DISPATCH TO SERVICE ROUTINES TO + ; UNHANG DEVICE + PUSHJ PDP,DEVHNG ;PRINT ERROR MESSAGE AND STOP JOB + POP PDP,DEVDAT ;DO NOT PRINT MESS. AND STOP JOB RETURN +DEVCK1: HLRZ DEVDAT,DEVSER(DEVDAT) + JUMPN DEVDAT,DEVCK0 + POPJ PDP, + ;ROUTINE TO SETUP PROG AND ITEM FOR INTERRUPT SERVICE ROUTINE + +;CALL PUSHJ PDP,IOSET +, EXIT ALWAYS RETURNS HERE +,THIS PROGRAM IS CALLED FROM AN INTERRUPT SERVICE ROUTINE. +,IT PUTS THE ADDRESS OF THE DATA AREA OF THE JOB (C(JBTADR18-35)) +,CONNECTED TO THE DEVICE SPECIFIED BY AC DEVDAT IN AC PROG AND +,PUTS THE ITEM POINTER (C(DEVCTR)) IN AC ITEM. + + INTERNAL IOSET + EXTERNAL PJOBN,JBTADR + +IOSET: LDB PROG,PJOBN + MOVE ITEM,DEVCTR(DEVDAT) ;ITEM:=ITEM POINTER=C(DEVCTR) + MOVE PROG,JBTADR(PROG) ;PROG:=C(JBTADR 18-35) + MOVE IOS,DEVIOS(DEVDAT) ;GET IO STATUS FROM THE DDB + POPJ PDP, ;RETURN + +,CALLING SEQUENCE +, PUSHJ PDP,IOSETC +, EXIT ALWAYS RETURNS HERE + +,SETS JBFPTR18-35:=C(TAC1 18-35) +, JBFCTR:=C(ITEM)*[WORD LENGTH/BYTE SIZE] +,WHERE WORD LENGTH:=36 DECIMAL +, BYTE SIZE:=C(JBFPTR6-11) +, [X]:= INTEGER PART OF X + + + INTERN IOSETC + + +IOSETC: ADDI JBUF,1 ;JBFPTR12-18:=0 + HRLZI TAC,7777 ;JBFPTR18-35:=C(TAC1 18-35)+1 + ANDM TAC,@JBUF + HRRM TAC1,@JBUF + AOS @JBUF + LDB TAC1,[POINT 6,@JBUF,11] ;TAC1:=BYTE SIZE + PUSHJ PDP,ITMCT1 ;JBFCTR:=C(ITEM)*[36/BYTE SIZE] + ADDI JBUF,1 + MOVEM ITEM,@JBUF + POPJ PDP, ;EXIT + ;ROUTINE TO RETURN NO. OF ITEMS IN BUFFER + +;CALL: PUSHJ PDP,ITMSET +, EXIT ALWAYS RETURNS HERE +,SETS AC ITEM:=(BUFFER SIZE-1)*[WORD LENGTH/BYTE SIZE] +,WHERE BUFFER SIZE:=BITS 1-17 OF THE BUFFER HEADER WORD POINTED TO +, BY C(DEVADR) +, WORD LENGTH:=36 DECIMAL +, BYTE SIZE:=INTEGER PART OF X. + +,CALLING SEQUENCE +, PUSHJ PDP,ITMCNT +, EXIT ALWAYS RETURNS HERE +,SETS AC ITEM:=C(ITEM)*[WORD LENGHT/BYTE SIZE] + +,CALLING SEQUENCE +, PUSHJ PDP,ITMCT1 +, EXIT ALWAYS RETURNS HERE +,SETS AC ITEM:=C(ITEM)*[WORD LENGHT/C(TAC1)] + + INTERN ITMSET,ITMCNT,ITMCT1 +ITMSET: LDB ITEM,[POINT 17,@DEVADR(DEVDAT),17];ITEM:=BUFFER SIZE-1 + SUBI ITEM,1 +ITMCNT: LDB TAC1,[POINT 6,DEVPTR(DEVDAT),11];TAC1:=BYTE SIZE +ITMCT1: MOVEI TAC,44 ;ITEM:=C(ITEM)*[WORD LENGTH/C(TAC1)] + IDIV TAC,TAC1 + IMUL ITEM,TAC + POPJ PDP, + ;ROUTINE TO SET DEVICE STATUS WORD FROM UUO +;AND SETUP IOS + +INTERNAL SETIOS + +SETIOS: PUSHJ PDP,WAIT1 ;WAIT FOR DEVICE (INCLUDING TTY + ; MONITOR COMMAND RESPONSE WHEN + ; USER INITS TTY) + + PUSHJ PDP,CHKMOD ;CHECK FOR LEGAL MODE, IF NOT RIGHT DONT RETURN + TRZ UUO,IOACT ;LET USER SET ALL BITS EXCEPT IOACT + HRRM UUO,DEVIOS(DEVDAT) + POPJ PDP, + + + +;CHECK FOR A LEGAL MODE FOR DEVICE +CHKMOD: LDB TAC1,[POINT 4,UUO,35] ;GET DEVICE DATA MODE + MOVEI TAC,1 ;AND CHECK FOR LEGALITY + LSH TAC,(TAC1) + TDNN TAC,DEVMOD(DEVDAT) + JRST ILLMOD ;ILLEGAL MODE + POPJ PDP, ;OK + + +;SETUP BYTE POINTER AND ITEM COUNT +;CALL PUSHJ PDP,NEWBUF +; ADDRESS CHECK WHEN SETTING UP BUFFER +; OK RETURN + + + +EXTERNAL CPOPJ1 +INTERNAL NEWBUF,NEWBF1 + +NEWBF1: +NEWBUF: HRRZ TAC,DEVADR(DEVDAT) ;TAC:=INPUT BUFFER HEADER ADDRESS + PUSHJ PDP,BUFCLR ;CLEAR INPUT BUFFER. + POPJ PDP, ;ADDRESS CHECK + HRLZI TAC,7737 + AND TAC,DEVPTR(DEVDAT) ;DEVPTR 0-5:=0, DEVPTR 12:=0 + HRR TAC,DEVADR(DEVDAT) ;DEVPTR 18-35:=C(DEVADR 18-35) + 1 + AOS TAC + MOVEM TAC,DEVPTR(DEVDAT) + PUSHJ PDP,ITMSET ;ITEM:=(BUFFER SIZE-1)*[36/BYTE SIZE] + MOVEM ITEM,DEVCTR(DEVDAT) ;DEVCTR:=ITEM COUNT + JRST CPOPJ1 ;RETURN + ;ROUTINE TO SETUP BYTE POINTER ACCORDING TO DATA MODE + +;CALL: PUSHJ PDP,SETBYT +, EXIT ALWAYS RETURNS HERE +,SETS TAC 0-5:=0 +, TAC 6-11:=S +, TAC 12-13:=0 +, TAC 14-17:=PROG +,WHERE S=36 IF DATA MODE (IOS 32-25) IS BINARY (B) +, IMAGE (I), IMAGE BINARY (IB), OR DUMP (SD,D,DR) +, S=7 IF DATA MODE IS ASCII PACKED (A) +, ASCII LINE (AL) +, ASCII SEQUENCED (AS) +, ASCII SEQUENCED LINE (ASL) +, OR ALTERNATE MODE BREAK (AM) + + INTERN SETBYT + +SETBYT: TRNN IOS,14 ;IS MODE LESS THAN 10? + HRLI TAC,700+PROG ;YES,ASCII OR ASCII LINE + TRNE IOS,14 ;10 OR GREATER? + HRLI TAC,4400+PROG ;YES, IMAGE,IMAGE BIN. OR BIN. + POPJ PDP, + ;ROUTINE TO STORE DATA IN IOBUFFER FOR INPUT CHAR. AT A TIME DEVICES + +;CALL: PUSHJ PDP,STODAT +, EXIT1 CHECKSUM ERROR +, EXIT2 BLOCK FULL OR BLOCK COMPLETE +, EXIT3 DATA STORED CORRECTLY +,CALLED FROM AN INPUT SERVICE ROUTINE WITH A DATA ITEM IN AC DAT. +,STORES THE DATA ITEM IN THE BUFFER, CHECKING TO SEE IF IT WERE +,THE FIRST ITEM ON THE BUFFER AND SETTING UP THE POINTER AND +,WORD COUNT APPROPRIATELY CHECKING THE MODE TO SEE IF ANY SPECIAL +,PROCESSING NEED BE DONE. FOR EXAMPLE, THE TERMINATION +,OF A BUFFER ON CERTAIN CHARACTERS IN OTHER MODES, OR IF THE BUFFER +,IS FULL. THERE ARE THREE RETURNS FROM THIS ROUTINE: THE FIRST +,RETURN OCCURS ON AN ERROR CONDITION, THE SECOND RETURN OCCURS +,ON A BLOCK FULL CONDITION OR BLOCK COMPLETE CONDITION, THE THIRD +,RETURN OCCURS ON THE DATA STORED CORRECTLY CONDITION. THIS +,ROUTINE ALSO DOES SOME CHECKING ON INPUT OF BINARY RECORD, +,PAPER TAPE OR CARDS. +,CALLING SEQUENCE +, PUSHJ PDP,STOSQD +, XXXX ALWAYS SKIPS +, EXIT ALWAYS RETURNS HERE +,STORES THE WORD COUNT:=C(DEVPTR 18-35) -C(DEVIAD 18-35) - 1 +,IN THE BUFFER. + INTERN STODAT, STOSQD + EXTERNAL PIOMOD,CPOPJ,CPOPJ1,CPOPJ2 + +STODAT: TLNN IOS,IOFST ;IS THIS FIRST ITEM OF BUFFER? + JRST STO0 ;NO + PUSHJ PDP,NEWBUF ;SET UP A NEW BUFFER. ITEM:=(BUFFER + ; SIZE - 1)*[36/BYTE SIZE] + POPJ PDP, +STO0: LDB TAC1,PIOMOD ;DATA MODE + CAIN TAC1,B ;MODE=BINARY? + JRST STOBIN + TLZ IOS,IOFST +STO1: IDPB DAT,DEVPTR(DEVDAT) ;STORE DATA IN BUFFER. + CAIE TAC1,A ;MODE=ASCII, IMAGE, OR BINARY? + CAIN TAC1,I + JRST STOAIB + CAIE TAC1,IB ;IMAGE BINARY? + CAIN TAC1,B ;CHECKSUM BINARY? + JRST STOAIB ;YES + ANDI DAT,177 ;NO, MUST BE ASCII LINE MODE. + CAIG DAT,14 ;LINE FEED,FORM FEED, OR VERTICAL TAB? + CAIGE DAT,12 + JRST .+2 ;NO + JRST STOSQF ;YES + SOJGE ITEM,CPOPJ2 ;ITEM:=C(ITEM)-1. IS C(ITEM) GR OR=0? +STOE1: TRO IOS,IOBKTL ;IOBKTL:=1 + POPJ PDP, +STOAIB: SOJG ITEM,CPOPJ2; ITEM:=C(ITEM)-1. IS C(ITEM) GR 0? + CAIN TAC1,A ;MODE=ASCII? + JRST STOSQF ;YES + CAIN TAC1,B ;MODE=BINARY? + JRST STOBND ;YES, COMPUTE CHECKSUM AND CHECK. + PUSHJ PDP,ITMSET ;ITEM:=(BUFFER SIZE-1)*[36/BYTE SIZE] + ; - C(DEVCTR) + SUB ITEM,DEVCTR(DEVDAT) + MOVE TAC1,DEVIAD(DEVDAT) ;STORE ITEM COUNT + ADDI ITEM,1 ;IN FIRST WORD OF BUFFER + AOJA TAC1,STOSQE + STOSQD: TLZN IOS,IOFST ;FIRST CALL? + JRST STOSQF ;NO + PUSHJ PDP,NEWBUF ;YES, CLEAR BUFFER,SET ITEM COUNT + POPJ PDP, ;ADDRESS CHECK +STOSQF: MOVE TAC1,DEVIAD(DEVDAT) ;REL. ADR. OF BUFFER + AOS TAC1 + HRRZ ITEM,DEVPTR(DEVDAT) ;ITEM:=C(DEVPTR 18-35) - + ; C(DEVIAD 18-35) -1 + SUBI ITEM,(TAC1) +STOSQE: HRRM ITEM,@TAC1 ;WORD COUNT TO FIRST WORD IN BUFFER + JRST CPOPJ1 ;EXIT2. BLOCK COMPLETE + + +STOBIN: TLZN IOS,IOFST ;WILL THE NEXT ITEM BE THE FIRST ITEM + JRST STO1 ;OF A BUFFER? IOFST:=0 + HRRZ TAC,DAT ;YES. + CAMLE TAC,ITEM ;IS WORD COUNT LE (BUFFER SIZE-1)* + JRST STOE1 ; [36/BYTE SIZE]? + MOVE ITEM,TAC ;ITEM:=WORD COUNT + MOVEM DAT,@DEVPTR(DEVDAT) ;STORE WORD COUNT IN BUFFER + JRST CPOPJ2 ;EXIT3. DATA STORED CORRECTLY. + +STOBND: HRRZ TAC1,DEVIAD(DEVDAT) + PUSHJ PDP,CKS12 ;COMPUTE CHECKSUM + ADD TAC1, DEVIAD(DEVDAT) + HLLZ TAC1,@TAC1 ;DATA CHECKSUM=COMPUTED CHECKSUM? + CAMN TAC,TAC1 + JRST CPOPJ1 ;EXIT2. BLOCK COMPLETE + TRO IOS,IODTER ;IODTER:=1 + POPJ PDP, ;EXIT1. CHECKSUM ERROR + + + LIT +IFN FTCHECK, + +UUOEND: END