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.
|