Michael. Originally, I started on this project to build a PC service provider address space. The address space acquired several 64-bit areas with the IARV64 GETSHARED service, and the service provider would allow problem state address spaces to acquire interest into these 64-bit areas. The 64-bit areas were buffers for monitoring data. I also wanted a 3270 interface for administrative management of the configurations and the monitoring data. Now, this project has morphed into something different.
For the register equates, I only use the equates when the equate is related to an active USING statement. With registers 0,1,12 (if not baseless),13,14,and 15 unavailable, it really limits the number of registers for addressing control blocks. I find the register equate methodology very useful and descriptive when managing many DSECTs. I found the solution to my bind problem. All of the examples and most of the manuals referenced the alternate area for bind information. I found one manual that referenced 'Record area' and 'RECLEN'. I change the VTAM INQUIRE macro from AAREA and AAREALN to AREA and AREALEN, and the INQUIRE and OPNDST worked successfully with the bind information returned. Here is the updated source: **-----------------------------------------------------------------** ** PROGRAM : PORTDSPI ** ** AUTHOR : BRIAN CHAPMAN ** ** WRITTEN ON : 23 AUGUST 2017 ** ** MODIFIED ON : ** ** ASM OPTIONS : RENT,REUS AMODE=31 RMODE=31 AC=0 ** ** DESCRIPTION : TASK INITIALIZATION ROUTINE ** ** : THIS PROGRAM BUILDS THE INITIAL TASK RELATED ** ** : CONTROL BLOCKS FOR A NEW TASK TO BE DISPATCHED. ** **-----------------------------------------------------------------** ** * * REGEQU * ** * * COPY PORTKERN * * COPY PORTDMH * * COPY TASKANCH * * COPY SESSVTAM * * COPY SESSSOKT * ** * * EJECT * * IFGRPL AM=VTAM * * EJECT * * ISTUSFBC * * EJECT * * IFGACB AM=VTAM * * EJECT * * IFGEXLST AM=VTAM* * EJECT * * ISTDNIB * * ISTDBIND * ** * *WORKAREA DSECT * *WORKNAME DS CL8 * *SAVEAREA DS 18F * *SAVERC DS F * *SAVEANCH DS F * ** * *VTAMRETC DS F * *VTAMFDB2 DS F * ** * *CALLPLST DS 0F * *CALLPRM1 DS F * *CALLPRM2 DS F * *CALLPRM3 DS F * *CALLPRM4 DS F * *CALLPRM5 DS F * ** * *WORKLEN EQU *-WORKAREA * ** * *WORKREG EQU R3 * *KERNREG EQU R4 * *ANCHREG EQU R5 * *DMHREG EQU R6 * *VTAMREG EQU R6 * *RPLREG EQU R7 * *NIBREG EQU R8 * *ACBREG EQU R9 * *BINDREG EQU R10 * ** * *PORTDSPI CSECT * *PORTDSPI AMODE 31 * *PORTDSPI RMODE ANY * * STM R14,R12,12(R13) SAVE REGISTERS * * LR R12,R15 ESTABLISH BASE * * USING PORTDSPI,R12 SET ADDRESSIBILITY* * B START * ** * * DC CL9'PORTDSPI' * * DC CL9'&SYSDATC' * * DC CL5'&SYSTIME' * ** * *START DS 0H * * LR R2,R1 SAVE REGISTER 1 * * LHI R7,WORKLEN LOAD WORK AREA LENGTH * * GETMAIN RU,LV=(7),LOC=31 * * LR WORKREG,R1 * * * USING WORKAREA,WORKREG SET ADDRESSIBILITY * ** * * LR R6,WORKREG LOAD REGISTER * * SR R15,R15 ZERO FROM LENGTH * * MVCL R6,R14 INITIALIZE WITH LOW VALUES * ** * * ST R13,SAVEAREA+4 CHAIN CALLER'S SAVEAREA ADDRESS* * LA R13,SAVEAREA * * ST R13,SAVEAREA+8 SAVE CURRENT SAVEAREA ADDRESS * * MVC SAVEAREA(4),=CL4'F1SA' * * MVC WORKNAME(8),=CL8'PORTDSPI' * ** * * SGR R15,R15 * ** * *GETLINK DS 0H * * LR R1,R2 RESTORE REGISTER 1 * * LT KERNREG,0(R1) GET ADDRESS OF KERNEL * * BZ BADLINK NO LINKAGE PASSED * * USING PORTKERN,KERNREG SET ADDRESSIBILITY * ** * *ALLOCATE DS 0H * * LHI R7,TASKANCH_LEN LOAD SESSION ANCHOR LENGTH * * GETMAIN R,LV=(7),LOC=31 * * LR R6,R1 LOAD REGISTER * ** * * LA R8,0 SET DUMMY FROM ADDRESS * * SR R15,R15 ZERO FROM LENGTH * * MVCL R6,R14 INITIALIZE WITH LOW VALUES * ** * * LR ANCHREG,R1 LOAD REGISTER * * ST ANCHREG,SAVEANCH SAVE CURRENT ANCHOR * * USING TASKANCH,ANCHREG SET ADDRESSIBILITY * * MVC TASKANCH_EYE(8),=CL8'TASKANCH' SET EYECATCHER * ** * * L DMHREG,KERNDMH GET ADDRESS OF DISPATCH HEADER* * USING PORTDMH,DMHREG SET ADDRESSIBILITY * * ST KERNREG,ANCHKERN STORE KERNEL ADDRESS * ** * * ST ANCHREG,DMHRANCH STORE ANCHOR ADDRESS * * MVC ANCHPROG,DMHRPROG MOVE PROGRAM NAME TO ANCHOR * * MVC ANCHTYP,DMHRTYPE MOVE INIT TYPE TO ANCHOR * * MVC ANCHPARM,DMHRPARM MOVE PARAMETER AREA TO ANCHOR* * DROP DMHREG * ** * * TM ANCHTYP,TYPTERM TERMINAL TASK? * * BO TERMTASK YES. CHECK FOR VTAM BLOCK * * TM ANCHTYP,TYPSOKT SOCKET TASK? * * BO SOKTTASK YES. COPY SOCKET FOR CHILD * * B GETKENUM NO. SETUP KERNEL * ** * *TERMTASK DS 0H * * LT R1,ANCHPARM LOAD ACB ADDRESS * * BZ BADLINK NO LINKAGE PASSED * ** * * LHI R7,SESSVTAM_LEN LOAD SESSION STORAGE LENGTH * * GETMAIN R,LV=(R7),LOC=BELOW * ** * * LR R6,R1 LOAD DYNAMIC SESSION * * LA R8,INITVTAM LOAD INIT MODEL * * LHI R9,INITVTAL LOAD INIT MODEL LENGTH * * MVCL R6,R8 COPY INIT MODEL SESSION * ** * * ST R1,ANCHVTAM STORE SESSION VTAM BLOCK * * LR VTAMREG,R1 LOAD STORAGE ADDRESS * * USING SESSVTAM,VTAMREG * * L R1,ANCHPARM LOAD ACB ADDRESS * * L ACBREG,0(R1) PICK UP ACB ADDRESS * ** * * MVC SESSVTAM_EYE,=CL8'SESSVTAM' SET EYECATCHER * * LA RPLREG,SESSRPL SET UP BASE FOR RPL DSECT * * LA NIBREG,SESSNIB LOAD BASE FOR NIB DSECT * * USING IFGRPL,RPLREG * * USING ISTDNIB,NIBREG * ** * * L R2,4(R1) POINT TO THE SYMBOLIC NAME OF * ** THE LOGICAL UNIT * * MVC NIBSYM,0(R2) GET THE SYMBOLIC LUNAME * * MVC NIBUSER,4(R2) USE LAST 4 BYTES OF LUNAME * * MVC NIBCID,20(R1) PUT CID INTO NIB FOR OPNDST * ** * * ST ACBREG,RPLDACB STORE ACB ADDRESS IN SESSION RPL* * MVC RPLUSFLD,4(R2) PUT USER FIELD IN OPNDST RPL ...* ** VTAM DOES NOT SET IT ON OPNDST * * B TERMINQ * ** * *TERMINQ DS 0H * * SR R15,R15 * ** * * LA BINDREG,SESSBIND LOAD ADDRESS OF BIND AREA * ** * * INQUIRE RPL=(RPLREG),NIB=(NIBREG),OPTCD=SESSPARM, ** * AREA=(BINDREG),AREALEN=L'SESSBIND * * LTR R15,R15 SESSION INQUIRE SUCCESSFUL? * * BZ TERMOPEN YES. OPEN SESSION * ** * * LA R1,=CL8'PRT106E' * * ST R1,CALLPRM1 STORE ADDRESS IN PARM LIST * ** * * LA R1,NIBSYM LOAD ADDRESS OF VTAM LU NAME * * ST R1,CALLPRM2 * ** * * LA R1,RPLRTNCD LOAD ADDRESS OF VTAM RETURN CODE* * ST R1,CALLPRM3 * ** * * LA R1,VTAMFDB2 LOAD ADDRESS OF VTAM FEEDBACK2 * * ST R1,CALLPRM4 * ** * * LA R1,RPLSSNSI LOAD ADDRESS OF VTAM SENSE CODE* * ST R1,CALLPRM5 * * OI CALLPRM5,X'80' FLIP HIGH ORDER BIT * ** * * LA R1,CALLPLST LOAD ADDRESS OF PARM LIST * * L R15,KERNWTO LOAD ADDRESS * * CALL (R15) CALL WTO DRIVER MODULE * ** * *TERMOPEN DS 0H * * USING ISTDBIND,BINDREG * * ST BINDREG,SESSBNDA STORE IN VTAM SESSION BLK * * MVHI SESSBNDL,L'SESSBIND MOVE BIND AREA LENGTH * ** * * OPNDST RPL=(RPLREG),NIB=(NIBREG),OPTCD=(ACCEPT,SPEC,NQ) * * LTR R15,R15 SESSION ESTABLISHED? * ** * * BZ GETKENUM YES. * * TM KERNFLG3,KERNVRBS VERBOSE MESSAGING ENABLED? * ** * * ST R0,VTAMFDB2 STORE IN VTAM FEEBACK2 * * ST R15,VTAMRETC STORE IN VTAM RETURN CODE * * ST R15,SAVERC STORE IN PROGRAM RETURN CODE * ** * * LA R1,=CL8'PRT103E' * * ST R1,CALLPRM1 STORE ADDRESS IN PARM LIST * ** * * LA R1,NIBSYM LOAD ADDRESS OF VTAM LU NAME * * ST R1,CALLPRM2 * ** * * LA R1,RPLRTNCD LOAD ADDRESS OF VTAM RETURN CODE* * ST R1,CALLPRM3 * ** * * LA R1,VTAMFDB2 LOAD ADDRESS OF VTAM FEEDBACK2 * * ST R1,CALLPRM4 * ** * * LA R1,RPLSSNSI LOAD ADDRESS OF VTAM SENSE CODE* * ST R1,CALLPRM5 * * OI CALLPRM5,X'80' FLIP HIGH ORDER BIT * ** * * LA R1,CALLPLST LOAD ADDRESS OF PARM LIST * * L R15,KERNWTO LOAD ADDRESS * * CALL (R15) CALL WTO DRIVER MODULE * ** * ** * *TERMDISC DS 0H * * CLSDST RPL=(RPLREG),OPTCD=SYN,ACB=(ACBREG),NIB=(NIBREG) * ** * * B RETURN * ** * *SOKTTASK DS 0H * * OI ANCHRTYP,TYPCSOKT SET SOCKET CHILD FLAG * ** * * LT R10,ANCHPARM GET ADDRESS OF SOCKET BLOCK * * BZ BADLINK NO LINKAGE PASSED * ** * * LHI R9,SESSSOKT_LEN LOAD SESSION SOCKET LENGTH * * GETMAIN R,LV=(R9),LOC=31 * * ST R1,ANCHSOKT STORE NEW SOCKET BLOCK IN ANCHOR* ** * * LR R8,R1 LOAD REGISTER * * LR R11,R9 SET LENGTH OF SESSSOKT * * MVCL R8,R10 COPY SOCKET BLOCK * ** * * USING SESSSOKT,R1 * * XC EZAAREA,EZAAREA CLEAR EZASMI API AREA * * XC SOKTSAVE,SOKTSAVE CLEAR SOCKET SAVE AREA * * DROP R1 * ** * * B GETKENUM * ** * *GETKENUM DS 0H * * L R1,KERNNUM LOAD CURRENT KERNEL NUMBER * * ST R1,ANCHNUM STORE CURRENT TASK NUMBER * * AP KERNNUM,=P'1' INCREMENT KERNEL NUMBER * ** * *UPDTKERN DS 0H * * L R9,KERNLAST LOAD LAST ANCHOR * * ST R9,ANCHPREV STORE LAST ANCHOR AS PREVIOUS* * ST ANCHREG,KERNLAST STORE AS LAST KERNEL ANCHOR * * LT R1,KERNFRST FIRST ANCHOR ZERO? * * BZ STORFRST YES. SET AS FIRST ANCHOR * * B STORLAST NO. APPEND AS LAST ANCHOR * ** * *STORFRST DS 0H * * ST ANCHREG,KERNFRST STORE AS FIRST KERNEL ANCHOR* * B INITANCH INITIALIZE ANCHOR * ** * *STORLAST DS 0H * * LR ANCHREG,R9 LOAD LAST KERNEL FOR UPDATE * * L R9,SAVEANCH RELOAD CURRENT ANCHOR * * ST R9,ANCHNEXT STORE CURRENT ANCHOR AS NEXT* ** * *INITANCH DS 0H * * L ANCHREG,SAVEANCH RELOAD CURRENT ANCHOR * * OI ANCHSTS,STSATCH SET AS ATTACH STATUS * ** * * POST KERNTECB POST TASK CONTROL ECB * ** * * B RETURN * ** * *BADLINK DS 0H * * WTO 'PORTDSPI BADLINK' * * ABEND 99,DUMP * * B RETURN * ** * *RETURN DS 0H * * L R13,SAVEAREA+4 RESTORE R13 * * L R2,SAVERC LOAD RC * ** * * LHI R0,WORKLEN LOAD WORK AREA LENGTH * * FREEMAIN RU,LV=(R0),A=(WORKREG) * ** * * LR R15,R2 LOAD RC FROM R2 * * L R14,12(R13) RESTERE R14 * * LM R0,R12,20(R13) RESTORE R0-R12 (RETAIN R15)* * BR R14 RETURN TO CALLER* ** * * LTORG * ** * *INITVTAM DS 0F * * ORG INITVTAM+SESSVTAM_INIT * *INITRPL RPL AM=VTAM,RESPOND=FME * *INITNIB NIB MODE=RECORD,PROC=(RESPX,TRUNC,NEGBIND) * *INITBIND DS CL256 * *INITVTAL EQU *-INITVTAM * ** * * END * ************************************************************************ ** SESSION VTAM CONTROL BLOCK * ** THIS CONTROL BLOCK CAN BE ADDRESS FROM THE BRIDGE CONTROL BLOCK. * ************************************************************************ *SESSVTAM DSECT * *SESSVTAM_EYE DS CL8 VTAM EYE CATCHER * *SESSRECB DS F RECEIVE ECB * *SESSPRI DS H PRIMARY SIZE * *SESSALT DS H ALTERNATE SIZE * *SESSATTR DS F ATTRIBUTES * *SESSBNDA DS F BIND ADDRESS * *SESSBNDL DS F BIND LENGTH * * DS CL4 * *SESSVTAM_INIT EQU *-SESSVTAM * *SESSRPL RPL AM=VTAM,RESPOND=FME * *SESSNIB NIB MODE=RECORD,PROC=(RESPX,TRUNC,NEGBIND) * *SESSBIND DS CL256 BIND AREA * *SESSVTAM_LEN EQU *-SESSVTAM * Thank you, Brian Chapman On Thu, Nov 10, 2022 at 12:21 PM Michael Stein <[email protected]> wrote: > On Thu, Nov 10, 2022 at 07:14:34AM -0500, Brian Chapman wrote: > > Michael, > > > > Are you saying that sense code 084E is only applicable for LU6.2? > > I'm saying the page you linked to was for LU6.2 and as far as I know > 3270s aren't LU6.2. > > Also I'm still very very uncertain what you are doing. At least I now > know you aren't running a TSO session, but what you are doing is still > unclear. I've just sort of assumed it's some sort of VTAM application > and talks to 3270s. > > So what's unknown is the VTAM network environment like (modetab?, cross > domain?), what kind of 3270 you have: LU type? (or emulate?), what the > VTAM application is doing (like code?). > > In trying to guess what's needed (it's been a long time) I looked at some > old VTAM application code which talked to 3270s (back then real 3270s). > They don't seem to deal with the session parameters so they are getting > set somewhere else than in the VTAM application... > > The question is then why is your application different? > > > You have 3 R6's?: > ... > > DMHREG is only in effect for the small section of code before the DROP > > instruction. I could have used the VTAMREG equate in the MVCL section, > but > > I wanted to be sure that it utilized an even-odd pair. In this case it > > would have, but I like the flexibility of changing my equate assignments > if > > necessary. > > Yes, even-odd pair is yet another reason to use only numbered registers. > > You can do whatever you want, but I'd recommend: > > a. only use r0-r15 > b. include comments on register usage at important points > > I feel that part of writing assembly code is register assignment and > it should be clear from the code and comments what is assigned. > > And the information on register usage should be local to where the > registers are used, not hidden at the beginning of the program (or worse > hidden in another source / macro file). > > *VTAMREG EQU R6 > *NIBREG EQU R8 > > # ---- > > *ALLOCATE DS 0H > * LHI R7,TASKANCH_LEN LOAD SESSION ANCHOR LENGTH > * GETMAIN R,LV=(7),LOC=31 > * LR R6,R1 LOAD REGISTER > ** > * LA R8,0 SET DUMMY FROM ADDRESS > * SR R15,R15 ZERO FROM LENGTH > * MVCL R6,R14 INITIALIZE WITH LOW VALUES > > So NIBREG has 0 now? > > # ---- > > The following DS 0F and ORG leave a "hole" in your code which in the load > module might contain anything. And it might change every time your > code was reassembled or linked. > > I don't know what is in that offset in the SESSVTAM DSECT but the > begining of it is being initalized to unknown values... > > Likely the area should be zeroed after the GETMAIN and only the needed > fields initialized (or else the ORG area replaced with zeros?). > > *INITVTAM DS 0F > * ORG INITVTAM+SESSVTAM_INIT > *INITRPL RPL AM=VTAM,RESPOND=FME > *INITNIB NIB MODE=RECORD,PROC=(RESPX,TRUNC,NEGBIND) > *INITVTAL EQU *-INITVTAM > > PS: I believe that there are 3270 type VTAM application codes on the > cbttape as well as elsewhere. While these may not be the best code, > they might give you hints as to what is needed to get you past > connecting to a 3270. > > ---------------------------------------------------------------------- > For IBM-MAIN subscribe / signoff / archive access instructions, > send email to [email protected] with the message: INFO IBM-MAIN > ---------------------------------------------------------------------- For IBM-MAIN subscribe / signoff / archive access instructions, send email to [email protected] with the message: INFO IBM-MAIN
