]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
2900b21
authorToni Wilen <twilen@winuae.net>
Sun, 19 Oct 2014 14:26:05 +0000 (17:26 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 19 Oct 2014 14:26:05 +0000 (17:26 +0300)
24 files changed:
cdtv.cpp
cdtvcr.cpp
cfgfile.cpp
cpuboard.cpp
custom.cpp
expansion.cpp
include/cdtvcr.h
include/cpuboard.h
include/newcpu.h
include/uae/ppc.h
inputdevice.cpp
main.cpp
memory.cpp
newcpu.cpp
od-win32/dinput.cpp
od-win32/mman.cpp
od-win32/resources/resource.h
od-win32/resources/winuae.rc
od-win32/win32.cpp
od-win32/win32.h
od-win32/win32gui.cpp
od-win32/winuaechangelog.txt
ppc/ppc.cpp
rommgr.cpp

index e8f4eccb3d58647178267f0228d2835ddf23601d..bdd462dbc3152eda131820ad20f581fba5802d5d 100644 (file)
--- 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 ();
index ba8b36e097e0a634441187f2668dcecf6c549980..6ef507004ba5defa238141e3410d4746b362c2c9 100644 (file)
 #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
 
 #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 ();
 }
index ffa949bfd6d29acf9a43ee7e7559b5ffb1e2f69a..3ccf9dad5dc3b5c3ccc656fa1be7bd35e440bde9 100644 (file)
@@ -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;
        }
index f27c5debee4dab7f29a61dc389ebcb5470e32780..6e9b662ee93d137bc06636710479f51a25840832 100644 (file)
@@ -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
 
 #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);
index 42515b58671b9390630bc7ecd6d9f451bc10dcdb..fed75653273f0c71eb219f81d1a74364385f0b5e 100644 (file)
@@ -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);
 
index 83f56fc4b67bdfe0a11b114caad3ce66594bb353..2bb56df46d7ad9efdcdbb17c0d708698d9e46bd2 100644 (file)
@@ -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;
index dca99fe8f874f3aa9f18fe58ade1ef5d0879bfa6..99f19d843e74957737dbbce4104969cdac1c07c5 100644 (file)
@@ -1,3 +1,7 @@
 
 void cdtvcr_reset(void);
 void cdtvcr_free(void);
+void rethink_cdtvcr(void);
+
+extern void CDTVCR_hsync_handler(void);
+
index 5845668eddb10bdcdf6fe637e82ae91ef878a11e..0a7d650ccbf6399a67aecb9f81d75f0121eb33a3 100644 (file)
@@ -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
index e462332d231c4872aa0236baa688f62d5243bf98..778ff2c62aa7e9ed104c93dcd091005965c3df9b 100644 (file)
@@ -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;
index bcd1ef5b2d6a702b8213d4d5c1edd6dcc80de55d..3c4a93ef155ef2ef6641235bd2c91923a35195bc 100644 (file)
@@ -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);
index 1e03c941bece0c06653b8441ad76d0b4c6da3ec1..6b8ffd597069899673b60a777d4bd0bf5da8e13b 100644 (file)
@@ -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)
index ef1049b50f126c401fb1588d224f433c4061a54d..5ad0e945964ecb970ff729dfe6ef35a2535c014f 100644 (file)
--- 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
index 0a9ec0bcff44a443b0c005e670675d7515601f4f..a519ac80d4088589cbbe8de2ca9b07b4a8deaef8 100644 (file)
@@ -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)
index 08e9fb3760878a86c840697c72be68d659d17254..1779d50e99414caaf097744bd8538ce3105a7393 100644 (file)
@@ -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;
                }
index 9a4f84e65d440086359ed79f3edd6e8e5b0eae8e..6b83e8fe41e60ecc3538d4265317229c43b2fbbc 100644 (file)
@@ -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) {
index c8a206ebd4157603056d4df2d1dbbbbc17984624..909485b6d72cddd84585110adefddcb6d48f575f 100644 (file)
@@ -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;
index f24134c9616f5fea399de01a277c9c300c092fe8..a70a54d07d9799dab6fac5adea05ad845ae5eb1b 100644 (file)
 #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
 #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
index 9839c16175c5114cf255381233e19f884c15032d..fbb4b5458c40acfff80c51644d109e7b9e228cad 100644 (file)
@@ -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
index 9420f25b759d19012a0bf6f262b8a3ca531cdca3..3b4edc31a949c99bd2a474e3be39d8c313d0b389 100644 (file)
@@ -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;
                                        }
                        }
index c99962bf900697229f85c1fc4a9e02e96489135d..8351a1fd1c04adcc4e5b19ff34ff07e0dd866c0f 100644 (file)
 #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")
index 4c3349790f9cb52340e19b134ec85e9ac735f05f..f86ae0a85f6b4d9b02b8675f4a07a8a8ee180b34 100644 (file)
@@ -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);
index 0a2828a8408aefc45588cf6bd7563204e816280a..3d9d0926d996b1945c264a2daea101e7f54d409c 100644 (file)
@@ -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)
index 1a8d885a7b0eea513a64d7a9ad4c85ee53f63e37..60586a46dbe5a29a3b14ae60f777bfa7c9b8cfe5 100644 (file)
@@ -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)
index 0f7be49c5dba043c203d57748defc5c578b50a57..831b7ff111eb9f430b3e4c007fd448a9c9b6d714 100644 (file)
@@ -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 },