summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/drivers/sv8000.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/drivers/sv8000.c')
-rw-r--r--src/mess/drivers/sv8000.c131
1 files changed, 129 insertions, 2 deletions
diff --git a/src/mess/drivers/sv8000.c b/src/mess/drivers/sv8000.c
index d153b798269..e571cf34493 100644
--- a/src/mess/drivers/sv8000.c
+++ b/src/mess/drivers/sv8000.c
@@ -7,11 +7,24 @@
2014/01/07 Skeleton driver.
+The Bandai Supoer Vision 8000 contains:
+- NEC D78C (Z80)
+- AY-3-8910
+- AMI S68047P (6847 variant)
+- NEC D8255C
+
+Looking at the code of the cartridges it seems there is:
+- 1KB of main system RAM
+- 3KB of video RAM
+
TODO:
- - Implement S68074P video chip
- Figure out configuration of S68047P pins through 8910 port A
- Figure out input ports, left and right might be swapped
- Verify clock
+ - Figure out IRQ source
+
+ KNOWN ISSUES:
+ - pacpac and submar wait for an irq, where is that coming from? vblank?
****************************************************************************/
@@ -21,6 +34,7 @@
#include "imagedev/cartslot.h"
#include "machine/i8255.h"
#include "sound/ay8910.h"
+#include "video/mc6847.h"
class sv8000_state : public driver_device
@@ -29,12 +43,15 @@ public:
sv8000_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
+ , m_s68047p(*this, "s68047p")
+ , m_videoram(*this, "videoram")
, m_io_row0_left(*this, "ROW0_LEFT")
, m_io_row1_left(*this, "ROW1_LEFT")
, m_io_row2_left(*this, "ROW2_LEFT")
{ }
DECLARE_DEVICE_IMAGE_LOAD_MEMBER( cart );
+
DECLARE_READ8_MEMBER( ay_port_a_r );
DECLARE_READ8_MEMBER( ay_port_b_r );
DECLARE_WRITE8_MEMBER( ay_port_a_w );
@@ -47,16 +64,30 @@ public:
DECLARE_READ8_MEMBER( i8255_portc_r );
DECLARE_WRITE8_MEMBER( i8255_portc_w );
+ DECLARE_READ8_MEMBER( mc6847_videoram_r );
+
private:
virtual void machine_start();
virtual void machine_reset();
required_device<cpu_device> m_maincpu;
+ required_device<mc6847_base_device> m_s68047p;
+ required_shared_ptr<const UINT8> m_videoram;
required_ioport m_io_row0_left;
required_ioport m_io_row1_left;
required_ioport m_io_row2_left;
UINT8 m_column;
+
+ // graphics signals
+ UINT8 m_ag;
+ UINT8 m_gm2;
+ UINT8 m_gm1;
+ UINT8 m_gm0;
+ UINT8 m_as;
+ UINT8 m_css;
+ UINT8 m_intext;
+ UINT8 m_inv;
};
@@ -64,7 +95,7 @@ static ADDRESS_MAP_START(sv8000_mem, AS_PROGRAM, 8, sv8000_state)
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE( 0x0000, 0x0fff ) AM_ROM
AM_RANGE( 0x8000, 0x83ff ) AM_RAM // Work RAM??
- AM_RANGE( 0xc000, 0xcbff ) AM_RAM // Display RAM??
+ AM_RANGE( 0xc000, 0xcbff ) AM_RAM AM_SHARE("videoram")
ADDRESS_MAP_END
@@ -117,6 +148,15 @@ INPUT_PORTS_END
void sv8000_state::machine_start()
{
+ m_ag = 0;
+ m_gm2 = 0;
+ m_gm1 = 0;
+ m_gm0 = 0;
+ m_as = 0;
+ m_css = 0;
+ m_intext = 0;
+ m_inv = 0;
+
save_item(NAME(m_column));
}
@@ -241,14 +281,53 @@ READ8_MEMBER( sv8000_state::ay_port_b_r )
// Possibly connected to S68047P for selecting text/graphics modes
+// misvader:
+// 0x42 01000010 set on normal text screen
+// 0x5A 01011010 set for a 256x192 bit mapped screen 3KB in 6KB mode?
+//
+// spfire:
+// 0x42 01000010 text
+// 0x5A 01011010 graphics 3KB in 6KB mode?
+//
+// othello:
+// 0x02 00000010 normal text screen
+//
+// gunprof:
+// 0x00 00000000 text
+// 0x38 00111000 graphics 3KB mode 1-101
+//
+// pacpac:
+// 0x00 00000000 text
+// 0x5A 01011010 graphics 3KB in 6KB mode? 1-111
+//
+// submar:
+// 0x00 00000000 text
+// 0x5A 01011010 graphics 3KB in 6KB mode?
+//
+// beamgala:
+// 0x5A 01011010 graphics 3KB in 6KB mode?
+//
WRITE8_MEMBER( sv8000_state::ay_port_a_w )
{
+printf("ay_porta_w: %02X\n", data);
logerror("ay_port_a_w: %02X\n", data);
+
+ // Lacking schematics, these are all wild guesses
+ m_ag = ( data & 0x18 );
+ m_gm2 = ( data & 0x10 );
+ m_gm1 = ( data & 0x40 );
+ m_gm0 = ( data & 0x08 );
+
+ m_s68047p->ag_w( m_ag ? ASSERT_LINE : CLEAR_LINE );
+ m_s68047p->gm2_w( m_gm2 ? ASSERT_LINE : CLEAR_LINE );
+ m_s68047p->gm1_w( m_gm1 ? ASSERT_LINE : CLEAR_LINE );
+ m_s68047p->gm0_w( m_gm0 ? ASSERT_LINE : CLEAR_LINE );
}
WRITE8_MEMBER( sv8000_state::ay_port_b_w )
{
+printf("ay_portb_w: %02X\n", data);
logerror("ay_port_b_w: %02X\n", data);
}
@@ -264,6 +343,52 @@ static const ay8910_interface sv8000_ay8910_interface =
};
+READ8_MEMBER( sv8000_state::mc6847_videoram_r )
+{
+ if (offset == ~0) return 0xff;
+
+ if ( m_ag ) {
+ if ( m_gm1 ) {
+ // 256 x 192 / 6KB
+ offset = ( ( offset & 0x1fc0 ) >> 1 ) | ( offset & 0x1f );
+ return m_videoram[offset % 0xc00];
+ }
+ else
+ {
+ // 256 x 96 / 3KB
+ return m_videoram[offset % 0xc00];
+ }
+ }
+ // Standard text
+ UINT8 data = m_videoram[offset % 0xc00];
+
+ m_s68047p->inv_w( ( data & 0x80 ) ? ASSERT_LINE : CLEAR_LINE );
+
+ return data;
+}
+
+
+static const mc6847_interface sv8000_mc6847_interface =
+{
+ "screen",
+ DEVCB_DRIVER_MEMBER(sv8000_state,mc6847_videoram_r), // data fetch
+ DEVCB_NULL,
+ DEVCB_NULL,
+
+ DEVCB_NULL, /* AG */
+ DEVCB_NULL, /* GM2 */
+ DEVCB_NULL, /* GM1 */
+ DEVCB_NULL, /* GM0 */
+ DEVCB_NULL, /* CSS */
+ DEVCB_NULL, /* AS */
+ DEVCB_NULL, /* INTEXT */
+ DEVCB_NULL, /* INV */
+
+ NULL,
+ false
+};
+
+
static MACHINE_CONFIG_START( sv8000, sv8000_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu",Z80, XTAL_10_738635MHz/3) /* Not verified */
@@ -274,6 +399,8 @@ static MACHINE_CONFIG_START( sv8000, sv8000_state )
/* video hardware */
// S68047P - Unknown whether the internal or an external character rom is used
+ MCFG_MC6847_ADD("s68047p", MC6847_NTSC, XTAL_10_738635MHz/3, sv8000_mc6847_interface ) // Clock not verified
+ MCFG_SCREEN_MC6847_NTSC_ADD("screen", "s68047p")
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")