1 // license:BSD-3-Clause
2 // copyright-holders:Luca Elia
3 /*
4     SunA 8 Bit Games samples
5 
6     Format: PCM unsigned 4 bit mono 8kHz
7 */
8 
9 #include "emu.h"
10 #include "sound/samples.h"
11 #include "includes/suna8.h"
12 
13 #define FREQ_HZ 8000
14 #define SAMPLEN 0x1000
15 
SAMPLES_START_CB_MEMBER(suna8_state::sh_start)16 SAMPLES_START_CB_MEMBER(suna8_state::sh_start)
17 {
18 	int i, len = memregion("samples")->bytes() * 2;  // 2 samples per byte
19 	uint8_t *ROM = memregion("samples")->base();
20 
21 	m_samplebuf = std::make_unique<int16_t[]>(len);
22 
23 	// Convert 4 bit to 16 bit samples
24 	for(i = 0; i < len; i++)
25 		m_samplebuf[i] = (int8_t)(((ROM[i/2] << ((i & 1)?0:4)) & 0xf0)  ^ 0x80) * 0x100;
26 
27 	m_numsamples = len / SAMPLEN;
28 }
29 
suna8_samples_number_w(uint8_t data)30 void suna8_state::suna8_samples_number_w(uint8_t data)
31 {
32 	m_sample = data;
33 	logerror("%s: sample number = %02X\n", machine().describe_context(), data);
34 }
35 
play_sample(int index)36 void suna8_state::play_sample(int index)
37 {
38 	if (index < m_numsamples)
39 	{
40 		m_samples->start_raw(0, &m_samplebuf[SAMPLEN * index], SAMPLEN, FREQ_HZ);
41 		logerror("%s: starting sample %02X\n", machine().describe_context(), index);
42 	}
43 	else
44 	{
45 		logerror("%s: warning, invalid sample %02X\n", machine().describe_context(), index);
46 	}
47 }
48 
suna8_play_samples_w(uint8_t data)49 void suna8_state::suna8_play_samples_w(uint8_t data)
50 {
51 	logerror("%s: play sample = %02X\n", machine().describe_context(), data);
52 
53 	// At boot: ff (ay reset) -> 00 (game writes ay enable) -> f9 (game writes to port A).
54 	// Then game writes f9 -> f1 -> f9. Is bit 3 stop/reset?
55 
56 	if ( m_play == 0xe9 && data == 0xf9 )
57 		play_sample(m_sample & 0x0f);
58 	else if ( m_play == 0xb9 && data == 0xf9 ) // second sample rom
59 		play_sample(((m_sample >> 4) & 0x0f) + 0x10);
60 
61 	m_play = data;
62 }
63 
rranger_play_samples_w(uint8_t data)64 void suna8_state::rranger_play_samples_w(uint8_t data)
65 {
66 	logerror("%s: play sample = %02X\n", machine().describe_context(), data);
67 
68 	// At boot: ff (ay reset) -> 00 (game writes ay enable) -> 30 (game writes to port A).
69 	// Is bit 6 stop/reset?
70 
71 	if ( m_play == 0x60 && data == 0x70 )
72 		play_sample(m_sample & 0x0f);
73 
74 	m_play = data;
75 }
76