]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Dynamic reset/hsync/vsync/etc callback function setup.
authorToni Wilen <twilen@winuae.net>
Sat, 31 Aug 2019 07:48:18 +0000 (10:48 +0300)
committerToni Wilen <twilen@winuae.net>
Sat, 31 Aug 2019 07:48:18 +0000 (10:48 +0300)
56 files changed:
a2065.cpp
a2091.cpp
akiko.cpp
arcadia.cpp
autoconf.cpp
cd32_fmv.cpp
cdtv.cpp
cdtvcr.cpp
cia.cpp
cpuboard.cpp
custom.cpp
devices.cpp
expansion.cpp
gayle.cpp
gfxboard.cpp
idecontrollers.cpp
include/a2065.h
include/a2091.h
include/akiko.h
include/arcadia.h
include/autoconf.h
include/cd32_fmv.h
include/cdtv.h
include/cdtvcr.h
include/cpuboard.h
include/devices.h
include/ethernet.h
include/gayle.h
include/gfxboard.h
include/idecontrollers.h
include/memory.h
include/ncr9x_scsi.h
include/ncr_scsi.h
include/pci.h
include/pci_hw.h
include/sana2.h
include/scsi.h
include/sndboard.h
include/uae/ppc.h
include/x86.h
inputdevice.cpp
main.cpp
memory.cpp
ncr9x_scsi.cpp
ncr_scsi.cpp
od-win32/ahidsound_new.cpp
od-win32/picasso96_win.cpp
od-win32/picasso96_win.h
od-win32/rp.cpp
pci.cpp
ppc/ppc.cpp
qemuvga/ne2000.cpp
sana2.cpp
scsi.cpp
sndboard.cpp
x86.cpp

index 468ffefaebac1d2c6daf8921a7041179e64e2626..be76b75f353e23f28fd7f7655135859736c82313 100644 (file)
--- a/a2065.cpp
+++ b/a2065.cpp
@@ -236,6 +236,26 @@ static int mungepacket (uae_u8 *packet, int len)
        return ret;
 }
 
+static void rethink_a2065(void)
+{
+       if (!configured)
+               return;
+       csr[0] &= ~CSR0_INTR;
+       uae_u16 mask = csr[0];
+       if (AM79C960)
+               mask &= (~csr[3]) & (0x4000 | 0x1000 | 0x800 | 0x400 | 0x200 | 0x100);
+       if (mask & (CSR0_BABL | CSR0_MISS | CSR0_MERR | CSR0_RINT | CSR0_TINT | CSR0_IDON))
+               csr[0] |= CSR0_INTR;
+       if ((csr[0] & (CSR0_INTR | CSR0_INEA)) == (CSR0_INTR | CSR0_INEA)) {
+               safe_interrupt_set(IRQ_SOURCE_A2065, 0, false);
+               if (log_a2065 > 2)
+                       write_log(_T("7990 +IRQ\n"));
+       }
+       if (log_a2065) {
+               write_log(_T("7990 -IRQ\n"));
+       }
+}
+
 static int mcfilter (const uae_u8 *data)
 {
        if (am_ladrf == 0) // multicast filter completely disabled?
@@ -563,7 +583,7 @@ static void check_transmit(bool tdmd)
        do_transmit ();
 }
 
-void a2065_hsync_handler (void)
+static void a2065_hsync_handler(void)
 {
        static int cnt;
 
@@ -574,26 +594,6 @@ void a2065_hsync_handler (void)
        }
 }
 
-void rethink_a2065 (void)
-{
-       if (!configured)
-               return;
-       csr[0] &= ~CSR0_INTR;
-       uae_u16 mask = csr[0];
-       if (AM79C960)
-               mask &= (~csr[3]) & (0x4000 | 0x1000 | 0x800 | 0x400 | 0x200 | 0x100);
-       if (mask & (CSR0_BABL | CSR0_MISS | CSR0_MERR | CSR0_RINT | CSR0_TINT | CSR0_IDON))
-               csr[0] |= CSR0_INTR;
-       if ((csr[0] & (CSR0_INTR | CSR0_INEA)) == (CSR0_INTR | CSR0_INEA)) {
-               safe_interrupt_set(IRQ_SOURCE_A2065, 0, false);
-               if (log_a2065 > 2)
-                       write_log(_T("7990 +IRQ\n"));
-       }
-       if (log_a2065) {
-               write_log(_T("7990 -IRQ\n"));
-       }
-}
-
 static void chip_init_mask(void)
 {
        am_rdr_rdra &= RAM_MASK;
@@ -1016,6 +1016,30 @@ static uae_u32 REGPARAM2 a2065_lgeti (uaecptr addr)
        return v;
 }
 
+static void a2065_reset(int hardreset)
+{
+       am_initialized = 0;
+       for (int i = 0; i < RAP_SIZE; i++)
+               csr[i] = 0;
+       csr[0] = CSR0_STOP;
+       csr[1] = csr[2] = csr[3] = 0;
+       csr[4] = 0x0115;
+       dbyteswap = 0;
+       rap = 0;
+
+       free_expansion_bank(&a2065_bank);
+       boardram = NULL;
+       ethernet_close(td, sysdata);
+       xfree(sysdata);
+       sysdata = NULL;
+       td = NULL;
+}
+
+static void a2065_free(void)
+{
+       a2065_reset(1);
+}
+
 static bool a2065_config (struct autoconfig_info *aci)
 {
        uae_u8 maco[3];
@@ -1023,6 +1047,8 @@ static bool a2065_config (struct autoconfig_info *aci)
        if (!aci)
                return false;
 
+       device_add_reset(a2065_reset);
+
        if (aci->postinit) {
                configured = expamem_board_pointer >> 16;
                return true;
@@ -1096,6 +1122,11 @@ static bool a2065_config (struct autoconfig_info *aci)
 
        alloc_expansion_bank(&a2065_bank, aci);
        boardram = a2065_bank.baseaddr + RAM_OFFSET;
+
+       device_add_hsync(a2065_hsync_handler);
+       device_add_rethink(rethink_a2065);
+       device_add_exit(a2065_free);
+
        return true;
 }
 
@@ -1143,28 +1174,4 @@ bool ariadne_init(struct autoconfig_info *aci)
        return a2065_config(aci);
 }
 
-void a2065_free(void)
-{
-       a2065_reset();
-}
-
-void a2065_reset(void)
-{
-       am_initialized = 0;
-       for (int i = 0; i < RAP_SIZE; i++)
-               csr[i] = 0;
-       csr[0] = CSR0_STOP;
-       csr[1] = csr[2] = csr[3] = 0;
-       csr[4] = 0x0115;
-       dbyteswap = 0;
-       rap = 0;
-
-       free_expansion_bank(&a2065_bank);
-       boardram = NULL;
-       ethernet_close(td, sysdata);
-       xfree(sysdata);
-       sysdata = NULL;
-       td = NULL;
-}
-
 #endif /* A2065 */
index e3148c311b54798279217147f8da7c27064e29b5..9ec9ac169fa5e09173574a1b2324859854ffcac1 100644 (file)
--- a/a2091.cpp
+++ b/a2091.cpp
 #define GVP_GFORCE_040_SCSI    0x30
 #define GVP_A1291                      0x46
 #define GVP_A1291_SCSI         0x47
-#define GVP_GFORCE_030         0xa0
-#define GVP_GFORCE_030_SCSI    0xb0
 #define GVP_COMBO_R4           0x60
 #define GVP_COMBO_R4_SCSI      0x70
+#define GVP_IO_EXTENDER                0x98
+#define GVP_GFORCE_030         0xa0
+#define GVP_GFORCE_030_SCSI    0xb0
+#define GVP_A530                       0xc0
+#define GVP_A530_SCSI          0xd0
 #define GVP_COMBO_R3           0xe0
 #define GVP_COMBO_R3_SCSI      0xf0
 #define GVP_SERIESII           0xf8
-#define GVP_A530                       0xc0
-#define GVP_A530_SCSI          0xd0
 
 /* wd register names */
 #define WD_OWN_ID              0x00
@@ -283,6 +284,9 @@ static uae_u8 gvp_accelerator_bank;
 
 static struct wd_state *scsi_units[MAX_SCSI_UNITS + 1];
 
+static void wd_init(void);
+static void wd_addreset(void);
+
 static void freencrunit(struct wd_state *wd)
 {
        if (!wd)
@@ -462,7 +466,7 @@ static bool is_dma_enabled(struct wd_state *wds)
        return false;
 }
 
-void rethink_a2091 (void)
+static void rethink_a2091(void)
 {
        if (!configured)
                return;
@@ -1537,7 +1541,7 @@ static void scsi_hsync2_comspec(struct wd_state *wds)
        wd_check_interrupt(wds, false);
 }
 
-void scsi_hsync (void)
+static void scsi_hsync(void)
 {
        for (int i = 0; i < MAX_DUPLICATE_EXPANSION_BOARDS; i++) {
                scsi_hsync2_a2091(wd_a2091[i]);
@@ -3181,7 +3185,7 @@ static uae_u32 dmac_gvp_read_word(struct wd_state *wd, uaecptr addr)
                                v = wd->gdmac.cntr;
                                break;
                                case 0x68:
-                               v = wd->gdmac.bank;
+                               v = (wd->gdmac.bank << 6) | (wd->gdmac.maprom & 0x3f);
                                break;
                                case 0x70:
                                v = wd->gdmac.addr >> 16;
@@ -3356,6 +3360,8 @@ static void dmac_gvp_write_word(struct wd_state *wd, uaecptr addr, uae_u32 b)
                        case 0x68: // bank
                        wd->gdmac.bank_ptr = &wd->gdmac.bank;
                        wd->gdmac.bank = b >> 6;
+                       wd->gdmac.maprom = b & 0x3f;
+                       cpuboard_gvpmaprom((b >> 1) & 7);
                        break;
                        case 0x70: // ACR
                        wd->gdmac.addr &= 0x0000ffff;
@@ -3895,6 +3901,7 @@ void init_wd_scsi (struct wd_state *wd)
                init_comm_pipe (&wd->requests, 100, 1);
                uae_start_thread (_T("scsi"), scsi_thread, wd, NULL);
        }
+       wd_init();
 }
 
 void a3000_add_scsi_unit (int ch, struct uaedev_config_info *ci, struct romconfig *rc)
@@ -3911,6 +3918,7 @@ bool a3000scsi_init(struct autoconfig_info *aci)
        aci->start = 0xdd0000;
        aci->size = 0x10000;
        aci->hardwired = true;
+       wd_addreset();
        if (!aci->doinit) {
                return true;
        }
@@ -3925,10 +3933,11 @@ bool a3000scsi_init(struct autoconfig_info *aci)
        map_banks(&mbdmac_a3000_bank, wd->baseaddress >> 16, 1, 0);
        wd_cmd_reset (&wd->wc, false, false);
        reset_dmac(wd);
+       wd_init();
        return true;
 }
 
-void a3000scsi_free (void)
+static void a3000scsi_free (void)
 {
        struct wd_state *wd = wd_a3000;
        if (!wd)
@@ -3994,7 +4003,7 @@ static void a2091_free_device (struct wd_state *wd)
        freencrunit(wd);
 }
 
-void a2091_free (void)
+static void a2091_free(void)
 {
        for (int i = 0; i < MAX_DUPLICATE_EXPANSION_BOARDS; i++) {
                a2091_free_device(wd_a2091[i]);
@@ -4031,7 +4040,7 @@ static void a2090_reset_device(struct wd_state *wd)
        reset_dmac(wd);
 }
 
-void a2091_reset (void)
+static void a2091_reset(int hardreset)
 {
        for (int i = 0; i < MAX_DUPLICATE_EXPANSION_BOARDS; i++) {
                a2091_reset_device(wd_a2091[i]);
@@ -4056,6 +4065,7 @@ bool a2091_init (struct autoconfig_info *aci)
        ew (aci->autoconfig_raw, 0x20, 0x00); /* ser.no. Byte 2 */
        ew (aci->autoconfig_raw, 0x24, 0x00); /* ser.no. Byte 3 */
 
+       wd_addreset();
        aci->label = _T("A2091");
        if (!aci->doinit)
                return true;
@@ -4119,6 +4129,7 @@ bool a2091_init (struct autoconfig_info *aci)
                }
        }
        aci->addrbank = &wd->bank;
+       wd_init();
        return true;
 }
 
@@ -4139,6 +4150,7 @@ static bool a2090x_init (struct autoconfig_info *aci, bool combitec)
        ew(aci->autoconfig_raw, 0x20, 0x00); /* ser.no. Byte 2 */
        ew(aci->autoconfig_raw, 0x24, 0x00); /* ser.no. Byte 3 */
 
+       wd_addreset();
        aci->label = _T("A2090");
        if (!aci->doinit) {
                return true;
@@ -4183,6 +4195,8 @@ static bool a2090x_init (struct autoconfig_info *aci, bool combitec)
                }
        }
 
+       wd_init();
+
        return true;
 }
 
@@ -4224,7 +4238,7 @@ static void gvp_free_device (struct wd_state *wd)
        freencrunit(wd);
 }
 
-void gvp_free (void)
+static void gvp_free(void)
 {
        for (int i = 0; i < MAX_DUPLICATE_EXPANSION_BOARDS; i++) {
                gvp_free_device(wd_gvps1[i]);
@@ -4247,7 +4261,7 @@ static void gvp_reset_device(struct wd_state *wd)
        reset_dmac(wd);
 }
 
-void gvp_reset (void)
+static void gvp_reset(int hardreset)
 {
        for (int i = 0; i < MAX_DUPLICATE_EXPANSION_BOARDS; i++) {
                gvp_reset_device(wd_gvps1[i]);
@@ -4285,11 +4299,12 @@ static bool gvp_init(struct autoconfig_info *aci, bool series2, bool accel)
                aci->label = series2 ? _T("GVP SCSI S2") : _T("GVP SCSI S1");
        } else {
                romtype = ROMTYPE_CPUBOARD;
-               aci->label = _T("GVP Acclerator SCSI");
+               aci->label = _T("GVP Accelerator SCSI");
                gvp_accelerator_bank = 0;
                autoboot_disabled = currprefs.cpuboard_settings & 1;
        }
 
+       wd_addreset();
        if (!aci->doinit) {
                aci->autoconfigp = ac;
                return true;
@@ -4411,6 +4426,7 @@ static bool gvp_init(struct autoconfig_info *aci, bool series2, bool accel)
                ew(wd->dmacmemory, i * 4, b);
        }
        gvp_reset_device(wd);
+       wd_init();
        return true;
 }
 
@@ -4455,6 +4471,7 @@ bool comspec_init (struct autoconfig_info *aci)
 {
        comspec_ac(aci);
        aci->label = _T("COMSPEC");
+       wd_addreset();
        if (!aci->doinit)
                return true;
 
@@ -4462,6 +4479,7 @@ bool comspec_init (struct autoconfig_info *aci)
        if (!wd)
                return false;
 
+       wd_init();
        return true;
 }
 
@@ -4520,6 +4538,20 @@ void comspec_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconf
        add_scsi_device(&wd->scsis[ch], ch, ci, rc);
 }
 
+static void wd_addreset(void)
+{
+       device_add_reset(a2091_reset);
+       device_add_reset(gvp_reset);
+}
+
+static void wd_init(void)
+{
+       device_add_hsync(scsi_hsync);
+       device_add_rethink(rethink_a2091);
+       device_add_exit(a2091_free);
+       device_add_exit(gvp_free);
+       device_add_exit(a3000scsi_free);
+}
 
 #if 0
 uae_u8 *save_scsi_dmac (int wdtype, int *len, uae_u8 *dstptr)
index 0a1510674151bbc0dbd672a0f1f2c6ec18329e59..600a2c68fc01b15a045a7f6164b5be4708333bb8 100644 (file)
--- a/akiko.cpp
+++ b/akiko.cpp
@@ -502,7 +502,7 @@ static void set_status (uae_u32 status)
        cdrom_led ^= LED_CD_ACTIVE2;
 }
 
-void rethink_akiko (void)
+static void rethink_akiko(void)
 {
        checkint ();
 }
@@ -1418,7 +1418,7 @@ static void akiko_internal (void)
        }
 }
 
-void AKIKO_hsync_handler (void)
+static void AKIKO_hsync_handler (void)
 {
        bool framesync = false;
 
@@ -2039,7 +2039,7 @@ static void akiko_cdrom_free (void)
        sector_buffer_info_2 = 0;
 }
 
-void akiko_reset (void)
+void akiko_reset(int hardreset)
 {
        cdaudiostop_do ();
        nvram_read ();
@@ -2074,16 +2074,17 @@ void akiko_reset (void)
        akiko_inited = false;
 }
 
-void akiko_free (void)
+static void akiko_free(void)
 {
-       akiko_reset ();
-       akiko_cdrom_free ();
+       akiko_reset(1);
+       akiko_cdrom_free();
 }
 
 int akiko_init (void)
 {
        if (!currprefs.cs_cd32cd)
                return 0;
+       device_add_reset_imm(akiko_reset);
        akiko_free ();
        akiko_precalculate ();
        unitnum = -1;
@@ -2109,6 +2110,11 @@ int akiko_init (void)
        }
        gui_flicker_led (LED_HD, 0, -1);
        akiko_inited = true;
+
+       device_add_hsync(AKIKO_hsync_handler);
+       device_add_exit(akiko_free);
+       device_add_rethink(rethink_akiko);
+
        return 1;
 }
 
index 5437820a1685114308cb1a55f1e8e7713277f17d..42387735cdd7d8b4b7def37ed200e5a3b4c6c02c 100644 (file)
@@ -28,6 +28,7 @@
 #include "statusline.h"
 #include "rommgr.h"
 #include "flashrom.h"
+#include "devices.h"
 
 #define CUBO_DEBUG 1
 
@@ -475,6 +476,28 @@ static void nvram_read (void)
        zfile_fclose (f);
 }
 
+static void alg_vsync(void);
+static void cubo_vsync(void);
+static void arcadia_vsync(void)
+{
+       if (alg_flag)
+               alg_vsync();
+       if (cubo_enabled)
+               cubo_vsync();
+
+       if (arcadia_bios) {
+               static int cnt;
+               cnt--;
+               if (cnt > 0)
+                       return;
+               cnt = 50;
+               if (!nvwrite)
+                       return;
+               nvram_write();
+               nvwrite = 0;
+       }
+}
+
 void arcadia_unmap (void)
 {
        xfree (arbmemory);
@@ -502,31 +525,10 @@ int arcadia_map_banks (void)
        nvram_read ();
        multigame (0);
        map_banks (&arcadia_boot_bank, 0xf0, 8, 0);
+       device_add_vsync_pre(arcadia_vsync);
        return 1;
 }
 
