8bitworkshop/presets/atari7800/sprites.dasm

443 lines
9.8 KiB
Plaintext

; Atari 7800 sprite sample
; Written by Daniel Boris (dboris@home.com)
;
; Assemble with DASM
;
processor 6502
; ************ Hardware Adresses ***************************
INPTCTRL equ $01 ;Input control
AUDC0 equ $15 ;Audio Control Channel 0
AUDC1 equ $16 ;Audio Control Channel 1
AUDF0 equ $17 ;Audio Frequency Channel 0
AUDF1 equ $18 ;Audio Frequency Channel 1
AUDV0 equ $19 ;Audio Volume Channel 0
AUDV1 equ $1A ;Audio Volume Channel 1
INPT0 equ $08 ;Paddle Control Input 0
INPT1 equ $09 ;Paddle Control Input 1
INPT2 equ $0A ;Paddle Control Input 2
INPT3 equ $0B ;Paddle Control Input 3
INPT4 equ $0C ;Player 0 Fire Button Input
INPT5 equ $0D ;Player 1 Fire Button Input
BACKGRND equ $20 ;Background Color
P0C1 equ $21 ;Palette 0 - Color 1
P0C2 equ $22 ;Palette 0 - Color 2
P0C3 equ $23 ;Palette 0 - Color 3
WSYNC equ $24 ;Wait For Sync
P1C1 equ $25 ;Palette 1 - Color 1
P1C2 equ $26 ;Palette 1 - Color 2
P1C3 equ $27 ;Palette 1 - Color 3
MSTAT equ $28 ;Maria Status
P2C1 equ $29 ;Palette 2 - Color 1
P2C2 equ $2A ;Palette 2 - Color 2
P2C3 equ $2B ;Palette 2 - Color 3
DPPH equ $2C ;Display List List Pointer High
P3C1 equ $2D ;Palette 3 - Color 1
P3C2 equ $2E ;Palette 3 - Color 2
P3C3 equ $2F ;Palette 3 - Color 3
DPPL equ $30 ;Display List List Pointer Low
P4C1 equ $31 ;Palette 4 - Color 1
P4C2 equ $32 ;Palette 4 - Color 2
P4C3 equ $33 ;Palette 4 - Color 3
CHARBASE equ $34 ;Character Base Address
P5C1 equ $35 ;Palette 5 - Color 1
P5C2 equ $36 ;Palette 5 - Color 2
P5C3 equ $37 ;Palette 5 - Color 3
OFFSET equ $38 ;Unused - Store zero here
P6C1 equ $39 ;Palette 6 - Color 1
P6C2 equ $3A ;Palette 6 - Color 2
P6C3 equ $3B ;Palette 6 - Color 3
CTRL equ $3C ;Maria Control Register
P7C1 equ $3D ;Palette 7 - Color 1
P7C2 equ $3E ;Palette 7 - Color 2
P7C3 equ $3F ;Palette 7 - Color 3
SWCHA equ $280 ;P0, P1 Joystick Directional Input
SWCHB equ $282 ;Console Switches
CTLSWA equ $281 ;I/O Control for SCHWA
CTLSWB equ $283 ;I/O Control for SCHWB
SEG.U data
;******* Vairables ********************************
org $40
xpos ds.b 1 ;X Position of sprite
ypos ds.b 1 ;Y Position of sprite
temp ds.b 1
dlpnt ds.w 1
dlend ds.b 12 ;Index of end of each DL
;**********************************************************
SEG code
org $4000 ;Start of code
START
sei ;Disable interrupts
cld ;Clear decimal mode
;******** Atari recommended startup procedure
lda #$07
sta INPTCTRL ;Lock into 7800 mode
lda #$7F
sta CTRL ;Disable DMA
lda #$00
sta OFFSET
sta INPTCTRL
ldx #$FF ;Reset stack pointer
txs
;************** Clear zero page and hardware ******
ldx #$40
lda #$00
crloop1
sta $00,x ;Clear zero page
sta $100,x ;Clear page 1
inx
bne crloop1
ldy #$00 ;Clear Ram
crloop2
sta $1800,y
sta $1900,y
sta $1a00,y
sta $1b00,y
sta $1c00,y
sta $1d00,y
sta $1e00,y
sta $1f00,y
sta $2200,y
sta $2300,y
sta $2400,y
sta $2500,y
sta $2600,y
sta $2700,y
iny
bne crloop2
ldx #$00
crloop5 ;Clear 2100-213F
sta $2100,x
inx
cpx #$40
bne crloop5
;************* Build DLL *******************
; 20 blank lines
ldx #$00
lda #$4F ;16 lines
sta $1800,x
inx
lda #$21 ;$2100 = blank DL
sta $1800,x
inx
lda #$00
sta $1800,x
inx
lda #$44 ;4 lines
sta $1800,x
inx
lda #$21
sta $1800,x
inx
lda #$00
sta $1800,x
inx
; 192 mode lines divided into 12 regions
ldy #$00
DLLloop2
lda #$4F ;16 lines
sta $1800,x
inx
lda DLPOINTH,y
sta $1800,x
inx
lda DLPOINTL,y
sta $1800,x
inx
iny
cpy #$0D ;12 DLL entries
bne DLLloop2
; 26 blank lines
lda #$4F ;16 lines
sta $1800,x
inx
lda #$21 ;$2100 = blank DL
sta $1800,x
inx
lda #$00
sta $1800,x
inx
lda #$4A ;10 lines
sta $1800,x
inx
lda #$21
sta $1800,x
inx
lda #$00
sta $1800,x
;***************** Setup Maria Registers ****************
lda #$80
sta BACKGRND ;background color
lda #$18 ;DLL at $1800
sta DPPH
lda #$00
sta DPPL
lda #$18 ;Setup Palette 0
sta P0C1
lda #$38
sta P0C2
lda #$58
sta P0C3
lda #$43 ;Enable DMA
sta CTRL
lda #$00 ;Setup ports to read mode
sta CTLSWA
sta CTLSWB
lda #$40 ;Set initial X position of sprite
sta xpos
mainloop
lda MSTAT ;Wait for VBLANK
and #$80
beq mainloop
lda SWCHA ;Read stick
and #$80 ;Pushed Right?
bne skip1
ldx xpos ;Move sprite to right
inx
stx xpos
skip1
lda SWCHA ;Read stick
and #$40 ;Pushed Left?
bne skip2
ldx xpos ;Move sprite to left
dex
stx xpos
skip2
lda SWCHA ;Read stick
and #$20 ;Pushed Down?
bne skip3
ldx ypos ;Move sprite down
cpx #176
beq skip3 ;Don't move if we are at the bottom
inx
stx ypos
skip3
lda SWCHA ;Read stick
and #$10 ;Pushed Up?
bne skip4
ldx ypos ;Move sprite up
beq skip4 ;Don't move if we are at the top
dex
stx ypos
skip4
;********************** reset DL ends ******************
ldx #$0C
lda #$00
dlclearloop
dex
sta dlend,x
bne dlclearloop
;******************** build DL entries *********************
lda ypos ;Get Y position
and #$F0
lsr ;Divide by 16
lsr
lsr
lsr
tax
lda DLPOINTL,x ;Get pointer to DL that this sprite starts in
sta dlpnt
lda DLPOINTH,x
sta dlpnt+1
;Create DL entry for upper part of sprite
ldy dlend,x ;Get the index to the end of this DL
lda #$00
sta (dlpnt),y ;Low byte of data address
iny
lda #$40 ;Mode 320x1
sta (dlpnt),y
iny
lda ypos
and #$0F
ora #$a0
sta (dlpnt),y
iny
lda #$1F ;Palette 0, 1 byte wide
sta (dlpnt),y
iny
lda xpos ;Horizontal position
sta (dlpnt),y
sty dlend,x
lda ypos
and #$0F ;See if sprite is entirely within this region
beq doneDL ;branch if it is
;Create DL entry for lower part of sprite
inx ;Next region
lda DLPOINTL,x ;Get pointer to next DL
sta dlpnt
lda DLPOINTH,x
sta dlpnt+1
ldy dlend,x ;Get the index to the end of this DL
lda #$00
sta (dlpnt),y
iny
lda #$40 ;Mode 320x1
sta (dlpnt),y
iny
lda ypos
and #$0F
eor #$0F
sta temp
lda #$a0
clc
sbc temp
sta (dlpnt),y
iny
lda #$1F ;Palette 0, 1 byte wide
sta (dlpnt),y
iny
lda xpos ;Horizontal position
sta (dlpnt),y
sty dlend,x
doneDL
;************** add DL end entry on each DL *****************************
ldx #$0C
dlendloop
dex
lda DLPOINTL,x
sta dlpnt
lda DLPOINTH,x
sta dlpnt+1
ldy dlend,x
iny
lda #$00
sta (dlpnt),y
txa
bne dlendloop
vbloop
lda MSTAT ;Wait for VBLANK to end
and #$80
bne vbloop
; test WSYNC
ldx #$04
sta WSYNC
stx BACKGRND
dex
sta WSYNC
stx BACKGRND
dex
sta WSYNC
stx BACKGRND
dex
sta WSYNC
stx BACKGRND
jmp mainloop ;Loop
redraw
NMI
RTI
IRQ
RTI
;Pointers to the DLs
DLPOINTH
.byte $22,$22,$22,$22,$23,$23,$23,$23,$24,$24,$24,$24
DLPOINTL
.byte $00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0
;************** Graphic Data *****************************
;set org and fill character
org $a000,0
.byte %00111100
org $a100
.byte %00111100
org $a200
.byte %01000010
org $a300
.byte %01000010
org $a400
.byte %10011001
org $a500
.byte %10011001
org $a600
.byte %10100101
org $a700
.byte %10100101
org $a800
.byte %10000001
org $a900
.byte %10000001
org $aA00
.byte %10100101
org $aB00
.byte %10100101
org $aC00
.byte %01000010
org $aD00
.byte %01000010
org $aE00
.byte %00111100
org $aF00
.byte %00111100
;************** Cart reset vector **************************
org $fff8
.byte $FF ;Region verification
.byte $87 ;ROM start $4000
.word #NMI
.word #START
.word #IRQ