diff options
Diffstat (limited to 'src/mame/drivers/tutor.cpp')
-rw-r--r-- | src/mame/drivers/tutor.cpp | 814 |
1 files changed, 0 insertions, 814 deletions
diff --git a/src/mame/drivers/tutor.cpp b/src/mame/drivers/tutor.cpp deleted file mode 100644 index 8226690a247..00000000000 --- a/src/mame/drivers/tutor.cpp +++ /dev/null @@ -1,814 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:Raphael Nabet -/* - Experimental Tomy Tutor driver - - This computer is known as Tomy Tutor in US, and as Grandstand Tutor in UK. - It was initially released in Japan in 1982 or 1983 under the name of Pyuuta - (Pi-yu-u-ta, with a Kanji for the "ta"). The Japanese versions are - different from the English-language versions, as they have different ROMs - with Japanese messages and support for the katakana syllabus. There are at - least 4 versions: - * original Pyuuta (1982 or 1983) with title screens in Japanese but no - Basic - * Pyuuta Jr. (1983?) which is a console with a simplified keyboard - * Tomy/Grandstand Tutor (circa October 1983?) with title screens in English - and integrated Basic - * Pyuuta Mk. 2 (1984?) with a better-looking keyboard and integrated Basic - - The Tomy Tutor features a TMS9995 CPU @10.7MHz (which includes a - timer/counter and 256 bytes of 16-bit RAM), 48kb of ROM (32kb on early - models that did not have the BASIC interpreter), a tms9918a/9929a VDP (or - equivalent?) with 16kb of VRAM, and a sn76489an sound generator. - There is a tape interface, a 56-key keyboard, an interface for two - joysticks, a cartridge port and an extension port. The OS design does not - seem to be particularly expandable (I don't see any hook for additional - DSRs), but there were prototypes for a parallel port (emulated) - and a speech synthesizer unit (not emulated). - - - The Tutor appears to be related to Texas Instruments' TI99 series. - - The general architecture is relatively close to the ti99/4(a): arguably, - the Tutor does not include any GROM (it uses regular CPU ROMs for GPL - code), and its memory map is quite different due to the fact it was - designed with a tms9995 in mind (vs. a tms9985 for ti99/4), but, apart from - that, it has a similar architecture with only 256 bytes of CPU RAM and 16kb - of VRAM. - - While the OS is not derived directly from the TI99/4(a) OS, there are - disturbing similarities: the Japanese title screen is virtually identical - to the TI-99 title screen. Moreover, the Tutor BASIC seems to be be - derived from TI Extended BASIC, as both BASIC uses similar tokens and - syntax, and are partially written in GPL (there is therefore a GPL - interpreter in Tutor ROMs, although the Tutor GPL is incompatible with TI - GPL, does not seem to be used by any program other than Tutor Basic, and it - seems unlikely that the original Pyuuta had this GPL interpreter in ROMs). - - It appears that TI has sold the licence of the TI BASIC to Tomy, probably - after it terminated its TI99 series. It is not impossible that the entire - Tutor concept is derived from a TI project under licence: this machine - looks like a crossbreed of the TI99/2 and the TI99/4 (or /4a, /4b, /5), and - it could either have been an early version of the TI99/2 project with a - tms9918a/99289a VDP instead of the DMA video controller, or a "TI99/3" that - would have closed the gap between the extremely low-end TI99/2 and the - relatively mid-range TI99/5. - - - Raphael Nabet, 2003 - - -TODO : - * debug the tape interface (Saved tapes sound OK, both Verify and Load - recognize the tape as a Tomy tape, but the data seems to be corrupted and - we end with a read error.) - * guess which device is located at the >e600 base - * find info about other Tutor variants - - - Interrupts: - - Interrupt levels 1 (external interrupt 1) and 2 (error interrupt) do not - seem to be used: triggering these seems to cause a soft reset. XOPs are - not used at all: the ROM area where these vectors should be defined is used - by a ROM branch table. - - -Memory Map found at http://www.floodgap.com/retrobits/tomy/mmap.html - - *** $0000-$7FFF is the 32K BIOS *** - it is also possible to replace the BIOS with an external ROM (see $E000 range) - -0000 - reset vector (level 0) - 0000-0001: WP 0002-0003: PC (%) -0004 - level 1 and 2 IRQ vectors (%) - idem. These just seem to reset the system. -000C - additional vectors -0040 - XOP vectors (%) - The BIOS doesn't seem to use these for XOPs. - Instead, this is a branch table. -0080 - BIOS code - (CRU only: $1EE0-FE: 9995 flag register; - $1FDA: MID flag) -4000 - GBASIC - (on the American v2.3 firmware, the GPL - interpreter and VDP RAMLUT co-exist - with GBASIC in this range) - - *** $8000-$BFFF is the 16K option ROM area *** - -8000 - BASIC (Tutor only) and/or cartridge ROM - (controlled by $E100) - To be recognized, a cartridge must have a - $55, $66 or $aa header sequence. - - *** end ROM *** -C000 - unmapped (possible use in 24K cartridges) -E000 - I/O range - --------- - 9918A VDP data/register ports: $E000, E002 - "MMU" banking controls: $E100-E1FF - $E100 write: enable cartridge, disable - BIOS at $0000 (???) -- magic - required at $E110 for this - $E108 write: enable BASIC ROM, disable - cartridge at $8000 - $E10C write: enable cartridge, disable - BASIC ROM at $8000 - $E110 must be $42 to enable $E100 - and to replace the BIOS with - an installed cartridge ROM. - BLWP assumed at $0000 (??). - SN76489AN sound data port: $E200 - Device handshaking: $E600 - Unknown purpose, disk drive maybe? - Printer handshaking: $E800 - This is a standard Centronics port. - $E810 write: parallel data bus - $E820 read: parallel port busy - $E840 write: port handshake output - Keyboard lines: $EC00-$EC7E (*CRU*) - (CRU physical address $7600-$763F) - Cassette lines: $ED00-$EEFF - $ED00 (*CRU*): input level - (physical address $7680) - $EE00 write: tape output zero - $EE20 write: tape output one - $EE40 write: tape IRQ on - $EE60 write: tape IRQ off - $EE80, A0, C0, E0: ??? - -F000 - TMS9995 RAM (*) -F0FC - ?? -FFFA - decrementer (*) -FFFC - NMI vector (*) -FFFF - - - -PYUUTAJR -******** - -This is a handheld unit with 12 'chiclet' buttons. The keyboard has E800, EA00, EC00, EE00 scanned, -although 2 of these rows have no keys. TUTOR carts will run, however since most of them ask for -A=AMA, P=PRO, these keys don't exist, and so the games cannot be played. - -*********************************************************************************************************/ - -#include "emu.h" - -#include "cpu/tms9900/tms9995.h" -#include "imagedev/cassette.h" -#include "sound/sn76496.h" -#include "video/tms9928a.h" - -#include "bus/centronics/ctronics.h" -#include "bus/generic/carts.h" -#include "bus/generic/slot.h" - -#include "softlist.h" -#include "speaker.h" - - -class tutor_state : public driver_device -{ -public: - tutor_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_cart(*this, "cartslot"), - m_cass(*this, "cassette"), - m_centronics(*this, "centronics"), - m_cent_data_out(*this, "cent_data_out"), - m_bank1(*this, "bank1"), - m_bank2(*this, "bank2"), - m_bank1_switching(0) - { - } - - void pyuutajr(machine_config &config); - void tutor(machine_config &config); - -private: - required_device<tms9995_device> m_maincpu; - required_device<generic_slot_device> m_cart; - optional_device<cassette_image_device> m_cass; - optional_device<centronics_device> m_centronics; - optional_device<output_latch_device> m_cent_data_out; - required_memory_bank m_bank1; - required_memory_bank m_bank2; - memory_region *m_cart_rom; - - int m_bank1_switching; - DECLARE_READ8_MEMBER(key_r); - DECLARE_READ8_MEMBER(tutor_mapper_r); - DECLARE_WRITE8_MEMBER(tutor_mapper_w); - DECLARE_READ8_MEMBER(tutor_cassette_r); - DECLARE_WRITE8_MEMBER(tutor_cassette_w); - DECLARE_READ8_MEMBER(tutor_printer_r); - DECLARE_WRITE8_MEMBER(tutor_printer_w); - - DECLARE_READ8_MEMBER(tutor_highmem_r); - int m_tape_interrupt_enable; - emu_timer *m_tape_interrupt_timer; - virtual void machine_start() override; - virtual void machine_reset() override; - TIMER_CALLBACK_MEMBER(tape_interrupt_handler); - - int m_centronics_busy; - DECLARE_WRITE_LINE_MEMBER(write_centronics_busy); - void pyuutajr_mem(address_map &map); - void tutor_io(address_map &map); - void tutor_memmap(address_map &map); -}; - - -void tutor_state::machine_start() -{ - std::string region_tag; - m_cart_rom = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str()); - - m_tape_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tutor_state::tape_interrupt_handler),this)); - - m_bank1->configure_entry(0, memregion("maincpu")->base() + 0x4000); - m_bank1->set_entry(0); - m_bank2->configure_entry(0, memregion("maincpu")->base() + 0x8000); - m_bank2->set_entry(0); - - if (m_cart_rom) - { - if (m_cart_rom->bytes() > 0x4000) - { - m_bank1_switching = 1; - m_bank1->configure_entry(1, m_cart_rom->base()); - m_bank1->set_entry(1); - m_bank2->configure_entry(1, m_cart_rom->base() + 0x4000); - m_bank2->set_entry(1); - } - else - { - m_bank2->configure_entry(1, m_cart_rom->base()); - m_bank2->set_entry(1); - } - } -} - -void tutor_state::machine_reset() -{ - m_tape_interrupt_enable = 0; - m_centronics_busy = 0; - - // Disable auto wait states; with enabled wait states, cassette loading fails - m_maincpu->ready_line(ASSERT_LINE); - m_maincpu->reset_line(ASSERT_LINE); - m_maincpu->hold_line(CLEAR_LINE); -} - -/* - Keyboard: - - Keyboard ports are located at CRU logical address >ec00->ec7e (CRU physical - address >7600->763f). There is one bit per key (bit >00 for keycode >00, - bit >01 for keycode >01, etc.), each bit is set to one when the key is - down. - - Joystick: - - Joystick ports seem to overlap keyboard ports, i.e. some CRU bits are - mapped to both a keyboard key and a joystick switch. -*/ - -READ8_MEMBER( tutor_state::key_r ) -{ - char port[12]; - uint8_t value; - - snprintf(port, ARRAY_LENGTH(port), "LINE%d", (offset & 0x007e) >> 3); - value = ioport(port)->read(); - - /* hack for ports overlapping with joystick */ - if (offset >= 32 && offset < 48) - { - snprintf(port, ARRAY_LENGTH(port), "LINE%d_alt", (offset & 0x007e) >> 3); - value |= ioport(port)->read(); - } - - return BIT(value, offset & 7); -} - - -/* - Cartridge mapping: - - Cartridges share the >8000 address base with BASIC. A write to @>e10c - disables the BASIC ROM and enable the cartridge. A write to @>e108 - disables the cartridge and enables the BASIC ROM. - - In order to be recognized by the system ROM, a cartridge should start with - >55, >66 or >aa. This may may correspond to three different ROM header - versions (I am not sure). - - Cartridge may also define a boot ROM at base >0000 (see below). -*/ - -READ8_MEMBER( tutor_state::tutor_mapper_r ) -{ - int reply; - - switch (offset) - { - case 0x10: - /* return 0x42 if we have a cartridge with an alternate boot ROM */ - reply = 0; - break; - - default: - logerror("unknown port in %s %d\n", __FILE__, __LINE__); - reply = 0; - break; - } - - return reply; -} - -WRITE8_MEMBER( tutor_state::tutor_mapper_w ) -{ - switch (offset) - { - case 0x00: - /* disable system ROM, enable alternate boot ROM in cartridge */ - break; - - case 0x08: - /* disable cartridge ROM, enable BASIC ROM at base >8000 */ - m_bank1->set_entry(0); - m_bank2->set_entry(0); - break; - - case 0x0c: - /* enable cartridge ROM, disable BASIC ROM at base >8000 */ - if (m_cart_rom) - { - if (m_bank1_switching) - m_bank1->set_entry(1); - m_bank2->set_entry(1); - } - break; - - default: - if (!(offset & 1)) - logerror("unknown port in %s %d\n", __FILE__, __LINE__); - break; - } -} - -/* - This is only called from the debugger; the on-chip memory is handled - within the CPU itself. -*/ -READ8_MEMBER( tutor_state::tutor_highmem_r ) -{ - if (m_maincpu->is_onchip(offset | 0xf000)) return m_maincpu->debug_read_onchip_memory(offset&0xff); - return 0; -} - -/* - Cassette interface: - - The cassette interface uses several ports in the >e000 range. - - Writing to *CPU* address @>ee00 will set the tape output to 0. Writing to - *CPU* address @>ee20 will set the tape output to 1. - - Tape input level can be read from *CRU* logical address >ed00 (CRU physical - address >7680). - - Writing to @>ee40 enables tape interrupts; writing to @>ee60 disables tape - interrupts. Tape interrupts are level-4 interrupt that occur when the tape - input level is high(?). - - There are other output ports: @>ee80, @>eea0, @>eec0 & @>eee0. I don't - know their exact meaning. -*/ - -TIMER_CALLBACK_MEMBER(tutor_state::tape_interrupt_handler) -{ - //assert(m_tape_interrupt_enable); - m_maincpu->set_input_line(INT_9995_INT4, (m_cass->input() > 0.0) ? ASSERT_LINE : CLEAR_LINE); -} - -/* CRU handler */ -READ8_MEMBER( tutor_state::tutor_cassette_r ) -{ - return (m_cass->input() > 0.0) ? 1 : 0; -} - -/* memory handler */ -WRITE8_MEMBER( tutor_state::tutor_cassette_w ) -{ - if (offset & /*0x1f*/0x1e) - logerror("unknown port in %s %d\n", __FILE__, __LINE__); - - if ((offset & 0x1f) == 0) - { - data = BIT(offset, 5); - - switch ((offset >> 6) & 3) - { - case 0: - /* data out */ - m_cass->output((data) ? +1.0 : -1.0); - break; - case 1: - /* interrupt control??? */ - //logerror("ignoring write of %d to cassette port 1\n", data); - if (m_tape_interrupt_enable != data) - { - m_tape_interrupt_enable = data; - if (!m_tape_interrupt_enable) - m_tape_interrupt_timer->adjust(/*attotime::from_hz(44100)*/attotime::zero, 0, attotime::from_hz(44100)); - else - { - m_tape_interrupt_timer->adjust(attotime::never); - m_maincpu->set_input_line(INT_9995_INT4, CLEAR_LINE); - } - } - break; - case 2: - /* ??? */ - logerror("ignoring write of %d to cassette port 2\n", data); - break; - case 3: - /* ??? */ - logerror("ignoring write of %d to cassette port 3\n", data); - break; - } - } -} - -WRITE_LINE_MEMBER( tutor_state::write_centronics_busy ) -{ - m_centronics_busy = state; -} - -/* memory handlers */ -READ8_MEMBER( tutor_state::tutor_printer_r ) -{ - int reply; - - switch (offset) - { - case 0x20: - /* busy */ - reply = m_centronics_busy ? 0x00 : 0xff; - break; - - default: - if (! (offset & 1)) - logerror("unknown port in %s %d\n", __FILE__, __LINE__); - reply = 0; - break; - } - - return reply; -} - -WRITE8_MEMBER( tutor_state::tutor_printer_w ) -{ - switch (offset) - { - case 0x10: - /* data */ - m_cent_data_out->write(data); - break; - - case 0x40: - /* strobe */ - m_centronics->write_strobe(BIT(data, 7)); - break; - - default: - if (! (offset & 1)) - logerror("unknown port in %s %d\n", __FILE__, __LINE__); - break; - } -} - -/* - Memory map summary: - - @>0000-@>7fff: system ROM (can be paged out, see above). - @>8000-@>bfff: basic ROM (can be paged out, see above). - @>c000-@>dfff: free for future expansion? Used by 24kb cartridges? - - @>e000(r/w): VDP data - @>e002(r/w): VDP register - - @>e100(w): enable cart and disable system ROM at base >0000??? (the system will only link to such a ROM if @>e110 is >42???) - @>e108(w): disable cart and enable BASIC ROM at base >8000? - @>e10c(w): enable cart and disable BASIC ROM at base >8000? - @>e110(r): cartridges should return >42 if they have a ROM at base >0000 and they want the Tutor to boot from this ROM (with a blwp@>0000)??? - - @>e200(w): sound write - - @>e600(r): handshake in from whatever device??? - @>e610(w): ??? - @>e620(w): ??? - @>e680(w): handshake out to this device??? - - @>e810(w): parallel port data bus - @>e820(r): parallel port busy input - @>e840(w): parallel port strobe output - - @>ee00-@>eee0(w): tape interface (see above) - - @>f000-@>f0fb: tms9995 internal RAM 1 - @>fffa-@>fffb: tms9995 internal decrementer - @>f000-@>f0fb: tms9995 internal RAM 2 -*/ - -#ifdef UNUSED_FUNCTION -WRITE8_MEMBER( tutor_state::test_w ) -{ - switch (offset) - { - default: - logerror("unmapped write %d %d\n", offset, data); - break; - } -} -#endif - -void tutor_state::tutor_memmap(address_map &map) -{ - map(0x0000, 0x3fff).rom(); - map(0x4000, 0x7fff).bankr("bank1").nopw(); - map(0x8000, 0xbfff).bankr("bank2").nopw(); - map(0xc000, 0xdfff).noprw(); /*free for expansion, or cartridge ROM?*/ - - map(0xe000, 0xe000).rw("tms9928a", FUNC(tms9928a_device::vram_read), FUNC(tms9928a_device::vram_write)); /*VDP data*/ - map(0xe002, 0xe002).rw("tms9928a", FUNC(tms9928a_device::register_read), FUNC(tms9928a_device::register_write));/*VDP status*/ - map(0xe100, 0xe1ff).rw(FUNC(tutor_state::tutor_mapper_r), FUNC(tutor_state::tutor_mapper_w)); /*cartridge mapper*/ - map(0xe200, 0xe200).w("sn76489a", FUNC(sn76489a_device::write)); /*sound chip*/ - map(0xe800, 0xe8ff).rw(FUNC(tutor_state::tutor_printer_r), FUNC(tutor_state::tutor_printer_w)); /*printer*/ - map(0xee00, 0xeeff).nopr().w(FUNC(tutor_state::tutor_cassette_w)); /*cassette interface*/ - - map(0xf000, 0xffff).r(FUNC(tutor_state::tutor_highmem_r)).nopw(); /*free for expansion (and internal processor RAM)*/ -} - -void tutor_state::pyuutajr_mem(address_map &map) -{ - map(0x0000, 0x3fff).rom(); - map(0x4000, 0x7fff).bankr("bank1").nopw(); - map(0x8000, 0xbfff).bankr("bank2").nopw(); - map(0xc000, 0xdfff).noprw(); /*free for expansion, or cartridge ROM?*/ - - map(0xe000, 0xe000).rw("tms9928a", FUNC(tms9928a_device::vram_read), FUNC(tms9928a_device::vram_write)); /*VDP data*/ - map(0xe002, 0xe002).rw("tms9928a", FUNC(tms9928a_device::register_read), FUNC(tms9928a_device::register_write));/*VDP status*/ - map(0xe100, 0xe1ff).rw(FUNC(tutor_state::tutor_mapper_r), FUNC(tutor_state::tutor_mapper_w)); /*cartridge mapper*/ - map(0xe200, 0xe200).w("sn76489a", FUNC(sn76489a_device::write)); /*sound chip*/ - map(0xe800, 0xe800).portr("LINE0"); - map(0xea00, 0xea00).portr("LINE1"); - map(0xec00, 0xec00).portr("LINE2"); - map(0xee00, 0xee00).portr("LINE3"); - - map(0xf000, 0xffff).r(FUNC(tutor_state::tutor_highmem_r)).nopw(); /*free for expansion (and internal processor RAM)*/ -} - -/* - CRU map summary: - - >1ee0->1efe: tms9995 flag register - >1fda: tms9995 MID flag - - >ec00->ec7e(r): keyboard interface - >ed00(r): tape input -*/ - -void tutor_state::tutor_io(address_map &map) -{ - map(0xec00, 0xec7f).r(FUNC(tutor_state::key_r)); /*keyboard interface*/ - map(0xed00, 0xed01).r(FUNC(tutor_state::tutor_cassette_r)); /*cassette interface*/ -} - -/* tutor keyboard: 56 keys - -2008-05 FP: -Small note about natural keyboard support: currently, -- "MON" is mapped to 'F1' -- "MOD" is mapped to 'F2' -- A, S, D, F, G, R seem to have problems in natural mode -*/ - -static INPUT_PORTS_START(tutor) - PORT_START("LINE0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - - PORT_START("LINE1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - - PORT_START("LINE2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - - PORT_START("LINE3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - - PORT_START("LINE4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('=') - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("- b") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') - - PORT_START("LINE4_alt") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(1) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_PLAYER(1) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_PLAYER(1) PORT_CODE(KEYCODE_2_PAD) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT) PORT_PLAYER(1) PORT_CODE(KEYCODE_4_PAD) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP) PORT_PLAYER(1) PORT_CODE(KEYCODE_8_PAD) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1) PORT_CODE(KEYCODE_6_PAD) - - PORT_START("LINE5") - /* Unused? */ - PORT_BIT(0x03, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("o ^") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('^') - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('_') PORT_CHAR('@') - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('[') PORT_CHAR('{') - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') // this one is 4th line, 4th key after 'M' - - PORT_START("LINE5_alt") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(2) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_PLAYER(2) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_PLAYER(2) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT) PORT_PLAYER(2) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP) PORT_PLAYER(2) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2) - - PORT_START("LINE6") - /* Unused? */ - PORT_BIT(0x21, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) - /* only one shift key located on the left, but we support both for emulation to be friendlier */ - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Mon") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RT") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) - - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Mod") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - - PORT_START("LINE7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Up") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) - - /* Unused? */ - PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_UNUSED) -INPUT_PORTS_END - -// Unit only has 12 buttons. LINE0 & 3 are scanned with the others, but have nothing connected? -static INPUT_PORTS_START(pyuutajr) - PORT_START("LINE0") - PORT_BIT(0xff, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_START("LINE1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("PALLET") PORT_CODE(KEYCODE_P) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("MODE") PORT_CODE(KEYCODE_M) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("MONITOR") PORT_CODE(KEYCODE_Q) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) - - PORT_START("LINE2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_COMMA) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_STOP) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) - - PORT_START("LINE3") - PORT_BIT(0xff, IP_ACTIVE_HIGH, IPT_UNUSED) -INPUT_PORTS_END - -void tutor_state::tutor(machine_config &config) -{ - // basic machine hardware - // TMS9995 CPU @ 10.7 MHz - // No lines connected yet - TMS9995(config, m_maincpu, XTAL(10'738'635)); - m_maincpu->set_addrmap(AS_PROGRAM, &tutor_state::tutor_memmap); - m_maincpu->set_addrmap(AS_IO, &tutor_state::tutor_io); - - // video hardware - tms9928a_device &vdp(TMS9928A(config, "tms9928a", XTAL(10'738'635))); - vdp.set_screen("screen"); - vdp.set_vram_size(0x4000); - SCREEN(config, "screen", SCREEN_TYPE_RASTER); - - // Sound - SPEAKER(config, "sound_out").front_center(); - SN76489A(config, "sn76489a", 3579545).add_route(ALL_OUTPUTS, "sound_out", 0.75); - - CENTRONICS(config, m_centronics, centronics_devices, "printer").busy_handler().set(FUNC(tutor_state::write_centronics_busy)); - - OUTPUT_LATCH(config, m_cent_data_out); - m_centronics->set_output_latch(*m_cent_data_out); - - // Cassette - SPEAKER(config, "cass_out").front_center(); - CASSETTE(config, "cassette", 0).add_route(ALL_OUTPUTS, "cass_out", 0.25); - - // Cartridge slot - GENERIC_CARTSLOT(config, "cartslot", generic_linear_slot, "tutor_cart", "bin"); - - // software lists - SOFTWARE_LIST(config, "cart_list").set_original("tutor"); - -} - -void tutor_state::pyuutajr(machine_config &config) -{ - tutor(config); - m_maincpu->set_addrmap(AS_PROGRAM, &tutor_state::pyuutajr_mem); - //config.device_remove("centronics"); - //config.device_remove("cassette"); -} - -/* - ROM loading -*/ - -ROM_START(tutor) - ROM_REGION(0x10000, "maincpu", 0) - ROM_LOAD("tutor1.bin", 0x0000, 0x8000, CRC(702c38ba) SHA1(ce60607c3038895e31915d41bb5cf71cb8522d7a)) /* system ROM */ - ROM_LOAD("tutor2.bin", 0x8000, 0x4000, CRC(05f228f5) SHA1(46a14a45f6f9e2c30663a2b87ce60c42768a78d0)) /* BASIC ROM */ -ROM_END - - -ROM_START(pyuuta) - ROM_REGION(0x10000, "maincpu", 0) - ROM_LOAD("tomy29.7", 0x0000, 0x8000, CRC(7553bb6a) SHA1(fa41c45cb6d3daf7435f2a82f77dfa286003255e)) /* system ROM */ -ROM_END - -ROM_START(pyuutajr) - ROM_REGION(0x10000, "maincpu", 0) - ROM_LOAD( "ipl.rom", 0x0000, 0x4000, CRC(2ca37e62) SHA1(eebdc5c37d3b532edd5e5ca65eb785269ebd1ac0)) /* system ROM */ -ROM_END - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1983?, tutor, 0, 0, tutor, tutor, tutor_state, empty_init, "Tomy", "Tomy Tutor" , 0) -COMP( 1982, pyuuta, tutor, 0, tutor, tutor, tutor_state, empty_init, "Tomy", "Tomy Pyuuta" , 0) -COMP( 1983, pyuutajr, tutor, 0, pyuutajr, pyuutajr, tutor_state, empty_init, "Tomy", "Tomy Pyuuta Jr.", 0) |