Puzzle
I cannot test this on my system. In fact, I cannot even assemble it.
I have several different copies of the source code, in various stages of development, and playing with changes.
Email me if this doesn't work, and we can try another copy of the source code.
My yaho id is linlyons
This is the run JCL I used to test it. So you can see the files.
//*
//T1 EXEC PGM=PUZZLE,TIME=(0,10),REGION=2M,
// PARM='NOWTO,SKIPCOL=30'
//STEPLIB DD DSN=SRE87.L.LOAD,DISP=SHR
//SYSPRINT DD SYSOUT=*
//*YSUDUMP DD DSN=SRE87.L.SYSUDUMP,DISP=SHR
//SYSUT1 DD SYSOUT=*
//SYSUT2 DD SYSOUT=*
//SYSIN DD DSN=SRE87.L.ASM(PIECES),DISP=SHR
//*
//T2 EXEC PGM=PUZZLE,TIME=(0,10),REGION=2M,COND=EVEN,
// PARM='NODOC,NOWTO,SKIPCOL=31'
//STEPLIB DD DSN=SRE87.L.LOAD,DISP=SHR
//SYSPRINT DD SYSOUT=*
//*YSUDUMP DD DSN=SRE87.L.SYSUDUMP,DISP=SHR
//SYSUT1 DD SYSOUT=*
//SYSUT2 DD SYSOUT=*
//SYSIN DD DSN=SRE87.L.ASM(PIECES),DISP=SHR
//
//T9 EXEC PGM=PUZZLE,TIME=(5,20),REGION=2M,
// PARM='NODOC,NOWTO' ,SKIPCOL=31'
//STEPLIB DD DSN=SRE87.L.LOAD,DISP=SHR
//SYSPRINT DD SYSOUT=*
//*YSUDUMP DD DSN=SRE87.L.SYSUDUMP,DISP=SHR
//SYSUT1 DD SYSOUT=*
//SYSUT2 DD SYSOUT=*
//SYSIN DD DSN=SRE87.L.ASM(PIECES),DISP=SHR
//
//SYSUT3 DD SYSOUT=*
//SYSUT4 DD SYSOUT=*
//SYSUT5 DD SYSOUT=*
//SYSUT6 DD SYSOUT=*
//SYSUT7 DD SYSOUT=*
//SYSUT8 DD SYSOUT=*
//SYSUT9 DD SYSOUT=*
//SYSUT10 DD SYSOUT=*
//SYSUT1$ DD SYSOUT=*
//SYSUT2$ DD SYSOUT=*
//SYSUT7$ DD SYSOUT=*
This is the input file that you'll need
-0001020304
10006121824
M
80006070809
80001061218 X
80001020309 X
80006121817 X
80006121819 *** XX
80006050403 ***
80001071319 ***
80001020306 ***
M
X0001020308 ***
X0001020307
X0006121811 *** X
X0006121805 X
X0006121807 *** XX
X0006121813 X
X0005060708 ***
X0004050607
M
&0006121117 ***
&0006121319
&0605111700 ***
&0006071319 X
&0001040506 XXX
&0001070809 *** X
&0001020506
&0001020809 ***
M X
L0001020612 X
M XXX X
+0006120507 XXX
M X
T0006121113 XXX
T0001020713 X
T0006120405 X
T0006120708
M
#0006120711
#0006120513 *** X
#0006120105 XX
#0107130008 *** XX
#0506070011 ***
#0506070013
#0405060011 ***
#0607080013
M
Z0006120111
Z0001071314 *** XX
Z0405060010 *** X
Z0607080014 XX
M
W0006051110 X
W0001070814 XX
W0100060511 XX
W0006071314
M
O0001060705 *
O0001060708 *
O0001060702 * XXX
O0001060712 * XXX
O0001060713 * X
O0001020708 *
O0006120713 *
O0006120511 *
M
U0001061213 XXX
U0006010208 X
U0001071213 XXX
U0006070208
And the program. I played with it many times. I hope this works.
PUZZLE TITLE 'PUZZLE INITIALIZATION STUFF'
*======================================================================
MACRO
&LABEL PRTBL &PAGE=,&WIDTH=,&LENGTH=,&BOARD=,&DCB=,&PAGEW=,&PAGEL=, X
&SPACEW=1,&SPACEL=1,&TITLE=,&NTITLE=2,<ITLE=, X
&FMTRTN=0
*LABEL PRTBL PAGE=,WIDTH=,LENGTH=,BOARD=,DCB=,PAGEW=,PAGEL=,FMTRTN=,X
* SPACEW=1,SPACEL=1,TITLE=(LINE1),NTITLE=2,LTITLE=
&LABEL DC A(&PAGE,&WIDTH,&LENGTH,&BOARD) 1
.* CUR.LOC, ENT.LEN, #.LINES, A(BOARD); LEN.ENT.LINE, LINE.LENGTH
DC A(&WIDTH+&SPACEW,(&LENGTH+&SPACEL)*&PAGEW) 2
DC A(&PAGEW-&WIDTH,&PAGEW*(&PAGEL-&LENGTH),&PAGE,&PAGE) 3
.* LINE.LENGTH, PAGE.LEN; A(CUR.LINE),A(PAG); A(END/LINE), A(END/PAGE)
DC A(&PAGE+&PAGEW-&WIDTH,&PAGE+(&PAGEL-&LENGTH)*&PAGEW)
DC A(&DCB,&FMTRTN),PL2'0',AL2(<ITLE-1)
.* A(DCB, BOARD.FMT.RTN), PAGE.COUNT, LEN/TITLE, A(WRITE.INIT)
DC A(&TITLE,&PAGEL)
.* #LINES.WRITE, TITLE, PAGE.INIT.REGS
DC A(&TITLE,(&PAGEL+&NTITLE)*&PAGEW,ZERO),C' ',AL3(0)
DC CL132' ' TITLE
MEND
*======================================================================
MACRO
&LABEL PRPGE &TITLE,&PAGEW,&PAGEL,&NUMTITL=2
&TITLE DS (&NUMTITL)CL&PAGEW
DS CL1
&LABEL DS (&PAGEW)CL&PAGEL
DS 64X
MEND
*======================================================================
MACRO
&LABEL TIMEDATE
&LABEL TIME DEC
CNOP 0,4
STM 0,1,*+40 TIME/DATE HHMMSSTH 00YYDDDF
BAL 1,*+44 BRANCH AROUND DATA AREAS
DC 2X'4021204B20204B20204020204B202020'
DC 2F'0' TIME AND DATE GO HERE
MVC 0(16,1),16(1) REFRESH THE EDIT PATTERN
MVC 35(3,1),37(1) ERASE 00 IN DATE AND TH IN TIME
ED 0(16,1),32(1) AND FORMAT TIME AND DATE
MEND
*
*---------------------------------------------------------------------*
* *
* THERE ARE TWO MAJOR TABLES USED TO DO THIS CALCULATION. ONE IS *
* THE PIECE TABLE. IT CONTAINS 12 ENTRIES, ONE FOR EACH POSSIBLE *
* PIECE. EACH ENTRY CONTAINS SEVERAL SUB-ENTRIES, ONE FOR EACH *
* POSSIBLE ORIENTATION OF THE PIECE, AND CONTROL TO KEEP TRACK OF *
* WHICH ORIENTATION IS BEING USED/TESTED. *
* THE BOARD IS 6 X 10 - THAT IS 60 LOCATIONS. IF BITS CAN BE *
* USED TO REPRESENT LOCATIONS, THE PIECES AND BOARD CAN BE KEPT IN *
* A PAIR OF REGISTERS, AND THIS IS USED FOR THE CALCULATIONS. *
* THE SECOND TABLE IS USED TO KEEP TRACK OF PIECES AS THEY ARE *
* SET INTO THE PUZZLE BOARD (OR ARRAY). IT ALSO HAS 12 MAJOR *
* ENTRIES. EACH ENTRY IS USED TO CONTAIN ONE PIECE AS IT IS PLACED *
* INTO THE PUZZLE. WHEN THE LAST ENTRY IS MADE, A SOLUTION HAS BEEN *
* FOUND. AT THE BEGINNING, ALL OF THE PIECES ARE ARBITRARILY *
* PLACED IN THE PIECE TABLE, AND THE INDEX TABLE IS SET UP TO POINT *
* TO THE PIECES IN SEQUENCE. *
* THE FIRST AVAILABLE LOCATION (FIRST ZERO BIT IN THE PUZZLE BOARD *
* ARRAY) IS FOUND, AND THE PIECE USED MUST FILL THIS LOCATION. THIS *
* INSURES THAT AS THE ARRAY IS FILLED UP, NO EMPTY LOCATIONS ARE *
* LEFT. EACH LOCATION IN THE ARRAY MAY BE *
* THOUGHT OF AS HAVING AN ADDRESS THAT IS THE 54 55 56 57 58 59 *
* NUMBER OF BIT POSITIONS THAT A PIECE MUST 40 49 50 51 52 53 *
* BE SHIFTED UP TO PUT THE PIECE IN THE ARRAY. 42 43 44 45 46 47 *
* EACH PIECE HAS AN AREA OF 5 BITS. THE PIECE 36 37 38 39 40 41 *
* SHAPED LIKE AN 'L' THUS MIGHT OCCUPY THE 5 30 31 32 33 34 35 *
* POSITIONS 25, 19, 13, 14, AND 15. TO PUT 24 25 26 27 28 29 *
* THE PIECE IN THIS LOCATION, THE BIT PATTERN 18 19 20 21 22 23 *
* WOULD BE LOADED INTO AN EVEN-ODD REGISTER 12 13 14 15 16 17 *
* PAIR, AND SHIFTED RIGHT (UP) 13 PLACES. 06 07 08 09 10 11 *
* IF A PIECE IS ATTAMPTED TO BE PUT INTO 00 01 02 03 04 05 *
* THE ARRAY WITHOUT SHIFTING IT UP (I.E. *
* INTO POSITION '00') THE 00 LOCATION WILL BE USED. IF WE TAKE THE *
* '+' SHAPED PIECE, THIS PRODUCES AN IMPOSSIBLE SITUATION, IN THAT *
* THE LEFT CENTER PART OF THE PIECE FALLS OFF OF THE BOARD. WHILE *
* THIS IS VISUALLY QUITE APPARENT, IT TAKES A LITTLE MORE WORK TO *
* DETERMINE THAT THE BIT PATTERN IS INVALID. THE BITS FOR THIS *
* SITUATION FALL IN LOCATIONS 00, 05, 06, 07, AND 12, SINCE THE *
* BOARD IS KEPT IN ONE SINGLE CONTINUOUS STRING. HOWEVER, AFTER WE *
* TURN THESE BITS ON, WE TEST TO DETERMINE IF THE PIECE OCCUPIES A *
* LOCATION ON THE LEFT EDGE OF THE ARRAY (BOARD), AND IF IT DOES, *
* TEST TO SEE IF IT OCCUPIES A LOCATION ON THE RIGHT EDGE OF THE *
* BOARD. IF THE PIECE SEEMS TO BE ADJCENT TO BOTH EDGES, THE BIT *
* PATTERN MUST BE INVALID, SINCE NO PIECE IS LARGE ENOUGH TO TOUCH *
* BOTH EDGES SIMULTANEOUSLY, LEGALLY. *
* USING THIS TEST, WE TRY TO PUT PIECES IN, AND EACH TIME A PIECE *
* FITS INTO THE ARRAY, WE TURN ON BITS FOR THE POSITION IS OCCUPIES, *
* MARK THE PIECE AS USED, AND TRY TO FIT ANOTHER PIECE IN THE *
* REMAINING OPEN PORTION. IF WE GET TO A SITUATION IN WHICH NO *
* PIECE LEFT FITS, WE TAKE OUT THE LAST PIECE THAT WE SUCCESSFULLY *
* PUT IN THE ARRAY, (BY TURNING OFF THE BITS) AND TRY ANOTHER *
* ORIENTATION OF THE PIECE, OR A DIFFERENT PIECE ENTIRELY. *
* ANOTHER PROBLEM IS HOW TO PREVENT DUPLICATE SOLUTIONS. THESE *
* COULD OCCUR IN 3 WAYS, MIRROR IMAGES, ROTATIONS, AND JUST PLAIN *
* DUPLICATE IMAGES. THE FIRST 2 PROBLEMS ARE TAKEN CARE OF BY ONLY *
* USING ONE ORIENTATION OF THE PIECE SHAPED LIKE AN 'L'. ANY *
* ROTATION OF MIRROR IMAGE OF A SOLUTION WOULD HAVE THIS PIECE IN *
* A DIFFERENT ORIENTATION, THUS WE WILL NEVER TRY TO BUILD THAT *
* SOLUTION. HOWEVER, ONLY USING ONE ORIENTATION OF THE PIECE WILL *
* PERMIT EVERY VALID SOLUTION TO BE FOUND ONCE. *
* THE THIRD PROBLEM, JUST PLAIN DUPLICATES IS MORE COMPLICATED TO *
* SOLVE. THE SOLUTION INVOLVES HOW THE INDEX TABLE IS USED. *
* ASSUME THAT ALL OF THE PIECES ARE NUMBERED, 1 TO 12. WE WILL TRY *
* TO USE PIECE '1' IN LOCATION 00 FIRST. IF IT FITS, WE WILL THEN *
* TRY TO USE PIECES 2 THRU 12, IN ORDER, IN THE NEXT OPEN POSITION. *
* EACH TIME A PIECE IS FITTED INTO THE BOARD, ALL OF THE REMAINING *
* PIECES ARE ATTEMPTED TO BE USED IN ORDER. FOR ANY ONE POSITION OF *
* A PIECE, FROM NONE TO SEVERAL HUNDRED SOLUTIONS MAY BE FOUND. IN *
* ANY EVENT, ONCE A PIECE IS REMOVED FROM A LOCATION, IT IS NEVER *
* INSERTED INTO THE SAME LOCATION AGAIN UNLESS THE LOCATIONS OF *
* PIECES THAT HAVE BEEN PUT INTO THE BOARD PRIOR TO THE PIECE IN *
* QUESTION HAVE CHANGED. IN THE ABOVE DESCRIPTIONS, SOMETIMES WHEN *
* I SAID 'A DIFFERENT PIECE' I REALLY MEAN 'EITHER A DIFFERENT *
* ROTATION (ORIENTATION) OF THE SAME PIECE, OR A DIFFERENT PIECE *
* ENTIRELY'. IT WAS JUST EASIER TO TALK ABOUT PIECES, AND EXPLAIN *
* THIS QUALIFICATION SEPARATELY. *
* THOSE ARE ALL OF THE NECESSARY CONCEPTS TO UNDERSTAND THE *
* OPERATION OF THIS PROGRAM. WHEN I WROTE IT, I DIDN'T KNOW IF IT *
* WOULD WORK, OR HOW LONG IT WOULD TAKE TO RUN. WHEN I RAN IT, I *
* FOUND THAT IT TOOK 23 MINUTES IN AN IBM 168-3, 21 MINUTES ON *
* THE IBM 370/195, AND 11 MINUTES ON AN IBM 370/3033. *
* GENERAL SECTIONS OF THE PROGRAM ARE *
* INITIALIZATION, READING A FILE THAT DEFINES ALL OF THE ROTATIONS *
* (ORIENTATIONS) OF THE PIECES THEN PUTTING THE BIT PATTERNS OF THE *
* PIECES INTO THE PIECE-TABLE, PRINTING PATTERNS OF EACH PIECE TO *
* INSURE THAT EACH PIECE WAS LOADED CORRECTLY, GENERAL PUZZLE *
* SOLUTION, AND FINALLY SEVERAL ROUTINES TO PRINT SOLUTIONS IN *
* VARIOUS FORMATS AS THEY ARE FOUND. THERE IS ALSO A ROUTINE THAT *
* SAVES ALL OF THE SOLUTIONS, SORTS THEM, AND THEN COMPARES THEM TO *
* INSURE THAT THERE ARE NO DUPLICATES. *
* *
*---------------------------------------------------------------------*
*
* THIS DSECT DEFINES THE MAIN TABLE USED TO DETERMINE WHICH PIECE TO
* TRY NEXT, AND KEEP TRACK OF PIECES ALREADY USED. THE TABLE HAS 12
* ELEMENTS, ONE FOR EACH PIECE. PIECES ARE TRIED IN A DIFFERENT ORDER
* BY EXCHANGING THE ADDRESS(ES) IN 'THIS', EACH OF WHICH POINTS TO
* AN ELEMENT IN THE 'PIECE' TABLE.
*
T DSECT
THIS DS F POINTER OF PIECE USED FOR THIS ENTRY
TCUR DS F POINTER TO PIECE BEING EXCHANGED
* FOR THIS / CURRENTLY.
TROT DS F OFFSET INTO THE PIECE TABLE TO THE
* ROTATION CURRENTLY BEING TESTED
TPCE DS F SAVE ADDR OF PIECE FOR PRINT RTN
TLOC DS 0F SAME AS TSQUARE
TSQUARE DS F INDEX SQUARE USED TO SAVE BASE ADDR
* OF A PIECE THAT FITS THE PUZZLE,
* USED TO BACK OUT THE PIECE
TPUZZLE DS CL8 PICTURE OF PUZZLE W/O THIS PIECE IN
TPIECE DS CL8 BIT PATTERN FOR THIS PIECE IN ITS
DS CL4 CURRENT LOCATION IN THE PUZZLE
TVARBEG EQU *
TFIRSTPC EQU *-T
TPCS DS 12F POINTERS TO THE 12 PIECE TBL ENTRIES
TEND EQU *
TL EQU *-T
TVL EQU *-TVARBEG
*
* NEXT IS THE 'PIECE' TABLE. EACH ELEMENT DEFINES ALL OF THE POSSIBLE
* POSITIONS OF A PIECE (MAXIMUM OF 8), AND THE TABLE IS THEREFORE A
* TWO DIMENSIONAL TABLE, HOWEVER, EACH ELEMENT HAS SOME EXTRA
* INFORMATION RELATING TO THE PIECE DEFINED IN ADDITION TO THE BIT
* PATTERNS FOR THE VARIOUS ROTATIONS OF THE PIECE.
*
P DSECT
PCE DS 2F BIT PATTERN FOR THIS ROTATION
PCEFLAG DS 0X
PCEFLG DS X FLAGS FOR THIS PIECE / ROTATION
PF$UA EQU X'01' PIECE= U, AND PUZZLE LOC IS RESTRICT
PF$UB EQU X'02' -ED, TO AVOID DUPLICATE SOLUTIONS
PCECHAR DS C CHARACTER USED IN PRINTED SOLUTIONS
PCEHI DS H HIGHEST BASE ADDR A PIECE CAN BE USE
* AND STILL BE WITHIN THE BOARD
DS 0F
LPCEROT EQU *-P
LPCE EQU 108 LENGTH OF 9 ROTATIONS 4*(3*9)
*
* FINALLY, THERE IS A DSECT THAT DEFINES PARAMETERS USED BY THE PRINT
* ROUTINE TO MOVE SOLUTIONS TO A PRINT PAGE IMAGE. MUCH LESS THINKING
* WENT INTO THIS ROUTINE, SO IT'S NOWHERE NEAR AS ELEGANT (IT'S A PIECE
* OF TRASH)
*
PAG DSECT
PGPLACE DS F CURRENT LOC IN THE PAGE
PGLENT DS F LENGTH OF AN ENTRY
PGPNLINE DS F NUMBER OF LINES IN THIS ENTRY
PGABOARD DS F ADDR OF THE BOARD USED
*
PGENTADD DS F ADD THIS TO PGPLAC FOR ADDR OF NEXT
PGLINADD DS F ADD THIS TO PGLINE FOR ADDR OF NEXT
*
PGLENLIN DS F LENGTH OF A LINE
PGLENPAG DS F LENGTH OF A PAGE
PGLINE DS F ADDR OF BEG OF CURRENT LINE
PGAPAGE DS F ADDR OF PAGE
*
PGENDLIN DS F ADDR OF END OF CURRENT LINE
PGENDPAG DS F ADDR OF END OF PAGE
*
PGPRTRGS DS 0F FOLLOWING REGS USED DURING PRT TTN
PGDCB DS F ADDR OF DCB ASSOCIATED WITH THIS PAG
PGFORMAT DS A ADDR OF RTN TO INIT THE BOARD USED
PGPAGCNT DS PL2 PAGE COUNT FOR THIS LIST
PGTITL DS H LENGTH USED FOR EX OF MVC TITLE
PGPRTBEG DS F WRITE RTN ADDR TO BEGIN PRINTING
PGPRTNUM DS F WRITE RTN - NUMBER OF LINES / PAGE
*
PGINIT DS 4F REGS TO INIT THE PAGE
PGL1 DS CL132
DS 0D
LPAG EQU *-PAG
*
*
PUZ CSECT
REGS BR,10
*--------------------------------------------------------------------*
* FIRST, DO ALL OF THE NORMAL REG SAVE STUFF. *
*--------------------------------------------------------------------*
USING *,13,12 SET UP 2 BASE REGS
STM 14,12,12(13) SAVE OS REGS
LR 2,15 DUPLICATE EP ADDR
LA 12,2048(2) SECOND BASE
LA 12,2048(12) 4096 PAST 13
ST 2,8(13) SAVE OUR SA ADDR IN OS
ST 13,4(2) WIPE OUT BEG OF PGM FOR OUR SAVE ARE
LR 13,2 LOAD ADDR OF OUR SAVE AREA
*
L 2,0(1) THE PARM FIELD ISN'T EVER USED,
LH 3,0(2) BUT I HAVE THIS PAVLOFF CONSISTANCY.
S 3,=F'1'
BM NOPARM
EX 3,MVCPARM
L 3,=A(BYLINE)
B PARMTEST
PARMLOOP LA 1,PARM
LA 1,1(1)
CLI 0(1),C','
BH *-8
BL NOPARM
MVC PARM,1(1)
PARMTEST CLC =C'NOWTO',PARM
BNE NNOWTO
MVI FLAGWTO,C'N'
B PARMLOOP
NNOWTO DS 0H
CLC =C'NODOC',PARM
BNE NNODOC
MVI FLAGDOC,C'N'
B PARMLOOP
NNODOC DS 0H
CLC =C'CHECK',PARM
BNE NCHECK
MVI FLAGCHK,C'C'
B PARMLOOP
NCHECK DS 0H
CLC =C'ESTAE',PARM
BNE NESTAE
ESTAE ESTAE,TERM=NO
LTR 2,15
BZ PARMLOOP
WTO 'BAD R/C FROM ESTAE '
EX 0,*
NESTAE CLC =C'SKIPCOL=',PARM
BNE NCOL
MVC PARM,PARM+8
LA R1,COLSKIP
COLLOOP PACK DW,PARM(2)
CVB R0,DW
STH R0,0(R1)
CLI PARM+3,C'0'
BL PARMLOOP
LA R1,2(R1)
MVC PARM,PARM+3
B COLLOOP
COLSKIP DC 4F'0'
NCOL CLC =C'CR',PARM
BNE NCR
MVC L1PAGE+5(30),TBLINDEX
TR L1PAGE+5(30),ALPHABET
MVC 24(20,3),L1PAGE+15
B PARMLOOP
NCR DS 0H
MVC PARMWTO+22(10),PARM
PARMWTO WTO 'INVALID PARM ( ) MUST BE NOWTO, CHECK, ESTAE, O
OR NODOC'
EX 0,*
FLAGCHK DC X'00'
FLAGWTO DC C'W'
FLAGDOC DC C' '
*
SPACES DC C' '
PARM DC CL100' '
MVCPARM MVC PARM(0),2(2) SAVE THE PARM FIELD
NOPARM SR 3,3
MVC PARM,SPACES
*
RP EQU 2 USE WITH 'PIECE' TABLE,A(A ROTATION)
RNUMTRY EQU 3 NUMBER OF TRIES TO PUT PIECE IN.
RLOC EQU 4 LOCATION OF FIRST EMPTY LOCATION
RPIECE EQU 5 USE WITH 'PIECE' TBL. RPIECE POINTS
* TO AN ELEMENT, RP POINTS TO A
* SPECIFIC ROTATION OF THE PIECE.
WR2 EQU 6 GENERAL WORK REG
RC EQU 7 ANOTHER ONE.
WR EQU 8 ''
RX EQU 9 POINTS TO CURRENT INDEX TBL ENTRY
* USED TO DEFINE ORDER IN WHICH TO
* TRY TO INSERT PIECES INTO PUZZLE.
*BR EQU 10 BAL RETURN REG
RPG EQU 11 PAGE DSECT REG - DEFINES ADDRESSES
* USED TO FORMAT VARIOUS PAGE AREAS.
*
USING T,RX
USING P,RP
USING PAG,RPG ADDRESSABILITY OF PAGE TABLES
*--------------------------------------------------------------------*
* FIRST, SPACE OUT THE PRINT PAGE AREAS. USE PARAMETERS FROM THE *
* PAGE CONTROL TABLES. _ *
* _ _ _ *
*--------------------------------------------------------------------*
LA RPG,PAGETBL LOAD ADDR OF PAGE TABLES TO INIT COR
*
B INITMVCL DON'T INIT PCETBL DUMMY PAGE TBL
INITLOOP DS 0H
MVC PGL1,L1 AND SAVE HEADING
BAL BR,WRITINIT GO DO PAGE HEADING INIT
INITMVCL DS 0H THE FIRST THING TO DO IS MOVE SPACES
* TO THE PAGE TABLES. THEY SHOULD BE
* GETMAINED AREAS, BUT WHY BOTHER.
LM 6,9,PGINIT REGS TO INIT A PAGE TABLE
MVCL 6,8 INIT CORE (SPACE IT OUT).
LA RPG,LPAG(RPG) ADDR OF NEXT PG TABLE
CLI 0(RPG),255 END OF THE PAGE TABLES
BNE INITLOOP NO, GO INIT NEXT PIECE OF CORE
*
OPEN (SYSIN,INPUT,SYSUT1,OUTPUT)
TITLE 'SET UP PIECE TABLE'
L RP,APCETBLM
ST RP,CARDSAVP SAVE ADDR OF BEG OF THIS PIECE
L RX,X
GETAPCE DS 0H
GET SYSIN,CARD GET A ROTATION
LA R1,COLSKIP
TSTSKIP LH R15,0(R1)
LTR R15,R15
BZ PUTPIECE
LA R15,CARD-1(R15)
CLI 0(R15),C'*'
BE SKIPIECE
LA R1,1(R1)
B TSTSKIP
SKIPIECE MVC CARD+40(4),=C'SKIP'
PUTPIECE PUT SYSUT1,CARD-1 LIST OF INPUT DATA CARDS
CLI CARD+40,C'S'
BE GETAPCE
*
CLI CARD,C'M' IS THAT THE END OF A ROTATION
BNE CARDNEP NO, GO DO NEXT
L RP,CARDSAVP LOAD ADDR OF BEG OF THIS PIECE
LA RP,LPCE(RP) NEXT PIECE
ST RP,CARDSAVP SAVE ADDR OF BEG OF THIS PIECE
B GETAPCE AND GO READ AGAIN
*
CARDNEP DS 0H
CLI CARD,C' ' IS THIS A PIECE
BNE GETNOTPC NO, I WONDER WHAT IT CAN BE
*
LA RP,LPCEROT(RP) GET ADDR OF NEXT POSSIBLE ROTATION
SR 14,14
SR 15,15
*
LA RC,5 ALWAYS HAVE 5 BITS TO TEST
LA WR,CARDBITS
SR RX,RX SET UP TO SAVE HIGHEST VALUE
*
CRDBITLP DS 0H
PACK DW,0(2,WR) ISOLATE LOCATION OF THIS BIT
CVB WR2,DW MAKE SHIFT PATTERN BINARY
CR RX,WR2 IS NEW VALUE HIGHER THAN HIGHEST PRV
BH *+6 YES, LEAVE IT ALONE
LR RX,WR2 NO, SAVE NEW HIGH VALUE
SR 0,0
LA 1,1
SLDL 0,0(WR2) SHIFT THE PIECE/BIT UP TO ITS LOCATN
OR 14,0 ADD BIT TO MASK FOR THIS PIECE
OR 15,1 ADD BIT TO MASK FOR THIS PIECE
LA WR,2(WR) SHIFT TO NEXT BIT OFFSET
BCT RC,CRDBITLP GO DO NEXT 4 BIT LOCATIONS
*
STM 14,15,PCE SAVE THE BIT PATTERN FOR THIS PIECE
MVC PCEFLAG,CARD$UAB MOVE FLAG TO PCE TABLE
MVC PCECHAR,CARDCHAR CHARACTER USED IN PRINTED SOLUTIONS
*
LA RC,60 HIGHEST POSSIBLE SQUARE ON BOARD
SR RC,RX CALC MAX VALUE
LR WR,RP SAVE ADDR OF THIS PIECE
STH RC,PCEHI SAVE HI VALUE WE CALCULATED, THEN
* SEE IF IT FITS. IF NOT, DECREASE.
*
LASTLOP DS 0H
LR RLOC,RC DUPLICATE COUNT
LM 14,15,PCE LOAD PIECE BIT MASK
SLDL 14,4(RLOC) SHIFT UP ENOUGH TO LOP OFF A BIT
SRDL 14,4(RLOC) AND SHIFT BACK DOWN AGAIN
C 14,PCE IF NOT EQUAL, WE LOST SOME BITS
BNE CARDLST1 SO SUBTRACT 1 AND TRY AGAIN
C 15,PCE+4 (HAVE TO DO BOTH HALVES OF PUZZL)
BNE CARDLST1 IF NOT =, TRY 1 LESS
*
SLDL 14,0(RLOC) SHIFT PIECE UP TO TOP OF BOARD.
BAL BR,FIT GO SEE IF IT FITS THE BOARD
LM 6,7,FITSAV RELOAD REGS FIT DESTROYED
LTR RP,RP IS IT STILL GOOD
BNZ LASTGOOD
*
CARDLST1 DS 0H
LR RP,WR RELOAD ADDR OF THIS PIECE
BCT RC,LASTLOP GO TRY NEXT LAST
*
LASTGOOD DS 0H
STH RLOC,PCEHI SAVE LAST POSSIBLE LOCATION
B GETAPCE NOW GO READ AGAIN (FINALLY
*
*
CNOP 2,4 ALIGN CARD ON F/W BOUNDARY
DC CL2' '
CARD DC CL132' '
ORG CARD+1
CARDCHAR DS C
CARDBITS DS 5CL2 3
CARD$UAB DS C SPECIFY MASK A OR B
ORG
*
*
HINIT DC 2F'0',4C'H' PLACE TO PRINT PIECES FROM
CARDSAVP DC F'0' PLACE TO SAVE ADDR OF FIRST ROT OF P
*
*
GETNOTPC DC H'1'
TITLE 'PRINT FORMATTED PIECES'
EODAD DS 0H --COME HERE ON OEF ON SYSIN.
LA RPG,QBOARD1 LOAD ADDR OF CONTROL TBL FOR PAGE
BAL BR,WRITINIT GO INITIALIZE PAGE HEADING
PRTPCS DS 0H
L RP,=A(PCETBL-LPCEROT) ADDR OF FITST PIECE
PRTPCSLP DS 0H
MVC BOARD,BOARD-1 INIT BOARD TO PERIODS
LA RP,LPCEROT(RP) ADDR OF NEXT ROTATION
TM PCEFLAG,X'FF' FLAG
BZ PRTPCSX END OF TABLE
BO PRTPCSLP NULL ENTRY
BAL BR,SETPIECE GO PUT PCE IN A TBL
*
ST RP,CARDSAVP SAVE ADDR OF CURRENT PIECE
LM 14,15,PCE LOAD THE PIECE
LH WR,PCEHI LOAD HIGHEST POSSIBLE LOC
SLDL 14,0(WR) SHIFT PIECE UP TO HI LOC
STM 14,15,HINIT STORE THE PIECE IN DUMMY PCE TBL
LA RP,HINIT LOAD POINTER TO DUMMY TBL
BAL BR,SETPIECE FORMAT THE PIECE IN A BOARD
LA RPG,QBOARD1 LOAD ADDR OF CONTROL TBL FOR PAGE
BAL BR,SETBOARD THEN FORMAT THE BOARD
L RP,CARDSAVP AND THEN LOAD THE READ PIECE ADDR
*
B PRTPCSLP GO TRY NEXT PIECE
*
*
PRTPCSX DS 0H ALL PIECES DONE
LA RP,MASKS LOAD ADDR OF 4 MASKS TO CHECK
LA RC,5 5 MASKS TO CHECK
L WR,=CL4'OOOO' USE THIS CHAR TO PUT ON PAPER
PRBOARDS DS 0H
L WR2,8(RP) SAVE WHATEVER IS NEXT IN MEMORY
ST WR,8(RP) PUT THE CHECKING CHAR IN PLACE
STM 3,11,SOLSAV SAVE THE REGS
BAL BR,SETPIECE GO PUT PIECE ON BOARD
ST WR2,8(RP) RESTORE WHATEVER IS NEXT IN MEMORY
LA RPG,QBOARD1 LOAD ADDR OF CONTROL TBL FOR PAGE
BAL BR,SETBOARD THEN FORMAT A BOARD
LM 3,11,SOLSAV LOAD 'EM UP AGAIN.
LA RP,8(RP) ADDR OF NEXT MASK TO CHECK
MVC BOARD,BOARD-1 INIT BOARD TO PERIODS
BCT RC,PRBOARDS GO BACK AND PRT ALL WORK/BOARDS
BAL BR,FORCEPAG FORCE WRITING THIS PAGE
*
ZAP CNTPUZ,=P'0'
LA RPG,QBOARD1 LOAD ADDR OF CONTROL TBL FOR PAGE
BAL BR,WRITINIT INIT HEADING AGAIN FOR COUNT
*
B MAIN GO DO MAIN SECTION
TITLE 'TABLE MACRO CONTROL $TBLGEN'
TABLE $TBLGEN ENTRYNO=2530,ENTRYLN=64,REG=5,KEY=4,KEYLEN=60, X
SORT=A,DOC=ALL
TITLE 'SUBR - SAVE, LOSE, COPY/COPY2, SWAP'
CALCLOC DS 0H
SR RLOC,RLOC
LM 14,15,PUZZLE LOAD THE PUZZLE
LA 0,255 LOAD 1 BITS IN LOW BYTE
LA 1,7 MAX 7 TIMES THRU
*
CALCLOC1 DS 0H
LR WR,15 SAVE LOW BYTE
OR 15,0 TRY TO TURN LOW BITS ON
CR WR,15 WERE ALL THE BITS ALREADY ON
BNE DOBITS
*
LA RLOC,8(RLOC) ADD 8 TO CURRENT OFFSET
SRDL 14,8
BCT 1,CALCLOC1 AND LOOP
*
DOBITS DS 0H
LR 14,WR LOAD LOW BYTE INTO R-14
*
CALCLOC2 DS 0H
SR 15,15
SRDL 14,1 SHIFT BITS DOWN UNTIL WE GET A ZERO
LTR 15,15 WAS IT A ZERO
BZ CALCLOC3 YES, SAVE
LA RLOC,1(RLOC)
B CALCLOC2 TRY NEXT BIT
*
CALCLOC3 DS 0H
BR BR RETURN TO MAIN
*
SAVE DS 0H
STM 6,7,TPUZZLE SAVE PUZZLE W/O PIECE
STM 14,0,TPIECE AND SAVE THIS PIECE
ST RLOC,TLOC SAVE THIS LOC IN CASE WE REMOV PCE
SR RP,RPIECE CALC OFFSET TO THIS ROTATION
LA RP,12(RP) ADD 1 CAUSE WE ALWASY SAVE NEXT
ST RP,TROT SAVE OFFSET TO THIS ROTATION
OR 6,14 OR PIECE INTO PUZZLE SO FAR
OR 7,15 (BOTH HALVES)
STM 6,7,PUZZLE AND SAVE FOR NEXT USE
CLI TL(RX),255 IS THIS ALL THE PIECES
BE MAINDONE YES, GO RECORD THE SOLUTION
LA RX,TL(RX) SET INDEX TO NEXT SLOT
BAL WR,COPY NOW COPY INDEX TO NEXT LEVEL
AP CNTSAVE,=P'1' ADD 1 TO COUNT OF NO. OF PCS SAVED
BR BR RETURN TO CALLER (PROBABLY --SAVE--
*
LOSE DS 0H
S RX,=A(TL) BACKUP ONE INDEX TABLE ENTRY
MVC PUZZLE,TPUZZLE RESTORE PREV COPY OF PUZZLE
C RX,=A(TBL) DID WE TRY TO BACKUP TO FAR
BL FINI YES, BETTER QUIT
L RLOC,TLOC LOAD NEW (PREV) LOCATION
L RPIECE,TPCE LOAD BASE ADDR OF THIS PIECE
BR BR NO, THEN TRY A NEW PIECE
*
COPY DS 0H
LA 1,TEND DUMMY LAST ENTRY
ST 1,TCUR INIT NEW CURRENT PIECE
*
COPY2 DS 0H
LR 1,RX LOAD THE INDEX VALUE
S 1,=A(TL) BACKUP 1 TABLE ENTRY
MVC TVARBEG(TVL),TVARBEG-T(1) COPY VARIABLE PART FROM PREV
SR 1,1
ST 1,TSQUARE
ST 1,TROT
BR WR RETURN TO CALLER
*
SWAP DS 0H
BAL WR,COPY2 REFREST VARIABLE PORTION
LM 14,15,THIS
S 15,=F'4' ADDR OF NEXT ENTRY TO SWAP
CR 15,14 COMPARE IT TO CURRENT
BL SWAPBAD IF ALL HAVE BEEN DONE, ERROR
BE SWAPSAVE IF SAME, LEAVE ADDRESSES ALONE
*
L 0,0(14) IF NOT, LOAD THE 2 ADDRESSES,
L 1,0(15) AND SWITCH 'EM
ST 0,0(15)
ST 1,0(14)
*
SWAPSAVE DS 0H
ST 15,TCUR SAVE NEW CUR POINTER
SR 1,1 START WITH FIRST ROTATION AFTER SWAP
ST 1,TROT BY ZEROING CUTTENT ROTATION OFFSET
L RP,THIS LOAD NEW PIECE POINTER
L RP,0(RP) AND LOAD ADDR OF NEW PIECE
LR RPIECE,RP LOAD BASE ADDR OF THIS PIECE
ST RPIECE,TPCE USED TO CALC OFFSET TO CURNT ROTATN
BR BR AND RETURN
*
SWAPBAD DS 0H
SR RP,RP BAD INDICATION
BR BR AND RETURN
TITLE 'MAIN LOGIC AND NEXT ROTATN'
MAIN DS 0H
CLOSE (SYSIN)
OPEN (SYSUT2,OUTPUT,SYSUT3,OUTPUT,SYSUT4,OUTPUT)
*
STM 2,12,CARD SAVE ALL THE REGS,
L 7,=A(WRITEDOC) LOAD ADDR OF DOC. WRITE ROUTINE
BALR BR,7 GO WRITE DOCUMENTATION AND RELOAD
LM 2,12,CARD REGS THAT MAY HAVE BEEN WIPED OUT.
*
CLI FLAGCHK,C'C' DO WE CHECK FOR DUPLICATES
BNE NOTBLGM NO, DON'T DO GETMAIN FOR TABLE
$TBLGM TABLE DO A GETMAIN OF ABOUT 150K
NOTBLGM DS 0H
*
L RX,X LOAD PRIMARY INDEX
LR 1,RX DUPLICATE ADDRESS
SR RNUMTRY,RNUMTRY DON'T COUNT TIMES THRU FIT IN INITAL
S 1,=A(TL) SUBT 1 ENTRY LENGTH
MVC 0(TL,1),0(RX) SET UP PRIMARY BACKUP
BAL BR,SWAP INITIAL SWAP
B MAINLOC AND FOR KICKS, LOC FIRST SQUARE
*
MAINLOSE DS 0H
BAL BR,LOSE GO ERASE THIS LAST PIECE
B MAINNEXT GO TRY NEXT ROTATION OF NEXT 2 LAST
*
MAINLOC DS 0H
BAL BR,CALCLOC GO CALC NEW LOCATION
*
MAINNEXT DS 0H
BAL BR,NEXT GO TRY THE NEXT PIECE
LTR RP,RP
BNZ MAINFIT OK, SEE IT IT FITS
MAINSWAP DS 0H
BAL BR,SWAP TRY NEXT PIECE
LTR RP,RP IS THERE ANOTHER PIECE
BZ MAINLOSE NO, GO REMOVE THE LAST PIECE
B MAINNEXT YES, GO TRY TO FIT IT IN
*
MAINFIT DS 0H
BAL BR,FIT GO SEE IF PIECE FITS
LTR RP,RP DID IT FIT
BZ MAINSWAP NO ROTATION FITS, GO GET ANOTHER PCE
BAL BR,SAVE NOW SAVE THIS PIECE
CLC DONE,PUZZLE IS THE PUZZLE ALL DONE
BE MAINDONE YES, GO SAVE THE SOLUTION
BAL BR,SWAP AFTER SAVE, DO INITIAL SWAP AGAIN
B MAINLOC AND GO CALC NEW LOCATION
*
MAINDONE DS 0H
BAL BR,SOLUTION GO RECORD THIS SOLUTION
B MAINLOSE GO TAKE NEXT TO LAST PIECE OFF ALSO
* NEED TO REMOVE ATLEAST 2 PIECES FOR
* A NEW SOLUTION
*
NEXT DS 0H
L RP,THIS LOC OF CURRENT PIECE SWAPED UP
* FROM THE BOTTOM.
L RP,0(RP) LOC OF FIRST AVAIL PIECE
L 1,TROT
AR RP,1 ADD IN THIS ROTATION
LA 1,LPCEROT(1) SET UP NEXT ROTATION
ST 1,TROT
CLI PCEFLAG,255 IS THIS A VALID ENTRY
BCR 7,BR RETURN IF GOOG ENTRY
SR RP,RP IF NOT, INDICATE BAD
BR BR RETURN WITH THIS PCE ADDR
*
*
FIT DS 0H SEE IF THIS PIECE FITS
STM 6,11,FITSAV SAVE REGS WE WIPE OUT
LM 6,11,PUZZLE LOAD PUZZLE AND SIDES
FITLOOP DS 0H LOOP THRU ROTATIONS HERE
LA RNUMTRY,1(RNUMTRY) COUNT THIS TEST
CH RLOC,PCEHI IS THIS PIECE TO BIG TO FIT
BH FITBAD YES, GO TURN IT AND TRY AGAIN
LM 14,0,PCE NO, LOAD BITS AND FLAG
SLDL 14,0(RLOC) SHIFT BITS UP TO WHERE THEY WILL GO
LR 1,6 TRY HALF OF PUZZLE
NR 1,14 DOES PIECE OVERLAP WITH SOMETHING
BNZ FITBAD ALREADY THERE. IF SO, REJECT
LR 1,7 TRY OTHER HALF
NR 1,15 DOES IT OVERLAP
BNZ FITBAD YES, TRY ANOTHER ROTATION OF THIS PC
*
LR 1,15 LOAD HI HALF OF PUZZLE
NR 1,11 DOES PIECE TOUCH RITE SIDE
BNZ FITLEFT YES, SEE IF IT TOUCHES LEFT SIDE TOO
LR 1,14 LOAD OTHER HALF OF LEFT
NR 1,10 DOES OTHER HALF TOUCH BOARDER
BZ FITGOOD NO, MUST FIT THE BOARD, PUT IT THERE
*
FITLEFT DS 0H
LR 1,9 LOAD HALF OF SIDEMASK
NR 1,15 DOES PIECE TOUCH THIS SIDE TOO
BNZ FITBAD YES, ERROR
LR 1,14 LOAD PIECE MASK
NR 1,8 DOES IT TOUCH THE SIDE
BZ FITGOOD NO, IT FITS, GO TO SAVE RTN
*
*
FITBAD DS 0H
CLI PCEFLAG+LPCEROT,255 IS THERE ANOTHER ROTATION 4 THISPC
BE *+12 NO, BRANCH AROUND THE STUFF TODO NXT
LA RP,LPCEROT(RP)
B FITLOOP GO TRY NEXT POSITION OF THIS PIECE
*
SR RP,RP
LM 6,11,FITSAV LOAD REGS WE WIPE OUT
BR BR RTN TO MAIN LINE
*
*
FITGOOD DS 0H
LM 8,11,FITSAV+8 RELOAD REGS
BR BR
*
TITLE 'END OF THE WHOLE THING'
QUIT DS 0H DIE HERE
*
*
FINI DS 0H
BAL BR,FORCEPAG FORCE WRITING THIS PAGE
*
CLOSE (SYSUT2,,SYSUT3,,SYSUT4)
*
CLI PARM,C'C' DO WE CHECK FOR DUPLICATES
BNE *+8 NO, BYPASS BAL TO RTN TO SORT AND CK
BAL BR,CHECKTBL YES, GO SORT AND COMPARE SOLUTIONS
*
CLOSE (SYSUT1)
*
L 13,4(13)
LM 14,12,12(13)
SR 15,15
BR 14
*
*
FORCEPAG DS 0H
STM 3,11,SOLSAV SAVE REGS AS OF ENTRY
LA RPG,PAGETBL LOAD ADDR OF A PAGE CONTROL TBL
FORCLOOP DS 0H
L 1,PGDCB LOAD DCB ADDR
TM 48(1),X'10' IS THIS DCB OPEN
BNO FORCNEXT NO, GO TRY NEXT PAGE/DCB
LA BR,FORCNEXT LOAD RETURN ADDR
L 1,PGAPAGE LOAD ADDR OF BEG OF PAGE
STM 2,11,PAGESAVE SAVE REGS O IN PAGE SAVE AREA
BAL BR,SETFORCE GO FORCE END OF PAGE
FORCNEXT DS 0H
LA RPG,LPAG(RPG) ADDR OF NEXT PAGE CONTROL TBL
CLI 0(RPG),255 ARE ALL TABLES DONE
BNE FORCLOOP NO, GO DO NEXT ONE
LM 3,11,SOLSAV LOAD REGS AS OF ENTRY
BR BR RETURN
TITLE 'SOLUTION DRIVER SET UP PRT'
* LOTS LESS THINKING WENT INTO THIS SECTION, I DIDN'T SUSPECT IT
* WOULD GET SO CRUMMY. I'D REWRITE IT, BUT WHY BOTHER, ALTHOUGH
* IT SURE WOULD BE NICE, AND IT WOULD MAKE THE MESS EASIER TO
* UNDERSTAND.
* BASICALLY, AS I REMEMBER, THE FIRST SECTION SETS UP A PICTURE
* OF THE PUZZLE, THEN IT IS COPIED INTO THE VARIOUS BOARD IMAGES.
* THE SETUP ISN'T BAD, BUT CONTROL OF THE BOARDS IS TERRIBLE - IT
* USES A BIG SET OF PARTIALLY DUPLICATED PARAMETERS - IT EVEN
* CONFUSES ME (ALTHOUGH THAT'S NOT DIFFICULT!).
*
* FIRST, SAVE THE ORIGIONAL REGISTERS, THEN INSURE THE ADDRESS OF
* THE MAIN 'PIECE TABLE' IS LOADED.
*
SOLUTION DS 0H
STM 4,11,SOLSAV SAVE THE REGS
L RX,=A(TBL) LOAD ADDR OF INDEX TABLE
*
* NEXT, LOOP THRU THE PIECE TABLE, PUTTING THE IMAGE IF EACH PIECE
* ONTO THE BOARD. THE RTN USES,
* (A) IMAGE OF THE PIECE, AND
* (B) OFFSET OF THE PIECE ON THE BOARD FOR THE CURRENT SOLUTION.
* A X'FF' INDICATES THE END OF THE PIECE TABLE
SOLPCE DS 0H
LA RP,TPIECE LOAD ADDR OF THIS PCE
BAL BR,SETPIECE PUT PIECE INTO THE BOARD
LA RX,TL(RX) POINT TO NEXT PIECE
CLI 0(RX),255 END OF INDEX TBL
BNE SOLPCE NO, GO DO NEXT PCE
*
* NEXT, COUNT THE SOLUTION, THEN TRANSLATE THE IMAGE OF THE BOARD
* FROM HORIZONTAL TO VERTICAL.
*
AP CNTPUZ,=P'1' COUNT THE SOLUTION
MVC BOARD2,TRANSLAT SETUP TO MOVE SOLUTION TO HORIZONTAL
TR BOARD2,BOARD BOARD, AND MOVE IT.
*
* LOAD THE ADDRESS OF A SERIES OF PARAMETERS THAT DEFINE A REPORT
* PAGE, TO USE TO PUT THIS SOLUTION ON THE REPORT PAGE IMAGE.
*
LA RPG,PAGETBL LOAD ADDR OF A PAGE CONTROL TBL
*
* NEXT MOVE THE SOLUTION TO THE VARIOUS PAGE IMAGES.
*
PAGELOOP DS 0H
BAL BR,SETBOARD GO PUT BOARD ONTO THE CURRENT PAGE
LA RPG,LPAG(RPG) ADDR OF NEXT PAGE CONTROL TBL
CLI 0(RPG),255 ARE ALL TABLES DONE
BNE PAGELOOP NO, GO TRY NEXT
MVC BOARD(60),BOARD-1 PUT PERIODS AROUND THE BOARD
*
CLI FLAGCHK,C'C' DO WE CHECK FOR DUPLICATES
BNE NOTBLADD NO, DON'T ADD AN ENTRY TO THE TBL
$TBLADD TABLE GET AN ADDRESS IN THE TABLE
OI CNTPUZ+2,X'0F' FIX SIGN OF COUNT FIELD
UNPK BOARD2-5(5),CNTPUZ MAKE THIS PUZZLE NUMBER PRINTABLE
MVC 0(64,RTABLE),BOARD2-4 MOVE THIS SOLUTION INTO THE TBL
NOTBLADD DS 0H
*
*
CLI FLAGWTO,C'W' DO WE ADVERTIZE OUR PROGRESS,
BNE SKIPWTO NO, DON'T DO ALL THE WTO'S
NOP100 NOP SOL100 BRANCH TO ONLY WTO EACH 100 SOLUTION
NOP10 NOP SOL10 SAME / EVERY 10 SOLUTIONS
TM CNTPUZ+2,X'30' WTO 1, 2, AND 3 SOLUTIONS
BNZ DOWTOCNT GO DO THE WTO
OI NOP10+1,X'F0' TURN NOP INTO BR, ONLY DO EVERY 10
*
SOL10 DS 0H
TM CNTPUZ+2,X'F0' IS THIS A MULTIPLE OF 10
BNZ NOWTOCNT NO, BYPASS THE WTO
TM CNTPUZ+1,X'0F' IS IT A MULTIPLE OF 100
BNZ DOWTOCNT NO, GO DO WTO
OI NOP100+1,X'F0' SET 100 NOP TO ONLY WTO EVERY 100
*
SOL100 DS 0H
TM CNTPUZ+1,X'0F' IS THIS 100-109, 200-209, 300-309...
BNZ NOWTOCNT NO, BYPASS THE WTO
TM CNTPUZ+2,X'F0' IS THIS 100, 100, 300, ..
BNZ NOWTOCNT NO, BYPASS THE WTO
*
DOWTOCNT DS 0H
OI CNTPUZ+2,X'0F' FIX SIGN
UNPK WTOCNT+8(5),CNTPUZ PUT COUNT INTO WTO
WTOCNT WTO '00000'
SKIPWTO DS 0H
*
NOWTOCNT DS 0H
*
*
SR RNUMTRY,RNUMTRY ZERO OUT CNT OF LOCATES FOR PIECE
LM 4,11,SOLSAV RELOAD THE REGS WE LIKELY WIPED OUT
BR BR
*
*
SETPIECE DS 0H
LM 14,15,PCE LOAD A PIECE
IC WR,PCECHAR AND LOAD THE CHAR TO BE USED
LA RC,60 SIXTY POSSIBLE PLACES
LA 1,BOARD-1 AND LOOK AT THE BOARD
SLDL 14,4 LOSE EXTRANEOUS BITS
*
SETPLOOP DS 0H
LTR 14,14 IS THERE A BIT HERE
BNM *+8 NO, DON'T STORE CHAR
STC WR,0(1,RC) YES, INDICATE THE CHAR
SLDL 14,1 SHIFT NEXT BIT INTO PLACE
BCT RC,SETPLOOP AND GODO NEXT BIT
*
BR BR RETURN
TITLE 'THIS IS THE --PAGE -- STUFF'
MVCLINE MVC 0(0,3),0(6) MVC LINE OF PUZZLE TO THE PAGE
*
PRTPAGX DS 0H
LM 2,11,PAGESAVE RELOAD ALL REGS
BR BR AND RETURN TO CALLER
*
SETBOARD DS 0H
STM 2,11,PAGESAVE SAVE ALL REGS
LM 14,15,PGDCB LOAD DCB AND FORMAT RTN ADDR
TM 48(14),X'10' IS THIS DCB OPEN
BNO PRTPAGX NO, JUST EXIT
LTR 15,15 IS THERE A PRINT/FORMAT RTN FOR THIS
BZ *+8 NO, DON'T TRY TO USE IT THEN
BAL BR,0(15) YES, GO DO IT
*
LM 3,6,PGPLACE LOAD PARAMETERS TO FMT AN ENTRY
BCTR 4,0 SUBT 1 FOR LENGTH IN MVC INST
LR 1,3 DUP PLACE IN PAGE
*
PRTMVCPZ DS 0H
EX 4,MVCLINE GO MOVE A LINE OF PUZZLE TO PAGE
LA 6,1(4,6)
LA 3,133(3) NEXT LINE OF THIS ONE
BCT 5,PRTMVCPZ MVC ALL LINES TO PAGE
*
A 1,PGENTADD ADD LENGTH OF AN ENTRY ON THIS LINE
ST 1,PGPLACE AND SAVE IT
C 1,PGENDLIN ARE WE AT THE END OF THE LINE YET
BL PRTPAGX NO, RETURN TO DO PUZZLE AGAIN
*
L 1,PGLINE LOAD CURRENT LINE ADDR
A 1,PGLINADD ADD LENGTH OF A LINE (SEVERAL LINES
*
SETFORCE DS 0H
PRTSAVLN DS 0H
ST 1,PGPLACE SAVE NEW PLACE
ST 1,PGLINE AND NEW LINE ADDR
LR 3,1 CALC NEW END OF LINE ADDR
A 3,PGLENLIN BEG + LENGTH
ST 3,PGENDLIN AND SAVE NEW END OF LINE ADDR
*
C 1,PGAPAGE DID WE DO FIRST ENTRY ON PAGE
BE HAV2WRIT YES, HAVE TO GO PRINT THIS PAGE
*
C 1,PGENDPAG DID WE GET TO THE END OF THE PAGE
BL PRTPAGX NO, GO DO ANOTHER SOLUTION
*
L 1,PGAPAGE LOAD ADDR OF BEG OF PAGE
B PRTSAVLN GO SET THE LINE ADDR
*
*
MOVET1 MVC 0(0,7),L1 MOVE TITLE TO PAGE
*
HAV2WRIT DS 0H
LM 4,8,PGPRTRGS LOAD ADDRESSES USED IN PRT RTN
* 4-DCB 5-PUZZL.FORMAT 6-NULL 7-A(FIRST LINE) 8-NO.OF LINS
LH 1,PGTITL LOAD LENGTH OF THE TITLE LINE
LTR 1,1 IS THERE ONE
BZ NOTITLE NO, PASS THIS PART
MVC L1,PGL1 MOVE TITLE BACK TO STARTING POINT
OI CNTPUZ+2,X'0F' FIX SIGN
UNPK L1TO,CNTPUZ LIST COUNT SO FAR
AP PGPAGCNT,=P'1' COUNT THE PAGE
OI PGPAGCNT+1,X'0F' FIX THE SIGN
UNPK L1PAGE,PGPAGCNT PUT PAGE NUMBER ON HEADING
C 1,=F'120' IS THIS THE LONG TITLE
BL XLONGTIT NO, SKIP THE NEXT PART
AP TOTCNTLO,PAGCNTLO
AP TOTCNTSV,PAGCNTSV KEEP TOTAL COUNT OF LOCATES AND SAVS
LM 14,0,=A(L1COUNT,EDITCNTS,4) ADDR OF CNT FIELDS AND NO.
EDITLOOP DS 0H
MVC 0(16,14),=X'40202020202020202020202020212020'
ED 0(16,14),0(15)
LA 14,16(14) NEXT EDIT PATTERN
LA 15,8(15) NEXT COUNT FIELD
BCT 0,EDITLOOP GO DO NEXT 3 FILEDS
MVC EDITCNTS(16),EDITCNTS-8 ZERO OUT COUNTS FOR THIS PAGE
*
XLONGTIT DS 0H
EX 1,MOVET1 PUT TITLE ON REPORT
NOTITLE DS 0H
*
PUTALINE DS 0H
PUT (4),(7) WRITE A RECORD
MVC 2(131,7),1(7) BLANK OUT THE LINE
LA 7,133(7) ADDR OF NEXT LINE
BCT 8,PUTALINE LOOP THRU ALL THE LINES
INITHDR DS 0H
AP CNTPUZ,=P'1' THIS WILL BE FIRST ON NEXT PAGE
OI CNTPUZ+2,X'0F' DO THE SIGN
UNPK L1FROM,CNTPUZ HDR FOR NEXT TIME
SP CNTPUZ,=P'1' RESTORE CORRECT COUNT
*
TIMEDATE
MVC DATIME,0(1) PUT DATE AND TIME IN HEADING
MVC PGL1,L1 AND SAVE HEADING
B PRTPAGX AND RETURN, TO COME BACK FOR NEXT RP
*
*
WRITINIT DS 0H INIT PAGE HEADING HERE
STM 2,11,PAGESAVE SAV REGS
B INITHDR AND GO INIT HEADING
*
*
FMTCOUNT DS 0H
CVD RNUMTRY,DW MAKE THE COUNT OF NUMBER OF LOC DECM
AP PAGCNTSV,CNTSAVE SAVE COUNT
AP PAGCNTLO,DW SAVE COUNT OF NUMBER OF LOCARDS
MVC EDCOUNT(20),=2X'40202020202021204040'
ED EDCOUNT+10(8),DW+4
ED EDCOUNT(8),CNTSAVE
MVC CNTSAVE,=PL4'0' INIT CNT OF NUMBER OF SAVES
BR BR RETURN
*
*
FMTBIGBD DS 0H
LM 14,1,=A(BIGBOARD-21,BIGBOARD+21,6,42)
MVC 0(42,15),0(14) INIT A LINE (PARE OF LINES)
AR 15,1
BCT 0,*-8 GO MOVE NEXT BATCH
*
LM 6,9,FMTBIGAD YES, LOAD ADDRESSES TO BE USED
*
FMTBIGLP DS 0H
CLC 0(1,7),1(7) IS THIS SQUARE SAME PIECE AS NEXT
BNE *+8 NO, LEAVE SEPARATER THERE
MVI 21+2(6),C' ' YES, ERASE THE SEPARATER
*
CLC 0(1,7),10(7) IS THIS SQUARE SAME PIECE AS 1 ROW
BNE *+8 DOWN, NO, LEAVE SEPARATER ALONE
MVI 42+1(6),C' ' YES, ERASE THE SEPARATER
*
LA 7,1(7) ADD 1 TO PLACE IN SOURCE PUZZLE
LA 6,2(6) ADD 2 TO LOC IN THE DATA AREA
BCT 8,FMTBIGLP GO DO NEXT 9 POSITIONS
*
LA 6,22(6) PLACE IN NEXT LINE
LA 8,10 DO IT 10 TIMES FOR NEXT LINE TOO
BCT 9,FMTBIGLP GO DO NEXT 5 LINES
BR BR RETURN
FMTBIGAD DC A(BIGBOARD,BOARD2,10,6)
TITLE 'RTN TO CHECK FOR DUPLICATE SOLUTIONS'
CHECKTBL DS 0H
$TBLSORT TABLE SORT ALL OU THE SOLUTIONS
*
$TBLTOP TABLE GO UP TO THE TOP OF THE TABLE
*
L 3,=A(PAGE) LOAD ADDR OF PRINT PAGE
LA 4,133(3) BEG OF NEXT LINE
*
TBLCHKLP DS 0H
LR 2,RTABLE SAVE PREV ENTRY ADDRESS
*
$TBLNEXT TABLE GET ADDR OF NEXT ENTRY IN TABLE
LTR RTABLE,RTABLE DID WE GET TO THE END
BZ CHKTBLX YES, EXIT FROM THIS ROUTINE
*
CLC 4(60,RTABLE),4(2) NO, IS THIS SOLUTION IDENTICAL TO
BNE TBLCHKLP THE PREVIOUS ONE
*
MVC 0(4,3),0(2) MOVE 2 SOLUTION NUMBERS TO A PAGE
MVC 5(4,3),0(RTABLE) MOVE 2 SOLUTION NUMBERS TO A PAGE
LA 3,20(3) NEXT PLACE
CR 4,3 DID WE RUN OFF THE END OF THE LINE
BH TBLCHKLP NO, GO COMPARE A COUPLE MORE SOLUTNS
*
LR 3,4 YES, START AT BEGINING OF NEXT LINE
LA 4,133(3) AND SAVE NEXT LINE ADDR
B TBLCHKLP NOW GO COMPARE A COUPLE MORE SOLS
*
CHKTBLX DS 0H
C 3,=A(PAGE) DID WE RECORD ANY DUPLICATES
BCR 8,BR NO, MUST BE OK
*
BAL BR,FORCEPAG YES, GO WRITE OUT ALL DUPLICATES
BR BR NOW RETURN
*
*
TITLE 'CONSTANTS AND MISSING ROUTINES '
ALPHABET DC C' ABCDEFGHIJKLMNOPQRSTUVWXYZ'
INITPCE DC A(PCETBL,324*4,DW),X'FF',AL3(0)
*
*
PAGETBL DS 0D ADDR OF TABLES DEFINING PAGES
QBOARD1 DC A(PAGE,6,10,BOARD)
DC A(8,11*133)
DC A(126,133*54,PAGE,PAGE)
DC A(PAGE+126,PAGE+133*54)
DC A(SYSUT1,0)
DC PL2'0',H'89'
DC A(LINE1,60)
DC A(LINE1,61*133,ZERO),C' ',AL3(0)
DS CL132
DS 0D
*
* CUR.LOC, ENT.LEN, #.LINES, A(BOARD); LEN.ENT.LINE, LINE.LENGTH
* LINE.LENGTH, PAGE.LEN; A(CUR.LINE),A(PAG); A(END/LINE), A(END/PAGE)
* A(DCB, BOARD.FMT.RTN), PAGE.COUNT, LEN/TITLE, A(WRITE.INIT)
* #LINES.WRITE, PAGE.INIT.REGS, TITLE.
*
*LABEL PRTBL PAGE=,WIDTH=,LENGTH=,BOARD=,DCB=,PAGEW=,PAGEL=, X
* SPACEW=1,SPACEL=1,TITLE=(LINE1),LTITLE=,FMTRTN=(RTN)
$BOARD1 PRTBL PAGE=$PAGE,WIDTH=6,LENGTH=10,BOARD=BOARD,DCB=SYSUT1$, X
PAGEL=59,PAGEW=133,TITLE=LINE1,LTITLE=60
*
$BOARD7 PRTBL PAGE=$PAGE7,WIDTH=6,LENGTH=10,BOARD=BOARD,DCB=SYSUT7$, X
PAGEL=88,PAGEW=205,TITLE=LINE7,LTITLE=60
*
$BOARD2 PRTBL PAGE=$PAGE2,WIDTH=6,LENGTH=10,BOARD=BOARD,DCB=SYSUT2$, X
PAGEL=59,PAGEW=133,TITLE=LINE1,LTITLE=60
*
QBOARD7 DC A(PAGE7,6,10,BOARD)
DC A(8,11*210)
DC A(195,210*76,PAGE7,PAGE7)
DC A(PAGE7+195,PAGE7+210*80)
DC A(SYSUT7,0)
DC PL2'0',H'59'
DC A(LINE7,90)
DC A(LINE7,90*210,ZERO),C' ',AL3(0)
DS CL132
DS 0D
*
QBOARD2 DC A(PAGE2,10,6,BOARD2)
DC A(11,8*133)
DC A(126,133*54,PAGE2,PAGE2)
DC A(PAGE2+126,PAGE2+133*54)
DC A(SYSUT2,0)
DC PL2'0',H'89'
DC A(LINE2,60)
DC A(LINE2,61*133,ZERO),C' ',AL3(0)
DS CL132
DS 0D
*
QBOARD8 DC A(PAGE8,10,6,BOARD2)
DC A(11,8*210)
DC A(190,210*80,PAGE8,PAGE8)
DC A(PAGE8+190,PAGE8+210*80)
DC A(SYSUT8,0)
DC PL2'0',H'59'
DC A(LINE8,90)
DC A(LINE8,90*210,ZERO),C' ',AL3(0)
DS CL132
DS 0D
*
QBOARD3 DC A(PAGE3,10,9,BOARD2)
DC A(11,10*133)
DC A(126,133*54,PAGE3,PAGE3)
DC A(PAGE3+126,PAGE3+133*54)
DC A(SYSUT3,FMTCOUNT)
DC PL2'0',H'130'
DC A(LINE3,61)
DC A(LINE3,61*133,ZERO),C' ',AL3(0)
DS CL132
DS 0D
*
QBOARD9 DC A(PAGE9,10,9,BOARD2)
DC A(11,10*210)
DC A(190,210*78,PAGE9,PAGE9)
DC A(PAGE9+190,PAGE9+210*78)
DC A(SYSUT9,FMTCOUNT)
DC PL2'0',H'59'
DC A(LINE9,90)
DC A(LINE9,90*210,ZERO),C' ',AL3(0)
DS CL132
DS 0D
*
*
* CUR.LOC, ENT.LEN, #.LINES, A(BOARD); LEN.ENT.LINE, LINE.LENGTH
* LINE.LENGTH, PAGE.LEN; A(CUR.LINE),A(PAG); A(END/LINE), A(END/PAGE)
* A(DCB, BOARD.FMT.RTN), PAGE.COUNT, LEN/TITLE, A(WRITE.INIT)
* #LINES.WRITE, TITLE, PAGE.INIT.REGS
*
QBOARD4 DC A(PAGE4,21,13,BIGBOARD)
DC A(26,14*133)
DC A(119,133*54,PAGE4,PAGE4)
DC A(PAGE4+119,PAGE4+133*50)
DC A(SYSUT4,FMTBIGBD)
DC PL2'0',H'0'
DC A(LINE4,60)
DC A(LINE4+2,61*133,ZERO),C' ',AL3(0)
DS CL132
DS 0D
*
QBOARD10 DC A(PAGE10,21,13,BIGBOARD)
DC A(26,14*210)
DC A(180,210*76,PAGE10,PAGE10)
DC A(PAGE10+180,PAGE10+210*76)
DC A(SYSUT10,FMTBIGBD)
DC PL2'0',H'0'
DC A(LINE10,60)
DC A(LINE10+2,90*210,ZERO),C' ',AL3(0)
DS CL132
DS 0D
*
DC X'FF' END OF THE TABLES OF PAGE DEFINITION
*
DS 0D
DC CL16'DW PUZ MASKS SA'
*
DW DC D'0'
PUZZLE DC D'0'
*
MASKS DS 0F
LEFTSIDE DC BL4'00001000001000001000001000001000'
DC BL4'00100000100000100000100000100000'
*
RITESIDE DC BL4'00010000010000010000010000010000'
DC BL4'01000001000001000001000001000001'
*
MASKA DC X'FFFFFFF0',F'0' USE ONLY LOW HALF OF BOARD
*
MASKB DC BL4'00001100001100001100001100001100'
DC BL4'00110000110000110000110000110000'
*
DONE DC XL8'0FFFFFFFFFFFFFFF' PUZZLE LOOKS LIKE THIS WHEN DONE
*
APCETBLM DC A(PCETBL-LPCEROT) ADDR OF PCETBL MINUS 1 ROTATION
APCE DC A(PCETBL)
ATBL DC A(TBL) ADDR ON INDEX TBL
*
DC F'-1'
DC 0F'0',C'SAVAREAS'
SAVEAREA DC 18F'0'
DC F'-1'
FITSAV DS 6F
DC F'-1'
SOLSAV DS 9F
DC F'-1'
PAGESAVE DS 10F REG SAVE AREA
DC F'-1'
*
X DC A(TAB) POINTER TO CURRENT ENTRY IN TABLE
* USED TO JUGGLE THE PIECES AROUND
*
*
L1 DC CL90'1 '
ORG L1+3
DC C'SOLUTIONS '
L1FROM DC CL5' '
DC CL3' - '
L1TO DC CL5' ',CL3' '
DATIME DC CL16' '
DC C' PAGE '
L1PAGE DC CL3'0',CL32' '
ORG
L1COUNT DC CL72' ' COUNT FIELDS WILL GO HERE
*
TBLINDEX DC AL1(3,15,16,25,18,9,7,8,20,0,0,12,9,14,23,15,15,4,0)
DC AL1(7,18,1,14,20,0,12,25,15,14,19)
*
DC C'.'
BOARD DS CL60
DS CL5 PUZZLE COUNT WILL GO HERE
BOARD2 DS CL60 HORIZONTAL BOARD
DC CL10' '
EDCOUNT DC 2CL10' '
DC CL10' '
TRANSLAT DC FL1'0,6,12,18,24,30,36,42,48,54'
DC FL1'1,7,13,19,25,31,37,43,49,55'
DC FL1'2,8,14,20,26,32,38,44,50,56'
DC FL1'3,9,15,21,27,33,39,45,51,57'
DC FL1'4,10,16,22,28,34,40,46,52,58'
DC FL1'5,11,17,23,29,35,41,47,53,59'
CNTSAVE DC PL4'0' COUNT OF N NUMBER OF PIECES
CNTPUZ DC PL3'0' NUMBER OF SOLUTIONS SO FAR
DC PL8'0' TO INIT NEXT 2 FIELDS
EDITCNTS EQU *
PAGCNTLO DC PL8'0' COUNT OF LOCATES
PAGCNTSV DC PL8'0' COUNTS OF NUMBER OF SAVES
TOTCNTLO DC PL8'0' COUNT OF LOCARES
TOTCNTSV DC PL8'0' COUNTS OF NUMBER OF SAVES
*
*
LTORG
PUSH USING
ESTAE DS 0D
USING *,10
USING SDWA,2
LR 10,15
CH 0,=H'12'
BNE ESTAEOK
SR 15,15
BR 14
ESTAEOK STM 14,12,12(13)
LA 1,0(1)
LR 2,1
UNPK ESTAEWTO+8+6(7),SDWACMPC(4)
TR ESTAEWTO+8+6(6),HEX
MVI ESTAEWTO+8+6+6,C' '
ICM 1,7,SDWANXTA
S 1,=A(PUZ)
ST 1,0(13)
UNPK ESTAEWTO+8+23(7),1(4,13)
TR ESTAEWTO+8+23(6),HEX
MVI ESTAEWTO+8+29,C'.'
ESTAEWTO WTO 'ABEND-000000 AT OFFSET=000000. '
LA 3,SDWAGRSV
LA 6,4
ESTAEL1 LA 4,4
LA 5,ESTAEWTR+8
ESTAEL2 UNPK 0(9,5),0(5,3)
TR 0(8,5),HEX
MVI 8(5),C' '
LA 5,9(5)
LA 3,4(3)
BCT 4,ESTAEL2
ESTAEWTR WTO '00000000 00000000 00000000 00000000.'
BCT 6,ESTAEL1
LM 14,12,12(13)
SR 15,15
BR 14
LTORG
POP USING
TITLE 'TABLES AND DSECTS'
PRINT NOGEN
SYSIN DCB DDNAME=SYSIN,DEVD=DA,DSORG=PS,EODAD=EODAD,MACRF=GM
*
*
SYSUT1$ DCB DDNAME=SYSUT1$,LRECL=133,BLKSIZE=1330,RECFM=FBA, X
DSORG=PS,MACRF=PM
*
*
SYSUT2$ DCB DDNAME=SYSUT2$,LRECL=133,BLKSIZE=1330,RECFM=FBA, X
DSORG=PS,MACRF=PM
*
*
SYSUT1 DCB DDNAME=SYSUT1,LRECL=133,BLKSIZE=1330,RECFM=FBA,DEVD=DA, X
DSORG=PS,MACRF=PM
*
*
SYSUT2 DCB DDNAME=SYSUT2,LRECL=133,BLKSIZE=1330,RECFM=FBA,DEVD=DA, X
DSORG=PS,MACRF=PM
*
*
CNTDCB DS 0F
SYSUT3 DCB DDNAME=SYSUT3,LRECL=133,BLKSIZE=1330,RECFM=FBA,DEVD=DA, X
DSORG=PS,MACRF=PM
*
*
* BIGDCB DS 0F
SYSUT4 DCB DDNAME=SYSUT4,LRECL=133,BLKSIZE=1330,RECFM=FBA,DEVD=DA, X
DSORG=PS,MACRF=PM
*
*
SYSUT7 DCB DDNAME=SYSUT7,LRECL=210,BLKSIZE=2100,RECFM=FBA,DEVD=DA, X
DSORG=PS,MACRF=PM
*
*
SYSUT7$ DCB DDNAME=SYSUT7$,LRECL=205,BLKSIZE=2050,RECFM=FBA, X
DSORG=PS,MACRF=PM
*
*
SYSUT8 DCB DDNAME=SYSUT8,LRECL=210,BLKSIZE=2100,RECFM=FBA,DEVD=DA, X
DSORG=PS,MACRF=PM
*
*
SYSUT9 DCB DDNAME=SYSUT9,LRECL=210,BLKSIZE=2100,RECFM=FBA,DEVD=DA, X
DSORG=PS,MACRF=PM
*
*
SYSUT10 DCB DDNAME=SYSUT10,LRECL=210,BLKSIZE=2100,RECFM=FBA,DEVD=DA, X
DSORG=PS,MACRF=PM
PRINT GEN
*
*
HEX EQU *-240
DC C'0123456789ABCDEF'
DS 0D
DC CL8'INDEXTBL'
DC 12D'0' TO MAKE SPACE FOR PRIOR ENTRY
TBL DS 0D
TAB DS 0D
*
*
DC A(*+TFIRSTPC) CURRENT ENTRY
DC A(TAB+TL) SWITCH ENTRY (INIT AT END OF TBL
DC F'0' OFFSET TO CURRENT ROTATION
DC F'0' ADDR OF A PIECE USED IN PUZZLE
DC F'0' POINTER TO FIRST AVAILABLE SQUARE
DC 2F'0' INITIAL PUZZLE MASK
DC 3F'0' PLACE TO KEEP PICTURE OF THIS PIECE
*
DC A(PCETBL) ADDR OF FIRST PIECE
DC A(PCETBL+LPCE)
DC A(PCETBL+LPCE*2)
DC A(PCETBL+LPCE*3)
DC A(PCETBL+LPCE*4)
DC A(PCETBL+LPCE*5)
DC A(PCETBL+LPCE*6)
DC A(PCETBL+LPCE*7)
DC A(PCETBL+LPCE*8)
DC A(PCETBL+LPCE*9)
DC A(PCETBL+LPCE*10)
DC A(PCETBL+LPCE*11)
*
DC A(*+TFIRSTPC+4)
DS ((TL-4)/4)F
DC A(*+TFIRSTPC+8)
DS ((TL-4)/4)F
DC A(*+TFIRSTPC+12)
DS ((TL-4)/4)F
DC A(*+TFIRSTPC+16)
DS ((TL-4)/4)F
DC A(*+TFIRSTPC+20)
DS ((TL-4)/4)F
DC A(*+TFIRSTPC+24)
DS ((TL-4)/4)F
DC A(*+TFIRSTPC+28)
DS ((TL-4)/4)F
DC A(*+TFIRSTPC+32)
DS ((TL-4)/4)F
DC A(*+TFIRSTPC+36)
DS ((TL-4)/4)F
DC A(*+TFIRSTPC+40)
DS ((TL-4)/4)F
DC A(*+TFIRSTPC+44)
DS ((TL-4)/4)F
DC 2F'-1' END OF THE TABLE
*
*
DC 64X'DD'
DC CL8' PCETBL'
PCETBL DC 324F'-1' TABLE OF PIECES/ROTATIONS
ZERO DC 3F'0'
DC 32X'DD' SPACE BEFORE BIG BOARD
DC 11C' 1'
BIGBOARD DS 13CL21 THIS WILL CONTAIN THE BIG PICTURE
ORG BIGBOARD
DC 11C'+-'
ORG
$PAGE PRPGE $LINE1,133,60
$PAGE2 PRPGE $LINE2,133,59
$PAGE3 PRPGE $LINE3,133,59
$PAGE4 PRPGE $LINE4,133,63,NUMTITL=0
$PAGE7 PRPGE $LINE7,210,88
$PAGE8 PRPGE $LINE8,210,88
$PAGE9 PRPGE $LINE9,210,88
$PAGE10 PRPGE $LINE10,210,88
*
NULL1 DS 64X'DD'
*
LINE1 DS 2CL133,CL2
PAGE DS 59CL133
NULL2 DS 64X'DD'
*
LINE2 DS 2CL134
PAGE2 DS 59CL133
NULL3 DS 64X'DD'
*
LINE3 DS 2CL134
PAGE3 DS 59CL133
NULL4 DS 64X'DD'
*
LINE4 DS C '1'
PAGE4 DS 63CL133
*
LINE7 DS 2CL210
PAGE7 DS 88CL210
DS 64X'DD'
*
LINE8 DS 2CL210
PAGE8 DS 88CL210
DS 64X'DD'
*
LINE9 DS 2CL210
PAGE9 DS 88CL210
DS 64X'DD'
*
LINE10 DS 2CL210
PAGE10 DS 88CL210
DS 64X'DD'
*
WRITEDOC DS 0D
USING *,7
CLI FLAGDOC,C'N' Q. DO WE PRINT DESCRIPTION,
BER BR NO, EXIT.
LM 2,6,DOCADDRS
DOCMVC EX 5,DOCMVC1
EX 5,DOCMVC2
LA 8,DOCDCBS
L 9,0(8)
DOCPUT PUTOPEN (9),(4)
MVI DOCLINE,C' '
LA 8,4(8)
L 9,0(8)
LTR 9,9
BNZ DOCPUT
*
AR 2,6
AR 3,6
C 2,DOCADDRS+4
BL DOCMVC
BR BR
DOCMVC1 MVC 01(0,4),0(2)
DOCMVC2 MVC 67(0,4),0(3)
* REG= 2 3 4 5 6
DOCADDRS DC A(DOC,(ENDDOC-DOC)/124*62+DOC,DOCLINE,61,62)
DOCDCBS DC A(SYSUT1,SYSUT2,SYSUT3,SYSUT4,0)
LTORG
*
DOCLINE DC CL210'1'
DOC EQU *
DC CL62'THIS PROGRAM SOLVES A PUZZLE THAT WAS DESCRIBED IN SCIENTIFIC'
DC CL62'AMERICAN AS ''PENTIMINOES''. IT IS ALSO SOLD IN STORES AS '
DC CL62'(HEXED) AND (BRAIN DAMAGE). THE GENERAL DESCRIPTION OF IT IS:'
DC CL62'THERE ARE 12 PIECES THAT HAVE TO BE FITTED INTO A BOARD '
DC CL62'THAT IS 6 X 10. EACH OF THE PIECES OCCUPIES 5 SQUARES ON '
DC CL62'THE BOARD. IF YOU TAKE 5 INDIVIDUAL SQUARES, AND PUT THEM '
DC CL62'TOGETHER IN ALL OF THE POSSIBLE UNIQUE PATTERNS SO THAT YOU '
DC CL62'CANNOT ROTATE OR TURN OVER ONE PATTERN TO MAKE ANOTHER, '
DC CL62'THERE WILL BE 12 PATTERNS. TO GET ALL OF THE SOLUTIONS TO '
DC CL62'THE PUZZLE, THE BOARD IS REPRESENTED AS A BIT PATTERN, '
DC CL62'CONTAINING 60 BITS. THIS CAN BE LOADED IN AN EVEN-ODD '
DC CL62'REGISTER PAIR. PIECES CAN THEN BE REPRESENTED AS BIT '
DC CL62'PATTERNS ALSO, AND AS PIECES ARE PLACED ON THE BOARD, THE '
DC CL62'CORRESPONDING BITS ARE TURNED ON IN THE REGISTERS. WHEN '
DC CL62'ALL OF THE PIECES HAVE BEEN PLACED ON THE BOARD, A SOLUTION '
DC CL62'HAS BEEN FOUND. THIS IS RECORDED, THEN A PIECE OR TWO IS '
DC CL62'REMOVED, AND A DIFFERENT SOLUTION IS ATTEMPTED BY TURNING '
DC CL62'THE PIECES OVER, OR ROTATING THEM. TO ACCOMPLISH ALL THIS, '
DC CL62'SEVERAL PROBLEMS HAD TO BE WORKED OUT. '
DC CL62' FIRST, IT IS NECESSARY TO DESCRIBE HOW THE PIECES ARE '
DC CL62'KEPT, AND HOW THEY ARE SELECTED. THIS IS DONE WITH 2 '
DC CL62'TABLES, THE ''PIECE'' TABLE, AND THE ''INDEX'' TABLE. EACH '
DC CL62'CONSISTS OF 12 MAJOR ENTRIES, WITH MINOR ENTRIES WITHIN '
DC CL62'EACH MAJOR ENTRY. EACH ENTRY IN THE PIECE TABLE DESCRIBES '
DC CL62'ALL OF THE WAYS A PIECE CAN BE ORIENTED TO FIT ONTO THE '
DC CL62'PUZZLE BOARD. THE PIECE THAT IS SHAPED LIKE A ''+'' CAN '
DC CL62'ONLY HAVE ONE ORIENTATION, SINCE ROTATING IT, OR TURNING IT '
DC CL62'OVER DOES NOT CHANGE THIS. THE PIECE SHAPED LIKE A ''U'' '
DC CL62'CAN HAVE 4 POSSIBLE ORIENTATIONS, CORRESPONDING TO FOUR '
DC CL62'90 DEGREE ROTATIONS. TURNING THE PIECE OVER DOES NOT CHANGE '
DC CL62'THE SHAPE. THE PIECE SHOWN AT THE RIGHT HAS EIGHT '
DC CL62'POSSIBLE SHAPES, FOUR ROTATIONS ON EACH SIDE. EACH XXX '
DC CL62'OF THESE ROTATIONS IS DESCRIBED IN THE ENTRY FOR XXX '
DC CL62'THIS PIECE. EACH OF THE 12 ENTRIES IN THE TABLE X '
DC CL62'COMPLETELY DESCRIBES A PIECE. THE PIECES ARE LOADED '
DC CL62'INTO THE PIECE TABLE FROM CONTROL CARDS IN THE SYSIN FILE. '
DC CL62'PART OF THE INITIALIZATION PROCESS READS THIS FILE, AND '
DC CL62'MAKES UP THE BIT PATTERNS FROM THE CONTROL INFORMATION. '
DC CL62' THE OTHER MAJOR TABLE IS THE INDEX TABLE. IT IS USED TO '
DC CL62'SELECT PIECES IN ORDER, TO INSURE THAT ALL PIECES ARE TRIED '
DC CL62'IN ALL POSSIBLE LOCATIONS, BUT THAT NO PIECE IN INCORRECTLY '
DC CL62'TRIED TWICE IN THE SAME LOCATION. THIS WILL BE DESCRIBED '
DC CL62'IN MORE DETAIL LATER. '
DC CL62' NEXT, LOOK AT THE TABLE. THIS IS THE '
DC CL62'LOGICAL CONCEPT OF HOW THE BOARD IS LAID 54 55 56 57 58 59 '
DC CL62'OUT. PIECES ARE BIT PATTERNS (5 BITS 48 49 50 51 52 53 '
DC CL62'PER PIECE) AND EACH PATTERN IS SET UP 42 43 44 45 46 47 '
DC CL62'TO USE POSITION 00 (AND 4 OTHER HIGHER 36 37 38 39 40 41 '
DC CL62'POSITIONS). AS EACH PIECE IS ADDED TO 30 31 32 33 34 35 '
DC CL62'THE TABLE, THE BITS FOR THE POSITION 24 25 26 27 28 29 '
DC CL62'IT OCCUPIES ARE TURNED ON. TO TEST TO 18 19 20 21 22 23 '
DC CL62'DETERMINE IF A PIECE FITS, THE BOARD SO 12 13 14 15 16 17 '
DC CL62'FAR IS ANDED WITH THE BIT PATTERN FOR 06 07 08 09 10 11 '
DC CL62'THE PIECE, AND IF NONE OF THE POSITIONS 00 01 02 03 04 05 '
DC CL62'OVERLAP THE PIECE FITS (MAYBE). EACH '
DC CL62'TIME A PIECE IS ADDED TO THE BOARD, THE PROGRAM CALCULATES '
DC CL62'THE FIRST EMPTY LOCATION (STARTING FROM 00) AND THE NEXT '
DC CL62'PIECE WILL BE ADDED USING THIS LOCATION. THUS NO EMPTY '
DC CL62'POSITIONS WILL BE LEFT AS THE BOARD IS FILLED UP. FOR '
DC CL62'EXAMPLE, IF 12 WAS THE FIRST EMPTY LOCATION, EACH PIECE '
DC CL62'WOULD BE LOADED INTO A REGISTER, AND SHIFTED UP 12 PLACES '
DC CL62'(BITS), THEN TESTED TO DETERMINE IF IT FIT ON THE BOARD. '
DC CL62'ASSUMING THAT IT DID FIT, THERE IS STILL ONE POSSIBLE '
DC CL62'PROBLEM, THE PIECE MIGHT HANG OFF THE EDGE OF THE BOARD. '
DC CL62'WHILE THIS IS EASILY APPARENT VISUALLY, IT TAKES A LITTLE '
DC CL62'LONGER IN THE PROGRAM. THE BIT PATTERN FOR THE PIECE IN THE '
DC CL62'LOCATION IT IS TO BE USED, IS TESTED TO DETERMINE IF IT IS '
DC CL62'ADJCENT TO THE LEFT EDGE, AND THEN THE RIGHT EDGE. IF THE '
DC CL62'PIECE TOUCHES BOTH EDGES, IT MUST HANG OFF THE EDGE OF THE '
DC CL62'BOARD, SINCE NO PIECE IS BIG ENOUGH TO BE ADJCENT TO BOTH '
DC CL62'EDGES SIMULTANEOUSLY. ALSO, DURING THE INITIAL SET UP, THE '
DC CL62'HIGHEST LOCATION EACH PIECE CAN OCCUPY IS DETERMINED, AND '
DC CL62'NO PIECE IS ATTEMPTED TO BE USED IN SUCH A FASION THAT IT '
DC CL62'HANGS OVER THE TOP OF THE BOARD. '
DC CL62' AS PIECES ARE ADDED TO THE BOARD, THEY ARE MARKED AS USED '
DC CL62'AND ARE NOT USED AGAIN. AS THE BOARD IS FILLED UP, IT '
DC CL62'OFTEN HAPPENS THAT THE REMAINING PIECES WON''T FIT IN THE '
DC CL62'SPACE LEFT. WHEN THAT HAPPENS THE LAST PIECE INSERTED IS '
DC CL62'REMOVED, BY (A) TURNING OFF THE BITS FOR THE POSITION THE '
DC CL62'PIECE OCCUPIED, AND (B) MARKING THE PIECE USEABLE AGAIN. '
DC CL62' MARKING THE PIECE USABLE OR UNUSEABLE, AND KEEPING TRACK '
DC CL62'OF WHICH PIECES HAVE BEEN USED WHERE IS THE FUNCTION OF THE '
DC CL62'INDEX TABLE. THE 12 MAJOR ENTRIES DEFINE THE ORDER THAT '
DC CL62'PIECES WERE PUT ON THE BOARD (IE. THE FIRST ENTRY TELLS '
DC CL62'WHICH PIECE WAS PLACED ON THE BOARD FIRST, THE SECOND ENTRY '
DC CL62'THE SECOND PIECE, ETC.). EACH INDEX TABLE ENTRY POINTS TO '
DC CL62'A PIECE TABLE ENTRY. THE PROGRAM WORKS THRU THE INDEX '
DC CL62'TABLE TO TRY TO ADD PIECES TO THE PUZZLE. WHEN A PIECE IS '
DC CL62'FOUND TO NOT FIT, THE ENTRY FOR IT IS SWAPPED IN THE INDEX '
DC CL62'TABLE. THE SWAPPING LOGIC INSURES THAT ALL OF THE PIECES '
DC CL62'ARE TRIED IN ALL POSSIBLE POSITIONS. THIS IS ACCOMPLISHED '
DC CL62'BY TRYING PIECES IN EVERY POSSIBLE ORDER, WHICH IS DONE BY '
DC CL62'USING A TRIPLE LOOP. WITHIN THE 2 OUTER LOOPS, THE '
DC CL62'ADDRESSES IN THE INDEX TABLE ARE SWAPPED, AND THE INNER '
DC CL62'LOOP RUNS THRU THE VARIOUS ROTATIONS OF EACH PIECE. THE '
DC CL62'SWAPPING LOGIC IS, IN THE OUTER LOOP, EACH PIECE IS SWAPEDD '
DC CL62'WITH THE FIRST PIECE. THE NEXT LOOP CAUSES EACH PIECE TO '
DC CL62'THE RIGHT OF THE PIECE IN LOOP 1 TO BE SWAPPED WITH IT. '
DC CL62'AFTER EACH SWAP, PIECES ARE TESTED TO DETERMINE IF THEY FIT '
DC CL62'INTO THE PUZZLE. THE SWAPPING IS ONLY DONE WHEN PIECES ARE '
DC CL62'NOT IN THE CURRENT SOLUTION. '
DC CL62'THIS PROGRAM EXECUTED IN 22 MINUTES ON THE IBM-370(195), '
DC CL62'23 MINUTES ON AN IBM 370(168 MOD3), 11 MINUTES ON A 3033, '
DC CL62'6 1/4 MINUTES ON A 3081 AND 3 1/2 MINUTES ON A 3090. '
DC CL62' '
DC CL62'THE PARM FIELDS THAT CAN BE SPECIFIED ARE, '
DC CL62'PARM=NODOC SURPRESSES THIS PROGRAM DESCRIPTION. '
DC CL62'PARM=ESTAE INTERCEPTS ABENDS, PRINTS THE ABEND CODE, '
DC CL62' NEXT INSTRUCTION ADDRESS, AND REGISTERS. '
DC CL62'PARM=CHECK CAUSES THE ROUTINE TO CHECK FOR DUPLICATE '
DC CL62' SOLUTIONS TO BE EXECUTED. '
DC CL62'PARM=NOWTO SUPRESSES THE WTO NOTIFICATION TO THE OPERATOR '
DC CL62' WHICH INDICATE HOW FAR ALONG IN THE PROCESS '
DC CL62' WE ARE. '
DC CL62'SKIPCOL=30 NONE BLANK IN COL-30 SHOULD BE SKIPPED. '
DC CL62' 30,31,32 IN COLS 30,31,32 SHOULD BE SKIPPED. '
DC CL62' '
*DC CL62' - - '
BYLINE DC CL62'DESIGNED AND WRITTEN BY ALPHRED E. NEWMAN'
DC CL62' '
ENDDOC EQU *
DCBD DSORG=PS,DEVD=DA
IHASDWA
END