Merge pull request #1374 from GiuseppeGorgoglione/master

gba_lcd: one bug fix and code refactoring
This commit is contained in:
R. Belmont 2016-09-08 14:13:27 -04:00 committed by GitHub
commit 44e4ed61a7
2 changed files with 1362 additions and 1640 deletions

File diff suppressed because it is too large Load Diff

View File

@ -136,20 +136,101 @@ protected:
virtual machine_config_constructor device_mconfig_additions() const override;
private:
UINT32 bg_screen_base(UINT32 bgxcnt);
UINT32 bg_char_base(UINT32 bgxcnt);
struct internal_reg
{
INT32 status;
bool update;
};
internal_reg m_bg2x, m_bg2y, m_bg3x, m_bg3y;
UINT8 bg_video_mode();
enum class dispcnt : UINT16
{
alt_frame_sel = 0x0010,
vram_map_1d = 0x0040,
forced_blank = 0x0080,
bg0_en = 0x0100,
bg1_en = 0x0200,
bg2_en = 0x0400,
bg3_en = 0x0800,
obj_en = 0x1000,
win0_en = 0x2000,
win1_en = 0x4000,
obj_win_en = 0x8000
};
bool is_set(dispcnt flag);
enum class dispstat : UINT16
{
vblank = 0x0001,
hblank = 0x0002,
vcount = 0x0004,
vblank_irq_en = 0x0008,
hblank_irq_en = 0x0010,
vcount_irq_en = 0x0020
};
void set(dispstat flag);
void clear(dispstat flag);
bool is_set(dispstat flag);
enum class bgcnt : UINT16
{
mosaic_en = 0x0040,
palette_256 = 0x0080,
wraparound_en = 0x2000
};
bool is_set(UINT16 bgxcnt, bgcnt flag);
UINT8 bg_priority(UINT16 bgxcnt);
UINT32 bg_char_base(UINT16 bgxcnt);
UINT32 bg_screen_base(UINT16 bgxcnt);
void bg_screen_size(UINT16 bgxcnt, bool text, int &width, int &height);
inline void update_mask(UINT8* mask, int mode, int submode, UINT32* obj_win, UINT8 inwin0, UINT8 inwin1, UINT8 in0_mask, UINT8 in1_mask, UINT8 out_mask);
void draw_modes(int mode, int submode, int y, UINT32* line0, UINT32* line1, UINT32* line2, UINT32* line3, UINT32* lineOBJ, UINT32* lineOBJWin, UINT32* lineMix, int bpp);
void draw_roz_bitmap_scanline(UINT32 *scanline, int ypos, UINT32 enablemask, UINT32 ctrl, INT32 X, INT32 Y, INT32 PA, INT32 PB, INT32 PC, INT32 PD, INT32 *currentx, INT32 *currenty, int changed, int depth);
void draw_roz_scanline(UINT32 *scanline, int ypos, UINT32 enablemask, UINT32 ctrl, INT32 X, INT32 Y, INT32 PA, INT32 PB, INT32 PC, INT32 PD, INT32 *currentx, INT32 *currenty, int changed);
void draw_bg_scanline(UINT32 *scanline, int ypos, UINT32 enablemask, UINT32 ctrl, UINT32 hofs, UINT32 vofs);
void draw_gba_oam_window(UINT32 *scanline, int y);
void draw_gba_oam(UINT32 *scanline, int y);
inline int is_in_window(int x, int window);
enum class size_type
{
bg_h = 0,
bg_v,
obj_h,
obj_v
};
UINT16 mosaic_size(size_type type);
enum class sfx : UINT16
{
none = 0x0000,
alpha = 0x0040,
lighten = 0x0080,
darken = 0x00c0
};
sfx color_sfx();
enum class target
{
first = 0,
second
};
UINT8 color_sfx_target(target id);
UINT16 tile_number(UINT16 vram_data) { return vram_data & 0x03ff; }
bool tile_hflip(UINT16 vram_data) { return vram_data & 0x0400; }
bool tile_vflip(UINT16 vram_data) { return vram_data & 0x0800; }
void update_mask(UINT8 *mask, int y);
void draw_roz_bitmap_scanline(UINT32 *scanline, int ypos, dispcnt bg_enable, UINT32 ctrl, INT32 X, INT32 Y, INT32 PA, INT32 PB, INT32 PC, INT32 PD, internal_reg &currentx, internal_reg &currenty, int depth);
void draw_roz_scanline(UINT32 *scanline, int ypos, dispcnt bg_enable, UINT32 ctrl, INT32 X, INT32 Y, INT32 PA, INT32 PB, INT32 PC, INT32 PD, internal_reg &currentx, internal_reg &currenty);
void draw_bg_scanline(UINT32 *scanline, int ypos, dispcnt bg_enable, UINT32 ctrl, UINT32 hofs, UINT32 vofs);
void draw_oam_window(UINT32 *scanline, int y);
void draw_oam(UINT32 *scanline, int y);
void draw_scanline(int y);
bool is_in_window_h(int x, int window);
bool is_in_window_v(int y, int window);
UINT32 alpha_blend(UINT32 color0, UINT32 color1);
UINT32 increase_brightness(UINT32 color);
UINT32 decrease_brightness(UINT32 color);
devcb_write_line m_int_hblank_cb; /* H-Blank interrupt callback function */
devcb_write_line m_int_vblank_cb; /* V-Blank interrupt callback function */
devcb_write_line m_int_vcount_cb; /* V-Counter Match interrupt callback function */
@ -164,16 +245,10 @@ private:
bitmap_ind16 m_bitmap;
UINT8 m_windowOn;
UINT8 m_fxOn;
UINT8 m_gfxBG2Changed;
UINT8 m_gfxBG3Changed;
INT32 m_gfxBG2X;
INT32 m_gfxBG2Y;
INT32 m_gfxBG3X;
INT32 m_gfxBG3Y;
UINT32 m_scanline[6][240];
UINT32 m_xferscan[7][240+2048];
// constants
static constexpr UINT32 TRANSPARENT_PIXEL = 0x80000000;
};
#endif /* GBA_LCD_H_ */