diff options
Diffstat (limited to 'src/mame/drivers/newbrain.cpp')
-rw-r--r-- | src/mame/drivers/newbrain.cpp | 967 |
1 files changed, 0 insertions, 967 deletions
diff --git a/src/mame/drivers/newbrain.cpp b/src/mame/drivers/newbrain.cpp deleted file mode 100644 index cb17c4652b4..00000000000 --- a/src/mame/drivers/newbrain.cpp +++ /dev/null @@ -1,967 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Curt Coder - -/* - - NewBrain - Grundy Business Systems Ltd. - - 32K RAM - 28K ROM - - Z80 @ 2MHz - COP420 @ 2MHz - - Z80 @ 4MHz (416): INT/NMI=+5V, WAIT=EXTBUSRQ|BUSAKD, RESET=_FDC RESET, - NEC 765AC @ 4 MHz (418) - MC6850 ACIA (459) - Z80CTC (458) - ADC0809 (427) - DAC0808 (461) - - Models according to the Software Technical Manual: - - Model M: 'Page Register', Expansion Port onto Z80 bus, Video, ACIA/CTC, User Port - Model A: Expansion Port, Video, no User Port but has software driver serial port - s/w Printer, s/w V24 - Model V: ACIA/CTC, User Port - -*/ - -/* - - TODO: - - - COPINT @ 84Hz instead of 50Hz? (with clock 3240506 is 50Hz) - - CLKINT arrives too late and COP reads the VFD data before CPU writes it - - VFD does not receive data from main CPU - - bitmapped video - - accurate video timing - - cassette motor control seems to have a COP cpu problem - - EIM - - floppy - - CP/M 2.2 ROMs - - localized ROM sets - - Micropage ROM/RAM card - - Z80 PIO board - - peripheral (PI) box - - sound card - -*/ - -#include "emu.h" -#include "includes/newbrain.h" -#include "speaker.h" -#include "screen.h" - -#include "newbrain.lh" -#include "newbraina.lh" - - - -//************************************************************************** -// MACROS / CONSTANTS -//************************************************************************** - -#define LOG_COP (1 << 1U) -#define LOG_VFD (1 << 2U) -#define VERBOSE 0 -#include "logmacro.h" - - - -//************************************************************************** -// IMPLEMENTATION -//************************************************************************** - -//------------------------------------------------- -// check_interrupt - -//------------------------------------------------- - -void newbrain_state::check_interrupt() -{ - int level = ((!m_clk && !m_clkint) || !m_copint) ? ASSERT_LINE : CLEAR_LINE; - - m_maincpu->set_input_line(INPUT_LINE_IRQ0, level); -} - - -//------------------------------------------------- -// mreq_r - memory request read -//------------------------------------------------- - -uint8_t newbrain_state::mreq_r(offs_t offset) -{ - bool romov = 1, raminh = 0; - int exrm = 0; - uint8_t data = m_exp->mreq_r(offset, 0xff, romov, exrm, raminh); - - int rom0 = 1, rom1 = 1, rom2 = 1; - int a15_14_13 = romov ? (offset >> 13) : exrm; - if (!m_pwrup) a15_14_13 = 7; - int a15g = BIT(a15_14_13, 2); - - switch (a15_14_13) - { - case 5: rom0 = 0; break; - case 6: rom1 = 0; break; - case 7: rom2 = 0; break; - } - - if (!a15g && !raminh) - { - data = m_ram->pointer()[offset]; - } - - if (!rom0) - { - data = m_rom->base()[0x0000 + (offset & 0x1fff)]; - } - - if (!rom1) - { - data = m_rom->base()[0x2000 + (offset & 0x1fff)]; - } - - if (!rom2) - { - data = m_rom->base()[0x4000 + (offset & 0x1fff)]; - } - - return data; -} - - -//------------------------------------------------- -// mreq_w - memory request write -//------------------------------------------------- - -void newbrain_state::mreq_w(offs_t offset, uint8_t data) -{ - bool romov = 1, raminh = 0; - int exrm = 0; - m_exp->mreq_w(offset, data, romov, exrm, raminh); - - int a15_14_13 = romov ? (offset >> 13) : exrm; - if (!m_pwrup) a15_14_13 = 7; - int a15g = BIT(a15_14_13, 2); - - if (!a15g && !raminh) - { - m_ram->pointer()[offset] = data; - } -} - - -//------------------------------------------------- -// iorq_r - I/O request read -//------------------------------------------------- - -uint8_t newbrain_state::iorq_r(offs_t offset) -{ - bool prtov = 0; - uint8_t data = m_exp->iorq_r(offset, 0xff, prtov); - - if (!prtov) - { - switch ((offset >> 2) & 0x07) - { - case 1: // EXP1 - switch (offset & 0x03) - { - case 0: // CLCLK - clclk(); - break; - - case 2: // COP - data = m_cop->microbus_rd(); - break; - } - break; - - case 5: // UST - if (BIT(offset, 1)) - { - data = ust_b_r(); - } - else - { - data = ust_a_r(); - } - break; - } - } - - return data; -} - - -//------------------------------------------------- -// iorq_w - I/O request write -//------------------------------------------------- - -void newbrain_state::iorq_w(offs_t offset, uint8_t data) -{ - bool prtov = 0; - m_exp->iorq_w(offset, 0xff, prtov); - - if (!prtov) - { - switch ((offset >> 2) & 0x07) - { - case 1: // EXP1 - switch (offset & 0x03) - { - case 0: // CLCLK - clclk(); - break; - - case 2: // COP - m_cop->microbus_wr(data); - break; - - case 3: // ENRG1 - enrg_w(data); - break; - } - break; - - case 2: // TVL - tvl(data, BIT(offset, 6)); - break; - - case 3: // TVTL - tvtl_w(data); - break; - } - } -} - - -//------------------------------------------------- -// clclk - clear clock interrupt -//------------------------------------------------- - -void newbrain_state::clclk() -{ - LOG("%s %s CLCLK\n", machine().time().as_string(), machine().describe_context()); - - m_clkint = 1; - check_interrupt(); -} - - -//------------------------------------------------- -// enrg_w - -//------------------------------------------------- - -void newbrain_state::enrg_w(uint8_t data) -{ - /* - - bit signal - - 0 _CLK - 1 - 2 TVP - 3 - 4 _RTSD - 5 DO - 6 - 7 PO - - */ - - LOG("%s %s ENRG %02x\n", machine().time().as_string(), machine().describe_context(), data); - - // clock enable - int clk = BIT(data, 0); - - if (m_clk != clk) { - m_clk = clk; - check_interrupt(); - } - - // TV enable - m_tvp = BIT(data, 2); - - // V24 - m_rs232_v24->write_rts(BIT(data, 4)); - m_rs232_v24->write_txd(BIT(data, 5)); - - // printer - m_rs232_prn->write_txd(BIT(data, 7)); -} - - -//------------------------------------------------- -// ust_r - -//------------------------------------------------- - -uint8_t newbrain_state::ust_a_r() -{ - /* - - bit signal - - 0 +5V - 1 PWRUP - 2 - 3 - 4 - 5 _CLKINT - 6 - 7 _COPINT - - */ - - uint8_t data = 0x5d; - - // powered up - data |= m_pwrup << 1; - - // interrupts - data |= m_clkint << 5; - data |= m_copint << 7; - - return data; -} - - -//------------------------------------------------- -// user_r - -//------------------------------------------------- - -uint8_t newbrain_state::ust_b_r() -{ - /* - - bit signal - - 0 RDDK - 1 _CTSD - 2 - 3 - 4 - 5 TPIN - 6 - 7 _CTSP - - */ - - uint8_t data = 0x5c; - - // V24 - data |= m_rs232_v24->rxd_r(); - data |= m_rs232_v24->cts_r() << 1; - - // tape - data |= tpin() << 5; - - // printer - data |= m_rs232_prn->cts_r() << 7; - - return data; -} - - -//------------------------------------------------- -// cop_in_r - -//------------------------------------------------- - -uint8_t newbrain_state::cop_in_r() -{ - /* - - bit description - - IN0 K8 (CD4076 Q2) - IN1 _RD - IN2 _COP - IN3 _WR - - */ - - uint8_t data = 0xe; - - // keyboard - data |= BIT(m_403_q, 2); - - LOGMASKED(LOG_COP, "%s %s IN %01x\n", machine().time().as_string(), machine().describe_context(), data); - - return data; -} - - -//------------------------------------------------- -// cop_g_r - -//------------------------------------------------- - -uint8_t newbrain_state::cop_g_r() -{ - /* - - bit description - - G0 - G1 K9 (CD4076 Q1) - G2 K7 (CD4076 Q0) - G3 K3 (CD4076 Q3) - - */ - - uint8_t data = 0; - - // keyboard - data |= BIT(m_403_q, 1) << 1; - data |= BIT(m_403_q, 0) << 2; - data |= BIT(m_403_q, 3) << 3; - - LOGMASKED(LOG_COP, "%s %s G %01x\n", machine().time().as_string(), machine().describe_context(), data); - - return data; -} - - -//------------------------------------------------- -// cop_g_w - -//------------------------------------------------- - -// m_cop_g1 and m_cop_g3, when activated, have 20 zeros and a 1 in a continuous sequence. -// m_cop_k6 randomly alternates between 0 and 1, spending more time at 1. -// The outcome is the cassette is unreadable. -// Therefore the motors are left permanently on until the above issues can be fixed. -void newbrain_state::tm() -{ -// cassette_state tm1 = (!m_cop_g1 && !m_cop_k6) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED; -// cassette_state tm2 = (!m_cop_g3 && !m_cop_k6) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED; - -// m_cassette1->change_state(tm1, CASSETTE_MASK_MOTOR); -// m_cassette2->change_state(tm2, CASSETTE_MASK_MOTOR); -} - -void newbrain_state::cop_g_w(uint8_t data) -{ - /* - - bit description - - G0 _COPINT - G1 _TM1 - G2 - G3 _TM2 - - */ - - int copint = !BIT(data, 0); - - LOGMASKED(LOG_COP, "%s %s COPINT %u\n", machine().time().as_string(), machine().describe_context(), copint); - - if (m_copint != copint) - { - m_copint = copint; - check_interrupt(); - } - - m_cop_g1 = BIT(data, 1); - m_cop_g3 = BIT(data, 3); - tm(); -} - - -//------------------------------------------------- -// cop_d_w - -//------------------------------------------------- - -void newbrain_state::cop_d_w(uint8_t data) -{ - /* - bit description - - D0 inverted to K4 -> CD4024 pin 2 (reset) - D1 TDO - D2 inverted to K6 -> CD4024 pin 1 (clock), CD4076 pin 7 (clock), inverted to DS8881 pin 3 (enable) - D3 not connected - - */ - - int k4 = !BIT(data, 0); - int k6 = !BIT(data, 2); - - LOGMASKED(LOG_COP, "%s %s K4 %u K6 %u\n", machine().time().as_string(), machine().describe_context(), k4, k6); - - m_cop_tdo = BIT(data, 1); - m_cassette1->output(m_cop_tdo ? -1.0 : +1.0); - m_cassette2->output(m_cop_tdo ? -1.0 : +1.0); - - if (k4) { - m_405_q = 0; - - LOGMASKED(LOG_COP, "%s %s keylatch reset\n", machine().time().as_string(), machine().describe_context()); - } else if (m_cop_k6 && !k6) { - m_405_q++; - m_405_q &= 0x7f; - - LOGMASKED(LOG_COP, "%s %s keylatch %u\n", machine().time().as_string(), machine().describe_context(), m_405_q); - } - - if (!m_cop_k6 && k6) { - m_403_d = m_y[m_405_q & 0x0f]->read() & 0x0f; - - LOGMASKED(LOG_COP, "%s %s keydata %01x\n", machine().time().as_string(), machine().describe_context(), m_403_d); - } - - if (k6) { - m_403_q = m_403_d; - } else { - m_403_q = 0xf; - - LOGMASKED(LOG_COP, "%s %s keydata disabled\n", machine().time().as_string(), machine().describe_context()); - - // COP to VFD serial format, bits 15..0 - // A B J I x H G2 C x F G1 E K L M D - uint16_t value = bitswap<16>(m_402_q, 11, 7, 1, 13, 10, 3, 2, 12, 9, 5, 6, 4, 0, 8, 14, 15) & 0x3fff; - m_digits[m_405_q & 0x0f] = value; - - LOGMASKED(LOG_VFD, "%s %s vfd segment %u 402.Q %04x data %04x\n", machine().time().as_string(), machine().describe_context(), m_405_q & 0x0f, m_402_q, value); - } - - m_cop_k6 = k6; - tm(); -} - - -//------------------------------------------------- -// k1_w - -//------------------------------------------------- - -WRITE_LINE_MEMBER( newbrain_state::k1_w ) -{ - LOGMASKED(LOG_VFD, "%s %s SO %u\n", machine().time().as_string(), machine().describe_context(), state); - - m_cop_so = state; -} - - -//------------------------------------------------- -// k2_w - -//------------------------------------------------- - -WRITE_LINE_MEMBER( newbrain_state::k2_w ) -{ - LOGMASKED(LOG_VFD, "%s %s SK %u\n", machine().time().as_string(), machine().describe_context(), state); - - if (state) - { - m_402_q <<= 1; - m_402_q = (m_402_q & 0xfffe) | m_cop_so; - } -} - - -//------------------------------------------------- -// tdi_r - -//------------------------------------------------- - -int newbrain_state::tpin() -{ - return (m_cassette1->input() > +0.04) || (m_cassette2->input() > +0.04); -} - -READ_LINE_MEMBER( newbrain_state::tdi_r ) -{ - return tpin() ^ m_cop_tdo; -} - - - -//************************************************************************** -// ADDRESS MAPS -//************************************************************************** - -//------------------------------------------------- -// ADDRESS_MAP( newbrain_mreq ) -//------------------------------------------------- - -void newbrain_state::newbrain_mreq(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0xffff).rw(FUNC(newbrain_state::mreq_r), FUNC(newbrain_state::mreq_w)); -} - - -//------------------------------------------------- -// ADDRESS_MAP( newbrain_iorq ) -//------------------------------------------------- - -void newbrain_state::newbrain_iorq(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0xffff).rw(FUNC(newbrain_state::iorq_r), FUNC(newbrain_state::iorq_w)); -} - - - -//************************************************************************** -// INPUT PORTS -//************************************************************************** - -//------------------------------------------------- -// INPUT_PORTS( newbrain ) -//------------------------------------------------- - -static INPUT_PORTS_START( newbrain ) - PORT_START("Y0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("STOP") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("Y1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) - - PORT_START("Y2") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') - - PORT_START("Y3") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') - - PORT_START("Y4") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') - - PORT_START("Y5") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('(') PORT_CHAR('[') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') - - PORT_START("Y6") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR(')') PORT_CHAR(']') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') - - PORT_START("Y7") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("* \xC2\xA3") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('*') PORT_CHAR(0x00A3) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') - - PORT_START("Y8") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("VIDEO TEXT") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT)) // Vd - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') - - PORT_START("Y9") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') - - PORT_START("Y10") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('@') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') - - PORT_START("Y11") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('-') PORT_CHAR('\\') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') - - PORT_START("Y12") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('+') PORT_CHAR('^') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("INSERT") PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) - - PORT_START("Y13") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("NEW LINE") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) // NL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') - - PORT_START("Y14") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("HOME") PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(HOME)) // CH - - PORT_START("Y15") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // SH - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("GRAPHICS") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) // GR - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("REPEAT") // RPT - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CONTROL") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) // GL -INPUT_PORTS_END - - - -//************************************************************************** -// MACHINE INITIALIZATION -//************************************************************************** - -int newbrain_state::get_reset_t() -{ - return RES_K(220) * CAP_U(10) * 1000; // t = R128 * C125 = 2.2s -} - -int newbrain_state::get_pwrup_t() -{ - return RES_K(560) * CAP_U(10) * 1000; // t = R129 * C127 = 5.6s -} - - -//------------------------------------------------- -// machine_start - -//------------------------------------------------- - -void newbrain_state::machine_start() -{ - m_digits.resolve(); - - // set power up timer - timer_set(attotime::from_usec(get_pwrup_t()), TIMER_ID_PWRUP); - - // state saving - save_item(NAME(m_clk)); - save_item(NAME(m_tvp)); - save_item(NAME(m_pwrup)); - save_item(NAME(m_clkint)); - save_item(NAME(m_copint)); - save_item(NAME(m_cop_so)); - save_item(NAME(m_cop_tdo)); - save_item(NAME(m_cop_g1)); - save_item(NAME(m_cop_g3)); - save_item(NAME(m_cop_k6)); - save_item(NAME(m_405_q)); - save_item(NAME(m_403_q)); - save_item(NAME(m_402_q)); - - // patch COP ROM to read VFD data - //memregion(COP420_TAG)->base()[0x20a] = 0xc6; -} - - -//------------------------------------------------- -// machine_reset - -//------------------------------------------------- - -void newbrain_state::machine_reset() -{ - m_maincpu->reset(); - m_cop->reset(); - - m_maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); - m_cop->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); - - enrg_w(0); - - timer_set(attotime::from_usec(get_reset_t()), TIMER_ID_RESET); -} - - -//------------------------------------------------- -// device_timer - handler timer events -//------------------------------------------------- - -void newbrain_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - switch (id) - { - case TIMER_ID_RESET: - LOG("%s %s RESET 1\n", machine().time().as_string(), machine().describe_context()); - - m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE); - m_cop->set_input_line(INPUT_LINE_HALT, CLEAR_LINE); - break; - - case TIMER_ID_PWRUP: - LOG("%s %s PWRUP 1\n", machine().time().as_string(), machine().describe_context()); - - m_pwrup = 1; - break; - - case TIMER_ID_CLKINT: - LOG("%s CLKINT\n", machine().time().as_string()); - - m_clkint = 0; - check_interrupt(); - break; - } -} - - - -//************************************************************************** -// MACHINE DRIVERS -//************************************************************************** - -//------------------------------------------------- -// machine_config( newbrain ) -//------------------------------------------------- - -void newbrain_state::newbrain(machine_config &config) -{ - // basic system hardware - Z80(config, m_maincpu, XTAL(16'000'000)/4); - m_maincpu->set_addrmap(AS_PROGRAM, &newbrain_state::newbrain_mreq); - m_maincpu->set_addrmap(AS_IO, &newbrain_state::newbrain_iorq); - - COP420(config, m_cop, XTAL(16'000'000)/4); - m_cop->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, true); - m_cop->read_g().set(FUNC(newbrain_state::cop_g_r)); - m_cop->write_g().set(FUNC(newbrain_state::cop_g_w)); - m_cop->write_d().set(FUNC(newbrain_state::cop_d_w)); - m_cop->read_in().set(FUNC(newbrain_state::cop_in_r)); - m_cop->write_so().set(FUNC(newbrain_state::k1_w)); - m_cop->write_sk().set(FUNC(newbrain_state::k2_w)); - m_cop->read_si().set(FUNC(newbrain_state::tdi_r)); - - // video hardware - newbrain_video(config); - - // devices - NEWBRAIN_EXPANSION_SLOT(config, m_exp, XTAL(16'000'000)/4, newbrain_expansion_cards, "eim"); - - SPEAKER(config, "mono").front_center(); - - CASSETTE(config, m_cassette1); - m_cassette1->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); - m_cassette1->add_route(ALL_OUTPUTS, "mono", 0.05); - - CASSETTE(config, m_cassette2); - m_cassette2->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); - m_cassette2->add_route(ALL_OUTPUTS, "mono", 0.05); - - RS232_PORT(config, RS232_V24_TAG, default_rs232_devices, nullptr); - RS232_PORT(config, RS232_PRN_TAG, default_rs232_devices, nullptr); - - // internal ram - RAM(config, RAM_TAG).set_default_size("32K"); -} - - -//------------------------------------------------- -// machine_config( newbrain_ad ) -//------------------------------------------------- - -void newbrain_state::newbrain_ad(machine_config &config) -{ - newbrain(config); - config.set_default_layout(layout_newbrain); -} - - -//------------------------------------------------- -// machine_config( newbrain_a ) -//------------------------------------------------- - -void newbrain_state::newbrain_a(machine_config &config) -{ - newbrain(config); - config.set_default_layout(layout_newbraina); -} - - -//------------------------------------------------- -// machine_config( newbrain_md ) -//------------------------------------------------- - -void newbrain_state::newbrain_md(machine_config &config) -{ - newbrain(config); - config.set_default_layout(layout_newbrain); -} - - - -//************************************************************************** -// ROMS -//************************************************************************** - -//------------------------------------------------- -// ROM( newbrain ) -//------------------------------------------------- - -ROM_START( newbrain ) - ROM_REGION( 0x6000, Z80_TAG, 0 ) - ROM_DEFAULT_BIOS( "rom20" ) - - ROM_SYSTEM_BIOS( 0, "issue1", "Issue 1 (v?)" ) - ROMX_LOAD( "aben.ic6", 0x0000, 0x2000, CRC(308f1f72) SHA1(a6fd9945a3dca47636887da2125fde3f9b1d4e25), ROM_BIOS(0) ) - ROMX_LOAD( "cd iss 1.ic7", 0x2000, 0x2000, CRC(6b4d9429) SHA1(ef688be4e75aced61f487c928258c8932a0ae00a), ROM_BIOS(0) ) - ROMX_LOAD( "ef iss 1.ic8", 0x4000, 0x2000, CRC(20dd0b49) SHA1(74b517ca223cefb588e9f49e72ff2d4f1627efc6), ROM_BIOS(0) ) - - ROM_SYSTEM_BIOS( 1, "issue2", "Issue 2 (v1.9)" ) - ROMX_LOAD( "aben19.ic6", 0x0000, 0x2000, CRC(d0283eb1) SHA1(351d248e69a77fa552c2584049006911fb381ff0), ROM_BIOS(1) ) - ROMX_LOAD( "cdi2.ic7", 0x2000, 0x2000, CRC(6b4d9429) SHA1(ef688be4e75aced61f487c928258c8932a0ae00a), ROM_BIOS(1) ) - ROMX_LOAD( "ef iss 1.ic8", 0x4000, 0x2000, CRC(20dd0b49) SHA1(74b517ca223cefb588e9f49e72ff2d4f1627efc6), ROM_BIOS(1) ) - - ROM_SYSTEM_BIOS( 2, "issue3", "Issue 3 (v1.91)" ) - ROMX_LOAD( "aben191.ic6", 0x0000, 0x2000, CRC(b7be8d89) SHA1(cce8d0ae7aa40245907ea38b7956c62d039d45b7), ROM_BIOS(2) ) - ROMX_LOAD( "cdi3.ic7", 0x2000, 0x2000, CRC(6b4d9429) SHA1(ef688be4e75aced61f487c928258c8932a0ae00a), ROM_BIOS(2) ) - ROMX_LOAD( "ef iss 1.ic8", 0x4000, 0x2000, CRC(20dd0b49) SHA1(74b517ca223cefb588e9f49e72ff2d4f1627efc6), ROM_BIOS(2) ) - - ROM_SYSTEM_BIOS( 3, "series2", "Series 2 (v?)" ) - ROMX_LOAD( "abs2.ic6", 0x0000, 0x2000, CRC(9a042acb) SHA1(80d83a2ea3089504aa68b6cf978d80d296cd9bda), ROM_BIOS(3) ) - ROMX_LOAD( "cds2.ic7", 0x2000, 0x2000, CRC(6b4d9429) SHA1(ef688be4e75aced61f487c928258c8932a0ae00a), ROM_BIOS(3) ) - ROMX_LOAD( "efs2.ic8", 0x4000, 0x2000, CRC(b222d798) SHA1(c0c816b4d4135b762f2c5f1b24209d0096f22e56), ROM_BIOS(3) ) - - ROM_SYSTEM_BIOS( 4, "rom20", "? (v2.0)" ) - ROMX_LOAD( "aben20.rom", 0x0000, 0x2000, CRC(3d76d0c8) SHA1(753b4530a518ad832e4b81c4e5430355ba3f62e0), ROM_BIOS(4) ) - ROMX_LOAD( "cd20tci.rom", 0x2000, 0x4000, CRC(f65b2350) SHA1(1ada7fbf207809537ec1ffb69808524300622ada), ROM_BIOS(4) ) - - ROM_REGION( 0x400, COP420_TAG, 0 ) - ROM_LOAD( "cop420-guw.ic419", 0x000, 0x400, CRC(a1388ee7) SHA1(5822e16aa794545600bf7a9dbee2ef467ca2a3e0) ) // COP420-GUW/N - - ROM_REGION( 0x1000, "chargen", 0 ) - ROM_LOAD( "char eprom iss 1.ic453", 0x0000, 0x1000, CRC(6a38b7a2) SHA1(29f3e672fc41792ac2f2b405e571d79235193561) ) // 8248R7 -ROM_END - - -//------------------------------------------------- -// ROM( newbraina ) -//------------------------------------------------- - -#define rom_newbraina rom_newbrain - - -//------------------------------------------------- -// ROM( newbrainmd ) -//------------------------------------------------- - -ROM_START( newbrainmd ) - ROM_REGION( 0x10000, Z80_TAG, 0 ) - ROM_LOAD( "cdmd.rom", 0x2000, 0x2000, CRC(6b4d9429) SHA1(ef688be4e75aced61f487c928258c8932a0ae00a) ) - ROM_LOAD( "efmd.rom", 0x4000, 0x2000, CRC(20dd0b49) SHA1(74b517ca223cefb588e9f49e72ff2d4f1627efc6) ) - - ROM_REGION( 0x400, COP420_TAG, 0 ) - ROM_LOAD( "cop420-guw.ic419", 0x000, 0x400, CRC(a1388ee7) SHA1(5822e16aa794545600bf7a9dbee2ef467ca2a3e0) ) // COP420-GUW/N - - ROM_REGION( 0x1000, "chargen", 0 ) - ROM_LOAD( "char eprom iss 1.ic453", 0x0000, 0x1000, CRC(6a38b7a2) SHA1(29f3e672fc41792ac2f2b405e571d79235193561) ) // 8248R7 -ROM_END - - - -//************************************************************************** -// SYSTEM DRIVERS -//************************************************************************** - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1981, newbrain, 0, 0, newbrain_ad, newbrain, newbrain_state, empty_init, "Grundy Business Systems Ltd", "NewBrain AD", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND ) -COMP( 1981, newbraina, newbrain, 0, newbrain_a, newbrain, newbrain_state, empty_init, "Grundy Business Systems Ltd", "NewBrain A", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND ) -COMP( 1981, newbrainmd, newbrain, 0, newbrain_md, newbrain, newbrain_state, empty_init, "Grundy Business Systems Ltd", "NewBrain MD", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND ) |