SCH54 STF 0       LDA MPCOM     TEST FOR ANY COMMUNICATION      SZA            FROM MULTIPLEXOR.      JMP SCH5* * TEST FOR ANY TTY35 BUSINESS *       CCA           TEST FOR DRIVER BUSY.       CPA T35F1       JMP SCH15     DRIVER IS BUSY. * * WHEN T35F1=0, THE CONSOLE IS QUIET SO WE CAN DO LOGGING.*       ADA LOGCT     TEST FOR ANY ENTRIES IN LOGTABLE.       CPA .-1       JMP SCH16     LOG TABLE IS EMPTY. * * SET UP LOG BUFFER *       STA LOGCT     DECREMENT LOG COUNTER.      LDA LOGP1     BUMP LOG POINTER      INA       CPA LOGND     IF AT END,      LDA LOGBG       WRAP AROUND.      STA LOGP1       LDA LOGP1,I   TEST FOR LOGON      LDB ASCIN       OR LOGOUT.      SSA       LDB ASCFF       STB LOGBF+3       LSR 10        SHIFT LOG CHAR TO LEAST 5 BITS.       AND .+37B     MASK OFF OTHER STUFF.       ADA ASCBA     CONVERT TO ASCII.       STA LOGBF+4       LDA LOGP1,I   GET ACCOUNT NUMBER AGAIN.       AND B1777     KEEP ONLY # PART.       CLB       DIV .+10      GET 1ST 2 DIGITS IN A, LAST IN B      BLF,BLF       SET UP LAST DIGIT AS      ADB ASC0B      ASCII LEFT HALF.       STB LOGBF+6       JSB #LTEN     CONVERT FIRST 2 TO ASCCII ALSO.    !  STA LOGBF+5       ISZ LOGP1       LDA LOGP1,I   NOW GET THE TIME.       AND .+17B     GET TERMINAL NUMBER.      JSB #LTEN     CONVERT AND STORE IN BUFFER.      STA LOGBF+10      LDA LOGP1,I       CLB       ASR 4       DIV D60       STB LOGP1,I   SAVE SECOND HALF      JSB #LTEN     CONVERT FIRST HALF TO ASCII.      STA LOGBF+7       LDA LOGP1,I       JSB #LTEN     CONVERT 2ND HALF TO ASCII.      STA LOGBF+8       LDA .+23      LDB LOGR2      TO PPRINT THESCH21 JSB TTY35,I    STUFF.       JMP SCH15 LOGR2 DEF *+1,I     BUFFER ADDRESS (I=>PUNCH) LOGBF ASC 11,**LOGOFF A123 0930 #01       OCT 11400      XOFF * *  TTY35 IO COMPLETE* SCH16 CPA T35F2     TEST DRIVER COMMUNICATE FLAG.       RSS       JMP SCH15       LDA T35ST     GET CONSOLE STATUS.       LDB T35PR       CPA %OUTW     IF OUTPUT WAIT,       JMP SCH23     GO SET HIM UP.      SZA           IF NOT IDLE WEVE ALREADY      JMP SCH15       QUEUED HIM. * TTY35 INPUT COMMAND *       LDA T35B2     POINTER TO FIRST CHARACTER      STA SBHED      OF CONSOLE BUFFER.       LDA T35ND     POINTER TO END OF       STA SCHL       CONSOLE BUFFER.      LDA .+40B     INITIALIZE COMMAND      STA SCHP       HOLDER.      JSB SCOM      GET COMMAND.      JMP SCH17     BLANK LINE      JMP SCH18     ERROR       JMP SCH18     ERROR * * SET UP QUEUE ENTRY FOR CONSOLE. *       LDA SBHED     SET POINTER FOR       STA T35CP      T35CR.       LDA .+40B     SET UP LA2T CHAR      STA T35LC      AS BLANK *       LDA #LIB#     SET RESTART ADDRESS.      STA T35RS       ADB SCH19     SET PROGRAM STATUSSCH23 STB T35ST      TYPE.      LDA .+2       SET PRIORITY.       STA T35PR       LDB T35LN     GO INSERT IN QUEUE      JMP SCH3SCH19 ABS -COM2+%SYNT-.+1 SCH17 LDA ONEI      OUTPUT LINE FEED      RSS SCH18 LDA .+4       OUTPUT ERROR MESSAGR      CLB       STB T35F2       LDB DEH       JMP SCH21 *  START OF SYSTEM  * TSB   LDA .+3       START CLOCK COUNTING IN       OTA CLOCK     100 MS UNITS.       STC CLOCK,C   START CLOCK AND       STC MPX,C     MPX.      LDA .+6       START SYSTEM      LDB READY     TELETYPE BY OUTPUTTING      JSB TTY35,I     READY MESSAGE.      JMP SCH1      SPC 2 * * SCH15 JSB SWAPR     CHECK FOR ANYTHING TO DO. IF NOT*                                   SWAPR WILL GO TO SCH1 AGAIN.*                                   IT WILL RETURN HERE IF THERE IS *                                   AN EXECUTABLE PROGRAM IN CORE.      SPC 3 *     THE PROGRAM TO RUN IS AT THE HEAD OF THE QUEUE, AND SWAPR HAS *     GUARANTEED THAT IT IS IN CORE. THE FOLLOWING SECTION OF CODE*     SETS IT UP TO RUN, AND ALSO SETS UP THE CLOCK DRIVER SO THAT*     FUTURE INTERRUPTS WILL GO BACK INTO THE SCHEDULER.      SPC 1       CLF 0         INHIBIT INTERRUPT.      LDA CLC2      RESTORE A <JMP SCHED> IN THE      STA CLC1        CLOCK INTERRUPT ROUTINE.      LDA MLINK+1       INA           GET PRIORITY OF PROGRAM.      LDB 0,I       CPB .+2       IF PRIORITY IS 2, CHANGE IT TO      CLB           ZERO SO IT DOESNT GET INTERRUPTED.      STB 0,I       ADA .+?RSTR-?PLEV   GET RESTART ADDRESS       LDB 0,I         IF NOT 0, PUT IT IN PREG      SZB            TO START UP PROPERLY.      STB PREG      CLB           PUT 0 INTO TABLE IN ANY CASE      STB 0,I       STB TIMEF     SET TO SAY NO TIMING.       INA           GET PROGRAM STATUS.       LDB 0,I       ADA .+?CLOC-?STAT   SET TIMER POINTER.      STA TIMER       CPB %SYNT+1   IF STATUS IS RUN, SET       ISZ TIMEF      TIMEFLAG FOR CLOCKING.       LDA EREG      RESTORE E       CLO            AND OVERFLOW       SLA,ELA         REGISTERS.      STO       LDA AREG      RESTORE A AND       LDB BREG        B REG.      STF 0         ENABLE INTERRUPT AND      JMP PREG,I     TRANSFER TO PROGRAM. * *  THIS SECTION ACTUALLY PROCESSES A TTQ ENTRY. THERE ARE SEVERAL *  KINDS OF ENTRIES WHICH MAY BE CLASSIFIED AS FOLLOWS: * *     1) ABORT - THIS IS INDICATED BY THE TELETYPE STATUS BEING *       -1. THE ACTION TAKEN IS TO STOP THE PROGRAM (IF IT IS *        IN THE QUEUE), AND TO INITIATE THE ABORT MESSAGE.* *     2) OUTPUT TERMINATE - THIS IS INDICATED BY THE STATUS BEING *        %OUTW.  THE TTQ ENTRY REALLY MEANS THAT THE OUTPUT BUFFER*        IS ALMOST EMPTY. THE PROGRAM IS PLACED BACK ON THE QUEUE *        ACCORDING TO ITS PRIORITY. * *     3) INPUT - THIS IS INDICATED BY STATUS BEING %INPT. IT INDI-*        CATES THAT A USER PROGRAM OR SYSTEM PROGRAM THAT HAS *        SEQUSE!INPUT HAS GOTTEN IT. THE PROGRAM IS PLACED IN *        THE QUEUE. * *     4) COMMAND - WHEN STATUS IS %IDLE, EITHER A COMMAND OR*        A SYNTAX STATEMENT HAS BEEN ENTERED. THESE CAN BE DISTIN-*        GUISHED BY THE FIRST NON BLANK INPUT CHARACTER, WHICH IS *        A DIGIT ONLY IF SYNTAX HAS BEEN ENTERED. * SCH5  LDB DTTY0     COMPUTE ADDRESS OF TABLE      SLA,RAR       ENTRY FOR SIGNALLING TELETYPE.      JMP *+3       FOUND.      ADB .+TTY01-TTY00       JMP *-3       STB TTQ       SAVE ADDRESS IN TTQ       ADB .+?ID     STORE ID ADDRESS IN       STB SCHID      SCHID.       CLF 0         INHIBIT MULTIPLEXOR.      ADB .+?MASK-?ID       LDA 1,I       CLEAR MPCOM BIT.      XOR MPCOM       STA MPCOM       ADB .+?STAT-?MASK  B=>STATUS.       LDA 1,I       GET STATUS IN A.      ADA .-4       MAKE SURE STATUS      SSA,RSS         IS < 4.       JMP SCH54     IGNORE OTHERWISE.       ADA *+2       BRANCH TO SECTION TO HANDLE REQUEST.      JMP 0,I       DEF *+7       JMP SCH8      SPECIAL DISCONNECT.       JMP SCH7      ABORT       JMP SCH6      COMMAND       JMP SCH54     ABORTING.       NOP           INPUT * *  CODE TO HANDLE INPUT OR OUTPUT.*       ADB .+2       B=>PLEV       LDA 1,I       GET ACTUAL STATUS       ADB .-2       B=>STATUS.      STA 1,I       SET ACTUAL STATUS       STF 0       ADB .+2       B=>PLEV       CLA           SET PRIORITY TO 0       STA 1,I       ADB .-1       GO INSERT USER IN       JMP SCH3       QUEUE. * *  CODE TO HANDLE ABORT * SCH7  STF 0       INB           B=>LINK       JSB DEQUE     REMOVE USER FROM QUEUE.       LDB TTQ       CHANGE STATUS       ADB .+?STAT       LDA %ABOR     TO ABORTING       STA 1,I       CCA           SET CHARACTER COUNT TO -1 TO      ADB .+?CCNT-?STAT       STA 1,I       TERMINATE ANY CURRENT OUTPUT.       LDB TTQ       PRINT ABORT       LDA .-8        MESSAGE.       JSB TYPE      OCT 6412     CRLF       ASC 2,STOP      OCT 6412     CRLF       LDB TTQ       SCRATCH IF $HELLO IS RUNNING.       JSB HTEST       JMP SCH54 * * CODE TO SET UP FORCED DISCONNECT. * SCH8  ADB .+?LADR-?STAT                          [F]      LDA 1,I       GET POINTER TO USER'S LADDR. [F]      ADA .-3       POINTS TO MODIFIED WORD.     [F]      STA SCHL      SAVE IN SCHL.                [F]      INA           A POINTS TO JMP *+3.         [F]      LDA 0,I       LOAD "JMP *+3" AND STORE IN  [F]      STA SCHL,I    LADDR. THIS SHUTS OUT MPX.   [F]      LDA 1         SET A TO POINT AT RESTART    [F]      ADA .+?RSTR-?LADR  ADDRESS.                [F]      STF 0                                      [F]      JMP SCH61     GO SET UP STARTING INFO.* * *  CODE TO HANDLE COMMANDS. * SCH6  STF 0       ADB .+?BHED-?STAT  B=>BUFFER HEAD.      LDA 1,I       GET BUFFER HEAD.      STA SBHED     INITIALIZE BUFFER POINTER.      ADB .+2       B=>BUFFER END       STB SCHLSCH24 CLA           INITIALIZE SCHP TO HOLD       STA SCHP       CHARACTERS.      JSB SCOM      INTERPRET COMMAND       JMP SCH30     EMPTY LINE.       JMP SCH9      FIRST CARACTER A DIGIT      JMP EHERR     INVALID COMMAND.      JMP SCH11     COMMAND IS OK.* * THE FIRST CHARACTER IS A DIGIT. THIS MEANS THE LINE IS SYNTAX AND * WE HAVE TO QUEUE IT AS SUCH.* SCH9  LDB SCHL      GET TABLE POINTER AGAIN.      ADB .+?PLEV-?BEND  B=>PRIORITY      CLA           SET PRIORITY TO 0       CPA SCHID,I   IF NO ID, GO LOG IN.      JMP SCH25       STA 1,I       ADB .+?RSTR-?PLEV  SET UP STARTING ADDRESS      LDA SYNTA         FOR SYNTAX      STA 1,I       ADB .+?STAT-?RSTR       LDA %SYNT     SET STATUS TO       STA 1,I        SYNTAX.      INB           GO INSERT IN QUEUE.       JMP SCH3* SCH30 LDB TTQ       TEST FOR TAPE MODE IF NULL LINE.      ADB .+?MASK       LDA TAPEF       AND 1,I       SZA,RSS       JMP SCH20    NO TAPE--GO EMIT LINE FEED.      CLF 0         INHIBIT INTERRUPT.      LDB SBHED     SET SBHED TO POINT AT 1ST CHAR      INB            OF NEXT BUFFER.      CPB SCHL,I      ADB MBLEN       STB SBHED       LDA SCHL     SET BHED ALSO.       ADA .-2       STB 0,I       ADA .-1       TEST FOR CONTINUATION.      CPB 0,I       JMP SCH54     NO CONTINUATION.      STF 0         INTERRUPT BACK ON.      JMP SCH24     GO SCAN NEXT BUFFER.* SCH20 LDA .+12B     OUTPUT A LINE FEED.       LDB TTQ       JSB OUTCH,I       JMP SCH54 * * COME HERE WHEN ANY ILLEGAL INPUT IS FOUND.* EHERR LDA .-6       JSB TYPEEH    OCT 5077,37477,6412   (???)       JMP SCH54 * * COME HERE WHEN A LEGITIMATE COMMAND IS FOUND* SCH11 LDA SCHID,I   PROCESS COMMAND ONLY IF       SZA,RSS        ID#0 OR      CPB HI          HELLO COMMAND.      JMP SCH22 SCH25 LDA .-16      PRINT LOG IN MESSAGE      JSB TYPE      OCT 5120      LF-P      ASC 6,LEASE LOG IN      OCT 6412      JMP SCH54 HI    DEF HELLO DTAPR DEF CTAPR SCH22 LDB TTQ       IF COMMAND, CLEAR TAPE FLAG.      ADB .+?MASK       CLF 0       LDA 1,I       IF TAPEF AND      AND TAPEF      INPTF ARE      AND INPTF       BOTH SET,       SZA       JMP EHERR      KILL HIM.      LDA 1,I       IOR INPTF     BLOCK FURTHER       STA INPTF      INPT.      STF 0       LDA 1,I       CMA       AND TAPEF       STA TAPEF       LDA SCHP,I    TEST FOR HELLO,BYE,OR SCRATCH.      CPA HELLO     OK TO PROCEDE IF ANY      JMP SCH27     OF THESE.       CPA SCR       JMP SCH27       CPA BYE       JMP SCH27       LDA 1,I       TEST FOR ANY TAPE ERRORS.       AND TERR      SZA,RSS       JMP SCH26     NO TAPE ERRORS--CONTINUE. *       LDA DTAPR     OTHERWISE, SET UP FOR EXECU-      STA SCHP       TION OF TAPE ERROR       JMP SCH26       PRINTOUT ROUTINE. * SCH27 LDA 1,I       IF HELLO, BYE OR SCRATCH,       CMA            CLEAR TAPE ERROR BIT.      AND TERR      STA TERR        AND PROCEDE.SCH26 ADB .+?NAME-?MASK       LDA 1,I       TEST FOR      SSA,RSS       RUN-ONLY PROGRAM.       JMP SCH28     NOT RUN-ONLY.       LDA SCHP,I    IF RUN-ONLY, DON'T      CPA SAVE       ALLOW THESE      JMP SCH29       COMMANDS.       CPA LIS       JMP SCH29       CPA PUN       JMP SCH29 * SCH28 ADB .+?BHED-?NAME       LDA SBHED     SET BUFFER POINTER.       STA 1,I       LDB SCHP      ADB MCOM2     TEST FOR TYPE I COMMAND.      SSB,RSS       JMP SCH12     NOT TYPE I.       ADB *+2       GET STARTING ADDRESS FOR COMMAND      JMP 1,I        PROCESSOR AND GO THERE.      DEF COM5-COM1+COM2,ISCH29 LDA .-10      JSB TYPE      OCT 5122      LF-R      ASC 3,UN ONL      OCT 54415     Y-CR      JMP SCH20 * * TYPE II AND III COMMANDS* SCH12 ADB %SYNT+1   DETERMINE PROGRAM STATUS.       LDA TTQ       ADA .+?STAT       STB 0,I       ADA .+?RSTR-?STAT  A=>RESTART ADDRESS       ADB .+.-%SYNT+COM2-COM3-1    TYPE II OR III ??      SSB       JMP SCH13     TYPE II COMMAND SCH61 LDB #LIB#     TYPE III COMMANDS HAVE A STAN-      STB 0,I        DARD STARTING ADDRESS AND      LDB .+2         PRIORITY 2. SCH14 ADA .+?PLEV-?RSTR       STB 0,I       CCB           GET LINK POINTER IN B AND GO      ADB 0          TO INSERT INTO QUEUE.      JMP SCH3      DEF COM3+COM5-COM1SCH13 ADB *-1       GET STARTING ADDRESS FOR TYPE       LDB 1,I        II COMMANDS.       STB 0,I       CLB,INB       GO SET PRIORITY TO 1      JMP SCH14 * * "SCRATCH" COMMAND * #SCR  LDB TTQ       B=>TTY TABLE.       JSB SCRAT     PERFORM SCRATCH FUNCTION.       JMP SCH20     TERMINATE.* SCRAT NOP           SCRATCH A PROGRAM (B=>USERS TTY)      LDA PBUFF     IF MAIN=B, SET PBPTR.       CPB MAIN      STA PBPTR       ADB .+?PROG   B=>PROGEND      STA 1,I       RESET TABLE(PROG)       ADB .+?NAME-?PROG   CLEAR       LDA 1,I        READ-ONLY BIT.       ELA,CLE,ERA     BIT.      STA 1,I       JMP SCRAT,I * * "TAPE" COMMAND* #TAP  LDB TTQ       B=>TTY TABLE.       ADB .+?MASK   B=>MASK       LDA TAPEF     SET TAPE BIT.       IOR 1,I #TAP1 STA TAPEF       JMP SCH20     TERMINATE.* * #LTEN NOP           CONVERT A # FROM 0-99 TO ASCII.       CLB           GET FIRST DIGIT IN A,       DIV .+10       SECOND IN B.       ALF,ALF       POSITION FIRST ON LEFT,       ADA 1         ADD IN SECOND,      ADA ASC00       ADD IN ASCII BITS.      JMP #LTEN,I      RETURN.* * TYPE SENDS AN ENTIRE STRING TO A TELETYPE. IT IS CALLED AS FOLLOWS: *     A=-#OF CHARS--MUST END ON RIGHT HALF OF WORD*     JSB TYPE*     <CHAR STRING> *     RETURN      SPC 2 TYPE  NOP       STA TYPET     SAVE COUNTERTYPEL LDA TYPE,I    GET WORD CONTAINING CHAR.       LDB TYPET     GET COUNT IN B.       SLB,RSS       IF COUNT IS EVEN, TAKE HIGH       ALF,ALF        CHAR;      SLB           IF COUNT IS ODD,      ISZ TYPE       BUMP TYPE.       LDB TTQ       OUTPUT CHAR TO TELETYPE.      JSB OUTCH,I       ISZ TYPET     ANY MORE?       JMP TYPEL     YES.      JMP TYPE,I    NO. TYPET NOP * SCOM SCANS A COMMAND INPUT BUFFER TO DETERMINE WHAT * THE COMMAND IS. THE CALLING SEQUENCE TO SCOM IS:* *     JSB SCOM*     <RETURN IF BLANK LINE>*     <RETURN IF FIRST CHARACTER A DIGIT> *     <RETURN IF NO LEGAL COMMAND>*     <RETURN IF COMMAND FOUNE--B=COMMAND ADDRESS>* * SCOM ASSUMES THAT BEFORE IT IS CALLED, SBHED AND* SCHL ARE INITIALIZED AS REQUIRED BY SCHAR,, AND * SCHP=0 FOR NORMAL USERS AND OCT40 FOR CONSOLE.      SPC 1 SCOM  NOP           ENTRY POINT.      LDB .-3       INITIALIZE CHAR. COUNT TO -3      STB SCNT      JSB SCHAR     GET A CHARACTER.      JMP SCOM,I    NOT THERE-BLANK LINE.       ISZ SCOM      BUMP SCOM TO POINT AT DIGIT RET.      ADA M60B      TEST FOR FIRST CHAR A DIGIT.      SSA           AUTOMATIC FAILURE IF      ISZ SCOM       < ASC0       ADA .-10      SSA           IF <=ASC9,RETURN TO P+2 IF A      JMP SCOM,I     DIGIT, P+3 IF NOT.       ISZ SCOM      ADA M41B      TEST FOR LETTER.SCOMB SSA,RSS       JMP SCOM,I    NOT ALETTER.      ADA .+32B       SSA       JMP SCOM,I    NOT A LETTER.       IOR SCHP      ISZ SCNT      TEST FOR 3 LETTERS IN.      ALF,SLA,RAL   NO--ROTATE FOR NEXT ONE.      JMP SCOMA     YES--GO TO SEARCH TABLE.      STA SCHP      JSB SCHAR     GET NEXT CHARACTER      JMP SCOM,I    FAIL.       ADA M133B       JMP SCOMB * SEARCH COMMAND TABLE *SCOMA LDB SCOM1     B=>TABLE      SSA       ADB .+COM4-COM1 SCOMD CPA 1,I       JMP SCOMC     COMMAND FOUND       CPB SCOM5       JMP SCOM,I    ILLEGAL COMMAND       INB       JMP SCOMD SCOMC ISZ SCOM      RETURN O.K.       STB SCHP      SAVE ADDRESS OF COMMAND.      JSB SCHAR     SCAN      JMP *+4        FOR CR       CPA .+55B     OR DASH.      RSS       JMP *-4       LDB SCHP      JMP SCOM,I* * THE SWAPR ROUTINE IS CALLED FROM VARIOUS POINTS IN THE SCHEDULER* IN ORDER TO DETERMINE IF A PROGRAM IS READY TO RUN. IT IS ALSO* CALLED WHENEVER THE QUEUE IS UPDATED. THE FUNCTION OF SWAPR IS TO * DETERMINE IF THERE IS A PROGRAM ON THE QUEUE, AND IF SO, IS THE * PROGRAM AT THE HEAD OF THE QUEUE READY TO RUN. IF SAID PROGRAM IS * NOT READY, SWAPR INITIATES THE NECESSARY DISC TRANSFERS. SWAPR IN-* DICATES WHETHER A PROGRAM CAN BE RUN OR NOT AS FOLLOWS: * *     READY    : NORMAL RETURN*     NOT READY: TRANSFER TO SCH1       SPC 2 SWAPR NOP       LDA ENDSK     TEST FOR DISC BUSY.       SZA       JMP SCH1      DISC BUSY--THEREFORE, NOT READY.      LDB MLINK+1   GET FIRST QUEUE ENTRY.      CPB MLINK     TEST FOR QUEUE EMPTY.       JMP SCH1      EMPTY--NOTHING TO DO.       LDA LOGCT     IF CONSOLE AND THERE      IOR T35F1     IS CURRENT OR       CPB T35LN      IMMINENT OUTPUT TO       SZA,RSS          ASR,       JMP SWAP4       JSB DEQUE      SUSPEND UNTIL ITS DONE.      LDA T35ST       STA T35PR       LDA %OUTW       STA T35ST       JMP SWAPR+1 SWAP4 EQU *       ADB .-1       B=>STATUS OF FIRST ENTRY.       LDA 1,I       A=STATUS      CPA .-2       TEST FOR SPECIAL DISCONNECT.      LDA %SYNT+1+BYE-COM2      ADA .-5+COM2-COM3  TEST FOR TYPE II OR III.       SSA,RSS       JMP SWAP3     PROGRAM IS OF TYPE III.       ADB .-?STAT   TEST FOR PROGRAM IN CORE.       CPB MAIN      JMP SWAPR,I   PROGRAM PRESENT.      LDA MAIN      FIND OUT WHAT PROGRAM IS.       SZA           IS ANY PROGRAM PRESENT?       JMP SWAP1     YES.      STB MAIN      SET MAIN TO NEW PROGRAM.* * INITIATE DISC TO CORE TRANSFER*       ADB .+?PROG   B=>PROGRAM END LOCATION.      LDA 1,I       COMPUTE NUMBER OF       STA PBPTR       CMA            WORDS IN PROGRAM.      ADA USE       STA WORD      STORE -LENGTH INTO WORD.      ADB .+?DISC-?PROG       LDA 1,I       A=DISC ADDRESS      LDB USEI      B=CORE ADDRESS      JSB DISC,I    INITIATE DISC TRANSFER.       JMP SCH1      RETURN BUSY.      SPC 1 * * INITIATE CORE TO DISC TRANSFER*       SPC 1 SWAP1 STA 1         B=>TABLE OF USER TO BE WRITTEN. SWAP2 CLA           SET MAIN TO SAY NO USER IN      STA MAIN       CORE.      ADB .+?PROG   B=>PROG.END LOCATION.       LDA PBPTR       STA 1,I       CMA       ADA USE       STA WORD      STORE -LENGTH INTO WORD.      ADB .+?DISC-?PROG  B=>DISC ADDRESS.       LDA 1,I       GET USER DISC ADDRESS.      AND HIMSK     DELETE SECTOR PART.       STA 1,I       RAL,RAL       GET DISC TABLE      AND .+3        ADDRESS      ADA ?ATBL       LDA 0,I       A=SELECT CODE FOR DISC.       STB TYPET     SAVE DISC ADR. LOCN.      CLB       LSL 8         SHIFT TRACK LENGTH INTO B.      ALF,ALF       GET SELECT CODE.      AND B77       ADA LIA1      SET UP LIA.       STA *+1       READ DISC STATUS.       LIA 0       ALF,ALF       GET CURRENT SECTOR.       AND B177      ADA .+2       GET POTENTIAL DEST. SECTOR.       CMB           GET # OF SECTORS LEFT       ADB 0          ON TRACK.      CMB       BLF           GET # OF WDS LEFT ON      RBL,RBL        TRACK.       ADB WORD      TEST TO SEE IF THERE'S ENOUGH.      ADA TYPET,I   COMPUTE NEW DISC ADDRESS.       SSB           IF END OF TRACK NOT LONG ENOUGH,      LDA TYPET,I    WRITE TO BEGINNING.      STA TYPET,I   STORE NEW DISC ADR IN TABLE.      LDB USE       B=CORE ADDRESS.       JSB DISC,I    INITIATE DISC TRANSFER      JMP SCH1       AND RETURN BUSY.       SPC 1 * *  TYPE III PROGRAMS*       SPC 1 SWAP3 LDB MAIN      TEST FOR MAIN PROGRAM IN CORE       SZB       JMP SWAP2     GO TO WRITE OUT MAIN PROGRAM.       ADA DCOM6     A=>DISC ADDRESS FOR LIB.PROG.       CPA LIB       IS IT IN CORE?      JMP SWAPR,I   YES--RETURN PRESENT.      STA LIB       IF NOT, INITIATE READ IN.       LDB M256      LENGTH OF PROGRAM =256      STB WORD      LDB #LIBI       LDA 0,I       JSB DISC,I      JMP SCH1* * ENTRY POINT FOR INPUT REQUEST * SCHIQ NOP       CLF 0         INTERRUPT INHIBIT.      LDB MLINK+1   SET RESTART ADDRESS       ADB .+?RSTR-?LINK  INTO TABLE.      LDA SCHIQ       STA 1,I       INB           GET PROGRAM TYPE      LDA 1,I       SSA           QUIT IF ABORT REQUEST.      JMP SUSP      ADB .+?PLEV-?STAT       STA 1,I       SET INTO PLEV.      ADB .+?STAT-?PLEV       LDA %INPT     CHANGE STATUS TO      STA 1,I        INPUT WAIT.      JMP SUSP       GO REMOVE FROM QUEUE.* * ENT RY  POINT FOR TERMINATION * SCHEQ CLF 0       LDB MLINK+1   SCRATCH IF      CPB T35LN       JMP *+4       ADB .-?LINK    THIS IS      JSB HTEST       $HELLO.       LDB MLINK+1        CHANGE       ADB .+?STAT-?LINK  STATUS       LDA 1,I       CPA .-1       QUIT IF ABORT REQUEST.      JMP SUSP      CLA                TO IDLE      STA 1,I       JMP SUSP* SCHAR FETCHES THE NEXT CHARACTER FROM A BUFFER. BUFFER* POINTERS FOR SCHAR ARE INITIALIZED AS FOLLOWS:*     SBHED=>FIRST CHARACTER IN BUFFER*     SCHL,I=>BUFFER END* * SCHAR CALLING SEQUENCE: * *     JSB SCHAR *     RETURN HERE IF CR *     RETURN HERE IF ANY OTHER CHARACTER      SPC 1 SCHAR NOP       LDB SBHED     GET POINTER.      CLE,ERB       POSITION AS WORD POINTER.       LDA 1,I       GET WORD CONTAINING CHARACTER.      ELB,SLB       REPOSITION POINTER AND TEST       RSS                FOR UPPER OR LOWER.      ALF,ALF       AND B377      MASK OUT CHARACTER.       CPA .+15B     RETURN IMMEDIATELY IF CR      JMP SCHAR,I       INB           BUMP CHARACTER POINTER.       CPB SCHL,I    TEST FOR END OF BUFFER.       ADB MBLEN     IF END, CHANGE TO BEGINNING.      STB SBHED       CPA .+40B     SKIP BLANKS       JMP SCHAR+2       ISZ SCHAR       JMP SCHAR,I * * DEQUE REMOVES A USER FROM THE QUEUE. IT IS CALLED WITH THE USER'S * LINK ADDRESS IN B.* DEQUE NOP       LDA MLINK     GET POINTER TO FIRST ENTRY. DEQ1  CPB 0,I       TEST FOR ENTRY FOUND.       JMP DEQ2      LDA 0,I       LINK TO NEXT ENTRY.       CPA MLINK     TEST FOR END OF QUEUE.      JMP DEQUE,I   NOT ON QUEUE--RETURN.       JMP DEQ1      LOOP. DEQ2  LDB 1,I       LINK AROUND THIS USER.      STB 0,I       JMP DEQUE,I       HED OUTPUT CHARACTER ROUTINE* THE OUTCR ROUTINE PLACES A CHARACTER IN A USER'S* BUFFER. THE CALLING SEQUENCE IS:* *     JSB OUTCR,I   A=CHARACTER TO BE OUTPUT*                   B=TTY TABLE ADDRESS.* * OUTCR HANDLES 2 SPECIAL CASES:* * A) BUFFER IS EMPTY -- CODE IS SET UP IN THE LADDR TO PROCESS*    OUTPUT, AND THE TTY TABLE IS INITIALIZED PROPERLY. * * B) BUFFER IS FULL -- THE USER IS PLACED IN OUTPUT WAIT STATUS.*    A TRANSFER IS MADE INTO THE SYSTEM IN ORDER TO DELETE THE*    USER FROM THE QUEUE. *       SPC 3 #OUTC NOP           ENTRY POINT.      CLF 0         INHIBIT INTERRUPT.      AND B177      STA OUTM1     SAVE CHARACTER IN OUTM1.      ADB .+?LADR   B=>LADDER ADDRESS       LDA 1,I       A=LADDER ADDRESS      ADA .-3       STA OUTM2       ADB .+?MASK-?LADR       LDA IOTOG     IS USER ALREADY IN      AND 1,I        OUTPUT MODE?       SZA,RSS       JMP OUTC1     YES--GO ADD CHAR TO BUFFER.       XOR IOTOG     NO--CHANGE BIT TO SAY       STA IOTOG      OUTPUT.      LDA OUTM2,I   HAS AN INPUT CHARACTER STARTED?       ALF,ELA       IF SO, BIT 12 OF HIS LADR WORD      LDA .-20       WILL BE A 1. SET TIMER TO -20      SEZ             IF NOT, TO -100 IF SO. THES       LDA M100       ALLOWS PROPER SYNCHRONIZATION.       ADB .-?MASK       STA 1,I * * USER IS NOT DOING ANY IO--WE HAVE TO SET UP OUTPUT PARAMETERS *       LDA 1       AND B1777     MASK LOW 10 BITS OF ADDRESS IN      IOR ISZIP      ORDER TO BUILD ISZ INSTRUCTION.      STA OUTM2,I   SET ISZ INTO LADDER.* * NOW WE MUST INITIALIZE THE PARAMETERS IN TTY TABLE. *       CCA             SYNCHRONIZING.      INB               PLACE ALL ONES IN CHAR TO PRE-      STA 1,I        VENT SPURIOUS GARBAGE.       INB           SET BIT COUNT TO -1 TO GET THE      STA 1,I        THING STARTED.       LDA .-2       SET CHAR.COUNT TO -2: 1 FOR FAKE      ADB .+2        CHARACTER,1 FOR CURRENT ONE.       STA 1,I OUTC5 ADB .+?BEND-?CCNT   B=>BUFFER END.      CCA       ADA 1,I       A=>LAST CHARACTER.      ADB .+?BPNT-?BEND       STA 1,I       SET UP BUFFER POINTER.      ADA MBLN1     A=>FIRST CHARACTER.       INB           B=>?BSTR      JMP OUTC2     GO INSERT IN BUFFER.* * USER HAS BEEN OUTPUTTING, SO THIS ISN'T THE FIRST CHARACTER.* OUTC1 ADB .+?CCNT-?MASK  FIND OUT HOW MANY CHARS IN       LDA 1,I        THE BUFFER.      CPA MBLEN     IS BUFFER FULL?       JMP OUTC4     YES.      ADA .-1       SET COUNT TO SAY ONE MORE CHAR.       STA 1,I       CPA .-2       IF THIS IS THE FIRST CHARACTER,       JMP OUTC5      GO RESET THE POINTERS.       ADB .+?BSTR-?CCNT  B=>BUFFER TAIL       LDA 1,I       INA           BUMP A FOR LOCN OF NEXT CHAR.       ADB .+?BEND-?BSTR       CPA 1,I       PERFORM WRAPAROUND      ADA MBLEN      IF NECESSARY.      ADB .+?BSTR-?BEND OUTC2 STA 1,I       SET NEW VALUE OF POINTER.       STA 1         B=CHAR.PNTR.      CLE,ERB       B=WORD.PNTR.      LDA 1,I       A=WORD      SEZ,RSS       POSITION DESTINATION CHARACTER      ALF,ALF        TO RIGHT SIDE.       AND HIMSK     CLEAR RIGHT SIDE.       ADA OUTM1     MERGIN IN CHARACTER.      SEZ,RSS       POSITION      ALF,ALF        PROPERLY.      STA 1,I       PLACE BACK IN MEMORY.       STF 0         TURN OF INTERRUPT       JMP #OUTC,I    AND RETURN.* * TAKE CARE OF BUFFER BEING FULL. * OUTC4 ADB .+?STAT-?CCNT  B=>STATUS      LDA 1,I       SSA           IF ABORTED GO DIRECTLY      JMP SUSP       TO SUSPEND.      ADB .+?PLEV-?STAT  MOVE STATUS TO       STA 1,I        PLEV AND SET       ADB .+?STAT-?PLEV    STATUS TO      LDA %OUTW             OUTWAIT.      STA 1,I       CCA           SET RETURN ADDRESS TO       ADA #OUTC      RECALL OUTC      ADB .+?RSTR-?STAT       STA 1,I       LDA OUTM1       STA AREG      ADB .-?RSTR       STB BREGSUSP  LDA MLINK+1,I       STA MLINK+1       CLA           LOCK      STA CLC1       CLOCK      JMP SCH1      JUMP TO SCHEDULER SCHOQ NOP           OUTPUT SUSPEND REQUEST ENTRY.       CLF 0         TURN OFF INTERRUPT.       LDA SCHOQ     SET UP RETURN ADDRESS.      INA       STA #OUTC       LDB MLINK+1   FOOL OUTCR INTO DOING THE WORK.       ADB .+?STAT-?LINK       JMP OUTC4+1 * HTEST SCRATCHES A PROGRAM IF THE ASSOCIATED HFLAG BIT IS SET. * B POINTS TO THE USER'S TTY ADDRESS. * HTEST NOP       ADB .+?MASK   GET USER'S MASK.      LDA 1,I       AND HFLAG     GET HFLAG BIT.      SZA,RSS       JMP HTEST,I   RETURN IF HFLAG BIT =0.       XOR HFLAG     CLEAR HFLAG BIT.      STA HFLAG       ADB .-?MASK   SCRATCH IT.       JSB SCRAT       JMP HTEST,I   RETURN.       HED COMMAND TABLE *  COMMAND TABLE -- THIS TABLE CONSISTS OF 2 PARTS. PART 1 CONTAINS *  THE ENCODED SYMBOLIC COMMANDS. THESE ARE CODED AS 3 BYTES, EACH*  BYTE BEING OF LENGTH 5 BITS AND OF VALUE 101(OCTAL) LESS THAN THE* OCTAL VALUE OF THE CHARACTER. THE THREE BYTES ARE IN BIT POSI-*  TIONS 14-10,9-5, AND 4-0, RESPECTIVELY. BIT 15 IS SET TO 1 FOR *  COMMANDS THAT ARE LEGAL FOR THE SYSTEM CONSOLE.* *  PART 1 IS ITSELF DIVIDED INTO 3 SECTIONS. COMMANDS IN SECTION 1*  ARE THOSE COMMANDS WHICH ARE HANDLED IMMEDIATELY BY THE EXECUTIVE*  WITHOUT ANY DISC ACCESS. THOSE IN SECTION 2 ARE COMPILER COMMANDS*  WHICH ARE RESIDENT BUT WHICH REQUIRE THE PROGRAM TO BE LOADED*  FROM DISC. COMMANDS IN SECTION 3 ARE SYSTEM COMMANDS WHICH ARE *  DISC RESIDENT. ALL SYSTEM COMMANDS ARE OF THIS TYPE AND* MUST BE LOCATED AFTER COM4. * *  PART 2 OF THE COMMAND TABLE CONTAINS THE CORE STARTING ADDRESSES * FOR THOSE COMMANDS IN SECTIONS 1 AND 2, AND THE DISC ADDRESSES OF *  THOSE IN SECTION 3.* *  PART I * *  SECTION I* COM1  OCT 44121     SCRATCH SCR   EQU COM1      OCT 46017     TAPE      OCT 24230     KEY * *  SECTION II * COM2  OCT 43215     RUN LIS   OCT 26422     LISTPUN   OCT 37215     PUNCH CTAPR OCT -1        USED FOR TAPE ERROR PRINTOUT. * *  SECTION III* COM3  OCT -1        FOR LENGTH SECTION      OCT -1        FOR FUSS TABLE.       OCT -1        FOR FILES.SAVE  OCT 44025,-1      OCT 14223     GET       OCT 757       APPENDHELLO OCT 16213     HELLO BYE  OCT 3404      BYE      OCT 24413     KILL      OCT 42215     RENUMBER      OCT 32014     NAME      OCT 4023      CATALOG       OCT 26401     LIBRARY       OCT  6213     DELETE      OCT 46414     TIME      OCT 37056     PROTECT       OCT 50657     UNPROTECT       OCT 34744     OPEN      OCT 26215     LENGTH      OCT 10107     ECHOCOM4  OCT 142217    REPORT      OCT 142222    RESET       OCT 104340    CHANGE      OCT 106421    DIRECTORY       OCT 145140    STATUS      OCT 144544,-1 SLEEP       OCT 132226    NEWID       OCT 124413,-1 KILLID      OCT 150653    UNLOCK      OCT 126702,-1 LOCK      OCT 137221,-1 PURGE       OCT 142722    ROSTER      OCT 106422    DISC      OCT 130006    MAGTAPE       OCT 136356    PHO * *  PART II -- STARTING ADDRESSES* COM5  DEF #SCR      DEF #TAP      DEF SCH20     KEY *       DEF CMPLE       DEF LIST      DEF PUNCH       DEF TAPER * *  DISC ADDRESSES -- TO BE FILLED BY THE LOADER.* COM6  BSS COM5-COM3 FILIB EQU COM6+2    FILES DISC ADDRESS. DSERA BSS 5         DISC ADDRESSES FOR ERROR MESS.LOGGR BSS 32        HOLDS INFO FOR LOGGINGBUF03 BSS BUFLN BUF04 BSS BUFLN BUF05 BSS BUFLN BUF06 BSS BUFLN BUF07 BSS BUFLN 