mirror of
https://github.com/moshix/mvs.git
synced 2026-01-11 23:43:00 +00:00
203 lines
7.6 KiB
Plaintext
203 lines
7.6 KiB
Plaintext
//HERC01 JOB 1,CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1),
|
|
// TIME=1440,REGION=2048K
|
|
//* EXECUTE ASMH ASSEMBLER, LINK AND GO
|
|
//* MOSHIX (C) 2021
|
|
//* THIS IS THE ASM H VERSION,
|
|
//* BUT WORKS JUST THE SAME ON FX ASSEMBLER
|
|
//* NOTICE THAT THIS BACKTRACKING ALGORITHM
|
|
//* IS NOT ANY FASTER IN ASSEMBLER THAN IN FORTRAN OR PL1
|
|
//ASMH EXEC PGM=IEV90,REGION=2048K
|
|
//**EPLIB DD DSN=SYS1.ASMH.LOADLIB,DISP=SHR
|
|
//SYSLIB DD DSN=SYS1.AMODGEN,DISP=SHR
|
|
// DD DSN=SYS1.MACLIB,DISP=SHR
|
|
//SYSUT1 DD DSN=&&SYSUT1,UNIT=SYSDA,SPACE=(1700,(600,100))
|
|
//SYSUT2 DD DSN=&&SYSUT2,UNIT=SYSDA,SPACE=(1700,(300,50))
|
|
//SYSUT3 DD DSN=&&SYSUT3,UNIT=SYSDA,SPACE=(1700,(300,50))
|
|
//SYSPRINT DD SYSOUT=*,DCB=BLKSIZE=1089
|
|
//SYSPUNCH DD SYSOUT=B
|
|
//SYSLIN DD DSN=&&LOADSET,DISP=(,PASS),UNIT=SYSDA,
|
|
// SPACE=(3120,(50,20)),DCB=LRECL=80
|
|
//SYSIN DD *
|
|
MACRO
|
|
&LAB XDECO ®,&TARGET
|
|
&LAB B I&SYSNDX BRANCH AROUND WORK AREA
|
|
P&SYSNDX DS 0D,PL8 PACKED
|
|
W&SYSNDX DS CL13 CHAR
|
|
I&SYSNDX CVD ®,P&SYSNDX CONVERT TO DECIMAL
|
|
MVC W&SYSNDX,=X'40202020202020202020212060' NICE MASK
|
|
LA R1,W&SYSNDX+7
|
|
EDMK W&SYSNDX,P&SYSNDX+2 EDIT AND MARK
|
|
BCTR R1,0 LOCATE THE RIGHT PLACE
|
|
MVC 0(1,R1),W&SYSNDX+12 MOVE THE SIGN
|
|
MVC &TARGET.(12),W&SYSNDX MOVE TO TARGET
|
|
MEND
|
|
*
|
|
PRINT GEN
|
|
NQUEENS CSECT
|
|
SAVE (14,12) SAVE REGISTERS ON ENTRY
|
|
BALR R12,0 ESTABLISH ADDRESSABILITY
|
|
USING *,R12 SET BASE REGISTER
|
|
ST R13,SAVEA+4 LINK MYSA->PREVSA
|
|
LA R11,SAVEA MYSA
|
|
ST R11,8(R13) LINK PREVSA->MYSA
|
|
LR R13,R11 SET MYSA POINTER
|
|
LA R7,LL L
|
|
LA R6,1 I=1
|
|
OPENEM OPEN (OUTDCB,OUTPUT) OPEN THE PRINTER FILE
|
|
*
|
|
TITLE PUT OUTDCB,TITLEL PRINT TITLE LINE
|
|
XDECO R7,SOLNR+13
|
|
TOTAL PUT OUTDCB,SOLNR
|
|
*
|
|
LOOPI LR R1,R6 DO I=1 TO L
|
|
SLA R1,1 I*2
|
|
STH R6,A-2(R1) A(I)=I
|
|
LA R6,1(R6) I=I+1
|
|
BCT R7,LOOPI LOOP DO I
|
|
*
|
|
STRT LA R9,1 N=1 START OF LOOP
|
|
LOOPN CH R9,L DO N=1 TO L
|
|
BH ELOOPN IF N>L THEN EXIT LOOP
|
|
SR R8,R8 M=0
|
|
LA R10,1 I=1
|
|
LR R5,R9 N
|
|
SLA R5,1 N*2
|
|
BCTR R5,0 R=2*N-1
|
|
E40 CR R10,R9 IF I>N
|
|
BH E80 THEN GOTO E80
|
|
LR R11,R10 J=I
|
|
E50 LR R1,R10 I
|
|
SLA R1,1 I*2
|
|
LA R6,A-2(R1) R6=@A(I)
|
|
LR R1,R11 J
|
|
SLA R1,1 J*2
|
|
LA R7,A-2(R1) R7=@A(J)
|
|
MVC Z,0(R6) Z=A(I)
|
|
MVC Y,0(R7) Y=A(J)
|
|
LR R3,R10 I
|
|
SH R3,Y -Y
|
|
AR R3,R9 P=I-Y+N
|
|
LR R4,R10 I
|
|
AH R4,Y +Y
|
|
BCTR R4,0 Q=I+Y-1
|
|
MVC 0(2,R6),Y A(I)=Y
|
|
MVC 0(2,R7),Z A(J)=Z
|
|
LR R1,R3 P
|
|
SLA R1,1 P*2
|
|
LH R2,U-2(R1) U(P)
|
|
LTR R2,R2 IF U(P)<>0
|
|
BNE E60 THEN GOTO E60
|
|
LR R1,R4 Q
|
|
AR R1,R5 Q+R
|
|
SLA R1,1 (Q+R)*2
|
|
LH R2,U-2(R1) U(Q+R)
|
|
C R2,=F'0' IF U(Q+R)<>0
|
|
BNE E60 THEN GOTO E60
|
|
LR R1,R10 I
|
|
SLA R1,1 I*2
|
|
STH R11,S-2(R1) S(I)=J
|
|
LA R0,1 R0=1
|
|
LR R1,R3 P
|
|
SLA R1,1 P*2
|
|
STH R0,U-2(R1) U(P)=1
|
|
LR R1,R4 Q
|
|
AR R1,R5 Q+R
|
|
SLA R1,1 (Q+R)*2
|
|
STH R0,U-2(R1) U(Q+R)=1
|
|
LA R10,1(R10) I=I+1
|
|
B E40 GOTO E40
|
|
E60 LA R11,1(R11) J=J+1
|
|
CR R11,R9 IF J<=N
|
|
BNH E50 THEN GOTO E50
|
|
E70 BCTR R11,0 J=J-1
|
|
CR R11,R10 IF J=I
|
|
BE E90 GOTO E90
|
|
LR R1,R10 I
|
|
SLA R1,1 I*2
|
|
LA R6,A-2(R1) R6=@A(I)
|
|
LR R1,R11 J
|
|
SLA R1,1 J*2
|
|
LA R7,A-2(R1) R7=@A(J)
|
|
MVC Z,0(R6) Z=A(I)
|
|
MVC 0(2,R6),0(R7) A(I)=A(J)
|
|
MVC 0(2,R7),Z A(J)=Z;
|
|
B E70 GOTO E70
|
|
E80 LA R8,1(R8) M=M+1
|
|
E90 BCTR R10,0 I=I-1
|
|
LTR R10,R10 IF I=0
|
|
BZ ZERO THEN GOTO ZERO
|
|
LR R1,R10 I
|
|
SLA R1,1 I*2
|
|
LH R2,A-2(R1) R2=A(I)
|
|
LR R3,R10 I
|
|
SR R3,R2 -A(I)
|
|
AR R3,R9 P=I-A(I)+N
|
|
LR R4,R10 I
|
|
AR R4,R2 +A(I)
|
|
BCTR R4,0 Q=I+A(I)-1
|
|
LR R1,R10 I
|
|
SLA R1,1 I*2
|
|
LH R11,S-2(R1) J=S(I)
|
|
LA R0,0 R0=0
|
|
LR R1,R3 P
|
|
SLA R1,1 P*2
|
|
STH R0,U-2(R1) U(P)=0
|
|
LR R1,R4 Q
|
|
AR R1,R5 Q+R
|
|
SLA R1,1 (Q+R)*2
|
|
STH R0,U-2(R1) U(Q+R)=0
|
|
B E60 GOTO E60
|
|
ZERO XDECO R9,PG+0 EDIT N
|
|
XDECO R8,PG+12 EDIT M
|
|
PUT OUTDCB,PG PRINT BUFFER
|
|
LA R9,1(R9) N=N+1
|
|
B LOOPN LOOP DO N
|
|
ELOOPN CLOSE (OUTDCB) CLOSE OUTPUT
|
|
L R13,SAVEA+4 PREVIOUS SAVE AREA ADDRS
|
|
RETURN (14,12),RC=0 RETURN TO CALLER WITH RC=0
|
|
LTORG
|
|
SAVEA DS 18F SAVE AREA FOR CHAINING
|
|
OUTDCB DCB DSORG=PS,MACRF=PM,DDNAME=OUTDD USE OUTDD IN JCL
|
|
LL EQU 11 LL<=16
|
|
L DC AL2(LL) INPUT VALUE
|
|
A DS (LL)H
|
|
S DS (LL)H
|
|
Z DS H
|
|
Y DS H
|
|
TITLEL DC CL36'1 N QUEENS SOLVER - MOSHIX DEC 2021'
|
|
PRTLINE DC CL133' '
|
|
SOLNR DC CL19'1 MAX NXN: '
|
|
PRTLINE2 DC CL133' '
|
|
PG DS CL20 BUFFER
|
|
U DC (4*LL-2)H'0' STACK
|
|
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 NQUEENS
|
|
/*
|
|
//LKED EXEC PGM=IEWL,PARM=(LET,LIST,MAP),COND=(4,LT,ASMH)
|
|
//SYSPRINT DD SYSOUT=*
|
|
//SYSLMOD DD DSN=&&GOSET(GO),DISP=(,PASS),UNIT=SYSDA,
|
|
// SPACE=(6144,(50,20,1)),DCB=RECFM=U
|
|
//SYSUT1 DD UNIT=SYSDA,SPACE=(1024,(50,20))
|
|
//SYSLIN DD DSN=&&LOADSET,DISP=(OLD,PASS)
|
|
//*
|
|
//GO EXEC PGM=*.LKED.SYSLMOD,COND=(4,LT,ASMH)
|
|
//GO.OUTDD DD SYSOUT=*,LRECL=121,RECFM=FBA
|
|
//GO.SYSPRINT DD SYSOUT=*
|
|
//GO.SYSABEND DD SYSOUT=*
|
|
//
|