ASMB,R,L,C HED @INTR-COMM. LINE INTERRUPT MODULE.*(C) HEWLETT-PACKARD CO. 1976* NAM @INTR,1,1 91705-16106 REV A 760206 SPC 1 ****************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * ****************************************************************** SPC 1 * * @INTR * SOURCE: 91705-18106 REV.A * BINARY: 91705-16106 REV.A * JIM HARTSELL * JULY 30, 1974 * MODIFIED BY: CHW (01-06-76) [DERIVED FROM: 91705-18006 REV.B] * * CORE RESIDENT RTE-C SATELLITE PROGRAM SCHEDULED BY * DVR65 UPON RECEIPT OF AN INTERRUPT CAUSED BY A "TRANSMIT * REQUEST" CALL AT THE CENTRAL STATION. * @INTR READS THE REQUEST AND SCHEDULES THE APPROPRIATE * PROCESSOR. IF THE REQUEST IS A REPLY TO A PARMB, @INTR * DISPATCHES THE NEXT PARMB REQUEST. * ENT @INTR * EXT EXEC,@DEQ,@DISP,%LU,$LIBR,$LIBX EXT @PTPQ,%RQUE,%CSID,%CSNM,%MFLG EXT %LIST,$WORK,$LINK * A EQU 0 B EQU 1 * * READ THE REQUEST BUFFER. * @INTR JSB EXEC RECEIVE REQUEST ONLY. DEF *+7 DEF B1 DEF %LU DEF IRBUF DEF IRBFL DEF DUMMY DEF DUMMY * * CHECK FOR TRANSMISSION ERRORS. * SLA,RSS * SKP * THE REQUEST ARRIVING FROM CENTRAL COULD NOT BE READ. * CASE 1: REPLY TO A REMOTE REQUEST: * USER WILL COME OUT OF OP SUSP LIST, WILL * GET A "DS51 SUSPEND", AND CAN TRY AGAIN. * CASE 2: REQUEST FROM CENTRAL: * CENTRAL WILL DETECT ERROR AND RE-TRY. * JMP EXIT IGNORE REQUEST. STB EQT12 SAVE EQT12 STATUS * * CHECK FOR REPLY OR PARMB. * LDA IRBUF CHECK FOR REPLY BUFFR. RAL (BIT 14 SET IF REPLY) SSA JMP REPLY REPLY. DON'T CARE WHAT TYPE. * RAR PARMB. DETERMINE TYPE. AND B377 ISOLATE THE STREAM TYPE, STA IRBUF AND RESTORE IT. CPA B4 JMP PTOPC PTOPC. * * MOVE PARMB TO HOLDING BUFFER FOR @RQPR. * JSB $LIBR DISABLE INTERRUPTS. NOP LDA RBUFD ADDR OF PARMB. STA TEMP1 LDA %RQUE ADDR OF HOLDING BUFFER. STA TEMP2 LDB MD35 LOOP LDA TEMP1,I MOVE PARMB. STA TEMP2,I ISZ TEMP1 ISZ TEMP2 INB,SZB JMP LOOP JSB $LIBX ENABLE INTERRUPTS. DEF *+1 DEF *+1 * JSB EXEC SCHEDULE @RQPR PROCESSOR FOR DEF *+3 DEXEC/REMOTE CONTROL/FORCE LOAD. DEF SD10 WITHOUT WAIT. DEF D@RQP * * IF PROCESSOR DOES NOT EXIST, OR ALREADY SCHEDULED, * THE REQUEST WILL BE REJECTED. * NOP IGNORE ERROR RETURN. CLB PRIME IERR TO 0. CPA AS.SC JMP REJR SZA,RSS JMP EXIT * REJR LDA AS.RQ SEND BACK "RQ" ERROR. STA IRBUF+5 LDA AS.SP STA IRBUF+6 JMP SNREJ * * REQUEST IS A REPLY TO A PARMB. * SET QUEUE ENTRY FLAG WORD = "REPLY RECEIVED". * REPLY LDB IRBUF+1 CHECK IF A REPLY IS EXPECTED. STB QENT INB LDA B,I CPA B2 RSS JMP DISP NO. IGNORE AND DISPATCH NEXT. * ADB D9 POINT TO THE TIME-TAG WORDS. DLD B,I GET THE TIME-TAGS. CPA IRBUF+33 IF THE FIRST TAG COMPARES, RSS SKIP TO CHECK SECOND ELSE, JMP DISP NOT THE EXPECTED REPLY--IGNORE! CPB IRBUF+34 IF THE SECOND TAG COMPARES, RSS THEN THIS IS OUR REPLY ELSE, JMP DISP NOT THE EXPECTED REPLY--IGNORE! * * JSB $LIBR DISABLE INTERRUPT SYSTEM. NOP * LDA QENT QUEUE ENTRY ADDRESS. INA LDB B3 STB A,I SET FLAG WORD. * JSB $LIBX ENABLE INTERRUPT SYSTEM. DEF *+1 DEF *+1 * * FIND STATUS OF CORRESPONDING PROGRAM. * * NOTE: SUBROUTINE "ALIVE" DISABLES THE INTERRUPT * SYSTEM WHILE CHECKING STATUS. * JSB ALIVE JMP ABORT USER DEAD. JMP MOVE USER OP SUSPENDED. * SKP * USER PROGAM HAS BEEN ABORTED. CANCEL THE * REQUEST FROM THE PARMB REQUEST QUEUE, AND * DISPATCH THE NEXT PARMB. * ABORT JSB @DEQ QENT NOP B1 OCT 1 * NOP ERROR = NORMAL RETURN. JMP DISP * * USER PROGRAM IS SCHEDULED AND IN CORE. * MOVE REPLY TO USER'S REPLY BUFFER AREA. * MOVE JSB $LIBR NOP LDA RBUFD SET SOURCE POINTER. STA TEMP2 * LDA IRBUF+1 SET DESTINATION POINTER. ADA D9 LDA A,I STA TEMP1 * LDB MD35 SET WORD COUNTER. * MLOOP LDA TEMP2,I MOVE. STA TEMP1,I ISZ TEMP2 ISZ TEMP1 INB,SZB JMP MLOOP * JSB $LIBX DEF *+1 DEF *+1 * JSB CLOCK SET UP FOR RESTART. JMP ENQUE * * * SEND A STOP IF LINE IS IN "DATA PENDING" CONDITION * DISP LDA EQT12 ALF,ALF BIT 8 = DATA PENDING FLAG SLA,RSS JMP ENQUE JUMP IF NOT PENDING DATA XFER * SEND A STOP JSB EXEC DEF *+3 DEF B3 DEF %LU * * NOW THAT A REPLY HAS BEEN RECEIVED, THE NEXT PARMB * CAN NOW BE TRANSMITTED. CHECK IF ONE IS WAITING. * ENQUE JSB @DISP SZA,RSS (A)= QUE ENTRY ADDR, OR ZERO. JMP EXIT NONE WAITING. TERMINATE. * STA QENT A PARMB WAITING. CHECK STATUS. JSB ALIVE JMP ABORT USER DEAD. JSB CLOCK SET UP FOR RESTART. * EXIT JSB EXEC TERMINATE. DEF *+2 DEF B6 * SKP * * SUBROUTINE TO TEST WHETHER USER PROGRAM IS IN OPERATOR SUSPEND LIST. * * CALLING SEQUENCE: * (QENT) = ADDR OF QUEUE ENTRY. * JSB ALIVE * RETURN 1: USER NOT OP SUSPENDED (DEAD). * RETURN 2: USER IN OPERATOR SUSPEND LIST. * ALIVE NOP JSB $LIBR DISABLE INTERRUPT SYSTEM. NOP * LDA QENT GET ADDR OF PROGRAM NAME ADA B2 IN USER'S ID SEGMENT. LDB A,I ADB D12 ADA B2 GET ADDR OF PROGRAM NAME STA NAME * JSB CMPAR COMPARE THE NAMES. JMP DEAD MISMATCH. * LDA TEMP2,I MATCH. GET USER STATUS. AND B17 CPA B6 * ISZ ALIVE PROGRAM IS OP SUSPENDED. DEAD JSB $LIBX PROGRAM IS DEAD. DEF ALIVE * * FIND ENTRY IN WAIT-LIST, SET CLOCK TIME FOR * IMMEDIATE EXECUTION, AND SCHEDULE @CLCK. * CLOCK NOP JSB $LIBR NOP * LDA %LIST ADDR OF WAIT-LIST. LDB A,I STB TEMP NEGATIVE # ENTRIES. ADA B2 STA TEMP2 ADDR OF 1ST PROGRAM NAME. * SKP CLCK1 LDA MD3 STA TEMP3 COUNTER FOR COMPARE. LDA QENT ADA B4 STA TEMP1 ADDR OF PROG NAME IN QUE ENT. LDB TEMP2 ADDR OF PROG NAME IN WAIT-LIST. * CLCK2 LDA TEMP1,I COMPARE NAMES. CPA B,I INB,RSS JMP MISS MISMATCH. ISZ TEMP1 ISZ TEMP3 JMP CLCK2 * LDB TEMP2 MATCH. ADB MD1 CCA SET CLOCK TIME TO -1. STA B,I CLCK3 JSB $LIBX DEF CLOCK * MISS LDA TEMP2 GO TO NEXT ENTRY IN WAIT-LIST. ADA B5 STA TEMP2 ISZ TEMP JMP CLCK1 JMP CLCK3 IGNORE IF NOT FOUND. * * MASTER PTOPC PARMB RECEIVED. * PTOPC LDA RBUFD GET ADDR OF PROG NAME. ADA B5 STA NAME * LDA IRBUF+2 GET FUNCTION CODE. AND B7 CPA B1 RSS JMP PSTAT PREAD/PWRIT/PCONT. * * POPEN PARMB. SCHEDULE THE SLAVE PROGRAM. * LDB %CSID ANY SLAVE PROG ACTIVE? SZB,RSS JMP PSCHD NO. * ADB D15 YES. ALIVE? LDA B,I STATUS WORD OF ID SEG. AND B17 SZA JMP SAME CURRENTLY ALIVE. * SKP JSB $LIBR PREVIOUS SLAVE PROG WAS ABORTED: NOP CLEAR MAILBOX FLAG. CLA STA %MFLG JSB $LIBX DEF *+1 DEF PSCHD GO SCHEDULE NEW SLAVE. * SAME LDA RBUFD CHECK IF POPEN IS FOR CURRENTLY ADA B5 RUNNING SLAVE PROGRAM. LDB %CSNM JSB CMPAR COMPARE NAMES JMP FLGUP MISMATCH. ERROR. JMP PTPQ MATCH. * PSCHD JSB EXEC ATTEMPT TO SCHEDULE. DEF *+3 DEF SD10 WITHOUT WAIT. NAME NOP NAME OF SLAVE PROGRAM * NOP IGNORE ERROR RETURN. LDB MD41 CPA AS.SC CHECK SCHEDULE STATUS. JMP REJRQ NO SUCH PROGRAM. JMP PTPQ NOW (OR WAS) SCHEDULED. * * PREAD/PWRIT/PCONT:PCLOS: * FIND CURRENT STATUS OF SLAVE PROGRAM. * PSTAT LDB IRBUF+5 GET ADDR OF ID SEGMENT ADB D12 STB NAME ADDR OF PROG NAME. ADB B3 LDA B,I STATUS WORD. AND B17 LDB MD45 SZA,RSS JMP REJRQ PROGRAM IS DEAD. * * PLACE PTOPC PARMB IN MAILBOX. * PTPQ LDA RBUFD ADDR OF PARMB. JSB @PTPQ JMP FLGUP * SKP * RESTART USER IF IN OPERATOR SUSPEND LIST. * LDA %CSID GET ID SEGMENT ADDRESS. ADA D15 LDA A,I AND B17 CPA B6 JMP *+2 JMP EXIT NOT OP SUSPENDED. * JSB $LIBR RESTART THE PROGRAM. NOP LDB $DWRK ADDR OF "WORK" IN SCHEDULER. SSB,RSS JMP *+3 ELB,CLE,ERB LDB B,I * LDA %CSID SET-UP FOR $LINK CALL: STA B,I "WORK" INB STA B,I "WLINK" INB ADA B6 STA B,I "WPRIO". * ADA D9 SET STATUS WORD IN CLB,INB ID SEG = SCHEDULED. STB A,I * JSB $LINK REMOVE USER FROM B6 OCT 6 OP SUSP LIST AND OCT 1 ADD TO SCHEDULE LIST. * JSB $LIBX TERMINATE. DEF *+1 DEF EXIT * FLGUP LDB MD42 * SKP * SEND REJECT REPLY BACK TO CENTRAL. USE IRBUF. * REJRQ STB IRBUF+3 STORE ERROR CODE. LDA IRBUF+2 AND B377 IOR RJBTS STA IRBUF+2 STORE FLAG WORD. * SNREJ LDA IRBUF SET REPLY BIT, IOR RPLFL AND FRIENDLY-SATELLITE BIT(#11). STA IRBUF * JSB EXEC SEND REPLY. DEF *+7 DEF B2 DEF %LU DEF IRBUF DEF IRBFL DEF DUMMY DEF DUMMY * JMP EXIT SPC 3 * * COMPARE 3 WORDS CMPAR NOP DST TEMP1 LDB MD3 LOOP1 LDA TEMP1,I CPA TEMP2,I MATCH? RSS YES JMP CMPAR,I NO, RETURN+1 ISZ TEMP1 ISZ TEMP2 INB,SZB JMP LOOP1 ITERATE ISZ CMPAR JMP CMPAR,I RETURN+2 SKP * * CONSTANTS AND WORKING STORAGE. * B2 OCT 2 B3 OCT 3 B4 OCT 4 B5 OCT 5 B7 OCT 7 B17 OCT 17 B377 OCT 377 D9 DEC 9 EQT12 NOP DUMMY NOP SD10 OCT 100012 D12 DEC 12 D15 DEC 15 MD1 DEC -1 MD3 DEC -3 MD35 DEC -35 MD41 DEC -41 MD42 DEC -42 MD45 DEC -45 TEMP NOP TEMP1 DEC 0,0 TEMP2 EQU TEMP1+1 TEMP3 NOP $DWRK DEF $WORK RPLFL OCT 44000 RJBTS OCT 100000 AS.RQ ASC 1,RQ AS.SP ASC 1, D@RQP ASC 3,@RQPR AS.SC ASC 1,SC RBUFD DEF IRBUF IRBUF BSS 35 IRBFL DEC 35 * SIZE EQU * * END @INTR