The one main thing I see is that you should never have a code label on a DS 0C (or EQU*). DS 0H (or DC 0H) is the usual thing. Sooner or later, such a label will assemble to an odd address, and you'll have to fix it.

Indexing through the ARG list doesn't make much sense here. Elaborate the ARG Dsect to have labels for each argument and refer to them. That eliminates the need for your AFIs, but that's the least of the benefit.

Also, fix your email so I can reply to the list, not your personal email.

sas

On 12/8/2015 19:43, Frank Swarbrick wrote:
I am not a sysprog, and I don't often write assembler (and when I do I've often 
forgotten many things I once knew).  I'm wondering if someone might take a look 
at a little assembler routine I wrote to load a 'data only assembler table' and 
retrieve its length as well.  It will be called with something like this:
  identification division.
  program-id.  sizetst.
data division.
  working-storage section.
  01  modsize                     pic s9(8) comp-5.
  01  modname                     pic x(8).
  01  rowcnt                      pic s9(9) comp-5.
linkage section.
  01  mytab.
      05  myrow                   pic x(80) occurs unbounded
                                            depending on rowcnt
                                            indexed by rownbr.
procedure division.
      move 'XML1V2K' to modname
      call 'MODLOAD' using modname modsize
                           address of mytab
      compute rowcnt = modsize / 80
      perform varying rownbr from 1 by 1 until rownbr > rowcnt
          display myrow(rownbr)
      end-perform
      goback.
end program sizetst.

And here is the program:
*PROCESS RENT
          SYSSTATE ARCHLVL=2
MODLOAD  CEEENTRY MAIN=NO,AUTO=L'LOCALSTG
          DROP R11                  WE DON'T NEED NO STINKIN' BASE REG!
          USING LOCALSTG,CEEDSA     Auto stg and DSA use the same base         
LR    R11,R1              SAVE ARG LIST ADDR IN R11
          USING ARGS,R11
BLDLSIZE DS    0C                  CALL BLDL TO GET MODULE SIZE
          LHI   IDX,0               R2 = INDEX TO ARG 1
          L     R10,ARG(IDX)
          USING MODNAME,R10
          MVHHI BLDL_FF,1           NBR OF RESULT ENTRIES FOR BLDL
          MVHHI BLDL_LL,BLDLDELN    LEN OF EACH BLDL ENTRY
          MVC   PDS2NAME,MODNAME
          BLDL  0,BLDLAREA
          LTR   R15,R15             CHECK RETURN CODE
          JNZ   RETURN              RETURN IF NOT ZERO
          AFI   IDX,L'ARG           INDEX NEXT ARG (ARG 2)
          L     R10,ARG(IDX)
          USING MODSIZE,R10
          MVI   MODSIZE,0           INITIALIZE BYTE 1
          MVC   MODSIZE+1(3),PDS2STOR COPY 2-4 FROM PDS2STOR
LOAD     DS    0C                  CALL LOAD TO LOAD THE MODULE
          LA    R4,PDS2NAME         BLDL ENTRY FOR DE PARM
          AFI   IDX,L'ARG           INDEX NEXT ARG (ARG 3)
          L     R5,ARG(IDX)         LOADPT WILL BE STORED IN ARG 3
          LOAD  DE=(R4),LOADPT=(R5) NOW LOAD THE MODULE
RETURN   CEETERM RC=(R15),MODIFIER=(R0)
          DROP  R11,R10
          DROP  R13
*
PPA      CEEPPA VER=1,REL=1,MOD=0 SERVICE=?
          CEEDSA ,
          CEECAA ,
*
ARGS     DSECT ,                   ARG LIST
ARG      DS    3A                  3 ARGS
*
MOD_NAME DSECT ,                   ARG #1
MODNAME  DS    CL8
*
MOD_SIZE DSECT ,                   ARG #2
MODSIZE  DS    F
*
@LOCALSTG DSECT ,                  AUTOMATIC STORAGE WORK AREA
          ORG   *+CEEDSASZ          Leave space for the DSA fixed partBLDLAREA 
DS    0CL77
BLDL_FF  DS    H                   NUMBER OF ENTRIES
BLDL_LL  DS    H                   NUMBER OF BYTES PER ENTRY
          IHAPDS DSECT=NO
LOCALSTG EQU   @LOCALSTG,*-@LOCALSTG,C'C'*
BLDLDELN EQU   L'BLDLAREA-L'BLDL_FF-L'BLDL_LL
          YREGS ,
IDX      EQU   R2

It works as designed.  Any and all constructive comments are 
welcome!Thanks,Frank

Reply via email to