mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-11-22 14:33:51 +00:00
443 lines
9.8 KiB
Plaintext
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
|
|
|
|
|