/** * @file main.c * @brief Entry point e inizializzazione hardware del Game Boy. * * Questo modulo funge da collante: inizializza le periferiche video, * semina la randomicità per il generatore, invoca l'algoritmo logico e * disegna i tile sullo schermo del Game Boy, manipolando i registri hardware. */ #include #include #include #include "maze.h" #include "tiles.h" #include "rat.h" #include "music.h" #include "cursor.h" void main(void) { uint8_t y, x; uint8_t black = 1; // Attende il termine dell'aggiornamento verticale dello schermo (VBLANK). // Caricare dati in VRAM al di fuori di questo periodo può causare tearing o artefatti. wait_vbl_done(); // Invia i dati grafici (array TileData) dal banco ROM alla VRAM a partire dall'indice 0. set_bkg_data(0, 5, TileData); // Carichiamo 5 tile: 1 strada + 4 siepi // Inizializza il seme dei numeri casuali. initrand(DIV_REG); // La mappa background in memoria hardware è grande 32x32 tiles. // Riempiamo preventivamente tutta quest'area nascosta con siepi casuali for (y = 0; y < 32; y++) { for (x = 0; x < 32; x++) { uint8_t rand_hedge = 1 + (rand() % 4); set_bkg_tiles(x, y, 1, 1, &rand_hedge); } } // Invoca la funzione logica per popolare l'array `maze` in memoria. generate_maze(); // Riversa l'array generato `maze` nella memoria del Background (VRAM Mappa). for (y = 0; y < MAZE_HEIGHT; y++) { for (x = 0; x < MAZE_WIDTH; x++) { uint8_t tile_idx = maze[y][x]; if (tile_idx == 1) { // Se è un muro, scegli una siepe variante casuale tile_idx = 1 + (rand() % 4); } set_bkg_tiles(x, y, 1, 1, &tile_idx); } } // Trucco di centraggio (Hardware Scrolling): move_bkg(252, 252); // Inizializza il topo autonomo nel punto di partenza (1, 1) init_rat(1, 1); // Inizializza il cursore controllato dal giocatore init_cursor(); // Inizializza il sequencer musicale init_music(); SHOW_BKG; SHOW_SPRITES; DISPLAY_ON; // Game Loop primario while (1) { // Aggiorna la musica in background update_music(); // Aggiorna l'intelligenza artificiale e l'animazione del topo update_rat(); // Aggiorna l'input del cursore del giocatore update_cursor(); // Attendi la sincronizzazione con il monitor wait_vbl_done(); } }