mirror of
https://github.com/holub/mame
synced 2025-10-05 08:41:31 +03:00
DPS1: system boots up, working [Robbbert]
This commit is contained in:
parent
496fa2d50e
commit
d3607f91d1
@ -1,8 +1,20 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Miodrag Milanovic, Robbbert
|
||||
/****************************************************************************************************************
|
||||
|
||||
Ithaca Intersystems DPS-1
|
||||
|
||||
The last commercial release of a computer fitted with a front panel.
|
||||
|
||||
ToDo:
|
||||
- Need artwork of the front panel switches and LEDs, and port FF.
|
||||
- Replace terminal with s2651 UART and RS232.
|
||||
|
||||
***************************************************************************************************************/
|
||||
#include "emu.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/upd765.h"
|
||||
#include "machine/terminal.h"
|
||||
#include "softlist.h"
|
||||
|
||||
class dps1_state : public driver_device
|
||||
@ -10,33 +22,221 @@ class dps1_state : public driver_device
|
||||
public:
|
||||
dps1_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_fdc(*this, "fdc")
|
||||
, m_floppy0(*this, "fdc:0")
|
||||
//, m_floppy1(*this, "fdc:1")
|
||||
, m_terminal(*this, "terminal")
|
||||
{ }
|
||||
|
||||
DECLARE_READ8_MEMBER(port00_r);
|
||||
DECLARE_WRITE8_MEMBER(port00_w);
|
||||
DECLARE_WRITE8_MEMBER(portb2_w);
|
||||
DECLARE_WRITE8_MEMBER(portb4_w);
|
||||
DECLARE_WRITE8_MEMBER(portb6_w);
|
||||
DECLARE_WRITE8_MEMBER(portb8_w);
|
||||
DECLARE_WRITE8_MEMBER(portba_w);
|
||||
DECLARE_WRITE8_MEMBER(portbc_w);
|
||||
DECLARE_WRITE8_MEMBER(portbe_w);
|
||||
DECLARE_READ8_MEMBER(portff_r);
|
||||
DECLARE_WRITE8_MEMBER(portff_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
|
||||
DECLARE_DRIVER_INIT(dps1);
|
||||
DECLARE_MACHINE_RESET(dps1);
|
||||
DECLARE_WRITE8_MEMBER(kbd_put);
|
||||
|
||||
private:
|
||||
bool m_dma_dir;
|
||||
UINT16 m_dma_adr;
|
||||
UINT8 m_term_data;
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<upd765_family_device> m_fdc;
|
||||
required_device<floppy_connector> m_floppy0;
|
||||
//required_device<floppy_connector> m_floppy1;
|
||||
required_device<generic_terminal_device> m_terminal;
|
||||
};
|
||||
|
||||
static ADDRESS_MAP_START( dps1_mem, AS_PROGRAM, 8, dps1_state )
|
||||
AM_RANGE(0x0000, 0x03ff) AM_ROM AM_REGION("maincpu", 0)
|
||||
AM_RANGE(0x2000, 0x2fff) AM_RAM
|
||||
AM_RANGE(0x0000, 0x03ff) AM_READ_BANK("bankr0") AM_WRITE_BANK("bankw0")
|
||||
AM_RANGE(0x0400, 0xffff) AM_RAM
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( dps1_io, AS_IO, 8, dps1_state )
|
||||
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
||||
ADDRESS_MAP_UNMAP_HIGH
|
||||
AM_RANGE(0x00, 0x03) AM_READWRITE(port00_r,port00_w) // 2651 uart
|
||||
AM_RANGE(0xb0, 0xb1) AM_DEVICE("fdc", upd765_family_device, map)
|
||||
AM_RANGE(0xb2, 0xb3) AM_WRITE(portb2_w) // set dma fdc->memory
|
||||
AM_RANGE(0xb4, 0xb5) AM_WRITE(portb4_w) // set dma memory->fdc
|
||||
AM_RANGE(0xb6, 0xb7) AM_WRITE(portb6_w) // enable eprom
|
||||
AM_RANGE(0xb8, 0xb9) AM_WRITE(portb8_w) // set A16-23
|
||||
AM_RANGE(0xba, 0xbb) AM_WRITE(portba_w) // set A8-15
|
||||
AM_RANGE(0xbc, 0xbd) AM_WRITE(portbc_w) // set A0-7
|
||||
AM_RANGE(0xbe, 0xbf) AM_WRITE(portbe_w) // disable eprom
|
||||
AM_RANGE(0xff, 0xff) AM_READWRITE(portff_r, portff_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
// uart in
|
||||
READ8_MEMBER( dps1_state::port00_r )
|
||||
{
|
||||
UINT8 data = 0x4e;
|
||||
switch(offset)
|
||||
{
|
||||
case 0:
|
||||
data = m_term_data;
|
||||
m_term_data = 0;
|
||||
break;
|
||||
case 1:
|
||||
data = (m_term_data) ? 3 : 1;
|
||||
break;
|
||||
case 3:
|
||||
data = 0x27;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
// uart out
|
||||
WRITE8_MEMBER( dps1_state::port00_w )
|
||||
{
|
||||
if (offset == 0)
|
||||
m_terminal->write(space, 0, data);
|
||||
}
|
||||
|
||||
// read from disk, to memory
|
||||
WRITE8_MEMBER( dps1_state::portb2_w )
|
||||
{
|
||||
m_dma_dir = 1;
|
||||
}
|
||||
|
||||
// write to disk, from memory
|
||||
WRITE8_MEMBER( dps1_state::portb4_w )
|
||||
{
|
||||
m_dma_dir = 0;
|
||||
}
|
||||
|
||||
// enable eprom
|
||||
WRITE8_MEMBER( dps1_state::portb6_w )
|
||||
{
|
||||
membank("bankr0")->set_entry(1); // point at rom
|
||||
}
|
||||
|
||||
// set A16-23
|
||||
WRITE8_MEMBER( dps1_state::portb8_w )
|
||||
{
|
||||
}
|
||||
|
||||
// set A8-15
|
||||
WRITE8_MEMBER( dps1_state::portba_w )
|
||||
{
|
||||
m_dma_adr = (data << 8) | (m_dma_adr & 0xff);
|
||||
}
|
||||
|
||||
// set A0-7
|
||||
WRITE8_MEMBER( dps1_state::portbc_w )
|
||||
{
|
||||
m_dma_adr = (m_dma_adr & 0xff00) | data;
|
||||
}
|
||||
|
||||
// disable eprom
|
||||
WRITE8_MEMBER( dps1_state::portbe_w )
|
||||
{
|
||||
membank("bankr0")->set_entry(0); // point at ram
|
||||
}
|
||||
|
||||
// read 8 front-panel switches
|
||||
READ8_MEMBER( dps1_state::portff_r )
|
||||
{
|
||||
return 0x0e;
|
||||
}
|
||||
|
||||
// write to 8 leds
|
||||
WRITE8_MEMBER( dps1_state::portff_w )
|
||||
{
|
||||
}
|
||||
|
||||
// do dma
|
||||
WRITE_LINE_MEMBER( dps1_state::fdc_drq_w )
|
||||
{
|
||||
if (state)
|
||||
{
|
||||
// acknowledge drq by taking /dack low (unsupported)
|
||||
// then depending on direction, transfer a byte
|
||||
address_space& mem = m_maincpu->space(AS_PROGRAM);
|
||||
if (m_dma_dir)
|
||||
{ // disk to mem
|
||||
mem.write_byte(m_dma_adr, m_fdc->mdma_r(mem, 0));
|
||||
}
|
||||
else
|
||||
{ // mem to disk
|
||||
m_fdc->mdma_w(mem, 0, mem.read_byte(m_dma_adr));
|
||||
}
|
||||
m_dma_adr++;
|
||||
}
|
||||
// else take /dack high (unsupported)
|
||||
}
|
||||
|
||||
MACHINE_RESET_MEMBER( dps1_state, dps1 )
|
||||
{
|
||||
membank("bankr0")->set_entry(1); // point at rom
|
||||
membank("bankw0")->set_entry(0); // always write to ram
|
||||
// set fdc for 8 inch floppies
|
||||
m_fdc->set_rate(500000);
|
||||
// turn on the motor
|
||||
floppy_image_device *floppy = m_floppy0->get_device();
|
||||
m_fdc->set_floppy(floppy);
|
||||
floppy->mon_w(0);
|
||||
}
|
||||
|
||||
DRIVER_INIT_MEMBER( dps1_state, dps1 )
|
||||
{
|
||||
UINT8 *main = memregion("maincpu")->base();
|
||||
|
||||
membank("bankr0")->configure_entry(1, &main[0x0000]);
|
||||
membank("bankr0")->configure_entry(0, &main[0x0400]);
|
||||
membank("bankw0")->configure_entry(0, &main[0x0400]);
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START( dps1 )
|
||||
INPUT_PORTS_END
|
||||
|
||||
WRITE8_MEMBER( dps1_state::kbd_put )
|
||||
{
|
||||
m_term_data = data;
|
||||
}
|
||||
|
||||
static SLOT_INTERFACE_START( floppies )
|
||||
SLOT_INTERFACE( "floppy0", FLOPPY_8_DSDD )
|
||||
SLOT_INTERFACE_END
|
||||
|
||||
static MACHINE_CONFIG_START( dps1, dps1_state )
|
||||
// basic machine hardware
|
||||
MCFG_CPU_ADD("maincpu", Z80, 4000000)
|
||||
MCFG_CPU_PROGRAM_MAP(dps1_mem)
|
||||
MCFG_CPU_IO_MAP(dps1_io)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(dps1_state, dps1)
|
||||
|
||||
/* video hardware */
|
||||
MCFG_DEVICE_ADD("terminal", GENERIC_TERMINAL, 0)
|
||||
MCFG_GENERIC_TERMINAL_KEYBOARD_CB(WRITE8(dps1_state, kbd_put))
|
||||
|
||||
// floppy
|
||||
MCFG_UPD765A_ADD("fdc", false, true)
|
||||
//MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(dps1_state, fdc_int_w)) // doesn't appear to be used
|
||||
MCFG_UPD765_DRQ_CALLBACK(WRITELINE(dps1_state, fdc_drq_w))
|
||||
MCFG_FLOPPY_DRIVE_ADD("fdc:0", floppies, "floppy0", floppy_image_device::default_floppy_formats)
|
||||
MCFG_FLOPPY_DRIVE_SOUND(true)
|
||||
//MCFG_FLOPPY_DRIVE_ADD("fdc:1", floppies, "floppy1", floppy_image_device::default_floppy_formats)
|
||||
//MCFG_FLOPPY_DRIVE_SOUND(true)
|
||||
|
||||
// software lists
|
||||
MCFG_SOFTWARE_LIST_ADD("flop_list", "dps1")
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
ROM_START( dps1 )
|
||||
ROM_REGION( 0x400, "maincpu", 0 )
|
||||
ROM_REGION( 0x800, "maincpu", 0 )
|
||||
ROM_LOAD( "boot 1280", 0x000, 0x400, CRC(9c2e98fa) SHA1(78e6c9d00aa6e8f6c4d3c65984cfdf4e99434c66) ) // actually on the FDC-2 board
|
||||
ROM_END
|
||||
|
||||
COMP( 1979, dps1, 0, 0, dps1, dps1, driver_device, 0, "Ithaca InterSystems", "DPS-1", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW )
|
||||
COMP( 1979, dps1, 0, 0, dps1, dps1, dps1_state, dps1, "Ithaca InterSystems", "DPS-1", MACHINE_NO_SOUND_HW )
|
||||
|
Loading…
Reference in New Issue
Block a user