IDENT MUXINT EJECT * * EXT I.LOCK,EVENT1 EXT DISASTR EXT E.ECS EXT I.MUXQ,I.MUXPC EXT HANG1 EXT DINTQ,INTSCR LIST X INTSYS XTEXT EJECT * * DEFINE ASSORTED CONSTANTS * * * MUX INTERRUPT COMMANDS TO TTY OUTPUT * COUTEVNT EQU 1 GETOKRSP EQU 2 GETNORSP EQU 3 CSPOUT EQU 4 * * MUX INTERRUPT COMMANDS TO TTY INPUT * CINEVNT EQU 1 INRESP EQU 2 CHKEMPT EQU 3 CHKNEMPT EQU 4 * * EVENTS TO USER * OUTEVENT EQU 10000B INEVENT EQU 20000B EVEVENT EQU 30000B * * SIZE OF MULTIPLEXOR * * MUXWRBIT MUST BE CHANGED IN MUX IF MUXWRBT * CHANGED HERE * ENTRY MUXWRBT * MUXWRBT EQU 400B MUXWRBIT EQU MUXWRBT * * * CONSTANTS OFR BROADCST * MAXBRDCN EQU 16 MAX NUMBER OF WORDS IN A BROADCAST MSSG EJECT * * ECS READ AND WRITE MACROS * RECS MACRO CNT RE CNT RJ E.ECS ENDM * WECS MACRO CNT WE CNT RJ E.ECS ENDM EJECT * * ENTRY POINT OFR MUX INTERRUPT CODE * ENTRY I.MUXP * I.MUXP SA1 I.LOCK BX6 X1 SA6 =XI.WAIT NZ X1,0 SA1 E.ECS NZ X1,0 MUXLOOP JP CHKPPU ( WILL BE MODIFIED BY RJ S ) BX7 X7-X7 SA7 E.ECS + JP 0 EJECT * * SEE IF ANY COMMANDS FROM PPU * * REGISTER USE * X1 CMMD * X2 PHYSICAL ADDRESS * X3 ECS ADDRS OF 2ND PART OF PROCESS * X6 REST OF COMMAND WORD, SHIFTED * * B2 EVENT TO BE SENT TO USER, IF NON ZERO * * MUXEXIT RJ MUXLOOP SETS UP CALL TO CHKPPU * * CHKPPU RJ GETPPU ZR X5,CHKEVNT NONE, SEE IF ANY EVENTS * MX0 60-12 LX6 12 BX1 -X0*X6 GET CMMD LX6 12 BX2 -X0*X6 GET CHAN SX3 X2-MUXWRBIT*2 NZ X3,CHKPPU1 * SX3 MUXWRBIT SPECIAL ADDRESS JP CHKPPU2 * CHKPPU1 SX3 MUXWRBIT BX3 -X3*X2 INPUT CHAN NUMBER CHKPPU2 RJ GETPPROC READ IN PART 2 OF PPROC ZR X0,CHKPPU NO SUCH PPROC SB1 X1 LT B1,B0,CHKPPU SB2 CMMDN LT B2,B1,CHKPPU SB2 B0 JP CMMDX+B1 * CMMDX JP CHKPPU NULL COMMAND + JP SENDW 1 SEND A WORD TO ECS BUFFER + JP GETW 2 GET A WORD FROM ECS BUFFER + JP SENDEV 3 SEND AN EVENT + JP CHKECS 4 CHECK ECS BUFFER + JP HANGP 5 HANG ON THE EVENT CHANNEL * BSS 0 CMMDN EQU *-CMMDX-1 * * CHKPPUX BX0 X3 SA0 FILED WECS PSIZE2 WRITE BACK PART 2 OF PROCESS * CHKPPUY ZR B2,CHKPPU SEE IF AN EVENT TO SEND, JUMP IF NOT SX7 B2 EVENT DATUM SB7 CHKPPU WHERE TO RETURN JP SENDVENT SEND AN EVENT EJECT * * EVENTS TO BE SENT TO TTY PROCESS ( EVENT1 ) * * 1 MORE OUTPUT AVAILABLE * 2 PURGE CM INPUT BUFFER ( MOVE TO ECS ) * 3 GO TO ECHO MODE * 4 CHANGE BREAK TABLE * 5 GO TO NON ECHO MODE * 6 HAVE REMOVED SOME WORDS FROM INPUT ECS BUFFER * 7 CHANGE MILD PANIC CHARACTER EJECT * * SEE IF ANY EVENTS FROM USER PROCESSES * * * REGISTER USE * * X1 EVENT WD 1 * X2 ECS ADDRESS OF PROCESS * CHKEVNT SA1 MUXQADD RJ DINTQ ZR X2,MUXEXIT NO EVENTS, SO EXIT BX0 X2 SA0 PROCESS RECS PSIZE SA1 EVENTWD2 PICKUP SECOND EVENT WD NZ X1,CHKEVNT2 CHECK FOR PL X1,CHKEVNT2 EVENT = -0 * BX1 X2 RJ HANGON SB7 CHKEVNT EVENT IS -0, SIGNALS EVENT CHAN SX7 EVEVENT WAS FULL, SO SEND RESPONSE TO USER JP SENDVENT PROCESS * CHKEVNT2 SA3 INCHAN SX3 X3-MUXWRBIT ZR X3,CHKEVNT4 IS SPECIAL TTY INDEX * MX0 60-24 BX1 -X0*X1 BX6 X1 AX6 12 GET 2ND 12 BITS OF EVENT SB1 X6 LT B1,B0,CHKEVNT3 SB2 EVNTN LT B2,B1,CHKEVNT3 JP EVNTX+B1 * EVNTX JP CHKEVNT3 0 NUMBER IN COL 36 + JP OUTEVNT 1 + JP INEVNT 2 + JP INEVNT 3 + JP INEVNT 4 + JP INEVNT 5 + JP GOTDATA 6 JP INEVNT 7 * BSS 0 EVNTN EQU *-EVNTX-1 * * * CHKEVNT3 BX1 X2 RJ HANGON JP CHKEVNT * * EVENT RECIEVED BY SPECIAL TTY * CHKEVNT4 MX0 60-12 BX6 X1 LX6 60-12 BX6 -X0*X6 GET 2ND 12 BITS SB1 X6 LT B1,B0,CHKEVNT3 SB2 SEVNTN LT B2,B1,CHKEVNT3 JP SEVNTX+B1 JUMP ON REQUEST INDEX * SEVNTX JP CHKEVNT3 0 + JP BRDCST 1 * BSS 0 SEVNTN EQU *-SEVNTX-1 EJECT * * EVENT HANDLING CODE * * * SEND AN EVENT TO OUT ADDRESS * OUTEVNT SX6 COUTEVNT SX4 MUXWRBIT * OUTEVNT1 LX6 12 SA3 INCHAN MX0 60-12 BX3 -X0*X3 REMOVE ALL BUT INPUT LINE NUMBER BX6 X3+X6 PLACE CHAN ADDRSS IN COMMAMD BX6 X6+X4 LX6 24 BX6 X6+X1 PLACE EVENT IN COMMADN LX6 12 RJ PUTPPU SEND COMMAND TO PPU JP CHKEVNT * * SEND AN EVENT TO IN ADDRESS * INEVNT SX6 CINEVNT SX4 B0 JP OUTEVNT1 * * WORDS MAY HAVE BEEN REMOVED FROM IN BUFFER * GOTDATA SA3 INCHAN PL X3,CHKEVNT3 NO RESPONSE WAITING RJ GETFILE SA3 PIN SX3 X3+1 SA4 PLAST IX4 X3-X4 NZ X4,GOTDATA1 SA3 PFLAST WRAP AROUND GOTDATA1 SA4 INOUT IX4 X3-X4 COMPARE IN WITH OUT ZR X4,CHKEVNT3 STILL FULL * SA3 INCHAN NOT FULL, SEND RESPONSE AND RESET MX6 1 RESPONSE BIT, ALSO REHANG ON EVNT BX6 -X6*X3 CHANNEL SA6 INCHAN SX0 PSIZE1 IX0 X0+X2 SA0 FILED WECS PSIZE2 RJ PUTFILE SX6 INRESP LX6 12 SA3 INCHAN MX0 60-12 BX3 -X0*X3 REMOVE ALL BUT INPUT LINE NUMBER BX6 X6+X3 LX6 60-24 RJ PUTPPU BX1 X2 JP CHKEVNT3 * * * * SEND A BROADCAST TO ALL DEVICES * BRDCST BX1 X2 RJ HANGON RE HANG SX3 MUXWRBIT RJ GETPPROC READ IN PART 2 OF PPROC RJ GETFILE SA1 OUTFST WORD COUNT SX1 X1 BX6 X1 SX1 X1-MAXBRDCN NG X1,BRDCST1 SX6 MAXBRDCN BRDCST1 SA6 BRDCSTCN SAVE COUNT SX6 MUXWRBIT SA6 BRDCSTX INITIALIZE INDEX * BRDCSTL SA1 BRDCSTX SX6 X1-1 SA6 A1 NG X6,CHKEVNT ALL DONE RJ SETBRD SET BROADCAST FLAG IN THIS DEVICE JP BRDCSTL * * * * SET BROADCAST FLAG FOR A PARTICULAR DEVICE * INPUT INDEX AT BRDCSTX * SETBRD BSSZ 1 SA3 BRDCSTX RJ GETPPROC READ IN PART 2 OF PPROC ZR X0,SETBRD NO SUCH PPROC EXISTS SA2 BRDCSTCN BX6 X2 SA6 BROADFLG SET FLAG RJ PUTPPROC WRITE BACK PART2 OF PPROC SA1 SETBRDA SA2 BRDCSTX SX0 MUXWRBIT-1 BX2 X0*X2 SX2 X2+MUXWRBIT PREPARE OUTPUT ADDRESS OF LINE LX2 3*12 BX6 X1+X2 RJ PUTPPU INFORM PPU OF MORE OUTPUT AVAILABLE JP SETBRD * SETBRDA VFD 12/CSPOUT,12/0,12/0,12/0,12/0 EJECT * * GET A WORD FROM ECS BUFFER * GETW SA4 BROADFLG NZ X4,GETWBRD BROAD CAST IN PROGRESS RJ GETFILE SA4 POUT GET OUT POINTER SA5 OUTIN GET IN POINTER IX5 X4-X5 ZR X5,GETWA ECS BUFFER EMPTY SA5 FILED GET FILE ADDRESS AX5 18 IX0 X4+X5 COMPUTE STORAGE ADDRESS SA0 FILEW RECS 1 GET A WORD SX5 1 IX4 X4+X5 BUMP POINTER SA5 PFLAST IX5 X4-X5 NZ X5,GETW1 SA4 PFIRST WROP AROUND GETW1 BX6 X4 SA6 POUT UPDATE POINTER SA5 OUTIN IX5 X4-X5 NZ X5,GETW2 SB2 OUTEVENT GETW2 SX6 GETOKRSP LX6 12 BX6 X6+X2 LX6 60-24 RJ PUTPPUX SA5 FILEW BX6 X5 RJ PUTPPU RJ PUTFILE JP CHKPPUX * GETWA SX6 GETNORSP JP SENDW3 * * * BROADCAST ON THIS DEVICE IN PROGRESS * GETWBRD SB6 X4 MESSAGE WORD COUNT LX4 60-18 SB5 X4 CURRENT POSTION SB4 B5+1 NEXT POSTIION LT B4,B6,GETWBRD1 THIS NOT THE LAST * SX6 B0 THIS WAS THE LAST JP GETWBRD2 * GETWBRD1 SX6 B6 THIS NOT LAST, FORM NEW FLAG WORD SX7 B4 LX7 18 BX6 X6+X7 * GETWBRD2 SA6 BROADFLG SX6 B5 SA6 BRDCSTX SAVE CURRENT POSTION RJ PUTPPROC PUT BACK PART 2 OF PPROC SX3 MUXWRBIT RJ GETPPROC READ IN SPECIAL PPROC SA1 FILED GET FILE ADDRESS AX1 18 POSITION ADDRESS CORECTLY SA4 BRDCSTX GET CURRENT POSTION SX4 X4+1 IX0 X1+X4 SA0 FILEW RECS 1 GET THE WORD SX6 GETOKRSP LX6 12 BX6 X6+X2 LX6 60-24 RJ PUTPPUX SA5 FILEW BX6 X5 RJ PUTPPU JP CHKPPU EJECT * * SEND A WORD TO ECS BUFFER * SENDW RJ GETFILE GET FILE CONTROL DATA RJ GETPPU GET A WORD FROM PPU SA6 FILEW SAVE THE WORD SA4 PIN GET IN POINTER SA5 FILED GET FILE ADDRESS AX5 18 IX0 X4+X5 COMPUTE STORAGE ADDRESS SA0 FILEW WECS 1 STORE THE WORD SX4 X4+1 BUMP THE POINTER SA5 PLAST GET LAST IX6 X4-X5 COMPARE WITH LAST NZ X6,SENDW1 SA4 PFLAST WRAP AROUND SENDW1 BX6 X4 SA6 PIN SX4 X4+1 IX6 X4-X5 NZ X6,SENDW2 SA4 PFLAST WRAP AROUND SENDW2 SA5 INOUT IX5 X4-X5 COMPARE WITH OUT ZR X5,SENDWC SX6 INRESP * SENDW3 LX6 12 BX6 X6+X2 LX6 60-24 RJ PUTPPU SEND A RESPONSE TO PPU * SENDW4 RJ PUTFILE WRITE BACK FILE CONTROL DATA JP CHKPPUX * SENDWC SA4 INCHAN MX6 1 BX6 X6+X4 SA6 INCHAN SB2 INEVENT JP SENDW4 EJECT * * SEND AN EVENT TO USER * SENDEV LX6 24 MX7 60-24 BX7 -X7*X6 FORM EVENT WD 1 FROM COMMAND SB7 CHKPPU JP SENDVENT * * CHECK ECS BUFFER * CHKECS RJ GETFILE GET FILE DATA SA4 INOUT SA5 PIN IX4 X4-X5 NZ X4,CHKECS1 NOT EMPTY * SX6 CHKEMPT EMPTY JP CHKECS2 * CHKECS1 SX6 CHKNEMPT CHKECS2 LX6 12 BX6 X6+X2 LX6 60-24 FORM COMMAND RJ PUTPPU JP CHKPPU * * HANG THE PROCESS ON AN EVENT CHANNEL * HANGP SX1 PSIZE1 IX1 X3-X1 RJ HANGON JP CHKPPU EJECT * * HANG PROCESS IN EVENT CHANNEL ( ECS ADDRS IN X1 ) * DESTROYS ALL REGISTERS * HANGON BSS 1 SA0 PROCESS BX0 X1 RECS PSIZE1 BX3 X1 MOVE ECS ADDRS OF PROCS TO X3 SX6 B0 SA6 CHAINWD SA6 ZWD SA0 PROCESS BX0 X1 WECS PSIZE1 SB1 INTSCR SA1 PMOT SB7 HANGON SA2 FRMEVENT JP HANG1 * * SEND AN EVENT * * EVENT WD 2 IN X7 * PROCESS 2ND PART IN CORE * RETURN IN B7 * SENDVENT SA5 PMOT BX6 X5 MOT OF THIS PROCESS SA1 TOEVENT EVENT CHANNEL INFO SB6 -1 WHERE TO WTORE RETURNS SB1 INTSCR JP EVENT1 EJECT * * GET FILE CONTROL INFO * DESTROYS A4, X4, A0, X0 * GETFILE BSS 1 SA4 FILED AX4 18 BX0 X4 SA0 OUTFST RECS 7 JP GETFILE * * WRITE BACK FILE CONTROL INFO * DESTROYS A4, X4, A0, X0 * PUTFILE BSS 1 SA4 FILED AX4 18 BX0 X4 SA0 PFIRST WECS 5 JP PUTFILE EJECT * * CODE TO GET A WORD FROM CM QUEUE * RETURNS RESULT IN X6 ( X5 = 0 IF NO RESULT ) * DESTROYS A4, X4, A5, X5, A6, X6, A7, X7 * GETPPU BSS 1 SA4 TOCMOUT SA5 TOCMIN IX5 X4-X5 ZR X5,GETPPU EXIT IF NO ENTRIES IN QUEUE SA5 X4 BX6 X5 GET ENTRY SX4 X4+1 BUMP POINTER SA5 TOCML PICK UP LIMIT IX5 X5-X4 NZ X5,GETPPU1 SA4 TOCMF WRAP AROUND GETPPU1 BX7 X4 SA7 TOCMOUT UPDATE POINTER SX5 1 JP GETPPU * * CODE TO PUT A WORD IN FRMCM QUEUE * WILL NOT UPDATE POINTERS * HAVE WORD IN X6 * DESTROYS A4, X4, A5, X5, A6, X6 * PUTPPUX BSS 1 SA5 FRMCMINX PICK UP POINTER SA6 X5 STORE THE WORD SX5 X5+1 BUMP POINTER SA4 FRMCML PICK UP LIMIT IX4 X5-X4 NZ X4,PUTPPUX1 SA5 FRMCMF WRAP AROUND PUTPPUX1 SA4 FRMCMOUT PICK UP OUT POINTER IX4 X5-X4 ZR X4,PUTPPUX1 FULL QUEUE, WAIT IN LOOP BX6 X5 SA6 FRMCMINX SAVE POINTER JP PUTPPUX * * CODE TO PUT A WORD IN FRMCM QUEUE * WILL UP DATE POINTER * HAVE WORD IN X6 * DESTROYS A4, X4, A5, X5, A6, X6 * PUTPPU BSS 1 RJ PUTPPUX SA6 FRMCMIN JP PUTPPU * * * GET PART 2 OF A PPROC * INPUT INDEX IN X3 * * USES X0, X3, X4 * * SAVES X6 * * RETURNS ADDRESS OF PART 2 IN X3 * GETPPROC BSSZ 1 SA6 GTPRCSV6 SX3 X3 SX0 X3-MUXWRBIT-1 + NG X0,*+1 RJ DISASTR SA4 MUXPNTS START ADDRESS OF PPROC POINTERS IX0 X3+X4 SA0 PROCESS RECS 1 SA4 PROCESS BX0 X4 SA3 GTPRCSV6 BX6 X3 ZR X0,GETPPROC NO SUCH PPROC MX3 60-21 BX3 -X3*X4 ECS ADDRESS OF PPROC SX4 PSIZE1 AMOUNT TO SKIP IX3 X3+X4 BX0 X3 BX6 X3 SA6 PPROC2 SAVE ADDRESS OF PART 2 SA0 FILED RECS PSIZE2 READ IN PART 2 SA4 GTPRCSV6 BX6 X4 JP GETPPROC * * * RETURN PART 2 OF A PPROC * ECS ADDRESS OF PART 2 ASSUMED IN PPROC2 * * USES X0, X1 * PUTPPROC BSSZ 1 SA1 PPROC2 BX0 X1 SA0 FILED WECS PSIZE2 JP PUTPPROC EJECT * * ECS POINTERS FOR MUX INTERRUPT CODE * * * ENTRY MUXQADD,MUXPNTS * MUXQADD BSSZ 1 WILL CONTAIN ECS ADDRS OF MUX QUEUE MUXPNTS BSSZ 1 ECS ADDRS OF PNTRS TO PSEUDO PROCS EJECT * * THESE ARE THE POINTERS USED BY THE MUXPPU * ENTRY I.MUX I.MUX VFD 60/CMBUF VFD 60/CENTQ VFD 60/TOCMF-CENTQ VFD 60/FRMCMF-CENTQ VFD 60/ZERO * * THESE ARE THE AREAS USED BY THE MUXPPU * * * ZERO DATA 0 A ZERO TO BE USED BY MUX PPU TOCMQSZ EQU 20 FRMCMQSZ EQU 20 * * CENTQ BSS 0 * TOCMF VFD 60/TOCMQ TOCMIN VFD 60/TOCMQ TOCMOUT VFD 60/TOCMQ TOCML VFD 60/TOCMQ+TOCMQSZ * FRMCMF VFD 60/FRMCMQ FRMCMIN VFD 60/FRMCMQ FRMCMOUT VFD 60/FRMCMQ FRMCML VFD 60/FRMCMQ+FRMCMQSZ * FRMCMINX VFD 60/FRMCMQ * * * THIS QUEUE MUST BE IN BOTTOM 4K ( DEC ) OF CM * TOCMQ BSSZ TOCMQSZ FRMCMQ BSSZ FRMCMQSZ * CMBUF BSSZ 2*MUXWRBIT EJECT * * TEMPORARY DATA USED BY MUX INTERRUPT ROUTINE * * PROCESS BSS 1 CHAINWD BSS 1 ZWD BSS 1 CONTWD BSS 1 EVENTWD1 BSS 1 EVENTWD2 BSS 1 * BSS 0 PSIZE1 EQU *-PROCESS * FILED BSS 1 PFIRST BSS 1 POUT BSS 1 PFLAST BSS 1 PIN BSS 1 PLAST BSS 1 FRMEVENT BSS 1 TOEVENT BSS 1 INCHAN BSS 1 PMOT BSS 1 BROADFLG BSS 1 * BSS 0 PSIZE2 EQU *-PROCESS-PSIZE1 PSIZE EQU PSIZE1+PSIZE2 * * QFIRST BSS 1 QLAST BSS 1 * OUTFST BSS 1 OUTOUT BSS 1 OUTLAST BSS 1 ININ BSS 1 INLAST BSS 1 OUTIN BSS 1 INOUT BSS 1 * FILEW BSS 1 * * * BRDCSTCN BSS 1 BRDCSTX BSS 1 PPROC2 BSS 1 GTPRCSV6 BSS 1 * END