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 lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html