mame/src/mess/drivers/bw2.c
2012-11-19 08:40:08 +00:00

693 lines
22 KiB
C

/***************************************************************************
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<bw2_state>();
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 )