From: Toni Wilen Date: Mon, 21 Jan 2013 18:19:32 +0000 (+0200) Subject: 2600b3 X-Git-Tag: 2600~18 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=4e9a4a7613b79762af1c11048b1d58ed94d6de8f;p=francis%2Fwinuae.git 2600b3 --- diff --git a/blkdev_cdimage.cpp b/blkdev_cdimage.cpp index ffdbfafe..f1bdfcf0 100644 --- a/blkdev_cdimage.cpp +++ b/blkdev_cdimage.cpp @@ -1756,7 +1756,9 @@ static int open_device (int unitnum, const TCHAR *ident, int flags) if (!cdu->open) { uae_sem_init (&cdu->sub_sem, 0, 1); - _tcscpy (cdu->imgname, ident); + cdu->imgname[0] = 0; + if (ident) + _tcscpy (cdu->imgname, ident); parse_image (cdu, ident); cdu->open = true; cdu->enabled = true; @@ -1770,7 +1772,7 @@ static int open_device (int unitnum, const TCHAR *ident, int flags) } ret = 1; } - blkdev_cd_change (unitnum, currprefs.cdslots[unitnum].name); + blkdev_cd_change (unitnum, cdu->imgname); return ret; } @@ -1792,7 +1794,7 @@ static void close_device (int unitnum) unload_image (cdu); uae_sem_destroy (&cdu->sub_sem); } - blkdev_cd_change (unitnum, currprefs.cdslots[unitnum].name); + blkdev_cd_change (unitnum, cdu->imgname); } static void close_bus (void) diff --git a/custom.cpp b/custom.cpp index 0aec4b1d..ff6b2253 100644 --- a/custom.cpp +++ b/custom.cpp @@ -639,8 +639,9 @@ STATIC_INLINE int GET_PLANES_LIMIT (uae_u16 bc0) } /* The HRM says 0xD8, but that can't work... */ -#define HARD_DDF_STOP 0xd4 -#define HARD_DDF_START 0x18 +#define HARD_DDF_STOP ((beamcon0 & 0x80) ? 0xff : 0xd4) +#define HARD_DDF_START_REAL 0x18 +#define HARD_DDF_START ((beamcon0 & 0x80) ? 0x10 : 0x18) static void add_modulos (void) { @@ -839,7 +840,7 @@ static int delayoffset; STATIC_INLINE void compute_delay_offset (void) { - delayoffset = (16 << fetchmode) - (((plfstrt - HARD_DDF_START) & fetchstart_mask) << 1); + delayoffset = (16 << fetchmode) - (((plfstrt - HARD_DDF_START_REAL) & fetchstart_mask) << 1); #if 0 /* maybe we can finally get rid of this stupid table.. */ if (tmp == 4) diff --git a/debug.cpp b/debug.cpp index 42c74411..04d3eb5f 100644 --- a/debug.cpp +++ b/debug.cpp @@ -188,7 +188,7 @@ uae_u32 get_byte_debug (uaecptr addr) regs.s = (debug_mmu_mode & 4) != 0; TRY(p) { if (currprefs.mmu_model == 68030) { - v = mmu030_get_byte (addr, debug_mmu_mode); + v = mmu030_get_generic (addr, debug_mmu_mode, sz_byte, sz_byte, 0); } else { v = mmu_get_user_byte (addr, regs.s != 0, (debug_mmu_mode & 1) ? true : false, false, sz_byte); } @@ -208,7 +208,7 @@ uae_u32 get_word_debug (uaecptr addr) regs.s = (debug_mmu_mode & 4) != 0; TRY(p) { if (currprefs.mmu_model == 68030) { - v = mmu030_get_word (addr, debug_mmu_mode); + v = mmu030_get_generic (addr, debug_mmu_mode, sz_word, sz_word, 0); } else { v = mmu_get_user_word (addr, regs.s != 0, (debug_mmu_mode & 1) ? true : false, false, sz_word); } @@ -228,7 +228,7 @@ uae_u32 get_long_debug (uaecptr addr) regs.s = (debug_mmu_mode & 4) != 0; TRY(p) { if (currprefs.mmu_model == 68030) { - v = mmu030_get_long (addr, debug_mmu_mode); + v = mmu030_get_generic (addr, debug_mmu_mode, sz_long, sz_long, 0); } else { v = mmu_get_user_long (addr, regs.s != 0, (debug_mmu_mode & 1) ? true : false, false, sz_long); } diff --git a/gayle.cpp b/gayle.cpp index a9671e37..1ab5c783 100644 --- a/gayle.cpp +++ b/gayle.cpp @@ -199,6 +199,7 @@ struct ide_hdf int ide_drv; bool atapi; + bool atapi_drdy; int cd_unit_num; int packet_cnt; int packet_data_size; @@ -280,10 +281,8 @@ static uae_u8 checkgayleideirq (void) if (!idedrive) return 0; for (i = 0; i < 2; i++) { - if (idedrive[i]->ide_drv == i) { - if (!(idedrive[i]->regs.ide_devcon & 2) && (idedrive[i]->irq || idedrive[i + 2]->irq)) - irq = true; - } + if (!(idedrive[i]->regs.ide_devcon & 2) && (idedrive[i]->irq || idedrive[i + 2]->irq)) + irq = true; /* IDE killer feature. Do not eat interrupt to make booting faster. */ if (idedrive[i]->irq && !isdrive (idedrive[i])) idedrive[i]->irq = 0; @@ -551,22 +550,35 @@ static void ide_identify_drive (void) } } -static void ide_execute_drive_diagnostics (bool irq) +static void set_signature (struct ide_hdf *ide) { - ide->regs.ide_error = 0x01; // device ok if (ide->atapi) { - ide->regs.ide_nsector = 1; ide->regs.ide_sector = 1; + ide->regs.ide_nsector = 1; ide->regs.ide_lcyl = 0x14; ide->regs.ide_hcyl = 0xeb; - ide->regs.ide_status = IDE_STATUS_BSY; + ide->regs.ide_status = 0; + ide->atapi_drdy = false; } else { ide->regs.ide_nsector = 1; ide->regs.ide_sector = 1; ide->regs.ide_lcyl = 0; ide->regs.ide_hcyl = 0; - ide->regs.ide_status = IDE_STATUS_BSY | IDE_STATUS_DRDY; + ide->regs.ide_status = 0; } + ide->regs.ide_error = 0x01; // device ok +} + +static void reset_device (bool both) +{ + set_signature (ide); + if (both) + set_signature (ide->pair); +} + +static void ide_execute_drive_diagnostics (bool irq) +{ + reset_device (irq); if (irq) ide_interrupt (); else @@ -779,7 +791,8 @@ static void atapi_packet (void) ide->data_size = 65534; ide->packet_data_size = (ide->data_size + 1) & ~1; ide->data_size = 12; - write_log (_T("ATAPI packet command\n")); + if (IDE_LOG > 1) + write_log (_T("ATAPI packet command\n")); ide->packet_cnt = 1; ide->data_multi = 1; ide->data_offset = 0; @@ -799,14 +812,18 @@ static void ide_do_command (uae_u8 cmd) if (ide->atapi) { + ide->atapi_drdy = true; if (cmd == 0x08) { /* device reset */ ide_execute_drive_diagnostics (true); } else if (cmd == 0xa1) { /* identify packet device */ ide_identify_drive (); } else if (cmd == 0xa0) { /* packet */ atapi_packet (); + } else if (cmd == 0x90) { /* execute drive diagnostics */ + ide_execute_drive_diagnostics (true); } else { ide_execute_drive_diagnostics (false); + ide->atapi_drdy = false; ide_fail (); write_log (_T("IDE%d: unknown ATAPI command 0x%02x\n"), ide->num, cmd); } @@ -1065,7 +1082,7 @@ static int get_gayle_ide_reg (uaecptr addr) addr &= ~0x400; } } - ide = idedrive[ide2 + (ide->ide_drv ? 1 : 0)]; + ide = idedrive[ide2 + idedrive[ide2]->ide_drv]; return addr; } @@ -1077,7 +1094,7 @@ static uae_u32 ide_read_reg (int ide_reg) if (ide->regs.ide_status & IDE_STATUS_BSY) ide_reg = IDE_STATUS; if (!isdrive (ide)) { - v = 0; + v = 0xff; goto end; } @@ -1137,52 +1154,68 @@ static uae_u32 ide_read_reg (int ide_reg) v |= IDE_STATUS_ERR; } else { v = ide->regs.ide_status; - if (!ide->atapi) + if (!ide->atapi || (ide->atapi && ide->atapi_drdy)) v |= IDE_STATUS_DRDY | IDE_STATUS_DSC; } break; } end: if (IDE_LOG > 2 && ide_reg > 0 && (1 || ide->num > 0)) - write_log (_T("IDE%d GET register %d->%02X\n"), ide->num, ide_reg, (uae_u32)v & 0xff); + write_log (_T("IDE%d GET register %d->%02X (%08X)\n"), ide->num, ide_reg, (uae_u32)v & 0xff, m68k_getpc ()); return v; } static void ide_write_reg (int ide_reg, uae_u32 val) { - ide->regs.ide_devcon &= ~0x80; /* clear HOB */ + ide->regs1->ide_devcon &= ~0x80; /* clear HOB */ + ide->regs0->ide_devcon &= ~0x80; /* clear HOB */ if (IDE_LOG > 2 && ide_reg > 0 && (1 || ide->num > 0)) - write_log (_T("IDE%d PUT register %d=%02X\n"), ide->num, ide_reg, (uae_u32)val & 0xff); + write_log (_T("IDE%d PUT register %d=%02X (%08X)\n"), ide->num, ide_reg, (uae_u32)val & 0xff, m68k_getpc ()); + switch (ide_reg) { case IDE_DRVADDR: break; case IDE_DEVCON: - if ((ide->regs.ide_devcon & 4) == 0 && (val & 4) != 0) - ide_execute_drive_diagnostics (false); - ide->regs.ide_devcon = val; + if ((ide->regs.ide_devcon & 4) == 0 && (val & 4) != 0) { + reset_device (true); + if (IDE_LOG > 1) + write_log (_T("IDE%d: SRST\n"), ide->num); + } + ide->regs0->ide_devcon = val; + ide->regs1->ide_devcon = val; break; case IDE_DATA: break; case IDE_ERROR: - ide->regs.ide_feat2 = ide->regs.ide_feat; - ide->regs.ide_feat = val; + ide->regs0->ide_feat2 = ide->regs0->ide_feat; + ide->regs0->ide_feat = val; + ide->regs1->ide_feat2 = ide->regs1->ide_feat; + ide->regs1->ide_feat = val; break; case IDE_NSECTOR: - ide->regs.ide_nsector2 = ide->regs.ide_nsector; - ide->regs.ide_nsector = val; + ide->regs0->ide_nsector2 = ide->regs0->ide_nsector; + ide->regs0->ide_nsector = val; + ide->regs1->ide_nsector2 = ide->regs1->ide_nsector; + ide->regs1->ide_nsector = val; break; case IDE_SECTOR: - ide->regs.ide_sector2 = ide->regs.ide_sector; - ide->regs.ide_sector = val; + ide->regs0->ide_sector2 = ide->regs0->ide_sector; + ide->regs0->ide_sector = val; + ide->regs1->ide_sector2 = ide->regs1->ide_sector; + ide->regs1->ide_sector = val; break; case IDE_LCYL: - ide->regs.ide_lcyl2 = ide->regs.ide_lcyl; - ide->regs.ide_lcyl = val; + ide->regs0->ide_lcyl2 = ide->regs0->ide_lcyl; + ide->regs0->ide_lcyl = val; + ide->regs1->ide_lcyl2 = ide->regs1->ide_lcyl; + ide->regs1->ide_lcyl = val; break; case IDE_HCYL: - ide->regs.ide_hcyl2 = ide->regs.ide_hcyl; - ide->regs.ide_hcyl = val; + ide->regs0->ide_hcyl2 = ide->regs0->ide_hcyl; + ide->regs0->ide_hcyl = val; + ide->regs1->ide_hcyl2 = ide->regs1->ide_hcyl; + ide->regs1->ide_hcyl = val; break; case IDE_SELECT: ide->regs0->ide_select = val; @@ -2511,13 +2544,13 @@ static void initide (void) ide->regs0 = &ide->regs; ide->regs1 = &idedrive[i * 2 + 1]->regs; ide->pair = idedrive[i * 2 + 1]; - ide_execute_drive_diagnostics (false); ide = idedrive[i * 2 + 1]; ide->regs1 = &ide->regs; ide->regs0 = &idedrive[i * 2 + 0]->regs; ide->pair = idedrive[i * 2 + 0]; - ide_execute_drive_diagnostics (false); + + reset_device (true); } ide_splitter = 0; if (isdrive (idedrive[2]) || isdrive(idedrive[3])) { diff --git a/include/cpummu030.h b/include/cpummu030.h index 0ae8b857..13ce038a 100644 --- a/include/cpummu030.h +++ b/include/cpummu030.h @@ -86,6 +86,8 @@ uae_u8 mmu030_get_byte(uaecptr addr, uae_u32 fc); uae_u32 uae_mmu030_get_rmw(uaecptr addr, int size); void uae_mmu030_put_rmw(uaecptr addr, uae_u32 val, int size); +uae_u32 mmu030_get_generic(uaecptr addr, uae_u32 fc, int size, int accesssize, int flags); + extern uae_u16 REGPARAM3 mmu030_get_word_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM; extern uae_u32 REGPARAM3 mmu030_get_long_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM; extern uae_u16 REGPARAM3 mmu030_get_rmw_word_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM; diff --git a/newcpu.cpp b/newcpu.cpp index 376ba923..276dd07a 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -4989,8 +4989,8 @@ static void disasm_size (TCHAR *instrname, struct instr *dp) void m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr, int safemode) { - uae_u32 seaddr2 = 0; - uae_u32 deaddr2 = 0; + uae_u32 seaddr2; + uae_u32 deaddr2; if (buf) memset (buf, 0, bufsize * sizeof (TCHAR)); @@ -5006,6 +5006,7 @@ void m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int cn uaecptr m68kpc_illg = 0; bool illegal = false; + seaddr2 = deaddr2 = 0; oldpc = pc; opcode = get_word_debug (pc); if (cpufunctbl[opcode] == op_illg_1 || cpufunctbl[opcode] == op_unimpl_1) { diff --git a/od-win32/win32.h b/od-win32/win32.h index b962759d..354145e0 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -19,11 +19,11 @@ #define LANG_DLL 1 #if WINUAEPUBLICBETA -#define WINUAEBETA _T("2") +#define WINUAEBETA _T("3") #else #define WINUAEBETA _T("") #endif -#define WINUAEDATE MAKEBD(2013, 1, 20) +#define WINUAEDATE MAKEBD(2013, 1, 21) #define WINUAEEXTRA _T("") //#define WINUAEEXTRA _T("AmiKit Preview") #define WINUAEREV _T("") diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 46e17d2f..1585d8a3 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -1,6 +1,13 @@ - restore only single input target to default. +Beta 3: + +- Programmed display modes disable normal DMA start/end display limits. (NetBSD AGA console screen) +- ATAPI CD emulation compatibility improved, should fix detection problems. +- IDE HD emulation returned corrupt data if 2 drives enabled at the same time (b2). +- CD image mounter crashed if CD image selection was empty. (b2) + Beta 2: - 030/040/060 MMU TAS and CAS/CAS2 Read-Modify-Write cycle special handling emulated, RMW read access