ASMB,L,C,R,Q ** RTE-IV INPUT/OUTPUT CONTROL MODULE ** HED ** RTE-IV INPUT/OUTPUT CONTROL MODULE ** * DATE: 1/07/77 * NAME: RTIO4 * SOURCE: 92067-18107 * RELOC: PART OF 92067-16102 * PGMR: G.A.A.,L.W.A.,D.L.S.,E.J.W.,G.L.M.,A.D.,B.D. * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978. 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. * * *************************************************************** * * * NAM RTIO4,0 92067-16102 REV.2040 800731 * ***** AMD-DAS ***** FEB,72 ***** REV.LWH ***** ***** AMD-DAS ***** AUG,72 ***** REV.GAA ***** ***** AMD-DAS ***** APR,75 ***** REV.LWA ***** ***** DSD ***** FEB,77 ***** REV.EJW ***** * * ENT $CIC0,$XSIO,$SYMG,$IORQ,$IOUP,$IODN ENT $ETEQ,$IRT,$DEVT,$CXC,$CYC,$BFOT,$YMG ENT $GTIO,$UP,$CVEQ,$DMS,$BLLO,$BLUP ENT $BITB,$UNLK,$XXUP,$DLAY,$DMEQ,$CKLO ENT $CON1,$CON2,$CON3,$DRVM,$RSM,$PSTE,$LU?? ENT $DVC,$CJMP,$LIA4 ENT $EQCL * EXT $RQST,$CLCK,$XEQ,$TYPE,$LIST,$ALC,$RTN,$CIC EXT $LUSW,$SCD3,$RNTB,$CNV3,$ERMG,$CALL EXT $CNV1,$CLAS,$REIO,$ABRT,$INER,$ZZZZ EXT $PDSK,$UCON,$UIN,$PERR,$SMER EXT $ERAB,$IDNO,$SMAP,$MATA EXT $MRMP,$MVBF EXT $DVPT,$DLTH,$DVMP,$SDA EXT $ELTB * * * * MODULE OF THE R E A L - T I M E E X E C U T I V E * * * THIS INCLUDES THE FOLLOWING MAJOR SECTIONS: * * 1) CENTRAL INTERRUPT CONTROL * * 2) INPUT / OUTPUT CONTROL * - I/O REQUEST PROCESSING * - I/O COMPLETION PROCESSING * - GENERAL I/O ERROR PROCESSING * * 3) SYSTEM ERROR DIAGNOSTIC PRINT ROUITNE * * 4) PROCESSOR FOR OPERATOR I/O STATEMENTS * HED < CENTRAL INTERRUPT CONTROL > * *** C E N T R A L I N T E R R U P T C O N T R O L *** * * THE PROCESSING OF SYSTEM INTERRUPTS IS CONTROLLED * BY DIRECTING ALL SOURCES TO THE ENTRY POINT < $CIC0>. * < $CIC0> IS RESPONSIBLE FOR SAVING AND RESTORING * THE CURRENT STATE OF THE MACHINE, ANALYSING THE * SOURCE OF THE INTERRUPT, AND ACTIVATING THE * APPROPRIATE PROCESSOR. THIS ROUTINE IS TABLE-DRIVEN * BY THE *INTERRUPT TABLE*. * * SPECIAL PROCESSING FOR A "PRIVILEGED" CLASS OF * INTERRUPTS IS PROVIDED BY $CIC0. THIS IS DESCRIBED * FULLY IN SECTION III BELOW. BRIEFLY, A SPECIAL * I/O CARD CAN BE USED TO SEPARATE SPECIAL INTERRUPTS * FROM NORMAL SYSTEM CONTROLLED INTERRUPTS. THE * PRESENCE AND LOCATION OF THE SPECIAL CARD IS * NOTED AT SYSTEM CONFIGURATION TIME. IF IT IS * PRESENT, THE EXEC OPERATIONS ARE NOT PERFORMED * WITH THE INTERRUPT SYSTEM DISABLED BUT RATHER * WITH THE CONTROL SET ON THE SPECIAL CARD TO * HOLD OFF SYSTEM I/O INTERRUPTS. * * I. INTERRUPT TABLE (INTBL) * * A TABLE, ORDERED BY HARDWARE INTERRUPT PRIORITY, * DESIGNATES THE ASSOCIATED SOFTWARE PROCESSOR AND * THE PROCEDURE FOR INITIATING THE PROCESSOR. THIS * TABLE IS CONSTRUCTED BY *RTGEN* ON INFORMATION * SUPPLIED BY THE USER IN CONFIGURING THE SYSTEM. * THE TABLE CONSISTS OF ONE ENTRY PER INTERRUPT * SOURCE: EACH ENTRY CONTAINS ONLY ONE WORD. THE * CONTENTS OF EACH VALID ENTRY IS THE IDENTIFIER * OF THE PROCESSOR. SYSTEM PROCESSORS ARE NOTED * BY POSITIVE VALUES, USER PROCESSORS BY NEGATIVE * VALUES: * * 1. SYSTEM - THE IDENTIFIER IS THE ADDRESS OF * THE EQT ENTRY IDENTIFYING THE I/O DEVICE. * * 2. USER - THE ADDRESS OF THE PROGRAM * IDENTIFICATION SEGMENT IS IN 2-S COMPLEMENT * FORM IN THE ENTRY. * * 3. ILLEGAL - AN ENTRY CORRESPONDING TO AN * ILLEGAL INTERRUPT SOURCE CONTAINS ZERO. * * A PROCESSOR IS CALLED DIRECTLY IF IT RESPONDS * TO STANDARD SYSTEM INTERRUPT (E.G., $CLCK, * MEMORY PROTECT, I/O DEVICE CONTROLLED BY A * SYSTEM DRIVER) OR IS SCHEDULED IN THE NORMAL * PRIORITY ORDER IF IT RESPONDS TO A USER * CONTROLLED DEVICE OR INTERRUPT SOURCE. SKP * II. INTERRUPT PROCESSING * * INTERRUPT ACKNOWLEDGEMENT BY THE CPU CAUSES * THE INSTRUCTION IN THE WORD CORRESPONDING * TO THE I/O CHANNEL ADDRESS TO BE EXECUTED. * FOR ALL ACTIVE I/O CHANNELS ( PLUS LOCATIONS * 5-7 ) CONTROLLED BY THE SYSTEM, THE INSTRUCTION * SET IN EACH INTERRUPT LOCATION IS A JUMP * SUBROUTINE INDIRECTLY TO < $CIC0>. * SKP * <$CIC0> PERFORMS THE FOLLOWING: * * 1. DISABLES THE INTERRUPT SYSTEM. * * 2. SAVES ALL REGISTERS PLUS THE INTERRUPT * RETURN POINT IN THE EXECUTING * ID SEGMENT. * * 3. CLEARS THE FLAG OF THE INTERRUPT SOURCE. * * 4. SETS 'MPTFL' = 1 TO MEAN MEMORY PROTECT * IS OFF - FLAG FOR PRIVILEGED PROCESSORS. * * 5. CHECKS FOR SPECIAL INTERRUPT PROCESSING. * IF 'DUMMY' IN BASE PAGE COMMUNICATION * AREA = 0, THEN LEAVE THE INTERRUPT SYSTEM * DISABLED AND GO TO STEP 6. * * 'DUMMY' > 0 - PRIVILEGED INTERRUPTS: * -THE CONTENTS OF 'DUMMY' IS THE I/O * ADDRESS OF THE CARD; THIS IS USED TO * SET THE CONTROL FF ON THE CARD (FLAG * IS ALREADY SET) TO HOLD OFF LOWER * PRIORITY INTERRUPTS (SYSTEM INTERRUPTS) * -CLEARS THE CONTROL FLIP-FLOP OF * EACH DMA CHANNEL TO PROHIBIT POSSIBLE * INTERRUPTS FROM OCCURRING. * -ENABLE THE INTERRUPT SYSTEM. * * 6. TRANSFERS DIRECTLY TO THE INTERRUPT * PROCESSOR FOR SOURCES OF: * * 5 - MEMORY PROTECT VIOLATION * 6 - TIME BASE GENERATOR(TBG)INTERRUPT * * FOR OTHER SOURCES, THE INTERRUPT SOURCE * CODE IS USED TO INDEX THE INTERRUPT TABLE. * THE CONTENTS OF THE INTBL ENTRY DETERMINES * THE MANNER IN INITIATING THE PROCESSOR: * * A. +, THE CONTENTS OF THE ENTRY IS * ASSUMED TO BE THE FWA OF AN EQT ENTRY. * THE ADDRESSES OF THE 15-WORD ENTRY * ARE SET IN AND CONTROL * TRANSFERRED DIRECTLY TO THE COMPLETION * SECTION ADDRESS (WORD 3 OF EQT ENTRY). * * B. -, THE VALUE IS SET POSITIVE AND IS * SET IN A CALL TO <$LIST> IN THE * SCHEDULING MODULE- THE CALL IS MADE IF * THE USER PROGRAM IS DORMANT- CONTROL IS * TRANSFERRED TO $XEQ. IF THE PROGRAM IS * NOT DORMANT, IT IS NOT SCHEDULED AND THE * DIAGNOSTIC "SC03 INT XXXXX" IS OUTPUT * TO THE SYSTEM TTY- XXXXX IS THE PROGRAM * NAME. CONTROL IS RETURNED TO THE INTER- * RUPTED SEQUENCE. * * C. 0, ILLEGAL OR UNDEFINED INTERRUPTS ARE * NOT PROCESSED BUT THE DIAGNOSTIC * "ILL INT XX" IS OUTPUT TO THE SYSTEM * TTY. XX IS THE INTERRUPT CODE. * * 7. I/O DRIVER RETURNS INDICATE CONTINUATION * OR COMPLETION OF THE OPERATION BY THE * DRIVER OR DEVICE: * * A. RETURN AT (P+1): COMPLETION OF THE * OPERATION. $CIC0 TRANS- * FERS DIRECTLY TO THE * IOC COMPLETION SECTION * AT < IOCOM >. CONTROL * IS NOT RETURNED TO * < $CIC0>. * * B. RETURN AT (P+2): CONTINUATION OF THE * OPERATION. $CIC0 RETURNS * TO THE INTERRUPTED * SEQUENCE AS DESCRIBED * IN STEP 8 FOLLOWING. * * C. RETURN AT (P+3): CONTINUATION REQUESTING A DMA * CHANNEL. IF ASSIGNED NOW OR * LATER, THEN ENTRY WILL BE MADE * INTO INTIATION SECTION OF DRIVER * FROM SUBROUTINE *DRIVR*. RETURN * FROM THIS INITIATION WILL ACT AS * A CONTINUATION RETURN. THE DRIVER * IS RESPONSIBLE FOR KEEPING A FLAG * INDICATING WHETHER THE NEXT ENTRY * INTO THE INITIATOR FOR THIS CHANNEL * IS A RESULT OF A NORMAL INITIATION * OR A CONTINUATION REQUEST FOR DMA. * THIS FEATURE IS AN UNADVERTISED * ABILITY FOR THE USE OF DVR07 (MULTIPOINT) * * 8. RESTORING INTERRUPT CONDITIONS AND RETURN * TO POINT OF INTERRUPTION. AN ENTRY POINT * CALLED '$IRT' IS PROVIDED FOR USE BY * OTHER MODULES OF THE R/T EXEC TO RESET * FLAGS AND THE DMA CHANNELS AND RETURN TO * THE USER PROGRAM. * * THE CALLING SEQUENCE IS JUST: * * - JMP $IRT - * * $IRT PERFORMS THE FOLLOWING: * 1 - DISABLES THE INTERRUPT SYSTEM * 2 - SETS 'MPTFL' = 0 TO MEAN THAT MEMORY * PROTECT IS ON (ENABLED). * 3 - SKIP TO 6 IF NOT A PRIVILEGED SYSTEM * 4 - ISSUES A CLC TO CLEAR THE CONTROL * FF ON THE SPECIAL CARD. * 5 - SETS THE CONTROL FF ON EITHER DMA * CHANNEL IF BIT 15 OF THE INTBL WORD * =1 TO MEAN IT IS ACTIVE. THIS * ENABLES DMA INTERRUPTS ONLY. * 6 - RESTORES THE REGISTERS AND * 7 - EXECUTES THE CURRENT PROGRAM AT XSUSP. SKP * III. SPECIAL (PRIVILEGED) INTERRUPTS * * THIS PROVISION ALLOWS INTERRUPTS FROM SPECIAL * DEVICES TO BE RECOGNIZED WITHIN 100 MICRO SECONDS * AND TO BE PROCESSED BY SPECIAL, COMPLETELY * INDEPENDENT ROUTINES CLASSIFIED AS SYSTEM TYPE * PROGRAMS. INTERRUPTS ARE CHANNELED DIRECTLY * TO THE ENTRY POINT OF A ROUTINE BY A JSB INDIRECT * IN THE CORRESPONDING CORE LOCATION. $CIC0 IS * NOT AWARE OF THESE SPECIAL INTERRUPTS OCCURRING; * IT ONLY ALLOWS THE INTERRUPT SYSTEM TO BE * ENABLED AND A SOFTWARE FLAG SET TO INDICATE * THE STATUS OF MEMORY PROTECT. THE JSB TO THE * ENTRY POINT FOR A ROUTINE IS SET BY USING THE * "ENT,XXXXX" STATEMENT IN RTGEN WHEN CONFIGURING * A REAL-TIME SYSTEM. * THE SPECIAL PROCESSING ROUTINES CANNOT USE * ANY FEATURES OR REQUESTS OF THE STANDARD * R/T EXEC. THESE ARE INDEPENDENT ROUTINES. * COMMUNICATION BETWEEN A NORMAL PROGRAM UNDER * THE CONTROL OF THE R/T EXEC AND A SPECIAL * INTERRUPT PROCESSOR CAN BE DONE THROUGH * THE APPROPRIATE COMMON REGION: I.E. FLAGS OR * INDICATORS CAN BE SET IN PRE-DEFINED WORDS * IN COMMON TO INITIATE PROCESSING. THE NORMAL * USER PROGRAM CAN BE SCHEDULED TO RUN AT A * PERIODIC TIME INTERVAL TO SCAN THE INDICATORS. * THIS FACILITY IS PROVIDED TO ACCOMODATE HIGH- * SPEED PROGRAM CONTROLED DATA TRANSMISSION * WHICH REQUIRES QUICK RESPONSE. * THE SPECIAL INTERRUPT PROCESSORS ARE * RESPONSIBLE FOR SAVING AND RESTORING ALL * REGISTERS USED AND FOR RESTORING MEMORY * PROTECT TO ITS STATE BEFORE THE SPECIAL * INTERRUPT OCCURRED. MEMORY PROTECT IS * AUTOMATICALLY DISABLED AT THE OCCURRENCE * OF ANY INTERRUPT. THE WORD 'MPTFL' IN THE * BASE PAGE COMMUNICATION AREA IS SET BY THE * R/T EXEC TO INDICATE THE STATUS OF THE * MEMORY PROTECT: * * 'MPTFL' = 0 MEANS MEMORY PROTECT IS 'ON'. * THE SPECIAL ROUTINE MUST ISSUE * A STC 5 IMMEDIATELY BEFORE * RETURNING TO THE INTERRUPTED * SEQUENCE BY A JMP -,I * * = 1 MEANS THAT THE R/T EXEC ITSELF * WAS EXECUTING WHEN THE INTERRUPT * OCCURRED AND THAT MEMORY * PROTECT IS 'OFF'. THE ROUTINE * MUST NOT ISSUE THE STC 5 IN * THIS CASE. * * IF A SPECIAL INTERRUPT ROUTINE MUST EXECUTE * WITH THE INTERRUPT SYSTEM DISABLED, THE * STC 0 TO RE-ENABLE INTERRUPTS JUST PRIOR TO * EXITING MUST BE IN THE FOLLOWING SEQUENCE IF * MEMORY PROTECT IS ALSO TO BE TURNED ON: * * - STF 0 - * - STC 5 - * - JMP -,I - SKP $CIC0 EQU * OCT 103300 INTERRUPT SYSTEM ALREADY OFF? ISZ $INT YES, FLAG IT FOR $PERR4 * TURN IT OFF IN ANY CASE !! * * PRESERVE CURRENT STATUS OF MACHINE * SSM $DMS SAVE DMS STATUS AT INTERRUPT FOR P.E. STA TEMPA SAVE A-REG IN CASE OF PARITY ERROR LIA 4 GET INTERRUPT SOURCE STA INTCD AND SAVE IT CPA .5 IS IT MP, DMS, OR PE? JMP PE? MAYBE. * IOR CLF NO, CONSTRUCT CLF XX INSTRUCTION STA *+1 * $DVC NOP CLEAR DEVICE FLAG * CIC1 STB XB,I SAVE REGISTERS ERA,ALS A,B SOC E AND INA OVERFLOW STA XEO,I LDA TEMPA STA XA,I CIC2 ISZ MPTFL SET 'MPTFL' = 1 TO MEAN MP IS OFF. * SW1 JMP CIC.0 (STC DUMMY IF PRIVILEDGED OPTION) * * PROVIDE FOR SPECIAL (PRIVILEGED) INTERRUPTS * * CLC 6 CLEAR DMA CHANNELS CLC 7 CONTROL FF. * STF 0 RE-ENABLE INTERRUPTS * * CIC.0 EQU * LDA XI SAVE INDEX REGISTERS CXB XSB A,I STORE X THROUGH USER MAP INA CYB XSB A,I STORE Y THROUGH USER MAP LDA INTCD RESTORE THE INT CODE LDB $CIC SAVE P-REGISTER SOON AS POSSIBLE STB XSUSP,I POINT OF SUSPENSION. * * CHECK FOR TRANSFER TO NON-I/O SYSTEM PROCESSOR * CPA .5 IF MEMORY PROTECT VIOLATION, JMP $RQST GO TO EXAMINE MP VIOLATION. * CPA TBG IF TIME BASE GENERATOR, $CJMP JMP $CLCK GO TO TBG PROCESSOR ROUTINE. * * CHECK LEGALITY OF INTERRUPT * ADA N6 CODE - 6. STA B (SAVE FOR TABLE INDEX) ADB INTBA INDEX TO PROPER ENTRY CMA,CLE,SSA - ERROR IF CODE ADA INTLG LESS THAN 6 OR BEYOND * * GET PROCESSOR IDENT FROM INTERRUPT TABLE * LDA B,I GET CONTENTS OF ENTRY SEZ SKIP IF OUT OF INTBL RANGE. CLE,SZA,RSS UNDEFINED INTERRUPT JMP CIC.4 IF VALUE = 0, ISSUE DIAG. * * LDB INTCD REMOVE ERB BIT 15 OF INTBL WORD CPB .3 IF DMA CHANNEL RAL,CLE,ERA INTERRUPT. * SSA,RSS SYSTEM DRIVER IS TO BE CALLED JMP CIC.2 IF VALUE IS POSITIVE. * ** INTERRUPT PROCESSOR IS USER ROUTINE TO BE ** SCHEDULED FOR PRIORITY EXECUTION * CMA,INA SET POSITIVE TO GET ID SEGMENT STA B ADDRESS, SET IN B TO <$LIST>. * ADA .15 CHECK STATUS OF PROGRAM. LDA A,I IF STATUS IS ZERO (DORMANT), SZA SCHEDULE PROGRAM, OTHERWISE JMP CIC.5 ISSUE DIAGNOSTIC. * JSB $LIST CALL SCHEDULER TO LINK PROGRAM OCT 401 INTO SCHEDULE LIST. JMP $XEQ SPC 1 CLF CLF 0 N6 DEC -6 TEMPA NOP $DMS NOP DMS STATUS AT INTERRUPT $INT NOP ($DMS+1)INTERRUPT SYSTEM: 0 ON, 1 OFF * * PE? LIA 5 GET VIOLATION REGISTER SSA,RSS IS IT PARITY ERROR? JMP CIC1 NO, SAVE REGISTERS FOR REAL * LDA TEMPA RESTORE A-REG JMP $PERR CALL PARITY ERROR ROUTINE * * $CXC LIA 4 *** SPECIAL ENTRY TO SKIP CLF *** $CYC STA INTCD SAVE INTERRUPT SOURCE CODE SSM $DMS SAVE DMS STATUS JMP CIC2 SKP * * * ASSUME PROCESSOR FOR CODE GT= 6 IS A * SYSTEM I/0 DRIVER. VALUE OF INTERRUPT * TABLE ENTRY IS THE STARTING ADDRESS * OF THE EQUIPMENT TABLE ENTRY CORRESPONDING * TO THE INTERRUPTING DEVICE. * CIC.2 JSB $ETEQ SET EQT ENTRY ADDRESSES. * CIC.6 JSB $DRVM GO SET RIGHT MAP * LDA INTCD (A) = INTERRUPT SOURCE CODE * LDB EQT14,I SET DEVICE SZB TIME-OUT CLOCK DLS 780217 STB EQT15,I IF USER SPECIFIED A TIMEOUT. * * CALL I/O PROCESSOR, COMPLETION SECTION * LDB EQT3,I CALL DRIVER CONTINUATION SECTION ELB,CLE,ERB (GET RID OF FLAG BIT USED ELSEWHERE.) SEZ IN THE JMP $UCON USER MAP, * JSB B,I OR SYSTEM MAP, AS THE CASE MAY BE. JMP $CON1 (P+1): *COMPLETION RETURN* JMP $CON2 (P+2): *CONTINUATION RETURN* $CON3 CPA .6 (P+3): *NEED/GIVE-UP DMA RETURN* JMP $CON4 IF (A) .NE. 6 (SHOULD BE 5), IT'S A LDA EQT3,I NEED-DMA RETURN. SO FIRST SET THE IOR B100K DRIVER-EXITED-FROM-CONTINUATION- STA EQT3,I SECTION-TO-GET-DMA FLAG. JSB $RSM RESTORE USER MAP. ISZ CONFL FAKE *DRIVR* CALL, FLAG=1 IN CASE WE GET LDA DIOCR TO *REXIT* VIA SUBROUTINE *DRIVR* STA DRIVR DUMMY UP RETURN ADDR IN *DRIVR* JMP DVR0 JUMP INTO MIDDLE OF *DRIVR* IOCRT JMP IOCO1 (P+1) TO ALLOC DMA CHAN, REENTER INITIATOR JMP NOTRD (P+2) * $CON4 JSB CLDMA IT WAS A GIVE-UP-DMA RETURN, SO DO IT. LDA EQT5,I CHANGE EQT STATE AND MSK14 FROM "WAITING_FOR_DMA" (BIN. 11) STA EQT5,I TO "BUSY" (BIN. 10). LDA EQT3,I THEN CLEAR THE DRIVER-EXITED-FROM- ELA,CLE,ERA CONTINUATION-SECTION- STA EQT3,I TO-GET-DMA FLAG. JSB $RSM RESTORE USER MAP IF NECESSARY. JMP IOCX ALLOCATE DMA FREED-UP, & EXIT TO DISP. * $CON2 JSB $RSM RESTORE USER MAP. IOCO1 CLA LDB OPATN CHECK FOR OPERATOR ATTENTION. STA OPATN -CLEAR OPERATOR FLAG- SZB IF FLAG SET, JMP $TYPE ACKNOWLEDGE. * LDA $LIST IF $LIST ENTERED SZA,RSS SKIP TO ENTER $XEQ JMP $IRT RETURN TO POINT OF INTERRUPT * JMP $XEQ GO DISPATCH POSSIBLE NEW PROGRAM * * ILLEGAL OR UNDEFINED INTERRUPT * CIC.4 LDA INTCD GET THE INTERRUPT CODE. JSB $CNV1 CONVERT. STA CICM1+6 STUFF IN THE MESSAGE LDA CICM1 PRINT JMP CIC.7 "ILL INT XX" * * ISSUE DIAGNOSTIC FOR BEING UNABLE TO * SCHEDULE USER PROGRAM ON INTERRUPT. * CIC.5 ADB .12 SET (B) TO ADDRESS OF NAME IN LDA B,I PROGRAM ID SEGMENT. STA CICM2+7 STORE INB PROGRAM DLD B,I NAME IN DST CICM2+8 DIAGNOSTIC AND PRINT LDA CICM2 "SC03 INT XXXXX" CIC.7 JSB $YMG MESSAGE GOES TO LU 1 ONLY -780221 GLM- * * RESET INTERRUPT CONDITIONS - RETURN TO SEQUENCE * * ROUTINE: '$IRT' * * THIS ROUTINE RETURNS TO THE CURRENT USER PROGRAM. * IT DOES THE PRIV. INTERRUPT SYSTEM EXIT THING AND * RESTORES THE PROGRAMS REGISTERS AND THE INTERRUPT * AND MEMORY PROTECT SYSTEM. * * CALLING SEQUENCE: * * SET UP XEQT AREA ON THE BASE PAGE FOR THE PROGRAM * * JMP $IRT * $IRT LDA XSUSP,I GET THE EXECUTE ADDRESS * STA RTN SAVE THE RETURN ADDRESS LDB XI RESTORE INDEX REGISTERS XLA B,I INB XLB B,I CAX CBY LDA XEO,I RESTORE E AND CLO O REGS. SLA,ELA PRIOR TO INTERRUPT TURN OFF STF 1 TO KEEP TIME DOWN CLA CLEAR 'MPTFL' TO MEAN CLF 0 TURN OFF THE INTERRUPT SYSTEM STA MPTFL MEMORY PROTECT IS ON. * SW2 JMP IRT2 RETURN IF NOT PRIV. (ELSE CLC) * STF1 STF 12B BUFFER ON DUMMY I/O CARD * DLD INTBA,I CHECK CONDITION OF DMA CHANNELS SSA IF BIT = 1 FOR DMA #1 (ACTIVE) STC 6 THEN SET CONTROL TO ENABLE SSB INTERRUPTS. SAME FOR STC 7 DMA CHANNEL #2. * IRT2 LDA XA,I RESTORE THE A AND B REGS LDB XB,I STF 0 TURN ON THE INTERRUPT SYSTEM STC 5 AND MEMORY PROTECT UJP * ENABLE USER MAP AND RETURN RTN EQU *-1 SPC 4 CICM1 DEF *+1 DEC -10 ASC 5,ILL INT XX * CICM2 DEF *+1 DEC -15 ASC 8,SC03 INT XXXXX * INTCD NOP HOLDS INTERRUPT SOURCE CODE $LIA4 EQU INTCD D$LUT DEF $LUSW+0 DIRECT ADDRESS OF BATCH LU TABLE DIOCR DEF IOCRT * $BLLO DEC -100 $BLUP DEC -300 B100K OCT 100000 MSK14 OCT 137777 AN "AND MSK14" WILL MASK OUT BIT 14. HED < RT EXECUTIVE INPUT/OUTPUT CONTROL > *** I N P U T / O U T P U T C O N T R O L *** * * THE I/O SCHEDULING AND CONTROL MODULE < IOC > * IS RESPONSIBLE FOR ALLOCATING THE USE OF ALL * STANDARD I/O DEVICES AND THE TWO DMA CHANNELS. * I/O DRIVERS OPERATE UNDER CONTROL OF AND * <$CIC0> FOR INITIATION AND COMPLETION OF SYSTEM * AND USER DIRECTED I/O OPERATIONS. I/O DRIVERS * ARE INDEPENDENT PROGRAMS IDENTIFIED TO * BY THE DEVICE ASSOCIATED EQUIPMENT TABLE. DRIVERS * ARE COMPOSED TO TWO SECTIONS: *INITIATION* AND * *COMPLETION*. THE *INITIATION* SECTION IS * CALLED BY TO EXAMINE AND INITIATE AN I/O * OPERATION. THE *COMPLETION* SECTION IS CALLED * BY <$CIC0> TO CONTINUE OR COMPLETE THE OPERATION. * DRIVERS PROVIDE FOR SIMULTANEOUS MULTI-DEVICE * CONTROL BY USING THE DEVICE EQT ENTRY FOR * VARIABLE STORAGE. * * I. * EQUIPMENT TABLE * (EQT) * * EACH I/O DEVICE CONTROLLED BY THE IOC/DRIVER * RELATIONSHIP IS DEFINED BY STATIC AND DYNAMIC * INFORMATION IN THE EQUIPMENT TABLE. THE EQT * IS A SYSTEM RESIDENT TABLE WHICH IS CONSTRUCTED * FROM USER DIRECTIVES BY . EACH EQT * ENTRY IS COMPOSED OF 15-WORDS IN THE FOLLOWING FORMAT: * SKP * * WORD CONTENTS * ---- ---------------------------- * 1 * I/O LIST . LINK POINTER * * 2 *DRIVER *INITIATION ADDRESS* * 3 *DRIVER *COMPLETION ADDRESS* * 4 *DBPOT/----UNIT#--CHANNEL #* * 5 *AV-TYPE CODE- UNIT STATUS* * 6 *REQUEST CONTROL WORD * * 7 *REQUEST BUFFER ADDRESS * * 8 *REQUEST BUFFER LENGTH * * 9 *TEMPORARY OR DISC TRACK # * * 10 *TEMPORARY OR DISC SECTOR #* * 11 *DRIVER TEMPORARY STORAGE* * 12 * " " " * * 13 * " " " * * 14 * DEVICE CLOCK RESET VALUE * * 15 * " " WORKING " * * * D: =1 IF A DMA CHANNEL REQUIRED FOR TRANSFER * B: =1 IF AUTOMATIC OUPUT BUFFERING DESIRED * P: =1 IF DRIVER TO HANDLE POWER FAIL RECOVERY. * O: =1 IF DRIVER TO HANDLE TIME OUT. * T: DEVICE TIME-OUT BIT - CLEARED BEFORE EACH * IO INITIATION; SET IF DEVICE TIMES-OUT. * UNIT#: LAST SUBCHANNEL REFERENCED ON THIS EQT. * CHANNEL#: I/O SELECT CODE (LOWER # IF * MULTI-BOARD INTERFACE) * AV (AVAILABILITY INDICATOR): * =0, UNIT AVAILABLE FOR OPERATION * =1, UNIT DISABLED * =2, UNIT CURRENTLY IN OPERATION * =3, UNIT WAITING FOR DMA CHANNEL * TYPE CODE: CODE IDENTIFYING TYPE OF I/O DEVICE * UNIT STATUS: ACTUAL OR SIMULATED UNIT STATUS * AT END OF OPERATION * * II. * DEVICE REFERENCE TABLE * (DRT) * * THE DEVICE REFERENCE TABLE PROVIDES FOR * LOGICAL DEVICE ADDRESSING OF PHYSICAL I-O * SLOTS DEFINED IN THE *EQT*. THE *DRT* CONSISTS * OF TWO SEQUENTIAL TABLES EACH TABLE CONSISTING * OF 1-WORD ENTRIES CORRESPONDING TO THE RANGE * OF USER-SPECIFIED "LOGICAL" UNITS, 1 TO N * WHERE N IS LT OR = TO 63(10). THE CONTENTS OF * EACH LOGICAL UNIT'S WORD ONE IS AS FOLLOWS: * BITS 5-0 DEVICE'S EQT NUMBER * BITS 6-10 THE LOCKING RESOURCE NUMBER * BITS 11-15 THE DEVICE'S SUBCHANNEL ON THE EQT. * THE CONTENTS OF EACH LOGICAL UNIT'S DEVICE * REFERENCE TABLE WORD TWO CONTAINS A * POINTER TO THE I/O QUEUE OF THE I/O REQUESTS * FOR THIS DEVICE WHEN THE DEVICE IS DOWN: * BIT 15=0 FOR AN UP LU. * =1 FOR A DOWN LU. * BITS 14-0=0 FOR AN UP LU. * #0 FOR A DOWN LU WHERE * = ADDRESS OF THE I/O QUEUE IF THIS * IS THE FIRST LU(MAJOR LU)POINTING * TO THE DEVICE. * = 1 TO 1777(8). THE LU NUMBER OF * DEVICE(MAJOR LU)ON WHICH THE I/O * IS QUEUED. * * CERTAIN LOGICAL UNIT #S ARE PERMANENTLY * ASSIGNED TO FACILITATE SYSTEM, USER AND * SYSTEM SUPPORT I/O OPERATIONS. THESE ARE: * * 0 - BIT BUCKET(DUMMY LU)(NO ENTRY IN DRT) * 1 - SYSTEM TELETYPEWRITER * 2 - SYSTEM DISC * 3 - AUXILIARY DISC * 4 - 'STANDARD' PUNCH UNIT * 5 - 'STANDARD' INPUT UNIT * 6 - 'STANDARD' LIST UNIT * 7 - ASSIGNED * . BY * . USER * 63 - SKP * * III. INPUT/OUTPUT REQUESTS * * I/O REQUESTS INCLUDE COMMANDS FOR * READ, WRITE, CONTROL(FUNCTIONS) AND STATUS. * THE FORMAT OF THESE REQUESTS CONFORM TO * THE GENERAL SYSTEM REQUEST FORMAT. THE * NUMBER OF PARAMETERS VARIES DEPENDING * ON THE TYPE OF REQUEST AND THE CHARAC- * TERISTICS OF THE REFERENCED DEVICE. * * A USER I/O REQUEST IS DIRECTED TO * AT -$IORQ- BY THE EXECUTIVE REQUEST * PROCESSOR <$RQST>. SYSTEM I/O REQUESTS * ARE IN A DIFFERENT FORMAT AND ARE PROCESSED * AT THE SECTION -$XSIO- IN . REFER TO * THAT SECTION FOR DETAILED DESCRIPTION. * * A *STATUS* REQUEST IS PROVIDED * FOR USER AND SYSTEM SUPPORT PROGRAMS * WHICH REQUIRE KNOWLEDGE OF DEVICE * CONDITIONS OR TYPE BEFORE A READ/WRITE/ * CONTROL REQUEST IS MADE. THE PROGRAM * IS NOT SUSPENDED ON THIS CALL. * A PARAMETER WORD IS INCLUDED IN THE * REQUEST TO CONTAIN THE DEVICE STATUS ON * RETURN TO THE USER. THIS STATUS IS FROM WORD * 5 OF THE EQT ENTRY FOR THE DEVICE. * ALSO, AN ADDITIONAL PARAMETER WORD CAN BE * INCLUDED IN THE REQUEST- WORD 4 OF THE * EQT ENTRY IS RETURNED IF THE ADDITIONAL * PARAMETER WORD IS INCLUDED. * * A DYNAMIC STATUS REQUEST CAN BE MADE BY * MEANS OF A CONTROL REQUEST, THE FORMAT * OF WHICH IS DEFINED BELOW. IN THIS CASE, * THE REQUEST IS QUEUED, THE DRIVER IS ENTERED, * AND THE STATUS IS RETURNED TO THE CALLING * PROGRAM IN THE A REGISTER. * SKP * * EXEC I/O REQUEST "NO SUSPEND" BIT * * THE "NO SUSPEND" BIT (BIT 14) IN EXEC I/O REQUESTS (CODES = * 1,2,3,17,18,19,20) PROVIDES NO SUSPEND I/O PROCESSING. IF AN * I/O EXEC REQUEST CAN'T BE PROCESSED IMMEDIATELY BECAUSE OF A * DOWNED DEVICE OR A LOCKED EQT OR LU, THE CALLING PROGRAM IS * SUSPENDED. BY SETTING THE NO SUSPEND BIT, THE CALLING PROGRAM * IS NOT SUSPENDED UNDER THESE CONDITIONS. INSTEAD THE PROGRAM * RESUMES EXECUTION AT THE FIRST LINE OF CODE FOLLOWING THE EXEC * CALL WITH AN "IO" ERROR CODE RETURNED IN THE A,B REGISTERS. IF * THERE ARE NO EXCEPTIONS IN THE I/O REQUEST, THE PROGRAM'S SECOND * LINE OF CODE FOLLOWING THE EXEC CALL IS EXECUTED. * * IF AN EXEC I/O REQUEST IS MADE TO A DEVICE WHOSE EQT OR LU IS * LOCKED TO ANOTHER LOCKER AND THE NO SUSPEND BIT IS SET, THE * PROGRAM IS CONTINUED AT THE FIRST LINE OF CODE FOLLOWING THE EXEC * CALL WITH THE A,B REGISTER SET TO IO13. IF THE NO SUSPEND BIT * IS NOT SET IN THE ABOVE CASE, THE PROGRAM IS SUSPENDED ON THE EQT * OR LU LOCK. IO13 INDICATES THAT THE I/O REQUEST CANNOT CURRENTLY * BE SATISFIED DUE TO A LOCKED LU OR EQT. * * IF AN EXEC I/O REQUEST IS MADE TO A DEVICE WHICH IS DOWN AND * THE NO SUSPEND BIT IS SET, THE PROGRAM IS CONTINUED AT THE FIRST * LINE OF CODE FOLLOWING THE EXEC CALL WITH THE A,B REGISTERS SET * TO IO14. IF THE NO SUSPEND BIT IS NOT SET IN THE ABOVE CASE, * THE PROGRAM IS SUSPENDED ON THE DOWNED DEVICE. IO14 INDICATES * THAT THE I/O REQUEST CANNOT CURRENTLY BE SATISFIED DUE TO A * DOWNED DEVICE. * * IF A DEVICE GOES DOWN (EITHER BY AN OPERATOR DN REQUEST OR * AN EQUIPMENT MALFUNCTION) WHILE REQUESTS ARE PENDING ON THE EQT, * THE REQUESTS LINKED ON THE EQT FOR THE DOWNED DEVICE ARE * UNLINKED FROM THE EQT AND HANDLED IN THE FOLLOWING WAY: * UNBUFFERED REQUESTS MADE WITH THE NO SUSPEND BIT SET ARE UNLINKED * AND THE CALLING PROGRAM IS RESCHEDULED AT THE FIRST LINE OF CODE * FOLLOWING THE EXEC CALL WITH THE A,B REGISTERS SET TO IO14; * UNBUFFERED REQUESTS MADE WITH THE NO SUSPEND BIT CLEAR ARE * UNLINKED AND SUSPENDED IN STATE 3; BUFFERED REQUESTS REGARDLESS * OF THE NO SUSPEND BIT ARE UNLINKED AND RELINKED ON THE MAJOR * LU'S DRT WORD 2 QUEUE. * * IF AN EXEC I/O REQUEST (CODES = 1,2,3) IS BUFFERED AND NO MEMORY * IS AVAILABLE NOW AND THE NO SUSPEND BIT IS SET, THE REQUEST * CONTINUES TO BE PROCESSED UNBUFFERED. ON COMPLETION OF THE I/O * REQUEST, THE PROGRAM IS RESCHEDULED AT THE SECOND LINE OF CODE * FOLLOWING THE EXEC REQUEST. IF THE NO SUSPEND BIT IS NOT SET * IN THE ABOVE CASE, THE PROGRAM IS SUSPENDED IN THE MEMORY * SUSPEND LIST. * SKP * * A. READ/WRITE REQUEST FORMAT * * EXT EXEC * JSB EXEC * DEF EXIT (DEFINE EXIT POINT) * DEF RCODE (DEFINE READ (1) OR WRITE(2)) * DEF CONWD (DEFINE CONTROL WORD) * DEF BUFFR (DEFINE BUFFER LOCATION) * DEF BUFFL (DEFINE BUFFER LENGTH) * DEF DTRAK (OPTIONAL - DISC TRACK #) * DEF DSECT (OPTIONAL - DISC SECTOR #) * EXIT --- * . * . * RCODE DEC 1 OR 2 * CONWD OCT NNNNN CONTROL INFO/LOGICAL UNIT # * BUFFL DEC N OR -N WORD OR CHARACTER LENGTH * DTRAK DEC N DISC TRACK # * DSECT DEC N STARTING SECTOR # * * BIT 12 OF THE CONTROL WORD SET ON NON-DISC REQUESTS * INDICATES A DOUBLE BUFFER FOR THIS OPERATION. * IN THIS CASE THE CONTROL BUFFER IS AT "DTRAK" AND IT'S * LENGTH IN WORDS IS AT "DSECT". * * * B. CONTROL REQUEST FORMAT * * EXT EXEC * JSB EXEC * DEF EXIT (DEFINE EXIT POINT) * DEF RCODE (DEFINE REQUEST CODE) * DEF CONWD (DEFINE CONTROL WORD) * DEF PARAM (DEFINE OPTIONAL PARAMETER) * EXIT --- * . * . * RCODE DEC 3 * CONWD OCT NNNNN CONTROL CODE/LOGICAL UNIT # * PARAM DEC N PARAMETER REQUIRED BY TYPE OF CODE * * CONTROL CODES (FIELD 10-06 OF CONTROL WORD): * * 01 - WRITE END-OF-FILE --/ PRIMARILY * 02 - BACKSPACE 1 RECORD / FOR * 03 - FORWARD SPACE 1 RECORD / MAGNETIC * 04 - REWIND / TAPE * 05 - REWIND STANDBY / UNITS * 06 - DYNAMIC STATUS --/ * 07 - SET EOT STATUS (FOR PAPER TAPE INPUT) * 10 - GENERATE LEADER FOR PAPER TAPE * 11 - LIST OUTPUT LINE SPACING * 12 - WRITE FILE GAP --/ PRIMARILY * 13 - FORWARD SPACE FILE/ FOR MAGNETIC * 14 - BACKWARD SPACE FILE/ TAPE UNITS SKP * C. DEVICE STATUS REQUEST FORMAT * * EXT EXEC * JSB EXEC * DEF EXIT (DEFINE EXIT POINT) * DEF RCODE (DEFINE REQUEST CODE) * DEF CONWD (DEFINE CONTROL WORD) * DEF STAT1 (DEFINE STATUS WORD 1) * DEF STAT2 (DEFINE STATUS WORD 2 -- OPTIONAL) * DEF STAT3 (DEFINE STATUS WORD 3 -- OPTIONAL) * EXIT --- * . * . * RCODE DEC 13 STATUS REQUEST CODE = 13 * CONWD OCT NN LOGICAL UNIT # * STAT1 NOP WORD 5 OF EQT ENTRY FOR * DEVICE STORED IN THIS WORD. * STAT2 NOP WORD 4 OF EQT ENTRY FOR * DEVICE STORED IN THIS WORD * IF PRESENT IN REQUEST. * STAT3 NOP IF PRESENT, THEN BIT 15 INDICATES * THE LU IS UP(0) OR DOWN(1) AND BITS * 0-4 GIVE THE LU'S SUBCHANNEL. * * * IV. GENERAL OPERATION * * ALL INPUT/OUTPUT OPERATIONS ARE PERFORMED * CONCURRENTLY WITH PROGRAM COMPUTATION IN THE * OVERALL SYSTEM. AN I/O OPERATION IS CONSIDERED * TO BE NON-BUFFERED TO THE REQUESTING USER * PROGRAM AS THE PROGRAM IS SUSPENDED UNTIL * THE TRANSMISSION OR OPERATION IS COMPLETED. * THE EXCEPTION TO THIS IS IN PROVIDING FOR * AUTOMATIC BUFFERING OF OUTPUT TO USER- * DESIGNATED DEVICES. IN THIS CASE, THE USER * BUFFER IS MOVED TO SYSTEM AVAILABLE MEMORY * AND THE USER PROGRAM IS NOT SUSPENDED. * * V. CLASS I/O OPERATIONS * * CLASS I/O REFERS TO NO-WAIT I/O IN WHICH THE USER * DIRECTS THE COMPLETION INFORMATION TO A 'CLASS' BY * NUMBER. LEGAL CLASSES ARE DEFINED AT GENERATION TIME * AND QUEUES ARE KEPT FOR EACH CLASS IN A TABLE CALLED * THE CLASS TABLE. THIS TABLE IS LOCATED AT $CLAS * AND CONSISTS OF A LENGTH WORD (DEFINING THE NUMBER * OF WORDS (CLASSES) IN THE TABLE (SYSTEM)) FOLLOWED * BY ONE WORD FOR EACH DEFINED CLASS. * * IN OPERATION THE USER REQUESTS I/O ON A CLASS, * RTIOC REQUESTS BUFFER MEMORY FOR THE REQUEST * MOVES THE REQUEST TO THE BUFFER MEMORY * QUEUES THE REQUEST ON THE SPECIFIED EQT AND * NOTES IN THE CLASS QUEUE THAT A REQUEST IS * PENDING. * * ON COMPLETION THE COMPLETED REQUEST IS QUEUED IN THE CLASS * QUEUE AND ANY PROGRAM WAITING FOR THE CLASS * IS RESTARTED. * * A. READ/WRITE AND WRITE-READ REQUEST FORMAT * * EXT EXEC * JSB EXEC * DEF EXIT * DEF RCODE (DEFINE READ (17) WRITE (18) WRITE-READ (20) * DEF CONWD (SAME AS STANDARD READ/WRITE) * DEF IBUFR (SAME AS STANDARD (NOT USED ON READ) * DEF BUFFL (SAME AS STANDARD) * DEF OPT1 (SAME AS STANDARD (TRACK)) * DEF OPT2 (SAME AS STANDARD (SECTOR)) * DEF CLASS (CLASS TO QUEUE REQUEST ON ) * EXIT --- * . * . * RCODE DEC 17 OR 18 OR 20 (SEE NOTE BELOW) * CONWD OCT NNNNN CONTROL INFO/LOGICAL UNIT # * BUFFL DEC N OR -N WORD OR CHARACTER LENGTH * OPT1 DEC N (SEE GET CALL BELOW) * OPT2 DEC N (SEE GET CALL BELOW) * CLASS DEC N DEFINES CLASS TO BE USED IN GET CALL. * IBUFR BSS N DATA BUFFER * * * NOTES: * THE WRITE-READ CALL IS FOR DEVICES WHICH EXPECT DATA IN * THE READ BUFFER. THIS CAUSES THE SYSTEM TO MOVE THE BUFFER * TO SYSTEM MEMORY AND ALSO TO SAVE AND PASS TO THE USER * THE BUFFER ON THE GET CALL. THE REQUEST CODES RECEIVED * BY THE DRIVER ARE: * 1 FOR REQUEST 17 OR 20 * 2 FOR REQUEST 18 * 3 FOR REQUEST 19 * * THE CLASS WORD HAS THE FOLLOWING FORMAT * BITS 0-7 DEFINE THE CLASS. IF ZERO OR NOT SUPPLIED * THE SYSTEM WILL ASSIGN A CLASS FOR THE REQUEST. * BITS 8-12 CONTAIN THE SECURITY CODE ASSIGNED BY THE * SYSTEM UPON CLASS ALLOCATION. * BITS 13-14 ARE NOT USED BY READ/WRITE OR WRITE-READ * BUT WILL BE RETURNED TO CALLER IF A CLASS * IS ALLOCATED. * BIT 15 SHOULD BE SET TO INDICATE THAT THE PROGRAM IS TO * BE CONTINUED WITHOUT MAKING THE REQUEST IF THERE * IS NOT ENOUGH SYSTEM MEMORY AT THE CURRENT TIME. * * ON RETURN TO THE PROGRAM THE A REGISTER WILL BE SET AS * FOLLOWS (IF BIT 15 WAS SET): * * A = -1 DYNAMIC CLASS ASSIGNMENT FAILED (NO FREE CLASS NOW) * -2 NO MEMORY AVAILABLE FOR BUFFERING. * = >0 THE NEWLY ALLOCATED CLASS NUMBER AND SECURITY CODE. * * B. CLASS CONTROL REQUEST FORMAT * * EXT EXEC * JSB EXEC * DEF EXIT * DEF RCODE (DEFINES REQUEST CODE) * DEF CONWD (DEFINES CONTROL WORD) * DEF PRAMD (DEFINES PRAMETER WORD) * DEF CLASS (CLASS TO QUEUE REQUEST ON) * EXIT --- * . * . * RCODE DEC 19 CLASS CONTROL REQUEST CODE * CONWD OCT NNNN CONTROL INFO/LOGICAL UNIT # * PRAM DEC N PRAMETER AS REQUIRED BY TYPE OF CODE * CLASS DEC N DEFINES CLASS TO USED IN GET CALL. * * THE CLASS CONTROL IS THE SAME AS THE STANDARD CONTROL EXCEPT * COMPLETION INFORMATION IS QUEUED ON THE DESIGNATED CLASS QUEUE. * * C. CLASS GET REQUEST FORMAT. * * EXT EXEC * JSB EXEC * DEF EXIT (DEFINE RETURN ADDRESS) * DEF RCODE (DEFINE REQUEST CODE ADDRESS) * DEF CLASS (DEFINE CLASS ADDRESS) * DEF IBUFR (DEFINE BUFFER ADDRESS) * DEF IBUFL (DEFINE BUFFER LENGTH) * DEF IRP1 ((RETURN PRAMETER 1 (OPTIONAL)) * DEF IRP2 ((RETURN PRAMETER 2 (OPTIONAL)) * DEF RCLAS (RETURN CLASS WORD ADDRESS)(OPTIONAL) * EXIT --- * . * . * RCODE DEC 21 REQUEST CODE FOR GET REQUEST * CLASS OCT NNN CLASS THE GET IS TO GET FROM. * IBUFR BSS N BUFFER TO HOLD THE READ DATA * IBUFL DEC N OR -N WORD OR CHARACTER LENGTH OF BUFFER * IRP1 BSS 1 OPTIONAL PRAMETER ONE RETURNED HERE * IRP2 BSS 1 OPTIONAL PRAMETER TWO RETURNED HERE * RCLAS BSS 1 CLASS RETURN WORD. * * NOTES: * THE CLASS WORD HAS THE FOLLOWING OPTIONS: * BITS 0 - 7 CLASS TO BE USED * BITS 8 -12 CLASS SECURITY CODE * BIT 13 DO NOT DEALLOCATE THE CLASS. IF THIS BIT * IS NOT SET AND THE CLASS IS EMPTY (NO * COMPLETED OR PENDING REQUESTS) IT IS * DEALLOCATED. * BIT 14 RETURN THE INFORMATION BUT DO NOT DEQUEUE * THE REQUEST (MUST MAKE ANOTHER REQUEST TO * DEQUEUE THE REQUEST). * BIT 15 IF NO ENTRIES IN QUEUE RETURN TO PROGRAM * (NORMAL ACTION IS TO SUSPEND UNTIL A * REQUEST IS PUT ON THE QUEUE). * * THE RETURNED CLASS WORD (RCLAS) IS AS FOLLOWS: * BITS 0 - 7 SET TO THE REQUEST CODE SENT TO THE DRIVER I.E. * 17 IS SET TO 1 * 18 IS SET TO 2 * 19 IS SET TO 3 * 20 IS SET TO 1 * * THE PARAMETERS IRP1/IRP2 ARE SET TO THE ORIGINAL REQUEST * PARAMETERS OPT1/OPT2. THEY ARE PROTECTED FROM DRIVER * MODIFICATION AND SO SHOULD BE AS SUPPLIED, EXCEPT IF * BIT 12 IN THE CONWORD IS SET "IRP1" POINTS TO * THE BUFFER AREA THE SYSTEM USED (I.E. IT IS NONSENSE). * * THE A REGISTER ON RETURN IS SET AS FOLLOWS: * A = -N N IS THE NUMBER OF REQUESTS PENDING ON THE CLASS * IN ONE'S COMPLEMENT [-(N+1)] = [-N-1] * (NO REQUEST HAS COMPLETED YET) * A = 10XXXX (WHERE 1 IS BIT 15, 0 IS BIT 14, * AND XXXX IS THE REST OF EQT5 WHEN THE * REQUEST EITHER WAS REJECTED BY THE DRIVER * OR WAS IMMEDIATELY COMPLETED BY THE DRIVER. * ON REJECT B = -1,ON IMMEDIATE COMPLETION * B = TLOG. * A = > 0 A IS THE STATUS (EQT5) OF THE DEVICE AT * COMPLETION OF THE REQUEST. (IF BIT 14 IS SET * THE REQUEST CAUSED THE DEVICE TO GO DOWN). * B = TLOG IN THIS CASE. * * ON COMPLETION OF AN 18 REQUEST THE DATA BUFFER IS RETURNED * TO SYSTEM MEMORY. * THE GET REQUEST WILL ALWAYS GET A BUFFER WHICH IS THE * MINIMUM OF THE ALLOTTED SIZE ON THE GET AND THE BUFFER * IN THE QUEUE. THE CONTROL BUFFER (BIT 12 OPTION) IS AT THE * END OF THE ALLOTED BUFFER AND MAY BE RETURNED ON A GET IF * THE BUFFER SUPPLIED WILL HOLD IT AND THE REQUEST WAS NOT A * CLASS WRITE (18) REQUEST. SKP * CLASS I/O QUEUE FORMAT AND ITS USE * * THE CLASS QUEUE CAN BE IN FOUR DIFFERENT STATES. * 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 * ------------------------------------------------------ * ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0! * ------------------------------------------------------ * STATE 1: CLASS DEALLOCATED, AVAILABLE * * 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 * ------------------------------------------------------- * ! 0 ! A D D R E S S O F F I R S T E N T R Y ! * ------------------------------------------------------- * STATE 2: POINTER TO FIRST ENTRY IN CLASS QUEUE * * 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 * ------------------------------------------------------ * ! 1 0 X! SECURITY CODE ! NUMBER OF PENDING REQS. ! * ------------------------------------------------------ * STATE 3: CLASS ALLOCATED, NO ONE WAITING ON CLASS * NUMBER OF PENDING REQUESTS COUNTER MAY BE 0-255 * * 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 * ------------------------------------------------------ * ! 1 1 X! SECURITY CODE ! NUMBER OF PENDING REQS. ! * ------------------------------------------------------ * STATE 4: CLASS ALLOCATED, SOMEONE WAITING (SUSPENDED) * NUMBER OF PENDING REQUESTS COUNTER MAY BE 0-255 * * ACTIONS TO BE TAKEN WHEN HANDLING A CLASS I/O OR GET REQUEST * DEPEND ON THE CURRENT STATE OF THE CLASS QUEUE HEAD * GET REQUESTS: * STATE 1. ABORT THE PROGRAM IO00, NO CLASS. * STATE 2. RETURN THE DATA FROM CLASS BUFFER * STATE 3. SET THE SOMEONE WAITING BIT(BIT14), SUSPEND PROGRAM * STATE 4. ABORT THE PROGRAM IO00, ONLY ONE PROGRAM MAY BE * SUSPENDED PER CLASS. * CLASS I/O REQUESTS: * STATE 1. STATE 3 IS SET UP, SECURITY CODE IS LOW 5 BITS OF * PROGRAM ID NUMBER, COUNTER IS SET TO 1. * STATE 2. THE COUNTER AT END OF QUEUE IS INCREMENTED BY 1 * STATE 3. THE COUNTER IS INCREMENTED BY 1. * STATE 4. THE COUNTER IS INCREMENTED BY 1. * ON COMPLETION OF CLASS I/O REQUESTS: * STATE 1. ILLEGAL--SHOULD NEVER HAPPEN--BUFFER IS RETURNED * AND THE COMPLETION IS IGNORED. * STATE 2. THE NEW DATA IS ADDED AT THE END OF THE LIST (FIFO) * AND THE COUNTER IS DECREMENTED BY 1. * STATE 3. THE NEW DATA IS ADDED AT THE END OF THE LIST (FIFO) * AND THE COUNTER IS DECREMENTED BY 1. * STATE 4. THE WAITING PROGRAM IS SCHEDULED AND THE COUNTER * IS DECREMENTED BY 1 AND THE SOMEONE WAITING BIT(BIT14) * IS CLEARED. SKP .254 DEC 254 $IORQ EQU * CLA SET CONTROL FLAG=0 TO MEAN STA CONFL *REQUEST* SECTION ENTERED STA TEMPL AND 'DISC R/W USER REQ' FLAG STA CLASS CLEAR THE CLASS WORD STA TEMP5 CLEAR LU FLAG FOR LU 0 * CPA RQCNT INSURE AT LEAST ONE PRAMETER JMP ERR01 - NO, ISSUE DIAGNOSTIC. * * * * LDA DRQ2I GET ADDR OF EXEC'S PRAMS STA TEMP1 LDA DPARM GET ADDR OF DIRECT PARMS STA TEMP2 LDB N8 GET 8 PARMS DIRECT GTPAR CLA CLEAR (A) IN CASE XLA TEMP1,I NO PARM WAS PASSED STA TEMP2,I ISZ TEMP1 ISZ TEMP2 INB,SZB DONE YET? JMP GTPAR NO * * CHECK FOR XLUEX (EXTENDED LU EXEC) REQUEST * * IF YES, FETCH THE SECOND WORD OF THE CON WORD * AND SAVE IT AS PARM2 (FUNCTION CODE). NOTE THAT * THE LU IS SAVED IN "REQLU". * * NOTE ALSO THAT IF BIT 15, OF THE FIRST WORD OF THE CON * WORD (XLUEX ONLY), IS SET, NO SWITCHING OF THE LU TAKES PLACE. * * * * LDA PARM2 PRE-FETCH THE LU PARAMETER LDB $CALL FETCH ENTRY FLAG FROM EXEC CLE,SSB,RSS <0 = XLUEX ENTRY, >0 = EXEC ENTRY JMP OLD EXEC ENTRY,LU IS SIX BITS WIDE * LDB RQP2 XLUEX ENTRY SO RQP2 IS A 2 WD PARM INB ADVANCE TO 2ND WD (FUNCT CODE) SSB CHECK FOR MEMORY WRAP JMP RQERR YEP--BAD PARAMETER. * XLB B,I FETCH FUNCTION CODE (2ND WORD OF RQP2) STB PARM2 AND SAVE IT FOR FUTURE USE * LDB A MOVE NO SWITCH OPTION TO (B) RSS XLUEX LU IS 8 BITS WIDE-- SKIP EXEC WORK * * * LOGICAL UNIT REFERENCE VALIDITY CHECK * ***780221 GLM*** * * ** NOTE: IF SIGN OF (B) IS SET, NO LU SWITCHING IS PERFORMED. * OLD AND B77 ISOLATE LU TO 6 BITS FOR EXEC ADA N1 TRANSLATE BY -1(XLUEX CONTINUES HERE) AND B377 ISOLATE LU-1(NOTE LU 0=B377) STA REQLU SAVE LU-1 FOR LATER USE CPA B377 IF LU IS ZERO JMP L.00X DO IMMEDIATE COMPLETION THING * SSB IF NO SWITCH OPTION SET JMP L.0 CONTINUE WITH SPECIFIED LU. * * * CHECK FOR LU SWITCH REQUIRMENT * -BATCH FLAG=BIT 15 ID WORD 21 * -SESSION WORD=ID WORD 33 * LDB XSUSP FETCH POINTER INTO ID SEG ADB .12 ADVANCE TO BATCH FLAG LDA B,I FETCH IT ADB .12 ADVANCE TO SESSION WORD LDB B,I FETCH IT * SZB IF SESSION WORD =0 SSB OR IS < 0 THEN JMP NSESS PROG IS NOT IN SESSION * * THE PROGRAM IS A SESSION PROGRAM. * -BATCH SESSIONS USE THE SESSION SWITCH TABLE ONLY * -THE REQUESTED LOGICAL UNIT MUST BE DEFINED FOR * THIS SESSION'S USE (MUST BE IN IT'S SST) * * JSB MPTAB GO MAP IN TABLE PTN( IF DEFINED). RETURNS LOGICAL * ADDR IN (B). LDA B,I FETCH LENGTH OF SWITCH TABLE JSB SWTCK GO SEE IF THIS LU IS SWITCHED JMP ERR12 P+1 LU NOT DEFINED FOR SESSION USE JMP L.0.1 P+2 SWITCH FOUND, (A) AND TEMP1 ARE * SET TO THE SWITCHED LU BY SWTCK * * * THE PROGRAM IS NOT IN SESSION * CHECK FOR BATCH SWITCH REQUIRMENT * -(A)=ID WORD 21 (BATCH FLAG = BIT 15) * NSESS SSA,RSS IS THIS A BATCH REQUEST? JMP L.0 NOPE-- USE PASSED LU * LDA $LUSW FETCH LENGTH OF BST CMA,INA SET IT NEGATIVE LDB D$LUT FETCH ADDR OF BST JSB SWTCK GO SEE IF LU SWITCHED L.0 LDA REQLU P+1 NO SWITCH,USE SUPPLIED LU L.0.1 LDB A P+2 SWITCH FOUND [IN (A) & REQLU] CPB B377 IF 0 SPECIFIED JMP L.00X DO IMMEDIATE COMPLETION THING ** CPB .254 IF MAX LU, THEN SPOOL FILE HAS BEEN KILLED JMP ERR26 RETURN IO26 ERROR * CMA,CLE CHECK FOR ZERO AND ADA LUMAX FOR A VALUE GT THE LARGEST SEZ,RSS DEFINED #. JMP ERR02 - ERROR, OUTSIDE OF RANGE. ADB DRT INDEX INTO THE DRT. LDA B,I GET EQT ASSIGNMENT. STA TEMP5 SAVE FOR 'WORD2' ROUTINE. AND B77 CCE,SZA,RSS IF ZERO JMP L.00X THEN DO IMMEADIATE COMPLETION THING * JSB $CVEQ CONVERT TO ABS.EQT ADD(WILL MASK SUBCH.). * LDA EQT4,I AND B77 GET I/O SELECT CODE SZA,RSS IF SELECT CODE = 0 JMP ERR03 GIVE IO03 ERROR * * SKP * * REQUEST CODE ANALYSIS * L.000 LDA RQP1 GET REQUEST CODE (PARAMETER 1). AND .15 KEEP LOW PART STA RQPX SAVE IT CPA .13 TRANSFER IF JMP L.15 * STATUS * REQUEST. * LDA REQLU GET LU-1 AND DETERMINE JSB STADV IF THE LU OR EQT ARE DOWN. JMP L.014 IF DOWN, SUSPEND THE PROGRAM. * LDA RQPX UP, SO CONTINUE. LDB XPRIO,I SET THE PRIORITY STB TEMP2 FOR LINK AND STB TEMP6 FOR BUFFERING CPA .3 IF REQUEST IS JMP L.01 SKIP FURTHER ANALYSIS. * LDB RQCNT CHECK # OF ADB N3 PARAMETERS SUPPLIED SSB FOR READ OR WRITE. JMP ERR01 -ERROR, LT 3. LDA RQP1 GET THE RQ CODE * * BUFFER LEGALITY CHECK. VERIFY THAT BUFFER RESIDES WITHIN THE * USER'S ADDRESS SPACE. * BFCK LDB PARM4 GET THE LENGTH CLE,SSB,RSS CONVERT TO JMP BFCK1 WORDS IF BRS CHARACTERS CMB,INB SET POSITIVE BFCK1 STB TMP8 AND SAVE. CPA B21 IF CLASS READ JMP L.01 SKIP BUFFER CHECK SPC 1 ADB N1 CALCULATE ADDR OF LAST WORD CLO IN BUFFER ADB RQP3 AND IN CASE IT'S PAST 32K SOC ADDRESS SPACE, JMP ERR04 GIVE ERROR MESSAGE * STB LWABF SAVE THE LAST WORD BUFFER ADDR. LDA RQP3 GET THE 1ST WORD ADDRESS. LDB XEQT AND ID SEG ADDRESS JSB COMN IS THE 1ST WORD OF BUFFER IN COMMON ? JMP CHKWR NO, SO JUST GO DO THE WRITE PROTECT CHECK. * LDA LWABF YES, IF 1ST WORD IN COMMON, THEN THE LAST LDB XEQT WORD BETTER BE IN COMMON ALSO. JSB COMN IS IT ?? JMP ERR04 NO !!! WHEW ! THAT WAS A CLOSE ONE ! JMP ALCOM YES, THE WHOLE BUFFER IS IN COMMON. * CHKWR LDB LWABF BUFFER NOT IN COMM, NOW INSURE CLA THAT THE LAST WORD IS IN MAPPED MEM. RRL 6 SO SHIFT PAGE # TO (A), ADA B40 ADD IN OFFSET FOR USER MAP *1940DLS* CCB CBX SET X=-1 FOR READ 1 REG TO MEMORY LDB DCURU READ IT INTO 'CURUS' XMM LDA CURUS RAL TEST BIT 14 SSA WRITE PROTECTED? JMP ERR04 YES, ERROR * ALCOM LDA RQPX NO ERROR CLE,SZA,RSS IF GET REQUEST JMP G.01 GO FINISH GET OPERATION * * CHECK FOR EQT LOCK * L.01 LDA $ELTB,I GET EQT. LOCK TABLE HEADER. SSA,RSS IF NOT_EMPTY BIT IS CLEAR, JMP L.019 SKIP EQT. LOCK CHECK. * RAL,ARS GET RID OF NOT_EMPTY BIT. STA TEMP3 STORE TABLE LENGTH. CMA,INA COMPUTE 2'S COMPLE OF LENGTH STA LTEMP AND SAVE IT. LDB $ELTB GET TABLE ADDR. ADB .1 GET 1ST ENTRY ADDR. LDA TEMP5 GET DRT ENTRY 1ST WORD. AND B77 ISOLATE THE EQT. #. SZA,RSS IF IT'S THE DUMMY EQT. (VIZ., #0), JMP L.019 SKIP EQT. LOCK CHECK. * L.016 CPA B,I COMPARE WITH $ELTB ENTRY 1ST WORD. JMP L.017 JIF THIS EQT. IS LOCKED. * INB NEXT ENTRY IN $ELTB. ISZ LTEMP IF MORE ENTRIES EXIST IN $ELTB, JMP L.016 GO LOOP. * JMP L.019 SKIP LOCKED_TO_HIM CHECK IF UNLOCKED. * LTEMP NOP 2'S COMPLE OF #-OF-COMPARES YET UNDONE * L.017 LDA B GET ADDR OF $ELTB ENTRY WHICH MATCHED. ADA TEMP3 GET ADDR OF ENTRY'S 2ND WORD. LDA A,I GET THE WORD. ELA,CLE,ERA GET RID OF UPPERMOST BIT. CPA XEQT IF IT MATCHES CALLER'S ID SEG ADDR, JMP L.018 GO CHANGE PRIOR. FOR FIFO PURPOSES. * JMP L.001 ELSE SUSPEND HIM ON $ELTB ENTRY. * L.018 LDB C100K SET 77777 STB TEMP2 FOR LINK PRIORITY CLB,INB AND 1 STB TEMP6 FOR BUFFERING PRIORITY. JMP L.01A SKIP LU LOCK CHECK SINCE EQT LOCK IS BOSS SKP * * CHECK FOR LU LOCK * L.019 LDA TEMP5 GET DRT ENTRY WORD 1 RRR 6 GET LOCK BITS TO LOW A. AND B37 ISOLATE LOCK BITS. SZA,RSS IF NO LOCK ON THIS LU, JMP L.01A SKIP LOCKED_TO_HIM? CHECK. * STA TEMP3 SAVE RN FOR PASS TEST. LDB C100K SET 77777 STB TEMP2 AS LINK PRIORITY CLB,INB AND 1 STB TEMP6 AS BUFFERING PRIORITY ADA D$RN INDEX INTO STA XTEMP,I RN TABLE LDA A,I GET ENTRY AND B377 ISOLATE OWNER'S OFFSET STA TEMPW (STASH IT AWAY) ADA KEYWD PICK UP ID SEG ADDR OF ADA N1 OWNER FROM KEYWD LDA A,I TABLE ENTRY. CPA XEQT IS THIS THE LOCK OWNER'S REQUEST ? JMP L.01A YES, SO CONTINUE. * LDA PARM9 NO, SO SEE IF HE'S GOT XOR TEMP3 THE KEY (I.E., RN #) ALF,ALF IN PARAMETER LIST. XOR TEMPW MILLION DOLLAR QUESTION SZA DOES SUPPLIED RN MATCH OWNER'S RN ? JMP L.002 NO, SO SUSPEND CALLER * L.01A LDA RQPX GET LOW BITS OF REQUEST CODE SAVED BEFORE CPA .3 IS THE REQUEST OF THE CONTROL ILK? JMP L.020 -YES, SO SKIP SOME FURTHER ANALYSIS. * LDB RQCNT GET REQUEST COUNT ADB N5 AND SET 'E' FOR FIVE PRAM TEST LDA EQT5,I CHECK REFERENCED DEVICE AND B36K FOR BEING A CPA B14K DISC FILE (DVR30,31,32,33) RSS JMP L.02 NO, UNIT IS NOT DISC. STA TEMPL SET 'DISC R/W USER REQ' FLAG SKP * * DISC ACCESS VALIDITY CHECK. * LDA RQP1 CLASS REQUESTS ALF,ALF TO THE DISC ALF,SLA ARE NOT JMP ERR02 ALLOWED. * SSB DISC REQUEST MUST HAVE 5 PRAMS. JMP ERR01 -ERROR-. * LDB REQLU GET (LU-1) CPB .1 IF LU # 2 OR 3, RSS SET INTO LOW CPB .2 BITS OF 'DISC INB,RSS R/W USER REQ' JMP DPOPT,I FLAG. IF USER DISC JUMP ON PROTECT OP. * L.10 IF NOT PROTECTED ELSE L.012 ADB TEMPL STB TEMPL * LDA PARM5 GET TRACK ADDRESS FROM AND B377 STA TEMP0 REQUEST - SAVE. LDA TATLG COMPUTE POSITIVE ADA TATSD LENGTH OF CMA,INA AUXILIARY DISC IN *TAT*. SLB,RSS IF REF TO SYSTEM DISC (LU #2), LDA TATSD USE SYS DISC SIZE. CMA,INA SUBTRACT MAX SIZE ADA TEMP0 FROM USER TRACK #. SSA,RSS JMP ERR05 -ERROR, ILLEGAL TRACK #. * LDA SECT2 (A)= # SECTORS/TRACK FOR LU #2 SLB IF LU FOR REQUEST = 3, LDA SECT3 SET (A) = # SECTORS FOR LU #3 CMA,CLE,INA SET VALUE NEG. LDB PARM6 GET SECTOR ADDRESS ADB A ERROR CCB,SEZ IF STARTING SECTOR LESS THAN 0 JMP ERR05 OR GREATER THAN TRACK SIZE. * ADB TMP8 CHECK FOR TRACK OVERFLOW BRS,BRS DIVIDE BUFFER LENGTH BRS,BRS (IN WORDS) BRS,CLE,BRS BY 64(10) ADB PARM6 ADD STARTING SECTOR # STB TMP8 SAVE FOR L.G. UPDATE ADB A ERROR IF LAST SECTOR CLA,SEZ,INA GT= JMP ERR08 LIMIT (EXCEEDS TRACK BOUNDARY) * CPA RQP1 INPUT IS ALLOWED TO REFERENCE ANY JMP L.10 TRACK. * LDA TEMP0 (A) = TRACK #. LDB REQLU (LU-1) TO (B). SLB,RSS IF REF TO LU #3 ADD ADA TATSD SYS DISC SIZE TO TRACK #. ADA TAT INDEX TO TRACK ASSIGNMENT TABLE. LDA A,I GET REFERENCED TRACK ASSIGNMENT. CPA XEQT (ID SEGMENT ADDRESS). IF SAME AS JMP L.10 REQUESTOR, ALLOW ACCESS. * CPA C100K ALLOW ACCESS IF TRACK IS JMP L.10 GLOBALLY ASSIGNED. * INA IF FMP TRACK THEN CPA C100K GO CHECK JMP L.012 FOR LEGAL CALL. * * CHECK FOR LOAD-AND-GO ACCESS * ERB,ERB CONSTRUCT LDB TEMP0 L.G. WORD BLF,BLF FOR CURRENT RQ. ERB SET SIGN IF LU 3. ADB PARM6 SET SECTOR IN LOW BITS CPB LGOC IF NOT = TO CURRENT LGO CLA,RSS ADDRESS, THEN JMP L.011 GO TO CHECK FOR "LOADR". * * UPDATE FOR NEXT LGO ACCESS - THIS ACCESS ALLOWED * ISZ TMP8 SAVE THE NEXT SECTOR ADDRESS IN TMP8 CPA LGOTK IS LGO AREA IS ASSIGNED. JMP L.011 -NO, CHECK LOADR. * LDA SECT2 SET (A) TO APPROPRIATE RBL,SLB,ERB # SECTORS (SET E IF LU 3) LDA SECT3 PER TRACK FOR LU #. CPA TMP8 IF NEW SECTOR EXCEEDS TRACK, CLA,RSS GO TO UPDATE TRACK #. JMP L.010 -NO OVERFLOW. * STA TMP8 SET SECTOR # TO 0. ISZ TEMP0 ADD 1 TO TRACK #. LDA LGOTK GET LGO TRACK ASSIGNMENT WORD. AND B177 -ADD # STA B OF TRACKS XOR LGOTK ASSIGNED CLE,ELA LU BIT TO E. ALF,ALF TO STARTING ADA B CHECK CPA TEMP0 FOR OVERFLOW. JMP ERR09 ---YES, '09' ERROR AND ABORT. * L.010 LDA TEMP0 RECONSTRUCT TRACK ALF,ALF THE CURRENT ERA LGO AREA IOR TMP8 DISC STA LGOC RESET. JMP L.10 SPC 1 * * I\O REQUEST ON A DOWN LU OR EQT * * ISSUE IONR MESSAGE TO USER TERM AND THE SUSPEND PROG * * L.014 LDA XEQT GET POINTER TO THE ID SEGMENT JSB NSBIT IS THE "NO SUSPEND" BIT SET ? JMP ERR14 YES, DON'T SUSPEND. PASS BACK IO14 ERROR. * DON'T PRINT IO MESSAGE, THE PROGRAM HANDLES IT * LDA REQLU SAVE REQUEST LU CCE,INA (ADJUST FOR INTERNAL STRUCTURE--LU-1) STA XTEMP+1,I BEFORE TEMP (REQLU) IS MODIFIED * LDA EQT1 FETCH ADDRESS OF EQT1 STA HEAD SET UP FOR LUERR CALL LDA A,I SAVE ADDRESS OF CURRENT REQUEST STA STMP3 FOR POSSIBLE ERROR ECHO WORK. LDA TEMP5 FETCH DRT WD2 OF DOWN DEVICE AND C3700 REMOVE LOCK INFO STA TEMP8 SET UP FOR LUERR CALL AND B77 ISOLATE EQT# STA XTEMP+2,I *1940* SAVE IT IN ID TEMP WD 3 JSB $CNV1 AND CONVERT IT TO ASCII (DECIMAL) STA IOMSG+6 AND SET INTO MESSAGE LDA TEMP8 FETCH EQT SC WORD ALF,RAL ISOLATE SUBCHANNEL AND B37 CONVERT IT JSB $CNV1 TO ASCII THEN STA IOMSG+8 SET IT INTO THE ERROR MESSAGE LDA ASNR FETCH ASCII "NR" STA IOMSG+1 AND SET IT INTO ERROR MESSAGE * DLD ASTER DEVICE STATUS COULD BE INVALID DST IOMSG+9 SO REPLACE IT WITH "***" * CCA PRINT ONLY ON SESION(MTM) TERMINALS JSB LUERR GO ISSUE THE ERROR LDB .4 4 TO B L.013 STB XTEMP,I SET 4 IN FIRST WORD OF TEMP AREA. L.015 JSB $LIST PUT PGM IN WAIT LIST OCT 503 UNTIL DEVICE COMES UP. JMP $XEQ EXIT TO DISPATCHER * L.001 STB XTEMP,I IF WE SUSPEND, DO IT ON EQT LOCK TABLE L.002 LDA XEQT GET POINTER TO ID SEGMENT JSB NSBIT IS THE "NO SUSPEND" BIT SET ? JMP ERR13 YES, DON'T SUSPEND. PASS BACK IO13 ERROR JMP L.015 NO, GO SUSPEND PROGRAM * ICOMX NOP DUMMY EQT FOR LU=0 B36K OCT 36000 .12 DEC 12 B14K OCT 14000 EQT4 OF DUMMY(BITS 0-5 = 0). .13 DEC 13 TEMP1 NOP EQT6 OF DUMMY N3 DEC -3 N5 DEC -5 C100K OCT 77777 $DMEQ DEF ICOMX ADDRESS OF DUMMY EQT DPOPT DEF L.10 DISC PROTECT OPTION (L.012 IF PROTECTED) B40 OCT 40 DRQ2I DEF RQP2,I DPARM DEF PARM2 ADDRESS OF ACTUAL PARAMETERS PARM2 NOP ACTUAL USER PARAMETER #2 PARM3 NOP ACTUAL USER PARAMETER #3 PARM4 NOP ACTUAL USER PARAMETER #4 PARM5 NOP ACTUAL USER PARAMETER #5 PARM6 NOP ACTUAL USER PARAMETER #6 PARM7 NOP ACTUAL USER PARAMETER #7 PARM8 NOP ACTUAL USER PARAMETER #8 PARM9 NOP ACTUAL USER PARAMETER #9 ASTER ASC 2, *** REQLU NOP SPC 2 L.00X LDA $DMEQ SET UP DUMMY EQT FOR LU=0 JSB $ETEQ ON BASE PAGE JMP L.000 CONTINUE PROCESSING SPC 2 SKP * * * SWTCK (SWITCH TABLE CHECK) * * SCAN THE SPECIFIED TABLE (LOW BYTE OF SESSION OR BATCH SWITCH TABLE) * FOR A MATCH WITH THE VALUE IN TEMP1. * * CALLING SEQUENCE:LDA -LENGTH * LDB ADDRESS OF TABLE(POINTS AT LENGTH) * REQLU = ISOLATED SEARCH LU (LU-1) * JSB SWTCK * RETURN P+1 NO SWITCH FOUND * P+2 SWITCH FOUND,(A) AND REQLU = SWITCHED LU * * * SWTCK NOP STA STMP1 SAVE NEG LENGTH SWT.0 INB ADVANCE TABLE ADDRESS LDA B,I FETCH ENTRY AND B377 IF SAME CPA REQLU AS CURRENT LU JMP SWT.1 GO SWITCH IT * ISZ STMP1 STEP COUNT JMP SWT.0 AND LOOP JMP SWTCK,I UNTIL DONE--NO MATCH FOUND,RTN P+1 * SWT.1 LDA B,I FETCH SWITCH TABLE WORD ALF,ALF USE HIGH HALF OF TABLE AND B377 ISOLATE "NEW" LU STA REQLU SET THE NEW LU (LU-1) ISZ SWTCK MATCH FOUND, RTN P+2 JMP SWTCK,I CONTINUE AT P+2, (A) ALSO = NEW LU * * STMP1 BSS 2 NEED 2 WORDS FOR $PSTE SPC 5 RQERR DLD ASRQ FETCH ASCII "RQ " JSB $ERMG GO ISSUE ERROR AND ABORT JMP $XEQ CONTINUE * ASRQ ASC 2,RQ SKP * ALLOW PRIVILEGED ACCESS TO "LOADR" TO PERMIT * UPDATING OF ID SEGMENTS AND PROGRAMS ON THE * SYSTEM AREA OF THE DISC. * L.011 LDB XEQT COMPARE ADB .12 NAME LDA B,I 3 CPA LDRNM WORD INB,RSS AREA JMP ERR06 IN * LDA B,I CURRENT CPA LDRNM+1 ID INB,RSS SEGMENT JMP ERR06 WITH * LDA B,I 'LOADR' AND C377 -IF CPA LDRNM+2 SO, JMP L.10 ALLOW FULL ACCESS * JMP ERR06 - ERROR - * LDRNM ASC 2,LOAD L O A D OCT 51000 R -ZERO- SPC 1 B177 OCT 177 B74K OCT 74000 B160K OCT 160000 KEEP BITS 13-15 LWABF NOP SPC 2 L.012 LDA PARM2 FMP TRACK LDB RQP1 AND B74K IF FLAG SET SLB,RSS OR IF READ CPA B74K THEN ALLOW JMP L.10 ACCESS. * JMP ERR06 ELSE ILLEGAL DISC WRITE. SKP L.02 CLA,SEZ,RSS IF BIT 12 OF CONWORD LDA PARM2 SET AND ALF,SLA NOT FIVE PRAMS JMP ERR01 TAKE GAS! * L.020 LDB RQPX GET THE MASKED REQUEST CPB RQP1 IF STANDARD I/O JMP L.027 SKIP THE CLASS CODE SKP * * * CLASS I/O ALLOCATE CLASS FROM HIGH END OF TABLE * IF HE DID NOT SPECIFY A CLASS. * CLA,CLE E=0 IF USE OLD CLASS NUMBER STA XA,I A=0 FOR INIT.GOOD RETURN LDA RQP7 ADDR FROM THE REQUEST CPB .3 IF CONTROL REQUEST (19) LDA RQP4 USE THE CONTROL CLASS WORD SZA,RSS IF CLASS WORD ADDR = 0 JMP ERR01 FLUSH IT OUT. * STA TEMP3 SAVE ADDR OF CLASS WORD XLA TEMP3,I USER'S CLASS WORD AND B160K GET BITS 15,14, AND 13 STA SECCD L.025 XLA TEMP3,I GET CLASS WORD STA CLASS SET THE CLASS WORD AND B377 MASK TO THE CLASS DEF. STA B SAVE CLASS NUMBER IN B CMA,INA,SZA IF SUPPLIED JMP L.021 SKIP ALLOCATION CODE * * * ALLOCATE A CLASS FROM THE HIGH END OF THE TABLE * LDB XEQT GET ID SEG ADDR JSB $IDNO CONVERT TO ID # LDA B37 FOR USE AS SECURITY CODE AND B ALF,ALF IOR SECCD FILL IN USER'S BIT15,14,13 XSA TEMP3,I FOR RETURN AS CLASS NUMBER * LDA $CLAS GET THE LENGTH OF THE TABLE ADA DCLAS ADD THE TABLE ADDRESS * L.022 LDB A,I GET THE ENTRY TO B CCE,SZB,RSS IF FREE (0) JMP L.023 GO USE IT * ADA N1 NO STEP TO NEXT ONE CPA DCLAS END OF TABLE? CCA,RSS YES SKIP (A = -1) JMP L.022 NO - GO TEST NEXT ONE. * L.026 STA XA,I SET REASON FOR REJECT IN A REG. LDB DCLAS SET B=CLASS TABLE ADDR LDA CLASS FOR L.013 IN CASE OF SUSPEND SSA NO-WAIT REQUESTED? JMP L.16 NO, GIVE NO CLASS STATUS * JMP L.013 YES, SUSPEND UNTIL CLASS AVAILABLE * L.023 STA PTR SAVE CLASS QUEUE WORD ADDR XLB TEMP3,I GET SECURITY CODE AND USER BIT ADA MCLAS SUBTRACT THE CLASS TABLE ADDRESS IOR B ADD SECURITY CODE AND USER BIT XSA TEMP3,I RETURN NEW CLASS WORD TO USER AND B174C GET SECURITY CODE FOR CLASS QUEUE-HEAD RAL,ERA SET THE ALLOCATED BIT STA PTR,I PUT INTO CLASS QUEUE CCE SET E=1 AGAIN FOR NEW ALLOC JMP L.025 GO SET UP * L.021 ADB DCLAS USE CLASS# (IN B) TO INDEX AND STB PTR SET POINTER TO TABLE STA B LDA CLASS GET CLASS WORD AND B174C SAVE REAL SECURITY CODE STA SECCD LDA PTR,I GET CONTENTS SEZ,CLE,RSS IF NOT NEW ALLOCATION SZA AND NOT ALLOCATED, FORCE ERROR ADB $CLAS IF OUTSIDE OF TABLE CLB,SEZ,RSS THEN JMP ERR00 SEND ERROR 'IO00' * LDA PTR L.13A STA B SET B TO ADDR OF QUEUE ENTRY LDA B,I GET CONTENTS SSA,RSS A POINTER? JMP L.13A YES, TRACE IT MORE * AND B174C GET SECURITY CODE FROM QUEUE CPA SECCD COMPARE IT WITH USER'S RSS DOES IT MATCH? JMP ERR00 NO, ERROR 'IO00' * STB SECCD SAVE QUEUE ENTRY ADDR IN SECCD LDB RQPX GET THE MASKED REQUEST CODE JMP L.028 AND GO DO THE BUFFER THING SKP * * CHECK FOR AUTOMATIC BUFFERING REQUIREMENT * L.027 CPB .1 SKIP CHECK IF REQUEST JMP L.10 IS INPUT. * LDA EQT4,I CHECK THE UNIT DESCRIPTOR RAL WORD IN ITS EQT ENTRY,BIT 14, SSA,RSS FOR BUFFERING. JMP L.10 -NO * LDA PARM2 DYNAMIC STATUS AND B3700 REQUESTS ADA B ARE NEVER CPA B603 BUFFERED JMP L.10 DYNAMIC STATUS DO STD. USER RQ. * * * AUTOMATIC BUFFERING SECTION * L.028 CLA STA TMP6 CPB RQP1 IF NOT CLASS, USE 5 WORDS FOR CONTROL LDA N2 USE 5 WORDS FOR CONTROL REQUEST CPB .3 IF REQUEST IS FOR -CONTROL-, JMP L.03 SKIP BUFFER SIZE CHECK. * LDA TMP8 GET THE XFER LENGTH STA TEMP3 -SET AS MOVE INDEX- LDB PARM2 IF DOUBLE BUFFER REQUEST BLF,SLB THEN RSS JMP L.03 * LDB PARM6 GET SECOND BUFFER SIZE SSB,RSS NEGATIVE CHARACTER COUNT? JMP L.029 NO, USE WORD COUNT * BRS YES, CONVERT TO WORDS CMB,INB L.029 LDA B GET SECOND BUFFER SIZE ADA TMP8 ADD TO FIRST BUFFER STB TMP6 SAVE SECOND BUFFER SIZE L.03 ADA .8 ADD 8 FOR BLOCK CONTROL WORDS. LDB RQPX GET MASKED REQ. CODE CPB RQP1 IF NOT CLASS REQUEST ADA N1 THEN SUBTRACT 1 STA L.04 AND SET UP IN CALL * SSA IF BUFFER SIZE IS NEGATIVE (TOOOOOO BIG) JMP ERR04 REJECT THE REQUEST WITH IO04. * LDA N41 IF PRIORITY ADA XPRIO,I LT 41 THEN SSA DO NOT DO BUFFER LIMIT JMP L.031 TEST * LDB $BLUP CHECK IF BEYOND THE LIMIT IN WORDS JSB QCHK ON THIS DEVICE JMP L.040 YES GO CHECK FOR CLASS RQ * * ALLOCATE BLOCK IN TEMPORARY STORAGE * L.031 JSB $ALC CALL AT SYSTEM ENTRY POINT L.04 NOP - REQUESTED LENGTH OF BLOCK - JMP L.041 NEVER ANY MEMORY, TRY NO BUFFER. JMP L.042 NO MEMORY NOW, SUSPEND. JMP L.06 ALLOCATION OK. * L.040 LDA CLASS IF CLASS AND NO SUSP. SSA,RSS ON BUFFER LIMIT SKIP TO EXIT JMP L.013 ELSE GO SUSPEND * * NO MEMORY AVAILABLE FOR BLOCK - CALLING USER * PROGRAM IS TO BE LINKED INTO MEMORY SUSPENSION * $LIST AND RE-SCHEDULED AT POINT OF REQUEST * WHEN A PREVIOUSLY ALLOCATED BLOCK IS RELEASED. * L.042 LDA N2 IF CLASS I/O CHECK LDB CLASS FOR NO SUSP OPTION SSB IF SET JMP L.026 GO SET FLAG AND EXIT * SZB IS THIS A CLASS REQUEST ? JMP L.043 YES, GO MEMORY SUSPEND. LDA XEQT POINT AT THE ID SEGMENT. JSB NSBIT IS "NO SUSPEND" BIT SET ? JMP L.10 YES, PROCESS THE REQUEST UNBUFFERED. * L.043 JSB $LIST NO, CALL TO LINK PROGRAM INTO OCT 504 MEMORY SUSPENSION LIST. JMP $XEQ * L.041 LDA CLASS NEVER ENOUGH MEMORY SZA IF CLASS REQUEST JMP ERR04 ABORT PROGRAM IO04 * JMP L.10 ELSE GO UNBUFFERED. * SECCD NOP B603 OCT 603 N41 DEC -41 SKP * * * SET REQUEST PARAMETERS, PROGRAM PRIORITY AND * USER BUFFER INTO TEMPORARY BLOCK. * L.06 STB L.04 SET ACTUAL BLOCK LENGTH. STA TEMP1 SAVE BLOCK CLE,INA STA TEMPW SAVE ADDRESS JSB WORD2 ASSEMBLE CONTROL WORD LDB RQP1 IF A CLASS CPB RQPX REQUEST CLE THEN RAL,ERA SET THE FIELD TO 3 IOR B40K SET = 1 FOR BUFFERING. LDB TEMPW STA B,I AND SET IN WORD 2 OF BLOCK. INB LDA TEMP6 SET REQUESTING PROGRAM PRIORITY STA B,I IN WORD 3. INB LDA L.04 SET BLOCK LENGTH IN STA B,I WORD 4. INB LDA TEMPW,I GET THE CONWORD SSA,RSS IF STANDARD REQUEST JMP L.061 SKIP * LDA CLASS ELSE SET THE CLASS STA B,I WORD IN INB THE BUFFER L.061 LDA .3 IF REQUEST CPA RQP1 IS STANDARD CONTROL, SKIP JMP L.08 BUFFER MOVE * LDA PARM4 SET USER BUFFER LENGTH STA B,I IN WORD 5. CMA,CLE,INA SET E IF ZERO LENGTH BUFFER (SAVE A CYCLE IF SO) LDA PARM5 GET FIRST OPTIONAL WORD INB STEP TO STORE LOCATION STB TEMPW SAVE THE ADDRESS OF THE LOCATION STA B,I SET IT INB SET FOR NEXT WORD LDA PARM6 GET SECOND OPTIONAL WORD STA B,I SET IT IN THE BUFFER LDA RQP1 IF CLASS READ OR CPA B23 IF CLASS CONTROL, JMP L.078 GO FINISH ITS SET UP * CPA B21 IF CLASS READ ADB TMP8 ADJUST BUFFER ADDRESS FOR DOUBLE BUF. SEZ,CLE,INB,RSS IF LENGTH = 0, CPA B21 OR CLASS READ JMP L.075 SKIP BUFFER MOVE. * * MOVE USER BUFFER TO TEMPORARY BLOCK. * LDA RQP3 SET USER BUFFER L.065 EQU * ADDRESS FOR MOVE. LDX TEMP3 GET # WORDS TO MOVE MWF MOVE INTO SYSTEM MAP FROM USER MAP * L.075 LDA TMP6 GET LENGTH OF SECOND BUFFER STA TEMP3 SET FOR MOVE LDA PARM2 GET THE REQUEST CONTROL WORD ALF,SLA IF FIRST TIME AND DOUBLE BUFFER SEZ,CCE SKIP JMP L.13 ELSE CONTINUE * STB TEMPW,I SET BUFFER ADDRESS IN REQUEST LDA RQP5 GET USER BUFFER ADDRESS JMP L.065 GO MOVE THE BUFFER * L.078 ADB N2 CORRECT (B) FOR CLASS CONTROL L.08 LDA PARM3 FOR CONTROL REQUEST, SET WORD 3 STA B,I (PARAM) IN PLACE OF RECORD JMP L.13 LENGTH. SPC 2 B21 OCT 21 B23 OCT 23 D$RN DEF $RNTB+0 DIRECT ADDRESS OF RN TABLE SKP SPC 2 * * REQUEST IS A NORMAL WRITE, CONTROL OR READ. * THE PARAMETERS OF THE REQUEST ARE MOVED * INTO THE ID SEGMENT OF THE REQUESTING * PROGRAM. THE ID SEGMENT IS THEN LINKED * INTO THE I/O LIST FOR THE REFERENCED DEVICE. * THE -SCHEDULER- IS THEN CALLED TO REMOVE * THE PROGRAM FROM THE SCHEDULED LIST AND TO * CHANGE THE PROGRAM STATUS TO I/O SUSPENSION. * * L.10 CLE CLEAR (E) FOR WORD2 CALL LATER LDB PARM3 GET CONTROL WORD LDA RQP1 (A) = REQUEST CODE. CPA .3 IF CONTROL GO JMP L.101 SET IT UP * LDB XTEMP+4 GET THE ADDRESS OF THE RENT ADB .15 BIT IN THE ID-SEG. LDA B,I GET THE WORD TO A ALF,RAL PUT THE BIT IN SIGN OF A LDB RQP3 BUFFER ADDRESS TO B CLE,SSA IF BIT SET JSB $REIO GO MOVE THE TDB (IF NEEDED) * CLA,SEZ DID WE CALL $REIO? CPA $MVBF -YES, BUT DID $REIO MOVE THE BUFFER? CLE,RSS -NO. $REIO NOT CALLED OR BUFFER NOT MOVED. ADB MSIGN E-REG IS SET. $REIO CALLED & BUFFER MOVED. STB XTEMP+1,I SET BUFFER ADDRESS OR CONTROL WORD LDA PARM4 BUFFER STA XTEMP+2,I LENGTH AND LDA PARM2 GET THE CON WORD CMA,CME SET COMPLEMENT IOR TEMPL MIRGE WITH DISC FLAG LDB RQP5 GET SECOND BUFFER ADDRESS ALF,SLA IF NONE SZB,RSS IF NONE USE JMP L.102 ZERO XLB B,I GET THE OPTION WORD L.102 SEZ,SLA,RSS IF RENT AND DOUBLE BUFFER JSB $REIO GO CHECK OUT THE BUFFER ADDRESS STB XTEMP+3,I SET THE PRAMETER IN THE ID-SEGMENT * LDA PARM6 SET THE FINAL OPTIONAL WORD STA XTEMP+4,I IN THE ID-SEGMENT * CLE,RSS SKIP CONTROL SET UP L.101 STB XTEMP+1,I SET CONTROL WORD JSB WORD2 ASSEMBLE CONTROL WORD (E)=0 ALREADY STA XTEMP,I SAVE IN TEMPORARY #1 LDB XEQT SET ADDRESS OF LINK WORD STB TEMP1 IN TEMP1. * JSB $LIST CALL SCHEDULER TO SUSPEND PROG. OCT 402 - ID SEG. ADDR./I/O SUSPEND - * * CALL -LINK- TO PERFORM THE LINKING OF THE NEW * BLOCK INTO THE DEVICE QUEUE OF * WAITING OPERATIONS. * L.13 LDA RQP1 IF STANDARD I/O CPA RQPX THEN JMP L.131 GO UP DATE AND EXIT * * CLASS I/O SO SET THE CLASS QUEUE TO SHOW * ANOTHER REQUEST IS PENDING. * LDA SECCD,I INA INCREMENT CLASS QUEUE COUNT BY 1 STA SECCD,I JMP L.132 SKIP XSUSP SET UP * * L.131 LDB XSUSP,I SET THE SUSP POINT STB XA,I IN XA FOR THE ABORT ROUTINE L.132 LDA RQRTN AND SET THE RETURN ADDRESS STA XSUSP,I IN THE ID-SEG. JSB LINK LINK SETS E=0 IF EMPTY QUEUE LDB EQT1 IF DUMMY EQT FOR LU=0 CPB $DMEQ THEN JMP L.135 GO TO COMPLETE * * SEZ,RSS IF QUEUE WAS EMPTY CALL DRIVR. * * EMPTY LIST, CALL TO INITIATE CURRENT REQUEST. * JSB DRIVR JMP $XEQ - OPERATION INITIATED - JMP NOTRD - OPERATION REJECTED OR COMPLETED - * L.135 LDB PARM4 GET THE REQUEST LENGTH L.136 SSB AND SET UP CMB,INB THE TLOG LDA .2 SET A FOR IMMEDIATE COMPLETION JMP R00 AND GO TO COMPLETION SECTION * SKP * STATUS REQUEST SECTION * L.15 LDA RQCNT INSURE THAT AT LEAST 2 ADA N2 PARAMETERS PROVIDED - ONE SSA TO STORE STATUS WORD. JMP ERR01 -NO, ERROR '01'. * LDB EQT5,I STORE WORD 5 OF EQT ENTRY XSB RQP3,I IN 'STAT1'. LDA EQT4,I STORE WORD 4 OF EQT ENTRY XSA RQP4,I IN 'STAT2'. * LDB REQLU GET SUBCHANNEL ADB DRT FROM DRT LDA B,I WORD 1. AND B174K ALF,RAL PUT SUBCHANNEL IN ADB LUMAX LOWER 5 BITS. LDB B,I GET UP/DOWN BIT FROM CLE,ELB DRT WORD 2 AND OR RAL,ERA WITH SUBCHANNEL. XSA RQP5,I STORE IN 'STAT3'. L.16 LDA RQRTN UPDATE THE STA XSUSP,I RETURN ADDRESS JMP $XEQ AND EXIT SPC 3 RQPX NOP CLASS NOP DCLAS DEF $CLAS+0 DIRECT ADDR OF CLASS TABLE MCLAS NOP CONFIGURED TO BE NEGATIVE OF ABOVE. B174C OCT 17400 BITS 8-12 B37 OCT 37 N2 DEC -2 .22 DEC 22 SKP * $GTIO IS THE ENTRY POINT THE EXEC CALLS FOR A 'GET' EXEC * CALL. * $GTIO XLA RQP2,I GET REAL PARAM STA PARM2 XLA RQP4,I FOR BFCK STA PARM4 LDA PARM2 GET THE CLASS AND B377 MASK STA B SAVE AND CMA,CLE,INA,SZA,RSS IF CLASS=0 CLE,RSS SEND "IO00" * ADA $CLAS IF GREATER THAN MAX THEN CLA,SEZ,RSS SEND JMP ERR00 'IO00' ERROR * STA RQPX CLEAR REQ CODE ADB DCLAS SET THE STB CLASS CLASS TABLE ADDRESS JMP BFCK GO CHECK THE BUFFER ADDRESS. * * BFCK RETURNS TO G.01 * G.01 LDA PARM2 GET SECURITY CODE AND B174C BITS FROM CLASS WORD STA SECCD LDB CLASS,I GET QUEUE HEAD SSB IF A COUNTER JMP G.06 GO SUSPEND THE PROGRAM * SZB,RSS IF QUEUE-HEAD = 0 JMP ERR00 ERROR "IO00" * STB PTR SAVE THE ADDRESS INB GET THE CON WORD LDA B,I AND AND .3 ISOLATE THE REQUEST CODE XSA RQP7,I RETURN IT TO USER'S IRCLS INB STEP TO STATUS WORD LDA B,I GET COMPLETION STATUS. STA XA,I AND SET IT IN THE A REG. INB GET THE BUFFER LENGTH LDA B,I AND SET IT STA CLTMP FOR RETURN INB STEP TO USER CLASS WORD LDA B,I GET IT AND B174C KEEP SECURITY CODE CPA SECCD MATCHES CALLER'S? RSS JMP ERR00 NO, ERROR IO00 * INB INDEX TO THE LDA B,I TLOG AND STA XB,I SET IT IN THE 'B' REG INB INDEX TO THE LDA B,I FIRST OPTIONAL WORD AND XSA RQP5,I SET IT IN THE USERS BUFFER INB NOW DO THE SECOND OPTIONAL WORD LDA B,I XSA RQP6,I * STB TEMP4 SAVE THE BUFFER ADDRESS LDA .8 GET THE BUFFER LENGTH CMA,INA SET NEGATIVE ADA CLTMP LOP OFF THE HEAD WORDS STA TEMP3 SET THE MOVE COUNT LDB TMP8 GET THE SUPPLIED LENGTH CMA,INA SET MOVE COUNT NEG ADA TMP8 SUBTRACT FROM USER BUFFER SIZE SSA,RSS IF QUEUE COUNT IS SMALLER, LDB TEMP3 USE QUEUE SIZE, MAY BE 1 BIGGER!! SSB IF COUNT LESS THAN ZERO THEN JMP G.05 THEN SKIP MOVE * LDA TEMP4 GET THE BUFFER ADDRESS. INA STEP TO THE PROPER WORD CBX GET MOVE COUNT LDB RQP3 GET DESTINATION MWI MOVE FROM SYSTEM TO USER G.05 LDA PARM2 IF SAVE RAL,RAL QUEUE OPTION SLA,ELA THEN JMP L.16 EXIT * LDA PTR,I ELSE STA CLASS,I UPDATE THE LIST SSA IF POINTER, SKIP COUNT CHECK AND B37 GET # PENDING REQUESTS LEFT SEZ,SZA,RSS NO REQUESTS LEFT STA CLASS,I AND IF DEALLOCATE WANTED, DO IT. JSB $RTN RETURN THE MEMORY PTR NOP AND CLTMP NOP THEN JMP G.08 SCHEDULE WAITERS AND EXIT * G.06 LDA B174C GET SECURITY CODE AND B FROM QUEUE CPA SECCD MATCH? RSS JMP ERR00 NO, ERROR IO00 * RBL,CLE,ELB MOVE BIT14 (SOMEONE WAITING) TO E G.065 LDA CLASS,I GET CLASS WORD AND B377 CMA,SEZ ANYONE WAITING? (SET ONES COMP) JMP SCEDT YES,SORRY SOMEBODY BEAT YOU TO IT * STA XA,I SET A FOR POSSIBLE RETURN INA GET CORRECT 2'S COMPLEMENT STA B LDA PARM2 GET THE OPTION FLAG ELA,RAL SET E=BIT15 NO-WAIT OPT. SZB,RSS IF QUEUE-HEAD = 0 SSA AND BIT14 SET, JMP G.07 DON'T DEQUEUE * STB CLASS,I IF Q-H=0 AND BIT14=0 DEQUEUE! G.08 LDA DCLAS NOW SCHEDULE ALL THOSE WAITING JSB $SCD3 FOR AN AVAILABLE CLASS NUMBER. JMP L.16 RETURN * G.07 SEZ,CCE JMP L.16 BIT15=1 FOR NO-WAIT. RETURN. * LDB CLASS GET CLASS ADDR IN B FOR L.013 LDA B,I SET "SOMEONE IS WAITING" FLAG RAL,RAL ERA,RAR STA B,I AND JMP L.013 PUT IT BACK INTO WAIT LIST SPC 1 C377 OCT 177400 COMPLEMENT OF 377 SKP * * * * THE COMN ROUTINE IS USED TO DETERMINE IF THE BUFFER * SPECIFIED IS IN COMMON. TO BE IN COMMON THE BUFFER * MUST BE BELOW THE LOAD POINT OF THE PROGRAM SPECIFIED. * AND ALSO BE BELOW $SDA, THE START OF THE SYSTEM DRIVER * AREA. IT IS NOT ENOUGH TO JUST SEE IF THE BUFFER IS BELOW * THE LOAD POINT AS THE BUFFER COULD BE IN THE MEMORY RESIDENT * LIBRARY. WE ALSO DON'T HAVE TO CHECK IF THE ADDRESS IS BELOW * $CMST AS EXEC DOES THIS FOR ALL I/O REQUESTS IN THE * MEMORY PROTECT CHECK PROCESSOR. * * * * CALLING SEQUENCE: LDA BUFFER ADDRESS * LDB ID SEG ADDRESS * JSB COMN * - HERE IF BUFFER NOT IN COMMON * - HERE IF BUFFER IS IN COMMON * * * COMN NOP CMA MAKE BUF ADDR NEG +1 & STA BUFAD SAVE FOR NEXT CHECK. * ADB .22 INDEX TO LOAD POINT ADA B,I OF PROGRAM. SSA BUFFER BELOW LOAD POINT ? JMP COMN,I NO, SO IT CAN'T BE IN COMMON. * LDA $SDA GET PAGE # OF SDA & CONVERT ALF,ALF TO RAL,RAL AN ADDRESS ADA BUFAD NOW IS THE BUFER ALSO SSA,RSS BELOW THE SYSTEM DRIVER AREA ? ISZ COMN YES, BUFFER MUST BE IN COMMON. JMP COMN,I NO, SO RETURN. * * BUFAD NOP **************************************************************** * *WORD2 ASSEMBLE CONTROL WORD * * CONTROL WORD IS BUILT AS FOLLOWS: * ******************************************************** * T * S * X * U * S FUN * SUB CHAN * REQUEST CODE * * 15/14*13 *12 *11 * 10----6* 5------2 * 1/0 * ******************************************************** * * WHERE: * T= 0 FOR STD USER REQUEST CODE = 1 FOR READ (CLASS OR NORMAL) * = 1 FOR BUFFERED RQ. = 2 FOR WRITE " * = 2 FOR SYSTEM = 3 FOR CONTROL " * = 3 FOR CLASS RQ. * * 'SUB CHAN' IS THE LOW 4 BITS AND 'S' IS THE 5'TH BIT OF THE * SUB CHANNEL. * 'X' IS THE DOUBLE BUFFER BIT * 'U' IS CURRENTLY UNUSED * 'S FUN' IS THE USER SUB FUNCTION * IF THE DEVICE IS A DISC THEN THE 'X' BIT IS CLEARED AND BITS * 8,9 IN 'S FUN' ARE SET TO THE LU IF 2 OR 3 ,ELSE THEY ARE * ZEROED. * THIS ROUTINE DOES NOT BUILD THE 'T' FIELD. *** CALL WITH E=0 *** * ***************************************************************** WORD2 NOP LDB RQPX IF CLASS WRITE-READ CPB .4 THEN CHANGE CLB,CLE,INB CHANGE TO READ REQUEST LDA PARM2 COMBINE REQUEST CODE WITH AND B137C CONTROL INFORMATION ADB A TEMPORARILY STORE IT- LDA TEMP5 GET DRT ENTRY FOR THIS LU AND B174K GET SUBCHANNEL ELA,RAL SAVE HIGH BIT AND ALF,RAL POSITON REST ADA B ADD IT TO THE WORD SEZ IF HIGH BIT SET ADA B20K SET IT IN THE WORD LDB TEMPL IF NOT DISC CCE,SZB,RSS REQUEST, JMP WORD2,I EXIT - * AND C114C OTHERWISE, SWP SET BITS (9,8) AND .3 TO INDICATE ALF,ALF SYSTEM, AUXILIARY, IOR B OR PERIPHERAL TYPE JMP WORD2,I EXIT - * B137C OCT 13700 B3700 OCT 3700 C114C OCT 166377 * * SCEDT ERB,RBR CLEAR THE BIT AND STB CLASS,I RESET THE CLASS HEAD LDB $LIST SAVE STATUS OF STB STADV $LIST ENTRY POINT. LDA CLASS GET HEAD ADDRESS TO A AND JSB $SCD3 RESCHEDULE THE WAITER IF ANY CLE E=0 FOR G.065. IF $LIST ENTRY POINT LDA $LIST IS UNCHANGED, THEN THERE WAS CPA STADV NO WAITER. JMP G.065 NO, SO MUST HAVE BEEN ABORTED. CONTINUE. JMP ERR10 YES. ERROR, SO GO ABORT. * * **************************************************************** * * SUBROUTINE STADV: * * STADV WILL RETURN AT THE UP EXIT IF LU=0. IT NEXT * CHECKS TO DETERMINE IF THE CURRENT EQT IS DOWN(BIT * 14 EQT WORD 5)OR IF THE LU IS DOWN(BIT 15 DRT WORD 2). IF * DOWN, RETURN IS MADE AT P+1. IF UP, RETURN IS MADE AT P+2. * * CALLING SEQUENCE: * :=ADDRESS OF STATUS WORD FOR THIS EQT. * :=LU#-1. * JSB STADV * * RETURN: * (P+1) EQT OR LU DOWN. * (P+2) EQT AND LU UP. * ALL REGISTERS ARE VIOLATED. * ****************************************************************** * STADV NOP CPA B377 IF LU=0(IE, 377B), THEN JMP STAD9 GOTO UP EXIT. * ADA DRT GET DRT WORD ADA LUMAX 2 AND CHECK LDA A,I IF THE LU IS SSA UP OR DOWN. JMP STADV,I LU IS DOWN. * LDB EQT5,I LU IS UP, SO RBL,SLB CHECK IF THE JMP STAD9 EQT IS UP OR SSB DOWN. JMP STADV,I EQT IS DOWN. * STAD9 ISZ STADV LU AND EQT JMP STADV,I ARE UP. SKP * SUBROUTINE NSBIT * * "NO SUSPEND" BIT CHECK SUBROUTINE * * THIS SUBROUTINE EXAMS THE "NO SUSPEND" BIT (BIT 14) OF * WORD 15 OF THE ID SEGMENT POINTED TO BY THE AREG ON * ENTRY. RETURN AT P+1 IF BIT SET. RETURN AT P+2 IF BIT * IS NOT SET. * * CALLING SEQUENCE: * * LDA ID SEGMENT ADDRESS * JSB NSBIT * (P+1) "NO SUSPEND" BIT SET * (P+2) "NO SUSPEND" BIT NOT SET * * AREG IS DESTROYED. * NSBIT NOP ADA .15 POINT AT WORD 15 OF ID SEGMENT. LDA A,I PICK UP THE ACTUAL WORD AND RAL ROTATE BIT 14 TO MSB. SSA,RSS IS "NO SUSPEND" BIT (BIT 14) SET ? ISZ NSBIT NO, RETURN AT P+2. JMP NSBIT,I YES,RETURN AT P+1. SKP * THE QUEUE CHECK ROUTINE CHECKS TO SEE IF THE QUEUE ON * THE CURRENT EQT HAS MORE THEN THE 'LIMIT' NUMBER OF WORDS * OF BUFFER MEMORY ON IT AT THE CURRENT TIME. * THE LIMIT IS PASSED IN THE B REG. SO THE ROUTINE CAN * CAN BE USED FOR BOTH UPPER AND LOWER LIMIT CHECKS. * * CALLING SEQUENCE: * * LDB NEGATIVE OF LIMIT * JSB QCHK * --- MORE THAN LIMIT WORDS ON QUEUE * --- LESS THAN LIMIT WORDS ON QUEUE * EQT1 ADDRESS IS IN B ON EXIT * QCHK NOP STB TEMP1 SET LIMIT LDA EQT1,I START AT EQT HEAD RAL,CLE,ERA CLEAR POSSIBLE SIGN AND E CLE,SZB SET E FOR NOT EXCEEDED QCHK1 SZA,RSS END OF QUEUE? JMP QCHK3 YES GO EXIT * STA TEMPW SET CURRENT ELEMEMT INA GET THE CON WORD LDB A,I TO B RBL CHECK IF A BUFFERED SSB,RSS REQUEST? JMP QCHK2 NO TRY NEXT ONE * ADA .2 YES STEP TO THE COUNT LDB A,I GET COUNT TO B ADB TEMP1 ADD TO LIMIT STB TEMP1 AND RESET QCHK2 LDA TEMPW,I GET NEXT ELEMENT JMP QCHK1 GO CHECK THIS ELEMENT * QCHK3 LDB EQT1 GET SUSPEND POINTER SEZ,RSS OVERFLOW? ISZ QCHK NO STEP RETURN JMP QCHK,I RETURN * SKP * SUBROUTINE: -LINK- * * PURPOSE: THIS ROUTINE PROVIDES FOR ADDING * AN I/O REQUEST INTO THE SUSPENDED * LIST (QUEUE) CORRESPONDING TO THE * REFERENCED DEVICE. THE PROCEDURE * OF ADDING AN ENTRY INTO THE LIST * INVOLVES ONLY THE ALTERATION OF * THE LINKAGE VALUE IN THE NEW ENTRY * AND IN THE ENTRY PRECEDING THE * NEW ONE IN THE PRIORITY CHAIN. * FOR ALL REQUESTS WITH PRIORITIES * ABOVE 40 (LARGER NUMBER), THE REQUEST * IS LINKED ON A FIFO BASIS. FOR ALL * OTHER PRIORITIES (0 - 40) THE * NEW ENTRY IS LINKED ACCORDING * TO ITS PRIORITY AND ON A FIFO * BASIS WITHIN THE SAME PRIORITY * LEVEL. THE END OF A LIST IS MARKED * BY A LINKAGE VALUE OF ZERO. THE * FIRST ENTRY IN A LIST IS SKIPPED * BECAUSE IT IS ASSUMED TO BE THE * REQUESTOR FOR THE CURRENT I/O * OPERATION. IF THE LIST IS EMPTY, * THE LINK WORD IN THE EQT ENTRY * IS SET TO POINT TO THE NEW ENTRY * AND AN INDICATION IS GIVEN TO * THE CALLER OF -LINK- THAT THE * NEW REQUEST MAY BE INITIATED. * * CALL: THE FOLLOWING LOCATIONS MUST BE * SET TO THE INDICATED VALUES * BEFORE THE CALL IS MADE: * * TEMP1 = LOCATION OF NEW REQUEST * TO BE LINKED INTO THE * I/O LIST DEFINED BY THE * CURRENT EQT ENTRY. THE * ADDRESS OF THE LINKAGE * WORD IN THE EQT ENTRY * IS IN -EQT1-. * * TEMP2 = PRIORITY OF THE NEW * REQUEST. * * TEMPL = DISC QUEUE FLAG (# 0 MEANS DISC) * * - JSB LINK * - (RETURN) (E) = 0 IF THE NEW * REQUEST IS THE ONLY ENTRY * IN THE I/O LIST, I.E. THE * DRIVER MAY BE CALLED TO * INITIATE THE NEW OPERATION. * * THERE ARE NO ERROR CONDITIONS * DETECTED OR DIAGNOSED BY THIS * ROUTINE. * * * NOTE: TEMP2 IS SET = 77777B IF REQUEST PRIORITY * IS > 40. SKP LINK NOP LDB C100K FETCH MAX POS NUMBER LDA TEMP2 FETCH PRIORITY OF REQUEST ADA N41 IF PROORITY LESS THAN 40 SSA,RSS USE FIFO STB TEMP2 BY SETTING REQUEST PRIORITY NEGATIVE * LDB EQT1 GET THE HEAD OF THE LIST CLE,RSS SET FIRST FLAG AND SKIP * * FIRST ENTRY IN LIST IS SKIPPED BECAUSE IT * IS THE CALLER FOR THE CURRENT OPERATION * ACTIVE ON THE I/O DEVICE. * ************************************************* **WILL ENTER IN EITHER MAP,BUT THIS IS OK BECAUSE **THE LINK WORD WILL BE IN THE ENABLED MAP AREA** ************************************************* LINK1 SEZ,CCE,RSS IF NOT FIRST SKIP JMP LINK7 GO START THE SCAN * STB TEMP3 TEMP3 = ADDRESS OF CURRENT ENTRY. CCE,INB EXAMINE THE LDA B,I TYPE FIELD IN WORD 2 OF BLOCK INB TO DETERMINE LOCATION RAL OF PRIORITY. SSA IF BUFFERED REQUEST JMP LINK8 B POINTS AT PRIORITY * SLA,RSS IF USER REQUEST JMP LINK5 GO BUMP BY 4 * LDA TEMPL SYSTEM IS IT A DISC SZA,RSS REQUEST ? JMP LINK2 NO USE ZERO PRIORITY * INB,RSS YES USE THE PROVIDED WORD LINK5 ADB .4 IS IN WORD 7 OF ID SEGMENT. LINK8 LDA B,I GET PRIORITY OF CURRENT ENTRY. LINK2 LDB TEMP3 CMA,INA SUBTRACT CURRENT PRIORITY FROM ADA TEMP2 PRIORITY OF NEW REQUEST. SSA IF CURRENT IS LOWER PRIORITY JMP LINK3 (HIGHER #), GO TO LINK NEW. * LINK7 STB TEMP5 SAVE PREVIOUS ENTRY POINTER LDB B,I GET NEXT ENTRY ELB,CLE,ERB CLEAR POSSIBLE SIGN (SAVES E) SZB IF END-OF-LIST, SKIP. JMP LINK1 -CONTINUE SCAN. * * PROPER POSITION (BY PRIORITY) IS FOUND IN LIST, * OR ELSE THE SCAN OF THE LIST IS FINISHED AND * THE NEW REQUEST IS ADDED AS THE LAST ENTRY. * LINK3 LDA TEMP1 SET ADDRESS OF NEW ENTRY IN STB TEMP1,I SET ADDRESS OF NEXT OR 0 IF LAST XOR TEMP5,I KEEP SIGN OF OLD WORD AND C100K IF IT WAS SET XOR TEMP5,I STA TEMP5,I SET THE POINTER TO THE NEW REQUEST * * RETURN A BUSY STATUS (E=1) IF THE ONLY REQUEST ON THE * EQT IS A SYSTEM CLEAR REQUEST. * SEZ,RSS IF SOMETHING ELSE IS IN THE QUEUE, SKIP NEXT LINE ELA IF ONLY REQUEST IS SYSTEM CLEAR, RETURN (E)=1 * JMP LINK,I RETURN * SPC 1 .1 DEC 1 .2 DEC 2 .4 DEC 4 .6 DEC 6 .7 DEC 7 .15 DEC 15 SKP ***************************************************** * JSB DRVMP SET UP DRIVER MAP FROM ORIGINAL CALL * * (E)=0 ENTER DRIVER IN SYSTEM MAP * (E)=1 ENTER DRIVER IN USER MAP * (B)=0 SET PORT MAP WITH SYSTEM MAP * (B)=100000 SET PORT MAP WITH USER MAP ***************************************************** DRVMP NOP CLA STA DVMPS INIT USER MAP SAVE FLAG TO 0 STA MATAD INIT USER MAT ADDR TO 0 STA FLAG INIT DEFAULT MAP AS SYS MAP STA MAP? INIT DEFAULT REBUILD USER MAP JSB CPEQT GET EQT # INTO (A) CCB ADB A CALCULATE INDEX TO ADB $DVMP THE DRIVER MAP TABLE STB DVMP1 ADB EQT# INDEX TO SECOND WORD STB DVMP2 LDB EQT1,I GET DRIVER LINK WORD * **A790220* STB TID SAVE IT AWAY MIGHT BE ID SEG ADDRESS CLE,SSB,RSS BIT15=1 FOR TIME-OUT ON CLEAR REQUEST CLE,SZB,RSS CLEAR (E) FOR SYSTEM MAP JMP DVUSY MAP DRIVER IF IN PTTN * LDA B INA LDA A,I CHECK T FIELD IN CONTROL WORD STA TWORD (SAVE FOR LATER TOO) RAL CLE,SSA T=1 0R 3 IF S=1 JMP DVUSY (E) CLEARED FOR SYSTEM MAP * SLA,RSS JMP DVUSE T=0,GO SET USER MAP * ADB .4 T=2,GET ID WORD IN SYS CALL LDB B,I STB TID SAVE IT AWAY IT IS AN ID SEG ADDRESS. CLE,SZB,RSS IS IT 0 ? JMP DVUSY YES,USE SYSTEM MAP (E)=0 * SSB IS IT SPECIAL $XSIO CALL? JMP DVCUR YES, USE CURRENT USER MAP * * THIS IS AN $XSIO CALL. IF IT IS A LOAD IN, * SWAP IN, OR SWAP OUT THEN THE MAP TO SET * UP IS THE ORIGIONAL VIRGIN MAP. IF THIS * IS A SEGMENT LOAD, THEN WE WANT TO USE THE * MAP AS IS. * * LDA EQT1,I GET THE ADDRESS OF THE $XSIO LINK WORD ADA N2 INDEX TO THE LU WORD. IF THE SIGN BIT LDA A,I IS SET, THEN IT IS A SEGMENT LOAD CALL RAL (LSB=1 MEANS USE CURRENT MAP) ELSE IT STA MAP? IS A LOAD OR SWAP(LSB=0 MEANS VIRGIN MAP) JMP DVUSR NOW GO SEE IF HE IS STILL MAPPED IN. * * DVUSE CCA STA FLAG SET FLAG FOR USER MAP NEEDED STA MAP? SET USER MAP NEW/OLD FLAG * LDA EQT1,I NO, OK GET BUFFER ADDRESS ADA .2 LDA A,I GET USER BUFFER ADR FROM ID TMP WORDS CLE,SSA WAS BUFFER MOVED TO SAM? JMP DVUSY YES,NEED SYSTEM MAP (E)=0 * LDB TWORD GET THE T FIELD WORD RBR GET THE REQUESTR CODE TO MSB & LSB SSB,SLB IF THIS IS A CONTROL RQ THEN GO JMP DVUSR UNBUFFERED & IN USER MAP (THIS STINKS) * LDB TID GET BACK THE ID SEG ADDR. JSB COMN IS THE BUFFER IN COMMON? RSS -NO. JMP DVUSY -YES. ENTER DRIVER UNDER SYSTEM MAP. * DVUSR LDA .32 (A) = REG# OF USER BASE PAGE * **A790220* ^^^ CCB CBX (X) = READ 1 REGISTER LDB DCURU (B) = ADDR OF CURR USER BP SAVE XMM READ REGISTER * LDB TID ADB .14 IS CURRENT USER LDA B,I CORE RESIDENT? AND .15 STA TYP CPA .1 WELL? JMP MEMRS YES GO SET MEM RES MAP * ADB .7 STEP TO THE MAP ADDRESS LDA B,I GET MAPID WORD AND B77 GET PARTITION NUMBER MPY .7 MULTIPLY BY 7 ADA $MATA GET MAT ENTRY ADDR STA MATAD SAVE ADDR FOR $SMAP CALL LATER * ADA .3 IT IS DISC RESIDENT USER LDA A,I GET PAGE# FROM MATA ENTRY AND B1777 STA DVMP2,I SAVE SECOND WORD * LDB MAP? DO WE NEED TO FORCE BUILD MAP? ERB (E)=0 FORCE BUILD (E)=1 REUSE CPA CURUS IS USER ALREADY MAPPED? JMP SAMUS YES, SEE IF WE CAN JUST REUSE IT * ISZ DVMPS NEED TO SET UP USER MAP LDA ASVUI FIRST, SAVE CURRENT USER MAP USA NEWUS LDB MATAD SET UP NEW USER MAP JSB $SMAP SET UP USER MAP (B)=MATA ADDR * DVUDV LDA FLAG USER MAP IS NOW SET UP SLA,RSS WAS IT NEEDED BY $XSIO CALL? JMP DVSYS YES, ENTER IN SYSTEM MAP * LDA DVMP1,I SDA? SSA,RSS JMP MAPDV NO, MAP DRIVER INTO DRIVER PTTN * CLE,SLA SDA DRIVER DOES OWN MAPPING? JMP DVDON YES, OK (E)=0 * CCE (E) = 1 MAY BE JUST BIG DRIVER FOR USER LDA TYP SDA + USER MAP CPA .4 BIG BG TYPE? JMP ERR11 YES, NO SDA IN USER MAP JMP DVDON NO, OK FOR SDA IN USER MAP * SAMUS SEZ SAME USER BP, BUT NEED TO REBUILD MAP? JMP DVUDV NO, REUSE MAP JMP NEWUS YES, DON'T SAVE OLD COPY, REBUILD * * * DRIVER SET UP NEEDING MEMORY RESIDENT MAP * MEMRS LDA $MRMP CPA CURUS MEM.RES.MAP ALREADY SET UP? JMP MEMR2 YES * ISZ DVMPS NO, SO SAVE CURRENT USER MAP LDB ASVUI BEFORE SET UP MEM.RES.MAP USB USA SET UP MEM.RES. IN USER MAP MEMR2 LDA FLAG SLA,RSS WAS IT $XSIO CALL? JMP DVSYS YES, ENTER IN SYS MAP * LDB MSIGN STB DVMP2,I SET WORD 2 = 100000 LDA DVMP1,I SSA,RSS SDA? JMP MAPDV NO, MAP DRIVER INTO DRIVER PTTN * CLE,SLA SDA + SELF-MAPPING? JMP DVDON YES, (E)=0 FOR SDA IN SYS * CCE (E) = 1 BIG DRIVER NEED USER MAP LDA $MRMP MEM.RES. MAP INCLUDE ADA $SDA SDA AND TABLE AREA II? LDA A,I AND B1777 MASK OUT PROTECT BITS CPA $SDA JMP DVDON YES, (E)=1 FOR SDA IN USER MAP * ERR11 JSB $RSM RESTORE USER MAP LDA .11 NEED USER MAP AND SDA DRIVER DOESN'T MAP JMP ILLCD SO GIVE ERROR IO11 * * * * DRIVER SET UP NEEDING SYSTEM MAP * DVCUR CLA,INA $XSIO CALL IN SYS MAP STA MAP? NEEDS USER IN PORT MAP RBL,CLE,ERB (B)= ID SEG ADDR SZB,RSS $CNFG CALLING? JMP DVSYS YES, THERE IS NO ID SEG * ADB .21 LDA B,I GET MAP WORD AND B77 MPY .7 GET MAT ADDR ADA $MATA ADA .3 LDA A,I AND B1777 STA B (B)= PAGE # OF USER BASE PAGE JSB MPUBP MAP IN USER BASE PAGE ADA N32 SET ADDR TO SECOND COPY IN BP ISZ DVMPS LDB ASVUI USB SAVE CURRENT USER MAP USA SET UP MAP FROM SECOND COPY IN BP JMP DVSYS ENTER UNDER SYS MAP * DVUSY CLA USER SWITCHING TO SYS MAP STA FLAG STA MAP? * DVSYS CLA,CLE STA DVMP2,I SET WORD 2 = 0 LDA DVMP1,I SSA SDA? JMP DVDON YES, ENTER IN SYS (E)=0 * MAPDV LDA FLAG MAP DRIVER INTO DRIVER PTTN ERA OF THE APPROPRIATE MAP JSB MPDRV LDB DVMP2,I SEZ ENTER IN SYS MAP? SSB OR USING MEM.RES MAP? JMP DVDON YES, DON'T SAVE USER MAP IN BP * JSB MPUBP MAP IN USER BP IOR MSIGN NO, NEED TO SAVE USER MAP USA IN DISC RES MAP COPY IN BP * DVDON LDB MAP? SZB ANY USER MAP SET UP? LDB MSIGN SET PORT MAP WORD UP JMP DRVMP,I RETURN (E)=0 SYS (E)=1 USER * * * MAP DRIVER INTO THE DRIVER PARTITION AREA * USING CURRENT DRIVER MAP TABLE ENTRY @DVMP1 * CALLING SEQUENCE: * (E) = 0 USE SYSTEM MAP * (E) = 1 USE USER MAP * JSB MPDRV * * (E) = PRESERVED * ALL OTHER REGISTERS MEANINGLESS * MPDRV NOP LDA DVMP1,I GET PAGE # OF DRIVER AND B1777 STA B LDA $DLTH CAX (X) = # PAGES TO MAP LDA $DVPT (A) = PAGE # OF DRIVER PTTN SEZ ARE WE MAPPING FOR USER ? ADA .32 YES, ADD 32 FOR USER REGISTERS XMS MAP IT JMP MPDRV,I RETURN * * * MAP USER'S PHYSICAL BASE PAGE * CALLING SEQUENCE: * (B) = USER BASE PAGE # * JSB MPUBP * * (A) = LOGICAL ADDR OF SAVE AREA IN USER BP IN SYS MAP * (E) = PRESERVED * ALL OTHER REGISTERS MEANINGLESS * MPUBP NOP CLA,INA (B) = PAGE# OF USER BP CAX (X) = 1 REGISTER TO SET UP LDA $DVPT (A) = PAGE # OF DRIVER PTTN XMS MAP USER BP AT DRIVER PTTN AREA LDA DVPTA (A) = LOG ADDR OF USER MAP COPY JMP MPUBP,I RETURN * * * TWORD NOP TFIELD WORD .14 DEC 14 .21 DEC 21 N32 DEC -32 DVPTA NOP LOG ADDR OF USER MAP COPY (INIT SET UP) DVMP1 NOP DVMP2 NOP MATAD NOP FLAG NOP DCURU DEF CURUS CURUS NOP B1777 OCT 1777 *** * TID NOP TYP NOP ASVUI DEF SVUSR,I ADDRESS WITH SIGN SET FOR SAVE ASVUS DEF SVUSR SVUSR BSS 32 DVMPS BSS 1 DRIVER MAP FLAG * ********RESTORE USER MAP TO PRE-****** ********DRIVER STATE****************** * * $RSM NOP CLA CPA DVMPS WAS USER MAP CHANGED JMP $RSM,I NO,RETURN * STA DVMPS YES,CLEAR CHANGE MAP FLAG LDA ASVUS USA RESTORE ORIGINAL USER MAP RSEX JMP $RSM,I ENABLE SYSTEM MAP * * * ************************************** * $DRVM DRIVER MAP SET-UP FOR CONTINUATION * CALLING SEQUENCE: * * SET UP EQT ADDRESSES * JSB $DRVM * --- RETURN WITH (E) INDICATING WHICH MAP * (E)=0 NEEDS SYSTEM MAP * (E)=1 NEEDS USER MAP * ALL OTHER REGISTERS MEANINGLESS * ************************************************ ***********NO EXTERNAL ROUTINE SHOULD CALL ***********$DRVM OR $RSM EXCEPT SPOOL AND POWER-FAIL ************************************************** * * $DRVM NOP JSB CPEQT GET EQT # INTO (A) CCB ADB A ADB $DVMP STB DVMP1 SAVE ADDR DRIVER MAP TABLE WORD 1 ADB EQT# LDA B,I CLE,SZA,RSS IS SECOND WORD = 0? JMP SDDRV YES, SYSTEM MAP NEEDED * STB DVMP2 SAVE ADDR DRIVER MAP TABLE WORD 2 LDA .32 (A) = REG# OF USER BASE PAGE CCB CBX (X) = READ 1 REGISTER LDB DCURU READ INTO 'CURUS' XMM READ MAP REGISTER LDB DVMP2,I GET SECOND WORD CCE,SSB MEM RES PROG? (E)=1 JMP MRPUS YES * CPB CURUS SAME USER ALREADY MAPPED? JMP SDUSE YES, RETURN (E)=1 * ISZ DVMPS NO, DIFFERENT USER LDA ASVUI SAVE CURRENT USER MAP USA JSB MPUBP AND MAP IN USER BASE PAGE USA TO MAP USER WITH COPY OF MAP SDUSE LDA DVMP1,I SSA,RSS SDA? JMP $DRVM,I NO, RETURN * SDADV SLA YES, BUT IS IT SDA+MAPPING? CLE YES, ENTER IN SYS MAP (E)=0 JMP $DRVM,I RETURN (E)=0 SYS (E)=1 USER * * MRPUS LDA CURUS CPA $MRMP,I WAS MEM RES MAP IN USER MAP? JMP SDDRV YES, JUST MAP IN DRIVER * ISZ DVMPS NO, DIFFERENT USER LDB ASVUI SAVE CURRENT USER MAP USB * MRDRV LDA $MRMP SET UP MEM.RES. MAP USA * SDDRV LDA DVMP1,I (E)=0 SYS (E)=1 USER SSA IS DRIVER IN SDA? JMP SDADV YES, SEE IF SELF-MAPPING * JSB MPDRV NO, NEED TO MAP DRIVER IN CORRECT MAP JMP $DRVM,I RETURN (E IS STILL SAME) * SKP * SUBROUTINE: -DRIVR- * * PURPOSE: THIS ROUTINE PROVIDES A CENTRAL POINT * FOR CALLING AN I/O DRIVER TO INITIATE * A NEW OPERATION. THIS ROUTINE, BEFORE * CALLING A DRIVER, SETS THE REQUEST * PARAMETERS INTO THE APPROPRIATE WORDS * IN THE EQT ENTRY CORRESPONDING TO THE * REFERENCED DEVICE AND ASSIGNS A DMA * CHANNEL IF REQUIRED. * IT ALSO SETS THE DEVICE TIME-OUT CLOCK. * * REQUIREMENTS: THE ADDRESSES OF THE EQUIPMENT * TABLE ENTRY (15 WORDS) MUST BE SET * IN EQT1 TO EQT15 BEFORE THE ROUTINE * IS CALLED. * * CALLING SEQUENCE: - PARAMETER SET UP AS ABOVE- * - (REGISTERS MEANINGLESS) - * * (R) JSB DRIVR * (P+1) -OPERATION INITIATED OR STACKED * (P+2) -OPERATION REJECTED OR COMPLETED- * * ERRORS/DIAGNOSTICS: A DRIVER IS CALLED ONLY * IF THE UNIT IS AVAILABLE * AND NOT BUSY; OTHERWISE, * RETURN IS MADE TO THE * CALLER. IF THE DRIVER * FINDS THE UNIT UNAVAILABLE * OR THE REQUEST ILLEGAL FOR * THE UNIT, THE INDICATION IS * RETURNED TO THE CALLER FOR * FURTHER ACTION. * DRIVR NOP LDA EQT5,I CHECK AVAILABILITY RAL OF DEVICE SSA,SLA IF DMA WAIT JMP DVR00 GO DO DMA WAIT THING. * CMA,SSA,SLA,RSS IF DOWN OR BUSY JMP DRIVR,I EXIT * * * DEVICE IS AVAILABLE - CHECK FOR DMA REQUIREMENT * LDA EQT4,I SKIP DMA CHANNEL ASSIGNMENT IF SSA,RSS NOT REQUIRED ( D FIELD = 0 ) JMP DRV02 IN WORD 4 OF EQT ENTRY. SPC 1 * * DMA CHANNEL REQUIRED - ATTEMPT TO ASSIGN CHANNEL * DVR0 LDA DMACF IF DMA QUEUE IS NOT EMPTY B2002 SZA JMP DVR1 THEN JUST ADD THIS EQT TO QUE. * DVR00 LDA .6 INITIALIZE FOR STA CHAN CHANNEL 6 (DMA # 1 ) LDB INTBA ADDR. OF DMA 1 IN INTERRUPT TABLE CLA IF DMA CHANNEL # 1 CPA B,I AVAILABLE (INTBL ENTRY = 0), JMP DRV01 GO TO ASSIGN IT TO THIS UNIT. * INB SET FOR CHANNEL 7, ISZ CHAN DMA CHANNEL # 2. CPA B,I IF THIS CHANNEL AVAILABLE, JMP DRV01 GO TO ASSIGN IT. * * NO CHANNEL AVAILABLE - SET FLAGS AND RETURN * DVR1 LDA EQT5,I IF DEVICE RAL SSA,SLA IS ALREADY WAITING FOR DMA, JMP DRIVR,I EXIT. * RAR IOR B140K SET AVAIL TO SAY WAITING FOR STA EQT5,I DMA, ADD 1 TO ISZ DMACF # DEVICES WAITING. JMP DRIVR,I - EXIT TO CALLER - * DRV03 SEZ,CLE,INB STEP OVER PRIORITY AND INB IF CLASS REQUEST OVER CLASS WORD AND .6 ISOLATE REQUEST (A IS SHIFTED REMEMBER) CPA .6 IF CONTROL REQUEST JMP DRV2 GO SET IT UP * LDA B SET BUFFER ADDRESS ADA .4 IN A (SKIP LENGTH AND TWO OPTION WDS) JMP DRV3 GO FINISH SET UP. * * ASSIGN AVAILABLE CHANNEL * DRV01 LDA EQT1 SET EQT ENTRY ADDRESS IN INTER- STA B,I RUPT TABLE ENTRY FOR CHANNEL. LDB DMACF IF UNIT WAS LDA EQT5,I PREVIOUS WAITING RAL SSA,SLA FOR A DMA ADB N1 CHANNEL, SUBTRACT 1 FROM # OF STB DMACF UNITS WAITING. RAR ALR,RAR CLEAR STA EQT5,I FIELD. * JSB DRVMP GO SET MAP INITIALLY ADB CHAN (B) HAS MAP INDICATOR FOR PORT XMB JMP DV02C CONTINUE * * * TRANSFER REQUEST PARAMETERS TO EQT ENTRY * DRV02 EQU * JSB DRVMP GO SET MAP INITIALLY DV02C ELA SAVE (E) STA MAP? LDA EQT3,I IF HERE ONLY TO GET DMA SSA AT THE REQUEST OF DRIVER, JMP DRV4 SKIP SETTING UP EQT. * LDB EQT1,I GET CURRENT REQUEST ADDRESS INB FROM LINK WORD OF EQT ENTRY. LDA B,I GET REQUEST CONTROL WORD, AND NTSUB SET SUBCHANNEL BITS TO ZERO STA EQT6,I SET IN EQT 6. XOR B,I SET SUBCHANNEL RAL,RAL NUMBER INTO RAL,SLA,RAL BITS 10-6 OF WORD XOR B2002 SET HIGH BIT,CLEAR LOW. STA TEMPL SAVE FOR EQT4 LDA B,I CLE,ELA IF REQUEST IS DRV2 INB SSA HELD AS A TEMPORARY BLOCK FOR JMP DRV03 BUFFERING, JUMP. * AND .6 CPA .6 CCA,RSS THIS IS A CONTROL CALL LDA C100K NOT CONTROL SET TO MASK OUT SIGN * AND B,I * DRV3 STA EQT7,I ADDRESS. INB LDA B,I SET BUFFER STA EQT8,I LENGTH. INB DLD B,I SET ADDITIONAL 2 DST EQT9,I PARAMETERS IF SUPPLIED. * * CALL DRIVER -INITIATION- SECTION * LDA EQT14,I SET DEVICE LDB EQT15,I TIME OUT CLOCK ONLY SZB,RSS IF NOT CURRENTLY RUNNING STA EQT15,I LDA EQT4,I ZERO TIME-OUT AND C7700 BIT AND SET IOR TEMPL IN SUBCHANNEL STA EQT4,I EQT4 IS THUS FULLY CONFIGURED. DRV4 LDA EQT4,I GET THE CHANNEL # AND B77 (I.E., SELECT CODE) IN A. LDB MAP? ERB LDB EQT2,I CALL DRIVER *INITIATION* ELB,CLE,ERB CLEAR SIGN OF I.ENTRY_POINT * (DON'T ALTER E). SEZ ENTER DRIVER IN USER MAP? JMP INUS YES * JSB B,I NO, ENTER IN SYSTEM MAP JMP DRVRT * MAP? NOP * INUS JSB $UIN ENTER IN USER MAP, RETURN TO DRVRT SKP * * DRIVER RETURNS AN INDICATION OF THE ACCEPTANCE * OR REJECTION OF THE REQUESTED OPERATION: * (A) = 0, OPERATION SUCCESSFULLY INITIATED * (A) NOT = 0, OPERATION REJECTED AND (A) * CONTAINS A NUMERIC CODE * IDENTIFYING THE CAUSE OF * THE REJECT, WITH (B)=TRANSMISSION LOG. * * = 1 READ OR WRITE REQUEST ILLEGAL FOR DEVICE * = 2 CONTROL REQUEST ILLEGAL OR NOT DEFINED * = 3 EQUIPMENT MALFUNCTION OR NOT READY * = 4 IMMEDIATE COMPLETION OF OPERATION * = 5 DRIVER REQUIRES DMA BUT FLAG IS NOT SET IN EQT * = 6 INITIATION OK, BUT DRIVER WANTS TO GIVE UP DMA * DRVRT STA TEMP6 SAVE DRIVER CODE. JSB $RSM GO RESTORE USER MAP LDA EQT3,I CLEAR THE ELA,CLE,ERA DRIVER-EXITED-FROM-CONTINUATION- STA EQT3,I SECTION-TO-GET-DMA FLAG. LDA TEMP6 RESTORE DRIVER CODE SZA,RSS IF SUCCESSFULLY INITIATED, JMP DRV00 CONTINUE * CPA .6 ELSE IF THIS WAS NOT A RSS GIVE-UP-DMA RETURN, JMP DRVRJ INVESTIGATE REJECTION * JSB CLDMA ELSE GIVE UP DMA. * * OPERATION INITIATED * DRV00 EQU * CCE SET (E) FOR WHAT FOLLOWS. LDB EQT5,I SET RBL,ERB = 2 TO SAY DEVICE LDA EQT1,I IF NO QUE SZA SKIP BUSY SET STB EQT5,I IN OPERATION. JMP DRIVR,I EXIT. * * OPERATION REJECTED * DRVRJ STB TLOG SAVE (B) CLA CLEAR DEVICE STA EQT15,I TIME-OUT CLOCK JSB CLDMA CLEAR DMA IF ALLOCATED LDA TEMP6 (A) = REJECT CODE. CPA .5 IF DMA REQUIRED JMP DVR0 GO ATTEMPT ASSIGNMENT ISZ DRIVR SET RETURN TO (P+2). CPA .3 IF NOT READY THEN JMP DRIVR,I -EXIT. JMP ILLCD ELSE GO TO SEND THE MESSAGE SPC 1 C7700 OCT 170077 NTSUB OCT 153703 B174K OCT 174000 B20K OCT 20000 HED < I/O MODULE SUBSECTION - SYSTEM REQUEST PROCESSOR > * SYSTEM I/O REQUEST PROCESSOR - $XSIO- * * A PRIVATE ENTRY IS PROVIDED AT ENTRY POINT * < $XSIO> TO ALLOW MODULES OF THE REAL TIME * EXECUTIVE TO CALL FOR I/O OPERATIONS WITHOUT * INCURRING THE OVERHEAD AND PROCEDURES * INVOLVED WITH USER I/O REQUESTS. NO ERROR * CHECKING IS PERFORMED, THE REQUEST IS LINKED * INTO THE APPROPRIATE I/O LIST AT A PRIORITY * LEVEL OF ZERO (HIGHEST PRIORITY), AND CONTROL * IS RETURNED TO THE FIRST WORD FOLLOWING THE * REQUEST CALL. * REQUEST FORMAT: A SYSTEM I/O REQUEST DIFFERS * FROM THE USER I/O REQUEST IN * FORMAT AND POWER. SPECIFICALLY, * A SYSTEM DISC CALL CAN SPECIFY A * SERIES OF TRANSFERS TO BE * PERFORMED BEFORE THE NEXT * OPERATION IS INITIATED. A * COMPLETION ADDRESS CAN BE * SPECIFIED FOR OPERATION OF * AN OPEN SUBROUTINE AT THE * END OF THE OPERATION. THIS * FACILITY IS ONLY AVAILABLE * TO SYSTEM ROUTINES AND IS * USED TO RESET FLAGS, ETC. * BECAUSE AN OPERATION IS * ALWAYS BUFFERED TO THE * SYSTEM. A ZERO COMPLETION * ADDRESS INDICATES ABSENCE * OF A COMPLETION ROUTINE. * WORD * ---- EXT $XSIO * 1 JSB $XSIO * 2 OCT * 3 DEF * 4 NOP * 5 OCT * 6 DEF * 7 DEC OR * 8 OCT <0> OR * OR <100000 IF USE USER MAP UNCHANGED> * * DISC VERSION OF REQUEST: * WORD 6 OF REQUEST POINTS TO AN ARRAY * CONTAINING -N- SETS OF TRIPLETS * DECLARING BUFFER ADDRESS, LENGTH AND * TRACK/SECTOR ADDRESS FOR EACH TRANSFER. * THE SET OF TRIPLETS IS OPEN-ENDED AND * TERMINATED BY A ZERO WORD: * * 1 DEF < BUFFER ADDRESS> * 2 DEC < BUFFER LENGTH > * 3 OCT < TRACK/SECTOR #> * . ETC * . . * N DEC 0 (END OF TRIPLETS) * FOR DISC REQUEST THE 7'TH WORD IS THE REQUEST PRIORITY. * * $XSIO NOP CCB ADB $XSIO,I GET LOGICAL UNIT #. * **A790220* RBL,CLE,ERB STRIP SIGN BIT IF SPECIAL SEG LOAD CALL STB $CKLO SAVE FOR *STADV*. ADB DRT INDEX INTO THE DRT. LDA B,I GET ASSIGNED EQT ENTRY #. STA TEMPL AND SAVE IT JSB $CVEQ CONVERT TO ABSOLUTE EQT ADDRESSES * CLA XSEQ1 IS USED TO SAFEKEEP (EQT1) IF STA XSEQ1 CALLING "LINK" FOR LOCKED EQT LINKING. * LDB $ELTB,I GET EQT. LOCK TABLE HEADER. SSB,RSS IF TABLE IS EMPTY, JMP XSIO3 SKIP CHECK FOR LOCK ON THIS EQT. * ELB,CLE,ERB GET RID OF NOT_EMPTY BIT. STB TEMP1 STORE TABLE LENGTH. CMB,INB THEN STORE 2'S COMPLE STB TEMP3 OF TABLE LENGTH. LDA TEMPL GET SUBCHANNEL/EQT.# WORD. AND B77 ISOLATE EQT.#. STA TEMP5 KEEP IT TO COMPARE AGAINST. LDA $ELTB GET $ELTB TABLE ADDR. ADA .1 GET ADDR OF 1ST EQT. # IN TABLE. XSIO1 LDB A,I GET AN EQT. # FROM TABLE. CPB TEMP5 IF IT MATCHES THIS REQUEST'S EQT. #, JMP XSIO2 SET UP TO HANG REQUEST ON $ELTB ENTRY. * INA BUMP ENTRY ADDR IN $ELTB. ISZ TEMP3 IF TABLE NOT ALL DONE, JMP XSIO1 LOOP BACK. * JMP XSIO3 SKIP: THIS EQT. IS NOT LOCKED. * XSIO2 LDB EQT1 FIRST PRESERVE (EQT1) STB XSEQ1 BEFORE FOOLING "LINK". * ADA TEMP1 COMPUTE ADDR OF LIST OF HUNG $XSIO ADA TEMP1 REQUESTS (WORD 3 OF THIS EQT. #'S STA EQT1 ENTRY) AND PASS IT TO "LINK" IN "EQT1". * XSIO3 LDB $XSIO SET ADDRESS ADB .2 OF LIST POINTER WORD IN STB TEMP1 REQUEST FOR . * LDA TEMPL GET THE SUBCHANNEL WORD AND B174K ISOLATE THE SUB CHANNEL CLE,INB SET ADDRESS OF HIS CON WORD ELA,ALF MOST BIT TO 'E', REST AROUND ELA,SLA,RAL TO BITS 2-5, SKIP IF MOST IS ZERO ADA B20K SET MOST IN BIT 13 IF REQUIRED ADA MSIGN ADD THE 'SYSTEM REQUEST' BIT XOR B,I ADD HIS INFORMATION AND SUBCH =B120074 THROW OUT THE EXCESS XOR B,I SET HIS BITS AGAIN STA B,I PUT THE RESULT BACK IN THE QUE CLA SET PRIORITY OF REQUEST = 0 STA TEMP2 FOR , STA CONFL SET CONTROL FLAG = 0 (REQUEST). STA TEMPL SET DISC FLAG TO ZERO (NON-DISC) LDA EQT5,I GET THE DRIVER TYPE AND B36K MASK TO TEST FOR DISC ADB .4 SET B TO THE RETURN ADDRESS STB $XSIO AND SAVE IT ADB N2 SET B TO DISC PRIORITY WORD LDB B,I GET PRIORITY WORD CPA B14K IF DISC STB TEMP2 SET PRIORITY CPA B14K AND STA TEMPL THE DISC FLAG FOR * JSB LINK CALL TO LINK REQUEST IN I/O LIST. LDA XSEQ1 IF WE MODIFIED (EQT1) FOR SZA EQT. LOCKING, THIS IS THE STA EQT1 TIME TO RESTORE IT. SZA ALSO, IF EQT. IS LOCKED, JMP $XSIO,I DON'T INITIATE THIS $XSIO CALL. * SEZ IF DEVICE IS BUSY JMP $XSIO,I THEN EXIT. * LDA $CKLO ELSE, IF DEVICE IS JSB STADV DOWN, THEN RETURN RSS TO CALLER. * JSB DRIVR CALL DRIVER TO INITIATE OPERATION JMP $XSIO,I -GOOD REQUEST,EXIT * LDB $XSIO BAD NEWS SO TRANSFER THE STB XSIOE RETURN ADDRESS FOR NR ROUTINE * JMP NOTRD PRINT DIAGNOSTIC. SPC 1 XSIOE NOP SUBCH OCT 120074 SUBCHANNEL MASK, (PLUS SYSTEM RQ CODE) XSEQ1 NOP TEMP. STORAGE FOR (EQT1) HED < I/O CONTROL MODULE - COMPLETION SUBSECTION > * * I/O COMPLETION SUBSECTION * * THIS SECTION IS RESPONSIBLE FOR THE INITIATION * OF STACKED I/O OPERATIONS, PLACING A USER * PROGRAM BACK IN A SCHEDULED STATE WHEN ITS * I/O OPERATION IS COMPLETED, DYNAMIC ALLOCATION * OF THE TWO DMA CHANNELS AMONG SYNCHRONOUS * DEVICES, AND CALLING FOR OPERATOR NOTIFICATION * OF EQUIPMENT MALFUNCTION. * * <$CON1> IS ENTERED DIRECTLY FROM INTERRUPT CONTROL * WHEN AN I/O OPERATION IS TERMINATED AND ALL * ERROR RECOVERY PROCEDURES HAVE BEEN ATTEMPTED. * ON ENTRY TO THIS SECTION, (B) CONTAINS THE * NUMBER OF WORDS TRANSFERRED. THE ADDRESSES OF * THE EQUIPMENT TABLE ENTRY ARE SET IN -EQT1- TO * - EQT 15-. * * REQUESTS ARE STACKED IN LISTS FOR EACH DEVICE * ACCORDING TO PRIORITY. THE REQUESTS ARE EITHER * USER (NORMAL), USER (AUTOMATIC OUTPUT BUFFERING) * OR SYSTEM - IDENTIFICATION OF REQUEST TYPE * THE CODE IN BITS 15-14 OF THE * IN EACH REQUEST CALL. THE FORMATS OF THE THREE * TYPES OF REQUESTS AS THEY APPEAR IN THE I/O * LISTS ARE: * * 1) USER (NORMAL OPERATION) * * THE PARAMETERS FROM THE REQUEST ARE STORED * IN THE TEMPORARY AREA OF THE PROGRAM ID * SEGMENT. THE LINK WORD OF THE SEGMENT IS * USED TO LINK INTO THE I/O LIST. * * WORD CONTENTS * ---- -------- * 1 < LINKAGE WORD > * 2 * 3 * 4 * 5 * 6 * 7 * . -REMAINDER OF ID SEGMENT . * * SKP * * 2) USER OR SYSTEM (AUTOMATIC OUTPUT BUFFERING) RT * * REQUESTS OF THIS TYPE ARE CONSTRUCTED * IN THE SECTION OF SYSTEM AVAILABLE MEMORY. * * WORD CONTENTS * ---- -------- * 1 < LINKAGE WORD > * 2 * 3 =0 IF SYSTEM * 4 * 5 * 6 * 7 * 8 * . . . . * . . . . * N+7 * * 3) USER (CLASS INPUT/OUTPUT) * * REQUESTS OF THIS TYPE ARE CONSTRUCTED * IN THE SECTION OF SYSTEM AVAILABLE MEMORY. * * WORD CONTENTS * ---- -------- * 1 < LINKAGE WORD > * 2 * 3 (CHANGED TO STATUS AT COMP.) * 4 * 5 * 6 (CHANGED TO TLOG AT COMP.) * 7 * 8 * 9 * . . . . * . . . . * N+8 * SKP * * 4) SYSTEM REQUEST * * THE SYSTEM REQUEST IS LINKED INTO * THE I/O LIST BY USING WORD 4 OF THE * CALL AS A LINK WORD. A SYSTEM * REQUEST ASSUMES THE PRIORITY LEVEL * OF ZERO (HIGHEST PRIORITY). * * WORD CONTENTS * ---- -------- * 1 < JSB $XSIO > * 2 < LOGICAL UNIT # > * 3 * 4 < LINKAGE WORD > * 5 * 6 * 7 * 8 * * THE FIELD (BITS 15-14 IN CONTROL WORD) * IDENTIFIES THE REQUEST TYPE AS: * * 00 USER (NORMAL OPERATION) * 01 USER OR SYSTEM (AUTOMATIC BUFFERING) RT * 10 SYSTEM * 11 CLASS I/O * * SKP $CON1 RAL,CLE,ERA CLEAR THE SIGN BIT AND SAVE IN E STA TEMP3 SAVE STATUS FROM DRIVER AND STB TLOG TRANSMISSION LOG STB XLOG SAVE TRANSMISSION LOG FOR RETRRN. * JSB $RSM GO RESTORE USER MAP IF NECESSARY * CLA CLEAR STA EQT15,I TIME-OUT CLOCK. * LDA EQT4,I SET THE COMPLETION SECTION FLAG STA CONFL AND TEST FOR DMA RETURN SEZ,RSS SIGN OF A IS EXPLICID RETURN OF SSA DMA CHANNEL, CALL TO JSB CLDMA RELEASE ITS ASSIGNMENT. LDA EQT3,I CLEAR THE ELA,CLE,ERA DRIVER-EXITED-FROM-CONTINUATION- STA EQT3,I SECTION-TO-GET-DMA FLAG. * L.49 LDB EQT1,I GET CONTROL WORD FROM CLE,SZB,RSS IF ILLEGAL ENTRY JMP CIC.4 SEND ERROR MESSAGE * SSB,INB REQUEST BLOCK TO JMP L.502 IF CLEAR COMPLETION GO CLEAN IT UP. STB IOE11 SAVE CONWD FOR *IOERR* USE. * LDA B,I EXTRACT FIELD. STA TEMP0 SAVE CONTROL WORD. LDB EQT1,I STB STMP3 SAVE REQUEST ADDR. FOR ERROR ECHO WORK. LDA TEMP3 IF ERROR, CPA .1 GO PROCESS. JMP NOTRD * LDA B,I UNLINK STA EQT1,I CURRENT I/O LDA TEMP0 REQUEST. RAL,SLA,ELA IF BIT 15 = 1 ( = 2 OR 3) JMP L.53 PROCESS AS SYSTEM REQUEST. * SEZ,RSS IF = 0, PROCESS JMP L.51 AS NORMAL USER REQUEST. * * RELEASE AUTOMATIC BUFFERING BLOCK * LDA TEMP3 IF MALFUNCTION OCCURRED, SZA THEN UNDO THE RELINKING STB EQT1,I AND BY PASS RELEASE OF SZA BUFFER. JMP L.70 STB L.50 * ADB .3 GET TOTAL LDB B,I BLOCK LENGTH AND STB L.50+1 SET IN RELEASE CALL. * JSB $RTN RELEASE BLOCK TO AVAILABLE MEM. L.50 NOP - BLOCK ADDRESS - NOP - BLOCK LENGTH - L.501 JSB $CKLO CHECK IF BELOW THE LIMIT. IF SO, JMP L.54 SCHED ANY WAITERS. START NEXT REQUEST. * L.502 ADB C100K SUBTRACT ONE AND SIGN BIT STB EQT1,I RESET IN THE EQT AND JMP L.55 GO START THE NEXT RQ. SKP * * NORMAL USER OPERATION COMPLETION * L.51 STB L.52 SET CURRENT ADDR. FOR SCHEDULER. ADB .9 SET (B) = ADDR. OF XA IN ID SEG. LDA TEMP3 GET COMPLETION STATUS CLE,SZA SET BIT 14 CCE IN STATUS WORD LDA EQT5,I IF THE STATUS RAL,RAL IS NON-ZERO ERA,CLE,ERA AND SAVE IN USER A-REG. STA B,I CONTENTS OF PROGRAM. INB STB TEMP9 SAVE TRANSMISSION LOG ADDRESS LDA TLOG SET TRANSMISSION LOG AS STA B,I SAVED B-REGISTER. ADB .5 INDEX TO THE STATUS WORD LDA B,I AND SAVE FOR STA TEMPX DISC ERROR ROUTINE * JSB $LIST CALL SCHEDULER MODULE TO PLACE OCT 101 USER PROGRAM INTO L.52 NOP LIST. JMP L.54 * * SYSTEM REQUEST COMPLETION * L.53 STB PTR SAVE THE QUEUE ADDRESS SEZ IF CLASS REQUEST JMP C.01 GO REQUEUE THE REQUEST * ADB N1 GET WORD 3 OF REQUEST LDA B,I . STA COMPL SAVE COMPLETION ADDR. OR ZERO. SKP * * < L.54 > : AT THIS POINT: * 1) A TEMPORARY BUFFER HAS BEEN RELEASED, * 2) A NORMAL OPERATION HAS CAUSED THE * REQUESTING PROGRAM TO BE LINKED * BACK INTO THE LIST, OR * 3) A SYSTEM REQUEST COMPLETION ADDRESS * HAS BEEN SAVED. * L.54 LDA TEMP3 BY PASS INITIATING THE NEXT CMA,SSA,INA,SZA OPERATION IF A MALFUNCTION HAS JMP L.70 OCCURRED ON THIS DEVICE. * * L.55 LDA EQT5,I CHECK FIELD. RAL SSA IF AV SAYS DOWN JMP IOCX GO EXIT * * SECTION <60> PROVIDES FOR INITIATING THE NEXT * OPERATION WAITING FOR THE COMPLETED DEVICE. * L.60 LDA EQT5,I SET ALR,RAR FIELD STA EQT5,I = 0 TO SAY AVAILABLE. JSB CLDVM CLEAR DRVR MAP TABLE WORD 2 JMP L.68 GO START THE NEXT REQUEST * .11 DEC 11 N8 DEC -8 * * CHECK IF BELOW THE BUFFER LIMIT ON THE CURRENT EQT. * $CKLO NOP LDB $BLLO CHECK IF BELOW THE LIMIT. JSB QCHK JMP $CKLO,I NO, SO RETURN. * LDA B YES, SO SCHEDULE ANY WAITERS JSB $SCD3 AND JMP $CKLO,I RETURN. * * * CLEAR WORD 2 OF DRIVER MAP TABLE * SO THAT SPURIOUS INTERRUPTS ENTER DRIVER IN SYTEM MAP. * IF THE LAST DRIVER REQUEST HAPPEN TO HAVE BEEN A NORMAL USER * REQUEST, THAT PROGRAM MIGHT NOT BE IN MEMORY ANY LONGER. * A PARTITION RESIDENT PROGRAM MAY HAVE BEEN REPLACED BY ANOTHER. * CLDVM NOP LDA EQT1 CPA $DMEQ IS THIS COMPLETION OF BIT BUCKET? JMP CLDVM,I YES, IGNORE DRIVER MAP TABLE CLEAR * JSB CPEQT CONVERT EQT1 ADDR TO EQT# CCB SUBTRACT 1 FROM EQT# ADB A WHICH IS IN (A) ADB $DVMP GET ADDR OF WORD 1 ADB EQT# GET ADDR OF WORD 2 CLA OF DRIVER'S MAP TABLE ENTRY STA B,I CLEAR WORD TO FORCE SYS MAP JMP CLDVM,I RETURN SKP * CLASS REQUEST COMPLETION * * CLASS COMPLETION IS HANDLED AS FOLLOWS: * * 1. THE EXCESS BUFFER IS RETURNED ON WRITE COMPLETION * 2. IF THE CLASS QUEUE IS NOT EXPECTING A REQUEST * THE WHOLE BUFFER IS RELEASED AND WE EXIT. * 3. IF A PROGRAM IS WAITING FOR THE REQUEST IT IS * RESCHEDULED. * 4. THE REQUEST IS MODIFIED TO PUT THE STATUS WORD * AND THE TRANSMISSION LOG (TLOG) IN WORDS * 3 (PRIORITY) AND 6 (USER LENGTH WORD) * 5. THE CLASS QUEUE IS UPDATED AND WE EXIT. * * SEE DESCRIPTION OF CLASS QUEUE IN COMMENTS AT BEGINNING * OF SECTION ON USER REQUESTS. * * C.01 LDB PTR GET THE QUEUE ADDRESS INB LDA B,I GET THE CON WORD ADB .2 STEP TO LENGTH WORD STB CLTMP SET LENGTH ADDRESS SLA IF READ JMP C.03 SKIP RETURN * LDA B,I GET BLOCK SIZE TO A. ADB .5 STEP TO RETURN BUFFER ADDRESS ADA N8 SUBTRACT SIZE OF OVERHEAD STA CLRTN SET RETURN SIZE ADA N2 IF LESS THAN TWO WORDS SSA THEN SKIP JMP C.03 THE RETURN * STB CARTN SET THE BUFFER ADDRESS JSB $RTN RETURN THE WRITE BUFFER CARTN NOP BUFFER ADDRESS CLRTN NOP BUFFER LENGTH * LDA CLRTN SET THE CMA,INA NEW BLOCK SIZE ADA CLTMP,I IN THE BLOCK STA CLTMP,I SET THE NEW SIZE * C.03 ISZ CLTMP STEP TO CLASS WORD LDA CLTMP,I GET THE CLASS AND B377 COMPUTE THE ADA DCLAS CLASS HEAD ADDRESS * C.04 LDB A,I GET THE CONTENTS OF CLASS HEAD. * CLE,SSB,RSS IF POSITIVE JMP C.08 GO TRACK DOWN THE QUE. * STA CLASS SAVE THE CLASS QUEUE ADDRESS RBL,CLE,ELB IF PROGRAM WAITING SEZ,CLE,RSS JMP C.05 SKIP,ELSE GO LINK IN THE RQ. * * PROGRAM IS WAITING, CLEAR THE WAIT FLAG * AND RESCHEDULE THE PROGRAM * ERB,RBR CLEAR THE WAIT FLAG STB A,I AND RESET IN THE QUEUE. * JSB $SCD3 SCHEDULE ANY PROGRAMS WAITING C.05 LDB CLASS,I GET CURRENT END OF LIST ADB N1 SUBTRACT ONE PENDING REQUEST STB PTR,I SET IN NEW END OF LIST LDB PTR SET NEW ELEMENT IN STB CLASS,I THE LIST. * ISZ PTR STEP TO ISZ PTR PRIORITY ADDRESS ISZ CLTMP STEP TO BUFFER LENGTH WORD LDA EQT5,I GET CURRENT STATUS ALR,RAL CLEAR DOWN/BUSY BITS. LDB TEMP3 GET COMPLETION STATUS CMB,CLE,INB IF FROM ILCODD * CME IF BAD COM CODE ERA,CLE,RAR SET BIT 14 LDB TLOG GET THE TRANSMISSION LOG. STA PTR,I SET THE STATUS WORD STB CLTMP,I AND THE TLOG * JMP L.501 ELSE STANDARD COM EXIT * C.08 LDA B TRACK DOWN JMP C.04 THE END OF THE LIST SPC 1 * * THIS DEVICE IS COMPETING WITH OTHER DEVICES FOR * THE USE OF THE AVAILABLE DMA CHANNEL. THE * FIELD IN THE CURRENT ENTRY IS SET = 3 TO MEAN * WAITING FOR DMA. THE EQT IS THEN SCANNED FROM * FIRST TO LAST ORDER (#1 TO N) TO FIND THE FIRST * UNIT WAITING FOR DMA. THEREFORE, THE ORDER OF * THE EQT DETERMINES PRIORITY FOR DYNAMIC ASSIGN- * MENT OF DMA CHANNELS - THE SYSTEM DISC SHOULD * BE THE FIRST ENTRY IN THE EQT. * L.63 LDA EQT# SET # OF CMA,INA EQT ENTRIES STA TEMP1 AS AN INDEX VALUE. LDB EQTA INITIALIZE TO FIRST EQT ENTRY. * L.64 STB TEMP2 SAVE CURRENT ENTRY ADDR. ADB .4 EXTRACT LDA B,I FIELD FROM RAL WORD 5. SSA,SLA IF A = 3, GO TO JMP L.66 ASSIGN DMA. * L.65 ADB .11 SET (B) FOR NEXT ENTRY. ISZ TEMP1 END OF EQT? JMP L.64 - NO, CONTINUE SCAN * CCA DECREMENT THE DMA COUNT ADA DMACF (MUST HAVE ABORTED A DMA STA DMACF WAIT WITH 'OF,XXX,1' REQUEST) JMP IOCX EXIT * L.66 CLA,INA IF ONLY 1 DEVICE WAITING CPA DMACF FOR DMA, GO TO JMP L.67 ASSIGN TO THIS DEVICE. * LDA TEMP2 IF CURRENT UNIT IS CPA EQTA FIRST IN EQT (I.E SYSTEM DISC) JMP L.67 ASSIGN ANYWAY. * CPA EQT1 IF SAME DEVICE JUST COMPLETED, JMP L.65 ALLOW OTHER DEVICES DMA TIME. * L.67 LDA TEMP2 IF DEVICE TO BE INITIATED IS CPA EQT1 SAME AS INTERRUPTING DEVICE, RSS SKIP SETTING EQT ADDRESSES. JSB $ETEQ SET EQT ADDRESSES. * LDA EQT1,I IF NO I/O QUEUED ON THIS SZA,RSS DEVICE, THEN GO CLEAN OUT JMP L.60 ITS 'WAITING ON DMA ALLOC.' FLAG. * * CALL IF A REQUEST IS STACKED OR A * WAITING UNIT IS ASSIGNED A DMA CHANNEL. * L.68 LDA EQT1 GO CLEAN OUT ANY CPA $DMEQ I-O REQUESTS IF THIS JMP IOCX7 IS THE BIT BUCKET. * LDB EQT1,I IF NO REQUEST SZB,RSS IS WAITING, THEN JMP IOCX GO EXIT. * JSB DRIVR CALL RSS IF GOOD REQUEST THEN SKIP JMP NOTRD DIAGNOSTIC IF NOT AVAILABLE. SKP * **************************************************************** * * I/O COMPLETION - EXIT SECTION. * * THIS ROUTINE FIRST CHECKS FOR A DMA QUEUE AND IF ANY AND IF A * CHANNEL IS AVAILABLE, THEN THE CHANNEL ASSIGNMENT ROUTINE * IS ENTERED. IF THIS CONDITION DOES NOT EXIST, THEN * IF THE "BIT BUCKET FLAG" IS SET, THEN THE BIT BUCKET * I/O REQUEST ARE CLEANED OUT. IF THE FLAG IS NOT SET, THEN * IF THE REQUEST IS A SYSTEM REQUEST WITH A COMPLETION ADDRESS, * THEN CONTROL IS TRANSFERED TO THE COMPLETION ADDRESS. IF * NEITHER OF THESE CONDITIONS EXITS, THEN THE OPERATOR ATTENTION * FLAG IS CHECKED. IF SET, THEN THE OPERATOR ACKNOWLEDGEMENT * ROUTINE IS ENTERED. IF NOT SET, THEN CONTROL IS RETURNED * TO THE SYSTEM. * ***************************************************************** * IOCX LDA DMACF GET THE DMA QUEUE FLAG SZA,RSS IF EMPTY QUE THEN JMP IOCX1 GO EXIT * DLD INTBA,I ELSE GET THE DMA FLAGS SZA IF ANY SZB,RSS AVAILABLE JMP L.63 GO ALLOCATE IT. * IOCX1 LDB $BITB CHECK THE "BIT BUCKET FLAG" TO SEE SZB TO SEE IF THE BIT BUCKET MUST BE JMP IOCX0 CLEANED OUT. * LDA COMPL IF SYSTEM REQUEST STB COMPL CLEAR COMPLETION SPECIFICATION. LDB XLOG SZA COMPLETION ROUTINE SPECIFIED, JMP A,I OPERATE IT. * LDB OPATN GET OPERATOR ATTENTION FLAG STA OPATN - CLEAR FLAG - SZB IF OPERATOR DESIRES CONTROL, JMP $TYPE ACKNOWLEDGE. JMP $XEQ OTHERWIZE, RETURN TO THE DISPATCHER. * XLOG NOP SKP * * * CLEAN OUT BIT BUCKET REQUESTS. * * IOCX0 LDA $DMEQ SET UP THE BIT JSB $ETEQ BUCKET EQT ADDRESSES. IOCX7 LDB EQT1,I CHECK IF THERE IS ANY SZB,RSS I/O REQUEST TO BE JMP IOCX9 INITIATED ON THE BIT BUCKET. * LDB EQT1,I YES, SO GET THE REQUEST'S ADB .3 SIZE AND DO AN IMMEDIATE LDB B,I COMPLETION. JMP L.136 * IOCX9 STB $BITB NO, SO CLEAR BIT BUCKET FLAG AND JSB $CKLO CHECK BUFFER LIMITS AND SCHED.WAITERS. JMP IOCX1 * $BITB NOP BIT BUCKET FLAG. DO NOT TOUCH. SKP * * * I/O DEVICE COMPLETION ERROR FROM DRIVER * (A) = ERROR CODE * L.70 LDA TEMP3 CPA .3 IF PARITY ERROR, CCE,RSS CHECK FOR DISC. JMP IOERR - OTHER ERROR CONDITION - * LDA EQT5,I IF AND B36K DEVICE CPA B14K IS DISC, PUT JMP DISCE OUT SPECIAL MESSAGE. * LDA .3 PARITY ERROR ON JMP IOERR OTHER DEVICE, PRINT DIAG. * * DISC ERROR PROCESSING (SYSTEM/USER) * DISCE LDA TLOG (A) = ERROR TRACK ADDRESS. JSB $CNV3 CONVERT TO DECIMAL ASCII. LDB A,I FETCH 1ST WORD OF RESULT **780221 GLM** STB DMSG+1 AND SET IT INTO MESSAGE INA ADVANCE TO FINAL TWO WORDS DLD A,I FETCH THEM DST DMSG+2 AND SAVE IN ERROR MESSAGE. JSB CPEQT COMPUTE EQT ENTRY # (SETS E). JSB $CNV1 STA DMSG+6 SET IN ERROR MESSAGE. * LDA EQT4,I GET SUBCHANNEL ALF,ALF AND CONVERT RAL,RAL TO ASCII AND B37 JSB $CNV1 STA DMSG+8 * LDB TEMP0 (B)= REQUEST TYPE LDA BLS (A)= " S" SSB,RSS IF USER TYPE REQUEST, LDA BLU (A)= " U" STA DMSG+9 SET "S" OR "U" IN MESSAGE * LDA EQT1 SAVE DISC STA TEMP7 -EQT- ADDRESS LDA COMPL SAVE REQUEST (SYSTEM) STA TEMP8 COMPLETION ADDRESS LDA DMSGA PRINT DIAGNOSTIC SSB IF SYSTEM REQUEST JMP SYSE WRITE ON LU 1 ONLY * LDB L.52 FETCH THE LOSER'S ID ADDRESS JSB $PSTE POST ERROR TO SCB (IF IN SESSION) JSB $BFOT ECHO ERROR TO SESSION TERMINAL <(A) IS SAVED> * SYSE JSB $YMG SEND "TRNNNN EQTXX,UYY S(OR U)" TO LU 1 * CCB LDA TEMP0 IF DISC ERROR SSA FROM SYSTEM REQUEST, JMP L.71 CONTINUE. * STB TEMP9,I SET TLOG IN ID-SEGMENT FOR ABORT ALF,ALF IF LU # 2 OR 3, AND .3 SET TRACK DOWN SZA,RSS IN TAT- JMP L.71 OTHERWISE, CONTINUE * SLA,RSS CLB,RSS LDB TATSD ADB TLOG INDEX TO ADB TAT TAT, SET ERROR LDA MSIGN TRACK STA B,I "DOWN" (ASSIGNED TO SYSTEM). * LDA L.52 (A)= ID SEGMENT ADDRESS LDB TEMPX GET THE SAVED STATUS AND IF NO-ABORT SET SSB,RSS SKIP THE ABORT JSB $ABRT -- ABORT PROGRAM -- * L.71 STB TLOG SET TLOG FOR SYSTEM EXIT LDA TEMP8 RESET "COMPLETION" STA COMPL ADDRESS. LDA TEMP7 RESET EQT STA CONFL SET FLAG FOR COMPLETION. JSB $ETEQ ADDRESSES JMP L.60 * DMSGA DEF *+1 DEC -20 DMSG ASC 10,TR NNNNN EQTXX UYY S BLS ASC 1, S BLU ASC 1, U HED < I/O CONTROL MODULE - ERROR SECTION > * * I/O REQUEST ERROR SECTION * * PART 1: ERRORS ENCOUNTED IN ANALYSING A * USER REQUEST CAUSE A DIAGNOSTIC * TO BE PRINTED ON THE SYSTEM * TELETYPEWRITER AND THE USER * PROGRAM ABORTED. THE FORMAT OF * THE DIAGNOSTIC IS: * * 'IONN PNAME RADDR' * * AS CONSTRUCTED AND SET * BY THE ROUTINE -$ERMG- IN * THE PROGRAM <$RQST>. -NN- IS A * CODE IDENTIFYING THE ERROR TYPE. * ERR00 CLB,RSS ILLEGAL CLASS NUMBER OR SECURITY CODE ERR01 CLB,INB INSUFFICIENT # OF PARAMETERS RSS ERR02 LDB .2 ILLEGAL LOGICAL UNIT REFERENCE, RSS = 0 OR UNDEFINED. ERR03 LDB .3 ILLEGAL EQT REFERENCE. SELECT CODE = 0 RSS ERR04 LDB .4 USER BUFFER VIOLATES SYSTEM RSS OR OTHER BOUNDARIES. ERR05 LDB .5 ILLEGAL DISC TRACK OR SECTOR RSS ADDRESS IN DISC REQUEST. ERR06 LDB .6 REFERENCE TO PROTECTED DISC TRACK RSS ERR08 LDB .8 DISC TRANSFER EXCEEDS TRACK BOUND RSS ERR09 LDB .9 LOAD-N-GO AREA OVERFLOW RSS ERR10 LDB B400 DOUBLE REQUEST ON SAME CLASS RSS ERR12 LDB B402 REQUESTED LU NOT DEFINED FOR THIS SESSION RSS ERR13 LDB B403 EQT/LU LOCKED AND "NO SUSPEND" BIT SET RSS ERR14 LDB B404 DEVICE DOWN AND "NO SUSPEND" BIT SET RSS ERR26 LDB B1006 REFERENCE TO A SPOOL LU THAT HAS BEEN KILLED * LDA ERIO (A) = ASCII * IO *. JMP $ERAB WRITE DIAGONISTIC AND EXIT TO DISPATCHER * * NOTE: $ERAB ADDS AN ASCII "00" TO THE (A) REG UPON ENTRY. * * ERIO ASC 1,IO B400 OCT 400 B402 OCT 402 B403 OCT 403 B404 OCT 404 B1006 OCT 1006 SKP * PART 2: ILLEGAL REQUEST DETECTED BY * I/O DRIVER. THE REASON IS A READ OR * WRITE OPERATION IS ILLEGAL FOR THE * DEVICE OR A CONTROL REQUEST IS * MEANINGLESS FOR THE DEVICE. * AN ADDITIONAL REASON FOR TRANSFER TO THIS * SECTION IS AN "IMMEDIATE COMPLETION" (CODE 4) * RETURN FROM THE DRIVER; PROCESSED AS A * CONTROL REJECT. * * * ERROR PROCEDURE IS: * 1. IF THE REQUEST IS PROCESSED AS * BUFFERED OUTPUT, THE TEMPORARY * BLOCK IS RELEASED TO AVAILABLE * MEMORY. * * 2. THE REJECT IS IGNORED IF A SYSTEM * PROGRAM GENERATED THE REQUEST - * HOWEVER, A COMPLETION ROUTINE, * IF SPECIFIED IN THE REQUEST, IS * OPERATED. (NOTE: THIS PHILOSOPHY * IS BASED ON THE ASSUMPTION THAT * THIS CONDITION SHOULD NEVER OCCUR.) * * 3. A USER CONTROL REQUEST WHICH IS * REJECTED IS TREATED AS IF IT * WAS PERFORMED. THE PROGRAM IS * LINKED BACK INTO THE SCHEDULE LIST. * * 4. A USER READ OR WRITE REQUEST REJECT * CAUSES A DIAGNOSTIC TO BE ISSUED * AND THE PROGRAM ABORTED. SKP ILLCD CLB CPA .4 IF CODE =4 FOR IMMEDIATE RAR,SLA COMPLETION, TREAT AS CONTROL R00 STB TLOG ELSE SET TLOG TO 0. STA TEMP4 REJECT, SAVE CODE. CPA .2 SET ERROR FLAG FOR CLA CLASS COMPLETION. CMA,INA NEGATE TO AVOID STA TEMP3 REPORT AT L.54. LDB EQT1,I GET LOCATION OF LDA B,I ILLEGAL REQUEST (LINK ADDR.) STA TEMP0 SAVE NEXT REQUEST ADDRESS. INB GET CONTROL WORD LDA B,I OF REQUEST BLOCK STA EQT6,I SAVE FOR REXIT RAL CHECK FIELD SSA,RSS FOR TYPE OF REQUEST BLOCK. JMP R02 -USER OR SYSTEM- * CCE,SLA IF CLASS REQUEST JMP L.49 GO DO CLASS COMPLETION. ADB .2 BUFFERED BLOCK. LDB B,I GET TOTAL BLOCK LENGTH. STB R01B SET IN RELEASE CALL. LDA EQT1,I SET FWA OF BLOCK STA R01A IN RELEASE CALL. JSB $RTN RELEASE BLOCK. R01A NOP - FWA - R01B NOP - # WORDS - JMP REXIT * R02 SLA,RSS CHECK FIELD AGAIN. JMP R03 -USER PROGRAM REQUEST- * ADB N2 GET WORD IN SYSTEM REQUEST LDA B,I CONTAINING -COMPLETION ROUTINE- STA COMPL ADDRESS OR 0 AND SAVE IT. JMP REXIT * R03 LDA TEMP4 USER REQUEST- CPA .2 CONTINUE IF CONTROL REQUEST JMP R04 REJECTED. LDA EQT1,I SET ID SEGMENT ADDRESS OF PROGRAM STA XEQT CONTAINING ERROR. ADA .8 GET POINT OF SUSPENSION ADDRESS LDB A,I GET RETURN ADDRESS STB RQRTN AND SAVE ON BASE PAGE CCE,INA SET XSUSP(SET E FOR $CNV1 STA XSUSP TO POINT TO SAVED INITIAL CALL ADDRESS LDA EQT1 SAVE CURRENT STA TEMP9 EQT ENTRY ADDRESS. LDA CONFL SAVE CURRENT STA SCONF *CONTROL FLAG* LDA TEMP4 CPA .1 CHANGE ANY NOT READY REJECT LDA .7 CODE TO 7. JSB $CNV1 CONVERT TO ASCII AND IOR AS00 FILL LEADING ZEROES LDB A STORE IN B REG. LDA ERIO (A) = ASCII * IO * JSB $ERMG PRINT DIAGNOSTIC AND ABORT PROG CLA SET XEQT STA XEQT TO ZERO TO FOURCE RELOAD LDA SCONF RESTORE STA CONFL *CONTROL FLAG* LDA TEMP9 RESTORE UNIT JSB $ETEQ EQT ENTRY ADDRESSES. JMP REXIT * R04 LDA EQT1,I SET PROGRAM ID SEGMENT STA R05A ADDR. IN LIST CALL. ADA .9 (A) = ADDR. OF XA IN ID SEGMENT. LDB EQT5,I SET DEVICE STATUS STB A,I WORD IN XA. LDB TLOG STORE INA TRANSMISSION LOG STB A,I IN XB. JSB $LIST CALL SCHEDULER OCT 101 TO LINK PROGRAM BACK R05A NOP INTO SCHEDULE LIST. * REXIT LDA TEMP0 SET NEXT LIST STA EQT1,I ENTRY ADDRESS. LDA EQT6,I GET CONWORD CLB CLEAR ERROR STB TEMP3 FLAG. CPB CONFL IF $XSIO CALL SSA,RSS THEN SKIP, JMP L.501 ELSE DO NEXT REQUEST. JMP $XSIO,I $XSIO ERROR RETURN (REQUEST SKIPPED) * * AS00 ASC 1,00 SKP * ********************************************************************** * * I/O DEVICE ERROR SECTION * * THIS SECTION IS ENTERED WHEN A DEVICE IS UNAVAILABLE FOR * INITIATION OF AN OPERATION OR WHEN AN ERROR IS DETECTED AT THE * END OF AN OPERATION. A DIAGNOSTIC MESSAGE IS PRINTED ON THE * SYSTEM CONSOLE IN THE FOLLOWING FORMAT: * * IONM L XXX EYY SZZ QQQ * * WHERE: XXX = THE LOGICAL UNIT NUMBER OF THE DEVICE * YY = THE EQT NUMBER OF THE DEVICE * ZZ = THE SUBCHANNEL NUMBER OF THE DEVICE * QQQ = THE DEVICE STATUS AT THE TIME OF FAILURE * MN = A MNEMONIC DESCRIBING ONE OF THE FOLLOWING CONDITIONS * 1. NR - DEVICE IS NOT READY * 2. ET - END-OF-TAPE OR TAPE SUPPLY LOW ON THE DEVICE * 3. PE - TRANSMISSION PARITY ERROR TO/FROM THE DEVICE * 4. TO - THE DEVICE TIMED OUT * -- NEW CODES MAY BE ADDED HERE -- * * GIVEN A BAD I/O REQUEST, IOERR WILL DOWN ALL LU'S ASSOCIATED WITH * THE DEVICE(DEFINED BY THE EQT AND SUBCHANNEL). ALL I/O CHANNELS * ASSOCIATED WITH THE EQT ARE CLEARED. ALL I/O REQUESTS ASSOCIATED * WITH THE DEVICE ARE UNSTACKED FROM THE EQT'S I/O REQUEST QUEUE AND * RELINKED IN THE LOWEST LU'S(MAJOR LU) I-O REQUEST QUEUE(DRT ENTRY * WORD 2)BY THE SUBROUTINE UNLNK. DRT ENTRY WORD 2 OF OTHER DOWNED * LU'S ARE SET TO THE LU NUMBER OF THE MAJOR LU. THE LU DOWN BIT(BI * 15 OF DRT ENTRY WORD 2)FOR EACH DOWNED LU IS SET. THE EQT ENTRY I * NOT SET DOWN. I/O ERROR MESSAGES ARE ISSUED FOR ALL LU'S SET DOWN * * ON ENTRY, CONTAINS A NUMBER CORRESPONDING TO THE ASSOCIATED * MNEMONIC AND EQT1 CONTAINS THE ADDRESS OF WORD ONE OF THE ASSOCIAT * DEVICE'S EQT ENTRY. * * THE FOLLOWING TEMPORARY LOCATIONS ARE USED FOR TEMPORARY STORAGE B * IOERR: * :=SUBCHANNEL-EQT WORD FOR THE BAD I-O REQUEST GIVING THE * SUBCHANNEL IN BITS 11-15 AND THE EQT IN BITS 0-5(USED BY * LUERR). * :=WORD 2 OF THE BAD I-O REQUEST. * ********************************************************************** * SKP NOTRD LDB EQT1,I LU NOT READY ENTRY. INB GET BAD I-O REQUEST CONWD STB IOE11 AND SAVE FOR LATER. CLA,INA SET A=1 FOR NOT READY. * LDB EQT1,I SAVE CURRENT REQUEST ADDRESS STB STMP3 FOR POSSIBLE ERROR ECHO WORK. IOERR LDB EQT1 REMOVE ALL ENTRIES IN THE QUEUE STB HEAD RELATED TO THE BAD I-O REQUEST. ADA ERTBL INDEX TO ERROR CODE TABLE. LDA A,I GET MNEMONIC AND SET STA IOMSG+1 IN DIAGNOSTIC MESSAGE. JSB CLDVM CLEAR DRIVER MAP TABLE WORD 2 * JSB CPEQT GET EQT NUMBER(SETS E=1). STA TEMP8 SAVE EQT NUMBER. JSB $CNV1 CONVERT TO ASCII STA IOMSG+6 AND SAVE(E MUST = 1). * LDA EQT4,I GET LAST USED SUBCHANNEL ALF,RAL FORM EQT4 AND POSITION AND B174K TO HIGH 5 BITS. IOR TEMP8 ADD IN EQT NUMBER STA TEMP8 AND SAVE AS SUBCHANNEL-EQT WORD. * ALF,RAL GET SUBCHANNEL AND B37 NUMBER. JSB $CNV1 CONVERT TO ASCII(ON ENTRY,E MUST=1) STA IOMSG+8 AND SAVE. * ***780221 GLM*** * LDA EQT5,I FETCH DEVICE STATUS AND B377 ISOLATE IT CLE AND CONVERT IT JSB $CNV3 TO OCTAL INA DLD A,I FETCH RESULT DST IOMSG+9 AND SAVE IN MESSAGE BUFFER * * JSB LUERR DOWN THE LOGICAL UNITS(ENTRY A#0).WAIT UNTIL LDA EQT5,I AFTER LUERR CALL TO SET AVAIL FIELD TO 0 SO ALR,RAR WE WON'T ENTER DRIVER(VIA $XSIO)TO PRINT STA EQT5,I ERROR MESSAGE ON SAME EQT WE'RE DOWNING. * SEZ CHECK IF WE TRIED TO JMP IOER9 DOWN LU 1. IGNORE ATTEMPT. * LDA EQT1 LDB A,I CHECK IF WE MUST SZB INITIATE AN JSB $DLAY I/O REQUEST OF THIS EQT. * LDB IOE11,I GET SAVED WORD 2(CONWORD) LDA CONFL FOR THE BAD I/O REQUEST. SZA IF COMPLETION SECTION IS IN JMP IOCX CONTROL, THEN EXIT IOC. * RBL,SLB IF REQUEST SECTION IN CONTROL, SSB CHECK IF USER OR SYSTEM I/O REQUEST. JMP IOCX IF USER, GO TO EXECUTION SECTION. JMP XSIOE,I IF SYSTEM, RETURN TO SYSTEM CALLER. * IOER9 LDA CONFL SAVE CONTROL STA SCONF FLAG. CLA,INA SET JSB $CNV1 ASC11 1 STA IOMSG+4 INTO MESSAGE. LDA BLKS FETCH 2 BLANKS STA IOMSG+3 AND PAD BUFFER LDA IOMSA FETCH MESSAGE ADDR JSB $YMG ISSUE MESSAGE TO LU 1. LDA SCONF RESTORE FLAG. STA CONFL JMP L.60 * HEAD NOP IOE11 NOP BLKS ASC 1, * * IOMSA DEF *+1 DEC -22 IOMSG ASC 11,IONM L XXX EYY SZZ QQQ * * * * I/O DEVICE ERROR MNEMONIC TABLE--ORDERED BY * ERROR CODE DESCRIBING CONDITION. * ERTBL DEF * ASNR ASC 1,NR - NOT READY - ASC 1,ET - END OF TAPE (INFORMATION) - ASC 1,PE - TRANSMISSION PARITY ERROR - ASC 1,TO - TIMED-OUT - * * NEW CODES MAY BE ADDED AT THIS POINT * SBMSK OCT 20074 * SKP * ***************************************************************** * * SUBROUTINE LUERR * * THIS SUBROUTINE IS USED TO DOWN ALL LU'S CORRESPONDING TO A * SPECIFIC EQT AND SUBCHANNEL. IT WILL OPTIONALLY PRINT AN * ERROR MESSAGE FOR EACH DOWNED LU. * * CALLING SEQUENCE: * :=0 DO NOT PRINT I/O ERROR MESSAGES * :>0 PRINT I/O ERROR MESSAGES(ASSUMES ASCII EQT AND * SUBCHANNEL ALREADY SET) * :<0 PRINT I/O ERROR MESSAGE ON SESSION (MTM) * TERMINAL ONLY (THE DEVICE HAS ALREADY BEEN SET DOWN) * := POINTER TO I-O REQUEST LIST TO SCAN. * :=SUBCHANNEL-EQT WORD FROM THE BAD I-O REQUEST. * JSB LUERR * * RETURN: * :=1 TRIED TO DOWN LU 1 * :=0 DID NOT TRY TO DOWN LU 1 * NO REGISTERS ARE SAVED. * SUBROUTINE UNLNK USES TEMP0 AND OTHERS. * USES THE FOLLOWING REGISTERS: * :=FLAG AS TO WHETHER TO PRINT(#0) OR NOT PRINT(=0) * I/O ERROR MESSAGES. * :=USED TO STORE THE MAJOR LU. * :=COUNTER FOR SCAN THROUGH DRT. * :=USED TO SAVE POINTER INTO DRT. * :=USED TO SAVE EQT1. * :=USED TO STORE LU TEMPORARILY. * ****** ****** UPDATE NEW TEMPS USED 780223 GLM ***** ****** ****************************************************************** * STMP2 NOP STMP3 NOP STMP4 NOP STMP5 NOP * * LUERR NOP STA TMP1 * LDA CONFL SAVE CURRENT STA SCONF CONTROL FLAG. * CLA SET MAJOR LU STA TMP2 TO ZERO. * LDA LUMAX SET CMA,INA UP STA TMP3 COUNTER. LDB DRT GET FIRST DRT ENTRY. * SKP D.00 LDA B,I GET DRT WORD 1 STB TMP4 SAVE POINTER IN DRT. AND C3700 COMPARE DRT WORD 1 TO THE SUBCHANNEL- CPA TEMP8 EQT WORD(LESS THE LOCK FLAG). RSS IF EQUAL,FOUND A LU,SO GO PROCESS. JMP D.04 OTHERWIZE,GO CONTINUE SCAN OF DRT. * LDA LUMAX FOUND A LU MATCH SO PROCESS IT. CCE,INA COMPUTE THE(SET E=1 FOR POSSIBLE LU=1) ADA TMP3 LU NUMBER. STA TMP8 SAVE LU NUMBER FOR LATER. CPA .1 CHECK TO SEE IF SYSTEM CONSOLE. IF SO, JMP D.06 DO NOT SET THE DEVICE DOWN. ADB LUMAX POSITION POINTER TO DRT WORD 2. LDA TMP2 CHECK TO SEE IF A MAJOR SZA LU HAS BEEN FOUND JMP D.02 IF SO,THEN STORE THE MAJOR LU # IN WORD * 2,SET THIS LU BUZY,ISSUE MESSAGE. * STB A SAVE DRT WORD 2 ADDRESS. LDB EQT1 SAVE EQT1 ADDRESS STB TMP6 FOR RESTORATION. LDB TMP1 FETCH CALL FLAG SSB IF DEVICE HAS ALREADY BEEN PUT DOWN * (THIS WAS A REQUEST AGAINST A DOWN * DEVICE) JMP D.001 SKIP THE UNLINK WORK (ALREADY DONE). * LDB HEAD GO UNLINK ANY I-O REQUESTS FROM JSB $UNLK THE GIVEN I-O QUEUE. (A&B PASS PARMS) DEF TEMP8 D.001 LDA TMP8 SAVE THIS LU STA TMP2 AS MAJOR LU. LDB TMP4 RESTORE POINTER TO DRT WORD 2. ADB LUMAX LDA B,I D.02 CCE RAL,ERA SET THE(E MUST=1) STA B,I LU DOWN. LDB TMP1 CHECK IF WE ARE TO PRINT ERROR CCE,SZB,RSS MESSAGES(SET E=1 FOR $CNV1). JMP D.025 NO, SO SKIP. * * PRINT ON BOTH SYSTEM AND SESSION TERMINALS * LDA TMP8 *** ***780223 GLM*** *** JSB $CNV3 CONVERT LU TO INA ASCII, ADVANCE TO LAST TWO DIGITS DLD A,I FETCH THEM DST IOMSG+3 AND SAVE IN ERROR MESSAGE. LDA TMP1 PRINT ONLY ON SESSION TERM? (CALL FROM L.014) SSA YES--CURRENT PROG IS REQUESTOR JMP D.021 SO GO DO IT * LDA IOMSA GET LU I/O ERROR MESSAGE JSB $YMG AND ISSUE TO SYS CON. LDA TMP6 RESTORE JSB $ETEQ EQT POINTERS FOR ECHO WORK * * * * ECHO ERROR TO SESSION TERMINAL * * 1ST DETERMINE REQUEST TYPE AND WHO IS IN * CONTROL (INITIATION OR COMPLETION SECTION). * * * * LDA STMP3 FETCH CONTROL INA WORD OF THE LDA A,I BAD REQUEST AND AND B140K (B140000) ISOLATE FIELD. LDB SCONF FETCH SAVED CONTROL FLAG SZB INITIATION OR COMPLETION SECTION????? JMP COMP1 --COMPLETION SECTION IS IN CONTROL * * * REQUEST SECTION IS IN CONTROL * ECHO ALL BUT SYSTEM REQUESTS ( FIELD = 10 ) * CPA MSIGN SYSTEM REQUEST? JMP D.025 YES -- CONTINUE * D.021 LDB XEQT USER REQUEST AND THE CURRENT PROG IS THE LOSER STB STMP3 SAVE IN LOCAL TEMP JMP SCAN GO CHECK FOR SESSION * * * COMPLETION SECTION IS IN CONTROL * * ONLY ECHO IF REQUEST WAS NORMAL USER REQUEST ( FIELD =0 ) * COMP1 SZA NORMAL REQUEST ? JMP D.025 NOPE -- SKIP ECHO * LDB STMP3 NORMAL USER REQUEST-- FETCH ID ADDRESS * * * * OK TO ECHO -- NOW GO FIND OUT WHERE THE ECHO IS TO GO. * * (GO FIND SYSTEM LU FOR SESSION LU 1, OR MTM LU) * SCAN JSB $LU?? NOTE: (B) = PROG ID ADDRESS JMP D.025 NOT SESSION OR MTM\ OR LU 1 NOT DEFINED FOR SESSION ADA DRT SAVE RTN STATUS IN ENT (B<0=-MTM LU) A=SYSTEM LU (LU LDA A,I ADVANCE TO DRT ENTRY AND FETCH IT AND C3700 COMPARE EQT & SC (LESS LOCK FLAG) CPA TEMP8 WITH CURRENT LU TO BE PUT DOWN JMP D.025 IF SAME , REJECT ECHO. * * * IF MTM, JUST ECHO (UNLESS MTM LU = 1) (B)=TYPE * SSB,RSS SEE IF PROG IS SESSION OR MTM JMP ITSES IT'S SESSION--GO CHECK FOR POSSIBLE LU SWITCH * CPB N1 DON'T ECHO IF MTM LU = 1 JMP D.025 IT'S A ONE SO CONTINUE * LDB STMP3 FETCH PROG'S ID ADDRESS LDA IOMSA FETCH MESSAGE BUFFER ADDR JSB $BFOT GO ECHO JMP D.024 AND THEN CONTINUE ERROR PROCESSING * * * (A) = SESSION WORD. LU?? MAPPED IN THE TABLE PARTITION (IF DEFINED). * * FOR EVERY MATCH (SYS LU IN SST WITH LU BEING PUT DOWN), PLACE THE * ASSOIATED SESSION LU INTO THE ERROR MESSAGE AND ECHO TO SESSION * TERMINAL. * * NOTE THAT AN * (ASTERISK) IS INSERTED BEFORE THE LU TO INDICATE * THAT THE LU IS THE SESSION RELATED LU. * * ITSES LDA B,I FETCH SST LENGTH STA STMP4 SAVE FOR SCAN INB ADVANCE TO FIRST ENTRY ADDRESS STB STMP5 SAVE FOR SCAN * SSTLK LDA STMP5,I FETCH SST ENTRY ALF,ALF SHIFT AND AND B377 ISOLATE SYSTEM LU INA ADJUST FOR INTERNAL STRUCTURE (LU-1) CPA TMP8 SAME AS CURRENT DOWNER?? CCE,RSS YEP -- GO MODIFY ERROR MESSAGE JMP SSNXT NOPE -- CONTINUE SCAN * LDA STMP5,I FETCH SESSION LU AND B377 ISOLATE AND ADJUST INA FOR INTERNAL DATA STRUCTURE JSB $CNV3 CONVERT TO ASCII ( E SET ABOVE FOR DECIMAL) INA ADVANCE TO LAST TWO DIGITS DLD A,I FETCH ASCII LU IOR B25K (B25000) INCLUDE SESSION INDICATOR "*" DST IOMSG+3 SAVE IN ERROR DIAGNOSTIC LDB STMP3 FETCH PROG'S ID ADDRESS LDA IOMSA FETCH MESSAGE BUFFER ADDRESS JSB $PSTE POST ERROR TO SCB JSB $BFOT ECHO MESSAGE TO SESSION TERMINAL SEZ IF REQUEST REJECTED (DOWN, NO SAM ,OR WHATEVER) JMP D.024 ABORT ECHO REQUEST * SSNXT ISZ STMP5 BUMP SST ADDRESS ISZ STMP4 BUMP COUNT, DONE? JMP SSTLK NOPE, CONTINUE SCAN OF SST * D.024 LDA TMP6 SET EQT BACK UP JSB $ETEQ IN CASE ECHO WAS PERFORMED * D.025 LDB TMP4 * D.04 INB INCREMENT POINTER TO NEXT DRT ENTRY. ISZ TMP3 JMP D.00 GO SCAN NEXT ENTRY. * JSB $CKLO CHECK BUFFER LIMITS AND SCHED WAITERS. CLE D.06 LDA SCONF RESTORE CONTROL STA CONFL FLAG. JMP LUERR,I IF NO MORE LU ENTRIES, RETURN. * B25K OCT 25000 * SKP * *********************************************************************** * * SUBROUTINE $UNLK * * THIS SUBROUTINE IS USED TO UNLINK I/O REQUESTS FROM THE EQT I/O * REQUEST QUEUE POINTED TO BY EQT1. IT MAY BE USED IN ONE OF TWO * MODES: * MODE I. IF ON ENTRY THE A REGISTER EQUALS ZERO, NORMAL USER * (UNBUFFERED)I-O REQUESTS ARE UNLINKED WITH THE CALLING * PROGRAMS SUSPENDED IN THE GENERAL WAIT LIST. IT IS * ASSUMED THAT THE EQT WILL BE SET DOWN BY THE CALLER. * MODE II. IF ON ENTRY THE A REGISTER IS NONZERO, THEN ONLY I/O * REQUESTS MATCHING THE SUBCHANNEL GIVEN IN SUEQT ARE * UNLINKED. UNBUFFERED I/O REQUESTS ON THIS SUBCHANNEL AR * HANDLED AS IN MODE I. BUFFERED, CLASS AND SYSTEM * I/O REQUESTS ARE STACKED UPON AN LU I/O REQUEST QUEUE AF * THE I/O REQUEST POINTED TO BY THE A REGISTER IN THE ORDE * THAT THEY APPEARED IN THE EQT QUEUE. * * CALLING SEQUENCE: * :=THE SUBCHANNEL-EQT WORD DEFINING THE DEVICE(MODE II * ONLY, UNUSED WITH MODE I). * :=EQT1(HEAD OF THE I-O REQUEST QUEUE)OF THE DEVICE'S * EQT(USED WITH MODE I AND II). * :=0 INDICATES MODE I PROCESSING. * :#0 INDICATES MODE II PROCESSING. POSITION IN LU I/O REQ * QUEUE AFTER WHICH ALL UNLINKED I-O REQUESTS ARE * TO BE RELINKED. * JSB $UNLK * DEF SUEQT * * RETURN: * NO REGISTERS ARE SAVED. * USES UNLK3,UNLK8,TEMPX,TEMP0 * ************************************************************************ SKP $UNLK NOP STB TMP5 SAVE EQT ADDRESS STA UNLK8 SET UP POINTER TO THIS I/O REQUEST QUEUE. LDA $UNLK,I LDA A,I AND B174K GET SUBCHANNEL CLE,ELA AND SHIFT RAL,RAL UPPER BIT ALF TO BIT 13 SEZ ADD IN LOWER 4 BITS ADA B20K AT BITS 2-5 STA TEMP0 AND SAVE. RSS * UNLK0 LDB TEMPX,I GET NEXT ENTRY. UNLK1 STB TEMPX SAVE POINTER TO PREVIOUS REQUEST. UNLK2 LDB TEMPX,I GET POINTER TO THIS REQUEST. RBL,CLE,ERB STRIP OFF POSSIBLE SIGN BIT. SZB,RSS IF END, JMP UNLK6 THEN GO EXIT. * STB UNLK3 SAVE POINTER TO THIS REQUEST. INB STEP TO CONTROL WORD OF THIS REQUEST. LDA UNLK8 CHECK IF MODE I OR II PROCESSING. SZA,RSS JMP UNL25 MODE I SO SKIP SUBCHANNEL CHECK. LDA B,I GET CONTROL WORD OF THIS REQUEST. AND SBMSK PICK OFF SUBCHANNEL INFORMATION AND CPA TEMP0 COMPARE TO THE SUBCHANNEL INFO OF RSS THE BAD I/O REQUEST. IF NOT EQUAL, JMP UNLK0 GO CHECK THE NEXT I/O REQUEST. * UNL25 LDA B,I GET CONTROL WORD OF THIS I/O RAL REQUEST AND ROTATE IT. CMA,SSA,SLA,RSS IF NOT STANDARD USER REQUEST, JMP UNLK4 GO PROCESS AS OTHER TYPES. * * STANDARD USER REQUEST LDA UNLK3,I UNLINK THIS STA TEMPX,I I/O REQUEST LDA UNLK3 POINT A AT THE REQUEST'S ID SEGMENT JSB NSBIT IS THE "NO SUSPEND" BIT SET ? JMP UNLK5 YES, SCHEDULE WITH IO14 ERROR LDA .4 NO, SO SUSPEND THE PROGRAM STA B,I IN GENERAL WAIT LIST. LDA TMP5 SET ID TMP WD #1 TO 4. CMA,INA NEGATE EQT ADDR INB TO SAVE IN TEMP WD #2 OF ID SEGEMENT STA B,I BECAUSE WE DON'T KNOW LU# 2 ADB .7 ADVANCE TO SAVE A REG LOCATION. LDA B,I FETCH SAVED ADB N1 POINT OF SUSPENSION, AND STORE STA B,I IT IN XSUSP FOR THIS PROGRAM. JSB $LIST LINK THIS PROGRAM INTO THE OCT 103 GENERAL WAIT LIST. UNLK3 NOP JMP UNLK2 GO TRY NEXT ENTRY. * UNLK5 ADB .7 POINT AT POINT OF SUSPENSION. CCA BACK IT UP -1 FOR ADA B,I THE ERROR RETURN POINT STA B,I FOR IO14 ERROR MESSAGE. INB POINT AT SAVED AREG LDA ERIO TO INSERT THE STA B,I ASCII "IO". INB POINT AT SAVED BREG LDA A14 TO INSERT THE STA B,I ASCII "14". LDB UNLK3 POINT AT THE ID SEGMENT JSB $LIST AND GO SCHEDULE THE PROGRAM. OCT 401 JMP UNLK2 GO LOOK AT NEXT ENTRY. * UNLK4 LDA UNLK8 CHECK IF MODE I OR II. SZA,RSS IF MODE I, DO NOT UNLINK JMP UNLK0 THIS REQUEST. GO TRY NEXT ONE. LDB UNLK8,I IF MODE II, CLEAR RBL,CLE,ERB POSSIBLE SIGN BIT LDA UNLK3,I AND LINK THIS I-O STA TEMPX,I STB UNLK3,I REQUEST TO THE LDB UNLK3 END OF THE DOWN STB UNLK8,I I/O REQUEST QUEUE. STB UNLK8 SET UNLK8 TO POINT TO THE LAST REQUEST. JMP UNLK2 GO TRY NEXT ENTRY. * UNLK6 ISZ $UNLK JMP $UNLK,I RETURN * * UNLK8 NOP TEMPX NOP * TMP1 NOP TMP2 NOP TMP3 NOP TMP4 NOP TMP5 NOP TMP6 NOP * TMP8 NOP A14 ASC 1,14 SKP * ****************************************************************** * * SUBROUTINE $DLAY: * * $DLAY IS USED TO SET UP A SHORT TIMEOUT(10 MSEC)WHICH, WHEN IT * OCCURS, SIGNALS THAT AN I/O OPERATION MUST BE INITIATED ON THE * TIMED-OUT EQT(SEE $DEVT). * * CALLING SEQUENCE: * LDA * JSB $DLAY * * RETURN: * ALL REGISTERS ARE MODIFIED. * ***************************************************************** * $DLAY NOP CCE,INA SET THE SIGN BIT LDB A,I ON TO INDICATE RBL,ERB WE MUST INITIATE AN STB A,I OPERATION. ADA .3 CCE LDB A,I SET THE RBL,ERB EQT STB A,I BUZY. ADA .10 LDB N1 SET A STB A,I TIMEOUT JMP $DLAY,I OF 10 MSEC. HED < IO-DEVICE TIME-OUT PROCESSOR > * * * AFTER A DEVICE IS DISCOVERED TO HAVE TIMED-OUT * BY RTIME'S $CLCK PROCESSOR,THIS * ROUTINE IS ENTERED. ITS PURPOSE IS TO * CLEAR THE PENDING IO TRANSFER AND ENTER * $CON1 IN SUCH A WAY AS TO SIMULATE AN IO * COMPLETION RETURN FROM THE DRIVER ITSELF. * * IF THE TIMEOUT WAS DUE TO THE NEED TO INITIATE AN * I/O OPERATION(BIT 15 EQT2 SET)THEN THIS BIT * IS CLEARED AND $CON1 IS ENTERED(AT L.60) TO * INITIATE THE I/O OPERATION. * * * ENTER FROM SCHEDULER MODULE: * * (A)
* * $DEVT ADA N14 POINT TO EQT JSB $ETEQ SET EQT ADDRESSES LDA EQT1,I GET THE CLEAR BIT SSA IF CLEAR TIME OUT JMP CLTIM JUST CLEAR * LDA EQT2,I CHECK IF THE TIMEOUT SSA IS FOR INITIATING I/O JMP INTDL ON THIS EQT. * LDA EQT4,I IOR B4K SET TIME-OUT BIT STA EQT4,I STA B SAVE WORD IN B FOR TEST AND B77 SELECT CODE TO A STA INTCD BLF,SLB IF DRIVER TO HANDLE TIME JMP CIC.6 OUT GO CALL THE DRIVER. * CLTIM JSB CLCHS CLEAR ALL CHANNELS LDA .4 SERVICED BY THIS ENTRY CLB SIMULATE COMPLETION JMP $CON1 RETURN FROM DRIVER * INTDL RAL,CLE,ERA CLEAR INITIATION STA EQT2,I BIT. ISZ CONFL SET CONTROL FLAG TO NONZERO. JMP L.60 GO INITIATE. * N14 DEC -14 HED < I/O CONTROL MODULE - DATA SECTION > * ***************************************************************** * * CONSTANT AND VARIABLE STORAGE AREA * ******************************************************************* * A EQU 0 DEFINE SYMBOLIC REFERENCES B EQU 1 FOR A AND B REGISTERS. .3 DEC 3 .5 DEC 5 .8 DEC 8 .9 DEC 9 .10 DEC 10 N1 DEC -1 * B77 OCT 77 B377 OCT 377 B140K OCT 140000 B40K OCT 40000 B4K OCT 4000 MSIGN OCT 100000 * TEMP2 NOP TEMP3 NOP TEMP4 NOP TEMP5 NOP TEMP6 NOP TEMP7 NOP TEMP8 NOP TEMP9 NOP TEMP0 NOP TEMPL NOP TEMPW NOP * CONFL NOP SCONF NOP TLOG NOP COMPL NOP DO NOT USE FOR INIT CODE(MUST=0 BEGIN). DMACF NOP FLAGS USED IN ALLOCATING HED ** I/O CONTROL - OPERATOR COMMUNICATION ** * ***************************************************************** * * I/O MODULE // OPERATOR COMMUNICATION * * * THE SYSTEM USES COMMANDS FROM THE * OPERATOR TO CONTROL THE OVERALL STATUS OF * I/O EQUIPMENT, CHANGE ASSIGNMENT OF LOGICAL * UNITS AND TO INTERROGATE THE STATUS AND * PROPERITES OF THE DEVICES IN THE EQUIPMENT * TABLE. * * OPERATOR STATEMENTS ARE PROCESSED ONLY * FROM THE DESIGNATED SYSTEM TELETYPE. THE * ROUTINE IN THE SCHEDULING MODULE * IS RESPONSIBLE FOR STATEMENT DECODE AND * PARAMETER SEPARATION AND CONVERSION. THE * ASSOCIATED STATEMENT PROCESSOR IS CALLED * TO PERFORM THE REQUESTED ACTION. THE * STATEMENT PROCESSING IS ALL TABLE-DRIVEN * AS DESCRIBED IN THE LISTING AND DOCUMENTATION * OF THE SCHEDULING MODULE. * * * TWO OF THE I-O CONTROL STATEMENT PROCESSORS * MUST BE INCLUDED IN THE BASIC SYSTEM PACKAGE * AND ARE INCLUDED IN RTIOC. * THESE ARE THE 'UP' AND 'DOWN' STATEMENTS * CONCERNING THE OVERALL STATUS OF I/O DEVICES. * THE OTHER THREE STATEMENT PROCESSORS ( LOGICAL * UNIT ASSIGNMENT, TIME-OUT, AND EQT STATUS) * ARE OPTIONAL AND ARE CONTAINED IN THE USER PROGRAM * $$$CMD WHICH IS SCHEDULED BY SCHED. THESE COMMANDS * MAY BE REMOVED BY DELETING $$CMD. * ****************************************************************** * SKP * **************************************************************** * * 'DOWN' STATEMENT (REQUIRED) * * FORMAT: DN,N1 OR DN,,N2 * WHERE N1 IS THE EQT # OF THE I/O SLOT TO BE SET DOWN * OR N2 IS THE LU # OF THE I/O DEVICE TO BE SET DOWN. * * ACTION: WHEN SETTING THE EQT DOWN, THE AVAILABILITY FIELD OF THE * REFERENCED SLOT IS SET = 1(SLOT DISABLED). * WHEN SETTING THE LU DOWN, BIT 15 OF DRT WORD 2 IS SET AND * ANY I/O FOR THIS DEVICE IS REMOVED FROM THE EQT I/O * QUEUE AND ADDED TO THE LU I/O QUEUE HEADED AT DRT * WORD 2. * * CALL (FROM MESSAGE PROCESSOR): * * := N1 (EQT #) IN BINARY OR 0 * :=-1 OR N2 (LU #) IN BINARY * JMP $IODN * * RETURN IS TO <$XEQ> IF ACTION TAKEN OR TO -MESS.I- TO PRINT * * INPUT ERROR * IF N1 OR N2 ARE ILLEGAL OR IF BOTH ARE PRESENT. * **************************************************************** * $IODN SZA,RSS CHECK IF DOWN LU OR JMP DNLU DOWN EQT COMMAND. * INB,SZB DOWN EQT COMMAND. IF BOTH LU AND EQT ARE JMP $INER GIVEN, ISSUE INPUT ERROR MESSAGE. * JSB IODNS CHECK LEGALITY OF EQT & SET EQT ADDRESSES. LDA EQT1 IF ATTEMPT TO DOWN EQT OF SYSTEM CPA SYSTY CONSOLE, ISSUE INPUT ERROR MESSAGE. JMP $INER LDA EQT5,I SET AVAILABITY FIELD ALR,RAR TO 1 IOR B40K TO SET STA EQT5,I DOWN. * JSB XUPIO SET ANY DOWNED LU'S UP. * LDB EQT1,I GO PUT ALL WAITERS(UNBUFFERED RBL,CLE,ERB I/O)INTO THE BENERAL WAIT SZB,RSS LDB EQT1 CLA LIST. SKIP FIRST REQUEST. JSB $UNLK DEF A (DUMMY DEF FOR THIS MODE). JMP $XEQ RETURN. * DNLU STB A SAVE LU NUMBER. CMB,CLE,INB,SZB,RSS ISSUE AN ERROR MESAGE JMP $INER IF THE LU IS LESS THEN ADB LUMAX 1 OR IS GREATER THEN CCB,SEZ,RSS LUMAX. JMP $INER * ADB A USE LU NUMBER ADB DRT TO POSITION TO LDA B,I WORD 1 OF THE AND C3700 DRT ENTRY. STA TEMP8 SET UP SUBCHANNEL-EQT WORD. AND B77 INPUT SZA,RSS ERROR IF JMP $INER DOWNING BIT BUCKET DEVICE. * STB TEMP9 SAVE ADDRESS OF DRT WORD 1. JSB $CVEQ SET EQT ENTRY ADD(WILL MASK SUBCH.). * LDB EQT5,I CHECK IF RBL,SLB EQT IS JMP DNLU5 UP OR IS SSB DOWN. JMP DNLU9 EQT IS DOWN. * DNLU5 LDB EQT1,I SKIP FIRST EQT I-O REQUEST QUEUE SZB,RSS ENTRY UNLESS THE QUEUE IS EMPTY. LDB EQT1 STB HEAD SAVE THIS POINTER. CLA SET FOR NO ERROR MESSAGES. JSB LUERR GO DOWN ALL LU'S POINTING TO DEVICE. SEZ ERROR IF ATTEMPT JMP $INER TO DOWN LU 1. JMP $XEQ NO, RETURN TO SYSTEM. * DNLU9 LDB TEMP9 IF EQT IS DOWN, THEN ADB LUMAX GET DRT WORD 2 LDA B,I AND SET THE LU IOR MSIGN DOWN. STA B,I JMP $XEQ RETURN. * C3700 OCT 174077 * * *IODNS* SUBROUTINE TO CHECK LEGALITY OF AN * EQT # (IN A-REGISTER) AND TO CALL * A SUBROUTINE TO CONSTRUCT THE EQT * ENTRY ADDRESSES. * IODNS HLT 2 HLT FOR INIT CODE STA B ERROR CMB,INB,SZB IF EQT NO. IS ZERO SSA OR NEGATIVE CCB,RSS SKIP ADB EQT# CHECK FOR LIMITS SSB IF ANY ERROR, JMP $INER GO TO $MESS ERROR EXIT. JSB $CVEQ SET EQT ENTRY ADDRESSES. STB CONFL SET ALL THE FLAGS TO ZERO. JMP IODNS,I SKP * **************************************************************** * * ' UP ' STATEMENT (REQUIRED) * * FORMAT: UP,NN WHERE NN IS THE EQT # * OF THE I/O DEVICE * * ACTION: THE AVAILABILITY FIELD OF THE REFERENCED SLOT(EQT ENTRY * #)IS SET = 0 (UNIT AVAILABLE). THE AVAILABILITY FIELD OF * ANY DEVICES(BIT 15 DRT WORD 2) REFERENCING THIS EQT ARE * SET = 0 AND THE LU'S' I/O QUEUES ARE ADDED TO THE EQT'S * I/O QUEUE. IF THE EQT WAS AVAILABLE OR DOWN, THEN THE * *$CON1* SECTION(AT *L.68*)IS ENTERED TO INITIATE ANY * WAITING I/O REQUESTS. * * CALL (FROM MESSAGE PROCESSOR): * * := NN (EQT #) IN BINARY * JMP $IOUP * * RETURN IS MADE TO *$CON1* OR TO *$XEQ* IF ANY ACTION * IS TAKEN. IF NN IS ILLEGAL, THEN RETURN IS MADE TO * *MESS,I* TO PRINT 'INPUT ERROR'. * ****************************************************************** * $IOUP JSB IODNS CHECK 'NN' AND SET EQT QDDRESSES. $UP EQU * JSB $RSM GO RESTORE USER MAP IN CASE DRIVER CALL JSB CPEQT GET EQT # STA TMP1 FROM EQT1. LDA .4 RESCHEDULE ALL WAITING PGMS. JSB $SCD3 (RETURN B=0). LDA EQT5,I GET AVAILABILITY. SSA,RSS IF DOWN OR AVAILABLE, JSB CLDMA HELP OUT POWER FAIL WITH DMA. * JSB XUPIO SET ANY ASSOCIATED LU'S UP. * LDA EQT5,I GET AVAILABILITY ISZ CONFL SET THE CONTROL FLAG SSA,RSS IF DOWN OR AVAIL. JMP L.60 GO TRY TO OPERATE JMP $XEQ ELSE JUST FORGIT IT. SKP * ************************************************************************ * * SUBROUTINE XUPIO: * * XUPIO IS USED TO UP ANY LU'S ASSOCIATED WITH THIS EQT. * * CALLING SEQUENCE: * :=THE ADDRESS OF THE FIRST WORD OF THIS EQT. * :=THE EQT NUMBER. * JSB XUPIO * * RETURN: * ALL REGISTERS ARE DISTROYED. * USES TMP2,TMP4,TMP6. * CALLS SUBROUTINE XXUP. * ************************************************************************ * XUPIO NOP LDA LUMAX SET CMA,INA UP STA TMP2 COUNTER. LDB DRT POSITION TO FIRST STB TMP6 DRT ENTRY. * UPIO1 LDA TMP6,I CHECK IF THIS AND B77 DRT ENTRY POINTS CPA TMP1 TO THE EQT. JMP UPIO5 YES. UPIO3 ISZ TMP6 NO. SO ISZ TMP2 GO CHECK JMP UPIO1 NEXT DRT ENTRY. JMP XUPIO,I RETURN. * UPIO5 LDB TMP6 POSITION TO DRT ADB LUMAX WORD2. STB TMP4 GO PLACE LDB B,I ENTRIES LDA EQT1 INTO EQT JSB $XXUP I/O QUEUE(RETURN B=0). STB TMP4,I SET THE LU 'UP'. JMP UPIO3 GO CHECK NEXT DRT ENTRY. SKP **************************************************************** * * SUBROUTINE $XXUP: * * $XXUP TAKES AN I/O QUEUE AND(USING LINK)POSITIONS THE I/O * REQUESTS IN THE CURRENT EQT QUEUE ACCORDING TO THEIR PRIORITY. * IT RETURNS A FLAG IF AN I/O OPERATION SHOULD BE INITIATED. * * CALLING SEQUENCE: * := EQT1 OF OLD DEVICE. * :=ADDRESS OF FIRST STACKED I/O REQUESTS TO BE LINKED ON * THE CURRENT EQT(SIGN BIT WILL BE STRIPPED). * JSB $XXUP * * RETURN: * :=0 * :#0 A NEW I/O OPERATION IS AT THE HEAD OF THE CURRENT * EQT I/O QUEUE SO IT MUST BE INITIATED. = * THE ADDRESS OF THE FIRST WORD OF THE EQT. * USES TEMP1,TEMP2,UNLK8,TEMP4,XXUP7 * ***************************************************************** * $XXUP NOP STA TEMP4 SAVE OLD DEVICE EQT1. CLA CLEAR STA XXUP7 INITIATION FLAG. RBL,CLE,ERB STRIP OFF POSSIBLE SIGN BIT. XXUP9 SZB,RSS RETURN WHEN END OF I/O JMP XXUP2 REQUEST QUEUE IS FOUND. * STB TEMP1 SET UP POINTER FOR LINK. ADB B176K IF POINTER IS < 2000, SSB THEN NO I-O STACKED ON JMP XXUP2 THIS LU SO EXIT B=0. * LDB TEMP1 OTHERWIZE, GET I-O REQUEST ADDRESS. LDA B,I UNLINK THIS STA UNLK8 I/O REQUEST. INB LDA B,I GET INB PRIORITY RAL OF THE SSA I-O REQUEST JMP XXUP8 SLA,RSS BUFFERED AND CLASS I-O REQUESTS. JMP XXUP5 NORMAL USER REQUEST. LDA TEMP4 SYSTEM REQUEST. ADA .4 LDA A,I AND B36K CHECK IF THE OLD DEVICE CPA B14K IS A DISK OR NOT. JMP XXUP1 CLA IF OLD DEVICE IS NOT A DISK, STA TEMPL SET TEMPL=0 AND USE JMP XXUP3 ZERO PRIORITY. XXUP1 STA TEMPL IF OLD DEVICE IS A DISK, THEN INB,RSS SET TEMPL#0 AND USE PRIORITY. XXUP5 ADB .4 XXUP8 LDA B,I XXUP3 STA TEMP2 SAVE PRIORITY FOR LINK. JSB LINK LINK THIS REQUEST ONTO THE EQT. LDA EQT1 SEZ,RSS IF ONLY REQUEST ON THE EQT, THEN STA XXUP7 STORE INTO THE INITIATION FLAG. LDB UNLK8 LOOP FOR NEXT JMP XXUP9 I/O REQUEST. * XXUP2 CLB SET B=0. LDA XXUP7 GET INITIATION FLAG JMP $XXUP,I RETURN * XXUP7 NOP B176K OCT 176000 HED < I/O CONTROL MODULE - SUBROUTINE SECTION > * * SUBROUTINE: < $YMG > (SYSTEM MESSAGE) * * PURPOSE: THIS ROUTINE PROVIDES FOR THE * OUTPUT OF SYSTEM MESSAGES AND * ERROR DIAGNOSTICS ON THE SYSTEM * TELETYPEWRITER. THE ROUTINE * MAINTAINS A 'ROTATING' BUFFER * AREA CONSISTING OF 15 12-WORD * BLOCKS - I.E., THE MAXIMUM * LENGTH OF A MESSAGE IS 22 * CHARACTERS (11-WORDS) PLUS 1 * WORD PRECEDING THE MESSAGE * WHICH CONTAINS THE CHARACTER * COUNT. * * CALL: (A) = ADDRESS OF FIRST WORD OF * MESSAGE BLOCK - THIS WORD * CONTAINS THE CHARACTER * LENGTH OF THE MESSAGE AS * A NEGATIVE VALUE. * * (P) JSB $YMG * (P+1) -RETURN- * * ON RETURN: * (A) = 0 - MESSAGE ACCEPTED AND * MOVED TO BUFFER. * (A) NOT = 0 - BUFFER FILLED, * MESSAGE REJECTED * (E) = 0 * * $YMG NOP JMP SBUF CHANGED TO CLE ON FIRST ENTRY * LDB SY# IF BUFFER CPB .15 IS FILLED (15 MESSAGES), JMP $YMG,I REJECT EXIT. * LDB SYC SET CURRENT STB SYT1 ENTRY ADDRESS FOR MOVE MVW .12 MOVE THE WORDS. * ISZ SY# INCREMENT COUNT ENTRY. LDB SYC (B) = CURRENT ENTRY ADDRESS. LDA SYT1 ADA .12 (A) = NEXT ENTRY ADDRESS. CPA SBL IF NEXT EXCEEDS BUFFER, LDA SBF RESET TO FWA BUFFER STA SYC AND SAVE. * LDA SY# IF ENTRY. CPA .1 COUNT = 1, JSB SYSCL INITIATE OUTPUT. * CLA,CLE (A) = 0 FOR EXIT WITH JMP $YMG,I MESSAGE ACCEPTED. * * CALL <$XSIO> TO INITIATE OUTPUT * SYSCL NOP LDA B,I GET THE MESSAGE LENGTH STA SYS7 SET IN THE CALL INB STEP TO BUFFER ADDRESS STB SYS6 SET IN THE CALL JSB $XSIO OCT 1 - LOGICAL UNIT 1 - SYS TTY DEF SYS8 - COMPLETION ROUTINE ADDRESS NOP OCT 2 - ASCII WRITE - SYS6 NOP MESSAGE ADDRESS SYS7 NOP MESSAGE LENGTH NOP SAYS DO NOT NEED USER MAP JMP SYSCL,I * * COMPLETION ROUTINE FROM I/O CALL * SYS8 CCA SUBTRACT 1 FROM ADA SY# ENTRY COUNT FOR STA SY# MESSAGE JUST OUTPUT. SZA,RSS IF NO MORE IN BUFFER, JMP $XEQ EXIT. * LDB SYS6 SET ADB .11 NEXT ENTRY CPB SBL ADDRESS LDB SBF JSB SYSCL INITIATE OUTPUT JMP $XEQ -EXIT. * SY# NOP SYT1 NOP SYC DEF SBUF SBF DEF SBUF SKP * * SUBROUTINE: < $SYMG > (SYSTEM MESSAGE) * * PURPOSE: THIS ROUTINE ROUTES ERROR DIAGNOSTICS TO THE * SYSTEM CONSOLE (LU 1) VIA THE $YMG SUBROUTINE. * ALSO, ERRORS WILL BE ECHOED ON THE SESSION TERMINAL * OF THE CURRENTLY EXECUTING PROGRAM VIA THE $BFOT * SUBROUTINE. NOTE : * IF THE SESSION (MTM) TERMINAL = SYSTEM CONSOLE, * THE ERROR HAS ALREADY BEEN ISSUED SO THE ECHO IS NOT * PERFORMED. * * * CALL: (A) = ADDRESS OF FIRST WORD OF MESSAGE BLOCK. * THIS WORD CONTAINS THE CHARACTER LENGTH * OF THE MESSAGE AS A NEGATIVE VALUE. * * * (P) JSB $SYMG * (P+1) -RETURN- * * * ON RETURN: * * * * (A) = 0 -MESSAGE ACCEPTED AND * MOVED TO BUFFER. * (A) NOT 0 = - BUFFER FILLED, * MESSAGE REJECTED. * * (E) = 0 * * SYTMP NOP LOCAL TEMP USED TO SAVE $YMG RTN STATUS * $SYMG NOP STA STMP4 SAVE MESSAGE BLOCK ADDRESS JSB $YMG ISSUE ERROR DIAGNOSTIC TO LU 1 STA SYTMP SAVE CALL STATUS LDB XEQT FETCH CURRENT PROGRAMS ID ADDRESS JSB $LU?? GO LOOK FOR SESSION TERM LU JMP SYM.2 NOT SES OR MTM\ OR LU 1 NOT DEFINED FOR SES SZA,RSS (A)= SYS LU(LU-1) OF SES TERM JMP SYM.2 IF LU 1, ALL DONE! * LDB XEQT FETCH CURRENT PROG'S ID ADDR AGAIN LDA STMP4 FETCH BUFFER ADDRESS JSB $BFOT GO ECHO DIAGNOSTIC TO USER * SYM.2 LDA SYTMP FETCH STATUS OF CALL CLE AND CLEAR "E" TO MATCH $YMG. JMP $SYMG,I * * SKP * * * * SUBROUTINE: <$BFOT> (BUFFERED SYSTEM OUTPUT) * * PURPOSE: THIS ROUTINE DETERMINES THE SESSION (MTM) TERMINAL * AND SETS UP A BUFFERED OUTPUT REQUEST (T FIELD=01) * IF ALL THE FOLLOWING CONDITIONS ARE TRUE: * * 1) LU IS NOT ZERO (LU-1=B377) * 2) LU IS DEFINED (NOT GREATER THAN MAX) * 3) EQT IS NOT EQT 0 * 4) ENOUGH SAM IS AVAILABLE FOR THE REQUEST * 5) LU IS UP * * * THIS ROUTINE WILL NEVER CAUSE A REQUEST TO BE * INITIATED (CALL DRIVER) AS ANY PROBLEMS WILL * CAUSE THE NOTRD ROUTINE TO BE ENTERED. THATS A * NO NO AS NOTRD CALLS THIS ROUTINE. * * * IF NO OTHER REQUESTS ARE PENDING, $DLAY IS CALLED * TO CAUSE INITIATION OF THE REQUEST ON THE NEXT * TBG TICK. * * * CALLING SEQUENCE: LDA BUF (1ST WORD IS -LEN, BUFFER FOLLOWS) * LDB ID SEG ADDR OF PROG FOR ECHO * JSB $BFOT * * RETURN (A) IS NOT CHANGED * ALL OTHER REGISTERS MODIFIED * * * THE REQUEST HEADER IS DEFINED AS FOLLOWS: * * NOTE: DON'T MESS WITH THE ORDER. * ****************************************************** BF.HD DEF BF.CN DEFINES START OF THE HEADER * * LINK WORD IS ADDED IN SAM * BF.CN NOP *CONTROL WORD IS PLACED HERE NOP PRIORITY OF REQUEST=0 BF.TL NOP *TOTAL BLOCK LENGTH IS PLACED HERE BF.UL NOP *MESSAGE LENGTH PLACED HERE NOP TRACK NOP AND SECTOR INFO * ****************************************************** * OUTPUT BUFFER FOLLOWS IN SAM * BFCON OCT 40002 BUFFERED WRITE/SFUN=0 BFTM1 NOP BFTM2 NOP BFTM3 NOP * * * $BFOT NOP STA BFTM2 SAVE BUF LOCATION LDA XTEMP,I SAVE CONTENTS OF XTEMP AS STA BFTM3 $ALC WILL ALTER IT IF CALLED. JSB $LU?? FIND SES TERM LU 1 (B=ID ADDRESS) JMP BFEX NOT SES OR MTM\ OR SES LU 1 NOT DEFINED CPA B377 IF LU =0 JMP BFEX WERE ALL DONE. STA STMP2 SAVE SYS LU (LU-1) * * * SESSION LU 1 (OR MTM TERMINAL) IS DEFINED AND IS NOT * LU 0. NOW CHECK FOR : LU > LUMAX AND EQT=0 * * CMA,CLE CHECK FOR AN LU ADA LUMAX GREATER THAN THE SEZ,RSS LARGEST DEFINED LU. JMP BFEX TOO BAD, REJECT REQUEST. * LDB STMP2 RESTORE LU ADB DRT INDEX INTO DRT LDA B,I GET EQT ASSIGNMENT STA BFTM1 SAVE DRT WORD 1 FOR CON WORD WORK * AND B77 CHECK FOR EQT SZA,RSS = ZERO JMP BFEX YEP-- REJECT REQUEST * * * LU IS OK - SET UP BP EQT POINTERS,CHECK FOR DOWN EQT\LU * AND GRAB SOME SAM * * * JSB $CVEQ CONVERT EQT# (IN A) AND SET UP ADDRS LDA STMP2 FETCH LU (LU-1) JSB STADV IS EQT OR LU DOWN? JMP BFEX YES-GO EXIT * * CHECK THE BUFFER LIMIT OF THIS EQT * LDB $BLUP FETCH UPPER LIMIT JSB QCHK AND GO CHECK UPPER LIMIT JMP CKQUE BUFFER LIMIT REACHED-SEE IF ANY SYS REQUESTS PENDI * * ECHO LDA BFTM2,I FETCH LENGTH WORD STA BF.UL SET FOR CALL (INTO HEADER--NOTE: NEG CHAR COUNT) ARS CALCULATE POSITIVE # OF WORDS CMA,INA REQURIED FROM NEG CHAR COUNT STA $LU?? SAVE TRANSFER LENGTH FOR MOVE TO SAM ADA .7 ADD IN REQUEST HEADER STA BF.01 SAVE FOR $ALC CALL JSB $ALC BF.01 NOP REQUEST LENGTH JMP BFEX EXIT- NEVER ENOUGH MEM JMP BFEX EXIT- NO MEMORY NOW STB BF.TL GOT IT- SAVE ACTUAL LENGTH STA TEMP1 SAVE ADDR OF BLOCK(FOR LINK ROUTINE) * * * INITIALIZE TEMP2 AND TEMP3 FOR "LINK" CALL AND * CLEAR E FOR CON WORD WORK. * * CLA,CLE STA TEMP2 PRIORITY OF REQUEST STA TEMP3 THIS IS NOT A DISC REQUEST * * * BUILD THE CONTROL WORD-- ALL THE FIELDS ARE FIXED, EXCEPT * FOR THE SUB CHANNEL (SEE BFCON AND WORD2 ROUTINE). * * LDA BFTM1 FETCH DRT ENTRY FOR THIS LU AND B174K GET SUB CHANNEL ELA,RAL SAVE HIGH BIT ("E" CLEARED ABOVE) ALF,RAL AND POSITION THE REST ADA BFCON ADD STANDARD CONTROL WORD FOR BUF OUTPUT SEZ IF HIGH BIT SET ADA B20K SET IT IN CONTROL WORD STA BF.CN AND SAVE IN REQUEST HEADER * * * MOVE REQUEST HEADER TO SAM * * LDA BF.HD FETCH REQUEST HEADER ADDRESS LDB TEMP1 FETCH SAM BLOCK ADDRESS INB 1ST WORD IS DEFINED BY "LINK" MVW .6 MOVE HEADER OUT * * * MOVE MESSAGE BUFFER TO SAM * LDA BFTM2 FETCH BUFFER LOCATION INA ADVANCE PAST LENGTH MVW $LU?? MOVE HER OUT * * * LINK THE REQUEST TO THE EQT AND SET UP FOR * DELAYED INITIATION IF REQUIRED. * * JSB LINK TEMPS 1-3 AND EQT ADDRS ALREADY SET UP SEZ,CLE IF DEVICE IS BUSY- JMP BFOK WERE ALL DONE * LDA EQT1 ELSE, SET UP FOR INITIATION OF REQUEST JSB $DLAY ON NEXT TICK. CLE,RSS SET UP FOR GOOD EXIT * BFEX CCE ERROR EXIT BFOK LDA BFTM2 RESTORE BUFFER ADDR LDB BFTM3 RESTORE SAVED CONTENTS OF XTEMP,I STB XTEMP,I IN CASE $ALC WAS CALLED JMP $BFOT,I AND EXIT * * * THE BUFFER LIMIT HAS BEEN REACHED ON THE SESSION TERMINAL. * TO AVOID THE POSSIBILITY OF EATING UP SAM, ONLY ONE ERROR * ECHO WILL BE STACKED WHILE IN THIS STATE. * IF THE SECOND REQUEST ON THE EQT IS PRIORITY 0 (ZERO), THEN * SKIP THE ECHO AS ONE ERROR HAS BEEN STACKED. THE SECOND * REQUEST IS CHECKED AS THE FIRST ONE IS ASSUMED TO BE THE CURRENT * REQUEST. * * CKQUE LDA EQT1,I FETCH CURRENT ENTRY RAL,CLE,ERA REMOVE POSSIBLE SIGN BIT LDA A,I FETCH SECOND ENTRY RAL,CLE,ERA AND CLEAR POSSIBLE SIGN BIT AGAIN * SZA,RSS IF ONLY ONE REQUEST PENDING- GO ECHO JMP ECHO * ADA .2 ADVANCE TO PRIORITY LDB A,I AND FETCH IT SZB IF NOT ZERO JMP ECHO GO ECHO AS NO SYS ERRORS PENDING JMP BFEX ELSE ABORT ECHO AS ANOTHER ECHO IS STILL PENDING. SKP * * *SUBROUTINE : < $LU?? > (FIND SESSION TERMINAL LU IN SYSTEM LU TERMS) * * PURPOSE * THIS ROUTINE INTERPERTS THE PASSED PROGRAMS ID SEGMENT * LOOKING FOR THE SESSION OR MTM TERMINAL LU IT IS ASSOIATED * WITH. * * * CALLING SEQUENCE: LDB ID SEG ADDR * JSB $LU?? * * RETURN P+1 NOT IN SESSION OR MTM\ OR LU 1 NOT DEFINED (SESSION) * P+2 A=SYS LU (LU-1) OF ASSOIATED TERMINAL * B=LOGICAL ADDRESS OF SST IF SESSION PROG * OR * B=- TERMINAL LU IF MTM PROG * * * * $LU?? NOP SZB,RSS IF ID NOT PASSED ( IF XEQT=0) JMP $LU??,I GET OUT * ADB .32 ADVANCE TO SESSION WORD LDB B,I AND FETCH IT SSB MTM ? (NEG VALUE=MTM PROGRAM) JMP LU3 YES-- PREPARE FOR RETURN * SZB,RSS SESSION PROG (POS NON-ZERO=SESSION) JMP $LU??,I NOPE SO JUST EXIT * * THIS IS A SESSION PROGRAM * * * JSB MPTAB MAP IN TABLE PTN(IF DEFINED) AND STB STMP2 SAVE LOGICAL ADDRESS IN TMP FOR RTN CLA DEFINE SEARCH FOR LU 1 (LU-1) STA REQLU SET FOR SWTCK CALL LDA B,I FETCH LENGTH OF SST JSB SWTCK GO FIND ASSOIATED SYSTEM LU JMP $LU??,I NOT DEFINED GOUT ISZ $LU?? BUMP RTN ADDR LDB STMP2 FETCH LOGICAL ADDR IF SESSION\ NEG LU IF MTM JMP $LU??,I EXIT * * LU3 STB STMP2 SAVE NEG LU FOR RTN CMB SET IT POS - 1 LDA B PREPARE FOR EXIT JMP GOUT * * .32 DEC 32 * * * * DUMMY PARTITION MAP ROUTINE ***780224 GLM*** * *MPTAB NOP * JMP MPTAB,I ** * * SKP * * * * * SUBROUTINE : <$PSTE> (POST ERROR TO SESSION CONTROL BLOCK) * * PURPOSE * THIS ROUTINE DETERMINES IF THE SPECIFIED PROGRAM * IS UNDER SESSION AND IF SO, PLACES THE 1ST FOUR * WORDS OF THE SPECIFIED ERROR MESSAGE INTO THE * ERROR BUFFER IN THE SCB. * * * CALLING SEQUENCE: LDA BUFFER ADDRESS * LDB PROG'S ID ADDRESS * JSB $PSTE * * (A) AND (B) ARE RETURNED UNCHANGED * * $PSTE NOP SZB,RSS IF NO ID ADDR SUPPLIED JMP $PSTE,I RETURN * DST STMP1 SAVE BUF AND ID ADDR'S ADB .32 ADVANCE TO SESSION WORD LDB B,I AND FETCH IT SSB,RSS IF NEGATIVE OR SZB,RSS OR ZERO (NOT SESSION) JMP PSTEX RESTORE REGS AND EXIT * * JSB MPTAB MAP IN TABLE PTN IF DEFINED (B= SESSION WORD) ADB $SMER ADD OFFSET TO ERROR PARAMETER (EXTERNAL) * * * MOVE ERROR INTO SCB * * LDA STMP1 FETCH MESSAGE BUFF ADDR INA ADVANCE PAST LENGTH MVW .4 AND MOVE 1ST FOUR WORDS * * PSTEX DLD STMP1 RESTORE REGISTERS JMP $PSTE,I * * SKP * * * * * SUBROUTINE: <$CVEQ> * * PURPOSE: THIS ROUTINE CONVERTS AN EQT * ENTRY # TO AN EQT DISPLACEMENT * AND CALLS <$ETEQ> TO SET THE * ENTRY ADDRESSES. * * CALLING SEQUENCE: * * (A) = EQT ENTRY # IN LOWER 6 BITS. * * (P) JSB $CVEQ * (P+1) -RETURN- REGISTERS MEANINGLESS * * $CVEQ NOP AND B77 MASK TO LOW BITS ADA N1 SUBTRACT 1 AND MPY .15 MULTIPLY BY 15 ADA EQTA ABSOLUTE ADDRESS. * JSB $ETEQ SET ALL 15 ADDRESSES. * JMP $CVEQ,I -RETURN- * * SUBROUTINE: * * PURPOSE: THIS ROUTINE COMPUTES THE ENTRY # * OF THE ENTRY DESCRIBED BY -EQT1-. * * CALLING SEQUENCE: (P) JSB CPEQT * (P+1) - RETURN - * ON RETURN, (A) = EQT # * (E) = 1 * * CPEQT NOP LDA EQTA SUBTRACT DEVICE CMA,INA EQT ENTRY ADDRESS ADA EQT1 FROM FWA OF EQT. CLB CLEAR B FOR DIVIDE DIV .15 DIVIDE BY 15 CCE,INA SET E FOR CONVERSION/ADJUST COUNT. JMP CPEQT,I SKP * SUBROUTINE: < $ETEQ > * * PURPOSE: THIS ROUTINE SETS THE ADDRESSES * OF THE 15 WORDS OF AN * EQUIPMENT TABLE ENTRY IN THE * 15 WORDS IN BASE PAGE COMMUNICATION * AREA LABELLED -EQT1- TO -EQT15-. * * CALLING SEQUENCE: * * (A) - STARTING ADDRESS OF THE EQT * ENTRY FOR THE REFERENCED * I/O UNIT. * * (P) JSB $ETEQ * (P+1) - RETURN - (A),(B) MEANINGLESS * * THERE ARE NO ERROR RETURNS OR * ERROR CONDITIONS DETECTED. * * $ETEQ NOP STA EQT1 INA STA EQT2 INA STA EQT3 INA STA EQT4 INA STA EQT5 INA STA EQT6 INA STA EQT7 INA STA EQT8 INA STA EQT9 INA STA EQT10 INA STA EQT11 INA STA EQT12 INA STA EQT13 INA STA EQT14 INA STA EQT15 JMP $ETEQ,I * * SKP * * SPECIAL SECTION "I/O CLEAR " * ENTRY POINT IS "$IOCL" * * PURPOSE: THE FUNCTION OF THIS ROUTINE * IS TO REMOVE A PROGRAM FROM AN * I/O HANG-UP CONDITION RESULTING * FROM AN INPUT REQUEST NOT BEING * COMPLETED BY THE DEVICE. * * THIS "CLEARING" PROCEDURE IS * INITIATED BY THE OPERATOR IN * USING THE I/O ABORT VERSION OF THE * "OF,XXXXX,1" COMMAND. THE "OF" * STATEMENT PROCESSOR IN 'SCHED' * CALLS THIS SECTION IF THE REF- * ERENCED PROGRAM IS SUSPENDED * FOR AN I/O INPUT REQUEST. * * PROCESS: THE LIST OF EACH EQT ENTRY * IS SEARCHED TO FIND THE QUEUED * REQUEST CORRESPONDING TO THE * ID SEGMENT OF THE REFERENCED * PROGRAM. THE ENTRY IS REMOVED * FROM THE LIST AND THE LIST IS * APPROPRIATELY LINKED TO REFLECT * THE CHANGE. * * IF THE ENTRY WAS THE FIRST ONE * IN THE LIST (I.E. THE ACTIVE * REQUEST), THE DEVICE'S DRIVER IS * CALLED WITH A CLEAR REQUEST (CONTROL * WITH ZERO SUBFUNCTION. IF THE DRIVER * ACCEPTS THE REQUEST (A=0 ON RETURN) THEN * EQT1 SIGN BIT IS SET AND A 1 SEC. TIME OUT * IS SET UP. (THIS TIME OUT IS TRAPED BY THE * SYSTEM AND IS NEVER GIVEN TO THE DRIVER). * $ABRT IS CALLED TO ABORT THE PROGRAM AND * CONTROL IS TRANSFERRED TO "$XEQ" * IF THE DEVICE WAS NOT CLEARED * OR TO "$CON1" TO INITIATE THE NEXT STACKED * REQUEST (OR TO ALLOCATE THE DMA CANNEL) * * CALLING SEQUENCE: * * (A)= ID SEGMENT ADDRESS OF PROGRAM * * (P) JMP $IOCL * * -NO RETURN - * * SKP ENT $IOCL * $IOCL STA TEMP1 SAVE ID SEGMENT ADDRESS. LDA EQT# SET TEMP2 = NEGATIVE CMA,INA NUMBER OF EQT STA TEMP2 ENTRIES. LDA EQTA INITIALIZE FOR * IOCL STA IOCL5 EQT ENTRY WORD IOCL0 STA IOCL6 1 ADDRESS. * LDA A,I GET LINK ADDR RAL,CLE,ERA CLEAR SIGN ,SET E IF SIGN WAS SET CPA TEMP1 JUMP IF A JMP IOCL2 MATCH TO PROGRAM. (TEMP2 = -EQT -1 ON EXIT) * SZA IF NOT END OF LIST, JMP IOCL0 CONTINUE SCAN. * LDA IOCL5 SET (A) = ADDRESS OF ADA .15 NEXT EQT ENTRY. ISZ TEMP2 IF NOT END OF EQT, GO (TEMP2 = -EQT -1 ON EXIT) JMP IOCL TO SCAN NEXT ENTRY LIST. * * SCAN ALL DRT WORD 2 I/O QUEUES * LDA LUMAX SET TEMP2 = NEGATIVE CMA,INA NUMBER OF DRT STA TEMP2 ENTRIES. LDA DRT INITIALIZE ADA LUMAX FOR FIRST STA IOC50 DRT WORD IOC41 STA IOC51 TWO. LDA A,I GET LINK RAL,CLE,ERA CLEAR SIGN, SET E IF SIGN SET. CPA TEMP1 JUMP IF A MATCH JMP IOC62 TO A PROGRAM. * SZA IF NOT END OF LIST, JMP IOC41 CONTINUE SCAN. * ISZ IOC50 SET = NEXT LDA IOC50 ADDRESS OF NEXT ISZ TEMP2 DRT WORD 2. JMP IOC41 IF NOT END OF DRT, CONTINUE SCAN. * * SCAN $ELTB ENTRY WORD 3 I/O QUEUES * LDB $ELTB,I GET $ELTB HEADER WORD. SSB,RSS IF NOT_EMPTY BIT NOT SET, JMP IOC6X NOT HUNG ON ANY LIST, OK TO ABORT. (GLM.2013) * RBL,BRS GET RID OF NOT_EMPTY BIT. LDA $ELTB GET TABLE ADDR. ADA .1 GET ADDR OF ADA B 1ST $ELTB ENTRY WORD 3 ADA B IN A. STA IOC50 THEN STORE IT. CMB,INB STORE 2'S COMPLE STB TEMP2 OF TABLE LENGTH. IOC45 STA IOC51 STORE POTENTIALLY RIGHT LINK. LDA A,I GET LINK WORD. RAL,CLE,ERA CLEAR SIGN, SET (E) = SIGN. CPA TEMP1 COMPARE AGAINST ID SEG IN QUESTION. JMP IOC62 JIF MATCH FOUND. * SZA IF NOT END OF CHAIN, JMP IOC45 GO LOOP. * ISZ IOC50 SET (A) = ADDR OF LDA IOC50 NEXT $ELTB ENTRY WORD 3. ISZ TEMP2 IF NOT ALL WORD 3 POINTERS CHECKED, JMP IOC45 GO LOOP. * IOC6X LDA TEMP1 FETCH ID SEGMENT ADDRESS (GLM.2013) JMP IOC63 NOT HUNG ON ANY LIST, OK SKP * * PROGRAM REQUEST FOUND IN DRT OR $ELTB. NOW TO UNLINK IT. * IOC62 LDB A,I GET NEXT LINK, PROPOGATE RBL,ERB SIGN IF SIGN WAS SET AND STB IOC51,I STORE IN PREVIOUS LINK. * LDA TEMP1 CHECK IF THIS ISZ TEMP1 IS A SYSTEM LDB TEMP1,I REQUEST. SSB,RSS IF SO SKIP ABORT. IOC63 JSB $ABRT 'ABORT PROGRAM' (GLM.2013) JMP $XEQ RETURN. * * PROGRAM REQUEST ENTRY FOUND IN EQT, UNLINK REQUEST. * * EQT#-TEMP2+1 = EQT OF I/O RQ TO ABORT * IOCL2 LDB A,I GET NEXT LINK AND SET RBL,ERB PROPOGATE SIGN IF SIGN SET STB IOCL6,I IN PREVIOUS LINK. * LDA TEMP2 GET THE EQT INVOLVED STA NEQT AND SAVE BECAUSE $ABRT MODIFIES IT(VIA $SYMG) * LDA TEMP1 "ABORT ISZ TEMP1 CHECK IF THIS IS A LDB TEMP1,I SYSTEM REQUEST SSB,RSS IF SO SKIP ABORT JSB $ABRT PROGRAM" * LDA IOCL5 IF PROGRAM REQUEST LDB IOCL6,I CPA IOCL6 WAS CURRENT ENTRY, SSB AND NOT NOW CLEARING SKIP TO CLEAR DEVICE. JMP $XEQ -EXIT TO $XEQ. SKP JSB $ETEQ JSB CLDMA CLEAR ANY DMA CHANNEL ASSIGNED LDA B3.I GET CLEAR REQUEST (100003B) STA EQT6,I SET IN EQT * WHAT'S HAPPENING BELOW 'TIL THE NEXT LABEL IS THIS: * IF THE EQT IS DOWN OR FREE, I/O WAS NOT ONGOING, SO THERE IS NO NEED TO * ISSUE THE CLEAR REQUEST. IF THE DRIVER IS BUSY, WE CERTAINLY NEED TO * ISSUE THE CLEAR REQUEST. IF NEITHER, THEN THE DRIVER IS IN DMA-WAIT * STATE. IN THIS CASE, IF THE "D" BIT IS SET IN EQT4, THIS DRIVER AUTO- * MATICALLY GETS DMA AT INITIAL ENTRY: IT DOESN'T SCREW AROUND WITH * DYNAMIC ALLOCATION OF DMA. HOWEVER, IOC NEVER CALLED THE DRIVER FOR * THIS CALL, BECAUSE DMA WAS UNAVAILABLE. HENCE, AGAIN, THERE IS NO NEED * TO ISSUE THE CLEAR REQUEST. IF THE "D" BIT IS NOT SET, IT IS STILL * POSSIBLE THAT THE DRIVER ASKED FOR DMA ALLOCATION FROM ITS CONTINUATION * SECTION (IF SO, THE "DRIVER-EXITED-FROM-CONTINUATION-SECTION-TO-GET-DMA" * FLAG, EQT3 BIT 15, WILL BE SET), AND, IN THAT CASE, WE DO NEED TO ISSUE * THE CLEAR REQUEST. IF NEITHER "D" (IN EQT4) NOR "D-E-C-S-G-D" (IN EQT3) * IS SET, THEN THE REASON FOR THE DMA-WAIT STATE OF THE EQT CAN ONLY BE * THAT THE DRIVER REQUESTED DMA FROM THE INITIATION SECTION. IN THIS CASE, * NOTHING WAS STARTED (HOPEFULLY) BY THE DRIVER FOR THIS CALL, AND AGAIN * WE DO NOT ISSUE THE CLEAR REQUEST. LDA EQT5,I GET CURRENT STATUS RAL GET AV BITS IN BITS 15 & 1 SLA,RSS IF DOWN (OR FREE), JMP $XEQ LEAVE THE EQT BE, * SSA,RSS ELSE IF BUSY JMP IOC65 GO ISSUE THE CLEAR, * LDB EQT4,I ELSE IF THE D BIT SSB IS SET, JMP $XEQ LEAVE THE EQT BE, * LDB EQT3,I ELSE IF THE DECSGD SSB,RSS BIT IS CLEAR, JMP $XEQ LEAVE THE EQT BE. * IOC65 LDA EQT5,I MAKE AND MASK THE EQT STA EQT5,I NOT BUSY. * LDB NEQT GET EQT# OF INTEREST ADB EQT# B=EQT# ADB $DVMP NOW INDEX INTO ADB EQT# PART 2 OF DVR MAP TABLE CLA AND CLEAR IT SO THAT THE DVR STA B,I IS ENTERED IN THE SYS MAP ON * FUTURE INTERRUPTS JSB $DRVM SET UP FOR MAPPING LDA EQT4,I GET THE SELECT CODE LDB EQT2,I AND THE I.XX ADDRESS ELB,CLE,ERB CLEAR POSSIBLE SIGN (SET BY $DLAY),SAVE E STB EQT2,I RESTORE I.XX ADDRESS AND B77 ISOLATE THE SELECT CODE AND SEZ ENTER DRIVER IN USER MAP? JMP IOCUS YES * JSB B,I ENTER DRIVER IN SYSTEM MAP JMP IOCWT * IOCUS JSB $UIN ENTER DRIVER IN USER MAP, RETURN TO IOCWT * * IF REQUEST ACCEPTED THEN WE MUST SET UP FOR AN INTERRUPT BY * * A) SETTING THE DEVICE BUSY * B) SETTING A TIME OUT (1 SEC. IS ARBITRARILY USED) * * IF REQUEST IS NOT ACCEPTED OR IS COMPLETED THEN: * * A) ZAP TIME OUT AND * B) GO TO $CON1 TO GET THE NEXT REQUEST * IOCWT CLB,CCE FIRST ZAP TIME OUT STB EQT15,I LDB EQT1,I SET THE SIGN BIT IN EQT1 RBL,ERB FOR $CON1 (NOW OR LATER) STB EQT1,I CCE,SZA INTERRUPT EXPECTED? JMP $CON1 NO SO JUST GO TO $CON1 * LDA EQT5,I YES SO SET RAL,ERA BUSY STA EQT5,I AND LDA N100 SET UP STA EQT15,I A REASONABLE TIME OUT LDA EQT3,I CLEAR THE ELA,CLE,ERA DRIVER-EXITED-FROM-CONTINUATION- STA EQT3,I SECTION-TO-GET-DMA FLAG. JSB $RSM *RESTORE USER MAP TO PRE-DRIVER STATA JMP $XEQ GO TO THE DISPATCHER * SPC 1 IOCL5 NOP IOCL6 NOP IOC50 NOP IOC51 NOP MASK OCT 37777 NEQT NOP SKP * * ROUTINE TO CLEAR DMA CHANNEL IF ASSIGNED TO DEVICE * CLDMA NOP LDB INTBA GET THE INTERRUPLE ADDRESS TO B LDA B,I AND DMA 6 ENTRY TO A RAL,CLE,ERA CLEAR THE SIGN BIT CPA EQT1 THIS CHANNEL ASSIGNED? CLA,RSS YES- SKIP JMP IOCL3 NO TRY NEXT CHANNEL * CLC 6 CLEAR CHANNEL STF 6 6. STA B,I SET IT AVAILABLE IN INTBA SPC 1 IOCL3 INB STEP TO DMA 7 ENTRY LDA B,I GET TO A AND RAL,CLE,ERA CLEAR THE SIGN BIT CPA EQT1 THIS CHANNEL ASSIGNED? CLA,RSS YES - SKIP JMP CLDMA,I NO - EXIT CHANNELS CLEARED * CLC 7 CLEAR CHANNEL 7 STF 7 AND STA B,I MAKE IT AVAILABLE. JMP CLDMA,I * * ROUTINE TO CLEAR ALL CHANNELS SERVICED BY EQT ENTRY * CLCHS NOP JSB CLDMA CLEAR DMA CHANNEL IF ASSIGNED LDA INTLG STORE INTERRUPT CMA,INA TABLE LENGTH- ADA .2 RELATED INDEX STA TEMPW LDA CLR10 STORE INITIAL STA CLCSC CLC S.C. LDA INTBA INSTRUCTION ADA .2 CLRNX LDB A,I GET NEXT TABLE ENTRY- CPB EQT1 DOES IT REFERENCE THIS EQT? CLCSC CLC 00B YES-GO CLEAR IT ISZ TEMPW THRU TABLE? INA,RSS NO-INDEX TO NEXT ENTRY JMP CLCHS,I YES-EXIT * ISZ CLCSC JMP CLRNX * CLR10 CLC 10B B3.I DEF 3,I N100 DEC -100 HED * $SYMG BUFFER AND PRIVLEDGE I/O CONFIGURE SECTION * * SBUF BSS 180 15 * 12 SBL DEF * * ORG SBUF PUT IOC CONFIGURING ROUTINE IN BUFFER STA SBUF SAVE THE A REG. CLA STA $ZZZZ ZERO THE ABORT LIST STA DUMMY,I ZAP THE PRIV. TRAP CELL. LDA DUMMY GET THE DUMMY I/O ADDRESS SZA,RSS IF NONE JMP NOPRV GO EXIT * ADA CLCP CONFIGURE THE DUMMY ADDRESSES STA CLC2,I USE INDIRECTS TO AVOID LINKS XOR STCP MAKE STC STA STC2,I STC STA STCP SET IN LINE TOO XOR STFP STF STA STF2,I AND STF STA STFP NEED THIS IN LINE ALSO STCP OCT 4000 SET UP THE PRIV. CARD STFP OCT 600 NOW FOR DISC DRIVERS ETC. NOPRV LDA CLE REPLACE CALL TO HERE STA $YMG+1 WITH A CLE LDB DL.12 GET DEF TO L.012 FOR LDA PDSK DISC PROTECT OPTION SZA PROTECT?? STB DPOPI,I YES, SET IT UP LDB HLT2 PUT HALT 2 IN LOCATION 2 STB 2 AND HALT 3 IN LOCATION 3 CCE,INB OF SYSTEM MAP FOR TRAPPING STB 3 ERRORS LDA $DVPT GET PAGE OF DRIVER PTTN ALF,ALF CONVERT TO LOGICAL ADDR RAL,RAL IOR B1740 FORM ADDR OF USER MAP COPY AREA STA DDVPT,I SAVE LOG ADDR LDA ACLAS CMA,INA STA DDMCL,I SBUF3 LDA SBUF RESTORE A JMP $YMG+1 EXIT INITIALIZATION CODE * * CLE CLE PDSK DEF $PDSK DL.12 DEF L.012 CLCP CLC 0 DPOPI DEF DPOPT STC2 DEF SW1 STF2 DEF STF1 CLC2 DEF SW2 LOCAL DEFS TO AVOID LINKS DDVPT DEF DVPTA DDMCL DEF MCLAS ACLAS DEF $CLAS+0 HLT2 HLT 2 B1740 OCT 1740 * L EQU 165+SBUF-* ERROR HERE MEANS WE RAN OUT OF BUFFER ORR LEAVE THE BUFFER SKP HED ** RTE IV B EQT LOCK CLEARING ROUTINE ** ****************************************************************** * * EQUIPMENT LOCK CLEARING ROUTINE * * $EQCL IS THE EQUIPMENT UNLOCKING ROUTINE. * IT IS CALLED BY THE ABORT PROCESSOR (IN THE DISPATCHER) ON * FINDING ONE OR MORE EQTS. IN THE SYSTEM LOCKED. * * ON NORMAL TERMINATION, THIS ROUTINE * CLEARS THE $ELTB ENTRY FOR THE SPECIFIED EQUIPMENT, * UPDATES THE NOT_EMPTY BIT (IF NEED BE) IN THE TABLE HEADER, * ELEVATES THE PRIORITY OF THE I/O CALLS AT THE LOCKED EQT * (ALL OF WHICH BELONG TO THE LOCKER) TO ZERO, * CALLS THE SCHEDULER TO SCHEDULE ANY PROGRAMS WAITING FOR THIS * EQUIPMENT OR FOR A SLOT IN THE TABLE, * TRANSFERS THE LINKED LIST OF $XSIO REQUESTS HUNG ON THE ENTRY * JUST CLEARED BACK ON THE EQT FOR THAT EQUIPMENT, * RIGHT BEHIND THE ERSTWHILE LOCKER'S ZERO-PRIORITY * CALLS, * CALLS "DRIVR" TO INITIATE THE FIRST $XSIO CALL REHUNG ON THE * EQT, IF THE EQT. WAS IDLE AT THE TIME OF REHANGING, * CALLS "NOTRD" FOR DIAGNOSTIC PROCESSING, IF "DRIVR" MAKES AN * ERROR RETURN, * AND RETURNS TO THE CALLER. * * CALLING SEQUENCE: * LDA ID_SEGMENT_ADDR_OF_TERMINATING_PROGRAM * LDB $ELTB,I * JSB $EQCL * ******************************************************************* * * $EQCL NOP STA TMP STORE ID SEG ADDR OF ABORTING PROG. ELB,CLE,ERB OMIT NOT EMPTY BIT FROM TABLE HEADER. STB T4 STORE TABLE LENGTH. LDA $ELTB GET TABLE ADDR. ADA .1 GET ADDR OF 1ST EQT.# IN TABLE. STA TB STORE IT. ADA B GET ADDR OF 2ND WORDS OF TABLE ENTRIES. STA T1 STORE IT. CMB,INB COMPUTE 2'S COMPLE OF #_OF_ENTRIES, STB T2 AND STORE IT HERE. CLA INITIALIZE STA T6 #_OF_EMPTIES. EQC10 LDB T1,I GET ID SEG ADDR FROM TABLE. RBL,CLE,ERB (E)= LOCK_ON_ABORT, (B)= ID SEG ADDR. LDA TB,I LOAD NEXT EQT. # IN TABLE. SZA,RSS IF A BLANK ENTRY IS ENCOUNTERED, ISZ T6 BUMP #_OF_EMPTIES. CPB TMP IF THIS EQT. IS LOCKED TO OUR MAN, JMP EQC30 GO LOOK INTO THE SITUATION. * EQC20 ISZ TB INCREMENT TO NEXT ENTRY'S 1ST WORD. ISZ T1 INCREMENT TO NEXT ENTRY'S 2ND WORD. ISZ T2 IF NOT ALL ENTRIES COMPARED YET, JMP EQC10 LOOP BACK. * LDA T6 GET TOTAL #_OF_EMPTIES IN TABLE. CPA T4 COMPARE WITH TABLE LENGTH. RSS IF TABLE NOT EMPTY, JMP $EQCL,I RETURN W/O CLEARING NOT_EMPTY BIT. * LDA $ELTB,I GET TABLE HEADER WORD. ALR,RAR CLEAR NOT_EMPTY BIT, STA $ELTB,I AND RESTORE. JMP $EQCL,I THEN RETURN. * EQC30 ADB .20 GET ADDR OF FLAG WORD IN ID SEG. LDA B,I ISOLATE THE NORMAL_TERM. FLAG AND .2 THAT WAS SET IN "MPT1". SZA IF NORMAL TERMINATION, JMP EQC40 GO DO THE FULL UNLOCK. * SEZ,RSS ELSE, IF LOCK_ON_ABORT NOT SET, JMP EQC40 GO DO THE FULL UNLOCK. * STA T1,I ELSE, CLEAR ONLY WORD 2 (ID SEG ADDR). JMP EQC20 THEN LOOK FOR MORE LOCKS. * EQC40 LDA TB,I FIRST PRESERVE STA T3 EQT. # TO BE UNLOCKED. LDA TB THEN PRESERVE ADDR OF STA T7 ENTRY FOR SEMAPHORING. CLB CLEAR THE STB A,I 1ST WORD. ADA T4 COMPUTE ADDR OF ENTRY'S 2ND WORD. STB A,I CLEAR 2ND WORD. ADA T4 COMPUTE ADDR OF ENTRY'S 3RD WORD. LDB A,I GET THE 3RD WORD (LIST POINTER), STB T8 AND PRESERVE IT. CLB THEN CLEAR STB A,I THE 3RD WORD ALSO. * ISZ T6 BUMP #_OF_EMPTIES FOR BLANK CREATED. * CCA GET ADDR OF LOCKED EQUIPMENT'S EQT ADA T3 ENTRY'S "PENDING I/O CALLS POINTER" MPY .15 WORD (VIZ., WORD ZERO IN THE ADA EQTA EQT ENTRY). STA TA STORE POINTER WORD ADDR HERE, STA TC AND HERE. EQC75 LDA TA,I GET ADDR OF NEXT ENTRY IN CHAIN. SZA,RSS IF END OF LIST, JMP EQC80 THAT'S WHERE TO HANG $XSIO PENDING. * ELA,CLE,ERA GET RID OF "I/O CLEARED" FLAG. STA TA STORE CURRENT ENTRY ADDR. INA 2ND WORD HAS "REQUEST TYPE LDB A,I IDENTIFIER" IN BITS 14-15. INA 3RD WORD POTENTIALLY HAS PRIORITY. RBL GET BUFFERED/UNBUFFERED (1/0) IN 15. SSB,RSS IF UNBUFFERED, JMP EQC75 IT'S SOMEONE ELSE'S PRE-LOCK REQ. CLB CHANGE REQUEST PRIORITY TO ZERO STB A,I TO FLUSH IT OUT BEFORE ANYTHING ELSE. JMP EQC75 LOOP TO DO LIKEWISE TO ALL HIS CALLS. * EQC80 LDA T7 GET $ELTB ENTRY ADDR. JSB $SCD3 SCHEDULE ANY WAITERS_FOR_THIS_EQT. LDA $ELTB GET TABLE HEADER ADDR. JSB $SCD3 SCHEDULE WAITERS_FOR_A_PLACE_IN_TABLE. LDA T8 GET POINTER TO $XSIO LINKED LIST. STA TA,I REHANG IT ON THE EQT. SZA,RSS IF THERE WERE NO $XSIO CALLS, JMP EQC20 SKIP POTENTIAL "DRIVR" CALL. * LDB TA IF THERE IS (ARE) USER CALL(S) CPB TC ALREADY QUEUED AHEAD OF RSS THE $XSIO CALL(S) JMP EQC20 AGAIN NO NEED TO CALL "DRIVR". * LDA T3 GET EQT.# TO INITIATE I/O FOR, JSB $CVEQ AND GO SET UP EQT1-15. JSB DRIVR GO INITIATE I/O. JMP EQC20 THEN LOOK FOR MORE LOCKS. * LDA EQC20 ERROR, SO PASS RETURN ADDR STA XSIOE TO DIGNOSTIC PROCESSOR, JMP NOTRD AND JUMP TO HIM. * * .20 DEC 20 TMP NOP ID SEG ADDR OF TERMINATING PROGRAM T1 NOP ADDR OF CURRENT ID SEG ADDR IN $ELTB T2 NOP 2'S COMPLE OF #_OF_COMPARES_YET_UNDONE T3 NOP EQT. # CURRENTLY BEING UNLOCKED T4 NOP TABLE LENGTH T6 NOP CURRENT # OF EMPTIES IN TABLE T7 NOP ADDR OF CURRENT LOCKED EQT.'S ENTRY T8 NOP POINTER TO $XSIO LINKED LIST TA NOP ADDR OF CURRENT EQT LINK TB NOP ADDR OF CURRENT EQT.# IN $ELTB TC NOP ADDR OF 1ST EQT LINK (I.E., EQT1) HED ** SYSTEM BASE PAGE COMMUNICATION AREA ** XI EQU 1647B . EQU 1650B ESTABLISH ORIGIN OF AREA * * SYSTEM TABLE DEFINITION * * EQTA EQU .+0 FWA OF EQUIPMENT TABLE EQT# EQU .+1 # OF EQT ENTRIES DRT EQU .+2 FWA OF DEVICE REFERENCE TABLE LUMAX EQU .+3 # OF LOGICAL UNITS (IN DRT) INTBA EQU .+4 FWA OF INTERRUPT TABLE INTLG EQU .+5 # OF INTERRUPT TABLE ENTRIES TAT EQU .+6 FWA OF TRACK ASSIGNMENT TABLE KEYWD EQU .+7 FWA OF KEYWORD BLOCK * * I/O MODULE/DRIVER COMMUNICATION * EQT1 EQU .+8 ADDRESSES EQT2 EQU .+9 EQT3 EQU .+10 OF EQT4 EQU .+11 EQT5 EQU .+12 CURRENT EQT6 EQU .+13 EQT7 EQU .+14 15-WORD EQT8 EQU .+15 EQT9 EQU .+16 EQT EQT10 EQU .+17 EQT11 EQU .+18 ENTRY EQT12 EQU .+81 EQT13 EQU .+82 EQT14 EQU .+83 EQT15 EQU .+84 * CHAN EQU .+19 CURRENT DMA CHANNEL # TBG EQU .+20 I/O ADDRESS OF TIME-BASE CARD SYSTY EQU .+21 EQT ENTRY ADDRESS OF SYSTEM TTY * * SYSTEM REQUEST PROCESSOR /'EXEC' COMMUNICATION * * RQCNT EQU .+22 # OF REQUEST PARAMETERS -1 RQRTN EQU .+23 RETURN POINT ADDRESS RQP1 EQU .+24 ADDRESSES RQP2 EQU .+25 RQP3 EQU .+26 OF REQUEST RQP4 EQU .+27 RQP5 EQU .+28 PARAMETERS RQP6 EQU .+29 RQP7 EQU .+30 (SET FOR MAXIMUM OF RQP8 EQU .+31 RQP9 EQU .+32 9 PARAMETERS) * * DEFINITION OF SYSTEM LISTS (QUEUES) * * * * DEFINITION OF EXECUTING PROGRAM ID SEGMENT' * * XEQT EQU .+39 ID SEGMENT ADDR. OF CURRENT PROG. XTEMP EQU .+41 'TEMPORARY (5-WORDS) XPRIO EQU .+46 'PRIORITY' WORD XSUSP EQU .+48 'POINT OF SUSPENSION' XA EQU .+49 'A REGISTER' AT SUSPENSION XB EQU .+50 'B REGISTER' XEO EQU .+51 'E AND OVERFLOW * * SYSTEM MODULE COMMUNICATION FLAGS * * OPATN EQU .+52 OPERATOR/KEYBOARD ATTENTION FLAG DUMMY EQU .+55 I/O ADDRESS OF DUMMY INT. CARD * * UTILITY PARAMETERS * TATLG EQU .+69 LENGTH OF TRACK ASSIGNMENT TABLE TATSD EQU .+70 # OF TRACKS ON SYSTEM DISC SECT2 EQU .+71 # SECTORS/TRACK ON LU 2 (SYSTEM) SECT3 EQU .+72 # SECTORS/TRACK ON LU 3 (AUX.) LGOTK EQU .+77 LOAD-N-GO: LU,STG TRACK,# OF TRKS LGOC EQU .+78 CURRENT LGO TRACK/SECTOR ADDRESS MPTFL EQU .+80 MEMORY PROTECT ON/OFF FLAG (0/1) * ORG * LENGTH OF RTIOC END $CIC0