1 // license:BSD-3-Clause
2 // copyright-holders:Mathis Rosenhauer
3 /***************************************************************************
4 
5     Cinematronics Cosmic Chasm hardware
6 
7 ***************************************************************************/
8 
9 #include "emu.h"
10 #include "cpu/z80/z80.h"
11 #include "machine/z80ctc.h"
12 #include "includes/cchasm.h"
13 #include "sound/ay8910.h"
14 
15 
reset_coin_flag_w(uint8_t data)16 void cchasm_state::reset_coin_flag_w(uint8_t data)
17 {
18 	if (m_coin_flag)
19 	{
20 		m_coin_flag = 0;
21 		m_ctc->trg0(m_coin_flag);
22 	}
23 }
24 
INPUT_CHANGED_MEMBER(cchasm_state::set_coin_flag)25 INPUT_CHANGED_MEMBER(cchasm_state::set_coin_flag )
26 {
27 	if (!newval && !m_coin_flag)
28 	{
29 		m_coin_flag = 1;
30 		m_ctc->trg0(m_coin_flag);
31 	}
32 }
33 
coin_sound_r()34 uint8_t cchasm_state::coin_sound_r()
35 {
36 	uint8_t coin = (ioport("IN3")->read() >> 4) & 0x7;
37 	return m_sound_flags | (m_coin_flag << 3) | coin;
38 }
39 
soundlatch2_r()40 uint8_t cchasm_state::soundlatch2_r()
41 {
42 	m_sound_flags &= ~0x80;
43 	m_ctc->trg2(0);
44 	return m_soundlatch2->read();
45 }
46 
soundlatch4_w(uint8_t data)47 void cchasm_state::soundlatch4_w(uint8_t data)
48 {
49 	m_sound_flags |= 0x40;
50 	m_soundlatch4->write(data);
51 	m_maincpu->set_input_line(1, HOLD_LINE);
52 }
53 
io_w(offs_t offset,uint16_t data,uint16_t mem_mask)54 void cchasm_state::io_w(offs_t offset, uint16_t data, uint16_t mem_mask)
55 {
56 	//static int led;
57 
58 	if (ACCESSING_BITS_8_15)
59 	{
60 		data >>= 8;
61 		switch (offset & 0xf)
62 		{
63 		case 0:
64 			m_soundlatch->write(data);
65 			break;
66 		case 1:
67 			m_sound_flags |= 0x80;
68 			m_soundlatch2->write(data);
69 			m_ctc->trg2(1);
70 			m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
71 			break;
72 		case 2:
73 			//led = data;
74 			break;
75 		}
76 	}
77 }
78 
io_r(offs_t offset)79 uint16_t cchasm_state::io_r(offs_t offset)
80 {
81 	switch (offset & 0xf)
82 	{
83 	case 0x0:
84 		return m_soundlatch3->read() << 8;
85 	case 0x1:
86 		m_sound_flags &= ~0x40;
87 		return m_soundlatch4->read() << 8;
88 	case 0x2:
89 		return (m_sound_flags| (ioport("IN3")->read() & 0x07) | 0x08) << 8;
90 	case 0x5:
91 		return ioport("IN2")->read() << 8;
92 	case 0x8:
93 		return ioport("IN1")->read() << 8;
94 	default:
95 		return 0xff << 8;
96 	}
97 }
98 
99 
WRITE_LINE_MEMBER(cchasm_state::ctc_timer_1_w)100 WRITE_LINE_MEMBER(cchasm_state::ctc_timer_1_w)
101 {
102 	if (state) /* rising edge */
103 	{
104 		m_output[0] = !m_output[0];
105 		m_dac1->write(m_output[0]);
106 	}
107 }
108 
WRITE_LINE_MEMBER(cchasm_state::ctc_timer_2_w)109 WRITE_LINE_MEMBER(cchasm_state::ctc_timer_2_w)
110 {
111 	if (state) /* rising edge */
112 	{
113 		m_output[1] = !m_output[1];
114 		m_dac2->write(m_output[1]);
115 	}
116 }
117 
sound_start()118 void cchasm_state::sound_start()
119 {
120 	m_coin_flag = 0;
121 	m_sound_flags = 0;
122 	m_output[0] = 0;
123 	m_output[1] = 0;
124 
125 	save_item(NAME(m_sound_flags));
126 	save_item(NAME(m_coin_flag));
127 	save_item(NAME(m_output));
128 }
129