mirror of
https://github.com/holub/mame
synced 2025-04-19 07:00:31 +03:00
(MESS) iq128: use a softlist also for ROMless cartridges. (nw)
This commit is contained in:
parent
a10e11a2e8
commit
47689c0995
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -97,6 +97,7 @@ hash/ibmpcjr_flop.xml svneol=native#text/xml
|
||||
hash/intv.hsi svneol=native#text/plain
|
||||
hash/intv.xml svneol=native#text/xml
|
||||
hash/intvecs.xml svneol=native#text/xml
|
||||
hash/iq128.xml svneol=native#text/xml
|
||||
hash/iq151_cart.xml svneol=native#text/xml
|
||||
hash/iq151_flop.xml svneol=native#text/xml
|
||||
hash/jaguar.xml svneol=native#text/xml
|
||||
|
@ -258,20 +258,6 @@ On one was the highest adressline set to HIGH, on the other one this adressline
|
||||
|
||||
<!-- Third chunk of dumps, misc compatibility -->
|
||||
|
||||
<!-- According to the boxart, this is compatible with: IQ 128 -->
|
||||
<software name="fitnatur">
|
||||
<description>Fit in Naturwissenschaften</description>
|
||||
<year>200?</year>
|
||||
<publisher>Video Technology</publisher>
|
||||
<info name="serial" value="80-13375" />
|
||||
|
||||
<part name="rom" interface="genius_rom">
|
||||
<dataarea name="rom" size="0">
|
||||
<!-- cartridge contains only a jumper wire -->
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- According to the boxart, this is compatible with: Master Mega Color -->
|
||||
<software name="zahlenkn">
|
||||
<description>Zahlenknacker</description>
|
||||
|
46
hash/iq128.xml
Normal file
46
hash/iq128.xml
Normal file
@ -0,0 +1,46 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
|
||||
<softwarelist name="iq128" description="VTech Genius IQ 128 cartridges">
|
||||
|
||||
<!-- According to the boxart, this is compatible with: IQ 128 -->
|
||||
<!-- if used with the French version produce same result of 'Cartouche I' -->
|
||||
<software name="fitnatur">
|
||||
<description>Fit in Naturwissenschaften</description>
|
||||
<year>199?</year>
|
||||
<publisher>Video Technology</publisher>
|
||||
<info name="serial" value="80-13375" />
|
||||
<part name="rom" interface="iq128_cart">
|
||||
<feature name="pcb_type" value="romless1" />
|
||||
<dataarea name="rom" size="1">
|
||||
<!-- cartridge contains only a jumper wire -->
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- the existence of this cartridge is not yet confirmed -->
|
||||
<!-- if used with the German version produce same result of 'Fit in Naturwissenschaften' -->
|
||||
<software name="cart1">
|
||||
<description>Cartouche I</description>
|
||||
<year>199?</year>
|
||||
<publisher>Video Technology</publisher>
|
||||
<part name="rom" interface="iq128_cart">
|
||||
<feature name="pcb_type" value="romless1" />
|
||||
<dataarea name="rom" size="1">
|
||||
<!-- cartridge should contains only a jumper wire -->
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- the existence of this cartridge is not yet confirmed -->
|
||||
<software name="cart2">
|
||||
<description>Cartouche II</description>
|
||||
<year>199?</year>
|
||||
<publisher>Video Technology</publisher>
|
||||
<part name="rom" interface="iq128_cart">
|
||||
<feature name="pcb_type" value="romless2" />
|
||||
<dataarea name="rom" size="1">
|
||||
<!-- cartridge should contains only a jumper wire -->
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
</softwarelist>
|
@ -15,11 +15,11 @@ Memory map:
|
||||
00200000 RAM (256K)
|
||||
00400000 Flash memory (128K)
|
||||
00600000 Some memory mapped hardware
|
||||
???????? Cartridge port
|
||||
00a00000 Cartridge port
|
||||
|
||||
TODO:
|
||||
- Sound
|
||||
- Cartridge
|
||||
- Flash cartridge
|
||||
- Dump the MCU and rewrites everything using low-level emulation
|
||||
- Check with different countries ROMs
|
||||
|
||||
@ -187,6 +187,7 @@ TMP47C241MG = TCLS-47 series 4-bit CPU with 2048x8 internal ROM
|
||||
#include "emu.h"
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "machine/intelfsh.h"
|
||||
#include "imagedev/cartslot.h"
|
||||
|
||||
|
||||
#define KEYBOARD_QUEUE_SIZE 0x80
|
||||
@ -194,21 +195,33 @@ TMP47C241MG = TCLS-47 series 4-bit CPU with 2048x8 internal ROM
|
||||
class geniusiq_state : public driver_device
|
||||
{
|
||||
public:
|
||||
enum
|
||||
{
|
||||
IQ128_ROM_CART = 0x00,
|
||||
IQ128_ROMLESS1_CART = 0x01,
|
||||
IQ128_ROMLESS2_CART = 0x02,
|
||||
IQ128_NO_CART = 0x03
|
||||
};
|
||||
|
||||
geniusiq_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_flash(*this, "flash"),
|
||||
m_vram(*this, "vram"),
|
||||
m_mouse_gfx(*this, "mouse_gfx")
|
||||
m_mouse_gfx(*this, "mouse_gfx"),
|
||||
m_cart_state(IQ128_NO_CART)
|
||||
{ }
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<intelfsh8_device> m_flash;
|
||||
required_shared_ptr<UINT16> m_vram;
|
||||
required_shared_ptr<UINT16> m_mouse_gfx;
|
||||
|
||||
virtual void machine_start();
|
||||
virtual void machine_reset();
|
||||
virtual void palette_init();
|
||||
virtual UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
DECLARE_READ8_MEMBER(flash_r);
|
||||
DECLARE_WRITE8_MEMBER(flash_w);
|
||||
DECLARE_READ16_MEMBER(input_r);
|
||||
@ -220,6 +233,9 @@ public:
|
||||
DECLARE_WRITE16_MEMBER(gfx_color_w);
|
||||
DECLARE_WRITE16_MEMBER(gfx_idx_w);
|
||||
void queue_input(UINT16 data);
|
||||
DECLARE_READ16_MEMBER(cart_state_r);
|
||||
int cart_load(device_image_interface &image);
|
||||
void cart_unload(device_image_interface &image);
|
||||
|
||||
DECLARE_READ16_MEMBER(unk0_r) { return 0; }
|
||||
DECLARE_READ16_MEMBER(unk_r) { return machine().rand(); }
|
||||
@ -233,6 +249,8 @@ private:
|
||||
UINT8 m_mouse_posy;
|
||||
UINT16 m_mouse_gfx_posx;
|
||||
UINT16 m_mouse_gfx_posy;
|
||||
UINT8 * m_cart;
|
||||
UINT8 m_cart_state;
|
||||
struct
|
||||
{
|
||||
UINT16 buffer[KEYBOARD_QUEUE_SIZE];
|
||||
@ -330,6 +348,11 @@ WRITE8_MEMBER(geniusiq_state::flash_w)
|
||||
m_flash->write(offset, data);
|
||||
}
|
||||
|
||||
READ16_MEMBER( geniusiq_state::cart_state_r )
|
||||
{
|
||||
return m_cart_state;
|
||||
}
|
||||
|
||||
WRITE16_MEMBER( geniusiq_state::mouse_pos_w )
|
||||
{
|
||||
if (offset)
|
||||
@ -461,7 +484,7 @@ static ADDRESS_MAP_START(geniusiq_mem, AS_PROGRAM, 16, geniusiq_state)
|
||||
//AM_RANGE(0x600600, 0x600605) // sound ??
|
||||
AM_RANGE(0x600606, 0x600609) AM_WRITE(gfx_base_w)
|
||||
AM_RANGE(0x60060a, 0x60060b) AM_WRITE(gfx_idx_w)
|
||||
AM_RANGE(0x600802, 0x600803) AM_READ_PORT("CART") // cartridge state
|
||||
AM_RANGE(0x600802, 0x600803) AM_READ(cart_state_r) // cartridge state
|
||||
AM_RANGE(0x600108, 0x600109) AM_READ(unk0_r) // read before run a BASIC program
|
||||
AM_RANGE(0x600918, 0x600919) AM_READ(unk0_r) // loop at start if bit 0 is set
|
||||
AM_RANGE(0x601008, 0x601009) AM_READ(unk_r) // unknown, read at start and expect that bit 2 changes several times before continue
|
||||
@ -470,7 +493,7 @@ static ADDRESS_MAP_START(geniusiq_mem, AS_PROGRAM, 16, geniusiq_state)
|
||||
AM_RANGE(0x60101c, 0x60101f) AM_WRITE(gfx_color_w)
|
||||
AM_RANGE(0x601060, 0x601063) AM_WRITE(mouse_pos_w)
|
||||
AM_RANGE(0x601100, 0x6011ff) AM_RAM AM_SHARE("mouse_gfx") // mouse cursor gfx (24x16)
|
||||
//AM_RANGE(0xa00000, 0xa?????) // cartridge ??
|
||||
AM_RANGE(0xa00000, 0xafffff) AM_REGION("cart", 0) // cartridge
|
||||
// 0x600000 : some memory mapped hardware
|
||||
ADDRESS_MAP_END
|
||||
|
||||
@ -629,13 +652,6 @@ static INPUT_PORTS_START( geniusiq )
|
||||
PORT_START("MOUSE")
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Mouse Button 2") PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_mouse_input, 0 )
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Mouse Button 1") PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_mouse_input, 0 )
|
||||
|
||||
PORT_START("CART")
|
||||
PORT_CONFNAME( 0x03, 0x03, "Cartridge" )
|
||||
PORT_CONFSETTING( 0x00, "ROM/Flash cartridge" ) // check for cartridge header at 0xa00000
|
||||
PORT_CONFSETTING( 0x01, "Cartouche I" )
|
||||
PORT_CONFSETTING( 0x02, "Cartouche II" )
|
||||
PORT_CONFSETTING( 0x03, "No cartridge" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
@ -681,18 +697,16 @@ static INPUT_PORTS_START( geniusiq_de )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_A ) PORT_CHAR('a') PORT_CHAR('A') PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x64 )
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_Q ) PORT_CHAR('q') PORT_CHAR('Q') PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x65 )
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE( KEYCODE_1 ) PORT_CHAR('1') PORT_CHAR('!') PORT_CHANGED_MEMBER( DEVICE_SELF, geniusiq_state, send_input, 0x66 )
|
||||
|
||||
PORT_MODIFY("CART")
|
||||
PORT_CONFNAME( 0x03, 0x03, "Cartridge" )
|
||||
PORT_CONFSETTING( 0x00, "ROM/Flash cartridge" ) // check for cartridge header at 0xa00000
|
||||
PORT_CONFSETTING( 0x01, "Fit in Naturwissenschaften" )
|
||||
PORT_CONFSETTING( 0x02, "No cartridge" )
|
||||
PORT_CONFSETTING( 0x03, "No cartridge" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( gl8008cx )
|
||||
INPUT_PORTS_END
|
||||
|
||||
void geniusiq_state::machine_start()
|
||||
{
|
||||
m_cart = (UINT8*)(*memregion("cart"));
|
||||
}
|
||||
|
||||
void geniusiq_state::machine_reset()
|
||||
{
|
||||
m_keyboard.head = m_keyboard.tail = 0;
|
||||
@ -707,6 +721,57 @@ void geniusiq_state::machine_reset()
|
||||
m_mouse_gfx_posy = 0;
|
||||
}
|
||||
|
||||
int geniusiq_state::cart_load(device_image_interface &image)
|
||||
{
|
||||
if (image.software_entry() == NULL)
|
||||
{
|
||||
UINT32 size = image.length();
|
||||
if (image.fread(m_cart, size) != size)
|
||||
return IMAGE_INIT_FAIL;
|
||||
|
||||
m_cart_state = IQ128_ROM_CART;
|
||||
}
|
||||
else
|
||||
{
|
||||
UINT32 size = image.get_software_region_length("rom");
|
||||
if (size > 1)
|
||||
memcpy(m_cart, image.get_software_region("rom"), size);
|
||||
|
||||
const char *pcb_type = image.get_feature("pcb_type");
|
||||
if (pcb_type)
|
||||
{
|
||||
if (!strcmp(pcb_type, "romless1"))
|
||||
m_cart_state = IQ128_ROMLESS1_CART;
|
||||
else if (!strcmp(pcb_type, "romless2"))
|
||||
m_cart_state = IQ128_ROMLESS2_CART;
|
||||
else if (!strcmp(pcb_type, "rom"))
|
||||
m_cart_state = IQ128_ROM_CART;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_cart_state = IQ128_ROM_CART;
|
||||
}
|
||||
}
|
||||
|
||||
return IMAGE_INIT_PASS;
|
||||
}
|
||||
|
||||
void geniusiq_state::cart_unload(device_image_interface &image)
|
||||
{
|
||||
memset(m_cart, 0xff, memregion("cart")->bytes());
|
||||
m_cart_state = IQ128_NO_CART;
|
||||
}
|
||||
|
||||
static DEVICE_IMAGE_LOAD(iq128_cart)
|
||||
{
|
||||
return image.device().machine().driver_data<geniusiq_state>()->cart_load(image);
|
||||
}
|
||||
|
||||
static DEVICE_IMAGE_UNLOAD(iq128_cart)
|
||||
{
|
||||
image.device().machine().driver_data<geniusiq_state>()->cart_unload(image);
|
||||
}
|
||||
|
||||
static MACHINE_CONFIG_START( iq128, geniusiq_state )
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_ADD("maincpu", M68000, XTAL_32MHz/2) // The main crystal is at 32MHz, not sure whats the CPU freq
|
||||
@ -724,6 +789,17 @@ static MACHINE_CONFIG_START( iq128, geniusiq_state )
|
||||
|
||||
/* internal flash */
|
||||
MCFG_AMD_29F010_ADD("flash")
|
||||
|
||||
/* cartridge */
|
||||
MCFG_CARTSLOT_ADD("cart")
|
||||
MCFG_CARTSLOT_EXTENSION_LIST("bin")
|
||||
MCFG_CARTSLOT_NOT_MANDATORY
|
||||
MCFG_CARTSLOT_LOAD(iq128_cart)
|
||||
MCFG_CARTSLOT_UNLOAD(iq128_cart)
|
||||
MCFG_CARTSLOT_INTERFACE("iq128_cart")
|
||||
|
||||
/* Software lists */
|
||||
MCFG_SOFTWARE_LIST_ADD("cart_list", "iq128")
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( iqtv512, iq128 )
|
||||
@ -751,16 +827,22 @@ MACHINE_CONFIG_END
|
||||
ROM_START( iq128 )
|
||||
ROM_REGION(0x200000, "maincpu", 0)
|
||||
ROM_LOAD( "27-5947-00.bin", 0x0000, 0x200000, CRC(a98fc3ff) SHA1(de76a5898182bd0180bd2b3e34c4502f0918a3fa) )
|
||||
|
||||
ROM_REGION(0x100000, "cart", ROMREGION_ERASEFF)
|
||||
ROM_END
|
||||
|
||||
ROM_START( iq128_fr )
|
||||
ROM_REGION(0x200000, "maincpu", 0)
|
||||
ROM_LOAD( "geniusiq.bin", 0x0000, 0x200000, CRC(9b06cbf1) SHA1(b9438494a9575f78117c0033761f899e3c14e292) )
|
||||
|
||||
ROM_REGION(0x100000, "cart", ROMREGION_ERASEFF)
|
||||
ROM_END
|
||||
|
||||
ROM_START( iqtv512 )
|
||||
ROM_REGION(0x200000, "maincpu", 0)
|
||||
ROM_LOAD( "27-06171-000.bin", 0x0000, 0x200000, CRC(2597af70) SHA1(9db8151a84517407d380424410b6fa0003ceb1eb) )
|
||||
|
||||
ROM_REGION(0x100000, "cart", ROMREGION_ERASEFF)
|
||||
ROM_END
|
||||
|
||||
ROM_START( gl8008cx )
|
||||
|
Loading…
Reference in New Issue
Block a user