示例#1
0
文件: File.cpp 项目: 0xPIT/microtouch
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
}
示例#2
0
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
}
示例#3
0
文件: menu.c 项目: bogger33/gnuboy-gx
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;
}
示例#4
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	
}
示例#5
0
文件: main.c 项目: TCCQ/d2x-cios
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;
}
示例#6
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;
}