From abb61727142d9ca77b776c5fc12a70dd8ea41748 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 16 Feb 2014 15:50:15 +0200 Subject: [PATCH] 2710b8 --- a2091.cpp | 76 +++-- blitter.cpp | 6 +- blkdev_cdimage.cpp | 26 +- cdtv.cpp | 1 + cfgfile.cpp | 28 +- cpummu30.cpp | 8 +- custom.cpp | 127 +++++---- drawing.cpp | 27 +- expansion.cpp | 29 +- filesys.cpp | 4 +- fpp.cpp | 521 +++++++++++++++++++---------------- gayle.cpp | 10 +- gencpu.cpp | 66 +++-- hardfile.cpp | 30 +- include/cpu_prefetch.h | 93 +++++-- include/cpummu030.h | 2 + include/gayle.h | 2 + include/inputdevice.h | 8 +- include/newcpu.h | 17 +- include/options.h | 3 +- include/rommgr.h | 2 + inputdevice.cpp | 110 ++++++-- jit/compemu_support.cpp | 4 +- memory.cpp | 45 +-- ncr_scsi.cpp | 119 ++++---- newcpu.cpp | 61 ++-- od-win32/debug_win32.cpp | 10 +- od-win32/dinput.cpp | 68 +++-- od-win32/hardfile_win32.cpp | 15 +- od-win32/md-fpp.h | 78 +++--- od-win32/mman.cpp | 25 +- od-win32/resources/winuae.rc | 20 +- od-win32/sysconfig.h | 1 + od-win32/win32.h | 4 +- od-win32/win32gui.cpp | 40 +-- rommgr.cpp | 21 +- scsi.cpp | 13 +- 37 files changed, 1006 insertions(+), 714 deletions(-) diff --git a/a2091.cpp b/a2091.cpp index 675f3a15..77d73fb5 100644 --- 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; diff --git a/blitter.cpp b/blitter.cpp index ba30152b..c99cf032 100644 --- a/blitter.cpp +++ b/blitter.cpp @@ -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; diff --git a/blkdev_cdimage.cpp b/blkdev_cdimage.cpp index 84e0edf3..9a75331b 100644 --- a/blkdev_cdimage.cpp +++ b/blkdev_cdimage.cpp @@ -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; } diff --git a/cdtv.cpp b/cdtv.cpp index aa0ad07e..3ad345ef 100644 --- 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; } diff --git a/cfgfile.cpp b/cfgfile.cpp index cad40599..aa5c5e25 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -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; diff --git a/cpummu30.cpp b/cpummu30.cpp index 782ecf20..b84affc1 100644 --- a/cpummu30.cpp +++ b/cpummu30.cpp @@ -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; diff --git a/custom.cpp b/custom.cpp index 51236152..9af2acbb 100644 --- a/custom.cpp +++ b/custom.cpp @@ -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) diff --git a/drawing.cpp b/drawing.cpp index efe3a663..c1476799 100644 --- a/drawing.cpp +++ b/drawing.cpp @@ -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 diff --git a/expansion.cpp b/expansion.cpp index 493ea318..c60c5edc 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -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; diff --git a/filesys.cpp b/filesys.cpp index f8efadaf..ac86ab00 100644 --- a/filesys.cpp +++ b/filesys.cpp @@ -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 b345673a..8cdf63d1 100644 --- 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 (®s.fp_result); for (int i = 0; i < 8; i++) - regs.fp[i] = 0; + fpclear (®s.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 (®s.fp_result, *fp_nan); } else if (x & 0x04000000) - regs.fp_result = 0; + fpset (®s.fp_result, 0); else if (x & 0x08000000) - regs.fp_result = -1; + fpset (®s.fp_result, -1); else - regs.fp_result = 1; + fpset (®s.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 (®s.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 (®s.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 (®s.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 (®s.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 (®s.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 (®s.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 (®s.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 (®s.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 (®s.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. */ /* 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 (®s.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 (®s.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 (®s.fp[i], &w1, &w2, &w3); save_u32 (w1); save_u32 (w2); save_u16 (w3); diff --git a/gayle.cpp b/gayle.cpp index f0f380fe..dc60dcd3 100644 --- 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) { diff --git a/gencpu.cpp b/gencpu.cpp index dcf48c83..783dfe91 100644 --- a/gencpu.cpp +++ b/gencpu.cpp @@ -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)) diff --git a/hardfile.cpp b/hardfile.cpp index b2650ed9..572ec0e7 100644 --- a/hardfile.cpp +++ b/hardfile.cpp @@ -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; diff --git a/include/cpu_prefetch.h b/include/cpu_prefetch.h index bbc3155c..d297e4d3 100644 --- a/include/cpu_prefetch.h +++ b/include/cpu_prefetch.h @@ -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; } diff --git a/include/cpummu030.h b/include/cpummu030.h index 7658e148..0094e09a 100644 --- a/include/cpummu030.h +++ b/include/cpummu030.h @@ -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 diff --git a/include/gayle.h b/include/gayle.h index 7512f0d9..2982f951 100644 --- a/include/gayle.h +++ b/include/gayle.h @@ -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 diff --git a/include/inputdevice.h b/include/inputdevice.h index e25c78b7..5e006bd2 100644 --- a/include/inputdevice.h +++ b/include/inputdevice.h @@ -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, diff --git a/include/newcpu.h b/include/newcpu.h index d072afc7..c7865368 100644 --- a/include/newcpu.h +++ b/include/newcpu.h @@ -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); diff --git a/include/options.h b/include/options.h index 055ab624..9e545a7b 100644 --- a/include/options.h +++ b/include/options.h @@ -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]; diff --git a/include/rommgr.h b/include/rommgr.h index cd0458c3..7ef239f6 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -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); diff --git a/inputdevice.cpp b/inputdevice.cpp index 058c10cf..7898202e 100644 --- a/inputdevice.cpp +++ b/inputdevice.cpp @@ -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; } } diff --git a/jit/compemu_support.cpp b/jit/compemu_support.cpp index c9675f5a..2ea9740d 100644 --- a/jit/compemu_support.cpp +++ b/jit/compemu_support.cpp @@ -4496,7 +4496,7 @@ void init_comp(void) for (i=0;i= 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) diff --git a/ncr_scsi.cpp b/ncr_scsi.cpp index c7a27d84..8c9906ef 100644 --- a/ncr_scsi.cpp +++ b/ncr_scsi.cpp @@ -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 { diff --git a/newcpu.cpp b/newcpu.cpp index 4677c594..fcbe78cb 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -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 = ®s; 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; diff --git a/od-win32/debug_win32.cpp b/od-win32/debug_win32.cpp index e4a42942..07c41a31 100644 --- a/od-win32/debug_win32.cpp +++ b/od-win32/debug_win32.cpp @@ -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) diff --git a/od-win32/dinput.cpp b/od-win32/dinput.cpp index 3e7e67b8..ae1a2e1c 100644 --- a/od-win32/dinput.cpp +++ b/od-win32/dinput.cpp @@ -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; diff --git a/od-win32/hardfile_win32.cpp b/od-win32/hardfile_win32.cpp index 961e2083..eae3cb4e 100644 --- a/od-win32/hardfile_win32.cpp +++ b/od-win32/hardfile_win32.cpp @@ -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; diff --git a/od-win32/md-fpp.h b/od-win32/md-fpp.h index db3bf5fe..f0b9e18e 100644 --- a/od-win32/md-fpp.h +++ b/od-win32/md-fpp.h @@ -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 */ diff --git a/od-win32/mman.cpp b/od-win32/mman.cpp index 40694f96..8a56e37b 100644 --- a/od-win32/mman.cpp +++ b/od-win32/mman.cpp @@ -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 (); } diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index e72a942c..8481d9ba 100644 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -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 diff --git a/od-win32/sysconfig.h b/od-win32/sysconfig.h index de038003..1a7514d3 100644 --- a/od-win32/sysconfig.h +++ b/od-win32/sysconfig.h @@ -16,6 +16,7 @@ #define __i386__ #define WINDOWS #define ZLIB_WINAPI +//#define USE_SOFT_LONG_DOUBLE #define PACKAGE_STRING "WinUAE" #ifndef UAE_MINI diff --git a/od-win32/win32.h b/od-win32/win32.h index 646379bf..ea459ba0 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -19,11 +19,11 @@ #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") diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index b8d1c867..9ff84ca3 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -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--; diff --git a/rommgr.cpp b/rommgr.cpp index 643cf8ad..2554834b 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -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) { diff --git a/scsi.cpp b/scsi.cpp index 0e10cac7..28e9aa6c 100644 --- 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); } -- 2.47.3