summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/epoch/scv.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/epoch/scv.cpp')
-rw-r--r--src/mame/epoch/scv.cpp748
1 files changed, 338 insertions, 410 deletions
diff --git a/src/mame/epoch/scv.cpp b/src/mame/epoch/scv.cpp
index 3c080552040..450d369b67f 100644
--- a/src/mame/epoch/scv.cpp
+++ b/src/mame/epoch/scv.cpp
@@ -4,11 +4,15 @@
Driver for Epoch Super Cassette Vision
+TODO:
+- verify video clock in European units.
+- verify raw video parameters.
+
***************************************************************************/
#include "emu.h"
+#include "cpu/upd177x/upd177x.h"
#include "cpu/upd7810/upd7810.h"
-#include "sound/upd1771.h"
#include "bus/scv/slot.h"
#include "bus/scv/rom.h"
#include "emupal.h"
@@ -38,179 +42,151 @@ public:
void scv_pal(machine_config &config);
protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
+ virtual void machine_start() override ATTR_COLD;
+ virtual void machine_reset() override ATTR_COLD;
TIMER_CALLBACK_MEMBER(vblank_update);
+ TIMER_CALLBACK_MEMBER(pa_w_update);
private:
- void porta_w(uint8_t data);
- uint8_t portb_r();
- uint8_t portc_r();
- void portc_w(uint8_t data);
- void upd1771_ack_w(int state);
void scv_palette(palette_device &palette) const;
- uint32_t screen_update_scv(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update_scv(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ void draw_sprite_part(bitmap_ind16 &bitmap, u8 x, u8 y, u8 pat, u8 col);
+ void draw_sprite(bitmap_ind16 &bitmap, u8 x, u8 y, u8 tile_idx, u8 col, bool left, bool right, bool top, bool bottom, u8 clip_y);
+ void draw_sprites(bitmap_ind16 &bitmap);
+ void draw_text(bitmap_ind16 &bitmap, u8 x, u8 y, u8 *char_data, u8 fg, uint8_t bg);
+ void draw_semi_graph(bitmap_ind16 &bitmap, u8 x, u8 y, u8 data, u8 fg);
+ void draw_block_graph(bitmap_ind16 &bitmap, u8 x, u8 y, u8 col);
- void plot_sprite_part(bitmap_ind16 &bitmap, uint8_t x, uint8_t y, uint8_t pat, uint8_t col, uint8_t screen_sprite_start_line);
- void draw_sprite(bitmap_ind16 &bitmap, uint8_t x, uint8_t y, uint8_t tile_idx, uint8_t col, uint8_t left, uint8_t right, uint8_t top, uint8_t bottom, uint8_t clip_y, uint8_t screen_sprite_start_line);
- void draw_text(bitmap_ind16 &bitmap, uint8_t x, uint8_t y, uint8_t *char_data, uint8_t fg, uint8_t bg);
- void draw_semi_graph(bitmap_ind16 &bitmap, uint8_t x, uint8_t y, uint8_t data, uint8_t fg);
- void draw_block_graph(bitmap_ind16 &bitmap, uint8_t x, uint8_t y, uint8_t col);
+ void scv_mem(address_map &map) ATTR_COLD;
- void scv_mem(address_map &map);
+ static const u8 s_spr_2col_lut0[16];
+ static const u8 s_spr_2col_lut1[16];
- uint8_t m_porta;
- uint8_t m_portc;
+ u8 m_porta;
+ u8 m_portc;
emu_timer *m_vb_timer;
- required_shared_ptr<uint8_t> m_videoram;
- required_device<cpu_device> m_maincpu;
+ required_shared_ptr<u8> m_videoram;
+ required_device<upd7801_device> m_maincpu;
required_device<screen_device> m_screen;
- required_device<upd1771c_device> m_upd1771c;
+ required_device<upd1771c_cpu_device> m_upd1771c;
required_device<scv_cart_slot_device> m_cart;
required_ioport_array<8> m_pa;
required_ioport m_pc0;
required_memory_region m_charrom;
+ emu_timer *m_pa_w_timer;
};
+const u8 scv_state::s_spr_2col_lut0[16] = {0, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 1, 1};
+const u8 scv_state::s_spr_2col_lut1[16] = {0, 1, 8, 11, 2, 3, 10, 9, 4, 5, 12, 13, 6, 7, 14, 15};
+
+
void scv_state::scv_mem(address_map &map)
{
map(0x0000, 0x0fff).rom(); // BIOS
- map(0x2000, 0x3403).ram().share("videoram"); // VRAM + 4 registers
- map(0x3600, 0x3600).w(m_upd1771c, FUNC(upd1771c_device::write));
+ map(0x2000, 0x3403).ram().share(m_videoram); // VRAM + 4 registers
+ map(0x3600, 0x3600).lw8(NAME([this] (u8 data) {
+ // With the current cores there are sync issues between writing and clearing PA in scv kungfurd when playing back adpcm.
+ // During a reset an OUT PA gets executed just around the same time when the main cpu is writing to PA.
+ // Since the OUT PA completes while the external write to PA is still in progress the external write to PA wins.
+ m_pa_w_timer->adjust(m_upd1771c->cycles_to_attotime(8), data);
+ }));
- map(0x8000, 0xff7f).rw(m_cart, FUNC(scv_cart_slot_device::read_cart), FUNC(scv_cart_slot_device::write_cart)); // cartridge
+ // 8000 - ff7f - Cartridge
+ // ff80 - ffff - CPU internal RAM
}
-static INPUT_PORTS_START( scv )
- PORT_START( "PA.0" )
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_8WAY
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_8WAY
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_8WAY
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_8WAY
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START( "PA.1" )
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_8WAY
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_8WAY
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_8WAY
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_8WAY
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START( "PA.2" )
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("0") PORT_CODE(KEYCODE_0_PAD)
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("1") PORT_CODE(KEYCODE_1_PAD)
-
- PORT_START( "PA.3" )
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("2") PORT_CODE(KEYCODE_2_PAD)
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("3") PORT_CODE(KEYCODE_3_PAD)
-
- PORT_START( "PA.4" )
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("4") PORT_CODE(KEYCODE_4_PAD)
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("5") PORT_CODE(KEYCODE_5_PAD)
-
- PORT_START( "PA.5" )
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("6") PORT_CODE(KEYCODE_6_PAD)
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("7") PORT_CODE(KEYCODE_7_PAD)
-
- PORT_START( "PA.6" )
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("8") PORT_CODE(KEYCODE_8_PAD)
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("9") PORT_CODE(KEYCODE_9_PAD)
-
- PORT_START( "PA.7" )
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Cl") PORT_CODE(KEYCODE_MINUS_PAD)
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("En") PORT_CODE(KEYCODE_PLUS_PAD)
-
- PORT_START( "PC0" )
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME(DEF_STR(Pause)) PORT_CODE(KEYCODE_O)
+static INPUT_PORTS_START(scv)
+ PORT_START("PA.0")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(1) PORT_8WAY
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(1) PORT_8WAY
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(1)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(2) PORT_8WAY
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(2) PORT_8WAY
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(2)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("PA.1" )
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(1) PORT_8WAY
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1) PORT_8WAY
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(1)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(2) PORT_8WAY
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2) PORT_8WAY
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(2)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("PA.2")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("0") PORT_CODE(KEYCODE_0_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("1") PORT_CODE(KEYCODE_1_PAD)
+
+ PORT_START("PA.3")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("2") PORT_CODE(KEYCODE_2_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("3") PORT_CODE(KEYCODE_3_PAD)
+
+ PORT_START("PA.4")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("4") PORT_CODE(KEYCODE_4_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("5") PORT_CODE(KEYCODE_5_PAD)
+
+ PORT_START("PA.5")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("6") PORT_CODE(KEYCODE_6_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("7") PORT_CODE(KEYCODE_7_PAD)
+
+ PORT_START("PA.6")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("8") PORT_CODE(KEYCODE_8_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("9") PORT_CODE(KEYCODE_9_PAD)
+
+ PORT_START("PA.7")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Cl") PORT_CODE(KEYCODE_MINUS_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("En") PORT_CODE(KEYCODE_PLUS_PAD)
+
+ PORT_START("PC0")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME(DEF_STR(Pause)) PORT_CODE(KEYCODE_O)
INPUT_PORTS_END
-void scv_state::porta_w(uint8_t data)
-{
- m_porta = data;
-}
-
-
-uint8_t scv_state::portb_r()
-{
- uint8_t data = 0xff;
-
- for (int i = 0; i < 8; i++)
- {
- if (!BIT(m_porta, i))
- data &= m_pa[i]->read();
- }
-
- return data;
-}
-
-
-uint8_t scv_state::portc_r()
-{
- uint8_t data = m_portc;
-
- data = (data & 0xfe) | (m_pc0->read() & 0x01);
-
- return data;
-}
-
-
-void scv_state::portc_w(uint8_t data)
-{
- //logerror("%04x: scv_portc_w: data = 0x%02x\n", m_maincpu->pc(), data );
- m_portc = data;
- m_cart->write_bank(m_portc);
- m_upd1771c->pcm_write(m_portc & 0x08);
-}
-
-
void scv_state::scv_palette(palette_device &palette) const
{
/*
@@ -263,11 +239,11 @@ void scv_state::scv_palette(palette_device &palette) const
}
-TIMER_CALLBACK_MEMBER( scv_state::vblank_update )
+TIMER_CALLBACK_MEMBER(scv_state::vblank_update)
{
int vpos = m_screen->vpos();
- switch ( vpos )
+ switch (vpos)
{
case 240:
m_maincpu->set_input_line(UPD7810_INTF2, ASSERT_LINE);
@@ -281,316 +257,248 @@ TIMER_CALLBACK_MEMBER( scv_state::vblank_update )
}
-inline void scv_state::plot_sprite_part( bitmap_ind16 &bitmap, uint8_t x, uint8_t y, uint8_t pat, uint8_t col, uint8_t screen_sprite_start_line )
+void scv_state::draw_sprite_part(bitmap_ind16 &bitmap, u8 x, u8 y, u8 pat, u8 col)
{
- if ((x >= 4) && ((y + 2) >= screen_sprite_start_line))
+ if (x >= 4)
{
x -= 4;
- if (pat & 0x08)
+ if (BIT(pat, 3))
bitmap.pix(y + 2, x) = col;
- if (pat & 0x04 && x < 255 )
+ if (BIT(pat, 2) && x < 255)
bitmap.pix(y + 2, x + 1) = col;
- if (pat & 0x02 && x < 254)
+ if (BIT(pat, 1) && x < 254)
bitmap.pix(y + 2, x + 2) = col;
- if (pat & 0x01 && x < 253)
+ if (BIT(pat, 0) && x < 253)
bitmap.pix(y + 2, x + 3) = col;
}
}
-inline void scv_state::draw_sprite( bitmap_ind16 &bitmap, uint8_t x, uint8_t y, uint8_t tile_idx, uint8_t col, uint8_t left, uint8_t right, uint8_t top, uint8_t bottom, uint8_t clip_y, uint8_t screen_sprite_start_line )
+void scv_state::draw_sprite(bitmap_ind16 &bitmap, u8 x, u8 y, u8 tile_idx, u8 col, bool left, bool right, bool top, bool bottom, u8 clip_y)
{
y += clip_y * 2;
for (int j = clip_y * 4; j < 32; j += 4, y += 2)
{
- uint8_t const pat0 = m_videoram[tile_idx * 32 + j + 0];
- uint8_t const pat1 = m_videoram[tile_idx * 32 + j + 1];
- uint8_t const pat2 = m_videoram[tile_idx * 32 + j + 2];
- uint8_t const pat3 = m_videoram[tile_idx * 32 + j + 3];
-
if ((top && (j < 16)) || (bottom && (j >= 16)))
{
if (left)
{
- plot_sprite_part(bitmap, x , y, pat0 >> 4, col, screen_sprite_start_line);
- plot_sprite_part(bitmap, x + 4, y, pat1 >> 4, col, screen_sprite_start_line);
+ const u8 pat0 = m_videoram[tile_idx * 32 + j + 0];
+ const u8 pat1 = m_videoram[tile_idx * 32 + j + 1];
+
+ draw_sprite_part(bitmap, x , y, pat0 >> 4, col);
+ draw_sprite_part(bitmap, x + 4, y, pat1 >> 4, col);
+ draw_sprite_part(bitmap, x , y + 1, pat0 & 0x0f, col);
+ draw_sprite_part(bitmap, x + 4, y + 1, pat1 & 0x0f, col);
}
if (right)
{
- plot_sprite_part(bitmap, x + 8, y, pat2 >> 4, col, screen_sprite_start_line);
- plot_sprite_part(bitmap, x + 12, y, pat3 >> 4, col, screen_sprite_start_line);
+ const u8 pat2 = m_videoram[tile_idx * 32 + j + 2];
+ const u8 pat3 = m_videoram[tile_idx * 32 + j + 3];
+
+ draw_sprite_part(bitmap, x + 8, y, pat2 >> 4, col);
+ draw_sprite_part(bitmap, x + 12, y, pat3 >> 4, col);
+ draw_sprite_part(bitmap, x + 8, y + 1, pat2 & 0x0f, col);
+ draw_sprite_part(bitmap, x + 12, y + 1, pat3 & 0x0f, col);
}
+ }
+ }
+}
- if (left)
+
+void scv_state::draw_sprites(bitmap_ind16 &bitmap)
+{
+ const u8 num_sprites = BIT(m_videoram[0x1400], 2) ? 64 : 128;
+
+ for (int i = 0; i < num_sprites; i++)
+ {
+ u8 spr_y = m_videoram[0x1200 + i * 4] & 0xfe;
+ u8 y_32 = BIT(m_videoram[0x1200 + i * 4], 0); // Xx32 sprite
+ u8 clip = m_videoram[0x1201 + i * 4] >> 4;
+ u8 col = m_videoram[0x1201 + i * 4] & 0x0f;
+ u8 spr_x = m_videoram[0x1202 + i * 4] & 0xfe;
+ u8 x_32 = BIT(m_videoram[0x1202 + i * 4], 0); // 32xX sprite
+ u8 tile_idx = m_videoram[0x1203 + i * 4] & 0x7f;
+ const bool half = BIT(m_videoram[0x1203 + i * 4], 7);
+ bool left = true;
+ bool right = true;
+ bool top = true;
+ bool bottom = true;
+
+ if (!col || !spr_y)
+ continue;
+
+ if (half)
+ {
+ if (BIT(tile_idx, 6))
{
- plot_sprite_part(bitmap, x , y + 1, pat0 & 0x0f, col, screen_sprite_start_line);
- plot_sprite_part(bitmap, x + 4, y + 1, pat1 & 0x0f, col, screen_sprite_start_line);
+ if (y_32)
+ {
+ spr_y -= 8;
+ top = false;
+ y_32 = 0;
+ }
+ else
+ bottom = false;
}
- if (right)
+ if (x_32)
{
- plot_sprite_part(bitmap, x + 8, y + 1, pat2 & 0x0f, col, screen_sprite_start_line);
- plot_sprite_part(bitmap, x + 12, y + 1, pat3 & 0x0f, col, screen_sprite_start_line);
+ spr_x -= 8;
+ left = false;
+ x_32 = 0;
+ }
+ else
+ right = false;
+ }
+
+ if (BIT(m_videoram[0x1400], 5) && BIT(i, 5))
+ {
+ // 2 color sprite handling
+ draw_sprite(bitmap, spr_x, spr_y, tile_idx, col, left, right, top, bottom, clip);
+ if (x_32 || y_32)
+ {
+ col = BIT(i, 4) ? s_spr_2col_lut1[col] : s_spr_2col_lut0[col];
+ tile_idx ^= (8 * x_32 + y_32);
+
+ draw_sprite(bitmap, spr_x, spr_y, tile_idx, col, left, right, top, bottom, clip);
+ }
+ }
+ else
+ {
+ // regular sprite handling
+ draw_sprite(bitmap, spr_x, spr_y, tile_idx, col, left, right, top, bottom, clip);
+ if (x_32)
+ draw_sprite(bitmap, spr_x + 16, spr_y, tile_idx | 8, col, 1, 1, top, bottom, clip);
+
+ if (y_32)
+ {
+ clip = BIT(clip, 3) ? (clip & 0x07) : 0;
+ draw_sprite(bitmap, spr_x, spr_y + 16, tile_idx | 1, col, left, right, 1, 1, clip);
+ if (x_32)
+ draw_sprite(bitmap, spr_x + 16, spr_y + 16, tile_idx | 9, col, 1, 1, 1, 1, clip);
}
}
}
}
-inline void scv_state::draw_text( bitmap_ind16 &bitmap, uint8_t x, uint8_t y, uint8_t *char_data, uint8_t fg, uint8_t bg )
+void scv_state::draw_text(bitmap_ind16 &bitmap, u8 x, u8 y, u8 *char_data, u8 fg, u8 bg)
{
- for ( int i = 0; i < 8; i++ )
+ for (int i = 0; i < 8; i++)
{
- uint8_t const d = char_data[i];
-
- bitmap.pix(y + i, x + 0 ) = ( d & 0x80 ) ? fg : bg;
- bitmap.pix(y + i, x + 1 ) = ( d & 0x40 ) ? fg : bg;
- bitmap.pix(y + i, x + 2 ) = ( d & 0x20 ) ? fg : bg;
- bitmap.pix(y + i, x + 3 ) = ( d & 0x10 ) ? fg : bg;
- bitmap.pix(y + i, x + 4 ) = ( d & 0x08 ) ? fg : bg;
- bitmap.pix(y + i, x + 5 ) = ( d & 0x04 ) ? fg : bg;
- bitmap.pix(y + i, x + 6 ) = ( d & 0x02 ) ? fg : bg;
- bitmap.pix(y + i, x + 7 ) = ( d & 0x01 ) ? fg : bg;
- }
+ const u8 d = char_data[i];
- for ( int i = 8; i < 16; i++ )
- {
- bitmap.pix(y + i, x + 0 ) = bg;
- bitmap.pix(y + i, x + 1 ) = bg;
- bitmap.pix(y + i, x + 2 ) = bg;
- bitmap.pix(y + i, x + 3 ) = bg;
- bitmap.pix(y + i, x + 4 ) = bg;
- bitmap.pix(y + i, x + 5 ) = bg;
- bitmap.pix(y + i, x + 6 ) = bg;
- bitmap.pix(y + i, x + 7 ) = bg;
+ for (int j = 0; j < 8; j++)
+ bitmap.pix(y + i, x + j) = (BIT(d, 7 - j)) ? fg : bg;
}
+ for (int i = 8; i < 16; i++)
+ for (int j = 0; j < 8; j++)
+ bitmap.pix(y + i, x + j) = bg;
}
-inline void scv_state::draw_semi_graph( bitmap_ind16 &bitmap, uint8_t x, uint8_t y, uint8_t data, uint8_t fg )
+void scv_state::draw_semi_graph(bitmap_ind16 &bitmap, u8 x, u8 y, u8 data, u8 fg)
{
- if ( ! data )
+ if (!data)
return;
- for ( int i = 0; i < 4; i++ )
- {
- bitmap.pix(y + i, x + 0) = fg;
- bitmap.pix(y + i, x + 1) = fg;
- bitmap.pix(y + i, x + 2) = fg;
- bitmap.pix(y + i, x + 3) = fg;
- }
+ for (int i = 0; i < 4; i++)
+ for (int j = 0; j < 4; j++)
+ bitmap.pix(y + i, x + j) = fg;
}
-inline void scv_state::draw_block_graph( bitmap_ind16 &bitmap, uint8_t x, uint8_t y, uint8_t col )
+void scv_state::draw_block_graph(bitmap_ind16 &bitmap, u8 x, u8 y, u8 col)
{
- for ( int i = 0; i < 8; i++ )
- {
- bitmap.pix(y + i, x + 0) = col;
- bitmap.pix(y + i, x + 1) = col;
- bitmap.pix(y + i, x + 2) = col;
- bitmap.pix(y + i, x + 3) = col;
- bitmap.pix(y + i, x + 4) = col;
- bitmap.pix(y + i, x + 5) = col;
- bitmap.pix(y + i, x + 6) = col;
- bitmap.pix(y + i, x + 7) = col;
- }
+ if (!col)
+ return;
+
+ for (int i = 0; i < 8; i++)
+ for (int j = 0; j < 8; j++)
+ bitmap.pix(y + i, x + j) = col;
}
-uint32_t scv_state::screen_update_scv(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 scv_state::screen_update_scv(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- int x, y;
- uint8_t fg = m_videoram[0x1403] >> 4;
- uint8_t bg = m_videoram[0x1403] & 0x0f;
- uint8_t gr_fg = m_videoram[0x1401] >> 4;
- uint8_t gr_bg = m_videoram[0x1401] & 0x0f;
- int clip_x = ( m_videoram[0x1402] & 0x0f ) * 2;
- int clip_y = m_videoram[0x1402] >> 4;
-
- /* Clear the screen */
- bitmap.fill(gr_bg , cliprect);
-
- /* Draw background */
- for ( y = 0; y < 16; y++ )
+ const u8 fg = m_videoram[0x1403] >> 4;
+ const u8 bg = m_videoram[0x1403] & 0x0f;
+ const u8 gr_fg = m_videoram[0x1401] >> 4;
+ const u8 gr_bg = m_videoram[0x1401] & 0x0f;
+ const int clip_x = (m_videoram[0x1402] & 0x0f) * 2;
+ const int clip_y = m_videoram[0x1402] >> 4;
+
+ // Clear the screen
+ bitmap.fill(gr_bg, cliprect);
+
+ // Draw background
+ for (int y = 0; y < 16; y++)
{
- int text_y = 0;
+ const bool text_y = (y < clip_y) ? !BIT(m_videoram[0x1400], 7) : BIT(m_videoram[0x1400], 7);
- if ( y < clip_y )
+ for (int x = 0; x < 32; x++)
{
- text_y = ( m_videoram[0x1400] & 0x80 ) ? 0 : 1;
- }
- else
- {
- text_y = ( m_videoram[0x1400] & 0x80 ) ? 1 : 0;
- }
+ const bool text_x = (x < clip_x) ? !BIT(m_videoram[0x1400], 6) : BIT(m_videoram[0x1400], 6);
+ const u8 d = m_videoram[0x1000 + y * 32 + x];
- for ( x = 0; x < 32; x++ )
- {
- int text_x = 0;
- uint8_t d = m_videoram[ 0x1000 + y * 32 + x ];
-
- if ( x < clip_x )
+ if (text_x && text_y)
{
- text_x = ( m_videoram[0x1400] & 0x40 ) ? 0 : 1;
+ // Text mode
+ uint8_t *char_data = m_charrom->base() + (d & 0x7f) * 8;
+ draw_text(bitmap, x * 8, y * 16, char_data, fg, bg);
}
else
{
- text_x = ( m_videoram[0x1400] & 0x40 ) ? 1 : 0;
- }
-
- if ( text_x && text_y )
- {
- /* Text mode */
- uint8_t *char_data = m_charrom->base() + ( d & 0x7f ) * 8;
- draw_text( bitmap, x * 8, y * 16, char_data, fg, bg );
- }
- else
- {
- switch ( m_videoram[0x1400] & 0x03 )
+ switch (m_videoram[0x1400] & 0x03)
{
- case 0x01: /* Semi graphics mode */
- draw_semi_graph( bitmap, x * 8 , y * 16 , d & 0x80, gr_fg );
- draw_semi_graph( bitmap, x * 8 + 4, y * 16 , d & 0x40, gr_fg );
- draw_semi_graph( bitmap, x * 8 , y * 16 + 4, d & 0x20, gr_fg );
- draw_semi_graph( bitmap, x * 8 + 4, y * 16 + 4, d & 0x10, gr_fg );
- draw_semi_graph( bitmap, x * 8 , y * 16 + 8, d & 0x08, gr_fg );
- draw_semi_graph( bitmap, x * 8 + 4, y * 16 + 8, d & 0x04, gr_fg );
- draw_semi_graph( bitmap, x * 8 , y * 16 + 12, d & 0x02, gr_fg );
- draw_semi_graph( bitmap, x * 8 + 4, y * 16 + 12, d & 0x01, gr_fg );
+ case 0x01: // Semi graphics mode
+ draw_semi_graph(bitmap, x * 8 , y * 16 , d & 0x80, gr_fg);
+ draw_semi_graph(bitmap, x * 8 + 4, y * 16 , d & 0x40, gr_fg);
+ draw_semi_graph(bitmap, x * 8 , y * 16 + 4, d & 0x20, gr_fg);
+ draw_semi_graph(bitmap, x * 8 + 4, y * 16 + 4, d & 0x10, gr_fg);
+ draw_semi_graph(bitmap, x * 8 , y * 16 + 8, d & 0x08, gr_fg);
+ draw_semi_graph(bitmap, x * 8 + 4, y * 16 + 8, d & 0x04, gr_fg);
+ draw_semi_graph(bitmap, x * 8 , y * 16 + 12, d & 0x02, gr_fg);
+ draw_semi_graph(bitmap, x * 8 + 4, y * 16 + 12, d & 0x01, gr_fg);
break;
- case 0x03: /* Block graphics mode */
- draw_block_graph( bitmap, x * 8, y * 16 , d >> 4 );
- draw_block_graph( bitmap, x * 8, y * 16 + 8, d & 0x0f );
+ case 0x03: // Block graphics mode
+ draw_block_graph(bitmap, x * 8, y * 16 , d >> 4);
+ draw_block_graph(bitmap, x * 8, y * 16 + 8, d & 0x0f);
break;
- default: /* Otherwise draw nothing? */
+ default: // Otherwise draw nothing?
break;
}
}
}
}
- /* Draw sprites if enabled */
- if ( m_videoram[0x1400] & 0x10 )
- {
- uint8_t screen_start_sprite_line = ( ( ( m_videoram[0x1400] & 0xf7 ) == 0x17 ) && ( ( m_videoram[0x1402] & 0xef ) == 0x4f ) ) ? 21 + 32 : 0 ;
- int i;
-
- for ( i = 0; i < 128; i++ )
- {
- uint8_t spr_y = m_videoram[ 0x1200 + i * 4 ] & 0xfe;
- uint8_t y_32 = m_videoram[ 0x1200 + i * 4 ] & 0x01; /* Xx32 sprite */
- uint8_t clip = m_videoram[ 0x1201 + i * 4 ] >> 4;
- uint8_t col = m_videoram[ 0x1201 + i * 4 ] & 0x0f;
- uint8_t spr_x = m_videoram[ 0x1202 + i * 4 ] & 0xfe;
- uint8_t x_32 = m_videoram[ 0x1202 + i * 4 ] & 0x01; /* 32xX sprite */
- uint8_t tile_idx = m_videoram[ 0x1203 + i * 4 ] & 0x7f;
- uint8_t half = m_videoram[ 0x1203 + i * 4] & 0x80;
- uint8_t left = 1;
- uint8_t right = 1;
- uint8_t top = 1;
- uint8_t bottom = 1;
-
- if ( !col )
- {
- continue;
- }
-
- if ( !spr_y )
- {
- continue;
- }
-
- if ( half )
- {
- if ( tile_idx & 0x40 )
- {
- if ( y_32 )
- {
- spr_y -= 8;
- top = 0;
- bottom = 1;
- y_32 = 0;
- }
- else
- {
- top = 1;
- bottom = 0;
- }
- }
- if ( x_32 )
- {
- spr_x -= 8;
- left = 0;
- right = 1;
- x_32 = 0;
- }
- else
- {
- left = 1;
- right = 0;
- }
- }
-
- /* Check if 2 color sprites are enabled */
- if ( ( m_videoram[0x1400] & 0x20 ) && ( i & 0x20 ) )
- {
- /* 2 color sprite handling */
- draw_sprite( bitmap, spr_x, spr_y, tile_idx, col, left, right, top, bottom, clip, screen_start_sprite_line );
- if ( x_32 || y_32 )
- {
- static const uint8_t spr_2col_lut0[16] = { 0, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 1, 1 };
- static const uint8_t spr_2col_lut1[16] = { 0, 1, 8, 11, 2, 3, 10, 9, 4, 5, 12, 13, 6, 7, 14, 15 };
-
- draw_sprite( bitmap, spr_x, spr_y, tile_idx ^ ( 8 * x_32 + y_32 ), ( i & 0x40 ) ? spr_2col_lut1[col] : spr_2col_lut0[col], left, right, top, bottom, clip, screen_start_sprite_line );
- }
- }
- else
- {
- /* regular sprite handling */
- draw_sprite( bitmap, spr_x, spr_y, tile_idx, col, left, right, top, bottom, clip, screen_start_sprite_line );
- if ( x_32 )
- {
- draw_sprite( bitmap, spr_x + 16, spr_y, tile_idx | 8, col, 1, 1, top, bottom, clip, screen_start_sprite_line );
- }
-
- if ( y_32 )
- {
- clip = ( clip & 0x08 ) ? ( clip & 0x07 ) : 0;
- draw_sprite( bitmap, spr_x, spr_y + 16, tile_idx | 1, col, left, right, 1, 1, clip, screen_start_sprite_line );
- if ( x_32 )
- {
- draw_sprite( bitmap, spr_x + 16, spr_y + 16, tile_idx | 9, col, 1, 1, 1, 1, clip, screen_start_sprite_line );
- }
- }
- }
- }
- }
+ if (BIT(m_videoram[0x1400], 4))
+ draw_sprites(bitmap);
return 0;
}
-void scv_state::upd1771_ack_w(int state)
+TIMER_CALLBACK_MEMBER(scv_state::pa_w_update)
{
- m_maincpu->set_input_line(UPD7810_INTF1, (state) ? ASSERT_LINE : CLEAR_LINE);
+ m_upd1771c->pa_w(param);
}
+
void scv_state::machine_start()
{
m_vb_timer = timer_alloc(FUNC(scv_state::vblank_update), this);
+ m_pa_w_timer = timer_alloc(FUNC(scv_state::pa_w_update), this);
save_item(NAME(m_porta));
save_item(NAME(m_portc));
- if (m_cart->exists())
- m_cart->save_ram();
-
}
@@ -600,22 +508,22 @@ void scv_state::machine_reset()
}
-/* F4 Character Displayer */
+// F4 Character Displayer
static const gfx_layout scv_charlayout =
{
- 8, 8, /* 8 x 8 characters */
- 128, /* 128 characters */
- 1, /* 1 bits per pixel */
- { 0 }, /* no bitplanes */
- /* x offsets */
- { 0, 1, 2, 3, 4, 5, 6, 7 },
- /* y offsets */
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
- 8*8 /* every char takes 8 bytes */
+ 8, 8, // 8 x 8 characters
+ 128, // 128 characters
+ 1, // 1 bits per pixel
+ {0}, // no bitplanes
+ // x offsets
+ {0, 1, 2, 3, 4, 5, 6, 7},
+ // y offsets
+ {0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8},
+ 8*8 // every char takes 8 bytes
};
-static GFXDECODE_START( gfx_scv )
- GFXDECODE_ENTRY( "charrom", 0x0000, scv_charlayout, 0, 8 )
+static GFXDECODE_START(gfx_scv)
+ GFXDECODE_ENTRY("charrom", 0x0000, scv_charlayout, 0, 8)
GFXDECODE_END
@@ -632,31 +540,47 @@ static void scv_cart(device_slot_interface &device)
void scv_state::scv(machine_config &config)
{
- upd7801_device &upd(UPD7801(config, m_maincpu, 4_MHz_XTAL));
- upd.set_addrmap(AS_PROGRAM, &scv_state::scv_mem);
- upd.pa_out_cb().set(FUNC(scv_state::porta_w));
- upd.pb_in_cb().set(FUNC(scv_state::portb_r));
- upd.pc_in_cb().set(FUNC(scv_state::portc_r));
- upd.pc_out_cb().set(FUNC(scv_state::portc_w));
-
- /* Video chip is EPOCH TV-1 */
+ UPD7801(config, m_maincpu, 4_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &scv_state::scv_mem);
+ m_maincpu->pa_out_cb().set([this] (u8 data) { m_porta = data; });
+ m_maincpu->pb_in_cb().set([this] () {
+ u8 data = 0xff;
+
+ for (int i = 0; i < 8; i++)
+ if (!BIT(m_porta, i))
+ data &= m_pa[i]->read();
+
+ return data;
+ });
+ m_maincpu->pc_in_cb().set([this] () {
+ return BIT(m_pc0->read(), 0);
+ });
+ m_maincpu->pc_out_cb().set([this] (u8 data) {
+ m_portc = data;
+ m_cart->write_bank(m_portc); // Only bits 5 & 6 are exposed to the cartridge?
+ m_upd1771c->set_input_line(INPUT_LINE_RESET, BIT(m_portc, 3) ? CLEAR_LINE : ASSERT_LINE);
+ });
+ config.set_perfect_quantum(m_maincpu);
+
+ // Video chip is EPOCH TV-1
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
- m_screen->set_raw(XTAL(14'318'181)/2, 456, 24, 24+192, 262, 23, 23+222); // TODO: Verify
+ m_screen->set_raw(XTAL(14'318'181)/2, 456, 24, 24+192, 262, 23, 23+222); // Clock verified. TODO: Verify rest of the parameters
m_screen->set_screen_update(FUNC(scv_state::screen_update_scv));
m_screen->set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_scv);
PALETTE(config, "palette", FUNC(scv_state::scv_palette), 16);
- /* Sound is generated by UPD1771C clocked at XTAL(6'000'000) */
+ // Sound is generated by UPD1771C clocked at XTAL(6'000'000)
SPEAKER(config, "mono").front_center();
UPD1771C(config, m_upd1771c, 6_MHz_XTAL);
- m_upd1771c->ack_handler().set(FUNC(scv_state::upd1771_ack_w));
- m_upd1771c->add_route(ALL_OUTPUTS, "mono", 1.00);
+ m_upd1771c->pb_out_cb().set([this] (u8 data) { m_maincpu->set_input_line(UPD7810_INTF1, BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE); });
+ m_upd1771c->add_route(ALL_OUTPUTS, "mono", 0.70);
SCV_CART_SLOT(config, m_cart, scv_cart, nullptr);
+ m_cart->set_address_space(m_maincpu, AS_PROGRAM);
- /* Software lists */
+ // Software lists
SOFTWARE_LIST(config, "cart_list").set_original("scv");
}
@@ -665,34 +589,38 @@ void scv_state::scv_pal(machine_config &config)
{
scv(config);
- m_maincpu->set_clock(3780000);
-
// Video chip is EPOCH TV-1A
- m_screen->set_raw(13.4_MHz_XTAL/2, 456, 24, 24+192, 342, 23, 23+222); // TODO: Verify
+ m_screen->set_raw(13.4_MHz_XTAL/2, 456, 24, 24+192, 294, 23, 23+222); // TODO: Verify clock and video parameters
}
-/* The same bios is used in both the NTSC and PAL versions of the console */
-ROM_START( scv )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "upd7801g.s01", 0, 0x1000, CRC(7ac06182) SHA1(6e89d1227581c76441a53d605f9e324185f1da33) )
+// The same bios is used in both the NTSC and PAL versions of the console
+ROM_START(scv)
+ ROM_REGION(0x1000, "maincpu", 0)
+ ROM_LOAD("upd7801g.s01", 0, 0x1000, CRC(7ac06182) SHA1(6e89d1227581c76441a53d605f9e324185f1da33))
+
+ ROM_REGION(0x400, "charrom", 0)
+ ROM_LOAD("epochtv.chr.s02", 0, 0x400, BAD_DUMP CRC(db521533) SHA1(40b4e44838c35191f115437a14f200f052e71509))
- ROM_REGION( 0x400, "charrom", 0 )
- ROM_LOAD( "epochtv.chr", 0, 0x400, BAD_DUMP CRC(db521533) SHA1(40b4e44838c35191f115437a14f200f052e71509) )
+ ROM_REGION(0x400, "upd1771c", 0)
+ ROM_LOAD16_WORD("upd1771c-017.s03", 0, 0x400, CRC(975bd68d) SHA1(e777217c622331677ac1d6520a741d48ad9133c0))
ROM_END
-ROM_START( scv_pal )
- ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "upd7801g.s01", 0, 0x1000, CRC(7ac06182) SHA1(6e89d1227581c76441a53d605f9e324185f1da33) )
+ROM_START(scv_pal)
+ ROM_REGION(0x1000, "maincpu", 0)
+ ROM_LOAD("upd7801g.s01", 0, 0x1000, CRC(7ac06182) SHA1(6e89d1227581c76441a53d605f9e324185f1da33))
+
+ ROM_REGION(0x400, "charrom", 0)
+ ROM_LOAD("epochtv.chr.s02", 0, 0x400, BAD_DUMP CRC(db521533) SHA1(40b4e44838c35191f115437a14f200f052e71509))
- ROM_REGION( 0x400, "charrom", 0 )
- ROM_LOAD( "epochtv.chr", 0, 0x400, BAD_DUMP CRC(db521533) SHA1(40b4e44838c35191f115437a14f200f052e71509) )
+ ROM_REGION(0x400, "upd1771c", 0)
+ ROM_LOAD16_WORD("upd1771c-017.s03", 0, 0x400, CRC(975bd68d) SHA1(e777217c622331677ac1d6520a741d48ad9133c0))
ROM_END
} // anonymous namespace
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-CONS( 1984, scv, 0, 0, scv, scv, scv_state, empty_init, "Epoch", "Super Cassette Vision", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-CONS( 198?, scv_pal, scv, 0, scv_pal, scv, scv_state, empty_init, "Yeno", "Super Cassette Vision (PAL)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+CONS(1984, scv, 0, 0, scv, scv, scv_state, empty_init, "Epoch", "Super Cassette Vision", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE)
+CONS(198?, scv_pal, scv, 0, scv_pal, scv, scv_state, empty_init, "Yeno", "Super Cassette Vision (PAL)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE)