mirror of
https://github.com/holub/mame
synced 2025-04-22 08:22:15 +03:00
(MESS) New Not Working\n----------\nMonty Plays Scrabble\nMaster Monty
This commit is contained in:
parent
bedee83f26
commit
7cb6ab6e6a
183
src/mess/drivers/monty.c
Normal file
183
src/mess/drivers/monty.c
Normal file
@ -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<cpu_device> m_maincpu;
|
||||
required_device<sed1520_device> m_sed0; // TODO: This isn't actually a SED1520, it's a SED1503F
|
||||
//required_device<sed1520_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 )
|
Loading…
Reference in New Issue
Block a user