-void alg_vsync(void);
-void cubo_vsync(void);
-void arcadia_vsync (void)
-{
-       if (alg_flag)
-               alg_vsync();
-       if (cubo_enabled)
-               cubo_vsync();
-
-       if (arcadia_bios) {
-               static int cnt;
-               cnt--;
-               if (cnt > 0)
-                       return;
-               cnt = 50;
-               if (!nvwrite)
-                       return;
-               nvram_write ();
-               nvwrite = 0;
-       }
-}
-
 uae_u8 arcadia_parport (int port, uae_u8 pra, uae_u8 dra)
 {
        uae_u8 v;
@@ -1032,6 +1034,7 @@ void alg_map_banks(void)
        ld_wait_ack = 0;
        ld_direction = 0;
        ser_buf_offset = 0;
+       device_add_vsync_pre(arcadia_vsync);
 }
 
 static TCHAR cubo_pic_settings[ROMCONFIG_CONFIGTEXT_LEN];
@@ -1585,7 +1588,7 @@ void cubo_function(int v)
        dip_delay[c] = 5;
 }
 
-void cubo_vsync(void)
+static void cubo_vsync(void)
 {
        for (int i = 0; i < 16; i++) {
                if (dip_delay[i] >= 3) {
@@ -1607,18 +1610,7 @@ static addrbank cubo_bank = {
        NULL, 0x3fffff, 0x600000, 0x600000
 };
 
-bool cubo_init(struct autoconfig_info *aci)
-{
-       aci->start = 0x00600000;
-       aci->size  = 0x00400000;
-       if (!aci->doinit)
-               return true;
-       map_banks(&cubo_bank, aci->start >> 16, aci->size >> 16, 0);
-       aci->addrbank = &cubo_bank;
-       return true;
-}
-
-void arcadia_reset(void)
+static void arcadia_reset(int hardreset)
 {
        cubo_enabled = is_board_enabled(&currprefs, ROMTYPE_CUBO, 0);
        i2c_free(cubo_rtc);
@@ -1630,7 +1622,7 @@ void arcadia_reset(void)
        cubo_pic_settings[0] = 0;
 }
 
-void check_arcadia_prefs_changed(void)
+static void check_arcadia_prefs_changed(void)
 {
        if (!config_changed)
                return;
@@ -1642,3 +1634,18 @@ void check_arcadia_prefs_changed(void)
        cubo_settings = brc->roms[0].device_settings;
        _tcscpy(cubo_pic_settings, brc->roms[0].configtext);
 }
+
+bool cubo_init(struct autoconfig_info *aci)
+{
+       aci->start = 0x00600000;
+       aci->size  = 0x00400000;
+       device_add_reset(arcadia_reset);
+       if (!aci->doinit)
+               return true;
+       map_banks(&cubo_bank, aci->start >> 16, aci->size >> 16, 0);
+       aci->addrbank = &cubo_bank;
+       device_add_check_config(check_arcadia_prefs_changed);
+       device_add_vsync_pre(arcadia_vsync);
+       return true;
+}
+
index 269501f763858fcb432a5c2ad4f06927717f95d0..e720801b4dcd5340049edea05aac842c755e5bc8 100644 (file)
@@ -25,6 +25,7 @@
 #include "native2amiga.h"
 #include "inputdevice.h"
 #include "uae/ppc.h"
+#include "devices.h"
 
 /* Commonly used autoconfig strings */
 
@@ -82,7 +83,7 @@ static bool istrapwait(void)
        return false;
 }
 
-bool rethink_traps(void)
+static bool rethink_traps2(void)
 {
        if (currprefs.uaeboard < 2)
                return false;
@@ -96,6 +97,12 @@ bool rethink_traps(void)
        }
 }
 
+static void rethink_traps(void)
+{
+       rethink_traps2();
+}
+
+
 #define RTAREA_WRITEOFFSET 0xfff0
 
 static bool rtarea_trap_data(uaecptr addr)
@@ -192,7 +199,7 @@ static uae_u32 REGPARAM2 rtarea_bget (uaecptr addr)
        } else if (addr == RTAREA_INTREQ + 1) {
                rtarea_bank.baseaddr[addr] = hwtrap_waiting != 0;
        } else if (addr == RTAREA_INTREQ + 2) {
-               if (rethink_traps()) {
+               if (rethink_traps2()) {
                        rtarea_bank.baseaddr[addr] = 1;
                } else {
                        rtarea_bank.baseaddr[addr] = 0;
@@ -642,6 +649,10 @@ void rtarea_init(void)
 
        org (RTAREA_TRAPS | rtarea_base);
        init_extended_traps ();
+
+       if (currprefs.uaeboard >= 2) {
+               device_add_rethink(rethink_traps);
+       }
 }
 
 volatile uae_atomic uae_int_requested = 0;
index 8c12e810ec15125358323dee65b77a58a9157d92..993fd4fef67a68b462a50a1a81579881d30a3715 100644 (file)
@@ -346,7 +346,7 @@ static addrbank fmv_ram_bank = {
 MEMORY_FUNCTIONS(fmv_rom);
 MEMORY_FUNCTIONS(fmv_ram);
 
-void rethink_cd32fmv(void)
+static void rethink_cd32fmv(void)
 {
        if (!fmv_ram_bank.baseaddr)
                return;
@@ -1474,7 +1474,7 @@ static void cd32_fmv_audio_handler(void)
        l64111_regs[A_CB_STATUS] -= PCM_SECTORS;
 }
 
-void cd32_fmv_hsync_handler(void)
+static void cd32_fmv_hsync_handler(void)
 {
        if (!fmv_ram_bank.baseaddr)
                return;
@@ -1525,14 +1525,14 @@ void cd32_fmv_hsync_handler(void)
 }
 
 
-void cd32_fmv_reset(void)
+static void cd32_fmv_reset(int hardreset)
 {
        if (fmv_ram_bank.baseaddr)
                memset(fmv_ram_bank.baseaddr, 0, fmv_ram_bank.allocated_size);
        cd32_fmv_state(0);
 }
 
-void cd32_fmv_free(void)
+static void cd32_fmv_free(void)
 {
        mapped_free(&fmv_rom_bank);
        mapped_free(&fmv_ram_bank);
@@ -1562,6 +1562,7 @@ void cd32_fmv_free(void)
 
 addrbank *cd32_fmv_init (struct autoconfig_info *aci)
 {
+       device_add_reset_imm(cd32_fmv_reset);
        cd32_fmv_free();
        write_log (_T("CD32 FMV mapped @$%x\n"), expamem_board_pointer);
        if (expamem_board_pointer != fmv_start) {
@@ -1604,6 +1605,12 @@ addrbank *cd32_fmv_init (struct autoconfig_info *aci)
        map_banks(&fmv_ram_bank, (fmv_start + RAM_BASE) >> 16, fmv_ram_size >> 16, 0);
        map_banks(&fmv_bank, (fmv_start + IO_BASE) >> 16, (RAM_BASE - IO_BASE) >> 16, 0);
        uae_sem_init(&play_sem, 0, 1);
-       cd32_fmv_reset();
+       cd32_fmv_reset(1);
+
+       device_add_hsync(cd32_fmv_hsync_handler);
+       device_add_vsync_pre(cd32_fmv_vsync_handler);
+       device_add_exit(cd32_fmv_free);
+       device_add_rethink(rethink_cd32fmv);
+
        return &fmv_rom_bank;
 }
index ad863f88033fb83229151f7c09110cb0198149f6..ea2ecaf48d66c3a6dd49adcc9bc8a5c9c72866a5 100644 (file)
--- a/cdtv.cpp
+++ b/cdtv.cpp
@@ -1104,14 +1104,14 @@ void cdtv_scsi_clear_int (void)
        dmac_istr &= ~ISTR_INTS;
 }
 
-void rethink_cdtv (void)
+static void rethink_cdtv (void)
 {
        checkint ();
        tp_check_interrupts ();
 }
 
 
-void CDTV_hsync_handler (void)
+static void CDTV_hsync_handler (void)
 {
        static int subqcnt;
 
@@ -1647,7 +1647,7 @@ static addrbank cardmem_bank = {
        ABFLAG_RAM, 0, 0
 };
 
-void cdtv_free (void)
+static void cdtv_free (void)
 {
        if (thread_alive > 0) {
                dmac_dma = 0;
@@ -1751,6 +1751,11 @@ bool cdtv_init(struct autoconfig_info *aci)
        cdtv_battram_reset ();
        open_unit ();
        gui_flicker_led (LED_CD, 0, -1);
+
+       device_add_hsync(CDTV_hsync_handler);
+       device_add_rethink(rethink_cdtv);
+       device_add_exit(cdtv_free);
+
        return true;
 }
 
index f9ca1849c048df6bf09720d9a0ea72250c204f8c..5113a3d00299fa278681760d5d387bf2da04aa0f 100644 (file)
@@ -250,7 +250,7 @@ static void cdtvcr_4510_reset(uae_u8 v)
                get_toc();
 }
 
-void rethink_cdtvcr(void)
+static void rethink_cdtvcr(void)
 {
        if ((cdtvcr_4510_ram[CDTVCR_INTREQ] & cdtvcr_4510_ram[CDTVCR_INTENA]) && !cdtvcr_4510_ram[CDTVCR_INTDISABLE]) {
                safe_interrupt_set(IRQ_SOURCE_CD32CDTV, 0, false);
@@ -901,7 +901,7 @@ static void *dev_thread (void *p)
        }
 }
 
-void CDTVCR_hsync_handler (void)
+static void CDTVCR_hsync_handler (void)
 {
        static int subqcnt, readcnt;
 
@@ -994,18 +994,7 @@ static void close_unit (void)
        unitnum = -1;
 }
 
-bool cdtvcr_init(struct autoconfig_info *aci)
-{
-       aci->start = 0xb80000;
-       aci->size = 0x10000;
-       aci->zorro = 0;
-       if (!aci->doinit)
-               return true;
-       map_banks(&cdtvcr_bank, 0xB8, 1, 0);
-       return true;
-}
-
-void cdtvcr_reset(void)
+static void cdtvcr_reset(int hardreset)
 {
        if (!currprefs.cs_cdtvcr)
                return;
@@ -1030,7 +1019,7 @@ void cdtvcr_reset(void)
 #endif
 }
 
-void cdtvcr_free(void)
+static void cdtvcr_free(void)
 {
        if (thread_alive > 0) {
                write_comm_pipe_u32 (&requests, 0xffff, 1);
@@ -1042,6 +1031,23 @@ void cdtvcr_free(void)
        close_unit ();
 }
 
+bool cdtvcr_init(struct autoconfig_info *aci)
+{
+       aci->start = 0xb80000;
+       aci->size = 0x10000;
+       aci->zorro = 0;
+       device_add_reset(cdtvcr_reset);
+       if (!aci->doinit)
+               return true;
+       map_banks(&cdtvcr_bank, 0xB8, 1, 0);
+
+       device_add_hsync(CDTVCR_hsync_handler);
+       device_add_rethink(rethink_cdtvcr);
+       device_add_exit(cdtvcr_free);
+
+       return true;
+}
+
 #if CDTVCR_4510_EMULATION
 
 // VICE 65C02 emulator, waiting for future full CDTV-CR 4510 emulation.
diff --git a/cia.cpp b/cia.cpp
index 4cdfb29f3614f8291744ed2c7bf61b7629847420..4d4ed98945aafb84bea4f58e6d6afe29142f34f3 100644 (file)
--- a/cia.cpp
+++ b/cia.cpp
@@ -1796,9 +1796,9 @@ void CIA_reset (void)
                }
        }
 #ifdef CD32
-       if (!isrestore ()) {
-               akiko_reset ();
-               if (!akiko_init ())
+       if (!isrestore()) {
+               akiko_reset(1);
+               if (!akiko_init())
                        currprefs.cs_cd32cd = changed_prefs.cs_cd32cd = 0;
        }
 #endif
index 3b951d2fe696fa5aa956993e54b31f4dace8f06b..cef382bfa19a848c4b3d0837dd34ec71d203db32 100644 (file)
@@ -996,6 +996,48 @@ static void csamagnum40_domaprom(void)
        }
 }
 
+static const uae_u32 gvp_a530_maprom[7] =
+{
+       0, 0, 0,
+       0x280000,
+       0x580000,
+       0x380000,
+       0x980000
+};
+
+void cpuboard_gvpmaprom(int b)
+{
+       if (!ISCPUBOARDP(&currprefs, BOARD_GVP, BOARD_GVP_SUB_A530) &&
+               !ISCPUBOARDP(&currprefs, BOARD_GVP, BOARD_GVP_SUB_GFORCE030))
+               return;
+
+       write_log(_T("GVP MAPROM=%d\n"), b);
+       if (b < 0 || b > 7)
+               return;
+       if (!b) {
+               if (maprom_state)
+                       reload_roms();
+               maprom_state = 0;
+       } else {
+               const uae_u32* addrp = 0;
+               maprom_state = b;
+               if (ISCPUBOARDP(&currprefs, BOARD_GVP, BOARD_GVP_SUB_A530)) {
+                       addrp = gvp_a530_maprom;
+               }
+               if (addrp) {
+                       uae_u32 addr = addrp[b];
+                       if (addr) {
+                               uae_u8 *src = get_real_address(addr);
+                               uae_u8 *dst = kickmem_bank.baseaddr;
+                               protect_roms(false);
+                               memcpy(dst, src, 524288);
+                               protect_roms(true);
+                               set_roms_modified();
+                       }
+               }
+       }
+}
+
 bool cpuboard_is_ppcboard_irq(void)
 {
        if (is_csmk3(&currprefs) || is_blizzardppc(&currprefs)) {
@@ -1501,7 +1543,7 @@ static void REGPARAM2 blizzardio_lput(uaecptr addr, uae_u32 v)
        }
 }
 
-void cpuboard_hsync(void)
+static void cpuboard_hsync(void)
 {
        // we should call check_ppc_int_lvl() immediately
        // after PPC CPU's interrupt flag is cleared but this
@@ -1511,7 +1553,7 @@ void cpuboard_hsync(void)
        }
 }
 
-void cpuboard_vsync(void)
+static void cpuboard_vsync(void)
 {
        if (delayed_rom_protect <= 0)
                return;
@@ -1654,9 +1696,8 @@ void cpuboard_map(void)
        }
 }
 
-void cpuboard_reset(void)
+void cpuboard_reset(int hardreset)
 {
-       bool hardreset = is_hardreset();
 #if 0
        if (is_blizzard() || is_blizzardppc())
                canbang = 0;
@@ -2412,6 +2453,8 @@ bool cpuboard_autoconfig_init(struct autoconfig_info *aci)
        if (brc)
                romname = brc->roms[idx].romfile;
 
+       device_add_reset(cpuboard_reset);
+
        cpuboard_non_byte_ea = false;
        int boardid = cpuboards[p->cpuboard_type].id;
        switch (boardid)
@@ -2963,5 +3006,9 @@ bool cpuboard_autoconfig_init(struct autoconfig_info *aci)
                        map_banks(&blizzardf0_bank, 0xf00000 >> 16, (f0rom_size > 262144 ? 262144 : f0rom_size) >> 16, 0);
                }
        }
+
+       device_add_vsync_pre(cpuboard_vsync);
+       device_add_hsync(cpuboard_hsync);
+
        return true;
 }
index 45cf7b040e090c4f466e33431b074024e851bb95..fea226d5311fc565b12679514b92c0c2410f876f 100644 (file)
@@ -9888,7 +9888,7 @@ void custom_reset (bool hardreset, bool keyboardreset)
                board_prefs_changed(-1, -1);
 
        target_reset ();
-       reset_all_systems ();
+       devices_reset(hardreset);
        write_log (_T("Reset at %08X. Chipset mask = %08X\n"), M68K_GETPC, currprefs.chipset_mask);
        memory_map_dump ();
 
@@ -9963,7 +9963,6 @@ void custom_reset (bool hardreset, bool keyboardreset)
                init_sprites ();
        }
 
-       devices_reset(hardreset);
        specialmonitor_reset();
 
        unset_special (~(SPCFLAG_BRK | SPCFLAG_MODE_CHANGE));
@@ -10084,12 +10083,6 @@ void custom_reset (bool hardreset, bool keyboardreset)
        setup_fmodes (0);
        shdelay_disabled = false;
 
-       // must be after audio reset
-       // this inits first autoconfig board
-#ifdef AUTOCONFIG
-       expamem_reset();
-#endif
-
 #ifdef ACTION_REPLAY
        /* Doing this here ensures we can use the 'reset' command from within AR */
        action_replay_reset (hardreset, keyboardreset);
@@ -10101,9 +10094,11 @@ void custom_reset (bool hardreset, bool keyboardreset)
        if (hardreset)
                rtc_hardreset();
 
-#ifdef PICASSO96
-       picasso_reset(0);
+       // must be last
+#ifdef AUTOCONFIG
+       expamem_reset(hardreset);
 #endif
+
 }
 
 void dumpcustom (void)
index f60f8af521a50cf490bedadcca2e71c2abf5c21b..5dc04dbdaa00ad83e9de192d8aae04e0535b3bfd 100644 (file)
@@ -5,14 +5,9 @@
 
 #include "options.h"
 #include "threaddep/thread.h"
-#include "traps.h"
 #include "memory.h"
 #include "audio.h"
-#include "a2091.h"
-#include "a2065.h"
 #include "gfxboard.h"
-#include "ncr_scsi.h"
-#include "ncr9x_scsi.h"
 #include "scsi.h"
 #include "scsidev.h"
 #include "sana2.h"
 #include "statusline.h"
 #include "uae/ppc.h"
 #include "cd32_fmv.h"
-#include "cdtv.h"
-#include "cdtvcr.h"
 #include "akiko.h"
-#include "gayle.h"
-#include "idecontrollers.h"
 #include "disk.h"
 #include "cia.h"
 #include "inputdevice.h"
-#include "picasso96.h"
 #include "blkdev.h"
 #include "parallel.h"
-#include "picasso96.h"
 #include "autoconf.h"
 #include "sampler.h"
 #include "newcpu.h"
 #include "tabletlibrary.h"
 #include "luascript.h"
 #include "driveclick.h"
