diff --git a/src/emu/machine/z80dma.c b/src/emu/machine/z80dma.c index 2a43547cfe7..de3132285fd 100644 --- a/src/emu/machine/z80dma.c +++ b/src/emu/machine/z80dma.c @@ -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; } diff --git a/src/mame/drivers/saturn.c b/src/mame/drivers/saturn.c index c0e3a9945a0..098e3861d26 100644 --- a/src/mame/drivers/saturn.c +++ b/src/mame/drivers/saturn.c @@ -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,"",19) +// PORT_CATEGORY_ITEM(0x09,"",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,"",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 diff --git a/src/mame/machine/smpc.c b/src/mame/machine/smpc.c index 9a4f613d1b2..63175cdb84b 100644 --- a/src/mame/machine/smpc.c +++ b/src/mame/machine/smpc.c @@ -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(); + 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(); @@ -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(); 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(); + 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; } diff --git a/src/mame/video/stvvdp1.c b/src/mame/video/stvvdp1.c index a8976e81ee5..35c2bdfa799 100644 --- a/src/mame/video/stvvdp1.c +++ b/src/mame/video/stvvdp1.c @@ -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); diff --git a/src/mame/video/stvvdp2.c b/src/mame/video/stvvdp2.c index ea007c66b4c..b0df27096dd 100644 --- a/src/mame/video/stvvdp2.c +++ b/src/mame/video/stvvdp2.c @@ -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