diff --git a/src/mame/drivers/dct11em.cpp b/src/mame/drivers/dct11em.cpp index 29f03b71d49..8888129d6be 100644 --- a/src/mame/drivers/dct11em.cpp +++ b/src/mame/drivers/dct11em.cpp @@ -1,17 +1,28 @@ // license:BSD-3-Clause -// copyright-holders:Miodrag Milanovic +// copyright-holders:Miodrag Milanovic,Robbbert /*************************************************************************** - DEC DCT11-EM +DEC DCT11-EM (Evaluation Module) - 03/12/2010 Skeleton driver. +2010-12-03 Skeleton driver. + + +TODO: +- user LED +- keyboard (not in manual so have to guess) +- HALT and INT buttons (to HALT and PF input lines) +- DLART device to be emulated +- hookups between DLART, UART and remaining interrupts +- rs232 terminal ****************************************************************************/ #include "emu.h" #include "cpu/t11/t11.h" -#include "emupal.h" -#include "screen.h" +#include "machine/i8251.h" +#include "machine/i8255.h" +#include "machine/clock.h" +#include "dct11em.lh" class dct11em_state : public driver_device @@ -20,77 +31,167 @@ public: dct11em_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_ppi(*this, "ppi") + , m_uart(*this, "uart") + , m_digits(*this, "digit%d", 0U) { } void dct11em(machine_config &config); private: - virtual void machine_reset() override; - virtual void video_start() override; + void machine_reset() override; + void machine_start() override; - void dct11em_mem(address_map &map); + void porta_w(u8); + void portc_w(u8); + u8 portc_r(); + void irq_encoder(u8, bool); - uint32_t screen_update_dct11em(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u8 m_seg_lower; + u8 m_seg_upper; + u8 m_portc; + u16 m_irqs; + + void mem_map(address_map &map); required_device m_maincpu; + required_device m_ppi; + required_device m_uart; + output_finder<12> m_digits; }; -void dct11em_state::dct11em_mem(address_map &map) +void dct11em_state::mem_map(address_map &map) { map.unmap_value_high(); - map(0x0000, 0x0fff).ram(); // RAM - map(0x2000, 0x2fff).ram(); // Optional RAM - map(0xa000, 0xdfff).rom(); // RAM + map(0x0000, 0x0fff).ram(); // 2x 6116 + map(0x1000, 0x1fff).noprw(); // the ram test reads/writes here even though there's no ram + map(0x2000, 0x2fff).ram(); // expansion sockets, 2x 6116 + map(0xa000, 0xdfff).rom(); + map(0xff20, 0xff27).lw8(NAME([this] (offs_t offset, u8 data) { m_ppi->write(offset>>1, data); })); + map(0xff28, 0xff2b).lw8(NAME([this] (offs_t offset, u8 data) { m_uart->write(offset>>1, data); })); + map(0xff60, 0xff67).lr8(NAME([this] (offs_t offset) { return m_ppi->read(offset>>1); })); + map(0xff68, 0xff6b).lr8(NAME([this] (offs_t offset) { return m_uart->read(offset>>1); })); + //map(0xff70, 0xff7f). // DC309 DLART unemulated device - uart to terminal } +void dct11em_state::porta_w(u8 data) +{ + m_seg_lower = data; + if (BIT(m_portc, 3)) + m_seg_upper = data; +} + +void dct11em_state::portc_w(u8 data) +{ + data &= 15; + m_portc = data; + if (BIT(data, 3)) + { + m_seg_upper = m_seg_lower; + irq_encoder(10, 0); + } + if (data < 6) + { + m_digits[data] = m_seg_lower; + m_digits[data+6] = m_seg_upper; + } + if (data == 10) + output().set_value("led0", 0); + else + if (data == 11) + output().set_value("led0", 1); +} + +u8 dct11em_state::portc_r() +{ + return 0; +} + +/* + * interrupts (p. 101) + * + * IRQ CPx Pri Vec Device + * --- --- --- --- ------ + * 15 LLLL 7 140 DLART receiver break + * 11 LHLL 6 100 External interrupt + * 10 LHLH 6 104 Keypad/LED scanning + * 7 HLLL 5 120 8251 receiver + * 6 HLLH 5 124 8251 transmitter + * 3 HHLL 4 060 DLART receiver + * 2 HHLH 4 064 DLART transmitter */ + void dct11em_state::irq_encoder(u8 irq, bool state) +{ + if (state) + m_irqs |= (1 << irq); + else + m_irqs &= ~(1 << irq); + + int i; + for (i = 15; i > 0; i--) + if (BIT(m_irqs, i)) + break; + + m_maincpu->set_input_line(t11_device::CP3_LINE, BIT(i, 3) ? ASSERT_LINE : CLEAR_LINE); + m_maincpu->set_input_line(t11_device::CP2_LINE, BIT(i, 2) ? ASSERT_LINE : CLEAR_LINE); + m_maincpu->set_input_line(t11_device::CP1_LINE, BIT(i, 1) ? ASSERT_LINE : CLEAR_LINE); + m_maincpu->set_input_line(t11_device::CP0_LINE, BIT(i, 0) ? ASSERT_LINE : CLEAR_LINE); +} + +void dct11em_state::machine_reset() +{ + m_irqs = 0; +} + +void dct11em_state::machine_start() +{ + m_digits.resolve(); + save_item(NAME(m_seg_lower)); + save_item(NAME(m_seg_upper)); + save_item(NAME(m_portc)); + save_item(NAME(m_irqs)); +} + + /* Input ports */ static INPUT_PORTS_START( dct11em ) INPUT_PORTS_END - -void dct11em_state::machine_reset() -{ -} - -void dct11em_state::video_start() -{ -} - -uint32_t dct11em_state::screen_update_dct11em(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - return 0; -} - - void dct11em_state::dct11em(machine_config &config) { /* basic machine hardware */ - T11(config, m_maincpu, 7500000); // 7.5MHz XTAL + T11(config, m_maincpu, 7'500'000); // 7.5MHz XTAL m_maincpu->set_initial_mode(0x1403); /* according to specs */ - m_maincpu->set_addrmap(AS_PROGRAM, &dct11em_state::dct11em_mem); + m_maincpu->set_addrmap(AS_PROGRAM, &dct11em_state::mem_map); - /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(50); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ - screen.set_size(640, 480); - screen.set_visarea(0, 640-1, 0, 480-1); - screen.set_screen_update(FUNC(dct11em_state::screen_update_dct11em)); - screen.set_palette("palette"); + config.set_default_layout(layout_dct11em); - PALETTE(config, "palette", palette_device::MONOCHROME); + I8255(config, m_ppi); + m_ppi->out_pa_callback().set(FUNC(dct11em_state::porta_w)); // segments + // port B - expansion interface + m_ppi->in_pc_callback().set(FUNC(dct11em_state::portc_r)); // keyboard + m_ppi->out_pc_callback().set(FUNC(dct11em_state::portc_w)); // various + + I8251(config, m_uart, 2'457'600 / 8); + // txc and rxc come from DLART pin 34 + + clock_device &inta_clock(CLOCK(config, "inta_clock", 614'400 / 768)); // 800Hz, from DLART pin 25 + inta_clock.signal_handler().set([this] (bool state) { if (state) irq_encoder(10, 1); }); + + //clock_device &dlart_clock(CLOCK(config, "dlart_clock", 7'500'000 / 4)); --> to DLART CLK pin 32 + + //clock_device &uart_clock(CLOCK(config, "uart_clock", 2'457'600 / 8)); --> to UART CLK } /* ROM definition */ ROM_START( dct11em ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) // Highest address line inverted - ROM_LOAD16_BYTE( "23-213e4.bin", 0x8000, 0x2000, CRC(bdd82f39) SHA1(347deeff77596b67eee27a39a9c40075fcf5c10d)) - ROM_LOAD16_BYTE( "23-214e4.bin", 0x8001, 0x2000, CRC(b523dae8) SHA1(cd1a64a2bce9730f7a9177d391663919c7f56073)) + ROM_LOAD16_BYTE( "23-213e4.e53", 0x8000, 0x2000, CRC(bdd82f39) SHA1(347deeff77596b67eee27a39a9c40075fcf5c10d)) + ROM_LOAD16_BYTE( "23-214e4.e45", 0x8001, 0x2000, CRC(b523dae8) SHA1(cd1a64a2bce9730f7a9177d391663919c7f56073)) ROM_COPY("maincpu", 0x8000, 0xc000, 0x2000) ROM_END /* Driver */ /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -COMP( 1983, dct11em, 0, 0, dct11em, dct11em, dct11em_state, empty_init, "Digital Equipment Corporation", "DCT11-EM", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) +COMP( 1983, dct11em, 0, 0, dct11em, dct11em, dct11em_state, empty_init, "Digital Equipment Corporation", "DCT11-EM", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/layout/dct11em.lay b/src/mame/layout/dct11em.lay new file mode 100644 index 00000000000..44c10d9acaa --- /dev/null +++ b/src/mame/layout/dct11em.lay @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +