]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
2600b3
authorToni Wilen <twilen@winuae.net>
Mon, 21 Jan 2013 18:19:32 +0000 (20:19 +0200)
committerToni Wilen <twilen@winuae.net>
Mon, 21 Jan 2013 18:19:32 +0000 (20:19 +0200)
blkdev_cdimage.cpp
custom.cpp
debug.cpp
gayle.cpp
include/cpummu030.h
newcpu.cpp
od-win32/win32.h
od-win32/winuaechangelog.txt

index ffdbfafe233e3047e67784d61b9009569ff621f0..f1bdfcf001b52c9cc278aeca309e8a33ff2afbb0 100644 (file)
@@ -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)
index 0aec4b1dc9cef3c03c11746c0b28ac8e30ef5e2f..ff6b225328d2531952dddb071f3bf23690e7dc15 100644 (file)
@@ -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)
index 42c74411b112ab83b62dd43c442a7183e5ef50bc..04d3eb5f2dbb2c0625d7f60a5dc6d29ff82c2dd3 100644 (file)
--- 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);
                        }
index a9671e3786937a7145ac1f836d2dc229ea48f071..1ab5c783a76d122bdec28345c60a487f9c00d6a7 100644 (file)
--- 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])) {
index 0ae8b857c95b9b58edb2fbc25aa4fcee94016603..13ce038ab731c8fb90e0613a8e479a8cf4478f51 100644 (file)
@@ -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;
index 376ba9239154db07977ab106b83e6e07a489f360..276dd07af6f91fe7f84510cf4ac1a56d90ffff68 100644 (file)
@@ -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) {
index b962759d2a492477a2c958499bc8670328b1f8ca..354145e0de17fdd0c6dc7346cc13bd07d372d5ca 100644 (file)
 #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("")
index 46e17d2fa068628b0e777d6887594af5d9de24ab..1585d8a3fa774ce9c675cea08b2c13f5e76d12ed 100644 (file)
@@ -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