88 lines
2.9 KiB
Plaintext
88 lines
2.9 KiB
Plaintext
* Singly-linked list - Insert after 01/02/2017
|
|
LISTSINA CSECT
|
|
USING LISTSINA,R13 base register
|
|
B 72(R15) skip savearea
|
|
DC 17F'0' savearea
|
|
STM R14,R12,12(R13) prolog
|
|
ST R13,4(R15) " <-
|
|
ST R15,8(R13) " ->
|
|
LR R13,R15 " addressability
|
|
* Allocate A
|
|
GETMAIN RU,LV=12 get storage
|
|
USING NODE,R11 make storage addressable
|
|
LR R11,R1 "
|
|
MVC VAL,=CL8'A' val='A'
|
|
MVC NEXT,=A(0)
|
|
DROP R11 base no longer needed
|
|
ST R11,A A=@A
|
|
* Init LIST
|
|
ST R11,LIST init LIST with A
|
|
* Allocate C
|
|
GETMAIN RU,LV=12 get storage
|
|
USING NODE,R11 make storage addressable
|
|
LR R11,R1 "
|
|
MVC VAL,=CL8'C' val='C'
|
|
MVC NEXT,=A(0)
|
|
DROP R11 base no longer needed
|
|
ST R11,C C=@C
|
|
* Insert C After A
|
|
MVC P1,A
|
|
MVC P2,C
|
|
LA R1,PARML
|
|
BAL R14,INSERTAF
|
|
* Allocate B
|
|
GETMAIN RU,LV=12 get storage
|
|
USING NODE,R11 make storage addressable
|
|
LR R11,R1 "
|
|
MVC VAL,=CL8'B' val='B'
|
|
MVC NEXT,=A(0)
|
|
DROP R11 base no longer needed
|
|
ST R11,B B=@B
|
|
* Insert B After A
|
|
MVC P1,A
|
|
MVC P2,B
|
|
LA R1,PARML
|
|
BAL R14,INSERTAF
|
|
* List all
|
|
L R11,LIST
|
|
USING NODE,R11 address node
|
|
LOOP C R11,=A(0)
|
|
BE ENDLIST
|
|
XPRNT VAL,8
|
|
L R11,NEXT
|
|
B LOOP
|
|
ENDLIST DROP R11
|
|
FREEMAIN A=A,LV=12 free A
|
|
FREEMAIN A=B,LV=12 free B
|
|
FREEMAIN A=C,LV=12 free C
|
|
RETURN L R13,4(0,R13) epilog
|
|
LM R14,R12,12(R13) " restore
|
|
XR R15,R15 " rc=0
|
|
BR R14 exit
|
|
LIST DS A list head
|
|
A DS A
|
|
B DS A
|
|
C DS A
|
|
PARML DS 0A
|
|
P1 DS A
|
|
P2 DS A
|
|
INSERTAF CNOP 0,4
|
|
L R2,0(R1) @A
|
|
L R3,4(R1) @B
|
|
USING NODE,R2 ->A
|
|
L R4,NEXT @C
|
|
DROP R2
|
|
USING NODE,R3 ->B
|
|
ST R4,NEXT B.NEXT=@C
|
|
DROP R3
|
|
USING NODE,R2 ->A
|
|
ST R3,NEXT A.NEXT=@B
|
|
DROP R2
|
|
BR R14 return
|
|
LTORG all literals
|
|
NODE DSECT node (size=12)
|
|
VAL DS CL8
|
|
NEXT DS A
|
|
YREGS
|
|
END LISTSINA
|