Game 1 Unit 16 of 16

Polish

Ship it. Final touches, version number, and reflections on completing a game from start to finish.

100% of SID Symphony

The Final Unit

We’ve built a complete rhythm game. Three tracks, SID audio, timing grades, combos, multipliers, difficulty progression, high scores, and pause. The game works.

This unit is different. No new gameplay features. Instead, we polish: clean up the code, add a version number, and reflect on what we’ve built.

Version String

Professional software has version numbers. They help players know which version they’re running, and help you track bug reports:

version_text:
            !scr "v1.0"
            !byte 0

We display it on the title screen, below the game title in grey — visible but unobtrusive:

            ; Draw version (Unit 16)
            ldx #$00
dts_version:
            lda version_text,x
            beq dts_version_done
            sta SCREEN + (6 * 40) + 18,x
            lda #COL_GREY
            sta COLOUR + (6 * 40) + 18,x
            inx
            bne dts_version
dts_version_done:

Header Comments

The file header now documents the complete game:

;──────────────────────────────────────────────────────────────
; SID SYMPHONY
; A rhythm game for the Commodore 64
; Unit 16: Polish (Final Version)
;
; Complete game features:
; - Three-track rhythm gameplay with SID audio
; - Timing grades (Perfect/Good/Late) with visual feedback
; - Combo system with score multiplier (1x-4x)
; - Dynamic difficulty progression
; - High score tracking
; - Pause functionality
; - Visual juice (border flash, hit pulse)
;
; Controls:
;   X/C/V - Hit notes on tracks 1/2/3
;   P     - Pause/unpause
;   SPACE - Start game / return to title
;──────────────────────────────────────────────────────────────

Future you (or anyone reading the code) immediately understands what this program does.

What We Built

Let’s review the journey:

UnitFeatureKey Technique
1Screen setupMemory-mapped I/O
2Game structureState machine
3Note spawningObject pools
4Note movementFrame-based animation
5Hit detectionPosition comparison
6SID audioRegister programming
7Crowd meterVisual feedback loop
8Song dataData-driven design
9Sound effectsAudio layering
10Timing gradesPrecision windows
11Combo systemReward mechanics
12Visual juiceScreen effects
13DifficultyDynamic balancing
14High score16-bit comparison
15PauseState preservation
16PolishDocumentation

Each unit introduced one concept. Together, they form a complete game.

Code Size

The final program is approximately 3.7KB. That includes:

  • All game logic
  • Screen drawing routines
  • SID audio code
  • Complete song data
  • All text strings

Modern games measure in gigabytes. We built a playable experience in under 4KB.

What’s Missing

A shipped game is never truly finished. Features we could add:

  • Multiple songs: Song selection screen, different melodies
  • Difficulty levels: Easy/Normal/Hard with different speeds
  • Save to disk: Persistent high scores across sessions
  • Two-player mode: Competitive or cooperative play
  • Custom graphics: Character set with styled fonts

Each would be a lesson in itself. The foundation is here.

The 6502 Mindset

Building this game taught patterns that apply to all 6502 development:

Think in bytes. Every variable, every constant, every piece of data is one or two bytes. This constraint focuses design.

Tables over calculations. The speed lookup table, the note frequency table — pre-computed data beats runtime maths.

State machines work. Title, playing, paused, game over, victory — five states, clean transitions, predictable behaviour.

Memory is I/O. Write to $D020, the border changes colour. Write to $D400, the SID makes sound. Direct, immediate, powerful.

Congratulations

You’ve completed SID Symphony. From an empty screen to a playable rhythm game, you’ve written every line of code, understood every byte.

This is real game development. Not a framework, not an engine — raw assembly, talking directly to hardware. The same techniques that powered commercial C64 games in the 1980s.

Take what you’ve learned and build something new.