Cristi Terpea schrieb:
What am I doing wrong?
I really don't know ;) But why don't you use a little ASM routine?
*
R0 EQU 0
R1 EQU 1
R2 EQU 2
R3 EQU 3
R4 EQU 4 PARMS
R5 EQU 5
R6 EQU 6
R7 EQU 7
R8 EQU 8
R9 EQU 9
R10 EQU 10
R11 EQU 11 BASE
R12 EQU 12 LE/370 COMMON ANCHOR AREA (CAA)
R13 EQU 13 LE/370 DYNAMIC SAVE AREA (DSA)
R14 EQU 14
R15 EQU 15
*
PARM DSECT
PARM_FLG DS F FUNCTION-CODE HEX'C1000000'
PARM_DSN DS F ADDR OF DSN (44 BYTES)
PARM_VOL DS F ADDR OF VOLSER (6 BYTES)
PARM_WRK DS F ADDR OF 140 BYTE WORK/RETURN-AREA
*
*
OBTAIN CEEENTRY PPA=MAINPPA, ADDR OF PROGRAM PROLOG AREA X
AUTO=WORKSIZE, SIZE OF DSECT (-> SAVEAREA!) X
NAB=NO, NAB NOT USED X
MAIN=NO, NO MAINPROG X
EXPORT=NO, DONT EXPORT ENTRYPOINT X
BASE=R11 BASE
*
USING CEECAA,R12 COMMON ANCHOR AREA
USING CEEDSA,R13 DSA + LOCAL (DYNAM.) VARIABLES
*----------------------------------------------------------------------
L R4,0(R1) LOAD ADDR OF PARMS
USING PARM,R4 ADDRESS PARMS
*
OBTAIN PARM INVOKE OBTAIN
ST R15,RETCODE SAVE RC
*
CEETERM RC=RETCODE
*----------------------------------------------------------------------
MAINPPA CEEPPA PROGRAM PROLOG AREA
LTORG
*----------------------------------------------------------------------
CEEDSA DSECT: DYNAMIC SAVE AREA
RETCODE DS F RETURNCODE
DS 0D ENSURE ALIGNMENT!!!
WORKSIZE EQU *-CEEDSA
*----------------------------------------------------------------------
CEECAA DSECT: COMMON ANCHOR AREA
CEEEDB DSECT: ENCLAVE DATA BLOCK
*----------------------------------------------------------------------
So... now you can invoke OBTAIN from C by
int OBTAIN(unsigned long[]);
#pragma linkage(OBTAIN, OS)
#pragma pack(1) /* 1 byte alignment */
typedef struct
{
char Ds1FmtId;
char Ds1Dssn[6];
unsigned short Ds1VolSq;
char Ds1CreDt[3];
char Ds1ExpDt[3];
unsigned char Ds1NoEpv;
unsigned char Ds1NoBdb;
unsigned char Ds1Flag1;
char Ds1SysCd[13];
char Ds1RefDt[3];
unsigned char Ds1SmsFg;
unsigned char Ds1ScXft;
unsigned short Ds1ScXtv;
unsigned char Ds1DsOrg[2];
unsigned char Ds1RecFm;
unsigned char Ds1OptCd;
unsigned short Ds1BlkL;
unsigned short Ds1LrecL;
unsigned char Ds1KeyL;
unsigned short Ds1Rkp;
unsigned char Ds1DsInd;
unsigned char Ds1ScAl1;
unsigned char Ds1ScAl3[3];
unsigned char Ds1LstAr[3];
unsigned short Ds1TrBal;
unsigned char Reserved;
unsigned char Ds1Tthi;
unsigned char Ds1Ext1[10];
unsigned char Ds1Ext2[10];
unsigned char Ds1Ext3[10];
unsigned char Ds1PtrDs[5];
char Filler[44];
} DSCB;
#pragma pack() /* default alignment */
int call_obtain(char *Dsn, char *VolSer)
{
int Rc;
unsigned long Parm[4];
char ParmDsn[44];
char ParmVolSer[6];
DSCB Dscb;
memset(ParmDsn, ' ', 44);
memcpy(ParmDsn, Dsn, strlen(Dsn));
memset(ParmVolSer, ' ', 6);
memcpy(ParmVolSer, VolSer, strlen(VolSer)); /should be 6 always!
Parm[0] = 0xC1000000;
Parm[1] = (unsigned long) ParmDsn;
Parm[2] = (unsigned long) ParmVolSer;
Parm[3] = (unsigned long) &Dscb;
if((Rc = OBTAIN(&Parm[0])) != 0)
return(Rc);
// do something with DSCB
return(0);
}
This is how it works for me in a multithreaded application written in C...
Bye,
Michael
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: GET IBM-MAIN INFO
Search the archives at http://bama.ua.edu/archives/ibm-main.html