SE3K Survivors Experience 3000

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