mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-06-03 10:15:01 +02:00
byuu says: Added MBC1 emulation, although battery RAM doesn't save or load to disk yet. Made up a fake MBC0 which is really just saying 'no MBC', for consistent handling of all MBCs. Added bumpers to stop ROM/RAM out of bounds accesses. Added STAT interrupts for LY coincidence, Vblank and Hblank (not for OAM access yet, I don't know the timings.) Fixed timer interrupt [Jonas Quinn] Made all interrupts call a CPU function instead of just setting a flag for better control (to allow below addition.) Added HALT and STOP emulation, the latter permanently locks the Game Boy for now. The former breaks on interrupts. Rewrote all the rendering code to suck 50% less, though it's still absolutely miserable and scanline-based. Added pixel-level horizontal scrolling to BGs. Fixed OBJ rendering error that was making them render upside down (I was flipping to compensate before.) Added OBJ 8x16 mode. Added OBJ priority support. Added window (but it's broken to all hell on Mega Man II.)
73 lines
1.1 KiB
C++
Executable File
73 lines
1.1 KiB
C++
Executable File
struct LCD : Processor, MMIO {
|
|
#include "mmio/mmio.hpp"
|
|
|
|
struct Status {
|
|
unsigned lx;
|
|
|
|
//$ff40 LCDC
|
|
bool display_enable;
|
|
bool window_tilemap_select;
|
|
bool window_display_enable;
|
|
bool bg_tiledata_select;
|
|
bool bg_tilemap_select;
|
|
bool obj_size;
|
|
bool obj_enable;
|
|
bool bg_enable;
|
|
|
|
//$ff41 STAT
|
|
bool interrupt_lyc;
|
|
bool interrupt_oam;
|
|
bool interrupt_vblank;
|
|
bool interrupt_hblank;
|
|
|
|
//$ff42 SCY
|
|
uint8 scy;
|
|
|
|
//$ff43 SCX
|
|
uint8 scx;
|
|
|
|
//$ff44 LY
|
|
uint8 ly;
|
|
|
|
//$ff45 LYC
|
|
uint8 lyc;
|
|
|
|
//$ff47 BGP
|
|
uint8 bgp[4];
|
|
|
|
//$ff48 OBP0
|
|
//$ff49 OBP1
|
|
uint8 obp[2][4];
|
|
|
|
//$ff4a WY
|
|
uint8 wy;
|
|
|
|
//$ff4b WX
|
|
uint8 wx;
|
|
} status;
|
|
|
|
uint8 screen[160 * 144];
|
|
uint8 vram[8192];
|
|
uint8 oam[160];
|
|
|
|
struct Line {
|
|
enum class Source : unsigned { None, BG, OBJ, Window } source;
|
|
uint8 output;
|
|
} line[160];
|
|
|
|
static void Main();
|
|
void main();
|
|
void add_clocks(unsigned clocks);
|
|
void scanline();
|
|
void frame();
|
|
void render();
|
|
void render_bg();
|
|
void render_window();
|
|
void render_obj();
|
|
|
|
void power();
|
|
void reset();
|
|
};
|
|
|
|
extern LCD lcd;
|