Big Sprite Move Demo

 

A BIN version of this code can be found here:

 

; TIA (Stella) write-only registers
;
Vsync equ $00
Vblank equ $01
Wsync equ $02
Rsync equ $03
Nusiz0 equ $04
Nusiz1 equ $05
Colup0 equ $06
Colup1 equ $07
Colupf equ $08
Colubk equ $09
Ctrlpf equ $0A
Refp0 equ $0B
Refp1 equ $0C
Pf0 equ $0D
Pf1 equ $0E
Pf2 equ $0F
Resp0 equ $10
Resp1 equ $11
Resm0 equ $12
Resm1 equ $13
Resbl equ $14
Audc0 equ $15
Audc1 equ $16
Audf0 equ $17
Audf1 equ $18
Audv0 equ $19
Audv1 equ $1A
Grp0 equ $1B
Grp1 equ $1C
Enam0 equ $1D
Enam1 equ $1E
Enabl equ $1F
Hmp0 equ $20
Hmp1 equ $21
Hmm0 equ $22
Hmm1 equ $23
Hmbl equ $24
Vdelp0 equ $25
Vdelp1 equ $26
Vdelbl equ $27
Resmp0 equ $28
Resmp1 equ $29
Hmove equ $2A
Hmclr equ $2B
Cxclr equ $2C
;
; TIA (Stella) read-only registers
;
Cxm0p equ $00
Cxm1p equ $01
Cxp0fb equ $02
Cxp1fb equ $03
Cxm0fb equ $04
Cxm1fb equ $05
Cxblpf equ $06
Cxppmm equ $07
Inpt0 equ $08
Inpt1 equ $09
Inpt2 equ $0A
Inpt3 equ $0B
Inpt4 equ $0C
Inpt5 equ $0D
;
; RAM definitions
; Note: The system RAM maps in at 0080-00FF and also at 0180-01FF. It is
; used for variables and the system stack. The programmer must make sure
; the stack never grows so deep as to overwrite the variables.
;
RamStart equ $0080
RamEnd equ $00FF
StackBottom equ $00FF
StackTop equ $0080
;
; 6532 (RIOT) registers
;
Swcha equ $0280
Swacnt equ $0281
Swchb equ $0282
Swbcnt equ $0283
Intim equ $0284
Tim1t equ $0294
Tim8t equ $0295
Tim64t equ $0296
T1024t equ $0297
;
; ROM definitions
;
ROMStart equ $F000
ROMEnd equ $FFFF
IntVectors equ $FFFA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s1 EQU $80
s2 EQU $82
s3 EQU $84
s4 EQU $86
s5 EQU $88
s6 EQU $8A
DelayPTR EQU $8C
LoopCount EQU $8E
TopDelay EQU $8F
BottomDelay EQU $90
MoveCount EQU $91
Temp EQU $92
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Program initialization
;
ORG RomStart

Cart_Init:
SEI ; Disable interrupts.:
CLD ; Clear "decimal" mode.

LDX #$FF
TXS ; Clear the stack

Common_Init:
LDX #$28 ; Clear the TIA registers ($04-$2C)
LDA #$00
TIAClear:
STA $04,X
DEX
BPL TIAClear ; loop exits with X=$FF

LDX #$FF
RAMClear:
STA $00,X ; Clear the RAM ($FF-$80)
DEX
BMI RAMClear ; loop exits with X=$7F

LDX #$FF
TXS ; Reset the stack

IOClear:
STA Swbcnt ; console I/O always set to INPUT
STA Swacnt ; set controller I/O to INPUT

DemoInit: LDA #$01
STA VdelP0
STA VdelP1
LDA #$03
STA Nusiz0
STA Nusiz1
LDA #$36
STA ColuP0
STA ColuP1
LDA #$ff
STA s1+1
STA s2+1
STA s3+1
STA s4+1
STA s5+1
STA s6+1
LDA #0
STA s1
LDA #10
STA s2
LDA #20
STA s3
LDA #30
STA s4
LDA #40
STA s5
LDA #50
STA s6
LDA #0
STA TopDelay
STA MoveCount
LDA #179
STA BottomDelay
LDA #$f2
STA DelayPTR+1
LDA #$1d+36 ;?????
STA DelayPTR
STA Wsync
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
STA RESP0
STA RESP1
LDA #$50 ;?????
STA HMP1
LDA #$40 ;?????
STA HMP0
STA Wsync
STA HMOVE
STA Wsync
LDA #$04
STA ColuBK
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Main program loop
;
NewScreen:
LDA #$02
STA Wsync ; Wait for horizontal sync
STA Vblank ; Turn on Vblank
STA Vsync ; Turn on Vsync
STA Wsync ; Leave Vsync on for 3 lines
STA Wsync
STA Wsync
LDA #$00
STA Vsync ; Turn Vsync off

