mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
(MESS) sms/gamegear: misc improvements [Enik Land]
- Renamed the gear2gear port to EXT port, after reading the references in the official GG documents - Invert Y1 pin signal bits: now high is 1 and low is 0; - More complete Y1 behavior: goes low only for transparent pixels; - Fix color of column 0 when it doesn't completely entered in the active display; - Improve behavior of sprite overflow, to not be flagged when VINT is active. out of whatsnew: the new Y1 pin behavior of the SMS VDP is based on Charles' findings and TMS9918 manual.
This commit is contained in:
parent
8028062f65
commit
b4834b7595
@ -1291,12 +1291,12 @@ endif
|
||||
|
||||
#-------------------------------------------------
|
||||
#
|
||||
#@src/emu/bus/gamegear/gear2gear.h,BUSES += GAMEGEAR
|
||||
#@src/emu/bus/gamegear/ggext.h,BUSES += GAMEGEAR
|
||||
#-------------------------------------------------
|
||||
|
||||
ifneq ($(filter GAMEGEAR,$(BUSES)),)
|
||||
OBJDIRS += $(BUSOBJ)/gamegear
|
||||
BUSOBJS += $(BUSOBJ)/gamegear/gear2gear.o
|
||||
BUSOBJS += $(BUSOBJ)/gamegear/ggext.o
|
||||
BUSOBJS += $(BUSOBJ)/gamegear/smsctrladp.o
|
||||
endif
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
/**********************************************************************
|
||||
|
||||
Sega Game Gear "Gear to Gear Port" emulation
|
||||
Sega Game Gear EXT port emulation
|
||||
|
||||
Copyright MESS Team.
|
||||
Visit http://mamedev.org for licensing and usage restrictions.
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#include "gear2gear.h"
|
||||
#include "ggext.h"
|
||||
// slot devices
|
||||
#include "smsctrladp.h"
|
||||
|
||||
@ -17,7 +17,7 @@
|
||||
// GLOBAL VARIABLES
|
||||
//**************************************************************************
|
||||
|
||||
const device_type GG_GEAR2GEAR_PORT = &device_creator<gg_gear2gear_port_device>;
|
||||
const device_type GG_EXT_PORT = &device_creator<gg_ext_port_device>;
|
||||
|
||||
|
||||
|
||||
@ -26,21 +26,21 @@ const device_type GG_GEAR2GEAR_PORT = &device_creator<gg_gear2gear_port_device>;
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_gg_gear2gear_port_interface - constructor
|
||||
// device_gg_ext_port_interface - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
device_gg_gear2gear_port_interface::device_gg_gear2gear_port_interface(const machine_config &mconfig, device_t &device)
|
||||
device_gg_ext_port_interface::device_gg_ext_port_interface(const machine_config &mconfig, device_t &device)
|
||||
: device_slot_card_interface(mconfig,device)
|
||||
{
|
||||
m_port = dynamic_cast<gg_gear2gear_port_device *>(device.owner());
|
||||
m_port = dynamic_cast<gg_ext_port_device *>(device.owner());
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// ~device_gg_gear2gear_port_interface - destructor
|
||||
// ~device_gg_ext_port_interface - destructor
|
||||
//-------------------------------------------------
|
||||
|
||||
device_gg_gear2gear_port_interface::~device_gg_gear2gear_port_interface()
|
||||
device_gg_ext_port_interface::~device_gg_ext_port_interface()
|
||||
{
|
||||
}
|
||||
|
||||
@ -51,11 +51,11 @@ device_gg_gear2gear_port_interface::~device_gg_gear2gear_port_interface()
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// gg_gear2gear_port_device - constructor
|
||||
// gg_ext_port_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
gg_gear2gear_port_device::gg_gear2gear_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
|
||||
device_t(mconfig, GG_GEAR2GEAR_PORT, "Gear to Gear Port", tag, owner, clock, "gg_gear2gear_port", __FILE__),
|
||||
gg_ext_port_device::gg_ext_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
|
||||
device_t(mconfig, GG_EXT_PORT, "EXT Port", tag, owner, clock, "gg_ext_port", __FILE__),
|
||||
device_slot_interface(mconfig, *this),
|
||||
m_th_pin_handler(*this),
|
||||
m_pixel_handler(*this)
|
||||
@ -64,10 +64,10 @@ gg_gear2gear_port_device::gg_gear2gear_port_device(const machine_config &mconfig
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// gg_gear2gear_port_device - destructor
|
||||
// gg_ext_port_device - destructor
|
||||
//-------------------------------------------------
|
||||
|
||||
gg_gear2gear_port_device::~gg_gear2gear_port_device()
|
||||
gg_ext_port_device::~gg_ext_port_device()
|
||||
{
|
||||
}
|
||||
|
||||
@ -76,16 +76,16 @@ gg_gear2gear_port_device::~gg_gear2gear_port_device()
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void gg_gear2gear_port_device::device_start()
|
||||
void gg_ext_port_device::device_start()
|
||||
{
|
||||
m_device = dynamic_cast<device_gg_gear2gear_port_interface *>(get_card_device());
|
||||
m_device = dynamic_cast<device_gg_ext_port_interface *>(get_card_device());
|
||||
|
||||
m_th_pin_handler.resolve_safe();
|
||||
m_pixel_handler.resolve_safe(0);
|
||||
}
|
||||
|
||||
|
||||
UINT8 gg_gear2gear_port_device::port_r()
|
||||
UINT8 gg_ext_port_device::port_r()
|
||||
{
|
||||
UINT8 data = 0xff;
|
||||
if (m_device)
|
||||
@ -93,28 +93,28 @@ UINT8 gg_gear2gear_port_device::port_r()
|
||||
return data;
|
||||
}
|
||||
|
||||
void gg_gear2gear_port_device::port_w( UINT8 data )
|
||||
void gg_ext_port_device::port_w( UINT8 data )
|
||||
{
|
||||
if (m_device)
|
||||
m_device->peripheral_w(data);
|
||||
}
|
||||
|
||||
|
||||
void gg_gear2gear_port_device::th_pin_w(int state)
|
||||
void gg_ext_port_device::th_pin_w(int state)
|
||||
{
|
||||
m_th_pin_handler(state);
|
||||
}
|
||||
|
||||
UINT32 gg_gear2gear_port_device::pixel_r()
|
||||
UINT32 gg_ext_port_device::pixel_r()
|
||||
{
|
||||
return m_pixel_handler();
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// SLOT_INTERFACE( gg_gear2gear_port_devices )
|
||||
// SLOT_INTERFACE( gg_ext_port_devices )
|
||||
//-------------------------------------------------
|
||||
|
||||
SLOT_INTERFACE_START( gg_gear2gear_port_devices )
|
||||
SLOT_INTERFACE_START( gg_ext_port_devices )
|
||||
SLOT_INTERFACE("smsctrladp", SMS_CTRL_ADAPTOR)
|
||||
SLOT_INTERFACE_END
|
@ -1,6 +1,6 @@
|
||||
/**********************************************************************
|
||||
|
||||
Sega Game Gear "Gear to Gear Port" emulation
|
||||
Sega Game Gear EXT port emulation
|
||||
|
||||
Copyright MESS Team.
|
||||
Visit http://mamedev.org for licensing and usage restrictions.
|
||||
@ -12,8 +12,8 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef __GG_GEAR2GEAR_PORT__
|
||||
#define __GG_GEAR2GEAR_PORT__
|
||||
#ifndef __GG_EXT_PORT__
|
||||
#define __GG_EXT_PORT__
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
@ -23,19 +23,19 @@
|
||||
// INTERFACE CONFIGURATION MACROS
|
||||
//**************************************************************************
|
||||
|
||||
#define MCFG_GG_GEAR2GEAR_PORT_ADD(_tag, _slot_intf, _def_slot) \
|
||||
MCFG_DEVICE_ADD(_tag, GG_GEAR2GEAR_PORT, 0) \
|
||||
#define MCFG_GG_EXT_PORT_ADD(_tag, _slot_intf, _def_slot) \
|
||||
MCFG_DEVICE_ADD(_tag, GG_EXT_PORT, 0) \
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
|
||||
#define MCFG_GG_GEAR2GEAR_PORT_MODIFY(_tag) \
|
||||
#define MCFG_GG_EXT_PORT_MODIFY(_tag) \
|
||||
MCFG_DEVICE_MODIFY(_tag)
|
||||
|
||||
|
||||
#define MCFG_GG_GEAR2GEAR_PORT_TH_INPUT_HANDLER(_devcb) \
|
||||
devcb = &gg_gear2gear_port_device::set_th_input_handler(*device, DEVCB_##_devcb);
|
||||
#define MCFG_GG_EXT_PORT_TH_INPUT_HANDLER(_devcb) \
|
||||
devcb = &gg_ext_port_device::set_th_input_handler(*device, DEVCB_##_devcb);
|
||||
|
||||
|
||||
#define MCFG_GG_GEAR2GEAR_PORT_PIXEL_HANDLER(_devcb) \
|
||||
devcb = &gg_gear2gear_port_device::set_pixel_handler(*device, DEVCB_##_devcb);
|
||||
#define MCFG_GG_EXT_PORT_PIXEL_HANDLER(_devcb) \
|
||||
devcb = &gg_ext_port_device::set_pixel_handler(*device, DEVCB_##_devcb);
|
||||
|
||||
|
||||
|
||||
@ -43,27 +43,26 @@
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
// ======================> gg_gear2gear_port_device
|
||||
// ======================> gg_ext_port_device
|
||||
|
||||
class device_gg_gear2gear_port_interface;
|
||||
class device_gg_ext_port_interface;
|
||||
|
||||
class gg_gear2gear_port_device : public device_t,
|
||||
class gg_ext_port_device : public device_t,
|
||||
public device_slot_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
gg_gear2gear_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
virtual ~gg_gear2gear_port_device();
|
||||
gg_ext_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
virtual ~gg_ext_port_device();
|
||||
|
||||
// static configuration helpers
|
||||
template<class _Object> static devcb_base &set_th_input_handler(device_t &device, _Object object) { return downcast<gg_gear2gear_port_device &>(device).m_th_pin_handler.set_callback(object); }
|
||||
template<class _Object> static devcb_base &set_th_input_handler(device_t &device, _Object object) { return downcast<gg_ext_port_device &>(device).m_th_pin_handler.set_callback(object); }
|
||||
|
||||
template<class _Object> static devcb_base &set_pixel_handler(device_t &device, _Object object) { return downcast<gg_gear2gear_port_device &>(device).m_pixel_handler.set_callback(object); }
|
||||
template<class _Object> static devcb_base &set_pixel_handler(device_t &device, _Object object) { return downcast<gg_ext_port_device &>(device).m_pixel_handler.set_callback(object); }
|
||||
|
||||
// Currently, only the support for SMS Controller Adaptor is emulated,
|
||||
// for when SMS Compatibility mode is enabled. In that mode, the 10
|
||||
// pins of the Gear to Gear Port follows the same numbering of a SMS
|
||||
// Control port.
|
||||
// for when SMS Compatibility mode is enabled. In that mode, the 10 pins
|
||||
// of the EXT port follows the same numbering of a SMS Control port.
|
||||
|
||||
// Data returned by the port_r methods:
|
||||
// bit 0 - pin 1 - Up
|
||||
@ -87,7 +86,7 @@ public:
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
|
||||
device_gg_gear2gear_port_interface *m_device;
|
||||
device_gg_ext_port_interface *m_device;
|
||||
|
||||
private:
|
||||
devcb_write_line m_th_pin_handler;
|
||||
@ -95,29 +94,29 @@ private:
|
||||
};
|
||||
|
||||
|
||||
// ======================> device_gg_gear2gear_port_interface
|
||||
// ======================> device_gg_ext_port_interface
|
||||
|
||||
// class representing interface-specific live sms_expansion card
|
||||
class device_gg_gear2gear_port_interface : public device_slot_card_interface
|
||||
class device_gg_ext_port_interface : public device_slot_card_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
device_gg_gear2gear_port_interface(const machine_config &mconfig, device_t &device);
|
||||
virtual ~device_gg_gear2gear_port_interface();
|
||||
device_gg_ext_port_interface(const machine_config &mconfig, device_t &device);
|
||||
virtual ~device_gg_ext_port_interface();
|
||||
|
||||
virtual UINT8 peripheral_r() { return 0xff; };
|
||||
virtual void peripheral_w(UINT8 data) { };
|
||||
|
||||
protected:
|
||||
gg_gear2gear_port_device *m_port;
|
||||
gg_ext_port_device *m_port;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
extern const device_type GG_GEAR2GEAR_PORT;
|
||||
extern const device_type GG_EXT_PORT;
|
||||
|
||||
|
||||
SLOT_INTERFACE_EXTERN( gg_gear2gear_port_devices );
|
||||
SLOT_INTERFACE_EXTERN( gg_ext_port_devices );
|
||||
|
||||
|
||||
#endif
|
@ -1,6 +1,6 @@
|
||||
/**********************************************************************
|
||||
|
||||
Sega Game Gear "Gear to Gear Port SMS Controller Adaptor" emulation
|
||||
Sega Game Gear "SMS Controller Adaptor" emulation
|
||||
Also known as "Master Link" cable.
|
||||
|
||||
Copyright MESS Team.
|
||||
@ -29,7 +29,7 @@ const device_type SMS_CTRL_ADAPTOR = &device_creator<sms_ctrl_adaptor_device>;
|
||||
|
||||
sms_ctrl_adaptor_device::sms_ctrl_adaptor_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
|
||||
device_t(mconfig, SMS_CTRL_ADAPTOR, "SMS Controller Adaptor", tag, owner, clock, "sms_ctrl_adaptor", __FILE__),
|
||||
device_gg_gear2gear_port_interface(mconfig, *this),
|
||||
device_gg_ext_port_interface(mconfig, *this),
|
||||
m_subctrl_port(*this, "ctrl")
|
||||
{
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
/**********************************************************************
|
||||
|
||||
Sega Game Gear "Gear to Gear Port SMS Controller Adaptor" emulation
|
||||
Sega Game Gear "SMS Controller Adaptor" emulation
|
||||
Also known as "Master Link" cable.
|
||||
|
||||
Copyright MESS Team.
|
||||
@ -15,7 +15,7 @@
|
||||
|
||||
|
||||
#include "emu.h"
|
||||
#include "gear2gear.h"
|
||||
#include "ggext.h"
|
||||
#include "../sms_ctrl/smsctrl.h"
|
||||
|
||||
|
||||
@ -27,7 +27,7 @@
|
||||
// ======================> sms_ctrl_adaptor_device
|
||||
|
||||
class sms_ctrl_adaptor_device : public device_t,
|
||||
public device_gg_gear2gear_port_interface
|
||||
public device_gg_ext_port_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
@ -41,7 +41,7 @@ protected:
|
||||
virtual void device_start();
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
|
||||
// device_gg_gear2gear_port_interface overrides
|
||||
// device_gg_ext_port_interface overrides
|
||||
virtual UINT8 peripheral_r();
|
||||
virtual void peripheral_w(UINT8 data);
|
||||
|
||||
|
@ -14,6 +14,7 @@ To do:
|
||||
- Display mode 1 (text)
|
||||
- Display mode 3 (multicolor)
|
||||
- Sprite doubling bug of the 315-5124 chip
|
||||
- Verify timing on the Game Gear (315-5378 chip)
|
||||
|
||||
|
||||
SMS Display Timing
|
||||
@ -343,7 +344,7 @@ void sega315_5124_device::device_timer(emu_timer &timer, device_timer_id id, int
|
||||
rec.min_x = SEGA315_5124_LBORDER_START;
|
||||
rec.max_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 1;
|
||||
m_tmpbitmap.fill(m_palette->pen(m_current_palette[BACKDROP_COLOR]), rec);
|
||||
m_y1_bitmap.fill(1, rec);
|
||||
m_y1_bitmap.fill(( m_reg[0x07] & 0x0f ) ? 1 : 0, rec);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -358,7 +359,7 @@ void sega315_5124_device::device_timer(emu_timer &timer, device_timer_id id, int
|
||||
rec.min_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256;
|
||||
rec.max_x = rec.min_x + SEGA315_5124_RBORDER_WIDTH - 1;
|
||||
m_tmpbitmap.fill(m_palette->pen(m_current_palette[BACKDROP_COLOR]), rec);
|
||||
m_y1_bitmap.fill(1, rec);
|
||||
m_y1_bitmap.fill(( m_reg[0x07] & 0x0f ) ? 1 : 0, rec);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -847,15 +848,16 @@ void sega315_5124_device::draw_scanline_mode4( int *line_buffer, int *priority_s
|
||||
//logerror("%x %x\n", pixel_plot_x, line);
|
||||
if (tile_column == 0 && (x_scroll & 0x07))
|
||||
{
|
||||
/* the VDP only draws the first column when it has completely entered
|
||||
in the screen, else it is filled with the sprite pattern #0 */
|
||||
line_buffer[pixel_plot_x] = m_current_palette[0x10];
|
||||
/* when the first column hasn't completely entered in the screen, its
|
||||
background is filled only with color #0 of the selected palette */
|
||||
line_buffer[pixel_plot_x] = m_current_palette[palette_selected ? 0x10 : 0x00];
|
||||
priority_selected[pixel_plot_x] = priority_select;
|
||||
}
|
||||
else
|
||||
{
|
||||
line_buffer[pixel_plot_x] = m_current_palette[pen_selected];
|
||||
priority_selected[pixel_plot_x] = priority_select | (pen_selected & 0x0f);
|
||||
}
|
||||
priority_selected[pixel_plot_x] = priority_select | (pen_selected & 0x0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1012,7 +1014,8 @@ void sega315_5124_device::select_sprites( int line )
|
||||
|
||||
m_sprite_count = max_sprites;
|
||||
|
||||
if (line >= 0 && line < m_frame_timing[ACTIVE_DISPLAY_V])
|
||||
/* Overflow is flagged only on active display and when VINT isn't active */
|
||||
if (!(m_status & STATUS_VINT) && line >= 0 && line < m_frame_timing[ACTIVE_DISPLAY_V])
|
||||
{
|
||||
m_pending_status |= STATUS_SPROVR;
|
||||
}
|
||||
@ -1030,7 +1033,8 @@ void sega315_5124_device::draw_sprites_mode4( int *line_buffer, int *priority_se
|
||||
if (m_display_disabled || m_sprite_count == 0)
|
||||
return;
|
||||
|
||||
/* Sprites aren't drawn and collisions don't occur on column 0 if it is disabled */
|
||||
/* Sprites aren't drawn and collisions don't occur on column 0 if it is disabled.
|
||||
Note: On Megadrive/Genesis VDP, collisions occur on the disabled column 0. */
|
||||
if (m_reg[0x00] & 0x20)
|
||||
plot_min_x = 8;
|
||||
|
||||
@ -1084,6 +1088,8 @@ void sega315_5124_device::draw_sprites_mode4( int *line_buffer, int *priority_se
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Draw sprite pixel */
|
||||
/* Check if the background has lower priority */
|
||||
if (!(priority_selected[pixel_plot_x] & PRIORITY_BIT))
|
||||
{
|
||||
line_buffer[pixel_plot_x] = m_current_palette[pen_selected];
|
||||
@ -1296,10 +1302,11 @@ void sega315_5124_device::draw_scanline( int pixel_offset_x, int pixel_plot_y, i
|
||||
|
||||
if ( line < m_frame_timing[ACTIVE_DISPLAY_V] )
|
||||
{
|
||||
memset(priority_selected, 1, sizeof(priority_selected));
|
||||
|
||||
switch( m_vdp_mode )
|
||||
{
|
||||
case 0:
|
||||
memset(priority_selected, 1, sizeof(priority_selected));
|
||||
if ( line >= 0 )
|
||||
{
|
||||
draw_scanline_mode0( blitline_buffer, line );
|
||||
@ -1311,7 +1318,6 @@ void sega315_5124_device::draw_scanline( int pixel_offset_x, int pixel_plot_y, i
|
||||
break;
|
||||
|
||||
case 2:
|
||||
memset(priority_selected, 1, sizeof(priority_selected));
|
||||
if ( line >= 0 )
|
||||
{
|
||||
draw_scanline_mode2( blitline_buffer, line );
|
||||
@ -1324,7 +1330,6 @@ void sega315_5124_device::draw_scanline( int pixel_offset_x, int pixel_plot_y, i
|
||||
|
||||
case 4:
|
||||
default:
|
||||
memset(priority_selected, 0, sizeof(priority_selected));
|
||||
if ( line >= 0 )
|
||||
{
|
||||
draw_scanline_mode4( blitline_buffer, priority_selected, line );
|
||||
@ -1346,7 +1351,7 @@ void sega315_5124_device::draw_scanline( int pixel_offset_x, int pixel_plot_y, i
|
||||
rec.min_x = pixel_offset_x;
|
||||
rec.max_x = pixel_offset_x + 255;
|
||||
m_tmpbitmap.fill(m_palette->pen(m_current_palette[BACKDROP_COLOR]), rec);
|
||||
m_y1_bitmap.fill(1, rec);
|
||||
m_y1_bitmap.fill(( m_reg[0x07] & 0x0f ) ? 1 : 0, rec);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1361,13 +1366,13 @@ void sega315_5124_device::blit_scanline( int *line_buffer, int *priority_selecte
|
||||
UINT8 *p_y1 = &m_y1_bitmap.pix8(pixel_plot_y + line, pixel_offset_x);
|
||||
int x = 0;
|
||||
|
||||
if (m_vdp_mode == 4 && m_reg[0x00] & 0x20)
|
||||
if (m_vdp_mode == 4 && (m_reg[0x00] & 0x20))
|
||||
{
|
||||
/* Fill column 0 with overscan color from m_reg[0x07] */
|
||||
do
|
||||
{
|
||||
p_bitmap[x] = m_palette->pen(m_current_palette[BACKDROP_COLOR]);
|
||||
p_y1[x] = 1;
|
||||
p_y1[x] = ( m_reg[0x07] & 0x0f ) ? 1 : 0;
|
||||
}
|
||||
while(++x < 8);
|
||||
}
|
||||
@ -1375,7 +1380,7 @@ void sega315_5124_device::blit_scanline( int *line_buffer, int *priority_selecte
|
||||
do
|
||||
{
|
||||
p_bitmap[x] = m_palette->pen(line_buffer[x]);
|
||||
p_y1[x] = ( priority_selected[x] & 0x0f ) ? 0 : 1;
|
||||
p_y1[x] = ( priority_selected[x] & 0x0f ) ? 1 : 0;
|
||||
}
|
||||
while(++x < 256);
|
||||
}
|
||||
@ -1397,7 +1402,7 @@ void sega315_5378_device::blit_scanline( int *line_buffer, int *priority_selecte
|
||||
do
|
||||
{
|
||||
p_bitmap[x] = m_palette->pen(m_current_palette[BACKDROP_COLOR]);
|
||||
p_y1[x] = 1; // not verified
|
||||
p_y1[x] = ( m_reg[0x07] & 0x0f ) ? 1 : 0;
|
||||
}
|
||||
while (++x < 48);
|
||||
|
||||
@ -1406,7 +1411,7 @@ void sega315_5378_device::blit_scanline( int *line_buffer, int *priority_selecte
|
||||
do
|
||||
{
|
||||
p_bitmap[x] = m_palette->pen(line_buffer[x]);
|
||||
p_y1[x] = ( priority_selected[x] & 0x0f ) ? 0 : 1;
|
||||
p_y1[x] = ( priority_selected[x] & 0x0f ) ? 1 : 0;
|
||||
}
|
||||
while (++x < 208);
|
||||
}
|
||||
@ -1416,7 +1421,7 @@ void sega315_5378_device::blit_scanline( int *line_buffer, int *priority_selecte
|
||||
do
|
||||
{
|
||||
p_bitmap[x] = m_palette->pen(m_current_palette[BACKDROP_COLOR]);
|
||||
p_y1[x] = 1; // not verified
|
||||
p_y1[x] = ( m_reg[0x07] & 0x0f ) ? 1 : 0;
|
||||
}
|
||||
while (++x < 208);
|
||||
}
|
||||
@ -1425,7 +1430,7 @@ void sega315_5378_device::blit_scanline( int *line_buffer, int *priority_selecte
|
||||
do
|
||||
{
|
||||
p_bitmap[x] = m_palette->pen(m_current_palette[BACKDROP_COLOR]);
|
||||
p_y1[x] = 1; // not verified
|
||||
p_y1[x] = ( m_reg[0x07] & 0x0f ) ? 1 : 0;
|
||||
}
|
||||
while (++x < 256);
|
||||
}
|
||||
|
@ -956,8 +956,8 @@ UINT32 systeme_state::screen_update_systeme(screen_device &screen, bitmap_rgb32
|
||||
|
||||
for ( int x = cliprect.min_x; x <= cliprect.max_x; x++ )
|
||||
{
|
||||
dest_ptr[x] = ( y1_ptr[x] ) ? vdp1_ptr[x] : vdp2_ptr[x];
|
||||
//dest_ptr[x] = y1_ptr[x] ? 0xFF0000 : 0x00FF00;
|
||||
dest_ptr[x] = ( y1_ptr[x] ) ? vdp2_ptr[x] : vdp1_ptr[x];
|
||||
//dest_ptr[x] = y1_ptr[x] ? 0x00FF00 : 0xFF0000;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -14,6 +14,7 @@
|
||||
|
||||
- SIO interface for Game Gear (needs netplay, I guess)
|
||||
- Sega Demo Unit II (kiosk expansion device)
|
||||
- SMS 8 slot game changer (kiosk expansion device)
|
||||
- SMS Disk System (floppy disk drive expansion device) - unreleased
|
||||
- Rapid button of Japanese Master System
|
||||
- Keyboard support for Sega Mark III (sg1000m3 driver)
|
||||
@ -57,15 +58,15 @@ General compatibility issues on real hardware (not emulation bugs):
|
||||
- Few games of the ones with FM support need to detect the system region as
|
||||
Japanese to play FM sound;
|
||||
- The Light Phaser gun doesn't work with the Japanese SMS;
|
||||
- There are reports about Light Phaser working on the second Korean console
|
||||
- There are reports about Light Phaser working on the second Korean SMS
|
||||
version, and a Korean advert shows support on the first version (Gam*Boy I,
|
||||
although based on Japanese SMS);
|
||||
- The Korean SMS versions have Japanese-format cartridge slot, but only on the
|
||||
first (Gam*Boy I) the region is detected as Japanese;
|
||||
- Some SMS ROMs don't run when are plugged-in to SMS expansion slot, through
|
||||
the gender adapter;
|
||||
- Some SMS ROMs don't run when are plugged-in to a Game Gear, through the
|
||||
Master Gear adapter;
|
||||
- Some SMS ROMs don't run or have issues when are plugged-in to a Game Gear,
|
||||
through the Master Gear adapter;
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -405,6 +406,13 @@ static INPUT_PORTS_START( smsj )
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( smssdisp )
|
||||
// For each peripheral port (for controllers or 3-D glasses), there are sets
|
||||
// of two connectors wired in parallel on the real hardware. This allows to
|
||||
// have different controllers, like a pad and a Light Phaser, plugged together
|
||||
// for a player input, what avoids having to re-plug them every time a game is
|
||||
// changed to another that requires a different controller. Also, this allows
|
||||
// 3-D games to be properly watched by two persons at same time.
|
||||
// For now the driver just uses single input ports.
|
||||
PORT_INCLUDE( sms1 )
|
||||
|
||||
PORT_START("DSW")
|
||||
@ -805,9 +813,9 @@ static MACHINE_CONFIG_START( gamegear, sms_state )
|
||||
|
||||
MCFG_SOFTWARE_LIST_ADD("cart_list", "gamegear")
|
||||
|
||||
MCFG_GG_GEAR2GEAR_PORT_ADD("gear2gear", gg_gear2gear_port_devices, NULL)
|
||||
MCFG_GG_GEAR2GEAR_PORT_TH_INPUT_HANDLER(WRITELINE(sms_state, sms_ctrl2_th_input)) // not verified
|
||||
//MCFG_GG_GEAR2GEAR_PORT_PIXEL_HANDLER(READ32(sms_state, sms_pixel_color)) // only for GG-TV mod
|
||||
MCFG_GG_EXT_PORT_ADD("ext", gg_ext_port_devices, NULL)
|
||||
MCFG_GG_EXT_PORT_TH_INPUT_HANDLER(WRITELINE(sms_state, sms_ctrl2_th_input)) // not verified
|
||||
//MCFG_GG_EXT_PORT_PIXEL_HANDLER(READ32(sms_state, sms_pixel_color)) // only for GG-TV mod
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
||||
#define CONTROL1_TAG "ctrl1"
|
||||
#define CONTROL2_TAG "ctrl2"
|
||||
|
||||
#include "bus/gamegear/gear2gear.h"
|
||||
#include "bus/gamegear/ggext.h"
|
||||
#include "bus/sms_ctrl/smsctrl.h"
|
||||
#include "bus/sms_exp/smsexp.h"
|
||||
#include "bus/sega8/sega8_slot.h"
|
||||
@ -37,7 +37,7 @@ public:
|
||||
m_region_maincpu(*this, "maincpu"),
|
||||
m_port_ctrl1(*this, CONTROL1_TAG),
|
||||
m_port_ctrl2(*this, CONTROL2_TAG),
|
||||
m_port_gear2gear(*this, "gear2gear"),
|
||||
m_port_gg_ext(*this, "ext"),
|
||||
m_port_gg_dc(*this, "GG_PORT_DC"),
|
||||
m_port_pause(*this, "PAUSE"),
|
||||
m_port_reset(*this, "RESET"),
|
||||
@ -66,7 +66,7 @@ public:
|
||||
required_memory_region m_region_maincpu;
|
||||
optional_device<sms_control_port_device> m_port_ctrl1;
|
||||
optional_device<sms_control_port_device> m_port_ctrl2;
|
||||
optional_device<gg_gear2gear_port_device> m_port_gear2gear;
|
||||
optional_device<gg_ext_port_device> m_port_gg_ext;
|
||||
optional_ioport m_port_gg_dc;
|
||||
optional_ioport m_port_pause;
|
||||
optional_ioport m_port_reset;
|
||||
@ -75,25 +75,15 @@ public:
|
||||
optional_ioport m_port_scope_binocular;
|
||||
optional_ioport m_port_persist;
|
||||
|
||||
device_t *m_left_lcd;
|
||||
device_t *m_right_lcd;
|
||||
address_space *m_space;
|
||||
|
||||
UINT8 m_bios_page_count;
|
||||
UINT8 m_fm_detect;
|
||||
UINT8 m_io_ctrl_reg;
|
||||
int m_paused;
|
||||
UINT8 m_mem_ctrl_reg;
|
||||
UINT8 m_mem_device_enabled;
|
||||
UINT8 *m_mainram;
|
||||
UINT8 *m_BIOS;
|
||||
UINT8 m_mapper[4];
|
||||
UINT8 m_port_dc_reg;
|
||||
UINT8 m_port_dd_reg;
|
||||
UINT8 m_gg_sio[5];
|
||||
|
||||
// [0] for 0x400-0x3fff, [1] for 0x4000-0x7fff, [2] for 0x8000-0xffff, [3] for 0x0000-0x0400
|
||||
UINT8 m_bios_page[4];
|
||||
// for 3D glass binocular hack
|
||||
device_t *m_left_lcd;
|
||||
device_t *m_right_lcd;
|
||||
bitmap_rgb32 m_prevleft_bitmap;
|
||||
bitmap_rgb32 m_prevright_bitmap;
|
||||
|
||||
// for gamegear LCD persistence hack
|
||||
bitmap_rgb32 m_prev_bitmap;
|
||||
@ -105,10 +95,6 @@ public:
|
||||
// vertical scaling in the gamegear sms compatibility mode.
|
||||
int *m_line_buffer;
|
||||
|
||||
// for 3D glass binocular hack
|
||||
bitmap_rgb32 m_prevleft_bitmap;
|
||||
bitmap_rgb32 m_prevright_bitmap;
|
||||
|
||||
// model identifiers
|
||||
UINT8 m_is_gamegear;
|
||||
UINT8 m_is_gg_region_japan;
|
||||
@ -121,6 +107,20 @@ public:
|
||||
UINT8 m_has_fm;
|
||||
UINT8 m_has_jpn_sms_cart_slot;
|
||||
|
||||
// [0] for 0x400-0x3fff, [1] for 0x4000-0x7fff, [2] for 0x8000-0xffff, [3] for 0x0000-0x0400
|
||||
UINT8 m_bios_page[4];
|
||||
|
||||
UINT8 m_bios_page_count;
|
||||
UINT8 m_mapper[4];
|
||||
UINT8 m_io_ctrl_reg;
|
||||
UINT8 m_mem_ctrl_reg;
|
||||
UINT8 m_mem_device_enabled;
|
||||
UINT8 m_fm_detect;
|
||||
UINT8 m_port_dc_reg;
|
||||
UINT8 m_port_dd_reg;
|
||||
UINT8 m_gg_sio[5];
|
||||
int m_paused;
|
||||
|
||||
// Data needed for Light Phaser
|
||||
UINT8 m_ctrl1_th_state;
|
||||
UINT8 m_ctrl2_th_state;
|
||||
@ -132,32 +132,19 @@ public:
|
||||
UINT8 m_sscope_state;
|
||||
UINT8 m_frame_sscope_state;
|
||||
|
||||
// slot devices
|
||||
sega8_cart_slot_device *m_cartslot;
|
||||
sega8_card_slot_device *m_cardslot;
|
||||
sms_expansion_slot_device *m_expslot;
|
||||
|
||||
// these are only used by the Store Display unit, but we keep them here temporarily to avoid the need of separate start/reset
|
||||
UINT8 m_store_control;
|
||||
UINT8 m_store_cart_selection_data;
|
||||
sega8_cart_slot_device *m_slots[16];
|
||||
sega8_card_slot_device *m_cards[16];
|
||||
UINT8 m_store_control;
|
||||
UINT8 m_store_cart_selection_data;
|
||||
void store_post_load();
|
||||
void store_select_cart(UINT8 data);
|
||||
|
||||
/* Cartridge slot info */
|
||||
DECLARE_WRITE8_MEMBER(sms_fm_detect_w);
|
||||
DECLARE_READ8_MEMBER(sms_fm_detect_r);
|
||||
DECLARE_WRITE8_MEMBER(sms_io_control_w);
|
||||
DECLARE_READ8_MEMBER(sms_count_r);
|
||||
DECLARE_READ8_MEMBER(sms_input_port_dc_r);
|
||||
DECLARE_READ8_MEMBER(sms_input_port_dd_r);
|
||||
DECLARE_READ8_MEMBER(gg_input_port_00_r);
|
||||
DECLARE_WRITE8_MEMBER(sms_ym2413_register_port_w);
|
||||
DECLARE_WRITE8_MEMBER(sms_ym2413_data_port_w);
|
||||
DECLARE_READ8_MEMBER(sms_sscope_r);
|
||||
DECLARE_WRITE8_MEMBER(sms_sscope_w);
|
||||
DECLARE_READ8_MEMBER(sms_mapper_r);
|
||||
|
||||
DECLARE_READ8_MEMBER(read_0000);
|
||||
DECLARE_READ8_MEMBER(read_4000);
|
||||
DECLARE_READ8_MEMBER(read_8000);
|
||||
@ -165,10 +152,29 @@ public:
|
||||
DECLARE_WRITE8_MEMBER(write_ram);
|
||||
DECLARE_WRITE8_MEMBER(write_cart);
|
||||
|
||||
DECLARE_READ8_MEMBER(sms_mapper_r);
|
||||
DECLARE_WRITE8_MEMBER(sms_mapper_w);
|
||||
DECLARE_WRITE8_MEMBER(sms_mem_control_w);
|
||||
DECLARE_WRITE8_MEMBER(sms_io_control_w);
|
||||
DECLARE_READ8_MEMBER(sms_count_r);
|
||||
DECLARE_READ8_MEMBER(sms_input_port_dc_r);
|
||||
DECLARE_READ8_MEMBER(sms_input_port_dd_r);
|
||||
DECLARE_READ8_MEMBER(gg_input_port_00_r);
|
||||
DECLARE_WRITE8_MEMBER(gg_sio_w);
|
||||
DECLARE_READ8_MEMBER(gg_sio_r);
|
||||
DECLARE_WRITE8_MEMBER(sms_fm_detect_w);
|
||||
DECLARE_READ8_MEMBER(sms_fm_detect_r);
|
||||
DECLARE_WRITE8_MEMBER(sms_ym2413_register_port_w);
|
||||
DECLARE_WRITE8_MEMBER(sms_ym2413_data_port_w);
|
||||
DECLARE_READ8_MEMBER(sms_sscope_r);
|
||||
DECLARE_WRITE8_MEMBER(sms_sscope_w);
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(sms_int_callback);
|
||||
DECLARE_WRITE_LINE_MEMBER(sms_pause_callback);
|
||||
DECLARE_WRITE_LINE_MEMBER(sms_ctrl1_th_input);
|
||||
DECLARE_WRITE_LINE_MEMBER(sms_ctrl2_th_input);
|
||||
DECLARE_READ32_MEMBER(sms_pixel_color);
|
||||
|
||||
DECLARE_DRIVER_INIT(sg1000m3);
|
||||
DECLARE_DRIVER_INIT(gamegear);
|
||||
DECLARE_DRIVER_INIT(gamegeaj);
|
||||
@ -183,16 +189,12 @@ public:
|
||||
DECLARE_VIDEO_RESET(gamegear);
|
||||
DECLARE_VIDEO_START(sms1);
|
||||
DECLARE_VIDEO_RESET(sms1);
|
||||
void screen_gg_sms_mode_scaling(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
UINT32 screen_update_gamegear(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
|
||||
UINT32 screen_update_sms(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
UINT32 screen_update_sms1(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
UINT32 screen_update_gamegear(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
void screen_gg_sms_mode_scaling(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
void screen_vblank_sms1(screen_device &screen, bool state);
|
||||
DECLARE_WRITE_LINE_MEMBER(sms_int_callback);
|
||||
DECLARE_WRITE_LINE_MEMBER(sms_pause_callback);
|
||||
DECLARE_READ32_MEMBER(sms_pixel_color);
|
||||
DECLARE_WRITE_LINE_MEMBER(sms_ctrl1_th_input);
|
||||
DECLARE_WRITE_LINE_MEMBER(sms_ctrl2_th_input);
|
||||
|
||||
protected:
|
||||
UINT8 read_bus(address_space &space, unsigned int bank, UINT16 base_addr, UINT16 offset);
|
||||
|
@ -94,7 +94,7 @@ void sms_state::sms_get_inputs()
|
||||
data1 = m_port_gg_dc->read();
|
||||
m_port_dc_reg &= ~0x03f | data1;
|
||||
|
||||
data2 = m_port_gear2gear->port_r();
|
||||
data2 = m_port_gg_ext->port_r();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -207,7 +207,7 @@ WRITE8_MEMBER(sms_state::sms_io_control_w)
|
||||
if (!m_is_gamegear)
|
||||
m_port_ctrl2->port_w(ctrl2_port_data);
|
||||
else
|
||||
m_port_gear2gear->port_w(ctrl2_port_data); // not verified
|
||||
m_port_gg_ext->port_w(ctrl2_port_data); // not verified
|
||||
}
|
||||
// check if TH is set to input (1).
|
||||
if (data & 0x08)
|
||||
@ -215,7 +215,7 @@ WRITE8_MEMBER(sms_state::sms_io_control_w)
|
||||
if (!m_is_gamegear)
|
||||
ctrl2_port_data &= ~0x40 | m_port_ctrl2->port_r();
|
||||
else
|
||||
ctrl2_port_data &= ~0x40 | m_port_gear2gear->port_r(); // not verified
|
||||
ctrl2_port_data &= ~0x40 | m_port_gg_ext->port_r(); // not verified
|
||||
|
||||
// check if TH input level is high (1) and was output/low (0)
|
||||
if ((ctrl2_port_data & 0x40) && !(m_io_ctrl_reg & 0x88))
|
||||
|
Loading…
Reference in New Issue
Block a user