-#include "pci.h"
-#include "pci_hw.h"
 #include "x86.h"
 #include "ethernet.h"
 #include "drawing.h"
 #include "videograb.h"
-#include "arcadia.h"
 #include "rommgr.h"
 #include "newcpu.h"
 #ifdef RETROPLATFORM
 #include "rp.h"
 #endif
 
+#define MAX_DEVICE_ITEMS 64
+
+static void add_device_item(DEVICE_VOID *pp, int *cnt, DEVICE_VOID p)
+{
+       for (int i = 0; i < *cnt; i++) {
+               if (pp[i] == p)
+                       return;
+       }
+       if (*cnt >= MAX_DEVICE_ITEMS) {
+               return;
+       }
+       pp[(*cnt)++] = p;
+}
+static void execute_device_items(DEVICE_VOID *pp, int cnt)
+{
+       for (int i = 0; i < cnt; i++) {
+               pp[i]();
+       }
+}
+
+static int device_configs_cnt;
+static DEVICE_VOID device_configs[MAX_DEVICE_ITEMS];
+static int device_vsync_pre_cnt;
+static DEVICE_VOID device_vsyncs_pre[MAX_DEVICE_ITEMS];
+static int device_vsync_post_cnt;
+static DEVICE_VOID device_vsyncs_post[MAX_DEVICE_ITEMS];
+static int device_hsync_cnt;
+static DEVICE_VOID device_hsyncs[MAX_DEVICE_ITEMS];
+static int device_rethink_cnt;
+static DEVICE_VOID device_rethinks[MAX_DEVICE_ITEMS];
+static int device_leave_cnt;
+static DEVICE_VOID device_leaves[MAX_DEVICE_ITEMS];
+static int device_resets_cnt;
+static DEVICE_INT device_resets[MAX_DEVICE_ITEMS];
+static bool device_reset_done[MAX_DEVICE_ITEMS];
+
+static void reset_device_items(void)
+{
+       device_configs_cnt = 0;
+       device_vsync_pre_cnt = 0;
+       device_vsync_post_cnt = 0;
+       device_hsync_cnt = 0;
+       device_rethink_cnt = 0;
+       device_resets_cnt = 0;
+       device_leave_cnt = 0;
+       memset(device_reset_done, 0, sizeof(device_reset_done));
+}
+
+void device_add_vsync_pre(DEVICE_VOID p)
+{
+       add_device_item(device_vsyncs_pre, &device_vsync_pre_cnt, p);
+}
+void device_add_vsync_post(DEVICE_VOID p)
+{
+       add_device_item(device_vsyncs_post, &device_vsync_post_cnt, p);
+}
+void device_add_hsync(DEVICE_VOID p)
+{
+       add_device_item(device_hsyncs, &device_hsync_cnt, p);
+}
+void device_add_rethink(DEVICE_VOID p)
+{
+       add_device_item(device_rethinks, &device_rethink_cnt, p);
+}
+void device_add_check_config(DEVICE_VOID p)
+{
+       add_device_item(device_configs, &device_configs_cnt, p);
+}
+void device_add_exit(DEVICE_VOID p)
+{
+       add_device_item(device_leaves, &device_leave_cnt, p);
+}
+void device_add_reset(DEVICE_INT p)
+{
+       for (int i = 0; i < device_resets_cnt; i++) {
+               if (device_resets[i] == p)
+                       return;
+       }
+       device_resets[device_resets_cnt++] = p;
+}
+void device_add_reset_imm(DEVICE_INT p)
+{
+       for (int i = 0; i < device_resets_cnt; i++) {
+               if (device_resets[i] == p)
+                       return;
+       }
+       device_reset_done[device_resets_cnt] = true;
+       device_resets[device_resets_cnt++] = p;
+       p(1);
+}
+
 void device_check_config(void)
 {
+       execute_device_items(device_configs, device_configs_cnt);
+
        check_prefs_changed_cd();
        check_prefs_changed_audio();
        check_prefs_changed_custom();
        check_prefs_changed_cpu();
        check_prefs_picasso();
-       check_prefs_changed_gayle();
-       check_arcadia_prefs_changed();
+}
+
+void devices_reset_ext(int hardreset)
+{
+       for (int i = 0; i < device_resets_cnt; i++) {
+               if (!device_reset_done[i]) {
+                       device_resets[i](hardreset);
+                       device_reset_done[i] = true;
+               }
+       }
 }
 
 void devices_reset(int hardreset)
 {
-       gayle_reset (hardreset);
-       idecontroller_reset();
-       a1000_reset ();
-       DISK_reset ();
-       CIA_reset ();
-       gayle_reset (0);
-       soft_scsi_reset();
-#ifdef A2091
-       a2091_reset ();
-       gvp_reset ();
+       memset(device_reset_done, 0, sizeof(device_reset_done));
+       // must be first
+       init_eventtab();
+       init_shm();
+       memory_reset();
+       DISK_reset();
+       CIA_reset();
+       a1000_reset();
+#ifdef JIT
+       compemu_reset();
+#endif
+#ifdef WITH_PPC
+       uae_ppc_reset(is_hardreset());
+#endif
+       native2amiga_reset();
+#ifdef SCSIEMU
+       scsi_reset();
+       scsidev_reset();
+       scsidev_start_threads();
 #endif
 #ifdef GFXBOARD
        gfxboard_reset ();
 #endif
-#ifdef WITH_TOCCATA
-       sndboard_reset();
-       uaesndboard_reset();
+#ifdef DRIVESOUND
+       driveclick_reset();
 #endif
-#ifdef NCR
-       ncr_reset();
+       ethernet_reset();
+#ifdef FILESYS
+       filesys_prepare_reset();
+       filesys_reset();
 #endif
-#ifdef NCR9X
-       ncr9x_reset();
+#if defined (BSDSOCKET)
+       bsdlib_reset();
 #endif
-#ifdef WITH_PCI
-       pci_reset();
+#ifdef FILESYS
+       filesys_start_threads();
+       hardfile_reset();
 #endif
-#ifdef WITH_X86
-       x86_bridge_reset();
+#ifdef UAESERIAL
+       uaeserialdev_reset();
+       uaeserialdev_start_threads();
 #endif
-#ifdef JIT
-       compemu_reset ();
+#if defined (PARALLEL_PORT)
+       initparallel();
 #endif
+       dongle_reset();
+       sampler_init();
+       device_func_reset();
 #ifdef AUTOCONFIG
        rtarea_reset();
 #endif
-#ifdef DRIVESOUND
-       driveclick_reset();
-#endif
-       ethernet_reset();
        uae_int_requested = 0;
-#ifdef ARCADIA
-       arcadia_reset();
-#endif
 }
 
-
 void devices_vsync_pre(void)
 {
        audio_vsync ();
@@ -136,78 +230,26 @@ void devices_vsync_pre(void)
        filesys_vsync ();
        sampler_vsync ();
        clipboard_vsync ();
-       uaenet_vsync();
-#ifdef RETROPLATFORM
-       rp_vsync ();
-#endif
-#ifdef CD32
-       cd32_fmv_vsync_handler();
-#endif
-       cpuboard_vsync();
-       ncr_vsync();
        statusline_vsync();
-#ifdef WITH_X86
-       x86_bridge_vsync();
-#endif
+
+       execute_device_items(device_vsyncs_pre, device_vsync_pre_cnt);
 }
 
 void devices_vsync_post(void)
 {
-#ifdef WITH_TOCCATA
-       sndboard_vsync();
-#endif
+       execute_device_items(device_vsyncs_post, device_vsync_post_cnt);
 }
 
 void devices_hsync(void)
 {
-#ifdef GFXBOARD
-       gfxboard_hsync_handler();
-#endif
-#ifdef A2065
-       a2065_hsync_handler ();
-#endif
-#ifdef CD32
-       AKIKO_hsync_handler ();
-       cd32_fmv_hsync_handler();
-#endif
-#ifdef CDTV
-       CDTV_hsync_handler ();
-       CDTVCR_hsync_handler ();
-#endif
-       decide_blitter (-1);
+       DISK_hsync();
+       audio_hsync();
+       CIA_hsync_prehandler();
 
-#ifdef PICASSO96
-       picasso_handle_hsync ();
-#endif
-#ifdef AHI
-       {
-               void ahi_hsync (void);
-               ahi_hsync ();
-       }
-#endif
-#ifdef WITH_PPC
-       uae_ppc_hsync_handler();
-       cpuboard_hsync();
-#endif
-#ifdef WITH_PCI
-       pci_hsync();
-#endif
-#ifdef WITH_X86
-       x86_bridge_hsync();
-#endif
-#ifdef WITH_TOCCATA
-       sndboard_hsync();
-#endif
-       ne2000_hsync();
-       DISK_hsync ();
-       audio_hsync ();
-       CIA_hsync_prehandler ();
+       decide_blitter (-1);
        serial_hsynchandler ();
-       gayle_hsync ();
-       idecontroller_hsync();
-#ifdef A2091
-       scsi_hsync ();
-#endif
+
+       execute_device_items(device_hsyncs, device_hsync_cnt);
 }
 
 void devices_rethink_all(void func(void))
@@ -215,45 +257,13 @@ void devices_rethink_all(void func(void))
        func();
 }
 
-// these really should be dynamically allocated..
 void devices_rethink(void)
 {
        rethink_cias ();
-#ifdef A2065
-       rethink_a2065 ();
-#endif
-#ifdef A2091
-       rethink_a2091 ();
-#endif
-#ifdef CDTV
-       rethink_cdtv();
-       rethink_cdtvcr();
-#endif
-#ifdef CD32
-       rethink_akiko ();
-       rethink_cd32fmv();
-#endif
-#ifdef NCR
-       ncr_rethink();
-#endif
-#ifdef NCR9X
-       ncr9x_rethink();
-#endif
-       ncr80_rethink();
-#ifdef WITH_PCI
-       pci_rethink();
-#endif
-#ifdef WITH_X86
-       x86_bridge_rethink();
-#endif
-#ifdef WITH_TOCCATA
-       sndboard_rethink();
-#endif
-       rethink_ne2000();
-       rethink_gayle ();
-       idecontroller_rethink();
+
+       execute_device_items(device_rethinks, device_rethink_cnt);
+
        rethink_uae_int();
-       rethink_traps();
        /* cpuboard_rethink must be last */
        cpuboard_rethink();
 }
@@ -271,68 +281,12 @@ void devices_update_sync(double svpos, double syncadjust)
        cd32_fmv_set_sync(svpos, syncadjust);
 }
 
-void reset_all_systems (void)
-{
-       init_eventtab ();
-
-#ifdef WITH_PPC
-       uae_ppc_reset(is_hardreset());
-#endif
-#ifdef PICASSO96
-       for (int i = 0; i < MAX_AMIGADISPLAYS; i++) {
-               picasso_reset(i);
-       }
-#endif
-#ifdef SCSIEMU
-       scsi_reset ();
-       scsidev_reset ();
-       scsidev_start_threads ();
-#endif
-#ifdef A2065
-       a2065_reset ();
-#endif
-#ifdef SANA2
-       netdev_reset ();
-       netdev_start_threads ();
-#endif
-#ifdef WITH_PCI
-       pci_reset();
-#endif
-#ifdef FILESYS
-       filesys_prepare_reset ();
-       filesys_reset ();
-#endif
-       init_shm ();
-       memory_reset ();
-#if defined (BSDSOCKET)
-       bsdlib_reset ();
-#endif
-#ifdef FILESYS
-       filesys_start_threads ();
-       hardfile_reset ();
-#endif
-#ifdef UAESERIAL
-       uaeserialdev_reset ();
-       uaeserialdev_start_threads ();
-#endif
-#if defined (PARALLEL_PORT)
-       initparallel ();
-#endif
-       ne2000_reset();
-       native2amiga_reset ();
-       dongle_reset ();
-       sampler_init ();
-       device_func_reset();
-       uae_int_requested = 0;
-}
-
 void do_leave_program (void)
 {
 #ifdef WITH_PPC
        // must be first
        uae_ppc_free();
 #endif
-       picasso_free();
        free_traps();
        sampler_free ();
        graphics_leave ();
@@ -342,30 +296,6 @@ void do_leave_program (void)
        dump_counts ();
 #ifdef SERIAL_PORT
        serial_exit ();
-#endif
-#ifdef CDTV
-       cdtv_free();
-       cdtvcr_free();
-#endif
-#ifdef A2091
-       a2091_free ();
-       gvp_free ();
-       a3000scsi_free ();
-#endif
-       soft_scsi_free();
-#ifdef NCR
-       ncr_free();
-#endif
-#ifdef NCR9X
-       ncr9x_free();
-#endif
-#ifdef A2065
-       a2065_free();
-#endif
-       ne2000_free();
-#ifdef CD32
-       akiko_free ();
-       cd32_fmv_free();
 #endif
        if (! no_gui)
                gui_exit ();
@@ -375,27 +305,15 @@ void do_leave_program (void)
 #ifdef AUTOCONFIG
        expansion_cleanup ();
 #endif
-#ifdef WITH_PCI
-       pci_free();
-#endif
-#ifdef WITH_X86
-       x86_bridge_free();
-#endif
 #ifdef FILESYS
        filesys_cleanup ();
 #endif
 #ifdef BSDSOCKET
        bsdlib_reset ();
 #endif
-       gayle_free ();
-       idecontroller_free();
        device_func_free();
 #ifdef WITH_LUA
        uae_lua_free ();
-#endif
-#ifdef WITH_TOCCATA
-       sndboard_free();
-       uaesndboard_free();
 #endif
        gfxboard_free();
        savestate_free ();
@@ -406,10 +324,14 @@ void do_leave_program (void)
        driveclick_free();
        ethernet_enumerate_free();
        rtarea_free();
+
+       execute_device_items(device_leaves, device_leave_cnt);
 }
 
 void virtualdevice_init (void)
 {
+       reset_device_items();
+
 #ifdef AUTOCONFIG
        rtarea_setup ();
 #endif
@@ -445,15 +367,6 @@ void virtualdevice_init (void)
 #ifdef WITH_TABLETLIBRARY
        tabletlib_install ();
 #endif
-#ifdef NCR
-       ncr_init();
-#endif
-#ifdef NCR9X
-       ncr9x_init();
-#endif
-#ifdef CDTV
-       cdtvcr_reset();
-#endif
 }
 
 void devices_restore_start(void)
index 069f59110a4b52643718f8f11a1e4daa453ff79a..168fb065fa7e6520f894bbc1154a97fdda0fca4c 100644 (file)
@@ -47,6 +47,7 @@
 #include "ethernet.h"
 #include "sana2.h"
 #include "arcadia.h"
+#include "devices.h"
 
 
 #define CARD_FLAG_CAN_Z3 1
@@ -3690,7 +3691,7 @@ void expansion_scan_autoconfig(struct uae_prefs *p, bool log)
        expansion_parse_cards(p, log);
 }
 
-void expamem_reset (void)
+void expamem_reset (int hardreset)
 {
        reset_ac(&currprefs);
 
@@ -3704,6 +3705,9 @@ void expamem_reset (void)
        expansion_autoconfig_sort(&currprefs);
        expansion_parse_cards(&currprefs, true);
 
+       // this also resets all autoconfig devices
+       devices_reset_ext(hardreset);
+
        if (cardno == 0 || savestate_state) {
                expamem_init_clear_zero ();
        } else {
index c2c1cd0c6f0daf22b6111e62683da9782e1ef218..f72fc90f028a30b69312bb27cb12083bd006ce81 100644 (file)
--- a/gayle.cpp
+++ b/gayle.cpp
@@ -172,6 +172,8 @@ static int dataflyer_state;
 static int dataflyer_disable_irq;
 static uae_u8 dataflyer_byte;
 
+static void gayle_reset(int hardreset);
+
 static void pcmcia_reset (void)
 {
        memset (pcmcia_configuration, 0, sizeof pcmcia_configuration);
@@ -226,7 +228,7 @@ bool isideint(void)
        return checkgayleideirq() != 0;
 }
 
-void rethink_gayle (void)
+static void rethink_gayle (void)
 {
        int lev2 = 0;
        int lev6 = 0;
@@ -1875,6 +1877,8 @@ void gayle_add_ide_unit (int ch, struct uaedev_config_info *ci, struct romconfig
        ide = add_ide_unit (idedrive, TOTAL_IDE * 2, ch, ci, NULL);
 }
 
+static void gayle_init(void);
+
 bool gayle_ide_init(struct autoconfig_info *aci)
 {
        aci->zorro = 0;
@@ -1885,6 +1889,9 @@ bool gayle_ide_init(struct autoconfig_info *aci)
                aci->start = GAYLE_BASE_4000;
                aci->size = 0x1000;
        }
+       device_add_reset(gayle_reset);
+       if (aci->doinit)
+               gayle_init();
        return true;
 }
 
@@ -1894,6 +1901,9 @@ bool gayle_init_board_io_pcmcia(struct autoconfig_info *aci)
        aci->size = PCMCIA_ATTRIBUTE_SIZE;
        aci->zorro = 0;
        aci->parent_address_space = true;
+       device_add_reset(gayle_reset);
+       if (aci->doinit)
+               gayle_init();
        return true;
 }
 
@@ -1903,6 +1913,9 @@ bool gayle_init_board_common_pcmcia(struct autoconfig_info *aci)
        aci->size = PCMCIA_COMMON_SIZE;
        aci->zorro = 0;
        aci->parent_address_space = true;
+       device_add_reset(gayle_reset);
+       if (aci->doinit)
+               gayle_init();
        return true;
 }
 
@@ -1911,6 +1924,9 @@ bool gayle_init_pcmcia(struct autoconfig_info *aci)
        aci->start = PCMCIA_COMMON_START;
        aci->size = 0xa80000 - aci->start;
        aci->zorro = 0;
+       device_add_reset(gayle_reset);
+       if (aci->doinit)
+               gayle_init();
        return true;
 }
 
@@ -2049,7 +2065,7 @@ static void pcmcia_card_check(int changecheck, int insertdev)
        }
 }
 
-void gayle_hsync(void)
+static void gayle_hsync(void)
 {
        if (ne2000)
                ne2000->hsync(ne2000_board_state);
@@ -2085,13 +2101,20 @@ static void initide (void)
        gayle_irq = gayle_int = 0;
 }
 
