77 lines
3.1 KiB
Plaintext
77 lines
3.1 KiB
Plaintext
* ABC Problem 21/07/2016
|
|
ABC CSECT
|
|
USING ABC,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
|
|
LA R8,1 l=1
|
|
LOOPL C R8,=A(NN) do l=1 to hbound(words)
|
|
BH ELOOPL
|
|
LR R1,R8 l
|
|
MH R1,=H'20' *20
|
|
LA R10,WORDS-20(R1) @words(l)
|
|
MVC STATUS,=CL5'true' cflag='true'
|
|
MVC TBLOCKS,BLOCKS tblocks=blocks
|
|
MVC CC(1),0(R10) cc=substr(words(l),1,1)
|
|
LA R6,1 i=1
|
|
LOOPI CLI CC,C' ' do while cc<>' '
|
|
BE ELOOPI
|
|
SR R7,R7 k=0
|
|
LH R0,=H'1' m=1
|
|
LOOPM CH R0,=AL2(L'TBLOCKS) do m=1 to length(tblocks)
|
|
BH ELOOPM
|
|
LA R5,TBLOCKS-1 @tblocks[0]
|
|
AR R5,R0 @tblocks[m]
|
|
CLC 0(1,R5),CC if substr(tblocks,m,1)=cc
|
|
BNE INDEXM
|
|
LR R7,R0 k=m=index(tblocks,cc)
|
|
B ELOOPM
|
|
INDEXM AH R0,=H'1' m=m+1
|
|
B LOOPM
|
|
ELOOPM LTR R7,R7 if k=0
|
|
BNZ OKK
|
|
MVC STATUS,=CL5'false' cflag='false'
|
|
B EIFK0
|
|
OKK LA R4,TBLOCKS-2 @tblocks[-1]
|
|
AR R4,R7 +k
|
|
CLI 0(R4),C'(' if substr(tblocks,k-1,1)='('
|
|
BNE SECOND
|
|
LA R0,1 j=1
|
|
B EIFBLOCK
|
|
SECOND LA R0,3 j=3
|
|
EIFBLOCK LR R2,R7 k
|
|
SR R2,R0 k-j
|
|
LA R4,TBLOCKS-1 @tblocks[0]
|
|
AR R4,R2 @tblocks[k-j]
|
|
MVC 0(5,R4),=CL5' ' substr(tblocks,k-j,5)=' '
|
|
EIFK0 LA R6,1(R6) i=i+1
|
|
LR R4,R10 @words
|
|
AR R4,R6 +i
|
|
BCTR R4,0 -1
|
|
MVC CC,0(R4) cc=substr(words,i,1)
|
|
B LOOPI
|
|
ELOOPI MVC PG(20),0(R10) tabword(l)
|
|
MVC PG+20(5),STATUS status
|
|
XPRNT PG,80 print buffer
|
|
LA R8,1(R8) l=l+1
|
|
B LOOPL
|
|
ELOOPL L R13,4(0,R13) epilog
|
|
LM R14,R12,12(R13) " restore
|
|
XR R15,R15 " rc=0
|
|
BR R14 exit
|
|
WORDS DC CL20'A',CL20'BARK',CL20'BOOK',CL20'TREAT',CL20'COMMON'
|
|
DC CL20'SQUAD',CL20'CONFUSE'
|
|
BLOCKS DS 0CL122
|
|
DC CL61'((B O) (X K) (D Q) (C P) (N A) (G T) (R E) (T G) (Q D) (F S) '
|
|
DC CL61'(J W) (H U) (V I) (A N) (O B) (E R) (F S) (L Y) (P C) (Z M)) '
|
|
TBLOCKS DS CL(L'BLOCKS) work blocks
|
|
CC DS CL1 letter to find
|
|
STATUS DS CL5 true/false
|
|
PG DC CL80' ' buffer
|
|
YREGS
|
|
NN EQU (BLOCKS-WORDS)/L'WORDS number of words
|
|
END ABC
|