Those of you who like Commodore BASIC usually send little Christmas greetings, and I don’t want to be any worse. This program works on C64 and C128, and can be adapted to VIC-20:
10 POKE 53281,0:POKE 53280,6
20 PRINT "{BLACK}";CHR$(147)
30 FOR WI=1 TO 19 STEP 2:GOSUB 70:GOSUB 70:NEXT
40 WI=3:GOSUB 120:GOSUB 120:GOSUB 120
50 PRINT "{HOME}"
60 GOTO 170:REM"SNOW EFFECT
70 S=19-WI/2:REM"PRINT TREE
80 FOR A=0 TO S:PRINT "{BLACK} ";:NEXT
90 FOR A=1 TO WI:PRINT "{GREEN}*";:NEXT
100 PRINT
110 RETURN:REM"END PRINT TREE
120 S=19-WI/2:REM"PRINT STEM
130 FOR A=0 TO S:PRINT "{BLACK} ";:NEXT
140 FOR A=1 TO WI:PRINT "{BROWN}*";:NEXT
150 PRINT
160 RETURN:REM"END PRINT STEM
170 X=INT(RND(1)*40):Y=(INT(RND(1)*23)+1):ADR=55296+((Y*40)+X):REM"SNOW EFFECT
180 CU=PEEK(ADR) AND 15
190 C=1024+((Y*40)+X)
200 IF Y=23 THEN GOSUB 250:REM"GROUND
210 IF Y<>23 AND (CU=0 OR CU=6 OR CU=1) THEN GOSUB 310:REM"SKY
220 IF Y<>23 AND CU=5 THEN GOSUB 400:REM"TREE
230 IF Y<>23 AND (CU=8 OR CU=9 OR CU=11) THEN GOSUB 460:REM"STEM
240 GOTO 170
250 NC=INT(RND(1)*3):REM"GROUND
260 IF NC=0 THEN POKE ADR,1
270 IF NC=1 THEN POKE ADR,5
280 IF NC=2 THEN POKE ADR,15
290 POKE C,ASC("*")
300 RETURN
310 NC=INT(RND(1)*3):REM"SKY COLOR
320 IF NC=0 THEN POKE ADR,0
330 IF NC=1 THEN POKE ADR,6
340 IF NC=2 THEN POKE ADR,1
350 NC=INT(RND(1)*3):REM"SKY CHARACTER
360 IF NC=0 THEN POKE C,ASC(" ")
370 IF NC=1 THEN POKE C,ASC(".")
380 IF NC=2 THEN POKE C,ASC("'")
390 RETURN
400 NC=INT(RND(1)*4):REM"TREE
410 IF NC=0 THEN POKE ADR,5:POKE C,ASC("*")
420 IF NC=1 THEN POKE ADR,13:POKE C,ASC("*")
430 IF NC=2 THEN POKE ADR,2:POKE C,ASC("Q")
440 IF NC=3 THEN POKE ADR,7:POKE C,ASC("Q")
450 RETURN
460 NC=INT(RND(1)*3):REM"STEM
470 IF NC=0 THEN POKE ADR,8
480 IF NC=1 THEN POKE ADR,9
490 IF NC=2 THEN POKE ADR,11
500 RETURN
Note how the code tries to use procedures with different responsibilities to update different parts of the tree, the ground, and the background. The result looks like this: https://x.com/ahesselbom/status/2003217324841796096

Leave a Reply