diff --git a/src/mame/ibm/ibm5550.cpp b/src/mame/ibm/ibm5550.cpp new file mode 100644 index 00000000000..dbad5ede876 --- /dev/null +++ b/src/mame/ibm/ibm5550.cpp @@ -0,0 +1,201 @@ +// license:BSD-3-Clause +// copyright-holders: Angelo Salese +/************************************************************************************************** + +IBM 5550 + +http://ibm5550.na.coocan.jp/architec-e.html + +TODO: +- No available documentation +\- it's barely known that it uses a specific "JDA" video adapter, and that it uses a specific + incompatible bus slot; + +**************************************************************************************************/ + +#include "emu.h" + +//#include "bus/isa/isa.h" +//#include "bus/isa/isa_cards.h" +#include "bus/pc_kbd/keyboards.h" +#include "bus/pc_kbd/pc_kbdc.h" +#include "cpu/i86/i86.h" +#include "machine/am9517a.h" +#include "machine/i8251.h" +//#include "machine/i8255.h" +#include "machine/i8257.h" +#include "machine/pic8259.h" +#include "machine/pit8253.h" +#include "machine/ram.h" +#include "machine/upd765.h" +#include "video/mc6845.h" + +#include "emupal.h" +#include "screen.h" + +class ibm5550_state : public driver_device +{ +public: + ibm5550_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_pit(*this, "pit") + , m_pic(*this, "pic") + , m_dma(*this, "dma") + , m_crtc(*this, "crtc") + , m_screen(*this, "screen") + { } + + void ibm5550(machine_config &config); + +private: + required_device m_maincpu; + required_device m_pit; + required_device m_pic; + required_device m_dma; + required_device m_crtc; + required_device m_screen; + + void main_map(address_map &map); + void main_io(address_map &map); + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + u8 m_a0_unk = 0; +}; + +uint32_t ibm5550_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + return 0; +} + +void ibm5550_state::main_map(address_map &map) +{ + map.unmap_value_high(); + map(0x00000, 0x3ffff).ram(); // 256 or 512KB + // POST test $f6 expects that all the blocks between $4c000-$ec000 returns 0xff + map(0xfc000, 0xfffff).rom().region("ipl", 0); +} + +void ibm5550_state::main_io(address_map &map) +{ + map.unmap_value_high(); +// map(0x00?0, 0x00?7).rw(m_dma, FUNC(am9517a_device::read), FUNC(am9517a_device::write)); + map(0x0020, 0x0021).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); + + // tested later, with bit 6 irq from PIC +// map(0x0040, 0x0047).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); + + // bit 0 on will punt before testing for $20-$21, + // but will be required on after $4c-$ec RAM holes above + // ... RAM bank? + map(0x00a0, 0x00a0).lrw8( + NAME([this] (offs_t offset) { return m_a0_unk; }), + NAME([this] (offs_t offset, u8 data) { + logerror("$a0 %02x\n", data); + m_a0_unk = BIT(data, 6); + }) + ); +// map(0x00a1, 0x00a1) LED write? + map(0x00a2, 0x00a2).lw8( + NAME([this] (offs_t offset, u8 data) { + logerror("$a2 %02x\n", data); + m_a0_unk = 0; + }) + ); + + map(0x3d0, 0x3d0).rw(m_crtc, FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w)); + map(0x3d1, 0x3d1).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); +} + +static INPUT_PORTS_START( ibm5550 ) +INPUT_PORTS_END + +void ibm5550_state::ibm5550(machine_config &config) +{ + I8086(config, m_maincpu, XTAL(16'000'000) / 2); // driven by a TD308C/TD1100C @ 16MHz + m_maincpu->set_addrmap(AS_PROGRAM, &ibm5550_state::main_map); + m_maincpu->set_addrmap(AS_IO, &ibm5550_state::main_io); + m_maincpu->set_irq_acknowledge_callback(m_pic, FUNC(pic8259_device::inta_cb)); + + // i8087 socket + + // iDB284A + // MN2364SPM + // MN2364SPN + // IBM6343868 / MN50015SPE + // IBM6343871 / MN50015SPH + // IBM6343866 / MN50015SPC + // IBM6343867 / MN50015SPD + // D8039LC + // iP8237A-5 + AM9517A(config, m_dma, XTAL(5'000'000)); + + // D765AC + SED9420C + // HM6116LP-2 + // D7261AD + // D8259AC-2 + PIC8259(config, m_pic); + m_pic->out_int_callback().set_inputline(m_maincpu, 0); + + // D8253C-2 + PIT8253(config, m_pit, 0); + + // Parallel port, 36 pins + // keyboard connector + // TEST switch + LED + + // JDA display board + + // CX0-043C @ 40 MHz + // HD46505SP-2 + HD6845S(config, m_crtc, XTAL(40'000'000)); + m_crtc->set_screen(m_screen); +// m_crtc->set_show_border_area(true); + m_crtc->set_char_width(8); + + // IBM6343870 / MN50015SPG + // IBM6343869 / MN50007SPF + // x2 HM6116P-2 + + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_refresh_hz(60); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + m_screen->set_screen_update(FUNC(ibm5550_state::screen_update)); + m_screen->set_size(1280, 1024); + m_screen->set_visarea(0, 1023, 0, 767); + m_screen->set_palette("palette"); + + PALETTE(config, "palette", palette_device::MONOCHROME_HIGHLIGHT); + + + +// ibm5160_mb_device &mb(IBM5160_MOTHERBOARD(config, "mb")); +// mb.set_cputag(m_maincpu); +// mb.int_callback().set_inputline(m_maincpu, 0); +// mb.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); +// mb.kbdclk_callback().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); +// mb.kbddata_callback().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); +// mb.set_input_default(DEVICE_INPUT_DEFAULTS_NAME(pccga)); + + // FIXME: determine ISA bus clock +// ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "cga", false); +// ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false); +// ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "lpt", false); +// ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, "com", false); + + /* keyboard */ +// pc_kbdc_device &kbd(PC_KBDC(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)); +// kbd.out_clock_cb().set("mb", FUNC(ibm5160_mb_device::keyboard_clock_w)); +// kbd.out_data_cb().set("mb", FUNC(ibm5160_mb_device::keyboard_data_w)); + + /* internal ram */ +// RAM(config, RAM_TAG).set_default_size("256K").set_extra_options("512K"); +} + +ROM_START( ibm5550 ) + ROM_REGION16_LE(0x4000, "ipl", 0) + ROM_LOAD("ipl5550.rom", 0x0000, 0x4000, CRC(40cf34c9) SHA1(d41f77fdfa787b0e97ed311e1c084b8699a5b197)) +ROM_END + +COMP( 1983, ibm5550, 0, 0, ibm5550, ibm5550, ibm5550_state, empty_init, "International Business Machines", "Multistation 5550", MACHINE_IS_SKELETON ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index f578161e9e0..6dc66627159 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -19572,6 +19572,9 @@ husky // DVW Husky @source:ibm/ibm3153.cpp ibm3153 // +@source:ibm/ibm5550.cpp +ibm5550 // + @source:ibm/ibm6580.cpp ibm6580 // @@ -35506,7 +35509,6 @@ eppc // 1985 Ericsson Portable PC hyo88t // Hyosung Topstar 88T hyu16t // Hyundai Super 16 T hyu16te // Hyundai Super 16 TE -ibm5550 // iskr3104 // ittxtra // 1984 ITT XTRA juko8 // JUKO NEST motherboards with 8088/V20 CPU diff --git a/src/mame/pc/pc.cpp b/src/mame/pc/pc.cpp index b9b0d7e6860..c3b3a123ed1 100644 --- a/src/mame/pc/pc.cpp +++ b/src/mame/pc/pc.cpp @@ -65,7 +65,6 @@ public: void zenith(machine_config &config); void eagle1600(machine_config &config); void laser_turbo_xt(machine_config &config); - void ibm5550(machine_config &config); void comport(machine_config &config); void mpc1600(machine_config &config); void ittxtra(machine_config &config); @@ -86,15 +85,12 @@ public: private: required_device m_maincpu; - u8 unk_r(); - double m_turbo_off_speed = 0; static void cfg_dual_720K(device_t *device); static void cfg_single_360K(device_t *device); static void cfg_single_720K(device_t *device); - void ibm5550_io(address_map &map); void pc16_io(address_map &map); void pc16_map(address_map &map); void pc8_io(address_map &map); @@ -128,11 +124,6 @@ void pc_state::pc16_io(address_map &map) map(0x0070, 0x007f).ram(); // needed for Poisk-2 } -u8 pc_state::unk_r() -{ - return 0; -} - INPUT_CHANGED_MEMBER(pc_state::pc_turbo_callback) { m_maincpu->set_clock_scale((newval & 2) ? 1 : m_turbo_off_speed); @@ -684,57 +675,6 @@ ROM_START( eppc ) ROM_END -/***************************************************************** IBM 5550 *** - -Information can be found at http://homepage3.nifty.com/ibm5550/index-e.html -It's a heavily modified IBM PC-XT machine, with a completely different -video HW too. - -******************************************************************************/ - -void pc_state::ibm5550_io(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x00ff).m("mb", FUNC(ibm5160_mb_device::map)); - map(0x00a0, 0x00a0).r(FUNC(pc_state::unk_r)); -} - -void pc_state::ibm5550(machine_config &config) -{ - /* basic machine hardware */ - i8086_cpu_device &maincpu(I8086(config, "maincpu", 8000000)); - maincpu.set_addrmap(AS_PROGRAM, &pc_state::pc16_map); - maincpu.set_addrmap(AS_IO, &pc_state::ibm5550_io); - maincpu.set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb)); - - ibm5160_mb_device &mb(IBM5160_MOTHERBOARD(config, "mb")); - mb.set_cputag(m_maincpu); - mb.int_callback().set_inputline(m_maincpu, 0); - mb.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); - mb.kbdclk_callback().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); - mb.kbddata_callback().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); - mb.set_input_default(DEVICE_INPUT_DEFAULTS_NAME(pccga)); - - // FIXME: determine ISA bus clock - ISA8_SLOT(config, "isa1", 0, "mb:isa", pc_isa8_cards, "cga", false); - ISA8_SLOT(config, "isa2", 0, "mb:isa", pc_isa8_cards, "fdc_xt", false); - ISA8_SLOT(config, "isa3", 0, "mb:isa", pc_isa8_cards, "lpt", false); - ISA8_SLOT(config, "isa4", 0, "mb:isa", pc_isa8_cards, "com", false); - - /* keyboard */ - pc_kbdc_device &kbd(PC_KBDC(config, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)); - kbd.out_clock_cb().set("mb", FUNC(ibm5160_mb_device::keyboard_clock_w)); - kbd.out_data_cb().set("mb", FUNC(ibm5160_mb_device::keyboard_data_w)); - - /* internal ram */ - RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K"); -} - -ROM_START( ibm5550 ) - ROM_REGION16_LE(0x10000,"bios", 0) - ROM_LOAD("ipl5550.rom", 0xc000, 0x4000, CRC(40cf34c9) SHA1(d41f77fdfa787b0e97ed311e1c084b8699a5b197)) -ROM_END - /***************************************************************** ITT XTRA *** Links: https://www.atarimagazines.com/creative/v10n12/71_ITT_Xtra_an_IBM_PC_compa.php @@ -2482,7 +2422,6 @@ COMP( 1989, fraking, ibm5150, 0, fraking, pccga, pc_state, COMP( 198?, hyo88t, ibm5150, 0, pccga, pccga, pc_state, empty_init, "Hyosung", "Topstar 88T", MACHINE_NOT_WORKING ) COMP( 1986, hyu16t, ibm5150, 0, pccga, pccga, pc_state, empty_init, "Hyundai", "Super 16 T", MACHINE_NOT_WORKING ) COMP( 1987, hyu16te, ibm5150, 0, pccga, pccga, pc_state, empty_init, "Hyundai", "Super 16 TE", MACHINE_NOT_WORKING ) -COMP( 1983, ibm5550, ibm5150, 0, ibm5550, pccga, pc_state, empty_init, "International Business Machines", "5550", MACHINE_NOT_WORKING ) COMP( 1984, ittxtra, ibm5150, 0, pccga, pccga, pc_state, empty_init, "ITT Information Systems", "ITT XTRA", MACHINE_NOT_WORKING ) COMP( 198?, juko8, ibm5150, 0, pccga, pccga, pc_state, empty_init, "JUKO", "NEST 8088 and V20", MACHINE_NOT_WORKING ) COMP( 198?, juko16, ibm5150, 0, juko16, pccga, pc_state, empty_init, "JUKO", "NEST 8086 and V30", MACHINE_NOT_WORKING )