-void gayle_free (void)
+static void gayle_free (void)
 {
        stop_ide_thread(&gayle_its);
        stop_ide_thread(&pcmcia_its);
 }
 
-void gayle_reset (int hardreset)
+static void check_prefs_changed_gayle(void)
+{
+       if (!currprefs.cs_pcmcia)
+               return;
+       pcmcia_card_check(1, -1);
+}
+
+static void gayle_reset (int hardreset)
 {
        static TCHAR bankname[100];
 
@@ -2108,8 +2131,7 @@ void gayle_reset (int hardreset)
 #ifdef NCR
        if (is_a4000t_scsi()) {
                _tcscat (bankname, _T(" + NCR53C710 SCSI"));
-               ncr_init();
-               ncr_reset();
+               ncr_reset(hardreset);
        }
 #endif
        gayle_bank.name = bankname;
@@ -2118,13 +2140,6 @@ void gayle_reset (int hardreset)
        pcmcia_card_check(0, -1);
 }
 
-void check_prefs_changed_gayle(void)
-{
-       if (!currprefs.cs_pcmcia)
-               return;
-       pcmcia_card_check(1, -1);
-}
-
 uae_u8 *restore_gayle (uae_u8 *src)
 {
        changed_prefs.cs_ide = restore_u8 ();
@@ -2136,6 +2151,14 @@ uae_u8 *restore_gayle (uae_u8 *src)
        return src;
 }
 
+static void gayle_init(void)
+{
+       device_add_check_config(check_prefs_changed_gayle);
+       device_add_rethink(rethink_gayle);
+       device_add_hsync(gayle_hsync);
+       device_add_exit(gayle_free);
+}
+
 uae_u8 *save_gayle (int *len, uae_u8 *dstptr)
 {
        uae_u8 *dstbak, *dst;
index 4c7562bceef83411429cbc7526c2ae7207d74d7b..a98b4526654d5f603a88b0ced2095e61ef5f3166 100644 (file)
@@ -42,6 +42,7 @@ static bool memlogw = true;
 #include "gfxboard.h"
 #include "rommgr.h"
 #include "xwin.h"
+#include "devices.h"
 
 #include "qemuvga/qemuuaeglue.h"
 #include "qemuvga/vga.h"
@@ -390,6 +391,16 @@ void gfxboard_free_vram(int index)
                vram_ram_a8 = 0;
 }
 
+static void gfxboard_hsync_handler(void)
+{
+       for (int i = 0; i < MAX_RTG_BOARDS; i++) {
+               struct rtggfxboard *gb = &rtggfxboards[i];
+               if (gb->func && gb->userdata) {
+                       gb->func->hsync(gb->userdata);
+               }
+       }
+}
+
 static void init_board (struct rtggfxboard *gb)
 {
        struct rtgboardconfig *rbc = gb->rbc;
@@ -463,6 +474,8 @@ static void init_board (struct rtggfxboard *gb)
        gb->vga.vga.con = (void*)gb;
        cirrus_init_common(&gb->vga, chiptype, 0,  NULL, NULL, gb->board->manufacturer == 0, gb->board->romtype == ROMTYPE_x86_VGA);
        picasso_allocatewritewatch(gb->rbc->rtg_index, gb->rbc->rtgmem_size);
+
+       device_add_hsync(gfxboard_hsync_handler);
 }
 
 static int GetBytesPerPixel(RGBFTYPE RGBfmt)
@@ -905,16 +918,6 @@ void gfxboard_refresh(int monid)
        }
 }
 
