/* fifo_demo1 ARM9 Code Chris Double (chris.double@double.co.nz) http://www.double.co.nz/nintendo_ds */ #include #include "nds/arm9/console.h" #include #include #include #include "fifo.h" #include "transfer.h" uint32 arm9_recv = 0; void on_irq() { if(REG_IF & IRQ_VBLANK) { // Clear screen printf("\x1b[2J"); printf("FIFO Demo Program\n\n"); printf("ARM9 Fifo Registers:\n"); printf("REG_IPCFIFOCNT: %x\n", REG_IPCFIFOCNT); printf("REG_IPCFIFORECV: %x\n", arm9_recv); printf("ARM7 Fifo Registers:\n"); printf("REG_IPCFIFOCNT: %x\n", arm7_fifo->cnt); printf("REG_IPCFIFORECV: %x\n", arm7_fifo->recv); // Tell the DS we handled the VBLANK interrupt VBLANK_INTR_WAIT_FLAGS |= IRQ_VBLANK; REG_IF |= IRQ_VBLANK; } else { // Ignore all other interrupts REG_IF = REG_IF; } } void InitInterruptHandler() { REG_IME = 0; IRQ_HANDLER = on_irq; REG_IE = IRQ_VBLANK; REG_IF = ~0; DISP_SR = DISP_VBLANK_IRQ; REG_IME = 1; } int main(void) { powerON(POWER_ALL); videoSetMode(MODE_0_2D | DISPLAY_BG0_ACTIVE); vramSetBankA(VRAM_A_MAIN_BG); BG0_CR = BG_MAP_BASE(31); BG_PALETTE[255] = RGB15(31,31,31); lcdSwap(); InitInterruptHandler(); consoleInitDefault((u16*)SCREEN_BASE_BLOCK(31), (u16*)CHAR_BASE_BLOCK(0), 16); CommandInit(); while(1) { swiWaitForVBlank(); scanKeys(); // ARM9 Keys if((keysHeld() & KEY_R) && (keysDown() & KEY_UP)) { REG_IPCFIFOCNT = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR; } if((keysHeld() & KEY_R) && (keysDown() & KEY_RIGHT)) { static int count = 0; REG_IPCFIFOSEND = ++count; } if((keysHeld() & KEY_R) && (keysDown() & KEY_DOWN)) { arm9_recv = REG_IPCFIFORECV; } // ARM7 Keys if((keysHeld() & KEY_L) && (keysDown() & KEY_UP)) { CommandFIFOInit(); } if((keysHeld() & KEY_L) && (keysDown() & KEY_RIGHT)) { CommandFIFOSend(); } if((keysHeld() & KEY_L) && (keysDown() & KEY_DOWN)) { CommandFIFORecv(); } } return 0; }