Home > Atari 2600 code

Atari 2600 code

19th August 2007

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.

Tags: assembler, atari 2600, computers, programming