I'm guessing the SYSSTATE is required because you don't have a base register (specified BASEREG=NONE) which means you want macro's to use relative instructions.
DSASIZE= is clearly documented as a required argument. It says that DSASIZE=0 is a leaf program that requires 3 specific registers not be touched. It also says that if not 0, then it must be 80 or greater. If it allows between 1 and 79, then register it as a bug. If BASEREG= had a valid register, then your LTORG constants because of the DATA LOCTR. If EDCXPRLG generates the CSECT, then remove the hardcoded CSECT. I wouldn't use FREEMAIN as the ENTNAME= because it creates an external reference that may conflict with something. You might want to consider using STORAGE macro instead of FREEMAIN. The FREEMAIN is unconditional which would cause an abend if something goes wrong. Alternatively, you could make it conditional and give the caller the ability to recover or ignore the failure. Since we don't know how it was allocated, you may need to specify a TCB. Since TCB's are 24 bit, you could pass it as part of the subpool register. It's unlikely the DSA user area is located at the beginning of the DSA. I'm guessing that the DSA macro will tell you how to address your user area in the DSA.
