mirror of
https://github.com/holub/mame
synced 2025-05-23 14:19:01 +03:00
Added TMS5220C variant to tms5220.c [Credit: Lord Nightmare]
- implemented reset for TMS5220C if /RS and /WS are pulled down together - Inserted LNs email and corrections as comment into source - Created a TODO section.
This commit is contained in:
parent
d93f2fec5c
commit
6a0043bf8a
@ -38,10 +38,104 @@
|
|||||||
Note the standard naming for d* data bits with 7 as MSB and 0 as LSB is in lowercase.
|
Note the standard naming for d* data bits with 7 as MSB and 0 as LSB is in lowercase.
|
||||||
TI's naming has D7 as LSB and D0 as MSB and is in uppercase
|
TI's naming has D7 as LSB and D0 as MSB and is in uppercase
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
Implement a ready callback for pc interfaces
|
||||||
|
- this will be quite a challenge since for it to be really accurate
|
||||||
|
the whole emulation has to run in sync (lots of timers) with the
|
||||||
|
cpu cores.
|
||||||
|
If a command is still executing, /READY will be kept high until the command has
|
||||||
|
finished if the next command is written.
|
||||||
|
TMS5220C: see below.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
Looping has the tms5220 hookep up directly to the cpu. However currently the
|
Looping has the tms5220 hookep up directly to the cpu. However currently the
|
||||||
tms9900 cpu core does not support a ready line.
|
tms9900 cpu core does not support a ready line.
|
||||||
|
|
||||||
|
Email from Lord Nightmare having a lot more detail follows:
|
||||||
|
|
||||||
|
Yes, there is at least two more differences:
|
||||||
|
The 5220 is 'noisier' when playing unvoiced frames than the 5220C is; I
|
||||||
|
think the 5220C may use a different energy table (or use one value lower
|
||||||
|
in the normal energy table) than the 5220 does, possibly only when
|
||||||
|
playing unvoiced frames, but I can't prove this without a decap; the
|
||||||
|
5220C's PROMOUT pin (for dumping the lpc tables as played) is
|
||||||
|
nonfunctional due to changed design or a die bug.
|
||||||
|
In addition, the NOP commands on the FIFO interface have been changed
|
||||||
|
and data passed in the low bits has a meaning regarding frame length:
|
||||||
|
commands :
|
||||||
|
(lsb is right, msb is left; x means don't care)
|
||||||
|
x0x0xbcc : (5220: NOP) (5220C: select frame length by cc, and b selects
|
||||||
|
whether every frame is preceeded by 2 bits to select the frame length
|
||||||
|
(instead of using the value set by cc)) (default is 00 for frame length
|
||||||
|
(200 samples) and 0 for whether the preceeding 2 bits are enabled (off))
|
||||||
|
x001xxxx: sends eight read bit commands (M0 high M1 low) to VSM and
|
||||||
|
reads the resulting bits serially into a temporary register, which
|
||||||
|
becomes readable as the next byte read from the tms52xx once ready goes
|
||||||
|
active.
|
||||||
|
|
||||||
|
Note the bit order of the byte read from the TMS52xx is BACKWARDS as
|
||||||
|
compared to the actual data order as in the rom on the VSM chips! This
|
||||||
|
was IMHO a rather silly design decision of TI. (I asked Larry
|
||||||
|
Brantingham about this but he wasn't involved with the TMS52xx chips,
|
||||||
|
just the 5100)
|
||||||
|
There's ASCII data in the TI 99/4 speech module VSMs which has the bit
|
||||||
|
order reversed on purpose because of this!
|
||||||
|
|
||||||
|
x011xxxx: sends a read and branch command (M0 high, M1 high) to force
|
||||||
|
VSM to set its data pointer to whatever the data is at its current
|
||||||
|
pointer location is)
|
||||||
|
x100aaaa: send a load address command (M0 low M1 high) to vsm with the 4
|
||||||
|
'a' bits
|
||||||
|
x101xxxx: 'speak' begins speaking from current address in the data
|
||||||
|
pointer of the vsms
|
||||||
|
x110xxxx: 'speak external' begins speaking from the 16 byte fifo
|
||||||
|
x111xxxx: resets the speech synthesis core immediately; clears the bit
|
||||||
|
offset counter in the fifo to the nearest byte 'forward ', but does NOT
|
||||||
|
clear the fifo, annoyingly!
|
||||||
|
|
||||||
|
Its also possible but inconclusive that the chirp table was changed.
|
||||||
|
The LPC tables between the 5220 and 5220C are MOSTLY the same of not
|
||||||
|
completely so, but as mentioned above the energy table has some sort of
|
||||||
|
difference.
|
||||||
|
|
||||||
|
|
||||||
|
As for which games used which chips, from the TMS5220 wikipedia page:
|
||||||
|
|
||||||
|
TMS5200 AKA TMC0285: (1981 to 1983ish when supplies ran low)
|
||||||
|
Arcade: Zaccaria's 'money money' and 'jack rabbit'; Bally/Midway's
|
||||||
|
'Discs of Tron' (all environmental cabs and a few upright cabs; the code
|
||||||
|
exists on all versions for the speech though, and upright cabs can be
|
||||||
|
upgraded to add it by hacking on a 'Squawk & Talk' pinball speech board
|
||||||
|
(which is also TMS5200 based) with a few modded components)
|
||||||
|
Pinball: All Bally/Midway machines which uses the 'Squawk & Talk' board.
|
||||||
|
Home computer: TI 99/4 PHP1500 Speech module (along with two VSM
|
||||||
|
serial chips); Street Electronics Corp.'s Apple II 'Echo 2' Speech
|
||||||
|
synthesizer (early cards only)
|
||||||
|
|
||||||
|
TMS5220: (mostly on things made between 1982 and 1984-1985 when supplies
|
||||||
|
ran low)
|
||||||
|
Arcade: Bally/Midway's 'NFL Football'; Atari's 'Star Wars',
|
||||||
|
'Firefox', 'Return of the Jedi', 'Road Runner', 'The Empire Strikes
|
||||||
|
Back' (all verified with schematics); Venture Line's 'Looping' and 'Sky
|
||||||
|
Bumper' (need verify for both); Olympia's 'Portraits' (need verify);
|
||||||
|
Exidy's 'Victory' and 'Victor Banana' (need verify for both)
|
||||||
|
Pinball: Several (don't know names offhand, have not checked schematics)
|
||||||
|
Home computer: Street Electronics Corp.'s Apple II 'Echo 2' Speech
|
||||||
|
synthesizer (later cards only); Texas Instruments' 'Speak and Learn'
|
||||||
|
scanner wand unit.
|
||||||
|
|
||||||
|
TMS5220C AKA TSP5220C: (on stuff made from 1984 to 1992 or so)
|
||||||
|
Arcade: Atari's 'Indiana Jones and the Temple of Doom', '720',
|
||||||
|
'Gauntlet', 'Gauntlet II', 'A.P.B.', 'Paperboy', 'RoadBlasters',
|
||||||
|
'Vindicators Pt II'(verify?), and 'Escape from the Planet of the Robot
|
||||||
|
Monsters' (all verified except for vindicators pt 2)
|
||||||
|
Pinball: Several (less common than the tms5220? (not sure about
|
||||||
|
this), mostly on later pinballs with LPC speech)
|
||||||
|
Home computer: Street Electronics Corp.'s 'ECHO' parallel/hobbyist
|
||||||
|
module (6511 based), IBM PS/2 Speech adapter (parallel port connection
|
||||||
|
device), PES Speech adapter (serial port connection)
|
||||||
|
|
||||||
|
|
||||||
***********************************************************************************************/
|
***********************************************************************************************/
|
||||||
|
|
||||||
#include "sndintrf.h"
|
#include "sndintrf.h"
|
||||||
@ -58,7 +152,8 @@ Notes:
|
|||||||
|
|
||||||
enum _tms5220_variant
|
enum _tms5220_variant
|
||||||
{
|
{
|
||||||
variant_tms5220, /* TMS5220_IS_TMS5220, TMS5220_IS_TMS5220C, TMS5220_IS_TSP5220C */
|
variant_tms5220c, /* TMS5220_IS_TMS5220C TMS5220_IS_TSP5220C */
|
||||||
|
variant_tms5220, /* TMS5220_IS_TMS5220 */
|
||||||
variant_tmc0285 /* TMS5220_IS_TMS5200, TMS5220_IS_CD2501 */
|
variant_tmc0285 /* TMS5220_IS_TMS5200, TMS5220_IS_CD2501 */
|
||||||
};
|
};
|
||||||
typedef enum _tms5220_variant tms5220_variant;
|
typedef enum _tms5220_variant tms5220_variant;
|
||||||
@ -1138,6 +1233,12 @@ static DEVICE_START( tms5220 )
|
|||||||
register_for_save_states(tms);
|
register_for_save_states(tms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DEVICE_START( tms5220c )
|
||||||
|
{
|
||||||
|
tms5220_state *tms = get_safe_token(device);
|
||||||
|
DEVICE_START_CALL( tms5220 );
|
||||||
|
tms->variant = variant_tms5220c;
|
||||||
|
}
|
||||||
|
|
||||||
static DEVICE_START( tmc0285 )
|
static DEVICE_START( tmc0285 )
|
||||||
{
|
{
|
||||||
@ -1239,9 +1340,19 @@ WRITE_LINE_DEVICE_HANDLER( tms5220_rsq_w )
|
|||||||
if (new != tms->rs_ws)
|
if (new != tms->rs_ws)
|
||||||
{
|
{
|
||||||
tms->rs_ws = new;
|
tms->rs_ws = new;
|
||||||
if (new == 0 || new ==3)
|
if (new == 0)
|
||||||
{
|
{
|
||||||
|
if (tms->variant == variant_tms5220c)
|
||||||
|
device_reset(device);
|
||||||
|
else
|
||||||
/* illegal */
|
/* illegal */
|
||||||
|
LOG(("tms5220_rs_w: illegal\n"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if ( new == 3)
|
||||||
|
{
|
||||||
|
/* high impedance */
|
||||||
|
tms->read_latch = 0xff;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (state)
|
if (state)
|
||||||
@ -1272,10 +1383,19 @@ WRITE_LINE_DEVICE_HANDLER( tms5220_wsq_w )
|
|||||||
if (new != tms->rs_ws)
|
if (new != tms->rs_ws)
|
||||||
{
|
{
|
||||||
tms->rs_ws = new;
|
tms->rs_ws = new;
|
||||||
if (new == 0 || new ==3)
|
if (new == 0)
|
||||||
{
|
{
|
||||||
|
if (tms->variant == variant_tms5220c)
|
||||||
|
device_reset(device);
|
||||||
|
else
|
||||||
/* illegal */
|
/* illegal */
|
||||||
if (new == 0) LOG(("tms5220_ws_w: illegal\n"));
|
LOG(("tms5220_ws_w: illegal\n"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if ( new == 3)
|
||||||
|
{
|
||||||
|
/* high impedance */
|
||||||
|
tms->read_latch = 0xff;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (state)
|
if (state)
|
||||||
@ -1455,6 +1575,11 @@ static const char DEVTEMPLATE_SOURCE[] = __FILE__;
|
|||||||
#define DEVTEMPLATE_FAMILY "TI Speech"
|
#define DEVTEMPLATE_FAMILY "TI Speech"
|
||||||
#include "devtempl.h"
|
#include "devtempl.h"
|
||||||
|
|
||||||
|
#define DEVTEMPLATE_DERIVED_ID(p,s) p##tms5220c##s
|
||||||
|
#define DEVTEMPLATE_DERIVED_FEATURES DT_HAS_START
|
||||||
|
#define DEVTEMPLATE_DERIVED_NAME "TMS5220C"
|
||||||
|
#include "devtempl.h"
|
||||||
|
|
||||||
#define DEVTEMPLATE_DERIVED_ID(p,s) p##tmc0285##s
|
#define DEVTEMPLATE_DERIVED_ID(p,s) p##tmc0285##s
|
||||||
#define DEVTEMPLATE_DERIVED_FEATURES DT_HAS_START
|
#define DEVTEMPLATE_DERIVED_FEATURES DT_HAS_START
|
||||||
#define DEVTEMPLATE_DERIVED_NAME "TMC0285"
|
#define DEVTEMPLATE_DERIVED_NAME "TMC0285"
|
||||||
|
@ -39,10 +39,12 @@ double tms5220_time_to_ready(const device_config *device);
|
|||||||
|
|
||||||
void tms5220_set_frequency(const device_config *device, int frequency);
|
void tms5220_set_frequency(const device_config *device, int frequency);
|
||||||
|
|
||||||
|
DEVICE_GET_INFO( tms5220c );
|
||||||
DEVICE_GET_INFO( tms5220 );
|
DEVICE_GET_INFO( tms5220 );
|
||||||
DEVICE_GET_INFO( tmc0285 );
|
DEVICE_GET_INFO( tmc0285 );
|
||||||
DEVICE_GET_INFO( tms5200 );
|
DEVICE_GET_INFO( tms5200 );
|
||||||
|
|
||||||
|
#define SOUND_TMS5220C DEVICE_GET_INFO_NAME( tms5220c )
|
||||||
#define SOUND_TMS5220 DEVICE_GET_INFO_NAME( tms5220 )
|
#define SOUND_TMS5220 DEVICE_GET_INFO_NAME( tms5220 )
|
||||||
#define SOUND_TMC0285 DEVICE_GET_INFO_NAME( tmc0285 )
|
#define SOUND_TMC0285 DEVICE_GET_INFO_NAME( tmc0285 )
|
||||||
#define SOUND_TMS5200 DEVICE_GET_INFO_NAME( tms5200 )
|
#define SOUND_TMS5200 DEVICE_GET_INFO_NAME( tms5200 )
|
||||||
|
Loading…
Reference in New Issue
Block a user