Oppolzer - Informatik / Blog


Blog-Hauptseite      Neuester Artikel      Älterer Artikel      Neuerer Artikel      Älterer gleiche Kategorie      Neuerer gleiche Kategorie

ASSEMBLER-L - Dateiende-Verarbeitung (EODAD) strukturiert einbauen (mit SP-Makros)

Subject:

Re: ASM Program to copy a file

From:

Bernd Oppolzer <bernd.oppolzer@T-ONLINE.DE>

Reply-To:

IBM Mainframe Assembler List <ASSEMBLER-LIST@LISTSERV.UGA.EDU>

Date:

2011.12.10 07:36:58


On 12/10/2011 4:08 AM, Bernd Oppolzer wrote:
> To solve this problem, I ended up with a GET routine for every QSAM dataset,
> where the EODAD address is part of the routine. The GET routine looked like
> this (from memory, I don't have the sources at hand):
>
> GET1     PSTART (R10,R14)    start macro for local procedure
>          GET   DATASET1      get record from dataset
>          XR    R15,R15       set eof rc to zero
>          LR    R5,R1         move record address to reg 5
>          LEAVE ,             success, leave proc (comma VERY important!!)
> EOF1     DS    0H            = EODAD address of DATASET1
>          LA    R15,8         end of file, set eof rc to 8
> GET1Z    PSTOP (R10,R14)     end macro for local procedure
>
> so the EODAD branch is hidden in the GET-ROUTINE.

We have done similar things. Typically the caller places the DCB address in R1
and does a JAS[L] to the 'GetNextRec' subroutine. It expects back R1 (record
pointer for MACRF=L) and R15 (return code: 0=OK, 4=EOF). In addition to setting
return codes, the subroutine ensures R1 contains an invalid address in the EOF
case.

|       L     R1,InputDCB1      Point to input DCB 1
|       JAS   R14,GetNextRec    Get next record
|       DOEXIT LTR,R15,R15,NZ   Exit if nothing left
|       .
|       .

|GetNextRec DC 0H
|     STKPUSH (R14)           Save link register
|     DO ,                    Do for GET
|       GET   (1)               Get next record
|       XR    R15,R15           Set retcode = 0
|       LEAVE ,                 Exit
|GetNextEof DC 0H <--- EOF branches here
|       L     R1,=A(X'7FFFF000) Set invalid address
|       LHI   R15,4             Set retcode = 4 (EOF)
|     ENDDO ,                 EndDo for GET
|     STKPOP (R14)            Restore link register
|     BR    R14               Return

I didn't mention this technique because I knew Steve would not approve. If he
thinks one TM/BNZ is too much overhead, imagine how he feels about adding a
JAS[L]/STKPUSH/STKPOP for every GET! :D

>
> In our shop, we tell the developer to write ASSEMBLER modules without B
> or J instructions. All control flow is done using SP macros, which have
> been developed or at least improved inhouse in the past 35 years (I don't
> know the beginning of the history, because I'm with this company since 1988
> "only").

A very sensible development strategy. It sounds you you guys were (and still
are) way ahead of your time. Thanks for sharing...

--
E.J.

Blog-Hauptseite      Neuester Artikel      Älterer Artikel      Neuerer Artikel      Älterer gleiche Kategorie      Neuerer gleiche Kategorie