* * * * * * WRITE REQUEST FROM USER 2 * WRIT2 NOP STA OCNT2 SAVE COUNTER STBFAD2 SAVE ADDRESS P WCONT MOVE IN AND PROCESS * * READ REQUEST FROM USER 2 * READ2 NOP STA OCNT2 SAVE COUNTER STB BFAD2 SAVE ADDRESS JMP RCONT CONTINUE SETTING UP INPUT * *** TAPE CALL FOR USER 2 * TAPE2 NOP LDA TAPE2 STA READ2 JMP TCONT * * * *** CHANNEL # 2 INTERRUPT PROCESSOR * INT2 NOP STA &SV2 SAVE A-REGISTER LDA DFLG LOAD DRIVER FLAG SZA BUSY? JMP &INT2 YES- SET INTERRUPT FLAG CCA A=-1 STA DFLG SET DRIVER FLAG JSB SAVRG SAVE REGISTERS LDA .2 A = CHANNEL 2 JSB INT PROCESS CHARACTER CLA CLEAR DRIVER... STA DFLG ... BUSY FLAG LDA &SV2 RESTORE A-REG JMP INT2,I RETURN * &INT2 ISZ INT2F INDEX INTERRUPT FLAG JMP *-3 RETURN &SV2 NOP * * * * WRITE REQUEST FOR USER 3 * WRIT3 NOP STA OCNT3 STB BFAD3 JMP WCONT MOVE IN AND PROCESS * * READ REQUEST FOR USER 3 * READ3 NOP STA OCNT3 STB BFAD3 JMP RCONT * * TAPE REQUEST FOR USER 3 * * TAPE3 NOP LDA TAPE3 STA READ3 JMP TCONT * *** CHANNEL # 3 INTERRUPT PROCESSOR * INT3 NOP STA &SV3 SAVE A-REGISTER LDA DFLG LOAD DRIVER FLAG SZA BUSY? JMP &INT3 YES- SET INTERRUPT FLAG CCA A=-1 STA DFLG SET DRIVER FLAG JSB SAVRG SAVE REGISTERS LDA .3 A = CHANNEL 3 JSB INT PROCESS CHARACTER CLA CLEAR DRIVER... STA DFLG ... BUSY FLAG LDA &SV3 RESTORE A-REG JMP INT3,I RETURN * &INT3 ISZ INT3F INDEX INTERRUPT FLAG JMP *-3 RETURN &SV3 NOP * *** WRITE REQUEST FROM USER 4 * WRIT4 NOP STA OCNT4 SAVE BUFFER LENGTH STB BFAD4 SAVE BUFFER ADDRESS JMP WCONT MOVE IN AND PROCESS * *** READ REQUEST FROM USER 4 * READ4 NOP STA OCNT4 SAVE COUNTER STB BFAD4 SAVE ADDRESS JMP RCONT CONTINUE SETTING UP INPUT * *** TAPE REQUEST FOR USER 4 * TAPE4 NOP LDA TAPE4 STA READ4 JMP TCONT * *** CHANNEL 4 INTERRUPT PROCESSOR * INT4 NOP STA &SV4 SAVE A-REGISTER LDA DFLG LOAD DRIVER FLAG SZA BUSY? JMP &INT4 YES-SET INTERRUPT FLAG CCA A=-1 STA DFLG SET DRIVER FLAG JSB SAVRG SAVE REGISTERS LDA .4 A=CHANNEL 4 JSB INT PROCESS INTERRUPT CLA CLEAR DRIVER--- STA DFLG ---BUSY FLAG LDA &SV4 RESTORE A-REGISTER JMP INT4,I RETURN * &INT4 ISZ INT4F INDEX INTERRUPT FLAG JMP *-3 RETURN &SV4 NOP * CLC1 NOP CLC 0 JMP CLC1,I * CLC2 NOP CLC 0 JMP CLC2,I * CLC3 NOP CLC 0 JMP CLC3,I * CLC4 NOP CLC 0 JMP CLC4,I * CLCL NOP CLC 0 JMP CLCL,I * *** INPUT CALL FOR LOG TTY * READL NOP LDA .6 LDB PTBA STA OCNTL SAVE CHARS REQUESTED COUNT STB BFADL SAVE BUFFER ADDRESS LDA .5 A = 5 : USER # 5 (LOG TTY) STA DFLG SET DRIVER BUSY FLAG STA USNT SAVE IN USER TEMP JSB IOIN MOVE USER IN JSB DRIVI INITIATE INPUT JSB IOOT MOVE USER OUT CLA CLEAR DRIVER -> STA DFLG --> BUSY FLAG JMP READL,I RETURN * * OUTPUT CALL FOR LOCAL TTY * OUTL NOP STA OCNTL STB BFADL LDA USN LOAD USER NUMBER STA LUSN SAVE IN LOCAL USER NUMBER LDA .5 A = 5 : USER # 5 (LOG TTY) STA DFLG SET DRIVER BUSY FLAG STA USNT SET TO USER # 5 (LOG) JMP WCONT+4 * *** LOG TTY INTERRUPT PROCESSOR * INTL NOP STA &SVL SAVE A-REGISTER LDA DFLG LOAD DRIVER FLAG SZA BUSY? JMP &INTL YES- SET INTERRUPT FLAG CCA A=-1 STA DFLG SET DRIVER FLAG JSB SAVRG SAVE REGISTERS LDA .5 A = 5 : USER # 5 (LOG TTY) JSB INT PROCESS CHARACTER CLA CLEAR DRIVER... STA DFLG ... BUSY FLAG LDA &SVL RESTORE A-REG JMP INTL,I RETURN * &INTL ISZ INTLF INDEX INTERRUPT FLAG JMP *-3 RETURN &SVL NOP * ******************************************* *** *** *** TIME-SHARED INTERRUPT PROCESSOR *** *** *** ******************************************* * * INT NOP STA USNT JSB IOIN JSB DRIV JSB IOOT JMP INT,I * * * *** INPUT - OUTPUT UTILITY ROUTINES * IOIN NOP MOVE USER IN CCA A= -1 ADA IOSKA ADD ON USER STACK ADDRESS ADA USNT INDEX BY USER NUMBER LDA A,I LOAD SOURCE ADDRESS LDB DRVSK LOAD DRIVER STACK JSB MVSTK MOVE I/O STACK DEC 11 JMP IOIN,I RETURN * IOOT NOP MOVE USER OUT CCB GET I/O STACK ADDRESS ADB IOSKA ADB USNT INDEX BY USER NUMBER LDB B,I LOAD ACTUAL DESTINATION ADDRESS LDA DRVSK LOAD SOURCE ADDRESS JSB MVSTK MOVE USER OUT DEC 11 CLO CLEAR OVERFLOW LDA SAVE GET E & O SLA,ELA CHK OV AND MOVE E INTO POS STO OVERFLOW SET LDB SAVB LOAD B-REG JMP IOOT,I RETURN * * * * * * MOVE STACK SUBROUTINE * * * *** SUBROUTINE TO MOVE STACK OF VALUES * * CALL: * LOAD A-REGISTER WITH ADDRESS OF ORIGIN STACK * LOAD B-REGISTER WITH ADDRESS OF DESTINATION STACK * (P) JSB MVSTK * (P+1) OCT N IS NUMBER OF WORDS TO MOVE * (P+2) RETURN * MVSTK NOP ADDRESS OF NUMBER OF WORDS TO MOVE STA ORSTK SAVE ORIGIN STACK ADDRESS LDA MVSTK,I LOAD # OF WORDS TO TRANSFER CMA,INA,SZA,RSS JMP NORET STA TEMP STORE AWAY COUNTER P1... LDA ORSTK,I LOAD CELL FROM ORIGIN STACK STA B,I TRANSFER TO DESTINATION STACK INB B= NEXT ADDRESS IN D-STACK ISZ ORSTK INDEX TO NEXT ADDRESS IN O-STACK ISZ TEMP TEST IF FINISHED JMP P1... NO, CONTINUE NORET ISZ MVSTK COMPUTE RETURN ADDRESS JMP MVSTK,I RETURN VIA ADDRESS IN MVSTK * * * * * * * SAVE REGISTER SUBROUTINE * SAVRG NOP STB SAVB SAVE B-REGISTER ERA,ALS SAVE E IN BIT 15 SOC CHECK OVERFLOW INA INDEX A IF O SET STA SAVE SAVE E & O JMP SAVRG,I * * * * IMON NOP TURN ON STOP CCA ADA IOSKA GET STACK ADDRESS ADA USN LDA A,I ADA .10 ADD INDEX TO INHIBIT FLAG CLB CLEAR INHIBIT STB A,I JMP IMON,I * IMOFF NOP TURN OFF STOP CCA ADA IOSKA ADA USN LDA A,I ADA .10 STA A,I SET STOP INHIBIT FLAG JMP IMOFF,I * * *** MAIN CONSTANTS AND TABLES FOR TSB DRIVERS * ORSTK NOP TEMP NOP SAVB NOP SAVE NOP .5 OCT 5 &CT NOP &BIAS NOP &MAIN NOP &USR NOP LUSN NOP DWS DEF *+1 DEF WRIT1,I DEF WRIT2,I DEF WRIT3,I DEF WRIT4,I DRS DEF *+1 DEF READ1,I DEF READ2,I DEF READ3,I DEF READ4,I * FLAG1 NOP MAIN NOP CT NOP BIAS NOP @CARD DEF CCARD @PHTO DEF CPHTO TEMP1 NOP BSKA DEF BSK1-1 INTA OCT 30 USNT NOP WRITL EQU OUTL * *** INTERRUPT FLAGS * INTF DEF *+1 INT1F NOP INT2F NOP INT3F NOP INT4F NOP INTLF NOP * TCNTA DEF * NOP NOP NOP NOP * ADR1 NOP * ************************************* *** *** *** MONITOR - USER I/O STACKS *** *** *** ************************************* * *** USER #1 I/O STACK * BFAD1 NOP ADDRESS OF USER BUFFER NOP NEGATIVE COUNTER DEF CHIN1 DEF CHOT1 IO1 NOP DATA1 NOP DATA IN-OUT-ERROR FLAG OCNT1 NOP LENGTH FROM I/O CALL NOP POSITIVE COUNTER DEF CLC1 NOP TAPE FLAG OCT 1 * *** USER #2 I/O STACK * BFAD2 NOP NOP NEGATIVE COUNTER DEF CHIN2 DEF CHOT2 IO2 NOP DATA2 NOP DATA FLAG OCNT2 NOP ORIGINAL COUNTER NOP POSITIVE COUNTER DEF CLC2 NOP TAPE FLAG OCT 1 * *** USER #3 I/O STACK * * BFAD3 NOP NOP NEGATIVE COUNTER DEF CHIN3 DEF CHOT3 IO3 NOP DATA3 NOP OCNT3 NOP NOP POSITIVE COUNTER DEF CLC3 NOP TAPE FLAG OCT 1 * *** USER # 4 I/O STACK * BFAD4 NOP NOP NEGATIVE COUNTER DEF CHIN4 DEF CHOT4 IO4 NOP DATA4 NOP OCNT4 NOP NOP POSITIVE COUNTER DEF CLC4 NOP TAPE FLAG OCT 1 * *** LOCAL TTY ( USER # 5) I/O STACK * BFADL NOP NOP NEGATIVE COUNTER DEF CHINL DEF CHOTL IOL NOP DATAL NOP DATA IN-OUT-ERROR FLAG OCNTL NOP PCNTL NOP DEF CLCL NOP TAPE FLAG OCT 1 * * USER I/O STACK NAMES * IOSKA DEF *+1 DEF BFAD1 USER # 1 I/O STACK NAME DEF BFAD2 USER # 2 I/O STACK NAME DEF BFAD3 USER # 3 I/O STACK NAME DEF BFAD4 USER # 4 I/O STACK NAME DEF BFADL LOG TTY STACK NAME * * *** DRIVER BUSY FLAG * DFLG NOP * * * DRIVER DATA STACK * * BUFAD NOP BUFFER ADDRESS NCNT NOP NEGATIVE COUNTER CHIN NOP ADDRESS OF INPUT SUBROUTINE CHOUT NOP ADDRESS OF OUTPUT SUBROUTINE IOFLG NOP INPUT/OUTPUT FLAG DATA NOP DATA-IN-OUT-ERROR FLAG OCNT NOP ORIGINAL COUNTER PCNT NOP POS COUNTER CLC NOP BPTR NOP STPIN OCT 0 * DRVSK DEF BUFAD DRIVER STACK POINTER INCMD OCT 160001 INPUT COMMAND OTCMD OCT 130000 * PTPRA ABS PTPRC PTBA ABS PTBUF SKP * ************************************** *** *** *** TIME-SHARE TELETYPE DRIVER *** *** *** ************************************** * * * * * * INITIATE OUTPUT * RESET NOP JSB CLEAR PUT RUBOUT INTO BOARD CLA CLEAR STA DATA DATA FLAG STA PCNT POSITIVE COUNTER LDA OCNT LOAD NEGATIVE COUNTER SSA,RSS CHECK IF NEGATIVE CMA,INA NO - MAKE NEG STA NCNT SAVE NEGATIVE COUNTER JMP RESET,I * DRIVO NOP JSB RESET LDB BUFAD CHECK BUFFER ADDRESS SZB,RSS IS IT ZERO? STA OCNT YES - RESET OCNT TO NEGATIVE LDA OTCMD LOAD OUTPUT COMMAND STA IOFLG SAVE IN I/O FLAG JSB DRIV GO TO CONTINUATOR JMP DRIVO,I RETURN TO MONITOR* * * * INITIATE INPUT * * DRIVI NOP JSB RESET LDB INCMD SET INPUT COMMAND STB IOFLG IN I/O FLAG JSB CHIN,I START INPUT JMP DRIVI,I RETURN * * 22255-80008 D