This is my current hobby. It’s giving me a much clearer understanding how to actually use assembler to do common programming tasks. While there is little call for 6502 programmers these days, I feel like I can better understand general purpose CPU programming now.

This code is a moderate hack of the kernel code shown here.

;; Built with:  http://www.atari2600.org/DASM/DASM22010b.zip
;; bin\DOS\DASm.exe playfield2.asm \ 
;; -IDASM\Machines\ATARI2600 \
;; -f3 -v5 -o..\ROMS\a.bin 
;;
       processor 6502
       include "VCS.h"
       include "macro.h"

PATTERN         = $80       ; first byte of RAM
SHAPE       = $55
BGCOLOR_ADDR    = $81
BGCOLOR     = $0A
BGTIMER_ADDR    = $82
BGTIMER     = 40
PLAYFIELD_COLOR = $0
TIMETOCHANGE    = 20

        SEG
        ORG $F000

Reset

    ;; Zero out RAM, TIA
    ;; RAM - $80-$FF
    ;; TIA - 0 - $7F    
    ldx #0
    lda #0
RAMLoop
    sta 0,x
    inx
    bne RAMLoop

    ;; -------
    ;; Init playfield   
    ;; -------
    lda SHAPE
    sta PATTERN
    lda #PLAYFIELD_COLOR
    sta COLUPF
    ldy #0          ; animation clock

    lda #$10    ; Remember, 
                        ; high nibble 
                        ; is read
                        ; backwards
    sta PF0

    lda #$80    ; Entire byte
                        ; read backwards
    sta PF2

    lda #$01
    sta CTRLPF

    ;; setup the bgcolor stuff
    ldx #BGTIMER
    stx BGTIMER_ADDR

    ldx #BGCOLOR
    stx BGCOLOR_ADDR
    stx COLUBK

StartOfFrame

    ; Start of vblank processing
        lda #0
    sta VBLANK
        lda #2
        sta VSYNC

        ; 3 scanlines of VSYNCH 
        sta WSYNC
        sta WSYNC
        sta WSYNC

        lda #0
        sta VSYNC

        ; 37 lines of vertical blank
    ldx #$CA
VertBlank
        inx
    sta WSYNC
    bne VertBlank

    ;; Playfield animation
    iny
    cpy #TIMETOCHANGE
    bne NOTYET

    ldy #0  ; reset ani clock
    ;; bit shift the pattern
    asl PATTERN
    bne NOTYET

    ;; Reset pattern
    lda SHAPE
    sta PATTERN


NOTYET
    lda PATTERN
    sta PF1

    ;; Change the color by adding
        ;; the aniclock tick to the 
        ;; base color
    clc
    tya 
    adc PLAYFIELD_COLOR
    sta COLUPF

    ;; 192 scanlines of picture
    ldx #$C0    
MainPicture
    sta WSYNC ; strobe Wait for Sync
    dex
    bne MainPicture

    ;; Is it time to change 
        ;; the BG COLOR?
    dec BGTIMER_ADDR
    bne LOAD_BGCOLOR

    ;; Yes - restore timer, 
        ;; change color
    ldx #BGTIMER
    stx BGTIMER_ADDR 
    asl BGCOLOR_ADDR
    bne LOAD_BGCOLOR

    ;; Reset BGCOLOR
    ldx #BGCOLOR
    stx BGCOLOR_ADDR

LOAD_BGCOLOR
    ldx BGCOLOR_ADDR 
    stx COLUBK

    ;; Vertical Blanking
        lda #%01000010
        sta VBLANK       

        ; 30 scanlines of overscan...
    ; #D2 = 226, 256-30
    ldx #$D2
OverScanLoop
    inx
    sta WSYNC
    bne OverScanLoop

        jmp StartOfFrame

        ORG $FFFA

    ;; Interrupt Vectors
        .word Reset          ; NMI
        .word Reset          ; RESET
        .word Reset          ; IRQ

  END

I’d like to make some playable game for the atari 2600 some day. That would bring my childhood dreams to life.