perm filename JOTTO[CSP,SYS] blob sn#013348 filedate 1973-06-17 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00021 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	TITLE JOTTO HACK
C00005 00003	BEG0:	MOVEI P,PDL-1
C00007 00004	BEG8:	EXCH B,C
C00009 00005	DTOD12:	CLEARB T,U	DICT TO DICT1, DICT2 FORMAT, ARGUMENT IN B
C00010 00006	TURNT:	TROE T,1	A
C00012 00007	STREWA:	LSHC A1,-=24
C00014 00008	GJOTS:	MOVEM SAVEAC	GET JOTS OF ALL POSITIVE WORDS WITH RESPECT TO DICT(A)
C00018 00009	CODE0:	MOVEI B,0	ABCDE
C00020 00010	CODE4:	MOVEI B,0	ABBCC
C00021 00011	CODE5:	MOVEI B,0	AABBB
C00023 00012	D12TOD:	MOVEI C,0	DICT1, DICT2 TO DICT FORMAT, POINTER IN A
C00024 00013	EOF:	CLOSE UTICHN,
C00029 00014	YORN:	INCHRW A
C00031 00015	SETUP5:	SKIPN CWTOT
C00032 00016	FIND3:	PUSHJ P,RANDOM	GET A WORD IN PERMUTATION GROUP
C00034 00017	FINOK3:	HRRM A,SETUP7	GOT 0-4 JOTS, SO WEED DICTIONARY
C00035 00018	DEFINE FOO ! (Z1,Z2)
C00037 00019	LN:	MOVSI A,(-1.0)	NATURAL LOG OF T>0
C00038 00020	STYP:	POP P,U
C00039 00021	IHD:	BLOCK 3
C00041 ENDMK
C⊗;
TITLE JOTTO HACK
A←1
B←2
C←3
D←4
E←5

A1←←5
A2←←A1+1
A3←←A2+1
A4←←A3+1
A5←←A4+1
B1←←A5+1
B2←←B1+1
B3←←B2+1
B4←←B3+1
B5←←B4+1

R←7
S←10
T←11
U←12
P←17

UTICHN←←3
PDLL←←20

EXTERNAL JOBFF

LOC 124
JRST BEG0
RELOC

DEFINE NOECHO
{	PTYUUO 16,[0↔3]	}

OPDEF CLEAR[SETZ]
OPDEF CLEARM[SETZM]
OPDEF CLEARB[SETZB]

;UUO'S FOR RANDOM NUMBER GEN
OPDEF .RDATE[CALLI 14]
OPDEF .RDTIM[CALLI 23]
OPDEF .SUSET[CALLI 27]
OPDEF .RTIME[CALLI 22]

DEFINE FIX(X)
<	MULI X,400
	TSC X,X
	ASH X+1,-243(X)
>

DEFINE FLOAT(X)
<	TLC X,232000
	FADR X,X
>

DEFINE BARF ! (A)
<	MOVE R,[440700,,[ASCII \A!$\]]
	PUSHJ P,TYPMES
>

DEFINE TYPE ! (A)
<	MOVE R,[440700,,[ASCII \A!$\]]
	PUSHJ P,STRTYP
>
BEG0:	MOVEI P,PDL-1
	PUSHJ P,CRLF
	BARF (READ NEW DICTIONARY?)
BEG1:	INCHRW A
	PUSHJ P,CRLF
	CAIE A,"Y"
	CAIN A,"y"
	CAIA
	JRST BEG
IFN 0,<
	BARF [FILE NAME?]
	MOVE B,[SIXBIT \@\]
	MOVE C,B
	MOVE D,[440600,,B]
BEG2:	.IOT TYICHN,A	;INPUT FIRST FILE NAME
	.IOT TYOCHN,A
	CAIN A,177	;RUBOUT
	JRST BEG0
	CAIN A,15
	JRST BEG8
	CAIN A,40
	JRST BEG4
	SUBI A,40
	IDPB A,D
	CAME D,[600,,B]
	JRST BEG2
BEG3:	.IOT TYICHN,A	;WAIT FOR FINISH OF FIRST FILE NAME
	CAIN A,177	;RUBOUT
	JRST BEG0
	CAIN A,15
	JRST BEG8
	CAIE A,40
	JRST BEG3
	.IOT TYOCHN,A
BEG4:	MOVE D,[440600,,C]
BEG5:	.IOT TYICHN,A	;INPUT SECOND FILE NAME
	.IOT TYOCHN,A
	CAIN A,177	;RUBOUT
	JRST BEG0
	CAIN A,15
	JRST BEG7
	CAIN A,40
	JRST BEG7
	SUBI A,40
	IDPB A,D
	CAME D,[600,,C]
	JRST BEG5
