byte File::Open(const char* path) { #ifdef SIMULATOR char s[1024]; sprintf(s,"microSD/%s",path); if (_f) fclose(_f); _f = fopen(s,"r+b"); if (_f) { fseek(_f,0,SEEK_END); _extent.fileLength = ftell(_f); fseek(_f,0,SEEK_SET); Load(0); } return _f ? 1 : 0; #else if (FAT_Open(path,&_extent,_buffer)) { Load(0); // load 0? return 1; } #if 0 char s[32]; sprintf(s,"Opened %s %ld:%ld\n",path,_origin,_fileLength); print(s); Console(s); #endif return 0; #endif }
byte File::Open(const char* path) { #ifdef USE_WIN32_FS char s[1024]; sprintf(s,"microSD\\%s",path); if (_h != INVALID_HANDLE_VALUE) ::CloseHandle(_h); _h = ::CreateFileA(s, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); Load(0); _extent.fileLength = GetFileSize( _h, NULL ); return _h == INVALID_HANDLE_VALUE ? 0 : 1; #else if (FAT_Open(path,&_extent,_buffer)) { Load(0); // load 0? return 1; } #if 0 char s[32]; sprintf(s,"Opened %s %ld:%ld\n",path,_origin,_fileLength); print(s); Console(s); #endif return 0; #endif }
int loadmenu () { int prevmenu = menu; int ret,count,size; int quit = 0; #ifdef HW_RVL count = 7; char item[7][20] = { {"Load Recent"}, {"Load from SD"}, {"Load from USB"}, {"Load from IDE-EXI"}, {"Load from DVD"}, {"Stop DVD Motor"}, {"Return to previous"} }; #else count = 7; char item[7][20] = { {"Load Recent"}, {"Load from SD"}, {"Load from IDE-EXI"}, {"Load from WKF"}, {"Load from DVD"}, {"Stop DVD Motor"}, {"Return to previous"} }; #endif menu = load_menu; while (quit == 0) { strcpy (menutitle, ""); ret = DoMenu (&item[0], count); switch (ret) { // Load from DVD case 4: load_menu = menu; size = DVD_Open(gbrom); if (size) { dvd_on = 1; gbromsize = size; memfile_autosave(); reload_rom(); memfile_autoload(); return 1; } break; // Stop DVD Disc case 5: dvd_motor_off(); dvd_on = 0; menu = load_menu; break; // Button B - Return to Previous case -1: case 6: quit = 1; break; // Load from SD, USB, IDE-EXI, or WKF device default: load_menu = menu; size = FAT_Open(ret,gbrom); if (size) { gbromsize = size; memfile_autosave(); reload_rom(); memfile_autoload(); return 1; } break; } } menu = prevmenu; return 0; }
void debug_printf(char *format,...) { #if 1 va_list opt; static char out[32] ATTRIBUTE_ALIGN(32)=" "; int val; char *s; va_start(opt, format); int fd; int message; static int one=1; static u32 buffer[8]; static u32 queuehandle2=-1; if(one) { queuehandle2 = os_message_queue_create(buffer, 8); one=0; } else os_message_queue_receive(queuehandle2, (void *)&message, 0); internal=internal_debug_printf; if(internal & 2) goto salir; if(index_dev & 1) { if(internal) fd = FAT_Open("usb:/ffs_log.txt" ,O_WRONLY | O_APPEND); else fd=os_open("usb:/ffs_log.txt" ,O_WRONLY | O_APPEND); } else { if(internal) fd = FAT_Open("sd:/ffs_log.txt" ,O_WRONLY | O_APPEND); else fd=os_open("sd:/ffs_log.txt" ,O_WRONLY | O_APPEND); } if(fd<0) goto salir; while(format[0]) { if(format[0]!='%') {out[0]=*format++; printf_write(fd, out, strlen(out));} else { format++; switch(format[0]) { case 'd': case 'i': val=va_arg(opt,int); int_char(val); printf_write(fd, mem_cad, strlen(mem_cad)); break; case 'u': val=va_arg(opt, unsigned); uint_char(val); //printf_write(fd, mem_cad, strlen(mem_cad)); printf_write(fd, mem_cad, strlen(mem_cad)); break; case 'x': val=va_arg(opt,int); hex_char((u32) val); printf_write(fd, mem_cad, strlen(mem_cad)); break; case 's': s=va_arg(opt,char *); printf_write(fd, s, strlen(s)); break; } format++; } } va_end(opt); if(internal) FAT_Close(fd); else os_close(fd); salir: os_message_queue_send(queuehandle2, 0, 0); #endif }
int main(void) { u32 queuehandle; s32 ret; /* Print info */ svc_write("$IOSVersion: FAT: " __DATE__ " " __TIME__ " 64M$\n"); /* Create blinker thread */ Led_CreateBlinkThread(); /* Initialize module */ ret = __FAT_Initialize(&queuehandle); if (ret < 0) return ret; /* Main loop */ while (1) { ipcmessage *message = NULL; /* Wait for message */ ret = os_message_queue_receive(queuehandle, (void *)&message, 0); if (ret) continue; switch (message->command) { case IOS_OPEN: { char *devpath = message->open.device; u32 mode = message->open.mode; if (*devpath == '$') { char path[256]; /* Build absolute path to emu nand */ strcpy(path, emuNandPath); FAT_Escape(path+emuNandPathLen, devpath+1); dbg_printf("FAT: IOS_OPEN: Opening relative file %s\n", devpath); /* Open file */ ret = FAT_Open(path, mode); dbg_printf("FAT: IOS_OPEN: ret = %d\n", ret); } else if (!strcmp(devpath, DEVICE_FAT)) { /* Open module */ dbg_printf("FAT: IOS_OPEN: Opening FAT module\n"); ret = 0; dbg_printf("FAT: IOS_OPEN: ret = %d\n", ret); } else if (!strncmp(devpath, DEVICE_FAT, DEVICE_FAT_LEN)) { /* Open file */ dbg_printf("FAT: IOS_OPEN: Opening absolute file %s\n", devpath + DEVICE_FAT_LEN); ret = FAT_Open(devpath + DEVICE_FAT_LEN, mode); dbg_printf("FAT: IOS_OPEN: ret = %d\n", ret); } else { dbg_printf("FAT: IOS_OPEN: Unknown device path %s\n", devpath); /* Error */ ret = IPC_EINVAL; } break; } case IOS_CLOSE: { ret = 0; // FIX d2x v7 beta1 // Check added because the fd might represent the module, // see IOS_OPEN. // Tipically a fd representing a module is far lower than 32, // while a fd representing a file is an address 32 byte aligned. if(message->fd != 0 && (message->fd % 32) == 0) { dbg_printf("FAT: IOS_CLOSE: Closing file... fd = %d\n", message->fd); /* Close file */ ret = FAT_Close(message->fd); } #ifdef DEBUG else { dbg_printf("FAT: IOS_CLOSE: Closing FAT module...\n"); } #endif dbg_printf("FAT: IOS_CLOSE: ret = %d\n", ret); break; } case IOS_READ: { void *buffer = message->read.data; u32 len = message->read.length; dbg_printf("FAT: IOS_READ: fd = %d, buffer = %x, len = %d\n", message->fd, buffer, len); /* Read file */ ret = FAT_Read(message->fd, buffer, len); /* Flush cache */ os_sync_after_write(buffer, len); dbg_printf("FAT: IOS_READ: ret = %d\n", ret); break; } case IOS_WRITE: { void *buffer = message->write.data; u32 len = message->write.length; dbg_printf("FAT: IOS_WRITE: fd = %d, buffer = %x, len = %d\n", message->fd, buffer, len); /* Invalidate cache */ os_sync_before_read(buffer, len); /* Sart blinking */ Led_BlinkOn(); /* Write file */ ret = FAT_Write(message->fd, buffer, len); dbg_printf("FAT: IOS_WRITE: ret = %d\n", ret); /* Stop blinking */ Led_BlinkOff(); break; } case IOS_SEEK: { s32 where = message->seek.offset; s32 whence = message->seek.origin; dbg_printf("FAT: IOS_SEEK: fd = %d, where = %d, whence = %d\n", message->fd, where, whence); /* Seek file */ ret = FAT_Seek(message->fd, where, whence); dbg_printf("FAT: IOS_SEEK: ret = %d\n", ret); break; } case IOS_IOCTL: { void *inbuf = message->ioctl.buffer_in; void *iobuf = message->ioctl.buffer_io; u32 inlen = message->ioctl.length_in; u32 iolen = message->ioctl.length_io; u32 cmd = message->ioctl.command; /* Parse IOCTL */ ret = __FAT_Ioctl(message->fd, cmd, inbuf, inlen, iobuf, iolen); break; } case IOS_IOCTLV: { ioctlv *vector = message->ioctlv.vector; u32 inlen = message->ioctlv.num_in; u32 iolen = message->ioctlv.num_io; u32 cmd = message->ioctlv.command; /* Parse IOCTLV */ ret = __FAT_Ioctlv(message->fd, cmd, vector, inlen, iolen); break; } default: /* Unknown command */ ret = IPC_EINVAL; } /* Acknowledge message */ os_message_queue_ack((void *)message, ret); } return 0; }
int main(void) { u32 queuehandle; s32 ret; /* Print info */ write("$IOSVersion: FAT: " __DATE__ " " __TIME__ " 64M$\n"); /* Initialize module */ ret = __FAT_Initialize(&queuehandle); if (ret < 0) return ret; /* Main loop */ while (1) { ipcmessage *message = NULL; /* Wait for message */ os_message_queue_receive(queuehandle, (void *)&message, 0); switch (message->command) { case IOS_OPEN: { char *devpath = message->open.device; u32 mode = message->open.mode; /* FAT device */ if (!strcmp(devpath, DEVICE_FAT)) { ret = 0; break; } /* Open file */ ret = FAT_Open(devpath, mode); break; } case IOS_CLOSE: { /* Close file */ ret = FAT_Close(message->fd); break; } case IOS_READ: { void *buffer = message->read.data; u32 len = message->read.length; /* Read file */ ret = FAT_Read(message->fd, buffer, len); break; } case IOS_WRITE: { void *buffer = message->write.data; u32 len = message->write.length; /* Write file */ ret = FAT_Write(message->fd, buffer, len); break; } case IOS_SEEK: { u32 where = message->seek.offset; u32 whence = message->seek.origin; /* Seek file */ ret = FAT_Seek(message->fd, where, whence); break; } case IOS_IOCTL: { void *inbuf = message->ioctl.buffer_in; u32 inlen = message->ioctl.length_in; void *iobuf = message->ioctl.buffer_io; u32 iolen = message->ioctl.length_io; u32 cmd = message->ioctl.command; /* Parse IOCTL message */ ret = FAT_Ioctl(message->fd, cmd, inbuf, inlen, iobuf, iolen); break; } case IOS_IOCTLV: { ioctlv *vector = message->ioctlv.vector; u32 inlen = message->ioctlv.num_in; u32 iolen = message->ioctlv.num_io; u32 cmd = message->ioctlv.command; /* Parse IOCTLV message */ ret = FAT_Ioctlv(message->fd, cmd, vector, inlen, iolen); break; } default: /* Unknown command */ ret = IPC_EINVAL; } /* Acknowledge message */ os_message_queue_ack((void *)message, ret); } return 0; }