IMO, this interface should work and did never change. Too much software
out there depending on this.
The coding should look like this (from a macro, which looks for a
specific DD - see parm &DD):
L R1,X'21C' ADDRESS OF OWN TCB
L R1,12(R1) ADDRESS OF TIOT
AHI R1,24 ADDRESS OF FIRST DD ENTRY
LA RF,0 RETURN CODE
SR R0,R0
LOOP WHILE,(0(R1),NE,0)
BREAK (4(8,R1),=,=CL8'&DD')
IC R0,0(R1) LENGTH OF DD ENTRY
AR R1,R0 POINT R1 TO NEXT DD ENTRY
OUT NOTFOUND
LA RF,4
ELOOP
If you don't have SP macros (LOOP ... WHILE, BREAK, OUT, ELOOP) like the
ones used above,
rewriting this without using them should be no big deal.
BTW: no ASSEMBLER needed; it's possible to write this in C or PL/1. Here
is my C solution
(the addressing of the own TCB is done differently, but the TIOT
handling is the same;
sorry for the comments in German):
static char *adressiere_tcb (void)
/************************************************/
/* */
/* Ueber die TIOT (Task-IO-Table) */
/* werden die DDNamen und die */
/* zugeordneten DSNamen gesucht */
/* */
/************************************************/
{
char ***cvt_pointer;
char **tcb_tabelle;
cvt_pointer = *((char ****) 16);
tcb_tabelle = *cvt_pointer;
return *(tcb_tabelle + 1);
}
static char *check_ddname (char *ddname)
/************************************************/
/* */
/* Vorgegebener DDName wird gesucht */
/* */
/************************************************/
{
char *adresse_tcb;
char *adresse_tiot;
char *laenge_tiot;
char *ddname_tiot;
adresse_tcb = adressiere_tcb ();
adresse_tiot = *(((char **) adresse_tcb) + 3);
for (laenge_tiot = adresse_tiot + 24;
*laenge_tiot != 0;
laenge_tiot += *laenge_tiot)
{
ddname_tiot = laenge_tiot + 4;
if (memcmp (ddname_tiot, ddname, 8) == 0)
{
return ddname_tiot;
}
}
return NULL;
}
HTH, kind regards
Bernd
Am 24.07.2019 um 19:23 schrieb Richard Kuebbing:
Routine only uses the TIOT entry to see if DD is present. It does that to avoid
OPEN message of missing DD.