Home » Archimedes archive » Acorn User » AU 1996-05.adf » Regulars » StarInfo/Whitehouse/!Hneftafl/Hneftafl

StarInfo/Whitehouse/!Hneftafl/Hneftafl

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » Archimedes archive » Acorn User » AU 1996-05.adf » Regulars
Filename: StarInfo/Whitehouse/!Hneftafl/Hneftafl
Read OK:
File size: 1D1C bytes
Load address: 0000
Exec address: 0000
File contents
   10REM hneftafl
   20REM Stuart Whitehouse
   30REM
   40REM This file has been written in an unnecessarily complex manner
   50REM This is in order to make the addition of a computer player possible
   60REM
   70DEFPROChnft_init
   80LOCAL x%
   90_blank%=0
  100_swede%=1
  110_muskovit%=2
  120_swedeking%=4:_king%=4
  130_campmuskovit%=8:_camp%=8
  140
  150DIM board% 104 : REM this is larger to allow saving of options from this mem
  160DIM grid% 90
  170FOR w%=0 TO 80:grid%?w%=0:NEXT
  180grid%?40=_king%
  190RESTORE+0:FOR w%=0 TO 15:READ x%:grid%?x%=_camp%:NEXT
  200DATA 3,4,5,13, 27,36,45,37, 35,44,53,43, 75,76,77,67
  210ENDPROC
  220:
  230DEFPROChnft_newgame
  240FOR w%=0 TO 80
  250CASE grid%?w% OF
  260WHEN _king% : board%?w%=_king%
  270WHEN _camp% : board%?w%=_muskovit%
  280OTHERWISE : board%?w%=0
  290ENDCASE
  300NEXT
  310board%?22=_swede%:board%?31=_swede%:board%?49=_swede%:board%?58=_swede%
  320board%?38=_swede%:board%?39=_swede%:board%?41=_swede%:board%?42=_swede%
  330turn%=0
  340PROChnft_newturn
  350
  360PROCredrawboard
  370ENDPROC
  380:
  390DEFPROChnft_newturn
  400turn%+=1
  410to_play%=(2-(turn% AND 1))
  420PROCstatus
  430ENDPROC
  440:
  450:
  460DEFFNplayer(type%)
  470=((type% OR (type%>>>2)) AND 3)
  480:
  490:
  500:
  510:
  520DEFPROChnft_makemove(start_square%,square%)
  530LOCAL index%, ptr%, type%, k_found%,m_found%
  540
  550A%!vars_square1=start_square%
  560CALL generate_move_list
  570ptr%=list%
  580WHILE !ptr%>=0 AND match%=FALSE
  590IF !ptr%=square% THEN match%=TRUE
  600ptr%+=4
  610ENDWHILE
  620IF NOT match% THEN VDU7:ENDPROC
  630
  640type%=board%?start_square%
  650PROCsetsquare(start_square%,_blank%)
  660PROCsetsquare(square%,type%)
  670
  680REM ---  now test for winning and zapping
  690IF type%=_king% THEN
  700IF square%<9 OR square%>=72 THEN to_play%=-to_play%
  710w%=square% MOD 9
  720IF w%=0 OR w%=8 THEN to_play%=-to_play%
  730IF to_play%<0 THEN w%=FNgenalert("KING")
  740PROCstatus
  750ENDIF
  760IF to_play%<0 THEN ENDPROC
  770
  780A%!vars_square1=square%
  790CALL basic_test_for_zap,result%
  800WHILE result%>0
  810PROCsetsquare((result% AND &FF)-1,0)
  820result%=result%>>>8
  830ENDWHILE
  840
  850FOR index%=0 TO 80
  860CASE board%?index% OF
  870WHEN _king% : k_found%=TRUE
  880WHEN _muskovit% : m_found%=TRUE
  890ENDCASE
  900NEXT
  910IF k_found%=FALSE THEN w%=FNgenalert("KXXX"):to_play%=-_muskovit%
  920IF m_found%=FALSE THEN w%=FNgenalert("MXXX"):to_play%=-_swede%
  930IF to_play%<0 THEN PROCstatus:ENDPROC
  940
  950PROChnft_newturn
  960ENDPROC
  970
  980
  990
 1000
 1010
 1020
 1030
 1040
 1050
 1060
 1070
 1080
 1090REM the machine could have been far more simply written in BASIC.
 1100REM it has been done as armcode in case I wish to add a computer player.
 1110
 1120
 1130
 1140DEFPROCassem
 1150PROCgeneratezaptable
 1160
 1170DIM varmem 1024, list% 1024
 1180A%=varmem
 1190vars_board=0 : vars_grid=4 : vars_turn=8
 1200vars_square1=12 : vars_square2=16 : vars_listptr=20
 1210vars_zaptable=24
 1220
 1230A%!vars_board=board%
 1240A%!vars_grid=grid%
 1250A%!vars_listptr=list%
 1260A%!vars_zaptable=zaptable%
 1270
 1280
 1290
 1300stack=13:link=14:mainvars=12:boardptr=11:gridptr=10
 1310
 1320codesize%=2048:opt_max%=2
 1330DIM codemem codesize%
 1340FOR pass%=0 TO opt_max% STEP opt_max%
 1350P%=codemem
 1360L%=codemem+codesize%
 1370[OPT pass%+8
 1380
 1390.generate_move_list
 1400; gml
 1410STMFD (stack)!,{R0-R12,link}
 1420MOV mainvars,R0
 1430LDR boardptr,[mainvars,#vars_board]
 1440LDR gridptr,[mainvars,#vars_grid]
 1450
 1460LDR R9,[mainvars,#vars_listptr] ; R9 = listptr
 1470LDR R8,[mainvars,#vars_square1]  ; R8 = start_square
 1480LDRB R7,[gridptr,R8]
 1490CMPS R7,#_camp%
 1500LDRNEB R7,[boardptr,R8]  ; R7 = move type
 1510
 1520MOV R6,R8
 1530.gml_makex_loop
 1540CMPS R6,#9:SUBGE R6,R6,#9:BGT gml_makex_loop ;   R6 = x coord
 1550
 1560MOV R4,#1:MOV R5,#0:BL gml_generate
 1570MVN R4,#0:MOV R5,#0:BL gml_generate
 1580MOV R4,#0:MOV R5,#9:BL gml_generate
 1590MOV R4,#0:MVN R5,#8:BL gml_generate
 1600; that's all!
 1610MVN R0,#0:STR R0,[R9],#4 ; add terminator to list
 1620
 1630LDMFD (stack)!,{R0-R12,PC}
 1640
 1650
 1660.gml_generate
 1670STMFD (stack)!,{R6,R8,link}
 1680
 1690.gml_mainloop
 1700ADD R8,R8,R4:ADD R8,R8,R5
 1710ADD R6,R6,R4
 1720
 1730; now test validity
 1740RSBS R0,R8,#0:CMPLES R8,#80:BGT gml_stop
 1750RSBS R0,R6,#0:CMPLES R6,#8:BGT gml_stop    ;  fallen off board
 1760
 1770LDRB R0,[boardptr,R8]:CMPS R0,#0:BNE gml_stop ; piece in the way
 1780LDRB R0,[gridptr,R8]
 1790CMPS R0,#_king%:BEQ gml_stop ; no-one is allowed on the chief's square
 1800CMPS R0,#_camp%:BNE gml_ok
 1810; a camp square, only a muskovit camp piece is allowed onto it
 1820CMPS R7,#_camp%:BNE gml_stop
 1830.gml_ok
 1840
 1850; legal move
 1860STR R8,[R9],#4
 1870B gml_mainloop
 1880
 1890.gml_stop
 1900LDMFD (stack)!,{R6,R8,PC}
 1910
 1920
 1930
 1940
 1950
 1960.basic_test_for_zap
 1970STMFD (stack)!,{R0-R12,link}
 1980MOV mainvars,R0
 1990LDR R1,[mainvars,#vars_square1]
 2000LDR boardptr,[mainvars,#vars_board]
 2010BL test_for_zap
 2020LDR R9,[R9] ; l-value of result
 2030STR R0,[R9]
 2040LDMFD (stack)!,{R0-R12,PC}
 2050
 2060
 2070]:tfz_move=5:tfz_target=6:tfz_tableptr=9:tfz_dirloop=7:tfz_result=8
 2080REM also uses R10 gridptr, R11 boardptr
 2090[OPT pass%+8
 2100
 2110.test_for_zap ; R1 is the square to be tested.    R11/boardptr is set
 2120; return in R0.
 2130; return is 4 bytes.  Each is a number of a square that has been killed, or 0
 2140
 2150STMFD (stack)!,{R1-R10,link}
 2160LDRB tfz_move,[boardptr,R1]
 2170CMPS tfz_move,#_king%:BEQ tfz_null_result
 2180CMPS tfz_move,#_swede%:MOVEQ tfz_target,#_muskovit%:MOVNE tfz_target,#_swede%
 2190LDR tfz_tableptr,[mainvars,#vars_zaptable]
 2200ADD tfz_tableptr,tfz_tableptr,R1,LSL #4 ; 4-dir * 4-bytes for each square
 2210LDR gridptr,[mainvars,#vars_grid]
 2220
 2230MOV tfz_result,#0
 2240MOV tfz_dirloop,#4
 2250.tfz_loop    ; R1 must be maintained until tfz_loop
 2260LDRB R1,[tfz_tableptr]:CMPS R0,#255:BEQ tfz_null_loop
 2270LDRB R0,[boardptr,R1] ; type of piece in the middle
 2280CMPS R0,#_king%:BEQ tfz_king
 2290CMPS R0,tfz_target:BNE tfz_null_loop
 2300
 2310LDRB R0,[tfz_tableptr,#1]
 2320LDRB R0,[boardptr,R0]:CMPS R0,tfz_move:BNE tfz_null_loop ; no pair opposite to take
 2330
 2340.tfz_zap     ;  R1 still set
 2350ADD R1,R1,#1 ; square to kill+1
 2360ADD tfz_result,R1,tfz_result,LSL #8  ; insert into bottom byte
 2370
 2380.tfz_null_loop
 2390ADD tfz_tableptr,tfz_tableptr,#4
 2400SUBS tfz_dirloop,tfz_dirloop,#1 : BNE tfz_loop
 2410
 2420MOV R0,tfz_result : LDMFD (stack)!,{R1-R10,PC}
 2430
 2440.tfz_null_result : MOV R0,#0 : LDMFD (stack)!,{R1-R10,PC}
 2450
 2460.tfz_king
 2470CMPS tfz_target,#_swede%:BNE tfz_null_loop
 2480; king requires 4 attackers, but these may be camp squares
 2490
 2500LDRB R0,[tfz_tableptr,#1]
 2510LDRB R1,[gridptr,R0]
 2520LDRB R0,[boardptr,R0]:CMPS R0,tfz_move:CMPNES R1,#_camp%:BNE tfz_null_loop
 2530
 2540LDRB R0,[tfz_tableptr,#2]:CMPS R0,#255:BEQ tfz_null_loop ; no sides
 2550LDRB R1,[gridptr,R0]
 2560LDRB R0,[boardptr,R0]:CMPS R0,tfz_move:CMPNES R1,#_camp%:BNE tfz_null_loop
 2570
 2580LDRB R0,[tfz_tableptr,#3]
 2590LDRB R1,[gridptr,R0]
 2600LDRB R0,[boardptr,R0]:CMPS R0,tfz_move:CMPNES R1,#_camp%:BNE tfz_null_loop
 2610
 2620LDRB R1,[tfz_tableptr]  ;  square that the chief is in
 2630B tfz_zap
 2640]
 2650NEXT
 2660ENDPROC
 2670
 2680
 2690
 2700
 2710
 2720DEFPROCgeneratezaptable
 2730LOCAL x%,y%,dir%,  rx%, ry%, ptr%
 2740DIM dx%(3), dy%(3)
 2750DIM zaptable% 82*4*4
 2760
 2770dx%()=0:dy%()=0:dx%(0)=1:dy%(1)=1:dx%(2)=-1:dy%(3)=-1 :REM clockwise from R
 2780ptr%=zaptable%
 2790
 2800FOR y%=0 TO 8
 2810FOR x%=0 TO 8
 2820FOR dir%=0 TO 3
 2830rx%=x%+2*dx%(dir%):ry%=y%+2*dy%(dir%)
 2840IF rx%<0 OR rx%>8 OR ry%<0 OR ry%>8 THEN
 2850!ptr%=-1
 2860ELSE
 2870?ptr%=x%+dx%(dir%)+9*(y%+dy%(dir%))
 2880ptr%?1=rx%+9*ry%
 2890
 2900REM now set the side lobes
 2910rx%-=dx%(dir%):ry%-=dy%(dir%)
 2920
 2930IF FNok(rx%+dy%(dir%)) AND FNok(rx%-dy%(dir%)) AND FNok(ry%+dx%(dir%)) AND FNok(ry%-dx%(dir%)) THEN
 2940ptr%?2=(rx%+dy%(dir%))+9*(ry%+dx%(dir%))
 2950ptr%?3=(rx%-dy%(dir%))+9*(ry%-dx%(dir%))
 2960ELSE
 2970ptr%?2=255:ptr%?3=255
 2980ENDIF
 2990ENDIF
 3000ptr%+=4
 3010NEXT
 3020NEXT
 3030NEXT
 3040REM OSCLI("SAVE <Hneftafl$Dir>.TableTest "+STR$~(zaptable%)+"+"+STR$~(82*4*4))
 3050ENDPROC
 3060:
 3070:
 3080DEFFNok(x%)
 3090IF x%>=0 AND x%<9 THEN =TRUE
 3100=FALSE
 3110:
 3120:
 3130
 3140
 3150
 3160

� hneftafl
� Stuart Whitehouse
�
(C� This file has been written in an unnecessarily complex manner
2I� This is in order to make the addition of a computer player possible
<�
F��hnft_init
P� x%
Z
_blank%=0
d
_swede%=1
n_muskovit%=2
x_swedeking%=4:_king%=4
�_campmuskovit%=8:_camp%=8
�
�L� board% 104 : � this is larger to allow saving of options from this mem
�� grid% 90
�� w%=0 � 80:grid%?w%=0:�
�grid%?40=_king%
�*�+0:� w%=0 � 15:� x%:grid%?x%=_camp%:�
�5� 3,4,5,13, 27,36,45,37, 35,44,53,43, 75,76,77,67
��
�:
���hnft_newgame
�� w%=0 � 80
�Ȏ grid%?w% �
� _king% : board%?w%=_king%
#� _camp% : board%?w%=_muskovit%
 : board%?w%=0
"�
,�
6Kboard%?22=_swede%:board%?31=_swede%:board%?49=_swede%:board%?58=_swede%
@Kboard%?38=_swede%:board%?39=_swede%:board%?41=_swede%:board%?42=_swede%
Jturn%=0
T�hnft_newturn
^
h�redrawboard
r�
|:
���hnft_newturn
�turn%+=1
�to_play%=(2-(turn% � 1))
��status
��
�:
�:
�ݤplayer(type%)
� =((type% � (type%>>>2)) � 3)
�:
�:
�:
�:
*��hnft_makemove(start_square%,square%)
,� index%, ptr%, type%, k_found%,m_found%

&!A%!vars_square1=start_square%
0� generate_move_list
:ptr%=list%
Dȕ !ptr%>=0 � match%=�
N� !ptr%=square% � match%=�
Xptr%+=4
b�
l� � match% � �7:�
v
�type%=board%?start_square%
�%�setsquare(start_square%,_blank%)
��setsquare(square%,type%)
�
�+� ---  now test for winning and zapping
�� type%=_king% �
�2� square%<9 � square%>=72 � to_play%=-to_play%
�w%=square% � 9
�&� w%=0 � w%=8 � to_play%=-to_play%
�'� to_play%<0 � w%=�genalert("KING")
��status
��
�� to_play%<0 � �

A%!vars_square1=square%
 � basic_test_for_zap,result%
 ȕ result%>0
*#�setsquare((result% � &FF)-1,0)
4result%=result%>>>8
>�
H
R� index%=0 � 80
\Ȏ board%?index% �
f� _king% : k_found%=�
p� _muskovit% : m_found%=�
z�
��
�<� k_found%=� � w%=�genalert("KXXX"):to_play%=-_muskovit%
�9� m_found%=� � w%=�genalert("MXXX"):to_play%=-_swede%
�� to_play%<0 � �status:�
�
��hnft_newturn
��
�
�
�
�
�
�



$
.
8
BC� the machine could have been far more simply written in BASIC.
LJ� it has been done as armcode in case I wish to add a computer player.
V
`
j
t��assem
~�generatezaptable
�
�� varmem 1024, list% 1024
�
A%=varmem
�,vars_board=0 : vars_grid=4 : vars_turn=8
�7vars_square1=12 : vars_square2=16 : vars_listptr=20
�vars_zaptable=24
�
�A%!vars_board=board%
�A%!vars_grid=grid%
�A%!vars_listptr=list%
�A%!vars_zaptable=zaptable%
�



7stack=13:link=14:mainvars=12:boardptr=11:gridptr=10

(codesize%=2048:opt_max%=2
2� codemem codesize%
<#� pass%=0 � opt_max% � opt_max%
FP%=codemem
PL%=codemem+codesize%
Z[OPT pass%+8
d
n.generate_move_list
x	; gml
� STMFD (stack)!,{R0-R12,link}
�MOV mainvars,R0
�'LDR boardptr,[mainvars,#vars_board]
�%LDR gridptr,[mainvars,#vars_grid]
�
�2LDR R9,[mainvars,#vars_listptr] ; R9 = listptr
�8LDR R8,[mainvars,#vars_square1]  ; R8 = start_square
�LDRB R7,[gridptr,R8]
�CMPS R7,#_camp%
�-LDRNEB R7,[boardptr,R8]  ; R7 = move type
�
�
MOV R6,R8
�.gml_makex_loop
ACMPS R6,#9:SUBGE R6,R6,#9:BGT gml_makex_loop ;   R6 = x coord

'MOV R4,#1:MOV R5,#0:BL gml_generate
"'MVN R4,#0:MOV R5,#0:BL gml_generate
,'MOV R4,#0:MOV R5,#9:BL gml_generate
6'MOV R4,#0:MVN R5,#8:BL gml_generate
@; that's all!
J5MVN R0,#0:STR R0,[R9],#4 ; add terminator to list
T
^LDMFD (stack)!,{R0-R12,PC}
h
r
|.gml_generate
�STMFD (stack)!,{R6,R8,link}
�
�.gml_mainloop
�ADD R8,R8,R4:ADD R8,R8,R5
�ADD R6,R6,R4
�
�; now test validity
�,RSBS R0,R8,#0:CMPLES R8,#80:BGT gml_stop
�BRSBS R0,R6,#0:CMPLES R6,#8:BGT gml_stop    ;  fallen off board
�
�DLDRB R0,[boardptr,R8]:CMPS R0,#0:BNE gml_stop ; piece in the way
�LDRB R0,[gridptr,R8]
�JCMPS R0,#_king%:BEQ gml_stop ; no-one is allowed on the chief's square
CMPS R0,#_camp%:BNE gml_ok
B; a camp square, only a muskovit camp piece is allowed onto it
 CMPS R7,#_camp%:BNE gml_stop
&.gml_ok
0
:; legal move
DSTR R8,[R9],#4
NB gml_mainloop
X
b
.gml_stop
lLDMFD (stack)!,{R6,R8,PC}
v
�
�
�
�
�.basic_test_for_zap
� STMFD (stack)!,{R0-R12,link}
�MOV mainvars,R0
�#LDR R1,[mainvars,#vars_square1]
�'LDR boardptr,[mainvars,#vars_board]
�BL test_for_zap
�#LDR R9,[R9] ; l-value of result
�STR R0,[R9]
�LDMFD (stack)!,{R0-R12,PC}


G]:tfz_move=5:tfz_target=6:tfz_tableptr=9:tfz_dirloop=7:tfz_result=8
 )� also uses R10 gridptr, R11 boardptr
*[OPT pass%+8
4
>I.test_for_zap ; R1 is the square to be tested.    R11/boardptr is set
H; return in R0.
RQ; return is 4 bytes.  Each is a number of a square that has been killed, or 0
\
f STMFD (stack)!,{R1-R10,link}
pLDRB tfz_move,[boardptr,R1]
z-CMPS tfz_move,#_king%:BEQ tfz_null_result
�NCMPS tfz_move,#_swede%:�Q tfz_target,#_muskovit%:MOVNE tfz_target,#_swede%
�.LDR tfz_tableptr,[mainvars,#vars_zaptable]
�MADD tfz_tableptr,tfz_tableptr,R1,LSL #4 ; 4-dir * 4-bytes for each square
�%LDR gridptr,[mainvars,#vars_grid]
�
�MOV tfz_result,#0
�MOV tfz_dirloop,#4
�7.tfz_loop    ; R1 must be maintained until tfz_loop
�9LDRB R1,[tfz_tableptr]:CMPS R0,#255:BEQ tfz_null_loop
�7LDRB R0,[boardptr,R1] ; type of piece in the middle
� CMPS R0,#_king%:BEQ tfz_king
�(CMPS R0,tfz_target:BNE tfz_null_loop
�
	LDRB R0,[tfz_tableptr,#1]
	WLDRB R0,[boardptr,R0]:CMPS R0,tfz_move:BNE tfz_null_loop ; no pair opposite to take
	
	$ .tfz_zap     ;  R1 still set
	.#ADD R1,R1,#1 ; square to kill+1
	8BADD tfz_result,R1,tfz_result,LSL #8  ; insert into bottom byte
	B
	L.tfz_null_loop
	V$ADD tfz_tableptr,tfz_tableptr,#4
	`2SUBS tfz_dirloop,tfz_dirloop,#1 : BNE tfz_loop
	j
	t2MOV R0,tfz_result : LDMFD (stack)!,{R1-R10,PC}
	~
	�=.tfz_null_result : MOV R0,#0 : LDMFD (stack)!,{R1-R10,PC}
	�
	�
.tfz_king
	�.CMPS tfz_target,#_swede%:BNE tfz_null_loop
	�>; king requires 4 attackers, but these may be camp squares
	�
	�LDRB R0,[tfz_tableptr,#1]
	�LDRB R1,[gridptr,R0]
	�NLDRB R0,[boardptr,R0]:CMPS R0,tfz_move:CMPNES R1,#_camp%:BNE tfz_null_loop
	�
	�GLDRB R0,[tfz_tableptr,#2]:CMPS R0,#255:BEQ tfz_null_loop ; no sides
	�LDRB R1,[gridptr,R0]
NLDRB R0,[boardptr,R0]:CMPS R0,tfz_move:CMPNES R1,#_camp%:BNE tfz_null_loop


LDRB R0,[tfz_tableptr,#3]
LDRB R1,[gridptr,R0]
(NLDRB R0,[boardptr,R0]:CMPS R0,tfz_move:CMPNES R1,#_camp%:BNE tfz_null_loop
2
<:LDRB R1,[tfz_tableptr]  ;  square that the chief is in
F
B tfz_zap
P]
Z�
d�
n
x
�
�
�
���generatezaptable
�!� x%,y%,dir%,  rx%, ry%, ptr%
�� dx%(3), dy%(3)
�� zaptable% 82*4*4
�
�Mdx%()=0:dy%()=0:dx%(0)=1:dy%(1)=1:dx%(2)=-1:dy%(3)=-1 :� clockwise from R
�ptr%=zaptable%
�
�� y%=0 � 8
�� x%=0 � 8
� dir%=0 � 3
)rx%=x%+2*dx%(dir%):ry%=y%+2*dy%(dir%)
%� rx%<0 � rx%>8 � ry%<0 � ry%>8 �
"!ptr%=-1
,�
6'?ptr%=x%+dx%(dir%)+9*(y%+dy%(dir%))
@ptr%?1=rx%+9*ry%
J
T� now set the side lobes
^!rx%-=dx%(dir%):ry%-=dy%(dir%)
h
rY� �ok(rx%+dy%(dir%)) � �ok(rx%-dy%(dir%)) � �ok(ry%+dx%(dir%)) � �ok(ry%-dx%(dir%)) �
|,ptr%?2=(rx%+dy%(dir%))+9*(ry%+dx%(dir%))
�,ptr%?3=(rx%-dy%(dir%))+9*(ry%-dx%(dir%))
��
�ptr%?2=255:ptr%?3=255
��
��
�ptr%+=4
��
��
��
�P� OSCLI("SAVE <Hneftafl$Dir>.TableTest "+STR$~(zaptable%)+"+"+STR$~(82*4*4))
��
�:
�:
ݤok(x%)
� x%>=0 � x%<9 � =�
=�
&:
0:
:
D
N
X
�
00000000  0d 00 0a 0e f4 20 68 6e  65 66 74 61 66 6c 0d 00  |..... hneftafl..|
00000010  14 17 f4 20 53 74 75 61  72 74 20 57 68 69 74 65  |... Stuart White|
00000020  68 6f 75 73 65 0d 00 1e  05 f4 0d 00 28 43 f4 20  |house.......(C. |
00000030  54 68 69 73 20 66 69 6c  65 20 68 61 73 20 62 65  |This file has be|
00000040  65 6e 20 77 72 69 74 74  65 6e 20 69 6e 20 61 6e  |en written in an|
00000050  20 75 6e 6e 65 63 65 73  73 61 72 69 6c 79 20 63  | unnecessarily c|
00000060  6f 6d 70 6c 65 78 20 6d  61 6e 6e 65 72 0d 00 32  |omplex manner..2|
00000070  49 f4 20 54 68 69 73 20  69 73 20 69 6e 20 6f 72  |I. This is in or|
00000080  64 65 72 20 74 6f 20 6d  61 6b 65 20 74 68 65 20  |der to make the |
00000090  61 64 64 69 74 69 6f 6e  20 6f 66 20 61 20 63 6f  |addition of a co|
000000a0  6d 70 75 74 65 72 20 70  6c 61 79 65 72 20 70 6f  |mputer player po|
000000b0  73 73 69 62 6c 65 0d 00  3c 05 f4 0d 00 46 0f dd  |ssible..<....F..|
000000c0  f2 68 6e 66 74 5f 69 6e  69 74 0d 00 50 08 ea 20  |.hnft_init..P.. |
000000d0  78 25 0d 00 5a 0d 5f 62  6c 61 6e 6b 25 3d 30 0d  |x%..Z._blank%=0.|
000000e0  00 64 0d 5f 73 77 65 64  65 25 3d 31 0d 00 6e 10  |.d._swede%=1..n.|
000000f0  5f 6d 75 73 6b 6f 76 69  74 25 3d 32 0d 00 78 1a  |_muskovit%=2..x.|
00000100  5f 73 77 65 64 65 6b 69  6e 67 25 3d 34 3a 5f 6b  |_swedeking%=4:_k|
00000110  69 6e 67 25 3d 34 0d 00  82 1d 5f 63 61 6d 70 6d  |ing%=4...._campm|
00000120  75 73 6b 6f 76 69 74 25  3d 38 3a 5f 63 61 6d 70  |uskovit%=8:_camp|
00000130  25 3d 38 0d 00 8c 04 0d  00 96 4c de 20 62 6f 61  |%=8.......L. boa|
00000140  72 64 25 20 31 30 34 20  3a 20 f4 20 74 68 69 73  |rd% 104 : . this|
00000150  20 69 73 20 6c 61 72 67  65 72 20 74 6f 20 61 6c  | is larger to al|
00000160  6c 6f 77 20 73 61 76 69  6e 67 20 6f 66 20 6f 70  |low saving of op|
00000170  74 69 6f 6e 73 20 66 72  6f 6d 20 74 68 69 73 20  |tions from this |
00000180  6d 65 6d 0d 00 a0 0e de  20 67 72 69 64 25 20 39  |mem..... grid% 9|
00000190  30 0d 00 aa 1c e3 20 77  25 3d 30 20 b8 20 38 30  |0..... w%=0 . 80|
000001a0  3a 67 72 69 64 25 3f 77  25 3d 30 3a ed 0d 00 b4  |:grid%?w%=0:....|
000001b0  13 67 72 69 64 25 3f 34  30 3d 5f 6b 69 6e 67 25  |.grid%?40=_king%|
000001c0  0d 00 be 2a f7 2b 30 3a  e3 20 77 25 3d 30 20 b8  |...*.+0:. w%=0 .|
000001d0  20 31 35 3a f3 20 78 25  3a 67 72 69 64 25 3f 78  | 15:. x%:grid%?x|
000001e0  25 3d 5f 63 61 6d 70 25  3a ed 0d 00 c8 35 dc 20  |%=_camp%:....5. |
000001f0  33 2c 34 2c 35 2c 31 33  2c 20 32 37 2c 33 36 2c  |3,4,5,13, 27,36,|
00000200  34 35 2c 33 37 2c 20 33  35 2c 34 34 2c 35 33 2c  |45,37, 35,44,53,|
00000210  34 33 2c 20 37 35 2c 37  36 2c 37 37 2c 36 37 0d  |43, 75,76,77,67.|
00000220  00 d2 05 e1 0d 00 dc 05  3a 0d 00 e6 12 dd f2 68  |........:......h|
00000230  6e 66 74 5f 6e 65 77 67  61 6d 65 0d 00 f0 0f e3  |nft_newgame.....|
00000240  20 77 25 3d 30 20 b8 20  38 30 0d 00 fa 11 c8 8e  | w%=0 . 80......|
00000250  20 67 72 69 64 25 3f 77  25 20 ca 0d 01 04 1f c9  | grid%?w% ......|
00000260  20 5f 6b 69 6e 67 25 20  3a 20 62 6f 61 72 64 25  | _king% : board%|
00000270  3f 77 25 3d 5f 6b 69 6e  67 25 0d 01 0e 23 c9 20  |?w%=_king%...#. |
00000280  5f 63 61 6d 70 25 20 3a  20 62 6f 61 72 64 25 3f  |_camp% : board%?|
00000290  77 25 3d 5f 6d 75 73 6b  6f 76 69 74 25 0d 01 18  |w%=_muskovit%...|
000002a0  13 7f 20 3a 20 62 6f 61  72 64 25 3f 77 25 3d 30  |.. : board%?w%=0|
000002b0  0d 01 22 05 cb 0d 01 2c  05 ed 0d 01 36 4b 62 6f  |.."....,....6Kbo|
000002c0  61 72 64 25 3f 32 32 3d  5f 73 77 65 64 65 25 3a  |ard%?22=_swede%:|
000002d0  62 6f 61 72 64 25 3f 33  31 3d 5f 73 77 65 64 65  |board%?31=_swede|
000002e0  25 3a 62 6f 61 72 64 25  3f 34 39 3d 5f 73 77 65  |%:board%?49=_swe|
000002f0  64 65 25 3a 62 6f 61 72  64 25 3f 35 38 3d 5f 73  |de%:board%?58=_s|
00000300  77 65 64 65 25 0d 01 40  4b 62 6f 61 72 64 25 3f  |wede%..@Kboard%?|
00000310  33 38 3d 5f 73 77 65 64  65 25 3a 62 6f 61 72 64  |38=_swede%:board|
00000320  25 3f 33 39 3d 5f 73 77  65 64 65 25 3a 62 6f 61  |%?39=_swede%:boa|
00000330  72 64 25 3f 34 31 3d 5f  73 77 65 64 65 25 3a 62  |rd%?41=_swede%:b|
00000340  6f 61 72 64 25 3f 34 32  3d 5f 73 77 65 64 65 25  |oard%?42=_swede%|
00000350  0d 01 4a 0b 74 75 72 6e  25 3d 30 0d 01 54 11 f2  |..J.turn%=0..T..|
00000360  68 6e 66 74 5f 6e 65 77  74 75 72 6e 0d 01 5e 04  |hnft_newturn..^.|
00000370  0d 01 68 10 f2 72 65 64  72 61 77 62 6f 61 72 64  |..h..redrawboard|
00000380  0d 01 72 05 e1 0d 01 7c  05 3a 0d 01 86 12 dd f2  |..r....|.:......|
00000390  68 6e 66 74 5f 6e 65 77  74 75 72 6e 0d 01 90 0c  |hnft_newturn....|
000003a0  74 75 72 6e 25 2b 3d 31  0d 01 9a 1c 74 6f 5f 70  |turn%+=1....to_p|
000003b0  6c 61 79 25 3d 28 32 2d  28 74 75 72 6e 25 20 80  |lay%=(2-(turn% .|
000003c0  20 31 29 29 0d 01 a4 0b  f2 73 74 61 74 75 73 0d  | 1)).....status.|
000003d0  01 ae 05 e1 0d 01 b8 05  3a 0d 01 c2 05 3a 0d 01  |........:....:..|
000003e0  cc 13 dd a4 70 6c 61 79  65 72 28 74 79 70 65 25  |....player(type%|
000003f0  29 0d 01 d6 20 3d 28 28  74 79 70 65 25 20 84 20  |)... =((type% . |
00000400  28 74 79 70 65 25 3e 3e  3e 32 29 29 20 80 20 33  |(type%>>>2)) . 3|
00000410  29 0d 01 e0 05 3a 0d 01  ea 05 3a 0d 01 f4 05 3a  |)....:....:....:|
00000420  0d 01 fe 05 3a 0d 02 08  2a dd f2 68 6e 66 74 5f  |....:...*..hnft_|
00000430  6d 61 6b 65 6d 6f 76 65  28 73 74 61 72 74 5f 73  |makemove(start_s|
00000440  71 75 61 72 65 25 2c 73  71 75 61 72 65 25 29 0d  |quare%,square%).|
00000450  02 12 2c ea 20 69 6e 64  65 78 25 2c 20 70 74 72  |..,. index%, ptr|
00000460  25 2c 20 74 79 70 65 25  2c 20 6b 5f 66 6f 75 6e  |%, type%, k_foun|
00000470  64 25 2c 6d 5f 66 6f 75  6e 64 25 0d 02 1c 04 0d  |d%,m_found%.....|
00000480  02 26 21 41 25 21 76 61  72 73 5f 73 71 75 61 72  |.&!A%!vars_squar|
00000490  65 31 3d 73 74 61 72 74  5f 73 71 75 61 72 65 25  |e1=start_square%|
000004a0  0d 02 30 18 d6 20 67 65  6e 65 72 61 74 65 5f 6d  |..0.. generate_m|
000004b0  6f 76 65 5f 6c 69 73 74  0d 02 3a 0e 70 74 72 25  |ove_list..:.ptr%|
000004c0  3d 6c 69 73 74 25 0d 02  44 1a c8 95 20 21 70 74  |=list%..D... !pt|
000004d0  72 25 3e 3d 30 20 80 20  6d 61 74 63 68 25 3d a3  |r%>=0 . match%=.|
000004e0  0d 02 4e 1e e7 20 21 70  74 72 25 3d 73 71 75 61  |..N.. !ptr%=squa|
000004f0  72 65 25 20 8c 20 6d 61  74 63 68 25 3d b9 0d 02  |re% . match%=...|
00000500  58 0b 70 74 72 25 2b 3d  34 0d 02 62 05 ce 0d 02  |X.ptr%+=4..b....|
00000510  6c 15 e7 20 ac 20 6d 61  74 63 68 25 20 8c 20 ef  |l.. . match% . .|
00000520  37 3a e1 0d 02 76 04 0d  02 80 1e 74 79 70 65 25  |7:...v.....type%|
00000530  3d 62 6f 61 72 64 25 3f  73 74 61 72 74 5f 73 71  |=board%?start_sq|
00000540  75 61 72 65 25 0d 02 8a  25 f2 73 65 74 73 71 75  |uare%...%.setsqu|
00000550  61 72 65 28 73 74 61 72  74 5f 73 71 75 61 72 65  |are(start_square|
00000560  25 2c 5f 62 6c 61 6e 6b  25 29 0d 02 94 1d f2 73  |%,_blank%).....s|
00000570  65 74 73 71 75 61 72 65  28 73 71 75 61 72 65 25  |etsquare(square%|
00000580  2c 74 79 70 65 25 29 0d  02 9e 04 0d 02 a8 2b f4  |,type%).......+.|
00000590  20 2d 2d 2d 20 20 6e 6f  77 20 74 65 73 74 20 66  | ---  now test f|
000005a0  6f 72 20 77 69 6e 6e 69  6e 67 20 61 6e 64 20 7a  |or winning and z|
000005b0  61 70 70 69 6e 67 0d 02  b2 14 e7 20 74 79 70 65  |apping..... type|
000005c0  25 3d 5f 6b 69 6e 67 25  20 8c 0d 02 bc 32 e7 20  |%=_king% ....2. |
000005d0  73 71 75 61 72 65 25 3c  39 20 84 20 73 71 75 61  |square%<9 . squa|
000005e0  72 65 25 3e 3d 37 32 20  8c 20 74 6f 5f 70 6c 61  |re%>=72 . to_pla|
000005f0  79 25 3d 2d 74 6f 5f 70  6c 61 79 25 0d 02 c6 12  |y%=-to_play%....|
00000600  77 25 3d 73 71 75 61 72  65 25 20 83 20 39 0d 02  |w%=square% . 9..|
00000610  d0 26 e7 20 77 25 3d 30  20 84 20 77 25 3d 38 20  |.&. w%=0 . w%=8 |
00000620  8c 20 74 6f 5f 70 6c 61  79 25 3d 2d 74 6f 5f 70  |. to_play%=-to_p|
00000630  6c 61 79 25 0d 02 da 27  e7 20 74 6f 5f 70 6c 61  |lay%...'. to_pla|
00000640  79 25 3c 30 20 8c 20 77  25 3d a4 67 65 6e 61 6c  |y%<0 . w%=.genal|
00000650  65 72 74 28 22 4b 49 4e  47 22 29 0d 02 e4 0b f2  |ert("KING").....|
00000660  73 74 61 74 75 73 0d 02  ee 05 cd 0d 02 f8 14 e7  |status..........|
00000670  20 74 6f 5f 70 6c 61 79  25 3c 30 20 8c 20 e1 0d  | to_play%<0 . ..|
00000680  03 02 04 0d 03 0c 1b 41  25 21 76 61 72 73 5f 73  |.......A%!vars_s|
00000690  71 75 61 72 65 31 3d 73  71 75 61 72 65 25 0d 03  |quare1=square%..|
000006a0  16 20 d6 20 62 61 73 69  63 5f 74 65 73 74 5f 66  |. . basic_test_f|
000006b0  6f 72 5f 7a 61 70 2c 72  65 73 75 6c 74 25 0d 03  |or_zap,result%..|
000006c0  20 10 c8 95 20 72 65 73  75 6c 74 25 3e 30 0d 03  | ... result%>0..|
000006d0  2a 23 f2 73 65 74 73 71  75 61 72 65 28 28 72 65  |*#.setsquare((re|
000006e0  73 75 6c 74 25 20 80 20  26 46 46 29 2d 31 2c 30  |sult% . &FF)-1,0|
000006f0  29 0d 03 34 17 72 65 73  75 6c 74 25 3d 72 65 73  |)..4.result%=res|
00000700  75 6c 74 25 3e 3e 3e 38  0d 03 3e 05 ce 0d 03 48  |ult%>>>8..>....H|
00000710  04 0d 03 52 13 e3 20 69  6e 64 65 78 25 3d 30 20  |...R.. index%=0 |
00000720  b8 20 38 30 0d 03 5c 16  c8 8e 20 62 6f 61 72 64  |. 80..\... board|
00000730  25 3f 69 6e 64 65 78 25  20 ca 0d 03 66 19 c9 20  |%?index% ...f.. |
00000740  5f 6b 69 6e 67 25 20 3a  20 6b 5f 66 6f 75 6e 64  |_king% : k_found|
00000750  25 3d b9 0d 03 70 1d c9  20 5f 6d 75 73 6b 6f 76  |%=...p.. _muskov|
00000760  69 74 25 20 3a 20 6d 5f  66 6f 75 6e 64 25 3d b9  |it% : m_found%=.|
00000770  0d 03 7a 05 cb 0d 03 84  05 ed 0d 03 8e 3c e7 20  |..z..........<. |
00000780  6b 5f 66 6f 75 6e 64 25  3d a3 20 8c 20 77 25 3d  |k_found%=. . w%=|
00000790  a4 67 65 6e 61 6c 65 72  74 28 22 4b 58 58 58 22  |.genalert("KXXX"|
000007a0  29 3a 74 6f 5f 70 6c 61  79 25 3d 2d 5f 6d 75 73  |):to_play%=-_mus|
000007b0  6b 6f 76 69 74 25 0d 03  98 39 e7 20 6d 5f 66 6f  |kovit%...9. m_fo|
000007c0  75 6e 64 25 3d a3 20 8c  20 77 25 3d a4 67 65 6e  |und%=. . w%=.gen|
000007d0  61 6c 65 72 74 28 22 4d  58 58 58 22 29 3a 74 6f  |alert("MXXX"):to|
000007e0  5f 70 6c 61 79 25 3d 2d  5f 73 77 65 64 65 25 0d  |_play%=-_swede%.|
000007f0  03 a2 1c e7 20 74 6f 5f  70 6c 61 79 25 3c 30 20  |.... to_play%<0 |
00000800  8c 20 f2 73 74 61 74 75  73 3a e1 0d 03 ac 04 0d  |. .status:......|
00000810  03 b6 11 f2 68 6e 66 74  5f 6e 65 77 74 75 72 6e  |....hnft_newturn|
00000820  0d 03 c0 05 e1 0d 03 ca  04 0d 03 d4 04 0d 03 de  |................|
00000830  04 0d 03 e8 04 0d 03 f2  04 0d 03 fc 04 0d 04 06  |................|
00000840  04 0d 04 10 04 0d 04 1a  04 0d 04 24 04 0d 04 2e  |...........$....|
00000850  04 0d 04 38 04 0d 04 42  43 f4 20 74 68 65 20 6d  |...8...BC. the m|
00000860  61 63 68 69 6e 65 20 63  6f 75 6c 64 20 68 61 76  |achine could hav|
00000870  65 20 62 65 65 6e 20 66  61 72 20 6d 6f 72 65 20  |e been far more |
00000880  73 69 6d 70 6c 79 20 77  72 69 74 74 65 6e 20 69  |simply written i|
00000890  6e 20 42 41 53 49 43 2e  0d 04 4c 4a f4 20 69 74  |n BASIC...LJ. it|
000008a0  20 68 61 73 20 62 65 65  6e 20 64 6f 6e 65 20 61  | has been done a|
000008b0  73 20 61 72 6d 63 6f 64  65 20 69 6e 20 63 61 73  |s armcode in cas|
000008c0  65 20 49 20 77 69 73 68  20 74 6f 20 61 64 64 20  |e I wish to add |
000008d0  61 20 63 6f 6d 70 75 74  65 72 20 70 6c 61 79 65  |a computer playe|
000008e0  72 2e 0d 04 56 04 0d 04  60 04 0d 04 6a 04 0d 04  |r...V...`...j...|
000008f0  74 0b dd f2 61 73 73 65  6d 0d 04 7e 15 f2 67 65  |t...assem..~..ge|
00000900  6e 65 72 61 74 65 7a 61  70 74 61 62 6c 65 0d 04  |neratezaptable..|
00000910  88 04 0d 04 92 1d de 20  76 61 72 6d 65 6d 20 31  |....... varmem 1|
00000920  30 32 34 2c 20 6c 69 73  74 25 20 31 30 32 34 0d  |024, list% 1024.|
00000930  04 9c 0d 41 25 3d 76 61  72 6d 65 6d 0d 04 a6 2c  |...A%=varmem...,|
00000940  76 61 72 73 5f 62 6f 61  72 64 3d 30 20 3a 20 76  |vars_board=0 : v|
00000950  61 72 73 5f 67 72 69 64  3d 34 20 3a 20 76 61 72  |ars_grid=4 : var|
00000960  73 5f 74 75 72 6e 3d 38  0d 04 b0 37 76 61 72 73  |s_turn=8...7vars|
00000970  5f 73 71 75 61 72 65 31  3d 31 32 20 3a 20 76 61  |_square1=12 : va|
00000980  72 73 5f 73 71 75 61 72  65 32 3d 31 36 20 3a 20  |rs_square2=16 : |
00000990  76 61 72 73 5f 6c 69 73  74 70 74 72 3d 32 30 0d  |vars_listptr=20.|
000009a0  04 ba 14 76 61 72 73 5f  7a 61 70 74 61 62 6c 65  |...vars_zaptable|
000009b0  3d 32 34 0d 04 c4 04 0d  04 ce 18 41 25 21 76 61  |=24........A%!va|
000009c0  72 73 5f 62 6f 61 72 64  3d 62 6f 61 72 64 25 0d  |rs_board=board%.|
000009d0  04 d8 16 41 25 21 76 61  72 73 5f 67 72 69 64 3d  |...A%!vars_grid=|
000009e0  67 72 69 64 25 0d 04 e2  19 41 25 21 76 61 72 73  |grid%....A%!vars|
000009f0  5f 6c 69 73 74 70 74 72  3d 6c 69 73 74 25 0d 04  |_listptr=list%..|
00000a00  ec 1e 41 25 21 76 61 72  73 5f 7a 61 70 74 61 62  |..A%!vars_zaptab|
00000a10  6c 65 3d 7a 61 70 74 61  62 6c 65 25 0d 04 f6 04  |le=zaptable%....|
00000a20  0d 05 00 04 0d 05 0a 04  0d 05 14 37 73 74 61 63  |...........7stac|
00000a30  6b 3d 31 33 3a 6c 69 6e  6b 3d 31 34 3a 6d 61 69  |k=13:link=14:mai|
00000a40  6e 76 61 72 73 3d 31 32  3a 62 6f 61 72 64 70 74  |nvars=12:boardpt|
00000a50  72 3d 31 31 3a 67 72 69  64 70 74 72 3d 31 30 0d  |r=11:gridptr=10.|
00000a60  05 1e 04 0d 05 28 1d 63  6f 64 65 73 69 7a 65 25  |.....(.codesize%|
00000a70  3d 32 30 34 38 3a 6f 70  74 5f 6d 61 78 25 3d 32  |=2048:opt_max%=2|
00000a80  0d 05 32 17 de 20 63 6f  64 65 6d 65 6d 20 63 6f  |..2.. codemem co|
00000a90  64 65 73 69 7a 65 25 0d  05 3c 23 e3 20 70 61 73  |desize%..<#. pas|
00000aa0  73 25 3d 30 20 b8 20 6f  70 74 5f 6d 61 78 25 20  |s%=0 . opt_max% |
00000ab0  88 20 6f 70 74 5f 6d 61  78 25 0d 05 46 0e 50 25  |. opt_max%..F.P%|
00000ac0  3d 63 6f 64 65 6d 65 6d  0d 05 50 18 4c 25 3d 63  |=codemem..P.L%=c|
00000ad0  6f 64 65 6d 65 6d 2b 63  6f 64 65 73 69 7a 65 25  |odemem+codesize%|
00000ae0  0d 05 5a 10 5b 4f 50 54  20 70 61 73 73 25 2b 38  |..Z.[OPT pass%+8|
00000af0  0d 05 64 04 0d 05 6e 17  2e 67 65 6e 65 72 61 74  |..d...n..generat|
00000b00  65 5f 6d 6f 76 65 5f 6c  69 73 74 0d 05 78 09 3b  |e_move_list..x.;|
00000b10  20 67 6d 6c 0d 05 82 20  53 54 4d 46 44 20 28 73  | gml... STMFD (s|
00000b20  74 61 63 6b 29 21 2c 7b  52 30 2d 52 31 32 2c 6c  |tack)!,{R0-R12,l|
00000b30  69 6e 6b 7d 0d 05 8c 13  4d 4f 56 20 6d 61 69 6e  |ink}....MOV main|
00000b40  76 61 72 73 2c 52 30 0d  05 96 27 4c 44 52 20 62  |vars,R0...'LDR b|
00000b50  6f 61 72 64 70 74 72 2c  5b 6d 61 69 6e 76 61 72  |oardptr,[mainvar|
00000b60  73 2c 23 76 61 72 73 5f  62 6f 61 72 64 5d 0d 05  |s,#vars_board]..|
00000b70  a0 25 4c 44 52 20 67 72  69 64 70 74 72 2c 5b 6d  |.%LDR gridptr,[m|
00000b80  61 69 6e 76 61 72 73 2c  23 76 61 72 73 5f 67 72  |ainvars,#vars_gr|
00000b90  69 64 5d 0d 05 aa 04 0d  05 b4 32 4c 44 52 20 52  |id].......2LDR R|
00000ba0  39 2c 5b 6d 61 69 6e 76  61 72 73 2c 23 76 61 72  |9,[mainvars,#var|
00000bb0  73 5f 6c 69 73 74 70 74  72 5d 20 3b 20 52 39 20  |s_listptr] ; R9 |
00000bc0  3d 20 6c 69 73 74 70 74  72 0d 05 be 38 4c 44 52  |= listptr...8LDR|
00000bd0  20 52 38 2c 5b 6d 61 69  6e 76 61 72 73 2c 23 76  | R8,[mainvars,#v|
00000be0  61 72 73 5f 73 71 75 61  72 65 31 5d 20 20 3b 20  |ars_square1]  ; |
00000bf0  52 38 20 3d 20 73 74 61  72 74 5f 73 71 75 61 72  |R8 = start_squar|
00000c00  65 0d 05 c8 18 4c 44 52  42 20 52 37 2c 5b 67 72  |e....LDRB R7,[gr|
00000c10  69 64 70 74 72 2c 52 38  5d 0d 05 d2 13 43 4d 50  |idptr,R8]....CMP|
00000c20  53 20 52 37 2c 23 5f 63  61 6d 70 25 0d 05 dc 2d  |S R7,#_camp%...-|
00000c30  4c 44 52 4e 45 42 20 52  37 2c 5b 62 6f 61 72 64  |LDRNEB R7,[board|
00000c40  70 74 72 2c 52 38 5d 20  20 3b 20 52 37 20 3d 20  |ptr,R8]  ; R7 = |
00000c50  6d 6f 76 65 20 74 79 70  65 0d 05 e6 04 0d 05 f0  |move type.......|
00000c60  0d 4d 4f 56 20 52 36 2c  52 38 0d 05 fa 13 2e 67  |.MOV R6,R8.....g|
00000c70  6d 6c 5f 6d 61 6b 65 78  5f 6c 6f 6f 70 0d 06 04  |ml_makex_loop...|
00000c80  41 43 4d 50 53 20 52 36  2c 23 39 3a 53 55 42 47  |ACMPS R6,#9:SUBG|
00000c90  45 20 52 36 2c 52 36 2c  23 39 3a 42 47 54 20 67  |E R6,R6,#9:BGT g|
00000ca0  6d 6c 5f 6d 61 6b 65 78  5f 6c 6f 6f 70 20 3b 20  |ml_makex_loop ; |
00000cb0  20 20 52 36 20 3d 20 78  20 63 6f 6f 72 64 0d 06  |  R6 = x coord..|
00000cc0  0e 04 0d 06 18 27 4d 4f  56 20 52 34 2c 23 31 3a  |.....'MOV R4,#1:|
00000cd0  4d 4f 56 20 52 35 2c 23  30 3a 42 4c 20 67 6d 6c  |MOV R5,#0:BL gml|
00000ce0  5f 67 65 6e 65 72 61 74  65 0d 06 22 27 4d 56 4e  |_generate.."'MVN|
00000cf0  20 52 34 2c 23 30 3a 4d  4f 56 20 52 35 2c 23 30  | R4,#0:MOV R5,#0|
00000d00  3a 42 4c 20 67 6d 6c 5f  67 65 6e 65 72 61 74 65  |:BL gml_generate|
00000d10  0d 06 2c 27 4d 4f 56 20  52 34 2c 23 30 3a 4d 4f  |..,'MOV R4,#0:MO|
00000d20  56 20 52 35 2c 23 39 3a  42 4c 20 67 6d 6c 5f 67  |V R5,#9:BL gml_g|
00000d30  65 6e 65 72 61 74 65 0d  06 36 27 4d 4f 56 20 52  |enerate..6'MOV R|
00000d40  34 2c 23 30 3a 4d 56 4e  20 52 35 2c 23 38 3a 42  |4,#0:MVN R5,#8:B|
00000d50  4c 20 67 6d 6c 5f 67 65  6e 65 72 61 74 65 0d 06  |L gml_generate..|
00000d60  40 11 3b 20 74 68 61 74  27 73 20 61 6c 6c 21 0d  |@.; that's all!.|
00000d70  06 4a 35 4d 56 4e 20 52  30 2c 23 30 3a 53 54 52  |.J5MVN R0,#0:STR|
00000d80  20 52 30 2c 5b 52 39 5d  2c 23 34 20 3b 20 61 64  | R0,[R9],#4 ; ad|
00000d90  64 20 74 65 72 6d 69 6e  61 74 6f 72 20 74 6f 20  |d terminator to |
00000da0  6c 69 73 74 0d 06 54 04  0d 06 5e 1e 4c 44 4d 46  |list..T...^.LDMF|
00000db0  44 20 28 73 74 61 63 6b  29 21 2c 7b 52 30 2d 52  |D (stack)!,{R0-R|
00000dc0  31 32 2c 50 43 7d 0d 06  68 04 0d 06 72 04 0d 06  |12,PC}..h...r...|
00000dd0  7c 11 2e 67 6d 6c 5f 67  65 6e 65 72 61 74 65 0d  ||..gml_generate.|
00000de0  06 86 1f 53 54 4d 46 44  20 28 73 74 61 63 6b 29  |...STMFD (stack)|
00000df0  21 2c 7b 52 36 2c 52 38  2c 6c 69 6e 6b 7d 0d 06  |!,{R6,R8,link}..|
00000e00  90 04 0d 06 9a 11 2e 67  6d 6c 5f 6d 61 69 6e 6c  |.......gml_mainl|
00000e10  6f 6f 70 0d 06 a4 1d 41  44 44 20 52 38 2c 52 38  |oop....ADD R8,R8|
00000e20  2c 52 34 3a 41 44 44 20  52 38 2c 52 38 2c 52 35  |,R4:ADD R8,R8,R5|
00000e30  0d 06 ae 10 41 44 44 20  52 36 2c 52 36 2c 52 34  |....ADD R6,R6,R4|
00000e40  0d 06 b8 04 0d 06 c2 17  3b 20 6e 6f 77 20 74 65  |........; now te|
00000e50  73 74 20 76 61 6c 69 64  69 74 79 0d 06 cc 2c 52  |st validity...,R|
00000e60  53 42 53 20 52 30 2c 52  38 2c 23 30 3a 43 4d 50  |SBS R0,R8,#0:CMP|
00000e70  4c 45 53 20 52 38 2c 23  38 30 3a 42 47 54 20 67  |LES R8,#80:BGT g|
00000e80  6d 6c 5f 73 74 6f 70 0d  06 d6 42 52 53 42 53 20  |ml_stop...BRSBS |
00000e90  52 30 2c 52 36 2c 23 30  3a 43 4d 50 4c 45 53 20  |R0,R6,#0:CMPLES |
00000ea0  52 36 2c 23 38 3a 42 47  54 20 67 6d 6c 5f 73 74  |R6,#8:BGT gml_st|
00000eb0  6f 70 20 20 20 20 3b 20  20 66 61 6c 6c 65 6e 20  |op    ;  fallen |
00000ec0  6f 66 66 20 62 6f 61 72  64 0d 06 e0 04 0d 06 ea  |off board.......|
00000ed0  44 4c 44 52 42 20 52 30  2c 5b 62 6f 61 72 64 70  |DLDRB R0,[boardp|
00000ee0  74 72 2c 52 38 5d 3a 43  4d 50 53 20 52 30 2c 23  |tr,R8]:CMPS R0,#|
00000ef0  30 3a 42 4e 45 20 67 6d  6c 5f 73 74 6f 70 20 3b  |0:BNE gml_stop ;|
00000f00  20 70 69 65 63 65 20 69  6e 20 74 68 65 20 77 61  | piece in the wa|
00000f10  79 0d 06 f4 18 4c 44 52  42 20 52 30 2c 5b 67 72  |y....LDRB R0,[gr|
00000f20  69 64 70 74 72 2c 52 38  5d 0d 06 fe 4a 43 4d 50  |idptr,R8]...JCMP|
00000f30  53 20 52 30 2c 23 5f 6b  69 6e 67 25 3a 42 45 51  |S R0,#_king%:BEQ|
00000f40  20 67 6d 6c 5f 73 74 6f  70 20 3b 20 6e 6f 2d 6f  | gml_stop ; no-o|
00000f50  6e 65 20 69 73 20 61 6c  6c 6f 77 65 64 20 6f 6e  |ne is allowed on|
00000f60  20 74 68 65 20 63 68 69  65 66 27 73 20 73 71 75  | the chief's squ|
00000f70  61 72 65 0d 07 08 1e 43  4d 50 53 20 52 30 2c 23  |are....CMPS R0,#|
00000f80  5f 63 61 6d 70 25 3a 42  4e 45 20 67 6d 6c 5f 6f  |_camp%:BNE gml_o|
00000f90  6b 0d 07 12 42 3b 20 61  20 63 61 6d 70 20 73 71  |k...B; a camp sq|
00000fa0  75 61 72 65 2c 20 6f 6e  6c 79 20 61 20 6d 75 73  |uare, only a mus|
00000fb0  6b 6f 76 69 74 20 63 61  6d 70 20 70 69 65 63 65  |kovit camp piece|
00000fc0  20 69 73 20 61 6c 6c 6f  77 65 64 20 6f 6e 74 6f  | is allowed onto|
00000fd0  20 69 74 0d 07 1c 20 43  4d 50 53 20 52 37 2c 23  | it... CMPS R7,#|
00000fe0  5f 63 61 6d 70 25 3a 42  4e 45 20 67 6d 6c 5f 73  |_camp%:BNE gml_s|
00000ff0  74 6f 70 0d 07 26 0b 2e  67 6d 6c 5f 6f 6b 0d 07  |top..&..gml_ok..|
00001000  30 04 0d 07 3a 10 3b 20  6c 65 67 61 6c 20 6d 6f  |0...:.; legal mo|
00001010  76 65 0d 07 44 12 53 54  52 20 52 38 2c 5b 52 39  |ve..D.STR R8,[R9|
00001020  5d 2c 23 34 0d 07 4e 12  42 20 67 6d 6c 5f 6d 61  |],#4..N.B gml_ma|
00001030  69 6e 6c 6f 6f 70 0d 07  58 04 0d 07 62 0d 2e 67  |inloop..X...b..g|
00001040  6d 6c 5f 73 74 6f 70 0d  07 6c 1d 4c 44 4d 46 44  |ml_stop..l.LDMFD|
00001050  20 28 73 74 61 63 6b 29  21 2c 7b 52 36 2c 52 38  | (stack)!,{R6,R8|
00001060  2c 50 43 7d 0d 07 76 04  0d 07 80 04 0d 07 8a 04  |,PC}..v.........|
00001070  0d 07 94 04 0d 07 9e 04  0d 07 a8 17 2e 62 61 73  |.............bas|
00001080  69 63 5f 74 65 73 74 5f  66 6f 72 5f 7a 61 70 0d  |ic_test_for_zap.|
00001090  07 b2 20 53 54 4d 46 44  20 28 73 74 61 63 6b 29  |.. STMFD (stack)|
000010a0  21 2c 7b 52 30 2d 52 31  32 2c 6c 69 6e 6b 7d 0d  |!,{R0-R12,link}.|
000010b0  07 bc 13 4d 4f 56 20 6d  61 69 6e 76 61 72 73 2c  |...MOV mainvars,|
000010c0  52 30 0d 07 c6 23 4c 44  52 20 52 31 2c 5b 6d 61  |R0...#LDR R1,[ma|
000010d0  69 6e 76 61 72 73 2c 23  76 61 72 73 5f 73 71 75  |invars,#vars_squ|
000010e0  61 72 65 31 5d 0d 07 d0  27 4c 44 52 20 62 6f 61  |are1]...'LDR boa|
000010f0  72 64 70 74 72 2c 5b 6d  61 69 6e 76 61 72 73 2c  |rdptr,[mainvars,|
00001100  23 76 61 72 73 5f 62 6f  61 72 64 5d 0d 07 da 13  |#vars_board]....|
00001110  42 4c 20 74 65 73 74 5f  66 6f 72 5f 7a 61 70 0d  |BL test_for_zap.|
00001120  07 e4 23 4c 44 52 20 52  39 2c 5b 52 39 5d 20 3b  |..#LDR R9,[R9] ;|
00001130  20 6c 2d 76 61 6c 75 65  20 6f 66 20 72 65 73 75  | l-value of resu|
00001140  6c 74 0d 07 ee 0f 53 54  52 20 52 30 2c 5b 52 39  |lt....STR R0,[R9|
00001150  5d 0d 07 f8 1e 4c 44 4d  46 44 20 28 73 74 61 63  |]....LDMFD (stac|
00001160  6b 29 21 2c 7b 52 30 2d  52 31 32 2c 50 43 7d 0d  |k)!,{R0-R12,PC}.|
00001170  08 02 04 0d 08 0c 04 0d  08 16 47 5d 3a 74 66 7a  |..........G]:tfz|
00001180  5f 6d 6f 76 65 3d 35 3a  74 66 7a 5f 74 61 72 67  |_move=5:tfz_targ|
00001190  65 74 3d 36 3a 74 66 7a  5f 74 61 62 6c 65 70 74  |et=6:tfz_tablept|
000011a0  72 3d 39 3a 74 66 7a 5f  64 69 72 6c 6f 6f 70 3d  |r=9:tfz_dirloop=|
000011b0  37 3a 74 66 7a 5f 72 65  73 75 6c 74 3d 38 0d 08  |7:tfz_result=8..|
000011c0  20 29 f4 20 61 6c 73 6f  20 75 73 65 73 20 52 31  | ). also uses R1|
000011d0  30 20 67 72 69 64 70 74  72 2c 20 52 31 31 20 62  |0 gridptr, R11 b|
000011e0  6f 61 72 64 70 74 72 0d  08 2a 10 5b 4f 50 54 20  |oardptr..*.[OPT |
000011f0  70 61 73 73 25 2b 38 0d  08 34 04 0d 08 3e 49 2e  |pass%+8..4...>I.|
00001200  74 65 73 74 5f 66 6f 72  5f 7a 61 70 20 3b 20 52  |test_for_zap ; R|
00001210  31 20 69 73 20 74 68 65  20 73 71 75 61 72 65 20  |1 is the square |
00001220  74 6f 20 62 65 20 74 65  73 74 65 64 2e 20 20 20  |to be tested.   |
00001230  20 52 31 31 2f 62 6f 61  72 64 70 74 72 20 69 73  | R11/boardptr is|
00001240  20 73 65 74 0d 08 48 13  3b 20 72 65 74 75 72 6e  | set..H.; return|
00001250  20 69 6e 20 52 30 2e 0d  08 52 51 3b 20 72 65 74  | in R0...RQ; ret|
00001260  75 72 6e 20 69 73 20 34  20 62 79 74 65 73 2e 20  |urn is 4 bytes. |
00001270  20 45 61 63 68 20 69 73  20 61 20 6e 75 6d 62 65  | Each is a numbe|
00001280  72 20 6f 66 20 61 20 73  71 75 61 72 65 20 74 68  |r of a square th|
00001290  61 74 20 68 61 73 20 62  65 65 6e 20 6b 69 6c 6c  |at has been kill|
000012a0  65 64 2c 20 6f 72 20 30  0d 08 5c 04 0d 08 66 20  |ed, or 0..\...f |
000012b0  53 54 4d 46 44 20 28 73  74 61 63 6b 29 21 2c 7b  |STMFD (stack)!,{|
000012c0  52 31 2d 52 31 30 2c 6c  69 6e 6b 7d 0d 08 70 1f  |R1-R10,link}..p.|
000012d0  4c 44 52 42 20 74 66 7a  5f 6d 6f 76 65 2c 5b 62  |LDRB tfz_move,[b|
000012e0  6f 61 72 64 70 74 72 2c  52 31 5d 0d 08 7a 2d 43  |oardptr,R1]..z-C|
000012f0  4d 50 53 20 74 66 7a 5f  6d 6f 76 65 2c 23 5f 6b  |MPS tfz_move,#_k|
00001300  69 6e 67 25 3a 42 45 51  20 74 66 7a 5f 6e 75 6c  |ing%:BEQ tfz_nul|
00001310  6c 5f 72 65 73 75 6c 74  0d 08 84 4e 43 4d 50 53  |l_result...NCMPS|
00001320  20 74 66 7a 5f 6d 6f 76  65 2c 23 5f 73 77 65 64  | tfz_move,#_swed|
00001330  65 25 3a ec 51 20 74 66  7a 5f 74 61 72 67 65 74  |e%:.Q tfz_target|
00001340  2c 23 5f 6d 75 73 6b 6f  76 69 74 25 3a 4d 4f 56  |,#_muskovit%:MOV|
00001350  4e 45 20 74 66 7a 5f 74  61 72 67 65 74 2c 23 5f  |NE tfz_target,#_|
00001360  73 77 65 64 65 25 0d 08  8e 2e 4c 44 52 20 74 66  |swede%....LDR tf|
00001370  7a 5f 74 61 62 6c 65 70  74 72 2c 5b 6d 61 69 6e  |z_tableptr,[main|
00001380  76 61 72 73 2c 23 76 61  72 73 5f 7a 61 70 74 61  |vars,#vars_zapta|
00001390  62 6c 65 5d 0d 08 98 4d  41 44 44 20 74 66 7a 5f  |ble]...MADD tfz_|
000013a0  74 61 62 6c 65 70 74 72  2c 74 66 7a 5f 74 61 62  |tableptr,tfz_tab|
000013b0  6c 65 70 74 72 2c 52 31  2c 4c 53 4c 20 23 34 20  |leptr,R1,LSL #4 |
000013c0  3b 20 34 2d 64 69 72 20  2a 20 34 2d 62 79 74 65  |; 4-dir * 4-byte|
000013d0  73 20 66 6f 72 20 65 61  63 68 20 73 71 75 61 72  |s for each squar|
000013e0  65 0d 08 a2 25 4c 44 52  20 67 72 69 64 70 74 72  |e...%LDR gridptr|
000013f0  2c 5b 6d 61 69 6e 76 61  72 73 2c 23 76 61 72 73  |,[mainvars,#vars|
00001400  5f 67 72 69 64 5d 0d 08  ac 04 0d 08 b6 15 4d 4f  |_grid]........MO|
00001410  56 20 74 66 7a 5f 72 65  73 75 6c 74 2c 23 30 0d  |V tfz_result,#0.|
00001420  08 c0 16 4d 4f 56 20 74  66 7a 5f 64 69 72 6c 6f  |...MOV tfz_dirlo|
00001430  6f 70 2c 23 34 0d 08 ca  37 2e 74 66 7a 5f 6c 6f  |op,#4...7.tfz_lo|
00001440  6f 70 20 20 20 20 3b 20  52 31 20 6d 75 73 74 20  |op    ; R1 must |
00001450  62 65 20 6d 61 69 6e 74  61 69 6e 65 64 20 75 6e  |be maintained un|
00001460  74 69 6c 20 74 66 7a 5f  6c 6f 6f 70 0d 08 d4 39  |til tfz_loop...9|
00001470  4c 44 52 42 20 52 31 2c  5b 74 66 7a 5f 74 61 62  |LDRB R1,[tfz_tab|
00001480  6c 65 70 74 72 5d 3a 43  4d 50 53 20 52 30 2c 23  |leptr]:CMPS R0,#|
00001490  32 35 35 3a 42 45 51 20  74 66 7a 5f 6e 75 6c 6c  |255:BEQ tfz_null|
000014a0  5f 6c 6f 6f 70 0d 08 de  37 4c 44 52 42 20 52 30  |_loop...7LDRB R0|
000014b0  2c 5b 62 6f 61 72 64 70  74 72 2c 52 31 5d 20 3b  |,[boardptr,R1] ;|
000014c0  20 74 79 70 65 20 6f 66  20 70 69 65 63 65 20 69  | type of piece i|
000014d0  6e 20 74 68 65 20 6d 69  64 64 6c 65 0d 08 e8 20  |n the middle... |
000014e0  43 4d 50 53 20 52 30 2c  23 5f 6b 69 6e 67 25 3a  |CMPS R0,#_king%:|
000014f0  42 45 51 20 74 66 7a 5f  6b 69 6e 67 0d 08 f2 28  |BEQ tfz_king...(|
00001500  43 4d 50 53 20 52 30 2c  74 66 7a 5f 74 61 72 67  |CMPS R0,tfz_targ|
00001510  65 74 3a 42 4e 45 20 74  66 7a 5f 6e 75 6c 6c 5f  |et:BNE tfz_null_|
00001520  6c 6f 6f 70 0d 08 fc 04  0d 09 06 1d 4c 44 52 42  |loop........LDRB|
00001530  20 52 30 2c 5b 74 66 7a  5f 74 61 62 6c 65 70 74  | R0,[tfz_tablept|
00001540  72 2c 23 31 5d 0d 09 10  57 4c 44 52 42 20 52 30  |r,#1]...WLDRB R0|
00001550  2c 5b 62 6f 61 72 64 70  74 72 2c 52 30 5d 3a 43  |,[boardptr,R0]:C|
00001560  4d 50 53 20 52 30 2c 74  66 7a 5f 6d 6f 76 65 3a  |MPS R0,tfz_move:|
00001570  42 4e 45 20 74 66 7a 5f  6e 75 6c 6c 5f 6c 6f 6f  |BNE tfz_null_loo|
00001580  70 20 3b 20 6e 6f 20 70  61 69 72 20 6f 70 70 6f  |p ; no pair oppo|
00001590  73 69 74 65 20 74 6f 20  74 61 6b 65 0d 09 1a 04  |site to take....|
000015a0  0d 09 24 20 2e 74 66 7a  5f 7a 61 70 20 20 20 20  |..$ .tfz_zap    |
000015b0  20 3b 20 20 52 31 20 73  74 69 6c 6c 20 73 65 74  | ;  R1 still set|
000015c0  0d 09 2e 23 41 44 44 20  52 31 2c 52 31 2c 23 31  |...#ADD R1,R1,#1|
000015d0  20 3b 20 73 71 75 61 72  65 20 74 6f 20 6b 69 6c  | ; square to kil|
000015e0  6c 2b 31 0d 09 38 42 41  44 44 20 74 66 7a 5f 72  |l+1..8BADD tfz_r|
000015f0  65 73 75 6c 74 2c 52 31  2c 74 66 7a 5f 72 65 73  |esult,R1,tfz_res|
00001600  75 6c 74 2c 4c 53 4c 20  23 38 20 20 3b 20 69 6e  |ult,LSL #8  ; in|
00001610  73 65 72 74 20 69 6e 74  6f 20 62 6f 74 74 6f 6d  |sert into bottom|
00001620  20 62 79 74 65 0d 09 42  04 0d 09 4c 12 2e 74 66  | byte..B...L..tf|
00001630  7a 5f 6e 75 6c 6c 5f 6c  6f 6f 70 0d 09 56 24 41  |z_null_loop..V$A|
00001640  44 44 20 74 66 7a 5f 74  61 62 6c 65 70 74 72 2c  |DD tfz_tableptr,|
00001650  74 66 7a 5f 74 61 62 6c  65 70 74 72 2c 23 34 0d  |tfz_tableptr,#4.|
00001660  09 60 32 53 55 42 53 20  74 66 7a 5f 64 69 72 6c  |.`2SUBS tfz_dirl|
00001670  6f 6f 70 2c 74 66 7a 5f  64 69 72 6c 6f 6f 70 2c  |oop,tfz_dirloop,|
00001680  23 31 20 3a 20 42 4e 45  20 74 66 7a 5f 6c 6f 6f  |#1 : BNE tfz_loo|
00001690  70 0d 09 6a 04 0d 09 74  32 4d 4f 56 20 52 30 2c  |p..j...t2MOV R0,|
000016a0  74 66 7a 5f 72 65 73 75  6c 74 20 3a 20 4c 44 4d  |tfz_result : LDM|
000016b0  46 44 20 28 73 74 61 63  6b 29 21 2c 7b 52 31 2d  |FD (stack)!,{R1-|
000016c0  52 31 30 2c 50 43 7d 0d  09 7e 04 0d 09 88 3d 2e  |R10,PC}..~....=.|
000016d0  74 66 7a 5f 6e 75 6c 6c  5f 72 65 73 75 6c 74 20  |tfz_null_result |
000016e0  3a 20 4d 4f 56 20 52 30  2c 23 30 20 3a 20 4c 44  |: MOV R0,#0 : LD|
000016f0  4d 46 44 20 28 73 74 61  63 6b 29 21 2c 7b 52 31  |MFD (stack)!,{R1|
00001700  2d 52 31 30 2c 50 43 7d  0d 09 92 04 0d 09 9c 0d  |-R10,PC}........|
00001710  2e 74 66 7a 5f 6b 69 6e  67 0d 09 a6 2e 43 4d 50  |.tfz_king....CMP|
00001720  53 20 74 66 7a 5f 74 61  72 67 65 74 2c 23 5f 73  |S tfz_target,#_s|
00001730  77 65 64 65 25 3a 42 4e  45 20 74 66 7a 5f 6e 75  |wede%:BNE tfz_nu|
00001740  6c 6c 5f 6c 6f 6f 70 0d  09 b0 3e 3b 20 6b 69 6e  |ll_loop...>; kin|
00001750  67 20 72 65 71 75 69 72  65 73 20 34 20 61 74 74  |g requires 4 att|
00001760  61 63 6b 65 72 73 2c 20  62 75 74 20 74 68 65 73  |ackers, but thes|
00001770  65 20 6d 61 79 20 62 65  20 63 61 6d 70 20 73 71  |e may be camp sq|
00001780  75 61 72 65 73 0d 09 ba  04 0d 09 c4 1d 4c 44 52  |uares........LDR|
00001790  42 20 52 30 2c 5b 74 66  7a 5f 74 61 62 6c 65 70  |B R0,[tfz_tablep|
000017a0  74 72 2c 23 31 5d 0d 09  ce 18 4c 44 52 42 20 52  |tr,#1]....LDRB R|
000017b0  31 2c 5b 67 72 69 64 70  74 72 2c 52 30 5d 0d 09  |1,[gridptr,R0]..|
000017c0  d8 4e 4c 44 52 42 20 52  30 2c 5b 62 6f 61 72 64  |.NLDRB R0,[board|
000017d0  70 74 72 2c 52 30 5d 3a  43 4d 50 53 20 52 30 2c  |ptr,R0]:CMPS R0,|
000017e0  74 66 7a 5f 6d 6f 76 65  3a 43 4d 50 4e 45 53 20  |tfz_move:CMPNES |
000017f0  52 31 2c 23 5f 63 61 6d  70 25 3a 42 4e 45 20 74  |R1,#_camp%:BNE t|
00001800  66 7a 5f 6e 75 6c 6c 5f  6c 6f 6f 70 0d 09 e2 04  |fz_null_loop....|
00001810  0d 09 ec 47 4c 44 52 42  20 52 30 2c 5b 74 66 7a  |...GLDRB R0,[tfz|
00001820  5f 74 61 62 6c 65 70 74  72 2c 23 32 5d 3a 43 4d  |_tableptr,#2]:CM|
00001830  50 53 20 52 30 2c 23 32  35 35 3a 42 45 51 20 74  |PS R0,#255:BEQ t|
00001840  66 7a 5f 6e 75 6c 6c 5f  6c 6f 6f 70 20 3b 20 6e  |fz_null_loop ; n|
00001850  6f 20 73 69 64 65 73 0d  09 f6 18 4c 44 52 42 20  |o sides....LDRB |
00001860  52 31 2c 5b 67 72 69 64  70 74 72 2c 52 30 5d 0d  |R1,[gridptr,R0].|
00001870  0a 00 4e 4c 44 52 42 20  52 30 2c 5b 62 6f 61 72  |..NLDRB R0,[boar|
00001880  64 70 74 72 2c 52 30 5d  3a 43 4d 50 53 20 52 30  |dptr,R0]:CMPS R0|
00001890  2c 74 66 7a 5f 6d 6f 76  65 3a 43 4d 50 4e 45 53  |,tfz_move:CMPNES|
000018a0  20 52 31 2c 23 5f 63 61  6d 70 25 3a 42 4e 45 20  | R1,#_camp%:BNE |
000018b0  74 66 7a 5f 6e 75 6c 6c  5f 6c 6f 6f 70 0d 0a 0a  |tfz_null_loop...|
000018c0  04 0d 0a 14 1d 4c 44 52  42 20 52 30 2c 5b 74 66  |.....LDRB R0,[tf|
000018d0  7a 5f 74 61 62 6c 65 70  74 72 2c 23 33 5d 0d 0a  |z_tableptr,#3]..|
000018e0  1e 18 4c 44 52 42 20 52  31 2c 5b 67 72 69 64 70  |..LDRB R1,[gridp|
000018f0  74 72 2c 52 30 5d 0d 0a  28 4e 4c 44 52 42 20 52  |tr,R0]..(NLDRB R|
00001900  30 2c 5b 62 6f 61 72 64  70 74 72 2c 52 30 5d 3a  |0,[boardptr,R0]:|
00001910  43 4d 50 53 20 52 30 2c  74 66 7a 5f 6d 6f 76 65  |CMPS R0,tfz_move|
00001920  3a 43 4d 50 4e 45 53 20  52 31 2c 23 5f 63 61 6d  |:CMPNES R1,#_cam|
00001930  70 25 3a 42 4e 45 20 74  66 7a 5f 6e 75 6c 6c 5f  |p%:BNE tfz_null_|
00001940  6c 6f 6f 70 0d 0a 32 04  0d 0a 3c 3a 4c 44 52 42  |loop..2...<:LDRB|
00001950  20 52 31 2c 5b 74 66 7a  5f 74 61 62 6c 65 70 74  | R1,[tfz_tablept|
00001960  72 5d 20 20 3b 20 20 73  71 75 61 72 65 20 74 68  |r]  ;  square th|
00001970  61 74 20 74 68 65 20 63  68 69 65 66 20 69 73 20  |at the chief is |
00001980  69 6e 0d 0a 46 0d 42 20  74 66 7a 5f 7a 61 70 0d  |in..F.B tfz_zap.|
00001990  0a 50 05 5d 0d 0a 5a 05  ed 0d 0a 64 05 e1 0d 0a  |.P.]..Z....d....|
000019a0  6e 04 0d 0a 78 04 0d 0a  82 04 0d 0a 8c 04 0d 0a  |n...x...........|
000019b0  96 04 0d 0a a0 16 dd f2  67 65 6e 65 72 61 74 65  |........generate|
000019c0  7a 61 70 74 61 62 6c 65  0d 0a aa 21 ea 20 78 25  |zaptable...!. x%|
000019d0  2c 79 25 2c 64 69 72 25  2c 20 20 72 78 25 2c 20  |,y%,dir%,  rx%, |
000019e0  72 79 25 2c 20 70 74 72  25 0d 0a b4 14 de 20 64  |ry%, ptr%..... d|
000019f0  78 25 28 33 29 2c 20 64  79 25 28 33 29 0d 0a be  |x%(3), dy%(3)...|
00001a00  16 de 20 7a 61 70 74 61  62 6c 65 25 20 38 32 2a  |.. zaptable% 82*|
00001a10  34 2a 34 0d 0a c8 04 0d  0a d2 4d 64 78 25 28 29  |4*4.......Mdx%()|
00001a20  3d 30 3a 64 79 25 28 29  3d 30 3a 64 78 25 28 30  |=0:dy%()=0:dx%(0|
00001a30  29 3d 31 3a 64 79 25 28  31 29 3d 31 3a 64 78 25  |)=1:dy%(1)=1:dx%|
00001a40  28 32 29 3d 2d 31 3a 64  79 25 28 33 29 3d 2d 31  |(2)=-1:dy%(3)=-1|
00001a50  20 3a f4 20 63 6c 6f 63  6b 77 69 73 65 20 66 72  | :. clockwise fr|
00001a60  6f 6d 20 52 0d 0a dc 12  70 74 72 25 3d 7a 61 70  |om R....ptr%=zap|
00001a70  74 61 62 6c 65 25 0d 0a  e6 04 0d 0a f0 0e e3 20  |table%......... |
00001a80  79 25 3d 30 20 b8 20 38  0d 0a fa 0e e3 20 78 25  |y%=0 . 8..... x%|
00001a90  3d 30 20 b8 20 38 0d 0b  04 10 e3 20 64 69 72 25  |=0 . 8..... dir%|
00001aa0  3d 30 20 b8 20 33 0d 0b  0e 29 72 78 25 3d 78 25  |=0 . 3...)rx%=x%|
00001ab0  2b 32 2a 64 78 25 28 64  69 72 25 29 3a 72 79 25  |+2*dx%(dir%):ry%|
00001ac0  3d 79 25 2b 32 2a 64 79  25 28 64 69 72 25 29 0d  |=y%+2*dy%(dir%).|
00001ad0  0b 18 25 e7 20 72 78 25  3c 30 20 84 20 72 78 25  |..%. rx%<0 . rx%|
00001ae0  3e 38 20 84 20 72 79 25  3c 30 20 84 20 72 79 25  |>8 . ry%<0 . ry%|
00001af0  3e 38 20 8c 0d 0b 22 0c  21 70 74 72 25 3d 2d 31  |>8 ...".!ptr%=-1|
00001b00  0d 0b 2c 05 cc 0d 0b 36  27 3f 70 74 72 25 3d 78  |..,....6'?ptr%=x|
00001b10  25 2b 64 78 25 28 64 69  72 25 29 2b 39 2a 28 79  |%+dx%(dir%)+9*(y|
00001b20  25 2b 64 79 25 28 64 69  72 25 29 29 0d 0b 40 14  |%+dy%(dir%))..@.|
00001b30  70 74 72 25 3f 31 3d 72  78 25 2b 39 2a 72 79 25  |ptr%?1=rx%+9*ry%|
00001b40  0d 0b 4a 04 0d 0b 54 1c  f4 20 6e 6f 77 20 73 65  |..J...T.. now se|
00001b50  74 20 74 68 65 20 73 69  64 65 20 6c 6f 62 65 73  |t the side lobes|
00001b60  0d 0b 5e 21 72 78 25 2d  3d 64 78 25 28 64 69 72  |..^!rx%-=dx%(dir|
00001b70  25 29 3a 72 79 25 2d 3d  64 79 25 28 64 69 72 25  |%):ry%-=dy%(dir%|
00001b80  29 0d 0b 68 04 0d 0b 72  59 e7 20 a4 6f 6b 28 72  |)..h...rY. .ok(r|
00001b90  78 25 2b 64 79 25 28 64  69 72 25 29 29 20 80 20  |x%+dy%(dir%)) . |
00001ba0  a4 6f 6b 28 72 78 25 2d  64 79 25 28 64 69 72 25  |.ok(rx%-dy%(dir%|
00001bb0  29 29 20 80 20 a4 6f 6b  28 72 79 25 2b 64 78 25  |)) . .ok(ry%+dx%|
00001bc0  28 64 69 72 25 29 29 20  80 20 a4 6f 6b 28 72 79  |(dir%)) . .ok(ry|
00001bd0  25 2d 64 78 25 28 64 69  72 25 29 29 20 8c 0d 0b  |%-dx%(dir%)) ...|
00001be0  7c 2c 70 74 72 25 3f 32  3d 28 72 78 25 2b 64 79  ||,ptr%?2=(rx%+dy|
00001bf0  25 28 64 69 72 25 29 29  2b 39 2a 28 72 79 25 2b  |%(dir%))+9*(ry%+|
00001c00  64 78 25 28 64 69 72 25  29 29 0d 0b 86 2c 70 74  |dx%(dir%))...,pt|
00001c10  72 25 3f 33 3d 28 72 78  25 2d 64 79 25 28 64 69  |r%?3=(rx%-dy%(di|
00001c20  72 25 29 29 2b 39 2a 28  72 79 25 2d 64 78 25 28  |r%))+9*(ry%-dx%(|
00001c30  64 69 72 25 29 29 0d 0b  90 05 cc 0d 0b 9a 19 70  |dir%)).........p|
00001c40  74 72 25 3f 32 3d 32 35  35 3a 70 74 72 25 3f 33  |tr%?2=255:ptr%?3|
00001c50  3d 32 35 35 0d 0b a4 05  cd 0d 0b ae 05 cd 0d 0b  |=255............|
00001c60  b8 0b 70 74 72 25 2b 3d  34 0d 0b c2 05 ed 0d 0b  |..ptr%+=4.......|
00001c70  cc 05 ed 0d 0b d6 05 ed  0d 0b e0 50 f4 20 4f 53  |...........P. OS|
00001c80  43 4c 49 28 22 53 41 56  45 20 3c 48 6e 65 66 74  |CLI("SAVE <Hneft|
00001c90  61 66 6c 24 44 69 72 3e  2e 54 61 62 6c 65 54 65  |afl$Dir>.TableTe|
00001ca0  73 74 20 22 2b 53 54 52  24 7e 28 7a 61 70 74 61  |st "+STR$~(zapta|
00001cb0  62 6c 65 25 29 2b 22 2b  22 2b 53 54 52 24 7e 28  |ble%)+"+"+STR$~(|
00001cc0  38 32 2a 34 2a 34 29 29  0d 0b ea 05 e1 0d 0b f4  |82*4*4))........|
00001cd0  05 3a 0d 0b fe 05 3a 0d  0c 08 0c dd a4 6f 6b 28  |.:....:......ok(|
00001ce0  78 25 29 0d 0c 12 17 e7  20 78 25 3e 3d 30 20 80  |x%)..... x%>=0 .|
00001cf0  20 78 25 3c 39 20 8c 20  3d b9 0d 0c 1c 06 3d a3  | x%<9 . =.....=.|
00001d00  0d 0c 26 05 3a 0d 0c 30  05 3a 0d 0c 3a 04 0d 0c  |..&.:..0.:..:...|
00001d10  44 04 0d 0c 4e 04 0d 0c  58 04 0d ff              |D...N...X...|
00001d1c