Checkpoint from local SVN,added more sophistication to cops DACIA (nw)

This commit is contained in:
James Wallace 2014-10-12 18:59:30 +00:00
parent 616eeffd47
commit fa4d1fe447

View File

@ -8,6 +8,10 @@
Bad Boys by Inner Circle, so there is muscial accompaniment to areas Bad Boys by Inner Circle, so there is muscial accompaniment to areas
where the laserdisc audio is muted. where the laserdisc audio is muted.
NOTES: To boot up Revelations, turn the refill key (R) and press button A.
TODO: There are probably more ROMs for Revelations, the disc contains
full data for a picture based memory game called 'Vision Quest'.
TODO: There are probably more ROMs for Revelations, the disc contains TODO: There are probably more ROMs for Revelations, the disc contains
full data for a picture based memory game called 'Vision Quest'. full data for a picture based memory game called 'Vision Quest'.
@ -28,9 +32,12 @@
#include "cops.lh" #include "cops.lh"
#define LOG_CDROM 1 #define LOG_CDROM 0
#define LOG_DACIA 0 #define LOG_DACIA 0
#define CMP_REGISTER 0
#define AUX_REGISTER 1
#define MAIN_CLOCK XTAL_4MHz #define MAIN_CLOCK XTAL_4MHz
class cops_state : public driver_device class cops_state : public driver_device
@ -65,6 +72,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(via1_irq); DECLARE_WRITE_LINE_MEMBER(via1_irq);
DECLARE_WRITE_LINE_MEMBER(via2_irq); DECLARE_WRITE_LINE_MEMBER(via2_irq);
void dacia_receive(UINT8 data); void dacia_receive(UINT8 data);
void update_dacia_irq();
DECLARE_WRITE8_MEMBER(dacia_w); DECLARE_WRITE8_MEMBER(dacia_w);
DECLARE_READ8_MEMBER(dacia_r); DECLARE_READ8_MEMBER(dacia_r);
DECLARE_WRITE8_MEMBER(via1_b_w); DECLARE_WRITE8_MEMBER(via1_b_w);
@ -78,6 +86,24 @@ public:
UINT8 m_lcd_addr_l, m_lcd_addr_h; UINT8 m_lcd_addr_l, m_lcd_addr_h;
UINT8 m_lcd_data_l, m_lcd_data_h; UINT8 m_lcd_data_l, m_lcd_data_h;
UINT8 m_dacia_irq1_reg;
UINT8 m_dacia_rts1;
UINT8 m_dacia_dtr1;
UINT8 m_parity_1;
UINT8 m_parity_mode_1;
UINT8 m_bpc_1;
int m_dacia_ic_div_1;
UINT8 m_dacia_echo1;
UINT8 m_dacia_stp_1;
UINT8 m_dacia_reg1;
UINT8 m_dacia_fe1;
UINT8 m_dacia_cmp1;
UINT8 m_dacia_cmpval1;
UINT8 m_dacia_cts;
UINT8 m_dacia_dcd;
UINT8 m_dacia_trans;
UINT8 m_dacia_receiver_data; UINT8 m_dacia_receiver_data;
UINT8 m_dacia_receiver_full; UINT8 m_dacia_receiver_full;
@ -106,11 +132,32 @@ public:
LD_INPUT_TEXT_GET_SET_WINDOW LD_INPUT_TEXT_GET_SET_WINDOW
} m_ld_input_state; } m_ld_input_state;
UINT8 generate_isr();
void laserdisc_w(UINT8 data); void laserdisc_w(UINT8 data);
void laserdisc_response_w(UINT8 data); void laserdisc_response_w(UINT8 data);
DECLARE_PALETTE_INIT( cops ); DECLARE_PALETTE_INIT( cops );
}; };
const int timer_divide_select[16] =
{
73728,
33538,
27408,
24576,
12288,
6144,
3072,
2048,
1536,
1024,
768,
512,
384,
192,
96,
16
};
void cops_state::video_start() void cops_state::video_start()
{ {
} }
@ -155,6 +202,8 @@ READ8_MEMBER(cops_state::cdrom_data_r)
TIMER_CALLBACK_MEMBER(cops_state::ld_timer_callback) TIMER_CALLBACK_MEMBER(cops_state::ld_timer_callback)
{ {
m_dacia_receiver_full = 1;
if ( m_ld_command_current_byte < m_ld_command_total_bytes ) if ( m_ld_command_current_byte < m_ld_command_total_bytes )
{ {
dacia_receive(m_ld_command_to_send[m_ld_command_current_byte]); dacia_receive(m_ld_command_to_send[m_ld_command_current_byte]);
@ -309,22 +358,80 @@ void cops_state::laserdisc_w(UINT8 data)
* *
*************************************/ *************************************/
void cops_state::update_dacia_irq()
{
UINT8 isr = generate_isr();
//remove bits
isr &= ~m_dacia_irq1_reg;
m_maincpu->set_input_line(INPUT_LINE_NMI, isr? ASSERT_LINE:CLEAR_LINE);
}
void cops_state::dacia_receive(UINT8 data) void cops_state::dacia_receive(UINT8 data)
{
if (m_dacia_cmp1)
{
if (m_dacia_cmpval1 == data)
{ {
m_dacia_receiver_data = data; m_dacia_receiver_data = data;
m_dacia_receiver_full = 1; m_dacia_receiver_full = 1;
m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); update_dacia_irq();
m_dacia_cmp1 =0;
m_dacia_cts =1;
m_dacia_trans =1;
}
}
else
{
m_dacia_receiver_data = data;
m_dacia_receiver_full = 1;
update_dacia_irq();
m_dacia_cts =1;
m_dacia_trans =1;
}
} }
UINT8 cops_state::generate_isr()
{
UINT8 isr =0;
isr |= m_dacia_receiver_full;
isr |= (m_dacia_cmp1 << 1);
isr |= (m_dacia_trans <<4);
if (isr)
{
isr |= 0x40;
}
return isr;
}
READ8_MEMBER(cops_state::dacia_r) READ8_MEMBER(cops_state::dacia_r)
{ {
switch(offset & 0x07) switch(offset & 0x07)
{ {
case 0: /* ISR1: Interrupt Status Register */ case 0: /* ISR1: Interrupt Status Register */
return 0x40 | m_dacia_receiver_full; /* Bit 6: Transmit Data Register Empty (TDRE) */ {
UINT8 isr = generate_isr();
m_dacia_trans =0;
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
return isr;
}
case 1: /* CSR1: Control Status Register */
{
UINT8 csr =0;
csr |= m_dacia_rts1;
csr |= (m_dacia_dtr1 << 1);
csr |= (m_dacia_cts <<4);
csr |= (m_dacia_fe1 <<7);
if (LOG_DACIA) logerror("CSR1 %02x\n",csr);
return csr;
}
case 3: /* RDR1: Receive data register */ case 3: /* RDR1: Receive data register */
m_dacia_receiver_full = 0; m_dacia_receiver_full = 0;
m_dacia_fe1=0;
if (LOG_DACIA) logerror("RDR1 %02x\n",m_dacia_receiver_data);
return m_dacia_receiver_data; return m_dacia_receiver_data;
default: default:
if (LOG_DACIA) logerror("%s:dacia_r(%02x)\n", machine().describe_context(), offset); if (LOG_DACIA) logerror("%s:dacia_r(%02x)\n", machine().describe_context(), offset);
@ -336,8 +443,72 @@ WRITE8_MEMBER(cops_state::dacia_w)
{ {
switch(offset & 0x07) switch(offset & 0x07)
{ {
case 0: /* IRQ enable Register 1 */
{
m_dacia_irq1_reg &= ~0x80;
if (data & 0x80) //enable bits
{
m_dacia_irq1_reg |= (data & 0x7f);
}
else // disable bits
{
m_dacia_irq1_reg &= ~(data & 0x7f);
}
if (LOG_DACIA) logerror("DACIA IRQ 1 Register: %02x\n", m_dacia_irq1_reg);
update_dacia_irq();
break;
}
case 1: /* Control / Format Register 1 */
{
if (data & 0x80) //Format Register
{
m_dacia_rts1 = (data & 0x01);
m_dacia_dtr1 = (data & 0x02 ? 1:0);
m_parity_1 = (data & 0x04);
m_parity_mode_1 = ((data & 0x18) >> 3);
m_bpc_1 = ((data & 0x60) >> 5) +5;
if (LOG_DACIA) logerror("DACIA Format Register: %02x\n", data);
}
else // Control register
{
m_dacia_ic_div_1 = timer_divide_select[data & 0x15];
m_dacia_echo1 = (data & 0x10);
m_dacia_stp_1 = (data & 0x20 ? 2:1);
if (data & 0x40)
{
m_dacia_reg1 = AUX_REGISTER;
}
else
{
m_dacia_reg1 = CMP_REGISTER;
}
if (LOG_DACIA) logerror("DACIA TIME %02d\n", XTAL_3_6864MHz / m_dacia_ic_div_1);
m_ld_timer->adjust(attotime::from_hz(XTAL_3_6864MHz / m_dacia_ic_div_1), 0, attotime::from_hz(XTAL_3_6864MHz / m_dacia_ic_div_1));
if (LOG_DACIA) logerror("DACIA Ctrl Register: %02x\n", data);
}
break;
}
case 2: /* Compare / Aux Ctrl Register 1 */
{
if (m_dacia_reg1 == CMP_REGISTER)
{
m_dacia_cmp1 =1;
m_dacia_cmpval1=data;
if (LOG_DACIA) logerror("DACIA Compare mode: %02x \n", data);
// update_dacia_irq();
}
else
{
if (LOG_DACIA) logerror("DACIA Aux ctrl: %02x \n", data);
}
}
case 3: /* Transmit Data Register 1 */ case 3: /* Transmit Data Register 1 */
//logerror("DACIA Transmit: %02x %c\n", data, (char)data); if (LOG_DACIA) logerror("DACIA Transmit: %02x %c\n", data, (char)data);
laserdisc_w(data); laserdisc_w(data);
break; break;
default: default:
@ -589,9 +760,44 @@ static INPUT_PORTS_START( cops )
PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(50) PORT_KEYDELTA(10)
INPUT_PORTS_END INPUT_PORTS_END
static INPUT_PORTS_START( revlatns )
PORT_START("SW0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("A")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("C")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("COLLECT")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN5 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_IMPULSE(1)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN6 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("Continue")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("B")
PORT_START("SW1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Refill Key") PORT_CODE(KEYCODE_R) PORT_TOGGLE
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_INTERLOCK) PORT_NAME("Cashbox Door") PORT_CODE(KEYCODE_Q) PORT_TOGGLE
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("20P LEVEL") PORT_CODE(KEYCODE_Q)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("*")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("100P LEVEL") PORT_CODE(KEYCODE_W)
PORT_START("SW2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_NAME("50p")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_NAME("20p")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_NAME("10p")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_NAME("100p")
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SPECIAL )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SPECIAL )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SPECIAL )
INPUT_PORTS_END
void cops_state::machine_start() void cops_state::machine_start()
{ {
m_ld_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(cops_state::ld_timer_callback),this)); m_ld_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(cops_state::ld_timer_callback),this));
m_dacia_ic_div_1 = timer_divide_select[0];
m_ld_timer->adjust(attotime::from_hz(167*5), 0, attotime::from_hz(167*5)); m_ld_timer->adjust(attotime::from_hz(167*5), 0, attotime::from_hz(167*5));
} }
@ -601,7 +807,14 @@ void cops_state::machine_reset()
m_lcd_addr_l = m_lcd_addr_h = 0; m_lcd_addr_l = m_lcd_addr_h = 0;
m_lcd_data_l = m_lcd_data_h = 0; m_lcd_data_l = m_lcd_data_h = 0;
m_dacia_receiver_full = 0; m_dacia_cts = 0;
m_dacia_dcd = 0;
m_dacia_irq1_reg = 0x80;
m_dacia_rts1 = 1;
m_dacia_dtr1 = 1;
m_dacia_fe1 = 1;
m_dacia_receiver_full = 1;
m_ld_input_state = LD_INPUT_GET_COMMAND; m_ld_input_state = LD_INPUT_GET_COMMAND;
m_ld_command_current_byte = m_ld_command_total_bytes = 0; m_ld_command_current_byte = m_ld_command_total_bytes = 0;
m_ld_frame_index = 0; m_ld_frame_index = 0;
@ -700,4 +913,4 @@ ROM_END
GAMEL( 1994, cops, 0, cops, cops, cops_state, cops, ROT0, "Atari Games", "Cops (USA)", GAME_NOT_WORKING | GAME_NO_SOUND, layout_cops ) GAMEL( 1994, cops, 0, cops, cops, cops_state, cops, ROT0, "Atari Games", "Cops (USA)", GAME_NOT_WORKING | GAME_NO_SOUND, layout_cops )
GAMEL( 1994, copsuk, cops,cops, cops, cops_state, cops, ROT0, "Nova Productions / Deith Leisure","Cops (UK)", GAME_NOT_WORKING | GAME_NO_SOUND, layout_cops ) GAMEL( 1994, copsuk, cops,cops, cops, cops_state, cops, ROT0, "Nova Productions / Deith Leisure","Cops (UK)", GAME_NOT_WORKING | GAME_NO_SOUND, layout_cops )
GAMEL( 1994, revlatns, 0, cops, cops, cops_state, cops, ROT0, "Nova Productions", "Revelations", GAME_NOT_WORKING | GAME_NO_SOUND, layout_cops ) GAMEL( 1994, revlatns, 0, cops, revlatns, cops_state, cops, ROT0, "Nova Productions", "Revelations", GAME_NOT_WORKING | GAME_NO_SOUND, layout_cops )