vice-emu-commit Mailing List for VICE (Page 28)
Versatile Commodore Emulator
                
                Brought to you by:
                
                    blackystardust,
                    
                
                    gpz
                    
                
            
            
        
        
        
    You can subscribe to this list here.
| 2008 | Jan | Feb | Mar | Apr (38) | May (60) | Jun (122) | Jul (148) | Aug (178) | Sep (151) | Oct (131) | Nov (208) | Dec (129) | 
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2009 | Jan (193) | Feb (209) | Mar (221) | Apr (243) | May (165) | Jun (168) | Jul (198) | Aug (161) | Sep (103) | Oct (98) | Nov (168) | Dec (99) | 
| 2010 | Jan (263) | Feb (156) | Mar (57) | Apr (93) | May (85) | Jun (124) | Jul (57) | Aug (58) | Sep (113) | Oct (148) | Nov (114) | Dec (193) | 
| 2011 | Jan (200) | Feb (207) | Mar (91) | Apr (91) | May (142) | Jun (104) | Jul (115) | Aug (137) | Sep (266) | Oct (91) | Nov (85) | Dec (186) | 
| 2012 | Jan (98) | Feb (146) | Mar (160) | Apr (99) | May (59) | Jun (257) | Jul (84) | Aug (103) | Sep (169) | Oct (206) | Nov (90) | Dec (296) | 
| 2013 | Jan (294) | Feb (130) | Mar (36) | Apr (14) | May (51) | Jun (74) | Jul (180) | Aug (85) | Sep (26) | Oct (45) | Nov (29) | Dec (21) | 
| 2014 | Jan (56) | Feb (40) | Mar (57) | Apr (30) | May (31) | Jun (11) | Jul (107) | Aug (135) | Sep (142) | Oct (195) | Nov (139) | Dec (133) | 
| 2015 | Jan (293) | Feb (161) | Mar (146) | Apr (85) | May (139) | Jun (51) | Jul (21) | Aug (24) | Sep (29) | Oct (136) | Nov (212) | Dec (118) | 
| 2016 | Jan (119) | Feb (165) | Mar (229) | Apr (219) | May (134) | Jun (119) | Jul (134) | Aug (236) | Sep (203) | Oct (215) | Nov (300) | Dec (140) | 
| 2017 | Jan (188) | Feb (20) | Mar (147) | Apr (198) | May (26) | Jun (21) | Jul (67) | Aug (219) | Sep (209) | Oct (194) | Nov (144) | Dec (99) | 
| 2018 | Jan (139) | Feb (122) | Mar (116) | Apr (85) | May (232) | Jun (181) | Jul (190) | Aug (105) | Sep (92) | Oct (178) | Nov (105) | Dec (86) | 
| 2019 | Jan (119) | Feb (79) | Mar (74) | Apr (117) | May (115) | Jun (307) | Jul (107) | Aug (131) | Sep (103) | Oct (60) | Nov (118) | Dec (70) | 
| 2020 | Jan (114) | Feb (103) | Mar (77) | Apr (121) | May (193) | Jun (110) | Jul (214) | Aug (210) | Sep (179) | Oct (260) | Nov (237) | Dec (334) | 
| 2021 | Jan (163) | Feb (186) | Mar (58) | Apr (81) | May (108) | Jun (175) | Jul (154) | Aug (180) | Sep (217) | Oct (204) | Nov (232) | Dec (190) | 
| 2022 | Jan (253) | Feb (134) | Mar (229) | Apr (190) | May (125) | Jun (70) | Jul (8) | Aug (22) | Sep (19) | Oct (33) | Nov (94) | Dec (164) | 
| 2023 | Jan (158) | Feb (366) | Mar (272) | Apr (109) | May (198) | Jun (226) | Jul (200) | Aug (94) | Sep (108) | Oct (62) | Nov (175) | Dec (116) | 
| 2024 | Jan (35) | Feb (40) | Mar (51) | Apr (89) | May (24) | Jun (26) | Jul (53) | Aug (71) | Sep (23) | Oct (11) | Nov (22) | Dec (58) | 
| 2025 | Jan (26) | Feb (40) | Mar (107) | Apr (39) | May (35) | Jun (20) | Jul (11) | Aug (24) | Sep (35) | Oct (28) | Nov | Dec | 
| 
      
      
      From: <gp...@us...> - 2024-04-15 20:46:21
      
     | 
| Revision: 45125
          http://sourceforge.net/p/vice-emu/code/45125
Author:   gpz
Date:     2024-04-15 20:46:19 +0000 (Mon, 15 Apr 2024)
Log Message:
-----------
we need this file, too :)
Modified Paths:
--------------
    trunk/vice/src/cartridge.h
Modified: trunk/vice/src/cartridge.h
===================================================================
--- trunk/vice/src/cartridge.h	2024-04-15 20:37:38 UTC (rev 45124)
+++ trunk/vice/src/cartridge.h	2024-04-15 20:46:19 UTC (rev 45125)
@@ -536,6 +536,9 @@
  * plus4 cartridge system
  */
 
+#define CARTRIDGE_PLUS4_DIGIBLASTER   -201 /* digiblaster.c */
+#define CARTRIDGE_PLUS4_SIDCART       -200 /* plus4-sidcart.c */
+
 #define CARTRIDGE_PLUS4_GENERIC         -2 /* plus4-generic.c */
 
 /* #define CARTRIDGE_NONE               -1 */
@@ -561,6 +564,9 @@
 #define CARTRIDGE_PLUS4_GENERIC_ALL     (CARTRIDGE_PLUS4_GENERIC_C1 | CARTRIDGE_PLUS4_GENERIC_C2)
 
 /* list of canonical names for the Plus4 cartridges: */
+#define CARTRIDGE_PLUS4_NAME_GENERIC    "generic cartridge ROM"
+#define CARTRIDGE_PLUS4_NAME_DIGIBLASTER    "Digiblaster Add-on"
+#define CARTRIDGE_PLUS4_NAME_SIDCART        "SID cartridge"
 #define CARTRIDGE_PLUS4_NAME_JACINT1MB  "1MB Cartridge"
 #define CARTRIDGE_PLUS4_NAME_MAGIC      "c264 magic cart"
 #define CARTRIDGE_PLUS4_NAME_MULTI      "Plus4 multi cart"
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gp...@us...> - 2024-04-15 20:37:41
      
     | 
| Revision: 45124
          http://sourceforge.net/p/vice-emu/code/45124
Author:   gpz
Date:     2024-04-15 20:37:38 +0000 (Mon, 15 Apr 2024)
Log Message:
-----------
make expansion port system (and 'exp' command) work like in other emus, move sid-card and digiblaster to cartridges
Modified Paths:
--------------
    trunk/vice/src/export.h
    trunk/vice/src/plus4/Makefile.am
    trunk/vice/src/plus4/cart/Makefile.am
    trunk/vice/src/plus4/cart/debugcart.c
    trunk/vice/src/plus4/cart/jacint1mb.c
    trunk/vice/src/plus4/cart/magiccart.c
    trunk/vice/src/plus4/cart/multicart.c
    trunk/vice/src/plus4/cart/plus4-generic.c
    trunk/vice/src/plus4/cart/plus4cart.c
    trunk/vice/src/plus4/plus4.c
    trunk/vice/src/plus4/plus4mem.h
Added Paths:
-----------
    trunk/vice/src/plus4/cart/digiblaster.c
    trunk/vice/src/plus4/cart/digiblaster.h
    trunk/vice/src/plus4/cart/plus4-sidcart.c
    trunk/vice/src/plus4/plus4export.c
Removed Paths:
-------------
    trunk/vice/src/plus4/digiblaster.c
    trunk/vice/src/plus4/digiblaster.h
    trunk/vice/src/plus4/plus4-sidcart.c
Modified: trunk/vice/src/export.h
===================================================================
--- trunk/vice/src/export.h	2024-04-15 08:43:26 UTC (rev 45123)
+++ trunk/vice/src/export.h	2024-04-15 20:37:38 UTC (rev 45124)
@@ -33,9 +33,9 @@
 typedef struct export_resource_s {
     const char *name;
     unsigned int game;
-    unsigned int exrom; /* VIC20: export "blocks" flags */
-    io_source_t *io1;   /* VIC20: IO2 device */
-    io_source_t *io2;   /* VIC20: IO3 device */
+    unsigned int exrom; /* VIC20, CBM2, PLUS4: export "blocks" flags */
+    io_source_t *io1;   /* VIC20: IO2 device, PLUS4: $fdxx device */
+    io_source_t *io2;   /* VIC20: IO3 device, PLUS4: $fexx device */
     unsigned int cartid;
 } export_resource_t;
 
Modified: trunk/vice/src/plus4/Makefile.am
===================================================================
--- trunk/vice/src/plus4/Makefile.am	2024-04-15 08:43:26 UTC (rev 45123)
+++ trunk/vice/src/plus4/Makefile.am	2024-04-15 20:37:38 UTC (rev 45124)
@@ -36,13 +36,10 @@
 	plus4-stubs.c
 
 libplus4_a_SOURCES = \
-	digiblaster.c \
-	digiblaster.h \
 	plus4-cmdline-options.c \
 	plus4-cmdline-options.h \
 	plus4-resources.c \
 	plus4-resources.h \
-	plus4-sidcart.c \
 	plus4-snapshot.c \
 	plus4-snapshot.h \
 	plus4.c \
@@ -53,6 +50,7 @@
 	plus4cpu.c \
 	plus4datasette.c \
 	plus4drive.c \
+	plus4export.c \
 	plus4iec.c \
 	plus4iec.h \
 	plus4io.c \
Modified: trunk/vice/src/plus4/cart/Makefile.am
===================================================================
--- trunk/vice/src/plus4/cart/Makefile.am	2024-04-15 08:43:26 UTC (rev 45123)
+++ trunk/vice/src/plus4/cart/Makefile.am	2024-04-15 20:37:38 UTC (rev 45124)
@@ -4,6 +4,9 @@
 	-I$(top_builddir)/src \
 	-I$(top_srcdir)/src \
 	-I$(top_srcdir)/src/plus4 \
+	-I$(top_srcdir)/src/joyport \
+	-I$(top_srcdir)/src/samplerdrv \
+	-I$(top_srcdir)/src/sid \
 	-I$(top_srcdir)/src/arch/shared
 
 AM_CFLAGS = @VICE_CFLAGS@
@@ -20,8 +23,11 @@
 	plus4cart.c \
 	debugcart.h \
 	debugcart.c \
+	digiblaster.c \
+	digiblaster.h \
 	plus4-generic.h \
 	plus4-generic.c \
+	plus4-sidcart.c \
 	jacint1mb.h \
 	jacint1mb.c \
 	magiccart.h \
Modified: trunk/vice/src/plus4/cart/debugcart.c
===================================================================
--- trunk/vice/src/plus4/cart/debugcart.c	2024-04-15 08:43:26 UTC (rev 45123)
+++ trunk/vice/src/plus4/cart/debugcart.c	2024-04-15 20:37:38 UTC (rev 45124)
@@ -26,11 +26,11 @@
 
 #include "vice.h"
 
-/*#include "plus4export.h"*/
 #include "archdep.h"
 #include "cartio.h"
 #include "cartridge.h"
 #include "cmdline.h"
+#include "export.h"
 #include "lib.h"
 #include "resources.h"
 #include "machine.h"
@@ -65,9 +65,9 @@
 
 static io_source_list_t *debugcart_list_item = NULL;
 
-/*static const plus4export_resource_t export_res = {
+static const export_resource_t export_res = {
     CARTRIDGE_NAME_DEBUGCART, 0, 0, &debugcart_device, NULL, CARTRIDGE_DEBUGCART
-};*/
+};
 
 /* ------------------------------------------------------------------------- */
 
@@ -86,12 +86,15 @@
         return -1;
     }*/
     debugcart_list_item = io_source_register(&debugcart_device);
+    if (export_add(&export_res) < 0) {
+        return -1;
+    }
     return 0;
 }
 
 static void debugcart_disable(void)
 {
-    /*plus4export_remove(&export_res);*/
+    export_remove(&export_res);
     io_source_unregister(debugcart_list_item);
     debugcart_list_item = NULL;
 }
Copied: trunk/vice/src/plus4/cart/digiblaster.c (from rev 45123, trunk/vice/src/plus4/digiblaster.c)
===================================================================
--- trunk/vice/src/plus4/cart/digiblaster.c	                        (rev 0)
+++ trunk/vice/src/plus4/cart/digiblaster.c	2024-04-15 20:37:38 UTC (rev 45124)
@@ -0,0 +1,299 @@
+/*
+ * digiblaster.c - DigiBlaster DAC/ADC cartridge emulation.
+ *
+ * Written by
+ *  Marco van den Heuvel <bla...@ya...>
+ *
+ * This file is part of VICE, the Versatile Commodore Emulator.
+ * See README for copyright notice.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ *  02111-1307  USA.
+ *
+ */
+
+#include "vice.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "cartio.h"
+#include "cartridge.h"
+#include "cmdline.h"
+#include "digiblaster.h"
+#include "export.h"
+#include "lib.h"
+#include "maincpu.h"
+#include "plus4mem.h"
+#include "resources.h"
+#include "sampler.h"
+#include "sidcart.h"
+#include "sound.h"
+#include "uiapi.h"
+
+/* ---------------------------------------------------------------------*/
+
+/* Some prototypes are needed */
+static int digiblaster_sound_machine_init(sound_t *psid, int speed, int cycles_per_sec);
+static void digiblaster_sound_machine_store(sound_t *psid, uint16_t addr, uint8_t val);
+static void digiblaster_sound_reset(sound_t *psid, CLOCK cpu_clk);
+
+#ifdef SOUND_SYSTEM_FLOAT
+static int digiblaster_sound_machine_calculate_samples(sound_t **psid, float *pbuf, int nr, int sound_chip_channels, CLOCK *delta_t);
+#else
+static int digiblaster_sound_machine_calculate_samples(sound_t **psid, int16_t *pbuf, int nr, int sound_output_channels, int sound_chip_channels, CLOCK *delta_t);
+#endif
+
+static int digiblaster_sound_machine_cycle_based(void)
+{
+    return 0;
+}
+
+static int digiblaster_sound_machine_channels(void)
+{
+    return 1;
+}
+
+#ifdef SOUND_SYSTEM_FLOAT
+/* stereo mixing placement of the PLUS4 DigiBlaster cartridge sound */
+static sound_chip_mixing_spec_t digiblaster_sound_mixing_spec[SOUND_CHIP_CHANNELS_MAX] = {
+    {
+        100, /* left channel volume % in case of stereo output, default output to both */
+        100  /* right channel volume % in case of stereo output, default output to both */
+    }
+};
+#endif
+
+/* PLUS4 DigiBlaster cartridge sound chip */
+static sound_chip_t digiblaster_sound_chip = {
+    NULL,                                        /* NO sound chip open function */
+    digiblaster_sound_machine_init,              /* sound chip init function */
+    NULL,                                        /* NO sound chip close function */
+    digiblaster_sound_machine_calculate_samples, /* sound chip calculate samples function */
+    digiblaster_sound_machine_store,             /* sound chip store function */
+    NULL,                                        /* NO sound chip read function */
+    digiblaster_sound_reset,                     /* sound chip reset function */
+    digiblaster_sound_machine_cycle_based,       /* sound chip 'is_cycle_based()' function, chip is NOT cycle based */
+    digiblaster_sound_machine_channels,          /* sound chip 'get_amount_of_channels()' function, sound chip has 1 channel */
+#ifdef SOUND_SYSTEM_FLOAT
+    digiblaster_sound_mixing_spec,               /* stereo mixing placement specs */
+#endif
+    0                                            /* sound chip enabled flag, toggled upon device (de-)activation */
+};
+
+static uint16_t digiblaster_sound_chip_offset = 0;
+static sound_dac_t digiblaster_dac;
+
+void digiblaster_sound_chip_init(void)
+{
+    digiblaster_sound_chip_offset = sound_chip_register(&digiblaster_sound_chip);
+}
+
+/* ---------------------------------------------------------------------*/
+
+/* Some prototypes */
+static uint8_t digiblaster_read(uint16_t addr);
+static void digiblaster_store(uint16_t addr, uint8_t value);
+
+static io_source_t digiblaster_fd5e_device = {
+    "DigiBlaster",        /* name of the device */
+    IO_DETACH_RESOURCE,   /* use resource to detach the device when involved in a read-collision */
+    "DIGIBLASTER",        /* resource to set to '0' */
+    0xfd5e, 0xfd5f, 0x01, /* range for the device, regs:$fd5e-$fd5f */
+    1,                    /* read is always valid */
+    digiblaster_store,    /* store function */
+    NULL,                 /* NO poke function */
+    digiblaster_read,     /* read function */
+    NULL,                 /* TODO: peek function */
+    NULL,                 /* nothing to dump */
+    CARTRIDGE_PLUS4_DIGIBLASTER,      /* cartridge id */
+    IO_PRIO_NORMAL,       /* normal priority, device read needs to be checked for collisions */
+    0,                    /* insertion order, gets filled in by the registration function */
+    IO_MIRROR_NONE        /* NO mirroring */
+};
+
+static io_source_t digiblaster_fe9e_device = {
+    "DigiBlaster",        /* name of the device */
+    IO_DETACH_RESOURCE,   /* use resource to detach the device when involved in a read-collision */
+    "DIGIBLASTER",        /* resource to set to '0' */
+    0xfe9e, 0xfe9f, 0x01, /* range for the device, regs:$fe9e-$fe9f */
+    1,                    /* read is always valid */
+    digiblaster_store,    /* store function */
+    NULL,                 /* NO poke function */
+    digiblaster_read,     /* read function */
+    NULL,                 /* TODO: peek function */
+    NULL,                 /* nothing to dump */
+    CARTRIDGE_PLUS4_DIGIBLASTER,      /* cartridge id */
+    IO_PRIO_NORMAL,       /* normal priority, device read needs to be checked for collisions */
+    0,                    /* insertion order, gets filled in by the registration function */
+    IO_MIRROR_NONE        /* NO mirroring */
+};
+
+static io_source_list_t *digiblaster_list_item = NULL;
+
+static const export_resource_t export_res1 = {
+    CARTRIDGE_PLUS4_NAME_DIGIBLASTER, 0, 0, &digiblaster_fd5e_device, NULL, CARTRIDGE_PLUS4_DIGIBLASTER
+};
+
+static const export_resource_t export_res2 = {
+    CARTRIDGE_PLUS4_NAME_DIGIBLASTER, 0, 0, NULL, &digiblaster_fe9e_device, CARTRIDGE_PLUS4_DIGIBLASTER
+};
+
+void digiblaster_set_address(uint16_t addr)
+{
+    if (digiblaster_sound_chip.chip_enabled) {
+        io_source_unregister(digiblaster_list_item);
+        export_remove(&export_res1);
+        export_remove(&export_res2);
+        if (addr == 0xfd40) {
+            digiblaster_list_item = io_source_register(&digiblaster_fd5e_device);
+            if (export_add(&export_res1) < 0) {
+                return -1;
+            }
+        } else {
+            digiblaster_list_item = io_source_register(&digiblaster_fe9e_device);
+            if (export_add(&export_res2) < 0) {
+                return -1;
+            }
+        }
+    }
+}
+
+int digiblaster_enabled(void)
+{
+    return digiblaster_sound_chip.chip_enabled;
+}
+
+static int set_digiblaster_enabled(int value, void *param)
+{
+    int val = value ? 1 : 0;
+
+    if (digiblaster_sound_chip.chip_enabled == val) {
+        return 0;
+    }
+
+    if (val) {
+        export_remove(&export_res1);
+        export_remove(&export_res2);
+        if (sidcart_address == 0xfd40) {
+            digiblaster_list_item = io_source_register(&digiblaster_fd5e_device);
+            if (export_add(&export_res1) < 0) {
+                return -1;
+            }
+        } else {
+            digiblaster_list_item = io_source_register(&digiblaster_fe9e_device);
+            if (export_add(&export_res2) < 0) {
+                return -1;
+            }
+        }
+        sampler_start(SAMPLER_OPEN_MONO, "DigiBlaster");
+    } else {
+        io_source_unregister(digiblaster_list_item);
+        digiblaster_list_item = NULL;
+        sampler_stop();
+    }
+
+    digiblaster_sound_chip.chip_enabled = val ? 1 : 0;
+
+    return 0;
+}
+
+static const resource_int_t resources_int[] = {
+    { "DIGIBLASTER", 0, RES_EVENT_STRICT, (resource_value_t)0,
+      &digiblaster_sound_chip.chip_enabled, set_digiblaster_enabled, NULL },
+    RESOURCE_INT_LIST_END
+};
+
+int digiblaster_resources_init(void)
+{
+    return resources_register_int(resources_int);
+}
+
+static const cmdline_option_t cmdline_options[] =
+{
+    { "-digiblaster", SET_RESOURCE, CMDLINE_ATTRIB_NONE,
+      NULL, NULL, "DIGIBLASTER", (resource_value_t)1,
+      NULL, "Enable the digiblaster add-on" },
+    { "+digiblaster", SET_RESOURCE, CMDLINE_ATTRIB_NONE,
+      NULL, NULL, "DIGIBLASTER", (resource_value_t)0,
+      NULL, "Disable the digiblaster add-on" },
+    CMDLINE_LIST_END
+};
+
+int digiblaster_cmdline_options_init(void)
+{
+    return cmdline_register_options(cmdline_options);
+}
+
+/* ---------------------------------------------------------------------*/
+
+static uint8_t digiblaster_sound_data;
+
+struct digiblaster_sound_s {
+    uint8_t voice0;
+};
+
+static struct digiblaster_sound_s snd;
+
+#ifdef SOUND_SYSTEM_FLOAT
+/* FIXME */
+static int digiblaster_sound_machine_calculate_samples(sound_t **psid, float *pbuf, int nr, int scc, CLOCK *delta_t)
+{
+    return sound_dac_calculate_samples(&digiblaster_dac, pbuf, (int)snd.voice0 * 128, nr);
+}
+#else
+static int digiblaster_sound_machine_calculate_samples(sound_t **psid, int16_t *pbuf, int nr, int soc, int scc, CLOCK *delta_t)
+{
+    return sound_dac_calculate_samples(&digiblaster_dac, pbuf, (int)snd.voice0 * 128, nr, soc, (soc == SOUND_OUTPUT_STEREO) ? SOUND_CHANNELS_1_AND_2 : SOUND_CHANNEL_1);
+}
+#endif
+
+static int digiblaster_sound_machine_init(sound_t *psid, int speed, int cycles_per_sec)
+{
+    sound_dac_init(&digiblaster_dac, speed);
+    snd.voice0 = 0;
+
+    return 1;
+}
+
+static void digiblaster_sound_machine_store(sound_t *psid, uint16_t addr, uint8_t val)
+{
+    snd.voice0 = val;
+}
+
+static void digiblaster_sound_reset(sound_t *psid, CLOCK cpu_clk)
+{
+    snd.voice0 = 0;
+    digiblaster_sound_data = 0;
+}
+
+/* ---------------------------------------------------------------------*/
+
+static void digiblaster_store(uint16_t addr, uint8_t value)
+{
+    if ((addr & 1) == 0) {
+        digiblaster_sound_data = value;
+        sound_store(digiblaster_sound_chip_offset, value, 0);
+    }
+}
+
+static uint8_t digiblaster_read(uint16_t addr)
+{
+    if ((addr & 1) == 0) {
+        return sound_read(digiblaster_sound_chip_offset, 0);
+    }
+    return sampler_get_sample(SAMPLER_CHANNEL_DEFAULT);
+}
Copied: trunk/vice/src/plus4/cart/digiblaster.h (from rev 45123, trunk/vice/src/plus4/digiblaster.h)
===================================================================
--- trunk/vice/src/plus4/cart/digiblaster.h	                        (rev 0)
+++ trunk/vice/src/plus4/cart/digiblaster.h	2024-04-15 20:37:38 UTC (rev 45124)
@@ -0,0 +1,41 @@
+/*
+ * digiblaster.h
+ *
+ * Written by
+ *  Marco van den Heuvel <bla...@ya...>
+ *
+ * This file is part of VICE, the Versatile Commodore Emulator.
+ * See README for copyright notice.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ *  02111-1307  USA.
+ *
+ */
+
+#ifndef VICE_DIGIBLASTER_H
+#define VICE_DIGIBLASTER_H
+
+#include "types.h"
+#include "sound.h"
+
+int digiblaster_resources_init(void);
+int digiblaster_cmdline_options_init(void);
+
+void digiblaster_sound_chip_init(void);
+int digiblaster_enabled(void);
+
+void digiblaster_set_address(uint16_t addr);
+
+#endif
Modified: trunk/vice/src/plus4/cart/jacint1mb.c
===================================================================
--- trunk/vice/src/plus4/cart/jacint1mb.c	2024-04-15 08:43:26 UTC (rev 45123)
+++ trunk/vice/src/plus4/cart/jacint1mb.c	2024-04-15 20:37:38 UTC (rev 45124)
@@ -43,6 +43,7 @@
 #include "cartridge.h"
 #include "cartio.h"
 #include "crt.h"
+#include "export.h"
 #include "lib.h"
 #include "monitor.h"
 #include "plus4cart.h"
@@ -89,6 +90,12 @@
 
 static io_source_list_t *jacint1mb_list_item = NULL;
 
+static const export_resource_t export_res = {
+    CARTRIDGE_PLUS4_NAME_JACINT1MB, 0, PLUS4_CART_C1LO, NULL, &jacint1mb_device, CARTRIDGE_PLUS4_JACINT1MB
+};
+
+/* ------------------------------------------------------------------------- */
+
 static int jacint1mb_dump(void)
 {
     mon_out("ROM bank: %d\n", bankreg);
@@ -129,6 +136,9 @@
     }
 
     jacint1mb_list_item = io_source_register(&jacint1mb_device);
+    if (export_add(&export_res) < 0) {
+        return -1;
+    }
 
     return 0;
 }
@@ -177,6 +187,7 @@
 void jacint1mb_detach(void)
 {
     DBG(("jacint1mb_detach\n"));
+    export_remove(&export_res);
     if (jacint1mb_list_item) {
         io_source_unregister(jacint1mb_list_item);
     }
Modified: trunk/vice/src/plus4/cart/magiccart.c
===================================================================
--- trunk/vice/src/plus4/cart/magiccart.c	2024-04-15 08:43:26 UTC (rev 45123)
+++ trunk/vice/src/plus4/cart/magiccart.c	2024-04-15 20:37:38 UTC (rev 45124)
@@ -43,6 +43,7 @@
 #include "cartridge.h"
 #include "cartio.h"
 #include "crt.h"
+#include "export.h"
 #include "lib.h"
 #include "monitor.h"
 #include "plus4cart.h"
@@ -88,6 +89,12 @@
 
 static io_source_list_t *magiccart_list_item = NULL;
 
+static const export_resource_t export_res = {
+    CARTRIDGE_PLUS4_NAME_MAGIC, 0, PLUS4_CART_C1LO, &magiccart_device, NULL, CARTRIDGE_PLUS4_MAGIC
+};
+
+/* ------------------------------------------------------------------------- */
+
 static int magiccart_dump(void)
 {
     mon_out("ROM bank: %d\n", bankreg);
@@ -129,6 +136,10 @@
 
     magiccart_list_item = io_source_register(&magiccart_device);
 
+    if (export_add(&export_res) < 0) {
+        return -1;
+    }
+
     return 0;
 }
 
@@ -223,6 +234,7 @@
 void magiccart_detach(void)
 {
     DBG(("magiccart_detach\n"));
+    export_remove(&export_res);
     if (magiccart_list_item) {
         io_source_unregister(magiccart_list_item);
     }
Modified: trunk/vice/src/plus4/cart/multicart.c
===================================================================
--- trunk/vice/src/plus4/cart/multicart.c	2024-04-15 08:43:26 UTC (rev 45123)
+++ trunk/vice/src/plus4/cart/multicart.c	2024-04-15 20:37:38 UTC (rev 45124)
@@ -43,6 +43,7 @@
 #include "cartridge.h"
 #include "cartio.h"
 #include "crt.h"
+#include "export.h"
 #include "lib.h"
 #include "monitor.h"
 #include "plus4cart.h"
@@ -91,6 +92,12 @@
 
 static io_source_list_t *multicart_list_item = NULL;
 
+static const export_resource_t export_res = {
+    CARTRIDGE_PLUS4_NAME_MULTI, 0, PLUS4_CART_C1LO | PLUS4_CART_C1HI, &multicart_device, NULL, CARTRIDGE_PLUS4_MULTI
+};
+
+/* ------------------------------------------------------------------------- */
+
 static int multicart_dump(void)
 {
     mon_out("ROM bank: %d\n", bankreg);
@@ -142,6 +149,9 @@
     }
 
     multicart_list_item = io_source_register(&multicart_device);
+    if (export_add(&export_res) < 0) {
+        return -1;
+    }
 
     return 0;
 }
@@ -225,6 +235,7 @@
 void multicart_detach(void)
 {
     DBG(("multicart_detach\n"));
+    export_remove(&export_res);
     if (multicart_list_item) {
         io_source_unregister(multicart_list_item);
     }
Modified: trunk/vice/src/plus4/cart/plus4-generic.c
===================================================================
--- trunk/vice/src/plus4/cart/plus4-generic.c	2024-04-15 08:43:26 UTC (rev 45123)
+++ trunk/vice/src/plus4/cart/plus4-generic.c	2024-04-15 20:37:38 UTC (rev 45124)
@@ -37,6 +37,7 @@
 #include "cartio.h"
 #include "cmdline.h"
 #include "crt.h"
+#include "export.h"
 #include "lib.h"
 #include "log.h"
 #include "machine.h"
@@ -75,6 +76,21 @@
 uint8_t extromlo2[PLUS4_C1LO_ROM_SIZE];
 uint8_t extromhi2[PLUS4_C1HI_ROM_SIZE];
 
+static export_resource_t export_res1l = {
+    CARTRIDGE_PLUS4_NAME_GENERIC, 0, PLUS4_CART_C1LO, NULL, NULL, CARTRIDGE_PLUS4_GENERIC
+};
+static export_resource_t export_res1h = {
+    CARTRIDGE_PLUS4_NAME_GENERIC, 0, PLUS4_CART_C1HI, NULL, NULL, CARTRIDGE_PLUS4_GENERIC
+};
+static export_resource_t export_res2l = {
+    CARTRIDGE_PLUS4_NAME_GENERIC, 0, PLUS4_CART_C2LO, NULL, NULL, CARTRIDGE_PLUS4_GENERIC
+};
+static export_resource_t export_res2h = {
+    CARTRIDGE_PLUS4_NAME_GENERIC, 0, PLUS4_CART_C2HI, NULL, NULL, CARTRIDGE_PLUS4_GENERIC
+};
+
+/* ------------------------------------------------------------------------- */
+
 uint8_t generic_c1lo_read(uint16_t addr)
 {
     DBGRW(("generic_c1lo_read %04x %02x", addr, extromlo2[addr & 0x3fff]));
@@ -120,6 +136,26 @@
 static int generic_common_attach(void)
 {
     DBG(("generic_common_attach (type :%04x)", (unsigned)generic_type));
+    if ((generic_type & CARTRIDGE_PLUS4_GENERIC_TYPE_MASK) & CARTRIDGE_PLUS4_GENERIC_C1LO) {
+        if (export_add(&export_res1l) < 0) {
+            return -1;
+        }
+    }
+    if ((generic_type & CARTRIDGE_PLUS4_GENERIC_TYPE_MASK) & CARTRIDGE_PLUS4_GENERIC_C1HI) {
+        if (export_add(&export_res1h) < 0) {
+            return -1;
+        }
+    }
+    if ((generic_type & CARTRIDGE_PLUS4_GENERIC_TYPE_MASK) & CARTRIDGE_PLUS4_GENERIC_C2LO) {
+        if (export_add(&export_res2l) < 0) {
+            return -1;
+        }
+    }
+    if ((generic_type & CARTRIDGE_PLUS4_GENERIC_TYPE_MASK) & CARTRIDGE_PLUS4_GENERIC_C2HI) {
+        if (export_add(&export_res2h) < 0) {
+            return -1;
+        }
+    }
 
     return generic_type;
 }
@@ -290,18 +326,22 @@
     if (type & CARTRIDGE_PLUS4_GENERIC_TYPE_MASK & CARTRIDGE_PLUS4_GENERIC_C1LO) {
         resources_set_string("c1loName", "");
         memset(extromlo2, 0xff, PLUS4_CART16K_SIZE);
+        export_remove(&export_res1l);
     }
     if (type & CARTRIDGE_PLUS4_GENERIC_TYPE_MASK & CARTRIDGE_PLUS4_GENERIC_C1HI) {
         resources_set_string("c1hiName", "");
         memset(extromhi2, 0xff, PLUS4_CART16K_SIZE);
+        export_remove(&export_res1h);
     }
     if (type & CARTRIDGE_PLUS4_GENERIC_TYPE_MASK & CARTRIDGE_PLUS4_GENERIC_C2LO) {
         resources_set_string("c2loName", "");
         memset(extromlo3, 0xff, PLUS4_CART16K_SIZE);
+        export_remove(&export_res2l);
     }
     if (type & CARTRIDGE_PLUS4_GENERIC_TYPE_MASK & CARTRIDGE_PLUS4_GENERIC_C2HI) {
         resources_set_string("c2hiName", "");
         memset(extromhi3, 0xff, PLUS4_CART16K_SIZE);
+        export_remove(&export_res2h);
     }
 
     generic_type &= ~(type & CARTRIDGE_PLUS4_GENERIC_TYPE_MASK);
Copied: trunk/vice/src/plus4/cart/plus4-sidcart.c (from rev 45123, trunk/vice/src/plus4/plus4-sidcart.c)
===================================================================
--- trunk/vice/src/plus4/cart/plus4-sidcart.c	                        (rev 0)
+++ trunk/vice/src/plus4/cart/plus4-sidcart.c	2024-04-15 20:37:38 UTC (rev 45124)
@@ -0,0 +1,372 @@
+/*
+ * sidcartjoy.c - SIDCART joystick port emulation.
+ *
+ * Written by
+ *  Marco van den Heuvel <bla...@ya...>
+ *
+ * This file is part of VICE, the Versatile Commodore Emulator.
+ * See README for copyright notice.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ *  02111-1307  USA.
+ *
+ */
+
+#include "vice.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "cartio.h"
+#include "cartridge.h"
+#include "cmdline.h"
+#include "digiblaster.h"
+#include "export.h"
+#include "joyport.h"
+#include "keyboard.h"
+#include "plus4.h"
+#include "resources.h"
+#include "sid.h"
+#include "sid-cmdline-options.h"
+#include "sid-resources.h"
+#include "sidcart.h"
+#include "sound.h"
+#include "types.h"
+#include "uiapi.h"
+
+int sidcartjoy_enabled = 0;
+
+int sidcart_address = 0xfd40;
+int sidcart_clock = 1;
+
+/* ------------------------------------------------------------------------- */
+
+static int sidcart_sound_machine_init(sound_t *psid, int speed, int cycles_per_sec)
+{
+    if (!sidcart_clock) {
+        if (cycles_per_sec == PLUS4_PAL_CYCLES_PER_SEC) {
+            return sid_sound_machine_init_vbr(psid, speed, cycles_per_sec, 1800);
+        } else {
+            return sid_sound_machine_init_vbr(psid, speed, cycles_per_sec, 1750);
+        }
+    } else {
+        return sid_sound_machine_init(psid, speed, cycles_per_sec);
+    }
+}
+
+#ifdef SOUND_SYSTEM_FLOAT
+/* stereo mixing placement of the PLUS4 SID cartridge sound */
+static sound_chip_mixing_spec_t sidcart_sound_mixing_spec[SOUND_CHIP_CHANNELS_MAX] = {
+    {
+        100, /* left channel volume % in case of stereo output, default output to both */
+        100  /* right channel volume % in case of stereo output, default output to both */
+    }
+};
+#endif
+
+/* PLUS4 SID cartridge sound chip */
+static sound_chip_t sidcart_sound_chip = {
+    sid_sound_machine_open,              /* sound chip open function */
+    sidcart_sound_machine_init,          /* sound chip init function */
+    sid_sound_machine_close,             /* sound chip close function */
+    sid_sound_machine_calculate_samples, /* sound chip calculate samples function */
+    sid_sound_machine_store,             /* sound chip store function */
+    sid_sound_machine_read,              /* sound chip read function */
+    sid_sound_machine_reset,             /* sound chip reset function */
+    sid_sound_machine_cycle_based,       /* sound chip 'is_cycle_based()' function, RESID engine is cycle based, all other engines are NOT */
+    sid_sound_machine_channels,          /* sound chip 'get_amount_of_channels()' function, sound chip has 1 channel */
+#ifdef SOUND_SYSTEM_FLOAT
+    sidcart_sound_mixing_spec,           /* stereo mixing placement specs */
+#endif
+    0                                    /* sound chip enabled flag, toggled upon device (de-)activation */
+};
+
+static uint16_t sidcart_sound_chip_offset = 0;
+
+void sidcart_sound_chip_init(void)
+{
+    sidcart_sound_chip_offset = sound_chip_register(&sidcart_sound_chip);
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Some prototypes are needed */
+static void sidcartjoy_store(uint16_t addr, uint8_t value);
+static uint8_t sidcartjoy_read(uint16_t addr);
+
+static io_source_t sidcart_fd40_device = {
+    "SID Cartridge",      /* name of the device */
+    IO_DETACH_RESOURCE,   /* use resource to detach the device when involved in a read-collision */
+    "SidCart",            /* resource to set to '0' */
+    0xfd40, 0xfd5d, 0x1f, /* range for the device, regs:$fd40-$fd5d */
+    1,                    /* read is always valid */
+    sid_store,            /* store function */
+    NULL,                 /* NO poke function */
+    sid_read,             /* read function */
+    sid_peek,             /* peek function */
+    sid_dump,             /* device state information dump function */
+    CARTRIDGE_PLUS4_SIDCART,      /* cartridge id */
+    IO_PRIO_NORMAL,       /* normal priority, device read needs to be checked for collisions */
+    0,                    /* insertion order, gets filled in by the registration function */
+    IO_MIRROR_NONE        /* NO mirroring */
+};
+
+static io_source_t sidcart_fe80_device = {
+    "SID Cartridge",      /* name of the device */
+    IO_DETACH_RESOURCE,   /* use resource to detach the device when involved in a read-collision */
+    "SidCart",            /* resource to set to '0' */
+    0xfe80, 0xfe9d, 0x1f, /* range for the device, regs:$fe80-$fe9d */
+    1,                    /* read is always valid */
+    sid_store,            /* store function */
+    NULL,                 /* NO poke function */
+    sid_read,             /* read function */
+    sid_peek,             /* peek function */
+    sid_dump,             /* device state information dump function */
+    CARTRIDGE_PLUS4_SIDCART,      /* cartridge id */
+    IO_PRIO_NORMAL,       /* normal priority, device read needs to be checked for collisions */
+    0,                    /* insertion order, gets filled in by the registration function */
+    IO_MIRROR_NONE        /* NO mirroring */
+};
+
+static const export_resource_t export_res1 = {
+    CARTRIDGE_PLUS4_NAME_SIDCART, 0, 0, &sidcart_fd40_device, NULL, CARTRIDGE_PLUS4_SIDCART
+};
+
+static const export_resource_t export_res2 = {
+    CARTRIDGE_PLUS4_NAME_SIDCART, 0, 0, NULL, &sidcart_fe80_device, CARTRIDGE_PLUS4_SIDCART
+};
+
+static io_source_t sidcart_joy_device = {
+    "SID Cartridge Joystick", /* name of the device */
+    IO_DETACH_RESOURCE,       /* use resource to detach the device when involved in a read-collision */
+    "SIDCartJoy",             /* resource to set to '0' */
+    0xfd80, 0xfd8f, 0xff,     /* range for the device, address is ignored, reg:$fd80, mirrors:$fd81-$fd8f */
+    1,                        /* read is always valid */
+    sidcartjoy_store,         /* store function */
+    NULL,                     /* NO poke function */
+    sidcartjoy_read,          /* read function */
+    NULL,                     /* TODO: peek function */
+    NULL,                     /* TODO: device state information dump function */
+    CARTRIDGE_PLUS4_SIDCART,      /* cartridge id */
+    IO_PRIO_NORMAL,           /* normal priority, device read needs to be checked for collisions */
+    0,                        /* insertion order, gets filled in by the registration function */
+    IO_MIRROR_NONE            /* NO mirroring */
+};
+
+static const export_resource_t export_res_joy = {
+    CARTRIDGE_PLUS4_NAME_SIDCART, 0, 0, &sidcart_joy_device, NULL, CARTRIDGE_PLUS4_SIDCART
+};
+
+static io_source_list_t *sidcartjoy_list_item = NULL;
+static io_source_list_t *sidcart_list_item = NULL;
+
+int sidcart_enabled(void)
+{
+    return sidcart_sound_chip.chip_enabled;
+}
+
+static int set_sidcart_enabled(int value, void *param)
+{
+    int val = value ? 1 : 0;
+
+    if (val == sidcart_sound_chip.chip_enabled) {
+        return 0;
+    }
+
+    export_remove(&export_res1);
+    export_remove(&export_res2);
+    if (val) {
+        if (sidcart_address == 0xfd40) {
+            sidcart_list_item = io_source_register(&sidcart_fd40_device);
+            if (export_add(&export_res1) < 0) {
+                return -1;
+            }
+        } else {
+            sidcart_list_item = io_source_register(&sidcart_fe80_device);
+            if (export_add(&export_res2) < 0) {
+                return -1;
+            }
+        }
+    } else {
+        io_source_unregister(sidcart_list_item);
+        sidcart_list_item = NULL;
+    }
+    sidcart_sound_chip.chip_enabled = val;
+#ifdef HAVE_RESID
+    sid_set_enable(val);
+#endif
+    sound_state_changed = 1;
+    return 0;
+}
+
+static int set_sid_address(int val, void *param)
+{
+    switch (val) {
+        case 0xfd40:
+        case 0xfe80:
+            break;
+        default:
+            return -1;
+    }
+
+    if (sidcart_address == val) {
+        return 0;
+    }
+
+    export_remove(&export_res1);
+    export_remove(&export_res2);
+    if (sidcart_sound_chip.chip_enabled) {
+        io_source_unregister(sidcart_list_item);
+        if (val == 0xfd40) {
+            sidcart_list_item = io_source_register(&sidcart_fd40_device);
+            if (export_add(&export_res1) < 0) {
+                return -1;
+            }
+        } else {
+            sidcart_list_item = io_source_register(&sidcart_fe80_device);
+            if (export_add(&export_res2) < 0) {
+                return -1;
+            }
+        }
+    }
+
+    digiblaster_set_address((uint16_t)val);
+    sidcart_address = val;
+
+    return 0;
+}
+
+static int set_sid_clock(int val, void *param)
+{
+    switch (val) {
+        case SIDCART_CLOCK_C64:
+        case SIDCART_CLOCK_NATIVE:
+            break;
+        default:
+            return -1;
+    }
+
+    if (val != sidcart_clock) {
+        sidcart_clock = val;
+        sid_state_changed = 1;
+    }
+    return 0;
+}
+
+static int set_sidcartjoy_enabled(int value, void *param)
+{
+    int val = value ? 1 : 0;
+
+    if (val == sidcartjoy_enabled) {
+        return 0;
+    }
+
+    export_remove(&export_res_joy);
+
+    if (val) {
+        sidcartjoy_list_item = io_source_register(&sidcart_joy_device);
+        if (export_add(&export_res_joy) < 0) {
+            return -1;
+        }
+        joystick_adapter_set_add_ports(1);
+    } else {
+        io_source_unregister(sidcartjoy_list_item);
+        sidcartjoy_list_item = NULL;
+        joystick_adapter_set_add_ports(0);
+    }
+
+    sidcartjoy_enabled = val;
+
+    return 0;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static const resource_int_t sidcart_resources_int[] = {
+    { "SidCart", 0, RES_EVENT_SAME, NULL,
+      &sidcart_sound_chip.chip_enabled, set_sidcart_enabled, NULL },
+    { "SIDCartJoy", 0, RES_EVENT_SAME, NULL,
+      &sidcartjoy_enabled, set_sidcartjoy_enabled, NULL },
+    { "SidAddress", 0xfd40, RES_EVENT_SAME, NULL,
+      &sidcart_address, set_sid_address, NULL },
+    { "SidClock", SIDCART_CLOCK_NATIVE, RES_EVENT_SAME, NULL,
+      &sidcart_clock, set_sid_clock, NULL },
+    RESOURCE_INT_LIST_END
+};
+
+int sidcart_resources_init(void)
+{
+#ifdef HAVE_RESID
+    sid_set_enable(0);
+#endif
+    if (sid_resources_init() < 0) {
+        return -1;
+    }
+    return resources_register_int(sidcart_resources_int);
+}
+
+/* ------------------------------------------------------------------------- */
+
+static const cmdline_option_t sidcart_cmdline_options[] =
+{
+    { "-sidcart", SET_RESOURCE, CMDLINE_ATTRIB_NONE,
+      NULL, NULL, "SidCart", (resource_value_t)1,
+      NULL, "Enable the SID cartridge" },
+    { "+sidcart", SET_RESOURCE, CMDLINE_ATTRIB_NONE,
+      NULL, NULL, "SidCart", (resource_value_t)0,
+      NULL, "Disable the SID cartridge" },
+    { "-sidcartjoy", SET_RESOURCE, CMDLINE_ATTRIB_NONE,
+      NULL, NULL, "SIDCartJoy", (resource_value_t)1,
+      NULL, "Enable SID cartridge joystick" },
+    { "+sidcartjoy", SET_RESOURCE, CMDLINE_ATTRIB_NONE,
+      NULL, NULL, "SIDCartJoy", (resource_value_t)0,
+      NULL, "Disable SID cartridge joystick" },
+    { "-sidcartaddress", SET_RESOURCE, CMDLINE_ATTRIB_NEED_ARGS,
+      NULL, NULL, "SidAddress", NULL,
+      "<address>", "SID cartridge address (0xFD40/0xFE80)" },
+    { "-sidcartclock", SET_RESOURCE, CMDLINE_ATTRIB_NEED_ARGS,
+      NULL, NULL, "SidClock", NULL,
+      "<clock>", "SID cartridge clock (0: C64 clock, 1: PLUS4 clock)" },
+    CMDLINE_LIST_END
+};
+
+int sidcart_cmdline_options_init(void)
+{
+    if (sid_cmdline_options_init(SIDTYPE_SIDCART) < 0) {
+        return -1;
+    }
+    return cmdline_register_options(sidcart_cmdline_options);
+}
+
+/** \brief  Free memory allocated for the sidcart command line options
+ */
+void sidcart_cmdline_options_shutdown(void)
+{
+    /* clean up the runtime-constructed sid cmdline help */
+    sid_cmdline_options_shutdown();
+}
+
+/* ------------------------------------------------------------------------- */
+
+static void sidcartjoy_store(uint16_t addr, uint8_t value)
+{
+    store_joyport_dig(JOYPORT_PLUS4_SIDCART, value, 0xff);
+}
+
+static uint8_t sidcartjoy_read(uint16_t addr)
+{
+    return read_joyport_dig(JOYPORT_PLUS4_SIDCART);
+}
Modified: trunk/vice/src/plus4/cart/plus4cart.c
===================================================================
--- trunk/vice/src/plus4/cart/plus4cart.c	2024-04-15 08:43:26 UTC (rev 45123)
+++ trunk/vice/src/plus4/cart/plus4cart.c	2024-04-15 20:37:38 UTC (rev 45124)
@@ -37,6 +37,7 @@
 #include "cartridge.h"
 #include "cmdline.h"
 #include "crt.h"
+#include "export.h"
 #include "plus4cart.h"
 #include "plus4mem.h"
 #include "lib.h"
@@ -206,8 +207,8 @@
     mon_cart_cmd.cartridge_trigger_freeze = cartridge_trigger_freeze;
 #if 0
     mon_cart_cmd.cartridge_trigger_freeze_nmi_only = cartridge_trigger_freeze_nmi_only;
-    mon_cart_cmd.export_dump = plus4export_dump;
 #endif
+    mon_cart_cmd.export_dump = export_dump;
     if (generic_cmdline_options_init() < 0) {
         return -1;
     }
Deleted: trunk/vice/src/plus4/digiblaster.c
===================================================================
--- trunk/vice/src/plus4/digiblaster.c	2024-04-15 08:43:26 UTC (rev 45123)
+++ trunk/vice/src/plus4/digiblaster.c	2024-04-15 20:37:38 UTC (rev 45124)
@@ -1,273 +0,0 @@
-/*
- * digiblaster.c - DigiBlaster DAC/ADC cartridge emulation.
- *
- * Written by
- *  Marco van den Heuvel <bla...@ya...>
- *
- * This file is part of VICE, the Versatile Commodore Emulator.
- * See README for copyright notice.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- *  02111-1307  USA.
- *
- */
-
-#include "vice.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "cartio.h"
-#include "cmdline.h"
-#include "digiblaster.h"
-#include "lib.h"
-#include "maincpu.h"
-#include "plus4mem.h"
-#include "resources.h"
-#include "sampler.h"
-#include "sidcart.h"
-#include "sound.h"
-#include "uiapi.h"
-
-/* ---------------------------------------------------------------------*/
-
-/* Some prototypes are needed */
-static int digiblaster_sound_machine_init(sound_t *psid, int speed, int cycles_per_sec);
-static void digiblaster_sound_machine_store(sound_t *psid, uint16_t addr, uint8_t val);
-static void digiblaster_sound_reset(sound_t *psid, CLOCK cpu_clk);
-
-#ifdef SOUND_SYSTEM_FLOAT
-static int digiblaster_sound_machine_calculate_samples(sound_t **psid, float *pbuf, int nr, int sound_chip_channels, CLOCK *delta_t);
-#else
-static int digiblaster_sound_machine_calculate_samples(sound_t **psid, int16_t *pbuf, int nr, int sound_output_channels, int sound_chip_channels, CLOCK *delta_t);
-#endif
-
-static int digiblaster_sound_machine_cycle_based(void)
-{
-    return 0;
-}
-
-static int digiblaster_sound_machine_channels(void)
-{
-    return 1;
-}
-
-#ifdef SOUND_SYSTEM_FLOAT
-/* stereo mixing placement of the PLUS4 DigiBlaster cartridge sound */
-static sound_chip_mixing_spec_t digiblaster_sound_mixing_spec[SOUND_CHIP_CHANNELS_MAX] = {
-    {
-        100, /* left channel volume % in case of stereo output, default output to both */
-        100  /* right channel volume % in case of stereo output, default output to both */
-    }
-};
-#endif
-
-/* PLUS4 DigiBlaster cartridge sound chip */
-static sound_chip_t digiblaster_sound_chip = {
-    NULL,                                        /* NO sound chip open function */
-    digiblaster_sound_machine_init,              /* sound chip init function */
-    NULL,                                        /* NO sound chip close function */
-    digiblaster_sound_machine_calculate_samples, /* sound chip calculate samples function */
-    digiblaster_sound_machine_store,             /* sound chip store function */
-    NULL,                                        /* NO sound chip read function */
-    digiblaster_sound_reset,                     /* sound chip reset function */
-    digiblaster_sound_machine_cycle_based,       /* sound chip 'is_cycle_based()' function, chip is NOT cycle based */
-    digiblaster_sound_machine_channels,          /* sound chip 'get_amount_of_channels()' function, sound chip has 1 channel */
-#ifdef SOUND_SYSTEM_FLOAT
-    digiblaster_sound_mixing_spec,               /* stereo mixing placement specs */
-#endif
-    0                                            /* sound chip enabled flag, toggled upon device (de-)activation */
-};
-
-static uint16_t digiblaster_sound_chip_offset = 0;
-static sound_dac_t digiblaster_dac;
-
-void digiblaster_sound_chip_init(void)
-{
-    digiblaster_sound_chip_offset = sound_chip_register(&digiblaster_sound_chip);
-}
-
-/* ---------------------------------------------------------------------*/
-
-/* Some prototypes */
-static uint8_t digiblaster_read(uint16_t addr);
-static void digiblaster_store(uint16_t addr, uint8_t value);
-
-static io_source_t digiblaster_fd5e_device = {
-    "DigiBlaster",        /* name of the device */
-    IO_DETACH_RESOURCE,   /* use resource to detach the device when involved in a read-collision */
-    "DIGIBLASTER",        /* resource to set to '0' */
-    0xfd5e, 0xfd5f, 0x01, /* range for the device, regs:$fd5e-$fd5f */
-    1,                    /* read is always valid */
-    digiblaster_store,    /* store function */
-    NULL,                 /* NO poke function */
-    digiblaster_read,     /* read function */
-    NULL,                 /* TODO: peek function */
-    NULL,                 /* nothing to dump */
-    IO_CART_ID_NONE,      /* not a cartridge */
-    IO_PRIO_NORMAL,       /* normal priority, device read needs to be checked for collisions */
-    0,                    /* insertion order, gets filled in by the registration function */
-    IO_MIRROR_NONE        /* NO mirroring */
-};
-
-static io_source_t digiblaster_fe9e_device = {
-    "DigiBlaster",        /* name of the device */
-    IO_DETACH_RESOURCE,   /* use resource to detach the device when involved in a read-collision */
-    "DIGIBLASTER",        /* resource to set to '0' */
-    0xfe9e, 0xfe9f, 0x01, /* range for the device, regs:$fe9e-$fe9f */
-    1,                    /* read is always valid */
-    digiblaster_store,    /* store function */
-    NULL,                 /* NO poke function */
-    digiblaster_read,     /* read function */
-    NULL,                 /* TODO: peek function */
-    NULL,                 /* nothing to dump */
-    IO_CART_ID_NONE,      /* not a cartridge */
-    IO_PRIO_NORMAL,       /* normal priority, device read needs to be checked for collisions */
-    0,                    /* insertion order, gets filled in by the registration function */
-    IO_MIRROR_NONE        /* NO mirroring */
-};
-
-static io_source_list_t *digiblaster_list_item = NULL;
-
-void digiblaster_set_address(uint16_t addr)
-{
-    if (digiblaster_sound_chip.chip_enabled) {
-        io_source_unregister(digiblaster_list_item);
-        if (addr == 0xfd40) {
-            digiblaster_list_item = io_source_register(&digiblaster_fd5e_device);
-        } else {
-            digiblaster_list_item = io_source_register(&digiblaster_fe9e_device);
-        }
-    }
-}
-
-int digiblaster_enabled(void)
-{
-    return digiblaster_sound_chip.chip_enabled;
-}
-
-static int set_digiblaster_enabled(int value, void *param)
-{
-    int val = value ? 1 : 0;
-
-    if (digiblaster_sound_chip.chip_enabled == val) {
-        return 0;
-    }
-
-    if (val) {
-        if (sidcart_address == 0xfd40) {
-            digiblaster_list_item = io_source_register(&digiblaster_fd5e_device);
-        } else {
-            digiblaster_list_item = io_source_register(&digiblaster_fe9e_device);
-        }
-        sampler_start(SAMPLER_OPEN_MONO, "DigiBlaster");
-    } else {
-        io_source_unregister(digiblaster_list_item);
-        digiblaster_list_item = NULL;
-        sampler_stop();
-    }
-
-    digiblaster_sound_chip.chip_enabled = val ? 1 : 0;
-
-    return 0;
-}
-
-static const resource_int_t resources_int[] = {
-    { "DIGIBLASTER", 0, RES_EVENT_STRICT, (resource_value_t)0,
-      &digiblaster_sound_chip.chip_enabled, set_digiblaster_enabled, NULL },
-    RESOURCE_INT_LIST_END
-};
-
-int digiblaster_resources_init(void)
-{
-    return resources_register_int(resources_int);
-}
-
-static const cmdline_option_t cmdline_options[] =
-{
-    { "-digiblaster", SET_RESOURCE, CMDLINE_ATTRIB_NONE,
-      NULL, NULL, "DIGIBLASTER", (resource_value_t)1,
-      NULL, "Enable the digiblaster add-on" },
-    { "+digiblaster", SET_RESOURCE, CMDLINE_ATTRIB_NONE,
-      NULL, NULL, "DIGIBLASTER", (resource_value_t)0,
-      NULL, "Disable the digiblaster add-on" },
-    CMDLINE_LIST_END
-};
-
-int digiblaster_cmdline_options_init(void)
-{
-    return cmdline_register_options(cmdline_options);
-}
-
-/* ---------------------------------------------------------------------*/
-
-static uint8_t digiblaster_sound_data;
-
-struct digiblaster_sound_s {
-    uint8_t voice0;
-};
-
-static struct digiblaster_sound_s snd;
-
-#ifdef SOUND_SYSTEM_FLOAT
-/* FIXME */
-static int digiblaster_sound_machine_calculate_samples(sound_t **psid, float *pbuf, int nr, int scc, CLOCK *delta_t)
-{
-    return sound_dac_calculate_samples(&digiblaster_dac, pbuf, (int)snd.voice0 * 128, nr);
-}
-#else
-static int digiblaster_sound_machine_calculate_samples(sound_t **psid, int16_t *pbuf, int nr, int soc, int scc, CLOCK *delta_t)
-{
-    return sound_dac_calculate_samples(&digiblaster_dac, pbuf, (int)snd.voice0 * 128, nr, soc, (soc == SOUND_OUTPUT_STEREO) ? SOUND_CHANNELS_1_AND_2 : SOUND_CHANNEL_1);
-}
-#endif
-
-static int digiblaster_sound_machine_init(sound_t *psid, int speed, int cycles_per_sec)
-{
-    sound_dac_init(&digiblaster_dac, speed);
-    snd.voice0 = 0;
-
-    return 1;
-}
-
-static void digiblaster_sound_machine_store(sound_t *psid, uint16_t addr, uint8_t val)
-{
-    snd.voice0 = val;
-}
-
-static void digiblaster_sound_reset(sound_t *psid, CLOCK cpu_clk)
-{
-    snd.voice0 = 0;
-    digiblaster_sound_data = 0;
-}
-
-/* ---------------------------------------------------------------------*/
-
-static void digiblaster_store(uint16_t addr, uint8_t value)
-{
-    if ((addr & 1) == 0) {
-        digiblaster_sound_data = value;
-        sound_store(digiblaster_sound_chip_offset, value, 0);
-    }
-}
-
-static uint8_t digiblaster_read(uint16_t addr)
-{
-    if ((addr & 1) == 0) {
-        return sound_read(digiblaster_sound_chip_offset, 0);
-    }
-    return sampler_get_sample(SAMPLER_CHANNEL_DEFAULT);
-}
Deleted: trunk/vice/src/plus4/digiblaster.h
===================================================================
--- trunk/vice/src/plus4/digiblaster.h	2024-04-15 08:43:26 UTC (rev 45123)
+++ trunk/vice/src/plus4/digiblaster.h	2024-04-15 20:37:38 UTC (rev 45124)
@@ -1,41 +0,0 @@
-/*
- * digiblaster.h
- *
- * Written by
- *  Marco van den Heuvel <bla...@ya...>
- *
- * This file is part of VICE, the Versatile Commodore Emulator.
- * See README for copyright notice.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- *  02111-1307  USA.
- *
- */
-
-#ifndef VICE_DIGIBLASTER_H
-#define VICE_DIGIBLASTER_H
-
-#include "types.h"
-#include "sound.h"
-
-int digiblaster_resources_init(void);
-int digiblaster_cmdline_options_init(void);
-
-void digiblaster_sound_chip_init(void);
-int digiblaster_enabled(void);
-
-void digiblaster_set_address(uint16_t addr);
-
-#endif
Deleted: trunk/vice/src/plus4/plus4-sidcart.c
===================================================================
--- trunk/vice/src/plus4/plus4-sidcart.c	2024-04-15 08:43:26 UTC (rev 45123)
+++ trunk/vice/src/plus4/plus4-sidcart.c	2024-04-15 20:37:38 UTC (rev 45124)
@@ -1,337 +0,0 @@
-/*
- * sidcartjoy.c - SIDCART joystick port emulation.
- *
- * Written by
- *  Marco van den Heuvel <bla...@ya...>
- *
- * This file is part of VICE, the Versatile Commodore Emulator.
- * See README for copyright notice.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- *  02111-1307  USA.
- *
- */
-
-#include "vice.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "cartio.h"
-#include "cmdline.h"
-#include "digiblaster.h"
-#include "joyport.h"
-#include "keyboard.h"
-#include "plus4.h"
-#include "resources.h"
-#include "sid.h"
-#include "sid-cmdline-options.h"
-#include "sid-resources.h"
-#include "sidcart.h"
-#include "sound.h"
-#include "types.h"
-#include "uiapi.h"
-
-int sidcartjoy_enabled = 0;
-
-int sidcart_address = 0xfd40;
-int sidcart_clock = 1;
-
-/* ------------------------------------------------------------------------- */
-
-static int sidcart_sound_machine_init(sound_t *psid, int speed, int cycles_per_sec)
-{
-    if (!sidcart_clock) {
-        if (cycles_per_sec == PLUS4_PAL_CYCLES_PER_SEC) {
-            return sid_sound_machine_init_vbr(psid, speed, cycles_per_sec, 1800);
-        } else {
-            return sid_sound_machine_init_vbr(psid, speed, cycles_per_sec, 1750);
-        }
-    } else {
-        return sid_sound_machine_init(psid, speed, cycles_per_sec);
-    }
-}
-
-#ifdef SOUND_SYSTEM_FLOAT
-/* stereo mixing placement of the PLUS4 SID cartridge sound */
-static sound_chip_mixing_spec_t sidcart_sound_mixing_spec[SOUND_CHIP_CHANNELS_MAX] = {
-    {
-        100, /* left channel volume % in case of stereo output, default output to both */
-        100  /* right channel volume % in case of stereo output, default output to both */
-    }
-};
-#endif
-
-/* PLUS4 SID cartridge sound chip */
-static sound_chip_t sidcart_sound_chip = {
-    sid_sound_machine_open,              /* sound chip open function */
-    sidcart_sound_machine_init,          /* sound chip init function */
-    sid_sound_machine_close,             /* sound chip close function */
-    sid_sound_machine_calculate_samples, /* sound chip calculate samples function */
-    sid_sound_machine_store,             /* sound chip store function */
-    sid_sound_machine_read,              /* sound chip read function */
-    sid_sound_machine_reset,             /* sound chip reset function */
-    sid_sound_machine_cycle_based,       /* sound chip 'is_cycle_based()' function, RESID engine is cycle based, all other engines are NOT */
-    sid_sound_machine_channels,          /* sound chip 'get_amount_of_channels()' function, sound chip has 1 channel */
-#ifdef SOUND_SYSTEM_FLOAT
-    sidcart_sound_mixing_spec,           /* stereo mixing placement specs */
-#endif
-    0                                    /* sound chip enabled flag, toggled upon device (de-)activation */
-};
-
-static uint16_t sidcart_sound_chip_offset = 0;
-
-void sidcart_sound_chip_init(void)
-{
-    sidcart_sound_chip_offset = sound_chip_register(&sidcart_sound_chip);
-}
-
-/* ------------------------------------------------------------------------- */
-
-/* Some prototypes are needed */
-static void sidcartjoy_store(uint16_t addr, uint8_t value);
-static uint8_t sidcartjoy_read(uint16_t addr);
-
-static io_source_t sidcart_fd40_device = {
-    "SID Cartridge",      /* name of the device */
-    IO_DETACH_RESOURCE,   /* use resource to detach the device when involved in a read-collision */
-    "SidCart",            /* resource to set to '0' */
-    0xfd40, 0xfd5d, 0x1f, /* range for the device, regs:$fd40-$fd5d */
-    1,                    /* read is always valid */
-    sid_store,            /* store function */
-    NULL,                 /* NO poke function */
-    sid_read,             /* read function */
-    sid_peek,             /* peek function */
-    sid_dump,             /* device state information dump function */
-    IO_CART_ID_NONE,      /* not a cartridge */
-    IO_PRIO_NORMAL,       /* normal priority, device read needs to be checked for collisions */
-    0,                    /* insertion order, gets filled in by the registration function */
-    IO_MIRROR_NONE        /* NO mirroring */
-};
-
-static io_source_t sidcart_fe80_device = {
-    "SID Cartridge",      /* name of the device */
-    IO_DETACH_RESOURCE,   /* use resource to detach the device when involved in a read-collision */
-    "SidCart",            /* resource to set to '0' */
-    0xfe80, 0xfe9d, 0x1f, /* range for the device, regs:$fe80-$fe9d */
-    1,                    /* read is always valid */
-    sid_store,            /* store function */
-    NULL,                 /* NO poke function */
-    sid_read,             /* read function */
-    sid_peek,             /* peek function */
-    sid_dump,             /* device state information dump function */
-    IO_CART_ID_NONE,      /* not a cartridge */
-    IO_PRIO_NORMAL,       /* normal priority, device read needs to be checked for collisions */
-    0,                    /* insertion order, gets filled in by the registration function */
-    IO_MIRROR_NONE        /* NO mirroring */
-};
-
-static io_source_t sidcart_joy_device = {
-    "SID Cartridge Joystick", /* name of the device */
-    IO_DETACH_RESOURCE,       /* use resource to detach the device when involved in a read-collision */
-    "SIDCartJoy",             /* resource to set to '0' */
-    0xfd80, 0xfd8f, 0xff,     /* range for the device, address is ignored, reg:$fd80, mirrors:$fd81-$fd8f */
-    1,                        /* read is always valid */
-    sidcartjoy_store,         /* store function */
-    NULL,                     /* NO poke function */
-    sidcartjoy_read,          /* read function */
-    NULL,                     /* TODO: peek function */
-    NULL,                     /* TODO: device state information dump function */
-    IO_CART_ID_NONE,          /* not a cartridge */
-    IO_PRIO_NORMAL,           /* normal priority, device read needs to be checked for collisions */
-    0,                        /* insertion order, gets filled in by the registration function */
-    IO_MIRROR_NONE            /* NO mirroring */
-};
-
-static io_source_list_t *sidcartjoy_list_item = NULL;
-static io_source_list_t *sidcart_list_item = NULL;
-
-int sidcart_enabled(void)
-{
-    return sidcart_sound_chip.chip_enabled;
-}
-
-static int set_sidcart_enabled(int value, void *param)
-{
-    int val = value ? 1 : 0;
-
-    if (val == sidcart_sound_chip.chip_enabled) {
-        return 0;
-    }
-
-    if (val) {
-        if (sidcart_address == 0xfd40) {
-            sidcart_list_item = io_source_register(&sidcart_fd40_device);
-        } else {
-            sidcart_list_item = io_source_register(&sidcart_fe80_device);
-        }
-    } else {
-        io_source_unregister(sidcart_list_item);
-        sidcart_list_item = NULL;
-    }
-    sidcart_sound_chip.chip_enabled = val;
-#ifdef HAVE_RESID
-    sid_set_enable(val);
-#endif
-    sound_state_changed = 1;
-    return 0;
-}
-
-static int set_sid_address(int val, void *param)
-{
-    switch (val) {
-        case 0xfd40:
-        case 0xfe80:
-            break;
-        default:
-            return -1;
-    }
-
-    if (sidcart_address == val) {
-        return 0;
-    }
-
-    if (sidcart_sound_chip.chip_enabled) {
-        io_source_unregister(sidcart_list_item);
-        if (val == 0xfd40) {
-            sidcart_list_item = io_source_register(&sidcart_fd40_device);
-        } else {
-            sidcart_list_item = io_source_register(&sidcart_fe80_device);
-        }
-    }
-
-    digiblaster_set_address((uint16_t)val);
-    sidcart_address = val;
-
-    return 0;
-}
-
-static int set_sid_clock(int val, void *param)
-{
-    switch (val) {
-        case SIDCART_CLOCK_C64:
-        case SIDCART_CLOCK_NATIVE:
-            break;
-        default:
-            return -1;
-    }
-
-    if (val != sidcart_clock) {
-        sidcart_clock = val;
-        sid_state_changed = 1;
-    }
-    return 0;
-}
-
-static int set_sidcartjoy_enabled(int value, void *param)
-{
-    int val = value ? 1 : 0;
-
-    if (val == sidcartjoy_enabled) {
-        return 0;
-    }
-
-    if (val) {
-        sidcartjoy_list_item = io_source_register(&sidcart_joy_device);
-        joystick_adapter_set_add_ports(1);
-    } else {
-        io_source_unregister(sidcartjoy_list_item);
-        sidcartjoy_list_item = NULL;
-        joystick_adapter_set_add_ports(0);
-    }
-
-    sidcartjoy_enabled = val;
-
-    return 0;
-}
-
-/* ------------------------------------------------------------------------- */
-
-static const resource_int_t sidcart_resources_int[] = {
-    { "SidCart", 0, RES_EVENT_SAME, NULL,
-      &sidcart_sound_chip.chip_enabled, set_sidcart_enabled, NULL },
-    { "SIDCartJoy", 0, RES_EVENT_SAME, NULL,
-      &sidcartjoy_enabled, set_sidcartjoy_enabled, NULL },
-    { "SidAddress", 0xfd40, RES_EVENT_SAME, NULL,
-      &sidcart_address, set_sid_address, NULL },
-    { "SidClock", SIDCART_CLOCK_NATIVE, RES_EVENT_SAME, NULL,
-      &sidcart_clock, set_sid_clock, NULL },
-    RESOURCE_INT_LIST_END
-};
-
-int sidcart_resources_init(void)
-{
-#ifdef HAVE_RESID
-    sid_set_enable(0);
-#endif
-    if (sid_resources_init() < 0) {
-        return -1;
-    }
-    return resources_register_int(sidcart_resources_int);
-}
-
-/* ------------------------------------------------------------------------- */
-
-static const cmdline_option_t sidcart_cmdline_options[] =
-{
-    { "-sidcart", SET_RESOURCE, CMDLINE_ATTRIB_NONE,
-      NULL, NULL, "SidCart", (resource_value_t)1,
-      NULL, "Enable the SID cartridge" },
-    { "+sidcart", SET_RESOURCE, CMDLINE_ATTRIB_NONE,
-      NULL, NULL, "SidCart", (resource_value_t)0,
-      NULL, "Disable the SID cartridge" },
-    { "-sidcartjoy", SET_RESOURCE, CMDL...
 
[truncated message content] | 
| 
      
      
      From: <co...@us...> - 2024-04-15 08:43:29
      
     | 
| Revision: 45123
          http://sourceforge.net/p/vice-emu/code/45123
Author:   compyx
Date:     2024-04-15 08:43:26 +0000 (Mon, 15 Apr 2024)
Log Message:
-----------
Gtk3: add proper parentage for `vice_gtk3_message_info` dialogs
Modified Paths:
--------------
    trunk/vice/src/arch/gtk3/ui.c
    trunk/vice/src/arch/gtk3/uidiskcreate.c
    trunk/vice/src/arch/gtk3/widgets/base/basedialogs.c
    trunk/vice/src/arch/gtk3/widgets/base/basedialogs.h
    trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c
    trunk/vice/src/arch/gtk3/widgets/settings_keyboard.c
Modified: trunk/vice/src/arch/gtk3/ui.c
===================================================================
--- trunk/vice/src/arch/gtk3/ui.c	2024-04-15 07:01:42 UTC (rev 45122)
+++ trunk/vice/src/arch/gtk3/ui.c	2024-04-15 08:43:26 UTC (rev 45123)
@@ -2545,7 +2545,7 @@
  */
 static gboolean ui_message_impl(gpointer user_data)
 {
-    vice_gtk3_message_info("VICE Message", "%s", (const char *)user_data);
+    vice_gtk3_message_info(NULL, "VICE Message", "%s", (const char *)user_data);
     lib_free(user_data);
     return G_SOURCE_REMOVE;
 }
Modified: trunk/vice/src/arch/gtk3/uidiskcreate.c
===================================================================
--- trunk/vice/src/arch/gtk3/uidiskcreate.c	2024-04-15 07:01:42 UTC (rev 45122)
+++ trunk/vice/src/arch/gtk3/uidiskcreate.c	2024-04-15 08:43:26 UTC (rev 45123)
@@ -247,13 +247,6 @@
     }
 
     vdr_text = util_concat(name_vice, ",", id_vice, NULL);
-#if 0
-    vice_gtk3_message_info("Creating disk image",
-            "Attaching '%s' at unit #%d, type %d, name '%s', ID '%s'\n"
-            "Passing \"%s\" to vdrive",
-            filename, unit_number, image_type, name_gtk3, id_gtk3,
-            vdr_text);
-#endif
 
     /* create image */
     if (vdrive_internal_create_format_disk_image(fname_copy, vdr_text,
Modified: trunk/vice/src/arch/gtk3/widgets/base/basedialogs.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/base/basedialogs.c	2024-04-15 07:01:42 UTC (rev 45122)
+++ trunk/vice/src/arch/gtk3/widgets/base/basedialogs.c	2024-04-15 08:43:26 UTC (rev 45123)
@@ -133,6 +133,7 @@
 
 /** \brief  Create a GtkMessageDialog
  *
+ * \param[in]   parent      parent window (can be \c NULL)
  * \param[in]   type        message type
  * \param[in]   buttons     buttons to use
  * \param[in]   title       dialog title
@@ -172,37 +173,51 @@
 }
 
 
-/* XXX: All the following functions use the same function signature, even if
- *      returning a `gboolean` doesn't really make sense, that way they can
- *      be used with a generic function-pointer, should we require that.
- */
-
-
 /** \brief  Create 'info' dialog
  *
+ * \param[in]   parent  parent window (can be \c NULL)
  * \param[in]   title   dialog title
  * \param[in]   fmt     message format string and arguments
  *
  * \return  dialog
  */
-GtkWidget *vice_gtk3_message_info(const char *title,
+GtkWidget *vice_gtk3_message_info(GtkWindow  *parent,
+                                  const char *title,
                                   const char *fmt, ...)
 {
+    GtkWindow *active_window = NULL;
     GtkWidget *dialog;
-    va_list args;
-    char *buffer;
+    va_list    args;
+    char      *buffer;
 
     va_start(args, fmt);
     buffer = lib_mvsprintf(fmt, args);
     va_end(args);
 
-    dialog = create_dialog(NULL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, title, buffer);
+    dialog = create_dialog(parent, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, title, buffer);
 
     lib_free(buffer);
 
-    gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
+    if (parent == NULL) {
+        /* no parent provided, assume active emulator window */
+        active_window = ui_get_active_window();
+    } else {
+        active_window = parent;
+    }
 
-    g_signal_connect(dialog, "response", G_CALLBACK(on_response_info), NULL);
+    if (active_window != NULL) {
+        gtk_window_set_transient_for(GTK_WINDOW(dialog), active_window);
+        gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT);
+        gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
+    } else {
+        gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
+    }
+
+    g_signal_connect_unlocked(G_OBJECT(dialog),
+                              "response",
+                              G_CALLBACK(on_response_info),
+                              NULL);
+
     gtk_widget_show(dialog);
     return dialog;
 }
Modified: trunk/vice/src/arch/gtk3/widgets/base/basedialogs.h
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/base/basedialogs.h	2024-04-15 07:01:42 UTC (rev 45122)
+++ trunk/vice/src/arch/gtk3/widgets/base/basedialogs.h	2024-04-15 08:43:26 UTC (rev 45123)
@@ -46,8 +46,9 @@
 };
 
 
-GtkWidget *vice_gtk3_message_info(const char *title,
-                                  const char *fmt, ...) VICE_ATTR_PRINTF2;
+GtkWidget *vice_gtk3_message_info(GtkWindow *parent,
+                                  const char *title,
+                                  const char *fmt, ...) VICE_ATTR_PRINTF3;
 
 GtkWidget *vice_gtk3_message_confirm(void (*callback)(GtkDialog *, gboolean),
                                      const char *title,
Modified: trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c	2024-04-15 07:01:42 UTC (rev 45122)
+++ trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c	2024-04-15 08:43:26 UTC (rev 45123)
@@ -1400,7 +1400,8 @@
         g_free(path);
 
         if (ui_hotkeys_save_as(fullpath)) {
-            vice_gtk3_message_info("Hotkeys saved",
+            vice_gtk3_message_info(GTK_WINDOW(dialog),
+                                   "Hotkeys saved",
                                    "Hotkeys succesfully saved as '%s'.",
                                    fullpath);
         } else {
@@ -1442,22 +1443,23 @@
  */
 static void on_save_clicked(GtkButton *button, gpointer unused)
 {
+    GtkWidget *parent;
+
+    /* try to set settings dialog as parent */
+    parent = gtk_widget_get_toplevel(GTK_WIDGET(button));
+    if (!GTK_IS_WINDOW(parent)) {
+        parent = NULL;  /* revert to active emulator window */
+    }
+
     if (ui_hotkeys_save()) {
         char *path = ui_hotkeys_vhk_source_path();
-        vice_gtk3_message_info("Hotkeys saved",
+
+        vice_gtk3_message_info(GTK_WINDOW(parent),
+                               "Hotkeys saved",
                                "Hotkeys saved succesfully as '%s'.",
                                path);
         lib_free(path);
     } else {
-        GtkWidget *parent;
-        /* FIXME: perhaps some info on what happened to make it fail? */
-
-        /* get settings dialog */
-        parent = gtk_widget_get_toplevel(GTK_WIDGET(button));
-        if (!GTK_IS_WINDOW(parent)) {
-            /* revert to current emulator window */
-            parent = NULL;
-        }
         vice_gtk3_message_error(GTK_WINDOW(parent),
                                 "Hotkeys error",
                                 "Failed to save hotkeys.");
Modified: trunk/vice/src/arch/gtk3/widgets/settings_keyboard.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_keyboard.c	2024-04-15 07:01:42 UTC (rev 45122)
+++ trunk/vice/src/arch/gtk3/widgets/settings_keyboard.c	2024-04-15 08:43:26 UTC (rev 45123)
@@ -90,9 +90,9 @@
 
         result = keyboard_keymap_dump(path);
         if (result == 0) {
-            vice_gtk3_message_info(
-                    "Succesfully saved current keymap",
-                    "Wrote current keymap as '%s'.", path);
+            vice_gtk3_message_info(GTK_WINDOW(dialog),
+                                   "Succesfully saved current keymap",
+                                   "Wrote current keymap as '%s'.", path);
             lastdir_update(GTK_WIDGET(dialog), &last_dir, &last_file);
         } else {
             vice_gtk3_message_error(GTK_WINDOW(dialog),
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <co...@us...> - 2024-04-15 07:01:44
      
     | 
| Revision: 45122
          http://sourceforge.net/p/vice-emu/code/45122
Author:   compyx
Date:     2024-04-15 07:01:42 +0000 (Mon, 15 Apr 2024)
Log Message:
-----------
Gtk3: fix log error when saving screenshot
Don't request proposed screenshot name through extension, use driver name.
Modified Paths:
--------------
    trunk/vice/src/arch/gtk3/uimedia.c
Modified: trunk/vice/src/arch/gtk3/uimedia.c
===================================================================
--- trunk/vice/src/arch/gtk3/uimedia.c	2024-04-15 06:46:04 UTC (rev 45121)
+++ trunk/vice/src/arch/gtk3/uimedia.c	2024-04-15 07:01:42 UTC (rev 45122)
@@ -572,16 +572,16 @@
  */
 static void save_screenshot_handler(GtkWidget *parent)
 {
-    GtkWidget *dialog;
+    GtkWidget  *dialog;
     const char *display;
-    char *title;
-    char *proposed;
-    const char *ext;
+    const char *format;
+    char       *title;
+    char       *proposed;
 
-    ext = video_driver_list[screenshot_driver_index].ext;
-    display = video_driver_list[screenshot_driver_index].display;
-    title = lib_msprintf("Save %s file", display);
-    proposed = screenshot_create_quickscreenshot_filename(ext);
+    format   = video_driver_list[screenshot_driver_index].name;
+    display  = video_driver_list[screenshot_driver_index].display;
+    title    = lib_msprintf("Save %s file", display);
+    proposed = screenshot_create_quickscreenshot_filename(format);
 
     dialog = vice_gtk3_save_file_dialog(
             title, proposed, TRUE, NULL,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <co...@us...> - 2024-04-15 06:46:06
      
     | 
| Revision: 45121
          http://sourceforge.net/p/vice-emu/code/45121
Author:   compyx
Date:     2024-04-15 06:46:04 +0000 (Mon, 15 Apr 2024)
Log Message:
-----------
SDL: fix pointer signedness warnings
Modified Paths:
--------------
    trunk/vice/src/arch/sdl/uiimagefilereq.c
Modified: trunk/vice/src/arch/sdl/uiimagefilereq.c
===================================================================
--- trunk/vice/src/arch/sdl/uiimagefilereq.c	2024-04-14 23:05:45 UTC (rev 45120)
+++ trunk/vice/src/arch/sdl/uiimagefilereq.c	2024-04-15 06:46:04 UTC (rev 45121)
@@ -87,7 +87,7 @@
 
         j = MENU_FIRST_X;
         name = image_contents_file_to_string(entry, IMAGE_CONTENTS_STRING_PETSCII);
-        petscii_replace_alternatives(name);
+        petscii_replace_alternatives((unsigned char *)name);
         j += sdl_ui_print(name, j, i + IMAGE_FIRST_Y + SDL_FILEREQ_META_NUM);
 
         if (i == cur_offset) {
@@ -119,7 +119,7 @@
             }
             j = MENU_FIRST_X;
             name = image_contents_file_to_string(entry, IMAGE_CONTENTS_STRING_PETSCII);
-            petscii_replace_alternatives(name);
+            petscii_replace_alternatives((unsigned char *)name);
             j += sdl_ui_print(name, j, i + IMAGE_FIRST_Y + SDL_FILEREQ_META_NUM);
 
             sdl_ui_print_eol(j, i + IMAGE_FIRST_Y + SDL_FILEREQ_META_NUM);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gp...@us...> - 2024-04-14 23:05:46
      
     | 
| Revision: 45120
          http://sourceforge.net/p/vice-emu/code/45120
Author:   gpz
Date:     2024-04-14 23:05:45 +0000 (Sun, 14 Apr 2024)
Log Message:
-----------
acctually do DTV selftest with screenshot :(
Modified Paths:
--------------
    testprogs/testbench/Makefile
    testprogs/testbench/dtv-testlist.in
Modified: testprogs/testbench/Makefile
===================================================================
--- testprogs/testbench/Makefile	2024-04-14 23:00:06 UTC (rev 45119)
+++ testprogs/testbench/Makefile	2024-04-14 23:05:45 UTC (rev 45120)
@@ -125,6 +125,7 @@
 	make -s -C selftest --no-print-dir --silent
 	./testbench.sh x64sc selftest
 	./testbench.sh x128 selftest
+	./testbench.sh xscpu64 selftest
 	./testbench.sh x64dtv selftest
 	./testbench.sh xvic selftest
 	./testbench.sh xplus4 selftest
Modified: testprogs/testbench/dtv-testlist.in
===================================================================
--- testprogs/testbench/dtv-testlist.in	2024-04-14 23:00:06 UTC (rev 45119)
+++ testprogs/testbench/dtv-testlist.in	2024-04-14 23:05:45 UTC (rev 45120)
@@ -6,6 +6,8 @@
 ################################################################################
 ./selftest/,dtv-pass.prg,exitcode,10000000
 ./selftest/,dtv-fail.prg,exitcode,10000000,expect:error
+./selftest/,dtv-pass.prg,screenshot,10000000
+./selftest/,dtv-fail.prg,screenshot,10000000,expect:error
 ../DTV/blitregt/,blitregt.prg,interactive,0
 ../DTV/bmsac/,bmsac.prg,interactive,0
 #TODO:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gp...@us...> - 2024-04-14 23:00:15
      
     | 
| Revision: 45119
          http://sourceforge.net/p/vice-emu/code/45119
Author:   gpz
Date:     2024-04-14 23:00:06 +0000 (Sun, 14 Apr 2024)
Log Message:
-----------
add DTV selftest with screenshot
Modified Paths:
--------------
    testprogs/testbench/Makefile
    testprogs/testbench/cmpscreens.c
    testprogs/testbench/x64dtv-hooks.sh
    testprogs/testbench/x64dtv-testlist.txt
Added Paths:
-----------
    testprogs/testbench/selftest/references/dtv-fail.prg.png
    testprogs/testbench/selftest/references/dtv-pass.prg.png
Modified: testprogs/testbench/Makefile
===================================================================
--- testprogs/testbench/Makefile	2024-04-14 22:38:41 UTC (rev 45118)
+++ testprogs/testbench/Makefile	2024-04-14 23:00:06 UTC (rev 45119)
@@ -107,7 +107,7 @@
 #	echo "testyace"
 
 ################################################################################
-prereq: revertfiles selftest testlist cmpscreens maketable prereq-chameleon
+prereq: revertfiles testlist cmpscreens maketable prereq-chameleon
 
 .PHONY: testlist selftest prereq revertfiles
 
@@ -123,6 +123,14 @@
 
 selftest:
 	make -s -C selftest --no-print-dir --silent
+	./testbench.sh x64sc selftest
+	./testbench.sh x128 selftest
+	./testbench.sh x64dtv selftest
+	./testbench.sh xvic selftest
+	./testbench.sh xplus4 selftest
+	./testbench.sh xpet selftest
+	./testbench.sh xcbm2 selftest
+	./testbench.sh xcbm5x0 selftest
 
 cmpscreens: cmpscreens.c
 	$(CC) -W -Wall -O3 -o cmpscreens cmpscreens.c -lm
Modified: testprogs/testbench/cmpscreens.c
===================================================================
--- testprogs/testbench/cmpscreens.c	2024-04-14 22:38:41 UTC (rev 45118)
+++ testprogs/testbench/cmpscreens.c	2024-04-14 23:00:06 UTC (rev 45119)
@@ -9,7 +9,7 @@
 #include "stb_image.h"
 
 #define MAXCOLORS 0x100
-#define MAXPALETTES 7
+#define MAXPALETTES 8
 
 #define max(x, y) (((x) > (y)) ? (x) : (y))
 #define min(x, y) (((x) < (y)) ? (x) : (y))
@@ -27,6 +27,7 @@
     16, // &cols_pet_green_old[0],
     25, // &cols_z64_pal_viciie[0],
     128,
+    256,
 };
 
 unsigned char cols_pepto_pal[3*16] = {
@@ -302,6 +303,265 @@
 0xff, 0xff, 0xdb
 };
 
+unsigned char cols_dtv_spiff[3*256] = {
+0x02, 0x05, 0x0a,
+0x0c, 0x10, 0x13,
+0x1d, 0x1c, 0x1e,
+0x24, 0x2b, 0x2b,
+0x36, 0x35, 0x34,
+0x3f, 0x44, 0x43,
+0x52, 0x4f, 0x50,
+0x5b, 0x5e, 0x5e,
+0x67, 0x66, 0x68,
+0x72, 0x74, 0x72,
+0x82, 0x80, 0x83,
+0x8b, 0x8f, 0x8f,
+0x9d, 0x99, 0x9a,
+0xa7, 0xa7, 0xa9,
+0xb5, 0xb4, 0xb2,
+0xc1, 0xc4, 0xc2,
+0x23, 0x02, 0x00,
+0x2d, 0x0d, 0x00,
+0x3a, 0x1b, 0x00,
+0x44, 0x2b, 0x00,
+0x50, 0x36, 0x00,
+0x5c, 0x44, 0x00,
+0x6d, 0x50, 0x00,
+0x78, 0x5e, 0x00,
+0x82, 0x66, 0x04,
+0x8d, 0x75, 0x15,
+0x9d, 0x81, 0x23,
+0xa7, 0x8e, 0x33,
+0xb6, 0x9a, 0x3f,
+0xc2, 0xa8, 0x4d,
+0xd2, 0xb4, 0x5b,
+0xdf, 0xc4, 0x68,
+0x34, 0x00, 0x00,
+0x3f, 0x08, 0x00,
+0x4c, 0x10, 0x00,
+0x55, 0x22, 0x00,
+0x63, 0x2e, 0x00,
+0x6c, 0x3d, 0x00,
+0x7f, 0x48, 0x0e,
+0x8b, 0x55, 0x1b,
+0x96, 0x5d, 0x27,
+0xa2, 0x6b, 0x31,
+0xaf, 0x78, 0x3b,
+0xb9, 0x86, 0x4a,
+0xc9, 0x90, 0x55,
+0xd4, 0x9e, 0x64,
+0xe5, 0xab, 0x71,
+0xf3, 0xbc, 0x81,
+0x3e, 0x00, 0x00,
+0x4b, 0x00, 0x00,
+0x56, 0x00, 0x00,
+0x60, 0x1a, 0x06,
+0x6e, 0x26, 0x15,
+0x79, 0x34, 0x24,
+0x8b, 0x3f, 0x2f,
+0x98, 0x4d, 0x3e,
+0xa3, 0x55, 0x46,
+0xae, 0x63, 0x4f,
+0xbc, 0x6f, 0x5f,
+0xc7, 0x7e, 0x6a,
+0xd4, 0x88, 0x79,
+0xe2, 0x97, 0x84,
+0xf4, 0xa3, 0x93,
+0xff, 0xb2, 0xa6,
+0x40, 0x00, 0x0c,
+0x4e, 0x00, 0x16,
+0x59, 0x00, 0x24,
+0x65, 0x0f, 0x34,
+0x70, 0x20, 0x3e,
+0x7e, 0x2e, 0x4c,
+0x8f, 0x3a, 0x58,
+0x9b, 0x48, 0x69,
+0xa7, 0x4f, 0x6d,
+0xb0, 0x5d, 0x7c,
+0xc0, 0x6a, 0x8b,
+0xc8, 0x78, 0x97,
+0xd8, 0x84, 0xa1,
+0xe2, 0x92, 0xb0,
+0xf6, 0x9e, 0xc0,
+0xfe, 0xad, 0xcf,
+0x3a, 0x00, 0x31,
+0x44, 0x00, 0x3c,
+0x52, 0x00, 0x4d,
+0x5a, 0x13, 0x58,
+0x6b, 0x1e, 0x67,
+0x74, 0x2e, 0x70,
+0x87, 0x3a, 0x7e,
+0x92, 0x47, 0x89,
+0x9e, 0x50, 0x91,
+0xaa, 0x5c, 0xa5,
+0xb5, 0x6a, 0xae,
+0xc1, 0x78, 0xc0,
+0xd1, 0x83, 0xc6,
+0xdb, 0x91, 0xd7,
+0xec, 0x9e, 0xe3,
+0xfc, 0xae, 0xf1,
+0x28, 0x00, 0x4d,
+0x32, 0x00, 0x5a,
+0x42, 0x03, 0x66,
+0x49, 0x18, 0x77,
+0x59, 0x23, 0x82,
+0x63, 0x31, 0x90,
+0x76, 0x3d, 0x99,
+0x82, 0x4a, 0xa7,
+0x8b, 0x53, 0xb0,
+0x98, 0x60, 0xbe,
+0xa5, 0x6c, 0xce,
+0xaf, 0x7b, 0xd9,
+0xbf, 0x85, 0xe8,
+0xcb, 0x94, 0xf2,
+0xdc, 0xa0, 0xfd,
+0xe8, 0xb0, 0xff,
+0x14, 0x00, 0x61,
+0x1f, 0x00, 0x68,
+0x2c, 0x0e, 0x77,
+0x38, 0x1c, 0x85,
+0x44, 0x28, 0x92,
+0x4f, 0x35, 0x9e,
+0x61, 0x41, 0xaa,
+0x6c, 0x50, 0xb6,
+0x76, 0x57, 0xbf,
+0x82, 0x65, 0xd0,
+0x93, 0x71, 0xdc,
+0x9a, 0x80, 0xec,
+0xac, 0x8a, 0xf5,
+0xb6, 0x99, 0xff,
+0xc7, 0xa5, 0xff,
+0xd9, 0xb4, 0xff,
+0x00, 0x00, 0x62,
+0x05, 0x08, 0x6b,
+0x17, 0x14, 0x79,
+0x20, 0x22, 0x87,
+0x30, 0x2d, 0x96,
+0x39, 0x3b, 0xa3,
+0x4a, 0x47, 0xae,
+0x54, 0x55, 0xbb,
+0x60, 0x5e, 0xc5,
+0x6c, 0x6b, 0xd4,
+0x7b, 0x78, 0xe1,
+0x86, 0x86, 0xf1,
+0x95, 0x91, 0xfe,
+0x9d, 0xa0, 0xff,
+0xae, 0xac, 0xff,
+0xbd, 0xbb, 0xff,
+0x00, 0x06, 0x58,
+0x00, 0x0f, 0x63,
+0x00, 0x1b, 0x6f,
+0x00, 0x29, 0x81,
+0x14, 0x34, 0x8c,
+0x1f, 0x42, 0x9a,
+0x2f, 0x4e, 0xa7,
+0x3b, 0x5d, 0xb3,
+0x45, 0x65, 0xbe,
+0x54, 0x73, 0xcc,
+0x66, 0x7f, 0xdc,
+0x6f, 0x8e, 0xe9,
+0x7e, 0x98, 0xf6,
+0x86, 0xa7, 0xfe,
+0x95, 0xb4, 0xff,
+0xa1, 0xc4, 0xff,
+0x00, 0x0d, 0x44,
+0x00, 0x17, 0x4f,
+0x00, 0x23, 0x5d,
+0x00, 0x30, 0x6e,
+0x00, 0x3c, 0x76,
+0x00, 0x49, 0x84,
+0x0c, 0x56, 0x93,
+0x19, 0x66, 0xa0,
+0x2b, 0x6e, 0xa8,
+0x39, 0x7c, 0xb8,
+0x4e, 0x88, 0xc7,
+0x59, 0x96, 0xd5,
+0x66, 0xa1, 0xdf,
+0x6f, 0xb0, 0xe9,
+0x7d, 0xbd, 0xf9,
+0x8c, 0xcd, 0xfe,
+0x00, 0x14, 0x24,
+0x00, 0x1e, 0x2e,
+0x00, 0x29, 0x3e,
+0x00, 0x38, 0x48,
+0x00, 0x42, 0x57,
+0x00, 0x50, 0x61,
+0x00, 0x5d, 0x71,
+0x00, 0x6c, 0x7c,
+0x05, 0x76, 0x84,
+0x20, 0x83, 0x98,
+0x38, 0x90, 0xa1,
+0x45, 0x9e, 0xb1,
+0x57, 0xa9, 0xbc,
+0x5f, 0xb7, 0xc6,
+0x6d, 0xc4, 0xd4,
+0x79, 0xd5, 0xdf,
+0x00, 0x19, 0x00,
+0x00, 0x23, 0x00,
+0x00, 0x2e, 0x0e,
+0x00, 0x3c, 0x1e,
+0x00, 0x46, 0x28,
+0x00, 0x56, 0x37,
+0x00, 0x61, 0x44,
+0x06, 0x71, 0x52,
+0x19, 0x7a, 0x5d,
+0x2b, 0x88, 0x69,
+0x3d, 0x94, 0x77,
+0x4d, 0xa2, 0x83,
+0x5b, 0xae, 0x8f,
+0x64, 0xbc, 0x9c,
+0x71, 0xc9, 0xa9,
+0x7f, 0xd9, 0xba,
+0x00, 0x1a, 0x00,
+0x00, 0x24, 0x00,
+0x00, 0x30, 0x00,
+0x00, 0x3d, 0x00,
+0x00, 0x48, 0x00,
+0x00, 0x56, 0x15,
+0x13, 0x63, 0x20,
+0x22, 0x72, 0x2f,
+0x2e, 0x7a, 0x38,
+0x39, 0x89, 0x42,
+0x4e, 0x94, 0x4f,
+0x58, 0xa3, 0x59,
+0x66, 0xad, 0x6a,
+0x6f, 0xbc, 0x78,
+0x7c, 0xc9, 0x84,
+0x89, 0xd6, 0x91,
+0x03, 0x19, 0x00,
+0x05, 0x23, 0x00,
+0x00, 0x2f, 0x00,
+0x02, 0x3d, 0x00,
+0x05, 0x47, 0x00,
+0x17, 0x56, 0x00,
+0x27, 0x62, 0x00,
+0x34, 0x70, 0x10,
+0x3f, 0x79, 0x19,
+0x4c, 0x86, 0x28,
+0x5e, 0x93, 0x2f,
+0x69, 0xa1, 0x40,
+0x77, 0xad, 0x49,
+0x7e, 0xbb, 0x5c,
+0x8c, 0xc7, 0x6a,
+0x9b, 0xd9, 0x77,
+0x00, 0x14, 0x00,
+0x00, 0x1f, 0x00,
+0x07, 0x2a, 0x00,
+0x0f, 0x3a, 0x00,
+0x24, 0x43, 0x00,
+0x2b, 0x52, 0x00,
+0x3e, 0x5e, 0x00,
+0x4a, 0x6c, 0x00,
+0x55, 0x74, 0x00,
+0x62, 0x82, 0x0b,
+0x70, 0x8f, 0x20,
+0x7e, 0x9c, 0x2d,
+0x89, 0xa8, 0x3b,
+0x94, 0xb6, 0x48,
+0xa4, 0xc2, 0x59,
+0xb1, 0xd2, 0x63
+};
+
 unsigned char *colors[MAXPALETTES] = {
     &cols_pepto_pal[0],
     &cols_pepto_ntsc_sony[0],
@@ -310,6 +570,7 @@
     &cols_pet_green_old[0],
     &cols_z64_pal_viciie[0],
     &cols_colodore_ted[0],
+    &cols_dtv_spiff[0],
 };
 
 char *palettenames[MAXPALETTES] = {
@@ -320,6 +581,7 @@
     "PET green (old)",
     "Z64K (PAL VICIIe)",
     "Colodore TED (Plus4)",
+    "Spiff (C64DTV)",
 };
 
 int findcolorinpalette(unsigned char *p, int palette)
Added: testprogs/testbench/selftest/references/dtv-fail.prg.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/dtv-fail.prg.png
===================================================================
--- testprogs/testbench/selftest/references/dtv-fail.prg.png	2024-04-14 22:38:41 UTC (rev 45118)
+++ testprogs/testbench/selftest/references/dtv-fail.prg.png	2024-04-14 23:00:06 UTC (rev 45119)
Property changes on: testprogs/testbench/selftest/references/dtv-fail.prg.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/dtv-pass.prg.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/dtv-pass.prg.png
===================================================================
--- testprogs/testbench/selftest/references/dtv-pass.prg.png	2024-04-14 22:38:41 UTC (rev 45118)
+++ testprogs/testbench/selftest/references/dtv-pass.prg.png	2024-04-14 23:00:06 UTC (rev 45119)
Property changes on: testprogs/testbench/selftest/references/dtv-pass.prg.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Modified: testprogs/testbench/x64dtv-hooks.sh
===================================================================
--- testprogs/testbench/x64dtv-hooks.sh	2024-04-14 22:38:41 UTC (rev 45118)
+++ testprogs/testbench/x64dtv-hooks.sh	2024-04-14 23:00:06 UTC (rev 45119)
@@ -2,7 +2,7 @@
 X64DTVOPTS+=" -default"
 X64DTVOPTS+=" -VICIIfilter 0"
 X64DTVOPTS+=" -VICIIextpal"
-#X64DTVOPTS+=" -VICIIpalette pepto-pal.vpl"
+X64DTVOPTS+=" -VICIIpalette spiff.vpl"
 X64DTVOPTS+=" -VICIIsaturation 1000"
 X64DTVOPTS+=" -VICIIbrightness 1000"
 X64DTVOPTS+=" -VICIIcontrast 1000"
Modified: testprogs/testbench/x64dtv-testlist.txt
===================================================================
--- testprogs/testbench/x64dtv-testlist.txt	2024-04-14 22:38:41 UTC (rev 45118)
+++ testprogs/testbench/x64dtv-testlist.txt	2024-04-14 23:00:06 UTC (rev 45119)
@@ -7,6 +7,8 @@
 ################################################################################
 ./selftest/,dtv-pass.prg,exitcode,10000000
 ./selftest/,dtv-fail.prg,exitcode,10000000,expect:error
+./selftest/,dtv-pass.prg,screenshot,10000000
+./selftest/,dtv-fail.prg,screenshot,10000000,expect:error
 ../DTV/blitregt/,blitregt.prg,interactive,0
 ../DTV/bmsac/,bmsac.prg,interactive,0
 #TODO:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gp...@us...> - 2024-04-14 22:38:44
      
     | 
| Revision: 45118
          http://sourceforge.net/p/vice-emu/code/45118
Author:   gpz
Date:     2024-04-14 22:38:41 +0000 (Sun, 14 Apr 2024)
Log Message:
-----------
some cartridge cleanup and rework, makes .crt files work from cmdline
Modified Paths:
--------------
    trunk/vice/src/cartridge.h
    trunk/vice/src/cbm2/Makefile.am
    trunk/vice/src/cbm2/cart/cbm2-generic.c
    trunk/vice/src/cbm2/cart/cbm2-generic.h
    trunk/vice/src/cbm2/cart/cbm2cart.c
    trunk/vice/src/cbm2/cbm2.c
    trunk/vice/src/cbm2/cbm2mem.c
    trunk/vice/src/cbm2/cbm2mem.h
    trunk/vice/src/cbm2/cbm2rom.c
    trunk/vice/src/cbm2/cbm2rom.h
    trunk/vice/src/cbm2/cbm5x0.c
    trunk/vice/src/cbm2/cbm5x0mem.c
    trunk/vice/src/cbm2/cbm5x0rom.c
Added Paths:
-----------
    trunk/vice/src/cbm2/cbm2export.c
Modified: trunk/vice/src/cartridge.h
===================================================================
--- trunk/vice/src/cartridge.h	2024-04-14 16:31:09 UTC (rev 45117)
+++ trunk/vice/src/cartridge.h	2024-04-14 22:38:41 UTC (rev 45118)
@@ -583,6 +583,9 @@
 #define CARTRIDGE_CBM2_GENERIC_C4   0x8204  /* 8kb at 0x4000 */
 #define CARTRIDGE_CBM2_GENERIC_C6   0x8208  /* 8kb at 0x6000 */
 
+/* list of canonical names for the CBM2 cartridges: */
+#define CARTRIDGE_CBM2_NAME_GENERIC         "generic cartridge ROM"
+
 /* FIXME: cartconv: the sizes are used in a bitfield and also by their absolute values */
 #define CARTRIDGE_SIZE_2KB     0x00000800
 #define CARTRIDGE_SIZE_4KB     0x00001000
Modified: trunk/vice/src/cbm2/Makefile.am
===================================================================
--- trunk/vice/src/cbm2/Makefile.am	2024-04-14 16:31:09 UTC (rev 45117)
+++ trunk/vice/src/cbm2/Makefile.am	2024-04-14 22:38:41 UTC (rev 45118)
@@ -52,6 +52,7 @@
 	cbm2cpu.c \
 	cbm2datasette.c \
 	cbm2drive.c \
+	cbm2export.c \
 	cbm2iec.c \
 	cbm2iec.h \
 	cbm2io.c \
@@ -91,6 +92,7 @@
 	cbm2cpu.c \
 	cbm2datasette.c \
 	cbm2drive.c \
+	cbm2export.c \
 	cbm2iec.c \
 	cbm2iec.h \
 	cbm2io.c \
Modified: trunk/vice/src/cbm2/cart/cbm2-generic.c
===================================================================
--- trunk/vice/src/cbm2/cart/cbm2-generic.c	2024-04-14 16:31:09 UTC (rev 45117)
+++ trunk/vice/src/cbm2/cart/cbm2-generic.c	2024-04-14 22:38:41 UTC (rev 45118)
@@ -38,11 +38,13 @@
 #include "cbm2rom.h"
 #include "cmdline.h"
 #include "crt.h"
+#include "export.h"
 #include "lib.h"
 #include "log.h"
 #include "machine.h"
 #include "resources.h"
 #include "snapshot.h"
+#include "sysfile.h"
 #include "util.h"
 
 #include "cbm2-generic.h"
@@ -62,6 +64,31 @@
 static char *cart_4_name = NULL;
 static char *cart_6_name = NULL;
 
+#define CBM2_C1_ROM_SIZE    0x1000
+#define CBM2_C2_ROM_SIZE    0x2000
+#define CBM2_C4_ROM_SIZE    0x2000
+#define CBM2_C6_ROM_SIZE    0x2000
+
+static unsigned char c1_rom[CBM2_C1_ROM_SIZE];
+static unsigned char c2_rom[CBM2_C2_ROM_SIZE];
+static unsigned char c4_rom[CBM2_C4_ROM_SIZE];
+static unsigned char c6_rom[CBM2_C6_ROM_SIZE];
+
+static export_resource_t export_res1 = {
+    CARTRIDGE_CBM2_NAME_GENERIC, 0, CBM2_CART_BLK1, NULL, NULL, CARTRIDGE_CBM2_GENERIC
+};
+static export_resource_t export_res2 = {
+    CARTRIDGE_CBM2_NAME_GENERIC, 0, CBM2_CART_BLK2, NULL, NULL, CARTRIDGE_CBM2_GENERIC
+};
+static export_resource_t export_res4 = {
+    CARTRIDGE_CBM2_NAME_GENERIC, 0, CBM2_CART_BLK4, NULL, NULL, CARTRIDGE_CBM2_GENERIC
+};
+static export_resource_t export_res6 = {
+    CARTRIDGE_CBM2_NAME_GENERIC, 0, CBM2_CART_BLK6, NULL, NULL, CARTRIDGE_CBM2_GENERIC
+};
+
+/******************************************************************************/
+
 /*
     unlike in the other emulators, there are no separate arrays for the cartridge
     images, we'll have to use the mem_rom array with offsets instead:
@@ -73,32 +100,66 @@
 #define MEMPTR_CART4    (mem_rom + 0x4000)  /* 8k */
 #define MEMPTR_CART6    (mem_rom + 0x6000)  /* 8k */
 
-#define CBM2_C1_ROM_SIZE    0x1000
-#define CBM2_C2_ROM_SIZE    0x2000
-#define CBM2_C4_ROM_SIZE    0x2000
-#define CBM2_C6_ROM_SIZE    0x2000
+/* in the global memory array:
+   - initialize "blank" cart rom areas
+   - copy cartridge rom in used areas */
+int generic_cartrom_to_mem_hack(void)
+{
+    memset(mem_rom + 0x1000, 0xff, 0x7000);
+    export_remove(&export_res1);
+    export_remove(&export_res2);
+    export_remove(&export_res4);
+    export_remove(&export_res6);
 
-/* FIXME: this function must check the actual generic type and then
-          update C1/C2/C4/C6 accordingly */
+    if ((generic_type & CARTRIDGE_CBM2_GENERIC_TYPE_MASK) & CARTRIDGE_CBM2_GENERIC_C1) {
+        memcpy(MEMPTR_CART1, c1_rom, CBM2_C1_ROM_SIZE);
+        if (export_add(&export_res1) < 0) {
+            return -1;
+        }
+    }
+    if ((generic_type & CARTRIDGE_CBM2_GENERIC_TYPE_MASK) & CARTRIDGE_CBM2_GENERIC_C2) {
+        memcpy(MEMPTR_CART2, c2_rom, CBM2_C2_ROM_SIZE);
+        if (export_add(&export_res2) < 0) {
+            return -1;
+        }
+    }
+    if ((generic_type & CARTRIDGE_CBM2_GENERIC_TYPE_MASK) & CARTRIDGE_CBM2_GENERIC_C4) {
+        memcpy(MEMPTR_CART4, c4_rom, CBM2_C4_ROM_SIZE);
+        if (export_add(&export_res4) < 0) {
+            return -1;
+        }
+    }
+    if ((generic_type & CARTRIDGE_CBM2_GENERIC_TYPE_MASK) & CARTRIDGE_CBM2_GENERIC_C6) {
+        memcpy(MEMPTR_CART6, c6_rom, CBM2_C6_ROM_SIZE);
+        if (export_add(&export_res6) < 0) {
+            return -1;
+        }
+    }
+    return 0;
+}
+
+/******************************************************************************/
+
 void generic_config_setup(uint8_t *rawcart)
 {
     DBG(("generic_config_setup"));
     if ((generic_type & CARTRIDGE_CBM2_GENERIC_TYPE_MASK) & CARTRIDGE_CBM2_GENERIC_C1) {
-        memcpy(MEMPTR_CART1, rawcart + 0x1000, CBM2_C1_ROM_SIZE);
+        memcpy(c1_rom, rawcart + 0x1000, CBM2_C1_ROM_SIZE);
         DBG(("generic_config_setup c1"));
     }
     if ((generic_type & CARTRIDGE_CBM2_GENERIC_TYPE_MASK) & CARTRIDGE_CBM2_GENERIC_C2) {
-        memcpy(MEMPTR_CART2, rawcart + 0x2000, CBM2_C2_ROM_SIZE);
+        memcpy(c2_rom, rawcart + 0x2000, CBM2_C2_ROM_SIZE);
         DBG(("generic_config_setup c2"));
     }
     if ((generic_type & CARTRIDGE_CBM2_GENERIC_TYPE_MASK) & CARTRIDGE_CBM2_GENERIC_C4) {
-        memcpy(MEMPTR_CART4, rawcart + 0x4000, CBM2_C4_ROM_SIZE);
+        memcpy(c4_rom, rawcart + 0x4000, CBM2_C4_ROM_SIZE);
         DBG(("generic_config_setup c4"));
     }
     if ((generic_type & CARTRIDGE_CBM2_GENERIC_TYPE_MASK) & CARTRIDGE_CBM2_GENERIC_C6) {
-        memcpy(MEMPTR_CART6, rawcart + 0x6000, CBM2_C6_ROM_SIZE);
+        memcpy(c6_rom, rawcart + 0x6000, CBM2_C6_ROM_SIZE);
         DBG(("generic_config_setup c6"));
     }
+    generic_cartrom_to_mem_hack();
 }
 
 /* FIXME: alloc ROMs here */
@@ -236,27 +297,24 @@
     return generic_common_attach();
 }
 
+/* NOTE_: clearing the name/resource will trigger clearing the ROM array */
 void generic_detach(int type)
 {
     DBG(("generic_detach type: '%04x'", (unsigned)type));
     if (type & CARTRIDGE_CBM2_GENERIC_TYPE_MASK & CARTRIDGE_CBM2_GENERIC_C1) {
         resources_set_string("Cart1Name", "");
-        memset(MEMPTR_CART1, 0xff, CBM2_C1_ROM_SIZE);
     }
     if (type & CARTRIDGE_CBM2_GENERIC_TYPE_MASK & CARTRIDGE_CBM2_GENERIC_C2) {
         resources_set_string("Cart2Name", "");
-        memset(MEMPTR_CART2, 0xff, CBM2_C2_ROM_SIZE);
     }
     if (type & CARTRIDGE_CBM2_GENERIC_TYPE_MASK & CARTRIDGE_CBM2_GENERIC_C4) {
         resources_set_string("Cart4Name", "");
-        memset(MEMPTR_CART4, 0xff, CBM2_C4_ROM_SIZE);
     }
     if (type & CARTRIDGE_CBM2_GENERIC_TYPE_MASK & CARTRIDGE_CBM2_GENERIC_C6) {
         resources_set_string("Cart6Name", "");
-        memset(MEMPTR_CART6, 0xff, CBM2_C6_ROM_SIZE);
     }
 
-    generic_type &= ~(type & CARTRIDGE_CBM2_GENERIC_TYPE_MASK);
+    generic_cartrom_to_mem_hack();
 }
 
 static const cmdline_option_t cmdline_options[] =
@@ -281,7 +339,66 @@
     return cmdline_register_options(cmdline_options);
 }
 
+static int cbm2rom_load_cart_1(const char *rom_name)
+{
+    memset(c1_rom, 0xff, 0x1000);
+    generic_type &= ~CARTRIDGE_CBM2_GENERIC_C1;
+    if (!util_check_null_string(rom_name)) {
+        if ((sysfile_load(rom_name, machine_name, c1_rom, 0x1000, 0x1000) < 0)) {
+            log_error(LOG_DEFAULT, "Couldn't load ROM `%s'.", rom_name);
+        } else {
+            generic_type |= CARTRIDGE_CBM2_GENERIC_C1;
+        }
+    }
+    generic_cartrom_to_mem_hack();
+    return 0;
+}
 
+static int cbm2rom_load_cart_2(const char *rom_name)
+{
+    memset(c2_rom, 0xff, 0x2000);
+    generic_type &= ~CARTRIDGE_CBM2_GENERIC_C2;
+    if (!util_check_null_string(rom_name)) {
+        if ((sysfile_load(rom_name, machine_name, c2_rom, 0x2000, 0x2000) < 0)) {
+            log_error(LOG_DEFAULT, "Couldn't load ROM `%s'.", rom_name);
+        } else {
+            generic_type |= CARTRIDGE_CBM2_GENERIC_C2;
+        }
+    }
+    generic_cartrom_to_mem_hack();
+    return 0;
+}
+
+static int cbm2rom_load_cart_4(const char *rom_name)
+{
+    memset(c4_rom, 0xff, 0x2000);
+    generic_type &= ~CARTRIDGE_CBM2_GENERIC_C4;
+    if (!util_check_null_string(rom_name)) {
+        if ((sysfile_load(rom_name, machine_name, c4_rom, 0x2000, 0x2000) < 0)) {
+            log_error(LOG_DEFAULT, "Couldn't load ROM `%s'.", rom_name);
+        } else {
+            generic_type |= CARTRIDGE_CBM2_GENERIC_C4;
+        }
+    }
+    generic_cartrom_to_mem_hack();
+    return 0;
+}
+
+static int cbm2rom_load_cart_6(const char *rom_name)
+{
+    memset(c6_rom, 0xff, 0x2000);
+    generic_type &= ~CARTRIDGE_CBM2_GENERIC_C6;
+    if (!util_check_null_string(rom_name)) {
+        if ((sysfile_load(rom_name, machine_name, c6_rom, 0x2000, 0x2000) < 0)) {
+            log_error(LOG_DEFAULT, "Couldn't load ROM `%s'.", rom_name);
+        } else {
+            generic_type |= CARTRIDGE_CBM2_GENERIC_C6;
+        }
+    }
+    generic_cartrom_to_mem_hack();
+    return 0;
+}
+
 static int set_cart1_rom_name(const char *val, void *param)
 {
     if (util_string_set(&cart_1_name, val)) {
Modified: trunk/vice/src/cbm2/cart/cbm2-generic.h
===================================================================
--- trunk/vice/src/cbm2/cart/cbm2-generic.h	2024-04-14 16:31:09 UTC (rev 45117)
+++ trunk/vice/src/cbm2/cart/cbm2-generic.h	2024-04-14 22:38:41 UTC (rev 45118)
@@ -28,6 +28,8 @@
 #ifndef VICE_CBM2GENERICCART_H
 #define VICE_CBM2GENERICCART_H
 
+#include "snapshot.h"
+
 void generic_config_setup(uint8_t *rawcart);
 
 int generic_crt_attach(FILE *fd, uint8_t *rawcart);
@@ -42,4 +44,6 @@
 int generic_snapshot_write_module(snapshot_t *s);
 int generic_snapshot_read_module(snapshot_t *s);
 
+int generic_cartrom_to_mem_hack(void);
+
 #endif
Modified: trunk/vice/src/cbm2/cart/cbm2cart.c
===================================================================
--- trunk/vice/src/cbm2/cart/cbm2cart.c	2024-04-14 16:31:09 UTC (rev 45117)
+++ trunk/vice/src/cbm2/cart/cbm2cart.c	2024-04-14 22:38:41 UTC (rev 45118)
@@ -35,6 +35,7 @@
 #include "cbm2cart.h"
 #include "cbm2mem.h"
 #include "cbm2rom.h"
+#include "export.h"
 #include "crt.h"
 #include "lib.h"
 #include "log.h"
@@ -75,10 +76,13 @@
 /* actually in use */
 static char *cartfile = NULL; /* file name */
 static int cbm2cart_type = CARTRIDGE_NONE; /* is == CARTRIDGE_CRT (0) if CRT file */
-static int crttype = CARTRIDGE_NONE; /* contains CRT ID if plus4cart_type == 0 */
+static int crttype = CARTRIDGE_NONE; /* contains CRT ID if cbm2cart_type == 0 */
 
 static int mem_cartridge_type = CARTRIDGE_NONE;  /* Type of the cartridge attached. */
 
+/* ---------------------------------------------------------------------*/
+
+/* FIXME: these probably shouldn't be here */
 int cart08_ram = 0;
 int cart1_ram = 0;
 int cart2_ram = 0;
@@ -86,6 +90,22 @@
 int cart6_ram = 0;
 int cartC_ram = 0;
 
+static export_resource_t export_res08 = {
+    "RAM" , 0, CBM2_CART_BLK08, NULL, NULL, 0
+};
+static export_resource_t export_res1 = {
+    "RAM" , 0, CBM2_CART_BLK1, NULL, NULL, 0
+};
+static export_resource_t export_res2 = {
+    "RAM" , 0, CBM2_CART_BLK2, NULL, NULL, 0
+};
+static export_resource_t export_res4 = {
+    "RAM" , 0, CBM2_CART_BLK4, NULL, NULL, 0
+};
+static export_resource_t export_res6 = {
+    "RAM" , 0, CBM2_CART_BLK6, NULL, NULL, 0
+};
+
 /* ---------------------------------------------------------------------*/
 
 static uint8_t romh_banks[1]; /* dummy */
@@ -169,18 +189,27 @@
 #if 0
     mon_cart_cmd.cartridge_trigger_freeze = cartridge_trigger_freeze;
     mon_cart_cmd.cartridge_trigger_freeze_nmi_only = cartridge_trigger_freeze_nmi_only;
-    mon_cart_cmd.export_dump = cbm2export_dump;
 #endif
+    mon_cart_cmd.export_dump = export_dump;
     return cmdline_register_options(cmdline_options);
 }
 
 /* ---------------------------------------------------------------------*/
 
+/* FIXME: these probably shouldn't be here */
 
 static int set_cart08_ram(int val, void *param)
 {
     cart08_ram = val ? 1 : 0;
 
+    export_remove(&export_res08);
+    if (cart08_ram) {
+        if (export_add(&export_res08) < 0) {
+            return -1;
+        }
+    }
+
+    generic_cartrom_to_mem_hack();
     mem_initialize_memory_bank(15);
     return 0;
 }
@@ -189,6 +218,14 @@
 {
     cart1_ram = val ? 1 : 0;
 
+    export_remove(&export_res1);
+    if (cart1_ram) {
+        if (export_add(&export_res1) < 0) {
+            return -1;
+        }
+    }
+
+    generic_cartrom_to_mem_hack();
     mem_initialize_memory_bank(15);
     return 0;
 }
@@ -197,6 +234,14 @@
 {
     cart2_ram = val ? 1 : 0;
 
+    export_remove(&export_res2);
+    if (cart2_ram) {
+        if (export_add(&export_res2) < 0) {
+            return -1;
+        }
+    }
+
+    generic_cartrom_to_mem_hack();
     mem_initialize_memory_bank(15);
     return 0;
 }
@@ -205,6 +250,14 @@
 {
     cart4_ram = val ? 1 : 0;
 
+    export_remove(&export_res4);
+    if (cart4_ram) {
+        if (export_add(&export_res4) < 0) {
+            return -1;
+        }
+    }
+
+    generic_cartrom_to_mem_hack();
     mem_initialize_memory_bank(15);
     return 0;
 }
@@ -213,6 +266,14 @@
 {
     cart6_ram = val ? 1 : 0;
 
+    export_remove(&export_res6);
+    if (cart6_ram) {
+        if (export_add(&export_res6) < 0) {
+            return -1;
+        }
+    }
+
+    generic_cartrom_to_mem_hack();
     mem_initialize_memory_bank(15);
     return 0;
 }
@@ -220,7 +281,16 @@
 static int set_cartC_ram(int val, void *param)
 {
     cartC_ram = val ? 1 : 0;
-
+#if 0
+    /* FIXME: block C is not available at the expansion port? */
+    export_remove(&export_resC);
+    if (cartC_ram) {
+        if (export_add(&export_resC) < 0) {
+            return -1;
+        }
+    }
+#endif
+    generic_cartrom_to_mem_hack();
     mem_initialize_memory_bank(15);
     return 0;
 }
Modified: trunk/vice/src/cbm2/cbm2.c
===================================================================
--- trunk/vice/src/cbm2/cbm2.c	2024-04-14 16:31:09 UTC (rev 45117)
+++ trunk/vice/src/cbm2/cbm2.c	2024-04-14 22:38:41 UTC (rev 45118)
@@ -59,6 +59,7 @@
 #include "drive-resources.h"
 #include "drive-sound.h"
 #include "drive.h"
+#include "export.h"
 #include "fliplist.h"
 #include "fsdevice.h"
 #include "gfxoutput.h"
@@ -299,6 +300,10 @@
         init_resource_fail("cbm2");
         return -1;
     }
+    if (export_resources_init() < 0) {
+        init_resource_fail("cbm2export");
+        return -1;
+    }
     if (cartio_resources_init() < 0) {
         init_resource_fail("cartio");
         return -1;
Added: trunk/vice/src/cbm2/cbm2export.c
===================================================================
--- trunk/vice/src/cbm2/cbm2export.c	                        (rev 0)
+++ trunk/vice/src/cbm2/cbm2export.c	2024-04-14 22:38:41 UTC (rev 45118)
@@ -0,0 +1,150 @@
+/*
+ * cbm2export.c - Expansion port and devices handling for the CBM2 machines.
+ *
+ * Written by
+ *  groepaz
+ *
+ * This file is part of VICE, the Versatile Commodore Emulator.
+ * See README for copyright notice.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ *  02111-1307  USA.
+ *
+ */
+
+#include "vice.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "assert.h"
+#include "export.h"
+#include "lib.h"
+#include "monitor.h"
+#include "cbm2mem.h"
+
+/* #define DEBUGEXPORT */
+
+#ifdef DEBUGEXPORT
+#define DBG(x)  printf x
+#else
+#define DBG(x)
+#endif
+
+export_list_t cbm2export_head = { NULL, NULL, NULL };
+
+export_list_t *export_query_list(export_list_t *item)
+{
+    if (item) {
+        return item->next;
+    } else {
+        return cbm2export_head.next;
+    }
+}
+
+void export_dump(void)
+{
+    export_list_t *current = NULL;
+    io_source_t *io;
+    int cartid;
+    int exrom;
+
+    current = export_query_list(current);
+
+    if (current == NULL) {
+        mon_out("No expansion port devices.\n");
+    } else {
+               /*----- --------- --------- ----- ------------------------ */
+        mon_out("CRT-ID 81246 Name\n");
+        while (current != NULL) {
+            cartid = ((int)current->device->cartid);
+            if (cartid < 0) {
+                mon_out("0/%4d ", cartid);
+            } else {
+                mon_out("%6d ", cartid);
+            }
+
+            exrom = current->device->exrom;
+
+            mon_out("%c", (exrom & CBM2_CART_BLK08) ? '*' : ' ');
+            mon_out("%c", (exrom & CBM2_CART_BLK1) ? '*' : ' ');
+            mon_out("%c", (exrom & CBM2_CART_BLK2) ? '*' : ' ');
+            mon_out("%c", (exrom & CBM2_CART_BLK4) ? '*' : ' ');
+            mon_out("%c", (exrom & CBM2_CART_BLK6) ? '*' : ' ');
+
+            mon_out(" %s\n", current->device->name);
+
+            current = current->next;
+        }
+    }
+
+}
+
+int export_add(const export_resource_t *export_res)
+{
+    export_list_t *current;
+    export_list_t *newentry = lib_malloc(sizeof(export_list_t));
+
+    assert(export_res != NULL);
+    DBG(("EXP: register name:%s\n", export_res->name));
+
+    /* find last entry */
+    current = &cbm2export_head;
+    while (current->next != NULL) {
+        current = current->next;
+    }
+    /* add new entry at end of list */
+    current->next = newentry;
+    newentry->previous = current;
+    newentry->device = (export_resource_t *)export_res;
+    newentry->next = NULL;
+
+    return 0;
+}
+
+int export_remove(const export_resource_t *export_res)
+{
+    export_list_t *current;
+    export_list_t *prev;
+
+    assert(export_res != NULL);
+    DBG(("EXP: unregister name:%s\n", export_res->name));
+
+    /* find entry */
+    current = cbm2export_head.next;
+    while (current != NULL) {
+        if (current->device) {
+            if (current->device == export_res) {
+                /* if entry found, remove it from list */
+                prev = current->previous;
+                prev->next = current->next;
+                if (current->next) {
+                    current->next->previous = prev;
+                }
+                lib_free(current);
+                return 0;
+            }
+        }
+        current = current->next;
+    }
+    /* FIXME: when all structs have been updated we can place an assertion here */
+    DBG(("EXP: BUG unregister name: '%s' not found\n", export_res->name));
+    return -1;
+}
+
+int export_resources_init(void)
+{
+    return 0;
+}
Modified: trunk/vice/src/cbm2/cbm2mem.c
===================================================================
--- trunk/vice/src/cbm2/cbm2mem.c	2024-04-14 16:31:09 UTC (rev 45117)
+++ trunk/vice/src/cbm2/cbm2mem.c	2024-04-14 22:38:41 UTC (rev 45118)
@@ -842,6 +842,8 @@
 
     ram_init(mem_ram, CBM2_RAM_SIZE);
 
+    /* FIXME: this appears to be some odd hack to simulate "no ROM".
+              also see similar thing in mem_load() */
     for (i = 0; i < 0x800; i += 0x80) {
         memset(mem_rom + i, 0, 0x40);
         memset(mem_rom + i + 0x40, 0xff, 0x40);
Modified: trunk/vice/src/cbm2/cbm2mem.h
===================================================================
--- trunk/vice/src/cbm2/cbm2mem.h	2024-04-14 16:31:09 UTC (rev 45117)
+++ trunk/vice/src/cbm2/cbm2mem.h	2024-04-14 22:38:41 UTC (rev 45118)
@@ -32,12 +32,21 @@
 
 #define CBM2_RAM_SIZE           0x100000        /* maximum 1M */
 #define CBM2_ROM_SIZE           0x10000         /* complete bank 15 */
+
+extern uint8_t mem_rom[CBM2_ROM_SIZE];
+
+/* new cart system */
+#define CBM2_CART_BLK08   (1 << 0)
+#define CBM2_CART_BLK1    (1 << 1)
+#define CBM2_CART_BLK2    (1 << 2)
+#define CBM2_CART_BLK4    (1 << 3)
+#define CBM2_CART_BLK6    (1 << 4)
+
 /* 8k ROM (2 banks of 4k), every other 2k is "seen" inverted by the CRTC due
    to some extra logic on the board. we generate a "ROM" that is twice the
    original size at load time so we dont need extra code for this at runtime */
 #define CBM2_CHARGEN_ROM_SIZE   0x4000
 
-extern uint8_t mem_rom[CBM2_ROM_SIZE];
 extern uint8_t mem_chargen_rom[CBM2_CHARGEN_ROM_SIZE];
 
 void cbm2mem_set_bank_exec(int val);
Modified: trunk/vice/src/cbm2/cbm2rom.c
===================================================================
--- trunk/vice/src/cbm2/cbm2rom.c	2024-04-14 16:31:09 UTC (rev 45117)
+++ trunk/vice/src/cbm2/cbm2rom.c	2024-04-14 22:38:41 UTC (rev 45118)
@@ -33,6 +33,7 @@
 
 #include "autostart.h"
 #include "cbm2.h"
+#include "cbm2-generic.h"
 #include "cbm2mem.h"
 #include "cbm2rom.h"
 #include "crtc.h"
@@ -179,70 +180,6 @@
     return 0;
 }
 
-int cbm2rom_load_cart_1(const char *rom_name)
-{
-    if (!rom_loaded) {
-        return 0;  /* init not far enough */
-    }
-    if (!util_check_null_string(rom_name)) {
-        if ((sysfile_load(rom_name, machine_name, mem_rom + 0x1000, 0x1000, 0x1000) < 0)) {
-            log_error(cbm2rom_log, "Couldn't load ROM `%s'.",
-                      rom_name);
-        }
-    } else {
-        memset(mem_rom + 0x1000, 0xff, 0x1000);
-    }
-    return 0;
-}
-
-int cbm2rom_load_cart_2(const char *rom_name)
-{
-    if (!rom_loaded) {
-        return 0;  /* init not far enough */
-    }
-    if (!util_check_null_string(rom_name)) {
-        if ((sysfile_load(rom_name, machine_name, mem_rom + 0x2000, 0x2000, 0x2000) < 0)) {
-            log_error(cbm2rom_log, "Couldn't load ROM `%s'.",
-                      rom_name);
-        }
-    } else {
-        memset(mem_rom + 0x2000, 0xff, 0x2000);
-    }
-    return 0;
-}
-
-int cbm2rom_load_cart_4(const char *rom_name)
-{
-    if (!rom_loaded) {
-        return 0;  /* init not far enough */
-    }
-    if (!util_check_null_string(rom_name)) {
-        if ((sysfile_load(rom_name, machine_name, mem_rom + 0x4000, 0x2000, 0x2000) < 0)) {
-            log_error(cbm2rom_log, "Couldn't load ROM `%s'.",
-                      rom_name);
-        }
-    } else {
-        memset(mem_rom + 0x4000, 0xff, 0x2000);
-    }
-    return 0;
-}
-
-int cbm2rom_load_cart_6(const char *rom_name)
-{
-    if (!rom_loaded) {
-        return 0;  /* init not far enough */
-    }
-    if (!util_check_null_string(rom_name)) {
-        if ((sysfile_load(rom_name, machine_name, mem_rom + 0x6000, 0x2000, 0x2000) < 0)) {
-            log_error(cbm2rom_log, "Couldn't load ROM `%s'.",
-                      rom_name);
-        }
-    } else {
-        memset(mem_rom + 0x6000, 0xff, 0x2000);
-    }
-    return 0;
-}
-
 /* Load memory image files. */
 int mem_load(void)
 {
@@ -255,6 +192,12 @@
 
     rom_loaded = 1;
 
+    /* FIXME: shouldn't we be able to load this from a file too? */
+    /* Init Disk ROM with 'unused address' values. */
+    for (i = 0x800; i < 0x1000; i++) {
+        mem_rom[i] = 0xff;
+    }
+
     if (resources_get_string("ChargenName", &rom_name) < 0) {
         return -1;
     }
@@ -262,11 +205,6 @@
         return -1;
     }
 
-    /* Init Disk/Cartridge ROM with 'unused address' values.  */
-    for (i = 0x800; i < 0x8000; i++) {
-        mem_rom[i] = 0xff;
-    }
-
     if (resources_get_string("KernalName", &rom_name) < 0) {
         return -1;
     }
@@ -281,35 +219,8 @@
         return -1;
     }
 
-    /* Load extension ROMs.  */
-    if (resources_get_string("Cart1Name", &rom_name) < 0) {
-        return -1;
-    }
-    if (cbm2rom_load_cart_1(rom_name) < 0) {
-        return -1;
-    }
+    generic_cartrom_to_mem_hack();
 
-    if (resources_get_string("Cart2Name", &rom_name) < 0) {
-        return -1;
-    }
-    if (cbm2rom_load_cart_2(rom_name) < 0) {
-        return -1;
-    }
-
-    if (resources_get_string("Cart4Name", &rom_name) < 0) {
-        return -1;
-    }
-    if (cbm2rom_load_cart_4(rom_name) < 0) {
-        return -1;
-    }
-
-    if (resources_get_string("Cart6Name", &rom_name) < 0) {
-        return -1;
-    }
-    if (cbm2rom_load_cart_6(rom_name) < 0) {
-        return -1;
-    }
-
     crtc_set_screen_addr(mem_rom + 0xd000);
 
     return 0;
Modified: trunk/vice/src/cbm2/cbm2rom.h
===================================================================
--- trunk/vice/src/cbm2/cbm2rom.h	2024-04-14 16:31:09 UTC (rev 45117)
+++ trunk/vice/src/cbm2/cbm2rom.h	2024-04-14 22:38:41 UTC (rev 45118)
@@ -31,10 +31,6 @@
 int cbm2rom_load_chargen(const char *rom_name);
 int cbm2rom_load_kernal(const char *rom_name);
 int cbm2rom_load_basic(const char *rom_name);
-int cbm2rom_load_cart_1(const char *rom_name);
-int cbm2rom_load_cart_2(const char *rom_name);
-int cbm2rom_load_cart_4(const char *rom_name);
-int cbm2rom_load_cart_6(const char *rom_name);
 
 int cbm2rom_checksum(void);
 
Modified: trunk/vice/src/cbm2/cbm5x0.c
===================================================================
--- trunk/vice/src/cbm2/cbm5x0.c	2024-04-14 16:31:09 UTC (rev 45117)
+++ trunk/vice/src/cbm2/cbm5x0.c	2024-04-14 22:38:41 UTC (rev 45118)
@@ -56,6 +56,7 @@
 #include "drive-resources.h"
 #include "drive-sound.h"
 #include "drive.h"
+#include "export.h"
 #include "fliplist.h"
 #include "fsdevice.h"
 #include "gfxoutput.h"
@@ -315,6 +316,10 @@
         init_resource_fail("cbm2");
         return -1;
     }
+    if (export_resources_init() < 0) {
+        init_resource_fail("cbm2export");
+        return -1;
+    }
     if (cartio_resources_init() < 0) {
         init_resource_fail("cartio");
         return -1;
Modified: trunk/vice/src/cbm2/cbm5x0mem.c
===================================================================
--- trunk/vice/src/cbm2/cbm5x0mem.c	2024-04-14 16:31:09 UTC (rev 45117)
+++ trunk/vice/src/cbm2/cbm5x0mem.c	2024-04-14 22:38:41 UTC (rev 45118)
@@ -928,6 +928,8 @@
 
     ram_init(mem_ram, CBM2_RAM_SIZE);
 
+    /* FIXME: this appears to be some odd hack to simulate "no ROM".
+              also see similar thing in mem_load() */
     for (i = 0; i < 0x800; i += 0x80) {
         memset(mem_rom + i, 0, 0x40);
         memset(mem_rom + i + 0x40, 0xff, 0x40);
Modified: trunk/vice/src/cbm2/cbm5x0rom.c
===================================================================
--- trunk/vice/src/cbm2/cbm5x0rom.c	2024-04-14 16:31:09 UTC (rev 45117)
+++ trunk/vice/src/cbm2/cbm5x0rom.c	2024-04-14 22:38:41 UTC (rev 45118)
@@ -32,6 +32,7 @@
 
 #include "autostart.h"
 #include "cbm2.h"
+#include "cbm2-generic.h"
 #include "cbm2mem.h"
 #include "cbm2rom.h"
 #include "kbdbuf.h"
@@ -149,70 +150,6 @@
     return 0;
 }
 
-int cbm2rom_load_cart_1(const char *rom_name)
-{
-    if (!rom_loaded) {
-        return 0;  /* init not far enough */
-    }
-    if (!util_check_null_string(rom_name)) {
-        if ((sysfile_load(rom_name, machine_name, mem_rom + 0x1000, 0x1000, 0x1000) < 0)) {
-            log_error(cbm2rom_log, "Couldn't load ROM `%s'.",
-                      rom_name);
-        }
-    } else {
-        memset(mem_rom + 0x1000, 0xff, 0x1000);
-    }
-    return 0;
-}
-
-int cbm2rom_load_cart_2(const char *rom_name)
-{
-    if (!rom_loaded) {
-        return 0;  /* init not far enough */
-    }
-    if (!util_check_null_string(rom_name)) {
-        if ((sysfile_load(rom_name, machine_name, mem_rom + 0x2000, 0x2000, 0x2000) < 0)) {
-            log_error(cbm2rom_log, "Couldn't load ROM `%s'.",
-                      rom_name);
-        }
-    } else {
-        memset(mem_rom + 0x2000, 0xff, 0x2000);
-    }
-    return 0;
-}
-
-int cbm2rom_load_cart_4(const char *rom_name)
-{
-    if (!rom_loaded) {
-        return 0;  /* init not far enough */
-    }
-    if (!util_check_null_string(rom_name)) {
-        if ((sysfile_load(rom_name, machine_name, mem_rom + 0x4000, 0x2000, 0x2000) < 0)) {
-            log_error(cbm2rom_log, "Couldn't load ROM `%s'.",
-                      rom_name);
-        }
-    } else {
-        memset(mem_rom + 0x4000, 0xff, 0x2000);
-    }
-    return 0;
-}
-
-int cbm2rom_load_cart_6(const char *rom_name)
-{
-    if (!rom_loaded) {
-        return 0;  /* init not far enough */
-    }
-    if (!util_check_null_string(rom_name)) {
-        if ((sysfile_load(rom_name, machine_name, mem_rom + 0x6000, 0x2000, 0x2000) < 0)) {
-            log_error(cbm2rom_log, "Couldn't load ROM `%s'.",
-                      rom_name);
-        }
-    } else {
-        memset(mem_rom + 0x6000, 0xff, 0x2000);
-    }
-    return 0;
-}
-
 /* Load memory image files. */
 int mem_load(void)
 {
@@ -225,6 +162,12 @@
 
     rom_loaded = 1;
 
+    /* FIXME: shouldn't we be able to load this from a file too? */
+    /* Init Disk ROM with 'unused address' values. */
+    for (i = 0x800; i < 0x1000; i++) {
+        mem_rom[i] = 0xff;
+    }
+
     if (resources_get_string("ChargenName", &rom_name) < 0) {
         return -1;
     }
@@ -232,11 +175,6 @@
         return -1;
     }
 
-    /* Init Disk/Cartridge ROM with 'unused address' values.  */
-    for (i = 0x800; i < 0x8000; i++) {
-        mem_rom[i] = 0xff;
-    }
-
     if (resources_get_string("KernalName", &rom_name) < 0) {
         return -1;
     }
@@ -251,35 +189,8 @@
         return -1;
     }
 
-    /* Load extension ROMs.  */
-    if (resources_get_string("Cart1Name", &rom_name) < 0) {
-        return -1;
-    }
-    if (cbm2rom_load_cart_1(rom_name) < 0) {
-        return -1;
-    }
+    generic_cartrom_to_mem_hack();
 
-    if (resources_get_string("Cart2Name", &rom_name) < 0) {
-        return -1;
-    }
-    if (cbm2rom_load_cart_2(rom_name) < 0) {
-        return -1;
-    }
-
-    if (resources_get_string("Cart4Name", &rom_name) < 0) {
-        return -1;
-    }
-    if (cbm2rom_load_cart_4(rom_name) < 0) {
-        return -1;
-    }
-
-    if (resources_get_string("Cart6Name", &rom_name) < 0) {
-        return -1;
-    }
-    if (cbm2rom_load_cart_6(rom_name) < 0) {
-        return -1;
-    }
-
     /* FIXME: VIC-II config */
 
     return 0;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gp...@us...> - 2024-04-14 16:31:10
      
     | 
| Revision: 45117
          http://sourceforge.net/p/vice-emu/code/45117
Author:   gpz
Date:     2024-04-14 16:31:09 +0000 (Sun, 14 Apr 2024)
Log Message:
-----------
tweak VIC20 ram init pattern, this makes some known cases that rely on it work (AE, Jelly Monsters)
Modified Paths:
--------------
    trunk/vice/src/ram.c
Modified: trunk/vice/src/ram.c
===================================================================
--- trunk/vice/src/ram.c	2024-04-14 16:29:46 UTC (rev 45116)
+++ trunk/vice/src/ram.c	2024-04-14 16:31:09 UTC (rev 45117)
@@ -133,7 +133,7 @@
           emulator/machine.
 */
 /* RAM-related resources. */
-static const resource_int_t resources_int[] = {
+static resource_int_t resources_int[] = {
     { "RAMInitValueOffset", 2, RES_EVENT_SAME, NULL,
       &mainramparam.value_offset, set_value_offset, NULL },
     { "RAMInitStartValue", 0, RES_EVENT_SAME, NULL,
@@ -157,6 +157,28 @@
 int ram_resources_init(void)
 {
     if (machine_class != VICE_MACHINE_VSID) {
+        /* FIXME: tweak and test defaults for the various machines */
+        if (machine_class == VICE_MACHINE_C64) {
+            /* see testprogs/c64/raminitpattern */
+            resources_int[0].factory_value = 2;     /* RAMInitValueOffset */
+            resources_int[1].factory_value = 0;     /* RAMInitStartValue */
+            resources_int[2].factory_value = 4;     /* RAMInitValueInvert */
+            resources_int[3].factory_value = 16384; /* RAMInitPatternInvert */
+            resources_int[4].factory_value = 255;   /* RAMInitPatternInvertValue */
+            resources_int[5].factory_value = 0;     /* RAMInitStartRandom */
+            resources_int[6].factory_value = 0;     /* RAMInitRepeatRandom */
+            resources_int[7].factory_value = RAM_INIT_RANDOM_CHANCE_DEFAULT;     /* RAMInitRandomChance */
+        } else if (machine_class == VICE_MACHINE_VIC20) {
+            /* see testprogs/vic20/raminitpattern */
+            resources_int[0].factory_value = 0;     /* RAMInitValueOffset */
+            resources_int[1].factory_value = 255;   /* RAMInitStartValue */
+            resources_int[2].factory_value = 1;     /* RAMInitValueInvert */
+            resources_int[3].factory_value = 0;     /* RAMInitPatternInvert */
+            resources_int[4].factory_value = 0;     /* RAMInitPatternInvertValue */
+            resources_int[5].factory_value = 0;     /* RAMInitStartRandom */
+            resources_int[6].factory_value = 0;     /* RAMInitRepeatRandom */
+            resources_int[7].factory_value = RAM_INIT_RANDOM_CHANCE_DEFAULT;     /* RAMInitRandomChance */
+        }
         return resources_register_int(resources_int);
     }
     return 0;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gp...@us...> - 2024-04-14 16:29:47
      
     | 
| Revision: 45116
          http://sourceforge.net/p/vice-emu/code/45116
Author:   gpz
Date:     2024-04-14 16:29:46 +0000 (Sun, 14 Apr 2024)
Log Message:
-----------
simple test for vic20 ram init pattern
Modified Paths:
--------------
    testprogs/VIC20/raminitpattern/readme.txt
Added Paths:
-----------
    testprogs/VIC20/raminitpattern/Makefile
    testprogs/VIC20/raminitpattern/ae.crt
    testprogs/VIC20/raminitpattern/cart.asm
    testprogs/VIC20/raminitpattern/jellymonsters.crt
Property Changed:
----------------
    testprogs/VIC20/raminitpattern/
Index: testprogs/VIC20/raminitpattern
===================================================================
--- testprogs/VIC20/raminitpattern	2024-04-14 16:14:43 UTC (rev 45115)
+++ testprogs/VIC20/raminitpattern	2024-04-14 16:29:46 UTC (rev 45116)
Property changes on: testprogs/VIC20/raminitpattern
___________________________________________________________________
Added: svn:ignore
## -0,0 +1 ##
+cart.bin
Added: testprogs/VIC20/raminitpattern/Makefile
===================================================================
--- testprogs/VIC20/raminitpattern/Makefile	                        (rev 0)
+++ testprogs/VIC20/raminitpattern/Makefile	2024-04-14 16:29:46 UTC (rev 45116)
@@ -0,0 +1,13 @@
+
+all: ae.crt jellymonsters.crt
+
+ae.crt: cart.asm
+	acme -DTEST=0 -DEXPANDED=0 -f plain -o cart.bin cart.asm
+	cartconv -p -t vic20 -l 0xa000 -i cart.bin -o ae.crt
+jellymonsters.crt: cart.asm
+	acme -DTEST=1 -DEXPANDED=0 -f plain -o cart.bin cart.asm
+	cartconv -p -t vic20 -l 0xa000 -i cart.bin -o jellymonsters.crt
+clean:
+	$(RM) *.prg
+	$(RM) *.bin
+	$(RM) *.crt
Added: testprogs/VIC20/raminitpattern/ae.crt
===================================================================
(Binary files differ)
Index: testprogs/VIC20/raminitpattern/ae.crt
===================================================================
--- testprogs/VIC20/raminitpattern/ae.crt	2024-04-14 16:14:43 UTC (rev 45115)
+++ testprogs/VIC20/raminitpattern/ae.crt	2024-04-14 16:29:46 UTC (rev 45116)
Property changes on: testprogs/VIC20/raminitpattern/ae.crt
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: testprogs/VIC20/raminitpattern/cart.asm
===================================================================
--- testprogs/VIC20/raminitpattern/cart.asm	                        (rev 0)
+++ testprogs/VIC20/raminitpattern/cart.asm	2024-04-14 16:29:46 UTC (rev 45116)
@@ -0,0 +1,111 @@
+
+SCREENCOLOR = $900f
+DEBUGREG = $910f        ; http://sleepingelephant.com/ipw-web/bulletin/bb/viewtopic.php?f=2&t=7763&p=84058#p84058
+
+; by default, VIC20 tests should run on +8K expanded VIC20
+!if EXPANDED = 1 {
+SCREENRAM = $1000
+COLORRAM = $9400
+} else {
+SCREENRAM = $1e00
+COLORRAM = $9600
+}
+
+            * = $a000
+
+            !word start
+            !word start
+            !byte $41, $30, $c3, $c2, $cd
+
+start:
+; usually we want to SEI and set background to black at start
+            sei
+            ldx #$ff
+            txs
+            cld
+
+            ; first do the actual test
+            ldx #0 ; fail
+            !if TEST=0 {
+            lda $288
+            cmp #$ff
+            bne fail
+            }
+            !if TEST=1 {
+            lda $1046
+            cmp #$ff
+            bne fail
+            }
+            ldx #1 ; pass
+fail:
+            txa
+            pha
+
+            JSR $FD8D ; initialise and test RAM
+            JSR $FD52 ; restore default I/O vectors
+            JSR $FDF9 ; initialize I/O registers
+            JSR $E518 ; initialise hardware
+
+            lda #$08
+            sta SCREENCOLOR
+; when a test starts, the screen- and color memory should be initialized
+            ldx #0
+lp1:
+            lda #$00
+            sta COLORRAM,x
+            sta COLORRAM+$0100,x
+            lda #$20
+            sta SCREENRAM,x
+            sta SCREENRAM+$0100,x
+            inx
+            bne lp1
+; preferably show the name of the test on screen
+            ldx #21
+lp2:
+            lda testname,x
+            sta SCREENRAM+(22*22),x
+            dex
+            bpl lp2
+; when a test has finished, it should set the border color to red or green
+; depending on failure/success
+            ldx #$02|$10  ; red
+            pla
+            cmp #0 ; fail
+            beq fail1
+            ldx #$05|$10  ; green
+fail1:
+            stx SCREENCOLOR
+
+; before exiting, wait for at least one frame so the screenshot will actually
+; show the last frame containing the result
+            ldx #2
+--
+-           lda $9004
+            beq -
+-           lda $9004
+            bne -
+            dex
+            bne --
+
+; additionally when a test is done, write the result code to the debug register
+; (0 for success, $ff for failure). this part has no effect on real hw or when
+; the debug register is not available
+            lda SCREENCOLOR
+            and #$0f
+
+            ldx #$ff    ; failure
+            cmp #5      ; green
+            bne fail2
+            ldx #0      ; success
+fail2:
+            stx DEBUGREG
+
+            jmp *
+
+testname:
+            !if TEST=0 {
+            !scr "ae                    "
+            }
+            !if TEST=1 {
+            !scr "jelly monsters        "
+            }
Added: testprogs/VIC20/raminitpattern/jellymonsters.crt
===================================================================
(Binary files differ)
Index: testprogs/VIC20/raminitpattern/jellymonsters.crt
===================================================================
--- testprogs/VIC20/raminitpattern/jellymonsters.crt	2024-04-14 16:14:43 UTC (rev 45115)
+++ testprogs/VIC20/raminitpattern/jellymonsters.crt	2024-04-14 16:29:46 UTC (rev 45116)
Property changes on: testprogs/VIC20/raminitpattern/jellymonsters.crt
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: testprogs/VIC20/raminitpattern/readme.txt
===================================================================
--- testprogs/VIC20/raminitpattern/readme.txt	2024-04-14 16:14:43 UTC (rev 45115)
+++ testprogs/VIC20/raminitpattern/readme.txt	2024-04-14 16:29:46 UTC (rev 45116)
@@ -136,6 +136,7 @@
 .C:bffa  8D 46 10    STA $1046
 .C:bffd  4C 1F A0    JMP $A01F
 
+---
 
 AE. The problem surfaces in a shifted display, see 
 https://www.lemon64.com/forum/viewtopic.php?t=73903
@@ -143,3 +144,19 @@
 uses non initialized $0288, writing $ff to it before starting the cart makes it
 work right.
 
+---
+
+also see https://www.lemon64.com/forum/viewtopic.php?p=1017591#p1017591
+
+
+other suspects:
+
+Titan               - crashes when you shoot blue ship, and bonus appears. (this
+                      may NOT be related to RAM init)
+Close Encounters    - unable to start (press 1) [could be ram init, $288=$ff]
+Frogman             - unable to start (press 9, 1, fire) [could be ram init, $288=$ff]
+Meteor Run          (seems to work?, no apparent ram init problem)
+Draw Poker          - unable to start (press F1) [could be ram init, $288=$ff]
+Money Wars          - unable to start (press F1) [could be ram init]
+Sargon II Chess     - crashes at random (could be something else)
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gp...@us...> - 2024-04-14 16:14:46
      
     | 
| Revision: 45115
          http://sourceforge.net/p/vice-emu/code/45115
Author:   gpz
Date:     2024-04-14 16:14:43 +0000 (Sun, 14 Apr 2024)
Log Message:
-----------
add/fix cartridge selftests for xcbm2 and xcbm5x0
Modified Paths:
--------------
    testprogs/testbench/cbm510-testlist.in
    testprogs/testbench/cbm610-testlist.in
    testprogs/testbench/kernal64cbm2-testlist.txt
    testprogs/testbench/selftest/Makefile
    testprogs/testbench/selftest/cbm510.asm
    testprogs/testbench/selftest/cbm610-fail.prg
    testprogs/testbench/selftest/cbm610-pass.d82
    testprogs/testbench/selftest/cbm610-pass.prg
    testprogs/testbench/selftest/cbm610.asm
    testprogs/testbench/xcbm2-hooks.sh
    testprogs/testbench/xcbm2-testlist.txt
    testprogs/testbench/xcbm5x0-hooks.sh
    testprogs/testbench/xcbm5x0-testlist.txt
Added Paths:
-----------
    testprogs/testbench/selftest/cbm510-fail.crt
    testprogs/testbench/selftest/cbm510-pass.crt
    testprogs/testbench/selftest/cbm610-fail.crt
    testprogs/testbench/selftest/cbm610-pass.crt
    testprogs/testbench/selftest/references/cbm510-fail.crt.png
    testprogs/testbench/selftest/references/cbm510-fail.prg.png
    testprogs/testbench/selftest/references/cbm510-pass.crt.png
    testprogs/testbench/selftest/references/cbm510-pass.prg.png
    testprogs/testbench/selftest/references/cbm610-fail.crt.png
    testprogs/testbench/selftest/references/cbm610-fail.prg.png
    testprogs/testbench/selftest/references/cbm610-pass.crt.png
    testprogs/testbench/selftest/references/cbm610-pass.prg.png
Property Changed:
----------------
    testprogs/testbench/selftest/
Modified: testprogs/testbench/cbm510-testlist.in
===================================================================
--- testprogs/testbench/cbm510-testlist.in	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/cbm510-testlist.in	2024-04-14 16:14:43 UTC (rev 45115)
@@ -6,6 +6,12 @@
 ################################################################################
 ./selftest/,cbm510-pass.prg,exitcode,100000000
 ./selftest/,cbm510-fail.prg,exitcode,100000000,expect:error
+./selftest/,cbm510-pass.prg,screenshot,100000000
+./selftest/,cbm510-fail.prg,screenshot,100000000,expect:error
+./selftest/,,exitcode,100000000,mountcrt:cbm510-pass.crt
+./selftest/,,exitcode,100000000,mountcrt:cbm510-fail.crt,expect:error
+./selftest/,,screenshot,100000000,mountcrt:cbm510-pass.crt
+./selftest/,,screenshot,100000000,mountcrt:cbm510-fail.crt,expect:error
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/cbm610-testlist.in
===================================================================
--- testprogs/testbench/cbm610-testlist.in	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/cbm610-testlist.in	2024-04-14 16:14:43 UTC (rev 45115)
@@ -6,6 +6,12 @@
 ################################################################################
 ./selftest/,cbm610-pass.prg,exitcode,100000000
 ./selftest/,cbm610-fail.prg,exitcode,100000000,expect:error
+./selftest/,cbm610-pass.prg,screenshot,100000000
+./selftest/,cbm610-fail.prg,screenshot,100000000,expect:error
+./selftest/,,exitcode,100000000,mountcrt:cbm610-pass.crt
+./selftest/,,exitcode,100000000,mountcrt:cbm610-fail.crt,expect:error
+./selftest/,,screenshot,100000000,mountcrt:cbm610-pass.crt
+./selftest/,,screenshot,100000000,mountcrt:cbm610-fail.crt,expect:error
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/kernal64cbm2-testlist.txt
===================================================================
--- testprogs/testbench/kernal64cbm2-testlist.txt	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/kernal64cbm2-testlist.txt	2024-04-14 16:14:43 UTC (rev 45115)
@@ -7,6 +7,12 @@
 ################################################################################
 ./selftest/,cbm610-pass.prg,exitcode,100000000
 ./selftest/,cbm610-fail.prg,exitcode,100000000,expect:error
+./selftest/,cbm610-pass.prg,screenshot,100000000
+./selftest/,cbm610-fail.prg,screenshot,100000000,expect:error
+./selftest/,,exitcode,100000000,mountcrt:cbm610-pass.crt
+./selftest/,,exitcode,100000000,mountcrt:cbm610-fail.crt,expect:error
+./selftest/,,screenshot,100000000,mountcrt:cbm610-pass.crt
+./selftest/,,screenshot,100000000,mountcrt:cbm610-fail.crt,expect:error
 ################################################################################
 # general
 ################################################################################
Index: testprogs/testbench/selftest
===================================================================
--- testprogs/testbench/selftest	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest	2024-04-14 16:14:43 UTC (rev 45115)
Property changes on: testprogs/testbench/selftest
___________________________________________________________________
Modified: svn:ignore
## -1 +1,13 ##
 .testbench
+c128-fail.bin
+c128-pass.bin
+cbm510-fail.bin
+cbm510-pass.bin
+cbm610-fail.bin
+cbm610-pass.bin
+plus4-fail.bin
+plus4-pass.bin
+scpu-fail.bin
+scpu-pass.bin
+vic20-fail.bin
+vic20-pass.bin
Modified: testprogs/testbench/selftest/Makefile
===================================================================
--- testprogs/testbench/selftest/Makefile	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest/Makefile	2024-04-14 16:14:43 UTC (rev 45115)
@@ -19,8 +19,10 @@
 	pet-pass.prg pet-fail.prg \
 	pet-pass.d82 \
 	cbm610-pass.prg cbm610-fail.prg \
+	cbm610-pass.crt cbm610-fail.crt \
 	cbm610-pass.d82 \
 	cbm510-pass.prg cbm510-fail.prg \
+	cbm510-pass.crt cbm510-fail.crt \
 	cbm510-pass.d82 \
 	vsid-pass.prg vsid-fail.prg
 
@@ -73,6 +75,7 @@
 dtv-pass.d64: dtv-pass.prg
 	c1541 -format "dtv pass,00" d64 dtv-pass.d64 \
 		-write dtv-pass.prg "dtv-pass"
+# NOTE: dtv has no cartridges
 
 vic20-pass.prg: vic20.asm
 	acme -DEXPANDED=1 -DCART=0 -DFAIL=0 -f cbm -o vic20-pass.prg vic20.asm
@@ -109,27 +112,41 @@
 pet-pass.d82: pet-pass.prg
 	c1541 -format "pet pass,00" d82 pet-pass.d82 \
 		-write pet-pass.prg "pet-pass"
+# NOTE: pet has no cartridges
 
 vsid-pass.prg: vsid.asm
 	acme -DFAIL=0 -f plain -o vsid-pass.sid vsid.asm
 vsid-fail.prg: vsid.asm
 	acme -DFAIL=1 -f plain -o vsid-fail.sid vsid.asm
+# NOTE: vsid has no cartridges
 
 cbm610-pass.prg: cbm610.asm
-	acme -DFAIL=0 -f cbm -o cbm610-pass.prg cbm610.asm
+	acme -DCART=0 -DFAIL=0 -f cbm -o cbm610-pass.prg cbm610.asm
 cbm610-fail.prg: cbm610.asm
-	acme -DFAIL=1 -f cbm -o cbm610-fail.prg cbm610.asm
+	acme -DCART=0 -DFAIL=1 -f cbm -o cbm610-fail.prg cbm610.asm
 cbm610-pass.d82: cbm610-pass.prg
 	c1541 -format "cbm610 pass,00" d82 cbm610-pass.d82 \
 		-write cbm610-pass.prg "cbm610-pass"
+cbm610-pass.crt: cbm610.asm
+	acme -DCART=1 -DFAIL=0 -f plain -o cbm610-pass.bin cbm610.asm
+	cartconv -p -t cbm2 -l 0x2000 -i cbm610-pass.bin -o cbm610-pass.crt
+cbm610-fail.crt: cbm610.asm
+	acme -DCART=1 -DFAIL=1 -f plain -o cbm610-fail.bin cbm610.asm
+	cartconv -p -t cbm2 -l 0x2000 -i cbm610-fail.bin -o cbm610-fail.crt
 
 cbm510-pass.prg: cbm510.asm
-	acme -DFAIL=0 -f cbm -o cbm510-pass.prg cbm510.asm
+	acme -DCART=0 -DFAIL=0 -f cbm -o cbm510-pass.prg cbm510.asm
 cbm510-fail.prg: cbm510.asm
-	acme -DFAIL=1 -f cbm -o cbm510-fail.prg cbm510.asm
+	acme -DCART=0 -DFAIL=1 -f cbm -o cbm510-fail.prg cbm510.asm
 cbm510-pass.d82: cbm510-pass.prg
 	c1541 -format "cbm510 pass,00" d82 cbm510-pass.d82 \
 		-write cbm510-pass.prg "cbm510-pass"
+cbm510-pass.crt: cbm510.asm
+	acme -DCART=1 -DFAIL=0 -f plain -o cbm510-pass.bin cbm510.asm
+	cartconv -p -t cbm2 -l 0x2000 -i cbm510-pass.bin -o cbm510-pass.crt
+cbm510-fail.crt: cbm510.asm
+	acme -DCART=1 -DFAIL=1 -f plain -o cbm510-fail.bin cbm510.asm
+	cartconv -p -t cbm2 -l 0x2000 -i cbm510-fail.bin -o cbm510-fail.crt
 
 clean:
 	$(RM) *.prg
Added: testprogs/testbench/selftest/cbm510-fail.crt
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/cbm510-fail.crt
===================================================================
--- testprogs/testbench/selftest/cbm510-fail.crt	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest/cbm510-fail.crt	2024-04-14 16:14:43 UTC (rev 45115)
Property changes on: testprogs/testbench/selftest/cbm510-fail.crt
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: testprogs/testbench/selftest/cbm510-pass.crt
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/cbm510-pass.crt
===================================================================
--- testprogs/testbench/selftest/cbm510-pass.crt	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest/cbm510-pass.crt	2024-04-14 16:14:43 UTC (rev 45115)
Property changes on: testprogs/testbench/selftest/cbm510-pass.crt
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: testprogs/testbench/selftest/cbm510.asm
===================================================================
--- testprogs/testbench/selftest/cbm510.asm	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest/cbm510.asm	2024-04-14 16:14:43 UTC (rev 45115)
@@ -3,6 +3,7 @@
 SCREENCOLOR = $d821
 DEBUGREG = $daff
 
+!if CART = 0 {
             ; the BASIC program is loaded to bank 0
 
             * = $0003
@@ -16,7 +17,16 @@
             !byte $82, $3a                                                        ; NEXT
             !byte $9e, $31, $30, $32, $34, 0                                      ; SYS 1024
 eol:        !word 0
+} else {
+            * = $2000
 
+            jmp start
+            jmp start
+            !byte $43, $c2, $cd, $32, $02
+}
+
+start:
+!if CART = 0 {
             ; SYS always executes code in bank 15
 
             * = $400
@@ -27,8 +37,41 @@
 
             ;lda #0     ; switch to bank 0
             ;sta 0
+} else {
+            ; FIXME: the cartridge startup code really should be revised and
+            ;        cleaned up by somehow who knows what he is doing. The
+            ;        following was blindly copied from the only existing autostart
+            ;        cartridge i found, and may only work by chance.
+            sei
+;            jsr $f9fb   ; io init
 
-start:
+            LDA #$00
+            LDY #$08
+            STA $0700
+            STY $0701
+            JSR $FF7B
+
+            LDA #$F0
+            STA $C1
+            JSR $FF7E
+
+            LDA #$00
+            TAX
+-
+            STA $0002,X
+            STA $0200,X
+            STA $02F8,X
+            INX
+            BNE -
+
+            LDX #$04
+            JSR $FADA
+            JSR $FF7E
+
+            lda #$1b
+            sta $d81b
+}
+
 ; usually we want to SEI and set background to black at start
             sei
             lda #0
@@ -104,3 +147,7 @@
             lda $d811
             bmi *-3
             rts
+
+!if CART=1 {
+    !align $1fff,0
+}
Added: testprogs/testbench/selftest/cbm610-fail.crt
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/cbm610-fail.crt
===================================================================
--- testprogs/testbench/selftest/cbm610-fail.crt	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest/cbm610-fail.crt	2024-04-14 16:14:43 UTC (rev 45115)
Property changes on: testprogs/testbench/selftest/cbm610-fail.crt
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: testprogs/testbench/selftest/cbm610-fail.prg
===================================================================
(Binary files differ)
Added: testprogs/testbench/selftest/cbm610-pass.crt
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/cbm610-pass.crt
===================================================================
--- testprogs/testbench/selftest/cbm610-pass.crt	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest/cbm610-pass.crt	2024-04-14 16:14:43 UTC (rev 45115)
Property changes on: testprogs/testbench/selftest/cbm610-pass.crt
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: testprogs/testbench/selftest/cbm610-pass.d82
===================================================================
(Binary files differ)
Modified: testprogs/testbench/selftest/cbm610-pass.prg
===================================================================
(Binary files differ)
Modified: testprogs/testbench/selftest/cbm610.asm
===================================================================
--- testprogs/testbench/selftest/cbm610.asm	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest/cbm610.asm	2024-04-14 16:14:43 UTC (rev 45115)
@@ -1,6 +1,7 @@
 
 DEBUGREG = $daff
 
+!if CART = 0 {
             ; the BASIC program is loaded to bank 1
 
             * = $0003
@@ -14,7 +15,16 @@
             !byte $82, $3a                                                        ; NEXT
             !byte $9e, $31, $30, $32, $34, 0                                      ; SYS 1024
 eol:        !word 0
+} else {
+            * = $2000
 
+            jmp start
+            jmp start
+            !byte $43, $c2, $cd, $32, $00
+}
+
+start:
+!if CART = 0 {
             ; SYS always executes code in bank 15
 
             * = $400
@@ -22,8 +32,41 @@
 
             ;lda #1     ; switch to bank 1
             ;sta 0
+} else {
+            ; FIXME: the cartridge startup code really should be revised and
+            ;        cleaned up by somehow who knows what he is doing. The
+            ;        following was blindly copied from the only existing autostart
+            ;        cartridge i found, and may only work by chance.
+            ; TODO: disable the cursor
+            sei
+            jsr $f9fb   ; io init
 
-start:
+            LDA #$00
+            LDY #$08
+            STA $0700
+            STY $0701
+            JSR $FF7B
+
+            LDA #$F0
+            STA $C1
+            JSR $FF7E
+
+            LDA #$00
+            TAX
+-
+            ;STA $0002,X
+            !byte   $9D,$02,$00     ; STA $0002,X - no zeropage mode to avoid rewriting $00/$01
+            STA $0200,X
+            STA $02F8,X
+            INX
+            BNE -
+
+            LDX #$04
+            JSR $FADA
+            JSR $FBA2
+            JSR $FF7E
+}
+
 ; usually we want to SEI and set background to black at start
             sei
 
@@ -73,10 +116,37 @@
             bne fail2
             ldx #0      ; success
 fail2:
+
+            jsr wait
+
             stx DEBUGREG
 
             jmp *
 
+wait:
+            pha
+            txa
+            pha
+            tya
+            pha
+
+            ldy #0
+--          ldx #0
+-           bit $eaea
+            bit $eaea
+            bit $eaea
+            inx
+            bne -
+            iny
+            bne --
+
+            pla
+            tay
+            pla
+            tax
+            pla
+            rts
+
 testname:
             !if FAIL=1 {
                  ;1234567890123456789012345678901234567890
@@ -85,4 +155,13 @@
             !scr "cbm610-pass                             "
             }
 
-BORDERCOLOR: !byte 0
\ No newline at end of file
+
+!if CART = 0 {
+BORDERCOLOR: !byte 0
+} else {
+BORDERCOLOR = $02   ; must be in RAM
+}
+
+!if CART=1 {
+    !align $1fff,0
+}
Added: testprogs/testbench/selftest/references/cbm510-fail.crt.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/cbm510-fail.crt.png
===================================================================
--- testprogs/testbench/selftest/references/cbm510-fail.crt.png	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest/references/cbm510-fail.crt.png	2024-04-14 16:14:43 UTC (rev 45115)
Property changes on: testprogs/testbench/selftest/references/cbm510-fail.crt.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/cbm510-fail.prg.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/cbm510-fail.prg.png
===================================================================
--- testprogs/testbench/selftest/references/cbm510-fail.prg.png	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest/references/cbm510-fail.prg.png	2024-04-14 16:14:43 UTC (rev 45115)
Property changes on: testprogs/testbench/selftest/references/cbm510-fail.prg.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/cbm510-pass.crt.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/cbm510-pass.crt.png
===================================================================
--- testprogs/testbench/selftest/references/cbm510-pass.crt.png	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest/references/cbm510-pass.crt.png	2024-04-14 16:14:43 UTC (rev 45115)
Property changes on: testprogs/testbench/selftest/references/cbm510-pass.crt.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/cbm510-pass.prg.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/cbm510-pass.prg.png
===================================================================
--- testprogs/testbench/selftest/references/cbm510-pass.prg.png	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest/references/cbm510-pass.prg.png	2024-04-14 16:14:43 UTC (rev 45115)
Property changes on: testprogs/testbench/selftest/references/cbm510-pass.prg.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/cbm610-fail.crt.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/cbm610-fail.crt.png
===================================================================
--- testprogs/testbench/selftest/references/cbm610-fail.crt.png	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest/references/cbm610-fail.crt.png	2024-04-14 16:14:43 UTC (rev 45115)
Property changes on: testprogs/testbench/selftest/references/cbm610-fail.crt.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/cbm610-fail.prg.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/cbm610-fail.prg.png
===================================================================
--- testprogs/testbench/selftest/references/cbm610-fail.prg.png	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest/references/cbm610-fail.prg.png	2024-04-14 16:14:43 UTC (rev 45115)
Property changes on: testprogs/testbench/selftest/references/cbm610-fail.prg.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/cbm610-pass.crt.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/cbm610-pass.crt.png
===================================================================
--- testprogs/testbench/selftest/references/cbm610-pass.crt.png	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest/references/cbm610-pass.crt.png	2024-04-14 16:14:43 UTC (rev 45115)
Property changes on: testprogs/testbench/selftest/references/cbm610-pass.crt.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/cbm610-pass.prg.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/cbm610-pass.prg.png
===================================================================
--- testprogs/testbench/selftest/references/cbm610-pass.prg.png	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/selftest/references/cbm610-pass.prg.png	2024-04-14 16:14:43 UTC (rev 45115)
Property changes on: testprogs/testbench/selftest/references/cbm610-pass.prg.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Modified: testprogs/testbench/xcbm2-hooks.sh
===================================================================
--- testprogs/testbench/xcbm2-hooks.sh	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/xcbm2-hooks.sh	2024-04-14 16:14:43 UTC (rev 45115)
@@ -3,14 +3,14 @@
 XCBM2OPTS+=" -model 610"
 XCBM2OPTS+=" -virtualdev8"
 XCBM2OPTS+=" +drive8truedrive"
-#XCBM2OPTS+=" -VICIIfilter 0"
-#XCBM2OPTS+=" -VICIIextpal"
-#XCBM2OPTS+=" -VICIIpalette pepto-pal.vpl"
-#XCBM2OPTS+=" -VICIIsaturation 1000"
-#XCBM2OPTS+=" -VICIIbrightness 1000"
-#XCBM2OPTS+=" -VICIIcontrast 1000"
-#XCBM2OPTS+=" -VICIIgamma 1000"
-#XCBM2OPTS+=" -VICIItint 1000"
+XCBM2OPTS+=" -CRTCfilter 0"
+XCBM2OPTS+=" -CRTCextpal"
+XCBM2OPTS+=" -CRTCpalette green.vpl"
+XCBM2OPTS+=" -CRTCsaturation 1000"
+XCBM2OPTS+=" -CRTCbrightness 1000"
+XCBM2OPTS+=" -CRTCcontrast 1000"
+XCBM2OPTS+=" -CRTCgamma 1000"
+XCBM2OPTS+=" -CRTCtint 1000"
 XCBM2OPTS+=" -warp"
 XCBM2OPTS+=" -debugcart"
 XCBM2OPTS+=" -jamaction 1"
@@ -102,6 +102,31 @@
             ;;
         *)
                 exitoptions=""
+                if [ "${1:0:9}" == "mountd64:" ]; then
+                    exitoptions="-8 $2/${1:9}"
+                    mounted_d64="${1:9}"
+                    echo -ne "(disk:${1:9}) "
+                fi
+                if [ "${1:0:9}" == "mountd71:" ]; then
+                    exitoptions="-drive8type 1571 -8 $2/${1:9}"
+                    mounted_d64="${1:9}"
+                    echo -ne "(disk:${1:9}) "
+                fi
+                if [ "${1:0:9}" == "mountg64:" ]; then
+                    exitoptions="-8 $2/${1:9}"
+                    mounted_g64="${1:9}"
+                    echo -ne "(disk:${1:9}) "
+                fi
+                if [ "${1:0:9}" == "mountp64:" ]; then
+                    exitoptions="-8 $2/${1:9}"
+                    mounted_p64="${1:9}"
+                    echo -ne "(disk:${1:9}) "
+                fi
+                if [ "${1:0:9}" == "mountcrt:" ]; then
+                    exitoptions="-cartcrt $2/${1:9}"
+                    mounted_crt="${1:9}"
+                    echo -ne "(cartridge:${1:9}) "
+                fi
             ;;
     esac
 }
Modified: testprogs/testbench/xcbm2-testlist.txt
===================================================================
--- testprogs/testbench/xcbm2-testlist.txt	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/xcbm2-testlist.txt	2024-04-14 16:14:43 UTC (rev 45115)
@@ -7,6 +7,12 @@
 ################################################################################
 ./selftest/,cbm610-pass.prg,exitcode,100000000
 ./selftest/,cbm610-fail.prg,exitcode,100000000,expect:error
+./selftest/,cbm610-pass.prg,screenshot,100000000
+./selftest/,cbm610-fail.prg,screenshot,100000000,expect:error
+./selftest/,,exitcode,100000000,mountcrt:cbm610-pass.crt
+./selftest/,,exitcode,100000000,mountcrt:cbm610-fail.crt,expect:error
+./selftest/,,screenshot,100000000,mountcrt:cbm610-pass.crt
+./selftest/,,screenshot,100000000,mountcrt:cbm610-fail.crt,expect:error
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/xcbm5x0-hooks.sh
===================================================================
--- testprogs/testbench/xcbm5x0-hooks.sh	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/xcbm5x0-hooks.sh	2024-04-14 16:14:43 UTC (rev 45115)
@@ -3,14 +3,14 @@
 XCBM5X0OPTS+=" -model 510"
 XCBM5X0OPTS+=" -virtualdev8"
 XCBM5X0OPTS+=" +drive8truedrive"
-#XCBM5X0OPTS+=" -VICIIfilter 0"
-#XCBM5X0OPTS+=" -VICIIextpal"
-#XCBM5X0OPTS+=" -VICIIpalette pepto-pal.vpl"
-#XCBM5X0OPTS+=" -VICIIsaturation 1000"
-#XCBM5X0OPTS+=" -VICIIbrightness 1000"
-#XCBM5X0OPTS+=" -VICIIcontrast 1000"
-#XCBM5X0OPTS+=" -VICIIgamma 1000"
-#XCBM5X0OPTS+=" -VICIItint 1000"
+XCBM5X0OPTS+=" -VICIIfilter 0"
+XCBM5X0OPTS+=" -VICIIextpal"
+XCBM5X0OPTS+=" -VICIIpalette pepto-pal.vpl"
+XCBM5X0OPTS+=" -VICIIsaturation 1000"
+XCBM5X0OPTS+=" -VICIIbrightness 1000"
+XCBM5X0OPTS+=" -VICIIcontrast 1000"
+XCBM5X0OPTS+=" -VICIIgamma 1000"
+XCBM5X0OPTS+=" -VICIItint 1000"
 XCBM5X0OPTS+=" -warp"
 XCBM5X0OPTS+=" -debugcart"
 XCBM5X0OPTS+=" -jamaction 1"
@@ -78,8 +78,33 @@
             ;;
         *)
                 exitoptions=""
+                if [ "${1:0:9}" == "mountd64:" ]; then
+                    exitoptions="-8 $2/${1:9}"
+                    mounted_d64="${1:9}"
+                    echo -ne "(disk:${1:9}) "
+                fi
+                if [ "${1:0:9}" == "mountd71:" ]; then
+                    exitoptions="-drive8type 1571 -8 $2/${1:9}"
+                    mounted_d64="${1:9}"
+                    echo -ne "(disk:${1:9}) "
+                fi
+                if [ "${1:0:9}" == "mountg64:" ]; then
+                    exitoptions="-8 $2/${1:9}"
+                    mounted_g64="${1:9}"
+                    echo -ne "(disk:${1:9}) "
+                fi
+                if [ "${1:0:9}" == "mountp64:" ]; then
+                    exitoptions="-8 $2/${1:9}"
+                    mounted_p64="${1:9}"
+                    echo -ne "(disk:${1:9}) "
+                fi
+                if [ "${1:0:9}" == "mountcrt:" ]; then
+                    exitoptions="-cartcrt $2/${1:9}"
+                    mounted_crt="${1:9}"
+                    echo -ne "(cartridge:${1:9}) "
+                fi
             ;;
-    esac
+        esac
 }
 
 # $1  option
Modified: testprogs/testbench/xcbm5x0-testlist.txt
===================================================================
--- testprogs/testbench/xcbm5x0-testlist.txt	2024-04-14 15:54:05 UTC (rev 45114)
+++ testprogs/testbench/xcbm5x0-testlist.txt	2024-04-14 16:14:43 UTC (rev 45115)
@@ -7,6 +7,12 @@
 ################################################################################
 ./selftest/,cbm510-pass.prg,exitcode,100000000
 ./selftest/,cbm510-fail.prg,exitcode,100000000,expect:error
+./selftest/,cbm510-pass.prg,screenshot,100000000
+./selftest/,cbm510-fail.prg,screenshot,100000000,expect:error
+./selftest/,,exitcode,100000000,mountcrt:cbm510-pass.crt
+./selftest/,,exitcode,100000000,mountcrt:cbm510-fail.crt,expect:error
+./selftest/,,screenshot,100000000,mountcrt:cbm510-pass.crt
+./selftest/,,screenshot,100000000,mountcrt:cbm510-fail.crt,expect:error
 ################################################################################
 # general
 ################################################################################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gp...@us...> - 2024-04-14 15:54:07
      
     | 
| Revision: 45114
          http://sourceforge.net/p/vice-emu/code/45114
Author:   gpz
Date:     2024-04-14 15:54:05 +0000 (Sun, 14 Apr 2024)
Log Message:
-----------
use the right window to check the canvas, probably a leftover from when xbm2 and xcbm5x0 were the same thing
Modified Paths:
--------------
    trunk/vice/src/cbm2/cbm5x0video.c
Modified: trunk/vice/src/cbm2/cbm5x0video.c
===================================================================
--- trunk/vice/src/cbm2/cbm5x0video.c	2024-04-13 17:14:18 UTC (rev 45113)
+++ trunk/vice/src/cbm2/cbm5x0video.c	2024-04-14 15:54:05 UTC (rev 45114)
@@ -43,7 +43,7 @@
 
 struct video_canvas_s *machine_video_canvas_get(unsigned int window)
 {
-    if (window == 1) {
+    if (window == 0) {
         return vicii_get_canvas();
     }
     return NULL;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gp...@us...> - 2024-04-13 17:14:19
      
     | 
| Revision: 45113
          http://sourceforge.net/p/vice-emu/code/45113
Author:   gpz
Date:     2024-04-13 17:14:18 +0000 (Sat, 13 Apr 2024)
Log Message:
-----------
implement 'warp on'/'warp off' as advertised. fixes #2016
Modified Paths:
--------------
    trunk/vice/src/monitor/mon_parse.y
Modified: trunk/vice/src/monitor/mon_parse.y
===================================================================
--- trunk/vice/src/monitor/mon_parse.y	2024-04-12 16:54:54 UTC (rev 45112)
+++ trunk/vice/src/monitor/mon_parse.y	2024-04-13 17:14:18 UTC (rev 45113)
@@ -292,7 +292,7 @@
                      }
                    | CMD_WARP TOGGLE end_cmd
                      {
-                        vsync_set_warp_mode(!vsync_get_warp_mode());
+                        vsync_set_warp_mode((($2 == e_TOGGLE) ? (vsync_get_warp_mode() ^ 1) : $2));
                      }
                    | register_mod
                    ;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gp...@us...> - 2024-04-12 16:54:57
      
     | 
| Revision: 45112
          http://sourceforge.net/p/vice-emu/code/45112
Author:   gpz
Date:     2024-04-12 16:54:54 +0000 (Fri, 12 Apr 2024)
Log Message:
-----------
add Plus4 cartridge self tests, add support for screenshots and crt files for xplus4 tests
Modified Paths:
--------------
    testprogs/testbench/cmpscreens.c
    testprogs/testbench/plus4-testlist.in
    testprogs/testbench/selftest/Makefile
    testprogs/testbench/selftest/plus4-fail.prg
    testprogs/testbench/selftest/plus4-pass.d64
    testprogs/testbench/selftest/plus4-pass.prg
    testprogs/testbench/selftest/plus4.asm
    testprogs/testbench/xplus4-hooks.sh
    testprogs/testbench/xplus4-testlist.txt
Added Paths:
-----------
    testprogs/testbench/selftest/plus4-fail.crt
    testprogs/testbench/selftest/plus4-pass.crt
    testprogs/testbench/selftest/references/plus4-fail.crt.png
    testprogs/testbench/selftest/references/plus4-fail.prg.png
    testprogs/testbench/selftest/references/plus4-pass.crt.png
    testprogs/testbench/selftest/references/plus4-pass.prg.png
Modified: testprogs/testbench/cmpscreens.c
===================================================================
--- testprogs/testbench/cmpscreens.c	2024-04-12 15:45:24 UTC (rev 45111)
+++ testprogs/testbench/cmpscreens.c	2024-04-12 16:54:54 UTC (rev 45112)
@@ -9,7 +9,7 @@
 #include "stb_image.h"
 
 #define MAXCOLORS 0x100
-#define MAXPALETTES 6
+#define MAXPALETTES 7
 
 #define max(x, y) (((x) > (y)) ? (x) : (y))
 #define min(x, y) (((x) < (y)) ? (x) : (y))
@@ -26,6 +26,7 @@
     16, // &cols_pet_green[0],
     16, // &cols_pet_green_old[0],
     25, // &cols_z64_pal_viciie[0],
+    128,
 };
 
 unsigned char cols_pepto_pal[3*16] = {
@@ -169,6 +170,138 @@
     215, 179, 132
 };
 
+
+unsigned char cols_colodore_ted[3*128] = {
+0x00, 0x00, 0x00,
+0x17, 0x17, 0x17,
+0x46, 0x07, 0x0a,
+0x00, 0x2a, 0x26,
+0x3e, 0x02, 0x46,
+0x00, 0x33, 0x00,
+0x0f, 0x0d, 0x70,
+0x1f, 0x21, 0x00,
+0x3e, 0x0e, 0x00,
+0x30, 0x17, 0x00,
+0x0f, 0x2b, 0x00,
+0x46, 0x03, 0x26,
+0x00, 0x31, 0x0a,
+0x03, 0x17, 0x61,
+0x1f, 0x07, 0x70,
+0x03, 0x31, 0x00,
+0x00, 0x00, 0x00,
+0x26, 0x26, 0x26,
+0x59, 0x14, 0x17,
+0x01, 0x3b, 0x37,
+0x51, 0x0c, 0x59,
+0x05, 0x45, 0x01,
+0x1e, 0x1c, 0x85,
+0x30, 0x32, 0x00,
+0x51, 0x1c, 0x01,
+0x42, 0x27, 0x00,
+0x1e, 0x3c, 0x00,
+0x59, 0x0e, 0x37,
+0x01, 0x42, 0x17,
+0x0f, 0x26, 0x75,
+0x30, 0x13, 0x85,
+0x0f, 0x43, 0x00,
+0x00, 0x00, 0x00,
+0x37, 0x37, 0x37,
+0x6d, 0x23, 0x27,
+0x0c, 0x4e, 0x49,
+0x64, 0x1b, 0x6d,
+0x12, 0x58, 0x0c,
+0x2e, 0x2c, 0x9b,
+0x41, 0x44, 0x00,
+0x64, 0x2c, 0x0c,
+0x55, 0x38, 0x00,
+0x2e, 0x4e, 0x00,
+0x6d, 0x1d, 0x49,
+0x0c, 0x55, 0x27,
+0x1d, 0x37, 0x8a,
+0x41, 0x22, 0x9b,
+0x1d, 0x56, 0x00,
+0x00, 0x00, 0x00,
+0x4a, 0x4a, 0x4a,
+0x81, 0x33, 0x38,
+0x1a, 0x61, 0x5d,
+0x79, 0x2a, 0x82,
+0x20, 0x6c, 0x1a,
+0x3f, 0x3d, 0xb1,
+0x54, 0x57, 0x00,
+0x79, 0x3d, 0x1a,
+0x68, 0x4a, 0x07,
+0x3f, 0x62, 0x00,
+0x81, 0x2d, 0x5d,
+0x1a, 0x69, 0x38,
+0x2d, 0x49, 0xa0,
+0x54, 0x33, 0xb1,
+0x2d, 0x69, 0x07,
+0x00, 0x00, 0x00,
+0x7b, 0x7b, 0x7b,
+0xb8, 0x62, 0x67,
+0x44, 0x96, 0x90,
+0xaf, 0x58, 0xb9,
+0x4c, 0xa1, 0x44,
+0x70, 0x6d, 0xeb,
+0x87, 0x8a, 0x1f,
+0xaf, 0x6e, 0x44,
+0x9d, 0x7c, 0x2b,
+0x70, 0x96, 0x1f,
+0xb8, 0x5a, 0x90,
+0x44, 0x9e, 0x67,
+0x5b, 0x7b, 0xd9,
+0x87, 0x62, 0xeb,
+0x5b, 0x9e, 0x2b,
+0x00, 0x00, 0x00,
+0x9b, 0x9b, 0x9b,
+0xdb, 0x81, 0x86,
+0x61, 0xb7, 0xb1,
+0xd1, 0x76, 0xdc,
+0x69, 0xc3, 0x60,
+0x8f, 0x8c, 0xff,
+0xa8, 0xab, 0x38,
+0xd1, 0x8d, 0x60,
+0xbf, 0x9c, 0x45,
+0x8f, 0xb7, 0x38,
+0xdb, 0x79, 0xb1,
+0x61, 0xc0, 0x86,
+0x79, 0x9b, 0xfd,
+0xa8, 0x80, 0xff,
+0x79, 0xc0, 0x45,
+0x00, 0x00, 0x00,
+0xe0, 0xe0, 0xe0,
+0xff, 0xc3, 0xc9,
+0xa0, 0xfe, 0xf8,
+0xff, 0xb7, 0xff,
+0xa9, 0xff, 0x9f,
+0xd3, 0xd0, 0xff,
+0xed, 0xf1, 0x71,
+0xff, 0xd1, 0x9f,
+0xff, 0xe0, 0x81,
+0xd3, 0xfe, 0x71,
+0xff, 0xba, 0xf8,
+0xa0, 0xff, 0xc9,
+0xbb, 0xe0, 0xff,
+0xed, 0xc3, 0xff,
+0xbb, 0xff, 0x81,
+0x00, 0x00, 0x00,
+0xff, 0xff, 0xff,
+0xff, 0xff, 0xff,
+0xfd, 0xff, 0xff,
+0xff, 0xff, 0xff,
+0xff, 0xff, 0xfd,
+0xff, 0xff, 0xff,
+0xff, 0xff, 0xc9,
+0xff, 0xff, 0xfd,
+0xff, 0xff, 0xdb,
+0xff, 0xff, 0xc9,
+0xff, 0xff, 0xff,
+0xfd, 0xff, 0xff,
+0xff, 0xff, 0xff,
+0xff, 0xff, 0xff,
+0xff, 0xff, 0xdb
+};
+
 unsigned char *colors[MAXPALETTES] = {
     &cols_pepto_pal[0],
     &cols_pepto_ntsc_sony[0],
@@ -176,6 +309,7 @@
     &cols_pet_green[0],
     &cols_pet_green_old[0],
     &cols_z64_pal_viciie[0],
+    &cols_colodore_ted[0],
 };
 
 char *palettenames[MAXPALETTES] = {
@@ -185,6 +319,7 @@
     "PET green",
     "PET green (old)",
     "Z64K (PAL VICIIe)",
+    "Colodore TED (Plus4)",
 };
 
 int findcolorinpalette(unsigned char *p, int palette)
Modified: testprogs/testbench/plus4-testlist.in
===================================================================
--- testprogs/testbench/plus4-testlist.in	2024-04-12 15:45:24 UTC (rev 45111)
+++ testprogs/testbench/plus4-testlist.in	2024-04-12 16:54:54 UTC (rev 45112)
@@ -6,6 +6,12 @@
 ################################################################################
 ./selftest/,plus4-pass.prg,exitcode,10000000
 ./selftest/,plus4-fail.prg,exitcode,10000000,expect:error
+./selftest/,plus4-pass.prg,screenshot,10000000
+./selftest/,plus4-fail.prg,screenshot,10000000,expect:error
+./selftest/,,exitcode,10000000,mountcrt:plus4-pass.crt
+./selftest/,,exitcode,10000000,mountcrt:plus4-fail.crt,expect:error
+./selftest/,,screenshot,10000000,mountcrt:plus4-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:plus4-fail.crt,expect:error
 ################################################################################
 # Joystick/Mouse
 ################################################################################
Modified: testprogs/testbench/selftest/Makefile
===================================================================
--- testprogs/testbench/selftest/Makefile	2024-04-12 15:45:24 UTC (rev 45111)
+++ testprogs/testbench/selftest/Makefile	2024-04-12 16:54:54 UTC (rev 45112)
@@ -3,6 +3,7 @@
 	c64-pass.d64 \
 	c64-pass.crt c64-fail.crt \
 	plus4-pass.prg plus4-fail.prg \
+	plus4-pass.crt plus4-fail.crt \
 	plus4-pass.d64 \
 	scpu-pass.prg scpu-fail.prg \
 	scpu-pass.crt scpu-fail.crt \
@@ -38,12 +39,18 @@
 	cartconv -p -t normal -i c64-fail.bin -o c64-fail.crt
 
 plus4-pass.prg: plus4.asm
-	acme -DFAIL=0 -f cbm -o plus4-pass.prg plus4.asm
+	acme -DCART=0 -DFAIL=0 -f cbm -o plus4-pass.prg plus4.asm
 plus4-pass.d64: plus4-pass.prg
 	c1541 -format "plus4 pass,00" d64 plus4-pass.d64 \
 		-write plus4-pass.prg "plus4-pass"
 plus4-fail.prg: plus4.asm
-	acme -DFAIL=1 -f cbm -o plus4-fail.prg plus4.asm
+	acme -DCART=0 -DFAIL=1 -f cbm -o plus4-fail.prg plus4.asm
+plus4-pass.crt: plus4.asm
+	acme -DCART=1 -DFAIL=0 -f plain -o plus4-pass.bin plus4.asm
+	cartconv -p -t c1lo -i plus4-pass.bin -o plus4-pass.crt
+plus4-fail.crt: plus4.asm
+	acme -DCART=1 -DFAIL=1 -f plain -o plus4-fail.bin plus4.asm
+	cartconv -p -t c1lo -i plus4-fail.bin -o plus4-fail.crt
 
 scpu-pass.prg: scpu.asm
 	acme -DCART=0 -DFAIL=0 -f cbm -o scpu-pass.prg scpu.asm
Added: testprogs/testbench/selftest/plus4-fail.crt
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/plus4-fail.crt
===================================================================
--- testprogs/testbench/selftest/plus4-fail.crt	2024-04-12 15:45:24 UTC (rev 45111)
+++ testprogs/testbench/selftest/plus4-fail.crt	2024-04-12 16:54:54 UTC (rev 45112)
Property changes on: testprogs/testbench/selftest/plus4-fail.crt
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: testprogs/testbench/selftest/plus4-fail.prg
===================================================================
(Binary files differ)
Added: testprogs/testbench/selftest/plus4-pass.crt
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/plus4-pass.crt
===================================================================
--- testprogs/testbench/selftest/plus4-pass.crt	2024-04-12 15:45:24 UTC (rev 45111)
+++ testprogs/testbench/selftest/plus4-pass.crt	2024-04-12 16:54:54 UTC (rev 45112)
Property changes on: testprogs/testbench/selftest/plus4-pass.crt
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: testprogs/testbench/selftest/plus4-pass.d64
===================================================================
(Binary files differ)
Modified: testprogs/testbench/selftest/plus4-pass.prg
===================================================================
(Binary files differ)
Modified: testprogs/testbench/selftest/plus4.asm
===================================================================
--- testprogs/testbench/selftest/plus4.asm	2024-04-12 15:45:24 UTC (rev 45111)
+++ testprogs/testbench/selftest/plus4.asm	2024-04-12 16:54:54 UTC (rev 45112)
@@ -3,14 +3,47 @@
 SCREENCOLOR = $ff15
 DEBUGREG = $fdcf        ; http://plus4world.powweb.com/forum.php?postid=31417#31429
 
+!if CART = 0 {
             * = $1001
             !word eol,0
             !byte $9e, $34,$31,$30,$39, 0 ; SYS 4109
 eol:        !word 0
+} else {
+            * = $8000
+            jmp start
+            jmp start
+            !byte $01, $43, $42, $4d     ; module-nr., "CBM"
+}
 
 start:
 ; usually we want to SEI and set background to black at start
             sei
+!if CART = 1 {
+            lda $fb
+            pha
+            ldx #$02       ; cartrige 1 lo, kernal
+            sta $fdd0,x
+            jsr $ff84      ; Initialize I/O devices
+            jsr $ff87      ; RAM Test
+            pla
+            sta $fb
+            jsr $ff8a      ; Restore vectors to initial values
+            jsr $ff81      ; Initialize screen editor
+            lda #<cartrige ; cartridge jump in
+            sta $02fe
+            lda #>cartrige
+            sta $02ff
+            lda #$f1       ; irq -> banking-routines
+            sta $0314
+            lda #$fc
+            sta $0315
+            cli
+            jmp *
+cartrige:
+            lda #$ff
+            sta $ff0c
+            sta $ff0d           ; hide cursor
+}
             lda #0
             sta BORDERCOLOR
             sta SCREENCOLOR
@@ -60,10 +93,26 @@
             bne fail2
             ldx #0      ; success
 fail2:
+
+            jsr waitframe
+            jsr waitframe
+            jsr waitframe
+
             stx DEBUGREG
 
             jmp *
 
+waitframe:
+            pha
+-           lda $ff1c
+            and #1
+            beq -
+-           lda $ff1c
+            and #1
+            bne -
+            pla
+            rts
+
 testname:
             !if FAIL=1 {
                  ;1234567890123456789012345678901234567890
Added: testprogs/testbench/selftest/references/plus4-fail.crt.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/plus4-fail.crt.png
===================================================================
--- testprogs/testbench/selftest/references/plus4-fail.crt.png	2024-04-12 15:45:24 UTC (rev 45111)
+++ testprogs/testbench/selftest/references/plus4-fail.crt.png	2024-04-12 16:54:54 UTC (rev 45112)
Property changes on: testprogs/testbench/selftest/references/plus4-fail.crt.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/plus4-fail.prg.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/plus4-fail.prg.png
===================================================================
--- testprogs/testbench/selftest/references/plus4-fail.prg.png	2024-04-12 15:45:24 UTC (rev 45111)
+++ testprogs/testbench/selftest/references/plus4-fail.prg.png	2024-04-12 16:54:54 UTC (rev 45112)
Property changes on: testprogs/testbench/selftest/references/plus4-fail.prg.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/plus4-pass.crt.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/plus4-pass.crt.png
===================================================================
--- testprogs/testbench/selftest/references/plus4-pass.crt.png	2024-04-12 15:45:24 UTC (rev 45111)
+++ testprogs/testbench/selftest/references/plus4-pass.crt.png	2024-04-12 16:54:54 UTC (rev 45112)
Property changes on: testprogs/testbench/selftest/references/plus4-pass.crt.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/plus4-pass.prg.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/plus4-pass.prg.png
===================================================================
--- testprogs/testbench/selftest/references/plus4-pass.prg.png	2024-04-12 15:45:24 UTC (rev 45111)
+++ testprogs/testbench/selftest/references/plus4-pass.prg.png	2024-04-12 16:54:54 UTC (rev 45112)
Property changes on: testprogs/testbench/selftest/references/plus4-pass.prg.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Modified: testprogs/testbench/xplus4-hooks.sh
===================================================================
--- testprogs/testbench/xplus4-hooks.sh	2024-04-12 15:45:24 UTC (rev 45111)
+++ testprogs/testbench/xplus4-hooks.sh	2024-04-12 16:54:54 UTC (rev 45112)
@@ -2,7 +2,7 @@
 XPLUS4OPTS+=" -default"
 XPLUS4OPTS+=" -TEDfilter 0"
 XPLUS4OPTS+=" -TEDextpal"
-XPLUS4OPTS+=" -TEDpalette pepto-pal.vpl"
+XPLUS4OPTS+=" -TEDpalette colodore_ted.vpl"
 XPLUS4OPTS+=" -TEDsaturation 1000"
 XPLUS4OPTS+=" -TEDbrightness 1000"
 XPLUS4OPTS+=" -TEDcontrast 1000"
@@ -67,7 +67,33 @@
             ;;
         *)
                 exitoptions=""
+                if [ "${1:0:9}" == "mountd64:" ]; then
+                    exitoptions="-8 $2/${1:9}"
+                    mounted_d64="${1:9}"
+                    echo -ne "(disk:${1:9}) "
+                fi
+                if [ "${1:0:9}" == "mountd71:" ]; then
+                    exitoptions="-drive8type 1571 -8 $2/${1:9}"
+                    mounted_d64="${1:9}"
+                    echo -ne "(disk:${1:9}) "
+                fi
+                if [ "${1:0:9}" == "mountg64:" ]; then
+                    exitoptions="-8 $2/${1:9}"
+                    mounted_g64="${1:9}"
+                    echo -ne "(disk:${1:9}) "
+                fi
+                if [ "${1:0:9}" == "mountp64:" ]; then
+                    exitoptions="-8 $2/${1:9}"
+                    mounted_p64="${1:9}"
+                    echo -ne "(disk:${1:9}) "
+                fi
+                if [ "${1:0:9}" == "mountcrt:" ]; then
+                    exitoptions="-cartcrt $2/${1:9}"
+                    mounted_crt="${1:9}"
+                    echo -ne "(cartridge:${1:9}) "
+                fi
             ;;
+
     esac
 }
 
Modified: testprogs/testbench/xplus4-testlist.txt
===================================================================
--- testprogs/testbench/xplus4-testlist.txt	2024-04-12 15:45:24 UTC (rev 45111)
+++ testprogs/testbench/xplus4-testlist.txt	2024-04-12 16:54:54 UTC (rev 45112)
@@ -7,6 +7,12 @@
 ################################################################################
 ./selftest/,plus4-pass.prg,exitcode,10000000
 ./selftest/,plus4-fail.prg,exitcode,10000000,expect:error
+./selftest/,plus4-pass.prg,screenshot,10000000
+./selftest/,plus4-fail.prg,screenshot,10000000,expect:error
+./selftest/,,exitcode,10000000,mountcrt:plus4-pass.crt
+./selftest/,,exitcode,10000000,mountcrt:plus4-fail.crt,expect:error
+./selftest/,,screenshot,10000000,mountcrt:plus4-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:plus4-fail.crt,expect:error
 ################################################################################
 # Joystick/Mouse
 ################################################################################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gp...@us...> - 2024-04-12 15:45:26
      
     | 
| Revision: 45111
          http://sourceforge.net/p/vice-emu/code/45111
Author:   gpz
Date:     2024-04-12 15:45:24 +0000 (Fri, 12 Apr 2024)
Log Message:
-----------
add scpu cartridge self tests
Modified Paths:
--------------
    testprogs/testbench/kernal64scpu64-testlist.txt
    testprogs/testbench/scpu-testlist.in
    testprogs/testbench/selftest/Makefile
    testprogs/testbench/selftest/scpu.asm
    testprogs/testbench/xscpu64-testlist.txt
Added Paths:
-----------
    testprogs/testbench/selftest/references/scpu-fail.crt.png
    testprogs/testbench/selftest/references/scpu-fail.prg.png
    testprogs/testbench/selftest/references/scpu-pass.crt.png
    testprogs/testbench/selftest/references/scpu-pass.prg.png
    testprogs/testbench/selftest/scpu-fail.crt
    testprogs/testbench/selftest/scpu-pass.crt
Modified: testprogs/testbench/kernal64scpu64-testlist.txt
===================================================================
--- testprogs/testbench/kernal64scpu64-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
+++ testprogs/testbench/kernal64scpu64-testlist.txt	2024-04-12 15:45:24 UTC (rev 45111)
@@ -7,6 +7,12 @@
 ################################################################################
 ./selftest/,scpu-pass.prg,exitcode,10000000
 ./selftest/,scpu-fail.prg,exitcode,10000000,expect:error
+./selftest/,scpu-pass.prg,screenshot,10000000
+./selftest/,scpu-fail.prg,screenshot,10000000,expect:error
+./selftest/,,exitcode,10000000,mountcrt:scpu-pass.crt
+./selftest/,,exitcode,10000000,mountcrt:scpu-fail.crt,expect:error
+./selftest/,,screenshot,10000000,mountcrt:scpu-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:scpu-fail.crt,expect:error
 ################################################################################
 # CPU
 ################################################################################
Modified: testprogs/testbench/scpu-testlist.in
===================================================================
--- testprogs/testbench/scpu-testlist.in	2024-04-12 15:19:21 UTC (rev 45110)
+++ testprogs/testbench/scpu-testlist.in	2024-04-12 15:45:24 UTC (rev 45111)
@@ -6,6 +6,12 @@
 ################################################################################
 ./selftest/,scpu-pass.prg,exitcode,10000000
 ./selftest/,scpu-fail.prg,exitcode,10000000,expect:error
+./selftest/,scpu-pass.prg,screenshot,10000000
+./selftest/,scpu-fail.prg,screenshot,10000000,expect:error
+./selftest/,,exitcode,10000000,mountcrt:scpu-pass.crt
+./selftest/,,exitcode,10000000,mountcrt:scpu-fail.crt,expect:error
+./selftest/,,screenshot,10000000,mountcrt:scpu-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:scpu-fail.crt,expect:error
 ################################################################################
 # CPU
 ################################################################################
Modified: testprogs/testbench/selftest/Makefile
===================================================================
--- testprogs/testbench/selftest/Makefile	2024-04-12 15:19:21 UTC (rev 45110)
+++ testprogs/testbench/selftest/Makefile	2024-04-12 15:45:24 UTC (rev 45111)
@@ -5,6 +5,7 @@
 	plus4-pass.prg plus4-fail.prg \
 	plus4-pass.d64 \
 	scpu-pass.prg scpu-fail.prg \
+	scpu-pass.crt scpu-fail.crt \
 	scpu-pass.d64 \
 	dtv-pass.prg dtv-fail.prg \
 	dtv-pass.d64 \
@@ -45,12 +46,18 @@
 	acme -DFAIL=1 -f cbm -o plus4-fail.prg plus4.asm
 
 scpu-pass.prg: scpu.asm
-	acme -DFAIL=0 -f cbm -o scpu-pass.prg scpu.asm
+	acme -DCART=0 -DFAIL=0 -f cbm -o scpu-pass.prg scpu.asm
 scpu-fail.prg: scpu.asm
-	acme -DFAIL=1 -f cbm -o scpu-fail.prg scpu.asm
+	acme -DCART=0 -DFAIL=1 -f cbm -o scpu-fail.prg scpu.asm
 scpu-pass.d64: scpu-pass.prg
 	c1541 -format "scpu pass,00" d64 scpu-pass.d64 \
 		-write scpu-pass.prg "scpu-pass"
+scpu-pass.crt: scpu.asm
+	acme -DCART=1 -DFAIL=0 -f plain -o scpu-pass.bin scpu.asm
+	cartconv -p -t normal -i scpu-pass.bin -o scpu-pass.crt
+scpu-fail.crt: scpu.asm
+	acme -DCART=1 -DFAIL=1 -f plain -o scpu-fail.bin scpu.asm
+	cartconv -p -t normal -i scpu-fail.bin -o scpu-fail.crt
 
 dtv-pass.prg: dtv.asm
 	acme -DFAIL=0 -f cbm -o dtv-pass.prg dtv.asm
Added: testprogs/testbench/selftest/references/scpu-fail.crt.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/scpu-fail.crt.png
===================================================================
--- testprogs/testbench/selftest/references/scpu-fail.crt.png	2024-04-12 15:19:21 UTC (rev 45110)
+++ testprogs/testbench/selftest/references/scpu-fail.crt.png	2024-04-12 15:45:24 UTC (rev 45111)
Property changes on: testprogs/testbench/selftest/references/scpu-fail.crt.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/scpu-fail.prg.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/scpu-fail.prg.png
===================================================================
--- testprogs/testbench/selftest/references/scpu-fail.prg.png	2024-04-12 15:19:21 UTC (rev 45110)
+++ testprogs/testbench/selftest/references/scpu-fail.prg.png	2024-04-12 15:45:24 UTC (rev 45111)
Property changes on: testprogs/testbench/selftest/references/scpu-fail.prg.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/scpu-pass.crt.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/scpu-pass.crt.png
===================================================================
--- testprogs/testbench/selftest/references/scpu-pass.crt.png	2024-04-12 15:19:21 UTC (rev 45110)
+++ testprogs/testbench/selftest/references/scpu-pass.crt.png	2024-04-12 15:45:24 UTC (rev 45111)
Property changes on: testprogs/testbench/selftest/references/scpu-pass.crt.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/scpu-pass.prg.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/scpu-pass.prg.png
===================================================================
--- testprogs/testbench/selftest/references/scpu-pass.prg.png	2024-04-12 15:19:21 UTC (rev 45110)
+++ testprogs/testbench/selftest/references/scpu-pass.prg.png	2024-04-12 15:45:24 UTC (rev 45111)
Property changes on: testprogs/testbench/selftest/references/scpu-pass.prg.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/scpu-fail.crt
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/scpu-fail.crt
===================================================================
--- testprogs/testbench/selftest/scpu-fail.crt	2024-04-12 15:19:21 UTC (rev 45110)
+++ testprogs/testbench/selftest/scpu-fail.crt	2024-04-12 15:45:24 UTC (rev 45111)
Property changes on: testprogs/testbench/selftest/scpu-fail.crt
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: testprogs/testbench/selftest/scpu-pass.crt
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/scpu-pass.crt
===================================================================
--- testprogs/testbench/selftest/scpu-pass.crt	2024-04-12 15:19:21 UTC (rev 45110)
+++ testprogs/testbench/selftest/scpu-pass.crt	2024-04-12 15:45:24 UTC (rev 45111)
Property changes on: testprogs/testbench/selftest/scpu-pass.crt
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: testprogs/testbench/selftest/scpu.asm
===================================================================
--- testprogs/testbench/selftest/scpu.asm	2024-04-12 15:19:21 UTC (rev 45110)
+++ testprogs/testbench/selftest/scpu.asm	2024-04-12 15:45:24 UTC (rev 45111)
@@ -3,14 +3,48 @@
 SCREENCOLOR = $d021
 DEBUGREG = $d7ff
 
+!if CART = 0 {
             * = $0801
             !word eol,0
             !byte $9e, $32,$30,$36,$31, 0 ; SYS 2061
 eol:        !word 0
+} else {
+            * = $8000
 
+            !word start
+            !word start
+            !byte $c3, $c2, $cd, $38, $30
+}
+
 start:
 ; usually we want to SEI and set background to black at start
             sei
+!if CART = 1 {
+            ldx #$ff
+            txs
+            cld
+
+            ; we must set data first, then update DDR
+            lda #$37
+            sta $01
+            lda #$2f
+            sta $00
+
+            ; enable VIC (e.g. RAM refresh)
+            lda #8
+            sta $d016
+
+            ; write to RAM to make sure it starts up correctly (=> RAM datasheets)
+-
+            sta $0100, x
+            dex
+            bne -
+
+            jsr $ff84   ; Initialise I/O
+            jsr $ff87   ; Initialise System Constants
+            jsr $ff8a   ; Restore Kernal Vectors
+            jsr $ff81   ; Initialize screen editor
+}
             lda #0
             sta BORDERCOLOR
             sta SCREENCOLOR
Modified: testprogs/testbench/xscpu64-testlist.txt
===================================================================
--- testprogs/testbench/xscpu64-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
+++ testprogs/testbench/xscpu64-testlist.txt	2024-04-12 15:45:24 UTC (rev 45111)
@@ -7,6 +7,12 @@
 ################################################################################
 ./selftest/,scpu-pass.prg,exitcode,10000000
 ./selftest/,scpu-fail.prg,exitcode,10000000,expect:error
+./selftest/,scpu-pass.prg,screenshot,10000000
+./selftest/,scpu-fail.prg,screenshot,10000000,expect:error
+./selftest/,,exitcode,10000000,mountcrt:scpu-pass.crt
+./selftest/,,exitcode,10000000,mountcrt:scpu-fail.crt,expect:error
+./selftest/,,screenshot,10000000,mountcrt:scpu-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:scpu-fail.crt,expect:error
 ################################################################################
 # CPU
 ################################################################################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gp...@us...> - 2024-04-12 15:19:23
      
     | 
| Revision: 45110
          http://sourceforge.net/p/vice-emu/code/45110
Author:   gpz
Date:     2024-04-12 15:19:21 +0000 (Fri, 12 Apr 2024)
Log Message:
-----------
add c128 cartridge self tests
Modified Paths:
--------------
    testprogs/testbench/c128-testlist.in
    testprogs/testbench/c64-testlist.in
    testprogs/testbench/c64rmk2-testlist.txt
    testprogs/testbench/cham20-testlist.txt
    testprogs/testbench/chameleon-testlist.txt
    testprogs/testbench/denise-testlist.txt
    testprogs/testbench/emu64-testlist.txt
    testprogs/testbench/hoxs64-testlist.txt
    testprogs/testbench/kernal64c128c128-testlist.txt
    testprogs/testbench/kernal64c128c64-testlist.txt
    testprogs/testbench/kernal64c64-testlist.txt
    testprogs/testbench/kernal64vic20-testlist.txt
    testprogs/testbench/micro64-testlist.txt
    testprogs/testbench/selftest/Makefile
    testprogs/testbench/selftest/c128.asm
    testprogs/testbench/u64-testlist.txt
    testprogs/testbench/vic20-testlist.in
    testprogs/testbench/x128-testlist.txt
    testprogs/testbench/x128c64-testlist.txt
    testprogs/testbench/x64-testlist.txt
    testprogs/testbench/x64sc-testlist.txt
    testprogs/testbench/xvic-testlist.txt
    testprogs/testbench/yace-testlist.txt
    testprogs/testbench/z64kc128-testlist.txt
    testprogs/testbench/z64kc128c64-testlist.txt
    testprogs/testbench/z64kc64-testlist.txt
    testprogs/testbench/z64kvic20-testlist.txt
Added Paths:
-----------
    testprogs/testbench/selftest/c128-fail.crt
    testprogs/testbench/selftest/c128-pass.crt
    testprogs/testbench/selftest/references/c128-fail.crt.png
    testprogs/testbench/selftest/references/c128-fail.prg.png
    testprogs/testbench/selftest/references/c128-pass.crt.png
    testprogs/testbench/selftest/references/c128-pass.prg.png
Modified: testprogs/testbench/c128-testlist.in
===================================================================
--- testprogs/testbench/c128-testlist.in	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/c128-testlist.in	2024-04-12 15:19:21 UTC (rev 45110)
@@ -8,6 +8,12 @@
 ################################################################################
 ./selftest/,c128-pass.prg,exitcode,10000000
 ./selftest/,c128-fail.prg,exitcode,10000000,expect:error
+./selftest/,c128-pass.prg,screenshot,10000000,vicii-screenshot
+./selftest/,c128-fail.prg,screenshot,10000000,vicii-screenshot,expect:error
+./selftest/,,exitcode,10000000,mountcrt:c128-pass.crt
+./selftest/,,exitcode,10000000,mountcrt:c128-fail.crt,expect:error
+./selftest/,,screenshot,10000000,mountcrt:c128-pass.crt,vicii-screenshot
+./selftest/,,screenshot,10000000,mountcrt:c128-fail.crt,vicii-screenshot,expect:error
 # FIXME: once these work, we can use screenshots
 ../c128/2mhztest,2mhztest.prg,interactive,0
 ../c128/2mhzVIC,2mhz-vic-hires.prg,screenshot,11300000,vicii-pal,vicii-screenshot
Modified: testprogs/testbench/c64-testlist.in
===================================================================
--- testprogs/testbench/c64-testlist.in	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/c64-testlist.in	2024-04-12 15:19:21 UTC (rev 45110)
@@ -10,14 +10,14 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
+./selftest/,c64-pass.prg,screenshot,10000000
 ./selftest/,c64-fail.prg,screenshot,10000000,expect:error
-./selftest/,c64-pass.prg,screenshot,10000000
+./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/c64rmk2-testlist.txt
===================================================================
--- testprogs/testbench/c64rmk2-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/c64rmk2-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -11,8 +11,8 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/cham20-testlist.txt
===================================================================
--- testprogs/testbench/cham20-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/cham20-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -9,10 +9,13 @@
 ./selftest/,vic20-fail.prg,exitcode,100000000,vic20-8k,expect:error
 ./selftest/,vic20-pass.prg,screenshot,100000000,vic20-8k
 ./selftest/,vic20-fail.prg,screenshot,100000000,vic20-8k,expect:error
+./selftest/,,exitcode,10000000,mountcrt:vic20-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:vic20-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:vic20-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:vic20-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:vic20-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:vic20-pass.crt
+# RAM pattern
+../VIC20/raminitpattern,,exitcode,10000000,mountcrt:ae.crt
+../VIC20/raminitpattern,,exitcode,10000000,mountcrt:jellymonsters.crt
 #TODO:
 #../crtemulation/vic20
 #../VIC20/fe3diag/,f3diag.prg,exitcode,10000000
Modified: testprogs/testbench/chameleon-testlist.txt
===================================================================
--- testprogs/testbench/chameleon-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/chameleon-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -11,14 +11,14 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
+./selftest/,c64-pass.prg,screenshot,10000000
 ./selftest/,c64-fail.prg,screenshot,10000000,expect:error
-./selftest/,c64-pass.prg,screenshot,10000000
+./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/denise-testlist.txt
===================================================================
--- testprogs/testbench/denise-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/denise-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -11,14 +11,14 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
+./selftest/,c64-pass.prg,screenshot,10000000
 ./selftest/,c64-fail.prg,screenshot,10000000,expect:error
-./selftest/,c64-pass.prg,screenshot,10000000
+./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/emu64-testlist.txt
===================================================================
--- testprogs/testbench/emu64-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/emu64-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -11,14 +11,14 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
+./selftest/,c64-pass.prg,screenshot,10000000
 ./selftest/,c64-fail.prg,screenshot,10000000,expect:error
-./selftest/,c64-pass.prg,screenshot,10000000
+./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/hoxs64-testlist.txt
===================================================================
--- testprogs/testbench/hoxs64-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/hoxs64-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -11,14 +11,14 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
+./selftest/,c64-pass.prg,screenshot,10000000
 ./selftest/,c64-fail.prg,screenshot,10000000,expect:error
-./selftest/,c64-pass.prg,screenshot,10000000
+./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/kernal64c128c128-testlist.txt
===================================================================
--- testprogs/testbench/kernal64c128c128-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/kernal64c128c128-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -9,6 +9,12 @@
 ################################################################################
 ./selftest/,c128-pass.prg,exitcode,10000000
 ./selftest/,c128-fail.prg,exitcode,10000000,expect:error
+./selftest/,c128-pass.prg,screenshot,10000000,vicii-screenshot
+./selftest/,c128-fail.prg,screenshot,10000000,vicii-screenshot,expect:error
+./selftest/,,exitcode,10000000,mountcrt:c128-pass.crt
+./selftest/,,exitcode,10000000,mountcrt:c128-fail.crt,expect:error
+./selftest/,,screenshot,10000000,mountcrt:c128-pass.crt,vicii-screenshot
+./selftest/,,screenshot,10000000,mountcrt:c128-fail.crt,vicii-screenshot,expect:error
 # FIXME: once these work, we can use screenshots
 ../c128/2mhztest,2mhztest.prg,interactive,0
 ../c128/2mhzVIC,2mhz-vic-hires.prg,screenshot,11300000,vicii-pal,vicii-screenshot
Modified: testprogs/testbench/kernal64c128c64-testlist.txt
===================================================================
--- testprogs/testbench/kernal64c128c64-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/kernal64c128c64-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -11,14 +11,14 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
+./selftest/,c64-pass.prg,screenshot,10000000
 ./selftest/,c64-fail.prg,screenshot,10000000,expect:error
-./selftest/,c64-pass.prg,screenshot,10000000
+./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/kernal64c64-testlist.txt
===================================================================
--- testprogs/testbench/kernal64c64-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/kernal64c64-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -11,14 +11,14 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
+./selftest/,c64-pass.prg,screenshot,10000000
 ./selftest/,c64-fail.prg,screenshot,10000000,expect:error
-./selftest/,c64-pass.prg,screenshot,10000000
+./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/kernal64vic20-testlist.txt
===================================================================
--- testprogs/testbench/kernal64vic20-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/kernal64vic20-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -9,10 +9,13 @@
 ./selftest/,vic20-fail.prg,exitcode,100000000,vic20-8k,expect:error
 ./selftest/,vic20-pass.prg,screenshot,100000000,vic20-8k
 ./selftest/,vic20-fail.prg,screenshot,100000000,vic20-8k,expect:error
+./selftest/,,exitcode,10000000,mountcrt:vic20-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:vic20-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:vic20-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:vic20-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:vic20-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:vic20-pass.crt
+# RAM pattern
+../VIC20/raminitpattern,,exitcode,10000000,mountcrt:ae.crt
+../VIC20/raminitpattern,,exitcode,10000000,mountcrt:jellymonsters.crt
 #TODO:
 #../crtemulation/vic20
 #../VIC20/fe3diag/,f3diag.prg,exitcode,10000000
Modified: testprogs/testbench/micro64-testlist.txt
===================================================================
--- testprogs/testbench/micro64-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/micro64-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -11,14 +11,14 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
+./selftest/,c64-pass.prg,screenshot,10000000
 ./selftest/,c64-fail.prg,screenshot,10000000,expect:error
-./selftest/,c64-pass.prg,screenshot,10000000
+./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/selftest/Makefile
===================================================================
--- testprogs/testbench/selftest/Makefile	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/selftest/Makefile	2024-04-12 15:19:21 UTC (rev 45110)
@@ -9,6 +9,7 @@
 	dtv-pass.prg dtv-fail.prg \
 	dtv-pass.d64 \
 	c128-pass.prg c128-fail.prg \
+	c128-pass.crt c128-fail.crt \
 	c128-pass.d64 \
 	vic20-pass.prg vic20-fail.prg \
 	vic20-pass.d64 \
@@ -34,6 +35,7 @@
 c64-fail.crt: c64.asm
 	acme -DCART=1 -DFAIL=1 -f plain -o c64-fail.bin c64.asm
 	cartconv -p -t normal -i c64-fail.bin -o c64-fail.crt
+
 plus4-pass.prg: plus4.asm
 	acme -DFAIL=0 -f cbm -o plus4-pass.prg plus4.asm
 plus4-pass.d64: plus4-pass.prg
@@ -41,6 +43,7 @@
 		-write plus4-pass.prg "plus4-pass"
 plus4-fail.prg: plus4.asm
 	acme -DFAIL=1 -f cbm -o plus4-fail.prg plus4.asm
+
 scpu-pass.prg: scpu.asm
 	acme -DFAIL=0 -f cbm -o scpu-pass.prg scpu.asm
 scpu-fail.prg: scpu.asm
@@ -48,6 +51,7 @@
 scpu-pass.d64: scpu-pass.prg
 	c1541 -format "scpu pass,00" d64 scpu-pass.d64 \
 		-write scpu-pass.prg "scpu-pass"
+
 dtv-pass.prg: dtv.asm
 	acme -DFAIL=0 -f cbm -o dtv-pass.prg dtv.asm
 dtv-fail.prg: dtv.asm
@@ -55,6 +59,7 @@
 dtv-pass.d64: dtv-pass.prg
 	c1541 -format "dtv pass,00" d64 dtv-pass.d64 \
 		-write dtv-pass.prg "dtv-pass"
+
 vic20-pass.prg: vic20.asm
 	acme -DEXPANDED=1 -DCART=0 -DFAIL=0 -f cbm -o vic20-pass.prg vic20.asm
 vic20-fail.prg: vic20.asm
@@ -68,13 +73,21 @@
 vic20-pass.d64: vic20-pass.prg
 	c1541 -format "vic20 pass,00" d64 vic20-pass.d64 \
 		-write vic20-pass.prg "vic20-pass"
+
 c128-pass.prg: c128.asm
-	acme -DFAIL=0 -f cbm -o c128-pass.prg c128.asm
+	acme -DCART=0 -DFAIL=0 -f cbm -o c128-pass.prg c128.asm
 c128-fail.prg: c128.asm
-	acme -DFAIL=1 -f cbm -o c128-fail.prg c128.asm
+	acme -DCART=0 -DFAIL=1 -f cbm -o c128-fail.prg c128.asm
+c128-pass.crt: c128.asm
+	acme -DCART=1 -DFAIL=0 -f plain -o c128-pass.bin c128.asm
+	cartconv -p -t c128 -l 0x8000 -i c128-pass.bin -o c128-pass.crt
+c128-fail.crt: c128.asm
+	acme -DCART=1 -DFAIL=1 -f plain -o c128-fail.bin c128.asm
+	cartconv -p -t c128 -l 0x8000 -i c128-fail.bin -o c128-fail.crt
 c128-pass.d64: scpu-pass.prg
 	c1541 -format "c128 pass,00" d64 c128-pass.d64 \
 		-write c128-pass.prg "c128-pass"
+
 pet-pass.prg: pet.asm
 	acme -DFAIL=0 -f cbm -o pet-pass.prg pet.asm
 pet-fail.prg: pet.asm
@@ -82,10 +95,12 @@
 pet-pass.d82: pet-pass.prg
 	c1541 -format "pet pass,00" d82 pet-pass.d82 \
 		-write pet-pass.prg "pet-pass"
+
 vsid-pass.prg: vsid.asm
 	acme -DFAIL=0 -f plain -o vsid-pass.sid vsid.asm
 vsid-fail.prg: vsid.asm
 	acme -DFAIL=1 -f plain -o vsid-fail.sid vsid.asm
+
 cbm610-pass.prg: cbm610.asm
 	acme -DFAIL=0 -f cbm -o cbm610-pass.prg cbm610.asm
 cbm610-fail.prg: cbm610.asm
@@ -93,6 +108,7 @@
 cbm610-pass.d82: cbm610-pass.prg
 	c1541 -format "cbm610 pass,00" d82 cbm610-pass.d82 \
 		-write cbm610-pass.prg "cbm610-pass"
+
 cbm510-pass.prg: cbm510.asm
 	acme -DFAIL=0 -f cbm -o cbm510-pass.prg cbm510.asm
 cbm510-fail.prg: cbm510.asm
@@ -105,3 +121,7 @@
 	$(RM) *.prg
 	$(RM) *.bin
 	$(RM) *.crt
+	$(RM) *.sid
+	$(RM) *.d64
+	$(RM) *.d81
+	$(RM) *.d82
Added: testprogs/testbench/selftest/c128-fail.crt
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/c128-fail.crt
===================================================================
--- testprogs/testbench/selftest/c128-fail.crt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/selftest/c128-fail.crt	2024-04-12 15:19:21 UTC (rev 45110)
Property changes on: testprogs/testbench/selftest/c128-fail.crt
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: testprogs/testbench/selftest/c128-pass.crt
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/c128-pass.crt
===================================================================
--- testprogs/testbench/selftest/c128-pass.crt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/selftest/c128-pass.crt	2024-04-12 15:19:21 UTC (rev 45110)
Property changes on: testprogs/testbench/selftest/c128-pass.crt
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: testprogs/testbench/selftest/c128.asm
===================================================================
--- testprogs/testbench/selftest/c128.asm	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/selftest/c128.asm	2024-04-12 15:19:21 UTC (rev 45110)
@@ -3,14 +3,42 @@
 SCREENCOLOR = $d021
 DEBUGREG = $d7ff
 
+!if CART=0 {
             * = $1c01
             !word eol,0
             !byte $9e, $37,$31,$38,$31, 0 ; SYS 7181
 eol:        !word 0
+} else {
+            * = $8000
+            JMP start       ; cold-start vector
+            JMP start       ; warm-start vector
+            !byte 1             ; identifier byte. 1 = Autostart immediately.
+            !byte $43,$42,$4D   ; "CBM" string
+}
 
 start:
 ; usually we want to SEI and set background to black at start
             sei
+!if CART=1 {
+            ldx #$ff
+            txs
+            cld
+            lda #$e3
+            sta $01
+            lda #$37
+            sta $00
+
+            lda #%00001010     ; BIT 0   : $D000-$DFFF (0 = I/O Block)
+                                ; BIT 1   : $4000-$7FFF (1 = RAM)
+                                ; BIT 2/3 : $8000-$BFFF (10 = External ROM)
+                                ; BIT 4/5 : $C000-$CFFF/$E000-$FFFF (00 = Kernal ROM)
+                                ; BIT 6/7 : RAM used. (00 = RAM 0)
+            sta $ff00          ; MMU Configuration Register
+
+            jsr $ff8a          ; Restore Vectors
+            jsr $ff84          ; Init I/O Devices, Ports & Timers
+            jsr $ff81          ; Init Editor & Video Chips
+}
             lda #0
             sta BORDERCOLOR
             sta SCREENCOLOR
Added: testprogs/testbench/selftest/references/c128-fail.crt.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/c128-fail.crt.png
===================================================================
--- testprogs/testbench/selftest/references/c128-fail.crt.png	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/selftest/references/c128-fail.crt.png	2024-04-12 15:19:21 UTC (rev 45110)
Property changes on: testprogs/testbench/selftest/references/c128-fail.crt.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/c128-fail.prg.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/c128-fail.prg.png
===================================================================
--- testprogs/testbench/selftest/references/c128-fail.prg.png	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/selftest/references/c128-fail.prg.png	2024-04-12 15:19:21 UTC (rev 45110)
Property changes on: testprogs/testbench/selftest/references/c128-fail.prg.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/c128-pass.crt.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/c128-pass.crt.png
===================================================================
--- testprogs/testbench/selftest/references/c128-pass.crt.png	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/selftest/references/c128-pass.crt.png	2024-04-12 15:19:21 UTC (rev 45110)
Property changes on: testprogs/testbench/selftest/references/c128-pass.crt.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/c128-pass.prg.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/c128-pass.prg.png
===================================================================
--- testprogs/testbench/selftest/references/c128-pass.prg.png	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/selftest/references/c128-pass.prg.png	2024-04-12 15:19:21 UTC (rev 45110)
Property changes on: testprogs/testbench/selftest/references/c128-pass.prg.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Modified: testprogs/testbench/u64-testlist.txt
===================================================================
--- testprogs/testbench/u64-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/u64-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -11,10 +11,10 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
+./selftest/,c64-pass.prg,screenshot,10000000
 ./selftest/,c64-fail.prg,screenshot,10000000,expect:error
-./selftest/,c64-pass.prg,screenshot,10000000
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/vic20-testlist.in
===================================================================
--- testprogs/testbench/vic20-testlist.in	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/vic20-testlist.in	2024-04-12 15:19:21 UTC (rev 45110)
@@ -8,10 +8,13 @@
 ./selftest/,vic20-fail.prg,exitcode,100000000,vic20-8k,expect:error
 ./selftest/,vic20-pass.prg,screenshot,100000000,vic20-8k
 ./selftest/,vic20-fail.prg,screenshot,100000000,vic20-8k,expect:error
+./selftest/,,exitcode,10000000,mountcrt:vic20-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:vic20-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:vic20-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:vic20-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:vic20-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:vic20-pass.crt
+# RAM pattern
+../VIC20/raminitpattern,,exitcode,10000000,mountcrt:ae.crt
+../VIC20/raminitpattern,,exitcode,10000000,mountcrt:jellymonsters.crt
 #TODO:
 #../crtemulation/vic20
 #../VIC20/fe3diag/,f3diag.prg,exitcode,10000000
Modified: testprogs/testbench/x128-testlist.txt
===================================================================
--- testprogs/testbench/x128-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/x128-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -9,6 +9,12 @@
 ################################################################################
 ./selftest/,c128-pass.prg,exitcode,10000000
 ./selftest/,c128-fail.prg,exitcode,10000000,expect:error
+./selftest/,c128-pass.prg,screenshot,10000000,vicii-screenshot
+./selftest/,c128-fail.prg,screenshot,10000000,vicii-screenshot,expect:error
+./selftest/,,exitcode,10000000,mountcrt:c128-pass.crt
+./selftest/,,exitcode,10000000,mountcrt:c128-fail.crt,expect:error
+./selftest/,,screenshot,10000000,mountcrt:c128-pass.crt,vicii-screenshot
+./selftest/,,screenshot,10000000,mountcrt:c128-fail.crt,vicii-screenshot,expect:error
 # FIXME: once these work, we can use screenshots
 ../c128/2mhztest,2mhztest.prg,interactive,0
 ../c128/2mhzVIC,2mhz-vic-hires.prg,screenshot,11300000,vicii-pal,vicii-screenshot
Modified: testprogs/testbench/x128c64-testlist.txt
===================================================================
--- testprogs/testbench/x128c64-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/x128c64-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -11,14 +11,14 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
+./selftest/,c64-pass.prg,screenshot,10000000
 ./selftest/,c64-fail.prg,screenshot,10000000,expect:error
-./selftest/,c64-pass.prg,screenshot,10000000
+./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/x64-testlist.txt
===================================================================
--- testprogs/testbench/x64-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/x64-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -11,14 +11,14 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
+./selftest/,c64-pass.prg,screenshot,10000000
 ./selftest/,c64-fail.prg,screenshot,10000000,expect:error
-./selftest/,c64-pass.prg,screenshot,10000000
+./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/x64sc-testlist.txt
===================================================================
--- testprogs/testbench/x64sc-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/x64sc-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -11,14 +11,14 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
+./selftest/,c64-pass.prg,screenshot,10000000
 ./selftest/,c64-fail.prg,screenshot,10000000,expect:error
-./selftest/,c64-pass.prg,screenshot,10000000
+./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/xvic-testlist.txt
===================================================================
--- testprogs/testbench/xvic-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/xvic-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -9,10 +9,13 @@
 ./selftest/,vic20-fail.prg,exitcode,100000000,vic20-8k,expect:error
 ./selftest/,vic20-pass.prg,screenshot,100000000,vic20-8k
 ./selftest/,vic20-fail.prg,screenshot,100000000,vic20-8k,expect:error
+./selftest/,,exitcode,10000000,mountcrt:vic20-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:vic20-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:vic20-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:vic20-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:vic20-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:vic20-pass.crt
+# RAM pattern
+../VIC20/raminitpattern,,exitcode,10000000,mountcrt:ae.crt
+../VIC20/raminitpattern,,exitcode,10000000,mountcrt:jellymonsters.crt
 #TODO:
 #../crtemulation/vic20
 #../VIC20/fe3diag/,f3diag.prg,exitcode,10000000
Modified: testprogs/testbench/yace-testlist.txt
===================================================================
--- testprogs/testbench/yace-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/yace-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -11,14 +11,14 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
+./selftest/,c64-pass.prg,screenshot,10000000
 ./selftest/,c64-fail.prg,screenshot,10000000,expect:error
-./selftest/,c64-pass.prg,screenshot,10000000
+./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/z64kc128-testlist.txt
===================================================================
--- testprogs/testbench/z64kc128-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/z64kc128-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -9,6 +9,12 @@
 ################################################################################
 ./selftest/,c128-pass.prg,exitcode,10000000
 ./selftest/,c128-fail.prg,exitcode,10000000,expect:error
+./selftest/,c128-pass.prg,screenshot,10000000,vicii-screenshot
+./selftest/,c128-fail.prg,screenshot,10000000,vicii-screenshot,expect:error
+./selftest/,,exitcode,10000000,mountcrt:c128-pass.crt
+./selftest/,,exitcode,10000000,mountcrt:c128-fail.crt,expect:error
+./selftest/,,screenshot,10000000,mountcrt:c128-pass.crt,vicii-screenshot
+./selftest/,,screenshot,10000000,mountcrt:c128-fail.crt,vicii-screenshot,expect:error
 # FIXME: once these work, we can use screenshots
 ../c128/2mhztest,2mhztest.prg,interactive,0
 ../c128/2mhzVIC,2mhz-vic-hires.prg,screenshot,11300000,vicii-pal,vicii-screenshot
Modified: testprogs/testbench/z64kc128c64-testlist.txt
===================================================================
--- testprogs/testbench/z64kc128c64-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/z64kc128c64-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -11,14 +11,14 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
+./selftest/,c64-pass.prg,screenshot,10000000
 ./selftest/,c64-fail.prg,screenshot,10000000,expect:error
-./selftest/,c64-pass.prg,screenshot,10000000
+./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/z64kc64-testlist.txt
===================================================================
--- testprogs/testbench/z64kc64-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/z64kc64-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -11,14 +11,14 @@
 ################################################################################
 # selftest
 ################################################################################
+./selftest/,c64-pass.prg,exitcode,10000000
 ./selftest/,c64-fail.prg,exitcode,10000000,expect:error
-./selftest/,c64-pass.prg,exitcode,10000000
+./selftest/,c64-pass.prg,screenshot,10000000
 ./selftest/,c64-fail.prg,screenshot,10000000,expect:error
-./selftest/,c64-pass.prg,screenshot,10000000
+./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:c64-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:c64-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:c64-pass.crt
 ################################################################################
 # general
 ################################################################################
Modified: testprogs/testbench/z64kvic20-testlist.txt
===================================================================
--- testprogs/testbench/z64kvic20-testlist.txt	2024-04-12 11:44:39 UTC (rev 45109)
+++ testprogs/testbench/z64kvic20-testlist.txt	2024-04-12 15:19:21 UTC (rev 45110)
@@ -9,10 +9,13 @@
 ./selftest/,vic20-fail.prg,exitcode,100000000,vic20-8k,expect:error
 ./selftest/,vic20-pass.prg,screenshot,100000000,vic20-8k
 ./selftest/,vic20-fail.prg,screenshot,100000000,vic20-8k,expect:error
+./selftest/,,exitcode,10000000,mountcrt:vic20-pass.crt
 ./selftest/,,exitcode,10000000,mountcrt:vic20-fail.crt,expect:error
-./selftest/,,exitcode,10000000,mountcrt:vic20-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:vic20-pass.crt
 ./selftest/,,screenshot,10000000,mountcrt:vic20-fail.crt,expect:error
-./selftest/,,screenshot,10000000,mountcrt:vic20-pass.crt
+# RAM pattern
+../VIC20/raminitpattern,,exitcode,10000000,mountcrt:ae.crt
+../VIC20/raminitpattern,,exitcode,10000000,mountcrt:jellymonsters.crt
 #TODO:
 #../crtemulation/vic20
 #../VIC20/fe3diag/,f3diag.prg,exitcode,10000000
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <co...@us...> - 2024-04-12 11:44:41
      
     | 
| Revision: 45109
          http://sourceforge.net/p/vice-emu/code/45109
Author:   compyx
Date:     2024-04-12 11:44:39 +0000 (Fri, 12 Apr 2024)
Log Message:
-----------
Gtk3: fix parentage of rest of `vice_gtk3_message_error` dialogs
Modified Paths:
--------------
    trunk/vice/src/arch/gtk3/uivsidwindow.c
    trunk/vice/src/arch/gtk3/widgets/base/cartridgewidgets.c
    trunk/vice/src/arch/gtk3/widgets/settings_gmod2c128.c
    trunk/vice/src/arch/gtk3/widgets/settings_gmod3.c
    trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c
    trunk/vice/src/arch/gtk3/widgets/settings_ieee488.c
    trunk/vice/src/arch/gtk3/widgets/settings_ieeeflash64.c
    trunk/vice/src/arch/gtk3/widgets/settings_mmc64.c
    trunk/vice/src/arch/gtk3/widgets/settings_mmcr.c
    trunk/vice/src/arch/gtk3/widgets/settings_petdww.c
    trunk/vice/src/arch/gtk3/widgets/settings_ramlink.c
    trunk/vice/src/arch/gtk3/widgets/settings_retroreplay.c
    trunk/vice/src/arch/gtk3/widgets/settings_rrnetmk3.c
    trunk/vice/src/arch/gtk3/widgets/vsidplaylistwidget.c
Modified: trunk/vice/src/arch/gtk3/uivsidwindow.c
===================================================================
--- trunk/vice/src/arch/gtk3/uivsidwindow.c	2024-04-12 08:28:42 UTC (rev 45108)
+++ trunk/vice/src/arch/gtk3/uivsidwindow.c	2024-04-12 11:44:39 UTC (rev 45109)
@@ -245,7 +245,7 @@
 
     if (machine_autodetect_psid(filename) < 0) {
         vsid_control_widget_set_state(VSID_ERROR);
-        vice_gtk3_message_error(NULL,
+        vice_gtk3_message_error(NULL,   /* use VSID window as parent */
                                 "PSID error",
                                 "'%s' is not a valid PSID file.",
                                 filename);
Modified: trunk/vice/src/arch/gtk3/widgets/base/cartridgewidgets.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/base/cartridgewidgets.c	2024-04-12 08:28:42 UTC (rev 45108)
+++ trunk/vice/src/arch/gtk3/widgets/base/cartridgewidgets.c	2024-04-12 11:44:39 UTC (rev 45109)
@@ -208,10 +208,19 @@
     }
     if (result != 0) {
         /* show error dialog */
-        char title[256];
+        GtkWidget *parent;
+        char       title[256];
 
+        /* get parent window (usually the settings dialog) */
+        parent = gtk_widget_get_toplevel(GTK_WIDGET(self));
+        if (!GTK_IS_WINDOW(parent)) {
+            /* widget isn't being used in the settings dialog, use active
+             * emulator window as parent */
+            parent = NULL;
+        }
         g_snprintf(title, sizeof title, "%s Error", state->cart_name);
-        vice_gtk3_message_error(NULL, title,
+        vice_gtk3_message_error(GTK_WINDOW(parent),
+                                title,
                                 "Failed to flush %s %s image",
                                 state->cart_name, state->image_tag);
     }
@@ -408,10 +417,19 @@
 
     result = mediator_update_string(mediator, filename);
     if (!result) {
-        char title[256];
+        char       title[256];
+        GtkWidget *parent;
 
+        /* get parent window (usually the settings dialog) */
+        parent = gtk_widget_get_toplevel(mediator->widget);
+        if (!GTK_IS_WINDOW(parent)) {
+            /* widget isn't being used in the settings dialog, use active
+             * emulator window as parent */
+            parent = NULL;
+        }
         g_snprintf(title, sizeof title, "%s Error", state->cart_name);
-        vice_gtk3_message_error(NULL, title,
+        vice_gtk3_message_error(GTK_WINDOW(parent),
+                                title,
                                 "Failed to set '%s' as the %s image file.",
                                 filename, state->image_tag);
     }
Modified: trunk/vice/src/arch/gtk3/widgets/settings_gmod2c128.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_gmod2c128.c	2024-04-12 08:28:42 UTC (rev 45108)
+++ trunk/vice/src/arch/gtk3/widgets/settings_gmod2c128.c	2024-04-12 11:44:39 UTC (rev 45109)
@@ -95,7 +95,15 @@
 static void on_flush_clicked(GtkWidget *widget, gpointer user_data)
 {
     if (cartridge_flush_image(CARTRIDGE_C128_MAKEID(CARTRIDGE_C128_GMOD2C128)) < 0) {
-        vice_gtk3_message_error(NULL, /* FIXME: need proper parent */
+        GtkWidget *parent;
+
+        /* get settings dialog */
+        parent = gtk_widget_get_toplevel(widget);
+        if (!GTK_IS_WINDOW(parent)) {
+            /* revert to current emulator window */
+            parent = NULL;
+        }
+        vice_gtk3_message_error(GTK_WINDOW(parent),
                                 "Flushing failed",
                                 "Failed to fush cartridge image");
     }
Modified: trunk/vice/src/arch/gtk3/widgets/settings_gmod3.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_gmod3.c	2024-04-12 08:28:42 UTC (rev 45108)
+++ trunk/vice/src/arch/gtk3/widgets/settings_gmod3.c	2024-04-12 11:44:39 UTC (rev 45109)
@@ -84,7 +84,13 @@
 static void on_flush_clicked(GtkWidget *widget, gpointer user_data)
 {
     if (cartridge_flush_image(CARTRIDGE_GMOD3) < 0) {
-        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
+        /* get settings dialog */
+        GtkWidget *parent = gtk_widget_get_toplevel(widget);
+        if (!GTK_IS_WINDOW(parent)) {
+            /* revert to current emulator window */
+            parent = NULL;
+        }
+        vice_gtk3_message_error(GTK_WINDOW(parent),
                                 CARTRIDGE_NAME_GMOD3 " Error",
                                 "Failed to flush cartridge image.");
     }
Modified: trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c	2024-04-12 08:28:42 UTC (rev 45108)
+++ trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c	2024-04-12 11:44:39 UTC (rev 45109)
@@ -1449,8 +1449,16 @@
                                path);
         lib_free(path);
     } else {
+        GtkWidget *parent;
         /* FIXME: perhaps some info on what happened to make it fail? */
-        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
+
+        /* get settings dialog */
+        parent = gtk_widget_get_toplevel(GTK_WIDGET(button));
+        if (!GTK_IS_WINDOW(parent)) {
+            /* revert to current emulator window */
+            parent = NULL;
+        }
+        vice_gtk3_message_error(GTK_WINDOW(parent),
                                 "Hotkeys error",
                                 "Failed to save hotkeys.");
     }
Modified: trunk/vice/src/arch/gtk3/widgets/settings_ieee488.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_ieee488.c	2024-04-12 08:28:42 UTC (rev 45108)
+++ trunk/vice/src/arch/gtk3/widgets/settings_ieee488.c	2024-04-12 11:44:39 UTC (rev 45109)
@@ -41,6 +41,9 @@
 #include "settings_ieee488.h"
 
 
+#define CARTNAME    CARTRIDGE_NAME_IEEE488
+
+
 /** \brief  Handler for the 'toggled' event of the 'enable' check button
  *
  * Toggles the 'enabled' state of the IEEE-488 adapter/cart, but only if an
@@ -53,9 +56,15 @@
  */
 static void on_enable_toggled(GtkWidget *widget, gpointer data)
 {
-    gboolean state;
+    GtkWidget *parent;
+    gboolean  state;
 
-    state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+    state  = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+    parent = gtk_widget_get_toplevel(widget);
+    if (!GTK_IS_WINDOW(widget)) {
+        parent = NULL;
+    }
+
     if (state) {
         const char *image = NULL;
 
@@ -62,9 +71,9 @@
         resources_get_string("IEEE488Image", &image);
         if (image == NULL || *image == '\0') {
             /* no image */
-            vice_gtk3_message_error(NULL,
-                                    CARTRIDGE_NAME_IEEE488 " Error",
-                                    "Cannot enable " CARTRIDGE_NAME_IEEE488 ","
+            vice_gtk3_message_error(GTK_WINDOW(parent),
+                                    CARTNAME " Error",
+                                    "Cannot enable " CARTNAME ","
                                     " no image has been selected.");
             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), FALSE);
             state = FALSE;
@@ -73,12 +82,18 @@
 
     if (state) {
         if (cartridge_enable(CARTRIDGE_IEEE488) < 0) {
-            log_error(LOG_ERR, "failed to enable " CARTRIDGE_NAME_IEEE488 ".");
+            log_error(LOG_ERR, "failed to enable " CARTNAME ".");
+            vice_gtk3_message_error(GTK_WINDOW(parent),
+                                    CARTNAME " Error",
+                                    "Failed to enable " CARTNAME ".");
             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), FALSE);
         }
     } else {
         if (cartridge_disable(CARTRIDGE_IEEE488) < 0) {
-            log_error(LOG_ERR, "failed to disable " CARTRIDGE_NAME_IEEE488 ".");
+            log_error(LOG_ERR, "failed to disable " CARTNAME ".");
+            vice_gtk3_message_error(GTK_WINDOW(parent),
+                                    CARTNAME " Error",
+                                    "Failed to disable " CARTNAME ".");
         }
     }
 }
@@ -108,7 +123,7 @@
     /* we can't use a `resource_check_button` here, since toggling the resource
      * depends on whether an image file is specified
      */
-    enable = gtk_check_button_new_with_label("Enable " CARTRIDGE_NAME_IEEE488);
+    enable = gtk_check_button_new_with_label("Enable " CARTNAME);
     /* only set state to true if both the state is true and an image is given */
     if (cart_enabled && (image != NULL && *image != '\0')) {
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(enable), TRUE);
@@ -118,7 +133,7 @@
                      G_CALLBACK(on_enable_toggled),
                      NULL);
 
-    chlabel = gtk_label_new(CARTRIDGE_NAME_IEEE488 " Image");
+    chlabel = gtk_label_new(CARTNAME " Image");
     gtk_widget_set_halign(chlabel, GTK_ALIGN_START);
     chooser = vice_gtk3_resource_filechooser_new("IEEE488Image",
                                                  GTK_FILE_CHOOSER_ACTION_OPEN);
@@ -134,3 +149,5 @@
     gtk_widget_show_all(grid);
     return grid;
 }
+
+#undef CARTNAME
Modified: trunk/vice/src/arch/gtk3/widgets/settings_ieeeflash64.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_ieeeflash64.c	2024-04-12 08:28:42 UTC (rev 45108)
+++ trunk/vice/src/arch/gtk3/widgets/settings_ieeeflash64.c	2024-04-12 11:44:39 UTC (rev 45109)
@@ -44,7 +44,10 @@
 
 #include "settings_ieeeflash64.h"
 
+/** \brief  Temporary define to make editing easier */
+#define CARTNAME    CARTRIDGE_NAME_IEEEFLASH64
 
+
 /** \brief  Handler for the "toggled" event of the 'enable' check button
  *
  * Toggles the 'enabled' state of the IEEE Flash! 64 adapter/cart, but
@@ -57,8 +60,13 @@
  */
 static void on_enable_toggled(GtkWidget *widget, gpointer data)
 {
-    gboolean state;
+    GtkWidget *parent;
+    gboolean   state;
 
+    parent = gtk_widget_get_toplevel(widget);
+    if (!GTK_IS_WINDOW(widget)) {
+        parent = NULL;
+    }
     state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
     if (state) {
         const char *image = NULL;
@@ -66,10 +74,9 @@
         resources_get_string("IEEEFlash64Image", &image);
         if (image == NULL || *image == '\0') {
             /* no image */
-            vice_gtk3_message_error(NULL, /* FIXME: need proper parent */
-                                    CARTRIDGE_NAME_IEEEFLASH64 " Error",
-                                    "Cannot enable " CARTRIDGE_NAME_IEEEFLASH64
-                                    ", no image specified.");
+            vice_gtk3_message_error(GTK_WINDOW(parent),
+                                    CARTNAME " Error",
+                                    "Cannot enable " CARTNAME ", no image specified.");
             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), FALSE);
             state = 0;
         }
@@ -77,12 +84,18 @@
 
     if (state) {
         if (cartridge_enable(CARTRIDGE_IEEEFLASH64) < 0) {
-            log_error(LOG_ERR, "failed to enable " CARTRIDGE_NAME_IEEEFLASH64 ".");
+            log_error(LOG_ERR, "failed to enable " CARTNAME ".");
+            vice_gtk3_message_error(GTK_WINDOW(parent),
+                                    CARTNAME " Error",
+                                    "Failed to enable " CARTNAME ".");
             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), FALSE);
         }
     } else {
         if (cartridge_disable(CARTRIDGE_IEEEFLASH64) < 0) {
-            log_error(LOG_ERR, "failed to disable " CARTRIDGE_NAME_IEEEFLASH64 ".");
+            log_error(LOG_ERR, "failed to disable " CARTNAME ".");
+            vice_gtk3_message_error(GTK_WINDOW(parent),
+                                    CARTNAME" Error",
+                                    "Failed to enable " CARTNAME ".");
         }
     }
 }
@@ -116,7 +129,7 @@
     /* we can't use a `resource_check_button` here, since toggling the resource
      * depends on whether an image file is specified
      */
-    enable = gtk_check_button_new_with_label("Enable " CARTRIDGE_NAME_IEEEFLASH64 " emulation");
+    enable = gtk_check_button_new_with_label("Enable " CARTNAME " emulation");
     gtk_widget_set_margin_bottom(enable, 16);
     /* only set state to true if both the state is true and an image is given */
     if (cart_enabled && (image != NULL && *image != '\0')) {
@@ -127,7 +140,7 @@
                      G_CALLBACK(on_enable_toggled),
                      NULL);
 
-    chlabel = gtk_label_new(CARTRIDGE_NAME_IEEEFLASH64 " ROM Image");
+    chlabel = gtk_label_new(CARTNAME " ROM Image");
     gtk_widget_set_halign(chlabel, GTK_ALIGN_START);
     chooser = vice_gtk3_resource_filechooser_new("IEEEFlash64Image",
                                                  GTK_FILE_CHOOSER_ACTION_OPEN);
@@ -154,3 +167,5 @@
     gtk_widget_show_all(grid);
     return grid;
 }
+
+#undef CARTNAME
Modified: trunk/vice/src/arch/gtk3/widgets/settings_mmc64.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_mmc64.c	2024-04-12 08:28:42 UTC (rev 45108)
+++ trunk/vice/src/arch/gtk3/widgets/settings_mmc64.c	2024-04-12 11:44:39 UTC (rev 45109)
@@ -48,6 +48,10 @@
 #include "settings_mmc64.h"
 
 
+/** \brief  Temporary define to make editing easier */
+#define CARTNAME    CARTRIDGE_NAME_MMC64
+
+
 /** \brief  List of revisions
  */
 static const vice_gtk3_radiogroup_entry_t revisions[] = {
@@ -81,37 +85,41 @@
  */
 static void on_enable_toggled(GtkWidget *check, gpointer user_data)
 {
+    GtkWidget  *parent;
     gboolean    enabled;
     const char *bios;
 
     enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check));
     bios    = gtk_entry_get_text(GTK_ENTRY(bios_filename));
+    parent  = gtk_widget_get_toplevel(check);
+    if (!GTK_IS_WINDOW(parent)) {
+        parent = NULL;
+    }
 
     if (enabled && (bios == NULL || *bios == '\0')) {
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), FALSE);
-        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
-                                CARTRIDGE_NAME_MMC64 " Error",
-                                "Cannot enable " CARTRIDGE_NAME_MMC64
-                                " due to missing BIOS file.");
+        vice_gtk3_message_error(GTK_WINDOW(parent),
+                                CARTNAME " Error",
+                                "Cannot enable " CARTNAME " due to missing BIOS file.");
         return;
     }
 
-    /* TODO: this requires proper logging or error dialogs, not debug_gtk3() */
     if (enabled && bios != NULL && *bios != '\0') {
         if (cartridge_enable(CARTRIDGE_MMC64) < 0) {
             /* failed to set resource */
             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), FALSE);
             log_error(LOG_ERR,
-                      "failed to activate " CARTRIDGE_NAME_MMC64 ", please set BIOS file.");
+                      "failed to enable " CARTNAME ", please set BIOS file.");
+            vice_gtk3_message_error(GTK_WINDOW(parent),
+                                    CARTNAME " Error",
+                                    "Failed to enable " CARTNAME ", please set BIOS file.");
         }
-        /* doesn't work, attaching for example a KCS Power Cart will still
-         * return 37 (MMC64) */
-        if (!cartridge_type_enabled(CARTRIDGE_MMC64)) {
-            debug_gtk3("failed to attach MMC64.");
-        }
     } else if (!enabled) {
         if (cartridge_disable(CARTRIDGE_MMC64) < 0) {
-            log_error(LOG_ERR, "failed to disable " CARTRIDGE_NAME_MMC64 ".");
+            log_error(LOG_ERR, "failed to disable " CARTNAME ".");
+            vice_gtk3_message_error(GTK_WINDOW(parent),
+                                    CARTNAME " Error",
+                                    "Failed to disable " CARTNAME ", please set BIOS file.");
         }
     }
 }
@@ -161,9 +169,14 @@
  */
 static void on_flush_clicked(GtkWidget *widget, gpointer user_data)
 {
+    GtkWidget *parent = gtk_widget_get_toplevel(widget);
+
+    if (!GTK_IS_WINDOW(parent)) {
+        parent = NULL;  /* make error dialog default to active window */
+    }
     if (cartridge_flush_image(CARTRIDGE_MMC64) < 0) {
-        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
-                                CARTRIDGE_NAME_MMC64 " Error",
+        vice_gtk3_message_error(GTK_WINDOW(parent),
+                                CARTNAME " Error",
                                 "Failed to flush image.");
     }
 }
@@ -177,11 +190,11 @@
 {
     GtkWidget *check;
 
-    check = gtk_check_button_new_with_label("Enable " CARTRIDGE_NAME_MMC64 " emulation");
+    check = gtk_check_button_new_with_label("Enable " CARTNAME " emulation");
 
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
                                  cartridge_type_enabled(CARTRIDGE_MMC64));
-    g_signal_connect(check,
+    g_signal_connect(G_OBJECT(check),
                      "toggled",
                      G_CALLBACK(on_enable_toggled),
                      NULL);
@@ -299,7 +312,7 @@
     /* header */
     label = gtk_label_new(NULL);
     gtk_label_set_markup(GTK_LABEL(label),
-                         "<b>" CARTRIDGE_NAME_MMC64 " SD/MMC Card</b>");
+                         "<b>" CARTNAME " SD/MMC Card</b>");
     gtk_widget_set_halign(label, GTK_ALIGN_START);
     gtk_widget_set_margin_top(label, 16);
     gtk_grid_attach(GTK_GRID(grid), label, 0, row, columns, 1);
@@ -310,7 +323,7 @@
     gtk_widget_set_halign(label, GTK_ALIGN_START);
     card_filename = vice_gtk3_resource_filechooser_new("MMC64Imagefilename",
                                                        GTK_FILE_CHOOSER_ACTION_OPEN);
-    title = "Select " CARTRIDGE_NAME_MMC64 " SD/MMC card image file";
+    title = "Select " CARTNAME " SD/MMC card image file";
     vice_gtk3_resource_filechooser_set_custom_title(card_filename, title);
     gtk_grid_attach(GTK_GRID(grid), label,         0, row, 1,           1);
     gtk_grid_attach(GTK_GRID(grid), card_filename, 1, row, columns - 1, 1);
@@ -369,7 +382,7 @@
     /* jumper switch and label */
     jumper_wrapper = gtk_grid_new();
     gtk_grid_set_column_spacing(GTK_GRID(jumper_wrapper), 16);
-    jumper_label   = gtk_label_new(CARTRIDGE_NAME_MMC64 " Flash jumper");
+    jumper_label   = gtk_label_new(CARTNAME " Flash jumper");
     jumper_widget  = create_mmc64_jumper_widget();
     gtk_widget_set_halign(jumper_label, GTK_ALIGN_END);
     gtk_widget_set_hexpand(jumper_label, TRUE);
@@ -394,7 +407,7 @@
     gtk_grid_attach(GTK_GRID(grid), clockport_widget, 1, row, 1, 1);
     row++;
 
-    revision_label   = gtk_label_new(CARTRIDGE_NAME_MMC64 " Revision");
+    revision_label   = gtk_label_new(CARTNAME " Revision");
     revision_widget  = create_mmc64_revision_widget();
     gtk_widget_set_halign(revision_label, GTK_ALIGN_START);
     gtk_widget_set_valign(revision_widget, GTK_ALIGN_START);
@@ -405,3 +418,5 @@
     gtk_widget_show_all(grid);
     return grid;
 }
+
+#undef CARTNAME
Modified: trunk/vice/src/arch/gtk3/widgets/settings_mmcr.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_mmcr.c	2024-04-12 08:28:42 UTC (rev 45108)
+++ trunk/vice/src/arch/gtk3/widgets/settings_mmcr.c	2024-04-12 11:44:39 UTC (rev 45109)
@@ -46,7 +46,10 @@
 
 #include "settings_mmcr.h"
 
+/** \brief  Temporary define to make editing easier */
+#define CARTNAME    CARTRIDGE_NAME_MMC_REPLAY
 
+
 /** \brief  List of memory card types
  */
 static const vice_gtk3_radiogroup_entry_t card_types[] = {
@@ -71,7 +74,7 @@
     if (filename != NULL) {
         if (cartridge_save_image(CARTRIDGE_MMC_REPLAY, filename) < 0) {
             vice_gtk3_message_error(GTK_WINDOW(dialog),
-                                    CARTRIDGE_NAME_MMC_REPLAY " Error",
+                                    CARTNAME " Error",
                                     "Failed to save image as '%s'",
                                     filename);
         }
@@ -89,7 +92,7 @@
 {
     GtkWidget *dialog;
 
-    dialog = vice_gtk3_save_file_dialog("Save " CARTRIDGE_NAME_MMC_REPLAY " image",
+    dialog = vice_gtk3_save_file_dialog("Save " CARTNAME " image",
                                         NULL, TRUE, NULL,
                                         save_filename_callback,
                                         NULL);
@@ -103,9 +106,14 @@
  */
 static void on_flush_clicked(GtkWidget *widget, gpointer user_data)
 {
+    GtkWidget *parent = gtk_widget_get_toplevel(widget);
+
+    if (!GTK_IS_WINDOW(parent)) {
+        parent = NULL;  /* make error dialog default to active window */
+    }
     if (cartridge_flush_image(CARTRIDGE_MMC_REPLAY) < 0) {
-        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
-                                CARTRIDGE_NAME_MMC_REPLAY "Error",
+        vice_gtk3_message_error(GTK_WINDOW(parent),
+                                CARTNAME "Error",
                                 "Failed to flush image.");
     }
 }
@@ -155,7 +163,7 @@
 
     label = gtk_label_new(NULL);
     gtk_label_set_markup(GTK_LABEL(label),
-                         "<b>" CARTRIDGE_NAME_MMC_REPLAY " EEPROM</b>");
+                         "<b>" CARTNAME " EEPROM</b>");
     gtk_widget_set_halign(label, GTK_ALIGN_START);
     gtk_widget_set_margin_top(label, 8);
     gtk_grid_attach(GTK_GRID(grid), label, 0, row, columns, 1);
@@ -164,7 +172,7 @@
     label  = gtk_label_new("Image file");
     eeprom = vice_gtk3_resource_filechooser_new("MMCREEPROMImage",
                                                 GTK_FILE_CHOOSER_ACTION_OPEN);
-    title  = "Select " CARTRIDGE_NAME_MMC_REPLAY " EEPROM image file";
+    title  = "Select " CARTNAME " EEPROM image file";
     vice_gtk3_resource_filechooser_set_custom_title(eeprom, title);
     gtk_widget_set_halign(label, GTK_ALIGN_START);
 
@@ -198,7 +206,7 @@
 
     label = gtk_label_new(NULL);
     gtk_label_set_markup(GTK_LABEL(label),
-                         "<b>" CARTRIDGE_NAME_MMC_REPLAY "SD/MMC Card</b>");
+                         "<b>" CARTNAME "SD/MMC Card</b>");
     gtk_widget_set_halign(label, GTK_ALIGN_START);
     gtk_widget_set_margin_top(label, 16);
     gtk_grid_attach(GTK_GRID(grid), label, 0, row, columns, 1);
@@ -207,7 +215,7 @@
     label = gtk_label_new("Image file");
     image = vice_gtk3_resource_filechooser_new("MMCRCardImage",
                                                GTK_FILE_CHOOSER_ACTION_OPEN);
-    title = "Select " CARTRIDGE_NAME_MMC_REPLAY " SD/MMC card image file";
+    title = "Select " CARTNAME " SD/MMC card image file";
     vice_gtk3_resource_filechooser_set_custom_title(image, title);
     gtk_widget_set_halign(label, GTK_ALIGN_START);
     gtk_grid_attach(GTK_GRID(grid), label, 0, row, 1,           1);
@@ -250,7 +258,7 @@
 
     label = gtk_label_new(NULL);
     gtk_label_set_markup(GTK_LABEL(label),
-                         "<b>" CARTRIDGE_NAME_MMC_REPLAY " Cartridge Image</b>");
+                         "<b>" CARTNAME " Cartridge Image</b>");
     gtk_widget_set_halign(label, GTK_ALIGN_START);
     gtk_widget_set_margin_top(label, 16);
     gtk_grid_attach(GTK_GRID(grid), label, 0, row, columns, 1);
@@ -324,3 +332,5 @@
     gtk_widget_show_all(grid);
     return grid;
 }
+
+#undef CARTNAME
Modified: trunk/vice/src/arch/gtk3/widgets/settings_petdww.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_petdww.c	2024-04-12 08:28:42 UTC (rev 45108)
+++ trunk/vice/src/arch/gtk3/widgets/settings_petdww.c	2024-04-12 11:44:39 UTC (rev 45109)
@@ -56,21 +56,26 @@
  */
 static void on_dww_toggled(GtkWidget *widget, gpointer user_data)
 {
-    gboolean active;
-    int      io_size = 0;
+    GtkWidget *parent;
+    gboolean   active;
+    int        io_size = 0;
 
     active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
     resources_get_int("IOSize", &io_size);
+    parent = gtk_widget_get_toplevel(widget);
+    if (!GTK_IS_WINDOW(widget)) {
+        parent = NULL;  /* default to current emulator window */
+    }
 
     /* only enable when I/O size is 2048 bytes */
     if (active && (io_size < 2048)) {
-        vice_gtk3_message_error(NULL, /* FIXME: need proper parent */
-                "Cannot enable DWW",
-                "To be able to use DWW, the I/O size of the machine "
-                " needs to be 2048 bytes."
-                " The current I/O size is %d bytes.\n\n"
-                "Use the model settings dialog to set I/O size",
-                io_size);
+        vice_gtk3_message_error(GTK_WINDOW(parent),
+                                "Cannot enable DWW",
+                                "To be able to use DWW, the I/O size of the machine "
+                                " needs to be 2048 bytes."
+                                " The current I/O size is %d bytes.\n\n"
+                                "Use the model settings dialog to set I/O size",
+                                io_size);
         active = FALSE;
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), FALSE);
     } else {
Modified: trunk/vice/src/arch/gtk3/widgets/settings_ramlink.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_ramlink.c	2024-04-12 08:28:42 UTC (rev 45108)
+++ trunk/vice/src/arch/gtk3/widgets/settings_ramlink.c	2024-04-12 11:44:39 UTC (rev 45109)
@@ -48,6 +48,10 @@
 #include "settings_ramlink.h"
 
 
+/** \brief  Temporary define to ease typing and copy/paste */
+#define CARTNAME    CARTRIDGE_NAME_RAMLINK
+
+
 /** \brief  RAMLINK modes
  */
 static const vice_gtk3_radiogroup_entry_t ramlink_modes[] = {
@@ -84,9 +88,15 @@
  */
 static void on_enable_toggled(GtkWidget *widget, gpointer data)
 {
-    gboolean state;
+    GtkWidget *parent;
+    gboolean  state;
 
-    state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+    state  = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+    parent = gtk_widget_get_toplevel(widget);
+    if (!GTK_IS_WINDOW(parent)) {
+        parent = NULL;  /* default to current emulator window */
+    }
+
     if (state) {
         const char *image = NULL;
 
@@ -93,9 +103,9 @@
         resources_get_string("RAMLINKBIOSfilename", &image);
         if (image == NULL || *image == '\0') {
             /* no image */
-            vice_gtk3_message_error(NULL, /* FIXME: need proper parent */
-                                    CARTRIDGE_NAME_RAMLINK " Error",
-                                    "Cannot enable " CARTRIDGE_NAME_RAMLINK ","
+            vice_gtk3_message_error(GTK_WINDOW(parent),
+                                    CARTNAME" Error",
+                                    "Cannot enable " CARTNAME ","
                                     " no BIOS image has been selected.");
             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), FALSE);
             state = FALSE;
@@ -105,11 +115,18 @@
     if (state) {
         if (cartridge_enable(CARTRIDGE_RAMLINK) < 0) {
             log_error(LOG_ERR, "failed to enable " CARTRIDGE_NAME_RAMLINK ".");
+            vice_gtk3_message_error(GTK_WINDOW(parent),
+                                    CARTNAME " Error",
+                                    "Failed to enable " CARTNAME ".");
             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), FALSE);
+
         }
     } else {
         if (cartridge_disable(CARTRIDGE_RAMLINK) < 0) {
             log_error(LOG_ERR, "failed to disable " CARTRIDGE_NAME_RAMLINK ".");
+            vice_gtk3_message_error(GTK_WINDOW(parent),
+                                    CARTNAME " Error",
+                                    "Failed to disable " CARTNAME ".");
         }
     }
 }
@@ -231,3 +248,5 @@
     gtk_widget_show_all(grid);
     return grid;
 }
+
+#undef CARTNAME
Modified: trunk/vice/src/arch/gtk3/widgets/settings_retroreplay.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_retroreplay.c	2024-04-12 08:28:42 UTC (rev 45108)
+++ trunk/vice/src/arch/gtk3/widgets/settings_retroreplay.c	2024-04-12 11:44:39 UTC (rev 45109)
@@ -47,6 +47,10 @@
 #include "settings_retroreplay.h"
 
 
+/** \brief  Temporary define to ease typing and copy/paste */
+#define CARTNAME    CARTRIDGE_NAME_RETRO_REPLAY
+
+
 /** \brief  List of Retro Replay revisions
  */
 static const vice_gtk3_combo_entry_int_t rr_revisions[] = {
@@ -69,7 +73,7 @@
     if (filename != NULL) {
         if (cartridge_save_image(CARTRIDGE_RETRO_REPLAY, filename) < 0) {
             vice_gtk3_message_error(GTK_WINDOW(dialog),
-                                    CARTRIDGE_NAME_RETRO_REPLAY " Error",
+                                    CARTNAME " Error",
                                     "Failed to save image as '%s'.",
                                     filename);
         }
@@ -87,7 +91,7 @@
 {
     GtkWidget *dialog;
 
-    dialog = vice_gtk3_save_file_dialog("Save " CARTRIDGE_NAME_RETRO_REPLAY
+    dialog = vice_gtk3_save_file_dialog("Save " CARTNAME
                                         " image as",
                                         NULL,
                                         TRUE,
@@ -106,8 +110,14 @@
 static void on_flush_clicked(GtkWidget *widget, gpointer user_data)
 {
     if (cartridge_flush_image(CARTRIDGE_RETRO_REPLAY) < 0) {
-        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
-                                CARTRIDGE_NAME_RETRO_REPLAY " Error",
+        GtkWidget *parent;
+
+        parent = gtk_widget_get_toplevel(widget);
+        if (!GTK_IS_WINDOW(widget)) {
+            parent = NULL;  /* default to current emulator window */
+        }
+        vice_gtk3_message_error(GTK_WINDOW(parent),
+                                CARTNAME " Error",
                                 "Failed to flush current image.");
     }
 }
@@ -200,8 +210,7 @@
 
     /* RRBiosWrite */
     bios_write = vice_gtk3_resource_check_button_new("RRBiosWrite",
-            "Write back " CARTRIDGE_NAME_RETRO_REPLAY " Flash ROM image"
-            " automatically");
+            "Write back " CARTNAME " Flash ROM image automatically");
     gtk_widget_set_valign(bios_write, GTK_ALIGN_START);
     gtk_grid_attach(GTK_GRID(grid), bios_write, 0, 4, 3, 1);
 
@@ -232,3 +241,5 @@
     gtk_widget_show_all(grid);
     return grid;
 }
+
+#undef CARTNAME
Modified: trunk/vice/src/arch/gtk3/widgets/settings_rrnetmk3.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_rrnetmk3.c	2024-04-12 08:28:42 UTC (rev 45108)
+++ trunk/vice/src/arch/gtk3/widgets/settings_rrnetmk3.c	2024-04-12 11:44:39 UTC (rev 45109)
@@ -84,7 +84,7 @@
 static void on_flush_clicked(GtkWidget *widget, gpointer user_data)
 {
     if (cartridge_flush_image(CARTRIDGE_RRNETMK3) < 0) {
-        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
+        vice_gtk3_message_error(GTK_WINDOW(gtk_widget_get_toplevel(widget)),
                                 CARTRIDGE_NAME_RRNETMK3 " Error",
                                 "Failed to flush image.");
     }
Modified: trunk/vice/src/arch/gtk3/widgets/vsidplaylistwidget.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/vsidplaylistwidget.c	2024-04-12 08:28:42 UTC (rev 45108)
+++ trunk/vice/src/arch/gtk3/widgets/vsidplaylistwidget.c	2024-04-12 11:44:39 UTC (rev 45109)
@@ -1217,7 +1217,7 @@
 
     /* Attempt to parse sid header for title & composer */
     if (!hvsc_psid_open(path, &psid)) {
-        vice_gtk3_message_error(NULL,   /* FIXME: might need proper parent */
+        vice_gtk3_message_error(NULL,   /* use VSID window as parent */
                                 "VSID",
                                 "Failed to parse PSID header of '%s'.",
                                 path);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <co...@us...> - 2024-04-12 08:28:44
      
     | 
| Revision: 45108
          http://sourceforge.net/p/vice-emu/code/45108
Author:   compyx
Date:     2024-04-12 08:28:42 +0000 (Fri, 12 Apr 2024)
Log Message:
-----------
Gtk3: replace `ui_error()` calls with `vice_gtk3_message_error()` calls
Also provide proper parentage for the dialogs.
Modified Paths:
--------------
    trunk/vice/src/arch/gtk3/widgets/settings_rom.c
    trunk/vice/src/arch/gtk3/widgets/vsidplaylistwidget.c
Modified: trunk/vice/src/arch/gtk3/widgets/settings_rom.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_rom.c	2024-04-12 08:23:19 UTC (rev 45107)
+++ trunk/vice/src/arch/gtk3/widgets/settings_rom.c	2024-04-12 08:28:42 UTC (rev 45108)
@@ -300,7 +300,10 @@
         lastdir_update(GTK_WIDGET(dialog), &last_directory, &last_filename);
 
         if (romset_file_load(filename) != 0) {
-            ui_error("Failed to load ROM set file %s.", filename);
+            vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                    "VICE error",
+                                    "Failed to load ROM set file %s.",
+                                    filename);
         }
         /* ROM set loading is not atomic, it can fail after having already
          * set one or more resources, so we need to sync unconditionally */
@@ -347,7 +350,10 @@
         const char **roms = get_all_resource_names();
 
         if (romset_file_save(filename, roms) != 0) {
-            ui_error("Failed to save ROM set file %s.", filename);
+            vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                    "VICE error",
+                                    "Failed to save ROM set file %s.",
+                                    filename);
         }
         lib_free(roms);
         g_free(filename);
Modified: trunk/vice/src/arch/gtk3/widgets/vsidplaylistwidget.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/vsidplaylistwidget.c	2024-04-12 08:23:19 UTC (rev 45107)
+++ trunk/vice/src/arch/gtk3/widgets/vsidplaylistwidget.c	2024-04-12 08:28:42 UTC (rev 45108)
@@ -506,8 +506,8 @@
  * \param[in]   data        extra event data (ignored)
  */
 static void playlist_save_dialog_callback(GtkDialog *dialog,
-                                          gchar *filename,
-                                          gpointer data)
+                                          gchar     *filename,
+                                          gpointer   data)
 {
     if (filename != NULL) {
         GtkTreeIter iter;
@@ -534,7 +534,10 @@
 
         /* try to open playlist file for writing */
         if (!m3u_create(filename_ext)) {
-            ui_error("Failed to open '%s' for writing.", filename_ext);
+            vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                    "VICE error",
+                                    "Failed to open '%s' for writing.",
+                                    filename_ext);
             lib_free(filename_ext);
             gtk_widget_destroy(GTK_WIDGET(dialog));
             return;
@@ -610,7 +613,9 @@
     return;
 
 save_error:
-    ui_error("I/O error while writing playlist.");
+    vice_gtk3_message_error(GTK_WINDOW(dialog),
+                            "VICE error",
+                            "I/O error while writing playlist.");
     m3u_close();
     gtk_widget_destroy(GTK_WIDGET(dialog));
     ui_action_finish(ACTION_PSID_PLAYLIST_SAVE);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <co...@us...> - 2024-04-12 08:23:26
      
     | 
| Revision: 45107
          http://sourceforge.net/p/vice-emu/code/45107
Author:   compyx
Date:     2024-04-12 08:23:19 +0000 (Fri, 12 Apr 2024)
Log Message:
-----------
Remove some commented out code
Modified Paths:
--------------
    trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c
Modified: trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c	2024-04-11 14:02:06 UTC (rev 45106)
+++ trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c	2024-04-12 08:23:19 UTC (rev 45107)
@@ -206,6 +206,12 @@
 #endif
 
 
+/** \brief  Create left-aligned label using Pango markup
+ *
+ * \param[in]   text    text using Pango markup
+ *
+ * \return  GtkLabel
+ */
 static GtkWidget *label_helper(const char *text)
 {
     GtkWidget *label = gtk_label_new(NULL);
@@ -215,7 +221,6 @@
     return label;
 }
 
-
 /** \brief  Clear all hotkeys and update the view
  */
 static void clear_all_hotkeys(void)
@@ -233,7 +238,6 @@
     }
 }
 
-
 /** \brief  Update hotkeys path and source widgets */
 static void update_hotkeys_info(void)
 {
@@ -261,88 +265,6 @@
 }
 
 
-/* Will be replaced with UI actions */
-#if 0
-/** \brief  Callback for the 'Export' button
- *
- * Save current hotkeys to \a filename and close \a dialog.
- *
- * \param[in]   dialog      Save dialog
- * \param[in]   filename    filename (`NULL` == cancel)
- * \param[in]   data        extra data (unused)
- */
-static void export_callback(GtkDialog *dialog, gchar *filename, gpointer data)
-{
-    if (filename != NULL) {
-        if (ui_hotkeys_export(filename)) {
-            debug_gtk3("OK, '%s' was written succesfully.", filename);
-        } else {
-            ui_error("Failed to write '%s' to filesystem.", filename);
-        }
-    } else {
-        debug_gtk3("Canceled.");
-    }
-    gtk_widget_destroy(GTK_WIDGET(dialog));
-}
-
-
-/** \brief  Handler for the 'clicked' event of the export button
- *
- * \param[in]   button  widget triggering the event
- * \param[in]   data    extra event data (unused)
- */
-static void on_export_clicked(GtkWidget *button, gpointer data)
-{
-    GtkWidget *dialog;
-    const char *path = NULL;
-    char *fname = NULL;
-    char *dname = NULL;
-
-    /* split path into basename and directory component */
-    if ((resources_get_string("HotkeyFile", &path)) == 0 && path != NULL) {
-        util_fname_split(path, &dname, &fname);
-    }
-
-    dialog = vice_gtk3_save_file_dialog("Save current hotkeys to file",
-                                        fname,
-                                        TRUE,
-                                        dname,
-                                        export_callback,
-                                        NULL);
-    gtk_widget_show(dialog);
-
-    /* clean up */
-    if (fname != NULL) {
-        lib_free(fname);
-    }
-    if (dname != NULL) {
-        lib_free(dname);
-    }
-}
-
-
-/** \brief  Create widget to select the user-defined hotkeys file
- *
- * \return  GtkGrid
- */
-static GtkWidget *create_browse_widget(void)
-{
-    GtkWidget *widget;
-    const char * const patterns[] = { "*.vhk", NULL };
-
-    widget = vice_gtk3_resource_browser_new("HotkeyFile",
-                                            patterns,
-                                            "VICE hotkeys",
-                                            "Select VICE hotkeys file",
-                                            "Custom hotkeys file:",
-                                            NULL);
-    return widget;
-}
-#endif
-
-
-
-
 /** \brief  Create model for the hotkeys table
  *
  * \return  new list store
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <old...@us...> - 2024-04-11 14:02:08
      
     | 
| Revision: 45106
          http://sourceforge.net/p/vice-emu/code/45106
Author:   oldwoman37
Date:     2024-04-11 14:02:06 +0000 (Thu, 11 Apr 2024)
Log Message:
-----------
More changes for bug #1979: Corrected more z80 timing issues
Modified Paths:
--------------
    trunk/vice/src/z80core.c
Modified: trunk/vice/src/z80core.c
===================================================================
--- trunk/vice/src/z80core.c	2024-04-10 05:55:02 UTC (rev 45105)
+++ trunk/vice/src/z80core.c	2024-04-11 14:02:06 UTC (rev 45106)
@@ -682,7 +682,7 @@
         reg_f = N_FLAG | SZP[tmp] | LOCAL_CARRY();         \
         LOCAL_SET_HALFCARRY((reg_a ^ val ^ tmp) & H_FLAG); \
         LOCAL_SET_PARITY(reg_b | reg_c);                   \
-        CLK_ADD(CLK, 1);                                   \
+        CLK_ADD(CLK, 12);                                  \
         INC_PC(2);                                         \
     } while (0)
 
@@ -695,13 +695,14 @@
         tmp = reg_a - val;                                     \
         HL_FUNC;                                               \
         DEC_BC_WORD();                                         \
-        CLK_ADD(CLK, 17);                                      \
+        CLK_ADD(CLK, 12);                                      \
         if (!(BC_WORD() && tmp)) {                             \
             reg_f = N_FLAG | SZP[tmp] | LOCAL_CARRY();         \
             LOCAL_SET_HALFCARRY((reg_a ^ val ^ tmp) & H_FLAG); \
             LOCAL_SET_PARITY(reg_b | reg_c);                   \
+            INC_PC(2);                                         \
+        } else {                                               \
             CLK_ADD(CLK, 5);                                   \
-            INC_PC(2);                                         \
         }                                                      \
     } while (0)
 
@@ -1167,6 +1168,7 @@
         reg_f = N_FLAG;         \
         LOCAL_SET_ZERO(!reg_b); \
         CLK_ADD(CLK, 4);        \
+        CLK_ADD(CLK, 4);        \
         INC_PC(2);              \
     } while (0)
 
@@ -1181,13 +1183,13 @@
         OUT(BC_WORD(), tmp);         \
         HL_FUNC;                     \
         if (!reg_b) {                \
-            CLK_ADD(CLK, 4);         \
             reg_f = N_FLAG | Z_FLAG; \
             INC_PC(2);               \
         } else {                     \
             reg_f = N_FLAG;          \
+            CLK_ADD(CLK, 5);         \
         }                            \
-        CLK_ADD(CLK, 4);             \
+        CLK_ADD(CLK, 8);             \
     } while (0)
 
 #define POP(reg_valh, reg_vall, pc_inc) \
@@ -3404,13 +3406,13 @@
             DECINC(INC_IX_WORD(), 10, 2);
             break;
         case 0x24: /* INC IXH */
-            INCREG(reg_ixh, 7, 2);
+            INCREG(reg_ixh, 8, 2);
             break;
         case 0x25: /* DEC IXH */
-            DECREG(reg_ixh, 7, 2);
+            DECREG(reg_ixh, 8, 2);
             break;
         case 0x26: /* LD IXH # */
-            LDREG(reg_ixh, ip2, 4, 5, 3);
+            LDREG(reg_ixh, ip2, 4, 7, 3);
             break;
         case 0x27: /* DAA */
             DAA(8, 2);
@@ -3428,13 +3430,13 @@
             DECINC(DEC_IX_WORD(), 10, 2);
             break;
         case 0x2c: /* INC IXL */
-            INCREG(reg_ixl, 7, 2);
+            INCREG(reg_ixl, 8, 2);
             break;
         case 0x2d: /* DEC IXL */
-            DECREG(reg_ixl, 7, 2);
+            DECREG(reg_ixl, 8, 2);
             break;
         case 0x2e: /* LD IXL # */
-            LDREG(reg_ixl, ip2, 4, 5, 3);
+            LDREG(reg_ixl, ip2, 4, 7, 3);
             break;
         case 0x2f: /* CPL */
             CPL(8, 2);
@@ -3500,10 +3502,10 @@
             LDREG(reg_b, reg_e, 0, 4, 2);
             break;
         case 0x44: /* LD B IXH */
-            LDREG(reg_b, reg_ixh, 0, 4, 2);
+            LDREG(reg_b, reg_ixh, 0, 8, 2);
             break;
         case 0x45: /* LD B IXL */
-            LDREG(reg_b, reg_ixl, 0, 4, 2);
+            LDREG(reg_b, reg_ixl, 0, 8, 2);
             break;
         case 0x46: /* LD B (IX+d) */
             LDREG(reg_b, LOAD(IX_WORD_OFF(ip2)), 8, 11, 3);
@@ -3524,10 +3526,10 @@
             LDREG(reg_c, reg_e, 0, 4, 2);
             break;
         case 0x4c: /* LD C IXH */
-            LDREG(reg_c, reg_ixh, 0, 4, 2);
+            LDREG(reg_c, reg_ixh, 0, 8, 2);
             break;
         case 0x4d: /* LD C IXL */
-            LDREG(reg_c, reg_ixl, 0, 4, 2);
+            LDREG(reg_c, reg_ixl, 0, 8, 2);
             break;
         case 0x4e: /* LD C (IX+d) */
             LDREG(reg_c, LOAD(IX_WORD_OFF(ip2)), 8, 11, 3);
@@ -3548,10 +3550,10 @@
             LDREG(reg_d, reg_e, 0, 4, 2);
             break;
         case 0x54: /* LD D IXH */
-            LDREG(reg_d, reg_ixh, 0, 4, 2);
+            LDREG(reg_d, reg_ixh, 0, 8, 2);
             break;
         case 0x55: /* LD D L */
-            LDREG(reg_d, reg_ixl, 0, 4, 2);
+            LDREG(reg_d, reg_ixl, 0, 8, 2);
             break;
         case 0x56: /* LD D (IX+d) */
             LDREG(reg_d, LOAD(IX_WORD_OFF(ip2)), 8, 11, 3);
@@ -3572,10 +3574,10 @@
             LDREG(reg_e, reg_e, 0, 4, 2);
             break;
         case 0x5c: /* LD E IXH */
-            LDREG(reg_e, reg_ixh, 0, 4, 2);
+            LDREG(reg_e, reg_ixh, 0, 8, 2);
             break;
         case 0x5d: /* LD E IXL */
-            LDREG(reg_e, reg_ixl, 0, 4, 2);
+            LDREG(reg_e, reg_ixl, 0, 8, 2);
             break;
         case 0x5e: /* LD E (IX+d) */
             LDREG(reg_e, LOAD(IX_WORD_OFF(ip2)), 8, 11, 3);
@@ -3584,52 +3586,52 @@
             LDREG(reg_e, reg_a, 0, 4, 2);
             break;
         case 0x60: /* LD IXH B */
-            LDREG(reg_ixh, reg_b, 0, 4, 2);
+            LDREG(reg_ixh, reg_b, 0, 8, 2);
             break;
         case 0x61: /* LD IXH C */
-            LDREG(reg_ixh, reg_c, 0, 4, 2);
+            LDREG(reg_ixh, reg_c, 0, 8, 2);
             break;
         case 0x62: /* LD IXH D */
-            LDREG(reg_ixh, reg_d, 0, 4, 2);
+            LDREG(reg_ixh, reg_d, 0, 8, 2);
             break;
         case 0x63: /* LD IXH E */
-            LDREG(reg_ixh, reg_e, 0, 4, 2);
+            LDREG(reg_ixh, reg_e, 0, 8, 2);
             break;
         case 0x64: /* LD IXH IXH */
-            LDREG(reg_ixh, reg_ixh, 0, 4, 2);
+            LDREG(reg_ixh, reg_ixh, 0, 8, 2);
             break;
         case 0x65: /* LD IXH IXL */
-            LDREG(reg_ixh, reg_ixl, 0, 4, 2);
+            LDREG(reg_ixh, reg_ixl, 0, 8, 2);
             break;
         case 0x66: /* LD H (IX+d) */
             LDREG(reg_h, LOAD(IX_WORD_OFF(ip2)), 8, 11, 3);
             break;
         case 0x67: /* LD IXH A */
-            LDREG(reg_ixh, reg_a, 0, 4, 2);
+            LDREG(reg_ixh, reg_a, 0, 8, 2);
             break;
         case 0x68: /* LD IXL B */
-            LDREG(reg_ixl, reg_b, 0, 4, 2);
+            LDREG(reg_ixl, reg_b, 0, 8, 2);
             break;
         case 0x69: /* LD IXL C */
-            LDREG(reg_ixl, reg_c, 0, 4, 2);
+            LDREG(reg_ixl, reg_c, 0, 8, 2);
             break;
         case 0x6a: /* LD IXL D */
-            LDREG(reg_ixl, reg_d, 0, 4, 2);
+            LDREG(reg_ixl, reg_d, 0, 8, 2);
             break;
         case 0x6b: /* LD IXL E */
-            LDREG(reg_ixl, reg_e, 0, 4, 2);
+            LDREG(reg_ixl, reg_e, 0, 8, 2);
             break;
         case 0x6c: /* LD IXL IXH */
-            LDREG(reg_ixl, reg_ixh, 0, 4, 2);
+            LDREG(reg_ixl, reg_ixh, 0, 8, 2);
             break;
         case 0x6d: /* LD IXL IXL */
-            LDREG(reg_ixl, reg_ixl, 0, 4, 2);
+            LDREG(reg_ixl, reg_ixl, 0, 8, 2);
             break;
         case 0x6e: /* LD L (IX+d) */
             LDREG(reg_l, LOAD(IX_WORD_OFF(ip2)), 8, 11, 3);
             break;
         case 0x6f: /* LD IXL A */
-            LDREG(reg_ixl, reg_a, 0, 4, 2);
+            LDREG(reg_ixl, reg_a, 0, 8, 2);
             break;
         case 0x70: /* LD (IX+d) B */
             STREG(IX_WORD_OFF(ip2), reg_b, 8, 11, 3);
@@ -3960,6 +3962,13 @@
             STW(ip23, reg_b, reg_c, 4, 13, 3, 4);
             break;
         case 0x44: /* NEG */
+        case 0x4c: /* undoc NEG */
+        case 0x54: /* undoc NEG */
+        case 0x5c: /* undoc NEG */
+        case 0x64: /* undoc NEG */
+        case 0x6c: /* undoc NEG */
+        case 0x74: /* undoc NEG */
+        case 0x7c: /* undoc NEG */
             NEG();
             break;
         case 0x45: /* RETN */
@@ -3972,6 +3981,9 @@
             RETNI();
             break;
         case 0x46: /* IM0 */
+        case 0x4e: /* undoc IM0 */
+        case 0x66: /* undoc IM0 */
+        case 0x6e: /* undoc IM0 */
             IM(0);
             break;
         case 0x47: /* LD I A */
@@ -3993,7 +4005,7 @@
             RETNI();
             break;
         case 0x4f: /* LD R A FIXME: Not emulated.  */
-            NOP(8, 2);
+            NOP(9, 2);
             break;
         case 0x50: /* IN D BC */
             INBC(reg_d, 10, 2, 2);
@@ -4008,6 +4020,7 @@
             STW(ip23, reg_d, reg_e, 4, 13, 3, 4);
             break;
         case 0x56: /* IM1 */
+        case 0x76: /* undoc IM1 */
             IM(1);
             break;
         case 0x57: /* LD A I */
@@ -4026,6 +4039,7 @@
             LDIND(ip23, reg_d, reg_e, 4, 4, 12, 4);
             break;
         case 0x5e: /* IM2 */
+        case 0x7e: /* undoc IM2 */
             IM(2);
             break;
         case 0x5f: /* LD A R */
@@ -4143,6 +4157,8 @@
             NOP(8, 2);
             break;
         case 0xfd: /* NOP */
+        case 0x77: /* undoc NOP */
+        case 0x7f: /* undoc NOP */
             NOP(8, 2);
             break;
         default:
@@ -4928,13 +4944,13 @@
             DECINC(INC_IY_WORD(), 10, 2);
             break;
         case 0x24: /* INC IYH */
-            INCREG(reg_iyh, 7, 2);
+            INCREG(reg_iyh, 8, 2);
             break;
         case 0x25: /* DEC IYH */
-            DECREG(reg_iyh, 7, 2);
+            DECREG(reg_iyh, 8, 2);
             break;
         case 0x26: /* LD IYH # */
-            LDREG(reg_iyh, ip2, 4, 5, 3);
+            LDREG(reg_iyh, ip2, 4, 7, 3);
             break;
         case 0x27: /* DAA */
             DAA(8, 2);
@@ -4952,13 +4968,13 @@
             DECINC(DEC_IY_WORD(), 10, 2);
             break;
         case 0x2c: /* INC IYL */
-            INCREG(reg_iyl, 7, 2);
+            INCREG(reg_iyl, 8, 2);
             break;
         case 0x2d: /* DEC IYL */
-            DECREG(reg_iyl, 7, 2);
+            DECREG(reg_iyl, 8, 2);
             break;
         case 0x2e: /* LD IYL # */
-            LDREG(reg_iyl, ip2, 4, 5, 3);
+            LDREG(reg_iyl, ip2, 4, 7, 3);
             break;
         case 0x2f: /* CPL */
             CPL(8, 2);
@@ -5024,10 +5040,10 @@
             LDREG(reg_b, reg_e, 0, 4, 2);
             break;
         case 0x44: /* LD B IYH */
-            LDREG(reg_b, reg_iyh, 0, 4, 2);
+            LDREG(reg_b, reg_iyh, 0, 8, 2);
             break;
         case 0x45: /* LD B IYL */
-            LDREG(reg_b, reg_iyl, 0, 4, 2);
+            LDREG(reg_b, reg_iyl, 0, 8, 2);
             break;
         case 0x46: /* LD B (IY+d) */
             LDREG(reg_b, LOAD(IY_WORD_OFF(ip2)), 8, 11, 3);
@@ -5048,10 +5064,10 @@
             LDREG(reg_c, reg_e, 0, 4, 2);
             break;
         case 0x4c: /* LD C IYH */
-            LDREG(reg_c, reg_iyh, 0, 4, 2);
+            LDREG(reg_c, reg_iyh, 0, 8, 2);
             break;
         case 0x4d: /* LD C IYL */
-            LDREG(reg_c, reg_iyl, 0, 4, 2);
+            LDREG(reg_c, reg_iyl, 0, 8, 2);
             break;
         case 0x4e: /* LD C (IY+d) */
             LDREG(reg_c, LOAD(IY_WORD_OFF(ip2)), 8, 11, 3);
@@ -5072,10 +5088,10 @@
             LDREG(reg_d, reg_e, 0, 4, 2);
             break;
         case 0x54: /* LD D IYH */
-            LDREG(reg_d, reg_iyh, 0, 4, 2);
+            LDREG(reg_d, reg_iyh, 0, 8, 2);
             break;
         case 0x55: /* LD D IYL */
-            LDREG(reg_d, reg_iyl, 0, 4, 2);
+            LDREG(reg_d, reg_iyl, 0, 8, 2);
             break;
         case 0x56: /* LD D (IY+d) */
             LDREG(reg_d, LOAD(IY_WORD_OFF(ip2)), 8, 11, 3);
@@ -5096,10 +5112,10 @@
             LDREG(reg_e, reg_e, 0, 4, 2);
             break;
         case 0x5c: /* LD E IYH */
-            LDREG(reg_e, reg_iyh, 0, 4, 2);
+            LDREG(reg_e, reg_iyh, 0, 8, 2);
             break;
         case 0x5d: /* LD E IYL */
-            LDREG(reg_e, reg_iyl, 0, 4, 2);
+            LDREG(reg_e, reg_iyl, 0, 8, 2);
             break;
         case 0x5e: /* LD E (IY+d) */
             LDREG(reg_e, LOAD(IY_WORD_OFF(ip2)), 8, 11, 3);
@@ -5108,52 +5124,52 @@
             LDREG(reg_e, reg_a, 0, 4, 2);
             break;
         case 0x60: /* LD IYH B */
-            LDREG(reg_iyh, reg_b, 0, 4, 2);
+            LDREG(reg_iyh, reg_b, 0, 8, 2);
             break;
         case 0x61: /* LD IYH C */
-            LDREG(reg_iyh, reg_c, 0, 4, 2);
+            LDREG(reg_iyh, reg_c, 0, 8, 2);
             break;
         case 0x62: /* LD IYH D */
-            LDREG(reg_iyh, reg_d, 0, 4, 2);
+            LDREG(reg_iyh, reg_d, 0, 8, 2);
             break;
         case 0x63: /* LD IYH E */
-            LDREG(reg_iyh, reg_e, 0, 4, 2);
+            LDREG(reg_iyh, reg_e, 0, 8, 2);
             break;
         case 0x64: /* LD IYH IYH */
-            LDREG(reg_iyh, reg_iyh, 0, 4, 2);
+            LDREG(reg_iyh, reg_iyh, 0, 8, 2);
             break;
         case 0x65: /* LD IYH IYL */
-            LDREG(reg_iyh, reg_iyl, 0, 4, 2);
+            LDREG(reg_iyh, reg_iyl, 0, 8, 2);
             break;
         case 0x66: /* LD H (IY+d) */
             LDREG(reg_h, LOAD(IY_WORD_OFF(ip2)), 8, 11, 3);
             break;
         case 0x67: /* LD IYH A */
-            LDREG(reg_iyh, reg_a, 0, 4, 2);
+            LDREG(reg_iyh, reg_a, 0, 8, 2);
             break;
         case 0x68: /* LD IYL B */
-            LDREG(reg_iyl, reg_b, 0, 4, 2);
+            LDREG(reg_iyl, reg_b, 0, 8, 2);
             break;
         case 0x69: /* LD IYL C */
-            LDREG(reg_iyl, reg_c, 0, 4, 2);
+            LDREG(reg_iyl, reg_c, 0, 8, 2);
             break;
         case 0x6a: /* LD IYL D */
-            LDREG(reg_iyl, reg_d, 0, 4, 2);
+            LDREG(reg_iyl, reg_d, 0, 8, 2);
             break;
         case 0x6b: /* LD IYL E */
-            LDREG(reg_iyl, reg_e, 0, 4, 2);
+            LDREG(reg_iyl, reg_e, 0, 8, 2);
             break;
         case 0x6c: /* LD IYL IYH */
-            LDREG(reg_iyl, reg_iyh, 0, 4, 2);
+            LDREG(reg_iyl, reg_iyh, 0, 8, 2);
             break;
         case 0x6d: /* LD IYL IYL */
-            LDREG(reg_iyl, reg_iyl, 0, 4, 2);
+            LDREG(reg_iyl, reg_iyl, 0, 8, 2);
             break;
         case 0x6e: /* LD L (IY+d) */
             LDREG(reg_l, LOAD(IY_WORD_OFF(ip2)), 8, 11, 3);
             break;
         case 0x6f: /* LD IYL A */
-            LDREG(reg_iyl, reg_a, 0, 4, 2);
+            LDREG(reg_iyl, reg_a, 0, 8, 2);
             break;
         case 0x70: /* LD (IY+d) B */
             STREG(IY_WORD_OFF(ip2), reg_b, 8, 11, 3);
@@ -5548,7 +5564,7 @@
                 RLCA(4, 1);
                 break;
             case 0x08: /* EX AF AF' */
-                EXAFAF(8, 1);
+                EXAFAF(4, 1);
                 break;
             case 0x09: /* ADD HL BC */
                 ADDXXREG(reg_h, reg_l, reg_b, reg_c, 11, 1);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <co...@us...> - 2024-04-10 05:55:04
      
     | 
| Revision: 45105
          http://sourceforge.net/p/vice-emu/code/45105
Author:   compyx
Date:     2024-04-10 05:55:02 +0000 (Wed, 10 Apr 2024)
Log Message:
-----------
Pulverize trailing whitespace
Modified Paths:
--------------
    trunk/vice/src/arch/gtk3/uismartattach.c
Modified: trunk/vice/src/arch/gtk3/uismartattach.c
===================================================================
--- trunk/vice/src/arch/gtk3/uismartattach.c	2024-04-09 20:42:40 UTC (rev 45104)
+++ trunk/vice/src/arch/gtk3/uismartattach.c	2024-04-10 05:55:02 UTC (rev 45105)
@@ -363,7 +363,7 @@
  * \param[in]   widget      the dialog
  * \param[in]   response_id response ID
  * \param[in]   user_data   unit number
- 
+ *
  * TODO:    proper (error) messages
  */
 static void on_response(GtkWidget *widget, gint response_id, gpointer user_data)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <co...@us...> - 2024-04-09 20:42:44
      
     | 
| Revision: 45104
          http://sourceforge.net/p/vice-emu/code/45104
Author:   compyx
Date:     2024-04-09 20:42:40 +0000 (Tue, 09 Apr 2024)
Log Message:
-----------
Gtk3: ensure proper parentage of some error dialogs
Fix parentage of error message dialogs in `src/arch/gtk/*.c` where possible,
also replace `ui_error()` calls with `vice_gtk3_message_error()` (the former
calls the latter with extra overhead not required when already running on the
UI thread).
Modified Paths:
--------------
    trunk/vice/src/arch/gtk3/actions-settings.c
    trunk/vice/src/arch/gtk3/ui.c
    trunk/vice/src/arch/gtk3/uidiskattach.c
    trunk/vice/src/arch/gtk3/uidiskcreate.c
    trunk/vice/src/arch/gtk3/uimedia.c
    trunk/vice/src/arch/gtk3/uisidattach.c
    trunk/vice/src/arch/gtk3/uismartattach.c
    trunk/vice/src/arch/gtk3/uitapeattach.c
    trunk/vice/src/arch/gtk3/uitapecreate.c
    trunk/vice/src/arch/gtk3/uivsidwindow.c
Modified: trunk/vice/src/arch/gtk3/actions-settings.c
===================================================================
--- trunk/vice/src/arch/gtk3/actions-settings.c	2024-04-09 19:40:08 UTC (rev 45103)
+++ trunk/vice/src/arch/gtk3/actions-settings.c	2024-04-09 20:42:40 UTC (rev 45104)
@@ -131,7 +131,7 @@
     result = resources_reset_and_load(NULL);
     mainlock_release();
     if (result != 0) {
-        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent? */
+        vice_gtk3_message_error(NULL, /* current emu window as parent */
                                 "VICE core error",
                                 "Failed to load default settings file");
     } else {
@@ -216,7 +216,7 @@
     result = resources_save(NULL);
     mainlock_release();
     if (result != 0) {
-        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
+        vice_gtk3_message_error(NULL, /* current emu window as parent */
                                 "VICE core error",
                                 "Failed to save default settings file");
     }
Modified: trunk/vice/src/arch/gtk3/ui.c
===================================================================
--- trunk/vice/src/arch/gtk3/ui.c	2024-04-09 19:40:08 UTC (rev 45103)
+++ trunk/vice/src/arch/gtk3/ui.c	2024-04-09 20:42:40 UTC (rev 45104)
@@ -2506,21 +2506,16 @@
 
 /** \brief  Error dialog handler for the threaded UI
  *
- * \param[in]   user_data   error message
+ * \param[in]   user_data   error message (allocated by VICE)
  *
- * \return  FALSE
+ * \return  \c G_SOURCE_REMOVE to only run once
  */
 static gboolean ui_error_impl(gpointer user_data)
 {
-    char *buffer = (char *)user_data;
-    GtkWidget *dialog;
-
-    dialog = vice_gtk3_message_error(NULL, "VICE Error", "%s", buffer);
-    gtk_dialog_run(GTK_DIALOG(dialog));
-
-    lib_free(buffer);
-
-    return FALSE;
+    vice_gtk3_message_error(NULL, /* current emu window as parent */
+                            "VICE Error", "%s", (const char*)user_data);
+    lib_free(user_data);
+    return G_SOURCE_REMOVE;
 }
 
 
@@ -2550,15 +2545,9 @@
  */
 static gboolean ui_message_impl(gpointer user_data)
 {
-    char *buffer = (char *)user_data;
-    GtkWidget *dialog;
-
-    dialog = vice_gtk3_message_info("VICE Message", "%s", buffer);
-    gtk_dialog_run(GTK_DIALOG(dialog));
-
-    lib_free(buffer);
-
-    return FALSE;
+    vice_gtk3_message_info("VICE Message", "%s", (const char *)user_data);
+    lib_free(user_data);
+    return G_SOURCE_REMOVE;
 }
 
 
Modified: trunk/vice/src/arch/gtk3/uidiskattach.c
===================================================================
--- trunk/vice/src/arch/gtk3/uidiskattach.c	2024-04-09 19:40:08 UTC (rev 45103)
+++ trunk/vice/src/arch/gtk3/uidiskattach.c	2024-04-09 20:42:40 UTC (rev 45104)
@@ -223,7 +223,10 @@
                 autostart ? AUTOSTART_MODE_RUN : AUTOSTART_MODE_LOAD) < 0) {
         /* oeps */
         log_error(LOG_ERR, "autostart disk attach failed.");
-        ui_error("Autostart disk attach failed.");
+        vice_gtk3_message_error(GTK_WINDOW(widget),
+                                "Autostart failure",
+                                "Autostarting disk image '%s' failed.",
+                                filename);
     }
     g_free(filename);
     g_free(filename_locale);
Modified: trunk/vice/src/arch/gtk3/uidiskcreate.c
===================================================================
--- trunk/vice/src/arch/gtk3/uidiskcreate.c	2024-04-09 19:40:08 UTC (rev 45103)
+++ trunk/vice/src/arch/gtk3/uidiskcreate.c	2024-04-09 20:42:40 UTC (rev 45104)
@@ -58,7 +58,7 @@
 
 
 /* forward declaration */
-static gboolean create_disk_image(const char *filename);
+static gboolean create_disk_image(GtkWindow *parent, const char *filename);
 
 
 /** \brief  List of supported disk image types
@@ -120,35 +120,35 @@
  *
  * This handler is called when the user clicks a button in the dialog.
  *
- * \param[in,out]   widget      the dialog
+ * \param[in,out]   dialog      the dialog
  * \param[in]       response_id response ID
  * \param[in]       data        extra data (unused)
  */
-static void on_response(GtkWidget *widget, gint response_id, gpointer data)
+static void on_response(GtkDialog *dialog, gint response_id, gpointer data)
 {
-    gchar *filename;
-    int status = TRUE;
+    gchar    *filename;
+    gboolean  status = TRUE;
 
     switch (response_id) {
 
         case GTK_RESPONSE_ACCEPT:
-            filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget));
+            filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
             if (filename != NULL) {
                 gchar *filename_locale;
 
                 filename_locale = file_chooser_convert_to_locale(filename);
-                status = create_disk_image(filename_locale);
+                status = create_disk_image(GTK_WINDOW(dialog), filename_locale);
                 g_free(filename_locale);
             }
             g_free(filename);
             if (status) {
                 /* image creation and attaching was succesful, exit dialog */
-                gtk_widget_destroy(widget);
+                gtk_widget_destroy(GTK_WIDGET(dialog));
             }
             break;
 
         case GTK_RESPONSE_REJECT:
-            gtk_widget_destroy(widget);
+            gtk_widget_destroy(GTK_WIDGET(dialog));
             break;
         default:
             break;
@@ -210,24 +210,25 @@
 
 /** \brief  Actually create the disk image and attach it
  *
+ * \param[in]   parent      parent dialog
  * \param[in]   filename    filename of the new image
  *
  * \return  bool
  */
-static gboolean create_disk_image(const char *filename)
+static gboolean create_disk_image(GtkWindow *parent, const char *filename)
 {
-    char *fname_copy;
-    char name_vice[IMAGE_CONTENTS_NAME_LEN + 1];
-    char id_vice[IMAGE_CONTENTS_ID_LEN + 1];
+    char       *fname_copy;
+    char        name_vice[IMAGE_CONTENTS_NAME_LEN + 1];
+    char        id_vice[IMAGE_CONTENTS_ID_LEN + 1];
     const char *name_gtk3;
     const char *id_gtk3;
-    char *vdr_text;
-    int status = TRUE;
+    char       *vdr_text;
+    gboolean    status = TRUE;
 
-    memset(name_vice, 0, IMAGE_CONTENTS_NAME_LEN + 1);
-    memset(id_vice, 0, IMAGE_CONTENTS_ID_LEN + 1);
+    memset(name_vice, 0, sizeof name_vice);
+    memset(id_vice, 0, sizeof id_vice);
     name_gtk3 = gtk_entry_get_text(GTK_ENTRY(disk_name));
-    id_gtk3 = gtk_entry_get_text(GTK_ENTRY(disk_id));
+    id_gtk3   = gtk_entry_get_text(GTK_ENTRY(disk_id));
 
     /* fix extension of filename */
     fname_copy = util_add_extension_const(filename,
@@ -257,8 +258,9 @@
     /* create image */
     if (vdrive_internal_create_format_disk_image(fname_copy, vdr_text,
                 image_type) < 0) {
-        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
-                                "Fail", "Could not create image '%s'",
+        vice_gtk3_message_error(parent,
+                                "Fail",
+                                "Could not create image '%s'",
                                 fname_copy);
         status = FALSE;
     } else {
@@ -266,7 +268,7 @@
         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(set_drive_type))) {
             /* try to set the proper drive type, but keep going if it fails */
             if (!attempt_to_set_drive_type()) {
-                vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
+                vice_gtk3_message_error(parent,
                                         "Core error",
                                         "Failed to set drive type to %d\nContinuing.",
                                         image_type);
@@ -275,7 +277,7 @@
 
         /* finally attach the disk image */
         if (file_system_attach_disk(unit_number, drive_number, fname_copy) < 0) {
-            vice_gtk3_message_error(NULL, /* FIXME: need proper parent */
+            vice_gtk3_message_error(parent,
                                     "fail",
                                     "Could not attach image '%s'",
                                     fname_copy);
Modified: trunk/vice/src/arch/gtk3/uimedia.c
===================================================================
--- trunk/vice/src/arch/gtk3/uimedia.c	2024-04-09 19:40:08 UTC (rev 45103)
+++ trunk/vice/src/arch/gtk3/uimedia.c	2024-04-09 20:42:40 UTC (rev 45104)
@@ -237,8 +237,9 @@
  */
 static char *screenshot_driver = NULL;
 
+/** \brief  Reference to the dialog for the vysnc callback */
+static GtkWidget *main_dialog = NULL;
 
-
 /** \brief  Reference to the GtkStack containing the media types
  *
  * Used in the dialog response callback to determine recording mode and params
@@ -245,7 +246,6 @@
  */
 static GtkWidget *stack;
 
-
 /** \brief  Pause state when activating the dialog
  */
 static int old_pause_state = 0;
@@ -287,6 +287,7 @@
         ui_pause_disable();
     }
     ui_action_finish(ACTION_MEDIA_RECORD);
+    main_dialog = NULL;
 }
 
 
@@ -482,7 +483,7 @@
 {
     char *filename = data;
 
-    vice_gtk3_message_error(NULL,
+    vice_gtk3_message_error(GTK_WINDOW(main_dialog),
                             "Screenshot error",
                             "Failed to write screenshot file '%s.'",
                             filename);
@@ -1186,7 +1187,6 @@
  */
 void ui_media_dialog_show(void)
 {
-    GtkWidget *dialog;
     GtkWidget *content;
 
     /*
@@ -1204,16 +1204,15 @@
         create_video_driver_list();
     }
 
-    dialog = gtk_dialog_new_with_buttons(
-            "Record media file",
-            ui_get_active_window(),
-            GTK_DIALOG_MODAL,
-            "Save", RESPONSE_SAVE,
-            "Close", GTK_RESPONSE_DELETE_EVENT,
-            NULL);
+    main_dialog = gtk_dialog_new_with_buttons("Record media file",
+                                               ui_get_active_window(),
+                                               GTK_DIALOG_MODAL,
+                                               "Save", RESPONSE_SAVE,
+                                               "Close", GTK_RESPONSE_DELETE_EVENT,
+                                                NULL);
 
     /* add content widget */
-    content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+    content = gtk_dialog_get_content_area(GTK_DIALOG(main_dialog));
     if (machine_class != VICE_MACHINE_VSID) {
         gtk_container_add(GTK_CONTAINER(content), create_content_widget());
     } else {
@@ -1220,11 +1219,11 @@
         gtk_container_add(GTK_CONTAINER(content), create_sound_widget());
     }
 
-    gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
-    g_signal_connect(dialog, "response", G_CALLBACK(on_response), (gpointer)dialog);
-    g_signal_connect_unlocked(dialog, "destroy", G_CALLBACK(on_dialog_destroy), NULL);
+    gtk_window_set_resizable(GTK_WINDOW(main_dialog), FALSE);
+    g_signal_connect(main_dialog, "response", G_CALLBACK(on_response), (gpointer)main_dialog);
+    g_signal_connect_unlocked(main_dialog, "destroy", G_CALLBACK(on_dialog_destroy), NULL);
 
-    gtk_widget_show_all(dialog);
+    gtk_widget_show_all(main_dialog);
 }
 
 
Modified: trunk/vice/src/arch/gtk3/uisidattach.c
===================================================================
--- trunk/vice/src/arch/gtk3/uisidattach.c	2024-04-09 19:40:08 UTC (rev 45103)
+++ trunk/vice/src/arch/gtk3/uisidattach.c	2024-04-09 20:42:40 UTC (rev 45104)
@@ -115,15 +115,11 @@
  * \param[in]   widget      the dialog
  * \param[in]   response_id response ID
  * \param[in]   user_data   extra data (unused)
- *
- * TODO:    proper (error) messages, which requires implementing ui_error() and
- *          ui_message() and moving them into gtk3/widgets to avoid circular
- *          references
  */
 static void on_response(GtkWidget *widget, gint response_id, gpointer user_data)
 {
     gchar *filename;
-    char text[1024];
+    char   text[1024];
 
     switch (response_id) {
 
Modified: trunk/vice/src/arch/gtk3/uismartattach.c
===================================================================
--- trunk/vice/src/arch/gtk3/uismartattach.c	2024-04-09 19:40:08 UTC (rev 45103)
+++ trunk/vice/src/arch/gtk3/uismartattach.c	2024-04-09 20:42:40 UTC (rev 45104)
@@ -103,17 +103,17 @@
 
 /** \brief  Trigger autostart
  *
- * \param[in]   widget      dialog
+ * \param[in]   dialog      dialog
  * \param[in]   index       file index in the directory preview
  * \param[in]   autostart   flag: 0: just load, 1: autostart
  */
-static void do_autostart(GtkWidget *widget, int index, int autostart)
+static void do_autostart(GtkWidget *dialog, int index, int autostart)
 {
     gchar *filename;
     gchar *filename_locale;
 
-    lastdir_update(widget, &last_dir, &last_file);
-    filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget));
+    lastdir_update(dialog, &last_dir, &last_file);
+    filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
     filename_locale = file_chooser_convert_to_locale(filename);
 
     /* if this function exists, why is there no attach_autodetect()
@@ -125,13 +125,10 @@
                            in the preview widget to load the proper
                            file in an image */
                 autostart ? AUTOSTART_MODE_RUN : AUTOSTART_MODE_LOAD) < 0) {
-        /* oeps
-         *
-         * I currently can't find a way to use a non-blocking Gtk Error dialog
-         * to report the error, so this will have to do, for now. -- compyx
-         */
-        log_error(LOG_ERR, "Failed to smart attach '%s'", filename_locale);
-        ui_error("Failed to smart attach '%s'", filename_locale);
+        vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                "Autodetect error",
+                                "Failed to smart attach '%s'",
+                                filename_locale);
     }
     g_free(filename);
     g_free(filename_locale);
@@ -366,10 +363,8 @@
  * \param[in]   widget      the dialog
  * \param[in]   response_id response ID
  * \param[in]   user_data   unit number
- *
- * TODO:    proper (error) messages, which requires implementing ui_error() and
- *          ui_message() and moving them into gtk3/widgets to avoid circular
- *          references
+ 
+ * TODO:    proper (error) messages
  */
 static void on_response(GtkWidget *widget, gint response_id, gpointer user_data)
 {
Modified: trunk/vice/src/arch/gtk3/uitapeattach.c
===================================================================
--- trunk/vice/src/arch/gtk3/uitapeattach.c	2024-04-09 19:40:08 UTC (rev 45103)
+++ trunk/vice/src/arch/gtk3/uitapeattach.c	2024-04-09 20:42:40 UTC (rev 45104)
@@ -144,7 +144,10 @@
                 port - 1    /* function uses 0/1 */) < 0) {
         /* oeps */
         log_error(LOG_ERR, "autostarting tape '%s' failed.", filename_locale);
-        ui_error("Autostarting tape '%s' failed.", filename_locale);
+        vice_gtk3_message_error(GTK_WINDOW(widget),
+                               "Autostart error",
+                               "Autostarting tape '%s' failed.",
+                               filename_locale);
     }
     g_free(filename_locale);
 }
@@ -168,10 +171,13 @@
 
     if (tape_image_attach(TAPEPORT_PORT_1 + port, filename_locale) < 0) {
         /* failed */
-        log_error(LOG_ERR, "attaching tape '%s' to port #%d failed.",
-                 filename_locale, port);
-        ui_error("Attaching tape '%s' to port #%d failed.",
-                 filename_locale, port);
+        log_error(LOG_ERR,
+                  "attaching tape '%s' to port #%d failed.",
+                  filename_locale, port);
+        vice_gtk3_message_error(GTK_WINDOW(widget),
+                                "Attach error",
+                                "Attaching tape '%s' to port #%d failed.",
+                                filename_locale, port);
     }
     g_free(filename_locale);
 }
Modified: trunk/vice/src/arch/gtk3/uitapecreate.c
===================================================================
--- trunk/vice/src/arch/gtk3/uitapecreate.c	2024-04-09 19:40:08 UTC (rev 45103)
+++ trunk/vice/src/arch/gtk3/uitapecreate.c	2024-04-09 20:42:40 UTC (rev 45104)
@@ -47,7 +47,7 @@
 
 
 /* forward declarations of functions */
-static gboolean create_tape_image(const char *filename, int port);
+static gboolean create_tape_image(GtkWindow *parent, const char *filename, int port);
 
 
 /** \brief  Reference to the 'auto-attach' check button
@@ -74,37 +74,38 @@
  *
  * This handler is called when the user clicks a button in the dialog.
  *
- * \param[in,out]   widget      the dialog
- * \param[in]       response_id response ID
- * \param[in]       data        port number (integer, 1 or 2)
+ * \param[in]   dialog      the dialog
+ * \param[in]   response_id response ID
+ * \param[in]   data        port number (integer, 1 or 2)
  */
-static void on_response(GtkWidget *widget, gint response_id, gpointer data)
+static void on_response(GtkDialog *dialog, gint response_id, gpointer data)
 {
-    gchar *filename;
-    int status = TRUE;
-    int port = GPOINTER_TO_INT(data);
+    gchar    *filename;
+    gboolean  status = TRUE;
+    int       port = GPOINTER_TO_INT(data);
 
     switch (response_id) {
 
         case GTK_RESPONSE_ACCEPT:
-            filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget));
+            filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
             if (filename != NULL) {
                 gchar *filename_locale = file_chooser_convert_to_locale(filename);
 
                 /* create tape */
-                status = create_tape_image(filename_locale, port);
+                status = create_tape_image(GTK_WINDOW(dialog), filename_locale, port);
                 g_free(filename_locale);
             }
             g_free(filename);
             if (status) {
                 /* image creation and attaching was succesful, exit dialog */
-                gtk_widget_destroy(widget);
+                gtk_widget_destroy(GTK_WIDGET(dialog));
             }
             break;
 
         case GTK_RESPONSE_REJECT:
-            gtk_widget_destroy(widget);
+            gtk_widget_destroy(GTK_WIDGET(dialog));
             break;
+
         default:
             break;
     }
@@ -113,15 +114,18 @@
 
 /** \brief  Actually create the tape image and attach it
  *
+ * \param[in]   parent      parent dialog
  * \param[in]   filename    filename of the new image
  * \param[in]   port        datasette port number (1 or 2)
  *
  * \return  bool
  */
-static gboolean create_tape_image(const char *filename, int port)
+static gboolean create_tape_image(GtkWindow  *parent,
+                                  const char *filename,
+                                  int         port)
 {
-    gboolean status = TRUE;
-    char *fname_copy;
+    char     *fname_copy;
+    gboolean  status = TRUE;
 
     /* fix extension */
     fname_copy = util_add_extension_const(filename, "tap");
@@ -128,7 +132,7 @@
 
     /* try to create the image */
     if (cbmimage_create_image(fname_copy, DISK_IMAGE_TYPE_TAP) < 0) {
-        vice_gtk3_message_error(NULL,   /* FIXME: get proper parent? */
+        vice_gtk3_message_error(parent,
                                 "VICE error",
                                 "Failed to create tape image '%s'",
                                 fname_copy);
@@ -136,8 +140,9 @@
     } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auto_attach))) {
         /* try to attach the image */
         if (tape_image_attach(port, fname_copy) < 0) {
-            ui_error("Failed to attach tape image '%s' to port #%d",
-                     fname_copy, port);
+            vice_gtk3_message_error(parent,
+                                    "Failed to attach tape image '%s' to port #%d",
+                                    fname_copy, port);
             status = FALSE;
         }
     }
Modified: trunk/vice/src/arch/gtk3/uivsidwindow.c
===================================================================
--- trunk/vice/src/arch/gtk3/uivsidwindow.c	2024-04-09 19:40:08 UTC (rev 45103)
+++ trunk/vice/src/arch/gtk3/uivsidwindow.c	2024-04-09 20:42:40 UTC (rev 45104)
@@ -245,7 +245,10 @@
 
     if (machine_autodetect_psid(filename) < 0) {
         vsid_control_widget_set_state(VSID_ERROR);
-        ui_error("'%s' is not a valid PSID file.", filename);
+        vice_gtk3_message_error(NULL,
+                                "PSID error",
+                                "'%s' is not a valid PSID file.",
+                                filename);
         return -1;
     }
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gp...@us...> - 2024-04-09 19:40:09
      
     | 
| Revision: 45103
          http://sourceforge.net/p/vice-emu/code/45103
Author:   gpz
Date:     2024-04-09 19:40:08 +0000 (Tue, 09 Apr 2024)
Log Message:
-----------
fix typo
Modified Paths:
--------------
    trunk/vice/src/arch/gtk3/widgets/settings_vicioram.c
Modified: trunk/vice/src/arch/gtk3/widgets/settings_vicioram.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_vicioram.c	2024-04-09 17:40:21 UTC (rev 45102)
+++ trunk/vice/src/arch/gtk3/widgets/settings_vicioram.c	2024-04-09 19:40:08 UTC (rev 45103)
@@ -57,7 +57,7 @@
                                                  " ($9800-$9BFF)"),
     io3ram = vice_gtk3_resource_check_button_new("IO3RAM",
                                                  "Enable IO-3 RAM Cartridge"
-                                                 " ($9C00-$FBFF)"),
+                                                 " ($9C00-$9FFF)"),
     gtk_grid_attach(GTK_GRID(grid), io2ram, 0, 0, 1, 1);
     gtk_grid_attach(GTK_GRID(grid), io3ram, 0, 1, 1, 1);
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <co...@us...> - 2024-04-09 17:40:24
      
     | 
| Revision: 45102
          http://sourceforge.net/p/vice-emu/code/45102
Author:   compyx
Date:     2024-04-09 17:40:21 +0000 (Tue, 09 Apr 2024)
Log Message:
-----------
Gtk3: Fix vice_gtk3_message_error() dialog not showing up
Remove the `GTK_DIALOG_DESTROY_WITH_PARENT` flag from the GtkMessage constructor
call so any parent dialog immediately closing won't also close the error message
it spawned. Allow passing a proper parent to `vice_gtk3_message_error()`, still
needs a lot of changes in the calling code, most of which still use `NULL` to
use the current emu window as parent (marked with "FIXME" for now).
The other VICE message dialogs (info, confirm) also need to be updated to allow
passing a proper parent.
Modified Paths:
--------------
    trunk/vice/src/arch/gtk3/actions-help.c
    trunk/vice/src/arch/gtk3/actions-settings.c
    trunk/vice/src/arch/gtk3/ui.c
    trunk/vice/src/arch/gtk3/uicart.c
    trunk/vice/src/arch/gtk3/uidiskcreate.c
    trunk/vice/src/arch/gtk3/uimedia.c
    trunk/vice/src/arch/gtk3/uitapecreate.c
    trunk/vice/src/arch/gtk3/widgets/base/basedialogs.c
    trunk/vice/src/arch/gtk3/widgets/base/basedialogs.h
    trunk/vice/src/arch/gtk3/widgets/base/cartridgewidgets.c
    trunk/vice/src/arch/gtk3/widgets/settings_gmod2c128.c
    trunk/vice/src/arch/gtk3/widgets/settings_gmod3.c
    trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c
    trunk/vice/src/arch/gtk3/widgets/settings_ieee488.c
    trunk/vice/src/arch/gtk3/widgets/settings_ieeeflash64.c
    trunk/vice/src/arch/gtk3/widgets/settings_keyboard.c
    trunk/vice/src/arch/gtk3/widgets/settings_mmc64.c
    trunk/vice/src/arch/gtk3/widgets/settings_mmcr.c
    trunk/vice/src/arch/gtk3/widgets/settings_petdww.c
    trunk/vice/src/arch/gtk3/widgets/settings_ramlink.c
    trunk/vice/src/arch/gtk3/widgets/settings_retroreplay.c
    trunk/vice/src/arch/gtk3/widgets/settings_rrnetmk3.c
    trunk/vice/src/arch/gtk3/widgets/vsidplaylistwidget.c
Modified: trunk/vice/src/arch/gtk3/actions-help.c
===================================================================
--- trunk/vice/src/arch/gtk3/actions-help.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/actions-help.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -110,10 +110,10 @@
         debug_gtk3("Calling xgd-open");
         if (archdep_spawn("xdg-open", args, &tmp_name, NULL) < 0) {
             debug_gtk3("xdg-open Failed!");
-            vice_gtk3_message_error(
-                    "Failed to load PDF",
-                    "Error message: %s",
-                    error != NULL ? error->message : "<no message>");
+            vice_gtk3_message_error(NULL, /* use current emu window as parent */
+                                    "Failed to load PDF",
+                                    "Error message: %s",
+                                    error != NULL ? error->message : "<no message>");
         } else {
             debug_gtk3("OK");
         }
Modified: trunk/vice/src/arch/gtk3/actions-settings.c
===================================================================
--- trunk/vice/src/arch/gtk3/actions-settings.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/actions-settings.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -131,7 +131,8 @@
     result = resources_reset_and_load(NULL);
     mainlock_release();
     if (result != 0) {
-        vice_gtk3_message_error("VICE core error",
+        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent? */
+                                "VICE core error",
                                 "Failed to load default settings file");
     } else {
         /* set window geometries from resources, if present */
@@ -159,7 +160,8 @@
                                 : resources_load(filename);
         mainlock_release();
         if (result != 0) {
-            vice_gtk3_message_error("VICE core error",
+            vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                    "VICE core error",
                                     "Failed to load settings from '%s'",
                                     filename);
         } else {
@@ -214,7 +216,8 @@
     result = resources_save(NULL);
     mainlock_release();
     if (result != 0) {
-        vice_gtk3_message_error("VICE core error",
+        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
+                                "VICE core error",
                                 "Failed to save default settings file");
     }
     ui_action_finish(self->action);
@@ -233,7 +236,8 @@
     if (filename!= NULL) {
         mainlock_obtain();
         if (resources_save(filename) != 0) {
-            vice_gtk3_message_error("VICE core error",
+            vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                    "VICE core error",
                                     "Failed to save settings as '%s'",
                                     filename);
         }
Modified: trunk/vice/src/arch/gtk3/ui.c
===================================================================
--- trunk/vice/src/arch/gtk3/ui.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/ui.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -2515,7 +2515,7 @@
     char *buffer = (char *)user_data;
     GtkWidget *dialog;
 
-    dialog = vice_gtk3_message_error("VICE Error", "%s", buffer);
+    dialog = vice_gtk3_message_error(NULL, "VICE Error", "%s", buffer);
     gtk_dialog_run(GTK_DIALOG(dialog));
 
     lib_free(buffer);
Modified: trunk/vice/src/arch/gtk3/uicart.c
===================================================================
--- trunk/vice/src/arch/gtk3/uicart.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/uicart.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -312,18 +312,22 @@
 
                 result = attach_cart_image(get_cart_type(), get_cart_id(), filename_locale);
                 if (!result) {
-                    vice_gtk3_message_error("VICE Error",
-                            "Failed to smart-attach '%s'", filename);
+                    vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                            "VICE Error",
+                                            "Failed to attach image '%s'",
+                                            filename);
+                    /* we don't destroy the dialog here to allow the user to
+                     * select another (hopefully valid) image. */
                 } else {
                     /* call optional extra callback */
                     if (extra_attach_callback != NULL) {
                         extra_attach_callback();
                     }
+                    gtk_widget_destroy(dialog);
                 }
                 g_free(filename);
                 g_free(filename_locale);
             }
-            gtk_widget_destroy(dialog);
             break;
     }
 
Modified: trunk/vice/src/arch/gtk3/uidiskcreate.c
===================================================================
--- trunk/vice/src/arch/gtk3/uidiskcreate.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/uidiskcreate.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -257,8 +257,9 @@
     /* create image */
     if (vdrive_internal_create_format_disk_image(fname_copy, vdr_text,
                 image_type) < 0) {
-        vice_gtk3_message_error("Fail", "Could not create image '%s'",
-                fname_copy);
+        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
+                                "Fail", "Could not create image '%s'",
+                                fname_copy);
         status = FALSE;
     } else {
         /* do we need to attempt to set the proper drive type? */
@@ -265,16 +266,19 @@
         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(set_drive_type))) {
             /* try to set the proper drive type, but keep going if it fails */
             if (!attempt_to_set_drive_type()) {
-                vice_gtk3_message_error("Core error",
-                        "Failed to set drive type to %d\nContinuing.",
-                        image_type);
+                vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
+                                        "Core error",
+                                        "Failed to set drive type to %d\nContinuing.",
+                                        image_type);
             }
         }
 
         /* finally attach the disk image */
         if (file_system_attach_disk(unit_number, drive_number, fname_copy) < 0) {
-            vice_gtk3_message_error("fail", "Could not attach image '%s'",
-                    fname_copy);
+            vice_gtk3_message_error(NULL, /* FIXME: need proper parent */
+                                    "fail",
+                                    "Could not attach image '%s'",
+                                    fname_copy);
             status = FALSE;
         }
     }
Modified: trunk/vice/src/arch/gtk3/uimedia.c
===================================================================
--- trunk/vice/src/arch/gtk3/uimedia.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/uimedia.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -482,7 +482,8 @@
 {
     char *filename = data;
 
-    vice_gtk3_message_error("Screenshot error",
+    vice_gtk3_message_error(NULL,
+                            "Screenshot error",
                             "Failed to write screenshot file '%s.'",
                             filename);
     lib_free(filename);
@@ -699,8 +700,10 @@
         /* printf("on_save_video_filename video_driver:'%s'\n", video_driver); */
         /* TODO: add extension if not present? */
         if (screenshot_save(video_driver, filename_locale, ui_get_active_canvas()) < 0) {
-            vice_gtk3_message_error("VICE Error",
-                    "Failed to write video file '%s'", filename);
+            vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                    "VICE Error",
+                                    "Failed to write video file '%s'",
+                                    filename);
         }
         g_free(filename);
         g_free(filename_locale);
Modified: trunk/vice/src/arch/gtk3/uitapecreate.c
===================================================================
--- trunk/vice/src/arch/gtk3/uitapecreate.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/uitapecreate.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -128,8 +128,10 @@
 
     /* try to create the image */
     if (cbmimage_create_image(fname_copy, DISK_IMAGE_TYPE_TAP) < 0) {
-        vice_gtk3_message_error("VICE error",
-                "Failed to create tape image '%s'", fname_copy);
+        vice_gtk3_message_error(NULL,   /* FIXME: get proper parent? */
+                                "VICE error",
+                                "Failed to create tape image '%s'",
+                                fname_copy);
         status = FALSE;
     } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auto_attach))) {
         /* try to attach the image */
Modified: trunk/vice/src/arch/gtk3/widgets/base/basedialogs.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/base/basedialogs.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/base/basedialogs.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -140,11 +140,13 @@
  *
  * \return  GtkMessageDialog
  */
-static GtkWidget *create_dialog(GtkMessageType type, GtkButtonsType buttons,
-                                const char *title, const char *text)
+static GtkWidget *create_dialog(GtkWindow      *parent,
+                                GtkMessageType  type,
+                                GtkButtonsType  buttons,
+                                const char     *title,
+                                const char     *text)
 {
     GtkWidget *dialog;
-    GtkWindow *parent = ui_get_active_window();
     gboolean no_parent = FALSE;
 
     if (parent == NULL) {
@@ -155,7 +157,7 @@
 
     dialog = gtk_message_dialog_new(
             parent,
-            GTK_DIALOG_DESTROY_WITH_PARENT,
+            /* GTK_DIALOG_DESTROY_WITH_PARENT */ 0,
             type, buttons, NULL);
     gtk_window_set_title(GTK_WINDOW(dialog), title);
     gtk_message_dialog_set_markup(GTK_MESSAGE_DIALOG(dialog), text);
@@ -194,7 +196,7 @@
     buffer = lib_mvsprintf(fmt, args);
     va_end(args);
 
-    dialog = create_dialog(GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, title, buffer);
+    dialog = create_dialog(NULL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, title, buffer);
 
     lib_free(buffer);
 
@@ -228,7 +230,7 @@
     buffer = lib_mvsprintf(fmt, args);
     va_end(args);
 
-    dialog = create_dialog(GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL,
+    dialog = create_dialog(NULL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL,
             title, buffer);
 
     lib_free(buffer);
@@ -245,41 +247,56 @@
 
 /** \brief  Create 'error' dialog
  *
- * \param[in]   title       dialog title
- * \param[in]   fmt         message format string and arguments
+ * Create modal error dialog with either \a parent as parentm or if \a parent
+ * is \c NULL the active emu window as parent or if that one isn't created yet,
+ * a temporary empty (non-visible) parent window.
  *
+ * \param[in]   parent  parent window/dialog
+ * \param[in]   title   dialog title
+ * \param[in]   fmt     message format string and arguments
+ *
  * \return  dialog
  */
-GtkWidget *vice_gtk3_message_error(const char *title,
+GtkWidget *vice_gtk3_message_error(GtkWindow  *parent,
+                                   const char *title,
                                    const char *fmt, ...)
 {
-    GtkWindow *active_window;
+    GtkWindow *active_window = NULL;
     GtkWidget *dialog;
-    va_list args;
-    char *buffer;
+    va_list    args;
+    char      *buffer;
 
     va_start(args, fmt);
     buffer = lib_mvsprintf(fmt, args);
     va_end(args);
 
-    dialog = create_dialog(GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, title, buffer);
+    dialog = create_dialog(parent, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, title, buffer);
 
     lib_free(buffer);
 
-    g_signal_connect(dialog, "response", G_CALLBACK(on_response_error), NULL);
-
-    active_window = ui_get_active_window();
-
-    if (active_window) {
+    if (parent == NULL) {
+        /* no parent: assume active emu window */
+        active_window = ui_get_active_window();
+    } else {
+        /* we have a proper parent: */
+        active_window = parent;
+    }
+    if (active_window != NULL) {
         gtk_window_set_transient_for(GTK_WINDOW(dialog), active_window);
         gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT);
         gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
     } else {
+        /* no emu window present yet (UI hasn't  properly started), center on
+         * screen (if the WM accept this) */
         gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
     }
 
+    g_signal_connect_unlocked(G_OBJECT(dialog),
+                              "response",
+                              G_CALLBACK(on_response_error),
+                              NULL);
+
     gtk_widget_show(dialog);
-
     return dialog;
 }
 
Modified: trunk/vice/src/arch/gtk3/widgets/base/basedialogs.h
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/base/basedialogs.h	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/base/basedialogs.h	2024-04-09 17:40:21 UTC (rev 45102)
@@ -53,8 +53,9 @@
                                      const char *title,
                                      const char *fmt, ...) VICE_ATTR_PRINTF3;
 
-GtkWidget *vice_gtk3_message_error(const char *title,
-                                   const char *fmt, ...) VICE_ATTR_PRINTF2;
+GtkWidget *vice_gtk3_message_error(GtkWindow  *parent,
+                                   const char *title,
+                                   const char *fmt, ...) VICE_ATTR_PRINTF3;
 
 GtkWidget *vice_gtk3_integer_input_box(
         void (*callback)(GtkDialog *, int, gboolean),
Modified: trunk/vice/src/arch/gtk3/widgets/base/cartridgewidgets.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/base/cartridgewidgets.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/base/cartridgewidgets.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -157,7 +157,7 @@
             char title[256];
 
             g_snprintf(title, sizeof title, "%s Error", state->cart_name);
-            vice_gtk3_message_error(title,
+            vice_gtk3_message_error(GTK_WINDOW(self), title,
                                     "Failed to save %s %s image as '%s'.",
                                     state->cart_name, state->image_tag, filename);
         }
@@ -211,7 +211,7 @@
         char title[256];
 
         g_snprintf(title, sizeof title, "%s Error", state->cart_name);
-        vice_gtk3_message_error(title,
+        vice_gtk3_message_error(NULL, title,
                                 "Failed to flush %s %s image",
                                 state->cart_name, state->image_tag);
     }
@@ -411,7 +411,7 @@
         char title[256];
 
         g_snprintf(title, sizeof title, "%s Error", state->cart_name);
-        vice_gtk3_message_error(title,
+        vice_gtk3_message_error(NULL, title,
                                 "Failed to set '%s' as the %s image file.",
                                 filename, state->image_tag);
     }
Modified: trunk/vice/src/arch/gtk3/widgets/settings_gmod2c128.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_gmod2c128.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/settings_gmod2c128.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -60,9 +60,10 @@
 {
     if (filename != NULL) {
         if (cartridge_save_image(CARTRIDGE_C128_MAKEID(CARTRIDGE_C128_GMOD2C128), filename) < 0) {
-            vice_gtk3_message_error("Saving failed",
-                    "Failed to save cartridge image '%s'",
-                    filename);
+            vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                    "Saving failed",
+                                    "Failed to save cartridge image '%s'",
+                                    filename);
         }
         g_free(filename);
     }
@@ -94,8 +95,9 @@
 static void on_flush_clicked(GtkWidget *widget, gpointer user_data)
 {
     if (cartridge_flush_image(CARTRIDGE_C128_MAKEID(CARTRIDGE_C128_GMOD2C128)) < 0) {
-        vice_gtk3_message_error("Flushing failed",
-                    "Failed to fush cartridge image");
+        vice_gtk3_message_error(NULL, /* FIXME: need proper parent */
+                                "Flushing failed",
+                                "Failed to fush cartridge image");
     }
 }
 
@@ -107,14 +109,15 @@
  * \param[in]       data        extra data (unused)
  */
 static void eeprom_filename_callback(GtkDialog *dialog,
-                                     gchar *filename,
-                                     gpointer data)
+                                     gchar     *filename,
+                                     gpointer   data)
 {
     if (filename != NULL) {
         if (resources_set_string("GMod128EEPROMImage", filename) < 0) {
-            vice_gtk3_message_error("Failed to load EEPROM file",
-                    "Failed to load EEPROM image file '%s'",
-                    filename);
+            vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                    "Failed to load EEPROM file",
+                                    "Failed to load EEPROM image file '%s'",
+                                    filename);
         } else {
             gtk_entry_set_text(GTK_ENTRY(eeprom_entry), filename);
         }
Modified: trunk/vice/src/arch/gtk3/widgets/settings_gmod3.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_gmod3.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/settings_gmod3.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -52,7 +52,8 @@
 {
     if (filename != NULL) {
         if (cartridge_save_image(CARTRIDGE_GMOD3, filename) < 0) {
-            vice_gtk3_message_error(CARTRIDGE_NAME_GMOD3 " Error",
+            vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                    CARTRIDGE_NAME_GMOD3 " Error",
                                     "Failed to save cartridge image '%s'.",
                                     filename);
         }
@@ -83,7 +84,8 @@
 static void on_flush_clicked(GtkWidget *widget, gpointer user_data)
 {
     if (cartridge_flush_image(CARTRIDGE_GMOD3) < 0) {
-        vice_gtk3_message_error(CARTRIDGE_NAME_GMOD3 " Error",
+        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
+                                CARTRIDGE_NAME_GMOD3 " Error",
                                 "Failed to flush cartridge image.");
     }
 }
Modified: trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/settings_hotkeys.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -1482,7 +1482,8 @@
                                    "Hotkeys succesfully saved as '%s'.",
                                    fullpath);
         } else {
-            vice_gtk3_message_error("Hotkeys error",
+            vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                    "Hotkeys error",
                                     "Failed to save hotkeys as '%s'.",
                                     fullpath);
         }
@@ -1527,7 +1528,8 @@
         lib_free(path);
     } else {
         /* FIXME: perhaps some info on what happened to make it fail? */
-        vice_gtk3_message_error("Hotkeys error",
+        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
+                                "Hotkeys error",
                                 "Failed to save hotkeys.");
     }
     update_hotkeys_info();
Modified: trunk/vice/src/arch/gtk3/widgets/settings_ieee488.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_ieee488.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/settings_ieee488.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -62,7 +62,8 @@
         resources_get_string("IEEE488Image", &image);
         if (image == NULL || *image == '\0') {
             /* no image */
-            vice_gtk3_message_error(CARTRIDGE_NAME_IEEE488 " Error",
+            vice_gtk3_message_error(NULL,
+                                    CARTRIDGE_NAME_IEEE488 " Error",
                                     "Cannot enable " CARTRIDGE_NAME_IEEE488 ","
                                     " no image has been selected.");
             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), FALSE);
Modified: trunk/vice/src/arch/gtk3/widgets/settings_ieeeflash64.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_ieeeflash64.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/settings_ieeeflash64.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -66,7 +66,8 @@
         resources_get_string("IEEEFlash64Image", &image);
         if (image == NULL || *image == '\0') {
             /* no image */
-            vice_gtk3_message_error(CARTRIDGE_NAME_IEEEFLASH64 " Error",
+            vice_gtk3_message_error(NULL, /* FIXME: need proper parent */
+                                    CARTRIDGE_NAME_IEEEFLASH64 " Error",
                                     "Cannot enable " CARTRIDGE_NAME_IEEEFLASH64
                                     ", no image specified.");
             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), FALSE);
Modified: trunk/vice/src/arch/gtk3/widgets/settings_keyboard.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_keyboard.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/settings_keyboard.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -95,8 +95,10 @@
                     "Wrote current keymap as '%s'.", path);
             lastdir_update(GTK_WIDGET(dialog), &last_dir, &last_file);
         } else {
-            vice_gtk3_message_error("Failed to save custom keymap",
-                    "Error %d: %s", errno, strerror(errno));
+            vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                    "Failed to save custom keymap",
+                                    "Error %d: %s",
+                                    errno, strerror(errno));
         }
         lib_free(path);
     }
Modified: trunk/vice/src/arch/gtk3/widgets/settings_mmc64.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_mmc64.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/settings_mmc64.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -89,7 +89,8 @@
 
     if (enabled && (bios == NULL || *bios == '\0')) {
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), FALSE);
-        vice_gtk3_message_error(CARTRIDGE_NAME_MMC64 " Error",
+        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
+                                CARTRIDGE_NAME_MMC64 " Error",
                                 "Cannot enable " CARTRIDGE_NAME_MMC64
                                 " due to missing BIOS file.");
         return;
@@ -127,7 +128,8 @@
 {
     if (filename != NULL) {
         if (cartridge_save_image(CARTRIDGE_MMC64, filename) < 0) {
-            vice_gtk3_message_error(CARTRIDGE_NAME_MMC64 " Error",
+            vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                    CARTRIDGE_NAME_MMC64 " Error",
                                     "Failed to save image as '%s'.",
                                     filename);
         }
@@ -160,7 +162,8 @@
 static void on_flush_clicked(GtkWidget *widget, gpointer user_data)
 {
     if (cartridge_flush_image(CARTRIDGE_MMC64) < 0) {
-        vice_gtk3_message_error(CARTRIDGE_NAME_MMC64 " Error",
+        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
+                                CARTRIDGE_NAME_MMC64 " Error",
                                 "Failed to flush image.");
     }
 }
Modified: trunk/vice/src/arch/gtk3/widgets/settings_mmcr.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_mmcr.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/settings_mmcr.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -70,9 +70,10 @@
 {
     if (filename != NULL) {
         if (cartridge_save_image(CARTRIDGE_MMC_REPLAY, filename) < 0) {
-            vice_gtk3_message_error(CARTRIDGE_NAME_MMC_REPLAY " Error",
+            vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                    CARTRIDGE_NAME_MMC_REPLAY " Error",
                                     "Failed to save image as '%s'",
-                    filename);
+                                    filename);
         }
         g_free(filename);
     }
@@ -103,7 +104,8 @@
 static void on_flush_clicked(GtkWidget *widget, gpointer user_data)
 {
     if (cartridge_flush_image(CARTRIDGE_MMC_REPLAY) < 0) {
-        vice_gtk3_message_error(CARTRIDGE_NAME_MMC_REPLAY "Error",
+        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
+                                CARTRIDGE_NAME_MMC_REPLAY "Error",
                                 "Failed to flush image.");
     }
 }
Modified: trunk/vice/src/arch/gtk3/widgets/settings_petdww.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_petdww.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/settings_petdww.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -64,7 +64,8 @@
 
     /* only enable when I/O size is 2048 bytes */
     if (active && (io_size < 2048)) {
-        vice_gtk3_message_error("Cannot enable DWW",
+        vice_gtk3_message_error(NULL, /* FIXME: need proper parent */
+                "Cannot enable DWW",
                 "To be able to use DWW, the I/O size of the machine "
                 " needs to be 2048 bytes."
                 " The current I/O size is %d bytes.\n\n"
Modified: trunk/vice/src/arch/gtk3/widgets/settings_ramlink.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_ramlink.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/settings_ramlink.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -93,7 +93,8 @@
         resources_get_string("RAMLINKBIOSfilename", &image);
         if (image == NULL || *image == '\0') {
             /* no image */
-            vice_gtk3_message_error(CARTRIDGE_NAME_RAMLINK " Error",
+            vice_gtk3_message_error(NULL, /* FIXME: need proper parent */
+                                    CARTRIDGE_NAME_RAMLINK " Error",
                                     "Cannot enable " CARTRIDGE_NAME_RAMLINK ","
                                     " no BIOS image has been selected.");
             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), FALSE);
Modified: trunk/vice/src/arch/gtk3/widgets/settings_retroreplay.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_retroreplay.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/settings_retroreplay.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -68,7 +68,8 @@
 {
     if (filename != NULL) {
         if (cartridge_save_image(CARTRIDGE_RETRO_REPLAY, filename) < 0) {
-            vice_gtk3_message_error(CARTRIDGE_NAME_RETRO_REPLAY " Error",
+            vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                    CARTRIDGE_NAME_RETRO_REPLAY " Error",
                                     "Failed to save image as '%s'.",
                                     filename);
         }
@@ -105,7 +106,8 @@
 static void on_flush_clicked(GtkWidget *widget, gpointer user_data)
 {
     if (cartridge_flush_image(CARTRIDGE_RETRO_REPLAY) < 0) {
-        vice_gtk3_message_error(CARTRIDGE_NAME_RETRO_REPLAY " Error",
+        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
+                                CARTRIDGE_NAME_RETRO_REPLAY " Error",
                                 "Failed to flush current image.");
     }
 }
Modified: trunk/vice/src/arch/gtk3/widgets/settings_rrnetmk3.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/settings_rrnetmk3.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/settings_rrnetmk3.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -48,7 +48,8 @@
 {
     if (filename != NULL) {
         if (cartridge_save_image(CARTRIDGE_RRNETMK3, filename) < 0) {
-            vice_gtk3_message_error(CARTRIDGE_NAME_RRNETMK3 " Error",
+            vice_gtk3_message_error(GTK_WINDOW(dialog),
+                                    CARTRIDGE_NAME_RRNETMK3 " Error",
                                     "Failed to save image as '%s'",
                                     filename);
         }
@@ -83,7 +84,8 @@
 static void on_flush_clicked(GtkWidget *widget, gpointer user_data)
 {
     if (cartridge_flush_image(CARTRIDGE_RRNETMK3) < 0) {
-        vice_gtk3_message_error(CARTRIDGE_NAME_RRNETMK3 " Error",
+        vice_gtk3_message_error(NULL,   /* FIXME: need proper parent */
+                                CARTRIDGE_NAME_RRNETMK3 " Error",
                                 "Failed to flush image.");
     }
 }
Modified: trunk/vice/src/arch/gtk3/widgets/vsidplaylistwidget.c
===================================================================
--- trunk/vice/src/arch/gtk3/widgets/vsidplaylistwidget.c	2024-04-09 17:16:18 UTC (rev 45101)
+++ trunk/vice/src/arch/gtk3/widgets/vsidplaylistwidget.c	2024-04-09 17:40:21 UTC (rev 45102)
@@ -1212,9 +1212,10 @@
 
     /* Attempt to parse sid header for title & composer */
     if (!hvsc_psid_open(path, &psid)) {
-        vice_gtk3_message_error("VSID",
-                "Failed to parse PSID header of '%s'.",
-                path);
+        vice_gtk3_message_error(NULL,   /* FIXME: might need proper parent */
+                                "VSID",
+                                "Failed to parse PSID header of '%s'.",
+                                path);
 
 
          debug_gtk3("Perhaps it's a MUS?");
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <gp...@us...> - 2024-04-09 17:16:21
      
     | 
| Revision: 45101
          http://sourceforge.net/p/vice-emu/code/45101
Author:   gpz
Date:     2024-04-09 17:16:18 +0000 (Tue, 09 Apr 2024)
Log Message:
-----------
add support for using tests in .crt files with vic20
Modified Paths:
--------------
    testprogs/testbench/cham20-testlist.txt
    testprogs/testbench/kernal64vic20-testlist.txt
    testprogs/testbench/selftest/Makefile
    testprogs/testbench/selftest/c64-fail.crt
    testprogs/testbench/selftest/c64-pass.crt
    testprogs/testbench/selftest/vic20.asm
    testprogs/testbench/vic20-testlist.in
    testprogs/testbench/xvic-hooks.sh
    testprogs/testbench/xvic-testlist.txt
    testprogs/testbench/z64kvic20-testlist.txt
Added Paths:
-----------
    testprogs/testbench/selftest/references/vic20-fail.crt.png
    testprogs/testbench/selftest/references/vic20-pass.crt.png
    testprogs/testbench/selftest/vic20-fail.crt
    testprogs/testbench/selftest/vic20-pass.crt
Modified: testprogs/testbench/cham20-testlist.txt
===================================================================
--- testprogs/testbench/cham20-testlist.txt	2024-04-08 17:48:53 UTC (rev 45100)
+++ testprogs/testbench/cham20-testlist.txt	2024-04-09 17:16:18 UTC (rev 45101)
@@ -9,6 +9,10 @@
 ./selftest/,vic20-fail.prg,exitcode,100000000,vic20-8k,expect:error
 ./selftest/,vic20-pass.prg,screenshot,100000000,vic20-8k
 ./selftest/,vic20-fail.prg,screenshot,100000000,vic20-8k,expect:error
+./selftest/,,exitcode,10000000,mountcrt:vic20-fail.crt,expect:error
+./selftest/,,exitcode,10000000,mountcrt:vic20-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:vic20-fail.crt,expect:error
+./selftest/,,screenshot,10000000,mountcrt:vic20-pass.crt
 #TODO:
 #../crtemulation/vic20
 #../VIC20/fe3diag/,f3diag.prg,exitcode,10000000
Modified: testprogs/testbench/kernal64vic20-testlist.txt
===================================================================
--- testprogs/testbench/kernal64vic20-testlist.txt	2024-04-08 17:48:53 UTC (rev 45100)
+++ testprogs/testbench/kernal64vic20-testlist.txt	2024-04-09 17:16:18 UTC (rev 45101)
@@ -9,6 +9,10 @@
 ./selftest/,vic20-fail.prg,exitcode,100000000,vic20-8k,expect:error
 ./selftest/,vic20-pass.prg,screenshot,100000000,vic20-8k
 ./selftest/,vic20-fail.prg,screenshot,100000000,vic20-8k,expect:error
+./selftest/,,exitcode,10000000,mountcrt:vic20-fail.crt,expect:error
+./selftest/,,exitcode,10000000,mountcrt:vic20-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:vic20-fail.crt,expect:error
+./selftest/,,screenshot,10000000,mountcrt:vic20-pass.crt
 #TODO:
 #../crtemulation/vic20
 #../VIC20/fe3diag/,f3diag.prg,exitcode,10000000
Modified: testprogs/testbench/selftest/Makefile
===================================================================
--- testprogs/testbench/selftest/Makefile	2024-04-08 17:48:53 UTC (rev 45100)
+++ testprogs/testbench/selftest/Makefile	2024-04-09 17:16:18 UTC (rev 45101)
@@ -12,6 +12,7 @@
 	c128-pass.d64 \
 	vic20-pass.prg vic20-fail.prg \
 	vic20-pass.d64 \
+	vic20-pass.crt vic20-fail.crt \
 	pet-pass.prg pet-fail.prg \
 	pet-pass.d82 \
 	cbm610-pass.prg cbm610-fail.prg \
@@ -55,9 +56,15 @@
 	c1541 -format "dtv pass,00" d64 dtv-pass.d64 \
 		-write dtv-pass.prg "dtv-pass"
 vic20-pass.prg: vic20.asm
-	acme -DFAIL=0 -f cbm -o vic20-pass.prg vic20.asm
+	acme -DEXPANDED=1 -DCART=0 -DFAIL=0 -f cbm -o vic20-pass.prg vic20.asm
 vic20-fail.prg: vic20.asm
-	acme -DFAIL=1 -f cbm -o vic20-fail.prg vic20.asm
+	acme -DEXPANDED=1 -DCART=0 -DFAIL=1 -f cbm -o vic20-fail.prg vic20.asm
+vic20-pass.crt: vic20.asm
+	acme -DEXPANDED=0 -DCART=1 -DFAIL=0 -f plain -o vic20-pass.bin vic20.asm
+	cartconv -p -t vic20 -l 0xa000 -i vic20-pass.bin -o vic20-pass.crt
+vic20-fail.crt: vic20.asm
+	acme -DEXPANDED=0 -DCART=1 -DFAIL=1 -f plain -o vic20-fail.bin vic20.asm
+	cartconv -p -t vic20 -l 0xa000 -i vic20-fail.bin -o vic20-fail.crt
 vic20-pass.d64: vic20-pass.prg
 	c1541 -format "vic20 pass,00" d64 vic20-pass.d64 \
 		-write vic20-pass.prg "vic20-pass"
@@ -93,3 +100,8 @@
 cbm510-pass.d82: cbm510-pass.prg
 	c1541 -format "cbm510 pass,00" d82 cbm510-pass.d82 \
 		-write cbm510-pass.prg "cbm510-pass"
+
+clean:
+	$(RM) *.prg
+	$(RM) *.bin
+	$(RM) *.crt
Modified: testprogs/testbench/selftest/c64-fail.crt
===================================================================
(Binary files differ)
Modified: testprogs/testbench/selftest/c64-pass.crt
===================================================================
(Binary files differ)
Added: testprogs/testbench/selftest/references/vic20-fail.crt.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/vic20-fail.crt.png
===================================================================
--- testprogs/testbench/selftest/references/vic20-fail.crt.png	2024-04-08 17:48:53 UTC (rev 45100)
+++ testprogs/testbench/selftest/references/vic20-fail.crt.png	2024-04-09 17:16:18 UTC (rev 45101)
Property changes on: testprogs/testbench/selftest/references/vic20-fail.crt.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/references/vic20-pass.crt.png
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/references/vic20-pass.crt.png
===================================================================
--- testprogs/testbench/selftest/references/vic20-pass.crt.png	2024-04-08 17:48:53 UTC (rev 45100)
+++ testprogs/testbench/selftest/references/vic20-pass.crt.png	2024-04-09 17:16:18 UTC (rev 45101)
Property changes on: testprogs/testbench/selftest/references/vic20-pass.crt.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Added: testprogs/testbench/selftest/vic20-fail.crt
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/vic20-fail.crt
===================================================================
--- testprogs/testbench/selftest/vic20-fail.crt	2024-04-08 17:48:53 UTC (rev 45100)
+++ testprogs/testbench/selftest/vic20-fail.crt	2024-04-09 17:16:18 UTC (rev 45101)
Property changes on: testprogs/testbench/selftest/vic20-fail.crt
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: testprogs/testbench/selftest/vic20-pass.crt
===================================================================
(Binary files differ)
Index: testprogs/testbench/selftest/vic20-pass.crt
===================================================================
--- testprogs/testbench/selftest/vic20-pass.crt	2024-04-08 17:48:53 UTC (rev 45100)
+++ testprogs/testbench/selftest/vic20-pass.crt	2024-04-09 17:16:18 UTC (rev 45101)
Property changes on: testprogs/testbench/selftest/vic20-pass.crt
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: testprogs/testbench/selftest/vic20.asm
===================================================================
--- testprogs/testbench/selftest/vic20.asm	2024-04-08 17:48:53 UTC (rev 45100)
+++ testprogs/testbench/selftest/vic20.asm	2024-04-09 17:16:18 UTC (rev 45101)
@@ -3,19 +3,41 @@
 DEBUGREG = $910f        ; http://sleepingelephant.com/ipw-web/bulletin/bb/viewtopic.php?f=2&t=7763&p=84058#p84058
 
 ; by default, VIC20 tests should run on +8K expanded VIC20
-;SCREENRAM = $1e00
+!if EXPANDED = 1 {
 SCREENRAM = $1000
-;COLORRAM = $9600
 COLORRAM = $9400
+} else {
+SCREENRAM = $1e00
+COLORRAM = $9600
+}
 
+!if CART = 0 {
             * = $1201
             !word eol,0
             !byte $9e, $34,$36,$32,$31, 0 ; SYS 4621
 eol:        !word 0
+} else {
+            * = $a000
 
+            !word start
+            !word start
+            !byte $41, $30, $c3, $c2, $cd
+}
+
 start:
 ; usually we want to SEI and set background to black at start
             sei
+!if CART = 1 {
+            ldx #$ff
+            txs
+            cld
+
+            JSR $FD8D ; initialise and test RAM
+            JSR $FD52 ; restore default I/O vectors
+            JSR $FDF9 ; initialize I/O registers
+            JSR $E518 ; initialise hardware
+}
+
             lda #$08
             sta SCREENCOLOR
 ; when a test starts, the screen- and color memory should be initialized
Modified: testprogs/testbench/vic20-testlist.in
===================================================================
--- testprogs/testbench/vic20-testlist.in	2024-04-08 17:48:53 UTC (rev 45100)
+++ testprogs/testbench/vic20-testlist.in	2024-04-09 17:16:18 UTC (rev 45101)
@@ -8,6 +8,10 @@
 ./selftest/,vic20-fail.prg,exitcode,100000000,vic20-8k,expect:error
 ./selftest/,vic20-pass.prg,screenshot,100000000,vic20-8k
 ./selftest/,vic20-fail.prg,screenshot,100000000,vic20-8k,expect:error
+./selftest/,,exitcode,10000000,mountcrt:vic20-fail.crt,expect:error
+./selftest/,,exitcode,10000000,mountcrt:vic20-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:vic20-fail.crt,expect:error
+./selftest/,,screenshot,10000000,mountcrt:vic20-pass.crt
 #TODO:
 #../crtemulation/vic20
 #../VIC20/fe3diag/,f3diag.prg,exitcode,10000000
Modified: testprogs/testbench/xvic-hooks.sh
===================================================================
--- testprogs/testbench/xvic-hooks.sh	2024-04-08 17:48:53 UTC (rev 45100)
+++ testprogs/testbench/xvic-hooks.sh	2024-04-09 17:16:18 UTC (rev 45101)
@@ -95,6 +95,11 @@
                     mounted_p64="${1:9}"
                     echo -ne "(disk:${1:9}) "
                 fi
+                if [ "${1:0:9}" == "mountcrt:" ]; then
+                    exitoptions="-cartcrt $2/${1:9}"
+                    mounted_crt="${1:9}"
+                    echo -ne "(cartridge:${1:9}) "
+                fi
             ;;
     esac
 }
Modified: testprogs/testbench/xvic-testlist.txt
===================================================================
--- testprogs/testbench/xvic-testlist.txt	2024-04-08 17:48:53 UTC (rev 45100)
+++ testprogs/testbench/xvic-testlist.txt	2024-04-09 17:16:18 UTC (rev 45101)
@@ -9,6 +9,10 @@
 ./selftest/,vic20-fail.prg,exitcode,100000000,vic20-8k,expect:error
 ./selftest/,vic20-pass.prg,screenshot,100000000,vic20-8k
 ./selftest/,vic20-fail.prg,screenshot,100000000,vic20-8k,expect:error
+./selftest/,,exitcode,10000000,mountcrt:vic20-fail.crt,expect:error
+./selftest/,,exitcode,10000000,mountcrt:vic20-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:vic20-fail.crt,expect:error
+./selftest/,,screenshot,10000000,mountcrt:vic20-pass.crt
 #TODO:
 #../crtemulation/vic20
 #../VIC20/fe3diag/,f3diag.prg,exitcode,10000000
Modified: testprogs/testbench/z64kvic20-testlist.txt
===================================================================
--- testprogs/testbench/z64kvic20-testlist.txt	2024-04-08 17:48:53 UTC (rev 45100)
+++ testprogs/testbench/z64kvic20-testlist.txt	2024-04-09 17:16:18 UTC (rev 45101)
@@ -9,6 +9,10 @@
 ./selftest/,vic20-fail.prg,exitcode,100000000,vic20-8k,expect:error
 ./selftest/,vic20-pass.prg,screenshot,100000000,vic20-8k
 ./selftest/,vic20-fail.prg,screenshot,100000000,vic20-8k,expect:error
+./selftest/,,exitcode,10000000,mountcrt:vic20-fail.crt,expect:error
+./selftest/,,exitcode,10000000,mountcrt:vic20-pass.crt
+./selftest/,,screenshot,10000000,mountcrt:vic20-fail.crt,expect:error
+./selftest/,,screenshot,10000000,mountcrt:vic20-pass.crt
 #TODO:
 #../crtemulation/vic20
 #../VIC20/fe3diag/,f3diag.prg,exitcode,10000000
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 |