[stella] My very first

Subject: [stella] My very first
From: Adam Wozniak <adam@xxxxxxxxxxxxxxxx>
Date: Wed, 1 Jan 2003 19:11:08 -0800 (PST)
My very first attempt at a 2600 game.

It's Sokoban, a classic "push blocks around a maze" puzzle game.

Nothing really there yet to speak of, but it does run.

Can anybody spot any cheap ways to gain some cycles?

I'm using an asymmetric playfield, and I'm afraid my
kernel doesn't have enough time left to draw sprites!

-- 
Will code for food.       http://cuddlepuddle.org/~adam/resume.html

adam@xxxxxxxxxxxxxxxx        http://cuddlepuddle.org/~adam/pgp.html

Attachment: soko.bin
Description: soko.bin

; Sokoban for the Atari 2600
; Adam Wozniak
; demo 0
; 1-Jan-2003

        processor 6502
        include vcs.h

man      equ $80
myrow    equ $81
tmp      equ $82
tmp2     equ $83
tmp3     equ $84
tmp4     equ $85
tmp5     equ $86

toptr    equ $87
fromptr  equ $88

Maze     equ $90 ; 2*3*16 == $60 bytes!

        org $F000
Start
        sei             ; disable interrupts

        cld             ; hex math, not BCD

        ldx #$FF        ; set the stack pointer to $FF
        txs

        lda #0          ; clear the entire stack
clear
        sta 0,x
        dex
        bne clear

        jsr Tedious     ; initialize the first maze
        ldx #$30
        stx man

Silence
        ldx #$00        ; blessed silence
        stx AUDV0
        stx AUDV1

Colors
        ldx #$24        ; player 1 color
        stx COLUP0

        ldx #$00        ; player 1 size and number
        stx NUSIZ0

        ldx #$8C        ; playfield color
        stx COLUPF

        ldx #$00        ; background color
        stx COLUBK

MainLoop
        lda VSYNC       ; start the vertical sync
        ora #$02
        sta VSYNC

        ldy #$3
        jsr SkipLines

        lda VSYNC       ; end the vertical sync
        and #$FD
        sta VSYNC

VerticalBlank

        lda VBLANK      ; start the vertical blank
        ora #$02
        sta VBLANK

        ldy #$25
        jsr SkipLines

        lda VBLANK      ; end the vertical blank
        and #$FD
        sta VBLANK

Visible
        ldx #$00
        stx myrow

        jsr MazeRow
        jsr MazeRow
        jsr MazeRow
        jsr MazeRow
        jsr MazeRow
        jsr MazeRow
        jsr MazeRow
        jsr MazeRow
        jsr MazeRow
        jsr MazeRow
        jsr MazeRow
        jsr MazeRow
        jsr MazeRow
        jsr MazeRow
        jsr MazeRow
        jsr MazeRow

Overscan
        ldy #$1E
        jsr SkipLines

	jmp MainLoop

MazeRow
        ldx #$0C           ; cycles 2
        stx tmp2           ; cycles 3 == 5

        ldx #$00
        stx GRP0

        ; draw player
        lda myrow
        eor man
        bne label1

        ldx #$FF
        stx GRP0
label1

MazeRowLoop
        ldy myrow          ; cycles 3
        stx WSYNC          ; cycles 3

        lda Maze,Y         ; cycles 4
        sta PF0            ; cycles 3
        iny                ; cycles 2
        lda Maze,Y         ; cycles 4
        sta PF1            ; cycles 3
        iny                ; cycles 2
        lda Maze,Y         ; cycles 4
        sta PF2            ; cycles 3 == 25

        iny                ; cycles 2
        ldx Maze,Y         ; cycles 4
        stx PF0            ; cycles 3
        iny                ; cycles 2
        ldx Maze,Y         ; cycles 4
        stx PF1            ; cycles 3
        iny                ; cycles 2
        ldx Maze,Y         ; cycles 4
        stx PF2            ; cycles 3 == 27

        ldx tmp2
        dex
        stx tmp2

        bne MazeRowLoop

        lda myrow
        adc #$06
        sta myrow

        ldx #$00
        stx PF0
        stx PF1
        stx PF2

        rts

SkipLines
	ldx #$01
        stx WSYNC
        dey
        bne SkipLines
        rts

Tedious
        ldx #$10
        stx tmp5

        ldx #$00
        stx toptr
        stx fromptr

TediousLoop2

        jsr TediousInner

        lda toptr
        clc
        adc #$06
        sta toptr

        lda fromptr
        clc
        adc #$03
        sta fromptr

        ldx tmp5
        dex
        stx tmp5
        bne TediousLoop2

        rts

