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

PRINT

NOGEN

 

TITLE

'EX8B - USE OF STORAGE MACRO SAMPLE'

EX8B

CSECT

USING

*,R15

INITIAL BASE REGISTER

BEGIN

B

START

DC

AL1(8),CL8'EX8B'

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) OPEN THE FILES.

EJECT

*

*

PREPARE TO BUILD A LIST OF NAMES IN OUTAREA.

*

SR

R4,R4

R4 ZERO FOR COUNT.

READREC1

GET

INDCB,INAREA

READ A RECORD

*

*

RETRIEVE THE NAMES AND SORT THEM!

*

CLC

=CL4'****',INAREA

IS IT LAST INPUT RECORD?

BE

DONEONCE

YEP - STOP READING.

LA

R4,1(,R4)

INCREMENT RECORD COUNT,

B

READREC1

AND REPEAT TILL EXHAUSTED.

DONEONCE

CLOSE

INDCB

REPOSITION

OPEN

(INDCB,INPUT)

INPUT FILE.

ST

R4,SAVECNT

SAVE RECORD COUNT.

LR

R5,R4

CALCULATE

M

R4,=F'8'

- - - -> STORAGE SIZE.

ST

R5,MYSIZE

SAVE SIZE OF AREA.

STORAGE OBTAIN,LENGTH=(5),ADDR=MYSTORE GET STORAGE

L

R3,MYSTORE

CALCULATE END

A

R3,MYSIZE

- - - -> OF ARRAY

L

R4,MYSTORE

POINT TO ARRAY AREA.

USING

NAMETAB,R4

GET ARRAY ADDRESSABILITY

READREC2

GET

INDCB,INAREA

READ A RECORD

*

*

RETRIEVE THE NAMES AND SORT THEM!

*

CLC

=CL4'****',INAREA

IS IT LAST INPUT RECORD?

BE

DUNTWICE

YEP - STOP READING.

MVC

NAME,INAREA

NO - SLOT NAME IN ARRAY,

LA

R4,8(,R4)

POINT TO NEXT ARRAY SLOT,

B

READREC2

AND REPEAT TILL EXHAUSTED.

DUNTWICE

L

R4,MYSTORE

R4 = START OF ARRAY.

LA

R5,8(,R4)

R5 = 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

CR

R5,R3

END OF ARRAY?

BNL

DUNTWICE

YEP - CHECK FOR COMPLETE

CLC

0(8,R4),0(R5)

NO - IS FIRST > SECOND?

BH

SWAP

YEP - SWAP THEM

SORT2

LA

R4,8(,R4)

NO - MOVE TO

LA

R5,8(,R5)

- - - -> NEXT

B

SORT1

- - - - - - - -> PAIR.

SWAP

MVC

TEMP,0(R4)

SAVE FIRST NAME, THEN

MVC

0(8,R4),0(R5)

MOVE SECOND NAME FORWARD,

MVC

0(8,R5),TEMP

RETURN FIRST NAME TO ARRAY.

NI

FLAG,255-SORTED

INDICATE NOT SORTED.

B

SORT2

GO GET NEXT PAIR.

SPACE

1

INFORM

LA

R2,OUTAREA+1

MOVE

L

R3,MYSIZE

- - - -> SORTED

L

R8,MYSTORE

- - - - - -> ARRAY

L

R9,MYSIZE

- - - - - - - -> TO

MVCL

R2,R8

- - - - - - - - - -> RECORD.

PUT

OUTDCB,OUTAREA

AND OUTPUT IT.

SPACE

3

EXIT

CLOSE

(INDCB,,OUTDCB)

CLOSE BOTH FILES

L

R5,MYSIZE

STORAGE RELEASE,LENGTH=(5),ADDR=MYSTORE RELEASE GOTTEN AREA

L

R13,PRESAVE

R13 = PREVIOUS SAVE AREA ADDR.

RETURN

(14,12),RC=0

RESTORE REGISTERS

EJECT

LTORG

SPACE

1

SAVECNT

DS

F

SAVED RECORD COUNT

SIZES

DC

AL4(*-*),AL4(*-*)

STORAGE REQUEST SIZE (MIN/MAX)

MYSTORE

DC

AL4(*-*)

ADDRESS OF GOTTEN AREA

MYSIZE

DC

AL4(*-*)

SIZE OF GOTTEN AREA

TEMP

DC

CL8' '

SWITCH NAME AREA.

SPACE

1

INDCB

DCB

MACRF=GM,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

DSECT

NAME

DS

CL8

ANY GIVEN NAME HERE

EX8B

CSECT

FLAG

DC

XL1'0'

SORTED/UNSORTED INDICATOR

SORTED

EQU

X'01'

INDICATE SORTED.

UNSORTED

EQU

C'N'

INDICATE NOT 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