(MESS) bigbord2 : upgraded fdc to modern

This commit is contained in:
Robbbert 2013-12-31 11:37:57 +00:00
parent f50043953f
commit 7e2b4fb0d3

View File

@ -43,7 +43,7 @@ it just vanishes instead.
What works:
Turn it on, wait for cursor to appear in the top corner. Press Enter.
Now you can enter commands. D, M, X are working.
Now you can enter commands.
Memory banking:
@ -60,6 +60,21 @@ ToDo:
- Connect up the SASI, Centronics and other interfaces on ports D8-DB.
- Connect up the programming port C0-C3.
- Connect up the numerous board jumpers.
- Need software
Monitor commands:
B - boot from disk
C - copy memory
D - dump memory
F - fill memory
G - go
I - in port
M - modify memory
O - out port
R - read a sector
T - test memory
V - compare blocks of memory
X - change banks
****************************************************************************/
@ -68,15 +83,13 @@ ToDo:
#include "emu.h"
#include "cpu/z80/z80.h"
#include "cpu/z80/z80daisy.h"
#include "formats/basicdsk.h"
#include "imagedev/flopdrv.h"
#include "machine/z80ctc.h"
#include "machine/z80dart.h"
#include "machine/z80dma.h"
#include "machine/wd17xx.h"
#include "video/mc6845.h"
#include "machine/keyboard.h"
#include "sound/beep.h"
#include "machine/wd_fdc.h"
#define SCREEN_TAG "screen"
#define Z80_TAG "u39"
@ -89,25 +102,18 @@ class bigbord2_state : public driver_device
{
public:
bigbord2_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, Z80_TAG),
m_6845(*this, "crtc"),
m_ctca(*this, Z80CTCA_TAG),
m_ctcb(*this, Z80CTCA_TAG),
m_dma(*this, Z80DMA_TAG),
m_fdc(*this, "fdc"),
m_floppy0(*this, FLOPPY_0),
m_floppy1(*this, FLOPPY_1),
m_floppy2(*this, FLOPPY_2),
m_floppy3(*this, FLOPPY_3),
m_beeper(*this, "beeper")
: driver_device(mconfig, type, tag)
, m_maincpu(*this, Z80_TAG)
, m_6845(*this, "crtc")
, m_ctca(*this, Z80CTCA_TAG)
, m_ctcb(*this, Z80CTCA_TAG)
, m_dma(*this, Z80DMA_TAG)
, m_fdc(*this, "fdc")
, m_floppy0(*this, "fdc:0")
, m_floppy1(*this, "fdc:1")
, m_beeper(*this, "beeper")
{ }
virtual void machine_start();
virtual void machine_reset();
virtual void video_start();
DECLARE_WRITE8_MEMBER(portc8_w );
DECLARE_WRITE8_MEMBER(portcc_w );
DECLARE_READ8_MEMBER(portc4_r);
@ -116,43 +122,38 @@ public:
DECLARE_WRITE_LINE_MEMBER(intrq_w);
DECLARE_WRITE_LINE_MEMBER(drq_w);
DECLARE_WRITE_LINE_MEMBER(frame);
void set_floppy_parameters(size_t length);
/* keyboard state */
UINT8 m_term_data;
UINT8 m_term_status;
/* video state */
DECLARE_DRIVER_INIT(bigbord2);
TIMER_DEVICE_CALLBACK_MEMBER(ctc_tick);
DECLARE_READ8_MEMBER(memory_read_byte);
DECLARE_WRITE8_MEMBER(memory_write_byte);
DECLARE_READ8_MEMBER(io_read_byte);
DECLARE_WRITE8_MEMBER(io_write_byte);
UINT8 *m_p_chargen; /* character ROM */
UINT8 *m_p_videoram; /* Video RAM */
UINT8 *m_p_attribram; /* Attribute RAM */
/* floppy state */
private:
UINT8 m_term_data;
UINT8 m_term_status;
bool m_fdc_irq; /* interrupt request */
bool m_fdc_drq; /* data request */
bool m_8n5; /* 5.25" / 8" drive select */
bool m_dsdd; /* double sided disk detect */
int m_c8[8];
floppy_image_device *m_floppy;
virtual void machine_start();
virtual void machine_reset();
virtual void video_start();
void fdc_intrq_w(bool state);
void fdc_drq_w(bool state);
address_space *m_mem;
address_space *m_io;
required_device<cpu_device> m_maincpu;
required_device<mc6845_device> m_6845;
required_device<z80ctc_device> m_ctca;
required_device<z80ctc_device> m_ctcb;
required_device<z80dma_device> m_dma;
required_device<fd1793_device> m_fdc;
required_device<legacy_floppy_image_device> m_floppy0;
required_device<legacy_floppy_image_device> m_floppy1;
required_device<legacy_floppy_image_device> m_floppy2;
required_device<legacy_floppy_image_device> m_floppy3;
required_device<mb8877_t> m_fdc;
required_device<floppy_connector> m_floppy0;
required_device<floppy_connector> m_floppy1;
required_device<beep_device> m_beeper;
DECLARE_DRIVER_INIT(bigbord2);
TIMER_DEVICE_CALLBACK_MEMBER(ctc_tick);
DECLARE_WRITE_LINE_MEMBER(bigbord2_interrupt);
DECLARE_READ8_MEMBER(memory_read_byte);
DECLARE_WRITE8_MEMBER(memory_write_byte);
DECLARE_READ8_MEMBER(io_read_byte);
DECLARE_WRITE8_MEMBER(io_write_byte);
};
/* Status port
@ -183,24 +184,22 @@ READ8_MEMBER( bigbord2_state::portd0_r )
WRITE8_MEMBER( bigbord2_state::bigbord2_kbd_put )
{
address_space &mem = m_maincpu->space(AS_PROGRAM);
if (data)
{
m_term_data = data;
m_term_status = 8;
m_ctca->trg0(0);
m_ctca->trg0(1);
if (mem.read_byte(0xf13d) == 0x4d)
if (m_mem->read_byte(0xf13d) == 0x4d)
{
// simulate interrupt by saving current pc on
// the stack and jumping to interrupt handler.
UINT16 spreg = m_maincpu->state_int(Z80_SP);
UINT16 pcreg = m_maincpu->state_int(Z80_PC);
spreg--;
mem.write_byte(spreg, pcreg >> 8);
m_mem->write_byte(spreg, pcreg >> 8);
spreg--;
mem.write_byte(spreg, pcreg);
m_mem->write_byte(spreg, pcreg);
m_maincpu->set_state_int(Z80_SP, spreg);
m_maincpu->set_state_int(Z80_PC, 0xF120);
}
@ -219,26 +218,22 @@ static ASCII_KEYBOARD_INTERFACE( keyboard_intf )
READ8_MEMBER(bigbord2_state::memory_read_byte)
{
address_space& prog_space = m_maincpu->space(AS_PROGRAM);
return prog_space.read_byte(offset);
return m_mem->read_byte(offset);
}
WRITE8_MEMBER(bigbord2_state::memory_write_byte)
{
address_space& prog_space = m_maincpu->space(AS_PROGRAM);
return prog_space.write_byte(offset, data);
m_mem->write_byte(offset, data);
}
READ8_MEMBER(bigbord2_state::io_read_byte)
{
address_space& prog_space = m_maincpu->space(AS_IO);
return prog_space.read_byte(offset);
return m_io->read_byte(offset);
}
WRITE8_MEMBER(bigbord2_state::io_write_byte)
{
address_space& prog_space = m_maincpu->space(AS_IO);
return prog_space.write_byte(offset, data);
m_io->write_byte(offset, data);
}
static Z80DMA_INTERFACE( dma_intf )
@ -290,7 +285,11 @@ WRITE8_MEMBER( bigbord2_state::portc8_w )
break;
case 1:
// side select
wd17xx_set_side(m_fdc, m_c8[1]);
if (m_floppy)
{
m_floppy->ss_w(m_c8[1]);
}
break;
case 2:
@ -299,17 +298,17 @@ WRITE8_MEMBER( bigbord2_state::portc8_w )
break;
case 4:
// density
wd17xx_dden_w(m_fdc, m_c8[4]);
m_fdc->dden_w(m_c8[4]);
break;
case 5:
// connects to HLD pin on floppy drive
break;
case 6:
// motor on
floppy_mon_w(m_floppy0, ~m_c8[6]);
floppy_mon_w(m_floppy1, ~m_c8[6]);
floppy_mon_w(m_floppy2, ~m_c8[6]);
floppy_mon_w(m_floppy3, ~m_c8[6]);
if (m_floppy)
{
m_floppy->mon_w(~m_c8[6]);
}
break;
case 7:
// beeper
@ -342,20 +341,13 @@ WRITE8_MEMBER( bigbord2_state::portcc_w )
*/
/* drive select */
bool dvsel0 = BIT(data, 7);
bool dvsel1 = BIT(data, 6);
bool dvsel2 = BIT(data, 5);
bool dvsel3 = BIT(data, 4);
m_floppy = NULL;
if BIT(data, 7) m_floppy = m_floppy0->get_device();
if BIT(data, 6) m_floppy = m_floppy1->get_device();
//if BIT(data, 5) m_floppy = m_floppy2->get_device();
//if BIT(data, 4) m_floppy = m_floppy3->get_device();
if (dvsel0) wd17xx_set_drive(m_fdc, 0);
if (dvsel1) wd17xx_set_drive(m_fdc, 1);
if (dvsel2) wd17xx_set_drive(m_fdc, 2);
if (dvsel3) wd17xx_set_drive(m_fdc, 3);
floppy_drive_set_ready_state(m_floppy0, dvsel0, 1);
floppy_drive_set_ready_state(m_floppy1, dvsel1, 1);
floppy_drive_set_ready_state(m_floppy2, dvsel2, 1);
floppy_drive_set_ready_state(m_floppy3, dvsel3, 1);
m_fdc->set_floppy(m_floppy);
bool dma_rdy = 0;
if ((data & 7) == 2)
@ -388,7 +380,7 @@ static ADDRESS_MAP_START( bigbord2_io, AS_IO, 8, bigbord2_state )
AM_RANGE(0xC8, 0xCB) AM_WRITE(portc8_w)
AM_RANGE(0xCC, 0xCF) AM_WRITE(portcc_w)
AM_RANGE(0xD0, 0xD3) AM_READ(portd0_r)
AM_RANGE(0xD4, 0xD7) AM_DEVREADWRITE_LEGACY("fdc", wd17xx_r, wd17xx_w)
AM_RANGE(0xD4, 0xD7) AM_DEVREADWRITE("fdc", mb8877_t, read, write)
//AM_RANGE(0xD8, 0xDB) AM_READWRITE(portd8_r, portd8_w) // various external data ports; DB = centronics printer
AM_RANGE(0xDC, 0xDC) AM_MIRROR(2) AM_DEVREADWRITE("crtc", mc6845_device, status_r, address_w)
AM_RANGE(0xDD, 0xDD) AM_MIRROR(2) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
@ -417,11 +409,6 @@ INPUT_PORTS_END
/* Z80 SIO */
WRITE_LINE_MEMBER(bigbord2_state::bigbord2_interrupt)
{
m_maincpu->set_input_line(0, state);
}
static Z80SIO_INTERFACE( sio_intf )
{
0, 0, 0, 0,
@ -438,7 +425,7 @@ static Z80SIO_INTERFACE( sio_intf )
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(bigbord2_state, bigbord2_interrupt),
DEVCB_CPU_INPUT_LINE(Z80_TAG, INPUT_LINE_IRQ0),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
@ -458,11 +445,10 @@ TIMER_DEVICE_CALLBACK_MEMBER(bigbord2_state::ctc_tick)
WRITE_LINE_MEMBER( bigbord2_state::frame )
{
address_space &space = m_maincpu->space(AS_PROGRAM);
static UINT8 framecnt;
framecnt++;
if ((space.read_byte(0xf13d) == 0x4d) & (framecnt > 3))
if ((m_mem->read_byte(0xf13d) == 0x4d) & (framecnt > 3))
{
framecnt = 0;
// simulate interrupt by saving current pc on
@ -470,9 +456,9 @@ WRITE_LINE_MEMBER( bigbord2_state::frame )
UINT16 spreg = m_maincpu->state_int(Z80_SP);
UINT16 pcreg = m_maincpu->state_int(Z80_PC);
spreg--;
space.write_byte(spreg, pcreg >> 8);
m_mem->write_byte(spreg, pcreg >> 8);
spreg--;
space.write_byte(spreg, pcreg);
m_mem->write_byte(spreg, pcreg);
m_maincpu->set_state_int(Z80_SP, spreg);
m_maincpu->set_state_int(Z80_PC, 0xF18E);
}
@ -513,24 +499,20 @@ static const z80_daisy_config bigbord2_daisy_chain[] =
/* WD1793 Interface */
WRITE_LINE_MEMBER( bigbord2_state::intrq_w )
static SLOT_INTERFACE_START( bigbord2_floppies )
SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
SLOT_INTERFACE_END
void bigbord2_state::fdc_intrq_w(bool state)
{
m_fdc_irq = state;
}
WRITE_LINE_MEMBER( bigbord2_state::drq_w )
void bigbord2_state::fdc_drq_w(bool state)
{
m_fdc_drq = state;
}
static const wd17xx_interface fdc_intf =
{
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(bigbord2_state, intrq_w),
DEVCB_DRIVER_LINE_MEMBER(bigbord2_state, drq_w),
{ FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3 }
};
/* Video */
@ -543,53 +525,14 @@ void bigbord2_state::video_start()
}
void bigbord2_state::set_floppy_parameters(size_t length)
{
switch (length)
{
case 77*1*26*128: // 250K 8" SSSD
m_8n5 = 1;
m_dsdd = 0;
break;
case 77*1*26*256: // 500K 8" SSDD
m_8n5 = 1;
m_dsdd = 0;
break;
case 40*1*18*128: // 90K 5.25" SSSD
m_8n5 = 0;
m_dsdd = 0;
break;
case 40*2*18*128: // 180K 5.25" DSSD
m_8n5 = 0;
m_dsdd = 1;
break;
}
}
static void bigbord2_load_proc(device_image_interface &image)
{
bigbord2_state *state = image.device().machine().driver_data<bigbord2_state>();
state->set_floppy_parameters(image.length());
}
/* Machine Initialization */
void bigbord2_state::machine_start()
{
// set floppy load procs
floppy_install_load_proc(m_floppy0, bigbord2_load_proc);
floppy_install_load_proc(m_floppy1, bigbord2_load_proc);
/* register for state saving */
save_item(NAME(m_term_data));
save_item(NAME(m_fdc_irq));
save_item(NAME(m_fdc_drq));
save_item(NAME(m_8n5));
save_item(NAME(m_dsdd));
}
void bigbord2_state::machine_reset()
@ -606,52 +549,16 @@ void bigbord2_state::machine_reset()
DRIVER_INIT_MEMBER(bigbord2_state,bigbord2)
{
m_mem = &m_maincpu->space(AS_PROGRAM);
m_io = &m_maincpu->space(AS_IO);
UINT8 *RAM = memregion(Z80_TAG)->base();
membank("bankr")->configure_entries(0, 2, &RAM[0x0000], 0x10000);
membank("bankv")->configure_entries(0, 2, &RAM[0x6000], 0x10000);
membank("banka")->configure_entries(0, 2, &RAM[0x7000], 0x10000);
m_fdc->setup_intrq_cb(mb8877_t::line_cb(FUNC(bigbord2_state::fdc_intrq_w), this));
m_fdc->setup_drq_cb(mb8877_t::line_cb(FUNC(bigbord2_state::fdc_drq_w), this));
}
static LEGACY_FLOPPY_OPTIONS_START( bigbord2 )
LEGACY_FLOPPY_OPTION( sssd8, "dsk", "8\" SSSD", basicdsk_identify_default, basicdsk_construct_default, NULL,
HEADS([1])
TRACKS([77])
SECTORS([26])
SECTOR_LENGTH([128])
FIRST_SECTOR_ID([1]))
LEGACY_FLOPPY_OPTION( ssdd8, "dsk", "8\" SSDD", basicdsk_identify_default, basicdsk_construct_default, NULL,
HEADS([1])
TRACKS([77])
SECTORS([26])
SECTOR_LENGTH([256])
FIRST_SECTOR_ID([1]))
LEGACY_FLOPPY_OPTION( sssd5, "dsk", "5.25\" SSSD", basicdsk_identify_default, basicdsk_construct_default, NULL,
HEADS([1])
TRACKS([40])
SECTORS([18])
SECTOR_LENGTH([128])
FIRST_SECTOR_ID([1]))
LEGACY_FLOPPY_OPTION( ssdd5, "dsk", "5.25\" SSDD", basicdsk_identify_default, basicdsk_construct_default, NULL,
HEADS([2])
TRACKS([40])
SECTORS([18])
SECTOR_LENGTH([128])
FIRST_SECTOR_ID([1]))
LEGACY_FLOPPY_OPTIONS_END
static const floppy_interface bigbord2_floppy_interface =
{
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
FLOPPY_STANDARD_5_25_DSDD,
LEGACY_FLOPPY_OPTIONS_NAME(bigbord2),
NULL,
NULL
};
/* Screen */
@ -713,7 +620,7 @@ static MC6845_INTERFACE( bigbord2_crtc )
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(bigbord2_state, frame), //DEVCB_DEVICE_LINE(Z80CTCA_TAG, z80ctc_device, trg3), // vsync
DEVCB_DRIVER_LINE_MEMBER(bigbord2_state, frame), // vsync
NULL
};
@ -745,8 +652,9 @@ static MACHINE_CONFIG_START( bigbord2, bigbord2_state )
MCFG_Z80SIO0_ADD(Z80SIO_TAG, MAIN_CLOCK, sio_intf)
MCFG_Z80CTC_ADD(Z80CTCA_TAG, MAIN_CLOCK, ctca_intf)
MCFG_Z80CTC_ADD(Z80CTCB_TAG, MAIN_CLOCK / 6, ctcb_intf)
MCFG_FD1793_ADD("fdc", fdc_intf)
MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(bigbord2_floppy_interface)
MCFG_MB8877x_ADD("fdc", XTAL_16MHz / 16)
MCFG_FLOPPY_DRIVE_ADD("fdc:0", bigbord2_floppies, "525dd", floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fdc:1", bigbord2_floppies, "525dd", floppy_image_device::default_floppy_formats)
MCFG_MC6845_ADD("crtc", MC6845, SCREEN_TAG, XTAL_16MHz / 8, bigbord2_crtc)
MCFG_ASCII_KEYBOARD_ADD(KEYBOARD_TAG, keyboard_intf)