(MESS) wswan.c: Some small cleanups and tag lookup reduction. (nw)

This commit is contained in:
Wilbert Pol 2013-01-24 19:46:15 +00:00
parent 2de794dfee
commit c95df31e26
2 changed files with 95 additions and 69 deletions

View File

@ -13,25 +13,6 @@
#define WSWAN_X_PIXELS (28*8)
#define WSWAN_Y_PIXELS (18*8)
/* Interrupt flags */
#define WSWAN_IFLAG_STX 0x1
#define WSWAN_IFLAG_KEY 0x2
#define WSWAN_IFLAG_RTC 0x4
#define WSWAN_IFLAG_SRX 0x8
#define WSWAN_IFLAG_LCMP 0x10
#define WSWAN_IFLAG_VBLTMR 0x20
#define WSWAN_IFLAG_VBL 0x40
#define WSWAN_IFLAG_HBLTMR 0x80
/* Interrupts */
#define WSWAN_INT_STX 0
#define WSWAN_INT_KEY 1
#define WSWAN_INT_RTC 2
#define WSWAN_INT_SRX 3
#define WSWAN_INT_LCMP 4
#define WSWAN_INT_VBLTMR 5
#define WSWAN_INT_VBL 6
#define WSWAN_INT_HBLTMR 7
#define INTERNAL_EEPROM_SIZE 1024
#include "emu.h"
@ -123,8 +104,11 @@ class wswan_state : public driver_device
{
public:
wswan_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu")
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_cursx(*this, "CURSX")
, m_cursy(*this, "CURSY")
, m_buttons(*this, "BUTTONS")
{ }
virtual void video_start();
@ -159,6 +143,35 @@ public:
DECLARE_PALETTE_INIT(wscolor);
TIMER_CALLBACK_MEMBER(wswan_rtc_callback);
TIMER_CALLBACK_MEMBER(wswan_scanline_interrupt);
protected:
/* Interrupt flags */
static const UINT8 WSWAN_IFLAG_STX = 0x01;
static const UINT8 WSWAN_IFLAG_KEY = 0x02;
static const UINT8 WSWAN_IFLAG_RTC = 0x04;
static const UINT8 WSWAN_IFLAG_SRX = 0x08;
static const UINT8 WSWAN_IFLAG_LCMP = 0x10;
static const UINT8 WSWAN_IFLAG_VBLTMR = 0x20;
static const UINT8 WSWAN_IFLAG_VBL = 0x40;
static const UINT8 WSWAN_IFLAG_HBLTMR = 0x80;
/* Interrupts */
static const UINT8 WSWAN_INT_STX = 0;
static const UINT8 WSWAN_INT_KEY = 1;
static const UINT8 WSWAN_INT_RTC = 2;
static const UINT8 WSWAN_INT_SRX = 3;
static const UINT8 WSWAN_INT_LCMP = 4;
static const UINT8 WSWAN_INT_VBLTMR = 5;
static const UINT8 WSWAN_INT_VBL = 6;
static const UINT8 WSWAN_INT_HBLTMR = 7;
required_ioport m_cursx;
required_ioport m_cursy;
required_ioport m_buttons;
void wswan_setup_bios();
void wswan_handle_irqs();
void wswan_set_irq_line(int irq);
};

View File

