SE3K Survivors Experience 3000

MAGICAL LABYRINTH FULL

SC-3000 BASIC Level III-B — part of the SE3K documentation library, also readable inside the emulator.

1 GOTO 1000
110 AW=&H2BB3
111 WV=&H2BB6
112 RA=&H2BB9
113 RV=&H2BBC
114 VDPWRREG=&H2BAD
120 DSPGRP=&H39E2
121 SCRINIT=&H39DF
122 LEADSR=&H3A00
123 BYTERD=&H3A06
130 KR=&H4A00
131 SP=&H4A12
132 NS=&H4A15
133 CS=&H4A18
140 K4=&H9464
141 K5=&H9465
142 K6=&H9466
143 KC=&H9468
150 MP=&HC880
151 MR=&HC888
210 RESTORE 240:FOR I=0 TO 12
220 READ B:POKE &HC070+I,B
230 NEXT I
240 DATA &H2A,&H80,&HC8,&HCD,&HB3,&H2B,&H3A,&H82,&HC8,&HCD,&HB6,&H2B,&HC9
310 RESTORE 340:FOR I=0 TO 12
320 READ B:POKE &HC090+I,B
330 NEXT I
340 DATA &H2A,&H80,&HC8,&HCD,&HB9,&H2B,&HCD,&HBC,&H2B,&H32,&H88,&HC8,&HC9
400 IF PEEK(&HC070)<>42  THEN PRINT "ERROR VRAM_WRITE": STOP
410 IF PEEK(&HC090)<>42  THEN PRINT "ERROR VRAM_READ":  STOP
420 PRINT "ML routines ready in RAM"
500 CALL &H39DF
510 CALL &H39E2
520 PRINT "Screen Mode 2 active"
600 VA=&H3800
610 POKE MP,VA AND 255
620 POKE MP+1,INT(VA/256)
630 POKE MP+2,1
640 CALL &HC070
650 PRINT "Written char 1 to VRAM $3800"
700 POKE MP,VA AND 255
710 POKE MP+1,INT(VA/256)
720 CALL &HC090
730 RB=PEEK(MR)
740 PRINT "Read back from VRAM: "; RB
750 IF RB=1 THEN PRINT "OK!" ELSE PRINT "ERROR -- expected 1"
800 FB=PEEK(&H8166) + 256*PEEK(&H8167)
810 FE=PEEK(&H8168) + 256*PEEK(&H8169)
820 PRINT "Free BASIC RAM: "; FE-FB; " bytes"
825 IF FB > 32767 THEN FB = FB - 65536
826 IF FE > 32767 THEN FE = FE - 65536
830 PRINT "From $"; HEX$(FB); " to $"; HEX$(FE)
840 PRINT "ML used: $C000-$C09D (158 bytes)"
900 END
1000 CALL &H39DF
1010 CALL &H39E2
1020 PRINT "MAGICAL LABYRINTH"
1030 PRINT "Loading ML routines..."
1040 GOSUB 1300
1050 GOSUB 2000
1060 GOSUB 2200
1065 PRINT "Load graphics from tape: press PLAY"
1070 FOR BL=1 TO 7:CALL &HC032
1072 IF PEEK(&HC888)=1 THEN PRINT "TAPE ERROR BLOCK";BL:STOP
1074 NEXT BL
1080 GOSUB 3000
1090 GOSUB 3400
1100 GOSUB 3800
1110 GOSUB 7000
1120 GOSUB 7300
1130 GOSUB 7500
1140 GOSUB 7600
1150 GOSUB 9000
1160 GOSUB 5000
1200 GOSUB 5200
1210 GOSUB 11100
1220 GOSUB 11300
1230 GOSUB 11400
1280 GOTO 19000
1290 REM ch1 setup (skipped by "1 GOTO 1000"): constants + VRAM_WRITE/READ
1300 AW=&H2BB3:WV=&H2BB6:RA=&H2BB9:RV=&H2BBC:VDPWRREG=&H2BAD
1301 DSPGRP=&H39E2:SCRINIT=&H39DF:LEADSR=&H3A00:BYTERD=&H3A06
1302 KR=&H4A00:SP=&H4A12:NS=&H4A15:CS=&H4A18
1303 K4=&H9464:K5=&H9465:K6=&H9466:KC=&H9468
1304 MP=&HC880:MR=&HC888
1310 RESTORE 1320:FOR I=0 TO 12:READ B:POKE &HC070+I,B:NEXT I
1320 DATA &H2A,&H80,&HC8,&HCD,&HB3,&H2B,&H3A,&H82,&HC8,&HCD,&HB6,&H2B,&HC9
1325 RESTORE 1330:FOR I=0 TO 12:READ B:POKE &HC090+I,B:NEXT I
1330 DATA &H2A,&H80,&HC8,&HCD,&HB9,&H2B,&HCD,&HBC,&H2B,&H32,&H88,&HC8,&HC9
1335 RETURN
2000 REM entry: load BINLOADER ML into $C000
2010 RESTORE 2040:FOR I=0 TO 49
2020 READ B:POKE &HC000+I,B
2030 NEXT I
2040 DATA &HCD,&H00,&H3A,&HCD,&H06,&H3A,&H6F,&HCD,&H06,&H3A
2050 DATA &H67,&HCD,&H06,&H3A,&H4F,&HCD,&H06,&H3A,&H47,&H1E
2060 DATA &H00,&HCD,&H06,&H3A,&H77,&H83,&H5F,&H23,&H0B,&H78
2070 DATA &HB1,&H20,&HF4,&HCD,&H06,&H3A,&HBB,&H28,&H06,&H3E
2080 DATA &H01,&H32,&H88,&HC8,&HC9,&HAF,&H32,&H88,&HC8,&HC9
2090 IF PEEK(&HC000)<>205 THEN PRINT "ERROR BINLOADER": STOP
2100 PRINT "BINLOADER ready at $C000 (50 bytes)"
2200 REM entry: load VRAMLOADER ML into $C032
2210 RESTORE 2240:FOR I=0 TO 53
2220 READ B:POKE &HC032+I,B
2230 NEXT I
2240 DATA &HCD,&H00,&H3A,&HCD,&H06,&H3A,&H6F,&HCD,&H06,&H3A
2250 DATA &H67,&HCD,&HB3,&H2B,&HCD,&H06,&H3A,&H4F,&HCD,&H06
2260 DATA &H3A,&H47,&H1E,&H00,&HCD,&H06,&H3A,&HCD,&HB6,&H2B
2270 DATA &HAB,&H5F,&H0B,&H78,&HB1,&H20,&HF3,&HCD,&H06,&H3A
2280 DATA &HAB,&H28,&H06,&H3E,&H01,&H32,&H88,&HC8,&HC9,&HAF
2290 DATA &H32,&H88,&HC8,&HC9
2300 IF PEEK(&HC032)<>205 THEN PRINT "ERROR VRAMLOADER": STOP
2310 PRINT "VRAMLOADER ready at $C032 (54 bytes)"
2400 POKE &HC888,255
2410 PRINT "Press PLAY on the tape recorder..."
2420 CALL &HC000
2430 IF PEEK(&HC888)=1 THEN PRINT "ML CHECKSUM ERROR": RETURN
2440 PRINT "ML block loaded OK"
2450 RETURN
2500 POKE &HC888,255
2510 PRINT "Press PLAY (graphics block)..."
2520 CALL &HC032
2530 IF PEEK(&HC888)=1 THEN PRINT "VRAM CHECKSUM ERROR": RETURN
2540 PRINT "Graphics data in VRAM OK"
2550 RETURN
2600 REM -- load all 5 blocks: BINLOADER x3 (RAM), VRAMLOADER x2 (VRAM) --
2610 GOSUB 2400:IF PEEK(&HC888)=1 THEN STOP
2630 GOSUB 2400:IF PEEK(&HC888)=1 THEN STOP
2650 GOSUB 2400:IF PEEK(&HC888)=1 THEN STOP
2670 GOSUB 2500:IF PEEK(&HC888)=1 THEN STOP
2690 GOSUB 2500:IF PEEK(&HC888)=1 THEN STOP
2700 PRINT "All blocks loaded."
2710 RETURN
3000 CW=1
3001 CT=2
3002 W1=&H12
3003 W2=&HE2
3004 W3=&HB2
3400 REM entry: load RENDER_TILE ML
3410 RESTORE 3440:FOR I=0 TO 97
3420 READ B:POKE &HC400+I,B
3430 NEXT I
3440 DATA &H3A,&H80,&HC8,&H57,&H87,&H82,&HC6,&H01,&H6F,&H26
3450 DATA &H00,&H29,&H29,&H29,&H29,&H29,&H3A,&H81,&HC8,&H57
3460 DATA &H87,&H82,&HC6,&H02,&H5F,&H19,&HCD,&HB3,&H2B,&H3A
3470 DATA &H82,&HC8,&H47,&H3E,&H01,&HCD,&HB6,&H2B,&HCB,&H40
3480 DATA &H28,&H04,&H3E,&H02,&H18,&H02,&H3E,&H01,&HCD,&HB6
3490 DATA &H2B,&H3E,&H01,&HCD,&HB6,&H2B,&H3E,&H02,&HCD,&HB6,&H2B
3500 DATA &HCB,&H58,&H28,&H04,&H3E,&H02,&H18,&H02,&H3E,&H01
3510 DATA &HCD,&HB6,&H2B,&H3E,&H02,&HCD,&HB6,&H2B,&HCB,&H50
3520 DATA &H28,&H04,&H3E,&H02,&H18,&H02,&H3E,&H01,&HCD,&HB6,&H2B
3530 DATA &H3E,&H01,&HCD,&HB6,&H2B,&HC9
3540 IF PEEK(&HC400)<>58 THEN PRINT "ERROR RENDER_TILE": STOP
3550 PRINT "RENDER_TILE ready at $C400"
3600 POKE &HC880,0
3610 POKE &HC881,0
3620 POKE &HC882,5
3630 POKE &HC883,0
3640 CALL &HC400
3650 PRINT "Straight N-S tile drawn at (0,0)"
3670 POKE &HC880,2
3680 POKE &HC881,2
3690 POKE &HC882,6
3700 POKE &HC883,5
3710 CALL &HC400
3720 PRINT "Curve tile with treasure at (2,2)"
3800 REM entry: load RENDER_BOARD ML
3810 RESTORE 3840:FOR I=0 TO 31
3820 READ B:POKE &HC480+I,B
3830 NEXT I
3840 DATA &H3E,&H00,&H32,&H80,&HC8,&H06,&H07,&H3E,&H00,&H32
3850 DATA &H81,&HC8,&H21,&HA0,&HC8,&H06,&H07,&H7E,&H32,&H82
3860 DATA &HC8,&H23,&H7E,&H32,&H83,&HC8,&HCD,&H00,&HC4,&H10
3870 DATA &HF3,&HC9
3880 IF PEEK(&HC480)<>62 THEN PRINT "ERROR RENDER_BOARD": STOP
3890 PRINT "RENDER_BOARD ready at $C480"
3910 FOR I=0 TO 97:POKE &HC8A0+I,0:NEXT I
3930 FOR R=0 TO 6
3940 FOR C=0 TO 6
3950 POKE &HC8A0+(R*7+C)*2,5
3960 POKE &HC8A0+(R*7+C)*2+1,0
3970 NEXT C
3980 NEXT R
4000 POKE &HC8A0+0,6
4010 POKE &HC8A0+12,12
4020 POKE &HC8A0+84,3
4030 POKE &HC8A0+96,9
4100 CALL &HC480
4110 PRINT "Complete board drawn (49 tiles)"
4200 POKE &HC880,TR:POKE &HC881,TC
4210 POKE &HC882,TO:POKE &HC883,TT
4220 CALL &HC400
4230 RETURN
5000 REM entry: load JOY_READ ML
5010 RESTORE 5040:FOR I=0 TO 63
5020 READ B:POKE &HC800+I,B
5030 NEXT I
5040 DATA &HCD,&H00,&H4A,&H06,&H00,&H3A,&H66,&H94,&HCB,&H77
5050 DATA &H20,&H02,&HCB,&HC0,&H3A,&H64,&H94,&HCB,&H6F,&H20
5060 DATA &H02,&HCB,&HC8,&H3A,&H65,&H94,&HCB,&H6F,&H20,&H02
5070 DATA &HCB,&HD0,&H3A,&H66,&H94,&HCB,&H6F,&H20,&H02,&HCB
5080 DATA &HD8,&H3A,&H68,&H94,&HCB,&H47,&H20,&H02,&HCB,&HE0
5090 DATA &H3A,&H68,&H94,&HCB,&H57,&H20,&H02,&HCB,&HE8,&H78
5100 DATA &H32,&H88,&HC8,&HC9
5110 IF PEEK(&HC800)<>205 THEN PRINT "ERROR JOY_READ": STOP
5120 PRINT "JOY_READ ready at $C800 (64 bytes)"
5200 REM entry: load KEY_REPEAT ML
5210 RESTORE 5240:FOR I=0 TO 47
5220 READ B:POKE &HC840+I,B
5230 NEXT I
5240 DATA &H3A,&H89,&HC8,&H32,&H8A,&HC8,&H3A,&H88,&HC8,&H4F
5250 DATA &H32,&H89,&HC8,&H3A,&H8A,&HC8,&H2F,&HA1,&H32,&H88
5260 DATA &HC8,&H3A,&H8B,&HC8,&HFE,&H00,&H28,&H0C,&H3A,&H8C
5270 DATA &HC8,&H3C,&H32,&H8C,&HC8,&H3A,&H8C,&HC8,&H3A,&H8D
5280 DATA &HC8,&HB8,&H30,&H03,&H32,&H88,&HC8,&HC9
5300 POKE &HC88C,20
5310 POKE &HC88D,6
5320 POKE &HC889,0
5330 POKE &HC88B,0
5340 IF PEEK(&HC840)<>58 THEN PRINT "ERROR KEY_REPEAT": STOP
5350 PRINT "KEY_REPEAT ready at $C840 (48 bytes)"
5500 CALL &HC800
5510 CALL &HC840
5520 JP=PEEK(&HC888)
5530 JU=(JP AND 1)
5540 JD=(JP AND 2)/2
5550 JS=(JP AND 4)/4
5560 JR=(JP AND 8)/8
5570 JF=(JP AND 16)/16
5580 JG=(JP AND 32)/32
5590 RETURN
5600 PRINT "Joystick test - move and press buttons (FIRE2 to exit)"
5610 JG=0
5620 GOSUB 5500
5630 IF JU=1 THEN PRINT "UP"
5640 IF JD=1 THEN PRINT "DOWN"
5650 IF JS=1 THEN PRINT "LEFT"
5660 IF JR=1 THEN PRINT "RIGHT"
5670 IF JF=1 THEN PRINT "FIRE1"
5680 IF JG=1 THEN 5700
5690 GOTO 5620
5700 PRINT "Test complete"
5810 IP=0
5820 IR=0
5830 IB=255
5850 IF JR=1 OR JD=1 THEN GOSUB 5900:RETURN
5860 IF JS=1 OR JU=1 THEN GOSUB 5950:RETURN
5870 IF JG=1 THEN IR=(IR+1) MOD 4:RETURN
5880 RETURN
5900 REM entry: cursor step forward (joystick right/down)
5910 IP=(IP+1) MOD 12
5920 IF IP=IB THEN IP=(IP+1) MOD 12
5930 RETURN
5950 REM entry: cursor step back (joystick left/up)
5960 IP=(IP+11) MOD 12
5970 IF IP=IB THEN IP=(IP+11) MOD 12
5980 RETURN
6010 FOR S=1 TO 7
6020 NR=(CR+7-S) MOD 7
6030 IF PEEK(&HC904+NR*7+CC)=1 THEN CR=NR:RETURN
6040 NEXT S
6050 RETURN
6070 FOR S=1 TO 7
6080 NR=(CR+S) MOD 7
6090 IF PEEK(&HC904+NR*7+CC)=1 THEN CR=NR:RETURN
6100 NEXT S
6110 RETURN
6130 FOR S=1 TO 7
6140 NC=(CC+7-S) MOD 7
6150 IF PEEK(&HC904+CR*7+NC)=1 THEN CC=NC:RETURN
6160 NEXT S
6170 RETURN
6190 FOR S=1 TO 7
6200 NC=(CC+S) MOD 7
6210 IF PEEK(&HC904+CR*7+NC)=1 THEN CC=NC:RETURN
6220 NEXT S
6230 RETURN
7000 REM entry: load points/score table
7010 RESTORE 7060:FOR I=0 TO 47
7020 READ B:POKE &HC580+I,B
7030 NEXT I
7060 DATA &H01,&H00,&H00,&H01,&H01,&H00,&H00,&H03,&H01,&H00,&H00,&H05
7080 DATA &H00,&HFF,&H01,&H06,&H00,&HFF,&H03,&H06,&H00,&HFF,&H05,&H06
7100 DATA &HFF,&H00,&H06,&H05,&HFF,&H00,&H06,&H03,&HFF,&H00,&H06,&H01
7120 DATA &H00,&H01,&H05,&H00,&H00,&H01,&H03,&H00,&H00,&H01,&H01,&H00
7130 PRINT "Table of 12 points ready at $C580"
7200 RESTORE 7230:FOR I=0 TO 11
7210 READ B:POKE &HC5C0+I,B
7220 NEXT I
7230 DATA &H05,&H0A,&H05,&H0A
7240 DATA &H03,&H06,&H0C,&H09
7250 DATA &H07,&H0E,&H0D,&H0B
7260 PRINT "Rotation lookup at $C5C0"
7300 REM entry: load BOARD_PUSH ML
7310 RESTORE 7340:FOR I=0 TO 122
7320 READ B:POKE &HC500+I,B
7330 NEXT I
7340 DATA &H3A,&H80,&HC8,&H07,&H07,&H6F,&H26,&H00,&H11,&H80
7350 DATA &HC5,&H19,&H46,&H23,&H4E,&H23,&H56,&H23,&H5E,&H3A
7360 DATA &H86,&HC8,&H4E,&H21,&HC0,&HC5,&H19,&H7C,&H26,&H00
7370 DATA &H29,&H29,&H29,&H19,&H56,&H23,&H5E,&H3A,&H86,&HC8
7380 DATA &H46,&H3A,&H87,&HC8,&H4F,&H21,&HA0,&HC8,&H11,&H00
7390 DATA &H00,&H19,&H19,&H39,&H21,&HA0,&HC8,&H52,&H00,&H19
7400 DATA &H3E,&H00,&H19,&H01,&H07,&H00,&H7E,&H57,&H23,&H7E
7410 DATA &H5F,&H3A,&H85,&HC8,&H47,&H3A,&H86,&HC8,&H4F,&H3A
7420 DATA &H83,&HC8,&H77,&H23,&H78,&H77,&H7E,&H32,&H85,&HC8
7430 DATA &H23,&H7E,&H32,&H86,&HC8,&H7D,&H01,&H07,&H00,&H0B
7440 DATA &H78,&HB1,&H20,&HDA,&H3A,&H83,&HC8,&H32,&H86,&HC8
7450 DATA &H3A,&H84,&HC8,&H32,&H87,&HC8,&H3A,&H80,&HC8,&H32,&H88
7460 DATA &HC8,&HC9
7470 IF PEEK(&HC500)<>58 THEN PRINT "ERROR BOARD_PUSH": STOP
7480 PRINT "BOARD_PUSH ready at $C500 (123 bytes)"
7500 REM entry: load WAIT_VBLANK ML
7510 RESTORE 7540:FOR I=0 TO 6
7520 READ B:POKE &HC5E0+I,B
7530 NEXT I
7540 DATA &HDB,&HBF,&HCB,&H7F,&H28,&HFA,&HC9
7550 IF PEEK(&HC5E0)<>219 THEN PRINT "ERROR WAIT_VBLANK": STOP
7560 PRINT "WAIT_VBLANK ready at $C5E0"
7600 REM entry: load BFS_RUN ML
7610 RESTORE 7640:FOR I=0 TO 85
7620 READ B:POKE &HC600+I,B
7630 NEXT I
7640 DATA &H21,&H04,&HC9,&H06,&H31,&H36,&H00,&H23,&H10,&HFB
7650 DATA &H3A,&H80,&HC8,&H21,&H35,&HC9,&H77,&H23,&H3A,&H81
7660 DATA &HC8,&H77,&H21,&H85,&HC9,&H36,&H00,&H23,&H36,&H02
7670 DATA &H3A,&H85,&HC9,&H4F,&H3A,&H86,&HC9,&H47,&H78,&HB1
7680 DATA &H28,&H3E,&H21,&H35,&HC9,&H09,&H5E,&H23,&H56,&H23
7690 DATA &H53,&H23,&H4B,&H21,&H04,&HC9,&H09,&H36,&H01,&H3A
7700 DATA &H86,&HC9,&H3C,&H32,&H86,&HC9,&H21,&H35,&HC9,&H09
7710 DATA &H77,&H23,&H3A,&H80,&HC8,&H77,&H3A,&H85,&HC9,&H3C
7720 DATA &H32,&H85,&HC9,&H18,&HC3,&HC9
7730 IF PEEK(&HC600)<>33 THEN PRINT "ERROR BFS_RUN": STOP
7740 PRINT "BFS_RUN ready at $C600 (86 bytes)"
7800 REM entry: execute board push
7810 FOR I=0 TO NP-1
7820 POKE &HC909+I*2,PR(I)
7830 POKE &HC909+I*2+1,PC(I)
7840 NEXT I
7860 POKE &HC880,IP:POKE &HC881,IR:POKE &HC882,NP
7870 CALL &HC500
7890 FOR I=0 TO NP-1
7900 PR(I)=PEEK(&HC909+I*2)
7910 PC(I)=PEEK(&HC909+I*2+1)
7920 NEXT I
7940 IB=(IP+6) MOD 12
7950 POKE &HC908,IP
7970 FOR AF=1 TO 8
7980 CALL &HC480
7990 CALL &HC5E0
8000 NEXT AF
8020 POKE &HC880,PR(CU):POKE &HC881,PC(CU)
8030 CALL &HC600
8040 RETURN
8100 PRINT "Test: push point 0 (top col 1,downward)"
8110 IP=0:IR=0:NP=2
8120 PR(0)=0:PC(0)=0
8130 PR(1)=6:PC(1)=6
8140 CU=0
8150 GOSUB 7800
8160 PRINT "Push completed"
8170 CN=0
8180 FOR R=0 TO 6:FOR C=0 TO 6
8190 IF PEEK(&HC904+R*7+C)=1 THEN CN=CN+1
8200 NEXT C:NEXT R
8210 PRINT "Reachable cells from ("; PR(0); ","; PC(0); "): "; CN
9000 POKE &HC880,1
9010 POKE &HC881,&HC6
9070 RESTORE 9100:FOR I=0 TO 9
9080 READ B:POKE &HC0C0+I,B
9090 NEXT I
9100 DATA &H3A,&H81,&HC8,&H3A,&H80,&HC8,&HCD,&HAD,&H2B,&HC9
9110 CALL &HC0C0
9120 PRINT "16x16 sprites enabled"
9510 RESTORE 9540:FOR I=0 TO 40
9520 READ B:POKE &HC780+I,B
9530 NEXT I
9540 DATA &H3A,&H80,&HC8,&H3A,&H81,&HC8,&H57,&H3A,&H82,&HC8
9550 DATA &H5F,&H3A,&H80,&HC8,&HCD,&H12,&H4A,&H3A,&H80,&HC8
9560 DATA &H06,&H00,&H48,&HCD,&H15,&H4A,&H3A,&H80,&HC8
9570 DATA &H21,&H90,&HC8,&H01,&H00,&H00,&H09,&H4E,&HCD
9580 DATA &H18,&H4A,&HC9
9600 POKE &HC890,9
9610 POKE &HC891,7
9620 POKE &HC892,10
9630 POKE &HC893,3
9640 IF PEEK(&HC780)<>58 THEN PRINT "ERROR SPR_SET": STOP
9650 PRINT "SPR_SET ready at $C780 (41 bytes)"
9700 FOR I=0 TO NP-1
9710 POKE &HC880,I
9720 POKE &HC881,8+(PR(I)*24)+4-1
9730 POKE &HC882,16+(PC(I)*24)+4
9740 POKE &HC883,0
9750 CALL &HC780
9760 NEXT I
9780 FOR I=NP TO 4
9790 POKE &HC880,I
9800 POKE &HC881,&HD0
9810 POKE &HC882,0
9820 POKE &HC883,0
9830 CALL &HC780
9840 NEXT I
9850 RETURN
9900 DIM QR(11):DIM QC(11)
9920 FOR I=0 TO 2:QR(I)=0:QC(I)=3+I*4:NEXT I
9940 FOR I=0 TO 2:QR(I+3)=4+I*6:QC(I+3)=23:NEXT I
9960 FOR I=0 TO 2:QR(I+6)=22:QC(I+6)=11-I*4:NEXT I
9980 FOR I=0 TO 2:QR(I+9)=16-I*6:QC(I+9)=1:NEXT I
9990 PRINT "Arrow table ready"
10000 FOR I=0 TO 11
10010 FR=QR(I):FC=QC(I)
10020 IF I=IB THEN CH=193+(I\3):GOTO 10060
10030 IF I=IP  THEN CH=196+(I\3):GOTO 10060
10040 CH=192+(I\3)
10060 NA=&H3800+FR*32+FC
10070 POKE &HC880,NA AND 255
10080 POKE &HC881,NA\256
10090 POKE &HC882,CH
10100 CALL &HC070
10110 NEXT I
10120 RETURN
10210 FA=0:IP=0:IR=0:IB=255
10230 GOSUB 5500
10240 GOSUB 10000
10250 GOSUB 9700
10260 IF JR=1 OR JD=1 THEN GOSUB 5900:GOTO 10350
10270 IF JS=1 OR JU=1 THEN GOSUB 5950:GOTO 10350
10280 IF JG=1 THEN IR=(IR+1) MOD 4:GOSUB 17400:GOTO 10350
10290 IF JF=0 THEN 10350
10310 IF IP=IB THEN PRINT "BLOCKED":GOTO 10350
10320 GOSUB 7800
10330 CR=PR(CU):CC=PC(CU)
10340 FA=1
10350 CALL &HC5E0
10360 IF FA=0 THEN 10230
11000 PS=&H7F
11010 ZA=&H9F
11020 ZB=&HBF
11030 ZC=&HDF
11040 ZN=&HFF
11050 OUT PS,ZA
11060 OUT PS,ZB
11070 OUT PS,ZC
11080 OUT PS,ZN
11090 PRINT "PSG cleared"
11100 REM entry: load PSG_SFX ML
11110 RESTORE 11140:FOR I=0 TO 43
11120 READ B:POKE &HC700+I,B
11130 NEXT I
11140 DATA &H3A,&H80,&HC8,&H07,&H6F,&H26,&H00,&H11,&H50,&HC7
11150 DATA &H19,&H5E,&H23,&H56,&HEB,&H7E,&HB7,&H28,&H14,&HD3
11160 DATA &H7F,&H23,&H7E,&HD3,&H7F,&H23,&H7E,&HD3,&H7F,&H23
11170 DATA &H46,&H23,&HCD,&HE0,&HC5,&H10,&HFB,&H18,&HE8,&H3E
11180 DATA &HDF,&HD3,&H7F,&HC9
11190 IF PEEK(&HC700)<>58 THEN PRINT "ERROR PSG_SFX": STOP
11200 PRINT "PSG_SFX ready at $C700 (44 bytes)"
11300 POKE &HC750,&H60:POKE &HC751,&HC7
11310 POKE &HC752,&H70:POKE &HC753,&HC7
11320 POKE &HC754,&H80:POKE &HC755,&HC7
11330 POKE &HC756,&H90:POKE &HC757,&HC7
11340 POKE &HC758,&HA0:POKE &HC759,&HC7
11350 POKE &HC75A,&HB0:POKE &HC75B,&HC7
11400 REM entry: load SFX note sequences
11410 POKE &HC760,&HCE:POKE &HC761,&H08:POKE &HC762,&HD2:POKE &HC763,2
11430 POKE &HC764,&HC9:POKE &HC765,&H0A:POKE &HC766,&HD4:POKE &HC767,2
11450 POKE &HC768,&HC6:POKE &HC769,&H0D:POKE &HC76A,&HD6:POKE &HC76B,2
11470 POKE &HC76C,0:POKE &HC76D,0:POKE &HC76E,0:POKE &HC76F,0
11500 POKE &HC770,&HC6:POKE &HC771,&H0D:POKE &HC772,&HD3:POKE &HC773,2
11510 POKE &HC774,&HCE:POKE &HC775,&H08:POKE &HC776,&HD2:POKE &HC777,2
11520 POKE &HC778,0:POKE &HC779,0:POKE &HC77A,0:POKE &HC77B,0
11600 POKE &HC780,&HCA:POKE &HC781,&H1A:POKE &HC782,&HD1:POKE &HC783,3
11610 POKE &HC784,&HC3:POKE &HC785,&H15:POKE &HC786,&HD1:POKE &HC787,3
11620 POKE &HC788,&HCD:POKE &HC789,&H11:POKE &HC78A,&HD1:POKE &HC78B,3
11630 POKE &HC78C,&HC6:POKE &HC78D,&H0D:POKE &HC78E,&HD0:POKE &HC78F,6
11640 POKE &HC790,0:POKE &HC791,0:POKE &HC792,0:POKE &HC793,0
11700 POKE &HC794,&HCE:POKE &HC795,&H08:POKE &HC796,&HD2:POKE &HC797,3
11710 POKE &HC798,0:POKE &HC799,0:POKE &HC79A,0:POKE &HC79B,0
11800 POKE &HC7A0,&HCA:POKE &HC7A1,&H1A:POKE &HC7A2,&HD4:POKE &HC7A3,2
11810 POKE &HC7A4,&HDF:POKE &HC7A5,&H00:POKE &HC7A6,&HDF:POKE &HC7A7,2
11820 POKE &HC7A8,&HCA:POKE &HC7A9,&H1A:POKE &HC7AA,&HD4:POKE &HC7AB,2
11830 POKE &HC7AC,0:POKE &HC7AD,0:POKE &HC7AE,0:POKE &HC7AF,0
11900 POKE &HC7B0,&HCA:POKE &HC7B1,&H1A:POKE &HC7B2,&HD0:POKE &HC7B3,2
11910 POKE &HC7B4,&HC3:POKE &HC7B5,&H15:POKE &HC7B6,&HD0:POKE &HC7B7,2
11920 POKE &HC7B8,&HCD:POKE &HC7B9,&H11:POKE &HC7BA,&HD0:POKE &HC7BB,2
11930 POKE &HC7BC,&HC6:POKE &HC7BD,&H0D:POKE &HC7BE,&HD0:POKE &HC7BF,2
11940 POKE &HC7C0,&HC9:POKE &HC7C1,&H0A:POKE &HC7C2,&HD0:POKE &HC7C3,2
11950 POKE &HC7C4,&HCE:POKE &HC7C5,&H08:POKE &HC7C6,&HD0:POKE &HC7C7,4
11960 POKE &HC7C8,0:POKE &HC7C9,0:POKE &HC7CA,0:POKE &HC7CB,0
11970 PRINT "All SFX sequences loaded"
12000 POKE &HC880,SF
12010 CALL &HC700
12020 RETURN
12100 PRINT "Test SFX 0 (SLIDE):"
12110 SF=0:GOSUB 12000
12120 FOR D=1 TO 50:NEXT D
12130 PRINT "Test SFX 2 (TREASURE):"
12140 SF=2:GOSUB 12000
12150 FOR D=1 TO 80:NEXT D
12160 PRINT "Test SFX 5 (WIN):"
12170 SF=5:GOSUB 12000
12180 PRINT "SFX OK"
12210 OUT &H7F,&HCE
12220 OUT &H7F,&H08
12230 OUT &H7F,&HD2
12240 FOR D=1 TO 20:CALL &HC5E0:NEXT D
12250 OUT &H7F,&HDF
13000 DIM DK(3,5)
13010 DIM DT(3)
13020 DIM DF(3)
13030 DIM HR(3)
13040 DIM HC(3)
13050 DIM PR(3)
13060 DIM PC(3)
13070 HR(0)=0:HC(0)=0
13080 HR(1)=0:HC(1)=6
13090 HR(2)=6:HC(2)=0
13100 HR(3)=6:HC(3)=6
13210 FOR I=0 TO 97:POKE &HC8A0+I,0:NEXT I
13220 RESTORE 13270
13230 FOR I=0 TO 15
13240 READ R,C,OP,TR
13250 POKE &HC8A0+(R*7+C)*2,OP OR &H10
13260 POKE &HC8A0+(R*7+C)*2+1,TR
13270 NEXT I
13280 PRINT "Fixed tiles initialised"
13290 RETURN
13310 DATA &H00,&H00,&H06,&H00
13320 DATA &H00,&H02,&H0B,&H01
13330 DATA &H00,&H04,&H0B,&H02
13340 DATA &H00,&H06,&H0C,&H00
13350 DATA &H02,&H00,&H07,&H03
13360 DATA &H02,&H02,&H0E,&H04
13370 DATA &H02,&H04,&H07,&H05
13380 DATA &H02,&H06,&H0D,&H06
13390 DATA &H04,&H00,&H07,&H07
13400 DATA &H04,&H02,&H0B,&H08
13410 DATA &H04,&H04,&H0E,&H09
13420 DATA &H04,&H06,&H0D,&H0A
13430 DATA &H06,&H00,&H03,&H00
13440 DATA &H06,&H02,&H07,&H0B
13450 DATA &H06,&H04,&H0D,&H0C
13460 DATA &H06,&H06,&H09,&H00
13500 DIM TP(33)
13510 DIM TX(33)
13530 FOR I=0  TO 11:TP(I)=0:TX(I)=0:NEXT I
13540 FOR I=12 TO 21:TP(I)=1:TX(I)=I+1: NEXT I
13550 FOR I=22 TO 33:TP(I)=1:TX(I)=0:NEXT I
13570 FOR I=33 TO 1 STEP -1
13580 J=INT(RND(1)*(I+1))
13590 T=TP(I):TP(I)=TP(J):TP(J)=T
13600 T=TX(I):TX(I)=TX(J):TX(J)=T
13610 NEXT I
13630 K=0
13640 FOR R=0 TO 6
13650 FOR C=0 TO 6
13660 AD=&HC8A0+(R*7+C)*2
13670 IF (PEEK(AD) AND &H10)<>0 THEN 13720
13680 RO=INT(RND(1)*4)
13700 POKE AD,PEEK(&HC5C0+TP(K)*4+RO)
13710 POKE AD+1,TX(K)
13715 K=K+1
13720 NEXT C
13730 NEXT R
13750 POKE &HC906,PEEK(&HC5C0+TP(33)*4)
13760 POKE &HC907,TX(33)
13770 PRINT "Board randomised. Extra tile: openings="; PEEK(&HC906)
13780 RETURN
14000 DIM TM(23)
14010 FOR I=0 TO 23:TM(I)=I+1:NEXT I
14030 FOR I=23 TO 1 STEP -1
14040 J=INT(RND(1)*(I+1))
14050 T=TM(I):TM(I)=TM(J):TM(J)=T
14060 NEXT I
14080 K=0
14090 FOR P=0 TO NP-1
14100 FOR C=0 TO 5
14110 DK(P,C)=TM(K):K=K+1
14120 NEXT C
14130 DT(P)=0:DF(P)=0
14140 NEXT P
14150 PRINT "Cards dealt:";
14160 FOR P=0 TO NP-1
14170 PRINT " P"; P+1; "->"; DK(P,0);
14180 NEXT P
14190 PRINT
14200 RETURN
14300 IF DF(CU)=1 THEN 14430
14310 TI=DK(CU,DT(CU))
14320 AD=&HC8A0+(PR(CU)*7+PC(CU))*2+1
14330 TC=PEEK(AD) AND &H7F
14340 IF TC<>TI THEN 14430
14360 POKE AD,PEEK(AD) OR &H80
14370 DT(CU)=DT(CU)+1
14380 IF DT(CU)>=6 THEN DF(CU)=1
14390 SF=2:GOSUB 12000
14400 GOSUB 14500
14410 PRINT "P"; CU+1; " finds treasure "; TI; "! Cards remaining: "; 6-DT(CU)
14430 IF DF(CU)<>1 THEN RETURN
14440 IF PR(CU)<>HR(CU) OR PC(CU)<>HC(CU) THEN RETURN
14460 PRINT "VICTORY! P"; CU+1; " has won!"
14470 SF=5:GOSUB 12000
14480 WI=1
14490 RETURN
14500 FOR P=0 TO NP-1
14510 YR=14+P
14520 FOR B=0 TO 5
14530 NA=&H3800+YR*32+25+B
14540 CH=203
14550 IF B<DT(P) THEN CH=202
14560 POKE &HC880,NA AND 255
14570 POKE &HC881,NA\256
14580 POKE &HC882,CH
14590 CALL &HC070
14600 NEXT B
14610 NEXT P
14620 RETURN
14700 FOR P=0 TO NP-1
14710 PR(P)=HR(P):PC(P)=HC(P)
14720 NEXT P
14730 GOSUB 9700
14740 RETURN
14800 NP=2:WI=0:CU=0
14810 RANDOMIZE PEEK(&HC91A)
14820 GOSUB 13210
14830 GOSUB 13500
14840 GOSUB 14000
14850 GOSUB 14700
14860 CALL &HC480
14870 PRINT "Board ready. P1 seeks treasure "; DK(0,0)
15000 FA=0
15010 WI=0
15020 CU=0
15030 NP=2
15040 CP=0
15050 IP=0
15060 IR=0
15070 IB=255
15080 CR=0
15090 CC=0
15100 LR=0
15110 LC=0
15120 BL=0
15130 SH=0
15200 RANDOMIZE PEEK(&HC91A)
15210 GOSUB 13210
15220 GOSUB 13500
15230 GOSUB 14000
15240 GOSUB 14700
15250 CALL &HC480
15260 GOSUB 14500
15270 FA=0:WI=0:CU=0
15280 IP=0:IR=0:IB=255
15290 BL=0
15300 PRINT "Game started! P"; CU+1; " begins"
15310 RETURN
15400 IF WI=1 THEN 15400
15410 GOSUB 5500
15420 ON FA+1 GOSUB 15510,15700,15900
15430 GOSUB 9700
15440 CALL &HC5E0
15450 GOTO 15400
15510 IF (CP AND (2^CU))<>0 THEN GOSUB 16010:RETURN
15530 IF JR=1 OR JD=1 THEN GOSUB 5900:GOSUB 10000:RETURN
15540 IF JS=1 OR JU=1 THEN GOSUB 5950:GOSUB 10000:RETURN
15560 IF JG=1 THEN IR=(IR+1) MOD 4:GOSUB 17400:SF=1:GOSUB 12000:RETURN
15580 IF JF=0 THEN GOSUB 15610:RETURN
15590 IF IP=IB THEN SF=4:GOSUB 12000:RETURN
15595 GOSUB 15660:RETURN
15610 BL=BL+1:IF BL<16 THEN RETURN
15620 BL=0
15640 FR=QR(IP):FC=QC(IP)
15641 NA=&H3800+FR*32+FC
15642 NB=(NB+1) MOD 2
15643 IF NB=0 THEN CH=192+(IP\3) ELSE CH=196+(IP\3)
15644 POKE &HC880,NA AND 255:POKE &HC881,NA\256
15645 POKE &HC882,CH:CALL &HC070
15650 RETURN
15660 GOSUB 7800
15670 CR=PR(CU):CC=PC(CU)
15680 LR=CR:LC=CC
15690 FA=1:BL=0:RETURN
15700 IF JU=1 THEN GOSUB 6010
15710 IF JD=1 THEN GOSUB 6070
15720 IF JS=1 THEN GOSUB 6130
15730 IF JR=1 THEN GOSUB 6190
15750 IF JF=1 THEN GOSUB 15810:RETURN
15770 IF JG=1 THEN GOSUB 15810:RETURN
15790 BL=BL+1:IF BL<16 THEN RETURN
15795 BL=0:GOSUB 15830:RETURN
15810 PR(CU)=CR:PC(CU)=CC
15815 FA=2:RETURN
15830 NA=&H3800+(1+CR*3)*32+(2+CC*3)+1+32
15840 NB=(NB+1) MOD 2
15850 IF NB=0 THEN CH=2 ELSE CH=200
15860 POKE &HC880,NA AND 255:POKE &HC881,NA\256
15870 POKE &HC882,CH:CALL &HC070
15880 RETURN
15900 GOSUB 14300
15910 IF WI=1 THEN RETURN
15930 CU=(CU+1) MOD NP
15940 FA=0
15950 SF=3:GOSUB 12000
15960 IP=0:BL=0
15980 RETURN
16010 GOSUB 16100
16030 IP=A1:IR=A2
16040 GOSUB 7800
16060 GOSUB 16400
16070 GOSUB 15810
16080 RETURN
16100 A1=0:A2=0:BD=255:AG=0
16110 TI=DK(CU,DT(CU))
16130 FOR I=0 TO 97:POKE &HC987+I,PEEK(&HC8A0+I):NEXT I
16150 FOR I=0 TO NP-1
16160 POKE &HC9ED+I*2,PR(I)
16170 POKE &HC9EE+I*2,PC(I)
16180 NEXT I
16200 FOR AP=0 TO 11
16210 IF AP=IB THEN 16398
16220 FOR AR=0 TO 3
16240 FOR I=0 TO 97:POKE &HC8A0+I,PEEK(&HC987+I):NEXT I
16250 FOR I=0 TO NP-1
16260 PR(I)=PEEK(&HC9ED+I*2):PC(I)=PEEK(&HC9EE+I*2)
16270 NEXT I
16290 POKE &HC880,AP:POKE &HC881,AR:POKE &HC882,NP
16300 CALL &HC500
16310 FOR I=0 TO NP-1
16320 PR(I)=PEEK(&HC909+I*2):PC(I)=PEEK(&HC909+I*2+1)
16330 NEXT I
16350 POKE &HC880,PR(CU):POKE &HC881,PC(CU)
16360 CALL &HC600
16380 XR=255:XC=255
16385 FOR R=0 TO 6:FOR C=0 TO 6
16386 IF (PEEK(&HC8A0+(R*7+C)*2+1) AND &H7F)=TI THEN XR=R:XC=C
16387 NEXT C:NEXT R
16389 IF XR<>255 AND PEEK(&HC904+XR*7+XC)=1 THEN A1=AP:A2=AR:AG=1:GOTO 16630
16394 IF XR=255 THEN XR=HR(CU):XC=HC(CU)
16395 DM=ABS(PR(CU)-XR)+ABS(PC(CU)-XC)
16396 IF DM<BD THEN BD=DM:A1=AP:A2=AR
16397 NEXT AR
16398 NEXT AP
16399 GOTO 16630
16400 CR=PR(CU):CC=PC(CU)
16420 IF DF(CU)<>1 THEN 16460
16430 IF PEEK(&HC904+HR(CU)*7+HC(CU))=1 THEN CR=HR(CU):CC=HC(CU)
16440 RETURN
16460 TI=DK(CU,DT(CU))
16470 XR=255:XC=255
16480 FOR R=0 TO 6:FOR C=0 TO 6
16490 IF (PEEK(&HC8A0+(R*7+C)*2+1) AND &H7F)=TI THEN XR=R:XC=C
16500 NEXT C:NEXT R
16510 IF XR=255 THEN RETURN
16530 IF PEEK(&HC904+XR*7+XC)=1 THEN CR=XR:CC=XC:RETURN
16550 BD=255
16560 FOR R=0 TO 6:FOR C=0 TO 6
16570 IF PEEK(&HC904+R*7+C)=0 THEN 16590
16580 DM=ABS(R-XR)+ABS(C-XC)
16585 IF DM<BD THEN BD=DM:CR=R:CC=C
16590 NEXT C:NEXT R
16600 RETURN
16630 FOR I=0 TO 97:POKE &HC8A0+I,PEEK(&HC987+I):NEXT I
16640 FOR I=0 TO NP-1
16650 PR(I)=PEEK(&HC9ED+I*2):PC(I)=PEEK(&HC9EE+I*2)
16660 NEXT I
16670 RETURN
17000 HX=24
17010 HW=8
17100 GOSUB 17210
17110 GOSUB 17310
17120 GOSUB 17530
17130 GOSUB 17950
17140 GOSUB 14500
17150 RETURN
17210 FOR R=0 TO 2
17220 FOR C=0 TO HW-1
17230 NA=&H3800+R*32+HX+C:CH=0:GOSUB 17900
17240 NEXT C
17250 NEXT R
17270 NA=&H3800+1*32+HX+3:CH=175:GOSUB 17900
17280 NA=&H3800+1*32+HX+4:CH=144+CU+1:GOSUB 17900
17290 RETURN
17310 FOR C=0 TO HW-1
17320 NA=&H3800+6*32+HX+C:CH=204:GOSUB 17900
17330 NA=&H3800+12*32+HX+C:CH=204:GOSUB 17900
17340 NEXT C
17360 NA=&H3800+3*32+HX+2:CH=174:GOSUB 17900
17370 NA=&H3800+3*32+HX+3:CH=161:GOSUB 17900
17380 NA=&H3800+3*32+HX+4:CH=169:GOSUB 17900
17400 NA=&H3800+7*32+HX+1:CH=179:GOSUB 17900
17410 NA=&H3800+7*32+HX+2:CH=168:GOSUB 17900
17420 NA=&H3800+7*32+HX+3:CH=171:GOSUB 17900
17430 NA=&H3800+7*32+HX+4:CH=164:GOSUB 17900
17450 NA=&H3800+13*32+HX+1:CH=178:GOSUB 17900
17460 NA=&H3800+13*32+HX+2:CH=162:GOSUB 17900
17470 NA=&H3800+13*32+HX+3:CH=174:GOSUB 17900
17480 NA=&H3800+13*32+HX+4:CH=177:GOSUB 17900
17490 NA=&H3800+13*32+HX+5:CH=164:GOSUB 17900
17510 NA=&H3800+11*32+HX+5:CH=201:GOSUB 17900
17520 RETURN
17530 EO=PEEK(&HC906)
17540 FOR DR=0 TO 2
17550 FOR DC=0 TO 2
17560 PO=DR*3+DC
17570 CH=1
17580 IF PO=4 THEN CH=2
17590 IF PO=1 AND (EO AND 1) THEN CH=2
17600 IF PO=7 AND (EO AND 4) THEN CH=2
17610 IF PO=3 AND (EO AND 8) THEN CH=2
17620 IF PO=5 AND (EO AND 2) THEN CH=2
17630 NA=&H3800+(8+DR)*32+HX+1+DC:GOSUB 17900
17640 NEXT DC
17650 NEXT DR
17670 NA=&H3800+11*32+HX+6:CH=144+IR:GOSUB 17900
17680 RETURN
17710 FOR C=0 TO 7
17720 NA=&H3800+22*32+C:CH=0:GOSUB 17900
17730 NEXT C
17740 IF FA=1 THEN 17800
17760 NA=&H3800+22*32+0:CH=168:GOSUB 17900
17770 NA=&H3800+22*32+1:CH=173:GOSUB 17900
17780 NA=&H3800+22*32+2:CH=178:GOSUB 17900
17785 NA=&H3800+22*32+3:CH=164:GOSUB 17900
17786 NA=&H3800+22*32+4:CH=177:GOSUB 17900
17787 NA=&H3800+22*32+5:CH=179:GOSUB 17900
17788 RETURN
17800 NA=&H3800+22*32+0:CH=172:GOSUB 17900
17810 NA=&H3800+22*32+1:CH=180:GOSUB 17900
17820 NA=&H3800+22*32+2:CH=174:GOSUB 17900
17830 NA=&H3800+22*32+3:CH=181:GOSUB 17900
17840 NA=&H3800+22*32+4:CH=168:GOSUB 17900
17850 RETURN
17900 POKE &HC880,NA AND 255
17910 POKE &HC881,NA\256
17920 POKE &HC882,CH
17930 CALL &HC070
17940 RETURN
17950 TI=DK(CU,DT(CU))
17960 IF DF(CU)=1 THEN TI=0
17970 IF SH=1 AND TI>0 THEN CH=111+TI ELSE CH=155
17980 NA=&H3800+4*32+HX+3:GOSUB 17900
17990 RETURN
18000 CALL &H39DF
18020 R=4
18030 RESTORE 18130
18040 FOR C=0 TO 6
18050 READ CH:NA=&H3800+R*32+12+C:GOSUB 17900
18060 NEXT C
18070 R=5
18080 RESTORE 18150
18090 FOR C=0 TO 8
18100 READ CH:NA=&H3800+R*32+11+C:GOSUB 17900
18110 NEXT C
18130 DATA &HAC,&HA0,&HA6,&HA8,&HA2,&HA0,&HAB
18150 DATA &HAB,&HA0,&HA1,&HB8,&HB1,&HA8,&HAD,&HB3,&HA7
18170 FOR C=4 TO 27
18180 NA=&H3800+7*32+C:CH=204:GOSUB 17900
18190 NEXT C
18210 RESTORE 18260
18220 FOR C=0 TO 6
18230 READ CH:NA=&H3800+9*32+5+C:GOSUB 17900
18240 NEXT C
18260 DATA &HAF,&HAB,&HA0,&HB8,&HA4,&HB1,&HB2
18280 NA=&H3800+9*32+16:CH=144+NP:GOSUB 17900
18300 FOR P=0 TO 3
18310 IF P>=NP THEN 18398
18320 NA=&H3800+(11+P*2)*32+4:CH=175:GOSUB 17900
18330 NA=&H3800+(11+P*2)*32+5:CH=144+P+1:GOSUB 17900
18350 IF (CP AND (2^P))<>0 THEN RESTORE 18400 ELSE RESTORE 18410
18392 FOR C=0 TO 2
18394 READ CH:NA=&H3800+(11+P*2)*32+8+C:GOSUB 17900
18396 NEXT C
18398 NEXT P
18400 DATA &HA2,&HAF,&HB4
18410 DATA &HAC,&HA0,&HAD
18430 RESTORE 18480
18440 FOR C=0 TO 10
18450 READ CH:NA=&H3800+20*32+7+C:GOSUB 17900
18460 NEXT C
18480 DATA &HA5,&HA8,&HB1,&HA4,&H19,&HA0,&HB2,&HB2,&HA8,&HA6,&HAD
18490 RESTORE 18540
18500 FOR C=0 TO 9
18510 READ CH:NA=&H3800+21*32+8+C:GOSUB 17900
18520 NEXT C
18540 DATA &HA5,&HA8,&HB1,&HA4,&H19,&HB2,&HB3,&HA0,&HB1,&HB3
18550 RETURN
19000 NP=2:CP=0:MC=0
19010 GOSUB 18000
19030 GOSUB 5500
19050 IF JR=1 AND NP<4 THEN NP=NP+1:GOSUB 18000:GOTO 19130
19060 IF JS=1 AND NP>2 THEN NP=NP-1:GOSUB 18000:GOTO 19130
19080 IF JU=1 AND MC>0    THEN MC=MC-1:GOSUB 18000:GOTO 19130
19090 IF JD=1 AND MC<NP-1 THEN MC=MC+1:GOSUB 18000:GOTO 19130
19110 IF JF=1 THEN CP=CP XOR (2^MC):GOSUB 18000:GOTO 19130
19125 IF JG=1 THEN 19200
19130 CALL &HC5E0
19140 GOTO 19030
19200 SF=3:GOSUB 12000
19210 GOSUB 15200
19220 GOTO 15400