diff --git a/mupen64plus-core/data/mupen64plus.ini b/mupen64plus-core/data/mupen64plus.ini index 674abf9..1185b16 100644 --- a/mupen64plus-core/data/mupen64plus.ini +++ b/mupen64plus-core/data/mupen64plus.ini @@ -6227,7 +6227,6 @@ CRC=D3F10E5D 052EA579 Players=1 SaveType=Eeprom 4KB Rumble=Yes -AiDmaModifier=83 [DCC316EFFC4928F5B0AE8D273D8024BF] GoodName=HiRes CFB Demo (PD) @@ -11786,7 +11785,6 @@ CRC=3F245305 FC0B74AA Players=1 SaveType=Eeprom 4KB Rumble=Yes -AiDmaModifier=83 [D0AE6C07AC0481EBA5FF9CE798A69574] GoodName=Pikachu Genki Dechu (J) [b1] diff --git a/mupen64plus-core/src/api/frontend.c b/mupen64plus-core/src/api/frontend.c index e6e2a1e..2bbe74c 100644 --- a/mupen64plus-core/src/api/frontend.c +++ b/mupen64plus-core/src/api/frontend.c @@ -427,7 +427,6 @@ EXPORT m64p_error CALL CoreGetRomSettings(m64p_rom_settings *RomSettings, int Ro RomSettings->disableextramem = entry->disableextramem; RomSettings->rspforceinterrupt = entry->rspforceinterrupt; RomSettings->savetype = entry->savetype; - RomSettings->aidmamodifier = entry->aidmamodifier; return M64ERR_SUCCESS; } diff --git a/mupen64plus-core/src/api/m64p_types.h b/mupen64plus-core/src/api/m64p_types.h index 623d600..0520f5f 100644 --- a/mupen64plus-core/src/api/m64p_types.h +++ b/mupen64plus-core/src/api/m64p_types.h @@ -281,7 +281,6 @@ typedef struct unsigned char biopak; /* 0 - No, 1 - Yes boolean for bio pak support. */ unsigned char disableextramem; /* 0 - No, 1 - Yes boolean for disabling 4MB expansion RAM pack */ unsigned char rspforceinterrupt; - unsigned int aidmamodifier; /* Percentage modifier for AI DMA duration */ } m64p_rom_settings; /* ----------------------------------------- */ diff --git a/mupen64plus-core/src/device/device.c b/mupen64plus-core/src/device/device.c index 7cc31b2..15b9ac7 100644 --- a/mupen64plus-core/src/device/device.c +++ b/mupen64plus-core/src/device/device.c @@ -90,7 +90,7 @@ void init_device(struct device* dev, /* rsp */ uint32_t rsp_force_interrupt, /* ai */ - void* aout, const struct audio_out_backend_interface* iaout, float dma_modifier, + void* aout, const struct audio_out_backend_interface* iaout, /* rdram */ size_t dram_size, /* pif */ @@ -118,14 +118,15 @@ void init_device(struct device* dev, { &dev->si, si_end_of_dma_event }, /* SI */ { &dev->pi, pi_end_of_dma_event }, /* PI */ { &dev->r4300.cp0, special_int_handler }, /* SPECIAL */ - { &dev->ai, ai_end_of_dma_event }, /* AI */ + { &dev->ai, ai_end_of_interrupt_event }, /* AI */ { &dev->sp, rsp_interrupt_event }, /* SP */ { &dev->dp, rdp_interrupt_event }, /* DP */ { &dev->pif, hw2_int_handler }, /* HW2 */ { dev, nmi_int_handler }, /* NMI */ { dev, reset_hard_handler }, /* reset_hard */ { &dev->sp, rsp_end_of_dma_event }, - { &dev->sp, rsp_end_of_tsk_event } + { &dev->sp, rsp_end_of_tsk_event }, + { &dev->ai, ai_end_of_dma_event } }; #define R(x) read_ ## x @@ -183,7 +184,7 @@ void init_device(struct device* dev, emumode, no_compiled_jump, randomize_interrupt, start_address); init_rdp(&dev->dp, &dev->sp, &dev->mi, &dev->mem, &dev->rdram, &dev->r4300); init_rsp(&dev->sp, mem_base_u32(base, MM_RSP_MEM), &dev->mi, &dev->dp, &dev->ri, rsp_force_interrupt); - init_ai(&dev->ai, &dev->mi, &dev->ri, &dev->vi, aout, iaout, dma_modifier); + init_ai(&dev->ai, &dev->mi, &dev->ri, &dev->vi, aout, iaout); init_mi(&dev->mi, &dev->r4300); init_pi(&dev->pi, get_pi_dma_handler, diff --git a/mupen64plus-core/src/device/device.h b/mupen64plus-core/src/device/device.h index ccb7d46..553976d 100644 --- a/mupen64plus-core/src/device/device.h +++ b/mupen64plus-core/src/device/device.h @@ -126,7 +126,7 @@ void init_device(struct device* dev, /* rsp */ uint32_t rsp_force_interrupt, /* ai */ - void* aout, const struct audio_out_backend_interface* iaout, float dma_modifier, + void* aout, const struct audio_out_backend_interface* iaout, /* rdram */ size_t dram_size, /* pif */ diff --git a/mupen64plus-core/src/device/r4300/cp0.h b/mupen64plus-core/src/device/r4300/cp0.h index 746449b..faf3db7 100644 --- a/mupen64plus-core/src/device/r4300/cp0.h +++ b/mupen64plus-core/src/device/r4300/cp0.h @@ -166,7 +166,7 @@ struct interrupt_handler void (*callback)(void*); }; -enum { CP0_INTERRUPT_HANDLERS_COUNT = 14 }; +enum { CP0_INTERRUPT_HANDLERS_COUNT = 15 }; enum { INTR_UNSAFE_R4300 = 0x01, diff --git a/mupen64plus-core/src/device/r4300/interrupt.c b/mupen64plus-core/src/device/r4300/interrupt.c index 6a7e2a5..51dcb68 100644 --- a/mupen64plus-core/src/device/r4300/interrupt.c +++ b/mupen64plus-core/src/device/r4300/interrupt.c @@ -646,6 +646,11 @@ void gen_interrupt(struct r4300_core* r4300) call_interrupt_handler(&r4300->cp0, 13); break; + case AI_DMA: + remove_interrupt_event(&r4300->cp0); + call_interrupt_handler(&r4300->cp0, 14); + break; + default: DebugMessage(M64MSG_ERROR, "Unknown interrupt queue event type %.8X.", r4300->cp0.q.first->data.type); remove_interrupt_event(&r4300->cp0); diff --git a/mupen64plus-core/src/device/r4300/interrupt.h b/mupen64plus-core/src/device/r4300/interrupt.h index c0eb9ad..b3e5869 100644 --- a/mupen64plus-core/src/device/r4300/interrupt.h +++ b/mupen64plus-core/src/device/r4300/interrupt.h @@ -67,5 +67,6 @@ void nmi_int_handler(void* opaque); #define NMI_INT 0x0400 #define RSP_DMA_EVT 0x0800 #define RSP_TSK_EVT 0x1000 +#define AI_DMA 0x2000 #endif /* M64P_DEVICE_R4300_INTERRUPT_H */ diff --git a/mupen64plus-core/src/device/rcp/ai/ai_controller.c b/mupen64plus-core/src/device/rcp/ai/ai_controller.c index 6c99f20..4dcf8d1 100644 --- a/mupen64plus-core/src/device/rcp/ai/ai_controller.c +++ b/mupen64plus-core/src/device/rcp/ai/ai_controller.c @@ -45,7 +45,7 @@ static uint32_t get_remaining_dma_length(struct ai_controller* ai) if (ai->fifo[0].duration == 0) return 0; - next_ai_event = get_event(&ai->mi->r4300->cp0.q, AI_INT); + next_ai_event = get_event(&ai->mi->r4300->cp0.q, AI_DMA); if (next_ai_event == NULL) return 0; @@ -93,12 +93,13 @@ static void do_dma(struct ai_controller* ai, struct ai_dma* dma) ai->delayed_carry = 0; /* schedule end of dma event */ - add_interrupt_event(&ai->mi->r4300->cp0, AI_INT, dma->duration); + add_interrupt_event(&ai->mi->r4300->cp0, AI_INT, dma->duration / 2); + add_interrupt_event(&ai->mi->r4300->cp0, AI_DMA, dma->duration); } static void fifo_push(struct ai_controller* ai) { - unsigned int duration = get_dma_duration(ai) * ai->dma_modifier; + unsigned int duration = get_dma_duration(ai); if (ai->regs[AI_STATUS_REG] & AI_STATUS_BUSY) { @@ -142,15 +143,13 @@ void init_ai(struct ai_controller* ai, struct ri_controller* ri, struct vi_controller* vi, void* aout, - const struct audio_out_backend_interface* iaout, - float dma_modifier) + const struct audio_out_backend_interface* iaout) { ai->mi = mi; ai->ri = ri; ai->vi = vi; ai->aout = aout; ai->iaout = iaout; - ai->dma_modifier = dma_modifier; } void poweron_ai(struct ai_controller* ai) @@ -218,6 +217,13 @@ void write_ai_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask masked_write(&ai->regs[reg], value, mask); } +void ai_end_of_interrupt_event(void* opaque) +{ + struct ai_controller* ai = (struct ai_controller*)opaque; + + raise_rcp_interrupt(ai->mi, MI_INTR_AI); +} + void ai_end_of_dma_event(void* opaque) { struct ai_controller* ai = (struct ai_controller*)opaque; @@ -231,6 +237,4 @@ void ai_end_of_dma_event(void* opaque) } fifo_pop(ai); - raise_rcp_interrupt(ai->mi, MI_INTR_AI); } - diff --git a/mupen64plus-core/src/device/rcp/ai/ai_controller.h b/mupen64plus-core/src/device/rcp/ai/ai_controller.h index 6b2217c..736bd9a 100644 --- a/mupen64plus-core/src/device/rcp/ai/ai_controller.h +++ b/mupen64plus-core/src/device/rcp/ai/ai_controller.h @@ -59,7 +59,6 @@ struct ai_controller unsigned int samples_format_changed; uint32_t last_read; uint32_t delayed_carry; - float dma_modifier; struct mi_controller* mi; struct ri_controller* ri; @@ -79,14 +78,14 @@ void init_ai(struct ai_controller* ai, struct ri_controller* ri, struct vi_controller* vi, void* aout, - const struct audio_out_backend_interface* iaout, - float dma_modifier); + const struct audio_out_backend_interface* iaout); void poweron_ai(struct ai_controller* ai); void read_ai_regs(void* opaque, uint32_t address, uint32_t* value); void write_ai_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask); +void ai_end_of_interrupt_event(void* opaque); void ai_end_of_dma_event(void* opaque); #endif diff --git a/mupen64plus-core/src/main/main.c b/mupen64plus-core/src/main/main.c index 465ba8a..728c610 100644 --- a/mupen64plus-core/src/main/main.c +++ b/mupen64plus-core/src/main/main.c @@ -1778,7 +1778,7 @@ m64p_error main_run(void) randomize_interrupt, g_start_address, rsp_force_interrupt, - &g_dev.ai, &g_iaudio_out_backend_plugin_compat, ((float)ROM_SETTINGS.aidmamodifier / 100.0), + &g_dev.ai, &g_iaudio_out_backend_plugin_compat, rdram_size, joybus_devices, ijoybus_devices, vi_clock_from_tv_standard(ROM_PARAMS.systemtype), vi_expected_refresh_rate_from_tv_standard(ROM_PARAMS.systemtype), diff --git a/mupen64plus-core/src/main/rom.c b/mupen64plus-core/src/main/rom.c index 6beecdf..9e38c0a 100644 --- a/mupen64plus-core/src/main/rom.c +++ b/mupen64plus-core/src/main/rom.c @@ -180,7 +180,6 @@ m64p_error open_rom(const unsigned char* romimage, unsigned int size) ROM_SETTINGS.biopak = entry->biopak; ROM_SETTINGS.disableextramem = entry->disableextramem; ROM_SETTINGS.rspforceinterrupt = entry->rspforceinterrupt; - ROM_SETTINGS.aidmamodifier = entry->aidmamodifier; ROM_PARAMS.cheats = entry->cheats; } else @@ -197,7 +196,6 @@ m64p_error open_rom(const unsigned char* romimage, unsigned int size) ROM_SETTINGS.biopak = 0; ROM_SETTINGS.disableextramem = DEFAULT_DISABLE_EXTRA_MEM; ROM_SETTINGS.rspforceinterrupt = DEFAULT_RSP_FORCE_INTERRUPT; - ROM_SETTINGS.aidmamodifier = DEFAULT_AI_DMA_MODIFIER; ROM_PARAMS.cheats = NULL; } @@ -360,12 +358,6 @@ static size_t romdatabase_resolve_round(void) entry->entry.set_flags |= ROMDATABASE_ENTRY_BIOPAK; } - if (!isset_bitmask(entry->entry.set_flags, ROMDATABASE_ENTRY_AIDMAMODIFIER) && - isset_bitmask(ref->set_flags, ROMDATABASE_ENTRY_AIDMAMODIFIER)) { - entry->entry.aidmamodifier = ref->aidmamodifier; - entry->entry.set_flags |= ROMDATABASE_ENTRY_AIDMAMODIFIER; - } - free(entry->entry.refmd5); entry->entry.refmd5 = NULL; } @@ -461,7 +453,6 @@ void romdatabase_open(void) search->entry.transferpak = 0; search->entry.mempak = 1; search->entry.biopak = 0; - search->entry.aidmamodifier = DEFAULT_AI_DMA_MODIFIER; search->entry.set_flags = ROMDATABASE_ENTRY_NONE; search->next_entry = NULL; @@ -645,15 +636,6 @@ void romdatabase_open(void) DebugMessage(M64MSG_WARNING, "ROM Database: Invalid biopak string on line %i", lineno); } } - else if(!strcmp(l.name, "AiDmaModifier")) - { - if (string_to_int(l.value, &value) && value >= 0 && value <= 200) { - search->entry.aidmamodifier = value; - search->entry.set_flags |= ROMDATABASE_ENTRY_AIDMAMODIFIER; - } else { - DebugMessage(M64MSG_WARNING, "ROM Database: Invalid AiDmaModifier on line %i", lineno); - } - } else { DebugMessage(M64MSG_WARNING, "ROM Database: Unknown property on line %i", lineno); diff --git a/mupen64plus-core/src/main/rom.h b/mupen64plus-core/src/main/rom.h index c829298..d475133 100644 --- a/mupen64plus-core/src/main/rom.h +++ b/mupen64plus-core/src/main/rom.h @@ -112,7 +112,6 @@ typedef struct unsigned char transferpak; /* 0 - No, 1 - Yes boolean for transferpak support. */ unsigned char mempak; /* 0 - No, 1 - Yes boolean for mempak support. */ unsigned char biopak; /* 0 - No, 1 - Yes boolean for biopak support. */ - unsigned int aidmamodifier; uint32_t set_flags; } romdatabase_entry; @@ -128,13 +127,10 @@ typedef struct #define ROMDATABASE_ENTRY_TRANSFERPAK BIT(9) #define ROMDATABASE_ENTRY_MEMPAK BIT(10) #define ROMDATABASE_ENTRY_BIOPAK BIT(11) -#define ROMDATABASE_ENTRY_AIDMAMODIFIER BIT(13) #define ROMDATABASE_ENTRY_RSPFORCEINTERRUPT BIT(14) /* by default, extra mem is enabled */ enum { DEFAULT_DISABLE_EXTRA_MEM = 0 }; -/* Default AI DMA modifier */ -enum { DEFAULT_AI_DMA_MODIFIER = 100 }; /* Default RSP Force Interrupt */ enum { DEFAULT_RSP_FORCE_INTERRUPT = 0 };