From 70429285baa4cb8e4f106f6c48c9212faf2df792 Mon Sep 17 00:00:00 2001 From: Tim Allen Date: Mon, 16 Aug 2010 19:42:20 +1000 Subject: [PATCH] Updated to v067r23 release. byuu says: Added missing $4200 IRQ lock, which fixes Chou Aniki on the fast CPU core, so slower PCs can get their brotherly love on. Added range-based controller IOBit latching to the fast CPU core, which enables Super Scope and Justifier support. Uses the priority queue as well, so there is zero speed-hit. Given the way range-testing works, the trigger point may vary by 1-2 pixels when firing at the same spot. Not really a big deal when it avoids a massive speed penalty. Fixed PAL and interlace-mode HVIRQs at V=0,H<2 on the fast CPU core. Added the dot-renderer's sprite list update-on-OAM-write functionality to the scanline-based PPU renderer. Unfortunately it looks like all the speed gain was already taken from the global dirty flag I was using before, but this certainly won't hurt speed any, so whatever. Added #ifdef to stop CoInitialize(0) on non-Windows ports. Added #ifdefs to stop gradient fade on Windows port. Not going to fuck over the Linux port aesthetic because of Qt bug #47,326,927. If there's a way to tell what Qt theme is being used, I can leave it enabled for XP/Vista themes. Moved HDMA trigger from 1104 to 1112, and reduced channel overhead from 24 to 16, to better simulate one-cycle DMA->CPU sync. Code clarity: I've re-added my varint.hpp classes, and am actively using them in the accuracy cores. So far, I haven't done anything that would detriment speed, but it is certainly cool. The APU ports exposed by the CPU and SMP now take uint2 address arguments, the CPU WRAM address register is a uint17, and the IRQ H/VTIME values are uint10. This basically allows the source to clearly convey the data sizes, and eliminates the need to manually mask values when writing to registers or reading from memory. I'm going to be doing this everywhere, and it will have a speed impact eventually, because the automation means we can't skip masks when we know the data is already masked off. Source: archive contains the launcher code, so that I can look into why it's crashing on XP tomorrow. It doesn't look like Circuit USA's flags are going to work too well with this new CPU core. Still not sure what the hell Robocop vs The Terminator is doing, I'll read through the mega SNES thread for clues tomorrow. Speedy Gonzales is definitely broken, as modifying the MDR was breaking things with my current core. Probably because the new CPU core doesn't wait for a cycle edge to trigger. I was thinking that perhaps we could keep some form of cheat codes list to work as game-specific hacks for the performance core. Keeps the hacks out of the emulator, but could allow the remaining bugs to be worked around for people who have no choice but to use the performance core. --- Makefile | 8 +-- cc.bat | 1 + clean.bat | 1 + launcher/bsnes.Manifest | 9 ++++ launcher/bsnes.ico | Bin 0 -> 22071 bytes launcher/cc.bat | 4 ++ launcher/cc.sh | 2 + launcher/launcher.cpp | 89 ++++++++++++++++++++++++++++++++ launcher/resource.rc | 2 + nall/varint.hpp | 6 +-- qt/application/application.cpp | 6 +-- qt/settings/profile.cpp | 8 ++- ruby/_test/cc.bat | 2 - ruby/_test/test.cpp | 40 -------------- ruby/_test/test.exe | Bin 249658 -> 0 bytes snes/cpu/cpu.cpp | 5 -- snes/cpu/cpu.hpp | 15 ++++-- snes/cpu/dma/dma.cpp | 2 - snes/cpu/memory/memory.cpp | 3 ++ snes/cpu/memory/memory.hpp | 2 - snes/cpu/mmio/mmio.cpp | 85 ++++++++++++------------------ snes/cpu/serialization.cpp | 7 +-- snes/cpu/timing/joypad.cpp | 8 +-- snes/fast/cpu/cpu.hpp | 1 + snes/fast/cpu/dma.cpp | 2 +- snes/fast/cpu/mmio.cpp | 1 + snes/fast/cpu/timing.cpp | 10 +++- snes/fast/ppu/memory/memory.cpp | 3 ++ snes/fast/ppu/render/oam.cpp | 44 ++++++++++------ snes/fast/ppu/render/render.hpp | 2 + snes/fast/ppu/serialization.cpp | 1 + snes/input/input.hpp | 1 + snes/smp/memory/memory.cpp | 22 ++++---- snes/smp/serialization.cpp | 4 +- snes/smp/smp.cpp | 26 +++++----- snes/smp/smp.hpp | 7 +-- snes/snes.hpp | 18 ++++--- sync.sh | 1 + 38 files changed, 265 insertions(+), 183 deletions(-) create mode 100755 cc.bat create mode 100755 clean.bat create mode 100755 launcher/bsnes.Manifest create mode 100755 launcher/bsnes.ico create mode 100755 launcher/cc.bat create mode 100755 launcher/cc.sh create mode 100755 launcher/launcher.cpp create mode 100755 launcher/resource.rc delete mode 100755 ruby/_test/cc.bat delete mode 100755 ruby/_test/test.cpp delete mode 100755 ruby/_test/test.exe diff --git a/Makefile b/Makefile index 771e98ff..98bd46bf 100755 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ include nall/Makefile snes := snes -profile := accuracy +profile := performance ui := qt # compiler @@ -53,8 +53,8 @@ objects := $(patsubst %,obj/%.o,$(objects)) # targets build: ui_build $(objects) ifeq ($(platform),osx) - test -d ../bsnes.app || mkdir -p ../bsnes.app/Contents/MacOS - $(strip $(cpp) -o ../bsnes.app/Contents/MacOS/bsnes $(objects) $(link)) + test -d ../bsnes-$(profile).app || mkdir -p ../bsnes-$(profile).app/Contents/MacOS + $(strip $(cpp) -o ../bsnes-$(profile).app/Contents/MacOS/bsnes-$(profile) $(objects) $(link)) else $(strip $(cpp) -o out/bsnes-$(profile) $(objects) $(link)) endif @@ -87,6 +87,6 @@ clean: ui_clean -@$(call delete,*.manifest) archive-all: - tar -cjf bsnes-`date +%Y%m%d`.tar.bz2 libco nall obj out qt ruby snes Makefile sync.sh + tar -cjf bsnes-`date +%Y%m%d`.tar.bz2 launcher libco nall obj out qt ruby snes Makefile sync.sh cc.bat clean.bat help:; diff --git a/cc.bat b/cc.bat new file mode 100755 index 00000000..8e0e8454 --- /dev/null +++ b/cc.bat @@ -0,0 +1 @@ +@mingw32-make -j 2 diff --git a/clean.bat b/clean.bat new file mode 100755 index 00000000..d4c3d600 --- /dev/null +++ b/clean.bat @@ -0,0 +1 @@ +@mingw32-make clean diff --git a/launcher/bsnes.Manifest b/launcher/bsnes.Manifest new file mode 100755 index 00000000..4602d4fe --- /dev/null +++ b/launcher/bsnes.Manifest @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/launcher/bsnes.ico b/launcher/bsnes.ico new file mode 100755 index 0000000000000000000000000000000000000000..54acded45d3d1e9b458bfab3c24feeb328e231d9 GIT binary patch literal 22071 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 z zZ~6IK-@pF*DEgQAuLS<%zo`9CF~d}El)r)o^$!Ap%KERAg+}uP{u95z|0IT1DvPKm z4GY{m0Uwo=Xn7!w0DrH4Do5Cna%3IA9uNq)0JsD=12_yY1S|&pIX~*SA=CrqCw~k5 zkS-9R(wI9Kw+sLCpkpwNwj8+W0(OJ$2+|s0 z1iBo^Isb|LXAL;tn#OrLe^hSuf+3aGUA#nQdtd;z3bYJUIyH7~*`s5I?Avu}jHdiMC4Z(aAWgy-&c8?jt}?)RlKV{lXjwi+310}< zoj4nK_x}v%>E(s=TYeGk$!vfh7H}8k`5lZsIlfs+U%llt%H{unYDhadSNc_D0DoHp zCQ$CE@4x1M^xNk;;89i@Z<_AUAJE6a_d36dH<}M{HU(}&-{L&udn200Q1jhd;M|9{ zqaSEXXj~sO{jYd{Hz(jUVAAg(zt?uYgtbOUu%q^YzdWE3_5I(#5X5o*S>C`64}P2j z5Co{fJ32j4E?mTCGZ=yw1sf0jF%4tRwC z1_5J$NzNd@`1A+$*)zESXEuN~;1D1fa0Flm_~ALp%)CGIM}ME+>>H=T&~p5R{%PF* znvs9-8}M2Lye9sF+uvzRG5;XV?`92U$o#=}GP8Y+Lwfn|8uvJ^&sq%l7ui$N+Lq{4T<$Z?T`>S9YKZ>3W8%q5E9%{;)7EVB5cQu zPwu|6(}pMOg^||tSyDbr;-qA9M+Fg?HxHE*L~e2oKaBYloAx;sdW?cTlM?a;yIAzJ z1|CI#0tbqEj*hl>#3$|OoV}Hu#pJf?x;;-zY z;gCNQApI-0r~D8Pwy*u5ed@f27%kFujybRf#eR(k*h9}P*8wWNV;kkr0JhlxpU(LH zyB=ox|0BfRgW4Rr%$)@GI{{%+Yhl>;NB1}j0OyQ zjkG<(1?RYL{(=MAHr#*2HrNybTm*b~f4(+E39q_tXg=hRw!@kAjlTB-?Ea2zu%!yP z1$YiX_h+Zt+czcn;LBJCcGd$z0cn6MfCGSef5$c&2kfEyPv5llm9WY4tG}E7U&Vv` z=>YX#vGXlX!GD$KkA{Qo&4BOL`DcDjAiwkvKWgWD@gZMVz*pP+XWOkHrM{QP|1}Kq zR{|6Ornke7@O~aJ|Nol*-%Ss;H~+%eVy^ZHUzrD=z;wQ z3ZnEGj3f@2r{XZalbbMfRLEi&L2yC{X%_U8piZI(!N4{QgfcKvVLJl_4FypUwn>yA z&l#rR6`hQu+Y&;6seKCNFEdy8_`m){M9?EGEqdTFKR_@tJZy(Ne*EPO{k!x}okHjE zPXSYFxT!VFFfu-_``xr?VA{Dkkaqf7bSgcKsgdR^t=OQqY+3TB^PPD3hnD3?D4+~b z2Pj4=*u9Xp^O6X4A{6qu4|oE&j!aOEMf_+&Fjk`Tgof3t-z|dpZva#C@agl?YcqKY zue*)Tf6?)FYW%+oY0m+s(oM-R{!*-6XFQipeK6;;t?MH=*RCC~hIB>K(oW79CT-k? zO}!_Rcb~nGM~D@YiU^&Foy7qCU^iem%hT2p(oLCi=i zY7_0c_!+iQAMBfokIM7r_}M*Yxhx>v4Zxqq#wa^qJj5pg(7Asx+>O{VJuRwV-owTY z>CpQQGsp3onQ_1M4r%w#ust#!!>#qL_+R_pcb*F!)6lyY0bP+?e|t^$wY>i6Z}1C& orimcq=pHZZvkre+J;NsJC(A?-;{XbLNB3QO0K-0?(xB=7AElyM(EtDd literal 0 HcmV?d00001 diff --git a/launcher/cc.bat b/launcher/cc.bat new file mode 100755 index 00000000..6889dcc5 --- /dev/null +++ b/launcher/cc.bat @@ -0,0 +1,4 @@ +@windres resource.rc resource.o +@mingw32-g++ -std=gnu++0x -mwindows -s -O3 -fomit-frame-pointer -I.. -o ../out/bsnes launcher.cpp resource.o +@del *.o +@pause diff --git a/launcher/cc.sh b/launcher/cc.sh new file mode 100755 index 00000000..964034d7 --- /dev/null +++ b/launcher/cc.sh @@ -0,0 +1,2 @@ +clear +g++ -std=gnu++0x -s -O3 -fomit-frame-pointer -I.. -o ../out/bsnes launcher.cpp diff --git a/launcher/launcher.cpp b/launcher/launcher.cpp new file mode 100755 index 00000000..3a2acfd7 --- /dev/null +++ b/launcher/launcher.cpp @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include +#include +#include +using namespace nall; + +#if defined(PLATFORM_X) || defined(PLATFORM_OSX) + char* userpath(char *path) { + *path = 0; + struct passwd *userinfo = getpwuid(getuid()); + if(userinfo) strcpy(path, userinfo->pw_dir); + return path; + } + + char *getcwd(char *path) { + return getcwd(path, PATH_MAX); + } +#elif defined(PLATFORM_WIN) + #include + #include + #include + #include + + char* realpath(const char *filename, char *resolvedname) { + wchar_t fn[_MAX_PATH] = L""; + _wfullpath(fn, nall::utf16_t(filename), _MAX_PATH); + strcpy(resolvedname, nall::utf8_t(fn)); + return resolvedname; + } + + char* userpath(char *path) { + wchar_t fp[_MAX_PATH] = L""; + SHGetFolderPathW(0, CSIDL_APPDATA | CSIDL_FLAG_CREATE, 0, 0, fp); + strcpy(path, nall::utf8_t(fp)); + return path; + } + + char* getcwd(char *path) { + wchar_t fp[_MAX_PATH] = L""; + _wgetcwd(fp, _MAX_PATH); + strcpy(path, nall::utf8_t(fp)); + return path; + } + + intptr_t execv(const char *cmdname, const char *const *argv) { + int argc = __argc; + wchar_t **wargv = CommandLineToArgvW(GetCommandLineW(), &argc); + return _wexecv(nall::utf16_t(cmdname), wargv); + } +#endif + +int main(int argc, char **argv) { + char path[PATH_MAX], *unused; + unused = realpath(argv[0], path); + string realPath = dir(path); + string basePath = string(dir(path), "bsnes.cfg"); + unused = userpath(path); + if(!strend(path, "/") && !strend(path, "\\")) strcat(path, "/"); + string userPath = string(path, ".bsnes/bsnes.cfg"); + + configuration config; + string profile; + config.attach(profile = "", "system.profile"); + if(config.load(userPath) == false) config.load(basePath); + if(profile == "") profile = "compatibility"; + + string binaryName = string("bsnes-", profile); + #if defined(PLATFORM_WIN) + binaryName << ".dll"; + #endif + + string fileName = string("/usr/local/bin/", binaryName); + if(!file::exists(fileName)) fileName = string("/usr/bin/", binaryName); + if(!file::exists(fileName)) fileName = string(realPath, binaryName); + if(!file::exists(fileName)) { + #if defined(PLATFORM_WIN) + MessageBox(0, string("Error: unable to locate binary file :", binaryName), "bsnes", MB_OK); + #else + print("[bsnes] Error: unable to locate binary file: ", binaryName, "\n"); + #endif + return 0; + } + + execv(fileName, argv); + return 0; +} diff --git a/launcher/resource.rc b/launcher/resource.rc new file mode 100755 index 00000000..a88dde87 --- /dev/null +++ b/launcher/resource.rc @@ -0,0 +1,2 @@ +1 24 "bsnes.Manifest" +IDI_ICON1 ICON DISCARDABLE "bsnes.ico" diff --git a/nall/varint.hpp b/nall/varint.hpp index cc3bb17c..fe4732b1 100755 --- a/nall/varint.hpp +++ b/nall/varint.hpp @@ -1,9 +1,9 @@ #ifndef NALL_VARINT_HPP #define NALL_VARINT_HPP +#include #include #include -#include namespace nall { template class uint_t { @@ -22,7 +22,7 @@ namespace nall { >::type >::type >::type T; - static_assert::value> uint_assert; + static_assert(!std::is_same::value, ""); T data; public: @@ -63,7 +63,7 @@ namespace nall { >::type >::type >::type T; - static_assert::value> int_assert; + static_assert(!std::is_same::value, ""); T data; public: diff --git a/qt/application/application.cpp b/qt/application/application.cpp index 7228bc46..1f9449d2 100755 --- a/qt/application/application.cpp +++ b/qt/application/application.cpp @@ -61,12 +61,12 @@ void Application::locateFile(string &filename, bool createDataDirectory) { } int Application::main(int &argc, char **argv) { - CoInitialize(0); - app = new App(argc, argv); #if !defined(PLATFORM_WIN) - //Windows port uses 256x256 icon from resource file app->setWindowIcon(QIcon(":/bsnes.png")); + #else + //Windows port uses 256x256 icon from resource file + CoInitialize(0); #endif initargs(argc, argv); //ensure argv[]s are in UTF-8 format diff --git a/qt/settings/profile.cpp b/qt/settings/profile.cpp index 23b53733..6df07922 100755 --- a/qt/settings/profile.cpp +++ b/qt/settings/profile.cpp @@ -20,7 +20,9 @@ ProfileSettingsWindow::ProfileSettingsWindow() { profileAccuracy->setStyleSheet( "font-weight: bold;" "font-size: 12pt;" + #if !defined(PLATFORM_WIN) "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 rgba(255, 0, 0, 48), stop: 1 rgba(255, 0, 0, 0));" + #endif ); layout->addWidget(profileAccuracy); @@ -37,7 +39,9 @@ ProfileSettingsWindow::ProfileSettingsWindow() { profileCompatibility->setStyleSheet( "font-weight: bold;" "font-size: 12pt;" + #if !defined(PLATFORM_WIN) "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 rgba(0, 0, 255, 48), stop: 1 rgba(0, 0, 255, 0));" + #endif ); layout->addWidget(profileCompatibility); @@ -54,12 +58,14 @@ ProfileSettingsWindow::ProfileSettingsWindow() { profilePerformance->setStyleSheet( "font-weight: bold;" "font-size: 12pt;" + #if !defined(PLATFORM_WIN) "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 rgba(0, 255, 0, 48), stop: 1 rgba(0, 255, 0, 0));" + #endif ); layout->addWidget(profilePerformance); profilePerformanceInfo = new QLabel( - "System Requirements: Intel Atom, Intel Pentium IV or AMD Athlon processor.
" + "System Requirements: Intel Pentium IV or AMD Athlon processor.
" "High accuracy with reasonable compromises for performance.
" "Sacrifices a small degree of compatibility to run full-speed on older hardware.
" "Use this mode for slower systems, or if you are running on battery power." diff --git a/ruby/_test/cc.bat b/ruby/_test/cc.bat deleted file mode 100755 index 00b9e552..00000000 --- a/ruby/_test/cc.bat +++ /dev/null @@ -1,2 +0,0 @@ -@g++ -std=gnu++0x -O3 -fomit-frame-pointer -I../.. -o test test.cpp -DAUDIO_DIRECTSOUND -DAUDIO_XAUDIO2 -DINPUT_DIRECTINPUT -lole32 -luuid -ldxguid -ldsound -ldinput8 -@pause diff --git a/ruby/_test/test.cpp b/ruby/_test/test.cpp deleted file mode 100755 index 64778930..00000000 --- a/ruby/_test/test.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include -using namespace nall; - -#include -using namespace ruby; - -#include - -int main() { - CoInitialize(0); - - audio.driver("XAudio2"); - audio.set(Audio::Handle, (uintptr_t)GetDesktopWindow()); - audio.set(Audio::Synchronize, true); - audio.set(Audio::Frequency, 44100U); - if(audio.init() == false) { - printf("Failed to initialize audio driver.\n"); - getch(); - return 0; - } - - input.driver("DirectInput"); - input.set(Input::Handle, (uintptr_t)GetDesktopWindow()); - if(input.init() == false) { - printf("Failed to initialize input driver.\n"); - getch(); - return 0; - } - - while(true) { - int16_t table[Scancode::Limit]; - input.poll(table); - for(unsigned i = 0; i < Scancode::Limit; i++) { - //if(table[i]) printf("%.4x\n", i); - } - } - - return 0; -} diff --git a/ruby/_test/test.exe b/ruby/_test/test.exe deleted file mode 100755 index 8032f45adc9d99fc84352701818ca2783191bcd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249658 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

