Today isn't really a tutorial, it's more the solution to the suggestion made yesterday about a program that allows the user to move the sprite. I believe that we have infact covered everything necessary to make a Moving Sprite Program. So, the next section will be the complete code file, and that'll be all for today.
;;--- CODE START ---;; .inesprg 1 .inesmap 0 .inesmir 1 .ineschr 1 .bank 1 .org $FFFA .dw 0 ; no VBlank .dw Start ; address to execute on reset .dw 0 ; no whatever .bank 0 .org $0000 X_Pos .db 20 ; a X position for our sprite, start at 20 Y_Pos .db 20 ; a Y position for our sprite, start at 20 .org $8000 ; code starts at $8000 or $C000 Start: lda #%00001000 ; sta $2000 ; lda #%00011110 ; Our typical PPU Setup code. sta $2001 ; ldx #$00 ; clear X ;; start of palette loading code lda #$3F ; have $2006 tell sta $2006 ; $2007 to start lda #$00 ; at $3F00 (palette). sta $2006 loadpal: ; this is a freaky loop lda tilepal, x ; that gives 32 numbers sta $2007 ; to $2007, ending when inx ; X is 32, meaning we cpx #32 ; are done. bne loadpal ; if X isn't =32, goto "loadpal:" line. ;; end of palette loading code infinite: ; a label to start our infinite loop waitblank: lda $2002 ; these 3 lines wait for VBlank, this loop will actually miss VBlank bpl waitblank ; alot, in a later Day, I'll give a better way. lda #$00 ; these lines tell $2003 sta $2003 ; to tell lda #$00 ; $2004 to start sta $2003 ; at $0000. lda Y_Pos ; load Y value sta $2004 ; store Y value lda #$00 ; tile number 0 sta $2004 ; store tile number lda #$00 ; no special junk sta $2004 ; store special junk lda X_Pos ; load X value sta $2004 ; store X value ; and yes, it MUST go in that order. lda #$01 ; these sta $4016 ; lines lda #$00 ; setup/strobe the sta $4016 ; keypad. lda $4016 ; load Abutton Status ; note that whatever we ain't interested lda $4016 ; load Bbutton Status ; in we just load so it'll go to the next one. lda $4016 ; load Select button status lda $4016 ; load Start button status lda $4016 ; load UP button status and #1 ; AND status with #1 bne UPKEYdown ; for some reason (not gonna reveal yet), need to use NotEquals ;with ANDs. So it'll jump (branch) if key was down. lda $4016 ; load DOWN button status and #1 ; AND status with #1 bne DOWNKEYdown lda $4016 ; load LEFT button status and #1 ; AND status with #1 bne LEFTKEYdown lda $4016 ; load RIGHT button status and #1 ; AND status with #1 bne RIGHTKEYdown jmp NOTHINGdown ; if nothing was down, we just jump (no check for conditions) ; down past the rest of everything. UPKEYdown: lda Y_Pos ; load A with Y position sbc #1 ; subtract 1 from A. Only can do math on A register. SBC (Subtract with Borrow) sta Y_Pos ; store back to memory jmp NOTHINGdown ; jump over the rest of the handling code. DOWNKEYdown: lda Y_Pos adc #1 ; add 1 to A. ADC (Add with Carry)((to A register)) sta Y_Pos jmp NOTHINGdown ; jump over the rest of handling code. LEFTKEYdown: lda X_Pos sbc #1 sta X_Pos jmp NOTHINGdown ;the left and right handling code does the same as UP and Down except.. well.. with ; left and right. :) RIGHTKEYdown: lda X_Pos adc #1 sta X_Pos ; don't need to jump to NOTHINGdown, it's right below. Saved several bytes of ; PRG-Bank space! :) NOTHINGdown: jmp infinite tilepal: .incbin "our.pal" ; a label for our palette data .bank 2 .org $0000 .incbin "our.bkg" .incbin "our.spr" ;;--- END OF CODE FILE ---;;
Hopefully you still have, the our.pal,our.bkg,our.spr files from the sprite day. You should understand all of this as I have (or atleast I think I have) covered everything necessary (to be able to do this).
Note: In some emulators, you may have to hit down a few times before the sprite appears. I don't know why this happens.
Thanks to the people who sent me their own implementation of the Moving Sprite Program. Atleast now I know someone reads this.
-Mike H a.k.a GbaGuy