mirror of
https://github.com/holub/mame
synced 2025-04-24 09:20:02 +03:00
killed off the ancient vdp implementation so we're all using the current one now, also made c2 manage it's own palette instead of having the vdp do it for it, might need a bit of tweaking but it works. From Haze (nw)
This commit is contained in:
parent
85aa24b036
commit
74a324d632
@ -88,6 +88,8 @@
|
||||
#define LOG_PALETTE 0
|
||||
#define LOG_IOCHIP 0
|
||||
|
||||
int segac2_bg_pal_lookup[4];
|
||||
int segac2_sp_pal_lookup[4];
|
||||
|
||||
static void recompute_palette_tables( running_machine &machine );
|
||||
|
||||
@ -113,12 +115,20 @@ static MACHINE_START( segac2 )
|
||||
static MACHINE_RESET( segac2 )
|
||||
{
|
||||
segac2_state *state = machine.driver_data<segac2_state>();
|
||||
megadriv_framerate = 60;
|
||||
// megadriv_framerate = 60;
|
||||
|
||||
|
||||
// megadriv_scanline_timer = machine.device<timer_device>("md_scan_timer");
|
||||
// megadriv_scanline_timer->adjust(attotime::zero);
|
||||
segac2_bg_pal_lookup[0] = 0x00;
|
||||
segac2_bg_pal_lookup[1] = 0x10;
|
||||
segac2_bg_pal_lookup[2] = 0x20;
|
||||
segac2_bg_pal_lookup[3] = 0x30;
|
||||
|
||||
segac2_sp_pal_lookup[0] = 0x00;
|
||||
segac2_sp_pal_lookup[1] = 0x10;
|
||||
segac2_sp_pal_lookup[2] = 0x20;
|
||||
segac2_sp_pal_lookup[3] = 0x30;
|
||||
|
||||
megadriv_reset_vdp(machine);
|
||||
|
||||
@ -226,19 +236,19 @@ static WRITE16_HANDLER( palette_w )
|
||||
/* set the color */
|
||||
palette_set_color_rgb(space->machine(), offset, pal5bit(r), pal5bit(g), pal5bit(b));
|
||||
|
||||
megadrive_vdp_palette_lookup[offset] = (b) | (g << 5) | (r << 10);
|
||||
megadrive_vdp_palette_lookup_sprite[offset] = (b) | (g << 5) | (r << 10);
|
||||
// megadrive_vdp_palette_lookup[offset] = (b) | (g << 5) | (r << 10);
|
||||
// megadrive_vdp_palette_lookup_sprite[offset] = (b) | (g << 5) | (r << 10);
|
||||
|
||||
tmpr = r >> 1;
|
||||
tmpg = g >> 1;
|
||||
tmpb = b >> 1;
|
||||
megadrive_vdp_palette_lookup_shadow[offset] = (tmpb) | (tmpg << 5) | (tmpr << 10);
|
||||
palette_set_color_rgb(space->machine(), offset + 0x800, pal5bit(tmpr), pal5bit(tmpg), pal5bit(tmpb));
|
||||
|
||||
// how is it calculated on c2?
|
||||
tmpr = tmpr | 0x10;
|
||||
tmpg = tmpg | 0x10;
|
||||
tmpb = tmpb | 0x10;
|
||||
megadrive_vdp_palette_lookup_highlight[offset] = (tmpb) | (tmpg << 5) | (tmpr << 10);
|
||||
palette_set_color_rgb(space->machine(), offset + 0x1000, pal5bit(tmpr), pal5bit(tmpg), pal5bit(tmpb));
|
||||
}
|
||||
|
||||
|
||||
@ -1261,27 +1271,74 @@ static const ym3438_interface ym3438_intf =
|
||||
static VIDEO_START(segac2_new)
|
||||
{
|
||||
VIDEO_START_CALL(megadriv);
|
||||
|
||||
megadrive_vdp_palette_lookup = auto_alloc_array(machine, UINT16, 0x1000/2);
|
||||
megadrive_vdp_palette_lookup_sprite = auto_alloc_array(machine, UINT16, 0x1000/2);
|
||||
megadrive_vdp_palette_lookup_shadow = auto_alloc_array(machine, UINT16, 0x1000/2);
|
||||
megadrive_vdp_palette_lookup_highlight = auto_alloc_array(machine, UINT16, 0x1000/2);
|
||||
}
|
||||
|
||||
// C2 doesn't use the internal VDP CRAM, instead it uses the digital output of the chip
|
||||
// and applies it's own external colour circuity
|
||||
static SCREEN_UPDATE_RGB32(segac2_new)
|
||||
{
|
||||
const pen_t *paldata = screen.machine().pens;
|
||||
segac2_state *state = screen.machine().driver_data<segac2_state>();
|
||||
if (!state->m_segac2_enable_display)
|
||||
{
|
||||
bitmap.fill(get_black_pen(screen.machine()));
|
||||
bitmap.fill(get_black_pen(screen.machine()), cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
||||
SCREEN_UPDATE32_CALL(megadriv);
|
||||
sega_genesis_vdp_device *vdp = state->m_vdp;
|
||||
|
||||
/* Copy our screen buffer here */
|
||||
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
|
||||
{
|
||||
UINT32* desty = &bitmap.pix32(y, 0);
|
||||
UINT16* srcy;
|
||||
|
||||
srcy = vdp->m_render_line_raw;
|
||||
|
||||
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
|
||||
{
|
||||
UINT16 src = srcy[x];
|
||||
switch (src & 0x1c0)
|
||||
{
|
||||
case 0x000:
|
||||
desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x800];
|
||||
break;
|
||||
case 0x040:
|
||||
desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4]];
|
||||
break;
|
||||
case 0x080:
|
||||
desty[x] = paldata[(src&0x0f) | segac2_sp_pal_lookup[(src & 0x30)>>4]];
|
||||
break;
|
||||
case 0x0c0:
|
||||
// bg pen
|
||||
desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x1000];
|
||||
break;
|
||||
case 0x100:
|
||||
// shadow
|
||||
desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x800];
|
||||
break;
|
||||
case 0x140:
|
||||
// normal
|
||||
desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4]];
|
||||
break;
|
||||
case 0x180:
|
||||
// sprite
|
||||
desty[x] = paldata[(src&0x0f) | segac2_sp_pal_lookup[(src & 0x30)>>4]];
|
||||
break;
|
||||
case 0x1c0:
|
||||
// highlight
|
||||
desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x1000];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// the main interrupt on C2 comes from the vdp line used to drive the z80 interrupt on a regular genesis(!)
|
||||
void genesis_vdp_sndirqline_callback_segac2(running_machine &machine, bool state)
|
||||
{
|
||||
@ -1335,7 +1392,7 @@ static MACHINE_CONFIG_START( segac, segac2_state )
|
||||
MCFG_SCREEN_UPDATE_STATIC(segac2_new)
|
||||
MCFG_SCREEN_VBLANK_STATIC( megadriv )
|
||||
|
||||
MCFG_PALETTE_LENGTH(2048)
|
||||
MCFG_PALETTE_LENGTH(2048*3)
|
||||
|
||||
MCFG_VIDEO_START(segac2_new)
|
||||
|
||||
|
@ -62,12 +62,10 @@
|
||||
#include "machine/segaic16.h"
|
||||
#include "machine/nvram.h"
|
||||
#include "includes/segas18.h"
|
||||
#include "includes/genesis.h"
|
||||
#include "sound/2612intf.h"
|
||||
#include "sound/rf5c68.h"
|
||||
#include "includes/segaipt.h"
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Memory mapping tables
|
||||
@ -105,7 +103,7 @@ void segas18_state::memory_mapper(sega_315_5195_mapper_device &mapper, UINT8 ind
|
||||
{
|
||||
case ROM_BOARD_171_SHADOW: break; // ???
|
||||
case ROM_BOARD_171_5874:
|
||||
case ROM_BOARD_171_5987: mapper.map_as_handler(0x00000, 0x00010, 0xfffff0, read16_delegate(FUNC(segas18_state::legacy_wrapper_r<genesis_vdp_r>), this), write16_delegate(FUNC(segas18_state::legacy_wrapper<genesis_vdp_w>), this)); break;
|
||||
case ROM_BOARD_171_5987: mapper.map_as_handler(0x00000, 0x00010, 0xfffff0, read16_delegate(FUNC(segas18_state::genesis_vdp_r), this), write16_delegate(FUNC(segas18_state::genesis_vdp_w), this)); break;
|
||||
default: assert(false);
|
||||
}
|
||||
break;
|
||||
@ -113,7 +111,7 @@ void segas18_state::memory_mapper(sega_315_5195_mapper_device &mapper, UINT8 ind
|
||||
case 1:
|
||||
switch (m_romboard)
|
||||
{
|
||||
case ROM_BOARD_171_SHADOW: mapper.map_as_handler(0x00000, 0x00010, 0xfffff0, read16_delegate(FUNC(segas18_state::legacy_wrapper_r<genesis_vdp_r>), this), write16_delegate(FUNC(segas18_state::legacy_wrapper<genesis_vdp_w>), this)); break;
|
||||
case ROM_BOARD_171_SHADOW: mapper.map_as_handler(0x00000, 0x00010, 0xfffff0, read16_delegate(FUNC(segas18_state::genesis_vdp_r), this), write16_delegate(FUNC(segas18_state::genesis_vdp_w), this)); break;
|
||||
case ROM_BOARD_171_5874: mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom1base", 0x80000, write16_delegate()); break;
|
||||
case ROM_BOARD_171_5987: if (romsize <= 0x100000)
|
||||
mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom1base", 0x80000, write16_delegate(FUNC(segas18_state::rom_5987_bank_w), this));
|
||||
@ -205,6 +203,9 @@ void segas18_state::machine_reset()
|
||||
{
|
||||
segaic16_tilemap_reset(machine(), 0);
|
||||
|
||||
megadriv_reset_vdp(machine());
|
||||
genvdp_use_cram = 1;
|
||||
|
||||
// if we are running with a real live 8751, we need to boost the interleave at startup
|
||||
if (m_mcu != NULL && m_mcu->type() == I8751)
|
||||
synchronize(TID_INITIAL_BOOST);
|
||||
@ -567,6 +568,22 @@ WRITE8_MEMBER( segas18_state::mcu_data_w )
|
||||
m_mcu->set_input_line(MCS51_INT1_LINE, HOLD_LINE);
|
||||
}
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* VDP memory handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
READ16_MEMBER( segas18_state::genesis_vdp_r )
|
||||
{
|
||||
return m_vdp->megadriv_vdp_r(space,offset,mem_mask);
|
||||
}
|
||||
|
||||
WRITE16_MEMBER( segas18_state::genesis_vdp_w )
|
||||
{
|
||||
m_vdp->megadriv_vdp_w(space,offset,data,mem_mask);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
@ -1195,6 +1212,19 @@ GFXDECODE_END
|
||||
|
||||
|
||||
|
||||
// are any of the VDP interrupt lines hooked up to anything?
|
||||
void genesis_vdp_sndirqline_callback_segas18(running_machine &machine, bool state)
|
||||
{
|
||||
}
|
||||
|
||||
void genesis_vdp_lv6irqline_callback_segas18(running_machine &machine, bool state)
|
||||
{
|
||||
}
|
||||
|
||||
void genesis_vdp_lv4irqline_callback_segas18(running_machine &machine, bool state)
|
||||
{
|
||||
}
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Machine driver
|
||||
@ -1216,6 +1246,17 @@ static MACHINE_CONFIG_START( system18, segas18_state )
|
||||
|
||||
MCFG_SEGA_315_5195_MAPPER_ADD("mapper", "maincpu", segas18_state, memory_mapper, mapper_sound_r, mapper_sound_w)
|
||||
|
||||
|
||||
MCFG_DEVICE_ADD("gen_vdp", SEGA_GEN_VDP, 0)
|
||||
sega_genesis_vdp_device::set_genesis_vdp_sndirqline_callback(*device, genesis_vdp_sndirqline_callback_segas18);
|
||||
sega_genesis_vdp_device::set_genesis_vdp_lv6irqline_callback(*device, genesis_vdp_lv6irqline_callback_segas18);
|
||||
sega_genesis_vdp_device::set_genesis_vdp_lv4irqline_callback(*device, genesis_vdp_lv4irqline_callback_segas18);
|
||||
sega_genesis_vdp_device::set_genesis_vdp_alt_timing(*device, 1);
|
||||
sega_genesis_vdp_device::set_genesis_vdp_palwrite_base(*device, 0x2000);
|
||||
|
||||
MCFG_TIMER_ADD_SCANLINE("scantimer", megadriv_scanline_timer_callback_alt_timing, "screen", 0, 1)
|
||||
|
||||
|
||||
// video hardware
|
||||
MCFG_SCREEN_ADD("screen", RASTER)
|
||||
MCFG_SCREEN_REFRESH_RATE(57.23) // verified on pcb
|
||||
@ -1224,7 +1265,7 @@ static MACHINE_CONFIG_START( system18, segas18_state )
|
||||
MCFG_SCREEN_UPDATE_DRIVER(segas18_state, screen_update)
|
||||
|
||||
MCFG_GFXDECODE(segas18)
|
||||
MCFG_PALETTE_LENGTH(2048*3+2048)
|
||||
MCFG_PALETTE_LENGTH(2048*3+2048 + 64*3)
|
||||
|
||||
MCFG_SEGA16SP_ADD_16B("segaspr1")
|
||||
|
||||
|
@ -1,13 +1 @@
|
||||
/* Todo, reorganise, cleanup etc.*/
|
||||
|
||||
/*----------- defined in video/genesis.c -----------*/
|
||||
|
||||
extern UINT16 genesis_bg_pal_lookup[4];
|
||||
extern UINT16 genesis_sp_pal_lookup[4];
|
||||
extern UINT8 genesis_vdp_regs[32];
|
||||
|
||||
void system18_vdp_start(running_machine &machine);
|
||||
void system18_vdp_update(bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
READ16_HANDLER ( genesis_vdp_r );
|
||||
WRITE16_HANDLER( genesis_vdp_w );
|
||||
/* Todo, delete! */
|
||||
|
@ -452,8 +452,8 @@ extern WRITE16_HANDLER( jcart_ctrl_w );
|
||||
extern READ16_HANDLER( jcart_ctrl_r );
|
||||
|
||||
/* machine/megavdp.c */
|
||||
extern UINT16 (*vdp_get_word_from_68k_mem)(running_machine &machine, UINT32 source);
|
||||
extern UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source);
|
||||
extern UINT16 (*vdp_get_word_from_68k_mem)(running_machine &machine, UINT32 source, address_space* space);
|
||||
extern UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source, address_space* space);
|
||||
extern int megadriv_framerate;
|
||||
extern int megadrive_total_scanlines;
|
||||
extern int megadrive_vblank_flag;
|
||||
@ -468,9 +468,7 @@ extern int genvdp_use_cram;
|
||||
extern int megadrive_region_export;
|
||||
extern int megadrive_region_pal;
|
||||
TIMER_DEVICE_CALLBACK( megadriv_scanline_timer_callback );
|
||||
TIMER_DEVICE_CALLBACK( megadriv_scanline_timer_callback_alt_timing );
|
||||
|
||||
/* machine/megadriv.c */
|
||||
extern TIMER_DEVICE_CALLBACK( megadriv_scanline_timer_callback );
|
||||
extern timer_device* megadriv_scanline_timer;
|
||||
extern void megadriv_reset_vdp(running_machine &machine);
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include "machine/nvram.h"
|
||||
#include "machine/segaic16.h"
|
||||
#include "video/segaic16.h"
|
||||
#include "machine/megavdp.h"
|
||||
|
||||
|
||||
// ======================> segas18_state
|
||||
@ -55,6 +56,7 @@ public:
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_soundcpu(*this, "soundcpu"),
|
||||
m_mcu(*this, "mcu"),
|
||||
m_vdp(*this, "gen_vdp"),
|
||||
m_nvram(*this, "nvram"),
|
||||
m_workram(*this, "workram"),
|
||||
m_romboard(ROM_BOARD_INVALID),
|
||||
@ -93,6 +95,10 @@ public:
|
||||
DECLARE_WRITE8_MEMBER( soundbank_w );
|
||||
DECLARE_WRITE8_MEMBER( mcu_data_w );
|
||||
|
||||
DECLARE_READ16_MEMBER( genesis_vdp_r );
|
||||
DECLARE_WRITE16_MEMBER( genesis_vdp_w );
|
||||
|
||||
|
||||
// custom I/O
|
||||
DECLARE_READ16_MEMBER( ddcrew_custom_io_r );
|
||||
DECLARE_READ16_MEMBER( lghost_custom_io_r );
|
||||
@ -142,6 +148,7 @@ protected:
|
||||
required_device<m68000_device> m_maincpu;
|
||||
required_device<z80_device> m_soundcpu;
|
||||
optional_device<i8751_device> m_mcu;
|
||||
required_device<sega_genesis_vdp_device> m_vdp;
|
||||
required_device<nvram_device> m_nvram;
|
||||
|
||||
// memory pointers
|
||||
|
@ -30,16 +30,10 @@ int megadrive_total_scanlines;
|
||||
int megadrive_vblank_flag = 0;
|
||||
int genesis_scanline_counter = 0;
|
||||
|
||||
int segac2_bg_pal_lookup[4];
|
||||
int segac2_sp_pal_lookup[4];
|
||||
|
||||
// hacks for C2
|
||||
int genvdp_use_cram = 0; // c2 uses it's own palette ram
|
||||
|
||||
UINT16* megadrive_vdp_palette_lookup;
|
||||
UINT16* megadrive_vdp_palette_lookup_sprite; // for C2
|
||||
UINT16* megadrive_vdp_palette_lookup_shadow;
|
||||
UINT16* megadrive_vdp_palette_lookup_highlight;
|
||||
|
||||
int megadrive_region_export;
|
||||
int megadrive_region_pal;
|
||||
@ -75,6 +69,7 @@ sega_genesis_vdp_device::sega_genesis_vdp_device(const machine_config &mconfig,
|
||||
m_genesis_vdp_lv6irqline_callback = genesis_vdp_lv6irqline_callback_default;
|
||||
m_genesis_vdp_lv4irqline_callback = genesis_vdp_lv4irqline_callback_default;
|
||||
m_use_alt_timing = 0;
|
||||
m_palwrite_base = -1;
|
||||
}
|
||||
|
||||
static TIMER_CALLBACK( megadriv_render_timer_callback )
|
||||
@ -134,6 +129,14 @@ void sega_genesis_vdp_device::set_genesis_vdp_alt_timing(device_t &device, int u
|
||||
dev.m_use_alt_timing = use_alt_timing;
|
||||
}
|
||||
|
||||
void sega_genesis_vdp_device::set_genesis_vdp_palwrite_base(device_t &device, int palwrite_base)
|
||||
{
|
||||
sega_genesis_vdp_device &dev = downcast<sega_genesis_vdp_device &>(device);
|
||||
dev.m_palwrite_base = palwrite_base;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void sega_genesis_vdp_device::device_start()
|
||||
{
|
||||
@ -178,6 +181,19 @@ void sega_genesis_vdp_device::device_start()
|
||||
m_highpri_renderline = auto_alloc_array(machine(), UINT8, 320);
|
||||
m_video_renderline = auto_alloc_array(machine(), UINT32, 320);
|
||||
|
||||
megadrive_vdp_palette_lookup = auto_alloc_array(machine(), UINT16, 0x40);
|
||||
megadrive_vdp_palette_lookup_sprite = auto_alloc_array(machine(), UINT16, 0x40);
|
||||
|
||||
megadrive_vdp_palette_lookup_shadow = auto_alloc_array(machine(), UINT16, 0x40);
|
||||
megadrive_vdp_palette_lookup_highlight = auto_alloc_array(machine(), UINT16, 0x40);
|
||||
|
||||
memset(megadrive_vdp_palette_lookup,0x00,0x40*2);
|
||||
memset(megadrive_vdp_palette_lookup_sprite,0x00,0x40*2);
|
||||
|
||||
memset(megadrive_vdp_palette_lookup_shadow,0x00,0x40*2);
|
||||
memset(megadrive_vdp_palette_lookup_highlight,0x00,0x40*2);
|
||||
|
||||
|
||||
if (!m_use_alt_timing)
|
||||
{
|
||||
m_render_bitmap = auto_bitmap_ind16_alloc(machine(), machine().primary_screen->width(), machine().primary_screen->height());
|
||||
@ -187,11 +203,14 @@ void sega_genesis_vdp_device::device_start()
|
||||
m_render_line = auto_alloc_array(machine(), UINT16, machine().primary_screen->width());
|
||||
}
|
||||
|
||||
m_render_line_raw = auto_alloc_array(machine(), UINT16, machine().primary_screen->width());
|
||||
|
||||
irq6_on_timer = machine().scheduler().timer_alloc(FUNC(irq6_on_timer_callback), (void*)this);
|
||||
irq4_on_timer = machine().scheduler().timer_alloc(FUNC(irq4_on_timer_callback), (void*)this);
|
||||
megadriv_render_timer = machine().scheduler().timer_alloc(FUNC(megadriv_render_timer_callback), (void*)this);
|
||||
|
||||
m_space68k = machine().device<legacy_cpu_device>(":maincpu")->space();
|
||||
m_cpu68k = machine().device<legacy_cpu_device>(":maincpu");
|
||||
}
|
||||
|
||||
void sega_genesis_vdp_device::device_reset()
|
||||
@ -275,7 +294,12 @@ void sega_genesis_vdp_device::write_cram_value(running_machine &machine, int off
|
||||
r = ((data >> 1)&0x07);
|
||||
g = ((data >> 5)&0x07);
|
||||
b = ((data >> 9)&0x07);
|
||||
palette_set_color_rgb(machine,offset,pal3bit(r),pal3bit(g),pal3bit(b));
|
||||
if (m_palwrite_base != -1)
|
||||
{
|
||||
palette_set_color_rgb(machine,offset + m_palwrite_base ,pal3bit(r),pal3bit(g),pal3bit(b));
|
||||
palette_set_color_rgb(machine,offset + m_palwrite_base + 0x40 ,pal3bit(r>>1),pal3bit(g>>1),pal3bit(b>>1));
|
||||
palette_set_color_rgb(machine,offset + m_palwrite_base + 0x80 ,pal3bit((r>>1)|0x4),pal3bit((g>>1)|0x4),pal3bit((b>>1)|0x4));
|
||||
}
|
||||
megadrive_vdp_palette_lookup[offset] = (b<<2) | (g<<7) | (r<<12);
|
||||
megadrive_vdp_palette_lookup_sprite[offset] = (b<<2) | (g<<7) | (r<<12);
|
||||
megadrive_vdp_palette_lookup_shadow[offset] = (b<<1) | (g<<6) | (r<<11);
|
||||
@ -452,14 +476,13 @@ void sega_genesis_vdp_device::update_m_vdp_code_and_address(void)
|
||||
((m_vdp_command_part2 & 0x0003) << 14);
|
||||
}
|
||||
|
||||
UINT16 (*vdp_get_word_from_68k_mem)(running_machine &machine, UINT32 source);
|
||||
UINT16 (*vdp_get_word_from_68k_mem)(running_machine &machine, UINT32 source, address_space* space68k);
|
||||
|
||||
UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source)
|
||||
UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source, address_space* space68k)
|
||||
{
|
||||
// should we limit the valid areas here?
|
||||
// how does this behave with the segacd etc?
|
||||
// note, the RV bit on 32x is important for this to work, because it causes a normal cart mapping - see tempo
|
||||
address_space *space68k = machine.device<legacy_cpu_device>("maincpu")->space();
|
||||
|
||||
//printf("vdp_get_word_from_68k_mem_default %08x\n", source);
|
||||
|
||||
@ -552,11 +575,11 @@ void sega_genesis_vdp_device::megadrive_do_insta_68k_to_vram_dma(running_machine
|
||||
if (length==0x00) length = 0xffff;
|
||||
|
||||
/* This is a hack until real DMA timings are implemented */
|
||||
device_spin_until_time(machine.device(":maincpu"), attotime::from_nsec(length * 1000 / 3500));
|
||||
device_spin_until_time(m_cpu68k, attotime::from_nsec(length * 1000 / 3500));
|
||||
|
||||
for (count = 0;count<(length>>1);count++)
|
||||
{
|
||||
vdp_vram_write(vdp_get_word_from_68k_mem(machine, source));
|
||||
vdp_vram_write(vdp_get_word_from_68k_mem(machine, source, m_space68k));
|
||||
source+=2;
|
||||
if (source>0xffffff) source = 0xe00000;
|
||||
}
|
||||
@ -582,7 +605,7 @@ void sega_genesis_vdp_device::megadrive_do_insta_68k_to_cram_dma(running_machine
|
||||
{
|
||||
//if (m_vdp_address>=0x80) return; // abandon
|
||||
|
||||
write_cram_value(machine, (m_vdp_address&0x7e)>>1, vdp_get_word_from_68k_mem(machine, source));
|
||||
write_cram_value(machine, (m_vdp_address&0x7e)>>1, vdp_get_word_from_68k_mem(machine, source, m_space68k));
|
||||
source+=2;
|
||||
|
||||
if (source>0xffffff) source = 0xfe0000;
|
||||
@ -610,7 +633,7 @@ void sega_genesis_vdp_device::megadrive_do_insta_68k_to_vsram_dma(running_machin
|
||||
{
|
||||
if (m_vdp_address>=0x80) return; // abandon
|
||||
|
||||
m_vsram[(m_vdp_address&0x7e)>>1] = vdp_get_word_from_68k_mem(machine, source);
|
||||
m_vsram[(m_vdp_address&0x7e)>>1] = vdp_get_word_from_68k_mem(machine, source, m_space68k);
|
||||
source+=2;
|
||||
|
||||
if (source>0xffffff) source = 0xfe0000;
|
||||
@ -2575,13 +2598,24 @@ void sega_genesis_vdp_device::genesis_render_videobuffer_to_screenbuffer(running
|
||||
}
|
||||
}
|
||||
|
||||
if (!(dat&0x20000))
|
||||
m_render_line_raw[x] = 0x100;
|
||||
else
|
||||
m_render_line_raw[x] = 0x000;
|
||||
|
||||
|
||||
if (drawn==0)
|
||||
{
|
||||
if (dat&0x10000)
|
||||
lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat&0x0f) | segac2_sp_pal_lookup[(dat&0x30)>>4]];
|
||||
{
|
||||
lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat&0x3f)];
|
||||
m_render_line_raw[x] |= (dat & 0x3f) | 0x080;
|
||||
}
|
||||
else
|
||||
lineptr[x] = megadrive_vdp_palette_lookup[(dat&0x0f) | segac2_bg_pal_lookup[(dat&0x30)>>4]];
|
||||
{
|
||||
lineptr[x] = megadrive_vdp_palette_lookup[(dat&0x3f)];
|
||||
m_render_line_raw[x] |= (dat & 0x3f) | 0x040;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -2619,6 +2653,11 @@ void sega_genesis_vdp_device::genesis_render_videobuffer_to_screenbuffer(running
|
||||
}
|
||||
}
|
||||
|
||||
if (!(dat&0x20000))
|
||||
m_render_line_raw[x] = 0x100;
|
||||
else
|
||||
m_render_line_raw[x] = 0x000;
|
||||
|
||||
|
||||
if (drawn==0)
|
||||
{
|
||||
@ -2631,23 +2670,27 @@ void sega_genesis_vdp_device::genesis_render_videobuffer_to_screenbuffer(running
|
||||
case 0x10000: // (sprite) low priority, no shadow sprite, no highlight = shadow
|
||||
case 0x12000: // (sprite) low priority, shadow sprite, no highlight = shadow
|
||||
case 0x16000: // (sprite) normal pri, shadow sprite, no highlight = shadow?
|
||||
lineptr[x] = megadrive_vdp_palette_lookup_shadow[(dat&0x0f) | segac2_bg_pal_lookup[(dat&0x30)>>4]];
|
||||
lineptr[x] = megadrive_vdp_palette_lookup_shadow[(dat&0x3f)];
|
||||
m_render_line_raw[x] |= (dat & 0x3f) | 0x000;
|
||||
break;
|
||||
|
||||
case 0x4000: // normal pri, no shadow sprite, no highlight = normal;
|
||||
case 0x8000: // low pri, highlight sprite = normal;
|
||||
lineptr[x] = megadrive_vdp_palette_lookup[(dat&0x0f) | segac2_bg_pal_lookup[(dat&0x30)>>4]];
|
||||
lineptr[x] = megadrive_vdp_palette_lookup[(dat&0x3f)];
|
||||
m_render_line_raw[x] |= (dat & 0x3f) | 0x040;
|
||||
break;
|
||||
|
||||
case 0x14000: // (sprite) normal pri, no shadow sprite, no highlight = normal;
|
||||
case 0x18000: // (sprite) low pri, highlight sprite = normal;
|
||||
lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat&0x0f) | segac2_sp_pal_lookup[(dat&0x30)>>4]];
|
||||
lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat&0x3f)];
|
||||
m_render_line_raw[x] |= (dat & 0x3f) | 0x080;
|
||||
break;
|
||||
|
||||
|
||||
case 0x0c000: // normal pri, highlight set = highlight?
|
||||
case 0x1c000: // (sprite) normal pri, highlight set = highlight?
|
||||
lineptr[x] = megadrive_vdp_palette_lookup_highlight[(dat&0x0f) | segac2_bg_pal_lookup[(dat&0x30)>>4]];
|
||||
lineptr[x] = megadrive_vdp_palette_lookup_highlight[(dat&0x3f)];
|
||||
m_render_line_raw[x] |= (dat & 0x3f) | 0x0c0;
|
||||
break;
|
||||
|
||||
case 0x0a000: // shadow set, highlight set - not possible
|
||||
@ -2655,9 +2698,10 @@ void sega_genesis_vdp_device::genesis_render_videobuffer_to_screenbuffer(running
|
||||
case 0x1a000: // (sprite)shadow set, highlight set - not possible
|
||||
case 0x1e000: // (sprite)shadow set, highlight set, normal set, not possible
|
||||
default:
|
||||
lineptr[x] = machine.rand()&0x3f;
|
||||
lineptr[x] = m_render_line_raw[x] |= (machine.rand()&0x3f);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -2701,28 +2745,6 @@ void sega_genesis_vdp_device::genesis_render_scanline(running_machine &machine)
|
||||
|
||||
VIDEO_START(megadriv)
|
||||
{
|
||||
megadrive_vdp_palette_lookup = auto_alloc_array(machine, UINT16, 0x40);
|
||||
megadrive_vdp_palette_lookup_sprite = auto_alloc_array(machine, UINT16, 0x40);
|
||||
|
||||
megadrive_vdp_palette_lookup_shadow = auto_alloc_array(machine, UINT16, 0x40);
|
||||
megadrive_vdp_palette_lookup_highlight = auto_alloc_array(machine, UINT16, 0x40);
|
||||
|
||||
memset(megadrive_vdp_palette_lookup,0x00,0x40*2);
|
||||
memset(megadrive_vdp_palette_lookup_sprite,0x00,0x40*2);
|
||||
|
||||
memset(megadrive_vdp_palette_lookup_shadow,0x00,0x40*2);
|
||||
memset(megadrive_vdp_palette_lookup_highlight,0x00,0x40*2);
|
||||
|
||||
/* no special lookups */
|
||||
segac2_bg_pal_lookup[0] = 0x00;
|
||||
segac2_bg_pal_lookup[1] = 0x10;
|
||||
segac2_bg_pal_lookup[2] = 0x20;
|
||||
segac2_bg_pal_lookup[3] = 0x30;
|
||||
|
||||
segac2_sp_pal_lookup[0] = 0x00;
|
||||
segac2_sp_pal_lookup[1] = 0x10;
|
||||
segac2_sp_pal_lookup[2] = 0x20;
|
||||
segac2_sp_pal_lookup[3] = 0x30;
|
||||
}
|
||||
|
||||
|
||||
@ -2879,16 +2901,16 @@ void sega_genesis_vdp_device::vdp_handle_eof(running_machine &machine)
|
||||
switch (MEGADRIVE_REG0C_RS0 | (MEGADRIVE_REG0C_RS1 << 1))
|
||||
{
|
||||
/* note, add 240 mode + init new timings! */
|
||||
case 0:scr_width = 256;break;// configure_screen(0, 256-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); break;
|
||||
case 1:scr_width = 256;break;// configure_screen(0, 256-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); mame_printf_debug("invalid screenmode!\n"); break;
|
||||
case 2:scr_width = 320;break;// configure_screen(0, 320-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); break; /* technically invalid, but used in rare cases */
|
||||
case 3:scr_width = 320;break;// configure_screen(0, 320-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); break;
|
||||
case 0:scr_width = 256;break;
|
||||
case 1:scr_width = 256;break;
|
||||
case 2:scr_width = 320;break;
|
||||
case 3:scr_width = 320;break;
|
||||
}
|
||||
// mame_printf_debug("my mode %02x", m_vdp_regs[0x0c]);
|
||||
|
||||
visarea.set(0, scr_width-1, 0, megadrive_visible_scanlines-1);
|
||||
|
||||
machine.primary_screen->configure(480, megadrive_total_scanlines, visarea, HZ_TO_ATTOSECONDS(megadriv_framerate));
|
||||
machine.primary_screen->configure(480, megadrive_total_scanlines, visarea, machine.primary_screen->frame_period().attoseconds);
|
||||
|
||||
|
||||
if(_32x_is_connected)
|
||||
|
@ -146,6 +146,11 @@ typedef void (*genesis_vdp_sndirqline_callback_func)(running_machine &machine, b
|
||||
typedef void (*genesis_vdp_lv6irqline_callback_func)(running_machine &machine, bool state);
|
||||
typedef void (*genesis_vdp_lv4irqline_callback_func)(running_machine &machine, bool state);
|
||||
|
||||
TIMER_DEVICE_CALLBACK( megadriv_scanline_timer_callback_alt_timing );
|
||||
extern void megadriv_reset_vdp(running_machine &machine);
|
||||
extern int genvdp_use_cram;
|
||||
|
||||
|
||||
class sega_genesis_vdp_device : public device_t
|
||||
{
|
||||
public:
|
||||
@ -155,8 +160,11 @@ public:
|
||||
static void set_genesis_vdp_lv6irqline_callback(device_t &device, genesis_vdp_lv6irqline_callback_func callback);
|
||||
static void set_genesis_vdp_lv4irqline_callback(device_t &device, genesis_vdp_lv4irqline_callback_func callback);
|
||||
static void set_genesis_vdp_alt_timing(device_t &device, int use_alt_timing);
|
||||
static void set_genesis_vdp_palwrite_base(device_t &device, int palwrite_base);
|
||||
|
||||
int m_use_alt_timing; // use MAME scanline timer instead, render only one scanline to a single line buffer, to be rendered by a partial update call.. experimental
|
||||
|
||||
int m_palwrite_base; // if we want to write to the actual MAME palette..
|
||||
|
||||
DECLARE_READ16_MEMBER( megadriv_vdp_r );
|
||||
DECLARE_WRITE16_MEMBER( megadriv_vdp_w );
|
||||
@ -181,6 +189,7 @@ public:
|
||||
|
||||
bitmap_ind16* m_render_bitmap;
|
||||
UINT16* m_render_line;
|
||||
UINT16* m_render_line_raw;
|
||||
|
||||
protected:
|
||||
virtual void device_start();
|
||||
@ -266,6 +275,13 @@ private:
|
||||
UINT8* m_sprite_renderline;
|
||||
UINT8* m_highpri_renderline;
|
||||
UINT32* m_video_renderline;
|
||||
UINT16* megadrive_vdp_palette_lookup;
|
||||
UINT16* megadrive_vdp_palette_lookup_sprite; // for C2
|
||||
UINT16* megadrive_vdp_palette_lookup_shadow;
|
||||
UINT16* megadrive_vdp_palette_lookup_highlight;
|
||||
|
||||
address_space *m_space68k;
|
||||
legacy_cpu_device* m_cpu68k;
|
||||
|
||||
};
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -69,9 +69,6 @@ void segas18_state::video_start()
|
||||
// initialize the tile/text layers
|
||||
segaic16_tilemap_init(machine(), 0, SEGAIC16_TILEMAP_16B, 0x000, 0, 8);
|
||||
|
||||
// create the VDP
|
||||
system18_vdp_start(machine());
|
||||
|
||||
save_item(NAME(m_grayscale_enable));
|
||||
save_item(NAME(m_vdp_enable));
|
||||
save_item(NAME(m_vdp_mixing));
|
||||
@ -132,26 +129,42 @@ void segas18_state::set_vdp_mixing(UINT8 mixing)
|
||||
|
||||
void segas18_state::draw_vdp(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority)
|
||||
{
|
||||
|
||||
bitmap_ind8 &priority_bitmap = screen.machine().priority_bitmap;
|
||||
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
|
||||
{
|
||||
UINT16 *src = &m_temp_bitmap.pix(y);
|
||||
// UINT16 *src = vdp->m_render_line; // can't use this because we're not in RGB32, which we'll need to be if there are palette effects
|
||||
// UINT16 *src2 = vdp->m_render_line_raw;
|
||||
|
||||
UINT16 *dst = &bitmap.pix(y);
|
||||
UINT8 *pri = &priority_bitmap.pix(y);
|
||||
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
|
||||
{
|
||||
UINT16 pix = src[x];
|
||||
if (pix != 0xffff)
|
||||
if (m_vdp->m_render_line_raw[x] & 0x100)
|
||||
{
|
||||
dst[x] = pix;
|
||||
pri[x] |= priority;
|
||||
int pix = m_vdp->m_render_line_raw[x] & 0x3f;
|
||||
if (pix & 0xf)
|
||||
{
|
||||
switch (pix & 0xc0)
|
||||
{
|
||||
case 0x00:
|
||||
dst[x] = pix + 0x2000; /* 0x2040 - would be shadow? */
|
||||
break;
|
||||
case 0x40:
|
||||
case 0x80:
|
||||
dst[x] = pix + 0x2000;
|
||||
break;
|
||||
case 0xc0:
|
||||
dst[x] = pix + 0x2000; /* 0x2080 - would be higlight? */
|
||||
break;
|
||||
}
|
||||
pri[x] |= priority;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Video update
|
||||
@ -214,10 +227,6 @@ UINT32 segas18_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap,
|
||||
return 0;
|
||||
}
|
||||
|
||||
// if the VDP is enabled, update our tmp_bitmap
|
||||
if (m_vdp_enable)
|
||||
system18_vdp_update(m_temp_bitmap, cliprect);
|
||||
|
||||
// reset priorities
|
||||
machine().priority_bitmap.fill(0, cliprect);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user