Skip to content

Instantly share code, notes, and snippets.

@espeed
Last active September 26, 2023 11:51
Show Gist options
  • Save espeed/6016497 to your computer and use it in GitHub Desktop.
Save espeed/6016497 to your computer and use it in GitHub Desktop.
This is the first program I ever wrote... It was on the Commodore 64, and it displays a hot air balloon bouncing around the screen in 16 colors. I was probably 7 or 8. This program is the first example in the "C64 Programmers Reference Guide - Chapter 3: Programming Graphics on the Commodore 64" -- http://www.commodore.ca/manuals/c64_programmers…
10 REM SPRITE EXAMPLE 1...
20 REM THE HOT AIR BALLOON
30 VIC=13*4096:REM THIS IS WHERE THE VIC REGISTERS BEGIN
35 POKEVIC+21,1:REM ENABLE SPRITE 0
36 POKEVIC+33,14:REM SET BACKGROUND COLOR TO LIGHT BLUE
37 POKEVIC+23,1:REM EXPAND SPRITE 0 IN Y
38 POKEVIC+29,1:REM EXPAND SPRITE 0 IN X
40 POKE2040,192:REM SET SPRITE 0'S POINTER
180 POKEVIC+0,100:REM SET SPRITE 0'S X POSITION
190 POKEVIC+l, 100:REM SET SPRITE 0'S Y POSITION
220 POKEVIC+39,1:REM SET SPRITE 0'S COLOR
250 FORY=0T063:REM BYTE COUNTER WITH SPRITE LOOP
300 READA:REM READ IN A BYTE
310 POKE192*64+Y,A:REM STORE THE DATA IN SPRITE AREA
320 NEXTY:REM CLOSE LOOP
330 DX=l:DY=l
340 X=PEEK(VIC):REM LOOK AT SPRITE 0'S X POSITION
350 Y=PEEK(VIC+l):REM LOOK AT SPRITE 0'S Y POSITION
360 IFY=500RY=208THENDY=-DY:REM IF Y IS ON THE EDGE OF THE....
370 REM SCREEN, THEN REVERSE DELTA Y
380 IFX=24AND(PEEK(VIC+16)AND1)=0THENDX=-DX:REM IF SPRITE IS....
390 REM TOUCHING THE LEFT EDGE (X=24 AND THE MSB FOR SPRITE 0 IS 0), REVERSE IT
400 IFX=40AND(PEEK(VIC+16)AND1)=lTHENDX=-DX:REM IF SPRITE IS....
410 REM TOUCHING THE RIGHT EDGE (X=40 AND THE MSB FOR SPRITE 0 IS 1), REVERSE IT
420 IFX=255ANDDX=lTHENX=-1:SIDE=1
430 REM SWITCH TO OTHER SIDE OF THE SCREEN
440 IFX=0ANDDX=-lTHENX=256:SIDE=0
450 REM SWITCH TO OTHER SIDE OF THE SCREEN
460 X=X+DX:REM ADD DELTA X TO X
470 X=XAND255:REM MAKE SURE X IS IN ALLOWED RANGE
480 Y=Y+DY:REM ADD DELTA Y TO Y
485 POKEVIC+16,SIDE
490 POKEVIC,X:REM PUT NEW X VALUE INTO SPRITE 0'S X POSITION
510 POKEVIC+1,Y:REM PUT NEW Y VALUE INTO SPRITE 0'S Y POSITION
530 GOTO340
600 REM ***** SPRITE DATA *****
610 DATA0,127,0,1,255,192,3,255,224,3,231,224
620 DATA7,217,240,7,223,240,7,217,240,3,231,224
630 DATA3,255,224,3,255,224,2,255,160,1,127,64
640 DATAl,62,64,0,156,128,0,156,128,0,73,0,0,73,0
650 DATA0,62,0,0,62,0,0,62,0,0,28,0,0
@theGrayFilip
Copy link

10 REM SPRITE EXAMPLE 1...
20 REM THE HOT AIR BALLOON
30 VIC=134096 :REM THIS IS WHERE THE VIC REGISTERS BEGIN
35 POKE VIC+21,1 :REM ENABLE SPRITE 0
36 POKE VIC+33,14 :REM SET BACKGROUND COLOR TO LIGHT BLUE
37 POKE VIC+23,1 :REM EXPAND SPRITE 0 IN Y
38 POKE VIC+29,1 :REM EXPAND SPRITE 0 IN X
40 POKE 2040,192 :REM SET SPRITE 0'S POINTER
180 POKE VIC+0,100 :REM SET SPRITE 0'S X POSITION
190 POKE VIC+1,100 :REM SET SPRITE 0'S Y POSITION
220 POKE VIC+39,1 :REM SET SPRITE 0'S COLOR
250 FOR Y=0TO63 :REM BYTE COUNTER WITH SPRITE LOOP
300 READA :REM READ IN A BYTE
310 POKE 192
64+Y,A :REM STORE THE DATA IN SPRITE AREA
320 NEXTY :REM CLOSE LOOP
330 DX=1:DY=1
340 X=PEEK(VIC) :REM LOOK AT SPRITE 0'S X POSITION
350 Y=PEEK(VIC+1) :REM LOOK AT SPRITE 0'S Y POSITION
360 IFY=50ORY=208THENDY=-DY: REM IF Y IS ON THE EDGE OF THE....
370 REM SCREEN, THEN REVERSE DELTA Y
380 IFX=24AND(PEEK(VIC+16)AND1)=0THENDX=-DX :REM IF SPRITE IS....
390 REM TOUCHING THE LEFT EDGE (X=24 AND THE MSB FOR SPRITE 0 IS 0), REVERSE IT
400 IFX=40AND(PEEK(VIC+16)AND1)=1THENDX=-DX :REM IF SPRITE IS....
410 REM TOUCHING THE RIGHT EDGE (X=40 AND THE MSB FOR SPRITE 0 IS 1), REVERSE IT
420 IFX=255ANDDX=1THENX=-1:SIDE=1
430 REM SWITCH TO OTHER SIDE OF THE SCREEN
440 IFX=0ANDDX=-1THENX=256:SIDE=0
450 REM SWITCH TO OTHER SIDE OF THE SCREEN
460 X=X+DX:REM ADD DELTA X TO X
470 X=XAND255:REM MAKE SURE X IS IN ALLOWED RANGE
480 Y=Y+DY:REM ADD DELTA Y TO Y
485 POKE VIC+16,SIDE
490 POKE VIC,X :REM PUT NEW X VALUE INTO SPRITE 0'S X POSITION
510 POKE VIC+1,Y :REM PUT NEW Y VALUE INTO SPRITE 0'S Y POSITION
530 GOTO 340
600 REM ***** SPRITE DATA *****
610 DATA 0,127,0,1,255,192,3,255,224,3,231,224
620 DATA 7,217,240,7,223,240,7,217,240,3,231,224
630 DATA 3,255,224,3,255,224,2,255,160,1,127,64
640 DATA 1,62,64,0,156,128,0,156,128,0,73,0,0,73,0
650 DATA 0,62,0,0,62,0,0,62,0,0,28,0,0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment