      HED SLEEP * THE SLEEP COMMAND IS A SYSTEM COMMAND WHICH IS USED FOR SYSTEM* SHUTDOWN. THE SLEEP ROUTINE PERFORMS THE FOLLOWING FUNCTIONS: * *     1) PLACE ALL USERS IN DISCONNECT MODE.*     2) OUTPUT SPECIFIED MESSAGE TO ALL TERMINALS. *     3) DISCONNECT ALL USERS.*     4) LOG OFF ALL ACTIVE USERS.*     5) FIXUP ALL USER TRACKS AND FUSS.*     6) GARBAGE COLLECT LIBRARY. *     7) DUMP SYSTEM TO MAG TAPE.       SPC 2       ORG LIBRA       CLF 0       CLA       STA T35C1     NO DEBLANKING.      STA MPCOM      MAKE SURE NO USERS       STA SLEPH,I       LDA MLINK      CAN GET QUEUED.      STA T35LK       LDA .-16      PLACE ALL USERS IN ABORT      STA LTEMP      MODE AND CUT OFF OUTPUT.       LDB DTTY0 SLE1  ADB .+?STAT       LDA .-2       STA 1,I       ADB .+?CCNT-?STAT       CCA       STA 1,I       ADB .-?CCNT+TTY01-TTY00       ISZ LTEMP       JMP SLE1      LDA ONEI      OUTPUT      LDB DEH        LINE FEED      JSB TTY35,I * * OUTPUT SLEEP MESSAGE TO ALL ACTIVE TERMINALS. *       LDA .+15B     FIRST OUTPUT CR-LF-LF       JSB SLECH       LDA .+12B       JSB SLECH       LDA .+12B       JSB SLECH *       JSB T35CQ     GET INPUT CHARACTER.      JMP *+3       END OF INPUT      JSB SLECH       JMP *-3 *       JSB SLECH     FOLLOW BY ANOTHER CRLFLF.       LDA .+12B       JSB SLECH       LDA .+12B       JSB SLECH * * WAIT FOR ALL OUTPUT TO END. *       LDA IOTOG       INA,SZA       JMP *-2 *       CCA           DISCONNECT      LDB PHSC       ALL      ADB *+2        TELEPHONES.      STB *+1       OTA 0 * * NOW WE HAVE TO LOG OFF ALL ACTIVE USER. *       LDA IDLEN     READ IN       STA WORD       IDT.       LDA IDLOC       LDB LIBDI       JSB DISCL *       LDB DTTY0     SEARCH USER TABLES.       ADB .+?ID       FOR ACTIVE IDS.       LDA .-16      STA LTEMP SLE2  LDA 1,I       GET ID.       SZA,RSS       TEST FOR ACTIVE.      JMP SLE3      NOT ACTIVE.       STB LTEMP+1   SAVE POINTER. * * COMPUTE TIME USED.*       ADB .+?TIME-?ID       DLD 1,I       GET STARTING TIME       CMA,INA       SET BOTH PARTS NEGATIVE.      CMB,INB       CLF 0       ADA DATIM     A=# OF HRS. USED.       CLE       ADB DATIM+1   B=# OF UNITS, WITH OVERFLOW IN E.       STF 0       STB LTEMP+2   SAVE # OF UNITS.      MPY D60       HRS==> MINS.      STA LTEMP+3       LDA LTEMP+2   GET UNIT COUNT; IF E=0 THEN       SEZ,RSS        COUNNT AS NEGATIVE.      CCB       DIV D600      CHANGE TO MINUTES.      ADA LTEMP+3   ADD IN OTHER MINUTES.       STA LTEMP+2   TOTAL IN LTEMP(2).* * SEARCH IDT FOR USER.*       LDA LTEMP+1,I GET ID AGAIN.       LDB LIBD      GET IDT POINTER.      CPA 1,I       JMP *+3       ADB .+8       JMP *-3 * * UPDATE IDT ENTRY. *       ADB .+5       COMPUTER NEW TOTAL TIME.      CLE       LDA 1,I       ADA LTEMP+2       SEZ           IF OVERFLOW,      CCA            USE MAXIMUM.       STA 1,I *       LDA LOGCT     CHECK FOR ROOM IN LOG TABLE.      CPA .+16      JMP *-2       LDA LOGP2     SET LOGP2 TO NEXT LOCATION IN       INA            LOG TABLE.       CPA LOGND       LDA LOGBG       STA LOGP2       LDA LTEMP+1,I PLACE ID IN LOG TABLE.      IOR BIT15       STA LOGP2,I       ISZ LOGP2       DLD DATIM     COMPUTE TIME OF DAY.      STB LTEMP+2   SAVE UNIT COUNTER       CLB           GET NO OF HRS.      DIV .+24      LDA 1       MPY D60       CHANGE TO MINS.       STA LTEMP+3   SAVE.       LDA LTEMP+2   CHANGE UNITS TO MINS.       ADA D36K      DIV D600      ADA LTEMP+3   COMPUTE TOTAL TIME.       ALF           ROTATE.       ADA LTEMP     ADD IN PORT NO.       ADA .+16      STA LOGP2,I   STORE IN TABLE.       ISZ LOGCT     BUMP COUNTER. *       LDB LTEMP+1   GET POINTER AGAIN.SLE3  ADB .+TTY01-TTY00       ISZ LTEMP     TEST FOR DONE.      JMP SLE2*       LDA IDLOC     OUTPUT      LDB LIBD       IDT.       JSB DISCL * * CLEAR FUSS TABLE. *       LDB LIBD      CLA       STA 1,I       INB       CPB L128      RSS       JMP *-4       LDA M128      STA WORD      LDA FUSS,I      LDB LIBD      JSB DISCL * * SET ALL USER SWAP AREAS AT TRACK ORIGIN.*       LDA .-16      SET       STA LTEMP      COUNTER.       LDA PBUFF     SET       CMA            TRANSFER       ADA USE         LENGTH.       STA LTEMP+2       LDB DTTY0     INITIALIZE POINTER TO       ADB .+?DISC    DISC ADDRESS.SLE4  STB LTEMP+1       LDA LTEMP+2       STA WORD      LDA LTEMP+1,I GET DISC ADDRESS.       LDB LIBDI     GET LOCN.       JSB DISCL     READ IT.      LDA LTEMP+2       STA WORD      LDA LTEMP+1,I SET AT TRACK ORIGIN.      AND M128      WRITE       LDB LIBD       BACK       JSB DISCL       OUT.      LDB LTEMP+1   BUMP TO NEXT USER.      ADB .+TTY01-TTY00       ISZ LTEMP     TEST FOR DONE.      JMP SLE4* * *       LDA LOGCT     WAIT FOR LOG TABLE TO EMPTY.      SZA       JMP *-2       CPA T35F1     WAIT FOR TTY TO STOP.       RSS       JMP *-2 *       LDA M252      READ IN OVERLAY.      STA WORD      DLD LIB,I       LDA 1       LDB #LIBI       JMP LIBRA+254 * * * * SLECH OUTPUTS THE CHARACTER IN A TO ALL ACTIVE* USER TERMINALS. * SLECH NOP       STA LTEMP     SAVE CHARACTER.       LDA .-16      SET       STA LTEMP+1    COUNTER.       LDB DTTY0     GET INITIAL POINTER.      ADB .+?ID SLEC1 LDA 1,I       TEST FOR ACTIVE.      SZA,RSS       JMP SLEC2     INACTIVE.       STB LTEMP+2   SAVE POINTER.       LDA LTEMP       ADB .-?ID       JSB OUTCH,I   OUTPUT IT.      LDB LTEMP+2   GET ID POINTER AGAIN. SLEC2 ADB .+TTY01-TTY00       ISZ LTEMP+1   TEST FOR DONE.      JMP SLEC1       JMP SLECH,I SLEPH DEF SCH1      ORG LIBRA+254       JSB DISCL       JMP LIBRA $SLE  EQU *       HED SLEEP OVERLAY * THE SLEEP OVERLAY IS RESPONSIBLE FOR CLEANING UP THE DISC LIBRARY.* IT DOES THIS BY COMPACTING ALL PROGRAMS ON EACH TRACK SO THAT EACH* TRACK HAS AT MOST ONE AVAILABLE AREA ON IT. AFTER PERFORMING THIS * OPERATION, IT THEN CALLS IN THE SYSTEM DUMP TO THROW THE SYSTEM * OUT TO TAPE.      SPC 2       ORG LIBRA       LDA ADLEN     READ IN       STA WORD       ADT.       LDA ADLOC       LDB LIBDI       JSB DISCL *       LDA B400      INITIALIZE TRACK COUNTER TO 1.SLE5  STA SLET      CLB           DETERMINE IF TRACK IS LOCKED.       RRL 4       ALF       ADB DTRAX       LDB 1,I       CMA       RBR       INA,SZA       JMP *-2       SSB       JMP SLE6      TRACK IS LOCKED.*       LDB SLET      GET TRACK # IN B.       LSR 14        GET DISC #.       ADB ?ATBL     GET DISC TBL ADR.       LDB 1,I       GET DISC INFO.      LSR 8         GET TRACK LENGTH.       STB SLETL     SAVE TRACK LENGTH.      LDA SLET      TEST FOR SYSTEM TRACK.      CPA IDLOC       JMP SLE6      CPA DIREC+6       JMP SLE6      CPA DIREC+13      JMP SLE6      CPA DIREC+20      JMP SLE6      CPA DIREC+27      JMP SLE6*       LDB ADLEN       CMB,INB       ADB LIBDSLE8  CPB LIBD      JMP SLE7      NOT A SYSTEM TRACK      ADB .-2       CPA 1,I       INB,RSS       FOUND AN ENTRY.       JMP SLE8      LDA 1,I       GET ENTRY LENGTH.       SZA           IF LENGTH=0 OR SLETL, THERE ARE       CPA SLETL     NO PROGRAMS ON IT.      JMP SLE6* SLE7  LDA ADLEN     WE WANT TO PACK ALL THE PROGRAMS      STA WORD       ON THE TRACK. FIRST WRITE THE      LDA ADLOC       ADT BACK OUT.       LDB LIBD      JSB DISCL * * WE NOW ARE GOING TO BUILD A TABLE WITH ONE ENTRY FOR EACH PROGRAM * ON THE TRACK. THE 2 WORDS IN THE ENTRY ARE THE CURRENT DISC * ADDRESS AND THE NEW DISC ADDRESS FOR THE FOLLOWING PROGRAM. *       LDA SLET      INITIALIZE      STA SLES       DISC ADDRESS       STA SLER        POINTERS.       LDA STAB      INITIALIZE      STA SLEP       TABLE      STA SLEQ        POINTERS.       LDA DIRD0     INITIALIZE DIRECTORYSLE9  STA SLEI       TRACK POINTER.       LDB 0,I       READ DIRECTORY.       STB WORD      ADA .+6       LDA 0,I       LDB LIBDI       JSB DISCL *       CLA           CLEAR FLAG SAYING NO CHANGE       STA SLEF       YET IN DIRECTORY.      LDB SLEI,I    SET B TO POINT TO       CMB,INB        END OF DIRECTORY.      ADB LIBDSLE12 CPB LIBD      DONE SCANNING DIRECTORY?      JMP SLE10     YES.      ADB .-2       B=>DISC ADR OF ENTRY.       LDA 1,I       GET DISC ADR.       AND HIMSK     CLEAR SECTOR PART.      CPA SLET      ON THIS TRACK?      JMP SLE11     YES.      ADB .-6       NO--BUMP BACK FOR NEXT ENTRY.       JMP SLE12 SLE11 LDA 1,I       GET DISC ADDRESS AGAIN.       STA SLEP,I    STORE IN TABLE.       LDA SLES      ASSIGN NEW DISC ADDRESS.      STA 1,I       INB       LDA 1,I       GET PROGRAM LENGTH.       ARS,ARS       CONVERT TO FULL SECTORS       ARS,ARS       ARS,ARS       CMA,INA       ADA SLES      ADD TO NEW DISC ADR. COUNTER      STA SLES      ISZ SLEP      ALSO STORE IN TABLE.      STA SLEP,I      ISZ SLEP      ISZ SLEF      SET FLAG TO WRITE DIRECTORY BACK      ADB .-7       GO DO NEXT ENTRY.       JMP SLE12 * SLE10 LDA SLEF      IF F=0 WE DIDN'T MODIFY THE       SZA,RSS        DIRECTORY, SO WE DON'T HAVE TO       JMP SLE13       WRITE IT BACK.      LDA SLEI      ADA .+6       LDA 0,I       LDB LIBD      JSB DISCL SLE13 LDA SLEI      CPA DIRD3     LAST DIRECTORY TRACK?       JMP *+3       ADA .+7       JMP SLE9* * NOW READ IN ALL THE LIBRARY PROGRAMS IN THE ORGER THAT WE'RE*  GOING TO WRITE THEM BACK.* SLE14 LDA SLEQ      ALL PROGRAMS IN YET?      CPA SLEP      JMP SLE15     YES       DLD SLEQ,I    GET DISC ADDRESS OF PROGRAM.      CMB,INB       COMPUTE -SECTOR LENGTH      ADB SLER      CLA       ASL 6         CHANGE TO WORDS.      STB WORD      LDB SLER      COMPUTE CORE ADDRESS.       LSL 8       LSR 2       ADB LIBDI       LDA SLEQ,I      JSB DISCL       ISZ SLEQ      SET NEW VALUES      LDA SLEQ,I     OF SLER AND SLEQ.      STA SLER      ISZ SLEQ      JMP SLE14 * SLE15 LDA SLER      WRITE ENTIRE TRACK      CMA,INA       ADA SLET      ASL 6       STA WORD      STA SLETT,I   STORE -LENGTH IN TABLE.       LDA SLET      LDB LIBD      JSB DISCL *       LDA ADLEN     READ ADT.       STA WORD      LDA ADLOC       LDB LIBDI       JSB DISCL * * WE NOW WANT TO REPLACE ALL ADT ENTRIES REFERENCING THIS TRACK BY A* SINGLE ENTRY, WITH VALUES OF R AND SLETL-R (SECTOR).*       LDB LIBD      SEARCH FOR FIRST ENTRY AT SLE16 LDA SLET       THIS TRACK OR BEYOND.      CMA,CLE,INA       ADA 1,I       SEZ       JMP *+3       ADB .+2       JMP SLE16 *       STB SLES      LDA 1,I       TEST FOR ENTRY ON THIS TRACK.       CPA .-1       CHECK FOR SPECIAL ENTRY.      JMP *+4       AND HIMSK       CPA SLET      JMP SLE18     ENTRY IS ON THIS TRACK. * * HAVE TO CREATE A NEW ENTRY. *       LDA SLET      IS TRACK TO BE      ADA SLETL      EMPTY?       CPA SLER      JMP SLE17     YES--FORGET IT.       LDA IDLEN     WILL NEW ENTRY FIT?       AND M64       ADA ADLEN       CPA M5440       JMP SLE17     NO--FORGET IT.*       LDB ADLEN       ADB .-2       STB ADLEN     NEW ADLEN.      CMB       ADB LIBD      MOVE      STB MOVED      ADT      ADB .-2         DOWN.       STB MOVES       CMB       ADB SLES      JSB MOVEB       JMP SLE19     GO INSERT NEW ENTRY.* SLE18 ADB .+2       SEARCH FOR FIRST ENTRY NOT ON       LDA 1,I        THIS TRACK.      CPA .-1       JMP *+4       AND HIMSK       CPA SLET      JMP SLE18 *       STB MOVES     SET SOURCE FOR MOVE       ADB ADLEN     SET WORD COUNT.       ADB MLIBD       LDA SLET      SET DESTINATION ACCORDING TO      ADA SLETL      WHETHER WE'RE MAKING AN      CPA SLER        INSERT OR NOT.      CLA,RSS       LDA .+2       ADA SLES      STA MOVED       JSB MOVEW       LDA MOVED     COMPUTE NEW ADLEN.      CMA,INA       ADA LIBD      STA ADLEN *       LDA SLET      ANY ENTRY?      ADA SLETL       CPA SLER      JMP SLE17     NO. * SLE19 LDB SLER      MAKE ENTRY.       CMB,INB       ADB SLET      ADB SLETL       LDA SLER      DST SLES,I      JMP SLE17 * SLE6  CLA       STA SLETT,I   SET TRACK LENGTH =0 SLE17 ISZ SLETT     BUMP POINTER.       LDA SLET      GET NEXT TRACK NO.      ADA B400      SZA           DONE?       JMP SLE5      NO. *       LDA ADLEN     WRITE OUT ADT.      STA WORD      LDA ADLOC       LDB LIBD      JSB DISCL *       LDA M64       WRITE OUT STUFF IN LOC 100-177.       STA WORD      LDA .+4       LDB B100      JSB DISCL *       LDA S10K      READ IN DUMP.       STA WORD      DLD SDUMP       JSB DISCL *       LDA HLT4C       STA 4       CLC 0,C       JMP *+1,I       OCT 10000 * S10K  OCT -10000SDUMP OCT 23,102000 HLT4C HLT 4,C STAB  DEF LIBUS+8192  START OF SUBDIRECTORY.SLETT DEF TLTAB     TRACK LENGTH TABLE POINTER. TLTAB EQU LIBUS+8192+256 START OF TRACK LENGTH TABLE$$SLE EQU *       ORG LTEMP SLET  BSS 1 SLES  BSS 1 SLER  BSS 1 SLEP  BSS 1 SLEQ  BSS 1 SLEI  BSS 1 SLEF  BSS 1 SLETL BSS 1 