I tried to take out the extraneous stuff from the DCB. I got this:
DCBIN1 DCB DDNAME=INPUT,EODAD=EOF,MACRF=GM,DSORG=PS
===
Why do I care about the caller's AR's? I copied the preamble from a properly
written program that went briefly into supervisor mode. Otherwise, I normally
don't.
I've so far made it a habit of starting and ending like this. One day I'll
learn macro, though at this point in my life it feels like James Joyce.
BAKR 14,0
LR my-base-whatever,R15
USING etc
... ... ...
PR ,
===
Block size, etc, I didn't care about, because the idea of this exercise came
from a comment about an interview of a potential assembler programmer: Write
an assembly program on the white board there to copy one file to the next. I
wrote a few Rexx functions, but never any standard print/punch IO. QSAM, or
anything else.
===
I of course do know that the docs have to assume a certain level of knowledge,
otherwise where to start? That's only fair. At my level, since I have to
create my own challenges, I cannot expect anything other than to learn it all
myself, and of course with help from my friends. And even with no friends, I
can still learn on my own.
Back when I started, I remember, I was so excited when I found out there was
documentation! They kept it on a table in the room near where the "older"
smokers sat, so I didn't go in there very often. And in the middle of a pile
of printouts I didn't notice such stuff. When I asked specifically about
such-and-such doc I was told, documentation is expensive.
Mostly at first I learned 80+ยด% from reading existing code, and about 15% from
a more senior person. In my case a great guy who didn't know a lot about
facts, but could really get the job done. He was a good consultant. Oh, and
he got good and stoned during lunch every day. This was about 1988 or so.
Unnecessary crap where it shouldn't be is/was one thing that tripped me up
quite often. How many times I copied subroutines that I didn't use. Lots.
===
DFSMS, Chapter 5 - Been in front of me the whole day. :-)
===
AH! It was where my program was loaded that was the problem with the DCB's.
Ok, that makes sense. I was wondering, how can I put my DCB's into 24 bit
storage, but have my program run in 31 or 64 bit...
I am assuming here based on my limited knowledge, and most of what I read
today: I would somehow put just the DCB's below, one way, perhaps, by using
STORAGE OBTAIN LOC=BELOW and then using the DCB MF=L macro format. There is
some more wizardry there I think, perhaps using USING's or some such.
Now, that is just from my head. And only because I looked at it for a long
time today.
===
Perhaps someone will know more why it should be watched, but this I see in the
docs:
T
requests the user totaling function. If this function is requested, EXLST
should specify the address of an exit list that includes a totaling entry. T
cannot be specified for a SYSIN or SYSOUT data set.
User totaling can be specified for only sequential data sets that are not
extended format data sets. If specified for a partitioned data set, a PDSE, an
extended format data set, or a UNIX file, user totaling is ignored.
Gerorge S. Says:
T (watch this one) substitute mode.
===
Thanks so much as always, Steve.
Lindy
-----Original Message-----
From: IBM Mainframe Assembler List [mailto:[email protected]] On
Behalf Of Steve Comstock
Sent: Thursday, December 08, 2011 7:57 PM
To: [email protected]
Subject: Re: ASM Program to copy a file
Omit the START statement; the CSECT statement does the same thing.
> DS 0H
Don't need the above; your program is guaranteed to be loaded at an address on
a doubleword boundary at the least
> BAKR R14,0 Save caller's ARs and GPRs
Why do you care about the caller's ARs? First, you are a main program so the
caller is z/OS. Overkill. Why not use standard save area chaining?
> LR R12,R15 Set up 1st base register
> USING COPYFILE,R12 and inform assembler
> OPEN (DCBIN1,(INPUT),DCBOUT1,(OUTPUT))
> LOOP DS 0H
> GET DCBIN1,INOUTBUF
> PUT DCBOUT1,INOUTBUF
> B LOOP
> EOF DS 0H no more records
> CLOSE (DCBIN1,,DCBOUT1)
> XR 15,15
> PR ,
>
> DCBIN1 DCB BLKSIZE=80,DDNAME=INPUT,RECFM=FB,LRECL=80,DSORG=PS, X
> EODAD=EOF,MACRF=GM
For input files, if the file is standard labeled tape or disk, or even SYSIN,
you don't need BLKSIZE, RECFM, or LRECL
> DCBOUT1 DCB BLKSIZE=80,DDNAME=OUTPUT,RECFM=FB,LRECL=80,DSORG=PS, X
> MACRF=PM
You code RECFM=FB, so you should block your records up for performance; set
BLKSIZE as some multiple of LRECL up to
32760
Although if you are writing to SYSOUT, unblocked is fine since JES will block
it for you anyway; in that case, probably better to code RECFM=F
> INOUTBUF DS CL80 Input/Output Storage Area
> END ,
>
>
> Notes:
> 1. That EODAD is nice. As a matter of fact, this looks strangely a lot like
> a Cobol program.
> I can almost see where Grace got her inspiration.
> 2. Those horrible S0C4's. First one was a S0C4-10, unknown module, and
> happened
> on the OPEN. How could I have debugged this? The problem that I found
> from
> reading (yes reading the docs, I do) the docs carefully, was that DCB's
> have
> to be in 24 bit mode storage. Whoops.
> Where (and what kind of) in the dump would show that information?
Not clear here. The dump will not show you that DCBs have to be in 24-bit
storage. That piece of information comes from the docs:
http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/Shelves/EZ2ZO213
DFSMS Using Data Sets SC26-7410-11 (the z/OS 1.13 version)
[ I love this quote, from the PDF version, p. 326 [logical
page number, 348 physical page number]]:
"It is not the intent of IBM to require extensive education
to use assembly language programming."
around this place in the doc, there is an extensive discussion
with samples
DFSMS Macro Instructions for Data Sets SC26-7408-10 (the z/OS 1.13 version)
starting in Chapter 5, non-VSAM data sets
The dump will show where your module is loaded, and since your DCBs are coded
in your module, your DCBs will be there; it the load address of your module
starts with x'00' or x'80', you are in 24-bit storage; otherwise, you are in
31-bit storage.
> 3. A S0C4-11 because I coded an MVC incorrectly. I coded this:
> MVC INOUTBUF(80),=C'Test record'
> INOUTBUF DS CL80
> A change to MVC INOUTBUF(11),='Test record' works just fine.
> I cheated on this one, too. I wasn't able to tell the problem in the
> dump.
> The dump told me it was the MVC instruction that was wrong, so I just
> guessed that it was because the MVC wasn't correct.
Right. The default length for MVC is the length of the first operand, the
target. So you were moving 80 bytes from your literal pool, but the literal is
only 11 bytes; apparently somewhere after the 11 byte literal your load module
ended near a page boundary, and when you tried to access the bytes on the next
page the hardware found that page was not assigned to you.
> 4. The MACRF options need to be correct, but the assembler warned me
> about those. The docs showed all the options, not just QSAM, so
> I got them mixed up a little.
The Macro instruction doc provides separate DCB parameter lists for each
organization (BDAM, BISAM, BPAM, BSAM, QISAM, QSAM) so you have to pay
attention there, and also to realize that you are using QSAM. So the doc
assumes a lot already, on the part of the reader.
> And I still need to know what MF=T means. The book just says "watch this
> one."
Well, the IBM book doesn't mention that parameter at all.
> I guess in 1969, that was enough.
>
There are other resources available.
--
Kind regards,
-Steve Comstock
The Trainer's Friend, Inc.
303-355-2752
http://www.trainersfriend.com
* To get a good Return on your Investment, first make an investment!
+ Training your people is an excellent investment
* Try our tool for calculating your Return On Investment
for training dollars at
http://www.trainersfriend.com/ROI/roi.html