]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
2710b8
authorToni Wilen <twilen@winuae.net>
Sun, 16 Feb 2014 13:50:15 +0000 (15:50 +0200)
committerToni Wilen <twilen@winuae.net>
Sun, 16 Feb 2014 13:50:15 +0000 (15:50 +0200)
37 files changed:
a2091.cpp
blitter.cpp
blkdev_cdimage.cpp
cdtv.cpp
cfgfile.cpp
cpummu30.cpp
custom.cpp
drawing.cpp
expansion.cpp
filesys.cpp
fpp.cpp
gayle.cpp
gencpu.cpp
hardfile.cpp
include/cpu_prefetch.h
include/cpummu030.h
include/gayle.h
include/inputdevice.h
include/newcpu.h
include/options.h
include/rommgr.h
inputdevice.cpp
jit/compemu_support.cpp
memory.cpp
ncr_scsi.cpp
newcpu.cpp
od-win32/debug_win32.cpp
od-win32/dinput.cpp
od-win32/hardfile_win32.cpp
od-win32/md-fpp.h
od-win32/mman.cpp
od-win32/resources/winuae.rc
od-win32/sysconfig.h
od-win32/win32.h
od-win32/win32gui.cpp
rommgr.cpp
scsi.cpp

index 675f3a1578b6648707979e1ee2fdd7d0891a186a..77d73fb50a6a7eb6565758fdba467ae0375f5f9e 100644 (file)
--- a/a2091.cpp
+++ b/a2091.cpp
@@ -299,7 +299,7 @@ static void doscsistatus (uae_u8 status)
                cdtv_scsi_int ();
                return;
        }
-       if (!currprefs.cs_a2091 && currprefs.cs_mbdmac != 1)
+       if (!currprefs.a2091 && currprefs.cs_mbdmac != 1)
                return;
        INT2();
 #if A2091_DEBUG > 2 || A3000_DEBUG > 2
@@ -1320,8 +1320,10 @@ static int REGPARAM2 dmac_check (uaecptr addr, uae_u32 size)
 
 static uae_u8 *REGPARAM2 dmac_xlate (uaecptr addr)
 {
-       addr &= rom_mask;
+       addr &= 0xffff;
        addr += rombank * rom_size;
+       if (addr >= 0x8000)
+               addr = 0x8000;
        return rom + addr;
 }
 
