Exemplo n.º 1
0
static uae_u32 hardfile_open (void)
{
    uaecptr tmp1 = m68k_areg(regs, 1); /* IOReq */

    /* Check unit number */
    if (get_hardfile_data (m68k_dreg (regs, 0))) {
	opencount++;
	put_word (m68k_areg(regs, 6)+32, get_word (m68k_areg(regs, 6)+32) + 1);
	put_long (tmp1 + 24, m68k_dreg (regs, 0)); /* io_Unit */
	put_byte (tmp1 + 31, 0); /* io_Error */
	put_byte (tmp1 + 8, 7); /* ln_type = NT_REPLYMSG */
	return 0;
    }

    put_long (tmp1 + 20, (uae_u32)-1);
    put_byte (tmp1 + 31, (uae_u8)-1);
    return (uae_u32)-1;
}
Exemplo n.º 2
0
static int hfdcheck (TCHAR drive)
{
	HANDLE h;
	TCHAR tmp[16];
	int disknum, i;

	_stprintf (tmp, _T("\\\\.\\%c:"), drive);
	h = CreateFile (tmp, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (h == INVALID_HANDLE_VALUE)
		return 0;
	disknum = getidfromhandle (h);
	CloseHandle (h);
	for (i = 0; i < MAX_FILESYSTEM_UNITS; i++) {
		struct hardfiledata *hfd = get_hardfile_data (i);
		int reopen = 0;
		if (!hfd || !(hfd->flags & HFD_FLAGS_REALDRIVE) || !hfd->handle_valid)
			continue;
		if (getidfromhandle (hfd->handle) == disknum)
			return 1;
	}
	return 0;
}
Exemplo n.º 3
0
static uae_u32 hardfile_beginio (void)
{
	uae_u32 tmp1, tmp2, dataptr, offset;
	uae_u32 retval = m68k_dreg(regs, 0);
	int unit;
	struct hardfiledata *hfd;
	
	tmp1 = m68k_areg(regs, 1);
	unit = get_long (tmp1 + 24);

	hfd = get_hardfile_data (unit);
	
	put_byte (tmp1+8, NT_MESSAGE);
	put_byte (tmp1+31, 0); /* no error yet */
	tmp2 = get_word (tmp1+28); /* io_Command */
	/*    put_byte (tmp1 + 30, get_byte (tmp1 + 30) & ~1);*/
	switch (tmp2) {
		case CMD_READ:
			gui_data.hdled = HDLED_READ;
			
			dataptr = get_long (tmp1 + 40);
			if (dataptr & 1)
				goto bad_command;
			offset = get_long (tmp1 + 44);
			if (offset & 511)
				goto bad_command;
			tmp2 = get_long (tmp1 + 36); /* io_Length */
			if (tmp2 & 511)
				goto bad_command;
			if (tmp2 + offset > (uae_u32)hfd->size)
				goto bad_command;
			
			put_long (tmp1 + 32, tmp2); /* set io_Actual */
			fseek (hfd->fd, offset, SEEK_SET);
			while (tmp2) {
				int i;
				char buffer[512];
				/* See the comment in CMD_WRITE */
				fread (buffer, 1, 512, hfd->fd);
				for (i = 0; i < 512; i++, dataptr++)
					put_byte(dataptr, buffer[i]);
				tmp2 -= 512;
			}
			break;
			
		case CMD_WRITE:
		case 11: /* Format */
			gui_data.hdled = HDLED_WRITE;
			
			dataptr = get_long (tmp1 + 40);
			if (dataptr & 1)
				goto bad_command;
			offset = get_long (tmp1 + 44);
			if (offset & 511)
				goto bad_command;
			tmp2 = get_long (tmp1 + 36); /* io_Length */
			if (tmp2 & 511)
				goto bad_command;
			if (tmp2 + offset > (uae_u32)hfd->size)
				goto bad_command;
			
			put_long (tmp1 + 32, tmp2); /* set io_Actual */
			fseek (hfd->fd, offset, SEEK_SET);
			while (tmp2) {
				char buffer[512];
				int i;
				for (i=0; i < 512; i++, dataptr++)
					buffer[i] = get_byte(dataptr);
				fwrite (buffer, 1, 512, hfd->fd);
				tmp2 -= 512;
			}
			break;
			
			bad_command:
			break;
			
		case 18: /* GetDriveType */
			printf ("Shouldn't happen\n");
			put_long (tmp1 + 32, 1); /* not exactly a 3.5" drive, but... */
			break;
			
		case 19: /* GetNumTracks */
			printf ("Shouldn't happen 2\n");
			put_long (tmp1 + 32, 0);
			break;
			
			/* Some commands that just do nothing and return zero */
		case CMD_UPDATE:
		case CMD_CLEAR:
		case 9: /* Motor */
		case 10: /* Seek */
		case 12: /* Remove */
		case 13: /* ChangeNum */
		case 14: /* ChangeStatus */
		case 15: /* ProtStatus */
		case 20: /* AddChangeInt */
		case 21: /* RemChangeInt */
			put_long (tmp1+32, 0); /* io_Actual */
			retval = 0;
			break;
			
		default:
			/* Command not understood. */
			put_byte (tmp1+31, (uae_u8)-3); /* io_Error */
			retval = 0;
			break;
	}
	return retval;
}
Exemplo n.º 4
0
static uae_u32 hardfile_beginio (void)
{
	uae_u32 tmp1, tmp2, dataptr, offset;
	uae_u32 retval = m68k_dreg(regs, 0);
	int unit;
	struct hardfiledata *hfd;
	
	tmp1 = m68k_areg(regs, 1);
	unit = get_long (tmp1 + 24);
#undef DEBUGME
#ifdef DEBUGME
	printf ("hardfile: unit = %d\n", unit);
	printf ("hardfile: tmp1 = %08lx\n", (unsigned long)tmp1);
	printf ("hardfile: cmd  = %d\n", (int)get_word(tmp1+28));
#endif
	hfd = get_hardfile_data (unit);
	
	put_byte (tmp1+8, NT_MESSAGE);
	put_byte (tmp1+31, 0); /* no error yet */
	tmp2 = get_word (tmp1+28); /* io_Command */
	/*    put_byte (tmp1 + 30, get_byte (tmp1 + 30) & ~1);*/
	switch (tmp2) {
		case CMD_READ:
			gui_data.hdled = HDLED_READ;
			
			dataptr = get_long (tmp1 + 40);
			if (dataptr & 1)
				goto bad_command;
			offset = get_long (tmp1 + 44);
			if (offset & 511)
				goto bad_command;
			tmp2 = get_long (tmp1 + 36); /* io_Length */
			if (tmp2 & 511)
				goto bad_command;
			if (tmp2 + offset > (uae_u32)hfd->size)
				goto bad_command;
			
			put_long (tmp1 + 32, tmp2); /* set io_Actual */
#ifdef __SYMBIAN32__
			lseek (fileno(hfd->fd), offset, SEEK_SET);
#else
			fseek (hfd->fd, offset, SEEK_SET);
#endif
			while (tmp2) {
				int i;
				char buffer[512];
#ifdef __SYMBIAN32__
				/* See the comment in CMD_WRITE */
				read (fileno(hfd->fd), buffer, 512);
#else
				fread (buffer, 1, 512, hfd->fd);
#endif
				for (i = 0; i < 512; i++, dataptr++)
					put_byte(dataptr, buffer[i]);
				tmp2 -= 512;
			}
			break;
			
		case CMD_WRITE:
		case 11: /* Format */
			gui_data.hdled = HDLED_WRITE;
			
			dataptr = get_long (tmp1 + 40);
			if (dataptr & 1)
				goto bad_command;
			offset = get_long (tmp1 + 44);
			if (offset & 511)
				goto bad_command;
			tmp2 = get_long (tmp1 + 36); /* io_Length */
			if (tmp2 & 511)
				goto bad_command;
			if (tmp2 + offset > (uae_u32)hfd->size)
				goto bad_command;
			
			put_long (tmp1 + 32, tmp2); /* set io_Actual */
#ifdef __SYMBIAN32__
			lseek (fileno(hfd->fd), offset, SEEK_SET);
#else
			fseek (hfd->fd, offset, SEEK_SET);
#endif
			while (tmp2) {
				char buffer[512];
				int i;
				for (i=0; i < 512; i++, dataptr++)
					buffer[i] = get_byte(dataptr);
#ifdef __SYMBIAN32__
				/* For some reason, fwrite() *appends* data at the end of the HDF file,
				 * instead of writing it at fseek() offset, even though fopen() was called
				 * with "r+b" parameter, and not "a+"!
				 * write() works correctly.
				 */
				write (fileno(hfd->fd), buffer, 512);
#else
				fwrite (buffer, 1, 512, hfd->fd);
#endif			
				tmp2 -= 512;
			}
			break;
			
			bad_command:
			break;
			
		case 18: /* GetDriveType */
			printf ("Shouldn't happen\n");
			put_long (tmp1 + 32, 1); /* not exactly a 3.5" drive, but... */
			break;
			
		case 19: /* GetNumTracks */
			printf ("Shouldn't happen 2\n");
			put_long (tmp1 + 32, 0);
			break;
			
			/* Some commands that just do nothing and return zero */
		case CMD_UPDATE:
		case CMD_CLEAR:
		case 9: /* Motor */
		case 10: /* Seek */
		case 12: /* Remove */
		case 13: /* ChangeNum */
		case 14: /* ChangeStatus */
		case 15: /* ProtStatus */
		case 20: /* AddChangeInt */
		case 21: /* RemChangeInt */
			put_long (tmp1+32, 0); /* io_Actual */
			retval = 0;
			break;
			
		default:
			/* Command not understood. */
			put_byte (tmp1+31, (uae_u8)-3); /* io_Error */
			retval = 0;
			break;
	}
#if 0
	if ((get_byte (tmp1+30) & 1) == 0) {
		/* Not IOF_QUICK -- need to ReplyMsg */
		m68k_areg(regs, 1) = tmp1;
		CallLib (get_long(4), -378);
	}
#endif
	return retval;
}