TediousInner
        ldx #$14
        stx tmp2

TediousLoop
        lda tmp2
        clc
        adc #$FF
        asl
        asl

        sta tmp
        ldy tmp

        lda TediousTable,Y
        iny
        ldx TediousTable,Y
        clc
        adc fromptr
        sta tmp3

        stx tmp4
        lda tmp4
        ldy tmp3
        and Maze0,Y
        beq NotTonightDear

        ldy tmp
        iny
        iny
        lda TediousTable,Y
        iny
        ldx TediousTable,Y
        clc
        adc toptr
        sta tmp3

        stx tmp4
        lda tmp4
        ldy tmp3
        ora Maze,Y
        sta Maze,Y

NotTonightDear

        ldx tmp2
        dex
        stx tmp2
        bne TediousLoop

        rts

TediousTable
        dc.b #$00, #$08, #$00, #$30
        dc.b #$00, #$04, #$00, #$C0
        dc.b #$00, #$02, #$01, #$C0
        dc.b #$00, #$01, #$01, #$30
        dc.b #$01, #$80, #$01, #$0C
        dc.b #$01, #$40, #$01, #$03
        dc.b #$01, #$20, #$02, #$03
        dc.b #$01, #$10, #$02, #$0C
        dc.b #$01, #$08, #$02, #$30
        dc.b #$01, #$04, #$02, #$C0

        dc.b #$01, #$02, #$03, #$30
        dc.b #$01, #$01, #$03, #$C0
        dc.b #$02, #$80, #$04, #$C0
        dc.b #$02, #$40, #$04, #$30
        dc.b #$02, #$20, #$04, #$0C
        dc.b #$02, #$10, #$04, #$03
        dc.b #$02, #$08, #$05, #$03
        dc.b #$02, #$04, #$05, #$0C
        dc.b #$02, #$02, #$05, #$30
        dc.b #$02, #$01, #$05, #$C0

Man
        dc.b #$00 ; ........
        dc.b #$3C ; ..****..
        dc.b #$66 ; .**..**.
        dc.b #$C3 ; **....**
        dc.b #$A5 ; *.*..*.*
        dc.b #$81 ; *......*
        dc.b #$A5 ; *.*..*.*
        dc.b #$99 ; *..**..*
        dc.b #$C3 ; **....**
        dc.b #$66 ; .**..**.
        dc.b #$3C ; ..****..
        dc.b #$00 ; ........

Spot
        dc.b #$00 ; ........
        dc.b #$00 ; ........
        dc.b #$00 ; ........
        dc.b #$00 ; ........
        dc.b #$18 ; ...**...
        dc.b #$24 ; ..*..*..
        dc.b #$24 ; ..*..*..
        dc.b #$18 ; ...**...
        dc.b #$00 ; ........
        dc.b #$00 ; ........
        dc.b #$00 ; ........
        dc.b #$00 ; ........

Gold
        dc.b #$00 ; ........
        dc.b #$3C ; ..****..
        dc.b #$66 ; .**..**.
        dc.b #$C3 ; **....**
        dc.b #$81 ; *......*
        dc.b #$81 ; *......*
        dc.b #$81 ; *......*
        dc.b #$81 ; *......*
        dc.b #$C3 ; **....**
        dc.b #$66 ; .**..**.
        dc.b #$3C ; ..****..
        dc.b #$00 ; ........

Gspot
        dc.b #$00 ; ........
        dc.b #$3C ; ..****..
        dc.b #$66 ; .**..**.
        dc.b #$C3 ; **....**
        dc.b #$99 ; *..**..*
        dc.b #$A5 ; *.*..*.*
        dc.b #$A5 ; *.*..*.*
        dc.b #$99 ; *..**..*
        dc.b #$C3 ; **....**
        dc.b #$66 ; .**..**.
        dc.b #$3C ; ..****..
        dc.b #$00 ; ........


Halt
        jmp Halt

Maze0
        dc.b #$08, #$F8, #$01
        dc.b #$00, #$88, #$00
        dc.b #$00, #$88, #$00
        dc.b #$03, #$8C, #$00
        dc.b #$02, #$04, #$00
        dc.b #$0E, #$B4, #$7E
        dc.b #$08, #$B7, #$C2
        dc.b #$08, #$00, #$02
        dc.b #$0F, #$BA, #$C2
        dc.b #$00, #$83, #$FE
        dc.b #$00, #$FE, #$00
        dc.b #$00, #$00, #$00
        dc.b #$00, #$00, #$00
        dc.b #$00, #$00, #$00
        dc.b #$00, #$00, #$00
        dc.b #$08, #$00, #$01


        org $FFFC

        dc.w Start
        dc.w Start
Current Thread