GRAPHICS MASTER
SC-3000 BASIC Level III-B — part of the SE3K documentation library, also readable inside the emulator.
10 REM ===== MAGICAL LABYRINTH -- GRAPHICS MASTER (standalone) =====
20 REM Build all graphics in VRAM and record them to cassette.
30 REM RUN once to master the tape; the game then fast-loads from it.
40 REM Edit the glyphs in the DATA at 2250+ to change the font.
45 REM Flow: init+build (text only, no tiles drawn yet) -> preview (tiles) -> key -> Screen 1 (tape save)
50 DIM PA(7)
100 REM CALL &H39DF:CALL &H39E2:PRINT "GRAPHICS MASTER"
102 SCREEN 1,1:CLS:PRINT "GRAPHICS MASTER"
105 PRINT "Init + build (may take a while)"
110 PRINT "Loading ML tools..."
112 PRINT " VRAM_WRITE ($C070)":GOSUB 1000
114 PRINT " BINSAVER/VRAMSAVER ($CA00/$CA40)":GOSUB 1200
130 PRINT "Building graphics data..."
132 PRINT " base tiles (3)":GOSUB 2000
134 PRINT " font (75 glyphs)":GOSUB 2200
136 PRINT " sprite":GOSUB 2400
140 PRINT "Done. Preview -- press a key"
150 GOSUB 6000 : REM show graphics, waits for keypress
152 CALL &H39E5 : REM DSPTX -- switch to SCREEN 1 (one-way, safe: done with VRAM)
155 PRINT "Screen 1: saving to tape"
157 GOSUB 3000
160 END
1000 REM --- VRAM_WRITE ML -> $C070 (writes 1 byte to VRAM addr $C880) ---
1010 RESTORE 1020:FOR I=0 TO 12:READ B:POKE &HC070+I,B:NEXT I
1020 DATA &H2A,&H80,&HC8,&HCD,&HB3,&H2B,&H3A,&H82,&HC8,&HCD
1021 DATA &HB6,&H2B,&HC9
1030 RETURN
1200 REM --- BINSAVER $CA00 + VRAMSAVER $CA40 ---
1210 RESTORE 1220:FOR I=0 TO 52:READ B:POKE &HCA00+I,B:NEXT I
1220 DATA &HCD,&H0F,&H3A,&H3A,&H80,&HC8,&HCD,&H12,&H3A,&H3A
1221 DATA &H81,&HC8,&HCD,&H12,&H3A,&H3A,&H82,&HC8,&HCD,&H12
1222 DATA &H3A,&H3A,&H83,&HC8,&HCD,&H12,&H3A,&H2A,&H80,&HC8
1223 DATA &HED,&H4B,&H82,&HC8,&H1E,&H00,&H7E,&HCD,&H12,&H3A
1224 DATA &H83,&H5F,&H23,&H0B,&H78,&HB1,&H20,&HF4,&H7B,&HCD
1225 DATA &H12,&H3A,&HC9
1240 RESTORE 1250:FOR I=0 TO 59:READ B:POKE &HCA40+I,B:NEXT I
1250 DATA &HCD,&H0F,&H3A,&H3A,&H84,&HC8,&HCD,&H12,&H3A,&H3A
1251 DATA &H85,&HC8,&HCD,&H12,&H3A,&H3A,&H82,&HC8,&HCD,&H12
1252 DATA &H3A,&H3A,&H83,&HC8,&HCD,&H12,&H3A,&H3A,&H80,&HC8
1253 DATA &HD3,&HBF,&H3A,&H81,&HC8,&HD3,&HBF,&HED,&H4B,&H82
1254 DATA &HC8,&H1E,&H00,&HDB,&HBE,&HCD,&H12,&H3A,&HAB,&H5F
1255 DATA &H0B,&H78,&HB1,&H20,&HF4,&H7B,&HCD,&H12,&H3A,&HC9
1270 RETURN
2000 REM --- base tiles: char 0 blank, 1 wall, 2 corridor ---
2010 CO=0:FOR K=0 TO 7:PA(K)=0:NEXT K:CL=&H11:GOSUB 5000
2020 CO=1:FOR K=0 TO 7:PA(K)=0:NEXT K:CL=&H12:GOSUB 5000
2030 CO=2:FOR K=0 TO 7:PA(K)=255:NEXT K:CL=&HE2:GOSUB 5000
2040 RETURN
2200 REM --- font (75 glyphs), with progress counter ---
2210 RESTORE 2250:CL=&HF1
2220 FOR G=0 TO 74
2222 CURSOR 2,7: PRINT " font ";G+1;"/75"
2230 READ CO:FOR K=0 TO 7:READ PA(K):NEXT K
2240 GOSUB 5000:NEXT G
2245 RETURN
2250 DATA &H19,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00
2251 DATA &H70,&HFF,&HAB,&HAB,&HAB,&HAB,&HAB,&HAB,&HFF
2252 DATA &H71,&HFF,&H93,&H93,&H93,&H93,&H93,&H93,&HFF
2253 DATA &H72,&HFF,&H89,&H89,&H89,&H89,&H89,&H89,&HFF
2254 DATA &H73,&HFF,&H85,&H85,&H85,&H85,&H85,&H85,&HFF
2255 DATA &H74,&HFF,&HAB,&HAB,&HAB,&HAB,&HAB,&HAB,&HFF
2256 DATA &H75,&HFF,&H81,&H81,&HFF,&H81,&H81,&HFF,&HFF
2257 DATA &H76,&HFF,&H89,&H89,&H89,&H89,&H89,&H89,&HFF
2258 DATA &H77,&HFF,&HA1,&H89,&HC3,&H91,&H85,&HA1,&HFF
2259 DATA &H78,&HFF,&HAB,&HAB,&HAB,&HAB,&HAB,&HAB,&HFF
2260 DATA &H79,&HFF,&HC9,&HA5,&H93,&HC9,&HA5,&H93,&HFF
2261 DATA &H7A,&HFF,&H89,&H89,&H89,&H89,&H89,&H89,&HFF
2262 DATA &H7B,&HFF,&HC3,&HA1,&H91,&H89,&H85,&HC3,&HFF
2263 DATA &H7C,&HFF,&HAB,&HAB,&HAB,&HAB,&HAB,&HAB,&HFF
2264 DATA &H7D,&HFF,&H93,&H93,&H93,&H93,&H93,&H93,&HFF
2265 DATA &H7E,&HFF,&H89,&H89,&H89,&H89,&H89,&H89,&HFF
2266 DATA &H7F,&HFF,&H91,&HC3,&H89,&HA1,&H85,&H91,&HFF
2267 DATA &H80,&HFF,&HAB,&HAB,&HAB,&HAB,&HAB,&HAB,&HFF
2268 DATA &H81,&HFF,&H81,&H81,&HFF,&H81,&H81,&HFF,&HFF
2269 DATA &H82,&HFF,&H89,&H89,&H89,&H89,&H89,&H89,&HFF
2270 DATA &H83,&HFF,&H81,&H81,&H81,&H81,&HFF,&H81,&HFF
2271 DATA &H84,&HFF,&HAB,&HAB,&HAB,&HAB,&HAB,&HAB,&HFF
2272 DATA &H85,&HFF,&HC9,&HA5,&H93,&HC9,&HA5,&H93,&HFF
2273 DATA &H86,&HFF,&H89,&H89,&H89,&H89,&H89,&H89,&HFF
2274 DATA &H87,&HFF,&H85,&H85,&H85,&H85,&H85,&H85,&HFF
2275 DATA &H90,&H70,&H88,&H98,&HA8,&HC8,&H88,&H70,&H00
2276 DATA &H91,&H20,&H60,&H20,&H20,&H20,&H20,&H70,&H00
2277 DATA &H92,&H70,&H88,&H08,&H10,&H20,&H40,&HF8,&H00
2278 DATA &H93,&HF8,&H10,&H20,&H10,&H08,&H88,&H70,&H00
2279 DATA &H94,&H10,&H30,&H50,&H90,&HF8,&H10,&H10,&H00
2280 DATA &H95,&HF8,&H80,&HF0,&H08,&H08,&H88,&H70,&H00
2281 DATA &H96,&H30,&H40,&H80,&HF0,&H88,&H88,&H70,&H00
2282 DATA &H97,&HF8,&H08,&H10,&H20,&H40,&H40,&H40,&H00
2283 DATA &H98,&H70,&H88,&H88,&H70,&H88,&H88,&H70,&H00
2284 DATA &H99,&H70,&H88,&H88,&H78,&H08,&H10,&H60,&H00
2285 DATA &H9B,&H70,&H88,&H08,&H10,&H20,&H00,&H20,&H00
2286 DATA &HA0,&H70,&H88,&H88,&HF8,&H88,&H88,&H88,&H00
2287 DATA &HA1,&HF0,&H88,&H88,&HF0,&H88,&H88,&HF0,&H00
2288 DATA &HA2,&H70,&H88,&H80,&H80,&H80,&H88,&H70,&H00
2289 DATA &HA3,&HF0,&H88,&H88,&H88,&H88,&H88,&HF0,&H00
2290 DATA &HA4,&HF8,&H80,&H80,&HF0,&H80,&H80,&HF8,&H00
2291 DATA &HA5,&HF8,&H80,&H80,&HF0,&H80,&H80,&H80,&H00
2292 DATA &HA6,&H70,&H88,&H80,&HB8,&H88,&H88,&H78,&H00
2293 DATA &HA7,&H88,&H88,&H88,&HF8,&H88,&H88,&H88,&H00
2294 DATA &HA8,&H70,&H20,&H20,&H20,&H20,&H20,&H70,&H00
2295 DATA &HA9,&H38,&H10,&H10,&H10,&H90,&H90,&H60,&H00
2296 DATA &HAA,&H88,&H90,&HA0,&HC0,&HA0,&H90,&H88,&H00
2297 DATA &HAB,&H80,&H80,&H80,&H80,&H80,&H80,&HF8,&H00
2298 DATA &HAC,&H88,&HD8,&HA8,&HA8,&H88,&H88,&H88,&H00
2299 DATA &HAD,&H88,&HC8,&HA8,&H98,&H88,&H88,&H88,&H00
2300 DATA &HAE,&H70,&H88,&H88,&H88,&H88,&H88,&H70,&H00
2301 DATA &HAF,&HF0,&H88,&H88,&HF0,&H80,&H80,&H80,&H00
2302 DATA &HB0,&H70,&H88,&H88,&H88,&HA8,&H90,&H68,&H00
2303 DATA &HB1,&HF0,&H88,&H88,&HF0,&HA0,&H90,&H88,&H00
2304 DATA &HB2,&H78,&H80,&H80,&H70,&H08,&H08,&HF0,&H00
2305 DATA &HB3,&HF8,&H20,&H20,&H20,&H20,&H20,&H20,&H00
2306 DATA &HB4,&H88,&H88,&H88,&H88,&H88,&H88,&H70,&H00
2307 DATA &HB5,&H88,&H88,&H88,&H88,&H88,&H50,&H20,&H00
2308 DATA &HB6,&H88,&H88,&H88,&HA8,&HA8,&HD8,&H88,&H00
2309 DATA &HB7,&H88,&H88,&H50,&H20,&H50,&H88,&H88,&H00
2310 DATA &HB8,&H88,&H88,&H50,&H20,&H20,&H20,&H20,&H00
2311 DATA &HB9,&HF8,&H08,&H10,&H20,&H40,&H80,&HF8,&H00
2312 DATA &HC0,&H20,&H70,&HF8,&H20,&H20,&H20,&H20,&H00
2313 DATA &HC1,&H08,&H0C,&HFE,&H0C,&H08,&H00,&H00,&H00
2314 DATA &HC2,&H20,&H20,&H20,&H20,&HF8,&H70,&H20,&H00
2315 DATA &HC3,&H10,&H30,&HFE,&H30,&H10,&H00,&H00,&H00
2316 DATA &HC4,&HFF,&HC6,&HBA,&HBA,&HBA,&H82,&HFF,&H00
2317 DATA &HC5,&HFF,&HC6,&HBA,&HBA,&HBA,&H82,&HFF,&H00
2318 DATA &HC6,&HFF,&HC6,&HBA,&HBA,&HBA,&H82,&HFF,&H00
2319 DATA &HC7,&HFF,&HC6,&HBA,&HBA,&HBA,&H82,&HFF,&H00
2320 DATA &HC8,&HFF,&HFF,&HFF,&HFF,&HFF,&HFF,&HFF,&HFF
2321 DATA &HC9,&H38,&H44,&H92,&HAA,&H92,&H44,&H38,&H00
2322 DATA &HCA,&HFF,&HFF,&HFF,&HFF,&HFF,&HFF,&HFF,&H00
2323 DATA &HCB,&HFF,&H81,&H81,&H81,&H81,&H81,&HFF,&H00
2324 DATA &HCC,&H00,&H00,&H00,&HFF,&HFF,&H00,&H00,&H00
2400 REM --- pawn sprite -> VRAM $1800 (real sprite-pattern addr, R6=3 -> (3&7)*$800) ---
2410 RESTORE 2450
2420 FOR I=0 TO 31:READ B:AD=&H1800+I
2430 POKE &HC880,AD AND 255:POKE &HC881,AD/256:POKE &HC882,B:CALL &HC070:NEXT I
2440 RETURN
2450 DATA &H00,&H03,&H0F,&H1F,&H3F,&H3F,&H7F,&H7F
2451 DATA &H00,&HC0,&HF0,&HF8,&HFC,&HFC,&HFE,&HFE
2452 DATA &H7F,&H7F,&H3F,&H1F,&H0F,&H07,&H01,&H00
2453 DATA &HFE,&HFE,&HFC,&HF8,&HF0,&HE0,&H80,&H00
3000 REM --- record 7 blocks to tape (3 pattern + 3 colour + sprite) ---
3005 PRINT "Insert blank tape. RECORD+PLAY, then a key."
3010 IF INKEY$="" THEN 3010
3015 POKE &HC880,0:POKE &HC881,0:POKE &HC882,0:POKE &HC883,&H07
3016 POKE &HC884,0:POKE &HC885,&H00:PRINT "pattern 1/3":CALL &HCA40
3017 POKE &HC884,0:POKE &HC885,&H08:PRINT "pattern 2/3":CALL &HCA40
3018 POKE &HC884,0:POKE &HC885,&H10:PRINT "pattern 3/3":CALL &HCA40
3020 POKE &HC880,0:POKE &HC881,&H20:POKE &HC882,0:POKE &HC883,&H07
3021 POKE &HC884,0:POKE &HC885,&H20:PRINT "colour 1/3":CALL &HCA40
3022 POKE &HC884,0:POKE &HC885,&H28:PRINT "colour 2/3":CALL &HCA40
3023 POKE &HC884,0:POKE &HC885,&H30:PRINT "colour 3/3":CALL &HCA40
3025 POKE &HC880,0:POKE &HC881,&H18:POKE &HC882,&H20:POKE &HC883,0
3026 POKE &HC884,0:POKE &HC885,&H18:PRINT "sprite":CALL &HCA40
3030 RETURN
5000 REM --- write char CO: pattern PA(0..7) -> $0000+CO*8, colour CL -> $2000+CO*8 ---
5010 FOR K=0 TO 7
5020 A2=CO*8+K:VPOKE(A2),PA(K):REM POKE &HC880,A2 AND 255:POKE &HC881,A2/256:POKE &HC882,PA(K):CALL &HC070
5030 A2=&H2000+CO*8+K:VPOKE(A2),CL:REM POKE &HC880,A2 AND 255:POKE &HC881,A2/256:POKE &HC882,CL:CALL &HC070
5040 NEXT K
5050 RETURN
6000 REM --- preview: real name table addr $3800 (R2=$0E -> 14*$400), not $1800 ---
6005 SCREEN 2,2:CLS
6010 RESTORE 2450:CL=&H13:FOR CO=3 TO 6:FOR K=0 TO 7:READ B:PA(K)=B:NEXT K:GOSUB 5000:NEXT CO
6020 FOR C=0 TO 204:NA=&H3800+C:VPOKE(NA),C:REM POKE &HC880,NA AND 255:POKE &HC881,NA/256:POKE &HC882,C:CALL &HC070:NEXT C
6030 RESTORE 6045:NA=&H3800+7*32
6040 FOR K=0 TO 8:READ C:VPOKE(NA),C:REM POKE &HC880,NA AND 255:POKE &HC881,NA/256:POKE &HC882,C:CALL &HC070:NA=NA+1:NEXT K
6041 NA=NA+1:NEXT K
6045 DATA &HAF,&HB1,&HA4,&HB2,&HB2,&H19,&HAA,&HA4,&HB8
6050 IF INKEY$="" THEN 6050
6060 RETURN