LDA #43 ; Vblank for 37 lines
; changed from 43 to 53 for 45 lines PAL
STA Tim64t ; 43*64intvls=2752=8256colclks=36.2lines

Joystick: LDA #$80
BIT SWCHA
BEQ Right
LSR
BIT SWCHA
BEQ Left
LSR
BIT SWCHA
BEQ Down
LSR
BIT SWCHA
BEQ Up
JMP VblankLoop

UP: LDA TopDelay
BEQ U1
DEC TopDelay
INC BottomDelay
U1: JMP VblankLoop

Down: LDA BottomDelay
BEQ D1
INC TopDelay
DEC BottomDelay
D1: JMP VblankLoop

Right: LDX MoveCount
INX
STX MoveCount
CPX #3
BNE R2
LDX DelayPTR
DEX
STX DelayPTR
CPX #$1c ;?????
BNE R1
LDA #$1d ;?????
STA DelayPTR
LDA #2
STA MoveCount
JMP VblankLoop
R1: LDA #0
STA MoveCount
R2: LDA #$f0
STA HMP0
STA HMP1
STA Wsync
STA HMOVE
JMP VblankLoop

Left: LDX MoveCount
DEX
STX MoveCount
CPX #$ff
BNE L2
LDX DelayPTR
INX
STX DelayPTR
CPX #$1d+37 ;?????
BNE L1
LDA #$1d+36 ;#?????
STA DelayPTR
LDA #0
STA MoveCount
JMP VblankLoop
L1: LDA #2
STA MoveCount
L2: LDA #$10
STA HMP0
STA HMP1
STA Wsync
STA HMOVE
JMP VblankLoop

ORG $F200
VblankLoop:
LDA Intim
BNE VblankLoop ; wait for vblank timer
STA Wsync ; finish waiting for the current line
STA Vblank ; Turn off Vblank

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ScreenStart:
LDY TopDelay
INY ;?????
X1: STA Wsync
DEY
BNE X1
LDY #4 ;?????
X2: DEY
BPL X2
LDA #9
STA LoopCount
JMP (DelayPTR)
JNDelay: DB $c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9
DB $c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9
DB $c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9
DB $c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c5
NOP
X3: NOP
NOP
NOP
LDY LoopCount
LDA (s1),Y
STA GRP0
LDA (s2),Y
STA GRP1
LDA (s3),Y
STA GRP0
LDA (s6),Y
STA Temp
LDA (s5),Y
TAX
LDA (S4),Y
LDY Temp
STA GRP1
STX GRP0
STY GRP1
STA GRP0
DEC LoopCount
BPL X3
LDA #0
STA GRP0
STA GRP1
STA GRP0
STA GRP1
NOP
NOP
NOP
NOP
NOP
NOP
NOP
LDY BottomDelay
INY ;?????
X4: STA Wsync
DEY
BNE X4
LDA #$02
STA Vblank
STA Wsync
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OverscanStart: LDA #35 ;skip 30 lines (overscan)
STA Tim64t

OverscanLoop:
LDA Intim
BNE OverscanLoop ; wait for Overscan timer
STA Wsync ; finish waiting for the current line

JMP NewScreen

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG $FF00
Data: DB $00,$88,$89,$8a,$8a,$8a,$aa,$fa,$d9,$88
DB $00,$82,$45,$28,$28,$28,$28,$28,$48,$88
DB $00,$3e,$20,$a0,$a0,$b8,$a0,$a0,$a0,$be
DB $00,$11,$11,$11,$11,$11,$11,$11,$11,$7d
DB $00,$17,$11,$11,$11,$f1,$11,$11,$11,$17
DB $00,$cc,$12,$01,$01,$0e,$10,$10,$09,$c6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Set up the 6502 interrupt vector table
;
ORG IntVectors
NMI dw Cart_Init
Reset dw Cart_Init
IRQ dw Cart_Init

END