State-ized VDP1

This commit is contained in:
Angelo Salese 2011-05-22 16:00:03 +00:00
parent e4ccc74ae3
commit 982684a6cb
4 changed files with 371 additions and 361 deletions

View File

@ -424,7 +424,8 @@ static void system_reset(address_space *space)
memset(state->m_vdp2_regs,0x00,0x040000);
memset(state->m_vdp2_vram,0x00,0x100000);
memset(state->m_vdp2_cram,0x00,0x080000);
//vdp1
memset(state->m_vdp1_vram,0x00,0x100000);
//A-Bus
/*Order is surely wrong but whatever...*/
}
@ -1873,13 +1874,9 @@ static ADDRESS_MAP_START( saturn_mem, AS_PROGRAM, 32 )
AM_RANGE(0x05a00000, 0x05a7ffff) AM_READWRITE16(saturn_soundram_r, saturn_soundram_w,0xffffffff)
AM_RANGE(0x05b00000, 0x05b00fff) AM_DEVREADWRITE16("scsp", scsp_r, scsp_w, 0xffffffff)
/* VDP1 */
/*0x05c00000-0x05c7ffff VRAM*/
/*0x05c80000-0x05c9ffff Frame Buffer 0*/
/*0x05ca0000-0x05cbffff Frame Buffer 1*/
/*0x05d00000-0x05d7ffff VDP1 Regs */
AM_RANGE(0x05c00000, 0x05c7ffff) AM_READWRITE(stv_vdp1_vram_r, stv_vdp1_vram_w)
AM_RANGE(0x05c80000, 0x05cbffff) AM_READWRITE(stv_vdp1_framebuffer0_r, stv_vdp1_framebuffer0_w)
AM_RANGE(0x05d00000, 0x05d0001f) AM_READWRITE(stv_vdp1_regs_r, stv_vdp1_regs_w)
AM_RANGE(0x05c00000, 0x05c7ffff) AM_READWRITE(saturn_vdp1_vram_r, saturn_vdp1_vram_w)
AM_RANGE(0x05c80000, 0x05cbffff) AM_READWRITE(saturn_vdp1_framebuffer0_r, saturn_vdp1_framebuffer0_w)
AM_RANGE(0x05d00000, 0x05d0001f) AM_READWRITE(saturn_vdp1_regs_r, saturn_vdp1_regs_w)
AM_RANGE(0x05e00000, 0x05efffff) AM_READWRITE(saturn_vdp2_vram_r, saturn_vdp2_vram_w)
AM_RANGE(0x05f00000, 0x05f7ffff) AM_READWRITE(saturn_vdp2_cram_r, saturn_vdp2_cram_w)
AM_RANGE(0x05f80000, 0x05fbffff) AM_READWRITE(saturn_vdp2_regs_r, saturn_vdp2_regs_w)
@ -1903,9 +1900,9 @@ static ADDRESS_MAP_START( stv_mem, AS_PROGRAM, 32 )
AM_RANGE(0x05a00000, 0x05afffff) AM_READWRITE16(saturn_soundram_r, saturn_soundram_w,0xffffffff)
AM_RANGE(0x05b00000, 0x05b00fff) AM_DEVREADWRITE16("scsp", scsp_r, scsp_w, 0xffffffff)
/* VDP1 */
AM_RANGE(0x05c00000, 0x05c7ffff) AM_READWRITE(stv_vdp1_vram_r, stv_vdp1_vram_w)
AM_RANGE(0x05c80000, 0x05cbffff) AM_READWRITE(stv_vdp1_framebuffer0_r, stv_vdp1_framebuffer0_w)
AM_RANGE(0x05d00000, 0x05d0001f) AM_READWRITE(stv_vdp1_regs_r, stv_vdp1_regs_w)
AM_RANGE(0x05c00000, 0x05c7ffff) AM_READWRITE(saturn_vdp1_vram_r, saturn_vdp1_vram_w)
AM_RANGE(0x05c80000, 0x05cbffff) AM_READWRITE(saturn_vdp1_framebuffer0_r, saturn_vdp1_framebuffer0_w)
AM_RANGE(0x05d00000, 0x05d0001f) AM_READWRITE(saturn_vdp1_regs_r, saturn_vdp1_regs_w)
AM_RANGE(0x05e00000, 0x05efffff) AM_READWRITE(saturn_vdp2_vram_r, saturn_vdp2_vram_w)
AM_RANGE(0x05f00000, 0x05f7ffff) AM_READWRITE(saturn_vdp2_cram_r, saturn_vdp2_cram_w)
AM_RANGE(0x05f80000, 0x05fbffff) AM_READWRITE(saturn_vdp2_regs_r, saturn_vdp2_regs_w)
@ -2594,8 +2591,6 @@ static MACHINE_START( stv )
state_save_register_global_pointer(machine, state->m_smpc_ram, 0x80);
state_save_register_global_pointer(machine, state->m_scu_regs, 0x100/4);
state_save_register_global_pointer(machine, state->m_scsp_regs, 0x1000/2);
// state_save_register_global(machine, stv_vblank);
// state_save_register_global(machine, stv_hblank);
state_save_register_global(machine, state->m_NMI_reset);
state_save_register_global(machine, state->m_en_68k);
state_save_register_global(machine, timer_0);
@ -2636,8 +2631,6 @@ static MACHINE_START( saturn )
state_save_register_global_pointer(machine, state->m_smpc_ram, 0x80);
state_save_register_global_pointer(machine, state->m_scu_regs, 0x100/4);
state_save_register_global_pointer(machine, state->m_scsp_regs, 0x1000/2);
state_save_register_global(machine, stv_vblank);
state_save_register_global(machine, stv_hblank);
state_save_register_global(machine, state->m_NMI_reset);
state_save_register_global(machine, state->m_en_68k);
state_save_register_global(machine, timer_0);

