      HED TELETYPE TABLES * THE TELETYPE TABLES CONTAIN IN CORE INFORMATION FOR SYSTEM USERS. * EACH OF THE 16 USERS HAS 1 TABLE, CONTAINING THE FOLLOWING* ENTRIES:*   (?BTIM THROUGH ?LADR MUST BE FIRST, AND ?CLOC THROUGH *    ?PLEV MUST BE CONTIGUOUS.)       SPC 1 ?BTIM EQU 0       SPC 1 *                   USED BY MPX FOR COUNTER BETWEEN BITS. TIME IS *                   INCREMENTED AT EACH MPX INTERRUPT, AND WHEN IT*                   GOES TO 0, A BIT TIME IS COMPLETE.      SPC 1 ?CHAR EQU ?BTIM+1       SPC 1 *                   USED BY MPX FOR PACKING INPUT BITS OR UNPACKING *                   OUTPUT BITS.      SPC 1 ?BCNT EQU ?CHAR+1       SPC 1 *                   USED BY MPX FOR COUNTING CHARACTER BITS.      SPC 1 ?MASK EQU ?BCNT+1       SPC 1 *                   =2^N FOR USER N.      SPC 1 ?CCNT EQU ?MASK+1       SPC 1 *                   USED BY MPX FOR COUNTING OUTPUT CHARACTERS. IT*                   EQUALS -#OF CHARS, INCLUDING CURRENT ONE.       SPC 1 ?BPNT EQU ?CCNT+1       SPC 1 *                   ON INPUT, POINTS TO THE CHARACTER LOCATION INTO *                   WHICH THE NEXT CHARACTER WILL BE DEPOSITED. ON*                   OUTPUT, POINTS TO THE CHARACTER WHICH IS CUR- *                   RENTLY BEING TRANSMITTED.       SPC 1 ?BSTR EQU ?BPNT+1       SPC 1 *                   ON INPUT, POINTS TO THE FIRST CHARACTER OF THE*                   MOST RECENT BUFFER. ON OUTPUT, POINTS TO THE*                   LOCATION INTO WHICH THE NEXT CHARACTER WILL BE*                   DEPOSITED BY THE OUTCR ROUTINE.       SPC 1 ?BHED EQU ?BSTR+1       SPC 1 *                   ON INPUT, POINTS TO THE FIRST CHARACTER OF THE*                   FIRST LOGICAL BUFFER.       SPC 1 ?BGIN EQU ?BHED+1       SPC 1 *                   POINTS TO BEGINNING OF PHYSICAL BUFFER.       SPC 1 ?BEND EQU ?BGIN+1       SPC 1 *                   POINTS TO FIRST CHARACTER FOLLOWING PHYICAL *                   BUFFER.       SPC 1 ?LADR EQU ?BEND+1       SPC 1 *                   POINTS TO LAST WORD OF LADDR ENTRY.       SPC 1 ?DISC EQU ?LADR+1       SPC 1 *                   DISC ADDRESS.       SPC 1 ?PROG EQU ?DISC+1       SPC 1 *                   POINTS TO LAST USED WORD OF CORE PROGRAM.       SPC 1 ?ID   EQU ?PROG+1       SPC 1 *                   USER ID.      SPC 1 ?NAME EQU ?ID+1       SPC 1 *                   8 CHAR PROGRAM NAME       SPC 1 ?PHON EQU ?NAME+3 ?TIME EQU ?PHON+1       SPC 1 *                   STARTING TIME       SPC 1 ?ABCN EQU ?TIME+2       SPC 1 *                       ABORT COUNTER TO TIME ATTEMPTED ABORTS.       SPC 1 ?CLOC EQU ?ABCN+1       SPC 1 *                   USER'S TIMEOUT CLOCK.       SPC 1 ?RSTR EQU ?CLOC+1       SPC 1 *                   RESTART ADDRESS FOR SUSPENDED PROGRAMS.       SPC 1 ?STAT EQU ?RSTR+1       SPC 1 *                   USER STATUS--WHEN ON Q INDICATED PROGRAM TYPE;*                   WHEN NOT ON Q INDICATED REASON WHY.       SPC 1 ?LINK EQU ?STAT+1       SPC 1 *                   POINTS TO LINK POSITION OF NEXT ENTRY ON QUEUE.       SPC 1 ?PLEV EQU ?LINK+1       SPC 1 *                   FOR PROGRAMS ON Q, CONTAINS PRIORITY LEVEL. FOR *                   SUSPENDED PROGRAMS CONTAINS PROGRAM TYPE.       SPC 3 TTY00 DEC 0,0,0,1,0       REP 4       DEF BUF00+BUF00       DEF BUF00+BUF00+BUFLN+BUFLN       DEF LADDR+3       OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0 * TTY01 DEC 0,0,0,2,0       REP 4       DEF BUF01+BUF01       DEF BUF01+BUF01+BUFLN+BUFLN       DEF LADDR+7       OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0 * TTY02 DEC 0,0,0,4,0       REP 4       DEF BUF02+BUF02       DEF BUF02+BUF02+BUFLN+BUFLN       DEF LADDR+11      OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0 * TTY03 DEC 0,0,0,8,0       REP 4       DEF BUF03+BUF03       DEF BUF03+BUF03+BUFLN+BUFLN       DEF LADDR+15      OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0 * TTY04 DEC 0,0,0,16,0      REP 4       DEF BUF04+BUF04       DEF BUF04+BUF04+BUFLN+BUFLN       DEF LADDR+19      OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0 * TTY05 DEC 0,0,0,32,0      REP 4       DEF BUF05+BUF05       DEF BUF05+BUF05+BUFLN+BUFLN       DEF LADDR+23      OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0 * TTY06 DEC 0,0,0,64,0      REP 4       DEF BUF06+BUF06       DEF BUF06+BUF06+BUFLN+BUFLN       DEF LADDR+27      OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0 * TTY07 DEC 0,0,0,128,0       REP 4       DEF BUF07+BUF07       DEF BUF07+BUF07+BUFLN+BUFLN       DEF LADDR+31      OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0 * TTY08 DEC 0,0,0,256,0       REP 4       DEF BUF08+BUF08       DEF BUF08+BUF08+BUFLN+BUFLN       DEF LADDR+35      OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0 * TTY09 DEC 0,0,0,512,0       REP 4       DEF BUF09+BUF09       DEF BUF09+BUF09+BUFLN+BUFLN       DEF LADDR+39      OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0 * TTY10 DEC 0,0,0,1024,0      REP 4       DEF BUF10+BUF10       DEF BUF10+BUF10+BUFLN+BUFLN       DEF LADDR+43      OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0 * TTY11 DEC 0,0,0,2048,0      REP 4       DEF BUF11+BUF11       DEF BUF11+BUF11+BUFLN+BUFLN       DEF LADDR+47      OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0 * TTY12 DEC 0,0,0,4096,0      REP 4       DEF BUF12+BUF12       DEF BUF12+BUF12+BUFLN+BUFLN       DEF LADDR+51      OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0 * TTY13 DEC 0,0,0,8192,0      REP 4       DEF BUF13+BUF13       DEF BUF13+BUF13+BUFLN+BUFLN       DEF LADDR+55      OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0 * TTY14 DEC 0,0,0,16384,0       REP 4       DEF BUF14+BUF14       DEF BUF14+BUF14+BUFLN+BUFLN       DEF LADDR+59      OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0 * TTY15 OCT 0,0,0,100000,0      REP 4       DEF BUF15+BUF15       DEF BUF15+BUF15+BUFLN+BUFLN       DEF LADDR+63      OCT 0       DEF PROGB+1       OCT 0,0,0,0,0,0,0,0,0,0,0,0,0       SPC 1 * THE QUEUE ALWAYS CONTAINS AT LEAST ONE ENTRY, A DUMMY ENTRY. IT * IS POINTED TO BY THE LAST ACTUAL ELEMENT, AND POINTS TO THE FIRST.* WHEN THE QUEUE IS OTHERWISE EMPTY, THE DUMMY LINK POINTS TO * ITSELF.       SPC 1 BUF00 BSS BUFLN BUF01 BSS BUFLN BUF02 BSS BUFLN       HED SCHEDULER *  THE CLOCK DRIVER IS THE CENTRAL POINT THROUGH WHICH CONTROL IS *  PASSED TO THE SCHEDULER. ENTRY COMES TO THE DRIVER WHENEVER THE*  CLOCK (REAL TIME SCALAR) INTERRUPTS.  THIS EVENT OCCURS EVERY*  100 MS.  BESIDES GIVING CONTROL TO THE SCHEDULER, THE CLOCK*  DRIVER ALSO HAS THE TASK OF UPDATING THE TIME OF DAY CLOCK.* THIS CLOCK IS A TWO WORD ENTRY WHOSE VALUE IS AS FOLLOWS: *     DATIM=24*DAY+HOUR *     DATIM+1=600*MIN+10*SEC-36000      SPC 3 CLKIN NOP           ENTRY POINT.      ISZ DATIM+1   BUMP 100MS COUNTER      JMP CLC1      NO PROBLEM IF NO SKIP       STA CTEMP     SAVE A.       LDA M36K      RESET 100MS COUNTER.      STA DATIM+1       LDA CTEMP     RESET A.      ISZ DATIM     BUMP HR COUNTER.      NOP           JUST IN CASE.       SPC 1 * THE NEXT INSTRUCTION IS NORMALLY A JMP. WHEN THE* SCHEDULER IS RUNNING, HOWEVER, IT PREVENTS ITSELF * FROM BEING REENTERED BY INSERTING A NOP.      SPC 1 CLC1  NOP       SPC 1       CLF CLOCK     ALLOW ANOTHER CLOCK INTERRUPT.      JMP CLKIN,I   RETURN. CLC2  JMP SCHED     USED TO INSERT IN CLC1.       SPC 3 *  THE SCHEDULER SECTION OF TSB DETERMINES WHICH*  PROGRAM IS TO RUN NEXT. FIRST IT CLEARS CLC1,*  ALLOWING THE CLOCK TO CONTINUE INTERRUPTING.       SPC 1 SCHED STA AREG      SAVE A-REGISTER.      CLA           INSERT NOP IN CLC1 TO PREVENT       STA CLC1       REENTERING SCHED.      LDA CLKIN     SAVE THE PROGRAM COUNTER      STA PREG       ALSO.CLKED CLF CLOCK     NOW LET THE CLOCK IN AGAIN.       STB BREG      SAVE B REGISTER,      ERA,ALS       E-REGISTER,       SOC           AND OVERFLOW REGISTER.      INA       STA EREG      SPC 1       LDA TIMEF     GET TIMER FLAG.       SZA           IF 0, THIS IS NOT A TIMED PROG.       ISZ TIMER,I   IF NOT 0, BUMP TIMER.       JMP SCH1      IF NOT OUT OF TIME, SKIP ROTAT- *                                  ING RUN QUEUE. * *     AT THIS POINT WE HAVE DISCOVERED THAT THE PROGRAM THAT HAS*     BEEN RUNNING HAS EXHAUSTED ITS TIME LIMIT. THE NEXT STEP IS *     TO ADJUST THE QUEUE SO THAT THIS PROGRAM IS MOVED TO THE*     BOTTOM.  THIS IS ACCOMPLISHED BY DELETING THE PROGRAM *     FROM THE QUEUE AND THEN REINSERTING IT WITH ITS NEW PRIORITY. *       LDB MLINK+1   GET THE ADDRESS OF PRIORITY       INB            FOR THE CURRENT PROGRAM.       LDA .+4       SET IT TO LOW PRIORITY.       STA 1,I       ADB .-1       LDA 1,I       GET THE LINK FROM THE CURRENT       STA MLINK+1    PROGRAM AND STORE IT IN MLINK+1. * *  THE NEXT SECTION INSERTS A USER INTO THE QUEUE IN ORDER OF HIS *  PRIORITY. WHEN WE ARRIVE HERE, THE B REGISTER POINTS TO THE LINK *  WORD FOR THE USER. * SCH3  STB SCHL      SAVE LINK ADDRESS IN SCHL.      INB           B=>USERS PRIORITY       LDA 1,I       A=PRIORITY      CMA           STORE -1-PRIORITY       STA SCHPR       IN SCHPR.       LDB MLINK     B=>PHONY USER.SCH2  STB SCHP      SAVE IN SCHP.       LDB 1,I       B POINTS TO NEXT USER.      LDA 1         GET PRIORITY OF       INA            THAT USER IN       LDA 0,I         A.      ADA SCHPR     COMPARE WITH PRIORITY       SSA            OF USER BEING INSERTED.      JMP SCH2      IF >= GO TO LINK TO NEXT ENTRY.       STB SCHL,I    SET NEW ENTRY TO POINT TO HIM.      LDA SCHL      STA SCHP,I    SET PREVIOUS ENTRY => NEW ENTRY.      ADA .+?CLOC-?LINK  SET NEW USERS CLOCK TO -10.      LDB .-10      STB 0,I       JSB SWAPR     START EARLY SWAPPING. * *     THIS SECTION IS THE BEGINNING OF THE MAIN PART OF THE SCHEDU- *     LER. CONTROL ALWAYS COMES HERE TO EXAMINE THE TTQ UNTIL IT'S*     EXHAUSTED, OR WHEN THERE IS NOTHING TO DO. SWAPR ALWAYS COMES *     TO THIS POINT WHEN THE QUEUE IS EMPTY OR THE FIRST PROGRAM ON *     THE QUEUE IS ABSENT.* * THE FOLLOWING SECTION OF CODE TAKES CARE OF THE TELEPHONE LOGIC.* IT IS RESPONSIBLE FOR MAKING 3 DECISIONS: *     1) A USER HAS CALLED UP;*     2) A USER HAS HUNG UP;*     3) A USER HAS BEEN ON TOO LONG WITHOUT SUCCESSFULLY LOGGING IN* THE FOLLOWING BIT FLAGS ARE USED: *     PHL=MOST RECENT INPUT FROM DISCONNECT BOARD *     PHN=CURRENT INPUT FROM DISCONNECT BOARD *     PHO=OUTPUT TO DISCONNECT BOARD*     PHT=1 IF USER IS BEING TIMED FOR SOMETHING* WHEN A USER IS BEING TIMED, LOCATION ?PHON IN HIS TTY TABLE CON-* TAINS THE VALUE OF DATIM+1 NECESSARY FOR TIMEOUT TO BE ACHIEVED.      SPC 1 SCH1  NOP (CHANGED TO RSS BY PHONES COMMAND)      JMP SCH54 SCH41 LIA 0         GET NEW INPUT FROM DISCONNECTOR.      STA PHN       SAVE.       XOR PHL       TEST FOR ANY CHANGES      IOR PHT        OR TIMEOUTS.       LDB DMAS0     => TTY00+?MASK-(TTY01-TTY00)SCH42 SZA,RSS       TEST FOR ANYTHING TO DO.      JMP SCH52     NO.       ADB .+TTY01-TTY00  SET NEW MASK ADDRESS.      CLE,SLA,ERA   BIT TEST.       RSS           FOUND ONE.      JMP *-3       TEST NEXT.*       STA SCHP      SAVE BIT TEST WORD.       STB SCHL      SAVE MASK ADDRESS       LDA PHN       TEST FOR CHANGE IN      XOR PHL        DISCONNECT INPUT.      AND 1,I       SZA,RSS       JMP SCH50     NO  CHANGE--MUST BE TIMEOUT.      AND PHN       WHICH WAY DID TI CHANGE?      SZA       JMP SCH43     CHANGE FROM 0 TO 1. *       LDA PHT       TEST IF TIMED.      AND 1,I       SZA       JMP SCH48     GO HANDLE LINE DROPOUT.       LDA 1,I       ANSWER      CMA            THE      AND PHO         PHONE.      STA PHO       JMP SCH44     NO--USER JUST CAME ON.SCH48 ADB .+?ID-?MASK    LINE DROPOUT--IGNORE IF      LDA 1,I            VALID ID.      SZA       JMP SCH49 * * USER HAS JUST CALLED IN. SET UP TIMING FOR LOGON. * SCH44 LDA PHR       GET REQUIRED RESPONSE TIME.       JMP SCH45     GO SET UP ENTRY.SCH43 AND PHT       IGNORE DROPOUT IF ALREADY       SZA            TIMING.      JMP SCH47       LDA .+20      OTHERWISE SET UP 2 SEC TIMER.[F]SCH45 LDB SCHL      COMPUTE ADDRESS OF PHONE LOC.       ADB .+?PHON-?MASK       CLE           COMPUTE REQUIRED TIME FOR RUNOUT      ADA DATIM+1       SEZ       ADA M36K      STA 1,I       LDA PHT       SET TIMING BIT.       IOR SCHL,ISCH46 STA PHT SCH47 LDA SCHP      GET BIT TEST AND COUNTER      LDB SCHL       WORDS AGAIN.       JMP SCH42     LOOP. * SCH49 LDA SCHL,I    CLEAR PHT.      XOR PHT       JMP SCH46 * * CODE TO TEST FOR HANGUP OR UNSUCCESSFUL LOGON.* SCH50 ADB .+?PHON-?MASK  TEST FOR KICKOFF.      LDA 1,I       GET REQUIRED TIME.      CMA,INA       SUBTRACT FROM       ADA DATIM+1   CURRENT TIME.       SSA       JMP SCH47     NOT TIMED OUT.*       ADB .+?STAT-?PHON       LDA 1,I       GET USER'S STATUS.      CPA .-2       ALREADY HANDLED.      JMP SCH47       ADA .+.-%SYNT-1-COM3+COM2       SSA,RSS       TEST FOR LIBRARY TYPE PROGRAM.      JMP SCH47     IGNORE FOR NOW IF IT IS.      LDA .-2       SET STATUS TO -2.       STA 1,I       CLF 0       LDA SCHL,I    SET MPCOM BIT.      IOR MPCOM       STA MPCOM       STF 0       ADB .+?LINK-?STAT       JSB DEQUE     REMOVE USER FROM QUEUE.       JMP SCH47 * * END OF PROCESSING * SCH52 LDA PHO       OUTPUT TO PHONES. SCH53 OTA 0       LDA PHN       COPY N INTO L.      STA PHL * 