Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .enum $0000 ;;start variables at ram location 0
- spritedir .dsb 1 ; .rs 1 means reserve one byte of space
- spritenumber .dsb 1
- newbuttons .dsb 1
- oldbuttons .dsb 1
- justpressed .dsb 1
- screennumber .dsb 1
- oldscreen .dsb 1
- palettenumber .dsb 1
- string1 .dsb 1
- string2 .dsb 1
- string3 .dsb 1
- tempval .dsb 1
- ppumask .dsb 1
- gamestate .dsb 1
- playspritesloadcheck .dsb 1
- titlespritesloadcheck .dsb 1
- cursorx .dsb 1
- cursory .dsb 1
- .ende
- stateselect = $0
- stateplay = $1
- spriteram = $0200
- ; ----------------------------------------------------
- .ORG $7ff0
- Header: ; 16 byte .NES header (iNES format)
- .DB "NES", $1a
- .DB $02 ; size of PRG ROM in 16kb units
- .DB $01 ; size of CHR ROM in 8kb units
- .DB #%00000000 ; mapper 0
- .DB #%00000000 ; mapper 0
- .DB $00
- .DB $00
- .DB $00
- .DB $00
- .DB $00
- .DB $00
- .DB $00
- .DB $00
- .ORG $8000
- ; ----------------------------------------------------
- Reset: ; reset routine
- SEI
- CLD
- LDX #$00
- STX $2000
- STX $2001
- DEX
- TXS
- LDX #0
- TXA
- ClearMemory:
- STA 0, X
- STA $100, X
- STA $200, X
- STA $300, X
- STA $400, X
- STA $500, X
- STA $600, X
- STA $700, X
- STA $800, X
- STA $900, X
- INX
- BNE ClearMemory
- ; ----------------------------------------------------
- LDA #$00 ; setting up variables
- STA screennumber
- STA palettenumber
- LDA #00
- sta playspritesloadcheck
- sta titlespritesloadcheck
- LDA #01
- STA tempval
- LDA #01
- STA string1
- LDA #02
- STA string2
- LDA #03
- STA string3
- LDA #$10
- STA cursorx
- LDA #$7f
- STA #cursory
- LDA #stateselect
- STA gamestate
- ; ----------------------------------------------------
- LDX #$02 ; warm up
- WarmUp:
- BIT $2002
- BPL WarmUp
- DEX
- BNE WarmUp
- LDA #$3F
- STA $2006
- LDA #$00
- STA $2006
- TAX
- LoadPal: ; load palette
- LDA palette, x
- STA $2007
- INX
- CPX #$20
- BNE LoadPal
- LDA #$20
- STA $2006
- LDA #$00
- STA $2006
- LDY #$04 ; clear nametables
- ClearName:
- LDX #$00
- LDA #$00
- PPULoop:
- STA $2007
- DEX
- BNE PPULoop
- DEY
- BNE ClearName
- ; ----------------------------------------------------
- LDA #<pic0 ; load low byte of first picture
- STA $10
- LDA #>pic0 ; load high byte of first picture
- STA $11
- ; ----------------------------------------------------
- JSR DrawScreen ; draw initial nametable
- JSR LoadScreen
- JSR Vblank ; turn on screen
- ; ----------------------------------------------------
- InfLoop: ; loop forever, program now controlled by NMI routine
- JMP InfLoop
- ; ----------------------------------------------------
- LoadNewPalette:
- LDX palettenumber ; load palette lookup value
- LDY #$00
- LDA #$3F
- STA $2006
- LDA #$00
- STA $2006
- LoadNewPal: ; load palette
- LDA palette, x
- STA $2007
- INX
- INY
- CPY #$10
- BNE LoadNewPal
- RTS
- ; ----------------------------------------------------
- DrawScreen:
- LDA #$20 ; set to beginning of first nametable
- STA $2006
- LDA #$00
- STA $2006
- LDY #$00
- LDX #$04
- NameLoop: ; loop to draw entire nametable
- LDA ($10),y
- STA $2007
- INY
- BNE NameLoop
- INC $11
- DEX
- BNE NameLoop
- RTS
- ; ----------------------------------------------------
- Vblank: ; turn on the screen and start the party
- BIT $2002
- BPL Vblank
- LDA #%10000000
- STA $2000
- LDA #%00011110
- STA $2001
- STA ppumask
- RTS
- ; ----------------------------------------------------
- LoadScreen:
- LDA #%00000000 ; disable NMI's and screen display
- STA $2000
- LDA #%00000000
- STA $2001
- LDA screennumber
- Test0:
- CMP #0 ; compare screennumber to find out which picture / palette to load
- BNE Test1
- LDA #<pic0 ; load low byte of picture
- STA $10
- LDA #>pic0 ; load high byte of picture
- STA $11
- LDA #$00
- STA palettenumber ; set palette lookup location
- RTS
- Test1:
- CMP #0 ; compare screennumber to find out which picture / palette to load
- BNE donepic
- LDA #<pic1 ; load low byte of picture
- STA $10
- LDA #>pic1 ; load high byte of picture
- STA $11
- LDA #$00
- STA palettenumber ; set palette lookup location
- RTS
- donepic:
- STA palettenumber
- RTS
- ; ----------------------------------------------------
- ControllerTest:
- LDA newbuttons
- STA oldbuttons
- LDX #$00
- LDA #$01 ; strobe joypad
- STA $4016
- LDA #$00
- STA $4016
- ConLoop:
- LDA $4016 ; check the state of each button
- LSR
- ROR newbuttons
- INX
- CPX #$08
- bne ConLoop
- LDA oldbuttons ; invert bits
- EOR #$FF
- AND newbuttons
- STA justpressed
- LDA screennumber ; save old screen number for later compare
- STA oldscreen
- ;button ( 0 0 0 0 0 0 0 0 )
- ;layout ( R L D U St Sl B A )
- RTS
- ; ----------------------------------------------------
- ; ----------------------------------------------------
- NMI:
- JSR ControllerTest ; check for user input
- gameengine:
- LDA gamestate
- CMP #stateselect
- BEQ enginestateselect ;display title screen
- LDA gamestate
- CMP #stateplay
- BEQ enginestateplay ;use button held controls
- gameenginedone:
- JSR stringwritetest
- LDA #00
- STA $2005
- LDA #00
- STA $2005
- RTI
- IRQ:
- RTI
- ; ----------------------------------------------------
- enginestateselect:
- LDA titlespritesloadcheck
- BNE skiptitlespriteload
- JSR loadtitlesprites
- skiptitlespriteload:
- JSR titlecontrols
- JSR spritechangecheck
- JSR spritemovecheck
- JSR updatesprites
- jmp gameenginedone
- enginestateplay:
- LDA #%10000000 ; enable NMI, sprites from Pattern Table 0, background from Pattern Table 1
- STA $2000
- LDA #%00010000
- STA $2001
- LDA playspritesloadcheck
- BNE skipplayspriteload
- JSR loadplaysprites
- skipplayspriteload:
- JSR playcontrols
- JSR spritechangecheck
- jsr spritemovecheck
- JSR updatesprites
- jmp gameenginedone
- palette: ; palette data
- .db $0F,$20,$24,$20,$0F,$05,$26,$30,$0F,$13,$23,$33,$0F,$01,$11,$21 ; palette 0
- .db $0F,$20,$20,$30,$0F,$05,$26,$30,$0F,$13,$23,$33,$0F,$1C,$2B,$39 ; palette 1
- speed:
- .db $01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04
- .db $01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04
- .db $01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04
- .db $01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04,$01,$02,$03,$04
- playsprites:
- ;vert tile attr horiz
- .db $08, $20, $00, $a4
- .db $08, $20, $00, $c9
- .db $08, $20, $00, $84
- .db $10, $20, $00, $88
- .db $10, $20, $00, $e5
- .db $18, $20, $00, $20
- .db $18, $20, $00, $31
- .db $20, $20, $00, $17
- .db $28, $20, $00, $6e
- .db $28, $20, $00, $89
- .db $30, $20, $00, $6b
- .db $38, $20, $00, $e1
- .db $38, $20, $00, $5a
- .db $38, $20, $00, $bd
- .db $40, $20, $00, $90
- .db $40, $20, $00, $bf
- .db $48, $20, $00, $53
- .db $48, $20, $00, $63
- .db $48, $20, $00, $9d
- .db $50, $20, $00, $e9
- .db $50, $20, $00, $f3
- .db $58, $20, $00, $13
- .db $60, $20, $00, $53
- .db $60, $20, $00, $88
- .db $68, $20, $00, $76
- .db $68, $20, $00, $bb
- .db $68, $20, $00, $f6
- .db $70, $20, $00, $dd
- .db $70, $20, $00, $df
- .db $78, $20, $00, $86
- .db $78, $20, $00, $1d
- .db $80, $20, $00, $e1
- .db $80, $20, $00, $ca
- .db $80, $20, $00, $99
- .db $88, $20, $00, $c3
- .db $88, $20, $00, $5e
- .db $90, $20, $00, $1f
- .db $98, $20, $00, $1e
- .db $98, $20, $00, $99
- .db $98, $20, $00, $e2
- .db $a0, $20, $00, $3d
- .db $a0, $20, $00, $a2
- .db $a8, $20, $00, $24
- .db $b0, $20, $00, $ec
- .db $b0, $20, $00, $09
- .db $b0, $20, $00, $16
- .db $b8, $20, $00, $aa
- .db $b8, $20, $00, $5b
- .db $c0, $20, $00, $54
- .db $c0, $20, $00, $fa
- .db $c0, $20, $00, $74
- .db $c8, $20, $00, $c9
- .db $c8, $20, $00, $0b
- .db $d0, $20, $00, $a9
- .db $d0, $20, $00, $37
- .db $d0, $20, $00, $e2
- .db $d8, $20, $00, $74
- .db $d8, $20, $00, $1d
- .db $d8, $20, $00, $85
- .db $e0, $20, $00, $d1
- .db $e0, $20, $00, $f4
- .db $e8, $20, $00, $da
- .db $e8, $20, $00, $31
- .db $e8, $20, $00, $12
- ;-------------------------------
- loadplaysprites:
- ldx #0
- -
- lda playsprites,x ;load sprites
- sta spriteram,x ;copy to RAM
- sta $0200,x ;copy to DMA location
- inx
- bne -
- lda #01
- sta playspritesloadcheck
- RTS
- loadtitlesprites:
- LDA #cursory
- STA $0200 ; put spritein center ($7f) of screen vert
- LDA #tempval
- STA $0201 ; tile number = 0
- LDA #$00
- STA $0202 ; color = 0, no flipping
- LDA #cursorx
- STA $0203 ; put sprite on left of screen ($10) of screen horiz
- lda #01
- sta titlespritesloadcheck
- RTS
- lda #01
- sta titlespritesloadcheck
- RTS
- ;-------------------------------
- ; sprite update subroutine start
- updatesprites:
- LDA #$00
- STA $2003 ; set the low byte (00) of the RAM address
- LDA #$02
- STA $4014 ; set the high byte (02) of the RAM address, start the transfer
- RTS
- ; Sprite update subroutine end
- ;-----------------------------
- ;-----------------------------------------
- ; Sprite direction check subroutines start
- spritemovecheck
- LDA spritedir
- test0
- CMP #0
- BNE test1
- JMP done
- test1
- CMP #1
- BNE test2
- JSR up
- JMP done
- test2
- CMP #2
- BNE test3
- JSR down
- JMP done
- test3
- CMP #3
- BNE test4
- JSR left
- JMP done
- test4
- CMP #4
- JSR right
- JMP done
- done
- RTS
- ;------------------------------
- ; Sprite move subroutines start
- up
- LDX #0
- LDY #0
- -
- CLC
- LDA spriteram,x
- SBC speed,y
- STA spriteram,x
- STA $0200,x
- INY
- INX
- INX
- INX
- INX
- CPX #0
- BNE -
- RTS
- down
- LDX #0
- LDY #0
- -
- CLC
- LDA spriteram,x
- ADC speed,y
- STA spriteram,x
- STA $0200,x
- INY
- INX
- INX
- INX
- INX
- CPX #0
- BNE -
- RTS
- right:
- LDX #0
- LDY #0
- -
- CLC
- LDA spriteram+3,x
- ADC speed,y
- STA spriteram+3,x
- STA $0203,x
- INY
- INX
- INX
- INX
- INX
- CPX #0
- BNE -
- RTS
- left
- LDX #0
- LDY #0
- -
- CLC
- LDA spriteram+3,x
- SBC speed,y
- STA spriteram+3,x
- STA $0203,x
- INY
- INX
- INX
- INX
- INX
- CPX #0
- BNE -
- RTS
- ; Sprite direction subroutines end
- ;---------------------------------
- ;-----------------------------------------
- ; Sprite change check subroutines start
- spritechangecheck
- LDA spritenumber
- testa
- CMP #0
- BNE testb
- JSR SprNum0
- JMP end
- testb
- CMP #1
- BNE end
- JSR SprNum1
- JMP end
- end:
- RTS
- ;------------------
- ;------------------
- SprNum0:
- CMP #0
- BNE SprNum1
- ldx #0
- ldy #0
- -
- lda string1 ;,y
- sta $201,x
- iny
- inx
- inx
- inx
- inx
- bne -
- JMP SprChangeover
- ;------------------
- SprNum1:
- CMP #1
- BNE SprChangeover
- ldx #0
- ldy #0
- -
- lda string2 ;,y
- sta $201,x
- iny
- inx
- inx
- inx
- inx
- bne -
- JMP SprChangeover
- SprChangeover:
- RTS
- ;-------------------------------
- titlecontrols:
- checkup:
- LDA #%00010000
- AND justpressed
- BEQ checkdown
- LDA spriteram
- SEC
- SBC #$10
- STA spriteram
- STA $0200
- LDA tempval
- SEC
- SBC #16
- STA tempval
- STA string1
- checkdown:
- LDA #%00100000
- AND justpressed
- BEQ checkleft
- LDA spriteram
- clc
- ADC #$10
- STA spriteram
- STA $0200
- LDA tempval
- CLC
- ADC #16
- STA tempval
- STA string1
- checkleft:
- LDA #%01000000
- AND justpressed
- beq checkright
- LDA spriteram+3
- sec
- SBC #16
- STA spriteram+3
- STA $0203
- LDA tempval
- SEC
- SBC #1
- STA tempval
- STA string1
- checkright:
- LDA #%10000000
- AND justpressed
- BEQ checkselect
- LDA spriteram+3
- clc
- ADC #16
- STA spriteram+3
- STA $0203
- LDA tempval
- CLC
- ADC #1
- STA tempval
- STA string1
- checkselect:
- LDA #%00000100
- AND justpressed
- BEQ checkstart
- LDA tempval
- STA string1
- checkstart:
- LDA #%00001000
- AND justpressed
- BEQ selectcontrolsdone
- LDA #stateplay
- STA gamestate
- selectcontrolsdone:
- RTS
- playcontrols:
- playcheckup:
- LDA #%00010000
- AND justpressed
- BEQ playcheckdown
- LDA #1
- STA spritedir
- playcheckdown:
- LDA #%00100000
- AND justpressed
- BEQ playcheckleft
- LDA #2
- STA spritedir
- playcheckleft:
- LDA #%01000000
- AND justpressed
- beq playcheckright
- LDA #3
- STA spritedir
- playcheckright:
- LDA #%10000000
- AND justpressed
- BEQ playcheckselect
- LDA #4
- STA spritedir
- playcheckselect:
- LDA #%00000100
- AND justpressed
- BEQ playcheckstart
- playcheckstart:
- LDA #%00001000
- AND justpressed
- BEQ playchecksdone
- playchecksdone:
- RTS
- stringwritetest:
- LDA #$20 ; set to beginning of first nametable
- STA $2006
- LDA #$e1
- STA $2006
- LDA tempval
- STA $2007
- RTS
- ;---------------------------------------------
- ; include picture data
- pic0:
- .INCBIN "entry.nam"
- pic1:
- .INCBIN "blank.nam"
- ;----------------------------------------------------
- .ORG $fffa ; vectors
- .DW NMI
- .DW Reset
- .DW IRQ
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement