[Info-vax] COBOL example $MGBLSC

Arne Vajhøj arne at vajhoej.dk
Thu Sep 7 16:51:20 EDT 2023


On 9/7/2023 1:44 PM, Brian Schenkenberger wrote:
> On 2023-09-07 14:36:31 +0000, Brian Schenkenberger said:
>> I need to tell a customer how to map, assuming this is even possible, 
>> a global section into which I write data for them. They only do COBOL. 
>> :( Is this possibe? How does one reference the data once mapped in the 
>> expanded region? I've tried to make heads or tails of COBOL but I get 
>> totally lost in the PICs.
>>
>> If only somebody would do what Jim Duff did for calling system 
>> services with C but using COBOL. So very few examples exist.
> 
> OK.  I've gotten this far but now I have no idea how to access the data 
> in the mapped region.
> 
> IDENTIFICATION DIVISION.
> PROGRAM-ID. SYSMGBLS.
> ENVIRONMENT DIVISION.
> DATA DIVISION.
> WORKING-STORAGE SECTION.
> 
> ***  EXTERNAL VALUE from SEC.MAR ($SECDEF GLOBAL)
> ***  $ MACRO SEC.MAR
> ***  $ LINK SYSMGBLSC,SEC
> 
> 01 SEC$M_EXPREG    PIC S9(09) COMP VALUE IS EXTERNAL SEC$M_EXPREG.
> 01 SEC$M_PERM    PIC S9(09) COMP VALUE IS EXTERNAL SEC$M_PERM.
> 01 SEC$M_SYSGBL    PIC S9(09) COMP VALUE IS EXTERNAL SEC$M_SYSGBL.
> 
> 01 FLAGS  PIC S9(09) COMP VALUE IS 0.
> 
> 01 RETSTS PIC S9(09) COMP VALUE IS 0.
> 01 GBLSECNAM PIC X(21) VALUE IS "A-GLOBAL-SECTION-NAME".
> 
> 01 INADR.
>   02 ADDRESS-1 PIC S9(09) COMP VALUE IS 512.
>   02 ADDRESS-2 PIC S9(09) COMP VALUE IS 512.
> 
> 01 RETADR.
>   02 ADDRESS-1 PIC S9(09) COMP VALUE IS 0.
>   02 ADDRESS-2 PIC S9(09) COMP VALUE IS 0.
> 
> PROCEDURE DIVISION.
> 0-BEGIN.
> 
>     ADD SEC$M_EXPREG TO FLAGS.
>     ADD SEC$M_PERM TO FLAGS.
>     ADD SEC$M_SYSGBL TO FLAGS.
> 
>     CALL "SYS$MGBLSC"    USING    BY REFERENCE INADR,
>                  BY REFERENCE RETADR,
>                  OMITTED,
>                  BY VALUE FLAGS,
>                  BY DESCRIPTOR GBLSECNAM,
>                  OMITTED,
>                  OMITTED
>              GIVING    RETSTS.
> 
>     IF RETSTS IS FAILURE CALL "LIB$SIGNAL" USING BY VALUE RETSTS.
> 
>     IF RETSTS IS SUCCESS DISPLAY "GLOBAL SECTION MAPPED".
> 
> *** NOW WHAT???
> 
> 0-END.
>     STOP RUN.

I think you will need a hack.

:-)

For inspiration:

$ type main.cob
IDENTIFICATION DIVISION.
PROGRAM-ID. SYSMGBLS.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.

***  EXTERNAL VALUE from SEC.MAR ($SECDEF GLOBAL)
***  $ MACRO SEC.MAR
***  $ LINK SYSMGBLSC,SEC

01 SEC$M_EXPREG    PIC S9(09) COMP VALUE IS EXTERNAL SEC$M_EXPREG.
01 SEC$M_PERM    PIC S9(09) COMP VALUE IS EXTERNAL SEC$M_PERM.
01 SEC$M_SYSGBL    PIC S9(09) COMP VALUE IS EXTERNAL SEC$M_SYSGBL.

01 FLAGS  PIC S9(09) COMP VALUE IS 0.

01 RETSTS PIC S9(09) COMP VALUE IS 0.
01 GBLSECNAM PIC X(21) VALUE IS "A-GLOBAL-SECTION-NAME".

01 INADR.
  02 IN-ADDRESS-1 PIC S9(09) COMP VALUE IS 512.
  02 IN-ADDRESS-2 PIC S9(09) COMP VALUE IS 512.

01 RETADR.
  02 RET-ADDRESS-1 PIC S9(09) COMP VALUE IS 0.
  02 RET-ADDRESS-2 PIC S9(09) COMP VALUE IS 0.

01 DATA-LEN PIC S9(09) COMP VALUE IS 81920.

PROCEDURE DIVISION.
0-BEGIN.

       ADD SEC$M_EXPREG TO FLAGS.

       CALL "SYS$MGBLSC"    USING    BY REFERENCE INADR,
                 BY REFERENCE RETADR,
                 OMITTED,
                 BY VALUE FLAGS,
                 BY DESCRIPTOR GBLSECNAM,
                 OMITTED,
                 OMITTED
             GIVING    RETSTS.

       IF RETSTS IS FAILURE CALL "LIB$SIGNAL" USING BY VALUE RETSTS.

       IF RETSTS IS SUCCESS DISPLAY "GLOBAL SECTION MAPPED".

       CALL "BRIAN" USING BY REFERENCE DATA-LEN, BY VALUE RET-ADDRESS-1.

0-END.
       STOP RUN.
$ type brian.cob
IDENTIFICATION DIVISION.
PROGRAM-ID.BRIAN.
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NBYT2 PIC S9(9) DISPLAY.
01 CVAL PIC S9(9) DISPLAY.
LINKAGE SECTION.
01 NBYT PIC 9(9) COMP.
01 BLOB.
   03 BYT PIC X OCCURS 1000000 TIMES.
*
PROCEDURE DIVISION USING NBYT BLOB.
ACK-PARAGRAPH.
     MOVE NBYT TO NBYT2
     DISPLAY NBYT2
     MOVE FUNCTION ORD(BYT(1)) TO CVAL
     DISPLAY CVAL.
     END PROGRAM BRIAN.
$ @cob
$ cob main
$ cob brian
$ link main + brian
$ run main
GLOBAL SECTION MAPPED
00008192{
00000017H

And yes - the first byte of that global section I setup for the test
has value of 177.

Arne





More information about the Info-vax mailing list