@ -83,44 +83,59 @@ static const UINT8 ws_fake_bios_code[] = {
0xea, 0xc0, 0xff, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static void wswan_handle_irqs( running_machine &machine )
void wswan_state::wswan_handle_irqs()
{
wswan_state *state = machine.driver_data<wswan_state>();
if ( state->m_ws_portram[0xb2] & state->m_ws_portram[0xb6] & WSWAN_IFLAG_HBLTMR ) {
machine.device("maincpu")->execute().set_input_line_and_vector(0, HOLD_LINE, state->m_ws_portram[0xb0] + WSWAN_INT_HBLTMR );
} else if ( state->m_ws_portram[0xb2] & state->m_ws_portram[0xb6] & WSWAN_IFLAG_VBL ) {
machine.device("maincpu")->execute().set_input_line_and_vector(0, HOLD_LINE, state->m_ws_portram[0xb0] + WSWAN_INT_VBL );
} else if ( state->m_ws_portram[0xb2] & state->m_ws_portram[0xb6] & WSWAN_IFLAG_VBLTMR ) {
machine.device("maincpu")->execute().set_input_line_and_vector(0, HOLD_LINE, state->m_ws_portram[0xb0] + WSWAN_INT_VBLTMR );
} else if ( state->m_ws_portram[0xb2] & state->m_ws_portram[0xb6] & WSWAN_IFLAG_LCMP ) {
machine.device("maincpu")->execute().set_input_line_and_vector(0, HOLD_LINE, state->m_ws_portram[0xb0] + WSWAN_INT_LCMP );
} else if ( state->m_ws_portram[0xb2] & state->m_ws_portram[0xb6] & WSWAN_IFLAG_SRX ) {
machine.device("maincpu")->execute().set_input_line_and_vector(0, HOLD_LINE, state->m_ws_portram[0xb0] + WSWAN_INT_SRX );
} else if ( state->m_ws_portram[0xb2] & state->m_ws_portram[0xb6] & WSWAN_IFLAG_RTC ) {
machine.device("maincpu")->execute().set_input_line_and_vector(0, HOLD_LINE, state->m_ws_portram[0xb0] + WSWAN_INT_RTC );
} else if ( state->m_ws_portram[0xb2] & state->m_ws_portram[0xb6] & WSWAN_IFLAG_KEY ) {
machine.device("maincpu")->execute().set_input_line_and_vector(0, HOLD_LINE, state->m_ws_portram[0xb0] + WSWAN_INT_KEY );
} else if ( state->m_ws_portram[0xb2] & state->m_ws_portram[0xb6] & WSWAN_IFLAG_STX ) {
machine.device("maincpu")->execute().set_input_line_and_vector(0, HOLD_LINE, state->m_ws_portram[0xb0] + WSWAN_INT_STX );
} else {
machine.device("maincpu")->execute().set_input_line(0, CLEAR_LINE );
if ( m_ws_portram[0xb2] & m_ws_portram[0xb6] & WSWAN_IFLAG_HBLTMR )
{
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_ws_portram[0xb0] + WSWAN_INT_HBLTMR );
}
else if ( m_ws_portram[0xb2] & m_ws_portram[0xb6] & WSWAN_IFLAG_VBL )
{
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_ws_portram[0xb0] + WSWAN_INT_VBL );
}
else if ( m_ws_portram[0xb2] & m_ws_portram[0xb6] & WSWAN_IFLAG_VBLTMR )
{
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_ws_portram[0xb0] + WSWAN_INT_VBLTMR );
}
else if ( m_ws_portram[0xb2] & m_ws_portram[0xb6] & WSWAN_IFLAG_LCMP )
{
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_ws_portram[0xb0] + WSWAN_INT_LCMP );
}
else if ( m_ws_portram[0xb2] & m_ws_portram[0xb6] & WSWAN_IFLAG_SRX )
{
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_ws_portram[0xb0] + WSWAN_INT_SRX );
}
else if ( m_ws_portram[0xb2] & m_ws_portram[0xb6] & WSWAN_IFLAG_RTC )
{
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_ws_portram[0xb0] + WSWAN_INT_RTC );
}
else if ( m_ws_portram[0xb2] & m_ws_portram[0xb6] & WSWAN_IFLAG_KEY )
{
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_ws_portram[0xb0] + WSWAN_INT_KEY );
}
else if ( m_ws_portram[0xb2] & m_ws_portram[0xb6] & WSWAN_IFLAG_STX )
{
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, m_ws_portram[0xb0] + WSWAN_INT_STX );
}
else
{
m_maincpu->set_input_line(0, CLEAR_LINE );
}
}
static void wswan_set_irq_line( running_machine &machine, int irq)
void wswan_state::wswan_set_irq_line(int irq)
{
wswan_state *state = machine.driver_data<wswan_state>();
if ( state->m_ws_portram[0xb2] & irq )
if ( m_ws_portram[0xb2] & irq )
{
state->m_ws_portram[0xb6] |= irq;
wswan_handle_irqs( machine );
m_ws_portram[0xb6] |= irq;
wswan_handle_irqs();
}
}
void wswan_state::wswan_clear_irq_line(int irq)
{
m_ws_portram[0xb6] &= ~irq;
wswan_handle_irqs( machine() );
wswan_handle_irqs();
}
TIMER_CALLBACK_MEMBER(wswan_state::wswan_rtc_callback)
@ -176,13 +191,12 @@ static void wswan_machine_stop( running_machine &machine )
}
}
static void wswan_setup_bios( running_machine &machine )
void wswan_state::wswan_setup_bios()
{
wswan_state *state = machine.driver_data<wswan_state>();
if ( state->m_ws_bios_bank == NULL )
if ( m_ws_bios_bank == NULL )
{
state->m_ws_bios_bank = auto_alloc_array(machine, UINT8, 0x10000 );
memcpy( state->m_ws_bios_bank + 0xffc0, ws_fake_bios_code, 0x40 );
m_ws_bios_bank = auto_alloc_array(machine(), UINT8, 0x10000 );
memcpy( m_ws_bios_bank + 0xffc0, ws_fake_bios_code, 0x40 );
}
}
@ -194,7 +208,7 @@ void wswan_state::machine_start()
m_vdp.timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(wswan_state::wswan_scanline_interrupt),this), &m_vdp );
m_vdp.timer->adjust( attotime::from_ticks( 256, 3072000 ), 0, attotime::from_ticks( 256, 3072000 ) );
wswan_setup_bios(machine());
wswan_setup_bios();
/* Set up RTC timer */
if ( m_rtc.present )
@ -211,7 +225,7 @@ MACHINE_START_MEMBER(wswan_state,wscolor)
m_vdp.timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(wswan_state::wswan_scanline_interrupt),this), &m_vdp );
m_vdp.timer->adjust( attotime::from_ticks( 256, 3072000 ), 0, attotime::from_ticks( 256, 3072000 ) );
wswan_setup_bios(machine());
wswan_setup_bios();
/* Set up RTC timer */
if ( m_rtc.present )
@ -222,7 +236,7 @@ MACHINE_START_MEMBER(wswan_state,wscolor)
void wswan_state::machine_reset()
{
address_space &space = machine().device( "maincpu")->memory().space( AS_PROGRAM );
address_space &space = m_maincpu->space( AS_PROGRAM );
/* Intialize ports */
memcpy( m_ws_portram, ws_portram_init, 256 );
@ -285,7 +299,7 @@ READ8_MEMBER( wswan_state::wswan_port_r )
UINT8 value = m_ws_portram[offset];
if ( offset != 2 )
logerror( "PC=%X: port read %02X\n", machine().device("maincpu") ->safe_pc( ), offset );
logerror( "PC=%X: port read %02X\n", m_maincpu->pc(), offset );
switch( offset )
{
case 0x02: /* Current line */
@ -354,9 +368,8 @@ READ8_MEMBER( wswan_state::wswan_port_r )
WRITE8_MEMBER( wswan_state::wswan_port_w )
{
address_space &mem = m_maincpu->space(AS_PROGRAM);
wswan_state *state = machine().driver_data<wswan_state>();
UINT8 input;
logerror( "PC=%X: port write %02X <- %02X\n", mem.device().safe_pc(), offset, data );
logerror( "PC=%X: port write %02X <- %02X\n", m_maincpu->pc(), offset, data );
switch( offset )
{
case 0x00: /* Display control
@ -953,8 +966,8 @@ WRITE8_MEMBER( wswan_state::wswan_port_w )
switch( data )
{
case 0x10: /* Read Y cursors: Y1 - Y2 - Y3 - Y4 */
input = ioport("CURSY")->read();
if (state->m_rotate) // reorient controls if the console is rotated
input = m_cursy->read();
if (m_rotate) // reorient controls if the console is rotated
{
if (input & 0x01) data |= 0x02;
if (input & 0x02) data |= 0x04;
@ -965,8 +978,8 @@ WRITE8_MEMBER( wswan_state::wswan_port_w )
data = data | input;
break;
case 0x20: /* Read X cursors: X1 - X2 - X3 - X4 */
input = ioport("CURSX")->read();
if (state->m_rotate) // reorient controls if the console is rotated
input = m_cursx->read();
if (m_rotate) // reorient controls if the console is rotated
{
if (input & 0x01) data |= 0x02;
if (input & 0x02) data |= 0x04;
@ -977,7 +990,7 @@ WRITE8_MEMBER( wswan_state::wswan_port_w )
data = data | input;
break;
case 0x40: /* Read buttons: START - A - B */
data = data | ioport("BUTTONS")->read();
data = data | m_buttons->read();
break;
}
break;
@ -1349,7 +1362,7 @@ DEVICE_IMAGE_LOAD(wswan_cart)
else
size = image.get_software_region_length("rom");
state->m_ws_ram = (UINT8*) image.device().machine().device("maincpu")->memory().space(AS_PROGRAM).get_read_ptr(0);
state->m_ws_ram = (UINT8*) state->m_maincpu->space(AS_PROGRAM).get_read_ptr(0);
memset(state->m_ws_ram, 0, 0xffff);
state->m_ROMBanks = size / 65536;
@ -1450,14 +1463,14 @@ TIMER_CALLBACK_MEMBER(wswan_state::wswan_scanline_interrupt)
m_vdp.timer_hblank_reload = 0;
}
logerror( "trigerring hbltmr interrupt\n" );
wswan_set_irq_line( machine(), WSWAN_IFLAG_HBLTMR );
wswan_set_irq_line( WSWAN_IFLAG_HBLTMR );
}
}
/* Handle Sound DMA */
if ( ( m_sound_dma.enable & 0x88 ) == 0x80 )
{
address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM );
address_space &space = m_maincpu->space(AS_PROGRAM );
/* TODO: Output sound DMA byte */
wswan_port_w( space, 0x89, space.read_byte(m_sound_dma.source ) );
m_sound_dma.size--;
@ -1479,7 +1492,7 @@ TIMER_CALLBACK_MEMBER(wswan_state::wswan_scanline_interrupt)
if( m_vdp.current_line == 144 )
{
wswan_set_irq_line( machine(), WSWAN_IFLAG_VBL );
wswan_set_irq_line( WSWAN_IFLAG_VBL );
/* Decrement 75Hz (VBlank) counter */
if ( m_vdp.timer_vblank_enable && m_vdp.timer_vblank_reload != 0 )
{
@ -1496,7 +1509,7 @@ TIMER_CALLBACK_MEMBER(wswan_state::wswan_scanline_interrupt)
m_vdp.timer_vblank_reload = 0;
}
logerror( "triggering vbltmr interrupt\n" );
wswan_set_irq_line( machine(), WSWAN_IFLAG_VBLTMR );
wswan_set_irq_line( WSWAN_IFLAG_VBLTMR );
}
}
}
@ -1505,7 +1518,7 @@ TIMER_CALLBACK_MEMBER(wswan_state::wswan_scanline_interrupt)
if ( m_vdp.current_line == m_vdp.line_compare )
{
wswan_set_irq_line( machine(), WSWAN_IFLAG_LCMP );
wswan_set_irq_line( WSWAN_IFLAG_LCMP );
}
m_vdp.current_line = (m_vdp.current_line + 1) % 159;