diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mess/drivers/apricot.c | 151 | ||||
-rw-r--r-- | src/mess/machine/apricotkb.c | 4 | ||||
-rw-r--r-- | src/mess/machine/apricotkb.h | 4 |
3 files changed, 100 insertions, 59 deletions
diff --git a/src/mess/drivers/apricot.c b/src/mess/drivers/apricot.c index 322ddf731c7..2745b5e88bd 100644 --- a/src/mess/drivers/apricot.c +++ b/src/mess/drivers/apricot.c @@ -54,10 +54,41 @@ public: m_data_selector_rts(1), m_video_mode(0), 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<i8089_device> m_iop; required_device<sn76489_device> m_sn; @@ -68,33 +99,12 @@ public: required_device<z80sio0_device> m_sio; required_device<rs232_port_device> m_rs232; 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_floppy1; required_device<palette_device> m_palette; 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_rts; @@ -103,10 +113,10 @@ public: int m_display_enabled; - UINT32 screen_update_apricot(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - int m_centronics_fault; 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 ) { + // bit 0, crt reset + // bit 1, not connected + m_display_on = BIT(data, 3); m_video_mode = BIT(data, 4); + floppy_image_device *floppy = NULL; + + // bit 5, enable disk select + // bit 6, disk select 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 - 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_clock(m_video_mode ? XTAL_15MHz / 10 : XTAL_15MHz / 16); + m_crtc->set_hpixels_per_column(m_video_mode ? 10 : 16); // 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 //************************************************************************** -WRITE_LINE_MEMBER( apricot_state::wd2793_intrq_w ) +WRITE_LINE_MEMBER( apricot_state::fdc_intrq_w ) { m_pic->ir4_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 ) - SLOT_INTERFACE( "d31v", SONY_OA_D31V ) - SLOT_INTERFACE( "d32w", SONY_OA_D32W ) + SLOT_INTERFACE("d31v", SONY_OA_D31V) + SLOT_INTERFACE("d32w", SONY_OA_D32W) SLOT_INTERFACE_END @@ -229,34 +264,35 @@ MC6845_UPDATE_ROW( apricot_state::crtc_update_row ) { UINT8 *ram = m_ram->pointer(); const pen_t *pen = m_palette->pens(); - int i, x; - if (m_video_mode) + for (int i = 0; i < x_count; i++) { - // text mode - for (i = 0; i < x_count; i++) + UINT16 code = m_screen_buffer[(ma + i) & 0x7ff]; + 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; + if (i == cursor_x) fill = 1; // cursor? if (BIT(code, 12) && BIT(data, 14)) fill = 1; // strike-through? if (BIT(code, 13) && BIT(data, 15)) fill = 1; // underline? // 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); if (BIT(code, 15)) color = !color; // reverse? bitmap.pix32(y, x + i*10) = pen[color ? 1 + BIT(code, 14) : 0]; } } - } - else - { - // graphics mode - fatalerror("Graphics mode not implemented!\n"); + else + { + // draw 16 pixels of the cell + for (int x = 0; x <= 16; x++) + 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 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()); +} + +IRQ_CALLBACK_MEMBER( apricot_state::irq_callback ) +{ + // i86 lock is connected to the sio m1 input, simulate this + if (m_sio_irq) + m_sio->m1_r(); - // motor on is connected to gnd - m_floppy0->get_device()->mon_w(0); - m_floppy1->get_device()->mon_w(0); + return m_pic->acknowledge(); } @@ -289,7 +330,7 @@ ADDRESS_MAP_END 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(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(0x50, 0x51) AM_MIRROR(0x06) AM_DEVWRITE8("ic7", sn76489_device, 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_PROGRAM_MAP(apricot_mem) 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 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_DTRB_CB(WRITELINE(apricot_state, data_selector_dtr_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 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") // floppy - MCFG_WD2793x_ADD("ic68", XTAL_4MHz / 2) - MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(apricot_state, wd2793_intrq_w)) + MCFG_WD2797x_ADD("ic68", XTAL_4MHz / 2) + MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(apricot_state, fdc_intrq_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:1", 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", apricot_state::floppy_formats) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( apricotxi, apricot ) diff --git a/src/mess/machine/apricotkb.c b/src/mess/machine/apricotkb.c index a2520442d3e..6ceb0d6ba4d 100644 --- a/src/mess/machine/apricotkb.c +++ b/src/mess/machine/apricotkb.c @@ -1,5 +1,5 @@ -// license:GPL-2.0+ -// copyright-holders:Dirk Best +// license:BSD-3-Clause +// copyright-holders:Curt Coder /********************************************************************** Apricot keyboard emulation diff --git a/src/mess/machine/apricotkb.h b/src/mess/machine/apricotkb.h index b85dab77dcf..7b3d20a7a48 100644 --- a/src/mess/machine/apricotkb.h +++ b/src/mess/machine/apricotkb.h @@ -1,5 +1,5 @@ -// license:GPL-2.0+ -// copyright-holders:Dirk Best +// license:BSD-3-Clause +// copyright-holders:Curt Coder /********************************************************************** Apricot keyboard emulation |