Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .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
- ;declare variables
- .enum $0000 ;;start variables at ram location 0
- spritedir .dsb 1 ; .rs 1 means reserve one byte of space
- spritenumber .dsb 1
- .ende
- spriteram = $0200
- ;;;;;;;;;;;;;;;
- .org $C000
- RESET:
- SEI ; disable IRQs
- CLD ; disable decimal mode
- LDX #$40
- STX $4017 ; disable APU frame IRQ
- LDX #$FF
- TXS ; Set up stack
- INX ; now X = 0
- STX $2000 ; disable NMI
- STX $2001 ; disable rendering
- STX $4010 ; disable DMC IRQs
- vblankwait1: ; First wait for vblank to make sure PPU is ready
- BIT $2002
- BPL vblankwait1
- clrmem:
- LDA #$00
- STA $0000, x
- STA $0100, x
- STA $0200, x
- STA $0400, x
- STA $0500, x
- STA $0600, x
- STA $0700, x
- LDA #$FE
- STA $0300, x
- INX
- BNE clrmem
- ;------------VARIABLES----------------
- lda #0
- sta spritedir
- sta spritenumber
- vblankwait2: ; Second wait for vblank, PPU is ready after this
- BIT $2002
- BPL vblankwait2
- LoadPalettes:
- LDA $2002 ; read PPU status to reset the high/low latch
- LDA #$3F
- STA $2006 ; write the high byte of $3F00 address
- LDA #$00
- STA $2006 ; write the low byte of $3F00 address
- LDX #$00 ; start out at 0
- LoadPalettesLoop:
- LDA palette, x ; load data from address (palette + the value in x)
- ; 1st time through loop it will load palette+0
- ; 2nd time through loop it will load palette+1
- ; 3rd time through loop it will load palette+2
- ; etc
- STA $2007 ; write to PPU
- INX ; X = X + 1
- CPX #$20 ; Compare X to hex $10, decimal 16 - copying 16 bytes = 4 sprites
- BNE LoadPalettesLoop ; Branch to LoadPalettesLoop if compare was Not Equal to zero
- ; if compare was equal to 32, keep going down
- LoadSprites:
- LDX #$00 ; start at 0
- -
- LDA sprites, x ; load data from address (sprites + x)
- STA spriteram, x ; store into RAM address ($0200 + x)
- INX ; X = X + 1
- CPX #$00 ; Compare X to hex $10, decimal 16
- BNE - ; Branch to LoadSpritesLoop if compare was Not Equal to zero
- ; if compare was equal to 32, keep going down
- LDA #%10000000 ; enable NMI, sprites from Pattern Table 1
- STA $2000
- LDA #%00010000 ; enable sprites
- STA $2001
- Forever:
- JMP Forever ;jump back to Forever, infinite loop
- NMI:
- JSR readcontroller
- JSR updatesprites
- JSR spritemovecheck
- JSR spritechangecheck
- RTI ; return from interrupt
- ;;;;;;;;;;;;;;
- .org $E000
- palette:
- .db $0f,$01,$11,$21,$0f,$04,$14,$24,$0f,$06,$16,$26,$0f,$09,$19,$29
- .db $0f,$01,$11,$21,$0f,$04,$14,$24,$0f,$06,$16,$26,$0f,$09,$19,$29
- 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
- spritetiles0:
- .db $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0a,$0b,$0c,$0d,$0e,$0f
- .db $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0a,$0b,$0c,$0d,$0e,$0f
- .db $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0a,$0b,$0c,$0d,$0e,$0f
- .db $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0a,$0b,$0c,$0d,$0e,$0f
- spritetiles1:
- .db $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1a,$1b,$1c,$1d,$1e,$1f
- .db $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1a,$1b,$1c,$1d,$1e,$1f
- .db $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1a,$1b,$1c,$1d,$1e,$1f
- .db $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1a,$1b,$1c,$1d,$1e,$1f
- spritetiles2:
- .db $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2a,$2b,$2c,$2d,$2e,$2f
- .db $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2a,$2b,$2c,$2d,$2e,$2f
- .db $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2a,$2b,$2c,$2d,$2e,$2f
- .db $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2a,$2b,$2c,$2d,$2e,$2f
- spritetiles3:
- .db $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3a,$3b,$3c,$3d,$3e,$3f
- .db $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3a,$3b,$3c,$3d,$3e,$3f
- .db $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3a,$3b,$3c,$3d,$3e,$3f
- .db $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3a,$3b,$3c,$3d,$3e,$3f
- spritetiles4:
- .db $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4a,$4b,$4c,$4d,$4e,$4f
- .db $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4a,$4b,$4c,$4d,$4e,$4f
- .db $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4a,$4b,$4c,$4d,$4e,$4f
- .db $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4a,$4b,$4c,$4d,$4e,$4f
- sprites:
- ;vert tile attr horiz
- .db $08, $00, $00, $a4
- .db $08, $01, $00, $c9
- .db $08, $02, $00, $84
- .db $10, $03, $00, $88
- .db $10, $04, $01, $e5
- .db $18, $05, $01, $20
- .db $18, $06, $01, $31
- .db $20, $07, $01, $17
- .db $28, $08, $02, $6e
- .db $28, $09, $02, $89
- .db $30, $0a, $02, $6b
- .db $38, $0b, $02, $e1
- .db $38, $00, $03, $5a
- .db $38, $01, $03, $bd
- .db $40, $02, $03, $90
- .db $40, $03, $03, $bf
- .db $48, $04, $00, $53
- .db $48, $05, $00, $63
- .db $48, $06, $00, $9d
- .db $50, $07, $00, $e9
- .db $50, $08, $01, $f3
- .db $58, $09, $01, $13
- .db $60, $0a, $01, $53
- .db $60, $0b, $01, $88
- .db $68, $00, $02, $76
- .db $68, $01, $02, $bb
- .db $68, $02, $02, $f6
- .db $70, $03, $02, $dd
- .db $70, $04, $03, $df
- .db $78, $05, $03, $86
- .db $78, $06, $03, $1d
- .db $80, $07, $03, $e1
- .db $80, $08, $00, $ca
- .db $80, $09, $00, $99
- .db $88, $0a, $00, $c3
- .db $88, $0b, $00, $5e
- .db $90, $00, $01, $1f
- .db $98, $01, $01, $1e
- .db $98, $02, $01, $99
- .db $98, $03, $01, $e2
- .db $a0, $04, $02, $3d
- .db $a0, $05, $02, $a2
- .db $a8, $06, $02, $24
- .db $b0, $07, $02, $ec
- .db $b0, $08, $03, $09
- .db $b0, $09, $03, $16
- .db $b8, $0a, $03, $aa
- .db $b8, $0b, $03, $5b
- .db $c0, $00, $00, $54
- .db $c0, $01, $00, $fa
- .db $c0, $02, $00, $74
- .db $c8, $03, $00, $c9
- .db $c8, $04, $01, $0b
- .db $d0, $05, $01, $a9
- .db $d0, $06, $01, $37
- .db $d0, $07, $01, $e2
- .db $d8, $08, $02, $74
- .db $d8, $09, $02, $1d
- .db $d8, $0a, $02, $85
- .db $e0, $0b, $02, $d1
- .db $e0, $00, $03, $f4
- .db $e8, $01, $03, $da
- .db $e8, $02, $03, $31
- .db $e8, $03, $03, $12
- ;-------------------------------
- ; 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
- ;-----------------------------
- ;-------------------------------------
- ; controller reading subroutines start
- readcontroller:
- LatchController:
- LDA #$01
- STA $4016
- LDA #$00
- STA $4016 ; tell both the controllers to latch buttons
- ReadA:
- LDA $4016 ; player 1 - A
- AND #%00000001 ; only look at bit 0
- beq readb
- INC spritenumber
- LDA spritenumber
- CMP #5 ;equal to total # of screens +1, from zero
- BNE NoResetSpr
- lda #0
- sta spritenumber
- jsr spritechangecheck
- JMP ReadADone
- NoResetSpr:
- jsr spritechangecheck
- ReadADone: ; handling this button is done
- readb:
- LDA $4016 ; player 1 - B
- AND #%00000001 ; only look at bit 0
- BEQ ReadBDone ; branch to ReadBDone if button is NOT pressed (0)
- ReadBDone: ; handling this button is done
- Readselect:
- LDA $4016 ; player 1 - select
- AND #%00000001 ; only look at bit 0
- BEQ ReadselectDone ; branch to Readselect Done if button is NOT pressed (0)
- ReadselectDone: ; handling this button is done
- Readstart:
- LDA $4016 ; player 1 - select
- AND #%00000001 ; only look at bit 0
- BEQ ReadstartDone ; branch to Readstart Done if button is NOT pressed (0)
- ReadstartDone: ; handling this button is donespriteRAM = $0200
- Readup:
- LDA $4016 ; player 1 - up
- AND #%00000001 ; only look at bit 0
- BEQ ReadupDone ; branch to Readup Done if button is NOT pressed (0)
- LDA #1
- STA spritedir
- ReadupDone: ; handling this button is done
- Readdown:
- LDA $4016 ; player 1 + down
- AND #%00000001 ; only look at bit 0
- BEQ ReaddownDone ; branch to Readdown Done if button is NOT pressed (0)
- LDA #2
- STA spritedir
- ReaddownDone: ; handling this button is done
- Readleft:
- LDA $4016 ; player 1 - select
- AND #%00000001 ; only look at bit 0
- BEQ ReadleftDone ; branch to Readleft Done if button is NOT pressed (0)
- LDA #3
- STA spritedir
- ReadleftDone: ; handling this button is done
- Readright:
- LDA $4016 ; player 1 - select
- AND #%00000001 ; only look at bit 0
- BEQ ReadrightDone ; branch to Readright Done if button is NOT pressed (0)
- LDA #4
- STA spritedir
- ReadrightDone: ; handling this button is done
- RTS
- ; controller read subroutine ends
- ;--------------------------------
- ;-----------------------------------------
- ; 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 direction check subroutines start
- spritechangecheck
- LDA spritenumber
- testa
- CMP #0
- BNE testb
- JSR SprNum0
- JMP end
- testb
- CMP #1
- BNE testc
- JSR SprNum1
- JMP end
- testc
- CMP #2
- BNE testd
- JSR SprNum2
- JMP end
- testd
- CMP #3
- BNE teste
- JSR SprNum3
- JMP end
- teste
- CMP #4
- JSR SprNum4
- JMP end
- end
- RTS
- ;-------------------------------
- ;------------------
- SprNum0:
- CMP #0
- BNE SprNum1
- ldx #0
- ldy #0
- -
- lda spritetiles0,y
- sta $201,x
- iny
- inx
- inx
- inx
- inx
- bne -
- JMP SprChangeOver
- ;------------------
- SprNum1:
- CMP #1
- BNE SprNum2
- ldx #0
- ldy #0
- -
- lda spritetiles1,y
- sta $201,x
- iny
- inx
- inx
- inx
- inx
- bne -
- JMP SprChangeOver
- ;------------------
- SprNum2:
- CMP #2
- BNE SprNum3
- ldx #0
- ldy #0
- -
- lda spritetiles2,y
- sta $201,x
- iny
- inx
- inx
- inx
- inx
- bne -
- JMP SprChangeOver
- ;------------------
- SprNum3:
- CMP #3
- BNE SprNum4
- ldx #0
- ldy #0
- -
- lda spritetiles3,y
- sta $201,x
- iny
- inx
- inx
- inx
- inx
- bne -
- JMP SprChangeOver
- ;------------------
- SprNum4:
- CMP #4
- ;BNE
- ldx #0
- ldy #0
- -
- lda spritetiles4,y
- sta $201,x
- iny
- inx
- inx
- inx
- inx
- bne -
- SprChangeOver:
- RTS
- ;-------------------------------
- .org $FFFA ;first of the three vectors starts here
- .dw NMI ;when an NMI happens (once per frame if enabled) the
- ;processor will jump to the label NMI:
- .dw RESET ;when the processor first turns on or is reset, it will jump
- ;to the label RESET:
- .dw 0 ;external interrupt IRQ is not used in this tutorial
- ;;;;;;;;;;;;;;
- .incbin "sprites.chr" ;includes 8KB graphics file from SMB1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement