This sample was Assembled and tested during April 2002 on an OS/390 V2.R9 system.
NOGEN |
||||
|   |
'EX8A - GETMAIN/FREEMAIN SAMPLE' |
|||
EX8A |
||||
*,R15 |
INITIAL BASE REGISTER |
|||
BEGIN |
B |
START |
||
DC |
AL1(8),CL8'EX8A' |
PROGRAM NAME FOR DEBUGGING |
||
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 |
1 |
START |
EQU |
* |
R15 |
DUMP INITIAL BASE REGISTER |
|||
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. |
||
* |
||||
* |
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,SIZES |
INDICATE SIZE |
||
ST |
R5,SIZES+4 |
- - - -> OF REQUEST. |
||
GETMAIN VU,LA=SIZES,A=MYSTORE GO GET THE 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) |
||
FREEMAIN VU,A=MYSTORE |
FREE THE GOTTEN AREA |
|||
SR |
R15,R15 |
FORCE COND CODE ZERO |
||
L |
R13,PRESAVE |
R13 = PREVIOUS SAVE AREA ADDR. |
||
L |
R14,12(R13) |
RESTORE REGISTERS |
||
R0,R12,20(R13) |
EXCEPT REGISTER 15 |
|||
BR |
R14 |
RETURN TO CALLER (OS/390) |
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 |
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 |
EX8A |
CSECT |
FLAG |
DC |
XL1'0' |
SORTED/UNSORTED INDICATOR |
|
SORTED |
EQU |
X'01' |
INDICATE SORTED. | |
UNSORTED |
EQU |
C'N' |
INDICATE NOT SORTED. | |
R0 |
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 | ||
Copyright © KMS-IT Limited 2002