[Info-vax] COBOL example $MGBLSC

Brian Schenkenberger mail at SendSpamHere.ORG
Fri Sep 8 12:45:04 EDT 2023


On 2023-09-07 23:21:18 +0000, Arne Vajhj said:

> On 9/7/2023 6:26 PM, Brian Schenkenberger wrote:
>> On 2023-09-07 20:51:20 +0000, Arne Vajhj said:
>>> 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.
>> 
>> Thanks for trying.  I'm totally lost. Why are you DISPLAYing in the 
>> data segment? FUNCTION ORD?
> 
> The routine BRIAN just displays the length passed and
> the first byte of the data passed.
> 
> It is to verify that the call is working.
> 
> The hack is this:
> 
>  >> 01 RETADR.
>  >>   02 RET-ADDRESS-1 PIC S9(09) COMP VALUE IS 0.
>  >>   02 RET-ADDRESS-2 PIC S9(09) COMP VALUE IS 0.
> 
>  >>        CALL "SYS$MGBLSC"    USING    BY REFERENCE INADR,
>  >>                  BY REFERENCE RETADR,
> 
> RET-ADDRESS-1 and RET_ADDRESS-2 are lonmgwords
> that after the call to MGBLSC contains start
> and end address of the mapped area.
> 
>  >>        CALL "BRIAN" USING BY REFERENCE DATA-LEN, BY VALUE RET-ADDRESS-1.
> 
> Now we call BRIAN with second argument being a longword passed
> by value.
> 
> But a longword that contains an address.
> 
>  >> LINKAGE SECTION.
>  >> 01 NBYT PIC 9(9) COMP.
>  >> 01 BLOB.
>  >>    03 BYT PIC X OCCURS 1000000 TIMES.
>  >> *
>  >> PROCEDURE DIVISION USING NBYT BLOB.
> 
> BRIAN expect a structure BLOB (containing a byte array here,
> but it could be anything) passed by reference.
> 
> SO the trick is to pass a longword by value containing the
> address to a routine expecting a structure by reference.
> 
>> 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?
> 
> I believe POINTER is just a container.
> 
> Arne

I have the SYS$MGBLSC working... at least, in the debugger.  I defined 
a test global section with two longwords.

1,-1
2,-2
3,-3
etc.,-etc.
0,0

I have the following for the global section's element definition:

LINKAGE SECTION.

01 GLOBAL-SECTION.
  02 ELEMENT OCCURS 2000 TIMES.
    03 A        PIC S9(9) COMP.
    03 B        PIC S9(9) COMP.

and the procedure...

PROCEDURE DIVISION USING GLOBAL_SECTION.
PARAGRAPH-MAIN.
    PERFORM PARAGRAPH-ENTER THRU PARAGRAPH-EXIT
            VARYING I FROM 1 BY 1 UNTIL A(I) = 0 AND B(I) = 0.
PARAGRAPH-ENTER.
    DISPLAY "First[" I "]: " A(I) "  Second[" I "]: " B(I).
PARAGRAPH-EXIT.
    EXIT.
END PROGRAM GBLSEC.

In the debugger, A(I) and B(I) show me the values but DISPLAY pukes on 
them. It'd be great too if there was a way to DISPLAY them in HEX but 
just getting it to DISPLAY without regurgitaing garbage would be great.

I also can't figure out how to define GLOBA:L-SECTION ELEMENT OCCURS * 
TIMES. The number of the elements in the global section could be quite 
variable.

 




More information about the Info-vax mailing list