--- uae/src/hardfile.c 2018/04/24 16:47:23 1.1.1.5 +++ uae/src/hardfile.c 2018/04/24 17:21:48 1.1.1.9 @@ -9,27 +9,120 @@ #include "sysconfig.h" #include "sysdeps.h" -#include "config.h" #include "options.h" #include "memory.h" #include "custom.h" -#include "readcpu.h" #include "newcpu.h" #include "disk.h" +#include "traps.h" #include "autoconf.h" -#include "filesys.h" #include "execlib.h" +#include "filesys.h" + +#define CMD_INVALID 0 +#define CMD_RESET 1 +#define CMD_READ 2 +#define CMD_WRITE 3 +#define CMD_UPDATE 4 +#define CMD_CLEAR 5 +#define CMD_STOP 6 +#define CMD_START 7 +#define CMD_FLUSH 8 +#define CMD_MOTOR 9 +#define CMD_SEEK 10 +#define CMD_FORMAT 11 +#define CMD_REMOVE 12 +#define CMD_CHANGENUM 13 +#define CMD_CHANGESTATE 14 +#define CMD_PROTSTATUS 15 +#define CMD_GETDRIVETYPE 18 +#define CMD_GETNUMTRACKS 19 +#define CMD_ADDCHANGEINT 20 +#define CMD_REMCHANGEINT 21 +#define CMD_GETGEOMETRY 22 + +/* Trackdisk64 support */ +#define TD_READ64 24 +#define TD_WRITE64 25 +#define TD_SEEK64 26 +#define TD_FORMAT64 27 + +/* New Style Devices (NSD) support */ +#define DRIVE_NEWSTYLE 0x4E535459L /* 'NSTY' */ +#define NSCMD_DEVICEQUERY 0x4000 +#define NSCMD_TD_READ64 0xc000 +#define NSCMD_TD_WRITE64 0xc001 +#define NSCMD_TD_SEEK64 0xc002 +#define NSCMD_TD_FORMAT64 0xc003 static int opencount = 0; -static uae_u32 hardfile_open (void) +static uae_u32 nscmd_cmd; + +int hdf_read (struct hardfiledata *hfd, void *buffer, uae_u64 offset, int len) +{ + int result = 0; + + if (fseek (hfd->fd, offset, SEEK_SET) != 0) + return 0; + do { + int t = fread (buffer, 1, len, hfd->fd); + result += t; + len -= t; + if (t == 0) + return result; + } while (len > 0); + return result; +} + +int hdf_write (struct hardfiledata *hfd, void *buffer, uae_u64 offset, int len) +{ + int result = 0; + + if (fseek (hfd->fd, offset, SEEK_SET) != 0) + return 0; + do { + int t = fwrite (buffer, 1, len, hfd->fd); + result += t; + len -= t; + if (t == 0) + return result; + } while (len > 0); + return result; +} + +static uae_u64 cmd_readx (struct hardfiledata *hfd, uae_u8 *dataptr, uae_u64 offset, uae_u64 len) +{ + return hdf_read (hfd, dataptr, offset, len); +} +static uae_u64 cmd_read (struct hardfiledata *hfd, uaecptr dataptr, uae_u64 offset, uae_u64 len) +{ + addrbank *bank_data = &get_mem_bank (dataptr); + if (!bank_data || !bank_data->check (dataptr, len)) + return 0; + return cmd_readx (hfd, bank_data->xlateaddr (dataptr), offset, len); +} +static uae_u64 cmd_writex (struct hardfiledata *hfd, uae_u8 *dataptr, uae_u64 offset, uae_u64 len) +{ + return hdf_write (hfd, dataptr, offset, len); +} + +static uae_u64 cmd_write (struct hardfiledata *hfd, uaecptr dataptr, uae_u64 offset, uae_u64 len) { - uaecptr tmp1 = m68k_areg(regs, 1); /* IOReq */ + addrbank *bank_data = &get_mem_bank (dataptr); + if (!bank_data || !bank_data->check (dataptr, len)) + return 0; + return cmd_writex (hfd, bank_data->xlateaddr (dataptr), offset, len); +} + +static uae_u32 hardfile_open (TrapContext *dummy) +{ + 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_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 */ @@ -41,103 +134,95 @@ static uae_u32 hardfile_open (void) return (uae_u32)-1; } -static uae_u32 hardfile_close (void) +static uae_u32 hardfile_close (TrapContext *dummy) { opencount--; - put_word (m68k_areg(regs, 6) + 32, get_word (m68k_areg(regs, 6) + 32) - 1); + put_word (m68k_areg (regs, 6) + 32, get_word (m68k_areg (regs, 6) + 32) - 1); return 0; } -static uae_u32 hardfile_expunge (void) +static uae_u32 hardfile_expunge (TrapContext *dummy) { return 0; /* Simply ignore this one... */ } -static uae_u32 hardfile_beginio (void) +static uae_u32 hardfile_beginio (TrapContext *dummy) { - uae_u32 tmp1, tmp2, dataptr, offset; - uae_u32 retval = m68k_dreg(regs, 0); + uae_u32 request, len, dataptr, offset, actual = 0, cmd; + uae_u32 retval = m68k_dreg (regs, 0); int unit; struct hardfiledata *hfd; - tmp1 = m68k_areg(regs, 1); - unit = get_long (tmp1 + 24); + request = m68k_areg (regs, 1); + unit = get_long (request + 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)); + printf ("hardfile: request = %08lx\n", (unsigned long)request); + printf ("hardfile: cmd = %d\n", (int)get_word (request + 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) { + put_byte (request + 8, NT_MESSAGE); + put_byte (request + 31, 0); /* no error yet */ + cmd = get_word (request + 28); /* io_Command */ +/* put_byte (request + 30, get_byte (request + 30) & ~1);*/ + dataptr = get_long (request + 40); + + switch (cmd) { case CMD_READ: - dataptr = get_long (tmp1 + 40); if (dataptr & 1) goto bad_command; - offset = get_long (tmp1 + 44); + offset = get_long (request + 44); if (offset & 511) goto bad_command; - tmp2 = get_long (tmp1 + 36); /* io_Length */ - if (tmp2 & 511) + len = get_long (request + 36); /* io_Length */ + if (len & 511) goto bad_command; - if (tmp2 + offset > (uae_u32)hfd->size) + if (len + 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]; - fread (buffer, 1, 512, hfd->fd); - for (i = 0; i < 512; i++, dataptr++) - put_byte(dataptr, buffer[i]); - tmp2 -= 512; - } + actual = (uae_u32)cmd_read (hfd, dataptr, offset, len); + put_long (request + 32, actual); break; case CMD_WRITE: - case 11: /* Format */ - dataptr = get_long (tmp1 + 40); + case CMD_FORMAT: if (dataptr & 1) goto bad_command; - offset = get_long (tmp1 + 44); + offset = get_long (request + 44); if (offset & 511) goto bad_command; - tmp2 = get_long (tmp1 + 36); /* io_Length */ - if (tmp2 & 511) + len = get_long (request + 36); /* io_Length */ + if (len & 511) goto bad_command; - if (tmp2 + offset > (uae_u32)hfd->size) + if (len + 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; - } + actual = (uae_u32)cmd_write (hfd, dataptr, offset, len); + put_long (request + 32, actual); /* set io_Actual */ break; bad_command: break; - case 18: /* GetDriveType */ + case NSCMD_DEVICEQUERY: + put_long (dataptr + 4, 16); /* size */ + put_word (dataptr + 8, 5); /* NSDEVTYPE_TRACKDISK */ + put_word (dataptr + 10, 0); + put_long (dataptr + 12, nscmd_cmd); + put_long (request + 32, 16); + break; + + case CMD_GETDRIVETYPE: printf ("Shouldn't happen\n"); - put_long (tmp1 + 32, 1); /* not exactly a 3.5" drive, but... */ + put_long (request + 32, 1); /* not exactly a 3.5" drive, but... */ break; - case 19: /* GetNumTracks */ + case CMD_GETNUMTRACKS: printf ("Shouldn't happen 2\n"); - put_long (tmp1 + 32, 0); + put_long (request + 32, 0); break; /* Some commands that just do nothing and return zero */ @@ -151,27 +236,27 @@ static uae_u32 hardfile_beginio (void) case 15: /* ProtStatus */ case 20: /* AddChangeInt */ case 21: /* RemChangeInt */ - put_long (tmp1+32, 0); /* io_Actual */ + put_long (request + 32, 0); /* io_Actual */ retval = 0; break; default: /* Command not understood. */ - put_byte (tmp1+31, (uae_u8)-3); /* io_Error */ + put_byte (request + 31, (uae_u8)-3); /* io_Error */ retval = 0; break; } #if 0 - if ((get_byte (tmp1+30) & 1) == 0) { + if ((get_byte (request + 30) & 1) == 0) { /* Not IOF_QUICK -- need to ReplyMsg */ - m68k_areg(regs, 1) = tmp1; - CallLib (get_long(4), -378); + m68k_areg (regs, 1) = request; + CallLib (get_long (4), -378); } #endif return retval; } -static uae_u32 hardfile_abortio (void) +static uae_u32 hardfile_abortio (TrapContext *dummy) { return (uae_u32)-3; } @@ -185,6 +270,23 @@ void hardfile_install (void) ROM_hardfile_resname = ds ("uaehf.device"); ROM_hardfile_resid = ds ("UAE hardfile.device 0.2"); + nscmd_cmd = here (); + dw (CMD_READ); + dw (CMD_WRITE); + dw (CMD_FORMAT); + dw (NSCMD_DEVICEQUERY); + dw (CMD_GETDRIVETYPE); + dw (CMD_CLEAR); + dw (CMD_UPDATE); + dw (CMD_MOTOR); + dw (CMD_SEEK); + dw (CMD_CHANGENUM); + dw (CMD_CHANGESTATE); + dw (CMD_PROTSTATUS); + dw (CMD_ADDCHANGEINT); + dw (CMD_REMCHANGEINT); + dw (0); + /* initcode */ #if 0 initcode = here ();