BEG6:	.IOT TYICHN,A	;WAIT FOR FINISH OF SECOND FILE NAME
	CAIN A,177	;RUBOUT
	JRST BEG0
	CAIN A,15
	JRST BEG7
	CAIE A,40
	JRST BEG6
	JRST BEG7
BEG8:	EXCH B,C
BEG7:	PUSHJ P,CRLF
	MOVE A,UTOPEN	;FILE NAMES COMPLETE
	.OPEN UTICHN,A
	JRST BEG0
>;END IFN 0
	CLEAR A,
	MOVSI B,'DSK'
	MOVEI C,IHD
	OPEN UTICHN,A
	JRST [	BARF(CAN'T GET DISK.)
		JRST BEG0]
	MOVEI A,IBUF
	EXCH A,JOBFF
	INBUF UTICHN,2
	MOVEM A,JOBFF
	MOVE A,['JOTTO ']
	MOVSI B,'DIC'
	CLEARB C,D
	LOOKUP UTICHN,A
	JRST [	BARF(CAN'T LOOKUP JOTTO.DIC.)
		JRST BEG0]
	CLEARM CWORDS
	MOVEI D,0
READ:	MOVEI C,5
	MOVEI B,0
READ1:	PUSHJ P,GETDIC
	CAIN A,14	;FF
	JRST READ1
	CAIN A,3
	JRST EOF
	JUMPL A,EOF
	CAIL A,"A"
	CAILE A,"Z"
	JRST BARF1
	SUBI A,40
	LSH B,6
	IOR B,A
	SOJG C,READ1
	PUSHJ P,GETDIC
	CAIE A,"-"
	JRST READ2
	AOS CWORDS
	TLO B,200000
	PUSHJ P,GETDIC
READ2:	MOVEM B,DICT(D)
	PUSHJ P,DTOD12
	MOVEM T,DICT1(D)
	MOVEM U,DICT2(D)
	AOS D
	CAIE A,15	;CR
	JRST BARF2
	PUSHJ P,GETDIC
	CAIN A,12	;LF
	JRST READ
BARF2:	BARF (WORD ENDED IMPROPERLY)
	JRST BARF0

BARF1:	BARF (NON-ALPHABETIC CHARACTER IN WORD)
BARF0:	PUSHJ P,TYPWRD
	PUSHJ P,CRLF
	JRST 4,.

SKPLIN:	MOVNI A,5
	ADDM A,IHD+2
	AOS IHD+1
GETDIC:	SOSG IHD+2
	IN UTICHN,
	CAIA
	JRST [	SETO A,		;SET END OF FILE
		POPJ P,]
	IBP IHD+1
	MOVE A,@IHD+1
	TRNE A,1		;LINE #?
	JRST SKPLIN
	LDB A,IHD+1
	POPJ P,
DTOD12:	CLEARB T,U	;DICT TO DICT1, DICT2 FORMAT, ARGUMENT IN B
	MOVSI E,-5	;RETURN IN T & U, CLOBRS B, C, E, A1, T, U
DD12A:	LSHC B,-6
	LSH C,-36
	XCT TURNT-41(C)
	JRST DD12C
DD12B:	AOBJN E,DD12A
	TLNE T,3400
	ADD T,[400,,0]
	POPJ P,

DD12C:	ADD T,[400,,0]
	XCT TURNU-41(C)
	JRST DD12B
	SUBI C,40
	DPB C,[320500,,U]
	JRST DD12B
TURNT:	TROE T,1	;A
	TROE T,2	;B
	TROE T,4	;C
	TROE T,10	;D
	TROE T,20	;E
	TROE T,40	;F
	TROE T,100	;G
	TROE T,200	;H
	TROE T,400	;I
	TROE T,1000	;J
	TROE T,2000	;K
	TROE T,4000	;L
	TROE T,10000	;M
	TROE T,20000	;N
	TROE T,40000	;O
	TROE T,100000	;P
	TROE T,200000	;Q
	TROE T,400000	;R
	TLOE T,1	;S
	TLOE T,2	;T
	TLOE T,4	;U
	TLOE T,10	;V
	TLOE T,20	;W
	TLOE T,40	;X
	TLOE T,100	;Y
	TLOE T,200	;Z

TURNU:	TRON U,1	;A
	TRON U,2	;B
	TRON U,4	;C
	TRON U,10	;D
	TRON U,20	;E
	TRON U,40	;F
	TRON U,100	;G
	TRON U,200	;H
	TRON U,400	;I
	TRON U,1000	;J
	TRON U,2000	;K
	TRON U,4000	;L
	TRON U,10000	;M
	TRON U,20000	;N
	TRON U,40000	;O
	TRON U,100000	;P
	TRON U,200000	;Q
	TRON U,400000	;R
	TLON U,1	;S
	TLON U,2	;T
	TLON U,4	;U
	TLON U,10	;V
	TLON U,20	;W
	TLON U,40	;X
	TLON U,100	;Y
	TLON U,200	;Z
STREWA:	LSHC A1,-=24
	LSHC A2,-=30
	LSHC A3,-=30
	LSHC A4,-=30
	LSH A5,-=30
	POPJ P,

GETJOT:	LSHC B1,-=24
	LSHC B2,-=30
	LSHC B3,-=30
	LSHC B4,-=30
	LSH B5,-=30
GETJ1:	CAMN A1,B1	;TRY TO MATCH A1 AGAINST B'S
	AOBJP B1,A1DUN1
	CAMN A1,B2
	AOBJP B2,A1DUN
	CAMN A1,B3
	AOBJP B3,A1DUN
	CAMN A1,B4
	AOBJP B4,A1DUN
	CAMN A1,B5
	AOBJP B5,A1DUN
A1DUN:	CAMN A2,B1
	AOBJP B1,A2DUN1
A1DUN1:	CAMN A2,B2
	AOBJP B2,A2DUN
	CAMN A2,B3
	AOBJP B3,A2DUN
	CAMN A2,B4
	AOBJP B4,A2DUN
	CAMN A2,B5
	AOBJP B5,A2DUN
A2DUN:	CAMN A3,B1
	AOBJP B1,A3DUN1
A2DUN1:	CAMN A3,B2
	AOBJP B2,A3DUN
	CAMN A3,B3
	AOBJP B3,A3DUN
	CAMN A3,B4
	AOBJP B4,A3DUN
	CAMN A3,B5
	AOBJP B5,A3DUN
A3DUN:	CAMN A4,B1
	AOBJP B1,A4DUN1
A3DUN1:	CAMN A4,B2
	AOBJP B2,A4DUN
	CAMN A4,B3
	AOBJP B3,A4DUN
	CAMN A4,B4
	AOBJP B4,A4DUN
	CAMN A4,B5
	AOBJP B5,A4DUN
A4DUN:	CAMN A5,B1
	AOBJP B1,A5DUN
A4DUN1:	CAMN A5,B2
	AOBJP B2,A5DUN
	CAMN A5,B3
	AOBJP B3,A5DUN
	CAMN A5,B4
	AOBJP B4,A5DUN
	CAMN A5,B5
	AOBJP B5,A5DUN
A5DUN:	ADD B1,B2
	ADD B1,B3
	ADD B1,B4
	ADD B1,B5	;NUMBER OF JOTS IN L.H. OF B1
	HLRZS B1
	POPJ P,
GJOTS:	MOVEM SAVEAC	;GET JOTS OF ALL POSITIVE WORDS WITH RESPECT TO DICT(A)
	MOVE [1,,SAVEAC+1]
	BLT SAVEAC+17
	CLEARB B,LETRS
	MOVE C,[LETRS,,LETRS+1]
	BLT C,LETRS+=26-1
	MOVE A1,DICT(A)
	TLZ A1,770000
	PUSHJ P,STREWA
	AOS LETRS-41(A1)	;SIXBIT A = 41
	AOS LETRS-41(A2)
	AOS LETRS-41(A3)
	AOS LETRS-41(A4)
	AOS LETRS-41(A5)
	MOVSI A,-=26
	CLEARB E,JTEST4
GJOTS1:	MOVE C,LETRS(A)
	XCT GJOTS9(C)
GJOTS2:	AOBJN A,GJOTS1
	MOVE C,BLTAB1(B)
	BLT C,BLTLOC+47
	MOVSI A,-50
GJOTS5:	HLRZ C,BLTLOC(A)
	CAIE C,(<TRNE>)
	CAIN C,(<TRNN>)
	SKIPA
	JRST GJOTS7
	HRRZ C,BLTLOC(A)
	MOVE D,(C)
	TRNE D,777777
	JRST GJOTS6	;OK IF TESTING R.H.
	HLRZS D		;PUT TESTING BIT INTO R.H.
	HRLI D,(<<TRNE>≠<TLNE>>)	;CHANGE SKIP HALF-WORD
GJOTS6:	XOR D,C
	XORM D,BLTLOC(A)
GJOTS7:	AOBJN A,GJOTS5
;	MOVE A,[BLTLOC,,3]
;	BLT A,30
	MOVN A,CWTOT
	HRLZS A
	CLEARM JOTS0
	CLEARM JOTS1
	CLEARM JOTS2
	CLEARM JOTS3
	CLEARM JOTS4
	CLEARM JOTS5
	JRST 3+BLTLOC-3

GJOTS8:	MOVE 17,[SAVEAC,,0]
	BLT 17,17
	POPJ P,

GJOTS9:	JFCL
	JRST GJ3A	;SINGLE LETTER
	JRST GJ3B	;DOUBLE LETTER
	JRST GJ3C	;TRIPLE LETTER
	JRST 4,.	;ERROR, 4 LETTERS THE SAME
	JRST 4,.	;ERROR, 5 LETTERS THE SAME

GJ3A:	MOVE D,BITS(A)
	MOVEM D,JTEST1(E)
	AOJA E,GJOTS2

GJ3B:	ADDI B,2
	MOVE D,BITS(A)
	EXCH D,JTEST4
	JUMPE D,GJOTS2
	MOVEM D,JTEST5
	JRST GJOTS2

GJ3C:	ADDI B,3
	MOVE D,BITS(A)
	MOVEM D,JTEST5
	JRST GJOTS2

SAVEAC:	BLOCK 20
JTEST:	0	;TRIPLE LETTER
JTEST1:	0	;FIRST
JTEST2:	0	;SECOND
JTEST3:	0	;THIRD
JTEST4:	0	;FOURTH
JTEST5:	0	;FIFTH
BLTLOC:	BLOCK 50
BLTAB1:	CODE0,,BLTLOC
	0
	CODE2,,BLTLOC
	CODE3,,BLTLOC
	CODE4,,BLTLOC
	CODE5,,BLTLOC

LETRS:	BLOCK =26
BITS:	1	;A
	2	;B
	4	;C
	10	;D
	20	;E
	40	;F
	100	;G
	200	;H
	400	;I
	1000	;J
	2000	;K
	4000	;L
	10000	;M
	20000	;N
	40000	;O
	100000	;P
	200000	;Q
	400000	;R
	1,,0	;S
	2,,0	;T
	4,,0	;U
	10,,0	;V
	20,,0	;W
	40,,0	;X
	100,,0	;Y
	200,,0	;Z
CODE0:	MOVEI B,0	;ABCDE
	MOVE DICT1(A)
	TRNE JTEST1
	AOS B
	TRNE JTEST2
	AOS B
	TRNE JTEST3
	AOS B
	TRNE JTEST4
	AOS B
	TRNE JTEST5
	AOS B
	AOS JOTS0(B)
	AOBJN A,3+BLTLOC-3
	JRST GJOTS8

CODE2:	MOVEI B,0	;ABCDD
	MOVE DICT1(A)
	TRNE JTEST1
	AOS B
	TRNE JTEST2
	AOS B
	TRNE JTEST3
	AOS B
	TRNE JTEST4
	AOJA B,20+BLTLOC-3;TO CODE2A
	AOS JOTS0(B)
	AOBJN A,3+BLTLOC-3
	JRST GJOTS8

CODE2A:	MOVE DICT2(A)
	TRNE JTEST4
	AOJA B,15+BLTLOC-3
	JRST 15+BLTLOC-3

CODE3:	MOVEI B,0	;ABCCC
	MOVE DICT1(A)
	TRNE JTEST1
	AOS B
	TRNE JTEST2
	AOS B
	TRNE JTEST5
	AOJA B,16+BLTLOC-3	;TO CODE3A
	AOS JOTS0(B)
	AOBJN A,3+BLTLOC-3
	JRST GJOTS8

CODE3A:	MOVE DICT2(A)
	TRNN JTEST5
	JRST 13+BLTLOC-3
	AOS B
	LSH -=26
	CAMN JTEST
	AOJA B,13+BLTLOC-3
	JRST 13+BLTLOC-3
CODE4:	MOVEI B,0	;ABBCC
	MOVE DICT1(A)
	TRNE JTEST1
	AOS B
	TRNE JTEST4
	AOJA B,16+BLTLOC-3	;TO CODE4A
	TRNE JTEST5
	AOJA B,BLTLOC+CODE4C-CODE4	;TO CODE4C
	AOS JOTS0(B)
	AOBJN A,3+BLTLOC-3
	JRST GJOTS8

CODE4A:	TRNE JTEST5
	AOJA B,BLTLOC+CODE4B-CODE4	;TO CODE4B
	MOVE DICT2(A)
	TRNE JTEST4
	AOJA B,13+BLTLOC-3
	JRST 13+BLTLOC-3

CODE4B:	MOVE DICT2(A)
	TRNE JTEST4
	AOS B
	TRNE JTEST5
	AOJA B,13+BLTLOC-3
	JRST 13+BLTLOC-3

CODE4C:	MOVE DICT2(A)
	TRNE JTEST5
	AOJA B,13+BLTLOC-3
	JRST 13+BLTLOC-3
CODE5:	MOVEI B,0	;AABBB
	MOVE DICT1(A)
	TRNE JTEST4
	AOJA B,14+BLTLOC-3	;TO CODE5A
	TRNE JTEST5
	AOJA B,BLTLOC+CODE5C-CODE5	;TO CODE5C
	AOS JOTS0(B)
	AOBJN A,3+BLTLOC-3
	JRST GJOTS8

CODE5A:	TRNE JTEST5
	AOJA B,BLTLOC+CODE5B-CODE5	;TO CODE5B
	MOVE DICT2(A)
	TRNE JTEST4
	AOJA B,11+BLTLOC-3
	JRST 11+BLTLOC-3

CODE5B:	MOVE DICT2(A)
	TRNE JTEST4
	AOS B
	TRNN JTEST5
	JRST 11+BLTLOC-3
	AOS B
	LSH -=26
	CAMN JTEST
	AOJA B,11+BLTLOC-3
	JRST 11+BLTLOC-3

CODE5C:	MOVE DICT2(A)
	TRNN JTEST5
	JRST 11+BLTLOC-3
	AOS B
	LSH -=26
	CAMN JTEST
	AOJA B,11+BLTLOC-3
	JRST 11+BLTLOC-3

;0 HAS WORD TO T(R,L)N(E,N) AGAINST
;A HAS AOBJN INDEX INTO DICTIONARY
;B IS JOT COUNTER
;3 THRU 30 GET BLT-ED
D12TOD:	MOVEI C,0	;DICT1, DICT2 TO DICT FORMAT, POINTER IN A
	MOVE B,DICT1(A)	;RETURN IN B1-B5, CLOBBERS B, C, D, B1-B5
	TLZ B,777400
	MOVEI D,41	;SIXBIT A
D12A:	JUMPE B,D12C
	TRNN B,1
	JRST D12B
	MOVEM D,B1(C)
	AOS C
D12B:	LSH B,-1
	AOJA D,D12A

D12C:	MOVE B,DICT2(A)
	TLZ B,777400
	MOVEI D,41
D12D:	JUMPE B,D12F
	TRNN B,1
	JRST D12E
	MOVEM D,B1(C)
	AOS C
D12E:	LSH B,-1
	AOJA D,D12D

D12F:	LDB B,[320500,,DICT2(A)]
	SKIPE B
	MOVEI B5,40(B)
	POPJ P,

RANDOM:	MOVE T,RN2
	MUL T,RN1
	DIV T,[SETZ-37]
	MOVEM U,RN2
	POPJ P,		;RANDOMNESS IN T EXCEPT TOP FEW BITS

RN1:	11060471625
RN2:	0	;SET UP BY ERASE
EOF:	CLOSE UTICHN,
	BARF (#4. WORDS)
	MOVEM D,WTOT
	CALLI 12

BEG:	MOVEI P,PDL-1
	NOECHO
ERASE0:	BARF (JOT COMPUTATION IS 1-TO-1 LETTER MATCHING AND INDEPENDENT OF WHICH IS SECRET WORD.)
ERASE:	MOVEI B,0
	.RDATE B,	;READ DATE, SIXBIT YYMMDD
	.RDTIM A,	;READ SYSTEM TIME, 1/30 SECONDS
	XOR B,A
	.SUSET A,;[.RRUNT,,A]	;READ PROGRAM RUN TIME, 4.069 MICROSECONDS
	XOR B,A
	.RTIME A,	;READ TIME OF DAY, SIXBIT HHMMSS
	XOR B,A
	TLZ B,760000
	MOVEM B,RN2
	PUSHJ P,RANDOM
	MOVMS T
	IDIV T,CWORDS
	MOVEI A,0
ERASE2:	MOVE B,DICT(A)
	TLZN B,200000
	AOJA A,ERASE2
	AOS A
	SOJGE U,ERASE2	;U HAS HOW MANY TO SKIP OVER
	MOVEM B,SECRET
	SETOM JSOFAR
	CLEARM PWINS
	CLEARM PGFLAG
	CLEARM TSTWDS
	MOVE A,[TSTWDS,,TSTWDS+1]
	BLT A,TSTWDS+27
	MOVN A,WTOT
	MOVNM A,CWTOT
	HRLZ A,A
ERASE1:	MOVE B,DICT(A)
	PUSHJ P,DTOD12
	MOVEM T,DICT1(A)
	MOVEM U,DICT2(A)
	AOBJN A,ERASE1
	BARF (WOULD YOU LIKE TO GO FIRST?)
	PUSHJ P,YORN
	CAIE A,"Y"
	JRST FIND
SETUP:	PUSHJ P,CRLF
SETUP1:	NOECHO
	TYPE (YOUR TEST WORD: )
	PUSHJ P,GETWD
	JRST SETUP1	;RUBOUT OR ?N TYPED
	MOVN A,WTOT
	HRLZ A,A
SETUP3:	MOVE C,DICT(A)
	TLZ C,770000
	CAME B,C
	AOBJN A,SETUP3
	JUMPL A,SETUP4
	BARF (ARE YOU SURE THAT'S A WORD?)
	PUSHJ P,YORN
	CAIE A,"Y"
	JRST SETUP1
SETUP4:	CAMN B,SECRET
	JRST SETUP5
	MOVE A1,B
	PUSHJ P,STREWA
	MOVE B1,SECRET
	PUSHJ P,GETJOT
	MOVE A,B1
	PUSHJ P,TYPJTS
FIND:	SKIPN A,CWTOT	;FIND BEST TEST WORD
	JRST SETUP1	;NONE POSSIBLE
	SKIPE PGFLAG
	JRST FIND3
	CAIL A,=100
	JRST FIND1	;BEST IS PROBABLY PRESTORED
NOBOOK:	MOVE A,CWTOT
	FLOAT A
	MOVEM A,FWTOT
	CLEARM BESTE
	CLEARM DICTP1
SCAN1:	CLEARM JOTS0
	CLEARM JOTS1
	CLEARM JOTS2
	CLEARM JOTS3
	CLEARM JOTS4
	CLEARM JOTS5
	MOVE A,DICTP1
	MOVE B,DICT(A)
	TLNN B,200000
	JRST SAVEOK
	PUSHJ P,GJOTS
	MOVSI R,-6
	MOVEI S,0
FIG:	MOVE T,JOTS0(R)
	JUMPE T,FIG1
	FLOAT T
	FDVR T,FWTOT
	MOVEM T,JOTS0(R)
	PUSHJ P,LN
	FMPR D,JOTS0(R)
	FADR S,D
FIG1:	AOBJN R,FIG
	MOVE C,[-1.0]
	FDVR C,[0.6931471806]	;-1/LN 2 TO GET BITS EXPECTATION
	FMPR S,C
	MOVE C,DICTP1
	MOVE C,DICT(C)
	CAMG S,BESTE
	JRST SAVEOK
	MOVEM S,BESTE
	TLZ C,770000
	MOVEM C,BESTW
SAVEOK:	AOS A,DICTP1
	CAME A,WTOT
	JRST SCAN1
	MOVE B,BESTW
FINDOK:	TYPE (MY TEST WORD: )
	PUSHJ P,TYPWRD
	PUSHJ P,CRLF
FINOK1:	NOECHO
	INCHRW A
	CAIN A,"Y"
	JRST FINOK2
	CAIL A,"0"
	CAILE A,"5"
	JRST FINOK1
	SUBI A,"0"
	PUSHJ P,TYPJTS
	MOVE B,JSOFAR
	LSH B,3
	IOR B,A
	MOVEM B,JSOFAR
	LSH B,41
	IOR B,BESTW
	MOVEI C,0
	SKIPE TSTWDS(C)
	AOJA C,.-1
	MOVEM B,TSTWDS(C)
	CAIE A,5
	JRST FINOK3
	BARF (IS IT YOUR SECRET WORD?)
	PUSHJ P,YORN
	CAIE A,"N"
	JRST AIGOON
	MOVE A1,BESTW
	PUSHJ P,STREWA
FIN1A:	MOVN A,WTOT
	HRLZ A,A
	MOVEI B,0
FINOK4:	MOVE B1,DICT(A)
	TLZ B1,770000
	CAMN B1,BESTW
	JRST FINOK5
	PUSHJ P,GETJOT
	CAIE B1,5
	JRST FINOK5
	MOVE C,DICT(A)
	TLZ C,770000
	MOVEM C,SDICT(B)
	AOS B
FINOK5:	AOBJN A,FINOK4
	SKIPN B
	JRST GIVEUP	;HIS SECRET WORD IS PERMUTATION OF BESTW NOT IN DICT
	MOVEM B,PGFLAG
FINOK6:	SKIPN PWINS
	JRST SETUP1
	JRST FIND
YORN:	INCHRW A
	CAIL A,140
	SUBI A,40
	CAIN A,"N"
	JRST YORN1
	CAIN A,"Y"
	JRST YORN2
	JRST YORN

YORN1:	BARF (NO)
	POPJ P,

YORN2:	BARF (YES)
	POPJ P,

GETWD:	MOVEI B,0
	MOVEI C,5
GETWD1:	INCHRW A
	CAIN A,177	;RUBOUT
	POPJ P,
	CAIN A,"?"
	JRST LOSER1
	CAIL A,"A"
	CAILE A,"Z"
	JRST GETWD1
	OUTCHR A
	SUBI A,40
	LSH B,6
	IOR B,A
	SOJG C,GETWD1
	PUSHJ P,CRLF
	AOS (P)		;SKIP IF SUCCESSFUL
	POPJ P,

LOSER1:	PUSHJ P,CRLF	;CALLED ONLY FROM GETWD
	BARF (WANT TO GIVE UP?)
	PUSHJ P,YORN
	CAIE A,"Y"
	POPJ P,
	POP P,A		;REBALANCE P
TYPSEC:	TYPE (MY SECRET WORD IS )
	MOVE B,SECRET
	PUSHJ P,TYPWRD
	PUSHJ P,CRLF
	JRST ERASE
SETUP5:	SKIPN CWTOT
	JRST SETUP6
	BARF (<MOBY FOO, YOU WIN!  SHALL I KEEP GUESSING?>)
	PUSHJ P,YORN
	CAIE A,"Y"
	JRST ERASE
	SETOM PWINS
	JRST FIND

SETUP6:	BARF (<YES, THAT'S IT.>)
	JRST ERASE

FIND1:	SETOM A		;GET PRESTORED TEST WORD
	MOVE B,JSOFAR
FIND2:	AOS A
	SKIPN CHEAT(A)
	JRST NOBOOK	;DICT EXPANSION NECESSITATES END TEST
	CAME B,CHEAT(A)
	AOJA A,FIND2
	MOVE B,CHEAT+1(A)
	MOVEM B,BESTW
	JRST FINDOK

FINOK2:	PUSHJ P,YORN2
	JRST AIGOON

TYPJTS:	TYPE (  #1 JOT)
	MOVEI T,"S"
	CAIE A,1
	PUSHJ P,TYO
	PUSHJ P,CRLF
	POPJ P,
FIND3:	PUSHJ P,RANDOM	;GET A WORD IN PERMUTATION GROUP
	MOVMS T
	IDIV T,PGFLAG
	MOVE B,SDICT(U)
	MOVEM B,BESTW
	SOS A,PGFLAG
	ADDI U,SDICT
	HRLI U,1(U)
	SKIPE A
	BLT U,SDICT-1(A)
	TYPE (IS YOUR WORD )
	PUSHJ P,TYPWRD
	BARF (?)
	PUSHJ P,YORN
	CAIE A,"N"
	JRST AIGOON
	SKIPE PGFLAG
	JRST FINOK6
GIVEUP:	BARF (I GIVE UP.  WHAT WAS YOUR SECRET WORD?)
	PUSHJ P,GETWD
	JRST GIVEUP	;RUBOUT OR ?N TYPED
	MOVEI A,0
	MOVEM B,OPPSEC
CHECK:	SKIPN B1,TSTWDS(A)
	JRST NEWONE
	MOVE A1,OPPSEC
	PUSHJ P,STREWA
	TLZ B1,770000
	PUSHJ P,GETJOT
	LDB C,[410300,,TSTWDS(A)]
	CAMN C,B1
	AOJA A,CHECK
	TYPE (<GRUMBLE, GRUMBLE!  YOU GAVE ME #3 JOTS ON >)
	MOVE B,TSTWDS(A)
	PUSHJ P,TYPWRD
	MOVEI T,"!"
	PUSHJ P,TYO
	PUSHJ P,CRLF
NEWONE:	SKIPE TSTWDS(A)
	JRST AIGOON
	BARF (THAT'S A NEW ONE TO ME.)
AIGOON:	SKIPE PWINS	;ASK IF GO ON, UNLESS PERSON HAS ALREADY WON
	JRST ERASE
	CLEARM CWTOT
	BARF (DO YOU WANT TO TRY TO GUESS MY WORD?)
	PUSHJ P,YORN
	CAIE A,"Y"
	JRST TYPSEC
	JRST SETUP1
FINOK3:	HRRM A,SETUP7	;GOT 0-4 JOTS, SO WEED DICTIONARY
	MOVE A1,BESTW
	PUSHJ P,STREWA
	MOVN A,CWTOT
	HRLZ A,A
	CLEARM CWTOT
SETUP8:	PUSHJ P,D12TOD
	PUSHJ P,GETJ1
SETUP7:	CAIE B1,.
	JRST SETUP9
	AOS B,CWTOT
	MOVE C,DICT1(A)
	MOVEM C,DICT1-1(B)
	MOVE C,DICT2(A)
	MOVEM C,DICT2-1(B)
SETUP9:	AOBJN A,SETUP8
	SKIPN A,CWTOT
	JRST GIVEUP
	CAIL A,20
	JRST FINOK6
	MOVNS A
	HRLZS A
	MOVE B,DICT1(A)
	MOVE C,DICT2(A)
FIN3A:	CAME B,DICT1(A)	;CHECK IF ONLY A PERMUTATION GROUP REMAINS
	JRST FINOK6
	CAME C,DICT2(A)
	JRST FINOK6
	AOBJN A,FIN3A
	MOVEI A,0
	PUSHJ P,D12TOD
	MOVE A,[B1,,A1]
	BLT A,A5
	JRST FIN1A
DEFINE FOO ! (Z1,Z2)
{
XXX←←-1
FOR I ε{Z2}
<
XXX←←<XXX⊗3>
>
YYY←0
IFDIF{Z2}{}{YYY←Z2}
	XXX+YYY
	SIXBIT / !Z1/
}

CHEAT:	FOO TEARS
	FOO CHINK,0
	FOO IMPLY,01
	FOO DYING,02
	FOO DEIGN,1
	FOO SPOOL,10
	FOO CHUMS,101
	FOO CULLS,102
	FOO SPILL,11
	FOO CROON,110
	FOO BONUS,111
	FOO PITCH,112
	FOO MODEL,12
	FOO LONGS,121
	FOO DIALS,122
	FOO LOVED,13
	FOO DINER,2
	FOO FLOUT,20
	FOO LAMPS,201
	FOO SHOOS,202
	FOO SLEEP,21
	FOO BROOM,210
	FOO SUITS,211
	FOO SWANK,2111
	FOO LEACH,212
	FOO SILKS,2121
	FOO SOUPS,213
	FOO SNAIL,22
	FOO PORCH,220
	FOO WEEDS,221
	FOO OPENS,222
	FOO VISES,2222
	FOO LARGE,223
	FOO SNAIL,23
	FOO FIRRY,231
	FOO NOMAD,232
	FOO HOIST,3
	FOO CLUNG,30
	FOO SLAPS,31
	FOO REEDS,311
	FOO DRUGS,312
	FOO VALET,313
	FOO HIRED,32
	FOO STEEL,321
	FOO HAILS,322
	FOO PRINT,323
	FOO ROACH,33
	FOO PARCH,4
	FOO PITCH,42
	0
LN:	MOVSI A,(-1.0)	;NATURAL LOG OF T>0
	FADR A,T
	MOVSI B,(1.0)
	FADR B,T
	FDVRB A,B
	MOVSI C,(1.0)
	MOVE D,A
	MOVEI E,0
	FMPR A,A
LN1:	FADR D,E
	FADR C,[2.0]
	FMPR B,A
	MOVE E,B
	FDVR E,C
	CAMGE E,[-0.0001]	;TEST GOOD ONLY FOR T<1
	JRST LN1
	FADR D,E
	FSC D,1
	POPJ P,

TYPWRD:	PUSH P,A
	MOVE A,[360600,,B]
TYPWD1:	ILDB T,A
	ADDI T,40
	PUSHJ P,TYO
	TLNE A,770000
	JRST TYPWD1
	POP P,A
	POPJ P,
STYP:	POP P,U
STRTYP:	ILDB T,R	;START TYPING A MESSAGE
	CAIN T,"$"	;SIGNALS END OF CHARACTER STRING
	POPJ P,
	CAIN T,"#"	;SIGNALS PLACE TO OUTPUT A VARIABLE NUMBER
	JRST ACNUM
	PUSHJ P,TYO
	JRST STRTYP

TYPMES:	PUSHJ P,STRTYP
	JRST CRLF

CRLF:	MOVEI T,15	;CARRIAGE RETURN
	PUSHJ P,TYO
	MOVEI T,12	;LINE FEED
TYO:	OUTCHR T
	POPJ P,

ACNUM:	PUSH P,U	;OUTPUT THE NUMBER IN AN AC
	PUSH P,[STYP]
	ILDB U,R	;PICK UP AC LOCATION
	MOVE T,-"0"(U)
ACN3:	LSHC T,-43
	LSH U,-1
	DIVI T,12
	HRLM U,(P)
	SKIPE T
	PUSHJ P,ACN3
	HLRZ T,(P)
	ADDI T,"0"
	JRST TYO
IHD:	BLOCK 3
IBUF:	BLOCK 210*2
WTOT:	0	;WORD TOTAL
CWTOT:	0	;CURRENT TOTAL OF WORDS STILL POSSIBLE
FWTOT:	0	;FLOATING CWTOT
CWORDS:	0	;TOTAL NUMBER OF COMMON WORDS
SECRET:	0	;SECRET WORD
JSOFAR:	0	;JOTS SO FAR
PWINS:	0	;-1 IF PERSON HAS WON
PGFLAG:	0	;NUMBER IN GROUP IF NARROWED DOWN TO PERMUTATION GROUP
DICTP1:	0
JOTS0:	0
JOTS1:	0
JOTS2:	0
JOTS3:	0
JOTS4:	0
JOTS5:	0

BESTE:	0	;BEST EXPECTATION
BESTW:	0	;BEST WORD
SDICT:	BLOCK 20	;FOR PERMUTATION GROUPS
TSTWDS:	BLOCK 30	;RECORD OF TEST WORDS OF PROGRAM
OPPSEC:	0	;SECRET WORD OF OPPONENT

PATCH:	BLOCK 100
PDL:	BLOCK PDLL

DICT:	BLOCK 16000
DICT1:	BLOCK 16000
DICT2:	BLOCK 16000

END BEG