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 0 = NROM, no bank swapping
- .inesmir 1 ; background mirroring
- ;;;;;;;;;;;;;;;
- ;; VARIABLES
- .rsset $0000 ;;start variables at ram location 0
- BALL_POS_X .rs 1 ;$0000
- BALL_POS_Y .rs 1 ;$0001
- BALL_DIRECTION_X .rs 1
- BALL_DIRECTION_Y .rs 1
- BALL_IS_DIR_X_POSITIVE .rs 1
- BALL_IS_DIR_Y_POSITIVE .rs 1
- PADDLE_RIGHT_X_POSITION .rs 1
- PADDLE_LEFT_X_POSITION .rs 1
- BRICK_Y_MAX .rs 1
- BALL_IS_COLL_WITH_BRICK .rs 1
- BALL_POS_X_ON_TILE .rs 1
- BALL_POS_Y_ON_TILE .rs 1
- BALL_POS_X_ON_TILE_PREV .rs 1
- BALL_POS_Y_ON_TILE_PREV .rs 1
- BALL_POS_NEXT_TILE .rs 1
- NAMETABLE_TO_LOAD .rs 2
- ; CONSTANTS
- WALL_RIGHT = $B8
- WALL_LEFT = $0F
- WALL_TOP = $0F
- WALL_BOTTOM = $E9
- PADDLE_Y_POS = $D4
- ;;;;;;;;;;;;;;;
- .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 $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
- 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
- LoadPalettesLoop:
- LDA palette, x ;load palette byte
- STA $2007 ;write to PPU
- INX ;set index to next byte
- CPX #$20
- BNE LoadPalettesLoop ;if x = $20, 32 bytes copied, all done
- ;===================================
- ; Start Settings
- ;===================================
- LDA #$C8
- STA BALL_POS_Y ; Posizione iniziale della palla sull'asse Y
- LDA #$20
- STA BALL_POS_X ; Posizione iniziale della palla sull'asse X
- LDA #$01
- STA BALL_DIRECTION_Y ; Direzione verticale iniziale verso l'alto
- LDA #$00
- STA BALL_DIRECTION_X ; Direzione orizzontale iniziale zero
- LDA #$01
- STA BALL_IS_DIR_Y_POSITIVE
- LDA #$01
- STA BALL_IS_DIR_X_POSITIVE
- ;===================================
- ; Player Graphics
- ;===================================
- LoadSprites:
- LDX #$00 ;start X register at 0
- LoadSpritesLoop:
- LDA player_sprites, x ;load data from address ( player_sprites + x )
- STA $0200, x ;store int RAM address ( $0200 + x ), lo scriviamo in RAM incrementando
- ;la locazione
- INX ; X++
- CPX #$20 ; Compare X to hex $10, decimal 16 - copying 16 bytes = 4 sprites
- BNE LoadSpritesLoop ; if ( !CPX #$20 ( 16 bytes == 4 sprites ) ), loop at LoadSpritesLoop
- ;===================================
- ; Ball Graphics
- ;===================================
- LoadBallSprites:
- LDX #$00
- LoadBallSpriteLoop:
- LDA ball_sprites, x
- STA $0210, x
- INX
- CPX #$04
- BNE LoadBallSpriteLoop
- ;===================================
- ; Bricks Graphics
- ;===================================
- ;LoadBricksSprites:
- ; LDX #$00
- ;LoadBricksSpritesLoop:
- ; LDA brick_sprites, x
- ; STA $0214, x
- ; INX
- ; CPX #$FF
- ; BNE LoadBricksSpritesLoop
- ;===================================
- ; Background
- ;===================================
- 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
- ; Disegnamo lo sfondo del livello di Arkanoid
- LoadBackgroundLoop:
- LDA bg_raw, x
- STA $2007
- INX
- CPX #$20
- BNE LoadBackgroundLoop
- LDX #$00
- LoadBackgroundTopCornerLoop:
- LDA bg_lvl_top_corner, x
- STA $2007
- INX
- CPX #$20
- BNE LoadBackgroundTopCornerLoop
- ;ASL A
- ;TAX
- ;LDX #$00
- ;LDA LevelPointers + 0, x
- ;STA NAMETABLE_TO_LOAD + 0
- ;LDA LevelPointers + 1, x
- ;STA NAMETABLE_TO_LOAD + 1
- ;LDA LevelPointers + 2, x
- ;STA NAMETABLE_TO_LOAD + 2
- ;multiply the index by 2, since each pointer is 2 bytes, and put it in an index register
- asl A
- tay
- ;copy the pointer to zero page
- lda LevelPointers+0, y
- sta NAMETABLE_TO_LOAD+0
- lda LevelPointers+1, y
- sta NAMETABLE_TO_LOAD+1
- ;copy 1024 bytes from the location indicated by the pointer to VRAM
- ldx #$04
- ldy #$00
- CopyByte:
- lda (NAMETABLE_TO_LOAD), y
- sta $2007
- iny
- bne CopyByte ;go copy another byte if less than 256 have been copied
- inc NAMETABLE_TO_LOAD+1 ;advance the pointer by 256 positions
- dex
- bne CopyByte ;go copy 256 more bytes if less than 1024 have been copied
- LoadAttribute:
- LDA $2002 ; read PPU status to reset the high/low latch
- LDA #$23
- STA $2006 ; write the high byte of $23C0 address
- LDA #$C0
- STA $2006 ; write the low byte of $23C0 address
- LDX #$00 ; start out at 0
- LoadAttributeLoop:
- LDA attribute, x ; load data from address (attribute + the value in x)
- STA $2007 ; write to PPU
- INX ; X = X + 1
- CPX #$08 ; Compare X to hex $08, decimal 8 - copying 8 bytes
- BNE LoadAttributeLoop ; Branch to LoadAttributeLoop if compare was Not Equal to zero
- ; if compare was equal to 128, keep going down
- ;;This is the PPU clean up section, so rendering the next frame starts properly.
- 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 ;;tell the ppu there is no background scrolling
- STA $2005
- STA $2005
- 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
- ;===================================
- ; Ball Movements
- ;===================================
- MoveBallY:
- LDA #$01 ; Carichiamo un valore positivo
- CMP BALL_IS_DIR_Y_POSITIVE ; Confrontiamo con l'attuale direzione
- BEQ MoveBallUp
- MoveBallDown:
- LDA BALL_POS_Y
- CLC
- ADC #BALL_DIRECTION_Y
- STA BALL_POS_Y
- JMP EndCheckBallMovementY
- MoveBallUp:
- LDA BALL_POS_Y
- SEC
- SBC #BALL_DIRECTION_Y
- STA BALL_POS_Y
- JMP EndCheckBallMovementY
- EndCheckBallMovementY:
- LDA BALL_POS_Y
- STA $0210 ; Inserisco il valore nell'indirizzo di memoria che detiene la posizione Y
- ; della pallina
- MoveBallX:
- LDA #$01 ; Carichiamo un valore positivo
- CMP BALL_IS_DIR_X_POSITIVE ; Confrontiamo con l'attuale direzione
- BEQ MoveBallRight
- MoveBallLeft:
- LDA BALL_POS_X
- SEC
- SBC #BALL_DIRECTION_X
- STA BALL_POS_X
- JMP EndCheckBallMovementX
- MoveBallRight:
- LDA BALL_POS_X
- CLC
- ADC #BALL_DIRECTION_X
- STA BALL_POS_X
- JMP EndCheckBallMovementX
- EndCheckBallMovementX:
- LDA BALL_POS_X
- STA $0213 ; Inserisco il valore nell'indirizzo di memoria che detiene la posizione X
- ; della pallina
- PerformCheckWallHitTop:
- LDA BALL_POS_Y
- CMP #WALL_TOP
- BCC PerformHitWallTop
- JMP PerformNotHitWallTop
- PerformHitWallTop:
- LDA #$00
- STA BALL_IS_DIR_Y_POSITIVE
- PerformNotHitWallTop:
- ;do nothing
- PerformCheckWallBottom:
- LDA BALL_POS_Y
- CMP #WALL_BOTTOM
- BCC PerformNotHitWallBottom
- JMP PerformHitWallBottom
- PerformHitWallBottom:
- LDA #$01
- STA BALL_IS_DIR_Y_POSITIVE
- PerformNotHitWallBottom:
- ;do nothing
- PerformCheckWallHitLeft:
- LDA BALL_POS_X
- CMP #WALL_LEFT
- BCC PerformHitWallLeft
- JMP PerformNotHitWallLeft
- PerformHitWallLeft:
- LDA #$01
- STA BALL_IS_DIR_X_POSITIVE
- PerformNotHitWallLeft:
- ;do nothing
- PerformCheckWallRight:
- LDA BALL_POS_X
- CMP #WALL_RIGHT
- BCC PerformNotHitWallRight
- JMP PerformHitWallRight
- PerformHitWallRight:
- LDA #$00
- STA BALL_IS_DIR_X_POSITIVE
- PerformNotHitWallRight:
- ;do nothing
- ;=====================================
- ; Ball Collision Detection With Paddle
- ;=====================================
- CheckPaddleHit:
- LDA BALL_POS_Y
- CMP #PADDLE_Y_POS
- BEQ PerformBallIsHittingPaddle
- JMP PerformBallNotHitPaddle
- PerformBallIsHittingPaddle:
- ; La palla รจ alla stessa altezza della racchetta,
- ; dobbiamo calcolare la collisione
- LDA BALL_POS_X
- CMP PADDLE_LEFT_X_POSITION
- BCC PerformEndCollisionDetection
- PeformCheckBallInXCollision:
- LDA BALL_POS_X
- CMP PADDLE_RIGHT_X_POSITION
- BCC PerformBallHitByPaddle
- JMP PerformEndCollisionDetection
- PerformBallHitByPaddle:
- ; Abbiamo colpito la racchetta!
- LDA #$01
- STA BALL_IS_DIR_Y_POSITIVE
- PerformEndCollisionDetection:
- ;do nothing
- PerformBallNotHitPaddle:
- ; do nothing
- ;=====================================
- ; Ball Collision Detection With Bricks
- ;=====================================
- LDA BALL_POS_X_ON_TILE ; we need this for collision detection
- STA BALL_POS_X_ON_TILE_PREV
- LDA BALL_POS_Y_ON_TILE
- STA BALL_POS_Y_ON_TILE_PREV
- LDA #$00
- STA BALL_POS_X_ON_TILE
- STA BALL_POS_Y_ON_TILE
- LDA BALL_POS_X
- ;CLC
- ;ADC #$04 ; Aggiungiamo 4 pixel per centrare la posizione
- LSR A
- LSR A
- LSR A ; Divide by 8
- STA BALL_POS_X_ON_TILE
- LDA BALL_POS_Y
- ;CLC
- ;ADC #$04 ; Aggiungiamo 4 pixel per centrare la posizione
- SEC
- SBC #$0F ; subtrack 16 pixel to put x in the same x space of the tiles
- LSR A
- LSR A
- LSR A ; Divide by 8
- STA BALL_POS_Y_ON_TILE
- ; TOGLIERE!!
- LDA BALL_POS_Y_ON_TILE
- CMP #$08
- BCC _ContinueCheckColl ; Saltiamo il controllo se ci troviamo oltre il Tile 7
- JMP PerformBallNotHitBrick
- ; TOGLIERE!!
- _ContinueCheckColl:
- LDX #$00
- ComputeXYOnTile:
- LDA BALL_POS_X_ON_TILE
- CLC
- ADC #$20
- STA BALL_POS_X_ON_TILE
- INX
- CPX BALL_POS_Y_ON_TILE
- BNE ComputeXYOnTile
- ;Verify the collision with the left part of the brick
- PerformBallColWithBrickLeft:
- LDX BALL_POS_X_ON_TILE
- LDA bg_lvl_1_0, x
- CMP #$2D
- BEQ PerformBallCollisionWithBrick
- PerformBallColWithBrickRight:
- LDX BALL_POS_X_ON_TILE
- LDA bg_lvl_1_0, x
- CMP #$2E
- BEQ PerformBallCollisionWithBrick
- JMP PerformBallNotHitBrick
- ; Collision
- PerformBallCollisionWithBrick:
- LDA #$01
- STA $0212
- ;Ricordiamo che questo il tile preciso dove รจ avvenuta la collisione
- LDA BALL_POS_X_ON_TILE_PREV
- CLC
- ADC #$01
- STA BALL_POS_X_ON_TILE_PREV
- LDA BALL_POS_X_ON_TILE
- CMP BALL_POS_X_ON_TILE_PREV
- BEQ _BounchLeft
- LDA BALL_POS_X_ON_TILE_PREV
- SEC
- SBC #$02
- STA BALL_POS_X_ON_TILE_PREV
- LDA BALL_POS_X_ON_TILE
- CMP BALL_POS_X_ON_TILE_PREV
- BEQ _BounchRight
- LDA BALL_POS_X_ON_TILE_PREV
- CLC
- ADC #$21
- STA BALL_POS_X_ON_TILE_PREV
- LDA BALL_POS_X_ON_TILE
- CMP BALL_POS_X_ON_TILE_PREV
- BEQ _BounchUp
- LDA BALL_POS_X_ON_TILE_PREV
- SEC
- SBC #$40
- STA BALL_POS_X_ON_TILE_PREV
- LDA BALL_POS_X_ON_TILE
- CMP BALL_POS_X_ON_TILE_PREV
- BEQ _BounchDown
- JMP _CheckCollDiagonals
- _BounchDown:
- LDA #$00
- STA BALL_IS_DIR_Y_POSITIVE
- JMP CCCOABContinueLoop
- _BounchUp:
- LDA #$01
- STA BALL_IS_DIR_Y_POSITIVE
- JMP CCCOABContinueLoop
- _BounchRight:
- LDA #$01
- STA BALL_IS_DIR_X_POSITIVE
- JMP CCCOABContinueLoop
- _BounchLeft:
- LDA #$00
- STA BALL_IS_DIR_X_POSITIVE
- JMP CCCOABContinueLoop
- _CheckCollDiagonals:
- ; Controlliamo le diagonali
- ; Alto Sinitra
- LDA BALL_POS_X_ON_TILE_PREV
- CLC
- ADC #$41
- STA BALL_POS_X_ON_TILE_PREV
- LDA BALL_POS_X_ON_TILE
- CMP BALL_POS_X_ON_TILE_PREV
- BNE _ContinueCheckUpRight
- JMP _BounchUpLeft
- _ContinueCheckUpRight:
- ; Alto a Destra
- LDA BALL_POS_X_ON_TILE_PREV
- SEC
- SBC #$02
- STA BALL_POS_X_ON_TILE_PREV
- LDA BALL_POS_X_ON_TILE
- CMP BALL_POS_X_ON_TILE_PREV
- BNE _ContinueCheckDownRight
- JMP _BounchUpRight
- _ContinueCheckDownRight:
- ; Basso Destra
- LDA BALL_POS_X_ON_TILE_PREV
- SEC
- SBC #$40
- STA BALL_POS_X_ON_TILE_PREV
- LDA BALL_POS_X_ON_TILE
- CMP BALL_POS_X_ON_TILE_PREV
- BEQ _BounchDownRight
- ; Basso Sinistra
- LDA BALL_POS_X_ON_TILE_PREV
- CLC
- ADC #$02
- STA BALL_POS_X_ON_TILE_PREV
- LDA BALL_POS_X_ON_TILE
- CMP BALL_POS_X_ON_TILE_PREV
- BEQ _BounchDownLeft
- JMP CCCOABContinueLoop
- _BounchDownLeft:
- ;Controlliamo che a sinistra sia libero
- LDX #$00
- LDA BALL_POS_X_ON_TILE_PREV
- SEC
- SBC #$01
- STA BALL_POS_X_ON_TILE_PREV
- LDX BALL_POS_X_ON_TILE_PREV
- LDA bg_lvl_1_0, x
- CMP #$27
- BNE _BounchDownLeftCheckDown
- ;E' libero a sinistra, rimbalza verso sinistra e su allora
- LDA #$00
- STA BALL_IS_DIR_X_POSITIVE
- LDA #$01
- STA BALL_IS_DIR_Y_POSITIVE
- JMP CCCOABContinueLoop
- _BounchDownLeftCheckDown:
- ;Controlliamo che a sotto sia libero
- LDX #$00
- LDA BALL_POS_X_ON_TILE_PREV
- CLC
- ADC #$21
- STA BALL_POS_X_ON_TILE_PREV
- LDX BALL_POS_X_ON_TILE_PREV
- LDA bg_lvl_1_0, x
- CMP #$27
- BNE _BounchDownLeftPerfect
- ; E' libero sotto, rimbalzo verso il basso
- LDA #$01
- STA BALL_IS_DIR_X_POSITIVE
- LDA #$00
- STA BALL_IS_DIR_Y_POSITIVE
- JMP CCCOABContinueLoop
- _BounchDownLeftPerfect:
- LDA #$00
- STA BALL_IS_DIR_X_POSITIVE
- LDA #$00
- STA BALL_IS_DIR_Y_POSITIVE
- JMP CCCOABContinueLoop
- _BounchDownRight:
- ;Controlliamo che a destra sia libero
- LDX #$00
- LDA BALL_POS_X_ON_TILE_PREV
- CLC
- ADC #$01
- STA BALL_POS_X_ON_TILE_PREV
- LDX BALL_POS_X_ON_TILE_PREV
- LDA bg_lvl_1_0, x
- CMP #$27
- BNE _BounchDownRightCheckDown
- ;E' libero a destra, rimbalza verso l'alto
- LDA #$01
- STA BALL_IS_DIR_X_POSITIVE
- LDA #$01
- STA BALL_IS_DIR_Y_POSITIVE
- JMP CCCOABContinueLoop
- _BounchDownRightCheckDown:
- ;Controlliamo se sotto รจ libero
- LDX #$00
- LDA BALL_POS_X_ON_TILE_PREV
- CLC
- ADC #$1F
- STA BALL_POS_X_ON_TILE_PREV
- LDX BALL_POS_X_ON_TILE_PREV
- LDA bg_lvl_1_0, x
- CMP #$27
- BNE _BounchDownRightPerfect
- ; E' libero sotto, rimbalzo verso il basso
- LDA #$00
- STA BALL_IS_DIR_X_POSITIVE
- LDA #$00
- STA BALL_IS_DIR_Y_POSITIVE
- JMP CCCOABContinueLoop
- _BounchDownRightPerfect:
- LDA #$01
- STA BALL_IS_DIR_X_POSITIVE
- LDA #$00
- STA BALL_IS_DIR_Y_POSITIVE
- JMP CCCOABContinueLoop
- _BounchUpRight:
- ;Controlliamo che sopra sia libero
- LDX #$00
- LDA BALL_POS_X_ON_TILE_PREV
- SEC
- SBC #$20
- STA BALL_POS_X_ON_TILE_PREV
- LDX BALL_POS_X_ON_TILE_PREV
- LDA bg_lvl_1_0, x
- CMP #$27
- BNE _BounchUpRightCheckDown
- ;E' libero sopra, rimbalza verso sinistra allora
- LDA #$00
- STA BALL_IS_DIR_X_POSITIVE
- LDA #$01
- STA BALL_IS_DIR_Y_POSITIVE
- JMP CCCOABContinueLoop
- _BounchUpRightCheckDown:
- ;Controlliamo che a destra sia libero
- LDX #$00
- LDA BALL_POS_X_ON_TILE_PREV
- CLC
- ADC #$21
- STA BALL_POS_X_ON_TILE_PREV
- LDX BALL_POS_X_ON_TILE_PREV
- LDA bg_lvl_1_0, x
- CMP #$27
- BNE _BounchUpRightPerfect
- ; E' libero a destra, rimbalzo verso il basso
- LDA #$01
- STA BALL_IS_DIR_X_POSITIVE
- LDA #$00
- STA BALL_IS_DIR_Y_POSITIVE
- JMP CCCOABContinueLoop
- _BounchUpRightPerfect:
- LDA #$01
- STA BALL_IS_DIR_X_POSITIVE
- LDA #$01
- STA BALL_IS_DIR_Y_POSITIVE
- JMP CCCOABContinueLoop
- _BounchUpLeft:
- ;Controlliamo che sopra AL PUNTO DI COLLISIONE sia libero
- LDX #$00
- LDA BALL_POS_X_ON_TILE_PREV
- SEC
- SBC #$20
- STA BALL_POS_X_ON_TILE_PREV
- LDX BALL_POS_X_ON_TILE_PREV
- LDA bg_lvl_1_0, x
- CMP #$27
- BNE _BounchUpLeftCheckDown
- ;E' libero sopra, rimbalza verso destra allora
- LDA #$01
- STA BALL_IS_DIR_X_POSITIVE
- LDA #$01
- STA BALL_IS_DIR_Y_POSITIVE
- JMP CCCOABContinueLoop
- _BounchUpLeftCheckDown:
- ;Controlliamo che a sinistra sia libero
- LDX #$00
- LDA BALL_POS_X_ON_TILE_PREV
- CLC
- ADC #$1F
- STA BALL_POS_X_ON_TILE_PREV
- LDX BALL_POS_X_ON_TILE_PREV
- LDA bg_lvl_1_0, x
- CMP #$27
- BNE _BounchUpLeftPerfect
- ; E' libero a sinistra, rimbalzo verso il basso
- LDA #$00
- STA BALL_IS_DIR_X_POSITIVE
- LDA #$00
- STA BALL_IS_DIR_Y_POSITIVE
- JMP CCCOABContinueLoop
- _BounchUpLeftPerfect:
- LDA #$00
- STA BALL_IS_DIR_X_POSITIVE
- LDA #$01
- STA BALL_IS_DIR_Y_POSITIVE
- JMP CCCOABContinueLoop
- PerformBallNotHitBrick:
- LDA #$00
- STA $0212
- JMP CCCOABContinueLoop
- CCCOABContinueLoop:
- 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 ReadADone ; branch to ReadADone if button is NOT pressed (0)
- ; add instructions here to do something when button IS pressed (1)
- PlayerTranslateOnRight:
- LDX #$00 ; start X register at 0
- PlayerTranslateOnRightLoop:
- LDA $0203, x ; load sprite X position
- CLC ; make sure the carry flag is clear
- ADC #$01 ; A = A + 1
- STA $0203, x ; save sprite X position
- INX ; X++
- INX ; X++
- INX ; X++
- INX ; X++
- CPX #$10 ; if ( !CPX #$20 ( - bytes == - sprites ) ), loop at PlayerTranslateOnRightLoop
- BNE PlayerTranslateOnRightLoop
- 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)
- ; add instructions here to do something when button IS pressed (1)
- PlayerTranslateOnLeft:
- LDX #$00 ; start X register at 0
- PlayerTranslateOnLeftLoop:
- LDA $0203, x ; load sprite X position
- SEC ; make sure the carry flag is clear
- SBC #$01 ; A = A - 1
- STA $0203, x ; save sprite X position
- INX ; X++
- INX ; X++
- INX ; X++
- INX ; X++
- CPX #$10 ; if ( !CPX #$20 ( 1-6 bytes == 4- sprites ) ), loop at PlayerTranslateOnRightLoop
- BNE PlayerTranslateOnLeftLoop
- ReadBDone: ; handling this button is done
- UpdateAndSavePaddlePosition:
- ; Salviamo la posizione della racchetta
- LDA $0203
- SEC
- SBC #$0A
- STA PADDLE_LEFT_X_POSITION
- LDA $020F
- CLC
- ADC #$0A
- STA PADDLE_RIGHT_X_POSITION
- RTI ; return from interrupt
- ;;;;;;;;;;;;;;
- .bank 1
- .org $E000
- palette:
- .db $22,$29,$1A,$0F, $22,$36,$17,$0F, $22,$30,$21,$0F, $22,$27,$17,$0F ;;background palette
- .db $22,$1C,$15,$14, $22,$02,$38,$3C, $22,$1C,$15,$14, $22,$02,$38,$3C ;;sprite palette
- player_sprites:
- ;yPos tile attr xPos
- .db $DC, $00, $0B, $80 ;sprite 0
- .db $DC, $01, $0B, $88 ;sprite 1
- .db $DC, $01, $0B, $90 ;sprite 2
- .db $DC, $02, $0B, $98 ;sprite 3
- ball_sprites:
- ;yPos tile attr xPos
- .db $C8, $03, $00, $80 ;sprite 0
- brick_sprites:
- ;yPos tile attr xPos
- ;.db $3A, $04, $0A, $70 ;sprite 0
- ;.db $3A, $05, $0A, $78 ;sprite 1
- ;.db $3A, $06, $0A, $7F ;sprite 2
- bg_raw:
- .db $24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24 ; 0 raw background
- bg_lvl_top_corner:
- .db $24,$2B,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2B,$24,$24,$24,$24,$24,$24,$24 ; 1 top corner
- bg_lvl_1_0:
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 2
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 3
- .db $24,$2B, $2D,$2D,$27,$27,$27,$27,$27,$27,$2D,$2D,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$1C,$1D,$1E,$0D,$12,$18 ; 4
- .db $24,$2B, $2D,$2D,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$2D,$2D,$27,$27,$27,$27,$27,$27, $2B,$24,$15,$0E,$0A,$1F,$0E,$1C ; 5
- .db $24,$2B, $2D,$2D,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$2D,$2D,$27,$27, $2B,$24,$24,$24,$02,$00,$01,$08 ; 6
- .db $24,$2B, $2D,$2D,$27,$27,$27,$27,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D, $2B,$24,$24,$24,$24,$24,$24,$24 ; 7
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 8
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 9
- bg_lvl_1_1:
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 10
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 11
- .db $24,$2B, $27,$27,$27,$2D,$2D,$2D,$2D,$2D,$2D,$27,$27,$27,$27,$27,$27,$2D,$2D,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 12
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 13
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 14
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 15
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 16
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 17
- bg_lvl_1_2
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 18
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 19
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 20
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 21
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 22
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 23
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 24
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 25
- bg_lvl_1_3
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 26
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 27
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 28
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 29
- bg_lvl_2_0:
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 2
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 3
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$2D,$2D,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$1C,$1D,$1E,$0D,$12,$18 ; 4
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$2D,$2D,$27,$27,$27,$27,$27,$27, $2B,$24,$15,$0E,$0A,$1F,$0E,$1C ; 5
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$2D,$2D,$27,$27, $2B,$24,$24,$24,$02,$00,$01,$08 ; 6
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D,$2D, $2B,$24,$24,$24,$24,$24,$24,$24 ; 7
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 8
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 9
- bg_lvl_2_1:
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 10
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 11
- .db $24,$2B, $27,$27,$27,$2D,$2D,$2D,$2D,$2D,$2D,$27,$27,$27,$27,$27,$27,$2D,$2D,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 12
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 13
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 14
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 15
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 16
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 17
- bg_lvl_2_2
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 18
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 19
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 20
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 21
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 22
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 23
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 24
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 25
- bg_lvl_2_3
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 26
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 27
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 28
- .db $24,$2B, $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27, $2B,$24,$24,$24,$24,$24,$24,$24 ; 29
- LevelPointers:
- .dw bg_lvl_1_0, bg_lvl_1_1, bg_lvl_1_2, bg_lvl_1_2, bg_lvl_1_3, bg_lvl_2_0, bg_lvl_2_1, bg_lvl_2_2, bg_lvl_2_3
- attribute:
- .db %0000000, %00000010, %00000010, %00000010, %00000011, %00000010, %00000010, %00000000011
- ; ATTR ordine
- ; 2 3
- ; 0 1
- .db $24,$24,$24,$24, $47,$47,$24,$24 ,$47,$47,$47,$47, $47,$47,$24,$24 ; background palette
- .db $24,$24,$24,$24 ,$24,$24,$24,$24, $24,$24,$24,$24, $55,$56,$24,$24 ; sprite palette
- .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 "ArkanoidClone.chr"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement