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