Software list items promoted to working

---------------------------------------
odyssey2: Chess Module (Euro) [hap]
This commit is contained in:
hap 2020-08-01 19:02:26 +02:00
parent 206767bf56
commit 18f2dd9ac1
7 changed files with 141 additions and 58 deletions

View File

@ -83,7 +83,7 @@ adds 16K RAM and 16K ROM, that plugs into the G7000.
</part>
</software>
<software name="homecomp" supported="no"><!-- needs home computer module emulation, wrong romtype right now, just a placeholder -->
<software name="homecomp" supported="no"><!-- needs home computer module emulation, wrong romtype right now - move to g7400.xml? -->
<description>Home Computer Module (Euro)</description><!-- aka Basic -->
<year>1983</year>
<publisher>Philips</publisher>
@ -92,7 +92,7 @@ adds 16K RAM and 16K ROM, that plugs into the G7000.
<feature name="slot" value="o2_rom" />
<dataarea name="rom" size="0x4800">
<rom name="z80_c7420.bin" size="0x4000" crc="939f0e4c" sha1="24c334ba4321f3dd30ac659d35e43f74283ad93b" offset="0" />
<rom name="vp_c7420.bin" size="0x800" crc="8e824b98" sha1="60dfc1eea93c25f30d25e549f32f837e22735224" offset="0x800" />
<rom name="vp_c7420.bin" size="0x800" crc="8e824b98" sha1="60dfc1eea93c25f30d25e549f32f837e22735224" offset="0x4000" />
</dataarea>
</part>
</software>
@ -545,15 +545,16 @@ adds 16K RAM and 16K ROM, that plugs into the G7000.
</part>
</software>
<software name="chess" supported="no"><!-- needs chess module emulation -->
<software name="chess">
<description>Chess Module (Euro)</description>
<year>1982</year>
<publisher>Philips</publisher>
<info name="serial" value="C7010"/>
<part name="cart" interface="odyssey_cart">
<feature name="slot" value="o2_chess" />
<dataarea name="rom" size="2048">
<rom name="chess (europe).bin" size="2048" crc="77066338" sha1="7162359313f66fe759bdd8a34755a5f62f3cadfb" offset="0" />
<dataarea name="rom" size="0x2800">
<rom name="z80_c7010.bin" size="0x2000" crc="45080245" sha1="fff3e6449a0e82e8e4ff45e5830c98fc38a8848e" offset="0" />
<rom name="vp_c7010.bin" size="0x800" crc="77066338" sha1="7162359313f66fe759bdd8a34755a5f62f3cadfb" offset="0x2000" />
</dataarea>
</part>
</software>

View File

@ -1,5 +1,5 @@
// license:BSD-3-Clause
// copyright-holders:Fabio Priuli
// copyright-holders:hap
/******************************************************************************
Videopac C7010 Chess Module emulation
@ -11,10 +11,6 @@ Hardware notes:
Service manual with schematics is available.
TODO:
- this code is just a stub... hence, almost everything is still to do!
most importantly, missing 8KB ROM dump
******************************************************************************/
#include "emu.h"
@ -28,22 +24,38 @@ TODO:
DEFINE_DEVICE_TYPE(O2_ROM_CHESS, o2_chess_device, "o2_chess", "Odyssey 2 Videopac Chess Module")
o2_chess_device::o2_chess_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: o2_rom_device(mconfig, O2_ROM_CHESS, tag, owner, clock)
, m_cpu(*this, "subcpu")
o2_chess_device::o2_chess_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
o2_rom_device(mconfig, O2_ROM_CHESS, tag, owner, clock),
m_cpu(*this, "subcpu"),
m_latch(*this, "latch%u", 0)
{ }
void o2_chess_device::device_start()
{
save_item(NAME(m_control));
}
void o2_chess_device::cart_init()
{
if (m_rom_size != 0x2800)
fatalerror("o2_chess_device: Wrong ROM region size\n");
}
//-------------------------------------------------
// address maps
//-------------------------------------------------
void o2_chess_device::chess_mem(address_map &map)
{
map(0x0000, 0x07ff).r(FUNC(o2_chess_device::read_rom04));
map(0x0000, 0x1fff).r(FUNC(o2_chess_device::internal_rom_r));
map(0xe000, 0xe7ff).mirror(0x1800).ram();
}
void o2_chess_device::chess_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
map.global_mask(0x01);
map(0x00, 0x01).r(m_latch[1], FUNC(generic_latch_8_device::read)).w(m_latch[0], FUNC(generic_latch_8_device::write));
}
@ -56,4 +68,35 @@ void o2_chess_device::device_add_mconfig(machine_config &config)
NSC800(config, m_cpu, 4.433619_MHz_XTAL);
m_cpu->set_addrmap(AS_PROGRAM, &o2_chess_device::chess_mem);
m_cpu->set_addrmap(AS_IO, &o2_chess_device::chess_io);
GENERIC_LATCH_8(config, m_latch[0]);
GENERIC_LATCH_8(config, m_latch[1]);
}
//-------------------------------------------------
// mapper specific handlers
//-------------------------------------------------
void o2_chess_device::write_bank(int bank)
{
// P10: must be low to access latches
// P11: reset
m_cpu->set_input_line(INPUT_LINE_RESET, (bank & 2) ? CLEAR_LINE : ASSERT_LINE);
m_control = bank;
}
u8 o2_chess_device::io_read(offs_t offset)
{
if (offset & 0x80 && offset & 0x20 && ~m_control & 1)
return m_latch[0]->read();
else
return 0xff;
}
void o2_chess_device::io_write(offs_t offset, u8 data)
{
if (offset & 0x80 && ~m_control & 1)
m_latch[1]->write(data);
}

