]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
imported winuaesrc1420b10.zip
authorToni Wilen <twilen@winuae.net>
Tue, 1 May 2007 11:08:38 +0000 (14:08 +0300)
committerToni Wilen <twilen@winuae.net>
Mon, 22 Feb 2010 19:33:29 +0000 (21:33 +0200)
21 files changed:
blkdev.c
cdtv.c
cia.c
debug.c
disk.c
fpp.c
include/blkdev.h
include/debug.h
include/newcpu.h
newcpu.c
od-win32/blkdev_win32_aspi.c
od-win32/blkdev_win32_ioctl.c
od-win32/blkdev_win32_spti.c
od-win32/debug_win32.c
od-win32/debug_win32.h
od-win32/resources/resource.h
od-win32/resources/winuae.rc
od-win32/win32.c
od-win32/win32.h
od-win32/win32gui_extra.c
od-win32/winuaechangelog.txt

index 8f8aa028fb670e840ba483e4fde46a5cfd02f5cd..d396b894dfc205035692a0902c7d3d1ea0423b81 100755 (executable)
--- a/blkdev.c
+++ b/blkdev.c
@@ -16,7 +16,7 @@
 static struct device_functions *device_func[2];
 static int have_ioctl;
 
-#ifdef WIN32
+#ifdef _WIN32
 
 #include "od-win32/win32.h"
 
@@ -182,6 +182,17 @@ uae_u8 *sys_command_cd_read (int mode, int unitnum, int offset)
     }
     return device_func[DF_IOCTL]->read (unitnum, offset);
 }
+uae_u8 *sys_command_cd_rawread (int mode, int unitnum, int offset, int size)
+{
+    if (mode == DF_SCSI || !have_ioctl) {
+       uae_u8 cmd[12] = { 0xbe, 0, 0, 0, 0, 0, 0, 0, 1, 0x10, 0, 0 };
+       cmd[3] = (uae_u8)(offset >> 16);
+       cmd[4] = (uae_u8)(offset >> 8);
+       cmd[5] = (uae_u8)(offset >> 0);
+       return device_func[DF_SCSI]->exec_in (unitnum, cmd, sizeof (cmd), 0);
+    }
+    return device_func[DF_IOCTL]->rawread (unitnum, offset, size);
+}
 
 /* read block */
 uae_u8 *sys_command_read (int mode, int unitnum, int offset)
diff --git a/cdtv.c b/cdtv.c
index 9f59321ef3e2f756bc77865e93c993a61999c1a3..0cf8ba20d5b99b70b66fe935e28857bcad06c9cd 100755 (executable)
--- a/cdtv.c
+++ b/cdtv.c
@@ -10,7 +10,7 @@
   */
 
 //#define CDTV_DEBUG
-//#define CDTV_DEBUG_CMD
+#define CDTV_DEBUG_CMD
 //#define CDTV_DEBUG_6525
 
 #include "sysconfig.h"
@@ -58,7 +58,7 @@ static volatile int activate_stch, cdrom_command_done, play_state, play_statewai
 static volatile int cdrom_sector, cdrom_sectors, cdrom_length, cdrom_offset;
 static volatile int cd_playing, cd_paused, cd_motor, cd_media, cd_error, cd_finished, cd_isready, cd_hunt;
 
-static volatile int cdtv_hsync, dma_finished;
+static volatile int cdtv_hsync, dma_finished, cdtv_sectorsize;
 static volatile uae_u64 dma_wait;
 
 static void do_stch(void);
@@ -123,10 +123,16 @@ static int get_qcode(void)
     if (!s)
        return 0;
     memcpy (cdrom_qcode, s, 16);
