From: Toni Wilen Date: Sun, 10 Nov 2013 13:38:32 +0000 (+0200) Subject: 2700b12 X-Git-Tag: 2700~5 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=aeaed7d6d3ca4bdc5058785f993586ca5665ba6d;p=francis%2Fwinuae.git 2700b12 --- diff --git a/blitter.cpp b/blitter.cpp index c17cb4f4..02f53e71 100644 --- a/blitter.cpp +++ b/blitter.cpp @@ -48,6 +48,7 @@ static int original_ch, original_fill, original_line; static int blinea_shift; static uae_u16 blinea, blineb; static int blitline, blitfc, blitfill, blitife, blitsing, blitdesc; +static int blitline_started; static int blitonedot, blitsign, blitlinepixel; static int blit_add; static int blit_modadda, blit_modaddb, blit_modaddc, blit_modaddd; @@ -1175,6 +1176,10 @@ static void blit_bltset (int con) blitdesc = bltcon1 & 2; blt_info.blitbshift = bltcon1 >> 12; blt_info.blitdownbshift = 16 - blt_info.blitbshift; + if ((bltcon1 & 1) && !blitline_started) { + write_log (_T("BLITTER: linedraw enabled after starting normal blit! %08x\n"), M68K_GETPC); + return; + } } if (con & 1) { @@ -1187,11 +1192,11 @@ static void blit_bltset (int con) blitfill = !!(bltcon1 & 0x18); // disable line draw if bltcon0 is written while it is active - if (!savestate_state && bltstate != BLT_done && bltstate != BLT_init && blitline) { + if (!savestate_state && bltstate != BLT_done && bltstate != BLT_init && blitline && blitline_started) { blitline = 0; bltstate = BLT_done; blit_interrupt = 1; - write_log (_T("BLITTER: register modification during linedraw!\n")); + write_log (_T("BLITTER: register modification during linedraw! %08x\n"), M68K_GETPC); } if (blitline) { @@ -1327,6 +1332,7 @@ static void blitter_start_init (void) preva = 0; prevb = 0; blit_frozen = 0; + blitline_started = bltcon1 & 1; blit_bltset (1 | 2); blit_modset (); diff --git a/custom.cpp b/custom.cpp index 5156b1dd..ea14f9a7 100644 --- a/custom.cpp +++ b/custom.cpp @@ -1206,7 +1206,7 @@ STATIC_INLINE void fetch (int nr, int fm, int hpos) bplpt[nr] += 2 << fm; bplptx[nr] += 2 << fm; - if (hpos == 0xe2 && !(beamcon0 & 0x80)) { + if (hpos >= 0xe1 && !(beamcon0 & 0x80)) { static int warned = 30; if (warned > 0) { write_log (_T("WARNING: BPL fetch at hpos 0x%02X!\n"), hpos); @@ -3694,6 +3694,7 @@ static uae_u16 VPOSR (void) static void VPOSW (uae_u16 v) { + int oldvpos = vpos; #if 0 if (M68K_GETPC < 0xf00000 || 1) write_log (_T("VPOSW %04X PC=%08x\n"), v, M68K_GETPC); @@ -3714,10 +3715,13 @@ static void VPOSW (uae_u16 v) if (!(currprefs.chipset_mask & CSMASK_ECS_AGNUS)) v &= 1; vpos |= v << 8; + if (vpos < oldvpos) + vpos = oldvpos; } static void VHPOSW (uae_u16 v) { + int oldvpos = vpos; #if 0 if (M68K_GETPC < 0xf00000 || 1) write_log (_T("VHPOSW %04X PC=%08x\n"), v, M68K_GETPC); @@ -3725,6 +3729,11 @@ static void VHPOSW (uae_u16 v) v >>= 8; // lets ignore hpos for now vpos &= 0xff00; vpos |= v; + if (vpos < oldvpos) { + vpos = oldvpos; + } else if (vpos < minfirstline && oldvpos < minfirstline) { + vpos = oldvpos; + } } static uae_u16 VHPOSR (void) @@ -6310,7 +6319,9 @@ static void vsync_handler_post (void) gfxboard_vsync_handler (); #endif - if ((beamcon0 & (0x20 | 0x80)) != (new_beamcon0 & (0x20 | 0x80)) || (vpos_count > 0 && abs (vpos_count - vpos_count_diff) > 1)) { + if ((beamcon0 & (0x20 | 0x80)) != (new_beamcon0 & (0x20 | 0x80))) { + init_hz (); + } else if (vpos_count > 0 && abs (vpos_count - vpos_count_diff) > 1) { init_hz (); } else if (interlace_changed || changed_chipset_refresh () || lof_changed) { compute_framesync (); @@ -8498,6 +8509,8 @@ uae_u32 wait_cpu_cycle_read (uaecptr addr, int mode) #endif x_do_cycles_post (CYCLE_UNIT, v); + + regs.chipset_latch_rw = regs.chipset_latch_read = v; return v; } @@ -8538,6 +8551,7 @@ uae_u32 wait_cpu_cycle_read_ce020 (uaecptr addr, int mode) if (currprefs.cpu_model == 68020) x_do_cycles_post (CYCLE_UNIT / 2, v); + regs.chipset_latch_rw = regs.chipset_latch_read = v; return v; } @@ -8571,6 +8585,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; } void wait_cpu_cycle_write_ce020 (uaecptr addr, int mode, uae_u32 v) @@ -8604,6 +8619,8 @@ void wait_cpu_cycle_write_ce020 (uaecptr addr, int mode, uae_u32 v) if (currprefs.cpu_model == 68020) x_do_cycles_post (CYCLE_UNIT / 2, v); + + regs.chipset_latch_rw = regs.chipset_latch_write = v; } void do_cycles_ce (unsigned long cycles) diff --git a/gencpu.cpp b/gencpu.cpp index 101c6b9f..a81e38c3 100644 --- a/gencpu.cpp +++ b/gencpu.cpp @@ -2436,7 +2436,7 @@ static void bsetcycles (struct instr *curi) static int islongimm (struct instr *curi) { - return (curi->size == sz_long && (curi->smode == Dreg || curi->smode == imm)); + return (curi->size == sz_long && (curi->smode == Dreg || curi->smode == imm || curi->smode == Areg)); } @@ -2802,7 +2802,7 @@ static void gen_opcode (unsigned long int opcode) if (curi->dmode == Dreg) { if (curi->size == sz_long) { c += 2; - if (curi->smode == imm || curi->smode == immi || curi->smode == Dreg) + if (curi->smode == imm || curi->smode == immi || curi->smode == Dreg || curi->smode == Areg) c += 2; } } @@ -2893,7 +2893,7 @@ static void gen_opcode (unsigned long int opcode) if (curi->dmode == Dreg) { if (curi->size == sz_long) { c += 2; - if (curi->smode == imm || curi->smode == immi || curi->smode == Dreg) + if (curi->smode == imm || curi->smode == immi || curi->smode == Dreg || curi->smode == Areg) c += 2; } } @@ -3240,8 +3240,11 @@ static void gen_opcode (unsigned long int opcode) int prefetch_done = 0, flags; int dualprefetch = curi->dmode == absl && (curi->smode != Dreg && curi->smode != Areg && curi->smode != imm); genamode (curi, curi->smode, "srcreg", curi->size, "src", 1, 0, GF_MOVE); - flags = 1 | (dualprefetch ? GF_NOREFILL : 0); - genamode (curi, curi->dmode, "dstreg", curi->size, "dst", 2, 0, flags | GF_MOVE); + flags = GF_MOVE | GF_APDI; + //if (curi->size == sz_long && (curi->smode == Dreg || curi->smode == Areg)) + // flags &= ~GF_APDI; + flags |= dualprefetch ? GF_NOREFILL : 0; + genamode (curi, curi->dmode, "dstreg", curi->size, "dst", 2, 0, flags); if (curi->mnemo == i_MOVEA && curi->size == sz_word) printf ("\tsrc = (uae_s32)(uae_s16)src;\n"); if (curi->dmode == Apdi) { @@ -3855,12 +3858,12 @@ static void gen_opcode (unsigned long int opcode) printf ("\t} else {\n"); printf ("\t\tuae_u32 newv = (uae_u32)dst / (uae_u32)(uae_u16)src;\n"); printf ("\t\tuae_u32 rem = (uae_u32)dst %% (uae_u32)(uae_u16)src;\n"); - fill_prefetch_next (); if (using_ce) { start_brace (); printf ("\t\tint cycles = (getDivu68kCycles((uae_u32)dst, (uae_u16)src));\n"); addcycles000_3 ("\t\t"); } + fill_prefetch_next (); /* The N flag appears to be set each time there is an overflow. * Weird. but 68020 only sets N when dst is negative.. */ printf ("\t\tif (newv > 0xffff) {\n"); @@ -3897,12 +3900,12 @@ static void gen_opcode (unsigned long int opcode) printf ("\t\tgoto %s;\n", endlabelstr); printf ("\t}\n"); printf ("\tCLEAR_CZNV ();\n"); - fill_prefetch_next (); if (using_ce) { start_brace (); printf ("\t\tint cycles = (getDivs68kCycles((uae_s32)dst, (uae_s16)src));\n"); addcycles000_3 ("\t\t"); } + fill_prefetch_next (); printf ("\tif (dst == 0x80000000 && src == -1) {\n"); printf ("\t\tSET_VFLG (1);\n"); printf ("\t\tSET_NFLG (1);\n"); diff --git a/include/memory.h b/include/memory.h index 204a6539..f847d698 100644 --- a/include/memory.h +++ b/include/memory.h @@ -53,6 +53,9 @@ extern void wait_cpu_cycle_write_ce020 (uaecptr addr, int mode, uae_u32 v); #define cardmem_start_addr 0x00E00000 #define kickmem_start_addr 0x00F80000 +#define ROM_SIZE_512 524288 +#define ROM_SIZE_256 262144 + extern bool ersatzkickfile; extern bool cloanto_rom, kickstart_rom; extern uae_u16 kickstart_version; diff --git a/include/newcpu.h b/include/newcpu.h index e61cd329..f410e502 100644 --- a/include/newcpu.h +++ b/include/newcpu.h @@ -138,6 +138,10 @@ struct regstruct uae_u16 irc, ir; uae_u32 spcflags; + uae_u32 last_prefetch; + uae_u32 chipset_latch_rw; + uae_u32 chipset_latch_read; + uae_u32 chipset_latch_write; uaecptr usp, isp, msp; uae_u16 sr; diff --git a/memory.cpp b/memory.cpp index bdaff4d7..41905ecd 100644 --- a/memory.cpp +++ b/memory.cpp @@ -180,15 +180,25 @@ static void dummylog (int rw, uaecptr addr, int size, uae_u32 val, int ins) static uae_u32 dummy_get (uaecptr addr, int size) { - uae_u32 v; - if (currprefs.cpu_model >= 68020) - return NONEXISTINGDATA; - v = (regs.irc << 16) | regs.irc; + uae_u32 v = NONEXISTINGDATA; + + if (currprefs.cpu_model >= 68040) + return v; + if (!currprefs.cpu_compatible) + return v; + if (currprefs.address_space_24) + 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 &= 0xffff; + v = regs.irc & 0xffff; } else { + v = regs.irc; v = (addr & 1) ? (v & 0xff) : ((v >> 8) & 0xff); } #if 0 @@ -665,11 +675,11 @@ static void a1000_handle_kickstart (int mode) protect_roms (false); if (mode == 0) { a1000_kickstart_mode = 0; - memcpy (kickmem_bank.baseaddr, kickmem_bank.baseaddr + 262144, 262144); - kickstart_version = (kickmem_bank.baseaddr[262144 + 12] << 8) | kickmem_bank.baseaddr[262144 + 13]; + memcpy (kickmem_bank.baseaddr, kickmem_bank.baseaddr + ROM_SIZE_256, ROM_SIZE_256); + kickstart_version = (kickmem_bank.baseaddr[ROM_SIZE_256 + 12] << 8) | kickmem_bank.baseaddr[ROM_SIZE_256 + 13]; } else { a1000_kickstart_mode = 1; - memcpy (kickmem_bank.baseaddr, a1000_bootrom, 262144); + memcpy (kickmem_bank.baseaddr, a1000_bootrom, ROM_SIZE_256); kickstart_version = 0; } if (kickstart_version == 0xffff) @@ -702,7 +712,7 @@ static void REGPARAM2 kickmem_lput (uaecptr addr, uae_u32 b) m = (uae_u32 *)(kickmem_bank.baseaddr + addr); do_put_mem_long (m, b); #if 0 - if (addr == 524288-4) { + if (addr == ROM_SIZE_512-4) { rom_write_enabled = false; write_log (_T("ROM write disabled\n")); } @@ -1037,7 +1047,7 @@ addrbank custmem2_bank = { custmem2_lget, custmem2_wget, ABFLAG_RAM }; -#define fkickmem_size 524288 +#define fkickmem_size ROM_SIZE_512 static int a3000_f0; void a3000_fakekick (int map) { @@ -1096,7 +1106,7 @@ static int read_kickstart (struct zfile *f, uae_u8 *mem, int size, int dochecksu zfile_fseek (f, 512, SEEK_SET); kickdisk = 1; #if 0 - } else if (size >= 524288 && !memcmp (buffer, "AMIG", 4)) { + } else if (size >= ROM_SIZE_512 && !memcmp (buffer, "AMIG", 4)) { /* ReKick */ zfile_fseek (f, oldpos + 0x6c, SEEK_SET); cr = 2; @@ -1118,10 +1128,10 @@ static int read_kickstart (struct zfile *f, uae_u8 *mem, int size, int dochecksu i = zfile_fread (mem, 1, size, f); - if (kickdisk && i > 262144) - i = 262144; + if (kickdisk && i > ROM_SIZE_256) + i = ROM_SIZE_256; #if 0 - if (i >= 262144 && (i != 262144 && i != 524288 && i != 524288 * 2 && i != 524288 * 4)) { + if (i >= ROM_SIZE_256 && (i != ROM_SIZE_256 && i != ROM_SIZE_512 && i != ROM_SIZE_512 * 2 && i != ROM_SIZE_512 * 4)) { notify_user (NUMSG_KSROMREADERROR); return 0; } @@ -1143,23 +1153,23 @@ static int read_kickstart (struct zfile *f, uae_u8 *mem, int size, int dochecksu } if (currprefs.cs_a1000ram) { int off = 0; - a1000_bootrom = xcalloc (uae_u8, 262144); - while (off + i < 262144) { + a1000_bootrom = xcalloc (uae_u8, ROM_SIZE_256); + while (off + i < ROM_SIZE_256) { memcpy (a1000_bootrom + off, kickmem_bank.baseaddr, i); off += i; } memset (kickmem_bank.baseaddr, 0, kickmem_bank.allocated); a1000_handle_kickstart (1); dochecksum = 0; - i = 524288; + i = ROM_SIZE_512; } - for (j = 0; j < 256 && i >= 262144; j++) { + for (j = 0; j < 256 && i >= ROM_SIZE_256; j++) { if (!memcmp (mem + j, kickstring, strlen (kickstring) + 1)) break; } - if (j == 256 || i < 262144) + if (j == 256 || i < ROM_SIZE_256) dochecksum = 0; if (dochecksum) kickstart_checksum (mem, size); @@ -1185,7 +1195,7 @@ static bool load_extendedkickstart (const TCHAR *romextfile, int type) } zfile_fseek (f, 0, SEEK_END); size = zfile_ftell (f); - extendedkickmem_bank.allocated = 524288; + extendedkickmem_bank.allocated = ROM_SIZE_512; off = 0; if (type == 0) { if (currprefs.cs_cd32cd) { @@ -1251,7 +1261,7 @@ static int patch_residents (uae_u8 *kickmemory, int size) int i, j, patched = 0; uae_char *residents[] = { "NCR scsi.device", 0 }; // "scsi.device", "carddisk.device", "card.resource" }; - uaecptr base = size == 524288 ? 0xf80000 : 0xfc0000; + uaecptr base = size == ROM_SIZE_512 ? 0xf80000 : 0xfc0000; if (currprefs.cs_mbdmac == 2) residents[0] = NULL; @@ -1284,7 +1294,7 @@ static int patch_residents (uae_u8 *kickmemory, int size) static void patch_kick (void) { int patched = 0; - if (kickmem_bank.allocated >= 524288 && currprefs.kickshifter) + if (kickmem_bank.allocated >= ROM_SIZE_512 && currprefs.kickshifter) patched += patch_shapeshifter (kickmem_bank.baseaddr); patched += patch_residents (kickmem_bank.baseaddr, kickmem_bank.allocated); if (extendedkickmem_bank.baseaddr) { @@ -1309,14 +1319,17 @@ static bool load_kickstart_replacement (void) f = zfile_gunzip (f); if (!f) return false; - kickmem_bank.mask = 0x80000 - 1; - kickmem_bank.allocated = 0x80000; - extendedkickmem_bank.allocated = 0x80000; + + extendedkickmem_bank.allocated = ROM_SIZE_512; + extendedkickmem_bank.mask = ROM_SIZE_512 - 1; extendedkickmem_type = EXTENDED_ROM_KS; extendedkickmem_bank.baseaddr = mapped_malloc (extendedkickmem_bank.allocated, _T("rom_e0")); - read_kickstart (f, extendedkickmem_bank.baseaddr, extendedkickmem_bank.allocated, 0, 1); - extendedkickmem_bank.mask = extendedkickmem_bank.allocated - 1; - read_kickstart (f, extendedkickmem_bank.baseaddr, 0x80000, 1, 0); + read_kickstart (f, extendedkickmem_bank.baseaddr, ROM_SIZE_512, 0, 1); + + kickmem_bank.allocated = ROM_SIZE_512; + kickmem_bank.mask = ROM_SIZE_512 - 1; + read_kickstart (f, kickmem_bank.baseaddr, ROM_SIZE_512, 1, 0); + zfile_fclose (f); seriallog = -1; return true; @@ -1363,27 +1376,27 @@ static int load_kickstart (void) if (f != NULL) { int filesize, size, maxsize; - int kspos = 524288; + int kspos = ROM_SIZE_512; int extpos = 0; - maxsize = 524288; + maxsize = ROM_SIZE_512; zfile_fseek (f, 0, SEEK_END); filesize = zfile_ftell (f); zfile_fseek (f, 0, SEEK_SET); if (filesize == 1760 * 512) { - filesize = 262144; - maxsize = 262144; + filesize = ROM_SIZE_256; + maxsize = ROM_SIZE_256; } - if (filesize == 524288 + 8) { + if (filesize == ROM_SIZE_512 + 8) { /* GVP 0xf0 kickstart */ zfile_fseek (f, 8, SEEK_SET); } - if (filesize >= 524288 * 2) { + if (filesize >= ROM_SIZE_512 * 2) { struct romdata *rd = getromdatabyzfile(f); zfile_fseek (f, kspos, SEEK_SET); } - if (filesize >= 524288 * 4) { - kspos = 524288 * 3; + if (filesize >= ROM_SIZE_512 * 4) { + kspos = ROM_SIZE_512 * 3; extpos = 0; zfile_fseek (f, kspos, SEEK_SET); } @@ -1392,8 +1405,8 @@ static int load_kickstart (void) goto err; kickmem_bank.mask = size - 1; kickmem_bank.allocated = size; - if (filesize >= 524288 * 2 && !extendedkickmem_type) { - extendedkickmem_bank.allocated = 0x80000; + if (filesize >= ROM_SIZE_512 * 2 && !extendedkickmem_type) { + extendedkickmem_bank.allocated = ROM_SIZE_512; if (currprefs.cs_cdtvcd || currprefs.cs_cdtvram) { extendedkickmem_type = EXTENDED_ROM_CDTV; extendedkickmem_bank.allocated *= 2; @@ -1408,13 +1421,13 @@ static int load_kickstart (void) read_kickstart (f, extendedkickmem_bank.baseaddr, extendedkickmem_bank.allocated, 0, 1); extendedkickmem_bank.mask = extendedkickmem_bank.allocated - 1; } - if (filesize > 524288 * 2) { - extendedkickmem2_bank.allocated = 524288 * 2; + if (filesize > ROM_SIZE_512 * 2) { + extendedkickmem2_bank.allocated = ROM_SIZE_512 * 2; extendedkickmem2_bank.baseaddr = mapped_malloc (extendedkickmem2_bank.allocated, _T("rom_a8")); - zfile_fseek (f, extpos + 524288, SEEK_SET); - read_kickstart (f, extendedkickmem2_bank.baseaddr, 524288, 0, 1); - zfile_fseek (f, extpos + 524288 * 2, SEEK_SET); - read_kickstart (f, extendedkickmem2_bank.baseaddr + 524288, 524288, 0, 1); + zfile_fseek (f, extpos + ROM_SIZE_512, SEEK_SET); + read_kickstart (f, extendedkickmem2_bank.baseaddr, ROM_SIZE_512, 0, 1); + zfile_fseek (f, extpos + ROM_SIZE_512 * 2, SEEK_SET); + read_kickstart (f, extendedkickmem2_bank.baseaddr + ROM_SIZE_512, ROM_SIZE_512, 0, 1); extendedkickmem2_bank.mask = extendedkickmem2_bank.allocated - 1; extendedkickmem2_bank.start = 0xa80000; } @@ -2006,7 +2019,7 @@ void memory_reset (void) extendedkickmem_type = 0; load_extendedkickstart (currprefs.romextfile, 0); load_extendedkickstart (currprefs.romextfile2, EXTENDED_ROM_CDTV); - kickmem_bank.mask = 524288 - 1; + kickmem_bank.mask = ROM_SIZE_512 - 1; if (!load_kickstart ()) { if (_tcslen (currprefs.romfile) > 0) { write_log (_T("Failed to open '%s'\n"), currprefs.romfile); @@ -2164,7 +2177,7 @@ void memory_reset (void) break; #ifdef CDTV case EXTENDED_ROM_CDTV: - map_banks (&extendedkickmem_bank, 0xF0, extendedkickmem_bank.allocated == 2 * 524288 ? 16 : 8, 0); + map_banks (&extendedkickmem_bank, 0xF0, extendedkickmem_bank.allocated == 2 * ROM_SIZE_512 ? 16 : 8, 0); break; #endif #ifdef CD32 @@ -2260,8 +2273,8 @@ void memory_init (void) custmem1_bank.baseaddr = NULL; custmem2_bank.baseaddr = NULL; - kickmem_bank.baseaddr = mapped_malloc (0x80000, _T("kick")); - memset (kickmem_bank.baseaddr, 0, 0x80000); + kickmem_bank.baseaddr = mapped_malloc (ROM_SIZE_512, _T("kick")); + memset (kickmem_bank.baseaddr, 0, ROM_SIZE_512); _tcscpy (currprefs.romfile, _T("")); currprefs.romextfile[0] = 0; @@ -2566,7 +2579,7 @@ uae_u8 *save_rom (int first, int *len, uae_u8 *dstptr) } if (i == mem_size / 2 - 4) { mem_size /= 2; - mem_start += 262144; + mem_start += ROM_SIZE_256; } version = longget (mem_start + 12); /* version+revision */ _stprintf (tmpname, _T("Kickstart %d.%d"), wordget (mem_start + 12), wordget (mem_start + 14)); diff --git a/newcpu.cpp b/newcpu.cpp index 6e2d3e98..e2683954 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -5537,7 +5537,7 @@ void m68k_dumpstate (uaecptr pc, uaecptr *nextpc) for (lookup1 = lookuptab; lookup1->mnemo != dp->mnemo; lookup1++); dp = table68k + regs.ir; for (lookup2 = lookuptab; lookup2->mnemo != dp->mnemo; lookup2++); - console_out_f (_T("Prefetch %04x (%s) %04x (%s)\n"), regs.irc, lookup1->name, regs.ir, lookup2->name); + console_out_f (_T("Prefetch %04x (%s) %04x (%s) Chip latch %08X\n"), regs.irc, lookup1->name, regs.ir, lookup2->name, regs.chipset_latch_rw); } if (pc != 0xffffffff) { @@ -5697,6 +5697,11 @@ uae_u8 *restore_cpu (uae_u8 *src) restore_u32 (); } } + if (flags & 0x10000000) { + regs.chipset_latch_rw = restore_u32 (); + regs.chipset_latch_read = restore_u32 (); + regs.chipset_latch_write = restore_u32 (); + } write_log (_T("CPU: %d%s%03d, PC=%08X\n"), model / 1000, flags & 1 ? _T("EC") : _T(""), model % 1000, regs.pc); @@ -5921,7 +5926,7 @@ uae_u8 *save_cpu (int *len, uae_u8 *dstptr) dstbak = dst = xmalloc (uae_u8, 1000); model = currprefs.cpu_model; save_u32 (model); /* MODEL */ - save_u32 (0x80000000 | 0x40000000 | 0x20000000 | (currprefs.address_space_24 ? 1 : 0)); /* FLAGS */ + save_u32 (0x80000000 | 0x40000000 | 0x20000000 | 0x10000000 | (currprefs.address_space_24 ? 1 : 0)); /* FLAGS */ for (i = 0;i < 15; i++) save_u32 (regs.regs[i]); /* D0-D7 A0-A6 */ save_u32 (m68k_getpc ()); /* PC */ @@ -6016,6 +6021,9 @@ uae_u8 *save_cpu (int *len, uae_u8 *dstptr) save_u32 (regs.ce020memcycles); save_u32 (0); } + save_u32 (regs.chipset_latch_rw); + save_u32 (regs.chipset_latch_read); + save_u32 (regs.chipset_latch_write); *len = dst - dstbak; return dstbak; } diff --git a/od-win32/avioutput.cpp b/od-win32/avioutput.cpp index 2f987d2b..765e04b5 100644 --- a/od-win32/avioutput.cpp +++ b/od-win32/avioutput.cpp @@ -485,7 +485,7 @@ static int AVIOutput_AllocateVideo (void) avioutput_fps = (int)(vblank_hz + 0.5); if (!avioutput_fps) avioutput_fps = ispal () ? 50 : 60; - if (avioutput_originalsize) { + if (avioutput_originalsize || WIN32GFX_IsPicassoScreen ()) { int pitch; if (!WIN32GFX_IsPicassoScreen ()) { getfilterbuffer (&avioutput_width, &avioutput_height, &pitch, &avioutput_bits); @@ -864,26 +864,34 @@ static int getFromBuffer (struct avientry *ae, int original) uae_u8 *src, *mem; uae_u8 *dst = ae->lpVideo; int spitch, dpitch; + int maxw, maxh; mem = NULL; dpitch = ((avioutput_width * avioutput_bits + 31) & ~31) / 8; - if (original) { - if (!WIN32GFX_IsPicassoScreen ()) + if (original || WIN32GFX_IsPicassoScreen ()) { + if (!WIN32GFX_IsPicassoScreen ()) { src = getfilterbuffer (&w, &h, &spitch, &d); - else + maxw = gfxvidinfo.outbuffer->outwidth; + maxh = gfxvidinfo.outbuffer->outheight; + } else { src = mem = getrtgbuffer (&w, &h, &spitch, &d, NULL); + maxw = w; + maxh = h; + } } else { spitch = gfxvidinfo.outbuffer->rowbytes; src = bufmem_ptr; + maxw = gfxvidinfo.outbuffer->outwidth; + maxh = gfxvidinfo.outbuffer->outheight; } if (!src) return 0; dst += dpitch * avioutput_height; - for (y = 0; y < (gfxvidinfo.outbuffer->outheight > avioutput_height ? avioutput_height : gfxvidinfo.outbuffer->outheight); y++) { + for (y = 0; y < (maxh > avioutput_height ? avioutput_height : maxh); y++) { uae_u8 *d; dst -= dpitch; d = dst; - for (x = 0; x < (gfxvidinfo.outbuffer->outwidth > avioutput_width ? avioutput_width : gfxvidinfo.outbuffer->outwidth); x++) { + for (x = 0; x < (maxw > avioutput_width ? avioutput_width : maxw); x++) { if (avioutput_bits == 8) { *d++ = src[x]; } else if (avioutput_bits == 16) { @@ -934,7 +942,7 @@ void AVIOutput_WriteVideo (void) dorestart (); waitqueuefull (); ae = allocavientry_video (); - if (avioutput_originalsize) { + if (avioutput_originalsize || WIN32GFX_IsPicassoScreen ()) { v = getFromBuffer (ae, 1); } else { #if defined (GFXFILTER) @@ -1328,8 +1336,10 @@ static void *AVIOutput_worker (void *arg) EnterCriticalSection (&AVIOutput_CriticalSection); ae = getavientry (); LeaveCriticalSection (&AVIOutput_CriticalSection); - if (ae == NULL) + if (ae == NULL) { + write_log (_T("AVIOutput worker thread: out of entries!?\n")); break; + } write_comm_pipe_u32 (&queuefull, 0, 1); if (!avioutput_failed) { if (ae->lpAudio) diff --git a/od-win32/dinput.cpp b/od-win32/dinput.cpp index 5053403a..d4b78416 100644 --- a/od-win32/dinput.cpp +++ b/od-win32/dinput.cpp @@ -1408,7 +1408,9 @@ static void dumphidcaps (struct didata *did) static void dumphidend (void) { write_log (_T("\n")); - } +} + +#define MAX_RAW_KEYBOARD 0 static bool initialize_rawinput (void) { @@ -1486,6 +1488,9 @@ static bool initialize_rawinput (void) else if (type == RIM_TYPEHID) rnum_hid++; } + if (MAX_RAW_KEYBOARD > 0 && rnum_kb > MAX_RAW_KEYBOARD) + rnum_kb = MAX_RAW_KEYBOARD; + for (int rawcnt = 0; rawcnt < gotnum; rawcnt++) { HANDLE h = ridl[rawcnt].hDevice; @@ -1506,11 +1511,13 @@ static bool initialize_rawinput (void) if (type == RIM_TYPEHID && !rawinput_enabled_hid) continue; } - if (type == RIM_TYPEKEYBOARD) + if (type == RIM_TYPEKEYBOARD) { + if (num_keyboard >= rnum_kb) + continue; did = di_keyboard; - else if (type == RIM_TYPEMOUSE) + } else if (type == RIM_TYPEMOUSE) { did = di_mouse; - else if (type == RIM_TYPEHID) { + } else if (type == RIM_TYPEHID) { if (!rawinput_enabled_hid) continue; did = di_joystick; @@ -1635,7 +1642,10 @@ static bool initialize_rawinput (void) did->axles++; addplusminus (did, 3); } - did->priority = -1; + if (num_mouse == 1) + did->priority = -1; + else + did->priority = -2; } } else if (type == RIM_TYPEKEYBOARD) { PRID_DEVICE_INFO_KEYBOARD rdik = &rdi->keyboard; @@ -1643,6 +1653,10 @@ static bool initialize_rawinput (void) rdik->dwType, rdik->dwSubType, rdik->dwKeyboardMode, rdik->dwNumberOfFunctionKeys, rdik->dwNumberOfIndicators, rdik->dwNumberOfKeysTotal); addrkblabels (did); + if (num_keyboard == 1) + did->priority = -1; + else + did->priority = -2; } else { bool ok = false; if (hhid != INVALID_HANDLE_VALUE && HidD_GetPreparsedData (hhid, &did->hidpreparseddata)) { @@ -1779,7 +1793,7 @@ static bool initialize_rawinput (void) did->rawinput = NULL; did->connection = DIDC_RAW; did->sortname = my_strdup (_T("NULLKEYBOARD")); - did->priority = -2; + did->priority = -3; did->configname = my_strdup (_T("NULLKEYBOARD")); addrkblabels (did); } diff --git a/od-win32/graphics/amiga_header_2013.bmp b/od-win32/graphics/amiga_header_2013.bmp new file mode 100644 index 00000000..71ee595c Binary files /dev/null and b/od-win32/graphics/amiga_header_2013.bmp differ diff --git a/od-win32/graphics/amiga_welcome_2013.bmp b/od-win32/graphics/amiga_welcome_2013.bmp new file mode 100644 index 00000000..8578bdbb Binary files /dev/null and b/od-win32/graphics/amiga_welcome_2013.bmp differ diff --git a/od-win32/win32.h b/od-win32/win32.h index b31745de..284b90ce 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -19,11 +19,11 @@ #define LANG_DLL 1 #if WINUAEPUBLICBETA -#define WINUAEBETA _T("11") +#define WINUAEBETA _T("12") #else #define WINUAEBETA _T("") #endif -#define WINUAEDATE MAKEBD(2013, 11, 2) +#define WINUAEDATE MAKEBD(2013, 11, 10) #define WINUAEEXTRA _T("") //#define WINUAEEXTRA _T("AmiKit Preview") //#define WINUAEEXTRA _T("Amiga Forever Edition") diff --git a/od-win32/win32gui_extra.cpp b/od-win32/win32gui_extra.cpp index 7b469c1d..b17bcfb9 100644 --- a/od-win32/win32gui_extra.cpp +++ b/od-win32/win32gui_extra.cpp @@ -243,6 +243,7 @@ struct newresource *scaleresource (struct newresource *res, HWND parent, int res d->style |= DS_MODALFRAME; d->style &= ~WS_THICKFRAME; } + d->style |= WS_MINIMIZEBOX; d2 = (DLGTEMPLATEEX_END*)ns->resource; p = (BYTE*)d + sizeof (DLGTEMPLATEEX); diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 51cdf1e0..9b9d5b3c 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -2,6 +2,19 @@ - restore only single input target to default. +Beta 12: + +- AROS rom memory mapping fixed (b1). +- RTG mode video recording image size was accidentally restricted to native chipset size. +- Ignore VPOSW writes if it would move vertical position backwards or if vpos is changed during vertical + blanking and new value is also inside vblank period. (Prevents strange behavior if program tries to + do weird things) +- Added minimize button to GUI window. +- 68000 CE ADDA.x/SUBA.x Rn,An was 2 cycles too fast. +- DIVS/DIVU prefetch is after division operation, not before like with MULS/MULU. +- Adjusted data returned when accessing non-existing memory. +- New Wix based installer test version included. Remove old installation first. + Beta 11: - 68000/010 CPU core merge accidentally removed 68000 CLR to memory and Scc to memory dummy read diff --git a/od-win32/wix/Product.wxs b/od-win32/wix/Product.wxs index 50c537e1..4e377945 100644 --- a/od-win32/wix/Product.wxs +++ b/od-win32/wix/Product.wxs @@ -3,25 +3,29 @@ + + - + - - + + - - + + + + @@ -33,14 +37,104 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -57,13 +151,47 @@ - - + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/od-win32/wix/WixUI_FeatureTree_NL.wxs b/od-win32/wix/WixUI_FeatureTree_NL.wxs new file mode 100644 index 00000000..349b8c6d --- /dev/null +++ b/od-win32/wix/WixUI_FeatureTree_NL.wxs @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + NOT Installed + Installed AND PATCH + + 1 + LicenseAccepted = "1" + + Installed + NOT Installed + 1 + + NOT Installed OR WixUI_InstallMode = "Change" + Installed AND NOT PATCH + Installed AND PATCH + + 1 + + 1 + 1 + 1 + 1 + + + + + \ No newline at end of file diff --git a/od-win32/wix/wix.wixproj b/od-win32/wix/wix.wixproj index a237e88e..0bd3b62c 100644 --- a/od-win32/wix/wix.wixproj +++ b/od-win32/wix/wix.wixproj @@ -22,6 +22,7 @@ +