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)16void 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)25INPUT_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()34uint8_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()40uint8_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)47void 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)54void 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)79uint16_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)100WRITE_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)109WRITE_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()118void 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