From 53b63cef9d7c83d2de096f98fa2ba5b90c79d3cc Mon Sep 17 00:00:00 2001 From: AJR Date: Sun, 4 Nov 2018 23:51:52 -0500 Subject: mbc55x: Various additions and refinements - Correct all clocks and derive them from the master XTAL - Correct I/O address decoding - Enable speaker output from 8251 USART - Add ISA expansion slot, Centronics printer and RS232 "line" ports - Add backspace key to HLE keyboard and note undumped MCU --- src/mame/drivers/mbc55x.cpp | 132 +++++++++++++++++++++++++++++++------------- src/mame/includes/mbc55x.h | 64 ++++++++------------- src/mame/machine/mbc55x.cpp | 111 +++++++++++++------------------------ src/mame/video/mbc55x.cpp | 5 -- 4 files changed, 152 insertions(+), 160 deletions(-) diff --git a/src/mame/drivers/mbc55x.cpp b/src/mame/drivers/mbc55x.cpp index 704b5155bfa..e0f784f1e36 100644 --- a/src/mame/drivers/mbc55x.cpp +++ b/src/mame/drivers/mbc55x.cpp @@ -18,6 +18,13 @@ ToDo: #include "emu.h" #include "includes/mbc55x.h" +#include "bus/isa/isa.h" +#include "bus/isa/isa_cards.h" +//#include "bus/pc_joy/pc_joy.h" +#include "bus/rs232/rs232.h" +#include "cpu/mcs48/mcs48.h" +#include "machine/clock.h" +#include "machine/input_merger.h" #include "screen.h" #include "softlist.h" #include "speaker.h" @@ -61,16 +68,20 @@ void mbc55x_state::mbc55x_mem(address_map &map) void mbc55x_state::mbc55x_io(address_map &map) { - map.global_mask(0xff); - map(0x0000, 0x0003).rw(FUNC(mbc55x_state::mbcpic8259_r), FUNC(mbc55x_state::mbcpic8259_w)); - map(0x0008, 0x000F).rw(FUNC(mbc55x_state::mbc55x_disk_r), FUNC(mbc55x_state::mbc55x_disk_w)); - map(0x0010, 0x0010).rw(FUNC(mbc55x_state::vram_page_r), FUNC(mbc55x_state::vram_page_w)); - map(0x0018, 0x001F).rw(FUNC(mbc55x_state::ppi8255_r), FUNC(mbc55x_state::ppi8255_w)); - map(0x0020, 0x0027).rw(FUNC(mbc55x_state::mbcpit8253_r), FUNC(mbc55x_state::mbcpit8253_w)); - map(0x0028, 0x002B).rw(FUNC(mbc55x_state::mbc55x_usart_r), FUNC(mbc55x_state::mbc55x_usart_w)); - map(0x0030, 0x0031).rw(m_crtc, FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w)); - map(0x0032, 0x0033).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); - map(0x0038, 0x003B).rw(FUNC(mbc55x_state::mbc55x_kb_usart_r), FUNC(mbc55x_state::mbc55x_kb_usart_w)); + map(0x0000, 0x0000).select(0x003e).rw(FUNC(mbc55x_state::iodecode_r), FUNC(mbc55x_state::iodecode_w)); +} + +void mbc55x_state::mbc55x_iodecode(address_map &map) +{ + map(0x00, 0x01).mirror(0x02).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); + map(0x04, 0x07).rw(m_fdc, FUNC(fd1793_device::read), FUNC(fd1793_device::write)); + map(0x08, 0x08).mirror(0x03).rw(FUNC(mbc55x_state::vram_page_r), FUNC(mbc55x_state::vram_page_w)); + map(0x0c, 0x0f).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write)); + map(0x10, 0x13).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); + map(0x14, 0x15).mirror(0x02).rw("sio", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x18, 0x18).mirror(0x02).rw(m_crtc, FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w)); + map(0x19, 0x19).mirror(0x02).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); + map(0x1c, 0x1d).mirror(0x02).r(FUNC(mbc55x_state::mbc55x_kb_usart_r)).w(m_kb_uart, FUNC(i8251_device::write)); } static INPUT_PORTS_START( mbc55x ) @@ -138,7 +149,7 @@ static INPUT_PORTS_START( mbc55x ) PORT_START("KEY6") /* Key row 6 scancodes 30..37 */ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(0x08) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) @@ -243,21 +254,26 @@ static void mbc55x_floppies(device_slot_interface &device) MACHINE_CONFIG_START(mbc55x_state::mbc55x) /* basic machine hardware */ - I8088(config, m_maincpu, 3600000); + I8088(config, m_maincpu, 14.318181_MHz_XTAL / 4); m_maincpu->set_addrmap(AS_PROGRAM, &mbc55x_state::mbc55x_mem); m_maincpu->set_addrmap(AS_IO, &mbc55x_state::mbc55x_io); m_maincpu->set_irq_acknowledge_callback(PIC8259_TAG, FUNC(pic8259_device::inta_cb)); + ADDRESS_MAP_BANK(config, m_iodecode); + m_iodecode->endianness(ENDIANNESS_LITTLE); + m_iodecode->data_width(8); + m_iodecode->addr_width(5); + m_iodecode->set_addrmap(0, &mbc55x_state::mbc55x_iodecode); + + I8049(config, "kbdc", 6_MHz_XTAL).set_disable(); + /* video hardware */ - MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) - MCFG_SCREEN_RAW_PARAMS(14.318181_MHz_XTAL, 896, 0, 300, 262, 0, 200) - MCFG_SCREEN_UPDATE_DEVICE(VID_MC6845_NAME, mc6845_device, screen_update) - MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, mbc55x_state, screen_vblank_mbc55x)) + screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER)); + screen.set_raw(14.318181_MHz_XTAL, 896, 0, 640, 262, 0, 200); + screen.set_screen_update(VID_MC6845_NAME, FUNC(mc6845_device::screen_update)); MCFG_PALETTE_ADD("palette", SCREEN_NO_COLOURS * 3) MCFG_PALETTE_INIT_OWNER(mbc55x_state, mbc55x) -// MCFG_SCREEN_SIZE(650, 260) -// MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 249) RAM(config, RAM_TAG).set_default_size("128K").set_extra_options("128K,192K,256K,320K,384K,448K,512K,576K,640K"); @@ -266,29 +282,36 @@ MACHINE_CONFIG_START(mbc55x_state::mbc55x) SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, MONO_TAG, 0.75); /* Devices */ - I8251(config, m_kb_uart, 0); + I8251(config, m_kb_uart, 14.318181_MHz_XTAL / 8); + m_kb_uart->txd_handler().set("speaker", FUNC(speaker_sound_device::level_w)).invert(); + m_kb_uart->rts_handler().set(m_printer, FUNC(centronics_device::write_init)).invert(); m_kb_uart->rxrdy_handler().set(m_pic, FUNC(pic8259_device::ir3_w)); PIT8253(config, m_pit, 0); - m_pit->set_clk<0>(PIT_C0_CLOCK); m_pit->out_handler<0>().set(m_pic, FUNC(pic8259_device::ir0_w)); - m_pit->set_clk<1>(PIT_C1_CLOCK); + m_pit->out_handler<0>().append(m_pit, FUNC(pit8253_device::write_clk1)); m_pit->out_handler<1>().set(m_pic, FUNC(pic8259_device::ir1_w)); - m_pit->set_clk<2>(PIT_C2_CLOCK); - m_pit->out_handler<2>().set(FUNC(mbc55x_state::pit8253_t2)); + m_pit->set_clk<2>(14.318181_MHz_XTAL / 8); + m_pit->out_handler<2>().set("sio", FUNC(i8251_device::write_txc)); + m_pit->out_handler<2>().append("sio", FUNC(i8251_device::write_rxc)); + m_pit->out_handler<2>().append("line", FUNC(rs232_port_device::write_etc)); + + clock_device &clk_78_6khz(CLOCK(config, "clk_78.6khz", 14.318181_MHz_XTAL / 14 / 13)); + clk_78_6khz.signal_handler().set(m_pit, FUNC(pit8253_device::write_clk0)); + clk_78_6khz.signal_handler().append(m_kb_uart, FUNC(i8251_device::write_txc)); + clk_78_6khz.signal_handler().append(m_kb_uart, FUNC(i8251_device::write_rxc)); PIC8259(config, m_pic, 0); m_pic->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); I8255(config, m_ppi); - m_ppi->in_pa_callback().set(FUNC(mbc55x_state::mbc55x_ppi_porta_r)); - m_ppi->out_pa_callback().set(FUNC(mbc55x_state::mbc55x_ppi_porta_w)); - m_ppi->in_pb_callback().set(FUNC(mbc55x_state::mbc55x_ppi_portb_r)); - m_ppi->out_pb_callback().set(FUNC(mbc55x_state::mbc55x_ppi_portb_w)); - m_ppi->in_pc_callback().set(FUNC(mbc55x_state::mbc55x_ppi_portc_r)); - m_ppi->out_pc_callback().set(FUNC(mbc55x_state::mbc55x_ppi_portc_w)); - - MCFG_MC6845_ADD(VID_MC6845_NAME, MC6845, SCREEN_TAG, 14.318181_MHz_XTAL / 8) + m_ppi->in_pa_callback().set(FUNC(mbc55x_state::game_io_r)); + m_ppi->out_pa_callback().set(FUNC(mbc55x_state::game_io_w)); + m_ppi->out_pb_callback().set(FUNC(mbc55x_state::printer_data_w)); + m_ppi->in_pc_callback().set(FUNC(mbc55x_state::printer_status_r)); + m_ppi->out_pc_callback().set(FUNC(mbc55x_state::disk_select_w)); + + MCFG_MC6845_ADD(VID_MC6845_NAME, HD6845, SCREEN_TAG, 14.318181_MHz_XTAL / 8) // HD46505SP-1 MCFG_MC6845_SHOW_BORDER_AREA(false) MCFG_MC6845_CHAR_WIDTH(8) MCFG_MC6845_UPDATE_ROW_CB(mbc55x_state, crtc_update_row) @@ -296,25 +319,56 @@ MACHINE_CONFIG_START(mbc55x_state::mbc55x) MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(*this, mbc55x_state, vid_vsync_changed)) /* Backing storage */ - FD1793(config, m_fdc, 1_MHz_XTAL); + FD1793(config, m_fdc, 14.318181_MHz_XTAL / 14); // M5W1793-02P (clock is nominally 1 MHz) + m_fdc->intrq_wr_callback().set(m_pic, FUNC(pic8259_device::ir5_w)); - MCFG_FLOPPY_DRIVE_ADD(FDC_TAG ":0", mbc55x_floppies, "qd", mbc55x_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD(FDC_TAG ":1", mbc55x_floppies, "qd", mbc55x_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD(FDC_TAG ":2", mbc55x_floppies, "", mbc55x_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD(FDC_TAG ":3", mbc55x_floppies, "", mbc55x_state::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(m_floppy[0], mbc55x_floppies, "qd", mbc55x_state::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(m_floppy[1], mbc55x_floppies, "qd", mbc55x_state::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(m_floppy[2], mbc55x_floppies, "", mbc55x_state::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD(m_floppy[3], mbc55x_floppies, "", mbc55x_state::floppy_formats) /* Software list */ MCFG_SOFTWARE_LIST_ADD("disk_list","mbc55x") + + MCFG_DEVICE_ADD("isa", ISA8, 0) + MCFG_ISA8_CPU(m_maincpu) + MCFG_ISA_OUT_IRQ7_CB(WRITELINE(m_pic, pic8259_device, ir7_w)) // all other IRQ and DRQ lines are NC + //MCFG_ISA_BUS_IOCHCK(INPUTLINE(m_maincpu, INPUT_LINE_NMI)) + + ISA8_SLOT(config, "external", 0, "isa", pc_isa8_cards, nullptr, false); + + i8251_device &sio(I8251(config, "sio", 14.318181_MHz_XTAL / 8)); // on separate board, through 20-pin header + sio.dtr_handler().set("line", FUNC(rs232_port_device::write_dtr)); + sio.txd_handler().set("line", FUNC(rs232_port_device::write_txd)); + sio.rts_handler().set("line", FUNC(rs232_port_device::write_rts)); + sio.rxrdy_handler().set("sioint", FUNC(input_merger_device::in_w<0>)); + sio.txrdy_handler().set("sioint", FUNC(input_merger_device::in_w<1>)); + + rs232_port_device &serial(RS232_PORT(config, "line", default_rs232_devices, nullptr)); + serial.rxd_handler().set("sio", FUNC(i8251_device::write_rxd)); + serial.dsr_handler().set("sio", FUNC(i8251_device::write_dsr)); + serial.cts_handler().set("sio", FUNC(i8251_device::write_cts)); + + INPUT_MERGER_ANY_HIGH(config, "sioint").output_handler().set(m_pic, FUNC(pic8259_device::ir2_w)); + + CENTRONICS(config, m_printer, centronics_devices, nullptr); + m_printer->busy_handler().set(FUNC(mbc55x_state::printer_busy_w)).invert(); // LS14 Schmitt trigger + m_printer->busy_handler().append(m_pic, FUNC(pic8259_device::ir4_w)).invert(); + m_printer->perror_handler().set(FUNC(mbc55x_state::printer_paper_end_w)); + m_printer->select_handler().set(FUNC(mbc55x_state::printer_select_w)); MACHINE_CONFIG_END ROM_START( mbc55x ) - ROM_REGION( 0x4000, MAINCPU_TAG, 0 ) + ROM_REGION(0x4000, MAINCPU_TAG, 0) ROM_SYSTEM_BIOS(0, "v120", "mbc55x BIOS v1.20 (1983)") - ROMX_LOAD("mbc55x-v120.rom", 0x0000, 0x2000, CRC(b439b4b8) SHA1(6e8df0f3868e3fd0229a5c2720d6c01e46815cab), ROM_BIOS(0) ) + ROMX_LOAD("mbc55x-v120.rom", 0x0000, 0x2000, CRC(b439b4b8) SHA1(6e8df0f3868e3fd0229a5c2720d6c01e46815cab), ROM_BIOS(0)) + + ROM_REGION(0x0800, "kbdc", 0) + ROM_LOAD("d8049hc.m1", 0x0000, 0x0800, NO_DUMP) ROM_END // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1983, mbc55x, 0, 0, mbc55x, mbc55x, mbc55x_state, empty_init, "Sanyo", "MBC-55x", 0 /*MACHINE_NO_SOUND*/) +COMP( 1983, mbc55x, 0, 0, mbc55x, mbc55x, mbc55x_state, empty_init, "Sanyo", "MBC-55x", 0 ) diff --git a/src/mame/includes/mbc55x.h b/src/mame/includes/mbc55x.h index 578228ed392..664fe5a32a0 100644 --- a/src/mame/includes/mbc55x.h +++ b/src/mame/includes/mbc55x.h @@ -15,6 +15,7 @@ #include "bus/centronics/ctronics.h" #include "cpu/i86/i86.h" #include "imagedev/flopdrv.h" +#include "machine/bankdev.h" #include "machine/i8251.h" #include "machine/i8255.h" #include "machine/pic8259.h" @@ -72,12 +73,7 @@ #define PPI8255_TAG "ppi8255" #define PIC8259_TAG "pic8259" - -// From tech manual clock c1 is fed from c0, but it approx 100Hz #define PIT8253_TAG "pit8253" -#define PIT_C0_CLOCK 78600 -#define PIT_C1_CLOCK 100 -#define PIT_C2_CLOCK 1789770 #define MONO_TAG "mono" #define I8251A_KB_TAG "i8251a_kb" @@ -99,16 +95,15 @@ public: mbc55x_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, MAINCPU_TAG), + m_iodecode(*this, "iodecode"), m_crtc(*this, VID_MC6845_NAME), m_kb_uart(*this, I8251A_KB_TAG), m_pit(*this, PIT8253_TAG), m_ppi(*this, PPI8255_TAG), m_pic(*this, PIC8259_TAG), m_fdc(*this, FDC_TAG), - m_floppy0(*this, FDC_TAG ":0"), - m_floppy1(*this, FDC_TAG ":1"), - m_floppy2(*this, FDC_TAG ":2"), - m_floppy3(*this, FDC_TAG ":3"), + m_floppy(*this, FDC_TAG ":%u", 0U), + m_printer(*this, "printer"), m_speaker(*this, "speaker"), m_ram(*this, RAM_TAG), m_palette(*this, "palette") @@ -120,51 +115,37 @@ public: void init_mbc55x(); required_device m_maincpu; + required_device m_iodecode; uint32_t m_debug_machine; private: DECLARE_FLOPPY_FORMATS(floppy_formats); - //DECLARE_READ8_MEMBER(pic8259_r); - //DECLARE_WRITE8_MEMBER(pic8259_w); - //DECLARE_READ8_MEMBER(mbc55x_disk_r); - //DECLARE_WRITE8_MEMBER(mbc55x_disk_w); - DECLARE_READ8_MEMBER(mbc55x_usart_r); - DECLARE_WRITE8_MEMBER(mbc55x_usart_w); - //DECLARE_READ8_MEMBER(mbc55x_kb_usart_r); - //DECLARE_WRITE8_MEMBER(mbc55x_kb_usart_w); + DECLARE_READ8_MEMBER(iodecode_r); + DECLARE_WRITE8_MEMBER(iodecode_w); + + DECLARE_READ8_MEMBER(mbc55x_kb_usart_r); DECLARE_READ8_MEMBER(vram_page_r); DECLARE_WRITE8_MEMBER(vram_page_w); - DECLARE_READ8_MEMBER(ppi8255_r); - DECLARE_WRITE8_MEMBER(ppi8255_w); - //DECLARE_READ8_MEMBER(pit8253_r); - //DECLARE_WRITE8_MEMBER(pit8253_w); - DECLARE_READ8_MEMBER(mbc55x_ppi_porta_r); - DECLARE_READ8_MEMBER(mbc55x_ppi_portb_r); - DECLARE_READ8_MEMBER(mbc55x_ppi_portc_r); - DECLARE_WRITE8_MEMBER(mbc55x_ppi_porta_w); - DECLARE_WRITE8_MEMBER(mbc55x_ppi_portb_w); - DECLARE_WRITE8_MEMBER(mbc55x_ppi_portc_w); + DECLARE_READ8_MEMBER(game_io_r); + DECLARE_WRITE8_MEMBER(game_io_w); + DECLARE_READ8_MEMBER(printer_status_r); + DECLARE_WRITE8_MEMBER(printer_data_w); + DECLARE_WRITE8_MEMBER(disk_select_w); + DECLARE_WRITE_LINE_MEMBER(printer_busy_w); + DECLARE_WRITE_LINE_MEMBER(printer_paper_end_w); + DECLARE_WRITE_LINE_MEMBER(printer_select_w); + DECLARE_WRITE_LINE_MEMBER(vid_hsync_changed); DECLARE_WRITE_LINE_MEMBER(vid_vsync_changed); - DECLARE_WRITE_LINE_MEMBER(pit8253_t2); - - DECLARE_READ8_MEMBER(mbcpic8259_r); - DECLARE_WRITE8_MEMBER(mbcpic8259_w); - DECLARE_READ8_MEMBER(mbcpit8253_r); - DECLARE_WRITE8_MEMBER(mbcpit8253_w); - DECLARE_READ8_MEMBER(mbc55x_disk_r); - DECLARE_WRITE8_MEMBER(mbc55x_disk_w); - DECLARE_READ8_MEMBER(mbc55x_kb_usart_r); - DECLARE_WRITE8_MEMBER(mbc55x_kb_usart_w); MC6845_UPDATE_ROW(crtc_update_row); DECLARE_PALETTE_INIT(mbc55x); - DECLARE_WRITE_LINE_MEMBER(screen_vblank_mbc55x); TIMER_CALLBACK_MEMBER(keyscan_callback); void mbc55x_io(address_map &map); void mbc55x_mem(address_map &map); + void mbc55x_iodecode(address_map &map); virtual void machine_start() override; virtual void machine_reset() override; @@ -181,10 +162,8 @@ private: required_device m_ppi; required_device m_pic; required_device m_fdc; - required_device m_floppy0; - required_device m_floppy1; - required_device m_floppy2; - required_device m_floppy3; + required_device_array m_floppy; + required_device m_printer; required_device m_speaker; required_device m_ram; required_device m_palette; @@ -192,6 +171,7 @@ private: uint32_t m_debug_video; uint8_t m_video_mem[VIDEO_MEM_SIZE]; uint8_t m_vram_page; + uint8_t m_printer_status; keyboard_t m_keyboard; diff --git a/src/mame/machine/mbc55x.cpp b/src/mame/machine/mbc55x.cpp index 300fb6f9414..4ae8d0fe92b 100644 --- a/src/mame/machine/mbc55x.cpp +++ b/src/mame/machine/mbc55x.cpp @@ -38,51 +38,54 @@ static int instruction_hook(device_t &device, offs_t curpc); //static void fdc_reset(running_machine &machine); //static void set_disk_int(running_machine &machine, int state); -/* 8255 Configuration */ - -READ8_MEMBER( mbc55x_state::ppi8255_r ) +READ8_MEMBER(mbc55x_state::iodecode_r) { - return m_ppi->read(offset>>1); + return m_iodecode->read8(space, offset >> 1); } -WRITE8_MEMBER( mbc55x_state::ppi8255_w ) +WRITE8_MEMBER(mbc55x_state::iodecode_w) { - m_ppi->write(offset>>1, data); + m_iodecode->write8(space, offset >> 1, data); } -READ8_MEMBER( mbc55x_state::mbc55x_ppi_porta_r ) -{ - return 0xff; -} +/* 8255 Configuration */ -READ8_MEMBER( mbc55x_state::mbc55x_ppi_portb_r ) +READ8_MEMBER(mbc55x_state::game_io_r) { return 0xff; } -READ8_MEMBER( mbc55x_state::mbc55x_ppi_portc_r ) +WRITE8_MEMBER(mbc55x_state::game_io_w) { - return 0xff; } -WRITE8_MEMBER( mbc55x_state::mbc55x_ppi_porta_w ) +READ8_MEMBER( mbc55x_state::printer_status_r) { + return m_printer_status; } -WRITE8_MEMBER( mbc55x_state::mbc55x_ppi_portb_w ) +WRITE8_MEMBER(mbc55x_state::printer_data_w) { + m_printer->write_data7(!BIT(data, 7)); + m_printer->write_data6(!BIT(data, 6)); + m_printer->write_data5(!BIT(data, 5)); + m_printer->write_data4(!BIT(data, 4)); + m_printer->write_data3(!BIT(data, 3)); + m_printer->write_data2(!BIT(data, 2)); + m_printer->write_data1(!BIT(data, 1)); + m_printer->write_data0(!BIT(data, 0)); } -WRITE8_MEMBER( mbc55x_state::mbc55x_ppi_portc_w ) +WRITE8_MEMBER(mbc55x_state::disk_select_w) { floppy_image_device *floppy = nullptr; switch (data & 0x03) { - case 0: floppy = m_floppy0->get_device(); break; - case 1: floppy = m_floppy1->get_device(); break; - case 2: floppy = m_floppy2->get_device(); break; - case 3: floppy = m_floppy3->get_device(); break; + case 0: floppy = m_floppy[0]->get_device(); break; + case 1: floppy = m_floppy[1]->get_device(); break; + case 2: floppy = m_floppy[2]->get_device(); break; + case 3: floppy = m_floppy[3]->get_device(); break; } m_fdc->set_floppy(floppy); @@ -92,45 +95,23 @@ WRITE8_MEMBER( mbc55x_state::mbc55x_ppi_portc_w ) floppy->mon_w(0); floppy->ss_w(BIT(data, 2)); } -} - -/* Serial port USART, unimplemented as yet */ - -READ8_MEMBER( mbc55x_state::mbc55x_usart_r ) -{ - return 0; -} - -WRITE8_MEMBER( mbc55x_state::mbc55x_usart_w ) -{ -} - -/* PIC 8259 Configuration */ - -READ8_MEMBER(mbc55x_state::mbcpic8259_r) -{ - return m_pic->read(offset>>1); -} -WRITE8_MEMBER(mbc55x_state::mbcpic8259_w) -{ - m_pic->write(offset>>1, data); + m_printer->write_strobe(!BIT(data, 3)); } -READ8_MEMBER(mbc55x_state::mbcpit8253_r) +WRITE_LINE_MEMBER(mbc55x_state::printer_busy_w) { - return m_pit->read(offset >> 1); + m_printer_status = (m_printer_status & 0xef) | (state ? 0x10 : 0x00); } -WRITE8_MEMBER(mbc55x_state::mbcpit8253_w) +WRITE_LINE_MEMBER(mbc55x_state::printer_paper_end_w) { - m_pit->write(offset >> 1, data); + m_printer_status = (m_printer_status & 0xdf) | (state ? 0x20 : 0x00); } -WRITE_LINE_MEMBER( mbc55x_state::pit8253_t2 ) +WRITE_LINE_MEMBER(mbc55x_state::printer_select_w) { - m_kb_uart->write_txc(state); - m_kb_uart->write_rxc(state); + m_printer_status = (m_printer_status & 0xbf) | (state ? 0x40 : 0x00); } /* Video ram page register */ @@ -147,16 +128,6 @@ WRITE8_MEMBER( mbc55x_state::vram_page_w ) m_vram_page=data; } -READ8_MEMBER(mbc55x_state::mbc55x_disk_r) -{ - return m_fdc->read(offset>>1); -} - -WRITE8_MEMBER(mbc55x_state::mbc55x_disk_w) -{ - m_fdc->write(offset>>1, data); -} - /* Keyboard emulation @@ -195,9 +166,9 @@ void mbc55x_state::scan_keyboard() { '9', '0', '-', '=', '\\', 'q', 'w', 'e' }, { 'r', 't', 'y', 'u', 'i', 'o', 'p', '[' }, { ']', 'a', 's', 'd', 'f', 'g', 'h', 'j' }, - { 'k', 'l', ';', '\'', '`', 0x0D, 'z', 'x' }, + { 'k', 'l', ';', '\'', '`', 0x0d, 'z', 'x' }, { 'c', 'v', 'b', 'n', 'm', ',', '.', '/', }, - { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', } + { ' ', 0x08, ' ', ' ', ' ', ' ', ' ', ' ', } }; @@ -209,7 +180,7 @@ void mbc55x_state::scan_keyboard() { '}', 'A', 'S', 'D', 'F', 'G', 'H', 'J' }, { 'K', 'L', ':', '"', '~', 0x0d, 'Z', 'X' }, { 'C', 'V', 'B', 'N', 'M', ',', '?', '/' }, - { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' } + { ' ', 0x08, ' ', ' ', ' ', ' ', ' ', ' ' } }; // First read shift, control and graph @@ -246,7 +217,6 @@ TIMER_CALLBACK_MEMBER(mbc55x_state::keyscan_callback) READ8_MEMBER(mbc55x_state::mbc55x_kb_usart_r) { uint8_t result = 0; - offset>>=1; switch (offset) { @@ -264,17 +234,6 @@ READ8_MEMBER(mbc55x_state::mbc55x_kb_usart_r) return result; } -WRITE8_MEMBER(mbc55x_state::mbc55x_kb_usart_w) -{ - offset>>=1; - - switch (offset) - { - case 0 : m_kb_uart->data_w(data); break; - case 1 : m_kb_uart->control_w(data); break; - } -} - void mbc55x_state::set_ram_size() { address_space &space = m_maincpu->space( AS_PROGRAM ); @@ -346,8 +305,12 @@ void mbc55x_state::machine_start() m_debug_machine=DEBUG_NONE; + m_printer_status = 0xff; + // Allocate keyscan timer m_keyboard.keyscan_timer=machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mbc55x_state::keyscan_callback),this)); + + m_kb_uart->write_cts(0); } diff --git a/src/mame/video/mbc55x.cpp b/src/mame/video/mbc55x.cpp index af946d84baa..f9f7f50cb49 100644 --- a/src/mame/video/mbc55x.cpp +++ b/src/mame/video/mbc55x.cpp @@ -183,8 +183,3 @@ void mbc55x_state::video_reset() logerror("Video reset\n"); } - -WRITE_LINE_MEMBER(mbc55x_state::screen_vblank_mbc55x) -{ -// logerror("screen_vblank_mbc55x\n"); -} -- cgit v1.2.3