View File

@ -16,6 +16,9 @@ public:
UINT32 *m_vdp2_regs;
UINT32 *m_vdp2_vram;
UINT32 *m_vdp2_cram;
UINT32 *m_vdp1_vram;
UINT32 *m_vdp1_regs;
UINT8 *m_vdp1_gfx_decode;
UINT8 m_NMI_reset;
UINT8 m_en_68k;
@ -32,6 +35,26 @@ public:
attotime m_minit_boost_timeslice;
attotime m_sinit_boost_timeslice;
struct {
UINT16 **framebuffer_display_lines;
int framebuffer_mode;
int framebuffer_double_interlace;
int fbcr_accessed;
int framebuffer_width;
int framebuffer_height;
int framebuffer_current_display;
int framebuffer_current_draw;
int framebuffer_clear_on_next_frame;
rectangle system_cliprect;
rectangle user_cliprect;
UINT16 *framebuffer[2];
UINT16 **framebuffer_draw_lines;
int local_x;
int local_y;
}m_vdp1;
/* ST-V specific */
UINT8 m_stv_multi_bank;
UINT8 m_prev_bankswitch;
@ -94,7 +117,6 @@ DRIVER_INIT(nameclv3);
/*----------- defined in video/stvvdp1.c -----------*/
extern UINT32* stv_vdp1_vram;
extern UINT16 **stv_framebuffer_display_lines;
extern int stv_framebuffer_double_interlace;
extern int stv_framebuffer_mode;
@ -103,29 +125,26 @@ extern UINT8* stv_vdp1_gfx_decode;
int stv_vdp1_start ( running_machine &machine );
void video_update_vdp1(running_machine &machine);
READ32_HANDLER( stv_vdp1_regs_r );
WRITE32_HANDLER( stv_vdp1_regs_w );
READ32_HANDLER ( stv_vdp1_vram_r );
WRITE32_HANDLER ( stv_vdp1_vram_w );
READ32_HANDLER ( saturn_vdp1_regs_r );
READ32_HANDLER ( saturn_vdp1_vram_r );
READ32_HANDLER ( saturn_vdp1_framebuffer0_r );
WRITE32_HANDLER ( stv_vdp1_framebuffer0_w );
READ32_HANDLER ( stv_vdp1_framebuffer0_r );
WRITE32_HANDLER ( saturn_vdp1_regs_w );
WRITE32_HANDLER ( saturn_vdp1_vram_w );
WRITE32_HANDLER ( saturn_vdp1_framebuffer0_w );
/*----------- defined in video/stvvdp2.c -----------*/
extern int stv_vblank,stv_hblank;
UINT8 stv_get_vblank(running_machine &machine);
WRITE32_HANDLER ( saturn_vdp2_vram_w );
READ32_HANDLER ( saturn_vdp2_vram_r );
WRITE32_HANDLER ( saturn_vdp2_cram_w );
READ32_HANDLER ( saturn_vdp2_cram_r );
WRITE32_HANDLER ( saturn_vdp2_regs_w );
READ32_HANDLER ( saturn_vdp2_regs_r );
WRITE32_HANDLER ( saturn_vdp2_vram_w );
WRITE32_HANDLER ( saturn_vdp2_cram_w );
WRITE32_HANDLER ( saturn_vdp2_regs_w );
VIDEO_START ( stv_vdp2 );
SCREEN_UPDATE( stv_vdp2 );

File diff suppressed because it is too large Load Diff

View File

@ -108,8 +108,6 @@ In other words,the first three types uses the offset and not the color allocated
static UINT8* stv_vdp2_gfx_decode;
static int stv_vdp2_render_rbg0;
int stv_hblank,stv_vblank;
static int stv_odd;
static int horz_res,vert_res;
@ -5189,6 +5187,7 @@ READ32_HANDLER ( saturn_vdp2_regs_r )
{
case 0x4/4:
{
int stv_hblank,stv_vblank,stv_odd;
/*Screen Status Register*/
stv_vblank = stv_get_vblank(space->machine());
stv_hblank = get_hblank(space->machine());
@ -5476,6 +5475,7 @@ static int stv_vdp2_start (running_machine &machine)
/* maybe we should move this to video/stv.c */
VIDEO_START( stv_vdp2 )
{
saturn_state *state = machine.driver_data<saturn_state>();
stv_vdp2_roz_bitmap[0] = stv_vdp2_roz_bitmap[1] = NULL;
stv_vdp2_start(machine);
stv_vdp1_start(machine);
@ -5486,10 +5486,10 @@ VIDEO_START( stv_vdp2 )
gfx_element_set_source(machine.gfx[1], stv_vdp2_gfx_decode);
gfx_element_set_source(machine.gfx[2], stv_vdp2_gfx_decode);
gfx_element_set_source(machine.gfx[3], stv_vdp2_gfx_decode);
gfx_element_set_source(machine.gfx[4], stv_vdp1_gfx_decode);
gfx_element_set_source(machine.gfx[5], stv_vdp1_gfx_decode);
gfx_element_set_source(machine.gfx[6], stv_vdp1_gfx_decode);
gfx_element_set_source(machine.gfx[7], stv_vdp1_gfx_decode);
gfx_element_set_source(machine.gfx[4], state->m_vdp1_gfx_decode);
gfx_element_set_source(machine.gfx[5], state->m_vdp1_gfx_decode);
gfx_element_set_source(machine.gfx[6], state->m_vdp1_gfx_decode);
gfx_element_set_source(machine.gfx[7], state->m_vdp1_gfx_decode);
}
static void stv_vdp2_dynamic_res_change(running_machine &machine)
@ -5931,14 +5931,14 @@ static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const recta
}
/* framebuffer interlace */
if ( (STV_VDP2_LSMD == 2 || STV_VDP2_LSMD == 3) && stv_framebuffer_double_interlace == 0 )
if ( (STV_VDP2_LSMD == 2 || STV_VDP2_LSMD == 3) && state->m_vdp1.framebuffer_double_interlace == 0 )
interlace_framebuffer = 1;
else
interlace_framebuffer = 0;
/*Guess:Some games needs that the horizontal sprite size to be doubled
(TODO: understand the proper settings,it might not work like this)*/
if(STV_VDP2_LSMD == 3 && /*((STV_VDP2_HRES & 3) != 3) &&*/ (!(stv_framebuffer_mode & 1)))
if(STV_VDP2_LSMD == 3 && /*((STV_VDP2_HRES & 3) != 3) &&*/ (!(state->m_vdp1.framebuffer_mode & 1)))
double_x = 1;
else
double_x = 0;
@ -5967,7 +5967,7 @@ static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const recta
if (stv_sprite_priorities_in_fb_line[y][pri] == 0)
continue;
framebuffer_line = stv_framebuffer_display_lines[y];
framebuffer_line = state->m_vdp1.framebuffer_display_lines[y];
bitmap_line = BITMAP_ADDR16(bitmap, y, 0);
for ( x = mycliprect.min_x; x <= mycliprect.max_x; x++ )
@ -6039,7 +6039,7 @@ static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const recta
if (stv_sprite_priorities_in_fb_line[y][pri] == 0)
continue;
framebuffer_line = stv_framebuffer_display_lines[y];
framebuffer_line = state->m_vdp1.framebuffer_display_lines[y];
bitmap_line = BITMAP_ADDR16(bitmap, y, 0);
for ( x = mycliprect.min_x; x <= mycliprect.max_x; x++ )
@ -6141,7 +6141,7 @@ static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const recta
if (stv_sprite_priorities_in_fb_line[y][pri] == 0)
continue;
framebuffer_line = stv_framebuffer_display_lines[y];
framebuffer_line = state->m_vdp1.framebuffer_display_lines[y];
if ( interlace_framebuffer == 0 )
{
bitmap_line = BITMAP_ADDR16(bitmap, y, 0);