[Info-vax] COBOL example $MGBLSC

Brian Schenkenberger mail at SendSpamHere.ORG
Thu Sep 7 18:26:24 EDT 2023


On 2023-09-07 20:51:20 +0000, Arne Vajhj said:

> 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

Thanks for trying.  I'm totally lost. Why are you DISPLAYing in the 
data segment? FUNCTION ORD?

This "language" has a POINTER feature but I can't figure out how to use 
it. Isn't there an example ANYWHERE on the net where $EXPREG or 
LIB$GET_VM is used in COBOL?





More information about the Info-vax mailing list