Sampl_copy_pgm
AGO .START FIRST, LET'S JUST TALK A BIT.
C:\USERS\LIN\DOCUMENTS\Z390CODE\SAMPCOPY
SET G=C:\USERS\LIN\DOCUMENTS\Z390CODE\SAMPCOPY
SET IN=%G%.PRN
SET OUT=%G%.OUTPUT.OUT.TXT
BAT\ASMLG %G%.MLC TIME(1)
I USE THE ADDRESS AND SET COMMANDS, AND THE ASMLG COMMAND
TO ASSEMBLE AND RUN THE PROGRAM. IF YOU'RE IN A DATA CENTER
USING AN IBM SYSTEM, THEN YOU'LL USE JCL TO ASSEMBLE AND
RUN YOUR PROGRAM.
--------- I USE Z390.ORG TO TEST ASSEMBLER I USE THE STUFF ABOVE ------
IF YOU WORK IN AN IBM MAINFRAME SHOP, YOU'RE GOING TO USE THE ISPF
EDITOR. EVERYONE DOES. GEORGE HAS WRITTEN A REALLY NICE EDITOR
AVAILABLE AT SPFLITE.COM YOU'LL WANT TO DOWNLOAD AND USE IT.
HE'S DONE A REALLY FIND JOB, GIVE HIM THE $20, EVEN THOUGH YOU DON'T
HAVE TO.
I DO MY ASSEMBLER STUFF ON MY PC USING Z390.ORG. IT'S FREE.
THERE ARE SOME THINGS THAT IT DOES DIFFERENTLY THAN A MAINFRAME,
BUT ALL OF THE BASIC INSTRUCTIONS WORK EXACTLY THE SAME.
DOWNLOAD IT AND USE IT. DID I SAY IT'S FREE?
------------------------------------------------------------------
THERE ARE 50 DIFFERENT THINGS, EACH OF WHICH NEEDS TO BE EXPLAINED 1ST.
AN INSTRUCTOR IN THE BANK PROGRAMMING CLASS SAID THAT HE SPENT THE
FIRST MORNING CONFUSING EVERYONE, AND THE REST OF THAT WEEK EXPLAINING
ALL THE CONFUSING STUFF.
IN IBM MAINFRAME LAND, YOU HAVE LOTS OF MEMORY, BUT YOU'LL USE 16M.
THERE ARE ALSO 16 GP (GENERAL PURPOSE) REGISTERS FOR YOU TO USE.
YOUR PROGRAM IS ASSIGNED AN ADDRESS SPACE OF MEMORY TO USE.
YOU MAY NOT CHANGE MAMORY THAT IS NOT YOURS.
YOU CAN EXECUTE INSTRUCTIONS THAT ARE NOT IN YOUR ADDRESS SPACE.
SOME PROGRAM CALLS YOUR PROGRAM, AND YOUR PROGRAM, IN TURN, WILL
CALL OTHER PROGRAMS. YOU ARE RESPONSIBLE FOR SAVING, AND RESTORING,
YOUR CALLER'S REGISTERS. YOUR CALLER WILL PROVIDE A SAVE ARE FOR
YOU TO SAVE HIS REGISTERS, AND YOU MUST PROVIDE A SAVEAREA FOR
SOMEONE TO SAVE YOUR REGISTERS, WHEN YOU CALL THEM. (READING AND
WRITING INVOLVE CALLING SOMEONE ELSE'S ROUTINES. THEY WILL USE THE
SAVE AREA YOU SET UP.) REGISTERS ARE NUMBERED 0-15, (OR 0-F).
WHEN CONTROL COMES TO YOUR PROGRAM:
REG-15 POINTS TO THE START OF YOUR PROGRAM.
REG-14 CONTAINS THE RETURN ADDRESS - GO THERE WHEN YOU'RE DONE.
REG-13 POINTS TO CALLER'S SAVE AREA - SAVE AND RESTORE HIS REGS.
YOUR PROGRAM GETS LOADED SOMEWHERE IN MEMORY.
YOU'RE GOING TO HAVE LABELS TO REFERENCE DATA, OR BRANCH (GO TO)
LOCATIONS. YOU NEED TO HAVE 1 OF YOUR 16 REGISTERS THAT POINTS TO
(OR NEAR) THE BEGINNING OF YOUR PROGRAM, AND THEN ALL YOUR LABEL
REFERENCES CAN BE CONVERTED TO THAT BASE ADDRESS + AN OFFSET FROM
THAT BASE ADDRESS TO WHEREVER THAT LABEL INDICATES.
TO WRITE THIS SIMPLE PROGRAM, YOU'RE GOING TO DO THE FOLLOWING:
1. SAVE ALL CALLER'S REGISTERS.
2. CREATE A 'BASE REGISTER' SO LABELS CAN BE RESOLVED INTO BASE+OFFSET
3. TELL THE ASSEMBLER WHERE YOU CREATED THAT BASE ADDRESS (USING).
4. FORWARD AND BACK CHAIN YOUR, AND YOUR CALLER'S SAVE AREA.
-- THAT'S ALL THE HOUSE KEEPING --
5. OPEN INPUT AND OUTPUT FILES.
6. READ AND WRITE RECORDS UNTIL END OF FILE.
7. CLOSE 2 FILES.
8. RELOAD CALLER'S REGISTERS.
9. RETURN TO CALLER (BR 14)
YOU'LL SEE "DON'T USE REGS 14, 15, 0, 1 BECAUSE THEY GET OVERLAID."
THEY DO GET WIPED OUT. GET AND PUT CHANGE ALL 4 OF THEM.
BUT YOU ARE FREE TO USE THEM IN BETWEEN SUCH USES.
I USE THEM A LOT. A LOT!
I ALWAYS START USING BASE REGISTERS FROM THE TOP,
AND THEN WORK REGISTERS, TO SAVE STUFF, FROM THE BOTTOM.
BTW, THERE IS A HANDY "TRT" INSTRUCTION THAT CHANGES REG-2.
--------- THAT'S ALL THE DESCRIPTION I CAN STAND. LET'S START. -------
.START ANOP
SAMPCOPY START 0 INDICATE YOU'RE STARTING A PROGRAM
STM 14,12,12(13) SAVE THE REGISTERS OF YOUR CALLER
BALR 12,0 GET THE ADDRESS AT THE END OF THIS INST
USING *,12 TELL THE ASSEMBLER THE ADDRESS IN REG-12
LA 2,SAVEAREA YOU NEED A PLACE FOR GET/PUT TO SAVE
* YOUR REGISTERS. AND YOU'RE GOING TO
* LINK YOUR SAVE AREA TO YOUR CALLER'S
* SAVE AREA
ST 2,8(13) STORE YOUR SAVE AREA ADDR IN CALLER'S
ST 13,4(2) STORE CALLER'S SAVE ARE ADDR IN YOURS
LR 13,2 YOU NEED TO RELOAD YOUR CALLER'S REGS
* WHEN YOU EXIT YOUR PROGRAM
*
PUSH PRINT OPEN/CLOSE PRINT A BUNCH OF STUFF
PRINT NOGEN THAT YOU DON'T NEED TO SEE YET.
*
OPEN (IN,INPUT,OUT,OUTPUT) OPEN THE FILES
POP PRINT
READ GET IN READ (GET) A RECORD
LR 0,1 LOAD THE RECORD ADDRESS INTO REG-0
PUT OUT,(0) WRITE (PUT) THE RECORD
B READ AND LOOP TO READ MORE
*
Z CLOSE (IN,,OUT) ALL DONE (END OF FILE) CLOSE 2 FILES
L 13,4(13) LOAD ADDR OF CALLER'S SAVE AREA
LM 14,12,12(13) LOAD CALLER'S REGS
SR 15,15 R15=0 MEANS SUCCESSFUL RETURN CODE.
BR 14 RETURN TO CALLER.
SAVEAREA DC 18F'0' ANYONE YOU CALL CAN SAVE YOUR
* REGISTERS IN YOUR SAVE AREA.
*
PUSH PRINT
PRINT NOGEN
IN DCB DDNAME=IN,DSORG=PS,LRECL=133,RECFM=FT,MACRF=GL,EODAD=Z
OUT DCB DDNAME=OUT,DSORG=PS,LRECL=133,RECFM=FT,MACRF=PM,
POP PRINT
*
END SAMPCOPY