diff options
Diffstat (limited to 'src/mess/machine/genpc.c')
-rw-r--r-- | src/mess/machine/genpc.c | 954 |
1 files changed, 0 insertions, 954 deletions
diff --git a/src/mess/machine/genpc.c b/src/mess/machine/genpc.c deleted file mode 100644 index 44dbcd00d20..00000000000 --- a/src/mess/machine/genpc.c +++ /dev/null @@ -1,954 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Wilbert Pol, Miodrag Milanovic -/*************************************************************************** - - machine/genpc.c - - -***************************************************************************/ - -#include "emu.h" -#include "includes/genpc.h" - -#include "machine/i8255.h" -#include "machine/pic8259.h" -#include "machine/pit8253.h" -#include "sound/speaker.h" -#include "machine/ram.h" -#include "imagedev/cassette.h" - -#define VERBOSE_PIO 0 /* PIO (keyboard controller) */ - -#define PIO_LOG(N,M,A) \ - do { \ - if(VERBOSE_PIO>=N) \ - { \ - if( M ) \ - logerror("%11.6f: %-24s",machine().time().as_double(),(char*)M ); \ - logerror A; \ - } \ - } while (0) - - -/************************************************************************* - * - * PC DMA stuff - * - *************************************************************************/ - -READ8_MEMBER( ibm5160_mb_device::pc_page_r) -{ - return 0xff; -} - - -WRITE8_MEMBER( ibm5160_mb_device::pc_page_w) -{ - switch(offset % 4) - { - case 1: - m_dma_offset[2] = data; - break; - case 2: - m_dma_offset[3] = data; - break; - case 3: - m_dma_offset[0] = m_dma_offset[1] = data; - break; - } -} - - -WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dma_hrq_changed ) -{ - m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); - - /* Assert HLDA */ - m_dma8237->hack_w(state); -} - - -READ8_MEMBER( ibm5160_mb_device::pc_dma_read_byte ) -{ - if(m_dma_channel == -1) - return 0xff; - address_space &spaceio = m_maincpu->space(AS_PROGRAM); - offs_t page_offset = (((offs_t) m_dma_offset[m_dma_channel]) << 16) & 0x0F0000; - return spaceio.read_byte( page_offset + offset); -} - - -WRITE8_MEMBER( ibm5160_mb_device::pc_dma_write_byte ) -{ - if(m_dma_channel == -1) - return; - address_space &spaceio = m_maincpu->space(AS_PROGRAM); - offs_t page_offset = (((offs_t) m_dma_offset[m_dma_channel]) << 16) & 0x0F0000; - - spaceio.write_byte( page_offset + offset, data); -} - - -READ8_MEMBER( ibm5160_mb_device::pc_dma8237_1_dack_r ) -{ - return m_isabus->dack_r(1); -} - -READ8_MEMBER( ibm5160_mb_device::pc_dma8237_2_dack_r ) -{ - return m_isabus->dack_r(2); -} - - -READ8_MEMBER( ibm5160_mb_device::pc_dma8237_3_dack_r ) -{ - return m_isabus->dack_r(3); -} - - -WRITE8_MEMBER( ibm5160_mb_device::pc_dma8237_1_dack_w ) -{ - m_isabus->dack_w(1,data); -} - -WRITE8_MEMBER( ibm5160_mb_device::pc_dma8237_2_dack_w ) -{ - m_isabus->dack_w(2,data); -} - - -WRITE8_MEMBER( ibm5160_mb_device::pc_dma8237_3_dack_w ) -{ - m_isabus->dack_w(3,data); -} - - -WRITE8_MEMBER( ibm5160_mb_device::pc_dma8237_0_dack_w ) -{ - m_u73_q2 = 0; - m_dma8237->dreq0_w( m_u73_q2 ); -} - - -WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dma8237_out_eop ) -{ - m_cur_eop = state == ASSERT_LINE; - if(m_dma_channel != -1 && m_cur_eop) - m_isabus->eop_w(m_dma_channel, m_cur_eop ? ASSERT_LINE : CLEAR_LINE ); -} - -void ibm5160_mb_device::pc_select_dma_channel(int channel, bool state) -{ - if(!state) { - m_dma_channel = channel; - if(m_cur_eop) - m_isabus->eop_w(channel, ASSERT_LINE ); - - } else if(m_dma_channel == channel) { - m_dma_channel = -1; - if(m_cur_eop) - m_isabus->eop_w(channel, CLEAR_LINE ); - } -} - -WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dack0_w ) { pc_select_dma_channel(0, state); } -WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dack1_w ) { pc_select_dma_channel(1, state); } -WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dack2_w ) { pc_select_dma_channel(2, state); } -WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dack3_w ) { pc_select_dma_channel(3, state); } - -/************************************************************* - * - * pic8259 configuration - * - *************************************************************/ - -WRITE_LINE_MEMBER(ibm5160_mb_device::pc_speaker_set_spkrdata) -{ - m_pc_spkrdata = state ? 1 : 0; - m_speaker->level_w(m_pc_spkrdata & m_pit_out2); -} - - -/************************************************************* - * - * pit8253 configuration - * - *************************************************************/ - -WRITE_LINE_MEMBER( ibm5160_mb_device::pc_pit8253_out1_changed ) -{ - /* Trigger DMA channel #0 */ - if ( m_out1 == 0 && state == 1 && m_u73_q2 == 0 ) - { - m_u73_q2 = 1; - m_dma8237->dreq0_w( m_u73_q2 ); - } - m_out1 = state; -} - - -WRITE_LINE_MEMBER( ibm5160_mb_device::pc_pit8253_out2_changed ) -{ - m_pit_out2 = state ? 1 : 0; - m_speaker->level_w(m_pc_spkrdata & m_pit_out2); -} - - -/********************************************************** - * - * PPI8255 interface - * - * - * PORT A (input) - * - * Directly attached to shift register which stores data - * received from the keyboard. - * - * PORT B (output) - * 0 - PB0 - TIM2GATESPK - Enable/disable counting on timer 2 of the 8253 - * 1 - PB1 - SPKRDATA - Speaker data - * 2 - PB2 - - Enable receiving data from the keyboard when keyboard is not locked. - * 3 - PB3 - - Dipsswitch set selector - * 4 - PB4 - ENBRAMPCK - Enable ram parity check - * 5 - PB5 - ENABLEI/OCK - Enable expansion I/O check - * 6 - PB6 - - Connected to keyboard clock signal - * 0 = ignore keyboard signals - * 1 = accept keyboard signals - * 7 - PB7 - - Clear/disable shift register and IRQ1 line - * 0 = normal operation - * 1 = clear and disable shift register and clear IRQ1 flip flop - * - * PORT C - * 0 - PC0 - - Dipswitch 0/4 SW1 - * 1 - PC1 - - Dipswitch 1/5 SW1 - * 2 - PC2 - - Dipswitch 2/6 SW1 - * 3 - PC3 - - Dipswitch 3/7 SW1 - * 4 - PC4 - SPK - Speaker/cassette data - * 5 - PC5 - I/OCHCK - Expansion I/O check result - * 6 - PC6 - T/C2OUT - Output of 8253 timer 2 - * 7 - PC7 - PCK - Parity check result - * - * IBM5150 SW1: - * 0 - OFF - One or more floppy drives - * ON - Diskless operation - * 1 - OFF - 8087 present - * ON - No 8087 present - * 2+3 - Used to determine on board memory configuration - * OFF OFF - 64KB - * ON OFF - 48KB - * OFF ON - 32KB - * ON ON - 16KB - * 4+5 - Used to select display - * OFF OFF - Monochrome - * ON OFF - CGA, 80 column - * OFF ON - CGA, 40 column - * ON ON - EGA/VGA display - * 6+7 - Used to select number of disk drives - * OFF OFF - four disk drives - * ON OFF - three disk drives - * OFF ON - two disk drives - * ON ON - one disk drive - * - **********************************************************/ -WRITE_LINE_MEMBER( ibm5150_mb_device::keyboard_clock_w ) -{ - if (!m_ppi_keyboard_clear && !state && !m_ppi_shift_enable) - { - m_ppi_shift_enable = m_ppi_shift_register & 0x01; - - m_ppi_shift_register >>= 1; - m_ppi_shift_register |= m_ppi_data_signal << 7; - - m_pic8259->ir1_w(m_ppi_shift_enable); - m_pc_kbdc->data_write_from_mb(!m_ppi_shift_enable); - } -} - -WRITE_LINE_MEMBER( ec1841_mb_device::keyboard_clock_w ) -{ - if (!m_ppi_keyboard_clear && !state && !m_ppi_shift_enable) - { - m_ppi_shift_enable = m_ppi_shift_register & 0x01; - - m_ppi_shift_register >>= 1; - m_ppi_shift_register |= m_ppi_data_signal << 7; - - m_pic8259->ir1_w(m_ppi_shift_enable); - m_pc_kbdc->data_write_from_mb(!m_ppi_shift_enable); - } -} - -WRITE_LINE_MEMBER( ibm5160_mb_device::keyboard_clock_w ) -{ - if (!m_ppi_keyboard_clear && !state && !m_ppi_shift_enable) - { - m_ppi_shift_enable = m_ppi_shift_register & 0x01; - - m_ppi_shift_register >>= 1; - m_ppi_shift_register |= m_ppi_data_signal << 7; - - m_pic8259->ir1_w(m_ppi_shift_enable); - m_pc_kbdc->data_write_from_mb(!BIT(m_ppi_portb, 2) && !m_ppi_shift_enable); - } -} - - -WRITE_LINE_MEMBER( ibm5160_mb_device::keyboard_data_w ) -{ - m_ppi_data_signal = state; -} - -READ8_MEMBER (ibm5160_mb_device::pc_ppi_porta_r) -{ - int data = 0xFF; - /* KB port A */ - if (m_ppi_keyboard_clear) - { - /* 0 0 - no floppy drives - * 1 Not used - * 2-3 The number of memory banks on the system board - * 4-5 Display mode - * 11 = monochrome - * 10 - color 80x25 - * 01 - color 40x25 - * 6-7 The number of floppy disk drives - */ - data = ioport("DSW0")->read(); - } - else - { - data = m_ppi_shift_register; - } - PIO_LOG(1,"PIO_A_r",("$%02x\n", data)); - return data; -} - - -READ8_MEMBER ( ibm5160_mb_device::pc_ppi_portc_r ) -{ - int data=0xff; - - data&=~0x80; // no parity error - data&=~0x40; // no error on expansion board - /* KB port C: equipment flags */ - if (m_ppi_portc_switch_high) - { - /* read hi nibble of S2 */ - data = (data & 0xf0) | ((ioport("DSW0")->read() >> 4) & 0x0f); - PIO_LOG(1,"PIO_C_r (hi)",("$%02x\n", data)); - } - else - { - /* read lo nibble of S2 */ - data = (data & 0xf0) | (ioport("DSW0")->read() & 0x0f); - PIO_LOG(1,"PIO_C_r (lo)",("$%02x\n", data)); - } - - if ( m_ppi_portb & 0x01 ) - { - data = ( data & ~0x10 ) | ( m_pit_out2 ? 0x10 : 0x00 ); - } - data = ( data & ~0x20 ) | ( m_pit_out2 ? 0x20 : 0x00 ); - - return data; -} - - -WRITE8_MEMBER( ibm5160_mb_device::pc_ppi_portb_w ) -{ - /* PPI controller port B*/ - m_ppi_portb = data; - m_ppi_portc_switch_high = data & 0x08; - m_ppi_keyboard_clear = data & 0x80; - m_ppi_keyb_clock = data & 0x40; - m_pit8253->write_gate2(BIT(data, 0)); - pc_speaker_set_spkrdata( data & 0x02 ); - - /* If PB7 is set clear the shift register and reset the IRQ line */ - if ( m_ppi_keyboard_clear ) - { - m_ppi_shift_register = 0; - m_ppi_shift_enable = 0; - m_pic8259->ir1_w(m_ppi_shift_enable); - } - - m_pc_kbdc->data_write_from_mb(!BIT(m_ppi_portb, 2) && !m_ppi_shift_enable); - m_ppi_clock_signal = ( m_ppi_keyb_clock ) ? 1 : 0; - m_pc_kbdc->clock_write_from_mb(m_ppi_clock_signal); -} - - -/********************************************************** - * - * NMI handling - * - **********************************************************/ - -WRITE8_MEMBER( ibm5160_mb_device::nmi_enable_w ) -{ - m_nmi_enabled = BIT(data,7); - m_isabus->set_nmi_state(m_nmi_enabled); -} -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -const device_type IBM5160_MOTHERBOARD = &device_creator<ibm5160_mb_device>; - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -static MACHINE_CONFIG_FRAGMENT( ibm5160_mb_config ) - MCFG_DEVICE_ADD("pit8253", PIT8253, 0) - MCFG_PIT8253_CLK0(XTAL_14_31818MHz/12) /* heartbeat IRQ */ - MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("pic8259", pic8259_device, ir0_w)) - MCFG_PIT8253_CLK1(XTAL_14_31818MHz/12) /* dram refresh */ - MCFG_PIT8253_OUT1_HANDLER(WRITELINE(ibm5160_mb_device, pc_pit8253_out1_changed)) - MCFG_PIT8253_CLK2(XTAL_14_31818MHz/12) /* pio port c pin 4, and speaker polling enough */ - MCFG_PIT8253_OUT2_HANDLER(WRITELINE(ibm5160_mb_device, pc_pit8253_out2_changed)) - - MCFG_DEVICE_ADD( "dma8237", AM9517A, XTAL_14_31818MHz/3 ) - MCFG_I8237_OUT_HREQ_CB(WRITELINE(ibm5160_mb_device, pc_dma_hrq_changed)) - MCFG_I8237_OUT_EOP_CB(WRITELINE(ibm5160_mb_device, pc_dma8237_out_eop)) - MCFG_I8237_IN_MEMR_CB(READ8(ibm5160_mb_device, pc_dma_read_byte)) - MCFG_I8237_OUT_MEMW_CB(WRITE8(ibm5160_mb_device, pc_dma_write_byte)) - MCFG_I8237_IN_IOR_1_CB(READ8(ibm5160_mb_device, pc_dma8237_1_dack_r)) - MCFG_I8237_IN_IOR_2_CB(READ8(ibm5160_mb_device, pc_dma8237_2_dack_r)) - MCFG_I8237_IN_IOR_3_CB(READ8(ibm5160_mb_device, pc_dma8237_3_dack_r)) - MCFG_I8237_OUT_IOW_0_CB(WRITE8(ibm5160_mb_device, pc_dma8237_0_dack_w)) - MCFG_I8237_OUT_IOW_1_CB(WRITE8(ibm5160_mb_device, pc_dma8237_1_dack_w)) - MCFG_I8237_OUT_IOW_2_CB(WRITE8(ibm5160_mb_device, pc_dma8237_2_dack_w)) - MCFG_I8237_OUT_IOW_3_CB(WRITE8(ibm5160_mb_device, pc_dma8237_3_dack_w)) - MCFG_I8237_OUT_DACK_0_CB(WRITELINE(ibm5160_mb_device, pc_dack0_w)) - MCFG_I8237_OUT_DACK_1_CB(WRITELINE(ibm5160_mb_device, pc_dack1_w)) - MCFG_I8237_OUT_DACK_2_CB(WRITELINE(ibm5160_mb_device, pc_dack2_w)) - MCFG_I8237_OUT_DACK_3_CB(WRITELINE(ibm5160_mb_device, pc_dack3_w)) - - MCFG_PIC8259_ADD( "pic8259", INPUTLINE(":maincpu", 0), VCC, NULL ) - - MCFG_DEVICE_ADD("ppi8255", I8255A, 0) - MCFG_I8255_IN_PORTA_CB(READ8(ibm5160_mb_device, pc_ppi_porta_r)) - MCFG_I8255_OUT_PORTB_CB(WRITE8(ibm5160_mb_device, pc_ppi_portb_w)) - MCFG_I8255_IN_PORTC_CB(READ8(ibm5160_mb_device, pc_ppi_portc_r)) - - MCFG_DEVICE_ADD("isa", ISA8, 0) - MCFG_ISA8_CPU(":maincpu") - MCFG_ISA_OUT_IRQ2_CB(DEVWRITELINE("pic8259", pic8259_device, ir2_w)) - MCFG_ISA_OUT_IRQ3_CB(DEVWRITELINE("pic8259", pic8259_device, ir3_w)) - MCFG_ISA_OUT_IRQ4_CB(DEVWRITELINE("pic8259", pic8259_device, ir4_w)) - MCFG_ISA_OUT_IRQ5_CB(DEVWRITELINE("pic8259", pic8259_device, ir5_w)) - MCFG_ISA_OUT_IRQ6_CB(DEVWRITELINE("pic8259", pic8259_device, ir6_w)) - MCFG_ISA_OUT_IRQ7_CB(DEVWRITELINE("pic8259", pic8259_device, ir7_w)) - MCFG_ISA_OUT_DRQ1_CB(DEVWRITELINE("dma8237", am9517a_device, dreq1_w)) - MCFG_ISA_OUT_DRQ2_CB(DEVWRITELINE("dma8237", am9517a_device, dreq2_w)) - MCFG_ISA_OUT_DRQ3_CB(DEVWRITELINE("dma8237", am9517a_device, dreq3_w)) - - MCFG_DEVICE_ADD("pc_kbdc", PC_KBDC, 0) - MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(ibm5160_mb_device, keyboard_clock_w)) - MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE(ibm5160_mb_device, keyboard_data_w)) - - /* sound hardware */ - MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) -MACHINE_CONFIG_END - - -//------------------------------------------------- -// machine_config_additions - device-specific -// machine configurations -//------------------------------------------------- - -machine_config_constructor ibm5160_mb_device::device_mconfig_additions() const -{ - return MACHINE_CONFIG_NAME( ibm5160_mb_config ); -} - - -static INPUT_PORTS_START( ibm5160_mb ) - PORT_START("DSW0") /* IN1 */ - PORT_DIPNAME( 0xc0, 0x40, "Number of floppy drives") - PORT_DIPSETTING( 0x00, "1" ) - PORT_DIPSETTING( 0x40, "2" ) - PORT_DIPSETTING( 0x80, "3" ) - PORT_DIPSETTING( 0xc0, "4" ) - PORT_DIPNAME( 0x30, 0x30, "Graphics adapter") - PORT_DIPSETTING( 0x00, "EGA/VGA" ) - PORT_DIPSETTING( 0x10, "Color 40x25" ) - PORT_DIPSETTING( 0x20, "Color 80x25" ) - PORT_DIPSETTING( 0x30, "Monochrome" ) - PORT_DIPNAME( 0x0c, 0x0c, "RAM banks") - PORT_DIPSETTING( 0x00, "1 - 16/ 64/256K" ) - PORT_DIPSETTING( 0x04, "2 - 32/128/512K" ) - PORT_DIPSETTING( 0x08, "3 - 48/192/576K" ) - PORT_DIPSETTING( 0x0c, "4 - 64/256/640K" ) - PORT_DIPNAME( 0x02, 0x00, "8087 installed") - PORT_DIPSETTING( 0x00, DEF_STR(No) ) - PORT_DIPSETTING( 0x02, DEF_STR(Yes) ) - PORT_DIPNAME( 0x01, 0x01, "Boot from floppy") - PORT_DIPSETTING( 0x01, DEF_STR(Yes) ) - PORT_DIPSETTING( 0x00, DEF_STR(No) ) -INPUT_PORTS_END -//------------------------------------------------- -// input_ports - device-specific input ports -//------------------------------------------------- - -ioport_constructor ibm5160_mb_device::device_input_ports() const -{ - return INPUT_PORTS_NAME( ibm5160_mb ); -} - - -void ibm5160_mb_device::static_set_cputag(device_t &device, const char *tag) -{ - ibm5160_mb_device &board = downcast<ibm5160_mb_device &>(device); - board.m_cputag = tag; -} - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// ibm5160_mb_device - constructor -//------------------------------------------------- - -ibm5160_mb_device::ibm5160_mb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, IBM5160_MOTHERBOARD, "IBM5160_MOTHERBOARD", tag, owner, clock, "ibm5160_mb", __FILE__), - m_maincpu(*owner, "maincpu"), - m_pic8259(*this, "pic8259"), - m_dma8237(*this, "dma8237"), - m_pit8253(*this, "pit8253"), - m_ppi8255(*this, "ppi8255"), - m_speaker(*this, "speaker"), - m_isabus(*this, "isa"), - m_pc_kbdc(*this, "pc_kbdc"), - m_ram(*this, ":" RAM_TAG) -{ -} - -void ibm5160_mb_device::install_device(offs_t start, offs_t end, offs_t mask, offs_t mirror, read8_delegate rhandler, write8_delegate whandler) -{ - int buswidth = m_maincpu->space_config(AS_IO)->m_databus_width; - switch(buswidth) - { - case 8: - if(!rhandler.isnull()) m_maincpu->space(AS_IO).install_read_handler(start, end, mask, mirror, rhandler, 0); - if(!whandler.isnull()) m_maincpu->space(AS_IO).install_write_handler(start, end, mask, mirror, whandler, 0); - break; - case 16: - if(!rhandler.isnull()) m_maincpu->space(AS_IO).install_read_handler(start, end, mask, mirror, rhandler, 0xffff); - if(!whandler.isnull()) m_maincpu->space(AS_IO).install_write_handler(start, end, mask, mirror, whandler, 0xffff); - break; - default: - fatalerror("IBM5160_MOTHERBOARD: Bus width %d not supported\n", buswidth); - } -} - - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void ibm5160_mb_device::device_start() -{ - install_device(0x0000, 0x000f, 0, 0, read8_delegate(FUNC(am9517a_device::read), (am9517a_device*)m_dma8237), write8_delegate(FUNC(am9517a_device::write), (am9517a_device*)m_dma8237) ); - install_device(0x0020, 0x0021, 0, 0, read8_delegate(FUNC(pic8259_device::read), (pic8259_device*)m_pic8259), write8_delegate(FUNC(pic8259_device::write), (pic8259_device*)m_pic8259) ); - install_device(0x0040, 0x0043, 0, 0, read8_delegate(FUNC(pit8253_device::read), (pit8253_device*)m_pit8253), write8_delegate(FUNC(pit8253_device::write), (pit8253_device*)m_pit8253) ); - install_device(0x0060, 0x0063, 0, 0, read8_delegate(FUNC(i8255_device::read), (i8255_device*)m_ppi8255), write8_delegate(FUNC(i8255_device::write), (i8255_device*)m_ppi8255) ); - install_device(0x0080, 0x0087, 0, 0, read8_delegate(FUNC(ibm5160_mb_device::pc_page_r), this), write8_delegate(FUNC(ibm5160_mb_device::pc_page_w),this) ); - install_device(0x00a0, 0x00a1, 0, 0, read8_delegate(), write8_delegate(FUNC(ibm5160_mb_device::nmi_enable_w),this)); - /* MESS managed RAM */ - if ( m_ram->pointer() ) - membank( "bank10" )->set_base( m_ram->pointer() ); -} - - -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void ibm5160_mb_device::device_reset() -{ - m_u73_q2 = 0; - m_out1 = 2; // initial state of pit output is undefined - m_pc_spkrdata = 0; - m_pit_out2 = 1; - m_dma_channel = -1; - m_cur_eop = false; - memset(m_dma_offset,0,sizeof(m_dma_offset)); - m_ppi_portc_switch_high = 0; - m_ppi_speaker = 0; - m_ppi_keyboard_clear = 0; - m_ppi_keyb_clock = 0; - m_ppi_portb = 0; - m_ppi_clock_signal = 0; - m_ppi_data_signal = 0; - m_ppi_shift_register = 0; - m_ppi_shift_enable = 0; - m_nmi_enabled = 0; - m_speaker->level_w(0); -} - - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -const device_type IBM5150_MOTHERBOARD = &device_creator<ibm5150_mb_device>; - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** -static MACHINE_CONFIG_FRAGMENT( ibm5150_mb_config ) - MCFG_FRAGMENT_ADD(ibm5160_mb_config) - - MCFG_DEVICE_MODIFY("pc_kbdc") - MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(ibm5150_mb_device, keyboard_clock_w)) - - MCFG_CASSETTE_ADD( "cassette" ) - MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED) -MACHINE_CONFIG_END - - -//------------------------------------------------- -// machine_config_additions - device-specific -// machine configurations -//------------------------------------------------- - -machine_config_constructor ibm5150_mb_device::device_mconfig_additions() const -{ - return MACHINE_CONFIG_NAME( ibm5150_mb_config ); -} - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// ibm5150_mb_device - constructor -//------------------------------------------------- - -ibm5150_mb_device::ibm5150_mb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : ibm5160_mb_device(mconfig, tag, owner, clock), - m_cassette(*this, "cassette") -{ -} - -void ibm5150_mb_device::device_start() -{ - ibm5160_mb_device::device_start(); -} -void ibm5150_mb_device::device_reset() -{ - ibm5160_mb_device::device_reset(); -} - -READ8_MEMBER (ibm5150_mb_device::pc_ppi_porta_r) -{ - int data = 0xFF; - /* KB port A */ - if (m_ppi_keyboard_clear) - { - /* 0 0 - no floppy drives - * 1 Not used - * 2-3 The number of memory banks on the system board - * 4-5 Display mode - * 11 = monochrome - * 10 - color 80x25 - * 01 - color 40x25 - * 6-7 The number of floppy disk drives - */ - data = ioport("DSW0")->read() & 0xF3; - switch ( m_ram->size() ) - { - case 16 * 1024: - data |= 0x00; - break; - case 32 * 1024: /* Need to verify if this is correct */ - data |= 0x04; - break; - case 48 * 1024: /* Need to verify if this is correct */ - data |= 0x08; - break; - default: - data |= 0x0C; - break; - } - } - else - { - data = m_ppi_shift_register; - } - PIO_LOG(1,"PIO_A_r",("$%02x\n", data)); - return data; -} - - -READ8_MEMBER ( ibm5150_mb_device::pc_ppi_portc_r ) -{ - int data=0xff; - - data&=~0x80; // no parity error - data&=~0x40; // no error on expansion board - /* KB port C: equipment flags */ - if (m_ppi_portc_switch_high) - { - /* read hi nibble of SW2 */ - data = data & 0xf0; - - switch ( m_ram->size() - 64 * 1024 ) - { - case 64 * 1024: data |= 0x00; break; - case 128 * 1024: data |= 0x02; break; - case 192 * 1024: data |= 0x04; break; - case 256 * 1024: data |= 0x06; break; - case 320 * 1024: data |= 0x08; break; - case 384 * 1024: data |= 0x0A; break; - case 448 * 1024: data |= 0x0C; break; - case 512 * 1024: data |= 0x0E; break; - case 576 * 1024: data |= 0x01; break; - case 640 * 1024: data |= 0x03; break; - case 704 * 1024: data |= 0x05; break; - case 768 * 1024: data |= 0x07; break; - case 832 * 1024: data |= 0x09; break; - case 896 * 1024: data |= 0x0B; break; - case 960 * 1024: data |= 0x0D; break; - } - if ( m_ram->size() > 960 * 1024 ) - data |= 0x0D; - - PIO_LOG(1,"PIO_C_r (hi)",("$%02x\n", data)); - } - else - { - /* read lo nibble of S2 */ - data = (data & 0xf0) | (ioport("DSW0")->read() & 0x0f); - PIO_LOG(1,"PIO_C_r (lo)",("$%02x\n", data)); - } - - if ( ! ( m_ppi_portb & 0x08 ) ) - { - double tap_val = m_cassette->input(); - - if ( tap_val < 0 ) - { - data &= ~0x10; - } - else - { - data |= 0x10; - } - } - else - { - if ( m_ppi_portb & 0x01 ) - { - data = ( data & ~0x10 ) | ( m_pit_out2 ? 0x10 : 0x00 ); - } - } - data = ( data & ~0x20 ) | ( m_pit_out2 ? 0x20 : 0x00 ); - - return data; -} - - -WRITE8_MEMBER( ibm5150_mb_device::pc_ppi_portb_w ) -{ - /* KB controller port B */ - m_ppi_portb = data; - m_ppi_portc_switch_high = data & 0x08; - m_ppi_keyboard_clear = data & 0x80; - m_ppi_keyb_clock = data & 0x40; - m_pit8253->write_gate2(BIT(data, 0)); - pc_speaker_set_spkrdata( data & 0x02 ); - - m_cassette->change_state(( data & 0x08 ) ? CASSETTE_MOTOR_DISABLED : CASSETTE_MOTOR_ENABLED,CASSETTE_MASK_MOTOR); - - /* If PB7 is set clear the shift register and reset the IRQ line */ - if ( m_ppi_keyboard_clear ) - { - m_ppi_shift_register = 0; - m_ppi_shift_enable = 0; - m_pic8259->ir1_w(m_ppi_shift_enable); - } - - m_pc_kbdc->data_write_from_mb(!m_ppi_shift_enable); - m_ppi_clock_signal = ( m_ppi_keyb_clock ) ? 1 : 0; - m_pc_kbdc->clock_write_from_mb(m_ppi_clock_signal); -} - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -const device_type EC1841_MOTHERBOARD = &device_creator<ec1841_mb_device>; - -static MACHINE_CONFIG_FRAGMENT( ec1841_mb_config ) - MCFG_FRAGMENT_ADD(ibm5160_mb_config) - - MCFG_DEVICE_MODIFY("pc_kbdc") - MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(ec1841_mb_device, keyboard_clock_w)) -MACHINE_CONFIG_END - - -//------------------------------------------------- -// machine_config_additions - device-specific -// machine configurations -//------------------------------------------------- - -machine_config_constructor ec1841_mb_device::device_mconfig_additions() const -{ - return MACHINE_CONFIG_NAME( ec1841_mb_config ); -} - -static INPUT_PORTS_START( ec1841_mb ) - PORT_START("DSW0") /* SA1 */ - PORT_DIPNAME( 0xc0, 0x40, "Number of floppy drives") - PORT_DIPSETTING( 0x00, "1" ) - PORT_DIPSETTING( 0x40, "2" ) - PORT_DIPSETTING( 0x80, "3" ) - PORT_DIPSETTING( 0xc0, "4" ) - PORT_DIPNAME( 0x30, 0x20, "Graphics adapter") - PORT_DIPSETTING( 0x00, "Reserved" ) - PORT_DIPSETTING( 0x10, "Color 40x25" ) - PORT_DIPSETTING( 0x20, "Color 80x25" ) - PORT_DIPSETTING( 0x30, "Monochrome" ) - PORT_BIT( 0x08, 0x08, IPT_UNUSED ) - /* BIOS does not support booting from QD floppies */ - PORT_DIPNAME( 0x04, 0x04, "Floppy type") - PORT_DIPSETTING( 0x00, "80 tracks" ) - PORT_DIPSETTING( 0x04, "40 tracks" ) - PORT_DIPNAME( 0x02, 0x00, "8087 installed") - PORT_DIPSETTING( 0x00, DEF_STR(No) ) - PORT_DIPSETTING( 0x02, DEF_STR(Yes) ) - PORT_DIPNAME( 0x01, 0x01, "Boot from floppy") - PORT_DIPSETTING( 0x01, DEF_STR(Yes) ) - PORT_DIPSETTING( 0x00, DEF_STR(No) ) - - PORT_START("SA2") - PORT_DIPNAME( 0x04, 0x04, "Speech synthesizer") - PORT_DIPSETTING( 0x00, "Installed" ) - PORT_DIPSETTING( 0x04, "Not installed" ) -INPUT_PORTS_END - -//------------------------------------------------- -// input_ports - device-specific input ports -//------------------------------------------------- - -ioport_constructor ec1841_mb_device::device_input_ports() const -{ - return INPUT_PORTS_NAME( ec1841_mb ); -} - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// ec1841_mb_device - constructor -//------------------------------------------------- - -ec1841_mb_device::ec1841_mb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : ibm5160_mb_device(mconfig, tag, owner, clock) -{ -} - -void ec1841_mb_device::device_start() -{ - ibm5160_mb_device::device_start(); -} -void ec1841_mb_device::device_reset() -{ - ibm5160_mb_device::device_reset(); -} - -// kbd interface is 5150-like but PB2 controls access to second bank of DIP switches (SA2). -WRITE8_MEMBER( ec1841_mb_device::pc_ppi_portb_w ) -{ - /* KB controller port B */ - m_ppi_portb = data; - m_ppi_portc_switch_high = data & 0x04; - m_ppi_keyboard_clear = data & 0x80; - m_ppi_keyb_clock = data & 0x40; - m_pit8253->write_gate2(BIT(data, 0)); - pc_speaker_set_spkrdata( data & 0x02 ); - - /* If PB7 is set clear the shift register and reset the IRQ line */ - if ( m_ppi_keyboard_clear ) - { - m_ppi_shift_register = 0; - m_ppi_shift_enable = 0; - m_pic8259->ir1_w(m_ppi_shift_enable); - } - - m_pc_kbdc->data_write_from_mb(!m_ppi_shift_enable); - m_ppi_clock_signal = ( m_ppi_keyb_clock ) ? 1 : 0; - m_pc_kbdc->clock_write_from_mb(m_ppi_clock_signal); -} - -READ8_MEMBER ( ec1841_mb_device::pc_ppi_portc_r ) -{ - int data=0xff; - - data&=~0x80; // no parity error - data&=~0x40; // no error on expansion board - - if (m_ppi_portc_switch_high) - { - data = (data & 0xf0) | (ioport("SA2")->read() & 0x0f); - } - - data = ( data & ~0x20 ) | ( m_pit_out2 ? 0x20 : 0x00 ); - - return data; -} - -pc_noppi_mb_device::pc_noppi_mb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : ibm5160_mb_device(mconfig, tag, owner, clock) -{ -} - -//************************************************************************** -// DEVICE CONFIGURATION -//************************************************************************** - -static MACHINE_CONFIG_FRAGMENT( pc_noppi_mb_config ) - MCFG_FRAGMENT_ADD(ibm5160_mb_config) - - MCFG_DEVICE_REMOVE("pc_kbdc") - MCFG_DEVICE_REMOVE("ppi8255") -MACHINE_CONFIG_END - -static INPUT_PORTS_START( pc_noppi_mb ) -INPUT_PORTS_END - -//------------------------------------------------- -// machine_config_additions - device-specific -// machine configurations -//------------------------------------------------- - -machine_config_constructor pc_noppi_mb_device::device_mconfig_additions() const -{ - return MACHINE_CONFIG_NAME( pc_noppi_mb_config ); -} - -ioport_constructor pc_noppi_mb_device::device_input_ports() const -{ - return INPUT_PORTS_NAME( pc_noppi_mb ); -} - -void pc_noppi_mb_device::device_start() -{ - install_device(0x0000, 0x000f, 0, 0, read8_delegate(FUNC(am9517a_device::read), (am9517a_device*)m_dma8237), write8_delegate(FUNC(am9517a_device::write), (am9517a_device*)m_dma8237) ); - install_device(0x0020, 0x0021, 0, 0, read8_delegate(FUNC(pic8259_device::read), (pic8259_device*)m_pic8259), write8_delegate(FUNC(pic8259_device::write), (pic8259_device*)m_pic8259) ); - install_device(0x0040, 0x0043, 0, 0, read8_delegate(FUNC(pit8253_device::read), (pit8253_device*)m_pit8253), write8_delegate(FUNC(pit8253_device::write), (pit8253_device*)m_pit8253) ); - install_device(0x0080, 0x0087, 0, 0, read8_delegate(FUNC(ibm5160_mb_device::pc_page_r), this), write8_delegate(FUNC(ibm5160_mb_device::pc_page_w),this) ); - install_device(0x00a0, 0x00a1, 0, 0, read8_delegate(), write8_delegate(FUNC(ibm5160_mb_device::nmi_enable_w),this)); - /* MESS managed RAM */ - if ( m_ram->pointer() ) - membank( "bank10" )->set_base( m_ram->pointer() ); -} - -const device_type PCNOPPI_MOTHERBOARD = &device_creator<pc_noppi_mb_device>; |