apricot: use correct wd fdc type and fix floppy motor on, implement

graphics mode, simulate sio irq m1 access. successfully boots from disk
now.
This commit is contained in:
Dirk Best 2015-06-07 17:03:00 +02:00
parent 995350c3f7
commit 18db93e799

View File

@ -54,10 +54,41 @@ public:
m_data_selector_rts(1), m_data_selector_rts(1),
m_video_mode(0), m_video_mode(0),
m_display_on(1), m_display_on(1),
m_display_enabled(0) m_display_enabled(0),
m_centronics_fault(1),
m_centronics_perror(1),
m_sio_irq(0)
{ } { }
required_device<cpu_device> m_cpu; DECLARE_FLOPPY_FORMATS(floppy_formats);
DECLARE_WRITE8_MEMBER(i8089_ca1_w);
DECLARE_WRITE8_MEMBER(i8089_ca2_w);
DECLARE_WRITE8_MEMBER(i8255_portb_w);
DECLARE_READ8_MEMBER(i8255_portc_r);
DECLARE_WRITE8_MEMBER(i8255_portc_w);
DECLARE_WRITE_LINE_MEMBER(timer_out1);
DECLARE_WRITE_LINE_MEMBER(timer_out2);
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
DECLARE_WRITE_LINE_MEMBER(sio_int_w);
IRQ_CALLBACK_MEMBER(irq_callback);
DECLARE_WRITE_LINE_MEMBER(write_centronics_fault);
DECLARE_WRITE_LINE_MEMBER(write_centronics_perror);
DECLARE_WRITE_LINE_MEMBER(apricot_mc6845_de) { m_display_enabled = state; };
DECLARE_WRITE_LINE_MEMBER(data_selector_dtr_w) { m_data_selector_dtr = state; };
DECLARE_WRITE_LINE_MEMBER(data_selector_rts_w) { m_data_selector_rts = state; };
MC6845_UPDATE_ROW(crtc_update_row);
UINT32 screen_update_apricot(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
protected:
virtual void machine_start();
private:
required_device<i8086_cpu_device> m_cpu;
required_device<ram_device> m_ram; required_device<ram_device> m_ram;
required_device<i8089_device> m_iop; required_device<i8089_device> m_iop;
required_device<sn76489_device> m_sn; required_device<sn76489_device> m_sn;
@ -68,33 +99,12 @@ public:
required_device<z80sio0_device> m_sio; required_device<z80sio0_device> m_sio;
required_device<rs232_port_device> m_rs232; required_device<rs232_port_device> m_rs232;
required_device<centronics_device> m_centronics; required_device<centronics_device> m_centronics;
required_device<wd2793_t> m_fdc; required_device<wd2797_t> m_fdc;
required_device<floppy_connector> m_floppy0; required_device<floppy_connector> m_floppy0;
required_device<floppy_connector> m_floppy1; required_device<floppy_connector> m_floppy1;
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
required_shared_ptr<UINT16> m_screen_buffer; required_shared_ptr<UINT16> m_screen_buffer;
DECLARE_WRITE8_MEMBER( i8089_ca1_w );
DECLARE_WRITE8_MEMBER( i8089_ca2_w );
DECLARE_WRITE8_MEMBER( i8255_portb_w );
DECLARE_READ8_MEMBER( i8255_portc_r );
DECLARE_WRITE8_MEMBER( i8255_portc_w );
DECLARE_WRITE_LINE_MEMBER( timer_out1 );
DECLARE_WRITE_LINE_MEMBER( timer_out2 );
DECLARE_WRITE_LINE_MEMBER( wd2793_intrq_w );
DECLARE_WRITE_LINE_MEMBER( write_centronics_fault );
DECLARE_WRITE_LINE_MEMBER( write_centronics_perror );
DECLARE_WRITE_LINE_MEMBER( apricot_mc6845_de ) { m_display_enabled = state; };
DECLARE_WRITE_LINE_MEMBER( data_selector_dtr_w ) { m_data_selector_dtr = state; };
DECLARE_WRITE_LINE_MEMBER( data_selector_rts_w ) { m_data_selector_rts = state; };
MC6845_UPDATE_ROW( crtc_update_row );
virtual void machine_start();
int m_data_selector_dtr; int m_data_selector_dtr;
int m_data_selector_rts; int m_data_selector_rts;
@ -103,10 +113,10 @@ public:
int m_display_enabled; int m_display_enabled;
UINT32 screen_update_apricot(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
int m_centronics_fault; int m_centronics_fault;
int m_centronics_perror; int m_centronics_perror;
int m_sio_irq;
}; };
@ -154,15 +164,29 @@ READ8_MEMBER( apricot_state::i8255_portc_r )
WRITE8_MEMBER( apricot_state::i8255_portb_w ) WRITE8_MEMBER( apricot_state::i8255_portb_w )
{ {
// bit 0, crt reset
// bit 1, not connected
m_display_on = BIT(data, 3); m_display_on = BIT(data, 3);
m_video_mode = BIT(data, 4); m_video_mode = BIT(data, 4);
floppy_image_device *floppy = NULL;
// bit 5, enable disk select
// bit 6, disk select
if (!BIT(data, 5)) if (!BIT(data, 5))
m_fdc->set_floppy(BIT(data, 6) ? m_floppy1->get_device() : m_floppy0->get_device()); floppy = BIT(data, 6) ? m_floppy1->get_device() : m_floppy0->get_device();
m_fdc->set_floppy(floppy);
// bit 2, head load (motor on is wired to be active once a disk has been inserted)
// we just let the motor run all the time for now
if (floppy)
floppy->mon_w(0);
// switch video modes // switch video modes
m_crtc->set_clock( m_video_mode ? XTAL_15MHz / 10 : XTAL_15MHz / 16); m_crtc->set_clock(m_video_mode ? XTAL_15MHz / 10 : XTAL_15MHz / 16);
m_crtc->set_hpixels_per_column( m_video_mode ? 10 : 16); m_crtc->set_hpixels_per_column(m_video_mode ? 10 : 16);
// PB7 Centronics transceiver direction. 0 = output, 1 = input // PB7 Centronics transceiver direction. 0 = output, 1 = input
} }
@ -195,19 +219,30 @@ WRITE_LINE_MEMBER( apricot_state::timer_out2 )
} }
} }
WRITE_LINE_MEMBER( apricot_state::sio_int_w )
{
m_sio_irq = state;
m_pic->ir5_w(state);
}
//************************************************************************** //**************************************************************************
// FLOPPY // FLOPPY
//************************************************************************** //**************************************************************************
WRITE_LINE_MEMBER( apricot_state::wd2793_intrq_w ) WRITE_LINE_MEMBER( apricot_state::fdc_intrq_w )
{ {
m_pic->ir4_w(state); m_pic->ir4_w(state);
m_iop->ext1_w(state); m_iop->ext1_w(state);
} }
FLOPPY_FORMATS_MEMBER( apricot_state::floppy_formats )
FLOPPY_APRIDISK_FORMAT
FLOPPY_FORMATS_END
static SLOT_INTERFACE_START( apricot_floppies ) static SLOT_INTERFACE_START( apricot_floppies )
SLOT_INTERFACE( "d31v", SONY_OA_D31V ) SLOT_INTERFACE("d31v", SONY_OA_D31V)
SLOT_INTERFACE( "d32w", SONY_OA_D32W ) SLOT_INTERFACE("d32w", SONY_OA_D32W)
SLOT_INTERFACE_END SLOT_INTERFACE_END
@ -229,34 +264,35 @@ MC6845_UPDATE_ROW( apricot_state::crtc_update_row )
{ {
UINT8 *ram = m_ram->pointer(); UINT8 *ram = m_ram->pointer();
const pen_t *pen = m_palette->pens(); const pen_t *pen = m_palette->pens();
int i, x;
if (m_video_mode) for (int i = 0; i < x_count; i++)
{ {
// text mode UINT16 code = m_screen_buffer[(ma + i) & 0x7ff];
for (i = 0; i < x_count; i++) UINT16 offset = ((code & 0x7ff) << 5) | (ra << 1);
UINT16 data = ram[offset + 1] << 8 | ram[offset];
if (m_video_mode)
{ {
UINT16 code = m_screen_buffer[(ma + i) & 0x7ff];
UINT16 offset = ((code & 0x7ff) << 5) | (ra << 1);
UINT16 data = ram[offset + 1] << 8 | ram[offset];
int fill = 0; int fill = 0;
if (i == cursor_x) fill = 1; // cursor?
if (BIT(code, 12) && BIT(data, 14)) fill = 1; // strike-through? if (BIT(code, 12) && BIT(data, 14)) fill = 1; // strike-through?
if (BIT(code, 13) && BIT(data, 15)) fill = 1; // underline? if (BIT(code, 13) && BIT(data, 15)) fill = 1; // underline?
// draw 10 pixels of the character // draw 10 pixels of the character
for (x = 0; x <= 10; x++) for (int x = 0; x <= 10; x++)
{ {
int color = fill ? 1 : BIT(data, x); int color = fill ? 1 : BIT(data, x);
if (BIT(code, 15)) color = !color; // reverse? if (BIT(code, 15)) color = !color; // reverse?
bitmap.pix32(y, x + i*10) = pen[color ? 1 + BIT(code, 14) : 0]; bitmap.pix32(y, x + i*10) = pen[color ? 1 + BIT(code, 14) : 0];
} }
} }
} else
else {
{ // draw 16 pixels of the cell
// graphics mode for (int x = 0; x <= 16; x++)
fatalerror("Graphics mode not implemented!\n"); bitmap.pix32(y, x + i*16) = pen[BIT(data, x)];
}
} }
} }
@ -269,10 +305,15 @@ void apricot_state::machine_start()
// install shared memory to the main cpu and the iop // install shared memory to the main cpu and the iop
m_cpu->space(AS_PROGRAM).install_ram(0x00000, m_ram->size() - 1, m_ram->pointer()); m_cpu->space(AS_PROGRAM).install_ram(0x00000, m_ram->size() - 1, m_ram->pointer());
m_iop->space(AS_PROGRAM).install_ram(0x00000, m_ram->size() - 1, m_ram->pointer()); m_iop->space(AS_PROGRAM).install_ram(0x00000, m_ram->size() - 1, m_ram->pointer());
}
// motor on is connected to gnd IRQ_CALLBACK_MEMBER( apricot_state::irq_callback )
m_floppy0->get_device()->mon_w(0); {
m_floppy1->get_device()->mon_w(0); // i86 lock is connected to the sio m1 input, simulate this
if (m_sio_irq)
m_sio->m1_r();
return m_pic->acknowledge();
} }
@ -289,7 +330,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( apricot_io, AS_IO, 16, apricot_state ) static ADDRESS_MAP_START( apricot_io, AS_IO, 16, apricot_state )
AM_RANGE(0x00, 0x03) AM_DEVREADWRITE8("ic31", pic8259_device, read, write, 0x00ff) AM_RANGE(0x00, 0x03) AM_DEVREADWRITE8("ic31", pic8259_device, read, write, 0x00ff)
AM_RANGE(0x40, 0x47) AM_DEVREADWRITE8("ic68", wd2793_t, read, write, 0x00ff) AM_RANGE(0x40, 0x47) AM_DEVREADWRITE8("ic68", wd2797_t, read, write, 0x00ff)
AM_RANGE(0x48, 0x4f) AM_DEVREADWRITE8("ic17", i8255_device, read, write, 0x00ff) AM_RANGE(0x48, 0x4f) AM_DEVREADWRITE8("ic17", i8255_device, read, write, 0x00ff)
AM_RANGE(0x50, 0x51) AM_MIRROR(0x06) AM_DEVWRITE8("ic7", sn76489_device, write, 0x00ff) AM_RANGE(0x50, 0x51) AM_MIRROR(0x06) AM_DEVWRITE8("ic7", sn76489_device, write, 0x00ff)
AM_RANGE(0x58, 0x5f) AM_DEVREADWRITE8("ic16", pit8253_device, read, write, 0x00ff) AM_RANGE(0x58, 0x5f) AM_DEVREADWRITE8("ic16", pit8253_device, read, write, 0x00ff)
@ -311,7 +352,7 @@ static MACHINE_CONFIG_START( apricot, apricot_state )
MCFG_CPU_ADD("ic91", I8086, XTAL_15MHz / 3) MCFG_CPU_ADD("ic91", I8086, XTAL_15MHz / 3)
MCFG_CPU_PROGRAM_MAP(apricot_mem) MCFG_CPU_PROGRAM_MAP(apricot_mem)
MCFG_CPU_IO_MAP(apricot_io) MCFG_CPU_IO_MAP(apricot_io)
MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("ic31", pic8259_device, inta_cb) MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(apricot_state, irq_callback)
// i/o cpu // i/o cpu
MCFG_CPU_ADD("ic71", I8089, XTAL_15MHz / 3) MCFG_CPU_ADD("ic71", I8089, XTAL_15MHz / 3)
@ -371,7 +412,7 @@ static MACHINE_CONFIG_START( apricot, apricot_state )
MCFG_Z80DART_OUT_WRDYA_CB(DEVWRITELINE("ic71", i8089_device, drq2_w)) MCFG_Z80DART_OUT_WRDYA_CB(DEVWRITELINE("ic71", i8089_device, drq2_w))
MCFG_Z80DART_OUT_DTRB_CB(WRITELINE(apricot_state, data_selector_dtr_w)) MCFG_Z80DART_OUT_DTRB_CB(WRITELINE(apricot_state, data_selector_dtr_w))
MCFG_Z80DART_OUT_RTSB_CB(WRITELINE(apricot_state, data_selector_rts_w)) MCFG_Z80DART_OUT_RTSB_CB(WRITELINE(apricot_state, data_selector_rts_w))
MCFG_Z80DART_OUT_INT_CB(DEVWRITELINE("ic31", pic8259_device, ir5_w)) MCFG_Z80DART_OUT_INT_CB(WRITELINE(apricot_state, sio_int_w))
// rs232 port // rs232 port
MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, NULL) MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, NULL)
@ -395,11 +436,11 @@ static MACHINE_CONFIG_START( apricot, apricot_state )
MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
// floppy // floppy
MCFG_WD2793x_ADD("ic68", XTAL_4MHz / 2) MCFG_WD2797x_ADD("ic68", XTAL_4MHz / 2)
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(apricot_state, wd2793_intrq_w)) MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(apricot_state, fdc_intrq_w))
MCFG_WD_FDC_DRQ_CALLBACK(DEVWRITELINE("ic71", i8089_device, drq1_w)) MCFG_WD_FDC_DRQ_CALLBACK(DEVWRITELINE("ic71", i8089_device, drq1_w))
MCFG_FLOPPY_DRIVE_ADD("ic68:0", apricot_floppies, "d32w", floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_ADD("ic68:0", apricot_floppies, "d32w", apricot_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("ic68:1", apricot_floppies, "d32w", floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_ADD("ic68:1", apricot_floppies, "d32w", apricot_state::floppy_formats)
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( apricotxi, apricot ) static MACHINE_CONFIG_DERIVED( apricotxi, apricot )