View File

@ -1,5 +1,11 @@
// license:BSD-3-Clause
// copyright-holders:Fabio Priuli
// copyright-holders:hap
/**********************************************************************
Videopac C7010 Chess Module emulation
**********************************************************************/
#ifndef MAME_BUS_ODYSSEY2_CHESS_H
#define MAME_BUS_ODYSSEY2_CHESS_H
@ -8,6 +14,7 @@
#include "slot.h"
#include "rom.h"
#include "cpu/z80/z80.h"
#include "machine/gen_latch.h"
// ======================> o2_chess_device
@ -19,14 +26,29 @@ public:
o2_chess_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_add_mconfig(machine_config &config) override;
// virtual const rom_entry *device_rom_region() const;
virtual void cart_init() override;
virtual u8 read_rom04(offs_t offset) override { return m_rom[offset + 0x2000]; }
virtual u8 read_rom0c(offs_t offset) override { return m_rom[offset + 0x2000]; }
virtual void write_bank(int bank) override;
virtual void io_write(offs_t offset, u8 data) override;
virtual u8 io_read(offs_t offset) override;
private:
required_device<nsc800_device> m_cpu;
required_device_array<generic_latch_8_device, 2> m_latch;
u8 internal_rom_r(offs_t offset) { return m_rom[offset]; }
void chess_io(address_map &map);
void chess_mem(address_map &map);
u8 m_control = 0;
};
// device type definition

View File

@ -174,7 +174,7 @@ image_init_result o2_cart_slot_device::call_load()
m_type = o2_get_pcb_id(pcb_name);
}
//printf("Type: %s\n", o2_get_slot(m_type));
m_cart->cart_init();
return image_init_result::PASS;
}
@ -231,7 +231,7 @@ uint8_t o2_cart_slot_device::read_rom0c(offs_t offset)
}
/*-------------------------------------------------
io_write
io
-------------------------------------------------*/
void o2_cart_slot_device::io_write(offs_t offset, uint8_t data)
@ -240,6 +240,14 @@ void o2_cart_slot_device::io_write(offs_t offset, uint8_t data)
m_cart->io_write(offset, data);
}
uint8_t o2_cart_slot_device::io_read(offs_t offset)
{
if (m_cart)
return m_cart->io_read(offset);
else
return 0xff;
}
#include "bus/odyssey2/rom.h"
#include "bus/odyssey2/chess.h"

View File

@ -38,8 +38,11 @@ public:
virtual void write_bank(int bank) { }
virtual void io_write(offs_t offset, uint8_t data) { }
virtual uint8_t io_read(offs_t offset) { return 0xff; }
virtual DECLARE_READ_LINE_MEMBER(t0_read) { return 0; }
virtual void cart_init() { } // called after loading ROM
void rom_alloc(uint32_t size, const char *tag);
void ram_alloc(uint32_t size);
uint8_t* get_rom_base() { return m_rom; }
@ -100,9 +103,10 @@ public:
uint8_t read_rom04(offs_t offset);
uint8_t read_rom0c(offs_t offset);
void io_write(offs_t offset, uint8_t data);
uint8_t io_read(offs_t offset);
DECLARE_READ_LINE_MEMBER(t0_read) { if (m_cart) return m_cart->t0_read(); else return 0; }
void write_bank(int bank) { if (m_cart) m_cart->write_bank(bank); }
void write_bank(int bank) { if (m_cart) m_cart->write_bank(bank); }
protected:
// device-level overrides

View File

@ -88,8 +88,11 @@ WRITE_LINE_MEMBER(o2_voice_device::lrq_callback)
void o2_voice_device::io_write(offs_t offset, uint8_t data)
{
if (data & 0x20)
m_speech->ald_w(offset & 0x7f);
else
m_speech->reset();
if (offset & 0x80)
{
if (data & 0x20)
m_speech->ald_w(offset & 0x7f);
else
m_speech->reset();
}
}

View File

