diff --git a/src/mess/drivers/monty.c b/src/mess/drivers/monty.c new file mode 100644 index 00000000000..a8d150691ff --- /dev/null +++ b/src/mess/drivers/monty.c @@ -0,0 +1,183 @@ +// license:BSD-3-Clause +// copyright-holders:Andrew Gardner +/*************************************************************************** + + 2015-05-08 Skeleton driver for Ritam Monty Plays Scrabble BRAND crossword game + + Scrabble computer that allows you play a game of Scrabble by yourself (or you + can play with up to 3 players). Has a built-in 12,000 vocabulary, expandable + to 44,000 by way of 2 expansion modules each containing 16,000 more obscure words. + You can use the included 'score cards' (which look like little Scrabble boards), + or you can use a real Scrabble board and tiles to play. Also note, Monty + apparently originally came with a little pen. + + This game was later upgraded by Ritam to Master Monty which had 24,000 words + built-in (expandable to a total of 56,000 with the same 2 expansion modules). + Two variations on Master Monty have been seen: one looks exactly the same as the + Monty but the electronics on the inside have been upgraded. The later version + is blue and says Master Monty at the top. Both of these versions are hand-upgraded + by adding chips and wires to the inside of the game. + + TODO: + - Everything - this is just a little better than a skeleton + + +****************************************************************************/ + +#include "emu.h" +#include "cpu/z80/z80.h" +#include "video/sed1520.h" + + +class monty_state : public driver_device +{ +public: + monty_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_sed0(*this, "sed1520_0") + { + for (int i = 0; i < 42*32; i++) + m_pixels[i] = 0xff000000; + } + + DECLARE_READ8_MEMBER(init_r); + + DECLARE_WRITE8_MEMBER(ioDisplayWrite); + DECLARE_WRITE8_MEMBER(ioCommandWrite0); + DECLARE_WRITE8_MEMBER(ioCommandWrite1); + + // screen updates + UINT32 lcd_update(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect); + +private: + required_device m_maincpu; + required_device m_sed0; // TODO: This isn't actually a SED1520, it's a SED1503F + //required_device m_sed0; // TODO: Also, there are 2 SED1503Fs on the board - one is flipped upside down + + // Test + UINT32 m_pixels[42*32]; +}; + + +static ADDRESS_MAP_START(monty_mem, AS_PROGRAM, 8, monty_state) + AM_RANGE(0x0000, 0x3fff) AM_ROM + //AM_RANGE(0x4000, 0x4000) // The main rom checks to see if another program is here on startup + AM_RANGE(0xf800, 0xffff) AM_RAM +ADDRESS_MAP_END + + +static ADDRESS_MAP_START(monty_io, AS_IO, 8, monty_state) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x00, 0x00) AM_WRITE(ioCommandWrite0) + // TODO: "unmapped io memory read from 0001 & FF" - almost certainly a watchdog or inputs - resets around pc=135f if some condition isn't met + AM_RANGE(0x02, 0x02) AM_WRITE(ioCommandWrite1) + AM_RANGE(0x80, 0xff) AM_WRITE(ioDisplayWrite) +ADDRESS_MAP_END + + +// Input ports +static INPUT_PORTS_START( monty ) +INPUT_PORTS_END + + +WRITE8_MEMBER( monty_state::ioCommandWrite0 ) +{ + // DEBUG // printf("Command Port 0 write : %02x\n", data); +} + + +WRITE8_MEMBER( monty_state::ioCommandWrite1 ) +{ + // DEBUG // printf("Command Port 1 write : %02x\n", data); +} + + +WRITE8_MEMBER( monty_state::ioDisplayWrite ) +{ + // Offset directly corresponds to sed1503, DD RAM address + // Offset 0x7f may be special? + // DEBUG // printf("%02x %02x\n", offset, data); + + const UINT8 lower = (offset & 0x40) >> 6; + const UINT8 seg = offset & 0x3f; + const UINT8 com = data; + + // Skip the controller and write straight to the LCD (pc=134f) + for (int i = 0; i < 8; i++) + { + const size_t x = seg; + const size_t y = i + (lower*8); + + const bool on = (com >> i) & 0x01; + + if (on) + m_pixels[(y*42) + x] = 0xffffffff; + else + m_pixels[(y*42) + x] = 0x00000000; + } + +} + +UINT32 monty_state::lcd_update(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect) +{ + // Just toss random garbage into the LCD display for now + for (int y = 0; y < 32; y++) + { + for (int x = 0; x < 42; x++) + { + bitmap.pix32(y, x) = m_pixels[(y*42) + x]; + } + } + + return 0x00; +} + + +SED1520_UPDATE_CB(monty_screen_update) +{ + // TODO: Not really a SED1520 - there are two SED1503s + return 0x00; +} + + +// TODO: Additional machine definition - Master Monty has a different memory layout +static MACHINE_CONFIG_START( monty, monty_state ) + // Basic machine hardware + MCFG_CPU_ADD("maincpu", Z80, 1000000) + MCFG_CPU_PROGRAM_MAP(monty_mem) + MCFG_CPU_IO_MAP(monty_io) + + // Video hardware + MCFG_SCREEN_ADD("screen", LCD) + MCFG_SCREEN_REFRESH_RATE(50) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // Not accurate + MCFG_SCREEN_SIZE(42, 32) // Two SED1503s (42x16 pixels) control the top and bottom halves + MCFG_SCREEN_VISIBLE_AREA(0, 42-1, 0, 32-1) + MCFG_SCREEN_UPDATE_DRIVER(monty_state, lcd_update) + + // LCD controller interfaces + MCFG_SED1520_ADD("sed1520_0", monty_screen_update) +MACHINE_CONFIG_END + + +// ROM definitions +ROM_START( monty ) + ROM_REGION(0xc000, "maincpu", 0) + ROM_LOAD( "monty_main.bin", 0x0000, 0x4000, CRC(720b4f55) SHA1(0106eb88d3fbbf25a745b9b6ee785ba13689d095) ) // 27128 + ROM_LOAD( "monty_module1.bin", 0x4000, 0x4000, CRC(2725d8c3) SHA1(8273b9779c0915f9c7c43ea4fb460f43ce036358) ) // 27128 + ROM_LOAD( "monty_module2.bin", 0x8000, 0x4000, CRC(db672e47) SHA1(bb14fe86df06cfa4b19625ba417d1a5bc8eae155) ) // 27128 +ROM_END + +ROM_START( mmonty ) + ROM_REGION(0x10000, "maincpu", 0) + ROM_LOAD( "master_monty_main.bin", 0x0000, 0x8000, CRC(bb5ef4d4) SHA1(ba2c759e429f8740df419f9abb60832eddfba8ab) ) // 27C256 + ROM_LOAD( "monty_module1.bin", 0x8000, 0x4000, CRC(2725d8c3) SHA1(8273b9779c0915f9c7c43ea4fb460f43ce036358) ) // 27128 + ROM_LOAD( "monty_module2.bin", 0xc000, 0x4000, CRC(db672e47) SHA1(bb14fe86df06cfa4b19625ba417d1a5bc8eae155) ) // 27128 +ROM_END + + +// Drivers +// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS +COMP( 1980, monty, 0, 0, monty, monty, driver_device, 0, "Ritam", "Monty Plays Scrabble", GAME_IS_SKELETON ) +COMP( 1980, mmonty, 0, 0, monty, monty, driver_device, 0, "Ritam", "Master Monty", GAME_IS_SKELETON )