It's because of the relative branch (=+2) two instructions before.  In MI, you 
have to have a ':' before any instruction you branch to.

When you removed the two lines, the instruction it branched to was 
CHECK-WCBTBL-ENTRY: (which *does* have the ':').

How's that for a picky compiler? :-)

--Dave

On Friday 20 February 2004 11:44, Paul Jackson wrote:
> Hi all,
>
> I've tried everything I know but I cannot get this MI source member to
> compile, I consistently get the following error:
> Operation code for instruction number X'000A' invalid.
> Message MCH4204, X'000A' received while running create program command.
>
> If I remove the line in question (CMPNV), and recompile I get the same
> error on the next statement SETSPPO, If I remove that statement the program
> will compile.
>
> Both these statements look fine to me:
>
> CMPNV(B)  THE-OFFSET, WCBTBL-SIZE/NLO(NEXT-WCB-TABLE);
>
> SETSPPO   .WCB-ENTRY, THE-OFFSET;
>
> I have checked that the label NEXT-WCB-TABLE exists as do THE-OFFSET var
> (BIN(4)), WCBTBL-SIZE (BIN4), and .WCB-ENTRY (space pointer)
>
> Here is the complete source member.  I challenge anyone to get this to
> compile.
> P.S. I have tried this on both a V5R1 and V5R2 machines.
>
> Thanks!
> Paul (Stumped in Seattle ).  Source follows:
>
>
> ENTRY RTVJOBLDA(ENTPARM) EXT;
>    /* Declare a pointer to the job name                           */
> DCL SPCPTR P#JOBNAM PARM;
>    /* Declare a pointer to the job user                           */
> DCL SPCPTR P#JOBUSR PARM;
>    /* Declare a pointer to the job number                         */
> DCL SPCPTR P#JOBNBR PARM;
>    /* Declare a pointer to the job data area required (*LDA etc)  */
> DCL SPCPTR P#JOBARA PARM;
>    /* Declare a pointer to the passed LDA space.                  */
> DCL SPCPTR P#RETSPC PARM;
>    /* Declare a pointer to the returned code.                     */
> DCL SPCPTR P#RETCDE PARM;
>    /* Parameter list.                                             */
> DCL OL ENTPARM(P#JOBNAM,P#JOBUSR,P#JOBNBR,P#JOBARA,
>                P#RETSPC,P#RETCDE) EXT PARM MIN(0);
>  /* Job name      */
>   DCL DD #JOBNAME CHAR(10) BAS(P#JOBNAM);
>  /* Job user name */
>   DCL DD #JOBUSER CHAR(10) BAS(P#JOBUSR);
>  /* Job number */
>   DCL DD #JOBNBR CHAR(6) BAS(P#JOBNBR);
>  /* Job data area */
>   DCL DD #JOBARA CHAR(4) BAS(P#JOBARA);
>
>  /* Returned LDA value */
>
>   DCL DD #RETSPC CHAR(2000) BAS(P#RETSPC);
>
>  /* Returned code */
>
>   DCL DD #RETCDE PKD(1) BAS(P#RETCDE);
>
>  /* Current Job PCO space */
>
>   DCL DD OWN-PCO CHAR(512) BASPCO;
>
>  /*------------------------------------------*/
>  /* Pointer in PCO to Master Table (QWCBT00) */
>  /*------------------------------------------*/
>       DCL SYSPTR @WCBT00 DEF(OWN-PCO) POS(433);    /* Offset X'1B0' */
>
>
>   DCL SPCPTR .WCB-ROOT;
>   DCL DD WCB-ROOT CHAR(2048) BAS(.WCB-ROOT);
>       DCL  SYSPTR .WCB-TABLES(30) DEF(WCB-ROOT) POS(577);
>
>   /*  Work variables */
>
>   DCL DD THE-TABLE  BIN(4);
>   DCL DD THE-OFFSET BIN(4);
>
>   /*  Size of the Work Control Block table(s) */
>
>   DCL SPCPTR .WCBSPC;
>   DCL DD WCBTBL-SPACE CHAR(256) BAS(.WCBSPC);
>       DCL DD WCBTBL-SIZE BIN(4) DEF(WCBTBL-SPACE) POS(21);
>
>   /*  Work Control Table entry structure      */
>
>   DCL SPCPTR .WCB-ENTRY;
>   DCL DD WCB-ENTRY CHAR(1024) BAS(.WCB-ENTRY);
>       DCL DD WCB-JOBNAM  CHAR(10) DEF(WCB-ENTRY) POS(  1);
>       DCL DD WCB-JOBUSR  CHAR(10) DEF(WCB-ENTRY) POS( 11);
>       DCL DD WCB-JOBNBR  CHAR( 6) DEF(WCB-ENTRY) POS( 21);
>       DCL SYSPTR .JOBPCS          DEF(WCB-ENTRY) POS( 33);
>       DCL SYSPTR .JOBLDA          DEF(WCB-ENTRY) POS(113);
>
>
>  /* GDA has a space and actual data space */
>
>   DCL SPCPTR .ARAPTR;
>     DCL DD ARASPACE CHAR(2048) BAS(.ARAPTR);
>       DCL DD ARAOFF BIN(2) DEF(ARASPACE) POS(3);
>
>  /* Space pointer to a PCS space.            */
>
>   DCL SPCPTR .PCSPTR;
>   DCL DD PCSSPC CHAR(4096) BAS(.PCSPTR);
>
>    /* Pointer from the PCSSPC to the jobs GDA.  */
>
>     DCL SYSPTR .JOBGDA DEF(PCSSPC) POS(209);   /* H'D1'  */
>     DCL SYSPTR .JOBPDA DEF(PCSSPC) POS(353);   /* H'161' */
>
>
>  /*------------------------------------------*/
>  /* Executable instructions                  */
>  /*------------------------------------------*/
>
> GET-WCB-ROOT:
>   SETSPPFP     .WCB-ROOT, @WCBT00;  /* Point WCB-ROOT structure at
>                                        address of Master Table. */
>   CPYNV         THE-TABLE, 0;
>
> NEXT-WCB-TABLE:
>   /* If searched maximum table entries, then job not found  */
>   CMPNV(B)    THE-TABLE, 30/EQ(.BP00003);
>
>   ADDN(S)       THE-TABLE, 1;
>
>   /*  If pointer null (end of index reached), then skip to   */
>   /*  "No job found" handling.                               */
>   CMPPTRT(B)   .WCB-TABLES(THE-TABLE), * /EQ(.BP00003);
>
>   /*  Find the size of the table from table header    */
>
>   SETSPPFP     .WCBSPC, .WCB-TABLES(THE-TABLE);
>
>   /*  Search table entries for matching job           */
>
> PREPARE-TO-SEARCH-WCB-TABLE:
>   /* Init pointer to start of table */
>   SETSPPFP     .WCB-ENTRY, .WCBSPC;
>
>   /* Add the offset to start of job entries then skip two statements */
>
>   CPYNV(B)  THE-OFFSET, H'0300'/POS(=+2);  /* first entry */
>
> NEXT-WCTBL-ENTRY:
>   ADDN(S)   THE-OFFSET, H'0400';    /* size of entry */
>   CMPNV(B)  THE-OFFSET, WCBTBL-SIZE/NLO(NEXT-WCB-TABLE);
>
>   SETSPPO   .WCB-ENTRY, THE-OFFSET;
> CHECK-WCBTBL-ENTRY:
>   /* Now test for a job match */
>   CMPBLA(B) #JOBNAME, WCB-JOBNAM/NEQ(NEXT-WCTBL-ENTRY);
>   CMPBLA(B) #JOBUSER, WCB-JOBUSR/NEQ(NEXT-WCTBL-ENTRY);
>   CMPBLA(B) #JOBNBR , WCB-JOBNBR/NEQ(NEXT-WCTBL-ENTRY);
>   /* everything matches - WE HAVE THE JOB!! */
>   B .GOTJOB;
>
> .GOTJOB:
>   BRK 'BREAK002';
>     CMPBLA(B) #JOBARA,C'*LDA'/NEQ(.NOTLDA0);
>
> /* Make sure we have an LDA. Should be a system pointer.        */
>
>     CMPPTRT(B) .JOBLDA,X'01'/NEQ(.BP00004);
>
>  /* Set to LDA space...                                          */
>
>     SETSPPFP .ARAPTR, .JOBLDA;
>   BRK 'BREAK008';
>     ADDSPP .ARAPTR, .ARAPTR, 96;   /* H'60' */
>
>  /* Pass it back.                                                */
>
>     CPYBLAP #RETSPC,ARASPACE(1:1024),C' ';
>     CPYNV #RETCDE,0;
>     B .BP00002;
> .NOTLDA0:
>
>  /* If job is no longer active...                                */
>
>     CMPPTRT(B) .JOBPCS,X'01'/NEQ(.BP00005);
>     SETSPPFP .PCSPTR, .JOBPCS;
>   BRK 'BREAK003';
>     CMPBLA(B) #JOBARA,C'*GDA'/NEQ(.NOTGDA0);
>
>  /* Make sure we have an GDA. Should be a system pointer.        */
>
>     CMPPTRT(B) .JOBGDA,X'01'/NEQ(.BP00004);
>
>  /* Set to GDA space...                                          */
>
>     SETSPPFP .ARAPTR, .JOBGDA;
>   BRK 'BREAK004';
>
>  /* Pass it back.                                                */
>
>     ADDSPP .ARAPTR, .ARAPTR, ARAOFF;
>     ADDSPP .ARAPTR, .ARAPTR, 3;
>   BRK 'BREAK005';
>     CPYBLAP #RETSPC,ARASPACE(1:512),C' ';
>     B .NOTGDA1;
> .NOTGDA0:;
>     CMPPTRT(B) .JOBPDA,X'01'/NEQ(.BP00004);
>
>  /* Set to PDA space...                                          */
>
>     SETSPPFP .ARAPTR, .JOBPDA;
>   BRK 'BREAK006';
>     ADDSPP .ARAPTR, .ARAPTR, ARAOFF;
>     ADDSPP .ARAPTR, .ARAPTR, 3;
>   BRK 'BREAK007';
>     CPYBLAP #RETSPC, ARASPACE(1:2000),C' ';
> .NOTGDA1:;
>     CPYNV #RETCDE,0;
> .BP00002:;
>    DEACTPG * ;
>    RTX *;
>
>  /* Branch here if job not found */
>
> .BP00003:;
>     CPYNV #RETCDE,9;
>     B .BP00002;
>
>  /* Branch here if no LDA */
>
> .BP00004:;
>     CPYNV #RETCDE,8;
>     B .BP00002;
>
>  /* Branch here if job not active */
>
> .BP00005:;
>     CPYNV #RETCDE,7;
>     B .BP00002;
>    PEND;


As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.