@ -2,12 +2,14 @@
// copyright-holders:Wilbert Pol
/***************************************************************************
/drivers/odyssey2.c
Driver file to handle emulation of the Odyssey2.
Driver file to handle emulation of the Odyssey2.
Minor update to "the voice" rom names, and add comment about
the older revision of "the voice" - LN, 10/03/08
TODO:
- chess has graphics issues near the screen borders: missing A-H at bottom,
rightmost column is not erased properly, wrongly places chars at top
- homecomp does not work, needs new slot device
- a lot more issues, probably, this TODO list was written by someone with
no knowledge on odyssey2
***************************************************************************/
@ -52,7 +54,7 @@ protected:
required_device<i8244_device> m_i8244;
required_device<o2_cart_slot_device> m_cart;
uint8_t m_ram[256];
uint8_t m_ram[0x80];
uint8_t m_p1;
uint8_t m_p2;
uint8_t m_lum;
@ -290,19 +292,17 @@ void g7400_state::g7400_palette(palette_device &palette) const
void odyssey2_state::init_odyssey2()
{
uint8_t *gfx = memregion("gfx1")->base();
memset(m_ram, 0, 0x80);
uint8_t *gfx = memregion("gfx1")->base();
for (int i = 0; i < 256; i++)
{
gfx[i] = i; /* TODO: Why i and not 0? */
m_ram[i] = 0;
}
gfx[i] = i; /* TODO: Why i and not 0? */
}
void odyssey2_state::machine_start()
{
save_pointer(NAME(m_ram),256);
save_item(NAME(m_ram));
save_item(NAME(m_p1));
save_item(NAME(m_p2));
save_item(NAME(m_lum));
@ -344,16 +344,20 @@ void g7400_state::machine_reset()
uint8_t odyssey2_state::io_read(offs_t offset)
{
u8 data = 0;
if ((m_p1 & (P1_VDC_COPY_MODE_ENABLE | P1_VDC_ENABLE)) == 0)
{
return m_i8244->read(offset);
data = m_i8244->read(offset);
}
if (!(m_p1 & P1_EXT_RAM_ENABLE))
else if (!(m_p1 & P1_EXT_RAM_ENABLE))
{
return m_ram[offset];
data = m_cart->io_read(offset);
if (~offset & 0x80)
data &= m_ram[offset];
}
return 0;
return data;
}
@ -361,12 +365,9 @@ void odyssey2_state::io_write(offs_t offset, uint8_t data)
{
if ((m_p1 & (P1_EXT_RAM_ENABLE | P1_VDC_COPY_MODE_ENABLE)) == 0x00)
{
m_ram[offset] = data;
if (offset & 0x80)
{
logerror("voice write %02X, data = %02X (p1 = %02X)\n", offset, data, m_p1);
m_cart->io_write(offset, data);
}
if (~offset & 0x80)
m_ram[offset] = data;
m_cart->io_write(offset, data);
}
else if (!(m_p1 & P1_VDC_ENABLE))
{
@ -377,20 +378,24 @@ void odyssey2_state::io_write(offs_t offset, uint8_t data)
uint8_t g7400_state::io_read(offs_t offset)
{
u8 data = 0;
if ((m_p1 & (P1_VDC_COPY_MODE_ENABLE | P1_VDC_ENABLE)) == 0)
{
return m_i8244->read(offset);
data = m_i8244->read(offset);
}
else if (!(m_p1 & P1_EXT_RAM_ENABLE))
{
return m_ram[offset];
data = m_cart->io_read(offset);
if (~offset & 0x80)
data &= m_ram[offset];
}
else if (!(m_p1 & P1_VPP_ENABLE))
{
return m_ef9340_1->ef9341_read( offset & 0x02, offset & 0x01 );
data = m_ef9340_1->ef9341_read( offset & 0x02, offset & 0x01 );
}
return 0;
return data;
}
@ -398,12 +403,9 @@ void g7400_state::io_write(offs_t offset, uint8_t data)
{
if ((m_p1 & (P1_EXT_RAM_ENABLE | P1_VDC_COPY_MODE_ENABLE)) == 0x00)
{
m_ram[offset] = data;
if (offset & 0x80)
{
logerror("voice write %02X, data = %02X (p1 = %02X)\n", offset, data, m_p1);
m_cart->io_write(offset, data);
}
if (~offset & 0x80)
m_ram[offset] = data;
m_cart->io_write(offset, data);
}
else if (!(m_p1 & P1_VDC_ENABLE))
{
@ -892,4 +894,4 @@ COMP( 1978, odyssey2, 0, 0, odyssey2, odyssey2, odyssey2_state, init
COMP( 1979, videopac, odyssey2, 0, videopac, odyssey2, odyssey2_state, init_odyssey2, "Philips", "Videopac G7000/C52", 0 )
COMP( 1983, g7400, odyssey2, 0, g7400, odyssey2, g7400_state, init_odyssey2, "Philips", "Videopac Plus G7400", MACHINE_IMPERFECT_GRAPHICS )
COMP( 1983, jopac, odyssey2, 0, g7400, odyssey2, g7400_state, init_odyssey2, "Brandt", "Jopac JO7400", MACHINE_IMPERFECT_GRAPHICS )
COMP( 1983, odyssey3, odyssey2, 0, odyssey3, odyssey2, g7400_state, init_odyssey2, "Magnavox", "Odyssey 3 Command Center (prototype)", MACHINE_IMPERFECT_GRAPHICS )
COMP( 1983, odyssey3, odyssey2, 0, odyssey3, odyssey2, g7400_state, init_odyssey2, "Magnavox", "Odyssey 3 Command Center (prototype)", MACHINE_IMPERFECT_GRAPHICS ) // USA version of G7400