mirror of https://github.com/bsnes-emu/bsnes.git
Update to bsnes v017 release.
- This version adds major accuracy improvements, countless bugfixes and DSP-1 support. At the time of this release, the only remaining known bug in bsnes is with Uniracers 2-player mode, with well over 300+ games tested. Changelog: - DSP-1 support added [Andreas Naive, byuu] - Added cooperative multithreading library, written by myself - Rewritten CPU core, now bus accurate - Rewritten APU core, now bus accurate - Added cartridge database - Added several PCB mappers, thanks to research from Overload - Added several games to database, fixing several mapping-related bugs - Improved mirroring [Nach, grinvader, byuu] - vscroll bug in hires, interlaced mode fixed. Fixes RPM racing - RTO X=256 bug corrected. Fixes Super Conflict title screen [anomie] - Fixed bug in NTSC filter with hires games - Updated snes_ntsc to version 2.0.1 [blargg] - Fixed bugs in HiROM / LoROM memory mapping. Fixes countless games - Fixed major bugs in HDMA routine. Fixes ToP, Mortal Kombat and Genjuu Ryodan - Added out-of-order execution to CPU, APU synchronization for major speedup with no accuracy loss - IRQs are now delayed after H/DMA transfers. Fixes Wild Guns - HDMA transfers now kill active DMA channels that are on the same channel. Fixes Bugs Bunny and World Class Rugby. Special thanks to zones for researching this - CPU emulation mode accuracy was improved - Cleaned up port-specific code to ease porting - Created unified Makefile, used by all ports [Nach] - Created GTK+ port of bsnes (although input is currently broken) - WRAM is now initialized to 0x55, SRAM to 0xff. Fixes Power Drive, Death Brade and RPM Racing - Fixed extreme NMI / IRQ edge case. Fixes Chou Aniki - Adjusted PAL execution speed. Fixes Earthworm Jim 2 (E) sound effects - Fixed auto joypad polling bug. Fixes La Wares - Fixed H/DMA bug that was preventing saves from working in Secret of Evermore - bsnes low loads d3dx9_*.dll dynamically at runtime, it is no longer required - Added support for 239-line PAL mode rendering - As usual, there have been much more changes I've forgotten about since the last release - Two C4 bugs fixed. Mega Man X2 / X3 have no remaining known bugs [anomie, byuu]
This commit is contained in:
parent
192e53bb87
commit
e308cf4275
15
license.txt
15
license.txt
|
@ -4,9 +4,10 @@ You are free to redistribute this software, and its source code; provided
|
||||||
there is no charge for the software, nor any charge for the medium used to
|
there is no charge for the software, nor any charge for the medium used to
|
||||||
distribute the software. You are also free to use and modify the source code
|
distribute the software. You are also free to use and modify the source code
|
||||||
as you desire for personal use only. No publically-released derivative works
|
as you desire for personal use only. No publically-released derivative works
|
||||||
of this source code are permitted without my permission, though I will likely
|
of this program nor its source code are permitted without my permission,
|
||||||
grant you permission if you ask me. You must also abide by the terms of any
|
though I will likely grant you permission if you ask me. You must also abide
|
||||||
additional source code licenses contained within this program.
|
by the terms of any additional source code licenses contained within this
|
||||||
|
program.
|
||||||
|
|
||||||
Simple DirectMedia Layer License:
|
Simple DirectMedia Layer License:
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
@ -20,7 +21,15 @@ http://www.libsdl.org/
|
||||||
This library is distributed under the terms of the GNU LGPL:
|
This library is distributed under the terms of the GNU LGPL:
|
||||||
http://www.gnu.org/copyleft/lesser.html
|
http://www.gnu.org/copyleft/lesser.html
|
||||||
|
|
||||||
|
JMA License:
|
||||||
|
------------
|
||||||
|
JMA is licensed under the GNU GPL. I have received special exemption from
|
||||||
|
Nach to use this library in bsnes.
|
||||||
|
|
||||||
Licensing Exemptions:
|
Licensing Exemptions:
|
||||||
---------------------
|
---------------------
|
||||||
|
libco is public domain. You may obtain the latest version at:
|
||||||
|
http://byuu.org/
|
||||||
|
|
||||||
Richard Bannister has asked for and received my permission to distribute
|
Richard Bannister has asked for and received my permission to distribute
|
||||||
a binary-only port of bsnes on the Mac OS X platform.
|
a binary-only port of bsnes on the Mac OS X platform.
|
||||||
|
|
|
@ -0,0 +1,108 @@
|
||||||
|
bsnes
|
||||||
|
Version 0.017
|
||||||
|
Author: byuu
|
||||||
|
|
||||||
|
|
||||||
|
General
|
||||||
|
-------
|
||||||
|
bsnes is a Super Nintendo / Super Famicom emulator that began on
|
||||||
|
October 14th, 2004.
|
||||||
|
|
||||||
|
The latest version can be downloaded from:
|
||||||
|
http://byuu.org/
|
||||||
|
|
||||||
|
Please see license.txt for important licensing information.
|
||||||
|
|
||||||
|
|
||||||
|
Known Bug(s)
|
||||||
|
------------
|
||||||
|
Uniracers / Unirally
|
||||||
|
- 2-player mode sprite issues (mid-frame OAM writes not supported)
|
||||||
|
|
||||||
|
|
||||||
|
Known Limitations
|
||||||
|
-----------------
|
||||||
|
S-CPU
|
||||||
|
- Invalid DMA / HDMA transfers (eg WRAM<>WRAM) not fully emulated
|
||||||
|
- DMA / HDMA bus synchronization timing not supported
|
||||||
|
- Multiply / Divide register delays not implemented
|
||||||
|
|
||||||
|
S-SMP
|
||||||
|
- Cycle breakdown of opcodes is theoretical, but mostly correct
|
||||||
|
|
||||||
|
S-PPU
|
||||||
|
- Uses scanline-based renderer. This is very inaccurate, but very
|
||||||
|
few games rely on mid-scanline writes to function correctly
|
||||||
|
- Does not support FirstSprite+Y priority
|
||||||
|
- OAM / CGRAM accesses during active display not supported correctly
|
||||||
|
- RTO flags are not calculated on frames that are skipped when frameskipping
|
||||||
|
is enabled. This provides a major speedup, however it will cause in issues
|
||||||
|
in games that test these flags, eg the SNES Test Program Electronics Test.
|
||||||
|
Turning frameskipping off will allow RTO flag calculation on every frame
|
||||||
|
|
||||||
|
S-DSP
|
||||||
|
- Runs at 32khz. Hardware S-DSP likely runs at 1.024mhz to perform
|
||||||
|
multiple reads / writes per sample. Sound is still output at 32khz,
|
||||||
|
of course
|
||||||
|
|
||||||
|
Hardware Bugs
|
||||||
|
- CPUr1 HDMA crashing bug not emulated
|
||||||
|
- CPU<>APU communication bus conflicts not emulated
|
||||||
|
|
||||||
|
|
||||||
|
Unsupported Hardware
|
||||||
|
--------------------
|
||||||
|
SA-1
|
||||||
|
Coprocessor used in many popular games, including:
|
||||||
|
- Dragon Ball Z Hyper Dimension
|
||||||
|
- Kirby Super Star
|
||||||
|
- Kirby's Dreamland 3
|
||||||
|
- Marvelous
|
||||||
|
- SD Gundam G-NEXT
|
||||||
|
- Super Mario RPG
|
||||||
|
|
||||||
|
Super FX
|
||||||
|
Coprocessor used in many popular games, including:
|
||||||
|
- Doom
|
||||||
|
- Star Fox
|
||||||
|
- Star Fox 2 (unreleased beta)
|
||||||
|
- Super Mario World 2: Yoshi's Island
|
||||||
|
|
||||||
|
SPC7110
|
||||||
|
Coprocessor used only by the following games:
|
||||||
|
- Far East of Eden Zero
|
||||||
|
- Far East of Eden Zero: Shounen Jump no Shou
|
||||||
|
- Momotarou Densetsu Happy
|
||||||
|
- Super Power League 4
|
||||||
|
|
||||||
|
DSP-3
|
||||||
|
Coprocessor used only by SD Gundam GX
|
||||||
|
|
||||||
|
DSP-4
|
||||||
|
Coprocessor used only by Top Gear 3000
|
||||||
|
|
||||||
|
ST010 / ST011 / ST018
|
||||||
|
SETA coprocessors used by very few games
|
||||||
|
|
||||||
|
BS-X (Broadcast Satellite)
|
||||||
|
Add-on unit sold only in Japan that played specially-made games that
|
||||||
|
were downloaded via satellite
|
||||||
|
|
||||||
|
BS-X Flashcart
|
||||||
|
Flash cartridge used by BS-X, as well as some standalone games by
|
||||||
|
Asciisoft
|
||||||
|
|
||||||
|
Bandai Sufami Turbo
|
||||||
|
Special cartloader to play some Bandai games
|
||||||
|
|
||||||
|
Super Gameboy
|
||||||
|
Cartridge passthrough used for playing Gameboy games
|
||||||
|
|
||||||
|
|
||||||
|
Unsupported controllers
|
||||||
|
-----------------------
|
||||||
|
Mouse
|
||||||
|
Super Scope
|
||||||
|
Justifier
|
||||||
|
Multitap (4-port)
|
||||||
|
Multitap (5-port)
|
|
@ -1,4 +1,4 @@
|
||||||
#define BSNES_VERSION "0.016.52"
|
#define BSNES_VERSION "0.017"
|
||||||
#define BSNES_TITLE "bsnes v" BSNES_VERSION
|
#define BSNES_TITLE "bsnes v" BSNES_VERSION
|
||||||
|
|
||||||
#define MEMCORE bMemBus
|
#define MEMCORE bMemBus
|
||||||
|
@ -14,13 +14,13 @@
|
||||||
#define CHEAT_SYSTEM
|
#define CHEAT_SYSTEM
|
||||||
|
|
||||||
//enable GZ, ZIP format support
|
//enable GZ, ZIP format support
|
||||||
//#define GZIP_SUPPORT
|
#define GZIP_SUPPORT
|
||||||
|
|
||||||
//enable JMA support
|
//enable JMA support
|
||||||
//#define JMA_SUPPORT
|
#define JMA_SUPPORT
|
||||||
|
|
||||||
//debugging extensions (~10% speed hit)
|
//debugging extensions (~10% speed hit)
|
||||||
#define DEBUGGER
|
//#define DEBUGGER
|
||||||
|
|
||||||
//snes core polymorphism
|
//snes core polymorphism
|
||||||
//(allow mem/cpu/apu/ppu overriding, ~10% speed hit)
|
//(allow mem/cpu/apu/ppu overriding, ~10% speed hit)
|
||||||
|
|
|
@ -482,25 +482,25 @@ void bCPU::mmio_w4206(uint8 value) {
|
||||||
|
|
||||||
//HTIMEL
|
//HTIMEL
|
||||||
void bCPU::mmio_w4207(uint8 value) {
|
void bCPU::mmio_w4207(uint8 value) {
|
||||||
status.hirq_pos = (status.hirq_pos & 0xff00) | value;
|
status.hirq_pos = ((status.hirq_pos & 0xff00) | value) & 0x01ff;
|
||||||
update_interrupts();
|
update_interrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
//HTIMEH
|
//HTIMEH
|
||||||
void bCPU::mmio_w4208(uint8 value) {
|
void bCPU::mmio_w4208(uint8 value) {
|
||||||
status.hirq_pos = (status.hirq_pos & 0x00ff) | (value << 8);
|
status.hirq_pos = ((status.hirq_pos & 0x00ff) | (value << 8)) & 0x01ff;
|
||||||
update_interrupts();
|
update_interrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
//VTIMEL
|
//VTIMEL
|
||||||
void bCPU::mmio_w4209(uint8 value) {
|
void bCPU::mmio_w4209(uint8 value) {
|
||||||
status.virq_pos = (status.virq_pos & 0xff00) | value;
|
status.virq_pos = ((status.virq_pos & 0xff00) | value) & 0x01ff;
|
||||||
update_interrupts();
|
update_interrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
//VTIMEH
|
//VTIMEH
|
||||||
void bCPU::mmio_w420a(uint8 value) {
|
void bCPU::mmio_w420a(uint8 value) {
|
||||||
status.virq_pos = (status.virq_pos & 0x00ff) | (value << 8);
|
status.virq_pos = ((status.virq_pos & 0x00ff) | (value << 8)) & 0x01ff;
|
||||||
update_interrupts();
|
update_interrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,19 +21,19 @@ void sCPU::mmio_w2180(uint8 data) {
|
||||||
|
|
||||||
//WMADDL
|
//WMADDL
|
||||||
void sCPU::mmio_w2181(uint8 data) {
|
void sCPU::mmio_w2181(uint8 data) {
|
||||||
status.wram_addr = (status.wram_addr & 0xffff00) | (data);
|
status.wram_addr = (status.wram_addr & 0xffff00) | (data);
|
||||||
status.wram_addr &= 0x01ffff;
|
status.wram_addr &= 0x01ffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
//WMADDM
|
//WMADDM
|
||||||
void sCPU::mmio_w2182(uint8 data) {
|
void sCPU::mmio_w2182(uint8 data) {
|
||||||
status.wram_addr = (status.wram_addr & 0xff00ff) | (data << 8);
|
status.wram_addr = (status.wram_addr & 0xff00ff) | (data << 8);
|
||||||
status.wram_addr &= 0x01ffff;
|
status.wram_addr &= 0x01ffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
//WMADDH
|
//WMADDH
|
||||||
void sCPU::mmio_w2183(uint8 data) {
|
void sCPU::mmio_w2183(uint8 data) {
|
||||||
status.wram_addr = (status.wram_addr & 0x00ffff) | (data << 16);
|
status.wram_addr = (status.wram_addr & 0x00ffff) | (data << 16);
|
||||||
status.wram_addr &= 0x01ffff;
|
status.wram_addr &= 0x01ffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,8 @@ uint8 sCPU::mmio_r4016() {
|
||||||
uint8 r = regs.mdr & 0xfc;
|
uint8 r = regs.mdr & 0xfc;
|
||||||
r |= status.joypad1_bits & 1;
|
r |= status.joypad1_bits & 1;
|
||||||
if(status.joypad_strobe_latch == 0) {
|
if(status.joypad_strobe_latch == 0) {
|
||||||
status.joypad1_bits = asr<1>(status.joypad1_bits);
|
status.joypad1_bits >>= 1;
|
||||||
|
status.joypad1_bits |= 0x8000;
|
||||||
}
|
}
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
|
@ -65,7 +66,8 @@ uint8 sCPU::mmio_r4017() {
|
||||||
uint8 r = (regs.mdr & 0xe0) | 0x1c;
|
uint8 r = (regs.mdr & 0xe0) | 0x1c;
|
||||||
r |= status.joypad2_bits & 1;
|
r |= status.joypad2_bits & 1;
|
||||||
if(status.joypad_strobe_latch == 0) {
|
if(status.joypad_strobe_latch == 0) {
|
||||||
status.joypad2_bits = asr<1>(status.joypad2_bits);
|
status.joypad2_bits >>= 1;
|
||||||
|
status.joypad2_bits |= 0x8000;
|
||||||
}
|
}
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
|
@ -179,25 +181,29 @@ void sCPU::mmio_w4200(uint8 data) {
|
||||||
|
|
||||||
//HTIMEL
|
//HTIMEL
|
||||||
void sCPU::mmio_w4207(uint8 data) {
|
void sCPU::mmio_w4207(uint8 data) {
|
||||||
status.hirq_pos = (status.hirq_pos & 0xff00) | (data);
|
status.hirq_pos = (status.hirq_pos & ~0xff) | (data);
|
||||||
|
status.hirq_pos &= 0x01ff;
|
||||||
update_interrupts();
|
update_interrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
//HTIMEH
|
//HTIMEH
|
||||||
void sCPU::mmio_w4208(uint8 data) {
|
void sCPU::mmio_w4208(uint8 data) {
|
||||||
status.hirq_pos = (status.hirq_pos & 0x00ff) | (data << 8);
|
status.hirq_pos = (status.hirq_pos & 0xff) | (data << 8);
|
||||||
|
status.hirq_pos &= 0x01ff;
|
||||||
update_interrupts();
|
update_interrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
//VTIMEL
|
//VTIMEL
|
||||||
void sCPU::mmio_w4209(uint8 data) {
|
void sCPU::mmio_w4209(uint8 data) {
|
||||||
status.virq_pos = (status.virq_pos & 0xff00) | (data);
|
status.virq_pos = (status.virq_pos & ~0xff) | (data);
|
||||||
|
status.virq_pos &= 0x01ff;
|
||||||
update_interrupts();
|
update_interrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
//VTIMEH
|
//VTIMEH
|
||||||
void sCPU::mmio_w420a(uint8 data) {
|
void sCPU::mmio_w420a(uint8 data) {
|
||||||
status.virq_pos = (status.virq_pos & 0x00ff) | (data << 8);
|
status.virq_pos = (status.virq_pos & 0xff) | (data << 8);
|
||||||
|
status.virq_pos &= 0x01ff;
|
||||||
update_interrupts();
|
update_interrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ void sCPU::run_manual_joypad_poll() {
|
||||||
status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_X)) << 9;
|
status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_X)) << 9;
|
||||||
status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_L)) << 10;
|
status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_L)) << 10;
|
||||||
status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_R)) << 11;
|
status.joypad1_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD1, SNES::JOYPAD_R)) << 11;
|
||||||
status.joypad1_bits |= ~0xffff;
|
|
||||||
|
|
||||||
status.joypad2_bits = uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_B)) << 0;
|
status.joypad2_bits = uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_B)) << 0;
|
||||||
status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_Y)) << 1;
|
status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_Y)) << 1;
|
||||||
|
@ -28,7 +27,6 @@ void sCPU::run_manual_joypad_poll() {
|
||||||
status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_X)) << 9;
|
status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_X)) << 9;
|
||||||
status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_L)) << 10;
|
status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_L)) << 10;
|
||||||
status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_R)) << 11;
|
status.joypad2_bits |= uint8(snes->get_input_status(SNES::DEV_JOYPAD2, SNES::JOYPAD_R)) << 11;
|
||||||
status.joypad2_bits |= ~0xffff;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****
|
/*****
|
||||||
|
@ -66,6 +64,6 @@ uint16 joy1 = 0x0000, joy2 = 0x0000;
|
||||||
status.joypad1_bits >>= 16;
|
status.joypad1_bits >>= 16;
|
||||||
status.joypad2_bits >>= 16;
|
status.joypad2_bits >>= 16;
|
||||||
|
|
||||||
status.joypad1_bits |= ~0xffff;
|
status.joypad1_bits |= 0xffff;
|
||||||
status.joypad2_bits |= ~0xffff;
|
status.joypad2_bits |= 0xffff;
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 281 KiB |
Binary file not shown.
Before Width: | Height: | Size: 56 KiB |
|
@ -23,13 +23,6 @@ void bPPU::scanline() {
|
||||||
|
|
||||||
regs.mosaic_countdown = regs.mosaic_size + 1;
|
regs.mosaic_countdown = regs.mosaic_size + 1;
|
||||||
regs.mosaic_countdown--;
|
regs.mosaic_countdown--;
|
||||||
|
|
||||||
//OAM sprite priority rotation
|
|
||||||
if(regs.oam_priority == false) {
|
|
||||||
regs.oam_firstsprite = 0;
|
|
||||||
} else {
|
|
||||||
regs.oam_firstsprite = (regs.oam_addr >> 2) & 127;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
for(int bg = BG1; bg <= BG4; bg++) {
|
for(int bg = BG1; bg <= BG4; bg++) {
|
||||||
if(!regs.mosaic_enabled[bg] || !regs.mosaic_countdown) {
|
if(!regs.mosaic_enabled[bg] || !regs.mosaic_countdown) {
|
||||||
|
@ -43,9 +36,11 @@ void bPPU::scanline() {
|
||||||
regs.mosaic_countdown--;
|
regs.mosaic_countdown--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(line.y == (!r_cpu->overscan() ? 225 : 240) && regs.display_disabled == false) {
|
if(line.y == (!r_cpu->overscan() ? 225 : 240)) {
|
||||||
//OAM address reset
|
if(regs.display_disabled == false) {
|
||||||
regs.oam_addr = regs.oam_baseaddr << 1;
|
//OAM address reset
|
||||||
|
regs.oam_addr = regs.oam_baseaddr << 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(line.y == 241 && line.interlace_field == 1) {
|
if(line.y == 241 && line.interlace_field == 1) {
|
||||||
|
@ -98,7 +93,7 @@ void bPPU::power() {
|
||||||
|
|
||||||
//$2102-$2103
|
//$2102-$2103
|
||||||
regs.oam_baseaddr = 0x0000;
|
regs.oam_baseaddr = 0x0000;
|
||||||
regs.oam_addr = regs.oam_baseaddr << 1;
|
regs.oam_addr = 0x0000;
|
||||||
regs.oam_priority = false;
|
regs.oam_priority = false;
|
||||||
regs.oam_firstsprite = 0;
|
regs.oam_firstsprite = 0;
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,7 @@ uint16 hc = r_cpu->hcycles();
|
||||||
|
|
||||||
//INIDISP
|
//INIDISP
|
||||||
void bPPU::mmio_w2100(uint8 value) {
|
void bPPU::mmio_w2100(uint8 value) {
|
||||||
regs.display_disabled = bool(value & 0x80);
|
regs.display_disabled = !!(value & 0x80);
|
||||||
regs.display_brightness = value & 15;
|
regs.display_brightness = value & 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,69 +93,55 @@ void bPPU::mmio_w2101(uint8 value) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//OAMADDL
|
//OAMADDL
|
||||||
void bPPU::mmio_w2102(uint8 value) {
|
void bPPU::mmio_w2102(uint8 data) {
|
||||||
regs.oam_baseaddr = (regs.oam_baseaddr & 0x100) | value;
|
regs.oam_baseaddr = (regs.oam_baseaddr & ~0xff) | (data << 0);
|
||||||
regs.oam_addr = regs.oam_baseaddr << 1;
|
regs.oam_baseaddr &= 0x01ff;
|
||||||
|
regs.oam_addr = regs.oam_baseaddr << 1;
|
||||||
if(regs.oam_priority == false) {
|
regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127;
|
||||||
regs.oam_firstsprite = 0;
|
|
||||||
} else {
|
|
||||||
regs.oam_firstsprite = (regs.oam_addr >> 2) & 127;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//OAMADDH
|
//OAMADDH
|
||||||
void bPPU::mmio_w2103(uint8 value) {
|
void bPPU::mmio_w2103(uint8 data) {
|
||||||
regs.oam_priority = bool(value & 0x80);
|
regs.oam_priority = !!(data & 0x80);
|
||||||
regs.oam_baseaddr = ((value & 1) << 8) | (regs.oam_baseaddr & 0xff);
|
regs.oam_baseaddr = (regs.oam_baseaddr & 0xff) | (data << 8);
|
||||||
regs.oam_addr = regs.oam_baseaddr << 1;
|
regs.oam_baseaddr &= 0x01ff;
|
||||||
|
regs.oam_addr = regs.oam_baseaddr << 1;
|
||||||
if(regs.oam_priority == false) {
|
regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127;
|
||||||
regs.oam_firstsprite = 0;
|
|
||||||
} else {
|
|
||||||
regs.oam_firstsprite = (regs.oam_addr >> 2) & 127;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//OAMDATA
|
//OAMDATA
|
||||||
void bPPU::mmio_w2104(uint8 value) {
|
void bPPU::mmio_w2104(uint8 data) {
|
||||||
if(regs.oam_addr >= 0x0200) {
|
if(regs.oam_addr & 0x0200) {
|
||||||
oam_write(regs.oam_addr, value);
|
oam_write(regs.oam_addr, data);
|
||||||
} else if(!(regs.oam_addr & 1)) {
|
} else if((regs.oam_addr & 1) == 0) {
|
||||||
regs.oam_latchdata = value;
|
regs.oam_latchdata = data;
|
||||||
} else {
|
} else {
|
||||||
oam_write((regs.oam_addr & 0x01fe) + 0, regs.oam_latchdata);
|
oam_write((regs.oam_addr & ~1) + 0, regs.oam_latchdata);
|
||||||
oam_write((regs.oam_addr & 0x01fe) + 1, value);
|
oam_write((regs.oam_addr & ~1) + 1, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
regs.oam_addr++;
|
regs.oam_addr++;
|
||||||
regs.oam_addr &= 0x03ff;
|
regs.oam_addr &= 0x03ff;
|
||||||
|
regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127;
|
||||||
if(!(regs.oam_addr & 1)) {
|
|
||||||
if(regs.oam_priority == false) {
|
|
||||||
regs.oam_firstsprite = 0;
|
|
||||||
} else {
|
|
||||||
regs.oam_firstsprite = (regs.oam_addr >> 2) & 127;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//BGMODE
|
//BGMODE
|
||||||
void bPPU::mmio_w2105(uint8 value) {
|
void bPPU::mmio_w2105(uint8 value) {
|
||||||
regs.bg_tilesize[BG4] = bool(value & 0x80);
|
regs.bg_tilesize[BG4] = !!(value & 0x80);
|
||||||
regs.bg_tilesize[BG3] = bool(value & 0x40);
|
regs.bg_tilesize[BG3] = !!(value & 0x40);
|
||||||
regs.bg_tilesize[BG2] = bool(value & 0x20);
|
regs.bg_tilesize[BG2] = !!(value & 0x20);
|
||||||
regs.bg_tilesize[BG1] = bool(value & 0x10);
|
regs.bg_tilesize[BG1] = !!(value & 0x10);
|
||||||
regs.bg3_priority = bool(value & 0x08);
|
regs.bg3_priority = !!(value & 0x08);
|
||||||
regs.bg_mode = (value & 7);
|
regs.bg_mode = (value & 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
//MOSAIC
|
//MOSAIC
|
||||||
void bPPU::mmio_w2106(uint8 value) {
|
void bPPU::mmio_w2106(uint8 value) {
|
||||||
regs.mosaic_size = (value >> 4) & 15;
|
regs.mosaic_size = (value >> 4) & 15;
|
||||||
regs.mosaic_enabled[BG4] = bool(value & 0x08);
|
regs.mosaic_enabled[BG4] = !!(value & 0x08);
|
||||||
regs.mosaic_enabled[BG3] = bool(value & 0x04);
|
regs.mosaic_enabled[BG3] = !!(value & 0x04);
|
||||||
regs.mosaic_enabled[BG2] = bool(value & 0x02);
|
regs.mosaic_enabled[BG2] = !!(value & 0x02);
|
||||||
regs.mosaic_enabled[BG1] = bool(value & 0x01);
|
regs.mosaic_enabled[BG1] = !!(value & 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
//BG1SC
|
//BG1SC
|
||||||
|
@ -250,7 +236,7 @@ void bPPU::mmio_w2114(uint8 value) {
|
||||||
|
|
||||||
//VMAIN
|
//VMAIN
|
||||||
void bPPU::mmio_w2115(uint8 value) {
|
void bPPU::mmio_w2115(uint8 value) {
|
||||||
regs.vram_incmode = bool(value & 0x80);
|
regs.vram_incmode = !!(value & 0x80);
|
||||||
regs.vram_mapping = (value >> 2) & 3;
|
regs.vram_mapping = (value >> 2) & 3;
|
||||||
switch(value & 3) {
|
switch(value & 3) {
|
||||||
case 0: regs.vram_incsize = 1; break;
|
case 0: regs.vram_incsize = 1; break;
|
||||||
|
@ -305,8 +291,8 @@ uint16 addr = get_vram_address() + 1;
|
||||||
//M7SEL
|
//M7SEL
|
||||||
void bPPU::mmio_w211a(uint8 value) {
|
void bPPU::mmio_w211a(uint8 value) {
|
||||||
regs.mode7_repeat = (value >> 6) & 3;
|
regs.mode7_repeat = (value >> 6) & 3;
|
||||||
regs.mode7_vflip = bool(value & 0x02);
|
regs.mode7_vflip = !!(value & 0x02);
|
||||||
regs.mode7_hflip = bool(value & 0x01);
|
regs.mode7_hflip = !!(value & 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
//M7A
|
//M7A
|
||||||
|
@ -371,38 +357,38 @@ void bPPU::mmio_w2122(uint8 value) {
|
||||||
|
|
||||||
//W12SEL
|
//W12SEL
|
||||||
void bPPU::mmio_w2123(uint8 value) {
|
void bPPU::mmio_w2123(uint8 value) {
|
||||||
regs.window2_enabled[BG2] = bool(value & 0x80);
|
regs.window2_enabled[BG2] = !!(value & 0x80);
|
||||||
regs.window2_invert [BG2] = bool(value & 0x40);
|
regs.window2_invert [BG2] = !!(value & 0x40);
|
||||||
regs.window1_enabled[BG2] = bool(value & 0x20);
|
regs.window1_enabled[BG2] = !!(value & 0x20);
|
||||||
regs.window1_invert [BG2] = bool(value & 0x10);
|
regs.window1_invert [BG2] = !!(value & 0x10);
|
||||||
regs.window2_enabled[BG1] = bool(value & 0x08);
|
regs.window2_enabled[BG1] = !!(value & 0x08);
|
||||||
regs.window2_invert [BG1] = bool(value & 0x04);
|
regs.window2_invert [BG1] = !!(value & 0x04);
|
||||||
regs.window1_enabled[BG1] = bool(value & 0x02);
|
regs.window1_enabled[BG1] = !!(value & 0x02);
|
||||||
regs.window1_invert [BG1] = bool(value & 0x01);
|
regs.window1_invert [BG1] = !!(value & 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
//W34SEL
|
//W34SEL
|
||||||
void bPPU::mmio_w2124(uint8 value) {
|
void bPPU::mmio_w2124(uint8 value) {
|
||||||
regs.window2_enabled[BG4] = bool(value & 0x80);
|
regs.window2_enabled[BG4] = !!(value & 0x80);
|
||||||
regs.window2_invert [BG4] = bool(value & 0x40);
|
regs.window2_invert [BG4] = !!(value & 0x40);
|
||||||
regs.window1_enabled[BG4] = bool(value & 0x20);
|
regs.window1_enabled[BG4] = !!(value & 0x20);
|
||||||
regs.window1_invert [BG4] = bool(value & 0x10);
|
regs.window1_invert [BG4] = !!(value & 0x10);
|
||||||
regs.window2_enabled[BG3] = bool(value & 0x08);
|
regs.window2_enabled[BG3] = !!(value & 0x08);
|
||||||
regs.window2_invert [BG3] = bool(value & 0x04);
|
regs.window2_invert [BG3] = !!(value & 0x04);
|
||||||
regs.window1_enabled[BG3] = bool(value & 0x02);
|
regs.window1_enabled[BG3] = !!(value & 0x02);
|
||||||
regs.window1_invert [BG3] = bool(value & 0x01);
|
regs.window1_invert [BG3] = !!(value & 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
//WOBJSEL
|
//WOBJSEL
|
||||||
void bPPU::mmio_w2125(uint8 value) {
|
void bPPU::mmio_w2125(uint8 value) {
|
||||||
regs.window2_enabled[COL] = bool(value & 0x80);
|
regs.window2_enabled[COL] = !!(value & 0x80);
|
||||||
regs.window2_invert [COL] = bool(value & 0x40);
|
regs.window2_invert [COL] = !!(value & 0x40);
|
||||||
regs.window1_enabled[COL] = bool(value & 0x20);
|
regs.window1_enabled[COL] = !!(value & 0x20);
|
||||||
regs.window1_invert [COL] = bool(value & 0x10);
|
regs.window1_invert [COL] = !!(value & 0x10);
|
||||||
regs.window2_enabled[OAM] = bool(value & 0x08);
|
regs.window2_enabled[OAM] = !!(value & 0x08);
|
||||||
regs.window2_invert [OAM] = bool(value & 0x04);
|
regs.window2_invert [OAM] = !!(value & 0x04);
|
||||||
regs.window1_enabled[OAM] = bool(value & 0x02);
|
regs.window1_enabled[OAM] = !!(value & 0x02);
|
||||||
regs.window1_invert [OAM] = bool(value & 0x01);
|
regs.window1_invert [OAM] = !!(value & 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
//WH0
|
//WH0
|
||||||
|
@ -441,58 +427,58 @@ void bPPU::mmio_w212b(uint8 value) {
|
||||||
|
|
||||||
//TM
|
//TM
|
||||||
void bPPU::mmio_w212c(uint8 value) {
|
void bPPU::mmio_w212c(uint8 value) {
|
||||||
regs.bg_enabled[OAM] = bool(value & 0x10);
|
regs.bg_enabled[OAM] = !!(value & 0x10);
|
||||||
regs.bg_enabled[BG4] = bool(value & 0x08);
|
regs.bg_enabled[BG4] = !!(value & 0x08);
|
||||||
regs.bg_enabled[BG3] = bool(value & 0x04);
|
regs.bg_enabled[BG3] = !!(value & 0x04);
|
||||||
regs.bg_enabled[BG2] = bool(value & 0x02);
|
regs.bg_enabled[BG2] = !!(value & 0x02);
|
||||||
regs.bg_enabled[BG1] = bool(value & 0x01);
|
regs.bg_enabled[BG1] = !!(value & 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TS
|
//TS
|
||||||
void bPPU::mmio_w212d(uint8 value) {
|
void bPPU::mmio_w212d(uint8 value) {
|
||||||
regs.bgsub_enabled[OAM] = bool(value & 0x10);
|
regs.bgsub_enabled[OAM] = !!(value & 0x10);
|
||||||
regs.bgsub_enabled[BG4] = bool(value & 0x08);
|
regs.bgsub_enabled[BG4] = !!(value & 0x08);
|
||||||
regs.bgsub_enabled[BG3] = bool(value & 0x04);
|
regs.bgsub_enabled[BG3] = !!(value & 0x04);
|
||||||
regs.bgsub_enabled[BG2] = bool(value & 0x02);
|
regs.bgsub_enabled[BG2] = !!(value & 0x02);
|
||||||
regs.bgsub_enabled[BG1] = bool(value & 0x01);
|
regs.bgsub_enabled[BG1] = !!(value & 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TMW
|
//TMW
|
||||||
void bPPU::mmio_w212e(uint8 value) {
|
void bPPU::mmio_w212e(uint8 value) {
|
||||||
regs.window_enabled[OAM] = bool(value & 0x10);
|
regs.window_enabled[OAM] = !!(value & 0x10);
|
||||||
regs.window_enabled[BG4] = bool(value & 0x08);
|
regs.window_enabled[BG4] = !!(value & 0x08);
|
||||||
regs.window_enabled[BG3] = bool(value & 0x04);
|
regs.window_enabled[BG3] = !!(value & 0x04);
|
||||||
regs.window_enabled[BG2] = bool(value & 0x02);
|
regs.window_enabled[BG2] = !!(value & 0x02);
|
||||||
regs.window_enabled[BG1] = bool(value & 0x01);
|
regs.window_enabled[BG1] = !!(value & 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TSW
|
//TSW
|
||||||
void bPPU::mmio_w212f(uint8 value) {
|
void bPPU::mmio_w212f(uint8 value) {
|
||||||
regs.sub_window_enabled[OAM] = bool(value & 0x10);
|
regs.sub_window_enabled[OAM] = !!(value & 0x10);
|
||||||
regs.sub_window_enabled[BG4] = bool(value & 0x08);
|
regs.sub_window_enabled[BG4] = !!(value & 0x08);
|
||||||
regs.sub_window_enabled[BG3] = bool(value & 0x04);
|
regs.sub_window_enabled[BG3] = !!(value & 0x04);
|
||||||
regs.sub_window_enabled[BG2] = bool(value & 0x02);
|
regs.sub_window_enabled[BG2] = !!(value & 0x02);
|
||||||
regs.sub_window_enabled[BG1] = bool(value & 0x01);
|
regs.sub_window_enabled[BG1] = !!(value & 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
//CGWSEL
|
//CGWSEL
|
||||||
void bPPU::mmio_w2130(uint8 value) {
|
void bPPU::mmio_w2130(uint8 value) {
|
||||||
regs.color_mask = (value >> 6) & 3;
|
regs.color_mask = (value >> 6) & 3;
|
||||||
regs.colorsub_mask = (value >> 4) & 3;
|
regs.colorsub_mask = (value >> 4) & 3;
|
||||||
regs.addsub_mode = bool(value & 0x02);
|
regs.addsub_mode = !!(value & 0x02);
|
||||||
regs.direct_color = bool(value & 0x01);
|
regs.direct_color = !!(value & 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
//CGADDSUB
|
//CGADDSUB
|
||||||
void bPPU::mmio_w2131(uint8 value) {
|
void bPPU::mmio_w2131(uint8 value) {
|
||||||
regs.color_mode = bool(value & 0x80);
|
regs.color_mode = !!(value & 0x80);
|
||||||
regs.color_halve = bool(value & 0x40);
|
regs.color_halve = !!(value & 0x40);
|
||||||
regs.color_enabled[BACK] = bool(value & 0x20);
|
regs.color_enabled[BACK] = !!(value & 0x20);
|
||||||
regs.color_enabled[OAM] = bool(value & 0x10);
|
regs.color_enabled[OAM] = !!(value & 0x10);
|
||||||
regs.color_enabled[BG4] = bool(value & 0x08);
|
regs.color_enabled[BG4] = !!(value & 0x08);
|
||||||
regs.color_enabled[BG3] = bool(value & 0x04);
|
regs.color_enabled[BG3] = !!(value & 0x04);
|
||||||
regs.color_enabled[BG2] = bool(value & 0x02);
|
regs.color_enabled[BG2] = !!(value & 0x02);
|
||||||
regs.color_enabled[BG1] = bool(value & 0x01);
|
regs.color_enabled[BG1] = !!(value & 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
//COLDATA
|
//COLDATA
|
||||||
|
@ -506,11 +492,11 @@ void bPPU::mmio_w2132(uint8 value) {
|
||||||
|
|
||||||
//SETINI
|
//SETINI
|
||||||
void bPPU::mmio_w2133(uint8 value) {
|
void bPPU::mmio_w2133(uint8 value) {
|
||||||
regs.mode7_extbg = bool(value & 0x40);
|
regs.mode7_extbg = !!(value & 0x40);
|
||||||
regs.pseudo_hires = bool(value & 0x08);
|
regs.pseudo_hires = !!(value & 0x08);
|
||||||
regs.overscan = bool(value & 0x04);
|
regs.overscan = !!(value & 0x04);
|
||||||
regs.oam_interlace = bool(value & 0x02);
|
regs.oam_interlace = !!(value & 0x02);
|
||||||
regs.interlace = bool(value & 0x01);
|
regs.interlace = !!(value & 0x01);
|
||||||
|
|
||||||
r_cpu->set_overscan(regs.overscan);
|
r_cpu->set_overscan(regs.overscan);
|
||||||
}
|
}
|
||||||
|
@ -550,16 +536,10 @@ uint8 bPPU::mmio_r2137() {
|
||||||
//OAMDATAREAD
|
//OAMDATAREAD
|
||||||
uint8 bPPU::mmio_r2138() {
|
uint8 bPPU::mmio_r2138() {
|
||||||
regs.ppu1_mdr = oam_read(regs.oam_addr);
|
regs.ppu1_mdr = oam_read(regs.oam_addr);
|
||||||
|
|
||||||
regs.oam_addr++;
|
regs.oam_addr++;
|
||||||
regs.oam_addr &= 0x03ff;
|
regs.oam_addr &= 0x03ff;
|
||||||
|
regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127;
|
||||||
if(!(regs.oam_addr & 1)) {
|
|
||||||
if(regs.oam_priority == false) {
|
|
||||||
regs.oam_firstsprite = 0;
|
|
||||||
} else {
|
|
||||||
regs.oam_firstsprite = (regs.oam_addr >> 2) & 127;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return regs.ppu1_mdr;
|
return regs.ppu1_mdr;
|
||||||
}
|
}
|
||||||
|
@ -681,18 +661,18 @@ uint8 bPPU::mmio_read(uint16 addr) {
|
||||||
case 0x2129:
|
case 0x2129:
|
||||||
case 0x212a:
|
case 0x212a:
|
||||||
return regs.ppu1_mdr;
|
return regs.ppu1_mdr;
|
||||||
case 0x2134:return mmio_r2134(); //MPYL
|
case 0x2134: return mmio_r2134(); //MPYL
|
||||||
case 0x2135:return mmio_r2135(); //MPYM
|
case 0x2135: return mmio_r2135(); //MPYM
|
||||||
case 0x2136:return mmio_r2136(); //MPYH
|
case 0x2136: return mmio_r2136(); //MPYH
|
||||||
case 0x2137:return mmio_r2137(); //SLHV
|
case 0x2137: return mmio_r2137(); //SLHV
|
||||||
case 0x2138:return mmio_r2138(); //OAMDATAREAD
|
case 0x2138: return mmio_r2138(); //OAMDATAREAD
|
||||||
case 0x2139:return mmio_r2139(); //VMDATALREAD
|
case 0x2139: return mmio_r2139(); //VMDATALREAD
|
||||||
case 0x213a:return mmio_r213a(); //VMDATAHREAD
|
case 0x213a: return mmio_r213a(); //VMDATAHREAD
|
||||||
case 0x213b:return mmio_r213b(); //CGDATAREAD
|
case 0x213b: return mmio_r213b(); //CGDATAREAD
|
||||||
case 0x213c:return mmio_r213c(); //OPHCT
|
case 0x213c: return mmio_r213c(); //OPHCT
|
||||||
case 0x213d:return mmio_r213d(); //OPVCT
|
case 0x213d: return mmio_r213d(); //OPVCT
|
||||||
case 0x213e:return mmio_r213e(); //STAT77
|
case 0x213e: return mmio_r213e(); //STAT77
|
||||||
case 0x213f:return mmio_r213f(); //STAT78
|
case 0x213f: return mmio_r213f(); //STAT78
|
||||||
}
|
}
|
||||||
|
|
||||||
//return 0x00;
|
//return 0x00;
|
||||||
|
@ -701,57 +681,57 @@ uint8 bPPU::mmio_read(uint16 addr) {
|
||||||
|
|
||||||
void bPPU::mmio_write(uint16 addr, uint8 data) {
|
void bPPU::mmio_write(uint16 addr, uint8 data) {
|
||||||
switch(addr) {
|
switch(addr) {
|
||||||
case 0x2100:mmio_w2100(data);return; //INIDISP
|
case 0x2100: mmio_w2100(data); return; //INIDISP
|
||||||
case 0x2101:mmio_w2101(data);return; //OBSEL
|
case 0x2101: mmio_w2101(data); return; //OBSEL
|
||||||
case 0x2102:mmio_w2102(data);return; //OAMADDL
|
case 0x2102: mmio_w2102(data); return; //OAMADDL
|
||||||
case 0x2103:mmio_w2103(data);return; //OAMADDH
|
case 0x2103: mmio_w2103(data); return; //OAMADDH
|
||||||
case 0x2104:mmio_w2104(data);return; //OAMDATA
|
case 0x2104: mmio_w2104(data); return; //OAMDATA
|
||||||
case 0x2105:mmio_w2105(data);return; //BGMODE
|
case 0x2105: mmio_w2105(data); return; //BGMODE
|
||||||
case 0x2106:mmio_w2106(data);return; //MOSAIC
|
case 0x2106: mmio_w2106(data); return; //MOSAIC
|
||||||
case 0x2107:mmio_w2107(data);return; //BG1SC
|
case 0x2107: mmio_w2107(data); return; //BG1SC
|
||||||
case 0x2108:mmio_w2108(data);return; //BG2SC
|
case 0x2108: mmio_w2108(data); return; //BG2SC
|
||||||
case 0x2109:mmio_w2109(data);return; //BG3SC
|
case 0x2109: mmio_w2109(data); return; //BG3SC
|
||||||
case 0x210a:mmio_w210a(data);return; //BG4SC
|
case 0x210a: mmio_w210a(data); return; //BG4SC
|
||||||
case 0x210b:mmio_w210b(data);return; //BG12NBA
|
case 0x210b: mmio_w210b(data); return; //BG12NBA
|
||||||
case 0x210c:mmio_w210c(data);return; //BG34NBA
|
case 0x210c: mmio_w210c(data); return; //BG34NBA
|
||||||
case 0x210d:mmio_w210d(data);return; //BG1HOFS
|
case 0x210d: mmio_w210d(data); return; //BG1HOFS
|
||||||
case 0x210e:mmio_w210e(data);return; //BG1VOFS
|
case 0x210e: mmio_w210e(data); return; //BG1VOFS
|
||||||
case 0x210f:mmio_w210f(data);return; //BG2HOFS
|
case 0x210f: mmio_w210f(data); return; //BG2HOFS
|
||||||
case 0x2110:mmio_w2110(data);return; //BG2VOFS
|
case 0x2110: mmio_w2110(data); return; //BG2VOFS
|
||||||
case 0x2111:mmio_w2111(data);return; //BG3HOFS
|
case 0x2111: mmio_w2111(data); return; //BG3HOFS
|
||||||
case 0x2112:mmio_w2112(data);return; //BG3VOFS
|
case 0x2112: mmio_w2112(data); return; //BG3VOFS
|
||||||
case 0x2113:mmio_w2113(data);return; //BG4HOFS
|
case 0x2113: mmio_w2113(data); return; //BG4HOFS
|
||||||
case 0x2114:mmio_w2114(data);return; //BG4VOFS
|
case 0x2114: mmio_w2114(data); return; //BG4VOFS
|
||||||
case 0x2115:mmio_w2115(data);return; //VMAIN
|
case 0x2115: mmio_w2115(data); return; //VMAIN
|
||||||
case 0x2116:mmio_w2116(data);return; //VMADDL
|
case 0x2116: mmio_w2116(data); return; //VMADDL
|
||||||
case 0x2117:mmio_w2117(data);return; //VMADDH
|
case 0x2117: mmio_w2117(data); return; //VMADDH
|
||||||
case 0x2118:mmio_w2118(data);return; //VMDATAL
|
case 0x2118: mmio_w2118(data); return; //VMDATAL
|
||||||
case 0x2119:mmio_w2119(data);return; //VMDATAH
|
case 0x2119: mmio_w2119(data); return; //VMDATAH
|
||||||
case 0x211a:mmio_w211a(data);return; //M7SEL
|
case 0x211a: mmio_w211a(data); return; //M7SEL
|
||||||
case 0x211b:mmio_w211b(data);return; //M7A
|
case 0x211b: mmio_w211b(data); return; //M7A
|
||||||
case 0x211c:mmio_w211c(data);return; //M7B
|
case 0x211c: mmio_w211c(data); return; //M7B
|
||||||
case 0x211d:mmio_w211d(data);return; //M7C
|
case 0x211d: mmio_w211d(data); return; //M7C
|
||||||
case 0x211e:mmio_w211e(data);return; //M7D
|
case 0x211e: mmio_w211e(data); return; //M7D
|
||||||
case 0x211f:mmio_w211f(data);return; //M7X
|
case 0x211f: mmio_w211f(data); return; //M7X
|
||||||
case 0x2120:mmio_w2120(data);return; //M7Y
|
case 0x2120: mmio_w2120(data); return; //M7Y
|
||||||
case 0x2121:mmio_w2121(data);return; //CGADD
|
case 0x2121: mmio_w2121(data); return; //CGADD
|
||||||
case 0x2122:mmio_w2122(data);return; //CGDATA
|
case 0x2122: mmio_w2122(data); return; //CGDATA
|
||||||
case 0x2123:mmio_w2123(data);return; //W12SEL
|
case 0x2123: mmio_w2123(data); return; //W12SEL
|
||||||
case 0x2124:mmio_w2124(data);return; //W34SEL
|
case 0x2124: mmio_w2124(data); return; //W34SEL
|
||||||
case 0x2125:mmio_w2125(data);return; //WOBJSEL
|
case 0x2125: mmio_w2125(data); return; //WOBJSEL
|
||||||
case 0x2126:mmio_w2126(data);return; //WH0
|
case 0x2126: mmio_w2126(data); return; //WH0
|
||||||
case 0x2127:mmio_w2127(data);return; //WH1
|
case 0x2127: mmio_w2127(data); return; //WH1
|
||||||
case 0x2128:mmio_w2128(data);return; //WH2
|
case 0x2128: mmio_w2128(data); return; //WH2
|
||||||
case 0x2129:mmio_w2129(data);return; //WH3
|
case 0x2129: mmio_w2129(data); return; //WH3
|
||||||
case 0x212a:mmio_w212a(data);return; //WBGLOG
|
case 0x212a: mmio_w212a(data); return; //WBGLOG
|
||||||
case 0x212b:mmio_w212b(data);return; //WOBJLOG
|
case 0x212b: mmio_w212b(data); return; //WOBJLOG
|
||||||
case 0x212c:mmio_w212c(data);return; //TM
|
case 0x212c: mmio_w212c(data); return; //TM
|
||||||
case 0x212d:mmio_w212d(data);return; //TS
|
case 0x212d: mmio_w212d(data); return; //TS
|
||||||
case 0x212e:mmio_w212e(data);return; //TMW
|
case 0x212e: mmio_w212e(data); return; //TMW
|
||||||
case 0x212f:mmio_w212f(data);return; //TSW
|
case 0x212f: mmio_w212f(data); return; //TSW
|
||||||
case 0x2130:mmio_w2130(data);return; //CGWSEL
|
case 0x2130: mmio_w2130(data); return; //CGWSEL
|
||||||
case 0x2131:mmio_w2131(data);return; //CGADDSUB
|
case 0x2131: mmio_w2131(data); return; //CGADDSUB
|
||||||
case 0x2132:mmio_w2132(data);return; //COLDATA
|
case 0x2132: mmio_w2132(data); return; //COLDATA
|
||||||
case 0x2133:mmio_w2133(data);return; //SETINI
|
case 0x2133: mmio_w2133(data); return; //SETINI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,6 @@ uint width = (!hires) ? 256 : 512;
|
||||||
if(hires) {
|
if(hires) {
|
||||||
hscroll <<= 1;
|
hscroll <<= 1;
|
||||||
if(regs.interlace) {
|
if(regs.interlace) {
|
||||||
vscroll <<= 1;
|
|
||||||
y = (y << 1) + line.interlace_field;
|
y = (y << 1) + line.interlace_field;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,10 +13,19 @@ ASFLAGS = -f elf
|
||||||
LIBS = `pkg-config --libs gtk+-2.0` `sdl-config --libs`
|
LIBS = `pkg-config --libs gtk+-2.0` `sdl-config --libs`
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(PLATFORM),x-gcc-sdl)
|
||||||
|
OS = unix
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS = -O3 -fomit-frame-pointer -ffast-math -DPLATFORM_X -DCOMPILER_GCC -DPROCESSOR_X86 -DUI_SDL `sdl-config --cflags`
|
||||||
|
AS = nasm
|
||||||
|
ASFLAGS = -f elf
|
||||||
|
LIBS = `sdl-config --libs`
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(PLATFORM),win-visualc)
|
ifeq ($(PLATFORM),win-visualc)
|
||||||
OS = win
|
OS = win
|
||||||
CC = cl
|
CC = cl
|
||||||
CFLAGS = /nologo /O2 /arch:SSE2 /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_WIN
|
CFLAGS = /nologo /O2 /EHsc /arch:SSE2 /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_WIN
|
||||||
AS = nasm
|
AS = nasm
|
||||||
ASFLAGS = -f win32 -DWIN32
|
ASFLAGS = -f win32 -DWIN32
|
||||||
LIBS = d3d9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib
|
LIBS = d3d9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib
|
||||||
|
@ -25,7 +34,7 @@ endif
|
||||||
ifeq ($(PLATFORM),win-visualc-wip)
|
ifeq ($(PLATFORM),win-visualc-wip)
|
||||||
OS = win
|
OS = win
|
||||||
CC = cl
|
CC = cl
|
||||||
CFLAGS = /nologo /O2 /GL /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_WIN
|
CFLAGS = /nologo /O2 /GL /EHsc /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_WIN
|
||||||
AS = nasm
|
AS = nasm
|
||||||
ASFLAGS = -f win32 -DWIN32
|
ASFLAGS = -f win32 -DWIN32
|
||||||
LIBS = d3d9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib
|
LIBS = d3d9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib
|
||||||
|
@ -35,7 +44,7 @@ endif
|
||||||
ifeq ($(PLATFORM),win-visualc-pgi)
|
ifeq ($(PLATFORM),win-visualc-pgi)
|
||||||
OS = win
|
OS = win
|
||||||
CC = cl
|
CC = cl
|
||||||
CFLAGS = /nologo /O2 /GL /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_WIN
|
CFLAGS = /nologo /O2 /GL /EHsc /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_WIN
|
||||||
AS = nasm
|
AS = nasm
|
||||||
ASFLAGS = -f win32 -DWIN32
|
ASFLAGS = -f win32 -DWIN32
|
||||||
LIBS = d3d9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib
|
LIBS = d3d9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib
|
||||||
|
@ -45,7 +54,7 @@ endif
|
||||||
ifeq ($(PLATFORM),win-visualc-pgo)
|
ifeq ($(PLATFORM),win-visualc-pgo)
|
||||||
OS = win
|
OS = win
|
||||||
CC = cl
|
CC = cl
|
||||||
CFLAGS = /nologo /O2 /GL /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_WIN
|
CFLAGS = /nologo /O2 /GL /EHsc /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_WIN
|
||||||
AS = nasm
|
AS = nasm
|
||||||
ASFLAGS = -f win32 -DWIN32
|
ASFLAGS = -f win32 -DWIN32
|
||||||
LIBS = d3d9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib
|
LIBS = d3d9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib
|
||||||
|
@ -55,7 +64,7 @@ endif
|
||||||
ifeq ($(PLATFORM),win-visualc-sdl)
|
ifeq ($(PLATFORM),win-visualc-sdl)
|
||||||
OS = win
|
OS = win
|
||||||
CC = cl
|
CC = cl
|
||||||
CFLAGS = /nologo /O2 /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_SDL
|
CFLAGS = /nologo /O2 /EHsc /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_SDL
|
||||||
AS = nasm
|
AS = nasm
|
||||||
ASFLAGS = -f win32 -DWIN32
|
ASFLAGS = -f win32 -DWIN32
|
||||||
LIBS = sdlmain.lib sdl.lib dsound.lib
|
LIBS = sdlmain.lib sdl.lib dsound.lib
|
||||||
|
@ -109,10 +118,10 @@ OBJS = main.$(OBJ) \
|
||||||
bdsp.$(OBJ) \
|
bdsp.$(OBJ) \
|
||||||
ppu.$(OBJ) bppu.$(OBJ) \
|
ppu.$(OBJ) bppu.$(OBJ) \
|
||||||
snes.$(OBJ) \
|
snes.$(OBJ) \
|
||||||
srtc.$(OBJ) sdd1.$(OBJ) c4.$(OBJ) dsp1.$(OBJ) dsp2.$(OBJ) obc1.$(OBJ)
|
srtc.$(OBJ) sdd1.$(OBJ) c4.$(OBJ) dsp1.$(OBJ) dsp2.$(OBJ) obc1.$(OBJ) \
|
||||||
#adler32.$(OBJ) compress.$(OBJ) crc32.$(OBJ) deflate.$(OBJ) gzio.$(OBJ) inffast.$(OBJ) \
|
adler32.$(OBJ) compress.$(OBJ) crc32.$(OBJ) deflate.$(OBJ) gzio.$(OBJ) inffast.$(OBJ) \
|
||||||
#inflate.$(OBJ) inftrees.$(OBJ) ioapi.$(OBJ) trees.$(OBJ) unzip.$(OBJ) zip.$(OBJ) zutil.$(OBJ) \
|
inflate.$(OBJ) inftrees.$(OBJ) ioapi.$(OBJ) trees.$(OBJ) unzip.$(OBJ) zip.$(OBJ) zutil.$(OBJ) \
|
||||||
#jma.$(OBJ) jcrc32.$(OBJ) lzmadec.$(OBJ) 7zlzma.$(OBJ) iiostrm.$(OBJ) inbyte.$(OBJ) lzma.$(OBJ) winout.$(OBJ)
|
jma.$(OBJ) jcrc32.$(OBJ) lzmadec.$(OBJ) 7zlzma.$(OBJ) iiostrm.$(OBJ) inbyte.$(OBJ) lzma.$(OBJ) winout.$(OBJ)
|
||||||
|
|
||||||
ifeq ($(OS),win)
|
ifeq ($(OS),win)
|
||||||
ifeq ($(CC),cl)
|
ifeq ($(CC),cl)
|
||||||
|
|
|
@ -1,7 +1,3 @@
|
||||||
#define IDI_APP_ICON 100
|
#define IDI_APP_ICON 100
|
||||||
#define IDB_ABOUT_ART 101
|
|
||||||
#define IDB_CONTROLLER_ART 102
|
|
||||||
|
|
||||||
IDI_APP_ICON ICON DISCARDABLE "../data/bsnes.ico"
|
IDI_APP_ICON ICON DISCARDABLE "../data/bsnes.ico"
|
||||||
IDB_ABOUT_ART BITMAP DISCARDABLE "../data/about.bmp"
|
|
||||||
IDB_CONTROLLER_ART BITMAP DISCARDABLE "../data/snes_controller.bmp"
|
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
@make PLATFORM=win-visualc
|
@make PLATFORM=win-visualc-wip
|
||||||
@move bsnes.exe ../../bsnes.exe>nul
|
@move bsnes.exe ../../bsnes.exe>nul
|
||||||
@pause
|
@pause
|
|
@ -1,3 +1,4 @@
|
||||||
|
#warning "WARNING: GTK+ port input is currently broken! Controls will not work! Please use SDL port instead."
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
#include "bsnes.h"
|
#include "bsnes.h"
|
||||||
|
|
|
@ -6,17 +6,17 @@ void CALLBACK wInputConfigInputTimerProc(HWND hwnd, UINT msg, UINT event, DWORD
|
||||||
bool InputConfigWindow::Event(EventInfo &info) {
|
bool InputConfigWindow::Event(EventInfo &info) {
|
||||||
switch(info.event_id) {
|
switch(info.event_id) {
|
||||||
|
|
||||||
case EVENT_DRAW: {
|
//case EVENT_DRAW: {
|
||||||
PAINTSTRUCT ps;
|
//PAINTSTRUCT ps;
|
||||||
HDC hdc = BeginPaint(hwnd, &ps);
|
//HDC hdc = BeginPaint(hwnd, &ps);
|
||||||
HDC hdcsrc = CreateCompatibleDC(hdc);
|
//HDC hdcsrc = CreateCompatibleDC(hdc);
|
||||||
HBITMAP hbm = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(102));
|
//HBITMAP hbm = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(102));
|
||||||
SelectObject(hdcsrc, hbm);
|
// SelectObject(hdcsrc, hbm);
|
||||||
BitBlt(hdc, 285, 169, 190, 100, hdcsrc, 0, 0, SRCCOPY);
|
// BitBlt(hdc, 285, 169, 190, 100, hdcsrc, 0, 0, SRCCOPY);
|
||||||
DeleteDC(hdcsrc);
|
// DeleteDC(hdcsrc);
|
||||||
DeleteObject(hbm);
|
// DeleteObject(hbm);
|
||||||
EndPaint(hwnd, &ps);
|
// EndPaint(hwnd, &ps);
|
||||||
} break;
|
//} break;
|
||||||
|
|
||||||
case EVENT_INPUTKEYDOWN: {
|
case EVENT_INPUTKEYDOWN: {
|
||||||
if(button_update.active == true) {
|
if(button_update.active == true) {
|
||||||
|
|
|
@ -12,7 +12,7 @@ long height;
|
||||||
height = -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72);
|
height = -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72);
|
||||||
global::fwf = CreateFont(height, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Courier New");
|
global::fwf = CreateFont(height, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Courier New");
|
||||||
height = -MulDiv(9, GetDeviceCaps(hdc, LOGPIXELSY), 72);
|
height = -MulDiv(9, GetDeviceCaps(hdc, LOGPIXELSY), 72);
|
||||||
global::font_about = CreateFont(height, 0, 0, 0, FW_BOLD, 0, 0, 0, 0, 0, 0, 0, 0, "Verdana");
|
global::font_about = CreateFont(height, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Verdana");
|
||||||
height = -MulDiv(14, GetDeviceCaps(hdc, LOGPIXELSY), 72);
|
height = -MulDiv(14, GetDeviceCaps(hdc, LOGPIXELSY), 72);
|
||||||
global::font_header = CreateFont(height, 0, 0, 0, FW_BOLD, 0, 0, 0, 0, 0, 0, 0, 0, "Verdana");
|
global::font_header = CreateFont(height, 0, 0, 0, FW_BOLD, 0, 0, 0, 0, 0, 0, 0, 0, "Verdana");
|
||||||
height = -MulDiv(10, GetDeviceCaps(hdc, LOGPIXELSY), 72);
|
height = -MulDiv(10, GetDeviceCaps(hdc, LOGPIXELSY), 72);
|
||||||
|
@ -25,7 +25,7 @@ long height;
|
||||||
wMain.Center();
|
wMain.Center();
|
||||||
|
|
||||||
wAbout.SetIcon(100);
|
wAbout.SetIcon(100);
|
||||||
wAbout.Create(0, "bsnes_about", "topmost|popup|frame|dragmove", 0, 0, 400, 240, "About bsnes...");
|
wAbout.Create(0, "bsnes_about", "topmost|popup|frame|dragmove", 0, 0, 325, 165, "About bsnes...");
|
||||||
wAbout.Center();
|
wAbout.Center();
|
||||||
|
|
||||||
init_settings();
|
init_settings();
|
||||||
|
|
|
@ -84,7 +84,8 @@ struct {
|
||||||
|
|
||||||
class AboutWindow : public Window {
|
class AboutWindow : public Window {
|
||||||
public:
|
public:
|
||||||
Button Ok;
|
Editbox AboutText;
|
||||||
|
Button Ok;
|
||||||
|
|
||||||
static const char about_text[4096];
|
static const char about_text[4096];
|
||||||
bool Event(EventInfo &info);
|
bool Event(EventInfo &info);
|
||||||
|
|
|
@ -2,10 +2,10 @@ const char AboutWindow::about_text[4096] = ""
|
||||||
"bsnes -- version " BSNES_VERSION "\r\n"
|
"bsnes -- version " BSNES_VERSION "\r\n"
|
||||||
"Author: byuu\r\n"
|
"Author: byuu\r\n"
|
||||||
"Project began: October 14th, 2004\r\n"
|
"Project began: October 14th, 2004\r\n"
|
||||||
"\r\n\r\n\r\n\r\n\r\n"
|
"\r\n\r\n"
|
||||||
"Contributors:\r\n"
|
"Contributors:\r\n"
|
||||||
" anomie, blargg, DMV27, GIGO, kode54, Nach,\r\n"
|
" anomie, blargg, DMV27, GIGO, kode54, Nach,\r\n"
|
||||||
" Overload, Richard Bannister, TRAC, zones\r\n";
|
" Overload, Richard Bannister, TRAC, zones";
|
||||||
|
|
||||||
bool AboutWindow::Event(EventInfo &info) {
|
bool AboutWindow::Event(EventInfo &info) {
|
||||||
switch(info.event_id) {
|
switch(info.event_id) {
|
||||||
|
@ -16,14 +16,16 @@ bool AboutWindow::Event(EventInfo &info) {
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case EVENT_DRAW: {
|
case EVENT_DRAW: {
|
||||||
|
break;
|
||||||
PAINTSTRUCT ps;
|
PAINTSTRUCT ps;
|
||||||
HDC hdc = BeginPaint(hwnd, &ps);
|
HDC hdc = BeginPaint(hwnd, &ps);
|
||||||
HDC hdcsrc = CreateCompatibleDC(hdc);
|
|
||||||
HBITMAP hbm = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(101));
|
//HDC hdcsrc = CreateCompatibleDC(hdc);
|
||||||
SelectObject(hdcsrc, hbm);
|
//HBITMAP hbm = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(101));
|
||||||
BitBlt(hdc, 0, 0, 400, 240, hdcsrc, 0, 0, SRCCOPY);
|
// SelectObject(hdcsrc, hbm);
|
||||||
DeleteDC(hdcsrc);
|
// BitBlt(hdc, 0, 0, 400, 240, hdcsrc, 0, 0, SRCCOPY);
|
||||||
DeleteObject(hbm);
|
// DeleteDC(hdcsrc);
|
||||||
|
// DeleteObject(hbm);
|
||||||
|
|
||||||
SelectObject(hdc, (HGDIOBJ)global::font_about);
|
SelectObject(hdc, (HGDIOBJ)global::font_about);
|
||||||
SetBkMode(hdc, TRANSPARENT);
|
SetBkMode(hdc, TRANSPARENT);
|
||||||
|
@ -56,5 +58,9 @@ bool AboutWindow::Event(EventInfo &info) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AboutWindow::Setup() {
|
void AboutWindow::Setup() {
|
||||||
Ok.Create(this, "visible", 321, 201, 60, 20, "Ok");
|
AboutText.Create(this, "visible|edge|multiline|readonly", 5, 5, 315, 125, about_text);
|
||||||
|
AboutText.SetBackgroundColor(32, 32, 32);
|
||||||
|
AboutText.SetTextColor(255, 255, 255);
|
||||||
|
AboutText.SetFont(global::font_about);
|
||||||
|
Ok.Create(this, "visible", 240, 135, 80, 25, "Ok");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue