More accurate IR modeling, fixes Gen 2 Pokémon mystery gifts
This commit is contained in:
parent
1a41957b3c
commit
967fdadd7c
@ -108,23 +108,32 @@ void GB_timing_sync(GB_gameboy_t *gb)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define IR_DECAY 31500
|
#define IR_DECAY 31500
|
||||||
#define IR_THRESHOLD 19900
|
#define IR_WARMUP 19900
|
||||||
#define IR_MAX IR_THRESHOLD * 2 + IR_DECAY
|
#define IR_THRESHOLD 240
|
||||||
|
#define IR_MAX IR_THRESHOLD * 2 + IR_DECAY + 268
|
||||||
|
|
||||||
static void ir_run(GB_gameboy_t *gb, uint32_t cycles)
|
static void ir_run(GB_gameboy_t *gb, uint32_t cycles)
|
||||||
{
|
{
|
||||||
|
/* TODO: the way this thing works makes the CGB IR port behave inaccurately when used together with HUC1/3 IR ports*/
|
||||||
if ((gb->model > GB_MODEL_CGB_E || !gb->cgb_mode) && gb->cartridge_type->mbc_type != GB_HUC1 && gb->cartridge_type->mbc_type != GB_HUC3) return;
|
if ((gb->model > GB_MODEL_CGB_E || !gb->cgb_mode) && gb->cartridge_type->mbc_type != GB_HUC1 && gb->cartridge_type->mbc_type != GB_HUC3) return;
|
||||||
if (gb->infrared_input || gb->cart_ir || (gb->io_registers[GB_IO_RP] & 1)) {
|
bool is_sensing = (gb->io_registers[GB_IO_RP] & 0xc0) == 0xc0 ||
|
||||||
|
(gb->cartridge_type->mbc_type == GB_HUC1 && gb->huc1.ir_mode) ||
|
||||||
|
(gb->cartridge_type->mbc_type == GB_HUC3 && gb->huc3.mode == 0xE);
|
||||||
|
if (is_sensing && (gb->infrared_input || gb->cart_ir || (gb->io_registers[GB_IO_RP] & 1))) {
|
||||||
gb->ir_sensor += cycles;
|
gb->ir_sensor += cycles;
|
||||||
if (gb->ir_sensor > IR_MAX) {
|
if (gb->ir_sensor > IR_MAX) {
|
||||||
gb->ir_sensor = IR_MAX;
|
gb->ir_sensor = IR_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
gb->effective_ir_input = gb->ir_sensor >= IR_THRESHOLD && gb->ir_sensor <= IR_THRESHOLD + IR_DECAY;
|
gb->effective_ir_input = gb->ir_sensor >= IR_WARMUP + IR_THRESHOLD && gb->ir_sensor <= IR_WARMUP + IR_THRESHOLD + IR_DECAY;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (gb->ir_sensor <= cycles) {
|
unsigned target = is_sensing? IR_WARMUP : 0;
|
||||||
gb->ir_sensor = 0;
|
if (gb->ir_sensor < target) {
|
||||||
|
gb->ir_sensor += cycles;
|
||||||
|
}
|
||||||
|
else if (gb->ir_sensor <= target + cycles) {
|
||||||
|
gb->ir_sensor = target;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
gb->ir_sensor -= cycles;
|
gb->ir_sensor -= cycles;
|
||||||
|
Loading…
Reference in New Issue
Block a user