ENBUF EQU * SKP ORG 36000B * *** MONITOR * * * PRIMARY MONITOR LOCATION * MONIT JSB CHIFL CHECK INTERRUPT FLAGS CLA LDB FLAG1 LOAD FLAG SSB IS IT IN LOCAL? JMP USER YES SZB IS IT IN USER? JMP MON2 NO IN EXECUTION CHECK JMP MON1 YES CHECK I/O FLAGS * * * * CHECK LOCAL TTY * CKL LDA FLAG2 LOAD DAY CHANGE FLAG SZA JMP DAYCH DAY CHANGE CCA SET A= -1 STA FLAG1 USER CHECK CLB B=0 LDA DATAL LOAD DATA FLAG SZA,RSS IS IT ZERO? JMP CKPTR GO CHECK PHOTOREADER STB DATAL CLEAR DATA FLAG CPA M15 DATA FLAG OUTPUT JMP .LD. YES CPA M2 NO - DELETED? JMP REDL YES LDA PCNTL NO - INPUT JMP PTPRA,I CHECK LOCAL INPUT * .LD. CCA A=-1 ADA LUSN ADD LOCAL USER # STA BIAS SAVE BIAS JSB ACT ACTIVATE USER JMP WRITL,I RETURN * REDL JSB READL * *** CHECK PHOTOREADER IF IN SYSTEM * CKPTR JSB @CARD,I CHECK IF CARD READER SERVICE JSB @PHTO,I CHECK IF PHOTO READER NEED SERVICE * * * CHECK USERS * USER STA FLAG1 CLEAR FLAG STA BIAS CLEAR BIAS COUNTER LDB IOSKA LOAD I/O STACK POINTER ADDRESS STB MAIN SAVE IT LDB &USR LOAD NUMBER OF USERS STB CT SAVE IN COUNTER CKDF LDB MAIN,I LOAD STACK ADDRESS ADB .5 ADD INDEX LDA B,I LOAD DATA FLAG SZA 0? JMP .D. YES * MON1 ISZ BIAS NO - NEXT USER ISZ MAIN ISZ CT INC. COUNTER JMP CKDF NOT DONE * * CHECK EXECUTION FLAGS * LDA EXUA. GET ADDRESS OF EXU FLAGS STA FLAG1 SET FLAG STA MAIN LDA &USR LOAD NUMBER OF USERS STA CT CLA STA BIAS CLEAR BIAS MON3 LDA MAIN,I LOAD EXU FLAG SZA 0? JMP .X. NO MON2 ISZ MAIN ISZ BIAS ISZ CT JMP MON3 JSB CHIFL CHECK USER INTERRUPT FLAGS JMP CKL LOOP THROUGH MONITOR * DAYCH LDB USN LOAD USER # SZB,RSS ZERO? JMP *+4 YES - NO ONE IN ADB BSKA NO - ADD USER STACK POINTER LDB B,I LOAD DORMANT STACK ADR JSB MVUOT AND MOVE OUT CLA CLEAR DAY FLAG STA FLAG2 STA CCNT STA USN USN=0 LDA DDBUF STA BADDR STORE BUFFER ADDRESS LDA ADTA,I OUTPUT NEW DAY JSB OUTM,I BUFFER JMP CKL+3 CHECK LOCAL TTY ADTA DEF DATE OUTM DEF OUTIM FLAG2 NOP DDBUF DEF LGOM4+10 * * * * *** SUBROUTINE TO CHECK INTERRUPT FLAGS * CHIFL NOP LDA M5 LOAD -5 FOR 4 CHAN + LOG STA &CT SAVE -NUMBER OF USERS CLA,INA SET USER NUMBER - STA &BIAS -- TO 1 LDA INTF LOAD ADDRESS OF INTERRUPT FLAGS STA &MAIN &INT& LDA &MAIN,I LOAD INTERRUPT FLAG SZA ZERO ? JMP &EXE& NO - PROCESS INTERRUPT &NEX& ISZ &BIAS INDEX USER BIAS COUNTER ISZ &MAIN COMPUTE NEXT ADDRESS ISZ &CT FINISHED? JMP &INT& NO JMP CHIFL,I YES - RETURN * &EXE& CLB STB &MAIN,I CLEAR INTERRUPT FLAG LDB INTA LOAD INTERRUPT ADDRESS ADB &BIAS INDEX BY USER BIAS LDB B,I LOAD INTERRUPT PROCESS ADR JSB B,I PROCESS INTERRUPT JMP &NEX& CHECK NEXT USER * * * DATA FLAG SET * .D. STA TEMP1 SAVE FLAG JSB ACT ACTIVATE THE USER CLA CLEAR STA B,I DATA FLAG LDA EXUA. LOAD EXU FLAG ADDRESSES ADA BIAS GET USER FLAG ADDRESS LDA A,I GET EXU FLAG SSA TEST FOR STPP CONDITION JSB I.STP,I STOP! LDA TEMP1 RELOAD FLAG CPA M2 -2? JMP RRED READ RETURN CPA M1 -1? JMP RRED READ RETURN CPA M15 BIT 15? JMP WRRET WRITE RETURN ADB .4 INDEX TO TAPE FLAG LDA B,I LOAD TAPE FLAG SZA,RSS TAPE? JMP *+6 NO * LDA TCNTA LOAD TAPE CNT ADDRESS TABLE ADA BIAS INA SET A= ADR OF TAPE COUNTER LDA A,I LOAD TAPE COUNTER JMP RRED RETURN * ADB M2 SUBTRACT 2 LDA B,I LOAD PCNT * * READ RETURN * RRED LDB DRS GET ADDRESS OF READ ADDRESSES ADB BIAS ADD USER BIAS LDB B,I LOAD RETURN ADDRESS INTO -B- JMP B,I RETURN * * WRITE RETURN * WRRET LDB DWS GET ADDRESS OF WRITE ADDRESSES ADB BIAS ADD USER BIAS LDB B,I LOAD RETURN ADDRESS INTO -B- JMP B,I * * * EXECUTION FLAG SET * .X. STA TEMP1 SAVE FLAG CPA M2 I/O STOP? JMP MON2 YES - GO BACK TO MONIT JSB ACT ACTIVATE THE USER LDA TEMP1 RELOAD EXU FLAG INA,SZA,RSS -1? JSB I.STP,I YES STOP JMP XECUT,I NO - EXECUTE PROGRAM SKP * * * * * ACTIVATE THE USER * ACT NOP STB BTEM SAVE B REG LDA BIAS GET USER BIAS INA ADD 1 TO GET USER # CPA USN COMPARE WITH PRESENT ACTIVE USR JMP ACT,I SAME LDA USN LOAD USER NUMBER SZA,RSS IF 0 THEN NO ONE TO BE MOVED OUT JMP *+5 * LDB BSKA GET ADDRESS OF STACK ADDRESSES ADB USN ADD OLD USER NUMBER LDB B,I GET ACTUAL STACK ADDRESS JSB MVUOT MOVE USER OUT * LDA BIAS GET BIAS INA CONVERT TO NEW USN STA USN SET NEW USER # ADA BSKA ADD ADDRESS OF STACK ADDRESSES LDA A,I GET ACTUAL STACK ADDRESS JSB MVUIN MOVE USER IN LDB BTEM RESTORE B JMP ACT,I USER IS ACTIVATED BTEM NOP * * * *** MOVE USER OUT ROUTINE * * CONTAINS USER DORMANT STACK ADDRESS * MVUOT NOP LDA ASTK LOAD ADDRESS OF ACTIVE STACK JSB &MSTK MOVE STACK DEC 87 JMP MVUOT,I RETURN * *** MOVE USER IN ROUTINE * * CONTAINS ADDRESS OF USER'S DORMANT STACK * MVUIN NOP LDB ASTK LOAD ADDRESS OF ACTIVE STACK JSB &MSTK MOVE STACK DEC 87 JMP MVUIN,I RETURN * *** ACTIVATION MOVE-STACK SUBROUTINE * &MSTK NOP STA &ORST SAVE ORIGIN STACK ADDRESS LDA &MSTK,I LOAD # OF WORDS TO TRANSFER CMA,INA MAKE COUNT NEGATIVE FOR COUNTER STA &TEMP SAVE AS COUNTER P1&&& LDA &ORST,I LOAD CELL FROM ORIGIN STACK STA B,I TRANSFER TO DESTINATION STACK INB B = NEXT ADR IN D - STACK ISZ &ORST INDEX TO NEXT ADR IN O - STACK ISZ &TEMP TEST IF FINISHED JMP P1&&& NO, CONTINUE ISZ &MSTK FINISHED, COMPUTE RETURN ADDRESS JMP &MSTK,I RETURN * &ORST NOP &TEMP NOP * * SET I/O INTERRUPT * IINT NOP LDA IINTA GET ADDRESS OF I/O INT LINK ADDR ADA USNT INDEX BY USER # TEMP LDA A,I GET ACTUAL LINK LDB INTA LOAD ADDRESS OF LINKAGE AREA-1 ADB USNT INDEX BY USER NUMBER STA B,I STORE LINK JMP IINT,I * IINTA DEF * DEF INT1 DEF INT2 DEF INT3 DEF INT4 * * EXECUTION INTERRUPT PROCESSOR XNT NOP CLF 0 TURN OFF INTERUPT STA XSVA SAVE A REGISTER AND B REGISTER STB XSVB LIA 4 LOAD INTERRUPT SELECT CODE STA SCNUM SAVE IT LDA CLCC LOAD CLC COMMAND IOR SCNUM ADD IN SELECT CODE STA *+1 NOP EXECUTE CLC INST. LDB CHTBA LOAD ADDRESS OF CHANNEL NUMBER TABLE INB NEXT CHANNEL LDA B,I LOAD SC NUMBER CPA SCNUM SAME? RSS YES COMPUTE CHANNEL NUMBER JMP *-4 LDA CHTBA COMPUTE CHANNEL NUMBER CMA,INA ADA B CHANNEL # IN A REG CCB B=-1 FOR EXECUTION STOP CPA CRSTA,I CARD READER STOP? LDB M2 YES I/O STOP ADA &EXU COMPUTE EXU FLAG ADDRESS STB A,I STORE STOP CONDITION LDA XSVA RESTORE REGISTERS LDB XSVB STF 0 TURN ON INTERRUPT JMP XNT,I RETUNR XSVA NOP XSVB NOP SCNUM NOP CLCC CLC 0 CHTBA DEF * BSS 4 TABLE FOR SC CODES FOR EACH CHANNEL CRSTA DEF CRUST * * * * * * SET EXECUTION FLAG * * A REG CONTAINS FLAG SETTINGS * SEXU NOP STA SA SAVE A STB SB SAVE B CCB B=-1 ADB EXUA. B=ADDRESS OF EXU FLAGS-1 ADB USN ADD USER NUMBER STA B,I STORE EXU SZA,RSS JMP RESSR JSB XINT SET EXECUTION INTERRUPT RESSR LDA SA RESTORE A LDB SB RESTORE B JMP SEXU,I SA NOP SB NOP * * SET UP EXECUTION INTERRUPT * XINT NOP LDA STPIA GET ADDRESS OF EXU INT LINK ADDR LDB INTA GET ADDRESS OF INT LINKS-1 ADB USN ADD USER # STA B,I STORE TRANSFER ADDRESS LDB INCMD GET INPUT COMMAND CCA A=-1 ADA IOSKA GET I/O STACK ADDRESS ADA USN ADD USER NUMBER LDA A,I GET ACTUAL I/O STACK ADDRESS ADA .2 ADD CHIN INDEX IOR M15 ADD IN INDIRECT BIT JSB A,I REQUEST INPUT JMP XINT,I * STPIA DEF XNT LINK TO EXECUTION STOP SKP * **************************************** *** *** *** LOCATION OF CALLS TO MONITOR *** *** *** **************************************** * * *** OUTPUT CALL FROM CHANNEL # 1 * WRIT1 NOP STA OCNT1 SAVE COUNTER STB BFAD1 SAVE ADDRESS WCONT LDA USN LOAD USER NUMBER STA DFLG SET DRIVER BUSY FLAG STA USNT INITIATE WRITE CONTINUATOR JSB IINT SET INTERRUPT IS I/O JSB IOIN MOVE USER IN CLA CLEAR TAPE FLAG STA BPTR JSB DRIVO INITIATE OUTPUT .RET. JSB IOOT CLA CLEAR DRIVER BUSY FLAG STA DFLG CLEAR DRIVER BUSY FLAG JMP MONIT GO TO THE MONITOR * * INPUT CALL FOR USER 1 * READ1 NOP STA OCNT1 SAVE COUNTER STB BFAD1 SAVE ADDRESS RCONT LDA USN LOAD USER NUMBER STA DFLG SET DRIVER BUSY FLAG STA USNT INITIATE READ CONTINUATOR JSB IOIN CLA RESET TAPE FLAG STA BPTR RESET TAPE FLAG TO ZERO SIMP JSB IINT SET INTERRUPT IS I/O JSB DRIVI START INPUT JMP .RET. * *** TAPE CALL FOR USER 1 * TAPE1 NOP LDA TAPE1 STORE RETURN ADDRESS IN READ NOP STA READ1 TCONT LDA USN LOAD USER NUMBER STA DFLG SET DRIVER BUSY FLAG STA USNT STORE USER NUMVER JSB IOIN MOVE USER IN LDA .72 SET LENGTH = 72 STA OCNT LDB .BUFA GET I/O BUFFER CMB,INB MAKE NEG STB BPTR SET TAPE FLAG LDB .BUFA GET I/O BUFFER ADB .36 COMPUTE TAPE BUFFER STB BUFAD STORE IN BUFFER ADDRESS JMP SIMP * *** CHANNEL # 1 INTERRUPT PROCESSOR * INT1 NOP STA &SV1 SAVE A-REGISTER LDA DFLG LOAD DRIVER FLAG SZA BUSY? JMP &INT1 YES- SET INTERRUPT FLAG CCA A=-1 STA DFLG SET DRIVER FLAG JSB SAVRG SAVE REGISTERS CLA,INA A = CHANNEL 1 JSB INT PROCESS CHARACTER CLA CLEAR DRIVER... STA DFLG ... BUSY FLAG LDA &SV1 RESTORE A-REGISTER JMP INT1,I RETURN * &INT1 ISZ INT1F INDEX INTERRUPT FLAG JMP *-3 RETURN &SV1 NOP 22255-80007 D