mirror of
https://github.com/holub/mame
synced 2025-07-01 16:19:38 +03:00
svision/svision.cpp: split into subclasses
This commit is contained in:
parent
cd67fd60ff
commit
1168ab8b17
@ -2144,12 +2144,13 @@ ROM_START( wintbob )
|
|||||||
/* The wb03.bin below is bad, the set has a different copyright message (IN KOREA is replaced with 1990)
|
/* The wb03.bin below is bad, the set has a different copyright message (IN KOREA is replaced with 1990)
|
||||||
but also clearly suffers from bitrot at the following addresses
|
but also clearly suffers from bitrot at the following addresses
|
||||||
4FC2, 5F02, 6642, D6C2, D742
|
4FC2, 5F02, 6642, D6C2, D742
|
||||||
in all cases bit 0x20 is incorrectly set in the bad rom
|
in all cases bit 0x20 is incorrectly set in the bad ROM
|
||||||
|
ROM_LOAD16_BYTE( "wb03.bin", 0x00000, 0x10000, CRC(df56e168) SHA1(20dbabdd97e6f3d4bf6500bf9e8476942cb48ae3) )
|
||||||
|
ROM_LOAD16_BYTE( "wb01.bin", 0x00001, 0x10000, CRC(05722f17) SHA1(9356e2488ea35e0a2978689f2ca6dfa0d57fd2ed) )
|
||||||
|
A dump from a different PCB confirmed the above. Correct ROM for this copyright message hack is
|
||||||
|
ROM_LOAD16_BYTE( "wb03.bin", 0x00000, 0x10000, CRC(e2ae422b) SHA1(526abf88747a00527047ec578a20be36f25af257) )
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// ROM_LOAD16_BYTE( "wb03.bin", 0x00000, 0x10000, CRC(df56e168) SHA1(20dbabdd97e6f3d4bf6500bf9e8476942cb48ae3) )
|
|
||||||
// ROM_LOAD16_BYTE( "wb01.bin", 0x00001, 0x10000, CRC(05722f17) SHA1(9356e2488ea35e0a2978689f2ca6dfa0d57fd2ed) )
|
|
||||||
|
|
||||||
ROM_LOAD16_BYTE( "wb04.bin", 0x20000, 0x10000, CRC(53be758d) SHA1(56cf85ba23fe699031d73e8f367a1b8ac837d5f8) )
|
ROM_LOAD16_BYTE( "wb04.bin", 0x20000, 0x10000, CRC(53be758d) SHA1(56cf85ba23fe699031d73e8f367a1b8ac837d5f8) )
|
||||||
ROM_LOAD16_BYTE( "wb02.bin", 0x20001, 0x10000, CRC(fc8e292e) SHA1(857cfeb0be121e64e6117120514ae1f2ffeae4d6) )
|
ROM_LOAD16_BYTE( "wb02.bin", 0x20001, 0x10000, CRC(fc8e292e) SHA1(857cfeb0be121e64e6117120514ae1f2ffeae4d6) )
|
||||||
|
|
||||||
|
@ -48,26 +48,18 @@ public:
|
|||||||
, m_videoram(*this, "videoram")
|
, m_videoram(*this, "videoram")
|
||||||
, m_screen(*this, "screen")
|
, m_screen(*this, "screen")
|
||||||
, m_joy(*this, "JOY")
|
, m_joy(*this, "JOY")
|
||||||
, m_joy2(*this, "JOY2")
|
|
||||||
, m_palette(*this, "palette")
|
, m_palette(*this, "palette")
|
||||||
, m_bank(*this, "bank%u", 1U)
|
, m_bank(*this, "bank%u", 1U)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
void svisionp(machine_config &config);
|
void svisionp(machine_config &config);
|
||||||
void svisions(machine_config &config);
|
|
||||||
void tvlinkp(machine_config &config);
|
|
||||||
void svision(machine_config &config);
|
void svision(machine_config &config);
|
||||||
void svisionn(machine_config &config);
|
void svisionn(machine_config &config);
|
||||||
void svision_base(machine_config &config);
|
|
||||||
|
|
||||||
void init_svisions();
|
|
||||||
void init_svision();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void machine_start() override;
|
virtual void machine_start() override;
|
||||||
virtual void machine_reset() override;
|
virtual void machine_reset() override;
|
||||||
|
|
||||||
private:
|
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
required_device<svision_sound_device> m_sound;
|
required_device<svision_sound_device> m_sound;
|
||||||
required_device<generic_slot_device> m_cart;
|
required_device<generic_slot_device> m_cart;
|
||||||
@ -75,7 +67,6 @@ private:
|
|||||||
required_shared_ptr<uint8_t> m_videoram;
|
required_shared_ptr<uint8_t> m_videoram;
|
||||||
required_device<screen_device> m_screen;
|
required_device<screen_device> m_screen;
|
||||||
required_ioport m_joy;
|
required_ioport m_joy;
|
||||||
optional_ioport m_joy2;
|
|
||||||
required_device<palette_device> m_palette;
|
required_device<palette_device> m_palette;
|
||||||
|
|
||||||
required_memory_bank_array<2> m_bank;
|
required_memory_bank_array<2> m_bank;
|
||||||
@ -90,94 +81,119 @@ private:
|
|||||||
BANK = 0x26,
|
BANK = 0x26,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct svision_t
|
emu_timer *m_timer1 = nullptr;
|
||||||
{
|
uint8_t m_timer_shot = 0;
|
||||||
emu_timer *timer1 = nullptr;
|
|
||||||
uint8_t timer_shot = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct svision_pet_t
|
|
||||||
{
|
|
||||||
uint8_t state = 0;
|
|
||||||
uint8_t on = 0, clock = 0, data = 0;
|
|
||||||
uint8_t input = 0;
|
|
||||||
emu_timer *timer = nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct tvlink_t
|
|
||||||
{
|
|
||||||
uint32_t palette[4]; // 0x40? rgb8
|
|
||||||
uint8_t palette_on;
|
|
||||||
};
|
|
||||||
|
|
||||||
svision_t m_svision;
|
|
||||||
svision_pet_t m_pet;
|
|
||||||
tvlink_t m_tvlink;
|
|
||||||
bool m_dma_finished = false;
|
bool m_dma_finished = false;
|
||||||
|
|
||||||
DECLARE_WRITE_LINE_MEMBER(sound_irq_w);
|
DECLARE_WRITE_LINE_MEMBER(sound_irq_w);
|
||||||
uint8_t regs_r(offs_t offset);
|
uint8_t regs_r(offs_t offset);
|
||||||
void regs_w(offs_t offset, uint8_t data);
|
void regs_w(offs_t offset, uint8_t data);
|
||||||
uint8_t tvlink_r(offs_t offset);
|
|
||||||
void tvlink_w(offs_t offset, uint8_t data);
|
|
||||||
|
|
||||||
uint32_t screen_update_svision(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||||
uint32_t screen_update_tvlink(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
|
||||||
DECLARE_WRITE_LINE_MEMBER(frame_int_w);
|
DECLARE_WRITE_LINE_MEMBER(frame_int_w);
|
||||||
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
|
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
|
||||||
|
|
||||||
void svision_palette(palette_device &palette) const;
|
void svision_palette(palette_device &palette) const;
|
||||||
void svisionp_palette(palette_device &palette) const;
|
void svisionp_palette(palette_device &palette) const;
|
||||||
void svisionn_palette(palette_device &palette) const;
|
void svisionn_palette(palette_device &palette) const;
|
||||||
DECLARE_MACHINE_RESET(tvlink);
|
|
||||||
|
|
||||||
uint32_t make8_rgb32(uint8_t red3, uint8_t green3, uint8_t blue2) { return (red3 << (16 + 5)) | (green3 << (8 + 5)) | (blue2 << (0 + 6)); }
|
[[maybe_unused]] static constexpr uint32_t make8_rgb32(uint8_t red3, uint8_t green3, uint8_t blue2) { return (red3 << (16 + 5)) | (green3 << (8 + 5)) | (blue2 << (0 + 6)); }
|
||||||
uint32_t make9_rgb32(uint8_t red3, uint8_t green3, uint8_t blue3) { return (red3 << (16 + 5)) | (green3 << (8 + 5)) | (blue3 << (0 + 5)); }
|
static constexpr uint32_t make9_rgb32(uint8_t red3, uint8_t green3, uint8_t blue3) { return (red3 << (16 + 5)) | (green3 << (8 + 5)) | (blue3 << (0 + 5)); }
|
||||||
uint32_t make12_rgb32(uint8_t red4, uint8_t green4, uint8_t blue4) { return (red4 << (16 + 4)) | (green4 << (8 + 4)) | (blue4 << (0 + 4)); }
|
static constexpr uint32_t make12_rgb32(uint8_t red4, uint8_t green4, uint8_t blue4) { return (red4 << (16 + 4)) | (green4 << (8 + 4)) | (blue4 << (0 + 4)); }
|
||||||
uint32_t make24_rgb32(uint8_t red8, uint8_t green8, uint8_t blue8) { return ((red8 & 0xf8) << 16) | ((green8 & 0xf8) << 8) | (blue8 & 0xf8); }
|
static constexpr uint32_t make24_rgb32(uint8_t red8, uint8_t green8, uint8_t blue8) { return ((red8 & 0xf8) << 16) | ((green8 & 0xf8) << 8) | (blue8 & 0xf8); }
|
||||||
|
|
||||||
void check_irq();
|
void check_irq();
|
||||||
|
|
||||||
TIMER_CALLBACK_MEMBER(svision_pet_timer);
|
TIMER_CALLBACK_MEMBER(timer);
|
||||||
TIMER_CALLBACK_MEMBER(svision_timer);
|
|
||||||
TIMER_DEVICE_CALLBACK_MEMBER(svision_pet_timer_dev);
|
|
||||||
|
|
||||||
void svision_mem(address_map &map);
|
void program_map(address_map &map);
|
||||||
void tvlink_mem(address_map &map);
|
|
||||||
|
void svision_base(machine_config &config);
|
||||||
};
|
};
|
||||||
|
|
||||||
TIMER_CALLBACK_MEMBER(svision_state::svision_pet_timer)
|
class svisions_state : public svision_state
|
||||||
{
|
{
|
||||||
switch (m_pet.state)
|
public:
|
||||||
|
svisions_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||||
|
: svision_state(mconfig, type, tag)
|
||||||
|
, m_joy2(*this, "JOY2")
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void svisions(machine_config &config);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void machine_start() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
required_ioport m_joy2;
|
||||||
|
|
||||||
|
uint8_t m_state = 0;
|
||||||
|
uint8_t m_clock = 0, m_data = 0;
|
||||||
|
uint8_t m_input = 0;
|
||||||
|
emu_timer *m_timer = nullptr;
|
||||||
|
|
||||||
|
uint8_t regs_r(offs_t offset);
|
||||||
|
|
||||||
|
TIMER_CALLBACK_MEMBER(pet_timer);
|
||||||
|
TIMER_DEVICE_CALLBACK_MEMBER(pet_timer_dev);
|
||||||
|
|
||||||
|
void program_map(address_map &map);
|
||||||
|
};
|
||||||
|
|
||||||
|
class tvlink_state : public svision_state
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
tvlink_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||||
|
: svision_state(mconfig, type, tag)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void tvlinkp(machine_config &config);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void machine_start() override;
|
||||||
|
virtual void machine_reset() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint32_t m_tvlink_palette[4]{}; // 0x40? rgb8
|
||||||
|
uint8_t m_palette_on = 0;
|
||||||
|
|
||||||
|
uint8_t regs_r(offs_t offset);
|
||||||
|
void regs_w(offs_t offset, uint8_t data);
|
||||||
|
|
||||||
|
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||||
|
|
||||||
|
void program_map(address_map &map);
|
||||||
|
};
|
||||||
|
|
||||||
|
TIMER_CALLBACK_MEMBER(svisions_state::pet_timer)
|
||||||
|
{
|
||||||
|
switch (m_state)
|
||||||
{
|
{
|
||||||
case 0x00:
|
case 0x00:
|
||||||
if (m_joy2.found())
|
m_input = m_joy2->read();
|
||||||
{
|
|
||||||
m_pet.input = m_joy2->read();
|
|
||||||
}
|
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
|
|
||||||
case 0x02: case 0x04: case 0x06: case 0x08:
|
case 0x02: case 0x04: case 0x06: case 0x08:
|
||||||
case 0x0a: case 0x0c: case 0x0e:
|
case 0x0a: case 0x0c: case 0x0e:
|
||||||
m_pet.clock = m_pet.state & 2;
|
m_clock = m_state & 2;
|
||||||
m_pet.data = m_pet.input & 1;
|
m_data = m_input & 1;
|
||||||
m_pet.input >>= 1;
|
m_input >>= 1;
|
||||||
m_pet.state++;
|
m_state++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x1f:
|
case 0x1f:
|
||||||
m_pet.state = 0;
|
m_state = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
m_pet.state++;
|
m_state++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TIMER_DEVICE_CALLBACK_MEMBER(svision_state::svision_pet_timer_dev)
|
TIMER_DEVICE_CALLBACK_MEMBER(svisions_state::pet_timer_dev)
|
||||||
{
|
{
|
||||||
svision_pet_timer(param);
|
pet_timer(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE_LINE_MEMBER(svision_state::sound_irq_w)
|
WRITE_LINE_MEMBER(svision_state::sound_irq_w)
|
||||||
@ -188,16 +204,16 @@ WRITE_LINE_MEMBER(svision_state::sound_irq_w)
|
|||||||
|
|
||||||
void svision_state::check_irq()
|
void svision_state::check_irq()
|
||||||
{
|
{
|
||||||
bool irq = m_svision.timer_shot && BIT(m_reg[BANK], 1);
|
bool irq = m_timer_shot && BIT(m_reg[BANK], 1);
|
||||||
irq = irq || (m_dma_finished && BIT(m_reg[BANK], 2));
|
irq = irq || (m_dma_finished && BIT(m_reg[BANK], 2));
|
||||||
|
|
||||||
m_maincpu->set_input_line(M65C02_IRQ_LINE, irq ? ASSERT_LINE : CLEAR_LINE);
|
m_maincpu->set_input_line(M65C02_IRQ_LINE, irq ? ASSERT_LINE : CLEAR_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
TIMER_CALLBACK_MEMBER(svision_state::svision_timer)
|
TIMER_CALLBACK_MEMBER(svision_state::timer)
|
||||||
{
|
{
|
||||||
m_svision.timer_shot = true;
|
m_timer_shot = true;
|
||||||
m_svision.timer1->enable(false);
|
m_timer1->enable(false);
|
||||||
check_irq();
|
check_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,22 +228,11 @@ uint8_t svision_state::regs_r(offs_t offset)
|
|||||||
case 0x21:
|
case 0x21:
|
||||||
data &= ~0xf;
|
data &= ~0xf;
|
||||||
data |= m_reg[0x22] & 0xf;
|
data |= m_reg[0x22] & 0xf;
|
||||||
if (m_pet.on)
|
|
||||||
{
|
|
||||||
if (!m_pet.clock)
|
|
||||||
{
|
|
||||||
data &= ~4;
|
|
||||||
}
|
|
||||||
if (!m_pet.data)
|
|
||||||
{
|
|
||||||
data &= ~8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x27:
|
case 0x27:
|
||||||
data &= ~3;
|
data &= ~3;
|
||||||
if (m_svision.timer_shot)
|
if (m_timer_shot)
|
||||||
{
|
{
|
||||||
data |= 1;
|
data |= 1;
|
||||||
}
|
}
|
||||||
@ -238,7 +243,58 @@ uint8_t svision_state::regs_r(offs_t offset)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x24:
|
case 0x24:
|
||||||
m_svision.timer_shot = false;
|
m_timer_shot = false;
|
||||||
|
check_irq();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x25:
|
||||||
|
m_dma_finished = false;
|
||||||
|
check_irq();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
LOGREGS("%.6f svision read %04x %02x\n", machine().time().as_double(), offset, data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t svisions_state::regs_r(offs_t offset)
|
||||||
|
{
|
||||||
|
int data = m_reg[offset];
|
||||||
|
switch (offset)
|
||||||
|
{
|
||||||
|
case 0x20:
|
||||||
|
return m_joy->read();
|
||||||
|
|
||||||
|
case 0x21:
|
||||||
|
data &= ~0xf;
|
||||||
|
data |= m_reg[0x22] & 0xf;
|
||||||
|
if (!m_clock)
|
||||||
|
{
|
||||||
|
data &= ~4;
|
||||||
|
}
|
||||||
|
if (!m_data)
|
||||||
|
{
|
||||||
|
data &= ~8;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x27:
|
||||||
|
data &= ~3;
|
||||||
|
if (m_timer_shot)
|
||||||
|
{
|
||||||
|
data |= 1;
|
||||||
|
}
|
||||||
|
if (m_dma_finished)
|
||||||
|
{
|
||||||
|
data |= 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x24:
|
||||||
|
m_timer_shot = false;
|
||||||
check_irq();
|
check_irq();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -278,8 +334,8 @@ void svision_state::regs_w(offs_t offset, uint8_t data)
|
|||||||
{
|
{
|
||||||
int delay = (data == 0) ? 0x100 : data;
|
int delay = (data == 0) ? 0x100 : data;
|
||||||
delay *= (BIT(m_reg[BANK], 4)) ? 0x4000 : 0x100;
|
delay *= (BIT(m_reg[BANK], 4)) ? 0x4000 : 0x100;
|
||||||
m_svision.timer1->enable(true);
|
m_timer1->enable(true);
|
||||||
m_svision.timer1->reset(m_maincpu->cycles_to_attotime(delay));
|
m_timer1->reset(m_maincpu->cycles_to_attotime(delay));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -305,7 +361,7 @@ void svision_state::regs_w(offs_t offset, uint8_t data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t svision_state::tvlink_r(offs_t offset)
|
uint8_t tvlink_state::regs_r(offs_t offset)
|
||||||
{
|
{
|
||||||
switch(offset)
|
switch(offset)
|
||||||
{
|
{
|
||||||
@ -313,41 +369,41 @@ uint8_t svision_state::tvlink_r(offs_t offset)
|
|||||||
if (offset >= 0x800 && offset < 0x840)
|
if (offset >= 0x800 && offset < 0x840)
|
||||||
{
|
{
|
||||||
// strange effects when modifying palette
|
// strange effects when modifying palette
|
||||||
return regs_r(offset);
|
return svision_state::regs_r(offset);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return regs_r(offset);
|
return svision_state::regs_r(offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void svision_state::tvlink_w(offs_t offset, uint8_t data)
|
void tvlink_state::regs_w(offs_t offset, uint8_t data)
|
||||||
{
|
{
|
||||||
switch (offset)
|
switch (offset)
|
||||||
{
|
{
|
||||||
case 0x0e:
|
case 0x0e:
|
||||||
m_reg[offset] = data;
|
m_reg[offset] = data;
|
||||||
m_tvlink.palette_on = data & 1;
|
m_palette_on = data & 1;
|
||||||
if (m_tvlink.palette_on)
|
if (m_palette_on)
|
||||||
{
|
{
|
||||||
// hack, normally initialising with palette from RAM
|
// hack, normally initialising with palette from RAM
|
||||||
m_tvlink.palette[0] = make12_rgb32(163 / 16, 172 / 16, 115 / 16); // these are the tron colors measured from screenshot
|
m_tvlink_palette[0] = make12_rgb32(163 / 16, 172 / 16, 115 / 16); // these are the tron colors measured from screenshot
|
||||||
m_tvlink.palette[1] = make12_rgb32(163 / 16, 155 / 16, 153 / 16);
|
m_tvlink_palette[1] = make12_rgb32(163 / 16, 155 / 16, 153 / 16);
|
||||||
m_tvlink.palette[2] = make12_rgb32(77 / 16, 125 / 16, 73 / 16);
|
m_tvlink_palette[2] = make12_rgb32(77 / 16, 125 / 16, 73 / 16);
|
||||||
m_tvlink.palette[3] = make12_rgb32(59 / 16, 24 / 16, 20 / 16);
|
m_tvlink_palette[3] = make12_rgb32(59 / 16, 24 / 16, 20 / 16);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// cleaner to use colors from compile time palette, or compose from "fixed" palette values
|
// cleaner to use colors from compile time palette, or compose from "fixed" palette values
|
||||||
m_tvlink.palette[0] = make12_rgb32(0, 0, 0);
|
m_tvlink_palette[0] = make12_rgb32(0, 0, 0);
|
||||||
m_tvlink.palette[1] = make12_rgb32(5 * 16 / 256, 18 * 16 / 256, 9 * 16 / 256);
|
m_tvlink_palette[1] = make12_rgb32(5 * 16 / 256, 18 * 16 / 256, 9 * 16 / 256);
|
||||||
m_tvlink.palette[2] = make12_rgb32(48 * 16 / 256, 76 * 16 / 256, 100 * 16 / 256);
|
m_tvlink_palette[2] = make12_rgb32(48 * 16 / 256, 76 * 16 / 256, 100 * 16 / 256);
|
||||||
m_tvlink.palette[3] = make12_rgb32(190 * 16 / 256, 190 * 16 / 256, 190 * 16 / 256);
|
m_tvlink_palette[3] = make12_rgb32(190 * 16 / 256, 190 * 16 / 256, 190 * 16 / 256);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
regs_w(offset, data);
|
svision_state::regs_w(offset, data);
|
||||||
if (offset >= 0x800 && offset < 0x840)
|
if (offset >= 0x800 && offset < 0x840)
|
||||||
{
|
{
|
||||||
if (offset == 0x803 && data == 0x07)
|
if (offset == 0x803 && data == 0x07)
|
||||||
@ -359,13 +415,13 @@ void svision_state::tvlink_w(offs_t offset, uint8_t data)
|
|||||||
m_reg[0x0807] = 0x00;
|
m_reg[0x0807] = 0x00;
|
||||||
}
|
}
|
||||||
uint16_t c = m_reg[0x800] | (m_reg[0x804] << 8);
|
uint16_t c = m_reg[0x800] | (m_reg[0x804] << 8);
|
||||||
m_tvlink.palette[0] = make9_rgb32((c >> 0) & 7, (c >> 3) & 7, (c >> 6) & 7);
|
m_tvlink_palette[0] = make9_rgb32((c >> 0) & 7, (c >> 3) & 7, (c >> 6) & 7);
|
||||||
c = m_reg[0x801] | (m_reg[0x805] << 8);
|
c = m_reg[0x801] | (m_reg[0x805] << 8);
|
||||||
m_tvlink.palette[1] = make9_rgb32((c >> 0) & 7, (c >> 3) & 7, (c >> 6) & 7);
|
m_tvlink_palette[1] = make9_rgb32((c >> 0) & 7, (c >> 3) & 7, (c >> 6) & 7);
|
||||||
c = m_reg[0x802] | (m_reg[0x806]<<8);
|
c = m_reg[0x802] | (m_reg[0x806]<<8);
|
||||||
m_tvlink.palette[2] = make9_rgb32((c >> 0) & 7, (c >> 3) & 7, (c >> 6) & 7);
|
m_tvlink_palette[2] = make9_rgb32((c >> 0) & 7, (c >> 3) & 7, (c >> 6) & 7);
|
||||||
c = m_reg[0x803] | (m_reg[0x807]<<8);
|
c = m_reg[0x803] | (m_reg[0x807]<<8);
|
||||||
m_tvlink.palette[3] = make9_rgb32((c >> 0) & 7, (c >> 3) & 7, (c >> 6) & 7);
|
m_tvlink_palette[3] = make9_rgb32((c >> 0) & 7, (c >> 3) & 7, (c >> 6) & 7);
|
||||||
/* writes to palette effect video color immediately
|
/* writes to palette effect video color immediately
|
||||||
some writes modify other registers,
|
some writes modify other registers,
|
||||||
encoding therefor not known (rgb8 or rgb9) */
|
encoding therefor not known (rgb8 or rgb9) */
|
||||||
@ -373,7 +429,7 @@ void svision_state::tvlink_w(offs_t offset, uint8_t data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void svision_state::svision_mem(address_map &map)
|
void svision_state::program_map(address_map &map)
|
||||||
{
|
{
|
||||||
map(0x0000, 0x1fff).ram();
|
map(0x0000, 0x1fff).ram();
|
||||||
map(0x2000, 0x3fff).rw(FUNC(svision_state::regs_r), FUNC(svision_state::regs_w)).share(m_reg);
|
map(0x2000, 0x3fff).rw(FUNC(svision_state::regs_r), FUNC(svision_state::regs_w)).share(m_reg);
|
||||||
@ -383,14 +439,18 @@ void svision_state::svision_mem(address_map &map)
|
|||||||
map(0xc000, 0xffff).bankr(m_bank[1]);
|
map(0xc000, 0xffff).bankr(m_bank[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void svision_state::tvlink_mem(address_map &map)
|
void svisions_state::program_map(address_map &map)
|
||||||
{
|
{
|
||||||
map(0x0000, 0x1fff).ram();
|
svision_state::program_map(map);
|
||||||
map(0x2000, 0x3fff).rw(FUNC(svision_state::tvlink_r), FUNC(svision_state::tvlink_w)).share(m_reg);
|
|
||||||
map(0x4000, 0x5fff).ram().share(m_videoram);
|
map(0x2000, 0x3fff).rw(FUNC(svisions_state::regs_r), FUNC(svisions_state::regs_w)).share(m_reg);
|
||||||
map(0x6000, 0x7fff).noprw();
|
}
|
||||||
map(0x8000, 0xbfff).bankr(m_bank[0]);
|
|
||||||
map(0xc000, 0xffff).bankr(m_bank[1]);
|
void tvlink_state::program_map(address_map &map)
|
||||||
|
{
|
||||||
|
svision_state::program_map(map);
|
||||||
|
|
||||||
|
map(0x2000, 0x3fff).rw(FUNC(tvlink_state::regs_r), FUNC(tvlink_state::regs_w)).share(m_reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static INPUT_PORTS_START( svision )
|
static INPUT_PORTS_START( svision )
|
||||||
@ -415,6 +475,7 @@ static INPUT_PORTS_START( svisions )
|
|||||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("A") PORT_PLAYER(1)
|
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("A") PORT_PLAYER(1)
|
||||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SELECT) PORT_NAME("Select") PORT_PLAYER(1)
|
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SELECT) PORT_NAME("Select") PORT_PLAYER(1)
|
||||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START) PORT_NAME("Start/Pause") PORT_PLAYER(1)
|
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START) PORT_NAME("Start/Pause") PORT_PLAYER(1)
|
||||||
|
|
||||||
PORT_START("JOY2")
|
PORT_START("JOY2")
|
||||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2)
|
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2)
|
||||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
|
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
|
||||||
@ -478,7 +539,7 @@ void svision_state::svisionp_palette(palette_device &palette) const
|
|||||||
palette.set_pen_colors(0, svisionp_pens);
|
palette.set_pen_colors(0, svisionp_pens);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t svision_state::screen_update_svision(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
uint32_t svision_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
if (BIT(m_reg[BANK], 3))
|
if (BIT(m_reg[BANK], 3))
|
||||||
{
|
{
|
||||||
@ -510,7 +571,7 @@ uint32_t svision_state::screen_update_svision(screen_device &screen, bitmap_ind1
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t svision_state::screen_update_tvlink(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
uint32_t tvlink_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
if (BIT(m_reg[BANK], 3))
|
if (BIT(m_reg[BANK], 3))
|
||||||
{
|
{
|
||||||
@ -525,7 +586,7 @@ uint32_t svision_state::screen_update_tvlink(screen_device &screen, bitmap_rgb32
|
|||||||
uint8_t b = m_videoram[j + i];
|
uint8_t b = m_videoram[j + i];
|
||||||
for (int pix = 0; pix < 4; pix++)
|
for (int pix = 0; pix < 4; pix++)
|
||||||
{
|
{
|
||||||
*line = m_tvlink.palette[b & 3];
|
*line = m_tvlink_palette[b & 3];
|
||||||
b >>= 2;
|
b >>= 2;
|
||||||
line++;
|
line++;
|
||||||
}
|
}
|
||||||
@ -553,21 +614,6 @@ WRITE_LINE_MEMBER(svision_state::frame_int_w)
|
|||||||
m_sound->sound_decrement();
|
m_sound->sound_decrement();
|
||||||
}
|
}
|
||||||
|
|
||||||
void svision_state::init_svision()
|
|
||||||
{
|
|
||||||
m_svision.timer1 = timer_alloc(FUNC(svision_state::svision_timer), this);
|
|
||||||
m_dma_finished = false;
|
|
||||||
m_pet.on = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void svision_state::init_svisions()
|
|
||||||
{
|
|
||||||
m_svision.timer1 = timer_alloc(FUNC(svision_state::svision_timer), this);
|
|
||||||
m_dma_finished = false;
|
|
||||||
m_pet.on = true;
|
|
||||||
m_pet.timer = timer_alloc(FUNC(svision_state::svision_pet_timer), this);
|
|
||||||
}
|
|
||||||
|
|
||||||
DEVICE_IMAGE_LOAD_MEMBER(svision_state::cart_load)
|
DEVICE_IMAGE_LOAD_MEMBER(svision_state::cart_load)
|
||||||
{
|
{
|
||||||
uint32_t size = m_cart->common_get_size("rom");
|
uint32_t size = m_cart->common_get_size("rom");
|
||||||
@ -586,6 +632,9 @@ DEVICE_IMAGE_LOAD_MEMBER( svision_state::cart_load )
|
|||||||
|
|
||||||
void svision_state::machine_start()
|
void svision_state::machine_start()
|
||||||
{
|
{
|
||||||
|
m_timer1 = timer_alloc(FUNC(svision_state::timer), this);
|
||||||
|
m_dma_finished = false;
|
||||||
|
|
||||||
std::string region_tag(m_cart->tag());
|
std::string region_tag(m_cart->tag());
|
||||||
region_tag.append(GENERIC_ROM_REGION_TAG);
|
region_tag.append(GENERIC_ROM_REGION_TAG);
|
||||||
m_cart_rom = memregion(region_tag.c_str());
|
m_cart_rom = memregion(region_tag.c_str());
|
||||||
@ -597,39 +646,50 @@ void svision_state::machine_start()
|
|||||||
m_bank[1]->set_base(m_cart_rom->base() + (num_banks - 1) * 0x4000); // bank2 is set to the last bank
|
m_bank[1]->set_base(m_cart_rom->base() + (num_banks - 1) * 0x4000); // bank2 is set to the last bank
|
||||||
}
|
}
|
||||||
|
|
||||||
save_item(STRUCT_MEMBER(m_svision, timer_shot));
|
save_item(NAME(m_timer_shot));
|
||||||
|
|
||||||
save_item(STRUCT_MEMBER(m_pet, state));
|
|
||||||
save_item(STRUCT_MEMBER(m_pet, on));
|
|
||||||
save_item(STRUCT_MEMBER(m_pet, clock));
|
|
||||||
save_item(STRUCT_MEMBER(m_pet, data));
|
|
||||||
save_item(STRUCT_MEMBER(m_pet, input));
|
|
||||||
|
|
||||||
save_item(STRUCT_MEMBER(m_tvlink, palette));
|
|
||||||
save_item(STRUCT_MEMBER(m_tvlink, palette_on));
|
|
||||||
|
|
||||||
save_item(NAME(m_dma_finished));
|
save_item(NAME(m_dma_finished));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void svisions_state::machine_start()
|
||||||
|
{
|
||||||
|
svision_state::machine_start();
|
||||||
|
|
||||||
|
m_timer = timer_alloc(FUNC(svisions_state::pet_timer), this);
|
||||||
|
|
||||||
|
save_item(NAME(m_state));
|
||||||
|
save_item(NAME(m_clock));
|
||||||
|
save_item(NAME(m_data));
|
||||||
|
save_item(NAME(m_input));
|
||||||
|
}
|
||||||
|
|
||||||
|
void tvlink_state::machine_start()
|
||||||
|
{
|
||||||
|
svision_state::machine_start();
|
||||||
|
|
||||||
|
save_item(NAME(m_tvlink_palette));
|
||||||
|
save_item(NAME(m_palette_on));
|
||||||
|
}
|
||||||
|
|
||||||
void svision_state::machine_reset()
|
void svision_state::machine_reset()
|
||||||
{
|
{
|
||||||
m_svision.timer_shot = false;
|
m_timer_shot = false;
|
||||||
m_dma_finished = false;
|
m_dma_finished = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
MACHINE_RESET_MEMBER(svision_state,tvlink)
|
void tvlink_state::machine_reset()
|
||||||
{
|
{
|
||||||
svision_state::machine_reset();
|
svision_state::machine_reset();
|
||||||
m_tvlink.palette_on = false;
|
|
||||||
|
m_palette_on = false;
|
||||||
|
|
||||||
memset(m_reg + 0x800, 0xff, 0x40); // normally done from m_tvlink microcontroller
|
memset(m_reg + 0x800, 0xff, 0x40); // normally done from m_tvlink microcontroller
|
||||||
m_reg[0x82a] = 0xdf;
|
m_reg[0x82a] = 0xdf;
|
||||||
|
|
||||||
m_tvlink.palette[0] = make24_rgb32(svisionp_pens[0].r(), svisionp_pens[0].g(), svisionp_pens[0].b());
|
m_tvlink_palette[0] = make24_rgb32(svisionp_pens[0].r(), svisionp_pens[0].g(), svisionp_pens[0].b());
|
||||||
m_tvlink.palette[1] = make24_rgb32(svisionp_pens[1].r(), svisionp_pens[1].g(), svisionp_pens[1].b());
|
m_tvlink_palette[1] = make24_rgb32(svisionp_pens[1].r(), svisionp_pens[1].g(), svisionp_pens[1].b());
|
||||||
m_tvlink.palette[2] = make24_rgb32(svisionp_pens[2].r(), svisionp_pens[2].g(), svisionp_pens[2].b());
|
m_tvlink_palette[2] = make24_rgb32(svisionp_pens[2].r(), svisionp_pens[2].g(), svisionp_pens[2].b());
|
||||||
m_tvlink.palette[3] = make24_rgb32(svisionp_pens[3].r(), svisionp_pens[3].g(), svisionp_pens[3].b());
|
m_tvlink_palette[3] = make24_rgb32(svisionp_pens[3].r(), svisionp_pens[3].g(), svisionp_pens[3].b());
|
||||||
}
|
}
|
||||||
|
|
||||||
void svision_state::svision_base(machine_config &config)
|
void svision_state::svision_base(machine_config &config)
|
||||||
@ -638,6 +698,7 @@ void svision_state::svision_base(machine_config &config)
|
|||||||
|
|
||||||
SPEAKER(config, "lspeaker").front_left();
|
SPEAKER(config, "lspeaker").front_left();
|
||||||
SPEAKER(config, "rspeaker").front_right();
|
SPEAKER(config, "rspeaker").front_right();
|
||||||
|
|
||||||
SVISION_SND(config, m_sound, 4'000'000, m_maincpu, m_bank[0]);
|
SVISION_SND(config, m_sound, 4'000'000, m_maincpu, m_bank[0]);
|
||||||
m_sound->add_route(0, "lspeaker", 0.50);
|
m_sound->add_route(0, "lspeaker", 0.50);
|
||||||
m_sound->add_route(1, "rspeaker", 0.50);
|
m_sound->add_route(1, "rspeaker", 0.50);
|
||||||
@ -655,23 +716,26 @@ void svision_state::svision(machine_config &config)
|
|||||||
svision_base(config);
|
svision_base(config);
|
||||||
|
|
||||||
M65C02(config, m_maincpu, 4'000'000);
|
M65C02(config, m_maincpu, 4'000'000);
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &svision_state::svision_mem);
|
m_maincpu->set_addrmap(AS_PROGRAM, &svision_state::program_map);
|
||||||
|
|
||||||
SCREEN(config, m_screen, SCREEN_TYPE_LCD);
|
SCREEN(config, m_screen, SCREEN_TYPE_LCD);
|
||||||
m_screen->set_refresh_hz(61);
|
m_screen->set_refresh_hz(61);
|
||||||
m_screen->set_size(3+160+3, 160);
|
m_screen->set_size(3+160+3, 160);
|
||||||
m_screen->set_visarea(3+0, 3+160-1, 0, 160-1);
|
m_screen->set_visarea(3+0, 3+160-1, 0, 160-1);
|
||||||
m_screen->set_screen_update(FUNC(svision_state::screen_update_svision));
|
m_screen->set_screen_update(FUNC(svision_state::screen_update));
|
||||||
m_screen->set_palette(m_palette);
|
m_screen->set_palette(m_palette);
|
||||||
m_screen->screen_vblank().set(FUNC(svision_state::frame_int_w));
|
m_screen->screen_vblank().set(FUNC(svision_state::frame_int_w));
|
||||||
|
|
||||||
PALETTE(config, m_palette, FUNC(svision_state::svision_palette), std::size(svision_pens));
|
PALETTE(config, m_palette, FUNC(svision_state::svision_palette), std::size(svision_pens));
|
||||||
}
|
}
|
||||||
|
|
||||||
void svision_state::svisions(machine_config &config)
|
void svisions_state::svisions(machine_config &config)
|
||||||
{
|
{
|
||||||
svision(config);
|
svision(config);
|
||||||
TIMER(config, "pet_timer").configure_periodic(FUNC(svision_state::svision_pet_timer_dev), attotime::from_seconds(8));
|
|
||||||
|
m_maincpu->set_addrmap(AS_PROGRAM, &svisions_state::program_map);
|
||||||
|
|
||||||
|
TIMER(config, "pet_timer").configure_periodic(FUNC(svisions_state::pet_timer_dev), attotime::from_seconds(8));
|
||||||
}
|
}
|
||||||
|
|
||||||
void svision_state::svisionp(machine_config &config)
|
void svision_state::svisionp(machine_config &config)
|
||||||
@ -679,27 +743,31 @@ void svision_state::svisionp(machine_config &config)
|
|||||||
svision(config);
|
svision(config);
|
||||||
|
|
||||||
m_maincpu->set_clock(4'430'000);
|
m_maincpu->set_clock(4'430'000);
|
||||||
|
|
||||||
m_screen->set_refresh(HZ_TO_ATTOSECONDS(50));
|
m_screen->set_refresh(HZ_TO_ATTOSECONDS(50));
|
||||||
|
|
||||||
m_palette->set_init(FUNC(svision_state::svisionp_palette));
|
m_palette->set_init(FUNC(svision_state::svisionp_palette));
|
||||||
}
|
}
|
||||||
|
|
||||||
void svision_state::svisionn(machine_config &config)
|
void svision_state::svisionn(machine_config &config)
|
||||||
{
|
{
|
||||||
svision(config);
|
svision(config);
|
||||||
|
|
||||||
m_maincpu->set_clock(3'560'000); // ?
|
m_maincpu->set_clock(3'560'000); // ?
|
||||||
|
|
||||||
m_screen->set_refresh(HZ_TO_ATTOSECONDS(60));
|
m_screen->set_refresh(HZ_TO_ATTOSECONDS(60));
|
||||||
|
|
||||||
m_palette->set_init(FUNC(svision_state::svisionn_palette));
|
m_palette->set_init(FUNC(svision_state::svisionn_palette));
|
||||||
}
|
}
|
||||||
|
|
||||||
void svision_state::tvlinkp(machine_config &config)
|
void tvlink_state::tvlinkp(machine_config &config)
|
||||||
{
|
{
|
||||||
svisionp(config);
|
svisionp(config);
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &svision_state::tvlink_mem);
|
|
||||||
|
m_maincpu->set_addrmap(AS_PROGRAM, &tvlink_state::program_map);
|
||||||
|
|
||||||
m_screen->set_no_palette();
|
m_screen->set_no_palette();
|
||||||
m_screen->set_screen_update(FUNC(svision_state::screen_update_tvlink));
|
m_screen->set_screen_update(FUNC(tvlink_state::screen_update));
|
||||||
|
|
||||||
MCFG_MACHINE_RESET_OVERRIDE(svision_state, tvlink)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ROM_START(svision)
|
ROM_START(svision)
|
||||||
@ -728,12 +796,12 @@ ROM_END
|
|||||||
|
|
||||||
// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
|
// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
|
||||||
// marketed under a ton of firms and names
|
// marketed under a ton of firms and names
|
||||||
CONS(1992, svision, 0, 0, svision, svision, svision_state, init_svision, "Watara", "Super Vision", MACHINE_SUPPORTS_SAVE )
|
CONS(1992, svision, 0, 0, svision, svision, svision_state, empty_init, "Watara", "Super Vision", MACHINE_SUPPORTS_SAVE )
|
||||||
// svdual 2 connected via communication port
|
// svdual 2 connected via communication port
|
||||||
CONS( 1992, svisions, svision, 0, svisions, svisions, svision_state, init_svisions, "Watara", "Super Vision (PeT Communication Simulation)", MACHINE_SUPPORTS_SAVE )
|
CONS( 1992, svisions, svision, 0, svisions, svisions, svisions_state, empty_init, "Watara", "Super Vision (PeT Communication Simulation)", MACHINE_SUPPORTS_SAVE )
|
||||||
|
|
||||||
CONS( 1993, svisionp, svision, 0, svisionp, svision, svision_state, init_svision, "Watara", "Super Vision (PAL TV Link Colored)", MACHINE_SUPPORTS_SAVE )
|
CONS( 1993, svisionp, svision, 0, svisionp, svision, svision_state, empty_init, "Watara", "Super Vision (PAL TV Link Colored)", MACHINE_SUPPORTS_SAVE )
|
||||||
CONS( 1993, svisionn, svision, 0, svisionn, svision, svision_state, init_svision, "Watara", "Super Vision (NTSC TV Link Colored)", MACHINE_SUPPORTS_SAVE )
|
CONS( 1993, svisionn, svision, 0, svisionn, svision, svision_state, empty_init, "Watara", "Super Vision (NTSC TV Link Colored)", MACHINE_SUPPORTS_SAVE )
|
||||||
// svtvlink (2 supervisions)
|
// svtvlink (2 supervisions)
|
||||||
// tvlink (pad supervision simulated)
|
// tvlink (pad supervision simulated)
|
||||||
CONS( 199?, tvlinkp, svision, 0, tvlinkp, svision, svision_state, init_svision, "Watara", "TV Link PAL", MACHINE_SUPPORTS_SAVE )
|
CONS( 199?, tvlinkp, svision, 0, tvlinkp, svision, tvlink_state, empty_init, "Watara", "TV Link PAL", MACHINE_SUPPORTS_SAVE )
|
||||||
|
Loading…
Reference in New Issue
Block a user