(MESS) pasogo.c: Add some more pc devices. (nw)

This commit is contained in:
Wilbert Pol 2013-05-27 19:19:38 +00:00
parent 6806269f61
commit c1290f47bb

View File

@ -93,6 +93,10 @@ Notes:
although it is very related to standard pc hardware, it is different enough although it is very related to standard pc hardware, it is different enough
to make the standard pc driver one level more complex, so own driver to make the standard pc driver one level more complex, so own driver
TODO:
- Make a separate device of the Vadem VG230 core (it is also used in the HP
OmniGo 100 and 120).
******************************************************************************/ ******************************************************************************/
#include "emu.h" #include "emu.h"
@ -101,6 +105,9 @@ to make the standard pc driver one level more complex, so own driver
#include "machine/pic8259.h" #include "machine/pic8259.h"
#include "machine/pit8253.h" #include "machine/pit8253.h"
#include "machine/am9517a.h" #include "machine/am9517a.h"
#include "sound/speaker.h"
#include "machine/i8255.h"
/* /*
rtc interrupt irq 2 rtc interrupt irq 2
@ -148,12 +155,15 @@ public:
, m_pic8259(*this, "pic8259") , m_pic8259(*this, "pic8259")
, m_dma8237(*this, "dma8237") , m_dma8237(*this, "dma8237")
, m_pit8253(*this, "pit8254") , m_pit8253(*this, "pit8254")
, m_speaker(*this, "speaker")
{ } { }
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<pic8259_device> m_pic8259; required_device<pic8259_device> m_pic8259;
required_device<am9517a_device> m_dma8237; required_device<am9517a_device> m_dma8237;
required_device<pit8253_device> m_pit8253; required_device<pit8253_device> m_pit8253;
required_device<speaker_sound_device> m_speaker;
DECLARE_READ8_MEMBER(ems_r); DECLARE_READ8_MEMBER(ems_r);
DECLARE_WRITE8_MEMBER(ems_w); DECLARE_WRITE8_MEMBER(ems_w);
DECLARE_READ8_MEMBER(vg230_io_r); DECLARE_READ8_MEMBER(vg230_io_r);
@ -170,6 +180,11 @@ public:
IRQ_CALLBACK_MEMBER(pasogo_irq_callback); IRQ_CALLBACK_MEMBER(pasogo_irq_callback);
void vg230_reset(); void vg230_reset();
void vg230_init(); void vg230_init();
DECLARE_READ8_MEMBER( page_r );
DECLARE_WRITE8_MEMBER( page_w );
DECLARE_WRITE_LINE_MEMBER( speaker_set_spkrdata );
DECLARE_WRITE_LINE_MEMBER( pit8253_out1_changed );
DECLARE_WRITE_LINE_MEMBER( pit8253_out2_changed );
DECLARE_WRITE_LINE_MEMBER( dma_hrq_changed ); DECLARE_WRITE_LINE_MEMBER( dma_hrq_changed );
DECLARE_WRITE_LINE_MEMBER( dma8237_out_eop ); DECLARE_WRITE_LINE_MEMBER( dma8237_out_eop );
DECLARE_READ8_MEMBER( dma_read_byte ); DECLARE_READ8_MEMBER( dma_read_byte );
@ -186,12 +201,29 @@ public:
DECLARE_WRITE_LINE_MEMBER( dack1_w ) { select_dma_channel(1, state); } DECLARE_WRITE_LINE_MEMBER( dack1_w ) { select_dma_channel(1, state); }
DECLARE_WRITE_LINE_MEMBER( dack2_w ) { select_dma_channel(2, state); } DECLARE_WRITE_LINE_MEMBER( dack2_w ) { select_dma_channel(2, state); }
DECLARE_WRITE_LINE_MEMBER( dack3_w ) { select_dma_channel(3, state); } DECLARE_WRITE_LINE_MEMBER( dack3_w ) { select_dma_channel(3, state); }
DECLARE_READ8_MEMBER( ppi_porta_r );
DECLARE_READ8_MEMBER( ppi_portc_r );
DECLARE_WRITE8_MEMBER( ppi_portb_w );
protected: protected:
UINT8 m_u73_q2; UINT8 m_u73_q2;
UINT8 m_out1;
int m_dma_channel; int m_dma_channel;
bool m_cur_eop; bool m_cur_eop;
UINT8 m_dma_offset[4]; UINT8 m_dma_offset[4];
UINT8 m_pc_spkrdata;
UINT8 m_pc_input;
int m_ppi_portc_switch_high;
int m_ppi_speaker;
int m_ppi_keyboard_clear;
UINT8 m_ppi_keyb_clock;
UINT8 m_ppi_portb;
UINT8 m_ppi_clock_signal;
UINT8 m_ppi_data_signal;
UINT8 m_ppi_shift_register;
UINT8 m_ppi_shift_enable;
}; };
@ -474,6 +506,7 @@ static ADDRESS_MAP_START(pasogo_io, AS_IO, 16, pasogo_state)
AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8("pic8259", pic8259_device, read, write, 0xffff) AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8("pic8259", pic8259_device, read, write, 0xffff)
AM_RANGE(0x26, 0x27) AM_READWRITE8(vg230_io_r, vg230_io_w, 0xffff ) AM_RANGE(0x26, 0x27) AM_READWRITE8(vg230_io_r, vg230_io_w, 0xffff )
AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8254", pit8253_r, pit8253_w, 0xffff) AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8254", pit8253_r, pit8253_w, 0xffff)
AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xffff)
AM_RANGE(0x6c, 0x6f) AM_READWRITE8(ems_r, ems_w, 0xffff ) AM_RANGE(0x6c, 0x6f) AM_READWRITE8(ems_r, ems_w, 0xffff )
ADDRESS_MAP_END ADDRESS_MAP_END
@ -581,8 +614,41 @@ IRQ_CALLBACK_MEMBER(pasogo_state::pasogo_irq_callback)
void pasogo_state::machine_reset() void pasogo_state::machine_reset()
{ {
m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(pasogo_state::pasogo_irq_callback),this)); m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(pasogo_state::pasogo_irq_callback),this));
m_u73_q2 = 0;
m_out1 = 2; // initial state of pit output is undefined
m_pc_spkrdata = 0;
m_pc_input = 0;
m_dma_channel = -1;
m_cur_eop = false;
} }
WRITE_LINE_MEMBER(pasogo_state::speaker_set_spkrdata)
{
m_pc_spkrdata = state ? 1 : 0;
speaker_level_w( m_speaker, m_pc_spkrdata & m_pc_input );
}
WRITE_LINE_MEMBER( pasogo_state::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( pasogo_state::pit8253_out2_changed )
{
m_pc_input = state ? 1 : 0;
speaker_level_w( m_speaker, m_pc_spkrdata & m_pc_input );
}
static const pit8253_config pc_pit8254_config = static const pit8253_config pc_pit8254_config =
{ {
{ {
@ -593,16 +659,39 @@ static const pit8253_config pc_pit8254_config =
}, { }, {
4772720/4, /* dram refresh */ 4772720/4, /* dram refresh */
DEVCB_NULL, DEVCB_NULL,
DEVCB_NULL DEVCB_DRIVER_LINE_MEMBER(pasogo_state, pit8253_out1_changed)
}, { }, {
4772720/4, /* pio port c pin 4, and speaker polling enough */ 4772720/4, /* pio port c pin 4, and speaker polling enough */
DEVCB_NULL, DEVCB_NULL,
DEVCB_NULL DEVCB_DRIVER_LINE_MEMBER(pasogo_state, pit8253_out2_changed)
} }
} }
}; };
READ8_MEMBER( pasogo_state::page_r )
{
return 0xFF;
}
WRITE8_MEMBER( pasogo_state::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( pasogo_state::dma_hrq_changed ) WRITE_LINE_MEMBER( pasogo_state::dma_hrq_changed )
{ {
m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
@ -733,6 +822,85 @@ static I8237_INTERFACE( dma8237_config )
}; };
READ8_MEMBER (pasogo_state::ppi_porta_r)
{
int data = 0xFF;
/* KB port A */
if (m_ppi_keyboard_clear)
{
//data = ioport("DSW0")->read();
}
else
{
data = m_ppi_shift_register;
}
return data;
}
READ8_MEMBER ( pasogo_state::ppi_portc_r )
{
int timer2_output = pit8253_get_output( m_pit8253, 2 );
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);
}
else
{
/* read lo nibble of S2 */
//data = (data & 0xf0) | (ioport("DSW0")->read() & 0x0f);
}
if ( m_ppi_portb & 0x01 )
{
data = ( data & ~0x10 ) | ( timer2_output ? 0x10 : 0x00 );
}
data = ( data & ~0x20 ) | ( timer2_output ? 0x20 : 0x00 );
return data;
}
WRITE8_MEMBER( pasogo_state::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;
pit8253_gate2_w(m_pit8253, BIT(data, 0));
speaker_set_spkrdata( data & 0x02 );
m_ppi_clock_signal = ( m_ppi_keyb_clock ) ? 1 : 0;
//m_pc_kbdc->clock_write_from_mb(m_ppi_clock_signal);
/* If PB7 is set clear the shift register and reset the IRQ line */
if ( m_ppi_keyboard_clear )
{
m_pic8259->ir1_w(0);
m_ppi_shift_register = 0;
m_ppi_shift_enable = 1;
}
}
static I8255A_INTERFACE( ppi8255_interface )
{
DEVCB_DRIVER_MEMBER(pasogo_state, ppi_porta_r),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_MEMBER(pasogo_state, ppi_portb_w),
DEVCB_DRIVER_MEMBER(pasogo_state, ppi_portc_r),
DEVCB_NULL
};
WRITE_LINE_MEMBER(pasogo_state::pasogo_pic8259_set_int_line) WRITE_LINE_MEMBER(pasogo_state::pasogo_pic8259_set_int_line)
{ {
m_maincpu->set_input_line(0, state ? HOLD_LINE : CLEAR_LINE); m_maincpu->set_input_line(0, state ? HOLD_LINE : CLEAR_LINE);
@ -752,6 +920,8 @@ static MACHINE_CONFIG_START( pasogo, pasogo_state )
MCFG_I8237_ADD( "dma8237", XTAL_14_31818MHz/3, dma8237_config ) MCFG_I8237_ADD( "dma8237", XTAL_14_31818MHz/3, dma8237_config )
MCFG_I8255_ADD( "ppi8255", ppi8255_interface )
MCFG_SCREEN_ADD("screen", LCD) MCFG_SCREEN_ADD("screen", LCD)
MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_SIZE(640, 400) MCFG_SCREEN_SIZE(640, 400)
@ -760,6 +930,10 @@ static MACHINE_CONFIG_START( pasogo, pasogo_state )
MCFG_PALETTE_LENGTH(ARRAY_LENGTH(pasogo_palette)) MCFG_PALETTE_LENGTH(ARRAY_LENGTH(pasogo_palette))
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MCFG_CARTSLOT_ADD("cart") MCFG_CARTSLOT_ADD("cart")
MCFG_CARTSLOT_EXTENSION_LIST("bin") MCFG_CARTSLOT_EXTENSION_LIST("bin")
MCFG_CARTSLOT_MANDATORY MCFG_CARTSLOT_MANDATORY