ti99: Unwrapped sound access

This commit is contained in:
Michael Zapf 2016-04-03 00:10:37 +02:00
parent 3af8030bb6
commit d3eeb13429
9 changed files with 140 additions and 349 deletions

View File

@ -122,7 +122,19 @@ void ti99_datamux_device::read_all(address_space& space, UINT16 addr, UINT8 *val
} }
// Video // Video
if ((addr & 0xf801)==0x8800) m_video->readz(space, addr, value); if ((addr & 0xf801)==0x8800)
{
if (addr & 2)
{
// Read VDP status
*value = m_video->register_read(space, 0);
}
else
{
// Read VDP RAM
*value = m_video->vram_read(space, 0);
}
}
} }
// GROMport (ROMs) // GROMport (ROMs)
@ -147,10 +159,23 @@ void ti99_datamux_device::write_all(address_space& space, UINT16 addr, UINT8 val
m_gromport->write(space, addr, value); m_gromport->write(space, addr, value);
} }
// Other devices // Cartridge port and sound
if ((addr & 0xe000)==0x6000) m_gromport->write(space, addr, value); if ((addr & 0xe000)==0x6000) m_gromport->write(space, addr, value);
if ((addr & 0xfc01)==0x8400) m_sound->write(space, addr, value); if ((addr & 0xfc01)==0x8400) m_sound->write(space, 0, value);
if ((addr & 0xf801)==0x8800) m_video->write(space, addr, value);
// Video
if ((addr & 0xf801)==0x8800)
{
if (addr & 2)
{
// Write VDP address
m_video->register_write(space, 0, value);
}
else
{ // Write VDP data
m_video->vram_write(space, 0, value);
}
}
// PEB gets all accesses // PEB gets all accesses
m_peb->write(space, addr, value); m_peb->write(space, addr, value);
@ -182,12 +207,7 @@ void ti99_datamux_device::setaddress_all(address_space& space, UINT16 addr)
// GROMport (GROMs) // GROMport (GROMs)
m_gromport->set_gromlines(space, lines, select); m_gromport->set_gromlines(space, lines, select);
if (validaccess) // Sound chip and video chip do not require the address to be set before access
{
// Other devices
if ((addr & 0xfc01)==0x8400) m_sound->setaddress_dbin(space, addr, m_dbin);
if ((addr & 0xf801)==0x8800) m_video->setaddress_dbin(space, addr, m_dbin);
}
// GROMport (ROMs) // GROMport (ROMs)
m_gromport->romgq_line(iscartrom? ASSERT_LINE : CLEAR_LINE); m_gromport->romgq_line(iscartrom? ASSERT_LINE : CLEAR_LINE);
@ -557,8 +577,8 @@ void ti99_datamux_device::device_reset(void)
void ti99_datamux_device::device_config_complete() void ti99_datamux_device::device_config_complete()
{ {
m_video = downcast<bus8z_device*>(owner()->subdevice(VIDEO_SYSTEM_TAG)); m_video = downcast<tms9928a_device*>(owner()->subdevice(VDP_TAG));
m_sound = downcast<ti_sound_sn94624_device*>(owner()->subdevice(TISOUND_TAG)); m_sound = downcast<sn76496_base_device*>(owner()->subdevice(TISOUNDCHIP_TAG));
m_gromport = downcast<gromport_device*>(owner()->subdevice(GROMPORT_TAG)); m_gromport = downcast<gromport_device*>(owner()->subdevice(GROMPORT_TAG));
m_peb = downcast<peribox_device*>(owner()->subdevice(PERIBOX_TAG)); m_peb = downcast<peribox_device*>(owner()->subdevice(PERIBOX_TAG));
m_grom[0] = downcast<tmc0430_device*>(owner()->subdevice(GROM0_TAG)); m_grom[0] = downcast<tmc0430_device*>(owner()->subdevice(GROM0_TAG));

View File

@ -15,10 +15,11 @@
#define __DMUX__ #define __DMUX__
#include "ti99defs.h" #include "ti99defs.h"
#include "videowrp.h"
#include "machine/tmc0430.h" #include "machine/tmc0430.h"
#include "gromport.h" #include "gromport.h"
#include "bus/ti99_peb/peribox.h" #include "bus/ti99_peb/peribox.h"
#include "sound/sn76496.h"
#include "video/tms9928a.h"
extern const device_type DATAMUX; extern const device_type DATAMUX;
@ -54,10 +55,10 @@ protected:
private: private:
// Link to the video processor // Link to the video processor
bus8z_device* m_video; tms9928a_device* m_video;
// Link to the sound processor // Link to the sound processor
ti_sound_sn94624_device* m_sound; sn76496_base_device* m_sound;
// Link to the peripheral expansion box // Link to the peripheral expansion box
peribox_device* m_peb; peribox_device* m_peb;

View File

@ -207,7 +207,10 @@
geneve_mapper_device::geneve_mapper_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) geneve_mapper_device::geneve_mapper_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, GENEVE_MAPPER, "Geneve Gate Array", tag, owner, clock, "geneve_mapper", __FILE__), m_gromwaddr_LSB(false), m_gromraddr_LSB(false), m_grom_address(0), m_video_waitstates(false), m_extra_waitstates(false), m_ready_asserted(false), m_read_mode(false), m_debug_no_ws(false), m_geneve_mode(false), m_direct_mode(false), m_cartridge_size(0), m_cartridge_secondpage(false), m_cartridge6_writable(false), m_cartridge7_writable(false), m_turbo(false), m_genmod(false), m_timode(false), m_pfm_mode(0), m_pfm_bank(0), m_pfm_output_enable(false), m_sram_mask(0), m_sram_val(0), : device_t(mconfig, GENEVE_MAPPER, "Geneve Gate Array", tag, owner, clock, "geneve_mapper", __FILE__), m_gromwaddr_LSB(false), m_gromraddr_LSB(false), m_grom_address(0), m_video_waitstates(false), m_extra_waitstates(false), m_ready_asserted(false), m_read_mode(false), m_debug_no_ws(false), m_geneve_mode(false), m_direct_mode(false), m_cartridge_size(0), m_cartridge_secondpage(false), m_cartridge6_writable(false), m_cartridge7_writable(false), m_turbo(false), m_genmod(false), m_timode(false), m_pfm_mode(0), m_pfm_bank(0), m_pfm_output_enable(false), m_sram_mask(0), m_sram_val(0),
m_ready(*this), m_waitcount(0), m_ext_waitcount(0), m_clock(nullptr), m_cpu(nullptr), m_pfm512(nullptr), m_pfm512a(nullptr), m_keyboard(nullptr), m_video(nullptr), m_peribox(nullptr), m_sound(nullptr), m_sram(nullptr), m_dram(nullptr) m_ready(*this), m_waitcount(0), m_ext_waitcount(0),
m_clock(nullptr), m_cpu(nullptr), m_pfm512(nullptr),
m_pfm512a(nullptr), m_sound(nullptr), m_keyboard(nullptr),
m_video(nullptr), m_peribox(nullptr), m_sram(nullptr), m_dram(nullptr)
{ {
m_eprom = nullptr; m_eprom = nullptr;
} }
@ -466,11 +469,14 @@ READ8_MEMBER( geneve_mapper_device::readm )
switch (dec->function) switch (dec->function)
{ {
case MLGVIDEO: case MLGVIDEO:
m_video->readz(space, dec->offset, &value, 0xff); if (!space.debugger_access())
if (TRACE_READ) logerror("%s: Read video %04x -> %02x\n", tag(), dec->offset, value); {
// Video wait states are created *after* the access value = m_video->read(space, dec->offset>>1);
// Accordingly, they have no effect when execution is in onchip RAM if (TRACE_READ) logerror("%s: Read video %04x -> %02x\n", tag(), dec->offset, value);
if (m_video_waitstates) set_ext_wait(15); // Video wait states are created *after* the access
// Accordingly, they have no effect when execution is in onchip RAM
if (m_video_waitstates) set_ext_wait(15);
}
break; break;
case MLGMAPPER: case MLGMAPPER:
@ -523,10 +529,13 @@ READ8_MEMBER( geneve_mapper_device::readm )
// video // video
// ++++ ++-- ---- ---+ // ++++ ++-- ---- ---+
// 1000 1000 0000 00x0 // 1000 1000 0000 00x0
m_video->readz(space, dec->offset, &value, 0xff); if (!space.debugger_access())
if (TRACE_READ) logerror("%s: Read video %04x -> %02x\n", tag(), dec->offset, value); {
// See above value = m_video->read(space, dec->offset>>1);
if (m_video_waitstates) set_ext_wait(15); if (TRACE_READ) logerror("%s: Read video %04x -> %02x\n", tag(), dec->offset, value);
// See above
if (m_video_waitstates) set_ext_wait(15);
}
break; break;
case MLTSPEECH: case MLTSPEECH:
@ -649,10 +658,14 @@ WRITE8_MEMBER( geneve_mapper_device::writem )
// video // video
// ++++ ++++ ++++ ---+ // ++++ ++++ ++++ ---+
// 1111 0001 0000 .cc0 // 1111 0001 0000 .cc0
m_video->write(space, dec->offset, data, 0xff);
if (TRACE_WRITE) logerror("%s: Write video %04x <- %02x\n", tag(), offset, data); if (!space.debugger_access())
// See above {
if (m_video_waitstates) set_ext_wait(15); m_video->write(space, dec->offset>>1, data);
if (TRACE_WRITE) logerror("%s: Write video %04x <- %02x\n", tag(), offset, data);
// See above
if (m_video_waitstates) set_ext_wait(15);
}
break; break;
case MLGMAPPER: case MLGMAPPER:
@ -692,10 +705,13 @@ WRITE8_MEMBER( geneve_mapper_device::writem )
// ++++ ++-- ---- ---+ // ++++ ++-- ---- ---+
// 1000 1100 0000 00c0 // 1000 1100 0000 00c0
// Initialize waitstate timer // Initialize waitstate timer
m_video->write(space, dec->offset, data, 0xff); if (!space.debugger_access())
if (TRACE_WRITE) logerror("%s: Write video %04x <- %02x\n", tag(), offset, data); {
// See above m_video->write(space, dec->offset>>1, data);
if (m_video_waitstates) set_ext_wait(15); if (TRACE_WRITE) logerror("%s: Write video %04x <- %02x\n", tag(), offset, data);
// See above
if (m_video_waitstates) set_ext_wait(15);
}
break; break;
case MLTSPEECH: case MLTSPEECH:
@ -1360,8 +1376,8 @@ void geneve_mapper_device::device_start()
// Get pointers // Get pointers
m_peribox = machine().device<peribox_device>(PERIBOX_TAG); m_peribox = machine().device<peribox_device>(PERIBOX_TAG);
m_keyboard = machine().device<geneve_keyboard_device>(GKEYBOARD_TAG); m_keyboard = machine().device<geneve_keyboard_device>(GKEYBOARD_TAG);
m_video = machine().device<bus8z_device>(VIDEO_SYSTEM_TAG); m_video = machine().device<v9938_device>(VDP_TAG);
m_sound = machine().device<bus8z_device>(TISOUND_TAG); m_sound = machine().device<sn76496_base_device>(TISOUNDCHIP_TAG);
m_clock = machine().device<mm58274c_device>(GCLOCK_TAG); m_clock = machine().device<mm58274c_device>(GCLOCK_TAG);
// PFM expansion // PFM expansion

View File

@ -20,6 +20,7 @@
#include "cpu/tms9900/tms9995.h" #include "cpu/tms9900/tms9995.h"
#include "machine/at29x.h" #include "machine/at29x.h"
#include "bus/ti99_peb/peribox.h" #include "bus/ti99_peb/peribox.h"
#include "sound/sn76496.h"
extern const device_type GENEVE_MOUSE; extern const device_type GENEVE_MOUSE;
extern const device_type GENEVE_KEYBOARD; extern const device_type GENEVE_KEYBOARD;
@ -205,11 +206,11 @@ private:
tms9995_device* m_cpu; tms9995_device* m_cpu;
at29c040_device* m_pfm512; at29c040_device* m_pfm512;
at29c040a_device* m_pfm512a; at29c040a_device* m_pfm512a;
sn76496_base_device* m_sound;
geneve_keyboard_device* m_keyboard; geneve_keyboard_device* m_keyboard;
bus8z_device* m_video; v9938_device* m_video;
peribox_device* m_peribox; peribox_device* m_peribox;
bus8z_device* m_sound;
UINT8* m_eprom; UINT8* m_eprom;
UINT8* m_sram; UINT8* m_sram;
UINT8* m_dram; UINT8* m_dram;

View File

@ -2,7 +2,7 @@
// copyright-holders:Michael Zapf // copyright-holders:Michael Zapf
/**************************************************************************** /****************************************************************************
TI-99/4(A) and /8 Video subsystem TI-99/4A Video subsystem
This device actually wraps the naked video chip implementation This device actually wraps the naked video chip implementation
EVPC (Enhanced Video Processor Card) from SNUG EVPC (Enhanced Video Processor Card) from SNUG
@ -11,18 +11,12 @@
The SGCPU ("TI-99/4P") only runs with EVPC The SGCPU ("TI-99/4P") only runs with EVPC
We also include a class wrapper for the sound chip here.
Michael Zapf Michael Zapf
October 2010
February 2012: Rewritten as class
*****************************************************************************/ *****************************************************************************/
#include "emu.h" #include "emu.h"
#include "videowrp.h" #include "videowrp.h"
#include "sound/sn76496.h"
/* /*
Constructors Constructors
@ -45,19 +39,9 @@ ti_exp_video_device::ti_exp_video_device(const machine_config &mconfig, const ch
{ {
} }
ti_sound_sn94624_device::ti_sound_sn94624_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: ti_sound_system_device(mconfig, TISOUND_94624, "Onboard sound (SN94624)", tag, owner, clock, "ti_sound_sn94624", __FILE__)
{
}
ti_sound_sn76496_device::ti_sound_sn76496_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: ti_sound_system_device(mconfig, TISOUND_76496, "Onboard sound (SN76496)", tag, owner, clock, "ti_sound_sn76496", __FILE__)
{
}
/*****************************************************************************/ /*****************************************************************************/
/* /*
Memory access (TI-99/4A and TI-99/8) Accessing TMS9928A (TI-99/4A)
*/ */
READ8Z_MEMBER( ti_std_video_device::readz ) READ8Z_MEMBER( ti_std_video_device::readz )
{ {
@ -90,45 +74,18 @@ WRITE8_MEMBER( ti_std_video_device::write )
/*****************************************************************************/ /*****************************************************************************/
/* /*
Memory access (EVPC) via 16 bit bus Accessing v9938 via 16 bit bus (SGCPU)
*/ */
READ16_MEMBER( ti_exp_video_device::read16 ) READ16_MEMBER( ti_exp_video_device::read16 )
{ {
if (space.debugger_access()) return 0; if (space.debugger_access()) return 0;
return (int)(m_v9938->read(space, offset)<<8);
if (offset & 1)
{ /* read VDP status */
return ((int) m_v9938->status_r()) << 8;
}
else
{ /* read VDP RAM */
return ((int) m_v9938->vram_r()) << 8;
}
} }
WRITE16_MEMBER( ti_exp_video_device::write16 ) WRITE16_MEMBER( ti_exp_video_device::write16 )
{ {
if (space.debugger_access()) return; if (space.debugger_access()) return;
m_v9938->write(space, offset, (data>>8)&0xff);
switch (offset & 3)
{
case 0:
/* write VDP data */
m_v9938->vram_w((data >> 8) & 0xff);
break;
case 1:
/* write VDP address */
m_v9938->command_w((data >> 8) & 0xff);
break;
case 2:
/* write VDP palette */
m_v9938->palette_w((data >> 8) & 0xff);
break;
case 3:
/* write VDP register pointer (indirect access) */
m_v9938->register_w((data >> 8) & 0xff);
break;
}
} }
void ti_exp_video_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) void ti_exp_video_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
@ -142,60 +99,20 @@ void ti_exp_video_device::device_timer(emu_timer &timer, device_timer_id id, int
/******************************************************************************/ /******************************************************************************/
/* /*
Video read (Geneve) via 8 bit bus Accessing v9938 via 8 bit bus (EVPC)
*/ */
READ8Z_MEMBER( ti_exp_video_device::readz ) READ8Z_MEMBER( ti_exp_video_device::readz )
{ {
if (space.debugger_access()) return; if (space.debugger_access()) return;
*value = m_v9938->read(space, offset>>1);
if (offset & 2)
{ /* read VDP status */
*value = m_v9938->status_r();
}
else
{ /* read VDP RAM */
*value = m_v9938->vram_r();
}
} }
/*
Video write (Geneve)
*/
WRITE8_MEMBER( ti_exp_video_device::write ) WRITE8_MEMBER( ti_exp_video_device::write )
{ {
if (space.debugger_access()) return; if (space.debugger_access()) return;
m_v9938->write(space, offset>>1, data);
switch (offset & 6)
{
case 0:
/* write VDP data */
m_v9938->vram_w(data);
break;
case 2:
/* write VDP address */
m_v9938->command_w(data);
break;
case 4:
/* write VDP palette */
m_v9938->palette_w(data);
break;
case 6:
/* write VDP register pointer (indirect access) */
m_v9938->register_w(data);
break;
}
} }
/**************************************************************************/
// Interfacing to mouse attached to v9938
void ti_exp_video_device::video_update_mouse(int delta_x, int delta_y, int buttons)
{
m_v9938->update_mouse_state(delta_x, delta_y, buttons & 3);
}
/**************************************************************************/
void ti_video_device::device_start(void) void ti_video_device::device_start(void)
{ {
m_tms9928a = static_cast<tms9928a_device*>(machine().device(VDP_TAG)); m_tms9928a = static_cast<tms9928a_device*>(machine().device(VDP_TAG));
@ -215,58 +132,5 @@ void ti_exp_video_device::device_reset(void)
/**************************************************************************/ /**************************************************************************/
/*
Sound subsystem.
TODO: Seriously consider to simplify this by connecting to the datamux
directly. We don't do anything reasonable here.
*/
WRITE8_MEMBER( ti_sound_system_device::write )
{
if (space.debugger_access()) return;
m_sound_chip->write(space, 0, data);
}
void ti_sound_system_device::device_start(void)
{
m_console_ready.resolve();
m_sound_chip = subdevice<sn76496_base_device>(TISOUNDCHIP_TAG);
}
WRITE_LINE_MEMBER( ti_sound_system_device::sound_ready )
{
m_console_ready(state);
}
MACHINE_CONFIG_FRAGMENT( sn94624 )
MCFG_SPEAKER_STANDARD_MONO("sound_out")
MCFG_SOUND_ADD(TISOUNDCHIP_TAG, SN94624, 3579545/8) /* 3.579545 MHz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "sound_out", 0.75)
MCFG_SN76496_READY_HANDLER(WRITELINE(ti_sound_system_device, sound_ready))
MACHINE_CONFIG_END
MACHINE_CONFIG_FRAGMENT( sn76496 )
MCFG_SPEAKER_STANDARD_MONO("sound_out")
MCFG_SOUND_ADD(TISOUNDCHIP_TAG, SN76496, 3579545) /* 3.579545 MHz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "sound_out", 0.75)
MCFG_SN76496_READY_HANDLER(WRITELINE(ti_sound_system_device, sound_ready))
MACHINE_CONFIG_END
machine_config_constructor ti_sound_sn94624_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( sn94624 );
}
machine_config_constructor ti_sound_sn76496_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( sn76496 );
}
/**************************************************************************/
const device_type TI99VIDEO = &device_creator<ti_std_video_device>; const device_type TI99VIDEO = &device_creator<ti_std_video_device>;
const device_type V9938VIDEO = &device_creator<ti_exp_video_device>; const device_type V9938VIDEO = &device_creator<ti_exp_video_device>;
const device_type TISOUND_94624 = &device_creator<ti_sound_sn94624_device>;
const device_type TISOUND_76496 = &device_creator<ti_sound_sn76496_device>;

View File

@ -2,7 +2,7 @@
// copyright-holders:Michael Zapf // copyright-holders:Michael Zapf
/**************************************************************************** /****************************************************************************
TI-99/4(A) and /8 Video subsystem TI-99/4A / EVPC Video subsystem
See videowrp.c for documentation See videowrp.c for documentation
Michael Zapf Michael Zapf
@ -17,7 +17,6 @@
#include "video/tms9928a.h" #include "video/tms9928a.h"
#include "video/v9938.h" #include "video/v9938.h"
#include "ti99defs.h" #include "ti99defs.h"
#include "sound/sn76496.h"
class ti_video_device : public bus8z_device class ti_video_device : public bus8z_device
{ {
@ -49,7 +48,7 @@ public:
}; };
/* /*
Used in the EVPC and Geneve Used in the EVPC
*/ */
class ti_exp_video_device : public ti_video_device class ti_exp_video_device : public ti_video_device
{ {
@ -57,7 +56,6 @@ public:
ti_exp_video_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); ti_exp_video_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
template<class _Object> static devcb_base &set_out_gromclk_callback(device_t &device, _Object object) { return downcast<ti_exp_video_device &>(device).m_out_gromclk_cb.set_callback(object); } template<class _Object> static devcb_base &set_out_gromclk_callback(device_t &device, _Object object) { return downcast<ti_exp_video_device &>(device).m_out_gromclk_cb.set_callback(object); }
void video_update_mouse(int delta_x, int delta_y, int buttons);
DECLARE_READ8Z_MEMBER(readz) override; DECLARE_READ8Z_MEMBER(readz) override;
DECLARE_WRITE8_MEMBER(write) override; DECLARE_WRITE8_MEMBER(write) override;
DECLARE_READ16_MEMBER(read16); DECLARE_READ16_MEMBER(read16);
@ -82,64 +80,6 @@ private:
extern const device_type TI99VIDEO; extern const device_type TI99VIDEO;
extern const device_type V9938VIDEO; extern const device_type V9938VIDEO;
/****************************************************************************/
/*
Sound device
*/
extern const device_type TISOUND_94624;
extern const device_type TISOUND_76496;
#define TI_SOUND_CONFIG(name) \
const ti_sound_config(name) =
class ti_sound_system_device : public bus8z_device
{
public:
ti_sound_system_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
: bus8z_device(mconfig, type, name, tag, owner, clock, shortname, source), m_sound_chip(nullptr),
m_console_ready(*this) { };
// Cannot read from sound; just ignore silently
DECLARE_READ8Z_MEMBER(readz) override { };
DECLARE_WRITE8_MEMBER(write) override;
DECLARE_WRITE_LINE_MEMBER( sound_ready ); // connect to console READY
template<class _Object> static devcb_base &static_set_int_callback(device_t &device, _Object object) { return downcast<ti_sound_system_device &>(device).m_console_ready.set_callback(object); }
protected:
virtual void device_start(void) override;
virtual machine_config_constructor device_mconfig_additions() const override =0;
private:
sn76496_base_device* m_sound_chip;
devcb_write_line m_console_ready;
};
/*
The version that sits in the TI-99/4A
*/
class ti_sound_sn94624_device : public ti_sound_system_device
{
public:
ti_sound_sn94624_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
protected:
virtual machine_config_constructor device_mconfig_additions() const override;
};
/*
The version that sits in the TI-99/8 and Geneve
*/
class ti_sound_sn76496_device : public ti_sound_system_device
{
public:
ti_sound_sn76496_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
protected:
virtual machine_config_constructor device_mconfig_additions() const override;
};
/****************************************************************************/ /****************************************************************************/
@ -161,31 +101,4 @@ protected:
MCFG_TMS9928A_SCREEN_ADD_PAL( SCREEN_TAG ) \ MCFG_TMS9928A_SCREEN_ADD_PAL( SCREEN_TAG ) \
MCFG_SCREEN_UPDATE_DEVICE( VDP_TAG, tms9928a_device, screen_update ) MCFG_SCREEN_UPDATE_DEVICE( VDP_TAG, tms9928a_device, screen_update )
#define MCFG_TI998_ADD_NTSC(_tag, _chip, _vsize, _class, _int, _gclk) \
MCFG_DEVICE_ADD(_tag, TI99VIDEO, 0) \
MCFG_DEVICE_ADD( VDP_TAG, _chip, XTAL_10_738635MHz / 2 ) \
MCFG_TMS9928A_VRAM_SIZE(_vsize) \
MCFG_TMS9928A_OUT_INT_LINE_CB(WRITELINE(_class,_int)) \
MCFG_TMS9928A_OUT_GROMCLK_CB(WRITELINE(_class,_gclk)) \
MCFG_TMS9928A_SCREEN_ADD_NTSC( SCREEN_TAG ) \
MCFG_SCREEN_UPDATE_DEVICE( VDP_TAG, tms9928a_device, screen_update )
#define MCFG_TI998_ADD_PAL(_tag, _chip, _vsize, _class, _int, _gclk) \
MCFG_DEVICE_ADD(_tag, TI99VIDEO, 0) \
MCFG_DEVICE_ADD( VDP_TAG, _chip, XTAL_10_738635MHz / 2 ) \
MCFG_TMS9928A_VRAM_SIZE(_vsize) \
MCFG_TMS9928A_OUT_INT_LINE_CB(WRITELINE(_class,_int)) \
MCFG_TMS9928A_OUT_GROMCLK_CB(WRITELINE(_class,_gclk)) \
MCFG_TMS9928A_SCREEN_ADD_PAL( SCREEN_TAG ) \
MCFG_SCREEN_UPDATE_DEVICE( VDP_TAG, tms9928a_device, screen_update )
#define MCFG_TI_SOUND_94624_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, TISOUND_94624, 0)
#define MCFG_TI_SOUND_76496_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, TISOUND_76496, 0)
#define MCFG_TI_SOUND_READY_HANDLER( _ready ) \
devcb = &ti_sound_system_device::static_set_int_callback( *device, DEVCB_##_ready );
#endif /* __TIVIDEO__ */ #endif /* __TIVIDEO__ */

View File

@ -210,7 +210,6 @@
#include "sound/sn76496.h" #include "sound/sn76496.h"
#include "bus/ti99x/genboard.h" #include "bus/ti99x/genboard.h"
#include "bus/ti99x/videowrp.h"
#include "bus/ti99x/joyport.h" #include "bus/ti99x/joyport.h"
#include "bus/ti99_peb/peribox.h" #include "bus/ti99_peb/peribox.h"
@ -690,8 +689,7 @@ static MACHINE_CONFIG_START( geneve_60hz, geneve_state )
MCFG_TMS9995_CLKOUT_HANDLER( WRITELINE(geneve_state, clock_out) ) MCFG_TMS9995_CLKOUT_HANDLER( WRITELINE(geneve_state, clock_out) )
MCFG_TMS9995_DBIN_HANDLER( WRITELINE(geneve_state, dbin_line) ) MCFG_TMS9995_DBIN_HANDLER( WRITELINE(geneve_state, dbin_line) )
// video hardware // Video hardware
MCFG_DEVICE_ADD(VIDEO_SYSTEM_TAG, V9938VIDEO, 0)
MCFG_V9938_ADD(VDP_TAG, SCREEN_TAG, 0x20000, XTAL_21_4772MHz) /* typical 9938 clock, not verified */ MCFG_V9938_ADD(VDP_TAG, SCREEN_TAG, 0x20000, XTAL_21_4772MHz) /* typical 9938 clock, not verified */
MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(geneve_state, set_tms9901_INT2_from_v9938)) MCFG_V99X8_INTERRUPT_CALLBACK(WRITELINE(geneve_state, set_tms9901_INT2_from_v9938))
MCFG_V99X8_SCREEN_ADD_NTSC(SCREEN_TAG, VDP_TAG, XTAL_21_4772MHz) MCFG_V99X8_SCREEN_ADD_NTSC(SCREEN_TAG, VDP_TAG, XTAL_21_4772MHz)
@ -726,9 +724,11 @@ static MACHINE_CONFIG_START( geneve_60hz, geneve_state )
MCFG_PERIBOX_INTB_HANDLER( WRITELINE(geneve_state, intb) ) MCFG_PERIBOX_INTB_HANDLER( WRITELINE(geneve_state, intb) )
MCFG_PERIBOX_READY_HANDLER( WRITELINE(geneve_state, ext_ready) ) MCFG_PERIBOX_READY_HANDLER( WRITELINE(geneve_state, ext_ready) )
// sound hardware // Sound hardware
MCFG_TI_SOUND_76496_ADD( TISOUND_TAG ) MCFG_SPEAKER_STANDARD_MONO("sound_out")
MCFG_TI_SOUND_READY_HANDLER( WRITELINE(geneve_state, ext_ready) ) MCFG_SOUND_ADD(TISOUNDCHIP_TAG, SN76496, 3579545) /* 3.579545 MHz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "sound_out", 0.75)
MCFG_SN76496_READY_HANDLER( WRITELINE(geneve_state, ext_ready) )
// User interface devices // User interface devices
MCFG_DEVICE_ADD( GKEYBOARD_TAG, GENEVE_KEYBOARD, 0 ) MCFG_DEVICE_ADD( GKEYBOARD_TAG, GENEVE_KEYBOARD, 0 )

View File

@ -41,6 +41,7 @@
#include "cpu/tms9900/tms9900.h" #include "cpu/tms9900/tms9900.h"
#include "sound/wave.h" #include "sound/wave.h"
#include "sound/dac.h" #include "sound/dac.h"
#include "sound/sn76496.h"
#include "machine/tms9901.h" #include "machine/tms9901.h"
#include "imagedev/cassette.h" #include "imagedev/cassette.h"
@ -53,8 +54,9 @@
#define TMS9901_TAG "tms9901" #define TMS9901_TAG "tms9901"
#define SGCPU_TAG "sgcpu" #define SGCPU_TAG "sgcpu"
#define VERBOSE 1 #define TRACE_ILLWRITE 0
#define LOG logerror #define TRACE_READY 0
#define TRACE_INT 0
class ti99_4p_state : public driver_device class ti99_4p_state : public driver_device
{ {
@ -63,7 +65,7 @@ public:
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag),
m_cpu(*this, "maincpu"), m_cpu(*this, "maincpu"),
m_tms9901(*this, TMS9901_TAG), m_tms9901(*this, TMS9901_TAG),
m_sound(*this, TISOUND_TAG), m_sound(*this, TISOUNDCHIP_TAG),
m_video(*this, VIDEO_SYSTEM_TAG), m_video(*this, VIDEO_SYSTEM_TAG),
m_cassette(*this, "cassette"), m_cassette(*this, "cassette"),
m_peribox(*this, PERIBOX_TAG), m_peribox(*this, PERIBOX_TAG),
@ -103,13 +105,13 @@ public:
DECLARE_WRITE_LINE_MEMBER(set_tms9901_INT2_from_v9938); DECLARE_WRITE_LINE_MEMBER(set_tms9901_INT2_from_v9938);
required_device<tms9900_device> m_cpu; required_device<tms9900_device> m_cpu;
required_device<tms9901_device> m_tms9901; required_device<tms9901_device> m_tms9901;
required_device<ti_sound_system_device> m_sound; required_device<sn76496_base_device> m_sound;
required_device<ti_exp_video_device> m_video; required_device<ti_exp_video_device> m_video;
required_device<cassette_image_device> m_cassette; required_device<cassette_image_device> m_cassette;
required_device<peribox_device> m_peribox; required_device<peribox_device> m_peribox;
required_device<joyport_device> m_joyport; required_device<joyport_device> m_joyport;
// Pointer to ROM0 // Pointer to ROM0
UINT16 *m_rom0; UINT16 *m_rom0;
@ -354,7 +356,7 @@ WRITE16_MEMBER( ti99_4p_state::memwrite )
if (zone==0x0000) if (zone==0x0000)
{ {
// ROM0 // ROM0
if (VERBOSE>4) LOG("sgcpu: ignoring ROM write access at %04x\n", addroff); if (TRACE_ILLWRITE) logerror("Ignoring ROM write access at %04x\n", addroff);
return; return;
} }
@ -368,7 +370,7 @@ WRITE16_MEMBER( ti99_4p_state::memwrite )
{ {
if (m_internal_dsr) if (m_internal_dsr)
{ {
if (VERBOSE>4) LOG("sgcpu: ignoring DSR write access at %04x\n", addroff); if (TRACE_ILLWRITE) logerror("Ignoring DSR write access at %04x\n", addroff);
return; return;
} }
else else
@ -692,39 +694,6 @@ WRITE_LINE_MEMBER( ti99_4p_state::cassette_output )
m_cassette->output((state!=0)? +1 : -1); m_cassette->output((state!=0)? +1 : -1);
} }
/*
// TMS9901 setup. The callback functions pass a reference to the TMS9901 as device.
const tms9901_interface tms9901_wiring_sgcpu =
{
TMS9901_INT1 | TMS9901_INT2 | TMS9901_INTC, // only input pins whose state is always known
// read handler
DEVCB_DRIVER_MEMBER(ti99_4p_state, read_by_9901),
{ // write handlers
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(ti99_4p_state, keyC0),
DEVCB_DRIVER_LINE_MEMBER(ti99_4p_state, keyC1),
DEVCB_DRIVER_LINE_MEMBER(ti99_4p_state, keyC2),
DEVCB_DRIVER_LINE_MEMBER(ti99_4p_state, alphaW),
DEVCB_DRIVER_LINE_MEMBER(ti99_4p_state, cs_motor),
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(ti99_4p_state, audio_gate),
DEVCB_DRIVER_LINE_MEMBER(ti99_4p_state, cassette_output),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
},
// interrupt handler
DEVCB_DRIVER_MEMBER(ti99_4p_state, tms9901_interrupt)
};
*/
/*************************************************************************** /***************************************************************************
Control lines Control lines
@ -741,9 +710,9 @@ WRITE_LINE_MEMBER( ti99_4p_state::console_ready )
m_ready_line = state; m_ready_line = state;
int combined = (m_ready_line == ASSERT_LINE && m_ready_line_dmux == ASSERT_LINE)? ASSERT_LINE : CLEAR_LINE; int combined = (m_ready_line == ASSERT_LINE && m_ready_line_dmux == ASSERT_LINE)? ASSERT_LINE : CLEAR_LINE;
if (VERBOSE>6) if (TRACE_READY)
{ {
if (m_ready_prev != combined) LOG("ti99_4p: READY level = %d\n", combined); if (m_ready_prev != combined) logerror("READY level = %d\n", combined);
} }
m_ready_prev = combined; m_ready_prev = combined;
m_cpu->set_ready(combined); m_cpu->set_ready(combined);
@ -759,9 +728,9 @@ WRITE_LINE_MEMBER( ti99_4p_state::console_ready_dmux )
m_ready_line_dmux = state; m_ready_line_dmux = state;
int combined = (m_ready_line == ASSERT_LINE && m_ready_line_dmux == ASSERT_LINE)? ASSERT_LINE : CLEAR_LINE; int combined = (m_ready_line == ASSERT_LINE && m_ready_line_dmux == ASSERT_LINE)? ASSERT_LINE : CLEAR_LINE;
if (VERBOSE>7) if (TRACE_READY)
{ {
if (m_ready_prev != combined) LOG("ti99_4p: READY dmux level = %d\n", state); if (m_ready_prev != combined) logerror("READY dmux level = %d\n", state);
} }
m_ready_prev = combined; m_ready_prev = combined;
m_cpu->set_ready(combined); m_cpu->set_ready(combined);
@ -777,13 +746,13 @@ void ti99_4p_state::set_9901_int( int line, line_state state)
WRITE_LINE_MEMBER( ti99_4p_state::extint ) WRITE_LINE_MEMBER( ti99_4p_state::extint )
{ {
if (VERBOSE>6) LOG("ti99_4p: EXTINT level = %02x\n", state); if (TRACE_INT) logerror("EXTINT level = %02x\n", state);
set_9901_int(1, (line_state)state); set_9901_int(1, (line_state)state);
} }
WRITE_LINE_MEMBER( ti99_4p_state::notconnected ) WRITE_LINE_MEMBER( ti99_4p_state::notconnected )
{ {
if (VERBOSE>6) LOG("ti99_4p: Setting a not connected line ... ignored\n"); if (TRACE_INT) logerror("Setting a not connected line ... ignored\n");
} }
/* /*
@ -812,7 +781,7 @@ READ8_MEMBER( ti99_4p_state::interrupt_level )
WRITE8_MEMBER( ti99_4p_state::external_operation ) WRITE8_MEMBER( ti99_4p_state::external_operation )
{ {
static const char* extop[8] = { "inv1", "inv2", "IDLE", "RSET", "inv3", "CKON", "CKOF", "LREX" }; static const char* extop[8] = { "inv1", "inv2", "IDLE", "RSET", "inv3", "CKON", "CKOF", "LREX" };
if (VERBOSE>1) LOG("External operation %s not implemented on the SGCPU board\n", extop[offset]); logerror("External operation %s not implemented on the SGCPU board\n", extop[offset]);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -891,9 +860,11 @@ static MACHINE_CONFIG_START( ti99_4p_60hz, ti99_4p_state )
MCFG_PERIBOX_INTB_HANDLER( WRITELINE(ti99_4p_state, notconnected) ) MCFG_PERIBOX_INTB_HANDLER( WRITELINE(ti99_4p_state, notconnected) )
MCFG_PERIBOX_READY_HANDLER( WRITELINE(ti99_4p_state, console_ready) ) MCFG_PERIBOX_READY_HANDLER( WRITELINE(ti99_4p_state, console_ready) )
// sound hardware // Sound hardware
MCFG_TI_SOUND_94624_ADD( TISOUND_TAG ) MCFG_SPEAKER_STANDARD_MONO("sound_out")
MCFG_TI_SOUND_READY_HANDLER( WRITELINE(ti99_4p_state, console_ready) ) MCFG_SOUND_ADD(TISOUNDCHIP_TAG, SN94624, 3579545/8) /* 3.579545 MHz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "sound_out", 0.75)
MCFG_SN76496_READY_HANDLER( WRITELINE(ti99_4p_state, console_ready) )
// Cassette drives // Cassette drives
MCFG_SPEAKER_STANDARD_MONO("cass_out") MCFG_SPEAKER_STANDARD_MONO("cass_out")

View File

@ -814,9 +814,11 @@ static MACHINE_CONFIG_START( ti99_4, ti99_4x_state )
MCFG_PERIBOX_INTB_HANDLER( WRITELINE(ti99_4x_state, notconnected) ) MCFG_PERIBOX_INTB_HANDLER( WRITELINE(ti99_4x_state, notconnected) )
MCFG_PERIBOX_READY_HANDLER( DEVWRITELINE(DATAMUX_TAG, ti99_datamux_device, ready_line) ) MCFG_PERIBOX_READY_HANDLER( DEVWRITELINE(DATAMUX_TAG, ti99_datamux_device, ready_line) )
/* sound hardware */ // Sound hardware
MCFG_TI_SOUND_94624_ADD( TISOUND_TAG ) MCFG_SPEAKER_STANDARD_MONO("sound_out")
MCFG_TI_SOUND_READY_HANDLER( WRITELINE(ti99_4x_state, console_ready_sound) ) MCFG_SOUND_ADD(TISOUNDCHIP_TAG, SN94624, 3579545/8) /* 3.579545 MHz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "sound_out", 0.75)
MCFG_SN76496_READY_HANDLER( WRITELINE(ti99_4x_state, console_ready_sound) )
/* Cassette drives */ /* Cassette drives */
MCFG_SPEAKER_STANDARD_MONO("cass_out") MCFG_SPEAKER_STANDARD_MONO("cass_out")
@ -911,9 +913,11 @@ static MACHINE_CONFIG_START( ti99_4a, ti99_4x_state )
MCFG_PERIBOX_INTB_HANDLER( WRITELINE(ti99_4x_state, notconnected) ) MCFG_PERIBOX_INTB_HANDLER( WRITELINE(ti99_4x_state, notconnected) )
MCFG_PERIBOX_READY_HANDLER( DEVWRITELINE(DATAMUX_TAG, ti99_datamux_device, ready_line) ) MCFG_PERIBOX_READY_HANDLER( DEVWRITELINE(DATAMUX_TAG, ti99_datamux_device, ready_line) )
/* sound hardware */ // Sound hardware
MCFG_TI_SOUND_94624_ADD( TISOUND_TAG ) MCFG_SPEAKER_STANDARD_MONO("sound_out")
MCFG_TI_SOUND_READY_HANDLER( WRITELINE(ti99_4x_state, console_ready_sound) ) MCFG_SOUND_ADD(TISOUNDCHIP_TAG, SN94624, 3579545/8) /* 3.579545 MHz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "sound_out", 0.75)
MCFG_SN76496_READY_HANDLER( WRITELINE(ti99_4x_state, console_ready_sound) )
/* Cassette drives */ /* Cassette drives */
MCFG_SPEAKER_STANDARD_MONO("cass_out") MCFG_SPEAKER_STANDARD_MONO("cass_out")
@ -1034,9 +1038,11 @@ static MACHINE_CONFIG_START( ti99_4ev_60hz, ti99_4x_state )
MCFG_PERIBOX_INTB_HANDLER( WRITELINE(ti99_4x_state, notconnected) ) MCFG_PERIBOX_INTB_HANDLER( WRITELINE(ti99_4x_state, notconnected) )
MCFG_PERIBOX_READY_HANDLER( DEVWRITELINE(DATAMUX_TAG, ti99_datamux_device, ready_line) ) MCFG_PERIBOX_READY_HANDLER( DEVWRITELINE(DATAMUX_TAG, ti99_datamux_device, ready_line) )
/* sound hardware */ // Sound hardware
MCFG_TI_SOUND_94624_ADD( TISOUND_TAG ) MCFG_SPEAKER_STANDARD_MONO("sound_out")
MCFG_TI_SOUND_READY_HANDLER( WRITELINE(ti99_4x_state, console_ready_sound) ) MCFG_SOUND_ADD(TISOUNDCHIP_TAG, SN94624, 3579545/8) /* 3.579545 MHz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "sound_out", 0.75)
MCFG_SN76496_READY_HANDLER( WRITELINE(ti99_4x_state, console_ready_sound) )
/* Cassette drives */ /* Cassette drives */
MCFG_SPEAKER_STANDARD_MONO("cass_out") MCFG_SPEAKER_STANDARD_MONO("cass_out")
@ -1100,7 +1106,6 @@ ROM_START(ti99_4qi)
ROM_LOAD("994qigr2.bin", 0x4000, 0x1800, CRC(e0bb5341) SHA1(e255f0d65d69b927cecb8fcfac7a4c17d585ea96)) /* system GROM 2 */ ROM_LOAD("994qigr2.bin", 0x4000, 0x1800, CRC(e0bb5341) SHA1(e255f0d65d69b927cecb8fcfac7a4c17d585ea96)) /* system GROM 2 */
ROM_END ROM_END
ROM_START(ti99_4ev) ROM_START(ti99_4ev)
/*CPU memory space*/ /*CPU memory space*/
ROM_REGION16_BE(0x2000, CONSOLEROM, 0) ROM_REGION16_BE(0x2000, CONSOLEROM, 0)
@ -1111,11 +1116,11 @@ ROM_START(ti99_4ev)
ROM_LOAD("994agr38.bin", 0x0000, 0x6000, CRC(bdd9f09b) SHA1(9b058a55d2528d2a6a69d7081aa296911ed7c0de)) /* system GROMs */ ROM_LOAD("994agr38.bin", 0x0000, 0x6000, CRC(bdd9f09b) SHA1(9b058a55d2528d2a6a69d7081aa296911ed7c0de)) /* system GROMs */
ROM_END ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1979, ti99_4, 0, 0, ti99_4_60hz, ti99_4, driver_device, 0, "Texas Instruments", "TI-99/4 Home Computer (US)" , 0) COMP( 1979, ti99_4, 0, 0, ti99_4_60hz, ti99_4, driver_device, 0, "Texas Instruments", "TI-99/4 Home Computer (US)", 0)
COMP( 1980, ti99_4e, ti99_4, 0, ti99_4_50hz, ti99_4, driver_device, 0, "Texas Instruments", "TI-99/4 Home Computer (Europe)" , 0) COMP( 1980, ti99_4e, ti99_4, 0, ti99_4_50hz, ti99_4, driver_device, 0, "Texas Instruments", "TI-99/4 Home Computer (Europe)", 0)
COMP( 1981, ti99_4a, 0, 0, ti99_4a_60hz, ti99_4a, driver_device, 0, "Texas Instruments", "TI-99/4A Home Computer (US)" , 0) COMP( 1981, ti99_4a, 0, 0, ti99_4a_60hz, ti99_4a, driver_device, 0, "Texas Instruments", "TI-99/4A Home Computer (US)", 0)
COMP( 1981, ti99_4ae, ti99_4a, 0, ti99_4a_50hz, ti99_4a, driver_device, 0, "Texas Instruments", "TI-99/4A Home Computer (Europe)" , 0) COMP( 1981, ti99_4ae, ti99_4a, 0, ti99_4a_50hz, ti99_4a, driver_device, 0, "Texas Instruments", "TI-99/4A Home Computer (Europe)", 0)
COMP( 1983, ti99_4qe, ti99_4qi, 0, ti99_4qi_50hz, ti99_4a, driver_device, 0, "Texas Instruments", "TI-99/4QI Home Computer (Europe)" , 0) COMP( 1983, ti99_4qe, ti99_4qi, 0, ti99_4qi_50hz, ti99_4a, driver_device, 0, "Texas Instruments", "TI-99/4QI Home Computer (Europe)", 0)
COMP( 1983, ti99_4qi, 0, 0, ti99_4qi_60hz, ti99_4a, driver_device, 0, "Texas Instruments", "TI-99/4QI Home Computer" , 0) COMP( 1983, ti99_4qi, 0, 0, ti99_4qi_60hz, ti99_4a, driver_device, 0, "Texas Instruments", "TI-99/4QI Home Computer (US)", 0)
COMP( 1994, ti99_4ev, ti99_4a, 0, ti99_4ev_60hz,ti99_4a, driver_device, 0, "Texas Instruments", "TI-99/4A Home Computer with EVPC" , 0) COMP( 1994, ti99_4ev, ti99_4a, 0, ti99_4ev_60hz, ti99_4a, driver_device, 0, "Texas Instruments", "TI-99/4A Home Computer with EVPC", 0)