summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/genpc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/genpc.cpp')
-rw-r--r--src/devices/machine/genpc.cpp218
1 files changed, 107 insertions, 111 deletions
diff --git a/src/devices/machine/genpc.cpp b/src/devices/machine/genpc.cpp
index 3163fa1d9c5..b0e57789932 100644
--- a/src/devices/machine/genpc.cpp
+++ b/src/devices/machine/genpc.cpp
@@ -4,11 +4,10 @@
machine/genpc.cpp
-
***************************************************************************/
#include "emu.h"
-#include "machine/genpc.h"
+#include "genpc.h"
#include "imagedev/cassette.h"
#include "machine/i8255.h"
@@ -16,6 +15,7 @@
#include "machine/pit8253.h"
#include "machine/ram.h"
#include "sound/spkrdev.h"
+
#include "speaker.h"
@@ -55,7 +55,7 @@ void ibm5160_mb_device::pc_page_w(offs_t offset, uint8_t data)
}
-WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dma_hrq_changed )
+void ibm5160_mb_device::pc_dma_hrq_changed(int state)
{
m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
@@ -126,10 +126,10 @@ void ibm5160_mb_device::pc_dma8237_0_dack_w(uint8_t data)
}
-WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dma8237_out_eop )
+void ibm5160_mb_device::pc_dma8237_out_eop(int state)
{
m_cur_eop = state == ASSERT_LINE;
- if(m_dma_channel != -1 && m_cur_eop)
+ if(m_dma_channel != -1)
m_isabus->eop_w(m_dma_channel, m_cur_eop ? ASSERT_LINE : CLEAR_LINE );
}
@@ -149,10 +149,10 @@ void ibm5160_mb_device::pc_select_dma_channel(int channel, bool state)
}
}
-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); }
+void ibm5160_mb_device::pc_dack0_w(int state) { pc_select_dma_channel(0, state); }
+void ibm5160_mb_device::pc_dack1_w(int state) { pc_select_dma_channel(1, state); }
+void ibm5160_mb_device::pc_dack2_w(int state) { pc_select_dma_channel(2, state); }
+void ibm5160_mb_device::pc_dack3_w(int state) { pc_select_dma_channel(3, state); }
/*************************************************************
*
@@ -160,13 +160,13 @@ WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dack3_w ) { pc_select_dma_channel(3, st
*
*************************************************************/
-WRITE_LINE_MEMBER(ibm5160_mb_device::pc_speaker_set_spkrdata)
+void ibm5160_mb_device::pc_speaker_set_spkrdata(int state)
{
m_pc_spkrdata = state ? 1 : 0;
m_speaker->level_w(m_pc_spkrdata & m_pit_out2);
}
-WRITE_LINE_MEMBER(ibm5160_mb_device::pic_int_w)
+void ibm5160_mb_device::pic_int_w(int state)
{
m_int_callback(state);
}
@@ -178,7 +178,7 @@ WRITE_LINE_MEMBER(ibm5160_mb_device::pic_int_w)
*
*************************************************************/
-WRITE_LINE_MEMBER( ibm5160_mb_device::pc_pit8253_out1_changed )
+void ibm5160_mb_device::pc_pit8253_out1_changed(int state)
{
/* Trigger DMA channel #0 */
if ( m_out1 == 0 && state == 1 && m_u73_q2 == 0 )
@@ -190,13 +190,13 @@ WRITE_LINE_MEMBER( ibm5160_mb_device::pc_pit8253_out1_changed )
}
-WRITE_LINE_MEMBER( ibm5160_mb_device::pc_pit8253_out2_changed )
+void ibm5160_mb_device::pc_pit8253_out2_changed(int state)
{
m_pit_out2 = state ? 1 : 0;
m_speaker->level_w(m_pc_spkrdata & m_pit_out2);
}
-WRITE_LINE_MEMBER( ibm5150_mb_device::pc_pit8253_out2_changed )
+void ibm5150_mb_device::pc_pit8253_out2_changed(int state)
{
ibm5160_mb_device::pc_pit8253_out2_changed(state);
m_cassette->output(m_pit_out2 ? 1.0 : -1.0);
@@ -258,7 +258,7 @@ WRITE_LINE_MEMBER( ibm5150_mb_device::pc_pit8253_out2_changed )
* ON ON - one disk drive
*
**********************************************************/
-WRITE_LINE_MEMBER( ibm5150_mb_device::keyboard_clock_w )
+void ibm5150_mb_device::keyboard_clock_w(int state)
{
if (!m_ppi_keyboard_clear && !state && !m_ppi_shift_enable)
{
@@ -268,11 +268,11 @@ WRITE_LINE_MEMBER( ibm5150_mb_device::keyboard_clock_w )
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);
+ m_kbddata_callback(!m_ppi_shift_enable);
}
}
-WRITE_LINE_MEMBER( ec1841_mb_device::keyboard_clock_w )
+void ec1841_mb_device::keyboard_clock_w(int state)
{
if (!m_ppi_keyboard_clear && !state && !m_ppi_shift_enable)
{
@@ -282,11 +282,11 @@ WRITE_LINE_MEMBER( ec1841_mb_device::keyboard_clock_w )
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);
+ m_kbddata_callback(!m_ppi_shift_enable);
}
}
-WRITE_LINE_MEMBER( ibm5160_mb_device::keyboard_clock_w )
+void ibm5160_mb_device::keyboard_clock_w(int state)
{
if (!m_ppi_keyboard_clear && !state && !m_ppi_shift_enable)
{
@@ -296,12 +296,12 @@ WRITE_LINE_MEMBER( ibm5160_mb_device::keyboard_clock_w )
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);
+ m_kbddata_callback(!m_ppi_shift_enable);
}
}
-WRITE_LINE_MEMBER( ibm5160_mb_device::keyboard_data_w )
+void ibm5160_mb_device::keyboard_data_w(int state)
{
m_ppi_data_signal = state;
}
@@ -380,9 +380,9 @@ void ibm5160_mb_device::pc_ppi_portb_w(uint8_t data)
m_pic8259->ir1_w(m_ppi_shift_enable);
}
- m_pc_kbdc->data_write_from_mb(!m_ppi_shift_enable);
+ m_kbddata_callback(!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);
+ m_kbdclk_callback(m_ppi_clock_signal);
}
@@ -399,7 +399,7 @@ void ibm5160_mb_device::nmi_enable_w(uint8_t data)
m_nmi_callback(CLEAR_LINE);
}
-WRITE_LINE_MEMBER( ibm5160_mb_device::iochck_w )
+void ibm5160_mb_device::iochck_w(int state)
{
if (m_nmi_enabled && !state)
m_nmi_callback(ASSERT_LINE);
@@ -450,7 +450,7 @@ void ibm5160_mb_device::device_add_mconfig(machine_config &config)
PIC8259(config, m_pic8259);
m_pic8259->out_int_callback().set(FUNC(ibm5160_mb_device::pic_int_w));
- I8255A(config, m_ppi8255, 0);
+ I8255A(config, m_ppi8255);
m_ppi8255->in_pa_callback().set(FUNC(ibm5160_mb_device::pc_ppi_porta_r));
m_ppi8255->out_pb_callback().set(FUNC(ibm5160_mb_device::pc_ppi_portb_w));
m_ppi8255->in_pc_callback().set(FUNC(ibm5160_mb_device::pc_ppi_portc_r));
@@ -469,10 +469,6 @@ void ibm5160_mb_device::device_add_mconfig(machine_config &config)
m_isabus->drq3_callback().set(m_dma8237, FUNC(am9517a_device::dreq3_w));
m_isabus->iochck_callback().set(FUNC(ibm5160_mb_device::iochck_w));
- PC_KBDC(config, m_pc_kbdc, 0);
- m_pc_kbdc->out_clock_cb().set(FUNC(ibm5160_mb_device::keyboard_clock_w));
- m_pc_kbdc->out_data_cb().set(FUNC(ibm5160_mb_device::keyboard_data_w));
-
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
@@ -481,25 +477,25 @@ void ibm5160_mb_device::device_add_mconfig(machine_config &config)
static INPUT_PORTS_START( ibm5160_mb )
PORT_START("DSW0") /* IN1 */
- PORT_DIPNAME( 0xc0, 0x40, "Number of floppy drives")
+ PORT_DIPNAME( 0xc0, 0x40, "Number of floppy drives") PORT_DIPLOCATION("SW1:7,8")
PORT_DIPSETTING( 0x00, "1" )
PORT_DIPSETTING( 0x40, "2" )
PORT_DIPSETTING( 0x80, "3" )
PORT_DIPSETTING( 0xc0, "4" )
- PORT_DIPNAME( 0x30, 0x30, "Graphics adapter")
+ PORT_DIPNAME( 0x30, 0x30, "Graphics adapter") PORT_DIPLOCATION("SW1:5,6")
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_DIPNAME( 0x0c, 0x0c, "RAM banks") PORT_DIPLOCATION("SW1:3,4")
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_DIPNAME( 0x02, 0x00, "8087 installed") PORT_DIPLOCATION("SW1:2")
PORT_DIPSETTING( 0x00, DEF_STR(No) )
PORT_DIPSETTING( 0x02, DEF_STR(Yes) )
- PORT_DIPNAME( 0x01, 0x01, "Boot from floppy")
+ PORT_DIPNAME( 0x01, 0x01, "Boot from floppy") PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x01, DEF_STR(Yes) )
PORT_DIPSETTING( 0x00, DEF_STR(No) )
INPUT_PORTS_END
@@ -540,10 +536,11 @@ ibm5160_mb_device::ibm5160_mb_device(
, m_ppi8255(*this, "ppi8255")
, m_speaker(*this, "speaker")
, m_isabus(*this, "isa")
- , m_pc_kbdc(*this, "pc_kbdc")
, m_ram(*this, ":" RAM_TAG)
, m_int_callback(*this)
, m_nmi_callback(*this)
+ , m_kbdclk_callback(*this)
+ , m_kbddata_callback(*this)
{
}
@@ -559,19 +556,6 @@ void ibm5160_mb_device::map(address_map &map)
//-------------------------------------------------
-// device_resolve_objects - resolve objects that
-// may be needed for other devices to set
-// initial conditions at start time
-//-------------------------------------------------
-
-void ibm5160_mb_device::device_resolve_objects()
-{
- m_int_callback.resolve_safe();
- m_nmi_callback.resolve_safe();
-}
-
-
-//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
@@ -628,13 +612,66 @@ void ibm5150_mb_device::device_add_mconfig(machine_config &config)
{
ibm5160_mb_device::device_add_mconfig(config);
- subdevice<pc_kbdc_device>("pc_kbdc")->out_clock_cb().set(FUNC(ibm5150_mb_device::keyboard_clock_w));
-
m_ppi8255->out_pb_callback().set(FUNC(ibm5150_mb_device::pc_ppi_portb_w));
m_ppi8255->in_pc_callback().set(FUNC(ibm5150_mb_device::pc_ppi_portc_r));
CASSETTE(config, m_cassette);
m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
+ m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05);
+ m_cassette->set_interface("ibm5150_cass");
+}
+
+static INPUT_PORTS_START( ibm5150_mb )
+ PORT_START("DSW0")
+ PORT_DIPNAME( 0xc0, 0x40, "Number of floppy drives") PORT_DIPLOCATION("SW1:7,8")
+ PORT_DIPSETTING( 0x00, "1" )
+ PORT_DIPSETTING( 0x40, "2" )
+ PORT_DIPSETTING( 0x80, "3" )
+ PORT_DIPSETTING( 0xc0, "4" )
+ PORT_DIPNAME( 0x30, 0x30, "Graphics adapter") PORT_DIPLOCATION("SW1:5,6")
+ PORT_DIPSETTING( 0x00, "EGA/VGA" )
+ PORT_DIPSETTING( 0x10, "Color 40x25" )
+ PORT_DIPSETTING( 0x20, "Color 80x25" )
+ PORT_DIPSETTING( 0x30, "Monochrome" )
+ PORT_DIPNAME( 0x0c, 0x0c, "Base RAM size") PORT_DIPLOCATION("SW1:3,4")
+ PORT_DIPSETTING( 0x00, "16K" )
+ PORT_DIPSETTING( 0x04, "32K" )
+ PORT_DIPSETTING( 0x08, "48K" )
+ PORT_DIPSETTING( 0x0c, "64K" )
+ PORT_DIPNAME( 0x02, 0x00, "8087 installed") PORT_DIPLOCATION("SW1:2")
+ PORT_DIPSETTING( 0x00, DEF_STR(No) )
+ PORT_DIPSETTING( 0x02, DEF_STR(Yes) )
+ PORT_DIPNAME( 0x01, 0x01, "Boot from floppy") PORT_DIPLOCATION("SW1:1")
+ PORT_DIPSETTING( 0x01, DEF_STR(Yes) )
+ PORT_DIPSETTING( 0x00, DEF_STR(No) )
+
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x1f, 0x12, "Extra RAM size") PORT_DIPLOCATION("SW2:1,2,3,4,5")
+ PORT_DIPSETTING( 0x00, "None" )
+ PORT_DIPSETTING( 0x01, "32K" )
+ PORT_DIPSETTING( 0x02, "64K" )
+ PORT_DIPSETTING( 0x03, "96K" )
+ PORT_DIPSETTING( 0x04, "128K" )
+ PORT_DIPSETTING( 0x05, "160K" )
+ PORT_DIPSETTING( 0x06, "192K" )
+ PORT_DIPSETTING( 0x07, "224K" )
+ PORT_DIPSETTING( 0x08, "256K" )
+ PORT_DIPSETTING( 0x09, "288K" )
+ PORT_DIPSETTING( 0x0a, "320K" )
+ PORT_DIPSETTING( 0x0b, "352K" )
+ PORT_DIPSETTING( 0x0c, "384K" )
+ PORT_DIPSETTING( 0x0d, "416K" )
+ PORT_DIPSETTING( 0x0e, "448K" )
+ PORT_DIPSETTING( 0x0f, "480K" )
+ PORT_DIPSETTING( 0x10, "512K" )
+ PORT_DIPSETTING( 0x11, "544K" )
+ PORT_DIPSETTING( 0x12, "576K" )
+ PORT_DIPUNUSED_DIPLOC( 0xe0, 0x00, "SW2:6,7,8" )
+INPUT_PORTS_END
+
+ioport_constructor ibm5150_mb_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( ibm5150_mb );
}
//**************************************************************************
@@ -662,31 +699,7 @@ uint8_t ibm5150_mb_device::pc_ppi_porta_r()
/* 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;
- }
+ data = ioport("DSW0")->read();
}
else
{
@@ -706,37 +719,11 @@ uint8_t ibm5150_mb_device::pc_ppi_portc_r()
/* 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));
+ data = (data & 0xf0) | ioport("DSW1")->read();
}
else
{
- /* read lo nibble of S2 */
- data = (data & 0xf0) | (ioport("DSW0")->read() & 0x0f);
- PIO_LOG(1,"PIO_C_r (lo)",("$%02x\n", data));
+ data = (data & 0xf0) | (ioport("DSW1")->read() >> 4);
}
if ( ! ( m_ppi_portb & 0x08 ) )
@@ -769,7 +756,7 @@ void ibm5150_mb_device::pc_ppi_portb_w(uint8_t data)
{
/* KB controller port B */
m_ppi_portb = data;
- m_ppi_portc_switch_high = data & 0x08;
+ 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));
@@ -785,9 +772,9 @@ void ibm5150_mb_device::pc_ppi_portb_w(uint8_t data)
m_pic8259->ir1_w(m_ppi_shift_enable);
}
- m_pc_kbdc->data_write_from_mb(!m_ppi_shift_enable);
+ m_kbddata_callback(!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);
+ m_kbdclk_callback(m_ppi_clock_signal);
}
//**************************************************************************
@@ -918,8 +905,6 @@ void ec1841_mb_device::device_add_mconfig(machine_config &config)
m_ppi8255->out_pb_callback().set(FUNC(ec1841_mb_device::pc_ppi_portb_w));
m_ppi8255->in_pc_callback().set(FUNC(ec1841_mb_device::pc_ppi_portc_r));
-
- subdevice<pc_kbdc_device>("pc_kbdc")->out_clock_cb().set(FUNC(ec1841_mb_device::keyboard_clock_w));
}
static INPUT_PORTS_START( ec1841_mb )
@@ -1003,9 +988,9 @@ void ec1841_mb_device::pc_ppi_portb_w(uint8_t data)
m_pic8259->ir1_w(m_ppi_shift_enable);
}
- m_pc_kbdc->data_write_from_mb(!m_ppi_shift_enable);
+ m_kbddata_callback(!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);
+ m_kbdclk_callback(m_ppi_clock_signal);
}
uint8_t ec1841_mb_device::pc_ppi_portc_r()
@@ -1048,7 +1033,6 @@ void pc_noppi_mb_device::device_add_mconfig(machine_config &config)
{
ibm5160_mb_device::device_add_mconfig(config);
- config.device_remove("pc_kbdc");
config.device_remove("ppi8255");
}
@@ -1060,11 +1044,23 @@ ioport_constructor pc_noppi_mb_device::device_input_ports() const
return INPUT_PORTS_NAME( pc_noppi_mb );
}
+uint8_t pc_noppi_mb_device::pc_ppi_porta_r()
+{
+ return m_ppi_shift_register;
+}
+
+uint8_t pc_noppi_mb_device::pc_ppi_portb_r()
+{
+ return m_ppi_portb;
+}
+
void pc_noppi_mb_device::map(address_map &map)
{
map(0x0000, 0x000f).rw("dma8237", FUNC(am9517a_device::read), FUNC(am9517a_device::write));
map(0x0020, 0x002f).rw("pic8259", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0x0040, 0x004f).rw("pit8253", FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0x0060, 0x0060).r(FUNC(pc_noppi_mb_device::pc_ppi_porta_r));
+ map(0x0061, 0x0061).rw(FUNC(pc_noppi_mb_device::pc_ppi_portb_r), FUNC(pc_noppi_mb_device::pc_ppi_portb_w));
map(0x0080, 0x008f).w(FUNC(pc_noppi_mb_device::pc_page_w));
map(0x00a0, 0x00a1).w(FUNC(pc_noppi_mb_device::nmi_enable_w));
}