summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/ti99_8.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/ti99_8.cpp')
-rw-r--r--src/mame/drivers/ti99_8.cpp890
1 files changed, 0 insertions, 890 deletions
diff --git a/src/mame/drivers/ti99_8.cpp b/src/mame/drivers/ti99_8.cpp
deleted file mode 100644
index 99aa0804886..00000000000
--- a/src/mame/drivers/ti99_8.cpp
+++ /dev/null
@@ -1,890 +0,0 @@
-// license:LGPL-2.1+
-// copyright-holders:Michael Zapf
-/****************************************************************************
-
- The MESS TI-99/8 emulation driver
-
- The TI-99/8 was the envisaged successor to the TI-99/4A but never passed
- its prototype state. Only a few dozens of consoles were built. The ROMs
- were not even finalized, so the few available consoles have different
- operating system versions and capabilities.
-
-
- Characteristics
- ---------------
-
- Name: "Texas Instruments Computer TI-99/8" (no "Home")
-
- Inofficial nickname: "Armadillo"
-
- CPU: Single-CPU system using a TMS9995, but as a variant named MP9537. This
- variant does not offer on-chip RAM or decrementer.
-
- Video: TMS9118 Video Display Processor with 16 KiB RAM. The 9118 has the
- same capabilities as the 9918/28 in the TI-99/4A, except for the
- missing GROM clock (which must be provided separately) and the
- different DRAM type (2 chips TMS 4416 16K*4). Delivers a 60 Hz
- interrupt to the CPU via the PSI.
-
- Keyboard: 50-key keyboard, slightly different to the TI-99/4A, but also with
- modifiers Control, Function, Shift, Caps Lock. Connects to the TMS 9901
- PSI like in the TI-99/4A, but the pin assignment and key matrix
- are different:
- - P0-P3: column select
- - INT6*-INT11*: row inputs (INT6* is only used for joystick fire)
-
- Cassette: Identical to TI-99/4A, except that the CS2 unit is not implemented
-
- Sound: SN94624 as used in the TI-99/4A
-
- Speech: TMS5200C, a rare variant of the TMS52xx family. Compatible to the
- speech data for the separate speech synthesizer for the TI-99/4A.
- Speech ROMs CD2325A, CD2326A (total 128K*1)
-
- ROM: TMS4764 (8K*8), called "ROM0" in the specifications [1]
- TMS47256 (32K*8), called "ROM1" [1]
- TMS47128 (16K*8), "P-Code ROM" (only available in late prototypes)
- See below for contents
-
- GROMs: TI-specific ROM circuits with internal address counter and 6 KiB
- capacity (see grom.c)
- 3 GROMs (system GROMs, access via port at logical address F830)
- 8 GROMs (Pascal / Text-to-speech GROMs, port at logical address F840)
- 8 GROMs (Pascal GROMs, port at logical address F850)
- 3 GROMs (Pascal GROMs, access via port at logical address F860)
- (total of 132 KiB GROM)
-
- RAM: 1 TMS4016 (SRAM 2K*8)
- 8 TMS4164 (DRAM 64K*1)
-
- PSI: (programmable system interface) TMS9901 with connections to
- keyboard, joystick port, cassette port, and external interrupt lines
- (video, peripheral devices)
-
- External connectors:
- - Joystick port (compatible to TI-99/4A joystick slot)
- - Cassette port
- - Cartridge port (compatible to TI-99/4A cartridge slot, but vertically
- orientated, so cartridges are plugged in from the top)
- - I/O port (not compatible to TI-99/4A I/O port, needs a special P-Box
- card called "Armadillo interface")
- - Hexbus port (new peripheral system, also seen with later TI designs)
- - Video port (composite)
-
- Custom chips: Five custom chips contain mapping and selection logic
- - "Vaquerro": Logical address space decoder
- - "Mofetta" : Physical address space decoder
- - "Amigo" : Mapper
- - "Pollo" : DRAM controller
- - "Oso" : Hexbus interface
-
- Modes:
- - Compatibility mode (TI-99/4A mode): Memory-mapped devices are
- placed at the same location as found in the TI-99/4A, thereby
- providing a good downward compatibility.
- The console starts up in compatibility mode.
- - Native mode (Armadillo mode): Devices are located at positions above
- 0xF000 that allow for a contiguous usage of memory.
-
- Mapper
- ------
- The mapper uses 4K pages (unlike the Geneve mapper with 8K pages) which
- are defined by a 32 bit word. The address bits A0-A3 serve as the page
- index, whereas bits A4-A15 are the offset in the page.
- From the 32 bits, 24 bits define the physical address, so this allows for
- a maximum of 16 MiB of mapped-addressable memory.
-
- See more about the mapper in the file mapper8.c.
-
-
- Availability of ROMs and documentation
- --------------------------------------
- By written consent, TI granted free use of all software and documentation
- concerning the TI-99/8, including all specifications, ROMs, and source code
- of ROMs.
-
-
- Acknowledgements
- ----------------
- Special thanks go to Ciro Barile of the TI99 Italian User Club
- (www.ti99iuc.it): By his courtesy we have a consistent dump of ROMs for
- one of the most evolved versions of the TI-99/8 with
-
- - complete GROM set (with Pascal)
- - complete ROM set (with Hexbus DSR and TTS)
- - complete speech ROM set
-
- Also, by applying test programs on his real console, many unclear
- specifications were resolved.
-
-
- References
- ----------
- [1] Texas Instruments: Armadillo Product Specifications, July 1983
- [2] Source code (Assembler and GPL) of the TI-99/8 ROMs and GROMs
- [3] Schematics of the TI-99/8
-
-
- Implementation
- --------------
- Initial version by Raphael Nabet, 2003.
-
- February 2012: Rewritten as class [Michael Zapf]
- November 2013: Included new dumps [Michael Zapf]
-
-===========================================================================
-Known Issues (MZ, 2019-05-10)
-
- KEEP IN MIND THAT TEXAS INSTRUMENTS NEVER RELEASED THE TI-99/8 AND THAT
- THERE ARE ONLY A FEW PROTOTYPES OF THE TI-99/8 AVAILABLE. ALL SOFTWARE
- MUST BE ASSUMED TO HAVE REMAINED IN A PRELIMINARY STATE.
-
-- TI-99/4A disk controllers cannot be used with the TI-99/8 in Extended Basic II.
- In the 99/8, the peripheral access block (PAB, set of data defining the
- access to the device, like floppy) may be located in CPU RAM, while the
- controllers of the 99/4A expect the PAB to be in video RAM only. Exbasic II
- sets up the PAB in CPU RAM, which leads to a crash. Other cartridges from
- the 99/4A certainly use video RAM, and so the disk controller works.
- Therefore, the Hexbus floppy drive HX5102 is recommended for use with the
- TI-99/8. You do not even need to attach the Peripheral Box.
-
- mame ti99_8 -hexbus hx5102 -flop1 somedisk.dsk
-
-- Multiple cartridges are not shown in the startup screen; only one
- cartridge is presented. You have to manually select the cartridges with the
- dip switch.
-
-- SAVE and OLD MINIMEM do not work properly in XB II. It seems as if the
- mapper shadows the NVRAM of the cartridge. You will lose the contents when
- you turn off the machine.
-
-*****************************************************************************/
-
-
-#include "emu.h"
-#include "cpu/tms9900/tms9995.h"
-
-#include "bus/ti99/ti99defs.h"
-
-#include "sound/sn76496.h"
-#include "machine/tms9901.h"
-#include "machine/tmc0430.h"
-#include "imagedev/cassette.h"
-
-#include "bus/ti99/internal/998board.h"
-#include "bus/ti99/gromport/gromport.h"
-#include "bus/hexbus/hexbus.h"
-
-#include "bus/ti99/joyport/joyport.h"
-#include "bus/ti99/internal/ioport.h"
-
-#include "softlist.h"
-#include "speaker.h"
-
-// Debugging
-#define LOG_WARN (1U<<1) // Warnings
-#define LOG_CONFIG (1U<<2) // Configuration
-#define LOG_READY (1U<<3)
-#define LOG_INTERRUPTS (1U<<4)
-#define LOG_CRU (1U<<5)
-#define LOG_CRUREAD (1U<<6)
-#define LOG_RESETLOAD (1U<<7)
-
-#define VERBOSE ( LOG_CONFIG | LOG_WARN | LOG_RESETLOAD )
-
-#include "logmacro.h"
-
-/*
- READY bits.
-*/
-enum
-{
- READY_GROM = 1,
- READY_MAPPER = 2,
- READY_PBOX = 4,
- READY_SOUND = 8,
- READY_CART = 16,
- READY_SPEECH = 32,
- READY_MAINBOARD = 64
-};
-
-class ti99_8_state : public driver_device
-{
-public:
- ti99_8_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_cpu(*this, "maincpu"),
- m_tms9901(*this, TI_TMS9901_TAG),
- m_gromport(*this, TI99_GROMPORT_TAG),
- m_ioport(*this, TI99_IOPORT_TAG),
- m_mainboard(*this, TI998_MAINBOARD_TAG),
- m_joyport(*this, TI_JOYPORT_TAG),
- m_cassette(*this, "cassette"),
- m_keyboard(*this, "COL%u", 0U)
- {
- }
-
- void ti99_8(machine_config &config);
- void ti99_8_60hz(machine_config &config);
- void ti99_8_50hz(machine_config &config);
-
- // Lifecycle
- void driver_start() override;
- void driver_reset() override;
-
-private:
- // Machine management
- DECLARE_MACHINE_START(ti99_8);
- DECLARE_MACHINE_RESET(ti99_8);
-
- // Processor connections with the main board
- uint8_t cruread(offs_t offset);
- void cruwrite(offs_t offset, uint8_t data);
- void external_operation(offs_t offset, uint8_t data);
- DECLARE_WRITE_LINE_MEMBER( clock_out );
-
- // Connections from outside towards the CPU (callbacks)
- DECLARE_WRITE_LINE_MEMBER( console_ready );
- DECLARE_WRITE_LINE_MEMBER( console_reset );
- DECLARE_WRITE_LINE_MEMBER( cpu_hold );
- DECLARE_WRITE_LINE_MEMBER( notconnected );
-
- // GROM clock (coming from Vaquerro)
- DECLARE_WRITE_LINE_MEMBER( gromclk_in );
-
- // Connections with the system interface chip 9901
- DECLARE_WRITE_LINE_MEMBER( extint );
- DECLARE_WRITE_LINE_MEMBER( video_interrupt );
-
- // Connections with the system interface TMS9901
- uint8_t psi_input(offs_t offset);
- DECLARE_WRITE_LINE_MEMBER(keyC0);
- DECLARE_WRITE_LINE_MEMBER(keyC1);
- DECLARE_WRITE_LINE_MEMBER(keyC2);
- DECLARE_WRITE_LINE_MEMBER(keyC3);
- DECLARE_WRITE_LINE_MEMBER(audio_gate);
- DECLARE_WRITE_LINE_MEMBER(cassette_output);
- DECLARE_WRITE_LINE_MEMBER(cassette_motor);
- void tms9901_interrupt(offs_t offset, uint8_t data);
-
- void crumap(address_map &map);
- void memmap(address_map &map);
- void memmap_setaddress(address_map &map);
-
- // Keyboard support
- void set_keyboard_column(int number, int data);
- int m_keyboard_column;
-
- // READY handling
- int m_ready_old;
-
- // Latch for 9901 INT2, INT1 lines
- int m_int1;
- int m_int2;
-
- // Connected devices
- required_device<tms9995_device> m_cpu;
- required_device<tms9901_device> m_tms9901;
- required_device<bus::ti99::gromport::gromport_device> m_gromport;
- required_device<bus::ti99::internal::ioport_device> m_ioport;
- required_device<bus::ti99::internal::mainboard8_device> m_mainboard;
- required_device<bus::ti99::joyport::joyport_device> m_joyport;
- required_device<cassette_image_device> m_cassette;
-
- required_ioport_array<14> m_keyboard;
-};
-
-/*
- Memory map. We have a configurable mapper, so we need to delegate the
- job to the mapper completely.
-*/
-void ti99_8_state::memmap(address_map &map)
-{
- map(0x0000, 0xffff).rw(TI998_MAINBOARD_TAG, FUNC(bus::ti99::internal::mainboard8_device::read), FUNC(bus::ti99::internal::mainboard8_device::write));
-}
-
-void ti99_8_state::memmap_setaddress(address_map &map)
-{
- map(0x0000, 0xffff).w(TI998_MAINBOARD_TAG, FUNC(bus::ti99::internal::mainboard8_device::setaddress));
-}
-
-/*
- CRU map - see description above
- The TMS9901 is fully decoded according to the specification, so we only
- have 32 bits for it; the rest goes to the CRU bus
- (decoded by the "Vaquerro" chip, signal NNOICS*)
-*/
-
-void ti99_8_state::crumap(address_map &map)
-{
- map(0x0000, 0x2fff).rw(FUNC(ti99_8_state::cruread), FUNC(ti99_8_state::cruwrite));
- map(0x0000, 0x003f).rw(m_tms9901, FUNC(tms9901_device::read), FUNC(tms9901_device::write));
-}
-
-/* ti99/8 : 54-key keyboard */
-static INPUT_PORTS_START(ti99_8)
-
- /* 16 ports for keyboard and joystick */
- PORT_START("COL0") /* col 0 */
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ALPHA LOCK") PORT_CODE(KEYCODE_CAPSLOCK)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("FCTN") PORT_CODE(KEYCODE_LALT) PORT_CODE(KEYCODE_RALT)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LSHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("COL1") /* col 1 */
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1 ! DEL") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("q Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("a A") PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("z Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("COL2") /* col 2 */
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2 @ INS") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("w W") PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("s S (LEFT)") PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("x X (DOWN)") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("COL3") /* col 3 */
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3 #") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("e E (UP)") PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("d D (RIGHT)") PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("c C") PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("COL4") /* col 4 */
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4 $ CLEAR") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("r R") PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("f F") PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("v V") PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("COL5") /* col 5 */
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5 % BEGIN") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("t T") PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("g G") PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("b B") PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("COL6") /* col 6 */
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6 ^ PROC'D") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("COL7") /* col 7 */
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7 & AID") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("COL8") /* col 8 */
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8 * REDO") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("COL9") /* col 9 */
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9 ( BACK") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("COL10") /* col 10 */
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("COL11") /* col 11 */
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("= + QUIT") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RSHIFT") PORT_CODE(KEYCODE_RSHIFT)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("COL12") /* col 12 */
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("(SPACE)") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("COL13") /* col 13 */
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('`') PORT_CHAR('~')
- PORT_BIT(0x07, IP_ACTIVE_LOW, IPT_UNUSED)
-
-INPUT_PORTS_END
-
-
-uint8_t ti99_8_state::cruread(offs_t offset)
-{
- LOGMASKED(LOG_CRUREAD, "read access to CRU address %04x\n", offset);
- uint8_t value = 0;
-
- // Let the mapper, the gromport, and the p-box decide whether they want
- // to change the value at the CRU address
- m_mainboard->crureadz(offset<<1, &value);
- m_gromport->crureadz(offset<<1, &value);
- m_ioport->crureadz(offset<<1, &value);
-
- LOGMASKED(LOG_CRU, "CRU %04x -> %x\n", offset<<1, value);
- return value;
-}
-
-void ti99_8_state::cruwrite(offs_t offset, uint8_t data)
-{
- LOGMASKED(LOG_CRU, "CRU %04x <- %x\n", offset<<1, data);
- m_mainboard->cruwrite(offset<<1, data);
- m_gromport->cruwrite(offset<<1, data);
- m_ioport->cruwrite(offset<<1, data);
-}
-
-/***************************************************************************
- TI99/8-specific tms9901 I/O handlers
- These methods are callbacks from the TMS9901 system interface. That is,
- they deliver the values queried via the TMS9901, and they represent
- console functions which are under control of the TMS9901 (like the
- keyboard column selection.)
-***************************************************************************/
-
-uint8_t ti99_8_state::psi_input(offs_t offset)
-{
- switch (offset)
- {
- case tms9901_device::INT1:
- return (m_int1==CLEAR_LINE)? 1 : 0;
- case tms9901_device::INT2:
- return (m_int2==CLEAR_LINE)? 1 : 0;
-
- case tms9901_device::INT6:
- if (m_keyboard_column >= 14)
- return BIT(m_joyport->read_port(),0);
-
- case tms9901_device::INT7_P15:
- if (m_keyboard_column >= 14)
- return BIT(m_joyport->read_port(),4);
-
- case tms9901_device::INT8_P14:
- if (m_keyboard_column >= 14)
- return BIT(m_joyport->read_port(),1);
-
- case tms9901_device::INT9_P13:
- if (m_keyboard_column >= 14)
- return BIT(m_joyport->read_port(),2);
-
- case tms9901_device::INT10_P12:
- if (m_keyboard_column >= 14)
- return BIT(m_joyport->read_port(),3);
-
- // return for last 5 cases if column<14
- return BIT(m_keyboard[m_keyboard_column]->read(), offset-tms9901_device::INT6);
-
- case tms9901_device::INT11_P11:
- return (m_cassette->input() > 0);
-
- default:
- return 1;
- }
-}
-
-/*
- WRITE key column select (P2-P4), TI-99/8
-*/
-void ti99_8_state::set_keyboard_column(int number, int data)
-{
- if (data != 0)
- m_keyboard_column |= 1 << number;
- else
- m_keyboard_column &= ~(1 << number);
-
- if (m_keyboard_column >= 14)
- {
- m_joyport->write_port(m_keyboard_column - 13);
- }
-}
-
-WRITE_LINE_MEMBER( ti99_8_state::keyC0 )
-{
- set_keyboard_column(0, state);
-}
-
-WRITE_LINE_MEMBER( ti99_8_state::keyC1 )
-{
- set_keyboard_column(1, state);
-}
-
-WRITE_LINE_MEMBER( ti99_8_state::keyC2 )
-{
- set_keyboard_column(2, state);
-}
-
-WRITE_LINE_MEMBER( ti99_8_state::keyC3 )
-{
- set_keyboard_column(3, state);
-}
-
-/*
- Control cassette tape unit motor (P6)
-*/
-WRITE_LINE_MEMBER( ti99_8_state::cassette_motor )
-{
- m_cassette->change_state(state==ASSERT_LINE? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED,CASSETTE_MASK_MOTOR);
-}
-
-/*
- Audio gate (P8)
- Set to 1 before using tape: this enables the mixing of tape input sound
- with computer sound.
- We do not really need to emulate this as the tape recorder generates sound
- on its own.
-*/
-WRITE_LINE_MEMBER( ti99_8_state::audio_gate )
-{
-}
-
-/*
- Tape output (P9)
- I think polarity is correct, but don't take my word for it.
-*/
-WRITE_LINE_MEMBER( ti99_8_state::cassette_output )
-{
- m_cassette->output(state==ASSERT_LINE? +1 : -1);
-}
-
-void ti99_8_state::tms9901_interrupt(offs_t offset, uint8_t data)
-{
- m_cpu->set_input_line(INT_9995_INT1, data);
-}
-
-/*****************************************************************************/
-
-/*
- set the state of TMS9901's INT2 (called by the VDP)
-*/
-WRITE_LINE_MEMBER( ti99_8_state::video_interrupt )
-{
- LOGMASKED(LOG_INTERRUPTS, "VDP int 2 on tms9901, level=%02x\n", state);
- m_int2 = (line_state)state;
- m_tms9901->set_int_line(2, state);
-}
-
-/***********************************************************
- Links to external devices
-***********************************************************/
-
-/*
- Propagate READY signals to the CPU.
-*/
-void ti99_8_state::console_ready(int state)
-{
- if (m_ready_old != state)
- LOGMASKED(LOG_READY, "READY = %d\n", state);
- m_ready_old = (line_state)state;
- m_cpu->ready_line(state);
-}
-
-/*
- Enqueue a RESET signal.
-*/
-WRITE_LINE_MEMBER( ti99_8_state::console_reset )
-{
- LOGMASKED(LOG_RESETLOAD, "Incoming RESET line = %d\n", state);
- if (machine().phase() != machine_phase::INIT)
- {
- // RESET the 9901
- m_tms9901->rst1_line(state);
-
- // Pull up the CRUS and PTGEN lines (9901 outputs have been deactivated, pull-up resistors on the board show effect)
- m_mainboard->crus_in(true); // assert
- m_mainboard->ptgen_in(true); // clear
-
- // Setting ready to false so that automatic wait states are enabled
- m_cpu->ready_line(CLEAR_LINE);
- m_cpu->reset_line(ASSERT_LINE);
- }
-}
-
-/*
- The HOLD line leading to the CPU entering the HOLD state.
-*/
-WRITE_LINE_MEMBER( ti99_8_state::cpu_hold )
-{
- LOGMASKED(LOG_INTERRUPTS, "Incoming HOLD line = %d\n", state);
- m_cpu->hold_line(state);
-}
-
-WRITE_LINE_MEMBER( ti99_8_state::extint )
-{
- LOGMASKED(LOG_INTERRUPTS, "EXTINT level = %02x\n", state);
- m_int1 = (line_state)state;
- m_tms9901->set_int_line(1, state);
-}
-
-WRITE_LINE_MEMBER( ti99_8_state::notconnected )
-{
- LOGMASKED(LOG_INTERRUPTS, "Setting a not connected line ... ignored\n");
-}
-
-void ti99_8_state::external_operation(offs_t offset, uint8_t data)
-{
- static char const *const extop[8] = { "inv1", "inv2", "IDLE", "RSET", "inv3", "CKON", "CKOF", "LREX" };
- if (offset == IDLE_OP) return;
- else
- LOGMASKED(LOG_WARN, "External operation %s not implemented on TI-99/8 board\n", extop[offset]);
-}
-
-/*
- Clock line from the CPU. Used to control wait state generation.
-*/
-WRITE_LINE_MEMBER( ti99_8_state::clock_out )
-{
- m_tms9901->phi_line(state);
- m_mainboard->clock_in(state);
-}
-
-void ti99_8_state::driver_start()
-{
- // Need to configure the speech ROM for inverse bit order
-// speechrom_device* mem = subdevice<speechrom_device>(TI998_SPEECHROM_REG);
-// mem->set_reverse_bit_order(true);
-
- save_item(NAME(m_keyboard_column));
- save_item(NAME(m_ready_old));
- save_item(NAME(m_int1));
- save_item(NAME(m_int2));
-}
-
-void ti99_8_state::driver_reset()
-{
- m_cpu->hold_line(CLEAR_LINE);
-
- // Pulling down the line on RESET configures the CPU to insert one wait
- // state on external memory accesses
- // m_cpu->ready_line(ASSERT_LINE);
-
- // m_gromport->set_grom_base(0x9800, 0xfff1);
-
- // Clear INT1 and INT2 latch
- m_int1 = CLEAR_LINE;
- m_int2 = CLEAR_LINE;
- console_reset(ASSERT_LINE);
- console_reset(CLEAR_LINE);
-}
-
-void ti99_8_state::ti99_8(machine_config& config)
-{
- using namespace bus::ti99::internal;
- // basic machine hardware */
- // TMS9995-MP9537 CPU @ 10.7 MHz
- // MP9537 mask: This variant of the TMS9995 does not contain on-chip RAM
- TMS9995_MP9537(config, m_cpu, XTAL(10'738'635));
- m_cpu->set_addrmap(AS_PROGRAM, &ti99_8_state::memmap);
- m_cpu->set_addrmap(AS_IO, &ti99_8_state::crumap);
- m_cpu->set_addrmap(tms9995_device::AS_SETADDRESS, &ti99_8_state::memmap_setaddress);
- m_cpu->extop_cb().set(FUNC(ti99_8_state::external_operation));
- m_cpu->clkout_cb().set(FUNC(ti99_8_state::clock_out));
- m_cpu->holda_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::holda_line));
-
- // 9901 configuration
- TMS9901(config, m_tms9901, 0);
- m_tms9901->read_cb().set(FUNC(ti99_8_state::psi_input));
- m_tms9901->p_out_cb(0).set(FUNC(ti99_8_state::keyC0));
- m_tms9901->p_out_cb(1).set(FUNC(ti99_8_state::keyC1));
- m_tms9901->p_out_cb(2).set(FUNC(ti99_8_state::keyC2));
- m_tms9901->p_out_cb(3).set(FUNC(ti99_8_state::keyC3));
- m_tms9901->p_out_cb(4).set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::crus_in));
- m_tms9901->p_out_cb(5).set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::ptgen_in));
- m_tms9901->p_out_cb(6).set(FUNC(ti99_8_state::cassette_motor));
- m_tms9901->p_out_cb(8).set(FUNC(ti99_8_state::audio_gate));
- m_tms9901->p_out_cb(9).set(FUNC(ti99_8_state::cassette_output));
- m_tms9901->intreq_cb().set(FUNC(ti99_8_state::tms9901_interrupt));
-
- // Mainboard with custom chips
- TI99_MAINBOARD8(config, m_mainboard, 0);
- m_mainboard->ready_cb().set(FUNC(ti99_8_state::console_ready));
- m_mainboard->reset_cb().set(FUNC(ti99_8_state::console_reset));
- m_mainboard->hold_cb().set(FUNC(ti99_8_state::cpu_hold));
-
- // Cartridge port
- TI99_GROMPORT(config, m_gromport, 0, ti99_gromport_options_998, "single").extend();
- m_gromport->ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::system_grom_ready));
- m_gromport->reset_cb().set(FUNC(ti99_8_state::console_reset));
-
- // RAM
- RAM(config, TI998_SRAM_TAG).set_default_size("2K").set_default_value(0);
- RAM(config, TI998_DRAM_TAG).set_default_size("64K").set_default_value(0);
-
- // Software list
- SOFTWARE_LIST(config, "cart_list_ti99").set_original("ti99_cart");
-
- // I/O port
- TI99_IOPORT(config, m_ioport, 0, ti99_ioport_options_plain, nullptr);
- m_ioport->extint_cb().set(FUNC(ti99_8_state::extint));
- m_ioport->ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::pbox_ready));
-
- // Hexbus
- HEXBUS(config, TI_HEXBUS_TAG, 0, hexbus_options, nullptr);
-
- // Sound hardware
- SPEAKER(config, "sound_out").front_center();
- sn76496_device& soundgen(SN76496(config, TI_SOUNDCHIP_TAG, 3579545));
- soundgen.ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::sound_ready));
- soundgen.add_route(ALL_OUTPUTS, "sound_out", 0.75);
-
- // Speech hardware
- // Note: SPEECHROM uses its tag for referencing the region
- SPEECHROM(config, TI998_SPEECHROM_REG, 0).set_reverse_bit_order(true);
- SPEAKER(config, "speech_out").front_center();
-
- cd2501ecd_device& vsp(CD2501ECD(config, TI998_SPEECHSYN_TAG, 640000L));
- vsp.ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::speech_ready));
- vsp.set_speechrom_tag(TI998_SPEECHROM_REG);
- vsp.add_route(ALL_OUTPUTS, "speech_out", 0.50);
-
- // Cassette drive
- SPEAKER(config, "cass_out").front_center();
- CASSETTE(config, "cassette", 0).add_route(ALL_OUTPUTS, "cass_out", 0.25);;
-
- // GROM library
- using namespace bus::ti99::internal;
- TMC0430(config, TI998_SYSGROM0_TAG, TI998_SYSGROM_REG, 0x0000, 0).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::system_grom_ready));
- TMC0430(config, TI998_SYSGROM1_TAG, TI998_SYSGROM_REG, 0x2000, 1).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::system_grom_ready));
- TMC0430(config, TI998_SYSGROM2_TAG, TI998_SYSGROM_REG, 0x4000, 2).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::system_grom_ready));
-
- TMC0430(config, TI998_GLIB10_TAG, TI998_GROMLIB1_REG, 0x0000, 0).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::ptts_grom_ready));
- TMC0430(config, TI998_GLIB11_TAG, TI998_GROMLIB1_REG, 0x2000, 1).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::ptts_grom_ready));
- TMC0430(config, TI998_GLIB12_TAG, TI998_GROMLIB1_REG, 0x4000, 2).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::ptts_grom_ready));
- TMC0430(config, TI998_GLIB13_TAG, TI998_GROMLIB1_REG, 0x6000, 3).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::ptts_grom_ready));
- TMC0430(config, TI998_GLIB14_TAG, TI998_GROMLIB1_REG, 0x8000, 4).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::ptts_grom_ready));
- TMC0430(config, TI998_GLIB15_TAG, TI998_GROMLIB1_REG, 0xa000, 5).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::ptts_grom_ready));
- TMC0430(config, TI998_GLIB16_TAG, TI998_GROMLIB1_REG, 0xc000, 6).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::ptts_grom_ready));
- TMC0430(config, TI998_GLIB17_TAG, TI998_GROMLIB1_REG, 0xe000, 7).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::ptts_grom_ready));
-
- TMC0430(config, TI998_GLIB20_TAG, TI998_GROMLIB2_REG, 0x0000, 0).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::p8_grom_ready));
- TMC0430(config, TI998_GLIB21_TAG, TI998_GROMLIB2_REG, 0x2000, 1).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::p8_grom_ready));
- TMC0430(config, TI998_GLIB22_TAG, TI998_GROMLIB2_REG, 0x4000, 2).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::p8_grom_ready));
- TMC0430(config, TI998_GLIB23_TAG, TI998_GROMLIB2_REG, 0x6000, 3).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::p8_grom_ready));
- TMC0430(config, TI998_GLIB24_TAG, TI998_GROMLIB2_REG, 0x8000, 4).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::p8_grom_ready));
- TMC0430(config, TI998_GLIB25_TAG, TI998_GROMLIB2_REG, 0xa000, 5).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::p8_grom_ready));
- TMC0430(config, TI998_GLIB26_TAG, TI998_GROMLIB2_REG, 0xc000, 6).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::p8_grom_ready));
- TMC0430(config, TI998_GLIB27_TAG, TI998_GROMLIB2_REG, 0xe000, 7).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::p8_grom_ready));
-
- TMC0430(config, TI998_GLIB30_TAG, TI998_GROMLIB3_REG, 0x0000, 0).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::p3_grom_ready));
- TMC0430(config, TI998_GLIB31_TAG, TI998_GROMLIB3_REG, 0x2000, 1).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::p3_grom_ready));
- TMC0430(config, TI998_GLIB32_TAG, TI998_GROMLIB3_REG, 0x4000, 2).ready_cb().set(TI998_MAINBOARD_TAG, FUNC(mainboard8_device::p3_grom_ready));
-
- // Joystick port
- TI99_JOYPORT(config, m_joyport, 0, ti99_joyport_options_mouse, "twinjoy");
-}
-
-/*
- TI-99/8 US version (NTSC, 60 Hz)
-*/
-void ti99_8_state::ti99_8_60hz(machine_config &config)
-{
- ti99_8(config);
- // Video hardware
- tms9118_device &video(TMS9118(config, TI_VDP_TAG, XTAL(10'738'635)));
- video.set_vram_size(0x4000);
- video.int_callback().set(FUNC(ti99_8_state::video_interrupt));
- video.set_screen("screen");
-
- SCREEN(config, "screen", SCREEN_TYPE_RASTER);
-}
-
-/*
- TI-99/8 European version (PAL, 50 Hz)
-*/
-void ti99_8_state::ti99_8_50hz(machine_config &config)
-{
- ti99_8(config);
- // Video hardware
- tms9129_device &video(TMS9129(config, TI_VDP_TAG, XTAL(10'738'635)));
- video.set_vram_size(0x4000);
- video.int_callback().set(FUNC(ti99_8_state::video_interrupt));
- video.set_screen("screen");
-
- SCREEN(config, "screen", SCREEN_TYPE_RASTER);
-}
-
-/*
- All ROM dumps except the speech ROM have a CRC16 checksum as the final two
- bytes. ROM1 contains four 8K chunks of ROM contents with an own CRC at their
- ends. All GROMs, ROM0, and the four ROM1 parts were successfully
- validated.
-*/
-ROM_START(ti99_8)
- // Logical (CPU) memory space: ROM0
- ROM_REGION(0x2000, TI998_ROM0_REG, 0)
- ROM_LOAD("rom0.u4", 0x0000, 0x2000, CRC(901eb8d6) SHA1(13190c5e834baa9c0a70066b566cfcef438ed88a))
-
- // Physical memory space (mapped): ROM1
- ROM_REGION(0x8000, TI998_ROM1_REG, 0)
- ROM_LOAD("rom1.u25", 0x0000, 0x8000, CRC(b574461a) SHA1(42c6aed44802cfabdd26b565d6e5ddfcd689f11e))
-
- // Physical memory space (mapped): P-Code ROM
- // This circuit is only available in later versions of the console and seems
- // to be piggy-backed on ROM1.
- // To make things worse, the decoding logic of the custom chips do not show
- // the required select line for this ROM on the available schematics, so
- // they seem to be from the earlier version. The location in the address
- // space was determined by ROM disassembly.
- ROM_REGION(0x8000, TI998_PASCAL_REG, 0)
- ROM_LOAD("pascal.u25a", 0x0000, 0x4000, CRC(d7ed6dd6) SHA1(32212ce6426ceccbff73d342d4a3ef699c0ae1e4))
-
- // System GROMs. 3 chips @ f830
- // The schematics do not enumerate the circuits but only say
- // "circuits on board" (COB) so we name the GROMs as gM_N.bin where M is the
- // ID (0-7) and N is the access port in the logical address space.
- ROM_REGION(0x6000, TI998_SYSGROM_REG, 0)
- ROM_LOAD("g0_f830.bin", 0x0000, 0x1800, CRC(1026db60) SHA1(7327095bf4f390476e69d9fd8424e98ea1f2325a))
- ROM_LOAD("g1_f830.bin", 0x2000, 0x1800, CRC(93a43d65) SHA1(19be8a07d674bc7554c2bc9c7a5725d81e888e6e))
- ROM_LOAD("g2_f830.bin", 0x4000, 0x1800, CRC(06f2b901) SHA1(f65e0fcb2c63e230b4a9563c72f91259b94ce955))
-
- // TTS & Pascal library. 8 chips @ f840
- ROM_REGION(0x10000, TI998_GROMLIB1_REG, 0)
- ROM_LOAD("g0_f840.bin", 0x0000, 0x1800, CRC(44501071) SHA1(4b5ef7f1aa43a87e7ae4f02090944be5c39b1f26))
- ROM_LOAD("g1_f840.bin", 0x2000, 0x1800, CRC(5a271d9e) SHA1(bb95befa2ffba2cc17ac437386e069e8ff621248))
- ROM_LOAD("g2_f840.bin", 0x4000, 0x1800, CRC(d52502df) SHA1(17063e33ee8709d0df8030f38bb92c4322d55e1e))
- ROM_LOAD("g3_f840.bin", 0x6000, 0x1800, CRC(86c12396) SHA1(119b6df9211b5399245e017721fc51b88b60879f))
- ROM_LOAD("g4_f840.bin", 0x8000, 0x1800, CRC(f17a2ef8) SHA1(dcb044f71d7f8a165b41f39e35a368d8f2d63b67))
- ROM_LOAD("g5_f840.bin", 0xA000, 0x1800, CRC(7dc41301) SHA1(dff714da68de352db93fba309db8e5a8ae7cab1a))
- ROM_LOAD("g6_f840.bin", 0xC000, 0x1800, CRC(7e310a90) SHA1(e927d8b3f8b32aa4fb9f7d080d5262c566a77fc7))
- ROM_LOAD("g7_f840.bin", 0xE000, 0x1800, CRC(3a9d20df) SHA1(1e6f9f8ec7df4b997a7579be742d0a7d54bc8763))
-
- // Pascal library. 8 chips @ f850
- ROM_REGION(0x10000, TI998_GROMLIB2_REG, 0)
- ROM_LOAD("g0_f850.bin", 0x0000, 0x1800, CRC(2d948672) SHA1(cf15912d6dae5a450e0cfd796aa36ea5e521dc56))
- ROM_LOAD("g1_f850.bin", 0x2000, 0x1800, CRC(7d64a842) SHA1(d5884bb2af21c8027311478ee506beac6f46203d))
- ROM_LOAD("g2_f850.bin", 0x4000, 0x1800, CRC(e5ed8900) SHA1(03826882ce10fb5a6b3a9ccc85d3d1fe51979d0b))
- ROM_LOAD("g3_f850.bin", 0x6000, 0x1800, CRC(87aaf19e) SHA1(fdbe163773b8a30fa6b9508e679be6fa4f99bf7a))
- ROM_LOAD("g4_f850.bin", 0x8000, 0x1800, CRC(d3e789a5) SHA1(5ab06aa75ca694b1035ce5ac0bebacc928721388))
- ROM_LOAD("g5_f850.bin", 0xA000, 0x1800, CRC(49fd90bd) SHA1(44b2cef29c2d5304a0dcfedbdcdf9f21f2201bf9))
- ROM_LOAD("g6_f850.bin", 0xC000, 0x1800, CRC(31bac4ab) SHA1(e29049f0597d5de0bfd5c9c7bfea902abe858010))
- ROM_LOAD("g7_f850.bin", 0xE000, 0x1800, CRC(71534098) SHA1(75e87123efde885e27dd749e07cb189eb2cc45a8))
-
- // Pascal library. 3 chips @ f860
- ROM_REGION(0x6000, TI998_GROMLIB3_REG, 0)
- ROM_LOAD("g0_f860.bin", 0x0000, 0x1800, CRC(0ceef210) SHA1(b89957fbff094b758746391a69dea6907c66b950))
- ROM_LOAD("g1_f860.bin", 0x2000, 0x1800, CRC(fc87de25) SHA1(4695b7f979f59a01ec16c55e4587c3379482b658))
- ROM_LOAD("g2_f860.bin", 0x4000, 0x1800, CRC(e833e350) SHA1(6ffe501981a1112be1af596a489d96e287fc6be5))
-
- // Speech ROM
- ROM_REGION(0x8000, TI998_SPEECHROM_REG, 0)
- ROM_LOAD("cd2325a.vsm", 0x0000, 0x4000, CRC(1f58b571) SHA1(0ef4f178716b575a1c0c970c56af8a8d97561ffe))
- ROM_LOAD("cd2326a.vsm", 0x4000, 0x4000, CRC(65d00401) SHA1(a367242c2c96cebf0e2bf21862f3f6734b2b3020))
-ROM_END
-
-#define rom_ti99_8e rom_ti99_8
-
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1983, ti99_8, 0, 0, ti99_8_60hz, ti99_8, ti99_8_state, empty_init, "Texas Instruments", "TI-99/8 Computer (US)", MACHINE_SUPPORTS_SAVE )
-COMP( 1983, ti99_8e, ti99_8, 0, ti99_8_50hz, ti99_8, ti99_8_state, empty_init, "Texas Instruments", "TI-99/8 Computer (Europe)", MACHINE_SUPPORTS_SAVE )