diff options
Diffstat (limited to 'src/mame/drivers/ibm6580.cpp')
-rw-r--r-- | src/mame/drivers/ibm6580.cpp | 962 |
1 files changed, 0 insertions, 962 deletions
diff --git a/src/mame/drivers/ibm6580.cpp b/src/mame/drivers/ibm6580.cpp deleted file mode 100644 index 55b5f520970..00000000000 --- a/src/mame/drivers/ibm6580.cpp +++ /dev/null @@ -1,962 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Sergey Svishchev -/*************************************************************************** - -IBM 6580 Displaywriter. - -A green-screen dedicated word-processing workstation. It uses 8" floppy -disks. It could have up to 224k of ram. Consists of: - Electronics Module 6580 - Display 3300 - Keyboard 5330 [a "beamspring"-type] - Dual Diskette Unit 6360 -Optional: - Printers: 5215, 5218, 5228 - Printer Sharing feature - Mag Card Unit - Asynchronous and Bisynchronous communications features - 66-line display and adapter (800x1056 px, 8x16 character cell) - - -All chips have IBM part numbers on them. F.e. on system board: - 8493077 - 8086 - 4178619 - 8251A - 4178617 - 8257-5 - 4178623 - 8259A - 4178628 - 8255A-5 - 4178625 - 8253-5 - - -IRQ levels per PSM p. 6-5 - 0 incoming data for printer sharing/3277 DE - 1 transfer data to commo data link - 2 printer and mag card data xfer - 3 keyboard incoming data - 4 diskette - 5 (not in use) - 6 software timer [50 ms period] - 7 error on commo data link - nmi "or when a dump switch operation is initiated" ["memory record" button] - - -To do: -- verify all frequency sources, document ROM revisions -- memory size options -- bus errors, interrupts - -- 92-key keyboard variant, keyboard click/beep, keyboard layouts - -- 25-line video board (instant scroll, sub/superscripts, graphics mode) -- 66-line video board - -- either emulate floppy board, or complete its HLE (drive select, etc.) -- add support for 8" drives with no track 0 sensor - (recalibrate command is expected to return 0x70 in ST0) -- double density floppies -- "memory record" (system dump) generation to floppies - -- pass BAT with no errors (Basic Assurance Test) -- pass RNA with no errors (Resident Non-Automatic Test) -- pass PDD with no errors (Problem Determination Disk) -- pass CED with no errors (Customer Engineering Diagnostics) - -- boot Textpack successfully (currently crashes with *90x* message) - - -Useful documents: - -bitsavers://pdf/ibm/6580_Displaywriter/S241-6248-3_Displaywriter_Product_Support_Manual_Feb83.pdf -bitsavers://pdf/ibm/6580_Displaywriter/S241-6248-2_Displaywriter_6360_6580_Product_Support_Manual_May82.pdf -bitsavers://pdf/ibm/6580_Displaywriter/S241-6250-5_Displaywriter_6250_6580_Maintenance_Analysis_Procedures_May82.pdf -http://www.nostalgia8.nl/cpm/ibm/cpm6dwrm.pdf -http://www.kbdbabel.org/schematic/kbdbabel_doc_ibm_displaywriter.pdf -https://docs.google.com/spreadsheets/d/1SYY_HrBqKjSOX9W4fe5xUsjbfiCt0Umjpo4ZIwgG3Nk/edit?usp=sharing - - -Wanted: - -Displaywriter System Manual S544-2023-0 (?) -- mentioned in US patents 4648071 and 5675827 -"IBM Displaywriter System Printer Guide," Order No. S544-0861-2, Copyright 1980. -"Displaywriter System Product Support Manual," Order No. S241-6248-1, Copyright 1980 - -****************************************************************************/ - -#include "emu.h" - -#include "bus/rs232/rs232.h" -#include "cpu/i86/i86.h" -#include "imagedev/floppy.h" -#include "machine/i8251.h" -#include "machine/i8255.h" -#include "machine/i8257.h" -#include "machine/pic8259.h" -#include "machine/pit8253.h" -#include "machine/ibm6580_kbd.h" -//nclude "machine/ibm6580_fdc.h" -#include "machine/ram.h" -#include "machine/upd765.h" - -#include "emupal.h" -#include "screen.h" - -#include "ibm6580.lh" - - -#define I8086_TAG "i8086" -#define I8259A_TAG "i8259" -#define I8255A_TAG "i8255a" -#define I8253_TAG "i8253" -#define UPD765_TAG "upd765" - - -//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already -#define LOG_KEYBOARD (1U << 1) -#define LOG_DEBUG (1U << 2) - -//#define VERBOSE (LOG_DEBUG) -//#define LOG_OUTPUT_FUNC printf -#include "logmacro.h" - -#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__) -#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__) - - -const uint8_t gfx_expand[16] = { - 0x00, 0x03, 0x0c, 0x0f, - 0x30, 0x33, 0x3c, 0x3f, - 0xc0, 0xc3, 0xcc, 0xcf, - 0xf0, 0xf3, 0xfc, 0xff -}; - - -class ibm6580_state : public driver_device -{ -public: - ibm6580_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_p_videoram(*this, "videoram") - , m_ram(*this, RAM_TAG) - , m_maincpu(*this, "maincpu") - , m_pic8259(*this, "pic8259") - , m_pit8253(*this, "pit8253") - , m_ppi8255(*this, "ppi8255") - , m_dma8257(*this, "dma8257") - , m_screen(*this, "screen") - , m_kbd(*this, "kbd") - , m_fdc(*this, UPD765_TAG) - , m_flop0(*this, UPD765_TAG ":0") - , m_flop1(*this, UPD765_TAG ":1") - , m_p_chargen(*this, "chargen") - { } - - void ibm6580(machine_config &config); - -private: - DECLARE_WRITE16_MEMBER(pic_latch_w); - DECLARE_WRITE16_MEMBER(unk_latch_w); - - DECLARE_WRITE8_MEMBER(p40_w); - DECLARE_READ8_MEMBER(p40_r); - - DECLARE_WRITE8_MEMBER(video_w); - DECLARE_READ8_MEMBER(video_r); - DECLARE_WRITE_LINE_MEMBER(vblank_w); - - DECLARE_READ8_MEMBER(ppi_a_r); - DECLARE_WRITE8_MEMBER(led_w); - DECLARE_WRITE8_MEMBER(ppi_c_w); - DECLARE_READ8_MEMBER(ppi_c_r); - - DECLARE_WRITE_LINE_MEMBER(kb_data_w); - DECLARE_WRITE_LINE_MEMBER(kb_clock_w); - DECLARE_WRITE_LINE_MEMBER(kb_strobe_w); - - DECLARE_WRITE8_MEMBER(floppy_w); - DECLARE_READ8_MEMBER(floppy_r); - DECLARE_FLOPPY_FORMATS(floppy_formats); - DECLARE_WRITE_LINE_MEMBER(floppy_intrq); - DECLARE_WRITE_LINE_MEMBER(floppy_hdl); - DECLARE_WRITE8_MEMBER(dmapg_w); - DECLARE_WRITE_LINE_MEMBER(hrq_w); - DECLARE_READ8_MEMBER(memory_read_byte); - DECLARE_WRITE8_MEMBER(memory_write_byte); - - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - - void ibm6580_io(address_map &map); - void ibm6580_mem(address_map &map); - - virtual void machine_start() override; - virtual void machine_reset() override; - virtual void video_start() override; - - uint8_t m_p40, m_p50, m_e000, m_kb_data, m_ppi_c; - bool m_kb_data_bit, m_kb_strobe; - util::fifo<uint8_t, 4> m_kb_fifo; - - util::fifo<uint8_t, 4> m_floppy_mcu_sr, m_floppy_mcu_cr; - int m_floppy_mcu_cr_fifo; - uint8_t m_floppy_sr; - floppy_image_device *m_floppies[2]; - floppy_image_device *m_floppy; - bool m_floppy_intrq, m_floppy_hdl, m_floppy_idle; - uint8_t m_dma0pg; - uint8_t floppy_mcu_command(); - bool floppy_mcu_cr_full(); - - required_shared_ptr<uint16_t> m_p_videoram; - required_device<ram_device> m_ram; - required_device<cpu_device> m_maincpu; - required_device<pic8259_device> m_pic8259; - required_device<pit8253_device> m_pit8253; - required_device<i8255_device> m_ppi8255; - required_device<i8257_device> m_dma8257; - required_device<screen_device> m_screen; - required_device<dw_keyboard_device> m_kbd; - required_device<upd765a_device> m_fdc; - required_device<floppy_connector> m_flop0; - required_device<floppy_connector> m_flop1; - required_region_ptr<u8> m_p_chargen; -}; - - -WRITE8_MEMBER(ibm6580_state::p40_w) -{ - LOG("___ %02x <- %02x\n", 0x40 + (offset << 1), data); - - switch (offset) - { - case 0: - m_p40 = data | 0x80; - break; - - case 2: - if (data) - m_p40 |= 4; - break; - - case 5: - // write_gate0 doesn't work -- counter is read back as 0 - if (BIT(data, 2)) - // hack. video test checks timer counter value and this lets it pass. - m_pit8253->set_clockin(0, (double)26880000); - else - m_pit8253->set_clockin(0, 0.0); - m_p50 = 0; - m_ppi_c = data; - break; - - case 6: - m_dma0pg = data; - break; - - case 8: - m_p50 = data; - break; - - case 12: - if (data) - m_p40 &= ~0x14; - break; - } -} - -READ8_MEMBER(ibm6580_state::p40_r) -{ - uint8_t data = 0; - - switch (offset) - { - case 0: - data = m_p40; - m_p40 &= ~4; - break; - - case 8: - data = m_p50; - m_p50 = 1; - break; - } - - LOGDBG("___ %02x == %02x\n", 0x40 + (offset << 1), data); - - return data; -} - -WRITE8_MEMBER(ibm6580_state::video_w) -{ - LOG("Video %02x <- %02x\n", 0xe000 + (offset << 1), data); - - switch (offset) - { - case 2: - // some kind of gate - m_e000 = data; - break; - } -} - -READ8_MEMBER(ibm6580_state::video_r) -{ - uint8_t data = 0; - - switch (offset) - { - case 8: - data = 1; // 25-line video board ID. 66-line is 0x40. - data |= (m_screen->hblank() ? 8 : 0); - data |= (m_screen->vblank() ? 4 : 0); - // pure guesswork. 0x2, 0x10 and 0x20 are unknown video signals. - // 0x20 cannot be zero when 0x10 is zero. - data |= ((m_screen->vpos() < 2) ? 2 : 0); - if (m_e000) { - data |= (m_screen->vblank() ? 0x20 : 0); - data |= (m_screen->vblank() ? 0 : 0x10); - } - break; - } - - if (offset != 8) - LOG("Video %02x == %02x\n", 0xe000 + (offset << 1), data); - - return data; -} - -WRITE_LINE_MEMBER(ibm6580_state::vblank_w) -{ -// if (state) -// m_pic8259->ir6_w(state); - - if (ioport("DUMP")->read()) - m_p40 |= 4; -} - -WRITE16_MEMBER(ibm6580_state::pic_latch_w) -{ - LOG("PIC latch <- %02x\n", data); - - if (data) - m_p40 |= 8; - - m_pic8259->ir0_w(data == 2 ? ASSERT_LINE : CLEAR_LINE); - m_pic8259->ir1_w(data == 2 ? ASSERT_LINE : CLEAR_LINE); - m_pic8259->ir2_w(data == 2 ? ASSERT_LINE : CLEAR_LINE); - m_pic8259->ir3_w(data == 2 ? ASSERT_LINE : CLEAR_LINE); - m_pic8259->ir4_w(data == 2 ? ASSERT_LINE : CLEAR_LINE); - m_pic8259->ir5_w(data == 2 ? ASSERT_LINE : CLEAR_LINE); - m_pic8259->ir6_w(data == 2 ? ASSERT_LINE : CLEAR_LINE); - m_pic8259->ir7_w(data == 2 ? ASSERT_LINE : CLEAR_LINE); -} - -WRITE16_MEMBER(ibm6580_state::unk_latch_w) -{ - LOG("UNK latch <- %02x\n", data); - - m_p40 |= 0x10; -} - -WRITE8_MEMBER(ibm6580_state::led_w) -{ - output().set_value("led5", BIT(data, 7)); - output().set_value("led6", BIT(data, 6)); - output().set_value("led7", BIT(data, 5)); - output().set_value("led8", BIT(data, 4)); - - if (data & 0xf) - return; - - switch (data >> 4) - { - case 0x1: - printf ("LED 0 0001: Parity Generator/Checker\n"); - break; - - case 0xe: - printf ("LED 0 1110: Base RAM\n"); - break; - - case 0x3: - printf ("LED 0 0011: Processor Extension Test\n"); - break; - - case 0x4: - printf ("LED 0 0100: Display RAM\n"); - break; - - case 0x5: - printf ("LED 0 0101: Display Adapter Timing Test, Video Test\n"); - break; - - case 0x6: - printf ("LED 0 0110: Keyboard Cable Test, Physical Keyboard Test\n"); - break; - - case 0x7: - printf ("LED 0 0111: DMA Controller Test\n"); - break; - - case 0x8: - printf ("LED 0 1000: Diskette Module Wrap Test, Adapter Test\n"); - break; - - case 0x9: - printf ("LED 0 1001: Extra RAM Test\n"); - break; - - case 0xa: - printf ("LED 0 1010: Bus Time-Out Test\n"); - break; - - case 0xc: - printf ("LED 0 1100: RAM Addressability Test\n"); - break; - - default: -// printf ("LED 0x%08x: unknown\n", data); - break; - } -} - -WRITE8_MEMBER(ibm6580_state::ppi_c_w) -{ - LOG("PPI Port C <- %02x\n", data); - - // bit 5 -- acknowledge - // bit 6 -- reset - // bit 7 -- ?? gate - - if (!BIT(data, 6)) { - m_kb_fifo.clear(); - } - - m_kbd->reset_w(!BIT(data, 6)); - m_kbd->ack_w(BIT(data, 5)); -} - -READ8_MEMBER(ibm6580_state::ppi_c_r) -{ - uint8_t data = 0; - - data |= (m_kb_strobe << 3); - - LOGDBG("PPI Port C == %02x\n", data); - - return data; -} - -READ8_MEMBER(ibm6580_state::ppi_a_r) -{ - uint8_t data = m_kb_fifo.dequeue(); - - LOG("PPI Port A == %02x (fifo full: %d)\n", data, m_kb_fifo.full()); - - return data; -} - -WRITE_LINE_MEMBER(ibm6580_state::kb_data_w) -{ - m_kb_data_bit = !state; -} - -WRITE_LINE_MEMBER(ibm6580_state::kb_clock_w) -{ - if (!state) - m_kb_data = (m_kb_data >> 1) | (m_kb_data_bit << 7); -} - -WRITE_LINE_MEMBER(ibm6580_state::kb_strobe_w) -{ - m_kb_strobe = !state; - if (!state && BIT(m_ppi_c, 0)) { - m_kb_fifo.enqueue(m_kb_data); - LOGKBD("Kbd enqueue %02x (fifo full: %d, m_ppi_c %02x)\n", m_kb_data, m_kb_fifo.full(), m_ppi_c); - } -} - -WRITE_LINE_MEMBER(ibm6580_state::floppy_intrq) -{ - m_floppy_intrq = state; - if (state) - m_floppy_idle = true; -} - -WRITE_LINE_MEMBER(ibm6580_state::hrq_w) -{ - m_maincpu->set_input_line(INPUT_LINE_HALT, state); - m_dma8257->hlda_w(state); -} - -READ8_MEMBER(ibm6580_state::memory_read_byte) -{ - address_space& prog_space = m_maincpu->space(AS_PROGRAM); - return prog_space.read_byte(offset | (m_dma0pg << 16)); -} - -WRITE8_MEMBER(ibm6580_state::memory_write_byte) -{ - address_space& prog_space = m_maincpu->space(AS_PROGRAM); - prog_space.write_byte(offset | (m_dma0pg << 16), data); -} - -bool ibm6580_state::floppy_mcu_cr_full() -{ - uint8_t command = m_floppy_mcu_cr.peek(); - - if ((command & 1) && m_floppy_mcu_cr_fifo == 1) - return true; - if (command == 0x0c && m_floppy_mcu_cr_fifo == 4) - return true; - if (m_floppy_mcu_cr_fifo == 3) - return true; - else - return false; -} - -uint8_t ibm6580_state::floppy_mcu_command() -{ - uint8_t data = 0, command = m_floppy_mcu_cr.dequeue(), i; - - LOG("Floppy mcu_command %02x\n", command); - - m_floppy_mcu_sr.clear(); - m_floppy_idle = true; - - switch (command) - { - case 0: - m_fdc->soft_reset(); - break; - - // 3 bytes - case 4: - break; - - // 1 byte -- get status? - case 5: - m_floppy_mcu_sr.enqueue(0x00); - if (m_flop0->get_device()->exists()) - m_floppy_mcu_sr.enqueue( m_flop0->get_device()->idx_r() ? 0x08 : 0); - else - m_floppy_mcu_sr.enqueue(0x08); - break; - - // 3 bytes, no return -- engage head - case 6: - m_floppy_mcu_cr.dequeue(); - i = m_floppy_mcu_cr.dequeue(); - m_floppy_hdl = i; - break; - - // 1 byte -- read head engage signal - case 7: - m_floppy_mcu_sr.enqueue(0x00); - m_floppy_mcu_sr.enqueue(m_floppy_hdl); - break; - - // 3 bytes - case 8: - break; - - // 4 bytes -- used by cp/m. drive select? - case 0xc: - break; - - // 1 byte -- get drive ready status? - case 0xd: - m_floppy_mcu_sr.enqueue(0x00); - i = 0; - if (m_flop0->get_device()->exists()) - i |= m_flop0->get_device()->ready_r() ? 0 : 0x40; - if (m_flop1->get_device()->exists()) - i |= m_flop1->get_device()->ready_r() ? 0 : 0x80; - m_floppy_mcu_sr.enqueue(i); - break; - - // 3 bytes, no return -- recalibrate? - case 0xe: - m_floppy_mcu_cr.dequeue(); - i = m_floppy_mcu_cr.dequeue(); -#if 1 - if (i & 1) - m_fdc->set_floppy(m_flop0->get_device()); - else if (i & 2) - m_fdc->set_floppy(m_flop1->get_device()); -#endif - break; - - // 1 byte - case 0x13: - break; - - // 1 byte - case 0x15: - break; - } - - m_floppy_mcu_cr.clear(); - m_floppy_mcu_cr_fifo = 0; - - return data; -} - -WRITE8_MEMBER(ibm6580_state::floppy_w) -{ - LOG("Floppy %02x <- %02x\n", 0x8150 + (offset << 1), data); - - switch (offset) - { - case 0: // 8150 -- mcu reset? - m_floppy_mcu_sr.enqueue(0x00); - m_floppy_mcu_sr.enqueue(0x00); - break; - - case 1: // 8152 - m_fdc->soft_reset(); - break; - - case 5: // 815A - m_fdc->fifo_w(data); - if (m_floppy_idle) - m_floppy_idle = false; - break; - - case 6: // 815C - m_floppy_mcu_cr.enqueue(data); - m_floppy_mcu_cr_fifo++; - if (floppy_mcu_cr_full()) - floppy_mcu_command(); - break; - } -} - -READ8_MEMBER(ibm6580_state::floppy_r) -{ - uint8_t data = 0; - - switch (offset) - { - case 0: // 8150 - // bit 4 -- ?? ready - // bit 5 -- mcu busy - // bit 6 -- ?? idle - if (m_floppy_mcu_sr.empty() && (m_floppy_idle || m_floppy_intrq)) - data |= 0x40; - break; - - case 4: // 8158 - data = m_fdc->msr_r(); - break; - - case 5: // 815a - data = m_fdc->fifo_r(); - break; - - case 6: // 815c - if (!m_floppy_mcu_sr.empty()) - data = m_floppy_mcu_sr.dequeue(); - break; - } - - if (offset) - LOG("Floppy %02x == %02x\n", 0x8150 + (offset << 1), data); - else { - floppy_image_device *f = m_flop0->get_device(); - - if (f) - LOG("Floppy %02x == %02x (empty %d hdl %d + idle %d irq %d drq %d + dskchg %d idx %d cyl %d)\n", - 0x8150 + (offset << 1), data, - m_floppy_mcu_sr.empty(), m_floppy_hdl, - m_floppy_idle, m_fdc->get_irq(), m_fdc->get_drq(), - f->dskchg_r(), f->idx_r(), f->get_cyl()); - else - LOG("Floppy %02x == %02x (idle %d irq %d drq %d)\n", - 0x8150 + (offset << 1), data, - m_floppy_idle, m_fdc->get_irq(), m_fdc->get_drq()); - } - - return data; -} - - -void ibm6580_state::ibm6580_mem(address_map &map) -{ - map.unmap_value_high(); - map(0x90000, 0x90001).w(FUNC(ibm6580_state::unk_latch_w)); - map(0xef000, 0xeffff).ram().share("videoram"); // 66-line vram starts at 0xec000 - map(0xfc000, 0xfffff).rom().region("user1", 0); -} - -void ibm6580_state::ibm6580_io(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x0007).rw(m_pic8259, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); - map(0x0008, 0x000f).w(FUNC(ibm6580_state::pic_latch_w)); - map(0x0010, 0x0017).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff); - map(0x0020, 0x003f).rw(m_dma8257, FUNC(i8257_device::read), FUNC(i8257_device::write)).umask16(0x00ff); - map(0x0040, 0x005f).rw(FUNC(ibm6580_state::p40_r), FUNC(ibm6580_state::p40_w)).umask16(0x00ff); - map(0x0070, 0x007f).unmaprw(); - map(0x0120, 0x0127).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff); - map(0x0140, 0x0143).rw("upd8251a", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); - map(0x0160, 0x0163).rw("upd8251b", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff); - map(0x4000, 0x400f).unmaprw(); - map(0x5000, 0x500f).unmaprw(); - map(0x6000, 0x601f).unmaprw(); - map(0x8060, 0x807f).unmaprw(); - map(0x8150, 0x815f).rw(FUNC(ibm6580_state::floppy_r), FUNC(ibm6580_state::floppy_w)).umask16(0x00ff); // HLE of floppy board - map(0x81a0, 0x81af).unmaprw(); - map(0xc000, 0xc00f).unmaprw(); - map(0xe000, 0xe02f).rw(FUNC(ibm6580_state::video_r), FUNC(ibm6580_state::video_w)).umask16(0x00ff); -} - - -/* Input ports */ -static INPUT_PORTS_START( ibm6580 ) - PORT_START("DUMP") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Memory Record") PORT_CODE(KEYCODE_PRTSCR) PORT_CHAR(UCHAR_MAMEKEY(PRTSCR)) -INPUT_PORTS_END - - -uint32_t ibm6580_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - uint8_t y,ra,gfx,fg,bg,chr,attr; - uint16_t sy=0,ma=25,x,ca; - - fg = 1; bg = 0; - - for (y = 0; y < 25; y++) - { - for (ra = 0; ra < 16; ra++) - { - uint16_t *p = &bitmap.pix16(sy++); - - // graphics mode - if (m_p_videoram[ma] & 0x100) { - for (x = ma; x < ma + 80; x++) - { - chr = m_p_videoram[x]; - attr = m_p_videoram[x] >> 8; - - switch (ra >> 1) - { - case 0: - gfx = gfx_expand[chr & 15]; - break; - - case 2: - gfx = gfx_expand[chr >> 4]; - break; - - case 4: - gfx = gfx_expand[attr & 15]; - break; - - case 6: - gfx = gfx_expand[attr >> 4]; - break; - - default: - gfx = 0; - break; - } - - /* Display a scanline of a character */ - for (int i = 7; i >= 0; i--) - { - *p++ = BIT(gfx, i) ? fg : bg; - } - } - } else { - // text mode - for (x = ma; x < ma + 80; x++) - { - chr = m_p_videoram[x]; - attr = m_p_videoram[x] >> 8; - ca = (chr<<4); - - // font 2 - if (attr & 0x02) - ca += 0x1000; -#if 0 - // superscript - if (attr & 0x20) - ca |= (ra < 13) ? ra + 3 : 0; - // subscript - if (attr & 0x20) - ca |= (ra > 2) ? ra - 3 : 0; -#endif - - // underline - if (attr & 0x08 && ra == 13) - gfx = 0xff; - else - gfx = m_p_chargen[ca | ra]; - - // cursor - if (attr & 0x04 && ra == 14) - gfx = 0xff; - else - gfx = m_p_chargen[ca | ra]; - - // reverse video - if (attr & 0x10) - gfx ^= 255; - - // intense - if (attr & 0x04) - fg = 2; - else - fg = 1; - - /* Display a scanline of a character */ - for (int i = 7; i >= 0; i--) - { - *p++ = BIT(gfx, i) ? fg : bg; - } - } - } - } - ma+=80; - } - return 0; -} - - -void ibm6580_state::machine_start() -{ - address_space &program = m_maincpu->space(AS_PROGRAM); - - program.install_readwrite_bank(0, m_ram->size() - 1, "bank10"); - membank("bank10")->set_base(m_ram->pointer()); - - m_fdc->set_rate(500000); // XXX workaround -} - -void ibm6580_state::machine_reset() -{ - m_p40 = m_p50 = m_e000 = m_ppi_c = m_floppy_sr = 0; - m_kb_data_bit = false; - m_floppy_idle = true; - m_kb_fifo.clear(); - - m_pit8253->set_clockin(0, 0.0); - - if (ioport("DUMP")->read()) - m_p40 |= 4; - - m_flop0->get_device()->mon_w(!m_flop0->get_device()->exists()); - m_flop1->get_device()->mon_w(!m_flop1->get_device()->exists()); - m_fdc->set_floppy(m_flop0->get_device()); - m_floppy_mcu_sr.clear(); - m_floppy_mcu_cr.clear(); - m_floppy_mcu_cr_fifo = 0; -} - -void ibm6580_state::video_start() -{ - memset(m_p_videoram, 0x0, 0x1000); -} - -static void dw_floppies(device_slot_interface &device) -{ - device.option_add("8sssd", IBM_6360); -} - -void ibm6580_state::ibm6580(machine_config &config) -{ - I8086(config, m_maincpu, 14.7456_MHz_XTAL / 3); - m_maincpu->set_addrmap(AS_PROGRAM, &ibm6580_state::ibm6580_mem); - m_maincpu->set_addrmap(AS_IO, &ibm6580_state::ibm6580_io); - m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb)); - - RAM(config, RAM_TAG).set_default_size("128K").set_extra_options("160K,192K,224K,256K,320K,384K"); - - SCREEN(config, m_screen, SCREEN_TYPE_RASTER, rgb_t::green()); - m_screen->set_raw(25_MHz_XTAL / 2, 833, 0, 640, 428, 0, 400); - m_screen->set_screen_update(FUNC(ibm6580_state::screen_update)); - m_screen->set_palette("palette"); - m_screen->screen_vblank().set(FUNC(ibm6580_state::vblank_w)); - - config.set_default_layout(layout_ibm6580); - - PALETTE(config, "palette", palette_device::MONOCHROME_HIGHLIGHT); - - PIC8259(config, m_pic8259, 0); - m_pic8259->out_int_callback().set_inputline(m_maincpu, 0); - - i8255_device &ppi(I8255(config, "ppi8255")); - ppi.in_pa_callback().set(FUNC(ibm6580_state::ppi_a_r)); - ppi.out_pb_callback().set(FUNC(ibm6580_state::led_w)); - ppi.out_pc_callback().set(FUNC(ibm6580_state::ppi_c_w)); - ppi.in_pc_callback().set(FUNC(ibm6580_state::ppi_c_r)); - - PIT8253(config, m_pit8253, 0); - - DW_KEYBOARD(config, m_kbd, 0); - m_kbd->out_data_handler().set(FUNC(ibm6580_state::kb_data_w)); - m_kbd->out_clock_handler().set(FUNC(ibm6580_state::kb_clock_w)); - m_kbd->out_strobe_handler().set(FUNC(ibm6580_state::kb_strobe_w)); - m_kbd->out_strobe_handler().append(m_ppi8255, FUNC(i8255_device::pc4_w)); - - I8257(config, m_dma8257, 14.7456_MHz_XTAL / 3); - m_dma8257->out_hrq_cb().set(FUNC(ibm6580_state::hrq_w)); - m_dma8257->out_tc_cb().set(m_fdc, FUNC(upd765a_device::tc_line_w)); - m_dma8257->in_memr_cb().set(FUNC(ibm6580_state::memory_read_byte)); - m_dma8257->out_memw_cb().set(FUNC(ibm6580_state::memory_write_byte)); - m_dma8257->in_ior_cb<0>().set(m_fdc, FUNC(upd765a_device::dma_r)); - m_dma8257->out_iow_cb<0>().set(m_fdc, FUNC(upd765a_device::dma_w)); - - UPD765A(config, m_fdc, 24_MHz_XTAL / 3, false, false); - m_fdc->intrq_wr_callback().set(FUNC(ibm6580_state::floppy_intrq)); -// m_fdc->intrq_wr_callback().append(m_pic8259, FUNC(pic8259_device::ir4_w)); - m_fdc->drq_wr_callback().set(m_dma8257, FUNC(i8257_device::dreq0_w)); - FLOPPY_CONNECTOR(config, UPD765_TAG ":0", dw_floppies, "8sssd", floppy_image_device::default_floppy_formats); - FLOPPY_CONNECTOR(config, UPD765_TAG ":1", dw_floppies, "8sssd", floppy_image_device::default_floppy_formats); - - i8251_device &upd8251a(I8251(config, "upd8251a", 0)); - upd8251a.txd_handler().set("rs232a", FUNC(rs232_port_device::write_txd)); - upd8251a.dtr_handler().set("rs232a", FUNC(rs232_port_device::write_dtr)); - upd8251a.rts_handler().set("rs232a", FUNC(rs232_port_device::write_rts)); - upd8251a.rxrdy_handler().set(m_pic8259, FUNC(pic8259_device::ir2_w)); - upd8251a.txrdy_handler().set(m_pic8259, FUNC(pic8259_device::ir2_w)); - - rs232_port_device &rs232a(RS232_PORT(config, "rs232a", default_rs232_devices, nullptr)); - rs232a.rxd_handler().set("upd8251a", FUNC(i8251_device::write_rxd)); - rs232a.dsr_handler().set("upd8251a", FUNC(i8251_device::write_dsr)); - rs232a.cts_handler().set("upd8251a", FUNC(i8251_device::write_cts)); - - i8251_device &upd8251b(I8251(config, "upd8251b", 0)); - upd8251b.txd_handler().set("rs232b", FUNC(rs232_port_device::write_txd)); - upd8251b.dtr_handler().set("rs232b", FUNC(rs232_port_device::write_dtr)); - upd8251b.rts_handler().set("rs232b", FUNC(rs232_port_device::write_rts)); - upd8251b.rxrdy_handler().set(m_pic8259, FUNC(pic8259_device::ir2_w)); - upd8251b.txrdy_handler().set(m_pic8259, FUNC(pic8259_device::ir2_w)); - - rs232_port_device &rs232b(RS232_PORT(config, "rs232b", default_rs232_devices, nullptr)); - rs232b.rxd_handler().set("upd8251b", FUNC(i8251_device::write_rxd)); - rs232b.dsr_handler().set("upd8251b", FUNC(i8251_device::write_dsr)); - rs232b.cts_handler().set("upd8251b", FUNC(i8251_device::write_cts)); - - SOFTWARE_LIST(config, "flop_list").set_original("ibm6580"); -} - -/* ROM definition */ -ROM_START( ibm6580 ) - ROM_REGION16_LE( 0x4000, "user1", 0 ) - ROM_DEFAULT_BIOS("old") - - ROM_SYSTEM_BIOS(0, "old", "old bios - 1981") - ROMX_LOAD("8493823_8k.bin", 0x0001, 0x2000, CRC(aa5524c0) SHA1(9938f2a82828b17966cb0be7fdbf73803c1f10d3), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD("8493822_8k.bin", 0x0000, 0x2000, CRC(90e7e73a) SHA1(d3ee7a4d2cb8f4920b5d95e8c7f4fef06599d24e), ROM_SKIP(1) | ROM_BIOS(0)) - - ROM_SYSTEM_BIOS(1, "new", "new bios - 1983?") - // was downloaded via DDT86 - ROMX_LOAD( "dwrom16kb.bin", 0x0000, 0x4000, BAD_DUMP CRC(ced87929) SHA1(907a46f288809bc93a1f59f3fbef18bd44be42d9), ROM_BIOS(1)) - - ROM_REGION( 0x2000, "chargen", 0 ) - ROM_LOAD( "8493383_chr.bin", 0x0000, 0x2000, CRC(779044df) SHA1(95ec46f9edf4d44c5dd3c955c73e00754d58e180)) -ROM_END - -/* Driver */ - -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -COMP( 1980, ibm6580, 0, 0, ibm6580, ibm6580, ibm6580_state, empty_init, "IBM", "IBM 6580 Displaywriter", MACHINE_IS_SKELETON) |