ASMB,R,L,C
HED * <#REQU> - CLASS REQUEUEING * (C) HEWLETT-PACKARD CO. 1979 *
NAM #REQU,30 91740-16028 REV 1913 790131
SPC 1
ENT #REQU,#QCNT,#PRLX
EXT $CLAS,$DLAY,$LIBR,$LIBX,$OPSY,$SCD3,.ENTP,DRTEQ
* NAME: #REQU
* SOURCE: 91740-18028
* RELOC: 91740-16028
* PGMR: C. HAMILTON [ 1/31/79 ]
*
* ***************************************************************
* * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. 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. *
* ***************************************************************
*
* #REQU IS A CORE-RESIDENT SYSTEM LIBRARY MODULE, USED BY THE
* DISTRIBUTED SYSTEMS SOFTWARE PACKAGE IN THE RTE-M DISC-BASED
* RTE OPERATING SYSTEMS ENVIRONMENTS. ITS PURPOSE IS TO PROVIDE A FAST,
* CORE-SAVING METHOD FOR TRANSFERRING PREVIOUSLY-QUEUED CLASS I/O
* BUFFERS FROM ONE CLASS TO ANOTHER CLASS. ALTERNATELY, IT CAN BE
* USED TO RE-QUEUE THE COMPLETED CLASS-TRANSACTION ONTO AN EQUIPMENT
* TABLE ENTRY.
*
* THE ADVANTAGES GAINED THROUGH THE USE OF <#REQU> INCLUDE:
* 1. ONCE GRANTED ADEQUATE SYSTEM AVAILABLE MEMORY(SAM) FOR THE INITIAL
* CLASS READ OPERATION, INCOMING TRANSACTIONS WILL NOT BE IMPEDED
* IN THEIR PROGRESSION THROUGH THE VARIOUS NETWORK-PROCESSING
* MODULES, DUE TO INABILITY TO ALLOCATE SUFFICIENT S.A.M. FOR USE
* IN THE EXCHANGE OF DATA BETWEEN THE NETWORK PROGRAMS. THE INITIALLY
* ALLOCATED S.A.M. BUFFER IS RETAINED FOR THE LIFE OF THE
* TRANSACTION, AND IS SIMPLY EXCHANGED AMONGST THE VARIOUS MODULES.
* 2. INTERMEDIATE PROCESSORS REQUIRE ONLY MINIMUM SIZE LOCAL BUFFERS.
* THE QUEUEING ROUTINES NEED NOT ALLOCATE BUFFER SPACE FOR THE
* ENTIRE TRANSACTION, PRIOR TO PASSING IT ON TO THE NEXT
* PROCESSOR'S CLASS.
* 3. SYSTEM OVERHEAD IS MINIMIZED, DUE TO THE AVOIDANCE OF INTER-
* MEDIATE ALLOCATION/DE-ALLOCATION OF S.A.M., AND ALSO, BY
* AVOIDING WORD-MOVE TRANSFERS BETWEEN USER'S BUFFERS AND S.A.M.
*
* #REQU OPERATION:
*
* 1. ON FIRST ENTRY, CONFIGURE THE MODULE.
* A. OBTAIN A DIRECT ADDRESS FOR THE CLASS TABLE.
* B. IF BIT #1 OF $OPSY =1, THEN OP-SYSTEM USES DMS HARDWARE,
* REQUIRING THE USE OF DMS FIRMWARE MACRO INSTRUCTIONS.
* C. IF DMS, THEN CLEAR THE DMS-BYPASSING 'JMP' INSTRUCTIONS.
* D. IF NON-DMS, ALLOW 'JMP' INSTRUCTIONS TO REMAIN.
* E. CLEAR THE PATH TO THE INITIALIZATION ROUTINE.
*
* 2. GET PARAMETERS & SAVE LOCALLY, IN PREPARATION FOR DMS MAP SWITCH.
* A. IF PRIORITY PARAMETER NEGATIVE, REJECT; IF MISSING, USE 32767.
* B. IF DMS SYSTEM, SAVE MAP STATUS & SWITCH TO SYSTEM MAP.
*
* 3. GET THE SOURCE-CLASS PARAMETER & CHECK ITS VALIDITY.
* A. IF 0, OR GREATER THAN MAX. CLASS NO., THEN--ERROR -1!
* B. COMPUTE & SAVE CLASS-TABLE ENTRY ADDRESS.
* C. IF ENTRY =0, THEN NOT ASSIGNED--ERROR -2!
* D. IF SOURCE-CLASS, VERIFY THAT SOMETHING IS QUEUED; ELSE--ERROR -2!
* E. SAVE ADDRESS OF QUEUED ENTRY (ADDRESS POINTS TO S.A.M.)
* F. TRACK DOWN & SAVE CLASS-HEADER ADDRESS; IF LINK WORD=0: ERROR -9!
* G. COMPARE SECURITY CODES; IF MIS-MATCH--ERROR -3!
* H. ENSURE THAT NO ONE IS WAITING ON SOURCE-CLASS; ELSE--ERROR -4!
* I. RETURN TO MAINLINE PROCESSING.
*
* 4. SAVE SOURCE-CLASS ADDRESS POINTERS.
*
* 5. CHECK VALIDITY OF DESTINATION-CLASS PARAMETER (VIA 3.A.).
* A. IF -1, RESET NEG. BLOCK SIZE VALUE TO POS.; IGNORE OTHER PARAMS.
* B. IF NEW BLOCK COUNT > MAX. NO. OF BLOCKS ALLOWED: ERROR -10!
*
* 6. CHECK FOR 'LU' SPECIFICATION.
* A. IF NOT SUPPLIED, GO TO 10. TO DE-QUEUE THE COMPLETED REQUEST.
* B. IF SPECIFIED, CHECK FOR VALID LU (NON-ZERO EQT,DEVICE NOT DOWN,
* & NOT LINKED TO A DISC FILE); ELSE--ERROR -5!
* C. SAVE THE EQT ADDRESS.
*
* 7. CHECK FOR 'CONWD' SPECIFICATION.
* A. IF NOT SUPPLIED, GO TO 10. TO DE-QUEUE THE COMPLETED REQUEST.
* B. IF SPECIFIED,VERIFY THAT REQUEST CODE(BITS#1-0) #0--ELSE ERROR -6.
* C. IF CONTROL REQUEST, SKIP LENGTH CHECKS. GO TO 10.
*
* 8. CHECK FOR-AND VERIFY-USER BUFFER LENGTH/CONTROL PARAMETER SPEC.
* A. IF NOT SUPPLIED(OR =100000B),GO TO 10.TO DE-QUEUE CURRENT REQUEST.
* B. VERIFY THAT USER'S LENGTH < = AVAILABLE BUFFER IN S.A.M. BLOCK.
* C. IF SIZE EXCEEDED: ERROR -8!
*
* 9. CHECK FOR REQUEST TO OVERLAY THE OPTIONAL PARAMETERS.
* A. IF NOT SPECIFIED(OR =100000B), GO TO 10. TO DE-QUEUE THE REQUEST;
*
* 10. DE-QUEUE COMPLETED CLASS REQUEST FROM SOURCE-CLASS QUEUE.
* A. RE-LINK REMAINING ENTRIES BACK INTO SOURCE-CLASS QUEUE.
*
* 11. CHECK (AGAIN) FOR 'LU' SPECIFICATION.
* A. IF NOT SUPPLIED, GO TO 13. TO RE-QUEUE THE REQUEST.
* B. IF LU & CONWORD WERE SUPPLIED, REPLACE CONWORD IN COMPLETED
* REQUEST WITH USER-SUPPLIED PARAMETER.
* C. ENSURE 'T'-FIELD OF CONWORD =3, AND THAT BIT #11 =0 (FOR RTIOC).
* D. OVERLAY WORD #3 OF COMPLETED REQUEST WITH THE USER'S PRIORITY.
* --IF NONE, USE LOWEST PRIORITY VALUE: 32767. NEGATIVE: ERROR -7!
* E. IF WRITE-REQUE, NEGATE BLOCK SIZE(WORD #4) TO PREVENT RTIOC'S
* ARBITRARY RELEASE OF THE DATA BUFFER. IF ALREADY NEG. MAKE POS.
* F. REPLACE WORD #5 OF COMPLETED REQUEST WITH THE DESTINATION-
* CLASS PARAMETER.
* G. IF BL/CP SUPPLIED, REPLACE WORD#6 WITH USER'S PARAMETER.
* H. IF OPTIONAL PARAMETERS SUPPLIED, REPLACE WORDS#7,8 WITH USER'S.
* I. ADD 1 TO THE DESTINATION-CLASS PENDING REQUEST COUNT, IF < 255.
*
*
SKP
* 12. LINK THE NEW REQUEST (ACCORDING TO PRIORITY) INTO THE EQT QUEUE.
* A. IF THE EQT IS CURRENTLY ACTIVE, THE DEED IS DONE--RETURN.
* B. IF INACTIVE, INITIATE I/O OPERATION VIA $DLAY IN RTIOC & RETURN.
*
* 13. RE-QUEUE THE COMPLETED REQUEST ONTO THE DESTINATION-CLASS.
* A. LINK NEW REQUEST TO END OF DESTINATION-CLASS QUEUE.
* B. SET CONWD REQ. CODE(BITS#1,0)=0 TO INDICATE CLASS-TO-CLASS REQUE.
* C. IF NEG. BLOCK LENGTH IN WORD#4 OF CLASS HEADER, MAKE IT POSITIVE.
* D. OVERLAY WORD #5 OF COMPLETED REQUEST WITH DESTINATION-CLASS NO.
* E. IF NEWLY-ADDED REQUEST IS ONLY ENTRY IN QUEUE, THEN GO TO 13.G
* TO CHECK FOR A WAITING PROGRAM.
* F. IF OTHER ENTRIES ARE PRESENT, THEN RETURN TO THE CALLER.
* G. CHECK CLASS-HEADER FOR PROGRAM-WAITING BIT(#14); IF NONE, RETURN.
* H. IF A PROGRAM IS WAITING, SCHEDULE IT AND RETURN TO THE CALLER.
SKP
* JSB #REQU * * * #REQU CALLING SEQUENCE * * *
* DEF *+3 [OR *+3+N (N=1,TO 6 OPTIONAL PARAMETERS)]
* DEF SORCE SOURCE-CLASS NUMBER
* DEF DESTN DESTINATION-CLASS NUMBER
* [DEF LU ] OPTIONAL LOGICAL UNIT NUMBER
* [DEF CONWD] OPTIONAL DRIVER CONTROL WORD
* [DEF PRIOR] OPTIONAL PRIORITY VALUE
* [DEF BL/CP] OPTIONAL BUFFER LENGTH OR CONTROL PARAMETER
* [DEF IRTN1] OPTIONAL FIRST GET-RETURN-PARAMETER
* [DEF IRTN2] OPTIONAL SECOND GET-RETURN-PARAMETER
* < RETURN > RETURN--NORMAL: =0 ERROR: =-N, =0
*
* WHERE:
* SORCE = CLASS NUMBER, FROM WHICH THE FIRST-QUEUED COMPLETED REQUEST
* IS TO BE REMOVED.
*
* DESTN = CLASS NUMBER, ONTO WHICH THE COMPLETED REQUEST IS TO BE
* RE-QUEUED OR, THE CLASS WHICH IS TO RECEIVE I/O COMPLETION
* INFORMATION, WHEN THE REQUEST HAS BEEN RE-QUEUED ONTO
* AN EQUIPMENT TABLE ENTRY. IF -1, OTHER PARAMETERS ARE IGNORED
* AND THE CURRENTLY-QUEUED SOURCE-CLASS BLOCK SIZE IS MADE POS.
*
* LU = OPTIONAL LOGICAL UNIT NUMBER, ONTO WHOSE ASSOCIATED EQT
* ENTRY, THE COMPLETED SOURCE-CLASS REQUEST IS TO BE RE-
* QUEUED FOR INITIATION OF A NEW CLASS I/O OPERATION,
* UTILIZING THE EXISTING DATA OR BUFFER SPACE.
*
* * NOTE: IF LU NOT SUPPLIED, CLASS TO CLASS RE-QUEUEING WILL
* BE PERFORMED.
*
* CONWD = OPTIONAL DRIVER CONTROL WORD, WHICH MAY BE SUPPLIED AS
* THE NEW OPERATIONAL SPECIFICATION, FOR RE-QUEUEING THE
* REQUEST ONTO AN EQT. [ LU MUST BE SPECIFIED ].
*
* BITS #15,14 = DON'T CARE (#REQU SETS EACH =1).
* BIT #13 = MSB OF SUBCHANNEL NUMBER.
* BIT #12 = 'Z'-BIT (OPTIONAL BUFFER SPECIFICATION).
* BIT #11 = NOT USED (FORCED TO 0, FOR RTIOC).
* BITS #10-6 = DRIVER SUB-FUNCTION SPECIFICATION.
* BITS #5-2 = REMAINDER OF SUBCHANNEL NUMBER.
* BITS #1-0 = REQUEST CODE: 1,2,3.
*
* PRIOR = OPTIONAL PRIORITY (0-32767), USED TO ESTABLISH RELATIVE
* POSITION OF NEWLY-LINKED REQUEST IN THE EQT QUEUE.
* IF NOT SUPPLIED, LOWEST PRIORITY (32767) IS USED.
* [ IGNORED, IF LU & CONWD PARAMETERS NOT SPECIFIED ]
*
* * NOTE: FOR THE FOLLOWING OPTIONAL PARAMETERS, A VALUE =100000B
* MAY BE SUPPLIED-AS A PLACE HOLDER-TO SPECIFY THAT THE
* CORRESPONDING CLASS-HEADER ELEMENT IS NOT TO BE CHANGED.
*
* BL/CP = OPTIONAL BUFFER LENGTH/CONTROL PARAMETER FOR A DRIVER.
*
* IRTN1 = OPTIONAL PARAMETER WHICH MAY BE RETURNED ON NEXT CLASS-GET.
* IRTN2 = OPTIONAL PARAMETER WHICH MAY BE RETURNED ON NEXT CLASS-GET.
SKP
*
* #REQU ERROR INDICATIONS:
*
* ERROR DETECTION WILL RESULT IN A RETURN TO THE CALLER, WITH THE
* REQUESTED ACTION NOT PERFORMED.
*
* THE -REGISTER WILL ALWAYS =0. IS NEGATIVE, AS FOLLOWS:
*
* = -1: CLASS NUMBER =0, OR IS GREATER THAN THE MAXIMUM NUMBER
* OF CLASSES AVAILABLE.
*
* = -2: CLASS NOT ASSIGNED, OR NOTHING IS QUEUED ON THE SOURCE-CLASS.
*
* = -3: INVALID CLASS SECURITY CODE; OR PENDING REQUESTS = 255 (MAX).
*
* = -4: PROGRAM IS WAITING FOR SOURCE CLASS ENTRY (CANNOT DE-QUEUE
* THE ENTRY).
*
* = -5: LOGICAL UNIT NUMBER INVALID, OR THE DEVICE IS DOWN.
*
* = -6: CONWD REQUEST CODE (BITS#1-0) =0.
*
* = -7: NEGATIVE PRIORITY CODE.
*
* = -8: BUFFER LENGTH(BL/CP) EXCEEDS CLASS BUFFER SIZE.
*
* = -9: CLASS QUEUE IMPROPERLY LINKED (LINK WORD =0).
*
* =-10: NEW BLOCK WILL EXCEED MAX. BLOCKS ALLOWED FOR DEST. CLASS.
*
SKP
SORCE NOP SOURCE CLASS NUMBER.
DESTN NOP DESTINATION CLASS NUMBER.
LU NOP OPTIONAL LOGICAL UNIT NUMBER.
CONWD NOP OPTIONAL DRIVER CONTROL WORD.
PRIOR NOP OPTIONAL PRIORITY CODE.
BL/CP NOP OPTIONAL BUFFER LENGTH/CONTROL PARAMETER.
IRTN1 NOP OPTIONAL GET-RETURN-PARAMETER #1.
IRTN2 NOP OPTIONAL GET-RETURN-PARAMETER #2.
SUP SUPPRESS EXTRANEOUS LISTING.
#REQU NOP ENTRY/EXIT.
JSB $LIBR DECLARE THIS TO BE
NOP A PRIVILEGED ROUTINE.
JSB .ENTP OBTAIN DIRECT ADDRESSES
PRPTR DEF SORCE FOR ALL PARAMETERS.
CLA =0 FOR 'CONFG' & 'ERR' INITIALIZATION
INIT JMP CONFG CONFIGURE: RTE-II/III; NOP,THEREAFTER.
STA ERR INITIALIZE THE ERROR COUNT =0.
LDB DM8 INITIALIZE A
STB TEMP COUNTER FOR PARAMETER PROCESSING.
LDB PRPTR GET POINTER TO PARAMETER ADDRESSES.
*
PLOOP LDA B,I GET THE PARAMETER ADDRESS (OR ZERO).
CCE,SZA,RSS PREPARE TO IGNORE PARAMETER. SUPPLIED?
SLA,ERA NO. SET IGNORE-FLAG(100000B) & SKIP.
LDA A,I YES. GET THE USER-SUPPLIED PARAMETER.
STA B,I SAVE PARAMETER (OR 100000B), LOCALLY.
INB ADVVANCE PARAMETER ADDRESS POINTER.
ISZ TEMP ALL PARAMETERS PROCESSED?
JMP PLOOP NO. CONTINUE PROCESSING.
*
LDA PRIOR GET THE CALLER-SPECIFIED PRIORITY.
CPA BIT15 NOT SUPPLIED/IGNORE ?
LDA LOWPR YES. USE DEFAULT VALUE: 32767 (LOWEST).
SSA IF PRIORITY PARAMETER IS NEGATIVE,
JMP ERR7 THEN THE REQUEST CANNOT BE HONORED.
STA PRIOR ESTABLISH USER'S OR DEFAULT PRIORITY.
*
MAPSW JMP BYDMS BYPASS MAP CODE:NON-DMS / NOP:DMS
RSA GET CURRENT MAP STATUS.
RAL,RAL POSITION CURRENT STATUS FOR RESTORATION.
STA DMSTS SAVE FOR RESTORATION, UPON EXIT.
SJP BYDMS ENABLE SYSTEM MAP, AND CONTINUE.
*
BYDMS LDA SORCE GET THE SOURCE CLASS-WORD.
JSB CLCHK GO TO DETERMINE ITS VALIDITY.
DLD BLKAD SAVE THE SOURCE-CLASS
DST SBLK ADDRESS POINTERS.
*
LDA DESTN GET THE DESTINATION CLASS-WORD.
CPA DM1 IF THE PARAMETER IS =-1, THEN
JMP RESET GO TO RESET POSSIBLE NEG. BLOCK SIZE;
JSB CLCHK ELSE, GO TO VERIFY ITS VALIDITY.
*
SKP
*
LDB QCNT GET BLOCK COUNT FOR DESTINATION CLASS.
ADB #QCNT SUBTRACT MAXIMUM ALLOWABLE COUNT.
CLE,SSB,RSS IF MAXIMUM EXCEEDED, REJECT THE REQUEST.
JMP ERR10 THEN ANOTHER BLOCK IS NOT ACCEPTABLE.
*
LDA LU GET THE USER-SPECIFIED LU, IF ANY.
CPA BIT15 IF NONE WAS SUPPLIED, THEN
JMP DEQUE BYPASS LU VERIFICATION.
JSB DRTEQ GO TO CHECK THE LU'S VALIDITY,
DEF *+4 AND TO OBTAIN THE EQT ADDRESS
DEF LU FOR ITS ASSOCIATED EQT ENTRY.
DEF TEMP IGNORE THE DRT CONTENTS,
DEF EQTAD AND RETAIN THE EQT ADDRESS.
SSB,RSS IF INVALID, SKIP TO REPORT THE ERROR.
SZB,RSS RE-QUEUEING ON EQT#0 IS ALSO INVALID!
JMP ERR5 * INFORM THE CALLER OF THE ERROR!
*
ADB D4 POINT TO WORD #5 OF THE EQT ENTRY.
LDA B,I GET THE CONTENTS.
RAL,SLA IF THE DEVICE IS BUSY, OR IT IS
JMP *+3 WAITING FOR DMA--CONTINUE;
SSA ELSE, IF IT IS DOWN,
JMP ERR5 THEN REJECT THE REQUEST!
*
AND B74K ISOLATE THE EQUIPMENT TYPE CODE.
CPA B30K IF THE EQT IS LINKED TO A DISC FILE,
JMP ERR5 * ERROR: INVALID LU!
*
LDA HEDAD,I GET THE DESTINATION-CLASS HEADER.
AND B377 ISOLATE THE PENDING REQUEST COUNT.
CPA B377 IF IT HAS ALREADY REACHED MAXIMUM (255),
JMP ERR3 THEN REJECT THE NEW REQUEST!
*
LDA CONWD GET THE CONTROL WORD--IF ANY.
CPA BIT15 WAS IT SPECIFIED?
JMP DEQUE NO. IGNORE BUFFER CHECKS.
*
AND D3 ISOLATE THE REQUEST CODE(BITS#1-0).
SZA,RSS IF NOT SPECIFIED,
JMP ERR6 THEN REJECT THE REQUEST!
*
CPA D3 IF THIS IS A CONTROL REQUEST,
JMP DEQUE THEN LENGTH CHECKING IS NOT NEEDED.
*
LDA BL/CP GET THE USER'S SPECIFIED LENGTH.
CPA BIT15 IGNORE THE PARAMETER?
JMP DEQUE YES. GO TO DE-QUEUE THE REQUEST.
*
SSA,RSS IF CHARACTERS WERE SPECIFIED, SKIP;
CMA,INA,RSS ELSE, FORM NEGATIVE WORD COUNT & SKIP;
ARS CONVERT CHARACTERS TO NEGATIVE WORDS,
SZA,RSS AND IF THE LENGTH =0,
JMP DEQUE NO LENGTH CHECKING IS REQUIRED.
*
LDB SBLK GET THE CONTROL-BLOCK ADDRESS.
ADB D3 POINT TO THE BLOCK-SIZE WORD(#4).
LDB B,I GET THE TOTAL BLOCK SIZE.
SSB IF THE BLOCK SIZE IS ALREADY NEGATIVE,
CMB,INB MAKE IT POSITIVE, FOR THE LENGTH CHECK.
ADB DM8 SUBTRACT HEADER: REMAINDER= BUFFER SIZE.
ADA B ADD USER'S SIZE TO ACTUAL BUFFER SIZE.
SSA USER'S REQUEST > ACTUAL BUFFER SIZE?
JMP ERR8 YES! REJECT THE REQUEST: ERROR -8.
*
SKP
DEQUE LDA SCLAS IF THE REQUEST IS TO
LDB SBLK RE-QUEUE ONTO THE SAME CLASS,
CPB HEDAD AND ONLY ONE ENTRY IS PRESENT,
STA HEDAD THEN POINT TO CORRECT HEADER ADDRESS.
LDA B,I DE-QUEUE THE COMPLETED CLASS REQUEST
STA SCLAS,I FROM THE SOURCE-CLASS QUEUE.
LDA LU GET THE USER-SPECIFIED LU, IF ANY.
CPA BIT15 IF NONE WAS SUPPLIED, THEN
JMP REQUE RE-QUEUE REQUEST ON DESTINATION CLASS.
*
CLE,INB POINT TO CONWORD IN COMPLETED REQUEST.
LDA CONWD GET THE OPTIONAL CONTROL WORD.
CPA BIT15 IF NONE WAS SUPPLIED,
JMP GETPR THEN IGNORE IT;
AND CLR11 ELSE, ENSURE THAT BIT #11 IS CLEAR,
IOR CLAST THAT T-FIELD =3,
STA B,I AND USE THE SUPPLIED PARAMETER.
CCE,SLA SET =1 FOR WRITE REQUEST.
CLA,CLE SET =0 FOR READ/CONTROL.
*
GETPR LDA PRIOR GET THE EQT QUEUEING PRIORITY NUMBER.
INB POINT TO WORD #3 OF COMPLETED REQUEST.
STA B,I STORE THE PRIORITY INTO THE ENTRY.
INB POINT TO THE BLOCK SIZE (WORD#4).
LDA B,I GET THE BLOCK LENGTH, AND MAKE IT
CMA,SSA,INA NEGATIVE -OR POSITIVE, IF ALREADY NEG.
SEZ IF IT'S A WRITE REQUEST, SAVE NEG. SIZE
STA B,I TO PREVENT 'RTIOC' FROM RELEASING S.A.M.
*
LDA DESTN STORE THE CLASS-WORD FOR THE PROGRAM
CLE,INB TO BE SCHEDULED ON COMPLETION, INTO
STA B,I THE 5TH WORD OF THE CLASS REQUEST.
INB POINT TO WORD#6 OF COMPLETED REQUEST.
LDA BL/CP GET THE BUFFER LENGTH/CONTROL PARAMETER.
CPA BIT15 IGNORE THE PARAMETER?
JMP *+2 YES. GO TO CHECK NEXT PARAMETER.
STA B,I NO. OVERLAY WORD#6 WITH CALLER'S VALUE.
INB POINT TO WORD #7 OF COMPLETED REQUEST.
LDA IRTN1 GET OPTIONAL GET-RETURN-PARAMETER #1.
CPA BIT15 IGNORE IT?
JMP *+2 YES. GO TO CHECK FOR FINAL PARAMETER.
STA B,I NO. OVERLAY WORD#7 OF COMPLETED REQUEST.
INB POINT TO LAST WORD OF COMPLETED REQUEST.
LDA IRTN2 GET THE OPTIONAL GET-RETURN-PARAMETER.
CPA BIT15 IGNORE IT?
JMP *+2 YES. GO ADVANCE PENDING-REQUEST COUNT.
STA B,I NO. OVERLAY WORD#8 OF COMPLETED REQUEST.
*
ISZ HEDAD,I ADD 1 TO THE PENDING-REQUEST COUNT.
JSB LINK LINK INTO EQT QUEUE BY PRIORITY.
SEZ IF THE EQT WAS ACTIVE,
JMP EXIT RETURN TO THE CALLER; ELSE,
LDA EQTAD GET THE EQT ADDRESS, AND
JSB $DLAY GO TO INITIATE THE I/O OPERATION.
JMP EXIT RETURN--OPERATION COMPLETE.
*
REQUE LDA HEDAD,I GET DESTINATION CLASS-HEADER.
STA B,I END-OF-QUEUE = 1RST WORD OF NEW ENTRY.
STB HEDAD,I LINK THE NEW ENTRY AT END-OF-QUEUE.
*
INB POINT TO THE CONWORD.
LDA B,I GET THE CONWORD.
AND D3 SET THE
XOR B,I REQUEST CODE =0,
STA B,I TO INDICATE CLASS-TO-CLASS REQUE.
*
ADB D2 POINT TO THE BLOCK SIZE(WORD#4).
LDA B,I GET THE BLOCK LENGTH. IF IT IS
CMA,SSA,INA,RSS NEGATIVE, MAKE IT POSITIVE, AND
STA B,I RESTORE THE BLOCK SIZE VALUE.
INB POINT TO THE CLASS-WORD IN THE NEW ENTRY.
LDA DESTN GET THE DESTINATION CLASS-WORD,
STA B,I AND REPLACE THE OLD WITH THE NEW.
*
LDA CLTBA IF THE CLASS-HEADER IS THE ONLY THING
CPA HEDAD IN THE CLASS-TABLE ENTRY, THEN
RSS ANY WAITING PROGRAM MUST BE SCHEDULED;
JMP EXIT ELSE: OPERATION COMPLETE--RETURN.
*
LDB SBLK,I GET THE CLASS-HEADER FROM ITS NEW LOCN.
RBL,CLE,ELB POSITION WAIT-BIT(#14) TO .
SEZ,RSS IF SOMEONE IS WAITING, SKIP TO SCHEDULE;
JMP EXIT ELSE: OPERATION COMPLETE--RETURN.
*
RBR,RBR REPOSITION CLASS-HEADER (LESS BIT#14),
STB SBLK,I AND RESTORE IT TO ITS RIGHTFUL PLACE.
*
JSB $SCD3 SCHEDULE WAITER(=CLASS-TABLE ADDRESS)
*
EXIT CLA NORMAL EXIT: =0, =0
ERREX CLB ERROR EXIT: =-N, =0
STB SORCE CLEAR ALL OF
STB DESTN THE PARAMETERS,
STB LU IN PREPARATION
STB CONWD FOR NEXT ENTRY
STB PRIOR TO THE ROUTINE.
STB BL/CP
STB IRTN1
STB IRTN2
*
EXIT2 JMP LBEX BYPASS MAP CODE: NON-DMS / NOP: DMS
JRS DMSTS LBEX *** RESTORE THE APPROPRIATE MAPS. ***
*
LBEX JSB $LIBX RETURN TO THE CALLER, VIA THE
DEF #REQU RTE PRIVILEGED ROUTINE PROCESSOR.
*
SKP
* ERROR PROCESSING SECTION.
SPC 1
ERR10 ISZ ERR -10: NEW BLOCK WIL EXCEED #QLIM WD. CNT.
ERR9 ISZ ERR -9: CLASS QUEUE IMPROPERLY LINKED.
ERR8 ISZ ERR -8: BUFFER LENGTH > CLASS BUFFER SIZE.
ERR7 ISZ ERR -7: NEGATIVE PRIORITY CODE.
ERR6 ISZ ERR -6: CONWD REQUEST CODE =0 (BITS#1-0).
ERR5 ISZ ERR -5: INVALID LU OR DOWN DEVICE.
ERR4 ISZ ERR -4: PGM. WAITING ON SOURCE--CAN'T DEQUE!
ERR3 ISZ ERR -3: INVALID CLASS SECURITY CODE.
ERR2 ISZ ERR -2: CLASS NOT ASSIGNED, OR NO Q (SOURCE)
ERR1 ISZ ERR -1: CLASS =0, OR > MAX. NO. ALLOCATED.
LDA ERR GET THE ERROR NUMBER,
CMA,INA AND MAKE IT NEGATIVE.
JMP ERREX GO TO RETURN THE ERROR-REPORT.
*
SPC 3
* RESET CURRENTLY-QUEUED SOURCE-CLASS BLOCK SIZE WORD TO A POSITIVE VALUE.
*
*[RE-QUEUED CLASS WRITES HAVE NEGATIVE BLOCK SIZE TO PREVENT BUFFER RELEASE]
*
RESET LDB SBLK GET THE BLOCK ADDRESS.
ADB D3 POINT TO THE BLOCK SIZE (WORD#4).
LDA B,I GET THE BLOCK SIZE VALUE.
CMA,SSA,INA,RSS IF IT'S NEGATIVE, MAKE IT POSITIVE,
STA B,I AND RESTORE THE CORRECT VALUE.
JMP EXIT RETURN.
*
SKP
*
CLCHK NOP ENTRY/EXIT: CLASS VALIDITY CHECKING
STA TEMP SAVE THE CLASS-WORD FOR LATER USE.
AND B377 ISOLATE THE CLASS NUMBER
STA B SAVE IT FOR A TABLE INDEX.
CMA,CLE,INA,SZA,RSS IF THE NUMBER IS ZERO,
CLE,RSS PREPARE FOR AN ERROR-EXIT.
ADA $CLAS IF IT IS GREATER THAN MAXIMUM,
CLA,SEZ,RSS THEN TAKE THE
JMP ERR1 ERROR EXIT.
*
STA QCNT INITIALIZE CLASS QUEUE BLK CNT. =0.
ADB DFCLS COMPUTE, AND SAVE,
STB CLTBA THE CLASS-TABLE ENTRY ADDRESS.
*
LDA TEMP GET THE CLASS WORD.
LDB B,I GET THE CLASS-TABLE ENTRY.
CPA SORCE IF THE SOURCE-CLASS IS BEING CHECKED,
SSB,RSS THEN CONFIRM THAT SOMETHING IS QUEUED.
SZB,RSS ALSO VERIFY THAT THE CLASS IS ASSIGNED.
JMP ERR2 * ERROR: NOT ASSIGNED OR NO QUEUE.
*
SSB IF THIS IS THE CLASS-HEADER, THEN
LDB CLTBA GET THE CORRECT ADDRESS.
STB BLKAD SAVE THE CLASS-QUEUE POINTER, IF ANY.
*
LOOP ISZ QCNT COUNT NUMBER OF QUEUED BLOCKS.
NOP
LDA B,I TRACK DOWN
SSA DOWN THE
JMP SAVAD CLASS HEADER.
SZA,RSS IF THE LINK WORD IS ZERO,
JMP ERR9 THEN THE CLASS QUEUE IS CORRUPT!
*
LDB B,I LAST QUEUE NOT YET LOCATED,
JMP LOOP SO CONTINUE THE SEARCH.
*
SAVAD STB HEDAD SAVE THE CLASS-HEADER ADDRESS.
CPB CLTBA IF NOTHING IS QUEUED, THEN
JMP GETSC THE WORD COUNT REMAINS =0;
*
GETSC LDA TEMP ISOLATE THE
AND SCMSK USER-SPECIFIED SECURITY CODE,
STA B AND SAVE IT FOR COMPARISON.
LDA HEDAD,I GET THE CLASS-HEADER.
AND SCMSK ISOLATE ITS SECURITY CODE.
CPA B IF THEY COMPARE, THEN
RSS ALL'S WELL--PROCEDE;
JMP ERR3 ELSE, REPORT THE ERROR!
*
LDA TEMP GET THE CLASS-WORD, AGAIN.
CPA SORCE IF IT'S THE SOURCE-CLASS, THEN
RSS SKIP TO CHECK FOR WAITERS;
JMP CLCHK,I ELSE, RETURN TO THE CALLER.
*
LDB HEDAD,I GET THE CLASS-HEADER.
RBL POSITION THE WAIT-BIT(#14) FOR TEST.
SSB IF SOMEONE IS WAITING,
JMP ERR4 THEN RE-QUEUEING IS IMPROPER!
*
JMP CLCHK,I VALID CLASS: RETURN--POINTERS SET.
*
QCNT NOP CLASS QUEUE BLOCK COUNT ACCUMULATION.
#PRLX EQU 0 LU FOR PROGL MESSAGES: DEFAULT = NONE.
#QCNT DEC -11 -[(MAX. ALLOWABLE QUEUED BLOCKS)+1]