summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/drivers/dm7000.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/drivers/dm7000.c')
-rw-r--r--src/mess/drivers/dm7000.c367
1 files changed, 367 insertions, 0 deletions
diff --git a/src/mess/drivers/dm7000.c b/src/mess/drivers/dm7000.c
new file mode 100644
index 00000000000..aedfa579009
--- /dev/null
+++ b/src/mess/drivers/dm7000.c
@@ -0,0 +1,367 @@
+/***************************************************************************
+
+ Dream Multimedia Dreambox 7000/5620/500
+
+ 20/03/2010 Skeleton driver.
+
+
+ DM7000 - CPU STB04500 at 252 MHz
+ RAM 64MB
+ Flash 8MB
+ 1 x DVB-S
+ 1 x IDE interface
+ 1 x Common Interface (CI)
+ 1 x Compact flash
+ 2 x Smart card reader
+ 1 x USB
+ 1 x RS232
+ 1 x LAN 100Mbit/s
+ 1 x LCD display
+
+ DM56x0 - CPU STB04500 at 252 MHz
+ RAM 64MB
+ Flash 8MB
+ 1 x DVB-S
+ 2 x Common Interface (CI)
+ 1 x Smart card reader
+ 1 x LAN 100Mbit/s (just on 5620)
+ 1 x LCD display
+
+ DM500 - CPU STBx25xx at 252 MHz
+ RAM 96MB
+ Flash 32MB
+ 1 x DVB-S
+ 1 x Smart card reader
+ 1 x LAN 100Mbit/s
+
+****************************************************************************/
+
+#include "emu.h"
+#include "includes/dm7000.h"
+
+#define VERBOSE_LEVEL ( 9 )
+
+INLINE void ATTR_PRINTF(3,4) verboselog( running_machine &machine, int n_level, const char *s_fmt, ...)
+{
+ if (VERBOSE_LEVEL >= n_level)
+ {
+ va_list v;
+ char buf[32768];
+ va_start( v, s_fmt);
+ vsprintf( buf, s_fmt, v);
+ va_end( v);
+ logerror( "%s: %s", machine.describe_context( ), buf);
+ }
+}
+
+READ8_MEMBER( dm7000_state::dm7000_iic0_r )
+{
+ UINT8 data = 0; // dummy
+ verboselog( machine(), 9, "(IIC0) %08X -> %08X\n", 0x40030000 + offset, data);
+ return data;
+}
+
+WRITE8_MEMBER( dm7000_state::dm7000_iic0_w )
+{
+ verboselog( machine(), 9, "(IIC0) %08X <- %08X\n", 0x40030000 + offset, data);
+}
+
+READ8_MEMBER( dm7000_state::dm7000_iic1_r )
+{
+ UINT8 data = 0; // dummy
+ verboselog( machine(), 9, "(IIC1) %08X -> %08X\n", 0x400b0000 + offset, data);
+ return data;
+}
+
+WRITE8_MEMBER( dm7000_state::dm7000_iic1_w )
+{
+ verboselog( machine(), 9, "(IIC1) %08X <- %08X\n", 0x400b0000 + offset, data);
+}
+
+READ8_MEMBER( dm7000_state::dm7000_scc0_r )
+{
+ UINT8 data = 0;
+ switch(offset) {
+ case UART_THR:
+ data = m_term_data;
+ if(m_term_data == 0xd) {
+ m_term_data = 0xa;
+ } else {
+ m_term_data = 0;
+ m_scc0_lsr = 0;
+ }
+ break;
+ case UART_LSR:
+ data = UART_LSR_THRE | UART_LSR_TEMT | m_scc0_lsr;
+ break;
+ }
+ verboselog( machine(), 9, "(SCC0) %08X -> %08X\n", 0x40040000 + offset, data);
+ return data;
+}
+
+WRITE8_MEMBER( dm7000_state::dm7000_scc0_w )
+{
+ switch(offset) {
+ case UART_THR:
+ if(!(m_scc0_lcr & UART_LCR_DLAB)) {
+ m_terminal->write(space, 0, data);
+ m_scc0_lsr = 1;
+ }
+ break;
+ case UART_LCR:
+ m_scc0_lcr = data;
+ break;
+ }
+ verboselog( machine(), 9, "(SCC0) %08X <- %08X\n", 0x40040000 + offset, data);
+}
+
+READ8_MEMBER( dm7000_state::dm7000_gpio0_r )
+{
+ UINT8 data = 0; // dummy
+ verboselog( machine(), 9, "(GPIO0) %08X -> %08X\n", 0x40060000 + offset, data);
+ return data;
+}
+
+WRITE8_MEMBER( dm7000_state::dm7000_gpio0_w )
+{
+ verboselog( machine(), 9, "(GPIO0) %08X <- %08X\n", 0x40060000 + offset, data);
+}
+
+READ8_MEMBER( dm7000_state::dm7000_scp0_r )
+{
+ UINT8 data = 0; // dummy
+ switch(offset) {
+ case SCP_STATUS:
+ data = SCP_STATUS_RXRDY;
+ break;
+ }
+ verboselog( machine(), 9, "(SCP0) %08X -> %08X\n", 0x400c0000 + offset, data);
+ return data;
+}
+
+WRITE8_MEMBER( dm7000_state::dm7000_scp0_w )
+{
+ verboselog( machine(), 9, "(SCP0) %08X <- %08X\n", 0x400c0000 + offset, data);
+ switch(offset) {
+ case SCP_TXDATA:
+ //printf("%02X ", data);
+ break;
+ }
+}
+
+READ16_MEMBER( dm7000_state::dm7000_enet_r )
+{
+ UINT16 data;
+ switch (offset) {
+ case 0x01:
+ data = 0x1801;
+ break;
+ case 0x05:
+ data = 0x3330;
+ break;
+ case 0x07:
+ data = 0x3300;
+ break;
+ default:
+ data = m_enet_regs[offset];
+ break;
+ }
+ verboselog( machine(), 9, "(ENET) %08X -> %08X\n", 0x72000600 + (offset), data);
+ return data;
+}
+
+WRITE16_MEMBER( dm7000_state::dm7000_enet_w )
+{
+ verboselog( machine(), 9, "(ENET) %08X <- %08X\n", 0x72000600 + (offset), data);
+ COMBINE_DATA(&m_enet_regs[offset]);
+}
+
+/*
+ Memory map for the IBM "Redwood-4" STB03xxx evaluation board.
+
+ The STB03xxx internal i/o addresses don't work for us 1:1,
+ so we need to map them at a well know virtual address.
+
+ 4000 000x uart1
+ 4001 00xx ppu
+ 4002 00xx smart card
+ 4003 000x iic
+ 4004 000x uart0
+ 4005 0xxx timer
+ 4006 00xx gpio
+ 4007 00xx smart card
+ 400b 000x iic
+ 400c 000x scp
+ 400d 000x modem
+
+ STBx25xx
+
+ 4000 000x Serial1 Controller
+ 4001 000x Serial2 Controller
+ 4002 00xx Smart Card Interface 0
+ 4003 000x IIC Interface 0
+ 4004 000x Serial0 Controller
+ 4005 0xxx General Purpose Timers
+ 4006 00xx General Purpose Input / Output
+ 4007 00xx Smart Card Interface 1
+ 400c 000x Serial Controller Port
+ 400d 00xx Synchronous Serial Port
+
+ STB04xxx
+
+ 4000 00xx Serial1/Infrared Controller
+ 4001 00xx Universal Serial Bus
+ 4002 00xx Smart Card Interface 0
+ 4003 000x IIC Interface 0
+ 4004 000x Serial0/Uart750 Controller
+ 4005 0xxx General Purpose Timers
+ 4006 00xx General Purpose Input / Output
+ 4007 00xx Smart Card Interface 1
+ 400b 000x IIC Interface 1
+ 400c 000x Serial Controller Port
+ 400d 00xx Synchronous Serial Port
+ 400e 000x Serial2/UART750 Controller
+ 400f 0xxx IDE Controller
+
+*/
+static ADDRESS_MAP_START( dm7000_mem, AS_PROGRAM, 32, dm7000_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x00000000, 0x01ffffff) AM_RAM // RAM page 0 - 32MB
+ AM_RANGE(0x20000000, 0x21ffffff) AM_RAM // RAM page 1 - 32MB
+
+ AM_RANGE(0x40030000, 0x4003000f) AM_READWRITE8(dm7000_iic0_r, dm7000_iic0_w, 0xffffffff)
+ AM_RANGE(0x40040000, 0x40040007) AM_READWRITE8(dm7000_scc0_r, dm7000_scc0_w, 0xffffffff)
+ AM_RANGE(0x40060000, 0x40060047) AM_READWRITE8(dm7000_gpio0_r, dm7000_gpio0_w, 0xffffffff)
+ AM_RANGE(0x400b0000, 0x400b000f) AM_READWRITE8(dm7000_iic1_r, dm7000_iic1_w, 0xffffffff)
+ AM_RANGE(0x400c0000, 0x400c0007) AM_READWRITE8(dm7000_scp0_r, dm7000_scp0_w, 0xffffffff)
+
+ /* ENET - ASIX AX88796 */
+ AM_RANGE(0x72000300, 0x720003ff) AM_READWRITE16(dm7000_enet_r, dm7000_enet_w, 0xffffffff)
+
+ AM_RANGE(0x7f800000, 0x7ffdffff) AM_ROM AM_REGION("user2",0)
+ AM_RANGE(0x7ffe0000, 0x7fffffff) AM_ROM AM_REGION("user1",0)
+ //AM_RANGE(0xfffe0000, 0xffffffff) AM_ROM AM_REGION("user1",0)
+ADDRESS_MAP_END
+
+/* Input ports */
+static INPUT_PORTS_START( dm7000 )
+INPUT_PORTS_END
+
+
+static MACHINE_RESET(dm7000)
+{
+ dm7000_state *state = machine.driver_data<dm7000_state>();
+
+ state->dcr[DCRSTB045_CICVCR] = 0x00000001;
+ state->dcr[DCRSTB045_SCCR] = 0x00420080 /* default for serial divs */ | 0x3f /* undocumented?? used to print clocks */;
+ state->dcr[DCRSTB045_VIDEO_CNTL] = 0x00009000;
+ state->dcr[DCRSTB045_DISP_MODE] = 0x00880000;
+ state->dcr[DCRSTB045_FRAME_BUFR_BASE] = 0x0f000000;
+ state->m_scc0_lsr = UART_LSR_THRE | UART_LSR_TEMT;
+}
+
+static VIDEO_START( dm7000 )
+{
+}
+
+static SCREEN_UPDATE_IND16( dm7000 )
+{
+ return 0;
+}
+
+static READ32_DEVICE_HANDLER( dcr_r )
+{
+ dm7000_state *state = device->machine().driver_data<dm7000_state>();
+ mame_printf_debug("DCR %03X read\n", offset);
+ if(offset>=1024) {printf("get %04X\n", offset); return 0;} else
+ switch(offset) {
+ case DCRSTB045_CMD_STAT:
+ return 0; // assume that video dev is always ready
+ default:
+ return state->dcr[offset];
+ }
+
+}
+
+static WRITE32_DEVICE_HANDLER( dcr_w )
+{
+ mame_printf_debug("DCR %03X write = %08X\n", offset, data);
+ dm7000_state *state = device->machine().driver_data<dm7000_state>();
+ if(offset>=1024) {printf("get %04X\n", offset); } else
+ state->dcr[offset] = data;
+}
+
+WRITE8_MEMBER( dm7000_state::kbd_put )
+{
+ //printf("%02X\n", data);
+ m_term_data = data;
+ m_scc0_lsr = 1;
+}
+
+static GENERIC_TERMINAL_INTERFACE( terminal_intf )
+{
+ DEVCB_DRIVER_MEMBER(dm7000_state, kbd_put)
+};
+
+static const powerpc_config ppc405_config =
+{
+ 252000000,
+ dcr_r,
+ dcr_w
+};
+
+static MACHINE_CONFIG_START( dm7000, dm7000_state )
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu",PPC405GP, 252000000 / 10) // Should be PPC405D4?
+ // Slowed down 10 times in order to get normal response for now
+ MCFG_CPU_CONFIG(ppc405_config)
+ MCFG_CPU_PROGRAM_MAP(dm7000_mem)
+
+ MCFG_MACHINE_RESET(dm7000)
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
+ MCFG_SCREEN_SIZE(640, 480)
+ MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
+ MCFG_SCREEN_UPDATE_STATIC(dm7000)
+
+ MCFG_PALETTE_LENGTH(2)
+ MCFG_PALETTE_INIT(black_and_white)
+
+ MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf)
+
+ MCFG_VIDEO_START(dm7000)
+MACHINE_CONFIG_END
+
+/* ROM definition */
+ROM_START( dm7000 )
+ ROM_REGION( 0x20000, "user1", ROMREGION_32BIT | ROMREGION_BE )
+ ROMX_LOAD( "dm7000.bin", 0x0000, 0x20000, CRC(8a410f67) SHA1(9d6c9e4f5b05b28453d3558e69a207f05c766f54), ROM_GROUPWORD )
+ ROM_REGION( 0x800000, "user2", ROMREGION_32BIT | ROMREGION_BE | ROMREGION_ERASEFF )
+ ROM_LOAD( "rel108_dm7000.img", 0x0000, 0x5e0000, CRC(e78b6407) SHA1(aaa786d341c629eec92fcf04bfafc1de43f6dabf))
+ROM_END
+
+ROM_START( dm5620 )
+ ROM_REGION( 0x20000, "user1", ROMREGION_32BIT | ROMREGION_BE )
+ ROMX_LOAD( "dm5620.bin", 0x0000, 0x20000, CRC(ccddb822) SHA1(3ecf553ced0671599438368f59d8d30df4d13ade), ROM_GROUPWORD )
+ ROM_REGION( 0x800000, "user2", ROMREGION_32BIT | ROMREGION_BE | ROMREGION_ERASEFF )
+ ROM_LOAD( "rel106_dm5620.img", 0x0000, 0x57b000, CRC(2313d71d) SHA1(0d3d99ab3b3266624f237b7b67e045d7910c44a5))
+ROM_END
+
+ROM_START( dm500 )
+ ROM_REGION( 0x20000, "user1", ROMREGION_32BIT | ROMREGION_BE )
+ ROM_SYSTEM_BIOS( 0, "alps", "Alps" )
+ ROMX_LOAD( "dm500-alps-boot.bin", 0x0000, 0x20000, CRC(daf2da34) SHA1(68f3734b4589fcb3e73372e258040bc8b83fd739), ROM_GROUPWORD | ROM_REVERSE | ROM_BIOS(1))
+ ROM_SYSTEM_BIOS( 1, "phil", "Philips" )
+ ROMX_LOAD( "dm500-philps-boot.bin", 0x0000, 0x20000, CRC(af3477c7) SHA1(9ac918f6984e6927f55bea68d6daaf008787136e), ROM_GROUPWORD | ROM_REVERSE | ROM_BIOS(2))
+ ROM_REGION( 0x800000, "user2", ROMREGION_32BIT | ROMREGION_BE | ROMREGION_ERASEFF )
+ ROM_LOAD( "rel108_dm500.img", 0x0000, 0x5aa000, CRC(44be2376) SHA1(1f360572998b1bc4dc10c5210a2aed573a75e2fa))
+ROM_END
+/* Driver */
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
+SYST( 2003, dm7000, 0, 0, dm7000, dm7000, driver_device, 0, "Dream Multimedia", "Dreambox 7000", GAME_NOT_WORKING | GAME_NO_SOUND)
+SYST( 2004, dm5620, dm7000, 0, dm7000, dm7000, driver_device, 0, "Dream Multimedia", "Dreambox 5620", GAME_NOT_WORKING | GAME_NO_SOUND)
+SYST( 2006, dm500, dm7000, 0, dm7000, dm7000, driver_device, 0, "Dream Multimedia", "Dreambox 500", GAME_NOT_WORKING | GAME_NO_SOUND)