I'm relatively new to programming and I have question regarding the buttons moving the sprites in my code posted below. The A button functions as I want it too but the B button does not. Essentially my A button moves my sprite to right which is I WANT it do however the B button will only move the sprite LEFT if press A and B at the same time. My question is how do I get the B button to move the sprite WITHOUT the having to press A.
essentially I want A button = Move right
B button = Move Left
here's the code
essentially I want A button = Move right
B button = Move Left
here's the code
Code:
.inesprg 1 ; 1x 16KB PRG code
.ineschr 1 ; 1x 8KB CHR data
.inesmap 0 ; mapper 0 = NROM, no bank swapping
.inesmir 1 ; background mirroring
;;;;;;;;;;;;;;;
.bank 0
.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
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
LoadSpritesLoop:
LDA sprites, x ; load data from address (sprites + x)
STA $0200, x ; store into RAM address ($0200 + x)
INX ; X = X + 1
CPX #$99 ; Compare X to hex $20, decimal 32
BNE LoadSpritesLoop ; 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:
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
LatchController:
LDA #$01
STA $4016
LDA #$00
STA $4016 ; tell both the controllers to latch buttons
ReadA:
LDA $4016 ; player 1 - B
AND #%00000001 ; only look at bit 0
ReadA1:
BEQ ReadA1
LDA $0203 ; load sprite 1 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0203 ; save sprite 1 position
LDA $0207 ; load sprite 2 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0207 ; save sprite 2 position
LDA $020B ; load sprite 3 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $020B ; save sprite 3 position
LDA $020F ; load sprite 4 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $020F ; save sprite 4 position
LDA $0213 ; load sprite 5 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0213 ; save sprite 5 position
LDA $0217 ; load sprite 6 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0217 ; save sprite 6 position
LDA $021B ; load sprite 7 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $021B ; save sprite 7 position
LDA $021F ; load sprite 8 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $021F ; save sprite 8 position
LDA $0223 ; load sprite 9 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0223 ; save sprite 9 position
LDA $0227 ; load sprite 10 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0227 ; save sprite 10 position
LDA $022B ; load sprite 11 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $022B ; save sprite 11 position
LDA $022F ; load sprite 12 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $022F ; save sprite 12 position
LDA $0233 ; load sprite 13 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0233 ; save sprite 13 position
LDA $0237 ; load sprite 14 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0237 ; save sprite 14 position
LDA $023B ; load sprite 15 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $023B ; save sprite 15 position
LDA $023F ; load sprite 16 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $023F ; save sprite 16 position
LDA $0243 ; load sprite 17 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0243 ; save sprite 17 position
LDA $0247 ; load sprite 18 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0247 ; save sprite 18 position
ReadB:
LDA $4016 ; player 1 - B
AND #%00000001 ; only look at bit 0
ReadB1
BEQ ReadB1
LDA $0203 ; load sprite 1 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0203 ; save sprite 1 position
LDA $0207 ; load sprite 2 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0207 ; save sprite 2 position
LDA $020B ; load sprite 3 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $020B ; save sprite 3 position
LDA $020F ; load sprite 4 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $020F ; save sprite 4 position
LDA $0213 ; load sprite 5 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0213 ; save sprite 5 position
LDA $0217 ; load sprite 6 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0217 ; save sprite 6 position
LDA $021B ; load sprite 7 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $021B ; save sprite 7 position
LDA $021F ; load sprite 8 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $021F ; save sprite 8 position
LDA $0223 ; load sprite 9 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0223 ; save sprite 9 position
LDA $0227 ; load sprite 10 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0227 ; save sprite 10 position
LDA $022B ; load sprite 11 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $022B ; save sprite 11 position
LDA $022F ; load sprite 12 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $022F ; save sprite 12 position
LDA $0233 ; load sprite 13 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0233 ; save sprite 13 position
LDA $0237 ; load sprite 14 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0237 ; save sprite 14 position
LDA $023B ; load sprite 15 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $023B ; save sprite 15 position
LDA $023F ; load sprite 16 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $023F ; save sprite 16 position
LDA $0243 ; load sprite 17 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0243 ; save sprite 17 position
LDA $0247 ; load sprite 18 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0247 ; save sprite 18 position
ReadBDone: ; handling this button is done
RTI ; return from interrupt
;;;;;;;;;;;;;;
.bank 1
.org $E000
palette:
.byte $33,$36,$30,$0F,$30,$0F,$0F,$0F,$33,$0F,$0F,$0F,$33,$0F,$0F,$0F
.byte $33,$36,$30,$0F,$30,$0F,$0F,$0F,$33,$0F,$0F,$0F,$33,$0F,$0F,$0F
sprites:
;vert tile attr horiz
.db $80, $00, $00, $80 ;sprite 0
.db $80, $01, $00, $88 ;sprite 1
.db $80, $02, $00, $90 ;sprite 2
.db $88, $0F, $00, $80 ;sprite 3
.db $88, $10, $00, $88 ;sprite 4
.db $88, $11, $00, $90 ;sprite 5
.db $90, $1E, $00, $80 ;sprite 6
.db $90, $1F, $00, $88 ;sprite 7
.db $90, $20, $00, $90 ;sprite 8
.db $98, $2F, $00, $80 ;sprite 9
.db $98, $30, $00, $88 ;sprite 10
.db $98, $31, $00, $90 ;sprite 11
.db $A0, $43, $00, $80 ;sprite 12
.db $A0, $44, $00, $88 ;sprite 13
.db $A0, $45, $00, $90 ;sprite 14
.db $A8, $58, $00, $80 ;sprite 15
.db $A8, $59, $00, $88 ;sprite 16
.db $A8, $5A, $00, $90 ;sprite 17
.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 "test.chr" ;includes 8KB graphics file from SMB1
.ineschr 1 ; 1x 8KB CHR data
.inesmap 0 ; mapper 0 = NROM, no bank swapping
.inesmir 1 ; background mirroring
;;;;;;;;;;;;;;;
.bank 0
.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
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
LoadSpritesLoop:
LDA sprites, x ; load data from address (sprites + x)
STA $0200, x ; store into RAM address ($0200 + x)
INX ; X = X + 1
CPX #$99 ; Compare X to hex $20, decimal 32
BNE LoadSpritesLoop ; 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:
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
LatchController:
LDA #$01
STA $4016
LDA #$00
STA $4016 ; tell both the controllers to latch buttons
ReadA:
LDA $4016 ; player 1 - B
AND #%00000001 ; only look at bit 0
ReadA1:
BEQ ReadA1
LDA $0203 ; load sprite 1 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0203 ; save sprite 1 position
LDA $0207 ; load sprite 2 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0207 ; save sprite 2 position
LDA $020B ; load sprite 3 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $020B ; save sprite 3 position
LDA $020F ; load sprite 4 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $020F ; save sprite 4 position
LDA $0213 ; load sprite 5 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0213 ; save sprite 5 position
LDA $0217 ; load sprite 6 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0217 ; save sprite 6 position
LDA $021B ; load sprite 7 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $021B ; save sprite 7 position
LDA $021F ; load sprite 8 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $021F ; save sprite 8 position
LDA $0223 ; load sprite 9 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0223 ; save sprite 9 position
LDA $0227 ; load sprite 10 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0227 ; save sprite 10 position
LDA $022B ; load sprite 11 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $022B ; save sprite 11 position
LDA $022F ; load sprite 12 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $022F ; save sprite 12 position
LDA $0233 ; load sprite 13 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0233 ; save sprite 13 position
LDA $0237 ; load sprite 14 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0237 ; save sprite 14 position
LDA $023B ; load sprite 15 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $023B ; save sprite 15 position
LDA $023F ; load sprite 16 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $023F ; save sprite 16 position
LDA $0243 ; load sprite 17 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0243 ; save sprite 17 position
LDA $0247 ; load sprite 18 position
CLC ; make sure carry flag is set
ADC #$01 ; A = A - 1
STA $0247 ; save sprite 18 position
ReadB:
LDA $4016 ; player 1 - B
AND #%00000001 ; only look at bit 0
ReadB1
BEQ ReadB1
LDA $0203 ; load sprite 1 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0203 ; save sprite 1 position
LDA $0207 ; load sprite 2 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0207 ; save sprite 2 position
LDA $020B ; load sprite 3 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $020B ; save sprite 3 position
LDA $020F ; load sprite 4 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $020F ; save sprite 4 position
LDA $0213 ; load sprite 5 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0213 ; save sprite 5 position
LDA $0217 ; load sprite 6 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0217 ; save sprite 6 position
LDA $021B ; load sprite 7 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $021B ; save sprite 7 position
LDA $021F ; load sprite 8 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $021F ; save sprite 8 position
LDA $0223 ; load sprite 9 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0223 ; save sprite 9 position
LDA $0227 ; load sprite 10 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0227 ; save sprite 10 position
LDA $022B ; load sprite 11 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $022B ; save sprite 11 position
LDA $022F ; load sprite 12 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $022F ; save sprite 12 position
LDA $0233 ; load sprite 13 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0233 ; save sprite 13 position
LDA $0237 ; load sprite 14 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0237 ; save sprite 14 position
LDA $023B ; load sprite 15 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $023B ; save sprite 15 position
LDA $023F ; load sprite 16 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $023F ; save sprite 16 position
LDA $0243 ; load sprite 17 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0243 ; save sprite 17 position
LDA $0247 ; load sprite 18 position
SEC ; make sure carry flag is set
SBC #$02 ; A = A - 1
STA $0247 ; save sprite 18 position
ReadBDone: ; handling this button is done
RTI ; return from interrupt
;;;;;;;;;;;;;;
.bank 1
.org $E000
palette:
.byte $33,$36,$30,$0F,$30,$0F,$0F,$0F,$33,$0F,$0F,$0F,$33,$0F,$0F,$0F
.byte $33,$36,$30,$0F,$30,$0F,$0F,$0F,$33,$0F,$0F,$0F,$33,$0F,$0F,$0F
sprites:
;vert tile attr horiz
.db $80, $00, $00, $80 ;sprite 0
.db $80, $01, $00, $88 ;sprite 1
.db $80, $02, $00, $90 ;sprite 2
.db $88, $0F, $00, $80 ;sprite 3
.db $88, $10, $00, $88 ;sprite 4
.db $88, $11, $00, $90 ;sprite 5
.db $90, $1E, $00, $80 ;sprite 6
.db $90, $1F, $00, $88 ;sprite 7
.db $90, $20, $00, $90 ;sprite 8
.db $98, $2F, $00, $80 ;sprite 9
.db $98, $30, $00, $88 ;sprite 10
.db $98, $31, $00, $90 ;sprite 11
.db $A0, $43, $00, $80 ;sprite 12
.db $A0, $44, $00, $88 ;sprite 13
.db $A0, $45, $00, $90 ;sprite 14
.db $A8, $58, $00, $80 ;sprite 15
.db $A8, $59, $00, $88 ;sprite 16
.db $A8, $5A, $00, $90 ;sprite 17
.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 "test.chr" ;includes 8KB graphics file from SMB1