ibm:vm370-lib:rscs:dmtake.assemble_src
Table of Contents
DMTAKE Source
References
- Fixes Applied : 0
- This Source Date : Thursday, December 7, 1978
- Last Fix ID : [Unmodified]
Source Listing
- DMTAKE.ASSEMBLE.txt
- AKE TITLE 'DMTAKE (RSCS) VM/370 - RELEASE 6' 00001000
- *. 00002000
- * MODULE NAME - 00003000
- * 00004000
- * DMTAKE 00005000
- * 00006000
- * FUNCTION - 00007000
- * 00008000
- * THE DMTAKE MODULE CONTAINS THE SUPR SERVICE WHICH 00009000
- * SUPPLIES TASK PROGRAMS WITH THE RECEIVER INTERFACE 00010000
- * TO GIVE REQUESTS ISSUED BY OTHER TASKS. A SINGLE 00011000
- * CALL TO DMTAKE FIRST RESPONDS TO THE PREVIOUSLY 00012000
- * SUPPLIED GIVE REQUEST, AND THEN SUPPLIES A NEW 00013000
- * GIVE REQUEST TO THE TASK FOR ITS PROCESSING. 00014000
- * 00015000
- * ATTRIBUTES - 00016000
- * 00017000
- * REUSABLE, NON-INTERRUPTABLE 00018000
- * 00019000
- * ENTRY POINTS - 00020000
- * 00021000
- * DMTAKE - RESPOND TO LAST REQ, ACCEPT ANOTHER 00022000
- * 00023000
- * ENTRY CONDITIONS - 00024000
- * 00025000
- * GPR0 = POST CODE FOR RESPONSE TO PREVIOUS REQUEST 00026000
- * GPR1 = ADDRESS OF CALLER'S TAKE TABLE 00027000
- * GPR14 = RETURN ADDRESS 00028000
- * GPR15 = ENTRY ADDRESS 00029000
- * 00030000
- * EXIT CONDITIONS - 00031000
- * 00032000
- * NORMAL - 00033000
- * 00034000
- * GPR15 = X'00' RESPONSE PERFORMED, NEW REQUEST 00035000
- * SUPPLIED 00036000
- * 00037000
- * ERROR - 00038000
- * 00039000
- * GPR15 = X'04' IF REQ SUPPLIED AND NO RESP PENDING 00040000
- * X'08' IF RESP DONE AND NO REQ PENDING 00041000
- * X'0C' IF NEITHER REQ NOR RESP PENDING 00042000
- * 00043000
- EJECT 00044000
- * 00045000
- * CALLS TO OTHER ROUTINES - 00046000
- * 00047000
- * DMTQRQ - TO RESERVE AND RELEASE SUP QUEUE ELEMENTS 00048000
- * DMTPST - TO POST RESPONSE COMPLETION 00049000
- * 00050000
- * EXTERNAL REFERENCES - 00051000
- * 00052000
- * NONE 00053000
- * 00054000
- * TABLES / WORKAREAS - 00055000
- * 00056000
- * DMTVEC - SUPERVISOR COMMON AREA 00057000
- * TASK ELEMENT 00058000
- * GIVE ELEMENT 00059000
- * 00060000
- * REGISTER USAGE - 00061000
- * 00062000
- * GPR0 = RESPONSE POST CODE REGISTER 00063000
- * GPR1 = CALLING PARAMETER REGISTER 00064000
- * GPR2 = GIVE REQUEST ELEMENT POINTER 00065000
- * GPR3 = GIVE REQUEST ELEMENT POINTER 00066000
- * GPR4 = TASK ELEMENT POINTER 00067000
- * GPR5 = SCRATCH 00068000
- * GPR6 = SCRATCH 00069000
- * GPR7 = UNUSED 00070000
- * GPR8 = UNUSED 00071000
- * GPR9 = UNUSED 00072000
- * GPR10 = UNUSED 00073000
- * GPR11 = TASK ELEMENT POINTER 00074000
- * GPR12 = DMTAKE BASE REGISTER 00075000
- * GPR13 = TASK SAVE AREA POINTER 00076000
- * GPR14 = LINKAGE RETURN REGISTER 00077000
- * GPR15 = LINKAGE ENTRY REGISTER 00078000
- * 00079000
- * NOTES - 00080000
- * 00081000
- * THE FUNCTIONAL DESIGN OF THIS MODULE IS FAIRLY ELABORATE, 00082000
- * PARTIALLY AS A RESULT OF THE NEED TO INSURE INTEGRITY 00083000
- * OF THE SYSTEM WHEN A TASK TERMINATES ABRUPTLY, AND 00084000
- * AND PARTIALLY AS THE RESULT OF EXPERIENCE WITH A SIMPLER 00085000
- * AND MORE GENERAL SIMILAR FACILITY. 00086000
- * 00087000
- * OPERATION - 00088000
- * 00089000
- * DMTAKE BEGINS PROCESSING BY SUSPENDING THE 00090000
- * CALLING TASK'S EXECUTION BY THE FREEZE SVC 00091000
- * FUNCTION. THE GIVE REQUEST QUEUE IS SCANNED FOR AN 00092000
- * ELEMENT REFLECTING A PENDING RESPONSE TO A 00093000
- * PREVIOUSLY RECEIVED GIVE REQUEST. IF SUCH AN 00094000
- * ELEMENT IS FOUND, THE RESPONSE BUFFER SUPPLIED BY 00095000
- * THE CALLER IS MOVED TO THE SENDER'S RESPONSE 00096000
- * BUFFER, AND THE SENDER'S GIVE TABLE IS POSTED WITH 00097000
- * THE CODE SUPPLIED BY THE RESPONDING TASK. THE GIVE 00098000
- * REQUEST QUEUE IS THEN SCANNED AGAIN FOR AN ELEMENT 00099000
- * REFLECTING A PREVIOUSLY UNACCEPTED GIVE REQUEST 00100000
- * ADDRESSED TO THE CALLING TASK. IF SUCH AN ELEMENT 00101000
- * IS FOUND, THE REQUEST BUFFER SUPPLIED BY THE TASK 00102000
- * ISSUING THE GIVE REQUEST IS MOVED TO THE DMTAKE 00103000
- * CALLER'S REQUEST BUFFER. THE RETURN CODE IS SET 00104000
- * ACCORDING TO THE CONDITIONS WHICH OCCURED DURING 00105000
- * THE DMTAKE REQUEST PROCESSING, AND CONTROL IS 00106000
- * RETURNED TO THE DISPATCHER. 00107000
- * 00108000
- * 00109000
- *. 00110000
- EJECT 00111000
- DMTAKE CSECT 00112000
- SPACE 00113000
- * ENTRY POINT FOR CALL TO DMTAKE ROUTINE 00114000
- SPACE 00115000
- FREEZE SAVE RESUME PSW AND GREGS FOR DISPATCH LATER 00116000
- SPACE 00117000
- LR R13,R14 REG.13 = CALLER'S TASK SAVE AREA ADDRESS 00118000
- USING TAREA,R13 DEFINE ADDRESSABILITY FOR CALLER'S S 00119000
- USING SVECTORS,0 GET SVECTORS ADDRESSABILITY 00120000
- USING GIVEE,R2 GET GIVE ELEMENT ADDRESSABILITY 00121000
- USING TASKE,R11 GET TASK ELEMENT ADDRESSABILITY 00122000
- SPACE 00123000
- LA R12,0(R15) REG.12 = ENTRY ADDRESS FOR DMTAKE 00124000
- USING DMTAKE,R12 USE ENTRY ADDRESS AS BASE 00125000
- SPACE 00126000
- L R11,ACTIVE INITIALIZE TAKER'S TASK TABLE ADDRESS REGISTE 00127000
- SPACE 00128000
- LA R15,4 REG.15 = NO PENDING RESPONSE RETURN CODE 00129000
- ST R15,TGREG15 ANTICIPATE THAT SITUATION FOR NOW 00130000
- SPACE 00131000
- LA R2,GIVEQ-(GIVENEXT-GIVEE) INITIALIZE GIVE QUEUE ELEMENT 00132000
- TAKERESP EQU * 00133000
- LR R3,R2 SAVE PREDECESSOR ADDRESS 00134000
- ICM R2,B'1111',GIVENEXT-GIVEE(R3) REG 2 = ADDRESS OF NEXT GI 00135000
- BZ TAKERQST NOPE - NO PENDING RESPONSE FOR CALLER 00136000
- CLC GIVENID(1),TASKID-TASKE(R11) IS THIS THE CALLER'S PENDIN 00137000
- BNE TAKERESP NOPE - KEEP LOOKING THROUGH THE QUEUE 00138000
- SPACE 00139000
- MVC GIVENEXT-GIVEE(4,R3),GIVENEXT UNCHAIN TO START 00140000
- MVI TGREG15+3,X'00' AND CLEAR THE RETURN CODE 00141000
- SPACE 00142000
- L R3,GIVEADDR REG.3 = ADDR OF GIVER'S TABLE 00143000
- L R4,8(R1) REG.4 = 'FROM' ADDRESS (TAKE RESPONSE BUFFER) 00144000
- L R5,12(R3) REG.5 = 'TO' ADDRESS (GIVE RESPONSE BUFFER) 00145000
- SR R6,R6 CLEAR CHARACTER COUNT REGISTER 00146000
- IC R6,0(R4) REG.6 = RESPONSE MESSAGE CHARACTER COUNT 00147000
- CLC 0(1,R4),12(R3) IS THERE ENOUGH ROOM FOR THE RESPONSE? 00148000
- BNH TAKEOK1 YES - MOVE THE ENTIRE THING 00149000
- IC R6,12(R3) OTHERWISE, TRUNCATE AT END OF RECEIVING BUFFER 00150000
- TAKEOK1 EQU * 00151000
- STC R6,0(R5) SET THE COUNT BYTE 00152000
- LTR R6,R6 ANYTHING TO BE MOVED? 00153000
- BZ TAKEMUTE NO - SKIP MOVER LOGIC 00154000
- BCTR R6,0 REG.6 = CHAR COUNT FOR MOVE -1 00155000
- EX R6,TAKEMOVE MOVE THE RESPONSE CHARACTER STRING 00156000
- * B TAKEMUTE AT THE TOP OF THE NEXT PAGE 00157000
- EJECT 00158000
- TAKEMUTE EQU * 00159000
- MVC 4(4,R3),TASKNAME RESTORE ADDRESSEE'S NAME IN TABLE 00160000
- LR R1,R3 REG.1 = ADDRESS OF GIVER'S TABLE 00161000
- L R15,POSTREQ REG.15 = ENTRY ADDRESS TO POST ROUTINE 00162000
- BALR R14,R15 POST WITH CODE IN REG.0 AS SET BY CALLER 00163000
- SPACE 00164000
- LR R1,R2 REG.1 = ADDRESS OF OLD GIVE QUEUE ELEMENT 00165000
- L R15,QREQ REG.15 = ENTRY ADDRESS TO SUP QUEUE MANAGER 00166000
- BALR R14,R15 FREE THE OLD ELEMENT 00167000
- O R15,TGREG15 REG.15 = COMPOSITE ERROR CODE SO FAR 00168000
- ST R15,TGREG15 SET RETURN CODE FOR CALLER 00169000
- L R1,TGREG1 RESTORE TAKE REQUEST TABLE ADDRESS 00170000
- SPACE 00171000
- TAKERQST EQU * 00172000
- CLI 4(R1),X'00' IS THERE A NEW TAKE REQUEST? 00173000
- BE TAKEXIT NOPE - RETURN TO CALLER IMMEDIATELY 00174000
- SPACE 00175000
- SR R2,R2 CLEAR QUEUE SCAN POINTER SAVE REGISTER 00176000
- LA R3,GIVEQ-(GIVENEXT-GIVEE) INITIALIZE QUEUE SCAN REGISTER 00177000
- DROP R2 00178000
- USING GIVEE,R3 GET GIVE ELEMENT ADDRESSABILTIY 00179000
- TAKESCAN EQU * 00180000
- ICM R3,B'1111',GIVENEXT REG 3 = ADDR OF NEXT GIVE ELEMENT IN 00181000
- BZ TAKEQEND YEP - GO SEE WHAT TO DO NEXT 00182000
- CLI GIVENID,X'00' IS A RESPONSE PENDING ALREADY? 00183000
- BNE TAKESCAN YES - KEEP LOOKING FOR A PENDING REQUEST 00184000
- CLC GIVENAME(4),TASKNAME IS THIS ONE FOR THE CALLER? 00185000
- BNE TAKESCAN NOPE - KEEP LOOKING DOWN THE QUEUE 00186000
- LTR R2,R2 HAVE WE HIT ONE FOR THE CALLER ALREADY? 00187000
- BNZ TAKEGIVE YEP - GO DELIVER IT WITHOUT CLEARING SYNLOCK 00188000
- LR R2,R3 OTHERWISE SAVE THE ADDRESS OF THE ELEMENT 00189000
- B TAKESCAN AND SEE IF THERE ARE ANY MORE LEFT 00190000
- EJECT 00191000
- TAKEQEND EQU * 00192000
- XC TREQLOCK(4),TREQLOCK CLEAR SYNLOCK - NO MORE PENDING 00193000
- LTR R2,R2 DID WE ACTUALLY FIND THE LAST ONE? 00194000
- BZ TAKENOGO NOPE - RETURN WITH ERROR INDICATION 00195000
- DROP R3 00196000
- USING GIVEE,R2 GET GIVE ELEMENT ADDRESSABILITY 00197000
- TAKEGIVE EQU * 00198000
- MVC GIVENID(1),TASKID-TASKE(R11) SET RESPONSE PENDING FROM C 00199000
- L R3,GIVEADDR REG.3 = ADDRESS OF GIVER'S TABLE 00200000
- L R4,8(R3) REG.4 = 'FROM' ADDRESS (GIVE REQUEST BUFFER) 00201000
- L R5,4(R1) REG.5 = 'TO' ADDRESS (TAKE REQUEST BUFFER) 00202000
- SR R6,R6 CLEAR CHARACTER COUNT REGISTER 00203000
- IC R6,0(R4) REG.6 = REQUEST MESSAGE CHARACTER COUNT 00204000
- CLC 0(1,R4),4(R1) IS THERE ROOM ENOUGH TO FIT IT ALL IN? 00205000
- BNH TAKEOK2 YES - DO SO 00206000
- IC R6,4(R1) OTHERWISE, TRUNCATE AT END OF RECEIVING BUFFER 00207000
- TAKEOK2 EQU * 00208000
- STC R6,0(R5) SET THE COUNT BYTE 00209000
- LTR R6,R6 IS THERE ANYTHING TO BE MOVED? 00210000
- BZ TAKENONE NOPE - GIVER MUST HAVE STRANGE REQUEST 00211000
- BCTR R6,0 REG.6 = CHARACTER COUNT FOR MOVE -1 00212000
- EX R6,TAKEMOVE MOVE THE REQUEST CHARACTER STRING 00213000
- SPACE 00214000
- TAKENONE EQU * 00215000
- MVI 0(R1),C'?' SET FIRST CHARACTER OF DEFAULT NAME 00216000
- MVC 1(3,R1),0(R1) SET GIVER'S NAME TO C'????' FOR NOW 00217000
- SPACE 00218000
- DROP R11 00219000
- USING TASKE,R4 GET TASK ELEMENT ADDRESSABILITY 00220000
- LA R4,TASKQ-(TASKNEXT-TASKE) INITIALIZE TASK ELEMENT POINTE 00221000
- TAKETASK EQU * 00222000
- ICM R4,B'1111',TASKNEXT REG 4 = ADDRESS OF NEXT TASK ELEMENT 00223000
- BZ TAKEXIT YES - SHOULDN'T HAPPEN - BETTER JUST QUIT 00224000
- CLC TASKID(1),GIVERID IS THIS THE GIVER'S TASK ELEMEN 00225000
- BNE TAKETASK NOPE - KEEP LOOKING FOR THE RIGHT ONE 00226000
- MVC 0(4,R1),TASKNAME SET GIVER'S NAME IN TAKER'S TABLE 00227000
- SPACE 00228000
- TAKEXIT EQU * 00229000
- L R15,DISPATCH REG.15 = ADDRESS OF DISPATCHER ENTRY 00230000
- BALR R14,R15 EXIT TO DISPATCHER 00231000
- SPACE 00232000
- TAKENOGO EQU * 00233000
- OI TGREG15+3,X'08' SET NO PENDING GIVE REQUEST RETURN CODE 00234000
- B TAKEXIT AND RETURN WITH RETURN CODE THROUGH DISPATCHER 00235000
- SPACE 00236000
- TAKEMOVE MVC 1(0,R5),1(R4) TO BE EXECUTED BY CODE ABOVE 00237000
- EJECT 00238000
- COPY RSSEQU 00239000
- EJECT 00240000
- COPY SVECTORS 00241000
- EJECT 00242000
- COPY TAREA 00243000
- EJECT 00244000
- COPY TASKE 00245000
- EJECT 00246000
- COPY GIVEE 00247000
- END 00248000
ibm/vm370-lib/rscs/dmtake.assemble_src.txt ยท Last modified: 2023/08/06 13:38 by Site Administrator