z80dma: Added an alternative way of register read-back that directly

change the read mask without passing from the init read sequence
command, also moved around DMA counters incrementing [Angelo Salese]

Small gfx fixes for Saturn, nw
This commit is contained in:
Angelo Salese 2011-08-16 18:24:55 +00:00
parent e370e9da67
commit 883899d0f5
5 changed files with 255 additions and 99 deletions

View File

@ -67,6 +67,7 @@ const int TM_SEARCH_TRANSFER = 0x03;
//**************************************************************************
#define LOG 0
#define DMA_LOG 0
#define REGNUM(_m, _s) (((_m)<<3) + (_s))
#define GET_REGNUM(_r) (&(_r) - &(WR0))
@ -397,8 +398,7 @@ void z80dma_device::do_read()
else
m_latch = m_in_iorq_func(m_addressA);
if (LOG) logerror("Z80DMA '%s' A src: %04x %s -> data: %02x\n", tag(), m_addressA, PORTA_MEMORY ? "mem" : "i/o", m_latch);
m_addressA += PORTA_FIXED ? 0 : PORTA_INC ? 1 : -1;
if (DMA_LOG) logerror("Z80DMA '%s' A src: %04x %s -> data: %02x\n", tag(), m_addressA, PORTA_MEMORY ? "mem" : "i/o", m_latch);
}
else
{
@ -407,8 +407,7 @@ void z80dma_device::do_read()
else
m_latch = m_in_iorq_func(m_addressB);
if (LOG) logerror("Z80DMA '%s' B src: %04x %s -> data: %02x\n", tag(), m_addressB, PORTB_MEMORY ? "mem" : "i/o", m_latch);
m_addressB += PORTB_FIXED ? 0 : PORTB_INC ? 1 : -1;
if (DMA_LOG) logerror("Z80DMA '%s' B src: %04x %s -> data: %02x\n", tag(), m_addressB, PORTB_MEMORY ? "mem" : "i/o", m_latch);
}
break;
case TM_SEARCH_TRANSFER:
@ -444,8 +443,7 @@ int z80dma_device::do_write()
else
m_out_iorq_func(m_addressB, m_latch);
if (LOG) logerror("Z80DMA '%s' B dst: %04x %s\n", tag(), m_addressB, PORTB_MEMORY ? "mem" : "i/o");
m_addressB += PORTB_FIXED ? 0 : PORTB_INC ? 1 : -1;
if (DMA_LOG) logerror("Z80DMA '%s' B dst: %04x %s\n", tag(), m_addressB, PORTB_MEMORY ? "mem" : "i/o");
}
else
{
@ -454,11 +452,9 @@ int z80dma_device::do_write()
else
m_out_iorq_func(m_addressA, m_latch);
if (LOG) logerror("Z80DMA '%s' A dst: %04x %s\n", tag(), m_addressA, PORTA_MEMORY ? "mem" : "i/o");
m_addressA += PORTA_FIXED ? 0 : PORTA_INC ? 1 : -1;
if (DMA_LOG) logerror("Z80DMA '%s' A dst: %04x %s\n", tag(), m_addressA, PORTA_MEMORY ? "mem" : "i/o");
}
m_count--;
done = (m_count == 0xFFFF);
break;
case TM_SEARCH:
@ -475,8 +471,6 @@ int z80dma_device::do_write()
}
}
m_count--;
done = (m_count == 0xFFFF); //correct?
}
break;
@ -488,6 +482,13 @@ int z80dma_device::do_write()
logerror("z80dma_do_operation: invalid mode %d!\n", mode);
break;
}
m_addressA += PORTA_FIXED ? 0 : PORTA_INC ? 1 : -1;
m_addressB += PORTB_FIXED ? 0 : PORTB_INC ? 1 : -1;
m_count--;
done = (m_count == 0xFFFF); //correct?
if (done)
{
//FIXME: interrupt ?
@ -513,6 +514,7 @@ void z80dma_device::timerproc()
if (m_is_read)
{
/* TODO: there's a nasty recursion bug with Alpha for Sharp X1 Turbo on the transfers with this function! */
do_read();
done = 0;
m_is_read = false;
@ -528,7 +530,7 @@ void z80dma_device::timerproc()
if (done)
{
m_dma_enabled = 0; //FIXME: Correct?
m_status = 0x19;
m_status = 0x09;
m_status |= !is_ready() << 1; // ready line status
@ -595,6 +597,9 @@ UINT8 z80dma_device::read()
{
UINT8 res;
if(m_read_num_follow == 0) /* TODO: should return the status, but let me know WHAT uses this first */
fatalerror("Z80DMA '%s' Read without anything setted into stack", tag());
res = m_read_regs_follow[m_read_cur_follow];
m_read_cur_follow++;
@ -678,7 +683,8 @@ void z80dma_device::write(UINT8 data)
break;
case COMMAND_READ_STATUS_BYTE:
if (LOG) logerror("Z80DMA '%s' CMD Read status Byte\n", tag());
READ_MASK = 0;
READ_MASK = 1;
m_read_regs_follow[m_read_num_follow++] = m_status;
break;
case COMMAND_RESET_AND_DISABLE_INTERRUPTS:
WR3 &= ~0x20;
@ -691,12 +697,12 @@ void z80dma_device::write(UINT8 data)
if (LOG) logerror("Z80DMA '%s' Initiate Read Sequence\n", tag());
m_read_cur_follow = m_read_num_follow = 0;
if(READ_MASK & 0x01) { m_read_regs_follow[m_read_num_follow++] = m_status; }
if(READ_MASK & 0x02) { m_read_regs_follow[m_read_num_follow++] = BLOCKLEN_L; } //byte counter (low)
if(READ_MASK & 0x04) { m_read_regs_follow[m_read_num_follow++] = BLOCKLEN_H; } //byte counter (high)
if(READ_MASK & 0x08) { m_read_regs_follow[m_read_num_follow++] = PORTA_ADDRESS_L; } //port A address (low)
if(READ_MASK & 0x10) { m_read_regs_follow[m_read_num_follow++] = PORTA_ADDRESS_H; } //port A address (high)
if(READ_MASK & 0x20) { m_read_regs_follow[m_read_num_follow++] = PORTB_ADDRESS_L; } //port B address (low)
if(READ_MASK & 0x40) { m_read_regs_follow[m_read_num_follow++] = PORTB_ADDRESS_H; } //port B address (high)
if(READ_MASK & 0x02) { m_read_regs_follow[m_read_num_follow++] = m_count & 0xff; } //byte counter (low)
if(READ_MASK & 0x04) { m_read_regs_follow[m_read_num_follow++] = m_count >> 8; } //byte counter (high)
if(READ_MASK & 0x08) { m_read_regs_follow[m_read_num_follow++] = m_addressA & 0xff; } //port A address (low)
if(READ_MASK & 0x10) { m_read_regs_follow[m_read_num_follow++] = m_addressA >> 8; } //port A address (high)
if(READ_MASK & 0x20) { m_read_regs_follow[m_read_num_follow++] = m_addressB & 0xff; } //port B address (low)
if(READ_MASK & 0x40) { m_read_regs_follow[m_read_num_follow++] = m_addressB >> 8; } //port B address (high)
break;
case COMMAND_RESET:
if (LOG) logerror("Z80DMA '%s' Reset\n", tag());
@ -723,6 +729,7 @@ void z80dma_device::write(UINT8 data)
m_addressB = PORTB_ADDRESS;
m_count = BLOCKLEN;
m_status |= 0x30;
if (LOG) logerror("Z80DMA '%s' Load A: %x B: %x N: %x\n", tag(), m_addressA, m_addressB, m_count);
break;
case COMMAND_DISABLE_DMA:
@ -800,6 +807,18 @@ void z80dma_device::write(UINT8 data)
m_regs_follow[m_num_follow++] = GET_REGNUM(INTERRUPT_VECTOR);
m_cur_follow = 0;
}
else if(m_regs_follow[m_num_follow] == GET_REGNUM(READ_MASK))
{
m_read_cur_follow = m_read_num_follow = 0;
if(READ_MASK & 0x01) { m_read_regs_follow[m_read_num_follow++] = m_status; }
if(READ_MASK & 0x02) { m_read_regs_follow[m_read_num_follow++] = m_count & 0xff; } //byte counter (low)
if(READ_MASK & 0x04) { m_read_regs_follow[m_read_num_follow++] = m_count >> 8; } //byte counter (high)
if(READ_MASK & 0x08) { m_read_regs_follow[m_read_num_follow++] = m_addressA & 0xff; } //port A address (low)
if(READ_MASK & 0x10) { m_read_regs_follow[m_read_num_follow++] = m_addressA >> 8; } //port A address (high)
if(READ_MASK & 0x20) { m_read_regs_follow[m_read_num_follow++] = m_addressB & 0xff; } //port B address (low)
if(READ_MASK & 0x40) { m_read_regs_follow[m_read_num_follow++] = m_addressB >> 8; } //port B address (high)
}
m_reset_pointer++;
if(m_reset_pointer >= 6) { m_reset_pointer = 0; }

View File

@ -475,7 +475,7 @@ static void scu_test_pending_irq(running_machine &machine)
0xb, 0xa, 0x9, 0x8,
0x8, 0x6, 0x6, 0x5,
0x3, 0x2, -1, -1,
0x7, 0x7, 0x7, 0x7,
0x7, 0x7, 0x7, 0x7,
0x4, 0x4, 0x4, 0x4,
0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1 };
@ -972,7 +972,7 @@ static ADDRESS_MAP_START( saturn_mem, AS_PROGRAM, 32 )
AM_RANGE(0x01800000, 0x01ffffff) AM_WRITE(sinit_w)
AM_RANGE(0x02000000, 0x023fffff) AM_ROM AM_SHARE("share7") AM_REGION("maincpu", 0x80000) // cartridge space
// AM_RANGE(0x02400000, 0x027fffff) AM_RAM //cart RAM area, dynamically allocated
// AM_RANGE(0x04000000, 0x047fffff) AM_RAM //backup RAM area, dynamically allocated
// AM_RANGE(0x04000000, 0x047fffff) AM_RAM //backup RAM area, dynamically allocated
AM_RANGE(0x04fffffc, 0x04ffffff) AM_READ8(saturn_cart_type_r,0x000000ff)
AM_RANGE(0x05800000, 0x0589ffff) AM_READWRITE(stvcd_r, stvcd_w)
/* Sound */
@ -1045,39 +1045,76 @@ static INPUT_CHANGED( key_stroke )
}
}
static INPUT_PORTS_START( saturn )
PORT_START("JOY1")
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_CATEGORY(10)
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_CATEGORY(10)
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_CATEGORY(10)
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_CATEGORY(10)
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(1) PORT_CATEGORY(10) // START
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 A") PORT_PLAYER(1) PORT_CATEGORY(10) // A
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P1 C") PORT_PLAYER(1) PORT_CATEGORY(10) // C
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P1 B") PORT_PLAYER(1) PORT_CATEGORY(10) // B
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("P1 R") PORT_PLAYER(1) PORT_CATEGORY(10) // R
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("P1 X") PORT_PLAYER(1) PORT_CATEGORY(10) // X
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("P1 Y") PORT_PLAYER(1) PORT_CATEGORY(10) // Y
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("P1 Z") PORT_PLAYER(1) PORT_CATEGORY(10) // Z
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("P1 L") PORT_PLAYER(1) PORT_CATEGORY(10) // L
#define SATURN_PAD_P1(_cat_) \
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 A") PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P1 C") PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P1 B") PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("P1 R") PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("P1 X") PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("P1 Y") PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("P1 Z") PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("P1 L") PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0007, IP_ACTIVE_LOW, IPT_UNUSED ) //read '1' when direct mode is polled
PORT_START("JOY2")
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_CATEGORY(20)
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_CATEGORY(20)
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_CATEGORY(20)
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_CATEGORY(20)
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(2) PORT_CATEGORY(20) // START
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P2 A") PORT_PLAYER(2) PORT_CATEGORY(20) // A
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P2 C") PORT_PLAYER(2) PORT_CATEGORY(20) // C
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P2 B") PORT_PLAYER(2) PORT_CATEGORY(20) // B
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("P2 R") PORT_PLAYER(2) PORT_CATEGORY(20) // R
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("P2 X") PORT_PLAYER(2) PORT_CATEGORY(20) // X
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("P2 Y") PORT_PLAYER(2) PORT_CATEGORY(20) // Y
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("P2 Z") PORT_PLAYER(2) PORT_CATEGORY(20) // Z
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("P2 L") PORT_PLAYER(2) PORT_CATEGORY(20) // L
#define SATURN_PAD_P2(_cat_) \
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P2 A") PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P2 C") PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P2 B") PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("P2 R") PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("P2 X") PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("P2 Y") PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("P2 Z") PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("P2 L") PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0007, IP_ACTIVE_LOW, IPT_UNUSED ) //read '1' when direct mode is polled
#define MD_PAD_P1(_cat_) \
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 A") PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P1 C") PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P1 B") PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("P1 Mode") PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("P1 X") PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("P1 Y") PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("P1 Z") PORT_PLAYER(1) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x000f, IP_ACTIVE_LOW, IPT_UNUSED ) //read '1' when direct mode is polled
#define MD_PAD_P2(_cat_) \
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P2 A") PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P2 C") PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P2 B") PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("P2 Mode") PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("P2 X") PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("P2 Y") PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("P2 Z") PORT_PLAYER(2) PORT_CATEGORY(_cat_) \
PORT_BIT( 0x000f, IP_ACTIVE_LOW, IPT_UNUSED ) //read '1' when direct mode is polled
static INPUT_PORTS_START( saturn )
PORT_START("JOY1")
SATURN_PAD_P1(10)
PORT_START("JOY2")
SATURN_PAD_P2(20)
/* TODO: there's no info about the keycode used on Saturn keyboard, following is trial & error with Game Basic software */
PORT_START("KEY0") // 0x00 - 0x07
PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_UNUSED) PORT_CATEGORY(15)
@ -1254,10 +1291,10 @@ static INPUT_PORTS_START( saturn )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("P1 Mouse Start Button") PORT_PLAYER(1) PORT_CATEGORY(14)
PORT_START("MOUSEX1")
PORT_BIT(0xff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(40) PORT_MINMAX(0x000, 0xff) PORT_KEYDELTA(2) PORT_RESET PORT_NAME("P1 Mouse X") PORT_PLAYER(1) PORT_CATEGORY(14)
PORT_BIT(0xffff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_NAME("P1 Mouse X") PORT_PLAYER(1) PORT_CATEGORY(14)
PORT_START("MOUSEY1")
PORT_BIT(0xff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(40) PORT_MINMAX(0x000, 0xff) PORT_KEYDELTA(2) PORT_RESET PORT_REVERSE PORT_NAME("P1 Mouse Y") PORT_PLAYER(1) PORT_CATEGORY(14)
PORT_BIT(0xffff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_REVERSE PORT_NAME("P1 Mouse Y") PORT_PLAYER(1) PORT_CATEGORY(14)
PORT_START("MOUSEB2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P2 Mouse Left Button") PORT_PLAYER(2) PORT_CATEGORY(24)
@ -1266,42 +1303,72 @@ static INPUT_PORTS_START( saturn )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("P2 Mouse Start Button") PORT_PLAYER(2) PORT_CATEGORY(24)
PORT_START("MOUSEX2")
PORT_BIT(0xff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(40) PORT_MINMAX(0x000, 0xff) PORT_KEYDELTA(2) PORT_RESET PORT_NAME("P2 Mouse X") PORT_PLAYER(2) PORT_CATEGORY(24)
PORT_BIT(0xffff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_NAME("P2 Mouse X") PORT_PLAYER(2) PORT_CATEGORY(24)
PORT_START("MOUSEY2")
PORT_BIT(0xff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(40) PORT_MINMAX(0x000, 0xff) PORT_KEYDELTA(2) PORT_RESET PORT_REVERSE PORT_NAME("P2 Mouse Y") PORT_PLAYER(2) PORT_CATEGORY(24)
PORT_BIT(0xffff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_REVERSE PORT_NAME("P2 Mouse Y") PORT_PLAYER(2) PORT_CATEGORY(24)
PORT_START("AN_JOY1")
SATURN_PAD_P1(12)
PORT_START("AN_JOY2")
SATURN_PAD_P2(22)
PORT_START("AN_X1")
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(1) PORT_NAME("P1 AD Stick X") PORT_CATEGORY(12)
PORT_START("AN_Y1")
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(1) PORT_NAME("P1 AD Stick Y") PORT_CATEGORY(12)
PORT_START("AN_Z1")
PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Z ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(1) PORT_NAME("P1 AD Stick Z") PORT_CATEGORY(12)
PORT_START("AN_X2")
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(2) PORT_NAME("P2 AD Stick X") PORT_CATEGORY(22)
PORT_START("AN_Y2")
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(2) PORT_NAME("P2 AD Stick Y") PORT_CATEGORY(22)
PORT_START("AN_Z2")
PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Z ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(2) PORT_NAME("P2 AD Stick Z") PORT_CATEGORY(22)
PORT_START("MD_JOY1")
MD_PAD_P1(16)
PORT_START("MD_JOY2")
MD_PAD_P2(26)
PORT_START("CART_AREA")
PORT_CONFNAME( 0x07, 0x06, "Cart Type" )
PORT_CONFSETTING( 0x00, "None" )
// PORT_CONFSETTING( 0x01, "4 Mbit backup RAM" )
// PORT_CONFSETTING( 0x02, "8 Mbit backup RAM" )
// PORT_CONFSETTING( 0x03, "16 Mbit backup RAM" )
// PORT_CONFSETTING( 0x04, "32 Mbit backup RAM" )
// PORT_CONFSETTING( 0x01, "4 Mbit backup RAM" )
// PORT_CONFSETTING( 0x02, "8 Mbit backup RAM" )
// PORT_CONFSETTING( 0x03, "16 Mbit backup RAM" )
// PORT_CONFSETTING( 0x04, "32 Mbit backup RAM" )
PORT_CONFSETTING( 0x05, "8 Mbit Cart RAM" )
PORT_CONFSETTING( 0x06, "32 Mbit Cart RAM" )
PORT_START("INPUT_TYPE")
PORT_CATEGORY_CLASS(0x0f,0x00,"Port 1")
PORT_CATEGORY_ITEM(0x00,"Digital Device (standard Saturn pad)",10)
// PORT_CATEGORY_ITEM(0x01,"Racing Device",11)
// PORT_CATEGORY_ITEM(0x02,"Analog Device",12) //Nights pad?
// PORT_CATEGORY_ITEM(0x03,"Lightgun Device",13)
PORT_CATEGORY_ITEM(0x04,"Pointing Device",14)
PORT_CATEGORY_ITEM(0x01,"Racing Device",12) /* steering wheel only */
PORT_CATEGORY_ITEM(0x02,"Analog Device",12) //Nights pad?
// PORT_CATEGORY_ITEM(0x03,"Lightgun Device",13)
PORT_CATEGORY_ITEM(0x04,"Pointing Device",14) // TODO: what's this? trackball?
PORT_CATEGORY_ITEM(0x05,"Keyboard Device",15)
// PORT_CATEGORY_ITEM(0x06,"Megadrive 3B Pad",16)
// PORT_CATEGORY_ITEM(0x07,"Megadrive 6B Pad",17)
PORT_CATEGORY_ITEM(0x06,"Megadrive 3B Pad",16)
PORT_CATEGORY_ITEM(0x07,"Megadrive 6B Pad",16)
PORT_CATEGORY_ITEM(0x08,"Saturn Mouse",14)
// PORT_CATEGORY_ITEM(0x09,"<unconnected>",19)
// PORT_CATEGORY_ITEM(0x09,"<unconnected>",19)
PORT_CATEGORY_CLASS(0xf0,0x00,"Port 2")
PORT_CATEGORY_ITEM(0x00,"Digital Device (standard Saturn pad)",20)
// PORT_CATEGORY_ITEM(0x10,"Racing Device",21)
// PORT_CATEGORY_ITEM(0x20,"Analog Device",22) //Nights pad?
// PORT_CATEGORY_ITEM(0x30,"Lightgun Device",23)
PORT_CATEGORY_ITEM(0x10,"Racing Device",22)
PORT_CATEGORY_ITEM(0x20,"Analog Device",22) //Nights pad?
// PORT_CATEGORY_ITEM(0x30,"Lightgun Device",23)
PORT_CATEGORY_ITEM(0x40,"Pointing Device",24)
// PORT_CATEGORY_ITEM(0x50,"Keyboard Device",25)
// PORT_CATEGORY_ITEM(0x60,"Megadrive 3B Pad",26)
// PORT_CATEGORY_ITEM(0x70,"Megadrive 6B Pad",27)
// PORT_CATEGORY_ITEM(0x50,"Keyboard Device",25)
PORT_CATEGORY_ITEM(0x60,"Megadrive 3B Pad",26)
PORT_CATEGORY_ITEM(0x70,"Megadrive 6B Pad",26)
PORT_CATEGORY_ITEM(0x80,"Saturn Mouse",24)
PORT_CATEGORY_ITEM(0x90,"<unconnected>",29)
INPUT_PORTS_END
@ -2162,7 +2229,7 @@ static MACHINE_RESET( saturn )
if(state->m_cart_type > 0 && state->m_cart_type < 5)
{
// AM_RANGE(0x04000000, 0x047fffff) AM_RAM //backup RAM area, dynamically allocated
// AM_RANGE(0x04000000, 0x047fffff) AM_RAM //backup RAM area, dynamically allocated
UINT32 mask;
mask = 0x7fffff >> (4-state->m_cart_type);
//mask = 0x7fffff >> 4-4 = 0x7fffff 32mbit

View File

@ -286,16 +286,16 @@ static TIMER_CALLBACK( stv_smpc_intback )
}
/*
[0] port status:
0x04 Sega-tap
0x16 Multi-tap
0x2x clock serial peripheral
0xf0 peripheral isn't connected
0xf1 peripheral is connected
[1] Peripheral ID (note: lowest four bits determines the size of the input packet)
0x02 digital pad
0x25 (tested by Game Basic?)
0x34 keyboard
[0] port status:
0x04 Sega-tap
0x16 Multi-tap
0x2x clock serial peripheral
0xf0 peripheral isn't connected
0xf1 peripheral is connected
[1] Peripheral ID (note: lowest four bits determines the size of the input packet)
0x02 digital pad
0x25 (tested by Game Basic?)
0x34 keyboard
*/
static void smpc_digital_pad(running_machine &machine, UINT8 pad_num, UINT8 offset)
@ -311,6 +311,27 @@ static void smpc_digital_pad(running_machine &machine, UINT8 pad_num, UINT8 offs
state->m_smpc.OREG[3+pad_num*offset] = pad_data & 0xff;
}
static void smpc_analog_pad(running_machine &machine, UINT8 pad_num, UINT8 offset, UINT8 id)
{
saturn_state *state = machine.driver_data<saturn_state>();
static const char *const padnames[] = { "AN_JOY1", "AN_JOY2" };
static const char *const annames[2][3] = { { "AN_X1", "AN_Y1", "AN_Z1" },
{ "AN_X2", "AN_Y2", "AN_Z2" }};
UINT16 pad_data;
pad_data = input_port_read(machine, padnames[pad_num]);
state->m_smpc.OREG[0+pad_num*offset] = 0xf1;
state->m_smpc.OREG[1+pad_num*offset] = id;
state->m_smpc.OREG[2+pad_num*offset] = pad_data>>8;
state->m_smpc.OREG[3+pad_num*offset] = pad_data & 0xff;
state->m_smpc.OREG[4+pad_num*offset] = input_port_read(machine, annames[pad_num][0]);
if(id == 0x15)
{
state->m_smpc.OREG[5+pad_num*offset] = input_port_read(machine, annames[pad_num][1]);
state->m_smpc.OREG[6+pad_num*offset] = input_port_read(machine, annames[pad_num][2]);
}
}
static void smpc_keyboard(running_machine &machine, UINT8 pad_num, UINT8 offset)
{
saturn_state *state = machine.driver_data<saturn_state>();
@ -337,15 +358,15 @@ static void smpc_keyboard(running_machine &machine, UINT8 pad_num, UINT8 offset)
state->m_smpc.OREG[2+pad_num*offset] = game_key>>8; // game buttons, TODO
state->m_smpc.OREG[3+pad_num*offset] = game_key & 0xff;
/*
x--- ---- 0
-x-- ---- caps lock
--x- ---- num lock
---x ---- scroll lock
---- x--- data ok
---- -x-- 1
---- --x- 1
---- ---x Break key
*/
x--- ---- 0
-x-- ---- caps lock
--x- ---- num lock
---x ---- scroll lock
---- x--- data ok
---- -x-- 1
---- --x- 1
---- ---x Break key
*/
state->m_smpc.OREG[4+pad_num*offset] = state->m_keyb.status | 6;
state->m_smpc.OREG[5+pad_num*offset] = state->m_keyb.data;
}
@ -355,13 +376,45 @@ static void smpc_mouse(running_machine &machine, UINT8 pad_num, UINT8 offset, UI
saturn_state *state = machine.driver_data<saturn_state>();
static const char *const mousenames[2][3] = { { "MOUSEB1", "MOUSEX1", "MOUSEY1" },
{ "MOUSEB2", "MOUSEX2", "MOUSEY2" }};
/* TODO: xy over / sign flags */
UINT8 mouse_ctrl;
INT16 mouse_x, mouse_y;
mouse_ctrl = input_port_read(machine, mousenames[pad_num][0]);
mouse_x = input_port_read(machine, mousenames[pad_num][1]);
mouse_y = input_port_read(machine, mousenames[pad_num][2]);
if(mouse_x < 0)
mouse_ctrl |= 0x10;
if(mouse_y < 0)
mouse_ctrl |= 0x20;
if((mouse_x & 0xff00) != 0xff00 && (mouse_x & 0xff00) != 0x0000)
mouse_ctrl |= 0x40;
if((mouse_y & 0xff00) != 0xff00 && (mouse_y & 0xff00) != 0x0000)
mouse_ctrl |= 0x80;
state->m_smpc.OREG[0+pad_num*offset] = 0xf1;
state->m_smpc.OREG[1+pad_num*offset] = id; // 0x23 / 0xe3
state->m_smpc.OREG[2+pad_num*offset] = input_port_read(machine, mousenames[pad_num][0]);
state->m_smpc.OREG[3+pad_num*offset] = input_port_read(machine, mousenames[pad_num][1]);
state->m_smpc.OREG[4+pad_num*offset] = input_port_read(machine, mousenames[pad_num][2]);
state->m_smpc.OREG[2+pad_num*offset] = mouse_ctrl;
state->m_smpc.OREG[3+pad_num*offset] = mouse_x & 0xff;
state->m_smpc.OREG[4+pad_num*offset] = mouse_y & 0xff;
}
/* TODO: is there ANY game on which the MD pad works? */
static void smpc_md_pad(running_machine &machine, UINT8 pad_num, UINT8 offset, UINT8 id)
{
saturn_state *state = machine.driver_data<saturn_state>();
static const char *const padnames[] = { "MD_JOY1", "MD_JOY2" };
UINT16 pad_data;
pad_data = input_port_read(machine, padnames[pad_num]);
state->m_smpc.OREG[0+pad_num*offset] = 0xf1;
state->m_smpc.OREG[1+pad_num*offset] = id;
state->m_smpc.OREG[2+pad_num*offset] = pad_data>>8;
if(id == 0xe2) // MD 6 Button PAD
state->m_smpc.OREG[3+pad_num*offset] = pad_data & 0xff;
}
static void smpc_unconnected(running_machine &machine, UINT8 pad_num, UINT8 offset)
@ -396,8 +449,12 @@ static TIMER_CALLBACK( intback_peripheral )
switch(read_id[pad_num])
{
case 0: smpc_digital_pad(machine,pad_num,offset); break;
case 1: smpc_analog_pad(machine,pad_num,offset,peri_id[read_id[pad_num]]); break; /* Steering Wheel */
case 2: smpc_analog_pad(machine,pad_num,offset,peri_id[read_id[pad_num]]); break; /* Analog Pad */
case 4: smpc_mouse(machine,pad_num,offset,peri_id[read_id[pad_num]]); break; /* Pointing Device */
case 5: smpc_keyboard(machine,pad_num,offset); break;
case 6: smpc_md_pad(machine,pad_num,offset,peri_id[read_id[pad_num]]); break; /* MD 3B PAD */
case 7: smpc_md_pad(machine,pad_num,offset,peri_id[read_id[pad_num]]); break; /* MD 6B PAD */
case 8: smpc_mouse(machine,pad_num,offset,peri_id[read_id[pad_num]]); break; /* Saturn Mouse */
case 9: smpc_unconnected(machine,pad_num,offset); break;
}

View File

@ -179,7 +179,7 @@ READ16_HANDLER( saturn_vdp1_regs_r )
case 0x12/2: return state->m_vdp1.lopr;
case 0x14/2: return state->m_vdp1.copr;
/* MODR register, read register for the other VDP1 regs
(Shienryu SS version abuses of this during intro) */
(Shienryu SS version abuses of this during intro) */
case 0x16/2:
UINT16 modr;
@ -2171,8 +2171,11 @@ int stv_vdp1_start ( running_machine &machine )
state->m_vdp1.system_cliprect.min_x = state->m_vdp1.system_cliprect.max_x = 0;
state->m_vdp1.system_cliprect.min_y = state->m_vdp1.system_cliprect.max_y = 0;
state->m_vdp1.user_cliprect.min_x = state->m_vdp1.user_cliprect.max_x = 0;
state->m_vdp1.user_cliprect.min_y = state->m_vdp1.user_cliprect.max_y = 0;
/* Kidou Senshi Z Gundam - Zenpen Zeta no Kodou loves to use the user cliprect vars in an undefined state ... */
state->m_vdp1.user_cliprect.min_x = 0;
state->m_vdp1.user_cliprect.min_y = 0;
state->m_vdp1.user_cliprect.max_x = 512;
state->m_vdp1.user_cliprect.max_y = 256;
// save state
state_save_register_global_pointer(machine, state->m_vdp1_regs, 0x020/2);

View File

@ -4317,6 +4317,10 @@ static void stv_vdp2_check_tilemap(running_machine &machine, bitmap_t *bitmap, c
{
/* Pukunpa */
if(STV_VDP2_SPWINEN)
popmessage("Sprite Window enabled");
/* Capcom Collection Dai 2 - Choh Makaimura (Duh!) */
if(STV_VDP2_MZCTL & 0x1f && 0)
popmessage("Mosaic control enabled = %04x\n",STV_VDP2_MZCTL);
@ -6424,13 +6428,19 @@ static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const recta
stv_sprite_priorities_in_fb_line[y][sprite_priorities[0]] = 1;
continue;
};
if(STV_VDP2_SPWINEN && pix == 0x8000) /* Pukunpa */
continue;
b = (pix & 0x7c00) >> 10;
g = (pix & 0x03e0) >> 5;
r = (pix & 0x1f);
if ( color_offset_pal )
{
stv_vdp2_compute_color_offset_RGB555( machine, &r, &g, &b, STV_VDP2_SPCOSL );
}
bitmap_line[x] = b | g << 5 | r << 10;
}
else