      HED DISC DRIVER * THE TSB DISC DRIVER IS RESPONSIBLE FOR ALL TRANSFERS TO AND FROM* THE SYSTEM DISC(S). THE CALLING SEQUENCE TO THE DRIVER IS AS* FOLLOWS:*     JSB DISC,I*  A-REG=DISC ADDRESS, IN THE STANDARD SYSTEM FORMAT, NAMELY: *      A(15:14)=DISC NO.*      A(13:8) =TRACK NO. *      A(7)    =0 *      A(6:0)  =SECTOR NO.* *  B-REG=CORE ADDRESS (BITS 14:0) AND DIRECTION (BIT 15). *      B(15)=1 FOR A DISC READ, 0 FOR A DISC WRITE. * *  WORD=-# OF WORDS TO BE TRANSFERRED. IF WORD=0, NO TRANSFER IS*      DONE. IF THE TRANSFER IS A WRITE, THE ACTUAL # OF WORDS*      TRANSFERRED IS -64*INT(WORD/64). * *  THE DRIVER MAINTAINS A FLAG CALLED ENDSK. IT IS SET TO 1 WHEN A*  TRANSFER IS INITIATED, AND CLEARED UPON SUCCESSFUL COMPLETION OF *  THE TRANSFER.* *  WHEN AN ATTEMPTED TRANSFER FAILS, IT IS REPEATED 9 ADDITIONAL*  TIMES. IF IT CONTINUES TO FAIL, THE COMPUTER HALTS DISPLAYING*  THE DISC ADDRESS AND CORE ADDRESS IN THE A AND B REGISTERS.*       SPC 2 LDISC NOP           ENTRY POINT.      CLF 0         INTERRUPT OFF.      STA DADDR     SAVE DISC AND       STB CORE       CORE ADDRESSES.      LDB LDISC     SET UP RETURN       STB DINT       ADDRESS.       CLB           TEST FOR ZERO LENGTH TRANSFER.      CPB WORD      JMP DEND      NO TRANSFER.      ISZ ENDSK     SET DRIVER BUSY FLAG. * DSCST LSL 2         GET SELECT CODE FROM DISC TABLE.      ADB ?ATBL       LDA 1,I       STA DTEMP       AND B77       ADA LIA1      CONSTRUCT "LIA COMMAND CHANNEL"       STA DRIVE       STA DINT1       ADA B100      CONSTRUCT "OTA COMMAND CHANNEL"       STA DINT2       ADA B77       CONSTRUCT "STC DATA CHANNEL"      STA DINT3       XOR DCHAN     CONSTRUCT "20000B+SC" AS DMA      OTA DMA        CONTROL WORD.*       LDA .-10      INITIALIZE FAIL COUNT.      STA DFAIL       JMP DRIVE     GO INITIATE TRANSFER. * * INTERRUPT SECTION * * DINT  NOP       CLF 0         INHIBIT INTERRUPT.      DST DSAVE     SAVE A AND B REGISTERS.       LDB .+10B     COMPUTE MASK FOR ERROR TEST.      LDA CORE      TEST BIT 3 ONLY IF OUTPUT.      SSA       LDB .+32B     TEST BITS 1,3,4 IF INPUTDINT1 LIA 0         READ DISC STATUS.       AND 1         MASK RELEVANT BITS.       SZA           IF ERROR BITS SET, GO TO      JMP DISER      DISC RETRY.      STA ENDSK     CLEAR DRIVER BUSY FLAG. DEND  CLC DMA,C     CLEAR DMA.DEND1 DLD DSAVE     RESTORE REGISTERS.      STF 0         FORCE INTERRUPT ON.       JMP DINT,I    EXIT. * DRIVE LIA 0         START TRANSFER.       SLA           TEST IF CONTROLLER BUSY.      JMP DRIVE       ALF,ALF       SSA,RSS       JMP DRIVE       LDB CORE      OUTPUT CORE ADDRESS       CLC DMA-4      TO DMA.      OTB DMA-4       LDA WORD      IF OUTPUT, SET WORD COUNT TO AN       CMB,SSB        EVEN # OF SECTORS.       AND M64       STC DMA-4     OUTPUT WORD       OTA DMA-4      COUNT. *       LDA DTEMP     GET DISC INFO.      ALF,ALF       A(15:14)_TRACK PREFIX.      RBL           B(0)_DIRECTION.       LSL 2         B(2:0)_DADDR PREFIX.      LDA DADDR     GET DISC ADDRESS.       RAL,RAL       REMOVE DISC NUMBER.       LSL 6         EXTRACT TRACK.      RAL           REMOVE BIT 7.       LSR 9         GET FINAL DISC ADDRESS. DINT2 OTA 0         SEND DISC ADDRESS TO DISC       STC DMA,C     INITIATE DMA. DINT3 STC 0         INITIATE DISC.      JMP DEND1 * DISER ISZ DFAIL     TEST FOR DEATH.       JMP DRIVE     TRY AGAIN.      LDA DADDR       LDB CORE      CLC 0,C       HLT 4,C DSCED JMP *-1 * * DADDR BSS 1         DISC ADDRESSCORE  BSS 1         CORE ADDRESS. DCHAN OCT 122700DFAIL BSS 1         FAIL COUNT. DSAVE BSS 2         A&B REGISTERS.DTEMP BSS 1         TBL ENTRY.      HED POWER FAIL/RESTART ROUTINE* THE POWER FAIL/RESTART ROUTINE INSURES A LOGICAL SHUTDOWN AND * RESTART OF THE SYSTEM IN CASE OF POWER FAIL.      SPC 1 POW   NOP           INTERRUPT ENTRY POINT.      SFC 4         TEST FOR FAIL OR RESTART.       JMP POW1      TRANSFER TO RESTART SECTION.* * POWER FAIL SECTION. *       DST POWI      SAVE REGISTERS TEMPORARILY.       ERB,BLS       SOC       INB       CLA           IF POWFF WAS NONZERO,       CPA POWFF      INTERRUPT WAS FROM POWER FAIL.       JMP *+3       STA POWFF       JMP POW2*       LDA POW       TEST FOR INTERRUPT OUT OF       ADA POWD1      RESTART SECTION.       SSA       JMP *+4       NORMAL FAIL.      ADA POWD2       SSA       JMP POW2      FAILED FROM RESTART SECTION.*       STB POWEO     NORMAL FAILURE--SAVE REGISTERS.       DLD POWI      DST POWAB       LDA POW       STA POWP*       LDB .-4       GET INTERRUPT FLAGS FOR DMA,      LDA SFC7       MPX,ASR35,CLOCK INTO BITS 0,1,       STA POWSF       2,3, RESPECTIVELY, OF A.      CLA POWSF SFC 0         TEST FLAG.      IOR .+20B     SET BIT IF FLAG IS SET.       RAR           ROTATE.       ISZ POWSF     BUMP FOR NEXT IO LOC.       INB,SZB       TEST FOR DONE.      JMP POWSF       STA POWFL       SFC 0         IF INTERRUPT IS SET, STORE      LDB STF0       STF 0 INTO POWND; ELSE NOP.      STB POWND * POW2  CLC 4         SET FOR RESTART.      HLT       SPC 2 * RESTART SECTION       SPC 1 POW1  STC 4         RESET FOR POWER FAIL.       CLC 6,C                                    [E]      LDA .+6       INITIALIZE J AS POWER FAIL POIN-      STA POWJ       TER AND I AS DMA POINTER.      INA       STA POWI      LDA .+3       RESET CLOCK FREQUENCY.      OTA CLOCK       LDA POWFL     COPY FLAGS.       STA POWF      LDB TBITS     IF ASR-35 FLAG WAS CLEAR, SET UP      RAR,RAR       THE CORRECT STATE OF THE ASR35      SLA,RSS       OTHERWISE LEAVE IT SET IN THE       OTB ?SC       INPUT STATE.* * SYNCHRONIZE THE TELETYPES BY PLACING 1'S IN ALL * THEIR CHARACTER OUTPUT LOCATIONS. ALSO PLACE IN * MPOUT.*       CCA           FIRST SET MPOUT SO THAT       STA MPOUT      DRIVER WILL BE HAPPY.      LDB POWT1     GET ADDRESS OF CHAR FOR PORT 0. POW3  STA 1,I       SET TO ALL 1'S.       CPB POWT2     TEST FOR DONE       JMP *+3       DONE.       ADB .+TTY01-TTY00 BUMP TO NEXT.       JMP POW3      LOOP. * * NOW TEST THE INDIVIDUAL IO FLAGS. IF A FLAG WAS CLEAR, WE PERFORM * A CLF OPERATION. IF IT WAS SET, WE TAKE STRONGER ACTION.* POW4  LDA POWF      GET WORD CONTAINING FLAGS. THE      RAR           ONE TO BE TESTED IS IN BIT 0 AND      STA POWF      I= ITS SELECT CODE.       SSA       JMP POW5      FLAG SET. *       LDA POWI      PRODUCE CLF INSTRUCTION.      ADA CLF0      STA *+1       NOP           EXECUTE CLF.POW6  LDA POWI      TEST FOR DONE.      CPA .+12B       JMP POW14     DONE.       ISZ POWI      OTHERWISE, BUMP I AND LOOP.       JMP POW4* * FLAG WAS SET. TEST IF ROUTINE HAD ACTUALLY BEEN * ENTERED. IF SO, PERFORM A DUMMY INTERRUPT TO PRE- * VENT IT FROM BEING REENTERED. * POW5  LDB POWTB     COMPUTE LOCATION OF RETURN AD-      ADB POWJ       DRESS OF HIGHEST PRIORITY ROU-       LDB 1,I         TINE NOT YET TESTED.      LDA 1,I       GET ITS RETURN ADDRESS      LDB POWTB       ADB POWI      POINT TO RET.ADR. OF TEST ROUTINE       CMA           TEST FOR INTERRUPT OUT OF THAT      ADA 1,I         ROUTINE.      SSA,RSS       JMP POW6      NO--INTERRUPT WAS PENDING.ADB4  ADB .+4       POINT TO END OF TEST ROUTINE.       ADA 1,I       SSA       JMP POW6      NOT INTERRUPTED.* * PERFORM DUMMY INTERRUPT TO PREVENT AN UNWANTED ONE LATER. *       LDA ADB4      PLACE ADB4 IN INTERRUPT CELL.       STA POWI,I      LDA POWI      ADA STC0      SET UP STC AND CLC.       STA POWST       XOR B4000     CREATE CLC. POWST STC 0         SET DEVICE CONTROLSTF0  STF 0         ENABLE INTERRUPT (CAUSING ADB4&       STA POWCL     COMPUTE ADR. OF CORRECT INT. VAL) CLF0  CLF 0         DISABLE INTERRUPT.POWCL CLC 0         DISABLE DEVICE.       LDA 1,I       GET CORRECT INTERRUPT CONTENTS.       STA POWI,I    STORE IN INTERRUPT CELL.      LDA POWI      UPDATE INTERRUPT CHAIN      STA POWJ       POINTER.       JMP POW6      GO TEST NEXT DEVICE.* ***  HAVE DONE ALL DUMMY INTERRUPTS.***   SET  CONTROL ON MPX,CLK AND TTY.POW14 STC MPX       STC CLOCK       STC ?SC       LDA TBITS     RE-ESTABLISH PREVIOUS       OTA ?SC       STATE OF ASR35***  IF DISC TRANSFER WAS IN PROGRESS REPEAT TRANSFER ***  ELSE DO NORMAL RETURN.       LDA ENDSK       SZA,RSS       JMP POW27     DO NORMAL RETURN. ***  DISC DRIVER WAS BUSY. TEST IF POWER FAIL ***  TOOK PLACE WITHIN DISC DRIVER.       LDA DADDR     PREPARE FIRST PARAMETER.      LDB POWP      GET RETURN ADDRESS.       ADB POW28     COMPARE TO START OF DISC DRIVER.      SSB           RETURN ADDRESS < DRIVER ?       JMP POW29     YES.      ADB POW31     COMPARE TO END OF DRIVER.       SSB,RSS       RETURN ADDRESS > DRIVER ?       JMP POW29     YES.      CLB           JUMP DIRECTLY TO THE DRIVER.      JMP DSCST POW29 ISZ POWFF     SET TO 1 IN CASE OF ANOTHER       LDB CORE       FAILURE.       JSB DISC,I    RECALL DRIVER.      CLF 0       CLA           CLEAR FLAG.       STA POWFF * * ***  RESTORE REGISTERS. POW27 LDA POWEO     'E' AND OVERFLOW.       CLO       SLA,ELA       STO       DLD POWAB ***  RESET INTERRUPT SYSTEM TO SAME AS BEFORE FAIL. POWND NOP           OR STF 0. POW40 JMP POWP,I    RETURN. * POWFF NOP           SET TO 1 DURING DISC RECALL.POWI  BSS 1         POINTER TO DEVICE BEING TESTED. POWJ  BSS 1         POINTER TO INTERRUPT CHAIN. POWAB BSS 2         TEMPS TO HOLD VALUES OF A&B.POWEO BSS 1         TEMP TO HOLD VALUE OF E&O.POWP  BSS 1         TEMP TO HOLD VALUE OF P POWFL BSS 1         TEMP TO HOLD STATE OF I/O FLAGS.POWF  BSS 1         COPY OF POWFL.* POWTB DEF *-5       POINTER TO FOLLOWING TABLE.       DEF POWP      POWER FAIL RTN.ADR.       DEF DINT      DISC RTN.ADR.       DEF MPXNT     MPX RTN.ADR.      DEF ?TT2      TTY RTN.ADR.      DEF CLKIN     CLK RTN.ADR.      ABS DSCED-DINT+1   CODES FOR TESTING IF       ABS MPXED-MPXNT+1   INTERRUPTS OCCURRED FROM      ABS TTYED-?TT2+1   WITHIN INTERRUPT       ABS CLKED-CLKIN+1   ROUTINES.       JSB ?ADIN,I   CORRECT CONTENTS      JSB MPXDR,I    OF INTERRUPT CELLS       JSB T35DR,I       JSB CLKDR,I * POWD1 ABS -POW1 POWD2 ABS POW1-POW40-1SFC7  SFC 7 POWT1 DEF TTY00+1 POWT2 DEF TTY15+1 STC0  STC 0 POW31 ABS DSCST-DSCED POW28 ABS -DSCST      HED SYSTEM CONSOLE DRIVER * THE SYSTEM CONSOLE DRIVER CONTROLS ALL TRANSMISSION OF DATA BE- * TWEEN THE SYSTEM CONSOLE (ASR-35) AND THE SYSTEM. IT HANDLES ALL* * IO FOR THE DEVICE AND PROVIDES FOR COMMUNICATION OF MESSAGES TO * THE SYSTEM, THE FOLLOWING VARIABLES ARE SIGNIFICANT:* * T35F1: =0 DURING INPUT, -1 DURING OUTPUT. * T35F2: NORMALLY 0, IT IS SET TO 1 WHEN A COMPLETE MESSAGE HAS *        BEEN RECEIVED. UNTIL IT IS CLEARED BY THE SYSTEM, ALL FUR- *        THER INPUT IS INHIBITED. * TOG:   NOT USED DURING INPUT. DURING OUTPUT, BIT 0 = 0 IF NEXT*        CHARACTER IS ON LEFT, 1 IF ON RIGHT. * TADR:  NOT USED DURING INPUT. DURING OUTPUT, TADR(14:0) POINTS TO *        THE WORD FROM WHICH THE NEXT CHARACTER WILL BE TAKEN.*        BIT 15=1 FOR PUNCH & PRINT, 0 FOR PRINT ONLY.* TCNT:  DURING INPUT, TCNT=# OF CHARS IN SO FAR. DURING OUTPUT,*        TCNT(14:0)=# OF CHARS REMAINING TO BE OUTPUT, BIT 15=0 *        IF A CRLF IS TO BE APPENDED, 1 IF NOT. * TBITS: CONTAINS CURRENT CONTROL BITS. *         120000 => PRINT *         130000 => PUNCH AND PRINT *         160000 => INPUT * TTA,TTB,TTE: USED TO SAVE THE VALUES OF A,B,E REGISTERS DURING*        INTERRUPTS.* * CALLING SEQUENCE: *     JSB TTY35,I  A=# OF CHARS (BIT 15=0 FOR CRLF, 1 FOR NONE) *                  B=BUFFER ADDRESS (BIT 15=1 FOR PUNCHING) * * INPUT MESSAGES ARE STORED IN THE 72 CHARACTER BUFFER T35BF. *       SPC 2 ?TT35 NOP           ENTRY POINT FOR OUTPUT.       CLF 0         INHIBIT INTERRUPT.      STA TCNT      SET UP INITIAL PARAMETERS.      STB TADR      CCA           SET FLAG TO SAY       STA T35F1      OUTPUT.      LDA ?TT35     COPY RETURN ADDRESS INTO THAT OF      STA ?TT2       INTERRUPT SECTION.       CLA           SET TOG TO SAY LEFT HAND CHAR.      STA TOG * * TEST FOR PENDING INPUT. IF THERE IS ANY, EXIT IMMEDIATELY AND LET * THE INTERRUPT TRIGGER THE FIRST OUTPUT CHARACTER. *       LIA ?SC       SSA,RSS       JMP TT18      NONE PENDING--GO OUTPUT 1ST CHAR.       STF 0       JMP ?TT35,I * * INTERRUPT SECTION * ?TT2  NOP       STA TTA       SAVE REGISTERS.       STB TTB       ERA       STA TTE       LDA T35F1     TEST FLAG TO DETERMINE IF       SZA,RSS        INPUT OR OUTPUT.       JMP TT17      INPUT * TT18  LDA TCNT       GET # OF CHARS LEFT.       RAL,CLE,ERA   COPY CRLF BIT INTO E.       SZA           ANY CHARS LEFT?       JMP TT5       YES--GO OUTPUT NEXT ONE.      SEZ           NO--WANT CRLF?      JMP TT6       NO--GO RESET FOR INPUT.       STA TOG       SET UP OUTPUT OF CRLF.      LDA .+2       2 CHARS WITH      IOR BIT15      NO CRLF FOLLOWING.       STA TCNT      LDA TADR      KEEP PRINT/PUNCH BIT.       AND BIT15       IOR ?ABP2       STA TADR      JMP TT18* * END OF OUTPUT--RESET FOR INPUT. * TT6   STA TCNT      SET COUNTER TO SAY NO CHARS IN.       STA T35F1     SET FLAG TO SAY INPUT.      LDA B160K     GET CONTROL BITS FOR INPUT.       STA TBITS     SAVE. TT8   OTA ?SC       OUTPUT TO CONSOLE.TT10  LDA TTE       RESTORE REGISTERS.      ELA       LDA TTA       LDB TTB       STC ?SC,C     ENABLE DEVICE.      STF 0         ENABLE INTERRUPT.       JMP ?TT2,I    EXIT. * * OUTPUT NEXT CHARACTER * TT5   CCA           DECREMENT       ADA TCNT       COUNTER.       STA TCNT      LDB TADR      GET POINTER TO OUTPUT BUFFER.       LDA B120K     GET BITS FOR PRINT ONLY.      RBL,CLE,SLB,ERB    TEST & CLEAR BIT 15 OF B.      LDA B130K     GET PRINT/PUNCH BITS.       STA TBITS     SAVE CONTROL BITS.      OTA ?SC       OUTPUT TO DEVICE.       LDA 1,I       GET WORD CONTAINING CHARACTER.      LDB TOG       GET LEFT/RIGHT TOGGLE.      SLB           IF RIGHT CHARACTER,       ISZ TADR       BUMP POINTER.      SLB,RSS       IF LEFT CHARACTER,      ALF,ALF        POSITION ON RIGHT.       ISZ TOG       REVERSE TOGGLE SENSE. TT15  AND B177      KEEP BITS 6-0 AND       IOR B200       SET BIT 7.       JMP TT8       GO OUTPUT CHARACTER.* * CHARACTER HAS BEEN INPUT. * TT17  LDA T35F2     IGNORE CHARACTER IF T35F2 IS SET      MIA 1          OR SWITCH 0 IS SET.      SLA       JMP TT10      LIA ?SC       GET CHARACTER IN A.       AND B177      CCB           PREPARE -1 IN B.      CPA .+12B     IGNORE LF, RUBOUT, NULL, XOFF.      JMP TT10      CPA B177      JMP TT10      SZA       CPA .+23B       JMP TT10* * TEST FOR ESCAPE/ALTMODE.*       CPA .+33B       JMP TT11      CPA ALTMD       JMP TT11      CPA .176      JMP TT11*       CPA BKSPC     TEST FOR "_"      JMP TT12      CPA .+15B     TEST FOR CR.      STB T35F2     SET COMMUNICATION FLAG. * * NOW INSERT CHARACTER IN BUFFER. *       LDB TCNT      GET COUNT IN B.       CPB ?72       DON'T IF BUFFER IS FULL.      JMP TT10      CLE,ERB       MOVE LEFT/RIGHT BIT TO E, AND       ADB T35B1      COMPUTE ADDRESS OF DESTINATION.      SEZ,RSS       LEFT/RIGHT TEST.      ALF,SLA,ALF   LEFT.       IOR 1,I       RIGHT.      ISZ TCNT      BUMP COUNTER. TT16  STA 1,I        STORE IN BUFFER.       JMP TT10      GO EXIT.* * HANDLE BACKSPACE. * TT12  LDB TCNT      GET CHARACTER COUNT       SZB,RSS       IGNORE IF NO CHARS YET.       JMP TT10      ADB .-1       GET NEW TCNT.       STB TCNT      CLE,ERB       CLEAR RIGHT HALF OF NEW DESTIN-       ADB T35B1     ATION.      LDA 1,I       AND HIMSK       JMP TT16* * HANDLE ESCAPE/ALTMODE.* TT11  STB T35F1     SET OUTPUT FLAG.      CLA           SET TCNT FOR CRLF AFTER "\".      STA TCNT      STA TADR      SET FOR NO PUNCHING.      LDA B120K     SET FOR PRINT ONLY.       STA TBITS       OTA ?SC       LDA RVRSL     GO OUTPUT "\" TTYED JMP TT15BUF08 BSS BUFLN BUF09 BSS BUFLN BUF13 BSS BUFLN BUF14 BSS BUFLN BUF15 BSS BUFLN 