-void gfxboard_hsync_handler(void)
-{
-       for (int i = 0; i < MAX_RTG_BOARDS; i++) {
-               struct rtggfxboard *gb = &rtggfxboards[i];
-               if (gb->func && gb->userdata) {
-                       gb->func->hsync(gb->userdata);
-               }
-       }
-}
-
 void gfxboard_vsync_handler(bool full_redraw_required, bool redraw_required)
 {
        for (int i = 0; i < MAX_RTG_BOARDS; i++) {
index 7ad6b9911d3aed71ca6845d7d1c91030ae43148b..2b2039fa284c4fd1602279210058f54256aac3f4 100644 (file)
@@ -168,22 +168,6 @@ static struct ide_board *allocide(struct ide_board **idep, struct romconfig *rc,
        return *idep;
 }
 
-static struct ide_board *getide(struct autoconfig_info *aci)
-{
-       for (int i = 0; i < MAX_IDE_UNITS; i++) {
-               if (ide_boards[i]) {
-                       struct ide_board *ide = ide_boards[i];
-                       if (ide->rc == aci->rc) {
-                               ide->original_rc = aci->rc;
-                               ide->rc = NULL;
-                               ide->aci = aci;
-                               return ide;
-                       }
-               }
-       }
-       return NULL;
-}
-
 static struct ide_board *getideboard(uaecptr addr)
 {
        for (int i = 0; ide_boards[i]; i++) {
@@ -260,7 +244,7 @@ static bool ide_rethink(struct ide_board *board, bool edge_triggered)
 
 void x86_doirq(uint8_t irqnum);
 
-void idecontroller_rethink(void)
+static void idecontroller_rethink(void)
 {
        bool irq = false;
        for (int i = 0; ide_boards[i]; i++) {
@@ -276,7 +260,7 @@ void idecontroller_rethink(void)
        }
 }
 
-void idecontroller_hsync(void)
+static void idecontroller_hsync(void)
 {
        for (int i = 0; ide_boards[i]; i++) {
                struct ide_board *board = ide_boards[i];
@@ -305,14 +289,14 @@ static void reset_ide(struct ide_board *board)
        board->enabled = false;
 }
 
-void idecontroller_reset(void)
+static void idecontroller_reset(int hardreset)
 {
        for (int i = 0; ide_boards[i]; i++) {
                reset_ide(ide_boards[i]);
        }
 }
 
-void idecontroller_free(void)
+static void idecontroller_free(void)
 {
        stop_ide_thread(&idecontroller_its);
        for (int i = 0; i < MAX_IDE_UNITS; i++) {
@@ -1853,6 +1837,30 @@ static addrbank ide_bank_generic = {
        ABFLAG_IO | ABFLAG_SAFE, S_READ, S_WRITE
 };
 
+static struct ide_board *getide(struct autoconfig_info *aci)
+{
+       device_add_rethink(idecontroller_rethink);
+       device_add_hsync(idecontroller_hsync);
+       device_add_exit(idecontroller_free);
+
+       for (int i = 0; i < MAX_IDE_UNITS; i++) {
+               if (ide_boards[i]) {
+                       struct ide_board *ide = ide_boards[i];
+                       if (ide->rc == aci->rc) {
+                               ide->original_rc = aci->rc;
+                               ide->rc = NULL;
+                               ide->aci = aci;
+                               return ide;
+                       }
+               }
+       }
+       return NULL;
+}
+
+static void ide_add_reset(void)
+{
+       device_add_reset(idecontroller_reset);
+}
 
 static void ew(struct ide_board *ide, int addr, uae_u32 value)
 {
@@ -1878,6 +1886,7 @@ bool gvp_ide_rom_autoconfig_init(struct autoconfig_info *aci)
        } else {
                autoconfig = gvp_ide2_rom_autoconfig;
        }
+       ide_add_reset();
        aci->autoconfigp = autoconfig;
        if (!aci->doinit)
                return true;
@@ -1916,6 +1925,7 @@ bool gvp_ide_rom_autoconfig_init(struct autoconfig_info *aci)
 
 bool gvp_ide_controller_autoconfig_init(struct autoconfig_info *aci)
 {
+       ide_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = gvp_ide2_controller_autoconfig;
                return true;
@@ -1951,6 +1961,7 @@ static const uae_u8 alfplus_autoconfig[16] = { 0xd1, 38, 0x00, 0x00, 0x08, 0x2c,
 bool alf_init(struct autoconfig_info *aci)
 {
        bool alfplus = is_board_enabled(&currprefs, ROMTYPE_ALFAPLUS, 0);
+       ide_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = alfplus ? alfplus_autoconfig : alf_autoconfig;
                return true;
@@ -2026,6 +2037,7 @@ static bool apollo_init(struct autoconfig_info *aci, bool cpuboard)
                        autoconfig = apollo_autoconfig_cpuboard;
        }
 
+       ide_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = autoconfig;
                return true;
@@ -2105,6 +2117,7 @@ bool masoboshi_init(struct autoconfig_info *aci)
        memset(rom, 0xff, rom_size);
 
        load_rom_rc(aci->rc, ROMTYPE_MASOBOSHI, 32768, 0, rom, 65536, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
+       ide_add_reset();
        if (!aci->doinit) {
                if (aci->rc && aci->rc->autoboot_disabled)
                        memcpy(aci->autoconfig_raw, rom + 0x100, sizeof aci->autoconfig_raw);
@@ -2160,6 +2173,7 @@ bool trifecta_init(struct autoconfig_info *aci)
        uae_u8 *rom = xcalloc(uae_u8, rom_size);
        memset(rom, 0xff, rom_size);
 
+       ide_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = aci->ert->autoconfig;
                return true;
@@ -2215,6 +2229,7 @@ static const uae_u8 adide_autoconfig[16] = { 0xd1, 0x02, 0x00, 0x00, 0x08, 0x17,
 
 bool adide_init(struct autoconfig_info *aci)
 {
+       ide_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = adide_autoconfig;
                return true;
@@ -2257,6 +2272,7 @@ bool mtec_init(struct autoconfig_info *aci)
        memset(rom, 0xff, rom_size);
        load_rom_rc(aci->rc, ROMTYPE_MTEC, 16384, !aci->rc->autoboot_disabled ? 16384 : 0, rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
 
+       ide_add_reset();
        if (!aci->doinit) {
                memcpy(aci->autoconfig_raw, rom, sizeof aci->autoconfig_raw);
                xfree(rom);
@@ -2285,6 +2301,7 @@ void mtec_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *
 
 bool rochard_init(struct autoconfig_info *aci)
 {
+       ide_add_reset();
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_ROCHARD, 8192, !aci->rc->autoboot_disabled ? 8192 : 0, aci->autoconfig_raw, sizeof aci->autoconfig_raw, 0);
                return true;
@@ -2315,6 +2332,7 @@ bool buddha_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_BUDDHA);
 
+       ide_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
@@ -2367,6 +2385,7 @@ bool golemfast_init(struct autoconfig_info *aci)
        memset(rom, 0xff, rom_size);
        load_rom_rc(aci->rc, ROMTYPE_GOLEMFAST, 16384, 0, rom, 32768, 0);
 
+       ide_add_reset();
        if (!aci->doinit) {
                memcpy(aci->autoconfig_raw, rom, sizeof aci->autoconfig_raw);
                xfree(rom);
@@ -2414,6 +2433,7 @@ bool dataflyerplus_init(struct autoconfig_info *aci)
        memset(rom, 0xff, rom_size);
        load_rom_rc(aci->rc, ROMTYPE_DATAFLYER, 32768, aci->rc->autoboot_disabled ? 8192 : 0, rom, 16384, LOADROM_EVENONLY_ODDONE);
 
+       ide_add_reset();
        if (!aci->doinit) {
                memcpy(aci->autoconfig_raw, rom, sizeof aci->autoconfig_raw);
                xfree(rom);
@@ -2465,6 +2485,7 @@ bool ateam_init(struct autoconfig_info *aci)
        memset(rom, 0xff, rom_size);
        load_rom_rc(aci->rc, ROMTYPE_ATEAM, 16384, !aci->rc->autoboot_disabled ? 0xc000 : 0x8000, rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
 
+       ide_add_reset();
        if (!aci->doinit) {
                memcpy(aci->autoconfig_raw, rom, sizeof aci->autoconfig_raw);
                xfree(rom);
@@ -2504,6 +2525,7 @@ bool fastata4k_init(struct autoconfig_info *aci)
                return true;
        }
 
+       ide_add_reset();
        if (!aci->doinit) {
                memcpy(aci->autoconfig_bytes, aci->ert->autoconfig, sizeof aci->ert->autoconfig);
                int type = aci->rc->device_settings & 3;
@@ -2544,6 +2566,7 @@ void fastata4k_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romcon
 bool arriba_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_ARRIBA);
+       ide_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
@@ -2586,6 +2609,7 @@ bool elsathd_init(struct autoconfig_info *aci)
        if (aci->rc->autoboot_disabled)
                rom[0] &= ~0x10;
 
+       ide_add_reset();
        if (!aci->doinit) {
                memcpy(aci->autoconfig_raw, rom, sizeof aci->autoconfig_raw);
                xfree(rom);
@@ -2653,6 +2677,7 @@ bool accessx_init(struct autoconfig_info *aci)
                }
        }
 
+       ide_add_reset();
        if (!aci->doinit) {
                memcpy(aci->autoconfig_raw, rom, sizeof aci->autoconfig_raw);
                xfree(rom);
@@ -2685,6 +2710,7 @@ void accessx_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfi
 bool trumpcard500at_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_IVST500AT);
+       ide_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
@@ -2722,6 +2748,7 @@ void trumpcard500at_add_ide_unit(int ch, struct uaedev_config_info *ci, struct r
 bool tandem_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_TANDEM);
+       ide_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
@@ -2751,6 +2778,7 @@ static bool x86_at_hd_init(struct autoconfig_info *aci, int type)
 {
        static const int parent[] = { ROMTYPE_A1060, ROMTYPE_A2088, ROMTYPE_A2088T, ROMTYPE_A2286, ROMTYPE_A2386, 0 };
        aci->parent_romtype = parent;
+       ide_add_reset();
        if (!aci->doinit)
                return true;
 
index 857394824ca4a1a49540b1796e8dae61b083a009..e300044bdd0395503b72320c77d75a85e9178079 100644 (file)
@@ -4,15 +4,8 @@
 #ifdef A2065
 
 extern bool a2065_init (struct autoconfig_info *aci);
-extern void a2065_free (void);
-extern void a2065_reset (void);
-extern void a2065_hsync_handler (void);
-
 extern bool ariadne_init(struct autoconfig_info *aci);
 
-
-extern void rethink_a2065 (void);
-
 #endif
 
 #endif /* UAE_A2065_H */
index 400412682314b9389419fa5623b6d37f3d710889..272c4e1fb49bad7bca0830ebbe8feb20790784dc 100644 (file)
@@ -67,6 +67,7 @@ struct gvp_dmac
        uae_u32 addr;
        uae_u16 len;
        uae_u8 bank;
+       uae_u8 maprom;
        int dma_on;
        uae_u8 version;
        bool use_version;
@@ -130,29 +131,21 @@ extern bool a2090b_init (struct autoconfig_info *aci);
 extern bool a2090b_preinit (struct autoconfig_info *aci);
 
 extern bool a2091_init (struct autoconfig_info *aci);
-extern void a2091_free(void);
-extern void a2091_reset (void);
 
 extern bool gvp_init_s1(struct autoconfig_info *aci);
 extern bool gvp_init_s2(struct autoconfig_info *aci);
 extern bool gvp_init_accelerator(struct autoconfig_info *aci);
-extern void gvp_free(void);
-extern void gvp_reset (void);
 
 extern bool comspec_init (struct autoconfig_info *aci);
 extern bool comspec_preinit (struct autoconfig_info *aci);
 
 extern bool a3000scsi_init(struct autoconfig_info *aci);
-extern void a3000scsi_free (void);
-extern void rethink_a2091 (void);
 
 extern void wdscsi_put (struct wd_chip_state*, wd_state*, uae_u8);
 extern uae_u8 wdscsi_get (struct wd_chip_state*, struct wd_state*);
 extern uae_u8 wdscsi_getauxstatus (struct wd_chip_state*);
 extern void wdscsi_sasr (struct wd_chip_state*, uae_u8);
 
-extern void scsi_hsync (void);
-
 #define WDTYPE_A2091 0
 #define WDTYPE_A2091_2 1
 #define WDTYPE_A3000 2
index b9dd591a47413db24e7eb66e760a59d15d5d6772..2649c953cdf5420ba86e5adad8d8c54861baa703 100644 (file)
@@ -4,14 +4,10 @@
 #define AKIKO_BASE 0xb80000
 #define AKIKO_BASE_END 0xb80100 /* ?? */
 
-extern void akiko_reset (void);
 extern int akiko_init (void);
-extern void akiko_free (void);
+extern void akiko_reset(int);
 
-extern void AKIKO_hsync_handler (void);
 extern void akiko_mute (int);
 extern bool akiko_ntscmode(void);
 
-extern void rethink_akiko (void);
-
 #endif /* UAE_AKIKO_H */
index aee7d65b4a2d2a17191dbf1bbdbf349fe2dcc028..79f377945629bb05c0fe91b7a35408b1e0cf7450 100644 (file)
@@ -3,12 +3,9 @@
 
 #ifdef ARCADIA
 
-extern void arcadia_reset(void);
-
 extern int is_arcadia_rom (const TCHAR *path);
 extern int arcadia_map_banks (void);
 extern void arcadia_unmap (void);
-extern void arcadia_vsync (void);
 extern uae_u8 arcadia_parport (int port, uae_u8 pra, uae_u8 dra);
 extern struct romdata *scan_arcadia_rom (TCHAR*, int);
 
@@ -46,8 +43,6 @@ extern int touch_serial_write(void);
 
 extern bool cubo_init(struct autoconfig_info *aci);
 
-extern void check_arcadia_prefs_changed(void);
-
 extern void cubo_function(int);
 
 #endif /* ARCADIA */
index ad53d9ce0ec53d203c0ccecd4daa2c3ebc48871c..0436bc0b9e834d179163e5c91daf97a8aa81f4c3 100644 (file)
@@ -80,7 +80,6 @@ extern void align (int);
 
 extern volatile uae_atomic uae_int_requested;
 extern void rtarea_reset(void);
-extern bool rethink_traps(void);
 
 #define RTS 0x4e75
 #define RTE 0x4e73
index cb1c5bd8e70d46b349d14bb47a24b1112f8edd34..f04d226dc77481a7c9b57ebc3ccfbee7fca5af48 100644 (file)
@@ -4,11 +4,6 @@
 #include "uae/types.h"
 
 extern addrbank *cd32_fmv_init (struct autoconfig_info *aci);
-extern void cd32_fmv_reset(void);
-extern void cd32_fmv_free(void);
-extern void rethink_cd32fmv(void);
-extern void cd32_fmv_hsync_handler(void);
-extern void cd32_fmv_vsync_handler(void);
 
 extern void cd32_fmv_state(int state);
 extern void cd32_fmv_new_image(int, int, int, uae_u8*);
index 0b8252c88c4ea6c631a2e19dd7bddf649ae25e66..67ddd0fdb22dd97ca026087f698a3b39cceb7b2a 100644 (file)
@@ -8,8 +8,6 @@
 extern addrbank dmac_bank;
 
 extern bool cdtv_init (struct autoconfig_info *aci);
-extern void cdtv_free (void);
-extern void CDTV_hsync_handler(void);
 
 void cdtv_battram_write (int addr, int v);
 uae_u8 cdtv_battram_read (int addr);
@@ -20,7 +18,6 @@ extern bool cdtvsram_init(struct autoconfig_info *aci);
 
 extern void cdtv_getdmadata (uae_u32*);
 
-extern void rethink_cdtv (void);
 extern void cdtv_scsi_int (void);
 extern void cdtv_scsi_clear_int (void);
 
index 0fc13dfed804a1f353f61c3e38a9d44f62483fa1..8220a5992332f6e03f191c1ec409bff2b6c47c22 100644 (file)
@@ -2,10 +2,5 @@
 #define UAE_CDTVCR_H
 
 bool cdtvcr_init(struct autoconfig_info*);
-void cdtvcr_reset(void);
-void cdtvcr_free(void);
-void rethink_cdtvcr(void);
-
-extern void CDTVCR_hsync_handler(void);
 
 #endif /* UAE_CDTVCR_H */
index e34450b3b8fd6ae187495bddec897d579be5de2a..7f0f6e3d3818c994633f82215134b644477175d3 100644 (file)
@@ -3,39 +3,38 @@
 
 #include "uae/types.h"
 
-extern bool cpuboard_autoconfig_init(struct autoconfig_info*);
-extern bool cpuboard_maprom(void);
-extern void cpuboard_map(void);
-extern void cpuboard_reset(void);
-extern void cpuboard_cleanup(void);
-extern void cpuboard_init(void);
-extern void cpuboard_clear(void);
-extern void cpuboard_vsync(void);
-extern void cpuboard_hsync(void);
-extern void cpuboard_rethink(void);
-extern bool cpuboard_is_ppcboard_irq(void);
-extern int cpuboard_memorytype(struct uae_prefs *p);
-extern int cpuboard_maxmemory(struct uae_prefs *p);
-extern bool cpuboard_32bit(struct uae_prefs *p);
-extern bool cpuboard_jitdirectompatible(struct uae_prefs *p);
-extern bool is_ppc_cpu(struct uae_prefs *);
-extern bool cpuboard_io_special(int addr, uae_u32 *val, int size, bool write);
-extern void cpuboard_overlay_override(void);
-extern void cpuboard_setboard(struct uae_prefs *p, int type, int subtype);
-extern uaecptr cpuboard_get_reset_pc(uaecptr *stack);
-extern void cpuboard_set_flash_unlocked(bool unlocked);
-
-extern bool ppc_interrupt(int new_m68k_ipl);
-
-extern void cyberstorm_scsi_ram_put(uaecptr addr, uae_u32);
-extern uae_u32 cyberstorm_scsi_ram_get(uaecptr addr);
-extern int REGPARAM3 cyberstorm_scsi_ram_check(uaecptr addr, uae_u32 size) REGPARAM;
-extern uae_u8 *REGPARAM3 cyberstorm_scsi_ram_xlate(uaecptr addr) REGPARAM;
+bool cpuboard_autoconfig_init(struct autoconfig_info*);
+bool cpuboard_maprom(void);
+void cpuboard_map(void);
+void cpuboard_reset(int hardreset);
+void cpuboard_rethink(void);
+void cpuboard_cleanup(void);
+void cpuboard_init(void);
+void cpuboard_clear(void);
+bool cpuboard_is_ppcboard_irq(void);
+int cpuboard_memorytype(struct uae_prefs *p);
+int cpuboard_maxmemory(struct uae_prefs *p);
+bool cpuboard_32bit(struct uae_prefs *p);
+bool cpuboard_jitdirectompatible(struct uae_prefs *p);
+bool is_ppc_cpu(struct uae_prefs *);
+bool cpuboard_io_special(int addr, uae_u32 *val, int size, bool write);
+void cpuboard_overlay_override(void);
+void cpuboard_setboard(struct uae_prefs *p, int type, int subtype);
+uaecptr cpuboard_get_reset_pc(uaecptr *stack);
+void cpuboard_set_flash_unlocked(bool unlocked);
+
+bool ppc_interrupt(int new_m68k_ipl);
+
+void cyberstorm_scsi_ram_put(uaecptr addr, uae_u32);
+uae_u32 cyberstorm_scsi_ram_get(uaecptr addr);
+int REGPARAM3 cyberstorm_scsi_ram_check(uaecptr addr, uae_u32 size) REGPARAM;
+uae_u8 *REGPARAM3 cyberstorm_scsi_ram_xlate(uaecptr addr) REGPARAM;
 
 void cyberstorm_mk3_ppc_irq(int id, int level);
 void blizzardppc_irq(int id, int level);
 void cyberstorm_mk3_ppc_irq_setonly(int id, int level);
 void blizzardppc_irq_setonly(int id, int level);
+void cpuboard_gvpmaprom(int);
 
 #define BOARD_MEMORY_Z2 1
 #define BOARD_MEMORY_Z3 2
index 14e784df5b52e0de9f9db8eaa7e51d190aefe793..0ff88661edf454460c000949f3167253b6761cdb 100644 (file)
@@ -2,6 +2,7 @@
 #define UAE_DEVICES_H
 
 void devices_reset(int hardreset);
+void devices_reset_ext(int hardreset);
 void devices_vsync_pre(void);
 void devices_vsync_post(void);
 void devices_hsync(void);
@@ -10,7 +11,6 @@ void devices_rethink_all(void func(void));
 void devices_syncchange(void);
 void devices_update_sound(double clk, double syncadjust);
 void devices_update_sync(double svpos, double syncadjust);
-void reset_all_systems(void);
 void do_leave_program(void);
 void virtualdevice_init(void);
 void devices_restore_start(void);
@@ -19,6 +19,18 @@ void devices_pause(void);
 void devices_unpause(void);
 void devices_unsafeperiod(void);
 
+typedef void (*DEVICE_INT)(int hardreset);
+typedef void (*DEVICE_VOID)(void);
+
+void device_add_vsync_pre(DEVICE_VOID p);
+void device_add_vsync_post(DEVICE_VOID p);
+void device_add_hsync(DEVICE_VOID p);
+void device_add_rethink(DEVICE_VOID p);
+void device_add_check_config(DEVICE_VOID p);
+void device_add_reset(DEVICE_INT p);
+void device_add_reset_imm(DEVICE_INT p);
+void device_add_exit(DEVICE_VOID p);
+
 #define IRQ_SOURCE_PCI 0
 #define IRQ_SOURCE_SOUND 1
 #define IRQ_SOURCE_NE2000 2
index ff60bfa36bd010b61a745bed214bfb348b5d00f3..03488737935dbe4687dfff7e6c36a496d690fb27 100644 (file)
@@ -38,11 +38,6 @@ extern bool lanrover_init(struct autoconfig_info *aci);
 extern bool xsurf_init(struct autoconfig_info *aci);
 extern bool xsurf100_init(struct autoconfig_info *aci);
 
-void rethink_ne2000(void);
-void ne2000_reset(void);
-void ne2000_hsync(void);
-void ne2000_free(void);
-
 void ethernet_updateselection(void);
 uae_u32 ethernet_getselection(const TCHAR*);
 const TCHAR *ethernet_getselectionname(uae_u32 settings);
index f106d9edc778d4c8129f4b4cb37c547e82bd95ed..94b6dd42215e8f052d49852df8f743d72d3f15d2 100644 (file)
@@ -3,18 +3,13 @@
 
 #include "uae/types.h"
 
-extern void gayle_reset (int);
-extern void gayle_hsync (void);
-extern void gayle_free (void);
-extern void gayle_add_ide_unit (int ch, struct uaedev_config_info *ci, struct romconfig *rc);
-extern bool gayle_ide_init(struct autoconfig_info*);
-extern void gayle_free_units (void);
-extern void rethink_gayle (void);
-extern void gayle_map_pcmcia (void);
-extern void check_prefs_changed_gayle(void);
-extern bool gayle_init_pcmcia(struct autoconfig_info *aci);
-extern bool gayle_init_board_io_pcmcia(struct autoconfig_info *aci);
-extern bool gayle_init_board_common_pcmcia(struct autoconfig_info *aci);
+void gayle_add_ide_unit (int ch, struct uaedev_config_info *ci, struct romconfig *rc);
+bool gayle_ide_init(struct autoconfig_info*);
+void gayle_free_units (void);
+void gayle_map_pcmcia (void);
+bool gayle_init_pcmcia(struct autoconfig_info *aci);
+bool gayle_init_board_io_pcmcia(struct autoconfig_info *aci);
+bool gayle_init_board_common_pcmcia(struct autoconfig_info *aci);
 void pcmcia_eject(struct uae_prefs *p);
 void pcmcia_reinsert(struct uae_prefs*);
 bool pcmcia_disk_reinsert(struct uae_prefs *p, struct uaedev_config_info *uci, bool ejectonly);
@@ -27,6 +22,6 @@ extern int gary_timeout; // non-existing memory access = delay
 #define PCMCIA_ATTRIBUTE_START 0xa00000
 #define PCMCIA_ATTRIBUTE_SIZE 0x80000
 
-extern void gayle_dataflyer_enable(bool);
+void gayle_dataflyer_enable(bool);
 
 #endif /* UAE_GAYLE_H */
index af4895d18bec53a3ef56e803c33bc49b72c0166d..0b7f727024b961049af0368f0d8c5d401e4fd2c2 100644 (file)
@@ -9,7 +9,6 @@ extern bool gfxboard_init_registers(struct autoconfig_info*);
 extern void gfxboard_free (void);
 extern void gfxboard_reset (void);
 extern void gfxboard_vsync_handler (bool, bool);
-extern void gfxboard_hsync_handler(void);
 extern int gfxboard_get_configtype (struct rtgboardconfig*);
 extern bool gfxboard_is_registers (struct rtgboardconfig*);
 extern int gfxboard_get_vram_min (struct rtgboardconfig*);
index 68a8ee79d7d26b5aa98bfa9ddf3d2e811a1805cc..224b70f3b44d8120775696856cfd3f48212d3e3e 100644 (file)
@@ -5,11 +5,6 @@
 
 // Other IDE controllers
 
-void idecontroller_free(void);
-void idecontroller_reset(void);
-void idecontroller_rethink(void);
-void idecontroller_hsync(void);
-
 void gvp_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 bool gvp_ide_rom_autoconfig_init(struct autoconfig_info *aci);
 bool gvp_ide_controller_autoconfig_init(struct autoconfig_info *aci);
index fb473b486b08796944995c7d4e71fc69697683b9..b27b7d5e243b4c5b6c32282f555fd8a67acc1734 100644 (file)
@@ -442,9 +442,9 @@ extern void rtarea_init(void);
 extern void rtarea_free(void);
 extern void rtarea_init_mem(void);
 extern void rtarea_setup(void);
-extern void expamem_reset (void);
-extern void expamem_next (addrbank *mapped, addrbank *next);
-extern void expamem_shutup (addrbank *mapped);
+extern void expamem_reset(int);
+extern void expamem_next(addrbank *mapped, addrbank *next);
+extern void expamem_shutup(addrbank *mapped);
 extern bool expamem_z3hack(struct uae_prefs*);
 extern void expansion_cpu_fallback(void);
 extern void set_expamem_z3_hack_mode(int);
index d12bc847d0f7339783f8c931f6f881939cab8436..8984f4d5b0ab0f4e73f545a8607121a280646e3e 100644 (file)
@@ -3,11 +3,6 @@
 
 #include "uae/types.h"
 
-extern void ncr9x_init(void);
-extern void ncr9x_free(void);
-extern void ncr9x_reset(void);
-extern void ncr9x_rethink(void);
-
 extern void cpuboard_ncr9x_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 extern void cpuboard_dkb_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 extern void fastlane_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
index 869184454e5d4ed28a3bde9e402a82d246e2520e..324d38de55b844299a8aba9e5155fd53c1fa2f3a 100644 (file)
@@ -13,11 +13,7 @@ void wildfire_ncr815_irq(int id, int v);
 extern addrbank ncr_bank_cyberstorm;
 extern addrbank ncr_bank_generic;
 
-extern void ncr_init(void);
-extern void ncr_free(void);
-extern void ncr_reset(void);
-extern void ncr_rethink(void);
-extern void ncr_vsync(void);
+extern void ncr_reset(int);
 
 extern bool ncr710_a4091_autoconfig_init(struct autoconfig_info *aci);
 extern bool ncr710_warpengine_autoconfig_init(struct autoconfig_info *aci);
index 87822d55d86b77d84000516b8e23ba1a84c0ddee..1842ff48b2b71010ace45f554d9efe77786df716 100644 (file)
@@ -1,10 +1,6 @@
 #ifndef UAE_PCI_H
 #define UAE_PCI_H
 
-extern void pci_free(void);
-extern void pci_reset(void);
-extern void pci_hsync(void);
-extern void pci_rethink(void);
 extern void pci_dump(int);
 
 extern bool dkb_wildfire_pci_init(struct autoconfig_info *aci);
index e3f171a3f4d811a3179481156498eca085ac8a42..f905256377925d8d1e9164a2af54e51e5ea47928 100644 (file)
@@ -108,12 +108,6 @@ struct pci_bridge
        int slot_cnt;
 };
 
-extern void pci_free(void);
-extern void pci_reset(void);
-extern void pci_rethink(void);
-
-extern addrbank *dkb_wildfire_pci_init(struct romconfig *rc);
-
 extern void pci_irq_callback(struct pci_board_state *pcibs, bool irq);
 extern void pci_write_dma(struct pci_board_state *pcibs, uaecptr addr, uae_u8*, int size);
 extern void pci_read_dma(struct pci_board_state *pcibs, uaecptr addr, uae_u8*, int size);
index 3081aabc327fa9fe7651294ba085c6907a8e3e4b..72df93058a3f86357f660b945f4110e4f92c126f 100644 (file)
@@ -15,9 +15,6 @@
 
 uaecptr netdev_startup(TrapContext*, uaecptr resaddr);
 void netdev_install(void);
-void netdev_reset(void);
-void netdev_start_threads(void);
-void uaenet_vsync(void);
 
 extern int log_net;
 
index bdf07dcb4478adfb91fe28146a7f8c7b1894f7ba..80952214a4daf15f1c5c121a9c97c1986777e285 100644 (file)
@@ -165,8 +165,6 @@ return y ## _lget(&z, addr); \
 void soft_scsi_put(uaecptr addr, int size, uae_u32 v);
 uae_u32 soft_scsi_get(uaecptr addr, int size);
 
-void ncr80_rethink(void);
-
 void apollo_scsi_bput(uaecptr addr, uae_u8 v, uae_u32 config);
 uae_u8 apollo_scsi_bget(uaecptr addr, uae_u32 config);
 void apollo_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
@@ -179,9 +177,6 @@ bool ivsvector_init(struct autoconfig_info *aci);
 void twelvegauge_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 bool twelvegauge_init(struct autoconfig_info *aci);
 
-void soft_scsi_free(void);
-void soft_scsi_reset(void);
-
 uae_u8 parallel_port_scsi_read(int reg, uae_u8 data, uae_u8 dir);
 void parallel_port_scsi_write(int reg, uae_u8 v, uae_u8 dir);
 extern bool parallel_port_scsi;
index d2c4b9c451022a9f1cb3ecd2730ec4ef28bac1b9..d65b013a012a5ecfb9cb1fe107a8e70215351e4a 100644 (file)
@@ -6,21 +6,12 @@
 bool toccata_init(struct autoconfig_info *aci);
 bool prelude_init(struct autoconfig_info *aci);
 bool prelude1200_init(struct autoconfig_info *aci);
-void sndboard_free(void);
-void sndboard_hsync(void);
-void sndboard_vsync(void);
-void sndboard_rethink(void);
 void update_sndboard_sound(double);
-void sndboard_reset(void);
 void sndboard_ext_volume(void);
 
 bool uaesndboard_init_z2(struct autoconfig_info *aci);
 bool uaesndboard_init_z3(struct autoconfig_info *aci);
-void uaesndboard_free(void);
-void uaesndboard_reset(void);
 
 bool pmx_init(struct autoconfig_info *aci);
-void pmx_free(void);
-void pmx_reset(void);
 
 #endif /* UAE_SNDBOARD_H */
index 2e23b00ae6a87c932c37aaba63b24efcfe8de15c..e1e9982b49ee1b79f521eb0e5d3396ab95754bae 100644 (file)
@@ -39,7 +39,6 @@ bool uae_ppc_cpu_unlock(void);
 void uae_ppc_emulate(void);
 void uae_ppc_reset(bool hardreset);
 void uae_ppc_free(void);
-void uae_ppc_hsync_handler(void);
 void uae_ppc_wakeup(void);
 void ppc_map_banks(uae_u32, uae_u32, const TCHAR*, void*, bool);
 void ppc_remap_bank(uae_u32 start, uae_u32 size, const TCHAR *name, void *addr);
index ca5af70d47d380c01c7afc79f653ed3cbc218aea..cacf7a1bac68a342231ee7e70f945a289caad8f4 100644 (file)
@@ -7,11 +7,6 @@ bool a2088t_init(struct autoconfig_info *aci);
 bool a2286_init(struct autoconfig_info *aci);
 bool a2386_init(struct autoconfig_info *aci);
 bool isa_expansion_init(struct autoconfig_info *aci);
-void x86_bridge_hsync(void);
-void x86_bridge_vsync(void);
-void x86_bridge_reset(void);
-void x86_bridge_free(void);
-void x86_bridge_rethink(void);
 void x86_bridge_sync_change(void);
 void x86_update_sound(double);
 void x86_mouse(int port, int x, int y, int z, int b);
index 673ef267e594286dd3c0f99fd8c95c89041aeb0f..f5b51f32ded083b0f2c8f7a7f2fdec22017779af 100644 (file)
@@ -5155,10 +5155,6 @@ void inputdevice_vsync (void)
        inputdevice_handle_inputcode ();
        if (mouseedge_alive > 0)
                mouseedge_alive--;
-#ifdef ARCADIA
-       if (arcadia_bios || alg_flag || cubo_enabled)
-               arcadia_vsync ();
-#endif
        if (mouseedge(monid))
                mouseedge_alive = 10;
        if (mousehack_alive_cnt > 0) {
index 291dc247bbb07700b12734a258f46e4a58256314..7ee074cbd8ff7f98f4c2bf2348ceca7228507c36 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -1145,9 +1145,6 @@ static int real_main2 (int argc, TCHAR **argv)
 #ifdef WITH_LUA
        uae_lua_init ();
 #endif
-#ifdef PICASSO96
-       picasso_reset(0);
-#endif
 
 #if 0
 #ifdef JIT
index 70723889f8f3570ca417d97cd6d587bc7c1ddb32..d20c2a8e9e6dd571c62cb5c32e642b8082ca174f 100644 (file)
@@ -2661,7 +2661,7 @@ void memory_reset (void)
        currprefs.cs_fatgaryrev = changed_prefs.cs_fatgaryrev;
        currprefs.cs_ramseyrev = changed_prefs.cs_ramseyrev;
        currprefs.cs_unmapped_space = changed_prefs.cs_unmapped_space;
-       cpuboard_reset();
+       cpuboard_reset(mem_hardreset);
 
        gayleorfatgary = ((currprefs.chipset_mask & CSMASK_AGA) || currprefs.cs_pcmcia || currprefs.cs_ide > 0 || currprefs.cs_mbdmac) && !currprefs.cs_cd32cd;
 
@@ -2898,7 +2898,7 @@ void memory_init (void)
        memset (kickmem_bank.baseaddr, 0, ROM_SIZE_512);
        _tcscpy (currprefs.romfile, _T("<none>"));
        currprefs.romextfile[0] = 0;
-       cpuboard_reset();
+       cpuboard_reset(1);
 
 #ifdef ACTION_REPLAY
        action_replay_unload (0);
index 69ab231793686fd53f03df374c4e6181121d15df..458c6281f6243a798f29be1071790c29aad6fc2f 100644 (file)
@@ -249,7 +249,7 @@ static struct ncr9x_state *getscsi(struct romconfig *rc)
        return NULL;
 }
 
-void ncr9x_rethink(void)
+static void ncr9x_rethink(void)
 {
        for (int i = 0; ncr_units[i]; i++) {
                if (ncr_units[i]->boardirq) {
@@ -1899,6 +1899,22 @@ static void ew(struct ncr9x_state *ncr, int addr, uae_u8 value)
        }
 }
 
+static void ncr9x_reset_board(struct ncr9x_state *ncr);
+static void ncr9x_reset(int hardreset)
+{
+       for (int i = 0; ncr_units[i]; i++) {
+               ncr9x_reset_board(ncr_units[i]);
+               ncr_units[i]->enabled = false;
+       }
+}
+
+static void ncr9x_free(void)
+{
+       for (int i = 0; ncr_units[i]; i++) {
+               freencrunit(ncr_units[i]);
+       }
+}
+
 static void ncr9x_reset_board(struct ncr9x_state *ncr)
 {
        if (!ncr)
@@ -1906,14 +1922,10 @@ static void ncr9x_reset_board(struct ncr9x_state *ncr)
        ncr->configured = 0;
        ncr->boardirq = false;
        ncr->chipirq = false;
-}
 
-void ncr9x_reset(void)
-{
-       for (int i = 0; ncr_units[i]; i++) {
-               ncr9x_reset_board(ncr_units[i]);
-               ncr_units[i]->enabled = false;
-       }
+       device_add_rethink(ncr9x_rethink);
+       device_add_reset(ncr9x_reset);
+       device_add_exit(ncr9x_free);
 }
 
 void ncr_squirrel_init(struct romconfig *rc, uaecptr baseaddress)
@@ -1945,6 +1957,7 @@ void ncr_golemfast_autoconfig_init(struct romconfig *rc, uaecptr baseaddress)
 
 bool ncr_multievolution_init(struct autoconfig_info *aci)
 {
+       device_add_reset(ncr9x_reset);
        if (!aci->doinit)
                return true;
 
@@ -2003,6 +2016,7 @@ bool ncr_fastlane_autoconfig_init(struct autoconfig_info *aci)
                zfile_fclose(z);
        }
 
+       device_add_reset(ncr9x_reset);
        if (!aci->doinit) {
                xfree(rom);
                return true;
@@ -2037,6 +2051,7 @@ static const uae_u8 oktagon_autoconfig[16] = {
 
 bool ncr_oktagon_autoconfig_init(struct autoconfig_info *aci)
 {
+       device_add_reset(ncr9x_reset);
        aci->autoconfigp = oktagon_autoconfig;
        if (!aci->doinit)
                return true;
@@ -2113,6 +2128,7 @@ bool ncr_alf3_autoconfig_init(struct autoconfig_info *aci)
                memcpy(aci->autoconfig_bytes, alf3_autoconfig, 16);
                aci->autoconfigp = aci->autoconfig_bytes;
        }
+       device_add_reset(ncr9x_reset);
        if (!aci->doinit) {
                return true;
        }
@@ -2176,6 +2192,7 @@ bool ncr_dkb_autoconfig_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_RAPIDFIRE);
 
+       device_add_reset(ncr9x_reset);
        aci->autoconfigp = dkb_autoconfig;
        if (!aci->doinit)
                return true;
@@ -2221,6 +2238,7 @@ bool typhoon2scsi_init(struct autoconfig_info *aci)
        uae_u8 *rom = xcalloc(uae_u8, 65536);
        load_rom_rc(aci->rc, ROMTYPE_CB_TYPHOON2, 32768, 32768, rom, 65536, LOADROM_EVENONLY_ODDONE);
        memcpy(aci->autoconfig_raw, aci->rc->autoboot_disabled ? rom + 256 : rom, 128);
+       device_add_reset(ncr9x_reset);
        if (!aci->doinit) {
                xfree(rom);
                return true;
@@ -2256,6 +2274,7 @@ bool ncr_ematrix_autoconfig_init(struct autoconfig_info *aci)
        uae_u8 *rom = xcalloc(uae_u8, 65536);
        load_rom_rc(aci->rc, ROMTYPE_CB_EMATRIX, 32768, 32768, rom, 65536, LOADROM_EVENONLY_ODDONE);
        memcpy(aci->autoconfig_raw, aci->rc->autoboot_disabled ? rom + 256 : rom, 128);
+       device_add_reset(ncr9x_reset);
        if (!aci->doinit) {
                xfree(rom);
                return true;
@@ -2317,6 +2336,7 @@ bool ncr_scram5394_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_SCRAM5394);
 
+       device_add_reset(ncr9x_reset);
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
@@ -2348,6 +2368,7 @@ bool ncr_mtecmastercard_init(struct autoconfig_info *aci)
        uae_u8 *rom = xcalloc(uae_u8, 65536);
        load_rom_rc(aci->rc, ROMTYPE_MASTERCARD, 32768, 0, rom, 65536, LOADROM_EVENONLY_ODDONE);
        memcpy(aci->autoconfig_raw, aci->rc->autoboot_disabled ? rom + 256 : rom, 128);
+       device_add_reset(ncr9x_reset);
        if (!aci->doinit) {
                xfree(rom);
                return true;
@@ -2382,6 +2403,7 @@ bool ncr_rapidfire_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_RAPIDFIRE);
 
+       device_add_reset(ncr9x_reset);
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
@@ -2430,17 +2452,6 @@ static void ncr9x_esp_scsi_init(struct ncr9x_state *ncr, ESPDMAMemoryReadWriteFu
        esp_scsi_reset(&ncr->devobject, ncr);
 }
 
-void ncr9x_free(void)
-{
-       for (int i = 0; ncr_units[i]; i++) {
-               freencrunit(ncr_units[i]);
-       }
-}
-
-void ncr9x_init(void)
-{
-}
-
 static void allocscsidevice(struct ncr9x_state *ncr, int ch, struct scsi_data *handle, int uae_unitnum)
 {
        handle->privdata = ncr;
index f632c37f081f7d1e007bda2f6e508d65dd756918..ed8a738dc131caae3fc2e9e38a71998ff870920e 100644 (file)
@@ -180,7 +180,7 @@ static void set_irq6(int id, int level)
                safe_interrupt_set(IRQ_SOURCE_NCR, 0, true);
 }
 
-void ncr_rethink(void)
+static void ncr_rethink(void)
 {
        for (int i = 0; ncr_units[i]; i++) {
                if (ncr_units[i] != ncr_cs && ncr_units[i]->irq)
@@ -398,7 +398,7 @@ static void check_timer(struct ncr_state *ncr)
        }
 }
 
-void ncr_vsync(void)
+static void ncr_vsync(void)
 {
        for (int i = 0; ncr_units[i]; i++) {
                if (ncr_units[i] == ncr_magnum40) {
@@ -849,11 +849,31 @@ static void ncr_init_board(struct ncr_state *ncr)
        ncr->configured = 0;
 }
 
+static void ncr_free(void)
+{
+       for (int i = 0; i < MAX_NCR_UNITS; i++) {
+               freencrunit(ncr_units[i]);
+       }
+}
+
+static void ncr_reset_board(struct ncr_state *ncr);
+void ncr_reset(int hardreset)
+{
+       for (int i = 0; i < MAX_NCR_UNITS; i++) {
+               ncr_reset_board(ncr_units[i]);
+       }
+}
+
 static void ncr_reset_board (struct ncr_state *ncr)
 {
        if (!ncr)
                return;
        ncr->irq = false;
+
+       device_add_rethink(ncr_rethink);
+       device_add_exit(ncr_free);
+       device_add_vsync_pre(ncr_vsync);
+       device_add_reset(ncr_reset);
 }
 
 // 01010040
@@ -869,6 +889,7 @@ static const uae_u8 warpengine_a4000_autoconfig[16] = {
 bool ncr710_warpengine_autoconfig_init(struct autoconfig_info *aci)
 {
        aci->autoconfigp = warpengine_a4000_autoconfig;
+       device_add_reset(ncr_reset);
        if (!aci->doinit)
                return true;
 
@@ -940,6 +961,7 @@ bool ncr710_a4091_autoconfig_init (struct autoconfig_info *aci)
                zfile_fclose(z);
        }
 
+       device_add_reset(ncr_reset);
        if (!aci->doinit) {
                xfree(rom);
                return true;
@@ -973,6 +995,7 @@ static const uae_u8 zeus040_autoconfig[16] = {
 bool ncr710_zeus040_autoconfig_init(struct autoconfig_info *aci)
 {
        aci->autoconfigp = zeus040_autoconfig;
+       device_add_reset(ncr_reset);
        if (!aci->doinit)
                return true;
 
@@ -1008,6 +1031,7 @@ bool ncr710_zeus040_autoconfig_init(struct autoconfig_info *aci)
 
 bool ncr710_magnum40_autoconfig_init(struct autoconfig_info *aci)
 {
+       device_add_reset(ncr_reset);
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_CB_MAGNUM40, 65536, 0, aci->autoconfig_raw, 128, 0);
                return true;
@@ -1039,24 +1063,6 @@ bool ncr710_magnum40_autoconfig_init(struct autoconfig_info *aci)
        return true;
 }
 
-void ncr_free(void)
-{
-       for (int i = 0; i < MAX_NCR_UNITS; i++) {
-               freencrunit(ncr_units[i]);
-       }
-}
-
-void ncr_init(void)
-{
-}
-
-void ncr_reset(void)
-{
-       for (int i = 0; i < MAX_NCR_UNITS; i++) {
-               ncr_reset_board(ncr_units[i]);
-       }
-}
-
 static void allocscsidevice(struct ncr_state *ncr, int ch, struct scsi_data *handle, int uae_unitnum)
 {
        handle->privdata = ncr;
index 46619ea41958cd5c80de213bbb30133c376d42f3..60a5211edff578d50949594bb0eaa7ece55d8acb 100644 (file)
@@ -1164,7 +1164,7 @@ static int unqueuebuffers (struct dschannel *dc)
        }
 }
 
-void ahi_hsync (void)
+static void ahi_hsync (void)
 {
        struct DSAHI *dsahip = &dsahi[0];
        static int cnt;
index 3b27d8e570749c863ae07add9fcfb1518a837709..ef9a0a57b415039e15475b1c7dcd4b5d412d78b3 100644 (file)
@@ -74,6 +74,7 @@
 #include "gfxboard.h"
 #include "gfxfilter.h"
 #include "dxwrap.h"
+#include "devices.h"
 
 int debug_rtg_blitter = 3;
 
@@ -1249,7 +1250,7 @@ void picasso_handle_vsync(void)
        }
 }
 
-void picasso_handle_hsync(void)
+static void picasso_handle_hsync(void)
 {
        struct AmigaMonitor *mon = &AMonitors[currprefs.rtgboards[0].monitor_id];
        struct amigadisplay *ad = &adisplays[currprefs.rtgboards[0].monitor_id];
@@ -6160,7 +6161,7 @@ static void inituaegfxfuncs(TrapContext *ctx, uaecptr start, uaecptr ABI)
                initvblankABI(ctx, uaegfx_base, ABI);
 }
 
-void picasso_reset(int monid)
+static void picasso_reset2(int monid)
 {
        struct picasso96_state_struct *state = &picasso96_state[monid];
        if (!monid && currprefs.rtg_multithread) {
@@ -6203,11 +6204,33 @@ void picasso_reset(int monid)
        unlockrtg();
 }
 
+static void picasso_reset(int hardreset)
+{
+       for (int i = 0; i < MAX_AMIGADISPLAYS; i++) {
+               picasso_reset2(i);
+       }
+}
+
+static void picasso_free(void)
+{
+       if (render_thread_state > 0) {
+               write_comm_pipe_int(render_pipe, -1, 0);
+               while (render_thread_state >= 0) {
+                       Sleep(10);
+               }
+               render_thread_state = 0;
+       }
+}
+
 void uaegfx_install_code (uaecptr start)
 {
        uaegfx_rom = start;
        org (start);
        inituaegfxfuncs(NULL, start, 0);
+
+       device_add_reset(picasso_reset);
+       device_add_hsync(picasso_handle_hsync);
+       device_add_exit(picasso_free);
 }
 
 #define UAEGFX_VERSION 3
@@ -6374,17 +6397,6 @@ uae_u32 picasso_demux (uae_u32 arg, TrapContext *ctx)
        return 0;
 }
 
-void picasso_free(void)
-{
-       if (render_thread_state > 0) {
-               write_comm_pipe_int(render_pipe, -1, 0);
-               while (render_thread_state >= 0) {
-                       Sleep(10);
-               }
-               render_thread_state = 0;
-       }
-}
-
 static uae_u32 p96_restored_flags;
 
 void restore_p96_finish (void)
index 2d08c7fb6cb4328e20a879a81ee1c7dfc1f2ad2f..bc99664b78ff2e9bc9b7f9c5d209569c94c02fc4 100644 (file)
@@ -630,10 +630,8 @@ extern struct picasso96_state_struct picasso96_state[MAX_AMIGAMONITORS];
 extern void picasso_enablescreen(int monid, int on);
 extern void picasso_refresh(int monid);
 extern void init_hz_p96(int monid);
-extern void picasso_handle_hsync(void);
 extern void picasso_handle_vsync(void);
 extern void picasso_trigger_vblank(void);
-extern void picasso_reset(int monid);
 extern bool picasso_is_active(int monid);
 extern int picasso_setwincursor(int monid);
 extern int picasso_palette(struct MyCLUTEntry *MCLUT, uae_u32 *clut);
@@ -642,7 +640,6 @@ extern void picasso_getwritewatch (int index, int offset);
 extern bool picasso_is_vram_dirty (int index, uaecptr addr, int size);
 extern void picasso_statusline (int monid, uae_u8 *dst);
 extern void picasso_invalidate(int monid, int x, int y, int w, int h);
-extern void picasso_free(void);
 
 /* This structure describes the UAE-side framebuffer for the Picasso
  * screen.  */
index 97e0bb725f7640dab6b9fcc3dac9a45b7e1c3877..ffd1118d8edaa6d27d24798e9ce5b2dfecb1cc12 100644 (file)
@@ -36,6 +36,7 @@
 #include "rp.h"
 #include "direct3d.h"
 #include "debug.h"
+#include "devices.h"
 
 static int initialized;
 static RPGUESTINFO guestinfo;
@@ -1543,6 +1544,9 @@ HRESULT rp_init (void)
                dactmask[i] = 0;
        }
        mousecapture = 0;
+
+       device_add_vsync_pre(rp_vsync);
+
        return hr;
 }
 
diff --git a/pci.cpp b/pci.cpp
index bcd6ceeba1e74f4657727fd273fd4747722da5e7..db2945a1be34c5267731a46126da00b216c7abeb 100644 (file)
--- a/pci.cpp
+++ b/pci.cpp
@@ -131,7 +131,7 @@ static void pci_board_add(struct pci_bridge *pcib, const struct pci_board *pci,
        }
 }
 
-void pci_free(void)
+static void pci_free(void)
 {
        for (int i = 0; i < PCI_BRIDGE_MAX; i++) {
                pci_bridge_free(bridges[i]);
@@ -141,12 +141,12 @@ void pci_free(void)
                hsyncs[i] = NULL;
        }
 }
-void pci_reset(void)
+static void pci_reset(int hardreset)
 {
        pci_free();
 }
 
-void pci_hsync(void)
+static void pci_hsync(void)
 {
        for (int i = 0; i < MAX_PCI_BOARDS; i++) {
                if (hsyncs[i])
@@ -154,7 +154,7 @@ void pci_hsync(void)
        }
 }
 
-void pci_rethink(void)
+static void pci_rethink(void)
 {
        for (int i = 0; i < PCI_BRIDGE_MAX; i++) {
                struct pci_bridge *pcib = bridges[i];
@@ -1484,6 +1484,14 @@ static void add_pci_devices(struct pci_bridge *pcib, struct autoconfig_info *aci
        }
 }
 
+static void pci_init(void)
+{
+       device_add_reset(pci_reset);
+       device_add_rethink(pci_rethink);
+       device_add_exit(pci_free);
+       device_add_hsync(pci_hsync);
+}
+
 // Wildfire
 
 void wildfire_ncr815_irq(int id, int v)
@@ -1496,6 +1504,7 @@ bool dkb_wildfire_pci_init(struct autoconfig_info *aci)
 {
        struct pci_bridge *pcib = pci_bridge_alloc();
 
+       device_add_reset(pci_reset);
        if (!aci->doinit) {
                return true;
        }
@@ -1520,6 +1529,7 @@ bool dkb_wildfire_pci_init(struct autoconfig_info *aci)
        map_banks(&pci_bridge_bank, 0xffff0000 >> 16, 0x10000 >> 16, 0);
        pcib->data = xcalloc(uae_u8, 32768);
        aci->addrbank = &expamem_null;
+       pci_init();
        return true;
 }
 
@@ -1554,6 +1564,7 @@ static int prometheus_get_index(uaecptr addr)
 
 static bool prometheus_pci_init(struct autoconfig_info *aci)
 {
+       device_add_reset(pci_reset);
        if (!aci->doinit) {
                for (int i = 0; i < sizeof prometheus_autoconfig; i++) {
                        ew(aci->autoconfig_raw, i * 4, prometheus_autoconfig[i]);
@@ -1584,6 +1595,7 @@ static bool prometheus_pci_init(struct autoconfig_info *aci)
                ew(pcib->acmemory, i * 4, prometheus_autoconfig[i]);
        }
        aci->addrbank = pcib->bank;
+       pci_init();
        return true;
 }
 
@@ -1611,6 +1623,7 @@ static bool grex_pci_init(struct autoconfig_info *aci)
        aci->start = 0x80000000;
        aci->size = 0x80000000;
 
+       device_add_reset(pci_reset);
        if (!aci->doinit) {
                return true;
        }
@@ -1633,7 +1646,7 @@ static bool grex_pci_init(struct autoconfig_info *aci)
        map_banks(&pci_io_bank, 0xfffa0000 >> 16, 0x20000 >> 16, 0);
        map_banks(&pci_bridge_bank, 0xfffe0000 >> 16, 0x10000 >> 16, 0);
        pcib->io_offset = 0xfffa0000;
-
+       pci_init();
        return true;
 }
 
@@ -1669,6 +1682,7 @@ static bool cbvision(struct autoconfig_info *aci)
        pcib->io_offset = 0xfffa0000;
        aci->zorro = 0;
        aci->parent_of_previous = true;
+       pci_init();
        return true;
 }
 
@@ -1768,6 +1782,7 @@ static void mediator_pci_init_1200(struct pci_bridge *pcib)
 
 static addrbank *mediator_pci_init_1200_1(struct autoconfig_info *aci, struct romconfig *rc, struct mediator_autoconfig *m_ac)
 {
+       device_add_reset(pci_reset);
        if (!aci->doinit) {
                for (int i = 0; i < 16; i++) {
                        ew(aci->autoconfig_raw, i * 4, m_ac->io[i]);
@@ -1791,11 +1806,13 @@ static addrbank *mediator_pci_init_1200_1(struct autoconfig_info *aci, struct ro
        for (int i = 0; i < 16; i++) {
                ew(pcib->acmemory_2, i * 4, m_ac->io[i]);
        }
+       pci_init();
        return &pci_bridge_bank_2;
 }
 
 static addrbank *mediator_pci_init_1200_2(struct autoconfig_info *aci, struct romconfig *rc, struct mediator_autoconfig *m_ac)
 {
+       device_add_reset(pci_reset);
        if (!aci->doinit) {
                const uae_u8 *ac = (rc->device_settings & 2) ? m_ac->mem_large : m_ac->mem_small;
                for (int i = 0; i < 16; i++) {
@@ -1822,6 +1839,7 @@ static addrbank *mediator_pci_init_1200_2(struct autoconfig_info *aci, struct ro
        for (int i = 0; i < 16; i++) {
                ew(pcib->acmemory, i * 4, ac[i]);
        }
+       pci_init();
        return &pci_bridge_bank;
 }
 
@@ -1846,6 +1864,7 @@ static void mediator_pci_init_4000(struct pci_bridge *pcib)
 
 static addrbank *mediator_pci_init_4000_1(struct autoconfig_info *aci, struct romconfig *rc, struct mediator_autoconfig *m_ac)
 {
+       device_add_reset(pci_reset);
        if (!aci->doinit) {
                aci->autoconfigp = m_ac->io;
                return &pci_bridge_bank_2;
@@ -1867,10 +1886,12 @@ static addrbank *mediator_pci_init_4000_1(struct autoconfig_info *aci, struct ro
        for (int i = 0; i < 16; i++) {
                ew(pcib->acmemory_2, i * 4, m_ac->io[i]);
        }
+       pci_init();
        return &pci_bridge_bank_2;
 }
 static addrbank *mediator_pci_init_4000_2(struct autoconfig_info *aci, struct romconfig *rc, struct mediator_autoconfig *m_ac)
 {
+       device_add_reset(pci_reset);
        if (!aci->doinit) {
                aci->autoconfigp = (rc->device_settings & 2) ? m_ac->mem_large : m_ac->mem_small;
                return &pci_bridge_bank;
@@ -1895,6 +1916,7 @@ static addrbank *mediator_pci_init_4000_2(struct autoconfig_info *aci, struct ro
        for (int i = 0; i < 16; i++) {
                ew(pcib->acmemory, i * 4, ac[i]);
        }
+       pci_init();
        return &pci_bridge_bank;
 }
 
index fb3df8aa0f0657e7d5ff3e0a547ec85bfa129713..5cc70222a74047999ce84b1d10b0be7e27f7aa88 100644 (file)
@@ -16,6 +16,7 @@
 #include "uae/log.h"
 #include "uae/ppc.h"
 #include "uae/qemu.h"
+#include "devices.h"
 
 #define SPINLOCK_DEBUG 0
 #define PPC_ACCESS_LOG 0
@@ -808,6 +809,21 @@ bool UAECALL uae_ppc_io_mem_read64(uint32_t addr, uint64_t *data)
        return true;
 }
 
+static void uae_ppc_hsync_handler(void)
+{
+       if (ppc_state == PPC_STATE_INACTIVE)
+               return;
+       if (using_pearpc()) {
+               if (ppc_state != PPC_STATE_SLEEP)
+                       return;
+               if (impl.get_dec() == 0) {
+                       uae_ppc_wakeup();
+               } else {
+                       impl.do_dec(ppc_cycle_count);
+               }
+       }
+}
+
 void uae_ppc_cpu_stop(void)
 {
        if (ppc_state == PPC_STATE_INACTIVE)
@@ -838,6 +854,8 @@ void uae_ppc_cpu_reboot(void)
 
        initialize();
 
+       device_add_hsync(uae_ppc_hsync_handler);
+
        if (!ppc_thread_running) {
                write_log(_T("Starting PPC thread.\n"));
                ppc_thread_running = true;
@@ -946,21 +964,6 @@ void uae_ppc_crash(void)
        }
 }
 
-void uae_ppc_hsync_handler(void)
-{
-       if (ppc_state == PPC_STATE_INACTIVE)
-               return;
-       if (using_pearpc()) {
-               if (ppc_state != PPC_STATE_SLEEP)
-                       return;
-               if (impl.get_dec() == 0) {
-                       uae_ppc_wakeup();
-               } else {
-                       impl.do_dec(ppc_cycle_count);
-               }
-       }
-}
-
 void uae_ppc_pause(int pause)
 {
        if (ppc_state == PPC_STATE_INACTIVE)
index 4ef57d3bd05470b9488f123c22a9c49f9dd8af04..d5aaef7c20933623358e5218d84e72c73cf3b487 100644 (file)
@@ -1893,7 +1893,7 @@ static void REGPARAM2 ariadne2_lput(uaecptr addr, uae_u32 l)
        }
 }
 
-void rethink_ne2000(void)
+static void rethink_ne2000(void)
 {
        struct ne2000_s *ne = getne2k(0);
        if (!ne->ariadne2_board_state)
@@ -1903,7 +1903,7 @@ void rethink_ne2000(void)
        }
 }
 
-void ne2000_hsync(void)
+static void ne2000_hsync(void)
 {
        struct ne2000_s *ne = getne2k(0);
        if (!ne->ariadne2_board_state)
@@ -1929,12 +1929,7 @@ static addrbank ariadne2_bank = {
        ABFLAG_IO | ABFLAG_PPCIOSPACE, S_READ, S_WRITE
 };
 
-void ne2000_free(void)
-{
-       ne2000_reset();
-}
-
-void ne2000_reset(void)
+static void ne2000_reset(int hardreset)
 {
        struct ne2000_s *ne = getne2k(0);
        ne->ariadne2_irq = false;
@@ -1944,6 +1939,19 @@ void ne2000_reset(void)
        ne->ariadne2_board_state = NULL;
 }
 
+static void ne2000_free(void)
+{
+       ne2000_reset(1);
+}
+
+static void init(void)
+{
+       device_add_exit(ne2000_free);
+       device_add_reset(ne2000_reset);
+       device_add_hsync(ne2000_hsync);
+       device_add_rethink(rethink_ne2000);
+}
+
 bool ariadne2_init(struct autoconfig_info *aci)
 {
        struct ne2000_s *ne = getne2k(0);
@@ -1956,6 +1964,7 @@ bool ariadne2_init(struct autoconfig_info *aci)
        aci->autoconfigp = ert->autoconfig;
        aci->addrbank = &ariadne2_bank;
        aci->autoconfig_automatic = true;
+       device_add_reset(ne2000_reset);
        if (!aci->doinit)
                return true;
 
@@ -1965,6 +1974,8 @@ bool ariadne2_init(struct autoconfig_info *aci)
                return false;
        ne2000_byteswapsupported(&ne2000state);
 
+       init();
+
        return true;
 }
 
@@ -1980,6 +1991,7 @@ bool hydra_init(struct autoconfig_info *aci)
        aci->autoconfigp = ert->autoconfig;
        aci->addrbank = &ariadne2_bank;
        aci->autoconfig_automatic = true;
+       device_add_reset(ne2000_reset);
        if (!aci->doinit)
                return true;
 
@@ -1989,6 +2001,8 @@ bool hydra_init(struct autoconfig_info *aci)
                return false;
        ne2000_setisdp8390(&ne2000state);
 
+       init();
+
        return true;
 }
 
@@ -2004,6 +2018,7 @@ bool lanrover_init(struct autoconfig_info *aci)
        aci->autoconfigp = ert->autoconfig;
        aci->addrbank = &ariadne2_bank;
        aci->autoconfig_automatic = true;
+       device_add_reset(ne2000_reset);
        if (!aci->doinit)
                return true;
 
@@ -2014,6 +2029,8 @@ bool lanrover_init(struct autoconfig_info *aci)
        ne2000_setisdp8390(&ne2000state);
        ne->level6 = (aci->rc->device_settings & 1) != 0;
 
+       init();
+
        return true;
 }
 
@@ -2029,6 +2046,7 @@ bool xsurf_init(struct autoconfig_info *aci)
        aci->autoconfigp = ert->autoconfig;
        aci->addrbank = &ariadne2_bank;
        aci->autoconfig_automatic = true;
+       device_add_reset(ne2000_reset);
        if (!aci->doinit)
                return true;
 
@@ -2040,6 +2058,8 @@ bool xsurf_init(struct autoconfig_info *aci)
        ne2000_byteswapsupported(&ne2000state);
        ne2000_setident(&ne2000state, 0x50, 0x70);
 
+       init();
+
        return true;
 }
 
@@ -2055,6 +2075,7 @@ bool xsurf100_init(struct autoconfig_info *aci)
        aci->autoconfigp = ert->autoconfig;
        aci->addrbank = &ariadne2_bank;
        aci->autoconfig_automatic = true;
+       device_add_reset(ne2000_reset);
        if (!aci->doinit)
                return true;
 
@@ -2064,5 +2085,7 @@ bool xsurf100_init(struct autoconfig_info *aci)
                return false;
        ne2000_setident(&ne2000state, 0x50, 0x70);
 
+       init();
+
        return true;
 }
index d307032e1cbd976e1e8143513c3f00cfedf12b5f..10410f90c8091c7e10e2107d94ad199f2c7250f4 100644 (file)
--- a/sana2.cpp
+++ b/sana2.cpp
@@ -32,6 +32,7 @@
 #endif
 #include "execio.h"
 #include "debug.h"
+#include "devices.h"
 
 #ifdef SANA2
 
@@ -1797,7 +1798,7 @@ static uae_u32 REGPARAM2 uaenet_int_handler(TrapContext *ctx)
        }
 }
 
-void uaenet_vsync(void)
+static void uaenet_vsync(void)
 {
        if (!irq_init)
                return;
@@ -1863,6 +1864,26 @@ static void dev_reset (void)
 
 }
 
+static void netdev_start_threads(void)
+{
+       if (!currprefs.sana2)
+               return;
+       if (log_net)
+               write_log(_T("netdev_start_threads()\n"));
+       uae_sem_init(&change_sem, 0, 1);
+       uae_sem_init(&pipe_sem, 0, 1);
+       uae_sem_init(&async_sem, 0, 1);
+}
+
+static void netdev_reset(int hardreset)
+{
+       uaenet_signal_state = 1;
+       netdev_start_threads();
+       if (!currprefs.sana2)
+               return;
+       dev_reset();
+}
+
 uaecptr netdev_startup(TrapContext *ctx, uaecptr resaddr)
 {
        if (!currprefs.sana2)
@@ -1991,25 +2012,8 @@ void netdev_install (void)
        dw (NSCMD_DEVICEQUERY);
        dw (0);
 
-}
-
-void netdev_start_threads (void)
-{
-       if (!currprefs.sana2)
-               return;
-       if (log_net)
-               write_log (_T("netdev_start_threads()\n"));
-       uae_sem_init(&change_sem, 0, 1);
-       uae_sem_init(&pipe_sem, 0, 1);
-       uae_sem_init(&async_sem, 0, 1);
-}
-
-void netdev_reset (void)
-{
-       uaenet_signal_state = 1;
-       if (!currprefs.sana2)
-               return;
-       dev_reset ();
+       device_add_vsync_pre(uaenet_vsync);
+       device_add_reset(netdev_reset);
 }
 
 #endif /* SANA2 */
index 97b63d27cf89d2981a2df3a713722c09e31ce60c..933daf4022e63f0907523cf7e1854d65f9cad0bb 100644 (file)
--- a/scsi.cpp
+++ b/scsi.cpp
@@ -935,14 +935,6 @@ static struct soft_scsi *allocscsi(struct soft_scsi **ncr, struct romconfig *rc,
        return *ncr;
 }
 
-static struct soft_scsi *getscsi(struct romconfig *rc)
-{
-       if (rc->unitdata)
-               return (struct soft_scsi*)rc->unitdata;
-       return NULL;
-}
-
-
 static struct soft_scsi *getscsiboard(uaecptr addr)
 {
        for (int i = 0; soft_scsi_devices[i]; i++) {
@@ -1549,6 +1541,21 @@ static void dma_check(struct soft_scsi *ncr)
        }
 }
 
+void x86_doirq(uint8_t irqnum);
+static void ncr80_rethink(void)
+{
+       for (int i = 0; soft_scsi_devices[i]; i++) {
+               struct soft_scsi *s = soft_scsi_devices[i];
+               if (s->irq && s->intena && ((s->c400 && (s->regs_400[0] & 0x10) && !s->c400_count) || !s->c400)) {
+                       if (soft_scsi_devices[i] == x86_hd_data) {
+                               ;// x86_doirq(5);
+                       } else {
+                               safe_interrupt_set(IRQ_SOURCE_SCSI, i, soft_scsi_devices[i]->level6);
+                       }
+               }
+       }
+}
+
 // AIC-6250
 
 static void aic_int(struct soft_scsi *scsi, uae_u8 mask)
@@ -1797,21 +1804,6 @@ static void aic_bput_data(struct soft_scsi *scsi, uae_u8 v)
 
 // NCR 53C80/MISC SCSI-LIKE
 
-void x86_doirq(uint8_t irqnum);
-void ncr80_rethink(void)
-{
-       for (int i = 0; soft_scsi_devices[i]; i++) {
-               struct soft_scsi *s = soft_scsi_devices[i];
-               if (s->irq && s->intena && ((s->c400 && (s->regs_400[0] & 0x10) && !s->c400_count) || !s->c400)) {
-                       if (soft_scsi_devices[i] == x86_hd_data) {
-                               ;// x86_doirq(5);
-                       } else {
-                               safe_interrupt_set(IRQ_SOURCE_SCSI, i, soft_scsi_devices[i]->level6);
-                       }
-               }
-       }
-}
-
 static void ncr5380_set_irq(struct soft_scsi *scsi)
 {
        if (scsi->irq)
@@ -4112,7 +4104,7 @@ uae_u32 soft_scsi_get(uaecptr addr, int size)
        return v;
 }
 
-void soft_scsi_free(void)
+static void soft_scsi_free(void)
 {
        parallel_port_scsi = false;
        parallel_port_scsi_data = NULL;
@@ -4123,13 +4115,28 @@ void soft_scsi_free(void)
        }
 }
 
-void soft_scsi_reset(void)
+static void soft_scsi_reset(int hardreset)
 {
        for (int i = 0; soft_scsi_devices[i]; i++) {
                raw_scsi_reset(&soft_scsi_devices[i]->rscsi);
        }
 }
 
+static struct soft_scsi *getscsi(struct romconfig *rc)
+{
+       device_add_rethink(ncr80_rethink);
+       device_add_reset(soft_scsi_reset);
+       device_add_exit(soft_scsi_free);
+       if (rc->unitdata)
+               return (struct soft_scsi *)rc->unitdata;
+       return NULL;
+}
+
+static void scsi_add_reset(void)
+{
+       device_add_reset(soft_scsi_reset);
+}
+
 /*
        $8380 select unit (unit mask)
 
@@ -4149,6 +4156,7 @@ bool supra_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_SUPRA);
        aci->autoconfigp = ert->subtypes[aci->rc->subtype].autoconfig;
+       scsi_add_reset();
        if (!aci->doinit)
                return true;
 
@@ -4178,6 +4186,7 @@ void supra_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig
 
 bool golem_init(struct autoconfig_info *aci)
 {
+       scsi_add_reset();
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_GOLEM, 8192, aci->rc->autoboot_disabled ? 8192 : 0, aci->autoconfig_raw, 128, 0);
                return true;
@@ -4205,6 +4214,7 @@ bool stardrive_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_STARDRIVE);
        aci->autoconfigp = ert->autoconfig;
+       scsi_add_reset();
        if (!aci->doinit)
                return true;
 
@@ -4227,6 +4237,7 @@ void stardrive_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romco
 
 bool kommos_init(struct autoconfig_info *aci)
 {
+       scsi_add_reset();
        if (!aci->doinit)
                return true;
 
@@ -4254,6 +4265,7 @@ void kommos_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
 
 bool vector_init(struct autoconfig_info *aci)
 {
+       scsi_add_reset();
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_VECTOR, 32768, 0, aci->autoconfig_raw, 128, 0);
                return true;
@@ -4286,6 +4298,7 @@ void vector_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
 
 bool protar_init(struct autoconfig_info *aci)
 {
+       scsi_add_reset();
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_PROTAR, 32768, 0x200, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE);
                return true;
@@ -4308,6 +4321,7 @@ void protar_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig
 
 bool add500_init(struct autoconfig_info *aci)
 {
+       scsi_add_reset();
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_ADD500, 16384, 0, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
                return true;
@@ -4337,6 +4351,7 @@ static uae_u8 kronos_eeprom[32] =
 bool kronos_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_KRONOS);
+       scsi_add_reset();
        aci->autoconfigp = ert->autoconfig;
        if (!aci->doinit)
                return true;
@@ -4375,6 +4390,7 @@ void kronos_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
 
 bool adscsi_init(struct autoconfig_info *aci)
 {
+       scsi_add_reset();
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_ADSCSI, 32768, 0, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
                return true;
@@ -4398,6 +4414,7 @@ void adscsi_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
 bool trumpcardpro_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_IVSTPRO);
+       scsi_add_reset();
        aci->autoconfigp = ert->autoconfig;
        if (!aci->doinit)
                return true;
@@ -4426,6 +4443,7 @@ void trumpcardpro_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct ro
 bool trumpcard_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_IVSTC);
+       scsi_add_reset();
        aci->autoconfigp = ert->autoconfig;
        if (!aci->doinit)
                return true;
@@ -4480,6 +4498,7 @@ void idescsi_scsi_put(uaecptr addr, uae_u8 v)
 bool cltda1000scsi_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_CLTDSCSI);
+       scsi_add_reset();
        aci->autoconfigp = ert->autoconfig;
        if (!aci->doinit)
                return true;
@@ -4508,6 +4527,7 @@ void cltda1000scsi_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct r
 bool ptnexus_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_PTNEXUS);
+       scsi_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
@@ -4536,6 +4556,7 @@ void ptnexus_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconf
 
 bool dataflyer_init(struct autoconfig_info *aci)
 {
+       scsi_add_reset();
        if (!aci->doinit)
                return true;
 
@@ -4612,6 +4633,7 @@ bool tecmar_init(struct autoconfig_info *aci)
 {
        static const uae_u8 ac[16] = { 0x40, 0x00, 0, 0, 1001 >> 8, (uae_u8)1001 };
 
+       scsi_add_reset();
        aci->hardwired = true;
        if (!aci->doinit) {
                aci->zorro = 1;
@@ -4654,6 +4676,7 @@ bool microforge_init(struct autoconfig_info *aci)
        aci->start = 0xef0000;
        aci->size = 0x10000;
        aci->zorro = 0;
+       scsi_add_reset();
        if (!aci->doinit)
                return true;
 
@@ -4677,6 +4700,7 @@ bool xebec_init(struct autoconfig_info *aci)
 {
        aci->start = 0x600000;
        aci->size = 0x800000 - aci->start;
+       scsi_add_reset();
        if (!aci->doinit)
                return true;
 
@@ -4704,6 +4728,7 @@ void xebec_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig
 
 bool paradox_init(struct autoconfig_info *aci)
 {
+       scsi_add_reset();
        if (!aci->doinit)
                return true;
 
@@ -4727,6 +4752,7 @@ bool hda506_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_HDA506);
 
+       scsi_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
@@ -4755,6 +4781,7 @@ bool alf1_init(struct autoconfig_info *aci)
 {
        aci->start = 0xef0000;
        aci->size = 0x10000;
+       scsi_add_reset();
        if (!aci->doinit)
                return true;
 
@@ -4778,6 +4805,7 @@ bool promigos_init(struct autoconfig_info *aci)
 {
        aci->start = 0xf40000;
        aci->size = 0x10000;
+       scsi_add_reset();
        if (!aci->doinit)
                return true;
 
@@ -4803,7 +4831,7 @@ bool system2000_init(struct autoconfig_info *aci)
 {
        aci->start = 0xf00000;
        aci->size = 0x10000;
-
+       scsi_add_reset();
        if (!aci->doinit)
                return true;
 
@@ -4841,7 +4869,7 @@ bool wedge_init(struct autoconfig_info *aci)
 {
        aci->start = 0xea0000;
        aci->size = 0x10000;
-
+       scsi_add_reset();
        if (!aci->doinit)
                return true;
 
@@ -4876,7 +4904,7 @@ bool omtiadapter_init(struct autoconfig_info *aci)
 {
        aci->start = 0x8f0000;
        aci->size = 0x10000;
-
+       scsi_add_reset();
        if (!aci->doinit)
                return true;
 
@@ -4899,6 +4927,7 @@ void omtiadapter_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconf
 
 bool phoenixboard_init(struct autoconfig_info *aci)
 {
+       scsi_add_reset();
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_PHOENIXB, 8192, aci->rc->autoboot_disabled ? 0 : 8192, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
                return true;
@@ -4930,6 +4959,7 @@ void twelvegauge_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct rom
 bool twelvegauge_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_CB_12GAUGE);
+       scsi_add_reset();
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_CB_12GAUGE, 32768, 0, aci->autoconfig_raw, 128, 0);
                return true;
@@ -4958,6 +4988,7 @@ void ivsvector_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romco
 bool ivsvector_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_CB_VECTOR);
+       scsi_add_reset();
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_CB_VECTOR, 65536, 0x300, aci->autoconfig_raw, 128, 0);
                return true;
@@ -4988,6 +5019,7 @@ bool ivsvector_init(struct autoconfig_info *aci)
 bool scram5380_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_SCRAM5380);
+       scsi_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
@@ -5016,6 +5048,7 @@ void scram5380_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romco
 bool ossi_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_OSSI);
+       scsi_add_reset();
        if (!aci->doinit) {
                if (!load_rom_rc(aci->rc, ROMTYPE_OSSI, 32768, aci->rc->autoboot_disabled ? 16384 : 0, aci->autoconfig_raw, 128, 0))
                        aci->autoconfigp = ert->autoconfig;
@@ -5059,6 +5092,7 @@ void dataflyerplus_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct r
 
 bool hardframe_init(struct autoconfig_info *aci)
 {
+       scsi_add_reset();
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_HARDFRAME, 32768, aci->rc->autoboot_disabled ? 64 : 0, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE);
                return true;
@@ -5083,6 +5117,7 @@ void hardframe_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romco
 
 bool inmate_init(struct autoconfig_info *aci)
 {
+       scsi_add_reset();
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_INMATE, 32768, 0, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE);
                return true;
@@ -5106,6 +5141,7 @@ void inmate_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
 bool malibu_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_MALIBU);
+       scsi_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
@@ -5134,6 +5170,7 @@ void malibu_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
 bool addhard_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_ADDHARD);
+       scsi_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
@@ -5161,6 +5198,7 @@ void addhard_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconf
 bool emplant_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_EMPLANT);
+       scsi_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
@@ -5188,6 +5226,7 @@ bool hd3000_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_GOLEMHD3000);
 
+       scsi_add_reset();
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_GOLEMHD3000, 8192, !aci->rc->autoboot_disabled ? 0 : 8192, aci->autoconfig_raw, 128, 0);
                return true;
@@ -5210,6 +5249,7 @@ void hd3000_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
 
 bool eveshamref_init(struct autoconfig_info *aci)
 {
+       scsi_add_reset();
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_EVESHAMREF, 65536, aci->rc->autoboot_disabled ? 0x1000 : 0, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE);
                return true;
@@ -5234,6 +5274,7 @@ bool profex_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_PROFEX);
 
+       scsi_add_reset();
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_PROFEX, 8192, 0, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE);
                if (aci->rc->autoboot_disabled)
@@ -5265,6 +5306,7 @@ void profex_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfi
 
 bool fasttrak_init(struct autoconfig_info *aci)
 {
+       scsi_add_reset();
        if (!aci->doinit) {
                load_rom_rc(aci->rc, ROMTYPE_FASTTRAK, 65536, aci->rc->autoboot_disabled ? 0x4000 : 0x6000, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE);
                return true;
@@ -5288,6 +5330,7 @@ void fasttrak_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romcon
 bool overdrive_init(struct autoconfig_info *aci)
 {
        const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_OVERDRIVE);
+       scsi_add_reset();
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
@@ -5346,6 +5389,7 @@ bool x86_rt1000_init(struct autoconfig_info *aci)
 {
        static const int parent[] = { ROMTYPE_A1060, ROMTYPE_A2088, ROMTYPE_A2088T, ROMTYPE_A2286, ROMTYPE_A2386, 0 };
        aci->parent_romtype = parent;
+       scsi_add_reset();
        if (!aci->doinit)
                return true;
 
index 0848430ab6446553c11a41d1cbd3b56835b01484..f2ef57decf6ca5a44607124f5e1ba298592a6322 100644 (file)
 #define DEBUG_SNDDEV 0
 #define DEBUG_SNDDEV_FIFO 0
 
+static void snd_init(void);
+static void sndboard_rethink(void);
 static uae_u8 *sndboard_get_buffer(int *frames);
 static void sndboard_release_buffer(uae_u8 *buffer, int frames);
 static void sndboard_free_capture(void);
 static bool sndboard_init_capture(int freq);
+static void uaesndboard_reset(int hardreset);
+static void sndboard_reset(int hardreset);
 
 static double base_event_clock;
 
@@ -961,6 +965,11 @@ bool uaesndboard_init (struct autoconfig_info *aci, int z)
 {
        struct uaesndboard_data *data = &uaesndboard[0];
 
+       device_add_reset(uaesndboard_reset);
+
+       if (aci->doinit)
+               snd_init();
+
        data->configured = 0;
        data->enabled = true;
        data->z3 = z == 3;
@@ -998,7 +1007,7 @@ bool uaesndboard_init_z3(struct autoconfig_info *aci)
        return uaesndboard_init(aci, 3);
 }
 
-void uaesndboard_free(void)
+static void uaesndboard_free(void)
 {
        for (int j = 0; j < MAX_DUPLICATE_SOUND_BOARDS; j++) {
                struct uaesndboard_data *data = &uaesndboard[j];
@@ -1008,7 +1017,7 @@ void uaesndboard_free(void)
        sndboard_rethink();
 }
 
-void uaesndboard_reset(void)
+static void uaesndboard_reset(int hardreset)
 {
        for (int j = 0; j < MAX_DUPLICATE_SOUND_BOARDS; j++) {
                struct uaesndboard_data *data = &uaesndboard[j];
@@ -1133,12 +1142,15 @@ bool pmx_init (struct autoconfig_info *aci)
 
        aci->addrbank = &pmx_bank;
        aci->autoconfig_automatic = true;
+       device_add_reset(sndboard_reset);
 
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
        }
 
+       snd_init();
+
        data->configured = 0;
        data->streamid = 0;
        memset(data->acmemory, 0xff, sizeof data->acmemory);
@@ -1152,7 +1164,7 @@ bool pmx_init (struct autoconfig_info *aci)
        return true;
 }
 
-void pmx_free(void)
+static void pmx_free(void)
 {
        for (int j = 0; j < MAX_DUPLICATE_SOUND_BOARDS; j++) {
                struct pmx_data *data = &pmx[j];
@@ -1161,7 +1173,7 @@ void pmx_free(void)
        sndboard_rethink();
 }
 
-void pmx_reset(void)
+static void pmx_reset(int hardreset)
 {
        for (int j = 0; j < MAX_DUPLICATE_SOUND_BOARDS; j++) {
                struct pmx_data *data = &pmx[j];
@@ -1456,7 +1468,7 @@ static void codec_stop(struct snddev_data *data)
        data->capture_buffer = NULL;
 }
 
-void sndboard_rethink(void)
+static void sndboard_rethink(void)
 {
        for (int i = 0; i < MAX_SNDDEVS; i++) {
                if (snddev[i].enabled) {
@@ -1509,7 +1521,7 @@ static void check_prelude_interrupt(struct snddev_data *data)
        }
 }
 
-void sndboard_hsync(void)
+static void sndboard_hsync(void)
 {
        for (int i = 0; i < MAX_SNDDEVS; i++) {
                struct snddev_data *data = &snddev[i];
@@ -2007,10 +2019,13 @@ bool prelude1200_init(struct autoconfig_info *aci)
        aci->addrbank = &prelude1200_bank;
        aci->start = 0xd80000;
        aci->size = 0x10000;
+       device_add_reset(sndboard_reset);
 
        if (!aci->doinit)
                return true;
 
+       snd_init();
+
        data->configured = 1;
        data->baseaddress = 0xd80000;
        data->type = SNDDEV_PRELUDE1200;
@@ -2042,12 +2057,15 @@ bool prelude_init(struct autoconfig_info *aci)
                return false;
 
        aci->addrbank = &prelude_bank;
+       device_add_reset(sndboard_reset);
 
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
        }
 
+       snd_init();
+
        struct snddev_data *data = &snddev[1];
 
        data->configured = 0;
@@ -2083,12 +2101,15 @@ bool toccata_init(struct autoconfig_info *aci)
                return false;
 
        aci->addrbank = &toccata_bank;
+       device_add_reset(sndboard_reset);
 
        if (!aci->doinit) {
                aci->autoconfigp = ert->autoconfig;
                return true;
        }
 
+       snd_init();
+
        struct snddev_data *data = &snddev[0];
 
        data->configured = 0;
@@ -2115,7 +2136,7 @@ bool toccata_init(struct autoconfig_info *aci)
        return true;
 }
 
-void sndboard_reset(void)
+static void sndboard_reset(int hardreset)
 {
        for (int i = 0; i < MAX_SNDDEVS; i++) {
                struct snddev_data *data = &snddev[i];
@@ -2133,9 +2154,9 @@ void sndboard_reset(void)
        sndboard_rethink();
 }
 
-void sndboard_free(void)
+static void sndboard_free(void)
 {
-       sndboard_reset();
+       sndboard_reset(1);
        for (int i = 0; i < MAX_SNDDEVS; i++) {
                struct snddev_data *data = &snddev[i];
                data->rc = NULL;
@@ -2697,7 +2718,7 @@ static void sndboard_vsync_qemu(void)
        audio_activate();
 }
 
-void sndboard_vsync(void)
+static void sndboard_vsync(void)
 {
        if (snddev[0].snddev_active)
                sndboard_vsync_toccata(&snddev[0]);
@@ -2717,6 +2738,16 @@ void sndboard_ext_volume(void)
                calculate_volume_qemu();
 }
 
+static void snd_init(void)
+{
+       device_add_hsync(sndboard_hsync);
+       device_add_vsync_post(sndboard_vsync);
+       device_add_rethink(sndboard_rethink);
+       device_add_exit(sndboard_free);
+       device_add_exit(uaesndboard_free);
+}
+
+
 #ifdef _WIN32
 
 #include <mmdeviceapi.h>
diff --git a/x86.cpp b/x86.cpp
index 42bcacd365c12211ff2c037023cda999f951dbb8..70d33459acf26c7b807f27cf07065fba3407ada1 100644 (file)
--- a/x86.cpp
+++ b/x86.cpp
@@ -496,6 +496,7 @@ static uae_u8 x86_bridge_get_io(struct x86_bridge *xb, uaecptr addr)
        return v;
 }
 
+static void x86_bridge_rethink(void);
 static void set_interrupt(struct x86_bridge *xb, int bit)
 {
        if (xb->amiga_io[IO_AMIGA_INTERRUPT_STATUS] & (1 << bit))
@@ -3185,7 +3186,7 @@ static uint32_t mem_read_romextl2(uint32_t addr, void *priv)
        return *(uint32_t *)&xtiderom[addr & 0x3fff];
 }
 
-void x86_bridge_rethink(void)
+static void x86_bridge_rethink(void)
 {
        struct x86_bridge *xb = bridges[0];
        if (!xb)
@@ -3201,13 +3202,7 @@ void x86_bridge_rethink(void)
        }
 }
 
-void x86_bridge_free(void)
-{
-       x86_bridge_reset();
-       x86_found = 0;
-}
-
-void x86_bridge_reset(void)
+static void x86_bridge_reset(int hardreset)
 {
        for (int i = 0; i < X86_BRIDGE_MAX; i++) {
                struct x86_bridge *xb = bridges[i];
@@ -3249,6 +3244,12 @@ void x86_bridge_reset(void)
        }
 }
 
+static void x86_bridge_free(void)
+{
+       x86_bridge_reset(1);
+       x86_found = 0;
+}
+
 static void check_floppy_delay(void)
 {
        for (int i = 0; i < 4; i++) {
@@ -3331,7 +3332,7 @@ void x86_bridge_sync_change(void)
                return;
 }
 
-void x86_bridge_vsync(void)
+static void x86_bridge_vsync(void)
 {
        struct x86_bridge *xb = bridges[0];
        if (!xb)
@@ -3347,7 +3348,7 @@ void x86_bridge_vsync(void)
        xb->audeventtime = x86_base_event_clock * CYCLE_UNIT / currprefs.sound_freq + 1;
 }
 
-void x86_bridge_hsync(void)
+static void x86_bridge_hsync(void)
 {
        static float totalcycles;
        struct x86_bridge *xb = bridges[0];
@@ -3755,6 +3756,7 @@ bool x86_bridge_init(struct autoconfig_info *aci, uae_u32 romtype, int type)
        const uae_u8 *ac;
        struct romconfig *rc = aci->rc;
 
+       device_add_reset(x86_bridge_reset);
        if (type >= TYPE_2286) {
                ac = type >= TYPE_2386 ? a2386_autoconfig : a1060_autoconfig;
        }
@@ -4009,6 +4011,12 @@ bool x86_bridge_init(struct autoconfig_info *aci, uae_u32 romtype, int type)
        xb->bank = &x86_bridge_bank;
 
        aci->addrbank = xb->bank;
+
+       device_add_hsync(x86_bridge_hsync);
+       device_add_vsync_pre(x86_bridge_vsync);
+       device_add_exit(x86_bridge_free);
+       device_add_rethink(x86_bridge_rethink);
+
        return true;
 }