/*************************************************************************** drivers/bw2.c Bondwell BW 2 - Z80L CPU 4MHz - 64KB RAM, expandable to 224KB RAM. - 4KB System ROM - MSM6255 LCD controller, 640x200 pixels - 16KB Video RAM - TMS2797 FDC controller - 8251 USART serial interface - 8253 PIT timer - 8255 PPI http://www.thebattles.net/bondwell/ http://www.vintage-computer.com/bondwell2.shtml http://www2.okisemi.com/site/productscatalog/displaydrivers/availabledocuments/Intro-7090.html ***************************************************************************/ #include "includes/bw2.h" //************************************************************************** // MACROS / CONSTANTS //************************************************************************** enum { RAM1 = 0, VRAM, RAM2, RAM3, RAM4, RAM5, RAM6, ROM }; //************************************************************************** // ADDRESS DECODING //************************************************************************** //------------------------------------------------- // read - //------------------------------------------------- READ8_MEMBER( bw2_state::read ) { int rom = 1, vram = 1, ram1 = 1, ram2 = 1, ram3 = 1, ram4 = 1, ram5 = 1, ram6 = 1; UINT8 data = 0xff; switch (m_bank) { case RAM1: ram1 = 0; break; case VRAM: vram = 0; break; case RAM2: ram2 = 0; break; case RAM3: ram3 = 0; break; case RAM4: ram4 = 0; break; case RAM5: ram5 = 0; break; case RAM6: ram6 = 0; break; case ROM: rom = 0; break; } if (!rom) { data = memregion(Z80_TAG)->base()[offset & 0x3fff]; } if (!vram) { data = m_video_ram[offset & 0x3fff]; } if (!ram1) { data = m_ram->pointer()[offset]; } if (!ram2 && (m_ram->size() >= 96 * 1024)) { data = m_ram->pointer()[0x10000 | offset]; } if (!ram3 && (m_ram->size() >= 128 * 1024)) { data = m_ram->pointer()[0x18000 | offset]; } if (!ram4 && (m_ram->size() >= 160 * 1024)) { data = m_ram->pointer()[0x20000 | offset]; } if (!ram5 && (m_ram->size() >= 192 * 1024)) { data = m_ram->pointer()[0x28000 | offset]; } if (!ram6 && (m_ram->size() >= 224 * 1024)) { data = m_ram->pointer()[0x30000 | offset]; } return m_exp->cd_r(space, offset, data, ram2, ram3, ram4, ram5, ram6); } //------------------------------------------------- // write - //------------------------------------------------- WRITE8_MEMBER( bw2_state::write ) { int vram = 1, ram1 = 1, ram2 = 1, ram3 = 1, ram4 = 1, ram5 = 1, ram6 = 1; switch (m_bank) { case RAM1: ram1 = 0; break; case VRAM: vram = 0; break; case RAM2: ram2 = 0; break; case RAM3: ram3 = 0; break; case RAM4: ram4 = 0; break; case RAM5: ram5 = 0; break; case RAM6: ram6 = 0; break; } if (!vram) { m_video_ram[offset & 0x3fff] = data; } if (!ram1) { m_ram->pointer()[offset] = data; } if (!ram2 && (m_ram->size() >= 96 * 1024)) { m_ram->pointer()[0x10000 | offset] = data; } if (!ram3 && (m_ram->size() >= 128 * 1024)) { m_ram->pointer()[0x18000 | offset] = data; } if (!ram4 && (m_ram->size() >= 160 * 1024)) { m_ram->pointer()[0x20000 | offset] = data; } if (!ram5 && (m_ram->size() >= 192 * 1024)) { m_ram->pointer()[0x28000 | offset] = data; } if (!ram6 && (m_ram->size() >= 224 * 1024)) { m_ram->pointer()[0x30000 | offset] = data; } m_exp->cd_w(space, offset, data, ram2, ram3, ram4, ram5, ram6); } //************************************************************************** // ADDRESS MAPS //************************************************************************** //------------------------------------------------- // ADDRESS_MAP( bw2_mem ) //------------------------------------------------- static ADDRESS_MAP_START( bw2_mem, AS_PROGRAM, 8, bw2_state ) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x0000, 0x7fff) AM_READWRITE(read, write) AM_RANGE(0x8000, 0xffff) AM_RAM ADDRESS_MAP_END //------------------------------------------------- // ADDRESS_MAP( bw2_io ) //------------------------------------------------- static ADDRESS_MAP_START( bw2_io, AS_IO, 8, bw2_state ) ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x03) AM_DEVREADWRITE(I8255A_TAG, i8255_device, read, write) AM_RANGE(0x10, 0x13) AM_DEVREADWRITE_LEGACY(I8253_TAG, pit8253_r, pit8253_w) AM_RANGE(0x20, 0x21) AM_DEVREADWRITE(MSM6255_TAG, msm6255_device, read, write) AM_RANGE(0x30, 0x3f) AM_DEVREADWRITE(BW2_EXPANSION_SLOT_TAG, bw2_expansion_slot_device, slot_r, slot_w) AM_RANGE(0x40, 0x40) AM_DEVREADWRITE(I8251_TAG, i8251_device, data_r, data_w) AM_RANGE(0x41, 0x41) AM_DEVREADWRITE(I8251_TAG, i8251_device, status_r, control_w) AM_RANGE(0x50, 0x50) AM_DEVWRITE(CENTRONICS_TAG, centronics_device, write) AM_RANGE(0x60, 0x63) AM_DEVREADWRITE(WD2797_TAG, wd2797_t, read, write) AM_RANGE(0x70, 0x7f) AM_DEVREADWRITE(BW2_EXPANSION_SLOT_TAG, bw2_expansion_slot_device, modsel_r, modsel_w) ADDRESS_MAP_END //************************************************************************** // INPUT PORTS //************************************************************************** //------------------------------------------------- // INPUT_PORTS( bw2 ) //------------------------------------------------- /* Keyboard matrix X0 X1 X2 X3 X4 X5 X6 X7 +-----+-----+-----+-----+-----+-----+-----+-----+ Y9 |CAPS | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+ Y8 |SHIFT| |SPACE| Z | A | Q | 2 " | F1 | +-----+-----+-----+-----+-----+-----+-----+-----+ Y7 |CTRL | - = | \ | | X | S | W | 3 # | F2 | +-----+-----+-----+-----+-----+-----+-----+-----+ Y6 | @ ` | P | UP | C | D | E | 4 $ | F3 | +-----+-----+-----+-----+-----+-----+-----+-----+ Y5 | 1 ! | | | V | F | R | 5 % | F4 | +-----+-----+-----+-----+-----+-----+-----+-----+ Y4 | ESC | | | B | G | T | 6 & | F5 | +-----+-----+-----+-----+-----+-----+-----+-----+ Y3 | TAB | : * |ENTER| N | H | Y | 7 ' | F6 | +-----+-----+-----+-----+-----+-----+-----+-----+ Y2 |DOWN | ^ ~ | [ { | M | J | U | 8 ( | F7 | +-----+-----+-----+-----+-----+-----+-----+-----+ Y1 |RIGHT| ; + | ] } | , < | K | I | 9 ) | F8 | +-----+-----+-----+-----+-----+-----+-----+-----+ Y0 |LEFT | BS | / ? | . > | L | O | 0 _ | DEL | +-----+-----+-----+-----+-----+-----+-----+-----+ */ static INPUT_PORTS_START( bw2 ) PORT_START("Y0") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('_') PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_START("Y1") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) PORT_START("Y2") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('^') PORT_CHAR('~') PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) PORT_START("Y3") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(UCHAR_MAMEKEY(TAB)) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR(':') PORT_CHAR('*') PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) PORT_START("Y4") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(27) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_START("Y5") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_START("Y6") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('@') PORT_CHAR('`') PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_START("Y7") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=') PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_START("Y8") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_START("Y9") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) PORT_START("BAUD") PORT_CONFNAME( 0x05, 0x05, "Baud rate") PORT_CONFSETTING( 0x00, "9600 baud" ) PORT_CONFSETTING( 0x01, "4800 baud" ) PORT_CONFSETTING( 0x02, "2400 baud" ) PORT_CONFSETTING( 0x03, "1200 baud" ) PORT_CONFSETTING( 0x04, "600 baud" ) PORT_CONFSETTING( 0x05, "300 baud" ) INPUT_PORTS_END //************************************************************************** // DEVICE CONFIGURATION //************************************************************************** //------------------------------------------------- // I8255A_INTERFACE( ppi_intf ) //------------------------------------------------- WRITE8_MEMBER( bw2_state::ppi_pa_w ) { /* PA0 KB0 Keyboard line select 0 PA1 KB1 Keyboard line select 1 PA2 KB2 Keyboard line select 2 PA3 KB3 Keyboard line select 3 PA4 /DS0 Drive select 0 PA5 /DS1 Drive select 1 PA6 Select RS232 connector PA7 /STROBE to centronics printer */ // keyboard m_kb = data & 0x0f; // drive select m_floppy = NULL; if (BIT(data, 4)) m_floppy = m_floppy0->get_device(); if (BIT(data, 5)) m_floppy = m_floppy1->get_device(); m_fdc->set_floppy(m_floppy); if (m_floppy) m_floppy->mon_w(m_mtron); // centronics strobe m_centronics->strobe_w(BIT(data, 7)); } READ8_MEMBER( bw2_state::ppi_pb_r ) { /* PB0 Keyboard column status of selected line PB1 Keyboard column status of selected line PB2 Keyboard column status of selected line PB3 Keyboard column status of selected line PB4 Keyboard column status of selected line PB5 Keyboard column status of selected line PB6 Keyboard column status of selected line PB7 Keyboard column status of selected line */ static const char *const rownames[] = { "Y0", "Y1", "Y2", "Y3", "Y4", "Y5", "Y6", "Y7", "Y8", "Y9" }; UINT8 data = 0xff; if (m_kb <= 9) { data = ioport(rownames[m_kb])->read(); } return data; } WRITE8_MEMBER( bw2_state::ppi_pc_w ) { /* PC0 Memory bank select PC1 Memory bank select PC2 Memory bank select PC3 Not connected */ m_bank = data & 0x07; } READ8_MEMBER( bw2_state::ppi_pc_r ) { /* PC4 BUSY from centronics printer PC5 M/FDBK motor feedback PC6 RLSD Carrier detect from RS232 PC7 /PROT Write protected disk */ UINT8 data = 0; // centronics busy data |= m_centronics->busy_r() << 4; // floppy motor data |= m_mfdbk << 5; // write protect if (m_floppy) data |= m_floppy->wpt_r() << 7; return data; } static I8255A_INTERFACE( ppi_intf ) { DEVCB_NULL, DEVCB_DRIVER_MEMBER(bw2_state, ppi_pa_w), DEVCB_DRIVER_MEMBER(bw2_state, ppi_pb_r), DEVCB_NULL, DEVCB_DRIVER_MEMBER(bw2_state, ppi_pc_r), DEVCB_DRIVER_MEMBER(bw2_state, ppi_pc_w), }; //------------------------------------------------- // pit8253_config pit_intf //------------------------------------------------- WRITE_LINE_MEMBER( bw2_state::pit_out0_w ) { m_uart->transmit_clock(); m_uart->receive_clock(); } WRITE_LINE_MEMBER( bw2_state::mtron_w ) { m_mtron = state; m_mfdbk = !state; if (m_floppy) m_floppy->mon_w(m_mtron); } static const struct pit8253_config pit_intf = { { { XTAL_16MHz/4, // 8251 USART TXC, RXC DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(bw2_state, pit_out0_w) }, { 11000, // LCD controller DEVCB_LINE_VCC, DEVCB_DEVICE_LINE(I8253_TAG, pit8253_clk2_w) }, { 0, // Floppy /MTRON DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(bw2_state, mtron_w) } } }; //------------------------------------------------- // MSM6255_INTERFACE( lcdc_intf ) //------------------------------------------------- void bw2_state::palette_init() { palette_set_color_rgb(machine(), 0, 0xa5, 0xad, 0xa5); palette_set_color_rgb(machine(), 1, 0x31, 0x39, 0x10); } static MSM6255_CHAR_RAM_READ( bw2_charram_r ) { bw2_state *state = device->machine().driver_data(); return state->m_video_ram[ma & 0x3fff]; } static MSM6255_INTERFACE( lcdc_intf ) { SCREEN_TAG, 0, bw2_charram_r, }; //------------------------------------------------- // floppy_format_type floppy_formats //------------------------------------------------- void bw2_state::fdc_intrq_w(bool state) { logerror("intrq %u\n", state?1:0); m_maincpu->set_input_line(INPUT_LINE_IRQ0, state ? ASSERT_LINE : CLEAR_LINE); } void bw2_state::fdc_drq_w(bool state) { logerror("drq %u\n", state?1:0); if (state) { if (m_maincpu->state_int(Z80_HALT)) { m_maincpu->set_input_line(INPUT_LINE_NMI, HOLD_LINE); } } else { m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); } } const floppy_format_type bw2_state::floppy_formats[] = { FLOPPY_BW2_FORMAT, FLOPPY_IMD_FORMAT, FLOPPY_MFM_FORMAT, FLOPPY_MFI_FORMAT, NULL }; static SLOT_INTERFACE_START( bw2_floppies ) SLOT_INTERFACE( "35dd", FLOPPY_35_DD ) // Teac FD-35 SLOT_INTERFACE_END //------------------------------------------------- // rs232_port_interface rs232_intf //------------------------------------------------- static SLOT_INTERFACE_START( rs232_devices ) SLOT_INTERFACE_END static const rs232_port_interface rs232_intf = { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }; //************************************************************************** // MACHINE INITIALIZATION //************************************************************************** //------------------------------------------------- // MACHINE_START( bw2 ) //------------------------------------------------- void bw2_state::machine_start() { // allocate memory m_video_ram.allocate(0x4000); // floppy callbacks m_fdc->setup_intrq_cb(wd2797_t::line_cb(FUNC(bw2_state::fdc_intrq_w), this)); m_fdc->setup_drq_cb(wd2797_t::line_cb(FUNC(bw2_state::fdc_drq_w), this)); // register for state saving save_item(NAME(m_kb)); save_item(NAME(m_bank)); save_item(NAME(m_mtron)); save_item(NAME(m_mfdbk)); } //************************************************************************** // MACHINE DRIVERS //************************************************************************** //------------------------------------------------- // MACHINE_CONFIG( bw2 ) //------------------------------------------------- static MACHINE_CONFIG_START( bw2, bw2_state ) // basic machine hardware MCFG_CPU_ADD(Z80_TAG, Z80, XTAL_16MHz/4) MCFG_CPU_PROGRAM_MAP(bw2_mem) MCFG_CPU_IO_MAP(bw2_io) // video hardware MCFG_DEFAULT_LAYOUT(layout_lcd) MCFG_SCREEN_ADD(SCREEN_TAG, LCD) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_UPDATE_DEVICE( MSM6255_TAG, msm6255_device, screen_update ) MCFG_SCREEN_SIZE(640, 200) MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1) MCFG_PALETTE_LENGTH(2) // devices MCFG_PIT8253_ADD(I8253_TAG, pit_intf) MCFG_I8255A_ADD(I8255A_TAG, ppi_intf) MCFG_MSM6255_ADD(MSM6255_TAG, XTAL_16MHz, lcdc_intf) MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, standard_centronics) MCFG_I8251_ADD(I8251_TAG, default_i8251_interface) MCFG_WD2797x_ADD(WD2797_TAG, XTAL_16MHz/16) MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG":0", bw2_floppies, "35dd", NULL, bw2_state::floppy_formats) MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG":1", bw2_floppies, NULL, NULL, bw2_state::floppy_formats) MCFG_BW2_EXPANSION_SLOT_ADD(BW2_EXPANSION_SLOT_TAG, XTAL_16MHz, bw2_expansion_cards, NULL, NULL) MCFG_RS232_PORT_ADD(RS232_TAG, rs232_intf, rs232_devices, NULL, NULL) // software list MCFG_SOFTWARE_LIST_ADD("flop_list","bw2") // internal ram MCFG_RAM_ADD(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("64K") MCFG_RAM_EXTRA_OPTIONS("96K,128K,160K,192K,224K") MACHINE_CONFIG_END //************************************************************************** // ROMS //************************************************************************** //------------------------------------------------- // ROM( bw2 ) //------------------------------------------------- ROM_START( bw2 ) ROM_REGION( 0x1000, Z80_TAG, 0 ) ROM_DEFAULT_BIOS( "v20" ) ROM_SYSTEM_BIOS( 0, "v12", "BW 2 v1.2" ) ROMX_LOAD( "bw2-12.ic8", 0x0000, 0x1000, CRC(0ab42d10) SHA1(430b232631eee9b715151b8d191b7eb9449ac513), ROM_BIOS(1) ) ROM_SYSTEM_BIOS( 1, "v20", "BW 2 v2.0" ) ROMX_LOAD( "bw2-20.ic8", 0x0000, 0x1000, CRC(86f36471) SHA1(a3e2ba4edd50ff8424bb0675bdbb3b9f13c04c9d), ROM_BIOS(2) ) ROM_END //************************************************************************** // SYSTEM DRIVERS //************************************************************************** // YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS COMP( 1985, bw2, 0, 0, bw2, bw2, driver_device, 0, "Bondwell Holding", "Bondwell Model 2", GAME_NO_SOUND_HW )