summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/intv.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/intv.cpp')
-rw-r--r--src/mame/drivers/intv.cpp668
1 files changed, 0 insertions, 668 deletions
diff --git a/src/mame/drivers/intv.cpp b/src/mame/drivers/intv.cpp
deleted file mode 100644
index 27586249d85..00000000000
--- a/src/mame/drivers/intv.cpp
+++ /dev/null
@@ -1,668 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Nathan Woods,Frank Palazzolo
-/************************************************************************
- * Mattel Intellivision + Keyboard Component Drivers
- *
- * Frank Palazzolo
- * Kyle Davis
- *
- * TBD:
- * Add tape support (intvkbd)
- * Add runtime tape loading
- * Fix memory system workaround
- * (memory handler stuff in CP1610, debugger, and shared mem)
- * STIC
- * reenable dirty support
- * Cleanup
- * Separate stic & video better, get rid of *2 for kbd comp
- * Add better runtime cart loading
- * Switch to tilemap system
- * Note from kevtris about IntelliVoice Hookup:
-<kevtris> the intv uses a special chip
-<kevtris> called the SPB640
-<kevtris> it is really cool and lame at the same time
-<kevtris> it holds 64 10 bit words, which it simply serializes and sends to the SP0256
-<kevtris> the SP0256-012 just blindly jumps to 02000h or something when you try to play one of the samples
-<kevtris> the SPB640 sits at 2000h and when it sees that address come up, it will send out the 640 bits to the '256
-<kevtris> this means you cannot use any gotos/gosubs in your speech data, but that is OK
-<kevtris> it's just a single serial stream. the intv simply watches the buffer state and refills it periodically. there's enough buffer to keep it full for 1 frame
-<kevtris> that's about it
-<kevtris> the samples are stored in the game ROMs, and are easy to extract
-
-9502, 9503 and 9504 are the chips used in the intv1 (the sears one may use different chips)
-9505 is used in some carts
-9503 and 9506 are the chips used in the intv2
-
-Known roms so far:
-RO-3-9502-011 = 4KiB(2Kiw) self-decoding mask rom with decoder & bus, (DIP40 containing 1/2 of EXEC, maps at words 0000-0fff or 1000-1fff [unclear which, guess is 0000], i/o maps at ?), located at U5 on intv1
-RO-3-9503-003 = 2KiB(1Kiw) self-decoding mask rom with decoder & bus, (DIP40 containing GROM, maps at words 0x3000-0x37FF, i/o maps at ?), located at U21 in intv1, U5 in intv2
-RO-3-9504-021 = 4KiB(2Kiw) self-decoding mask rom without decoder or bus, (DIP28 containing 1/2 of EXEC, maps at words 0000-0fff or 1000-1fff [unclear which, guess is 1000]), located at U6 in intv1
-RO-3-9506-010 = 8KiB(4Kiw)+512B(256W) self-decoding mask rom with decoder & bus, (DIP40 containing EXEC2, maps at words 0000-1fff and 0400-04FF, i/o maps at ?) located at U6 in intv2
-
-rom types (suspected, not proven yet):
-RO-3-9502 = 4KiB (2Kiw) self decoding address mask rom with external address decoder & bus (DIP40)
-RO-3-9503 = 2KiB (1Kiw) self decoding address mask rom with external address decoder & bus (DIP40)
-RO-3-9504 = 4KiB (2Kiw) self decoding address mask rom without external address decoder or bus (DIP28)
-RO-3-9505 = 8KiB (4Kiw) self decoding address mask rom without external address decoder or bus (DIP28)
-RO-3-9506 = 8KiB (4Kiw) self decoding address mask rom with external address decoder & bus (DIP40)
-
- *
- ************************************************************************/
-
-
-#include "emu.h"
-#include "includes/intv.h"
-
-#include "cpu/m6502/m6502.h"
-#include "cpu/cp1610/cp1610.h"
-#include "sound/ay8910.h"
-#include "screen.h"
-#include "softlist.h"
-#include "speaker.h"
-
-
-#ifndef VERBOSE
-#ifdef MAME_DEBUG
-#define VERBOSE 1
-#else
-#define VERBOSE 0
-#endif
-#endif
-
-static constexpr rgb_t intv_colors[] =
-{
- { 0x00, 0x00, 0x00 }, // BLACK
- { 0x00, 0x2d, 0xff }, // BLUE
- { 0xff, 0x3d, 0x10 }, // RED
- { 0xc9, 0xcf, 0xab }, // TAN
- { 0x38, 0x6b, 0x3f }, // DARK GREEN
- { 0x00, 0xa7, 0x56 }, // GREEN
- { 0xfa, 0xea, 0x50 }, // YELLOW
- { 0xff, 0xfc, 0xff }, // WHITE
- { 0xbd, 0xac, 0xc8 }, // GRAY
- { 0x24, 0xb8, 0xff }, // CYAN
- { 0xff, 0xb4, 0x1f }, // ORANGE
- { 0x54, 0x6e, 0x00 }, // BROWN
- { 0xff, 0x4e, 0x57 }, // PINK
- { 0xa4, 0x96, 0xff }, // LIGHT BLUE
- { 0x75, 0xcc, 0x80 }, // YELLOW GREEN
- { 0xb5, 0x1a, 0x58 } // PURPLE
-};
-
-void intv_state::intv_palette(palette_device &palette) const
-{
- int k = 0;
- // Two copies of everything (why?)
-
- for (int i = 0; i < 16; i++)
- {
- palette.set_indirect_color(i, intv_colors[i]);
- palette.set_indirect_color(i + 16, intv_colors[i]);
- }
-
- for (int i = 0; i < 16; i++)
- {
- for (int j = 0; j < 16; j++)
- {
- palette.set_pen_indirect(k++, i);
- palette.set_pen_indirect(k++, j);
- }
- }
-
- for (int i = 0; i < 16; i++)
- {
- for (int j = 16; j < 32; j++)
- {
- palette.set_pen_indirect(k++, i);
- palette.set_pen_indirect(k++, j);
- }
- }
-}
-
-/* graphics output */
-
-static const gfx_layout intvkbd_charlayout =
-{
- 8, 8,
- 256,
- 1,
- { 0 },
- { 0, 1, 2, 3, 4, 5, 6, 7 },
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
- 8 * 8
-};
-
-static GFXDECODE_START( gfx_intvkbd )
- GFXDECODE_ENTRY( "gfx1", 0x0000, intvkbd_charlayout, 0, 256 )
-GFXDECODE_END
-
-
-/*
- Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
-
- Row 0 NC NC NC NC NC NC CTRL SHIFT
- Row 1 NC NC NC NC NC NC RPT LOCK
- Row 2 NC / , N V X NC SPC
- Row 3 (right) . M B C Z NC CLS
- Row 4 (down) ; K H F S NC TAB
- Row 5 ] P I Y R W NC Q
- Row 6 (up) - 9 7 5 3 NC 1
- Row 7 = 0 8 6 4 2 NC [
- Row 8 (return)(left) O U T E NC ESC
- Row 9 DEL ' L J G D NC A
-
-2008-05 FP:
-The keyboard layout is quite strange, with '[' and ']' at the two ends of the 1st row,
-'Esc' in the 2nd row (between 'Tab' and 'Q'), and with Cursor keys and 'Enter' where
-you would expect the braces. Moreover, Shift + Cursor keys produce characters.
-The emulated layout moves 'Esc', '[' and ']' to their usual position.
-
-Moreover, a small note on natural keyboard support: currently
-- "Clear Screen" is mapped to 'Left Alt'
-- "Repeat" is mapped to 'F1'
-- "Lock" is mapped to 'F2'
-*/
-
-static INPUT_PORTS_START( intvkbd )
- PORT_START("ROW0")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
-
- PORT_START("ROW1")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("REPEAT") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(F1))
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LOCK") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_MAMEKEY(F2))
-
- PORT_START("ROW2")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',')
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('N')
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('V')
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('X')
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
-
- PORT_START("ROW3")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHAR('>')
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.')
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('M')
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('B')
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('C')
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Clear Screen") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT))
-
- PORT_START("ROW4")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CHAR('\\')
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('K')
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('H')
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('F')
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('S')
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t')
-
- PORT_START("ROW5")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('P')
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('I')
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y')
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('R')
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('W')
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q')
-
- PORT_START("ROW6")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CHAR('|')
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('_') PORT_CHAR('-')
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(')
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&')
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
-
- PORT_START("ROW7")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+')
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')')
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*')
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR(0xA2)
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@')
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') // this one would be 1st row, 1st key (at 'Esc' position)
-
- PORT_START("ROW8")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CHAR('<')
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('O')
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('U')
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('T')
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('E')
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) // this one would be 2nd row, 2nd key (between 'Tab' and 'Q')
-
- PORT_START("ROW9")
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Del") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"')
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('L')
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('J')
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('G')
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('D')
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NC")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('A')
-
- PORT_START("TEST") /* For tape drive testing... */
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD)
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD)
-INPUT_PORTS_END
-
-void intv_state::intv_mem(address_map &map)
-{
- map(0x0000, 0x003f).rw(FUNC(intv_state::intv_stic_r), FUNC(intv_state::intv_stic_w));
- map(0x0100, 0x01ef).rw(FUNC(intv_state::intv_ram8_r), FUNC(intv_state::intv_ram8_w));
- map(0x01f0, 0x01ff).rw(m_sound, FUNC(ay8914_device::read), FUNC(ay8914_device::write)).umask16(0x00ff);
- map(0x0200, 0x035f).rw(FUNC(intv_state::intv_ram16_r), FUNC(intv_state::intv_ram16_w));
- map(0x0400, 0x04ff).r(m_cart, FUNC(intv_cart_slot_device::read_rom04));
- map(0x1000, 0x1fff).rom().region("maincpu", 0x1000 << 1); // Exec ROM, 10-bits wide
- map(0x2000, 0x2fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom20));
- map(0x3000, 0x37ff).r(m_stic, FUNC(stic_device::grom_read)); // GROM, 8-bits wide
- map(0x3800, 0x39ff).rw(FUNC(intv_state::intv_gram_r), FUNC(intv_state::intv_gram_w)); // GRAM, 8-bits wide
- map(0x3a00, 0x3bff).rw(FUNC(intv_state::intv_gram_r), FUNC(intv_state::intv_gram_w)); // GRAM Alias, 8-bits wide
- map(0x4000, 0x47ff).r(m_cart, FUNC(intv_cart_slot_device::read_rom40));
- map(0x4800, 0x4fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom48));
- map(0x5000, 0x5fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom50));
- map(0x6000, 0x6fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom60));
- map(0x7000, 0x7fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom70));
- map(0x8000, 0x8fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom80));
- map(0x9000, 0x9fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom90));
- map(0xa000, 0xafff).r(m_cart, FUNC(intv_cart_slot_device::read_roma0));
- map(0xb000, 0xbfff).r(m_cart, FUNC(intv_cart_slot_device::read_romb0));
- map(0xc000, 0xcfff).r(m_cart, FUNC(intv_cart_slot_device::read_romc0));
- map(0xd000, 0xdfff).r(m_cart, FUNC(intv_cart_slot_device::read_romd0));
- map(0xe000, 0xefff).r(m_cart, FUNC(intv_cart_slot_device::read_rome0));
- map(0xf000, 0xffff).r(m_cart, FUNC(intv_cart_slot_device::read_romf0));
-}
-
-void intv_state::intvoice_mem(address_map &map)
-{
- map(0x0000, 0x003f).rw(FUNC(intv_state::intv_stic_r), FUNC(intv_state::intv_stic_w));
- map(0x0080, 0x0081).rw("voice", FUNC(intv_voice_device::read_speech), FUNC(intv_voice_device::write_speech)); // Intellivoice
- map(0x0100, 0x01ef).rw(FUNC(intv_state::intv_ram8_r), FUNC(intv_state::intv_ram8_w));
- map(0x01f0, 0x01ff).rw(m_sound, FUNC(ay8914_device::read), FUNC(ay8914_device::write)).umask16(0x00ff);
- map(0x0200, 0x035f).rw(FUNC(intv_state::intv_ram16_r), FUNC(intv_state::intv_ram16_w));
- map(0x0400, 0x04ff).r("voice", FUNC(intv_voice_device::read_rom04));
- map(0x1000, 0x1fff).rom().region("maincpu", 0x1000 << 1); // Exec ROM, 10-bits wide
- map(0x2000, 0x2fff).r("voice", FUNC(intv_voice_device::read_rom20));
- map(0x3000, 0x37ff).r(m_stic, FUNC(stic_device::grom_read)); // GROM, 8-bits wide
- map(0x3800, 0x39ff).rw(FUNC(intv_state::intv_gram_r), FUNC(intv_state::intv_gram_w)); // GRAM, 8-bits wide
- map(0x3a00, 0x3bff).rw(FUNC(intv_state::intv_gram_r), FUNC(intv_state::intv_gram_w)); // GRAM Alias, 8-bits wide
- map(0x4000, 0x47ff).r("voice", FUNC(intv_voice_device::read_rom40));
- map(0x4800, 0x4fff).r("voice", FUNC(intv_voice_device::read_rom48));
- map(0x5000, 0x5fff).r("voice", FUNC(intv_voice_device::read_rom50));
- map(0x6000, 0x6fff).r("voice", FUNC(intv_voice_device::read_rom60));
- map(0x7000, 0x7fff).r("voice", FUNC(intv_voice_device::read_rom70));
- map(0x8000, 0x8fff).r("voice", FUNC(intv_voice_device::read_rom80));
- map(0x9000, 0x9fff).r("voice", FUNC(intv_voice_device::read_rom90));
- map(0xa000, 0xafff).r("voice", FUNC(intv_voice_device::read_roma0));
- map(0xb000, 0xbfff).r("voice", FUNC(intv_voice_device::read_romb0));
- map(0xc000, 0xcfff).r("voice", FUNC(intv_voice_device::read_romc0));
- map(0xd000, 0xdfff).r("voice", FUNC(intv_voice_device::read_romd0));
- map(0xe000, 0xefff).r("voice", FUNC(intv_voice_device::read_rome0));
- map(0xf000, 0xffff).r("voice", FUNC(intv_voice_device::read_romf0));
-}
-
-void intv_state::intv2_mem(address_map &map)
-{
- map(0x0000, 0x003f).rw(FUNC(intv_state::intv_stic_r), FUNC(intv_state::intv_stic_w));
- map(0x0100, 0x01ef).rw(FUNC(intv_state::intv_ram8_r), FUNC(intv_state::intv_ram8_w));
- map(0x01f0, 0x01ff).rw(m_sound, FUNC(ay8914_device::read), FUNC(ay8914_device::write)).umask16(0x00ff);
- map(0x0200, 0x035f).rw(FUNC(intv_state::intv_ram16_r), FUNC(intv_state::intv_ram16_w));
- map(0x0400, 0x04ff).rom().region("maincpu", 0x400 << 1); // Exec ROM, 10-bits wide
- map(0x1000, 0x1fff).rom().region("maincpu", 0x1000 << 1); // Exec ROM, 10-bits wide
- map(0x2000, 0x2fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom20));
- map(0x3000, 0x37ff).r(m_stic, FUNC(stic_device::grom_read)); // GROM, 8-bits wide
- map(0x3800, 0x39ff).rw(FUNC(intv_state::intv_gram_r), FUNC(intv_state::intv_gram_w)); // GRAM, 8-bits wide
- map(0x3a00, 0x3bff).rw(FUNC(intv_state::intv_gram_r), FUNC(intv_state::intv_gram_w)); // GRAM Alias, 8-bits wide
- map(0x4000, 0x47ff).r(m_cart, FUNC(intv_cart_slot_device::read_rom40));
- map(0x4800, 0x4fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom48));
- map(0x5000, 0x5fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom50));
- map(0x6000, 0x6fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom60));
- map(0x7000, 0x7fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom70));
- map(0x8000, 0x8fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom80));
- map(0x9000, 0x9fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom90));
- map(0xa000, 0xafff).r(m_cart, FUNC(intv_cart_slot_device::read_roma0));
- map(0xb000, 0xbfff).r(m_cart, FUNC(intv_cart_slot_device::read_romb0));
- map(0xc000, 0xcfff).r(m_cart, FUNC(intv_cart_slot_device::read_romc0));
- map(0xd000, 0xdfff).r(m_cart, FUNC(intv_cart_slot_device::read_romd0));
- map(0xe000, 0xefff).r(m_cart, FUNC(intv_cart_slot_device::read_rome0));
- map(0xf000, 0xffff).r(m_cart, FUNC(intv_cart_slot_device::read_romf0));
-}
-
-void intv_state::intvecs_mem(address_map &map)
-{
- map(0x0000, 0x003f).rw(FUNC(intv_state::intv_stic_r), FUNC(intv_state::intv_stic_w));
- map(0x0080, 0x0081).rw("speech", FUNC(sp0256_device::spb640_r), FUNC(sp0256_device::spb640_w)); /* Intellivoice */
- // map(0x00e0, 0x00e3).rw(FUNC(intv_state::intv_ecs_uart_r), FUNC(intv_state::intv_ecs_uart_w));
- map(0x00f0, 0x00ff).rw("ecs", FUNC(intv_ecs_device::read_ay), FUNC(intv_ecs_device::write_ay)); /* ecs psg */
- map(0x0100, 0x01ef).rw(FUNC(intv_state::intv_ram8_r), FUNC(intv_state::intv_ram8_w));
- map(0x01f0, 0x01ff).rw(m_sound, FUNC(ay8914_device::read), FUNC(ay8914_device::write)).umask16(0x00ff);
- map(0x0200, 0x035f).rw(FUNC(intv_state::intv_ram16_r), FUNC(intv_state::intv_ram16_w));
- map(0x0400, 0x04ff).r("ecs", FUNC(intv_ecs_device::read_rom04));
- map(0x1000, 0x1fff).rom().region("maincpu", 0x1000<<1); /* Exec ROM, 10-bits wide */
- map(0x2000, 0x2fff).rw("ecs", FUNC(intv_ecs_device::read_rom20), FUNC(intv_ecs_device::write_rom20));
- map(0x3000, 0x37ff).r(m_stic, FUNC(stic_device::grom_read)); /* GROM, 8-bits wide */
- map(0x3800, 0x39ff).rw(FUNC(intv_state::intv_gram_r), FUNC(intv_state::intv_gram_w)); /* GRAM, 8-bits wide */
- map(0x3a00, 0x3bff).rw(FUNC(intv_state::intv_gram_r), FUNC(intv_state::intv_gram_w)); /* GRAM Alias, 8-bits wide */
- map(0x4000, 0x47ff).rw("ecs", FUNC(intv_ecs_device::read_ram), FUNC(intv_ecs_device::write_ram));
- map(0x4800, 0x4fff).r("ecs", FUNC(intv_ecs_device::read_rom48));
- map(0x5000, 0x5fff).r("ecs", FUNC(intv_ecs_device::read_rom50));
- map(0x6000, 0x6fff).r("ecs", FUNC(intv_ecs_device::read_rom60));
- map(0x7000, 0x7fff).rw("ecs", FUNC(intv_ecs_device::read_rom70), FUNC(intv_ecs_device::write_rom70));
- map(0x8000, 0x8fff).r("ecs", FUNC(intv_ecs_device::read_rom80));
- map(0x9000, 0x9fff).r("ecs", FUNC(intv_ecs_device::read_rom90));
- map(0xa000, 0xafff).r("ecs", FUNC(intv_ecs_device::read_roma0));
- map(0xb000, 0xbfff).r("ecs", FUNC(intv_ecs_device::read_romb0));
- map(0xc000, 0xcfff).r("ecs", FUNC(intv_ecs_device::read_romc0));
- map(0xd000, 0xdfff).r("ecs", FUNC(intv_ecs_device::read_romd0));
- map(0xe000, 0xefff).rw("ecs", FUNC(intv_ecs_device::read_rome0), FUNC(intv_ecs_device::write_rome0));
- map(0xf000, 0xffff).rw("ecs", FUNC(intv_ecs_device::read_romf0), FUNC(intv_ecs_device::write_romf0));
-}
-
-void intv_state::intvkbd_mem(address_map &map)
-{
- map(0x0000, 0x003f).rw(FUNC(intv_state::intv_stic_r), FUNC(intv_state::intv_stic_w));
- map(0x0100, 0x01ef).rw(FUNC(intv_state::intv_ram8_r), FUNC(intv_state::intv_ram8_w));
- map(0x01f0, 0x01ff).rw(m_sound, FUNC(ay8914_device::read), FUNC(ay8914_device::write)).umask16(0x00ff);
- map(0x0200, 0x035f).rw(FUNC(intv_state::intv_ram16_r), FUNC(intv_state::intv_ram16_w));
- map(0x0400, 0x04ff).r(m_cart, FUNC(intv_cart_slot_device::read_rom04));
- map(0x1000, 0x1fff).rom().region("maincpu", 0x1000<<1); /* Exec ROM, 10-bits wide */
- map(0x2000, 0x2fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom20));
- map(0x3000, 0x37ff).r(m_stic, FUNC(stic_device::grom_read)); /* GROM, 8-bits wide */
- map(0x3800, 0x39ff).rw(FUNC(intv_state::intv_gram_r), FUNC(intv_state::intv_gram_w)); /* GRAM, 8-bits wide */
- map(0x3a00, 0x3bff).rw(FUNC(intv_state::intv_gram_r), FUNC(intv_state::intv_gram_w)); /* GRAM Alias, 8-bits wide */
- map(0x4000, 0x47ff).r(m_cart, FUNC(intv_cart_slot_device::read_rom40));
- map(0x4800, 0x4fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom48));
- map(0x5000, 0x5fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom50));
- map(0x6000, 0x6fff).r(m_cart, FUNC(intv_cart_slot_device::read_rom60));
- map(0x7000, 0x7fff).rom().region("maincpu", 0x7000<<1); /* Keyboard ROM */
- map(0x8000, 0xbfff).ram().w(FUNC(intv_state::intvkbd_dualport16_w)).share("dualport_ram"); /* Dual-port RAM */
- map(0xc000, 0xcfff).r(m_cart, FUNC(intv_cart_slot_device::read_romc0));
- map(0xd000, 0xdfff).r(m_cart, FUNC(intv_cart_slot_device::read_romd0));
- map(0xe000, 0xefff).r(m_cart, FUNC(intv_cart_slot_device::read_rome0));
- map(0xf000, 0xffff).r(m_cart, FUNC(intv_cart_slot_device::read_romf0));
-}
-
-void intv_state::intvkbd2_mem(address_map &map)
-{
- map.unmap_value_high(); /* Required because of probing */
- map(0x0000, 0x3fff).rw(FUNC(intv_state::intvkbd_dualport8_lsb_r), FUNC(intv_state::intvkbd_dualport8_lsb_w)); /* Dual-port RAM */
- map(0x4000, 0x40bf).rw(FUNC(intv_state::intvkbd_io_r), FUNC(intv_state::intvkbd_io_w));
- map(0x40c0, 0x40cf).rw(m_crtc, FUNC(tms9927_device::read), FUNC(tms9927_device::write));
- map(0x4200, 0x7fff).rw(FUNC(intv_state::intvkbd_dualport8_msb_r), FUNC(intv_state::intvkbd_dualport8_msb_w)); /* Dual-port RAM */
- map(0xb7f8, 0xb7ff).rw(FUNC(intv_state::intvkbd_periph_r), FUNC(intv_state::intvkbd_periph_w));
- map(0xb800, 0xbfff).ram().share("videoram"); /* Text Display */
- map(0xc000, 0xdfff).rom();
- map(0xe000, 0xffff).r(FUNC(intv_state::intvkb_iocart_r));
-}
-
-void intv_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
-{
- switch (id)
- {
- case TIMER_INTV_INTERRUPT2_COMPLETE:
- intv_interrupt2_complete(ptr, param);
- break;
- case TIMER_INTV_INTERRUPT_COMPLETE:
- intv_interrupt_complete(ptr, param);
- break;
- case TIMER_INTV_BTB_FILL:
- intv_btb_fill(ptr, param);
- break;
- default:
- throw emu_fatalerror("Unknown id in intv_state::device_timer");
- }
-}
-
-
-/* This is needed because MAME core does not allow PULSE_LINE.
- The time interval is not critical, although it should be below 1000. */
-
-TIMER_CALLBACK_MEMBER(intv_state::intv_interrupt2_complete)
-{
- m_keyboard->set_input_line(0, CLEAR_LINE);
-}
-
-INTERRUPT_GEN_MEMBER(intv_state::intv_interrupt2)
-{
- m_keyboard->set_input_line(0, ASSERT_LINE);
- timer_set(m_keyboard->cycles_to_attotime(100), TIMER_INTV_INTERRUPT2_COMPLETE);
-}
-
-void intv_state::intv(machine_config &config)
-{
- /* basic machine hardware */
- CP1610(config, m_maincpu, XTAL(3'579'545)/4); /* Colorburst/4 */
- m_maincpu->set_addrmap(AS_PROGRAM, &intv_state::intv_mem);
- m_maincpu->set_vblank_int("screen", FUNC(intv_state::intv_interrupt));
- config.set_maximum_quantum(attotime::from_hz(60));
-
- /* video hardware */
- STIC(config, m_stic, XTAL(3'579'545));
- m_stic->set_screen("screen");
-
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(59.92);
- //screen.set_vblank_time(ATTOSECONDS_IN_USEC(2400)); /* not accurate */
- screen.set_screen_update(FUNC(intv_state::screen_update_intv));
- screen.set_size(stic_device::SCREEN_WIDTH*INTV_X_SCALE, stic_device::SCREEN_HEIGHT*INTV_Y_SCALE);
- screen.set_visarea(0, stic_device::SCREEN_WIDTH*INTV_X_SCALE-1, 0, stic_device::SCREEN_HEIGHT*INTV_Y_SCALE-1);
- screen.set_palette(m_palette);
-
- PALETTE(config, m_palette, FUNC(intv_state::intv_palette), 0x400, 32);
-
- INTV_CONTROL_PORT(config, "iopt_right_ctrl", intv_control_port_devices, "handctrl");
- INTV_CONTROL_PORT(config, "iopt_left_ctrl", intv_control_port_devices, "handctrl");
-
- /* sound hardware */
- SPEAKER(config, "mono").front_center();
- AY8914(config, m_sound, XTAL(3'579'545)/2);
- m_sound->port_a_read_callback().set("iopt_right_ctrl", FUNC(intv_control_port_device::ctrl_r));
- m_sound->port_b_read_callback().set("iopt_left_ctrl", FUNC(intv_control_port_device::ctrl_r));
- m_sound->add_route(ALL_OUTPUTS, "mono", 0.33);
-
- /* cartridge */
- INTV_CART_SLOT(config, m_cart, intv_cart, nullptr);
-
- /* software lists */
- SOFTWARE_LIST(config, "cart_list").set_original("intv");
- SOFTWARE_LIST(config, "ecs_list").set_compatible("intvecs");
-}
-
-void intv_state::intv2(machine_config &config)
-{
- intv(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &intv_state::intv2_mem);
-}
-
-void intv_state::intvoice(machine_config &config)
-{
- intv(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &intv_state::intvoice_mem);
-
- config.device_remove("cartslot");
- INTV_ROM_VOICE(config, "voice", 0);
-}
-
-void intv_state::intvecs(machine_config &config)
-{
- intv(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &intv_state::intvecs_mem);
-
- config.device_remove("cartslot");
- INTV_ROM_ECS(config, "ecs", 0);
-
- sp0256_device &speech(SP0256(config, "speech", 3120000));
- /* The Intellivoice uses a speaker with its own volume control so the relative volumes to use are subjective */
- speech.add_route(ALL_OUTPUTS, "mono", 1.00);
-
- /* cassette */
- //CASSETTE(config, "cassette");
-
- /* software lists */
- config.device_remove("ecs_list");
- SOFTWARE_LIST(config.replace(), "cart_list").set_original("intvecs");
- SOFTWARE_LIST(config, "intv_list").set_compatible("intv");
-}
-
-void intv_state::intvkbd(machine_config &config)
-{
- intv(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &intv_state::intvkbd_mem);
-
- M6502(config, m_keyboard, XTAL(7'159'090)/8);
- m_keyboard->set_addrmap(AS_PROGRAM, &intv_state::intvkbd2_mem);
- m_keyboard->set_vblank_int("screen", FUNC(intv_state::intv_interrupt2));
-
- config.set_maximum_quantum(attotime::from_hz(6000));
-
- /* video hardware */
- GFXDECODE(config, m_gfxdecode, m_palette, gfx_intvkbd);
-
- /* crt controller */
- TMS9927(config, m_crtc, XTAL(7'159'090)/8);
- m_crtc->set_char_width(8);
- m_crtc->set_overscan(
- stic_device::OVERSCAN_LEFT_WIDTH*stic_device::X_SCALE*INTVKBD_X_SCALE,
- stic_device::OVERSCAN_RIGHT_WIDTH*stic_device::X_SCALE*INTVKBD_X_SCALE,
- stic_device::OVERSCAN_TOP_HEIGHT*stic_device::Y_SCALE*INTVKBD_Y_SCALE,
- stic_device::OVERSCAN_BOTTOM_HEIGHT*stic_device::Y_SCALE*INTVKBD_Y_SCALE);
-
- subdevice<screen_device>("screen")->set_screen_update(FUNC(intv_state::screen_update_intvkbd));
-
- /* I/O cartslots for BASIC */
- GENERIC_CARTSLOT(config, m_iocart1, generic_plain_slot, "intbasic_cart");
- GENERIC_CARTSLOT(config, m_iocart2, generic_plain_slot, "intbasic_cart");
-}
-
-ROM_START(intv) // the intv1 exec rom should be two roms: RO-3-9502-011.U5 and RO-3-9504-021.U6
- ROM_REGION(0x10000<<1,"maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD( "exec.bin", (0x1000<<1)+0, 0x2000, CRC(cbce86f7) SHA1(5a65b922b562cb1f57dab51b73151283f0e20c7a))
-ROM_END
-
-#define rom_intvoice rom_intv
-
-// the later intellivision 2's exec rom is a single ro-3-9506-010 at location ic6 holding 8k plus 512 bytes; the 1st 512 bytes are at 0x400 and the 8k at 0x1000
-ROM_START(intv2)
- ROM_REGION(0x10000<<1,"maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD_SWAP( "ro-3-9506-010.ic6", (0x400<<1)+0, 0x200, CRC(dd7e1237) SHA1(fb821a643b7714ed4c812553cd3f668766fd44ab))
- ROM_CONTINUE( (0x1000<<1)+0, 0x2000 )
-ROM_END
-
-ROM_START(intvsrs) // the intv1 sears exec rom should be two roms: RO-3-9502-???.U5 and RO-3-9504-???.U6 but the correct names are unknown as of yet
- ROM_REGION(0x10000<<1,"maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD( "searsexc.bin", (0x1000<<1)+0, 0x2000, CRC(ea552a22) SHA1(834339de056d42a35571cae7fd5b04d1344001e9))
-ROM_END
-
-ROM_START(intvecs) // the intv1 exec rom should be two roms: RO-3-9502-011.U5 and RO-3-9504-021.U6
- ROM_REGION(0x10000<<1,"maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD( "exec.bin", (0x1000<<1)+0, 0x2000, CRC(cbce86f7) SHA1(5a65b922b562cb1f57dab51b73151283f0e20c7a))
-
- ROM_REGION( 0x10000<<1, "speech", 0 )
- /* SP0256-012 Speech chip w/2KiB mask rom */
- ROM_LOAD( "sp0256-012.bin", 0x1000, 0x0800, CRC(0de7579d) SHA1(618563e512ff5665183664f52270fa9606c9d289) )
-ROM_END
-
-/*
-Intellivision Keyboard Component - Prototype
--------------------------------------------------------------
-
-GI 9333B-0104 0104.U20 4Kx8 Mask ROM, 6502 code
-Intel 2732 "CPU 2D" CPU2D.U21 4Kx8 EPROM, 6502 code
-
-TI 8S030N 1149-0360 0360.U58 32x8 Timing prom?
-TI 8S030N 1149-0370 0370.U74 32x8 Timing prom?
-
-GI RO-3-9502-024 024.U60 2Kx10 Mask ROM+Addr Decoder, CP1600 code
-GI 9316B-4D72 4D72.U62 2Kx8 Mask ROM, CP1600 code (upper)
-GI 9316B-4D71 4D71.U63 2Kx8 Mask ROM, CP1600 code (lower)
-GI 9316B-4C52 4C52.U34 2Kx8 Mask ROM, Alphanumerics
-
-Main board also includes:
-
- 2 2114 DRAMS 1Kx4 Character memory
- 10 MM5290J DRAMS 16Kx10 CP1600 memory?
- 1 6502
- 1 Mystery 40-pin chip (under heat sink)
- (actually a SMC CRT5027 aka TI TMS9927 CRT controller)
-*/
-
-ROM_START(intvkbd) // the intv1 exec rom should be two roms: RO-3-9502-011.U5 and RO-3-9504-021.U6
- ROM_REGION(0x10000<<1,"maincpu", ROMREGION_ERASEFF)
- ROM_LOAD16_WORD( "exec.bin", 0x1000<<1, 0x2000, CRC(cbce86f7) SHA1(5a65b922b562cb1f57dab51b73151283f0e20c7a))
- ROM_LOAD16_WORD( "024.u60", 0x7000<<1, 0x1000, CRC(4f7998ec) SHA1(ec006d0ae9002e9d56d83a71f5f2eddd6a456a40))
- ROM_LOAD16_BYTE( "4d72.u62", 0x7800<<1, 0x0800, CRC(aa57c594) SHA1(741860d489d90f5882ca53daa3169b6abacdf130))
- ROM_LOAD16_BYTE( "4d71.u63", (0x7800<<1)+1, 0x0800, CRC(069b2f0b) SHA1(070850bb32f8474107cc52c5183cfaa32d640f9a))
-
- ROM_REGION(0x10000,"keyboard",0)
- ROM_LOAD( "0104.u20", 0xc000, 0x1000, CRC(5c6f1256) SHA1(271931fb354dfae6a1a5697ee888924a89a15ca8))
- ROM_RELOAD( 0xe000, 0x1000 )
- ROM_LOAD("cpu2d.u21", 0xd000, 0x1000, CRC(2c2dba33) SHA1(0db5d177fec3f8ae89abeef2e6900ad4f3460266))
- ROM_RELOAD( 0xf000, 0x1000 )
-
- ROM_REGION(0x00800,"gfx1",0)
- ROM_LOAD( "4c52.u34", 0x0000, 0x0800, CRC(cbeb2e96) SHA1(f0e17adcd278fb376c9f90833c7fbbb60193dbe3))
-
- ROM_REGION(0x0100,"proms",0)
- ROM_LOAD( "0360.u58", 0x00, 0x20, CRC(1295528a) SHA1(b35e598891f1185e02cbacb4811d2334357abd79))
- ROM_LOAD( "0370.u74", 0x20, 0x20, CRC(19da5096) SHA1(76af50e4fd29649fc4837120c245321a8fc84cd3))
-ROM_END
-
-void intv_state::init_intv()
-{
- m_stic->set_x_scale(INTV_X_SCALE);
- m_stic->set_y_scale(INTV_Y_SCALE);
- m_is_keybd = 0;
-}
-
-void intv_state::init_intvkbd()
-{
- m_stic->set_x_scale(INTVKBD_X_SCALE);
- m_stic->set_y_scale(INTVKBD_Y_SCALE);
- m_is_keybd = 1;
-}
-
-
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
-
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
-CONS( 1979, intv, 0, 0, intv, 0, intv_state, init_intv, "Mattel", "Intellivision", MACHINE_SUPPORTS_SAVE )
-CONS( 1981, intvsrs, intv, 0, intv, 0, intv_state, init_intv, "Sears", "Super Video Arcade", MACHINE_SUPPORTS_SAVE )
-COMP( 1981, intvkbd, intv, 0, intvkbd, intvkbd, intv_state, init_intvkbd, "Mattel", "Intellivision Keyboard Component (Unreleased)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
-CONS( 1982, intv2, intv, 0, intv2, 0, intv_state, init_intv, "Mattel", "Intellivision II", MACHINE_SUPPORTS_SAVE )
-
-// made up, user friendlier machines with pre-mounted passthu expansions
-COMP( 1982, intvoice, intv, 0, intvoice, 0, intv_state, init_intv, "Mattel", "Intellivision w/IntelliVoice expansion", MACHINE_SUPPORTS_SAVE )
-COMP( 1983, intvecs, intv, 0, intvecs, 0, intv_state, init_intv, "Mattel", "Intellivision w/Entertainment Computer System + Intellivoice expansions", MACHINE_SUPPORTS_SAVE )