From: Toni Wilen Date: Sat, 31 Aug 2019 07:48:18 +0000 (+0300) Subject: Dynamic reset/hsync/vsync/etc callback function setup. X-Git-Tag: 4300~131 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=f7bd8e3f10eeddfb9e4b584937031839a700c785;p=francis%2Fwinuae.git Dynamic reset/hsync/vsync/etc callback function setup. --- diff --git a/a2065.cpp b/a2065.cpp index 468ffefa..be76b75f 100644 --- 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 */ diff --git a/a2091.cpp b/a2091.cpp index e3148c31..9ec9ac16 100644 --- a/a2091.cpp +++ b/a2091.cpp @@ -85,15 +85,16 @@ #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) diff --git a/akiko.cpp b/akiko.cpp index 0a151067..600a2c68 100644 --- 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; } diff --git a/arcadia.cpp b/arcadia.cpp index 5437820a..42387735 100644 --- a/arcadia.cpp +++ b/arcadia.cpp @@ -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; +} + diff --git a/autoconf.cpp b/autoconf.cpp index 269501f7..e720801b 100644 --- a/autoconf.cpp +++ b/autoconf.cpp @@ -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; diff --git a/cd32_fmv.cpp b/cd32_fmv.cpp index 8c12e810..993fd4fe 100644 --- a/cd32_fmv.cpp +++ b/cd32_fmv.cpp @@ -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; } diff --git a/cdtv.cpp b/cdtv.cpp index ad863f88..ea2ecaf4 100644 --- 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; } diff --git a/cdtvcr.cpp b/cdtvcr.cpp index f9ca1849..5113a3d0 100644 --- a/cdtvcr.cpp +++ b/cdtvcr.cpp @@ -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 4cdfb29f..4d4ed989 100644 --- 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 diff --git a/cpuboard.cpp b/cpuboard.cpp index 3b951d2f..cef382bf 100644 --- a/cpuboard.cpp +++ b/cpuboard.cpp @@ -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; } diff --git a/custom.cpp b/custom.cpp index 45cf7b04..fea226d5 100644 --- a/custom.cpp +++ b/custom.cpp @@ -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) diff --git a/devices.cpp b/devices.cpp index f60f8af5..5dc04dbd 100644 --- a/devices.cpp +++ b/devices.cpp @@ -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" @@ -22,18 +17,12 @@ #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" @@ -54,79 +43,184 @@ #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) diff --git a/expansion.cpp b/expansion.cpp index 069f5911..168fb065 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -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 { diff --git a/gayle.cpp b/gayle.cpp index c2c1cd0c..f72fc90f 100644 --- 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; diff --git a/gfxboard.cpp b/gfxboard.cpp index 4c7562bc..a98b4526 100644 --- a/gfxboard.cpp +++ b/gfxboard.cpp @@ -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++) { diff --git a/idecontrollers.cpp b/idecontrollers.cpp index 7ad6b991..2b2039fa 100644 --- a/idecontrollers.cpp +++ b/idecontrollers.cpp @@ -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; diff --git a/include/a2065.h b/include/a2065.h index 85739482..e300044b 100644 --- a/include/a2065.h +++ b/include/a2065.h @@ -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 */ diff --git a/include/a2091.h b/include/a2091.h index 40041268..272c4e1f 100644 --- a/include/a2091.h +++ b/include/a2091.h @@ -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 diff --git a/include/akiko.h b/include/akiko.h index b9dd591a..2649c953 100644 --- a/include/akiko.h +++ b/include/akiko.h @@ -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 */ diff --git a/include/arcadia.h b/include/arcadia.h index aee7d65b..79f37794 100644 --- a/include/arcadia.h +++ b/include/arcadia.h @@ -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 */ diff --git a/include/autoconf.h b/include/autoconf.h index ad53d9ce..0436bc0b 100644 --- a/include/autoconf.h +++ b/include/autoconf.h @@ -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 diff --git a/include/cd32_fmv.h b/include/cd32_fmv.h index cb1c5bd8..f04d226d 100644 --- a/include/cd32_fmv.h +++ b/include/cd32_fmv.h @@ -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*); diff --git a/include/cdtv.h b/include/cdtv.h index 0b8252c8..67ddd0fd 100644 --- a/include/cdtv.h +++ b/include/cdtv.h @@ -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); diff --git a/include/cdtvcr.h b/include/cdtvcr.h index 0fc13dfe..8220a599 100644 --- a/include/cdtvcr.h +++ b/include/cdtvcr.h @@ -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 */ diff --git a/include/cpuboard.h b/include/cpuboard.h index e34450b3..7f0f6e3d 100644 --- a/include/cpuboard.h +++ b/include/cpuboard.h @@ -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 diff --git a/include/devices.h b/include/devices.h index 14e784df..0ff88661 100644 --- a/include/devices.h +++ b/include/devices.h @@ -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 diff --git a/include/ethernet.h b/include/ethernet.h index ff60bfa3..03488737 100644 --- a/include/ethernet.h +++ b/include/ethernet.h @@ -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); diff --git a/include/gayle.h b/include/gayle.h index f106d9ed..94b6dd42 100644 --- a/include/gayle.h +++ b/include/gayle.h @@ -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 */ diff --git a/include/gfxboard.h b/include/gfxboard.h index af4895d1..0b7f7270 100644 --- a/include/gfxboard.h +++ b/include/gfxboard.h @@ -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*); diff --git a/include/idecontrollers.h b/include/idecontrollers.h index 68a8ee79..224b70f3 100644 --- a/include/idecontrollers.h +++ b/include/idecontrollers.h @@ -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); diff --git a/include/memory.h b/include/memory.h index fb473b48..b27b7d5e 100644 --- a/include/memory.h +++ b/include/memory.h @@ -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); diff --git a/include/ncr9x_scsi.h b/include/ncr9x_scsi.h index d12bc847..8984f4d5 100644 --- a/include/ncr9x_scsi.h +++ b/include/ncr9x_scsi.h @@ -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); diff --git a/include/ncr_scsi.h b/include/ncr_scsi.h index 86918445..324d38de 100644 --- a/include/ncr_scsi.h +++ b/include/ncr_scsi.h @@ -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); diff --git a/include/pci.h b/include/pci.h index 87822d55..1842ff48 100644 --- a/include/pci.h +++ b/include/pci.h @@ -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); diff --git a/include/pci_hw.h b/include/pci_hw.h index e3f171a3..f9052563 100644 --- a/include/pci_hw.h +++ b/include/pci_hw.h @@ -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); diff --git a/include/sana2.h b/include/sana2.h index 3081aabc..72df9305 100644 --- a/include/sana2.h +++ b/include/sana2.h @@ -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; diff --git a/include/scsi.h b/include/scsi.h index bdf07dcb..80952214 100644 --- a/include/scsi.h +++ b/include/scsi.h @@ -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; diff --git a/include/sndboard.h b/include/sndboard.h index d2c4b9c4..d65b013a 100644 --- a/include/sndboard.h +++ b/include/sndboard.h @@ -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 */ diff --git a/include/uae/ppc.h b/include/uae/ppc.h index 2e23b00a..e1e9982b 100644 --- a/include/uae/ppc.h +++ b/include/uae/ppc.h @@ -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); diff --git a/include/x86.h b/include/x86.h index ca5af70d..cacf7a1b 100644 --- a/include/x86.h +++ b/include/x86.h @@ -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); diff --git a/inputdevice.cpp b/inputdevice.cpp index 673ef267..f5b51f32 100644 --- a/inputdevice.cpp +++ b/inputdevice.cpp @@ -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) { diff --git a/main.cpp b/main.cpp index 291dc247..7ee074cb 100644 --- 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 diff --git a/memory.cpp b/memory.cpp index 70723889..d20c2a8e 100644 --- a/memory.cpp +++ b/memory.cpp @@ -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("")); currprefs.romextfile[0] = 0; - cpuboard_reset(); + cpuboard_reset(1); #ifdef ACTION_REPLAY action_replay_unload (0); diff --git a/ncr9x_scsi.cpp b/ncr9x_scsi.cpp index 69ab2317..458c6281 100644 --- a/ncr9x_scsi.cpp +++ b/ncr9x_scsi.cpp @@ -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; diff --git a/ncr_scsi.cpp b/ncr_scsi.cpp index f632c37f..ed8a738d 100644 --- a/ncr_scsi.cpp +++ b/ncr_scsi.cpp @@ -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; diff --git a/od-win32/ahidsound_new.cpp b/od-win32/ahidsound_new.cpp index 46619ea4..60a5211e 100644 --- a/od-win32/ahidsound_new.cpp +++ b/od-win32/ahidsound_new.cpp @@ -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; diff --git a/od-win32/picasso96_win.cpp b/od-win32/picasso96_win.cpp index 3b27d8e5..ef9a0a57 100644 --- a/od-win32/picasso96_win.cpp +++ b/od-win32/picasso96_win.cpp @@ -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) diff --git a/od-win32/picasso96_win.h b/od-win32/picasso96_win.h index 2d08c7fb..bc99664b 100644 --- a/od-win32/picasso96_win.h +++ b/od-win32/picasso96_win.h @@ -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. */ diff --git a/od-win32/rp.cpp b/od-win32/rp.cpp index 97e0bb72..ffd1118d 100644 --- a/od-win32/rp.cpp +++ b/od-win32/rp.cpp @@ -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 bcd6ceeb..db2945a1 100644 --- 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; } diff --git a/ppc/ppc.cpp b/ppc/ppc.cpp index fb3df8aa..5cc70222 100644 --- a/ppc/ppc.cpp +++ b/ppc/ppc.cpp @@ -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) diff --git a/qemuvga/ne2000.cpp b/qemuvga/ne2000.cpp index 4ef57d3b..d5aaef7c 100644 --- a/qemuvga/ne2000.cpp +++ b/qemuvga/ne2000.cpp @@ -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; } diff --git a/sana2.cpp b/sana2.cpp index d307032e..10410f90 100644 --- 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 */ diff --git a/scsi.cpp b/scsi.cpp index 97b63d27..933daf40 100644 --- 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; diff --git a/sndboard.cpp b/sndboard.cpp index 0848430a..f2ef57de 100644 --- a/sndboard.cpp +++ b/sndboard.cpp @@ -28,10 +28,14 @@ #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 diff --git a/x86.cpp b/x86.cpp index 42bcacd3..70d33459 100644 --- 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; }