From: Toni Wilen Date: Sun, 19 Oct 2014 14:26:05 +0000 (+0300) Subject: 2900b21 X-Git-Tag: 3000~21 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=30410d82961536faf9201fbac2ec769cc617262c;p=francis%2Fwinuae.git 2900b21 --- diff --git a/cdtv.cpp b/cdtv.cpp index e8f4eccb..bdd462db 100644 --- a/cdtv.cpp +++ b/cdtv.cpp @@ -1093,7 +1093,7 @@ void CDTV_hsync_handler (void) { static int subqcnt; - if (!currprefs.cs_cdtvcd || configured <= 0) + if (!currprefs.cs_cdtvcd || configured <= 0 || currprefs.cs_cdtvcr) return; cdtv_hsync++; @@ -1710,7 +1710,7 @@ uae_u8 *save_cdtv_dmac (int *len, uae_u8 *dstptr) { uae_u8 *dstbak, *dst; - if (!currprefs.cs_cdtvcd) + if (!currprefs.cs_cdtvcd || currprefs.cs_cdtvcr) return NULL; if (dstptr) dstbak = dst = dstptr; @@ -1750,7 +1750,7 @@ uae_u8 *save_cdtv (int *len, uae_u8 *dstptr) { uae_u8 *dstbak, *dst; - if (!currprefs.cs_cdtvcd) + if (!currprefs.cs_cdtvcd || currprefs.cs_cdtvcr) return NULL; if (dstptr) @@ -1846,7 +1846,7 @@ uae_u8 *restore_cdtv (uae_u8 *src) void restore_cdtv_finish (void) { - if (!currprefs.cs_cdtvcd) + if (!currprefs.cs_cdtvcd || currprefs.cs_cdtvcr) return; cdtv_init (); get_toc (); diff --git a/cdtvcr.cpp b/cdtvcr.cpp index ba8b36e0..6ef50700 100644 --- a/cdtvcr.cpp +++ b/cdtvcr.cpp @@ -20,6 +20,10 @@ #include "zfile.h" #include "gui.h" #include "cdtvcr.h" +#include "blkdev.h" +#include "threaddep/thread.h" +#include "uae.h" +#include "custom.h" #define CDTVCR_MASK 0xffff @@ -28,8 +32,46 @@ #define CDTVCR_RAM_MASK (CDTVCR_RAM_SIZE - 1) #define CDTVCR_CLOCK 0xc10 +#define CDTVCR_ID 0x9dc +#define CDTVCR_RESET 0xc00 + +#define CDTVCR_CD_CMD 0xc40 +#define CDTVCR_CD_CMD_DO 0xc52 +#define CDTVCR_CD_CMD_STATUS 0xc4e +#define CDTVCR_CD_CMD_STATUS2 0xc4f + +#define CDTVCR_CD_STATE 0xc53 +#define CDTVCR_SYS_STATE 0xc54 +#define CDTVCR_CD_SPEED 0xc59 +#define CDTVCR_CD_PLAYING 0xc5b +#define CDTVCR_CD_SUBCODES 0xc60 +#define CDTVCR_CD_ALLOC 0xc61 + +#define CDTVCR_INTDISABLE 0xc04 +#define CDTVCR_INTACK 0xc05 +#define CDTVCR_INTENA 0xc55 +#define CDTVCR_INTREQ 0xc56 +#define CDTVCR_4510_TRIGGER 0x4000 + +#define CDTVCR_SUBQ 0x906 +#define CDTVCR_SUBBANK 0x917 +#define CDTVCR_SUBC 0x918 +#define CDTVCR_TOC 0xa00 + +static uae_u8 cdtvcr_4510_ram[CDTVCR_RAM_OFFSET]; static uae_u8 cdtvcr_ram[CDTVCR_RAM_SIZE]; +static uae_u8 cdtvcr_clock[2]; + +static smp_comm_pipe requests; +static uae_sem_t sub_sem; +static volatile int thread_alive; +static int unitnum = -1; +static struct cd_toc_head toc; +static int datatrack; +static int cdtvcr_media; +static int subqcnt; +static int cd_audio_status; static void cdtvcr_battram_reset (void) { @@ -83,29 +125,389 @@ static uae_u8 cdtvcr_battram_read (int addr) return v; } -static void cdtvcr_bput2 (uaecptr addr, uae_u32 b) +static int ismedia (void) +{ + cdtvcr_4510_ram[CDTVCR_SYS_STATE] &= ~8; + if (unitnum < 0) + return 0; + if (sys_command_ismedia (unitnum, 0)) { + cdtvcr_4510_ram[CDTVCR_SYS_STATE] |= 8; + return 1; + } + return 0; +} + +static int get_qcode (void) +{ +#if 0 + if (!sys_command_cd_qcode (unitnum, cdrom_qcode)) + return 0; + cdrom_qcode[1] = cd_audio_status; +#endif + return 1; +} + +static int get_toc (void) +{ + uae_u32 msf; + uae_u8 *p; + + cdtvcr_4510_ram[CDTVCR_SYS_STATE] &= ~4; + datatrack = 0; + if (!sys_command_cd_toc (unitnum, &toc)) + return 0; + cdtvcr_4510_ram[CDTVCR_SYS_STATE] |= 4 | 8; + if (toc.first_track == 1 && (toc.toc[toc.first_track_offset].control & 0x0c) == 0x04) + datatrack = 1; + p = &cdtvcr_4510_ram[CDTVCR_TOC]; + p[0] = toc.first_track; + p[1] = toc.last_track; + msf = lsn2msf(toc.lastaddress); + p[2] = msf >> 16; + p[3] = msf >> 8; + p[4] = msf >> 0; + p += 5; + for (int j = toc.first_track_offset; j <= toc.last_track_offset; j++) { + struct cd_toc *s = &toc.toc[j]; + p[0] = (s->adr << 0) | (s->control << 4); + p[1] = s->track; + msf = lsn2msf(s->address); + p[2] = msf >> 16; + p[3] = msf >> 8; + p[4] = msf >> 0; + p += 5; + } + return 1; +} + +static void cdtvcr_4510_reset(uae_u8 v) +{ + cdtvcr_4510_ram[CDTVCR_ID + 0] = 'C'; + cdtvcr_4510_ram[CDTVCR_ID + 1] = 'D'; + cdtvcr_4510_ram[CDTVCR_ID + 2] = 'T'; + cdtvcr_4510_ram[CDTVCR_ID + 3] = 'V'; + + if (v == 3) { + sys_command_cd_pause (unitnum, 0); + sys_command_cd_stop (unitnum); + cdtvcr_4510_ram[CDTVCR_CD_PLAYING] = 0; + cdtvcr_4510_ram[CDTVCR_CD_STATE] = 0; + return; + } else if (v == 2 || v == 1) { + cdtvcr_4510_ram[CDTVCR_INTENA] = 0; + cdtvcr_4510_ram[CDTVCR_INTREQ] = 0; + if (v == 1) { + memset(cdtvcr_4510_ram, 0, 4096); + } + cdtvcr_4510_ram[CDTVCR_INTDISABLE] = 1; + cdtvcr_4510_ram[CDTVCR_CD_STATE] = 2; + } + + if (ismedia()) + get_toc(); +} + +void rethink_cdtvcr(void) +{ + if ((cdtvcr_4510_ram[CDTVCR_INTREQ] & cdtvcr_4510_ram[CDTVCR_INTENA]) && !cdtvcr_4510_ram[CDTVCR_INTDISABLE]) + INTREQ_0 (0x8000 | 0x0008); +} + +static void cdtvcr_cmd_done(void) +{ + cdtvcr_4510_ram[CDTVCR_SYS_STATE] &= ~1; + cdtvcr_4510_ram[CDTVCR_CD_CMD_DO] = 0; + cdtvcr_4510_ram[CDTVCR_INTREQ] |= 0x40; + cdtvcr_4510_ram[CDTVCR_CD_CMD_STATUS] = 0; + cdtvcr_4510_ram[CDTVCR_CD_CMD_STATUS2] = 0; +} + +static void cdtvcr_play_done(void) +{ + cdtvcr_4510_ram[CDTVCR_SYS_STATE] &= ~1; + cdtvcr_4510_ram[CDTVCR_CD_CMD_DO] = 0; + cdtvcr_4510_ram[CDTVCR_INTREQ] |= 0x80; + cdtvcr_4510_ram[CDTVCR_CD_CMD_STATUS] = 0; + cdtvcr_4510_ram[CDTVCR_CD_CMD_STATUS2] = 0; +} + +static void cdtvcr_cmd_play_started(void) +{ + cdtvcr_cmd_done(); + cdtvcr_4510_ram[CDTVCR_CD_CMD_STATUS + 2] = 2; + cdtvcr_4510_ram[CDTVCR_CD_CMD_STATUS2 + 2] = 0; + cdtvcr_4510_ram[CDTVCR_CD_PLAYING] = 1; + cdtvcr_4510_ram[CDTVCR_CD_STATE] = 8; +} + +static void cdtvcr_start (void) +{ + if (unitnum < 0) + return; + cdtvcr_4510_ram[CDTVCR_CD_STATE] = 0; +} + +static void cdtvcr_stop (void) +{ + if (unitnum < 0) + return; + sys_command_cd_pause (unitnum, 0); + sys_command_cd_stop (unitnum); + if (cdtvcr_4510_ram[CDTVCR_CD_PLAYING]) { + cdtvcr_4510_ram[CDTVCR_INTREQ] |= 0x80; + } + cdtvcr_4510_ram[CDTVCR_CD_PLAYING] = 0; + cdtvcr_4510_ram[CDTVCR_CD_STATE] = 2; +} + +static void cdtvcr_pause(bool pause) +{ + sys_command_cd_pause (unitnum, pause ? 1 : 0); + cdtvcr_4510_ram[CDTVCR_CD_STATE] &= ~4; + if (pause) + cdtvcr_4510_ram[CDTVCR_CD_STATE] |= 4; + cdtvcr_cmd_done(); +} + +static void setsubchannel(uae_u8 *s) +{ + uae_u8 *d; + + // subchannels + d = &cdtvcr_4510_ram[CDTVCR_SUBC]; + cdtvcr_4510_ram[CDTVCR_SUBBANK] = cdtvcr_4510_ram[CDTVCR_SUBBANK] ? 0 : SUB_CHANNEL_SIZE + 2; + d[cdtvcr_4510_ram[CDTVCR_SUBBANK] + 0] = 0; + d[cdtvcr_4510_ram[CDTVCR_SUBBANK] + 1] = 0; + for (int i = 0; i < SUB_CHANNEL_SIZE; i++) { + d[cdtvcr_4510_ram[CDTVCR_SUBBANK] + i + 2] = s[i] & 0x3f; + } + + // q-channel + d = &cdtvcr_4510_ram[CDTVCR_SUBQ]; + s += SUB_ENTRY_SIZE; + /* CtlAdr */ + d[0] = s[0]; + /* Track */ + d[1] = s[1]; + /* Index */ + d[2] = s[2]; + /* TrackPos */ + d[3] = s[3]; + d[4] = s[4]; + d[5] = s[5]; + /* DiskPos */ + d[6] = s[6]; + d[7] = s[7]; + d[8] = s[8]; + d[9] = s[9]; + cdtvcr_4510_ram[CDTVCR_SUBQ - 2] = 1; // qcode valid + cdtvcr_4510_ram[CDTVCR_SUBQ - 1] = 0; + + if (cdtvcr_4510_ram[CDTVCR_CD_SUBCODES]) + cdtvcr_4510_ram[CDTVCR_INTREQ] |= 2 | 4; +} + +static void subfunc(uae_u8 *data, int cnt) +{ + uae_u8 out[SUB_CHANNEL_SIZE]; + sub_to_deinterleaved(data, out); + setsubchannel(out); +} + +static int statusfunc(int status) +{ + if (status == -1) + return 500; + if (status == -2) + return 75; + if (cd_audio_status != status) { + if (status == AUDIO_STATUS_PLAY_COMPLETE || status == AUDIO_STATUS_PLAY_ERROR) { + cdtvcr_play_done(); + } else if (status == AUDIO_STATUS_IN_PROGRESS) { + cdtvcr_cmd_play_started(); + } + } + cd_audio_status = status; + return 0; +} + +static void cdtvcr_play(uae_u32 start, uae_u32 end) +{ + sys_command_cd_pause(unitnum, 0); + if (!sys_command_cd_play(unitnum, start, end, 0, statusfunc, subfunc)) + cdtvcr_play_done(); +} + +static void cdtvcr_play_track(uae_u32 track_start, uae_u32 track_end) +{ + int start_found, end_found; + uae_u32 start, end; + + start_found = end_found = 0; + for (int j = toc.first_track_offset; j <= toc.last_track_offset; j++) { + struct cd_toc *s = &toc.toc[j]; + if (track_start == s->track) { + start_found++; + start = s->paddress; + } + if (track_end == s->track) { + end = s->paddress; + end_found++; + } + } + if (start_found == 0) { + write_log (_T("PLAY CD AUDIO: illegal start track %d\n"), track_start); + cdtvcr_stop(); + cdtvcr_cmd_done(); + return; + } + cdtvcr_play(start, end); +} + +static void cdtvcr_read_data(uae_u32 start, uae_u32 addr, uae_u32 len) +{ + uae_u8 buffer[2048]; + int didread; + + while (len) { + didread = sys_command_cd_read (unitnum, buffer, start, 1); + if (!didread) + break; + for (int i = 0; i < 2048 && len > 0; i++) { + put_byte(addr + i, buffer[i]); + len--; + } + addr += 2048; + start++; + } + cdtvcr_cmd_done(); +} + +static void cdtvcr_do_cmd(void) +{ + uae_u32 addr, len, start, end, datalen; + uae_u32 startlsn, endlsn; + uae_u8 starttrack, endtrack; + uae_u8 *p = &cdtvcr_4510_ram[CDTVCR_CD_CMD]; + + cdtvcr_4510_ram[CDTVCR_SYS_STATE] |= 1; + cdtvcr_4510_ram[CDTVCR_CD_CMD_STATUS] = 2; + cdtvcr_4510_ram[CDTVCR_CD_CMD_STATUS2] = 0; + write_log(_T("CDTVCR CD command %02x\n"), p[0]); + for(int i = 0; i < 14; i++) + write_log(_T(".%02x"), p[i]); + write_log(_T("\n")); + + start = (p[1] << 16) | (p[2] << 8) | (p[3] << 0); + startlsn = msf2lsn(start); + end = (p[4] << 16) | (p[5] << 8) | (p[6] << 0); + endlsn = msf2lsn(end); + addr = (p[7] << 24) | (p[8] << 16) | (p[9] << 8) | (p[10] << 0); + len = (p[4] << 16) | (p[5] << 8) | (p[6] << 0); + datalen = (p[11] << 16) | (p[12] << 8) | (p[13] << 0); + starttrack = p[1]; + endtrack = p[3]; + + switch(p[0]) + { + case 2: // start + cdtvcr_start(); + cdtvcr_cmd_done(); + break; + case 3: // stop + cdtvcr_stop(); + cdtvcr_cmd_done(); + break; + case 4: // toc + cdtvcr_stop(); + get_toc(); + cdtvcr_cmd_done(); + break; + case 6: // play + cdtvcr_stop(); + cdtvcr_play(startlsn, endlsn); + break; + case 7: // play track + cdtvcr_stop(); + cdtvcr_play_track(starttrack, endtrack); + break; + case 8: // read + cdtvcr_stop(); + cdtvcr_read_data(start, addr, datalen); + break; + case 9: + cdtvcr_pause(true); + break; + case 10: + cdtvcr_pause(false); + break; + case 11: // stop play + cdtvcr_stop(); + cdtvcr_cmd_done(); + break; + default: + write_log(_T("unsupported command!\n")); + break; + } +} + +static void cdtvcr_4510_do_something(void) +{ + if (cdtvcr_4510_ram[CDTVCR_INTACK]) { + cdtvcr_4510_ram[CDTVCR_INTACK] = 0; + rethink_cdtvcr(); + } + if (cdtvcr_4510_ram[CDTVCR_CD_CMD_DO]) { + cdtvcr_4510_ram[CDTVCR_SYS_STATE] |= 1; + write_comm_pipe_u32 (&requests, 0x0100, 1); + } +} + +static bool cdtvcr_debug(uaecptr addr) { addr &= CDTVCR_MASK; - if (addr >= CDTVCR_RAM_OFFSET && addr < CDTVCR_RAM_OFFSET + CDTVCR_RAM_SIZE) { - addr -= CDTVCR_RAM_OFFSET; - cdtvcr_battram_write(addr, b); + return !(addr >= CDTVCR_RAM_OFFSET && addr < CDTVCR_RAM_OFFSET + CDTVCR_RAM_SIZE); +} + +static void cdtvcr_bput2 (uaecptr addr, uae_u8 v) +{ + addr &= CDTVCR_MASK; + if (addr == CDTVCR_4510_TRIGGER) { + if (v & 0x80) + cdtvcr_4510_do_something(); + } else if (addr >= CDTVCR_RAM_OFFSET && addr < CDTVCR_RAM_OFFSET + CDTVCR_RAM_SIZE) { + cdtvcr_battram_write(addr - CDTVCR_RAM_OFFSET, v); + } else if (addr >= CDTVCR_CLOCK && addr < CDTVCR_CLOCK + 0x20) { + int reg = addr - CDTVCR_CLOCK; + switch (reg) + { + case 0: + cdtvcr_clock[0] = v; + case 1: + cdtvcr_clock[1] = v; + break; + } + } else { + switch(addr) + { + case CDTVCR_RESET: + cdtvcr_4510_reset(v); + break; + } } + if (addr >= 0xc00 && addr < CDTVCR_RAM_OFFSET) + cdtvcr_4510_ram[addr] = v; } + static uae_u8 cdtvcr_bget2 (uaecptr addr) { uae_u8 v = 0; addr &= CDTVCR_MASK; + if (addr < CDTVCR_RAM_OFFSET) { + v = cdtvcr_4510_ram[addr]; + } if (addr >= CDTVCR_RAM_OFFSET && addr < CDTVCR_RAM_OFFSET + CDTVCR_RAM_SIZE) { - addr -= CDTVCR_RAM_OFFSET; - v = cdtvcr_battram_read(addr); - } else if (addr == 0x9dc) { - v = 'C'; - } else if (addr == 0x9dd) { - v = 'D'; - } else if (addr == 0x9de) { - v = 'T'; - } else if (addr == 0x9df) { - v = 'V'; + v = cdtvcr_battram_read(addr - CDTVCR_RAM_OFFSET); } else if (addr >= CDTVCR_CLOCK && addr < CDTVCR_CLOCK + 0x20) { int reg = addr - CDTVCR_CLOCK; int days, mins, ticks; @@ -121,7 +523,7 @@ static uae_u8 cdtvcr_bget2 (uaecptr addr) { case 0: case 1: - v = 0; + v = cdtvcr_clock[reg]; break; case 2: v = days >> 8; @@ -146,7 +548,13 @@ static uae_u8 cdtvcr_bget2 (uaecptr addr) break; } - + } else { + switch(addr) + { + case CDTVCR_RESET: + v = 0; + break; + } } return v; } @@ -160,7 +568,8 @@ static uae_u32 REGPARAM2 cdtvcr_lget (uaecptr addr) v = (cdtvcr_bget2 (addr) << 24) | (cdtvcr_bget2 (addr + 1) << 16) | (cdtvcr_bget2 (addr + 2) << 8) | (cdtvcr_bget2 (addr + 3)); #if CDTVCR_DEBUG - write_log (_T("cdtvcr_lget %08X=%08X PC=%08X\n"), addr, v, M68K_GETPC); + if (cdtvcr_debug(addr)) + write_log (_T("cdtvcr_lget %08X=%08X PC=%08X\n"), addr, v, M68K_GETPC); #endif return v; } @@ -190,7 +599,8 @@ static uae_u32 REGPARAM2 cdtvcr_wget (uaecptr addr) #endif v = (cdtvcr_bget2 (addr) << 8) | cdtvcr_bget2 (addr + 1); #if CDTVCR_DEBUG - write_log (_T("cdtvcr_wget %08X=%04X PC=%08X\n"), addr, v, M68K_GETPC); + if (cdtvcr_debug(addr)) + write_log (_T("cdtvcr_wget %08X=%04X PC=%08X\n"), addr, v, M68K_GETPC); #endif return v; } @@ -202,6 +612,10 @@ static uae_u32 REGPARAM2 cdtvcr_bget (uaecptr addr) special_mem |= S_READ; #endif v = cdtvcr_bget2 (addr); +#if CDTVCR_DEBUG + if (cdtvcr_debug(addr)) + write_log (_T("cdtvcr_bget %08X=%02X PC=%08X\n"), addr, v, M68K_GETPC); +#endif return v; } @@ -211,7 +625,8 @@ static void REGPARAM2 cdtvcr_lput (uaecptr addr, uae_u32 l) special_mem |= S_WRITE; #endif #if CDTVCR_DEBUG - write_log (_T("cdtvcr_lput %08X=%08X PC=%08X\n"), addr, l, M68K_GETPC); + if (cdtvcr_debug(addr)) + write_log (_T("cdtvcr_lput %08X=%08X PC=%08X\n"), addr, l, M68K_GETPC); #endif cdtvcr_bput2 (addr, l >> 24); cdtvcr_bput2 (addr + 1, l >> 16); @@ -225,7 +640,8 @@ static void REGPARAM2 cdtvcr_wput (uaecptr addr, uae_u32 w) special_mem |= S_WRITE; #endif #if CDTVCR_DEBUG - write_log (_T("cdtvcr_wput %08X=%04X PC=%08X\n"), addr, w & 65535, M68K_GETPC); + if (cdtvcr_debug(addr)) + write_log (_T("cdtvcr_wput %08X=%04X PC=%08X\n"), addr, w & 65535, M68K_GETPC); #endif cdtvcr_bput2 (addr, w >> 8); cdtvcr_bput2 (addr + 1, w); @@ -235,6 +651,10 @@ static void REGPARAM2 cdtvcr_bput (uaecptr addr, uae_u32 b) { #ifdef JIT special_mem |= S_WRITE; +#endif +#if CDTVCR_DEBUG + if (cdtvcr_debug(addr)) + write_log (_T("cdtvcr_bput %08X=%02X PC=%08X\n"), addr, b & 255, M68K_GETPC); #endif cdtvcr_bput2 (addr, b); } @@ -244,14 +664,120 @@ addrbank cdtvcr_bank = { cdtvcr_lget, cdtvcr_wget, cdtvcr_bget, cdtvcr_lput, cdtvcr_wput, cdtvcr_bput, default_xlate, default_check, NULL, NULL, _T("CDTV-CR"), - cdtvcr_lgeti, cdtvcr_wgeti, ABFLAG_IO + cdtvcr_lgeti, cdtvcr_wgeti, ABFLAG_IO | ABFLAG_SAFE }; +static void *dev_thread (void *p) +{ + write_log (_T("CDTV-CR: CD thread started\n")); + thread_alive = 1; + for (;;) { + + uae_u32 b = read_comm_pipe_u32_blocking (&requests); + if (b == 0xffff) { + thread_alive = -1; + return NULL; + } + if (unitnum < 0) + continue; + switch (b) + { + case 0x0100: + cdtvcr_do_cmd(); + break; + case 0x0101: + { + int m = ismedia (); + if (m < 0) { + write_log (_T("CDTV: device %d lost\n"), unitnum); + cdtvcr_4510_ram[CDTVCR_SYS_STATE] &= ~(4 | 8); + } else if (m != cdtvcr_media) { + cdtvcr_media = m; + get_toc (); + } + if (cdtvcr_media) + get_qcode (); + } + break; + } + } +} + +void CDTVCR_hsync_handler (void) +{ + static int subqcnt; + + if (!currprefs.cs_cdtvcr) + return; + + subqcnt--; + if (subqcnt < 0) { + write_comm_pipe_u32 (&requests, 0x0101, 1); + subqcnt = 75; + // want subcodes but not playing? + if (cdtvcr_4510_ram[CDTVCR_CD_SUBCODES] && !cdtvcr_4510_ram[CDTVCR_CD_PLAYING]) { + // just return fake stuff, for some reason cdtv-cr driver requires something + // that looks validg, even when not playing or it gets in infinite loop + uae_u8 dst[SUB_CHANNEL_SIZE]; + // regenerate Q-subchannel + uae_u8 *s = dst + 12; + struct cd_toc *cdtoc = &toc.toc[toc.first_track]; + int sector = 150; + memset (dst, 0, SUB_CHANNEL_SIZE); + s[0] = (cdtoc->control << 4) | (cdtoc->adr << 0); + s[1] = tobcd (cdtoc->track); + s[2] = tobcd (1); + int msf = lsn2msf (sector); + tolongbcd (s + 7, msf); + msf = lsn2msf (sector - cdtoc->address - 150); + tolongbcd (s + 3, msf); + setsubchannel(dst); + } + } +} + +static void open_unit (void) +{ + struct device_info di; + unitnum = get_standard_cd_unit (CD_STANDARD_UNIT_CDTV); + sys_command_info (unitnum, &di, 0); + write_log (_T("using drive %s (unit %d, media %d)\n"), di.label, unitnum, di.media_inserted); +} + +static void close_unit (void) +{ + if (unitnum >= 0) + sys_command_close (unitnum); + unitnum = -1; +} + void cdtvcr_reset(void) { + close_unit (); + if (!thread_alive) { + init_comm_pipe (&requests, 100, 1); + uae_start_thread (_T("cdtv-cr"), dev_thread, NULL, NULL); + while (!thread_alive) + sleep_millis (10); + uae_sem_init (&sub_sem, 0, 1); + } + open_unit (); + gui_flicker_led (LED_CD, 0, -1); + + cdtvcr_4510_reset(0); cdtvcr_battram_reset(); + cdtvcr_clock[0] = 0xe3; + cdtvcr_clock[1] = 0x1b; } void cdtvcr_free(void) { + if (thread_alive > 0) { + write_comm_pipe_u32 (&requests, 0xffff, 1); + while (thread_alive > 0) + sleep_millis (10); + uae_sem_destroy (&sub_sem); + } + thread_alive = 0; + close_unit (); } diff --git a/cfgfile.cpp b/cfgfile.cpp index ffa949bf..3ccf9dad 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -1455,6 +1455,7 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) cfgfile_dwrite_bool(f, _T("cd32nvram"), p->cs_cd32nvram); cfgfile_dwrite_bool(f, _T("cd32fmv"), p->cs_cd32fmv); cfgfile_dwrite_bool(f, _T("cdtvcd"), p->cs_cdtvcd); + cfgfile_dwrite_bool(f, _T("cdtv-cr"), p->cs_cdtvcr); cfgfile_dwrite_bool (f, _T("cdtvram"), p->cs_cdtvram); cfgfile_dwrite (f, _T("cdtvramcard"), _T("%d"), p->cs_cdtvcard); cfgfile_dwrite_str (f, _T("ide"), p->cs_ide == IDE_A600A1200 ? _T("a600/a1200") : (p->cs_ide == IDE_A4000 ? _T("a4000") : _T("none"))); @@ -3628,6 +3629,7 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH || cfgfile_yesno(option, value, _T("cd32nvram"), &p->cs_cd32nvram) || cfgfile_yesno(option, value, _T("cd32fmv"), &p->cs_cd32fmv) || cfgfile_yesno(option, value, _T("cdtvcd"), &p->cs_cdtvcd) + || cfgfile_yesno(option, value, _T("cdtv-cr"), &p->cs_cdtvcr) || cfgfile_yesno (option, value, _T("cdtvram"), &p->cs_cdtvram) || cfgfile_yesno (option, value, _T("a1000ram"), &p->cs_a1000ram) || cfgfile_yesno (option, value, _T("pcmcia"), &p->cs_pcmcia) @@ -5714,6 +5716,9 @@ static void buildin_default_prefs (struct uae_prefs *p) p->cs_resetwarning = 0; p->cs_ciatodbug = false; + _tcscpy (p->romextfile, _T("")); + _tcscpy (p->romextfile2, _T("")); + p->prtname[0] = 0; p->sername[0] = 0; @@ -5928,8 +5933,9 @@ static int bip_cdtvcr (struct uae_prefs *p, int config, int compa, int romcheck) roms[2] = -1; if (!configure_rom (p, roms, romcheck)) return 0; - roms[0] = 107; - roms[1] = -1; + roms[0] = 108; + roms[1] = 107; + roms[2] = -1; if (!configure_rom (p, roms, romcheck)) return 0; return 1; @@ -5939,6 +5945,9 @@ static int bip_cdtv (struct uae_prefs *p, int config, int compa, int romcheck) { int roms[4]; + if (config >= 2) + return bip_cdtvcr(p, config - 2, compa, romcheck); + p->bogomem_size = 0; p->chipmem_size = 0x100000; p->chipset_mask = CSMASK_ECS_AGNUS; @@ -6239,12 +6248,9 @@ int built_in_prefs (struct uae_prefs *p, int model, int config, int compa, int r v = bip_cdtv (p, config, compa, romcheck); break; case 10: - v = bip_cdtvcr(p, config, compa, romcheck); - break; - case 11: v = bip_arcadia (p, config , compa, romcheck); break; - case 12: + case 11: v = bip_super (p, config, compa, romcheck); break; } diff --git a/cpuboard.cpp b/cpuboard.cpp index f27c5deb..6e9b662e 100644 --- a/cpuboard.cpp +++ b/cpuboard.cpp @@ -58,7 +58,8 @@ #define P5_SET_CLEAR 0x80 /* REQ_RESET 0x00 */ -// 0x10/0x08/0x04 only work if P5_SELF_RESET is cleared +// M68K can only reset PPC and vice versa +// if P5_SELF_RESET is not active. #define P5_PPC_RESET 0x10 #define P5_M68K_RESET 0x08 #define P5_AMIGA_RESET 0x04 @@ -128,8 +129,10 @@ #define CS_RAM_BASE 0x0c000000 -#define BLIZZARD_RAM_BASE 0x68000000 -#define BLIZZARD_RAM_ALIAS_BASE 0x48000000 +#define BLIZZARD_RAM_BASE_48 0x48000000 +#define BLIZZARD_RAM_BASE_68 0x68000000 +#define BLIZZARD_RAM_256M_BASE_40 0x40000000 +#define BLIZZARD_RAM_256M_BASE_70 0x70000000 #define BLIZZARD_MAPROM_BASE 0x4ff80000 #define BLIZZARD_MAPROM_ENABLE 0x80ffff00 #define BLIZZARD_BOARD_DISABLE 0x80fa0000 @@ -1078,23 +1081,33 @@ static void REGPARAM2 blizzardio_bput(uaecptr addr, uae_u32 v) write_log(_T("CS: SCSI reset\n")); map_banks(&blizzardf0_bank, 0xf00000 >> 16, 0x60000 >> 16, 0); } - if ((oldval & P5_PPC_RESET) && !(regval & P5_PPC_RESET)) { - uae_ppc_cpu_stop(); - } else if (!(oldval & P5_PPC_RESET) && (regval & P5_PPC_RESET)) { - uae_ppc_cpu_reboot(); + if (!(io_reg[CSIII_REG_SHADOW] & P5_SELF_RESET) || uae_self_is_ppc() == false) { + if ((oldval & P5_PPC_RESET) && !(regval & P5_PPC_RESET)) { + uae_ppc_cpu_stop(); + } else if (!(oldval & P5_PPC_RESET) && (regval & P5_PPC_RESET)) { + uae_ppc_cpu_reboot(); + } + } else { + io_reg[CSIII_REG_RESET] &= ~P5_PPC_RESET; + io_reg[CSIII_REG_RESET] |= oldval & P5_PPC_RESET; } - if ((regval & P5_M68K_RESET) && !(oldval & P5_M68K_RESET)) { - m68k_reset(); - write_log(_T("CS: M68K Reset\n")); - } else if (!(regval & P5_M68K_RESET) && (oldval & P5_M68K_RESET)) { - write_log(_T("CS: M68K Halted\n")); - if (!(regval & P5_PPC_RESET)) { - write_log(_T("CS: PPC is also halted. STOP.\n")); - cpu_halt(5); - } else { - // halt 68k, leave ppc message processing active. - cpu_halt(-1); + if (!(io_reg[CSIII_REG_SHADOW] & P5_SELF_RESET) || uae_self_is_ppc() == true) { + if ((regval & P5_M68K_RESET) && !(oldval & P5_M68K_RESET)) { + m68k_reset(); + write_log(_T("CS: M68K Reset\n")); + } else if (!(regval & P5_M68K_RESET) && (oldval & P5_M68K_RESET)) { + write_log(_T("CS: M68K Halted\n")); + if (!(regval & P5_PPC_RESET)) { + write_log(_T("CS: PPC is also halted. STOP.\n")); + cpu_halt(5); + } else { + // halt 68k, leave ppc message processing active. + cpu_halt(-1); + } } + } else { + io_reg[CSIII_REG_RESET] &= ~P5_M68K_RESET; + io_reg[CSIII_REG_RESET] |= oldval & P5_M68K_RESET; } if (!(io_reg[CSIII_REG_SHADOW] & P5_SELF_RESET)) { if (!(regval & P5_AMIGA_RESET)) { @@ -1224,20 +1237,24 @@ void cpuboard_map(void) return; if (is_blizzard() || is_blizzardppc()) { if (cpuboard_size) { - if (blizzard_jit) { - map_banks(&blizzardram_bank, blizzardram_bank.start >> 16, cpuboard_size >> 16, 0); - map_banks(&blizzardram_bank, BLIZZARD_RAM_BASE >> 16, cpuboard_size >> 16, 0); - } else { - for (int i = 0; i < 0x08000000; i += cpuboard_size) { - map_banks_nojitdirect(&blizzardram_nojit_bank, (BLIZZARD_RAM_ALIAS_BASE + i) >> 16, cpuboard_size >> 16, 0); - map_banks_nojitdirect(&blizzardram_nojit_bank, (BLIZZARD_RAM_BASE + i) >> 16, cpuboard_size >> 16, 0); - } - if (currprefs.maprom && !is_blizzardppc()) { + if (cpuboard_size < 256 * 1024 * 1024) { + if (blizzard_jit) { + map_banks(&blizzardram_bank, blizzardram_bank.start >> 16, cpuboard_size >> 16, 0); + map_banks(&blizzardram_bank, BLIZZARD_RAM_BASE_68 >> 16, cpuboard_size >> 16, 0); + } else { for (int i = 0; i < 0x08000000; i += cpuboard_size) { - map_banks_nojitdirect(&blizzardmaprom_bank, (BLIZZARD_RAM_ALIAS_BASE + i + cpuboard_size - 524288) >> 16, 524288 >> 16, 0); - map_banks_nojitdirect(&blizzardmaprom_bank, (BLIZZARD_RAM_BASE + i + cpuboard_size - 524288) >> 16, 524288 >> 16, 0); + map_banks_nojitdirect(&blizzardram_nojit_bank, (BLIZZARD_RAM_BASE_48 + i) >> 16, cpuboard_size >> 16, 0); + map_banks_nojitdirect(&blizzardram_nojit_bank, (BLIZZARD_RAM_BASE_68 + i) >> 16, cpuboard_size >> 16, 0); + } + if (currprefs.maprom && !is_blizzardppc()) { + for (int i = 0; i < 0x08000000; i += cpuboard_size) { + map_banks_nojitdirect(&blizzardmaprom_bank, (BLIZZARD_RAM_BASE_48 + i + cpuboard_size - 524288) >> 16, 524288 >> 16, 0); + map_banks_nojitdirect(&blizzardmaprom_bank, (BLIZZARD_RAM_BASE_68 + i + cpuboard_size - 524288) >> 16, 524288 >> 16, 0); + } } } + } else { + map_banks(&blizzardram_bank, blizzardram_bank.start >> 16, cpuboard_size >> 16, 0); } } if (!is_blizzardppc()) { @@ -1381,10 +1398,22 @@ void cpuboard_init(void) mapped_malloc(&blizzardea_bank); } else if (is_blizzard() || is_blizzardppc()) { - blizzardram_bank.start = BLIZZARD_RAM_ALIAS_BASE; - blizzardram_bank.allocated = cpuboard_size; - blizzardram_bank.mask = blizzardram_bank.allocated - 1; - blizzardram_bank.startmask = BLIZZARD_RAM_BASE; + if (cpuboard_size < 256 * 1024 * 1024) { + blizzardram_bank.start = BLIZZARD_RAM_BASE_48; + blizzardram_bank.allocated = cpuboard_size; + blizzardram_bank.mask = blizzardram_bank.allocated - 1; + blizzardram_bank.startmask = BLIZZARD_RAM_BASE_68; + } else if (currprefs.z3autoconfig_start <= 0x10000000) { + blizzardram_bank.start = BLIZZARD_RAM_256M_BASE_40; + blizzardram_bank.allocated = cpuboard_size; + blizzardram_bank.mask = blizzardram_bank.allocated - 1; + blizzardram_bank.startmask = BLIZZARD_RAM_256M_BASE_40; + } else { + blizzardram_bank.start = BLIZZARD_RAM_256M_BASE_70; + blizzardram_bank.allocated = cpuboard_size; + blizzardram_bank.mask = blizzardram_bank.allocated - 1; + blizzardram_bank.startmask = BLIZZARD_RAM_256M_BASE_70; + } blizzardram_nojit_bank.start = blizzardram_bank.start; blizzardram_nojit_bank.allocated = blizzardram_bank.allocated; @@ -1392,10 +1421,13 @@ void cpuboard_init(void) blizzardram_nojit_bank.startmask = blizzardram_bank.startmask; - blizzard_jit = 0 && BLIZZARD_RAM_BASE + blizzardram_bank.allocated <= max_z3fastmem && currprefs.jit_direct_compatible_memory; + blizzard_jit = cpuboard_jitdirectompatible(&currprefs); if (blizzard_jit) { if (cpuboard_size) { - blizzardram_bank.label = _T("blizzard"); + if (cpuboard_size < 256 * 1024 * 1024) + blizzardram_bank.label = _T("blizzard"); + else + blizzardram_bank.label = _T("blizzard_70"); mapped_malloc(&blizzardram_bank); } } else { @@ -1550,6 +1582,13 @@ bool cpuboard_maprom(void) } return true; } +bool cpuboard_jitdirectompatible(struct uae_prefs *p) +{ + if (cpuboard_memorytype(p) == BOARD_MEMORY_BLIZZARD_12xx || cpuboard_memorytype(p) == BOARD_MEMORY_BLIZZARD_PPC) { + return false; + } + return true; +} int cpuboard_memorytype(struct uae_prefs *p) { @@ -1568,15 +1607,37 @@ int cpuboard_memorytype(struct uae_prefs *p) case BOARD_A2630: return BOARD_MEMORY_Z2; case BOARD_BLIZZARD_1230_IV: + case BOARD_BLIZZARD_1230_IV_SCSI: case BOARD_BLIZZARD_1260: + case BOARD_BLIZZARD_1260_SCSI: + return BOARD_MEMORY_BLIZZARD_12xx; case BOARD_BLIZZARDPPC: - return BOARD_MEMORY_BLIZZARD; + return BOARD_MEMORY_BLIZZARD_PPC; default: write_log(_T("Missing board type %d!\n"), p->cpuboard_type); return BOARD_MEMORY_HIGHMEM; } } +int cpuboard_maxmemory(struct uae_prefs *p) +{ + if (p->cpuboard_type == BOARD_BLIZZARDPPC) + return 256 * 1024 * 1024; + int type = cpuboard_memorytype(p); + switch (type) + { + case BOARD_MEMORY_BLIZZARD_12xx: + case BOARD_MEMORY_BLIZZARD_PPC: + return 256 * 1024 * 1024; + case BOARD_MEMORY_HIGHMEM: + return 128 * 1024 * 1024; + case BOARD_MEMORY_Z2: + return 8 * 1024 * 1024; + default: + return 0; + } +} + void cpuboard_io_special_write(uaecptr addr, uae_u32 val) { blizzarde8_wput(addr, val); diff --git a/custom.cpp b/custom.cpp index 42515b58..fed75653 100644 --- a/custom.cpp +++ b/custom.cpp @@ -46,6 +46,7 @@ #include "akiko.h" #include "cd32_fmv.h" #include "cdtv.h" +#include "cdtvcr.h" #if defined(ENFORCER) #include "enforcer.h" #endif @@ -4619,7 +4620,8 @@ static void rethink_intreq (void) rethink_a2091 (); #endif #ifdef CDTV - rethink_cdtv (); + rethink_cdtv(); + rethink_cdtvcr(); #endif #ifdef CD32 rethink_akiko (); @@ -7510,6 +7512,7 @@ static void hsync_handler_pre (bool onvsync) #endif #ifdef CDTV CDTV_hsync_handler (); + CDTVCR_hsync_handler (); #endif decide_blitter (-1); diff --git a/expansion.cpp b/expansion.cpp index 83f56fc4..2bb56df4 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -200,7 +200,7 @@ bool expamem_z3hack(struct uae_prefs *p) if (regs.halted && ppc_state) return false; #endif - return p->jit_direct_compatible_memory || cpuboard_memorytype(p) == BOARD_MEMORY_BLIZZARD; + return p->jit_direct_compatible_memory || cpuboard_memorytype(p) == BOARD_MEMORY_BLIZZARD_12xx; } /* Ugly hack for >2M chip RAM in single pool @@ -1756,7 +1756,7 @@ void expamem_reset (void) } #endif #ifdef CDTV - if (currprefs.cs_cdtvcd) { + if (currprefs.cs_cdtvcd && !currprefs.cs_cdtvcr) { card_flags[cardno] = 0; card_name[cardno] = _T("CDTV DMAC"); card_init[cardno] = expamem_init_cdtv; diff --git a/include/cdtvcr.h b/include/cdtvcr.h index dca99fe8..99f19d84 100644 --- a/include/cdtvcr.h +++ b/include/cdtvcr.h @@ -1,3 +1,7 @@ void cdtvcr_reset(void); void cdtvcr_free(void); +void rethink_cdtvcr(void); + +extern void CDTVCR_hsync_handler(void); + diff --git a/include/cpuboard.h b/include/cpuboard.h index 5845668e..0a7d650c 100644 --- a/include/cpuboard.h +++ b/include/cpuboard.h @@ -10,6 +10,8 @@ extern void cpuboard_vsync(void); extern void cpuboard_hsync(void); extern void cpuboard_rethink(void); extern int cpuboard_memorytype(struct uae_prefs *p); +extern int cpuboard_maxmemory(struct uae_prefs *p); +extern bool cpuboard_jitdirectompatible(struct uae_prefs *p); extern bool is_ppc_cpu(struct uae_prefs *); extern void cpuboard_io_special_write(uaecptr addr, uae_u32 val); extern void cpuboard_overlay_override(void); @@ -24,7 +26,8 @@ extern uae_u8 *REGPARAM3 cyberstorm_scsi_ram_xlate(uaecptr addr) REGPARAM; #define BOARD_MEMORY_Z2 1 #define BOARD_MEMORY_Z3 2 #define BOARD_MEMORY_HIGHMEM 3 -#define BOARD_MEMORY_BLIZZARD 4 +#define BOARD_MEMORY_BLIZZARD_12xx 4 +#define BOARD_MEMORY_BLIZZARD_PPC 5 #define BOARD_BLIZZARD_1230_IV 1 #define BOARD_BLIZZARD_1230_IV_SCSI 2 diff --git a/include/newcpu.h b/include/newcpu.h index e462332d..778ff2c6 100644 --- a/include/newcpu.h +++ b/include/newcpu.h @@ -196,9 +196,6 @@ struct regstruct uae_u32 pcr; uae_u32 address_space_mask; - uae_u8 panic; - uae_u32 panic_pc, panic_addr; - uae_u32 prefetch020[CPU_PIPELINE_MAX]; uae_u32 prefetch020addr; uae_u32 cacheholdingdata020; diff --git a/include/uae/ppc.h b/include/uae/ppc.h index bcd1ef5b..3c4a93ef 100644 --- a/include/uae/ppc.h +++ b/include/uae/ppc.h @@ -40,6 +40,7 @@ void uae_ppc_free(void); void uae_ppc_hsync_handler(void); void uae_ppc_wakeup(void); void ppc_map_banks(uae_u32, uae_u32, const TCHAR*, void*, bool); +bool uae_self_is_ppc(void); void uae_ppc_execute_quick(void); void uae_ppc_execute_check(void); diff --git a/inputdevice.cpp b/inputdevice.cpp index 1e03c941..6b8ffd59 100644 --- a/inputdevice.cpp +++ b/inputdevice.cpp @@ -1184,7 +1184,7 @@ static void mousehack_reset (void) mousehack_alive_cnt = 0; vp_xoffset = vp_yoffset = 0; tablet_data = 0; - if (mousehack_address) + if (mousehack_address && valid_address(mousehack_address + MH_E, 1)) put_byte (mousehack_address + MH_E, 0); mousehack_address = 0; mousehack_enabled = false; @@ -1203,7 +1203,7 @@ static bool mousehack_enable (void) mode |= 1; if (inputdevice_is_tablet () > 0) mode |= 2; - if (mousehack_address) { + if (mousehack_address && valid_address(mousehack_address + MH_E, 1)) { write_log (_T("Mouse driver enabled (%s)\n"), ((mode & 3) == 3 ? _T("tablet+mousehack") : ((mode & 3) == 2) ? _T("tablet") : _T("mousehack"))); put_byte (mousehack_address + MH_E, mode); mousehack_enabled = true; @@ -1420,7 +1420,6 @@ void inputdevice_tablet_info (int maxx, int maxy, int maxz, int maxax, int maxay inputdevice_update_tablet_params(); } - void getgfxoffset (float *dx, float *dy, float*, float*); static void inputdevice_mh_abs (int x, int y, uae_u32 buttonbits) diff --git a/main.cpp b/main.cpp index ef1049b5..5ad0e945 100644 --- a/main.cpp +++ b/main.cpp @@ -310,7 +310,7 @@ void fixup_cpu (struct uae_prefs *p) if (p->cpu_cycle_exact) p->cpu_compatible = true; - if (cpuboard_memorytype(p) == BOARD_MEMORY_BLIZZARD && !p->comptrustbyte) { + if (p->cpuboard_type && cpuboard_jitdirectompatible(p) && !p->comptrustbyte) { error_log(_T("JIT direct is not compatible with emulated Blizzard accelerator boards.")); p->comptrustbyte = 1; p->comptrustlong = 1; @@ -333,10 +333,16 @@ void fixup_prefs (struct uae_prefs *p) built_in_chipset_prefs (p); fixup_cpu (p); - if (cpuboard_memorytype(p) == BOARD_MEMORY_HIGHMEM) + + if (p->cpuboard_type && p->cpuboardmem1_size > cpuboard_maxmemory(p)) { + error_log(_T("Unsupported accelerator board memory size %d (0x%x).\n"), p->cpuboardmem1_size, p->cpuboardmem1_size); + p->cpuboardmem1_size = cpuboard_maxmemory(p); + } + if (cpuboard_memorytype(p) == BOARD_MEMORY_HIGHMEM) { p->mbresmem_high_size = p->cpuboardmem1_size; - else if (cpuboard_memorytype(p) == BOARD_MEMORY_Z2) + } else if (cpuboard_memorytype(p) == BOARD_MEMORY_Z2) { p->fastmem_size = p->cpuboardmem1_size; + } if (((p->chipmem_size & (p->chipmem_size - 1)) != 0 && p->chipmem_size != 0x180000) || p->chipmem_size < 0x20000 diff --git a/memory.cpp b/memory.cpp index 0a9ec0bc..a519ac80 100644 --- a/memory.cpp +++ b/memory.cpp @@ -1046,8 +1046,9 @@ int REGPARAM2 default_check (uaecptr a, uae_u32 b) static int be_cnt; -uae_u8 *REGPARAM2 default_xlate (uaecptr a) +uae_u8 *REGPARAM2 default_xlate (uaecptr addr) { + int size = currprefs.cpu_model >= 68020 ? 4 : 2; if (quit_program == 0) { /* do this only in 68010+ mode, there are some tricky A500 programs.. */ if ((currprefs.cpu_model > 68000 || !currprefs.cpu_compatible) && !currprefs.mmu_model) { @@ -1056,9 +1057,9 @@ uae_u8 *REGPARAM2 default_xlate (uaecptr a) #endif if (be_cnt < 3) { int i, j; - uaecptr a2 = a - 32; + uaecptr a2 = addr - 32; uaecptr a3 = m68k_getpc () - 32; - write_log (_T("Your Amiga program just did something terribly stupid %08X PC=%08X\n"), a, M68K_GETPC); + write_log (_T("Your Amiga program just did something terribly stupid %08X PC=%08X\n"), addr, M68K_GETPC); if (debugging || DEBUG_STUPID) { activate_debugger (); m68k_dumpstate (0); @@ -1073,15 +1074,10 @@ uae_u8 *REGPARAM2 default_xlate (uaecptr a) } memory_map_dump (); } - be_cnt++; - if (regs.s || be_cnt > 1000) { - cpu_halt (3); - be_cnt = 0; + if (0 || (gary_toenb && (gary_nonrange(addr) || (size > 1 && gary_nonrange(addr + size - 1))))) { + exception2 (addr, false, size, regs.s ? 4 : 0); } else { - regs.panic = 4; - regs.panic_pc = m68k_getpc (); - regs.panic_addr = a; - set_special (SPCFLAG_BRK); + cpu_halt(3); } } } @@ -2332,10 +2328,11 @@ void memory_reset (void) } #endif #ifdef CDTV - if (currprefs.cs_cdtvcr) + if (currprefs.cs_cdtvcr) { map_banks(&cdtvcr_bank, 0xB8, 1, 0); - if (currprefs.cs_cdtvcd) + } else if (currprefs.cs_cdtvcd) { cdtv_check_banks (); + } #endif #ifdef A2091 if (currprefs.cs_mbdmac == 1) diff --git a/newcpu.cpp b/newcpu.cpp index 08e9fb37..1779d50e 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -1837,6 +1837,29 @@ STATIC_INLINE int in_rtarea (uaecptr pc) return (munge24 (pc) & 0xFFFF0000) == rtarea_base && uae_boot_rom; } +STATIC_INLINE void wait_memory_cycles (void) +{ + if (regs.memory_waitstate_cycles) { + x_do_cycles(regs.memory_waitstate_cycles); + regs.memory_waitstate_cycles = 0; + } + if (regs.ce020extracycles >= 16) { + regs.ce020extracycles = 0; + x_do_cycles(4 * CYCLE_UNIT); + } +} + +STATIC_INLINE int adjust_cycles (int cycles) +{ + int mc = regs.memory_waitstate_cycles; + regs.memory_waitstate_cycles = 0; + if (currprefs.m68k_speed < 0 || cycles_mult == 0) + return cycles + mc; + cpu_cycles *= cycles_mult; + cpu_cycles /= CYCLES_DIV; + return cpu_cycles + mc; +} + void REGPARAM2 MakeSR (void) { regs.sr = ((regs.t1 << 15) | (regs.t0 << 14) @@ -2429,6 +2452,39 @@ static void Exception_mmu (int nr, uaecptr oldpc) exception_trace (nr); } +static void add_approximate_exception_cycles(int nr) +{ + int cycles; + + if (currprefs.cpu_model > 68000) + return; + if (nr >= 24 && nr <= 31) { + /* Interrupts */ + cycles = 44 + 4; + } else if (nr >= 32 && nr <= 47) { + /* Trap (total is 34, but cpuemux.c already adds 4) */ + cycles = 34 -4; + } else { + switch (nr) + { + case 2: cycles = 50; break; /* Bus error */ + case 3: cycles = 50; break; /* Address error */ + case 4: cycles = 34; break; /* Illegal instruction */ + case 5: cycles = 38; break; /* Division by zero */ + case 6: cycles = 40; break; /* CHK */ + case 7: cycles = 34; break; /* TRAPV */ + case 8: cycles = 34; break; /* Privilege violation */ + case 9: cycles = 34; break; /* Trace */ + case 10: cycles = 34; break; /* Line-A */ + case 11: cycles = 34; break; /* Line-F */ + default: + cycles = 4; + break; + } + } + cycles = adjust_cycles(cycles * CYCLE_UNIT / 2); + x_do_cycles(cycles); +} static void Exception_normal (int nr) { @@ -2588,6 +2644,7 @@ static void Exception_normal (int nr) x_put_word (m68k_areg (regs, 7), nr * 4); } } else { + add_approximate_exception_cycles(nr); currpc = m68k_getpc (); if (nr == 2 || nr == 3) { // 68000 address error @@ -2731,10 +2788,10 @@ static void m68k_reset2(bool hardreset) set_special(SPCFLAG_CHECK); } #endif + regs.s = 1; v = get_long (4); m68k_areg (regs, 7) = get_long (0); m68k_setpc_normal(v); - regs.s = 1; regs.m = 0; regs.stopped = 0; regs.t1 = 0; @@ -3628,29 +3685,6 @@ static void out_cd32io (uae_u32 pc) #endif -STATIC_INLINE void wait_memory_cycles (void) -{ - if (regs.memory_waitstate_cycles) { - x_do_cycles(regs.memory_waitstate_cycles); - regs.memory_waitstate_cycles = 0; - } - if (regs.ce020extracycles >= 16) { - regs.ce020extracycles = 0; - x_do_cycles(4 * CYCLE_UNIT); - } -} - -STATIC_INLINE int adjust_cycles (int cycles) -{ - int mc = regs.memory_waitstate_cycles; - regs.memory_waitstate_cycles = 0; - if (currprefs.m68k_speed < 0 || cycles_mult == 0) - return cycles + mc; - cpu_cycles *= cycles_mult; - cpu_cycles /= CYCLES_DIV; - return cpu_cycles + mc; -} - static void bus_error(void) { TRY (prb2) { @@ -4000,6 +4034,8 @@ static void opcodedebug (uae_u32 pc, uae_u16 opcode, bool full) void cpu_halt (int id) { + // id < 0: m68k halted, PPC active. + // id > 0: emulation halted. if (!regs.halted) { write_log (_T("CPU halted: reason = %d\n"), id); regs.halted = id; @@ -4667,22 +4703,6 @@ void m68k_go (int may_quit) if (debugging) debug (); #endif - if (regs.panic) { - regs.panic = 0; - /* program jumped to non-existing memory and cpu was >= 68020 */ - get_real_address (regs.isp); /* stack in no one's land? -> halt */ - if (regs.isp & 1) - regs.panic = 5; - if (!regs.panic) - exception2_handle (regs.panic_pc, regs.panic_addr); - if (regs.panic) { - int id = regs.panic; - /* system is very badly confused */ - regs.panic = 0; - cpu_halt (id); - } - } - if (regs.spcflags & SPCFLAG_MODE_CHANGE) { if (cpu_prefs_changed_flag & 1) { uaecptr pc = m68k_getpc(); @@ -6105,22 +6125,6 @@ void exception2 (uaecptr addr, bool read, int size, uae_u32 fc) } } -void exception2_fake (uaecptr addr) -{ - if (regs.halted) - return; - write_log (_T("delayed exception2!\n")); - regs.panic_pc = m68k_getpc (); - regs.panic_addr = addr; - regs.panic = 6; - set_special (SPCFLAG_BRK); - m68k_setpc_normal (0xf80000); -#ifdef JIT - set_special (SPCFLAG_END_COMPILE); -#endif - fill_prefetch (); -} - void cpureset (void) { /* RESET hasn't increased PC yet, 1 word offset */ @@ -6151,7 +6155,7 @@ void cpureset (void) uae_u32 addr = m68k_areg (regs, reg); if (addr < 0x80000) addr += 0xf80000; - write_log (_T("reset/jmp (ax) combination emulated -> %x\n"), addr); + write_log (_T("reset/jmp (ax) combination at %08x emulated -> %x\n"), pc, addr); m68k_setpc_normal (addr - 2); return; } diff --git a/od-win32/dinput.cpp b/od-win32/dinput.cpp index 9a4f84e6..6b83e8fe 100644 --- a/od-win32/dinput.cpp +++ b/od-win32/dinput.cpp @@ -711,7 +711,7 @@ static int gettabletres (AXIS *a) void *open_tablet (HWND hwnd) { static int initialized; - LOGCONTEXT lc; + LOGCONTEXT lc = { 0 }; AXIS tx = { 0 }, ty = { 0 }, tz = { 0 }; AXIS pres = { 0 }; int xm, ym, zm; @@ -819,7 +819,18 @@ static int initialize_tablet (void) return 0; } name[0] = 0; - pWTInfoW (WTI_DEVICES, DVC_NAME, name); + if (!pWTInfoW (WTI_DEVICES, DVC_NAME, name)) { + write_log(_T("Tablet: WTInfo(DVC_NAME) returned failure\n")); + FreeModule(wintab); + wintab = NULL; + return 0; + } + if (name[0] == 0) { + write_log(_T("Tablet: WTInfo(DVC_NAME) returned NULL name\n")); + FreeModule(wintab); + wintab = NULL; + return 0; + } axmax = aymax = azmax = -1; tilt = pWTInfoW (WTI_DEVICES, DVC_ORIENTATION, ori); if (tilt) { diff --git a/od-win32/mman.cpp b/od-win32/mman.cpp index c8a206eb..909485b6 100644 --- a/od-win32/mman.cpp +++ b/od-win32/mman.cpp @@ -346,7 +346,7 @@ static int doinit_shm (void) set_expamem_z3_hack_override(false); z3offset = 0; - if ((changed_prefs.z3autoconfig_start == 0x10000000 || changed_prefs.z3autoconfig_start == 0x40000000) && !changed_prefs.force_0x10000000_z3 && cpuboard_memorytype(&changed_prefs) != BOARD_MEMORY_BLIZZARD) { + if ((changed_prefs.z3autoconfig_start == 0x10000000 || changed_prefs.z3autoconfig_start == 0x40000000) && !changed_prefs.force_0x10000000_z3 && cpuboard_memorytype(&changed_prefs) != BOARD_MEMORY_BLIZZARD_12xx) { if (1 && natmem_size > 0x40000000 && natmem_size - 0x40000000 >= (totalsize - 0x10000000 - ((changed_prefs.z3chipmem_size + align) & ~align)) && changed_prefs.z3chipmem_size <= 512 * 1024 * 1024) { changed_prefs.z3autoconfig_start = currprefs.z3autoconfig_start = 0x40000000; z3offset += 0x40000000 - 0x10000000 - ((changed_prefs.z3chipmem_size + align) & ~align); @@ -645,6 +645,18 @@ void *shmat (addrbank *ab, int shmid, void *shmaddr, int shmflg) } else if (!_tcscmp(shmids[shmid].name, _T("ramsey_high"))) { shmaddr = natmem_offset + 0x08000000; got = TRUE; + } else if (!_tcscmp(shmids[shmid].name, _T("blizzard_40"))) { + shmaddr = natmem_offset + 0x40000000; + got = TRUE; + } else if (!_tcscmp(shmids[shmid].name, _T("blizzard_48"))) { + shmaddr = natmem_offset + 0x48000000; + got = TRUE; + } else if (!_tcscmp(shmids[shmid].name, _T("blizzard_68"))) { + shmaddr = natmem_offset + 0x68000000; + got = TRUE; + } else if (!_tcscmp(shmids[shmid].name, _T("blizzard_70"))) { + shmaddr = natmem_offset + 0x70000000; + got = TRUE; } else if (!_tcscmp(shmids[shmid].name, _T("cyberstorm"))) { shmaddr = natmem_offset + 0x0c000000; got = TRUE; diff --git a/od-win32/resources/resource.h b/od-win32/resources/resource.h index f24134c9..a70a54d0 100644 --- a/od-win32/resources/resource.h +++ b/od-win32/resources/resource.h @@ -407,7 +407,6 @@ #define IDS_QS_MODEL_A3000 1010 #define IDS_QS_MODEL_A4000 1011 #define IDS_QS_MODEL_A4000T 1012 -#define IDS_QS_MODEL_CDTVCR 1013 #define IDC_RESOLUTION 1021 #define IDC_SERIAL 1022 #define IDC_REFRESHRATE 1022 @@ -1068,6 +1067,8 @@ #define IDC_DBG_AMEM 1745 #define IDC_CS_DIPAGNUS 1745 #define IDC_DBG_SP_VBR 1746 +#define IDC_CS_CDTVRAMEXP2 1746 +#define IDC_CS_CDTVCR 1746 #define IDC_DBG_MMISC 1747 #define IDC_DBG_PC 1748 #define IDC_DBG_PREFETCH 1749 diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index 9839c161..fbb4b545 100644 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -726,9 +726,9 @@ BEGIN CONTROL "DF0: ID Hardware",IDC_CS_DF0IDHW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,102,125,11 CONTROL "CD32 NVRAM",IDC_CS_CD32NVRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,116,125,11 CONTROL "CDTV SRAM Expansion",IDC_CS_CDTVRAMEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,129,125,11 - CONTROL "PCMCIA",IDC_CS_PCMCIA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,143,125,11 - CONTROL "C00000 is Fast RAM",IDC_CS_SLOWISFAST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,157,125,11 - CONTROL "A1000 Agnus (8361/8367)",IDC_CS_DIPAGNUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,171,125,11 + CONTROL "PCMCIA",IDC_CS_PCMCIA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,156,125,11 + CONTROL "C00000 is Fast RAM",IDC_CS_SLOWISFAST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,170,125,11 + CONTROL "A1000 Agnus (8361/8367)",IDC_CS_DIPAGNUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,184,125,11 GROUPBOX "Internal SCSI Hardware",IDC_STATIC,0,201,393,45 CONTROL "A3000 WD33C93 SCSI",IDC_CS_DMAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,216,121,11 CONTROL "CDTV WD33C93 SCSI",IDC_CS_CDTVSCSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,34,229,121,11 @@ -743,6 +743,7 @@ BEGIN EDITTEXT IDC_CS_AGNUSREV,311,260,45,13,ES_AUTOHSCROLL EDITTEXT IDC_CS_DENISEREV,311,275,45,13,ES_AUTOHSCROLL CONTROL "Z3 Autoconfig",IDC_CS_Z3AUTOCONFIG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,127,184,104,11 + CONTROL "CDTV-CR",IDC_CS_CDTVCR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,264,143,123,11 END IDD_AVIOUTPUT DIALOGEX 0, 0, 396, 260 @@ -1826,14 +1827,14 @@ END STRINGTABLE BEGIN - IDS_QS_MODELS "A500\nA500+\nA600\nA1000\nA1200\nA3000\nA4000\nCD32\nCDTV\nCDTV-CR\nArcadia Multi Select system\nExpanded WinUAE example configuration" + IDS_QS_MODELS "A500\nA500+\nA600\nA1000\nA1200\nA3000\nA4000\nCD32\nCDTV\nArcadia Multi Select system\nExpanded WinUAE example configuration" IDS_QS_MODEL_A500 "1.3 ROM, OCS, 512 KB Chip + 512 KB Slow RAM (most common)\nThis configuration is capable of running most games and demos produced for first-generation hardware. Only few exceptions need a different configuration (e.g. the oldest games tend to be incompatible with this configuration).\n1.3 ROM, ECS Agnus, 512 KB Chip RAM + 512 KB Slow RAM\nLater hardware revision of the A500. Nearly 100% compatible with the previous configuration.\n1.3 ROM, ECS Agnus, 1 MB Chip RAM\nFew newer games and demos require this configuration.\n1.3 ROM, OCS Agnus, 512 KB Chip RAM\nVery old (e.g. pre-1988) games and demos may require this configuration.\n1.2 ROM, OCS Agnus, 512 KB Chip RAM\nAs available for the A1000, and installed on the first A500 and A2000 series. Some very old programs only work correctly with this configuration. Note: This system ROM version can only boot from floppy disk (no hard disk boot support).\n1.2 ROM, OCS Agnus, 512 KB Chip RAM + 512 KB Slow RAM\nThis configuration adds expansion memory to the first A500 produced. Try this if your game does not work with newer configurations, but works with the previous one. It could add some features to the game, including faster loading times. Note: This system ROM version can only boot from floppy disk (no hard disk boot support)." IDS_QS_MODEL_A500P "Basic non-expanded configuration\nThe A500+ adds an ECS Agnus chip, 1 MB of Chip RAM and a 2.0 ROM to the A500. Many A500 games and demos don't work properly on an A500+.\n2 MB Chip RAM expanded configuration\n\n4 MB Fast RAM expanded configuration\n" IDS_QS_MODEL_A600 "Basic non-expanded configuration\nThe A600 is smaller than the A500+ and has an updated 2.0 ROM.\n2 MB Chip RAM expanded configuration\n\n4 MB Fast RAM expanded configuration\n" IDS_QS_MODEL_A1000 "512 KB Chip RAM\nThe A1000 was the first model produced, with a configuration equivalent to that of an A500 with OCS chipset. You normally don't need to use this configuration, unless you are nostalgic and would like to hear the short A1000 boot tune\n""ICS"" Denise without EHB support\nVery first A1000 models had Denise without EHB capability.\n256 KB Chip RAM\n Unexpanded A1000. All later A1000 models were sold with a 256 KB RAM expansion built-in." IDS_QS_MODEL_A1200 "Basic non-expanded configuration\nUse this configuration to run most AGA demos and games\n4 MB Fast RAM expanded configuration\nSome newer AGA games and demos need an expanded A1200 to run." IDS_QS_MODEL_CD32 "CD32\nThe CD32 was one the first 32-bit consoles on the market. It is basically an A1200 with a built-in CD-ROM drive. Insert your CD32 or CDTV CD-ROM into a free CD-ROM drive before starting the emulation.\nCD32 with Full Motion Video cartridge\n" - IDS_QS_MODEL_CDTV "CDTV\nThe CDTV was the first model with a built-in CD-ROM drive. Looking like a black CD player, it featured a configuration equivalent to that of an A500 with 1 MB RAM and an ECS chipset.\nFloppy drive and 64KB SRAM card expanded CDTV\n" + IDS_QS_MODEL_CDTV "CDTV\nThe CDTV was the first model with a built-in CD-ROM drive. Looking like a black CD player, it featured a configuration equivalent to that of an A500 with 1 MB RAM and an ECS chipset.\nFloppy drive and 64KB SRAM card expanded CDTV\n\nCDTV-CR\n" END STRINGTABLE @@ -1843,7 +1844,6 @@ BEGIN IDS_QS_MODEL_A3000 "1.4 ROM, 2MB Chip + 8MB Fast\n\n2.04 ROM, 2MB Chip + 8MB Fast\n\n3.1 ROM, 2MB Chip + 8MB Fast\n" IDS_QS_MODEL_A4000 "68030, 3.1 ROM, 2MB Chip + 8MB Fast\n\n68040, 3.1 ROM, 2MB Chip + 8MB Fast\n" IDS_QS_MODEL_A4000T "A4000T (test)\nA4000T" - IDS_QS_MODEL_CDTVCR "CDTV-CR\nCDTV-CR" END STRINGTABLE diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index 9420f25b..3b4edc31 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -5917,7 +5917,7 @@ LONG WINAPI WIN32_ExceptionFilter (struct _EXCEPTION_POINTERS *pExceptionPointer prevpc = (uae_u8*)ppc; } m68k_setpc ((uaecptr)p); - exception2_fake (opc); + exception2(opc, er->ExceptionInformation[0] == 0, 4, regs.s ? 4 : 0); lRet = EXCEPTION_CONTINUE_EXECUTION; } } diff --git a/od-win32/win32.h b/od-win32/win32.h index c99962bf..8351a1fd 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("20") +#define WINUAEBETA _T("21") #else #define WINUAEBETA _T("") #endif -#define WINUAEDATE MAKEBD(2014, 10, 12) +#define WINUAEDATE MAKEBD(2014, 10, 19) //#define WINUAEEXTRA _T("AmiKit Preview") //#define WINUAEEXTRA _T("Amiga Forever Edition") diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index 4c334979..f86ae0a8 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -213,6 +213,7 @@ void WIN32GUI_LoadUIString (DWORD id, TCHAR *string, DWORD dwStringLen) } static int quickstart_model = 0, quickstart_conf = 0, quickstart_compa = 1; +static int quickstart_model_confstore[16]; static int quickstart_floppy = 1, quickstart_cd = 0, quickstart_ntsc = 0; static int quickstart_cdtype = 0; static TCHAR quickstart_cddrive[16]; @@ -1315,6 +1316,7 @@ static int msi_fast[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; static int msi_z3fast[] = { 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 19, 14, 20, 15, 21, 18, 22, 23 }; static int msi_z3chip[] = { 0, 9, 10, 11, 12, 13, 19, 14, 20, 15 }; static int msi_gfx[] = { 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; +static int msi_cpuboard[] = { 0, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; #define MIN_CHIP_MEM 0 #define MAX_CHIP_MEM 6 @@ -1332,7 +1334,9 @@ static int msi_gfx[] = { 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; #define MAX_MBL_MEM 7 #define MAX_MBH_MEM 8 #define MIN_CB_MEM 0 -#define MAX_CB_MEM 8 +#define MAX_CB_MEM_Z2 4 +#define MAX_CB_MEM_128M 8 +#define MAX_CB_MEM_256M 9 #define MIN_M68K_PRIORITY 1 #define MAX_M68K_PRIORITY 16 @@ -1644,7 +1648,7 @@ static void show_rom_list (void) 17, -1, -1, // A4000T 18, -1, 19, -1, -1, // CD32 20, 21, 22, -1, 6, 32, -1, -1, // CDTV - 9, 10, -1, 107, -1, -1, // CDTV-CR + 9, 10, -1, 107, 108, -1, -1, // CDTV-CR 49, 50, 75, 51, 76, 77, -1, 5, 4, -1, -2, // ARCADIA 53, 54, 55, 56, -1, -1, // A590/A2091 @@ -5557,7 +5561,6 @@ static struct amigamodels amodels[] = { { 0, }, //{ 1, IDS_QS_MODEL_A4000T }, // "Amiga 4000T" { 3, IDS_QS_MODEL_CD32 }, // "CD32" { 4, IDS_QS_MODEL_CDTV }, // "CDTV" - { 4, IDS_QS_MODEL_CDTVCR }, // "CDTVCR" { 4, IDS_QS_MODEL_ARCADIA }, // "Arcadia" { 1, IDS_QS_MODEL_UAE }, // "Expanded UAE example configuration" { -1 } @@ -5576,7 +5579,7 @@ static void load_quickstart (HWND hDlg, int romcheck) workprefs.nr_floppies = quickstart_floppy; quickstart_ok = built_in_prefs (&workprefs, quickstart_model, quickstart_conf, quickstart_compa, romcheck); workprefs.ntscmode = quickstart_ntsc != 0; - quickstart_cd = workprefs.floppyslots[1].dfxtype == DRV_NONE && (quickstart_model == 8 || quickstart_model == 9 || quickstart_model == 10); + quickstart_cd = workprefs.floppyslots[1].dfxtype == DRV_NONE && (quickstart_model == 8 || quickstart_model == 9); enable_for_quickstart (hDlg); addfloppytype (hDlg, 0); addfloppytype (hDlg, 1); @@ -5624,6 +5627,7 @@ static void init_quickstartdlg (HWND hDlg) if (firsttime == 0 && workprefs.start_gui) { regqueryint (NULL, _T("QuickStartModel"), &quickstart_model); regqueryint (NULL, _T("QuickStartConfiguration"), &quickstart_conf); + quickstart_model_confstore[quickstart_model] = quickstart_conf; regqueryint (NULL, _T("QuickStartCompatibility"), &quickstart_compa); regqueryint (NULL, _T("QuickStartFloppies"), &quickstart_floppy); regqueryint (NULL, _T("QuickStartCDType"), &quickstart_cdtype); @@ -5905,6 +5909,7 @@ static INT_PTR CALLBACK QuickstartDlgProc (HWND hDlg, UINT msg, WPARAM wParam, L } if (i != quickstart_model) { quickstart_model = i; + quickstart_conf = quickstart_model_confstore[quickstart_model]; init_quickstartdlg (hDlg); if (quickstart) load_quickstart (hDlg, 1); @@ -5917,6 +5922,7 @@ static INT_PTR CALLBACK QuickstartDlgProc (HWND hDlg, UINT msg, WPARAM wParam, L val = SendDlgItemMessage (hDlg, IDC_QUICKSTART_CONFIGURATION, CB_GETCURSEL, 0, 0L); if (val != CB_ERR && val != quickstart_conf) { quickstart_conf = val; + quickstart_model_confstore[quickstart_model] = quickstart_conf; init_quickstartdlg (hDlg); if (quickstart) load_quickstart (hDlg, 1); @@ -7195,6 +7201,7 @@ static void values_to_chipsetdlg2 (HWND hDlg) CheckDlgButton (hDlg, IDC_CS_CD32C2P, workprefs.cs_cd32c2p); CheckDlgButton (hDlg, IDC_CS_CD32NVRAM, workprefs.cs_cd32nvram); CheckDlgButton (hDlg, IDC_CS_CDTVCD, workprefs.cs_cdtvcd); + CheckDlgButton (hDlg, IDC_CS_CDTVCR, workprefs.cs_cdtvcr); CheckDlgButton (hDlg, IDC_CS_CDTVRAM, workprefs.cs_cdtvram); CheckDlgButton (hDlg, IDC_CS_CDTVRAMEXP, workprefs.cs_cdtvcard); CheckDlgButton (hDlg, IDC_CS_A1000RAM, workprefs.cs_a1000ram); @@ -7271,6 +7278,7 @@ static void values_from_chipsetdlg2 (HWND hDlg, UINT msg, WPARAM wParam, LPARAM workprefs.cs_cd32c2p = ischecked (hDlg, IDC_CS_CD32C2P); workprefs.cs_cd32nvram = ischecked (hDlg, IDC_CS_CD32NVRAM); workprefs.cs_cdtvcd = ischecked (hDlg, IDC_CS_CDTVCD); + workprefs.cs_cdtvcr = ischecked (hDlg, IDC_CS_CDTVCR); workprefs.cs_cdtvram = ischecked (hDlg, IDC_CS_CDTVRAM); workprefs.cs_cdtvcard = ischecked (hDlg, IDC_CS_CDTVRAMEXP) ? 64 : 0; workprefs.cs_a1000ram = ischecked (hDlg, IDC_CS_A1000RAM); @@ -7347,6 +7355,7 @@ static void enable_for_chipsetdlg2 (HWND hDlg) ew (hDlg, IDC_CS_CD32NVRAM, e); ew (hDlg, IDC_CS_CD32C2P, e); ew (hDlg, IDC_CS_CDTVCD, e); + ew (hDlg, IDC_CS_CDTVCR, e); ew (hDlg, IDC_CS_CDTVRAM, e); ew (hDlg, IDC_CS_CDTVRAMEXP, e); ew (hDlg, IDC_CS_RESETWARNING, e); @@ -7457,6 +7466,36 @@ static void setmax32bitram (HWND hDlg) SetDlgItemText (hDlg, IDC_MAX32RAM, tmp); } +static void setcpuboardmemsize(HWND hDlg) +{ + int maxmem = cpuboard_maxmemory(&workprefs); + if (workprefs.cpuboardmem1_size > maxmem) { + workprefs.cpuboardmem1_size = maxmem; + } + if (maxmem <= 8 * 1024 * 1024) + SendDlgItemMessage (hDlg, IDC_CPUBOARDMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_CB_MEM, MAX_CB_MEM_Z2)); + else if (maxmem <= 128 * 1024 * 1024) + SendDlgItemMessage (hDlg, IDC_CPUBOARDMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_CB_MEM, MAX_CB_MEM_128M)); + else + SendDlgItemMessage (hDlg, IDC_CPUBOARDMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_CB_MEM, MAX_CB_MEM_256M)); + + int mem_size = 0; + switch (workprefs.cpuboardmem1_size) { + case 0x00000000: mem_size = 0; break; + case 0x00100000: mem_size = 1; break; + case 0x00200000: mem_size = 2; break; + case 0x00400000: mem_size = 3; break; + case 0x00800000: mem_size = 4; break; + case 0x01000000: mem_size = 5; break; + case 0x02000000: mem_size = 6; break; + case 0x04000000: mem_size = 7; break; + case 0x08000000: mem_size = 8; break; + case 0x10000000: mem_size = 9; break; + } + SendDlgItemMessage (hDlg, IDC_CPUBOARDMEM, TBM_SETPOS, TRUE, mem_size); + SetDlgItemText (hDlg, IDC_CPUBOARDRAM, memsize_names[msi_cpuboard[mem_size]]); + SendDlgItemMessage (hDlg, IDC_CPUBOARD_TYPE, CB_SETCURSEL, workprefs.cpuboard_type, 0); +} static int manybits (int v, int mask) { @@ -7489,9 +7528,10 @@ static void values_to_memorydlg (HWND hDlg) SendDlgItemMessage (hDlg, IDC_CHIPMEM, TBM_SETPOS, TRUE, mem_size); SetDlgItemText (hDlg, IDC_CHIPRAM, memsize_names[msi_chip[mem_size]]); + if (workprefs.cpuboardmem1_size > cpuboard_maxmemory(&workprefs)) + workprefs.cpuboardmem1_size = cpuboard_maxmemory(&workprefs); + if (cpuboard_memorytype(&workprefs) == BOARD_MEMORY_Z2) { - if (workprefs.cpuboardmem1_size > 8 * 1024 * 1024) - workprefs.cpuboardmem1_size = 8 * 1024 * 1024; workprefs.fastmem_size = workprefs.cpuboardmem1_size; } @@ -7746,23 +7786,7 @@ static void values_to_memorydlg (HWND hDlg) SendDlgItemMessage (hDlg, IDC_MBMEM2, TBM_SETPOS, TRUE, mem_size); SetDlgItemText (hDlg, IDC_MBRAM2, memsize_names[msi_gfx[mem_size]]); - mem_size = 0; - switch (workprefs.cpuboardmem1_size) { - case 0x00000000: mem_size = 0; break; - case 0x00100000: mem_size = 1; break; - case 0x00200000: mem_size = 2; break; - case 0x00400000: mem_size = 3; break; - case 0x00800000: mem_size = 4; break; - case 0x01000000: mem_size = 5; break; - case 0x02000000: mem_size = 6; break; - case 0x04000000: mem_size = 7; break; - case 0x08000000: mem_size = 8; break; - case 0x10000000: mem_size = 9; break; - } - SendDlgItemMessage (hDlg, IDC_CPUBOARDMEM, TBM_SETPOS, TRUE, mem_size); - SetDlgItemText (hDlg, IDC_CPUBOARDRAM, memsize_names[msi_gfx[mem_size]]); - SendDlgItemMessage (hDlg, IDC_CPUBOARD_TYPE, CB_SETCURSEL, workprefs.cpuboard_type, 0); - + setcpuboardmemsize(hDlg); setmax32bitram (hDlg); } @@ -8217,7 +8241,6 @@ static INT_PTR CALLBACK ExpansionDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LP return FALSE; } - static INT_PTR CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static int recursive = 0; @@ -8236,7 +8259,6 @@ static INT_PTR CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARA SendDlgItemMessage (hDlg, IDC_Z3CHIPMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_Z3_MEM, MAX_Z3_CHIPMEM)); SendDlgItemMessage (hDlg, IDC_MBMEM1, TBM_SETRANGE, TRUE, MAKELONG (MIN_MB_MEM, MAX_MBL_MEM)); SendDlgItemMessage (hDlg, IDC_MBMEM2, TBM_SETRANGE, TRUE, MAKELONG (MIN_MB_MEM, MAX_MBH_MEM)); - SendDlgItemMessage (hDlg, IDC_CPUBOARDMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_CB_MEM, MAX_CB_MEM)); CheckDlgButton(hDlg, IDC_FASTMEMAUTOCONFIG, workprefs.fastmem_autoconfig); CheckDlgButton(hDlg, IDC_Z3REALMAPPING, workprefs.jit_direct_compatible_memory); SendDlgItemMessage (hDlg, IDC_CPUBOARD_TYPE, CB_RESETCONTENT, 0, 0); @@ -8254,6 +8276,7 @@ static INT_PTR CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARA SendDlgItemMessage(hDlg, IDC_CPUBOARD_TYPE, CB_ADDSTRING, 0, (LPARAM)_T("Warp Engine")); SendDlgItemMessage(hDlg, IDC_CPUBOARD_TYPE, CB_ADDSTRING, 0, (LPARAM)_T("Tek Magic")); SendDlgItemMessage(hDlg, IDC_CPUBOARD_TYPE, CB_ADDSTRING, 0, (LPARAM)_T("A2620/A2630")); + setcpuboardmemsize(hDlg); case WM_USER: workprefs.fastmem_autoconfig = ischecked (hDlg, IDC_FASTMEMAUTOCONFIG); @@ -8279,6 +8302,7 @@ static INT_PTR CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARA workprefs.ppc_mode = 0; } built_in_cpuboard_prefs(&workprefs); + setcpuboardmemsize(hDlg); enable_for_memorydlg(hDlg); } break; @@ -8299,7 +8323,7 @@ static INT_PTR CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARA workprefs.z3chipmem_size = memsizes[msi_z3chip[SendMessage (GetDlgItem (hDlg, IDC_Z3CHIPMEM), TBM_GETPOS, 0, 0)]]; workprefs.mbresmem_low_size = memsizes[msi_gfx[SendMessage (GetDlgItem (hDlg, IDC_MBMEM1), TBM_GETPOS, 0, 0)]]; workprefs.mbresmem_high_size = memsizes[msi_gfx[SendMessage (GetDlgItem (hDlg, IDC_MBMEM2), TBM_GETPOS, 0, 0)]]; - workprefs.cpuboardmem1_size = memsizes[msi_gfx[SendMessage (GetDlgItem (hDlg, IDC_CPUBOARDMEM), TBM_GETPOS, 0, 0)]]; + workprefs.cpuboardmem1_size = memsizes[msi_cpuboard[SendMessage (GetDlgItem (hDlg, IDC_CPUBOARDMEM), TBM_GETPOS, 0, 0)]]; fix_values_memorydlg (); values_to_memorydlg (hDlg); enable_for_memorydlg (hDlg); diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 0a2828a8..3d9d0926 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -18,6 +18,24 @@ Things that may happen in 2015: - restore only single input target to default. +Beta 21: + +- Moved CDTV-CR under original CDTV Quickstart option. +- Added 3.44 CDTV-CR extended ROM. +- CDTV-CR now boots CDTV CDs. CD audio player does not yet work and some games that play CD audio will hang. + Also CD reading speed is currently unlimited. +- Added 256M (max possible) Blizzard accelerator board RAM size support. Works with 1230, 1260 and PPC. +- CSPPC P5_SELF_RESET bit emulation fixed, M68K can only reset PPC and PPC can only reset M68K if + P5_SELF_RESET is not active. (Blizkick reset hang) +- When switching quickstart modes, extended ROM was not reset if new mode didn't use extended ROM. +- Switching Quickstart models now remembers previously selected model configuration setting. +- Disable tablet mode if tablet name query returns error or empty name. WTInfo() with null parameters is + supposed to return error if tablet is not connected but it does not seem to be true with all drivers. + (Fixes division by zero guru at boot if tablet emulation is emulated) +- default_xlate() system halt didn't work, broke probably when 1 second boot delay option was added. +- default_xlate() now also generates bus error if Gary bus error bit is set instead of halting. +- Include approximate exception startup time in non-cycle exact 68000 emulation modes. + Beta 20: - A2630 rom was not unmapped completely (only first half) diff --git a/ppc/ppc.cpp b/ppc/ppc.cpp index 1a8d885a..60586a46 100644 --- a/ppc/ppc.cpp +++ b/ppc/ppc.cpp @@ -477,6 +477,13 @@ static void set_and_wait_for_state(int state, int unlock) } } +bool uae_self_is_ppc(void) +{ + if (ppc_state == PPC_STATE_INACTIVE) + return false; + return impl.in_cpu_thread(); +} + void ppc_map_banks(uae_u32 start, uae_u32 size, const TCHAR *name, void *addr, bool remove) { if (ppc_state == PPC_STATE_INACTIVE || !impl.map_memory) diff --git a/rommgr.cpp b/rommgr.cpp index 0f7be49c..831b7ff1 100644 --- a/rommgr.cpp +++ b/rommgr.cpp @@ -93,7 +93,7 @@ struct romdata *getromdatabypath (const TCHAR *path) return NULL; } -#define NEXT_ROM_ID 108 +#define NEXT_ROM_ID 109 static struct romheader romheaders[] = { { _T("Freezer Cartridges"), 1 }, @@ -215,6 +215,8 @@ static struct romdata roms[] = { ALTROM(21, 1, 2, 131072, ROMTYPE_ODD | ROMTYPE_8BIT, 0x8a54f362,0x03df800f,0x032046fd,0x892f6e7e,0xec08b76d,0x33981e8c) { _T("CDTV-CR extended ROM v3.32"), 3, 32, 3, 32, _T("CDTVCR\0"), 262144, 107, 0, 0, ROMTYPE_EXTCDTV, 0, 0, NULL, 0x581a85cf, 0xd6b8d3f2,0x854eba9b,0x2d514579,0x9529e8b3,0x3b85e0b4 }, + { _T("CDTV-CR extended ROM v3.44"), 3, 44, 3, 44, _T("CDTVCR\0"), 262144, 108, 0, 0, ROMTYPE_EXTCDTV, 0, 0, NULL, + 0x0b7bd64f, 0x3b160c5a,0xbe79f10a,0xe6924332,0x8004bb9e,0x3162b648 }, { _T("A1000 bootstrap ROM"), 0, 0, 0, 0, _T("A1000\0"), 65536, 24, 0, 0, ROMTYPE_KICK, 0, 0, NULL, 0x0b1ad2d0, 0xBA93B8B8,0x5CA0D83A,0x68225CC3,0x3B95050D,0x72D2FDD7 },