mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-02-23 22:52:34 +01:00
byuu says: Changelog: - higan: `Emulator::<Platform::load>()` now returns a struct containing both a path ID and a string option - higan: `Emulator::<Platform::load>()` now takes an optional final argument of string options - fc: added PAL emulation (finally, only took six years) - md: added PAL emulation - md: fixed address parameter to `VDP::Sprite::write()`; fixes missing sprites in Super Street Fighter II - md: emulated HIRQ counter; fixes many games - Super Street Fighter II - status bar - Altered Beast - status bar - Sonic the Hedgehog - Labyrinth Zone - water effect - etc. - ms: added PAL emulation - sfc: added the ability to override the default region auto-detection - sfc: removed "system.region" override setting from `Super Famicom.sys` - tomoko: added options list to game folder load dialog window - tomoko: added the ability to specify game folder load options on the command-line So, basically ... Sega forced a change with the way region detection works. You end up with games that can run on multiple regions, and the content changes accordingly. Bare Knuckle in NTSC-J mode will become Streets of Rage in NTSC-U mode. Some games can even run in both NTSC and PAL mode. In my view, there should be a separate ROM for each region a game was released in, even if the ROM content were identical. But unfortunately that's not how things were done by anyone else. So to support this, the higan load dialog now has a drop-down at the bottom-right, where you can choose the region to load games from. On the SNES, it defaults to "Auto", which will pull the region setting from the manifest, or fall back on NTSC. On the Mega Drive ... unfortunately, I can't auto-detect the region from the ROM header. $1f0 is supposed to contain a string like "JUE", but instead you get games like Maui Mallard that put an "A" there, and other such nonsense. Sega was far more lax than Nintendo with the ROM header validity. So for now at least, you have to manually select your region every time you play a Mega Drive game, thus you have "NTSC-J", "NTSC-U", and "PAL". The same goes for the Master System for the same reason, but there's only "NTSC" and "PAL" here. I'm not sure if games have a way to detect domestic vs international consoles. And for now ... the Famicom is the same as well, with no auto-detection. I'd sincerely hope iNES has a header bit for the region, but I didn't bother with updating icarus to support that yet. The way to pass these parameters on the command-line is to prefix the game path with "option:", so for example: higan "PAL:/path/to/Sonic the Hedgehog (USA, Europe).md" If you don't provide a prefix, it uses the default (NTSC-J, NTSC, or Auto.) Obviously, it's not possible to pass parameters with drag-and-drop, so you will always get the default option in said case.
123 lines
2.4 KiB
C++
123 lines
2.4 KiB
C++
struct PPU : Thread {
|
|
inline auto vlines() const -> uint { return Region::NTSC() ? 262 : 312; }
|
|
|
|
//ppu.cpp
|
|
static auto Enter() -> void;
|
|
auto main() -> void;
|
|
auto step(uint clocks) -> void;
|
|
|
|
auto scanline() -> void;
|
|
auto frame() -> void;
|
|
auto refresh() -> void;
|
|
|
|
auto power() -> void;
|
|
|
|
//memory.cpp
|
|
auto readCIRAM(uint11 addr) -> uint8;
|
|
auto writeCIRAM(uint11 addr, uint8 data) -> void;
|
|
|
|
auto readCGRAM(uint5 addr) -> uint8;
|
|
auto writeCGRAM(uint5 addr, uint8 data) -> void;
|
|
|
|
auto readIO(uint16 addr) -> uint8;
|
|
auto writeIO(uint16 addr, uint8 data) -> void;
|
|
|
|
//render.cpp
|
|
auto enable() const -> bool;
|
|
auto loadCHR(uint16 addr) -> uint8;
|
|
|
|
auto renderPixel() -> void;
|
|
auto renderSprite() -> void;
|
|
auto renderScanline() -> void;
|
|
|
|
//serialization.cpp
|
|
auto serialize(serializer&) -> void;
|
|
|
|
struct IO {
|
|
//internal
|
|
uint8 mdr;
|
|
|
|
uint1 field;
|
|
uint lx;
|
|
uint ly;
|
|
|
|
uint8 busData;
|
|
|
|
union {
|
|
uint value;
|
|
NaturalBitField<uint, 0, 4> tileX;
|
|
NaturalBitField<uint, 5, 9> tileY;
|
|
NaturalBitField<uint,10,11> nametable;
|
|
NaturalBitField<uint,10,10> nametableX;
|
|
NaturalBitField<uint,11,11> nametableY;
|
|
NaturalBitField<uint,12,14> fineY;
|
|
NaturalBitField<uint, 0,14> address;
|
|
NaturalBitField<uint, 0, 7> addressLo;
|
|
NaturalBitField<uint, 8,14> addressHi;
|
|
NaturalBitField<uint,15,15> latch;
|
|
NaturalBitField<uint,16,18> fineX;
|
|
} v, t;
|
|
|
|
bool nmiHold;
|
|
bool nmiFlag;
|
|
|
|
//$2000
|
|
uint vramIncrement;
|
|
uint spriteAddress;
|
|
uint bgAddress;
|
|
uint spriteHeight;
|
|
bool masterSelect;
|
|
bool nmiEnable;
|
|
|
|
//$2001
|
|
bool grayscale;
|
|
bool bgEdgeEnable;
|
|
bool spriteEdgeEnable;
|
|
bool bgEnable;
|
|
bool spriteEnable;
|
|
uint3 emphasis;
|
|
|
|
//$2002
|
|
bool spriteOverflow;
|
|
bool spriteZeroHit;
|
|
|
|
//$2003
|
|
uint8 oamAddress;
|
|
} io;
|
|
|
|
struct OAM {
|
|
//serialization.cpp
|
|
auto serialize(serializer&) -> void;
|
|
|
|
uint8 id = 64;
|
|
uint8 y = 0xff;
|
|
uint8 tile = 0xff;
|
|
uint8 attr = 0xff;
|
|
uint8 x = 0xff;
|
|
|
|
uint8 tiledataLo = 0;
|
|
uint8 tiledataHi = 0;
|
|
};
|
|
|
|
struct Latches {
|
|
uint16 nametable;
|
|
uint16 attribute;
|
|
uint16 tiledataLo;
|
|
uint16 tiledataHi;
|
|
|
|
uint oamIterator;
|
|
uint oamCounter;
|
|
|
|
OAM oam[8]; //primary
|
|
OAM soam[8]; //secondary
|
|
} latch;
|
|
|
|
uint8 ciram[2048];
|
|
uint8 cgram[32];
|
|
uint8 oam[256];
|
|
|
|
uint32 buffer[256 * 262];
|
|
};
|
|
|
|
extern PPU ppu;
|