There has been a recent development that means that I now have a C90-compliant compiler, assembler and linker that allows me to produce MVS load modules (in IEBCOPY unload) on basically any environment - ASCII or EBCDIC (I've only tested building on Windows and running on z/PDOS though).
So here is what I do: gcc370 -Os -S -I. testmvs.c as370 -a=testmvs.lst -o testmvs.o testmvs.s gcc370 -Os -S -I. mvs.c as370 -a=mvs.lst -o mvs.o mvs.s as370 -a=llmvs.lst -o llmvs.o llmvs.asm pdld -e main --oformat mainframe -o testmvs.exe testmvs.o mvs.o llmvs.o The executables used above are available in the dos directory of the PDOS/386 hard disk image (pdos.zip) at pdos.org The assembler used is more-or-less standard HLASM, but the pseudo-ops are not, and nor are macros available. However, for my goal, that is not a problem as almost all assembler will be temporary and C-generated. Also note that the object code above is ELF - but again - temporary so I'm not concerned about it being non-MVS-standard. Note that pdld accepts standard object code also, and you can also have both forms of object code as input. Also note that the pdld author is likely to be willing to make small usability modifications if desired. And there are two different ways I would like my executables to run. One is to do an SVC, like SVC 35 to do a WTO. The other is for the application to detect at startup whether it was called from a PDOS-generic environment, and if so, when it is time to do an SVC - channeled into the __svc function - it instead does a callback. So real SVCs do not need to exist/be accessible. The PDOS-generic loader would probably do something like zap the first 4 bytes of the executable to be a pointer to a structure. Meaning the executables are limited to the ones that are built aware of this. For my use case that is fine, but some other mechanism could potentially be used. Normally my C programs have some startup assembler to create a stack, as seen here: https://sourceforge.net/p/pdos/gitcode/ci/master/tree/pdpclib/mvsstart.asm But I have omitted that in my test program, thus the OS needs to provide a stack, thus the test program at http://pdos.org/mftest.zip only works with z/PDOS available from pdos.org I have also omitted the PDOS-generic environment detection and use. Anyway, this is my question. I am wondering whether there is an existing C interface to MVS. There wasn't at the time of MVS 3.8J - not from IBM anyway - but there might have been some 3rd party vendor. Or maybe IBM now provides one that could be backdated to MVS 3.8J. It's unclear to me what the proper interface should be. I have experience in adding wrappers to MSDOS APIs, like this: unsigned int PosDisplayOutput(unsigned int ch) { union REGS regsin; union REGS regsout; regsin.h.ah = 0x02; regsin.h.dl = ch; int86(0x21, ®sin, ®sout); return (regsout.h.al); } (in pos.c in the pdos/src) but the mainframe tends to only use a single register, and may require a different breakdown. Here is what I did just to prove that it works: #include "mvs.h" int wto(int len, int flags, char *msg) { char buf[84]; regs regsin; regs regsout; *(short *)buf = len; *(short *)(buf + 2) = flags; if (len > 84) len = 84; if (len < 4) return (0); memcpy(buf + 4, msg, len - 4); regsin.r[1] = (int)buf; __svc(35, ®sin, ®sout); return (0); } Any suggestions/direction? Thanks. Paul. * Function __svc code L r7,0(,r1) L r8,4(,r1) L r0,0(,r8) L r1,4(,r8) L r15,60(,r8) EX r7, .LSVC1 B .LSVC2 .LSVC1: SVC 0 .LSVC2: #include <mvs.h> int main(void) { wto(9, 0, "CHUMP"); return (0); } ---------------------------------------------------------------------- For IBM-MAIN subscribe / signoff / archive access instructions, send email to [email protected] with the message: INFO IBM-MAIN
