(MESS) ngen: updated notes, added FDC and a floppy drive

This commit is contained in:
mahlemiut 2014-12-08 13:41:12 +13:00
parent 4323f56268
commit 91e3597e7d

View File

@ -10,6 +10,12 @@
level 4 - "interrupt detector" - keyboard, printer, RTC
level 7 - floppy/hard disk
DMA channels:
channel 0 - communications (RS-232)
channel 1 - X-Bus expansion modules (except disk and graphics)
channel 2 - graphics?
channel 3 - hard disk
To get to "menu mode", press Space quickly after reset (might need good timing)
The bootstrap ROM version number is displayed, along with "B,D,L,M,P,T:"
You can press one of these keys for the following tests:
@ -60,6 +66,7 @@
#include "machine/pic8259.h"
#include "machine/pit8253.h"
#include "machine/z80dart.h"
#include "machine/wd_fdc.h"
#include "bus/rs232/rs232.h"
#include "machine/ngen_kb.h"
#include "machine/clock.h"
@ -77,7 +84,9 @@ public:
m_pic(*this,"pic"),
m_pit(*this,"pit"),
m_vram(*this,"vram"),
m_fontram(*this,"fontram")
m_fontram(*this,"fontram"),
m_fdc(*this,"fdc"),
m_fd0(*this,"fdc:0")
{}
DECLARE_WRITE_LINE_MEMBER(pit_out0_w);
@ -108,6 +117,8 @@ public:
DECLARE_WRITE8_MEMBER( dma_1_dack_w ){ }
DECLARE_WRITE8_MEMBER( dma_2_dack_w ){ }
DECLARE_WRITE8_MEMBER( dma_3_dack_w ){ }
DECLARE_WRITE_LINE_MEMBER(fdc_irq_w);
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
protected:
virtual void machine_reset();
@ -122,6 +133,8 @@ private:
required_device<pit8254_device> m_pit;
optional_shared_ptr<UINT16> m_vram;
optional_shared_ptr<UINT16> m_fontram;
optional_device<wd2797_t> m_fdc;
optional_device<floppy_connector> m_fd0;
void set_dma_channel(int channel, int state);
@ -355,22 +368,36 @@ READ16_MEMBER(ngen_state::peripheral_r)
return ret;
}
// A sequencial number is written to this port, and keeps on going until an NMI is triggered.
// Maybe this is a RAM test of some kind, and this would be a bank switch register?
// Even though the system supports 1MB at the most, which would fit in the CPU's whole address space...
// X-bus module select
// The bootstrap ROM creates a table at 0:FC9h, with a count, followed by the module IDs of each
// expansion module. The base I/O address for each module is 0x100*module number.
// Module 0 is the main processor module, module 1 is the next module attached, and so on.
WRITE16_MEMBER(ngen_state::port00_w)
{
m_port00 = data;
if(data > 0)
m_maincpu->set_input_line(INPUT_LINE_NMI,PULSE_LINE);
logerror("SYS: Port 0 write %04x\n",data);
logerror("SYS: X-Bus module select %04x\n",data);
}
// returns X-bus module ID (what is the low byte for?)
READ16_MEMBER(ngen_state::port00_r)
{
return m_port00;
if(m_port00 > 0)
m_maincpu->set_input_line(INPUT_LINE_NMI,PULSE_LINE);
if(m_port00 == 0)
return 0x4000; // module ID of 0x40 = dual floppy disk module (need hardware manual to find other module IDs)
else
return 0x0080; // invalid device?
}
WRITE_LINE_MEMBER(ngen_state::fdc_irq_w)
{
m_pic->ir7_w(state);
}
WRITE_LINE_MEMBER(ngen_state::fdc_drq_w)
{
// TODO
}
WRITE_LINE_MEMBER( ngen_state::dma_hrq_changed )
{
@ -456,11 +483,14 @@ static ADDRESS_MAP_START( ngen_mem, AS_PROGRAM, 16, ngen_state )
AM_RANGE(0x00000, 0xf7fff) AM_RAM
AM_RANGE(0xf8000, 0xf9fff) AM_RAM AM_SHARE("vram")
AM_RANGE(0xfa000, 0xfbfff) AM_RAM AM_SHARE("fontram")
AM_RANGE(0xfc000, 0xfcfff) AM_ROM AM_REGION("disk",0)
AM_RANGE(0xfe000, 0xfffff) AM_ROM AM_REGION("bios",0)
ADDRESS_MAP_END
static ADDRESS_MAP_START( ngen_io, AS_IO, 16, ngen_state )
AM_RANGE(0x0000, 0x0001) AM_READWRITE(port00_r,port00_w)
AM_RANGE(0x0100, 0x0107) AM_DEVREADWRITE8("fdc",wd2797_t,read,write,0x00ff) // a guess for now
// port 0x0108 is used also, maybe for motor control/side select?
ADDRESS_MAP_END
static ADDRESS_MAP_START( ngen386_mem, AS_PROGRAM, 32, ngen_state )
@ -486,6 +516,10 @@ static SLOT_INTERFACE_START(keyboard)
SLOT_INTERFACE("ngen", NGEN_KEYBOARD)
SLOT_INTERFACE_END
static SLOT_INTERFACE_START( ngen_floppies )
SLOT_INTERFACE( "525hd", FLOPPY_525_HD )
SLOT_INTERFACE_END
static MACHINE_CONFIG_START( ngen, ngen_state )
// basic machine hardware
MCFG_CPU_ADD("maincpu", I80186, XTAL_16MHz / 2)
@ -543,6 +577,7 @@ static MACHINE_CONFIG_START( ngen, ngen_state )
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("iouart", upd7201_device, dcdb_w))
MCFG_RS232_RI_HANDLER(DEVWRITELINE("iouart", upd7201_device, rib_w))
// TODO: SCN2652 MPCC, used for RS-422 cluster communications?
// video board
MCFG_SCREEN_ADD("screen", RASTER)
@ -567,6 +602,15 @@ static MACHINE_CONFIG_START( ngen, ngen_state )
MCFG_DEVICE_ADD("refresh_clock", CLOCK, 19200*16) // should be 19530Hz
MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(ngen_state,timer_clk_out))
// floppy disk / hard disk module (WD2797 FDC, WD1010 HDC, plus an 8253 timer for each)
MCFG_WD2797x_ADD("fdc", XTAL_20MHz / 10)
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(ngen_state,fdc_irq_w))
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(ngen_state,fdc_drq_w))
MCFG_DEVICE_ADD("fdc_timer", PIT8253, 0)
// TODO: WD1010 HDC (not implemented)
MCFG_DEVICE_ADD("hdc_timer", PIT8253, 0)
MCFG_FLOPPY_DRIVE_ADD("fdc:0", ngen_floppies, "525hd", floppy_image_device::default_floppy_formats)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( ngen386, ngen )
@ -584,6 +628,12 @@ ROM_START( ngen )
ROM_REGION( 0x2000, "bios", 0)
ROM_LOAD16_BYTE( "72-00414_80186_cpu.bin", 0x000000, 0x001000, CRC(e1387a03) SHA1(ddca4eba67fbf8b731a8009c14f6b40edcbc3279) ) // bootstrap ROM v8.4
ROM_LOAD16_BYTE( "72-00415_80186_cpu.bin", 0x000001, 0x001000, CRC(a6dde7d9) SHA1(b4d15c1bce31460ab5b92ff43a68c15ac5485816) )
ROM_REGION( 0x1000, "disk", 0)
ROM_LOAD( "72-00422_10mb_disk.bin", 0x000000, 0x001000, CRC(f5b046b6) SHA1(b303c6f6aa40504016de9826879bc316e44389aa) )
ROM_REGION( 0x20, "disk_prom", 0)
ROM_LOAD( "72-00422_10mb_disk_15d.bin", 0x000000, 0x000020, CRC(121ee494) SHA1(9a8d3c336cc7378a71f9d48c99f88515eb236fbf) )
ROM_END
// not sure just how similar these systems are to the 80186 model, but are here at the moment to document the dumps