mirror of https://github.com/bsnes-emu/bsnes.git
v112.4
Reverted Kishin Douji Zenki fix, as it seems to have been incorrect. Disabled supersampling when EXTBG mode is active. Fixed MSU1 and SGB audio when using run-ahead and overclocking. macOS: fixed a serious issue with the IOKit joypad driver [kode54]
This commit is contained in:
parent
4f32551430
commit
f2978247c1
|
@ -29,7 +29,7 @@ using namespace nall;
|
||||||
|
|
||||||
namespace Emulator {
|
namespace Emulator {
|
||||||
static const string Name = "bsnes";
|
static const string Name = "bsnes";
|
||||||
static const string Version = "112.3";
|
static const string Version = "112.4";
|
||||||
static const string Author = "byuu";
|
static const string Author = "byuu";
|
||||||
static const string License = "GPLv3";
|
static const string License = "GPLv3";
|
||||||
static const string Website = "https://byuu.org";
|
static const string Website = "https://byuu.org";
|
||||||
|
|
|
@ -250,7 +250,7 @@ auto SPC700::instructionDirectDirectCompare(fpb op) -> void {
|
||||||
uint8 target = fetch();
|
uint8 target = fetch();
|
||||||
uint8 lhs = load(target);
|
uint8 lhs = load(target);
|
||||||
lhs = alu(lhs, rhs);
|
lhs = alu(lhs, rhs);
|
||||||
load(target);
|
idle();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto SPC700::instructionDirectDirectModify(fpb op) -> void {
|
auto SPC700::instructionDirectDirectModify(fpb op) -> void {
|
||||||
|
@ -274,7 +274,7 @@ auto SPC700::instructionDirectImmediateCompare(fpb op) -> void {
|
||||||
uint8 address = fetch();
|
uint8 address = fetch();
|
||||||
uint8 data = load(address);
|
uint8 data = load(address);
|
||||||
data = alu(data, immediate);
|
data = alu(data, immediate);
|
||||||
load(address);
|
idle();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto SPC700::instructionDirectImmediateModify(fpb op) -> void {
|
auto SPC700::instructionDirectImmediateModify(fpb op) -> void {
|
||||||
|
@ -469,7 +469,7 @@ auto SPC700::instructionIndirectXCompareIndirectY(fpb op) -> void {
|
||||||
uint8 rhs = load(Y);
|
uint8 rhs = load(Y);
|
||||||
uint8 lhs = load(X);
|
uint8 lhs = load(X);
|
||||||
lhs = alu(lhs, rhs);
|
lhs = alu(lhs, rhs);
|
||||||
load(X);
|
idle();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto SPC700::instructionIndirectXWriteIndirectY(fpb op) -> void {
|
auto SPC700::instructionIndirectXWriteIndirectY(fpb op) -> void {
|
||||||
|
|
|
@ -21,7 +21,7 @@ auto ICD::ppuWrite(uint2 color) -> void {
|
||||||
|
|
||||||
auto ICD::apuWrite(float left, float right) -> void {
|
auto ICD::apuWrite(float left, float right) -> void {
|
||||||
float samples[] = {left, right};
|
float samples[] = {left, right};
|
||||||
stream->write(samples);
|
if(!system.runAhead) stream->write(samples);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto ICD::joypWrite(bool p14, bool p15) -> void {
|
auto ICD::joypWrite(bool p14, bool p15) -> void {
|
||||||
|
|
|
@ -42,7 +42,7 @@ auto MSU1::main() -> void {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stream->sample(float(left), float(right));
|
if(!system.runAhead) stream->sample(float(left), float(right));
|
||||||
step(1);
|
step(1);
|
||||||
synchronizeCPU();
|
synchronizeCPU();
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ auto CPU::step() -> void {
|
||||||
static_assert(Clocks == 2 || Clocks == 4 || Clocks == 6 || Clocks == 8 || Clocks == 10 || Clocks == 12);
|
static_assert(Clocks == 2 || Clocks == 4 || Clocks == 6 || Clocks == 8 || Clocks == 10 || Clocks == 12);
|
||||||
|
|
||||||
for(auto coprocessor : coprocessors) {
|
for(auto coprocessor : coprocessors) {
|
||||||
|
if(coprocessor == &icd || coprocessor == &msu1) continue;
|
||||||
coprocessor->clock -= Clocks * (uint64)coprocessor->frequency;
|
coprocessor->clock -= Clocks * (uint64)coprocessor->frequency;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,6 +44,10 @@ auto CPU::step() -> void {
|
||||||
|
|
||||||
smp.clock -= Clocks * (uint64)smp.frequency;
|
smp.clock -= Clocks * (uint64)smp.frequency;
|
||||||
ppu.clock -= Clocks;
|
ppu.clock -= Clocks;
|
||||||
|
for(auto coprocessor : coprocessors) {
|
||||||
|
if(coprocessor != &icd && coprocessor != &msu1) continue;
|
||||||
|
coprocessor->clock -= Clocks * (uint64)coprocessor->frequency;
|
||||||
|
}
|
||||||
|
|
||||||
if(!status.dramRefresh && hcounter() >= status.dramRefreshPosition) {
|
if(!status.dramRefresh && hcounter() >= status.dramRefreshPosition) {
|
||||||
//note: pattern should technically be 5-3, 5-3, 5-3, 5-3, 5-3 per logic analyzer
|
//note: pattern should technically be 5-3, 5-3, 5-3, 5-3, 5-3 per logic analyzer
|
||||||
|
|
|
@ -106,8 +106,9 @@ auto PPU::scanline() -> void {
|
||||||
|
|
||||||
if(vcounter() > 0 && vcounter() < vdisp()) {
|
if(vcounter() > 0 && vcounter() < vdisp()) {
|
||||||
latch.hires |= io.pseudoHires || io.bgMode == 5 || io.bgMode == 6;
|
latch.hires |= io.pseudoHires || io.bgMode == 5 || io.bgMode == 6;
|
||||||
latch.hd |= io.bgMode == 7 && hdScale() > 1 && hdSupersample() == 0;
|
//supersampling and EXTBG mode are not compatible, so disable supersampling in EXTBG mode
|
||||||
latch.ss |= io.bgMode == 7 && hdScale() > 1 && hdSupersample() == 1;
|
latch.hd |= io.bgMode == 7 && hdScale() > 1 && (hdSupersample() == 0 || io.extbg == 1);
|
||||||
|
latch.ss |= io.bgMode == 7 && hdScale() > 1 && (hdSupersample() == 1 && io.extbg == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(vcounter() == vdisp()) {
|
if(vcounter() == vdisp()) {
|
||||||
|
|
|
@ -14,9 +14,9 @@ auto SMP::idle() -> void {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto SMP::read(uint16 address) -> uint8 {
|
auto SMP::read(uint16 address) -> uint8 {
|
||||||
|
wait(address);
|
||||||
uint8 data = readRAM(address);
|
uint8 data = readRAM(address);
|
||||||
if((address & 0xfff0) == 0x00f0) data = readIO(address);
|
if((address & 0xfff0) == 0x00f0) data = readIO(address);
|
||||||
wait(address);
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ struct InputJoypadIOKit {
|
||||||
for(uint n : range(CFArrayGetCount(elements))) {
|
for(uint n : range(CFArrayGetCount(elements))) {
|
||||||
IOHIDElementRef element = (IOHIDElementRef)CFArrayGetValueAtIndex(elements, n);
|
IOHIDElementRef element = (IOHIDElementRef)CFArrayGetValueAtIndex(elements, n);
|
||||||
IOHIDElementType type = IOHIDElementGetType(element);
|
IOHIDElementType type = IOHIDElementGetType(element);
|
||||||
|
uint32_t page = IOHIDElementGetUsagePage(element);
|
||||||
uint32_t usage = IOHIDElementGetUsage(element);
|
uint32_t usage = IOHIDElementGetUsage(element);
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case kIOHIDElementTypeInput_Button:
|
case kIOHIDElementTypeInput_Button:
|
||||||
|
@ -21,6 +22,7 @@ struct InputJoypadIOKit {
|
||||||
break;
|
break;
|
||||||
case kIOHIDElementTypeInput_Axis:
|
case kIOHIDElementTypeInput_Axis:
|
||||||
case kIOHIDElementTypeInput_Misc:
|
case kIOHIDElementTypeInput_Misc:
|
||||||
|
if(page != kHIDPage_GenericDesktop && page != kHIDPage_Simulation) break;
|
||||||
if(usage == kHIDUsage_Sim_Accelerator || usage == kHIDUsage_Sim_Brake
|
if(usage == kHIDUsage_Sim_Accelerator || usage == kHIDUsage_Sim_Brake
|
||||||
|| usage == kHIDUsage_Sim_Rudder || usage == kHIDUsage_Sim_Throttle
|
|| usage == kHIDUsage_Sim_Rudder || usage == kHIDUsage_Sim_Throttle
|
||||||
|| usage == kHIDUsage_GD_X || usage == kHIDUsage_GD_Y || usage == kHIDUsage_GD_Z
|
|| usage == kHIDUsage_GD_X || usage == kHIDUsage_GD_Y || usage == kHIDUsage_GD_Z
|
||||||
|
|
Loading…
Reference in New Issue