KkxUadXJ=*zpa*4swE4xib}16_W&}v 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

={4R>?sxK^=OYcp1DAz($Li&$Cl|IgiQYg)9~A6 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 diff --git a/snes/cpu/cpu.cpp b/snes/cpu/cpu.cpp index cacfd652..4c194b27 100755 --- a/snes/cpu/cpu.cpp +++ b/snes/cpu/cpu.cpp @@ -132,11 +132,6 @@ void CPU::reset() { mmio_reset(); dma_reset(); timing_reset(); - - apu_port[0] = 0x00; - apu_port[1] = 0x00; - apu_port[2] = 0x00; - apu_port[3] = 0x00; } CPU::CPU() { diff --git a/snes/cpu/cpu.hpp b/snes/cpu/cpu.hpp index 2d55c10c..dd7412a7 100755 --- a/snes/cpu/cpu.hpp +++ b/snes/cpu/cpu.hpp @@ -7,11 +7,12 @@ public: void synchronize_ppu(); void synchronize_coprocessor(); + uint8 port_read(uint2 port) const; + void port_write(uint2 port, uint8 data); + uint8 pio(); bool joylatch(); alwaysinline bool interrupt_pending() { return status.interrupt_pending; } - alwaysinline uint8 port_read(uint8 port) { return apu_port[port & 3]; } - alwaysinline void port_write(uint8 port, uint8 data) { apu_port[port & 3] = data; } void enter(); void power(); @@ -71,8 +72,11 @@ private: bool hdma_mode; //0 = init, 1 = run //MMIO + //$2140-217f + uint8 port[4]; + //$2181-$2183 - uint32 wram_addr; + uint17 wram_addr; //$4016-$4017 bool joypad_strobe_latch; @@ -93,10 +97,11 @@ private: //$4204-$4206 uint16 wrdiva; - uint8 wrdivb; + uint8 wrdivb; //$4207-$420a - uint16 hirq_pos, virq_pos; + uint10 hirq_pos; + uint10 virq_pos; //$420d unsigned rom_speed; diff --git a/snes/cpu/dma/dma.cpp b/snes/cpu/dma/dma.cpp index 1e141ba8..e8cdb3ec 100755 --- a/snes/cpu/dma/dma.cpp +++ b/snes/cpu/dma/dma.cpp @@ -3,8 +3,6 @@ void CPU::dma_add_clocks(unsigned clocks) { status.dma_clocks += clocks; add_clocks(clocks); - synchronize_ppu(); - synchronize_coprocessor(); } //============= diff --git a/snes/cpu/memory/memory.cpp b/snes/cpu/memory/memory.cpp index bf48dee5..c2c8f1fa 100755 --- a/snes/cpu/memory/memory.cpp +++ b/snes/cpu/memory/memory.cpp @@ -1,5 +1,8 @@ #ifdef CPU_CPP +uint8 CPU::port_read(uint2 port) const { return status.port[port]; } +void CPU::port_write(uint2 port, uint8 data) { status.port[port] = data; } + void CPU::op_io() { status.clock_count = 6; dma_edge(); diff --git a/snes/cpu/memory/memory.hpp b/snes/cpu/memory/memory.hpp index 2ee2b360..d33861d4 100755 --- a/snes/cpu/memory/memory.hpp +++ b/snes/cpu/memory/memory.hpp @@ -1,5 +1,3 @@ -uint8 apu_port[4]; - void op_io(); debugvirtual uint8 op_read(uint32 addr); debugvirtual void op_write(uint32 addr, uint8 data); diff --git a/snes/cpu/mmio/mmio.cpp b/snes/cpu/mmio/mmio.cpp index 9448c288..2ae915cb 100755 --- a/snes/cpu/mmio/mmio.cpp +++ b/snes/cpu/mmio/mmio.cpp @@ -5,33 +5,27 @@ bool CPU::joylatch() { return status.joypad_strobe_latch; } //WMDATA uint8 CPU::mmio_r2180() { - uint8 r = bus.read(0x7e0000 | status.wram_addr); - status.wram_addr = (status.wram_addr + 1) & 0x01ffff; - return r; + return bus.read(0x7e0000 | status.wram_addr++); } //WMDATA void CPU::mmio_w2180(uint8 data) { - bus.write(0x7e0000 | status.wram_addr, data); - status.wram_addr = (status.wram_addr + 1) & 0x01ffff; + bus.write(0x7e0000 | status.wram_addr++, data); } //WMADDL void CPU::mmio_w2181(uint8 data) { - status.wram_addr = (status.wram_addr & 0xffff00) | (data); - status.wram_addr &= 0x01ffff; + status.wram_addr = (status.wram_addr & 0x01ff00) | (data << 0); } //WMADDM void CPU::mmio_w2182(uint8 data) { - status.wram_addr = (status.wram_addr & 0xff00ff) | (data << 8); - status.wram_addr &= 0x01ffff; + status.wram_addr = (status.wram_addr & 0x0100ff) | (data << 8); } //WMADDH void CPU::mmio_w2183(uint8 data) { - status.wram_addr = (status.wram_addr & 0x00ffff) | (data << 16); - status.wram_addr &= 0x01ffff; + status.wram_addr = (status.wram_addr & 0x00ffff) | (data << 16); } //JOYSER0 @@ -42,10 +36,7 @@ void CPU::mmio_w4016(uint8 data) { bool old_latch = status.joypad_strobe_latch; bool new_latch = data & 1; status.joypad_strobe_latch = new_latch; - - if(old_latch != new_latch) { - input.poll(); - } + if(old_latch != new_latch) input.poll(); } //JOYSER0 @@ -69,15 +60,13 @@ uint8 CPU::mmio_r4017() { //NMITIMEN void CPU::mmio_w4200(uint8 data) { - status.auto_joypad_poll = !!(data & 0x01); + status.auto_joypad_poll = data & 1; nmitimen_update(data); } //WRIO void CPU::mmio_w4201(uint8 data) { - if((status.pio & 0x80) && !(data & 0x80)) { - ppu.latch_counters(); - } + if((status.pio & 0x80) && !(data & 0x80)) ppu.latch_counters(); status.pio = data; } @@ -100,7 +89,7 @@ void CPU::mmio_w4203(uint8 data) { //WRDIVL void CPU::mmio_w4204(uint8 data) { - status.wrdiva = (status.wrdiva & 0xff00) | (data); + status.wrdiva = (status.wrdiva & 0xff00) | (data << 0); } //WRDIVH @@ -121,26 +110,22 @@ void CPU::mmio_w4206(uint8 data) { //HTIMEL void CPU::mmio_w4207(uint8 data) { - status.hirq_pos = (status.hirq_pos & ~0xff) | (data); - status.hirq_pos &= 0x01ff; + status.hirq_pos = (status.hirq_pos & 0x0100) | (data << 0); } //HTIMEH void CPU::mmio_w4208(uint8 data) { - status.hirq_pos = (status.hirq_pos & 0xff) | (data << 8); - status.hirq_pos &= 0x01ff; + status.hirq_pos = (status.hirq_pos & 0x00ff) | (data << 8); } //VTIMEL void CPU::mmio_w4209(uint8 data) { - status.virq_pos = (status.virq_pos & ~0xff) | (data); - status.virq_pos &= 0x01ff; + status.virq_pos = (status.virq_pos & 0x0100) | (data << 0); } //VTIMEH void CPU::mmio_w420a(uint8 data) { - status.virq_pos = (status.virq_pos & 0xff) | (data << 8); - status.virq_pos &= 0x01ff; + status.virq_pos = (status.virq_pos & 0x00ff) | (data << 8); } //DMAEN @@ -191,16 +176,9 @@ uint8 CPU::mmio_r4211() { uint8 CPU::mmio_r4212() { uint8 r = (regs.mdr & 0x3e); uint16 vs = ppu.overscan() == false ? 225 : 240; - - //auto joypad polling - if(vcounter() >= vs && vcounter() <= (vs + 2))r |= 0x01; - - //hblank - if(hcounter() <= 2 || hcounter() >= 1096)r |= 0x40; - - //vblank - if(vcounter() >= vs)r |= 0x80; - + if(vcounter() >= vs && vcounter() <= (vs + 2)) r |= 0x01; //auto joypad polling + if(hcounter() <= 2 || hcounter() >= 1096) r |= 0x40; //hblank + if(vcounter() >= vs) r |= 0x80; //vblank return r; } @@ -211,7 +189,7 @@ uint8 CPU::mmio_r4213() { //RDDIVL uint8 CPU::mmio_r4214() { - return status.rddiv; + return status.rddiv >> 0; } //RDDIVH @@ -221,7 +199,7 @@ uint8 CPU::mmio_r4215() { //RDMPYL uint8 CPU::mmio_r4216() { - return status.rdmpy; + return status.rdmpy >> 0; } //RDMPYH @@ -256,7 +234,7 @@ uint8 CPU::mmio_r43x1(uint8 i) { //A1TxL uint8 CPU::mmio_r43x2(uint8 i) { - return channel[i].source_addr; + return channel[i].source_addr >> 0; } //A1TxH @@ -272,7 +250,7 @@ uint8 CPU::mmio_r43x4(uint8 i) { //DASxL //union { uint16 transfer_size; uint16 indirect_addr; }; uint8 CPU::mmio_r43x5(uint8 i) { - return channel[i].transfer_size; + return channel[i].transfer_size >> 0; } //DASxH @@ -288,7 +266,7 @@ uint8 CPU::mmio_r43x7(uint8 i) { //A2AxL uint8 CPU::mmio_r43x8(uint8 i) { - return channel[i].hdma_addr; + return channel[i].hdma_addr >> 0; } //A2AxH @@ -323,7 +301,7 @@ void CPU::mmio_w43x1(uint8 i, uint8 data) { //A1TxL void CPU::mmio_w43x2(uint8 i, uint8 data) { - channel[i].source_addr = (channel[i].source_addr & 0xff00) | (data); + channel[i].source_addr = (channel[i].source_addr & 0xff00) | (data << 0); } //A1TxH @@ -339,7 +317,7 @@ void CPU::mmio_w43x4(uint8 i, uint8 data) { //DASxL //union { uint16 transfer_size; uint16 indirect_addr; }; void CPU::mmio_w43x5(uint8 i, uint8 data) { - channel[i].transfer_size = (channel[i].transfer_size & 0xff00) | (data); + channel[i].transfer_size = (channel[i].transfer_size & 0xff00) | (data << 0); } //DASxH @@ -355,7 +333,7 @@ void CPU::mmio_w43x7(uint8 i, uint8 data) { //A2AxL void CPU::mmio_w43x8(uint8 i, uint8 data) { - channel[i].hdma_addr = (channel[i].hdma_addr & 0xff00) | (data); + channel[i].hdma_addr = (channel[i].hdma_addr & 0xff00) | (data << 0); } //A2AxH @@ -377,6 +355,9 @@ void CPU::mmio_power() { } void CPU::mmio_reset() { + //$2140-217f + foreach(port, status.port) port = 0x00; + //$2181-$2183 status.wram_addr = 0x000000; @@ -386,9 +367,9 @@ void CPU::mmio_reset() { status.joypad2_bits = ~0; //$4200 - status.nmi_enabled = false; - status.hirq_enabled = false; - status.virq_enabled = false; + status.nmi_enabled = false; + status.hirq_enabled = false; + status.virq_enabled = false; status.auto_joypad_poll = false; //$4201 @@ -426,7 +407,7 @@ void CPU::mmio_reset() { //ALU alu.mpyctr = 0; alu.divctr = 0; - alu.shift = 0; + alu.shift = 0; } uint8 CPU::mmio_read(unsigned addr) { @@ -435,7 +416,7 @@ uint8 CPU::mmio_read(unsigned addr) { //APU if((addr & 0xffc0) == 0x2140) { //$2140-$217f synchronize_smp(); - return smp.port_read(addr & 3); + return smp.port_read(addr); } //DMA @@ -492,7 +473,7 @@ void CPU::mmio_write(unsigned addr, uint8 data) { //APU if((addr & 0xffc0) == 0x2140) { //$2140-$217f synchronize_smp(); - port_write(addr & 3, data); + port_write(addr, data); return; } diff --git a/snes/cpu/serialization.cpp b/snes/cpu/serialization.cpp index ac3ceb6d..64f9fe81 100755 --- a/snes/cpu/serialization.cpp +++ b/snes/cpu/serialization.cpp @@ -44,6 +44,8 @@ void CPU::serialize(serializer &s) { s.integer(status.hdma_pending); s.integer(status.hdma_mode); + s.array(status.port); + s.integer(status.wram_addr); s.integer(status.joypad_strobe_latch); @@ -108,11 +110,6 @@ void CPU::serialize(serializer &s) { s.integer(pipe.valid); s.integer(pipe.addr); s.integer(pipe.data); - - s.integer(apu_port[0]); - s.integer(apu_port[1]); - s.integer(apu_port[2]); - s.integer(apu_port[3]); } #endif diff --git a/snes/cpu/timing/joypad.cpp b/snes/cpu/timing/joypad.cpp index d00cdccb..26c45f6a 100755 --- a/snes/cpu/timing/joypad.cpp +++ b/snes/cpu/timing/joypad.cpp @@ -12,16 +12,16 @@ void CPU::run_auto_joypad_poll() { joy4 |= (port1 & 2) ? (0x8000 >> i) : 0; } - status.joy1l = joy1; + status.joy1l = joy1 >> 0; status.joy1h = joy1 >> 8; - status.joy2l = joy2; + status.joy2l = joy2 >> 0; status.joy2h = joy2 >> 8; - status.joy3l = joy3; + status.joy3l = joy3 >> 0; status.joy3h = joy3 >> 8; - status.joy4l = joy4; + status.joy4l = joy4 >> 0; status.joy4h = joy4 >> 8; } diff --git a/snes/fast/cpu/cpu.hpp b/snes/fast/cpu/cpu.hpp index 940564f8..45cf9cac 100755 --- a/snes/fast/cpu/cpu.hpp +++ b/snes/fast/cpu/cpu.hpp @@ -37,6 +37,7 @@ private: enum : unsigned { DramRefresh, HdmaRun, + ControllerLatch, }; }; nall::priority_queue queue; diff --git a/snes/fast/cpu/dma.cpp b/snes/fast/cpu/dma.cpp index d9d89e05..3e595971 100755 --- a/snes/fast/cpu/dma.cpp +++ b/snes/fast/cpu/dma.cpp @@ -122,7 +122,7 @@ void CPU::hdma_run() { } if(channels == 0) return; - add_clocks(24); + add_clocks(16); for(unsigned i = 0; i < 8; i++) { if(channel[i].hdma_enabled == false || channel[i].hdma_completed == true) continue; channel[i].dma_enabled = false; diff --git a/snes/fast/cpu/mmio.cpp b/snes/fast/cpu/mmio.cpp index 14a3c785..cc7ce5fa 100755 --- a/snes/fast/cpu/mmio.cpp +++ b/snes/fast/cpu/mmio.cpp @@ -158,6 +158,7 @@ void CPU::mmio_write(unsigned addr, uint8 data) { status.irq_transition = false; } + status.irq_lock = true; return; } diff --git a/snes/fast/cpu/timing.cpp b/snes/fast/cpu/timing.cpp index 7c333db7..04ac1aa5 100755 --- a/snes/fast/cpu/timing.cpp +++ b/snes/fast/cpu/timing.cpp @@ -4,6 +4,7 @@ void CPU::queue_event(unsigned id) { switch(id) { case QueueEvent::DramRefresh: return add_clocks(40); case QueueEvent::HdmaRun: return hdma_run(); + case QueueEvent::ControllerLatch: return ppu.latch_counters(); } } @@ -31,7 +32,8 @@ void CPU::add_clocks(unsigned clocks) { if(status.virq_enabled) { unsigned cpu_time = vcounter() * 1364 + hcounter(); unsigned irq_time = status.vtime * 1364 + status.htime * 4; - if(cpu_time > irq_time) irq_time += 262 * 1364; + unsigned framelines = (system.region() == System::Region::NTSC ? 262 : 312) + field(); + if(cpu_time > irq_time) irq_time += framelines * 1364; bool irq_valid = status.irq_valid; status.irq_valid = cpu_time <= irq_time && cpu_time + clocks > irq_time; if(!irq_valid && status.irq_valid) status.irq_line = true; @@ -66,7 +68,11 @@ void CPU::scanline() { queue.enqueue(534, QueueEvent::DramRefresh); if(vcounter() <= (ppu.overscan() == false ? 224 : 239)) { - queue.enqueue(1104, QueueEvent::HdmaRun); + queue.enqueue(1104 + 8, QueueEvent::HdmaRun); + } + + if(vcounter() == input.latchy) { + queue.enqueue(input.latchx, QueueEvent::ControllerLatch); } bool nmi_valid = status.nmi_valid; diff --git a/snes/fast/ppu/memory/memory.cpp b/snes/fast/ppu/memory/memory.cpp index 24683db6..7c8908fa 100755 --- a/snes/fast/ppu/memory/memory.cpp +++ b/snes/fast/ppu/memory/memory.cpp @@ -105,11 +105,14 @@ void PPU::oam_mmio_write(uint16 addr, uint8 data) { if(regs.display_disabled == true) { memory::oam[addr] = data; + update_sprite_list(addr, data); } else { if(cpu.vcounter() < (!overscan() ? 225 : 240)) { memory::oam[regs.ioamaddr] = data; + update_sprite_list(regs.ioamaddr, data); } else { memory::oam[addr] = data; + update_sprite_list(addr, data); } } } diff --git a/snes/fast/ppu/render/oam.cpp b/snes/fast/ppu/render/oam.cpp index d2e91790..52d6e1fe 100755 --- a/snes/fast/ppu/render/oam.cpp +++ b/snes/fast/ppu/render/oam.cpp @@ -1,15 +1,37 @@ #ifdef PPU_CPP +void PPU::update_sprite_list(unsigned addr, uint8 data) { + if(addr < 0x0200) { + unsigned i = addr >> 2; + switch(addr & 3) { + case 0: sprite_list[i].x = (sprite_list[i].x & 0x0100) | data; break; + case 1: sprite_list[i].y = (data + 1) & 0xff; break; + case 2: sprite_list[i].character = data; break; + case 3: sprite_list[i].vflip = data & 0x80; + sprite_list[i].hflip = data & 0x40; + sprite_list[i].priority = (data >> 4) & 3; + sprite_list[i].palette = (data >> 1) & 7; + sprite_list[i].use_nameselect = data & 0x01; + } + } else { + unsigned i = (addr & 0x1f) << 2; + sprite_list[i + 0].x = ((data & 0x01) << 8) | (sprite_list[i + 0].x & 0xff); + sprite_list[i + 0].size = data & 0x02; + sprite_list[i + 1].x = ((data & 0x04) << 6) | (sprite_list[i + 1].x & 0xff); + sprite_list[i + 1].size = data & 0x08; + sprite_list[i + 2].x = ((data & 0x10) << 4) | (sprite_list[i + 2].x & 0xff); + sprite_list[i + 2].size = data & 0x20; + sprite_list[i + 3].x = ((data & 0x40) << 2) | (sprite_list[i + 3].x & 0xff); + sprite_list[i + 3].size = data & 0x80; + } +} + void PPU::build_sprite_list() { if(sprite_list_valid == true) return; sprite_list_valid = true; - const uint8 *tableA = memory::oam.data(); - const uint8 *tableB = memory::oam.data() + 512; - for(unsigned i = 0; i < 128; i++) { - const bool x = *tableB & (1 << ((i & 3) << 1)); //0x01, 0x04, 0x10, 0x40 - const bool size = *tableB & (2 << ((i & 3) << 1)); //0x02, 0x08, 0x20, 0x80 + const bool size = sprite_list[i].size; switch(cache.oam_basesize) { case 0: sprite_list[i].width = (!size) ? 8 : 16; @@ -40,18 +62,6 @@ void PPU::build_sprite_list() { if(regs.oam_interlace && !size) sprite_list[i].height = 16; break; } - - sprite_list[i].x = (x << 8) + tableA[0]; - sprite_list[i].y = (tableA[1] + 1) & 0xff; - sprite_list[i].character = tableA[2]; - sprite_list[i].vflip = tableA[3] & 0x80; - sprite_list[i].hflip = tableA[3] & 0x40; - sprite_list[i].priority = (tableA[3] >> 4) & 3; - sprite_list[i].palette = (tableA[3] >> 1) & 7; - sprite_list[i].use_nameselect = tableA[3] & 1; - - tableA += 4; - if((i & 3) == 3) tableB++; } } diff --git a/snes/fast/ppu/render/render.hpp b/snes/fast/ppu/render/render.hpp index 6de43e41..e3dfc37d 100755 --- a/snes/fast/ppu/render/render.hpp +++ b/snes/fast/ppu/render/render.hpp @@ -62,6 +62,7 @@ struct sprite_item { bool vflip, hflip; uint8 palette; uint8 priority; + bool size; } sprite_list[128]; bool sprite_list_valid; unsigned active_sprite; @@ -75,6 +76,7 @@ struct oam_tileitem { enum { OAM_PRI_NONE = 4 }; uint8 oam_line_pal[256], oam_line_pri[256]; +void update_sprite_list(unsigned addr, uint8 data); void build_sprite_list(); bool is_sprite_on_scanline(); void load_oam_tiles(); diff --git a/snes/fast/ppu/serialization.cpp b/snes/fast/ppu/serialization.cpp index 289932de..2dbf3c2c 100755 --- a/snes/fast/ppu/serialization.cpp +++ b/snes/fast/ppu/serialization.cpp @@ -180,6 +180,7 @@ void PPU::serialize(serializer &s) { s.integer(sprite_list[n].hflip); s.integer(sprite_list[n].palette); s.integer(sprite_list[n].priority); + s.integer(sprite_list[n].size); } s.integer(sprite_list_valid); s.integer(active_sprite); diff --git a/snes/input/input.hpp b/snes/input/input.hpp index e24ac2ed..42b22249 100755 --- a/snes/input/input.hpp +++ b/snes/input/input.hpp @@ -82,6 +82,7 @@ private: friend class System; friend class Video; + friend class CPU; }; extern Input input; diff --git a/snes/smp/memory/memory.cpp b/snes/smp/memory/memory.cpp index 2f5081ce..e872a4ec 100755 --- a/snes/smp/memory/memory.cpp +++ b/snes/smp/memory/memory.cpp @@ -11,12 +11,12 @@ alwaysinline void SMP::ram_write(uint16 addr, uint8 data) { if(status.ram_writable && !status.ram_disabled) memory::apuram[addr] = data; } -uint8 SMP::port_read(uint8 port) { - return memory::apuram[0xf4 + (port & 3)]; +uint8 SMP::port_read(uint2 port) const { + return memory::apuram[0xf4 + port]; } -void SMP::port_write(uint8 port, uint8 data) { - memory::apuram[0xf4 + (port & 3)] = data; +void SMP::port_write(uint2 port, uint8 data) { + memory::apuram[0xf4 + port] = data; } alwaysinline uint8 SMP::op_busread(uint16 addr) { @@ -45,15 +45,15 @@ alwaysinline uint8 SMP::op_busread(uint16 addr) { case 0xf6: //CPUIO2 case 0xf7: { //CPUIO3 synchronize_cpu(); - r = cpu.port_read(addr & 3); + r = cpu.port_read(addr); } break; case 0xf8: { //RAM0 - r = status.smp_f8; + r = status.ram0; } break; case 0xf9: { //RAM1 - r = status.smp_f9; + r = status.ram1; } break; case 0xfa: //T0TARGET @@ -146,7 +146,7 @@ alwaysinline void SMP::op_buswrite(uint16 addr, uint8 data) { } break; case 0xf3: { //DSPDATA - //0x80-0xff is a read-only mirror of 0x00-0x7f + //0x80-0xff are read-only mirrors of 0x00-0x7f if(!(status.dsp_addr & 0x80)) { dsp.write(status.dsp_addr & 0x7f, data); } @@ -157,15 +157,15 @@ alwaysinline void SMP::op_buswrite(uint16 addr, uint8 data) { case 0xf6: //CPUIO2 case 0xf7: { //CPUIO3 synchronize_cpu(); - port_write(addr & 3, data); + port_write(addr, data); } break; case 0xf8: { //RAM0 - status.smp_f8 = data; + status.ram0 = data; } break; case 0xf9: { //RAM1 - status.smp_f9 = data; + status.ram1 = data; } break; case 0xfa: { //T0TARGET diff --git a/snes/smp/serialization.cpp b/snes/smp/serialization.cpp index 334d15ba..2c7f5147 100755 --- a/snes/smp/serialization.cpp +++ b/snes/smp/serialization.cpp @@ -19,8 +19,8 @@ void SMP::serialize(serializer &s) { s.integer(status.dsp_addr); - s.integer(status.smp_f8); - s.integer(status.smp_f9); + s.integer(status.ram0); + s.integer(status.ram1); s.integer(t0.stage0_ticks); s.integer(t0.stage1_ticks); diff --git a/snes/smp/smp.cpp b/snes/smp/smp.cpp index 6b7da28c..454d6bf5 100755 --- a/snes/smp/smp.cpp +++ b/snes/smp/smp.cpp @@ -65,26 +65,26 @@ void SMP::reset() { create(Enter, system.apu_frequency()); regs.pc = 0xffc0; - regs.a = 0x00; - regs.x = 0x00; - regs.y = 0x00; + regs.a = 0x00; + regs.x = 0x00; + regs.y = 0x00; regs.sp = 0xef; - regs.p = 0x02; + regs.p = 0x02; for(unsigned i = 0; i < memory::apuram.size(); i++) { memory::apuram.write(i, 0x00); } status.clock_counter = 0; - status.dsp_counter = 0; - status.timer_step = 3; + status.dsp_counter = 0; + status.timer_step = 3; //$00f0 - status.clock_speed = 0; - status.timer_speed = 0; - status.timers_enabled = true; - status.ram_disabled = false; - status.ram_writable = true; + status.clock_speed = 0; + status.timer_speed = 0; + status.timers_enabled = true; + status.ram_disabled = false; + status.ram_writable = true; status.timers_disabled = false; //$00f1 @@ -94,8 +94,8 @@ void SMP::reset() { status.dsp_addr = 0x00; //$00f8,$00f9 - status.smp_f8 = 0x00; - status.smp_f9 = 0x00; + status.ram0 = 0x00; + status.ram1 = 0x00; t0.stage0_ticks = 0; t1.stage0_ticks = 0; diff --git a/snes/smp/smp.hpp b/snes/smp/smp.hpp index cb8211e4..a7da3867 100755 --- a/snes/smp/smp.hpp +++ b/snes/smp/smp.hpp @@ -5,8 +5,8 @@ public: alwaysinline void synchronize_cpu(); alwaysinline void synchronize_dsp(); - uint8 port_read(uint8 port); - void port_write(uint8 port, uint8 data); + uint8 port_read(uint2 port) const; + void port_write(uint2 port, uint8 data); void enter(); void power(); @@ -43,7 +43,8 @@ private: uint8 dsp_addr; //$00f8,$00f9 - uint8 smp_f8, smp_f9; + uint8 ram0; + uint8 ram1; } status; static void Enter(); diff --git a/snes/snes.hpp b/snes/snes.hpp index 04c1a35c..fffcad96 100755 --- a/snes/snes.hpp +++ b/snes/snes.hpp @@ -1,7 +1,7 @@ namespace SNES { namespace Info { static const char Name[] = "bsnes"; - static const char Version[] = "067.22"; + static const char Version[] = "067.23"; static const unsigned SerializerVersion = 12; } } @@ -28,6 +28,7 @@ namespace SNES { #include #include #include +#include #include using namespace nall; @@ -38,15 +39,20 @@ using namespace nall; #endif namespace SNES { - typedef int8_t int8; - typedef int16_t int16; - typedef int32_t int32; - typedef int64_t int64; - typedef uint8_t uint8; + typedef int8_t int8; + typedef int16_t int16; + typedef int32_t int32; + typedef int64_t int64; + typedef uint8_t uint8; typedef uint16_t uint16; typedef uint32_t uint32; typedef uint64_t uint64; + typedef uint_t<2> uint2; + typedef uint_t<10> uint10; + typedef uint_t<17> uint17; + typedef uint_t<24> uint24; + struct Processor { cothread_t thread; unsigned frequency; diff --git a/sync.sh b/sync.sh index 4fc3d059..0d87f913 100755 --- a/sync.sh +++ b/sync.sh @@ -11,3 +11,4 @@ synchronize "ruby" test -d libco/doc && rm -r libco/doc test -d libco/test && rm -r libco/test +test -d ruby/_test && rm -r ruby/_test