-    if (cd_playing && s[1] == 0x11) {
-       int end = msf2lsn((s[5 + 4] << 16) | (s[6 + 4] << 8) | (s[7 + 4]));
-       if (end >= play_end) {
-           sys_command_cd_pause (DF_IOCTL, unitnum, 1);
+    if (cd_playing) {
+       if (s[1] == AUDIO_STATUS_IN_PROGRESS) {
+           int end = msf2lsn((s[5 + 4] << 16) | (s[6 + 4] << 8) | (s[7 + 4]));
+           if (end >= play_end - 75) {
+               sys_command_cd_pause (DF_IOCTL, unitnum, 1);
+               cd_audio_status = AUDIO_STATUS_PLAY_COMPLETE;
+               cd_playing = 0;
+               do_stch();
+           }
+       } else if (s[1] == AUDIO_STATUS_PLAY_COMPLETE) {
            cd_audio_status = AUDIO_STATUS_PLAY_COMPLETE;
            cd_playing = 0;
            do_stch();
@@ -172,11 +178,11 @@ static int pause_audio (int pause)
 
 static int read_sectors(int start, int length)
 {
-    write_log("READ DATA sector %d, %d sectors\n", start, length);
+    write_log("READ DATA sector %d, %d sectors (blocksize=%d)\n", start, length, cdtv_sectorsize);
     cdrom_sector = start;
     cdrom_sectors = length;
-    cdrom_offset = start * 2048;
-    cdrom_length = length * 2048;
+    cdrom_offset = start * cdtv_sectorsize;
+    cdrom_length = length * cdtv_sectorsize;
     cd_motor = 1;
     cd_audio_status = AUDIO_STATUS_NOT_SUPPORTED;
     if (cd_playing)
@@ -240,6 +246,8 @@ static int play_cd(uae_u8 *p)
 
     start = (p[1] << 16) | (p[2] << 8) | p[3];
     end = (p[4] << 16) | (p[5] << 8) | p[6];
+    if (p[0] == 0x09) /* end is length in lsn-mode */
+       end += start;
     if (start == 0 && end == 0) {
        cd_finished = 0;
        if (cd_playing)
@@ -250,15 +258,16 @@ static int play_cd(uae_u8 *p)
        cd_audio_status = AUDIO_STATUS_PLAY_COMPLETE;
        sys_command_cd_pause (DF_IOCTL, unitnum, 0);
        sys_command_cd_stop (DF_IOCTL, unitnum);
-       cd_isready = 10;
+       cd_isready = 50;
        return 0;
     }
-    if (end == 0x00ffffff)
-       end = last_cd_position;
-    if (p[0] == 0x09) {
+    if (p[0] == 0x09) { /* lsn */
        start = lsn2msf (start);
-       end = lsn2msf (end);
+       if (end < 0x00ffffff)
+           end = lsn2msf (end);
     }
+    if (end == 0x00ffffff || end > last_cd_position)
+       end = last_cd_position;
     play_end = msf2lsn(end);
     play_start = msf2lsn(start);
     write_log("PLAY CD AUDIO from %06.6X (%d) to %06.6X (%d)\n",
@@ -353,6 +362,16 @@ static int read_toc(int track, int msflsn, uae_u8 *out)
     return -1;
 }
 
+static int cdrom_modeset(uae_u8 *cmd)
+{
+    cdtv_sectorsize = (cmd[2] << 8) | cmd[3];
+    if (cdtv_sectorsize != 2048 && cdtv_sectorsize != 2336) {
+       write_log("CDTV: tried to set unknown sector size %d\n", cdtv_sectorsize);
+       cdtv_sectorsize = 2048;
+    }
+    return 0;
+}
+
 static void cdrom_command_accepted(int size, uae_u8 *cdrom_command_input, int *cdrom_command_cnt_in)
 {
 #ifdef CDTV_DEBUG_CMD
@@ -458,7 +477,7 @@ static void cdrom_command_thread(uae_u8 b)
        break;
        case 0x84:
        if (cdrom_command_cnt_in == 7) {
-           cdrom_command_accepted(0, s, &cdrom_command_cnt_in);
+           cdrom_command_accepted(cdrom_modeset(cdrom_command_input), s, &cdrom_command_cnt_in);
            cd_finished = 1;
        }
        break;
@@ -505,18 +524,22 @@ static void cdrom_command_thread(uae_u8 b)
 #define ISTR_INT_P (1 << 4)
 #define ISTR_E_INT (1 << 5)
 
+extern uae_u8 *ioctl_command_rawread (int unitnum, int sector);
+
 static void dma_do_thread(void)
 {
     static int readsector;
     uae_u8 *p = NULL;
 
-    //write_log("DMAC DMA: sector=%d, addr=%08.8X, words=%d\n",
-       //cdrom_offset / 2048, dmac_acr, dmac_wtc);
+    write_log("DMAC DMA: sector=%d, addr=%08.8X, words=%d\n", cdrom_offset / cdtv_sectorsize, dmac_acr, dmac_wtc);
     dma_wait += dmac_wtc * (uae_u64)312 * 50 / 75 + 1;
     while (dmac_wtc > 0 && dmac_dma) {
-       if (!p || readsector != (cdrom_offset / 2048)) {
-           readsector = cdrom_offset / 2048;
-           p = sys_command_cd_read (DF_IOCTL, unitnum, readsector);
+       if (!p || readsector != (cdrom_offset / cdtv_sectorsize)) {
+           readsector = cdrom_offset / cdtv_sectorsize;
+           if (cdtv_sectorsize == 2336)
+               p = sys_command_cd_rawread (DF_IOCTL, unitnum, readsector, cdtv_sectorsize);
+           else
+               p = sys_command_cd_read (DF_IOCTL, unitnum, readsector);
            if (!p) {
                cd_error = 1;
                activate_stch = 1;
@@ -525,8 +548,8 @@ static void dma_do_thread(void)
            }
 
        }
-        put_byte (dmac_acr, p[(cdrom_offset % 2048) + 0]);
-        put_byte (dmac_acr + 1, p[(cdrom_offset % 2048) + 1]);
+        put_byte (dmac_acr, p[(cdrom_offset % cdtv_sectorsize) + 0]);
+        put_byte (dmac_acr + 1, p[(cdrom_offset % cdtv_sectorsize) + 1]);
         dmac_wtc--;
         dmac_acr+=2;
         cdrom_length-=2;
diff --git a/cia.c b/cia.c
index 4c25220593dadffe18ac05ac71337ab5244c3627..fbf954cc12ffad1b6836cf8c8fa1b4cba9149734 100755 (executable)
--- a/cia.c
+++ b/cia.c
@@ -168,8 +168,8 @@ static void CIA_update (void)
        ciaata -= ciaclocks;
     }
     if ((ciaacrb & 0x61) == 0x01) {
-       assert ((ciaatb+1) >= ciaclocks);
-       if ((ciaatb+1) == ciaclocks) aovflb = 1;
+       assert ((ciaatb + 1) >= ciaclocks);
+       if ((ciaatb + 1) == ciaclocks) aovflb = 1;
        ciaatb -= ciaclocks;
     }
 
@@ -188,8 +188,8 @@ static void CIA_update (void)
        ciabta -= ciaclocks;
     }
     if ((ciabcrb & 0x61) == 0x01) {
-       assert ((ciabtb+1) >= ciaclocks);
-       if ((ciabtb+1) == ciaclocks) bovflb = 1;
+       assert ((ciabtb + 1) >= ciaclocks);
+       if ((ciabtb + 1) == ciaclocks) bovflb = 1;
        ciabtb -= ciaclocks;
     }
 
@@ -488,15 +488,15 @@ static uae_u8 ReadCIAA (unsigned int addr)
            tmp = arcadia_parport (0, ciaaprb, ciaadrb);
 #endif
        } else {
-           tmp = handle_parport_joystick (0, ciaaprb, ciaadrb);
-       }
 #else
-       tmp = handle_parport_joystick (0, ciaaprb, ciaadrb);
-#ifdef DONGLE_DEBUG
-       if (notinrom())
-           write_log ("BFE101 R %02.2X %s\n", tmp, debuginfo(0));
+       {
 #endif
+           tmp = handle_parport_joystick (0, ciaaprb, ciaadrb);
+#ifdef DONGLE_DEBUG
+           if (notinrom())
+               write_log ("BFE101 R %02.2X %s\n", tmp, debuginfo(0));
 #endif
+       }
        if (ciaacrb & 2) {
            int pb7 = 0;
            if (ciaacrb & 4)
@@ -1478,7 +1478,7 @@ uae_u8 *save_cia (int num, int *len, uae_u8 *dstptr)
     save_u8 (b);
     t = (num ? ciabta - ciabta_passed : ciaata - ciaata_passed);/* 4 TA */
     save_u16 (t);
-    t = (num ? ciabtb - ciabtb_passed : ciaatb - ciaatb_passed);/* 8 TB */
+    t = (num ? ciabtb - ciabtb_passed : ciaatb - ciaatb_passed);/* 6 TB */
     save_u16 (t);
     b = (num ? ciabtod : ciaatod);                     /* 8 TODL */
     save_u8 (b);
diff --git a/debug.c b/debug.c
index 0acf048da668365246ccc6508c003256d02e6031..793428d825914e3e6cbbcc730164c3e6cd2f1264 100755 (executable)
--- a/debug.c
+++ b/debug.c
@@ -117,15 +117,15 @@ static char help[] = {
     "  s <string>/<values> [<addr>] [<length>]\n"
     "                        Search for string/bytes\n"
     "  T                     Show exec tasks and their PCs\n"
-    "  h,?                   Show this help page\n"
     "  b                     Step to previous state capture position\n"
     "  am <channel mask>     Enable or disable audio channels\n"
     "  sm <sprite mask>      Enable or disable sprites\n"
     "  di <mode> [<track>]   Break on disk access. R=DMA read,W=write,RW=both,P=PIO\n"
-    "                        Also enables extended disk logging\n"
+    "                        Also enables level 1 disk logging\n"
+    "  did <log level>       Enable disk logging\n"
     "  dj [<level bitmask>]  Enable joystick/mouse input debugging\n"
     "  dm                    Dump current address space map\n"
-#ifdef WIN32
+#ifdef _WIN32
     "  x                     Close debugger.\n"
     "  xx                    Switch between console and GUI debugger.\n"
 #endif
@@ -887,27 +887,10 @@ static void cheatsearch (char **c)
     first = 0;
 }
 
-#define BREAKPOINT_TOTAL 8
-struct breakpoint_node {
-    uaecptr addr;
-    int enabled;
-};
-static struct breakpoint_node bpnodes[BREAKPOINT_TOTAL];
-
+struct breakpoint_node bpnodes[BREAKPOINT_TOTAL];
 static addrbank **debug_mem_banks;
 static addrbank *debug_mem_area;
-#define MEMWATCH_TOTAL 8
-struct memwatch_node {
-    uaecptr addr;
-    int size;
-    int rwi;
-    uae_u32 val;
-    int val_enabled;
-    uae_u32 modval;
-    int modval_written;
-    int frozen;
-};
-static struct memwatch_node mwnodes[MEMWATCH_TOTAL];
+struct memwatch_node mwnodes[MEMWATCH_TOTAL];
 static struct memwatch_node mwhit;
 
 static uae_u8 *illgdebug;
@@ -1332,29 +1315,45 @@ static void initialize_memwatch (int mode)
        memwatch_enabled = 1;
 }
 
-static void memwatch_dump (int num)
+void memwatch_dump2 (char *buf, int bufsize, int num)
 {
     int i;
     struct memwatch_node *mwn;
+
+    if (buf)
+        memset(buf, 0, bufsize);
     for (i = 0; i < MEMWATCH_TOTAL; i++) {
        if ((num >= 0 && num == i) || (num < 0)) {
            mwn = &mwnodes[i];
            if (mwn->size == 0)
                continue;
-           console_out ("%d: %08.8X - %08.8X (%d) %c%c%c",
+           buf = buf_out (buf, &bufsize, "%d: %08.8X - %08.8X (%d) %c%c%c",
                i, mwn->addr, mwn->addr + (mwn->size - 1), mwn->size,
                (mwn->rwi & 1) ? 'R' : ' ', (mwn->rwi & 2) ? 'W' : ' ', (mwn->rwi & 4) ? 'I' : ' ');
            if (mwn->frozen)
-               console_out ("F");
+               buf = buf_out (buf, &bufsize, "F");
            if (mwn->val_enabled)
-               console_out (" =%X", mwn->val);
+               buf = buf_out (buf, &bufsize, " =%X", mwn->val);
            if (mwn->modval_written)
-               console_out (" =M");
-           console_out("\n");
+               buf = buf_out (buf, &bufsize, " =M");
+           buf = buf_out (buf, &bufsize, "\n");
        }
     }
 }
 
+static void memwatch_dump (int num)
+{
+    char *buf;
+    int multiplier = num < 0 ? MEMWATCH_TOTAL : 1;
+
+    buf = malloc(50 * multiplier);
+    if (!buf)
+        return;
+    memwatch_dump2 (buf, 50 * multiplier, num);
+    f_out(stdout, "%s", buf);
+    free(buf);
+}
+
 static void memwatch (char **c)
 {
     int num;
@@ -1839,7 +1838,13 @@ static void disk_debug(char **inptr)
     char parm[10];
     int i;
 
-    disk_debug_logging = 2;
+    if (**inptr == 'd') {
+       (*inptr)++;
+       ignore_ws(inptr);
+       disk_debug_logging = readint(inptr);
+       console_out("disk logging level %d\n", disk_debug_logging);
+       return;
+    }
     disk_debug_mode = 0;
     disk_debug_track = -1;
     ignore_ws(inptr);
@@ -1857,6 +1862,8 @@ static void disk_debug(char **inptr)
        disk_debug_track = readint(inptr);
     if (disk_debug_track < 0 || disk_debug_track > 2 * 83)
        disk_debug_track = -1;
+    if (disk_debug_logging == 0)
+       disk_debug_logging = 1;
 end:
     console_out("disk breakpoint mode %c%c%c track %d\n",
        disk_debug_mode & DISK_DEBUG_DMA_READ ? 'R' : '-',
@@ -2182,6 +2189,9 @@ static void debug_1 (void)
 
 static void addhistory(void)
 {
+    uae_u32 pc = m68k_getpc(&regs);
+    if (pc >= 0xf00000 && pc <= 0xffffff)
+       return;
     history[lasthist] = regs;
     history[lasthist].pc = m68k_getpc(&regs);
     if (++lasthist == MAX_HIST)
@@ -2312,20 +2322,19 @@ void debug (void)
 
 int notinrom (void)
 {
-    if (munge24 (m68k_getpc(&regs)) < 0xe0000)
+    if (munge24 (m68k_getpc(&regs)) < 0x00e00000)
        return 1;
     return 0;
 }
-/*
+
 const char *debuginfo (int mode)
 {
     static char txt[100];
-    uae_u32 pc = m68k_getpc();
+    uae_u32 pc = M68K_GETPC;
     sprintf (txt, "PC=%08.8X INS=%04.4X %04.4X %04.4X",
        pc, get_word(pc), get_word(pc+2), get_word(pc+4));
     return txt;
 }
-*/
 
 static int mmu_logging;
 
diff --git a/disk.c b/disk.c
index a3b36fcecb6e642275c8e7590085ef2a472d347d..a709e3c4ab2a658a48a9f0572be590aa6a9a4f99 100755 (executable)
--- a/disk.c
+++ b/disk.c
@@ -3074,6 +3074,8 @@ uae_u8 *restore_disk(int num,uae_u8 *src)
 {
     drive *drv;
     int state, dfxtype;
+    char old[MAX_DPATH];
+    int newis;
 
     drv = &floppy[num];
     disabled &= ~(1 << num);
@@ -3112,12 +3114,19 @@ uae_u8 *restore_disk(int num,uae_u8 *src)
     drv->dskchange = 0;
     drv->dskchange_time = 0;
     restore_u32 ();
+    strcpy (old, currprefs.df[num]);
     strncpy(changed_prefs.df[num],src,255);
+    newis = changed_prefs.df[num][0] ? 1 : 0;
     src+=strlen(src)+1;
     drive_insert (floppy + num, &currprefs, num, changed_prefs.df[num]);
-    if (drive_empty (floppy + num))
-       drv->dskchange = 1;
-
+    if (drive_empty (floppy + num)) {
+       if (newis && old[0]) {
+           strcpy (changed_prefs.df[num], old);
+           drive_insert (floppy + num, &currprefs, num, changed_prefs.df[num]);
+           if (drive_empty (floppy + num))
+               drv->dskchange = 1;
+        }
+    }
     return src;
 }
 
diff --git a/fpp.c b/fpp.c
index 78c260071dba38fbb3ea357382d6eeed6a10e090..01e1b6871defbafcd61748e739a5a1d829ca663b 100755 (executable)
--- a/fpp.c
+++ b/fpp.c
@@ -514,7 +514,7 @@ STATIC_INLINE int put_fp_value (struct regstruct *regs, fptype value, uae_u32 op
                | (m68k_dreg (regs, reg) & ~0xff)));
            break;
        case 4:
-           m68k_dreg (regs, reg) = (uae_u32)(((toint(value, -32768.0, 327676.0) & 0xffff)
+           m68k_dreg (regs, reg) = (uae_u32)(((toint(value, -32768.0, 32767.0) & 0xffff)
            | (m68k_dreg (regs, reg) & ~0xffff)));
            break;
        case 0:
index 99ae72317cc7b3404e7a1821fcaf9fcba5011eb5..4ff194273a2ce115844889da188cc6c2b056830d 100755 (executable)
@@ -63,6 +63,7 @@ typedef int (*play_func)(int, uae_u32, uae_u32, int);
 typedef uae_u8* (*qcode_func)(int);
 typedef uae_u8* (*toc_func)(int);
 typedef uae_u8* (*read_func)(int, int);
+typedef uae_u8* (*rawread_func)(int, int, int);
 typedef int (*write_func)(int, int);
 typedef int (*isatapi_func)(int);
 typedef int (*ismedia_func)(int, int);
@@ -83,6 +84,7 @@ struct device_functions {
     qcode_func qcode;
     toc_func toc;
     read_func read;
+    rawread_func rawread;
     write_func write;
 
     isatapi_func isatapi;
@@ -106,6 +108,7 @@ extern int sys_command_cd_play (int mode, int unitnum, uae_u32 startmsf, uae_u32
 extern uae_u8 *sys_command_cd_qcode (int mode, int unitnum);
 extern uae_u8 *sys_command_cd_toc (int mode, int unitnum);
 extern uae_u8 *sys_command_cd_read (int mode, int unitnum, int offset);
+extern uae_u8 *sys_command_cd_rawread (int mode, int unitnum, int offset, int size);
 extern uae_u8 *sys_command_read (int mode, int unitnum, int offset);
 extern int sys_command_write (int mode, int unitnum, int offset);
 extern int sys_command_scsi_direct (int unitnum, uaecptr request);
index aba1319217ff7fa9564dbc037252f4bc94a0a58c..e86b21388aa3590e71f55eb23f2342ac0d7d90c2 100755 (executable)
@@ -33,6 +33,29 @@ extern void memory_map_dump (void);
 extern void debug_help (void);
 extern uaecptr dumpmem2 (uaecptr addr, char *out, int osize);
 extern void update_debug_info (void);
+
+#define BREAKPOINT_TOTAL 8
+struct breakpoint_node {
+    uaecptr addr;
+    int enabled;
+};
+extern struct breakpoint_node bpnodes[BREAKPOINT_TOTAL];
+
+#define MEMWATCH_TOTAL 8
+struct memwatch_node {
+    uaecptr addr;
+    int size;
+    int rwi;
+    uae_u32 val;
+    int val_enabled;
+    uae_u32 modval;
+    int modval_written;
+    int frozen;
+};
+extern struct memwatch_node mwnodes[MEMWATCH_TOTAL];
+
+extern void memwatch_dump2 (char *buf, int bufsize, int num);
+
 #else
 
 STATIC_INLINE void activate_debugger (void) { };
index 6c5c558f4f21174f33bd45736c54ef1d30c49226..efccec0dd2e3a79334ef2c8ad98cc582425423f7 100755 (executable)
@@ -385,3 +385,11 @@ extern void check_prefs_changed_comp (void);
 #else
 #define flush_icache(X) do {} while (0)
 #endif
+
+extern int movec_illg (int regno);
+extern uae_u32 val_move2c (int regno);
+struct cpum2c {
+    int regno;
+    char *regname;
+};
+extern struct cpum2c m2cregs[];
\ No newline at end of file
index ac82072478dc5806291e89267d38a512e5c644b0..2da8c694b8e2524043600bc6fa6e82e477e74620 100755 (executable)
--- a/newcpu.c
+++ b/newcpu.c
@@ -1135,7 +1135,7 @@ void Interrupt (int nr)
 
 #ifndef CPUEMU_68000_ONLY
 
-static int movec_illg (int regno)
+int movec_illg (int regno)
 {
     int regno2 = regno & 0x7ff;
 
@@ -2566,11 +2566,29 @@ void sm68k_disasm(char *instrname, char *instrcode, uaecptr addr, uaecptr *nextp
        *nextpc = m68k_getpc (&regs) + m68kpc_offset;
 }
 
-static int m2cregn[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 0x800, 0x801, 0x802, 0x803, 0x804, 0x805, 0x806, 0x807, 0x808, -1 };
-static char *m2cregs[] = { "SFC ", "DFC ", "CACR", "TC  ", "ITT0", "ITT1", "DTT0", "DTT1", "BUSC",
-    "USP ", "VBR ", "CAAR", "MSP ", "ISP ", "MMUS", "URP ", "SRP ", "PCR ", 0 };
-
-static uae_u32 val_move2c (int regno)
+struct cpum2c m2cregs[] = {
+    0, "SFC",
+    1, "DFC",
+    2, "CACR",
+    3, "TC",
+    4, "ITT0",
+    5, "ITT1",
+    6, "DTT0",
+    7, "DTT1",
+    8, "BUSC",
+    0x800, "USP",
+    0x801, "VBR",
+    0x802, "CAAR",
+    0x803, "MSP",
+    0x804, "ISP",
+    0x805, "MMUS",
+    0x806, "URP",
+    0x807, "SRP",
+    0x808, "PCR",
+    -1, NULL
+};
+
+uae_u32 val_move2c (int regno)
 {
     switch (regno) {
     case 0: return regs.sfc;
@@ -2611,12 +2629,12 @@ void m68k_dumpstate (void *f, uaecptr *nextpc)
     if (regs.s && regs.m) regs.msp = m68k_areg(&regs, 7);
     if (regs.s && regs.m == 0) regs.isp = m68k_areg(&regs, 7);
     j = 2;
-    f_out(f, " USP %08.8X  ISP %08.8X", regs.usp, regs.isp);
-    for (i = 0; m2cregn[i] >= 0; i++) {
-       if (!movec_illg(m2cregn[i])) {
+    f_out(f, " USP %08.8X  ISP %08.8X ", regs.usp, regs.isp);
+    for (i = 0; m2cregs[i].regno>= 0; i++) {
+       if (!movec_illg(m2cregs[i].regno)) {
            if (j > 0 && (j % 4) == 0)
                f_out(f, "\n");
-           f_out (f, "%s %08.8X ", m2cregs[i], val_move2c(m2cregn[i]));
+           f_out (f, "%s %08.8X ", m2cregs[i].regname, val_move2c(m2cregs[i].regno));
            j++;
        }
     }
index 1f8e9f09f23170e5a67319343559c075b830f343..1fddbd987873fb7ba1ae7f99d93cbd78f573e23c 100755 (executable)
@@ -991,5 +991,5 @@ static struct device_scsi_info *scsi_info (int unitnum, struct device_scsi_info
 struct device_functions devicefunc_win32_aspi = {
     open_scsi_bus, close_scsi_bus, open_scsi_device, close_scsi_device, info_device,
     execscsicmd_out, execscsicmd_in, execscsicmd_direct,
-    0, 0, 0, 0, 0, 0, 0, check_isatapi, scsi_info, 0
+    0, 0, 0, 0, 0, 0, 0, 0, check_isatapi, scsi_info, 0
 };
index 91434b67c7232eeb0cddfb9ae687d577a69d6906..5c38ccdfc803d1facd36d3b227701b9aaa3c5baf 100755 (executable)
@@ -445,7 +445,44 @@ static uae_u8 *ioctl_command_qcode (int unitnum)
     }
 }
 
-static int ioctl_command_readwrite (int unitnum, int sector, int write)
+int track_mode = -1;
+static int tm[] = { YellowMode2, XAForm2, RawWithC2AndSubCode, RawWithC2, RawWithSubCode };
+static uae_u8 *ioctl_command_rawread_2 (int unitnum, int sector, int size)
+{
+    int cnt = 3;
+    RAW_READ_INFO rri;
+    DWORD len;
+    uae_u8 *p = ciw32[unitnum].tempbuffer;
+
+    if (log_scsi)
+       write_log("rawread unit=%d sector=%d blocksize=%d tm=%d\n", unitnum, sector, size, tm[track_mode]);
+    if (!open_createfile(unitnum))
+       return 0;
+    if (size != 2336 && size != 2352 && size != 2048)
+       return 0;
+    while (cnt-- > 0) {
+       gui_cd_led (1);
+       seterrormode (unitnum);
+       rri.DiskOffset.QuadPart = sector * 2048;
+       rri.SectorCount = 1;
+       rri.TrackMode = tm[track_mode];
+       len = size;
+       if (!DeviceIoControl(ciw32[unitnum].h, IOCTL_CDROM_RAW_READ, &rri, sizeof rri,
+           p, IOCTL_DATA_BUFFER, &len, NULL)) {
+           reseterrormode (unitnum);
+           if (win32_error (unitnum, "IOCTL_CDROM_RAW_READ") < 0)
+               continue;
+           return 0;
+       }
+       reseterrormode (unitnum);
+       break;
+    }
+    if (size == 2352)
+       return p;
+    return p + 16;
+}
+
+static int ioctl_command_readwrite (int unitnum, int sector, int write, int blocksize)
 {
     DWORD dtotal;
     int cnt = 3;
@@ -469,7 +506,7 @@ static int ioctl_command_readwrite (int unitnum, int sector, int write)
        gui_cd_led (1);
        seterrormode (unitnum);
        if (write) {
-           if (!WriteFile (ciw32[unitnum].h, ciw32[unitnum].tempbuffer, ciw32[unitnum].blocksize, &dtotal, 0)) {
+           if (!WriteFile (ciw32[unitnum].h, ciw32[unitnum].tempbuffer, blocksize, &dtotal, 0)) {
                int err;
                reseterrormode (unitnum);
                err = win32_error (unitnum, "WriteFile");
@@ -480,7 +517,7 @@ static int ioctl_command_readwrite (int unitnum, int sector, int write)
                return 0;
            }
        } else {
-           if (!ReadFile (ciw32[unitnum].h, ciw32[unitnum].tempbuffer, ciw32[unitnum].blocksize, &dtotal, 0)) {
+           if (!ReadFile (ciw32[unitnum].h, ciw32[unitnum].tempbuffer, blocksize, &dtotal, 0)) {
                reseterrormode (unitnum);
                if (win32_error (unitnum, "ReadFile") < 0)
                    continue;
@@ -496,14 +533,24 @@ static int ioctl_command_readwrite (int unitnum, int sector, int write)
 
 static int ioctl_command_write (int unitnum, int sector)
 {
-    return ioctl_command_readwrite (unitnum, sector, 1);
+    return ioctl_command_readwrite (unitnum, sector, 1, ciw32[unitnum].blocksize);
 }
+
 static uae_u8 *ioctl_command_read (int unitnum, int sector)
 {
-    if (ioctl_command_readwrite (unitnum, sector, 0) > 0)
+    if (ioctl_command_readwrite (unitnum, sector, 0, ciw32[unitnum].blocksize) > 0)
        return ciw32[unitnum].tempbuffer;
     return NULL;
 }
+static uae_u8 *ioctl_command_rawread (int unitnum, int sector, int size)
+{
+    if (track_mode < 0) {
+       if (ioctl_command_readwrite (unitnum, sector, 0, size) > 0)
+           return ciw32[unitnum].tempbuffer;
+       return NULL;
+    }
+    return ioctl_command_rawread_2 (unitnum, sector, size);
+}
 
 static int fetch_geometry (int unitnum, struct device_info *di)
 {
@@ -787,7 +834,8 @@ struct device_functions devicefunc_win32_ioctl = {
     open_bus, close_bus, open_device, close_device, info_device,
     0, 0, 0,
     ioctl_command_pause, ioctl_command_stop, ioctl_command_play, ioctl_command_qcode,
-    ioctl_command_toc, ioctl_command_read, ioctl_command_write, 0, ioctl_scsi_info, ioctl_ismedia
+    ioctl_command_toc, ioctl_command_read, ioctl_command_rawread, ioctl_command_write,
+    0, ioctl_scsi_info, ioctl_ismedia
 };
 
 #endif
index 9fb9d6118a278b1d7a31a85149828dfbe644b92d..5bfcee070b7bb04860ae9e8680369a756e8d5a57 100755 (executable)
@@ -496,7 +496,7 @@ static struct device_scsi_info *scsi_info (int unitnum, struct device_scsi_info
 struct device_functions devicefunc_win32_spti = {
     open_scsi_bus, close_scsi_bus, open_scsi_device, close_scsi_device, info_device,
     execscsicmd_out, execscsicmd_in, execscsicmd_direct,
-    0, 0, 0, 0, 0, 0, 0, check_isatapi, scsi_info, 0
+    0, 0, 0, 0, 0, 0, 0, 0, check_isatapi, scsi_info, 0
 };
 
 static int getCDROMProperty(int idx, HDEVINFO DevInfo, const GUID *guid)
index e17616eddb7680221cec815dcafc89d658197cd9..b586446dfb9570f9047198658eccb9343ca801c9 100755 (executable)
 
 #include <string.h>
 #include <windows.h>
+#include <commctrl.h>
 #include "resource.h"
 #include "options.h"
 #include "memory.h"
 #include "custom.h"
 #include "newcpu.h"
+#include "cia.h"
+#include "disk.h"
 #include "debug.h"
+#include "identify.h"
+#include "savestate.h"
 #include "debug_win32.h"
 #include "win32.h"
 #include "win32gui.h"
@@ -36,10 +41,10 @@ static char linebreak[] = {'\r', '\n', '\0'};
 #define MAXINPUTHIST 50
 #define MAXPAGECONTROLS 5
 #define MAXPAGES 10
+#define CLASSNAMELENGTH 50
 
 static int inputfinished = 0;
 
-static FARPROC OldInputProc, OldMemInputProc;
 static WORD* dlgtmpl;
 static int reopen;
 
@@ -62,6 +67,9 @@ static struct debuggerpage dbgpage[MAXPAGES];
 static int currpage, pages;
 static int pagetype;
 
+char *pname[] = { "OUT1", "OUT2", "MEM1", "MEM2", "DASM1", "DASM2", "BRKPTS", "MISC", "CUSTOM" };
+static int pstatuscolor[MAXPAGES];
+
 static void OutputCurrHistNode(HWND hWnd)
 {
     int txtlen;
@@ -242,16 +250,24 @@ void WriteOutput(const char *out, int len)
     }
 }
 
+static HWND ulbs_hwnd;
+static int ulbs_pos;
 static void UpdateListboxString(HWND hWnd, int pos, char *out, int mark)
 {
     int count;
-    char text[MAX_LINEWIDTH + 1];
+    char text[MAX_LINEWIDTH + 1], *p;
     COLORREF cr;
 
-    if (!IsWindowEnabled(hWnd))
-        return;
+    if (!IsWindowEnabled(hWnd)) {
+        p = strchr(out, ':');
+        if (p)
+            *(p + 1) = '\0';
+    }
     if (strlen(out) > MAX_LINEWIDTH)
         out[MAX_LINEWIDTH] = '\0';
+    p = strchr(out, '\n');
+    if (p)
+        *p = '\0';
     cr = GetSysColor(COLOR_WINDOWTEXT);
     count = SendMessage(hWnd, (UINT) LB_GETCOUNT, 0, 0);
     if (pos < count) {
@@ -264,6 +280,27 @@ static void UpdateListboxString(HWND hWnd, int pos, char *out, int mark)
     SendMessage(hWnd, LB_INSERTSTRING, pos, (LPARAM)out);
     SendMessage(hWnd, LB_SETITEMDATA, pos, cr);
 }
+static void ULBSINIT(HWND hwnd)
+{
+    ulbs_hwnd = hwnd;
+    ulbs_pos = 0;
+}
+static void ULBS(const char *format, ...)
+{
+    char buffer[MAX_LINEWIDTH + 1];
+    va_list parms;
+    va_start(parms, format);
+    _vsnprintf(buffer, MAX_LINEWIDTH, format, parms);
+    UpdateListboxString(ulbs_hwnd, ulbs_pos++, buffer, FALSE);
+}
+static void ULBST(const char *format, ...)
+{
+    char buffer[MAX_LINEWIDTH + 1];
+    va_list parms;
+    va_start(parms, format);
+    _vsnprintf(buffer, MAX_LINEWIDTH, format, parms);
+    UpdateListboxString(ulbs_hwnd, ulbs_pos++, buffer, TRUE);
+}
 
 static int GetLBOutputLines(HWND hWnd)
 {
@@ -280,20 +317,230 @@ static int GetLBOutputLines(HWND hWnd)
     return lines;
 }
 
+static void ShowMiscCPU(HWND hwnd)
+{
+    int line = 0;
+    char out[MAX_LINEWIDTH + 1];
+    int i;
+
+    for (i = 0; m2cregs[i].regno>= 0; i++) {
+       if (!movec_illg(m2cregs[i].regno)) {
+           sprintf(out, "%-4s %08.8X", m2cregs[i].regname, val_move2c(m2cregs[i].regno));
+           UpdateListboxString(hwnd, line++, out, TRUE);
+       }
+    }
+}
+
+static int dcustom[] = {
+    0x02, 0x9a, 0x9c, 0x8080, 0x8084, 0x8e, 0x90, 0x92, 0x94,
+    0x100, 0x102, 0x104, 0x106, 0x10c, 0
+};
+static uae_u32 gw(uae_u8 *p, int off)
+{
+    return (p[off] << 8) | p[off + 1];
+}
+static void ShowCustomSmall(HWND hwnd)
+{
+    int len, i, j, cnt;
+    uae_u8 *p1, *p2, *p3, *p4;
+    char out[MAX_LINEWIDTH + 1];
+
+    p1 = p2 = save_custom (&len, 0, 1);
+    p1 += 4; // skip chipset type
+    for (i = 0; i < 4; i++) {
+       p4 = p1 + 0xa0 + i * 16;
+       p3 = save_audio (i, &len, 0);
+       p4[0] = p3[12];
+       p4[1] = p3[13];
+       p4[2] = p3[14];
+       p4[3] = p3[15];
+       p4[4] = p3[4];
+       p4[5] = p3[5];
+       p4[6] = p3[8];
+       p4[7] = p3[9];
+       p4[8] = 0;
+       p4[9] = p3[1];
+       p4[10] = p3[10];
+       p4[11] = p3[11];
+       free (p3);
+    }
+    ULBSINIT(hwnd);
+    cnt = 0;
+    sprintf(out, "CPU %d", currprefs.cpu_model);
+    if (currprefs.fpu_model)
+       sprintf (out + strlen(out), "/%d", currprefs.fpu_model);
+    sprintf(out + strlen(out), " %s", (currprefs.chipset_mask & CSMASK_AGA) ? "AGA" : ((currprefs.chipset_mask & CSMASK_ECS_AGNUS) ? "ECS" : "OCS"));
+    ULBST(out);
+    ULBST("VPOS     %04.4X (%d)", vpos, vpos);
+    ULBST("HPOS     %04.4X (%d)", current_hpos(), current_hpos());
+    for (i = 0; dcustom[i]; i++) {
+       for (j = 0; custd[j].name; j++) {
+           if (custd[j].adr == (dcustom[i] & 0x1fe) + 0xdff000) {
+               if (dcustom[i] & 0x8000)
+                   ULBST("%-8s %08.8X", custd[j].name, (gw(p1, dcustom[i] & 0x1fe) << 16) | gw(p1, (dcustom[i] & 0x1fe) + 2));
+               else
+                   ULBST("%-8s %04.4X", custd[j].name, gw(p1, dcustom[i] & 0x1fe));
+               break;
+           }
+       }
+    }
+    free (p2);
+}
+
+static void ShowMisc(void)
+{
+    int line = 0;
+    HWND hMisc;
+    int len, i;
+    uae_u8 *p, *p2;
+
+    hMisc = GetDlgItem(hDbgWnd, IDC_DBG_MISC);
+    ULBSINIT(hMisc);
+    for (i = 0; i < 2; i++) {
+       p = p2 = save_cia (i, &len, NULL);
+       ULBS("");
+       ULBS("CIA %c:", i == 1 ? 'B' : 'A');
+       ULBS("");
+       ULBS("PRA %02X   PRB %02X", p[0], p[1]);
+       ULBS("DRA %02X   DRB %02X", p[2], p[3]);
+       ULBS("CRA %02X   CRB %02X   ICR %02X   IM %02X",
+           p[14], p[15], p[13], p[16]);
+       ULBS("TA  %04X (%04X)   TB %04X (%04X)",
+           (p[5] << 8) | p[4], (p[18] << 8) | p[17],
+           (p[7] << 8) | p[6], (p[20] << 8) | p[19]);
+       ULBS("TOD %06X (%06X) ALARM %06X %c%c",
+           (p[10] << 16) | (p[ 9] << 8) | p[ 8],
+           (p[23] << 16) | (p[22] << 8) | p[21],
+           (p[26] << 16) | (p[25] << 8) | p[24],
+           (p[27] & 1) ? 'L' : ' ', (p[27] & 2) ? ' ' : 'S');
+        free(p2);
+    }
+    for (i = 0; i < 4; i++) {
+       p = p2 = save_disk (i, &len, NULL);
+       ULBS("");
+       ULBS("Drive DF%d: (%s)", i, (p[4] & 2) ? "disabled" : "enabled");
+       ULBS("ID %08.8X  Motor %s  Cylinder %2d  MFMPOS %d",
+           (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3],
+           (p[4] & 1) ? "On" : "Off",
+           p[5], (p[8] << 24) | (p[9] << 16) | (p[10] << 8) | p[11]);
+       if (p[16])
+           ULBS("'%s'", p + 16);
+       else
+           ULBS("Drive is empty");
+       free(p2);
+    }
+    p = p2 = save_floppy (&len, NULL);
+    ULBS("");
+    ULBS("Disk controller:");
+    ULBS("");
+    ULBS("Shift register: Data=%04.4X Shift=%d. DMA=%d,%d", (p[0] << 8) | p[1], p[2], p[3], p[5]);
+    free (p2);
+}
+
+static void ShowCustom(void)
+{
+    int len, i, j, end;
+    uae_u8 *p1, *p2, *p3, *p4;
+
+    ULBSINIT(GetDlgItem(hDbgWnd, IDC_DBG_CUSTOM));
+    p1 = p2 = save_custom (&len, 0, 1);
+    p1 += 4; // skip chipset type
+    for (i = 0; i < 4; i++) {
+       p4 = p1 + 0xa0 + i * 16;
+       p3 = save_audio (i, &len, 0);
+       p4[0] = p3[12];
+       p4[1] = p3[13];
+       p4[2] = p3[14];
+       p4[3] = p3[15];
+       p4[4] = p3[4];
+       p4[5] = p3[5];
+       p4[6] = p3[8];
+       p4[7] = p3[9];
+       p4[8] = 0;
+       p4[9] = p3[1];
+       p4[10] = p3[10];
+       p4[11] = p3[11];
+       free (p3);
+    }
+    end = 0;
+    while (custd[end].name)
+       end++;
+    end++;
+    end /= 2;
+    for (i = 0; i < end; i++) {
+       uae_u16 v1, v2;
+       int addr1, addr2;
+       j = end + i;
+       addr1 = custd[i].adr & 0x1ff;
+       addr2 = custd[j].adr & 0x1ff;
+       v1 = (p1[addr1 + 0] << 8) | p1[addr1 + 1];
+       v2 = (p1[addr2 + 0] << 8) | p1[addr2 + 1];
+       ULBS("%03.3X %-15s %04.4X    %03.3X %-15s %04.4X",
+           addr1, custd[i].name, v1,
+           addr2, custd[j].name, v2);
+    }
+    free (p2);
+}
+
+static void ShowBreakpoints(void)
+{
+    HWND hBrkpts;
+    int i, line = 0, lines_old, got;
+    char outbp[MAX_LINEWIDTH + 1], outw[50];
+
+    hBrkpts = GetDlgItem(hDbgWnd, IDC_DBG_BRKPTS);
+    ULBSINIT(hBrkpts);
+    lines_old = SendMessage(hBrkpts, LB_GETCOUNT, 0, 0);
+    ULBS("");
+    ULBS("Breakpoints:");
+    ULBS("");
+    got = 0;
+    for (i = 0; i < BREAKPOINT_TOTAL; i++) {
+        if (!bpnodes[i].enabled)
+            continue;
+               m68k_disasm_2(outbp, sizeof(outbp), bpnodes[i].addr, NULL, 1, NULL, NULL, 0);
+        ULBS(outbp);
+        got = 1;
+    }
+    if (!got)
+        ULBS("none");
+    ULBS("");
+    ULBS("Memwatch breakpoints:");
+    ULBS("");
+    got = 0;
+    for (i = 0; i < MEMWATCH_TOTAL; i++) {
+        if (mwnodes[i].size == 0)
+            continue;
+       memwatch_dump2(outw, sizeof(outw), i);
+        ULBS(outw);
+        got = 1;
+    }
+    if (!got)
+        ULBS("none");
+    for (i = ulbs_pos; i < lines_old; i++)
+        SendMessage(hBrkpts, LB_DELETESTRING, line, 0);
+}
+
 static void ShowMem(int offset)
 {
     uae_u32 addr;
-    int i;
+    int i, lines_old, lines_new;
     char out[MAX_LINEWIDTH + 1];
     HWND hMemory;
 
     dbgpage[currpage].addr += offset;
     addr = dbgpage[currpage].addr;
     hMemory = GetDlgItem(hDbgWnd, IDC_DBG_MEM);
-    for (i = 0; i < GetLBOutputLines(hMemory); i++) {
+    lines_old = SendMessage(hMemory, LB_GETCOUNT, 0, 0);
+    lines_new = GetLBOutputLines(hMemory);
+    for (i = 0; i < lines_new; i++) {
         addr = dumpmem2(addr, out, sizeof(out));
         UpdateListboxString(hMemory, i, out, FALSE);
     }
+    for (i = lines_new; i < lines_old; i++) {
+        SendMessage(hMemory, LB_DELETESTRING, lines_new, 0);
+    }
+    SendMessage(hMemory, LB_SETTOPINDEX, 0, 0);
 }
 
 static int GetPrevAddr(uae_u32 addr, uae_u32 *prevaddr)
@@ -317,8 +564,8 @@ static int GetPrevAddr(uae_u32 addr, uae_u32 *prevaddr)
 static void ShowDasm(int direction)
 {
     uae_u32 addr = 0, prev;
-    int i;
-    char out[MAX_LINEWIDTH + 1], *p;
+    int i, lines_old, lines_new;
+    char out[MAX_LINEWIDTH + 1];
     HWND hDasm;
 
     hDasm = GetDlgItem(hDbgWnd, IDC_DBG_DASM);
@@ -342,16 +589,19 @@ static void ShowDasm(int direction)
     if (addr % 2)
         return;
     dbgpage[currpage].addr = addr;
-    for (i = 0; i < GetLBOutputLines(hDasm); i++) {
+    lines_old = SendMessage(hDasm, LB_GETCOUNT, 0, 0);
+    lines_new = GetLBOutputLines(hDasm);
+    for (i = 0; i < lines_new; i++) {
         m68k_disasm_2(out, sizeof(out), addr, &addr, 1, NULL, NULL, 0);
-        p = strchr(out, '\n');
-        if (p)
-            *p = '\0';
         if (addr > dbgpage[currpage].addr)
             UpdateListboxString(hDasm, i, out, FALSE);
         else
             UpdateListboxString(hDasm, i, "", FALSE);
     }
+    for (i = lines_new; i < lines_old; i++) {
+        SendMessage(hDasm, LB_DELETESTRING, lines_new, 0);
+    }
+    SendMessage(hDasm, LB_SETTOPINDEX, 0, 0);
 }
 
 static void SetMemToPC(void)
@@ -371,10 +621,14 @@ static void SetMemToPC(void)
 static void ShowPage(int index, int force)
 {
     int i, id;
+    HWND hwnd;
 
     if (index >= pages || ((index == currpage) && !force))
         return;
     if (currpage >= 0) {
+        pstatuscolor[currpage] = (currpage < 2 && index > 1) ? COLOR_WINDOWTEXT : COLOR_GRAYTEXT;
+        if (index < 2)
+            pstatuscolor[index == 0 ? 1 : 0] = COLOR_GRAYTEXT;
         for (i = 0; i < MAXPAGECONTROLS; i++) {
             if (dbgpage[currpage].ctrl[i]) {
                 id = GetDlgCtrlID(dbgpage[currpage].ctrl[i]);
@@ -385,13 +639,12 @@ static void ShowPage(int index, int force)
         }
     }
     pagetype = 0;
-    currpage = index;
     for (i = 0; i < MAXPAGECONTROLS; i++) {
         if (dbgpage[index].ctrl[i]) {
             id = GetDlgCtrlID(dbgpage[index].ctrl[i]);
            if (id == IDC_DBG_OUTPUT1 || id == IDC_DBG_OUTPUT2) {
                 hOutput = dbgpage[index].ctrl[i];
-           } else if (id == IDC_DBG_MEM) {
+           } else if (id == IDC_DBG_MEM) {
                 ShowMem(0);
                pagetype = id;
            } else if (id == IDC_DBG_DASM) {
@@ -399,47 +652,93 @@ static void ShowPage(int index, int force)
                pagetype = id;
            } else if (id == IDC_DBG_MEMINPUT) {
                 SetWindowText(dbgpage[index].ctrl[i], dbgpage[index].addrinput);
-           }
+        } else if (id == IDC_DBG_BRKPTS) {
+            ShowBreakpoints();
+        } else if (id == IDC_DBG_MISC) {
+            ShowMisc();
+        } else if (id == IDC_DBG_CUSTOM) {
+            ShowCustom();
+        }
            ShowWindow(dbgpage[index].ctrl[i], SW_SHOW);
         }
     }
+    currpage = index;
+    pstatuscolor[currpage] = COLOR_HIGHLIGHT;
+    hwnd = GetDlgItem(hDbgWnd, IDC_DBG_STATUS);
+    RedrawWindow(hwnd, 0, 0, RDW_INVALIDATE);
 }
 
-static void AddPage(int *iddata) // iddata[0] = idcount!
+static void AddPage(int *iddata)
 {
     int i;
 
     if (pages >= MAXPAGES)
         return;
     memset(&dbgpage[pages], 0, sizeof(struct debuggerpage));
-    for (i = 0; i < iddata[0]; i++) {
-        dbgpage[pages].ctrl[i] = GetDlgItem(hDbgWnd, iddata[i + 1]);
+    for (i = 0; iddata[i] > 0; i++) {
+        dbgpage[pages].ctrl[i] = GetDlgItem(hDbgWnd, iddata[i]);
         ShowWindow(dbgpage[pages].ctrl[i], SW_HIDE);
     }
     pages++;
 }
 
+static int GetTextSize(HWND hWnd, char *text, int width)
+{
+    HDC hdc;
+    TEXTMETRIC tm;
+    HFONT hfont, hfontold;
+    hdc = GetDC(hWnd);
+    hfont = (HFONT)SendMessage(hWnd, WM_GETFONT, 0, 0);
+    hfontold = (HFONT)SelectObject(hdc, hfont);
+    GetTextMetrics(hdc, &tm);
+    SelectObject(hdc, hfontold);
+    ReleaseDC(hWnd, hdc);
+    if (!width)
+        return tm.tmHeight + tm.tmExternalLeading;
+    else if (text)
+        return tm.tmMaxCharWidth * strlen(text);
+    return 0;
+}
+
 static void InitPages(void)
 {
-    int i;
+    int i, parts[MAXPAGES], width, pwidth = 0;
+    HWND hwnd;
 
     int dpage[][MAXPAGECONTROLS + 1] = {
-        { 1, IDC_DBG_OUTPUT1 },
-        { 1, IDC_DBG_OUTPUT2 },
-        { 4, IDC_DBG_MEM, IDC_DBG_MEMINPUT, IDC_DBG_MEMUP, IDC_DBG_MEMDOWN },
-        { 4, IDC_DBG_MEM, IDC_DBG_MEMINPUT, IDC_DBG_MEMUP, IDC_DBG_MEMDOWN },
-        { 5, IDC_DBG_DASM, IDC_DBG_MEMINPUT, IDC_DBG_MEMTOPC },
-        { 5, IDC_DBG_DASM, IDC_DBG_MEMINPUT, IDC_DBG_MEMTOPC }
+        { IDC_DBG_OUTPUT1, -1 },
+        { IDC_DBG_OUTPUT2, -1 },
+        { IDC_DBG_MEM, IDC_DBG_MEMINPUT, -1 },
+        { IDC_DBG_MEM, IDC_DBG_MEMINPUT, -1 },
+        { IDC_DBG_DASM, IDC_DBG_MEMINPUT, IDC_DBG_MEMTOPC, -1 },
+        { IDC_DBG_DASM, IDC_DBG_MEMINPUT, IDC_DBG_MEMTOPC, -1 },
+        { IDC_DBG_BRKPTS, -1 },
+        { IDC_DBG_MISC, -1 },
+        { IDC_DBG_CUSTOM, -1 }
     };
 
     pages = 0;
     for (i = 0; i < (sizeof(dpage) / sizeof(dpage[0])); i++)
         AddPage(dpage[i]);
+    memset(parts, 0, MAXPAGES * sizeof(int));
+    width = GetTextSize(hDbgWnd, "12345678", TRUE); // longest pagename + 2
+    for (i = 0; i < pages; i++) {
+        pwidth += width;
+        parts[i] = pwidth;
+    }
+    hwnd = GetDlgItem(hDbgWnd, IDC_DBG_STATUS);
+    SendMessage(hwnd, SB_SETPARTS, (WPARAM)pages, (LPARAM)parts);
+    for (i = 0; i < pages; i++) {
+        SendMessage(hwnd, SB_SETTEXT, i | SBT_OWNERDRAW, 0);
+        pstatuscolor[i] = COLOR_GRAYTEXT;
+    }
 }
 
 static LRESULT CALLBACK InputProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
-     switch (message) {
+    WNDPROC oldproc;
+
+    switch (message) {
         case WM_KEYUP:
             switch (wParam) {
                 case VK_RETURN:
@@ -454,7 +753,8 @@ static LRESULT CALLBACK InputProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
             }
             break;
     }
-    return CallWindowProc((WNDPROC)OldInputProc, hWnd, message, wParam, lParam);
+    oldproc = (WNDPROC)GetWindowLongPtr(hWnd, GWL_USERDATA);    
+    return CallWindowProc(oldproc, hWnd, message, wParam, lParam);
 }
 
 static LRESULT CALLBACK MemInputProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
@@ -465,6 +765,7 @@ static LRESULT CALLBACK MemInputProc (HWND hWnd, UINT message, WPARAM wParam, LP
     int ok = 1;
     char addrstr[11];
     uae_u32 addr;
+    WNDPROC oldproc;
 
     switch (message) {
         case WM_CHAR:
@@ -501,7 +802,43 @@ static LRESULT CALLBACK MemInputProc (HWND hWnd, UINT message, WPARAM wParam, LP
             }
             break;
     }
-    return CallWindowProc((WNDPROC)OldMemInputProc, hWnd, message, wParam, lParam);
+    oldproc = (WNDPROC)GetWindowLongPtr(hWnd, GWL_USERDATA);    
+    return CallWindowProc(oldproc, hWnd, message, wParam, lParam);
+}
+
+static LRESULT CALLBACK ListboxProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    WNDPROC oldproc;
+    HWND hinput;
+
+    switch (message) {
+        case WM_CHAR:
+            hinput = GetDlgItem(hDbgWnd, IDC_DBG_INPUT);
+            SetFocus(hinput);
+            SendMessage(hinput, WM_CHAR, wParam, lParam);
+            return TRUE;
+    }
+    oldproc = (WNDPROC)GetWindowLongPtr(hWnd, GWL_USERDATA);    
+    return CallWindowProc(oldproc, hWnd, message, wParam, lParam);
+}
+
+static LRESULT CALLBACK EditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    WNDPROC oldproc;
+    HWND hinput;
+
+    switch (message) {
+        case WM_CHAR:
+            if (wParam != VK_CANCEL) { // not for Ctrl-C for copying
+                hinput = GetDlgItem(hDbgWnd, IDC_DBG_INPUT);
+                SetFocus(hinput);
+                SendMessage(hinput, WM_CHAR, wParam, lParam);
+                return TRUE;
+            }
+            break;
+    }
+    oldproc = (WNDPROC)GetWindowLongPtr(hWnd, GWL_USERDATA);    
+    return CallWindowProc(oldproc, hWnd, message, wParam, lParam);
 }
 
 static void moveupdown(int dir)
@@ -546,13 +883,13 @@ static void adjustitem(HWND hwnd, int x, int y, int w, int h)
 
 static BOOL CALLBACK childenumproc (HWND hwnd, LPARAM lParam)
 {
-    int id1y[] = { IDC_DBG_OUTPUT1, IDC_DBG_OUTPUT2, IDC_DBG_MEM, IDC_DBG_DASM, -1 };
-    int id2y[] = { IDC_DBG_INPUT, IDC_DBG_HELP, -1 };
+    int id1y[] = { IDC_DBG_OUTPUT1, IDC_DBG_OUTPUT2, IDC_DBG_MEM, IDC_DBG_DASM, IDC_DBG_BRKPTS, IDC_DBG_MISC, IDC_DBG_CUSTOM, -1 };
+    int id2y[] = { IDC_DBG_INPUT, IDC_DBG_HELP, IDC_DBG_STATUS, -1 };
 
     int id1x[] = { IDC_DBG_OUTPUT1, IDC_DBG_OUTPUT2, IDC_DBG_MEM, IDC_DBG_DASM,
-       IDC_DBG_AMEM, IDC_DBG_PREFETCH, IDC_DBG_INPUT, -1 };
-    int id2x[] = { IDC_DBG_HELP, IDC_DBG_CCR, IDC_DBG_SP_VBR, IDC_DBG_MISC,
-       IDC_DBG_FPREG, IDC_DBG_FPSR, -1 };
+       IDC_DBG_AMEM, IDC_DBG_PREFETCH, IDC_DBG_INPUT, IDC_DBG_STATUS, IDC_DBG_BRKPTS, IDC_DBG_MISC, IDC_DBG_CUSTOM, -1 };
+    int id2x[] = { IDC_DBG_HELP, IDC_DBG_CCR, IDC_DBG_SP_VBR, IDC_DBG_MMISC,
+       IDC_DBG_FPREG, IDC_DBG_FPSR, IDC_DBG_MCUSTOM, IDC_DBG_MISCCPU, -1 };
 
     int dlgid, j;
 
@@ -596,21 +933,60 @@ static void AdjustDialog(HWND hDlg)
     AdjustWindowRect(&r2, WS_POPUP | WS_CAPTION | WS_THICKFRAME, FALSE);
     dlgRect.left -= r2.left;
     dlgRect.top -= r2.top;
-    EnumChildWindows (hDlg, &childenumproc, 0);
+    EnumChildWindows (hDlg, childenumproc, 0);
     dlgRect = r;
+    RedrawWindow(hDlg, 0, 0, RDW_INVALIDATE);
 }
 
+static BOOL CALLBACK InitChildWindows(HWND hWnd, LPARAM lParam)
+{
+    int id, enable = TRUE;
+    WNDPROC newproc = NULL, oldproc;
+    char classname[CLASSNAMELENGTH];
+
+    id = GetDlgCtrlID(hWnd);
+    switch (id) {
+        case IDC_DBG_INPUT:
+            newproc = InputProc;
+            SendMessage(hWnd, EM_LIMITTEXT, MAX_LINEWIDTH, 0);
+            break;
+        case IDC_DBG_MEMINPUT:
+            newproc = MemInputProc;
+            SendMessage(hWnd, EM_LIMITTEXT, 8, 0);
+            break;
+        case IDC_DBG_PREFETCH:
+            newproc = ListboxProc;
+            enable = currprefs.cpu_compatible ? TRUE : FALSE;
+            break;
+        case IDC_DBG_FPREG:
+        case IDC_DBG_FPSR:
+            newproc = ListboxProc;
+            enable = currprefs.cpu_model < 68020 ? FALSE : TRUE;
+            break;
+        default:
+            if (GetClassName(hWnd, classname, CLASSNAMELENGTH)) {
+                if (!strcmp(classname, "ListBox"))
+                    newproc = ListboxProc;
+                else if (!strcmp(classname, "Edit"))
+                    newproc = EditProc;
+            }
+            break;
+    }
+    if (newproc) {
+        oldproc = (WNDPROC)SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG_PTR)newproc);
+        SetWindowLongPtr(hWnd, GWL_USERDATA, (LONG_PTR)oldproc);
+    }
+    EnableWindow(hWnd, enable);
+    return TRUE;
+}
 
 static LRESULT CALLBACK DebuggerProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 {
-    int len;
     HWND hwnd;
     DRAWITEMSTRUCT *pdis;
     HDC hdc;
     RECT rc;
     char text[MAX_LINEWIDTH + 1];
-    HFONT hfont, hfontold;
-    TEXTMETRIC tm;
 
     switch (message) {
         case WM_INITDIALOG:
@@ -641,28 +1017,13 @@ static LRESULT CALLBACK DebuggerProc (HWND hDlg, UINT message, WPARAM wParam, LP
                    SetWindowPos(hDlg, 0, x, y, w, h, SWP_NOOWNERZORDER | SWP_NOREDRAW | SWP_NOACTIVATE | SWP_DEFERERASE);
            }
            SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon (GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_APPICON)));
-            hwnd = GetDlgItem(hDlg, IDC_DBG_INPUT);
-            OldInputProc = (FARPROC)SetWindowLong(hwnd, GWL_WNDPROC, (DWORD)InputProc);
-            SendMessage(hwnd, EM_LIMITTEXT, MAX_LINEWIDTH, 0);
-            hwnd = GetDlgItem(hDlg, IDC_DBG_MEMINPUT);
-            OldMemInputProc = (FARPROC)SetWindowLong(hwnd, GWL_WNDPROC, (DWORD)MemInputProc);
-            SendMessage(hwnd, EM_LIMITTEXT, 8, 0);
-            if (!currprefs.cpu_compatible) {
-                hwnd = GetDlgItem(hDlg, IDC_DBG_PREFETCH);
-                EnableWindow(hwnd, FALSE);
-            }
-            if (currprefs.cpu_model < 68020) {
-                hwnd = GetDlgItem(hDlg, IDC_DBG_FPREG);
-                EnableWindow(hwnd, FALSE);
-                hwnd = GetDlgItem(hDlg, IDC_DBG_FPSR);
-                EnableWindow(hwnd, FALSE);
-            }
-            currpage = -1;
-            firsthist = lasthist = currhist = NULL;
-            histcount = 0;
-            inputfinished = 0;
+        EnumChildWindows(hDlg, InitChildWindows, 0);
+        currpage = -1;
+        firsthist = lasthist = currhist = NULL;
+        histcount = 0;
+        inputfinished = 0;
            AdjustDialog(hDlg);
-            return TRUE;
+              return TRUE;
        }
         case WM_CLOSE:
             DestroyWindow(hDlg);
@@ -695,9 +1056,9 @@ static LRESULT CALLBACK DebuggerProc (HWND hDlg, UINT message, WPARAM wParam, LP
        case WM_EXITSIZEMOVE:
        {
            AdjustDialog(hDlg);
+        ShowPage(currpage, TRUE);
            return TRUE;
        }
-
         case WM_CTLCOLORSTATIC:
             SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW));
             return (LRESULT)GetSysColorBrush(COLOR_WINDOW);
@@ -712,15 +1073,23 @@ static LRESULT CALLBACK DebuggerProc (HWND hDlg, UINT message, WPARAM wParam, LP
         case WM_COMMAND:
             switch (LOWORD(wParam)) {
                 case IDC_DBG_HELP:
+                {
+                    HWND hinput;
                     WriteOutput(linebreak + 1, 2);
                     debug_help();
+                    hinput = GetDlgItem(hDbgWnd, IDC_DBG_INPUT);
+                    SetFocus(hinput);
                     return TRUE;
+                }
                 case ID_DBG_PAGE1:
                 case ID_DBG_PAGE2:
                 case ID_DBG_PAGE3:
                 case ID_DBG_PAGE4:
                 case ID_DBG_PAGE5:
                 case ID_DBG_PAGE6:
+                case ID_DBG_PAGE7:
+                case ID_DBG_PAGE8:
+                case ID_DBG_PAGE9:
                     // IDs have to be consecutive and in order of page order for this to work
                     ShowPage(LOWORD(wParam) - ID_DBG_PAGE1, FALSE);
                     return TRUE;
@@ -737,45 +1106,46 @@ static LRESULT CALLBACK DebuggerProc (HWND hDlg, UINT message, WPARAM wParam, LP
                     moveupdown(2);
                     return TRUE;
                 case IDC_DBG_MEMTOPC:
+                {
+                    HWND hmeminput;
                     SetMemToPC();
+                    hmeminput = GetDlgItem(hDbgWnd, IDC_DBG_MEMINPUT);
+                    SetFocus(hmeminput);
                     return TRUE;
+                }
             }
             break;
         case WM_MEASUREITEM:
-            hdc = GetDC(hDlg);
-            hfont = (HFONT)SendMessage(hDlg, WM_GETFONT, 0, 0);
-            hfontold = (HFONT)SelectObject(hdc, hfont);
-            GetTextMetrics(hdc, &tm);
-            ((MEASUREITEMSTRUCT*)(lParam))->itemHeight = tm.tmHeight + tm.tmExternalLeading;
-            SelectObject(hdc, hfontold);
-            ReleaseDC(hDlg, hdc);
+            ((MEASUREITEMSTRUCT*)(lParam))->itemHeight = GetTextSize(hDlg, NULL, FALSE);
             return TRUE;
         case WM_DRAWITEM:
             pdis = (DRAWITEMSTRUCT *)lParam;
             hdc = pdis->hDC;
             rc = pdis->rcItem;
             SetBkMode(hdc, TRANSPARENT);
-            if (pdis->itemID < 0) {
-                if (pdis->itemAction & ODA_FOCUS)
-                    DrawFocusRect(hdc, &rc);
-                return TRUE;
-            }
-            memset(text, MAX_LINEWIDTH + 1, 0);
-            len = SendMessage(pdis->hwndItem, LB_GETTEXT, pdis->itemID, (LPARAM)(LPSTR)text);
-            if (!IsWindowEnabled(pdis->hwndItem)) {
-                FillRect(hdc, &rc, GetSysColorBrush(COLOR_3DFACE));
-                SetBkColor(hdc, GetSysColor(COLOR_3DFACE));
+            if (wParam == IDC_DBG_STATUS) {
+                SetTextColor(hdc, GetSysColor(pstatuscolor[pdis->itemID]));
+                DrawText(hdc, pname[pdis->itemID], lstrlen(pname[pdis->itemID]), &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
             }
             else {
-                FillRect(hdc, &rc, GetSysColorBrush(COLOR_WINDOW));
-                SetBkColor(hdc, GetSysColor(COLOR_WINDOW));
-            }
-            SetTextColor(hdc, pdis->itemData);
-            if (len > 0)
+                if (pdis->itemID < 0) {
+                    return TRUE;
+                }
+                memset(text, 0, MAX_LINEWIDTH + 1);
+                SendMessage(pdis->hwndItem, LB_GETTEXT, pdis->itemID, (LPARAM)(LPSTR)text);
+                if (!IsWindowEnabled(pdis->hwndItem)) {
+                    FillRect(hdc, &rc, GetSysColorBrush(COLOR_3DFACE));
+                    SetBkColor(hdc, GetSysColor(COLOR_3DFACE));
+                }
+                else {
+                    FillRect(hdc, &rc, GetSysColorBrush(COLOR_WINDOW));
+                    SetBkColor(hdc, GetSysColor(COLOR_WINDOW));
+                }
+                SetTextColor(hdc, pdis->itemData);
                 TextOut(hdc, rc.left, rc.top, text, strlen(text));
-            if ((pdis->itemState) & (ODS_FOCUS))
-               DrawFocusRect(hdc, &rc);
-            return TRUE;
+                return TRUE;
+            }
+            break;
     }
     return FALSE;
 }
@@ -835,6 +1205,7 @@ void update_debug_info(void)
     struct instr *dp;
     struct mnemolookup *lookup1, *lookup2;
     uae_u32 fpsr;
+    char *fpsrflag[] = { "N:   ", "Z:   ", "I:   ", "NAN: " };
 
     if (!hDbgWnd)
         return;
@@ -866,12 +1237,10 @@ void update_debug_info(void)
     UpdateListboxString(hwnd, 0, out, TRUE);
     sprintf(out, "ISP: %08lX", regs.isp);
     UpdateListboxString(hwnd, 1, out, TRUE);
-    sprintf(out, "MSP: %08lX", regs.msp);
-    UpdateListboxString(hwnd, 2, out, TRUE);
-    sprintf(out, "VBR: %08lX", regs.vbr);
-    UpdateListboxString(hwnd, 3, out, TRUE);
 
-    hwnd = GetDlgItem(hDbgWnd, IDC_DBG_MISC);
+    ShowMiscCPU(GetDlgItem(hDbgWnd, IDC_DBG_MISCCPU));
+
+    hwnd = GetDlgItem(hDbgWnd, IDC_DBG_MMISC);
     sprintf(out, "T:     %d%d", regs.t1, regs.t0);
     UpdateListboxString(hwnd, 0, out, TRUE);
     sprintf(out, "S:     %d", regs.s);
@@ -895,6 +1264,8 @@ void update_debug_info(void)
     sprintf(out, "Prefetch: %04X (%s) %04X (%s)", regs.irc, lookup1->name, regs.ir, lookup2->name);
     UpdateListboxString(hwnd, 0, out, TRUE);
 
+    ShowCustomSmall(GetDlgItem(hDbgWnd, IDC_DBG_MCUSTOM));
+
     hwnd = GetDlgItem(hDbgWnd, IDC_DBG_FPREG);
     for (i = 0; i < 8; i++) {
         sprintf(out, "FP%d: %g", i, regs.fp[i]);
@@ -903,10 +1274,9 @@ void update_debug_info(void)
 
     hwnd = GetDlgItem(hDbgWnd, IDC_DBG_FPSR);
     fpsr = get_fpsr();
-    UpdateListboxString(hwnd, 0, ((fpsr & 0x8000000) != 0) ? "N:   1" : "N:   0", TRUE);
-    UpdateListboxString(hwnd, 1, ((fpsr & 0x4000000) != 0) ? "Z:   1" : "Z:   0", TRUE);
-    UpdateListboxString(hwnd, 2, ((fpsr & 0x2000000) != 0) ? "I:   1" : "I:   0", TRUE);
-    UpdateListboxString(hwnd, 3, ((fpsr & 0x1000000) != 0) ? "NAN: 1" : "NAN: 0", TRUE);
-
+    for (i = 0; i < 4; i++) {
+        sprintf(out, "%s%d", fpsrflag[i], (fpsr & (0x8000000 >> i)) != 0 ? 1 : 0);
+        UpdateListboxString(hwnd, i, out, TRUE);
+    }
     ShowPage(currpage, TRUE);
 }
index ee7b0d381b1b153a405d1cc913bc79749d740839..5c747a359a013fc0a98a6a394545764af255d15d 100755 (executable)
@@ -7,38 +7,4 @@ extern void WriteOutput(const char *out, int len);
 extern int GetInput (char *out, int maxlen);
 extern int console_get_gui (char *out, int maxlen);
 
-#include <pshpack2.h>
-typedef struct {
-    WORD dlgVer;
-    WORD signature;
-    DWORD helpID;
-    DWORD exStyle;
-    DWORD style;
-    WORD cDlgItems;
-    short x;
-    short y;
-    short cx;
-    short cy;
-} DLGTEMPLATEEX;
-
-typedef struct {
-    WORD pointsize;
-    WORD weight;
-    BYTE italic;
-    BYTE charset;
-    WCHAR typeface[0];
-} DLGTEMPLATEEX_END;
-
-typedef struct {
-    DWORD helpID;
-    DWORD exStyle;
-    DWORD style;
-    short x;
-    short y;
-    short cx;
-    short cy;
-    DWORD id;
-} DLGITEMTEMPLATEEX;
-#include <poppack.h>
-
 #endif
index f08a98e4f392dff7a5ed99d3d1125ab3d207d82c..dd4683f4d2d6faf74de5c49d19ca2e8d9c555377 100755 (executable)
 #define IDC_DBG_CCR                     1744
 #define IDC_DBG_AMEM                    1745
 #define IDC_DBG_SP_VBR                  1746
-#define IDC_DBG_MISC                    1747
+#define IDC_DBG_MMISC                   1747
 #define IDC_DBG_PC                      1748
 #define IDC_DBG_PREFETCH                1749
 #define IDC_DBG_FPREG                   1750
 #define IDC_DBG_MEMTOPC                 1759
 #define IDC_DBG_MEMUPFAST               1760
 #define IDC_DA_RESET                    1761
+#define IDC_DBG_STATUS                  1762
+#define IDC_DBG_BRKPTS                  1763
+#define IDC_DBG_MCUSTOM                 1764
+#define IDC_DBG_MISC                    1765
+#define IDC_DBG_CUSTOM                  1766
+#define IDC_DBG_MISCCPU                 1767
+
 #define ID__FLOPPYDRIVES                40004
 #define ID_FLOPPYDRIVES_DF0             40005
 #define ID_ST_CONFIGURATION             40010
 #define ID_DBG_PAGE4                    40023
 #define ID_DBG_PAGE5                    40024
 #define ID_DBG_PAGE6                    40025
+#define ID_DBG_PAGE7                    40026
+#define ID_DBG_PAGE8                    40027
+#define ID_DBG_PAGE9                    40028
 
 // Next default values for new objects
 // 
 #define _APS_NO_MFC                     1
 #define _APS_3D_CONTROLS                     1
 #define _APS_NEXT_RESOURCE_VALUE        253
-#define _APS_NEXT_COMMAND_VALUE         40026
-#define _APS_NEXT_CONTROL_VALUE         1761
+#define _APS_NEXT_COMMAND_VALUE         40029
+#define _APS_NEXT_CONTROL_VALUE         1768
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif
index 3bd8ede367838adc0765d37d0fbdc360367f98ff..22067ffe63c340d21666d6694cd80179a3949435 100755 (executable)
@@ -33,10 +33,15 @@ BEGIN
     VK_F4,          ID_DBG_PAGE4,           VIRTKEY, NOINVERT
     VK_F5,          ID_DBG_PAGE5,           VIRTKEY, NOINVERT
     VK_F6,          ID_DBG_PAGE6,           VIRTKEY, NOINVERT
+    VK_F7,          ID_DBG_PAGE7,           VIRTKEY, NOINVERT
+    VK_F8,          ID_DBG_PAGE8,           VIRTKEY, NOINVERT
+    VK_F9,          ID_DBG_PAGE9,           VIRTKEY, NOINVERT
     VK_DOWN,        IDC_DBG_MEMDOWN,        VIRTKEY, ALT, NOINVERT
     VK_RIGHT,       IDC_DBG_MEMDOWNFAST,    VIRTKEY, ALT, NOINVERT
     VK_UP,          IDC_DBG_MEMUP,          VIRTKEY, ALT, NOINVERT
     VK_LEFT,        IDC_DBG_MEMUPFAST,      VIRTKEY, ALT, NOINVERT
+    "h",            IDC_DBG_HELP,           VIRTKEY, ALT, NOINVERT
+    "p",            IDC_DBG_MEMTOPC,        VIRTKEY, ALT, NOINVERT
 END
 
 
@@ -813,7 +818,7 @@ BEGIN
     CTEXT           "Custom input event",IDC_STRINGBOX_TEXT,23,5,187,10,SS_CENTERIMAGE | WS_TABSTOP
 END
 
-IDD_DEBUGGER DIALOGEX 0, 0, 454, 298
+IDD_DEBUGGER DIALOGEX 0, 0, 454, 311
 STYLE DS_LOCALEDIT | DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_THICKFRAME
 EXSTYLE WS_EX_CONTROLPARENT
 CAPTION "WinUAE Debugger"
@@ -832,11 +837,17 @@ BEGIN
     LISTBOX         IDC_DBG_AMEM,106,1,231,66,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
     LISTBOX         IDC_DBG_CCR,338,1,57,42,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
     LISTBOX         IDC_DBG_SP_VBR,338,44,115,34,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
-    LISTBOX         IDC_DBG_MISC,396,1,57,42,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+    LISTBOX         IDC_DBG_MMISC,396,1,57,42,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
     LISTBOX         IDC_DBG_PC,1,68,52,10,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
     LISTBOX         IDC_DBG_PREFETCH,54,68,283,10,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
-    LISTBOX         IDC_DBG_FPREG,372,79,81,66,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
-    LISTBOX         IDC_DBG_FPSR,372,146,81,34,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+    LISTBOX         IDC_DBG_FPREG,372,218,81,66,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+    LISTBOX         IDC_DBG_FPSR,372,285,81,34,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+    LISTBOX         IDC_DBG_MISCCPU,372,319,81,34,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+    CONTROL         "",IDC_DBG_STATUS,"msctls_statusbar32",CCS_BOTTOM | SBARS_SIZEGRIP,0,298,453,12
+    LISTBOX         IDC_DBG_BRKPTS,1,79,370,205,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_VSCROLL
+    LISTBOX         IDC_DBG_MCUSTOM,372,79,81,138,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT
+    LISTBOX         IDC_DBG_MISC,1,79,370,205,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_VSCROLL
+    LISTBOX         IDC_DBG_CUSTOM,1,79,370,205,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_VSCROLL
 END
 
 
index ed613f0a1c80d6948bf6534e7fa0bf2573786e59..5cbfbcf767aa4824250010b3b74ea439d563fbce 100755 (executable)
@@ -1615,6 +1615,8 @@ int mousehack_allowed (void)
 void toggle_mousegrab (void)
 {
 }
+#define LOG_BOOT "winuaebootlog.txt"
+#define LOG_NORMAL "winuaelog.txt"
 
 void logging_open(int bootlog, int append)
 {
@@ -1623,9 +1625,9 @@ void logging_open(int bootlog, int append)
     debugfilename[0] = 0;
 #ifndef        SINGLEFILE
     if (currprefs.win32_logfile)
-       sprintf (debugfilename, "%swinuaelog.txt", start_path_data);
+       sprintf (debugfilename, "%s%s", start_path_data, LOG_NORMAL);
     if (bootlog)
-       sprintf (debugfilename, "%swinuaebootlog.txt", start_path_data);
+       sprintf (debugfilename, "%s%s", start_path_data, LOG_BOOT);
     if (debugfilename[0]) {
        if (!debugfile)
            debugfile = log_open (debugfilename, append, bootlog);
@@ -1647,6 +1649,8 @@ void logging_init(void)
        return;
     }
     if (first == 1) {
+       write_log("Log (%s): '%s%s'\n", currprefs.win32_logfile ? "enabled" : "disabled",
+           start_path_data, LOG_NORMAL);
        if (debugfile)
            log_close (debugfile);
        debugfile = 0;
@@ -2727,6 +2731,13 @@ static int process_arg(char **xargv)
        }
        if (i + 1 < argc) {
            char *np = argv[i + 1];
+
+           if (!strcmp (arg, "-trackmode")) {
+               extern int track_mode;
+               track_mode = getval (np);
+               i++;
+               continue;
+           }
            if (!strcmp (arg, "-affinity")) {
                cpu_affinity = getval (np);
                i++;
index 99ab4919371d65f5d43180eb119f18517ef3650b..61e35ea7c750dfd23917cda7c5b81f12eef69806 100755 (executable)
@@ -15,9 +15,9 @@
 #define GETBDM(x) (((x) - ((x / 10000) * 10000)) / 100)
 #define GETBDD(x) ((x) % 100)
 
-#define WINUAEBETA 9
+#define WINUAEBETA 10
 #define WINUAEPUBLICBETA 1
-#define WINUAEDATE MAKEBD(2007, 4, 25)
+#define WINUAEDATE MAKEBD(2007, 5, 1)
 //#define WINUAEEXTRA ""
 
 #define IHF_WINDOWHIDDEN 6
index 4d3aba7067377305c72c8650dd8eaa9c1d93e580..739a2edefe1a0239608c413b12504c6d3a79a837 100755 (executable)
@@ -26,6 +26,7 @@
 
 static int max_w, max_h, mult, pointsize;
 
+#include <pshpack2.h>
 typedef struct {
     WORD dlgVer;
     WORD signature;
@@ -40,6 +41,7 @@ typedef struct {
 /*
     sz_Or_Ord menu;
     sz_Or_Ord windowClass;
+    WCHAR title[titleLen];
 */
 } DLGTEMPLATEEX;
 
@@ -60,11 +62,13 @@ typedef struct {
     short cx;
     short cy;
     WORD id;
+    WORD reserved;
     WCHAR windowClass[0];
     /* variable data after this */
     /* sz_Or_Ord title; */
     /* WORD extraCount; */
 } DLGITEMTEMPLATEEX;
+#include <poppack.h>
 
 static int fontsdetected, font_vista_ok, font_xp_ok;
 static wchar_t wfont_vista[] = L"Segoe UI";
@@ -165,6 +169,7 @@ struct newresource *scaleresource(struct newresource *res, HWND parent)
     p = (BYTE*)d + sizeof (DLGTEMPLATEEX);
     p = skiptext(p);
     p = skiptext(p);
+    p = skiptext(p);
     d2 = (DLGTEMPLATEEX_END*)p;
     p2 = p;
     p2 += sizeof (DLGTEMPLATEEX_END);
index 56c1214992702c2245d14ac16813bf0a838c75f3..69501fa24717de49bdde9e42358d94719f2298c4 100755 (executable)
@@ -1,4 +1,15 @@
 
+Beta 10:
+
+- CDTV CDROM command 0x09 (play audio cd in lsn mode) fixed, parameters
+  are start sector and number of sectors, not start and end sector..
+- state file load: keep current disk in drive if image's path in state
+  file does not exist. (keeps some programs happy that don't access the
+  disk but start complaining if disk is suddenly ejected)
+- fixed stupid typo in fpu clamping fix (327676 instead of 32767..)
+- CDTV audio cd end position detection didn't always work
+- GUI debugger improvements (Karsten Bock & TW)
+
 Beta 9:
 
 - new PAL filter configuration file support (forgot it in b8)
@@ -9,13 +20,12 @@ Beta 9:
   enabled (uaescsi, uaeserial, bsdsocket etc..) Previously it was
   only mapped if filesystem (directory or hdf) was configured.
 - IDE non-RDB HDF statefile support added
-- filter default centering fixed (I think..)
+- filter default centering fixed (I think..) and other related tweaks
 - minor FPU updates to very rarely used instructions (from aranym)
 - "cpu060_revision" config entry added ("read-only", not created when
   saving config), sets 68060 revision field in PCR register (current
   default is 1)
 
-
 Beta 8:
 
 - very long CDTV CD reads don't freeze anymore (overflow in CD