void mainproc(void *arg) { int i, j; int cont_no = 0; int error, readerror; u8 bitpattern; u16 button = 0, oldbutton = 0, newbutton = 0; u32 stat; char console_text[50]; osCreateMesgQueue(&pifMesgQueue, pifMesgBuf, NUM_MESSAGE); osSetEventMesg(OS_EVENT_SI, &pifMesgQueue, dummyMessage); osContInit(&pifMesgQueue, &bitpattern, &contstat[0]); for (i = 0; i < MAXCONTROLLERS; i++) { if ((bitpattern & (1<<i)) && ((contstat[i].type & CONT_TYPE_MASK) == CONT_TYPE_NORMAL)) { controller[i] = CONT_VALID; } else { controller[i] = CONT_INVALID; } } osCreateMesgQueue(&dmaMessageQ, dmaMessageBuf, 1); pi_handle = osCartRomInit(); pi_ddrom_handle = osDriveRomInit(); bzero(blockData, 0x1000); readerror = -1; init_draw(); setcolor(0,255,0); draw_puts("If you see this for a long period of time,\nsomething f****d up. Sorry."); LeoCJCreateLeoManager((OSPri)OS_PRIORITY_LEOMGR-1, (OSPri)OS_PRIORITY_LEOMGR, LeoMessages, NUM_LEO_MESGS); LeoResetClear(); setbgcolor(15,15,15); clear_draw(); setcolor(0,255,0); draw_puts("\f\n 64DD IPL dumper v0.01b by LuigiBlood & marshallh\n ----------------------------------------\n"); setcolor(255,255,255); draw_puts(" PRESS START TO DUMP"); while(1) { osContStartReadData(&pifMesgQueue); osRecvMesg(&pifMesgQueue, NULL, OS_MESG_BLOCK); osContGetReadData(&contdata[0]); if (contdata[cont_no].errno & CONT_NO_RESPONSE_ERROR) { button = oldbutton; } else { oldbutton = button; button = contdata[cont_no].button; } newbutton = ~oldbutton & button; if (newbutton & START_BUTTON) { //DUMP!! //64drive, enable write to SDRAM/ROM srand(osGetCount()); // necessary to generate unique short 8.3 filenames on memory card ciEnableRomWrites(); draw_puts("\f\n\n\n\n\n Let's dump! Don't turn off the console!\n\n"); osInvalDCache((void *)&blockData, (s32) 0x1000); dmaIoMesgBuf.hdr.pri = OS_MESG_PRI_NORMAL; dmaIoMesgBuf.hdr.retQueue = &dmaMessageQ; dmaIoMesgBuf.dramAddr = &blockData; dmaIoMesgBuf.devAddr = IPLoffset; dmaIoMesgBuf.size = 0x1000; for (IPLoffset = 0; IPLoffset < 0x400000; IPLoffset += 0x1000) { //read 64DD IPL osWritebackDCacheAll(); dmaIoMesgBuf.hdr.pri = OS_MESG_PRI_NORMAL; dmaIoMesgBuf.hdr.retQueue = &dmaMessageQ; dmaIoMesgBuf.dramAddr = (void *)&blockData; dmaIoMesgBuf.devAddr = 0xA6000000 + IPLoffset; dmaIoMesgBuf.size = 0x1000; osEPiStartDma(pi_ddrom_handle, &dmaIoMesgBuf, OS_READ); osRecvMesg(&dmaMessageQ, NULL, OS_MESG_BLOCK); //Write to 64drive osWritebackDCacheAll(); dmaIoMesgBuf.hdr.pri = OS_MESG_PRI_NORMAL; dmaIoMesgBuf.hdr.retQueue = &dmaMessageQ; dmaIoMesgBuf.dramAddr = (void *)&blockData; dmaIoMesgBuf.devAddr = 0xB0000000 + IPLoffset; dmaIoMesgBuf.size = 0x1000; osEPiStartDma(pi_handle, &dmaIoMesgBuf, OS_WRITE); osRecvMesg(&dmaMessageQ, NULL, OS_MESG_BLOCK); } //DONE!! NOW WRITE TO SD fat_start(); draw_puts("\n - DONE !!\n"); for(;;); } } }
// doFont() // // Draw all fonts for this frame. // void doFont(void) { static int color = 255; #ifdef DD64 currBufferPtr = fontBuffer; #endif /* Settings */ gDPPipeSync(glistp++); gDPSetCycleType(glistp++,G_CYC_1CYCLE); gDPSetTexturePersp(glistp++,G_TP_NONE); gDPSetTextureLUT(glistp++,G_TT_NONE); gDPSetTextureLOD(glistp++,G_TL_LOD); gDPSetAlphaCompare(glistp++,G_AC_THRESHOLD); gDPSetRenderMode(glistp++,G_RM_XLU_SURF,G_RM_XLU_SURF2); gDPSetCombineMode(glistp++,G_CC_INT4,G_CC_INT4); gDPSetPrimColor(glistp++,0,0,255,255,255,255); // Print welcome message printString(40, 30, 3, message[WELCOME_MESG]); #ifdef DD64 // Assume no EEPROM if DD game gDPSetPrimColor(glistp++,0,0,255,0,0,255); #else // Print EEPROM message if EEPROM exists if (EepromFound == 1) { gDPSetPrimColor(glistp++,0,0,0,255,0,255); } else { gDPSetPrimColor(glistp++,0,0,255,0,0,255); } #endif printString(30, 52, 3, message[EEPROM_MESG]); // Print DD message #ifdef DD64 gDPSetPrimColor(glistp++,0,0,0,255,0,255); #else gDPSetPrimColor(glistp++,0,0,255,0,0,255); #endif printString(250, 52, 3, message[DD_MESG]); #ifdef DD64 // Print Data menu if (DataMenu != DM_INVISIBLE) { gDPSetPrimColor(glistp++, 0, 0, 255, 255, 0, 255); printString(200, 170, 3, message[DM_READ_MESG]); printString(200, 182, 3, message[DM_WRITE_MESG]); printString(200, 194, 3, message[DM_GOAWAY_MESG]); gDPSetPrimColor(glistp++, 0, 0, color, 200, 200, 255); color += COLOR_DELTA; color = color%256; printString(200, 170 + 12*DataMenuPos, 3, message[DataMenuPos+3]); } #else // Print Data menu if ((EepromFound == 1) && (DataMenu != DM_INVISIBLE)) { gDPSetPrimColor(glistp++, 0, 0, 255, 255, 0, 255); printString(30, 170, 3, message[DM_READ_MESG]); printString(30, 182, 3, message[DM_WRITE_MESG]); printString(30, 194, 3, message[DM_GOAWAY_MESG]); gDPSetPrimColor(glistp++, 0, 0, color, 200, 200, 255); color += COLOR_DELTA; color = color%256; printString(30, 170 + 12*DataMenuPos, 3, message[DataMenuPos+3]); } #endif #ifdef DD64 osInvalDCache(fontBuffer,currBufferPtr-fontBuffer); #else osInvalDCache(myFont,sizeof(myFont)); #endif }