Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*********************************************************************
- *
- * main.c
- *
- ********************************************************************/
- #include "myLib.h"
- #include "bb.h"
- #include "b1.h"
- #include "b2.h"
- #include "b3.h"
- #include "music2.h"
- #include "ding.h"
- #include "monkey.h"
- #include <stdio.h>
- #define MASKCOL (0x1FF)
- #define MASKROW (0XFF)
- #define MAXWIDTH 239
- #define MAXHEIGHT 159
- #define NUMSPRITES 20
- #define B1 1
- #define B2 2
- #define B3 3
- int buttons;
- int lastButtons;
- int playSound;
- int playing;
- int downSprite;
- #define DOWN_STILL 0
- #define DOWN_WALKING 1
- #define UP_STILL 2
- #define UP_WALKING 3
- #define RIGHT_STILL 4
- #define RIGHT_WALKING 5
- #define LEFT_STILL 6
- #define LEFT_WALKING 7
- int previousSpriteState;
- int spriteState = DOWN_STILL;
- int walkCounter = 0;
- int hOff=0;
- int vOff=0;
- OBJ_ATTR shadowOAM[128];
- int monkeyRow = 120; //this is where pikachu is on the visible part of the map
- int monkeyCol = 119;
- int monkeyBigRow; //this is where pikachu is on the entire map
- int monkeyBigCol;
- void ham_VBAText(char* str, ...);
- // Prototypes
- void setupInterrupts(void); // Turns on interrupt
- void enableVBlankInterrupt(); // get interrupts from VBlank
- void interruptHandler(void); // Function that gets called when interrupt occurs
- // void is the same as having it blank or closed
- int vblankcount = 0; // public variable that keeps track of current variable
- // updated every time interruptHandler is called
- int timerinterval = -((1<<24) / MUSIC2FREQ); // time between samples
- int timerinterval2 = -((1<<24) / DINGFREQ);
- int start; // vblankcount when we start the music
- int start2;
- int numvblanks = VBLANKFREQ*MUSIC2LEN/MUSIC2FREQ; // how long our sound is in vblanks
- int numvblanks2 = VBLANKFREQ*DINGLEN/DINGFREQ;
- /*int spriteCol;
- int rDel;
- int cDel;
- int sprite1;
- int sprite2;
- int sprite3;*/
- int row1;
- int row2;
- int row3;
- int row4;
- int col1;
- int col2;
- int col3;
- int col4;
- int vel1;
- int vel2;
- int vel3;
- int vel4;
- int bRow1;
- int bRow2;
- int bCol1;
- int bCol2;
- int bVel1;
- int bVel2;
- int main(void)
- {
- /*sprite1 = rand()%19+1;
- sprite2 = rand()%19+1;
- sprite3 = rand()%19+1;
- spriteCol = rand()%240;
- rDel = rand()%2;
- cDel = spriteCol;*/
- row1 = 0;
- row2 = 0;
- row3 = 0;
- row4 = 0;
- col1 = rand()%60;
- col2 = rand()%120+60;
- col3 = rand()%180+120;
- col4 = rand()%240+180;
- vel1 = rand()%2+1;
- vel2 = rand()%2+1;
- vel3 = rand()%2+1;
- vel4 = rand()%2+1;
- bRow1 = 0;
- bRow2 = 0;
- bCol1 = rand()%240;
- bCol2 = rand()%240;
- bVel1 = rand()%2+1;
- bVel2 = rand()%2+1;
- int i;
- int state = B1;
- playSound = 1;
- /*Sprite sprites[NUMSPRITES] =
- {{0,rand()%240,SPRITEOFFSET16(5,0),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(5,2),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(5,4),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(5,6),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(5,8),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(5,10),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(5,12),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(5,14),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(5,16),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(5,18),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(7,0),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(7,2),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(7,4),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(7,6),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(7,8),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(7,10),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(7,12),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(7,14),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(7,16),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel},
- {0,rand()%240,SPRITEOFFSET16(7,18),ATTR0_SQUARE,ATTR1_SIZE16,16,16,rand()%2+1,cDel}};*/
- dmaTransfer(&CHARBLOCKBASE[4], monkeyTiles, 32768/2, DMA_ON);
- for(i=0; i<128; i++)
- {
- OAM[i].attr0 |= ATTR0_HIDE;
- }
- setupInterrupts(); // only need to setup once
- // Enable sound (Master control)
- REG_SOUNDCNT_X = SND_ENABLED;
- // enable and reset Direct Sound channel A, at full volume,
- // using Timer 0 to determine frequency
- REG_SOUNDCNT_H = SND_OUTPUT_RATIO_100 | // volume 100%
- DSA_OUTPUT_RATIO_100 | // volume of channel A to 100%
- DSB_OUTPUT_RATIO_100 |
- DSA_OUTPUT_TO_BOTH | // both speaker
- DSB_OUTPUT_TO_BOTH |
- DSA_TIMER0 | // timer 0
- DSB_TIMER1 |
- DSB_FIFO_RESET |
- DSA_FIFO_RESET; // flag that it need to be reset when empty
- // we don’t want to mess with sound channels 1-4
- REG_SOUNDCNT_L = 0;
- /*****************************************************************
- *
- * Step 1 -- Store Tile Images
- *
- ****************************************************************/
- DMA[3].src = b1Tiles;
- DMA[3].dst = CHARBLOCKBASE;
- DMA[3].cnt = b1TilesLen/2 | DMA_ON;
- /*****************************************************************
- *
- * Step 2 -- Store map
- *
- ****************************************************************/
- DMA[3].src = b1Map;
- DMA[3].dst = SCREENBLOCKBASE + 27;
- DMA[3].cnt = b1MapLen/2 | DMA_ON;
- /*****************************************************************
- *
- * Step 3 -- Store palette
- *
- ****************************************************************/
- DMA[3].src = b1Pal;
- DMA[3].dst = PALETTE;
- DMA[3].cnt = b1PalLen/2 | DMA_ON;
- /*****************************************************************
- *
- * Step 4 -- Set image controls
- *
- ****************************************************************/
- REG_DISPCTL = MODE0 | BG0_ENABLE | SPRITE_ENABLE;
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- REG_BG0CNT = BG_4BPP | BG_REG_64x64 | BG_SIZE1 | SBB(27) | COLOR256 | CBB(0);
- shadowOAM[0].attr0 = monkeyRow | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[0].attr1 = monkeyCol | ATTR1_SIZE32;
- shadowOAM[0].attr2 = (SPRITEOFFSET16(0,0)) | (0 << 12);
- shadowOAM[1].attr0 = row1 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[1].attr1 = col1 | ATTR1_SIZE16;
- shadowOAM[1].attr2 = (SPRITEOFFSET16(7,0)) | (0 << 12);
- shadowOAM[2].attr0 = row2 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[2].attr1 = col2 | ATTR1_SIZE16;
- shadowOAM[2].attr2 = (SPRITEOFFSET16(7,6)) | (0 << 12);
- shadowOAM[3].attr0 = row3 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[3].attr1 = col3 | ATTR1_SIZE16;
- shadowOAM[3].attr2 = (SPRITEOFFSET16(5,14)) | (0 << 12);
- shadowOAM[4].attr0 = row4 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[4].attr1 = col4 | ATTR1_SIZE16;
- shadowOAM[4].attr2 = (SPRITEOFFSET16(7,14)) | (0 << 12);
- shadowOAM[5].attr0 = bRow1 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[5].attr1 = bCol1 | ATTR1_SIZE16;
- shadowOAM[5].attr2 = (SPRITEOFFSET16(5,20)) | (0 << 12);
- shadowOAM[6].attr0 = bRow2 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[6].attr1 = bCol2 | ATTR1_SIZE16;
- shadowOAM[6].attr2 = (SPRITEOFFSET16(7,20)) | (0 << 12);
- /*shadowOAM[sprite1].attr0 = (sprites[sprite1].row & MASKROW) | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[sprite1].attr1 = (sprites[sprite1].col & MASKCOL) | ATTR1_SIZE16;
- shadowOAM[sprite1].attr2 = sprites[sprite1].start;
- shadowOAM[sprite2].attr0 = (sprites[sprite2].row & MASKROW) | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[sprite2].attr1 = (sprites[sprite2].col & MASKCOL) | ATTR1_SIZE16;
- shadowOAM[sprite2].attr2 = sprites[sprite2].start;
- shadowOAM[sprite3].attr0 = (sprites[sprite3].row & MASKROW) | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[sprite3].attr1 = (sprites[sprite3].col & MASKCOL) | ATTR1_SIZE16;
- shadowOAM[sprite3].attr2 = sprites[sprite3].start;*/
- OAM[0] = shadowOAM[0];
- OAM[1] = shadowOAM[1];
- OAM[2] = shadowOAM[2];
- OAM[3] = shadowOAM[3];
- OAM[4] = shadowOAM[4];
- OAM[5] = shadowOAM[5];
- OAM[6] = shadowOAM[6];
- /*OAM[sprite1] = shadowOAM[sprite1];
- OAM[sprite2] = shadowOAM[sprite2];
- OAM[sprite3] = shadowOAM[sprite3];*/
- if (BUTTON_HELD(BUTTON_LEFT))
- {
- spriteState = LEFT_WALKING;
- if(monkeyCol > 0)
- {
- monkeyCol--;
- }
- }
- if (BUTTON_HELD(BUTTON_RIGHT))
- {
- spriteState = RIGHT_WALKING;
- if(monkeyCol < 220)
- {
- monkeyCol++;
- }
- }
- if(!BUTTON_HELD(BUTTON_LEFT) && !BUTTON_HELD(BUTTON_RIGHT) && !BUTTON_HELD(BUTTON_UP) && !BUTTON_HELD(BUTTON_DOWN))
- {
- spriteState = DOWN_STILL;
- }
- DMA[3].src = monkeyPal;
- DMA[3].dst = SPRITE_PALETTE;
- DMA[3].cnt = 256 | DMA_ON;
- while(1)
- {
- lastButtons = buttons;
- buttons = ~(*rawButtons);
- previousSpriteState = spriteState;
- //3 falling objects on screen at one time
- /*shadowOAM[sprite1].attr0 = (sprites[sprite1].row & MASKROW) | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[sprite1].attr1 = (sprites[sprite1].col & MASKCOL) | ATTR1_SIZE16;
- shadowOAM[sprite1].attr2 = sprites[sprite1].start;
- shadowOAM[sprite2].attr0 = (sprites[sprite2].row & MASKROW) | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[sprite2].attr1 = (sprites[sprite2].col & MASKCOL) | ATTR1_SIZE16;
- shadowOAM[sprite2].attr2 = sprites[sprite2].start;
- shadowOAM[sprite3].attr0 = (sprites[sprite3].row & MASKROW) | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[sprite3].attr1 = (sprites[sprite3].col & MASKCOL) | ATTR1_SIZE16;
- shadowOAM[sprite3].attr2 = sprites[sprite3].start;*/
- shadowOAM[0].attr0 = monkeyRow | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[0].attr1 = monkeyCol | ATTR1_SIZE32;
- shadowOAM[0].attr2 = (SPRITEOFFSET16(0,0)) | (0 << 12);
- shadowOAM[1].attr0 = row1 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[1].attr1 = col1 | ATTR1_SIZE16;
- shadowOAM[1].attr2 = (SPRITEOFFSET16(7,0)) | (0 << 12);
- shadowOAM[2].attr0 = row2 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[2].attr1 = col2 | ATTR1_SIZE16;
- shadowOAM[2].attr2 = (SPRITEOFFSET16(7,6)) | (0 << 12);
- shadowOAM[3].attr0 = row3 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[3].attr1 = col3 | ATTR1_SIZE16;
- shadowOAM[3].attr2 = (SPRITEOFFSET16(5,14)) | (0 << 12);
- shadowOAM[4].attr0 = row4 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[4].attr1 = col4 | ATTR1_SIZE16;
- shadowOAM[4].attr2 = (SPRITEOFFSET16(7,14)) | (0 << 12);
- shadowOAM[5].attr0 = bRow1 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[5].attr1 = bCol1 | ATTR1_SIZE16;
- shadowOAM[5].attr2 = (SPRITEOFFSET16(5,20)) | (0 << 12);
- shadowOAM[6].attr0 = bRow2 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[6].attr1 = bCol2 | ATTR1_SIZE16;
- shadowOAM[6].attr2 = (SPRITEOFFSET16(7,20)) | (0 << 12);
- //Moves objects down
- /*sprites[sprite1].row += sprites[sprite1].rdel;
- sprites[sprite2].row += sprites[sprite2].rdel;
- sprites[sprite3].row += sprites[sprite3].rdel;*/
- row1 += vel1;
- row2 += vel2;
- row3 += vel3;
- row4 += vel4;
- bRow1 += bVel1;
- bRow2 += bVel2;
- //Changes object and row/column whenever objects reach the bottom of screen
- /*if(sprites[sprite1].row >= 160)
- {
- sprites[sprite1].row = 0;
- sprites[sprite1].col = rand()%240;
- sprite1 = rand()%20+1;
- }
- if(sprites[sprite2].row >= 160)
- {
- sprites[sprite2].row = 0;
- sprites[sprite2].col = rand()%240;
- sprite2 = rand()%20+1;
- }
- if(sprites[sprite3].row >= 160)
- {
- sprites[sprite3].row = 0;
- sprites[sprite3].col = rand()%240;
- sprite3 = rand()%20+1;
- }*/
- if(row1 >= 160)
- {
- row1 = 0;
- col1 = rand()%60;
- }
- if(row2 >= 160)
- {
- row2 = 0;
- col2 = rand()%120+60;
- }
- if(row3 >= 160)
- {
- row3 = 0;
- col3 = rand()%180+120;
- }
- if(row4 >= 160)
- {
- row4 = 0;
- col4 = rand()%240+180;
- }
- if(bRow1 >= 160)
- {
- bRow1 = 0;
- bCol1 = rand()%240;
- }
- if(bRow2 >= 160)
- {
- bRow2 = 0;
- bCol2 = rand()%240;
- }
- //Collects and hides object when it is caught
- /*if(((sprites[sprite1].row + 16) == monkeyRow) && ((sprites[sprite1].col + 16) == monkeyCol) && ((sprites[sprite1].row) == monkeyRow + 32) && ((sprites[sprite1].col) == monkeyCol + 32))
- {
- shadowOAM[sprite1].attr0 = ATTR0_HIDE;
- }
- if(((sprites[sprite1].row + 16) == monkeyRow) && ((sprites[sprite1].col + 16) == monkeyCol) && ((sprites[sprite1].row) == monkeyRow + 32) && ((sprites[sprite1].col) == monkeyCol + 32))
- {
- shadowOAM[sprite2].attr0 = ATTR0_HIDE;
- }
- if(((sprites[sprite1].row + 16) == monkeyRow) && ((sprites[sprite1].col + 16) == monkeyCol) && ((sprites[sprite1].row) == monkeyRow + 32) && ((sprites[sprite1].col) == monkeyCol + 32))
- {
- shadowOAM[sprite3].attr0 = ATTR0_HIDE;
- }*/
- if(((row1 + 16) > monkeyRow) && ((col1 + 16) > monkeyCol)
- && (row1 < monkeyRow + 32) && (col1 < monkeyCol + 32))
- {
- playing = 0;
- // Make sure sound is stopped
- REG_TM1CNT = 0; // Timer off
- DMA[2].cnt = 0; // DMA off
- // Now play it
- REG_TM1D = timerinterval2; // Set timer to go off every timer interval
- REG_TM1CNT = TIMER_ON; // Turn Timer on
- // use DMA 1 if you are using timer 0 (for sound channel A)
- DMA[2].src = ding; // set source to sound
- DMA[2].dst = REG_FIFO_B; // Transfer sound data into FIFO A
- DMA[2].cnt = DMA_ON | START_ON_FIFO_EMPTY | // if the FIFO queue is empty DMA
- DMA_32 | DMA_REPEAT | // transfer 32 bits at a time and keep repeating
- DMA_DESTINATION_FIXED; // destination will not change
- start2 = vblankcount; // set start to VBlank
- //shadowOAM[1].attr0 = ATTR0_HIDE;
- row1 = 0;
- col1 = rand()%60;
- }
- if(((row2 + 16) > monkeyRow) && ((col2 + 16) > monkeyCol)
- && (row2 < monkeyRow + 32) && (col2 < monkeyCol + 32))
- {
- playing = 0;
- // Make sure sound is stopped
- REG_TM1CNT = 0; // Timer off
- DMA[2].cnt = 0; // DMA off
- // Now play it
- REG_TM1D = timerinterval2; // Set timer to go off every timer interval
- REG_TM1CNT = TIMER_ON; // Turn Timer on
- // use DMA 1 if you are using timer 0 (for sound channel A)
- DMA[2].src = ding; // set source to sound
- DMA[2].dst = REG_FIFO_B; // Transfer sound data into FIFO A
- DMA[2].cnt = DMA_ON | START_ON_FIFO_EMPTY | // if the FIFO queue is empty DMA
- DMA_32 | DMA_REPEAT | // transfer 32 bits at a time and keep repeating
- DMA_DESTINATION_FIXED; // destination will not change
- start2 = vblankcount; // set start to VBlank
- //shadowOAM[2].attr0 = ATTR0_HIDE;
- row2 = 0;
- col2 = rand()%120+60;
- }
- if(((row3 + 16) > monkeyRow) && ((col3 + 16) > monkeyCol)
- && (row3 < monkeyRow + 32) && (col3 < monkeyCol + 32))
- {
- playing = 0;
- // Make sure sound is stopped
- REG_TM1CNT = 0; // Timer off
- DMA[2].cnt = 0; // DMA off
- // Now play it
- REG_TM1D = timerinterval2; // Set timer to go off every timer interval
- REG_TM1CNT = TIMER_ON; // Turn Timer on
- // use DMA 1 if you are using timer 0 (for sound channel A)
- DMA[2].src = ding; // set source to sound
- DMA[2].dst = REG_FIFO_B; // Transfer sound data into FIFO A
- DMA[2].cnt = DMA_ON | START_ON_FIFO_EMPTY | // if the FIFO queue is empty DMA
- DMA_32 | DMA_REPEAT | // transfer 32 bits at a time and keep repeating
- DMA_DESTINATION_FIXED; // destination will not change
- start2 = vblankcount; // set start to VBlank
- //shadowOAM[3].attr0 = ATTR0_HIDE;
- row3 = 0;
- col3 = rand()%180+120;
- }
- if(((bRow1 + 16) > monkeyRow) && ((bCol1 + 16) > monkeyCol)
- && (bRow1 < monkeyRow + 32) && (bCol1 < monkeyCol + 32))
- {
- bRow1 = 0;
- bCol1 = rand()%240;
- }
- if(((bRow2 + 16) > monkeyRow) && ((bCol2 + 16) > monkeyCol)
- && (bRow2 < monkeyRow + 32) && (bCol2 < monkeyCol + 32))
- {
- bRow2 = 0;
- bCol2 = rand()%240;
- }
- if (BUTTON_HELD(BUTTON_LEFT))
- {
- spriteState = LEFT_WALKING;
- if(monkeyCol > 0)
- {
- monkeyCol--;
- }
- }
- if (BUTTON_HELD(BUTTON_RIGHT))
- {
- spriteState = RIGHT_WALKING;
- if(monkeyCol < 220)
- {
- monkeyCol++;
- }
- }
- if(!BUTTON_HELD(BUTTON_LEFT) && !BUTTON_HELD(BUTTON_RIGHT) && !BUTTON_HELD(BUTTON_UP) && !BUTTON_HELD(BUTTON_DOWN))
- {
- spriteState = DOWN_STILL;
- }
- switch(spriteState)
- {
- case 0: //DOWN
- {
- shadowOAM[0].attr2 = (SPRITEOFFSET16(0,0));
- break;
- }
- case 1: //WALKING
- {
- break;
- }
- case 2: //UP
- {
- break;
- }
- case 3: //WALKING
- {
- break;
- }
- case 4: //RIGHT
- {
- shadowOAM[0].attr2 = (SPRITEOFFSET16(0,12));
- break;
- }
- case 5: //WALKING
- {
- if(previousSpriteState != RIGHT_WALKING)
- walkCounter = 0;
- if(walkCounter < 6)
- shadowOAM[0].attr2 = (SPRITEOFFSET16(0,16));
- else if(walkCounter >= 6 && walkCounter < 12)
- shadowOAM[0].attr2 = (SPRITEOFFSET16(0,12));
- walkCounter ++;
- if(walkCounter >=12)
- walkCounter = 0;
- break;
- }
- case 6: //LEFT
- {
- shadowOAM[0].attr2 = (SPRITEOFFSET16(0,4));
- break;
- }
- case 7: //WALKING
- {
- if(previousSpriteState != LEFT_WALKING)
- walkCounter = 0;
- if(walkCounter < 6)
- shadowOAM[0].attr2 = SPRITEOFFSET16(0,8);
- else if(walkCounter >= 6 && walkCounter < 12)
- shadowOAM[0].attr2 = SPRITEOFFSET16(0,4);
- walkCounter ++;
- if(walkCounter >=12)
- walkCounter = 0;
- break;
- }
- }
- if(!playing && playSound)
- {
- // Make sure sound is stopped
- REG_TM0CNT = 0; // Timer off
- DMA[1].cnt = 0; // DMA off
- // Now play it
- REG_TM0D = timerinterval; // Set timer to go off every timer interval
- REG_TM0CNT = TIMER_ON; // Turn Timer on
- // use DMA 1 if you are using timer 0 (for sound channel A)
- DMA[1].src = music2; // set source to sound
- DMA[1].dst = REG_FIFO_A; // Transfer sound data into FIFO A
- DMA[1].cnt = DMA_ON | START_ON_FIFO_EMPTY | // if the FIFO queue is empty DMA
- DMA_32 | DMA_REPEAT | // transfer 32 bits at a time and keep repeating
- DMA_DESTINATION_FIXED; // destination will not change
- start = vblankcount; // set start to VBlank
- playing = 1;
- }
- switch(state)
- {
- case B1:
- {
- /*if(BUTTON_PRESSED(BUTTON_SELECT))
- {
- playing = 0;
- // Make sure sound is stopped
- REG_TM1CNT = 0; // Timer off
- DMA[2].cnt = 0; // DMA off
- // Now play it
- REG_TM1D = timerinterval2; // Set timer to go off every timer interval
- REG_TM1CNT = TIMER_ON; // Turn Timer on
- // use DMA 1 if you are using timer 0 (for sound channel A)
- DMA[2].src = ding; // set source to sound
- DMA[2].dst = REG_FIFO_B; // Transfer sound data into FIFO A
- DMA[2].cnt = DMA_ON | START_ON_FIFO_EMPTY | // if the FIFO queue is empty DMA
- DMA_32 | DMA_REPEAT | // transfer 32 bits at a time and keep repeating
- DMA_DESTINATION_FIXED; // destination will not change
- start2 = vblankcount; // set start to VBlank
- }*/
- if (BUTTON_HELD(BUTTON_LEFT))
- {
- spriteState = LEFT_WALKING;
- if(monkeyCol > 0)
- {
- monkeyCol--;
- }
- }
- if (BUTTON_HELD(BUTTON_RIGHT))
- {
- spriteState = RIGHT_WALKING;
- if(monkeyCol < 220)
- {
- monkeyCol++;
- }
- }
- if(!BUTTON_HELD(BUTTON_LEFT) && !BUTTON_HELD(BUTTON_RIGHT) && !BUTTON_HELD(BUTTON_UP) && !BUTTON_HELD(BUTTON_DOWN))
- {
- spriteState = DOWN_STILL;
- }
- if(BUTTON_PRESSED(BUTTON_START))
- {
- /*****************************************************************
- *
- * Step 1 -- Store Tile Images
- *
- ****************************************************************/
- DMA[3].src = b2Tiles;
- DMA[3].dst = CHARBLOCKBASE;
- DMA[3].cnt = b2TilesLen/2 | DMA_ON;
- /*****************************************************************
- *
- * Step 2 -- Store map
- *
- ****************************************************************/
- DMA[3].src = b2Map;
- DMA[3].dst = SCREENBLOCKBASE + 27;
- DMA[3].cnt = b2MapLen/2 | DMA_ON;
- /*****************************************************************
- *
- * Step 3 -- Store palette
- *
- ****************************************************************/
- DMA[3].src = b2Pal;
- DMA[3].dst = PALETTE;
- DMA[3].cnt = b2PalLen/2 | DMA_ON;
- /*****************************************************************
- *
- * Step 4 -- Set image controls
- *
- ****************************************************************/
- REG_DISPCTL = MODE0 | BG0_ENABLE | SPRITE_ENABLE;
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- REG_BG0CNT = BG_SIZE1 | SBB(27) | COLOR256 | CBB(0);
- state = B2;
- }
- break;
- }
- case B2:
- {
- /*if(BUTTON_PRESSED(BUTTON_SELECT))
- {
- playing = 0;
- // Make sure sound is stopped
- REG_TM1CNT = 0; // Timer off
- DMA[2].cnt = 0; // DMA off
- // Now play it
- REG_TM1D = timerinterval2; // Set timer to go off every timer interval
- REG_TM1CNT = TIMER_ON; // Turn Timer on
- // use DMA 1 if you are using timer 0 (for sound channel A)
- DMA[2].src = ding; // set source to sound
- DMA[2].dst = REG_FIFO_B; // Transfer sound data into FIFO A
- DMA[2].cnt = DMA_ON | START_ON_FIFO_EMPTY | // if the FIFO queue is empty DMA
- DMA_32 | DMA_REPEAT | // transfer 32 bits at a time and keep repeating
- DMA_DESTINATION_FIXED; // destination will not change
- start2 = vblankcount; // set start to VBlank
- }*/
- if (BUTTON_HELD(BUTTON_LEFT))
- {
- spriteState = LEFT_WALKING;
- if(monkeyCol > 0)
- {
- monkeyCol--;
- }
- }
- if (BUTTON_HELD(BUTTON_RIGHT))
- {
- spriteState = RIGHT_WALKING;
- if(monkeyCol < 220)
- {
- monkeyCol++;
- }
- }
- if(!BUTTON_HELD(BUTTON_LEFT) && !BUTTON_HELD(BUTTON_RIGHT) && !BUTTON_HELD(BUTTON_UP) && !BUTTON_HELD(BUTTON_DOWN))
- {
- spriteState = DOWN_STILL;
- }
- if(BUTTON_PRESSED(BUTTON_START))
- {
- /*****************************************************************
- *
- * Step 1 -- Store Tile Images
- *
- ****************************************************************/
- DMA[3].src = b1Tiles;
- DMA[3].dst = CHARBLOCKBASE;
- DMA[3].cnt = b1TilesLen/2 | DMA_ON;
- /*****************************************************************
- *
- * Step 2 -- Store map
- *
- ****************************************************************/
- DMA[3].src = b1Map;
- DMA[3].dst = SCREENBLOCKBASE + 27;
- DMA[3].cnt = b1MapLen/2 | DMA_ON;
- /*****************************************************************
- *
- * Step 3 -- Store palette
- *
- ****************************************************************/
- DMA[3].src = b1Pal;
- DMA[3].dst = PALETTE;
- DMA[3].cnt = b1PalLen/2 | DMA_ON;
- /*****************************************************************
- *
- * Step 4 -- Set image controls
- *
- ****************************************************************/
- REG_DISPCTL = MODE0 | BG0_ENABLE | SPRITE_ENABLE;
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- REG_BG0CNT = BG_SIZE1 | SBB(27) | COLOR256 | CBB(0);
- state = B3;
- }
- break;
- }
- case B3:
- {
- /*if(BUTTON_PRESSED(BUTTON_SELECT))
- {
- playing = 0;
- // Make sure sound is stopped
- REG_TM1CNT = 0; // Timer off
- DMA[2].cnt = 0; // DMA off
- // Now play it
- REG_TM1D = timerinterval2; // Set timer to go off every timer interval
- REG_TM1CNT = TIMER_ON; // Turn Timer on
- // use DMA 1 if you are using timer 0 (for sound channel A)
- DMA[2].src = ding; // set source to sound
- DMA[2].dst = REG_FIFO_B; // Transfer sound data into FIFO A
- DMA[2].cnt = DMA_ON | START_ON_FIFO_EMPTY | // if the FIFO queue is empty DMA
- DMA_32 | DMA_REPEAT | // transfer 32 bits at a time and keep repeating
- DMA_DESTINATION_FIXED; // destination will not change
- start2 = vblankcount; // set start to VBlank
- }*/
- if (BUTTON_HELD(BUTTON_LEFT))
- {
- spriteState = LEFT_WALKING;
- if(monkeyCol > 0)
- {
- monkeyCol--;
- }
- }
- if (BUTTON_HELD(BUTTON_RIGHT))
- {
- spriteState = RIGHT_WALKING;
- if(monkeyCol < 220)
- {
- monkeyCol++;
- }
- }
- if(!BUTTON_HELD(BUTTON_LEFT) && !BUTTON_HELD(BUTTON_RIGHT) && !BUTTON_HELD(BUTTON_UP) && !BUTTON_HELD(BUTTON_DOWN))
- {
- spriteState = DOWN_STILL;
- }
- if(BUTTON_PRESSED(BUTTON_START))
- {
- /*****************************************************************
- *
- * Step 1 -- Store Tile Images
- *
- ****************************************************************/
- DMA[3].src = bbTiles;
- DMA[3].dst = CHARBLOCKBASE;
- DMA[3].cnt = bbTilesLen/2 | DMA_ON;
- /*****************************************************************
- *
- * Step 2 -- Store map
- *
- ****************************************************************/
- DMA[3].src = bbMap;
- DMA[3].dst = SCREENBLOCKBASE + 27;
- DMA[3].cnt = bbMapLen/2 | DMA_ON;
- /*****************************************************************
- *
- * Step 3 -- Store palette
- *
- ****************************************************************/
- DMA[3].src = bbPal;
- DMA[3].dst = PALETTE;
- DMA[3].cnt = bbPalLen/2 | DMA_ON;
- /*****************************************************************
- *
- * Step 4 -- Set image controls
- *
- ****************************************************************/
- REG_DISPCTL = MODE0 | BG0_ENABLE | SPRITE_ENABLE;
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- REG_BG0CNT = BG_SIZE1 | SBB(27) | COLOR256 | CBB(0);
- state = B1;
- }
- break;
- }
- }
- shadowOAM[0].attr0 = monkeyRow | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[0].attr1 = monkeyCol | ATTR1_SIZE32;
- /*shadowOAM[sprite1].attr0 = (sprites[sprite1].row & MASKROW) | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[sprite1].attr1 = (sprites[sprite1].col & MASKCOL) | ATTR1_SIZE16;
- shadowOAM[sprite2].attr0 = (sprites[sprite2].row & MASKROW) | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[sprite2].attr1 = (sprites[sprite2].col & MASKCOL) | ATTR1_SIZE16;
- shadowOAM[sprite3].attr0 = (sprites[sprite3].row & MASKROW) | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[sprite3].attr1 = (sprites[sprite3].col & MASKCOL) | ATTR1_SIZE16;*/
- shadowOAM[1].attr0 = row1 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[1].attr1 = col1 | ATTR1_SIZE16;
- shadowOAM[2].attr0 = row2 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[2].attr1 = col2 | ATTR1_SIZE16;
- shadowOAM[3].attr0 = row3 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[3].attr1 = col3 | ATTR1_SIZE16;
- shadowOAM[5].attr0 = bRow1 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[5].attr1 = bCol1 | ATTR1_SIZE16;
- shadowOAM[6].attr0 = bRow2 | ATTR0_REGULAR | ATTR0_NORMAL | ATTR0_4BPP | ATTR0_SQUARE;
- shadowOAM[6].attr1 = bCol2 | ATTR1_SIZE16;
- OAM[0] = shadowOAM[0];
- /*OAM[sprite1] = shadowOAM[sprite1];
- OAM[sprite2] = shadowOAM[sprite2];
- OAM[sprite3] = shadowOAM[sprite3];*/
- OAM[1] = shadowOAM[1];
- OAM[2] = shadowOAM[2];
- OAM[3] = shadowOAM[3];
- OAM[4] = shadowOAM[4];
- OAM[5] = shadowOAM[5];
- OAM[6] = shadowOAM[6];
- waitForVblank();
- // Update the offset registers.
- monkeyBigRow = monkeyRow + vOff;
- monkeyBigCol = monkeyCol + hOff;
- ham_VBAText("(%d,%d) hOff: %d vOff: %d\n", monkeyBigCol, monkeyBigRow, hOff, vOff);
- REG_BG0HOFS = hOff;
- REG_BG0VOFS = vOff;
- }
- return 0;
- }
- void setupInterrupts(void)
- {
- REG_IME = 0x0; // disable interrupts
- REG_INTERRUPT = (u32)interruptHandler; // set int handler
- enableVBlankInterrupt(); // Function to enable vb ints
- REG_IME = 0x1; // Enable interrupts
- }
- void enableVBlankInterrupt()
- {
- REG_DISPSTAT |= INT_VBLANK_ENABLE; // Make display generate vblank interrupts
- // This is the sender
- REG_IE = REG_IE | INT_VB; // Enable vblank interrupt detection
- // This is the receiver
- }
- void interruptHandler(void)
- {
- REG_IME = 0; //disable interrupts
- // Check which event happened,
- // and do something if you care about it
- if (REG_IF == INT_VB)
- {
- // A vblank happened, increment counter
- vblankcount++; // Static declared elsewhere
- if( (vblankcount - start) >= numvblanks)
- {
- // Make sure sound is stopped
- REG_TM0CNT = 0; // Timer off
- DMA[1].cnt = 0; // DMA off
- playing = 0;
- }
- if( (vblankcount - start2) >= numvblanks2)
- {
- // Make sure sound is stopped
- REG_TM1CNT = 0; // Timer off
- DMA[2].cnt = 0; // DMA off
- }
- }
- REG_IF = REG_IF; // Tell GBA that interrupt has
- // been handled
- REG_IME = 1; // enable interrupts
- }
- void dmaTransfer(void *destination, const void *source, u32 chunks, u32 mode)
- {
- DMA_MEMORY[3].source = source;
- DMA_MEMORY[3].destination = destination;
- DMA_MEMORY[3].control = chunks | mode;
- }
Add Comment
Please, Sign In to add comment