ASMB,R *USE 'ASMB,R,N' (RTE-M II) OR 'ASMB,R,Z' (RTE-M III) * * IFN OPTION * NAME: $MCL * SOURCE: 92064-18023 * RELOC: 92064-16011 * PROGMR: E.J.W. * * IFZ OPTION * NAME : $MCL3 * SOURCE: 92064-18023 * RELOC: 92064-16015 * PROGMR: E.J.W. * * **************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * **************************************************************** * * IFN * BEGIN NON-DMS CODE *************** NAM $MCL,0 92064-16011 REV.1808 771028 *** END NON-DMS CODE *************** XIF IFZ ***** BEGIN DMS CODE *************** NAM $MCL3,0 92064-16015 REV.1808 771028 ******* END DMS CODE *************** XIF * * ENT $S.CL,$I.CL,$C.CL,$G.CL EXT $IDNO,$CLAS,$BLUP,$QCHK,$ALC,$LIST,$XEQ EXT $SCD3,$RTN,$ERAB SPC 1 IFN * BEGIN NON-DMS CODE *************** EXT .MVW *** END NON-DMS CODE *************** XIF SPC 1 * A EQU 0 B EQU 1 * * $S.CL NOP START-UP INITIALIZATION LDA DCLAS GET DIRECT ADDR RAL,CLE,SLA,ERA OF SYSTEM POINTERS LDA A,I STA DCLAS CLASS TABLE POINTER CMA,INA STA MCLAS NEGATIVE OF CLASS TABLE PTR JMP $S.CL,I DONE HED ** RTE-M CLASS I/O MODULE - INITIATION CALL ** * * * CLASS I/O ALLOCATE CLASS FROM HIGH END OF TABLE * IF HE DID NOT SPECIFY A CLASS. * * LDA WORD2 (A) = CONTROL WORD * LDB TEMP6 (B) = BUFFER PRIORITY OF REQUEST * JSB $I.CL CALL FROM $MIO MODULE * P+1: DO NORMAL UNBUFFERED I/O * P+2: (A) = ADDR OF NEW I/O BLOCK * JMP L.132 DO THE I/O, CLASS QUEUED ALREADY * $I.CL NOP CALLED BY $MIO MODULE STA WORD2 SAVE CONTROL WORD STB BPRIO LDA RQP1 GET ORIGINAL REQUEST CODE AND B17 KEEP ONLY LOW 4 BITS STA RQPX SAVE CLASS REQUEST CODE STA B 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 LDA B160K GET BITS 15,14, AND 13 FROM AND TEMP3,I USER'S CLASS WORD STA SECCD L.025 LDA 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 STA TEMP3,I FOR RETURN AS CLASS NUMBER * LDA $CLAS GET THE LENGTH OF THE TABLE SZA,RSS IF NO CLASSES DEFINED JMP ERR00 REJECT THE CALL 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 LDB A SET B TO ADR OF CLASS QUEUE WORD ADA MCLAS SUBTRACT THE CLASS TABLE ADDRESS IOR TEMP3,I ADD SECURITY CODE AND USER BIT STA TEMP3,I RETURN NEW CLASS WORD TO USER AND B174C GET SECURITY CODE FOR CLASS QUEUE-HEAD RAL,ERA SET THE ALLOCATED BIT STA B,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 SPC 1 IFN * BEGIN NON-DMS CODE ************** LDA B,I *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XLA B,I ******* END DMS CODE ************** XIF SPC 1 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 * * AUTOMATIC BUFFERING SECTION * CLA STA TMP6 CLEAR 2ND BUFF SIZE LDB RQP4,I CLE,SSB,RSS BUFFER HAS -CHAR SIZE ? JMP L.028 NO, SKIP BUFF SIZE CONVERT * BRS YES, CONVERT TO +WORDS CMB,INB L.028 STB TMP8 SAVE +WORDS BUFF SIZE * LDB RQPX GET THE MASKED REQUEST CODE * 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 RQP2,I IF DOUBLE BUFFER REQUEST BLF,SLB THEN RSS JMP L.03 * CLA CLEAR (A) IN CASE RQP6=0 LDB RQP6,I SSB,RSS 2ND BUFFER SIZE NEGATIVE? JMP L.029 NO, SKIP 2ND BUFF SIZE CONVERT * BRS YES, CONVERT TO +WORDS CMB,INB L.029 LDA B ADA TMP8 ADD 1ST BUFF SIZE STB TMP6 SAVE 2ND BUFF SIZE L.03 ADA .8 ADD 8 FOR BLOCK CONTROL WORDS. STA L.04 AND SET UP IN CALL * LDA N41 IF PRIORITY LT 41, ADA BPRIO SSA JMP L.031 THEN SKIP BUFFER LIMIT 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 ERR04 NEVER ANY MEMORY, REJECT. 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 * JSB $LIST CALL TO LINK PROGRAM INTO OCT 504 MEMORY SUSPENSION LIST. JMP $XEQ * * SECCD NOP N41 DEC -41 * * * SET REQUEST PARAMETERS, PROGRAM PRIORITY AND * USER BUFFER INTO TEMPORARY BLOCK. * L.06 STB L.04 SET ACTUAL BLOCK LENGTH. STA BADDR SAVE BLOCK FOR USE IN LINK CALL CCE,INA STA B SAVE ADDRESS LDA WORD2 GET CONTROL WORD IOR B140K SET THE FIELD TO 3 SPC 1 IFN * BEGIN NON-DMS CODE ************** STA B,I AND SET IN WORD 2 OF BLOCK. *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XSA B,I AND SET IN WORD 2 OF BLOCK. ******* END DMS CODE ************** XIF SPC 1 INB LDA BPRIO SET REQ PRIORITY (=1 IF LU LOCKED) SPC 1 IFN * BEGIN NON-DMS CODE ************** STA B,I IN WORD 3. *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XSA B,I IN WORD 3. ******* END DMS CODE ************** XIF SPC 1 INB LDA L.04 SET BLOCK LENGTH IN SPC 1 IFN * BEGIN NON-DMS CODE ************** STA B,I WORD 4. *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XSA B,I WORD 4. ******* END DMS CODE ************** XIF SPC 1 INB LDA CLASS SET THE CLASS SPC 1 IFN * BEGIN NON-DMS CODE ************** STA B,I WORD 5. *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XSA B,I WORD 5. ******* END DMS CODE ************** XIF SPC 1 INB THE BUFFER * L.061 LDA RQP4,I SET USER BUFFER LENGTH SPC 1 IFN * BEGIN NON-DMS CODE ************** STA B,I IN WORD 6. *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XSA B,I IN WORD 6. ******* END DMS CODE ************** XIF SPC 1 CMA,CLE,INA SET E IF ZERO LENGTH BUFFER LDA RQP5,I GET FIRST OPTIONAL WORD INB STEP TO STORE LOCATION STB TEMPW SAVE THE ADDRESS OF THE LOCATION SPC 1 IFN * BEGIN NON-DMS CODE ************** STA B,I SET IT *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XSA B,I SET IT ******* END DMS CODE ************** XIF SPC 1 INB SET FOR NEXT WORD LDA RQP6,I GET SECOND OPTIONAL WORD SPC 1 IFN * BEGIN NON-DMS CODE ************** STA B,I SET IT IN THE BUFFER *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XSA B,I SET IT IN THE BUFFER ******* END DMS CODE ************** XIF SPC 1 LDA RQP1 CPA B23 IF CLASS CONTROL,GO JMP L.078 FINISH ITS SET UP CPA B21 IF CLASS READ ADB TMP8 ADJUST BUFF ADDR 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. SPC 1 IFN * BEGIN NON-DMS CODE ************** JSB .MVW DEF TEMP3 NOP *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** LDX TEMP3 GET # WORDS TO MOVE MWI MOVE INTO SYSTEM MAP ******* END DMS CODE ************** XIF SPC 1 * L.075 LDA TMP6 GET LENGTH OF SECOND BUFFER STA TEMP3 SET FOR MOVE LDA RQP2,I GET THE REQUEST CONTROL WORD ALF,SLA IF FIRST TIME AND DOUBLE BUFFER SEZ,CCE SKIP JMP L.13 ELSE CONTINUE * SPC 1 IFN * BEGIN NON-DMS CODE ************** STB TEMPW,I SET BUFFER ADDRESS IN REQUEST *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XSB TEMPW,I SET BUFFER ADDRESS IN REQUEST ******* END DMS CODE ************** XIF SPC 1 LDA RQP5 GET USER BUFFER ADDRESS JMP L.065 GO MOVE THE BUFFER L.078 ADB N2 CORRECT B REG * L.08 LDA RQP3,I FOR CONTROL REQUEST, SET WORD 3 SPC 1 IFN * BEGIN NON-DMS CODE ************** STA B,I (PARAM) IN PLACE OF RECORD *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XSA B,I (PARAM) IN PLACE OF RECORD ******* END DMS CODE ************** XIF SPC 1 * * CLASS I/O SO SET THE CLASS QUEUE TO SHOW * ANOTHER REQUEST IS PENDING. * L.13 EQU * SPC 1 IFN * BEGIN NON-DMS CODE ************** ISZ SECCD,I *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XLA SECCD,I INA INCREMENT CLASS QUEUE COUNT BY 1 XSA SECCD,I ******* END DMS CODE ************** XIF SPC 1 LDA BADDR RETURN ADDR OF NEW BLOCK ISZ $I.CL INCRE RETURN FOR CLASS I/O INIT. L.10 JMP $I.CL,I RETURN TO $MIO * L.013 STB XTEMP,I SET 4 IN WORD1 OF TEMPS JSB $LIST PUT PROG IN WAIT OCT 503 UNTIL DEVICE COMES UP JMP $XEQ EXIT THROUGH $MDI * L.16 LDA RQRTN UPDATE THE STA XSUSP,I RETURN ADDR JMP $XEQ AND EXIT VIA $MDI * SKP SPC 3 * WORD2 NOP RQPX NOP CLASS NOP DCLAS DEF $CLAS CONFIGURED TO BE DIRECT. MCLAS NOP CONFIGURED TO BE NEGATIVE OF ABOVE. B174C OCT 17400 BITS 8-12 N8 DEC -8 N2 DEC -2 N1 DEC -1 .2 DEC 2 .3 DEC 3 .5 DEC 5 .8 DEC 8 B17 OCT 17 B21 OCT 21 B23 OCT 23 B37 OCT 37 B377 OCT 377 B140K OCT 140000 B160K OCT 160000 * BADDR NOP TEMP3 NOP TEMP4 NOP BPRIO NOP TEMPW NOP TLOG NOP STAT NOP TMP6 NOP TMP8 NOP SPC 2 SKP HED ** RTE-M CLASS I/O MODULE - COMPLETION CALL ** * 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. * * LDA TLOG (A) = TRANSMISSION LOG * LDB XXXXX (B) = CLASS QUEUE POINTER * JSB $C.CL CALL FROM $MIO * DEF TEMP3 DRIVER STATUS RETURN * RETURN. EITHER DO NEXT OR RETURN * * * $C.CL NOP STA TLOG SAVE TRANSMISSION LOG STB PTR 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 $C.CL,I GET WHERE -FROM FLAG AND STAT LDB B,I * CMB,CLE,INB IF BAD COM CODE CME SET BIT 14 ERA,CLE,RAR ROTATE TO CORRECT POSITION LDB TLOG GET THE TRANSMISSION LOG. STA PTR,I SET THE STATUS WORD STB CLTMP,I AND THE TLOG ISZ $C.CL ADJUST RETURN JMP $C.CL,I RETURN TO $MIO MODULE * C.08 LDA B TRACK DOWN JMP C.04 THE END OF THE LIST * SKP HED ** RTE-M CLASS I/O MODULE - GET CALL ** * $G.CL IS THE ENTRY POINT FOR A 'GET' EXEC CALL * * JMP $G.CL CALL FROM $MEX * * $G.CL EQU * SPC 1 IFZ ***** BEGIN DMS CODE ************** UJP *+2 ENABLE USER MAP ******* END DMS CODE ************** XIF SPC 1 LDA RQP2,I 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 * ADB DCLAS SET THE STB CLASS CLASS TABLE ADDRESS * BFCK LDB RQP4,I GET THE LENGTH CLE,SSB,RSS CONVERT TO JMP BFWDS WORDS IF BRS CHARACTERS CMB,INB SET POSITIVE AND BFWDS STB TMP8 SAVE. SPC 1 ADB RQP3 CHECK IF AREA EXTENDS ABOVE THE CMB,SEZ,CLE,INB,RSS LAST WORD ADB BKLWA OF MEMORY INB CLB,SEZ,RSS IF SO THEN JMP ERR04 ERROR 4 DIAGNOSTIC * * * G.01 LDA RQP2,I 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 SPC 1 IFN * BEGIN NON-DMS CODE ************** LDA B,I AND *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XLA B,I AND ******* END DMS CODE ************** XIF SPC 1 AND .3 ISOLATE THE REQUEST CODE STA RQP7,I RETURN IT TO USER'S IRCLS INB STEP TO STATUS WORD SPC 1 IFN * BEGIN NON-DMS CODE ************** LDA B,I GET COMPLETION STATUS. *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XLA B,I GET COMPLETION STATUS. ******* END DMS CODE ************** XIF SPC 1 STA XA,I AND SET IT IN THE A REG. INB GET THE BUFFER LENGTH SPC 1 IFN * BEGIN NON-DMS CODE ************** LDA B,I AND SET IT *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XLA B,I AND SET IT ******* END DMS CODE ************** XIF SPC 1 STA CLTMP FOR RETURN INB STEP TO USER CLASS WORD SPC 1 IFN * BEGIN NON-DMS CODE ************** LDA B,I GET IT *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XLA B,I GET IT ******* END DMS CODE ************** XIF SPC 1 AND B174C KEEP SECURITY CODE CPA SECCD MATCHES CALLER'S? RSS JMP ERR00 NO, ERROR IO00 * INB INDEX TO THE SPC 1 IFN * BEGIN NON-DMS CODE ************** LDA B,I TLOG AND *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XLA B,I TLOG AND ******* END DMS CODE ************** XIF SPC 1 STA XB,I SET IT IN THE 'B' REG INB INDEX TO THE SPC 1 IFN * BEGIN NON-DMS CODE ************** LDA B,I FIRST OPTIONAL WORD AND *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XLA B,I FIRST OPTIONAL WORD AND ******* END DMS CODE ************** XIF SPC 1 STA RQP5,I SET IT IN THE USERS BUFFER INB NOW DO THE SECOND OPTIONAL WORD SPC 1 IFN * BEGIN NON-DMS CODE ************** LDA B,I *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XLA B,I ******* END DMS CODE ************** XIF SPC 1 STA 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 USE LESSOR OF THE TWO SSA,RSS COUNTS LDB TEMP3 USE QUEUE COUNT IF SMALLER SSB IF COUNT LESS THAN ZERO THEN JMP G.05 THEN SKIP MOVE * G.03 ISZ TEMP4 STEP THE BUFFER ADDRESS. LDA TEMP4 (A)= SOURCE SPC 1 IFN * BEGIN NON-DMS CODE ************** STB WORD2 SAVE COUNT LDB RQP3 (B)= DESTINATION JSB .MVW DEF WORD2 NOP *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** CBX GET MOVE COUNT LDB RQP3 GET DESTINATION MWF MOVE FROM SYSTM TO USER ******* END DMS CODE ************** XIF SPC 1 G.05 LDA RQP2,I IF SAVE RAL,RAL QUEUE OPTION SLA,ELA THEN JMP L.16 THEN EXIT * SPC 1 IFN * BEGIN NON-DMS CODE ************** LDA PTR,I ELSE *** END NON-DMS CODE ************** XIF SPC 1 IFZ ***** BEGIN DMS CODE ************** XLA PTR,I ELSE ******* END DMS CODE ************** XIF SPC 1 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 RQP2,I 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 * * SCEDT ERB,RBR CLEAR THE BIT AND STB CLASS,I RESET THE CLASS HEAD LDA CLASS GET HEAD ADDRESS TO A AND JSB $SCD3 RESCHEDULE THE WAITER IF ANY LDA $LIST WAS THERE ONE?? CLE,SZA JMP ERR10 YES ERROR GO ABORT * JMP G.065 NO. MUST HAVE BEEN ABORTED, CONTINUE SPC 1 SKP ERR00 CLB,RSS ILLEGAL CLASS# OR SECURITY CODE ERR01 CLB,INB INSUFFICIENT # OF PARAMETERS RSS ERR04 LDB .4 ILLEGAL BUFFER ADDRESS RSS ERR10 LDB B400 DOUBLE REQUEST ON SAME CLASS LDA ERIO (A) = ASCII "IO" JMP $ERAB WRITE MESSAGE AND EXIT TO $MDI * ERIO ASC 1,IO .4 DEC 4 B400 OCT 400 SKP . EQU 1650B ESTABLISH ORIGIN OF AREA * * SYSTEM TABLE DEFINITION * * * * I/O MODULE/DRIVER COMMUNICATION * EQT1 EQU .+8 ADDRESSES EQT5 EQU .+12 CURRENT * * * SYSTEM REQUEST PROCESSOR /'EXEC' COMMUNICATION * * 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 8 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) XSUSP EQU .+48 'POINT OF SUSPENSION' XA EQU .+49 'A REGISTER' AT SUSPENSION XB EQU .+50 'B REGISTER' * BKLWA EQU .+87 LWA OF MEMORY IN BACKGROUND * * ORG * LENGTH OF MODULE END $I.CL