From 556f2a8a2e0340792760c7e3f4200ada41bd8897 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 5 Mar 2016 13:13:37 +0200 Subject: [PATCH] 3300b8 --- autoconf.cpp | 6 +- blkdev.cpp | 13 ++-- bsdsocket.cpp | 18 ++--- cdtvcr.cpp | 71 +++++++++++++++++-- cfgfile.cpp | 30 ++++---- debug.cpp | 4 +- expansion.cpp | 82 ++++++++++++---------- filesys.cpp | 69 ++++++++++-------- gfxboard.cpp | 65 ++++++++++------- include/autoconf.h | 2 +- include/gfxboard.h | 18 ++--- include/memory.h | 11 +++ include/options.h | 14 +++- include/traps.h | 2 + inputdevice.cpp | 16 +---- main.cpp | 92 +++++++++++++----------- memory.cpp | 12 ++-- od-win32/blkdev_win32_ioctl.cpp | 10 ++- od-win32/bsdsock.cpp | 23 +++++- od-win32/clipboard_win32.cpp | 3 +- od-win32/mman.cpp | 64 +++++++++-------- od-win32/picasso96_win.cpp | 27 +++---- od-win32/resources/resource.h | 2 + od-win32/resources/winuae.rc | 9 +-- od-win32/rp.cpp | 9 ++- od-win32/win32.cpp | 53 +++++++++++--- od-win32/win32.h | 4 +- od-win32/win32gfx.cpp | 12 +--- od-win32/win32gui.cpp | 120 ++++++++++++++++++-------------- od-win32/winuaechangelog.txt | 24 +++++++ traps.cpp | 14 +++- x86.cpp | 2 +- zfile.cpp | 3 +- 33 files changed, 568 insertions(+), 336 deletions(-) diff --git a/autoconf.cpp b/autoconf.cpp index 66f174ae..18b4cbe8 100644 --- a/autoconf.cpp +++ b/autoconf.cpp @@ -352,7 +352,11 @@ static uae_u32 REGPARAM2 getchipmemsize (TrapContext *ctx) static uae_u32 REGPARAM2 uae_puts (TrapContext *ctx) { - puts ((char*)get_real_address(trap_get_areg(ctx, 0))); + uae_char buf[MAX_DPATH]; + trap_get_string(ctx, buf, trap_get_areg(ctx, 0), sizeof uae_char); + TCHAR *s = au(buf); + write_log(_T("%s"), s); + xfree(s); return 0; } diff --git a/blkdev.cpp b/blkdev.cpp index 2521b651..f88af487 100644 --- a/blkdev.cpp +++ b/blkdev.cpp @@ -493,9 +493,6 @@ void sys_command_close (int unitnum) tape_free (st->tape); st->tape = NULL; } -#ifdef RETROPLATFORM - rp_cd_device_enable (unitnum, false); -#endif sys_command_close_internal (unitnum); } @@ -742,7 +739,7 @@ int sys_command_cd_pause (int unitnum, int paused) int v; if (state[unitnum].device_func->pause == NULL) { int as = audiostatus (unitnum); - uae_u8 cmd[10] = {0x4b,0,0,0,0,0,0,0,paused?0:1,0}; + uae_u8 cmd[10] = {0x4b,0,0,0,0,0,0,0,(uae_u8)(paused?0:1),0}; do_scsi (unitnum, cmd, sizeof cmd); v = as == AUDIO_STATUS_PAUSED; } else { @@ -880,7 +877,7 @@ int sys_command_cd_read (int unitnum, uae_u8 *data, int block, int size) if (!getsem (unitnum)) return 0; if (state[unitnum].device_func->read == NULL) { - uae_u8 cmd1[12] = { 0x28, 0, block >> 24, block >> 16, block >> 8, block >> 0, 0, size >> 8, size >> 0, 0, 0, 0 }; + uae_u8 cmd1[12] = { 0x28, 0, (uae_u8)(block >> 24), (uae_u8)(block >> 16), (uae_u8)(block >> 8), (uae_u8)(block >> 0), 0, (uae_u8)(size >> 8), (uae_u8)(size >> 0), 0, 0, 0 }; v = do_scsi (unitnum, cmd1, sizeof cmd1, data, size * 2048); #if 0 if (!v) { @@ -902,7 +899,7 @@ int sys_command_cd_rawread (int unitnum, uae_u8 *data, int block, int size, int if (!getsem (unitnum)) return 0; if (state[unitnum].device_func->rawread == NULL) { - uae_u8 cmd[12] = { 0xbe, 0, block >> 24, block >> 16, block >> 8, block >> 0, size >> 16, size >> 8, size >> 0, 0x10, 0, 0 }; + uae_u8 cmd[12] = { 0xbe, 0, (uae_u8)(block >> 24), (uae_u8)(block >> 16), (uae_u8)(block >> 8), (uae_u8)(block >> 0), (uae_u8)(size >> 16), (uae_u8)(size >> 8), (uae_u8)(size >> 0), 0x10, 0, 0 }; v = do_scsi (unitnum, cmd, sizeof cmd, data, size * sectorsize); } else { v = state[unitnum].device_func->rawread (unitnum, data, block, size, sectorsize, 0xffffffff); @@ -918,7 +915,7 @@ int sys_command_cd_rawread (int unitnum, uae_u8 *data, int block, int size, int if (!getsem (unitnum)) return 0; if (state[unitnum].device_func->rawread == NULL) { - uae_u8 cmd[12] = { 0xbe, 0, block >> 24, block >> 16, block >> 8, block >> 0, size >> 16, size >> 8, size >> 0, 0x10, 0, 0 }; + uae_u8 cmd[12] = { 0xbe, 0, (uae_u8)(block >> 24), (uae_u8)(block >> 16), (uae_u8)(block >> 8), (uae_u8)(block >> 0), (uae_u8)(size >> 16), (uae_u8)(size >> 8), (uae_u8)(size >> 0), 0x10, 0, 0 }; v = do_scsi (unitnum, cmd, sizeof cmd, data, size * sectorsize); } else { v = state[unitnum].device_func->rawread (unitnum, data, block, size, sectorsize, (sectortype << 16) | (scsicmd9 << 8) | subs); @@ -936,7 +933,7 @@ int sys_command_read (int unitnum, uae_u8 *data, int block, int size) if (!getsem (unitnum)) return 0; if (state[unitnum].device_func->read == NULL) { - uae_u8 cmd[12] = { 0xa8, 0, 0, 0, 0, 0, size >> 24, size >> 16, size >> 8, size >> 0, 0, 0 }; + uae_u8 cmd[12] = { 0xa8, 0, 0, 0, 0, 0, (uae_u8)(size >> 24), (uae_u8)(size >> 16), (uae_u8)(size >> 8), (uae_u8)(size >> 0), 0, 0 }; cmd[2] = (uae_u8)(block >> 24); cmd[3] = (uae_u8)(block >> 16); cmd[4] = (uae_u8)(block >> 8); diff --git a/bsdsocket.cpp b/bsdsocket.cpp index 09bc2ba9..10345a53 100644 --- a/bsdsocket.cpp +++ b/bsdsocket.cpp @@ -409,11 +409,11 @@ static struct socketbase *alloc_socketbase (TrapContext *ctx) sb->dtablesize = DEFAULT_DTABLE_SIZE; /* @@@ check malloc() result */ - sb->dtable = (SOCKET*)malloc (sb->dtablesize * sizeof (*sb->dtable)); - sb->ftable = (int*)malloc (sb->dtablesize * sizeof (*sb->ftable)); + sb->dtable = xmalloc(SOCKET, sb->dtablesize); + sb->ftable = xcalloc(int, sb->dtablesize); for (i = sb->dtablesize; i--;) - sb->dtable[i] = -1; + sb->dtable[i] = INVALID_SOCKET; sb->eintrsigs = 0x1000; /* SIGBREAKF_CTRL_C */ @@ -732,9 +732,9 @@ static uae_u32 bsdsocklib_SetDTableSize (SB, int newSize) if (newdtable == NULL || newftable == NULL || newmtable == NULL) { sb->resultval = -1; bsdsocklib_seterrno(ctx, sb, ENOMEM); - free (newdtable); - free (newftable); - free (newmtable); + xfree(newdtable); + xfree(newftable); + xfree(newmtable); return -1; } @@ -745,9 +745,9 @@ static uae_u32 bsdsocklib_SetDTableSize (SB, int newSize) newdtable[i] = -1; sb->dtablesize = newSize; - free(sb->dtable); - free(sb->ftable); - free(sb->mtable); + xfree(sb->dtable); + xfree(sb->ftable); + xfree(sb->mtable); sb->dtable = (SOCKET*)newdtable; sb->ftable = newftable; sb->mtable = newmtable; diff --git a/cdtvcr.cpp b/cdtvcr.cpp index 9cb6f7bc..a5d76a01 100644 --- a/cdtvcr.cpp +++ b/cdtvcr.cpp @@ -27,6 +27,12 @@ #include "threaddep/thread.h" #include "uae.h" #include "custom.h" +#include "rommgr.h" + +#if CDTVCR_4510_EMULATION +static void init_65c02(void); +static void cpu_4510(void); +#endif #define CDTVCR_MASK 0xffff @@ -896,6 +902,12 @@ void CDTVCR_hsync_handler (void) if (!currprefs.cs_cdtvcr) return; +#if CDTVCR_4510_EMULATION + for (int i = 0; i < 10; i++) { + cpu_4510(); + } +#endif + if (cdtvcr_wait_sectors > 0 && currprefs.cd_speed == 0) { cdtvcr_wait_sectors = 0; cdtvcr_cmd_done(); @@ -995,6 +1007,10 @@ void cdtvcr_reset(void) cdtvcr_battram_reset(); cdtvcr_clock[0] = 0xe3; cdtvcr_clock[1] = 0x1b; + +#if CDTVCR_4510_EMULATION + init_65c02(); +#endif } void cdtvcr_free(void) @@ -1066,6 +1082,8 @@ static void monitor_startup(int mem) { } +#define CYCLE_EXACT_ALARM + #define INTERRUPT_DELAY 2 #define INTRRUPT_MAX_DMA_PER_OPCODE (7+10000) @@ -1228,7 +1246,7 @@ typedef struct R65C02_regs_s BYTE z; } R65C02_regs_t; -#define DRIVE_RAM_SIZE 32768 +#define DRIVE_RAM_SIZE 65536 typedef BYTE drive_read_func_t(struct drive_context_s *, WORD); typedef void drive_store_func_t(struct drive_context_s *, WORD, @@ -1322,7 +1340,7 @@ typedef struct drivecpu_context_s #define STORE_ZERO(a, b) (drv->cpud->store_func[0](drv, (WORD)(a), \ (BYTE)(b))) -#define JUMP(addr) \ +#define JUMP(addr) reg_pc = (unsigned int)(addr); #define P_SIGN 0x80 #define P_OVERFLOW 0x40 @@ -1461,11 +1479,18 @@ static CLOCK alarm_context_next_pending_clk(alarm_context_t *context) return context->next_pending_alarm_clk; } +static struct drive_context_s m_4510_context; +static struct drivecpu_context_s m_4510_cpu_context; +static struct drivecpud_context_s m_4510_cpud_context; +static CLOCK m_4510_clk; +static struct alarm_context_s m_4510_alarm_context; +static struct interrupt_cpu_status_s m_4510_interrupt; + static void cpu_4510(void) { int cpu_type = CPU_R65C02; - drivecpu_context_t *cpu = NULL; - drive_context_t *drv = NULL; + drivecpu_context_t *cpu = &m_4510_cpu_context; + drive_context_t *drv = &m_4510_context; #define reg_a (cpu->cpu_regs.a) #define reg_x (cpu->cpu_regs.x) @@ -1479,14 +1504,48 @@ static void cpu_4510(void) #include "65c02core.cpp" } -static void init_65c02(struct drive_context_s *drv) +BYTE read_4510(struct drive_context_s *c, WORD offset) { - drivecpu_context_t *cpu = drv->cpu; + if (offset >= 32768) + return c->cpud->drive_ram[offset]; + return 0; +} +void write_4510(struct drive_context_s *c, WORD offset, BYTE v) +{ + if (offset >= 32768) + return; + c->cpud->drive_ram[offset] = v; +} + +static void init_65c02(void) +{ + drive_context_s *d = &m_4510_context; + drivecpu_context_s *cpu = &m_4510_cpu_context; + drivecpud_context_s *cpud = &m_4510_cpud_context; + + d->cpu = cpu; + d->cpud = cpud; + d->clk_ptr = &m_4510_clk; cpu->rmw_flag = 0; cpu->d_bank_limit = 0; cpu->d_bank_start = 0; cpu->pageone = NULL; + cpu->alarm_context = &m_4510_alarm_context; + cpu->int_status = &m_4510_interrupt; + + cpu->int_status->global_pending_int = IK_RESET; + + for(int i = 0; i < 256; i++) { + cpud->read_func[i] = read_4510; + cpud->store_func[i] = write_4510; + } + + struct zfile *zf = read_rom_name(_T("d:\\amiga\\roms\\cdtv-cr-4510.bin")); + if (zf) { + zfile_fread(cpud->drive_ram + 32768, 1, 32768, zf); + zfile_fclose(zf); + } } #endif diff --git a/cfgfile.cpp b/cfgfile.cpp index 60a68a1b..596ef519 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -1729,7 +1729,10 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) if (!cr->inuse) continue; cr->index = i; - _stprintf (tmp, _T("%f"), cr->rate); + if (cr->rate == 0) + _tcscpy(tmp, _T("0")); + else + _stprintf (tmp, _T("%f"), cr->rate); TCHAR *s = tmp + _tcslen (tmp); if (cr->label[0] > 0 && i < MAX_CHIPSET_REFRESH) s += _stprintf (s, _T(",t=%s"), cr->label); @@ -1857,8 +1860,8 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) } cfgfile_dwrite(f, _T("cpuboardmem1_size"), _T("%d"), p->cpuboardmem1_size / 0x100000); cfgfile_dwrite(f, _T("cpuboardmem2_size"), _T("%d"), p->cpuboardmem2_size / 0x100000); - cfgfile_write(f, _T("gfxcard_size"), _T("%d"), p->rtgmem_size / 0x100000); - cfgfile_write_str(f, _T("gfxcard_type"), gfxboard_get_configname(p->rtgmem_type)); + cfgfile_write(f, _T("gfxcard_size"), _T("%d"), p->rtgboards[0].rtgmem_size / 0x100000); + cfgfile_write_str(f, _T("gfxcard_type"), gfxboard_get_configname(p->rtgboards[0].rtgmem_type)); cfgfile_write_bool(f, _T("gfxcard_hardware_vblank"), p->rtg_hardwareinterrupt); cfgfile_write_bool (f, _T("gfxcard_hardware_sprite"), p->rtg_hardwaresprite); cfgfile_write (f, _T("chipmem_size"), _T("%d"), p->chipmem_size == 0x20000 ? -1 : (p->chipmem_size == 0x40000 ? 0 : p->chipmem_size / 0x80000)); @@ -4453,7 +4456,7 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH || cfgfile_intval (option, value, _T("megachipmem_size"), &p->z3chipmem_size, 0x100000) || cfgfile_intval (option, value, _T("z3mem_start"), &p->z3autoconfig_start, 1) || cfgfile_intval (option, value, _T("bogomem_size"), &p->bogomem_size, 0x40000) - || cfgfile_intval (option, value, _T("gfxcard_size"), &p->rtgmem_size, 0x100000) + || cfgfile_intval (option, value, _T("gfxcard_size"), &p->rtgboards[0].rtgmem_size, 0x100000) || cfgfile_intval(option, value, _T("rtg_modes"), &p->picasso96_modeflags, 1) || cfgfile_intval (option, value, _T("floppy_speed"), &p->floppy_speed, 1) || cfgfile_intval (option, value, _T("cd_speed"), &p->cd_speed, 1) @@ -4511,14 +4514,15 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH return 1; if (cfgfile_string(option, value, _T("gfxcard_type"), tmpbuf, sizeof tmpbuf / sizeof(TCHAR))) { - p->rtgmem_type = 0; + p->rtgboards[0].rtgmem_type = 0; i = 0; for (;;) { const TCHAR *t = gfxboard_get_configname(i); - if (!t) + if (!t) { break; + } if (!_tcsicmp(t, tmpbuf)) { - p->rtgmem_type = i; + p->rtgboards[0].rtgmem_type = i; break; } i++; @@ -5588,7 +5592,7 @@ int parse_cmdline_option (struct uae_prefs *p, TCHAR c, const TCHAR *arg) break; case 'U': - p->rtgmem_size = _tstoi (arg) * 0x100000; + p->rtgboards[0].rtgmem_size = _tstoi (arg) * 0x100000; break; case 'F': @@ -6335,8 +6339,8 @@ void default_prefs (struct uae_prefs *p, bool reset, int type) p->z3autoconfig_start = 0x10000000; p->chipmem_size = 0x00080000; p->bogomem_size = 0x00080000; - p->rtgmem_size = 0x00000000; - p->rtgmem_type = GFXBOARD_UAE_Z3; + p->rtgboards[0].rtgmem_size = 0x00000000; + p->rtgboards[0].rtgmem_type = GFXBOARD_UAE_Z3; p->custom_memory_addrs[0] = 0; p->custom_memory_sizes[0] = 0; p->custom_memory_addrs[1] = 0; @@ -6499,8 +6503,8 @@ static void buildin_default_prefs (struct uae_prefs *p) p->z3fastmem_size = 0x00000000; p->z3fastmem2_size = 0x00000000; p->z3chipmem_size = 0x00000000; - p->rtgmem_size = 0x00000000; - p->rtgmem_type = GFXBOARD_UAE_Z3; + p->rtgboards[0].rtgmem_size = 0x00000000; + p->rtgboards[0].rtgmem_type = GFXBOARD_UAE_Z3; p->cs_rtc = 0; p->cs_a1000ram = false; @@ -7031,7 +7035,7 @@ static int bip_super (struct uae_prefs *p, int config, int compa, int romcheck) p->bogomem_size = 0; p->chipmem_size = 0x400000; p->z3fastmem_size = 8 * 1024 * 1024; - p->rtgmem_size = 16 * 1024 * 1024; + p->rtgboards[0].rtgmem_size = 16 * 1024 * 1024; p->cpu_model = 68040; p->fpu_model = 68040; p->chipset_mask = CSMASK_AGA | CSMASK_ECS_AGNUS | CSMASK_ECS_DENISE; diff --git a/debug.cpp b/debug.cpp index 25d798af..b56d1516 100644 --- a/debug.cpp +++ b/debug.cpp @@ -2181,8 +2181,8 @@ static void illg_init (void) } addr = end - 1; } - if (currprefs.rtgmem_size) - memset (illghdebug + (gfxmem_bank.start >> 16), 3, currprefs.rtgmem_size >> 16); + if (currprefs.rtgboards[0].rtgmem_size) + memset (illghdebug + (gfxmem_bank.start >> 16), 3, currprefs.rtgboards[0].rtgmem_size >> 16); i = 0; while (custd[i].name) { diff --git a/expansion.cpp b/expansion.cpp index 54e2224f..dd0a8efd 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -1101,8 +1101,6 @@ static uae_u8 *REGPARAM2 filesys_xlate(uaecptr addr) #endif /* FILESYS */ -// experimental hardware uae board - DECLARE_MEMORY_FUNCTIONS(uaeboard); addrbank uaeboard_bank = { uaeboard_lget, uaeboard_wget, uaeboard_bget, @@ -1606,7 +1604,7 @@ static addrbank* expamem_init_filesys (int devnum) expamem_write (0x24, 0x01); /* ser.no. Byte 3 */ /* er_InitDiagVec */ - expamem_write (0x28, 0x20); /* Rom-Offset hi */ + expamem_write (0x28, 0x20); /* ROM-Offset hi */ expamem_write (0x2c, 0x00); /* ROM-Offset lo */ expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/ @@ -1824,8 +1822,9 @@ static void allocate_expamem (void) currprefs.fastmem2_size = changed_prefs.fastmem2_size; currprefs.z3fastmem_size = changed_prefs.z3fastmem_size; currprefs.z3fastmem2_size = changed_prefs.z3fastmem2_size; - currprefs.rtgmem_size = changed_prefs.rtgmem_size; - currprefs.rtgmem_type = changed_prefs.rtgmem_type; + for (int i = 0; i < MAX_RTG_BOARDS; i++) { + memcpy(&currprefs.rtgboards[i], &changed_prefs.rtgboards[i], sizeof(struct rtgboardconfig)); + } currprefs.z3chipmem_size = changed_prefs.z3chipmem_size; z3chipmem_bank.start = Z3BASE_UAE; @@ -1920,10 +1919,11 @@ static void allocate_expamem (void) } #ifdef PICASSO96 - if (gfxmem_bank.allocated != currprefs.rtgmem_size) { + struct rtgboardconfig *rbc = &currprefs.rtgboards[0]; + if (gfxmem_bank.allocated != rbc->rtgmem_size) { mapped_free (&gfxmem_bank); - if (currprefs.rtgmem_type < GFXBOARD_HARDWARE) - mapped_malloc_dynamic (&currprefs.rtgmem_size, &changed_prefs.rtgmem_size, &gfxmem_bank, 1, currprefs.rtgmem_type ? _T("z3_gfx") : _T("z2_gfx")); + if (rbc->rtgmem_type < GFXBOARD_HARDWARE) + mapped_malloc_dynamic (&rbc->rtgmem_size, &changed_prefs.rtgboards[0].rtgmem_size, &gfxmem_bank, 1, rbc->rtgmem_type ? _T("z3_gfx") : _T("z2_gfx")); memory_hardreset (1); } #endif @@ -1962,7 +1962,7 @@ static void allocate_expamem (void) #ifdef PICASSO96 if (gfxmem_bank.allocated > 0 && gfxmem_bank.start > 0) { restore_ram (p96_filepos, gfxmem_bank.baseaddr); - map_banks(&gfxmem_bank, gfxmem_bank.start >> 16, currprefs.rtgmem_size >> 16, + map_banks(&gfxmem_bank, gfxmem_bank.start >> 16, currprefs.rtgboards[0].rtgmem_size >> 16, gfxmem_bank.allocated); } #endif @@ -2009,7 +2009,7 @@ static uaecptr check_boot_rom (int *boot_rom_type) return b; if (currprefs.input_tablet > 0) return b; - if (currprefs.rtgmem_size && currprefs.rtgmem_type < GFXBOARD_HARDWARE) + if (currprefs.rtgboards[0].rtgmem_size && currprefs.rtgboards[0].rtgmem_type < GFXBOARD_HARDWARE) return b; if (currprefs.win32_automount_removable) return b; @@ -2256,31 +2256,37 @@ void expamem_reset (void) } #endif #ifdef PICASSO96 - if (currprefs.rtgmem_type == GFXBOARD_UAE_Z2 && gfxmem_bank.baseaddr != NULL) { - cards[cardno].flags = 4; - cards[cardno].name = _T("Z2RTG"); - cards[cardno].initnum = expamem_init_gfxcard_z2; - cards[cardno++].map = expamem_map_gfxcard_z2; + for (int i = 0; i < MAX_RTG_BOARDS; i++) { + struct rtgboardconfig *rbc = &currprefs.rtgboards[i]; + if (rbc->rtgmem_size && rbc->rtgmem_type == GFXBOARD_UAE_Z2 && gfxmem_bank.baseaddr != NULL) { + cards[cardno].flags = 4; + cards[cardno].name = _T("Z2RTG"); + cards[cardno].initnum = expamem_init_gfxcard_z2; + cards[cardno++].map = expamem_map_gfxcard_z2; + } } #endif #ifdef GFXBOARD - if (currprefs.rtgmem_type >= GFXBOARD_HARDWARE && gfxboard_get_configtype(currprefs.rtgmem_type) <= 2) { - cards[cardno].flags = 4; - if (currprefs.rtgmem_type == GFXBOARD_A2410) { - cards[cardno].name = _T("Gfxboard A2410"); - cards[cardno++].initnum = tms_init; - } else { - cards[cardno].name = _T("Gfxboard VRAM Zorro II"); - cards[cardno++].initnum = gfxboard_init_memory; - if (gfxboard_num_boards (currprefs.rtgmem_type) == 3) { - cards[cardno].flags = 0; - cards[cardno].name = _T("Gfxboard VRAM Zorro II Extra"); - cards[cardno++].initnum = gfxboard_init_memory_p4_z2; - } - if (gfxboard_is_registers (currprefs.rtgmem_type)) { - cards[cardno].flags = 0; - cards[cardno].name = _T ("Gfxboard Registers"); - cards[cardno++].initnum = gfxboard_init_registers; + for (int i = 0; i < MAX_RTG_BOARDS; i++) { + struct rtgboardconfig *rbc = &currprefs.rtgboards[i]; + if (rbc->rtgmem_size && rbc->rtgmem_type >= GFXBOARD_HARDWARE && gfxboard_get_configtype(rbc) <= 2) { + cards[cardno].flags = 4; + if (rbc->rtgmem_type == GFXBOARD_A2410) { + cards[cardno].name = _T("Gfxboard A2410"); + cards[cardno++].initnum = tms_init; + } else { + cards[cardno].name = _T("Gfxboard VRAM Zorro II"); + cards[cardno++].initnum = gfxboard_init_memory; + if (gfxboard_num_boards (rbc) == 3) { + cards[cardno].flags = 0; + cards[cardno].name = _T("Gfxboard VRAM Zorro II Extra"); + cards[cardno++].initnum = gfxboard_init_memory_p4_z2; + } + if (gfxboard_is_registers (rbc)) { + cards[cardno].flags = 0; + cards[cardno].name = _T ("Gfxboard Registers"); + cards[cardno++].initnum = gfxboard_init_registers; + } } } } @@ -2324,7 +2330,7 @@ void expamem_reset (void) if (z3chipmem_bank.baseaddr != NULL) map_banks_z3(&z3chipmem_bank, z3chipmem_bank.start >> 16, currprefs.z3chipmem_size >> 16); #ifdef PICASSO96 - if (currprefs.rtgmem_type == GFXBOARD_UAE_Z3 && gfxmem_bank.baseaddr != NULL) { + if (currprefs.rtgboards[0].rtgmem_size && currprefs.rtgboards[0].rtgmem_type == GFXBOARD_UAE_Z3 && gfxmem_bank.baseaddr != NULL) { cards[cardno].flags = 4 | 1; cards[cardno].name = _T("Z3RTG"); cards[cardno].initnum = expamem_init_gfxcard_z3; @@ -2332,7 +2338,7 @@ void expamem_reset (void) } #endif #ifdef GFXBOARD - if (currprefs.rtgmem_type >= GFXBOARD_HARDWARE && gfxboard_get_configtype(currprefs.rtgmem_type) == 3) { + if (currprefs.rtgboards[0].rtgmem_size && currprefs.rtgboards[0].rtgmem_type >= GFXBOARD_HARDWARE && gfxboard_get_configtype(&currprefs.rtgboards[0]) == 3) { cards[cardno].flags = 4 | 1; cards[cardno].name = _T ("Gfxboard VRAM Zorro III"); cards[cardno++].initnum = gfxboard_init_memory; @@ -2429,8 +2435,10 @@ void expansion_cleanup (void) mapped_free (&z3chipmem_bank); #ifdef PICASSO96 - if (currprefs.rtgmem_type < GFXBOARD_HARDWARE) - mapped_free (&gfxmem_bank); + for (int i = 0; i < MAX_RTG_BOARDS; i++) { + if (currprefs.rtgboards[i].rtgmem_type < GFXBOARD_HARDWARE) + mapped_free (&gfxmem_bank); + } #endif #ifdef FILESYS @@ -2527,7 +2535,7 @@ void restore_zram (int len, size_t filepos, int num) void restore_pram (int len, size_t filepos) { p96_filepos = filepos; - changed_prefs.rtgmem_size = len; + changed_prefs.rtgboards[0].rtgmem_size = len; } uae_u8 *save_expansion (int *len, uae_u8 *dstptr) diff --git a/filesys.cpp b/filesys.cpp index 19e0a263..f3387d90 100644 --- a/filesys.cpp +++ b/filesys.cpp @@ -1369,33 +1369,6 @@ typedef struct _unit { static uae_u32 a_uniq, key_uniq; - -static void readdpacket(TrapContext *ctx, dpacket *packet, uaecptr pck) -{ - // Read enough to get also all 64-bit fields - packet->packet_addr = pck; - trap_get_bytes(ctx, packet->packet_data, pck, dp_Max); -} -static void writedpacket(TrapContext *ctx, dpacket *packet) -{ - // 32 = saves both 32-bit and 64-bit RESx fields - trap_put_bytes(ctx, packet->packet_data + 12, packet->packet_addr + 12, 32 - 12); -} - -static void set_quadp(TrapContext *ctx, uaecptr p, uae_s64 v) -{ - if (!trap_valid_address(ctx, p, 8)) - return; - trap_put_long(ctx, p, v >> 32); - trap_put_long(ctx, p + 4, (uae_u64)v); -} -static uae_u64 get_quadp(TrapContext *ctx, uaecptr p) -{ - if (!trap_valid_address(ctx, p, 8)) - return 0; - return ((uae_u64)trap_get_long(ctx, p) << 32) | trap_get_long(ctx, p + 4); -} - #define PUT_PCK_RES1(p,v) do { put_long_host((p)->packet_data + dp_Res1, (v)); } while (0) #define PUT_PCK_RES2(p,v) do { put_long_host((p)->packet_data + dp_Res2, (v)); } while (0) #define GET_PCK_TYPE(p) ((uae_s32)(get_long_host((p)->packet_data + dp_Type))) @@ -1420,6 +1393,37 @@ static uae_u64 get_quadp(TrapContext *ctx, uaecptr p) #define GET_PCK64_ARG4(p) ((uae_s32)(get_long_host((p)->packet_data + dp64_Arg4))) #define GET_PCK64_ARG5(p) ( (((uae_s64)(get_long_host((p)->packet_data + dp64_Arg5))) << 32) | (((uae_s64)(get_long_host((p)->packet_data + dp64_Arg5 + 4))) << 0) ) +static void readdpacket(TrapContext *ctx, dpacket *packet, uaecptr pck) +{ + // Read enough to get also all 64-bit fields + packet->packet_addr = pck; + trap_get_bytes(ctx, packet->packet_data, pck, dp_Max); +} +static void writedpacket(TrapContext *ctx, dpacket *packet) +{ + int type = GET_PCK_TYPE(packet); + if (type >= 8000 && type < 9000 && GET_PCK64_RES0(packet) == DP64_INIT) { + // 64-bit RESx fields + trap_put_bytes(ctx, packet->packet_data + 12, packet->packet_addr + 12, 32 - 12); + } else { + // dp_Res1 and dp_Res2 + trap_put_bytes(ctx, packet->packet_data + 12, packet->packet_addr + 12, 20 - 12); + } +} + +static void set_quadp(TrapContext *ctx, uaecptr p, uae_s64 v) +{ + if (!trap_valid_address(ctx, p, 8)) + return; + trap_put_quad(ctx, p, v); +} +static uae_u64 get_quadp(TrapContext *ctx, uaecptr p) +{ + if (!trap_valid_address(ctx, p, 8)) + return 0; + return trap_get_quad(ctx, p); +} + static int flush_cache (Unit *unit, int num); static TCHAR *char1(TrapContext *ctx, uaecptr addr) @@ -4090,7 +4094,14 @@ static void get_fileinfo(TrapContext *ctx, Unit *unit, dpacket *packet, uaecptr put_byte_host(buf + i, 0), i++; xfree (x2); } - trap_put_bytes(ctx, buf, info, sizeof buf); + // Must not write Fib_reserved at the end. + if (kickstart_version >= 36) { + // FIB + fib_OwnerUID and fib_OwnerGID + trap_put_bytes(ctx, buf, info, (sizeof buf) - 32); + } else { + // FIB only + trap_put_bytes(ctx, buf, info, (sizeof buf) - 36); + } PUT_PCK_RES1 (packet, DOS_TRUE); } @@ -8572,7 +8583,7 @@ static uae_u32 REGPARAM2 filesys_dev_storeinfo (TrapContext *ctx) hicyl = ((currprefs.filesys_limit * 1024) / 512) / (heads * 127); } else { struct fs_usage fsu; - if (!get_fs_usage(uip->rootdir, 0, &fsu)) { + if (!get_fs_usage(uip[unit_no].rootdir, 0, &fsu)) { for (;;) { hicyl = (fsu.total / 512) / (heads * 127); if (hicyl < 65536 || heads == 64) diff --git a/gfxboard.cpp b/gfxboard.cpp index 003bfaf5..0a5aab50 100644 --- a/gfxboard.cpp +++ b/gfxboard.cpp @@ -99,7 +99,7 @@ struct gfxboard uae_u32 romtype; }; -#define ISP4() (currprefs.rtgmem_type == GFXBOARD_PICASSO4_Z2 || currprefs.rtgmem_type == GFXBOARD_PICASSO4_Z3) +#define ISP4() (gb->rbc->rtgmem_type == GFXBOARD_PICASSO4_Z2 || gb->rbc->rtgmem_type == GFXBOARD_PICASSO4_Z3) // Picasso II: 8* 4x256 (1M) or 16* 4x256 (2M) // Piccolo: 8* 4x256 + 2* 16x256 (2M) @@ -177,6 +177,8 @@ static const struct gfxboard boards[] = struct rtggfxboard { + int rtg_index; + struct rtgboardconfig *rbc; TCHAR memorybankname[40]; TCHAR wbsmemorybankname[40]; TCHAR lbsmemorybankname[40]; @@ -292,8 +294,11 @@ static addrbank gfxboard_bank_special = { static void init_board (struct rtggfxboard *gb) { + struct rtgboardconfig *rbc = &currprefs.rtgboards[gb->rtg_index]; + gb->rbc = rbc; int vramsize = gb->board->vrammax; + gb->vga_width = 0; mapped_free(&gfxmem_bank); gb->vram_start_offset = 0; @@ -316,14 +321,14 @@ static void init_board (struct rtggfxboard *gb) gb->vramrealstart = gb->vram; gb->vram += gb->vram_start_offset; gfxmem_bank.baseaddr = gb->vram; - gfxmem_bank.allocated = currprefs.rtgmem_size; - gb->vga.vga.vram_size_mb = currprefs.rtgmem_size >> 20; + gfxmem_bank.allocated = rbc->rtgmem_size; + gb->vga.vga.vram_size_mb = rbc->rtgmem_size >> 20; gb->vgaioregion.opaque = &gb->vgaioregionptr; gb->vgavramregion.opaque = &gb->vgavramregionptr; gb->vga.vga.vram.opaque = &gb->vgavramregionptr; vga_common_init(&gb->vga.vga); cirrus_init_common(&gb->vga, gb->board->chiptype, 0, NULL, NULL, gb->board->manufacturer == 0); - picasso_allocatewritewatch (currprefs.rtgmem_size); + picasso_allocatewritewatch (rbc->rtgmem_size); } static void vga_update_size(struct rtggfxboard *gb) @@ -356,7 +361,7 @@ bool gfxboard_toggle (int mode) { struct rtggfxboard *gb = &rtggfxboards[0]; - if (currprefs.rtgmem_type == GFXBOARD_A2410) { + if (currprefs.rtgboards[gb->rtg_index].rtgmem_type == GFXBOARD_A2410) { return tms_toggle(mode); } @@ -488,7 +493,7 @@ void gfxboard_refresh (void) void gfxboard_hsync_handler(void) { struct rtggfxboard *gb = &rtggfxboards[0]; - if (currprefs.rtgmem_type == GFXBOARD_A2410) { + if (gb->rbc->rtgmem_type == GFXBOARD_A2410) { tms_hsync_handler(); } } @@ -498,7 +503,7 @@ bool gfxboard_vsync_handler (void) struct rtggfxboard *gb = &rtggfxboards[0]; bool flushed = false; - if (currprefs.rtgmem_type == GFXBOARD_A2410) { + if (gb->rbc->rtgmem_type == GFXBOARD_A2410) { return tms_vsync_handler(); } @@ -1441,7 +1446,7 @@ static int REGPARAM2 gfxboard_check (uaecptr addr, uae_u32 size) struct rtggfxboard *gb = getgfxboard(addr); addr -= gb->gfxboardmem_start & gfxmem_bank.mask; addr &= gfxmem_bank.mask; - return (addr + size) <= currprefs.rtgmem_size; + return (addr + size) <= gb->rbc->rtgmem_size; } static uae_u8 *REGPARAM2 gfxboard_xlate (uaecptr addr) { @@ -1736,9 +1741,12 @@ static void REGPARAM2 gfxboard_bput_regs_autoconfig (uaecptr addr, uae_u32 b) void gfxboard_free(void) { struct rtggfxboard *gb = &rtggfxboards[0]; - if (currprefs.rtgmem_type == GFXBOARD_A2410) { - tms_free(); - return; + if (gb->rbc) { + if (gb->rbc->rtgmem_type == GFXBOARD_A2410) { + tms_free(); + gb->rbc = NULL; + return; + } } if (gb->vram) { gfxmem_bank.baseaddr = gb->vramrealstart; @@ -1763,13 +1771,14 @@ void gfxboard_free(void) void gfxboard_reset (void) { struct rtggfxboard *gb = &rtggfxboards[0]; - if (currprefs.rtgmem_type == GFXBOARD_A2410) { + gb->rbc = &currprefs.rtgboards[gb->rtg_index]; + if (gb->rbc->rtgmem_type == GFXBOARD_A2410) { tms_reset(); return; } - if (currprefs.rtgmem_type >= GFXBOARD_HARDWARE) { - gb->board = &boards[currprefs.rtgmem_type - GFXBOARD_HARDWARE]; - gfxmem_bank.mask = currprefs.rtgmem_size - 1; + if (gb->rbc->rtgmem_type >= GFXBOARD_HARDWARE) { + gb->board = &boards[gb->rbc->rtgmem_type - GFXBOARD_HARDWARE]; + gfxmem_bank.mask = gb->rbc->rtgmem_size - 1; } gfxboard_free(); if (gb->board) { @@ -2141,8 +2150,9 @@ const TCHAR *gfxboard_get_configname(int type) return boards[type - GFXBOARD_HARDWARE].configname; } -int gfxboard_get_configtype(int type) +int gfxboard_get_configtype(struct rtgboardconfig *rbc) { + int type = rbc->rtgmem_type; if (type == GFXBOARD_UAE_Z2) return 2; if (type == GFXBOARD_UAE_Z3) @@ -2152,8 +2162,9 @@ int gfxboard_get_configtype(int type) return gb->board->configtype; } -bool gfxboard_need_byteswap (int type) +bool gfxboard_need_byteswap (struct rtgboardconfig *rbc) { + int type = rbc->rtgmem_type; if (type < GFXBOARD_HARDWARE) return false; struct rtggfxboard *gb = &rtggfxboards[0]; @@ -2161,15 +2172,17 @@ bool gfxboard_need_byteswap (int type) return gb->board->swap; } -int gfxboard_get_autoconfig_size(int type) +int gfxboard_get_autoconfig_size(struct rtgboardconfig *rbc) { + int type = rbc->rtgmem_type; if (type == GFXBOARD_PICASSO4_Z3) return 32 * 1024 * 1024; return -1; } -int gfxboard_get_vram_min (int type) +int gfxboard_get_vram_min (struct rtgboardconfig *rbc) { + int type = rbc->rtgmem_type; if (type < GFXBOARD_HARDWARE) return -1; struct rtggfxboard *gb = &rtggfxboards[0]; @@ -2177,8 +2190,9 @@ int gfxboard_get_vram_min (int type) return gb->board->vrammin; } -int gfxboard_get_vram_max (int type) +int gfxboard_get_vram_max (struct rtgboardconfig *rbc) { + int type = rbc->rtgmem_type; if (type < GFXBOARD_HARDWARE) return -1; struct rtggfxboard *gb = &rtggfxboards[0]; @@ -2186,8 +2200,9 @@ int gfxboard_get_vram_max (int type) return gb->board->vrammax; } -bool gfxboard_is_registers (int type) +bool gfxboard_is_registers (struct rtgboardconfig *rbc) { + int type = rbc->rtgmem_type; if (type < 2) return false; struct rtggfxboard *gb = &rtggfxboards[0]; @@ -2195,8 +2210,9 @@ bool gfxboard_is_registers (int type) return gb->board->model_registers != 0; } -int gfxboard_num_boards (int type) +int gfxboard_num_boards (struct rtgboardconfig *rbc) { + int type = rbc->rtgmem_type; if (type < 2) return 1; struct rtggfxboard *gb = &rtggfxboards[0]; @@ -2208,8 +2224,9 @@ int gfxboard_num_boards (int type) return 2; } -uae_u32 gfxboard_get_romtype(int type) +uae_u32 gfxboard_get_romtype(struct rtgboardconfig *rbc) { + int type = rbc->rtgmem_type; if (type < 2) return 0; struct rtggfxboard *gb = &rtggfxboards[0]; @@ -2368,7 +2385,7 @@ addrbank *gfxboard_init_memory (int devnum) gfxboard_bank_memory.bget = gfxboard_bget_mem_autoconfig; gfxboard_bank_memory.bput = gfxboard_bput_mem_autoconfig; - if (currprefs.rtgmem_type == GFXBOARD_VGA) { + if (gb->rbc->rtgmem_type == GFXBOARD_VGA) { init_board(gb); gb->configured_mem = 1; gb->configured_regs = 1; diff --git a/include/autoconf.h b/include/autoconf.h index 3fc10fc8..9e76afeb 100644 --- a/include/autoconf.h +++ b/include/autoconf.h @@ -21,7 +21,7 @@ #define RTAREA_TRAPS 0x3000 #define RTAREA_RTG 0x3600 -#define RTAREA_TRAMPOLINE 0x3900 +#define RTAREA_TRAMPOLINE 0x390056 #define RTAREA_DATAREGION 0xF000 #define RTAREA_FSBOARD 0xFFEC diff --git a/include/gfxboard.h b/include/gfxboard.h index a6312d44..a22ac2fb 100644 --- a/include/gfxboard.h +++ b/include/gfxboard.h @@ -8,19 +8,19 @@ extern void gfxboard_free (void); extern void gfxboard_reset (void); extern bool gfxboard_vsync_handler (void); extern void gfxboard_hsync_handler(void); -extern int gfxboard_get_configtype (int); -extern bool gfxboard_is_registers (int); -extern int gfxboard_get_vram_min (int); -extern int gfxboard_get_vram_max (int); -extern bool gfxboard_need_byteswap (int type); -extern int gfxboard_get_autoconfig_size(int type); +extern int gfxboard_get_configtype (struct rtgboardconfig*); +extern bool gfxboard_is_registers (struct rtgboardconfig*); +extern int gfxboard_get_vram_min (struct rtgboardconfig*); +extern int gfxboard_get_vram_max (struct rtgboardconfig*); +extern bool gfxboard_need_byteswap (struct rtgboardconfig*); +extern int gfxboard_get_autoconfig_size(struct rtgboardconfig*); extern double gfxboard_get_vsync (void); extern void gfxboard_refresh (void); extern bool gfxboard_toggle (int mode); -extern int gfxboard_num_boards (int type); -extern uae_u32 gfxboard_get_romtype(int type); +extern int gfxboard_num_boards (struct rtgboardconfig*); +extern uae_u32 gfxboard_get_romtype(struct rtgboardconfig*); extern const TCHAR *gfxboard_get_name(int); -extern const TCHAR *gfxboard_get_manufacturername(int); +extern const TCHAR *gfxboard_get_manufacturername(int); extern const TCHAR *gfxboard_get_configname(int); extern addrbank *tms_init(int devnum); diff --git a/include/memory.h b/include/memory.h index 910431ea..ed3bc56d 100644 --- a/include/memory.h +++ b/include/memory.h @@ -535,6 +535,11 @@ STATIC_INLINE int valid_address (uaecptr addr, uae_u32 size) return get_mem_bank (addr).check(addr, size); } +STATIC_INLINE void put_quad_host(void *addr, uae_u64 v) +{ + do_put_mem_long((uae_u32*)addr, v >> 32); + do_put_mem_long(((uae_u32*)addr) + 1, (uae_u32)v); +} STATIC_INLINE void put_long_host(void *addr, uae_u32 v) { do_put_mem_long((uae_u32*)addr, v); @@ -547,6 +552,12 @@ STATIC_INLINE void put_byte_host(void *addr, uae_u8 v) { *((uae_u8*)addr) = v; } +STATIC_INLINE uae_u64 get_quad_host(void *addr) +{ + uae_u64 v = ((uae_u64)do_get_mem_long((uae_u32*)addr)) << 32; + v |= do_get_mem_long(((uae_u32*)addr) + 1); + return v; +} STATIC_INLINE uae_u32 get_long_host(void *addr) { return do_get_mem_long((uae_u32*)addr); diff --git a/include/options.h b/include/options.h index 96e0c827..450b7af5 100644 --- a/include/options.h +++ b/include/options.h @@ -338,6 +338,12 @@ struct boardromconfig int device_num; struct romconfig roms[MAX_BOARD_ROMS]; }; +#define MAX_RTG_BOARDS 4 +struct rtgboardconfig +{ + int rtgmem_type; + uae_u32 rtgmem_size; +}; #define Z3MAPPING_AUTO 0 #define Z3MAPPING_UAE 1 @@ -597,7 +603,6 @@ struct uae_prefs { uae_u32 mbresmem_low_size; uae_u32 mbresmem_high_size; uae_u32 mem25bit_size; - uae_u32 rtgmem_size; int cpuboard_type; int cpuboard_subtype; int cpuboard_settings; @@ -606,8 +611,8 @@ struct uae_prefs { int ppc_implementation; bool rtg_hardwareinterrupt; bool rtg_hardwaresprite; - int rtgmem_type; bool rtg_more_compatible; + struct rtgboardconfig rtgboards[MAX_RTG_BOARDS]; uae_u32 custom_memory_addrs[MAX_CUSTOM_MEMORY_ADDRS]; uae_u32 custom_memory_sizes[MAX_CUSTOM_MEMORY_ADDRS]; uae_u32 custom_memory_mask[MAX_CUSTOM_MEMORY_ADDRS]; @@ -700,6 +705,11 @@ struct uae_prefs { #endif int statecapturerate, statecapturebuffersize; int aviout_width, aviout_height, aviout_xoffset, aviout_yoffset; + int screenshot_width, screenshot_height, screenshot_xoffset, screenshot_yoffset; + int screenshot_min_width, screenshot_min_height; + int screenshot_max_width, screenshot_max_height; + int screenshot_output_width, screenshot_output_height; + int screenshot_xmult, screenshot_ymult; /* input */ diff --git a/include/traps.h b/include/traps.h index 1476f05b..a34c9043 100644 --- a/include/traps.h +++ b/include/traps.h @@ -113,10 +113,12 @@ uae_u32 trap_get_areg(TrapContext *ctx, int reg); void trap_set_dreg(TrapContext *ctx, int reg, uae_u32 v); void trap_set_areg(TrapContext *ctx, int reg, uae_u32 v); +void trap_put_quad(TrapContext *ctx, uaecptr addr, uae_u64 v); void trap_put_long(TrapContext *ctx, uaecptr addr, uae_u32 v); void trap_put_word(TrapContext *ctx, uaecptr addr, uae_u16 v); void trap_put_byte(TrapContext *ctx, uaecptr addr, uae_u8 v); +uae_u64 trap_get_quad(TrapContext *ctx, uaecptr addr); uae_u32 trap_get_long(TrapContext *ctx, uaecptr addr); uae_u16 trap_get_word(TrapContext *ctx, uaecptr addr); uae_u8 trap_get_byte(TrapContext *ctx, uaecptr addr); diff --git a/inputdevice.cpp b/inputdevice.cpp index 57010f4b..0dca680c 100644 --- a/inputdevice.cpp +++ b/inputdevice.cpp @@ -8407,19 +8407,6 @@ void inputdevice_validate_jports (struct uae_prefs *p, int changedport, bool *fi } } -#if 0 -void store_inputdevice_config (struct uae_prefs *p) -{ - for (int i = 0; i < MAX_JPORTS; i++) { - memcpy (&stored_ports[i], &p->jports[i], sizeof (struct jport)); - } -} -void restore_inputdevice_config (struct uae_prefs *p, int portnum) -{ - memcpy (&p->jports[portnum], &stored_ports[portnum], sizeof (struct jport)); -} -#endif - void inputdevice_joyport_config_store(struct uae_prefs *p, const TCHAR *value, int portnum, int mode, int type) { struct jport *jp = &p->jports[portnum]; @@ -8430,7 +8417,8 @@ void inputdevice_joyport_config_store(struct uae_prefs *p, const TCHAR *value, i } else { _tcscpy(jp->idc.shortid, value); } - jp->mode = mode; + if (mode >= 0) + jp->mode = mode; } int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value1, const TCHAR *value2, int portnum, int mode, int type, bool candefault) diff --git a/main.cpp b/main.cpp index 723b71f5..a0ccb6c8 100644 --- a/main.cpp +++ b/main.cpp @@ -392,19 +392,22 @@ void fixup_prefs (struct uae_prefs *p, bool userconfig) } } - if (p->rtgmem_size > max_z3fastmem && p->rtgmem_type == GFXBOARD_UAE_Z3) { - error_log (_T("Graphics card memory size %d (0x%x) larger than maximum reserved %d (0x%x)."), p->rtgmem_size, p->rtgmem_size, max_z3fastmem, max_z3fastmem); - p->rtgmem_size = max_z3fastmem; - err = 1; - } + for (int i = 0; i < MAX_RTG_BOARDS; i++) { + struct rtgboardconfig *rbc = &p->rtgboards[i]; + if (rbc->rtgmem_size > max_z3fastmem && rbc->rtgmem_type == GFXBOARD_UAE_Z3) { + error_log (_T("Graphics card memory size %d (0x%x) larger than maximum reserved %d (0x%x)."), rbc->rtgmem_size, rbc->rtgmem_size, max_z3fastmem, max_z3fastmem); + rbc->rtgmem_size = max_z3fastmem; + err = 1; + } - if ((p->rtgmem_size & (p->rtgmem_size - 1)) != 0 || (p->rtgmem_size != 0 && (p->rtgmem_size < 0x100000))) { - error_log (_T("Unsupported graphics card memory size %d (0x%x)."), p->rtgmem_size, p->rtgmem_size); - if (p->rtgmem_size > max_z3fastmem) - p->rtgmem_size = max_z3fastmem; - else - p->rtgmem_size = 0; - err = 1; + if ((rbc->rtgmem_size & (rbc->rtgmem_size - 1)) != 0 || (rbc->rtgmem_size != 0 && (rbc->rtgmem_size < 0x100000))) { + error_log (_T("Unsupported graphics card memory size %d (0x%x)."), rbc->rtgmem_size, rbc->rtgmem_size); + if (rbc->rtgmem_size > max_z3fastmem) + rbc->rtgmem_size = max_z3fastmem; + else + rbc->rtgmem_size = 0; + err = 1; + } } if (p->z3fastmem_size > max_z3fastmem) { @@ -467,11 +470,6 @@ void fixup_prefs (struct uae_prefs *p, bool userconfig) p->chipmem_size = 0x200000; err = 1; } - if (p->chipmem_size > 0x200000 && p->rtgmem_size && gfxboard_get_configtype(p->rtgmem_type) == 2) { - error_log(_T("You can't use Zorro II RTG and more than 2MB chip at the same time.")); - p->chipmem_size = 0x200000; - err = 1; - } if (p->mem25bit_size > 128 * 1024 * 1024 || (p->mem25bit_size & 0xfffff)) { p->mem25bit_size = 0; error_log(_T("Unsupported 25bit RAM size")); @@ -485,30 +483,38 @@ void fixup_prefs (struct uae_prefs *p, bool userconfig) error_log (_T("Unsupported CPU Board RAM size.")); } - if (p->rtgmem_type >= GFXBOARD_HARDWARE) { - if (gfxboard_get_vram_min(p->rtgmem_type) > 0 && p->rtgmem_size < gfxboard_get_vram_min (p->rtgmem_type)) { - error_log(_T("Graphics card memory size %d (0x%x) smaller than minimum hardware supported %d (0x%x)."), - p->rtgmem_size, p->rtgmem_size, gfxboard_get_vram_min(p->rtgmem_type), gfxboard_get_vram_min(p->rtgmem_type)); - p->rtgmem_size = gfxboard_get_vram_min (p->rtgmem_type); + for (int i = 0; i < MAX_RTG_BOARDS; i++) { + struct rtgboardconfig *rbc = &p->rtgboards[i]; + if (p->chipmem_size > 0x200000 && rbc->rtgmem_size && gfxboard_get_configtype(rbc) == 2) { + error_log(_T("You can't use Zorro II RTG and more than 2MB chip at the same time.")); + p->chipmem_size = 0x200000; + err = 1; } - if (p->address_space_24 && gfxboard_get_configtype(p->rtgmem_type) == 3) { - p->rtgmem_type = GFXBOARD_UAE_Z2; - p->rtgmem_size = 0; - error_log (_T("Z3 RTG and 24-bit address space are not compatible.")); + if (rbc->rtgmem_type >= GFXBOARD_HARDWARE) { + if (gfxboard_get_vram_min(rbc) > 0 && rbc->rtgmem_size < gfxboard_get_vram_min (rbc)) { + error_log(_T("Graphics card memory size %d (0x%x) smaller than minimum hardware supported %d (0x%x)."), + rbc->rtgmem_size, rbc->rtgmem_size, gfxboard_get_vram_min(rbc), gfxboard_get_vram_min(rbc)); + rbc->rtgmem_size = gfxboard_get_vram_min (rbc); + } + if (p->address_space_24 && gfxboard_get_configtype(rbc) == 3) { + rbc->rtgmem_type = GFXBOARD_UAE_Z2; + rbc->rtgmem_size = 0; + error_log (_T("Z3 RTG and 24-bit address space are not compatible.")); + } + if (gfxboard_get_vram_max(rbc) > 0 && rbc->rtgmem_size > gfxboard_get_vram_max(rbc)) { + error_log(_T("Graphics card memory size %d (0x%x) larger than maximum hardware supported %d (0x%x)."), + rbc->rtgmem_size, rbc->rtgmem_size, gfxboard_get_vram_max(rbc), gfxboard_get_vram_max(rbc)); + rbc->rtgmem_size = gfxboard_get_vram_max(rbc); + } } - if (gfxboard_get_vram_max(p->rtgmem_type) > 0 && p->rtgmem_size > gfxboard_get_vram_max(p->rtgmem_type)) { - error_log(_T("Graphics card memory size %d (0x%x) larger than maximum hardware supported %d (0x%x)."), - p->rtgmem_size, p->rtgmem_size, gfxboard_get_vram_max(p->rtgmem_type), gfxboard_get_vram_max(p->rtgmem_type)); - p->rtgmem_size = gfxboard_get_vram_max(p->rtgmem_type); + if (p->address_space_24 && rbc->rtgmem_size && rbc->rtgmem_type == GFXBOARD_UAE_Z3) { + error_log (_T("Z3 RTG and 24bit address space are not compatible.")); + rbc->rtgmem_type = GFXBOARD_UAE_Z2; + } + if (rbc->rtgmem_size && rbc->rtgmem_type == GFXBOARD_UAE_Z2 && (p->chipmem_size > 2 * 1024 * 1024 || getz2size (p) > 8 * 1024 * 1024 || getz2size (p) < 0)) { + rbc->rtgmem_size = 0; + error_log (_T("Too large Z2 RTG memory size.")); } - } - if (p->address_space_24 && p->rtgmem_size && p->rtgmem_type == GFXBOARD_UAE_Z3) { - error_log (_T("Z3 RTG and 24bit address space are not compatible.")); - p->rtgmem_type = GFXBOARD_UAE_Z2; - } - if (p->rtgmem_type == GFXBOARD_UAE_Z2 && (p->chipmem_size > 2 * 1024 * 1024 || getz2size (p) > 8 * 1024 * 1024 || getz2size (p) < 0)) { - p->rtgmem_size = 0; - error_log (_T("Too large Z2 RTG memory size.")); } if (p->cs_z3autoconfig && p->address_space_24) { @@ -561,10 +567,12 @@ void fixup_prefs (struct uae_prefs *p, bool userconfig) p->z3chipmem_size = 0; err = 1; } - if ((p->rtgmem_size > 0 && p->rtgmem_type == GFXBOARD_UAE_Z3) && p->address_space_24) { - error_log (_T("UAEGFX RTG can't be used if address space is 24-bit.")); - p->rtgmem_size = 0; - err = 1; + for (int i = 0; i < MAX_RTG_BOARDS; i++) { + if ((p->rtgboards[i].rtgmem_size > 0 && p->rtgboards[i].rtgmem_type == GFXBOARD_UAE_Z3) && p->address_space_24) { + error_log (_T("UAEGFX RTG can't be used if address space is 24-bit.")); + p->rtgboards[i].rtgmem_size = 0; + err = 1; + } } #if !defined (BSDSOCKET) diff --git a/memory.cpp b/memory.cpp index e6c68263..2fc1c1d3 100644 --- a/memory.cpp +++ b/memory.cpp @@ -2128,13 +2128,13 @@ uae_s32 getz2size (struct uae_prefs *p) { ULONG start; start = p->fastmem_size; - if (p->rtgmem_size && gfxboard_get_configtype(p->rtgmem_type) == 2) { - while (start & (p->rtgmem_size - 1) && start < 8 * 1024 * 1024) + if (p->rtgboards[0].rtgmem_size && gfxboard_get_configtype(&p->rtgboards[0]) == 2) { + while (start & (p->rtgboards[0].rtgmem_size - 1) && start < 8 * 1024 * 1024) start += 1024 * 1024; - if (start + p->rtgmem_size > 8 * 1024 * 1024) + if (start + p->rtgboards[0].rtgmem_size > 8 * 1024 * 1024) return -1; } - start += p->rtgmem_size; + start += p->rtgboards[0].rtgmem_size; return start; } @@ -2142,10 +2142,10 @@ uae_u32 getz2endaddr (void) { ULONG start; start = currprefs.fastmem_size; - if (currprefs.rtgmem_size && gfxboard_get_configtype(currprefs.rtgmem_type) == 2) { + if (currprefs.rtgboards[0].rtgmem_size && gfxboard_get_configtype(&currprefs.rtgboards[0]) == 2) { if (!start) start = 0x00200000; - while (start & (currprefs.rtgmem_size - 1) && start < 4 * 1024 * 1024) + while (start & (currprefs.rtgboards[0].rtgmem_size - 1) && start < 4 * 1024 * 1024) start += 1024 * 1024; } return start + 2 * 1024 * 1024; diff --git a/od-win32/blkdev_win32_ioctl.cpp b/od-win32/blkdev_win32_ioctl.cpp index 277a4fd8..ed8a3814 100644 --- a/od-win32/blkdev_win32_ioctl.cpp +++ b/od-win32/blkdev_win32_ioctl.cpp @@ -895,8 +895,14 @@ static int ioctl_command_qcode (int unitnum, uae_u8 *buf, int sector) tolongbcd (p + 3, msf); } -// write_log (_T("%6d %02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x\n"), -// pos, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11]); +#if 0 + uae_u8 *s = buf + 4; + write_log(_T("CTRLADR:%02X TRK=%02X IDX=%02X MSF=%02X:%02X:%02X %02X:%02X:%02X\n"), + s[0], s[1], s[2], + s[3], s[4], s[5], + s[7], s[8], s[9]); +#endif + return 1; } diff --git a/od-win32/bsdsock.cpp b/od-win32/bsdsock.cpp index 1920b017..3fa3e295 100644 --- a/od-win32/bsdsock.cpp +++ b/od-win32/bsdsock.cpp @@ -611,7 +611,9 @@ int host_socket(TrapContext *ctx, SB, int af, int type, int protocol) unsigned long nonblocking = 1; int faketype; - BSDTRACE((_T("socket(%s,%s,%d) -> "),af == AF_INET ? _T("AF_INET") : _T("AF_other"),type == SOCK_STREAM ? _T("SOCK_STREAM") : type == SOCK_DGRAM ? _T("SOCK_DGRAM ") : _T("SOCK_RAW"),protocol)); + BSDTRACE((_T("socket(%s,%s,%d) -> "), + af == AF_INET ? _T("AF_INET") : _T("AF_other"), + type == SOCK_STREAM ? _T("SOCK_STREAM") : type == SOCK_DGRAM ? _T("SOCK_DGRAM ") : _T("SOCK_RAW"),protocol)); faketype = type; if (protocol == IPPROTO_UDP && type == SOCK_RAW && !rawsockets) @@ -1089,16 +1091,29 @@ void host_sendto (TrapContext *ctx, SB, uae_u32 sd, uae_u32 msg, uae_u32 len, ua BSDTRACE((_T("send(%d,0x%x,%d,%d):%d -> "),sd,msg,len,flags,wscnt)); sd++; - s = getsock(ctx, sb,sd); + s = getsock(ctx, sb, sd); if (s != INVALID_SOCKET) { if (!addr_valid (_T("host_sendto1"), msg, 4)) return; realpt = (char*)get_real_address (msg); + if (ISBSDTRACE) { + write_log(_T("FT %08x "), sb->ftable[sd - 1]); + for (int i = 0; i < 28; i++) { + if (i > 0) + write_log(_T(".")); + write_log(_T("%02X"), (uae_u8)realpt[i]); + } + write_log(_T(" -> ")); + } + if (to) { if (tolen > sizeof buf) { write_log (_T("BSDSOCK: WARNING - Target address in sendto() too large (%d):%d!\n"), tolen,wscnt); + sb->resultval = -1; + bsdsocklib_seterrno(ctx, sb, 22); // EINVAL + goto error; } else { if (!addr_valid (_T("host_sendto2"), to, tolen)) return; @@ -1141,6 +1156,9 @@ void host_sendto (TrapContext *ctx, SB, uae_u32 sd, uae_u32 msg, uae_u32 len, ua sb->ftable[sd-1]|= SF_RAW_RUDP; } else { write_log(_T("Unknown RAW protocol %d\n"), realpt[9]); + sb->resultval = -1; + bsdsocklib_seterrno(ctx, sb, 22); // EINVAL + goto error; } } @@ -1223,6 +1241,7 @@ void host_sendto (TrapContext *ctx, SB, uae_u32 sd, uae_u32 msg, uae_u32 len, ua } else sb->resultval = -1; +error: if (sb->resultval == -1) BSDTRACE((_T("sendto failed (%d):%d\n"),sb->sb_errno,wscnt)); else diff --git a/od-win32/clipboard_win32.cpp b/od-win32/clipboard_win32.cpp index e8fd38f8..3a1f05bc 100644 --- a/od-win32/clipboard_win32.cpp +++ b/od-win32/clipboard_win32.cpp @@ -692,7 +692,7 @@ static void from_iff(TrapContext *ctx, uaecptr data, uae_u32 len) buf = xmalloc(uae_u8, (len + 3) & ~3); trap_get_bytes(ctx, buf, data, (len + 3) & ~3); -#if 1 +#if 0 FILE *f = fopen("clipboard.dat", "wb"); if (f) { fwrite(buf, 1, len, f); @@ -700,7 +700,6 @@ static void from_iff(TrapContext *ctx, uaecptr data, uae_u32 len) } #endif - if (clipboard_debug) debugwrite(ctx, _T("clipboard_a2p"), data, len); if (!memcmp ("FORM", buf, 4)) { diff --git a/od-win32/mman.cpp b/od-win32/mman.cpp index 0102d4fe..3c5a8e2a 100644 --- a/od-win32/mman.cpp +++ b/od-win32/mman.cpp @@ -57,6 +57,9 @@ static void virtualfreewithlock (LPVOID addr, SIZE_T size, DWORD freetype) static uae_u32 lowmem (void) { uae_u32 change = 0; + struct rtgboardconfig *rbc = &changed_prefs.rtgboards[0]; + struct rtgboardconfig *crbc = &currprefs.rtgboards[0]; + if (currprefs.z3fastmem_size + currprefs.z3fastmem2_size + currprefs.z3chipmem_size >= 8 * 1024 * 1024) { if (currprefs.z3fastmem2_size) { change = currprefs.z3fastmem2_size; @@ -75,10 +78,10 @@ static uae_u32 lowmem (void) currprefs.z3fastmem_size /= 2; changed_prefs.z3fastmem_size = currprefs.z3fastmem_size; } - } else if (currprefs.rtgmem_type == GFXBOARD_UAE_Z3 && currprefs.rtgmem_size >= 1 * 1024 * 1024) { - change = currprefs.rtgmem_size - currprefs.rtgmem_size / 2; - currprefs.rtgmem_size /= 2; - changed_prefs.rtgmem_size = currprefs.rtgmem_size; + } else if (crbc->rtgmem_type == GFXBOARD_UAE_Z3 && crbc->rtgmem_size >= 1 * 1024 * 1024) { + change = crbc->rtgmem_size - crbc->rtgmem_size / 2; + crbc->rtgmem_size /= 2; + rbc->rtgmem_size = crbc->rtgmem_size; } if (currprefs.z3fastmem2_size < 128 * 1024 * 1024) currprefs.z3fastmem2_size = changed_prefs.z3fastmem2_size = 0; @@ -301,15 +304,15 @@ static void resetmem (bool decommit) } } -static ULONG getz2rtgaddr (int rtgsize) +static ULONG getz2rtgaddr(struct rtgboardconfig *rbc) { ULONG start; start = changed_prefs.fastmem_size; if (changed_prefs.fastmem2_size >= 524288) start += changed_prefs.fastmem2_size; - start += rtgsize - 1; - start &= ~(rtgsize - 1); - while (start & (changed_prefs.rtgmem_size - 1) && start < 4 * 1024 * 1024) + start += rbc->rtgmem_size - 1; + start &= ~(rbc->rtgmem_size - 1); + while (start & (rbc->rtgmem_size - 1) && start < 4 * 1024 * 1024) start += 1024 * 1024; return start + 2 * 1024 * 1024; } @@ -335,6 +338,8 @@ static int doinit_shm (void) uae_u32 startbarrier, z3offset, align; int rounds = 0; uae_u32 z3rtgmem_size; + struct rtgboardconfig *rbc = &changed_prefs.rtgboards[0]; + struct rtgboardconfig *crbc = &currprefs.rtgboards[0]; canbang = 1; natmem_offset = natmem_reserved; @@ -349,7 +354,7 @@ static int doinit_shm (void) othersize = 0; size = 0x1000000; startbarrier = changed_prefs.mbresmem_high_size >= 128 * 1024 * 1024 ? (changed_prefs.mbresmem_high_size - 128 * 1024 * 1024) + 16 * 1024 * 1024 : 0; - z3rtgmem_size = gfxboard_get_configtype(changed_prefs.rtgmem_type) == 3 ? changed_prefs.rtgmem_size : 0; + z3rtgmem_size = gfxboard_get_configtype(rbc) == 3 ? rbc->rtgmem_size : 0; if (changed_prefs.cpu_model >= 68020) size = 0x10000000; z3size = ((changed_prefs.z3fastmem_size + align) & ~align) + ((changed_prefs.z3fastmem2_size + align) & ~align) + ((changed_prefs.z3chipmem_size + align) & ~align); @@ -411,15 +416,15 @@ static int doinit_shm (void) p96mem_size = z3rtgmem_size; p96base_offset = 0; uae_u32 z3rtgallocsize = 0; - if (changed_prefs.rtgmem_size && gfxboard_get_configtype(changed_prefs.rtgmem_type) == 3) { - z3rtgallocsize = gfxboard_get_autoconfig_size(changed_prefs.rtgmem_type) < 0 ? changed_prefs.rtgmem_size : gfxboard_get_autoconfig_size(changed_prefs.rtgmem_type); + if (rbc->rtgmem_size && gfxboard_get_configtype(rbc) == 3) { + z3rtgallocsize = gfxboard_get_autoconfig_size(rbc) < 0 ? rbc->rtgmem_size : gfxboard_get_autoconfig_size(rbc); if (changed_prefs.z3autoconfig_start == Z3BASE_UAE) p96base_offset = natmemsize + startbarrier + z3offset; else p96base_offset = expansion_startaddress(natmemsize + startbarrier + z3offset, z3rtgallocsize); - } else if (changed_prefs.rtgmem_size && gfxboard_get_configtype(changed_prefs.rtgmem_type) == 2) { - p96base_offset = getz2rtgaddr (changed_prefs.rtgmem_size); - } else if (changed_prefs.rtgmem_size && gfxboard_get_configtype(changed_prefs.rtgmem_type) == 1) { + } else if (rbc->rtgmem_size && gfxboard_get_configtype(rbc) == 2) { + p96base_offset = getz2rtgaddr (rbc); + } else if (rbc->rtgmem_size && gfxboard_get_configtype(rbc) == 1) { p96base_offset = 0xa80000; } if (p96base_offset) { @@ -427,8 +432,8 @@ static int doinit_shm (void) p96mem_offset = natmem_offset + p96base_offset; } else { if (changed_prefs.cachesize) { - currprefs.rtgmem_size = changed_prefs.rtgmem_size = 0; - currprefs.rtgmem_type = changed_prefs.rtgmem_type = 0; + crbc->rtgmem_size = rbc->rtgmem_size = 0; + crbc->rtgmem_type = rbc->rtgmem_type = 0; error_log(_T("RTG board is not anymore supported when JIT is enabled and RTG VRAM is located outside of NATMEM (Real Z3 mode under 32-bit Windows).")); } else { // calculate Z3 alignment (argh, I thought only Z2 needed this..) @@ -443,7 +448,7 @@ static int doinit_shm (void) addr = expansion_startaddress(addr, changed_prefs.z3fastmem2_size); addr += changed_prefs.z3fastmem2_size; addr = expansion_startaddress(addr, z3rtgallocsize); - if (gfxboard_get_configtype(changed_prefs.rtgmem_type) == 3) { + if (gfxboard_get_configtype(rbc) == 3) { p96base_offset = addr; write_log("NATMEM: p96base_offset = 0x%x\n", p96base_offset); // adjust p96mem_offset to beginning of natmem @@ -463,10 +468,10 @@ static int doinit_shm (void) write_log(_T("NATMEM: Our special area: %p-%p (0x%08x %dM)\n"), natmem_offset, (uae_u8*)natmem_offset + natmemsize, natmemsize, natmemsize / (1024 * 1024)); - if (changed_prefs.rtgmem_size) + if (rbc->rtgmem_size) write_log (_T("NATMEM: P96 special area: %p-%p (0x%08x %dM)\n"), - p96mem_offset, (uae_u8*)p96mem_offset + changed_prefs.rtgmem_size, - changed_prefs.rtgmem_size, changed_prefs.rtgmem_size >> 20); + p96mem_offset, (uae_u8*)p96mem_offset + rbc->rtgmem_size, + rbc->rtgmem_size, rbc->rtgmem_size >> 20); canbang = jit_direct_compatible_memory ? 1 : 0; if (p96mem_size) natmem_offset_end = p96mem_offset + p96mem_size; @@ -488,15 +493,15 @@ bool init_shm (void) oz3fastmem_size == changed_prefs.z3fastmem_size && oz3fastmem2_size == changed_prefs.z3fastmem2_size && oz3chipmem_size == changed_prefs.z3chipmem_size && - ortgmem_size == changed_prefs.rtgmem_size && - ortgmem_type == changed_prefs.rtgmem_type) + ortgmem_size == changed_prefs.rtgboards[0].rtgmem_size && + ortgmem_type == changed_prefs.rtgboards[0].rtgmem_type) return false; oz3fastmem_size = changed_prefs.z3fastmem_size; oz3fastmem2_size = changed_prefs.z3fastmem2_size; oz3chipmem_size = changed_prefs.z3chipmem_size;; - ortgmem_size = changed_prefs.rtgmem_size; - ortgmem_type = changed_prefs.rtgmem_type; + ortgmem_size = changed_prefs.rtgboards[0].rtgmem_size; + ortgmem_type = changed_prefs.rtgboards[0].rtgmem_type; doinit_shm (); @@ -604,6 +609,7 @@ void *uae_shmat (addrbank *ab, int shmid, void *shmaddr, int shmflg) #ifdef NATMEM_OFFSET unsigned int size = shmids[shmid].size; unsigned int readonlysize = size; + struct rtgboardconfig *rbc = &currprefs.rtgboards[0]; if (shmids[shmid].attached) return shmids[shmid].attached; @@ -669,7 +675,7 @@ void *uae_shmat (addrbank *ab, int shmid, void *shmaddr, int shmflg) shmaddr=natmem_offset + 0xec0000; } else { shmaddr=natmem_offset + 0x200000; - if (!(currprefs.rtgmem_size && gfxboard_get_configtype(currprefs.rtgmem_type) == 3)) + if (!(rbc->rtgmem_size && gfxboard_get_configtype(rbc) == 3)) size += BARRIER; } } else if(!_tcscmp (shmids[shmid].name, _T("fast2"))) { @@ -680,21 +686,21 @@ void *uae_shmat (addrbank *ab, int shmid, void *shmaddr, int shmflg) shmaddr=natmem_offset + 0x200000; if (currprefs.fastmem_size >= 524288) shmaddr=natmem_offset + 0x200000 + currprefs.fastmem_size; - if (!(currprefs.rtgmem_size && gfxboard_get_configtype(currprefs.rtgmem_type) == 3)) + if (!(rbc->rtgmem_size && gfxboard_get_configtype(rbc) == 3)) size += BARRIER; } } else if(!_tcscmp (shmids[shmid].name, _T("fast2"))) { shmaddr=natmem_offset + 0x200000; got = true; - if (!(currprefs.rtgmem_size && gfxboard_get_configtype(currprefs.rtgmem_type) == 3)) + if (!(rbc->rtgmem_size && gfxboard_get_configtype(rbc) == 3)) size += BARRIER; } else if(!_tcscmp (shmids[shmid].name, _T("z2_gfx"))) { - ULONG start = getz2rtgaddr (size); + ULONG start = getz2rtgaddr(rbc); got = true; p96special = true; shmaddr = natmem_offset + start; gfxmem_bank.start = start; - if (start + currprefs.rtgmem_size < 10 * 1024 * 1024) + if (start + rbc->rtgmem_size < 10 * 1024 * 1024) size += BARRIER; } else if(!_tcscmp (shmids[shmid].name, _T("ramsey_low"))) { shmaddr=natmem_offset + a3000lmem_bank.start; diff --git a/od-win32/picasso96_win.cpp b/od-win32/picasso96_win.cpp index e77a5d86..dd0f9f15 100644 --- a/od-win32/picasso96_win.cpp +++ b/od-win32/picasso96_win.cpp @@ -660,7 +660,7 @@ static void setupcursor (void) D3DLOCKED_RECT locked; HRESULT hr; - if (currprefs.rtgmem_type >= GFXBOARD_HARDWARE) + if (currprefs.rtgboards[0].rtgmem_type >= GFXBOARD_HARDWARE) return; gfx_lock (); setupcursor_needed = 1; @@ -752,7 +752,7 @@ void picasso_trigger_vblank(void) static bool rtg_render (void) { bool flushed = false; - bool uaegfx = currprefs.rtgmem_type < GFXBOARD_HARDWARE; + bool uaegfx = currprefs.rtgboards[0].rtgmem_type < GFXBOARD_HARDWARE; if (doskip () && p96skipmode == 0) { ; @@ -962,7 +962,7 @@ void picasso_refresh (void) setupcursor(); rtg_clear(); - if (currprefs.rtgmem_type >= GFXBOARD_HARDWARE) { + if (currprefs.rtgboards[0].rtgmem_type >= GFXBOARD_HARDWARE) { gfxboard_refresh (); return; } @@ -1005,7 +1005,7 @@ static void picasso_handle_vsync2(void) int vsync = isvsync_rtg(); int mult; bool rendered = false; - bool uaegfx = currprefs.rtgmem_type < GFXBOARD_HARDWARE; + bool uaegfx = currprefs.rtgboards[0].rtgmem_type < GFXBOARD_HARDWARE; int state = picasso_state_change; if (state & PICASSO_STATE_SETDAC) { @@ -1092,9 +1092,9 @@ static int p96hsync; void picasso_handle_vsync(void) { - bool uaegfx = currprefs.rtgmem_type < GFXBOARD_HARDWARE; + bool uaegfx = currprefs.rtgboards[0].rtgmem_type < GFXBOARD_HARDWARE; - if (currprefs.rtgmem_size == 0) + if (currprefs.rtgboards[0].rtgmem_size == 0) return; if (!picasso_on && uaegfx) { @@ -1114,9 +1114,9 @@ void picasso_handle_vsync(void) void picasso_handle_hsync(void) { - bool uaegfx = currprefs.rtgmem_type < GFXBOARD_HARDWARE; + bool uaegfx = currprefs.rtgboards[0].rtgmem_type < GFXBOARD_HARDWARE; - if (currprefs.rtgmem_size == 0) + if (currprefs.rtgboards[0].rtgmem_size == 0) return; int vsync = isvsync_rtg(); @@ -2358,7 +2358,7 @@ static void picasso96_alloc2 (TrapContext *ctx) void picasso96_alloc (TrapContext *ctx) { - if (uaegfx_old || currprefs.rtgmem_type >= GFXBOARD_HARDWARE) + if (uaegfx_old || currprefs.rtgboards[0].rtgmem_type >= GFXBOARD_HARDWARE) return; uaegfx_resname = ds (_T("uaegfx.card")); picasso96_alloc2 (ctx); @@ -3251,6 +3251,9 @@ static uae_u32 REGPARAM2 picasso_BlitPattern (TrapContext *ctx) result = 1; } + if (pattern.Size >= 16) + result = 0; + if(result) { bool indirect = trap_is_indirect(); uae_u32 fgpen, bgpen; @@ -5034,7 +5037,7 @@ uae_u8 *restore_p96 (uae_u8 *src) set_gc_called = !!(flags & 2); set_panning_called = !!(flags & 4); interrupt_enabled = !!(flags & 32); - changed_prefs.rtgmem_size = restore_u32 (); + changed_prefs.rtgboards[0].rtgmem_size = restore_u32 (); picasso96_state.Address = restore_u32 (); picasso96_state.RGBFormat = (RGBFTYPE)restore_u32 (); picasso96_state.Width = restore_u16 (); @@ -5070,7 +5073,7 @@ uae_u8 *save_p96 (int *len, uae_u8 *dstptr) uae_u8 *dstbak, *dst; int i; - if (currprefs.rtgmem_size == 0) + if (currprefs.rtgboards[0].rtgmem_size == 0) return NULL; if (dstptr) dstbak = dst = dstptr; @@ -5079,7 +5082,7 @@ uae_u8 *save_p96 (int *len, uae_u8 *dstptr) save_u32 (2); save_u32 ((picasso_on ? 1 : 0) | (set_gc_called ? 2 : 0) | (set_panning_called ? 4 : 0) | (hwsprite ? 8 : 0) | (cursorvisible ? 16 : 0) | (interrupt_enabled ? 32 : 0) | 64); - save_u32 (currprefs.rtgmem_size); + save_u32 (currprefs.rtgboards[0].rtgmem_size); save_u32 (picasso96_state.Address); save_u32 (picasso96_state.RGBFormat); save_u16 (picasso96_state.Width); diff --git a/od-win32/resources/resource.h b/od-win32/resources/resource.h index 84f98ff5..3ff72313 100644 --- a/od-win32/resources/resource.h +++ b/od-win32/resources/resource.h @@ -952,6 +952,8 @@ #define IDC_STATEREC_AUTOPLAY 1652 #define IDC_SOUNDFREQTXT 1653 #define IDC_PANEL_FRAME 1653 +#define IDC_SCREENSHOT_ORIGINALSIZE2 1653 +#define IDC_SCREENSHOT_CLIP 1653 #define IDC_SOUNDFILTERTXT 1654 #define IDC_PANEL_FRAME_OUTER 1654 #define IDC_SOUNDSTEREO 1655 diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index 8f67a767..3c8e2fe7 100644 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -805,11 +805,11 @@ BEGIN CONTROL "Disable sound sync",IDC_AVIOUTPUT_NOSOUNDSYNC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,210,85,171,10 CONTROL "AVI output enabled",IDC_AVIOUTPUT_ACTIVATED,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,15,100,144,14 GROUPBOX "Ripper",IDC_STATIC,1,126,393,53 - PUSHBUTTON "Save screenshot",IDC_SCREENSHOT,53,140,87,14 - PUSHBUTTON "Pro Wizard 1.62",IDC_PROWIZARD,245,140,87,14,WS_DISABLED + PUSHBUTTON "Save screenshot",IDC_SCREENSHOT,28,140,87,14 + PUSHBUTTON "Pro Wizard 1.62",IDC_PROWIZARD,162,140,87,14,WS_DISABLED CONTROL "Take screenshot before filtering",IDC_SCREENSHOT_ORIGINALSIZE, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,161,162,10 - CONTROL "Sample ripper",IDC_SAMPLERIPPER_ACTIVATED,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,245,159,87,14 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,163,144,10 + CONTROL "Sample ripper",IDC_SAMPLERIPPER_ACTIVATED,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,280,140,87,14 GROUPBOX "Re-recorder",IDC_STATIC,1,182,393,70 CONTROL "Play recording",IDC_STATEREC_PLAY,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,53,194,87,14 CONTROL "Re-recording enabled",IDC_STATEREC_RECORD,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_FLAT,214,194,118,14 @@ -819,6 +819,7 @@ BEGIN COMBOBOX IDC_STATEREC_RATE,141,233,38,65,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP RTEXT "Recording buffers:",IDC_STATIC,195,235,91,10,SS_CENTERIMAGE | WS_TABSTOP COMBOBOX IDC_STATEREC_BUFFERSIZE,291,233,38,65,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + CONTROL "Autoclip screenshot",IDC_SCREENSHOT_CLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,163,144,10 END IDD_INPUT DIALOGEX 0, 0, 396, 318 diff --git a/od-win32/rp.cpp b/od-win32/rp.cpp index 176d4da5..e69bbc36 100644 --- a/od-win32/rp.cpp +++ b/od-win32/rp.cpp @@ -367,9 +367,10 @@ int port_insert_custom (int inputmap_port, int devicetype, DWORD flags, const TC static int port_insert (int inputmap_port, int devicetype, DWORD flags, const TCHAR *name) { + int ret = 0; int devicetype2; - write_log (L"port_insert %d '%s'\n", inputmap_port, name); + write_log (L"port%d_insert type=%d flags=%d '%s'\n", inputmap_port, devicetype, flags, name); if (inputmap_port < 0 || inputmap_port >= maxjports) return FALSE; @@ -399,10 +400,12 @@ static int port_insert (int inputmap_port, int devicetype, DWORD flags, const TC _stprintf (tmp2, _T("KeyboardLayout%d"), i); if (!_tcscmp (tmp2, name)) { _stprintf (tmp2, _T("kbd%d"), i + 1); - return inputdevice_joyport_config (&changed_prefs, tmp2, NULL, inputmap_port, devicetype2, 0, true); + ret = inputdevice_joyport_config (&changed_prefs, tmp2, NULL, inputmap_port, devicetype2, 0, true); + return ret; } } - return inputdevice_joyport_config (&changed_prefs, name, NULL, inputmap_port, devicetype2, 1, true); + ret = inputdevice_joyport_config (&changed_prefs, name, name, inputmap_port, devicetype2, 1, true); + return ret; } static int cd_insert (int num, const TCHAR *name) diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index 43a53442..4d2a2541 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -1531,7 +1531,7 @@ static LRESULT CALLBACK AmigaWindowProc (HWND hWnd, UINT message, WPARAM wParam, return 0; case WM_DROPFILES: - dragdrop (hWnd, (HDROP)wParam, &changed_prefs, -1); + dragdrop (hWnd, (HDROP)wParam, &changed_prefs, -2); return 0; case WM_TIMER: @@ -3020,8 +3020,8 @@ void fullpath (TCHAR *path, int size) done:; } else { TCHAR tmp[MAX_DPATH]; - _tcscpy (tmp, path); - GetFullPathName (tmp, size, path, NULL); + _tcscpy(tmp, path); + DWORD err = GetFullPathName (tmp, size, path, NULL); } } void getpathpart (TCHAR *outpath, int size, const TCHAR *inpath) @@ -3466,11 +3466,11 @@ void target_fixup_options (struct uae_prefs *p) error_log (_T("DirectDraw is not RTG hardware sprite compatible.")); p->rtg_hardwaresprite = false; } - if (p->rtgmem_type >= GFXBOARD_HARDWARE) { + if (p->rtgboards[0].rtgmem_type >= GFXBOARD_HARDWARE) { p->rtg_hardwareinterrupt = false; p->rtg_hardwaresprite = false; p->win32_rtgmatchdepth = false; - if (gfxboard_need_byteswap (p->rtgmem_type)) + if (gfxboard_need_byteswap (&p->rtgboards[0])) p->color_mode = 5; if (p->ppc_model && !p->gfx_api) { error_log (_T("Graphics board and PPC: Direct3D enabled.")); @@ -3556,6 +3556,7 @@ void target_default_options (struct uae_prefs *p, int type) static const TCHAR *scsimode[] = { _T("SCSIEMU"), _T("SPTI"), _T("SPTI+SCSISCAN"), NULL }; static const TCHAR *statusbarmode[] = { _T("none"), _T("normal"), _T("extended"), NULL }; +static const TCHAR *configmult[] = { _T("1x"), _T("2x"), _T("3x"), _T("4x"), _T("5x"), _T("6x"), _T("7x"), _T("8x"), NULL }; static struct midiportinfo *getmidiport (struct midiportinfo **mi, int devid) { @@ -3673,6 +3674,18 @@ void target_save_options (struct zfile *f, struct uae_prefs *p) cfgfile_target_dwrite(f, _T("recording_height"), _T("%d"), p->aviout_height); cfgfile_target_dwrite(f, _T("recording_x"), _T("%d"), p->aviout_xoffset); cfgfile_target_dwrite(f, _T("recording_y"), _T("%d"), p->aviout_yoffset); + cfgfile_target_dwrite(f, _T("screenshot_width"), _T("%d"), p->screenshot_width); + cfgfile_target_dwrite(f, _T("screenshot_height"), _T("%d"), p->screenshot_height); + cfgfile_target_dwrite(f, _T("screenshot_x"), _T("%d"), p->screenshot_xoffset); + cfgfile_target_dwrite(f, _T("screenshot_y"), _T("%d"), p->screenshot_yoffset); + cfgfile_target_dwrite(f, _T("screenshot_min_width"), _T("%d"), p->screenshot_min_width); + cfgfile_target_dwrite(f, _T("screenshot_min_height"), _T("%d"), p->screenshot_min_height); + cfgfile_target_dwrite(f, _T("screenshot_max_width"), _T("%d"), p->screenshot_max_width); + cfgfile_target_dwrite(f, _T("screenshot_max_height"), _T("%d"), p->screenshot_max_height); + cfgfile_target_dwrite(f, _T("screenshot_output_width_limit"), _T("%d"), p->screenshot_output_width); + cfgfile_target_dwrite(f, _T("screenshot_output_height_limit"), _T("%d"), p->screenshot_output_height); + cfgfile_target_dwrite_str(f, _T("screenshot_mult_width"), configmult[p->screenshot_xmult]); + cfgfile_target_dwrite_str(f, _T("screenshot_mult_height"), configmult[p->screenshot_ymult]); } void target_restart (void) @@ -3765,9 +3778,26 @@ int target_parse_option (struct uae_prefs *p, const TCHAR *option, const TCHAR * if (cfgfile_intval(option, value, _T("recording_width"), &p->aviout_width, 1) || cfgfile_intval(option, value, _T("recording_height"), &p->aviout_height, 1) || cfgfile_intval(option, value, _T("recording_x"), &p->aviout_xoffset, 1) - || cfgfile_intval(option, value, _T("recording_y"), &p->aviout_yoffset, 1)) + || cfgfile_intval(option, value, _T("recording_y"), &p->aviout_yoffset, 1) + + || cfgfile_intval(option, value, _T("screenshot_width"), &p->screenshot_width, 1) + || cfgfile_intval(option, value, _T("screenshot_height"), &p->screenshot_height, 1) + || cfgfile_intval(option, value, _T("screenshot_x"), &p->screenshot_xoffset, 1) + || cfgfile_intval(option, value, _T("screenshot_y"), &p->screenshot_yoffset, 1) + || cfgfile_intval(option, value, _T("screenshot_min_width"), &p->screenshot_min_width, 1) + || cfgfile_intval(option, value, _T("screenshot_min_height"), &p->screenshot_min_height, 1) + || cfgfile_intval(option, value, _T("screenshot_max_width"), &p->screenshot_max_width, 1) + || cfgfile_intval(option, value, _T("screenshot_max_height"), &p->screenshot_max_height, 1) + || cfgfile_intval(option, value, _T("screenshot_output_width_limit"), &p->screenshot_output_width, 1) + || cfgfile_intval(option, value, _T("screenshot_output_height_limit"), &p->screenshot_output_height, 1)) + return 1; + if (cfgfile_strval(option, value, _T("screenshot_mult_width"), &p->screenshot_xmult, configmult, 0)) + return 1; + if (cfgfile_strval(option, value, _T("screenshot_mult_height"), &p->screenshot_ymult, configmult, 0)) + return 1; + if (cfgfile_string(option, value, _T("expansion_gui_page"), tmpbuf, sizeof tmpbuf / sizeof(TCHAR))) { TCHAR *p = _tcschr(tmpbuf, ','); if (p != NULL) @@ -4098,7 +4128,7 @@ void fetch_path (const TCHAR *name, TCHAR *out, int size) _tcscpy (out, start_path_data); } fixtrailing (out); - fullpath (out, size); + fullpath (out, size2); } int get_rom_path (TCHAR *out, pathtype mode) @@ -4759,7 +4789,8 @@ static void WIN32_HandleRegistryStuff (void) quickstart = 1; reopen_console (); fetch_path (_T("ConfigurationPath"), path, sizeof (path) / sizeof (TCHAR)); - path[_tcslen (path) - 1] = 0; + if (path[0]) + path[_tcslen (path) - 1] = 0; if (GetFileAttributes (path) == 0xffffffff) { TCHAR path2[MAX_DPATH]; _tcscpy (path2, path); @@ -6705,9 +6736,9 @@ int get_guid_target (uae_u8 *out) if (CoCreateGuid (&guid) != S_OK) return 0; out[0] = guid.Data1 >> 24; - out[1] = guid.Data1 >> 16; - out[2] = guid.Data1 >> 8; - out[3] = guid.Data1 >> 0; + out[1] = (uae_u8)(guid.Data1 >> 16); + out[2] = (uae_u8)(guid.Data1 >> 8); + out[3] = (uae_u8)(guid.Data1 >> 0); out[4] = guid.Data2 >> 8; out[5] = guid.Data2 >> 0; out[6] = guid.Data3 >> 8; diff --git a/od-win32/win32.h b/od-win32/win32.h index d7f9f2d7..c24bbc74 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -20,12 +20,12 @@ #define LANG_DLL_FULL_VERSION_MATCH 1 #if WINUAEPUBLICBETA -#define WINUAEBETA _T("7") +#define WINUAEBETA _T("8") #else #define WINUAEBETA _T("") #endif -#define WINUAEDATE MAKEBD(2016, 2, 21) +#define WINUAEDATE MAKEBD(2016, 3, 5) //#define WINUAEEXTRA _T("AmiKit Preview") //#define WINUAEEXTRA _T("Amiga Forever Edition") diff --git a/od-win32/win32gfx.cpp b/od-win32/win32gfx.cpp index e0494158..95c331cd 100644 --- a/od-win32/win32gfx.cpp +++ b/od-win32/win32gfx.cpp @@ -4552,7 +4552,7 @@ bool toggle_rtg (int mode) if (picasso_on) return false; } - if (currprefs.rtgmem_type >= GFXBOARD_HARDWARE) { + if (currprefs.rtgboards[0].rtgmem_type >= GFXBOARD_HARDWARE) { return gfxboard_toggle (mode); } else { // can always switch from RTG to custom @@ -4618,10 +4618,6 @@ HDC gethdc (void) frame_missed = frame_counted = frame_errors = 0; frame_usage = frame_usage_avg = frame_usage_total = 0; -#ifdef OPENGL - if (OGL_isenabled ()) - return OGL_getDC (0); -#endif #ifdef D3D if (D3D_isenabled ()) return D3D_getDC (0); @@ -4633,12 +4629,6 @@ HDC gethdc (void) void releasehdc (HDC hdc) { -#ifdef OPENGL - if (OGL_isenabled ()) { - OGL_getDC (hdc); - return; - } -#endif #ifdef D3D if (D3D_isenabled ()) { D3D_getDC (hdc); diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index 73d87960..d4251c51 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -109,7 +109,7 @@ #define USS_FORMAT_STRING_SAVE _T("(*.uss)\0*.uss\0") #define HDF_FORMAT_STRING _T("(*.hdf;*.vhd;*.rdf;*.hdz;*.rdz;*.chd)\0*.hdf;*.vhd;*.rdf;*.hdz;*.rdz;*.chd\0") #define INP_FORMAT_STRING _T("(*.inp)\0*.inp\0") -#define CD_FORMAT_STRING _T("(*.cue;*.ccd;*.mds;*.iso;*.chd)\0*.cue;*.ccd;*.mds;*.iso;*.chd;") ARCHIVE_STRING _T("\0") +#define CD_FORMAT_STRING _T("(*.cue;*.ccd;*.mds;*.iso;*.chd;*.nrg)\0*.cue;*.ccd;*.mds;*.iso;*.chd;*.nrg;") ARCHIVE_STRING _T("\0") #define CONFIG_HOST _T("Host") #define CONFIG_HARDWARE _T("Hardware") @@ -6336,7 +6336,7 @@ static INT_PTR CALLBACK AboutDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM static void enable_for_displaydlg (HWND hDlg) { - int rtg = ((!workprefs.address_space_24 || gfxboard_get_configtype(workprefs.rtgmem_type) == 2) && workprefs.rtgmem_size) || workprefs.rtgmem_type >= GFXBOARD_HARDWARE; + int rtg = ((!workprefs.address_space_24 || gfxboard_get_configtype(&workprefs.rtgboards[0]) == 2) && workprefs.rtgboards[0].rtgmem_size) || workprefs.rtgboards[0].rtgmem_type >= GFXBOARD_HARDWARE; #ifndef PICASSO96 rtg = FALSE; #endif @@ -7804,7 +7804,7 @@ static void setmax32bitram (HWND hDlg) uae_u32 size, rtgz3size, z3size_uae = 0, z3size_real = 0; uae_u32 sizealign = 16 * 1024 * 1024 - 1; - rtgz3size = gfxboard_get_configtype(workprefs.rtgmem_type) == 3 ? workprefs.rtgmem_size : 0; + rtgz3size = gfxboard_get_configtype(&workprefs.rtgboards[0]) == 3 ? workprefs.rtgboards[0].rtgmem_size : 0; size = ((workprefs.z3fastmem_size + sizealign) & ~sizealign) + ((workprefs.z3fastmem2_size + sizealign) & ~sizealign) + ((rtgz3size + sizealign) & ~sizealign); if (cfgfile_board_enabled(&currprefs, ROMTYPE_A4091, 0)) @@ -8794,7 +8794,7 @@ static void updatecpuboardsubtypes(HWND hDlg) static void set_expansion_rtg_rom(void) { int idx; - uae_u32 romtype = gfxboard_get_romtype(workprefs.rtgmem_type); + uae_u32 romtype = gfxboard_get_romtype(&workprefs.rtgboards[0]); if (romtype) { struct boardromconfig *bc = get_device_rom_new(&workprefs, romtype, 0, &idx); if (bc && bc->roms[idx].romfile[0] == 0) { @@ -9124,10 +9124,10 @@ static void enable_for_expansiondlg(HWND hDlg) en = !!full_property_sheet; - int rtg = workprefs.rtgmem_size && full_property_sheet && workprefs.rtgmem_type < GFXBOARD_HARDWARE; - int rtg2 = workprefs.rtgmem_size || workprefs.rtgmem_type >= GFXBOARD_HARDWARE; - int rtg3 = workprefs.rtgmem_size && workprefs.rtgmem_type < GFXBOARD_HARDWARE; - int rtg4 = workprefs.rtgmem_type < GFXBOARD_HARDWARE; + int rtg = workprefs.rtgboards[0].rtgmem_size && full_property_sheet && workprefs.rtgboards[0].rtgmem_type < GFXBOARD_HARDWARE; + int rtg2 = workprefs.rtgboards[0].rtgmem_size || workprefs.rtgboards[0].rtgmem_type >= GFXBOARD_HARDWARE; + int rtg3 = workprefs.rtgboards[0].rtgmem_size && workprefs.rtgboards[0].rtgmem_type < GFXBOARD_HARDWARE; + int rtg4 = workprefs.rtgboards[0].rtgmem_type < GFXBOARD_HARDWARE; ew(hDlg, IDC_P96RAM, rtg2); ew(hDlg, IDC_P96MEM, rtg2); @@ -9158,43 +9158,44 @@ static void values_to_expansiondlg(HWND hDlg) int min_mem = MIN_P96_MEM; int max_mem = MAX_P96_MEM_Z3; - if (gfxboard_get_configtype(workprefs.rtgmem_type) == 2) { - int v = workprefs.rtgmem_size; + struct rtgboardconfig *rbc = &workprefs.rtgboards[0]; + if (gfxboard_get_configtype(rbc) == 2) { + int v = rbc->rtgmem_size; max_mem = 0; - workprefs.rtgmem_size = 1024 * 1024; + rbc->rtgmem_size = 1024 * 1024; while (getz2size(&workprefs) > 0) { - workprefs.rtgmem_size *= 2; + rbc->rtgmem_size *= 2; max_mem++; } - if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE && v > gfxboard_get_vram_max(workprefs.rtgmem_type)) - v = gfxboard_get_vram_max(workprefs.rtgmem_type); - if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE && v < gfxboard_get_vram_min(workprefs.rtgmem_type)) - v = gfxboard_get_vram_min(workprefs.rtgmem_type); - workprefs.rtgmem_size = v; - while (getz2size(&workprefs) < 0 && workprefs.rtgmem_size > 0) - workprefs.rtgmem_size -= 1024 * 1024; - } else if (gfxboard_get_configtype(workprefs.rtgmem_type) == 3) { - int v = workprefs.rtgmem_size; - if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE && v > gfxboard_get_vram_max(workprefs.rtgmem_type)) - v = gfxboard_get_vram_max(workprefs.rtgmem_type); - if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE && v < gfxboard_get_vram_min(workprefs.rtgmem_type)) - v = gfxboard_get_vram_min(workprefs.rtgmem_type); - workprefs.rtgmem_size = v; + if (rbc->rtgmem_type >= GFXBOARD_HARDWARE && v > gfxboard_get_vram_max(rbc)) + v = gfxboard_get_vram_max(rbc); + if (rbc->rtgmem_type >= GFXBOARD_HARDWARE && v < gfxboard_get_vram_min(rbc)) + v = gfxboard_get_vram_min(rbc); + rbc->rtgmem_size = v; + while (getz2size(&workprefs) < 0 && rbc->rtgmem_size > 0) + rbc->rtgmem_size -= 1024 * 1024; + } else if (gfxboard_get_configtype(rbc) == 3) { + int v = rbc->rtgmem_size; + if (rbc->rtgmem_type >= GFXBOARD_HARDWARE && v > gfxboard_get_vram_max(rbc)) + v = gfxboard_get_vram_max(rbc); + if (rbc->rtgmem_type >= GFXBOARD_HARDWARE && v < gfxboard_get_vram_min(rbc)) + v = gfxboard_get_vram_min(rbc); + rbc->rtgmem_size = v; } else { - int v = workprefs.rtgmem_size; - if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE && v > gfxboard_get_vram_max(workprefs.rtgmem_type)) - v = gfxboard_get_vram_max(workprefs.rtgmem_type); - if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE && v < gfxboard_get_vram_min(workprefs.rtgmem_type)) - v = gfxboard_get_vram_min(workprefs.rtgmem_type); - workprefs.rtgmem_size = v; - } - if (workprefs.rtgmem_type >= GFXBOARD_HARDWARE) { - switch (gfxboard_get_vram_min(workprefs.rtgmem_type)) { + int v = rbc->rtgmem_size; + if (rbc->rtgmem_type >= GFXBOARD_HARDWARE && v > gfxboard_get_vram_max(rbc)) + v = gfxboard_get_vram_max(rbc); + if (rbc->rtgmem_type >= GFXBOARD_HARDWARE && v < gfxboard_get_vram_min(rbc)) + v = gfxboard_get_vram_min(rbc); + rbc->rtgmem_size = v; + } + if (rbc->rtgmem_type >= GFXBOARD_HARDWARE) { + switch (gfxboard_get_vram_min(rbc)) { case 0x00100000: min_mem = 1; break; case 0x00200000: min_mem = 2; break; case 0x00400000: min_mem = 3; break; } - switch (gfxboard_get_vram_max(workprefs.rtgmem_type)) { + switch (gfxboard_get_vram_max(rbc)) { case 0x00100000: max_mem = 1; break; case 0x00200000: max_mem = 2; break; case 0x00400000: max_mem = 3; break; @@ -9202,7 +9203,7 @@ static void values_to_expansiondlg(HWND hDlg) } SendDlgItemMessage(hDlg, IDC_P96MEM, TBM_SETRANGE, TRUE, MAKELONG(min_mem, max_mem)); int mem_size = 0; - switch (workprefs.rtgmem_size) { + switch (rbc->rtgmem_size) { case 0x00000000: mem_size = 0; break; case 0x00100000: mem_size = 1; break; case 0x00200000: mem_size = 2; break; @@ -9219,7 +9220,7 @@ static void values_to_expansiondlg(HWND hDlg) SendDlgItemMessage(hDlg, IDC_P96MEM, TBM_SETPOS, TRUE, mem_size); SetDlgItemText(hDlg, IDC_P96RAM, memsize_names[msi_gfx[mem_size]]); - SendDlgItemMessage(hDlg, IDC_RTG_Z2Z3, CB_SETCURSEL, workprefs.rtgmem_size == 0 ? 0 : workprefs.rtgmem_type + 1, 0); + SendDlgItemMessage(hDlg, IDC_RTG_Z2Z3, CB_SETCURSEL, rbc->rtgmem_size == 0 ? 0 : rbc->rtgmem_type + 1, 0); SendDlgItemMessage(hDlg, IDC_RTG_8BIT, CB_SETCURSEL, (workprefs.picasso96_modeflags & RGBFF_CLUT) ? 1 : 0, 0); SendDlgItemMessage(hDlg, IDC_RTG_16BIT, CB_SETCURSEL, (manybits(workprefs.picasso96_modeflags, RGBFF_R5G6B5PC | RGBFF_R5G6B5PC | RGBFF_R5G6B5 | RGBFF_R5G5B5 | RGBFF_B5G6R5PC | RGBFF_B5G5R5PC)) ? 1 : @@ -9330,7 +9331,7 @@ static INT_PTR CALLBACK ExpansionDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP SendDlgItemMessage (hDlg, IDC_RTG_32BIT, CB_ADDSTRING, 0, (LPARAM)_T("A8B8G8R8")); SendDlgItemMessage (hDlg, IDC_RTG_32BIT, CB_ADDSTRING, 0, (LPARAM)_T("R8G8B8A8")); SendDlgItemMessage (hDlg, IDC_RTG_32BIT, CB_ADDSTRING, 0, (LPARAM)_T("B8G8R8A8 (*)")); - SendDlgItemMessage (hDlg, IDC_P96MEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_P96_MEM, gfxboard_get_configtype(workprefs.rtgmem_type) == 3 ? MAX_P96_MEM_Z3 : MAX_P96_MEM_Z2)); + SendDlgItemMessage (hDlg, IDC_P96MEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_P96_MEM, gfxboard_get_configtype(&workprefs.rtgboards[0]) == 3 ? MAX_P96_MEM_Z3 : MAX_P96_MEM_Z2)); SendDlgItemMessage (hDlg, IDC_RTG_SCALE_ASPECTRATIO, CB_RESETCONTENT, 0, 0); WIN32GUI_LoadUIString (IDS_DISABLED, tmp, sizeof tmp / sizeof (TCHAR)); SendDlgItemMessage (hDlg, IDC_RTG_SCALE_ASPECTRATIO, CB_ADDSTRING, 0, (LPARAM)tmp); @@ -9358,7 +9359,7 @@ static INT_PTR CALLBACK ExpansionDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP break; case WM_HSCROLL: - workprefs.rtgmem_size = memsizes[msi_gfx[SendMessage (GetDlgItem (hDlg, IDC_P96MEM), TBM_GETPOS, 0, 0)]]; + workprefs.rtgboards[0].rtgmem_size = memsizes[msi_gfx[SendMessage (GetDlgItem (hDlg, IDC_P96MEM), TBM_GETPOS, 0, 0)]]; values_to_expansiondlg(hDlg); enable_for_expansiondlg(hDlg); break; @@ -9420,12 +9421,12 @@ static INT_PTR CALLBACK ExpansionDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP v = SendDlgItemMessage (hDlg, IDC_RTG_Z2Z3, CB_GETCURSEL, 0, 0L); if (v != CB_ERR) { if (v == 0) { - workprefs.rtgmem_type = 1; - workprefs.rtgmem_size = 0; + workprefs.rtgboards[0].rtgmem_type = 1; + workprefs.rtgboards[0].rtgmem_size = 0; } else { - workprefs.rtgmem_type = v - 1; - if (workprefs.rtgmem_size == 0) - workprefs.rtgmem_size = 4096 * 1024; + workprefs.rtgboards[0].rtgmem_type = v - 1; + if (workprefs.rtgboards[0].rtgmem_size == 0) + workprefs.rtgboards[0].rtgmem_size = 4096 * 1024; } set_expansion_rtg_rom(); enable_for_expansiondlg (hDlg); @@ -12055,7 +12056,7 @@ static INT_PTR CALLBACK HardfileSettingsProc (HWND hDlg, UINT msg, WPARAM wParam switch (msg) { case WM_DROPFILES: - dragdrop (hDlg, (HDROP)wParam, &changed_prefs, -1); + dragdrop (hDlg, (HDROP)wParam, &changed_prefs, -2); return FALSE; case WM_INITDIALOG: @@ -13096,13 +13097,16 @@ static void addfloppytype (HWND hDlg, int n) } CheckDlgButton (hDlg, f_enable, state ? BST_CHECKED : BST_UNCHECKED); TCHAR tmp[10]; + tmp[0] = 0; if (n < 2 || nn - 1 < DRV_PC_ONLY_40) { - _stprintf(tmp, _T("DF%d:"), n); + if (!showcd || n != 1) + _stprintf(tmp, _T("DF%d:"), n); } else { int t = nn - 1 == DRV_PC_ONLY_40 ? 40 : 80; _stprintf(tmp, _T("%c: (%d)"), n == 2 ? 'A' : 'B', t); } - SetWindowText(GetDlgItem(hDlg, f_enable), tmp); + if (tmp[0]) + SetWindowText(GetDlgItem(hDlg, f_enable), tmp); } chk = !showcd && disk_getwriteprotect (&workprefs, text) && state == TRUE ? BST_CHECKED : 0; if (f_wp >= 0) @@ -17175,7 +17179,8 @@ static void values_to_avioutputdlg (HWND hDlg) CheckDlgButton (hDlg, IDC_AVIOUTPUT_NOSOUNDSYNC, avioutput_nosoundsync ? TRUE : FALSE); CheckDlgButton (hDlg, IDC_AVIOUTPUT_ORIGINALSIZE, avioutput_originalsize ? TRUE : FALSE); CheckDlgButton (hDlg, IDC_AVIOUTPUT_ACTIVATED, avioutput_requested ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton (hDlg, IDC_SCREENSHOT_ORIGINALSIZE, screenshot_originalsize ? TRUE : FALSE); + CheckDlgButton(hDlg, IDC_SCREENSHOT_ORIGINALSIZE, screenshot_originalsize ? TRUE : FALSE); + CheckDlgButton(hDlg, IDC_SCREENSHOT_CLIP, screenshot_clipmode ? TRUE : FALSE); CheckDlgButton (hDlg, IDC_SAMPLERIPPER_ACTIVATED, sampleripper_enabled ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hDlg, IDC_STATEREC_RECORD, input_record ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton (hDlg, IDC_STATEREC_PLAY, input_play ? BST_CHECKED : BST_UNCHECKED); @@ -17201,6 +17206,12 @@ static void enable_for_avioutputdlg (HWND hDlg) ew (hDlg, IDC_AVIOUTPUT_FILE, TRUE); + if (!screenshot_originalsize) { + CheckDlgButton(hDlg, IDC_SCREENSHOT_CLIP, BST_UNCHECKED); + screenshot_clipmode = 0; + } + ew (hDlg, IDC_SCREENSHOT_CLIP, screenshot_originalsize != 0); + if(workprefs.produce_sound < 2) { ew (hDlg, IDC_AVIOUTPUT_AUDIO, FALSE); ew (hDlg, IDC_AVIOUTPUT_AUDIO_STATIC, FALSE); @@ -17260,7 +17271,8 @@ static INT_PTR CALLBACK AVIOutputDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP pages[AVIOUTPUT_ID] = hDlg; currentpage = AVIOUTPUT_ID; AVIOutput_GetSettings (); - regqueryint (NULL, _T("Screenshot_Original"), &screenshot_originalsize); + regqueryint(NULL, _T("Screenshot_Original"), &screenshot_originalsize); + regqueryint(NULL, _T("Screenshot_ClipMode"), &screenshot_clipmode); enable_for_avioutputdlg (hDlg); if (!avioutput_filename_gui[0]) { fetch_path (_T("VideoPath"), avioutput_filename_gui, sizeof (avioutput_filename_gui) / sizeof (TCHAR)); @@ -17333,8 +17345,12 @@ static INT_PTR CALLBACK AVIOutputDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP AVIOutput_SetSettings (); break; case IDC_SCREENSHOT_ORIGINALSIZE: - screenshot_originalsize = ischecked (hDlg, IDC_SCREENSHOT_ORIGINALSIZE) ? 1 : 0; - regsetint (NULL, _T("Screenshot_Original"), screenshot_originalsize); + screenshot_originalsize = ischecked(hDlg, IDC_SCREENSHOT_ORIGINALSIZE) ? 1 : 0; + regsetint(NULL, _T("Screenshot_Original"), screenshot_originalsize); + break; + case IDC_SCREENSHOT_CLIP: + screenshot_clipmode = ischecked(hDlg, IDC_SCREENSHOT_CLIP) ? 1 : 0; + regsetint(NULL, _T("Screenshot_ClipMode"), screenshot_clipmode); break; case IDC_STATEREC_SAVE: if (input_record > INPREC_RECORD_NORMAL) { diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 0f5451b3..c381ba61 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -1,4 +1,28 @@ +Beta 8: + +- Game Ports joystick type was always empty (undefined). +- Quickstart panel CDTV/CD32 CD path name label was "DF1:", not "CD". (Broke when bridgeboard drive support was added) +- Dragndrop to emulation window didn't work correctly until GUI was opened at least once. +- Added screenshot autoclip mode, uses autoscale display size/position detection. + Also added following config file only entries: (all config entries need win32. prefix) + screenshot_min_width and screenshot_min_height: minimum autoclip size in lores pixels. + screenshot_max_width and screenshot_max_height: maximum autoclip size in lores pixels. + screenshot_width and screenshot_height: forced screenshot size (non-autoclip mode only) + screenshot_x and screenshot_y: position/offset of screenshot (non-autoclip mode only) + screenshot_mult_width and screenshot_mult_height: 1x, 2x, 3x, .. 8x screenshot size multiplier. + screenshot_output_width_limit and screenshot_output_height_limit: minimum screenshot size, if original size is smaller, + multiplier is increased until width/height is same or larger. +- More internal changes to support more than one enabled RTG board at the same time. (Still lots more to do..) +- 68020/030 RTE didn't generate exception when it encountered 68040+ or 68010 only stack frame types. +- Return error code instead of crashing if bsdsocket emulation sendto() tries to use unsupported raw protocol. +- Switching from relative path mode back to normal mode could have caused repeated crashing. +- Do not write reserved block at the end of FileInfoBlock back to Amiga side, Pre-2.x dos commands don't allocate + complete FIB structure. (Was side-effect of OS4.x compatible trap system) +- Basic NERO nrg CD image support added. Data and audio tracks seems to work. +- CDFS mounting selects Joliet volume label if found. (Joliet volume label is not restricted to capital ASCII letters) +- uaenet.device S2_READORPHAN should not filter unknown multicast addresses. + Beta 7: - Fullscreen + paused + enter GUI: GUI was invisible. diff --git a/traps.cpp b/traps.cpp index b22db90e..08c9745f 100644 --- a/traps.cpp +++ b/traps.cpp @@ -971,7 +971,13 @@ void trap_set_areg(TrapContext *ctx, int reg, uae_u32 v) m68k_areg(regs, reg) = v; } } - +void trap_put_quad(TrapContext *ctx, uaecptr addr, uae_u64 v) +{ + uae_u8 out[8]; + put_long_host(out + 0, v >> 32); + put_long_host(out + 4, (uae_u32)(v >> 0)); + trap_put_bytes(ctx, out, addr, 8); +} void trap_put_long(TrapContext *ctx, uaecptr addr, uae_u32 v) { if (trap_is_indirect_null(ctx)) { @@ -997,6 +1003,12 @@ void trap_put_byte(TrapContext *ctx, uaecptr addr, uae_u8 v) } } +uae_u64 trap_get_quad(TrapContext *ctx, uaecptr addr) +{ + uae_u8 in[8]; + trap_get_bytes(ctx, in, addr, 8); + return ((uae_u64)get_long_host(in + 0) << 32) | get_long_host(in + 4); +} uae_u32 trap_get_long(TrapContext *ctx, uaecptr addr) { if (trap_is_indirect_null(ctx)) { diff --git a/x86.cpp b/x86.cpp index 399eae65..1acd447f 100644 --- a/x86.cpp +++ b/x86.cpp @@ -171,7 +171,7 @@ static int x86_found; #define IO_KEYBOARD_REGISTER_A2000 0x1fff #define IO_A2386_CONFIG 0x1f9f -#define ISVGA() (currprefs.rtgmem_type == GFXBOARD_VGA) +#define ISVGA() (currprefs.rtgboards[0].rtgmem_type == GFXBOARD_VGA) static struct x86_bridge *bridges[X86_BRIDGE_MAX]; diff --git a/zfile.cpp b/zfile.cpp index c97f05c1..234a7736 100644 --- a/zfile.cpp +++ b/zfile.cpp @@ -296,7 +296,8 @@ int zfile_gettype (struct zfile *z) return ZFILE_NVR; if (strcasecmp (ext, _T("uae")) == 0) return ZFILE_CONFIGURATION; - if (strcasecmp (ext, _T("cue")) == 0 || strcasecmp (ext, _T("iso")) == 0 || strcasecmp (ext, _T("ccd")) == 0 || strcasecmp (ext, _T("mds")) == 0 || strcasecmp (ext, _T("chd")) == 0) + if (strcasecmp(ext, _T("cue")) == 0 || strcasecmp(ext, _T("iso")) == 0 || strcasecmp(ext, _T("ccd")) == 0 || + strcasecmp(ext, _T("mds")) == 0 || strcasecmp(ext, _T("chd")) == 0 || strcasecmp(ext, _T("nrg")) == 0) return ZFILE_CDIMAGE; } memset (buf, 0, sizeof (buf)); -- 2.47.3