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; }
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; }
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; }
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; }