@@ -1811,9 +1813,9 @@ void a2091_reset (void)
 
 void a2091_init (void)
 {
-       int roms[5];
+       int roms[6];
+       int slotsize;
        struct romlist *rl;
-       struct romdata *rd;
 
        init_scsi ();
        configured = 0;
@@ -1833,50 +1835,46 @@ void a2091_init (void)
        ew (0x20, 0x00); /* ser.no. Byte 2 */
        ew (0x24, 0x00); /* ser.no. Byte 3 */
 
-#if 1
        roms[0] = 55; // 7.0
        roms[1] = 54; // 6.6
        roms[2] = 53; // 6.0
-       roms[3] = -1; //roms[3] = 56; // guru
-       roms[4] = -1;
-#else
-       roms[0] = 56; // guru
-       roms[1] = 55; // 7.0
-       roms[2] = 54; // 6.6
-       roms[3] = 53; // 6.0
-       roms[4] = -1;
-#endif
+       roms[3] = 56; // guru
+       roms[4] = 87;
+       roms[5] = -1;
 
        rombankswitcher = 0;
        rombank = 0;
-       struct zfile *z = read_rom_name (currprefs.a2091romfile);
-       if (!z) {
-               rl = getromlistbyids (roms);
-               if (rl) {
-                       rd = rl->rd; 
-                       z = read_rom (&rd);
+       slotsize = 65536;
+       rom = xmalloc (uae_u8, slotsize);
+       rom_size = 16384;
+       rom_mask = rom_size - 1;
+       if (_tcscmp (currprefs.a2091romfile, _T(":NOROM"))) {
+               struct zfile *z = read_rom_name (currprefs.a2091romfile);
+               if (!z) {
+                       rl = getromlistbyids (roms);
+                       if (rl) {
+                               z = read_rom (&rl->rd);
+                       }
                }
-       }
-       if (z) {
-               int slotsize = 65536;
-               write_log (_T("A590/A2091 BOOT ROM '%s'\n"), zfile_getname (z));
-               rom_size = rd->size;
-               rom = xmalloc (uae_u8, slotsize);
-               zfile_fread (rom, rom_size, 1, z);
-               zfile_fclose (z);
-               if (rl->rd->id == 56) {
-                       rombankswitcher = 1;
-                       for (int i = rom_size - 1; i >= 0; i--) {
-                               rom[i * 2 + 0] = rom[i];
-                               rom[i * 2 + 1] = 0xff;
+               if (z) {
+                       write_log (_T("A590/A2091 BOOT ROM '%s'\n"), zfile_getname (z));
+                       rom_size = zfile_size (z);
+                       zfile_fread (rom, rom_size, 1, z);
+                       zfile_fclose (z);
+                       if (rom_size == 32768) {
+                               rombankswitcher = 1;
+                               for (int i = rom_size - 1; i >= 0; i--) {
+                                       rom[i * 2 + 0] = rom[i];
+                                       rom[i * 2 + 1] = 0xff;
+                               }
+                       } else {
+                               for (int i = 1; i < slotsize / rom_size; i++)
+                                       memcpy (rom + i * rom_size, rom, rom_size);
                        }
+                       rom_mask = rom_size - 1;
                } else {
-                       for (int i = 1; i < slotsize / rom_size; i++)
-                               memcpy (rom + i * rom_size, rom, rom_size);
+                       romwarning (roms);
                }
-               rom_mask = rom_size - 1;
-       } else {
-               romwarning (roms);
        }
        map_banks (&dmaca2091_bank, 0xe80000 >> 16, 0x10000 >> 16, 0x10000);
 }
@@ -1885,7 +1883,7 @@ uae_u8 *save_scsi_dmac (int *len, uae_u8 *dstptr)
 {
        uae_u8 *dstbak, *dst;
        
-       if (!currprefs.cs_a2091 && !currprefs.cs_mbdmac)
+       if (!currprefs.a2091 && !currprefs.cs_mbdmac)
                return NULL;
        if (dstptr)
                dstbak = dst = dstptr;
index ba30152b48e71a761f03ea6cb81786984d485e56..c99cf03245380f5462ec1a1c24f8df07da91af56 100644 (file)
@@ -424,7 +424,7 @@ static void blitter_done (int hpos)
 
 STATIC_INLINE void chipmem_agnus_wput2 (uaecptr addr, uae_u32 w)
 {
-       last_custom_value1 = w;
+       //last_custom_value1 = w; blitter writes are not stored
        if (!(log_blitter & 4)) {
                chipmem_wput_indirect (addr, w);
                debug_wputpeekdma_chipram (addr, w, 0x000);
@@ -649,7 +649,7 @@ STATIC_INLINE void blitter_write (void)
        if (bltcon0 & 0x200) {
                if (!dmaen (DMA_BLITTER))
                        return;
-               last_custom_value1 = blt_info.bltddat;
+               //last_custom_value1 = blt_info.bltddat; blitter writes are not stored
                chipmem_wput_indirect (bltdpt, blt_info.bltddat);
                debug_wputpeekdma_chipram (bltdpt, blt_info.bltddat, 0x000);
        }
@@ -963,7 +963,7 @@ STATIC_INLINE void blitter_doddma (int hpos)
                return;
        }
        record_dma_blit (0x00, d, bltdpt, hpos);
-       last_custom_value1 = d;
+       //last_custom_value1 = d; blitter writes are not stored
        chipmem_agnus_wput2 (bltdpt, d);
        alloc_cycle_blitter (hpos, &bltdpt, 4);
        bltdpt += blit_add;
index 84e0edf39f490fe44acad4924dd0fcbe748a7a07..9a75331b3fa22dd33e4fe5c451fad9a645e35b80 100644 (file)
@@ -92,6 +92,7 @@ struct cdunit {
        play_subchannel_callback cdda_subfunc;
        play_status_callback cdda_statusfunc;
        int cdda_delay, cdda_delay_frames;
+       bool thread_active;
 
        TCHAR imgname[MAX_DPATH];
        uae_sem_t sub_sem;
@@ -415,6 +416,8 @@ static void *cdda_play_func (void *v)
        struct cdunit *cdu = (struct cdunit*)v;
        int oldtrack = -1;
 
+       cdu->thread_active = true;
+
        while (cdu->cdda_play == 0)
                Sleep (10);
        oldplay = -1;
@@ -530,7 +533,7 @@ static void *cdda_play_func (void *v)
 
                        memset (cda->buffers[bufnum], 0, num_sectors * 2352);
 
-                       for (cnt = 0; cnt < num_sectors; cnt++) {
+                       for (cnt = 0; cnt < num_sectors && cdu->cdda_play > 0; cnt++) {
                                uae_u8 *dst = cda->buffers[bufnum] + cnt * 2352;
                                uae_u8 subbuf[SUB_CHANNEL_SIZE];
                                sector = cdda_pos;
@@ -609,12 +612,14 @@ static void *cdda_play_func (void *v)
                        bufon[bufnum] = 1;
                        cda->setvolume (currprefs.sound_volume_cd >= 0 ? currprefs.sound_volume_cd : currprefs.sound_volume, cdu->cdda_volume[0], cdu->cdda_volume[1]);
                        if (!cda->play (bufnum)) {
-                               setstate (cdu, AUDIO_STATUS_PLAY_ERROR);
+                               if (cdu->cdda_play > 0)
+                                       setstate (cdu, AUDIO_STATUS_PLAY_ERROR);
                                goto end;
                        }
 
                        if (dofinish) {
-                               setstate (cdu, AUDIO_STATUS_PLAY_COMPLETE);
+                               if (cdu->cdda_play >= 0)
+                                       setstate (cdu, AUDIO_STATUS_PLAY_COMPLETE);
                                cdu->cdda_play = -1;
                                cdda_pos = cdu->cdda_end + 1;
                        }
@@ -640,6 +645,7 @@ end:
 
        cdu->cdda_play = 0;
        write_log (_T("IMAGE CDDA: thread killed\n"));
+       cdu->thread_active = false;
        return NULL;
 }
 
@@ -648,9 +654,10 @@ static void cdda_stop (struct cdunit *cdu)
 {
        if (cdu->cdda_play != 0) {
                cdu->cdda_play = -1;
-               while (cdu->cdda_play) {
+               while (cdu->cdda_play && cdu->thread_active) {
                        Sleep (10);
                }
+               cdu->cdda_play = 0;
        }
        cdu->cdda_paused = 0;
        cdu->cdda_play_state = 0;
@@ -682,6 +689,12 @@ static int command_play (int unitnum, int startlsn, int endlsn, int scan, play_s
        struct cdunit *cdu = unitisopen (unitnum);
        if (!cdu)
                return 0;
+       if (cdu->cdda_play) {
+               cdu->cdda_play = -1;
+               while (cdu->thread_active)
+                       Sleep (10);
+               cdu->cdda_play = 0;
+       }
        cdu->cd_last_pos = startlsn;
        cdu->cdda_start = startlsn;
        cdu->cdda_end = endlsn;
@@ -695,8 +708,11 @@ static int command_play (int unitnum, int startlsn, int endlsn, int scan, play_s
                setstate (cdu, AUDIO_STATUS_PLAY_ERROR);
                return 0;
        }
-       if (!cdu->cdda_play)
+       if (!cdu->thread_active) {
                uae_start_thread (_T("cdimage_cdda_play"), cdda_play_func, cdu, NULL);
+               while (!cdu->thread_active)
+                       Sleep (10);
+       }
        cdu->cdda_play++;
        return 1;
 }
index aa0ad07e87ef87f2348c1e118e34c893a92c0f59..3ad345ef9c50d2d4db45b1ddec380c38e310d924 100644 (file)
--- a/cdtv.cpp
+++ b/cdtv.cpp
@@ -1140,6 +1140,7 @@ void CDTV_hsync_handler (void)
                cd_finished = 1;
                cd_paused = 0;
                //cd_error = 1;
+               write_log (_T("audio finished\n"));
                activate_stch = 1;
        }
 
index cad40599f77d71b7d3dcf921d76c49b09de2b637..aa5c5e25c92bdd0cb7d4363fab4b48cd6291164e 100644 (file)
@@ -1312,8 +1312,8 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
        cfgfile_dwrite (f, _T("ramsey"), _T("%d"), p->cs_ramseyrev);
        cfgfile_dwrite_bool (f, _T("pcmcia"), p->cs_pcmcia);
        cfgfile_dwrite_bool (f, _T("scsi_cdtv"), p->cs_cdtvscsi);
-       cfgfile_dwrite_bool (f, _T("scsi_a2091"), p->cs_a2091);
-       cfgfile_dwrite_bool (f, _T("scsi_a4091"), p->cs_a4091);
+       cfgfile_dwrite_bool (f, _T("scsi_a2091"), p->a2091);
+       cfgfile_dwrite_bool (f, _T("scsi_a4091"), p->a4091);
        cfgfile_dwrite_bool (f, _T("scsi_a3000"), p->cs_mbdmac == 1);
        cfgfile_dwrite_bool (f, _T("scsi_a4000t"), p->cs_mbdmac == 2);
        cfgfile_dwrite_bool (f, _T("bogomem_fast"), p->cs_slowmemisfast);
@@ -1602,8 +1602,6 @@ int cfgfile_rom (const TCHAR *option, const TCHAR *value, const TCHAR *name, TCH
        TCHAR id[MAX_DPATH];
        if (!cfgfile_string (option, value, name, id, sizeof id / sizeof (TCHAR)))
                return 0;
-       if (zfile_exists (location))
-               return 1;
        TCHAR *p = _tcschr (id, ',');
        if (p) {
                TCHAR *endptr, tmp;
@@ -1613,8 +1611,15 @@ int cfgfile_rom (const TCHAR *option, const TCHAR *value, const TCHAR *name, TCH
                uae_u32 crc32 = _tcstol (id, &endptr, 16) << 16;
                id[4] = tmp;
                crc32 |= _tcstol (id + 4, &endptr, 16);
-               struct romdata *rd = getromdatabycrc (crc32);
+               struct romdata *rd = getromdatabycrc (crc32, true);
                if (rd) {
+                       struct romdata *rd2 = getromdatabyid (rd->id);
+                       if (rd->group == 0 && rd2 == rd) {
+                               if (zfile_exists (location))
+                                       return 1;
+                       }
+                       if (rd->group && rd2)
+                               rd = rd2;
                        struct romlist *rl = getromlistbyromdata (rd);
                        if (rl) {
                                write_log (_T("%s: %s -> %s\n"), name, location, rl->path);
@@ -3260,8 +3265,8 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH
                || cfgfile_yesno (option, value, _T("a1000ram"), &p->cs_a1000ram)
                || cfgfile_yesno (option, value, _T("pcmcia"), &p->cs_pcmcia)
                || cfgfile_yesno (option, value, _T("scsi_cdtv"), &p->cs_cdtvscsi)
-               || cfgfile_yesno (option, value, _T("scsi_a4091"), &p->cs_a4091)
-               || cfgfile_yesno (option, value, _T("scsi_a2091"), &p->cs_a2091)
+               || cfgfile_yesno (option, value, _T("scsi_a4091"), &p->a4091)
+               || cfgfile_yesno (option, value, _T("scsi_a2091"), &p->a2091)
                || cfgfile_yesno (option, value, _T("cia_overlay"), &p->cs_ciaoverlay)
                || cfgfile_yesno (option, value, _T("bogomem_fast"), &p->cs_slowmemisfast)
                || cfgfile_yesno (option, value, _T("ksmirror_e0"), &p->cs_ksmirror_e0)
@@ -5025,8 +5030,8 @@ void default_prefs (struct uae_prefs *p, int type)
        p->cs_agnusrev = -1;
        p->cs_deniserev = -1;
        p->cs_mbdmac = 0;
-       p->cs_a2091 = 0;
-       p->cs_a4091 = 0;
+       p->a2091 = 0;
+       p->a4091 = 0;
        p->cs_cd32c2p = p->cs_cd32cd = p->cs_cd32nvram = false;
        p->cs_cdtvcd = p->cs_cdtvram = false;
        p->cs_cdtvcard = 0;
@@ -5275,8 +5280,8 @@ static void buildin_default_prefs (struct uae_prefs *p)
        p->cs_agnusrev = -1;
        p->cs_deniserev = -1;
        p->cs_mbdmac = 0;
-       p->cs_a2091 = false;
-       p->cs_a4091 = false;
+       p->a2091 = false;
+       p->a4091 = false;
        p->cs_cd32c2p = p->cs_cd32cd = p->cs_cd32nvram = false;
        p->cs_cdtvcd = p->cs_cdtvram = p->cs_cdtvcard = false;
        p->cs_ide = 0;
@@ -5802,7 +5807,6 @@ int built_in_chipset_prefs (struct uae_prefs *p)
        p->cs_a1000ram = 0;
        p->cs_cd32c2p = p->cs_cd32cd = p->cs_cd32nvram = 0;
        p->cs_cdtvcd = p->cs_cdtvram = p->cs_cdtvscsi = 0;
-       p->cs_a2091 = p->cs_a4091 = 0;
        p->cs_fatgaryrev = -1;
        p->cs_ide = 0;
        p->cs_ramseyrev = -1;
index 782ecf20f82446a84be481237e69418020e165c1..b84affc1fc495b2c02d255676df7f1aa6568491f 100644 (file)
@@ -63,6 +63,7 @@ int mmu030_opcode_stageb;
 uae_u16 mmu030_state[3];
 uae_u32 mmu030_data_buffer;
 uae_u32 mmu030_disp_store[2];
+uae_u32 mmu030_fmovem_store[2];
 struct mmu030_access mmu030_ad[MAX_MMU030_ACCESS];
 
 /* for debugging messages */
@@ -640,7 +641,7 @@ int mmu030_do_match_lrmw_ttr(uae_u32 tt, TT_info comp, uaecptr addr, uae_u32 fc)
             /* Compare actual address with address base using mask */
             if ((comp.addr_base&comp.addr_mask)==(addr&comp.addr_mask)) {
                 
-                               return TT_NO_READ; /* TODO: check this! */
+                               return TT_OK_MATCH;
             }
                }
        }
@@ -2177,7 +2178,10 @@ void m68k_do_rte_mmu030 (uaecptr a7)
        mmu030_state[2] = get_word_mmu030 (a7 + 0x34);
        mmu030_disp_store[0] = get_long_mmu030 (a7 + 0x1c);
        mmu030_disp_store[1] = get_long_mmu030 (a7 + 0x1c + 4);
-
+       if (mmu030_state[1] & MMU030_STATEFLAG1_FMOVEM) {
+               mmu030_fmovem_store[0] = get_long_mmu030 (a7 + 0x5c - (7 + 1) * 4);
+               mmu030_fmovem_store[1] = get_long_mmu030 (a7 + 0x5c - (8 + 1) * 4);
+       }
        // Rerun "mmu030_opcode" using restored state.
        mmu030_retry = true;
 
index 51236152a5f3f0590c2510297a9a41295cf567ef..9af2acbbf349898dc9ccdb3213a035450e3d068f 100644 (file)
@@ -116,8 +116,6 @@ uae_u16 customhack_get (struct customhack *ch, int hpos)
 }
 #endif
 
-uae_u16 last_custom_value1;
-
 static unsigned int n_consecutive_skipped = 0;
 static unsigned int total_skipped = 0;
 
@@ -154,7 +152,6 @@ static bool genlockhtoggle;
 static bool genlockvtoggle;
 static bool graphicsbuffer_retry;
 
-
 #define LOF_TOGGLES_NEEDED 3
 //#define NLACE_CNT_NEEDED 50
 static int lof_togglecnt_lace, lof_togglecnt_nlace; //, nlace_cnt;
@@ -187,6 +184,7 @@ static uae_u16 cregs[256];
 uae_u16 intena, intreq;
 uae_u16 dmacon;
 uae_u16 adkcon; /* used by audio code */
+uae_u16 last_custom_value1;
 
 static uae_u32 cop1lc, cop2lc, copcon;
 
@@ -276,7 +274,7 @@ static unsigned int bplcon0d, bplcon0dd, bplcon0_res, bplcon0_planes, bplcon0_pl
 static unsigned int diwstrt, diwstop, diwhigh;
 static int diwhigh_written;
 static unsigned int ddfstrt, ddfstop, ddfstrt_old_hpos;
-static int ddf_change, badmode, diw_change;
+static int line_cyclebased, badmode, diw_change;
 static int bplcon1_fetch;
 
 /* The display and data fetch windows */
@@ -1124,7 +1122,7 @@ static void setup_fmodes (int hpos)
        if (isocs7planes ()) {
                toscr_nr_planes_agnus = 6;
        }
-       ddf_change = vpos;
+       line_cyclebased = vpos;
 }
 
 static void BPLCON0_Denise (int hpos, uae_u16 v, bool);
@@ -1159,7 +1157,7 @@ STATIC_INLINE void maybe_check (int hpos)
 
 static void bpldmainitdelay (int hpos)
 {
-       ddf_change = vpos;
+       line_cyclebased = vpos;
        if (hpos + BPLCON_AGNUS_DELAY < 0x14) {
                BPLCON0_Denise (hpos, bplcon0, false);
                setup_fmodes (hpos);
@@ -1232,7 +1230,7 @@ static void fetch_warn (int nr, int hpos)
        bitplane_line_crossing = hpos;
        warned--;
 #if 0
-       ddf_change = vpos;
+       line_cyclebased = vpos;
        corrupt_offset = (vpos ^ (timeframes << 12)) & 0xff00;
        for (int i = 0; i < bplcon0_planes_limit; i++) {
                uae_u16 v;
@@ -2348,7 +2346,7 @@ STATIC_INLINE void update_fetch (int until, int fm)
 
 #ifdef SPEEDUP
        /* Unrolled version of the for loop below.  */
-       if (plf_state < plf_wait_stop && ddf_change != vpos && ddf_change + 1 != vpos
+       if (plf_state < plf_wait_stop && line_cyclebased != vpos && line_cyclebased + 1 != vpos
                && dma
                && (fetch_cycle & fetchstart_mask) == (fm_maxplane & fetchstart_mask)
                && !badmode
@@ -2580,13 +2578,13 @@ STATIC_INLINE void decide_line (int hpos)
                // A1000 Agnus won't start bitplane DMA if vertical diw is zero.
                if (vpos > 0 || (vpos == 0 && !currprefs.cs_dipagnus)) {
                        diwstate = DIW_waiting_stop;
-                       ddf_change = vpos;
+                       line_cyclebased = vpos;
                }
        }
        // last line of field can never have bitplane dma active
        if (vpos == plflastline || cant_this_last_line ()) {
                diwstate = DIW_waiting_start;
-               ddf_change = vpos;
+               line_cyclebased = vpos;
        }
 
        if (hpos <= last_decide_line_hpos)
@@ -4387,7 +4385,7 @@ static void DMACON (int hpos, uae_u16 v)
        decide_fetch_safe (hpos);
 
        setclr (&dmacon, v);
-       dmacon &= 0x1FFF;
+       dmacon &= 0x07FF;
 
        changed = dmacon ^ oldcon;
 #if 0
@@ -4438,7 +4436,7 @@ static void DMACON (int hpos, uae_u16 v)
                audio_state_machine ();
 
        if (changed & (DMA_MASTER | DMA_BITPLANE)) {
-               ddf_change = vpos;
+               line_cyclebased = vpos;
 #if 0
                if (dmaen (DMA_BITPLANE)) {
                        if (vpos == 0xba)
@@ -4449,7 +4447,6 @@ static void DMACON (int hpos, uae_u16 v)
                }
 #endif
        }
-       events_schedule();
 }
 
 static int irq_nmi;
@@ -4710,7 +4707,7 @@ static void BPLxPTH (int hpos, uae_u16 v, int num)
                dbplpth[num] = (v << 16) & 0xffff0000;
                dbplpth_on[num] = hpos;
                dbplpth_on2++;
-               ddf_change = vpos;
+               line_cyclebased = vpos;
                return;
        }
 
@@ -4740,7 +4737,7 @@ static void BPLxPTL (int hpos, uae_u16 v, int num)
                dbplptl[num] = v & 0x0000fffe;
                dbplptl_on[num] = 255;
                dbplptl_on2 = 1;
-               ddf_change = vpos;
+               line_cyclebased = vpos;
                return;
        }
        bplpt[num] = (bplpt[num] & 0xffff0000) | (v & 0x0000fffe);
@@ -4809,7 +4806,7 @@ static void BPLCON0 (int hpos, uae_u16 v)
        if (bplcon0 == v)
                return;
 
-       ddf_change = vpos;
+       line_cyclebased = vpos;
        decide_diw (hpos);
        decide_line (hpos);
        decide_fetch_safe (hpos);
@@ -4836,7 +4833,7 @@ STATIC_INLINE void BPLCON1 (int hpos, uae_u16 v)
                v &= 0xff;
        if (bplcon1 == v)
                return;
-       ddf_change = vpos;
+       line_cyclebased = vpos;
        decide_line (hpos);
        decide_fetch_safe (hpos);
        bplcon1_written = true;
@@ -4992,7 +4989,7 @@ static void DDFSTRT (int hpos, uae_u16 v)
                v &= 0xfc;
        if (ddfstrt == v && hpos + 2 != ddfstrt)
                return;
-       ddf_change = vpos;
+       line_cyclebased = vpos;
        decide_line (hpos);
        ddfstrt_old_hpos = hpos;
        ddfstrt = v;
@@ -5012,7 +5009,7 @@ static void DDFSTOP (int hpos, uae_u16 v)
                v &= 0xfc;
        if (ddfstop == v && hpos + 2 != ddfstop)
                return;
-       ddf_change = vpos;
+       line_cyclebased = vpos;
        decide_line (hpos);
        decide_fetch_safe (hpos);
        ddfstop = v;
@@ -5034,7 +5031,7 @@ static void FMODE (int hpos, uae_u16 v)
        v &= 0xC00F;
        if (fmode == v)
                return;
-       ddf_change = vpos;
+       line_cyclebased = vpos;
        fmode = v;
        sprite_width = GET_SPRITEWIDTH (fmode);
        bpldmainitdelay (hpos);
@@ -6958,13 +6955,13 @@ static void vsync_handler_post (void)
        uae_lua_run_handler ("on_uae_vsync");
 #endif
 
-       if ((bplcon0 & 2) && currprefs.genlock) {
-               genlockvtoggle = !genlockvtoggle;
-               //lof_store = genlockvtoggle ? 1 : 0;
-       }
        if (bplcon0 & 4) {
                lof_store = lof_store ? 0 : 1;
        }
+       if ((bplcon0 & 2) && currprefs.genlock) {
+               genlockvtoggle = lof_store ? 1 : 0;
+       }
+
        if (lof_prev_lastline != lof_lastline) {
                if (lof_togglecnt_lace < LOF_TOGGLES_NEEDED)
                        lof_togglecnt_lace++;
@@ -7374,9 +7371,11 @@ static void hsync_handler_post (bool onvsync)
        }
 #endif
 
-       // genlock active = TOD pulses only every other line/field
+       // genlock active:
+       // vertical: interlaced = toggles every other field, non-interlaced = both fields (normal)
+       // horizontal: PAL = every line, NTSC = every other line
        genlockhtoggle = !genlockhtoggle;
-       bool ciahsyncs = !(bplcon0 & 2) || ((bplcon0 & 2) && currprefs.genlock && genlockhtoggle);
+       bool ciahsyncs = !(bplcon0 & 2) || ((bplcon0 & 2) && currprefs.genlock && (!currprefs.ntscmode || genlockhtoggle));
        bool ciavsyncs = !(bplcon0 & 2) || ((bplcon0 & 2) && currprefs.genlock && genlockvtoggle);
 
        CIA_hsync_posthandler (ciahsyncs);
@@ -7420,8 +7419,6 @@ static void hsync_handler_post (bool onvsync)
 
        inputdevice_hsync ();
 
-       last_custom_value1 = 0xffff; // refresh slots should set this to 0xffff
-
        if (!nocustom ()) {
                if (!currprefs.blitter_cycle_exact && bltstate != BLT_done && dmaen (DMA_BITPLANE) && diwstate == DIW_waiting_stop) {
                        blitter_slowdown (thisline_decision.plfleft, thisline_decision.plfright - (16 << fetchmode),
@@ -8068,7 +8065,7 @@ static uae_u32 REGPARAM2 custom_lgeti (uaecptr addr)
        return custom_lget (addr);
 }
 
-STATIC_INLINE uae_u32 REGPARAM2 custom_wget_1 (int hpos, uaecptr addr, int noput)
+STATIC_INLINE uae_u32 REGPARAM2 custom_wget_1 (int hpos, uaecptr addr, int noput, bool isbyte)
 {
        uae_u16 v;
        int missing;
@@ -8131,30 +8128,33 @@ writeonly:
                * all ones)
                */
                v = last_custom_value1;
+               line_cyclebased = vpos;
                if (!noput) {
                        int r;
-                       uae_u16 old = last_custom_value1;
-                       uae_u16 l = currprefs.cpu_compatible && currprefs.cpu_model == 68000 ? regs.irc : ((currprefs.chipset_mask & CSMASK_AGA) ? old : 0xffff);
+                       uae_u16 l;
+
+                       // last chip bus value (read or write) is written to register
+                       if (currprefs.cpu_compatible && currprefs.cpu_model == 68000) {
+                               if (isbyte)
+                                       l = (regs.chipset_latch_rw << 8) | (regs.chipset_latch_rw & 0xff);
+                               else
+                                       l = regs.chipset_latch_rw;
+                       } else {
+                               l = regs.chipset_latch_rw;
+                       }
                        decide_line (hpos);
                        decide_fetch_safe (hpos);
                        debug_wputpeek (0xdff000 + addr, l);
                        r = custom_wput_1 (hpos, addr, l, 1);
-                       if (r) { // register don't exist
-                               if (currprefs.chipset_mask & CSMASK_ECS_AGNUS) {
-                                       v = l;
-                               } else {
-                                       if ((addr & 0x1fe) == 0) {
-                                               if (is_cycle_ce ())
-                                                       v = last_custom_value1;
-                                               else
-                                                       v = l;
-                                       }
-                               }
+                       
+                       // cpu gets back
+                       // - if last cycle was DMA cycle: DMA cycle data
+                       // - if last cycle was not DMA cycle: FFFF or some ANDed old data.
+                       //
+                       if (is_bitplane_dma (hpos) || (cycle_line[hpos] & CYCLE_MASK) < CYCLE_CPU) {
+                               v = last_custom_value1;
                        } else {
-                               if ((currprefs.chipset_mask & CSMASK_ECS_AGNUS) && !(currprefs.chipset_mask & CSMASK_AGA))
-                                       v = 0xffff;
-                               else
-                                       v = l;
+                               v = 0xffff;
                        }
 #if CUSTOM_DEBUG > 0
                        write_log (_T("%08X read = %04X. Value written=%04X PC=%08x\n"), 0xdff000 | addr, v, l, M68K_GETPC);
@@ -8162,17 +8162,16 @@ writeonly:
                        return v;
                }
        }
-       last_custom_value1 = v;
        return v;
 }
 
-STATIC_INLINE uae_u32 custom_wget2 (uaecptr addr)
+STATIC_INLINE uae_u32 custom_wget2 (uaecptr addr, bool byte)
 {
        uae_u32 v;
        int hpos = current_hpos ();
 
        sync_copper_with_cpu (hpos, 1);
-       v = custom_wget_1 (hpos, addr, 0);
+       v = custom_wget_1 (hpos, addr, 0, byte);
 #ifdef ACTION_REPLAY
 #ifdef ACTION_REPLAY_COMMON
        addr &= 0x1ff;
@@ -8190,11 +8189,11 @@ static uae_u32 REGPARAM2 custom_wget (uaecptr addr)
        if (addr & 1) {
                /* think about move.w $dff005,d0.. (68020+ only) */
                addr &= ~1;
-               v = custom_wget2 (addr) << 8;
-               v |= custom_wget2 (addr + 2) >> 8;
+               v = custom_wget2 (addr, false) << 8;
+               v |= custom_wget2 (addr + 2, false) >> 8;
                return v;
        }
-       return custom_wget2 (addr);
+       return custom_wget2 (addr, false);
 }
 
 static uae_u32 REGPARAM2 custom_bget (uaecptr addr)
@@ -8203,7 +8202,7 @@ static uae_u32 REGPARAM2 custom_bget (uaecptr addr)
 #ifdef JIT
        special_mem |= S_READ;
 #endif
-       v = custom_wget2 (addr & ~1);
+       v = custom_wget2 (addr & ~1, true);
        v >>= (addr & 1 ? 0 : 8);
        return v;
 }
@@ -8217,8 +8216,6 @@ static uae_u32 REGPARAM2 custom_lget (uaecptr addr)
 }
 static int REGPARAM2 custom_wput_1 (int hpos, uaecptr addr, uae_u32 value, int noget)
 {
-       if (!noget)
-               last_custom_value1 = value;
        addr &= 0x1FE;
        value &= 0xffff;
 #ifdef ACTION_REPLAY
@@ -8426,7 +8423,7 @@ static int REGPARAM2 custom_wput_1 (int hpos, uaecptr addr, uae_u32 value, int n
 #if CUSTOM_DEBUG > 0
                        write_log (_T("%04X written %08x\n"), addr, M68K_GETPC);
 #endif
-                       custom_wget_1 (hpos, addr, 1);
+                       custom_wget_1 (hpos, addr, 1, false);
                }
                return 1;
        }
@@ -8924,8 +8921,8 @@ uae_u8 *restore_custom_extra (uae_u8 *src)
        currprefs.cs_a1000ram = changed_prefs.cs_a1000ram = RBB;
        currprefs.cs_slowmemisfast = changed_prefs.cs_slowmemisfast = RBB;
 
-       currprefs.cs_a2091 = changed_prefs.cs_a2091 = RBB;
-       currprefs.cs_a4091 = changed_prefs.cs_a4091 = RBB;
+       currprefs.a2091 = changed_prefs.a2091 = RBB;
+       currprefs.a4091 = changed_prefs.a4091 = RBB;
        currprefs.cs_cdtvscsi = changed_prefs.cs_cdtvscsi = RBB;
 
        currprefs.cs_pcmcia = changed_prefs.cs_pcmcia = RBB;
@@ -8975,8 +8972,8 @@ uae_u8 *save_custom_extra (int *len, uae_u8 *dstptr)
        SB (currprefs.cs_a1000ram ? 1 : 0);
        SB (currprefs.cs_slowmemisfast ? 1 : 0);
 
-       SB (currprefs.cs_a2091 ? 1 : 0);
-       SB (currprefs.cs_a4091 ? 1 : 0);
+       SB (currprefs.a2091 ? 1 : 0);
+       SB (currprefs.a4091 ? 1 : 0);
        SB (currprefs.cs_cdtvscsi ? 1 : 0);
 
        SB (currprefs.cs_pcmcia ? 1 : 0);
@@ -9150,7 +9147,7 @@ STATIC_INLINE void sync_copper (int hpos)
 
 STATIC_INLINE void decide_fetch_ce (int hpos)
 {
-       if ((ddf_change == vpos || ddf_change + 1 == vpos || blitter_dangerous_bpl) && vpos < current_maxvpos ())
+       if ((line_cyclebased == vpos || line_cyclebased + 1 == vpos || blitter_dangerous_bpl) && vpos < current_maxvpos ())
                decide_fetch (hpos);
 }
 
@@ -9217,6 +9214,10 @@ static void sync_ce020 (void)
        }
 }
 
+#define SETIFCHIP \
+       if (addr < 0xd80000) \
+               last_custom_value1 = v;
+
 uae_u32 wait_cpu_cycle_read (uaecptr addr, int mode)
 {
        uae_u32 v = 0;
@@ -9254,6 +9255,7 @@ uae_u32 wait_cpu_cycle_read (uaecptr addr, int mode)
        x_do_cycles_post (CYCLE_UNIT, v);
 
        regs.chipset_latch_rw = regs.chipset_latch_read = v;
+       SETIFCHIP
        return v;
 }
 
@@ -9295,6 +9297,7 @@ uae_u32 wait_cpu_cycle_read_ce020 (uaecptr addr, int mode)
                x_do_cycles_post (CYCLE_UNIT / 2, v);
 
        regs.chipset_latch_rw = regs.chipset_latch_read = v;
+       SETIFCHIP
        return v;
 }
 
@@ -9329,6 +9332,7 @@ void wait_cpu_cycle_write (uaecptr addr, int mode, uae_u32 v)
        x_do_cycles_post (CYCLE_UNIT, v);
 
        regs.chipset_latch_rw = regs.chipset_latch_write = v;
+       SETIFCHIP
 }
 
 void wait_cpu_cycle_write_ce020 (uaecptr addr, int mode, uae_u32 v)
@@ -9364,6 +9368,7 @@ void wait_cpu_cycle_write_ce020 (uaecptr addr, int mode, uae_u32 v)
                x_do_cycles_post (CYCLE_UNIT / 2, v);
 
        regs.chipset_latch_rw = regs.chipset_latch_write = v;
+       SETIFCHIP
 }
 
 void do_cycles_ce (unsigned long cycles)
index efe3a66377df1a24e786470bb997cae6130261d0..c14767991f4bb6eb270367ac7055007f26a43a77 100644 (file)
@@ -870,14 +870,23 @@ static void pfield_init_linetoscr (bool border)
        ham_src_pixel = MAX_PIXELS_PER_LINE + res_shift_from_window (playfield_start - native_ddf_left);
        unpainted = res_shift_from_window (unpainted);
 
-       if (sprite_first_x < sprite_last_x) {
-               if (sprite_first_x < 0)
-                       sprite_first_x = 0;
-               if (sprite_last_x >= MAX_PIXELS_PER_LINE - 1)
-                       sprite_last_x = MAX_PIXELS_PER_LINE - 2;
-               if (sprite_first_x < sprite_last_x)
-                       memset (spritepixels + sprite_first_x, 0, sizeof (struct spritepixelsbuf) * (sprite_last_x - sprite_first_x + 1));
+       int first_x = sprite_first_x;
+       int last_x = sprite_last_x;
+       if (first_x < last_x) {
+               if (dp_for_drawing->bordersprite_seen) {
+                       if (first_x > visible_left_border)
+                               first_x = visible_left_border;
+                       if (last_x < visible_right_border)
+                               last_x = visible_right_border;
+               }
+               if (first_x < 0)
+                       first_x = 0;
+               if (last_x > MAX_PIXELS_PER_LINE - 2)
+                       last_x = MAX_PIXELS_PER_LINE - 2;
+               if (first_x < last_x)
+                       memset (spritepixels + first_x, 0, sizeof (struct spritepixelsbuf) * (last_x - first_x + 1));
        }
+
        sprite_last_x = 0;
        sprite_first_x = MAX_PIXELS_PER_LINE - 1;
 
@@ -2430,7 +2439,7 @@ static void pfield_draw_line (struct vidbuffer *vb, int lineno, int gfx_ypos, in
                if (dip_for_drawing->nr_sprites) {
                        int i;
 #ifdef AGA
-                       if (colors_for_drawing.bordersprite)
+                       if (colors_for_drawing.bordersprite && dp_for_drawing->bordersprite_seen)
                                clear_bitplane_border_aga ();
 #endif
 
@@ -2445,7 +2454,7 @@ static void pfield_draw_line (struct vidbuffer *vb, int lineno, int gfx_ypos, in
                }
 
 #ifdef AGA
-               if (dip_for_drawing->nr_sprites && colors_for_drawing.bordersprite)
+               if (dip_for_drawing->nr_sprites && colors_for_drawing.bordersprite && dp_for_drawing->bordersprite_seen)
                        do_color_changes (pfield_do_linetoscr_bordersprite_aga, pfield_do_linetoscr, lineno);
                else
 #endif
index 493ea318942aaa2db7a55dbc1341a73ea28cf859..c60c5edcaa3c0a21435fe99b58baffb821b3b552 100644 (file)
@@ -767,9 +767,9 @@ static void expamem_map_fastcard (void)
 
 static void expamem_init_fastcard (void)
 {
-       uae_u16 mid = (currprefs.cs_a2091 || currprefs.uae_hide) ? commodore : uae_id;
-       uae_u8 pid = (currprefs.cs_a2091 || currprefs.uae_hide) ? commodore_a2091_ram : (currprefs.maprom ? 1 : 81);
-       uae_u8 type = add_memory | zorroII | (currprefs.cs_a2091 ? chainedconfig : 0);
+       uae_u16 mid = (currprefs.a2091 || currprefs.uae_hide) ? commodore : uae_id;
+       uae_u8 pid = (currprefs.a2091 || currprefs.uae_hide) ? commodore_a2091_ram : (currprefs.maprom ? 1 : 81);
+       uae_u8 type = add_memory | zorroII | (currprefs.a2091 ? chainedconfig : 0);
 
        expamem_init_clear ();
        if (fastmem_bank.allocated == 0x100000)
@@ -1075,9 +1075,12 @@ static void allocate_expamem (void)
        z3chipmem_bank.start = currprefs.z3fastmem_start;
        if (currprefs.mbresmem_high_size == 128 * 1024 * 1024)
                z3chipmem_bank.start += 16 * 1024 * 1024;
-       z3fastmem_bank.start = z3chipmem_bank.start;
+       if (currprefs.jit_direct_compatible_memory)
+               z3fastmem_bank.start = z3chipmem_bank.start;
+       else
+               z3fastmem_bank.start = 0x40000000;
        if (currprefs.z3chipmem_size)
-               z3fastmem_bank.start += currprefs.z3chipmem_size + 16 * 1024 * 1024;
+               z3fastmem_bank.start += currprefs.z3chipmem_size;
        z3fastmem2_bank.start = z3fastmem_bank.start + currprefs.z3fastmem_size;
 
        if (fastmem_bank.allocated != currprefs.fastmem_size) {
@@ -1256,16 +1259,7 @@ static void expamem_init_gfxboard_registers (void)
        gfxboard_init_registers ();
 #endif
 }
-#if 0
-void p96memstart (void)
-{
-       /* make sure there is always empty space between Z3 and P96 RAM */
-       p96ram_start = currprefs.z3fastmem_bank.start + ((currprefs.z3fastmem_size + currprefs.z3fastmem2_size + currprefs.z3chipmem_size + 0xffffff) & ~0xffffff);
-       if (p96ram_start == currprefs.z3fastmem_bank.start + currprefs.z3fastmem_size + currprefs.z3fastmem2_size + currprefs.z3chipmem_size &&
-               (currprefs.z3fastmem_size + currprefs.z3fastmem2_size + currprefs.z3chipmem_size < 512 * 1024 * 1024 || currprefs.rtgmem_size < 128 * 1024 * 1024))
-               p96ram_start += 0x1000000;
-}
-#endif
+
 void expamem_reset (void)
 {
        int do_mount = 1;
@@ -1309,13 +1303,12 @@ void expamem_reset (void)
        }
        // immediately after Z2Fast so that they can be emulated as A590/A2091 with fast ram.
 #ifdef A2091
-       if (currprefs.cs_a2091) {
+       if (currprefs.a2091) {
                card_name[cardno] = _T("A2091");
                card_init[cardno] = expamem_init_a2091;
                card_map[cardno++] = NULL;
        }
 #endif
-
 #ifdef CDTV
        if (currprefs.cs_cdtvcd) {
                card_name[cardno] = _T("CDTV DMAC");
@@ -1399,7 +1392,7 @@ void expamem_reset (void)
        if (z3chipmem_bank.baseaddr != NULL)
                map_banks (&z3chipmem_bank, z3chipmem_bank.start >> 16, currprefs.z3chipmem_size >> 16, z3chipmem_bank.allocated);
 #ifdef NCR
-       if (currprefs.cs_a4091) {
+       if (currprefs.a4091) {
                card_name[cardno] = _T("A4091");
                card_init[cardno] = expamem_init_a4091;
                card_map[cardno++] = NULL;
index f8efadaf01c9cfd25ca79f17e8e9638419cddb22..ac86ab005e8d0d614bd205cfb5317ed73d3106d1 100644 (file)
@@ -840,12 +840,12 @@ static void initialize_mountinfo (void)
                                a4000t_add_scsi_unit (uci->controller - HD_CONTROLLER_SCSI0, uci);      
                                allocuci (&currprefs, nr, -1);
 #endif
-                       } else if (currprefs.cs_a2091) {
+                       } else if (currprefs.a2091) {
 #ifdef A2091
                                a2091_add_scsi_unit (uci->controller - HD_CONTROLLER_SCSI0, uci);
                                allocuci (&currprefs, nr, -1);
 #endif
-                       } else if (currprefs.cs_a4091) {
+                       } else if (currprefs.a4091) {
 #ifdef NCR
                                a4091_add_scsi_unit (uci->controller - HD_CONTROLLER_SCSI0, uci);
                                allocuci (&currprefs, nr, -1);
diff --git a/fpp.cpp b/fpp.cpp
index b345673a6cf92a0dfe7892c1837948eff2f80db6..8cdf63d1b05fdf8110b564a72a0be879d3d547c3 100644 (file)
--- a/fpp.cpp
+++ b/fpp.cpp
@@ -113,7 +113,24 @@ float  fp_1e0 = 1, fp_1e1 = 10, fp_1e2 = 100, fp_1e4 = 10000;
 #define FFLAG_N            0x0100
 #define FFLAG_NAN   0x0400
 
-#define MAKE_FPSR(r)  (regs).fp_result=(r)
+#define MAKE_FPSR(r)  (regs).fp_result.fp=(r)
+
+static void fpclear (fpdata *fpd)
+{
+       fpd->fp = 0;
+#ifdef USE_SOFT_LONG_DOUBLE
+       fpd->fpe = 0;
+       fpd->fpm = 0;
+#endif
+}
+static void fpset (fpdata *fpd, fptype f)
+{
+       fpd->fp = f;
+#ifdef USE_SOFT_LONG_DOUBLE
+       fpd->fpe = 0;
+       fpd->fpm = 0;
+#endif
+}
 
 static __inline__ void native_set_fpucw (uae_u32 m68k_cw)
 {
@@ -431,8 +448,6 @@ static int get_fpu_version (void)
 {
        int v = 0;
 
-       if (currprefs.fpu_revision >= 0)
-               return currprefs.fpu_revision;
        switch (currprefs.fpu_model)
        {
        case 68881:
@@ -455,9 +470,9 @@ static void fpu_null (void)
        regs.fpsr = 0;
        regs.fpiar = 0;
        regs.fpsr_highbyte = 0;
-       regs.fp_result = 0;
+       fpclear (&regs.fp_result);
        for (int i = 0; i < 8; i++)
-               regs.fp[i] = 0;
+               fpclear (&regs.fp[i]);
 }
 
 #define fp_round_to_minus_infinity(x) fp_floor(x)
@@ -515,14 +530,14 @@ uae_u32 get_fpsr (void)
 {
        uae_u32 answer = regs.fpsr & 0x00ffffff;
 #ifdef HAVE_ISNAN
-       if (isnan (regs.fp_result))
+       if (isnan (regs.fp_result.fp))
                answer |= 0x01000000;
        else
 #endif
        {
-               if (regs.fp_result == 0)
+               if (regs.fp_result.fp == 0)
                        answer |= 0x04000000;
-               else if (regs.fp_result < 0)
+               else if (regs.fp_result.fp < 0)
                        answer |= 0x08000000;
 #ifdef HAVE_ISINF
                if (isinf (regs.fp_result))
@@ -537,14 +552,14 @@ STATIC_INLINE void set_fpsr (uae_u32 x)
        regs.fpsr = x;
 
        if (x & 0x01000000) {
-               regs.fp_result = *fp_nan;
+               fpset (&regs.fp_result, *fp_nan);
        }
        else if (x & 0x04000000)
-               regs.fp_result = 0;
+               fpset (&regs.fp_result, 0);
        else if (x & 0x08000000)
-               regs.fp_result = -1;
+               fpset (&regs.fp_result, -1);
        else
-               regs.fp_result = 1;
+               fpset (&regs.fp_result, 1);
 }
 
 /* single   : S  8*E 23*F */
@@ -555,7 +570,7 @@ STATIC_INLINE void set_fpsr (uae_u32 x)
 /* E = MAX & F # 0 -> NotANumber */
 /* E = biased by 127 (single) ,1023 (double) ,16383 (extended) */
 
-STATIC_INLINE fptype to_pack (uae_u32 wrd1, uae_u32 wrd2, uae_u32 wrd3)
+static fptype to_pack (uae_u32 wrd1, uae_u32 wrd2, uae_u32 wrd3)
 {
        fptype d;
        char *cp;
@@ -589,18 +604,27 @@ STATIC_INLINE fptype to_pack (uae_u32 wrd1, uae_u32 wrd2, uae_u32 wrd3)
        *cp++ = ((wrd1 >> 20) & 0xf) + '0';
        *cp++ = ((wrd1 >> 16) & 0xf) + '0';
        *cp = 0;
+#if USE_LONG_DOUBLE
+       sscanf (str, "%Le", &d);
+#else
        sscanf (str, "%le", &d);
+#endif
        return d;
 }
 
-STATIC_INLINE void from_pack (fptype src, uae_u32 * wrd1, uae_u32 * wrd2, uae_u32 * wrd3)
+// TODO: k-Factor is ignored.
+static void from_pack (fptype src, uae_u32 * wrd1, uae_u32 * wrd2, uae_u32 * wrd3, int kfactor)
 {
        int i;
        int t;
        char *cp;
        char str[100];
 
+#if USE_LONG_DOUBLE
+       sprintf (str, "%.16Le", src);
+#else
        sprintf (str, "%.16e", src);
+#endif
        cp = str;
        *wrd1 = *wrd2 = *wrd3 = 0;
        if (*cp == '-') {
@@ -639,7 +663,7 @@ STATIC_INLINE void from_pack (fptype src, uae_u32 * wrd1, uae_u32 * wrd2, uae_u3
        }
 }
 
-STATIC_INLINE int get_fp_value (uae_u32 opcode, uae_u16 extra, fptype *src, uaecptr oldpc)
+STATIC_INLINE int get_fp_value (uae_u32 opcode, uae_u16 extra, fpdata *src, uaecptr oldpc)
 {
        int size, mode, reg;
        uae_u32 ad = 0;
@@ -663,16 +687,16 @@ STATIC_INLINE int get_fp_value (uae_u32 opcode, uae_u16 extra, fptype *src, uaec
                        switch (size)
                        {
                                case 6:
-                                       *src = (fptype) (uae_s8) m68k_dreg (regs, reg);
+                                       src->fp = (fptype) (uae_s8) m68k_dreg (regs, reg);
                                        break;
                                case 4:
-                                       *src = (fptype) (uae_s16) m68k_dreg (regs, reg);
+                                       src->fp = (fptype) (uae_s16) m68k_dreg (regs, reg);
                                        break;
                                case 0:
-                                       *src = (fptype) (uae_s32) m68k_dreg (regs, reg);
+                                       src->fp = (fptype) (uae_s32) m68k_dreg (regs, reg);
                                        break;
                                case 1:
-                                       *src = to_single (m68k_dreg (regs, reg));
+                                       src->fp = to_single (m68k_dreg (regs, reg));
                                        break;
                                default:
                                        return 0;
@@ -692,7 +716,7 @@ STATIC_INLINE int get_fp_value (uae_u32 opcode, uae_u16 extra, fptype *src, uaec
                        ad = m68k_areg (regs, reg);
                        break;
                case 5:
-                       ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) x_next_iword ();
+                       ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) x_cp_next_iword ();
                        break;
                case 6:
                        ad = x_cp_get_disp_ea_020 (m68k_areg (regs, reg), 0);
@@ -701,14 +725,14 @@ STATIC_INLINE int get_fp_value (uae_u32 opcode, uae_u16 extra, fptype *src, uaec
                        switch (reg)
                        {
                                case 0:
-                                       ad = (uae_s32) (uae_s16) x_next_iword ();
+                                       ad = (uae_s32) (uae_s16) x_cp_next_iword ();
                                        break;
                                case 1:
-                                       ad = x_next_ilong ();
+                                       ad = x_cp_next_ilong ();
                                        break;
                                case 2:
                                        ad = m68k_getpc ();
-                                       ad += (uae_s32) (uae_s16) x_next_iword ();
+                                       ad += (uae_s32) (uae_s16) x_cp_next_iword ();
                                        break;
                                case 3:
                                        ad = x_cp_get_disp_ea_020 (m68k_getpc (), 0);
@@ -719,23 +743,23 @@ STATIC_INLINE int get_fp_value (uae_u32 opcode, uae_u16 extra, fptype *src, uaec
                                        {
                                                case 0:
                                                case 1:
-                                               exts[0] = x_next_ilong ();
+                                               exts[0] = x_cp_next_ilong ();
                                                break;
                                                case 2:
                                                case 3:
-                                               exts[0] = x_next_ilong ();
-                                               exts[1] = x_next_ilong ();
-                                               exts[2] = x_next_ilong ();
+                                               exts[0] = x_cp_next_ilong ();
+                                               exts[1] = x_cp_next_ilong ();
+                                               exts[2] = x_cp_next_ilong ();
                                                break;
                                                case 4:
-                                               exts[0] = x_next_iword ();
+                                               exts[0] = x_cp_next_iword ();
                                                break;
                                                case 5:
-                                               exts[0] = x_next_ilong ();
-                                               exts[1] = x_next_ilong ();
+                                               exts[0] = x_cp_next_ilong ();
+                                               exts[1] = x_cp_next_ilong ();
                                                break;
                                                case 6:
-                                               exts[0] = x_next_iword ();
+                                               exts[0] = x_cp_next_iword ();
                                                break;
                                        }                               
                                        break;
@@ -750,10 +774,10 @@ STATIC_INLINE int get_fp_value (uae_u32 opcode, uae_u16 extra, fptype *src, uaec
        switch (size)
        {
                case 0:
-                       *src = (fptype) (uae_s32) (doext ? exts[0] : x_cp_get_long (ad));
+                       src->fp = (fptype) (uae_s32) (doext ? exts[0] : x_cp_get_long (ad));
                        break;
                case 1:
-                       *src = to_single ((doext ? exts[0] : x_cp_get_long (ad)));
+                       src->fp = to_single ((doext ? exts[0] : x_cp_get_long (ad)));
                        break;
                case 2:
                        {
@@ -765,7 +789,7 @@ STATIC_INLINE int get_fp_value (uae_u32 opcode, uae_u16 extra, fptype *src, uaec
                                wrd2 = (doext ? exts[1] : x_cp_get_long (ad));
                                ad += 4;
                                wrd3 = (doext ? exts[2] : x_cp_get_long (ad));
-                               *src = to_exten (wrd1, wrd2, wrd3);
+                               to_exten (src, wrd1, wrd2, wrd3);
                        }
                        break;
                case 3:
@@ -778,11 +802,11 @@ STATIC_INLINE int get_fp_value (uae_u32 opcode, uae_u16 extra, fptype *src, uaec
                                wrd2 = (doext ? exts[1] : x_cp_get_long (ad));
                                ad += 4;
                                wrd3 = (doext ? exts[2] : x_cp_get_long (ad));
-                               *src = to_pack (wrd1, wrd2, wrd3);
+                               src->fp = to_pack (wrd1, wrd2, wrd3);
                        }
                        break;
                case 4:
-                       *src = (fptype) (uae_s16) (doext ? exts[0] : x_cp_get_word (ad));
+                       src->fp = (fptype) (uae_s16) (doext ? exts[0] : x_cp_get_word (ad));
                        break;
                case 5:
                        {
@@ -790,11 +814,11 @@ STATIC_INLINE int get_fp_value (uae_u32 opcode, uae_u16 extra, fptype *src, uaec
                                wrd1 = (doext ? exts[0] : x_cp_get_long (ad));
                                ad += 4;
                                wrd2 = (doext ? exts[1] : x_cp_get_long (ad));
-                               *src = to_double (wrd1, wrd2);
+                               src->fp = to_double (wrd1, wrd2);
                        }
                        break;
                case 6:
-                       *src = (fptype) (uae_s8) (doext ? exts[0] : x_cp_get_byte (ad));
+                       src->fp = (fptype) (uae_s8) (doext ? exts[0] : x_cp_get_byte (ad));
                        break;
                default:
                        return 0;
@@ -802,7 +826,7 @@ STATIC_INLINE int get_fp_value (uae_u32 opcode, uae_u16 extra, fptype *src, uaec
        return 1;
 }
 
-STATIC_INLINE int put_fp_value (fptype value, uae_u32 opcode, uae_u16 extra, uaecptr oldpc)
+STATIC_INLINE int put_fp_value (fpdata *value, uae_u32 opcode, uae_u16 extra, uaecptr oldpc)
 {
        int size, mode, reg;
        uae_u32 ad = 0;
@@ -812,11 +836,14 @@ STATIC_INLINE int put_fp_value (fptype value, uae_u32 opcode, uae_u16 extra, uae
 #if DEBUG_FPP
        if (!isinrom ())
                write_log (_T("PUTFP: %f %04X %04X\n"), value, opcode, extra);
+#endif
+#ifdef USE_SOFT_LONG_DOUBLE
+       value->fpx = false;
 #endif
        if (!(extra & 0x4000)) {
                if (fault_if_no_fpu (opcode, extra, 0, oldpc))
                        return 1;
-               regs.fp[(extra >> 10) & 7] = value;
+               regs.fp[(extra >> 10) & 7] = *value;
                return 1;
        }
        reg = opcode & 7;
@@ -829,18 +856,18 @@ STATIC_INLINE int put_fp_value (fptype value, uae_u32 opcode, uae_u16 extra, uae
                        switch (size)
                        {
                                case 6:
-                                       m68k_dreg (regs, reg) = (uae_u32)(((toint (value, -128.0, 127.0) & 0xff)
+                                       m68k_dreg (regs, reg) = (uae_u32)(((toint (value->fp, -128.0, 127.0) & 0xff)
                                                | (m68k_dreg (regs, reg) & ~0xff)));
                                        break;
                                case 4:
-                                       m68k_dreg (regs, reg) = (uae_u32)(((toint (value, -32768.0, 32767.0) & 0xffff)
+                                       m68k_dreg (regs, reg) = (uae_u32)(((toint (value->fp, -32768.0, 32767.0) & 0xffff)
                                                | (m68k_dreg (regs, reg) & ~0xffff)));
                                        break;
                                case 0:
-                                       m68k_dreg (regs, reg) = (uae_u32)toint (value, -2147483648.0, 2147483647.0);
+                                       m68k_dreg (regs, reg) = (uae_u32)toint (value->fp, -2147483648.0, 2147483647.0);
                                        break;
                                case 1:
-                                       m68k_dreg (regs, reg) = from_single (value);
+                                       m68k_dreg (regs, reg) = from_single (value->fp);
                                        break;
                                default:
                                        return 0;
@@ -860,7 +887,7 @@ STATIC_INLINE int put_fp_value (fptype value, uae_u32 opcode, uae_u16 extra, uae
                        ad = m68k_areg (regs, reg);
                        break;
                case 5:
-                       ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) x_next_iword ();
+                       ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) x_cp_next_iword ();
                        break;
                case 6:
                        ad = x_cp_get_disp_ea_020 (m68k_areg (regs, reg), 0);
@@ -869,14 +896,14 @@ STATIC_INLINE int put_fp_value (fptype value, uae_u32 opcode, uae_u16 extra, uae
                        switch (reg)
                        {
                                case 0:
-                                       ad = (uae_s32) (uae_s16) x_next_iword ();
+                                       ad = (uae_s32) (uae_s16) x_cp_next_iword ();
                                        break;
                                case 1:
-                                       ad = x_next_ilong ();
+                                       ad = x_cp_next_ilong ();
                                        break;
                                case 2:
                                        ad = m68k_getpc ();
-                                       ad += (uae_s32) (uae_s16) x_next_iword ();
+                                       ad += (uae_s32) (uae_s16) x_cp_next_iword ();
                                        break;
                                case 3:
                                        ad = x_cp_get_disp_ea_020 (m68k_getpc (), 0);
@@ -898,10 +925,10 @@ STATIC_INLINE int put_fp_value (fptype value, uae_u32 opcode, uae_u16 extra, uae
        switch (size)
        {
                case 0:
-                       x_cp_put_long (ad, (uae_u32)toint (value, -2147483648.0, 2147483647.0));
+                       x_cp_put_long (ad, (uae_u32)toint (value->fp, -2147483648.0, 2147483647.0));
                        break;
                case 1:
-                       x_cp_put_long (ad, from_single (value));
+                       x_cp_put_long (ad, from_single (value->fp));
                        break;
                case 2:
                        {
@@ -916,12 +943,13 @@ STATIC_INLINE int put_fp_value (fptype value, uae_u32 opcode, uae_u16 extra, uae
                                x_cp_put_long (ad, wrd3);
                        }
                        break;
-               case 3:
+               case 3: // Packed-Decimal Real with Static k-Factor
+               case 7: // Packed-Decimal Real with Dynamic k-Factor (P{Dn}) (reg to memory only)
                        {
                                uae_u32 wrd1, wrd2, wrd3;
                                if (fault_if_4060 (opcode, extra, ad, oldpc, FPU_EXP_UNIMP_DATATYPE))
                                        return -1;
-                               from_pack (value, &wrd1, &wrd2, &wrd3);
+                               from_pack (value->fp, &wrd1, &wrd2, &wrd3, size == 7 ? m68k_dreg (regs, (extra >> 4) & 7) : extra & 127);
                                x_cp_put_long (ad, wrd1);
                                ad += 4;
                                x_cp_put_long (ad, wrd2);
@@ -930,19 +958,19 @@ STATIC_INLINE int put_fp_value (fptype value, uae_u32 opcode, uae_u16 extra, uae
                        }
                        break;
                case 4:
-                       x_cp_put_word (ad, (uae_s16) toint (value, -32768.0, 32767.0));
+                       x_cp_put_word (ad, (uae_s16) toint (value->fp, -32768.0, 32767.0));
                        break;
                case 5:
                        {
                                uae_u32 wrd1, wrd2;
-                               from_double (value, &wrd1, &wrd2);
+                               from_double (value->fp, &wrd1, &wrd2);
                                x_cp_put_long (ad, wrd1);
                                ad += 4;
                                x_cp_put_long (ad, wrd2);
                        }
                        break;
                case 6:
-                       x_cp_put_byte (ad, (uae_s8)toint (value, -128.0, 127.0));
+                       x_cp_put_byte (ad, (uae_s8)toint (value->fp, -128.0, 127.0));
                        break;
                default:
                        return 0;
@@ -972,7 +1000,7 @@ STATIC_INLINE int get_fp_ad (uae_u32 opcode, uae_u32 * ad)
                        *ad = m68k_areg (regs, reg);
                        break;
                case 5:
-                       *ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) x_next_iword ();
+                       *ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) x_cp_next_iword ();
                        break;
                case 6:
                        *ad = x_cp_get_disp_ea_020 (m68k_areg (regs, reg), 0);
@@ -981,14 +1009,14 @@ STATIC_INLINE int get_fp_ad (uae_u32 opcode, uae_u32 * ad)
                        switch (reg)
                        {
                                case 0:
-                                       *ad = (uae_s32) (uae_s16) x_next_iword ();
+                                       *ad = (uae_s32) (uae_s16) x_cp_next_iword ();
                                        break;
                                case 1:
-                                       *ad = x_next_ilong ();
+                                       *ad = x_cp_next_ilong ();
                                        break;
                                case 2:
                                        *ad = m68k_getpc ();
-                                       *ad += (uae_s32) (uae_s16) x_next_iword ();
+                                       *ad += (uae_s32) (uae_s16) x_cp_next_iword ();
                                        break;
                                case 3:
                                        *ad = x_cp_get_disp_ea_020 (m68k_getpc (), 0);
@@ -1002,12 +1030,12 @@ STATIC_INLINE int get_fp_ad (uae_u32 opcode, uae_u32 * ad)
 
 STATIC_INLINE int fpp_cond (int condition)
 {
-       int N = (regs.fp_result < 0.0);
-       int Z = (regs.fp_result == 0.0);
+       int N = (regs.fp_result.fp < 0.0);
+       int Z = (regs.fp_result.fp == 0.0);
        int NotANumber = 0;
 
 #ifdef HAVE_ISNAN
-       NotANumber = isnan (regs.fp_result);
+       NotANumber = isnan (regs.fp_result.fp);
 #endif
 
        if (NotANumber)
@@ -1097,7 +1125,7 @@ void fpuop_dbcc (uae_u32 opcode, uae_u16 extra)
        if (fault_if_no_6888x (opcode, extra, pc - 4))
                return;
 
-       disp = (uae_s32) (uae_s16) x_next_iword ();
+       disp = (uae_s32) (uae_s16) x_cp_next_iword ();
        if (fault_if_no_fpu_u (opcode, extra, pc + disp, pc - 4))
                return;
        regs.fpiar = pc - 4;
@@ -1164,9 +1192,9 @@ void fpuop_trapcc (uae_u32 opcode, uaecptr oldpc, uae_u16 extra)
        cc = fpp_cond (extra & 0x3f);
        if (cc == -1) {
                fpu_op_illg (opcode, oldpc);
-       }
-       if (cc)
+       } else if (cc) {
                Exception (7);
+       }
 }
 
 void fpuop_bcc (uae_u32 opcode, uaecptr oldpc, uae_u32 extra)
@@ -1224,17 +1252,17 @@ void fpuop_save (uae_u32 opcode)
                uae_u32 frame_id = regs.fpu_state == 0 ? 0x00000000 : 0x00006000;
                if (incr < 0) {
                        ad -= 4;
-                       x_cp_put_long (ad, 0x00000000);
+                       x_put_long (ad, 0x00000000);
                        ad -= 4;
-                       x_cp_put_long (ad, 0x00000000);
+                       x_put_long (ad, 0x00000000);
                        ad -= 4;
-                       x_cp_put_long (ad, frame_id);
+                       x_put_long (ad, frame_id);
                } else {
-                       x_cp_put_long (ad, frame_id);
+                       x_put_long (ad, frame_id);
                        ad += 4;
-                       x_cp_put_long (ad, 0x00000000);
+                       x_put_long (ad, 0x00000000);
                        ad += 4;
-                       x_cp_put_long (ad, 0x00000000);
+                       x_put_long (ad, 0x00000000);
                        ad += 4;
                }
        } else if (currprefs.fpu_model == 68040) {
@@ -1242,9 +1270,9 @@ void fpuop_save (uae_u32 opcode)
                uae_u32 frame_id = regs.fpu_state == 0 ? 0 : fpu_version << 24;
                if (incr < 0) {
                        ad -= 4;
-                       x_cp_put_long (ad, frame_id);
+                       x_put_long (ad, frame_id);
                } else {
-                       x_cp_put_long (ad, frame_id);
+                       x_put_long (ad, frame_id);
                        ad += 4;
                }
        } else { /* 68881/68882 */
@@ -1283,15 +1311,15 @@ void fpuop_save (uae_u32 opcode)
                        if (incr < 0) {
                                for (i = 0; i < (frame_size / 4) - 1; i++) {
                                        ad -= 4;
-                                       x_cp_put_long (ad, i == 0 ? 0x70000000 : 0x00000000);
+                                       x_put_long (ad, i == 0 ? 0x70000000 : 0x00000000);
                                }
                                ad -= 4;
-                               x_cp_put_long (ad, frame_id);
+                               x_put_long (ad, frame_id);
                        } else {
-                               x_cp_put_long (ad, frame_id);
+                               x_put_long (ad, frame_id);
                                ad += 4;
                                for (i = 0; i < (frame_size / 4) - 1; i++) {
-                                       x_cp_put_long (ad, i == (frame_size / 4) - 2 ? 0x70000000 : 0x00000000);
+                                       x_put_long (ad, i == (frame_size / 4) - 2 ? 0x70000000 : 0x00000000);
                                        ad += 4;
                                }
                        }
@@ -1333,9 +1361,9 @@ void fpuop_restore (uae_u32 opcode)
        uae_u32 pad = ad;
        if (incr < 0) {
                ad -= 4;
-               d = x_cp_get_long (ad);
+               d = x_get_long (ad);
        } else {
-               d = x_cp_get_long (ad);
+               d = x_get_long (ad);
                ad += 4;
        }
 
@@ -1369,7 +1397,7 @@ void fpuop_restore (uae_u32 opcode)
 
 static void fround (int reg)
 {
-       regs.fp[reg] = (float)regs.fp[reg];
+       regs.fp[reg].fp = (float)regs.fp[reg].fp;
 }
 
 static uaecptr fmovem2mem (uaecptr ad, uae_u32 list, int incr)
@@ -1378,25 +1406,23 @@ static uaecptr fmovem2mem (uaecptr ad, uae_u32 list, int incr)
        // 68030 MMU state saving is annoying!
        if (currprefs.mmu_model == 68030) {
                int idx = 0;
+               uae_u32 wrd[3];
+               mmu030_state[1] |= MMU030_STATEFLAG1_MOVEM1;
                if (incr < 0) {
                        for (reg = 7; reg >= 0; reg--) {
-                               uae_u32 wrd1, wrd2, wrd3;
                                if (list & 0x80) {
-                                       from_exten (regs.fp[reg], &wrd1, &wrd2, &wrd3);
-                                       ad -= 4;
-                                       if (mmu030_state[0] == idx * 3 + 0) {
-                                               x_put_long (ad, wrd3);
-                                               mmu030_state[0]++;
-                                       }
-                                       ad -= 4;
-                                       if (mmu030_state[0] == idx * 3 + 1) {
-                                               x_put_long (ad, wrd2);
-                                               mmu030_state[0]++;
-                                       }
-                                       ad -= 4;
-                                       if (mmu030_state[0] == idx * 3 + 2) {
-                                               x_put_long (ad, wrd1);
-                                               mmu030_state[0]++;
+                                       from_exten (&regs.fp[reg], &wrd[2], &wrd[1], &wrd[0]);
+                                       for (int i = 0; i < 3; i++) {
+                                               ad -= 4;
+                                               if (mmu030_state[0] == idx * 3 + i) {
+                                                       if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) {
+                                                               mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2;
+                                                       } else {
+                                                               mmu030_data_buffer = wrd[i];
+                                                               x_put_long (ad, wrd[i]);
+                                                       }
+                                                       mmu030_state[0]++;
+                                               }
                                        }
                                        idx++;
                                }
@@ -1404,24 +1430,20 @@ static uaecptr fmovem2mem (uaecptr ad, uae_u32 list, int incr)
                        }
                } else {
                        for (reg = 0; reg <= 7; reg++) {
-                               uae_u32 wrd1, wrd2, wrd3;
                                if (list & 0x80) {
-                                       from_exten (regs.fp[reg], &wrd1, &wrd2, &wrd3);
-                                       if (mmu030_state[0] == idx * 3 + 0) {
-                                               x_put_long (ad, wrd1);
-                                               mmu030_state[0]++;
-                                       }
-                                       ad += 4;
-                                       if (mmu030_state[0] == idx * 3 + 1) {
-                                               x_put_long (ad, wrd2);
-                                               mmu030_state[0]++;
-                                       }
-                                       ad += 4;
-                                       if (mmu030_state[0] == idx * 3 + 2) {
-                                               x_put_long (ad, wrd3);
-                                               mmu030_state[0]++;
+                                       from_exten (&regs.fp[reg], &wrd[0], &wrd[1], &wrd[2]);
+                                       for (int i = 0; i < 3; i++) {
+                                               if (mmu030_state[0] == idx * 3 + i) {
+                                                       if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) {
+                                                               mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2;
+                                                       } else {
+                                                               mmu030_data_buffer = wrd[i];
+                                                               x_put_long (ad, wrd[i]);
+                                                       }
+                                                       mmu030_state[0]++;
+                                               }
+                                               ad += 4;
                                        }
-                                       ad += 4;
                                        idx++;
                                }
                                list <<= 1;
@@ -1432,13 +1454,13 @@ static uaecptr fmovem2mem (uaecptr ad, uae_u32 list, int incr)
                        for (reg = 7; reg >= 0; reg--) {
                                uae_u32 wrd1, wrd2, wrd3;
                                if (list & 0x80) {
-                                       from_exten (regs.fp[reg], &wrd1, &wrd2, &wrd3);
+                                       from_exten (&regs.fp[reg], &wrd1, &wrd2, &wrd3);
                                        ad -= 4;
-                                       x_cp_put_long (ad, wrd3);
+                                       x_put_long (ad, wrd3);
                                        ad -= 4;
-                                       x_cp_put_long (ad, wrd2);
+                                       x_put_long (ad, wrd2);
                                        ad -= 4;
-                                       x_cp_put_long (ad, wrd1);
+                                       x_put_long (ad, wrd1);
                                }
                                list <<= 1;
                        }
@@ -1446,12 +1468,12 @@ static uaecptr fmovem2mem (uaecptr ad, uae_u32 list, int incr)
                        for (reg = 0; reg <= 7; reg++) {
                                uae_u32 wrd1, wrd2, wrd3;
                                if (list & 0x80) {
-                                       from_exten (regs.fp[reg], &wrd1, &wrd2, &wrd3);
-                                       x_cp_put_long (ad, wrd1);
+                                       from_exten (&regs.fp[reg], &wrd1, &wrd2, &wrd3);
+                                       x_put_long (ad, wrd1);
                                        ad += 4;
-                                       x_cp_put_long (ad, wrd2);
+                                       x_put_long (ad, wrd2);
                                        ad += 4;
-                                       x_cp_put_long (ad, wrd3);
+                                       x_put_long (ad, wrd3);
                                        ad += 4;
                                }
                                        list <<= 1;
@@ -1465,26 +1487,32 @@ static uaecptr fmovem2fpp (uaecptr ad, uae_u32 list, int incr)
 {
        int reg;
        if (currprefs.mmu_model == 68030) {
-               static uae_u32 wrd1, wrd2, wrd3;
+               uae_u32 wrd[3];
                int idx = 0;
+               mmu030_state[1] |= MMU030_STATEFLAG1_MOVEM1 | MMU030_STATEFLAG1_FMOVEM;
+               if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2)
+                       ad = mmu030_ad[mmu030_idx].val;
+               else
+                       mmu030_ad[mmu030_idx].val = ad;
                if (incr < 0) {
                        for (reg = 7; reg >= 0; reg--) {
                                if (list & 0x80) {
-                                       ad -= 4;
-                                       if (mmu030_state[0] == idx * 3 + 0) {
-                                               wrd3 = x_get_long (ad);
-                                               mmu030_state[0]++;
-                                       }
-                                       ad -= 4;
-                                       if (mmu030_state[0] == idx * 3 + 1) {
-                                               wrd2 = x_get_long (ad);
-                                               mmu030_state[0]++;
-                                       }
-                                       ad -= 4;
-                                       if (mmu030_state[0] == idx * 3 + 2) {
-                                               wrd1 = x_get_long (ad);
-                                               mmu030_state[0]++;
-                                               regs.fp[reg] = to_exten(wrd1, wrd2, wrd3);
+                                       for (int i = 0; i < 3; i++) {
+                                               ad -= 4;
+                                               if (mmu030_state[0] == idx * 3 + i) {
+                                                       if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) {
+                                                               mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2;
+                                                               wrd[i] = mmu030_data_buffer;
+                                                       } else {
+                                                               wrd[i] = x_get_long (ad);
+                                                       }
+                                                       // save first two entries if 2nd or 3rd get_long() faults.
+                                                       if (i == 0 || i == 1)
+                                                               mmu030_fmovem_store[i] = wrd[i];
+                                                       mmu030_state[0]++;
+                                                       if (i == 2)
+                                                               to_exten (&regs.fp[reg], wrd[2], mmu030_fmovem_store[1], mmu030_fmovem_store[0]);
+                                               }
                                        }
                                        idx++;
                                }
@@ -1493,22 +1521,22 @@ static uaecptr fmovem2fpp (uaecptr ad, uae_u32 list, int incr)
                } else {
                        for (reg = 0; reg <= 7; reg++) {
                                if (list & 0x80) {
-                                       if (mmu030_state[0] == idx * 3 + 0) {
-                                               wrd1 = x_get_long (ad);
-                                               mmu030_state[0]++;
-                                       }
-                                       ad += 4;
-                                       if (mmu030_state[0] == idx * 3 + 1) {
-                                               wrd2 = x_get_long (ad);
-                                               mmu030_state[0]++;
-                                       }
-                                       ad += 4;
-                                       if (mmu030_state[0] == idx * 3 + 2) {
-                                               wrd3 = x_get_long (ad);
-                                               mmu030_state[0]++;
-                                               regs.fp[reg] = to_exten(wrd1, wrd2, wrd3);
+                                       for (int i = 0; i < 3; i++) {
+                                               if (mmu030_state[0] == idx * 3 + i) {
+                                                       if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) {
+                                                               mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2;
+                                                               wrd[i] = mmu030_data_buffer;
+                                                       } else {
+                                                               wrd[i] = x_get_long (ad);
+                                                       }
+                                                       if (i == 0 || i == 1)
+                                                               mmu030_fmovem_store[i] = wrd[i];
+                                                       mmu030_state[0]++;
+                                                       if (i == 2)
+                                                               to_exten (&regs.fp[reg], mmu030_fmovem_store[0], mmu030_fmovem_store[1], wrd[2]);
+                                               }
+                                               ad += 4;
                                        }
-                                       ad += 4;
                                        idx++;
                                }
                                list <<= 1;
@@ -1520,12 +1548,12 @@ static uaecptr fmovem2fpp (uaecptr ad, uae_u32 list, int incr)
                                uae_u32 wrd1, wrd2, wrd3;
                                if (list & 0x80) {
                                        ad -= 4;
-                                       wrd3 = x_cp_get_long (ad);
+                                       wrd3 = x_get_long (ad);
                                        ad -= 4;
-                                       wrd2 = x_cp_get_long (ad);
+                                       wrd2 = x_get_long (ad);
                                        ad -= 4;
-                                       wrd1 = x_cp_get_long (ad);
-                                       regs.fp[reg] = to_exten(wrd1, wrd2, wrd3);
+                                       wrd1 = x_get_long (ad);
+                                       to_exten (&regs.fp[reg], wrd1, wrd2, wrd3);
                                }
                                list <<= 1;
                        }
@@ -1533,13 +1561,13 @@ static uaecptr fmovem2fpp (uaecptr ad, uae_u32 list, int incr)
                        for (reg = 0; reg <= 7; reg++) {
                                uae_u32 wrd1, wrd2, wrd3;
                                if (list & 0x80) {
-                                       wrd1 = x_cp_get_long (ad);
+                                       wrd1 = x_get_long (ad);
                                        ad += 4;
-                                       wrd2 = x_cp_get_long (ad);
+                                       wrd2 = x_get_long (ad);
                                        ad += 4;
-                                       wrd3 = x_cp_get_long (ad);
+                                       wrd3 = x_get_long (ad);
                                        ad += 4;
-                                       regs.fp[reg] = to_exten(wrd1, wrd2, wrd3);
+                                       to_exten (&regs.fp[reg], wrd1, wrd2, wrd3);
                                }
                                list <<= 1;
                        }
@@ -1552,6 +1580,7 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra)
 {
        int reg, v;
        fptype src;
+       fpdata srcd;
        uaecptr pc = m68k_getpc () - 4;
        uaecptr ad = 0;
 
@@ -1565,7 +1594,7 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra)
        switch ((extra >> 13) & 0x7)
        {
                case 3:
-                       if (put_fp_value (regs.fp[(extra >> 7) & 7], opcode, extra, pc) == 0)
+                       if (put_fp_value (&regs.fp[(extra >> 7) & 7], opcode, extra, pc) == 0)
                                fpu_noinst (opcode, pc);
                        return;
 
@@ -1616,13 +1645,13 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra)
                                        return;
                                if ((extra & 0x2000) == 0) {
                                        if (extra & 0x1000) {
-                                               regs.fpcr = x_next_ilong ();
+                                               regs.fpcr = x_cp_next_ilong ();
                                                native_set_fpucw (regs.fpcr);
                                        }
                                        if (extra & 0x0800)
-                                               set_fpsr (x_next_ilong ());
+                                               set_fpsr (x_cp_next_ilong ());
                                        if (extra & 0x0400)
-                                               regs.fpiar = x_next_ilong ();
+                                               regs.fpiar = x_cp_next_ilong ();
                                }
                        } else if (extra & 0x2000) {
                                /* FMOVEM FPP->memory */
@@ -1781,82 +1810,85 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra)
                case 2: /* Extremely common */
                        regs.fpiar =  pc;
                        reg = (extra >> 7) & 7;
+#ifdef USE_SOFT_LONG_DOUBLE
+                       regs.fp[reg].fpx = false;
+#endif
                        if ((extra & 0xfc00) == 0x5c00) {
                                if (fault_if_no_fpu (opcode, extra, 0, pc))
                                        return;
                                switch (extra & 0x7f)
                                {
                                        case 0x00:
-                                               regs.fp[reg] = *fp_pi;
+                                               regs.fp[reg].fp = *fp_pi;
                                                break;
                                        case 0x0b:
-                                               regs.fp[reg] = *fp_l10_2;
+                                               regs.fp[reg].fp = *fp_l10_2;
                                                break;
                                        case 0x0c:
-                                               regs.fp[reg] = *fp_exp_1;
+                                               regs.fp[reg].fp = *fp_exp_1;
                                                break;
                                        case 0x0d:
-                                               regs.fp[reg] = *fp_l2_e;
+                                               regs.fp[reg].fp = *fp_l2_e;
                                                break;
                                        case 0x0e:
-                                               regs.fp[reg] = *fp_l10_e;
+                                               regs.fp[reg].fp = *fp_l10_e;
                                                break;
                                        case 0x0f:
-                                               regs.fp[reg] = 0.0;
+                                               regs.fp[reg].fp = 0.0;
                                                break;
                                        case 0x30:
-                                               regs.fp[reg] = *fp_ln_2;
+                                               regs.fp[reg].fp = *fp_ln_2;
                                                break;
                                        case 0x31:
-                                               regs.fp[reg] = *fp_ln_10;
+                                               regs.fp[reg].fp = *fp_ln_10;
                                                break;
                                        case 0x32:
-                                               regs.fp[reg] = (fptype)fp_1e0;
+                                               regs.fp[reg].fp = (fptype)fp_1e0;
                                                break;
                                        case 0x33:
-                                               regs.fp[reg] = (fptype)fp_1e1;
+                                               regs.fp[reg].fp = (fptype)fp_1e1;
                                                break;
                                        case 0x34:
-                                               regs.fp[reg] = (fptype)fp_1e2;
+                                               regs.fp[reg].fp = (fptype)fp_1e2;
                                                break;
                                        case 0x35:
-                                               regs.fp[reg] = (fptype)fp_1e4;
+                                               regs.fp[reg].fp = (fptype)fp_1e4;
                                                break;
                                        case 0x36:
-                                               regs.fp[reg] = (fptype)fp_1e8;
+                                               regs.fp[reg].fp = (fptype)fp_1e8;
                                                break;
                                        case 0x37:
-                                               regs.fp[reg] = *fp_1e16;
+                                               regs.fp[reg].fp = *fp_1e16;
                                                break;
                                        case 0x38:
-                                               regs.fp[reg] = *fp_1e32;
+                                               regs.fp[reg].fp = *fp_1e32;
                                                break;
                                        case 0x39:
-                                               regs.fp[reg] = *fp_1e64;
+                                               regs.fp[reg].fp = *fp_1e64;
                                                break;
                                        case 0x3a:
-                                               regs.fp[reg] = *fp_1e128;
+                                               regs.fp[reg].fp = *fp_1e128;
                                                break;
                                        case 0x3b:
-                                               regs.fp[reg] = *fp_1e256;
+                                               regs.fp[reg].fp = *fp_1e256;
                                                break;
                                        case 0x3c:
-                                               regs.fp[reg] = *fp_1e512;
+                                               regs.fp[reg].fp = *fp_1e512;
                                                break;
                                        case 0x3d:
-                                               regs.fp[reg] = *fp_1e1024;
+                                               regs.fp[reg].fp = *fp_1e1024;
                                                break;
                                        case 0x3e:
-                                               regs.fp[reg] = *fp_1e2048;
+                                               regs.fp[reg].fp = *fp_1e2048;
                                                break;
                                        case 0x3f:
-                                               regs.fp[reg] = *fp_1e4096;
+                                               regs.fp[reg].fp = *fp_1e4096;
                                                break;
                                        default:
                                                fpu_noinst (opcode, pc);
                                                return;
                                }
-                               MAKE_FPSR (regs.fp[reg]);
+                               MAKE_FPSR (regs.fp[reg].fp);
                                return;
                        }
 
@@ -1864,12 +1896,13 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra)
                        if (fault_if_unimplemented_6888x (opcode, extra, pc))
                                return;
 
-                       v = get_fp_value (opcode, extra, &src, pc);
+                       v = get_fp_value (opcode, extra, &srcd, pc);
                        if (v <= 0) {
                                if (v == 0)
                                        fpu_noinst (opcode, pc);
                                return;
                        }
+                       src = srcd.fp;
 
                        // get_fp_value() checked this, but only if EA was nonzero (non-register)
                        if (fault_if_unimplemented_680x0 (opcode, extra, 0, pc))
@@ -1882,7 +1915,7 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra)
                                case 0x00: /* FMOVE */
                                case 0x40: /* Explicit rounding. This is just a quick fix. */
                                case 0x44: /* Same for all other cases that have three choices */
-                                       regs.fp[reg] = src;        /* Brian King was here. */
+                                       regs.fp[reg].fp = src;        /* Brian King was here. */
                                        /*<ea> to register needs FPSR updated. See Motorola 68K Manual. */
                                        if ((extra & 0x44) == 0x40)
                                                fround (reg);
@@ -1898,167 +1931,167 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra)
                                                        frndint
                                                        fstp LDPTR tmp_fp
                                                }
-                                               regs.fp[reg] = tmp_fp;
+                                               regs.fp[reg].fp = tmp_fp;
                                        }
 #else /* no X86_MSVC */
                                        switch ((regs.fpcr >> 4) & 3) {
                                case 0: /* to nearest */
-                                       regs.fp[reg] = floor (src + 0.5);
+                                       regs.fp[reg].fp = floor (src + 0.5);
                                        break;
                                case 1: /* to zero */
                                        if (src >= 0.0)
-                                               regs.fp[reg] = floor (src);
+                                               regs.fp[reg].fp = floor (src);
                                        else
-                                               regs.fp[reg] = ceil (src);
+                                               regs.fp[reg].fp = ceil (src);
                                        break;
                                case 2: /* down */
-                                       regs.fp[reg] = floor (src);
+                                       regs.fp[reg].fp = floor (src);
                                        break;
                                case 3: /* up */
-                                       regs.fp[reg] = ceil (src);
+                                       regs.fp[reg].fp = ceil (src);
                                        break;
                                default: /* never reached */
-                                       regs.fp[reg] = src;
+                                       regs.fp[reg].fp = src;
                                        }
 #endif /* X86_MSVC */
                                        break;
                                case 0x02: /* FSINH */
-                                       regs.fp[reg] = sinh (src);
+                                       regs.fp[reg].fp = sinh (src);
                                        break;
                                case 0x03: /* FINTRZ */
-                                       regs.fp[reg] = fp_round_to_zero (src);
+                                       regs.fp[reg].fp = fp_round_to_zero (src);
                                        break;
                                case 0x04: /* FSQRT */
                                case 0x41: /* FSSQRT */
                                case 0x45: /* FDSQRT */
-                                       regs.fp[reg] = sqrt (src);
+                                       regs.fp[reg].fp = sqrt (src);
                                        if ((extra & 0x44) == 0x40)
                                                fround (reg);
                                        break;
                                case 0x06: /* FLOGNP1 */
-                                       regs.fp[reg] = log (src + 1.0);
+                                       regs.fp[reg].fp = log (src + 1.0);
                                        break;
                                case 0x08: /* FETOXM1 */
-                                       regs.fp[reg] = exp (src) - 1.0;
+                                       regs.fp[reg].fp = exp (src) - 1.0;
                                        break;
                                case 0x09: /* FTANH */
-                                       regs.fp[reg] = tanh (src);
+                                       regs.fp[reg].fp = tanh (src);
                                        break;
                                case 0x0a: /* FATAN */
-                                       regs.fp[reg] = atan (src);
+                                       regs.fp[reg].fp = atan (src);
                                        break;
                                case 0x0c: /* FASIN */
-                                       regs.fp[reg] = asin (src);
+                                       regs.fp[reg].fp = asin (src);
                                        break;
                                case 0x0d: /* FATANH */
 #if 1  /* The BeBox doesn't have atanh, and it isn't in the HPUX libm either */
-                                       regs.fp[reg] = 0.5 * log ((1 + src) / (1 - src));
+                                       regs.fp[reg].fp = 0.5 * log ((1 + src) / (1 - src));
 #else
-                                       regs.fp[reg] = atanh (src);
+                                       regs.fp[reg].fp = atanh (src);
 #endif
                                        break;
                                case 0x0e: /* FSIN */
-                                       regs.fp[reg] = sin (src);
+                                       regs.fp[reg].fp = sin (src);
                                        break;
                                case 0x0f: /* FTAN */
-                                       regs.fp[reg] = tan (src);
+                                       regs.fp[reg].fp = tan (src);
                                        break;
                                case 0x10: /* FETOX */
-                                       regs.fp[reg] = exp (src);
+                                       regs.fp[reg].fp = exp (src);
                                        break;
                                case 0x11: /* FTWOTOX */
-                                       regs.fp[reg] = pow (2.0, src);
+                                       regs.fp[reg].fp = pow (2.0, src);
                                        break;
                                case 0x12: /* FTENTOX */
-                                       regs.fp[reg] = pow (10.0, src);
+                                       regs.fp[reg].fp = pow (10.0, src);
                                        break;
                                case 0x14: /* FLOGN */
-                                       regs.fp[reg] = log (src);
+                                       regs.fp[reg].fp = log (src);
                                        break;
                                case 0x15: /* FLOG10 */
-                                       regs.fp[reg] = log10 (src);
+                                       regs.fp[reg].fp = log10 (src);
                                        break;
                                case 0x16: /* FLOG2 */
-                                       regs.fp[reg] = *fp_l2_e * log (src);
+                                       regs.fp[reg].fp = *fp_l2_e * log (src);
                                        break;
                                case 0x18: /* FABS */
                                case 0x58: /* FSABS */
                                case 0x5c: /* FDABS */
-                                       regs.fp[reg] = src < 0 ? -src : src;
+                                       regs.fp[reg].fp = src < 0 ? -src : src;
                                        if ((extra & 0x44) == 0x40)
                                                fround (reg);
                                        break;
                                case 0x19: /* FCOSH */
-                                       regs.fp[reg] = cosh (src);
+                                       regs.fp[reg].fp = cosh (src);
                                        break;
                                case 0x1a: /* FNEG */
                                case 0x5a: /* FSNEG */
                                case 0x5e: /* FDNEG */
-                                       regs.fp[reg] = -src;
+                                       regs.fp[reg].fp = -src;
                                        if ((extra & 0x44) == 0x40)
                                                fround (reg);
                                        break;
                                case 0x1c: /* FACOS */
-                                       regs.fp[reg] = acos (src);
+                                       regs.fp[reg].fp = acos (src);
                                        break;
                                case 0x1d: /* FCOS */
-                                       regs.fp[reg] = cos (src);
+                                       regs.fp[reg].fp = cos (src);
                                        break;
                                case 0x1e: /* FGETEXP */
                                        {
                                                if (src == 0) {
-                                                       regs.fp[reg] = 0;
+                                                       regs.fp[reg].fp = 0;
                                                } else {
                                                        int expon;
                                                        frexp (src, &expon);
-                                                       regs.fp[reg] = (double) (expon - 1);
+                                                       regs.fp[reg].fp = (double) (expon - 1);
                                                }
                                        }
                                        break;
                                case 0x1f: /* FGETMAN */
                                        {
                                                if (src == 0) {
-                                                       regs.fp[reg] = 0;
+                                                       regs.fp[reg].fp = 0;
                                                } else {
                                                        int expon;
-                                                       regs.fp[reg] = frexp (src, &expon) * 2.0;
+                                                       regs.fp[reg].fp = frexp (src, &expon) * 2.0;
                                                }
                                        }
                                        break;
                                case 0x20: /* FDIV */
                                case 0x60: /* FSDIV */
                                case 0x64: /* FDADD */
-                                       regs.fp[reg] /= src;
+                                       regs.fp[reg].fp /= src;
                                        if ((extra & 0x44) == 0x40)
                                                fround (reg);
                                        break;
                                case 0x21: /* FMOD */
                                        {
-                                               fptype quot = fp_round_to_zero(regs.fp[reg] / src);
-                                               regs.fp[reg] = regs.fp[reg] - quot * src;
+                                               fptype quot = fp_round_to_zero(regs.fp[reg].fp / src);
+                                               regs.fp[reg].fp = regs.fp[reg].fp - quot * src;
                                        }
                                        break;
                                case 0x22: /* FADD */
                                case 0x62: /* FSADD */
                                case 0x66: /* FDADD */
-                                       regs.fp[reg] += src;
+                                       regs.fp[reg].fp += src;
                                        if ((extra & 0x44) == 0x40)
                                                fround (reg);
                                        break;
                                case 0x23: /* FMUL */
                                case 0x63: /* FSMUL */
                                case 0x67: /* FDMUL */
-                                       regs.fp[reg] *= src;
+                                       regs.fp[reg].fp *= src;
                                        if ((extra & 0x44) == 0x40)
                                                fround (reg);
                                        break;
                                case 0x24: /* FSGLDIV */
-                                       regs.fp[reg] /= src;
+                                       regs.fp[reg].fp /= src;
                                        break;
                                case 0x25: /* FREM */
                                        {
-                                               fptype quot = fp_round_to_nearest(regs.fp[reg] / src);
-                                               regs.fp[reg] = regs.fp[reg] - quot * src;
+                                               fptype quot = fp_round_to_nearest(regs.fp[reg].fp / src);
+                                               regs.fp[reg].fp = regs.fp[reg].fp - quot * src;
                                        }
                                        break;
                                case 0x26: /* FSCALE */
@@ -2066,17 +2099,17 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra)
 #ifdef ldexp
                                                regs.fp[reg] = ldexp (regs.fp[reg], (int) src);
 #else
-                                               regs.fp[reg] *= exp (*fp_ln_2 * (int) src);
+                                               regs.fp[reg].fp *= exp (*fp_ln_2 * (int) src);
 #endif
                                        }
                                        break;
                                case 0x27: /* FSGLMUL */
-                                       regs.fp[reg] *= src;
+                                       regs.fp[reg].fp *= src;
                                        break;
                                case 0x28: /* FSUB */
                                case 0x68: /* FSSUB */
                                case 0x6c: /* FDSUB */
-                                       regs.fp[reg] -= src;
+                                       regs.fp[reg].fp -= src;
                                        if ((extra & 0x44) == 0x40)
                                                fround (reg);
                                        break;
@@ -2088,12 +2121,12 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra)
                                case 0x35:
                                case 0x36:
                                case 0x37:
-                                       regs.fp[extra & 7] = cos (src);
-                                       regs.fp[reg] = sin (src);
+                                       regs.fp[extra & 7].fp = cos (src);
+                                       regs.fp[reg].fp = sin (src);
                                        break;
                                case 0x38: /* FCMP */
                                        {
-                                               fptype tmp = regs.fp[reg] - src;
+                                               fptype tmp = regs.fp[reg].fp - src;
                                                regs.fpsr = 0;
                                                MAKE_FPSR (tmp);
                                        }
@@ -2106,7 +2139,7 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra)
                                        fpu_noinst (opcode, pc);
                                        return;
                        }
-                       MAKE_FPSR (regs.fp[reg]);
+                       MAKE_FPSR (regs.fp[reg].fp);
                        return;
                default:
                break;
@@ -2116,6 +2149,12 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra)
 
 void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra)
 {
+       if (opcode == 0xf210 && extra == 0x7c00) {
+//             activate_debugger();
+//             return;
+               write_log (_T("*"));
+       }
+
        regs.fpsr_highbyte = 0;
        regs.fpu_state = 1;
        regs.fp_exception = false;
@@ -2128,11 +2167,11 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra)
        }
 }
 
-
 void fpu_reset (void)
 {
        regs.fpcr = regs.fpsr = regs.fpiar = 0;
-       regs.fp_result = 1;
+       fpset (&regs.fp_result, 1);
+       native_set_fpucw (regs.fpcr);
        fpux_restore (NULL);
 }
 
@@ -2152,7 +2191,7 @@ uae_u8 *restore_fpu (uae_u8 *src)
                uae_u32 w1 = restore_u32 ();
                uae_u32 w2 = restore_u32 ();
                uae_u32 w3 = restore_u16 ();
-               regs.fp[i] = to_exten (w1, w2, w3);
+               to_exten (&regs.fp[i], w1, w2, w3);
        }
        regs.fpcr = restore_u32 ();
        native_set_fpucw (regs.fpcr);
@@ -2183,7 +2222,7 @@ uae_u8 *save_fpu (int *len, uae_u8 *dstptr)
        save_u32 (0x80000000 | (regs.fpu_state == 0 ? 1 : 0));
        for (i = 0; i < 8; i++) {
                uae_u32 w1, w2, w3;
-               from_exten (regs.fp[i], &w1, &w2, &w3);
+               from_exten (&regs.fp[i], &w1, &w2, &w3);
                save_u32 (w1);
                save_u32 (w2);
                save_u16 (w3);
index f0f380fe5e4dc7aa42b1a7ec9b8e08187707b022..dc60dcd3cf3af058c894b154a619062331a7d28b 100644 (file)
--- a/gayle.cpp
+++ b/gayle.cpp
@@ -55,7 +55,7 @@ DE0000 to DEFFFF      64 KB Motherboard resources
 
 /* A4000T NCR */
 #define NCR_OFFSET 0x40
-#define NCR_LONG_OFFSET 0x80
+#define NCR_ALT_OFFSET 0x80
 #define NCR_MASK 0x3f
 
 /* Gayle definitions from Linux drivers and preliminary Gayle datasheet */
@@ -1551,7 +1551,7 @@ static uae_u32 REGPARAM2 gayle_lget (uaecptr addr)
        if (currprefs.cs_mbdmac == 2 && (addr & 0xffff) == 0x3000)
                return 0xffffffff; // NCR DIP BANK
        if (isa4000t (&addr)) {
-               if (addr >= NCR_LONG_OFFSET) {
+               if (addr >= NCR_ALT_OFFSET) {
                        addr &= NCR_MASK;
                        v = (ncr_io_bget (addr + 3) << 0) | (ncr_io_bget (addr + 2) << 8) |
                                (ncr_io_bget (addr + 1) << 16) | (ncr_io_bget (addr + 0) << 24);
@@ -1626,7 +1626,7 @@ static void REGPARAM2 gayle_lput (uaecptr addr, uae_u32 value)
        special_mem |= S_WRITE;
 #endif
        if (isa4000t (&addr)) {
-               if (addr >= NCR_LONG_OFFSET) {
+               if (addr >= NCR_ALT_OFFSET) {
                        addr &= NCR_MASK;
                        ncr_io_bput (addr + 3, value >> 0);
                        ncr_io_bput (addr + 2, value >> 8);
@@ -1783,8 +1783,10 @@ static void REGPARAM2 gayle2_bput (uaecptr addr, uae_u32 value)
 }
 
 static uae_u8 ramsey_config;
-static int gary_coldboot, gary_toenb, gary_timeout;
+static int gary_coldboot;
+static int gary_timeout;
 static int garyidoffset;
+int gary_toenb;
 
 static void mbres_write (uaecptr addr, uae_u32 val, int size)
 {
index dcf48c831f2fac021394e3ee04c0eb61bcc3b54a..783dfe9177fc125a5f32e470a84fa17860ddb9c8 100644 (file)
@@ -425,9 +425,9 @@ static void gen_nextilong2 (char *type, char *name, int flags, int movem)
                                printf ("\t%s |= regs.irc;\n", name);
                                insn_n_cycles += 4;
                        } else {
-                               printf ("\t%s = %s (%d);\n", name, prefetch_long, r + 2);
-                               count_read++;
+                               printf ("\t%s = %s (%d) << 16;\n", name, prefetch_word, r + 2);
                                count_read++;
+                               printf ("\t%s |= %s (%d);\n", name, prefetch_word, r + 4);
                                insn_n_cycles += 8;
                        }
                } else {
@@ -1476,7 +1476,7 @@ static void genamode2x (amodes mode, char *reg, wordsizes size, char *name, int
                        case sz_long: insn_n_cycles += 8; printf ("\tuae_s32 %s = %s (%sa);\n", name, srcl, name); count_read += 2; break;
                        default: term ();
                        }
-               } else if (using_ce) {
+               } else if (using_ce || using_prefetch) {
                        switch (size) {
                        case sz_byte: printf ("\tuae_s8 %s = %s (%sa);\n", name, srcb, name); count_read++; break;
                        case sz_word: printf ("\tuae_s16 %s = %s (%sa);\n", name, srcw, name); count_read++; break;
@@ -1751,6 +1751,33 @@ static void genastore_2 (char *from, amodes mode, char *reg, wordsizes size, cha
                        default:
                                term ();
                        }
+               } else if (using_prefetch) {
+                       switch (size) {
+                       case sz_byte:
+                               insn_n_cycles += 4;
+                               printf ("\t%s (%sa, %s);\n", dstb, to, from);
+                               count_write++;
+                               break;
+                       case sz_word:
+                               insn_n_cycles += 4;
+                               if (cpu_level < 2 && (mode == PC16 || mode == PC8r))
+                                       term ();
+                               printf ("\t%s (%sa, %s);\n", dstw, to, from);
+                               count_write++;
+                               break;
+                       case sz_long:
+                               insn_n_cycles += 8;
+                               if (cpu_level < 2 && (mode == PC16 || mode == PC8r))
+                                       term ();
+                               if (store_dir)
+                                       printf ("\t%s (%sa + 2, %s); %s (%sa, %s >> 16);\n", dstw, to, from, dstw, to, from);
+                               else
+                                       printf ("\t%s (%sa, %s >> 16); %s (%sa + 2, %s);\n", dstw, to, from, dstw, to, from);
+                               count_write += 2;
+                               break;
+                       default:
+                               term ();
+                       }
                } else {
                        switch (size) {
                        case sz_byte:
@@ -2684,15 +2711,16 @@ static void resetvars (void)
                dstb = "put_byte_ce000";
                do_cycles = "do_cycles_ce000";
        } else if (using_prefetch) {
+               // 68000 prefetch
                prefetch_word = "get_word_prefetch";
                prefetch_long = "get_long_prefetch";
-               srcwi = "get_wordi";
-               srcl = "get_long";
-               dstl = "put_long";
-               srcw = "get_word";
-               dstw = "put_word";
-               srcb = "get_byte";
-               dstb = "put_byte";
+               srcwi = "get_wordi_prefetch";
+               srcl = "get_long_prefetch";
+               dstl = "put_long_prefetch";
+               srcw = "get_word_prefetch";
+               dstw = "put_word_prefetch";
+               srcb = "get_byte_prefetch";
+               dstb = "put_byte_prefetch";
        } else {
                // generic
                prefetch_long = "get_ilong";
@@ -3078,7 +3106,7 @@ static void gen_opcode (unsigned long int opcode)
        case i_BTST:
                genamodedual (curi,
                        curi->smode, "srcreg", curi->size, "src", 1, 0,
-                       curi->dmode, "dstreg", curi->size, "dst", 1, GF_IR2IRC);
+                       curi->dmode, "dstreg", curi->size, "dst", 1, 0);
                //genamode (curi, curi->smode, "srcreg", curi->size, "src", 1, 0, 0);
                //genamode (curi, curi->dmode, "dstreg", curi->size, "dst", 1, 0, GF_IR2IRC);
                fill_prefetch_next ();
@@ -3092,9 +3120,10 @@ static void gen_opcode (unsigned long int opcode)
                //during instruction's read access CPU data lines appear as zero to outside world,
                // (normally previously fetched data appears in data lines if reading write-only register)
                // this allows stupid things like bset #2,$dff096 to work "correctly"
+               // NOTE: above can't be right.
                genamodedual (curi,
                        curi->smode, "srcreg", curi->size, "src", 1, 0,
-                       curi->dmode, "dstreg", curi->size, "dst", 1, GF_IR2IRC | GF_RMW);
+                       curi->dmode, "dstreg", curi->size, "dst", 1, GF_RMW);
                //genamode (curi, curi->smode, "srcreg", curi->size, "src", 1, 0, 0);
                //genamode (curi, curi->dmode, "dstreg", curi->size, "dst", 1, 0, GF_IR2IRC | GF_RMW);
                fill_prefetch_next ();
@@ -3369,7 +3398,7 @@ static void gen_opcode (unsigned long int opcode)
                break;
        case i_MVMEL:
                // confirmed
-               if (using_ce)
+               if (using_ce || using_prefetch)
                        genmovemel_ce (opcode);
                else
                        genmovemel (opcode);
@@ -3377,7 +3406,7 @@ static void gen_opcode (unsigned long int opcode)
                break;
        case i_MVMLE:
                // confirmed
-               if (using_ce)
+               if (using_ce || using_prefetch)
                        genmovemle_ce (opcode);
                else
                        genmovemle (opcode);
@@ -3673,9 +3702,9 @@ static void gen_opcode (unsigned long int opcode)
                        m68k_pc_offset = 0;
                        fill_prefetch_1 (0);
                        printf ("\tm68k_areg (regs, 7) -= 4;\n");
-                       if (using_ce) {
-                               printf ("\tx_put_word (m68k_areg (regs, 7), oldpc >> 16);\n");
-                               printf ("\tx_put_word (m68k_areg (regs, 7) + 2, oldpc);\n");
+                       if (using_ce || using_prefetch) {
+                               printf ("\t%s (m68k_areg (regs, 7), oldpc >> 16);\n", dstw);
+                               printf ("\t%s (m68k_areg (regs, 7) + 2, oldpc);\n", dstw);
                        } else {
                                printf ("\t%s (m68k_areg (regs, 7), oldpc);\n", dstl);
                        }
@@ -5260,7 +5289,7 @@ static void generate_one_opcode (int rp, char *extra)
        }
        need_endlabel = 0;
        endlabelno++;
-       sprintf (endlabelstr, "endlabel%d", endlabelno);
+       sprintf (endlabelstr, "l_%d", endlabelno);
        count_read = count_write = count_ncycles = count_cycles = 0;
        count_cycles_ce020 = 0;
        count_read_ea = count_write_ea = count_cycles_ea = 0;
@@ -5445,6 +5474,7 @@ static void generate_cpu (int id, int mode)
                        fprintf (stblfile, "#ifndef CPUEMU_68000_ONLY\n");
                fprintf (stblfile, "const struct cputbl CPUFUNC(op_smalltbl_%d%s)[] = {\n", postfix, extra);
        }
+       endlabelno = id * 10000;
        generate_func (extra);
        if (generate_stbl) {
                if ((id > 0 && id < 10) || (id >= 20))
index b2650ed9c9fe1285ade2fe490513226f5144f553..572ec0e75aef4f8c3bb63a4edbb7324d9bfb83b4 100644 (file)
@@ -1369,32 +1369,34 @@ int scsi_hd_emulate (struct hardfiledata *hfd, struct hd_hardfiledata *hdhfd, ua
                        goto outofbounds;
                scsi_len = (uae_u32)cmd_writex (hfd, scsi_data, offset, len);
                break;
-#if 0
-       case 0x2f: /* VERIFY */
+       case 0x2f: /* VERIFY (10) */
                {
                        int bytchk = cmdbuf[1] & 2;
                        if (nodisk (hfd))
                                goto nodisk;
-                       offset = rl (cmdbuf + 2);
-                       offset *= hfd->ci.blocksize;
-                       len = rl (cmdbuf + 7 - 2) & 0xffff;
-                       len *= hfd->ci.blocksize;
-                       if (checkbounds (hfd, offset, len)) {
-                               uae_u8 *vb = xmalloc (hfd->ci.blocksize);
-                               while (len > 0) {
-                                       int len = cmd_readx (hfd, vb, offset, hfd->ci.blocksize);
-                                       if (bytchk) {
-                                               if (memcmp (vb, scsi_data, hfd->ci.blocksize))
+                       if (bytchk) {
+                               offset = rl (cmdbuf + 2);
+                               offset *= hfd->ci.blocksize;
+                               len = rl (cmdbuf + 7 - 2) & 0xffff;
+                               len *= hfd->ci.blocksize;
+                               uae_u8 *vb = xmalloc (uae_u8, hfd->ci.blocksize);
+                               if (checkbounds (hfd, offset, len)) {
+                                       while (len > 0) {
+                                               int readlen = cmd_readx (hfd, vb, offset, hfd->ci.blocksize);
+                                               if (readlen != hfd->ci.blocksize || memcmp (vb, scsi_data, hfd->ci.blocksize)) {
+                                                       xfree (vb);
                                                        goto miscompare;
+                                               }
                                                scsi_data += hfd->ci.blocksize;
+                                               offset += hfd->ci.blocksize;
+                                               len -= hfd->ci.blocksize;
                                        }
-                                       offset += hfd->ci.blocksize;
                                }
                                xfree (vb);
                        }
+                       scsi_len = 0;
                }
                break;
-#endif
        case 0x35: /* SYNCRONIZE CACHE (10) */
                if (nodisk (hfd))
                        goto nodisk;
index bbc3155cbd18cc8eb14441a675e16ac2b04e4463..d297e4d3cbc14b0b7033bb8c85edb2b864ca3ede 100644 (file)
@@ -1,17 +1,4 @@
 
-STATIC_INLINE uae_u32 get_word_prefetch (int o)
-{
-       uae_u32 v = regs.irc;
-       regs.irc = get_wordi (m68k_getpc () + o);
-       return v;
-}
-STATIC_INLINE uae_u32 get_long_prefetch (int o)
-{
-       uae_u32 v = get_word_prefetch (o) << 16;
-       v |= get_word_prefetch (o + 2);
-       return v;
-}
-
 #ifdef CPUEMU_20
 
 extern uae_u32 get_word_020_prefetch (int);
@@ -226,6 +213,38 @@ extern uae_u32 get_word_ce040_prefetch (int);
 
 #endif
 
+#ifdef CPUEMU_11
+
+STATIC_INLINE uae_u32 get_word_prefetch (int o)
+{
+       uae_u32 v = regs.irc;
+       regs.irc = regs.db = get_wordi (m68k_getpc () + o);
+       return v;
+}
+STATIC_INLINE uae_u32 get_byte_prefetch (uaecptr addr)
+{
+       uae_u32 v = get_byte (addr);
+       regs.db = (v << 8) | v;
+       return v;
+}
+STATIC_INLINE uae_u32 get_word_prefetch (uaecptr addr)
+{
+       uae_u32 v = get_word (addr);
+       regs.db = v;
+       return v;
+}
+STATIC_INLINE void put_byte_prefetch (uaecptr addr, uae_u32 v)
+{
+       regs.db = (v << 8) | v;
+       put_byte (addr, v);
+}
+STATIC_INLINE void put_word_prefetch (uaecptr addr, uae_u32 v)
+{
+       regs.db = v;
+       put_word (addr, v);
+}
+#endif
+
 #ifdef CPUEMU_13
 
 STATIC_INLINE void do_cycles_ce000 (int clocks)
@@ -240,58 +259,77 @@ STATIC_INLINE void ipl_fetch (void)
 
 STATIC_INLINE uae_u32 mem_access_delay_word_read (uaecptr addr)
 {
+       uae_u32 v;
        switch (ce_banktype[addr >> 16])
        {
        case CE_MEMBANK_CHIP16:
        case CE_MEMBANK_CHIP32:
-               return wait_cpu_cycle_read (addr, 1);
+               v = wait_cpu_cycle_read (addr, 1);
+               break;
        case CE_MEMBANK_FAST16:
        case CE_MEMBANK_FAST32:
-               uae_u32 v = get_word (addr);
+               v = get_word (addr);
                x_do_cycles_post (4 * cpucycleunit, v);
-               return v;
+               break;
+       default:
+               v = get_word (addr);
+               break;
        }
-       return get_word (addr);
+       regs.db = v;
+       return v;
 }
 STATIC_INLINE uae_u32 mem_access_delay_wordi_read (uaecptr addr)
 {
+       uae_u32 v;
        switch (ce_banktype[addr >> 16])
        {
        case CE_MEMBANK_CHIP16:
        case CE_MEMBANK_CHIP32:
-               return wait_cpu_cycle_read (addr, 1);
+               v = wait_cpu_cycle_read (addr, 1);
+               break;
        case CE_MEMBANK_FAST16:
        case CE_MEMBANK_FAST32:
-               uae_u32 v = get_wordi (addr);
+               v = get_wordi (addr);
                x_do_cycles_post (4 * cpucycleunit, v);
-               return v;
+               break;
+       default:
+               v = get_wordi (addr);
+               break;
        }
-       return get_wordi (addr);
+       regs.db = v;
+       return v;
 }
 
 STATIC_INLINE uae_u32 mem_access_delay_byte_read (uaecptr addr)
 {
+       uae_u32  v;
        switch (ce_banktype[addr >> 16])
        {
        case CE_MEMBANK_CHIP16:
        case CE_MEMBANK_CHIP32:
-               return wait_cpu_cycle_read (addr, 0);
+               v = wait_cpu_cycle_read (addr, 0);
+               break;
        case CE_MEMBANK_FAST16:
        case CE_MEMBANK_FAST32:
-               uae_u32 v = get_byte (addr);
+               v = get_byte (addr);
                x_do_cycles_post (4 * cpucycleunit, v);
-               return v;
+               break;
+       default:
+               v = get_byte (addr);
+               break;
        }
-       return get_byte (addr);
+       regs.db = (v << 8) | v;
+       return v;
 }
 STATIC_INLINE void mem_access_delay_byte_write (uaecptr addr, uae_u32 v)
 {
+       regs.db = (v << 8)  | v;
        switch (ce_banktype[addr >> 16])
        {
        case CE_MEMBANK_CHIP16:
        case CE_MEMBANK_CHIP32:
                wait_cpu_cycle_write (addr, 0, v);
-               return;
+               break;
        case CE_MEMBANK_FAST16:
        case CE_MEMBANK_FAST32:
                put_byte (addr, v);
@@ -302,6 +340,7 @@ STATIC_INLINE void mem_access_delay_byte_write (uaecptr addr, uae_u32 v)
 }
 STATIC_INLINE void mem_access_delay_word_write (uaecptr addr, uae_u32 v)
 {
+       regs.db = v;
        switch (ce_banktype[addr >> 16])
        {
        case CE_MEMBANK_CHIP16:
@@ -338,7 +377,7 @@ STATIC_INLINE uae_u32 get_byte_ce000 (uaecptr addr)
 STATIC_INLINE uae_u32 get_word_ce000_prefetch (int o)
 {
        uae_u32 v = regs.irc;
-       regs.irc = x_get_iword (o);
+       regs.irc = regs.db = x_get_iword (o);
        return v;
 }
 
index 7658e1481feb3798baed3bdd6cf28fd618eef070..0094e09a788a1af9395322cec7453beb2fa7c99f 100644 (file)
@@ -15,7 +15,9 @@ extern int mmu030_opcode, mmu030_opcode_stageb;
 extern uae_u16 mmu030_state[3];
 extern uae_u32 mmu030_data_buffer;
 extern uae_u32 mmu030_disp_store[2];
+extern uae_u32 mmu030_fmovem_store[2];
 
+#define MMU030_STATEFLAG1_FMOVEM 0x2000
 #define MMU030_STATEFLAG1_MOVEM1 0x4000
 #define MMU030_STATEFLAG1_MOVEM2 0x8000
 #define MMU030_STATEFLAG1_DISP0 0x0001
index 7512f0d94968c5e9c1cb92c6d1d7cc184959ba32..2982f9517670b0c02eb46b2249d770c638fbf958 100644 (file)
@@ -11,5 +11,7 @@ extern void gayle_free_units (void);
 extern void rethink_gayle (void);
 extern void gayle_map_pcmcia (void);
 
+extern int gary_toenb; // non-existing memory access = bus error.
+
 #define PCMCIA_COMMON_START 0x600000
 #define PCMCIA_COMMON_SIZE 0x400000
index e25c78b7d727946e6ec3b04a0ec13c06a42273bf..5e006bd23f7e0d420f4094cfb17ac20981057b31 100644 (file)
@@ -159,10 +159,10 @@ extern int inputdevice_get_device_total (int type);
 extern int inputdevice_get_widget_num (int devnum);
 extern int inputdevice_get_widget_type (int devnum, int num, TCHAR *name);
 
-extern int input_get_default_mouse (struct uae_input_device *uid, int num, int port, int af, bool gp, bool wheel);
-extern int input_get_default_lightpen (struct uae_input_device *uid, int num, int port, int af, bool gp);
-extern int input_get_default_joystick (struct uae_input_device *uid, int num, int port, int af, int mode, bool gp);
-extern int input_get_default_joystick_analog (struct uae_input_device *uid, int num, int port, int af, bool gp);
+extern int input_get_default_mouse (struct uae_input_device *uid, int num, int port, int af, bool gp, bool wheel, bool joymouseswap);
+extern int input_get_default_lightpen (struct uae_input_device *uid, int num, int port, int af, bool gp, bool joymouseswap);
+extern int input_get_default_joystick (struct uae_input_device *uid, int num, int port, int af, int mode, bool gp, bool joymouseswap);
+extern int input_get_default_joystick_analog (struct uae_input_device *uid, int num, int port, int af, bool gp, bool joymouseswap);
 extern int input_get_default_keyboard (int num);
 
 #define DEFEVENT(A, B, C, D, E, F) INPUTEVENT_ ## A,
index d072afc7d62fa96529e26ceffa59c405b1093136..c7865368a9dc26805513cde56fff454abcddf726 100644 (file)
@@ -127,6 +127,16 @@ struct mmufixup
 };
 extern struct mmufixup mmufixup[2];
 
+typedef struct
+{
+       fptype fp;
+#ifdef USE_SOFT_LONG_DOUBLE
+       bool fpx;
+       uae_u32 fpm;
+       uae_u64 fpe;
+#endif
+} fpdata;
+
 struct regstruct
 {
        uae_u32 regs[16];
@@ -136,7 +146,7 @@ struct regstruct
        uae_u8 *pc_oldp;
        uae_u32 instruction_pc;
 
-       uae_u16 irc, ir;
+       uae_u16 irc, ir, db;
        uae_u32 spcflags;
        uae_u32 last_prefetch;
        uae_u32 chipset_latch_rw;
@@ -159,8 +169,8 @@ struct regstruct
        uae_u32 vbr, sfc, dfc;
 
 #ifdef FPUEMU
-       fptype fp[8];
-       fptype fp_result;
+       fpdata fp[8];
+       fpdata fp_result;
        uae_u32 fpcr, fpsr, fpiar;
        uae_u32 fpsr_highbyte;
        uae_u32 fpu_state;
@@ -356,7 +366,6 @@ STATIC_INLINE uae_u32 next_ilongi (void)
 }
 
 extern uae_u32 (*x_prefetch)(int);
-extern uae_u32 (*x_prefetch_long)(int);
 extern uae_u32 (*x_get_byte)(uaecptr addr);
 extern uae_u32 (*x_get_word)(uaecptr addr);
 extern uae_u32 (*x_get_long)(uaecptr addr);
index 055ab6241e7caf90ae1873f03325c053e1d5c681..9e545a7bb1d249ae8f5dc6f45fdc83a204857d7d 100644 (file)
@@ -413,7 +413,6 @@ struct uae_prefs {
        int cs_deniserev;
        int cs_mbdmac;
        bool cs_cdtvscsi;
-       bool cs_a2091, cs_a4091;
        bool cs_df0idhw;
        bool cs_slowmemisfast;
        bool cs_resetwarning;
@@ -431,8 +430,10 @@ struct uae_prefs {
        TCHAR romextident[256];
        TCHAR a2091romfile[MAX_DPATH];
        TCHAR a2091romident[256];
+       bool a2091;
        TCHAR a4091romfile[MAX_DPATH];
        TCHAR a4091romident[256];
+       bool a4091;
        TCHAR flashfile[MAX_DPATH];
        TCHAR rtcfile[MAX_DPATH];
        TCHAR cartfile[MAX_DPATH];
index cd0458c3473e4760de31cacfc3ae3398a6b88c2e..7ef239f6dd44c88818491d0391e99fffc3ea4b5f 100644 (file)
@@ -23,6 +23,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_BYTESWAP       0x100000
 #define ROMTYPE_CD32           0x200000
 #define ROMTYPE_SCRAMBLED      0x400000
+#define ROMTYPE_NONE           0x800000
 
 #define ROMTYPE_ALL_KICK (ROMTYPE_KICK | ROMTYPE_KICKCD32 | ROMTYPE_CD32)
 #define ROMTYPE_ALL_EXT (ROMTYPE_EXTCD32 | ROMTYPE_EXTCDTV)
@@ -58,6 +59,7 @@ struct romlist {
 
 extern struct romdata *getromdatabypath (const TCHAR *path);
 extern struct romdata *getromdatabycrc (uae_u32 crc32);
+extern struct romdata *getromdatabycrc (uae_u32 crc32, bool);
 extern struct romdata *getromdatabydata (uae_u8 *rom, int size);
 extern struct romdata *getromdatabyid (int id);
 extern struct romdata *getromdatabyidgroup (int id, int group, int subitem);
index 058c10cfeeabe200e67c702f6e8ef96c01624993..7898202e9c7044eac32f05aaa0d14118f67b2f72 100644 (file)
@@ -209,6 +209,8 @@ static int oldm_axis[MAX_INPUT_DEVICES][MAX_INPUT_DEVICE_EVENTS];
 static uae_s16 mouse_x[MAX_JPORTS], mouse_y[MAX_JPORTS];
 static uae_s16 mouse_delta[MAX_JPORTS][MOUSE_AXIS_TOTAL];
 static uae_s16 mouse_deltanoreset[MAX_JPORTS][MOUSE_AXIS_TOTAL];
+static uae_s16 lightpen_delta[2];
+static uae_s16 lightpen_deltanoreset[2];
 static int joybutton[MAX_JPORTS];
 static int joydir[MAX_JPORTS];
 static int joydirpot[MAX_JPORTS][2];
@@ -218,9 +220,9 @@ static int mouse_port[NORMAL_JPORTS];
 static int cd32_shifter[NORMAL_JPORTS];
 static int cd32_pad_enabled[NORMAL_JPORTS];
 static int parport_joystick_enabled;
-static int oldmx[MAX_JPORTS], oldmy[MAX_JPORTS];
 static int oleft[MAX_JPORTS], oright[MAX_JPORTS], otop[MAX_JPORTS], obot[MAX_JPORTS];
 static int horizclear[MAX_JPORTS], vertclear[MAX_JPORTS];
+static int relativecount[MAX_JPORTS][2];
 
 uae_u16 potgo_value;
 static int pot_cap[NORMAL_JPORTS][2];
@@ -1857,6 +1859,19 @@ static void mouseupdate (int pct, bool vsync)
                }
 
        }
+
+       if (lightpen_delta[0]) {
+               lightpen_x += lightpen_delta[0];
+               if (!lightpen_deltanoreset[0])
+                       lightpen_delta[0] = 0;
+       }
+       if (lightpen_delta[1]) {
+               lightpen_y += lightpen_delta[1];
+               if (!lightpen_deltanoreset[1])
+                       lightpen_delta[1] = 0;
+       }
+
+
 }
 
 static int input_vpos, input_frame;
@@ -3084,6 +3099,7 @@ static int handle_input_event (int nr, int state, int max, int autofire, bool ca
        {
        case 5: /* lightpen/gun */
                {
+                       int unit = ie->data & 0x7f;
                        if (!lightpen_active) {
                                lightpen_x = gfxvidinfo.outbuffer->outwidth / 2;
                                lightpen_y = gfxvidinfo.outbuffer->outheight / 2;
@@ -3092,16 +3108,31 @@ static int handle_input_event (int nr, int state, int max, int autofire, bool ca
                        lightpen_enabled = true;
                        if (ie->type == 0) {
                                int delta = 0;
-                               if (max == 0)
+                               if (max == 0) {
                                        delta = state * currprefs.input_mouse_speed / 100;
-                               else if (state > 0)
-                                       delta = currprefs.input_joymouse_speed;
-                               else if (state < 0)
-                                       delta = -currprefs.input_joymouse_speed;
+                               } else {
+                                       int deadzone = currprefs.input_joymouse_deadzone * max / 100;
+                                       if (state <= deadzone && state >= -deadzone) {
+                                               state = 0;
+                                               lightpen_deltanoreset[unit] = 0;
+                                       } else if (state < 0) {
+                                               state += deadzone;
+                                               lightpen_deltanoreset[unit] = 1;
+                                       } else {
+                                               state -= deadzone;
+                                               lightpen_deltanoreset[unit] = 1;
+                                       }
+                                       max -= deadzone;
+                                       delta = state * currprefs.input_joymouse_multiplier / (10 * max);
+                               }
                                if (ie->data)
                                        lightpen_y += delta;
                                else
                                        lightpen_x += delta;
+                               if (max)
+                                       lightpen_delta[unit] = delta;
+                               else
+                                       lightpen_delta[unit] += delta;
                        } else {
                                int delta = currprefs.input_joymouse_speed;
                                if (ie->data & DIR_LEFT)
@@ -3240,7 +3271,17 @@ static int handle_input_event (int nr, int state, int max, int autofire, bool ca
                                        state -= deadzone;
                                }
                                state = state * max / (max - deadzone);
+                       } else {
+                               max = 100;
+                               relativecount[joy][unit] += state;
+                               state = relativecount[joy][unit];
+                               if (state < -max)
+                                       state = -max;
+                               if (state > max)
+                                       state = max;
+                               relativecount[joy][unit] = state;
                        }
+
                        if (ie->data & IE_INVERT)
                                state = -state;
 
@@ -3303,10 +3344,26 @@ static int handle_input_event (int nr, int state, int max, int autofire, bool ca
                                /* "normal" joystick axis */
                                int deadzone = currprefs.input_joystick_deadzone * max / 100;
                                int neg, pos;
-                               if (state < deadzone && state > -deadzone)
-                                       state = 0;
-                               neg = state < 0 ? 1 : 0;
-                               pos = state > 0 ? 1 : 0;
+                               if (max == 0) {
+                                       int cnt;
+                                       int mmax = 50, mextra = 10;
+                                       int unit = (ie->data & (4 | 8)) ? 1 : 0;
+                                       // relative events
+                                       relativecount[joy][unit] += state;
+                                       cnt = relativecount[joy][unit];
+                                       neg = cnt < -mmax;      
+                                       pos = cnt > mmax;
+                                       if (cnt < -(mmax + mextra))
+                                               cnt = -(mmax + mextra);
+                                       if (cnt > (mmax + mextra))
+                                               cnt = (mmax + mextra);
+                                       relativecount[joy][unit] = cnt;
+                               } else {
+                                       if (state < deadzone && state > -deadzone)
+                                               state = 0;
+                                       neg = state < 0 ? 1 : 0;
+                                       pos = state > 0 ? 1 : 0;
+                               }
                                if (ie->data & DIR_LEFT) {
                                        left = oleft[joy] = neg;
                                        if (horizclear[joy] && left) {
@@ -4853,7 +4910,7 @@ static void compatibility_copy (struct uae_prefs *prefs, bool gameports)
 
        for (i = 0; i < MAX_JPORTS; i++) {
                joymodes[i] = prefs->jports[i].mode;
-               joyinputs[i]= NULL;
+               joyinputs[i] = NULL;
                // remove all mappings from this port, except if custom
                if (prefs->jports[i].id != JPORT_CUSTOM) {
                        if (gameports)
@@ -4959,13 +5016,23 @@ static void compatibility_copy (struct uae_prefs *prefs, bool gameports)
                                case JSEM_MODE_MOUSE:
                                case JSEM_MODE_WHEELMOUSE:
                                default:
-                                       input_get_default_mouse (mice, joy, i, af, !gameports, mode != JSEM_MODE_MOUSE);
+                                       input_get_default_mouse (mice, joy, i, af, !gameports, mode != JSEM_MODE_MOUSE, false);
                                        joymodes[i] = JSEM_MODE_WHEELMOUSE;
                                        break;
                                case JSEM_MODE_LIGHTPEN:
-                                       input_get_default_lightpen (mice, joy, i, af, !gameports);
+                                       input_get_default_lightpen (mice, joy, i, af, !gameports, false);
                                        joymodes[i] = JSEM_MODE_LIGHTPEN;
                                        break;
+                               case JSEM_MODE_JOYSTICK:
+                               case JSEM_MODE_GAMEPAD:
+                               case JSEM_MODE_JOYSTICK_CD32:
+                                       input_get_default_joystick (mice, joy, i, af, mode, !gameports, true);
+                                       joymodes[i] = mode;
+                                       break;
+                               case JSEM_MODE_JOYSTICK_ANALOG:
+                                       input_get_default_joystick_analog (mice, joy, i, af, !gameports, true);
+                                       joymodes[i] = JSEM_MODE_JOYSTICK_ANALOG;
+                                       break;
                                }
                                _tcsncpy (prefs->jports[i].name, idev[IDTYPE_MOUSE].get_friendlyname (joy), MAX_JPORTNAME - 1);
                                _tcsncpy (prefs->jports[i].configname, idev[IDTYPE_MOUSE].get_uniquename (joy), MAX_JPORTNAME - 1);
@@ -4990,7 +5057,7 @@ static void compatibility_copy (struct uae_prefs *prefs, bool gameports)
                                default:
                                {
                                        bool iscd32 = mode == JSEM_MODE_JOYSTICK_CD32 || (mode == JSEM_MODE_DEFAULT && prefs->cs_cd32cd);
-                                       input_get_default_joystick (joysticks, joy, i, af, mode, !gameports);
+                                       input_get_default_joystick (joysticks, joy, i, af, mode, !gameports, false);
                                        if (iscd32)
                                                joymodes[i] = JSEM_MODE_JOYSTICK_CD32;
                                        else if (mode == JSEM_MODE_GAMEPAD)
@@ -5000,21 +5067,21 @@ static void compatibility_copy (struct uae_prefs *prefs, bool gameports)
                                        break;
                                }
                                case JSEM_MODE_JOYSTICK_ANALOG:
-                                       input_get_default_joystick_analog (joysticks, joy, i, af, !gameports);
+                                       input_get_default_joystick_analog (joysticks, joy, i, af, !gameports, false);
                                        joymodes[i] = JSEM_MODE_JOYSTICK_ANALOG;
                                        break;
                                case JSEM_MODE_MOUSE:
                                case JSEM_MODE_WHEELMOUSE:
-                                       input_get_default_mouse (joysticks, joy, i, af, !gameports, mode == JSEM_MODE_WHEELMOUSE);
+                                       input_get_default_mouse (joysticks, joy, i, af, !gameports, mode == JSEM_MODE_WHEELMOUSE, true);
                                        joymodes[i] = JSEM_MODE_WHEELMOUSE;
                                        break;
                                case JSEM_MODE_LIGHTPEN:
-                                       input_get_default_lightpen (joysticks, joy, i, af, !gameports);
+                                       input_get_default_lightpen (joysticks, joy, i, af, !gameports, true);
                                        joymodes[i] = JSEM_MODE_LIGHTPEN;
                                        break;
                                case JSEM_MODE_MOUSE_CDTV:
                                        joymodes[i] = JSEM_MODE_MOUSE_CDTV;
-                                       input_get_default_joystick (joysticks, joy, i, af, mode, !gameports);
+                                       input_get_default_joystick (joysticks, joy, i, af, mode, !gameports, false);
                                        break;
 
                                }
@@ -5124,7 +5191,7 @@ static void compatibility_copy (struct uae_prefs *prefs, bool gameports)
                        if (joy >= 0) {
                                if (gameports)
                                        cleardev (joysticks, joy);
-                               input_get_default_joystick (joysticks, joy, i, af, 0, !gameports);
+                               input_get_default_joystick (joysticks, joy, i, af, 0, !gameports, false);
                                _tcsncpy (prefs->jports[i].name, idev[IDTYPE_JOYSTICK].get_friendlyname (joy), MAX_JPORTNAME - 1);
                                _tcsncpy (prefs->jports[i].configname, idev[IDTYPE_JOYSTICK].get_uniquename (joy), MAX_JPORTNAME - 1);
                                used[joy] = 1;
@@ -5345,8 +5412,6 @@ static void resetinput (void)
                oright[i] = 0;
                otop[i] = 0;
                obot[i] = 0;
-               oldmx[i] = -1;
-               oldmy[i] = -1;
                joybutton[i] = 0;
                joydir[i] = 0;
                mouse_deltanoreset[i][0] = 0;
@@ -5356,6 +5421,8 @@ static void resetinput (void)
                mouse_deltanoreset[i][2] = 0;
                mouse_delta[i][2] = 0;
        }
+       lightpen_delta[0] = lightpen_delta[1] = 0;
+       lightpen_deltanoreset[0] = lightpen_deltanoreset[0] = 0;
        memset (keybuf, 0, sizeof keybuf);
        for (int i = 0; i < INPUT_QUEUE_SIZE; i++)
                input_queue[i].linecnt = input_queue[i].nextlinecnt = -1;
@@ -7267,5 +7334,6 @@ void clear_inputstate (void)
        for (int i = 0; i < MAX_JPORTS; i++) {
                horizclear[i] = 1;
                vertclear[i] = 1;
+               relativecount[i][0] = relativecount[i][1] = 0;
        }
 }
index c9675f5a80c0b7bd68331e8946f8b0fce4ad68b9..2ea9740dbbbc62ab6ab9c40e143a1ac5776f52ce 100644 (file)
@@ -4496,7 +4496,7 @@ void init_comp(void)
 
        for (i=0;i<VREGS;i++) {
                if (i<16) { /* First 16 registers map to 68k registers */
-                       live.state[i].mem=((uae_u32*)&regs)+i;
+                       live.state[i].mem=&regs.regs[i];
                        live.state[i].needflush=NF_TOMEM;
                        set_status(i,INMEM);
                }
@@ -4520,7 +4520,7 @@ void init_comp(void)
 
        for (i=0;i<VFREGS;i++) {
                if (i<8) { /* First 8 registers map to 68k FPU registers */
-                       live.fate[i].mem=(uae_u32*)(((fptype*)regs.fp)+i);
+                       live.fate[i].mem=(uae_u32*)(&regs.fp[i].fp);
                        live.fate[i].needflush=NF_TOMEM;
                        live.fate[i].status=INMEM;
                }
index e5d5c0c458a470baac38e2c3f9b180c1c70b33f1..a9827251e305a751994f874ea2ce0cf7c4bad625 100644 (file)
@@ -178,10 +178,21 @@ static void dummylog (int rw, uaecptr addr, int size, uae_u32 val, int ins)
        }
 }
 
-static uae_u32 dummy_get (uaecptr addr, int size)
+static void dummy_put (uaecptr addr, int size)
+{
+       if (gary_toenb && currprefs.mmu_model)
+               exception2 (addr, true, size, regs.s ? 4 : 0);
+}
+
+static uae_u32 dummy_get (uaecptr addr, int size, bool inst)
 {
        uae_u32 v = NONEXISTINGDATA;
 
+       if (gary_toenb && currprefs.mmu_model) {
+               exception2 (addr, false, size, (regs.s ? 4 : 0) | (inst ? 0 : 1));
+               return v;
+       }
+
        if (currprefs.cpu_model >= 68040)
                return v;
        if (!currprefs.cpu_compatible)
@@ -190,16 +201,15 @@ static uae_u32 dummy_get (uaecptr addr, int size)
                addr &= 0x00ffffff;
        if (addr >= 0x10000000)
                return v;
-       /* fixme: emulate correct hardware behavior */
-       if (munge24 (m68k_getpc () & 0xFFF80000) == 0xF80000)
-               return v;
-       if (size == 4) {
-               v = (regs.irc << 16) | regs.irc;
-       } else if (size == 2) {
-               v = regs.irc & 0xffff;
-       } else {
-               v = regs.irc;
-               v = (addr & 1) ? (v & 0xff) : ((v >> 8) & 0xff);
+       if (currprefs.cpu_model == 68000) {
+               if (size == 4) {
+                       v = (regs.db << 16) | regs.db;
+               } else if (size == 2) {
+                       v = regs.db & 0xffff;
+               } else {
+                       v = regs.db;
+                       v = (addr & 1) ? (v & 0xff) : ((v >> 8) & 0xff);
+               }
        }
 #if 0
        if (addr >= 0x10000000)
@@ -215,7 +225,7 @@ static uae_u32 REGPARAM2 dummy_lget (uaecptr addr)
 #endif
        if (currprefs.illegal_mem)
                dummylog (0, addr, 4, 0, 0);
-       return dummy_get (addr, 4);
+       return dummy_get (addr, 4, false);
 }
 uae_u32 REGPARAM2 dummy_lgeti (uaecptr addr)
 {
@@ -224,7 +234,7 @@ uae_u32 REGPARAM2 dummy_lgeti (uaecptr addr)
 #endif
        if (currprefs.illegal_mem)
                dummylog (0, addr, 4, 0, 1);
-       return dummy_get (addr, 4);
+       return dummy_get (addr, 4, true);
 }
 
 static uae_u32 REGPARAM2 dummy_wget (uaecptr addr)
@@ -240,7 +250,7 @@ static uae_u32 REGPARAM2 dummy_wget (uaecptr addr)
 #endif
        if (currprefs.illegal_mem)
                dummylog (0, addr, 2, 0, 0);
-       return dummy_get (addr, 2);
+       return dummy_get (addr, 2, false);
 }
 uae_u32 REGPARAM2 dummy_wgeti (uaecptr addr)
 {
@@ -249,7 +259,7 @@ uae_u32 REGPARAM2 dummy_wgeti (uaecptr addr)
 #endif
        if (currprefs.illegal_mem)
                dummylog (0, addr, 2, 0, 1);
-       return dummy_get (addr, 2);
+       return dummy_get (addr, 2, true);
 }
 
 static uae_u32 REGPARAM2 dummy_bget (uaecptr addr)
@@ -259,7 +269,7 @@ static uae_u32 REGPARAM2 dummy_bget (uaecptr addr)
 #endif
        if (currprefs.illegal_mem)
                dummylog (0, addr, 1, 0, 0);
-       return dummy_get (addr, 1);
+       return dummy_get (addr, 1, false);
 }
 
 static void REGPARAM2 dummy_lput (uaecptr addr, uae_u32 l)
@@ -269,6 +279,7 @@ static void REGPARAM2 dummy_lput (uaecptr addr, uae_u32 l)
 #endif
        if (currprefs.illegal_mem)
                dummylog (1, addr, 4, l, 0);
+       dummy_put (addr, 4);
 }
 static void REGPARAM2 dummy_wput (uaecptr addr, uae_u32 w)
 {
@@ -277,6 +288,7 @@ static void REGPARAM2 dummy_wput (uaecptr addr, uae_u32 w)
 #endif
        if (currprefs.illegal_mem)
                dummylog (1, addr, 2, w, 0);
+       dummy_put (addr, 2);
 }
 static void REGPARAM2 dummy_bput (uaecptr addr, uae_u32 b)
 {
@@ -285,6 +297,7 @@ static void REGPARAM2 dummy_bput (uaecptr addr, uae_u32 b)
 #endif
        if (currprefs.illegal_mem)
                dummylog (1, addr, 1, b, 0);
+       dummy_put (addr, 1);
 }
 
 static int REGPARAM2 dummy_check (uaecptr addr, uae_u32 size)
index c7a27d8413bf62ff1e7b6419095f4c098cf446d3..8c9906ef69fc342f23d9e02f98c3bddec5cdea60 100644 (file)
@@ -11,8 +11,7 @@
 
 #ifdef NCR
 
-#define NCR_LOG 1
-#define NCR_DEBUG 1
+#define NCR_DEBUG 0
 
 #include "options.h"
 #include "uae.h"
@@ -29,9 +28,6 @@
 #include "qemuvga\queue.h"
 #include "qemuvga\scsi\scsi.h"
 
-#define NCRNAME _T("NCR53C710")
-#define NCR_REGS 0x40
-
 #define ROM_VECTOR 0x0200
 #define ROM_OFFSET 0x0000
 #define ROM_SIZE 32768
@@ -39,7 +35,7 @@
 #define BOARD_SIZE 16777216
 
 #define A4091_IO_OFFSET 0x00800000
-#define A4091_IO_SWAP 0x00840000
+#define A4091_IO_ALT 0x00840000
 #define A4091_IO_END 0x00880000
 #define A4091_IO_MASK 0xff
 
@@ -48,7 +44,7 @@
 static uae_u8 *rom;
 static int board_mask;
 static int configured;
-static uae_u8 acmemory[100];
+static uae_u8 acmemory[128];
 
 static DeviceState devobject;
 static SCSIDevice *scsid[8];
@@ -64,7 +60,9 @@ void pci_set_irq(PCIDevice *pci_dev, int level)
 void scsi_req_continue(SCSIRequest *req)
 {
        struct scsi_data *sd = (struct scsi_data*)req->dev->handle;
-       if (sd->data_len) {
+       if (sd->data_len < 0) {
+               lsi_command_complete (req, sd->status, 0);
+       } else if (sd->data_len) {
                lsi_transfer_data (req, sd->data_len);
        } else {
                if (sd->direction > 0)
@@ -122,7 +120,6 @@ void scsi_req_cancel(SCSIRequest *req)
        write_log (_T("scsi_req_cancel\n"));
 }
 
-
 static uae_u8 read_rombyte (uaecptr addr)
 {
        uae_u8 v = rom[addr];
@@ -147,7 +144,6 @@ int pci_dma_rw(PCIDevice *dev, dma_addr_t addr, void *buf, dma_addr_t len, DMADi
        return 0;
 }
 
-
 static uaecptr beswap (uaecptr addr)
 {
        return (addr & ~3) | (3 - (addr & 3));
@@ -198,12 +194,12 @@ static uae_u32 REGPARAM2 ncr_lget (uaecptr addr)
        special_mem |= S_READ;
 #endif
        addr &= board_mask;
-       if (addr >= A4091_IO_SWAP) {
-               v = (ncr_bget2 (addr + 3) << 24) | (ncr_bget2 (addr + 2) << 16) |
-                       (ncr_bget2 (addr + 1) << 8) | (ncr_bget2 (addr + 0));
+       if (addr >= A4091_IO_ALT) {
+               v = (ncr_bget2 (addr + 3) << 0) | (ncr_bget2 (addr + 2) << 8) |
+                       (ncr_bget2 (addr + 1) << 16) | (ncr_bget2 (addr + 0) << 24);
        } else {
-               v = (ncr_bget2 (addr + 0) << 24) | (ncr_bget2 (addr + 1) << 16) |
-                       (ncr_bget2 (addr + 2) << 8) | (ncr_bget2 (addr + 3));
+               v = (ncr_bget2 (addr + 3) << 0) | (ncr_bget2 (addr + 2) << 8) |
+                       (ncr_bget2 (addr + 1) << 16) | (ncr_bget2 (addr + 0) << 24);
        }
 #if NCR_DEBUG > 0
        if (addr < ROM_VECTOR)
@@ -253,19 +249,21 @@ static void REGPARAM2 ncr_lput (uaecptr addr, uae_u32 l)
        if (addr < ROM_VECTOR)
                write_log (_T("ncr_lput %08X=%08X PC=%08X\n"), addr, l, M68K_GETPC);
 #endif
-       if (addr >= A4091_IO_SWAP) {
+       if (addr >= A4091_IO_ALT) {
                ncr_bput2 (addr + 3, l >> 0);
                ncr_bput2 (addr + 2, l >> 8);
                ncr_bput2 (addr + 1, l >> 16);
                ncr_bput2 (addr + 0, l >> 24);
        } else {
-               ncr_bput2 (addr + 0, l >> 24);
-               ncr_bput2 (addr + 1, l >> 16);
-               ncr_bput2 (addr + 2, l >> 8);
                ncr_bput2 (addr + 3, l >> 0);
+               ncr_bput2 (addr + 2, l >> 8);
+               ncr_bput2 (addr + 1, l >> 16);
+               ncr_bput2 (addr + 0, l >> 24);
        }
 }
 
+static uae_u32 expamem_hi, expamem_lo;
+
 static void REGPARAM2 ncr_wput (uaecptr addr, uae_u32 w)
 {
 #ifdef JIT
@@ -277,18 +275,35 @@ static void REGPARAM2 ncr_wput (uaecptr addr, uae_u32 w)
        if (addr < ROM_VECTOR)
                write_log (_T("ncr_wput %04X=%04X PC=%08X\n"), addr, w & 65535, M68K_GETPC);
 #endif
-       if (addr == 0x44 && !configured) {
-               uae_u32 value = gfxmem_bank.start + ((currprefs.rtgmem_size + 0xffffff) & ~0xffffff);
-               if (value < 0x10000000)
-                       value = 0x10000000;
-               value >>= 16;
-               chipmem_wput (regs.regs[11] + 0x20, value);
-               chipmem_wput (regs.regs[11] + 0x28, value);
-               map_banks (&ncr_bank, value, BOARD_SIZE >> 16, 0);
-               board_mask = 0x00ffffff;
-               write_log (_T("A4091 Z3 autoconfigured at %04X0000\n"), value);
-               configured = 1;
-               expamem_next();
+       if (!configured) {
+               uae_u32 value;
+               switch (addr)
+               {
+                       case 0x44:
+                       // yes, this could be much better..
+                       if (currprefs.jit_direct_compatible_memory) {
+                               value = gfxmem_bank.start + ((currprefs.rtgmem_size + 0xffffff) & ~0xffffff);
+                               if (value < 0x10000000) {
+                                       value = 0x10000000;
+                                       if (value < z3fastmem_bank.start + currprefs.z3fastmem_size)
+                                               value = z3fastmem_bank.start + currprefs.z3fastmem_size;
+                                       if (value < z3fastmem2_bank.start + currprefs.z3fastmem2_size)
+                                               value = z3fastmem2_bank.start + currprefs.z3fastmem2_size;
+                               }
+                               value >>= 16;
+                               chipmem_wput (regs.regs[11] + 0x20, value);
+                               chipmem_wput (regs.regs[11] + 0x28, value);
+                       } else {
+                               expamem_hi = w & 0xff00;
+                               value = expamem_hi | (expamem_lo >> 4);
+                       }
+                       map_banks (&ncr_bank, value, BOARD_SIZE >> 16, 0);
+                       board_mask = 0x00ffffff;
+                       write_log (_T("A4091 Z3 autoconfigured at %04X0000\n"), value);
+                       configured = 1;
+                       expamem_next();
+                       break;
+               }
                return;
        }
        ncr_bput2 (addr, w >> 8);
@@ -302,14 +317,20 @@ static void REGPARAM2 ncr_bput (uaecptr addr, uae_u32 b)
 #endif
        b &= 0xff;
        addr &= board_mask;
-       if (addr == 0x4c && !configured) {
-               write_log (_T("A4091 AUTOCONFIG SHUT-UP!\n"));
-               configured = 1;
-               expamem_next ();
+       if (!configured) {
+               switch (addr)
+               {
+                       case 0x4c:
+                       write_log (_T("A4091 AUTOCONFIG SHUT-UP!\n"));
+                       configured = 1;
+                       expamem_next ();
+                       break;
+                       case 0x48:
+                       expamem_lo = b & 0xff;
+                       break;
+               }
                return;
        }
-       if (!configured)
-               return;
        ncr_bput2 (addr, b);
 }
 
@@ -342,28 +363,13 @@ void ncr_autoconfig_init (void)
        int i;
 
        configured = 0;
-       memset (acmemory, 0xff, 100);
-       ew (0x00, 0x80 | 0x10 | 0x00);
-       ew (0x08, 0x80 | 0x20 | 0x10);
-
-       /* A4091 hardware id */
-       ew (0x04, 0x54);
-       /* commodore's manufacturer id */
-       ew (0x10, 0x02);
-       ew (0x14, 0x02);
-       /* rom vector */
-       ew (0x28, ROM_VECTOR >> 8);
-       ew (0x2c, ROM_VECTOR);
-
-       ew (0x18, 0x00); /* ser.no. Byte 0 */
-       ew (0x1c, 0x00); /* ser.no. Byte 1 */
-       ew (0x20, 0x00); /* ser.no. Byte 2 */
-       ew (0x24, 0x00); /* ser.no. Byte 3 */
 
        roms[0] = 58;
        roms[1] = 57;
        roms[2] = -1;
 
+       memset (acmemory, 0xff, sizeof acmemory);
+
        struct zfile *z = read_rom_name (currprefs.a4091romfile);
        if (!z) {
                struct romlist *rl = getromlistbyids(roms);
@@ -380,6 +386,11 @@ void ncr_autoconfig_init (void)
                        zfile_fread (&b, 1, 1, z);
                        rom[i * 4 + 0] = b;
                        rom[i * 4 + 2] = b << 4;
+                       if (i < 0x20) {
+                               acmemory[i * 4 + 0] = b;
+                       } else if (i >= 0x40 && i < 0x60) {
+                               acmemory[(i - 0x40) * 4 + 2] = b;
+                       }
                }
                zfile_fclose(z);
        } else {
index 4677c5945fa14e999ab7c4fe4f974250656832a8..fcbe78cb356b7557fbc7d94c3ddea7997fd67363 100644 (file)
@@ -166,7 +166,6 @@ static void (*x2_do_cycles_pre)(unsigned long);
 static void (*x2_do_cycles_post)(unsigned long, uae_u32);
 
 uae_u32 (*x_prefetch)(int);
-uae_u32 (*x_prefetch_long)(int);
 uae_u32 (*x_next_iword)(void);
 uae_u32 (*x_next_ilong)(void);
 uae_u32 (*x_get_ilong)(int);
@@ -285,7 +284,6 @@ static bool check_trace (void)
                cputrace.cyclecounter || cputrace.cyclecounter_pre || cputrace.cyclecounter_post)
                return false;
        x_prefetch = x2_prefetch;
-       x_prefetch_long = x2_prefetch_long;
        x_get_ilong = x2_get_ilong;
        x_get_iword = x2_get_iword;
        x_get_ibyte = x2_get_ibyte;
@@ -368,23 +366,6 @@ static uae_u32 cputracefunc2_x_prefetch (int o)
        }
        return v;
 }
-static uae_u32 cputracefunc_x_prefetch_long (int o)
-{
-       uae_u32 pc = m68k_getpc ();
-       set_trace (pc + o, 2, 4);
-       uae_u32 v = x2_prefetch_long (o);
-       add_trace (pc + o, v, 2, 4);
-       return v;
-}
-static uae_u32 cputracefunc2_x_prefetch_long (int o)
-{
-       uae_u32 v;
-       if (get_trace (m68k_getpc () + o, 2, 4, &v)) {
-               v = x2_prefetch_long (o);
-               check_trace2 ();
-       }
-       return v;
-}
 
 static uae_u32 cputracefunc_x_next_iword (void)
 {
@@ -692,7 +673,6 @@ static void set_x_funcs (void)
        if (currprefs.mmu_model) {
                if (currprefs.cpu_model == 68060) {
                        x_prefetch = get_iword_mmu060;
-                       x_prefetch_long = get_ilong_mmu060;
                        x_get_ilong = get_ilong_mmu060;
                        x_get_iword = get_iword_mmu060;
                        x_get_ibyte = get_ibyte_mmu060;
@@ -706,7 +686,6 @@ static void set_x_funcs (void)
                        x_get_byte = get_byte_mmu060;
                } else if (currprefs.cpu_model == 68040) {
                        x_prefetch = get_iword_mmu040;
-                       x_prefetch_long = get_ilong_mmu040;
                        x_get_ilong = get_ilong_mmu040;
                        x_get_iword = get_iword_mmu040;
                        x_get_ibyte = get_ibyte_mmu040;
@@ -720,7 +699,6 @@ static void set_x_funcs (void)
                        x_get_byte = get_byte_mmu040;
                } else {
                        x_prefetch = get_iword_mmu030;
-                       x_prefetch_long = get_ilong_mmu030;
                        x_get_ilong = get_ilong_mmu030;
                        x_get_iword = get_iword_mmu030;
                        x_get_ibyte = get_ibyte_mmu030;
@@ -740,7 +718,6 @@ static void set_x_funcs (void)
                // 68000/010
                if (currprefs.cpu_cycle_exact) {
                        x_prefetch = get_word_ce000_prefetch;
-                       x_prefetch_long = NULL;
                        x_get_ilong = NULL;
                        x_get_iword = get_wordi_ce000;
                        x_get_ibyte = NULL;
@@ -757,7 +734,6 @@ static void set_x_funcs (void)
                        x_do_cycles_post = do_cycles_ce_post;
                } else if (currprefs.cpu_compatible) {
                        x_prefetch = get_word_prefetch;
-                       x_prefetch_long = get_long_prefetch;
                        x_get_ilong = NULL;
                        x_get_iword = get_iword;
                        x_get_ibyte = get_ibyte;
@@ -774,7 +750,6 @@ static void set_x_funcs (void)
                        x_do_cycles_post = do_cycles_post;
                } else {
                        x_prefetch = NULL;
-                       x_prefetch_long = NULL;
                        x_get_ilong = get_ilong;
                        x_get_iword = get_iword;
                        x_get_ibyte = get_ibyte;
@@ -795,7 +770,6 @@ static void set_x_funcs (void)
                if (currprefs.cpu_compatible) {
                        if (currprefs.cpu_model == 68020 && !currprefs.cachesize) {
                                x_prefetch = get_word_prefetch;
-                               x_prefetch_long = get_long_prefetch;
                                x_get_ilong = get_long_020_prefetch;
                                x_get_iword = get_word_020_prefetch;
                                x_get_ibyte = NULL;
@@ -813,7 +787,6 @@ static void set_x_funcs (void)
                        } else {
                                // JIT or 68030+ does not have real prefetch only emulation
                                x_prefetch = NULL;
-                               x_prefetch_long = NULL;
                                x_get_ilong = get_ilong;
                                x_get_iword = get_iword;
                                x_get_ibyte = get_ibyte;
@@ -831,7 +804,6 @@ static void set_x_funcs (void)
                        }
                } else {
                        x_prefetch = NULL;
-                       x_prefetch_long = NULL;
                        x_get_ilong = get_ilong;
                        x_get_iword = get_iword;
                        x_get_ibyte = get_ibyte;
@@ -850,7 +822,6 @@ static void set_x_funcs (void)
                // 68020+ cycle exact
        } else if (currprefs.cpu_model == 68020) {
                x_prefetch = get_word_ce020_prefetch;
-               x_prefetch_long = NULL;
                x_get_ilong = get_long_ce020_prefetch;
                x_get_iword = get_word_ce020_prefetch;
                x_get_ibyte = NULL;
@@ -867,7 +838,6 @@ static void set_x_funcs (void)
                x_do_cycles_post = do_cycles_ce020_post;
        } else {
                x_prefetch = get_word_ce030_prefetch;
-               x_prefetch_long = NULL;
                x_get_ilong = get_long_ce030_prefetch;
                x_get_iword = get_word_ce030_prefetch;
                x_get_ibyte = NULL;
@@ -884,7 +854,6 @@ static void set_x_funcs (void)
                x_do_cycles_post = do_cycles_ce020_post;
        }
        x2_prefetch = x_prefetch;
-       x2_prefetch_long = x_prefetch_long;
        x2_get_ilong = x_get_ilong;
        x2_get_iword = x_get_iword;
        x2_get_ibyte = x_get_ibyte;
@@ -902,7 +871,6 @@ static void set_x_funcs (void)
 
        if (cpu_tracer > 0) {
                x_prefetch = cputracefunc_x_prefetch;
-               x_prefetch_long = cputracefunc_x_prefetch_long;
                x_get_ilong = cputracefunc_x_get_ilong;
                x_get_iword = cputracefunc_x_get_iword;
                x_get_ibyte = cputracefunc_x_get_ibyte;
@@ -920,7 +888,6 @@ static void set_x_funcs (void)
        } else if (cpu_tracer < 0) {
                if (!check_trace ()) {
                        x_prefetch = cputracefunc2_x_prefetch;
-                       x_prefetch_long = cputracefunc2_x_prefetch_long;
                        x_get_ilong = cputracefunc2_x_get_ilong;
                        x_get_iword = cputracefunc2_x_get_iword;
                        x_get_ibyte = cputracefunc2_x_get_ibyte;
@@ -2160,8 +2127,16 @@ static void Exception_build_stack_frame (uae_u32 oldpc, uae_u32 currpc, uae_u32
                                x_put_long (m68k_areg (regs, 7), mmu030_ad[i].val);
                        }
                        while (i < 9) {
+                               uae_u32 v = 0;
                                m68k_areg (regs, 7) -= 4;
-                               x_put_long (m68k_areg (regs, 7), 0);
+                               // mmu030_idx is always small enough instruction is FMOVEM.
+                               if (mmu030_state[1] & MMU030_STATEFLAG1_FMOVEM) {
+                                       if (i == 7)
+                                               v = mmu030_fmovem_store[0];
+                                       else if (i == 8)
+                                               v = mmu030_fmovem_store[1];
+                               }
+                               x_put_long (m68k_areg (regs, 7), v);
                                i++;
                        }
                         // version & internal information (We store index here)
@@ -2252,6 +2227,11 @@ static void Exception_mmu030 (int nr, uaecptr oldpc)
     newpc = x_get_long (regs.vbr + 4 * nr);
 
        if (regs.m && nr >= 24 && nr < 32) { /* M + Interrupt */
+        Exception_build_stack_frame (oldpc, currpc, regs.mmu_ssw, nr, 0x0);
+               MakeSR ();
+               regs.m = 0;
+               regs.msp = m68k_areg (regs, 7);
+               m68k_areg (regs, 7) = regs.isp;
         Exception_build_stack_frame (oldpc, currpc, regs.mmu_ssw, nr, 0x1);
     } else if (nr ==5 || nr == 6 || nr == 7 || nr == 9 || nr == 56) {
         Exception_build_stack_frame (oldpc, currpc, regs.mmu_ssw, nr, 0x2);
@@ -2488,6 +2468,7 @@ static void Exception_normal (int nr)
                        x_put_word (m68k_areg (regs, 7), regs.sr);
                        regs.sr |= (1 << 13);
                        regs.msp = m68k_areg (regs, 7);
+                       regs.m = 0;
                        m68k_areg (regs, 7) = regs.isp;
                        m68k_areg (regs, 7) -= 2;
                        x_put_word (m68k_areg (regs, 7), 0x1000 + nr * 4);
@@ -4089,7 +4070,7 @@ static void m68k_run_2p (void)
 /* Same thing, but don't use prefetch to get opcode.  */
 static void m68k_run_2 (void)
 {
-       static int done;
+//     static int done;
        struct regstruct *r = &regs;
 
        for (;;) {
@@ -4106,8 +4087,8 @@ static void m68k_run_2 (void)
                        used[opcode] = 1;
                }
 #endif 
-               if (done)
-                       write_log (_T("%08x %04X %d "), r->instruction_pc, opcode, cpu_cycles);
+//             if (done)
+//                     write_log (_T("%08x %04X %d "), r->instruction_pc, opcode, cpu_cycles);
 
                do_cycles (cpu_cycles);
                cpu_cycles = (*cpufunctbl[opcode])(opcode);
@@ -4708,7 +4689,7 @@ void m68k_dumpstate (uaecptr pc, uaecptr *nextpc)
        if (currprefs.fpu_model) {
                uae_u32 fpsr;
                for (i = 0; i < 8; i++){
-                       console_out_f (_T("FP%d: %g "), i, regs.fp[i]);
+                       console_out_f (_T("FP%d: %g "), i, regs.fp[i].fp);
                        if ((i & 3) == 3)
                                console_out_f (_T("\n"));
                }
@@ -4721,6 +4702,10 @@ void m68k_dumpstate (uaecptr pc, uaecptr *nextpc)
                        (fpsr & 0x1000000) != 0);
        }
 #endif
+       if (currprefs.mmu_model == 68030) {
+               console_out_f (_T("SRP: %llX CRP: %llX\n"), srp_030, crp_030);
+               console_out_f (_T("TT0: %08X TT1: %08X TC: %08X\n"), tt0_030, tt1_030, tc_030);
+       }
        if (currprefs.cpu_compatible && currprefs.cpu_model == 68000) {
                struct instr *dp;
                struct mnemolookup *lookup1, *lookup2;
index e4a42942d1fab229311b5355e7461aca591018ba..07c41a31fbf21bd219bc01b31a127da62deeed29 100644 (file)
@@ -1033,7 +1033,7 @@ static void ListboxEndEdit(HWND hwnd, BOOL acceptinput)
                        errno = 0;
                        value = _tcstod(txt, &stopstr);
                        if (_tcslen(stopstr) == 0 && errno == 0)
-                               regs.fp[index] = _tcstod(txt, &stopstr);
+                               regs.fp[index].fp = _tcstod(txt, &stopstr);
                }
                else {
                        int bytes, i, offset = -1;
@@ -1307,14 +1307,14 @@ static void set_fpsr (uae_u32 x)
        regs.fpsr = x;
 
        if (x & 0x01000000) {
-               regs.fp_result = *fp_nan;
+               regs.fp_result.fp = *fp_nan;
        }
        else if (x & 0x04000000)
-               regs.fp_result = 0;
+               regs.fp_result.fp = 0;
        else if (x & 0x08000000)
-               regs.fp_result = -1;
+               regs.fp_result.fp = -1;
        else
-               regs.fp_result = 1;
+               regs.fp_result.fp = 1;
 }
 
 static void ToggleFPSRFlag(HWND hwnd, int x, int y)
index 3e7e67b8eb37f6f3e0f2214c4a9f7c181d6e018a..ae1a2e1c1a601fe1ad3bc1acb3d461dd28cc5524 100644 (file)
@@ -369,6 +369,8 @@ static void fixthings_mouse (struct didata *did)
 {
        int i;
 
+       if (did == NULL)
+               return;
        did->buttons_real = did->buttons;
        for (i = 0; i < did->axles; i++) {
                if (did->axissort[i] == -97)
@@ -1870,6 +1872,7 @@ static void initialize_windowsmouse (void)
        for (i = 0; i < 1; i++) {
                if (num_mouse >= MAX_INPUT_DEVICES)
                        return;
+               cleardid (did);
                num_mouse++;
                name = (i == 0) ? _T("Windows mouse") : _T("Mousehack mouse");
                did->connection = DIDC_WIN;
@@ -3857,13 +3860,19 @@ static void setid (struct uae_input_device *uid, int i, int slot, int sub, int p
                uid[i].flags[slot][sub] |= ID_FLAG_INVERTTOGGLE;
 }
 
-int input_get_default_mouse (struct uae_input_device *uid, int i, int port, int af, bool gp, bool wheel)
+int input_get_default_mouse (struct uae_input_device *uid, int i, int port, int af, bool gp, bool wheel, bool joymouseswap)
 {
-       struct didata *did;
+       struct didata *did = NULL;
 
-       if (i >= num_mouse)
-               return 0;
-       did = &di_mouse[i];
+       if (!joymouseswap) {
+               if (i >= num_mouse)
+                       return 0;
+               did = &di_mouse[i];
+       } else {
+               if (i >= num_joystick)
+                       return 0;
+               did = &di_joystick[i];
+       }
        setid (uid, i, ID_AXIS_OFFSET + 0, 0, port, port ? INPUTEVENT_MOUSE2_HORIZ : INPUTEVENT_MOUSE1_HORIZ, gp);
        setid (uid, i, ID_AXIS_OFFSET + 1, 0, port, port ? INPUTEVENT_MOUSE2_VERT : INPUTEVENT_MOUSE1_VERT, gp);
        if (wheel)
@@ -3886,13 +3895,19 @@ int input_get_default_mouse (struct uae_input_device *uid, int i, int port, int
        return 0;
 }
 
-int input_get_default_lightpen (struct uae_input_device *uid, int i, int port, int af, bool gp)
+int input_get_default_lightpen (struct uae_input_device *uid, int i, int port, int af, bool gp, bool joymouseswap)
 {
-       struct didata *did;
+       struct didata *did = NULL;
 
-       if (i >= num_mouse)
-               return 0;
-       did = &di_mouse[i];
+       if (!joymouseswap) {
+               if (i >= num_mouse)
+                       return 0;
+               did = &di_mouse[i];
+       } else {
+               if (i >= num_joystick)
+                       return 0;
+               did = &di_joystick[i];
+       }
        setid (uid, i, ID_AXIS_OFFSET + 0, 0, port, INPUTEVENT_LIGHTPEN_HORIZ, gp);
        setid (uid, i, ID_AXIS_OFFSET + 1, 0, port, INPUTEVENT_LIGHTPEN_VERT, gp);
        setid (uid, i, ID_BUTTON_OFFSET + 0, 0, port, port ? INPUTEVENT_JOY2_3RD_BUTTON : INPUTEVENT_JOY1_3RD_BUTTON, gp);
@@ -3901,15 +3916,21 @@ int input_get_default_lightpen (struct uae_input_device *uid, int i, int port, i
        return 0;
 }
 
-int input_get_default_joystick (struct uae_input_device *uid, int i, int port, int af, int mode, bool gp)
+int input_get_default_joystick (struct uae_input_device *uid, int i, int port, int af, int mode, bool gp, bool joymouseswap)
 {
        int j;
-       struct didata *did;
+       struct didata *did = NULL;
        int h, v;
 
-       if (i >= num_joystick)
-               return 0;
-       did = &di_joystick[i];
+       if (joymouseswap) {
+               if (i >= num_mouse)
+                       return 0;
+               did = &di_mouse[i];
+       } else {
+               if (i >= num_joystick)
+                       return 0;
+               did = &di_joystick[i];
+       }
        if (mode == JSEM_MODE_MOUSE_CDTV) {
                h = INPUTEVENT_MOUSE_CDTV_HORIZ;
                v = INPUTEVENT_MOUSE_CDTV_VERT;
@@ -3943,6 +3964,7 @@ int input_get_default_joystick (struct uae_input_device *uid, int i, int port, i
                        j++;
                }
        }
+
        if (mode == JSEM_MODE_JOYSTICK_CD32) {
                setid (uid, i, ID_BUTTON_OFFSET + 0, 0, port, port ? INPUTEVENT_JOY2_CD32_RED : INPUTEVENT_JOY1_CD32_RED, af, gp);
                if (isrealbutton (did, 1)) {
@@ -3964,14 +3986,20 @@ int input_get_default_joystick (struct uae_input_device *uid, int i, int port, i
        return 0;
 }
 
-int input_get_default_joystick_analog (struct uae_input_device *uid, int i, int port, int af, bool gp)
+int input_get_default_joystick_analog (struct uae_input_device *uid, int i, int port, int af, bool gp, bool joymouseswap)
 {
        int j;
        struct didata *did;
 
-       if (i >= num_joystick)
-               return 0;
-       did = &di_joystick[i];
+       if (joymouseswap) {
+               if (i >= num_mouse)
+                       return 0;
+               did = &di_mouse[i];
+       } else {
+               if (i >= num_joystick)
+                       return 0;
+               did = &di_joystick[i];
+       }
        setid (uid, i, ID_AXIS_OFFSET + 0, 0, port, port ? INPUTEVENT_JOY2_HORIZ_POT : INPUTEVENT_JOY1_HORIZ_POT, gp);
        setid (uid, i, ID_AXIS_OFFSET + 1, 0, port, port ? INPUTEVENT_JOY2_VERT_POT : INPUTEVENT_JOY1_VERT_POT, gp);
        setid (uid, i, ID_BUTTON_OFFSET + 0, 0, port, port ? INPUTEVENT_JOY2_LEFT : INPUTEVENT_JOY1_LEFT, af, gp);
@@ -3981,6 +4009,7 @@ int input_get_default_joystick_analog (struct uae_input_device *uid, int i, int
                setid (uid, i, ID_BUTTON_OFFSET + 2, 0, port, port ? INPUTEVENT_JOY2_UP : INPUTEVENT_JOY1_UP, gp);
        if (isrealbutton (did, 3))
                setid (uid, i, ID_BUTTON_OFFSET + 3, 0, port, port ? INPUTEVENT_JOY2_DOWN : INPUTEVENT_JOY1_DOWN, gp);
+
        for (j = 2; j < MAX_MAPPINGS - 1; j++) {
                int type = did->axistype[j];
                if (type == AXISTYPE_POV_X) {
@@ -3989,6 +4018,7 @@ int input_get_default_joystick_analog (struct uae_input_device *uid, int i, int
                        j++;
                }
        }
+
        if (i == 0)
                return 1;
        return 0;
index 961e208348f3e9ef6b1297400d56e552f6f1574b..eae3cb4e258998e2743934436c1d560a79d397d3 100644 (file)
@@ -79,14 +79,15 @@ int harddrive_dangerous = 0x1234dead;
 int do_rdbdump;
 static struct uae_driveinfo uae_drives[MAX_FILESYSTEM_UNITS];
 
-#if 0
+#if 1
 static void fixdrive (struct hardfiledata *hfd)
 {
        uae_u8 data[512];
-       struct zfile *zf = zfile_fopen (_T("d:\\amiga\\hdf\\a500supradrive.hdf"), _T("rb"));
-       for (int i = 0; i < 0x30000 / 512; i++) {
-               zfile_fread (data, 1, 512, zf);
-               hdf_write (hfd, data, i * 512, 512);
+       int i = 0;
+       struct zfile *zf = zfile_fopen (_T("d:\\amiga\\hdf\\test_16MB_hdf.bin"), _T("rb"));
+       while (zfile_fread (data, 1, 512, zf)) {
+               hdf_write (hfd, data, i, 512);
+               i += 512;
        }
        zfile_fclose (zf);
 
@@ -688,7 +689,9 @@ int hdf_open_target (struct hardfiledata *hfd, const TCHAR *pname)
                        }
                        hfd->handle_valid = HDF_HANDLE_WIN32;
                        hfd->emptyname = my_strdup (name);
-                       //fixdrive (hfd);
+
+                       fixdrive (hfd);
+
                } else {
                        hfd->flags = HFD_FLAGS_REALDRIVE;
                        hfd->drive_empty = -1;
index db3bf5fecd5b6019a4ab5cab5790efac4111439e..f0b9e18ea9ea0c86ea398f15808736e18ae72e6f 100644 (file)
@@ -47,13 +47,13 @@ STATIC_INLINE void from_exten(long double src, uae_u32 * wrd1, uae_u32 * wrd2, u
 #define HAVE_to_single
 STATIC_INLINE double to_single (uae_u32 longvalue)
 {
-    double floatfake;
+       double floatfake;
 
-    __asm {
-    fld     dword ptr   longvalue;
-    fstp    qword ptr   floatfake;
+       __asm {
+               fld dword ptr longvalue;
+               fstp qword ptr floatfake;
     }
-    return(floatfake);
+       return floatfake;
 }
 #endif
 
@@ -61,46 +61,60 @@ STATIC_INLINE double to_single (uae_u32 longvalue)
 #define HAVE_from_single
 STATIC_INLINE uae_u32 from_single (double floatfake)
 {
-    uae_u32 longvalue;
+       uae_u32 longvalue;
 
-    __asm {
-    fld     qword ptr   floatfake;
-    fstp    dword ptr   longvalue;
-    }
-    return(longvalue);
+       __asm {
+               fld qword ptr floatfake;
+               fstp dword ptr longvalue;
+       }
+       return longvalue;
 }
 #endif
 
 #ifndef HAVE_to_exten
 #define HAVE_to_exten
-STATIC_INLINE double to_exten(uae_u32 wrd1, uae_u32 wrd2, uae_u32 wrd3)
+STATIC_INLINE void to_exten(fpdata *fpd, uae_u32 wrd1, uae_u32 wrd2, uae_u32 wrd3)
 {
-    uae_u32 longarray[] = {wrd3,wrd2,((wrd1>>16)&0xffff)}; // little endian
-    double  extenfake;
-
-    __asm {
-    fld     tbyte ptr   longarray;
-    fstp    qword ptr   extenfake;
-    }
-    return(extenfake);
+       uae_u32 longarray[] = { wrd3, wrd2, ((wrd1 >> 16) & 0xffff) }; // little endian
+       double  extenfake;
+
+       __asm {
+               fld tbyte ptr longarray;
+               fstp qword ptr extenfake;
+       }
+       fpd->fp = extenfake;
+#ifdef USE_SOFT_LONG_DOUBLE
+       fpd->fpe = ((uae_u64)wrd2 << 32) | wrd3;
+       fpd->fpm = wrd1;
+       fpd->fpx = true;
+#endif
 }
 #endif
 
 #ifndef HAVE_from_exten
 #define HAVE_from_exten
-STATIC_INLINE void from_exten(double src, uae_u32 * wrd1, uae_u32 * wrd2, uae_u32 * wrd3)
+STATIC_INLINE void from_exten(fpdata *fpd, uae_u32 * wrd1, uae_u32 * wrd2, uae_u32 * wrd3)
 {
-    uae_u32 longarray[3], *srcarray = (uae_u32 *)&src;
-
-    __asm {
-    fld     qword ptr   src;
-    fstp    tbyte ptr   longarray;
-    }
-    *wrd1 = (longarray[2] & 0xffff) <<16;
-    *wrd2 =  longarray[1];
-    *wrd3 =  longarray[0]; // little endian
-    if (!srcarray[0] && (srcarray[1]==0x7ff00000 || srcarray[1]==0xfff00000))
-       *wrd2 = 0; // The MSB of the mantissa was set wrongly for infinity, causing a NaN
+#ifdef USE_SOFT_LONG_DOUBLE
+       if (fpd->fpx) {
+               *wrd1 = fpd->fpm;
+               *wrd2 = fpd->fpe >> 32;
+               *wrd3 = (uae_u32)fpd->fpe;
+       } else
+#endif
+       {
+               fptype src = fpd->fp;
+               uae_u32 longarray[3], *srcarray = (uae_u32 *)&src;
+               __asm {
+                       fld qword ptr src;
+                       fstp tbyte ptr longarray;
+               }
+               *wrd1 = (longarray[2] & 0xffff) <<16;
+               *wrd2 =  longarray[1];
+               *wrd3 =  longarray[0]; // little endian
+               if (!srcarray[0] && (srcarray[1] == 0x7ff00000 || srcarray[1] == 0xfff00000))
+                       *wrd2 = 0; // The MSB of the mantissa was set wrongly for infinity, causing a NaN
+       }
 }
 #endif
 #endif /* X86_MSVC_ASSEMBLY */
index 40694f96185e2c2167278f4db089583b4a5f78e9..8a56e37ba6219dcc37e53bb4b736fe761e26e674 100644 (file)
@@ -435,7 +435,7 @@ static uae_u8 *va (uae_u32 offset, uae_u32 len, DWORD alloc, DWORD protect)
 static int doinit_shm (void)
 {
        uae_u32 size, totalsize, z3size, natmemsize;
-       uae_u32 startbarrier, rtgbarrier, z3chipbarrier, rtgextra;
+       uae_u32 startbarrier;
        int rounds = 0;
        ULONG z3rtgmem_size;
 
@@ -448,23 +448,12 @@ static int doinit_shm (void)
 
                z3size = 0;
                size = 0x1000000;
-               rtgextra = 0;
-               z3chipbarrier = 0;
                startbarrier = changed_prefs.mbresmem_high_size == 128 * 1024 * 1024 ? 16 * 1024 * 1024 : 0;
-               rtgbarrier = si.dwPageSize;
                z3rtgmem_size = gfxboard_is_z3 (changed_prefs.rtgmem_type) ? changed_prefs.rtgmem_size : 0;
                if (changed_prefs.cpu_model >= 68020)
                        size = 0x10000000;
-               if (changed_prefs.z3fastmem_size || changed_prefs.z3fastmem2_size || changed_prefs.z3chipmem_size) {
+               if (changed_prefs.z3fastmem_size || changed_prefs.z3fastmem2_size || changed_prefs.z3chipmem_size)
                        z3size = changed_prefs.z3fastmem_size + changed_prefs.z3fastmem2_size + changed_prefs.z3chipmem_size + (changed_prefs.z3fastmem_start - 0x10000000);
-                       if (z3rtgmem_size) {
-                               rtgbarrier = 16 * 1024 * 1024 - ((changed_prefs.z3fastmem_size + changed_prefs.z3fastmem2_size) & 0x00ffffff);
-                       }
-                       if (changed_prefs.z3chipmem_size && (changed_prefs.z3fastmem_size || changed_prefs.z3fastmem2_size))
-                               z3chipbarrier = 16 * 1024 * 1024;
-               } else {
-                       rtgbarrier = 0;
-               }
                totalsize = size + z3size + z3rtgmem_size;
                while (totalsize > size64) {
                        int change = lowmem ();
@@ -479,13 +468,7 @@ static int doinit_shm (void)
                }
                natmemsize = size + z3size;
 
-               if (z3rtgmem_size) {
-                       rtgextra = si.dwPageSize;
-               } else {
-                       rtgbarrier = 0;
-                       rtgextra = 0;
-               }
-               if (startbarrier + natmemsize + z3chipbarrier + rtgbarrier + z3rtgmem_size + rtgextra + 16 * si.dwPageSize <= natmem_size)
+               if (startbarrier + natmemsize + z3rtgmem_size + 16 * si.dwPageSize <= natmem_size)
                        break;
                write_log (_T("NATMEM: %dM area failed to allocate, err=%d (Z3=%dM,RTG=%dM)\n"),
                        natmemsize >> 20, GetLastError (), (changed_prefs.z3fastmem_size + changed_prefs.z3fastmem2_size + changed_prefs.z3chipmem_size) >> 20, z3rtgmem_size >> 20);
@@ -500,7 +483,7 @@ static int doinit_shm (void)
        p96mem_offset = NULL;
        p96mem_size = z3rtgmem_size;
        if (changed_prefs.rtgmem_size && gfxboard_is_z3 (changed_prefs.rtgmem_type)) {
-               p96mem_offset = natmem_offset + natmemsize + startbarrier + rtgbarrier + z3chipbarrier;
+               p96mem_offset = natmem_offset + natmemsize + startbarrier;
        } else if (changed_prefs.rtgmem_size && !gfxboard_is_z3 (changed_prefs.rtgmem_type)) {
                p96mem_offset = natmem_offset + getz2rtgaddr ();
        }
index e72a942c06d5a29b6a4dcf445bfcf139316ad2e8..8481d9ba3b4af6da2099f2121a2fcda6c65a0426 100644 (file)
@@ -691,24 +691,21 @@ BEGIN
     CONTROL         "A600/A1200 IDE",IDC_CS_IDE1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,143,104,11
     CONTROL         "ROM Mirror (E0)",IDC_CS_KSMIRROR_E0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,157,104,11
     CONTROL         "KB Reset Warning",IDC_CS_RESETWARNING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,171,104,11
-    CONTROL         "A590/A2091 SCSI",IDC_CS_A2091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,216,104,11
-    CONTROL         "A4091 SCSI",IDC_CS_A4091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,229,104,11
     CONTROL         "A1000 Boot RAM/ROM",IDC_CS_A1000RAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,102,121,11
     CONTROL         "CD32 C2P",IDC_CS_CD32C2P,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,116,121,11
     CONTROL         "CDTV SRAM",IDC_CS_CDTVRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,129,121,11
     CONTROL         "A4000/A4000T IDE",IDC_CS_IDE2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,143,121,11
     CONTROL         "ROM Mirror (A8)",IDC_CS_KSMIRROR_A8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,157,121,11
     CONTROL         "No-EHB Denise",IDC_CS_NOEHB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,171,121,11
-    CONTROL         "A3000 SCSI",IDC_CS_DMAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,216,121,11
-    CONTROL         "CDTV SCSI",IDC_CS_CDTVSCSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,229,121,11
+    CONTROL         "A3000 WD33C93 SCSI",IDC_CS_DMAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,216,121,11
+    CONTROL         "CDTV WD33C93 SCSI",IDC_CS_CDTVSCSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,229,121,11
     CONTROL         "DF0: ID Hardware",IDC_CS_DF0IDHW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,102,125,11
     CONTROL         "CD32 NVRAM",IDC_CS_CD32NVRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,116,125,11
     CONTROL         "CDTV SRAM Expansion",IDC_CS_CDTVRAMEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,129,125,11
     CONTROL         "PCMCIA",IDC_CS_PCMCIA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,143,125,11
     CONTROL         "C00000 is Fast RAM",IDC_CS_SLOWISFAST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,157,125,11
     CONTROL         "A1000 Agnus (8361/8367)",IDC_CS_DIPAGNUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,171,125,11
-    CONTROL         "A4000T SCSI",IDC_CS_DMAC2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,216,125,11
-    CONTROL         "Include host SCSI devices",IDC_CS_SCSIMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,229,125,11
+    CONTROL         "A4000T NCR53C710 SCSI",IDC_CS_DMAC2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,171,216,125,11
     GROUPBOX        "Chipset Revision",IDC_STATIC,1,249,393,46
     CONTROL         "Ramsey revision:",IDC_CS_RAMSEY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,261,97,11
     CONTROL         "Fat Gary revision:",IDC_CS_FATGARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,275,97,11
@@ -719,7 +716,7 @@ BEGIN
     EDITTEXT        IDC_CS_AGNUSREV,311,260,45,13,ES_AUTOHSCROLL
     EDITTEXT        IDC_CS_DENISEREV,311,275,45,13,ES_AUTOHSCROLL
     CONTROL         "CIA TOD bug",IDC_CS_CIATODBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,184,104,11
-    GROUPBOX        "SCSI Hardware",IDC_STATIC,0,201,393,45
+    GROUPBOX        "Internal SCSI Hardware",IDC_STATIC,0,201,393,45
 END
 
 IDD_AVIOUTPUT DIALOGEX 0, 0, 396, 260
@@ -1055,7 +1052,7 @@ BEGIN
     CTEXT           "Enter address",IDC_DBG_ADDRINPUTTXT,20,1,100,10,SS_CENTERIMAGE | WS_TABSTOP
 END
 
-IDD_EXPANSION DIALOGEX 0, 0, 396, 278
+IDD_EXPANSION DIALOGEX 0, 0, 396, 289
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
@@ -1085,11 +1082,11 @@ BEGIN
     COMBOBOX        IDC_RTG_BUFFERCNT,153,162,84,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
     CTEXT           "Aspect ratio:",IDC_STATIC,282,149,83,10,SS_CENTERIMAGE
     COMBOBOX        IDC_RTG_SCALE_ASPECTRATIO,282,162,84,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
-    GROUPBOX        "Miscellaneous Expansions",IDC_STATIC,1,197,172,80
+    GROUPBOX        "Miscellaneous Expansions",IDC_STATIC,1,197,172,87
     CONTROL         "Catweasel Z2 emulation [] Catweasel MK2 Zorro II card emulation. Physical Windows compatible Catweasel card and drivers required.",IDC_CATWEASEL,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,216,147,11
     CONTROL         "uaescsi.device",IDC_SCSIDEVICE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,229,147,11
-    GROUPBOX        "Network",IDC_STATIC,181,197,213,80
+    GROUPBOX        "Network",IDC_STATIC,181,197,213,86
     CONTROL         "bsdsocket.library [] bsdsocket network library emulation.",IDC_SOCKETS,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,216,187,11
     CONTROL         "uaenet.device [] Sana 2 compatible network device emulation.",IDC_SANA2,
@@ -1098,6 +1095,9 @@ BEGIN
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,202,242,187,11
     COMBOBOX        IDC_NETDEVICE,202,257,178,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     CONTROL         "Always center",IDC_RTG_CENTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,93,212,10
+    CONTROL         "A590/A2091 WD33C93 SCSI",IDC_CS_A2091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,242,147,11
+    CONTROL         "A4091 NCR53C710 SCSI",IDC_CS_A4091,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,255,151,11
+    CONTROL         "Include host SCSI devices",IDC_CS_SCSIMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,268,147,11
 END
 
 IDD_INPUTMAP DIALOGEX 0, 0, 421, 341
index de038003d7fa1758e25a0b76ad594c623286e5bb..1a7514d371308203df0707d04825dc2347ef9e5f 100644 (file)
@@ -16,6 +16,7 @@
 #define __i386__
 #define WINDOWS
 #define ZLIB_WINAPI
+//#define USE_SOFT_LONG_DOUBLE
 #define PACKAGE_STRING "WinUAE"
 
 #ifndef UAE_MINI
index 646379bf4b1b3e6a3db8b9e8abce21f07300cfc5..ea459ba0f2835dc371ba32723047605530330e8d 100644 (file)
 #define LANG_DLL 1
 
 #if WINUAEPUBLICBETA
-#define WINUAEBETA _T("7")
+#define WINUAEBETA _T("8")
 #else
 #define WINUAEBETA _T("")
 #endif
-#define WINUAEDATE MAKEBD(2014, 2, 9)
+#define WINUAEDATE MAKEBD(2014, 2, 16)
 #define WINUAEEXTRA _T("")
 //#define WINUAEEXTRA _T("AmiKit Preview")
 //#define WINUAEEXTRA _T("Amiga Forever Edition")
index b8d1c8676468a4eb693c93181f94fc78d9aa5a89..9ff84ca34e6de4340a4c9c87d665b4c4c6270a84 100644 (file)
@@ -7020,10 +7020,7 @@ static void values_to_chipsetdlg2 (HWND hDlg)
        CheckDlgButton (hDlg, IDC_CS_DENISE, workprefs.cs_deniserev >= 0);
        CheckDlgButton (hDlg, IDC_CS_DMAC, workprefs.cs_mbdmac == 1);
        CheckDlgButton (hDlg, IDC_CS_DMAC2, workprefs.cs_mbdmac == 2);
-       CheckDlgButton (hDlg, IDC_CS_A2091, workprefs.cs_a2091);
-       CheckDlgButton (hDlg, IDC_CS_A4091, workprefs.cs_a4091);
        CheckDlgButton (hDlg, IDC_CS_CDTVSCSI, workprefs.cs_cdtvscsi);
-       CheckDlgButton (hDlg, IDC_CS_SCSIMODE, workprefs.scsi == 2);
        CheckDlgButton (hDlg, IDC_CS_PCMCIA, workprefs.cs_pcmcia);
        CheckDlgButton (hDlg, IDC_CS_SLOWISFAST, workprefs.cs_slowmemisfast);
        CheckDlgButton (hDlg, IDC_CS_CIATODBUG, workprefs.cs_ciatodbug);
@@ -7097,12 +7094,6 @@ static void values_from_chipsetdlg2 (HWND hDlg, UINT msg, WPARAM wParam, LPARAM
        workprefs.cs_mbdmac = ischecked (hDlg, IDC_CS_DMAC) ? 1 : 0;
        if (workprefs.cs_mbdmac == 0)
                workprefs.cs_mbdmac = ischecked (hDlg, IDC_CS_DMAC2) ? 2 : 0;
-       workprefs.cs_a2091 = ischecked (hDlg, IDC_CS_A2091) ? 1 : 0;
-       workprefs.cs_a4091 = ischecked (hDlg, IDC_CS_A4091) ? 1 : 0;
-#if 0
-       if (msg == WM_COMMAND && LOWORD(wParam) == IDC_CS_SCSIMODE)
-               workprefs.scsi = ischecked (hDlg, IDC_CS_SCSIMODE) ? 2 : 0;
-#endif
        workprefs.cs_cdtvscsi = ischecked (hDlg, IDC_CS_CDTVSCSI) ? 1 : 0;
        workprefs.cs_pcmcia = ischecked (hDlg, IDC_CS_PCMCIA) ? 1 : 0;
        workprefs.cs_slowmemisfast = ischecked (hDlg, IDC_CS_SLOWISFAST) ? 1 : 0;
@@ -7164,10 +7155,6 @@ static void enable_for_chipsetdlg2 (HWND hDlg)
        ew (hDlg, IDC_CS_IDE2, e);
        ew (hDlg, IDC_CS_DMAC, e);
        ew (hDlg, IDC_CS_DMAC2, e);
-       ew (hDlg, IDC_CS_A2091, e);
-       ew (hDlg, IDC_CS_A4091, e);
-       ShowWindow (GetDlgItem(hDlg, IDC_CS_SCSIMODE), SW_HIDE);
-       ew (hDlg, IDC_CS_SCSIMODE, FALSE);
        ew (hDlg, IDC_CS_CDTVSCSI, e);
        ew (hDlg, IDC_CS_PCMCIA, e);
        ew (hDlg, IDC_CS_SLOWISFAST, e);
@@ -7649,6 +7636,10 @@ static void enable_for_expansiondlg (HWND hDlg)
                CheckDlgButton (hDlg, IDC_RTG_HWSPRITE, FALSE);
        }
        ew (hDlg, IDC_RTG_HWSPRITE, rtg3 && workprefs.gfx_api);
+       ShowWindow (GetDlgItem(hDlg, IDC_CS_SCSIMODE), SW_HIDE);
+       ew (hDlg, IDC_CS_A2091, en);
+       ew (hDlg, IDC_CS_A4091, en);
+       ew (hDlg, IDC_CS_SCSIMODE, FALSE);
 }
 
 static void values_to_expansiondlg (HWND hDlg)
@@ -7660,6 +7651,9 @@ static void values_to_expansiondlg (HWND hDlg)
        CheckDlgButton (hDlg, IDC_SCSIDEVICE, workprefs.scsi == 1);
        CheckDlgButton (hDlg, IDC_SANA2, workprefs.sana2);
        CheckDlgButton (hDlg, IDC_A2065, workprefs.a2065name[0] ? 1 : 0);
+       CheckDlgButton (hDlg, IDC_CS_A2091, workprefs.a2091);
+       CheckDlgButton (hDlg, IDC_CS_A4091, workprefs.a4091);
+       CheckDlgButton (hDlg, IDC_CS_SCSIMODE, workprefs.scsi == 2);
        SendDlgItemMessage (hDlg, IDC_RTG_BUFFERCNT, CB_SETCURSEL, workprefs.gfx_apmode[1].gfx_backbuffers == 0 ? 0 : workprefs.gfx_apmode[1].gfx_backbuffers - 1, 0);
        cw = catweasel_detect ();
        ew (hDlg, IDC_CATWEASEL, cw);
@@ -7813,6 +7807,12 @@ static INT_PTR CALLBACK ExpansionDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP
                        case IDC_CATWEASEL:
                                workprefs.catweasel = ischecked (hDlg, IDC_CATWEASEL) ? -1 : 0;
                                break;
+                       case IDC_CS_A2091:
+                               workprefs.a2091 = ischecked (hDlg, IDC_CS_A2091) ? 1 : 0;
+                               break;
+                       case IDC_CS_A4091:
+                               workprefs.a4091 = ischecked (hDlg, IDC_CS_A4091) ? 1 : 0;
+                               break;
                        }
                        if (HIWORD (wParam) == CBN_SELENDOK || HIWORD (wParam) == CBN_KILLFOCUS || HIWORD (wParam) == CBN_EDITCHANGE)  {
                                uae_u32 mask = workprefs.picasso96_modeflags;
@@ -8089,7 +8089,7 @@ static void values_to_kickstartdlg (HWND hDlg)
        addromfiles (fkey, hDlg, IDC_CARTFILE, workprefs.cartfile,
                ROMTYPE_AR | ROMTYPE_SUPERIV | ROMTYPE_NORDIC | ROMTYPE_XPOWER | ROMTYPE_ARCADIAGAME | ROMTYPE_HRTMON | ROMTYPE_CD32CART);
        addromfiles (fkey, hDlg, IDC_A2091ROMFILE, workprefs.a2091romfile,
-               ROMTYPE_A2091BOOT);
+               ROMTYPE_A2091BOOT | ROMTYPE_NONE);
        addromfiles (fkey, hDlg, IDC_A4091ROMFILE, workprefs.a4091romfile,
                ROMTYPE_A4091BOOT);
        regclosetree (fkey);
@@ -8118,10 +8118,10 @@ static void init_kickstart (HWND hDlg)
        ew (hDlg, IDC_CARTCHOOSER), FALSE);
        ew (hDlg, IDC_FLASHCHOOSER), FALSE);
 #endif
-       ew (hDlg, IDC_A4091ROMCHOOSER, workprefs.cs_a4091);
-       ew (hDlg, IDC_A4091ROMFILE, workprefs.cs_a4091);
-       ew (hDlg, IDC_A2091ROMCHOOSER, workprefs.cs_a2091);
-       ew (hDlg, IDC_A2091ROMFILE, workprefs.cs_a2091);
+       ew (hDlg, IDC_A4091ROMCHOOSER, workprefs.a4091);
+       ew (hDlg, IDC_A4091ROMFILE, workprefs.a4091);
+       ew (hDlg, IDC_A2091ROMCHOOSER, workprefs.a2091);
+       ew (hDlg, IDC_A2091ROMFILE, workprefs.a2091);
        if (!regexiststree (NULL , _T("DetectedROMs")))
                scan_roms (NULL, rp_isactive () ? 0 : 1);
 }
@@ -10041,7 +10041,7 @@ static INT_PTR CALLBACK TapeDriveSettingsProc (HWND hDlg, UINT msg, WPARAM wPara
                recursive++;
                inithdcontroller (hDlg);
                if (current_tapedlg.ci.controller < HD_CONTROLLER_IDE0)
-                       current_tapedlg.ci.controller = (workprefs.cs_a2091 || workprefs.cs_cdtvscsi || workprefs.cs_mbdmac == 1) ? HD_CONTROLLER_SCSI0 : HD_CONTROLLER_IDE0;
+                       current_tapedlg.ci.controller = (workprefs.a2091 || workprefs.a4091 || workprefs.cs_cdtvscsi || workprefs.cs_mbdmac >= 1) ? HD_CONTROLLER_SCSI0 : HD_CONTROLLER_IDE0;
                SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_SETCURSEL, current_tapedlg.ci.controller, 0);
                SetDlgItemText (hDlg, IDC_PATH_NAME, current_tapedlg.ci.rootdir);
                readonly = my_existsfile (current_tapedlg.ci.rootdir);
@@ -10116,7 +10116,7 @@ static INT_PTR CALLBACK CDDriveSettingsProc (HWND hDlg, UINT msg, WPARAM wParam,
                recursive++;
                inithdcontroller (hDlg);
                if (current_cddlg.ci.controller < HD_CONTROLLER_IDE0)
-                       current_cddlg.ci.controller = (workprefs.cs_a2091 || workprefs.cs_cdtvscsi || workprefs.cs_mbdmac == 1) ? HD_CONTROLLER_SCSI0 : HD_CONTROLLER_IDE0;
+                       current_cddlg.ci.controller = (workprefs.a2091 || workprefs.a4091 || workprefs.cs_cdtvscsi || workprefs.cs_mbdmac >= 1) ? HD_CONTROLLER_SCSI0 : HD_CONTROLLER_IDE0;
                SendDlgItemMessage (hDlg, IDC_HDF_CONTROLLER, CB_SETCURSEL, current_cddlg.ci.controller, 0);
                InitializeListView (hDlg);
                recursive--;
index 643cf8ad9434c8ac9b1acc8ae2844b5dafc30f90..2554834bd8601f21447439418b7327b02bff34d9 100644 (file)
@@ -71,6 +71,9 @@ void romlist_add (const TCHAR *path, struct romdata *rd)
        rl2 = rl + romlist_cnt - 1;
        rl2->path = my_strdup (path);
        rl2->rd = rd;
+       struct romdata *rd2 = getromdatabyid (rd->id);
+       if (rd2 != rd && rd2) // replace "X" with parent name
+               rd->name = rd2->name;
 }
 
 
@@ -89,7 +92,7 @@ struct romdata *getromdatabypath (const TCHAR *path)
        return NULL;
 }
 
-#define NEXT_ROM_ID 87
+#define NEXT_ROM_ID 88
 
 static struct romheader romheaders[] = {
        { _T("Freezer Cartridges"), 1 },
@@ -105,6 +108,8 @@ static struct romheader romheaders[] = {
 static struct romdata roms[] = {
        { _T(" AROS KS ROM (built-in)"), 0, 0, 0, 0, _T("AROS\0"), 524288 * 2, 66, 0, 0, ROMTYPE_KICK, 0, 0, NULL,
        0xffffffff, 0, 0, 0, 0, 0, _T("AROS") },
+       { _T(" ROM Disabled"), 0, 0, 0, 0, _T("NOROM\0"), 0, 87, 0, 0, ROMTYPE_NONE, 0, 0, NULL,
+       0xffffffff, 0, 0, 0, 0, 0, _T("NOROM") },
 
        { _T("Cloanto Amiga Forever ROM key"), 0, 0, 0, 0, 0, 2069, 0, 0, 1, ROMTYPE_KEY, 0, 0, NULL,
        0x869ae1b1, 0x801bbab3,0x2e3d3738,0x6dd1636d,0x4f1d6fa7,0xe21d5874 },
@@ -751,7 +756,7 @@ STATIC_INLINE int notcrc32 (uae_u32 crc32)
        return 0;
 }
 
-struct romdata *getromdatabycrc (uae_u32 crc32)
+struct romdata *getromdatabycrc (uae_u32 crc32, bool allowgroup)
 {
        int i = 0;
        while (roms[i].name) {
@@ -759,8 +764,20 @@ struct romdata *getromdatabycrc (uae_u32 crc32)
                        return &roms[i];
                i++;
        }
+       if (allowgroup) {
+               i = 0;
+               while (roms[i].name) {
+                       if (roms[i].group && crc32 == roms[i].crc32 && !notcrc32(crc32))
+                               return &roms[i];
+                       i++;
+               }
+       }
        return 0;
 }
+struct romdata *getromdatabycrc (uae_u32 crc32)
+{
+       return getromdatabycrc (crc32, false);
+}
 
 static int cmpsha1 (const uae_u8 *s1, const struct romdata *rd)
 {
index 0e10cac7b1444c5ee7fcd2b4c75e0bf956d66dca..28e9aa6c76977ae0610a211a14718c4452f5ff8b 100644 (file)
--- a/scsi.cpp
+++ b/scsi.cpp
@@ -16,7 +16,7 @@
 #include "blkdev.h"
 #include "zfile.h"
 
-static int outcmd[] = { 0x0a, 0x2a, 0x2f, 0xaa, 0x15, 0x55, -1 };
+static int outcmd[] = { 0x0a, 0x2a, 0xaa, 0x15, 0x55, -1 };
 static int incmd[] = { 0x01, 0x03, 0x05, 0x08, 0x12, 0x1a, 0x5a, 0x25, 0x28, 0x34, 0x37, 0x42, 0x43, 0xa8, 0x51, 0x52, 0xbd, -1 };
 static int nonecmd[] = { 0x00, 0x0b, 0x11, 0x16, 0x17, 0x19, 0x1b, 0x1e, 0x2b, 0x35, -1 };
 static int scsicmdsizes[] = { 6, 10, 10, 12, 16, 12, 10, 10 };
@@ -52,6 +52,7 @@ void scsi_emulate_analyze (struct scsi_data *sd)
 
        data_len = sd->data_len;
        cmd_len = scsicmdsizes[sd->cmd[0] >> 5];
+       sd->cmd_len = cmd_len;
        switch (sd->cmd[0])
        {
        case 0x0a:
@@ -63,8 +64,16 @@ void scsi_emulate_analyze (struct scsi_data *sd)
        case 0xaa:
                data_len = ((sd->cmd[6] << 24) | (sd->cmd[7] << 16) | (sd->cmd[8] << 8) | (sd->cmd[9] << 0)) * (uae_s64)sd->blocksize;
        break;
+       case 0x2f: // VERIFY
+               if (sd->cmd[1] & 2) {
+                       sd->data_len = ((sd->cmd[7] << 8) | (sd->cmd[8] << 0)) * (uae_s64)sd->blocksize;
+                       sd->direction = 1;
+               } else {
+                       sd->data_len = 0;
+                       sd->direction = 0;
+               }
+               return;
        }
-       sd->cmd_len = cmd_len;
        sd->data_len = data_len;
        sd->direction = scsi_data_dir (sd);
 }