Last active
September 26, 2023 11:51
-
-
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…
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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 19264+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