Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .inesprg 1 ; 1x 16KB PRG code
- .ineschr 1 ; 1x 8KB CHR data
- .inesmap 0 ; mapper 3 = CNROM, 8KB CHR swapping
- .inesmir 0 ; background mirroring
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;---Variables---
- character_number .rs 1 ;For all the characters
- enemy_number .rs 1 ;Just for enemies
- enemy_direction .rs 4
- enemy_animation .rs 4
- RandomLow .rs 1
- RandomHigh .rs 1
- RandomTemp .rs 1
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;---Constants---
- HERO_Y = $0200
- HERO_X = $0203
- ENEMY_Y = $0220
- ENEMY_X = $0223
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- .bank 0
- .org $8000
- RESET:
- SEI ;Fuck IRQs
- CLD ;Decimals too! Fuck 'em
- LDX #$40
- STX $4017 ;APU frame IRQ! I said FUCK IRQs!!!
- LDX #$FF
- TXS ;Set up stack
- INX ;X register overflow, X=0
- STX $2000 ;no NMI for now
- STX $2001 ;No rendering for now
- STX $4010 ;Dang! DMC IRQs! y so many of 'em?
- 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 $0300, x
- STA $0400, x
- STA $0500, x
- STA $0600, x
- STA $0700, x
- LDA #$FE
- STA $0200, x ;move all sprites off screen
- INX
- BNE clrmem
- vblankwait2: ; Second wait for vblank, PPU is ready after this
- BIT $2002
- BPL vblankwait2
- ;NES is ready now! LET'S DO THIS! (LEEEEEEEEEEEEEROOOOOOOOOOOY JJJJJJJJJJJENKINS!)
- PalLoad:
- LDA $2002 ;PPU? r u there? We need to reset the HiLo latch!
- LDA #$3F ;Hi part of $3F00
- STA $2006
- LDA #$00 ;Lo part of it
- STA $2006
- LDX #$00
- PalLoop:
- LDA pal, x
- STA $2007 ;Load 'em palettes to PPU
- INX
- CPX #$20
- BNE PalLoop ;Advance only when all 32 palettes are copied!
- LoadSprites:
- LDX #$00
- LoadSpritesLoop:
- LDA sprite, x ;load palette byte
- STA $0200, x ;write to PPU
- INX ;set index to next byte
- CPX #$A0
- BNE LoadSpritesLoop ;if x = $20, 32 bytes copied, all done
- LoadBackground:
- LDA $2002 ; read PPU status to reset the high/low latch
- LDA #$20
- STA $2006 ; write the high byte of $2000 address
- LDA #$00
- STA $2006 ; write the low byte of $2000 address
- LDX #$00 ; start out at 0
- LoadBackgroundLoop:
- LDA #$56 ; load data from address (background + the value in x)
- STA $2007 ; write to PPU
- INX ; X = X + 1
- CPX #$00 ; Compare X to hex $80, decimal 128 - copying 128 bytes
- BNE LoadBackgroundLoop ; Branch to LoadBackgroundLoop if compare was Not Equal to zero
- ; if compare was equal to 128, keep going down
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; ________________ _____________________ _________________ ;
- ; | | | | | | ;
- ; | | | | | | ;
- ; | | | | ________|________ ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- NMI:
- 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
- PPUCleanUp:
- LDA #%10010000 ; enable NMI, sprites from Pattern Table 0, background from Pattern Table 1
- STA $2000
- LDA #%00011110 ; Enable sprites, enable background, no clipping on left side
- STA $2001
- LDA #$00 ; no scrolling
- STA $2005
- STA $2005
- EnginePlaying:
- INC RandomLow
- BNE .SeedComplete
- INC RandomHigh
- .SeedComplete
- LatchController: ;I know there are better controller reads, but for now I'm lazy
- LDA #$01
- STA $4016
- LDA #$00
- STA $4016 ; tell both the controllers to latch buttons
- LDA $4016
- LDA $4016
- LDA $4016
- LDA $4016
- LDA $4016
- AND #%00000001
- BEQ MoveUpDone
- LDA HERO_Y
- SEC
- SBC #$01
- STA HERO_Y
- MoveUpDone:
- LDA $4016
- AND #%00000001
- BEQ MoveDownDone
- LDA HERO_Y
- CLC
- ADC #$01
- STA HERO_Y
- MoveDownDone:
- LDA $4016
- AND #%00000001
- BEQ MoveLeftDone
- LDA HERO_X
- SEC
- SBC #$01
- STA HERO_X
- MoveLeftDone:
- LDA $4016
- AND #%00000001
- BEQ MoveRightDone
- LDA HERO_X
- CLC
- ADC #$01
- STA HERO_X
- MoveRightDone:
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- LDA #$00
- STA enemy_number
- MoveSprites:
- LDX enemy_number
- INC enemy_animation,x
- JSR Random
- CMP #$03
- BCS NoChange
- STA enemy_direction,x
- NoChange:
- LDA enemy_direction,x
- BNE .skip1
- JSR enemy_up
- JMP endskip
- .skip1
- CMP #$01
- BNE .skip2
- JSR enemy_down
- JMP endskip
- .skip2
- CMP #$02
- BNE .skip3
- JSR enemy_left
- JMP endskip
- .skip3
- JSR enemy_right
- endskip:
- INC enemy_number
- LDA enemy_number
- CMP #$04
- BNE MoveSprites
- LDA #$00
- STA enemy_number
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- UpdatePlayerPos:
- LDA $0200 ;Update 16x32 metsprite vertically
- STA $0204
- CLC
- ADC #$08
- STA $0208
- STA $020C
- CLC
- ADC #$08
- STA $0210
- STA $0214
- CLC
- ADC #$08
- STA $0218
- STA $021C
- LDA $0203 ;Update 16x32 metasprite horizontally
- STA $020B
- STA $0213
- STA $021B
- CLC
- ADC #$08
- STA $0207
- STA $020F
- STA $0217
- STA $021F
- UpdatePos:
- LDX enemy_number
- LDA updateconstants,x
- TAX
- LDA $0220,x ;Update 16x32 metsprite vertically
- STA $0224,x
- CLC
- ADC #$08
- STA $0228,x
- STA $022C,x
- CLC
- ADC #$08
- STA $0230,x
- STA $0234,x
- CLC
- ADC #$08
- STA $0238,x
- STA $023C,x
- LDA $0223,x ;Update 16x32 metasprite horizontally
- STA $022B,x
- STA $0233,x
- STA $023B,x
- CLC
- ADC #$08
- STA $0227,x
- STA $022F,x
- STA $0237,x
- STA $023F,x
- INC enemy_number
- LDA enemy_number
- CMP #$04
- BEQ CharMovementDone ;We got only 5 characters to move
- JMP UpdatePos
- CharMovementDone:
- LDA #$00
- STA enemy_number
- RTI
- Random:
- ; See "linear-congruential random number generator" for more.
- ; rand = (rand * 5 + 0x3611) & 0xffff;
- ; return (rand >> 8) & 0xff;
- LDA RandomHigh ; multiply by 5
- STA RandomTemp
- LDA RandomLow
- ASL a ; rand = rand * 4 + rand
- ROL RandomTemp
- ASL a
- ROL RandomTemp
- CLC
- ADC RandomLow
- PHA
- LDA RandomTemp
- ADC RandomHigh
- STA RandomHigh
- PLA ; rand = rand + 0x3611
- CLC
- ADC #$11
- STA RandomLow
- LDA RandomHigh
- ADC #$36
- STA RandomHigh
- RTS
- ;------------------------------
- enemy_up:
- LDX enemy_number ;move the sprite up
- LDY updateconstants,x
- LDA ENEMY_Y,y
- SEC
- SBC #$01
- STA ENEMY_Y,y
- RTS
- ;------------------------------
- enemy_down:
- LDX enemy_number ;move the sprite down
- LDY updateconstants,x
- LDA ENEMY_Y,y
- CLC
- ADC #$01
- stA ENEMY_Y,y
- RTS
- ;------------------------------
- enemy_right:
- LDX enemy_number ;move the sprite right
- LDY updateconstants,x
- LDA ENEMY_X,y
- CLC
- ADC #$01
- STA ENEMY_X,y
- RTS
- ;------------------------------
- enemy_left:
- LDX enemy_number ;move the sprite left
- LDY updateconstants,x
- LDA ENEMY_X,y
- SEC
- SBC #$01
- STA ENEMY_X,y
- RTS
- ;------------------------------
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- .bank 1
- .org $E000
- pal:
- .db $30,$00,$10,$16,$1A,$38,$30,$31,$1A,$06,$36,$20,$1A,$28,$38,$16
- .db $30,$0F,$17,$36,$1A,$0F,$21,$36,$1A,$1F,$11,$37,$1A,$0F,$38,$30
- sprite:
- .db $80,$00,$00,$80,$80,$01,$00,$88,$88,$10,$00,$80,$88,$11,$00,$88 ;; $0200
- .db $90,$20,$00,$80,$90,$21,$00,$88,$98,$30,$00,$80,$98,$31,$00,$88 ;; $0210
- .db $A0,$02,$01,$80,$A0,$03,$01,$88,$A8,$12,$01,$80,$A8,$13,$01,$88 ;; $0220
- .db $B0,$22,$01,$80,$B0,$23,$01,$88,$B8,$32,$01,$80,$B8,$33,$01,$88 ;; $0230
- .db $60,$02,$01,$80,$60,$03,$01,$88,$68,$12,$01,$80,$68,$13,$01,$88 ;; $0240
- .db $70,$22,$01,$80,$70,$23,$01,$88,$78,$32,$01,$80,$78,$33,$01,$88 ;; $0250
- .db $40,$02,$01,$80,$40,$03,$01,$88,$48,$12,$01,$80,$48,$13,$01,$88 ;; $0260
- .db $50,$22,$01,$80,$50,$23,$01,$88,$58,$32,$01,$80,$58,$33,$01,$88 ;; $0270
- .db $20,$04,$01,$80,$20,$05,$01,$88,$28,$14,$01,$80,$28,$15,$01,$88 ;; $0280
- .db $30,$22,$01,$80,$30,$23,$01,$88,$38,$32,$01,$80,$38,$33,$01,$88 ;; $0290
- updateconstants:
- .db $00,$20,$40,$60
- randomenemydirection: ;these are random numbers used with the random_direction2 to make enemies switch direction
- .db $57,$CD,$AF,$05,$BC
- .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
- ;;;;;;;;;;;;;;
- .bank 2
- .org $0000
- .incbin "blaster.chr" ;includes 8KB graphics file
- ; .bank 3
- ; .org $0000
- ; .incbin "blaster1.chr" ;includes another 8KB graphics file 'cuz I got teh B4NK5WITCHUZ!!!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement