ibm:vm370-lib:rscs:dmtasy.assemble_src
Table of Contents
DMTASY Source
References
- Fixes Applied : 0
- This Source Date : Thursday, December 7, 1978
- Last Fix ID : [Unmodified]
Source Listing
- DMTASY.ASSEMBLE.txt
- ASY TITLE 'DMTASY (RSCS) VM/370 - RELEASE 6' 00001000
- *. 00002000
- * MODULE NAME - 00003000
- * 00004000
- * DMTASY 00005000
- * 00006000
- * FUNCTION - 00007000
- * 00008000
- * DMTASY IS A SUPERVISOR SERVICE ROUTINE MODULE 00009000
- * WHICH INITIATES AND TERMINATES ASYNCHRONOUS EXIT 00010000
- * REQUESTS FOR TASK PROGRAMS. ASYNCHRONOUS EXIT 00011000
- * REQUESTS FOR ASYNCHRONOUS I/O INTERRUPT, EXTERNAL 00012000
- * INTERRUPT, AND ALERT EXIT REQUESTS ARE HANDLED BY 00013000
- * THIS ROUTINE. 00014000
- * 00015000
- * ATTRIBUTES - 00016000
- * 00017000
- * REUSABLE 00018000
- * 00019000
- * ENTRY POINTS - 00020000
- * 00021000
- * DMTASY - INITIATE OR TERMINATE AN ASYNCH EXIT 00022000
- * 00023000
- * ENTRY CONDITIONS - 00024000
- * 00025000
- * R0 - ASYNCH EXIT CODE: 00025500
- * X'00000000' FOR TASK ALERT EXIT 00026000
- * X'0000XXXX' FOR ASYNCH I/O INT EXIT 00026500
- * X'XXXX0000' FOR EXTERNAL INTERRUPT EXIT 00027000
- * 00027500
- * WHERE XXXX IS AN I/O ADDRESS OR AN EXTERNAL CODE 00028000
- * 00028500
- * R1 - ZERO TO TERMINATE A REQUEST 00029000
- * - ADDR OF TASK ASYNCH EXIT ROUTINE TO SET A REQUEST 00029500
- * 00030000
- * R2+R3 - FOR CLOCK COMPARATOR EXITS ONLY, CLOCK COMP VALUE 00030500
- * 00031000
- * R14 - RETURN ADDRESS 00031500
- * R15 - ENTRY ADDRESS 00032000
- * 00036000
- * EXIT CONDITIONS - 00037000
- * 00038000
- * NORMAL - 00039000
- * 00040000
- * GPR15 = X'00' ON ALL SUCCESSFUL REQUESTS 00041000
- * 00042000
- * ERROR - 00043000
- * 00044000
- * R15 - 04 IF TERMINATE REQ FOR NON-EXISTENT EXIT 00044500
- * - 08 IF INITIATE REQ OF SAME CODE FOR SAME TASK 00045000
- * - 0C IF INITIATING ILLEGAL EXTERNAL CODE 00045500
- * VALID CODES ARE: 00046000
- * X'1004' FOR CLOCK COMPARATOR 00046500
- * - 10 ERROR FROM QRQ GETTING A QUEUE ELEMENT 00047000
- * 00050000
- EJECT 00051000
- * 00052000
- * CALLS TO OTHER ROUTINES - 00053000
- * 00054000
- * DMTQRQ - TO RESERVE AND RELEASE SUP QUEUE ELEMENTS 00055000
- * 00056000
- * EXTERNAL REFERENCES - 00057000
- * 00058000
- * NONE 00059000
- * 00060000
- * 00061000
- * TABLES / WORKAREAS - 00062000
- * 00063000
- * DMTVEC - SUPERVISOR COMMON AREA 00064000
- * ASYNCH INTERRUPT EXIT REQUEST ELEMENT 00065000
- * TASK ELEMENT 00066000
- * 00067000
- * REGISTER USAGE - 00068000
- * 00069000
- * R0 - EXIT CODE 00070000
- * R1 - NEW ASYNE 00071000
- * R2 - TASK EXIT ADDRESS 00072000
- * R3 - PREVIOUS ASYNE IN CHAIN 00073000
- * R4 - NEXT ASYNE IN CHAIN 00074000
- * R5 - LINK 00075000
- * R6 - CALLING TASKS TASKE 00076000
- * R7 - WORK 00077000
- * R8 - WORK 00078000
- * R9 - LINKTABL 00079000
- * R10 - WORK 00080000
- * R11 - WORK 00081000
- * R12 - DMTASY BASE REG 00082000
- * R13 - TASK SAVE AREA POINTER 00083000
- * R14 - RETURN ADDRESS 00084000
- * R15 - ENTRY ADDRESS 00085000
- * 00086000
- * OPERATION - 00086500
- * 00087000
- * DMTASY BEGINS BY UNCONDITIONALLY SUSPENDING THE 00087500
- * CALLING TASK'S EXECUTION WITH A FREEZE SVC. FOR AN 00088000
- * INITIATE EXIT REQUEST, THE APPROPRIATE QUEUE IS 00088500
- * SCANNED FOR AN EXISTING SIMILAR REQUEST FOR THE SAME 00089000
- * TASK. IF NONE IS FOUND, A SUPERVISOR STATUS QUEUE 00089500
- * ELEMENT IS GOTTEN BY A CALL TO DMTQRQ, THE NEW EXIT 00090000
- * ELEMENT IS BUILT FROM THE SUPPLIED INFORMATION, AND 00090500
- * IT IS QUEUED ON THE APPROPRIATE CHAIN. 00091000
- * FOR CLOCK COMPARATOR REQUESTS, THE NEW REQUEST IS 00091500
- * QUEUED IN THE APPROPRIATE PLACE IN THE QUEUE. THE 00092000
- * EXTERNAL QUEUE IS ORDERED IN THE FOLLOWING WAY: 00092500
- * 00093000
- * 1. CLOCK COMPARATOR INTERRUPTS IN ASCENDING CLOCK VALUE 00093500
- * ORDER. 00094000
- * 2. ALL OTHER EXTERNAL REQUESTS. 00094500
- * 00095000
- * IF THE NEW REQUEST IS NOW THE LOWEST CLOCK REQUEST, 00095500
- * ITS CLOCK VALUE IS SET IN THE CLOCK COMPARATOR. 00096000
- * 00096500
- * IF AN ELEMENT IS FOUND AND A TERMINATE REQUEST IS BEING 00097000
- * MADE, THE ELEMENT IS DEQUEUED AND RETURNED TO THE FREEQ. 00097500
- * IF THE RETURNED ELEMENT REPRESENTS THE ACTIVE CLOCK 00098000
- * COMPARATOR, THE CLOCK COMPARATOR IS SET TO ALL F'S. 00098500
- * 00099000
- * NOTE: 00099500
- * 00100000
- * THE EXTERNAL INTERRUPT QUEUE IS MAINTAINED IN THE 00100500
- * FOLLOWING ORDER: 00101000
- * 00101500
- * . CLOCK COMPARATOR REQUESTS IN ASCENDING CLOCK ORDER. 00102000
- * THE FIRST CLOCK COMPARATOR ENTRY REPRESENTS THE 00102500
- * CLOCK VALUE WHICH HAS BEEN SET (UNLESS NONE HAS BEEN 00103000
- * REQUESTED, IN WHICH CASE THE CLOCK COMPARATOR IS FF'S) 00103500
- * 00104000
- * . ALL OTHER EXTERNAL INTERRUPT REQUESTS IN ANY ORDER. 00104500
- * 00105000
- * CLOCK COMPARATOR EXIT REQUESTS ARE INITIATED BY THIS 00105500
- * ROUTINE. THEY ARE TERMINATED BY EITHER A TERMINATE 00106000
- * REQUEST TO THIS ROUTINE OR BY THE OCCURENCE OF THE 00106500
- * INTERRUPT. 00107000
- * 00111000
- * 00112000
- *. 00113000
- EJECT 00114000
- DMTASY CSECT 00115000
- SPACE 00116000
- * ENTRY POINT FOR CALL TO DMTASY ROUTINE 00117000
- SPACE 00118000
- FREEZE SAVE CALLING TASK'S STAT AND GET S/A ADDR 00119000
- SPACE 00120000
- LR R13,R14 REG.13 = ADDRESS OF CALLER'S TASK SAVE AREA 00121000
- USING TAREA,R13 DEFINE TASK SAVE AREA DSECT ADDRESSA 00122000
- USING SVECTORS,0 GET SVECTORS ADDRESSABILITY 00123000
- USING ASYNE,R4 GET ASYN ELEMENT ADDRESSABILITY 00124000
- USING TASKE,R6 ADDRESS THE TASK ELEMENT @VA03349 00124500
- SPACE 00125000
- LA R12,0(R15) REG.12 = BASE REGISTER FOR ASYN ROUTINE 00126000
- USING DMTASY,R12 DEFINE DMTASY ADDRESSABILITY 00127000
- SPACE 00128000
- XC TGREG15(4),TGREG15 SET RETURN CODE TO ZERO FOR NOW 00129000
- LR R2,R1 SAVE EXIT ADDR IN R2 @VA03349 00130000
- L R6,ACTIVE GET ACTIVE TASK ELEMENT @VA03349 00130400
- LTR R0,R0 TASK ALERT SET REQUEST? @VA03349 00130800
- BNZ EXTIO NOPE, EXT OR I/O, BR. @VA03349 00131200
- LA R4,ALERTQ SET UP FOR ALERT CHAIN @VA03349 00131600
- IC R0,TASKID USE TASKID FOR CODE ON ALERTS @VA03349 00132000
- B SCAN01 AND PROCEED WITH THE SCAN @VA03349 00132400
- SPACE 00132800
- EXTIO LA R4,IOEXITQ ASSUME I/O EXIT REQUEST @VA03349 00133200
- OC TGREG0(2),TGREG0 IS IT FOR I/O? @VA03349 00133600
- BZ SCAN01 YES, BR @VA03349 00134000
- SRL R0,16 SHIFT EXT CODE TO LOW ORDER BYTES@VA03349 00134400
- LA R4,EXTQ GET THE EXTERNAL QUEUE ANCHOR @VA03349 00134800
- SPACE 00135200
- SCAN01 LTR R1,R1 SET OR TERMINATE REQUEST? @VA03349 00135600
- BZ ASYTERM TERMINATE, GO PROCESS @VA03349 00136000
- GETNEXT BAL R5,SCANQ GO SCAN FOR R0 INT CODE TYPE @VA03349 00136400
- BNZ NONEFND CODE NOT FOUND ON CHAIN @VA03349 00136800
- USING ASYNE,R4 @VA03349 00137200
- OC TGREG0(2),TGREG0 IS THIS AN EXT REQUEST? @VA03349 00137600
- BZ ASREJECT SETTING SECOND NON-EXT IS A NONO @VA03349 00138000
- CLC TASKID(1),ASYNID EXT, SAME TASK SETTING 2ND ? @VA03349 00138400
- BE ASREJECT YES, THATS ALSO A NONO @VA03349 00138800
- B GETNEXT GO LOOK THROUGH ALL ELEMENTS @VA03349 00139200
- SPACE 00139600
- NONEFND OC TGREG0(2),TGREG0 IS THIS AN EXT SET REQUEST? @VA03349 00140000
- BNZ SETEXT YES, BR @VA03349 00140400
- GETELEM BAL R5,ASYBLD GO GET AN ELEMENT @VA03349 00140800
- ST R1,ASYNNEXT-ASYNE(R3) CHAIN IN NEW ELEMENT @VA03349 00141200
- SPACE 00141600
- ASEXIT L R15,DISPATCH GOTO DISPATCHER @VA03349 00142000
- BALR R14,R15 ... @VA03349 00142400
- EJECT 00142800
- SETEXT CH R0,=X'1004' REQUESTING CLOCK COMP INT? @VA03349 00143200
- BNE NOSUCH NOPE-DON'T KNOW WHAT YOU'RE DOING@VA03349 00143600
- LA R4,EXTQ BEGINNING OF QUEUE AGAIN @VA03349 00144000
- SLR R7,R7 CLEAR EXT COUNT @VA03349 00144400
- BAL R5,ASYBLD GO GET AND INITIALIZE AN ELEM @VA03349 00144800
- NXTREQ LR R3,R4 SAVE PREVIOUS POINTER @VA03349 00145200
- ICM R4,B'1111',ASYNNEXT GET NEXT ENTRY @VA03349 00145600
- BZ CHKFLAG END OF CHAIN, GO SEE WHERE WE ARE@VA03349 00146000
- CH R0,ASYNCODE STILL LOOKIN AT CLOCK COMPS? @VA03349 00146400
- BNE CHKFLAG NOPE, MUST BE AT END OF CCOMPS @VA03349 00146800
- LA R7,1(R7) BUMP CLOCK COMP COUNT @VA03349 00147200
- BAL R5,SCANLINK GO GET THE LINKTABL ENTRY @VA03349 00147600
- USING LINKTABL,R9 @VA03349 00148000
- CLC TGREG2(8),LNKCLOCK IS NEW VALUE < THIS ONE? @VA03349 00148400
- BNL NXTREQ NOPE, NOT RIGHT PLACE YET. @VA03349 00148800
- CL R7,F1 IS THIS THE ACTIVE CLOCK ASYNE @VA03349 00149200
- BNE TSTAMP NOPE, THEN CHAIN IN FRONT OF IT. @VA03349 00149600
- SETCLOCK SCKC TGREG2 SET THE NEW CLOCK COMP VALUE @VA03349 00150000
- TSTAMP ST R1,ASYNNEXT-ASYNE(R3) CHAIN PREV TO NEW... @VA03349 00150400
- ST R4,ASYNNEXT-ASYNE(R1) AND NEW TO NEXT @VA03349 00150800
- LR R4,R1 SET ASYNE = NEW ONE @VA03349 00151200
- BAL R5,SCANLINK GO GET THE CALLERS LINKTABLE @VA03349 00151600
- MVC LNKCLOCK(8),TGREG2 STAMP THE LINKTABL @VA03349 00152000
- B ASEXIT DONE. @VA03349 00152400
- SPACE 00152800
- CHKFLAG LTR R7,R7 IS THE CLOCK RUNNING NOW? @VA03349 00153200
- BNZ TSTAMP YES, CHAIN THIS ENTRY ON END. @VA03349 00153600
- B SETCLOCK NO, THEN MAKE IT RUNNING. @VA03349 00154000
- EJECT 00154400
- ASYTERM SLR R7,R7 CLEAR CLOCK COMP COUNT @VA03349 00154800
- FINDNEXT BAL R5,SCANQ GO SCAN THE QUEUE FOR SAME CODE @VA03349 00155200
- BNZ ASNOFIND NOT THERE, CANT TERMINATE THEN. @VA03349 00155600
- LA R7,1(R7) UP CLOCK COMP COUNT @VA03349 00156000
- CLC TASKID(1),ASYNID DID WE FIND THE RIGHT REQUEST @VA03349 00156400
- BNE FINDNEXT NOPE, KEEP LOOKING @VA03349 00156800
- OC TGREG0(2),TGREG0 EXT TERMINATION REQUEST? @VA03349 00157200
- BZ UNCHAIN NOPE, I/O OR ASY SIG, GO UNCHAIN @VA03349 00157600
- CLC ASYNCODE(2),=X'1004' CLOCK COMP? @VA03349 00158000
- BNE NOSUCH NOPE, DONT KNOW WHAT YOURE DOING @VA03349 00158400
- BAL R5,SCANLINK GO GET THIS GUYS LINKTABL @VA03349 00158800
- MVC LNKCLOCK(8),FFS CLEAR THE CLOCK VALUE @VA03349 00159200
- CL R7,F1 IS THIS THE ACTIVE (FIRST) ASYNE @VA03349 00159600
- BNE UNCHAIN NOPE, JUST DEQUEUE AND RETURN. @VA03349 00160000
- LR R1,R4 SAVE OLD ELEM ADDR FOR RETURN @VA03349 00160400
- L R4,ASYNNEXT GET POINTER TO NEXT @VA03349 00160800
- ST R4,ASYNNEXT-ASYNE(R3) AND PUT IN PREVIOUS @VA03349 00161200
- LTR R4,R4 IS THERE A NEXT ELEM? @VA03349 00161600
- BZ STAMPHI NO, USE A HIGH VALUE @VA03349 00162000
- CLC ASYNCODE(2),=X'1004' IS IT CLOCK COMP @VA03349 00162400
- BNE STAMPHI NOPE, NOMORE CLOCK COMP REQUESTS @VA03349 00162800
- BAL R5,SCANLINK GO GET THIS GUYS LINKTABL @VA03349 00163200
- SCKC LNKCLOCK MAKE THIS THE ACTIVE CLOCK COMP @VA03349 00163600
- B RETELEM NOW GO RETURN THE DEQUED ELEM @VA03349 00164000
- SPACE 00164400
- UNCHAIN LR R1,R4 SAVE ELEM TO RETURN @VA03349 00164800
- L R4,ASYNNEXT GET PTR TO NEXT @VA03349 00165200
- ST R4,ASYNNEXT-ASYNE(R3) AND PUT IN PREVIOUS @VA03349 00165600
- B RETELEM NOW RETURN THE ELEMENT @VA03349 00166000
- SPACE 00166400
- STAMPHI SCKC FFS SET A HIGH CLOCK COMP VALUE @VA03349 00166800
- RETELEM L R15,QREQ RETURN THE DEQUEUED ELEMENT @VA03349 00167200
- BALR R14,R15 ... @VA03349 00167600
- B ASEXIT DONE @VA03349 00168000
- EJECT 00168400
- SCANLINK L R8,ASYNTASK GET TASK ELEMENT ADDRESS @VA03349 00168800
- L R8,TASKNAME-TASKE(R8) GET TASK NAME @VA03349 00169200
- L R9,TLINKS GET LINKTABLE ANCHOR @VA03349 00169600
- L R10,0(R9) GET NUMBER OF ENTRIES @VA03349 00170000
- LA R9,8(R9) BUMP TO FIRST ENTRY @VA03349 00170400
- CHKNEXT TM LFLAG,LACTIVE IS THIS TASK ACTIVE? @VA03349 00170800
- BZ BUMPNEXT NOPE, THEN SKIP IT. @VA03349 00171200
- CL R8,LACTTNME SAME TASK NAME? @VA03349 00171600
- BER R5 YES, LINKTABL ENTRY FOUND, RETURN@VA03349 00172000
- BUMPNEXT LA R9,LINKLEN(R9) BUMP TO NEXT ENTRY @VA03349 00172400
- BCT R10,CHKNEXT AND KEEP LOOKING @VA03349 00172800
- DC H'0' THATS THE END OF THE ROAD. @VA03349 00173200
- EJECT 00173600
- SCANQ LR R3,R4 SAVE PREV POINTER @VA03349 00174000
- ICM R4,B'1111',ASYNNEXT GET NEXT ELEM IN Q @VA03349 00174400
- BZ SETCC1 END OF CHAIN, NOT FOUND, RET CC1 @VA03349 00174800
- CH R0,ASYNCODE ARE THE INT CODES THE SAME? @VA03349 00175200
- BER R5 YES, ALL SET, RETURN CC0 @VA03349 00175600
- B SCANQ AND GO BACK FOR MORE @VA03349 00176000
- SPACE 00176400
- SETCC1 TM *,X'FF' SET CC=1 @VA03349 00176800
- BR R5 AND RETURN @VA03349 00177200
- DROP R4 NO MORE ASYNE @VA03349 00177600
- SPACE 3 00178000
- USING ASYNE,R1 @VA03349 00178400
- ASYBLD SLR R1,R1 CLEAR FOR CALL @VA03349 00178800
- L R15,QREQ CALL QRQ FOR AN ELEMENT @VA03349 00179200
- BALR R14,R15 ... @VA03349 00179600
- LTR R15,R15 DID WE GET IT? @VA03349 00180000
- BNZ QELEMERR NOPE, TERMINATE WITH QUEUE ERROR @VA03349 00180400
- XC ASYNE(ASYNLEN),ASYNE CLEAR THE BLOCK @VA03349 00180800
- STCM R6,B'0111',ASYNTASK+1 SAVE ACTIVE TASK TASKE @VA03349 00181200
- ST R2,ASYNEXIT SET EXIT ADDRESS @VA03349 00181600
- STH R0,ASYNCODE SET EXIT REQUEST CODE @VA03349 00182000
- MVC ASYNID(1),TASKID SET ACTIVE TASKID IN ELEM @VA03349 00182400
- BR R5 @VA03349 00182800
- DROP R1 @VA03349 00183200
- SPACE 3 00183600
- EJECT 00188000
- ASNOFIND EQU * 00189000
- LA R15,4 SET ERROR CODE 4 FOR ELEMENT NOT FOUND 00190000
- B ASEREXIT AND GO EXIT 00191000
- SPACE 00192000
- ASREJECT EQU * 00193000
- LA R15,8 SET ERROR CODE 8 FOR EXIT ALREADY CLAIMED 00194000
- B ASEREXIT AND EXIT @VA03349 00195000
- SPACE 00195500
- NOSUCH LA R15,12 ATTEMPTING TO SET ILLEGAL CODE @VA03349 00196000
- B ASEREXIT @VA03349 00196500
- SPACE 00197000
- QELEMERR LA R15,16 ERROR GETTING A QUEUE ELEM @VA03349 00197500
- SPACE 00198000
- ASEREXIT EQU * 00199000
- ST R15,TGREG15 STORE CODE IN CALLER'S REG.15 SAVE AREA 00200000
- B ASEXIT AND RETURN THROUGH THE DISPATCHER 00201000
- DS 0D @VA03349 00201100
- FFS DC 8X'FF' @VA03349 00201200
- F1 DC F'1' @VA03349 00201300
- EJECT 00202000
- COPY RSSEQU 00203000
- COPY SVECTORS 00205000
- COPY TAREA 00207000
- COPY ASYNE 00209000
- ASYNLEN EQU *-ASYNNEXT @VA03349 00209100
- COPY LINKTABL @VA03349 00210000
- COPY TASKE 00211000
- END 00212000
ibm/vm370-lib/rscs/dmtasy.assemble_src.txt ยท Last modified: 2023/08/06 13:38 by Site Administrator