This sample was Assembled and tested during April 2002 on an OS/390 V2.R9 system.

         PRINT NOGEN
         TITLE 'EX6 - SIMPLE EXERCISE IN BIT MANIPULATION'
EX6      CSECT
         USING *,R15                           INITIAL BASE REGISTER
BEGIN    B     START       
         DC    AL1(8),CL8'EX6'                 PROGRAM NAME FOR DEBUGGING
SAVEAREA DS    0F                              MY SAVE AREA
         DC    AL4(*-*)
PRESAVE  DC    AL4(*-*)                        ADDR OF PREVIOUS SAVE AREA
NEXTSAVE DC    AL4(*-*)                        ADDR OF NEXT SAVE AREA
SREG14   DC    AL4(*-*)                        GENERAL
SREG15   DC    AL4(*-*)                                PURPOSE
SREG0    DC    13AL4(*-*)                                      REGISTER SAVE
SAVEEND  DS    0H                              END OF MY SAVE AREA
         SPACE 1
START    EQU   *
         DROP  R15                             DUMP INITIAL BASE REGISTER
         STM   R14,R12,12(R13)                 SAVE THE REGISTERS ON ENTRY.
         LR    R12,R15                         SET UP MY
         USING BEGIN,R12                            BASE REGISTER
         ST    R13,PRESAVE                     PERFORM SAVE
         LA    R15,SAVEAREA                                 AREA
         ST    R15,8(R13)                                        CHAINING
         LR    R13,R15                         R13 = ADDR OF MY SAVE AREA.
         OPEN  (INDCB,INPUT,OUTDCB,OUTPUT)
         EJECT
*
*        PREPARE TO BUILD A LIST OF NAMES IN OUTAREA.
*  
         LA     R4,NAMETAB                     R4  = START OF ARRAY.
READREC  GET  INDCB,INAREA                     READ A RECORD
*
*        RETRIEVE THE NAMES AND SORT THEM!
*
         MVC   0(8,R4),INAREA                  NO  - SLOT NAME IN ARRAY,
         LA    R4,8(,R4)                       POINT TO NEXT ARRAY SLOT,
         B     READREC                         AND REPEAT TILL EXHAUSTED.
READDONE LA    R4,NAMETAB                      R4  = START OF ARRAY.
         LA    R3,NAMETAB+8                    R3  = START OF ARRAY + 1.
         TM    FLAG,SORTED                     ARE NAMES IN ORDER?
         BO    INFORM                          YEP - GO TELL ABOUT IT.
         OI    FLAG,SORTED                     NO  - INDICATE IT IS.
SORT1    CLI   0(R4),X'FF'                     END OF ARRAY?
         BE    READDONE                        YEP - CHECK ALL DONE,
         CLC   0(8,R4),0(R3)                   NO  - IS FIRST > SECOND?
         BH    SWAP                            YEP - SWAP THEM
SORT2    LA    R4,8(,R4)                       NO  - MOVE TO
         LA    R3,8(,R3)                                     NEXT
         B     SORT1                                              PAIR.
SWAP     MVC   TEMP,0(R4)                      SAVE FIRST NAME, THEN
         MVC   0(8,R4),0(R3)                   MOVE SECOND NAME FORWARD,
         MVC   0(8,R3),TEMP                    RETURN FIRST NAME TO ARRAY.
         NI    FLAG,255-SORTED                 INDICATE NOT SORTED.
         B     SORT2                           GO GET NEXT PAIR.
         SPACE 1
INFORM   MVC   OUTAREA+1(80),NAMETAB
         PUT  OUTDCB,OUTAREA                   OUTPUT SORTED ARRAY.
         SPACE 3
EXIT     CLOSE (INDCB,,OUTDCB)                 CLOSE BOTH FILES
         SR    R15,R15                         FORCE COND CODE ZERO
         L     R13,PRESAVE                     R13 = PREVIOUS SAVE AREA ADDR.
         L     R14,12(R13)                     RESTORE REGISTERS
         LM    R0,R12,20(R13)                  EXCEPT REGISTER 15
         BR    R14                             RETURN TO CALLER (z/OS)
         EJECT
         LTORG
         SPACE 1
TEMP     DS    CL8                             SWITCH NAME AREA.
         SPACE 1
INDCB    DCB   MACRF=GM,EODAD=READDONE,DDNAME=INDD,LRECL=80,                 *
               DSORG=PS
INAREA   DS    CL80
         SPACE 1
OUTDCB   DCB   MACRF=PM,RECFM=F,LRECL=133,DDNAME=OUTDD,DSORG=PS
OUTAREA  DC    CL133' '
         SPACE 1
NAMETAB  DC    8X'FF'                           FIRST ENTRY - HIGH VALUES
         DC    8XL10'FFFFFFFFFFFFFFFF'          FURTHER 8 ENTRIES.
NAMETABE DC    XL1'FF'                          END OF NAME TABLE.
FLAG     DC    X'00'                            INDICATE NOT SORTED
SORTED   EQU   X'01'                            INDICATE SORTED.
R0       EQU   0
R1       EQU   1
R2       EQU   2
R3       EQU   3
R4       EQU   4
R5       EQU   5
R6       EQU   6
R7       EQU   7
R8       EQU   8
R9       EQU   9
R10      EQU   10
R11      EQU   11
R12      EQU   12
R13      EQU   13
R14      EQU   14
R15      EQU   15
         END

Copyright © KMS-IT Limited 2002